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YAPAAGwfARzAAEswhMAASyq7l4E5AQABJ0gAwABshEnAAEtCHMAAS1aFwABLRru4gToBAAGTAMAAbIU+AEnAAEt6HMAAS46FwABLfru4gTsBAAGTAMAAbIY+A07AAEuhwABLpQABgTxgA8AAbBgBHMAAS62EwABLp7uXgT0CAAKThcAAS7q7uADAAGyHTsAAS9jAAEveAAGBPmADwABsGAEcwABL5oTAAEvgu5eBPQEAARzAAEwAhcAAS/C7uIE/AQABlADAAGyIAMAAbIc9HMAATB6BwABMDLsGgJwCAAKGwABMH7wgh8AATCa8UgDAAGxjPgM9HsAATEDAAGwnAQABJMAATIgDJ4FAhMAATIC7lyeBQQA9HsAATJHAAGwnAQABgsAATJe7IwBKwABMpQEqSsAATL8BKQYaBMAATPzAAE0DwABONgABgUIAAAABA8AATRfAAE42AAAAAgEBwABNHwAAAIDlYAPAAGwYAAHAAE01AAAAgUNgA8AAbFsBasAATUtgA8AAbFscYAOOlQE+Az0ewABNiZEZAAAAAE7AAE26wABNxgABgURgA45yAR/AAE3SjngBAAABgUOBwABN8700SsAATgsBHsAAThKOcQIAAoDAAE4cvSOCwABOKL1kAAYbBMAATsHAAE7MwABRZAABgUUAAAABA8AATuTAAFFkAAAAAwICwABO8QAAAIFGYAPAAGwYAMAATxkAAACBR10DwABsGQFgA8AAbBgAAcAATz0AAACBSGADwABsWwFqAGABwABsXAJgA5PbAT4FPSMcwABPV4LAAE9NvfYnAQABKwDAAGxeisAAT0299iorAWADwABsW07AAE9vwABPegAAgPhgA5PbARrAAE+PlDdJwABPm4LAAE+fvfY+AT2LwABPsL4/H8AAT72RCAEAAYPAAE/Rvj8AP0nAAE/kIiIhHMAAUAGBwABP6L3eJwEAASsAwABsYgAWwABQK4HAAFASvd4iwABsIgAhHMAAUFmAwABQP73OJwEAASsAwABsNj4DTsAAUG7AAFB3AAGBSV0DwABsGQFgA8AAbFgBMcAAUH5gA8AAbFgAPgJOwABQmgAAADxdA8AAbEoBYAPAAGwYARbAAFCaHgDAAGwvAQFdA8AAbCABYAPAAGwYAYHAAFCavd4APcAAbEtFAAABHMAAUJqFAL70PgAAAADAAGxN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YAPAAGxbHGADg6wABoGHEpfql/eYLwACguoAAAABA5gKmC8AAAACAQGYEQAAAILbYAODMgABmB8AAACC6GADwABsWwFqmChgA8AAbFscXQPAAGwZAWADg6wABoGIEpj0mQGZOAACgusAAAABA5kTmTgAAAACAQGZGgAAAILbYAODMgABmSgAAACC6GADwABsWwFqmTFgA8AAbFscXQPAAGwZAWADg6wABoGJEpmkmamZ1wACguwAAAABA5m1mdcAAAACAgKZvAAAAILtYAODMgCZzAAAAILhYAODMgAAYAPAAGxbAAaBihKaXJphmo0AAoLuAAAAAQOabJqNAAAAAgICmnMAAACC72ADgzIAmoIAAACC4WADgzIAAGADwABsWwAGgYsSmwubEJsrAAKC8AAAAAEDmx2bKwAAAAEBAZskAAAAgttgA4MyAABgA8AAbFsABoGMEqCjoKihFwACgvEAAAABA6C7oRcAAAACAgKgwgAAAILbYAODMgCg0AAAAIGNYQMDYAODrGADg6xgA8AAbFtbAABcAAaBjRKirqK9o1AAAoLyAAAAAQOizaNQAAAAAwICouAAAACC810DwABsIAFgA4KSAKMKAAAAgvRdA8AAbCABYAOCkgABozEAAACC9WADiyoBagBgAcAAbFwCYAOBdQAGgY4SpM+k3qUuAAKC9gAAAAEDpPClLgAAAAIBAaUBAAAAgvddA8AAbCABYAODMgABpRYAAACC+GADwABsWwFqpSdgA8AAbFscYAOBdQAGgY8Sp/6oEqv8AAGC+QAAAAEDqCKr/AAAAAICAqg3AAAAgWldA8AAbBkBYAODrACoSwAAAIL6XQPAAGwZAWADg6wAAF0DwABsGQFgA4OsAT4LSahZFqhjgKhdwADY1oFWwABs80qobAGBqHPAANjpP0mofxaoioGog8AA2OmBVsAAbPNKqJMBgKiawADY1j9OqLKouQAAgbBdA8AAbBkBYAODrAE1qMMAAAEAXQPAAGwZAWADg6wBMajDYAODrAA1qMcAAAEAXAEXqMeCqMPAANlfgOAcqN0WqNaAqNDAANjWgODAAGxqgT8BAAEWqOaBqN/AANjpgODAAGxqAMAAbIjAAGz1gqjDwADZX06o9qkBAACC+2ADwABsHwGTTqkOqRAAAIHUYAPAAGwfAZNOqRWpFwAAgvxgA8AAbB8Bk0OpICIcqSmEqSfAANnYgToBAAEWqTGAqSvAANjWgODAAGxqAMAAbIUAHKk9hak7wADZ6YE6AQABFqlGgak/wADY6YDgwABsagDAAGyFPgROqV2paQAAgv1gA4OsARypcICpa8AA2NYpAQABhKlxwADZ2ADAAGy4TqmCqY8AAIL+YAODrAEcqZeBqZHAANjpKQEAAYWpmMAA2ekAwABsuE6ppqmuAACC/2ADwABsHwEeqb+BkAIAAoapzsAA2kmHqdvAANpxAEmp8Byp/BSp9MAA2pkIAIMAAQABkwDAAGz2PgM9HKoSgqoMwADZSoCcAgACNaoTAAABAGADwABsHwGDqhPAANnHNaodAAABAGADwABsHwGLqh3AANnHHKodFKoTwADa7AkAgT8BAAGUAMAAbIgUqhPAANrsCQCGqiPAANpJAMAAbMs9jKo6wADZ2ByqOISqOsAA2diBPwEAAZQAwABsiEmqjR6qkcAAbPcCAAKGqpvAANpJh6qowADacQA+AT2NqsXAANnpHKrDharFwADZ6YE/AQABlADAAGyIPz4CPRyq74Kq6cAA2UqAnAIAAjWq8AAAAQBgA8AAbB8Bg6rwwADZxzWq+gAAAQBgA8AAbB8Bi6r6wADZxxyq+hSq8MAA260JAIE/AQABlADAAGyIFKrwwADbrQkAh6sAwADacQDAAGzLPY2rGMAA2ekcqxaFqxjAANnpgT8BAAGUAMAAbIhDqy0cqzaEqzTAANnYgToBAAEWqz6AqzjAANjWgODAAGxqAMAAbIU+AT0cq1SCq07AANlKgJwCAAI1q1UAAAEAYAPAAGwfAYOrVcAA2cc1q18AAAEAYAPAAGwfAYurX8AA2cccq1+Gq1XAANxZgT8BAAGUAMAAbIiGq1XAANxZHKtqgKtlwADY1ikBAAE1q2sAAAEAYAPAAGwfAYSra8AA2dg1q2wAAAEAYAPAAGwfAYyrbMAA2dgcq2yGq2vAANytgT8BAAGUAMAAbIiGq2vAANytAMAAbLgAwABsy0OrexyrhIWrgsAA2emBOgEAARarjYGrhsAA2OmA4MAAbGoAwABshT4BPRyro4KrncAA2UqAnAIAAjWrpAAAAQBgA8AAbB8Bg6ukwADZxzWrrgAAAQBgA8AAbB8Bi6uuwADZxxyrroarpMAA3TaBPwEAAZQAwABsiIarpMAA3TYcq7qBq7TAANjpKQEAATWruwAAAQBgA8AAbB8Bhau7wADZ6TWrvAAAAQBgA8AAbB8Bjau8wADZ6RyrvIaru8AA3YqBPwEAAZQAwABsiIaru8AA3YoAwABsuADAAGzLPRer0oKry8AA2UqA4IOr28AA2cfAAGz1SqvrAYKr8sAA2UoGgZASrHSsf60EAAGDAQAAAAEDrI2tBAAAAAICAqyVAAAAgWlgA4OsAKyjAAAAgvpgA4OsAABgA8AAbB8BPgJJrLEcrLuArLXAAN4ZJwEAAYGsvsAA3iUAwABsXkqsxgGTP0qs1AEerNuBkQIAAhas7oCs6MAA3hmBiIOwFqz7gaz0wADeJYGIg7AABoGREq26rcWxkgABgwIAAAABA63RsZIAAAACAgKt1wAAAIMDYAOJHwCt5wAAAIMEYAOJHwAAYAPAAGwfAT4NTq39rgcAAIMFYAPAAGwfARauE4CuCcAA3qSB14khTq4lrjAAAIMGYAPAAGwfARauPYGuMsAA3rCB14khSa5LIRyuWYKuT8AA3scnAQABg65cwADe5QDAAGwySq5oARyueYKub8AA3sdEAQABg657wADe5QDAAGzhP06ukq6eAACDB2ADwABsGAEWrqqArqDAAN6kgYiJIk6uu67IAACDCGADwABsGAEWrtWBrsrAAN6wgYiJIk6u467vAACDCWADwABsHwEWrv2ErvHAAN9AgODAAGyRTq8NrxoAAIMKYAPAAGwfARavKYWvHMAA316A4MAAbJFJrzUhHK9Fhq85wADffCcBAAGHr0jAAN+cAMAAbDI+AUqvXgEcr3GGr2XAAN98RAEAAYevc8AA35wAwABs4T9Or5OvoAAAgwtgA4KSARavrICvosAA3qSBFYklTq/Br88AAIMMYAOCkgEWr9yBr9HAAN6wgRWJJUmv6SEcr/oUr+3AAN/7CAAnAQABFK/9wADgFwkAAMAAbF4+A0mwFBywJRSwGMAA3/sIACcBAAErAMAAbF5KsC4BHLA1lIFaAAAAAMAAbI8/SbA/HLBRFLBDwADgFwkAJwEAASsAwABsXkqwWgGUP0qwagEcsH4UsHHAAN/7CACApAEAARSwiMAA4BcJAACCxD9FsKIBsKuwrQAAgdRgA8AAbB8BkwEcsLQUsLLAAODHCgCBOgEAAYawtsAA33wAwABshQEVsMXAAODHChywwxSwxcAA4McKAIE/AQABlADAAGyIPgROsNSw3gAAgw1gA8AAbB8BHLDshLDgwADfQIMOAQABFLD3wADgxwoAAMAAbPhOsQWxEAAAgw9gA8AAbB8BHLEfhbESwADfXoMOAQABFLEqwADgxwoAAMAAbPhOsTixPgAAgxBgA8AAbB8BHLFKFLFAwADhGAsARAEAARSxTMAA4UUMAADAAGzhSbFeIRyxaBSxYsAA4XINACcBAAGTAMAAbDJKsW4BFLF1wADhcg0AP0qxhgGTBoGSErK2ssS06gABgxEAAAABA7LUtOoAAAACAgKy4gAAAIMSXQPAAGwZAWADg6wAsvAAAACBiGADiR8AAGADg6wBPgROswCzBAAAgxNgA8AAbB8Bk06zCbMOAACDFGADwABsHwEcsx8WsxiAsxDAAOHpgODAAGxqRAEAAZQAwABs4UOzKByzM4KzL8AA4hGDAAEAAYOzNsAA4iIAwABs9j4ETrNIs0wAAIMVYAPAAGwfARyzUoKzTsAA4hGBPwEAARyzYhyzW4OzVsAA4iJEAQABgrNdwADiEQDAAGzhgksBAAGUAMAAbOIAwABsiE6zdrN8AACDFmADg6wBHLOFgLN+wADh6SkBAAGEs4bAAOJvAMAAbLhOs5azoQAAgxdgA8AAbB8BHrOjgZECAAKBs7DAAOH8FrO8hbO2wADiu4GIg7AASbPJHLPYhrPNwADi44E6AQABkwDAAGyFPgE9i7PnwADiIhyz8oSz7sAA4m9EAQABlADAAGzhSbQEHLQThrQIwADi44E7AQABkwDAAGyGPgE9irQiwADiERy0LIS0KMAA4m+BPwEAAZQAwABsiEm0PiEctEeDtELAAOIiJwEAAYS0SsAA4m8AwABsMj4BPYu0mMAA4iKEtJ/AAOJvPgFKtLsBhbTCwADiu0q02wErAAAA0bcAANMhAADTTQAA048AANO7AADT+AAA1C4AANSBAADUvAAA1Q8AANVRAADVjAAA1d8AANYtAADWgAAA1s4AANccAADXWQAA15YAANfHAADYDQAA2GsAANi5AADd/AAA3ocAAOHMAADjvgAAABoCgZMStO+0/raRB4MYAAABYAPAAGxWAAAAAQWBmAAAAAAEAAADAAAAAAAAAAAAYAOBkwE/AQkBAMAAbFoAAAAAAgaBlRK1VbVetXkAAoMZAAAAAQO1a7V5AAAAAQEBtXIAAACC22ADgzIAAGADgh0ABoGWErYvtja2jwACgxoAAAABA7Zbto8AAAACAQG2YwAAAIMbYAODrAABtoAAAACC5mADwABsWwFqtohgA8AAbFscYAODrAAAAADkcAAA5J8AAOTmAAAAAgKBmRK2lLaat6YDgxwAAAFgA8AAbFYAAAMEgZsStsG2ygmDHQBgA4IDAASBnBK20rbjGIMeAGADwABsHwEctuGUgVoAAAAAwABsjwSBnRK3a7d+GIMfAGADwABs1wErAQWBnxK3g7eDt6QAAAADt5S3pAAAAAEBAbeaAAAEgx1gA4IDAABgA4GZAT8CCAGBm4AAwADlbwkBt4PAAGxaAAAAAAAAAADlmgAAAAACgaASt6m3r8AARA0DgyAAAAFgA8AAbFYAAWADgZMFBIGiErgYuCEJgRYAYAOBrwAEgaQSuDe4TQmDIYFpAF0DwABsGQFgA4MyAASBpRK4dbicCYMigWkAXQPAAGxfAmADgzJgA4GZATK4mmADgzJgA4GZAASBpxK4pbi4GIMjAGADwABsWwEqBIGmErrhuvYYgySBaQBgA8AAbB8BkwEFga4SuL24vbpfAAAAA7jful8AAAABAQG45QAABIEWYAOBrwAAYAOBoAE+Aj0XuUwWuUIugRaBooMlKYG7SbljFrl6FrlxFrlnLoEWgaKDIoFpgbUiwABs+T4CPgJOubYAAAA8XQPAAGxKAWADgzIBFrm2HgDAAGwvAQFdA8AAbCABYAODMgEWubYWua0WuaMugRaBooMigWmBtYCfwABsZQA9wABsS0UAAAEcubaBAMAA5qA+AAAAAMAAbE0APgJOuZkAAACC22ADgzIBFrm8gQDAAOagQMAAbE8+AT0cuc4WucYugyKBaYGlgJwCAAKCuc/AAOcDH7ndgZ8BAAEcugEWufkWue8ugRaBooMigWmBtSkBAAGCugLAAOcDAMAAbGEAAMAAbGM9HLobLoMmgWkBAAEcujUWui0ugyKBaYGlKQEAARa6Tha6SRa6QBa6Ni6BFoGigyKBaYG1gJ/AAGxlgWnAAGyUAMAAbGEAgao/AwgBgaKAAMAA5loIAIGkHrkVwABs/AEBYAODMgEWuTQWuSuAuSHAAOZagyKBaYG1gODAAGz9AAkBuL3AAGxaAAAAAAMGgaoSuvq6/79xAACDJoFpAAAAAQO7EL9xAAAAAQEBuyMAAACDJ2ADgZkAAFwBPglJuzIhHLtLFrs+gLs2wADoF4MegZwnAQABHLtOlIFaAAAAAMAAbI8AwABsMkq7UgA/Trtiu2gAAIMoYAPAAGwfATW7agAAAQBgA8AAbB8BFrtqLoMkgWmBpjW7agAAAQBgA8AAbB8BF7tqLoMkgWkcu3uBu2rAAOhqgT8BAAGUAMAAbIiBpoG7asAA6Go9F7uLgLuDwADoF4MegbuawADoWoGcPRy7uxa7pS6DIYFpgaSAnAIAAoG7vMAA6FoWu9cWu82Au8XAAOgXgx2Bm4LTggYAwABsy0676rv8AACDKWADge0BNbwCAAABAGADge0BH7wCgfYAAAAANbwaAAABAFwBHLwagrwCwADpDoMqAQABgbwnwADoWgCB8oK8AsAA6Q4+Ak68YAAAADxdA8AAbEoBYAOCAwEWvGAeAMAAbC8BAV0DwABsIAFgA4IDARa8YBa8VoC8TsAA6BeDHYGbgyuCCQA9wABsS0UAAAEcvGCDAMAA6U4+AAAAAMAAbE0APgJOvEMAAACC72ADggMBFrxxgwDAAOlOQMAAbE8+A068i7yXAACDLGADgZkBHLyhFryZLoMigWmBpSkBAAEWvKqEvKLAAOmsgtOCBgDAAGxhPRy8vC6DJoFpAQABhbzOwADpyQCBqj0cvPSCvOLAAOkAgy0BAAEWvRCFvQTAAOnJgx+BnQCB8z4CTr1dAAAAPF0DwABsSgFgA4IDARa9XR4AwABsLwEBXQPAAGwgAWADggMBFr1dFr1TgL1LwADoF4MdgZuDLoIKAD3AAGxLRQAAARy9XYMAwADqND4AAAAAwABsTQA+Ak69QAAAAILvYAOCAwEWvWuDAMAA6jRAwABsTz4DTr2FvZEAAIMsYAOBmQEcvZsWvZMugyKBaYGlKQEAARa9pIS9nMAA6pKC04IGAMAAbGE9HL22LoMmgWkBAAGFvcjAAOqvAIGqPRy97oK93MAA6QCDLQEAARa+CoW9/sAA6q+DH4GdAIHzPgJOvlcAAAA8XQPAAGxKAWADggMBFr5XHgDAAGwvAQFdA8AAbCABYAOCAwEWvlcWvk2AvkXAAOgXgx2Bm4MvggsAPcAAbEtFAAABHL5XgwDAAOsaPgAAAADAAGxNAD4CTr46AAAAgu9gA4IDARa+a4MAwADrGkDAAGxPPgNOvoW+kQAAgyxgA4GZARy+mxa+ky6DIoFpgaUpAQABFr6khL6cwADreILTggYAwABsYT0cvrYugyaBaQEAAYW+yMAA65UAgao9HL7ugr7cwADpAIMtAQABFr8Khb7+wADrlYMfgZ0AgfM9F78ygL8qwADoF4MfHL9agr9IwADpAIMwAAAAAIH0gZ0GgasSv3a/icAAQjkAAIMaAWq/d2ADwABsVoC1AAABA7+uwABCOQAAAAIBAb+2AAAAgxtgA4OsAAG/0wAAAILmYAPAAGxbAWq/22ADwABsWxxgA4OsAT4GSb/pFr/tLoMjgac9ML/6J4MxP07AAEA1wABAOgAAgYhgA4kfARbAAEBMgMAAQDzAAOxKgYiDsE7AAEBdwABAZAAAgL5gA4OsAStOwABAecAAQIIAAIMyYAOCHQEcwABAhC6DGQEAARbAAECigMAAQJLAAOxKgzODtACBrD4CTsAAQMcAAAA8XQPAAGxKAWADgzIBFsAAQMceAMAAbC8BAV0DwABsIAFgA4MyAYTAAEDHwADswQA9wABsS0UAAAEcwABAx4UAwADs9T4AAAAAwABsTQA+Ak7AAEDCAAAAgRhgA4MyARbAAEDRhQDAAOz1QMAAbE8+AUnAAEDZIRbAAEDghsAAQN7AAO1NgzSDUj4CTsAAQP3AAEEHAACCqGADg6wBHMAAQRMWwABBCS6BFoGiguUDAAKGwABBJcAA7U2CwABBKMAA7IoBguaBwABBNsAA7FeB2UnAAEFHIiEcwABBVofAAEFMwADtiCcBAAErAMAAbF4AIRbAAEFth8AAQWPAAO2IgzSDtj4BScAAQYUcwABBkIPAAEGJwADsricBAAErAMAAbF4+AT2LwABBp8AA7K6HwABBsMAA7YhJwABBzCEcwABB14PAAEHQwADsricBAAGHwABB2sAA7YgAwABsXj4BSsAAQfMBKz8/P0rAAEIoAYPAAEIvwADsrgaBrBLAAEI+wABCU8AARAsAAIMZAWrAAEI/YAPAAGxWgLUAAAEDwABCYMAARAsAAAABAQHAAEJnAAAAgttgA4MyAABgA4IdAT4FScAAQnUWwABCeS6DI4GnPTDAAEKGJ4MxP07AAELHwABCzgAAgbBdA8AAbFcBYAODMgEewABC1MAAbHwAAWADgzIAAE7AAELxwABC9gAAgzVgA8AAbNcBFsAAQwkcwABDABbAAEL4LoMigWmBpSkBAAGAwABDAcAA7qkAwABsYYMfgZ1FwABDIgHAAEMrwABDLQAAgdRgA8AAbB8BkwEcwABDNIPAAEMywADvSIE6AQABFsAAQzuCwABDNsAA7wOA4MAAbGoAwABshQGLwABDQ8AA70gcwABDRYPAAENDwADvSIE/AQABlQDAAGyIPgNOwABDV8AAQ1wAAIM2YAPAAGwfARzAAENigsAAQ17AAO8DKQEAAYPAAENjwADvSADAAGy4TsAAQ3HAAEN0AACDN2ADwABsHwEcwABDeoLAAEN2wADvAykBAAEcwABDfYPAAEN7wADvSIE/AQABlADAAGyIAMAAbLhFwABDiQHAAEOSwABDlAAAgvxgA8AAbB8BhMAAQ5bAAO+vARzAAEOehsAAQ5zAAPAsgToBAAGFwABDoMAA7+MAwABshQGOwABDpMAA8CwcwABDpYbAAEOkwADwLIE/AQABlADAAGyIPgE9HMAAQ7qBwABDs8AA7tk2AQABHMAAQ9QWwABDvi6DIYFpgaQpAQABhsAAQ9XAAPAsAMAAbLgAwABsfUrAAEPsAR/AAEP3gicBAAGBwABEAMAA7tkAAAAA5/gAAOweAADudQAA8OQAAAADAoGvEsAAREnAAERPwADJjwODOAAAAWADwABsVgABYAOBdQoEgbESwABEkcAARJoYgJAAYAONPAAEgbMSwABEuMAARM4YgzmBaQBeAwADAwNgA4MyYAOKQWADikEAAVcDgWsAXAErBIG0EsAAROzAAEUMGIM6gWkAXgMAAwMDYAODMmADikFgA4pBAAFXA4FrAFwBKwSBuRLAAEUewABFKxiC1ABgA4FwAASBtRLAAEeIwABHvwmDIoFpAF0DwABsXwJgA4MyYAOCAwEewABHncAAbQAAAmADgzJgA4IDAAAEgboSwABKucAAStwJgzsAXQPAAGxXAWADgpIBHsAASs7AAGx8AAFgA4KSAAAEgbsSwABK5cAASvcYgyUAYAPAAGxbASoEgbYSwABLtsAATAYJgzyBaQBdA8AAbF8CYAODMl0DwABsGQFgA4pBAR7AAEvfwABtAAACYAODMl0DwABsGQFgA4pBAAAEgbcSwABM2MAATPUYgz2BaQBgA4GgASsEgbgSwACYKsAAmDsYgz6BaQBgA8AAbB8BkwEFgewSwABM+sAATPrAAE21AIM/gWkAA8AATR3AAE21AAAAAwMDwABNIwAABICQYAONPADAAE1OAAAAgS1eAwADAwNgA4MyYAOKQWADikEAAVcDgWsAXADAAE1qAAAEgtRgA4FwAABgA4GvAT4BPRfAAE2ELoEtgcAATZzAAPLJgb0DCAGBsYAAwADyuwgBgbmCAMAA8u0JAcAATPrAAGxaAAAAACoGgb0SwABFMMAARTnAAEdBAgCBLQAAAAEDwABFTsAAR0EAAAABAQHAAEVwAAAAgS1eAwADAwNgA4MyYAOKQWADikEAAVcDgWsAXAAAXAE+Aj0XwABFjS6DOoFpgMAARbDAAPNigbQ9F8AARcsugzmBaTTAAEXkA8AAReTAAEc9AAAAAwMDwABF6wAAAILbYAODMgDAAEX9AAAAgKJgA4pBAMAARgoAAACAo2ADikEAAGABwABsXAE+BT0cwABGKoDAAEYVwADzYoCVAwADgcAARivAAPPAgsAARjPAAPPOg8AARjbAAPPcAABOwABGUMAARlkAAINAXQPAAGwZAWADikEBHMAARncWwABGWy6DPIFpgbYpAQABgcAARnjAAPPAAMAAbGFJwABGhxzAAEaUhMAARovAAPQmJwEAASsAwABsYj4CPYzAAEanwAD0Jh7AAEa2wABsdgEBYAOKQQGTAD0cwABG7RbAAEbRLoM8gWmBtoCcAgACgcAARu7AAPPAhMAARvjAAPQmAMAAbGM/PRzAAEcZhMAARxDAAPQmNgEAAYLAAEcdwADzzgDAAGxHPRzAAEcwhMAARyfAAPQmNgEAAYPAAEc0wADz3ADAAGxHgbMGgb8SwABHxMAAR97AAEi7AACDQQAAAAEDwABH8cAASLsAAAAAAAAAXQPAAGwZAWADgfcBPgNOwABIFMAASBsAAIGwXQPAAGwZAWADgfcBHsAASCHAAGx2AQFgA4H3AZMAPgJOwABIYwAAADxdA8AAbEoBYAOCAwEWwABIYx4AwABsLwEBXQPAAGwgAWADggMBFsAASGMWwABIWi6DIoFpgbWBpsAAbKUAPcAAbEtFAAABHMAASGOBAMAA9XM+AAAAAMAAbE0APgJOwABIUgAAAINCYAOCAwEWwABIa4EAwAD1c0DAAGxPPgE9HMAASHqAwABIc8AA9UY2AQABH8AASIKCAgEAAYLAAEiYwAD12QAAwABsR0rAAEiqAYDAAEixwAD1RgaBwBLAAEjAwABIy8AASSsAAINDAAAAAQPAAEjSwABJKwAAAAEBAcAASNkAAACBGGADgzIAAGADggMBPgNOwABI7cAASPIAAINCYAOCAwEcwABI/BbAAEj0LoMigWmBtSkBAAGAwABI/cAA9lsAwABsYT01wABJBQAAAQBgA4IDAYHAAEkFwAD2ciMcwABJBYLAAEkFwAD2qCcBAAErAMAAbF4rF8AASQuCwABJBcAA9qiDRCmCBQFgA8AAbFtKwABJHAGBwABJI8AA9nIGgcESwABJMMAASTzAAEoXAACDRQAAAAEDwABJSsAAShcAAAAAAAAAXQPAAGwZAWADgzIBPgNOwABJX8AASWYAAIGwXQPAAGwZAWADgzIBHsAASWzAAGx2AQFgA4MyAZMAPgJOwABJpQAAADxdA8AAbEoBYAOCAwEWwABJpR4AwABsLwEBXQPAAGwgAWADggMBFsAASaUWwABJnC6DIoFpgbWBpsAAbKUAPcAAbEtFAAABHMAASaWBAMAA92U+AAAAAMAAbE0APgJOwABJjwAAAIMdYAOCAwEWwABJrYEAwAD3ZUDAAGxPPgFJwABJtRbAAEnDgsAASbnAAPfLg0SCBT4BPRzAAEnagMAASdPAAPc4NgEAARbAAEnogsAASd7AAPfLgtOCBgDAAGxHP0rAAEoGAYDAAEoNwAD3OAaBwhLAAEocwABKIcAASqEAAINGAAAAAQPAAEoqwABKoQAAAAAAAABcAT4CPgJOwABKWQAAADxdA8AAbEoBYAOCAwEWwABKWR4AwABsLwEBXQPAAGwgAWADggMBFsAASlkWwABKUC6DIoFpgbWBpsAAbKUAPcAAbEtFAAABHMAASlmAAMAA+G0+AAAAAMAAbE0APgJOwABKQwAAAIMdYAOCAwEWwABKYYAAwAD4bUDAAGxPPgE9F8AASnOBwABKacAA+NODRCqCBT0XwABKiy6DJSqBuwaB6BLAAEwLwABMH8AATFwBAIL3AAAAAQPAAEwnwABMXAAAAAAAAABdA8AAbCABYAODMgE+Aj0XwABMLS6DJSmBu0rAAExEARbAAExUFsAATEsugyKBaYG1gJ/AAGxlBoHpEsAATGHAAExpwABMsAEAg0cAAAABA8AATHnAAEywAAAAAAAAAGADwABsHwE+Aj0XwABMfy6DJSmBu0rAAEyWARbAAEymFsAATJ0ugyKBaYG1gODAAGz9BoHDEsAATbrAAE3RwABOeAAAg0gAAAABA8AATevAAE54AAAAAAAAAGADgZMBPgI9IxzAAE4SFsAATfQugz2BaYG3JwEAASsAwABsXhfAAE30LoM9gWkfwABOIoGuAQABLgCBtysBYAOBoErAAE5QARbAAE5XLoM9gWmBtwaBxBLAAE59wABOmcAAT2QAAILYAWrAAE5+YAPAAGxWgLUAAAEDwABOqsAAT2QAAAABAQHAAE67AAAAgtldA8AAbCABYAODMgAAXQPAAGwgAWADgzIBPgNOwABO0MAATt0AAINJXQPAAGxXAWADgzIBHMAATumAwABO38AA+nyDSgAAAADAAG0BPgJOwABPBgAAADxdA8AAbEoBYAODMgEWwABPBh4AwABsLwEBXQPAAGwgAWADgzIBgMAATwbAAPp8AD3AAGxLRQAAARzAAE8GggDAAPrUPgAAAADAAGxNAD4CTsAATwEAAACBGGADgzIBFsAATymCAMAA+tRAwABsTz01wABPGQAAAQBgA4IDARzAAE8ZFsAATxEugyKBaYG1KQEAAYPAAE8awAD7LADAAGxhIxzAAE8ZhMAATxnAAPtMJwEAASsAwABsXisXwABPHoTAAE8ZwAD7TINEKYIFAWADwABsW0rAAE8vARzAAE9EFsAATz8WwABPNi6DIoFpgbWAn8AAbGWDSwEAARbAAE9XgcAAT0rAAPqhK8AAbHgAwABtAgaBxRLAAE9pwABPesAAUCMAAILsAWrAAE9qYAPAAGxWgLUAAAEDwABPhsAAUCMAAAACAgLAAE+NAAAAgu1gA4MyAMAAT50AAACC4WADgzIAAGADwABsWwE+AknAAE+vHsAAT7PAAGz3AgACgMAAT73AAPwjgcAAT8fAAPwxAErAAE/UASk/SsAAT+UBHMAAT/4cwABP7C6DQwEAAYDAAE/0wAD8IwCBwILsAQABHMAAUAsug0MBAAGBwABQE8AA/DEAgcAAghgGgcYSwABQKMAAUDnAAFDdAACC7gFqwABQKWADwABsVoC1AAABA8AAUETAAFDdAAAAAgICwABQSwAAAILvYAODMgDAAFBaAAAAguFgA4MyAABgA8AAbFsBPgJJwABQbB7AAFBwwABs9wIAAoDAAFB6wAD86oHAAFCDwAD8+ABKwABQkAEpP0rAAFChARzAAFC5HMAAUKgug0MBAAGAwABQsMAA/OoAgcCC7gEAARzAAFDFLoNDAQABgcAAUM3AAPz4AIHAAIIZBoHHEsAAUOLAAFDzwABRRwAAgvABasAAUONgA8AAbFaAtQAAAQPAAFEAwABRRwAAAAEBAcAAUQcAAACC22ADgzIAAGADwABsWwE+AUrAAFEVARbAAFE5FsAAUSwcwABRHC6DQwEAAYDAAFEkwAD9sQCBwIMuggoiwABsIgaByRLAAFFMwABRXcAAVIMAAINMgWkAAAABA8AAUXbAAFSDAAAAAQEBwABRggAAAINCYAOCAwAAXQPAAGwZAWADggMBPgdJwABRjiEcwABRrBbAAFGXgMAAUZLAAP4ig02CDicBAAErAMAAbGJKwABRtQEWwABRwYDAAFG8wAD+IoNNgg4/TsAAUd/AAFHkAACDTmADgigBNcAAUeoAAAEAYAOCKAEfwABR6oItAAAAADXAAFH2AAABAFwBHMAAUfaBwABR6sAA/pI2AQABgMAAUfrAAP4iAJbtgcAAUerAAP6STsAAUgnAAFIPAACDT10DwABsGQFgA4IDATHAAFIdYAOCAwA9F8AAUiqAwABSJcAA/iKDTYLAAFJBwAD+3YIOTsAAUlfAAFJgAACDUGADggMBK0PAAFJsFsAAUniBwABSc8AA/oAilutBPglOwABSkMAAUpkAAINRYAOCAwEcwABSoIHAAFKbwAD+gDUAAAAAlu5JwABSsB7AAFK0wABs9wIAAoTAAFK+wAD/SIPAAFLIwAD/HABCwABS0wA/PRzAAFLpgsAAUuPAAP7dNgEAAYTAAFLtwAD/SADAAGxHPYvAAFL+wAD/HITAAFMJwAD/SE7AAFMdwABTJwAAgtNgA4MyARbAAFMyhMAAUynAAP9IgtOCBk/AAFNDwABTSAAAAYNSYQMBYAOKQVwAA8AAU1HAAFOfAAAAAQEBwABTXAAAAINTYAOKQQAAXAE+AT0cwABTdoHAAFNxwAD+gDYBAAEcwABTei6DQwEAARbAAFOMh8AAU4LAAQAXgtOKRgCBwACW7UnAAFOoIRzAAFPAFsAAU7aFwABTrMAA/86DU4NDJwEAASsAikw9HMAAU9KGwABTycAA//aAlQEAARbAAFPdhcAAU9PAAP/Og1ODQwAAP0nAAFPvIRzAAFQJFsAAU/2FwABT88AA/86DVINEJwEAASsAikw9HMAAVBuGwABUEsAA//aAlQEAARbAAFQmhcAAVBzAAP/Og1SDRAAAPz0cwABUVRbAAFREhcAAVDrAAP/Og1WDRYGxAQABhsAAVF3AAP/2AMAAbQNKwABUcwGCwABUesAA/t0GgdUSwABUiMAAVKLAAGYnAACC3AFqwABUiWADwABsVoC1AAABA8AAVLrAAGYnAAAABAQEwABUyQAAAILdYAOJqgDAAFTkAAAAgt5gA4mqAMAAVPMAAACC32ADgpIAwABVDAAAAICQYAONPAAAYAOJqgE+DEnAAFq5IRbAAFrMgsAAWr7AAQGGg1aCrz4CScAAWuwcwABa9oDAAFrwwAEBaicBAAEWwABbA4PAAFr5wAEBlINXjgkAibhKwABbDQGBwABbFMABAXg/ScAAWyEcwABbK4HAAFslwAEBeCcBAAEWwABbOIPAAFsuwAEBlINXjgkAibhKwABbQgGAwABbScABAWo/P07AAFtmwABbbAAAg1hgA4IDARzAAFtuLoNDAQABFsAAW3yAwABbdsABAWqC04mwAIHATsAAW5fAAFudAACDWWADggMBHMAAW58ug0MBAAEWwABbrYHAAFunwAEBeILTibAAgcBOwABbzgAAAINaXQPAAGwZAWADggMATsAAW+0AAACDW10DwABsGQFgA4IDAEnAAFv7Ih7AAFv/wABs9wIAAoTAAFwJwAECPoXAAFwQwAECcAABHMAAXCCEwABcGsABAj6C7gEAAYXAAFwswAECcACCGT4BPY7AAFw8wAECoo/AAFxHwAECuBzAAFxSLoNMgWkBAAGFwABcbMABAnAAgclJwABcfxzAAFyJhcAAXIPAAQJwgu4BAAGEwABclcABAj4Aghk+AT2OwABcpcABAqKPwABcsMABArgcwABcuy6DTIFpAQABhMAAXNXAAQI+AIHJPgI9jsAAXPDAAQKiHMAAXPsug0yBaQEAAYTAAF0VwAECPgCByT2PwABdI8ABArgcwABdLi6DTIFpAQABhcAAXUjAAQJwAIHJTsAAXcnAAF3MAACDXGADwABsHwGTTsAAXdnAAF3cAACDXWADwABsHwGTTsAAXfPAAF39AACCqGADiaoBK07AAF4NwABeGgAAg15gA8AA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wABxL8AAcUDAAHPbAACC8QFqwABxMGADwABsVoC1AAABA8AAcVPAAHPbAAAAAwICwABxWgAAAILbYAODMgDAAHFoAAAAgY1hAwNgA4OsYAODrGADwABsW1sAAcAAcbwAAACDe2ADwABsWwFqwABx0WADwABsWxxcAT4CTsAAcerAAHHvAACDQmADggMBHMAAcfEug0MBAAGAwABx+cABEmgAgcA+Ak7AAHIjAAAAPF0DwABsSgFgA4pBARbAAHIjHgDAAGwvAQFdA8AAbCABYAOKQQEWwAByI4DAAHIcwAESaIN8g2QAPcAAbEtFAAABHMAAciOEAMABEt8+AAAAAMAAbE0APgJOwAByDwAAAINTYAOKQQEWwAByK4QAwAES30DAAGxPPgVOwAByN8AAckIAAILhYAODMgEWwAByToXAAHJEwAETQILTikZOwAByY8AAcnAAAIN9XQPAAGwZAWADg6wBHMAAcnIuguoBAAGGwAByhsABE2EAgdxOwAByncAAcqoAAIN+XQPAAGwZAWADg6wBHMAAcqwuguoCAAGGwABywMABE2EBgugpgdw9HsAAcuKBygMAAxzAAHLzLoN6gWkDAAKAwABzCcABEmiDwABzEcABErQBgugqgc+HwABzMsABE4WBwABzQMABEnYAPR7AAHNRgcoEAAMcwABzYi6DeoFpAwACgMAAc3jAARJog8AAc4DAARK0AYLoKYHPFMAAc6DAARO1CACBwABzrsABEnYBg38pBoHKEsAAc+DAAHPswAB3FgABg4CBaQAAAAEDwABz/MAAdxYAAAAEAwPAAHQRAAAAg4FdA8AAbBkBYAODrADAAHQyAAAAg4JdA8AAbBkBYAODrADAAHRHAAAAgY1hAwNgA4OsYAODrGADwABsW1sAAcAAdJsAAACDf2ADwABsWwFqwAB0pWADwABsWxxcAT4DTsAAdLfAAHS5AACB1GADwABsHwGTTsAAdL7AAHTAAACC/GADwABsHwGTQ8AAdMkiHMAAdNKEwAB00MABFQOBOgEAARbAAHThgMAAdNTAARSbgODAAGxqAMAAbIUAHMAAdO2FwAB068ABFRiBOgEAARbAAHT9gcAAdO/AARSwgODAAGxqAMAAbIU+BE7AAHUUwAB1HQAAg4NgA4OsARzAAHUrgMAAdR/AARSbKQEAAYTAAHUswAEVAwDA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hMABQz9gA4RLASIlwACjugCHwACjrsABQz9gA4RLACEWwACj5xTAAKPbwAFDPwcBYAOES4O6hGk+AT0cwACkFYPAAKQNwAFBozYBAAGHwACkGcABQz8AwABsRz8+BD2LwACkTMABQaMewACkWsAAbHYBAWADg6wBkwA+Ak7AAKSWAAAAPF0DwABsSgFgA4RLARbAAKSWHgDAAGwvAQFdA8AAbCABYAOESwEWwACkloDAAKSMwAFBC4O7g1oAPcAAbEtFAAABHMAApJaEAMABQ+0+AAAAAMAAbE0APgJOwACkfwAAAIO8YAOESwEWwACkooQAwAFD7UDAAGxPQT4CScAApKwWwACkuoXAAKSwwAFEToO9hGBCwACkxAA/ScAApNYcwACk6RbAAKTkhcAApNrAAUROg76ETicBAAFqwACk+mADhJKFCQDAAGxePgFJwAClDoLAAKUSwAFBKD4BPRzAAKUxg8AApSnAAUGjNgEAAYXAAKU1wAFETgDAAGxHPz4BScAApWghgsAApW3AAUEoPgE9HMAApYyDwAClhMABQaM2AQABhcAApZDAAUROAMAAbEc/PgJOwACl3gAAADxdA8AAbEoBYAODzAEWwACl3h4AwABsLwEBXQPAAGwgAWADg8wBFsAApd6AwACl1MABQQuDwINYAD3AAGxLRQAAARzAAKXehADAAUUpPgAAAADAAGxNAD4CTsAApcsAAACDwWADg8wBFsAApeaEAMABRSlAwABsT0E+A0nAAKXwFsAApfqFwACl9MABRYqDvYPfQsAApgQAP0nAAKYWIiGCwACmG8ABQSgAFsAApiyFwACmJsABRYqDwoPhPgE9HMAAplODwACmS8ABQaM2AQABhcAAplfAAUWKAMAAbEc/ScAApnEigsAApnXAAUEoABbAAKaGhcAApoDAAUWKg8OD4j4BPRzAAKatg8AApqXAAUGjNgEAAYXAAKaxwAFFigDAAGxHPz0cwACm2oPAAKbSwAFBo4ChAQABasAApu5hAwJgA4OsYAODrGADwABsH4UWAMAAbGhJwACnCoLAAKcOwAFBKD4BPRfAAKckgcAApx/AAUEZg5WDwACnOsABQaOCEj4BPRfAAKdbgcAAp1bAAUEZg5SDwACnecABQaOCEUrAAKeMAYPAAKeTwAFBowaB0BLAAKejwACnsMAArG4AAIN5gWkAAAABA8AAp8bAAKxuAAAAAwICwACnzQAAAILTYAODMgDAAKfjAAAAg0JgA4IDAAHAAKf1AAAAguhgA8AAbFsBagBgAcAAbFwCXQPAAGwZAWADg6wBPgxJwACoBRzAAKgOgcAAqAnAAUcXJwEAASsAwABsXj4BPTDAAKgfJMAAqGADFsAAqDKAwACoKMABRwmDbYNBJ4NuFsAAqFqAwACoUMABRwmBiIM4P07AAKh5wACogQAAgxJdA8AAbBkBYAODrAEjgsAAqIvAAUcmFsAAqJqBwAColcABRxeDmYIWFsAAqLaBwACoscABRxeDmIIVAV0DwABsGQFgA4OsScAAqNghHMAAqOSDwACo3MABR6EnAQABKwDAAGxiSsAAqO0Bg8AAqPTAAUehP07AAKkOwACpIgAAg8RdA8AAbBkBYAODrAExwACpLGADg6wATsAAqUHAAKlKAACDg10DwABsGQFgA4OsARzAAKlULoN6gWkDAAKAwACpasABRwmBwACpdcABRxcBguiCwACphMABRyaBz0/AAKmTwACpmAAAAYPFYQMBYAOKQVwAA8AAqaPAAKsQAAAAAQEBwACprgAAAIGXYAOKQQAAXAE+BEnAAKm8HMAAqcWHwACpwMABSLAnAQABKwCKTErAAKnOAD9OwACp6cAAqfMAAIOEXQPAAGwZAWADg6wBHMAAqfUug3mBaQMAAhbAAKoch8AAqhfAAUiwgtOKRhzAAKovFsAAqicugyKBaYG1KQEAARbAAKo1h8AAqjDAAUiwgtOKRgDAAGxhAYLogsAAqlTAAUcmgdA9FcAAqmTAAUjmCB7AAKpwgdICAAKFwACqj8ABSEUUwACqmcABSOYIAAA9jMAAqqvAAUgiHsAAqtqBjwIAAoTAAKrrwAFIIhTAAKsAwAFI5ggAAD0cwACrIobAAKsXwAFIj4CVAQABFsAAqy2AwACrI8ABRwmDU4NDAAA9HMAAq0iGwACrPcABSI+AlQEAARbAAKtTgMAAq0nAAUcJg1SDRAAAPRzAAKuAFsAAq2+AwACrZcABRwmDVYNFgbEBAAGGwACriMABSI8AwABtAz2LwACrmsABR6EewACrpIHRAgAChcAAq7TAAUhFhMAAq77AAUgiAEnAAKvYgsAAq9zAAUcmPgE9F8AAq/KBwACr7cABRxeDmYPAAKwJwAFHoYIWPgE9F8AArCqBwACsJcABRxeDmIPAAKxJwAFHoYIVSsAArFwBg8AArGPAAUehBoHREsAArSrAAK0+wACzjAABg8aBaQAAAAEDwACtTcAAs4wAAAADAgLAAK1iAAAAg4NdA8AAbBkBYAODrADAAK15AAAAg4RdA8AAbBkBYAODrAABwACtkAAAAIO2YAPAAGxbAWrAAK2lYAPAAGxbHF0DwABsGQFgA4OsAT4JTsAArcDAAK3HAACBsF0DwABsGQFgA4OsATXAAK3RAAABAF0DwABsGQFgA4OsATHAAK3RYAODrAA1wACt1QAAAQBcARfAAK3Vg8AArdHAAUs9gOAcwACt9hbAAK3vgMAArebAAUrOgODAAGxqgT8BAAEWwACuAoHAAK34wAFK44DgwABsagDAAGyIwABs9YPAAK3RwAFLPU7AAK5bwACuZgAAgvtgA8AAbB8Bk07AAK5zwACudQAAgdRgA8AAbB8Bk07AAK56wACufAAAgvxgA8AAbB8Bk0PAAK6FIhzAAK6OhcAArozAAUvQgToBAAEWwACumYDAAK6QwAFKzoDgwABsagDAAGyFABzAAK6lhsAArqPAAUvlgToBAAEWwACusYHAAK6nwAFK44DgwABsagDAAGyFQT4GTsAArsjAAK7XAACDx2ADg6wBHMAAruGAwACu2cABSs4pAQABhcAAruLAAUvQAMAAbLhOwACu88AArwMAAIPIYAODrAEcwACvDoHAAK8FwAFK4ykBAAGGwACvD8ABS+UAwABsuEnAAK8ZIoLAAK8dwAFK+QAWwACvQ4fAAK80wAFMXIM0g7Y+Aj2NwACvW8ABS9AcwACvWYXAAK9bwAFL0IE/AQABlADAAGyIQsAAr2YAP0nAAK9+IoLAAK+CwAFK+QAWwACvqRTAAK+ZwAFMjggAgzSDtj4CPY7AAK/BwAFL5RzAAK+/hsAAr8HAAUvlgT8BAAGUAMAAbIhCwACvzAA/TsAAr+jAAK/zAACDF2ADwABsHwEewACwDoGQAgACh8AAsB3AAUxcFMAAsC3AAUyOCAAAScAAsEUcwACwVBTAALBJwAFNXgkAgToBAAGTAMAAbIU+Aj0cwACwaYPAALBjwAFLJICcAgACNcAAsGoAAAEAYAPAAGwfAYTAALBqwAFLuzXAALB0AAABAGADwABsHwGMwACwdMABS7scwACwdBTAALBqwAFNxwoAgT8BAAGUAMAAbIgUwACwasABTccKAIfAALB6wAFMXADAAGzLPY3AALCUwAFL0BzAALCShcAAsJTAAUvQgT8BAAGUAMAAbIhJwACwpBzAALCzFMAAsKjAAU1eCQCBOwEAAZMAwABshj4CPRzAALDIg8AAsMLAAUskgJwCAAI1wACwyQAAAQBgA8AAbB8BhMAAsMnAAUu7NcAAsNMAAAEAYAPAAGwfAYzAALDTwAFLuxzAALDTFMAAsMnAAU6GCgCBPwEAAZQAwABsiBTAALDJwAFOhgoAFMAAsNnAAUyOCAAAwABsyz2OwACw9MABS+UcwACw8obAALD0wAFL5YE/AQABlADAAGyIPgM9HMAAsRSDwACxDsABSySAnAIAAjXAALEVAAABAGADwABsHwGEwACxFcABS7s1wACxHwAAAQBgA8AAbB8BjMAAsR/AAUu7HMAAsR8UwACxFcABTycKAIE/AQABlADAAGyIFMAAsRXAAU8nCgCHwACxJcABTFwAwABsyz2NwACxP8ABS9AcwACxPYXAALE/wAFL0IE/AQABlADAAGyIPY7AALFMwAFL5RzAALFKhsAAsUzAAUvlgT8BAAGUAMAAbIhDwACxxhzAALHPhcAAsc3AAUvQgToBAAEWwACx2oDAALHRwAFKzoDgwABsagDAAGyFQT4DTsAAsfHAALIAAACDx2ADg6wBHMAAsgqAwACyAsABSs4pAQABNcAAsgsAAAEAYAPAAGwfAYXAALILwAFL0DXAALIMAAABAGADwABsHwGNwACyDMABS9AcwACyDIfAALILwAFQK4E/AQABlADAAGyIh8AAsgvAAVArAMAAbLhJwACyFyKCwACyG8ABSvkAFsAAskGHwACyMsABUAeDNIO2QsAAsk0APz0cwACyY4PAALJdwAFLJICcAgACNcAAsmQAAAEAYAPAAGwfAYTAALJkwAFLuzXAALJuAAABAGADwABsHwGMwACybsABS7scwACybhTAALJkwAFQwQgAgT8BAAGUAMAAbIgUwACyZMABUMEIAIfAALJ0wAFQBwDAAGzLQ8AAso4cwACyl4bAALKVwAFL5YE6AQABFsAAsqOBwACymcABSuOA4MAAbGoAwABshUE+A07AALK6wACyygAAg8hgA4OsARzAALLVgcAAsszAAUrjKQEAATXA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AM+TwAFrhzXAAM+dAAABAGADwABsHwGJwADPncABa4ccwADPnYTAAM+TwAFtj4E/AQABlADAAGyIhMAAz5PAAW2PHMAAz6mDwADPo8ABbAmCSwEAAZQAwABs4gDAAGzLP07AANAUwADQGwAAgbBgA8AAbNcBHsAA0CHAAGzZAQABgcAA0CzAAWuHAEXAANA9AcAA0EbAANBIAACB1GADwABsHwGTARzAANBPg8AA0E3AAW4xgToBAAGBwADQUcABa4cAwABshQGLwADQX8ABbjEcwADQXYPAANBfwAFuMYE/AQABlADAAGyIPgE9HMAA0HCCwADQasABbgKAnAIAAoPAANBxwAFuMRzAANB8FsAA0HYug9+B7ykBAAGDwADQfcABbjEAwABsuADAAGzLSsAA0IsBgsAA0JLAAW4CAAABaPMAAWmyAAFqHwABayYAAW7eAAAABAKB9xLAANQswADUMsAA10MDg+MAAAFgA8AAbFYAAAcEgfkSwADUVsAA1F8JgtMAYAODMgAEgfoSwADUdsAA1JEJg5QAXQPAAGwZAWADg6wABIH7EsAA1KjAANS7CYOVAF0DwABsGQFgA4OsAASB/BLAANTSwADU8AmDlgBdA8AAbBkBYAODrAAEgf0SwADVB8AA1R0Jg5cAXQPAAGwZAWADg6wABIH+EsAA1TTAANVQCYOYAF0DwABsGQFgA4OsAASB/xLAANVnwADVewmDmQBdA8AAbBkBYAODrAABBYICEsAA1YDAANWAwADXQQCBJoFpAAPAANWVwADXQQAAAAEBAcAA1aEAAACBGGADggMAAGADgfcBPwgIAIH5FsAA1bqAwADVuMABb/mC04IGCACB+hbAANXtgMAA1evAAW/5g5SCEQgAgfsWwADWKoDAANYowAFv+YOVghIIAIH8FsAA1mqAwADWaMABb/mDloITCACB/RbAANatgMAA1qvAAW/5g5eCFAgAgf4WwADW7oDAANbswAFv+YOYghUIAIH/FsAA1y2AwADXK8ABb/mDmYIWCQHAANWAwABsWgAAAAAAAAABcLgAAAAAAoIDEsAA10bAANdMwADl7wOD5AAAAWADwABsVgAAEgSCBRLAANdgwADXbBiDRABgA8AAbFsBKgSCBhLAANd8wADXhQmC0wBgA4MyAASCBxLAANeNwADXoRiDrQBgA8AAbB8BkwSCCBLAANepwADXshiDYgBgA8AAbB8BkwSCCRLAANjqwADZGwmDKwBdA8AAbFcBYAOCAwEewADZAMAAbHwAAWADggMAAASCChLAANk1wADZYwmDLgBdA8AAbFcBYAOCAwEewADZSMAAbHwAAWADggMAAASCCxLAANl9wADZsQmDLwBdA8AAbFcBYAOCAwEewADZlsAAbHwAAWADggMAAASCDBLAANnBwADZ1xiD0QBgA8AAbNcBKwSCDRLAANnmwADZ+xiD0gBgA8AAbNcBKwSCDhLAANoRwADaJRiDTQBdA8AAbBkBYAOCAwErBIIPEsAA2xrAANsrGIPKAF0DwABsXwJgA4MyXQPAAGwZAWADikEBKwSCEBLAANwkwADcNBiDaABdA8AAbF8CYAODMmADikEBKwSCERLAANzYwADc8xiDlABdA8AAbBkBYAODrAErBIISEsAA3YzAAN2fGIOVAF0DwABsGQFgA4OsASsEghMSwADeIcAA3j8Yg5YAXQPAAGwZAWADg6wBKwSCFBLAAN62wADezBiDlwBdA8AAbBkBYAODrAErBIIVEsAA3t7AAN76GIOYAF0DwABsGQFgA4OsASsEghYSwADfC8AA3x8Yg5kAXQPAAGwZAWADg6wBKwEFghwSwADfJMAA3yTAAN8+AAAAA8AA3y7AAN8+AAAAAQEBwADfNAAABILTYAODMgAAYAOCAwE/AggBggaAAMABcysJAcAA3yTAAGxaAAAAAAMGghgSwADfQ8AA30jAAN/GAACC7AAAAAEDwADfVMAA38YAAAABAQHAAN9gAAAAgdFgA4IDAABgA8AAbFsBPgFKwADfbQEewADfdIFuAgACFsAA35Mug9GCDBbAAN+xgMAA36vAAXOBg62CBwAGghkSwADfy8AA39DAAOBDAACC7gAAAAEDwADf28AA4EMAAAABAQHAAN/nAAAAgdFgA4IDAABgA8AAbFsBPgFKwADf9AEewADf+4FuAgACFsAA4BEug9KCDRbAAOAugMAA4CjAAXPtg62CBwAGghoSwADgSMAA4E3AAOXtAACDzAAAAAEDwADgY8AA5e0AAAAEBATAAOBuAAAAgJBgA408AMAA4H8AAACBLGADgzIAwADgjgAAAIGXYAOKQQDAAOC0AAAAgS1eAwADAwNgA4MyYAOKQWADikEAAVcDgWsAXAAA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AOleHMAA6WoWwADpZIDAAOliwAF7iINiggiBOwEAARbAAOlugcAA6WzAAXuWg2KCCADAAGyGSsAA6XUBKT9JwADphhzAAOmSFsAA6YyAwADpisABe4iDYoIIgToBAAEWwADploHAAOmUwAF7loNigggAwABshUrAAOmdASo/SsAA6a8BHMAA6ckWwADpuIDAAOm2wAF7iIOtggeBOgEAARbAAOnNgcAA6cvAAXuWg62CBwDAAGyFAAABeuYAAXthAAF8ZwAAAAIAAAIGgW4SwADQocAA0KbAANNqAAGD74FpAAAAAQPAANC7wADTagAAAAICAsAA0McAAACD8GADwABs1wDAANDZAAAAgkpgA8AAbB8AAGADwABsWwE+BU7AANDkwADQ6AAAgxNgA8AAbB8Bk07AANDtwADQ8gAAgxRgA8AAbB8BHMAA0QgWwADRAYDAAND0wAF8pIDgwABsakQBAAGUAMAAbOFJwADRDyIiHMAA0RiDwADRE8ABfOQnAQABHMAA0RuUgVoAAAAAwABsjwDAAGwyARzAANEjgcAA0SHAAXy0gToBAAEcwADRMYDAANElwAF8pCkBAAGTAMAAbLgAwABshQEcwADRSxzAANFEgMAA0TjAAXykKQEAAYPAANFFwAF85ADAAGy4gwABAAGBwADRTsABfLQAwABs9j4BSsAA0VcBKj9DwADScBzAANJ7gsAA0nfAAXzPgToBAAGDwADSfcABfOQAwABshT4DTsAA0o3AANKRAACDFWADwABsHwEcwADSmIPAANKTwAF85EQBAAEcwADSqBzAANKhg8AA0pzAAXzkRAEAAYLAANKjwAF8zwDAAGzhgksBAAGUAMAAbOIAwABs4U7AANLTwADS2QAAgxZgA8AAbB8BHMAA0ueAwADS28ABfKQpAQABhMAA0ujAAX3lAMAAbLhJwADS8hzAANL8hcAA0vbAAX5AgwABAAGBwADS/8ABfLQAwABs9j4BPYrAANMKwAF8z4TAANMQwAF95T4BPYvAANMowAF85BzAANMzhMAA0y/AAX3lRAEAAZQAwABs4UrAANNEASIcwADTT4LAANNLwAF8zycBAAGDwADTUsABfOQAwABsMgAcwADTZBzAANNfgsAA01vAAXzPgfoBAAGUAMAAbN4nAQABkwDAAGwyBoFvEsAA023AANNxwADUKQAB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h4E/AQABlADAAGyIPgJOwABDmcAAQ6MAAIRHYAODgAEcwABDrxbAAEOlLoQ0gqgpAQABgMAAQ7DAAaWHAMAAbLg9HMAAQ8SBwABDusABpe+EDoIuAAAAAIJvBoK/E8AAQ+DAAEPlwABEOgAAhFEAAAABA8AAQ/LAAEQ6AAAAAQEBwABEBQAAAIQNYAOCzQAAXAE+AT0cwABEHhbAAEQRLoQxgqM2AQABNcAARCIAAAEAYAOCzQGAwABEIsABpmE1wABEKAAAAQBcARfAAEQogcAARCLAAaaJhAAugliBwABEIsABpokAwABsRwaCwBPAAEQ/wABERMAARIYAAIRSAAAAAQPAAERLwABEhgAAAAEBAcAARFgAAACEDWADgucAAFwBPgE9HMAARGoWwABEZC6EMoKlNgEAATXAAERuAAABAGADgucBgMAARG7AAabyNcAARHQAAAEAXAEXwABEdIHAAERuwAGnGoQALoJYgcAARG7AAacaAMAAbEcGgsETwABEi8AARI3AAETAAACD+AAAAAEDwABElsAARMAAAAEAAASD+WADwABsVgFbAQEBwABEpgAAAIP6XQOXdwFfAwAAAABfAwAAAUrAAESsARzAAESugMAARKzAAaeQhFMBAAEuAJfQBoLCE8AARMXAAETFwABFxwAAg/sAAAABA8AARNLAAEXHAAAAAQEBwABE2wAAAIP6XQOYcAFbAABcAT4IPR7AAETkgjMCAAIWwABE7i6EEYKigMAARPvAAaftAD0ewABFA4IzAgACFsAARQ0uhDGCo4DAAEUbwAGn7QA9HsAARSOCMwIAAhbAAEUtLoQygqWAwABFNMABp+0APR7AAEU8gjMCAAIWwABFRi6EM4KmgMAARVDAAaftAD0ewABFWIIzAgACFsAARWIugveCp4DAAEVrwAGn7QA9HsAARXOCMwIAAhbAAEV9LoQ0gqiAwABFicABp+0APR7AAEWRgjMCAAIWwABFmy6Du4KpgMAARafAAaftAD0ewABFr4IzAgACFsAARbkug8CCqoDAAEXBwAGn7QAGgsMTwABFzMAARczAAEcmAACEAgAAAAEDwABF3cAARyYAAAABAQHAAEXqAAAAg/pgA5itAABcAT4IPR7AAEXzgjcDAAMWwABGAS6EEYKigMAARg7AAakhLgA9HsAARhyCNwMAAxbAAEYq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AgCExQAAAAEDwADW8MAA1zMAAAABAQHAANb2AAAAgT5gA8AAbFsAAFwBPgFJwADXA4DAANcHwAIS8z0wwADXDieE2j8Gg+oTwADXOMAA103AANeMAQCDVgFqwADXOWADwABsVoC1AAABA8AA12TAANeMAAAAAAAAAGADwABsWwFKwADXZwEhHMAA14gcwADXbRbAANdnLoQwg8+B+gEAAWrAANdvYAPAAGwfhi4AwABs3icBAAGTAMAAbDIGg/gTwADXkcAA16bAANg7AgCDVgFqwADXkmADwABsVoC1AAABA8AA17zAANg7AAAAAQEBwADXwgAAAIE+YAPAAGxbAABcAT4BPRfAANfPLoQwI4DAANfXwAITzBzAANfuFsAA1+guhDCDz4HVAQABasAA1/BgA8AAbB+GLgDAAGy6HMAA2BsWwADYFS6EMIPPgfoBAAEcwADYHWrAANgeYAPAAGwfhi6B+wAAAADAAGzfAMAAbN4BYAPAAGwfg88Gg/oTwADYQMAA2ELAANh1AACD+AAAAAEDwADYS8AA2HUAAAEAAASD+WADwABsVgFbAQEBwADYXQAAAIP6XQOXYwFfAwAAAABfAwAAAUrAANhjARzAANhlgMAA2GPAAhSMhNsBAAEuAJdoBoP7E8AA2HrAANh6wADYwgAAhKgAAAABA8AA2InAANjCAAAAAQEBwADYoQAAAIP6XQOYZwFbAABbAUrAANinARzAANipgMAA2KfAAhTphNwBAAEuAJhqBoP8E8AA2MfAANjHwADZSQAAg/sAAAABA8AA2NTAANlJAAAAAQEBwADY3QAAAIP6XQOYcAFbAABcAT4EPR7AANjmgjMCAAIWwADY8C6EEYOvgMAA2P3AAhVAAD01wADZBQAAAQBgA4lVARbAANkFLoGXg84jHMAA2QWBwADZBcACFXYnAQABKwCJWSscwADZC4HAANkFwAIVdoP4AQFbAYDAANkSwAIVQACJVwFbPTXAANkaAAABAGADiR8BFsAA2RougYiDsCMcwADZGoHAANkawAIVyScBAAErAIkrKxzAANkggcAA2RrAAhXJg/gBAVsBgMAA2SfAAhVAAIksAVs9NcAA2S8AAAEAYAOFGgEWwADZLy6Ey4PQIxzAANkvgcAA2S/AAhYcJwEAASsAwABsXiscwADZPIHAANkvwAIWHIP4AQFb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qAEAAYDAATJywAJf3QCEHgFbPTXAATJ6AAABAGADheQBFsABMnouga2EwSMcwAEyeoHAATJ6wAJgSCcBAAErAMAAbF4rHMABMoWBwAEyesACYEiD+AEBWwGAwAEyjMACX90AhewBWwaEyRPAATKXwAEyl8ABMzAAAIQCAAAAAQPAATKowAEzMAAAAAEBAcABMrUAAACD+mADmK0AAFwBPgFJwAEyviEcwAEyzBbAATLCLoGthMEnAQABKwDAAGxePgI9F8ABMt0uga0mwAEy3QEcwAEy8xbAATLpLoGthMGD+AEBYAOCUgGAwAEzBMACYMIAhexgA4XkhME9NcABMw4AAAEAYAOF5AEWwAEzDi6BrYTBIxzAATMOgcABMw7AAmExJwEAASsAwABsXisXwAEzGYHAATMOwAJhMYQALoJYAWADhL4/AAACXncAAl7zAAJfTAACX7YAAmCbAAJhewAAAAUChM0TwAE0LsABNDTAATe9A4URAAABYAOEoQAAAgSEzxPAATS7wAE0yhiE5ABgA4J+AASE0BPAATTYwAE04RiBrQBgA4XkAAIFhNoTwAE05sABNObAATVlAAAAA8ABNPzAATVlAAAAAgICwAE1CQAAAIC+YAOEAgDAATUbAAAAga1gA4XkAABgA4TNAT8BCgDAATUzhNsCAAIewAE1P4I4AQABgMABNVLAAmICAIHAATVbwAJiEAAFhNsTwAE1asABNWrAATXVAIRdAAPAATWMwAE11QAAAAICAsABNZIAAASE5GADgn4AwAE1qAAABIGtYAOF5AAAYAOEzQE+AT01wAE1uQAAAQBgA4XkARbAATW5LoGthNAjHMABNbmCwAE1ucACYpgnAQABKwDAAGxeKxfAATXEgsABNbnAAmKYhAAuglgBYAOEzQMIAYTPgADAAmJyCAGE0IEAwAJigAkBwAE1aoSnAAAAAAUGhNITwAE12sABNerAATYSAQCAvgAAAAEDwAE18cABNhIAAAAAAAAAYAOEAgFKwAE19AE1wAE19AAAAQBgA4J+ARbAATX0LoTkhM8jHMABNfSAwAE19MACYzcnAQABKwDAAGxeKxbAATYFgMABNfTAAmM3hCSCiQFgA4QCBoTUE8ABNhfAATYgwAE2cQIAgL4AAAABA8ABNibAATZxAAAAAQEBwAE2MwAAAIC+YAOEAgAAXAE+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A4lVAT4FTsABpsLAAabSAACDG2ADg6wBFsABptkugxuGC0nAAabuIRzAAacCgcABpvLAAtC7JwEAASsAwABsXj4HScABpxMiJcABpycAgcABpxfAAtC7YAOESwAcwAGnaBbAAadJgMABp0HAAtCkhTWbGoVZAQABFMABp4fAAtC7AQFgA4RLAJrUPgFKwAGnowEcwAGnwhbAAaeygMABp6rAAtCkhTWbGoVaAgACHMABp/YWwAGn7S6FSYYGhTMBAAGAwAGoBMAC0KQAhRwcwAGoMhzAAaguFsABqCQWwAGoGi6BrYYIhVuF5ykBAAGTAMAAbLiFMwEAAYDAAahAwALQpACFHACa1T9OwAGoX8ABqGoAAILhYAODMgEWwAGofIHAAahswALQu4Mzg7ROwAGolsABqKMAAIVLYAOJqgEcwAGouBbAAaivLoVJhgaFNAIAAoLAAajSwALRv4DAAajewALQpACFHU7AAajywAGo/QAAhMhgA4lVARzAAak3HsABqQyWQAEAAYPAAakewALR4wCDZwEAARbAAalWgcABqUbAAtC7hMiDvwCWR0nAAalpJcABqXgAhMABqW3AAtIeYAOJvj4DTsABqaAAAACDzWADljgAScABqbYcwAGp2xbAAanUFsABqcUUwAGpusAC0h4EAWADib6DY4nAgODAAGxqJwEAARbAAanuFsABqegWwAGp3i6BrYYIg8uF5oDgwABsagDAAGwyPgE9jcABqgLAAtJ9HsABqh6WQgIAAhbAAapCFMABqjfAAtIeBAFgA4m+g2OJwBbAAapcFsABqlIuga2GCIPLheYAPgE9jcABq1TAAtJ9HsABq3CWQgIAAhbAAauUFMABq4nAAtIeBAFgA4m+g2OJwBzAAaxIHMABq98WwAGrvRTAAauywALSHgQBYAOJvoNjicCCoQEBYAOJVQE0wAGr4wPAAavjwAGsMwAAAAEBAcABq/IAAACFcGADiiYAAGADiVUBSsABrBoBFsABrCiGwAGsGsAC046FcYosAMAAbOuAoAAAAADAAGxmAErAAaxlARzAAax5hcABrGzAAtJ9g2cBAAEWwAGskxTAAayIwALSHgQBYAOJvoUDicYAlkc/ScABrfolwAGuCQCEwAGt/sAC0h5gA4mqPgJOwAGuLMABrjMAAIREYAODrAEcwAGuWhbAAa49gMAB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AijNwANZUC4AAAADVqQAA1csAANXlgADWCgAA1kpAANZ2QAAAAUCh5kTwAIo3sACKOTAAirxA4LPAAABYAOCUgAAAgSHmxPAAikNwAIpEBiBPABgA4UaAASHnBPAAikfwAIpJBiBPgBgA4UaAAEFh6ITwAIpKcACKSnAAil+AAAAA8ACKTHAAil+AAAAAgICwAIpNwAABIE8YAOFGgDAAilBAAAEgT5gA4UaAABgA4eZAT4CPTXAAilOAAABAGADhRoBFsACKU4ugTyHmyMcwAIpToLAAilOwANahicBAAErAMAAbF4rF8ACKVOCwAIpTsADWoaEAC6CWAFgA4eZPTXAAilmAAABAGADhRoBFsACKWYugT6HnCMcwAIpZoLAAilmwANa0ScBAAErAMAAbF4rF8ACKW2CwAIpZsADWtGEAC6CWAFgA4eZAwgBh5uAAMADWmAIAYecgQDAA1puCQHAAikpgmcAAAAAAwaHnhPAAimDwAIphcACKbkAAIP4AAAAAQPAAimOwAIpuQAAAQAABIP5YAPAAGxWAVsBAQHAAimeAAAAg/pdA5d3AV8DAAAAAF8DAAABSsACKaQBHMACKaaAwAIppMADW3CF2AEAAS4Al9sGh58TwAIpvsACKb7AAioFAACD+wAAAAEDwAIpy8ACKgUAAAABAQHAAinUAAAAg/pdA5hwAVsAAFwBPgI9NcACKd0AAAEAYAOFGgEWwAIp3S6BPIebIxzAAindgcACKd3AA1vkJwEAASsAwABsXiscwAIp4oHAAindwANb5IP4AQFbAYDAAinpwANbzQCFHgFbPTXAAinxAAABAGADhRoBFsACKfEugT6HnCMcwAIp8YHAAinxwANcOScBAAErAMAAbF4rHMACKfiBwAIp8cADXDmD+AEBWwGAwAIp/8ADW80AhR4BWwaHoBPAAioKwAIqCsACKu8AAIQCAAAAAQPAAiobwAIq7wAAAAEBAcACKigAAACD+mADmK0AAFwBPgJJwAIqMSEcwAIqORbAAio1LoE8h5snAQABKwDAAGxePgI9F8ACKkougTwmwAIqSgEcwAIqVBbAAipQLoE8h5uD+AEBYAOCUgGAwAIqZcADXLMAhR5gA4Uah5s9NcACKm8AAAEAYAOFGgEWwAIqby6BPIebIxzAAipvgcACKm/AA10iJwEAASsAwABsXisX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AAQH0AAECBkABAiCAAQI9QAECUAABAmPAAAABwKJqhPAAsOzwALDucACza8DhlYAAAFgA4lVAAADBImsE8ACw+bAAsPvGIOaAGADgn4ABImtE8ACxBLAAsQdCYNlAWrAAsP1YAPAAGxWgLVgA4lHAASJrhPAAsQ3wALERAmDcwBdA8AAbBkBYAOJVQACBYm8E8ACxNTAAsTUwALFtAAAAAPAAsThwALFtAAAAAMCA8ACxOgAAACC02ADgzIAwALE/wAAAINlYAOJRwDAAsUiAAAAg3NdA8AAbBkBYAOJVQFqAGABwABsXAIAYAOJqgE/AQoAwALFP4m9AwADHsACxUuCOQEAAYDAAsVdwAQKRwCBwALFacAEClU1wALFggAAAQBdA8AAbBkBYAOJVQGCwALFgsAECmMjHMACxYKDwALFgsAECrInAQABKwDAAGxiHsACxZOJtAEAAYDAAsWpwAQKRwCDwALFgsAECrIBXQPAAGwZAWADiVUABYm9E8ACxbnAAsW5wALGMwCEXQADwALF0sACxjMAAAADAwPAAsXfAAAEg5pgA4J+AMACxe8AAASDZWADiUcAwALGAQAABINzXQPAAGwZAWADiVUAAGADiaoBPwUIAYmsgADABAs1CAGJrYEAwAQLQwgBia6CAMAEC1EMAEAhHMACxiuBwALGH8AEC0MnAQABKwDAAGxewALGH8ACxjIACQHAAsW5iWMAAAAACQaJsBPAAsY4wALGQsACxmABAILTAAAAAQPAAsZMwALGYAAAAAAAAABgA4MyAUrAAsZPARbAAsZZFsACxk8ug5qJrIQegoYGibQTwALGZcACxnvAAseuAAGGV4IuAAAAAQPAAsaQwALHrgAAAAEBAcACxpcAAACC02ADgzIAAF0DwABsGQFgA4lVAT4BScACxqgcwALGzBbAAsbFFsACxraAwALGrMAEDC2DY4NCgODAAGxqJwEAAZMAwABsMj4BSsACxxUBasACxxxdA8AAbBkBYAOJVYTyPgFKwALHQwEewALHTsAAbSQCAWADiVUCFsACx4gWwALHeYDAAsdvwAQMLYNjg0KA4MAAbGpqwALHlmADiXKFsQAGibUTwALHs8ACx8HAAsf+AACD+AFqwALHtGADwABsVoC1AAABA8ACx8rAAsf+AAABAAAEg/lgA8AAbFYBWwEBAcACx94AAACD+l0Dl98BXwMAAAAAXwMAAAFKwALH5AEcwALH5oDAAsfkwAQNF4ZYAQABLgCX5gaJthPAAsgDwALIEcACyGgAAIU+AWrAAsgEYAPAAGxWgLUAAAEDwALIHsACyGgAAAIAAASD+WADwABsVgFbAAAEhT9gA8AAbFYBWwICAsACyDYAAACD+l0Dl+0CXwMAAF8DAQAAwALIOwAAAIVAXwMBAAAAXwMAAAFKwALISQEcwALIS4DAAshJwAQNm4ZYAgACLoHAAshkwAQNsgCX9AaJtxPAAshtwALIfsACyN4AAIP7AWrAAshuYAPAAGxWgLUAAAEDwALIi8ACyN4AAAABAQHAAsiUAAAAg/pdA5hwAVsAAFwBPgI9HMACyKcWwALInS6C04mwhKgBAVsBgMACyLfABA4gAIN3PR7AAsi/gjMCAAIWwALIyS6Dc4mugMACyNjABA4gAAaJuBPAAsjjwALI/cACySQDACcBasACyORgA8AAbFaAtQAAAQPAAsj/wALJJAAAAAEBAcACyQcAAACB0WADwABsVgAAYAPAAGxbAUrAAskRARzAAskRLoZJAgACgMACyRjABA6pKwCJuQaJuRPAAskpwALJOsACy18AAIZJAWrAAskqYAPAAGxWgLUAAAEDwALJQMACy18AAAACAgLAAslIAAAAgdFgA8AAbFYAwALJWwAAAIZKYAObYwAAYAPAAGxbAT4CScACyW4ewALJcsAAbPcCAAIugMACyYLABA8TAErAAsmKASk/ScACyZslwALJpQCAwALJn8AEDxNgA4mqPgVJwALJvyEcwALJzxbAAsnDLoNlia0nAQABFsACydgUwALJ0sAEDxMAAWADiaqDZYmtAMAAbF5KwALJ5QEqP0nAAsn5IRzAAsoHFsACyf0ug5qJrCcBAAEWwALKEBTAAsoKwAQPEwABYAOJqoOaiawAwABsXkrAAsobASo/ScACyi8hHMACykgWwALKQRbAAsozLoNzia6A4MAAbGonAQABFsACyl8WwALKURTAAspLwAQPEwABYAOJqoNzia6A4MAAbGoAwABsMkrAAspnASo/RcACynsBwALKhMACyoYAAIHUYAPAAGwfAZMBHMACyo2CwALKi8AEEE+BOgEAARbAAsqdFsACyo8ug3OJroDgwABsagDAAGyFAYrAAsqnwAQQTxzAAsqlgsACyqfABBBPgT8BAAGUAMAAbIg+AUnAAsq0IRzAAsrKHMACysYWwALKuS6Dc4muKQEAAYLAAsrHwAQQTwDAAGy4hkkCAAIcwALK5BbAAsrXFMACytHABA8TAAFgA4mqg3OJrikBAAGCwALK5cAEEE8AwABsuIHAAsrpwAQPIwCJWz4BSsACywMBKj9KwALLKQEpPgFKwALLSQEqBomxE8ACy2TAAst4wALM1wEAgdcBasACy2VgA8AAbFaAtQAAAQPAAsuBwALM1wAAAAAAAABgA8AAbB8BPgVOwALLi8ACy5AAAIHYYAPAAGwfARzAAsudN/////+B+gEAARbAAsupFsACy58ug5qJrIHXwABtKADAAGzeRcACy7cBwALLwMACy8IAAIHUYAPAAGwfAZMBHMACy8mBwALLx8AEEb2BOgEAARbAAsvZFsACy8sug3OJroDgwABsagDAAGyFAYnAAsvjwAQRvRzAAsvhgcACy+PABBG9gT8BAAGUAMAAbIg+AT2IwALL7sAEEXscwALMADf/////gfoBAAEcwALMDRzAAswIgMACzAPABBF7ge8BAAE3HwDAAGzTgT8BAAEcwALMFYDAAswQwAQRe4HWAQABFsACzCgcwALMJBbAAswXLoNzia4pAQABgcACzCXABBG9AMAAbLiB18AAbSgAwABsuQDAAGyIAMAAbN5OwALMQsACzFIAAIZZYAPAAGwfARzAAsx2HMACzGA38zMzM4JLAQABFsACzG8WwALMYy6DZYmtgyiJSQDAAGzigdYBAAE38zMzMwDAAGy5PYjAAsyIwAQRexzAAsyaN/////+B+gEAARzAAsynHMACzKKAwALMncAEEXuB7wEAATcfAMAAbNOBPwEAARzAAsyvgMACzKrABBF7gdYBAAGBwALMscAEErAAwABsuQDAAGyIAMAAbN5KwALMyAGAwALMz8AEEXsGiboTwALM3MACzPbAAs2tAACDawFqwALM3WADwABsVoC1AAABA8ACzQXAAs2tAAAAAQEBwALNEgAAAINlYAOJRwAAYAOJqgE+AUrAAs0lASMcwALNOIDAAs0swAQTqScBAAEWwALNQC6DZYmtAMAAbF4uH8ACzWmJvQMAAxbAAs2DLoOaiayAwALNjsAEE6kWwALNmy6Dc4muAAFgA4mqAAAEC74ABAwEAAQM1gAE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nsAC5tAAAAEAAASD+WADwABsVgFbAQEBwALmsgAAAIP6XQOX3wFfAwAAAABfAwAAAUrAAua4ARzAAua6gMAC5rjABCzYhmgBAAEuAJfpBonmE8AC5tXAAubjwALnOAAAhT4BasAC5tZgA8AAbFaAtQAAAQPAAubwwALnOAAAAgAABIP5YAPAAGxWAVsAAASFP2ADwABsVgFbAgICwALnCAAAAIP6XQOX7QJfAwAAXwMBAADAAucNAAAAhUBfAwEAAABfAwAAAUrAAucbARzAAucdgMAC5xvABC1chmgCAAIugcAC5zTABC1zAJf3BonnE8AC5z3AAudOwALntgAAg/sBasAC5z5gA8AAbFaAtQAAAQPAAudbwALntgAAAAEBAcAC52QAAACD+l0DmHABWwAAXAE+Aj0ewALnbYIzAgACFsAC53cug3OJ3oDAAueGwAQt4QA9HMAC55CAwALnjsAELeGGaQEAARbAAuemLoZnieAAmI4GieETwALnu8AC59TAAui5AQCGRgFqwALnvGADwABsVoC1AAABA8AC5+DAAui5AAAAAAAAAGADiVUBPgJOwALn78AC5/YAAIGwYAOJVQEcwALoIx7AAugNlkEBAAEuAINnAQABFsAC6D4WwALoMi6GZ4nggZeDBwCWR0rAAuhJARzAAuhXgMAC6FDABC5zg2sBAAEewALocJYsAgACFsAC6JuAwALolMAELnODZYldFsAC6Kgug2WJ3AAAiVoGieITwALovsAC6NfAAukDAQCGRQFqwALov2ADwABsVoC1AAABA8AC6N/AAukDAAAAAAAAAGADiVUBPgFKwALo5QEWwALo+BbAAujsLoZGieGGRYleBonoE8AC6QjAAukiwALpSQMAJwFqwALpCWADwABsVoC1AAABA8AC6STAAulJAAAAAQEBwALpLAAAAIHRYAPAAGxWAABgA8AAbFsBSsAC6TYBHMAC6TYuhkkCAAKAwALpPcAEL3srAInpBonpE8AC6U7AAulfwALrpQAAhkkBasAC6U9gA8AAbFaAtQAAAQPAAullwALrpQAAAAICAsAC6W0AAACB0WADwABsVgDAAumAAAAAhkpgA5tjAABgA8AAbFsBPgFJwALpkx7AAumXwABs9wIAAi6AwALpp8AEL+UAPgFKwALptwEpScAC6c8lwALp2QCAwALp08AE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wAMnCwAAAICjYAPAAGwfAABgA8AAbB8BPgNJwAMnFCIcwAMnGoDAAycYwARI0CcBAAFqwAMnHWADwABsHwAAwABsMgEcwAMnLIHAAycqwARI4CcBAAFqwAMnL2ADwABsHwAAwABsMkrAAyc6AWrAAydBYAPAAGwfAD9JwAMnUCIcwAMnVoDAAydUwARI0CcBAAFqwAMnWWADwABsH4TgAMAAbDIBHMADJ2iBwAMnZsAESOAnAQABasADJ2tgA8AAbB+E4ADAAGwySsADJ3YBasADJ31gA8AAbB+E4D9KwAMnjAEjHMADJ5WAwAMnk8AESNAnAQABgcADJ5jABEjgAMAAbDJqwAMnnGADwABsHwNqwAMnqGADwABsH4UEAWADwABsHwaKHhPAAygwwAMoPMADKIkAAYaCAAAAAQPAAyhHwAMoiQAAAAICAsADKEwAAACAomADwABsHwDAAyhTAAAAgKNgA8AAbB8AAGADwABsWwE+AUrAAyhcASIewAMoY4ofAgACgMADKHbABEorgcADKHnABEo7AAAhHMADKIGAwAMof8AESisnAQABgcADKITABEo7AMAAbDIGih8TwAMpDMADKRjAAylZAAGGgwAAAAEDwAMpKsADKVkAAAACAgLAAykvAAAAgKJgA8AAbB8AwAMpNgAAAICjYAPAAGwfAABgA8AAbFsBPgFKwAMpPwEcwAMpUR7AAylGihwCAAKAwAMpS8AESsKBwAMpTsAEStIAJwEAAYHAAylUwARK0gDAAGwyBoogE8ADKc3AAynZwAMqIAABhoQAAAABA8ADKeHAAyogAAAAAgICwAMp5gAAAICiYAPAAGwfAMADKe0AAACAo2ADwABsHwAAYAPAAGxbAT4BSsADKfYBIh7AAyn9iiECAAKAwAMqDcAES02BwAMqEMAES10AACEcwAMqGIDAAyoWwARLTScBAAGBwAMqG8AES10AwABsMgaKIRPAAyqgwAMqrMADKuoAAYaFAAAAAQPAAyq7wAMq6gAAAAICAsADKsAAAACAomADwABsHwDAAyrHAAAAgKNgA8AAbB8AAGADwABsWwE+AUrAAyrQARzAAyriHsADKteKHAIAAoDAAyrcwARL5IHAAyrfwARL9AAnAQABgMADKuXABEvkAMAAbDIGiiITwAMq78ADKvrAAyv3AAGGhgAAAAEDwAMr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AACB2GADwABsHwEcwAM/Mjf/////gfoBAAEWwAM/PhbAAz80LoOaikOB18AAbSgAwABs3kXAAz9MAcADP1XAAz9XAACB1GADwABsHwGTARzAAz9egcADP1zABFqugToBAAEWwAM/bhbAAz9gLoNzikSA4MAAbGoAwABshQGJwAM/eMAEWq4cwAM/doHAAz94wARaroE/AQABlADAAGyIPgE9iMADP4PABFpsHMADP5U3/////4H6AQABHMADP6IcwAM/nYDAAz+YwARabIHvAQABNx8AwABs04E/AQABHMADP6qAwAM/pcAEWmyB1gEAARbAAz+9HMADP7kWwAM/rC6Dc4pEKQEAAYHAAz+6wARargDAAGy4gdfAAG0oAMAAbLkAwABsiADAAGzeSsADP9MBgMADP9rABFpsAAAEVrcABFb9AARXZwAEV+QABFhDAARaOgAEW68AAAAGAopQE8ADQKnAA0C4wANEOQeGkwAAAWADgkoAAAABBYpbAAAAAAQAAAMAAAAAAAAAAABgA4pQAT8BCQEAglEAAAAABwaKUhPAA0GxwANBscADQckAAoP7AAAAAQPAA0G+wANByQAAAAEBAcADQccAAACD+l0DmHABWwAAXAAGilMTwANCDMADQg7AA0ItAAKD+AAAAAEDwANCF8ADQi0AAAEAAASD+WADwABsVgFbAQEBwANCKwAAAIP6XQOX+wFfAwAAAABfAwAAAAaKVBPAA0J5wANCe8ADQpsAAoSoAAAAAQPAA0KNwANCmwAAAQAABIP5YAPAAGxWAVsBAQHAA0KZAAAAg/pdA5hwAV8DAAAAAF8DAAAABopZE8ADQ2PAA0NrwANDcwECgdcAAAABA8ADQ3PAA0NzAAAAAAAAAGADwABsHwAGilUTwANDd8ADQ4XAA0OVAwInAAAAAQPAA0OHwANDlQAAAAEBAcADQ48AAACB0WADwABsVgAAYAPAAGxbAAaKVhPAA0PAwANDycADQ+sAAoaUAAAAAQPAA0PQwAND6wAAAAEBAcADQ+MAAACBM2ADmxgAAGADiVUABopXE8ADQ/DAA0P7wANENwAAhpUAAAABA8ADRAfAA0Q3AAAAAAAAAGADhRoBPgFKwANEEAEfwANEG4fJAQABLgAAAARcEwAEXE0ABFyaAARc5wAEXRYABF1UAARdjwAEXdAAAAAHAopcE8ADRDzAA0RLwANFUQeGlgABAAAEgS9gA8AAbFYBWwFgA4pQAAABBIpeE8ADRH3AA0SCCYE+AF8DAAAAAQWKZRPAA0SHwANEh8ADRKQAAAADwANEmMADRKQAAAABAQHAA0SeAAAEgT5fAwAAAABdA4pcAV8DAAABPwIIAYpegADABF5XCQHAA0SHilsAAAAAAwaKYBPAA0SpwANEsMADRMYAAIFTAAAAAQPAA0S4wANExgAAAAAAAABgA8AAbBgBSsADRL4BJMADRMYBFsADRMAugT6KXgaKYxPAA0TLwANE08ADRO0BAIHXAAAAAQPAA0TcwANE7QAAAAAAAABgA8AAbB8BSsADRN8BFsADROUWwANE3y6BPopegdfAAG0oBophE8ADRPLAA0UAwANFTwMAJwAAAAEDwANFAsADRU8AAAABAQHAA0UKAAAAgdFgA8AAbFYAAGADwABsWwFKwANFGgEiJcADRSAAgMADRRrABF8+XQOKXAFfAwAAABzAA0VHFsADRUEUwANFO8AEXz4AAV0DilwBXwMAAIE+il4nAQABFsADRUougT6KXgDAAGxeAAAEXokABF7OAARfGAAEX6sAAAADAopmE8ADRVTAA0VawANGsAOGlwAAAV0DilwBYAHAAGxcAAAAAQWKbRPAA0WLwANFi8ADRacAAAADwANFl8ADRacAAAAAAAAAYAOKZgE/AQkAwANFnIplAQABKwAEBopoE8ADRazAA0WswANFxgAAg/sAAAABA8ADRbnAA0XGAAAAAQEBwANFwgAAAIP6XQOYcAFbAABcAT4ABoppE8ADRcrAA0XMwANGCAAAg/gAAAABA8ADRdXAA0YIAAABAAAEg/lgA8AAbFYBWwEBAcADRekAAACD+l0Dl/sBXwMAAAAAXwMAAAFKwANF7wEcwANF8YDAA0XvwARgjYaYAQABLgCX/gaKahPAA0YMwANGDsADRlQAAISoAAAAAQPAA0YgwANGVAAAAQAABIP5YAPAAGxWAVsBAQHAA0YsAAAAg/pdA5hwAV8DAAAAAF8DAAABSsADRjIBHMADRjSAwANGMsAEYPeGmQEAAS4AmJAGimsTwANGWcADRmLAA0auAACGlAAAAAEDwANGacADRq4AAAABAQHAA0Z8AAAAgTNgA5sYAABgA4lVAUrAA0aOARbAA0amFsADRpaAwANGjsAEYVSFNZsag1eayAAABGAdAARgWQAEYMMABGEtAARhiQAAAAQCim4TwANGs8ADRrnAA0g8A4aaAAABXQOKXAFgA8AAbFsAAAABBYp1E8ADRurAA0bqwANHEQAAAAPAA0b2wANHEQAAAAEBAcADRvwAAACBPmADwABsWwAAYAOKbgE/AQkAwANHBYplAQABgMADRwvABGHpAAQGinATwANHFsADRxbAA0cwAACD+wAAAAEDwANHI8ADRzAAAAABAQHAA0csAAAAg/pdA5hwAVsAAFwBPgAGinETwANHNMADRzbAA0dyAACD+AAAAAEDwANHP8ADR3IAAAEAAASD+WADwABsVgFbAQEBwANHUwAAAIP6XQOX+wFfAwAAAABfAwAAAUrAA0dZARzAA0dbgMADR1nABGKHhpsBAAEuAJf/BopyE8ADR3bAA0d4wANHvgAAhKgAAAABA8ADR4rAA0e+AAABAAAEg/lgA8AAbFYBWwEBAcADR5YAAACD+l0DmHABXwMAAAAAXwMAAAFKwANHnAEcwANHnoDAA0ecwARi8YacAQABLgCYkQaKcxPAA0fDwANHzMADSDoAAIaUAAAAAQPAA0fTwANIOgAAAAEBAcADR+YAAACBM2ADmxgAAGADiVUBSsADR/gBHMADSBoWwANIEBbAA0gAgMADR/jABGNOhTWbGoCQmryFcwEAARbAA0gugMADSCbABGNOhD6bHwCOSQAABGIXAARiUwAEYr0ABGMnAARjogAAAAQCinYTwANIa8ADSHHAA0ntA4adAAABXQOKXAFgA8AAbB8AAAABBYp9E8ADSKDAA0igwANIxQAAAAPAA0irwANIxQAAAAEBAcADSLAAAACBPmADwABsHwAAYAOKdgE/AQkAwANIuYplAQABgMADSL/ABGQCAAQGingTwANIysADSMrAA0jkAACD+wAAAAEDwANI18ADSOQAAAABAQHAA0jgAAAAg/pdA5hwAVsAAFwBPgAGinkTwANI6MADSOrAA0klAACD+AAAAAEDwANI88ADSSUAAAEAAASD+WADwABsVgFbAQEBwANJBwAAAIP6XQOX+wFfAwAAAABfAwAAAUrAA0kNARzAA0kPgMADSQ3ABGSghp4BAAEuAJgABop6E8ADSSnAA0krwANJcAAAhKgAAAABA8ADST3AA0lwAAABAAAEg/lgA8AAbFYBWwEBAcADSUkAAACD+l0DmHABXwMAAAAAXwMAAAFKwANJTwEcwANJUYDAA0lPwARlCoafAQABLgCYkgaKexPAA0l1wANJfsADSesAAIaUAAAAAQPAA0mFwANJ6wAAAAEBAcADSZgAAACBM2ADmxgAAGADiVUBSsADSaoBHMADScwWwANJwhbAA0mygMADSarABGVnhTWbGoCQmryFTQEAARbAA0nfgMADSdfABGVnhD6bHwCOSgAABGQwAARkbAAEZNYABGVAAARluwAAAAQCin4TwANKQcADSkfAA0x3A4agAAABXQOKXAFgA8AAbRYAAAABBYqIE8ADSnzAA0p8wANKpwAAAAPAA0qKwANKpwAAAAEBAcADSpIAAACBPmADwABtFgAAYAOKfgE/AQkAwANKm4plAQABgMADSqHABGYbAAYGioATwANKrMADSqzAA0rGAACD+wAAAAEDwANKucADSsYAAAABAQHAA0rCAAAAg/pdA5hwAVsAAFwBPgAGioETwANKysADSszAA0sKAACD+AAAAAEDwANK1cADSwoAAAEAAASD+WADwABsVgFbAQEBwANK6QAAAIP6XQOX+wFfAwAAAABfAwAAAUrAA0rvARzAA0rxgMADSu/ABGa5hqEBAAEuAJgBBoqCE8ADSw7AA0sQwANLWAAAhKgAAAABA8ADSyLAA0tYAAABAAAEg/lgA8AAbFYBWwEBAcADSy4AAACD+l0DmHABXwMAAAAAXwMAAAFKwANLNAEcwANLNoDAA0s0wARnI4aiAQABLgCYkwaKhhPAA0tdwANLZcADS5MBAIHXAAAAAQPAA0tuwANLkwAAAAAAAABgA8AAbB8BSsADS3EBIxbAA0t3FsADS3EugT6KXoajwABtLDeAxxjAA0uLgdeKYwFgA8AAbB8GioMTwANLl8ADS6XAA0v3AwAnAAAAAQPAA0unwANL9wAAAAEBAcADS68AAACB0WADwABsVgAAYAPAAGxbAUrAA0u/ASIlwANLxQCAwANLv8AEZ91gA4p+AB7AA0vawABs9wIAAhbAA0vkLoE+il4WwANL8RTAA0vrwARn3QABYAOKfoE+il4ABoqEE8ADS/zAA0wFwANMdQAAhpQAAAABA8ADTAzAA0x1AAAAAQEBwANMHwAAAIEzYAObGAAAYAOJVQFKwANMMQEcwANMUxbAA0xJFsADTDmAwANMMcAEaGaFNZsagJCavIXBAQABFsADTGmAwANMYcAEaGaEPpsfAI5MAAAEZkkABGaFAARm7wAEZ1kABGe3AARoPwAEaLoAAAAGAoqJE8ADTHrAA0yAwANOMQOGpAAAAV0DilwBYAPAAGwYAAAAAQWKkBPAA0y1wANMtcADTQAAAAADwANMw8ADTQAAAAABAQHAA0zLAAAAgT5gA8AAbBgAAGADiokBPgFAIRzAA0z0gMADTO7ABGkiJwEAASsAwABsNsADTO7AA0z7AAEJAMADTNSKZQEAAYDAA0zawARpIgAEBoqLE8ADTQXAA00FwANNHwAAg/sAAAABA8ADTRLAA00fAAAAAQEBwANNGwAAAIP6XQOYcAFbAABcAT4ABoqME8ADTSPAA00lwANNYwAAg/gAAAABA8ADTS7AA01jAAABAAAEg/lgA8AAbFYBWwEBAcADTUIAAACD+l0Dl/sBXwMAAAAAXwMAAAFKwANNSAEcwANNSoDAA01IwARp5IalAQABLgCYAgaKjRPAA01nwANNacADTbEAAISoAAAAAQPAA017wANNsQAAAQAABIP5YAPAAGxWAVsBAQHAA02HAAAAg/pdA5hwAV8DAAAAAF8DAAABSsADTY0BHMADTY+AwANNjcAEak6GpgEAAS4AmJQGio4TwANNtsADTb/AA04vAACGlAAAAAEDwANNxsADTi8AAAABAQHAA03ZAAAAgTNgA5sYAABgA4lVAUrAA03rARzAA04NFsADTgMWwANN84DAA03rwARqq4U1mxqAkJq8hZEBAAEWwANOI4DAA04bwARqq4Q+mx8Ajk0AAARpdAAEabAABGoaAARqhAAEav8AAAAEAoqRE8ADTjTAA046wANRgwOGpwAAAWADilAAAAIEipMTwANOa8ADTm8JgYgAYAPAAGwYAASKlBPAA06DwANOkwmGqABgA4J+AAEFip8TwANOmMADTpjAA07IAAAAA8ADTqbAA07IAAAAAgICwANOrAAABIGIYAPAAGwYAMADTrcAAASGqGADgn4AAGADipEBPwMIAYqTgADABGuECAGKlIEAwARrlAkBwANOmIpbAAAAAAcGipYTwANOzcADTs3AA07nAACD+wAAAAEDwANO2sADTucAAAABAQHAA07jAAAAg/pdA5hwAVsAAFwBPgAG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youbAgACFsADVtAugTyKtBbAA1bVLoE+irUABoq4E8ADVuDAA1buwANXTQMAJwAAAAEDwANW8MADV00AAAABAQHAA1b4AAAAgdFgA8AAbFYAAGADwABsWwFKwANXCAEiIiXAA1cOAIDAA1cIwAR21WADirIAHMADVy8WwANXKxTAA1clwAR21QABYAOKsoE8irQnAQABFsADVzIugTyKtACKVQAcwANXRRbAA1c/FMADVznABHbVAAFgA4qygT6KtScBAAEWwANXSC6BPoq1AIpVAAAEdgkABHZbAAR2rwAEd2YAAAADAoq9E8ADV1LAA1dYwANbPAOGswAAAWADilAAAAMEir8TwANXicADV5UJhZQAYAOJVQAEisATwANXrsADV7UJg50AXQPAAGwZAWADilAABIrCE8ADWV3AA1lsGIasgi4AYAPAAGwfASsBBYrNE8ADV7rAA1e6wANX5wAAAAPAA1fGwANX5wAAAAICAsADV8wAAASFlGADiVUAwANX3wAABIOdXQPAAGwZAWADilAAAGADir0BPwMIAYq/gADABHgGCAGKwIEAwAR4FAkBwANXuopbAAAAAAcGisQTwANX7MADV+zAA1h9AACD+wAAAAEDwANX+cADWH0AAAABAQHAA1gCAAAAg/pdA5hwAVsAAFwBPgI9HMADWBgWwANYCy6FlIq/g/gBAVsBgMADWB/ABHh5AIlXPgJOwANYRwAAADxdA8AAbEoBYAOKUAEWwANYRx4AwABsLwEBXQPAAGwgAWADilABFsADWEcug52KwAA9wABsS0UAAAEcwANYR4EAwAR4sz4AAAAAwABsTQA+Ak7AA1g7AAABheBgA4pQARbAA1hQgQDABHizQMAAbE8+AT0cwANYYYLAA1hYwAR5DISoAQFbAYDAA1hxwAR4eQCKVAaKxRPAA1iCwANYhMADWMAAAIP4AAAAAQPAA1iNwANYwAAAAQAABIP5YAPAAGxWAVsBAQHAA1ihAAAAg/pdA5f7AV8DAAAAAF8DAAABSsADWKcBHMADWKmAwANYp8AEeYGGtAEAAS4AmAUGisYTwANYxMADWMbAA1kMAACEqAAAAAEDwANY2MADWQwAAAEAAASD+WADwABsVgFbAQEBwANY5AAAAIP6XQOYcAFfAwAAAABfAwAAAUrAA1jqARzAA1jsgMADWOrABHnrhrUBAAEuAJiXBorHE8ADWRHAA1kYwANZVAAAgVMAAAABA8ADWSDAA1lUAAAAAAAAAGADwABsGAFKwANZJgEkwANZVAYWwANZLi6FTsAAbS0ngToWwANZPC6FlIq/J4awFsADWUsug52KwCeDowaKyxPAA1lwwANZeMADWfkBAIHXAAAAAQPAA1mBwANZ+QAAAAAAAABgA8AAbB8BPgFKwANZhwE1wANZjgAAAQBgA8AAbB8BFsADWY4uhqyCLorCIxzAA1megMADWY7ABHq9JwEAASsAwABsMhfAA1mOLoasgi4ewANZqIuYAgACFsADWcwWwANZvy6FlIq/gdfAAG0oHsADWdyLnAEAARbAA1nsLoOdisAAAIrCgMADWY7ABHq9AWADwABsHwaKyBPAA1n+wANaDMADWr0DACcAAAABA8ADWg7AA1q9AAAAAQEBwANaFgAAAIHRYAPAAGxWAABgA8AAbFsBSsADWiYBIh7AA1omwABs9wIAAi6AwANaNsAEe2gAASIiJcADWk0AgMADWkfABHtoYAOKvQAcwANafRbAA1pwFMADWmrABHtoAAFgA4q9hZSKvycBAAEWwANagC6FlIq/AIlZAB7AA1qagkICAAIWwANaqxTAA1qlwAR7aAABYAOKvYOdisAWwANatC6DnYrAAAaKyRPAA1rCwANay8ADWzoAAIaUAAAAAQPAA1rSwANbOgAAAAEBAcADWuUAAACBM2ADmxgAAGADiVUBSsADWvcBHMADWw8WwANa/4DAA1r3wAR8OIU1mxqFlgIAAhbAA1sYLoWUir8WwANbLoDAA1smwAR8OIQ+mx8AmssAAAR4UgAEeU0ABHm3AAR6IQAEeoUABHtCAAR8EQAEfI0AAAAHAorOE8ADWz/AA1tFwANfIwOGtgAAAWADilAAAAMEitATwANbdcADW4EJhZQAYAOJVQAEitETwANbmsADW6EJg50AXQPAAGwZAWADilAABIrTE8ADXUbAA11VGIasgi4AYAPAAGwfASsBBYreE8ADW6bAA1umwANb0gAAAAPAA1uxwANb0gAAAAICAsADW7cAAASFlGADiVUAwANbygAABIOdXQPAAGwZAWADilAAAGADis4BPwMIAYrQgADABH09CAGK0YEAwAR9SwkBwANbpopbAAAAAAcGitUTwANb18ADW9fAA1xoAACD+wAAAAEDwANb5MADXGgAAAABAQHAA1vtAAAAg/pdA5hwAVsAAFwBPgI9HMADXAMWwANb9i6FlIrQg/gBAVsBgMADXArABH2wAIlXPgJOwANcMgAAADxdA8AAbEoBYAOKUAEWwANcMh4AwABsLwEBXQPAAGwgAWADilABFsADXDIug52K0QA9wABsS0UAAAEcwANcMoEAwAR96j4AAAAAwABsTQA+Ak7AA1wmAAABheBgA4pQARbAA1w7gQDABH3qQMAAbE8+AT0cwANcTILAA1xDwAR+Q4SoAQFbAYDAA1xcwAR9sACKVAaK1hPAA1xtwANcb8ADXKoAAIP4AAAAAQPAA1x4wANcqgAAAQAABIP5YAPAAGxWAVsBAQHAA1yMAAAAg/pdA5f7AV8DAAAAAF8DAAABSsADXJIBHMADXJSAwANcksAEfriGtwEAAS4AmAYGitcTwANcrsADXLDAA1z1AACEqAAAAAEDwANcwsADXPUAAAEAAASD+WADwABsVgFbAQEBwANczgAAAIP6XQOYcAFfAwAAAABfAwAAAUrAA1zUARzAA1zWgMADXNTABH8ihrgBAAEuAJiYBorYE8ADXPrAA10BwANdPQAAgVMAAAABA8ADXQnAA109AAAAAAAAAGADwABsGAFKwANdDwEkwANdPQYWwANdFy6FTsAAbS0ngToWwANdJS6FlIrQJ4awFsADXTQug52K0SeDowaK3BPAA11ZwANdYcADXeIBAIHXAAAAAQPAA11qwANd4gAAAAAAAABgA8AAbB8BPgFKwANdcAE1wANddwAAAQBgA8AAbB8BFsADXXcuhqyCLorTIxzAA12HgMADXXfABH/0JwEAASsAwABsMhfAA113Loasgi4ewANdkYuYAgACFsADXbUWwANdqC6FlIrQgdfAAG0oHsADXcWLnAEAARbAA13VLoOditEAAIrTgMADXXfABH/0AWADwABsHwaK2RPAA13nwANd9cADXqUDACcAAAABA8ADXffAA16lAAAAAQEBwANd/wAAAIHRYAPAAGxWAABgA8AAbFsBSsADXg8BIh7AA14PwABs9wIAAi6AwANeH8AEgJ8AASIiJcADXjYAgMADXjDABICfYAOKzgAcwANeZRbAA15YFMADXlLABICfAAFgA4rOhZSK0CcBAAEWwANeaC6FlIrQAIlZAB7AA16CgkICAAIWwANekxTAA16NwASAnwABYAOKzoOditEWwANenC6DnYrRAAaK2hPAA16qwANes8ADXyEAAIaUAAAAAQPAA166wANfIQAAAAEBAcADXs0AAACBM2ADmxgAAGADiVUBSsADXt8BHMADXvcWwANe54DAA17fwASBb4U1mxqFmgIAAhbAA17/LoWUitAWwANfFYDAA18NwASBb4Q+mx8AmswAAAR9iQAEfoQABH7uAAR/WAAEf7wABIB5AASBSAAEgcQAAAAHAorfE8ADXybAA18swANmegOGuQAAAWADilAAAAQEiuETwANfYsADX3AJhaMAYAOCfgAEiuITwANficADX5YJg3MAXQPAAGwZAWADiVUABIrjE8ADX7nAA1/ECYWkAF0DwABsXwJgA4J+YAOKUAAEiuUTwANkB8ADZBYYhqyCLgBgA8AAbB8BKwEFivETwANfycADX8nAA2AUAAAAA8ADX9nAA2AUAAAAAwMDwANf3wAABIWjYAOCfgDAA1/0AAAEg3NdA8AAbBkBYAOJVQDAA2AIAAAEhaRdA8AAbF8CYAOCfmADilAAAGADit8BPwQIAYrhgADABIKUCAGK4oEAwASCoggBiuOCAMAEgrcJAcADX8mKWwAAAAAIBornE8ADYBnAA2AjwANgRgEAgtMAAAABA8ADYC3AA2BGAAAAAAAAAGADgzIBSsADYDABFsADYD8WwANgMC6Fo4rhhB6ChgaK6hPAA2BLwANgS8ADYYcAAIP7AAAAAQPAA2BYwANhhwAAAAEBAcADYGEAAACD+l0DmHABWwAAXAE+BD0cwANggRbAA2B5FsADYGouhaOK4YQegoaEqAEBWwGAwANgkcAEg3AAg3c9HsADYJmCMwIAAhbAA2CjLoNziuKAwANgssAEg3AAPgJOwANg6AAAADxdA8AAbEoBYAOCfgEWwANg6B4AwABsLwEBXQPAAGwgAWADgn4BFsADYOgWwANg3C6FpIrjgJ/AAGxlAD3AAGxLRQAAARzAA2DogQDABIPSPgAAAADAAGxNAD4CTsADYM8AAAGEDGADgn4BFsADYO6BAMAEg9JAwABsTz4BPRzAA2EIFsADYQCCwANg9sAEhDaEIoKIhKgBAAGAwANhGMAEg3AAg/s+Ak7AA2FSAAAAPF0DwABsSgFgA4pQARbAA2FSHgDAAGwvAQFdA8AAbCABYAOKUAEWwANhUhbAA2FGLoWkiuOBpsAAbKUAPcAAbEtFAAABHMADYVKBAMAEhII+AAAAAMAAbE0APgJOwANhOgAAAYXgYAOKUAEWwANhWoEAwASEgkDAAGxPPgE9HMADYWuCwANhYsAEhOaEqAEBWwGAwANhe8AEg3AAilQGiusTwANhjMADYY7AA2HOAACD+AAAAAEDwANhl8ADYc4AAAEAAASD+WADwABsVgFbAQEBwANhqwAAAIP6XQOX+wFfAwAAAABfAwAAAUrAA2GxARzAA2GzgMADYbHABIVbhroBAAEuAJgHBorsE8ADYdLAA2HUwANiHgAAhKgAAAABA8ADYebAA2IeAAABAAAEg/lgA8AAbFYBWwEBAcADYfIAAACD+l0DmHABXwMAAAAAXwMAAAFKwANh+AEcwANh+oDAA2H4wASFxYa7AQABLgCYmQaK7RPAA2IjwANiKsADY/4AAIFTAAAAAQPAA2IywANj/gAAAAAAAABgA8AAbBgBPgdOwANiQcADYkQAAYOcYAPAAG0GAR/AA2JKwABtDAAAAAA9HMADYmGAwANiXsAEhi1FAQABJMADYoIBFsADYnkWwANiai6Fo4rhhB6ChgDAAG0uScADYokhFsADYrQWwANipRbAA2KdFsADYo4uhaOK4YQegoaDY4NCgVbAAGzzPgM9HMADYsiAwANixcAEhi1FAQABJ4E6AMAAbS49HMADYt2AwANi2sAEhi1FAQABHMADYxAcwANi8RbAA2LjLoNziuKCoQEBYAPAAGwYATTAA2L1A8ADYvXAA2MOAAAAAQEBwANi9gAAAIGXYAOJVQAAYAPAAGwYAUrAA2L/ARzAA2MEgcADYv/ABIcOgVMAAAAAgk4AwABs64a8AQABJ4avAMAAbS8AwABtLj0cwANjJoDAA2MjwASGLUUBAAEngTsAwABtLj89HMADYz+AwANjPMAEhi1FAQABJ4a9AMAAbS49HMADY1wWwANjUC6FpIrjgbEBAAE0wANjZAPAA2NkwANjzAAAAAICAsADY28AAACFqGADgn4AwANjggAAAIXgYAOKUAAAYAHAAGxcAT4BPRzAA2OXgMADY5TABIYtRQEAASTAA2PEBBbAA2OxFsADY6mBwANjoMAEh7eEIoKIgYiDsCeGsoLAA2O5wASHxSeGrwDAAG0uAMAAbLA9HMADY9aAwANj08AEhi1FAQABJ4a+AMAAbS5KwANj5gEcwANj8IDAA2PtwASGLYFTAAAAAMAAbRAGiugTwANkGsADZCLAA2TfAQCB1wAAAAEDwANkK8ADZN8AAAAAAAAAYAPAAGwfAT4BSsADZDEBNcADZDgAAAEAYAPAAGwfARbAA2Q4Loasgi6K5SMcwANkSIDAA2Q4wASImycBAAErAMAAbDIXwANkOC6GrIIuHsADZFKLmgMAAxbAA2R5FsADZGouhaOK4YHXwABtKB7AA2SLgj4BAAEWwANkmC6Dc4riAB7AA2S2i54BAAEWwANkzi6FpIrjAACK5YDAA2Q4wASImwFgA8AAbB8Giu4TwANk5MADZPLAA2X+AwAnAAAAAQPAA2T0wANl/gAAAAEBAcADZPwAAACB0WADwABsVgAAYAPAAGxbAT4BSsADZQkBIh7AA2UQwABs9wIAAi6AwANlIMAEiVsAASIiIiXAA2U5AIDAA2UzwASJW2ADit8AHMADZXEWwANlYhTAA2VcwASJWwABYAOK34WjiuEnAQABFsADZXQuhaOK4QDAAGxeAB7AA2WSgkICAAIWwANloxTAA2WdwASJWwABYAOK34NziuIWwANlsi6Dc4riAAAewANl0IJDAgACFsADZeAUwANl2sAEiVsAAWADit+FpIrjFsADZe0uhaSK4wAGiu8TwANmA8ADZgzAA2Z4AACGlAAAAAEDwANmE8ADZngAAAABAQHAA2YmAAAAgTNgA5sYAABgA4lVAUrAA2Y4AR/AA2Y8ibwDAAMWwANmSi6C04rnFsADZl2AwANmVcAEil6EPpsfFsADZmoug3OK4gAAAASDAwAEg0kABIUnAASFkQAEhfsABIhjAASJNQAEijcABIqpAAAACAKK8hPAA2Z9wANmg8ADazYDhr8AAAFgA4pQAAACBIr0E8ADZsvAA2baCYbAAGADiwEABIr1E8ADZvPAA2b4CYPLAF0DwABsGQFgA4lVAAEFiwATwANm/cADZv3AA2c7AAAAA8ADZxnAA2c7AAAAAgICwANnHwAABIbAYAOLAQDAA2c1AAAEg8tdA8AAbBkBYAOJVQAAYAOK8gE/AwgBivSAAMAEi0MIAYr1gQDABItRCQHAA2b9ilsAAAAABwaK9xPAA2dAwANnQMADZ54AAIP7AAAAAQPAA2dNwANnngAAAAEBAcADZ1YAAACD+l0DmHABWwAAXAE+Aj0cwANnbxbAA2dfLobAivSEqAEBWwGAwANnf8AEi7YAiwo9HsADZ4eCMwIAAhbAA2eRLoPLivWAwANnmMAEi7YABor4E8ADZ6PAA2elwANn9wAAg/gAAAABA8ADZ67AA2f3AAABAAAEg/lgA8AAbFYBWwEBAcADZ8IAAACD+l0Dl/sBXwMAAAAAXwMAAAFKwANnzgEcwANn0IDAA2fOwASMQIbBAQABLgCYCAaK+RPAA2f7wANn/cADaFkAAISoAAAAAQPAA2gPwANoWQAAAQAABIP5YAPAAGxWAVsBAQHAA2gbAAAAg/pdA5hwAV8DAAAAAF8DAAABSsADaCcBHMADaCmAwANoJ8AEjKqGwgEAAS4AmJoGivoTwANoXsADaGXAA2jEAACBUwAAAAEDwANobcADaMQAAAAAAAAAYAPAAGwYAT4BSsADaHYBJMADaMAGFsADaIAuhU7AAG0tJ4bDFsADaJ8WwANojy6GwIr0g7yLBSeBOhzAA2iyFsADaKwug8uK9Ya8AQABJ4avAMAAbS8nhsQGiv4TwANoycADaNHAA2kvAQCB1wAAAAEDwANo2sADaS8AAAAAAAAAYAPAAGwfAUrAA2jdAR7AA2jji5gCAAIWwANpCBbAA2j4LobAivSB14sGHsADaRiLnAEAARbAA2koLoPLivUAAAaK+xPAA2k0wANpQsADaecDACcAAAABA8ADaUTAA2nnAAAAAQEBwANpTAAAAIHRYAPAAGxWAABgA8AAbFsBPgFKwANpWQEiIiXAA2lmAIDAA2lgwASN72ADivIAHMADaacWwANplxTAA2mRwASN7wABYAOK8obAivQnAQABFsADaaouhsCK9ACLDAAewANpxYJCAgACFsADadYUwANp0MAEje8AAWADivKDy4r1FsADad0ug8uK9QAGivwTwANp7MADafXAA2s0AACGlAAAAAEDwANp/MADazQAAAABAQHAA2oPAAAAgTNgA5sYAABgA4lVAT4ETsADajHAA2o2AAGBl2ADib4BHMADakgWwANqOC6GwIr0hpQBAAGAwANqUMAEjqgAiw1OwANqZMADamwAAYbFXQPAAGxfAmADiiZgA4lVATLAA2qHYAOKJmADiVUAPgJOwANqrAAAADxdA8AAbEoBYAOKJgEWwANqrB4AwABsLwEBXQPAAGwgAWADiiYBFsADaqyBwANqp8AEjr+DY4nAAD3AAGxLRQAAARzAA2qsgwDABI8ePgAAAADAAGxNAD4CTsADapoAAAGFOGADiiYBFsADaryDAMAEjx5AwABsTz4BPRzAA2rLgsADasTABI7xgJwCAAKEwANqzMAEj38cwANq3hbAA2rZLoPLivUpAQABFsADaueCwANq38AEjvGA4MAAbP0AwABsuADAAGxjSsADavoBHsADawGWJAIAAhbAA2sRgcADawzABI6/hX+JzILAA2sowASO8QAAAASLjwAEjAwABIx2AASM4AAEjWEABI3JAASOgQAEkBkAAAAHAosBE8ADaznAA2s/wANu7wOGxgAAAWADilAAAAEEiwMTwANrdMADa4YJhscAYAOCfgACBYsPE8ADa4vAA2uLwANsBQAAAAPAA2uawANsBQAAAAEBAcADa6UAAACDvGADhEsAAGADiwEBPgFAFsADa/iAwANr7sAEkJODvYRgwANr7sADbAAAAggAiwMWwANr14DAA2vNwASQk4QMgmoJAcADa4uKWwAAAAAFixATwANsCsADbArAA2w+AIRdAAPAA2wlwANsPgAAAAEBAcADbCsAAASGx2ADgn4AAGADiwEBPwIIAYsDgADABJELCQHAA2wKilsAAAAACAaLBRPAA2xDwANsUcADbH0BAIO8AAAAAQPAA2xbwANsfQAAAAAAAABgA4RLAUrAA2xeATXAA2xeAAABAGADgn4BFsADbF4uhseLAyMcwANsXoDAA2xewASRbCcBAAErAMAAbF4rFsADbHKAwANsXsAEkWyEJoKKAWADhEsGiwgTwANsgsADbILAA2zWAACD+wAAAAEDwANsj8ADbNYAAAABAQHAA2yYAAAAg/pdA5hwAVsAAFwBPgE9HMADbMAWwANstBbAA2yhLobHiwOEJoKKhKgBAAGAwANs0MAEkdsAhIkGiwkTwANs28ADbN3AA20cAACD+AAAAAEDwANs5sADbRwAAAEAAASD+WADwABsVgFbAQEBwANs+gAAAIP6XQOX+wFfAwAAAABfAwAAAUrAA20AARzAA20CgMADbQDABJJOhsgBAAEuAJgJBosKE8ADbSDAA20iwANtawAAhKgAAAABA8ADbTTAA21rAAABAAAEg/lgA8AAbFYBWwEBAcADbUAAAACD+l0DmHABXwMAAAAAXwMAAAFKwANtRgEcwANtSIDAA21GwASSuIbJAQABLgCYmwaLCxPAA21wwANtd8ADbbEAAIFTAAAAAQPAA21/wANtsQAAAAAAAABgA8AAbBgBPgFKwANtiAEkwANtrQQWwANtki6FTsAAbS0nhsMWwANtoS6DvIsFJ4OjBosGE8ADbbbAA22+wANt5QEAgdcAAAABA8ADbcfAA23lAAAAAAAAAGADwABsHwFKwANtygEWwANt3RbAA23KLobHiwOB18AAbSgGiwwTwANt6sADbfjAA25sAwAnAAAAAQPAA236wANubAAAAAEBAcADbgIAAACB0WADwABsVgAAYAPAAGxbAT4BSsADbg8BIiXAA24cAIDAA24WwASTt2ADiwEAHMADblMWwANuQBTAA246wASTtwABYAOLAYbHiwMnAQABFsADblYuhseLAwDAAGxeBosNE8ADbnHAA25+wANu7QAAhpQAAAABA8ADboXAA27tAAAAAQEBwANumAAAAIEzYAObGAAAYAOJvgE+AUrAA26nARzAA27BFsADbrgWwANuri6DvIsFhMeEUIUEAQABFsADbt2AwANu1cAElEOEPpsfAIUBAAAEkTgABJG0AASSGgAEkoQABJLuAASTRwAEk5EABJQcAASUkQAAAAgCixETwANu8sADbvjAA3FuA4bKAAABYAOKUAAAAQSLExPAA28wwANvNAmBlwBgA4lVAAEFix4TwANvOcADbznAA29XAAAAA8ADb0zAA29XAAAAAQEBwANvUgAABIGXYAOJVQAAYAOLEQE/AggBixOAAMAElQ8JAcADbzmKWwAAAAAHBosVE8ADb1zAA29cwANvjQAAg/sAAAABA8ADb2nAA2+NAAAAAQEBwANvcgAAAIP6XQOYcAFbAABcAT4BPRzAA2+AFsADb3sugZeLE4P4AQFbAYDAA2+HwASVYwCJVwaLFhPAA2+SwANvlMADb9cAAIP4AAAAAQPAA2+dwANv1wAAAQAABIP5YAPAAGxWAVsBAQHAA2+xAAAAg/pdA5f7AV8DAAAAAF8DAAABSsADb7cBHMADb7mAwANvt8AElc6GywEAAS4AmAoGixcTwANv28ADb93AA3AwAACEqAAAAAEDwANv78ADcDAAAAEAAASD+WADwABsVgFbAQEBwANv+wAAAIP6XQOYcAFfAwAAAABfAwAAAUrAA3AHARzAA3AJgMADcAfABJY4hswBAAEuAJicBosYE8ADcDXAA3A8wANwYwAAgVMAAAABA8ADcETAA3BjAAAAAAAAAGADwABsGAFKwANwSgEkwANwYwQWwANwTS6FTsAAbS0nhsMWwANwXC6Bl4sTJ4OjBoscE8ADcGjAA3BwwANwiQEAgdcAAAABA8ADcHnAA3CJAAAAAAAAAGADwABsHwFKwANwfAEWwANwgRbAA3B8LoGXixOB18AAbSgGixkTwANwjsADcJzAA3DwAwAnAAAAAQPAA3CewANw8AAAAAEBAcADcKYAAACB0WADwABsVgAAYAPAAGxbAT4BSsADcLMBIiXAA3DAAIDAA3C6wASXNWADixEAHMADcOUWwANw4BTAA3DawASXNQABYAOLEYGXixMnAQABFsADcOgugZeLEwCJWQaLGhPAA3D1wANw/sADcWwAAIaUAAAAAQPAA3EFwANxbAAAAAEBAcADcRgAAACBM2ADmxgAAGADiVUBSsADcSoBHMADcUwWwANxQhbAA3EygMADcSrABJe/hTWbGoCQmryFTwEAARbAA3FggMADcVjABJe/hD6bHwCOVAAABJU8AASVmgAElgQABJZuAASWxQAElw8ABJeYAASYEwAAAAcCix8TwANxccADcXfAA3N8A4bNAAABYAOKUAAAAQSLIRPAA3GxwANxuwmFfgBgA4UaAAEFiykTwANxwMADccDAA3IIAAAAA8ADcdPAA3IIAAAAAQEBwANx2QAABIV+YAOFGgAAYAOLHwE+AT01wANx6wAAAQBgA4UaARbAA3HrLoV+iyEjHMADceuBwANx68AEmKUnAQABKwDAAGxeKxfAA3H3gcADcevABJilhAArglgBYAHAAGxcAggBiyGAAMAEmI0JAcADccCKWwAAAAAFBosjE8ADcg3AA3INwANyRAAAg/sAAAABA8ADchrAA3JEAAAAAQEBwANyIwAAAIP6XQOYcAFbAABcAT4BPRzAA3I3FsADciwuhX6LIYP4AQFbAYDAA3I+wASZLwCFHgaLJBPAA3JJwANyS8ADco4AAIP4AAAAAQPAA3JUwANyjgAAAQAABIP5YAPAAGxWAVsBAQHAA3JoAAAAg/pdA5f7AV8DAAAAAF8DAAABSsADcm4BHMADcnCAwANybsAEmZqGzgEAAS4AmAsGiyUTwANyksADcpTAA3LnAACEqAAAAAEDwANypsADcucAAAEAAASD+WADwABsVgFbAQEBwANysgAAAIP6XQOYcAFfAwAAAABfAwAAAUrAA3K+ARzAA3LAgMADcr7ABJoEhs8BAAEuAJidBosmE8ADcuzAA3L1wANzQgAAhpQAAAABA8ADcvzAA3NCAAAAAQEBwANzDwAAAIEzYAObGAAAYAOJVQFKwANzIQEcwANzLBbAA3MhLoV+iyGFMwEAAYDAA3M6wASaYQCFHAaLJxPAA3NHwANzXsADc3oAAIaVAWrAA3NIYAPAAGxWgLUAAAEDwANzasADc3oAAAAAAAAAYAOFGgFKwANzcAEWwANzcC6FfoshAAAEmQgABJlmAASZ0AAEmjoABJqbAASa5QAAAAUCiyoTwAN0dcADdHvAA4ZyA3QAAAFgA4JSAAAGBIssE8ADdK7AA3SyCYFKAGADmR8ABIstE8ADdWvAA3V5GIFyAF0DwABsGQFgA8AAbBgBKwSLLhPAA3WSwAN1mwmBFABdA8AAbBkBYAOCkgAEiy8TwAN2e8ADdoYJgREAXQPAAGxfAmADwABsWGADi4UABIswE8ADdxjAA3dQCYbQAF0DwABsXwJgA8AAbBhdA4tNAVsBMsADd05gA8AAbBhdA4tNAVsABIsxE8ADd5vAA3epGIbRAGADgn4BKwEFi0MTwAN3rsADd67AA3jNAAAAA8ADd7fAA3jNAAAAAwAAA8ADd84AAACG0mADmR8BagBgAcAAbFwCwAN37AAAAIEUXQPAAGwZAWADgpIBagBgAcAAbFwCwAN4DgAAAIERXQPAAGxfAmADwABsWGADi4UBagBgAcAAbFwCYAOLKgE+AT0cwAN4ui6G0wAAAACLMwQIAIssNcADeCsAAAEAYAOZHwGAwAN4K8AEnAAjHMADeCuDwAN4K8AEnHUnAQABKwDAAGxeH8ADeDuZQQAAAACDwAN4K8AEnHUBYAOZHwgAiy41wAN4ZQAAAQBdA8AAbBkBYAOCkgGBwAN4ZcAEnBcjHMADeGWDwAN4ZcAEnMInAQABKwDAAGxiMcADeHtgA4KSAIPAA3hlwAScwgFdA8AAbBkBYAOCkggAiy81wAN4lQAAAQBdA8AAbF8CYAPAAGxYYAOLhQGCwAN4lcAEnDUjHMADeJWDwAN4lcAEnRwnAQABKwDAAGxeMsADeLFgA8AAbFhgA4uFAIPAA3iVwASdHAFdA8AAbF8CYAPAAGxYYAOLhQkBwAN3roJnAAAAAA0GizMTwAN40sADeNfAA3qdAACG0wAAAAEDwAN45MADep0AAAAAAAAAXAE+AUnAA3jtIRzAA3j7FsADePEugRSLLicBAAErAMAAbGI+AUXAA3kMAcADeRXAA3kXAACB1GADwABsHwGTARzAA3kegMADeRzABJ3jgToBAAEWwAN5KhbAA3kgLoEUiy6A4MAAbGoAwABshQGIwAN5NMAEneMcwAN5MoDAA3k0wASd44E/AQABlADAAGyIPgROwAN5usADecIAAIEVYAOCkgEcwAN5zRbAA3nELoEUiy4pAQABgMADec7ABJ3jAMAAbLg9F8ADeeKBwAN52sAEnkuEAC6CWE7AA3oHwAN6DAAAgYhgA5kfARbAA3ogFsADehaBwAN6DsAEnkuEDIJqgW2CgEnAA3o3IiEcwAN6QILAA3o7wASekicBAAErAMAAbF4AIRzAA3pXFsADelCCwAN6S8AEnpKEAJkpJwEAARbAA3paLoFKiywAwABsXj4BPRzAA3pxFsADemwugUqLLIbUAQABgsADenzABJ6SAJk2Pz8GizQTwAN6osADeqfAA3svAACBawAAAAEDwAN6vMADey8AAAAAAAAAXAE+AUXAA3rFAcADes7AA3rQAACB1GADwABsHwGTARzAA3rXgMADetXABJ9ggToBAAEWwAN64xbAA3rZLoEUiy6A4MAAbGoAwABshQGIwAN67cAEn2AcwAN664DAA3rtwASfYIE/AQABlADAAGyIPgE9HMADevguhtUBAAEcwAN7IRbAA3sYLoEUiy4pAQABgMADeyLABJ9gAMAAbLgAizYGizUTwAOBVsADgVvAA4G8AACEUAAAAAEDwAOBYcADgbwAAAAAAAAAXAE+AUXAA4FqAcADgXPAA4F1AACB1GADwABsHwGTARzAA4F8gMADgXrABKApgToBAAEWwAOBiBbAA4F+LoEUiy6A4MAAbGoAwABshQGIwAOBksAEoCkcwAOBkIDAA4GSwASgKYE/AQABlADAAGyIPgE9HMADgaocwAOBphbAA4GdLoEUiy4pAQABgMADgafABKApAMAAbLiEUAAAAACCvgaLNhPA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nc0uhwgcwAOd4WrAA53cYAPAAG0zhymHCgIAARbAA53oLoEPi4gBhwspwABtOIuLKwFgA8AAbBhOwAOeNcADnjsAAIMoYAPAAGwfARzAA55CgMADnj3ABLUFRAEAAZQAwABs4UnAA55LHMADnlkcwAOeVYHAA55PwAS2FYE/AQABlADAAGyIJwEAARbAA55nFsADnlwuhweLh4DgwABsagDAAGwyPgFKwAOeiwEcwAOenRbAA56SLocIi4uBPQEAARzAA56xFsADnqcuhweLhykBAAGBwAOessAEthUAwABsuADAAGyHScADnsYcwAOe0IHAA57KwAS2FYE6AQABFsADnt0WwAOe0i6HB4uHgODAAGxqAMAAbIU+A07AA5+0wAOfvgAAhwxgA8AAbB8BHMADn9YcwAOfyhbAA5/ALocHi4cpAQABHMADn9GBwAOfy8AEthWBPwEAAZQAwABsiADAAGy4RAEAAZQAwABs4UnAA5/hIhzAA5/vgsADn+XABLb4gTsBAAGBwAOf8cAEthUAwABshgAcwAOgFBzAA6AEFsADn/ouhwiLiykBAAEcwAOgD4LAA6AFwAS2+EQBAAGUAMAAbOEAwABtOScBAAEnhw0AwABsNj4BPYrAA6ApwAS2+BzAA6AngsADoCnABLb4RAEAAZQAwABs4T9KwAOgWwEcwAOgbRbAA6BiLocIi4uBPQIAAhzAA6CBFsADoHcuhweLhykBAAGBwAOggsAEthUAwABsuILAA6CKwAS2+ADAAGyHPz0wwAOg8CeHDgaLjhPAA6FYwAOhYcADpDsAAIbaAAAAAQPAA6FswAOkOwAAAAICAsADoXEAAACBemADwABsWADAA6F7AAAAhApgA8AAbB8AAGADi0QBPgpJwAOhiSIcwAOhmBbAA6GNLocHi4cnAQABKwDAAGxiARbAA6GuFsADoaMuhweLh4FWwABs8z4BSsADob8BH8ADocqLTAMAA4DAA6HTwAS4U2rAA6HiYAPAAGwfhRlqwAOh9WADwABsH4UZAD89HsADohXAAG0yBAAEgcADoirABLhjkxbAA6JAFsADojUuhweLh4cPwABtOieECgBOwAOiWcADol0AAIMTYAPAAGwfAZNOwAOiYsADomcAAIMUYAPAAGwfARzAA6J7FsADonQWwAOiaS6HB4uHgODAAGxqRAEAAZQAwABs4UPAA6KEHMADoo+CwAOii8AEuRiBOgEAAYPAA6KRwAS5LQDAAGyFPgNOwAOio8ADoqcAAIMVYAPAAGwfARzAA6Kug8ADoqnABLktRAEAARzAA6K+HMADoreDwAOissAEuS1EAQABgsADornABLkYAMAAbOGCSwEAAZQAwABs4gDAAGzhTsADouvAA6LxAACDFmADwABsHwEcwAOi/RbAA6LzLocHi4cpAQABhMADov7ABLmNAMAAbLhJwAOjChzAA6MUhcADow7ABLnogwABAAGBwAOjF8AEuGMAwABs9j4BPYrAA6MpwAS5GITAA6MvwAS5jT4BPYvAA6NLwAS5LRzAA6NWhMADo1LABLmNRAEAAZQAwABs4U7AA6NxwAOjewAAhxBgA8AAbB8BgsADo33ABLkYTsADo4rAA6OUAACHEWADwABsHwEcwAOjoBbAA6OWLocHi4cpAQABhMADo6HABLp8AMAAbLhOwAOjtcADo8AAAIcSYAPAAGwfARzAA6PElIE/AQABhMADo8bABLp8AMAAbIhOwAOj2cADo+YAAIcTYAPAAGwfARzAA6PzHMADo+qUgT8BAAGBwAOj7MAEuGMAwABsiEQBAAGFwAOj9cAEupkAwABs4UrAA6QEAR/AA6QPi0wDAAOAwAOkGMAEuFOGwAOkHsAEus6HwAOkKsAEuvsAAAAEtN4ABLgsAAS7agAAAAICi5ETwAOsqcADrK/AA7XMA4cUAAABYAPAAGxWAAACBIuTE8ADrMrAA6zoBocVAGADwABsHwFqwAOs4WADwABsH4c1BIuUE8ADrP7AA60ZBocXAGADwABsWwFqwAOtFWADwABsWx4BBYuiAAAAAAQAAAMAAAAAAAAAAABgA4uRAT8BCQEAwABsWgAAAAAKBouWE8ADrUPAA61OwAOu5wABhoEAAAABA8ADrVXAA67nAAAAAgICwAOtWgAAAIE+YAPAAGwfAMADrWUAAACB2GADwABsHwAAYAPAAGwfAT4CScADrXFqwAOtdWADwABsWx4+BT2IwAOticAEvDAcwAOtj4DAA62JwAS8MIHvAQABasADrZJgA8AAbB+HNQDAAGzTPYjAA62bwAS8MBzAA62hgMADrZvABLwwgdYBAAEewAOtpIugAgACgMADrarABLwwNy8AAMAAbLk9iMADrbzABLwwHMADrcKAwAOtvMAEvDCB7wEAAWrAA63FYAPAAGwfhzUAwABs0z2JwAOtzsAEvEAcwAOt04HAA63OwAS8QIHWAQABgMADrdbABLwwAMAAbLk9icADrePABLxAHMADreiBwAOt48AEvECB7wEAAWrAA63rYAPAAGwfhzUAwABs0z4DPYnAA65JwAS8QBzAA65bN9////+B+gEAARzAA65jgcADrl7ABLxAgT8BAAGAwAOuZcAEvDAAwABsiADAAGzePYnAA65zwAS8QBzAA66FN9////+B+gEAARzAA66NgcADrojABLxAgT8BAAEcwAOupBzAA66cN8AH//+B+gEAAYHAA66ewAS8QADAAGzegkwBAAE3CgDAAGzjAMAAbIgAwABs3j2JwAOus8AEvEAcwAOuv4HAA666wAS8QIHWAQABHMADrseBwAOuwsAEvECCSwEAATcGAMAAbOIAwABsuUrAA67YAYHAA67fwAS8QAaLlxPAA68UwAOvH8ADsKYAAYcYAAAAAQPAA68lwAOwpgAAAAEBAcADryoAAACB2GADwABsHwAAYAPAAGwfAT4CScADrzZqwAOvOmADwABsWx4+Az2IwAOvTsAEvnQcwAOvU4DAA69OwAS+dIHWAQABHsADr1aLoAIAAoDAA69cwAS+dDcsAADAAGy5PYjAA69twAS+dBzAA69ygMADr23ABL50ge8BAAFqwAOvdWADwABsH4c1AMAAbNM9iMADr37ABL50HMADr4OAwAOvfsAEvnSB1gEAAR7AA6+Gi6ACAAKAwAOvjMAEvnQ3KQAAwABsuT4DPYjAA6/ywAS+dBzAA7AEN9////+B+gEAARzAA7AMgMADsAfABL50gT8BAAEcwAOwIxzAA7AbN8P///+B+gEAAYDAA7AdwAS+dADAAGzegkwBAAGWAMAAbOMAwABsiADAAGzePYjAA7AxwAS+dBzAA7A9gMADsDjABL50gdYBAAEcwAOwRYDAA7BAwAS+dIJLAQABNwsAwABs4gDAAGy5PYjAA7BTwAS+dBzAA7BlN9////+B+gEAARzAA7BtgMADsGjABL50gT8BAAEcwAOwhBzAA7B8N7//gfoBAAGAwAOwfsAEvnQAwABs3oJMAQABNw8AwABs4wDAAGyIAMAAbN5KwAOwlwGAwAOwnsAEvnQGi5gTwAOwq8ADsLbAA7EGAAGHGQAA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AIvRBovRFMAARtHAAEbWwABKQgAAh7iLowAAAAEDwABG7MAASkIAAAACAgLAAEbyAAAAhA1gA4JKAMAARvwAAACHv2ADwABsHwAAXAE+AT4CTsAARzUAAAA8XQPAAGxKAWADjRsBFsAARzUeAMAAbC8BAV0DwABsIAFgA40bARbAAEc1LodVi6OLswA9wABsS0UAAAEcwABHNYIAwAUcIj4AAAAAwABsTQA+Ak7AAEcnAAAAh8BgA40bARbAAEdLggDABRwiQMAAbE9BPgpOwABHWcAAR2QAAYbcXQOLTQFgA8AAbFYBFsAAR3GDwABHZsAFHH2G3I0dTsAAR4nAAEePAAGBPmADwABsVgEcwABHoxbAAEechMAAR5HABRyfhsWLUCkBAAGAwABHpMAFG/wAwABsYUnAAEexHMAAR7uFwABHtcAFHMonAQABKwDAAGxePgFCwABHzgA/ScAAR+chHsAAR/+LVAEAASbAAEgLAYDAAEgLwAUb/GADglIAPgE9MMAASBwfwABIJsAAbKABAAEkwABIeQMnh8EWwABIV4DAAEhSwAUb/IVOwABtLSeHwgA/ScAASIshHsAASJDAAGz3AgACFsAASJouh1qLo4u4FsAASKEuh1aLo4u0AD4BPTDAAEi3H8AASMHAAGygAQABJMAASM4IJ4fDJ4fEFsAASTOEwABJKMAFHJ+G3YtPJ4fFFsAASUaAwABJQcAFG/yFTsAAbS0ngXeAwABJVMAFG/wng6MAPz0XwABJbC6HWoujFsAASXQuh1eLo4u1i7g9HMAASaQWwABJlIPAAEmJwAUcfYfGjR42AQABgcAASajABRwKAMAAbEc9HMAASdYWwABJxoPAAEm7wAUcfYfGjR42AQABHMAASdouhuUAAAAAi9oAwABsRz0cwABJ/4TAAEn0wAUcn4bhAwADhcAASg3ABRzKgMAAShTABRv8LgCLUj0XwABKJy6HWoujFsAASi8uh1aLo4u0i7gGjAQUwABKR8AASljAAEvgAACG8wFqwABKSGADwABsVoC1AAABA8AASmLAAEvgAAAAAwAAA8AASn8AAACDY10DwABsGQFgA4omAWoAYAHAAGxcAsAASpoAAACG9GADwABsWwFqwABKp2ADwABsWxzAAEq5AAAAhvVgA8AAbFsBasAASshgA8AAbFscXAE+A0nAAErWIRzAAErpgMAAStrABR71JwEAASsAwABsYj4BPRzAAEsQFsAASvouh02Lo4ush8cBAAGAwABLFsAFHvUAjO8/ScAASzGBwABLNcAFHxM+AT0XwABLSi6HSoujK4upP0nAAEttgsAAS3HABR8vPgI9IxzAAEuZFsAAS4guh0qLo4upJwEAASsAwABsXhfAAEuILodKi6MfwABLoYzHAAAAAIupKwFgA4y7PRzAAEvLFsAAS7ouh0qLo4uph8gAAAAAjMI/BowFFMAAS+XAAEv2wABNSgAAhvYBasAAS+ZgA8AAbFaAtQAAAQPAAEwAwABNSgAAAAMAAAPAAEwdAAAAg2NdA8AAbBkBYAOKJgFqAGABwABsXALAAEw4AAAAhvRgA8AAbFsBasAATEVgA8AAbFscwABMVwAAAIb1YAPAAGxbAWrAAExmYAPAAGxbHFwBPgNJwABMdILAAEx4wAUghj4BPRzAAEygFsAATI8uh0qLo4uph8kAAAAAjMM/ScAATLaBwABMusAFIGo+AT0XwABMzy6HSoujK4upP0nAAEzyIRzAAE0FgMAATPbABSBMJwEAASsAwABsYj4BPRzAAE0sFsAATRYuh02Lo4ush8oBAAGAwABNMcAFIEwAjPA/BovSFMAATU/AAE1UwABTFQAAh7yLowAAAAEDwABNacAAUxUAAAABAQHAAE10AAAAgI1gA4sqAABcAT4KTsAATjLAAE46AACB6WADwABsHwEcwABOmxzAAE5xHMAATmwcwABOUBzAAE4+LoblAAAAAIvagT8BAAFqwABOUmADwABsH4WeAMAAbIhEAQABlADAAGzhgfoBAAEcwABOf2rAAE6AYAPAAGwfhZ6BWgAAAADAAGyPAMAAbN5EAQABHMAATqUuhuUAAAAAi9oAwABs4UXAAE68AcAATsXAAE7HAACB1GADwABsHwGTARzAAE7OgsAATszABSIKgToBAAGBwABO0MAFIXEAwABshQGKwABO28AFIgocwABO2YLAAE7bwAUiCoE/AQABlADAAGyIPgE9HMAATuYuhuYBAAGTAIvVPRfAAE7/Lodii6McwABPIi6G5QAAAACL2ou7ScAATzocwABPUxbAAE8+LodVi6OLsycBAAErAMAAbGI+Az0XwABPZC6HY4ujHMAAT4cuhuUAAAAAi9qLvD0cwABPoC6G6QEA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wAVnI4urPRzAAKLBLob2AgAAAoNjFsAAouGAwACi3MAFZqGDY4TzhvUpjAUGjCoUwACjDsAAox/AAKPIAACFQgFqwACjD2ADwABsVoC1AAABA8AAozXAAKPIAAAAAQEBwACjSAAAAIQNYAOFIgAAXAE+Az0cwACjVC6G5gEAAWrAAKNiYAPAAGwfh4MAi9U9HMAAo3ouh90BAAEWwACji4DAAKOGwAVpiIQBglkAjBE9HMAAo5wuhu0BAAE1wACjtgAAAQBgA8AAbBgBFsAAo7aAwACjscAFaYiAloUkIxzAAKO2gcAAo7bABWnlJwEAASsAwABsNicAgcAAo7bABWnlAWADwABsGACL3AaMKxTAAKPNwACj3sAApmQAAIVFAWrAAKPOYAPAAGxWgLUAAAEDwACj7sAApmQAAAABAQHAAKP7AAAAhA1gA4UtAABcAT4EPSMcwACkGBbAAKQHLodKi6OLqScBAAErAMAAbF4XwACkBy6HSoujH8AApCCMxwAAAACLqSsBYAOMu07AAKQ7wACkQQAAgyhgA8AAbB8BHMAApFMWwACkQy6HSouji6kpAQABFsAApFmAwACkVMAFamiFFIUvAIzFQCEcwACkdYHAAKRvwAVqticBAAErAMAAbDLAAKRvwACkfAEkwACkowInh/MWwACkmYDAAKSUwAVqaIUUhS9JwACkqiIcwACk0RzAAKS0gcAApK7ABWq2gfoBAAFqwACkumADwABsH4KAAMAAbN4nAQABgcAApNTABWq2AMAAbDIAHMAApPcWwACk6oDAAKTlwAVqaIVEhTAnAQABKwCJWT4DPRzAAKUILobmAQABHMAApS1qwAClFmADwABsH4WngT8BAAGBwAClL8AFarYAwABsiACL1T0cwAClPS6H3QEAARbAAKVOgMAApUnABWpohAGCWQCMET0cwAClYS6G6gEAARbAAKV7FsAApXKAwAClbcAFamiFFIUvhi6I7gCL1z4FPRzAAKWiLobmAQABasAApbBgA8AAbB+ClQCL1T0cwAClxC6H3QEAARbAAKXVgMAApdDABWpohAGCWQCMET0cwACl6C6G6gEAARbAAKYCFsAApfmAwACl9MAFamiFFIUvhi6I7gCL1z0cwACmHC6G6gEAAYHAAKYowAVqtgCL1z0cwACmNi6HqQEAARbAAKZNgMAApkjABWpohUSFMACL+waMLBTAAKZpwACmesAAqOkAAIVHAWrAAKZqYAPAAGxWgLUAAAEDwACmisAAqOkAAAABAQHAAKaXAAAAhA1gA4U5AABcAT4EPSMcwACmtBbAAKajLodKi6OLqScBAAErAMAAbF4XwACmoy6HSoujH8AApryMxwAAAACLqSsBYAOMu07AAKbXwACm3QAAgyhgA8AAbB8BHMAApu8WwACm3y6HSouji6kpAQABFsAApvWAwACm8MAFbOqFFIU7AIzFQCEcwACnEYHAAKcLwAVtOCcBAAErAMAAbDLAAKcLwACnGAEkwACnPwInh/MWwACnNYDAAKcwwAVs6oUUhTtJwACnRhzAAKdtHMAAp1CBwACnSsAFbTiB+gEAAWrAAKdWYAPAAGwfgoAAwABs3icBAAGBwACncMAFbTgAwABsMj4EPRzAAKd/LobmAQABHMAAp6RqwACnjWADwABsH4eGgT8BAAGBwACnpsAFbTgAwABsiACL1T0cwACntC6H3QEAARbAAKfFgMAAp8DABWzqhAGCWQCMET0cwACn2C6G6gEAARbAAKfyFsAAp+mAwACn5MAFbOqFFIU7hi6I7gCL1z0cwACoDC6G8gEAARbAAKgbgMAAqBbABWzqgT6FPACL7j4FPRzAAKg2LobmAQABasAAqERgA8AAbB+CqgCL1T0cwACoWC6H3QEAARbAAKhpgMAAqGTABWzqhAGCWQCMET0cwACofC6G6gEAARbAAKiWFsAAqI2AwACoiMAFbOqFFIU7hi6I7gCL1z0cwACosC6G6gEAAYHAAKi8wAVtOACL1z0cwACoyi6G8gEAARbAAKjZgMAAqNTABWzqgT6FPACL7gaMLRTAAKjuwACo/8AAqd4AAIVQAWrAAKjvYAPAAGxWgLUAAAEDwACpD8AAqd4AAAABAQHAAKkcAAAAhA1gA4VFAABcAT4FPRzAAKkoLobmAQABasAAqTZgA8AAbB+CiQCL1T0cwACpSC6H3QEAARbAAKlZgMAAqVTABW9shAGCWQCMET0cwACpai6G8gEAARbAAKl5gMAAqXTABW9shUmFRwCL7j0cwACpiC6G7wEAARbAAKmXgMAAqZLABW9sgYiFSACMEz0cwACpoi6HigEAARbAAKnBgMAAqbzABW9shUqFSQCMCwaMLhTAAKnjwACp9MAAqu4AAIVSAWrAAKnkYAPAAGxWgLUAAAEDwACqBMAAqu4AAAABAQHAAKoRAAAAhA1gA4VXAABcAT4GPRzAAKodLobmAQABasAAqitgA8AAbB+CngCL1T0cwACqPS6H3QEAARbAAKpOgMAAqknABXBThAGCWQCMET0cwACqXy6G8gEAARbAAKpugMAAqmnABXBThUmFWQCL7j0cwACqfS6G7wEAARbAAKqMgMAAqofABXBTgYiFWgCMEz0cwACqly6G8gEAARbAAKqmgMAAqqHABXBTgT6FWwCL7j0cwACqsi6HigEAARbAAKrRgMAAqszABXBThUqFXACMCwaMLxTAAKrzwACrBMAAq9QAAIVgAWrAAKr0YAPAAGxWgLUAAAEDwACrGcAAq9QAAAABAQHAAKsrAAAAhA1gA4WgAABcAT4EPRzAAKs3LobmAQABasAAq0VgA8AAbB+HigCL1T0cwACrXC6H3QEAARbAAKttgMAAq2jABXFbhAGCWQCMET0cwACrfi6G7wEAARbAAKuNgMAAq4jABXFbgYiFogCMEz0cwACrmC6HigEAARbAAKu3gMAAq7LABXFbhUqFowCMCwaMMBTAAKvZwACr6sAArNUAAIViAWrAAKvaYAPAAGxWgLUAAAEDwACr/8AArNUAAAABAQHAAKwRAAAAhA1gA4WxAABcAT4FPRzAAKwdLobmAQABasAArCtgA8AAbB+HjQCL1T0cwACsQi6H3QEAARbAAKxTgMAArE7ABXIhhAGCWQCMET0cwACsZC6G7wEAARbAAKxzgMAArG7ABXIhgYiFswCMEz0cwACsfi6G8gEAARbAAKyNgMAArIjABXIhgT6FtACL7j0cwACsmS6HigEAARbAAKy4gMAArLPABXIhhUqFtQCMCwaMMRTAAKzawACs68AArbUAAIVUAWrAAKzbYAPAAGxWgLUAAAEDwACtAcAArbUAAAABAQHAAK0UAAAAhA1gA4VqAABcAT4EPRzAAK0gLobmAQABasAArS5gA8AAbB+CpwCL1T0cwACtRi6H3QEAARbAAK1XgMAArVLABXMIhAGCWQCMET0cwACtaC6G8gEAARbAAK13gMAArXLABXMIhUmFbACL7j0cwACthi6H1gEAARbAAK2hgMAArZzABXMIhOSFbQCMDAaMMhTAAK26wACty8AArrAAAIVWAWrAAK27YAPAAGxWgLUAAAEDwACt4cAArrAAAAABAQHAAK30AAAAhA1gA4V7AABcAT4FPRzAAK4ALobmAQABasAArg5gA8AAbB+CmwCL1T0cwACuJi6H3QEAARbAAK43gMAArjLABXPOhAGCWQCMET0cwACuSC6G8gEAARbAAK5XgMAArlLABXPOhUmFfQCL7j0cwACuZi6H1gEAARbAAK6BgMAArnzABXPOhOSFfgCMDD0cwACuly6G8gEAARbAAK6mgMAArqHABXPOgT6FfwCL7gaMMxTAAK61wACuxsAAr1oAAIVkAWrAAK62YAPAAGxWgLUAAAEDwACu1MAAr1oAAAABAQHAAK7fAAAAhA1gA4XDAABcAT4DPRzAAK7rLobmAQABasAArvlgA8AAbB+HkACL1T0cwACvCS6H3QEAARbAAK8agMAArxXABXS1hAGCWQCMET0cwACvKy6H1gEAARbAAK9GgMAAr0HABXS1hOSFxQCMDAaMNBTAAK9fwACvcMAAsB8AAIVmAWrAAK9gYAPAAGxWgLUAAAEDwACvfsAAsB8AAAABAQHAAK+JAAAAhA1gA4XTAABcAT4EPRzAAK+VLobmAQABasAAr6NgA8AAbB+HkwCL1T0cwACvsy6H3QEAARbAAK/EgMAAr7/ABXVahAGCWQCMET0cwACv1S6H1gEAARbAAK/wgMAAr+vABXVahOSF1QCMDD0cwACwBi6G8gEAARbAALAVgMAAsBDABXVagT6F1gCL7gaMNRTAALAkwACwNcAAsUsAAIV0AWrAALAlYAPAAGxWgLUAAAEDwACwSsAAsUsAAAABAQHAALBcAAAAhA1gA4YEAABcAT4GPRzAALBoLobmAQABasAAsHZgA8AAbB+HlgCL1T0cwACwjS6H3QEAARbAALCegMAAsJnABXYghAGCWQCMET0cwACwry6G8gEAARbAALC+gMAAsLnABXYghUmGBgCL7j0cwACwzS6G7wEAARbAALDcgMAAsNfABXYggYiGBwCMEz0cwACw5y6HpwEAARbAALD/gMAAsPrABXYgga2GCACL8D0cwACxDy6HigEAARbAALEugMAAsSnABXYghUqGCQCMCwaMNhTAALFQwACxYcAAsmgAAIV3AWrAALFRYAPAAGxWgLUAAAEDwACxe8AAsmgAAAABAQHAALGSAAAAhA1gA4YXAABcAT4FPRzAALGeLobmAQABasAAsaxgA8AAbB+HmQCL1T0cwACxyC6H3QEAARbAALHZgMAAsdTABXcohAGCWQCMET0cwACx6i6G7wEAARbAALH5gMAAsfTABXcogYiGGQCMEz0cwACyBC6HpwEAARbAALIcgMAAshfABXcoga2GGgCL8D0cwACyLC6HigEAARbAALJLgMAAskbABXcohUqGGwCMCwaMNxTAALJtwACyfsAAs38AAIVYAWrAALJuYAPAAGxWgLUAAAEDwACymcAAs38AAAABAQHAALKxAAAAhA1gA4WNAABcAT4FPRzAALK9LobmAQABasAAsstgA8AAbB+ChgCL1T0cwACy6C6H3QEAARbAALL5gMAAsvTABXgPhAGCWQCMET0cwACzCi6G8gEAARbAALMZgMAAsxTABXgPhUmFjwCL7j0cwACzKC6H1gEAARbAALNDgMAAsz7ABXgPhOSFkACMDD0cwACzWS6HpwEAARbAALNxgMAAs2zABXgPga2FkQCL8AaMOBTAALOEwACzlcAAtJEAAIV5AWrAALOFYAPAAGxWgLUAAAEDwACzqsAAtJEAAAABAQHAALO8AAAAhA1gA4YpAABcAT4EPRzAALPILobmAQABIxbAALPXgMAAs9LABXj2hMGGLWrAALPlYAPAAGwfh5xqwAC0AWADwABsH4efAWADwABsHwCL1T0cwAC0GC6H3QEAARbAALQpgMAAtCTABXj2hAGCWQCMET0cwAC0Oi6H1gEAARbAALRVgMAAtFDABXj2hOSGKwCMDD0cwAC0ay6HpwEAARbAALSDgMAAtH7ABXj2ga2GLACL8AaMORTAALSWwAC0p8AAtccAAIV7AWrAALSXYAPAAGxWgLUAAAEDwAC0wcAAtccAAAABAQHAALTYAAAAhA1gA4Y8AABcAT4EPRzAALTkLobmAQABIxbAALTzgMAAtO7ABXnjhMGGQGrAALUJYAPAAGwfhaFqwAC1MmADwABsH4eiAWADwABsHwCL1T0cwAC1Ti6H3QEAARbAALVfgMAAtVrABXnjhAGCWQCMET0cwAC1cC6H1gEAARbAALWLgMAAtYbABXnjhOSGPgCMDD0cwAC1oS6HpwEAARbAALW5gMAAtbTABXnjga2GPwCL8AaMOhTAALXMwAC13cAAtp8AAIVrAWrAALXNYAPAAGxW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jGUUwADV2cAA1erAANbXAACF+wFqwADV2mADwABsVoC1AAABA8AA1f7AANbXAAAAAQEBwADWDwAAAIQNYAOIJgAAXAE+BT0cwADWGy6G5gEAAWrAANYpYAPAAGwfhaQAi9U9HMAA1j8uhvIBAAEWwADWToDAANZJwAWak4WKiCgAi+49HMAA1l4uh90BAAEWwADWb4DAANZqwAWak4X5iCoAjBE9HMAA1oouh90BAAEWwADWm4DAANaWwAWak4X6iCsAjBE9HMAA1rQuh6kBAAEWwADWy4DAANbGwAWak4CWiCkAi/sGjGYUwADW3MAA1u3AANfnAACF/QFqwADW3WADwABsVoC1AAABA8AA1wLAANfnAAAAAQEBwADXFAAAAIQNYAOIMwAAXAE+BUnAANcgHMAA1zIWwADXJC6HS4uji6onAQABKwDAAGxePgE9F8AA10Muh0uLox/AANdXjNEAAAAAi6o/PRzAANd/FsAA13Euh0uLo4uqh8cBAAGAwADXhcAFm3oAjM09HMAA15AuhuYBAAFqwADXnmADwABsH4gkAIvVPRzAANe1LobyAQABFsAA18SAwADXv8AFm3qE+Ig1AIvuPRzAANfdFsAA188uh0uLo4uqh8oAAAAAjM4GjGcUwADX7MAA1/3AANjEAACF4QFqwADX7WADwABsVoC1AAABA8AA2BTAANjEAAAAAQEBwADYKAAAAIQNYAOHvgAAXAE+BD0cwADYNC6G5gEAAWrAANhCYAPAAGwfiCcAi9U9HMAA2Fsuh90BAAEWwADYbIDAANhnwAWcdoQBglkAjBE9HMAA2H0uhvABAAEWwADYkIDAANiLwAWcdoGXh8EAi+E9HMAA2JsuhvEBAAEWwADYt4DAANiywAWcdoXgh8AAi94GjGgUwADYycAA2NrAANl5AACF/wFqwADYymADwABsVoC1AAABA8AA2O3AANl5AAAAAQEBwADY/QAAAIQNYAOIPQAAXAE+Az0cwADZCS6G5gEAAWrAANkXYAPAAGwfiCoAi9U9HMAA2Swuh90BAAEWwADZPYDAANk4wAWdPIQBglkAjBE9HMAA2U4uhuoBAAEcwADZZxbAANlaLodLi6OLqikBAAEWwADZbYDAANlowAWdPIC+iD8AjM8Ai9cGjGkUwADZfsAA2Y/AANo6AACGAQFqwADZf2ADwABs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A8ABD5HAAQ/pAAAAAQEBwAEPngAAAIQNYAOKzgAAXAE+AT0wwAEPqh/AAQ+0wABtWAEAASeIJgAGjKMUwAEP7sABD//AARB6AACGuAFqwAEP72ADwABsVoC1AAABA8ABEBjAARB6AAAAAQEBwAEQJQAAAIQNYAOKzgAAXAE+AT0wwAEQMR/AARA7wABtWAEAASeIJwAGjKQUwAEQf8ABEJDAARD4AACGrQFqwAEQgGADwABsVoC1AAABA8ABEKDAARD4AAAAAQEBwAEQrQAAAIQNYAOKoAAAXAE+AT0wwAEQuR/AARDDwABtWAEAASeIKAAGjKUUwAEQ/cABEQ7AARGJAACGrgFqwAEQ/mADwABsVoC1AAABA8ABESfAARGJAAAAAQEBwAERNAAAAIQNYAOKoAAAXAE+AT0wwAERQB/AARFKwABtWAEAASeIKQAGjKYUwAERjsABEZ/AARHyAACGPAFqwAERj2ADwABsVoC1AAABA8ABEajAARHyAAAAAQEBwAERrgAAAIQNYAOJHwAAXAE+AT0wwAERuh/AARHEwABtWAEAASeIKgAGjKcUwAER98ABEgjAARJzAACGmAFqwAER+GADwABsVoC1AAABA8ABEhnAARJzAAAAAQEBwAESJwAAAIQNYAOKZgAAXAE+AT0wwAESMx/AARI9wABtWAEAASeIKwAGjKgUwAESeMABEonAARMHAACGmQFqwAESeWADwABsVoC1AAABA8ABEqPAARMHAAAAAQEBwAESsQAAAIQNYAOKZgAAXAE+AT0wwAESvR/AARLHwABtWAEAASeILAAGjKkUwAETDMABEx3AAROSAACFAgFqwAETDWADwABsVoC1AAABA8ABEzTAAROSAAAAAQEBwAETPwAAAIQNYAOESwAAXAE+AT0wwAETSx/AARNVwABtWAEAASeILQAGjKoUwAETl8ABE6jAARQKAACG2QFqwAETmGADwABsVoC1AAABA8ABE7bAARQKAAAAAQEBwAETwQAAAIQNYAOLKgAAXAE+AT0wwAETzR/AARPXwABtWAEAASeILgAGjKsUwAEUD8ABFCDAARThAACE6QFqwAEUEGADwABsVoC1AAABA8ABFEvAARThAAAAAQEBwAEUcQAAAIQNYAOEJQAAXAE+AT0wwAEUfR/AARSHwABtWAEAASeILwAGjKwUwAEU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98ABIxoAAAACAgLAASL9AAAEh05gA4z0AMABIxEAAASIR2ADi6YAAGADjNwBPwMIAYzegADABeC7CAGM44EAwAXgyQkBwAEi6JisAAAAAAMGjOUUwAEjH8ABIyPAASZ7AACHfgAAAAEDwAEjJsABJnsAAAABAQHAASMwAAAAheBgA4pQAABgA8AAbB8BPghOwAEjSsABI1QAAYhIYAPAAGwfARzAASNdFsABI1YuiEWM4CkBAAGAwAEjXsAF4ScAwABsYUnAASNtIRzAASN7gcABI3HABeFAJwEAASsAwABsMkrAASOEAYHAASOLwAXhQD89HMABJA+AwAEkBsAF4SeD+wEAAS4AilJJwAEkKSXAASQ2AIDAASQtwAXhJ2ADiok+AT0cwAEkXxbAASRRLodOjN6HfgEAARbAASRsFMABJGPABeEnAAFgA4qJgT6KXgCM+EnAASR/JcABJIwAgMABJIPABeEnYAOKkT4BPRzAASS1FsABJKcuh06M3od+AQABFsABJMIUwAEkucAF4ScAAWADipGBiIqTAIz4ScABJNQlwAEk4QCAwAEk2MAF4SdgA4p+PgE9HMABJQoWwAEk/C6HTozeh34BAAEkwAElIQEWwAElGhTAASURwAXhJwABYAOKfoE+il4AjPhJwAElLyXAASU8AIDAASUzwAXhJ2ADinY+Ak7AASVewAElZAABgT5gA8AAbB8BFsABJW8UwAElZsAF4ScAAWADinaBPopeScABJXwhHMABJZQcwAEljRzAASWHgsABJYHABeK5h/kAAAAAwABtVIJLAQABNx4AwABs4icBAAGTAMAAbDI+AT0cwAElshbAASWkLodOjN6HfgEAASTAASW+AYLAASW4wAXiuQCM+D8/TsABJd7AASXoAAGISWADwABsHwEWwAEl6i6IRozhPRzAASYCFsABJfoug52M3zYBAAGAwAEmBsAF4ScAwABsRz0XwAEmFS6IRhzAASYgFsABJhUuiEaM4YE/AQABHMABJiwWwAEmIy6IR4ujjOOHhQEAAYDAASZEwAXhJwCL4ADAAGyIjOFKwAEmUwE1wAEmWgAAAQBdA8AAbF8CYAOKUGADwABsHwEWwAEmWi6IRYzgNcABJmIAAAEAYAOKUAGAwAEmYsAF4Sc1wAEmbgAAAQBgA8AAbB8BgsABJm7ABeNONcABJmEAAAEAXAEcwAEmYYPAASZawAXj2oCcAgAChMABJmLABeP/hcABJm7ABeQWAMAAbGOFwAEmbsAF5BYGjOYUwAEmgMABJoDAASa7AACICAAAAAEDwAEmmMABJrsAAAABAQHAASaiAAAAhA1gA4pQAABbAT4BPRzAASauLod+AQABgMABJrLABeSTAIzlBoznFMABJsDAASbNwAEm7wMAKQAAAAEDwAEmz8ABJu8AAAABAQHAASbZAAAAhA1gA4pQAABgA8AAbB8BSsABJuIBHMABJukWwAEm4i6IRYzgKQEAAYDAASbqwAXk5ADAAGxhAAAF4QAABeRsAAXkvgAF5SEAAAADAozqFMABJvTAASb6wAEppAOISgAAAWADwABsVgAAAgSM7BTAAScxwAEnTwmDKABdA8AAbF8CYAOKJmADwABsHwEywAEnTWADiiZgA8AAbB8ABIztFMABJ1fAASdmGIg/AGADwABsHwGTAQWM8wAAAAAEAAADAAAAAAAAAAAAYAOM6gE/AQkBAMAAbFoAAAAAAwaM7xTAASdrwAEncMABKEgAAIfHAAAAAQPAASd1wAEoSAAAAAEBAcABJ4oAAACDY10DwABsGQFgA4omAABcAT4BRcABJ6ABwAEnqcABJ6sAAIHUYAPAAGwfAZMBHMABJ7KBwAEnsMAF5g6BOgEAARbAASfDgMABJ7TABeXugODAAGxqAMAAbIUBicABJ83ABeYOHMABJ8uBwAEnzcAF5g6BPwEAAZQAwABsiD4DTsABJ+bAASfwAACFOGADiiYBHMABKACAwAEn8sAF5e4pAQABgcABKAHABeYOAMAAbLg9HMABKBAWwAEoCy6DKIzsgJwCAAKCwAEoEcAF5nUWwAEoHi6IP4ztAMAAbGM9F8ABKDMuiD8cwAEoMRbAASgzLog/jO2BPwEAAZQAwABsiIztBozwFMABKE3AAShSwAEpDAAAh8oAAAABA8ABKFbAASkMAAAAAQEBwAEoawAAAINjXQPAAGwZAWADiiYAAFwBPgI9F8ABKIEuiD8cwAEojRbAASiBLog/jO1EAQABFsABKJ+AwAEokMAF5x+A4MAAbGoAwABs4YztRcABKKsBwAEotMABKLYAAIHUYAPAAGwfAZMBHMABKL2BwAEou8AF53aBOgEAARbAASjOgMABKL/ABecfgODAAGxqAMAAbIUBicABKNjABed2HMABKNaBwAEo2MAF53aBPwEAAZQAwABsiD4BPRzAASjpFsABKOMugyiM7DUBAAEcwAEo/oDAASjwwAXnHykBAAGBwAEo/8AF53YAwABsuADAAGyYBozxFMABKRHAASkewAEpogMAKQAAAAEDwAEpIMABKaIAAAABAQHAASkvAAAAhThgA4omAABgA8AAbB8BSsABKUMBNcABKUgAAAEAYAPAAGwfARzAASlIFsABKUMugyiM7CkBAAGAwAEpScAF6DsAwABsYSMcwAEpSIHAASlIwAXoWCcBAAErAMAAbDIwwAEpXh/AASlowABsoAEAASTAASmgAyeIS4DAASmHwAXoOyeITACBwAEpSMAF6FgBYAPAAGwfAAAF5ccABeb4AAXoFQAF6NgAAAADAoz0FMABKafAASmtwAErLwOITQAAAWADwABsVgAAAQSM9hTAASoHwAEqJQmDKABdA8AAbF8CYAPAAGwYYAPAAGwfAR7AASoTwABslgACYAPAAGwYYAPAAGwfAAABBYz7FMABKirAASoqwAEqSwAAAAPAASo3wAEqSwAAAAAAAABgA4z0AT4BPRzAASpALod+AQABJwAAjPgBCQHAASoqwABsWgAAAAACBoz4FMABKlDAASpUwAEq+QAAh34AAAABA8ABKlfAASr5AAAAAQEBwAEqXwAAAId9YAPAAGwYAABgA8AAbB8BPgNOwAEqccABKngAAIGwYAPAAGwfARzAASp/FsABKnougyiM9ikBAAGAwAEqgMAF6bwAwABsYUnAASqNHMABKpiBwAEqkcAF6dcnAQABKwDAAGwyPgI9icABKqnABenXFsABKrgWwAEqsi6DKIz2gODAAGz9PRzAASrLFsABKsYugyiM9oCcAgACgMABKszABem8gcABKtbABenXAMAAbGM/SsABKugBgcABKu/ABenXBoz5FMABKv7AASsLwAErLQMAKQAAAAEDwAErDcABKy0AAAABAQHAASsVAAAAh31gA8AAbBgAAGADwABsHwFKwAErIAEcwAErJRbAASsgLoMojPYpAQABgMABKybABeqrAMAAbGEAAAXplQAF6oUABerqAAAAAgKM/BTAASsywAErOMABLHADiE4AAAFgA8AAbFYAAAEEjP4UwAErjMABK6cJgygAXQPAAGxfAmADwABsWGADwABsHwEewAErmMAAbJYAAmADwABsWGADwABsHwAAAQWNAhTAASuswAErrMABK8wAAAADwAErtsABK8wAAAAAAAAAYAOM/AE+AT0cwAErvy6HfgEAASsAjQABCQHAASuswABsWgAAAAABBo0AFMABK9HAASvVwAEsbgAAh34AAAABA8ABK9jAASxuAAAAAQEBwAEr3QAAAIFMYAPAAGxYAABgA8AAbB8BPgNOwAEr7MABK/MAAIGwYAPAAGwfARzAASv6FsABK/UugyiM/ikBAAGAwAEr+8AF68kAwABsYUnAASwFHMABLBCBwAEsCcAF6+QnAQABKwDAAGwyPgI9icABLCHABevkFsABLDAWwAEsKi6DKIz+gODAAGz9PRzAASxDFsABLD4ugyiM/oCcAgACgMABLETABevJgcABLEvABevkAMAAbGM/SsABLF0BgcABLGTABevkAAAF66IABeySAAAAAQKNAxTAASymwAEsrMABN6sDiE8AAAFgA8AAbFYAAAkEjQUUwAEszsABLNsGiFAAYAPAAGwfAWrAASzVYAPAAGwfiHsEjQYUwAEs8MABLQQGiFEAYAPAAGwfAWrAAS0BYAPAAGwfiIEEjQcUwAEtGcABLSYGiFIAYAPAAGwfAWrAAS0hYAPAAGwfiIcEjQkUwAEtQMABLUUJh1qLowBdA8AAbMcBXQPAAGwZAWADwABsHwAEjQoUwAEtU8ABLXAYiFOLowBgA8AAbFUBHsABLWHAAGzKAQABasABLWtgA8AAbB+IewAEjQ0UwAEteMABLYIYgOAAYAPAAGwfAZMEjQ4UwAEtisABLZsYiFQAYAPAAGwfAZMEjQsUwAEtrMABLc4YiFWLowBgA8AAbVkBHsABLcDAAG1bAQABlAAEjQwUwAEt3MABLe4YiFaLowBgA8AAbFUBKwEFjRoUwAEuIMABLiDAAS44AAAAA8ABLizAAS44AAAAAQEBwAEuMgAABIdaXQPAAGzHAV0DwABsGQFgA8AAbB8AAGADjQMBPwIIAY0JgADABe4YCQHAAS4gwABsWgAAAAAIBo0QFMABLfPAAS37wAEuGwEAhAoAAAABA8ABLgLAAS4bAAAAAAAAAGADwABsHwFKwAEuBQEcwAEuDBbAAS4FLoDgjQ2BPwEAARbAAS4OLohUjQ4AwABsiAaNEhTAAS49wAEuQsABL5cAAIf6AAAAAQPAAS5LwAEvlwAAAAEBAcABLlMAAACB92ADwABtFgAAXAE+BD0jHMABLm8WwAEuXC6IVoujjQwnAQABKwDAAGxeF8ABLlwuiFaLoxzAAS6IFsABLoEWwAEucy6IVYujjQuClsAAbOeIVwAAAADAAG1cjQwrAWADwABsVT0cwAEuqBbAAS6bLohVi6ONC4CcAgACk4DAAS6uwAXu1gDAAGzLPRzAAS61LodyBAAEHMABLtAWwAEuvi6IVoujjQwpAQABkwDAAGy4HMABLucWwAEu1S6IVoujjQwpAQABlADAAGy4HMABLwYWwAEu9C6IVoujjQwpAQABlQDAAGy4HMABLx0WwAEvCy6IVoujjQwpAQABlgDAAGy4AI0VPRzAAS8nLodyBAAEHMABL0IWwAEvMC6IVoujjQwpAQABlwDAAGy4HMABL1kWwAEvRy6IVoujjQwpAQABNwUAwABsuBzAAS94FsABL2YuiFaLo40MKQEAATcGAMAAbLgcwAEvjxbAAS99LohWi6ONDCkBAAE3BwDAAGy4AI0VBo0TFMABL5zAAS+/wAEwgQAAh24BasABL51gA8AAbT+HPAAAAQPAAS/GwAEwgQAAAAEBAcABL8sAAACG52ADwABsHwAAXAE+Aj0cwAEv3hbAAS/XLohTi6ONCoCcAgACNcABL98AAAEAYAPAAGwfARbAAS/fLoDgjQ01wAEv3wAAAQBgA8AAbB8BF8ABL98ugOAcwAEv5YHAAS/fwAXwwoE/AQABlADAAGyIjQ2BwAEv38AF8MKAwAEv68AF8JUAwABsy0nAAS/1HMABMAAWwAEv+S6A4I0NJwEAAWrAATADYAPAAGwfiHsAwABsMj4EPRzAATAXFsABMBEuh1qLo40JNgEAARbAATAbLohTi6ONCgDAAG1ePRfAATArLohTi6MewAEwOcAAbMoBAAFqwAEwQ2ADwABsH4h7AI0KPRfAATBQLoDgk40NPRfAATBiLohUHMABMHAWwAEwYi6IVI0OgT8BAAFqwAEwc2ADwABsH4h7AMAAbIiNDj8GjRQUwAEwhsABMKnAATFrAACHcQFqwAEwh2ADwABtP4c8AAABA8ABMLHAATFrAAAAAgICwAEwtgAAAIhYYAPAAGwfAMABMMEAAACIWWADwABsHwAAXAE+AUnAATDOHMABMNkWwAEw0i6A4I0NgToBAAFqwAEw22ADwABsH4iBAMAAbIU+Aj0cwAEw9RbAATDuLohTi6ONCoCcAgACNcABMPYAAAEAYAPAAGwfARbAATD2LoDgjQ01wAEw9gAAAQBgA8AAbB8BF8ABMPYugOAcwAEw/ILAATD2wAXye4E/AQABlADAAGyIjQ2CwAEw9sAF8nuAwAExAsAF8hEAwABsyz0cwAExFhbAATEPLohTi6ONCoCcAgACNcABMRcAAAEAYAPAAGwfARbAATEXLoDgjQ01wAExFwAAAQBgA8AAbB8BF8ABMRcugOAcwAExHYLAATEXwAXy9oE/AQABlADAAGyIjQ2CwAExF8AF8vaBwAExI8AF8iEAwABsyz4CPRzAATE9LoduAQABgMABMUXABfIRAI0TPRzAATFTLoduAQABgcABMVvABfIhAI0TBo0VFMABMXDAATGTwAEy2QAAh3IBasABMXFgA8AAbT+HPAAAAQPAATGbwAEy2QAAAAQEBMABMaAAAACIWGADwABsHwDAATGrAAAAiFlgA8AAbB8AwAExtgAAAIhaYAPAAGwfAMABMcEAAACIW2ADwABsHwAAXAE+AUnAATHOHMABMdkWwAEx0i6A4I0NgToBAAFqwAEx22ADwABsH4iBAMAAbIU+BD0cwAEx9RbAATHuLohTi6ONCoCcAgACNcABMfYAAAEAYAPAAGwfARbAATH2LoDgjQ01wAEx9gAAAQBgA8AAbB8BF8ABMfYugOAcwAEx/ITAATH2wAX0SYE/AQABlADAAGyIjQ2EwAEx9sAF9EmAwAEyAsAF878AwABsyz0cwAEyFhbAATIPLohTi6ONCoCcAgACNcABMhcAAAEAYAPAAGwfARbAATIXLoDgjQ01wAEyFwAAAQBgA8AAbB8BF8ABMhcugOAcwAEyHYTAATIXwAX0xIE/AQABlADAAGyIjQ2EwAEyF8AF9MSBwAEyI8AF888AwABsyz0cwAEyNxbAATIwLohTi6ONCoCcAgACNcABMjgAAAEAYAPAAGwfARbAATI4LoDgjQ01wAEyOAAAAQBgA8AAbB8BF8ABMjgugOAcwAEyPoTAATI4wAX1P4E/AQABlADAAGyIjQ2EwAEyOMAF9T+CwAEyRMAF898AwABsyz0cwAEyWBbAATJRLohTi6ONCoCcAgACNcABMlkAAAEAYAPAAGwfARbAATJZLoDgjQ01wAEyWQAAAQBgA8AAbB8BF8ABMlkugOAcwAEyX4TAATJZwAX1uoE/AQABlADAAGyIjQ2EwAEyWcAF9bqDwAEyZcAF8+8AwABsyz4EPRzAATJ/LoduAQABgMABMofABfO/AI0TPRzAATKVLoduAQABgcABMp3ABfPPAI0TPRzAATKrLoduAQABgsABMrPABfPfAI0TPRzAATLBLoduAQABg8ABMsnABfPvAI0TBo0WFMABMt7AATLjwAE2zQAAh28AAAABA8ABMuvAATbNAAAAAQEBwAEy9gAAAFRdA8AAbBkBYAPAAGwfAABcAT4BScABM54iHMABM7gcwAEzqRbAATOiLoDgjQ2BPwEAARbAATOxgMABM6vABfamgODAAGxqAMAAbIiBOgEAAWrAATO6YAPAAGwfiHsAwABshQAiHMABM9gWwAEz0YDAATPLwAX2poDgwABsaoE6AQABasABM9pgA8AAbB+IhwDAAGyFARzAATPqFsABM+MugOCNDYE6AQABasABM+xgA8AAbB+IhwDAAGyFPgI9HMABNAQWwAEz/C6IU4ujjQqB4wMAAxbAATQNLoDgjQ0cwAE0HBbAATQVLoDgjQ2BPwEAARbAATQkgMABNB7ABfamgODAAGxqAMAAbIiAwAE0LMAF9qYAwABsyD0XwAE0Oi6A4BzAATRBFsABNDougOCNDYE/AQABFsABNEqAwAE0RMAF9qaA4MAAbGoAwABsiI0NScABNF0cwAE0bhbAATRngMABNGHABfamgODAAGxqgToBAAFqwAE0cGADwABsH4iHAMAAbIU+CD0cwAE0vxbAATS3LohTi6ONCoHjAwADFsABNMgugOCNDWrAATTQYAPAAGwfiHuAwAE01sAF9qYAwABsyD0cwAE06hbAATTkLodai6ONCTYBAAEWwAE07i6IU4ujjQoAwABtXk7AATV+wAE1jQAAiFxgA8AAbB8BHMABNZRqwAE1j2ADwABsH4h7RAEAARbAATWWLoDgjQ0AwABs4U7AATWowAE1sgAAiF1gA8AAbB8BHMABNcEWwAE1uoDAATW0wAX2poDgwABsakQBAAGBwAE1w8AF+JoAwABs4T0XwAE12S6IU4ujHsABNefAAGzKAQABasABNfFgA8AAbB+IewCNCj0cwAE2BhbAATX+LohTi6ONCoHj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AJwJBo3JFpzqnPidigEAiRAAAAABA50OnYoAAAAAAAAAYAOESwE+AUqdFAEmnRQBNZ0bAAABAGADhEsBFp0bLoirjTuNbCMcnTuAnRvABhylJwEAASsAwABsXhedGy6Iq407Jp0bARydTRadRy6DKI0/iP8CAAIniH0niREAnAtgA4RLjWyAnRvABhylAWADg6xgA4RLBo3KFp2PnZ2eNQEAiRIAAAABA521njUAAAAAAAAAYAOESwE+AUqduwEmnbsBNZ3CAAABAGADhEsBFp3CLoisjTuNbSMcneSAncLABh04JwEAASsAwABsXhedwi6IrI07Jp3CARyd9had8C6DKI0/iP8CAAIniH0niRMAnAtgA4RLjW2AncLABh04AWADg6xgA4RLBo3LFp46nkie4wEAiRQAAAABA55nnuMAAAAAAAAAYAOESwE+AUqebQEmnm0BNZ50AAABAGADhEsBFp50LoitjTuNbiMcnpSAnnTABh3LJwEAASsAwABsXheedC6IrY07Jp50ARyephaeoC6DKI0/iP8CAAIniH0niRUAnAtgA4RLjW6AnnTABh3LAWADg6xgA4RLBo3MFp7onvaflAEAiRYAAAABA58Wn5QAAAAAAAAAYAOESwE+AUqfHAEmnxwBNZ8jAAABAGADhEsBFp8jLoiujTuNbyMcn0SAnyPABh5eJwEAASsAwABsXhefIy6Iro07Jp8jARyfVhafUC6DKI0/iP8CAAIniH0niRcAnAtgA4RLjW+AnyPABh5eAWADg6xgA4RLBo3NFp+Zn6egJAEAiRgAAAABA5+8oCQAAAAAAAAAYAOESwE+AUqfwgEmn8IBNZ/JAAABAGADhEsBFp/JLoiwjTuNcSMcn9+An8nABh7xJwEAASsAwABsXhefyS6IsI07Jp/JARyf8Raf6y6DKI0/iP8CAAIniH0niRkAnAtgA4RLjXGAn8nABh7xAWADg6xgA4RLBo3OFqApoDOggAEAiRoAAAABA6A9oIAAAAAAAAAAYAODMgE+AUqgQwE1oEoAAAEAYAODMgEWoEouiIONO41EIxygVYCgSsAGH4AnAQABKwDAAGxeF6BKLoiDjTscoF8WoFkugyiNP4kLAgACJ4hrJ4huAJwHjUSAoErABh+AAWADgzIGjc8WoIWgj6ETAQCJGwAAAAEDoKihEwAAAAAAAABg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SsAAQ2cBFsAAQ24uiXOOCwHAAEOaasAAQ5pgA4lHhS0APgFKwABDrwEWwABDti6JdI4MAcAAQ+VqwABD5WADiUeHAwE+AT0wwABECh/AAEQUwABs0AEAASTAAERnAyeJcIDAAERGwAZGSSeJcQAGjg0WwABEd8AARInAAEUqAQCJdQAAAAEDwABEmsAARSoAAAAAAAAAYAOJqgE+AUrAAESgATXAAESnAAABAGADiaoBFsAARKcuiL+NO42AIxzAAES5gMAARKfABkdIJwEAASsAibgXwABEpy6Iv407NcAARL0AAAEAXQPAAGxfAmADgzJgA4mqARbAAES9Loj4jTuNuTXAAETNAAABAGADgzIBFsAARM0uiS2N2jXAAETMAAABAGADiaoBHMAARMyBwABEvcAGR4MpAQABgsAARM3ABkeoAMAAbGEjHMAARNeDwABEzMAGR8AnAQABKwCJuDXAAETnAAABAGADiaoBH8AAROeJvAMAAxbAAET1LoktjdpqwABFC2ADiUeE5WrAAEUTXQPAAGwZAWADiVWE8gA1wABEzAAAAQBcARzAAETMgcAARL3ABkeDgJwCAAKCwABEzcAGR6iEwABE58AGSAUAwABsY4TAAETnwAZIBYPAAETMwAZHwAFgA4mqjYCAwABEp8AGR0gBYAOJqgaODhbAAEUvwABFQcAAReoBAIl2AAAAAQPAAEVUwABF6gAAAAAAAABgA4mqAT4BSsAARVoBNcAARWEAAAEAYAOJqgEWwABFYS6IwI07jYEjHMAARXWAwABFYcAGSNYnAQABKwCJuBfAAEVhLojAjTs1wABFeQAAAQBdA8AAbF8CYAODMmADiaoBFsAARXkuiPmNO426NcAARYsAAAEAYAODMgEWwABFiy6JLY3aNcAARYoAAAEAYAOJqgEcwABFioHAAEV5wAZJESkBAAGCwABFi8AGSTYAwABsYSMcwABFlYPAAEWKwAZJTicBAAErAIm4NcAARaUAAAEAYAOJqgEfwABFpYm8AwADFsAARbMuiS2N2mrAAEXJYAOJR4UeasAARdNdA8AAbBkBYAOJVYTyADXAAEWKAAABAFwBHMAARYqBwABFecAGSRGAnAIAAoLAAEWLwAZJNoTAAEWlwAZJkwDAAGxjhMAARaXABkmTg8AARYrABklOAWADiaqNgYDAAEVhwAZI1gFgA4mqBo4PFsAARe/AAEYBwABGwwEAiXcAAAABA8AARhfAAEbDAAAAAAAAAGADiaoBPgFKwABGHQE1wABGJAAAAQBgA4mqARbAAEYkLojBjTuNgiMcwABGO4DAAEYkwAZKZCcBAAErAIm4F8AARiQuiMGNOzXAAEY/AAABAF0DwABsXwJgA4MyYAOJqgEWwABGPy6I+o07jbs1wABGVAAAAQBgA4MyARbAAEZULoktjdo1wABGUwAAAQBgA4mqARzAAEZTgcAARj/ABkqfKQEAAYLAAEZUwAZKxADAAGxhIxzAAEZeg8AARlPABkrcJwEAASsAibg1wABGbgAAAQBgA4mqAR/AAEZuibwDAAMWwABGiS6JLY3aasAARp9gA4lHhS1qwABGrF0DwABsGQFgA4lVhPIANcAARlMAAAEAXAEcwABGU4HAAEY/wAZKn4CcAgACgsAARlTABkrEhMAARm7ABkshAMAAbGOEwABGbsAGSyGDwABGU8AGStwBYAOJqo2CgMAARiTABkpkAWADiaoGjkoWwABGyMAARtbAAEiJAACFTQAAAAEDwABG4MAASIkAAAABAQHAAEbtAAAAg2VgA4lHAABgA4mqAT4BR8AARwCAwABHCMAGS+MEAcAARy5qwABHLmADiUeE5QA+AUrAAEc+ARbAAEdFLol1jg0BwABHbmrAAEduYAOJR4UeAD4BSsAAR4ABFsAAR4cuiXaODgHAAEeyasAAR7JgA4lHhS0APgFKwABHxwEWwABHzi6Jd44PAcAAR/xqwABH/GADiUeHAwE+AT0wwABIIR/AAEgrwABs0AEAASTAAEh+AyeJcIDAAEhdwAZL4yeJcQAGjhAWwABIjsAASKDAAElBAQCJeAAAAAEDwABIscAASUEAAAAAAAAAYAOJqgE+AUrAAEi3ATXAAEi+AAABAGADiaoBFsAASL4uiMKNO42DIxzAAEjQgMAASL7ABkziJwEAASsAibgXwABIvi6Iwo07NcAASNQAAAEAXQPAAGxfAmADgzJgA4mqARbAAEjULoj4jTuNuTXAAEjkAAABAGADgzIBFsAASOQuiUqN7jXAAEjjAAABAGADiaoBHMAASOOBwABI1MAGTR0pAQABgsAASOTABk1CAMAAbGEjHMAASO6DwABI48AGTVonAQABKwCJuDXAAEj+AAABAGADiaoBH8AASP6JvAMAAxbAAEkMLolKje5qwABJImADiUeE5WrAAEkqXQPAAGwZAWADiVWE8gA1wABI4wAAAQBcARzAAEjjgcAASNTABk0dgJwCAAKCwABI5MAGTUKEwABI/sAGTZ8AwABsY4TAAEj+wAZNn4PAAEjjwAZNWgFgA4mqjYOAwABIvsAGTOIBYAOJqgaOERbAAElGwABJWMAASgEBAIl5AAAAAQPAAElrwABKAQAAAAAAAABgA4mqAT4BSsAASXEBNcAASXgAAAEAYAOJqgEWwABJeC6Iw407jYQjHMAASYyAwABJeMAGTnAnAQABKwCJuBfAAEl4LojDjTs1wABJkAAAAQBdA8AAbF8CYAODMmADiaoBFsAASZAuiPmNO426NcAASaIAAAEAYAODMgEWwABJoi6JSo3uNcAASaEAAAEAYAOJqgEcwABJoYHAAEmQwAZOqykBAAGCwABJosAGTtAAwABsYSMcwABJrIPAAEmhwAZO6CcBAAErAIm4NcAASbwAAAEAYAOJqgEfwABJvIm8AwADFsAAScouiUqN7mrAAEngYAOJR4UeasAASepdA8AAbBkBYAOJVYTyADXAAEmhAAABAFwBHMAASaGBwABJkMAGTquAnAIAAoLAAEmiwAZO0ITAAEm8wAZPLQDAAGxjhMAASbzABk8tg8AASaHABk7oAWADiaqNhIDAAEl4wAZOcAFgA4mqBo4SFsAASgbAAEoYwABK2gEAiXoAAAABA8AASi7AAEraAAAAAAAAAGADiaoBPgFKwABKNAE1wABKOwAAAQBgA4mqARbAAEo7LojEjTuNhSMcwABKUoDAAEo7wAZP/icBAAErAIm4F8AASjsuiMSNOzXAAEpWAAABAF0DwABsXwJgA4MyYAOJqgEWwABKVi6I+o07jbs1wABKawAAAQBgA4MyARbAAEprLolKje41wABKagAAAQBgA4mqARzAAEpqgcAASlbABlA5KQEAAYLAAEprwAZQXgDAAGxhIxzAAEp1g8AASmrABlB2JwEAASsAibg1wABKhQAAAQBgA4mqAR/AAEqFibwDAAMWwABKoC6JSo3uasAASrZgA4lHhS1qwABKw10DwABsGQFgA4lVhPIANcAASmoAAAEAXAEcwABKaoHAAEpWwAZQOYCcAgACgsAASmvABlBehMAASoXABlC7AMAAbGOEwABKhcAGULuDwABKasAGUHYBYAOJqo2FgMAASjvABk/+AWADiaoGjksWwABK38AASu3AAEygAACJewAAAAEDwABK98AATKAAAAABAQHAAEsEAAAAg2VgA4lHAABgA4mqAT4BR8AASxeAwABLH8AGUX0EAcAAS0VqwABLRWADiUeE5QA+AUrAAEtVARbAAEtcLol4jhABwABLhWrAAEuFYAOJR4UeAD4BSsAAS5cBFsAAS54uiXmOEQHAAEvJasAAS8lgA4lHhS0APgFKwABL3gEWwABL5S6Jeo4SAcAATBNqwABME2ADiUeHAwE+AT0wwABMOB/AAExCwABs0AEAASTAAEyVAyeJcIDAAEx0wAZRfSeJcQAGjhMWwABMpcAATLfAAE1kAQCJfAAAAAEDwABMy8AATWQAAAAAAAAAYAOJqgE+AUrAAEzRATXAAEzYAAABAGADiaoBFsAATNguiMWNO42GIxzAAEztgMAATNjABlJ8JwEAASsAibgXwABM2C6IxY07NcAATPEAAAEAXQPAAGxfAmADgzJgA4mqARbAAEzxLoj4jTuNuTXAAE0BAAABAGADgzIBFsAATQEuiSWN1TXAAE0AAAABAGADiaoBHMAATQCBwABM8cAGUrcpAQABgsAATQHABlLcAMAAbGEjHMAATQ6DwABNAMAGUvQnAQABKwCJuDXAAE0eAAABAGADiaoBH8AATR6JvAMAAxbAAE0sLokljdVqwABNRWADiUeE5WrAAE1NXQPAAGwZAWADiVWE8gA1wABNAAAAAQBcARzAAE0AgcAATPHABlK3gJwCAAKCwABNAcAGUtyEwABNHsAGUzkAwABsY4TAAE0ewAZTOYPAAE0AwAZS9AFgA4mqjYaAwABM2MAGUnwBYAOJqgaOFBbAAE1pwABNe8AATj0BAIl9AAAAAQPAAE2RwABOPQAAAAAAAABgA4mqAT4BSsAATZcBNcAATZ4AAAEAYAOJqgEWwABNni6Ixo07jYcjHMAATbWAwABNnsAGVAonAQABKwCJuBfAAE2eLojGjTs1wABNuQAAAQBdA8AAbF8CYAODMmADiaoBFsAATbkuiPmNO426NcAATcsAAAEAYAODMgEWwABNyy6JJY3VNcAATcoAAAEAYAOJqgEcwABNyoHAAE25wAZURSkBAAGCwABNy8AGVGoAwABsYSMcwABN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AKITAAABAFwBHMAAohODwACiAsAGuhGAnAIAAoTAAKIUwAa6NoXAAKIjwAa6TQDAAGxjhcAAoiPABrpNP0nAAKKgIRzAAKK3FsAAoquCwACipMAGubmDZYncJwEAAYHAAKK6wAa5ogDAAGxePgFKwACizwE1wACi1gAAAQBdA8AAbF8CYAODAWADidoBFsAAotYuiPyNO429NcAAougAAAEAYAODAQGAwACi6MAGuZQ1wACi+gAAAQBgA4naARzAAKL6gsAAovPABrm5g2sBAAGBwACjCsAGuaIAieo1wACi5wAAAQBcARzAAKLng8AAotbABrsdgJwCAAKEwACi6MAGu0KFwACi+sAGu1kAwABsY4XAAKL6wAa7WT9KwACjIgGCwACjKcAGubkGjkYWwACjOMAAo0jAAKPwAQCJwQAAAAEDwACja8AAo/AAAAAAAAAAYAOEAgE+AUrAAKNxASbAAKNxATXAAKN4AAABAGADhAIBFsAAo3guiLKNO41zIxzAAKOcgMAAo3jABrwPJwEAASsAwABsXhfAAKN4LoiyjTsmwACjeAEcwACjrhbAAKOoLoMojT+JBAMAAyeIeyeIfCcAAJwJYAOEAo1zgMAAo3jABrwPAWADg6xgA4QCBo5jFsAAo/XAAKQDwACl/gAAhToAAAABA8AApBbAAKX+AAAAAgICwACkHQAAAIm9YAODMgDAAKQwAAAAg2VgA4lHAABgA4mqAT4ETsAApFHAAKRYAACBsGADiaoBHMAApG8WwACkWi6I/Y07jb4pAQABgMAApHDABryvAMAAbGFJwACkfBzAAKSHgsAApIDABrzUJwEAASsAibg+AUrAAKSYATXAAKSfAAABAF0DwABsXwJgA4MyYAOJqgEWwACkny6I/Y07jb41wACktQAAAQBgA4MyAYDAAKS1wAa8rzXAAKTCAAABAGADiaoBH8AApMKJvAMAA4DAAKTbwAa8r4HAAKTswAa8vR7AAKUHwABtJAIBYAOJVQIWwAClQRbAAKUygMAApSzABryvg2ODQoDgwABsamrAAKVPYAOJnIY4AAA1wACktAAAAQBcARzAAKS0g8AApJ/ABr0sgJwCAAKEwACktcAGvVGFwACkwsAGvWgAwABsY4XAAKTCwAa9aD9JwAClaSEcwAClgBbAAKV0gsAApW3ABrzUg2WJrScBAAGBwAClg8AGvL0AwABsXj4BSsAApZgBNcAApZ8AAAEAXQPAAGxfAmADgzJgA4mqARbAAKWfLoj9jTuNvjXAAKW1AAABAGADgzIBgMAApbXABryvNcAApcUAAAEAYAOJqgEcwAClxYLAAKW+wAa81INrAQABgcAApdXABry9AIm6NcAApbQAAAEAXAEcwACltIPAAKWfwAa+QoCcAgAChMAApbXABr5nhcAApcXABr5+AMAAbGOFwAClxcAGvn4/SsAApe0BgsAApfTABrzUBo5kFsAApubAAKbrwACp7wAAicIAAAABA8AApvDAAKnvAAAAAQEBwACm+gAAAIGXYAOJVQAAYAPAAGxbAT4GScAApwYlwACnDwCAwACnCsAGvx9gA4lkSsAApx8BKj9JwACnTyXAAKdYAIDAAKdTwAa/H2ADiXJKwACnaAEpP0nAAKeUJcAAp50AgMAAp5jABr8fYAOJgErAAKeqASk/ScAAqBwiHMAAqDEWwACoJYDAAKggwAa/H4NliV0nAQABasAAqEBgA4lHhR4AwABsXgEcwACoZRbAAKhZgMAAqFTABr8fg2WJXScBAAFqwACodGADiUeE5QDAAGxePgNOwACojcAAqJ0AAInDYAOJVQEcwACopIDAAKifwAa/H4NrAQABasAAqMBgA4lHhS0AiVpAIRzAAKjggMAAqNvABr8fJwEAAYHAAKjjwAa/9wCJWcAAqNvAAKjyAErAAKj7ASIcwACpAi6JwgEAAYHAAKkIwAa/9wCOZAEcwACpHC6JxAEAAYHAAKklwAa/9wCOZT9JwACpZSIlwACpbgCAwACpacAGvx9gA4mqABzAAKmRFsAAqYcUwACpgsAGvx8AAWADiaqC04mwJwEAARbAAKmULokojdgAwABsXj4BSsAAqasBHMAAqbIuicIBAAEWwACpyxbAAKm9FMAAqbjABr8fAAFgA4mqg3OJroDiwABsawCOZD9KwACp3wEqBo5lFsAAqt3AAKriwACs2wAAicQAAAABA8AAqurAAKzbAAAAAQEBwACq9AAAAIGXYAOJVQAAYAPAAGxbAT4EScAAqwAlwACrCQCAwACrBMAGwTtgA4lkSsAAqxkBKj9JwACrSyIiJcAAq1QAgMAAq0/ABsE7YAOJqgAcwACrfxbAAKt1FMAAq3DABsE7AAFgA4mqgtOJsCcBAAEWwACrgi6JS43vAMAAbF4AHMAAq6oWwACrnhTAAKuZwAbBOwABYAOJqoNlia0nAQABasAAq7lgA4lHhS0AwABsXj4BSsAAq84BKT9JwACsDyIiJcAArBgAgMAArBPABsE7YAOJqgAcwACsQxbAAKw5FMAArDTABsE7AAFgA4mqgtOJsCcBAAEWwACsRi6JKI3YAMAAbF4AHMAArHAWwACsZBTAAKxfwAbBOwABYAOJqoNlia0nAQABasAArH9gA4lHhS0AwABsXj4BSsAArJQBHMAArJsuicQBAAEWwACstxbAAKypFMAArKTABsE7AAFgA4mqg3OJroDiwABsawCOZT9KwACsywEqBo5mFsAArcnAAK3OwACwfAAAicUAAAABA8AArdbAALB8AAAAAQEBwACt4AAAAIGXYAOJVQAAYAPAAGxbAT4GScAArewlwACt9QCAwACt8MAGwt9gA4lkSsAArgUBKj9JwACuNiIlwACuPwCAwACuOsAGwt9gA4mOABzAAK5gFsAArlQUwACuT8AGwt8AAWADiY6DZYmQJwEAAWrAAK5vYAOJR4UtAMAAbF4+AUrAAK6EASk/ScAArsYiIiXAAK7PAIDAAK7KwAbC32ADif4AIRzAAK8CFsAArvQUwACu78AGwt8AAWADif6FN4oCJwEAASsAiVkAFsAArxoUwACvFcAGwt8AAWADif6GSIlhPgFKwACvPAEcwACvQy6JxQEAARbAAK9RFMAAr0zABsLfAAFgA4n+hTeKAgCOZj9JwACvniIlwACvpwCAwACvosAGwt9gA4n+ABbAAK/EFMAAr7/ABsLfAAFgA4n+hkiJYT4CQBzAALAAFsAAr/IUwACv7cAGwt8AAWADif6FN4oCJwEAASsAiVnAAK/twACwBwBKwACwEAEcwACwFy6JxQEAARbAALAvFsAAsCUUwACwIMAGwt8AAWADif6FOIoBhTmKKwCOZj9JwACwQiXAALBLAIDAALBGwAbC32ADiZxKwACwWgEpP0rAALBsASoGjmcWwACxZsAAsWvAALNPAACJxgAAAAEDwACxccAAs08AAAABAQHAALF7AAAAgZdgA4lVAABgA8AAbFsBPgRJwACxhyXAALGQAIDAALGLwAbE3GADiWRKwACxoAEqP0nAALHOHMAAsdeAwACx0sAGxNwnAQABFsAAsdoug1eO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AQAAAAEDrEysaQAAAAEBAaxXAAAAgJBgA408AABgA4MyAUqsZQErBo6zF6xurHSsswAAigIAAAABA6yLrLMAAAACAgKslgAAAICQYAONPACspQAAAIE+YAPAAGwfAABgA4MyAUqsrwErBo60F6y3rL2tAgAAigMAAAABA6zXrQIAAAACAgKs4gAAAICQYAONPACs9AAAAIE+YAPAAG0WAABgA4MyAUqs/gErBo61F60GrQytUQAAigQAAAABA60mrVEAAAACAgKtMQAAAICQYAONPACtQwAAAIE+YAPAAGwYAABgA4MyAUqtTQErBo62F61WrWetjAACigUAAAABA613rYwAAAABAQGtggAAAICQYAONPAAAYAOOigAAAAbOBQAGzioABs5rAAbOrAAGzu0ABs87AAbPfQAGz6cABs/RAAbP/wAG0IsABtFIAAbRqQAG0iAABtMLAAbTQwAG020ABtOXAAbTwQAG0+YABtRXAAbVqgAG1eQABtYfAAbWUwAG1ocABta7AAbW7wAG1zEABtdzAAbXtQAG1+QAAAAfAo65F62RrZeuQoOKBgAAAWADjooAAAEEjrsXreCt/AmJ2QFqrcpgA8AAbFaAtWADwABsWwABBY69F64BrgeuQAEAAAOuG65AAAAAAQAAAa4iAAAEidlgA8AAbFsBagBgAcAAbFwCYAOOuQE/AggBjruAAMAG2LgJAa4HjpQAAAAAAAAABtjrAAAAAAKOvheuRa5LtHwDigcAAAFgA46VAAABBI7AF657roAJhDAAYAOOcgABBY7LF66FroWumwAAAAOuj66bAAAAAQEBrpUAAASEMGADjnIAAGADjr4BPwIIAY7AgADABtk1CQGuhY64AAAAAAcGjsIXrqCuta7tAQCJ8gFqrqFgA8AAbFaAtQAAAQOuyK7tAAAAAAAAAGADwABsWwFKrssBIRau0hauzC6EMI7AicmOdQaOwxeu8q8JrxcBAIGIAWqu82ADwABsVoC1AAABA68OrxcAAAAAAAAAYAPAAGwYAUqvEQEniggGjsQXrxyvOa9dAQCBIAFqrx1gA8AAbFaAtQAAAQOvUK9dAAAAAAAAAF0DwABsGQFgA8AAbBgBSq9TATGvW2ADwABsGAAGjsYXr2Kvc7D1AACJ5QFqr2NgA8AAbFaAtQAAAQOvm7D1AAAACQcHr60AAACA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ecAG5JOBPwEAAZUAwABsiD4EToiZiJ0AAYosYAPAAGxVASaImQUciKcWiJ8uiiOOzI7xKQEAAYKIqMAG5JMAwABsuGADwABsVU6IvIjAAAGHkmADwABsHwEmiLwFHIjKFojCLoojjsyO8SkBAAEciM2CiMvABuSTgT8BAAGUAMAAbIgAwABsuGADwABsHz0ciOCAiNnABuRDgeMDAAOBiOnABuR/HIj8gYjzwAbkf4E/AQABhIj+wAblIgDAAGyIg4kDwAbk6wDAAGzIPYmJD8AG5H8ciRiBiQ/ABuR/gT8BAAGEiRvABuUiAMAAbIhAHIk6gYkxwAbkfycBAAEWiT0uiiSOzI7yAMAAbDKJMYlLAD0ciVmAiVLABuRDgeMDAAOBiWLABuR/HIl1gYlswAbkf4E/AQABFol3LoomjsyO9ADAAGyIFomHLooljsyO8wDAAGzISomcAYCJo8AG5EMGjvoYibKJt4vfAACKLQAAAAEDidCL3wAAAAEBAYncAAAAgQtgA4tXAABcAT4ESYnoIRyJ9RaJ7C6KI47MjvEnAQABKwDAAGxiPgFFigYBig+KEQAAgdRgA8AAbB8BkwEcihiBihbABuaIgToBAAEWiiMWihouiiOOzI7xgODAAGxqAMAAbIUBiYorwAbmiByKLYGKK8AG5oiBPwEAAZUAwABsiD4ETopHiksAAIosYAPAAGxVASaKRwUcilUWik0uiiOOzI7xKQEAAYGKVsAG5ogAwABsuGADwABsVU6KbIpwAAGHkmADwABsHwEmimwFHIp6FopyLoojjsyO8SkBAAEcin2BinvABuaIgT8BAAGUAMAAbIgAwABsuGADwABsH0mKiyEcipODio/ABucXJwEAARaKmoKKlsAG5uCA4MAAbGoAwABsMj4BPYqKrsAG5uAeirjAAG1EAwADForLgorHwAbm4IKWwABs5xaK14KK08AG5uCKKsAAbWeDiubABucXAD89HIsDgIr+wAbmVoboAQABgosOwAbm4ACLWz9OizCLNAAAiixgA8AAbFUBFos2LooljsyO80mLSiEci10Wi04uiiaOzI70JwEAARaLZIGLYMAG59uA4MAAbGoAwABsMj4BPYmLdMAG59sei37AAG1EAwADFouRgYuNwAbn24KWwABs5xaLnYGLmcAG59uKKsAAbWcWi6wuiiaOzI70AD89HIvMgIvHwAbmVoboAQABgYvXwAbn2wCLWwaPCxiL5IvsjBUBAIQKAAAAAQOL84wVAAAAAAAAAGADwABsHwFKi/YBHIwFFov2LookjsyO8oE/AQABFowHLoomjsyO9ADAAGyIBo78GIwajD2MtgAAii6OzAFqjBtgA8AAbT+HPAAAAQOMRYy2AAAAAQEBjEoAAACBPmADwABsHwAAXAE+A0AcjGscjGWAjF/ABujsgksBAAE3CADAAGziJwEAAZMAwABsMoxejG8APRyMhBaMdi6KJY7MjvOAnAIAAhaMhS6KJo7MjvSAjJfABujsAMAAbMs9F4ykLoomjswcjKIWjKQuiiaOzI70gT8BAAGUAMAAbIiO9AaO/RiMu4zAjVAAAIovjswAAAABA4zMjVAAAAACAgKM1wAAAIosYAPAAGxVAIzgAAAAh5JgA8AAbB8AAFwBPgQ9IxyM9BaM6y6KI47MjvEnAQABKwDAAGxiF4zrLoojjswxjQFbAI7xKwFdA8AAbBkBWz0cjRIWjQkuiiOOzI7xNgEAAYCNFsAG6ZMAwABsRz0cjSkWjSAuiiOOzI7xNgEAAYGNLcAG6aEAwABsRz0XjTcuiiSOzByNRhaNNy6KJI7MjvKBPwEAAYGNScAG6aEAwABsiI7yBo7+GI1VjVqN2QAAijCOzAAAAAEDjW2N2QAAAAAAAABcAT4DPRyNdi6KL47MAgACFo2DLooljsyO8xaNky6KJo7MjvQAjv09F42oLooljswrjvM9F43DLoomjsyTjvQGjv8Yjd6OAI8IAACKMY7MAWqN32ADwABtP4jpAAABA44FjwgAAAAAAAAAXAE+BD0cjg4uijCOzAAAAACO/kAcjo8Wjn8uiieOzI71g9cBAAFqjpJgA8AAbB+GUQDAAG0Ujn+OogA9F46pLooljswejr7AAGzKAQABFo7ILoonjsyO9QCO8z0Xjt4uiieOzByPABaO8C6KJ47MjvWCTAEAAZQAwABs4471Bo8AGI8NjzCPpgAAhuYBao8OYAPAAG0/hzwAAAEDjzmPpgAAAAEBAY8+AAAAgT5gA8AAbB8AAFwBPgJJj0scj14Wj08uiiaOzI70JwEAARaPcBaPYS6KJY7MjvOA4MAAbGoAwABsMj4BPRyPgC6KMY7MAAAAAI7/Pz0cj5Muii6OzAEAAYCPnMAG63sAjvwGjwEYj6uPsJLyAACKMwAAAAEDj7+S8gAAAAEBAY/KAAAAijRgA8AAbFUAAFwBPgFJj9Ucj+QWj92Aj9nABuv/gODAAGxqgToBAAFqj+ZgA8AAbB+GUQDAAGyFPgNJkAAckBMWkAQuiiaOzI70gTsBAAEckCsWkCQWkBUuiiWOzI7zgODAAGxqRAEAARaQMYCQLcAG6/+A4MAAbGoAwABs4QDAAGyGPgE9HJBDLooxjswAAAAAjv8/PRyQaRaQWi6KJY7MjvOB4wMAAxaQci6KJo7MjvQckJEWkIIuiiaOzI70gT8BAAEWkJeAkJPABuv/gODAAGxqAMAAbIiAkJ/ABuv/AMAAbMg9F5CrLoomjswckLoWkKsuiiaOzI70gT8BAAEWkMGAkL3ABuv/gODAAGxqAMAAbIiO9D4CTpDmkPUAAYo1YAPAAGwfARyRDRaRBhaQ9y6KJY7MjvOA4MAAbGpEAQABFpEPLoomjsyO9ADAAGzhSZElHJE4gZEpwAbtH4PXAQABapE7YAPAAGwfhioAwABtFD4FTpFpkXMAAYhdYAPAAGxVAR6RecAAbUQDAAMWkZcWkYguiiWOzI7zgpbAAGznHJHIFpG6FpGrLooljsyO84oqwABtZ4E/AQABFpHKLoomjsyO9ADAAGyIgZHawAbtHwA9HJHzLoowjswAAAAAjv49HJISLoovjswCAAKAkh/ABuv/FpIogJIkwAbr/4DgwABsagCO/T0XkjkuiiWOzIKSSsAG7XyO8z0Xkl0uiiaOzJOO9D4DPRySiC6KMI7MAAAAAI7+PReSpy6KJY7MgJK4wAbr/47zPReSxS6KJo7MFpLagJLWwAbr/4DgwABsao70Bo8CGJL3kvyW3gAAijYAAAABA5MIlt4AAAABAQGTGAAAAIHRYAOO5wAAXAE+Ck6TL5M+AAGKNWADwABsHwEck1YWk08Wk0AuiiWOzI7zgODAAGxqRAEAARaTWC6KJo7MjvQAwABs4U6TdgAAAIhdYAPAAGxVAEmThSIck5iBk4nABu6ag9cBAAFqk5tgA8AAbB+GKgDAAG0UAByTyIGTucAG7pqBOwEAARyT5xaT4BaT0YCTy8AG7oiKJY7MjvOA4MAAbGpEAQABFpPvgJPpwAbuiIomjsyO9ADAAGzhAMAAbIY+AT2KlAjABu7THpQYwABtRAMAAxaUNhaUJy6KJY7MjvOClsAAbOcclGUWlFcWlEguiiWOzI7ziirAAG1ngT8BAAEWlGcuiiaOzI70AMAAbIiBlHfABu6aAD89HJSSLoowjswAAAAAjv5JlK0hHJTAFpS3gJSxwAbuiIojjsyO8ScBAAErAMAAbGI+Aj0clNoWlNEuiiOOzI7xgTQBAAEWlOeAlOHABu6IiiOOzI7xAMAAbQU9F5T4LookjswclQcWlPguiiSOzI7ygT8BAAEWlRCAlQrABu6IiiSOzI7yAMAAbIiO8j9JlSohHJU4gpUuwAbu0ycBAAErAMAAbF4+Az0clUkuii+OzAIAAhaVXICVVsAG7oiKJY7MjvMWlXKAlWzABu6IiiaOzI70AI79PReViS6KJY7MgpWawAbu047zPReVqy6KJo7Mk470PgI9F5XSLooljswWlemAlePABu6IiiWOzI7zjvM9F5X/LoomjswWlhaAlhDABu6IiiaOzI70jvQ9F5ZugJZowAbuiIojjswrjvE9F5aJgJaDwAbuiIokjsyTjvI9F5angJahwAbuiIoljswrjvM9F5bIgJbCwAbuiIomjsyTjvQGjwMYluOXBpiSAACG6QFqluRgA8AAbT+HPAAAAQOXEZiSAAAAAQEBlxYAAACBPmADwABsHwAAXAE+BkmXIyEclzUcly6AlyjABvFEgksBAAE3IADAAGziJwEAAZMAwABsMj4BPTCXQySXfAMnijeAl1vABvFEJ4o4P0mXiByXmxaXjC6KJo7MjvSBOwEAARyXsxaXrBaXnS6KJY7MjvOA4MAAbGpEAQABlwDAAGzhAMAAbIY+AT0cl8AuijGOzAAAAACO/z89HJgNLooujswBAAEcmCQcmB2AmBfABvFEgksBAAE3GADAAGzigfoBAAE3gP8AwABs3gCO/D0cmDEuii6OzAEAARyYSByYQYCYO8AG8USCSwEAATcQAMAAbOKB+gEAATeA/wDAAGzeAI78PRyYVS6KLo7MAQABHJhrHJhlgJhfwAbxRIJLAQABNwgAwABs4oH6AQABN4D/AMAAbN4Ajvw9HJh4LooujswBAAEcmIeAmIHABvFEgfoBAAE3gP8AwABs3gCO/AaPBBiYl5i6mxgAAIo5AWqYmGADwABtP4c8AAABA5jLmxgAAAABAQGY0AAAAIE+YAPAAGwfAABcAT4CSZjdIRyY7xyY6ICY4sAG8s+CSwEAATceAMAAbOInAQABkwDAAGwyPgE9MJj9JJk2AyeKN4CZFcAG8s8nijo/SZlCHJlMgJlGwAbyz4E6AQABN4CAAMAAbIU+AT0cmVwuhuYBAAGAmWbABvLPAI8ASZl5HJmDgJl9wAbyz4E6AQABN8AAQAAAwABshT4DSZmVHJmoFpmZLoomjsyO9IE7AQABHJnAFpm5FpmqLooljsyO84DgwABsakQBAAGVAMAAbOEAwABshj4BPRyZzy6KMY7MAAAAAI7/Pz0cmeYuii6OzAEAARyZ/ByZ9oCZ8MAG8s+CSwEAATcIAMAAbOKB1QEAATeAgADAAGy6AI78PRyaCy6KLo7MAQABHJoagJoUwAbyz4H6AQABN4D/AMAAbN4Ajvw+BUmaNhyaSRaaOi6KJo7MjvSBOwEAARyaYRaaWhaaSy6KJY7MjvOA4MAAbGpEAQABlwDAAGzhAMAAbIY+AT0cmnAuijGOzAAAAACO/z89HJqHLooujswBAAEcmp4cmpeAmpHABvLPgksBAAE3GADAAGzigdUBAAE3gMAAwABsugCO/D0cmq0uii6OzAEAARyaxByavYCat8AG8s+CSwEAATcQAMAAbOKB+gEAATeA/wDAAGzeAI78PRya0y6KLo7MAQABHJrpHJrjgJrdwAbyz4JLAQABNwgAwABs4oH6AQABN4D/AMAAbN4Ajvw9HJr4LooujswBAAEcmweAmwHABvLPgfoBAAE3gP8AwABs3gCO/AaPBRibHZtAnH0AAIo7AWqbHmADwABtP4c8AAABA5tMnH0AAAABAQGbUQAAAIE+YAPAAGwfAABcAT4CTptjm2gAAIcPYAPAAGxbASpEm3U+BE6bhJuJAACKPGADwABsHwEcm5GAm4vABvVRgfoBAAE3fwDAAGzePYibn8AG9VEcm6WAm5/ABvVRgksBAAE3BwDAAGziSZuyIiIcm72Am7fABvVRJwEAAZMAwABsMgAcm9Mcm8uCm8bABvV7gfoBAAE3QADAAGzeJwEAAZMAwABsMgEiHJvtgJvnwAb1UScBAAEcm/CUgVoAAAAAwABsjwDAAGwyACEcnAQcm/yCm/fABvV7gfoBAAE3QADAAGzeJwEAAZMAwABsMj4BPYmcFcAG9WUpPgE9ipw5wAb1exycPoKcOcAG9XuB1QEAATeAgADAAGy6PRycVS6G5gEAAYKcX8AG9XsAjwAhgZx0wAb1ZQaPBhicgpylnQIAAIo9AWqcg2ADwABtP4c8AAABA5y/nQIAAAABAQGcxwAAAIE+YAPAAGwYAABcAT4BPRyc1C6KOQEAARyc8xac5i6KII7th34BAAGAnPfABvazAI7SAI8EBo8HGJ0HnSqdgwAAij4Bap0IYAPAAG0/hzwAAAEDnTudgwAAAAEBAZ1LAAAAihZgA47aAABcAT4BPRydZhadWS6KIY7uihUCAAKAnXLABvcVLgCO3waPCBidiJ2rnkcAAIo/AWqdiWADwABtP4c8AAABA526nkcAAAABAQGd0AAAAIpAXQPAAGwZAWADjtoAAFwBPgI9HJ3fLoo5AQABFp35gJ3xwAb3aoDgwABsagCPBD4CTp4WAAAAPF0DwABsSgFgA47aARaeFh4AwABsLwEBXQPAAGwgAWADjtoBgJ4WwAb3agA9wABsS0UAAAEcnhaBAMAG96I+AAAAAMAAbE0APgJOng8AAACKQWADjtoBFp4fgQDABveiQMAAbE8+AT0cnicuij4BAAGCnjnABvfyAI8HBo8JGJ5Mnm+e4gAAikIBap5NYAPAAG0/hzwAAAEDnn6e4gAAAAEBAZ6GAAAAgL5gA8AAbFYAAFwBPgJOnpqeoQABhApgA8AAbB8BHJ6uFp6jLooiju+KQwEAASaeuAGAnrjABvhKYAOPXACPZT0cnsUuijkBAAGBntfABvheAI8EAAAG40sABuO/AAbmOQAG6HgABujCAAbpdAAG6ksABuqqAAbrUwAG6+IABu5rAAbxHAAG8qcABvUpAAb2iwAG9u0ABvdCAAb4IgAG+KMAAAASAo8OGJ7nnu2qIQOKRAAAAWADwABsVgAABwSPEBifBJ8RGIofAGADwABsHwAEjxEYnyKfLhiKRQBgA47VAASPEhifP59LGIpGAGADjuIABI8TGJ9an2QYikcAYAOPaAAEjxQYn3iffQlUAF0DwABsGQFgA8AAbB8ABI8VGJ+Ln5UJikgAYAPAAGwfAASPFxif3J/gGIpJjswAYAPAAGwfAAEFjyoYn+Wf5aC+AAAAA5/zoL4AAAAGBQWf+QAABIofYAPAAGwfAKANAAAEikVgA47VAKAgAAAEikZgA47iAKA5AAAEikdgA49oAKBKAAAEVF0DwABsGQFgA8AAbB8AAaBdAAAEikhgA8AAbB8BaqBpYAPAAGwfAGADjw4BPgFAIhygl5ODAAEAARagmi6KSY7MjxcAwABs9gAcoKkWoKQuikmOzI8XgwABAAEWoLIWoKwuVI8UgODAAGxqAMAAbPaglKC5AAgIAY8QgADABvmtCAGPEYEAwAb5uwgBjxKCAMAG+ccIAY8TgwDABvnTCAGPFIQAwAb53wgBjxWFAMAG+fQIAI8XhaB8wAb59AkBn+XAAGxaAAAAAA4GjxkYoMOgy6DmAQCECgAAAAEDoNKg5gAAAAAAAABgA8AAbB8BSqDVARyg2hag1S6KSY7MjxdEAQABFqDcLopIjxUAwABs4QaPGxig66DvoVUCAIQKAAAAAQOg9aFVAAAAAQEBoPoAAACKSmADwABsHwAAXAE+Aj0XoQYuikmOzByhGBahDS6KSI8VgT8BAAGAoRrABvsTAMAAbIiPF0AiHKEuk4MAAQABFqExLopJjsyPFwDAAGz2AByhQBahOy6KSY7MjxeDAAEAARahSRahQy5UjxSA4MAAbGoAwABs9qEroVAABo8dGKFaoV6heQAAhvkAAAABA6FmoXkAAAAAAAAAYAPAAGwfAUqhbAEcoXEWoWwuVI8UKQEAATWhcgAAAQBgA8AAbB8BFqFyLopJjsyPFzWhcgAAAQBgA8AAbB8BF6FyLopJjswcoXaAoXLABvvMgT8BAAGUAMAAbIiPF4ChcsAG+8wAwABsuAaPHhihfqGCogAAAIpLAAAAAQOhjKIAAAAAAAAAAGADwABsHwE+AUqhlQEcoegcocwcoa8coagcoZ0uhvkAAAAAjx2CTAEAATcYAMAAbOOB1QEAARyhxRyhui6G+QAAAACPHYJMAQABNxAAwABs4wDAAGy6gdUBAAEcoeIcodcuhvkAAAAAjx2CTAEAATcIAMAAbOMAwABsuoHVAQABHKHyLob5AAAAAI8dAMAAbLoGjx8YogWiCaN+AACKTAAAAAEDohmjfgAAAAAAAABgA8AAbB8BPgJOoiaiKwAAhudgA8AAbB8BHKItLob5AAAAAI8dSaI9HKJNHKJGgKJBwAb884H6AQABN4CAAMAAbN4nAQABkwDAAGwyPgFKom0BgKJ0wAb880mihRyilRyijoCiicAG/POB+gEAATdAAMAAbN4nAQABkwDAAGwyPgFKorUBHKLRHKLLHKLDgKK+wAb884H6AQABNz8AwABs3oJMAQABNwgAwABs44HVAQABHKLTLob5AAAAAI8dAMAAbLo+AUqjBAEco14co0AcoyEcoxocoxKAow3ABvzzgfoBAAE3PwDAAGzegkwBAAE3GADAAGzjgdUBAAEcozkcoy4uhvkAAAAAjx2CTAEAATcQAMAAbOMAwABsuoHVAQABHKNYHKNNLob5AAAAAI8dgkwBAAE3CADAAGzjAMAAbLqB1QEAARyjai6G+QAAAACPHQDAAGy6Bo8gGKODo4ek3QAAik0AAAABA6OSpN0AAAAAAAAAYAPAAGwfAT4GTqOfo6UAAIE+YAPAAGwfAZNOo7KjuAAAik5gA8AAbB8Bk06jxaPKAACKPGADwABsHwGTRKPTPgM9iqPewAb+ihyj5S6G+QAAAACPHT2Io/fABv5oHKP9gKP3wAb+aIHVAQABHKQOHKQGgqQBwAb+ioH6AQABN38AwABs3oJMAQABgaQRwAb+eQDAAGzjAMAAbLo9iaQewAb+eRykJIGkHsAG/nmBPwEAATcHAMAAbIghHKRFHKQ9gqQ4wAb+ioH6AQABN4CAAMAAbN4nAQABkwDAAGwySaRwIhyke4GkdcAG/nmBOgEAAWqkfWADwABsH4WkAMAAbIUAIRyknByklIKkj8AG/oqB+gEAATdAAMAAbN4nAQABkwDAAGwyPgE9iKSrwAb+aByksYCkq8AG/miB1QEAARykuRyktZSBWgAAAADAAGyPgkwBAAGBpLzABv55AMAAbOMAwABsuj9KpM0BgKTUwAb+aAaPIRik4qTppToAAIpPAAAAAQOlAqU6AAAAAAAAAGADwABsGAE+AUqlCwEcpR8WpRIuikWPEYoSAQABHKUjLopMAAAAAI8fAI7XBo8iGKU/pU6ljwAAilAAAAABA6VepY8AAAAAAAAAYAOO2gE+AUqlZwEcpXsWpW4uikaPEooZAQABLgCO5AaPIxillKWcpnUAAIpRAAAAAQOlxKZ1AAABAAAEgS9gA47aAWADjtoAAAAAXQPAAGwZAV8DAAABPgROpdel2wABh5JgA8AAbB8BHKXdLopMAAAAAI8fTqX7pgAAAYM1XQPAAGwZAV8DAAABHqYGwABs/AEBXwMAAAGApg7ABwCSAEWmGAGmIaYjAACB1GADwABsHwGTARymKoKmKMAHANyBOgEAAYCmLMAHAJIAwABshQGKpjPABwDcHKYxgqYzwAcA3IE/AQABlADAAGyIPgE9HKZCgaY+wAcAroCcAgACgqZDwAcA3CamSAEcpkguilAAAAAAjyJfAwAAAMAAbMtKpmYBgaZtwAcArgaPJBimeqaEpzUAAIpSAAAAAQOmmKc1AAAAAQEBpp0AAACKU2ADwABsHwAAYAPAAGxVAT4ETqa6psEAAYGwYAPAAGxVAR6mx8AAbMoBAAGAptHABwF/AD0cpuSBpt3ABwGYgeMEAASTFqb3gabwwAcBmIDgwABsaham/y5UjxQWpwYuikmOzI8XAMAAbMg9F6cRLopJjswcpxYWpxEuikmOzI8XgT8BAAGApxnABwF/AMAAbIiPF0qnJAGBpyvABwGYBo8lGKc6p0WoUAAAilQAAAABA6daqFAAAAABAQGnXwAAAIpTYAPAAGwfAABgA8AAbWgBPgVOp32nhAABgbBgA8AAbWgBHqeKwABtagEAAYCnlcAHAkEATqelp6kAAIpVYAPAAGwfARanqy6KSY7MjxdFp7UBp76nwAAAgdRgA8AAbB8BkwEcp8eDp8XABwKZgToBAAGAp8nABwJBAMAAbIUBi6fSwAcCmRyn0IOn0sAHApmBPwEAAZQAwABsiD4CPRyn44Gn3cAHAlqAnAIAAoOn5MAHApkcp/Qcp+4Wp+kuVI8UKQEAAYKn78AHAnwAwABsuIHVAQABHKgGHKf8Fqf3LlSPFCkBAAEcqAGCp/3ABwJ8gT8BAAGUAMAAbIgAwABsuIJMAQABNwgAwABs4wDAAGy6AMAAbMs9iqgTwAcCfByoF4KoE8AHAnyBPwEAAZUAwABsiD0XqCcuikmOzByoLBaoJy6KSY7MjxeBPwEAARyoNYCoL8AHAkGCTAEAAZQAwABs4wDAAGyIjxdKqD8BgahGwAcCWgaPJhioVahXqNgAAIpWAAAAAQOohKjYAAABAAAEgS9gA49cAWADj1wAAAAAXwMAAAE+Ak6ok6iaAAGECmADwABsHwEcqJwuikwAAAAAjx9KqLQBHKjGFqi7LopHjxOKEgEBXwMAAAGAqM3ABwPxAI9uBo8nGKjdqPepnAAAilcAAAABA6k2qZwAAAEAAASBL2ADj1wBYAOPXAAAAABdA49xAV8DAAABPgJOqUWpTAABhApgA8AAbB8BHKlOLopMAAAAAI8fSqlmAR+pcY94AgFfAwAAAoCphcAHBGcWqY0uikePEwAGjygYqaGppqofAACKWAAAAAEDqauqHwAAAAEBAamwAAAAillgA8AAbB8AAFwBPgJAHKnkHKnSgKnIwAcEv4H6AQABHKnfgKnVwAcEv0QBAAGUAMAAbOEAwABs3icBAAGTAMAAbDKpyKnoAD0Xqe8uikmOzByqDhyqCRyp/Rap+C6KSY7MjxeBPwEAAYCp/8AHBL8AwABsiEQBAAGUAMAAbOGB+gEAARyqEICqEcAHBL+BWgAAAADAAGyPAMAAbN6PFwAABvqvAAb69gAG+5QABvwcAAb8ywAG/kAABv/QAAcAGgAHAFcABwFiAAcCJAAHA70ABwQuAAcEogAHBWQAAAAOAo8rGKokqiq6JwOKWgAAAWADwABsVgACYAOO0GADjtUFBI8tGKqtqsIGilsAYAPAAGwfAWqqwWADwABsHwMEjy8Yqtiq7hiKXI7MAF0DwABsXwJgA8AAbBhgA8AAbB8BMqrsYAPAAGwYYAPAAGwfAASPMBiq/6sbGIpdjswAXQPAAGwZAWADwABsGAExqxlgA8AAbBgABI8xGKssq0gYil6OzABdA8AAbBkBYAPAAGwYATGrRmADwABsGAAEjzIYq1GrYRiKX47MAGADwABsWwEqAgWPOhirZqtmq3MAAAADq3GrcwAAAAAAAABgA48rAT8BCQGrZsAAbFoAAAAABY87GLJ7snu4lgCKYAADsou4lgAAAAEBAbKbAAAAihpgA48OAABgA48rAT4KTrKzssUAAYphYAPAAGwfARyyzoCyx8AHBr2KSwAAAACPHk6y6rL8AAGKYmADwABsHwEcswWAsv7ABwa9iksAAAAAjx5OsyezOQABimNdA8AAbBkBYAPAAGwfAR6zP8AAbPwBAWADwABsHwGBs0nABwbSAEWzYQGzarNsAACB1GADwABsHwGTARyzc4SzccAHB0iBOgEAARazh4OzdcAHBxaA4MAAbGoAwABshQGMs5HABwdIHLOPhLORwAcHSIE/AQABlADAAGyIPgE9HLOtg7OcwAcHFoCcAgAChLOuwAcHSByzuoCzs8AHBr2KSwAAAACPHgDAAGzLTrPcs+4AAIpkXQPAAGwZAWADwABsHwEes/TAAGz8AQFgA8AAbB8BgrP+wAcG9ABFtBYBtB+0IQAAgdRgA8AAbB8BkwEctCiFtCbABwf9gToBAAEWtDyEtCrABwfLgODAAGxqAMAAbIUBjbRGwAcH/Ry0RIW0RsAHB/2BPwEAAZQAwABsiD4BPRy0YoS0UcAHB8uAnAIAAoW0Y8AHB/0ctG+AtGjABwa9iksAAAAAjx4AwABsy060i7SRAAAuYAPAAGwfAZNJtJoctLCBtJ7ABwbSgTsBAAGTAMAAbIY+Az0XtL0uil2OzB6008AAbPwBAWADwABsGAGBtODABwbSAI8wTrUAtQoAAYplYAPAAGxVARy1E4C1DMAHBr2KUgEAARa1OoO1KMAHBxaHD8AAbToAjyRFtUcBtVC1UgAAgdRgA8AAbB8BkwEctVmHtVfABwkCgToBAAEWtWsWtVsuil2OzI8wgODAAGxqAMAAbIUBj7V1wAcJAhy1c4e1dcAHCQKBPwEAAZQAwABsiD4FTrWItYwAAYHsYAPAAGwfARy1n4O1jsAHBxYpAQABh7WgwAcJAgDAAGy4TrWytbYAAYbuYAPAAGwYAR61vMAAbWwDAAOGtdHABwjNhbXcwAcIgBS148AHCVoIAAA9HLYAFrXxLopdjsyPMICcAgACh7YBwAcJAhS2BsAHCYQJAADAAGzLPRy2Fxa2Ey6KXI7Mjy+AnAIAAhS2GMAHCYQJABy2IYe2H8AHCQKCTAEAAZQAwABs4wDAAGxjPY22L8AHCIAUtjfABwlaCAA/TrZYtmoAAYpmYAPAAGwfAYW2bMAHCIBJtnccto2CtnvABwb0gTsBAAGTAMAAbIY+BE62nrakAAAuYAPAAGwfAZM9F7avLopejswetsXAAGz8AQFgA8AAbBgBgrbSwAcG9ACPMU628rb8AAGKZWADwABtaAEctwWAtv7ABwa9ilQBAAEct1Mctz4WtzmEtyfABwfLhw/AAG06RAEAAYa3QMAHCiYAwABs4YJLAQABlADAAGziAI8lRbdgAbdpt2sAAIHUYAPAAGwfAZMBHLdyFLdwwAcK4AkAgToBAAEWt4QWt3Quil6OzI8xgODAAGxqAMAAbIUBFbeOwAcK4Akct4wUt47ABwrgCQCBPwEAAZQAwABsiD4FTreht6UAAYHsYAPAAGwfARy30hy3vRy3uYS3qMAHB8spAQABFLe6wAcK4AkAAMAAbLhEAQABhre/wAcKJgDAAGzhgksBAAGUAMAAbOJOt+a36gABhu5gA8AAbBgBHrfwwABtbAMAAxS4BcAHCooIAIe4EMAHClcUuBfABws9CgAAPRy4NBa4JS6KXo7MjzGAnAIAAhS4NcAHCuAJABS4OsAHC4oLAADAAGzLPRy4Sxa4Ry6KXI7Mjy+AnAIAAhS4TMAHC4oLABy4XBy4VhS4VMAHCuAJAIJMAQABlADAAGzjgdUBAAFquF5gA8AAbB8DAMAAbLoAwABsYz2PuHnABwpXFLiBwAcLPQoAPwEJAbJ7wABsWgAAAAAFBo80GKt4q4itYQAAh34Baqt5YAPAAGxWgLUAAAEDq4utYQAAAAEBAauTAAAAh31gA8AAbBgAAGADwABsHwE+A06rpaupAACH52ADwABsHwEcq68Wq6suilyOzI8vKQEAAYCrsMAHDH4AwABsYUmrvRyrxYGrwcAHDJcnAQABKwDAAGwyPgNJq9YWq9ouil+OzI8yPgE9MKvuJ4pnP0msQRysRS6KaAEAAYCsVcAHDH4AjzY+Aj2JrGjABwyXHKyGFqx/FqxvLopdjsyPMIDgwABsaoJMAQABlADAAGzjPRyspRaslS6KXY7MjzA2AQABgKypwAcMfgDAAGxHPgI9iazJwAcMlxys7Rys5xas4Bas0C6KXo7MjzGA4MAAbGqCTAEAAZQAwABs44HVAQABaqzvYAPAAGwfAwDAAGy6PRytGhatCi6KXo7MjzE2AQABgK0ewAcMfgDAAGxHPRytORatNS6KXI7Mjy+AnAIAAoCtOsAHDH6BrUTABwyXAMAAbGM/Sq1TAYGtWsAHDJcGjzUYrWatea4XAACKEgFqrWdgA8AAbFaAtQAAAQOtfK4XAAAAAQEBrYEAAACH52ADwABsHwAAYAPAAGwYAT4BSa2MHK2qHK2VgK2RwAcODIH6AQABaq2XYAPAAGwfAwDAAGzeJwEAAZMAwABsMj4BSq24ARytzhatvy6KXY7MjzApAQABHK3TgK3PwAcODIJLAQABlADAAGziAMAAbLg+AUqt7QEcrgMWrfQuil6OzI8xKQEAARyuCICuBMAHDgyCSwEAAZQAwABs4gDAAGy4Bo82GK4criGu8gAAimgAAAABA64wrvIAAAABAQGuOAAAAIE+YAPAAGwYAABgA8AAbFsBPgJFrmUBrm6ucAAAgdRgA8AAbB8BkwEcrneBrnXABw7tgToBAAEWrn+ArnnABw7RgODAAGyRAMAAbIUBia6JwAcO7Ryuh4GuicAHDu2BPwEAAZQAwABsiD4BSa6UHK6sHK6egK6YwAcO0YMOAQABga6pwAcO7QDAAGz4gTsBAAFqrq5gA8AAbB+I+wDAAGyGPgFKrsMBKj9KruMBKQaPNxiu9678snYAAEUAAAABA68BsnYAAAABAQGvEQAAAIoXYAOO5wAAXAE+Ck6vJa8rAAEuYAPAAGwfARavNICvLcAHD6CECo8LPRyvR4CvQMAHD6CG6QEAARavYxavUy6KXY7MjzCA4MAAbGoAjwM9HK93gK9wwAcPoIbpAQABFq+TFq+DLopejsyPMYDgwABsagCPA06vpK+uAACKaWADwABsHwGTPgJOr8cAAAA8XQPAAGxKAWADwABsGAEWr8ceAMAAbC8BAV0DwABsIAFgA8AAbBgBFq/HLopdjsyPMAA9wABsS0UAAAEcr8eDAMAHEC4+AAAAAMAAbE0APgJOr8AAAACG7mADwABsGAEWr9iDAMAHEC5AwABsTz4CPYqv4MAHEBscr+qCr+DABxAbgT8BAAEWr/GEr+3ABxCFgODAAGyRAMAAbIg9HLAGgK//wAcPoIbpAQABgrASwAcQGwCPAz4CTrA4AAAAPF0DwABsSgFgA8AAbBgBFrA4HgDAAGwvAQFdA8AAbCABYAPAAGwYARawOC6KXo7MjzEAPcAAbEtFAAABHLA4gwDABxDsPgAAAADAAGxNAD4CTrAxAAAAhu5gA8AAbBgBFrBJgwDABxDsQMAAbE8+Aj2KsFHABxAbHLBbgrBRwAcQG4E/AQABHLBpFrBihLBewAcRQ4DgwABskYJMAQABlADAAGzjAMAAbIg9HLB8gLB1wAcPoIbpAQABgrCIwAcQGwCPAz4CTrCuAAAAPF0DwABsSgFgA8AAbBgBFrCuHgDAAGwvAQFdA8AAbCABYAPAAGwYARawri6KXY7MjzAAPcAAbEtFAAABHLCugwDABxG4PgAAAADAAGxNAD4CTrCnAAAAhu5gA8AAbBgBFrC/gwDABxG4QMAAbE8+AUWwxwGw0LDSAACB1GADwABsHwGTARyw2YWw18AHEjGBOgEAARaw34Sw28AHEg+A4MAAbJEAwABshQGNsOnABxIxHLDnhbDpwAcSMYE/AQABlADAAGyIPgE9HLD9gLD2wAcPoIbmAQABHLELhLEHwAcSD4MOAQABhbEWwAcSMQDAAGz4AI8APgJOsT0AAAA8XQPAAGxKAWADwABsGAEWsT0eAMAAbC8BAV0DwABsIAFgA8AAbBgBFrE9LopejsyPMQA9wABsS0UAAAEcsT2DAMAHErY+AAAAAMAAbE0APgJOsTYAAACG7mADwABsGAEWsU6DAMAHErZAwABsTz4BRbFWAbFfsWEAAIHUYAPAAGwfAZMBHLFohbFmwAcTL4E6AQABFrFuhLFqwAcTDYDgwABskQDAAGyFAY2xeMAHEy8csXaFsXjABxMvgT8BAAGUAMAAbIg+A06xibGXAACKamADwABsHwEcsZ2EsZnABxMNgw4BAAGFsajABxMvAMAAbPg9HLG7gLG0wAcPoIbmAQABHLHThrHFwAcThIH6AQABN4D/AMAAbN4AjwA9HLHrgLHkwAcPoIbmAQABHLIDhrH1wAcThIJLAQABNwgAwABs4gCPAD0Xshwuil+OzCmPMj0bskiPhxyyWBqySI+HgT8BAAEcsmoWsmOAslzABw+ghAqPC0QBAAGBsmzABw+yAMAAbOEAwABsiAaPOBi4m7iuuiUAAIFTAWq4nGADwABsVoC1AAABA7i2uiUAAAAAAAAAYAPAAGwYAT4ITrjMuM8AAIOcYAPAAG0GAR+41cAAbQwAAAAAPRy47IC46cAHFHmBZQEAASeKawDAAG0PPRy5DYC5CsAHFHmBZQEAASeKbADAAG0PPgJOuUYAAAA8XQPAAGxKAWADwABsGAEWuUYeAMAAbC8BAV0DwABsIAFgA8AAbBgBFrlGLopdjsyPMAA9wABsS0UAAAEcuUaBAMAHFMY+AAAAAMAAbE0APgJOuT8AAACG7mADwABsGAEWuVeBAMAHFMZAwABsTz4BPRy5YoC5X8AHFHmBZQEAASS5dAMnim2CuW/ABxUdJ4puAMAAbQ89HLmEgLmBwAcUeYFlAQABJ4pvAMAAbQ8+Ak65vQAAADxdA8AAbEoBYAPAAGwYARa5vR4AwABsLwEBXQPAAGwgAWADwABsGAEWub0uil6OzI8xAD3AAGxLRQAAARy5vYEAwAcVfD4AAAAAwABsTQA+Ak65tgAAAIbuYAPAAGwYARa5zoEAwAcVfEDAAGxPPgE9HLnZgLnWwAcUeYFlAQABJLnrAyeKbYK55sAHFdMnim4AwABtDz0cufuAufjABxR5gWUBAAEnhr4AwABtD0q6DQEcuheAuhTABxR5gVMAAAAAwABtEAAABwxWAAcN5AAHDrQABw+EAAcURgAHFkcAAAAFAo88GLtcu2K8AgOKcAAAAWADwABsVgAAAQSPPxi7g7uMGIpxjswAYAPAAGwfAZMBBY9DAAAAAAQAAAMAAAAAAAAAAABgA488AT8BCQEAwABsWgAAAAABBo9BGLuRu5a8AAAARQAAAAEDu5u8AAAAAAICArurAAAARWADjucAu7YAAACBPmADwABsHwAAXAE+Aj0cu8mAu8PABxbXijkBAAEcu+GBu9vABxbiRAEAARa74y6KcY7Mjz8AwABs4QCPBD0Xu+8uinGOzIG798AHFuKPPwAABxa7AAcXNwAAAAECj0QYvAW8C7y4A4pyAAABYAPAAGxWAAABBI9HGLwsvDUYinGOzABgA8AAbB8BkwEFj0sAAAAABAAAAwAAAAAAAAAAAGADj0QBPwEJAQDAAGxaAAAAAAEGj0kYvDq8Pry2AACKYAAAAAEDvEK8tgAAAAEBAbxSAAAAihpgA48OAABgA8AAbB8BPgNOvGS8agAAgT5gA8AAbB8BHLyGHLxzgLxswAcXuIpMAAAAAI8fgT8BAAEWvIguinGOzI9HAMAAbIg9F7yTLopxjsyBvJvABxfPj0dKvKYBgbytwAcXzwAABxebAAcYJAAAAAECj0wYvLu8wb1ZA4pzAAABYAPAAGxWAAABBI9PGLzdvOYYinGOzABgA8AAbB8BkwEFj1MAAAAABAAAAwAAAAAAAAAAAGADj0wBPwEJAQDAAGxaAAAAAAEGj1EYvOu88L1XAABFAAAAAQO89b1XAAAAAgICvQUAAACKF2ADjucAvREAAACBPmADwABsHwAAXAE+Aj0cvSWAvR7ABxikijsBAAEcvTiBvTLABxiwRAEAARa9Oi6KcY7Mj08AwABs4QCPBT0XvUYuinGOzIG9TsAHGLCPTwAABxiIAAcZBQAAAAECj1QYvVy9Yr4FA4p0AAABYAPAAGxWAAABBI9XGL1+vYcYinGOzABgA8AAbB8BkwEFj1sAAAAABAAAAwAAAAAAAAAAAGADj1QBPwEJAQDAAGxaAAAAAAEGj1kYvYy9kL4DAACKYAAAAAEDvZS+AwAAAAEBAb2kAAAAihpgA48OAABgA8AAbB8BPgNOvba9vAAAgT5gA8AAbB8BHL3THL3FgL2+wAcZhopNAAAAAI8ggT8BAAEWvdUuinGOzI9XAMAAbIg9F73gLopxjsyBvejABxmdj1dKvfMBgb36wAcZnQAABxlpAAcZ8gAAAAECj1wYvgi+Dr4zA4p1AAABYAPAAGxWAAABBI9fGL4qvjEYinaOzABgA8AAbB8BKwEFj2EAAAAABAAAAwAAAAAAAAAAAGADj1wBPwEJAQDAAGxaAAAAAAAAAAcaVgAAAAACj2IYvja+PL81A4p3AAABYAPAAGxWAAAAAQWPZwAAAAAEAAADAAAAAAAAAAAAYAOPYgE/AQkBAMAAbFoAAAAAAgaPZBi+S75Qvp0AAId+AAAAAQO+U76dAAAAAgICvmgAAACAvmADj1wAvnQAAACECmADwABsHwAAXAE+AT0XvomAvoLABxq9inaOzIG+k8AHGsmPXwaPZRi+or6mvzMAAIpDAAAAAQO+r78zAAAAAQEBvsQAAACAvmADj1wAAGADwABsHwE+AUq+0gE1vuAAAAEAYAPAAGwfARa+4IC+2cAHGxGKdo7Mj18jHL7ggb7gwAcbLCcBAAErAMAAbDIwvvQkvy4FJ4p4Fr8OgL8HwAcbEYVOwABtLSeBd4C/HMAHGxEninmBvuDABxssAWADwABsHwAABxqgAAca9AAHG5MAAAACAo9oGL84vz7AAEGzA4p6AAABYAPAAGxWAAABBI9rGL9Tv4EJilyOzABdA8AAbF8CYAPAAG1tXQPAAGxfAmADwABsH2ADj1wBMr9/YAPAAG1tXQPAAGxfAmADwABsH2ADj1wAAQWPcAAAAAAEAAADAAAAAAAAAAAAYAOPaAE/AQkBAMAAbFoAAAAAAgaPbRi/hr+LwABBLwAAinsAAAABA7+zwABBLwAAAQAABIEvYAOPXAFgA49cAgICv7YAAACAvl8DAAAAv8IAAACECmADwABsHwAAXAE+BE6/1r/lAAGKfF0DwABsXwJgA8AAbB9gA49cATW/6AAAAQBdA8AAbF8CYAPAAG1tXQPAAGxfAmADwABsH2ADj1wBFr/oLopcjsyPazW/7QAAAQBgA8AAbW0BLV8DAAA1v+wAAAEAXQPAAGxfAmADwABsH2ADj1wBHL/sgr/owAccmSkBAAGDv+3ABxzJAMAAbGEjHL/whL/swAcc3CcBAAErAMAAbF41wABADgAAAQBdA8AAbF8CYAPAAGwfYAOPXAEywABADmADwABsH2ADj1wANb/sAAABAFwBHL/sgr/owAccmYCcAgACg7/twAccyYXAAEAOwAcdJADAAGxjhcAAQA7ABx0khL/swAcc3AFdA8AAbF8CYAPAAGwfYAOPXE7AAEAdwABAJgABin1gA49cARzAAEA2gsAAQCjABxx+KQEAAYHAAEA3wAccagDAAGxhScAAQEQhHMAAQFGDwABASMAHHZ4nAQABKwDAAGxePgE9MMAAQGIkwABAYg0nin4tXwMAACdHgcAAQIjABxxqJ4dEFsAAQJ2AwABAlsAHHF6FTsAAbS0ngXeAwABAq8AHHF4ngPcnin8WwABA6YPAAEDgwAcdnoVOwABtLSeBd4PAAED3wAcdnj89HMAAQRqCwABBDMAHHH6AnAIAAoHAAEEbwAccaoDAAEElwAccXgDAAGxjBo9uGMAAQTTAAEE2wABBsQAAihIAAAABA8AAQVjAAEGxAAABAAAEgS9gA49cAWADj1wBAQHAAEFdAAAAhApgA8AAbB8AAF8DAAABPgFKwABBawEmwABBawE1wABBeQAAAQBgA49cARzAAEF5HMAAQXYWwABBci6KXI7Mj2spAQABLV8DAAAAwABsYSkBAAGAwABBesAHHrgAwABsYSMcwABBeYHAAEF5wAce3ScBAAErAMAAbF4wwABBhiTAAEGsBCeKgC1fAwAAJ0eAwABBpcAHHriBwABBecAHHt0BYAOPXF8DAAAAAAccLwAHHoMABx9pAAAAAgKPcRjAAEHxwABB98AAQrgDioEAAQAABIEvYAOPXAFgA49cAWADwABsVgAAAgSPcxjAAEI1wABCOwmECgBgA8AAbB8ABI90GMAAQlDAAEJaCYpHAGADj2gAAQWPeBjAAEJfwABCX8AAQo0AAAADwABCb8AAQo0AAAACAgLAAEJ1AAAEhApgA8AAbB8AwABCggAABIpHYAOPaAAAXQOPcQFfAwAAAT8DCAGPc4AAwAcf9ggBj3SBAMAHIAYJAcAAQl/AAGxaAAAAAAEGj3YYwABCksAAQpTAAEK2AACKEgAAAAEDwABCl8AAQrYAAAAAAAAAXwMAAAFKwABCnQEcwABCqBbAAEKdLopHj3SKEgEBXwMAAAEWwABCry6ECo9zAI9uAAAHIEQAByCcAAAAAQKPeRjAAEK7wABCwcAAQ7cDioIAAAFgA8AAbFYAAAMEj3sYwABC58AAQusJgYgAYAPAAGwYAASPfBjAAELzwABC+xiD8gBgA8AAbB8BkwSPfRjAAEMDwABDDBiKUwBgA8AAbB8BkwEFj4EYwABDEcAAQxHAAEMwAAAAA8AAQyXAAEMwAAAAAQEBwABDKwAABIGIYAPAAGwYAABgA495AT8CCAGPe4AAwAchMgkBwABDEcAAbFoAAAAAAQaPfxjAAEM1wABDPMAAQ7UAAIFTAAAAAQPAAENEwABDtQAAAAAAAABgA8AAbBgBSsAAQ0oBJMAAQ0cGHMAAQ1IWwABDTS6BiI97ioMBAAE3KADAAG1uJ4qEHMAAQ3YcwABDaxbAAENmLoPyj3yBUwAAAADAAG1vioUBAAE3CgDAAG1wJ4qGHMAAQ6gcwABDnRbAAEOXLopTj32BUwAAAADAAG1vioUBAAE3CADAAG1wJ4OjAAAHIWMAByIWAAAAAQKPghjAAEO6wABDwMAATGwDfQAAAWADwABsVgAAEQSPhBjAAEPmwABD9wSKhwBgA8AAbB8BkwSPhRjAAEQGwABEGQSKiABgA8AAbB8BkwSPhhjAAEQowABEQwSKiQBgA8AAbB8BkwSPhxjAAERSwABEZQSKigBgA8AAbB8BkwSPiBjAAER0wABEhQSKiwBgA8AAbB8BkwSPiRjAAESUwABEowSKjABgA8AAbB8BkwSPihjAAESywABEwQSKjQBgA8AAbB8BkwSPixjAAETQwABE3ASKjgBgA8AAbB8BkwSPjBjAAETrwABFAgSKjwBgA8AAbB8BkwSPjRjAAEURwABFJASKkABgA8AAbB8BkwSPjhjAAEUzwABFRQSKkQBgA8AAbB8BkwSPjxjAAEVUwABFagSKkgBgA8AAbB8BkwSPkBjAAEV5wABFjASKkwBgA8AAbB8BkwSPkRjAAEWbwABFrwSKlABgA8AAbB8BkwSPkhjAAEW+wABF0gSKlQBgA8AAbB8BkwSPkxjAAEX4wABGKgSKlgBdA8AAbBkBYAOPeQExwABGKGADj3kABI+UGMAARlDAAEZ7BIqXAF0DwABsGQFgA495ATHAAEZ5YAOPeQABBY+ZAAAAAAQAAAMAAAAAAAAAAABgA4+CAT8BCQEAwABsWgAAAAACBo+WGMAARoDAAEaMwABIbwABipgAAAABA8AARpHAAEhvAAAAAAAAAFwBPhE9G8AARpqPhJM9G8AARrGPhZM9G8AARsqPhpM9G8AARuuPh5M9G8AARwSPiJM9G8AARxuPiZM9G8AARzCPipM9G8AAR0WPi5M9G8AAR1ePjJM9G8AAR3SPjZM9G8AAR42PjpM9G8AAR6WPj5M9G8AAR8GPkJM9G8AAR9qPkZM9G8AAR/SPkpM9G8AASA6PkzHAAEg4YAOPeQA9G8AASECPlDHAAEhpYAOPeQAGj5cYwABIdMAASIDAAExqAAGKmQAAAAEDwABIhMAATGoAAAAAAAAAXAE+ET0ewABIjcAAbCcBAAEnipoAPR7AAEi1wABsJwEAASTAAEjiAieKmxrAAEjUj4QAPR7AAEjpwABsJwEAASTAAElFBSeKnBrAAEkRj4Unip0awABJLI+GJ4OjAD4CTsAASV4AAAA8XQPAAGxKAWADj3kBFsAASV4eAMAAbC8BAV0DwABsIAFgA495ARrAAElej5QAPcAAbEtFAAABHMAASV6AAMAHJX0+AAAAAMAAbE0APgJOwABJVQAAAIOeYAOPeQEWwABJcIAAwAclfUDAAGxPPgE9HsAASXjAAGwnAQABJMAASY8CJ4qegcAASYnAByXTAD0ewABJnMAAbCcBAAEkwABJywInip8awABJu4+HAD0ewABJ0sAAbCcBAAEkwABJ/wIniqAawABJ8Y+IAD0ewABKBsAAbCcBAAEkwABKMQIniqEawABKJY+JAD0ewABKOMAAbCcBAAEkwABKYwIniqIawABKV4+KAD0ewABKasAAbCcBAAEkwABKnQIniqMawABKiY+MAD0ewABKpMAAbCcBAAEkwABK0wIniqQawABKw4+NAD0ewABK2sAAbCcBAAEkwABLCAIniqUawABK+Y+OAD0ewABLD8AAbCcBAAEkwABLQQIniqYawABLLo+PAD0ewABLSMAAbCcBAAEkwABLdwIniqcawABLZ4+QAD0ewABLfsAAbCcBAAEkwABLpgIniqgawABLnY+LAD0ewABLrcAAbCcBAAEkwABL3QIniqkawABLzI+RAD4CTsAAS/YAAAA8XQPAAGxKAWADj3kBFsAAS/YeAMAAbC8BAV0DwABsIAFgA495ARrAAEv2j5MAPcAAbEtFAAABHMAAS/aAAMAHJ2A+AAAAAMAAbE0APgJOwABL7QAAAIOeYAOPeQEWwABMCYAAwAcnYEDAAGxPPgE9HsAATBHAAGwnAQABJMAATCgCJ4qegcAATCLABye2AD0ewABMNcAAbCcBAAEkwABMZQIniqoawABMVI+SAAAAByQdAAck9AAHKBQAAAACAAACBo7OGLoqui66wQABiqsAAAABA7o9usEAAAABAQG6RQAAAIE+YAPAAG0WAABgA8AAbB8BPgNOula6WgABiixgA8AAbXEBHrpgwABtcwEAATcIAD0cunOBum/AByheiqwDAAOTgLqBwAcoRWq6j2ADwABs2oDYAMAAbXVKupoBHLqlgbqhwAcoXoqtAgACk2q6uGADwABs2oDYAMAAbXYGjs8YusS6y7tZAAGKrgAAAAEDutq7WQAAAAEBAbrfAAAAiq9gA8AAbB8AAGADwABtFgE+A06677rzAAGKLGADwABtcQEeuvnAAG1zAQABNwgAPRy7DIG7CMAHKPyKsAMAA5OAuxjAByjjarslYAPAAGzagNgAwABtd0q7MAEcuzuBuzfAByj8irECAAKTartQYAPAAGzagNgAwABteAEYAAcpZAAG3x4ABt+fAAbgIAAG4GoABuDwAAbhbQAG+PQABwWlAAcWZAAHF0QABxgxAAcZEgAHGf8ABxpfAAcbpAAHH3oAByCpAAciIwAHKCUAAAASAAcoKAAHKMYABylkAAAAAgACCI+airIZAAAhgP0AAIFoAAEBBmJrgsqCuYK8gsiB9wAAgi4AAQADgs90hjeCRwAAgi6KswEBAnSGN4KUAACBaQABAQFzgtYAAI07AAEBAXmDDgAAnGgAAQECirSKtYNrAACb+QABAQGKtoOpAACZSQABAQKKt4q4hAIAAJYgAAEBAoq5irqEWQAAmrcAAQEDiruKvIq9hM4AAJxvAACE5wAAjswAAQEBilqFHgAAnPwAAIU7AACeSgAAhU4AAJ+dAACFagAAoN8AAIWEAAChBQABAQyKvoq/isCFM4rBisKKw4rEisWKxorHisiHKQAAoSoAAQEBismHZQAAoYUAAQEBisqHkwAAon0AAQEBisuH0AAAoqcAAQEEisyKzYrOis+ILwAAkOwAAQEBgICIWwAApN4AAQEBitCIlAAApO0AAQEBitGI4AAApR8AAQECitKK04khAAClPgAA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Ao+aAQABFsAA0iYWwADSHy6K+I/Ei5ahvQCQFwaQGRnAANKhwADSpsAA074AAIwQj5oAAAABA8AA0rLAANO+AAAAAQEBwADSxwAAAIUUYAOI5wAAXAE+AUnAANLXHMAA0uIWwADS2y6K+I/EjAwBAAGAwADS7cAHvxUAoaA+AT0cwADTBBbAANMALosDj8+MEQIAAhzAANMfFsAA0xguiviPxIwOAQABgMAA0y/AB78VAKGmHMAA00sWwADTRC6K+I/EjA8BAAGAwADTYMAHvxUAoaIAnN4+AT0cwADTgxbAANN/LosDj8+MEgEAARzAANOXFsAA05AuiviPxIuRAQABgMAA06rAB78VAKGhAJzNBpAaGcAA1AvAANQQwADVRQAAjBOPmgAAAAEDwADUHcAA1UUAAAABAQHAANQpAAAAhYpgA4UaAABgA8AAbFsBPgVOwADUP8AA1EcAAIwUYAPAAGxbASpJwADUVCXAANRiAIDAANRYwAfACmADhlw+Aj2IwADUcsAHwAoWwADUkSbAANSJAIDAANR/wAfACmADhlyFgoZePYnAANSgwAfAIyk/PRzAANS6LouDj5oBAAGAwADUyMAHwAoAkABJwADU2BzAANTwFsAA1NwuiuePsoRBAQABgMAA1PvAB8AKAKKGPgE9HMAA1RMWwADVDy6LA4/PjBUBAAGTAJzvP0rAANUzAYHAANU6wAfAIwaQGxnAANWxwADVtsAA2DQAAIwWj5oAAAABA8AA1c3AANg0AAAAAQEBwADV2QAAAIWKYAOFGgAAYAPAAGxbAT4FScAA1eoWwADV9hbAANXuLh+PqowXkPk+AUrAANYTASs/ScAA1pslwADWqQCAwADWn8AHwRZgA4ZcPgJOwADWv8AA1scAAYWCYAPAAGxbARzAANbJLowWj5oBAAEWwADW6xTAANbhwAfBFgABYAOGXIWChl4AkBtKwADW+wEjIRzAANcLgcAA1wPAB8FqJwEAASsAwABsXiGBwADXF8AHwWorAWADwABsWz9JwADXMSXAANc/AIDAANc1wAfBFmADhyw+AUrAANdXARbAANdoFMAA117AB8EWAAFgA4csgT6HLj9JwADXeSXAANeHAIDAANd9wAfBFmADh74+Ak7AANevwADXuAAAheBgA4pQARbAANfEFMAA17rAB8EWAAFgA4e+heCH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FykWwAEXIi6K+I/Ei5ShuQCcxT0cwAEXVxbAARdTLosDj8+LkAEAARbAARdnFsABF2AuiviPxIxVobMAnMU9HMABF4wWwAEXiC6LA4/PjFYBAAEcwAEXoBbAARedLosCj86LzAEAARbAARexLouqkLwAnjIAnN89HMABF9kui9iPmgEAAYLAARflwAfvygCQBz0cwAEYAS6L2I+aAQABHMABGB+CwAEYDcAH78qBPwEAARbAARg5FsABGCqBwAEYIcAH5I2DY4TzgODAAGxqAMAAbIgAkAc9HMABGEoui+OPmgMAAxbAARhmLouykMAcwAEYiBbAARh8Lorlj7CL5AEAAZcApK6XAJANPRzAARitFsABGKkuiwOPz4wSAQABFsABGMEWwAEYui6K+I/Ei5ShuQCczT4DPRzAARj+FsABGPouiwOPz4uQAQABFsABGQ4WwAEZBy6K+I/EjFWhswCcxT0cwAEZMxbAARkvLosDj8+MVgEAARzAARlHFsABGUQuiwKPzovMAQABFsABGVgui6qQvACeMgCc3z0cwAEZhBbAARmALosDj8+MEgEAARbAARmYFsABGZEuiviPxIuUobkAnM0/ScABGc0iIRzAARnmFsABGdEuiuuPticBAAErAMAAbF4AIRzAARn6gcABGfHAB+SNJwEAASsAwABsXj4BPRzAARoLLoxjj5oBAAGBwAEaI8AH5I0AkCY/BpAkGcABGjvAARpAwAEdGAAAjFePmgAAAAEDwAEaW8ABHRgAAAABAQHAARpiAAAAjGRgA5xwAABcAT4JTsABGonAARqbAACMZWADnHABH8ABGqGcfAAAAAA9HMABGrMWwAEary6LA4/Pi5ABAAEWwAEawxbAARq8Lor4j8SMVaGzAJzFPRzAARrkFsABGuAuiwOPz4xWAQABHMABGvgWwAEa9S6LAo/Oi8wBAAEWwAEbCS6LrJC9AJ4yAJzfPRzAARswFsABGywuiwOPz4vTAQABFsABG0YWwAEbPy6K+I/Ei5ShuQCczD0cwAEbcBbAARtsLosDj8+L2wEAARzAARuEFsABG4EuiwKPzoxmAAAAAJ47AJzHPRzAARumFsABG6IuiwOPz4xnAQABgcABG7nAB/JkAJy9PRzAARyKFsABHIYuiwOPz4xYAgACkxbAARyuFsABHKcuiviPxIxaobYAnPI9HMABHM8WwAEcyy6LA4/PjBsBAAGAwAEc2MAH8lAAnLo9HMABHP0WwAEc+S6LA4/PjCMBAAGBwAEdAsAH8mQAnJUGkCUZwAEdHcABHSLAASBIAACMWY+aAAAAAQPAAR09wAEgSAAAAAICAsABHVIAAACEx2ADhO4AwAEdYgAAAIxkYAOccAAAXAE+Bk7AAR2SwAEdnwAAjD9dA8AAbBkBYAOJVQEewAEdoaEOAQABgMABHcHAB/P2AEnAAR3QHMABHeGCwAEd1MAH9BgnAQABKwDAAGxiPgFKwAEd8gA/PRzAAR4JFsABHgUuiwOPz4xoAQABgcABHiPAB/QEAJy8ScABHqUiFsABHqkuivOPvwAcwAEe2ILAAR6+wAf0GIf+AQABNMABHtwDwAEe3MABHxUAAAABAQHAAR7dAAAAi0ZgA4lVAABgA8AAbFsBSsABHuMBHsABHuOWKAIAAoPAAR74wAf0wxbAAR77Lor2j8IAAMAAbVU+Az0cwAEfJBbAAR8gLosDj8+LkAEAARbAAR80FsABHy0uiviPxIxVobMAnMU9HMABH1cWwAEfUy6LA4/PjFYBAAEcwAEfaxbAAR9oLosCj86LzAEAARbAAR98LouqkLwAnjIAnN89HMABH6YWwAEfoi6LA4/PjBIBAAEWwAEfuhbAAR+zLor4j8SLlKG5AJzNPz0cwAEf5y6L0o+aAQABgsABH/nAB/QYAJAPPRzAASAQFsABIAwuiwOPz4wSAQABFsABICQWwAEgHS6K+I/Ei5ShuQCczQaQJhnAASBNwAEgUsABIQ4AAIxjj5oAAAABA8ABIGnAASEOAAAAAQEBwAEgdwAAAITHYAOE7gAAXAE+Aj0cwAEgpRbAASCQgMABIIfAB/YChHCE9YGxAQABFsABIK0ujGmPmpAnAMAAbQM9HMABIOkWwAEg0xbAASDMLor4j8SMT6HNgbEBAAEWwAEg8S6MaY+akCcAwABtAwaQJxnAASETwAEhGMABIoAAAIxpj5oAAAABA8ABITDAASKAAAAAAQEBwAEhRQAAAIUUYAOI5wAAXAE+Ak7AASFbwAEhXgABjDVgA6VrARzAASF0FsABIWAuiuuPtikBAAGAwAEhdcAH9psAwABsYUnAASGEIiEcwAEhi4HAASGIwAf2rycBAAErAMAAbF4AIRzAASGnFsABIZmBwAEhlsAH9q+MGqV5JwEAASsAilU+Aj0cwAEhuC6L4I+aAQABFsABIcyBwAEhycAH9q+MGqV5AJAKPRzAASHmFsABIeIuiwOPz4wSAQABIxzAASH6FsABIfMuiviPxIwMAQABgMABIgXAB/abAKGgHMABIiIWwAEiGy6K+I/EjGoBAAGAwAEiPMAH9psAoaMcwAEiWRbAASJSLor4j8SLkQEAAYDAASJswAf2mwChoQFgA8AAbB8AnM0/BpAoGcABIoXAASKKwAEmrQAAjDCPmgAAAAEDwAEinsABJq0AAAABAQHAASKsAAAAhMdgA4TuAABcAT4DPRzAASK8Loxrj5oAAAAAkD5JwAEi3SIWwAEi6RbAASLhLh+Pqow5kPQAHMABIxcWwAEjBBbAASL9Lor4j8SMbKGvgTsBAAGTAMAAbIY+AT0cwAEjbxbAASNcFsABI1guiwOPz4w6nI2G8wMAAxbAASN+FsABI3ouiwOPz4QKnJIWwAEjjRbAASOGLor4j8SMB6GwIyEcwAEjtYDAASOswAf38CcBAAErAMAAbF4WwAEjyIDAASO/wAf38IQBglkWwAEj5RbAASPVLorwj7yEAYJZAWADwABsHwChdj9JwAEj/RbAASQIFsABJAEuiviPxIxtocs+AknAASR3IRbAASR8Lorzj78+AknAASSRFsABJJwWwAEklS6K+I/Ei4+hvD4BPRzAASS/Loxuj5oBAAEWwAEk2xbAASTULor4j8SLkqG7AJAqP0nAASUCFsABJQ0WwAElBi6K+I/EjG+hvj4DPRzAASUxLowGj5oBAAEWwAElUxbAASVMLor4j8SMcKG/AJAVPRzAASV3FsABJXMuiwOPz4uQAQABHMABJYcWwAElgC6K+I/Ei5EBAAEWwAEloRbAASWaLor4j8SLlqG9AKGhAJzFPRzAASW6LowQj5oBAAEWwAElzhbAASXHLor4j8SMcKG/AJAZPz9JwAEl/CEcwAEmCYDAASYAwAf38CcBAAErAMAAbF4+Aj0cwAEmOhbAASYlgMABJhzAB/fwhHCE9YGxAQABFsABJkIujG6PmpAqAMAAbQM9HMABJn4WwAEmaBbAASZhLor4j8SMT6HNgbEBAAEWwAEmhi6Mbo+akCoAwABtAz8/BpApGcABJrLAASa3wAEqawAAjDGPmgAAAAEDwAEmy8ABKmsAAAABAQHAASbZAAAAhMdgA4TuAABcAT4BScABJukWwAEm9RbAASbtLh+PqowckPU+AknAAShzIhbAASh/FsABKHcuH4+qizKQ8gAhHMABKJ+AwAEolsAH+pknAQABKwDAAGxePgROwAEotsABKLoAAIpVYAPAAGwfAWrAASjFYAPAAGwfhRlJwAEo1xbAASj0FsABKOSAwAEo28AH+pmEcYT2IsAAbCI+AT2JwAEpDMAH+voWwAEpMBbAASkrFsABKRuAwAEpEsAH+pmEcYT2hw/AAG06hAGCWUnAASlLFsABKW0WwAEpWIDAASlPwAf6mYRwhPUiwABsIj4BPYnAASmFwAf6+hbAASmuFsABKakWwAEplIDAASmLwAf6mYRwhPWHD8AAbTqEAYJZP0nAASnMHMABKdSBwAEp0MAH+vonAQABasABKeBgA8AAbB+FGQDAAGwyPgE9icABKfbAB/r6FsABKgWAwAEp/MAH+pmEAYJZPz0cwAEqIy6LiI+aAQABgcABKjnAB/r6AI//Pz0cwAEqURbAASpNLosDj8+MHQAAAACc8T8GkCoZwAEqcMABKnXAASxnAACMbo+aAAAAAQPAASqJwAEsZwAAAAEBAcABKp4AAACFFGADiOcAAFwBPgFJwAEqrhzAASq5FsABKrIuiviPxIwMAQABgMABKsTAB/xmAKGgPgRJwAEq1xbAASrjFsABKtsuH4+qjDmQ9D4BPRzAASr/Loxej5oCAAKAwAErFcAH/GYWwAErMRbAASsfLorxj72EAYJZAJArPz0cwAErTC6MBo+aAQABgMABK2fAB/xmAJAVPRzAASt8FsABK3guiwOPz4uQAQABHMABK4wWwAErhS6K+I/EjGoBAAGAwAErpsAH/GYAoaMAnMU9HMABK7gujBCPmgEAAYDAASvFwAf8ZgCQGT8GkCsZwAEsbMABLHHAAS5uAACMXo+aAAAAAQPAASyGwAEubgAAAAICAsABLKIAAACFFGADiOcAwAEssAAAAIxxYAPAAGwfAABcAT4DQCEcwAEs4BbAASzbgMABLNLAB/19gYiI6ycBAAErAMAAbDbAASzSwAEs5wBOwAEs88ABLP4AAIwMYAPAAGxbARzAAS0HFsABLQAuiviPxIwMAQABgMABLRLAB/19AKGgPRzAAS04FsABLSUWwAEtIS6LA4/PjDqcjYxyBwAHFsABLVUWwAEtUS6LA4/PhAqckoLAAS1lwAf9zSOCwAEtecAH/c0cwAEtmRbAAS2SLor4j8SMDwEAAYDAAS2uwAf9fQChohzAAS3NFsABLcYuiviPxIuRAQABgMABLeDAB/19AKGhAWADwABsHxzAAS32FsABLfMuiwKPzoxQAQABFsABLgeAwAEt/sAH/X2BiIjrAJ4pHMABLhkWwAEuFi6LAo/OjCoBAAEWwAEuKoDAAS4hwAf9fYGXiO0AnjUWwAEuQoDAAS45wAf9fYQBglmBwAEuVsAH/YsAoXcGkM4ZwAEuc8ABLnzAAS7gAQCMcwAAAAEDwAEupsABLuAAAAAAAAAAYAPAAGxbAUrAAS6vASIhFsABLrAuivOPvwAhHMABLtcWwAEu0hbAAS7NFsABLr0uivCPvIGIg7CBiIkiJwEAASeAlQDAAGw2BpDPGcABLuXAAS7uwAEwRgEAjHQAAAABA8ABLx3AATBGAAAAAAAAAGADwABsWwFKwAEvJgEiIiEcwAEvQhbAAS8mLorqj7UnAQABKwDAAGxeACEWwAEvcBbAAS9ULorqj7WMdaWpACEWwAEwOBbAATAcLorqj7WMdqWqBpAsGcABMEvAATBSwAExbQAAjHePmgAAAAEDwAEwb8ABMW0AAAAAAAAAYAODrAE+AknAATB4IRbAATB9Lorzj78+Ak7AATCWwAEwnQABhERgA4OsARbAATCfLorwj7xJwAEwtiIiFsABMMGAwAEwusAIACqExIO6ACXAATDmAIDAATDfwAgAKmADhEsAFsABMQcUwAExAMAIACoAAWADhEuE8oRkPgFKwAExIwEWwAExMRTAATEqwAgAKgABYAOES4T1hHM/P0rAATFeASsGkC0ZwAEyRMABMlHAATdbAACMeI+aAAAAAQPAATJrwAE3WwAAAAICAsABMoAAAACMeWADhO4AwAEyjQAAAIx6YAODrAAAYAOWOAE+CUnAATKlHMABMrqBwAEyqcAIAOsnAQABKwDAAGxePgFKwAEyywErP07AATLuwAEy+gABjHtgA4MyARbAATMNgcABMvzACADrgzODtE7AATMxwAEzSQABjHxgA4pBARzAATNdFsABM1MugRaPp4LgAgACFsABM3IugzOPu4LAATOCwAgBKQCBgEnAATOUHMABM7CDwAEzmMAIAU0nAQABKwCKTD4BPTDAATPBJMABM8EIJ4x9gsABM8/ACAEpJ4x+J4F3FsABNBYugzOPuyeMfxbAATQ7Lorwj7wng6M/QBzAATSBFsABNHeDwAE0X8AIAU2C04pGJwEAAYLAATSEwAgBKQDAAGxewAE0X8ABNI8AQBzAATTKFsABNMMWwAE0tYPAATSdwAgBTYNzikSA4MAAbGonAQABFsABNPAWwAE04YLAATTVwAgBKYNjg0KA4MAAbGoAwABsMsABNJ3AATT2AE7AATUgwAE1JAABgqFdA8AAbF8CYAOKJmADiVUBHsABNTLAAG18AgJgA4omYAOJVQIWwAE1doLAATVqwAgBKYNjg0IWwAE1noPAATWGwAgBTYNzikQAScABNbIhHMABNdAWwAE1x4HAATW2wAgA64THg74nAQABKwDAAGxePgNOwAE158ABNfwAAYyAXQPAAGwZAWADiiYBFsABNhgWwAE2D4HAATX+wAgA64THg76DY4TzQBzAATZQFsABNkkWwAE2OoDAATY1wAgA3YNjhPOA4MAAbGonAQABFsABNmiFwAE2U8AIAuOA4MAAbGoAwABsMsABNjXAATZuAEXAATZ3AcABNoDAATaCAACB1GADwABsHwGTARzAATaJhsABNofACANlgToBAAEWwAE2oIXAATaLwAgC44DgwABsagDAAGyFAY7AATaqwAgDZRzAATaohsABNqrACANlgT8BAAGUAMAAbIg+AT0cwAE2uoTAATa3wAgCZICcAgACHMABNs+FwAE2u8AIAuMpAQABhsABNtDACANlAMAAbLgfwAE25ooRAgACHMABNwsWwAE2/YDAATb4wAgA3YNjhPMpAQABhsABNwzACANlAMAAbLhqwAE3HGADiUeE5QAAwABsYz9KwAE3NwEewAE3S5Y8AQABhMABN1PACAJkAAaQLhnAATfnwAE4BMABOiwAAIyBj5oAAAABA8ABOBjAATosAAAAAwMDwAE4JgAAAITHYAOE7gDAATg9AAAAjHpgA4OsAMABOFwAAACMgmADljgAAF0DwABsXwJgA4omYAOJVQE+BEnAATh6IhbAATiWFsABOIeAwAE4fsAIBIeDY4TzgVbAAGzzARzAATiygcABOKHACASVJwEAASsAwABsXj4BSsABOMMBKz9OwAE44MABOPEAAYyDXQPAAGxfAmADiiZgA4lVATLAATkMYAOKJmADiVUARcABORQBwAE5HcABOR8AAIHUYAPAAGwfAZMBHMABOSaEwAE5JMAIBTuBOgEAARbAATlAFsABOTGAwAE5KMAIBIeDY4TzgODAAGxqAMAAbIUBjMABOUrACAU7HMABOUiEwAE5SsAIBTuBPwEAAZQAwABsiD4CTsABOV7AATlkAACFOWADiVUBHMABOYiCwAE5ZsAIBKODZwEAARbAATnDHMABOb8WwAE5sRbAATmogcABOZfACASVhMeDvoNjhPMpAQABhMABOcDACAU7AMAAbLiFOYorAJZHPRzAATnhg8ABOdHACAULgJwCAAIcwAE5+RbAATnrgMABOeLACASHg2OE8ykBAAGEwAE5+sAIBTsAwABsuIXAAToAwAgFqwDAAGxjSsABOhEBg8ABOhjACAULBpAvGcABOrLAATrVwAFAswAAjISPmgAAAAEDwAE68cABQLMAAAADAwPAATsGAAAAhMdgA4TuAMABOx0AAACMemADg6wAwAE7QgAAAIyCYAOWOAAAXQPAAGxfAmADiOdgA4lVAT4GScABO2AcwAE7dYHAATtkwAgGnicBAAErAMAAbF4+AUrAATuGASs/ScABO54lwAE7swCBwAE7osAIBp5gA4PMPgFJwAE7xRbAATvoJsABO9oAFsABO8ouivCPvGADhEuE/YRsPgFKwAE7/AFqwAE8A10DwABsXwJgA4jnYAOJVYm6PgNAFsABPKImwAE8lAAWwAE8hC6K8I+8YAOES4N/hG3AATyDwAE8qgBAIiIWwAE81BbAATzFgMABPLzACAaQg2OE84FWwABs8wAcwAE9EBbAAT0JFsABPPSAwAE868AIBpCEcIT1gODAAGxqJwEAAZQAwABsMgAcwAE9RBbAAT09FsABPS2AwAE9JMAIBpCEcYT2gODAAGxqJwEAAZMAwABsMsABPLzAAT1IAErAAT1TATLAAT15YAOI52ADiVUBFsABPaMWwAE9joDAAT2FwAgGkIRwhPWA4sAAbGscwAE90ILAAT25wAgGrINnAQABFsABPfAUwAE938AIBp4BAWADg8yBl4POAJZHP07AAT4awAE+KwABjIVdA8AAbF8CYAOI52ADiVUBMsABPkxgA4jnYAOJVQBFwAE+VAHAAT5dwAE+XwAAgdRgA8AAbB8BkwEcwAE+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t7EWwAG3qYDAAbekwAhh/IOdh5CA4MAAbGoAwABshQGKwAG3ucAIY+EcwAG3uoLAAbe5wAhj4YE/AQABlADAAGyIPgg9HMABt9sWwAG31y6LA4/Pi5ABAAGBwAG35MAIY4cAnMU9HMABt/Mui9iPmgEAARzAAbgBgsABt//ACGPhge8BAAGVAMAAbNMAkAc9HMABuA8ui4OPmgEAARbAAbgtHMABuCkWwAG4IoDAAbgdwAhh/IOdh5ApAQABgsABuCrACGPhAMAAbLiBPIebAJAAPRzAAbg/FsABuDsuiwOPz4zVAAAAAJzbPRzAAbhzFsABuG8uiwOPz4uQAQABgcABuHzACGOHAJzFPRzAAbiLLovYj5oBAAEcwAG4nRzAAbiZgsABuJfACGPhge8BAAGVAMAAbNOBPwEAAZQAwABsiACQBz0cwAG4qy6Lg4+aAQABFsABuMkcwAG4xRbAAbi+gMABuLnACGH8g52HkCkBAAGCwAG4xsAIY+EAwABsuIE+h5wAkAA9HMABuN0WwAG42S6LA4/PjNUAAAAAnNtAFsABudoWwAG5yy6LnpC1hQCEccABucvAAbnjAD0cwAG56i6L44+aAwADFsABufkui56QtRzAAboVFsABugkuiuWPsIvkAQABlQCkrpUAkA0GkEkZwAG6NcABujrAAb/PAACM6Y+aAAAAAQPAAbpmwAG/zwAAAAICAsABunUAAACM6mADnmQAwAG6jgAAAIQNYAOGBAAAXAE+AkFHwAG6moDAAbqiwAhmJgQBwAG6vmrAAbq+YAOeZInuAD4CScAButMlwAG65QAWwAG63IHAAbrXwAhmNIVJhgZgA4c1PgE9HMABuwEui4OPmgEAARbAAbspFsABux4WwAG7FIHAAbsPwAhmNIGthgiFW4XngOLAAGxrAJAAPgE9HMABu00ui4OPmgEAARbAAbtggcABu1vACGY0hUmGBgCQAELAAbt9AALAAbuXasABu5dgA55kigLAAbu1asABu7VgA55kihYAPgI9HMABu8wui4OPmgEAARbAAbvfgcABu9rACGY0hUmGBgCQAELAAbvyABjAAbwMasABvAxgA55kiirAAbwnasABvCdgA55kij7AAbxCasABvEJgA55kilLAAbxdasABvF1gA55kimbAAbx9asABvH1gA55kinrAAbyYasABvJhgA55kio7AAby2asABvLZgA55kiqLAAbzTasABvNNgA55kirbAAbzxasABvPFgA55kisrAAb0MasABvQxgA55kit7AAb0nasABvSdgA55kivLAAb1IasABvUhgA55kiwbAAb1pasABvWlgA55kixrAAb2KasABvYpgA55kiy7AAb2rasABvatgA55ki0LAAb3MasABvcxgA55ki1bAAb3qasABvepgA55ki2rAAb4IasABvghgA55ki37AAb4masABviZgA55ki5LAAb5EasABvkRgA55ki6bAAb5oasABvmhgA55ki7rAAb6MasABvoxgA55ki87AAb6wasABvrBgA55ki+LAAb7UasABvtRgA55ki/YAPgM9HMABvu4ui4OPmgEAARbAAb8BgcABvvzACGY0hUmGBgCQAD0cwAG/FC6Lg4+aAQABFsABvzwWwAG/MRbAAb8ngcABvyLACGY0ga2GCIVbheeA4sAAbGsAkABCwAG/TQAAAT4BPTDAAb9sJMABv5sCJ40GgMABv5TACGYmPRzAAb+sFsABv6guiwOPz40HAQABgMABv8TACGYmAJy3BpBKGcABv9TAAb/ZwAHA1gAAjQiPmgAAAAEDwAG/6cABwNYAAAADAwPAAb/6AAAAhA1gA4JKAMABwAcAAACDG2ADg6wAwAHAIwAAAIVJYAOFGgAAYAPAAGxbAUrAAcA2ASIewAHANqEUAwADgcABwEbACGl6gsABwFfACGmIFsABwGEuiuGPqQABIiEcwAHAkxbAAcB+Lorrj7YnAQABKwDAAGxeABzAAcDONcABwLwAAAEAYAOlawEcwAHAvBbAAcCoLorrj7YpAQABgMABwL3ACGlsAMAAbGEjHMABwLyDwAHAvMAIae8nAQABKwDAAGxeKxbAAcDEg8ABwLzACGnvjQmlfAFgA8AAbFsnAQABKQDAAGxeBpBLGcABwNvAAcDgwAHG4AAAjQqPmgAAAAEDwAHA8MABxuAAAAAHBwfAAcD9AAAAhA1gA4JKAMABwRgAAACNC2ADnTcAwAHBNQAAAIMbYAODrADAAcFRAAAAgOVgA4kfAMABwW4AAACFSWADhRoAwAHBggAAAIvoYAPAAGwfAMABwaQAAACL52ADovAAAFwBPgdOwAHBucABwcMAAYn5YAPAAGxbARzAAcHVgsABwcXACGqfJwEAASsAwABsXk7AAcHowAHB9AABi+xgA8AAbFsBIiEcwAHCBYHAAcH2wAhqkScBAAFqwAHCF2ADnTeJiQDAAGxeABzAAcIpLo0Ij5oDAAOAwAHCOsAIaoOCwAHCQMAIap+EwAHCUcAIarsAkEpJwAHCYSIhHMABwnoWwAHCZS6K64+2JwEAASsAwABsXgAhHMABwoqAwAHChcAIaoMnAQABKwDAAGxePgE9HMABwpsui/GPmgIAAibAAcKvAYDAAcKvwAhqg2ADglIWwAHCuRbAAcK1LosDj8+ECpySAJAgP07AAcLSwAHC3AAAjQxgA8AAbFsBKknAAcLpIiIhHMABwvyBwAHC7cAIapEnAQABasABww5gA503iYkAwABsXgAhh8ABwxnACGrtACEUwAHDJ8AIaxkIAD4CTsABw0LAAcNVAAGNDWADiVUBHsABw1ehEgIAAoTAAcNlwAhquxbAAcNvLorhj6kAScABw4kewAHDjaEVAgACgsABw6nACGqfFMABw7rACGxKCgAAPgNOwAHD38ABw+sAAY0OYAPAAGwfARzAAcPwFsABw+0uiwKPzo0PBAAEgcABxBrACGqRgsABxCrACGqfhsABxDvACGrZFMABxETACGxKCgAAni49HMABxGUWwAHEYS6LA4/PjRACAAIUwAHEg8AIbKALAIXAAcSQwAhqyQCc0T0VwAHEqMAIa/EJKT8/ScABxM0hFMABxNLACGvxCQA+Ak7AAcTrwAHE9wABjQ5gA8AAbB8BHMABxPwWwAHE+S6LAo/OjREEAASBwAHFF8AIapGCwAHFJ8AIap+DwAHFOMAIaq2GwAHFRMAIatkAnjBJwAHFVIfAAcVYwAhq7T4CQCEUwAHFdcAIaxkIAMABxXTAAcWAAD0cwAHFjxbAAcWLLosDj8+NEgIAAhTAAcWfwAhtPgoAhcABxazACGrJAJzUScABxckUwAHFzcAIaxkIAD4BPRzAAcXoFsABxeQuiwOPz40TAgACFMABxgPACG0+CgCFwAHGEMAIaskAnNM+AT0cwAHGOxbAAcY3LosDj8+MLAIAAhTAAcZNwAhtPgoAhcABxlrACGrJAJzQP0nAAcZ9IiEcwAHGlhbAAcaBLorrj7YnAQABKwDAAGxeACEcwAHGpoDAAcahwAhqgycBAAErAMAAbF4+AT0cwAHGty6L9I+aAQABJsABxtEBgMABxtHACGqDYAOCUgCQIT8GkEwZwAHHQsABx0fAAc2wAACNFI+aAAAAAQPAAcdcwAHNsAAAAAICAsABx24AAACEDWADhgQAwAHHeAAAAIvoYAPAAGwfAABcAT4PTsABx5PAAcedAAGBrWADheQBFsABx6SAwAHHn8AIbtWBrYYIScABx7MWwAHHxxbAAcfBgsABx7fACG75g8uF5iLAAGwiPgE9HMABx9sui9KPmgEAARbAAcf3gsABx+3ACG75g8uF5gCQDz9OwAHIYMAByGkAAYVJYAOFGgEWwAHIcIDAAchrwAhu1YVJhgY9HMAByH4ui4OPmgEAAYPAAciMwAhvZACQAE7AAcihwAHIrgABjRVgA8AAbB8BHMAByLcWwAHIsC6K+I/EjCgCAAGAwAHIyMAIbtUBjOSToaROwAHI58AByPQAAY0WYAPAAGxbASEcwAHJIhbAAckTFsAByQOAwAHI/sAIbtWDG4YLgzODtCcBAAEWwAHJLxbAAcklLoCQj6aJS43vAMAAbF5JwAHJQIXAAclEwAhv2T4BPRzAAcleFsAByVouiwOPz4vTAQABhMAByW3ACG+iAJzMP07AAcmLwAHJkQAAilNgA8AAbB8Bkz4CTsABybQAAAA8XQPAAGxKAWADhRoBFsABybQeAMAAbC8BAV0DwABsIAFgA4UaARbAAcm0gsAByarACG75hVuF5wA9wABsS0UAAAEcwAHJtIcAwAhwcz4AAAAAwABsTQA+Ak7AAcmjAAAAhUBgA4UaARbAAcnAhwDACHBzQMAAbE8+Az0cwAHJyC6Lg4+aAQABFMABydbACHDUCAAAkAA9HMAByeYWwAHJ4i6LA4/PjBIBAAEcwAHJ+hbAAcnzLor4j8SMKAIAAYDAAcoLwAhu1QGM5BzAAcoihsAByhzACHBcgT8BAAGUAMAAbIihpACczT2OwAHKMcAIcFwcwAHKL4bAAcoxwAhwXIE/AQABlADAAGyIPgJOwAHKXAAAADxdA8AAbEoBYAOF8gEWwAHKXB4AwABsLwEBXQPAAGwgAWADhfIBFsABylyCwAHKUsAIbvmFI4XoAD3AAGxLRQAAARzAAcpchwDACHGJPgAAAADAAGxNAD4CTsAByksAAACFQGADhfIBFsABymOHAMAIcYlAwABsTz4DPRzAAcprLouDj5oBAAEWwAHKfRTAAcp5wAhx6ggAgT6F9QCQAD0cwAHKjxbAAcqLLosDj8+MEgEAARzAAcqjFsABypwuiviPxIwoAgABgMAByrTACG7VAYzkHMABysuGwAHKxcAIcFyBPwEAAZQAwABsiKGkAJzNPY7AAcrawAhwXBzAAcrYhsABytrACHBcgT8BAAGUAMAAbIhJwAHLWIXAActcwAhv2T4CPRzAAct2FsABy3IuiwOPz4uQAQABhMABy3/ACG+iAJzFPRzAAcuYFsABy5QuiwOPz40XAQABHMABy6kWwAHLpi6LAo/OjRgCAAIWwAHLvoDAAcu5wAhu1YGIhgdqwAHL02ADnTeJqACePQCc9j89HMABy+gujQqPmgcABytqwAHMDmADnTeJiRbAAcwbgMABzBbACG7VgxuGCxbAAcw5gMABzDTACG7VgYiGB4PAAcw/wAhvZJQcwAHMWBbAAcxMLorlj7CL5AEAAZQApK4AkEtFwAHMcwHAAcx8wAHMfgAAgdRgA8AAbB8BkwEcwAHMhYfAAcyDwAhzjIE6AQABhsABzIfACHBcAMAAbIUBj8ABzJDACHOMHMABzI6HwAHMkMAIc4yBPwEAAZQAwABsiD4BPRzAAcyfFsABzJsuiwOPz4uQAQABHMABzK8WwAHMqC6K+I/EjCgCAAGAwAHMwMAIbtUBjOQcwAHM04fAAczRwAhzjIE/AQABlADAAGyIoaQAnMVOwAHM68ABzPMAAYvnYAOi8AEcwAHNCRbAAcz9Lorlj7CL9gIAAYLAAc0lwAhu+QGLlSmkrz0cwAHNSS6NCo+aBwAHgMABzVrACG7VasABzW9gA503iagrGsABzX2PpCuBwAHNlcAIbuOHwAHNpMAIdDsAkEsGkIAZwAHNtcABzcHAAddFAACFdAFqwAHNtmADwABsVoC1AAABA8ABzdbAAddFAAAAAQEBwAHN6AAAAIQNYAOGBAAAYAHAAGxcAT4MTsABzfrAAc4FAAGNGWADpVMBIyEcwAHOIhbAAc4PLoroj7MnAQABKwDAAGxeHMABzj4WwAHOLC6K6I+zKQEAAYDAAc4/wAh04wDAAGxhKwFgA6VTTsABzl7AAc5lAAGM6mADnmQBHMABznkWwAHOZy6K4o+sjRoBAAGAwAHOkMAIdOMApOhJwAHOmyIhHMABzqaCwAHOn8AIdVAnAQABKwDAAGxeABzAAc68gcABzrHACHT8JwEAASsAwABsXj4CPRzAAc7NLozpj5oCAAKCwAHO+sAIdVCAwAHPAsAIdOMAkElKwAHPDwA/TsABzyfAAc8sAAESYAOF5AEWwAHPM4DAAc8uwAh044GthghOwAHPSMABz1YAAYvoYAPAAGwfARzAAc+mHMABz4scwAHPbxbAAc9oFsABz12DwAHPWMAIdeaFW4XngODAAGxqgT8BAAEWwAHPhBbAAc9+g8ABz3nACHXmhSOF6IDgwABsagDAAGyIgT8BAAGUAMAAbIiBPwEAASMWwAHPvBbAAc+2g8ABz7HACHXmg8uF5iLAAGwilJMBYAPAAGwfAMAAbIhJwAHP6hzAAc/8hMABz+7ACHYJg9cBAAFqwAHP/2ADwABsH4YqAMAAbRQ+AT0wwAHQFx/AAdAhkN8BAAEWwAHQQIDAAdA7wAh044QBglkAP0nAAdDIHsAB0MyhFgMAA4DAAdDjwAh04xbAAdDpLorhj6kWwAHQ/C4fj6oAPgZOwAHRGMAB0SUAAY0VYAPAAGwfARzAAdEuFsAB0ScuiviPxIwoAQABgMAB0T/ACHTjAKGkPRzAAdFMLovQj5oDAAIWwAHRX4DAAdFawAh044VJhgaDwAHRacAIdeYBi9GFwAHRhcAIdymQBT0cwAHR3hbAAdHaLosDj8+LkAEAAYXAAdHnwAh3KQCcxU7AAdICwAHSEQABjNdgA8AAbB8BHMAB0hYWwAHSEy6LAo/OjRsCAAGDwAHSLMAIdeYBi5Upnis9HMAB0lAWwAHSTC6LA4/PjRwCAAKGwAHSacAId7WEwAHSecAIdgkAnNJKwAHSjwA/TsAB0q/AAdK/AAGDG2ADg6wBFsAB0saAwAHSwcAIdOODG4YLScAB0tsewAHS36EXAQABhcAB0vPACHgdAD4DQBzAAdMfgcAB0xTACHT8JwEAASsAwABsXsAB0xTAAdMmAD0cwAHTLy6NFI+aAgACgMAB00XACHTjhMAB00vACHYJAJBMSsAB02EAP0nAAdN0IiEcwAHTg4HAAdN4wAh0/CcBAAErAMAAbF4AFsAB05mBwAHTjsAIdPyNHaVXPgROwAHTwcAB084AAY0VYAPAAGwfARzAAdPXFsAB09AuiviPxIwoAQABgMAB0+jACHTjAKGkPRzAAdP1LovQj5oDAAIWwAHUCIDAAdQDwAh044VJhgaDwAHUEsAIdeYBi9GGwAHULsAIeNyQBT0cwAHURxbAAdRDLosDj8+LkAEAAYbAAdRQwAh43ACcxT0cwAHUaRbAAdRlLosDj8+NFwEAARzAAdR6FsAB1HcuiwKPzo0YAgACFsAB1I+AwAHUisAIdOOBiIYHasAB1KRgA503iagAnj0AnPY+AT0cwAHUwS6L0I+aAgACFsAB1NSAwAHUz8AIdOOFSYYGg8AB1N7ACHXmAJAFTsAB1PbAAdT+AAGL52ADovABHMAB1RQWwAHVCC6K5Y+wi/YCAAGDwAHVMMAIdeYBi5UppK9JwAHVTyEcwAHVXoHAAdVTwAh0/CcBAAErAMAAbF4+A07AAdV1wAHViAABi+tgA8AAbFsBHMAB1ZuFwAHVi8AIeB0nAQABKwDAAGxeTsAB1bHAAdW9AAGL7GADwABsWwEcwAHVyS6NCI+aAwADgMAB1drACHTjhcAB1eDACHgdFsAB1faAwAHV8cAIdOOFSYYGAJBKPRzAAdYHLovjj5oGAAMWwAHWIYHAAdYWwAh0/IC+pVmGwAHWKcAIeeKEwAHWMsAIdgkDi+uHwAHWX8AIejeL7BTAAdaKwAh6YwgAhA2AwAHWp8AIdOOQDT4BPRzAAdbBLo0Kj5oHAAeAwAHW0sAIdONqwAHW52ADnTeJqIXAAdbvwAh4HRbAAdcFgMAB1wDACHTjgYiGBxbAAdcagMAB1xXACHTjhUmGBoTAAdckwAh2CYbAAdczwAh54gCQSwaQgRnAAddKwAHXVsAB2kAAAIVQAWrAAddLYAPAAGxWgLUAAAEDwAHXZsAB2kAAAAABAQHAAddzAAAAhA1gA4VFAABgAcAAbFwBPgQ9HMAB138ui4OPmgEAARbAAdeSgMAB143ACHuchUmFRwCQAE7AAdenwAHXrwABi+dgA6LwARzAAde9FsAB17EuiuWPsIvkAQABlACkrk7AAdfdwAHX6AABjRlgA6VTASMhHMAB2AUWwAHX8i6K6I+zJwEAASsAwABsXhzAAdghFsAB2A8uiuiPsykBAAGAwAHYIsAIe5wAwABsYSsBYAOlU0nAAdg0IRzAAdhDgsAB2DjACHwCJwEAASsAwABsXj4CScAB2FQWwAHYY4LAAdhYwAh8Ao0dpVc+BE7AAdiNwAHYmgABjRVgA8AAbB8BHMAB2KMWwAHYnC6K+I/EjCgBAAGAwAHYtMAIe5wAoaQ9HMAB2McWwAHYwy6LA4/Pi9MBAAGDwAHY1sAIfI8AnMw9HMAB2PEWwAHY7S6LA4/Pi5ABAAGDwAHY+sAIfI8AnMU9HMAB2RUWwAHZES6LA4/PjRcBAAEcwAHZJhbAAdkjLosCj86NGAIAAhbAAdk7gMAB2TbACHucgYiFSGrAAdlQYAOdN4mJAJ49AJz2Pz0cwAHZaC6L44+aBQADFsAB2YKCwAHZd8AIfAKAvqVZgcAB2YrACHvYlAKL6SmEDYDAAdmpwAh7nJANPgE9HMAB2cMujQqPmgcAB4DAAdnUwAh7nGrAAdnpYAOdN4mJFsAB2faAwAHZ8cAIe5yDG4VLFsAB2haAwAHaEcAIe5yBiIVIFsAB2iGAwAHaHMAIe5yFSYVHlIHAAdouwAh72ACQSwaQghnAAdpFwAHaUcAB348AAIVSAWrAAdpGYAPAAGxWgLUAAAEDwAHaYcAB348AAAABAQHAAdpuAAAAhA1gA4VXAABgAcAAbFwBPgpOwAHahMAB2okAAYH+YAPAAGwfARzAAdqSFsAB2osuiviPxIwoAQABgMAB2qPACH4nAKGkTsAB2rnAAdrDAAGM4WADwABsWwEhHMAB2sYujNABAAGAwAHa4MAIficAkG49HMAB2uwui4OPmgEAARbAAdr/gMAB2vrACH4nhUmFWQCQAE7AAdsVwAHbIAABjRlgA6VTASMhHMAB2z0WwAHbKi6K6I+zJwEAASsAwABsXhzAAdtZFsAB20cuiuiPsykBAAGAwAHbWsAIficAwABsYSsBYAOlU0nAAdtsIiEcwAHbe4PAAdtwwAh+wycBAAErAMAAbF4AFsAB25GDwAHbhsAIfsONHaVXPgQ9HMAB27MWwAHbry6LA4/Pi9MBAAGBwAHbwsAIfkAAnMw9HMAB288ui4OPmgEAARbAAdvigMAB293ACH4ngT6FWwCQAD0cwAHb9BbAAdvwLosDj8+LkAEAAYHAAdv9wAh+QACcxT0cwAHcDhbAAdwKLosDj8+NFwEAARzAAdwfFsAB3BwuiwKPzo0YAgACFsAB3DSAwAHcL8AIfieBiIVaasAB3ElgA503iZgAnj0AnPY+AT0cwAHcZi6Lg4+aAQABFsAB3HmAwAHcdMAIfieBPoVbAJAAScAB3IyCwAHckMAIfnQ+AT0cwAHcpxbAAdyjLosDj8+L0wEAAYHAAdy2wAh+QACczD9OwAHc7sAB3PYAAYvnYAOi8AEcwAHdBBbAAdz4Lorlj7CL5AEAAWrAAd0VYAPAAGwfhQQApK5JwAHdKSEcwAHdOIPAAd0twAh+wycBAAErAMAAbF4+A07AAd1PwAHdYgABi+tgA8AAbFsBHMAB3XoWwAHdaoDAAd1lwAh+J4MbhV4nAQABKwDAAGxeTsAB3ZDAAd2cAAGL7GADwABsWwEcwAHdqC6NCI+aAwADgMAB3bnACH4nFsAB3cSAwAHdv8AIfieDG4VeFsAB3dqAwAHd1cAIfieFSYVZAJBKPRzAAd3rLovjj5oHAAMWwAHeBYPAAd36wAh+w4C+pVmEwAHeDcAIgFNqwAHeFmADwABsH4UEBIvqKYvrhcAB3lnACICpi+yGwAHehMAIgN6EDYDAAd6hwAh+J5ANPgE9HMAB3rsujQqPmgcAB4DAAd7MwAh+J2rAAd7hYAOdN4mYFsAB3u6AwAHe6cAIfieDG4VeFsAB3w6AwAHfCcAIfieBiIVaFsAB3xmAwAHfFMAIfieFSYVZasAB3yNgA8AAbB+FBITAAd8xwAiAUwCQSz0cwAHfShbAAd9GLosDj8+LyAAAAACcuUnAAd9cgsAB32DACH50PgE9HMAB33cWwAHfcy6LA4/Pi5ABAAGBwAHfgMAIfkAAnMU/BpCDGcAB35TAAd+gwAHigwAAhXcBasAB35VgA8AAbFaAtQAAAQPAAd+6wAHigwAAAAEBAcAB39EAAACEDWADhhcAAGABwABsXAE+BU7AAd/jwAHf6AABEmADheQBFsAB3++AwAHf6sAIgnyBrYYaTsAB4AvAAeASAAGAvmADg6wBHMAB4CYWwAHgHC6BFo+nguUCAAIWwAHgRxbAAeA4LoMzj7uC4YNcFsAB4FiAwAHgU8AIgnyBiIYZAIGEScAB4GMcwAHgboLAAeBnwAiCuCcBAAErAMAAbF4+A07AAeCJwAHgjgABgf5gA8AAbB8BHMAB4JcWwAHgkC6K+I/EjCgBAAGAwAHgqMAIgnwAoaQ9HMAB4LUujNaPmgUABRbAAeDnFsAB4OKAwAHg3cAIgnyBiIYZgYiJIoPAAeD3wAiDJRzAAeEKFsAB4QcuiwKPzo0bAgABgcAB4SDACIKVAYuVKZ4rFsAB4UmBwAHhRMAIgpWDy4XmNcAB4WYAAAEAXQPAAGwZAWADhRoBMcAB4WZgA4UaAR/AAeFrh1wAAAAANcAB4YsAAAEAXAEcwAHhi4TAAeFmwAiDwIE0AQABFsAB4ZeBwAHhksAIgpWFW4XnAMAAbQU1wAHhsQAAAQBcARzAAeGxhMAB4WbACIPAgTQBAAEcwAHhwxbAAeG9gcAB4bjACIKVhSOF6IKhAQFgA4UaATTAAeHHA8AB4cfAAeHVAAAAAQEBwAHhyAAAAIJKYAOF8gAAYAOFGgFKwAHhzgEWwAHh0IbAAeHOwAiEcIE+hfUAwABs6wDAAG0FhMAB4WbACIPAAJBISsAB4eAAPz0cwAHh8i6L0I+aAgACH8AB4gSHXAAAAACBwAHiFsAIgpUAkAU9HMAB4iEui/WPmgUAAoLAAeI4wAiCuIHAAeJAwAiClQOLlSmL7CmEDYDAAeJ6wAiCfJAOBpCEGcAB4ojAAeKUwAHkhQAAhWABasAB4olgA8AAbFaAtQAAAQPAAeKpwAHkhQAAAAEBAcAB4rsAAACEDWADhaAAAGABwABsXAE+BE7AAeLUwAHi2wABgL5gA4OsARzAAeLvFsAB4uUugRaPp4LlAgACFsAB4xAWwAHjAS6DM4+7guGDXBbAAeMhgMAB4xzACIVGgYiFogCBhEnAAeMsHMAB4zeBwAHjMMAIhV8nAQABKwDAAGxePgNOwAHjUsAB41cAAYH+YAPAAGwfARzAAeNgFsAB41kuiviPxIwoAQABgMAB43HACIVGAKGkPRzAAeN+LozWj5oFAAUWwAHjpRbAAeOggMAB45vACIVGgYiFooGIiSKCwAHjq8AIhcwcwAHjtBbAAeOxLosCj86NHgEAAZQAnioxwAHjw2ADiVUAMcAB491gA4UaAR/AAePih1wAAAAAAJBISsAB4/wAPz0cwAHkDi6Lyo+aAAAAAJAYPRzAAeQmLovjj5oFAAOBwAHkNcAIhV8cwAHkSRbAAeQ9Lorlj7CL5AEAAZQApK6UAovpKYQNgMAB5HzACIVGkA0GkIUZwAHkisAB5JbAAegfAACFYgFqwAHki2ADwABsVoC1AAABA8AB5KvAAegfAAAAAQEBwAHkvQAAAIQNYAOFsQAAYAHAAGxcAT4GTsAB5NPAAeTYAAGB/mADwABsHwEcwAHk4RbAAeTaLor4j8SMKAEAAYDAAeTywAiG+AChpE7AAeUIwAHlEgABjOFgA8AAbFsBIRzAAeUVLozQAQABgMAB5S/ACIb4AJBuTsAB5UjAAeVPAAGAvmADg6wBHMAB5WQWwAHlUS6BFo+nguUDAAIWwAHlhRbAAeV2LoMzj7uC4YNcFsAB5ZaAwAHlkcAIhviBiIWzAYLmKYGEScAB5a8cwAHluoPAAeWzwAiHcScBAAErAMAAbF4+AT0cwAHlyy6M1o+aBgAFFsAB5fIWwAHl7YDAAeXowAiG+IGIhbOBiIkigcAB5fjACIcRHMAB5gEWwAHl/i6LAo/OjR4BAAGVAJ4qMcAB5hBgA4lVADHAAeYqYAOFGgIfwAHmL4dcAAAAABbAAeZGgMAB5kHACIb4gT6FtAGM0oLAAeZxwAiHRZBIPgU9HMAB5pAui8qPmgAAAACQGD0cwAHmqi6Lg4+aAQABFsAB5r2AwAHmuMAIhviBPoW0AJAAScAB5syCwAHm0MAIh0U+AT0cwAHm6RbAAeblLosDj8+L0wEAAYHAAeb4wAiHEQCczD9AIiXAAeccAIPAAecVwAiHcWADg8wBIiXAAecwAIPAAecpwAiHcWADhEsAFsAB50cUwAHnQMAIh3EDAWADhEuDf4RtwAHnFcAB51AAPRzAAedZLovjj5oGAAODwAHnaMAIh3EcwAHnfBbAAedwLorlj7CL5AEAAZUApK6VA4vqKYvsKYQNgMAB58TACIb4kA09HMAB59oWwAHn1i6LA4/Pi8gAAAAAnLlJwAHn7ILAAefwwAiHRT4BPRzAAegHFsAB6AMuiwOPz4uQAQABgcAB6BDACIcRAJzFPwaQhhnAAegkwAHoMMAB6LMAAIWDAWrAAeglYAPAAGxWgLUAAAEDwAHoOMAB6LMAAAABAQHAAeg9AAAAhA1gA4ZcAABgAcAAbFwBPgJOwAHoTsAB6FYAAIwUYAPAAGxbARzAAehYLowTj5oBAAEWwAHoa4DAAehmwAiJ34WChl4AkBpJwAHoeSGBwAHofsAIifg+AT0cwAHokxbAAeiPLosDj8+M6AAAAACc4z8GkIcZwAHouMAB6MTAAemxAACFugFqwAHouWADwABsVoC1AAABA8AB6NLAAemxAAAAAQEBwAHo3QAAAIQNYAOG/gAAYAHAAGxcAT4FPRzAAejpLouDj5oBAAEWwAHo/IDAAej3wAiKi4WChwAAkABOwAHpEMAB6RwAAY0fYAPAAGwfARzAAeklFsAB6R4uiviPxIwoAQABgMAB6TbACIqLAKGkPRzAAelFFsAB6UEuiwOPz4vTAQABgcAB6VTACIrHAJzMPRzAAelqFsAB6WYuiwOPz4uQAQABgcAB6XPACIrHAJzFPRzAAemJFsAB6YUuiwOPz40XAQABHMAB6ZoWwAHply6LAo/Oi9wBAAErAJ48AJz2BpCIGcAB6bbAAenCwAHqAQAAhcYBasAB6bdgA8AAbFaAtQAAAQPAAenSwAHqAQAAAAEBAcAB6d8AAACEDWADhzUAAGABwABsXAE+AT0cwAHp7xbAAenrLosDj8+LhwAAAACcyAaQiRnAAeoGwAHqEsAB7C0AAIXPAWrAAeoHYAPAAGxWgLUAAAEDwAHqHsAB7C0AAAABAQHAAeonAAAAhA1gA4ddAABgAcAAbFwBPgVOwAHqPAAAAI0gYAOIsQBBRcAB6koBwAHqU8AB6loAAIQAYAOCUgEWwAHqYYDAAepcwAiMBIQAglgAAYrAAepqwAiMMhbAAep6gsAB6nPACIwyhACCWD4CScAB6oolwAHqlQCCwAHqjsAIjDJgA4i9PgI9icAB6qnACIwdJsAB6sIAFsAB6rsUwAHqtMAIjDICAWADiL2EAIJYYAOIsULAAerXAD9JwAHq7CIcwAHq94LAAerwwAiMMicBAAErAMAAbF4BJcAB6wkAgsAB6wLACIwyYAOE7j4BPTDAAeskJMAB61QCJ40hgMAB60/ACIwEPz0XwAHrfRzAAetyFsAB62guivuPxykBAAGBwAHrc8AIjB0AwABsYYf9KaDvScAB65oWwAHrphbAAeueLh+PqowckPU+AT0cwAHrxRbAAevBLosDj8+MHQAAAACc8T89HMAB7BQujSKPmgEAAYHAAewgwAiMHQCQWQaQTRnAAewywAHsN8AB7MkAAItoj5oAAAABA8AB7FDAAezJAAAAAQEBwAHsVwAAAIPBYAODzAAAYAPAAGxbAT4CScAB7GQcwAHsehbAAexugMAB7GjACI2vhMuD0CcBAAErAMAAbF5KwAHsgwEqP0rAAeyVASEcwAHsnS6Lzo+aAQABFsAB7LmAwAHss8AIja+Ey4PQAJBOBpBOGcAB7M7AAezTwAHulwAAi86PmgAAAAEDwAHs6MAB7pcAAAABAQHAAez0AAAAhMtgA4UaAABgA8AAbFsBPgRJwAHtBxzAAe0XgMAB7QvACI5HJwEAASsAwABsXkrAAe0gASo/ScAB7TIiIiIiJcAB7UIAgMAB7TbACI5HYAOHEQElwAHtagCAwAHtXsAIjkdgA4csASXAAe2QAIDAAe2EwAiOR2ADhxoBJcAB7bUAgMAB7anACI5HYAOHIwElwAHt3QCAwAHt0cAIjkdgA4c1PgFKwAHt9QEpP0nAAe4MIiXAAe4cAIDAAe4QwAiOR2ADh74AJcAB7lIAFsAB7kkUwAHuPcAIjkcAAWADh76F4IfAXQOKXAFbPgFKwAHucAEpP0rAAe6HASoGkIoZwAHunMAB7qjAAfMvAACFZAFqwAHunWADwABsVoC1AAABA8AB7rbAAfMvAAAAAQEBwAHuwQAAAIQNYAOFwwAAYAHAAGxcAT4CTsAB7tPAAe7aAAGAvmADg6wBFsAB7uGAwAHu3MAIj32AvoXHScAB7u0lwAHu+ACBwAHu8cAIj5ZgA4PMPgFJwAHvChbAAe8VFMAB7w7ACI+WAQFgA4PMhMGD3j4BPRzAAe8oLouCj5oBAAEWwAHvQRTAAe86wAiPlgEBYAODzITLg9AAkAtJwAHvXCEcwAHvYS6LbI+aAQABFMAB727ACI+WAQFgA4PMAI/8PgJJwAHvgSEcwAHvmhbAAe+FLorrj7YnAQABKwDAAGxePgJOwAHvwsAB78UAAYw1YAOlawEcwAHv2xbAAe/HLorrj7YpAQABgMAB79zACI99AMAAbGFJwAHv7SIhHMAB7/SCwAHv8cAIkGQnAQABKwDAAGxeACEcwAHwEBbAAfACgsAB7//ACJBkjBqleScBAAErAIpVPgI9HMAB8Ccui+CPmgEAARbAAfA7gsAB8DjACJBkjBqleQCQCkrAAfBXAD8/PRzAAfCBFsAB8H0uiwOPz40jAQABHMAB8JMWwAHwkC6LAo/OjSQBAAEUwAHwosAIj5YBAWADg8wAnjEAnNY+AT0cwAHwwy6L44+aBQADFMAB8NLACI+WAQFgA4PMHMAB8OYWwAHw2i6K5Y+wi+QBAAGTAKSukwKL6SmEDYDAAfEdwAiPfZANScAB8TclwAHxQgCBwAHxO8AIj5ZgA4RLPgFJwAHxWBbAAfFjFMAB8VzACI+WAQFgA4RLhP2EbD4BPRzAAfF3Lovjj5oFAAMUwAHxhsAIj5YBAWADhEscwAHxmhbAAfGOLorlj7CL5AEAAZMApK6TAovpKYQNgMAB8dHACI99kA1JwAHx5SIWwAHx8BTAAfHpwAiPlgEBYAOES4UAhHEBFsAB8gQUwAHx/cAIj5YBAWADhEuE+4RnPgE9MMAB8i8kwAHyZwInjSUUwAHyYMAIj5YBAWADhEs+AT0cwAHyhBbAAfKALosDj8+L2wEAARzAAfKYFsAB8pUuiwKPzovcAQABH8AB8qmLDwEAARTAAfK5wAiPlgEBYAOESwAAnjwAnMc+AT0wwAHy3yTAAfMlBCeNJhbAAfMQgcAB8wnACI+WhU7AAG0tJ4F3gcAB8x7ACI+WBpCLGcAB8zTAAfNAwAH6EAAAhXkBasAB8zVgA8AAbFaAtQAAAQPAAfNVwAH6EAAAAAEBAcAB82cAAACEDWADhikAAGABwABsXAE+CEnAAfNzFsAB83yAwAHzd8AIkxGEwYYtPgI9HMAB840ui4KPmgEAAYDAAfOfwAiTEQCQC0rAAfOsAD9OwAHzyMAB880AABJgA4XkARbAAfPUgMAB88/ACJMRga2GLE7AAfPpwAHz8AABgL5gA4RLARbAAfP3gMAB8/LACJMRgL6GMEnAAfQDHMAB9A6CwAH0B8AIk4cnAQABFsAB9BEui7uQxgDAAGxePgNAFsAB9LwWwAH0toHAAfSxwAiTZIUjheiBVsAAbPPAAfSxwAH0wwA9HMAB9Mwui4OPmgEAARbAAfTqFsAB9N+BwAH02sAIk2SFW4XngOLAAGxrAJAASsAB9PkAP0nAAfULIiEWwAH1GBbAAfUQLh+PqovikPEAHMAB9TyCwAH1NcAIk4cnAQABFsAB9UkWwAH1Py6AkI+miRSNywDAAGxePgI9HMAB90AWwAH3PC6LA4/Pi4cAAAAAnMhKwAH3VgA/ScAB92gWwAH3c4LAAfdswAiTh4UAhHE+A07AAfeMwAH3nQABjNtgA4MyARbAAfemgsAB95/ACJOHgzODtEnAAfe8HsAB98ChBwEAAYPAAffdwAiUrQA+AT0cwAH3+i6L0o+aAgABFsAB+BGBwAH4DMAIk2SDy4XmAYv4g8AB+CzACJStkA8+AkAWwAH4aBbAAfhigcAB+F3ACJNkg8uF5oFWwABs88AB+F3AAfhvAD0cwAH4/BbAAfj4LosDj8+LhwAAAACcyD2JwAH5GsAIk2Q1wAH5LwAAAQBgA4XkAR/AAfkvhfACAAEWwAH5SBbAAfk+gMAB+TnACJMRga2GLIVbhecBhSMWwAH5ahbAAflggMAB+VvACJMRga2GLIUjheg1wAH5fwAAAQBcARfAAfl/hMAB+S/ACJVlhACAwAH5iMAIkxGCWITAAfkvwAiVZT89HMAB+Zgui9CPmgIAAiuBwAH5rMAIk2QAkAU9HMAB+bcui/WPmgQAAoLAAfnOwAiTh4HAAfnWwAiTZAKFABbAAfn2gsAB+e/ACJOHhQCEcYQNgMAB+gfACJMRkA4GkIwZwAH6FcAB+iHAAfyqAACFZgFqwAH6FmADwABsVoC1AAABA8AB+i/AAfyqAAAAAQEBwAH6OgAAAIQNYAOF0wAAYAHAAGxcAT4FTsAB+lHAAfpbAAGM4WADwABsWwEhHMAB+l4ujNABAAGAwAH6eMAIlnYAkG49HMAB+oQui4OPmgEAARbAAfqXgMAB+pLACJZ2gT6F1gCQAEnAAfqkgcAB+qjACJaPPgE9HMAB+rsujCePmgEAARzAAfrNFsAB+sYuiviPxIwoAQABgMAB+t7ACJZ2AKGkAJAeP07AAfr3wAH6/gABgL5gA4OsARbAAfsFgMAB+wDACJZ2gL6F2EnAAfsRIiXAAfscAILAAfsVwAiXIGADg8wAIRzAAfspLottj5oBAAEUwAH7NsAIlyACAWADg8wAj/0+A0nAAftHIhbAAftTFsAB+0suH4+qjByQ9QAcwAH7ci6NJ4+aAQABFsAB+5OAwAH7jsAIlnaBPoXWAJBPPgE9HMAB+6kWwAH7pS6LA4/PjB0AAAAAnPE/TsAB+83AAfvVAACLy2ADwABsHwEcwAH72hbAAfvXLosCj86NJAEAARTAAfvpwAiXIAIBYAODzACeMT0cwAH7/BbAAfv4LosDj8+NKAEAAYPAAfwPwAiX1gCc1z4CPRzAAfwsLovjj5oFAAOCwAH8O8AIlyAcwAH8TxbAAfxDLorlj7CL5AEAAZQApK6UAovqKYQNgMAB/ITACJZ2kA09HMAB/JUWwAH8kS6LA4/Pi8gAAAAAnLkGkI0ZwAH8r8AB/LvAAf9zAACFkgFqwAH8sGADwABsVoC1AAABA8AB/NPAAf9zAAAAAQEBwAH86AAAAIQNYAOGggAAYAHAAGxcAT4BScAB/PQcwAH9EBbAAf0JFsAB/P2AwAH8+MAImL+FkIaEgODAAGxqJwEAAZQAwABsMj4CPRzAAf0eLouDj5oBAAEWwAH9PRbAAf0xgMAB/SzACJi/hZCGhIDiwABsawCQAD0cwAH9TC6L44+aAwADFsAB/Vsui5+QthzAAf16FsAB/W4uiuWPsIvkAQABlACkrpQAkA0+Bz0cwAH9qhbAAf2mLosDj8+LhwAAAACcyD0cwAH9wC6L2I+aAQABFsAB/d0WwAH90YDAAf3MwAiYv4WQhoSA4MAAbGoAkAc9HMAB/fAWwAH97C6LA4/PjNQAAAAAnNhOwAH+F8AB/hwAAYH+YAPAAGwfARzAAf4lFsAB/h4uiviPxIwoAQABgMAB/jbACJi/AKGkPRzAAf5HFsAB/kMuiwOPz4vTAQABgcAB/lbACJnNAJzMRcAB/mQBwAH+bcAB/m8AAIHUYAPAAGwfAZMBHMAB/naCwAH+dMAImieBOgEAARbAAf6JFsAB/n2AwAH+eMAImL+FkIaEgODAAGxqAMAAbIUBisAB/pHACJonHMAB/pKCwAH+kcAImieBPwEAAZQAwABsiD4EPRzAAf6kFsAB/qAuiwOPz4uQAQABgcAB/q3ACJnNAJzFPRzAAf68LovYj5oBAAGCwAH+yMAImicAkAc9HMAB/tQui4OPmgEAARzAAf7yFsAB/ueAwAH+4sAImL+FkIaEKQEAAYLAAf7zwAiaJwDAAGy4AJAAPRzAAf8EFsAB/wAuiwOPz4zVAAAAAJzbPRzAAf8qLovjj5oDAAMWwAH/OS6LoZC3HMAB/1IWwAH/Ri6K5Y+wi+QBAAGUAKSulACQDQaQjhnAAf94wAH/hMACAAAAAIW9AWrAAf95YAPAAGxWgLUAAAEDwAH/lsACAAAAAAABAQHAAf+lAAAAhA1gA4cRAABgAcAAbFwBPgJOwAH/t8AB/78AAYvLYAPAAGwfARzAAf/EFsAB/8EuiwKPzoyVAQABFsAB/9OAwAH/zsAIm4uBPocTAJ4oPRzAAf/jFsAB/98uiwOPz4vbAQABgcAB//TACJukAJzHBpCPGcACAAXAAgARwAIAWQAAhckBasACAAZgA8AAbFaAtQAAAQPAAgAjwAIAWQAAAAEBAcACADIAAACEDWADhz4AAGABwABsXAE+AT0cwAIAPi6Lgo+aAQABgMACAFDACJw1AJALBpCQGcACAF7AAgBqwAIArwAAhc0BasACAF9gA8AAbFaAtQAAAQPAAgB9wAIArwAAAAEBAcACAI0AAACEDWADh1QAAGABwABsXAE+AT0cwAIAmS6Lyo+aAAAAAJAYBpCRGcACALTAAgDAwAIBXQAAhdEBasACALVgA8AAbFaAtQAAAQPAAgDKwAIBXQAAAAEBAcACANEAAACEDWADh2YAAGABwABsXAE+Az0cwAIA3S6Lg4+aAQABFsACAPCAwAIA68AInPiFfodoAJAAScACAQIWwAIBDhbAAgEGLh+PqowckPU+AT0cwAIBLRbAAgEpLosDj8+MHQAAAACc8T89HMACAU0WwAIBSS6LA4/PjSkBAAGTAJzkBpCSGcACAWLAAgFuwAICtgAAhcsBasACAWNgA8AAbFaAtQAAAQPAAgF+wAICtgAAAAEBAcACAYsAAACEDWADh0kAAGABwABsXAE+A07AAgGmwAIBqwABgZdgA4lVARbAAgGygMACAa3ACJ2ygZeHS07AAgHGwAIB0gABjSpgA8AAbB8BHMACAdcWwAIB1C6LAo/OjCoBAAGBwAIB38AIncsAnjVJwAIB6iEewAIB76ERAQABMcACAgVgA4lVAYHAAgIGwAidywA+AT0cwAICGhbAAgIWLosDj8+L2wEAAYLAAgIrwAid7wCcxz4CPRzAAgJMLowAj5oBAAExwAICeWADiVUBgcACAnrACJ3LAJAQPRzAAgKMFsACAoguiwOPz40rAQABgsACAqDACJ3vAJzrBpCTGcACArvAAgLHwAIHfgAAhUUBasACArxgA8AAbFaAtQAAAQPAAgLXwAIHfgAAAAEBAcACAuQAAACEDWADhS0AAGABwABsXAE+Ak7AAgL2wAIC+AABg/pgA4jnARbAAgL/gMACAvrACJ7khRSFL0nAAgMNFsACAxOBwAIDEcAInv2EwYj6PgE9HMACAyQui4KPmgEAARbAAgM4gcACAzbACJ79hMuI7wCQC0nAAgNRFsACA1eBwAIDVcAInv2E14j+PgY9HMACA2cujAKPmgEAAYHAAgNzwAie/QCQF07AAgOKwAIDjwABjCJgA5xwAR/AAgOVnHwAAAAAPRzAAgOoFsACA6QuiwOPz40sAQABgsACA77ACJ+QAJz5ScACA8whHMACA94WwAID0oHAAgPQwAie/YTLiO8nAQABKwDAAGxePgVOwAID98ACA/wAAY0tYAOFGgEWwAIEAIHAAgP+wAie/YTLiO89HMACBBUujAuPmgEAAYHAAgQvwAie/QCQFkAiIiXAAgVpAIPAAgVkwAif92ADhgQAHMACBZsWwAIFlhbAAgWRFMACBYzACJ/3AwFgA4YEgYiGB4GIiSInAQABJ4CVAMAAbDYAHMACBdUWwAIFzhbAAgXDFsACBbkUwAIFtMAIn/cDAWADhgSBrYYIhVuF54DgwABsaicBAAGTAMAAbDLAAgVkwAIF2QA9HMACBesWwAIF5C6K+I/EjS4DAAODwAIGAcAIn/ccwAIGDhbAAgYHLor4j8SMKAEAAYDAAgYfwAie5AChpDTAAgYmA8ACBibAAgY/AAAAAAAAAFwBSsACBiwBHMACBiwui4OPmgEAAYPAAgY6wAif9wCQAAChrT0cwAIGSi6MEI+aAQABgcACBlfACJ79AJAZPgM9HMACBnYWwAIGci6LA4/Pi9sBAAEcwAIGihbAAgaHLosCj86MUAEAARbAAgaUgcACBpLACJ79gYiI6wCeKQCcxz0cwAIGpC6L44+aAwADFsACBrMui7WQwxzAAgbsFsACBuAuiuWPsIvkAQABlACkrpQAkA09HMACBxEWwAIHDS6LA4/Pi8gAAAAAnLk9HMACBzEWwAIHLS6LA4/PjCMBAAGCwAIHNsAIn5AAnJU9HMACB0MujAKPmgEAAYHAAgdPwAie/QCQFz4BPRzAAgdmLowCj5oBAAGBwAIHcsAInv0AkBcGkJQZwAIHg8ACB4/AAg1WAACFRwFqwAIHhGADwABsVoC1AAABA8ACB5/AAg1WAAAAAQEBwAIHrAAAAIQNYAOFOQAAYAHAAGxcAT4HTsACB77AAgfAAAGD+mADiOcBFsACB8eAwAIHwsAIom2FFIU7TsACB+DAAgfqAAGM4WADwABsWwEhHMACB+0ujNABAAGAwAIIB8AIom0AkG5OwAIIHcACCCkAAY0vYAPAAGxbASIWwAIILYHAAggrwAiihoTXiP4AFsACCDmBwAIIN8AIooaE1oj5ScACCEchg8ACCEzACKLWPgE9HMACCGEujAuPmgEAAYHAAgh7wAiihgCQFj89HMACCIoui4OPmgEAARbAAgidgMACCJjACKJtgT6FPACQAEnAAgiqIhbAAgi2FsACCK4uH4+qjByQ9QAcwAIIyy6NJ4+aAQABFsACCOyAwAII58AIom2BPoU8AJBPPgE9HMACCQAWwAII/C6LA4/PjB0AAAAAnPE/ScACCR2DwAIJIcAIotY+EE7AAglAwAIJRQABgf5gA8AAbB8BHMACCU4WwAIJRy6K+I/EjCgBAAGAwAIJX8AIom0AoaQ9HMACCXAWwAIJbC6LA4/PjBIBAAGEwAIJfcAIo8UAnM1OwAIJl8ACCZ0AASRgA5xwAR/AAgmjnHwAAAAATsACCb7AAgnDAAGMImADnHABH8ACCcmcfAAAAAA9HMACCdgujAKPmgEAAYHAAgnkwAiihgCQFz0cwAIJ8hbAAgnuLosDj8+NLAEAAYXAAgoIwAikGgCc+T0cwAIKFy6MC4+aAQABgcACCjHACKKGAJAWPRzAAgo/FsACCjsuiwOPz4uQAQABhMACCkjACKPFAJzFPRzAAgpVLowQj5oBAAGBwAIKYsAIooYAkBk9HMACCnAWwAIKbC6LA4/PjBsBAAGGwAIKecAIpDYAnLo9HMACCosWwAIKhy6LA4/PjCMBAAGFwAIKkMAIpBoAnJU9HMACCqIWwAIKni6LA4/Pi9sBAAEcwAIKthbAAgqzLosCj86MUAEAARbAAgrAgcACCr7ACKKGgYiI6wCeKQCcxz0cwAIKzi6L44+aAwADFsACCugui7WQwxzAAgsVFsACCwkuiuWPsIvkAQABlACkrpQAkA09HMACCzgWwAILNC6LA4/Pi8gAAAAAnLk9HMACC1AWwAILTC6LA4/PjCMBAAGGwAILVcAIpDYAnJVJwAILY4LAAgtnwAiiqj4BPRzAAguAFsACC3wuiwOPz4uQAQABhMACC4nACKPFAJzFP0nAAgujHMACC64WwAILpy6K+I/EjAwBAAGBwAILucAIooYAoaA+BE7AAgvPwAIL1AABgf5gA8AAbB8BHMACC90WwAIL1i6K+I/EjCgBAAGAwAIL7sAIom0AoaRJwAIL+4LAAgv/wAiiqj4BPRzAAgwYFsACDBQuiwOPz4vTAQABhMACDCfACKYsAJzMPz0cwAIMPS6MEI+aAQABgcACDErACKKGAJAZScACDFWCwAIMWcAIoqo+AT0cwAIMchbAAgxuLosDj8+LkAEAAYTAAgx7wAimLACcxT8+Ak7AAgynwAIMsgABjTBgA8AAbB8BHMACDLsWwAIMtC6K+I/Ei5EBAAGBwAIMzsAIooYAoaFJwAIM2ILAAgzcwAiiqj4BPRzAAgz1FsACDPEuiwOPz4vTAQABhMACDQTACKbgAJzMPgE9HMACDSwWwAINKC6LA4/PjBIBAAGEwAINOcAIpuAAnM0GkE8ZwAINW8ACDWDAAg5BAACNJ4+aAAAAAQPAAg17wAIOQQAAAAEBAcACDYcAAACNMWADhRoAAGADwABsWwFKwAINlQEiIiIiIiXAAg2ZAIDAAg2VwAinkGADhwkBJcACDbYAgMACDbLACKeQYAOHvgElwAIN2QCAwAIN1cAIp5BgA4XDASXAAg3zAIDAAg3vwAinkGADh7MBJcACDhYAgMACDhLACKeQYAOFLQElwAIOMgCAwAIOLsAIp5BgA4bjBpBQGcACDkbAAg5LwAIOvQAAjTKPmgAAAAEDwAIOWcACDr0AAAAAAAAAXAE+Aj0cwAIOZhbAAg5iLosDj8+LhwAAAACcyD0cwAIOei6L44+aAwADFsACDokui7SQwhzAAg6iFsACDpYuiuWPsIvkAQABlACkrpQAkA0GkJUZwAIOwsACDs7AAg8LAACF6QFqwAIOw2ADwABsVoC1AAABA8ACDt7AAg8LAAAAAQEBwAIO6wAAAIQNYAOH4gAAYAHAAGxcAT4BPRzAAg73Lo0yj5oAAAAAkFAGkJYZwAIPEMACDxzAAg9rAACF7AFqwAIPEWADwABsVoC1AAABA8ACDzXAAg9rAAAAAQEBwAIPSwAAAIQNYAOH7QAAYAHAAGxcAT4BPRzAAg9XLo0yj5oAAAAAkFAGkJcZwAIPcMACD3zAAhIHAACF+wFqwAIPcWADwABsVoC1AAABA8ACD5DAAhIHAAAAAQEBwAIPoQAAAIQNYAOIJgAAYAHAAGxcAT4KScACD60hFsACD7oWwAIPsi4fj6qA7JDwPgFKwAIP0QA/TsACD/DAAg/1AAGMImADnHABH8ACD/ucfAAAAAA9HMACEAwWwAIQCC6LA4/PjTMBAAGBwAIQIMAIqcoAnLs9HMACECwujBiPmgMAAxbAAhBIgMACEEPACKmQhYqIKCmBwAIQWcAIqcoAkBw9HMACEGUui9iPmgEAASMWwAIQghbAAhB6Lh+Pqo00kPiTFsACEKeAwAIQosAIqZCF+YgqAWADwABsHwCQBz0cwAIQwi6L2I+aAQABIxbAAhDfFsACENcuH4+qjTSQ+JMWwAIRBIDAAhD/wAipkIX6iCsBYAPAAGwfAJAHScACER4hHMACES8WwAIRJ4DAAhEiwAipkICWiCknAQABKwDAAGxePgE9HMACEUAui4OPmgEAARbAAhFTgMACEU7ACKmQgJaIKQCQAD4BPRzAAhF0FsACEXAuiwOPz4uHAAAAAJzIPRzAAhGPLovjj5oDAAMWwAIRni6LuJDEHMACEcIWwAIRti6K5Y+wi+QBAAGWAKSulgCQDT0cwAIR4xbAAhHfLosDj8+LyAAAAACcuT0cwAIR+RbAAhH1LosDj8+MIwEAAYHAAhH+wAipygCclQaQmBnAAhIMwAISGMACEoUAAIXyAWrAAhINYAPAAGxWgLUAAAEDwAISIsACEoUAAAABAQHAAhIpAAAAhA1gA4gIAABgAcAAbFwBPgM9HMACEjUujL2PmgEAAYDAAhJBwAirtwCQPz0cwAISTC6LxI+aAQABFsACEmOAwAISXsAIq7eF8YgKAJABPRzAAhJ0Loy/j5oAAAAAkEAGkJkZwAISisACEpbAAhOjAACF9QFqwAISi2ADwABsVoC1AAABA8ACEqbAAhOjAAAAAQEBwAISswAAAIQNYAOIEwAAYAHAAGxcAT4HScACEr8hFsACEswWwAISxC4fj6qA7JDwPgFKwAIS4wA/TsACEwLAAhMHAAGMImADnHABH8ACEw2cfAAAAAA9HMACEx4WwAITGi6LA4/PjTMBAAGBwAITMsAIrIsAnLs9HMACEz4ujL2PmgEAAYDAAhNKwAisUQCQPz0cwAITVS6LxI+aAQABFsACE2yAwAITZ8AIrFGF8YgVAJABPRzAAhN9Loy/j5oAAAAAkEA9HMACE5UWwAITkS6LA4/PjCMBAAGBwAITmsAIrIsAnJUGkJoZwAITqMACE7TAAhRZAACF5gFqwAITqWADwABsVoC1AAABA8ACE8jAAhRZAAAAAQEBwAIT2QAAAIQNYAOH1gAAYAHAAGxcAT4EPRzAAhPlLoy9j5oBAAGAwAIT8cAIrWsAkD89HMACE/wui8SPmgEAARbAAhQYFsACFBOAwAIUDsAIrWuE+IfYhfGICgCQAT0cwAIUKS6Lg4+aAQABFsACFDyAwAIUN8AIrWuBPofZAJAAPRzAAhRILoy/j5oAAAAAkEAGkJsZwAIUXsACFGrAAhXyAACF/wFqwAIUX2ADwABsVoC1AAABA8ACFH3AAhXyAAAAAQEBwAIUjQAAAIQNYAOIPQAAYAHAAGxcAT4DTsACFJ/AAhSrAAGNNWADnHABNcACFL4AAAEAYAOccAEcwAIUvhbAAhStLor5j8UpAQABFsACFMSAwAIUv8AIrjGAvog/AMAAbGEjHMACFL6BwAIUvsAIrlwnAQABKwDAAGxeMMACFNgkwAIVHgQnjTYWwAIU84DAAhTuwAiuMYC+iD8njTeAwAIVGcAIrjGBwAIUvsAIrlwBYAOccE7AAhUrwAIVPgABjMNgA8AAbB8BHMACFU0WwAIVQC6K/o/KKQEAARbAAhVTgMACFU7ACK4xgL6IPwDAAGxhPRzAAhVhLozPj5oDAAOAwAIVgsAIrjEWwAIVjYDAAhWIwAiuMYC+iD80wAIVlQPAAhWVwAIV7QAAAAAAAABgAcAAbFwBPgI9HMACFaAujMGPmgEAAYLAAhWywAiu5wCQQz0cwAIV0RbAAhXNLosDj8+MGwEAAYHAAhXawAiuSgCcugCQRgaQnBnAAhX3wAIWA8ACF68AAIYWAWrAAhX4YAPAAGxWgLUAAAEDwAIWH8ACF68AAAABAQHAAhY4AAAAhA1gA4iRAABgAcAAbFwBPgNOwAIWSsACFlYAAY01YAOccAE1wAIWYwAAAQBgA5xwARzAAhZjFsACFlguivqPxikBAAEWwAIWaYDAAhZkwAiv3YC+iJMAwABsYSMcwAIWY4HAAhZjwAiwCCcBAAErAMAAbF4wwAIWfSTAAhbNBCeNNhbAAhaYgMACFpPACK/dgL6IkyeNOIDAAhbIwAiv3YHAAhZjwAiwCAFgA5xwTsACFtrAAhbtAAGMw2ADwABsHwEcwAIW/BbAAhbvLor+j8opAQABFsACFwkWwAIXAoDAAhb9wAiv3YC+iJOEAIJYAMAAbGE9HMACFxcujM+PmgMAA4DAAhc4wAiv3RbAAhdKFsACF0OAwAIXPsAIr92AvoiThACCWDTAAhdSA8ACF1LAAheqAAAAAAAAAGABwABsXAE+Aj0cwAIXXS6MwY+aAQABgsACF2/ACLCTAJBDPRzAAheOFsACF4ouiwOPz4wbAQABgcACF5fACK/2AJy6AJBGBpCdGcACF7TAAhfAwAIZkwAAhgMBasACF7VgA8AAbFaAtQAAAQPAAhfQwAIZkwAAAAEBAcACF90AAACEDWADiFIAAGABwABsXAE+B0nAAhfpFsACF/EWwAIX7S6LA4/PjDacjz4BSsACGJMAP07AAhiywAIYtwABhrxgA5xwAR/AAhi9nHwBAAABjTkpPRzAAhjnFsACGOMuiwOPz4wjAQABgcACGOzACLHVAJyVPRzAAhj8FsACGPguiwOPz4xgAQABF8ACGQ0uiwYcwAIZCxbAAhkNLosGj9KBPwEAAZQAwABsiI/SAJzwPRzAAhklLouDj5oBAAEWwAIZOIDAAhkzwAixm4T4iFQAkAA9HMACGUQujBiPmgMAAxbAAhlggMACGVvACLGbhYqIVSmBwAIZccAIsdUAkBw9F8ACGX8uiwYcwAIZfRbAAhl/LosGj9JEAQABlADAAGzhj9IGkJ4ZwAIZmMACGaTAAhneAACF9wFqwAIZmWADwABsVoC1AAABA8ACGbfAAhneAAAAAQEBwAIZxwAAAIQNYAOIHgAAYAHAAGxcAT4ABpCfGcACGePAAhnvwAIaqgAAhe8BasACGeRgA8AAbFaAtQAAAQPAAhoHwAIaqgAAAAEBAcACGhwAAACEDWADh/4AAGABwABsXAE+A07AAhouwAIaMwABi95gA4UaARbAAho6gMACGjXACLNFhX6IAD0cwAIaSi6Lg4+aAQABgcACGljACLNeAJAAScACGmMhHMACGmgujNABAAGBwAIagsAIs14AkG4+AT0cwAIalRbAAhqRLosDj8+LyAAAAACcuT8GkKAZwAIar8ACGrvAAhs3AACGDAFqwAIasGADwABsVoC1AAABA8ACGs7AAhs3AAAAAQEBwAIa3gAAAIQNYAOIagAAYAHAAGxcAT4BPTDAAhsgJ406BpChGcACGzzAAhtIwAIfmgAAhgcBasACGz1gA8AAbFaAtQAAAQPAAhtZwAIfmgAAAAEBAcACG2cAAACEDWADiF0AAGABwABsXAE+Aj0cwAIbcy6MvY+aAQABgMACG3/ACLRcAJA/TD4NPRzAAhuWLovEj5oBAAEWwAIbrYDAAhuowAi0XIYFiF8AkAFJwAIbwBbAAhvIFsACG8QuiwOPz4w2nI8+AUrAAhxwAD9OwAIck8ACHJgAAYwiYAOccAEfwAIcnpx8AAAAAE7AAhy5wAIcvgABhrxgA5xwAR/AAhzEnHwBAAABjTkpPRzAAhzwFsACHOwuiwOPz4wjAQABgsACHPXACLTzAJyVPRzAAh0HFsACHQMuiwOPz4xgAQABF8ACHRguiwYcwAIdFhbAAh0YLosGj9KBPwEAAZQAwABsiI/SAJzwScACHTIhHMACHUUWwAIdO4DAAh02wAi0XIWKiGAnAQABKwDAAGxePgE9HMACHVgujBiPmgMAAxbAAh10gMACHW/ACLRchYqIYCqBwAIdhsAItNYAkBw/PRzAAh2cLouDj5oBAAEWwAIdr4DAAh2qwAi0XIT4iGIAkABJwAIdvRzAAh3bFsACHcgWwAIdwS6K+I/EjGyhr4E7AQABkwDAAGyGPgM9HMACHe4WwAId6i6LA4/Pi5ABAAEWwAId/hbAAh33Lor4j8SMCaG0AJzFPRzAAh4jFsACHh8uiwOPz407AgACFsACHkgWwAIeQS6K+I/EjLuhsRbAAh5hFsACHlouiviPxIxsoa8AnOk9HMACHoIWwAIefi6LA4/PjBIBAAEWwAIelhbAAh6PLor4j8SMCaG0AJzNPz4CTsACHtYAAAA8XQPAAGxKAWADhRoBFsACHtYeAMAAbC8BAV0DwABsIAFgA4UaARbAAh7WgMACHtHACLRchgaIYQA9wABsS0UAAAEcwAIe1oMAwAi2qz4AAAAAwABsTQA+Ak7AAh7HAAAAjTxgA4UaARbAAh7fgwDACLarQMAAbE8+Aj0cwAIe6S6Lg4+aAQABhMACHvfACLcMAJAAPRzAAh8MFsACHwguiwOPz4vIAAAAAJy5PRzAAh8sFsACHyguiwOPz4wbAQABgsACHzXACLTzAJy6PRzAAh9HFsACH0MuiwOPz4wjAQABgcACH0zACLTWAJyVPRfAAh9bLosGHMACH1kWwAIfWy6LBo/SRAEAAZQAwABs4Y/SPgE9HMACH4MujL+PmgAAAACQQAaQohnAAh+fwAIfq8ACILYAAIY4AWrAAh+gYAPAAGxWgLUAAAEDwAIfw8ACILYAAAABAQHAAh/cAAAAhA1gA4kUAABgAcAAbFwBPgRJwAIf6BbAAh/0FsACH+wuH4+qjByQ9T4BPRzAAiATFsACIA8uiwOPz4wdAAAAAJzxPz0cwAIgLy6MC4+aAQABFsACIE6AwAIgScAIuAuFFIkWAJAWPRzAAiBdLoy4j5oDAAOAwAIgacAIuAsWwAIgfRbAAiB0gMACIG/ACLgLhRSJFoGIiOsWwAIgiIDAAiCDwAi4C4THiRcAkD09HMACIJcujBCPmgEAARbAAiCpgMACIKTACLgLhRSJFgCQGQaQoxnAAiC7wAIgx8ACImwAAIYYAWrAAiC8YAPAAGxWgLUAAAEDwAIg18ACImwAAAABAQHAAiDkAAAAhA1gA4ibAABgAcAAbFwBPgROwAIg/MACIQoAAYzaYAOccAEfwAIhEJx8AAAAAD0cwAIhHi6MGI+aAwADFsACITqAwAIhNcAIuRaFioidKoHAAiFMwAi5LwCQHD0cwAIhYS6Lg4+aAQABFsACIXSAwAIhb8AIuRaFi4ieAJAAScACIYAhHMACIZMWwAIhiYDAAiGEwAi5FoWMiJ8nAQABKwDAAGxePgVOwAIhsMACIbUAAYwiYAOccAEfwAIhu5x8AAAAAD0cwAIhzhbAAiHKLosDj8+MGwEAAYLAAiHXwAi5xQCcuj0cwAIh6BbAAiHkLosDj8+MIwEAAYHAAiHtwAi5LwCclT0cwAIiAy6Lg4+aAQABFsACIhaAwAIiEcAIuRaFjIifAJAAPRzAAiIsFsACIiguiwOPz4wjAQABgsACIjHACLnFAJyVPgE9HMACIk8WwAIiSy6LA4/PjCMBAAGBwAIiVMAIuS8AnJUGkKQZwAIiccACIn3AAiQNAACF/QFqwAIicmADwABsVoC1AAABA8ACIpLAAiQNAAAAAQEBwAIipAAAAIQNYAOIMwAAYAHAAGxcAT4JTsACIrbAAiK8AAGNPWADnHABH8ACIsKcfAAAAAA9IxzAAiLhFsACIs8uivmPxScBAAErAMAAbF4XwAIizy6K+R7AAiLpwABslgACYAOIM2ADnHAAAI/FKwFdA8AAbF8CYAOIM2ADnHA9HMACIx4WwAIjDS6K+Y/FgJwCAAKAwAIjH8AIur6BwAIjJ8AIutcAwABsYz0jHMACI0AWwAIjMi6K/o/KJwEAASsAwABsXhfAAiMyLor+HsACI0jAAGyWAAJgA4JSYAPAAGwfAACPyisBXQPAAGxfAmADglJgA8AAbB89HMACI28WwAIjYi6K/o/KgJwCAAKAwAIjcMAIur4WwAIjfxbAAiN4Lor4j8SMB6GwAMAAbGM9HMACI5gui4OPmgEAARbAAiOrgMACI6bACLq+hPiINQCQAD0cwAIjuhbAAiO2LosDj8+MIwEAAYHAAiO/wAi61wCclT0cwAIj3RbAAiPLLor5j8U1AQABgMACI+TACLq+AMAAbJg9HMACI/0WwAIj7y6K/o/KNQEAAYDAAiQEwAi6vgDAAGyYBpClGcACJBLAAiQewAIn+wAAhhoBasACJBNgA8AAbFaAtQAAAQPAAiQywAIn+wAAAAEBAcACJEMAAACEDWADiKcAAGABwABsXAE+A07AAiRVwAIkWgABi95gA4UaATXAAiRhAAABAGADhRoBFsACJGGAwAIkXMAIvKuFfoipIxzAAiRhgcACJGHACLzWJwEAASsAwABsXh/AAiRzhz0AAAAAgcACJGHACLzWAWADhRpOwAIknsACJK8AAYzJXQPAAGwZAWADiMkBHMACJLkujMSPmgIAAoDAAiTXwAi8qysAkERJwAIk6BbAAiT9gsACJOzACL0ogVbAAGzzPgI9HMACJQ4ui4OPmgEAAYHAAiUcwAi8xACQAD0cwAIlKS6LhI+aAAAAAJAMPgJJwAIlTRbAAiVZFsACJVEuH4+qjByQ9T4BPRzAAiXDFsACJb8uiwOPz4wdAAAAAJzxP0nAAiXjJcACJewAgcACJefACLzEYAOHCT4BPRzAAiYHLozIj5oCAAKCwAImGcAIvSg0wAImKwPAAiYrwAImcwAAAAAAAABgAcAAbFwBPgI9HMACJjoui4OPmgEAARTAAiZIwAi8xAEBYAOHCQCQAD0cwAImWS6LhI+aAAAAAJAMAJBFPgM9HMACJwQui4OPmgEAARbAAicXgMACJxLACLyrhX6IqQCQAD0cwAInMBbAAicsLosDj8+MEgEAARbAAidEFsACJz0uiviPxI0+obcAnM09HMACJ2UujMiPmgIAAoLAAid3wAi9KDTAAieJA8ACJ4nAAifoAAAAAAAAAGABwABsXAE+Aj0cwAInnBbAAieYLosDj8+LkAEAARbAAiesFsACJ6UuiviPxI0+obcAnMU9HMACJ84ui4SPmgAAAACQDACQRQaQphnAAigAwAIoDMACMEMAAIYPAWrAAigBYAPAAGxWgLUAAAEDwAIoIMACMEMAAAABAQHAAigxAAAAhA1gA4h4AABgAcAAbFwBPhE9IxzAAihLFsACKD0uiv6PyicBAAErAMAAbF4XwAIoPS6K/h7AAihTwABslgACYAOCUmADwABsHwAAj8orAV0DwABsXwJgA4JSYAPAAGwfPRzAAih6FsACKG0uiv6PyoCcAgACgMACKHvACL9PFsACKIoWwAIogy6K+I/EjAehsADAAGxjPRzAAiikLouDj5oBAAEWwAIot4DAAiiywAi/T4V+iHoAkABJwAIoyRbAAijRFsACKM0uiwOPz4w2nI8+AUrAAil0AD9OwAIpkcACKZYAAYH+YAPAAGwfARzAAimfFsACKZguiviPxIwoAQABgMACKbDACL9PAKGkPRzAAim/FsACKbsuiwOPz4wSAQABgcACKczACMAxAJzNTsACKeTAAinpAAGMImADnHABH8ACKe+cfAAAAABOwAIqDsACKhkAAY0/XQPAAGwZAWADnHABHsACKh/AAG1+AgFgA5xwAhbAAipIFsACKkKAwAIqPcAIv0+GDoh7gODAAGxqNMACKlADwAIqUMACKnsAAAABAQHAAipRAAAAgSZgA8AAbB8AAGADnHABSsACKlcBH8ACKlucfAEAAAGNOSkATsACKojAAiqWAAGNQGADovABHMACKqQWwAIqmC6K5Y+wi+QBAAGVAKSuPSMcwAIqyhbAAiq+Lor6j8YnAQABKwDAAGxeF8ACKr4uivoewAIq0sAAbJYAAmADiINgA5xwAACPxisBXQPAAGxfAmADiINgA5xwTsACKvfAAisEAACNQWADnHABgsACKwbACMCGRcACKxABwAIrGcACKxsAAIHUYAPAAGwfAZMBHMACKyKGwAIrIMAIwb2BOgEAARbAAisvFsACKymAwAIrJMAIv0+GDoh7gODAAGxqAMAAbIUBjsACKzfACMG9HMACKziGwAIrN8AIwb2BPwEAAZQAwABsiD4ETsACK1XAAitgAAGNQmADiIMBHMACK2wWwAIrZ4DAAitiwAi/T4YOiHspAQABhsACK23ACMG9AMAAbLhOwAIrg8ACK40AAY1DYAOccAEcwAIrmYPAAiuPwAjAoykBAAGGwAIrmsAIwb0AwABsuD0cwAIrrxbAAiukLor6j8aAnAIAAofAAiuwwAjCLRTAAiu+wAjCaAgAAMAAbGNJwAIr0BbAAivfh8ACK9TACMIthhKIiD4BPY3AAiv0wAjBnRTAAiwDwAjCaAgAPgNO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jj8BAAGApPvACWrhAKdgPR6lDKl2AQABIRylHYGlFMAJa2gnAQABKwCnxQBOpTqlSgABjkBgA8AAbB8BHKVuHqVYqXsBAAGApWbACWrhAIE/AQABIx6lcal6AQABgKWAwAlq4QCUkwFgA8AAbB8AwABsiE6loaWyAAGOQV0DwABsGQFgA4jnARalxBalu4CltMAJauGEx4O+hHCE9T0epeKpdgEAARymAxal84Gl6sAJa2iOQqe+JwEAARymIoOmEsAJa+WBPwEAARamNYSmJMAJbCyA4MAAbGoAwABsiADAAGwyAEWmRwGmUKZSAACB1GADwABsHwGTARymWYWmV8AJbKGBOgEAARambISmW8AJbCyA4MAAbGoAwABshQGNpnTACWyhHKZ1haZ0wAlsoYE/AQABlADAAGyIPgE9HKaFLo4vkc4DAAIcprWEpqXACWwsKQEAAYWmtsAJbKEAwABsuBymyRamw4GmusAJa2iBpqe5KQEAARym2oOmysAJa+WBPwEAAYWm3MAJbKEAwABsiADAAGy4AY0JHKcNgqb5wAlrlysBAAEcpyaEpxbACWwsKQEAAYWnJ8AJbKEAwABsuADAAGw0ketOp9en3QABhGldA8AAbBkBYAPAAGwYARan6IGn38AJa2iEaae6Raf3AagAqAIAAIHUYAPAAGwfAZMBHKgJhqgHwAltq4E6AQABFqgRhagLwAltg4DgwABsagDAAGyFAY6oGcAJbascqBqGqBnACW2rgT8BAAGUAMAAbIg+A06oMKg2AAGLeGADiOcBHqg4qX0CAAIWqFKAqEvACWrhhMeDvhyoYYWoXMAJbYMpAQABhqhiwAltqwDAAGy4AD0eqHGpdgEAASEcqH+HqHnACW4AJwEAASsAwABsXgA9HKiTLo4vkc4DAAKHqKTACW4AHKjIFqjCgai5wAlraIGmp7kpAQABHKjzHKjZg6jJwAlr5YE/AQABFqjshKjbwAlsLIDgwABsagDAAGyIgT8BAAGGqPXACW2rAMAAbIgAwABsuAGNCRypJoKpEsAJa5crAQABh6kvwAluAADAAGw0ketJqZkiIRappYCpnsAJauGDNIO2ACEcqckWqbwujhqR545DAQABgKnowAlq4QCSKz4BPRyp+S6OMZHOAQABgKoJwAlq4QCR7D9JqxwWqyeAqyDACWrhhMSDuj4D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PwEAAZQAwABsiD4BPRyIGxaIEi6CPJNNk1WAnAIAAoGIHMAKPm0ciH0ciFcciDoeiCGTYgEAARyIMRaIKC6CPJNNk1UpAQABHIg0gYgywAo+bUQBAAGVAMAAbOEAwABsuACBPwEAARyITxaIRi6CPJNNk1UpAQABHIhSgYhQwAo+bUQBAAE3BwDAAGzhAMAAbLgAwABsiIE/AQABHohjk2EBAAEciHMWiGougjyTTZNVKQEAARyIdoGIdMAKPm1EAQABNw8AwABs4QDAAGy4AADAAGyIgT8BAAEciJIWiIkugjyTTZNVKQEAARyIlYGIk8AKPm1EAQABNxAAwABs4QDAAGy4AMAAbIgAwABsy06Iy4jNAACAomADwABsHwEciNYWiM8ugkiTTZNUKQEAAZMAwABsuE6I44jlAACAo2ADwABsHwEciO4WiOcugkiTTZNUKQEAAZQAwABsuE6I+4j9AACBGGADwABsHwEciQYWiP8ugkiTTZNUKQEAAZUAwABsuE6JE4kVAACB92ADwABsHwEciR4WiRcugkiTTZNUKQEAAZYAwABsuE6JK4ktAACB+GADwABsHwEciTYWiS8ugkiTTZNUKQEAAZcAwABsuE6JQ4lFAACB+WADwABsHwEciU4WiUcugkiTTZNUKQEAATcFAMAAbLhOiVuJXQAAglVgA8AAbB8BHIlmFolfLoJIk02TVCkBAAE3BgDAAGy4TolziXUAAIDaYAPAAGwfARyJfhaJdy6CSJNNk1QpAQABNwcAwABsuEWJiAGJkYmTAACB1GADwABsHwGTARyJmhSJmMAKQPYJAIE6AQABN1AAwABshQEViaDACkD2CRyJoRSJoMAKQPYJAIE/AQABlADAAGyIPgpOibGJtwAAglZgA8AAbB8BHInkHInWHInHHIm7FIm5wApAywgAgT8BAAEeib2TYAEAAYWJxMAKQFQAAMAAbIiBPwEAAR6JyZNdAwADhYnNwApAVIaJ0MAKQHuHidPACkCjAADAAGyIgT8BAAEcieAaidiTUCkBAAEUieHACkD2CQAAwABsuADAAGyIgT8BAAEcie8WieYugjyTTZNVKQEAARSJ8MAKQPYJAADAAGy4AMAAbIhOif6KBAAAgodgA8AAbB8BHIoQHooGk18BAAGBig3ACj+4AIE/AQABHooSk14DAAOBihfACj+4gooawAo/34OKHcAKQAYAAMAAbIg9FYonwApAywiHiivACkCjPY+KNMAKQKOGijjACkB7PY6KQcAKQHuFikXACkBUPY2KTsAKQFQcilSEilLACkAtgT8BAAEUilbACkFCCgAAwABsiD2MimPACkAtg4pnwApABj2LinDACkAGgop0wAo/3z2Kin3ACj/fgYqBwAo/uD2JiorACj+4HIqUFIqOwApBQgoAgT8BAAEUipbACkH2CwAAwABsiD01itMAAAEAYAPAAG3KARaK0y6CSJNNk1Q1itsAAAEAYAPAAGwfAZMcitoUitPACkLpCQCAnAIAAhSK28AKQwEKAByK3hyK2hSK08AKQukJACkBAAEUitvACkMBCgAAwABsuIE/AQABgYrhwAo/uADAAGyIAMAAbMs9NYroAAABAGADwABtygEWiugugkiTTZNUNYrwAAABAGADwABsHwGUHIrvFIrowApDYgkAgJwCAAIUivDACkN6CgAcivMciu8UiujACkNiCQApAQABFIrwwApDegoAAMAAbLiBPwEAAYKK9sAKP98AwABsiADAAGzLPTWK/QAAAQBgA8AAbcoBFor9LoJIk02TVDWLBQAAAQBgA8AAbB8BlRyLBBSK/cAKQ9sJAICcAgACFIsFwApD8woAHIsIHIsEFIr9wApD2wkAKQEAARSLBcAKQ/MKAADAAGy4gT8BAAGDiwvACkAGAMAAbIgAwABsyz01ixIAAAEAYAPAAG3KARaLEi6CSJNNk1Q1ixoAAAEAYAPAAGwfAZYcixkUixLACkRUCQCAnAIAAhSLGsAKRGwKAByLHRyLGRSLEsAKRFQJACkBAAEUixrACkRsCgAAwABsuIE/AQABhIsgwApALQDAAGyIAMAAbMs9NYsnAAABAGADwABtygEWiycugkiTTZNUNYsvAAABAGADwABsHwGXHIsuFIsnwApEzQkAgJwCAAIUiy/ACkTlCgAcizIciy4UiyfACkTNCQApAQABFIsvwApE5QoAAMAAbLiBPwEAAYWLNcAKQFQAwABsiADAAGzLPTWLPAAAAQBgA8AAbcoBFos8LoJIk02TVDWLRAAAAQBgA8AAbB8BNwUci0MUizzACkVGCQCAnAIAAhSLRMAKRV4KAByLRxyLQxSLPMAKRUYJACkBAAEUi0TACkVeCgAAwABsuIE/AQABhotK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E8AAbCwEAAQcwABEGS6Q0wEAARbAAEQ1FsAARDAukIyUXpRigQKTowCUooMAwArKWYQAwArKYRQAwArKiwgAACs9icAARADACso/F8AARAcukI2UXh7AAEQZwABsLwEBYAO05AEUAMAKyqEJAACUY0IAAD9JwABEUhzAAERkFsAARF0WwABEVi6BMpRxgODAAGxqgTsBAAGUAMAAbIY+Az0cwABE9C6QqAIAAmrAAEUVYAOy25HZasAARUZgA5OLCACUmT2JwABFVMAKyj8XwABFWy6QjZReasAARXBgA7TkkfeUY0IAAD9OwABFi8AARZEAAIDhYAPAAGxYARbAAEWaFsAARZMugTKUcYFpwABslEnAAEXvHMAARgAWwABF+RTAAEXzwArMMgwAgSLAAGyAJwEAASeBIwDAAGw2PgI9icAARgvACso/F8AARhIukI2UXmrAAEYnYAO05JH3lGNCAAA/ScAARjgcwABGSRbAAEZCFMAARjzACswyDACBIsAAbIAnAQABJzQAwABsNj4DPRzAAEZgLonNAgACHMAARplqwABGcmADstuSAouMAwADFMAARrXACswyDAAcwABGvJSBWgAAAADAAGyPasAARsBgA8AAbB8DALLjasAARt5gA5OLCACUjz2JwABG7MAKyj8XwABG8y6QjZReasAARwhgA7TkkfeUY0IAAD9NwABHMgI1AAAAAABbAR7AAEcywABsLAQABBzAAEc4LpDZlF4BAAEWwABHTRbAAEdGLoEylHGBacAAbJQAlJWDAMAKylmEAMAKymEUAMAKyosIAAArPYnAAEcfwArKPxfAAEcmLpCNlF4ewABHOMAAbC8BAWADtOQBFADACsqhCQAAlGNCAAA9HgDAAGw3AgACgADACsocgQDACso/AErAAEdXAAMBAFsBAAAAAB1bAAEAAAAAHlsAPgE9HACAAMAKyhwtAgACFADACs4ADAAUAMAKzggNAADAAGw6PYoAwArKUR4AwABsOwEAARQAwArKiwgAAD2LAMAKylkeAMAAbDwBAAEUAMAKyosIAAA9jADACsphHgDAAGw9AQABFADACsqLCAAAPRzAAEOBgADACsocLgEAARQAwArKiwgAAABKAAEWAIAAwArKHC/AAGw/BpSiOsAAR5vAAEeswABLlQAAkNMAAAABA8AAR8LAAEuVAAIA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BoDwAACtzAABAAGHQYFVAACThQAAgZcAAIIuAAEBA4aThkSHQYH0AAC19AAAghgBAK3MAAEAAYdBgn0BAJOFAACEGpOLk4eTiJOJk4qt0LLEss+y27Lnsu6y/rMVsdytzrHdrdGt0q3TrdSt1a3Wrdet2K3Zrdqt263crd2t3q3freCt4a3ireOt5K3lreat563oremt6q3rreyt7a3ure+t8K3xrfKt8630rfWt9q33rfit+a36rfut/K39rf6t/64ArgGuAq4DrgSuBa4GrgeuCK4JrgquC64Mrg2uDq4PrhCuEa4SrhOuFK4VrhauF64YrhmuGq4brhyuHa4erh+uIK4hriKuI64kriWuJq4nriiuKa4qriuuLK4tri6uL64wrjGuMq4zrjSuNa42rjeuOK45rjquO648rj2uPq4/rkCuQa5CrkOuRK5FrkauR65IrkmuSq5LrkyuTa5Ork+uUK5RrlKuU65UrlWuVq5XrliuWa5arluuXK5drl6uX65grmGuYq5jrmSuZa5mrmeuaK5prmqua65srm2ubq5vrnCuca5yrnOudK51rnaud654rnmueq57rnyufa5+rn+ugK6BroKug66EroWuhq6Hroiuia6KrouujK6Nro6uj66QrpGukq6TrpSula6WrpeumK6Zrpqum66crp2unq6frqCuoa6irqOupK6lrqaup66orqmuqq6rrqyura6urq+usK6xrrKus660rrWutq63rriuua66rruuvK69rr6uv67ArsGuwq7DrsSuxa7GrseuyK7Jrsquy67Mrs2uzq7PrtCu0a7SrtOu1K7Vrtau167Yrtmu2q7brtyu3a7ert+u4K7hruKu467kruWu5q7nruiu6a7qruuu7K7tru6u767wrvGu8q7zrvSu9a72rveu+K75rvqu+678rv2u/q7/rwCvAa8CrwOvBK8FrwavB68IrwmvCq8LrwyvDa8Orw+vEK8RrxKvE68UrxWvFq8XrxivGa8arxuvHK8drx6vH68gryGvIq8jrySvJa8mryevKK8pryqvK68sry2vLq8vrzCvMa8yrzOvNK81rzavN684rzmvOq87rzyvPa8+rz+vQK9Br0KvQ69Er0WvRq9Hr0ivSa9Kr0uvTK9Nr06vT69Qr1GvUq9Tr1SvVa9Wr1evWK9Zr1qvW69cr12vXq9fr2CvYa9ir2OvZK9lr2avZ69or2mvaq9rr2yvba9ur2+vcK9xr3Kvc690r3Wvdq93r3ivea96r3uvfK99r36vf6+Ar4Gvgq+Dr4Svha+Gr4eviK+Jr4qvi6+Mr42vjq+Pr5Cvka+Sr5OvlK+Vr5avl6+Yr5mvmq+br5yvna+er5+voK+hr6Kvo6+kr6Wvpq+nr6ivqa+qr6uvrK+tr66vr6+wr7Gvsq+zr7Svta+2r7evuK+5r7qvu6+8r72vvq+/r8Cvwa/Cr8OvxK/Fr8avx6/Ir8mvyq/Lr8yvza/Or8+v0K/Rr9Kv06/Ur9Wv1q/Xr9iv2a/ar9uv3K/dr96v36/gr+Gv4q/jr+Sv5a/mr+ev6K/pr+qv66/sr+2v7q/vr/Cv8a/yr/Ov9K/1r/av96/4r/mv+q/7r/yv/a/+r/+wALABsAKwA7AEsAWwBrAHsAiwCbAKsAuwDLANsA6wD7AQsBGwErATsBSwFbAWsBewGLAZsBqwG7AcsB2wHrAfsCCwIbAisCOwJLAlsCawJ7AosCmwKrArsCywLbAusC+wMLAxsDKwM7A0sDWwNrA3sDiwObA6sDuwPLA9sD6wP7BAsEGwQrBDsESwRbBGsEewSLBJsEqwS7BMsE2wTrBPsFCwUbBSsFOwVLBVsFawV7BYsFmwWrBbsFywXbBesF+wYLBhsGKwY7BksGWwZrBnsGiwabBqsGuwbLBtsG6wb7BwsHGwcrBzsHSwdbB2sHeweLB5sHqwe7B8sH2wfrB/sICwgbCCsIOwhLCFsIawh7CIsImwirCLsIywjbCOsI+wkLCRsJKwk7CUsJWwlrCXsJiwmbCasJuwnLCdsJ6wn7CgsKGworCjsKSwpbCmsKewqLCpsKqwq7CssK2wrrCvsLCwsbCysLOwtLC1sLawt7C4sLmwurC7sLywvbC+sL+wwLDBsMKww7DEsMWwxrDHsMiwybDKsMuwzLDNsM6wz7DQsNGw0rDTsNSw1bDWsNew2LDZsNqw27DcsN2w3rDfsOCw4bDisOOw5LDlsOaw57DosOmw6rDrsOyw7bDusO+w8LDxsPKw87D0sPWw9rD3sPiw+bD6sPuw/LD9sP6w/7EAsQGxArEDsQSxBbEGsQexCLEJsQqxC7EMsQ2xDrEPsRCxEbESsROxFLEVsRaxF7EYsRmxGrEbsRyxHbEesR+xILEhsSKxI7EksSWxJrEnsSixKbEqsSuxLLEtsS6xL7EwsTGxMrEzsTSxNbE2sTexOLE5sTqxO7E8sT2xPrE/sUCxQbFCsUOxRLFFsUaxR7FIsUmxSrFLsUyxTbFOsU+xULFRsVKxU7FUsVWxVrFXsVixWbFasVuxXLFdsV6xX7FgsWGxYrFjsWSxZbFmsWexaLFpsWqxa7FssW2xbrFvsXCxcbFysXOxdLF1sXaxd7F4sXmxerF7sXyxfbF+sX+xgLGBsYKxg7GEsYWxhrGHsYixibGKsYuxjLGNsY6xj7GQsZGxkrGTsZSxlbGWsZexmLGZsZqxm7GcsZ2xnrGfsaCxobGisaOxpLGlsaaxp7GosamxqrGrsayxrbGusa+xsLGxsbKxs7G0sbWxtrG3sbixubG6sbuxvLG9sb6xv7HAscGxwrHDscSxxbHGscexyLHJscqxy7HMsc2xzrHPsdCx0bHSsdOx1LHVsdax17HYsdmx2gEAkTMAAACAnASU2j6Cf4PDBpE0AF0DsucBYQMEYAPAAGwYYAOJVWADiVVgA8AAbFtgA7LPAWqCp10DsucBYQMEYAPAAGwYYAOJVWADiVVgA8AAbFtgA7LPkr0ElNs+hHyFlAaRNgBdA7LEAWEDBGADwABsGGADiVVgA4lVYAPAAGxbYAOyzwFqhKBdA7LEAWEDBGADwABsGGADiVVgA4lVYAPAAGxbYAOyz5L4BJTcPokwiooGkTkAXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss8BaolaXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss+TMQSU3T6LO4xdBpE7AF0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWqLYV0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPk2YElN4+j5uQ1waRPgBdA7LnAWEDAmADilBgA8AAbFtgA7LPAWqPxV0DsucBYQMCYAOKUGADwABsW2ADss+TmQSU3z6RZZJoBpFAAF0DssQBYQMCYAOKUGADwABsW2ADss8BapGLXQOyxAFhAwJgA4pQYAPAAGxbYAOyz5PKBJTgPpVHlnMGkUMAXQOy5wFhAwJgA4pQYAPAAGxbYAOyzwFqlW1dA7LnAWEDAmADilBgA8AAbFtgA7LPk/kElOE+lwGX9AaRRQBdA7LEAWEDAmADilBgA8AAbFtgA7LPAWqXI10DssQBYQMCYAOKUGADwABsW2ADss+UKgSU4j6aw5wABpFIAF0DsucBYQMCYAOKUGADwABsW2ADss8BaprzXQOy5wFhAwJgA4pQYAPAAGxbYAOyz5RZBJTjPpyOnbgGkUoAXQOyxAFhAwJgA4pQYAPAAGxbYAOyzwFqnLpdA7LEAWEDAmADilBgA8AAbFtgA7LPlIoElOQ+oIuh6QaRTQBdA7LnAWEDAmADiVVgA8AAbFtgA7LPAWqgtl0DsucBYQMCYAOJVWADwABsW2ADss+UuQSU5T6ic6MqBpFPAF0DssQBYQMCYAOJVWADwABsW2ADss8BaqKeXQOyxAFhAwJgA4lVYAPAAGxbYAOyz5TdBJTmPqZLp/AGkVEAXQOy5wFhAwVgA8AAbBhgA4pQYAOJVWADiVVgA8AAbFtgA7LPAWqmfV0DsucBYQMFYAPAAGwYYAOKUGADiVVgA4lVYAPAAGxbYAOyz5ULBJTnPqjDqdQGkVMAXQOyxAFhAwVgA8AAbBhgA4pQYAOJVWADiVVgA8AAbFtgA7LPAWqo8V0DssQBYQMFYAPAAGwYYAOKUGADiVVgA4lVYAPAAGxbYAOyz5U9BJToPq59sCgGkVUAXQOy5wFhAwNgA4pQYAOJVWADwABsW2ADss8Baq6vXQOy5wFhAwNgA4pQYAOJVWADwABsW2ADss+VeQSU6T6w3LHOBpFXAF0DssQBYQMDYAOKUGADiVVgA8AAbFtgA7LPAWqxCl0DssQBYQMDYAOKUGADiVVgA8AAbFtgA7LPlaEElOo+tZC2/AaRWQBdA7LnAWEDA2ADwABsGGADilBgA8AAbFtgA7LPAWq1wV0DsucBYQMDYAPAAGwYYAOKUGADwABsW2ADss+V0wSU6z63r7jlBpFbAF0DssQBYQMDYAPAAGwYYAOKUGADwABsW2ADss8BarfcXQOyxAFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyz5YKBJTsPrxGvasGkV4AXQOy5wFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyzwFqvHJdA7LnAWEDA2ADwABsGGADilBgA8AAbFtgA7LPlj8ElO0+vl6/hgaRYABdA7LEAWEDA2ADwABsGGADilBgA8AAbFtgA7LPAWq+hl0DssQBYQMDYAPAAGwYYAOKUGADwABsW2ADss+WdgSU7j7AAELEwABEmQaRYwBdA7LnAWEDAmADilBgA8AAbFtgA7LPAWrAAEL/XQOy5wFhAwJgA4pQYAPAAGxbYAOyz5arBJTvPsAARSfAAEZpBpFlAF0DssQBYQMCYAOKUGADwABsW2ADss8BasAARV5dA7LEAWEDAmADilBgA8AAbFtgA7LPltwElPA+wABJ1cAAS1UGkWgAXQOy5wFhAwJgA4pQYAPAAGxbYAOyzwFqwABKAF0DsucBYQMCYAOKUGADwABsW2ADss+XCwSU8T7AAEvjwABM6QaRagBdA7LEAWEDAmADilBgA8AAbFtgA7LPAWrAAEwKXQOyxAFhAwJgA4pQYAPAAGxbYAOyz5cvBJTyPsAAUFLAAFGkBpFsAF0DsucBYQMEYAOKUGADiVVgA4lVYAPAAGxbYAOyzwFqwABQd10DsucBYQMEYAOKUGADiVVgA4lVYAPAAGxbYAOyz5deBJTzPsAAUlzAAFMvBpFuAF0DssQBYQMEYAOKUGADiVVgA4lVYAPAAGxbYAOyzwFqwABSfV0DssQBYQMEYAOKUGADiVVgA4lVYAPAAGxbYAOyz5eKBJT0PsAAVv3AAFguBpFwAF0DsucBYQMCYAOKUGADwABsW2ADss8BasAAVyldA7LnAWEDAmADilBgA8AAbFtgA7LPl8AElPU+wABYvMAAWeUGkXIAXQOyxAFhAwJgA4pQYAPAAGxbYAOyzwFqwABY5F0DssQBYQMCYAOKUGADwABsW2ADss+X8QSU9j7AAFzfwABetQaRdQBdA7LnAWEDA2ADiVVgA8AAbBhgA8AAbFtgA7LPAWrAAF0GXQOy5wFhAwNgA4lVYAPAAGwYYAPAAGxbYAOyz5gjBJT3PsAAX2LAAGB5BpF4AF0DssQBYQMDYAOJVWADwABsGGADwABsW2ADss8BasAAX4VdA7LEAWEDA2ADiVVgA8AAbBhgA8AAbFtgA7LPmFsElPg+wABkU8AAZXcGgr0AXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss8BasAAZHddA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyz5iQBJT5PsAAZijAAGbtBpF8AF0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWrAAGZIXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss+YuASU+j7AAGnmwABrJgaCvgBdA7LnAWEDAmADiVVgA8AAbFtgA7LPAWrAAGoTXQOy5wFhAwJgA4lVYAPAAGxbYAOyz5jqBJT7PsAAa7DAAGxtBpF/AF0DssQBYQMCYAOJVWADwABsW2ADss8BasAAa91dA7LEAWEDAmADiVVgA8AAbFtgA7LPmQ4ElPw+wABvJ8AAcHIGgr8AXQOy5wFhAwJgA4lVYAPAAGxbYAOyzwFqwABvVl0DsucBYQMCYAOJVWADwABsW2ADss+ZPASU/T7AAHD8wABxvwaRggBdA7LEAWEDAmADiVVgA8AAbFtgA7LPAWrAAHErXQOyxAFhAwJgA4lVYAPAAGxbYAOyz5lgBJT+PsAAdKLAAHW2BoLGAF0DsucBYQMCYAOJVWADwABsW2ADss8BasAAdMFdA7LnAWEDAmADiVVgA8AAbFtgA7LPmY4ElP8+wAB2QMAAdtMGkYUAXQOyxAFhAwJgA4lVYAPAAGxbYAOyzwFqwAB2X10DssQBYQMCYAOJVWADwABsW2ADss+ZsgSVAD7AAHnBwAB7DwaCxwBdA7LnAWEDBGADiVVgA4lVYAOJVWADwABsW2ADss8BasAAeeFdA7LnAWEDBGADiVVgA4lVYAOJVWADwABsW2ADss+Z4ASVAT7AAHvEwAB8hQaRiABdA7LEAWEDBGADiVVgA4lVYAOJVWADwABsW2ADss8BasAAe+BdA7LEAWEDBGADiVVgA4lVYAOJVWADwABsW2ADss+aDASVAj7AAIBPwACB8QaRigBdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAICQXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz5pCBJUDPsAAgp7AAIO2BpGMAF0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasAAgttdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPmmwElQQ+wACHQ8AAiOYGkY4AXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwACHhl0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss+aoASVBT7AAImTwACK5waRkABdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAInSXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz5rKBJUGPsAAjnXAAI/sBpGSAF0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasAAjq1dA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPmv8ElQc+wACQmcAAkZYGkZQAXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwACQzV0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss+bKQSVCD7AAJUEwACWdwaRlgBdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAJU+XQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz5tdBJUJPsAAlyTAAJhdBpGYAF0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasAAl1pdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPm4cElQo+wACby8AAnXcGkZoAXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss8BasAAm/1dA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyz5u/BJULPsAAnijAAJ9sBpGdAF0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWrAAJ5WXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss+b9QSVDD7AAKMLwACkWAaRoABdA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwFqwACjNF0DsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPnCgElQ0+wAClCcAApiIGkaIAXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss8BasAApS5dA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyz5xdBJUOPsAAqUbAAKsEBpGlAF0DsucBYQMCYAOJVWADwABsW2ADss8BasAAqYZdA7LnAWEDAmADiVVgA8AAbFtgA7LPnJMElQ8+wACrjsAArNsGkagAXQOyxAFhAwJgA4lVYAPAAGxbYAOyzwFqwACrzl0DssQBYQMCYAOJVWADwABsW2ADss+cxQSVED7AAK/wwACw5gaCyABdA7LnAWEDAmADiVVgA8AAbFtgA7LPAWrAALAVXQOy5wFhAwJgA4lVYAPAAGxbYAOyz4wnBJURPsAAsXDAALIVBpGrAF0DssQBYQMCYAOJVWADwABsW2ADss8BasAAsZVdA7LEAWEDAmADiVVgA8AAbFtgA7LPnPEElRI+wAC0ecAAtiwGka0AXQOy5wFhAwJgA4lVYAPAAGxbYAOyzwFqwAC0oV0DsucBYQMCYAOJVWADwABsW2ADss+dIgSVEz7AALa2wAC3pgaRsABdA7LEAWEDAmADiVVgA8AAbFtgA7LPAWrAALbeXQOyxAFhAwJgA4lVYAPAAGxbYAOyz51UBJUUPsAAuuPAALxGBpGzAF0DsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWrAALsWXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss+dgwSVFT7AALz3wAC+OAaRtQBdA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwFqwAC9Jl0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPnbgElRY+wADBs8AAw6IGkbgAXQOy5wFhAwVgA4lVYAOJVWADwABsGGADwABsGGADwABsW2ADss8BasAAwdldA7LnAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyz53uBJUXPsAAxG3AAMWiBpG7AF0DssQBYQMFYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbFtgA7LPAWrAAMSPXQOyxAFhAwVgA4lVYAOJVWADwABsGGADwABsGGADwABsW2ADss+eMASVGD7AAMqVwADMrwaRvgBdA7LnAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyzwFqwADKx10DsucBYQMFYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbFtgA7LPnm8ElRk+wADNesAAztsGkcAAXQOyxAFhAwVgA4lVYAOJVWADwABsGGADwABsGGADwABsW2ADss8BasAAzahdA7LEAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyz56kBJUaPsAA1F7AANcMBpHCAF0DsucBYQMHYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbFtgA7LPAWrAANSPXQOy5wFhAwdgA4lVYAOJVWADwABsGGADwABsGGADwABsGGADwABsGGADwABsW2ADss+e4wSVGz7AANg4wADaDwaRxABdA7LEAWEDB2ADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxbYAOyzwFqwADYaV0DssQBYQMHYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbFtgA7LPnyQElRw+wADg2MAA46wGkcYAXQOy5wFhAwdgA4lVYAOJVWADwABsGGADwABsGGADwABsGGADwABsGGADwABsW2ADss8BasAA4RFdA7LnAWEDB2ADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxbYAOyz59yBJUdPsAA5NzAAObHBpHJAF0DssQBYQMHYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbFtgA7LPAWrAAOURXQOyxAFhAwdgA4lVYAOJVWADwABsGGADwABsGGADwABsGGADwABsGGADwABsW2ADss+fswSVHj7AAO1RwADvZgaRywBdA7LnAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyzwFqwADtf10DsucBYQMFYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbFtgA7LPn/4ElR8+wADwMcAA8X4Gkc0AXQOyxAFhAwVgA4lVYAOJVWADwABsGGADwABsGGADwABsW2ADss8BasAA8FtdA7LEAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyz6AzBJUgPsAA9qjAAPjBBpHPAF0DsucBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyzwFqwAD2110DsucBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyz6ByBJUhPsAA+Z3AAPsGBpHRAF0DssQBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyzwFqwAD5yF0DssQBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyz6CrBJUiPsABAL/AAQL+BpHTAF0DsucBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyzwFqwAEA9l0DsucBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyz6DuBJUjPsABA9rAAQVTBpHVAF0DssQBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyzwFqwAEEDV0DssQBYQMGYAOJVWADiVVgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyz6EnBJUkPsABCxPAAQ0K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YAPAAGxbYAOyzwFqwAFbml0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPph4ElTw+wAFgV8ABYdMGkhcAXQOy5wFhAwRgA4lVYAOJVWADiVVgA8AAbFtgA7LPAWrAAWCNXQOy5wFhAwRgA4lVYAOJVWADiVVgA8AAbFtgA7LPplEElT0+wAFilMABZAEGkhkAXQOyxAFhAwRgA4lVYAOJVWADiVVgA8AAbFtgA7LPAWrAAWLGXQOyxAFhAwRgA4lVYAOJVWADiVVgA8AAbFtgA7LPpooElT4+wAFn8sABaZ8GkhwAXQOy5wFhAwRgA8AAbBhgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAFoJF0DsucBYQMEYAPAAGwYYAPAAGwYYAOJVWADwABsW2ADss+mwQSVPz7AAWpVwAFrnAaSHgBdA7LEAWEDBGADwABsGGADwABsGGADiVVgA8AAbFtgA7LPAWrAAWqDXQOyxAFhAwRgA8AAbBhgA8AAbBhgA4lVYAPAAGxbYAOyz6b+BJVAPsABb63AAXD/BpIhAF0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABb9RdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPpzkElUE+wAFxrMABcqQGkiMAXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAFxz10DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss+nYwSVQj7AAXXKwAF3TgaSJQBdA7LnAWEDAmADiVVgA8AAbFtgA7LPAWrAAXX2XQOy5wFhAwJgA4lVYAPAAGxbYAOyz6ebBJVDPsABd9jAAXiSBpIoAF0DssQBYQMCYAOJVWADwABsW2ADss8BasABeARdA7LEAWEDAmADiVVgA8AAbFtgA7LPp8AElUQ+wAF7hcABfQUGkioAXQOy5wFhAwJgA4lVYAPAAGxbYAOyzwFqwAF7s10DsucBYQMCYAOJVWADwABsW2ADss+n7gSVRT7AAX2PwAF+dQaSLABdA7LEAWEDAmADiVVgA8AAbFtgA7LPAWrAAX29XQOyxAFhAwJgA4lVYAPAAGxbYAOyz6gTBJVGPsABgYfAAYMTBpIuAF0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABga9dA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPqEUElUc+wAGDs8ABhG8GkjEAXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAGD110DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss+ocASVSD7AAYfnwAGJawaSMwBdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAYgRXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz6ikBJVJPsABihjAAYsZBpI1AF0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABij5dA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPqM8ElUo+wAGOicABj+AGkjcAXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAGOs10DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss+pBASVSz7AAZCNwAGRYAaSOQBdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAZCzXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz6kuBJVMPsABlK7AAZX9BpI7AF0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABlNpdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPqWIElU0+wAGWqsABl7EGkj0AXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAGW0l0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss+pjASVTj7AAZr3wAGckQaSPwBdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAZsjXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz6nEBJVPPsABnT7AAZ4XBpJCAF0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABnWZdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPqe8ElVA+wAGhncABoy8GkkQAXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAGhy10DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss+qIwSVUT7AAaPcwAGk6QaSRgBdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAaQGXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz6pOBJVSPsABqGfAAaoDBpJIAF0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABqKJdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPqoMElVM+wAGqsMABq7YGkkoAXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAGq510DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss+qrQSVVD7AAa89wAGw2gaSTABdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAa96XQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz6rhBJVVPsABsYfAAbLJBpJOAF0DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasABscBdA7LEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPqwsElVY+wAG2fcABuMsGklAAXQOy5wFhAwZgA8AAbBhgA8AAbBhgA4lVYAOJVWADwABsGGADwABsW2ADss8BasABtqtdA7LnAWEDBmADwABsGGADwABsGGADiVVgA4lVYAPAAGwYYAPAAGxbYAOyz6tDBJVXPsABuaTAAbr1BpJTAF0DssQBYQMGYAPAAGwYYAPAAGwYYAOJVWADiVVgA8AAbBhgA8AAbFtgA7LPAWrAAbnOXQOyxAFhAwZgA8AAbBhgA8AAbBhgA4lVYAOJVWADwABsGGADwABsW2ADss+riwSVWD7AAcDWwAHCzAaSVgBdA7LnAWEDBWADwABsGGADiVVgA4lVYAPAAGwYYAPAAGxbYAOyzwFqwAHBBV0DsucBYQMFYAPAAGwYYAOJVWADiVVgA8AAbBhgA8AAbFtgA7LPq9MElVk+wAHDl8ABxOUGklkAXQOyxAFhAwVgA8AAbBhgA4lVYAOJVWADwABsGGADwABsW2ADss8BasABw8JdA7LEAWEDBWADwABsGGADiVVgA4lVYAPAAGwYYAPAAGxbYAOyz6wIBJVaPsAByf7AAcunBpJbAF0DsucBYQMFYAPAAGwYYAOJVWADiVVgA8AAbBhgA8AAbFtgA7LPAWrAAcopXQOy5wFhAwVgA8AAbBhgA4lVYAOJVWADwABsGGADwABsW2ADss+sRwSVWz7AAcxywAHNrAaSXQBdA7LEAWEDBWADwABsGGADiVVgA4lVYAPAAGwYYAPAAGxbYAOyzwFqwAHMmV0DssQBYQMFYAPAAGwYYAOJVWADiVVgA8AAbBhgA8AAbFtgA7LPrHsElVw+wAHSfsAB1EIGkl8AXQOy5wFhAwZgA4lVYAPAAGwYYAPAAGwYYAOJVWADwABsGGADwABsW2ADss8BasAB0rFdA7LnAWEDBmADiVVgA8AAbBhgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyz6y6BJVdPsAB1RvAAdY1BpJhAF0DssQBYQMGYAOJVWADwABsGGADwABsGGADiVVgA8AAbBhgA8AAbFtgA7LPAWrAAdVKXQOyxAFhAwZgA4lVYAPAAGwYYAPAAGwYYAOJVWADwABsGGADwABsW2ADss+s9ASVXj7AAduHwAHdJgaSYwBdA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwFqwAHbwl0DsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPrTsElV8+wAHd18AB3zkGkmYAXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss8BasAB3g5dA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyz61kBJVgPsAB4r3AAeQhBpJoAF0DsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWrAAeLnXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss+tlwSVYT7AAeTSwAHl+AaSagBdA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwFqwAHk+F0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPrcwElWI+wAHpWsAB6tEGkm0AXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss8BasAB6Y9dA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyz63/BJVjPsAB64LAAezMBpJvAF0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWrAAeuzXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss+uNASVZD7AAfBBwAHxwAaScgBdA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwFqwAHweF0DsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPrmcElWU+wAHyccAB88MGknQAXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss8BasAB8qRdA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyz66cBJVmPsAB9xnAAfhUBpJ3AF0DsucBYQMCYAOJVWADwABsW2ADss8BasAB90RdA7LnAWEDAmADiVVgA8AAbFtgA7LPrs8ElWc+wAH43sAB+ZUGknkAXQOyxAFhAwJgA4lVYAPAAGxbYAOyzwFqwAH5CV0DssQBYQMCYAOJVWADwABsW2ADss+u8wSVaD7AAfxowAH9fwaSewBdA7LnAWEDAmADiVVgA8AAbFtgA7LPAWrAAfyLXQOy5wFhAwJgA4lVYAPAAGxbYAOyz68hBJVpPsAB/gnAAf6oBpJ9AF0DssQBYQMCYAOJVWADwABsW2ADss8BasAB/ixdA7LEAWEDAmADiVVgA8AAbFtgA7LPr0UElWo+wAIBcMACAusGkn8AXQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss8BasACAZ5dA7LnAWEDA2ADiVVgA4lVYAPAAGxbYAOyz69zBJVrPsACA5zAAgTOBpKBAF0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPAWrAAgPGXQOyxAFhAwNgA4lVYAOJVWADwABsW2ADss+vqASVbD7AAgggwAIJawaShABdA7LnAWEDAmADiVVgA8AAbFtgA7LPAWrAAghTXQOy5wFhAwJgA4lVYAPAAGxbYAOyz6/bBJVtPsACCfXAAgrEBpKGAF0DssQBYQMCYAOJVWADwABsW2ADss8BasACCihdA7LEAWEDAmADiVVgA8AAbFtgA7LPr/8ElW4+wAINicACDtEGkogAXQOy5wFhAwJgA4lVYAPAAGxbYAOyzwFqwAINvl0DsucBYQMCYAOJVWADwABsW2ADss+wLQSVbz7AAg9bwAIQXgaSigBdA7LEAWEDAmADiVVgA8AAbFtgA7LPAWrAAg+QXQOyxAFhAwJgA4lVYAPAAGxbYAOyz7BRBJVwPsACE1PAAhT2BpKMAF0DsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8BasACE3NdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPsIMElXE+wAIVo8ACFpcGko8AXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwFqwAIVv10DssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss+wuwSVcj7AAhpSwAIb7AaSkgBdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPAWrAAhpyXQOy5wFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz7Dz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ANr8AAAAg1ZgA8AAbFsAAGADss8BPg5OwADbJMAA2ywAAJKiYAO19wEfwADbMrYfAQABhsAA2z7AC2z/AE7AANtmwADbcAAAkqNdA8AAbBkBYAPAAGxWARzAANt6h8AA23LAC20YkqQBAAGAwADbhMALbKMAtf5OwADbm8AA26YAAJKlXQPAAGwZAWADwABsVgEcwADbsIfAANuowAttGJKkAQABgcAA27rAC2yxALX+ScAA28UWwADbzoLAANvJwAtsv4FWwABsjT0wwADb1yeSoT89isAA2/PAC2y/HsAA2/qCRwEAAYLAANwXwAtsvwBJwADcIBbAANwqg8AA3CTAC2zPgVbAAGyNPTDAANwzJ5KhPz2LwADcT8ALbM8ewADcV4JHAQABg8AA3HTAC2zPAEnAANx+FsAA3IiEwADcgsALbN+BVsAAbI09MMAA3JEnkqE/PYzAANytwAts3x7AANy1gkcBAAGEwADc0sALbN8AScAA3NwWwADc5oXAANzgwAts74FWwABsjT0wwADc7yeSoT89jcAA3QvAC2zvHsAA3ROCRwEAAYXAAN0wwAts7wBOwADdQcAA3UYAAIGXYAPAAGwYARzAAN1SFMAA3UjAC20+CACGvAAAAADAAG0vTsAA3WPAAN1pAACC3mADwABsGAEcwADddhTAAN1rwAtteAkAhrwAAAAAwABtL0rAAN2AAR/AAN2LstoEAAFqwADdk10DssQBYQMHYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbFtgA7LPnyQDgJYcwADediTAAN52DSeTCBTAAN3mwAtutgoAJ5MJFMAA3g3AC27kCwAnkwqCwADeLcALbL8nkr6DwADeOsALbM8nkxCEwADeVsALbN8nkxGFwADeasALbO8nkSSBPwEAARbAAN6Oh8AA3obAC20Ykqm2HQDAAG09kSgnkbqBrTLAAN8LYAPAAGwYWwYngZeAwADfHcALbKMngt6BwADfNcALbLEngYiCwADfTcALbL8nkweDwADfZMALbM8nkw6EwADffMALbN8nkw+FwADflMALbO8GlZk+wADnA8AA5wvAAOyCAAGTEpTYAAAAAQPAAOdBwADsggAAAAcHB8AA51AAAACSn2ADiVUAwADnZAAAAJKgYAOJVQDAAOd3AAAAgYhgA8AAbBgAwADniAAAAJMHYAPAAGwYAMAA55oAAACTDmADwABsGADAAOesAAAAkw9gA8AAbBgAwADnvAAAAINWYAPAAGxbAABgA7LPAT4OTsAA5+TAAOfsAACSomADtfcBH8AA5/K2HwEAAYbAAOf+wAtwtABOwADoJsAA6DAAAJKjXQPAAGwZAWADwABsVgEcwADoOofAAOgywAtwzZKkAQABgMAA6ETAC3BYALX+TsAA6FvAAOhmAACSpV0DwABsGQFgA8AAbFYBHMAA6HCHwADoaMALcM2SpAEAAYHAAOh6wAtwZgC1/knAAOiFFsAA6I6CwADoicALcHSBVsAAbI09MMAA6JcnkqE/PYrAAOizwAtwdB7AAOi6gkcBAAGCwADo18ALcHQAScAA6OAWwADo6oPAAOjkwAtwhIFWwABsjT0wwADo8yeSoT89i8AA6Q/AC3CEHsAA6ReCRwEAAYPAAOk0wAtwhABJwADpPhbAAOlIhMAA6ULAC3CUgVbAAGyNPTDAAOlRJ5KhPz2MwADpbcALcJQewADpdYJHAQABhMAA6ZLAC3CUAEnAAOmcFsAA6aaFwADpoMALcKSBVsAAbI09MMAA6a8nkqE/PY3AAOnLwAtwpB7AAOnTgkcBAAGFwADp8MALcKQATsAA6gHAAOoGAACBl2ADwABsGAEcwADqEhTAAOoIwAtw8wgAhrwAAAAAwABtL07AAOojwADqKQAAgt5gA8AAbBgBHMAA6jYUwADqK8ALcS0JAIa8AAAAAMAAbS9KwADqQAEfwADqS7LaBAABasAA6lNdA7LEAWEDB2ADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxbYAOyz5+zA4CWHMAA60ckwADrRw0nkxMUwADqt8ALcmsKACeTCRTAAOrewAtymQsAJ5MKgsAA6v7AC3B0J5K+g8AA6wvAC3CEJ5MQhMAA6yfAC3CUJ5MRhcAA6zvAC3CkJ5EkgT8BAAEWwADrX4fAAOtXwAtwzZKpth0AwABtPZEoJ5HIga0ywADr6WADwABsGFsGJ4GXgMAA6/vAC3BYJ4LegcAA7BPAC3BmJ4GIgsAA7CvAC3B0J5MHg8AA7ELAC3CEJ5MOhMAA7FrAC3CUJ5MPhcAA7HLAC3CkBpWaPsAA8brAAPHCwAD1yAABkxSU2AAAAAEDwADx7cAA9cgAAAAFBQXAAPH3AAAAkp9gA4lVAMAA8gsAAACSoGADiVUAwADyGgAAAIGIYAPAAGwYAMAA8icAAACTB2ADwABsGADAAPIzAAAAg1ZgA8AAbFsAAGADss8BPgpOwADyW8AA8mMAAJKiYAO19wEfwADyabYfAQABhMAA8nXAC3RJAE7AAPKdwADypwAAkqNdA8AAbBkBYAPAAGxWARzAAPKxhcAA8qnAC3RikqQBAAGAwADyu8ALdA0Atf5OwADy0sAA8t0AAJKlXQPAAGwZAWADwABsVgEcwADy54XAAPLfwAt0YpKkAQABgcAA8vHAC3QbALX+ScAA8vwWwADzBYLAAPMAwAt0KYFWwABsjT0wwADzDieSoT89isAA8yrAC3QpHsAA8zGCRwEAAYLAAPNOwAt0KQBJwADzVxbAAPNhg8AA81vAC3Q5gVbAAGyNPTDAAPNqJ5KhPz2LwADzhsALdDkewADzjoJHAQABg8AA86vAC3Q5AE7AAPO8wADzwQAAgZdgA8AAbBgBHMAA882GwADzw8ALdIiGvAAAAADAAG0vTsAA897AAPPkAACC3mADwABsGAEcwADz8YfAAPPmwAt0woa8AAAAAMAAbS9KwADz+wEfwAD0BrLaBAABasAA9A5dA7LEAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyz6AzA4CWHMAA9MckwAD0xwknkxMUwAD0Z8ALdX4IACeTCRTAAPSOwAt1qgkAJ5MKgsAA9K7AC3QpJ5K+g8AA9LvAC3Q5J5EkgT8BAAEWwAD034XAAPTXwAt0YpKpth0AwABtPZEoJ5HIga0ywAD1X2ADwABsGFsEJ4GXgMAA9XHAC3QNJ4LegcAA9YnAC3QbJ4GIgsAA9aHAC3QpJ5MHg8AA9bjAC3Q5BpWbPsAA+0LAAPtKwAD/3wABkxWU2AAAAAEDwAD7dsAA/98AAAAGBgbAAPuFAAAAkp9gA4lVAMAA+5kAAACSoGADiVUAwAD7rAAAAIGIYAPAAGwYAMAA+78AAACS5WADiVUAwAD70gAAAJMHYAPAAGwYAMAA++IAAACDVmADwABsWwAAYAOyzwE+DE7AAPwKwAD8EgAAkqJgA7X3AR/AAPwYth8BAAGFwAD8JMALdyoATsAA/EzAAPxWAACSo10DwABsGQFgA8AAbFYBHMAA/GCGwAD8WMALd0OSpAEAAYDAAPxqwAt24AC1/k7AAPyBwAD8jAAAkqVdA8AAbBkBYAPAAGxWARzAAPyWhsAA/I7AC3dDkqQBAAGBwAD8oMALdu4Atf5JwAD8qxbAAPy0gsAA/K/AC3b8gVbAAGyNPTDAAPy9J5KhPz2KwAD82cALdvwewAD84IJHAQABgsAA/P3AC3b8AE7AAP0TwAD9HgAAkuZdA8AAbBkBYAPAAGxWARzAAP0ohsAA/SDAC3dDkqQBAAGDwAD9MsALdwwAtf5JwAD9PRbAAP1HhMAA/UHAC3cagVbAAGyNPTDAAP1QJ5KhPz2MwAD9bMALdxoewAD9dIJHAQABhMAA/ZHAC3caAE7AAP2iwAD9pwAAgZdgA8AAbBgBHMAA/bOHwAD9qcALd2mGvAAAAADAAG0vTsAA/cTAAP3KAACC3mADwABsGAEcwAD91xTAAP3MwAt3owgAhrwAAAAAwABtL07AAP3owAD97gAAkudgA8AAbBgBHMAA/fsUwAD98MALeB4JAIa8AAAAAMAAbS9KwAD+BQEfwAD+ELLaBAABasAA/hhdA7LEAWEDBmADiVVgA4lVYAPAAGwYYAOJVWADwABsGGADwABsW2ADss+gqwOAlhzAAP7SJMAA/tILJ5MIFMAA/mnAC3iZCgAnkwkUwAD+kMALeMULACeTCoLAAP6wwAt2/CeSvhTAAP69wAt48wwAJ4D3hMAA/sbAC3caJ5EkgT8BAAEWwAD+6obAAP7iwAt3Q5Kpth0AwABtPZEoJ5G6ga0ywAD/XWADwABsGFsFJ4GXgMAA/2/AC3bgJ4LegcAA/4fAC3buJ4GIgsAA/5/AC3b8J5Lng8AA/7bAC3cMJ5MHhMAA/8/AC3caBpWcPsABBY/AAQWXwAEKUgABkxaU2AAAAAEDwAEFy8ABClIAAAAGBgbAAQXaAAAAkp9gA4lVAMABBe4AAACSoGADiVUAwAEGAQAAAIGIYAPAAGwYAMABBhQAAACS5WADiVUAwAEGJwAAAJMHYAPAAGwYAMABBjcAAACDVmADwABsWwAAYAOyzwE+DE7AAQZfwAEGZwAAkqJgA7X3AR/AAQZtth8BAAGFwAEGecALepMATsABBqHAAQarAACSo10DwABsGQFgA8AAbFYBHMABBrWGwAEGrcALeqySpAEAAYDAAQa/wAt6SQC1/k7AAQbWwAEG4QAAkqVdA8AAbBkBYAPAAGxWARzAAQbrhsABBuPAC3qskqQBAAGBwAEG9cALelcAtf5JwAEHABbAAQcJgsABBwTAC3plgVbAAGyNPTDAAQcSJ5KhPz2KwAEHLsALemUewAEHNYJHAQABgsABB1LAC3plAE7AAQdowAEHcwAAkuZdA8AAbBkBYAPAAGxWARzAAQd9hsABB3XAC3qskqQBAAGDwAEHh8ALenUAtf5JwAEHkhbAAQechMABB5bAC3qDgVbAAGyNPTDAAQelJ5KhPz2MwAEHwcALeoMewAEHyYJHAQABhMABB+bAC3qDAE7AAQf3wAEH/AAAgZdgA8AAbBgBHMABCAiHwAEH/sALetKGvAAAAADAAG0vTsABCBnAAQgfAACC3mADwABsGAEcwAEILBTAAQghwAt7DAgAhrwAAAAAwABtL07AAQg9wAEIQwAAkudgA8AAbBgBHMABCFAUwAEIRcALe4cJAIa8AAAAAMAAbS9KwAEIWgEfwAEIZbLaBAABasABCG1dA7LEAWEDBmADiVVgA4lVYAPAAGwYYAOJVWADwABsGGADwABsW2ADss+hJwOAlhzAAQk4JMABCTgLJ5MTFMABCM/AC3wCCgAnkwkUwAEI9sALfC4LACeTCoLAAQkWwAt6ZSeSvhTAAQkjwAt8XAwAJ4D3hMABCSzAC3qDJ5EkgT8BAAEWwAEJUIbAAQlIwAt6rJKpth0AwABtPZEoJ5HIga0ywAEJ0GADwABsGFsFJ4GXgMABCeLAC3pJJ4LegcABCfrAC3pXJ4GIgsABChLAC3plJ5Lng8ABCinAC3p1J5MHhMABCkLAC3qDBpWdPsABD0DAAQ9IwAESnQABkxeU2AAAAAEDwAEPdMABEp0AAAAEBATAAQ+BAAAAgYhgA8AAbBgAwAEPkAAAAJKfYAOJVQDAAQ+gAAAAkqBgA4lVAMABD60AAACDVmADwABsWwAAYAOyzwE+CEnAAQ/JFsABD9KAwAEPzcALfbKBVsAAbI09MMABD9snkqE/PYjAAQ/3wAt9sh7AAQ/+gkcBAAGAwAEQG8ALfbIATsABEDDAARA4AACSomADtfcBH8ABED62HwEAAYPAARBKwAt93gBOwAEQcsABEHwAAJKjXQPAAGwZAWADwABsVgEcwAEQhoTAARB+wAt+OJKkAQABgcABEJDAC33CALX+TsABEKfAARCyAACSpV0DwABsGQFgA8AAbFYBHMABELyEwAEQtMALfjiSpAEAAYLAARDGwAt90AC1/k7AARDYwAEQ3QAAgZdgA8AAbBgBHMABEOmFwAEQ38ALfl6GvAAAAADAAG0vTsABEPrAAREAAACC3mADwABsGAEcwAERDYbAARECwAt+mIa8AAAAAMAAbS9KwAERFwEfwAERIrLaBAABasABESpdA7LEAWEDBGADwABsGGADiVVgA4lVYAPAAGxbYAOyz6GpA4CWHMABEdgkwAER2AcnkxiAwAERg8ALfbInkxmHwAERjsALftInkxoUwAERzMALfv4IACeRJIE/AQABFsABEfCEwAER6MALfjiSqbYdAMAAbT2RKCTAARJZBSeTG4DAARI0wAt9sieTHBTAARJOwAt+/ggAJ5Ekga0ywAESbGADwABsGFsDJ4GIgMABEnXAC32yJ4GXgcABEoPAC33CJ4LegsABEpPAC33QBpWePsABFs/AARbXwAEZEQABkx2U2AAAAAEDwAEXCsABGREAAAADAwPAARcXAAAAh31gA8AAbBgAwAEXKAAAAJKfYAOJVQDAARc0AAAAg1ZgA8AAbFsAAGADss8BPgVJwAEXUBbAARdbgMABF1TAC4A0gVbAAGyNPTDAARdkJ5K8P07AAReOwAEXlgAAkqJgA7X3AR/AARecth8BAAGCwAEXqMALgFIATsABF9DAARfaAACSo10DwABsGQFgA8AAbFYBHMABF+SDwAEX3MALgI6SpAEAAYHAARfuwAuARAC1/k7AARf/wAEYBAAAgZdgA8AAbBgBHMABGBCEwAEYBsALgLSGvAAAAADAAG0vSsABGBoBH8ABGCWy2gMAAWrAARgtXQOyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyz6IMAoCWHMABGLQkwAEYtAUnkx6AwAEYlcALgDQnkx+FwAEYqcALgO4nkSSBPwEAARbAARjMg8ABGMTAC4COkqm2HQDAAG09ga0ywAEY7WADwABsGFsCJ4d9gMABGPjAC4A0J4GXgcABGQjAC4BEBpWfPsABHRTAAR0cwAEfcwABkyCU2AAAAAEDwAEdQMABH3MAAAADAwPAAR1PAAAAkp9gA4lVAMABHV8AAACSoGADiVUAwAEdbAAAAINWYAPAAGxbAABgA7LPAT4GTsABHZTAAR2cAACSomADtfcBH8ABHaK2HwEAAYLAAR2uwAuB/QBOwAEd1sABHeAAAJKjXQPAAGwZAWADwABsVgEcwAEd6oPAAR3iwAuCFpKkAQABgMABHfTAC4HhALX+TsABHgvAAR4WAACSpV0DwABsGQFgA8AAbFYBHMABHiCDwAEeGMALghaSpAEAAYHAAR4qwAuB7wC1/k7AAR48wAEeQQAAgZdgA8AAbBgBHMABHk2EwAEeQ8ALgjyGvAAAAADAAG0vTsABHl7AAR5kAACC3mADwABsGAEcwAEecYXAAR5mwAuCdoa8AAAAAMAAbS9KwAEeewEfwAEehrLaAwABasABHo5dA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyz6JzAoCWHMABHxckwAEfFwUnkveGwAEe2cALgrAnkviHwAEfC8ALgtwnkSSBPwEAARbAAR8vg8ABHyfAC4IWkqm2HQDAAG09ga0ywAEfUGADwABsGFsCJ4GXgMABH1nAC4HhJ4LegcABH2nAC4HvBpWgPsABI2PAASNrwAElvAABkyGU2AAAAAEDwAEjkcABJbwAAAADAwPAASOgAAAAkp9gA4lVAMABI7AAAACSoGADiVUAwAEjvQAAAINWYAPAAGxbAABgA7LPAT4GTsABI+XAASPtAACSomADtfcBH8ABI/O2HwEAAYLAASP/wAuD6QBOwAEkJ8ABJDEAAJKjXQPAAGwZAWADwABsVgEcwAEkO4PAASQzwAuEApKkAQABgMABJEXAC4PNALX+TsABJFzAASRnAACSpV0DwABsGQFgA8AAbFYBHMABJHGDwAEkacALhAKSpAEAAYHAASR7wAuD2wC1/k7AASSNwAEkkgAAgZdgA8AAbBgBHMABJJ6EwAEklMALhCiGvAAAAADAAG0vTsABJK/AASS1AACC3mADwABsGAEcwAEkwoXAASS3wAuEYoa8AAAAAMAAbS9KwAEkzAEfwAEk17LaAwABasABJN9dA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyz6LOAoCWHMABJWAkwAElYAUnkyKGwAElNMALhJwnkyOHwAElVMALhMgnkSSBPwEAARbAASV4g8ABJXDAC4QCkqm2HQDAAG09ga0ywAElmWADwABsGFsCJ4GXgMABJaLAC4PNJ4LegcABJbLAC4PbBpWhPsABKjTAASo8wAEs8gABkySU2AAAAAEDwAEqYcABLPIAAAADAwPAASpwAAAAkp9gA4lVAMABKoAAAACSoGADiVUAwAEqjQAAAINWYAPAAGxbAABgA7LPAT4GTsABKrXAASq9AACSomADtfcBH8ABKsO2HwEAAYLAASrPwAuF1QBOwAEq98ABKwEAAJKjXQPAAGwZAWADwABsVgEcwAErC4PAASsDwAuF7pKkAQABgMABKxXAC4W5ALX+TsABKyzAASs3AACSpV0DwABsGQFgA8AAbFYBHMABK0GDwAErOcALhe6SpAEAAYHAAStLwAuFxwC1/k7AAStdwAErYgAAgZdgA8AAbBgBHMABK26EwAErZMALhhSGvAAAAADAAG0vTsABK3/AASuFAACC3mADwABsGAEcwAErkoXAASuHwAuGToa8AAAAAMAAbS9KwAErnAEfwAErp7LaBAABasABK69dA7LEAWEDA2ADiVVgA4lVYAPAAGxbYAOyz6M6A4CWHMABLDUkwAEsNQUnkyWGwAEsCMALhognkyaHwAEsKcALhrQnkSSBPwEAARbAASxNg8ABLEXAC4Xukqm2HQDAAG09kSgnkeuBrTLAASzPYAPAAGwYWwIngZeAwAEs2MALhbkngt6BwAEs6MALhccGlaI+wAExfsABMYbAATQsAAGTJ5TYAAAAAQPAATGqwAE0LAAAAAMDA8ABMbkAAACSn2ADiVUAwAExyQAAAJKgYAOJVQDAATHWAAAAg1ZgA8AAbFsAAGADss8BPgZOwAEx/sABMgYAAJKiYAO19wEfwAEyDLYfAQABgsABMhjAC4fGAE7AATJAwAEySgAAkqNdA8AAbBkBYAPAAGxWARzAATJUg8ABMkzAC4ffkqQBAAGAwAEyXsALh6oAtf5OwAEydcABMoAAAJKlXQPAAGwZAWADwABsVgEcwAEyioPAATKCwAuH35KkAQABgcABMpTAC4e4ALX+TsABMqbAATKrAACBl2ADwABsGAEcwAEyt4TAATKtwAuIBYa8AAAAAMAAbS9OwAEyyMABMs4AAILeYAPAAGwYARzAATLbhcABMtDAC4g/hrwAAAAAwABtL0rAATLlAR/AATLwstoEAAFqwAEy+F0DssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPo6YDgJYcwAEzdiTAATN2BSeTKIbAATNJwAuIeSeTJofA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xMAMGJ6FcRy62C6T8AEAARa644C63sAMGImFcYosAJaQiiw/Srr7AYG7AsAMGJ4AAAwYDgAMGGwADBlzAAAAAgKWhUTAAEINwABCHMAAWBsHlAIAAAFdA5ffAWADiVUAAAMElodEwABCasAAQm8JlAAAYAOWhQAElohEwABCeMAAQo8YlAMAYAPAAGxbASkElolEwABEgcAARI8YlAQAYAPAAGwfAZMBBZafRMAAQpTAAEKUwABC+wAAAAPAAEKkwABC+wAAAAEBAcAAQqoAAASUAGADloUAAGADloUBPgE9F8AAQrculAMjHMAAQtAWwABCyi6UAJaHJwEAASsAwABsXikWwABC5xbAAELhLpQAloeUA5aIAWADwABsW5aIAggBloeAAMAMGg4JAcAAQpSX7AAAAAATBpaLRMAAQwDAAEMJwABDOQACk/cAAAABA8AAQw/AAEM5AAAAAgICwABDHgAAAIU4YAOKJgDAAEMuAAAAk+9gA8AAbFsAAGADiVUABpaMRMAARJTAAESqwABE8AAAlAUAAAABA8AARL3AAETwAAAAAAAAAGADln0BPgFKwABExgEfwABE0ZaEAQABLgAGlo1EwABE9cAARPrAAEU5AACT9gAAAAEDwABFCMAARTkAAAAAAAAAXAE+AT0XwABFES6UAyEWwABFJS6UA5aIlogGlo5EwABFPsAARUjAAEZdAACErAAAAAEDwABFVsAARl0AAAABAQHAAEVhAAAAhA1gA4pBAABgA4pBAT4FScAARW0WwABFhBbAAEV2gMAARXHADBtxg3OKRIFWwABs80rAAEWNAYDAAEWUwAwbcT9OwABFosAARakAAJQGYAPAAGwfARbAAEWrLpQElolOwABFv8AARc0AAINzXQPAAGwZAWADiVUBHMAARe0cwABF4hbAAEXUgMAARc/ADBtxg3OKRIKhAQFgA4lVARbAAEXmLpPwlpAAwABs64CgAAAAAMAAbGZJwABF+xzAAEYKFsAARf8ulASWiScBAAGBwABGDcAMG7oAwABsMkrAAEYVAYDAAEYcwAwbcT9KwABGJgEfwABGMYpOAgACFsAARkCAwABGO8AMG3GC04pGgsAARkvADBvYAAaWj0TAAEZiwABGbMAAR0AAAIZsAAAAAQPAAEZ6wABHQAAAAAEBAcAARoUAAACEDWADie4AAGADie4BPgROwABGlcAARpwAAJQGYAPAAGwfARbAAEaeLpQElolOwABGssAARrcAAIGXYAOJVQEcwABGuS6T8AEAARbAAEbEgMAARr/ADBy3gZeJ8gCWkEnAAEbPHMAARt4WwABG0y6UBJaJJwEAAYHAAEbhwAwczgDAAGwySsAARukBgMAARvDADBy3P0rAAEb6AR/AAEcFif0DAAIWwABHFIDAAEcPwAwct4GIifGCwABHGsAMHOwBhSEWwABHMYDAAEcswAwct4UhifMGlpBEwABHRcAAR07AAEd3AACT8AAAAAEDwABHU8AAR3cAAAABAQHAAEddAAAAhA1gA4lVAABgA4lVAUrAAEdmARzAAEdrgMAAR2bADB26g/gBAWADiVUBLgCJVwaWkUTAAEd8wABHhcAAR68AAIZMAAAAAQPAAEeVwABHrwAAAAEBAcAAR6IAAACEDWADiWQAAGADiVUBSsAAR6sBgMAAR6vADB4WBpaSRMAAR7PAAEe8wABH5gAAhk8AAAABA8AAR8zAAEfmAAAAAQEBwABH2QAAAIQNYAOJcgAAYAOJVQFKwABH4gGAwABH4sAMHmAGlpNEwABH6sAAR/PAAEgXAACGUQAAAAEDwABIAMAASBcAAAABAQHAAEgKAAAAhA1gA4mAAABgA4lVAUrAAEgTAYDAAEgTwAweqgaWlETAAEgbwABIJMAASEwAAIZVAAAAAQPAAEgzwABITAAAAAEBAcAASD8AAACEDWADiZwAAGADiVUBSsAASEgBgMAASEjADB70BpaVRMAASFDAAEhZwABIfwAAhlMAAAABA8AASGfAAEh/AAAAAQEBwABIcgAAAIQNYAOJjgAAYAOJVQFKwABIewGAwABIe8AMHz4GlpZEwABIhMAASI3AAEnAAACGWAAAAAEDwABIn8AAScAAAAABAQHAAEiuAAAAhA1gA4mqAABgA4lVAT4FScAASLoWwABI0RbAAEjDgMAASL7ADB+Ig3OJroFWwABs80rAAEjaAYDAAEjhwAwfiD9OwABI78AASPYAAJQGYAPAAGwfARbAAEj4LpQElolOwABJDMAASRoAAINzXQPAAGwZAWADiVUBHMAASTocwABJLxbAAEkhgMAASRzADB+Ig3OJroKhAQFgA4lVARbAAEkzLpPwlpAAwABs64CgAAAAAMAAbGZJwABJSBzAAElXFsAASUwulASWiScBAAGBwABJWsAMH9EAwABsMkrAAEliAYDAAElpwAwfiD9KwABJcwEfwABJfom8AwADFsAASZGAwABJjMAMH4iC04mwFsAASaGAwABJnMAMH4iDZYmtgsAASa7ADB/vAAaWl0TAAEnFwABJzsAASv0AAIZoAAAAAQPAAEnewABK/QAAAAEBAcAASesAAACEDWADidoAAGADiVUBPgVJwABJ9xbAAEoOFsAASgCAwABJ+8AMIOCDc4negVbAAGzzSsAAShcBgMAASh7ADCDgP07AAEoswABKMwAAlAZgA8AAbB8BFsAASjUulASWiU7AAEpJwABKVwAAg3NdA8AAbBkBYAOJVQEcwABKdxzAAEpsFsAASl6AwABKWcAMIOCDc4negqEBAWADiVUBFsAASnAuk/CWkADAAGzrgKAAAAAAwABsZknAAEqFHMAASpQWwABKiS6UBJaJJwEAAYHAAEqXwAwhKQDAAGwySsAASp8BgMAASqbADCDgP0rAAEqwAR/AAEq7iewDAAMWwABKzIDAAErHwAwg4IZnieAWwABK3oDAAErZwAwg4INlidyCwABK68AMIUcABpaYRMAASwLAAEsWwABLwgAAk+EAAAABA8AASynAAEvCAAAAAQEBwABLPgAAAIt3XQPAAGwZAWADiiYAAF0DwABsGQFgA4omAT4CScAAS1AWwABLX4DAAEtUwAwiOIFWwABs80rAAEtoAWrAAEtvXQPAAGwZAWADiiaHIz9KwABLjAEcwABLthzAAEuegMAAS5PADCI4gqEBAWADiiYBFsAAS6Iuk/iWmQDAAGzrgKAAAAAAwABsZgaWmUTAAEvHwABL1cAAS/sAApP4AAAAAQPAAEvnwABL+wAAAAEBAcAAS/YAAACEDWADiiYAAGADiiYABpaaRMAATADAAEwJwABUgQAAhl8AAAABA8AATBrAAFSBAAAAAQEBwABMKAAAAIQNYAOJvgAAYAOJVQE+DEAcwABPHRbAAE8OgMAATwnADCMrg2OJwItWAQABNMAATyMDwABPI8AAT5sAAAABAQHAAE8yAAAAhThgA4omAABgA8AAbFsBSsAAT0wBIhzAAE9kHMAAT0wuk/cCAAKBwABPU8AMI3IpAJaLJwEAASsAiVkAHMAAT5QcwABPey6T9wIAAoHAAE+CwAwjcioA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AAAAAQPAAEStwABEvwAAAAEBAcAARLoAAACEDWADis4AAF8DAAAABpgaScAARMPAAETFwABE8QAChroAAAABA8AARNrAAETxAAAAAQEBwABE7AAAAIQNYAOK3wAAXwMAAAAGmBtJwABE9cAARPfAAEU7AAKGwQAAAAEDwABFGMAARTsAAAABAQHAAEU2AAAAhA1gA4ryAABfAwAAAAaYHEnAAEU/wABFQcAARWsAAobIAAAAAQPAAEVVwABFawAAAAEBAcAARWYAAACEDWADiwEAAF8DAAAABpgdScAARW/AAEVxwABFowAChssAAAABA8AARYnAAEWjAAAAAQEBwABFngAAAIQNYAOLEQAAXwMAAAAGmB5JwABFp8AARanAAEXbAAKGzgAAAAEDwABFwcAARdsAAAABAQHAAEXWAAAAhA1gA4sfAABfAwAAAAAADL/dAAzAGAAMwFMADMCOAAzAyQAMwQQADME/AAzBegAMwbUADMHwAAzCKwAMwmYADMKhAAzC3AAMwxcADMNSAAAADwKYIUnAAEXgwABF5sAATHgDlFEAAQAABIP5YAPAAGxWAVsBYAPAAGxWAAFdA5f7AV8DAAABBJgkScAARjzAAEZFCZRSlxIAXQOYDgFbAAEFmDZJwABGSsAARkrAAEZyAAAAA8AARmLAAEZyAAAAAQEBwABGaAAABJRSXQOYDgFbAABdA5ghAV8DAAABPwIIAZgkgADADMQICQHAAEZKwABsWgAAAAAPBpgmScAARnfAAEaFwABG6QAAhs4BasAARnhgA8AAbFaAtQAAAQPAAEadwABG6QAAAAEBAcAARrIAAACEDWADix8AAF8DAAABSsAARsEBJsAARsEFHMAARssWwABGwS6UUpcSmCSGzgEAAYDAAEbkwAzEcgCYHl8DAAAGmCdJwABG7sAARvzAAEdgAACGywFqwABG72ADwABsVoC1AAABA8AARxTAAEdgAAAAAQEBwABHKQAAAIQNYAOLEQAAXwMAAAFKwABHOAEmwABHOAUcwABHQhbAAEc4LpRSlxKYJIbLAQABgMAAR1vADMTsAJgdXwMAAAaYKEnAAEdlwABHc8AAR8sAAIbIAWrAAEdmYAPAAGxWgLUAAAEDwABHh8AAR8sAAAABAQHAAEeYAAAAhA1gA4sBAABfAwAAAUrAAEenASbAAEenBRzAAEexFsAAR6culFKXEpgkhsgBAAGAwABHxsAMxWYAmBxfAwAABpgpScAAR9DAAEfewABIXQAAhsEBasAAR9FgA8AAbFaAtQAAAQPAAEf/wABIXQAAAAEBAcAASB0AAACEDWADivIAAF8DAAABSsAASCwBJsAASCwFHMAASDYWwABILC6UUpcSmCSGwQEAAYDAAEhYwAzF4ACYG18DAAAGmCpJwABIYsAASHDAAEjLAACGugFqwABIY2ADwABsVoC1AAABA8AASIXAAEjLAAAAAQEBwABIlwAAAIQNYAOK3wAAXwMAAAFKwABIpgEmwABIpgUcwABIsBbAAEimLpRSlxKYJIa6AQABgMAASMbADMZaAJgaXwMAAAaYK0nAAEjQwABI3sAASSQAAIa3AWrAAEjRYAPAAGxWgLUAAAEDwABI7sAASSQAAAABAQHAAEj7AAAAhA1gA4rOAABfAwAAAUrAAEkEASbAAEkEBRzAAEkOFsAASQQulFKXEpgkhrcBAAGAwABJH8AMxtQAmBlfAwAABpgsScAASSnAAEk3wABJgAAAhrQBasAASSpgA8AAbFaAtQAAAQPAAElIwABJgAAAAAEBAcAASVYAAACEDWADir0AAF8DAAABSsAASV8BJsAASV8FHMAASWkWwABJXy6UUpcSmCSGtAEAAYDAAEl7wAzHTgCYGF8DAAAGmC1JwABJhcAASZPAAEnZAACGrQFqwABJhmADwABsVoC1AAABA8AASaPAAEnZAAAAAQEBwABJsAAAAIQNYAOKoAAAXwMAAAFKwABJuQEmwABJuQUcwABJwxbAAEm5LpRSlxKYJIatAQABgMAASdTADMfIAJgXXwMAAAaYLknAAEnewABJ7MAASkEAAIapAWrAAEnfYAPAAGxWgLUAAAEDwABJ/8AASkEAAAABAQHAAEoPAAAAhA1gA4qRAABfAwAAAUrAAEoeASbAAEoeBRzAAEooFsAASh4ulFKXEpgkhqkBAAGAwABKPMAMyEIAmBZfAwAABpgvScAASkbAAEpUwABKqQAAhqUBasAASkdgA8AAbFaAtQAAAQPAAEpnwABKqQAAAAEBAcAASncAAACEDWADiokAAF8DAAABSsAASoYBJsAASoYFHMAASpAWwABKhi6UUpcSmCSGpQEAAYDAAEqkwAzIvACYFV8DAAAGmDBJwABKrsAA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LADAAIKaAAAghUBfAwEAAABfAwAAAUrAAIKiARzAAIKiLogGAgACgMAAgrbADQTEgcAAgrzADQTSAJi4BpjkScAAgsTAAILGwACDEQAAhcYAAAABA8AAgtbAAIMRAAAAAgICwACC4wAAAIQNYAOHNQDAAILrAAAghUBfAwEAAABfAwAAAUrAAILzARzAAILzLogGAgACgMAAgwfADQUzgcAAgw3ADQVBAJi4BpjlScAAgxXAAIMXwACDUAAAheQAAAABA8AAgx/AAINQAAAAAgICwACDJAAAAIQNYAOHygDAAIMsAAAghUBfAwEAAABfAwAAAUrAAIM0ARzAAIM0LogMAgACgMAAg0bADQWigcAAg0zADQWwAJi3BpjmScAAg1TAAINWwACDrQAAheYAAAABA8AAg2rAAIOtAAAAAgICwACDewAAAIQNYAOH1gDAAIODAAAghUBfAwEAAABfAwAAAUrAAIORARzAAIORLogMAgACgMAAg6PADQYRgcAAg6nADQYfAJi3BpjnScAAg7HAAIOzwACEBgAAhYAAAAABA8AAg8XAAIQGAAAAAgICwACD1AAAAIQNYAOGUADAAIPcAAAghUBfAwEAAABfAwAAAUrAAIPqARzAAIPqLogMAgACgMAAg/zADQaAgcAAhALADQaOAJi3BpjoScAAhArAAIQMwACEVQAAhekAAAABA8AAhBzAAIRVAAAAAgICwACEKQAAAIQNYAOH4gDAAIQxAAAghUBfAwEAAABfAwAAAUrAAIQ5ARzAAIQ5LogMAgACgMAAhEvADQbvgcAAhFHADQb9AJi3BpjpScAAhFnAAIRbwACEvAAAhewAAAABA8AAhHTAAIS8AAAAAgICwACEigAAAIQNYAOH7QDAAISSAAAghUBfAwEAAABfAwAAAUrAAISgARzAAISgLogMAgACgMAAhLLADQdegcAAhLjADQdsAJi3AAAM8agADPH4AAzyZwAM8tYADPNFAAzztAAM9CMADPSSAAz1AQAM9XAADPXfAAz2TgAM9r0ADPcsAAz3mwAM+AoADPh5AAz46AAM+VcADPnGAAz6NQAM+qQADPsTAAz7ggAM+/EADPxgAAz8zwAM/T4ADP2tAAz+HAAM/osADP76AAz/aQAM/9gADQBHAA0AtgANASUADQGUAA0CAwANAnIADQLhAA0DUAANA78ADQQuAA0EnQANBQwADQV7AA0F6gANBlkADQbIAA0HNwANB6YAAAAzApjsScAAhMHAAITQwACMGoeUXAACAAAEg/lgA8AAbFYBWwAABIEvYAPAAGxWAVsBYAPAAGxWAAAAAQWZBEnAAITswACE8sAAhQUBAAADwACFA8AAhQUAAAAAAAAAXQOY7AJfAwAAXwMBAAE/AQkBwACE8sAAbFoAAAAAFQaY7knAAIUKwACFDMAAhTsAAIgUAAAAAQPAAIUcwACFOwAAAAICAsAAhScAAACEDWADh/gAwACFLwAAIIVAXwMBAAAAXwMAAAFKwACFNwErBpjvScAAhUDAAIVCwACFoAAAhe8AAAABA8AAhVrAAIWgAAAAAgICwACFbwAAAIQNYAOH/gDAAIV3AAAghUBfAwEAAABfAwAAAUrAAIWFARzAAIWFLogUAgACgMAAhZbADQlugcAAhZzADQl8AJjuBpjwScAAhaTAAIWmwACF4gAAhfIAAAABA8AAhbDAAIXiAAAAAgICwACFtwAAAIQNYAOICADAAIW/AAAghUBfAwEAAABfAwAAAUrAAIXHARzAAIXHLogUAgACgMAAhdjADQndgcAAhd7ADQnrAJjuBpjxScAAhebAAIXowACGMAAAhfUAAAABA8AAhfjAAIYwAAAAAgICwACGBQAAAIQNYAOIEwDAAIYNAAAghUBfAwEAAABfAwAAAUrAAIYVARzAAIYVLogUAgACgMAAhibADQpMgcAAhizADQpaAJjuBpjyScAAhjTAAIY2wACGigAAhfcAAAABA8AAhknAAIaKAAAAAgICwACGWQAAAIQNYAOIHgDAAIZhAAAghUBfAwEAAABfAwAAAUrAAIZvARzAAIZvLogUAgACgMAAhoDADQq7gcAAhobADQrJAJjuBpjzScAAho7AAIaQwACG5gAAhfsAAAABA8AAhqTAAIbmAAAAAgICwACGtQAAAIQNYAOIJgDAAIa9AAAghUBfAwEAAABfAwAAAUrAAIbLARzAAIbLLogUAgACgMAAhtzADQsqgcAAhuLADQs4AJjuBpj0ScAAhurAAIbswACHRAAAhf0AAAABA8AAhwHAAIdEAAAAAgICwACHEwAAAIQNYAOIMwDAAIcbAAAghUBfAwEAAABfAwAAAUrAAIcpARzAAIcpLogUAgACgMAAhzrADQuZgcAA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CUnAAENUFsAAQ3UWwABDcRbAAENnFsAAQ1gulLGZqItKmYyCoZlbgVbAAG07SsAAQ34AP07AAEOWwABDngAAlN9gA7iUAR/AAEOkuKABAAGAwABDucANYCYATsAAQ83AAEPTAACUCmADmaYBHMAAQ9UulL4CAAKBwABD4cANYG0WwABD9IDAAEPqwA1gJobQizAAmbg9HMAARAMulNwBAAEnlPMAmdc9HMAARCAulNYBAAEnhr0AmeQ9NcAARDUAAAEAYAOZpgGCwABENcANYJMXwABEO4PAAEQ1wA1g85S0HMAARDMWwABEO4PAAEQ1wA1g85S0ma2BPwEAAZQAwABsiJmtPgJOwABElgAAADxdA8AAbEoBYAOKUAEWwABElh4AwABsLwEBXQPAAGwgAWADilABHMAARJYWwABEkRbAAESNFsAARIMWwABEdC6UsZmoi0qZjIKhmVuAn8AAbGWAoAAAAADAAGxmAD3AAGxLRQAAARzAAESWgwDADWFAPgAAAADAAGxNAD4CTsAARGAAAAGF4GADilABFsAARKCDAMANYUBAwABsTz4BPRzAAESugsAARKjADWCThvIBAAGEwABEuMANYcUAmdo9NcAARM8AAAEAYAOZpgGCwABEz8ANYJMXwABE1YPAAETPwA1iB5S0HMAARM0WwABE1YPAAETPwA1iB5S0ma1EAQABlADAAGzhma09HMAAROYulNYBAAEnhr4AmeQGmdBMwABE+8AARP/AAEVAAACU9AAAAAEDwABFDMAARUAAAAABAQHAAEUWAAAAhA1gA4JSAABgA8AAbB8BPgFKwABFIgEewABFNJqLAQABJsAARTcBgMAARTfADWKJYAOFGgAGmdFMwABFRcAARUrAAEWYAABFAAAAAQPAAEVPwABFmAAAAAEBAcAARVcAAACHfWADwABsGAAAXAE+Aj0cwABFahbAAEVlLoELmalFAQABgMAARXDADWLrAMAAbhs9F8AARX0uht8cwABFhBbAAEV9Lobfma6BPwEAARbAAEWOgMAARYfADWLrgODAAGyRAMAAbIiZrgaZ0kzAAEWdwABFosAARe4AAJT1AAAAAQPAAEWswABF7gAAAAEAAcAARbUAAACHfWADwABsGAFqwABFvmADwABsGLIEAFwBPgI9HMAARcouRQEAAYDAAEXQwA1jgQCZ0T0X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AKGyASeVYQHAAKHLasAAoctgA8AAbB+HVAA+AUrAAKHXASeVYgHAAKHwasAAofBgA8AAbB+HsQA+AUrAAKH8ASeVYwHAAKIVasAAohVgA8AAbB+HtwA+AUrAAKIhASeVZAHAAKI6asAAojpgA8AAbB+IYwA+AUrAAKJGASeBdgABPgFJwACiayIcwACieIDAAKJvwA2z/oE6AQABNyAAwABshQEcwACiiYDAAKKAwA2z/oE7AQABN34AwABshj4BSsAAopwBHMAAoqknlWWBPwEAARzAAKK3JMAAorYBgMAAoq3ADbP+ioUCAAKXJ5VmAMAAbXAAwABtPT4BSsAAouMBKwaaDEzAAKMHwACjDsAApK0AAJVTAAAAAQPAAKMawACkrQAAAAEBAcAAoyIAAACHfWADwABsGAAAYAPAAGwYAT4DTsAAoz0AAACClmADwABtBgBFwACjSQHAAKNSwACjVAAAgdRgA8AAbB8BkwEcwACjW4LAAKNZwA2184E6AQABFsAAo2SAwACjXcANtcKA4MAAbJEAwABshQGKwACjbsANtfMcwACjbILAAKNuwA2184E/AQABlADAAGyIPgJOwACjgMAAo4oAAJVnYAPAAGwYARzAAKOMLpVdAQABHMAAo6eAwACjoMANtcKDDgEAAYLAAKOywA218wDAAGz4AJoLScAAo70hHMAAo8uDwACjwcANtlonAQABKwDAAGw2PgI9IxzAAKPlgcAAo97ADbXdJwEAASsAwABsXonAAKPewA213R/AAKPtwABtDAEAARzAAKQBgMAAo/rADbXCgT0CAAKTgsAApA7ADbXzAMAAbIcAKwFgA8AAbQY9HMAApCKBwACkG8ANtd1FAQABg8AApCjADbZaAMAAbS4+AT01wACkSwAAAQBgA8AAbQYBgcAApEvADbXdIxzAAKRLhMAApEvADbc7JwEAASsAwABsXiscwACkU4TAAKRLwA23O0UBAAEcwACkX4DAAKRZwA21wikBAAGCwACkYMANtfMAwABtOQDAAG0uAVxKwACkdwEjHMAApIWBwACkfsANtd0nAQABKwDAAGxegMAApI/ADbXCHMAApJ+BwACkmMANtd2BUwAAAADAAG0QAWADwABsGAaaDUzAAKSywACkssAApjsAAIWSAAAAAQPAAKTKwACmOwAAAAEBAcAApN8AAACE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AJnSPRzAAQEkLpUcAQABFsABATmAwAEBNMAOD5KFfoshAJn2PRzAAQFKLpTWAAAAAJnkBppxTMABAVzAAQFcwAEBmwAAiAIAAAABA8ABAWfAAQGbAAAAAQEBwAEBbQAAAIQNYAOCSgAAYAHAAGxcAT4BPRzAAQF5LkUBAAEkwAEBlgMngToWwAEBiIDAAQGDwA4QWoVOwABtLSeBOwCZ0QAADUPQAA1EcAANRKgADUTWAA1FBAANRZkADUZ9AA1HEgANR6cADUhfAA1I+wANSesADUsSAA1LpwANTBAADUylAA1OGQANTmUADVGVAA1TFgANVJQADVa0AA1b8gANX/8ADWJiAA1ixQANY1oADWPMAA1kLQANZJIADWUDAA1lcgANZgYADWZoAA1mvwANaGYADWjfAA1qbQANaykADWuxAA1sKAANbS8ADW4GAA1uewANb78ADXBqAA101gANdc8ADXg5AA1+pAANgBgADYC3AA2BdAANg5EADYTyAA2FUgANhl0ADYa9AA2HyAANjDYADYyWAA2NcwANjdMADY+fAA2QbQANka0ADZHsAA2XWgANmzcADZ16AA2gugANpi8ADarPAA2sTgANrQQADa3XAA2uqgANr2EADbAGAA2wtgANsTUADbG0AA2yxgANs9cADbWbAA237QANuacADbrEAA274QANvP4ADcEOAA3BbgANwisADcQIAA3EegANxNoADcUrAA3FfAANxf0ADcc3AA3IcQANydUADcpoAA3K2gANyz0ADcu3AA3MHQANzIMADczpAA3NOgANzd8ADc6QAA3PQwANz/QADdClAA3RWQAN09gADdRAAA3VHwAN1bEADdZvAA3XBAAN17YADdiaAA3ZMAAN2fgADdqqAA3bjgAN2+4ADdyAAA3dAQAN3msADd7aAA3fWwAN37sADeENAA3hyQAN4n8ADeNFAA3kLAAN5Z4ADebGAA3oAQAN6j8ADer1AA3sJwAN7PMADe2gAA3vZwAN8CoADfEVAA3xkAAN8skADfYSAA33uAAN+EsADfjCAA35EwAN+aUADfo4AA36ywAN+ysADfuOAA38CAAN/ZcADf5PAA3+oAAN/vEADf9CAA3/tAAOAL4ADgEVAA4B2wAOA2sADgUdAA4FkgAOBfIADgaHAA4HhAAOCIEADgotAA4MvgAODfEADg6jAA4P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7gAAAAEBAcABEJoAAACDvmADhJIAAGADwABsGAE+AkfAARCkgMABEKzADiwnBQHAARDLasABEMtgA4SShmcAPgFKwAEQ2QEnlVABwAERAWrAAREBYAOEkoZYAD4BSsABEQ8BJ4oSAcABETRqwAERNGADhJKFCQA+AUrAARFCASeN0AHAARFnasABEWdgA4SShnYAPgFKwAERdwEnhYYBwAERoWrAARGhYAOEkoZEAD4BSsABEbABJ5OkPTDAARHIJMABEewCJ5XHgMABEefADiwnAUwADizyAA0sYgANLcAADS5OAA0vpgANMeYADTX7AA1AEQANQR4ADhORAA4lDgAAAAkADiUrAA4l1wAOJoMADib+AA4nxQAOKKsADik9AA4qXAAOKu4ADit1AA4sAAAOLPIAAAALAAIImreVyE0AAAaA+wAAgi4AAIEOAACBaQAAgS0AAI07AACBRwAAliAAAIFkAACW3gAAgYEAALi/AAEBAZXJAAABmrlNgeqVygAAXgMAAgICYAOCUmADwABsGAABVwOauQBcAAKCAAAAAIQNYAOCUgCCDQAAAICWYAPAAGwYAAAJApq6TYIYgiefLgeKvQAAAWADmwAAAAIEmrxNgmGCagmAkABgA408AASavU2C84L/GJXLAF4DAAICAmADglJgA8AAbBgAAVcDmrkAXAErAQWa2E2DBIMEgzAAlcwAA4MggzAAAAABAQGDJgAABICQYAONPAAAYAOaugE/AggBmryAAMAOLkEJAYMEmxcAAAAAFgaav02DNYM9g8QEAQAAAAABA4NMg8QAAAACAgKDVwAAAICQYAONPACDcQAAAIEWYAOBdQAAYAOaugE+AUqDggEfg424yAIAAoCDq8AOLoaBg7bADi6SAAaawU2DyYPTg/EBAIktAAAAAQOD3IPxAAAAAAAAAGADgzIBSoPfARaD6RaD3y6AkJq8iS2N2gaawk2D9YP/hB0BAIlKAAAAAQOECIQdAAAAAAAAAGADgzIBSoQLARaEFRaECy6AkJq8iUqN7gaaw02EIYQrhFMBAIkmAAAAAQOEOYRTAAAAAAAAAGADgzIBSoQ8ARaERhaEPC6AkJq8iSaN1gaaxE2EV4RhhIkBAIkoAAAAAQOEb4SJAAAAAAAAAGADgzIBSoRyARaEfBaEci6AkJq8iSiN2AaaxU2EjYSXhLsB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bZsEAIlZARy/5IC/38AORGwnAQABFr/nLolumwUAiVkGmxFNwABA8sAAQPfAAEIHAACV75q3AAAAAQPAAEELwABCBwAAAAMDA8AAQRwAAACC72ADiVUAwABBLgAAAINTYAOJVQDAAEFKAAAAlfBgA5r0AABgA8AAbFsBPgROwABBW8AAQWIAAIGwYAPAAGxbASk9IxzAAEGwGsAAQaWbAicBAAErAMAAbGIbwABBsJsCMcAAQbxgA8AAbFYAKwFdA8AAbBkBYAPAAGxWPRzAAEHPGsAAQcSbAjYBAAExwABB02ADwABsVgOAwABB1MAORQWBwABB3cAORRODwABB6MAORToAwABsR0rAAEH2AYPAAEH9wA5FOgabE03AAEJJwABCTsAAREUAAILuAAAAAQPAAEJZwABERQAAAAMDA8AAQmoAAACC72ADiVUAwABCfAAAAINTYAOJVQDAAEKYAAAAlfBgA5r0AABgA8AAbFsBPgJOwABCsMAAQrcAAIGwYAOa2QEcwABCwS6V4AIAAoDAAELlwA5F+4HAAELuwA5GCQCbFEfAAEL+gsAAQwbADkYXAwHAAEMqasAAQypgA5r0idIAPgFKwABDSQEcwABDV4PAAENQwA5GMJXjAAAAAJrpAcAAQ5lqwABDmWADmvSy8AA+AUrAAEO0ARzAAEPCg8AAQ7vADkYwleQAAAAAmuoAAT4BPTDAAEP8H8AARAbAAGzQAQABJMAARDoDJ5XxgsAARDTADkYXJ5KmAAabFE3AAETDwABEz8AAYK0AAJXgAAAAAQPAAETywABgrQAAAAICAsAARQMAAACC72ADiVUAwABFFQAAAINTYAOJVQAAYAOa2QE+Dj2IwABFJsAORyEWwABFOIDAAEUwwA5HIYZFiV49icAARUXADkcvFsAARVuBwABFUcAORy+GRYleScAARWgewABFbMAAbPcCAAKAwABFdsAORyGBwABFf8AORy8ASsAARYsBasAARZhgA5rZstc/ScAARbIlwABFvgCAwABFtsAORyFgA4mcSsAARc0BasAARdpgA5rZstc/ScAARfQlwABGAACAwABF+MAORyFgA4mOPgFKwABGFgEjJcAARicAgcAARh3ADkcvYAOJnGrAAEZHYAOa2bLHHsAARmua7QIAAhTAAEaSwA5HIQABYAOJjoHAAEabwA5HLwABYAOa2T9JwABGsRzAAEa9gMAARrXADkchJwEAARbAAEbALoNXmwYAiVk+BEnAAEcVJcAARyMAgcAARxnADkcvYAOJZD4BSsAAR4kBasAAR5ZgA5rZstc/TsAAR8fAAEfcAACV8mADiUcBHsAAR+iW4wIAAoHAAEf7wA5HLxbAAEgGLokomwoAScAASBwiHMAASDWCwABIIMAOSJgnAQABasAASERgA4lHhR4AwABsXgEcwABIb4LAAEhawA5ImCcBAAFqwABIfmADiUeE5QDAAGxePgFKwABIkAFqwABInWADmtmy1z9KwABJEAEjIiXAAEkhAIHAAEkXwA5HL2ADiZwBJcAASTwAgcAASTLADkcvYAOJjmrAAElbYAOa2bLHasAASYFgA5rZss8BYAOa2T9JwABJthzAAEm6LonCAQABgcAAScDADkcvAJsPSsAAScwBasAASdlgA5rZstc/ScAAShoiJcAASiYAgMAASh7ADkchYAOJqgAewABKQsAAbPcCAAIWwABKVBTAAEpMwA5HIQABYAOJqoLTibAWwABKXy6JKJsKAD4DTsAASnvAAEqGAACV82ADiVUBHMAASp0WwABKkBTAAEqIwA5HIQABYAOJqoNzia4pAQABkwDAAGy4ScAASqgiJcAASrYAgcAASqzADkcvYAOJqgAewABK1MAAbPcCAAIWwABK6BTAAErewA5HLwEBYAOJqoLTibAWwABK8y6JKJsKAD4CTsAASxHAAEseAACV9GADiVUBHMAASzcWwABLKhTAAEsgwA5HLwEBYAOJqoNzia4pAQABkwDAAGy4SsAAS3UBHMAAS3wuleACAAKCwABLoMAOSeuDwABLrMAOSm8AmxQ/SsAATDQBHMAATPAcwABMgRzAAEw7LpXgAgACgsAATF/ADknrgcAATGvADkcvAJsUld4DAAMcwABMoy6F6AIAAoLAAEyuwA5J62rAAEzGYAOJR4UtAJsMgcAATNTADkcvLgCa5pXdAQABHsAATPia7QIAAhTAAE0fwA5HIQABYAOJqoHAAE0owA5HLwAAmuU/ScAATUAiJcAATU4AgcAATUTADkcvYAOJqgAcwABNdhbAAE1sFMAATWLADkcvAQFgA4mqgtOJsCcBAAEWwABNeS6JS5sIAMAAbF4+AkAcwABNqxbAAE2fFMAATZXADkcvAQFgA4mq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t5s8IxzAAIAqgMAAgCrADmfOJwEAASsAwABsXisWwACANIDAAIAqwA5nzoQ+grEBYAOJRwabP03AAIBEwACAYMAAgH4BAIQ8AWrAAIBFYAPAAGxWgLUAAAEDwACAacAAgH4AAAAAAAAAYAOJRwFKwACAbAE1wACAbAAAAQBgA4KSARbAAIBsLpYCmrebPCMcwACAbIDAAIBswA5oWScBAAErAMAAbF4rFsAAgHaAwACAbMAOaFmEPIKwAWADiUcGm0BNwACAg8AAgJjAAIDRAQCDVgFqwACAhGADwABsVoC1AAABA8AAgK/AAIDRAAAAAAAAAGADwABsWwFKwACAsgEWwACAuxbAAICyLpYCmrebPINWgq8Gm0JNwACB2cAAgerAAIJvAACMLQFqwACB2mADwABsVoC1AAABA8AAgfXAAIJvAAAAAQEBwACB/QAAAIQNYAODrAAAXAE+AkAcwACCHxbAAIIQLpYHmrebOScBAAErAMAAbF7AAIIQwACCJgEkwACCTwInlgoWwACCQC6WB5q3mzk9F8AAglYulgeat4DAAIJnwA5pLps5BptDTcAAgyTAAIM1wACEEAAAjEUBasAAgyVgA8AAbFaAtQAAAQPAAINAwACEEAAAAAEBAcAAg0gAAACEDWADg6wAAFwBPgJAHMAAg3MWwACDZC6WB5q3mzknAQABgMAAg3bADmnFAMAAbF7AAINkwACDegEkwACDegYnlgsnlgyAwACDycAOacUnlg0WwACD3y6WB5q3mzkngPc9F8AAg/culgeatyubOQabRE3AAIVhwACFcsAAhkkAAIspAWrAAIViYAPAAGxWgLUAAAEDwACFfsAAhkkAAAABAQHAAIWHAAAAhA1gA4KSAABcAT4DQBzAAIWqFsAAhZouh2mat5s4JwEAASsAwABsXsAAhZrAAIWxASTAAIXbAieWChbAAIXLLodpmrebOEAcwACF+BbAAIXpLpYHmrebOScBAAErAMAAbF7AAIXpwACF/wEkwACGKAInlgoWwACGGS6WB5q3mzk9F8AAhi8uh2mat4DAAIZBwA5qbps4BptFTcAAhwbAAIcXwACH9wAAiy4BasAAhwdgA8AAbFaAtQAAAQPAAIcjwACH9wAAAAEBAcAAhywAAACEDWADgpIAAFwBPgJAHMAAh1gWwACHSC6HaZq3mzgnAQAB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f0+C0ILkBoUPAGADwABsHwFqguNgA8AAbB+CjwSbgE+C+YMUBoURAGADwABsHwFqgxJgA8AAbB+CpASbgU+DKYM+BoUTAGADwABsHwFqgzxgA8AAbB+CmASbgk+DU4NpBoUWAGADwABsHwFqg2dgA8AAbB+CgwSbg0+DkIOpBoXqAGADwABsHwFqg6dgA8AAbB+HVASbhE+DvoPOBoXnAGADwABsHwFqg8xgA8AAbB+CkgSbhU+D44P5BoVTAGADwABsHwFqg/dgA8AAbB+CpwSbhk+EDoQkBoVVAGADwABsHwFqhCJgA8AAbB+CmwSbh0+EOYRUBoVXAGADwABsHwFqhFJgA8AAbB+ChgSbiE+EaYSDBpYfAGADwABsHwFqhIFgA8AAbB+HnASbiU+EmISuBoVBAGADwABsHwFqhKxgA8AAbB+HgwSbik+Ew4TTBoVDAGADwABsHwFqhNFgA8AAbB+ClQSbi0+E6IT4BoVGAGADwABsHwFqhPZgA8AAbB+CqgSbjE+FDYUdBoVIAGADwABsHwFqhRtgA8AAbB+CiQSbjU+FMoVCBoVRAGADwABsHwFqhUBgA8AAbB+CngSbjk+FV4VsBoVcAGADwABsHwFqhWpgA8AAbB+HigSbj0+FgYWWBoVhAGADwABsHwFqhZRgA8AAbB+HjQSbkE+Fq4W5BoVjAGADwABsHwFqhbdgA8AAbB+HkASbkU+FzoXcBoVlAGADwABsHwFqhdpgA8AAbB+HkwSbkk+F8YYGBoVvAGADwABsHwFqhgRgA8AAbB+HlgSbk0+GG4Y1BoV1AGADwABsHwFqhjNgA8AAbB+HmQSblE+GSoZfBoV4AGADwABsHwFqhl1gA8AAbB+HnwSblU+GdIaOBoV6AGADwABsHwFqhoxgA8AAbB+HogSblk+Go4bCBpYgAGADwABsHwFqhsBgA8AAbB+FoQSbl0+G14bfBoWBAGADwABsHwFqht1gA8AAbB+HpQSbmE+G9IcDBoW4AGADwABsHwFqhwBgA8AAbB+HqASbmU+HGIcuBoWEAGADwABsHwFqhyxgA8AAbB+HsQSbmk+HQ4ddBoWJAGADwABsHwFqh1tgA8AAbB+HtASbm0+HcoeKBoWPAGADwABsHwFqh4hgA8AAbB+HtwSbnE+Hn4e2BoWTAGADwABsHwFqh7NgA8AAbB+HugSbnU+Hy4fhBoWYAGADwABsHwFqh95gA8AAbB+HvQSbnk+H9ogMBoWcAGADwABsHwFqiAlgA8AAbB+HwASbn0+IIYg3BoWiAGADwABsHwFqiDRgA8AAbB+HwwSboE+ITIhdBoWsAGADwABsHwFqiFtgA8AAbB+HyQSboU+IcoiDBoWwAGADwABsHwFqiIFgA8AAbB+HzASbok+ImIiqBoW8AGADwABsHwFqiKhgA8AAbB+HWwSbo0+Iv4jRBoXAAGADwABsHwFqiM9gA8AAbB+H3ASbpE+I5oj2BpYhAGADwABsHwFqiPRgA8AAbB+H3wSbpU+JC4kcBpYiAGADwABsHwFqiRpgA8AAbB+H4gSbpk+JMYlBBoXFAGADwABsHwFqiT9gA8AAbB+H5QSbp0+JVoloBoXHAGADwABsHwFqiWZgA8AAbB+H6ASbqE+JfYmNBoXKAGADwABsHwFqiYtgA8AAbB+H6wSbqU+Joom1BoXMAGADwABsHwFqibNgA8AAbB+H7gSbqk+JyonWBoXOAGADwABsHwFqidRgA8AAbB+H8QSbq0+J64n1BoXQAGADwABsHwFqifNgA8AAbB+H9ASbrE+KCooaBoXSAGADwABsHwFqihhgA8AAbB+H+gSbrU+KL4o+BoXWAGADwABsHwFqijxgA8AAbB+IBgSbrk+KU4pnBoXZAGADwABsHwFqimVgA8AAbB+ICQSbr0+KfIqTBoXdAGADwABsHwFqipFgA8AAbB+IDASbsE+KqIqwBoXjAGADwABsHwFqiq5gA8AAbB+IDwSbsU+KxYrZBoXlAGADwABsHwFqitdgA8AAbB+IEgSbsk+K7osABoV9AGADwABsHwFqiv5gA8AAbB+IFQSbs0+LFYssBpYjAGADwABsHwFqiypgA8AAbB+H1gSbtE+LQYtYBpYkAGADwABsHwFqi1ZgA8AAbB+H0wSbtU+LbYt/BpYlAGADwABsHwFqi31gA8AAbB+H2QSbtk+LlIupBpYmAGADwABsHwFqi6dgA8AAbB+H9wSbt0+LvovSBpYnAGADwABsHwFqi9BgA8AAbB+IAwSbuE+L54v3BoXUAGADwABsHwFqi/RgA8AAbB+IAASbuU+MDIwhBpYoAGADwABsHwFqjB5gA8AAbB+H/QSbuk+MNoxNBoWqAGADwABsHwFqjEpgA8AAbB+HxgSbu0+Mc4yLBoXuAGADwABsHwFqjIlgA8AAbB+IGwSbvE+MoIyqBoXwAGADwABsHwFqjKhgA8AAbB+IHgSbvU+Mv4zSBoX2AGADwABsHwFqjNBgA8AAbB+IGASbvk+M54z7BoX4AGADwABsHwFqjPlgA8AAbB+FpASbv0+NEI0lBoX8AGADwABsHwFqjSNgA8AAbB+IJASbwE+NOo1NBoX+AGADwABsHwFqjUtgA8AAbB+IKgSbwU+NYo11BoYAAGADwABsHwFqjXNgA8AAbB+ILQSbwk+Nio2aBoYCAGADwABsHwFqjZhgA8AAbB+IMASbw0+Nr43ABoYEAGADwABsHwFqjb5gA8AAbB+IMwSbxE+N1Y3oBoYIAGADwABsHwFqjeZgA8AAbB+IOQSbxU+N/Y4RBoYNAGADwABsHwFqjg9gA8AAbB+IPASbxk+OJo5CBoYVAGADwABsHwFqjkBgA8AAbB+IPwSbx0+OV45nBoYXAGADwABsHwFqjmVgA8AAbB+IQgSbyE+OfI6QBoYZAGADwABsHwFqjo5gA8AAbB+IRQSbyU+OpY6yBoYbAGADwABsHwFqjrBgA8AAbB+ISASbyk+Ox47WBoYjAGADwABsHwFqjtRgA8AAbB+ISwSby0+O647+BoYmAGADwABsHwFqjvxgA8AAbB+ITgSbzE+PE48rBoYsAGADwABsHwFqjylgA8AAbB+IUQSbzU+PQI9YBoY3AGADwABsHwFqj1ZgA8AAbB+IVASbzk+PbY+FBpYpAGADwABsHwFqj4NgA8AAbB+INgSbz0+Pmo+qBoX0AGADwABsHwFqj6hgA8AAbB+IIQSb0E+QApASBoZmAGADwABsHwFqkBBgA8AAbB+IdQSb0U+QJ5A2BoZUAGADwABsHwFqkDRgA8AAbB+IVwSb0k+QS5BbBoZLAGADwABsHwFqkFlgA8AAbB+IXQSb00+QcJCABoZOAGADwABsHwFqkH5gA8AAbB+IYASb1E+QlZCiBoZQAGADwABsHwFqkKBgA8AAbB+IYwSb1U+Qt5DJBoZWAGADwABsHwFqkMdgA8AAbB+IaQSb1k+Q3pDvBoZaAGADwABsHwFqkO1gA8AAbB+IbwSb10+RBJEaBoZtAGADwABsHwFqkRhgA8AAbB+IcgSb2E+RL5FHBpYqAGADwABsHwFqkUVgA8AAbB+IZgSb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jQ2d/ScBAAEWwABC0RTAAELLwA8oowABYAOd+Y0Nnf0AwABsXgAADyZzAA8mnQAPJtoADydqAA8n2QAPKHAADyllAAAABgKeCVXAAELowABC7sAARrcDmBIAAAFgA50sAAACBJ4LVcAAQzPAAEM/CZgTAGADovAABJ4MVcAAQ1bAAENdCYvnAGADovAAAgWeFlXAAENiwABDYsAAQ5YAAAADwABDdcAAQ5YAAAACAgLAAEN7AAAEmBNgA6LwAMAAQ44AAASL52ADovAAAGADngkBPwMIAZ4LgADADynwCAGeDIEAwA8p/gkBwABDYp02AAAAAAWeF1XAAETbwABE28AARWgAimAAA8AARPPAAEVoAAAAAQEBwABFAwAAAIoaYAOPDgAAYAOeCQE/AwgAngsmwABFIAEcwABFKYDAAEUiwA8qV4pQAAAAAI8iYAOi8AgAngwmwABFTQEcwABFVoDAAEVPwA8qV4pQAAAAAI8iYAOi8AkBwABE2502AAAAAAYGng5VwABD6MAAQ/DAAEQHAQCX7gAAAAEDwABEA8AARAcAAAAAAAAAYAPAAGwfAUrAAEQGAZQGng9VwABEDMAARCjAAERHAQCG3QFqwABEDWADwABsVoC1AAABA8AARCzAAERHAAAAAAAAAGADnQEBSsAARC8BasAARDtgA50BwABMPAaeElXAAERMwABEXcAARNYAAJfvAWrAAERNYAPAAGxWgLUAAAEDwABEZ8AARNYAAAABAQHAAER3AAAAihdgA47nAABcAT4CPRzAAESMgMAARIXADyt5ij4BAAEWwABEni6YE54LAI8HPRzAAES4gMAARLHADyt5ij4BAAEWwABEyi6L554MAI8HBp4TVcAARW3AAEWAwABFswAAgVMBasAARW5gA8AAbFaAtQAAAQPAAEWIwABFswAAAAAAAABgA8AAbBgBSsAARY4BJMAARbMEJ5gUFsAARZwumBOeCyeGrxbAAEWrLovnngwGnhBVwABFuMAARczAAEYPAQCB1wFqwABFuWADwABsVoC1AAABA8AARdXAAEYPAAAAAAAAAGADwABsHwFKwABF2AEewABF2J0AAgACFsAARfQWwABF5y6YE54LgdfAAG0oFsAARgYWwABF/i6L554MgdfAAG0oAAaeFFXAAEYUwABGLsAARrUDACcBasAARhVgA8AA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AAYCnmRWgkaCS5hEC5gxAAABYAPAAGxWAACA+QSeZlaCS4JLCYMoAGADwABsHwAEnmhWgkuCSwmEdZ5KAGADwABsGAAEnmlWgkuCSwaBpgBdA8AAbBkBYAOeZAFqAF0DwABsGQFgA55kwABHbASealaCVoJWBpgyAGADnmQBagBgA55ku+IEnmtWgmqCagaYMwBgA55kAWoAYAOeZLvxBJ5sVoJ+gn4GmDQAYAOeZAFqAGADnmS8AASebVaCkoKSBpg1AGADnmQBagBgA55kvBAEnm5WgqaCpgaYNgBgA55kAWoAYAOeZLwgBJ5vVoK6groGmDcAYAOeZAFqAGADnmS8MASecFaCzoLOBpg4AGADnmQBagBgA55kvEAEnnFWguKC4gaYOQBgA55kAWoAYAOeZLxQBJ5yVoL2gvYGmDoAYAOeZAFqAGADnmS8YASec1aDCoMKBpg7AGADnmQBagBgA55kvHAEnnRWgx6DHgaYPABgA55kAWoAYAOeZLyABJ51VoMygzIGmD0AYAOeZAFqAGADnmS8kASedlaDRoNGBpg+AGADnmQBagBgA55kvKAEnndWg1qDWgaYPwBgA55kAWoAYAOeZLywBJ54VoNug24GmEAAYAOeZAFqAGADnmS8wASeeVaDgoOCBphBAGADnmQBagBgA55kvNAEnnpWg5aDlgaYQgBgA55kAWoAYAOeZLzgBJ57VoOqg6oGmEMAYAOeZAFqAGADnmS88ASefFaDvoO+BphEAGADnmQBagBgA55kvQAEnn1Wg9KD0gaYRQBgA55kAWoAYAOeZL0QBJ5+VoPmg+YGmEYAYAOeZAFqAGADnmS9IASef1aD+oP6BphHAGADnmQBagBgA55kvTAEnoBWhA6EDgaYSABgA55kAWoAYAOeZL1ABJ6BVoQihCIGmEkAYAOeZAFqAGADnmS9UASeglaENoQ2BphKAGADnmQBagBgA55kvWAEnoNWhEqESgaYSwBgA55kAWoAYAOeZL1wBJ6EVoRehF4GmEwAYAOeZAFqAGADnmS9gASehVaEcoRyBphNAGADnmQBagBgA55kvZAEnoZWhIaEhgaYTgBgA55kAWoAYAOeZL2gBJ6HVoSahJoGmE8AYAOeZAFqAGADnmS9sASeiFaEroSuBphQAGADnmQBagBgA55kvcAEnolWhMKEwgaYUQBgA55kAWoAYAOeZL3QBJ6KVoTWhNYGmFIAYAOeZAFqAGADnmS94ASei1aE6oTqBphTAGADnmQBagBgA55kvfAEnoxWhP6E/gaYVABgA55kAWoAYAOeZL4ABJ6NVoUShRIGmFUAYAOeZAFqAGADnmS+EASejlaFJoUmBphWAGADnmQBagBgA55kviAEno9WhTqFOgaYVwBgA55kAWoAYAOeZL4wBJ6QVoVOhU4GmFgAYAOeZAFqAGADnmS+QASekVaFYoViBphZAGADnmQBagBgA55kvlAEnpJWhXaFdgaYWgBgA55kAWoAYAOeZL5gBJ6TVoWKhYoGmFsAYAOeZAFqAGADnmS+cASelFaFnoWeBphcAGADnmQBagBgA55kvoAEnpVWhbKFsgaYXQBgA55kAWoAYAOeZL6QBJ6WVoXGhcYGmF4AYAOeZAFqAGADnmS+oASel1aF2oXaBphfAGADnmQBagBgA55kvrAEnphWhe6F7gaYYABgA55kAWoAYAOeZL7ABJ6ZVoYChgIGmGEAYAOeZAFqAGADnmS+0ASemlaGFoYWBphiAGADnmQBagBgA55kvuAEnptWhiqGKgaYYwBgA55kAWoAYAOeZL7wBJ6cVoY+hj4GmGQAYAOeZAFqAGADnmS/AASenVaGUoZSBphlAGADnmQBagBgA55kvxAEnp5WhmaGZgaYZgBgA55kAWoAYAOeZL8gBJ6fVoZ6hnoGmGcAYAOeZAFqAGADnmS/MASeoFaGjoaOBphoAGADnmQBagBgA55kv0AEnqFWhqKGogaYaQBgA55kAWoAYAOeZL9QBJ6iVoa2hrYGmGoAYAOeZAFqAGADnmS/YASeo1aGyobKBphrAGADnmQBagBgA55kv3AEnqRWht6G3gaYbABgA55kAWoAYAOeZL+ABJ6lVobyhvIGmG0AYAOeZAFqAGADnmS/kASeplaHBocGBphuAGADnmQBagBgA55kv6MEnqdWhxqHGgaYbwBgA55kAWoAYAOeZL+zBJ6oVocuhy4GmHAAYAOeZAFqAGADnmS/wwSeqVaHQodCBphxAGADnmQBagBgA55kv9MEnqpWh1aHVgaYcgBgA55kAWoAYAOeZL/jBJ6rVodqh2oGmHMAYAOeZAFqAGADnmS/8wSerFaHfod+Bph0AGADnmQBagBgA55kwABAAwSerVaHkoeSBph1AGADnmQBagBgA55kwABAFQSerlaHpoemBph2AGADnmQBagBgA55kwABAJwSer1aHuoe6Bph3AGADnmQBagBgA55kwABAOQSesFaHzofOBph4AGADnmQBagBgA55kwABASwSesVaH4ofiBph5AGADnmQBagBgA55kwABAXQSeslaH9of2Bph6AGADnmQBagBgA55kwABAbwSes1aICogKBph7AGADnmQBagBgA55kwABAgQSetFaIHogeBph8AGADnmQBagBgA55kwABAkwSetVaIMogyBph9AGADnmQBagBgA55kwABApQSetlaIRohGBph+AGADnmQBagBgA55kwABAtwSet1aIWohaBph/AGADnmQBagBgA55kwABAyQSeuFaIbohuBpiAAGADnmQBagBgA55kwABA2wSeuVaIgoiCBpiBAGADnmQBagBgA55kwABA7QSeulaIloiWBpiCAGADnmQBagBgA55kwABA/wSeu1aIqoiqBpiDAGADnmQBagBgA55kwABBEQSevFaI1IjUBpiEAGADnmQBagBgA55ktwoEnr1WiOqI6gaYhQBgA55kAWoAYAOeZMAAQSYEnr5WiQWJBQaYhgBgA55kAWoAYAOeZLb6BJ6/VokkiSQGmIcAYAOeZAFqAGADnmSzNASewFaJUolSBpiIAGADnmQBagBgA55ks34EnsFWiVyJXAaYiQBgA55kAWoAYAOeZMAAQToEnsJWiWuJawaYigBgA55kAWoAYAOeZLPJBJ7DVol6iXoGmIsAYAOeZAFqAGADnmTAAEFMBJ7EVomOiY4GmIwAYAOeZAFqAGADnmS0AgSexVaJoImgBpiNAGADnmQBagBgA55kwABBXgSexlaJzInMBpiOAGADnmQBagBgA55ktDsEnsdWid2J3QaYjwBgA55kAWoAYAOeZMAAQXAEnshWifOJ8waYkABgA55kAWoAYAOeZLSEBJ7JVon9if0GmJEAYAOeZAFqAGADnmTAAEGCBJ7KVooMigwGmJIAYAOeZAFqAGADnmS0lASey1aKJoomBpiTAGADnmQBagBgA55kwABBlASezFaKRYpFBpiUAGADnmQBagBgA55ktL0Ens1WilSKVAaYlQBgA55kAWoAYAOeZLTsBJ7OVopjimMGmJYAYAOeZAFqAGADnmS4LgSez1aKd4p3BpiXAGADnmQBagBgA55kwABBqQSe0FaKqYqpBpiYAGADnmQBagBgA55ktP8EntFWiraKtgaYmQBgA55kAWoAYAOeZMAAQcAEntJWisiKyAaYmgBgA55kAWoAYAOeZLUrBJ7TVorWitYGmJsAYAOeZAFqAGADnmS1PgSe1FaK6YrpBpicAGADnmQBagBgA55kuh0EntVWiv2K/QaYnQBgA55kAWoAYAOeZMAAQdcEntZWizuLOwaYngBgA55kAWoAYAOeZLVOBJ7XVotPi08GmJ8AYAOeZAFqAGADnmTAAEHrBJ7YVotoi2gGmKAAYAOeZAFqAGADnmS1XgSe2VaLeYt5BpihAGADnmQBagBgA55kwABB/QSe2laLj4uPBpiiAGADnmQBagBgA55ktW4EnttWi6WLpQaYowBgA55kAWoAYAOeZLV+BJ7cVou8i7wGmKQAYAOeZAFqAGADnmS1jgSe3VaLz4vPBpilAGADnmQBagBgA55kwABCDwSe3laL54vnBpimAGADnmQBagBgA55kwABCIQSe31aMFIwUBpinAGADnmQBagBgA55kwABCMwSe4FaMIYwhBpioAGADnmQBagBgA55ktaEEnuFWjDWMNQaYqQBgA55kAWoAYAOeZMAAQkgEnuJWjF+MXwaYqgBgA55kAWoAYAOeZLW0BJ7jVoxwjHAGmKsAYAOeZAFqAGADnmTAAEJfBJ7kVoyGjIYGmKwAYAOeZAFqAGADnmTAAEJ2BJ7lVoyxjLEGmK0AYAOeZAFqAGADnmTAAEKNBJ7mVoy+jL4GmK4AYAOeZAFqAGADnmS12wSe51aMy4zLBpivAGADnmQBagBgA55kte4EnuhWjNmM2QaYsABgA55kAWoAYAOeZLYBBJ7pVozljOUGmLEAYAOeZAFqAGADnmTAAEKhBJ7qVoz2jPYGmLIAYAOeZAFqAGADnmTAAEKzBJ7rVo0cjRwGmLMAYAOeZAFqAGADnmTAAELJBJ7sVo1CjUIGl9wAYAOeZAFqAGADnmTAAELhBJ7tVo1ojWgGl90AYAOeZAFqAGADnmTAAEL5BJ7uVo11jXUGmLQAYAOeZAFqAGADnmS1yASe71aNpY2lBpi1AGADnmQBagBgA55ktjIEnvBWja+NrwaYtgBgA55kAWoAYAOeZLZGBJ7xVo24jbgGmLcAYAOeZAFqAGADnmTAAEMRBJ7yVo3GjcYGl94AYAOeZAFqAGADnmTAAEMlBJ7zVo3uje4Gl+MAYAOeZAFqAGADnmTAAEM7BJ70Vo4WjhYGl+UAYAOeZAFqAGADnmTAAENTBJ71Vo4+jj4Gl+YAYAOeZAFqAGADnmTAAENrBJ72Vo5mjmYGmLgAYAOeZAFqAGADnmTAAEODBJ73Vo6SjpIGmLkAYAOeZAFqAGADnmTAAEObBJ74Vo6+jr4GmLoAYAOeZAFqAGADnmS2gwSe+VaOy47LBpi7AGADnmQBagBgA55kwABDswSe+laO3Y7dBpi8AGADnmQBagBgA55kt1MEnvtWjuyO7AaYvQBgA55kAWoAYAOeZMAAQ8sEnvxWjwCPAAaYvgBgA55kAWoAYAOeZLaXBJ79Vo8Pjw8GmL8AYAOeZAFqAGADnmTAAEPjBJ7+Vo9Fj0UGmMAAYAOeZAFqAGADnmS2qwSe/1aPVo9WBpjBAGADnmQBagBgA55kwABD+wSfAFaPbI9sBpjCAGADnmQBagBgA55ktr8EnwFWj36PfgaYwwBgA55kAWoAYAOeZMAARBMEnwJWj5WPlQaYxABgA55kAWoAYAOeZLbTBJ8DVo+pj6kGmMUAYAOeZAFqAGADnmTAAEQrBJ8EVo/Jj8kGmMYAYAOeZAFqAGADnmS25wSfBVaP24/bBpjHAGADnmQBagBgA55kwABEQwSfBlaQB5AHBpjIAGADnmQBagBgA55kt2cEnwdWkBqQGgaYyQBgA55kAWoAYAOeZMAARFsEnwhWkD+QPwaYygBgA55kAWoAYAOeZLd7BJ8JVpBIkEgGmMsAYAOeZAFqAGADnmTAAERzBJ8KVpBWkFYGmMwAYAOeZAFqAGADnmS3jwSfC1aQapBqBpjNAGADnmQBagBgA55kwABEiwSfDFaQg5CDBpjOAGADnmQBagBgA55kt6MEnw1WkJ2QnQaYzwBgA55kAWoAYAOeZMAARKMEnw5WkLyQvAaY0ABgA55kAWoAYAOeZLe3BJ8PVpDPkM8GmNEAYAOeZAFqAGADnmTAAES7BJ8QVpDnkOcGmNIAYAOeZAFqAGADnmS3ywSfEVaQ+pD6BpjTAGADnmQBagBgA55kwABE0wSfElaREpESBpjUAGADnmQBagBgA55kt98EnxNWkSGRIQaY1QBgA55kAWoAYAOeZMAAROsEnxRWkTWRNQaY1gBgA55kAWoAYAOeZLfzBJ8VVpFFkUUGmNcAYAOeZAFqAGADnmTAAEUDBJ8WVpFakVoGmNgAYAOeZAFqAGADnmS4BwSfF1aRaZFpBpjZAGADnmQBagBgA55kwABFGwSfGFaRfZF9BpjaAGADnmQBagBgA55kuBsEnxlWkY+RjwaY2wBgA55kAWoAYAOeZMAARTMEnxpWkbORswaX6ABgA55kAWoAYAOeZLn5BJ8bVpHCkcIGmNwAYAOeZAFqAGADnmTAAEVLBJ8cVpHWkdYGmN0AYAOeZAFqAGADnmS6DQSfHVaR7pHuBpjeAGADnmQBagBgA55kwABFYwSfHlaSC5ILBpfpAGADnmQBagBgA55kuEIEnx9Wkh2SHQaY3wBgA55kAWoAYAOeZMAARXsEnyBWkjSSNAaY4ABgA55kAWoAYAOeZMAARZMEnyFWkmCSYAaY4QBgA55kAWoAYAOeZMAARasEnyJWkpGSkQaX6gBgA55kAWoAYAOeZLh/BJ8jVpKvkq8GmOIAYAOeZAFqAGADnmTAAEXDBJ8kVpLSktIGmOMAYAOeZAFqAGADnmS6MQSfJVaS65LrBpjkAGADnmQBagBgA55kwABF2wSfJlaTCZMJBpjlAGADnmQBagBgA55kukUEnydWkySTJAaY5gBgA55kAWoAYAOeZMAARfMEnyhWk0STRAaX6wBgA55kAWoAYAOeZLiTBJ8pVpNUk1QGmOcAYAOeZAFqAGADnmTAAEYLBJ8qVpNpk2kGmOgAYAOeZAFqAGADnmS4pwSfK1aTeJN4BpjpAGADnmQBagBgA55kwABGIwSfLFaTjJOMBpjqAGADnmQBagBgA55kuLsEny1Wk5qTmgaY6wBgA55kAWoAYAOeZMAARjsEny5Wk8STxAaY7ABgA55kAWoAYAOeZLjPBJ8vVpPZk9kGmO0AYAOeZAFqAGADnmTAAEZTBJ8wVpPzk/MGmO4AYAOeZAFqAGADnmTAAEZrBJ8xVpQdlB0GmO8AYAOeZAFqAGADnmTAAEaDBJ8yVpRMlEwGmPAAYAOeZAFqAGADnmS4+ASfM1aUXpReBpjxAGADnmQBagBgA55kuQwEnzRWlHCUcAaY8gBgA55kAWoAYAOeZLkgBJ81VpSLlIsGmPMAYAOeZAFqAGADnmTAAEabBJ82VpSrlKsGmPQAYAOeZAFqAGADnmS5NASfN1aUv5S/Bpj1AGADnmQBagBgA55kwABGswSfOFaU2JTYBpj2AGADnmQBagBgA55kuUgEnzlWlPiU+AaY9wBgA55kAWoAYAOeZMAARssEnzpWlR2VHQaY+ABgA55kAWoAYAOeZMAARuMEnztWlUGVQQaY+QBgA55kAWoAYAOeZMAARvsEnzxWlWqVagaY+gBgA55kAWoAYAOeZMAARxMEnz1WlZSVlAaY+wBgA55kAWoAYAOeZMAARysEnz5Wld2V3QaY/ABgA55kAWoAYAOeZLlcBJ8/VpXnlecGmP0AYAOeZAFqAGADnmS5vQSfQFaV9JX0Bpj+AGADnmQBagBgA55kuXAEn0FWlgSWBAaY/wBgA55kAWoAYAOeZMAAR0MEn0JWljCWMAaZAABgA55kAWoAYAOeZLnRBJ9DVpZcllwGmQEAYAOeZAFqAGADnmSJ7gSfRFaWa5ZrBpkCAGADnmQBagBgA55kueUEn0VWlnmWeQaZAwBgA55kAWoAYAOeZMAAR1sEn0ZWlqKWogaZBABgA55kAWoAYAOeZIoCBJ9HVpawlrAGmQUAYAOeZAFqAGADnmSKKgSfSFaWu5a7BpkGAGADnmQBagBgA55kij4En0lWlsaWxgaZBwBgA55kAWoAYAOeZIpSBJ9KVpbRltEGmQgAYAOeZAFqAGADnmSKZgSfS1aW4ZbhBpkJAGADnmQBagBgA55kinoEn0xWluyW7AaZCgBgA55kAWoAYAOeZIqOBJ9NVpb6lvoGmQsAYAOeZAFqAGADnmSKogSfTlaXB5cHBpkMAGADnmQBagBgA55kirYEn09WlxWXFQaZDQBgA55kAWoAYAOeZIrKBJ9QVpcglyAGmQ4AYAOeZAFqAGADnmSK3gSfUVaXK5crBpkPAGADnmQBagBgA55kivIEn1JWlzyXPAaZEABgA55kAWoAYAOeZIsGBJ9TVpdNl00GmREAYAOeZAFqAGADnmSLGgSfVFaXXpdeBpkSAGADnmQBagBgA55kiy4En1VWl2+XbwaZEwBgA55kAWoAYAOeZItCBJ9WVpeZl5kGmRQAYAOeZAFqAGADnmSKFgSfV1aXqpeqBpkVAGADnmQBagBgA55ki1YEn1hWl7iXuAaZFgBgA55kAWoAYAOeZItqBJ9ZVpfGl8YGmRcAYAOeZAFqAGADnmSLfgSfWlaX1JfUBpkYAGADnmQBagBgA55ki5IEn1tWl+KX4gaZGQBgA55kAWoAYAOeZIumBJ9cVpf2l/YGmRoAYAOeZAFqAGADnmSLugSfXVaYCpgKBpkbAGADnmQBagBgA55ki84En15WmB6YHgaZHABgA55kAWoAYAOeZIviBJ9fVpgymDIGmR0AYAOeZAFqAGADnmSL9gEFn2NWgkuCS5hEAQAAA4JLmEQAAAACAgKCSwAABIMoYAPAAGwfAIJLAAAEhHVgA8AAbBgAAGADnmQBPwMIAJ5mgADAD2IeCACeaIEAwA9iLAkAAMAAbFoAAAAAAQafYVaCS4JLmEQAAIFTAAAAAQOCS5hEAAAAAAAAAGADwABsGAFKAAEPAC6eaAAAD2JiAA9ijwAAAAECn2RWmQKZB5q8C5keAAABYAPAAGxWAAAMBJ9mVpkHmQcJgygAYAPAAGwfAASfaFaZB5kHCYR1nkoAYAPAAGwYAASfaVaZB5kHBoGmAF0DwABsGQFgA59kAWoAXQPAAGwZAWADn2TAAE0BBJ9qVpkUmRQGmR8AYAOfZAFqAGADn2SzRASfa1aZKpkqBpkgAGADn2QBagBgA59ktM0En2xWmVKZUgaZIQBgA59kAWoAYAOfZLOOBJ9tVpl9mX0GmSIAYAOfZAFqAGADn2S2EQSfblaZppmmBpkjAGADn2QBagBgA59ktxoEn29Wmc+ZzwaZJABgA59kAWoAYAOfZLPZBJ9wVpoPmg8GmSUAYAOfZAFqAGADn2S5gASfcVaaTZpNBpkmAGADn2QBagBgA59kuFIEn3JWmo2ajQaZJwBgA59kAWoAYAOfZLQSAQWfdlaZB5kHmrwBAAADmQeavAAAAAICApkHAAAEgyhgA8AAbB8AmQcAAASEdWADwABsGAAAYAOfZAE/AwgAn2aAAMAPZAAIAJ9ogQDAD2QOCQAAwABsWgAAAAABBp90VpkHmQeavAAAgVMAAAABA5kHmrwAAAAAAAAAYAPAAGwYAUoAAQ8ALp9oAAAPZEQAD2RxAAAAAQKfd1ac8Jz1niwLmSgAAAFgA8AAbFYAAAoEn3lWnPWc9QmDKABgA8AAbB8ABJ97Vpz1nPUJhHWeSgBgA8AAbBgABJ98Vpz1nPUGgaYAXQPAAGwZAWADn3cBagBdA8AAbBkBYAOfd8AATRkEn31WnQGdAQaKCABgA593AWoAYAOfd7NTBJ9+Vp0rnSsGmSkAYAOfdwFqAGADn3ezngSff1adR51HBpkqAGADn3cBagBgA593tFsEn4BWnXOdcwaZKwBgA593AWoAYAOfd7RLBJ+BVp2jnaMGmSwAYAOfdwFqAGADn3e2VgSfglad053TBpktAGADn3cBagBgA593tyoEn4NWnheeFwaZLgBgA593AWoAYAOfd7mQAQWfh1ac9Zz1niwBAAADnPWeLAAAAAICApz1AAAEgyhgA8AAbB8AnPUAAASEdWADwABsGAAAYAOfdwE/AwgAn3mAAMAPZbAIAJ97gQDAD2W+CQAAwABsWgAAAAABBp+FVpz1nPWeLAAAgVMAAAABA5z1niwAAAAAAAAAYAPAAGwYAUoAAQ8ALp97AAAPZfQAD2YhAAAAAQKfiFaeL541nqeDmS8AAAFgA8AAbFYAAAIEn4pWnk+eVwmXDABgA59kAASfi1aeb553CZkwAF0DwABsGQFgA593AAEFn41WnnuegZ6lAQAAA56HnqUAAAACAgKejQAABJcMYAOfZACenAAABJkwXQPAAGwZAWADn3cAAGADn4gBPwMIAZ+KgADAD2aJCAGfi4EAwA9mlQkBnoHAAGxaAAAAAAAAAA9m0QAAAAACn45WwABGRsAARkvAAEZ1C5kxAAABYAPAAGxWAAAFBJ+QVsAARkvAAEZLCYMoAGADwABsHwAEn5JWwABGS8AARksJhHWeSgBgA8AAbBgABJ+TVsAARkvAAEZLBoGmAF0DwABsGQFgA5+OAWoAXQPAAGwZAWADn47AAE0tBJ+UVsAARlzAAEZcBoYgAGADn44BagBgA5+OjAYEn5VWwABGacAARmkGhiEAYAOfjgFqAGADn46MFQEFn5lWwABGS8AARkvAAEZ1AQAAA8AARkvAAEZ1AAAAAgICwABGSwAABIMoYAPAAGwfAMAARksAAASEdWADwABsGAAAYAOfjgE/AwgAn5CAAMAPZ7MIAJ+SgQDAD2fDCQAAwABsWgAAAAABBp+XVsAARkvAAEZLwABGdQAAgVMAAAABA8AARkvAAEZ1AAAAAAAAAGADwABsGAFKAAEPAC6fkgAAD2f7AA9oMgAAAAECn5pWwABU+MAAVQfAAFUnB5eqAAABYAPAAGxWAAAAAQWfnAAAAAAEAAADAAAAAAAAAAAAYAOfmgE/AQkBAMAAbFoAAAAAAAAAD2iGAAAAAAAMBJ5MVoIigkMGmTIAYAPAAGwfAWqCQWADwABsH4eWBJ5NVpitmL4GmTMAYAPAAGwfAWqYvWADwABsHwMEnk5WmO6Y/waZNABgA8AAbB8Bapj8YAPAAGwfhioEnk9WnsTAAEXlBpk1AF0DwABsXwJgA55kYAOfiAFqntZdA8AAbF8CYAOeZGADn4i7ygSeUFbAAEYswABGQwaZNgBgA8AAbB8BasAARkJgA8AAbB+A1gSeUVbAAFLVwABS9QaXqQBgA8AAbB8BasAAUvBgA8AAbB/AAEz4BJ5SVsAAU0LAAFNjBpk3AGADwABsHwFqwABTXmADwABsH8AATTcEnlNWwABTtcAAU9kGmTkAYAPAAGwfAWrAAFPUYAPAAGwfwABM+ASeVFbAAFQjwABUOgaZOgBgA8AAbB8BasAAVDZgA8AAbB+GKgSeVVbAAFSEwABUmwaZOwBgA8AAbB8BasAAVJdgA8AAbB+GKgSeVlbAAFWkwABVrwaZPABgA8AAbB8BasAAVa5gA8AAbB8ABJ5XVsAAVbvAAFXHBpk9AGADwABsHwFqwABVxmADwABsHwMLBp5ZVpq/msOc7QABmT4AAAABA5rSnO0AAAACAgKa3AAAAJcMYAOfZACa6wAAAJk/YAPAAGxbAABgA8AAbB8BPgJHmveAmv/AD2peCQGbHWqbHWADn2SzRAA+AUqbJwGUAZtDaptDYAOfZLTNAD4BSptNAZUBm2lqm2lgA59ks44APgFKm3MBI4GbesAPamo3BZUBYAPAAGwfAZucapucYAOfZLYRAD4BSpumASOBm63AD2pqNwWVAWADwABsHwGbz2qbz2ADn2S3GgA+AUqb2QEjgZvgwA9qapeVAWADwABsHwGcAmqcAmADn2Sz2QA+AUqcDQEjgZwUwA9qajcGlgFgA8AAbB8BnDZqnDZgA59kuYAAPgFKnEEBI4GcSMAPamo3BpYBYAPAAGwfAZxqapxqYAOfZLhSAD4BSpx1ASOBnHzAD2pqNwaWAWADwABsHwGcnmqcnmADn2S0EgA+AUqcqgGXPTCcuiSc6wInmUCAnOLAD2peBp5aVsAARrzAAEbBwABIVwABmUEAAAABA8AARs/AAEhXAAAAAQEBwABG1wAAAIzqYAOeZAAAYAPAAGxbAT4DTsAARunAAEbyAAGXDGADn2QBFsAARwwcwABHA2rAAEb0XQPAAGxfAmADnmRgA5+Iu8opAQABgMAARwTAD2vfAMAAbGGXDJ+KR8AARxiBwABHIMAPa/gCA8AARz5qwABHPmADn2SzRMAAR1RqwABHVGADn2S0zcAAR2pqwABHamADn2S0EgA+AUrAAEd2ASoGwABHlmrAAEeWYAOfZLOOwABHrGrAAEesYAOfZLYRwABHwmrAAEfCYAOfZLcawABH2GrAAEfYYAOfZLPZwABH72rAAEfvYAOfZLmAwABIBmrAAEgGYAOfZLhSAD4BSsAASBEBKT0wwABIJCTAAEhVAieZQIHAAEhMwA9r+AaeW1bAAEhawABIX8AASO4AAZlCAAAAAQPAAEhrwABI7gAAAAEBAcAASHMAAACM6mADnmQAAGADwABsWwE+AUrAAEh/ASIcwABInxzAAEiWasAASIddA8AAbF8CYAOeZGADn4i7yikBAAGAwABIl8APbSoAwABsYScBAAErAMAAbF4AHsAASLGeWgEAARzAAEjNasAASMddA8AAbBkBYAOeZMAAR2wpAQABHMAASNsWwABI1YDAAEjOwA9tKoMonmZEAQABasAASN1gA8AAbB8DAMAAbOEAwABsuAAGnlxWwABI8cAASPjAAEluAAGZQwAAAAEDwABJBsAASW4AAAABAQHAAEkOAAAAjOpgA55kAABgA55kAT4CQB7AAEkhnlsBAAGAwABJLsAPbgYAwABJIcAASTUASsAASToBHMAASU5qwABJSF0DwABsGQFgA55kwABHbCkBAAEcwABJXBbAAElWgMAASU/AD24GgyieZkQBAAFqwABJXmADwABsHwMAwABs4QDAAGy4Bp5dVsAASXHAAEl2wABOcgABmUQAAAABA8AASZvAAE5yAAAAAAAAAFwBPgI+Ak7AAEnlAAAAPF0DwABsSgFgA55kARbAAEnlHgDAAGwvAQFdA8AAbCABYAOeZAFqwABJ5V0DwABsGQFgA55kwABHbAA9wABsS0UAAAEcwABJ5YAAwA9uvT4AAAAAwABsTQA+Ak7AAEnUAAAAjOpgA55kARbAAEntgADAD269QMAAbE9BPgROwABJ+cAASgAAAZCgYAOfiAEcwABKEWrAAEoCXQPAAGxfAmADnmRgA5+Iu8opAQABgcAAShLAD28gAMAAbGFJwABKHxzAAEo1HMAASiqBwABKI8APbyCBUwAAAACfYYKuAQABasAASj5gA8AAbBjAAE07AMAAbPA+BEnAAEpUIRzAAEpfgsAASljAD29CJwEAASsAwABsXj4BPTDAAEpyJMAASrgDJ5lGgcAASrDAD28gJ4D3P07AAErVwABK3QABmUdgA55kARzAAErsasAASuZdA8AAbBkBYAOeZMAAR2wpAQABHMAASvoWwABK9IHAAErtwA9vIIMonmZEAQABasAASvxgA8AAbB8DAMAAbOEAwABsuEnAAEsSIRzAAEs3HMAASykcwABLHoPAAEsWwA9v+IFTAAAAAJ9hgT8BAAFqwABLK2ADwABsGMAATTsAwABtPScBAAEcwABLQYHAAEs6wA9vIIFTAAAAAJ9hAMAAbDY+AT0wwABLVyTAAEu+BSeZSIHAAEtrwA9vICeZSYPAAEu0wA9v+CeZSj9JwABLziEewABL055aAQABg8AAS+LAD2/4AD4BPTDAAEv2JMAATG8HJ5lIgcAATArAD28gJ5lLg8AATDPAD2/4J5lMFsAATGQcwABMWmrAAExLXQPAAGxfAmADnmRgA5+Iu8opAQABg8AATFvAD2/4AMAAbGGXDJ+KJ4D3Pz9JwABMgxzAAEyOgsAATIfAD29CJwEAASsAwABsXj4BQsAATJ8AP0nAAEyzHsAATLeeWgEAAYHAAEzGwA9vIAA+AknAAEzXIRzAAE0SHMAATQccwABM6GrAAEziXQPAAGwZAWADnmTAAEdsKQEAARzAAEz2FsAATPCBwABM6cAPbyCDKJ5mgT8BAAFqwABM+GADwABsHwMAwABsiADAAGy4gVMAAAAAn2EnAQABHMAATTEcwABNJoHAAE0fwA9vIIFTAAAAAJ9hgT8BAAFqwABNM2ADwABsGMAATTsAwABtPQDAAGw2PgE9MMAATUokwABNjQYnmU2BwABNWcAPbyBqwABNYGADwABsGMAATTsnmU6BwABNhcAPbyAngPc/ScAATZ0WwABNrhbAAE2ogcAATaHAD28ggyieZplPwABuHj4BPTDAAE2/JMAAThAFJ5lNgcAATc7AD28gJ4OkFsAATd+CwABN2MAPb0KXDJ+KJ5lQPz9JwABOJhzAAE4/FsAATjhqwABOMV0DwABsGQFgA55kwABHbIDgwABsaoE7AQABasAATkFgA8AAbB+GKgDAAGyGPgE9MMAATlQnmVE/Bp5eVsAATnXAAE56wABOwgABmVIAAAABA8AAToDAAE7CAAAAAQEBwABOiAAAAIzqYAOeZAAAYAPAAGxbAUrAAE6TARzAAE60FsAATqscwABOomrAAE6TXQPAAGxfAmADnmRgA5+Iu8opAQABgMAATqPAD3NEAMAAbGGXDJ+KJwEAAWrAAE7AYAOfZLcaAMAAbF4Gnl9WwABOxcAATsrAAE77AAGZUwAAAAEDwABO0cAATvsAAAABAQHAAE7ZAAAAjOpgA55kAABgA8AAbFsBSsAATuQBHMAATuuAwABO5MAPc9YnAQABasAATvVgA55kuVwAwABsXgaeYFbAAE7+wABPA8AAUIEAAZlUAAAAAQPAAE8JwABQgQAAAAEBAcAATxEAAACM6mADnmQAAGADwABsWwE+AUfAAE8dgMAATyXAD3Q7AgjAAE8/asAATz9gA55kufnAAE9casAAT1xgA55kug3AAE+CasAAT4JgA55kuELAAE+iasAAT6JgA55kuH/AAE/OasAAT85gA55kujHAAE/1asAAT/VgA55kukXAAFAeasAAUB5gA55kuJPAAFA8asAAUDxgA55kuKcAPgFKwABQTwEpAAE+AUrAAFBvASoGnmFWwABQhMAAUInAAFC/AAGZVQAAAAEDwABQkcAAUL8AAAABAQHAAFCZAAAAjOpgA55kAABgA8AAbFsBSsAAUKQBHMAAUKuAwABQpMAPdRcnAQABasAAULVgA55kuLsAwABsXgaeYlbAAFDCwABQx8AAUTIAAZlWAAAAAQPAAFDUwABRMgAAAAEBAcAAUNwAAACM6mADnmQAAGADwABsWwFKwABQ6wEiIiIewABQ655eAQABgMAAUPLAD3V8AAEewABQ/Z5fAQABgMAAUQXAD3V8AAEewABREJ5gAQABgMAAURfAD3V8AAEewABRIp5hAQABgMAAUSvAD3V8AAaeY1bAAFE1wABROsAAUmwAAZlXAAAAAQPAAFFAwABSbAAAAAEBAcAAUUgAAACM6mADnmQAAGADwABsWwE+AUfAAFFUgMAAUVzAD3YVAgfAAFF2asAAUXZgA55ktkbAAFGNasAAUY1gA55ktbTAAFGsasAAUaxgA55ktcjAAFHHasAAUcdgA55ktdvAAFHiasAAUeJgA55kte7AAFH+asAAUf5gA55ktgHA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H8AArLegwwIAApMUwACsw8AQKJEMAAAfwACs2qDDAgACFsAArO0WwACs4y6BFKDNgODAAGxqFMAArPXAECdoCwAAH8AArRSgwwIAAhbAAK0nFsAArR0ugRSgzYDgwABsahTAAK0vwBAmYAoAAB/AAK1LoMMCAAIWwACtXBbAAK1ULoL3oM6A4MAAbGoUwACtZMAQJVgJAAAfwACtfqDDAgACFsAArY8WwACthy6DEqDPgODAAGxqFMAArZfAECRQCAAAH8AArbGgwwIAAhbAAK3AFsAArboujESg0IDgwABsaofAAK3IwBAjTAAfwACt4KDDAgACFsAArfkWwACt6S6MRqDRgODAAGxqhsAArgHAECIcAB/AAK4joMMCAAIWwACuOBbAAK4sLos1oNOA4MAAbGqFwACuQMAQIPAAH8AArl6gwwIAAhbAAK5yFsAArmcuhweg0oDgwABsaoTAAK56wBAfxAAfwACul6DDAgACFsAArq8WwACuoC6MR6DVgODAAGxqg8AArrfAEB6YAB/AAK7YoMMCAAIWwACu7RbAAK7hLoQRoNaA4MAAbGqCwACu9cAQHWwAH8AArxOgwwIAAiMhHMAArysWwACvHC6LKKDXJwEAASsAwABsXhbAAK9EFsAArzUuiyig14DgwABuIZMBYAPAAGwfgcAAr1rAEBxsAEAcwACvkxbAAK+MFMAAr4PAECmUDwCA4MAAbGonAQABasAAr5ZgA8AAbB+CkgDAAGwywACvg8AAr6EATsAAr63AAK+0AACECmADwABsHwFqwACvtmADwABsH7WuPgJOwACv2gAAADxdA8AAbEoBYAOguwEWwACv2h4AwABsLwEBXQPAAGwgAWADoLsBFMAAr9rAECmUDwAAPcAAbEtFAAABHMAAr9oUAMAQLEgRAD4AAAAAwABsTQA+Ak7AAK/PAAAAmjVgA6C7ARbAAK/kFADAECxIEQBAwABsTz4BScAAr+whHMAAr/8WwACv+BTAAK/wwBAspBIAihegvycBAAErAMAAbF4+Aj0XwACwGhTAALASwBAspBIAhAoUwACwI8AQLCUQAKC+PRXAALAzwBAsJRAcwACwOhTAALAzwBAsJRAAgT8BAAEWwACwRRTAALA9wBAspBIAg/KgwQDAAGyIPgE9F8AAsGoUwACwYsAQLKQSAIQKk6C+TsAAsI/A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AAAAAAAAXAE+AT0XwABDGC6alKGFFsAAQzYWwABDKC6alKGFohOEAKIAohMGoiBbwABDRcAAQ0rAAERIAACa06GFAAAAAQPAAENawABESAAAAAIBAsAAQ28AAACFFGADiOcAwABDgAAAAJppYAOh/gFqAGABwABsXAIAXAE+BEnAAEOOHMAAQ5iBwABDksAQpVMnAQABKwDAAGxePgE9icAAQ6nAEKVTFsAAQ7EumpShhaITP07AAEPYwABD2gABg/pgA6HQAR/AAEPgod8CAAKAwABD6MAQpUWBwABD8sAQpVMAQBzAAEQcHMAARBEWwABEDBbAAEQFLor4ohGajqGFoZEpAQABgMAARBLAEKVFAMAAbGEnAQABKwDAAGxewABEBcAARCMAPRzAAEQ2FsAARDEWwABEKi6K+KIRmo6hhaGRgJwCAAKAwABEN8AQpUWCwABEQ8AQpaYAwABsYwaiIVvAAERNwABEUsAARV8AAJrXoYUAAAABA8AARF7AAEVfAAAAAQEBwABEcwAAAIUUYAOI5wAAXAE+BEAhHMAARJOAwABEisAQpnknAQABKwDAAGxewABEisAARJoATsAARK/AAESxAAGD+mADodABHMAARL8WwABEuhbAAESzLor4ohGajqGFoZEpAQABgMAARMDAEKZ5AMAAbGFJwABEzxzAAETVgcAARNPAEKawJwEAASsAwABsXj4BPTDAAETmJMAARRgDJ5qcgMAARPfAEKZ5J5rdP0nAAEUkIRzAAEUwFsAARSqBwABFKMAQprCas6HYJwEAARbAAEUzLpqVoYWiFADAAGxePgE9HMAARUyBwABFSsAQprCauQAAAACh2z8GoiJbwABFZMAARWnAAEXUAACa3qGFAAAAAQPAAEVxwABF1AAAAAAAAABcAT4CQCEcwABFmxbAAEWPFsAARYEumpWhhaIUi5ah7icBAAErAMAAbF7AAEWBwABFogA9HMAARakumtehhQEAARbAAEXEFsAARbYumpWhhaIUi5ah7gCiIQaiI1vAAEXZwABF3sAASMQAAJrfoYUAAAABA8AARgfAAEjEAAAAAAAAAFwBPgVAFsAARiUWwABGFy6alaGFohSasKHtwABGF8AARjMATsAARkDAAEZKAAGa4F0DwABsVwFgA4jnAR7AAEZQwABsfAABYAOI5wAAPTXAAEZw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AFmIFsAAWYKAwABZfcAQuauBPofZg/gBAWABwABsXAEuAIUePRzAAFmaLoy/oYUAAAAAoh8GojRbwABZsMAAWbzAAFpOAACF+wFqwABZsWADwABsVoC1AAABA8AAWdDAAFpOAAAAAQEBwABZ4QAAAIQNYAOIJgAAYAHAAGxcAT4CScAAWe0hFsAAWgEWwABZ+RbAAFnyLor4ohEfoZmA7JDwPgFKwABaGAA/PR3AAFowhfsBAAGAwABaRcAQunEAl7IGojVbwABaU8AAWl/AAFreAACF9QFqwABaVGADwABsVoC1AAABA8AAWm/AAFreAAAAAQEBwABafAAAAIQNYAOIEwAAYAHAAGxcAT4CScAAWoghFsAAWpwWwABalBbAAFqNLor4ohEfoZmA7JDwPgFKwABaswA/PRzAAFrFLprjoYUBAAGAwABa1cAQuv4AoiYGojZbwABa48AAWu/AAFtXAACGBwFqwABa5GADwABsVoC1AAABA8AAWwDAAFtXAAAAAQEBwABbDgAAAIQNYAOIXQAAYAHAAGxcAT4DPRfAAFscLprLoYUcwABbGhbAAFscLprLoYWiF4E/AQABlADAAGyIohc9HMAAWywumuOhhQEAAYDAAFs8wBC7jgCiJj0XwABbSS6ay6GFHMAAW0cWwABbSS6ay6GFohdEAQABlADAAGzhohcGojdbwABbXMAAW2jAAF+eAACGDAFqwABbXWADwABsVoC1AAABA8AAW3vAAF+eAAAAAQEBwABbiwAAAIQNYAOIagAAYAHAAGxcAT4KPRzAAFulFsAAW5yAwABbl8AQvEWGCohug/gBAWABwABsXAEuAIUeTsAAW8wAAACa5GADiOcAScAAW90WwABb7xbAAFvhLpqVoYWiFJqwoe0+BD2JwABcT8AQvIUfwABcYYkSAQABJ5rlAD0cwABciS6a06GFAQABgcAAXJrAELyFAKIgPTXAAFyuAAABAGADoY0BFsAAXK4uiviiESMcwABcyxbAAFy1gsAAXK7AELzjmpOhhaGWJwEAASsAwABsXhfAAFy1gsAAXK7AELzjmpOhhR7AAFzdwABslgACYAOIamADiOcAAKGWKwFdA8AAbF8CYAOIamADiOc9HMAAXSsWwABdFhbAAF0PLor4ohGak6GFoZaAnAIAAoDAAF0swBC8RYHAAF00wBC8hQDA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wABn7hbAAGfnLor4okSajaGFoZApAQABgMAAZ/bAEMftAMAAbGFAIRzAAGgOgcAAaAjAEMgBJwEAASsAwABsXsAAaAjAAGgVAEAcwABoMBbAAGgpgcAAaCPAEMgBhACiACcBAAEWwABoMy6alKGFokYAwABsXsAAaCPAAGhAAD0XwABoRy6alKGFgcAAaFfAEMgBokZJwABoYyEcwABoexbAAGh1FsAAaGcumpShhaJGmrOiAScBAAEWwABofi6alaGFokcAwABsXj4EPRfAAGiVLpqVoYUWwABosxbAAGilLpqUoYWiRpqzogGiR0nAAGjBIRzAAGjaFsAAaNMWwABoxS6alKGFokaEAKIAJwEAASsAwABsXj4CPRfAAGj7FsAAaO0umpWhhaJHjFsWwABpJhbAAGkfFsAAaREumpShhaJGhACiAJpxogmh+UnAAGk9FsAAaU8WwABpQS6alaGFokeasKHtPgROwABqS8AAalcAAZrpYAOh4AEWwABqZxbAAGpZLpqVoYWiR4QAoeNOwABqf8AAaowAAZrqYAPAAGwfARbAAGqcFsAAao4umpWhhaJHjFuh+U7AAGrBwABqzQABmutgA8AAbB8BNcAAatsAAAEAYAPAAGwfARbAAGrbgsAAas/AEMmDjFuh+SMcwABq24TAAGrbwBDJ5ycBAAErAMAAbDIcwABq8pSBWgAAAADAAGyPhMAAatvAEMnnAWADwABsH0nAAGsAIRzAAGsRg8AAawTAEMmqJwEAARzAAGsghMAAaxTAEMnTgT8BAAGUAMAAbIgAwABsMj4BPTDAAGszJMAAazMJJ5rsFsAAa2mCwABrXcAQyYOEx6HiJxAnmu2EwABrq8AQydMnECea7oPAAGv7wBDJqicQPz8/PRfAAGxAFsAAbDIumpShhaJGmsOTogQ9F8AAbGQWwABsVi6alKGFokaaxJOiBT4CPRfAAGyUFsAAbIYumpShhaJGmsMWwABsthbAAGyvFsAAbKEumpShhaJGhACiAJrDogSiBD0XwABs1hbAAGzILpqUoYWiRprEFsAAbPcWwABs8BbAAGziLpqUoYWiRoQAogCaxKIFogVAHMAAbS8WwABtIhbAAG0ULpqUoYWiRprFogYnAQABKwDAAGxewABtFMAAbTYAQBzAAG1fFsAAbVIWwABtRC6alKGFokaacaIJ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dwAAhXcBasAAoxVgA8AAbFaAtQAAAQPAAKM6wACjdwAAAAEBAcAAo1EAAACEDWADhhcAAGABwABsXAE+AT0cwACjXS6bAaGFAgABgMAAo2TAEQB9AZqglKJWBqJuW8AAo3zAAKOIwACj1QAAhWABasAAo31gA8AAbFaAtQAAAQPAAKOdwACj1QAAAAEBAcAAo68AAACEDWADhaAAAGABwABsXAE+AT0cwACjuy6bAaGFAgABgMAAo8LAEQDmAZqglKJWBqJvW8AAo9rAAKPmwACkMwAAhWIBasAAo9tgA8AAbFaAtQAAAQPAAKP7wACkMwAAAAEBAcAApA0AAACEDWADhbEAAGABwABsXAE+AT0cwACkGS6bAaGFAgABgMAApCDAEQFPAZqglKJWBqJwW8AApDjAAKREwACkjwAAhg8BasAApDlgA8AAbFaAtQAAAQPAAKRYwACkjwAAAAEBAcAApGkAAACEDWADiHgAAGABwABsXAE+AT0cwACkdS6bAaGFAgABgMAApHzAEQG4AZqglKJWBqJxW8AApJTAAKSgwACk/gAAhUUBasAApJVgA8AAbFaAtQAAAQPAAKSwwACk/gAAAAEBAcAApL0AAACEDWADhS0AAGABwABsXAE+AT0cwACkyS6bAaGFAgABgMAApNDAEQIhAZqgIxbAAKTrFsAApOKAwACk3cARAiGFFIUvhNeI/pSTAWADwABsH6JWBqJyW8AApQPAAKUPwAClyQAAhUcBasAApQRgA8AAbFaAtQAAAQPAAKUfwAClyQAAAAEBAcAApSwAAACEDWADhTkAAGABwABsXAE+A07AAKU+wAClQAABg/pgA4jnARbAAKVHgMAApULAEQKuhRSFO07AAKVgwAClagABmwNgA8AAbFsBIhzAAKVzFsAApWwuiviiRIwMAQABgcAApX7AEQLHAKGgASIWwAClhoHAAKWEwBECx4TXiP4AFsAApZKBwAClkMARAseE1oj5PRzAAKWfLpsBoYUCAAGAwAClpsARAq4BmqAjgsAApbPAEQLrlJMBYAPAAGwfolYGonNbwAClzsAApdrAAKYZAACFZgFqwAClz2ADwABsVoC1AAABA8AApejAAKYZAAAAAQEBwACl8wAAAIQNYAOF0wAAYAHAAGxcAT4BPRzAAKX/LpsBoYUCAAGAwACmBsARA6kBmqCU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kgA+AUqonQEfqKij5wEAAYKox8ARIasAAajsaqjsYAOi3MAAUKQAPgFKqQcBH6kSpAoBAAGCqS3AESGrAD0wqU0kqW8CJ5tmgalpwBEgDwWph2qph2ADoq7AAE4qqadqqadgA6KuwABOPKnHaqnHYAOirsAATk6p52qp52ADoq7AAE5gqgdqqgdgA6KuwABOlgA+AUKqGQA9MKoqJKpOAiebZ4CqScARIAMGowhdqleqXKsUAACbaKKnAAAAAQOqYqsUAAAAAQEBqnIAAACKF2ADjucAAFwBPgROqoSqiwAAlNVgA8AAbB8BHqqNowUCAAIWqpkug76jDhaqny6EMKMPAEAcqsocqrqBqrPAESRbgfoBAAFqqrxgA8AAbB8DAMAAbN4nAQABkwDAAGwyqrKqzgA9HKrcgKrVwBEkSYo5AQABgaruwBEkWwCPBD0cqvsumm8BAAGAqwnAESRJAKMJBqMJXasZqx6rQgACmm8AAAABA6srq0IAAAABAQGrOwAAAIoXYAOO5wAAXAAGoxddq0erT6yZBAGbaaKnAAAAAQOrYayZAAAAAgICq3EAAACKGmADjw4Aq30AAACU1WADwABsHwAAYAOi8AE+B0Acq6ocq5qBq5PAESU5gfoBAAFqq5xgA8AAbB8DAMAAbN4nAQABkwDAAGwyq5KrrgBOq8arywABg75gA6KuAR6rzaMGAQABgavgwBElOQBOq/er/QABhDBgA8AAbB8BHqv/owcBAAGBrBPAESU5AE6sJqwqAAGKQWADovABHqwwoxYCAAKCrETAESWBg6xKwBElnwA9F6xahKxWwBElv4Qwg6xiwBEln6MTPRyscYSsbcARJb+acgEAAYCsfsARJS0AowpKrIsBhKySwBElvwajCl2snqyjrMYAAppyAAAAAQOsr6zGAAAAAQEBrL8AAACKGmADjw4AAFwABqMLXazLrNCs+wAAm2oAAAABA6zqrPsAAAABAQGs7wAAAJtrYAPAAGwfAABcAT4ABqMMXa0ArQWtKQAAm2wAAAABA60RrSkAAAABAQGtHwAAAIeAYAOO0AAAXAE+AAAAERukABEcEgARHJ0AER2dABEeWwARHugAER8LABEfNQARH2UAER+PABEf5AARJCoAESTiABElDgARJh4AESZKABEmegARJqgAAAARAqMaXa0urTSuTwObbQAAAWADovAAAAABBaMiXa1crVytbAAAAAOtaq1sAAAAAAAAAGADoxoBPwEJAa1coxkAAAAABAajHF2tca2MracBAIO+AWqtcmADwABsVoC1AAABA62RracAAAAAAAAAYAOirgFKrZQBaq2fYAOirsAATdIGox5draytva3jAACabwFqra1gA8AAbFaAtQAAAQOtyq3jAAAAAQEBrdoAAACKF2ADjucAAFwBPgAGox9dreit+a4eAACacgFqrelgA8AAbFaAtQAAAQOuBa4eAAAAAQEBrhUAAACKGmADjw4AAFwBPgAGoyBdriOuNq5NAACBUwFqriRgA8AAbFaAtQAAAQOuPq5NAAAAAAAAAGADwABsGAFKrkQBJ5tuAAARJzgAESd1ABEnrgARJ+cAESgeAAAABAKjI12uUq5YsPYDm28AAAFgA6LwAAABBKMlXa6TrpYYgUwAYAOkRwACBaMxXa6brpuusgCbZaKnAAOusK6yAAAAAAAAAGADoyMBPwIIAaMlKwkBrpujGQAAAAAFozJdrreut67PAAAAA67Frs8AAAABAQGuywAABIFMYAOkRwAAYAOjIwE/AggBoyWAAMARKKoJAa63oxkAAAAABwajJ12u1K7vrwoBAIO+AWqu1WADwABsVoC1AAABA670rwoAAAAAAAAAYAOirgFKrvcBaq8CYAOirsAATeMGoypdrw+vIK9sAACabwFqrxBgA8AAbFaAtQAAAQOvLa9sAAAAAQEBrz0AAACKF2ADjucAAFwBPgE9HK9SgK9LwBEpOIo+AQABFq9kLoFMoyUAjwcGoytdr3Gvgq/PAACacgFqr3JgA8AAbFaAtQAAAQOvjq/PAAAAAQEBr54AAACKGmADjw4AAFwBPgE9F6+sLoFMJq+sARyvuYCvssARKYyKUAAAAACPImADpEejJQajLF2v1K/lsDMAAJtqAWqv1WADwABsVoC1AAABA6//sDMAAAABAQGwBAAAAJtrYAPAAGwfAABcAT4BPTWwFQAAAQBgA6RHARawFS6BTKMlF7AZgbAVwBEp/ZtcoqccsCMWsBmBsBXAESn9m1yip6L/gT8BAAGAsCbAESnoAMAAbIii/wajKF2wOLBMsGkBAIHXAWqwOWADwABsVoC1AAABA7BVsGkAAAAAAAAAYAPAAGwfAUqwWAEcsGUWsFwWsFgugUyjJYHXpFKBPwEAATcLAMAAbIgGoy1dsG6wiLDFAwAnAWqwb2ADwABsVoC1AAABA7CKsMUAAAABAQGwiwAAAIHRWwAAYAPAAGxbAUqwlQEiJbCbAICwlcARKr1gA6MjABywuRawtS6BTKMlJwEAARawwhSwvMARKr0AAWADoyOBTKMlAKRZBqMuXbDKsN2w9AAAgVMBarDLYAPAAGxWgLUAAAEDsOWw9AAAAAAAAABgA8AAbBgBSrDrASaw6wUWsO8WsOsugUyjJYE+pEpgA8AAbBgAABEo0wARKRAAESlkABEpwAARKkQAESqWABErCQARK1YAAAAHAqMzXbD5sP+0wwObcAAAAWADovAAAAIEozVdsTSxOxiBFQBgA6MjAASjNl2xS7FPGIGIAGADpAwAAgWjQl2xVLFUsWkAm2WipwADsWexaQAAAAAAAABgA6MzAT8DCAGjNisIAaM1KwkBsVSjGQAAAAAFo0NdsW6xbrGTAAAAA7F6sZMAAAACAgKxgAAABIEVYAOjIwCxjgAABIGIYAOkDAAAYAOjMwE/AwgBozWAAMARLAQIAaM2gQDAESwQCQGxbqMZAAAAAAcGozhdsZixs7HMAQCDvgFqsZlgA8AAbFaAtQAAAQOxuLHMAAAAAAAAAGADoq4BSrG7AWqxxmADoq7AAE30BqM7XbHRseKyVgAAmm8BarHSYAPAAGxWgLUAAAEDse+yVgAAAAEBAbH/AAAAihdgA47nAABcAT4CPRyyFICyDcARLKiKPgEAARayJi6BFaM1AI8HPRyyO4CyNMARLKiKPgEAARayTS6BiKM2AI8HBqM8XbJbsmyy4wAAmnIBarJcYAPAAGxWgLUAAAEDsniy4wAAAAEBAbKIAAAAihpgA48OAABcAT4CPReyli6BFSaylgEcsqeAsqDAES0XilAAAAAAjyJgA6MjozU9F7K/LoGIJrK/ARyyzYCyxsARLReKUAAAAACPImADpAyjNgajPV2y6LL5s2wAAJtqAWqy6WADwABsVoC1AAABA7MTs2wAAAABAQGzGAAAAJtrYAPAAGwfAABcAT4CPTWzKQAAAQBgA6MjARazKS6BFaM1F7MxgbMpwBEtq5tcoqccszsWszGBsynAES2rm1yip6L/gT8BAAGAsz7AES2WAMAAbIii/z01s00AAAEAYAOkDAEWs00ugYijNhezUoGzTcARLfSbXKKnHLNcFrNSgbNNwBEt9Jtcoqei/4E/AQABgLNfwBEtlgDAAGyIov8Gozlds3GzhbPAAQCB1wFqs3JgA8AAbFaAtQAAAQOzjrPAAAAAAAAAAGADwABsHwFKs5EBHrORoq0CAAIWs6gWs6AugRWjNYHXoygWs7cWs7IugYijNoHXwABtKAAGoz5ds8Wz37RPAwAnAWqzxmADwABsVoC1AAABA7PhtE8AAAABAQGz4gAAAIHRWwAAYAPAAGxbAUqz8gEiIiWz+ACAs/LAES6/YAOjMwActB4WtBYugRWjNScBAAEWtCcUtCHAES6/AAFgA6MzgRWjNQCjLQActEIWtD0ugYijNicBAAEWtEsUtEXAES6/AAFgA6MzgYijNgDAAGxeBqM/XbRUtGe0wQAAgVMBarRVYAPAAGxWgLUAAAEDtG+0wQAAAAAAAABgA8AAbBgBSrR7ASMctIUWtIAWtHsugYijNoGIpBAnAQABarSIYAPAAGwYiQgAwABsNiS0pwEWtJ4ugRWjNSS0wQMWtKsugRWjNSeDmxa0uxa0ti6BiKM2gYikEAFgA8AAbBgAABEsQwARLIAAESzvABEtbgARLjsAES6YABEvNQARL8EAAAAHAqNEXbTGtMy6ggObcQAAAWADovAAAAUEo0ZdtQS1JwabcgBgA8AAbB8BarUfYAPAAGwfhaEEo0ddtTy1ZQabcwBgA8AAbB8BarVdYAPAAGwfhaQEo0ldtW61eBibdKKnAGADwABsHwGTBKNKXbWJtY8YhAAAYAOjMwAEo0tdtZ+1oxiBiABgA6QMAAIFo1pdtai1qLW+AJtloqcAA7W8tb4AAAAAAAAAYAOjRAE/AwgBo0srCAGjSisJAbWooxkAAAAABaNbXbXCtcK2hgAAAAO1z7aGAAAABAQEtdUAAASEAGADozMAteIAAASBiGADpAwAte0AAACJ92ADwABsWwC1+wAAAIn6YAPAAGxbAABgA6NEAT4CSbYQgrYUwBEw2T4BPRe2JS6bdKKnHLYsFrYlLpt0oqejSYHVAQABarYvYAPAAGwfhaEAwABsuqNJP0m2RoO2SsARMOc+AT0XtmEum3Sipxy2aBa2YS6bdKKno0mB1QEAAWq2a2ADwABsH4WkAMAAbLqjST8DCAGjSoAAwBEwwQgBo0uBAMARMM0JAbXCoxkAAAAACQajTV22i7amtsABAIO+AWq2jGADwABsVoC1AAABA7artsAAAAAAAAAAYAOirgFKtq4Bara5YAOirsAATgYGo05dtsW22bboAQCEMAFqtsZgA8AAbFaAtQAAAQO237boAAAAAAAAAGADwABsHwFKtuIBFrbiLpt0oqejSQajUV227bb9tyYCAIQwAWq27mADwABsVoC1AAABA7cCtyYAAAABAQG3BwAAAIE+YAPAAGwfAABcAT4BPRe3FC6bdKKngLcdwBEyNKNJBqNTXbcrtzy3rwAAmm8BarcsYAPAAGxWgLUAAAEDt0m3rwAAAAEBAbdZAAAAihdgA47nAABcAT4CPRy3boC3Z8ARMoGKPgEAARa3gC6EAKNKAI8HPRy3lIC3jcARMoGKPgEAARa3pi6BiKNLAI8HBqNUXbe0t8W4OwAAmnIBare1YAPAAGxWgLUAAAEDt9G4OwAAAAEBAbfhAAAAihpgA48OAABcAT4CPRe37y6EACa37wEct/+At/jAETLwilAAAAAAjyJgA6Mzo0o9F7gXLoGIJrgXARy4JYC4HsARMvCKUAAAAACPImADpAyjSwajVV24QLhRuMMAAJtqAWq4QWADwABsVoC1AAABA7hruMMAAAABAQG4cAAAAJtrYAPAAGwfAABcAT4CPTW4gQAAAQBgA6MzARa4gS6EAKNKF7iIgbiBwBEzhJtcoqccuJIWuIiBuIHAETOEm1yip6L/gT8BAAGAuJXAETNvAMAAbIii/z01uKQAAAEAYAOkDAEWuKQugYijSxe4qYG4pMARM82bXKKnHLizFripgbikwBEzzZtcoqei/4E/AQABgLi2wBEzbwDAAGyIov8Go09duMi43LkWAQCB1wFquMlgA8AAbFaAtQAAAQO45bkWAAAAAAAAAGADwABsHwFKuOgBHrjooq0CAAIWuP4WuPcuhACjSoHXozkWuQ0WuQgugYijS4HXwABtKAAGo1ZduRu5NbnHAwAnAWq5HGADwABsVoC1AAABA7k3uccAAAABAQG5OAAAAIHRWwAAYAPAAGxbAUq5SAEiIiIluU4AgLlIwBE0mGADo0QAHLl0FrltLoQAo0onAQABFrl9FLl3wBE0mAABYAOjRIQAo0oAoz4AHLmXFrmSLoGIo0snAQABFrmgFLmawBE0mAABYAOjRIGIo0sAwABsXgAcubkW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wABD8cAARAXAAEQVAQCB1wFqwABD8mADwABsVoC1AAABA8AARA7AAEQVAAAAAAAAAGADwABsHwFKwABEEQE3h/cGo4hdwABEGsAARDTAAERZAwAnAWrAAEQbYAPAAGxWgLUAAAEDwABENsAARFkAAAABAQHAAEQ3AAAAgdFbAABgA8AAbFsBSsAAREEBJcAAREcAgMAAREHAEUAUYAOjhAajiV3AAERewABEccAARIUAAIFTAWrAAERfYAPAAGxWgLUAAAEDwABEecAARIUAAAAAAAAAYAPAAGwYAUrAAER/ASeVnAAAET8OABE/VQARP5wAET/hABFAQAARQIUAAAAFAqOOXcAARIrAAESQwABGvAObfwAAAWADo20AAAABBaOXXcAARLnAAES5wABFDQAAAAPAAETJwABFDQAAAAEBAcAARNYAAACDZWADiUcAAGADo44BPwEJAMAAROujeQIAAmrAAET5YAOi3MAAULaAwABFAcARQOIABQajkF3AAEUSwABFI8AARUkAAJpvAWrAAEUTYAPAAGxWgLUAAAEDwABFMMAARUkAAAABAQHAAEVAAAAAihdgA47nAABcAT4ABqORXcAARU7AAEVfwABFhAAAmnIBasAARU9gA8AAbFaAtQAAAQPAAEVrwABFhAAAAAEBAcAARXsAAACKGmADjw4AAFwBPgAGo5VdwABFicAARZ3AAEXQAQCB1wFqwABFimADwABsVoC1AAABA8AARabAAEXQAAAAAAAAAGADwABsHwFKwABFqQEewABFqaKtAgACN4gBFsAARcoWwABFvi6DZaNygyiJSQAGo5JdwABF1cAARe/AAEZEAwAnAWrAAEXWYAPAAGxWgLUAAAEDwABF8cAARkQAAAABAQHAAEXyAAAAgdFbAABgA8AAbFsBSsAARgIBIiXAAEYIAIDAAEYCwBFCP2ADo44AHMAARjAWwABGJC6DZaNyJwEAARbAAEY5FMAARjPAEUI/AAFgA6OOg2WjcgDAAGxeBqOTXcAARknAAEalwABGugAAgVMBasAARkpgA8AAbFaAtQAAAQPAAEatwABGugAAAAAAAABgA8AAbBgBSsAARrMBJ5WdAAARQRsAEUFiABFBqQARQgwAEUKdABFC4gAAAAUCo5hdwABGv8AARsXAAEqZA5uAAAABYAOjbQAAAQSjml3AAEb8wABHAhiC2wBgA6MzAAIFo6VdwABHB8AARwfAAEdoAJtloqcAA8AARx/AAEdoAAAAAQEBwABHLAAAAINlYAOJRwAAYAOjmAE/AggBo5orCQDAAEdBo3kCAAJqwABHT2ADotzAAFBKgMAAR1zAEUNXAAWjpl3AAEdtwABHbcAAR9QAAAADwABHfsAAR9QAAAACAgLAAEeEAAAEgttgA6MzAMAAR5gAAACDZWADiUcAAGADo5gBPwIIAaOagADAEUO2CQDAAEeto3kCAAJqwABHu2ADotzAAFBKgcAAR8jAEUPEAAYGo5xdwABH2cAAR+rAAEg5AACabwFqwABH2mADwABsVoC1AAABA8AAR/fAAEg5AAAAAQEBwABIBwAAAIoXYAOO5wAAXAE+AT0cwABIHIDAAEgVwBFEO4o+AQABFsAASC4ugtujmgCPBwajnV3AAEg+wABIT8AASJ8AAJpyAWrAAEg/YAPAAGxWgLUAAAEDwABIW8AASJ8AAAABAQHAAEhrAAAAihpgA48OAABcAT4BPRfAAEh5LoLbJsAASHkBHMAASImAwABIgsARRKOKUAAAAACPImADozOjmgajnl3AAEikwABItcAASSgAAJtqAWrAAEilYAPAAGxWgLUAAAEDwABIz8AASSgAAAABAQHAAEjUAAAAm2tgA8AAbB8AAFwBPgFJwABI5SEcwABI8BbAAEjpLoLbo5onAQABKwCjPj4BPTXAAEkBAAABAGADozMBFsAASQEugtujmhfAAEkIgcAASQHAEUVLm1yipxzAAEkSFsAASQiBwABJAcARRUubXKKnov+BPwEAAYDAAEkVwBFFFQDAAGyIov8/BqOiXcAASS3AAElBwABJfwEAgdcBasAASS5gA8AAbFaAtQAAAQPAAElKwABJfwAAAAAAAABgA8AAbB8BSsAASU0BHsAASU2irQIAAhbAAEljFsAASVwugtujmoHXozkWwABJeRbAAEltLoNlo3KDKIlJAAajn13AAEmEwABJnsAASh8DACcBasAASYVgA8AAbFaAtQAAAQPAAEmgwABKHwAAAAEBAcAASaEAAACB0VsAAGADwABsWwFKwABJsQEiIiXAAEm3AIDAAEmxwBFGSWADo5gAHMAASeEWwABJ2i6C26OaJwEAARbAAEnqFMAASeTAEUZJAAFgA6OYgtujmgCjPgAcwABKCxbAAEn/LoNlo3InAQABFsAAShQUwABKDsARRkkAAWADo5iDZaNyAMAAbF4Go6BdwABKJMAASoDAAEqXAACBUwFqwABKJWADwABsVoC1AAABA8AASojAAEqXAAAAAAAAAGADwABsGAFKwABKjgEkwABKlwEWwABKkC6C26OaAAARRAcAEURvABFE4QARRaMAEUYWABFG1wARRykAAAAGAqOnXcAASpzAAEqiwABQYwObgQAAAWADo20AAAIEo6ldwABK3MAASuIYhAAAYAOi8AAEo6pdwABK6sAASvcYm4IAYAPAAGwfAAIFo7ZdwABK/MAASvzAAEtjAJtloqcAA8AASxfAAEtjAAAAAQEBwABLJAAAAINlYAOJRwAAYAOjpwE/AwgBo6orCAGjqSsJAMAASzmjeQIAAmrAAEtHYAOi3MAAUFyAwABLV8ARR7kABaO3XcAAS2jAAEtowABMkwAAAAPAAEt8wABMkwAAAAMDA8AAS4IAAASEAGADovAAwABLjwAABJuCYAPAAGwfAMAAS6oAAACDZWADiUcAAGADo6cBPgJAIiIiJcAAS/4AFsAAS/cuhACjqWADozMBJcAATCAAFsAATBkuhACjqWADo0QBJcAATEMAFsAATDwuhACjqWADo1wBHMAATGcWwABMYC6EAKOpJwEAASsAwABsXsAAS/fAAExuAEAcwABMihbAAEx8LpuCo6qD1wEAAZMAwABtFMAATHzAAEyOAAMIAaOpgADAEUgdCAGjqoEAwBFIKwkAwABLv6N5AgACasAAS81gA6LcwABQXILAAEvdwBFIOwAHBqOsXcAATJjAAEytwABMzAEAm2MBasAATJlgA8AAbFaAtQAAAQPAAEy5wABMzAAAAAAAAABgA8AAbFsBSsAATLwBIRzAAEzEFsAATL0uhACjqScBAAErAMAAbF4Go69dwABM0cAATOLAAE1eAACabwFqwABM0mADwABsVoC1AAABA8AATO/AAE1eAAAAAQEBwABM/wAAAIoXYAOO5wAAXAE+Aj0cwABNFIDAAE0NwBFJooo+AQABFsAATSYuhACjqQCPBz0cwABNOoDAAE0zwBFJooo5AQABFsAATUwum4KjqgCPBAajsF3AAE1jwABNdMAATfMAAJpyAWrAAE1kYAPAAGxWgLUAAAEDwABNgMAATfMAAAABAQHAAE2QAAAAihpgA48OAABcAT4CPRfAAE2eLoQAJsAATZ4BHMAATa6AwABNp8ARSiuKUAAAAACPImADovCjqT0XwABNxi6bghzAAE3dgMAATdbAEUorikwAAAAAjx+jqgajsV3AAE34wABOCcAATnwAAJtqAWrAAE35YAPAAGxWgLUAAAEDwABOI8AATnwAAAABAQHAAE4oAAAAm2tgA8AAbB8AAFwBPgFJwABOOSEcwABORBbAAE49LoQAo6knAQABKwDAAGxePgE9NcAATlUAAAEAYAOi8AEWwABOVS6EAKOpF8AATlyBwABOVcARSvabXKKnHMAATmYWwABOXIHAAE5VwBFK9ptcoqei/4E/AQABgMAATmnAEUq+AMAAbIii/z8Go61dwABOgcAATpXAAE75AQCB1wFqwABOgmADwABsVoC1AAABA8AATp7AAE75AAAAAAAAAGADwABsHwFKwABOoQEewABOoaKtAgACFsAATr4WwABOty6EAKOpgdfAAG0oHsAATsiirQIAAhbAAE7XLpuCo6oWwABO8hbAAE7mLoNlo3KDKIlJAAAGo7JdwABO/sAATxjAAE/PAwAnAWrAAE7/YAPAAGxWgLUAAAEDwABPGsAAT88AAAABAQHAAE8bAAAAgdFbAABgA8AAbFsBSsAATysBIiIiJcAATzEAgMAATyvAEUwLYAOjpwAcwABPXhbAAE9XLoQAo6knAQABFsAAT2cUwABPYcARTAsAAWADo6eEAKOpAMAAbF4AHMAAT4oWwABPfC6bgqOqJwEAARbAAE+TFMAAT43AEUwLAAFgA6Onm4KjqgDAAGwyABzAAE+7FsAAT68ug2WjcicBAAEWwABPxBTAAE++wBFMCwABYAOjp4Nlo3IAwABsXgajs13AAE/UwABQMMAAUGEAAIFTAWrAAE/VYAPAAGxWgLUAAAEDwABQOMAAUGEAAAAAAAAAYAPAAGwYAUrAAFA+ASTAAFBhAxbAAFBALoQAo6knm4MWwABQUy6bgqOqAAARSRIAEUluABFJ9wARSooAEUtOABFL2AARTM0AEU0sAAAABwKjuF3AAFBmwABQbMAAVUwDm4QAAAFgA6NtAAACBKO6XcAAUKTAAFCqGILbAGADozMABKO7XcAAUMPAAFDLGIv3AGADpDYAAgWjxl3AAFDQwABQ0MAAUTMAm2WipwAD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gUykfycBAAEWwACrKBTAAKsiwBGsYwABYAOkeIFMpH8AwABsXgakjV3AAKswwACrQ8AAq3sAAIFTAWrAAKsxYAPAAGxWgLUAAAEDwACrS8AAq3sAAAAAAAAAYAPAAGwYAUrAAKtRASTAAKt7AhbAAKtTLoFMpH8jIRzAAKtfFsAAq1gugQ+khCcBAAErAMAAbF4kwACrdQMnhsMWwACrbC6BD6SEJ4OjJwABYAPAAGwYAAARp1gAEaelABGoAwARqFEAEaiwABGpSQARqjcAEasAABGr2QARrDAAEazBABGtTQAAAAsCpJJdwACrgMAAq4bAANoCA4rNAAABYAPAAGxWAAJgA47dYAOO4gkEpJRdwACsKcAArEgGm6wAYAPAAGwfAWrAAKxHYAPAAGwfhOAEpJZdwACsZsAArIkJm62ipwBdA8AAbBkBYAOi8AEewACsdcAAbHYBAWADovABkwAEpJddwACss8AArPAJmBmipwBdA8AAbF8CYAOi8GADovABMsAArO5gA6LwYAOi8AAEpJhdwACtEsAArTUJm66ipwBdA8AAbF8CYAOCSmADovABMsAArTNgA4JKYAOi8AAEpJldwACtXsAArZAJm6+ipwBdA8AAbF8CYAPAAGwYYAOkFwEywACtjmADwABsGGADpBcABKSaXcAArafAAK2yGJuwoqcAXQPAAGwZAWADovABKwSkm13AAK3CwACtzhibsaKnAGADo20BKwSknF3AAK3ewACt5xibsqKnAGADo20BKwSknV3AAK34wACuBBibs6KnAGADpLwBKwIFpLpdwACuCcAArgnAAK7YAAAAA8AArhTAAK7YAAAAAQEBwACuHwAAAICQYAONPAAAYAOkkgE+Az0XwACuMC6bsaKnJsAArjABHMAArj8um7QBAAEfwACuUqODAAAAAACks2ADo22kmz0XwACubS6bsqKnJsAArm0BHMAArnkum7QBAAEfwACujKONAAAAAACks2ADo22knD0XwACupC6bs6KnH8AArrek3QIAAi6AwACuysARrxsApJ0BCQHAAK4JwABsWgAAAAAFpLtdwADWkMAA1pDAANjBAIpgAAPAANagwADYwQAAAAEBAcAA1rAAAACKGmADjw4AAGADpJIBPgY9F8AA1sWAwADWvsARr+WKRi6PEk7AANbpwADW9AABmoFgA8AAbB8BHMAA1v2AwADW9sARr+WKTAAAAACPHz0cwADXHIDAANcVwBGv5YpMAAAAAI8fPRfAANdILpuwoqcewADXWsAAbPwBAWADovABgcAA123AEbAQAKSaRcAA134BwADXh8AA14kAAIHUYAPAAGwfAZMBHMAA15CCwADXjsARsH2BOgEAAYHAANeSwBGwEADAAGyFAYrAANegwBGwfRzAANeegsAA16DAEbB9gT8BAAGUAMAAbIg+Ak7AANe1wADXvAABlNVgA8AAbB8BHMAA18WAwADXvsARr+WKTAAAAACPHz0cwADX6hbAANffLpuwoqekmoCcAgACgsAA1+vAEbB9NcAA1/QAAAEAYAOi8AEewADX9KMXAgACgMAA2AfAEa/lg8AA2A/AEbDZADXAANghAAABAFwBF8AA2CGEwADX9MARsSObXaKnHsAA2DujAwEAAYLAANhKwBGwfQCjAITAANf0wBGxIwDAAGzLRcAA2HEBwADYesAA2HwAAIHUYAPAAGwfAZMBHMAA2IOCwADYgcARsZSBOgEAAYHAANiFwBGwEADAAGyFAYrAANiTwBGxlBzAANiRgsAA2JPAEbGUgT8BAAGUAMAAbIg+AT0cwADYpYDAANiewBGv5YpMAAAAAI8fAQkBwADWkMAAbFoAAAAAGgakn13AAK7dwACu6sAAsEEAAIsjAAAAAQPAAK7zwACwQQAAAAEBAcAArvkAAACEDWADgkoAAGADovABPgRJwACvBRzAAK8OgMAArwnAEbI9JwEAASsAwABsXj4BSsAArx8BKz9OwACvQ8AAr0oAAJu1YAOi8AEcwACvVhbAAK9MLpuuoqekmCkBAAGAwACvV8ARsj0AwABsYUnAAK9iHMAAr22BwACvZsARsnsnAQABKwDAAGxePgI9icAAr37AEbJ7HMAAr4yAwACvh8ARsj2D+AEBYAOi8AEWwACvky6bs6KnpJ0AgkxJwACvqCIhHMAAr7OBwACvrMARsnsnAQABKwDAAGxeABbAAK/FgcAAr77AEbJ7m2OjED4BPRzAAK/mFsAAr9wum66ip6SYgJwCAAKAwACv58ARsj2BwACv78ARsnsAwABsYz8+AT01wACwFAAAAQBgA6LwAYHAALAUwBGyexfAALAbgsAAsBTAEbNlm1yipxzAALASFsAAsBuCwACwFMARs2WbXKKnov+BPwEAAZQAwABsiKL/SsAAsDABgcAAsDfAEbJ7BqSgXcAAsEbAALBZwACxIwAAi0UAAAABA8AAsGPAALEjAAAAAQEBwACwbwAAAIcrXQPAAGwZAWADgkoAAF0DwABsGQFgA6LwAT4DTsAAsILAALCKAAGbtl0DwABsGQFgA6LwAR7AALCQwABs/AEBYAOi8AEWwACwqYDAALCjwBGz6YDgwABsagBFwACwtgHAALC/wACwwQAAgdRgA8AAbB8BkwEcwACwyILAALDGwBG0UYE6AQABFsAAsNCAwACwysARs+mA4MAAbGoAwABshQGKwACw2sARtFEcwACw2ILAALDawBG0UYE/AQABlADAAGyIPgE9HMAAsOyBwACw5cARtA6AnAIAAoLAALDtwBG0URzAALDyLosjAQABHMAAsQGAwACw/MARs+kpAQABgsAAsQLAEbRRAMAAbLgApJ8AwABsy0rAALERAYHAALEYwBG0DgakoV3AALEowACxL8AAsVsAAJu3AAAAAQPAALE/wACxWwAAAAEBAcAAsUcAAACBiGADwABsGAAAYAPAAGwYAUrAALFQASTAALFbAieN1oDAALFWwBG1PQakol3AALFgwACxZ8AAsZMAAJu4AAAAAQPAALF3wACxkwAAAAEBAcAAsX8AAACBiGADwABsGAAAYAPAAGwYAUrAALGIASTAALGTAieN14DAALGOwBG1lAako13AALGYwACxn8AAsoAAAJu5AAAAAQPAALGxwACygAAAAAMDA8AAsbkAAACBiGADwABsGADAALHEAAAAhP1gA8AAbFsAwACx0wAAAIN/YAPAAGxbAABgA8AAbBgBPgFJwACx44HAALHnwBG1+z4BSsAAsfkBHMAAsgAum7cBAAGAwACyEcARtesApKFJwACyI4LAALInwBG2Cz4BSsAAsjkBHMAAskAum7gBAAGAwACyUcARtesApKI+AUrAALJrAYDAALJywBG16wakpF3AALKFwACyjMAAs9gAAItpAAAAAQPAALKcwACz2AAAAAMDA8AAsqQAAACERGADg6wAwACysQAAAIT9YAPAAGxbAMAAssAAAACDf2ADwABsWwAAYAPAAGwYAT4ETsAAstbAALLbAAGBiGADwABsGAEWwACy6RbAALLkgMAAst3AEba3gYiDsIGIiSJJwACy8yKBwACy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FsAA0zoum7Cip6SaKQEAAYTAANNGwBHWJADAAGy4m2iipwEAAYLAANNQwBHVtACjCE7AANNuwADTeAABmCdgA495ARzAANOrGsAA05uPlCkBAAEWwADTwBbAANO7HMAA07cWwADTrC6bsKKnpJopAQABhMAA07jAEdYkAMAAbLiDvqMOgyiisADAAGy4PTXAANPOAAABAGADj3kBhcAA087AEdb+F8AA09iGwADTzsAR11uD8hzAANPdFsAA09iGwADTzsAR11uD8o98gT8BAAEcwADT9xbAANPwgsAA0+HAEdW0hAqPC0QBAAEcwADUAIPAANP5wBHV2ikBAAGEwADUAcAR1iQAwABsuADAAGzhAMAAbIiPfD01wADUDgAAAQBgA495AYXAANQOwBHW/hfAANQYhsAA1A7AEdfmilMcwADUDBbAANQYhsAA1A7AEdfmilOPfYE/AQABlADAAGyIj309HMAA1DGAwADUKsAR1FWKOQEAARbAANRPFsAA1EMum7Cip6SagODAAGxqAI8EPRzAANRjgMAA1FzAEdRVijkBAAEWwADUhILAANR1wBHVtIQKjwsAjwQ9HMAA1JiAwADUkcAR1FWKNgEAAYLAANSlwBHVtACPAj4CTsAA1MsAAAA8XQPAAGxKAWADwABsHwEWwADUyx4AwABsLwEBXQPAAGwgAWADwABsHwGDwADUy8AR1doAPcAAbEtFAAABHMAA1MuEAMAR2Ko+AAAAAMAAbE0APgJOwADUwwAAAIpKYAPAAGwfARbAANTUhADAEdiqQMAAbE8+AT0cwADU44DAANTcwBHUVYo5AQABhcAA1PXAEdkGAI8EPgJOwADVdQAAADxdA8AAbEoBYAOi8AEWwADVdR4AwABsLwEBXQPAAGwgAWADovABFsAA1XUum62ip6SWAD3AAGxLRQAAARzAANV1hADAEdlLPgAAAADAAGxNAD4CTsAA1W4AAACKQWADovABFsAA1X+EAMAR2UtAwABsTz4BScAA1YccwADVmhbAANWPhcAA1YvAEdmmm12ip6MAJwEAAWrAANWqYAPAAGwfhRkAwABsMj4BPRzAANXGhcAA1cLAEdmmm2wBAAEWwADV2oDAANXTwBHUVYogju0Aoww/PRvAANYTj4UcwADWIxrAANYTj4WBPwEAARzAANY1FsAA1i6AwADWJ8AR1FWECo8LRAEAAYHAANY3wBHUugDAAGzhAMAAbIg9G8AA1lqPhhzAANZyGsAA1lqPhoE/AQABFsAA1oEWwADWdS6bsKKnpJqA4MAAbGoAwABsiAakuF3AANjGwADY2cAA2gAAAIFTAWrAANjHYAPAAGxWgLUAAAEDwADY4cAA2gAAAAAAAAAAYAPAAGwYAT4FTsAA2PfAANj6AACDnGADwABtBgEfwADZAMAAbQwAAAAAPRzAANkXgMAA2RTAEdrhgWUBAAEnm8MAwABtD0XAANk1AcAA2T7AANlAAACB1GADwABsHwGTARzAANlHgcAA2UXAEdsjgToBAAEWwADZVRbAANlJLpuwoqekmoDgwABsagDAAGyFAYnAANlfwBHbIxzAANldgcAA2V/AEdsjgT8BAAGUAMAAbIg+Ak7AANlwwADZdAABikFgA6LwARzAANmBFsAA2XYum7Cip6SaKQEAAYHAANmCwBHbIwDAAGy4PRzAANmPgMAA2YzAEdrhgWUBAAEkwADZxgYnmCmBwADZnMAR2yMnmCoewADZo6KrAQABFsAA2bqCwADZtsAR242DvqMOACeBd4LAANnCwBHbjQDAAG0PPRzAANnWgMAA2dPAEdrhgWUBAAEnhr4AwABtD0rAANnoARzAANnygMAA2e/AEdrhgVMAAAAAwABtEAAAEbIWABGzwgARtRYAEbVtABG1xAARtpAAEbfnABG5DwARukAAEbvWABG8SAARvdIAEb6fABG/dwARwiIAEcO5ABHEhgARx4kAEcjEABHKcQARy0wAEcz0ABHRLQAR0uwAEdQvABHaogAR3FIAAAAaAqS8XcAA2gXAANoLwAD/IwObxAAAAV0DmHABYAOi8AAABQSkvl3AANpMwADaVwmK5QBgA6SSAASkv13AANprwADadAmAkABgA408AASkwV3AANp+wADarwmbxaKnAF0DwABsXwJgA4omYAOi8AEywADarWADiiZgA6LwAASkwl3AANrMwADa8QmbxqKnAF0DwABsXwJgA4lVYAPAAGwfATLAANrvYAOJVWADwABsHwAEpMNdwADa+8AA2xIJm8cAWwABBaTdXcAA2xfAANsXwADbjgAAAAPAANsjwADbjgAAAAICAsAA2ykAAASK5WADpJIAwADbOwAABICQYAONPAAAYAOkvAE/BAgBpL6AAMAR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3sASYsKDKI0/iQsCAAIniGsnnGsAnAel74K61cASYzIBYAODMj9Ku2YBKwamDWm7eruMvBcAAIoDAWq7e2ADwABsVoC1AAABA7umvBcAAAACAgK7sQAAAICQYAONPAC7wwAAAIE+YAPAAG0WAABgA4MyAT4BSrvQATW71wAAAQBgA4MyARa71y6cUaXkpfAjHLvfgrvXwBJj5icBAAErAMAAbF4Xu9cunFGl5By78xa77YC748ASY7+DKI0/iQsCAAIniGsnnGwAnAel8IK718ASY+YBYAODMgamDmm8HLwuvb4AAIoEAWq8HWADwABsVoC1AAABA7xIvb4AAAACAgK8UwAAAICQYAONPAC8ZQAAAIE+YAPAAGwYAABgA4MyAT4CRbySAbybvJ0AAIHUYAPAAGwfAZMBHLykgryiwBJkk4E6AQABFrysgbymwBJkeYDgwABskQDAAGyFAYq8tsASZJMcvLSCvLbAEmSTgT8BAAGUAMAAbIg+AUm8wRy82Ry8y4G8xcASZHmDDgEAAYK81sASZJMAwABs+IE7AQABarzbYAPAAGwfiPsAwABshj4BSrzwATW89wAAAQBgA4MyARa89y6cT6Xkpe4jHL0Gg7z3wBJlJCcBAAErAMAAbF4XvPcunE+l5By9Jha9IIC9FsASZG2DKI0/iQsCAAIniGsnnG0AnAel7oO898ASZSQBYAODMj9KvWEBNb1oAAABAGADgzIBFr1oLpxOpeSl7SMcvXeCvWjAEmWJJwEAASsAwABsXhe9aC6cTqXkHL2TFr2NgL2DwBJkbYMojT+JCwIAAieIayecbgCcB6Xtgr1owBJliQFgA4MyBqYPab3DveC+MAAAigUBar3EYAPAAGxWgLUAAAEDvfC+MAAAAAEBAb37AAAAgJBgA408AABgA46KAUq+DwEevhO5+AEAAYC+JsASZhAAAAASSVIAEkmHABJJvAASSgAAEko3ABJKhgASStIAEkvoABJMxgASTRUAElEDABJR3QASVcAAEleSABJZ5QASXVEAEl6kABJfIwASX2YAEl+bABJgGgASYLoAEmFaABJh+gASYpoAEmOXABJkRQASZegAEmY2AAAAHAAAAAFpABJmsgASSEgAEmavAAAAAQASZrIAAAAAAAIIphKPzmoAAAeCugAAgi4AAILNAACLowAAgvEAALP+AACD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AEO+wBKU2gCmqz4BPR7AAEPkqXYBAAElwABD9QCAwABD7MASlLdgA6jqAEnAAEQPg8AARBPAEpUTPgE9HMAARC8unPmmZAIAAoHAAERGwBKUw4LAAERPwBKU2gCmqT8GpqlswABErsAARLPAAEatAACc+aZkAAAAAQPAAETJwABGrQAAAAICAsAAROwAAACKCl0DwABsXwJgA4OsYAOmtgDAAEUMAAAAjlBgA6c9AABcAT4DTsAARSrAAEU0AACDdGADgzIBFsAARV0WwABFUxbAAEVHgcAARTbAEpjJjgenQICQmryDdI3tTsAARXTAAEV7AACAvmADg6wBHMAARbAWwABFnRbAAEWOgcAARX3AEpjJjiqnRIEWpxSC5QMAAoLAAEXCwBKY3RbAAEXWFsAARc0ujdumgIGIp4QBguYWwABF7RbAAEXkLo3bpoCDf6eFgdlJwABF/SEcwABGCIPAAEYBwBKZEycBAAErAMAAbF4+AknAAEYZasAARh1gA8AAbFscPgE9HsAARjSpdwEAASTAAEZgAyeDn4PAAEZHwBKZEyec+gA/PRzAAEaaHMAARnEunPumZAIAAoDAAEaJwBKYsIPAAEaSwBKZEwCmrJz8AAAAAKa/PwamqmzAAEaywABGt8AAS7kAAJz3pmQAAAABA8AARtXAAEu5AAAAAwMDwABG6gAAAIVJYAOpOgDAAEccAAAAigpdA8AAbF8CYAODrGADprYAwABHPAAAAI5QYAOnPQAAXAE+A07AAEdiwABHZgABgSxgA6iZARbAAEdxgMAAR2jAEposgSypPE7AAEeCwABHiQAAgL5gA4OsARzAAEe1FsAAR6sWwABHnILAAEeLwBKaU44qp0SBFqcUguUDAAIWwABH1IPAAEfQwBKaZ4LTqJwWwABH6BbAAEffLo3bpoCBiKeEAYLmFsAASAcWwABH/i6N26aAg3+nhYHZScAASBchHMAASCKEwABIG8ASmosnAQABKwDAAGxePgJJwABIM2rAAEg3YAPAAGxbHD4BPR7AAEhOqXcBAAEkwABIiAQng5+EwABIYcASmosnnP2AwABIf8ASmiwAPz0cwABIwhzAAEiZLpz7pmQCAAKBwABIscASmjqEwABIusASmosApqyc/gEAAYDAAEjSwBKaLACmvT4BScAASPAcwABJFBbAAEkFgsAASPTAEppTjiqnRJz/AQABg8AASS7AEppnAKclPgJJwABJPmrAAElCYAPAAGxbHD4BPR7AAElbqXcBAAEkwABJnQInnQCAwABJlMASmiwAPz0cwABJ9RzAAEmyLpz7pmQCAAKBwABJysASmjoawABJ06aiAKasnP4BAAGAwABKBcASmiwApr1JwABKHSXAAEoqABbAAEohLo3bpoBgA6erPgJJwABKSGrAAEpMYAPAAGxbHD4BPR7AAEplqXcBAAEkwABKvgInnQGAwABKtcASmiwAPz0cwABLFhzAAErTLpz7pmQCAAKBwABK68ASmjoawABK9KaiAKasnP4BAAGAwABLJsASmiwApr0+AUnAAEtIasAAS0xgA8AAbFscPgE9HsAAS2WpdwEAASTAAEucAiedAoDAAEuTwBKaLAA/BqarbMAAS77AAEvDwABQWwAAnPimZAAAAAEDwABL3cAAUFsAAAACAgLAAEwAAAAAigpdA8AAbF8CYAODrGADprYAwABMIAAAAI5QYAOnPQAAXAE+CE7AAExBwABMSgAAjdtgA6d/ARbAAExRLo3bpoBJwABMXyXAAExsAILAAExjwBKdPWADp5k+AT2KwABNlcASnT0fwABNpKe2AgACFsAATb2CwABNtMASnT2cuKeBFsAATdCCwABNx8ASnT2BiKeEAD9OwABN6MAATfEAAYVJYAOoyAEWwABN+BbAAE3zLhKmgYVJp8BOwABOHsAATi8AAZ0DYAOm5gEcwABOWhbAAE5CgcAATjHAEp0pjiqnRJ0EAQABJsAATncAgsAATm7AEp09YAOnqwCnJj0cwABOooTAAE6RwBKd0ZybAQABLgCmaj0ewABOxal2AQABFsAATtWAwABOzcASnRCBVsAAbTsAPgJOwABPCgAAADxdA8AAbEoBYAODrAEWwABPCh4AwABsLwEBXQPAAGwgAWADg6wBFsAATwqEwABO+cASndGKCqbpAD3AAGxLRQAAARzAAE8KhQDAEp5PPgAAAADAAGxNAD4CTsAATu8AAACAvmADg6wBFsAATxOFAMASnk9AwABsTz4BPRzAAE9EHMAATxsunPumZAIAAoDAAE8zwBKdEIbAAE88wBKesACmrIwqAQABg8AAT0zAEp2tAKa+ScAAT9whFsAAT/KEwABP4cASndGdBabqPgE9HMAAUEAcwABQCi6c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ggDAEsj9CAGnFYMAwBLJCwgApxkcwACKTYHAAIpDwBLI74LlAgACFsAAioIWwACKeIPAAIpswBLJC4CQmryJS43vGsAAio+nGgCB2QkAwACKqqjCAQABFsAAiryDwACKsMASyQuAkJq8AA4GpxxswACK+cAAixLAAItXAACc9AFqwACK+mADwABsVoC1AAABA8AAixzAAItXAAAAAQEBwACLIwAAAIEYYAODMgAAYAOm7QE+AUrAAIssATXAAIszAAABAF0DwABsXwJgA4MyYAOm7QEWwACLMy6C96cXNcAAizsAAAEAYAODMgGAwACLO8ASyf81wACLOgAAAQBgA6btARzAAIs6gcAAizPAEsocKQEAAYLAAIs7wBLKPwDAAGxhIxzAAIs+g8AAizrAEspWJwEAASsAqKA1wACLQgAAAQBgA6btARzAAItCLp1KpmQBAAGAwACLUcASyf8Apx41wACLOgAAAQBcARzAAIs6gcAAizPAEsocgJwCAAKCwACLO8ASyj+EwACLQsASypsAwABsY4TAAItCwBLKm4PAAIs6wBLKVgFgA6btBqcebMAAi1zAAItpwACMWQAAnUqmZAAAAAEDwACLd8AAjFkAAAABAQHAAIt+AAAAgRhgA4MyAABgA6btAT4DTsAAi43AAIuYAAGDhV0DwABsVwFgA6btAR7AAIuewABsfAABYAOm7QAAPgJOwACLyQAAADxdA8AAbEoBYAOKQQEWwACLyR4AwABsLwEBXQPAAGwgAWADikEBFsAAi8mAwACLx8ASyzaDfINkAD3AAGxLRQAAARzAAIvJggDAEst5PgAAAADAAGxNAD4CTsAAi8AAAACdS2ADikEBFsAAi9GCAMASy3lAwABsTz4BPRzAAIvkgcAAi9nAEstNgTQBAAEWwACMBRzAAIvrLpz0AQABFsAAi/qDwACL9sASy9qC04pGAKccg4Wm7wDAAG0bSsAAjBwBH8AAjCem/wMAAxfAAIw2Lp1IpmQcwACMNBbAAIw2Lp1IpmSnEoE/AQABlADAAGyIpxKAwACMR8ASyzaBwACMSsASy00ABqchbMAAjF7AAIxrwACPIAAAnUwAAAABA8AAjHzAAI8gAAAAAQEBwACMgwAAAJ1NYAODMgAAYAOpOgE+BT0ewACMjal2AQABIRbAAIyZgMAAjJbAEsyugzSDUgA9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AKwbqXcBAAEkwACscwInnWmCwACsaMAS5RsAPR7AAKx+qXcCAAIkwACsuQQnnWWAwACsmsAS36cnnWaCwACsrsAS5RscwACsu5SBWgAAAADAAGyPAD9KwACszgGCwACs1cAS5RsAABLcjwAS3PgAEt3qABLevgAS34AAEuXlAAAABQKnPWzAAKzuwACs9MAAyeUDnWoAAAFgA8AAbFYAAmADutpgA6fLEQSnP2zAAK1CwACtSAmAvgBgA46VAASnQGzAAK1iwACtbQmOBwBgA5q6AASnQWzAAK2EwACtkAmLmwBgA5v6AASnQmzAAK2xwACtwgmdawBgA6nrAASnQ2zAAK3XwACt5xiOXABgA7ryASsEp0RswACuAMAArg4YjioAYAOnDQErBKdFbMAAriPAAK4zGJ0WAGADu2UBKwSnR2zAAK5JwACuWhicvaZkAGADpsoBKwSnUGzAAK5owACucBicngBgA6ctASsEp0hswACuisAArqAYnWymZABgA6ikAASnSWzAAK7AwACu4AmdbaZkAF0DwABsXwJgA4OsYAOodgEywACu3mADg6xgA6h2AASnSmzAAK8CwACvJwmdbqZkAF0DwABsXwJgA4PMYAOm1AEywACvJWADg8xgA6bUAASnS2zAAK89wACvXgmc2aZkAF0DwABsVwFgA4OsAR7AAK9RwABsfAABYAODrAAABKdMbMAAr3TAAK+rCZzvpmQAXQPAAGxXAWADg6wBHsAAr57AAGx8AAFgA4OsAAAEp01swACvwcAAr+4JnPKmZABdA8AAbFcBYAODrAEewACv4cAAbHwAAWADg6wAAASnTmzAALAEwACwMwmc8aZkAF0DwABsVwFgA4OsAR7AALAmwABsfAABYAODrAAABKdPbMAAsEnAALBrCZzwpmQAXQPAAGxXAWADg6wBHsAAsF7AAGx8AAFgA4OsAAABBadubMAAsHDAALBwwACz4gAAAAPAALCAwACz4gAAAAgHB8AAsI0AAASAvmADjpUAwACwpQAAAICNYAOLKgDAALDAAAAAgJBgA408AMAAsOsAAACBFmADga8AwACxAQAABJ1sYAOopADAALEkAAAEjgdgA5q6AMAAsTwAAASLm2ADm/oAAcAAsWgAAACOnWADqesBagBgAcAAbFwCYAOnPQE+Bj0XwACx2S6OXB/AALHwuwAC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AEw+wABMRwABmB5dA8AAbBkBYAPAAGwYAR7AAExVwABs/AEBYAPAAGwYARzAAExxFsAATGIuneCoeEQBAAEWwABMcy6d4ah5AMAAbOEARcAATJIBwABMm8AATJ0AAIHUYAPAAGwfAZMBHMAATKSCwABMosATUtCBOgEAARbAAEymLp3gqHgAwABshQGKwABMtsATUtAcwABMt4LAAEy2wBNS0IE/AQABlADAAGyIPgNOwABMzcAATNMAAIt4YAOn7AEmwABM5AAcwABM4BbAAEzVLp3ip8qofCkBAAGCwABM4cATUtAAwABsuGADp+w9HMAATQCAwABM+MATUkeAnAIAAoLAAE0BwBNS0BbAAE0Mg8AATQbAE1MtnaWn9QDAAGzLScAATSAcwABNJoLAAE0kwBNS0IPXAQABFsAATSkuneGoeQDAAG0UPgE9HMAATVWBwABNTcATUnuAnAIAAhzAAE1YgsAATVbAE1LQRAEAARbAAE1aLp3hqHkAwABs4RbAAE18g8AATXbAE1MtgYin7gDAAGzLP0rAAE2UAR/AAE2fp8gCAWADqMgBgMAATarAE1JHAYRpgcAATbvAE1J7BqiBb8AATc3AAE3rwABPHgEAjj8AAAABA8AATf/AAE8eAAAAAAAAAF0DwABsGQFgA4jnAT4DTsAATgvAAE4SAAGazV0DwABsGQFgA4jnAR7AAE4UwABsdgEBYAOI5wGTAD4CTsAATlEAAAA8XQPAAGxKAWADp9EBFsAATlEeAMAAbC8BAV0DwABsIAFgA6fRARbAAE5RLp3ip8qofAA9wABsS0UAAAEcwABOUYEAwBNUoj4AAAAAwABsTQA+Ak7AAE5EAAAAhRdgA6fRARbAAE5egQDAE1SiQMAAbE8+AUnAAE5mIiIlwABOdACCwABOasATVP1gA6hmABbAAE6YFMAATo7AE1T9AgFgA6hmjouobQAhHMAATscWwABOvRTAAE6zwBNU/QIBYAOoZoU4qG8nAQABKwDAAGxePgE9HMAATuGAwABO2sATVHU2AQABFsAATu8UwABO5cATVP0CAWADqGaFOKhvAMAAbEc/SsAATw0BgMAATxTAE1R1AAATRRAAE0VIABNFwwATRfgAE0a9ABNSEgATVD4AE1W7AAAABwAAAAFvABNV4wATF04AExgiABMaSgATHUUAEyCZABMi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wBN5woE0AQABHLBigbBbwBN5fZpYAgACg7BrwBN5sRawdoGwb8ATeX2A4MAAbGoAwABuIwDAAG0FP0qwigGEsJHAE3nCBqkfcbCfsLmz9AABnhqomAAAAAEDsMiz9AAAAAICArDjAAAAnhNdA8AAbBkBYAOpOgCw/gAAAJ4UXQPAAGwZAWADqToAAF0DwABsGQFgA6k6AT4FTrEQsRMAAINcYAPAAGwfAZNOsSCxIwAAg11gA8AAbB8Bk06xP7FFAACDy10DwABsGQFgA6k6ATGxVWADqToAQ7FdIhyxaIKxZcATfUaBOgEAARaxcYCxasATfRCA4MAAbGoAwABshQAcsYCDsX3AE31XgToBAAEWsYmBsYLAE30jgODAAGxqAMAAbIU+BU6xoLGjAAGeFWADqToBHLGrgLGlwBN9ECkBAAGCsazAE31GAMAAbLhOsb2xwAABnhZgA6k6ARyxyIGxwsATfSMpAQABg7HJwBN9VwDAAGy4TrHasd4AAZ4XYAPAAGwfARax5xax44Wx4MATfdSBLKk8m4aom06x97H7AAGeGGADwABsHwEWsgQWsgCGsf3AE338gSypPJuGqJtJsg4cshaHshLAE34kgToBAAEUshjAE35JCAAAwABshT4BPYqyKcATfUYcsieCsinAE31GgT8BAAGUAMAAbIhJsjocskKHsj7AE34kgTsBAAEUskTAE35JCAAAwABshj4BPYuyVcATfVccslODslXAE31XgT8BAAGUAMAAbIg+A0mycCIiIhyygBayd4WydMATfdSL96lAJwEAASsAwABsYgAcsqMWspqFspfAE33UheCpQScBAAErAIpVAByyxhayvYayusATffyL96lAJwEAASsAwABsYgAcsukWsuCGst3AE338heCpQScBAAErAIpVPgE9HLMEhLL+wBN9aDYBAAGFswjAE33UAMAAbEc+Ak6zLrM4AAGeG2ADqMgBHLM9hbM6wBN91IZvAgAChrNKwBN9/CsAqVBJs18hJbNtABSzY8ATf34JAGADqOo+AT0cs5CEs4rAE31oNgEAASazlAEUs5TAE39+CQBgA6k6AMAAbEc/PYqzwMATfUYcs76Cs8DAE31GgT8BAAGUAMAAbIg9i7POwBN9VxyzzIOzzsATfVeBPwEAAZQAwABsiEqz5AGEs+vAE31oBqkkcbP5tAq2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ABOItgATiOsAE4lDABOLlAATjiMAAAALAqk6ccAARY7AAEWUwABkYwOeHwAAAWADqMgAAV0DwABtHgFgA6k6BQSpPHHAAEXkwABF5wmBLABgA6iZAASpPnHAAEXvwABF+BiGXKiYAGADwABsHwErBKk/ccAASCjAAEg8CY4sAGADwABsHwAEqUBxwABIUcAASFkJi/cAXQPAAGwZAWADqMgABKlBccAASKHAAEipCYXgAGADilAAAQWpUnHAAEiuwABIrsAASlkAAAADwABIusAASlkAAAADAQPAAEjAAAAEgSxgA6iZAMAASNEAAACeIF0DwABsGQFgA6jIAWoAYAHAAGxcAsAASOEAAASF4GADilABagBgAcAAbFwCAGADqToBPgM9HsAASaGpdgEAASEWwABJuBbAAEmuFsAASaougSypPILTqJyDNINSAD0ewABJyal2AQABIhzAAEnaFsAASdEui/epQCcBAAErAMAAbGIBFsAASgIWwABJ8xbAAEnpFsAASeUugSypPILTqJyDY4NCIsAAbCIAPR7AAEoTqXYBAAEiHMAASiQWwABKGy6L96lAJwEAASsAwABsYgEcwABKOBbAAEovLov3qUCH/gEAATTAAEo8A8AASjzAAEpTAAAAAQEBwABKPQAAAItGYAOoyAAAYAPAAGxbAUrAAEpDASXAAEpFAIPAAEpDwBOQKWADqVMAwABtVQAFCAGpPIAAwBOPGggBqUGCAMATj0YIAKlAgcAASP/AE48oCACpPyMhHMAAST+BwABJNcATjygnAQABKwDAAGxiFsAASWYWwABJVxbAAElNgMAASUnAE48agtOonINjg0KA4MAAbGqTAWADwABsHwkBwABIrqjYAAAAAAwGqUNxwABKXsAASm/AAEqRAQCeGQAAAAEDwABKc8AASpEAAAAAAAAAYAOpOgFKwABKdgEfwABKeqlSAgACFsAASocugSypPCsABqlHccAASpbAAEqowABK5gAAjikBasAASpdgA8AAbFaAtQAAAQPAAEq4wABK5gAAAAEBAcAASscAAACdk2ADqLgAAGADgzIBSsAAStkBFsAASt0WwABK2S6BLKk8gtOonAapSHHAAErrwABK/MAAS2gAAILuAWrAAErsYAPAAGxWgLUAAAEDwABLB8AAS2gAAAACAgLAAEsWAAAAnZNgA6i4AMAASysAAACB0WADgzIAAGADwABsWwFKwABLOwEcwABLSYDAAEs7wBORt51SAgACFsAAS1cWwABLUy6BLKk8gtOonIHAAEtiwBORxQCovQapSXHAAEttwABLcsAAVCwAAJ3ZAAAAAQPAAEuIwABULAAAAAICAsAAS54AAACdk2ADqLgAwABLuQAAAIVOYAOpUwAAYAPAAGxbAT4ETsAAS9LAAEvWAAGNMWADiVUBFsAAS+SBwABL2MATkkiSn6iYqVZJwABL7yIlwABL9wCCwABL88ATkmFgA4lyASXAAEwNAILAAEwJwBOSYWADiYBKwABMGgEpP0nAAEwrJcAATDMAgsAATC/AE5JhYAOJqj4KScAATE0cwABMXxbAAExVFMAATFHAE5JhAgFgA4mqgtOJsCcBAAEWwABMehbAAExwgMAATGLAE5I6gJCorYkmjdYAwABsXj4BSsAATXwBKj9JwABNmSEcwABNrIDAAE2ewBOSOp1SAgACFsAATb8WwABNuy6BLKk8gtOonBbAAE3OFMAATcrAE5JhAgFgA4mqgtOJsACovT4BSsAATeQBKj9JwABOARbAAE4XFsAATgkUwABOBcATkmECAWADiaqDc4mugVbAAGzzSsAATiABKT9JwABOMxzAAE5FFsAATjsUwABON8ATkmECAWADiaqC04mwJwEAARbAAE5gFsAATlaAwABOSMATkjqAkKitiSiN2ADAAGxePgFJwABOeSIcwABOi4DAAE59wBOSOp1SAgACFsAATqoWwABOpi6BLKk8gtOonBbAAE7NFsAATsOAwABOtcATkjqAkKitiSeN1wCovQEcwABO9xbAAE7tFsAATukugSypPILTqJwnAQABFsAATxIWwABPCIDAAE76wBOSOoCQqK2JKI3YAMAAbF4+Ak7AAE8/wABPQwABniFgA6lTASbAAE8/ASMcwABPXBbAAE9TLov3qUAnAQABKwDAAGxiH8AAT2apaQIAAh/AAE9yiX8AAAAAKwAcwABPkRbAAE+JLov3qUApAQABkwDAAGy4AWADqMhgA6lTSsAAT6ABHMAAT6uDwABPp8ATlHid2QIAAoDAAE/RwBOSOhzAAE/0FsAAT+yBwABP4MATkkiL96lYKQEAAZMAwABsuACpZz4BSsAAUBUBHMAAUBwundkCAAKAwABQM8ATkjocwABQ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wABikcATpWA+AT2KwABircATpJQrP07AAGLmAAAAniVgA4pQAEnAAGL8HMAAYwkWwABjAC6F4KlBJwEAASsAilU+AT2LwABjHMATpvMWwABjMxTAAGMtwBOi3QABYAOpOoXgqUFJwABjSiIcwABjXRbAAGNUFMAAY07AE6LdAAFgA6k6heCpQScBAAErAIpVARzAAGNxFsAAY2guheCpQScBAAEWwABjehTAAGN0wBOi3QABYAOpOoXgqUEAilU+AT2LwABjjsATpvMWwABjny6F4KlBPgFKwABjwAFqwABjzWADqOqNZkrAAGPoAR/AAGPzqVIDAAMWwABkAC6BLKk8gsAAZAXAE6SUg8AAZBXAE6bzAD4BPTDAAGQ5JMAAZFcCJ5pRgMAAZFHAE6LdAAATkNkAE5EiABORgwATkhMAE5hvABOZEgATmwwAE51EABOd0QATn7AAE6AIABOiqQATqAsAAAAMAqlTccAAaPrAAGkAwAB9UAOeBQAAAWADqMgAAAMEqVZxwABpLMAAaTEJkp+omABgA4lVAASpV3HAAGlewABpcgmOLABgA8AAbB8ABKlYccAAaY7AAGmWCYv3AF0DwABsGQFgA6lTAAEFqWlxwABpm8AAaZvAAGuKAAAAA8AAaabAAGuKAAAAAgICwABpsAAAAIGXYAOJVQDAAGm7AAAEi/ddA8AAbBkBYAOpUwAAYAOpUwE+AUnAAGpNIiXAAGpXABbAAGpRLpKfqJipVmADiaoAHMAAaoAWwABqay6OLKlXgTsBAAGTAMAAbIY+Az0ewABqjal2AQABIRzAAGqeFsAAapUui/epWCcBAAErAMAAbGIAPR7AAGquqXYBAAEcwABqxhbAAGq/FsAAarYui/epWIDgwABsaoPXAQABFsAAaskujiypVwDAAG0UAD0ewABq5ql2AQABHMAAaysWwABrEibAAGr1ABbAAGrvLpKfqJipVmADiaqDc4mui1YBAAE0wABrMQPAAGsxwABrUAAAAAEBAcAAazIAAACLRmADiVUAAGADwABsWwFKwABrOAEcwABrOoLAAGs4wBOp2icBAAFqwABrQ2ADiXKFsQCJWQDAAG15AD4BPR7AAGtnqXYBAAEcwABreBbAAGtvLov3qVgnAQABKwDAAGxiAAQIAalYgQDAE6jcCACpVoDAAGnVwBOozggAqVcjJcAAagsAgMAAagbAE6jOYAOJqhbAAGo8FsAAai0WwABqIxTAAGoewBOozgABYAOJqoLTibCDY4NCgODAAGxqkwFgA8AAbB8JAcAAaZuo2AAAAAANBqlaccAAa4/AAGuXwABruwEAnfwAAAABA8AAa53AAGu7AAAAAAAAAGADwABsHwFKwABroAEWwABrtmrAAGuqYAOo2cAAVBWDKKjbBqlbccAAa8DAAGvNwABr6AEAndoAAAABA8AAa+DAAGvoAAAAAAAAAGADiVUBSsAAa+MBFsAAa+Mukp+omKlWBqlcccAAa+3AAGv6wABtfwEAji0AAAABA8AAbArAAG1/AAAAAAAAAGADiVUBPgFJwABsECIlwABsGgAWwABsFC6Sn6iYqVZgA4mqACEcwABsNxbAAGwuLov3qVgnAQABKwDAAGxiPgNOwABsTsAAbFQAAYm9YAODMgEWwABsbybAAGxdABbAAGxXLpKfqJipVmADiaqC04mwTsAAbIbAAGyUAAGDc10DwABsGQFgA4lVARzAAG0CHMAAbNccwABsqhbAAGyWLov3qViOKwEAARbAAGzEFsAAbLWAwABsr8ATq6eDY4NCgODAAGxqAMAAbZuCoQEBYAOJVQE0wABs2wPAAGzbwABs9QAAAAEBAcAAbNwAAACeJmADqVMAAGADiVUBSsAAbOMBFsAAbOaBwABs48ATrE2OLalcAMAAbOuAoAAAAADAAGxmSsAAbRIBH8AAbR2JvAMAA4DAAG0rwBOrp2rAAG0+YAOJR4TlgcAAbUbAE6vYAD4BSsAAbWkBFsAAbXAukp+omKlWBqldccAAbYTAAG2YwABu6AEAgdcBasAAbYVgA8AAbFaAtQAAAQPAAG2hwABu6AAAAAAAAABgA8AAbB8BPgNOwABtq8AAbbAAAIHYYAPAAGwfARzAAG3BFsAAbbgWwABtsi6Sn6iYqVaB18AAbSiB1gEAARzAAG3KN5I0gfoBAAFqwABtzGADwABsH8AAUycAwABs3gDAAGy5RcAAblEBwABuWsAAblwAAIHUYAPAAGwfAZMBHMAAbmOBwABuYcATrWmBOgEAARbAAG5lLo4sqVcAwABshQGJwABufcATrWkcwABue4HAAG59wBOtaYE/AQABlADAAGyIPgE9iMAAbojAE60JHMAAbsIcwABuqhzAAG6dHMAAbpeAwABuksATrQmB7wEAATcfAMAAbNOB+gEAAWrAAG6fYAPAAGwfwABTJwDAAGzegT8BAAEWwABuuBzAAG60FsAAbqwui/epWCkBAAGBwAButcATrWkAwABsuIHXqV0AwABsiIH6AQABasAAbsRgA8AAbB/AAFMnAMAAbN5KwABu2QGAwABu4MATrQkGqWBxwABu7cAAbwLAAHAtAwAnAWrAAG7uYAPAAGxWgLUAAAEDwABvBMAAcC0AAAABAQHAAG8FAAAAgdFbAABgA8AAbFsBPgNJwABvEh7AAG8WwABs9wIAAi6AwABvJsATrqAASsAAby4BKT9JwABvPyXAAG9JAIDAAG9DwBOuoGADqVM+A0nAAG9hIRzAAG9xFsAAb2sUwABvZcATrqAAAWADqVOSn6iYqVYnAQABFsAAb3Qukp+omKlWAIlZSsAAb3sBKj89HsAAb4+pdgEAARzAAG+sFsAAb5cujiypVycBAAEWwABvtRTAAG+vwBOuoAABYAOpU44sqVcAwABsMgBKwABv0gEiHMAAb+IWwABv2S6L96lYJwEAASsAwABsYgEewABv7YJCAgACFsAAb/gui/epWBbAAHAIFMAAcALAE66gAAFgA6lTi/epWAA/SsAAcB0BKgapYXHAAHAywABwRcAAcX0AAIFTAWrAAHAzYAPAAGxWgLUAAAEDwABwTcAAcX0AAAAAAAAAYAPAAGwYAT4ETsAAcFzAAHBhAAGTqmADwABsGAEjJcAAcGkAFsAAcGMukp+omKlWYAOJqiTAAHC0ARbAAHCgJsAAcI4AFsAAcIgukp+omKlWYAOJqoLTibAkwABwvgEWwABwuC6Sn6iYqVYBYAPAAGwYScAAcMQcwABw3RbAAHDILo4sqVcnAQABkwDAAGwySsAAcOMBgMAAcOrAE7AEP07AAHD6wABxBwABnidgA8AAbBgBHMAAcUYcwABxNRzAAHEaFsAAcREui/epWI4rAQABFsAAcR8ujiypVwDAAG2bgqEBAWADwABsGAE0wABxOQPAAHE5wABxRAAAAAEBAcAAcToAAACLRmADqVMAAGADwABsGAFKwABxQAEkwABxRAGBwABxQsATsPoAwABs64a8AQABJ4avAMAAbS9KwABxVgEkwABxeQUnniiAwABxZMATsAQngTqBwABxasATsJsnnikGqV5xwABxgsAA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AAAAAQPAAEeCwABHlAAAAAAAAABgA8AAbB8BSsAAR4UBFsAAR44WwABHhS6gAayOrV6A4MAAbP0GrWmAicAAR5nAAEegwABHwAAAgVMAAAABA8AAR6jAAEfAAAAAAAAAAGADwABsGAFKwABHrgEcwABHthzAAEeuLoNKAAAAAKyygVMAAAAAwABuLAataoCJwABHxcAAR8rAAEh8AAA2AAAAAQPAAEfNwABIfAAAAAEBAcAAR9AAACCBPl8DAQAAAGADwABsWwE+BE7AAEffwABH4wAAgTxfAwAAARzAAEflLqAErI4BAAGAwABH8sAVVHYArV9OwABIA8AASAoAAIGwYAPAAGxbASo9HMAASCAWwABIFy6gAayOrV6BbwIAAoHAAEgswBVUjzTAAEgxA8AASDHAAEhkAAAAAAAAAF8DAQABPgI9isAASDzAFVS6KUrAAEhRAYDAAEhYwBVUdgDAAGyXSsAASGsBgsAASHLAFVS6Bq1rgInAAEiBwABIhsAASLsAAIE0AAAAAQPAAEiMwABIuwAAAAEBAcAASJkAACCQ6F0DwABsIAFfAwEAAABcAUrAAEimARzAAEivgMAASKbAFVVggbEBAAEWwABIty42rWoAwABtAwatbICJwABIwMAASMXAAEjgAACN/wAAAAEDwABIysAASOAAAAAAAAAAXAFKwABI0AEcwABI2RbAAEjQLqABrI6tXo3/AAAAAMAAbZkGrW2AicAASOXAAEjqwABJJgAAn/gAAAABA8AASPXAAEkmAAAAAQEBwABJBwAAAIHRXQPAAGwgAWADwABsVgAAYAPAAGxbAUrAAEkRARzAAEkXgMAASRHAFVYTi1YBAAEWwABJHS4rrWgAwABteQatboCJwABKpsAASq3AAEsIAACf+QAAAAEDwABKt8AASwgAAAABAQHAAErEAAAAgdFdA8AAbFcBYAPAAGxWAABdA8AAbFcBXwMBAAFKwABK1AEcwABLARzAAErULoNLAQABNMAAStoDwABK2sAASv8AAAABAQHAAErbAAAAjvJfAwEAAABgA8AAbFsBSsAASucBIRzAAErugMAASujAFVaBKwEAAYHAAEr3wBVWzwDAAGx4AKyzg0oAAAAAwABtAQatb4CJwABMhsAATI3AAEzNAACGbwAAAAEDwABMmcAATM0AAAABAQHAAEymAAAAgdFdA8AAbFcBYAPAAGxWAABdA8AAbFcBXwMBAAFKwABMsAEcwABMxhzAAEywLoNLAQABFsAATLyAwABMtsAVV0ErwABseACss4NKAAAAAMAAbQEGrXCAicAATNLAAEzUwABNawAAk/cAAAABA8AATNrAAE1rAAAAAQEBwABM4gAAAI7yYAPAAGxWAABfAwEAAT4DScAATPEiIRzAAEz9gMAATPXAFVfDJwEAASsAwABsXgAhJcAATRAAgMAATQjAFVfDXwMBAErAAE0XASs/TsAATSzAAE0wAACBPF8DAAABHMAATTIuoASsjgEAASbAAE1HAIDAAE0/wBVXw18DAQAArV9KwABNUwEcwABNYhbAAE1aLqABrI6tXikBAAGBwABNY8AVWBgAwABsYQatcYCJwABNcMAATXXAAE5QAAA1AAAAAQPAAE17wABOUAAAAAEBAcAATYMAAACO8mADwABsVgAAYAPAAGxbAT4FScAATZIiIRzAAE2egMAATZbAFVicJwEAASsAwABsXgAhJcAATbEAgMAATanAFVicXwMBAErAAE24ASo/TsAATc7AAE3SAACBPF8DAAABHMAATdQuoASsjgEAASbAAE3pAIDAAE3hwBVYnF8DAQAArV9JwABN9SEcwABOAxbAAE36LqABrI6tXoGKAQABgcAATg/AFVjzAMAAbJ1KwABOFQEqPz0cwABOMBbAAE4nLqABrI6tXjUBAAGBwABON8AVWPMAwABsmErAAE5BASkGrXKAicAATlXAAE5awABOmgAAjaUAAAABA8AATmPAAE6aAAAAAQEBwABOdQAAAJDoXQPAAGwgAWADwABsVgAAXAFKwABOggEcwABOi4DAAE6CwBVZrIGxAQABFsAATpMuNa1xAMAAbQMGrXOAicAATp/AAE6kwABPXgAAjo0AAAABA8AATq/AAE9eAAAAAQEBwABOtQAAAJ75YQMBXwMBAGADwABsWwAAXAE+A07AAE7QwABO2QAAoAZdA8AAbBkBWwExwABO21sAPRzAAE7sFsAATuMuoAGsjq1egbEBAAE0wABO9APAAE70wABPMgAAAAICAsAATvUAAACBPF8DAAAAwABO+gAAAIE+XwMBAAAAYAHAAGxcAT4BScAATwkcwABPEYDAAE8NwBVaFYCVAQABg8AATxLAFVqHAAA9HMAATyOBwABP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AEdXBqCfAGADstsBasAARtBgA7LbwABb5wSuAYCSwABHxcAASNcGoKAAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAEf8XQOy5wFhAwFgA8AAbBhgA7LPwABcDwSuAoCSwABJQcAASh4GoKIAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAEl0XQOyxAFhAwFgA8AAbBhgA7LPwABcMwSuA4CSwABMCMAATGQGoKQAXQOyxAFgAcAAbFwBasAATDhgA7LbwABccQSuBICSwABMssAATa8GoKgAYAOy2wFqwABM62ADstvAAFxxBK4FgJLAAE38wABOMAagqQBdA7LEAWABwABsXAFqwABOFmADstvAAFyqBK4GgJLAAE5+wABPIgagrQBgA7LbAWrAAE6hYAOy28AAXKoErgeAksAAT5LAAFCcBpB8AF0DsucBYQMBYAPAAGwYYAOyzwFqwABPwV0DsucBYQMBYAPAAGwYYAOyz5GzBK4IgJLAAFEEwABRnQagrgBdA7LEAWEDAWADwABsGGADss8BasAAUS9dA7LEAWEDAWADwABsGGADss/AAFzRBK4JgJLAAFNKwABTpAagsABdA7LEAWABwABsXAFqwABTeWADstvAAFz9BK4KgJLAAFPywABUwwagswBgA7LbAWrAAFQmYAOy28AAXP0ErguAksAAVRDAAFVqBqC0AF0DssQBYAHAAGxcAWrAAFU/YAOy28AAXScErgyAksAAVbjAAFb3BqC4AGADstsBasAAVexgA7LbwABdJwSuDYCSwABXRMAAV5QGoLkAXQOyxAFgAcAAbFwBasAAV25gA7LbkdkErg6AksAAV+LAAFjuBpB4AGADstsBasAAWBFgA7LbkdkErg+AksAAWTvAAFmLBqC6AF0DssQBYAHAAGxcAWrAAFllYAOy25ICBK4QgJLAAFnZwABa3AaQeQBgA7LbAWrAAFoIYAOy25ICBK4RgJLAAFtKwABc2AaguwBdA7LnAWEDAWADwABsGGADss8BasAAW4xdA7LnAWEDAWADwABsGGADss/AAF1UBK4SgJLAAF1CwABeWAagvgBdA7LEAWEDAWADwABsGGADss8BasAAXYBdA7LEAWEDAWADwABsGGADss/AAF17BK4TgJLAAGDlwABiLQagwABdA7LnAWEDAWADwABsGGADss8BasAAYRNdA7LnAWEDAWADwABsGGADss/AAF2tBK4UgJLAAGKVwABjfQagwwBdA7LEAWEDAWADwABsGGADss8BasAAYsNdA7LEAWEDAWADwABsGGADss/AAF3jBK4VgJLAAGWZwABnCAagxgBdA7LnAWEDAWADwABsGGADss8BasAAZdVdA7LnAWEDAWADwABsGGADss/AAF4UBK4WgJLAAGdywABodgagyABdA7LEAWEDAWADwABsGGADss8BasAAZ6pdA7LEAWEDAWADwABsGGADss/AAF47BK4XgJLAAGrbwABrpwaQfQBdA7LnAWEDAmADwABsWGADwABsGGADss8BasAAavxdA7LnAWEDAmADwABsWGADwABsGGADss+SJgSuGICSwABsGcAAbMsGoMoAXQOyxAFhAwJgA8AAbFhgA8AAbBhgA7LPAWrAAGw2XQOyxAFhAwJgA8AAbFhgA8AAbBhgA7LPwABedgSuGYCSwABuoMAAb60GoM0AXQOy5wFhAwFgA75NYAOyzwFqwABu2V0DsucBYQMBYAO+TWADss/AAF6rBK4agJLAAHAXwABxEgagzwBdA7LEAWEDAWADvk1gA7LPAWrAAHBMXQOyxAFhAwFgA75NYAOyz8AAXtwErhuAksAAcuvAAHSwBqDSAF0DsucBYQMBYAO+TWADss8BasAAcxtdA7LnAWEDAWADvk1gA7LPwABfDgSuHICSwAB1FsAAdfYGoNUAXQOyxAFhAwFgA75NYAOyzwFqwAB1Rl0DssQBYQMBYAO+TWADss/AAF9CBK4dgJLAAHhSwAB4lgag2ABdA7LEAWABwABsXAFqwAB4dmADstvAAF+ABK4egJLAAHjkwAB5vgag3ABgA7LbAWrAAHkNYAOy28AAX4AErh+AksAAegvAAHpRBqDdAF0DssQBYAHAAGxcAWrAAHowYAOy28AAX60EriCAksAAep/AAHuxBqDhAGADstsBasAAeslgA7LbwABfrQSuIYCSwAB7/sAAfCIGoOIAXQOyxAFgAcAAbFwBasAAfBBgA7LbwABf3QSuIoCSwAB8cMAAfYgGoOYAYAOy2wFqwAB8i2ADstvAAF/dBK4jgJLAAH3VwAB+Gwag5wBdA7LEAWABwABsXAFqwAB9+mADstvAAGAEBK4kgJLAAH5pwAB/pAag6QBgA7LbAWrAAH6TYAOy28AAYAQEriWAksAAf/HAAIAXBqDqAF0DssQBYAHAAGxcAWrAAIAEYAOy28AAYDMEriaAksAAgGXAAIEoBqDuAGADstsBasAAgIFgA7LbwABgMwSuJ4CSwACBdcAAgaMGoO8AXQOyxAFgAcAAbFwBasAAgYxgA7LbwABgYASuKICSwACB8cAAgsQGoPMAYAOy2wFqwACCEWADstvAAGBgBK4pgJLAAINewACEzwag9ABdA7LnAWEDAmADwABsGGADwABsGGADss8BasAAg4xdA7LnAWEDAmADwABsGGADwABsGGADss/AAGCNBK4qgJLAAIVHwACGNAag9wBdA7LEAWEDAmADwABsGGADwABsGGADss8BasAAhXVdA7LEAWEDAmADwABsGGADwABsGGADss/AAGDJBK4rgJLAAIlCwACKgAag+gBdA7LnAWEDAmADwABsGGADwABsGGADss8BasAAiWddA7LnAWEDAmADwABsGGADwABsGGADss/AAGEDBK4sgJLAAIr8wACLqAag/QBdA7LEAWEDAmADwABsGGADwABsGGADss8BasAAiyFdA7LEAWEDAmADwABsGGADwABsGGADss/AAGEwBK4tgJLAAI3/wACO2Aag/wBdA7LnAWEDAWADwABsGGADss8BasAAjixdA7LnAWEDAWADwABsGGADss/AAGFkBK4ugJLAAI8+wACQEAahAQBdA7LEAWEDAWADwABsGGADss8BasAAj2ddA7LEAWEDAWADwABsGGADss/AAGGXBK4vgJLAAJHgwACSrQahBABdA7LnAWEDAWADwABsGGADss8BasAAkgldA7LnAWEDAWADwABsGGADss/AAGHIBK4wgJLAAJMTwACTmAahBgBdA7LEAWEDAWADwABsGGADss8BasAAkzhdA7LEAWEDAWADwABsGGADss/AAGHsBK4xgJLAAJVcwACWJgahCABdA7LnAWEDAWADwABsGGADss8BasAAlYRdA7LnAWEDAWADwABsGGADss/AAGIaBK4ygJLAAJaMwACXSgahCgBdA7LEAWEDAWADwABsGGADss8BasAAlrBdA7LEAWEDAWADwABsGGADss/AAGJNBK4zgJLAAJkLwACZ1QahDQBdA7LnAWEDAWADwABsGGADss8BasAAmTNdA7LnAWEDAWADwABsGGADss/AAGJ+BK40gJLAAJo7wACa+QahDwBdA7LEAWEDAWADwABsGGADss8BasAAml9dA7LEAWEDAWADwABsGGADss/AAGKiBK41gJLAAJy+wACdmwahEQBdA7LnAWEDAWADwABsGGADss8BasAAnOxdA7LnAWEDAWADwABsGGADss/AAGLTBK42gJLAAJ4BwACe4AahEwBdA7LEAWEDAWADwABsGGADss8BasAAnitdA7LEAWEDAWADwABsGGADss/AAGMGBK43gJLAAKCXwACg5QahFgBdA7LEAWABwABsXAFqwACgwGADstvAAGM3BK44gJLAAKEzwACh4wahGQBgA7LbAWrAAKFhYAOy28AAYzcErjmAksAAojDAAKJYBqEaAF0DssQBYAHAAGxcAWrAAKJEYAOy28AAY2IErjqAksAAoqbAAKOCBqEeAGADstsBasAAosNgA7LbwABjYgSuO4CSwACjz8AAo/EGoR8AXQOyxAFgAcAAbFwBasAAo+BgA7LbwABjjwSuPICSwACkP8AApX4GoSMAYAOy2wFqwACkWWADstvAAGOPBK49gJLAAKXLwACmIwahJABdA7LEAWABwABsXAFqwACl+WADstvAAGO5BK4+gJLAAKZxwACnQgahJwBgA7LbAWrAAKaoYAOy28AAY7kErj+AksAAp4/AAKfnBqEoAF0DssQBYAHAAGxcAWrAAKe9YAOy28AAY+EErkCAksAAqDXAAKjuBqErAGADstsBasAAqGxgA7LbwABj4QSuQYCSwACpO8AAqZcGoSwAXQOyxAFgAcAAbFwBasAAqWtgA7LbwABkCASuQoCSwACp5cAAqtMGoS8AYAOy2wFqwACqHmADstvAAGQIBK5DgJLAAKsgwACrbAahMABdA7LEAWABwABsXAFqwACrSGADstvAAGQ/BK5EgJLAAKu6wACsrwahNABgA7LbAWrAAKvnYAOy28AAZD8ErkWAksAArPzAAK1SBqE1AF0DssQBYAHAAGxcAWrAAK0pYAOy28AAZGkErkaAksAAraDAAK5sBqE4AGADstsBasAArdJgA7LbwABkaQSuR4CSwACuucAArxUGoTkAXQOyxAFgAcAAbFwBasAArulgA7LbwABkkQSuSICSwACvY8AAsDMGoTwAYAOy2wFqwACvnGADstvAAGSRBK5JgJLAALCAwACwvgahPQBdA7LEAWABwABsXAFqwACwn2ADstvAAGTKBK5KgJLAALEMwACyHgahQgBgA7LbAWrAALE0YAOy28AAZMoErkuAksAAsmvAALK/BqFDAF0DssQBYAHAAGxcAWrAALKXYAOy28AAZQYErkyAksAAsw3AALQbBqFHAGADstsBasAAsz5gA7LbwABlBgSuTYCSwAC0aMAAtJ4GoUgAXQOyxAFgAcAAbFwBasAAtINgA7LbwABlMASuToCSwAC07MAAtbQGoUsAYAOy2wFqwAC1EGADstvAAGUwBK5PgJLAALYBwAC2LwahTABdA7LEAWABwABsXAFqwAC2GGADstvAAGVaBK5QgJLAALZ9wAC24gahTwBgA7LbAWrAALahYAOy28AAZVoErlGAksAAt2bAALkbBqFQAF0DsucBYQMBYAPAAGwYYAOyzwFqwAC3j10DsucBYQMBYAPAAGwYYAOyz8AAZYEErlKAksAAuYHAALp1BqFSAF0DssQBYQMBYAPAAGwYYAOyzwFqwAC5ql0DssQBYQMBYAPAAGwYYAOyz8AAZbcErlOAksAAvPrAAL0sBqFVAF0DssQBYAHAAGxcAWrAAL0TYAOy28AAZegErlSAksAAvXrAAL5TBqFYAGADstsBasAAvZxgA7LbwABl6ASuVYCSwAC+oMAAvt4GoVkAXQOyxAFgAcAAbFwBasAAvr9gA7LbwABmEgSuVoCSwAC/LMAAv+gGoVwAYAOy2wFqwAC/VGADstvAAGYSBK5XgJLAAMBYwADBUQahXQBdA7LnAWEDAWADwABsGGADss8BasAAwJBdA7LnAWEDAWADwABsGGADss/AAGY6BK5YgJLAAMG9wADCuwahXwBdA7LEAWEDAWADwABsGGADss8BasAAwfFdA7LEAWEDAWADwABsGGADss/AAGZeBK5ZgJLAAMSgwADFrQahYQBdA7LnAWEDAWADwABsGGADss8BasAAxNFdA7LnAWEDAWADwABsGGADss/AAGaNBK5agJLAAMYTwADHFAahYwBdA7LEAWEDAWADwABsGGADss8BasAAxkRdA7LEAWEDAWADwABsGGADss/AAGbABK5bgJLAAMlpwADKnAahZgBdA7LnAWEDA2ADwABsGGADwABsGGADwABsGGADss8BasAAyZBdA7LnAWEDA2ADwABsGGADwABsGGADwABsGGADss/AAGbxBK5cgJLAAMsowADL1QahaABdA7LEAWEDA2ADwABsGGADwABsGGADwABsGGADss8BasAAy09dA7LEAWEDA2ADwABsGGADwABsGGADwABsGGADss/AAGchBK5dgJLAAM6SwADPrQahagBdA7LnAWEDAWADwABsGGADss8BasAAzsJdA7LnAWEDAWADwABsGGADss/AAGdbBK5egJLAANAZwADREQahbABdA7LEAWEDAWADwABsGGADss8BasAA0EldA7LEAWEDAWADwABsGGADss/AAGeOBK5fgJLAANLmwADTMgahbwBdA7LEAWABwABsXAFqwADTDmADstvAAGfOBK5ggJLAANOAwADUhAahcwBgA7LbAWrAANOtYAOy28AAZ84ErmGAksAA1NHAANUNBqF0AF0DssQBYAHAAGxcAWrAANTvYAOy28AAaAcErmKAksAA1VvAANYvBqF4AGADstsBasAA1YJgA7LbwABoBwSuY4CSwADWfMAA1q4GoXkAXQOyxAFgAcAAbFwBasAA1pVgA7LbwABoMQSuZICSwADW/MAA17wGoXwAYAOy2wFqwADXHmADstvAAGgxBK5lgJLAANgJwADYQwahfQBdA7LEAWABwABsXAFqwADYJmADstvAAGhZBK5mgJLAANiRwADZEQahgABgA7LbAWrAANi3YAOy28AAaFkErmeAksAA2V7AANmUBqGBAF0DssQBYAHAAGxcAWrAANl5YAOy28AAaIAErmiAksAA2eLAANprBqGEAGADstsBasAA2gZgA7LbwABogASuaYCSwADbCcAA3CUGoYUAXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPAWrAANsuXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwABopwSuaoCSwADcocAA3XYGoYcAXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPAWrAANzGXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPwABo4ASua4CSwADflcAA37sGoYoAXQOyxAFgAcAAbFwBasAA36hgA7LbwABpGgSubICSwADgCcAA4ScGoY4AYAOy2wFqwADgJWADstvAAGkaBK5tgJLAAOF0wADhyAahjwBdA7LEAWABwABsXAFqwADhoGADstvAAGlWBK5ugJLAAOIWwADjlQahlABgA7LbAWrAAOJHYAOy28AAaVYErm+AksAA5BnAAOVjBqGVAF0DsucBYQMBYAPAAGwYYAOyzwFqwADkRl0DsucBYQMBYAPAAGwYYAOyz8AAaYYErnCAksAA5cnAAOaiBqGYAF0DssQBYQMBYAPAAGwYYAOyzwFqwADl9l0DssQBYQMBYAPAAGwYYAOyz8AAabwErnGAksAA6LrAAOjsBqGbAF0DssQBYAHAAGxcAWrAAOjTYAOy28AAaf8ErnKAksAA6TrAAOpYBqGgAGADstsBasAA6VxgA7LbwABp/wSuc4CSwADqpcAA6skGoaEAXQOyxAFgAcAAbFwBasAA6rdgA7LbwABqLwSudICSwADrF8AA6+kGoaUAYAOy2wFqwADrMmADstvAAGovBK51gJLAAOw2wADsZgahpgBdA7LEAWABwABsXAFqwADsTmADstvAAGprBK52gJLAAOy0wADt5AahqwBgA7LbAWrAAOzVYAOy28AAamsErneAksAA7k7AAO8cBqGsAF0DsucBYQMBYAPAAGwYYAOyzwFqwADudl0DsucBYQMBYAPAAGwYYAOyz8AAapgErniAksAA74LAAPBABqGuAF0DssQBYQMBYAPAAGwYYAOyzwFqwADvpl0DssQBYQMBYAPAAGwYYAOyz8AAassErnmAksAA8ejAAPIaBqGxAF0DssQBYAHAAGxcAWrAAPIBYAOy28AAawsErnqAksAA8mjAAPM+BqG1AGADstsBasAA8opgA7LbwABrCwSue4CSwADzi8AA888GobYAXQOyxAFgAcAAbFwBasAA869gA7LbwABrOASufICSwAD0HcAA9O0GoboAYAOy2wFqwAD0RmADstvAAGs4BK59gJLAAPU6wAD1hAahuwBdA7LEAWABwABsXAFqwAD1YWADstvAAGt0BK5+gJLAAPXSwAD3JgahwABgA7LbAWrAAPX+YAOy28AAa3QErn+AksAA93PAAPe/BqHBAF0DssQBYAHAAGxcAWrAAPebYAOy28AAa6QEroCAksAA+A3AAPjrBqHFAGADstsBasAA+DpgA7LbwABrpASugYCSwAD5OMAA+XYGocYAXQOyxAFgAcAAbFwBasAA+VdgA7LbwABr3QSugoCSwAD5xMAA+rQGocoAYAOy2wFqwAD57GADstvAAGvdBK6DgJLAAPsiwAD8EQahywBdA7LnAWEDAWADwABsGGADss8BasAA+1ZdA7LnAWEDAWADwABsGGADss/AAGwHBK6EgJLAAPx3wAD9QgahzQBdA7LEAWEDAWADwABsGGADss8BasAA/KddA7LEAWEDAWADwABsGGADss/AAGwrBK6FgJLAAP8LwAD/RQahzwBdA7LEAWABwABsXAFqwAD/KGADstvAAGxpBK6GgJLAAP+TwAEATAah0wBgA7LbAWrAAP+5YAOy28AAbGkEroeAksABAJnAAQDRBqHUAF0DssQBYAHAAGxcAWrAAQC1YAOy28AAbJYEroiAksABAR/AAQIYBqHYAGADstsBasABAURgA7LbwABslgSuiYCSwAEChsABA4QGodkAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAQK4XQOy5wFhAwFgA8AAbBhgA7LPwABswASuioCSwAED6sABBMUGodsAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAQQYXQOyxAFhAwFgA8AAbBhgA7LPwABs5ASui4CSwAEGkcABBtcGod0AXQOyxAFgAcAAbFwBasABBrZgA7LbwABtGASujICSwAEHJcABCGIGoeEAYAOy2wFqwAEHT2ADstvAAG0YBK6NgJLAAQjiwAEJuwah4gBdA7LnAWEDAmADwABsGGADwABsGGADss8BasABCQddA7LnAWEDAmADwABsGGADwABsGGADss/AAG1CBK6OgJLAAQo3wAEKwgah5ABdA7LEAWEDAmADwABsGGADwABsGGADss8BasABClhdA7LEAWEDAmADwABsGGADwABsGGADss/AAG1sBK6PgJLAAQybwAEMzQah5gBdA7LEAWABwABsXAFqwAEMtGADstvAAG2jBK6QgJLAAQ0bwAEOGAah6gBgA7LbAWrAAQ09YAOy28AAbaMErpGAksABDmXAAQ6RBqHrAF0DssQBYAHAAGxcAWrAAQ57YAOy28AAbdAErpKAksABDt/AAQ/BBqHvAGADstsBasABDv5gA7LbwABt0ASuk4CSwAEQXMABEb0GofAAXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPAWrAARCBXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwABt/QSulICSwAESNsABExYGofMAXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPAWrAARJbXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPwABuOQSulYCSwAEVssABFoEGofYAXQOy5wFhAwFgA8AAbBhgA7LPAWrAARXbXQOy5wFhAwFgA8AAbBhgA7LPwABucASuloCSwAEW58ABF7IGofgAXQOyxAFhAwFgA8AAbBhgA7LPAWrAARcMXQOyxAFhAwFgA8AAbBhgA7LPwABuowSul4CSwAEZfMABGm8GofsAXQOy5wFhAwFgA8AAbBhgA7LPAWrAARm1XQOy5wFhAwFgA8AAbBhgA7LPwABu1ASumICSwAEa2cABG9cGof0AXQOyxAFhAwFgA8AAbBhgA7LPAWrAARsOXQOyxAFhAwFgA8AAbBhgA7LPwABvBwSumYCSwAEdwcABHo8GogAAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAR3jXQOy5wFhAwFgA8AAbBhgA7LPwABvOASumoCSwAEe9cABH64GogIAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAR8TXQOyxAFhAwFgA8AAbBhgA7LPwABvawSum4CSwAEhhsABIkAGkH4AXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPAWrAASGlXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPkK0ErpyAksABIrXAASNRBqIFAF0DssQBYQMCYAPAAGwYYAPAAGwYYAOyzwFqwAEi0F0DssQBYQMCYAPAAGwYYAPAAGwYYAOyz8AAb5kErp2AksABJSfAASWNBqIHAF0DssQBYAHAAGxcAWrAASVcYAOy28AAb9sErp6AksABJdvAAScBBqILAGADstsBasABJhlgA7LbwABv2wSun4CSwAEnTsABJ74GogwAXQOyxAFgAcAAbFwBasABJ4hgA7LbwABwBQSuoICSwAEoDMABKOgGog8AYAOy2wFqwAEoT2ADstvAAHAFBK6hgJLAASk1wAEpfQaiEABdA7LEAWABwABsXAFqwAEpW2ADstvAAHAwBK6igJLAASnLwAEqkgaiFABgA7LbAWrAASn2YAOy28AAcDAErqOAksABKt/AASsrBqIVAF0DssQBYAHAAGxcAWrAASsHYAOy28AAcFoErqSAksABK3nAASxgBqIYAGADstsBasABK6ZgA7LbwABwWgSupYCSwAEszsABLlsGohkAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAS0OXQOy5wFhAwFgA8AAbBhgA7LPwABwiASupoCSwAEuxcABL/oGohwAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAS8BXQOyxAFhAwFgA8AAbBhgA7LPwABwvgSup4CSwAEySMABMnwGoh8AXQOyxAFgAcAAbFwBasABMmJgA7LbwABw8gSuqICSwAEyysABM9IGoiMAYAOy2wFqwAEy7WADstvAAHDyBK6pgJLAATRWwAE1kgaiJABdA7LnAWEDAWADwABsGGADss8BasABNH5dA7LnAWEDAWADwABsGGADss/AAHEfBK6qgJLAATX4wAE2hgaiJwBdA7LEAWEDAWADwABsGGADss8BasABNiBdA7LEAWEDAWADwABsGGADss/AAHFGBK6rgJLAATjTwAE53waiKQBdA7LnAWEDAWADwABsGGADss8BasABOPxdA7LnAWEDAWADwABsGGADss/AAHF0BK6sgJLAATpFwAE7EwaiKwBdA7LEAWEDAWADwABsGGADss8BasABOm5dA7LEAWEDAWADwABsGGADss/AAHGnBK6tgJLAAT0fwAE99AaiLgBdA7LnAWEDAWADwABsGGADss8BasABPVFdA7LnAWEDAWADwABsGGADss/AAHHYBK6ugJLAAT5awAE/IAaiMABdA7LEAWEDAWADwABsGGADss8BasABPohdA7LEAWEDAWADwABsGGADss/AAHH8BK6vgJLAAUErwAFCmAaiMgBdA7LnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8BasABQU5dA7LnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss/AAHIrBK6wgJLAAUM2wAFD4QaiNABdA7LEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8BasABQ1VdA7LEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss/AAHJnBK6xgJLAAUfjwAFJOgaiNgBdA7LnAWEDAWADwABsGGADss8BasABSA5dA7LnAWEDAWADwABsGGADss/AAHKtBK6ygJLAAUmgwAFKgwaiOABdA7LEAWEDAWADwABsGGADss8BasABSctdA7LEAWEDAWADwABsGGADss/AAHLUBK6zgJLAAUyywAFM9gaiOgBdA7LEAWABwABsXAFqwAFM1mADstvAAHMIBK60gJLAAU1EwAFOMQaiPgBgA7LbAWrAAU1tYAOy28AAcwgErrWAksABTn7AAU6uBqI/AF0DssQBYAHAAGxcAWrAAU6WYAOy28AAczUErraAksABTvzAAU/eBqJDAGADstsBasABTx1gA7LbwABzNQSut4CSwAFQTMABUaMGokQAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAVCAXQOy5wFhAwFgA8AAbBhgA7LPwABzYgSuuICSwAFSCcABUsMGokcAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAVI5XQOyxAFhAwFgA8AAbBhgA7LPwABziQSuuYCSwAFU58ABVRMGokkAXQOyxAFgAcAAbFwBasABVP1gA7LbwABzugSuuoCSwAFVYcABVjAGok0AYAOy2wFqwAFVgGADstvAAHO6BK67gJLAAVaawAFXdAaiTgBdA7LnAWEDAWADwABsGGADss8BasABVsRdA7LnAWEDAWADwABsGGADss/AAHPkBK68gJLAAVfawAFYnQaiUABdA7LEAWEDAWADwABsGGADss8BasABWABdA7LEAWEDAWADwABsGGADss/AAHQXBK69gJLAAVpywAFbTAaiUwBdA7LnAWEDAWADwABsGGADss8BasABWqFdA7LnAWEDAWADwABsGGADss/AAHRIBK6+gJLAAVuywAFcbwaiVQBdA7LEAWEDAWADwABsGGADss8BasABW91dA7LEAWEDAWADwABsGGADss/AAHRsBK6/gJLAAV5awAFfaQaiVwBdA7LnAWEDAWADwABsGGADss8BasABXo5dA7LnAWEDAWADwABsGGADss/AAHSbBK7AgJLAAV/TwAFgswaiWQBdA7LEAWEDAWADwABsGGADss8BasABYAddA7LEAWEDAWADwABsGGADss/AAHS/BK7BgJLAAWK+wAFjuAaiWwBdA7LnAWEDAWADwABsGGADss8BasABYutdA7LnAWEDAWADwABsGGADss/AAHTuBK7CgJLAAWQewAFkrwaiXQBdA7LEAWEDAWADwABsGGADss8BasABZEddA7LEAWEDAWADwABsGGADss/AAHUSBK7DgJLAAWatwAFnpQaiXwBdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABZtJdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHVABK7EgJLAAWgkwAFo6QaiYQBdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABaEVdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHV/BK7FgJLAAWtPwAFsUwaiZABdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABa3pdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHW5BK7GgJLAAWzSwAFtcgaiZQBdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABbPldA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHXpBK7HgJLAAW/kwAFw3AaiZwBdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABcAldA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHYjBK7IgJLAAXFbwAFyDwaiaQBdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABcXxdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHZTBK7JgJLAAXR1wAF1eQaiawBdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABdKBdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHaLBK7KgJLAAXX4wAF2zwaibABdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasABdh9dA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHbKBK7LgJLAAXkowAF6HwaibwBdA7LnAWEDAWADwABsGGADss8BasABeVRdA7LnAWEDAWADwABsGGADss/AAHcHBK7MgJLAAXqFwAF7WQaicQBdA7LEAWEDAWADwABsGGADss8BasABeq1dA7LEAWEDAWADwABsGGADss/AAHc6BK7NgJLAAX0/wAF+HwaidABdA7LnAWEDAWADwABsGGADss8BasABfXJdA7LnAWEDAWADwABsGGADss/AAHdrBK7OgJLAAX6FwAF/TQaidgBdA7LEAWEDAWADwABsGGADss8BasABfrRdA7LEAWEDAWADwABsGGADss/AAHePBK7PgJLAAYEkwAGCGwaieABdA7LnAWEDAWADwABsGGADss8BasABgVBdA7LnAWEDAWADwABsGGADss/AAHe+BK7QgJLAAYKBwAGDeQaiegBdA7LEAWEDAWADwABsGGADss8BasABgqldA7LEAWEDAWADwABsGGADss/AAHfxBK7RgJLAAYVfwAGGPwaifQBdA7LnAWEDAWADwABsGGADss8BasABhZJdA7LnAWEDAWADwABsGGADss/AAHgjBK7SgJLAAYalwAGHbQaifwBdA7LEAWEDAWADwABsGGADss8BasABhtRdA7LEAWEDAWADwABsGGADss/AAHhHBK7TgJLAAYlEwAGKeQaigQBdA7LnAWEDAWADvk1gA7LPAWrAAYlrXQOy5wFhAwFgA75NYAOyz8AAeHkErtSAksABit/AAYtzBqKEAF0DssQBYQMBYAO+TWADss8BasABiwJdA7LEAWEDAWADvk1gA7LPwAB4ngSu1YCSwAGNacABjmwGooYAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAY2WXQOy5wFhAwFgA8AAbBhgA7LPwAB4ygSu1oCSwAGO0sABj7MGoogAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAY7/XQOyxAFhAwFgA8AAbBhgA7LPwAB4/QSu14CSwAGRtsABkpYGoosAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAZHsXQOy5wFhAwFgA8AAbBhgA7LPwAB5LgSu2ICSwAGTAMABk9oGoo0AXQOyxAFhAwFgA8AAbBhgA7LPAWrAAZMyXQOyxAFhAwFgA8AAbBhgA7LPwAB5UgSu2YCSwAGVq8ABloEGoo8AXQOy5wFhAwFgA8AAbBhgA7LPAWrAAZXXXQOy5wFhAwFgA8AAbBhgA7LPwAB5gQSu2oCSwAGW58ABl7QGopEAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAZcPXQOyxAFhAwFgA8AAbBhgA7LPwAB5tASu24CSwAGZgcABmlcGopQAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAZmtXQOy5wFhAwFgA8AAbBhgA7LPwAB55QSu3ICSwAGavcABm4YGopYAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAZrlXQOyxAFhAwFgA8AAbBhgA7LPwAB6CQSu3YCSwAGdV8ABnjMGopgAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAZ2IXQOy5wFhAwFgA8AAbBhgA7LPwAB6OgSu3oCSwAGemcABn1wGopoAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAZ7GXQOyxAFhAwFgA8AAbBhgA7LPwAB6XgSu34CSwAGhEsABoU4GopwAXQOyxAFgAcAAbFwBasABoTBgA7LbwAB6nwSu4ICSwAGhnMABopgGoqEAYAOy2wFqwAGhw2ADstvAAHqfBK7hgJLAAaLlwAGjKwaiogBdA7LEAWABwABsXAFqwAGjCmADstvAAHrPBK7igJLAAaN5wAGkggaipgBgA7LbAWrAAaOjYAOy28AAes8EruOAksABpM/AAaTtBqKnAF0DssQBYAHAAGxcAWrAAaTeYAOy28AAevwEruSAksABpTvAAaWgBqKpAGADstsBasABpVNgA7LbwAB6/ASu5YCSwAGmJMABpzQGoqoAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAaZUXQOy5wFhAwFgA8AAbBhgA7LPwAB7IwSu5oCSwAGnmsABqIIGoqwAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAafKXQOyxAFhAwFgA8AAbBhgA7LPwAB7VgSu54CSwAGqccABqqcGoq8AXQOyxAFgAcAAbFwBasABqoxgA7LbwAB7lgSu6ICSwAGq9cABq6oGorMAYAOy2wFqwAGrGWADstvAAHuWBK7pgJLAAav3wAGsGwaitABdA7LEAWABwABsXAFqwAGsCWADstvAAHvDBK7qgJLAAaxpwAGtIQaiuABgA7LbAWrAAayEYAOy28AAe8MEruuAksABrW7AAa2eBqK5AF0DssQBYAHAAGxcAWrAAa2GYAOy28AAe/wEruyAksABrezAAa6VBqK9AGADstsBasABrg1gA7LbwAB7/ASu7YCSwAGu4sABrzIGor4AXQOyxAFgAcAAbFwBasABrwxgA7LbwAB8KQSu7oCSwAGvgMABsKMGosIAYAOy2wFqwAGvr2ADstvAAHwpBK7vgJLAAbEPwAGx2waiwwBdA7LnAWEDAWADwABsGGADss8BasABsTddA7LnAWEDAWADwABsGGADss/AAHxSBK7wgJLAAbJDwAGy/AaixQBdA7LEAWEDAWADwABsGGADss8BasABsmddA7LEAWEDAWADwABsGGADss/AAHyFBK7xgJLAAbR9wAG0tQaiyABdA7LEAWABwABsXAFqwAG0mWADstvAAHy2BK7ygJLAAbUDwAG1jgaiywBgA7LbAWrAAbUoYAOy28AAfLYErvOAksABtdvAAbYDBqLMAF0DssQBYAHAAGxcAWrAAbXvYAOy28AAfOAErvSAksABtlHAAbcABqLQAGADstsBasABtm5gA7LbwAB84ASu9YCSwAG3TcABt4EGotEAXQOyxAFgAcAAbFwBasABt2dgA7LbwAB9HASu9oCSwAG3z8ABuKYGotUAYAOy2wFqwAG38mADstvAAH0cBK73gJLAAbjzwAG5GQai1gBdA7LEAWABwABsXAFqwAG5BmADstvAAH1GBK74gJLAAblnwAG6Kwai2ABgA7LbAWrAAbmDYAOy28AAfUYErvmAksABupfAAbtaBqLZAF0DsucBYQMBYAPAAGwYYAOyzwFqwAG6ul0DsucBYQMBYAPAAGwYYAOyz8AAfXMErvqAksABu8LAAbxsBqLbAF0DssQBYQMBYAPAAGwYYAOyzwFqwAG74V0DssQBYQMBYAPAAGwYYAOyz8AAfZcErvuAksABvgHAAb7YBqLdAF0DsucBYQMBYAO+TWADss8BasABvildA7LnAWEDAWADvk1gA7LPwAB9yASu/ICSwAG/PsABv/wGot8AXQOyxAFhAwFgA75NYAOyzwFqwAG/Yl0DssQBYQMBYAO+TWADss/AAH35BK79gJLAAcGXwAHCwgai4gBdA7LnAWEDAWADwABsGGADss8BasABwcRdA7LnAWEDAWADwABsGGADss/AAH4rBK7+gJLAAcMqwAHD0Qai5QBdA7LEAWEDAWADwABsGGADss8BasABw1NdA7LEAWEDAWADwABsGGADss/AAH5SBK7/gJLAAcW3wAHGjQai5wBdA7LnAWEDAWADvk1gA7LPAWrAAcXfXQOy5wFhAwFgA75NYAOyz8AAfoAErwCAksABxvPAAcevBqLpAF0DssQBYQMBYAO+TWADss8BasABxxddA7LEAWEDAWADvk1gA7LPwAB+sQSvAYCSwAHJJsAByVoGouwAXQOyxAFgAcAAbFwBasAByUBgA7LbwAB+4ASvAoCSwAHJqMAByjAGou8AYAOy2wFqwAHJy2ADstvAAH7gBK8DgJLAAcqfwAHL0Aai8ABdA7LnAWEDAWADvk1gA7LPAWrAAcrAXQOy5wFhAwFgA75NYAOy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ryiAksAB+nHAAftQBqNDAGADstsBasAB+pBgA7LbwACDsgSvKYCSwAH708AB/NYGo0QAXQOy5wFhAwNgA8AAbBhgA8AAbFhgA8AAbFhgA7LPAWrAAfv5XQOy5wFhAwNgA8AAbBhgA8AAbFhgA8AAbFhgA7LPwACD3ASvKoCSwAH9VcAB/gwGo0YAXQOyxAFhAwNgA8AAbBhgA8AAbFhgA8AAbFhgA7LPAWrAAf13XQOyxAFhAwNgA8AAbBhgA8AAbFhgA8AAbFhgA7LPwACEDASvK4CSwAIAUcACAIkGo0gAXQOyxAFgAcAAbFwBasACAG1gA7LbwACERwSvLICSwAIA18ACAcsGo0sAYAOy2wFqwAIA/GADstvAAIRHBK8tgJLAAgI1wAIDGQajTABdA7LnAWEDAWADwABsGGADss8BasACAlddA7LnAWEDAWADwABsGGADss/AAIRuBK8ugJLAAgN/wAIEIgajTgBdA7LEAWEDAWADwABsGGADss8BasACA51dA7LEAWEDAWADwABsGGADss/AAIShBK8vgJLAAgXxwAIG5AajUQBdA7LnAWEDAWADwABsGGADss8BasACBhldA7LnAWEDAWADwABsGGADss/AAITSBK8wgJLAAgdKwAIICwajUwBdA7LEAWEDAWADwABsGGADss8BasACB25dA7LEAWEDAWADwABsGGADss/AAIUFBK8xgJLAAgnWwAIKAgajVgBdA7LEAWABwABsXAFqwAIJ7GADstvAAIU2BK8ygJLAAgpQwAIK3AajWQBgA7LbAWrAAgpvYAOy28AAhTYErzOAksACCynAAgtPBqNaAF0DssQBYAHAAGxcAWrAAgs8YAOy28AAhV0ErzSAksACC53AAgwgBqNdAGADstsBasACC7lgA7LbwACFXQSvNYCSwAIMbcACDJEGo14AXQOyxAFgAcAAbFwBasACDH9gA7LbwACFhASvNoCSwAIM38ACDV8Go2EAYAOy2wFqwAIM+mADstvAAIWEBK83gJLAAg2swAIN/AajYgBdA7LEAWABwABsXAFqwAIN1mADstvAAIWuBK84gJLAAg5KwAIPPAajZgBgA7LbAWrAAg55YAOy28AAha4ErzmAksACD4nAAg/TBqNnAF0DssQBYAHAAGxcAWrAAg+wYAOy28AAhdsErzqAksACECHAAhEDBqNrAGADstsBasACEE1gA7LbwACF2wSvO4CSwAIRUMACEZ4Go2wAXQOyxAFgAcAAbFwBasACEXlgA7LbwACGCASvPICSwAIR7MACEukGo3AAYAOy2wFqwAISGmADstvAAIYIBK89gJLAAhNXwAIUdAajcQBdA7LnAWEDAWADwABsGGADss8BasACE5RdA7LnAWEDAWADwABsGGADss/AAIYyBK8+gJLAAhTewAIVnwajcwBdA7LEAWEDAWADwABsGGADss8BasACFRddA7LEAWEDAWADwABsGGADss/AAIZWBK8/gJLAAheUwAIXvAajdQBdA7LEAWABwABsXAFqwAIXqGADstvAAIaHBK9AgJLAAhgKwAIYyAajeQBgA7LbAWrAAhgnYAOy28AAhocEr0GAksACGRXAAhldBqN6AF0DssQBYAHAAGxcAWrAAhk7YAOy28AAhrQEr0KAksACGavAAhq5BqN+AGADstsBasACGdZgA7LbwACGtASvQ4CSwAIbBsACG2gGo38AXQOyxAFgAcAAbFwBasACGzlgA7LbwACG8ASvRICSwAIbtsACHS4Go4QAYAOy2wFqwAIb8mADstvAAIbwBK9FgJLAAh17wAIdoQajhQBdA7LEAWABwABsXAFqwAIdjmADstvAAIcdBK9GgJLAAh3vwAIeqQajiABgA7LbAWrAAh4LYAOy28AAhx0Er0eAksACHvbAAh88BqOJAF0DssQBYAHAAGxcAWrAAh8bYAOy28AAh0oEr0iAksACH4rAAiBmBqONAGADstsBasACH7RgA7LbwACHSgSvSYCSwAIgs8ACIO8Go44AXQOyxAFgAcAAbFwBasACINFgA7LbwACHdwSvSoCSwAIhPcACIjwGo5IAYAOy2wFqwAIhZGADstvAAId3BK9LgJLAAiKJwAIisQajkwBdA7LEAWABwABsXAFqwAIinWADstvAAIekBK9MgJLAAiL/wAIkAQajlwBgA7LbAWrAAiMcYAOy28AAh6QEr02AksACJE7AAiSIBqOYAF0DssQBYAHAAGxcAWrAAiRrYAOy28AAh84Er06AksACJNbAAiV6BqObAGADstsBasACJPxgA7LbwACHzgSvT4CSwAIlx8ACJfMGo5wAXQOyxAFgAcAAbFwBasACJd1gA7LbwACH9QSvUICSwAImQcACJwUGo58AYAOy2wFqwAImYGADstvAAIf1BK9RgJLAAidvwAIocQajoABdA7LnAWEDAWADvk1gA7LPAWrAAieWXQOy5wFhAwFgA75NYAOyz8AAiCIEr1KAksACKNfAAilrBqOjAF0DssQBYQMBYAO+TWADss8BasACKPpdA7LEAWEDAWADvk1gA7LPwACIRwSvU4CSwAIrJsACLEkGo6UAXQOy5wFhAwFgA75NYAOyzwFqwAIrWF0DsucBYQMBYAO+TWADss/AAIhzBK9UgJLAAiyvwAItZAajpwBdA7LEAWEDAWADvk1gA7LPAWrAAizdXQOyxAFhAwFgA75NYAOyz8AAiJgEr1WAksACLx/AAi9JBqOpAF0DssQBYAHAAGxcAWrAAi80YAOy28AAiNMEr1aAksACL5fAAjBQBqOtAGADstsBasACL7VgA7LbwACI0wSvV4CSwAIwncACMOMGo64AXQOyxAFgAcAAbFwBasACMMJgA7LbwACJAASvWICSwAIxMcACMhwGo7IAYAOy2wFqwAIxW2ADstvAAIkABK9ZgJLAAjKGwAIzWQajswBdA7LnAWEDAWADwABsGGADss8BasACMrNdA7LnAWEDAWADwABsGGADss/AAIkqBK9agJLAAjO/wAI0UAajtQBdA7LEAWEDAWADwABsGGADss8BasACM+hdA7LEAWEDAWADwABsGGADss/AAIlOBK9bgJLAAjX9wAI2JwajtwBdA7LEAWABwABsXAFqwAI2EmADstvAAIl8BK9cgJLAAjZ1wAJCggajugBgA7LbAWrAAjaXYAOy28AAiXwEr12AksACQs/AAkL7BqO7AF0DssQBYAHAAGxcAWrAAkLlYAOy28AAiaMEr16AksACQ0nAAkQvBqO+AGADstsBasACQ2xgA7LbwACJowSvX4CSwAJEfMACRLoGo78AXQOyxAFgAcAAbFwBasACRJtgA7LbwACJygSvYICSwAJFCMACRZwGgroAYAOy2wFqwAJFMGADstvAAInKBK9hgJLAAkXpwAJGHQajwgBdA7LEAWABwABsXAFqwAJGA2ADstvAAInxBK9igJLAAkZrwAJG9waCuwBgA7LbAWrAAkaOYAOy28AAifEEr2OAksACR2XAAkhpBoLAAF0DsucBYQMBYAPAAGwYYAOyzwFqwAJHm10DsucBYQMBYAPAAGwYYAOyz8AAihgEr2SAksACSNPAAkl/BqPGAF0DssQBYQMBYAPAAGwYYAOyzwFqwAJJBV0DssQBYQMBYAPAAGwYYAOyz8AAijwEr2WAksACS3PAAkyzBoLBAF0DsucBYQMBYAPAAGwYYAOyzwFqwAJLll0DsucBYQMBYAPAAGwYYAOyz8AAimoEr2aAksACTRnAAk2YBqPJAF0DssQBYQMBYAPAAGwYYAOyzwFqwAJNPF0DssQBYQMBYAPAAGwYYAOyz8AAio4Er2eAksACT9nAAlEBBoLCAF0DsucBYQMBYAPAAGwYYAOyzwFqwAJP/V0DsucBYQMBYAPAAGwYYAOyz8AAirwEr2iAksACUWfAAlHpBqPMAF0DssQBYQMBYAPAAGwYYAOyzwFqwAJRi10DssQBYQMBYAPAAGwYYAOyz8AAiuAEr2mAksACVCfAAlVpBoLDAF0DsucBYQMBYAPAAGwYYAOyzwFqwAJUTF0DsucBYQMBYAPAAGwYYAOyz8AAiw4Er2qAksACVc/AAlZUBqPPAF0DssQBYQMBYAPAAGwYYAOyzwFqwAJV9F0DssQBYQMBYAPAAGwYYAOyz8AAizIEr2uAksACWJfAAlmuBoLEAF0DsucBYQMBYAPAAGwYYAOyzwFqwAJYtF0DsucBYQMBYAPAAGwYYAOyz8AAi2AEr2yAksACWhTAAlqBBqPSAF0DssQBYQMBYAPAAGwYYAOyzwFqwAJaMV0DssQBYQMBYAPAAGwYYAOyz8AAi4QEr22AksACXJTAAl1fBoLFAF0DsucBYQMBYAPAAGwYYAOyzwFqwAJcuV0DsucBYQMBYAPAAGwYYAOyz8AAi7IEr26AksACXcXAAl4+BqPVAF0DssQBYQMBYAPAAGwYYAOyzwFqwAJd5l0DssQBYQMBYAPAAGwYYAOyz8AAi9YEr2+AksACX+PAAmA/BqPXAF0DssQBYAHAAGxcAWrAAmATYAOy28AAjAcEr3CAksACYI3AAmHcBqPbAGADstsBasACYMJgA7LbwACMBwSvcYCSwAJiKcACYn8Go9wAXQOyxAFgAcAAbFwBasACYlZgA7LbwACMNASvcoCSwAJizcACY7sGo+AAYAOy2wFqwAJi/2ADstvAAIw0BK9zgJLAAmQIwAJkOAaj4QBdA7LEAWABwABsXAFqwAJkIGADstvAAIxhBK90gJLAAmSGwAJlfwaj5QBgA7LbAWrAAmSnYAOy28AAjGEEr3WAksACZczAAmXwBqPmAF0DssQBYAHAAGxcAWrAAmXeYAOy28AAjI4Er3aAksACZj7AAmcABqPqAGADstsBasACZllgA7LbwACMjgSvd4CSwAJnhMACaMcGo+sAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAmetXQOy5wFhAwFgA8AAbBhgA7LPwACMuwSveICSwAJpLcACafoGo+4AXQOyxAFhAwFgA8AAbBhgA7LPAWrAAmlWXQOyxAFhAwFgA8AAbBhgA7LPwACM8QSveYCSwAJsTMACbc4Go/EAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAmyCXQOy5wFhAwFgA8AAbBhgA7LPwACNJQSveoCSwAJuOMACb0IGo/QAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAm5uXQOyxAFhAwFgA8AAbBhgA7LPwACNWwSve4CSwAJx1cACcx8Go/cAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAnICXQOy5wFhAwFgA8AAbBhgA7LPwACNjASvfICSwAJzhcACdF4Go/kAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAnOyXQOyxAFhAwFgA8AAbBhgA7LPwACNswSvfYCSwAJ2l8ACd74Go/sAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAnbTXQOy5wFhAwFgA8AAbBhgA7LPwACN5ASvfoCSwAJ4KMACeTUGo/0AXQOyxAFhAwFgA8AAbBhgA7LPAWrAAnhgXQOyxAFhAwFgA8AAbBhgA7LPwACOFwSvf4CSwAJ7VcACfFwGpAAAXQOy5wFhAwFgA8AAbBhgA7LPAWrAAnuWXQOy5wFhAwFgA8AAbBhgA7LPwACOSASvgICSwAJ8xsACfcEGpAIAXQOyxAFhAwFgA8AAbBhgA7LPAWrAAn0DXQOyxAFhAwFgA8AAbBhgA7LPwACObASvgYCSwAJ/m8ACf+MGpAQAXQOyxAFgAcAAbFwBasACf8FgA7LbwACOmwSvgoCSwAKAMcACgNYGpAcAYAOy2wFqwAKAXGADstvAAI6bBK+DgJLAAoEjwAKBXQakCABdA7LEAWABwABsXAFqwAKBQGADstvAAI7CBK+EgJLAAoGrwAKCVAakCwBgA7LbAWrAAoHRYAOy28AAjsIEr4WAksACgqHAAoLnBqQMAF0DssQBYAHAAGxcAWrAAoLGYAOy28AAjvsEr4aAksACgzXAAoQ6BqQRAGADstsBasACg19gA7LbwACO+wSvh4CSwAKEh8AChMUGpBIAXQOyxAFgAcAAbFwBasAChKZgA7LbwACPNwSviICSwAKFE8ACheoGpBYAYAOy2wFqwAKFO2ADstvAAI83BK+JgJLAAoY3wAKGewakFwBdA7LEAWABwABsXAFqwAKGW2ADstvAAI9zBK+KgJLAAobJwAKIFQakHABgA7LbAWrAAobyYAOy28AAj3MEr4uAksACiGLAAoiaBqQdAF0DssQBYAHAAGxcAWrAAoh+YAOy28AAj68Er4yAksACiOjAAomqBqQhAGADstsBasACiQ1gA7LbwACPrwSvjYCSwAKJ98ACij0GpCIAXQOyxAFgAcAAbFwBasACihxgA7LbwACP6ASvjoCSwAKKi8ACi4gGpCYAYAOy2wFqwAKKtWADstvAAI/oBK+PgJLAAovVwAKMPQakJwBdA7LEAWABwABsXAFqwAKMC2ADstvAAJAVBK+QgJLAAoyLwAKN7AakKwBgA7LbAWrAAozKYAOy28AAkBUEr5GAksACjlbAAo8SBqQsAF0DsucBYQMBYAPAAGwYYAOyzwFqwAKOeV0DsucBYQMBYAPAAGwYYAOyz8AAkEAEr5KAksACj3jAApAiBqQuAF0DssQBYQMBYAPAAGwYYAOyzwFqwAKPl10DssQBYQMBYAPAAGwYYAOyz8AAkGQEr5OAksACkbLAApHiBqQwAF0DssQBYAHAAGxcAWrAApHKYAOy28AAkKUEr5SAksACkjDAApMQBqQ1AGADstsBasACklFgA7LbwACQpQSvlYCSwAKTXcACk68GpDYAXQOyxAFgAcAAbFwBasACk4hgA7LbwACQ0gSvloCSwAKT/cAClLYGpDkAYAOy2wFqwAKULWADstvAAJDSBK+XgJLAApUDwAKVUwakOgBdA7LEAWABwABsXAFqwAKVLWADstvAAJEIBK+YgJLAApWhwAKWrgakPgBgA7LbAWrAApXQYAOy28AAkQgEr5mAksAClvvAApdTBqQ/AF0DssQBYAHAAGxcAWrAApcpYAOy28AAkTIEr5qAksACl6HAAphoBqRCAGADstsBasACl9hgA7LbwACRMgSvm4CSwAKYtcACmO8GpEMAXQOyxAFgAcAAbFwBasACmNJgA7LbwACRaASvnICSwAKZPcACmi0GpEcAYAOy2wFqwAKZY2ADstvAAJFoBK+dgJLAApqXwAKbWAakSABdA7LnAWEDAWADwABsGGADss8BasACmrhdA7LnAWEDAWADwABsGGADss/AAJGSBK+egJLAApu+wAKcXwakSgBdA7LEAWEDAWADwABsGGADss8BasACm9tdA7LEAWEDAWADwABsGGADss/AAJHFBK+fgJLAAp4bwAKfIAakTQBdA7LnAWEDAWADwABsGGADss8BasACnk1dA7LnAWEDAWADwABsGGADss/AAJH2BK+ggJLAAp+GwAKgZwakTwBdA7LEAWEDAWADwABsGGADss8BasACn7RdA7LEAWEDAWADwABsGGADss/AAJIpBK+hgJLAAqJlwAKjbgakUgBdA7LnAWEDAWADwABsGGADss8BasACopxdA7LnAWEDAWADwABsGGADss/AAJJaBK+igJLAAqPYwAKktQakVABdA7LEAWEDAWADwABsGGADss8BasACpAtdA7LEAWEDAWADwABsGGADss/AAJJ+BK+jgJLAAqaMwAKm2gakVgBdA7LEAWABwABsXAFqwAKmtWADstvAAJK8BK+kgJLAAqcowAKoMwakWgBgA7LbAWrAAqdWYAOy28AAkrwEr6WAksACqIDAAqjWBqRbAF0DssQBYAHAAGxcAWrAAqitYAOy28AAkuYEr6aAksACqSTAAqnZBqReAGADstsBasACqVZgA7LbwACS5gSvp4CSwAKqJsACqmIGpF8AXQOyxAFgAcAAbFwBasACqkRgA7LbwACTEASvqICSwAKqsMACq6wGpGMAYAOy2wFqwAKq12ADstvAAJMQBK+pgJLAAqv5wAKsKwakZABdA7LEAWABwABsXAFqwAKsEmADstvAAJM9BK+qgJLAAqx5wAKtYQakaABgA7LbAWrAAqybYAOy28AAkz0Er6uAksACra7AAq3kBqRpAF0DssQBYAHAAGxcAWrAAq3JYAOy28AAk2oEr6yAksACrjLAAq8iBqRtAGADstsBasACrlZgA7LbwACTagSvrYCSwAKvb8ACr6EGpG4AXQOyxAFgAcAAbFwBasACr4hgA7LbwACTlASvroCSwAKv78ACsJEGpHEAYAOy2wFqwAKwEWADstvAAJOUBK+vgJLAArDewAKxCgakcgBdA7LEAWABwABsXAFqwAKw9GADstvAAJO7BK+wgJLAArFYwAKx5AakdQBgA7LbAWrAArF3YAOy28AAk7sEr7GAksACsl3AArN8BqR2AF0DsucBYQMCYAPAAGwYYAPAAGwfYAOyzwFqwAKyhF0DsucBYQMCYAPAAGwYYAPAAGwfYAOyz8AAk+UEr7KAksACs+3AArSxBqR5AF0DssQBYQMCYAPAAGwYYAPAAGwfYAOyzwFqwAK0EF0DssQBYQMCYAPAAGwYYAPAAGwfYAOyz8AAlCEEr7OAksACtxjAArhKBqR8AF0DsucBYQMBYAPAAGwYYAOyzwFqwAK3PV0DsucBYQMBYAPAAGwYYAOyz8AAlFsEr7SAksACuLDAArlyBqR/AF0DssQBYQMBYAPAAGwYYAOyzwFqwAK41V0DssQBYQMBYAPAAGwYYAOyz8AAlJEEr7WAksACu3zAArumBqSCAF0DssQBYAHAAGxcAWrAAruRYAOy28AAlMIEr7aAksACu/TAArx9BqSFAGADstsBasACvBJgA7LbwACUwgSvt4CSwAK9LcACvlIGpIYAXQOy5wFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPAWrAAr1TXQOy5wFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPwACU6QSvuICSwAK+2MACv3wGpIgAXQOyxAFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPAWrAAr7+XQOyxAFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPwACVGQSvuYCSwALCZcACwpEGpIoAXQOyxAFgAcAAbFwBasACwntgA7LbwACVVgSvuoCSwALC38ACw74GpI4AYAOy2wFqwALC/mADstvAAJVWBK+7gJLAAsRBwALFRAakjwBdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasACxGddA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAJWABK+8gJLAAsXDwALGegakkQBdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss8BasACxeVdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAJWwBK+9gJLAAsi/wALJCwakkwBdA7LEAWABwABsXAFqwALI52ADstvAAJXrBK++gJLAAslZwALKJgaklgBgA7LbAWrAAsmGYAOy28AAlesEr7+AksACyo3AAstdBqSXAF0DsucBYQMBYAPAAGxYYAOyzwFqwALKtF0DsucBYQMBYAPAAGxYYAOyz8AAlhMEr8CAksACy8DAAsxiBqSZAF0DssQBYQMBYAPAAGxYYAOyzwFqwALL410DssQBYQMBYAPAAGxYYAOyz8AAljcEr8GAksACzdTAAs4SBqSbAF0DssQBYAHAAGxcAWrAAs3zYAOy28AAlnUEr8KAksACzmDAAs8+BqSfAGADstsBasACzohgA7LbwACWdQSvw4CSwALPi8ACz9kGpKAAXQOyxAFgAcAAbFwBasACz7RgA7LbwACWnwSvxICSwALQJ8AC0NoGpKMAYAOy2wFqwALQVWADstvAAJafBK/FgJLAAtEnwALRdQakpABdA7LEAWABwABsXAFqwALRUGADstvAAJbHBK/GgJLAAtHDwALSfAakpwBgA7LbAWrAAtHxYAOy28AAlscEr8eAksAC0xTAAtXvBqSoAF0DsucBYQMCYAPAAGwYYAPAAGxYYAOyzwFqwALTR10DsucBYQMCYAPAAGwYYAPAAGxYYAOyz8AAlu8Er8iAksAC1mXAAtdOBqSqAF0DssQBYQMCYAPAAGwYYAPAAGxYYAOyzwFqwALWmF0DssQBYQMCYAPAAGwYYAPAAGxYYAOyz8AAlxkEr8mAksAC2z7AAt0OBqSsAF0DsucBYQMBYAPAAGwYYAOyzwFqwALbe10DsucBYQMBYAPAAGwYYAOyz8AAl04Er8qAksAC3XrAAt5rBqSuAF0DssQBYQMBYAPAAGwYYAOyzwFqwALds10DssQBYQMBYAPAAGwYYAOyz8AAl3IEr8uAksAC4WnAAuSUBqSwAF0DsucBYQMEYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxYYAOyzwFqwALhml0DsucBYQMEYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxYYAOyz8AAl6EEr8yAksAC5UDAAuZdBqSyAF0DssQBYQMEYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxYYAOyzwFqwALlbV0DssQBYQMEYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxYYAOyz8AAl9cEr82AksAC62rAAu2GBqS0AF0DsucBYQMDYAPAAGwYYAPA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WD5dA7LnAWEDAWADwABsGGADss/AAKB0BLAMgJLAA1k+wANZvQalLwBdA7LEAWEDAWADwABsGGADss8BasADWWFdA7LEAWEDAWADwABsGGADss/AAKCYBLANgJLAA1tSwANbigalMQBdA7LEAWABwABsXAFqwANbbmADstvAAKDVBLAOgJLAA1vYwANcjAalNQBgA7LbAWrAA1v9YAOy28AAoNUEsA+AksADXNnAA10HBqU2AF0DssQBYAHAAGxcAWrAA1zwYAOy28AAoQ4EsBCAksADXVXAA14qBqU6AGADstsBasADXXVgA7LbwAChDgSwEYCSwANelMADX14GpTsAXQOy5wFhAwFgA8AAbBhgA7LPAWrAA16+XQOy5wFhAwFgA8AAbBhgA7LPwAChOASwEoCSwANfxMADYEwGpT0AXQOyxAFhAwFgA8AAbBhgA7LPAWrAA1/qXQOyxAFhAwFgA8AAbBhgA7LPwAChXASwE4CSwANh6sADYhgGpT8AXQOyxAFgAcAAbFwBasADYgFgA7LbwAChigSwFICSwANiZsADYyYGpUIAYAOy2wFqwANihmADstvAAKGKBLAVgJLAA2NzwANjpQalQwBdA7LEAWABwABsXAFqwANjjGADstvAAKG0BLAWgJLAA2PzwANkvwalRgBgA7LbAWrAA2QVYAOy28AAobQEsBeAksADZQzAA2VQBqVHAF0DssQBYAHAAGxcAWrAA2UwYAOy28AAofAEsBiAksADZZ7AA2dEBqVMAGADstsBasADZcdgA7LbwACh8ASwGYCSwANnrsADaJMGpU0AXQOy5wFhAwFgA75NYAOyzwFqwANn0l0DsucBYQMBYAO+TWADss/AAKIdBLAagJLAA2j5wANphAalTwBdA7LEAWEDAWADvk1gA7LPAWrAA2kZXQOyxAFhAwFgA75NYAOyz8AAoj8EsBuAksADayvAA2v9BqVRAF0DsucBYQMCYAPAAGxYYAPAAGwYYAOyzwFqwANrUV0DsucBYQMCYAPAAGxYYAPAAGwYYAOyz8AAomsEsByAksADbG/AA2z3BqVTAF0DssQBYQMCYAPAAGxYYAPAAGwYYAOyzwFqwANskV0DssQBYQMCYAPAAGxYYAPAAGwYYAOyz8AAopUEsB2AksADbrPAA273BqVVAF0DssQBYAHAAGxcAWrAA27X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wABsWGADss/AAK2DBLB4gJLAA+uvwAPsUwamHwBdA7LEAWEDAWADwABsWGADss8BasAD681dA7LEAWEDAWADwABsWGADss/AAK22BLB5gJLAA+3gwAPuLAamIgBdA7LEAWABwABsXAFqwAPuCGADstvAAK3qBLB6gJLAA+56wAPvcAamJgBgA7LbAWrAA+6nYAOy28AAreoEsHuAksAD773AA+/7BqYnAF0DssQBYAHAAGxcAWrAA+/cYAOy28AAriYEsHyAksAD8EnAA/FaBqYsAGADstsBasAD8HFgA7LbwACuJgSwfYCSwAPxp8AD8eUGpi0AXQOyxAFgAcAAbFwBasAD8cZgA7LbwACuUwSwfoCSwAPyM8AD8s4GpjAAYAOy2wFqwAPyW2ADstvAAK5TBLB/gJLAA/NswAP0pQamMQBdA7LnAWEDAmADwABsGGADwABsGGADss8BasAD849dA7LnAWEDAmADwABsGGADwABsGGADss/AAK59BLCAgJLAA/UhwAP1xwamNABdA7LEAWEDAmADwABsGGADwABsGGADss8BasAD9URdA7LEAWEDAmADwABsGGADwABsGGADss/AAK6qBLCBgJLAA/f8wAP4UAamNgBdA7LEAWABwABsXAFqwAP4KGADstvAAK7tBLCCgJLAA/iewAP5kgamOgBgA7LbAWrAA/jPYAOy28AAru0EsIOAksAD+d/AA/oLBqY7AF0DssQBYAHAAGxcAWrAA/n1YAOy28AArxoEsISAksAD+lnAA/tlBqY/AGADstsBasAD+nhgA7LbwACvGgSwhYCSwAP7ssAD++QGpkAAXQOyxAFgAcAAbFwBasAD+8tgA7LbwACvVgSwhoCSwAP8MsAD/WwGpkUAYAOy2wFqwAP8VGADstvAAK9WBLCHgJLAA/25wAP9/QamRgBdA7LEAWABwABsXAFqwAP93WADstvAAK+GBLCIgJLAA/5LwAP/QAamSgBgA7LbAWrAA/50YAOy28AAr4YEsImAksAD/43AA/+9BqZLAF0DssQBYAHAAGxcAWrAA/+lYAOy28AAr7MEsIqAksAEAAvABAD2BqZPAGADstsBasAEACxgA7LbwACvswSwi4CSwAQBQ8AEAYcGplAAXQOyxAFgAcAAbFwBasAEAWdgA7LbwACv4ASwjICSwAQB1cAEAtYGplQAYAOy2wFqwAQB/mADstvAAK/gBLCNgJLABAMjwAQDSQamVQBdA7LEAWABwABsXAFqwAQDNmADstvAALANBLCOgJLABAOXwAQEdwamWQBgA7LbAWrABAOzYAOy28AAsA0EsI+AksAEBMTABAUABqZaAF0DssQBYAHAAGxcAWrABATiYAOy28AAsEYEsJCAksAEBU7ABAYYBqZeAGADstsBasAEBXVgA7LbwACwRgSwkYCSwAQGssAEB8AGpl8AXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPAWrABAbVXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwACwcASwkoCSwAQINMAECMEGpmEAXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPAWrABAhXXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPwACwmgSwk4CSwAQLHsAEC2wGpmMAXQOyxAFgAcAAbFwBasAEC0dgA7LbwACw0QSwlICSwAQLusAEDOgGpmcAYAOy2wFqwAQL6GADstvAALDRBLCVgJLABA1XwAQOigamaABdA7LnAWEDAWADvk1gA7LPAWrABA1xXQOy5wFhAwFgA75NYAOyz8AAsP4EsJaAksAEDvDABA+NBqZrAF0DssQBYQMBYAO+TWADss8BasAEDwpdA7LEAWEDAWADvk1gA7LPwACxIwSwl4CSwAQRfsAEElUGpm0AXQOy5wFhAwFgA8AAbBhgA7LPAWrABBGnXQOy5wFhAwFgA8AAbBhgA7LPwACxUgSwmICSwAQSu8AEE4AGpm8AXQOyxAFhAwFgA8AAbBhgA7LPAWrABBLgXQOyxAFhAwFgA8AAbBhgA7LPwACxhQSwmYCSwAQVMcAEFXsGpnIAXQOyxAFgAcAAbFwBasAEFVhgA7LbwACxtgSwmoCSwAQVycAEFl8GpnUAYAOy2wFqwAQV9WADstvAALG2BLCbgJLABBb/wAQYogamdgBdA7LnAWEDAmADwABsGGADwABsH2ADss8BasAEFyJdA7LnAWEDAmADwABsGGADwABsH2ADss/AALHgBLCcgJLABBkgwAQZ6wameQBdA7LEAWEDAmADwABsGGADwABsH2ADss8BasAEGUNdA7LEAWEDAmADwABsGGADwABsH2ADss/AALINBLCdgJLABB0HwAQeCAamewBdA7LnAWEDAWADwABsH2ADss8BasAEHSpdA7LnAWEDAWADwABsH2ADss/AALJEBLCegJLABB5wwAQfKQamfQBdA7LEAWEDAWADwABsH2ADss8BasAEHpNdA7LEAWEDAWADwABsH2ADss/AALJoBLCfgJLABCETwAQhRwamfwBdA7LEAWABwABsXAFqwAQhLWADstvAALKcBLCggJLABCGVwAQixwamgwBgA7LbAWrABCG4YAOy28AAspwEsKGAksAEIxTABCNABqaEAF0DssQBYAHAAGxcAWrABCMqYAOy28AAsskEsKKAksAEI47ABCSvBqaHAGADstsBasAEI61gA7LbwACyyQSwo4CSwAQk/MAEJUIGpogAXQOyxAFgAcAAbFwBasAEJSFgA7LbwACzBQSwpICSwAQlkMAEJnIGpowAYAOy2wFqwAQlumADstvAALMFBLClgJLABCa/wAQm/QamjQBdA7LEAWABwABsXAFqwAQm3mADstvAALMvBLCmgJLABCdLwAQn4AamkABgA7LbAWrABCdzYAOy28AAsy8EsKeAksAEKGTABClqBqaRAF0DsucBYQMBYAPAAGwYYAOyzwFqwAQokF0DsucBYQMBYAPAAGwYYAOyz8AAs1YEsKiAksAEKdDABCpqBqaTAF0DssQBYQMBYAPAAGwYYAOyzwFqwAQp/F0DssQBYQMBYAPAAGwYYAOyz8AAs3oEsKmAksAELHDABC13BqaVAF0DsucBYQMBYAPAAGwYYAOyzwFqwAQsol0DsucBYQMBYAPAAGwYYAOyz8AAs6gEsKqAksAELd3ABC6jBqaXAF0DssQBYQMBYAPAAGwYYAOyzwFqwAQuC10DssQBYQMBYAPAAGwYYAOyz8AAs8wEsKuAksAEMILABDCyBqaZAF0DssQBYAHAAGxcAWrABDCaYAOy28AAs/4EsKyAksAEMQDABDIGBqadAGADstsBasAEMSFgA7LbwACz/gSwrYCSwAQyU8AEMpEGpp4AXQOyxAFgAcAAbFwBasAEMnJgA7LbwAC0KASwroCSwAQy38AEM70GpqEAYAOy2wFqwAQzB2ADstvAALQoBLCvgJLABDQKwAQ0SAamogBdA7LEAWABwABsXAFqwAQ0KWADstvAALRiBLCwgJLABDSWwAQ17QampwBgA7LbAWrABDS+YAOy28AAtGIEsLGAksAENlvABDdUBqaoAF0DsucBYQMBYAPAAGwYYAOyzwFqwAQ2il0DsucBYQMBYAPAAGwYYAOyz8AAtI8EsLKAksAEN7rABDh3BqaqAF0DssQBYQMBYAPAAGwYYAOyzwFqwAQ35V0DssQBYQMBYAPAAGwYYAOyz8AAtLMEsLOAksAEOnXABDt/BqasAF0DsucBYQMBYAPAAGwYYAOyzwFqwAQ6n10DsucBYQMBYAPAAGwYYAOyz8AAtOIEsLSAksAEO+XABDyfBqauAF0DssQBYQMBYAPAAGwYYAOyzwFqwAQ8D10DssQBYQMBYAPAAGwYYAOyz8AAtQYEsLWAksAEPojABD7CBqawAF0DssQBYAHAAGxcAWrABD6lYAOy28AAtTUEsLaAksAEPxDABD/IBqazAGADstsBasAEPzZgA7LbwAC1NQSwt4CSwARAYsAEQYgGprQAXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPAWrABECNXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwAC1XwSwuICSwARCAMAEQtYGprYAXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPAWrABEIrXQOyxAFhAwJgA8AAbBhgA8AAbBhgA7LPwAC1mASwuYCSwARFasAERhUGprkAXQOy5wFhAwFgA8AAbBhgA7LPAWrABEWHXQOy5wFhAwFgA8AAbBhgA7LPwAC1zwSwuoCSwARGe8AERwQGprsAXQOyxAFhAwFgA8AAbBhgA7LPAWrABEaUXQOyxAFhAwFgA8AAbBhgA7LPwAC18wSwu4CSwARIg8AESK8Gpr0AXQOyxAFgAcAAbFwBasAESJlgA7LbwAC2JASwvICSwARI/cAESX4GpsAAYAOy2wFqwARJHGADstvAALYkBLC9gJLABEnLwARJ7wamwQBdA7LEAWABwABsXAFqwARJ3WADstvAALZMBLC+gJLABEo9wARKywamxABgA7LbAWrABEpYYAOy28AAtkwEsL+AksAESzXABEv/BqbFAF0DsucBYQMBYAO+TWADss8BasAES1tdA7LnAWEDAWADvk1gA7LPwAC2dgSwwICSwARMZcAETOEGpscAXQOyxAFhAwFgA75NYAOyzwFqwARMh10DssQBYQMBYAO+TWADss/AALaYBLDBgJLABE5rwARPQgamyQBdA7LnAWEDAWADwABsGGADss8BasAETpVdA7LnAWEDAWADwABsGGADss/AALbEBLDCgJLABE+qwARQcgamywBdA7LEAWEDAWADwABsGGADss8BasAET9BdA7LEAWEDAWADwABsGGADss/AALboBLDDgJLABFH+wARSRAamzQBdA7LEAWABwABsXAFqwARSI2ADstvAALccBLDEgJLABFKSwARTwQam0QBgA7LbAWrABFK8YAOy28AAtxwEsMWAksAEVCvABFUeBqbSAF0DsucBYQMBYAPAAGwYYAOyzwFqwARUVl0DsucBYQMBYAPAAGwYYAOyz8AAt0YEsMaAksAEVYTABFYPBqbUAF0DssQBYQMBYAPAAGwYYAOyzwFqwARVq10DssQBYQMBYAPAAGwYYAOyz8AAt2oEsMeAksAEV+3ABFjIBqbWAF0DsucBYQMBYAPAAGwYYAOyzwFqwARYGl0DsucBYQMBYAPAAGwYYAOyz8AAt5gEsMiAksAEWS7ABFnlBqbYAF0DssQBYQMBYAPAAGwYYAOyzwFqwARZV10DssQBYQMBYAPAAGwYYAOyz8AAt7wEsMmAksAEW7fABFyfBqbaAF0DsucBYQMBYAPAAGwYYAOyzwFqwARb3l0DsucBYQMBYAPAAGwYYAOyz8AAt+sEsMqAksAEXQXABF2EBqbcAF0DssQBYQMBYAPAAGwYYAOyzwFqwARdKF0DssQBYQMBYAPAAGwYYAOyz8AAuA8EsMuAksAEX1fABGAnBqbeAF0DsucBYQMBYAPAAGwYYAOyzwFqwARfgF0DsucBYQMBYAPAAGwYYAOyz8AAuD0EsMyAksAEYI3ABGE4BqbgAF0DssQBYQMBYAPAAGwYYAOyzwFqwARgsl0DssQBYQMBYAPAAGwYYAOyz8AAuGEEsM2AksAEYv/ABGPxBqbiAF0DsucBYQMBYAPAAGwYYAOyzwFqwARjK10DsucBYQMBYAPAAGwYYAOyz8AAuJAEsM6AksAEZFfABGTlBqbkAF0DssQBYQMBYAPAAGwYYAOyzwFqwARkf10DssQBYQMBYAPAAGwYYAOyz8AAuLQEsM+AksAEZsbABGegBqbmAF0DsucBYQMBYAPAAGwYYAOyzwFqwARm9F0DsucBYQMBYAPAAGwYYAOyz8AAuOIEsNCAksAEaAbABGjABqboAF0DssQBYQMBYAPAAGwYYAOyzwFqwARo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4AanUgBgA7LbAWrABLlfYAOy28AAv+wEsQGAksAEukzABLuSBqdTAF0DsucBYQMBYAPAAGxYYAOyzwFqwAS6bF0DsucBYQMBYAPAAGxYYAOyz8AAwBcEsQKAksAEu/XABLykBqdWAF0DssQBYQMBYAPAAGxYYAOyzwFqwAS8FV0DssQBYQMBYAPAAGxYYAOyz8AAwE0EsQOAksAEvu3ABMAOBqdZAF0DsucBYQMDYAPAAGxYYAPAAGwYYAPAAGwYYAOyzwFqwAS/F10DsucBYQMDYAPAAGxYYAPAAGwYYAPAAGwYYAOyz8AAwH4EsQSAksAEwJDABMF8BqdbAF0DssQBYQMDYAPAAGxYYAPAAGwYYAPAAGwYYAOyzwFqwATAul0DssQBYQMDYAPAAGxYYAPAAGwYYAPAAGwYYAOyz8AAwL0EsQWAksAExCTABMRGBqdeAF0DssQBYAHAAGxcAWrABMQ1YAOy28AAwPoEsQaAksAExJTABMUvBqdhAGADstsBasAExK5gA7LbwADA+gSxB4CSwATFfMAExaAGp2IAXQOyxAFgAcAAbFwBasAExY5gA7LbwADBJwSxCICSwATF7sAExsIGp2YAYAOy2wFqwATGCWADstvAAMEnBLEJgJLABMcPwATHQQanZwBdA7LEAWABwABsXAFqwATHKGADstvAAMFUBLEKgJLABMePwATIvAanawBgA7LbAWrABMexYAOy28AAwVQEsQuAksAEyQnABMlNBqdsAF0DssQBYAHAAGxcAWrABMktYAOy28AAwYEEsQyAksAEyZvABMpGBqdvAGADstsBasAEycRgA7LbwADBgQSxDYCSwATK7cAEy/gGp3AAXQOy5wFhAwNgA8AAbFhgA8AAbFhgA8AAbFhgA7LPAWrABMsPXQOy5wFhAwNgA8AAbFhgA8AAbFhgA8AAbFhgA7LPwADBqQSxDoCSwATMdcAEzUQGp3IAXQOyxAFhAwNgA8AAbFhgA8AAbFhgA8AAbFhgA7LPAWrABMyXXQOyxAFhAwNgA8AAbFhgA8AAbFhgA8AAbFhgA7LPwADB2QSxD4CSwATPwMAE0SgGp3QAXQOy5wFhAwNgA8AAbFhgA8AAbFhgA8AAbBhgA7LPAWrABM/dXQOy5wFhAwNgA8AAbFhgA8AAbFhgA8AAbBhgA7LPwADCGQSxEICSwATRp8AE0mcGp3cAXQOyxAFhAwNgA8AAbFhgA8AAbFhgA8AAbBhgA7LPAWrABNHEXQOyxAFhAwNgA8AAbFhgA8AAbFhgA8AAbBhgA7LPwADCWwSxEYCSwATVCcAE1SsGp3oAXQOyxAFgAcAAbFwBasAE1RpgA7LbwADCmwSxEoCSwATVecAE1icGp34AYAOy2wFqwATVk2ADstvAAMKbBLETgJLABNaOwATXTQanfwBdA7LnAWEDAWADwABsWGADss8BasAE1qxdA7LnAWEDAWADwABsWGADss/AAMLFBLEUgJLABNewwATYPQangQBdA7LEAWEDAWADwABsWGADss8BasAE18pdA7LEAWEDAWADwABsWGADss/AAML4BLEVgJLABNmewATZzAanhABdA7LEAWABwABsXAFqwATZtWADstvAAMMpBLEWgJLABNoawATarQanhwBgA7LbAWrABNo6YAOy28AAwykEsReAksAE2vrABNtKBqeIAF0DssQBYAHAAGxcAWrABNskYAOy28AAw1EEsRiAksAE25jABNxmBqeLAGADstsBasAE28dgA7LbwADDUQSxGYCSwATcs8AE3PEGp4wAXQOyxAFgAcAAbFwBasAE3NJgA7LbwADDeASxGoCSwATdP8AE3dUGp48AYAOy2wFqwATdZ2ADstvAAMN4BLEbgJLABN4iwATeXAankABdA7LEAWABwABsXAFqwATeP2ADstvAAMOfBLEcgJLABN6qwATfTwankwBgA7LbAWrABN7QYAOy28AAw58EsR2AksAE38fABODSBqeUAF0DsucBYQMCYAPAAGwYYAPAAGxYYAOyzwFqwATf8F0DsucBYQMCYAPAAGwYYAPAAGxYYAOyz8AAw8oEsR6AksAE4ULABOHRBqeXAF0DssQBYQMCYAPAAGwYYAPAAGxYYAOyzwFqwAThZ10DssQBYQMCYAPAAGwYYAPAAGxYYAOyz8AAw/cEsR+AksAE497ABOQMBqeZAF0DssQBYAHAAGxcAWrABOP1YAOy28AAxC4EsSCAksAE5FrABOU+BqedAGADstsBasAE5HpgA7LbwADELgSxIYCSwATli8AE5dUGp54AXQOyxAFgAcAAbFwBasAE5bJgA7LbwADEZwSxIoCSwATmI8AE5vMGp6IAYAOy2wFqwATmT2ADstvAAMRnBLEjgJLABOdAwATniganowBdA7LEAWABwABsXAFqwATnZ2ADstvAAMSjBLEkgJLABOfYwATpMwanqABgA7LbAWrABOgEYAOy28AAxKMEsSWAksAE6YDABOnMBqepAF0DssQBYAHAAGxcAWrABOmoYAOy28AAxOIEsSaAksAE6hrABOtUBqeuAGADstsBasAE6kdgA7LbwADE4gSxJ4CSwATrocAE69kGp68AXQOyxAFgAcAAbFwBasAE671gA7LbwADFEgSxKICSwATsJ8AE7SYGp7MAYAOy2wFqwATsTGADstvAAMUSBLEpgJLABO1zwATtqwantABdA7LEAWABwABsXAFqwATtj2ADstvAAMVLBLEqgJLABO35wATuyQanuABgA7LbAWrABO4eYAOy28AAxUsEsSuAksAE7xbABO9kBqe5AF0DssQBYAHAAGxcAWrABO8/YAOy28AAxXgEsSyAksAE77LABPDABqe9AGADstsBasAE7+BgA7LbwADFeASxLYCSwATxDcAE8UkGp74AXQOyxAFgAcAAbFwBasAE8StgA7LbwADFpQSxLoCSwATxl8AE8p4Gp8IAYAOy2wFqwATxvmADstvAAMWlBLEvgJLABPMMwAT0AQanwwBdA7LnAWEDAWADwABsGGADss8BasAE8zpdA7LnAWEDAWADwABsGGADss/AAMXPBLEwgJLABPRnwAT1QQanxQBdA7LEAWEDAWADwABsGGADss8BasAE9JFdA7LEAWEDAWADwABsGGADss/AAMYCBLExgJLABPclwAT4WganyABdA7LnAWEDAWADwABsGGADss8BasAE92RdA7LnAWEDAWADwABsGGADss/AAMYzBLEygJLABPjEwAT5iwanygBdA7LEAWEDAWADwABsGGADss8BasAE+P9dA7LEAWEDAWADwABsGGADss/AAMZXBLEzgJLABPutwAT83wanzABdA7LnAWEDAWADwABsGGADss8BasAE++5dA7LnAWEDAWADwABsGGADss/AAMaFBLE0gJLABP1JwAT+RAanzgBdA7LEAWEDAWADwABsGGADss8BasAE/YZdA7LEAWEDAWADwABsGGADss/AAMapBLE1gJLABQBHwAUAkQan0ABdA7LEAWABwABsXAFqwAUAbmADstvAAMbqBLE2gJLABQDfwAUCHAan1QBgA7LbAWrABQELYAOy28AAxuoEsTeAksAFAmnABQKVBqfWAF0DssQBYAHAAGxcAWrABQJ/YAOy28AAxyYEsTiAksAFAuPABQOYBqfaAGADstsBasAFAwJgA7LbwADHJgSxOYCSwAUD5cAFBB8Gp9sAXQOyxAFgAcAAbFwBasAFBAJgA7LbwADHXwSxOoCSwAUEbcAFBTQGp98AYAOy2wFqwAUEk2ADstvAAMdfBLE7gJLABQWBwAUFywan4ABdA7LEAWABwABsXAFqwAUFqGADstvAAMeJBLE8gJLABQYZwAUGugan4wBgA7LbAWrABQZFYAOy28AAx4kEsT2AksAFBwfABQdDBqfkAF0DssQBYAHAAGxcAWrABQclYAOy28AAx78EsT6AksAFB5HABQiGBqfoAGADstsBasAFB7hgA7LbwADHvwSxP4CSwAUI7cAFCbEGkIIAXQOy5wFhAwFgA8AAbFhgA7LPAWrABQkRXQOy5wFhAwFgA8AAbFhgA7LPkPkEsUCAksAFChTABQqHBqfpAF0DssQBYQMBYAPAAGxYYAOyzwFqwAUKNF0DssQBYQMBYAPAAGxYYAOyz8AAx+cEsUGAksAFDCHABQ19BpCDAF0DsucBYQMBYAPAAGxYYAOyzwFqwAUMSl0DsucBYQMBYAPAAGxYYAOyz5GPBLFCgJLABQ3gwAUObgan6wBdA7LEAWEDAWADwABsWGADss8BasAFDgldA7LEAWEDAWADwABsWGADss/AAMgQBLFDgJLABRCEwAURRwaQhABdA7LnAWEDAWADwABsWGADss8BasAFEKtdA7LnAWEDAWADwABsWGADss+RHASxRICSwAURqsAFEiYGp+0AXQOyxAFhAwFgA8AAbFhgA7LPAWrABRHNXQOyxAFhAwFgA8AAbFhgA7LPwADIOQSxRYCSwAUThcAFE9MGp+8AXQOyxAFgAcAAbFwBasAFE65gA7LbwADIZQSxRoCSwAUUIcAFFMgGp/IAYAOy2wFqwAUUT2ADstvAAMhlBLFHgJLABRUVwAUVbQan8wBdA7LEAWABwABsXAFqwAUVQ2ADstvAAMiMBLFIgJLABRW7wAUWkQan9gBgA7LbAWrABRXuYAOy28AAyIwEsUmAksAFFvvABRe3Bqf3AF0DsucBYQMBYAPAAGwYYAOyzwFqwAUXHl0DsucBYQMBYAPAAGwYYAOyz8AAyLMEsUqAksAFGB3ABRjHBqf5AF0DssQBYQMBYAPAAGwYYAOyzwFqwAUYPF0DssQBYQMBYAPAAGwYYAOyz8AAyNcEsUuAksAFGlfABRp/Bqf7AF0DssQBYAHAAGxcAWrABRprYAOy28AAyRUEsUyAksAFGs3ABRuHBqf/AGADstsBasAFGupgA7LbwADJFQSxTYCSwAUb1MAFHCIGqAAAXQOyxAFgAcAAbFwBasAFG/1gA7LbwADJTgSxToCSwAUccMAFHV4GqAQAYAOy2wFqwAUcnmADstvAAMlOBLFPgJLABR4twAUfnAaoBQBdA7LnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8BasAFHk9dA7LnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss/AAMl4BLFQgJLABSA6wAUg4gaoBwBdA7LEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8BasAFIFhdA7LEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss/AAMm0BLFRgJLABSVFwAUmvAaoCQBdA7LnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8BasAFJWpdA7LnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss/AAMn6BLFSgJLABSdawAUoCwaoCwBdA7LEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8BasAFJ3tdA7LEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss/AAMo2BLFTgJLABSv0wAUsHAaoDQBdA7LEAWABwABsXAFqwAUsCGADstvAAMp8BLFUgJLABSxqwAUs5QaoEABgA7LbAWrABSyHYAOy28AAynwEsVWAksAFLTLABS1gBqgRAF0DssQBYAHAAGxcAWrABS1JYAOy28AAyqQEsVaAksAFLa7ABS4zBqgUAGADstsBasAFLc5gA7LbwADKpASxV4CSwAUugMAFLqgGqBUAXQOyxAFgAcAAbFwBasAFLpRgA7LbwADKzwSxWICSwAUu9sAFL7YGqBkAYAOy2wFqwAUvE2ADstvAAMrP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YAHAAGxcAWrABWCqYAOy28AAz+MEsX6AksAFYSHABWHdBqhyAGADstsBasAFYVNgA7LbwADP4wSxf4CSwAViKsAFYm4GqHMAXQOyxAFgAcAAbFwBasAFYk5gA7LbwADQDgSxgICSwAVivMAFY8kGqHcAYAOy2wFqwAVi5WADstvAANAOBLGBgJLABWQWwAVkWgaoeABdA7LEAWABwABsXAFqwAVkOmADstvAANA7BLGCgJLABWSowAVliAaofABgA7LbAWrABWTRYAOy28AA0DsEsYOAksAFZdXABWX/Bqh9AF0DssQBYAHAAGxcAWrABWXqYAOy28AA0GUEsYSAksAFZk3ABWa2BqiAAGADstsBasAFZmtgA7LbwADQZQSxhYCSwAVnJMAFaCkGqIEAXQOy5wFhAwFgA8AAbBhgA7LPAWrABWdVXQOy5wFhAwFgA8AAbBhgA7LPwADQjASxhoCSwAVoj8AFaXUGqIMAXQOyxAFhAwFgA8AAbBhgA7LPAWrABWi8XQOyxAFhAwFgA8AAbBhgA7LPwADQvwSxh4CSwAVrUsAFa4AGqIYAXQOyxAFgAcAAbFwBasAFa2lgA7LbwADQ/wSxiICSwAVrzsAFbIYGqIoAYAOy2wFqwAVr7mADstvAAND/BLGJgJLABWzTwAVtDwaoiwBdA7LEAWABwABsXAFqwAVs8WADstvAANE4BLGKgJLABW1dwAVuQgaojwBgA7LbAWrABW2EYAOy28AA0TgEsYuAksAFbrLABW+uBqiQAF0DsucBYQMBYAPAAGwYYAOyzwFqwAVu6l0DsucBYQMBYAPAAGwYYAOyz8AA0WIEsYyAksAFcBrABXEZBqiSAF0DssQBYQMBYAPAAGwYYAOyzwFqwAVwTl0DssQBYQMBYAPAAGwYYAOyz8AA0ZUEsY2AksAFcxPABXQDBqiVAF0DsucBYQMCYAPAAGwfYAPAAGwfYAOyzwFqwAVzM10DsucBYQMCYAPAAGwfYAPAAGwfYAOyz8AA0cYEsY6AksAFdHPABXU3BqiXAF0DssQBYQMCYAPAAGwfYAPAAGwfYAOyzwFqwAV0k10DssQBYQMCYAPAAGwfYAPAAGwfYAOyz8AA0f8EsY+AksAFd2vABXinBqiaAF0DsucBYQMCYAPAAGwfYAPAAGwfYAOyzwFqwAV3jF0DsucBYQMCYAPAAGwfYAPAAGwfYAOyz8AA0jkEsZCAksAFeRfABXnbBqidAF0DssQBYQMCYAPAAGwfYAPAAGwfYAOyzwFqwAV5OF0DssQBYQMCYAPAAGwfYAPAAGwfYAOyz8AA0mYEsZGAksAFfAvABXw5BqifAF0DssQBYAHAAGxcAWrABXwiYAOy28AA0qAEsZKAksAFfIfABX2HBqijAGADstsBasAFfKdgA7LbwADSoASxk4CSwAV91MAFffoGqKQAXQOyxAFgAcAAbFwBasAFfedgA7LbwADSzQSxlICSwAV+SMAFfw4GqKgAYAOy2wFqwAV+ZGADstvAANLNBLGVgJLABX92wAWAQQaoqQBdA7LnAWEDAWADwABsH2ADss8BasAFf59dA7LnAWEDAWADwABsH2ADss/AANL3BLGWgJLABYClwAWBbQaoqwBdA7LEAWEDAWADwABsH2ADss8BasAFgMpdA7LEAWEDAWADwABsH2ADss/AANMqBLGXgJLABYMKwAWERAaorgBdA7LnAWEDAWADwABsGGADss8BasAFgzpdA7LnAWEDAWADwABsGGADss/AANNeBLGYgJLABYSqwAWFWQaosQBdA7LEAWEDAWADwABsGGADss8BasAFhNZdA7LEAWEDAWADwABsGGADss/AANOFBLGZgJLABYdWwAWHhgaoswBdA7LEAWABwABsXAFqwAWHbmADstvAANO2BLGagJLABYfUwAWIsQaotwBgA7LbAWrABYf1YAOy28AA07YEsZuAksAFiRvABYnQBqi4AF0DsucBYQMBYAPAAGwYYAOyzwFqwAWJPF0DsucBYQMBYAPAAGwYYAOyz8AA0+AEsZyAksAFijbABYrZBqi6AF0DssQBYQMBYAPAAGwYYAOyzwFqwAWKU10DssQBYQMBYAPAAGwYYAOyz8AA1BMEsZ2AksAFjInABY1EBqi9AF0DsucBYQMCYAPAAGwYYAPAAGxYYAOyzwFqwAWMqF0DsucBYQMCYAPAAGwYYAPAAGxYYAOyz8AA1EQEsZ6AksAFjbTABY4lBqi/AF0DssQBYQMCYAPAAGwYYAPAAGxYYAOyzwFqwAWNz10DssQBYQMCYAPAAGwYYAPAAGxYYAOyz8AA1G4EsZ+AksAFkCPABZEJBqjBAF0DsucBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyzwFq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xAFhAwJgA8AAbBhgA8AAbBhgA7LPwADZdQSxw4CSwAXBCMAFwTgGqRUAXQOyxAFgAcAAbFwBasAFwSBgA7LbwADZrASxxICSwAXBhsAFwe4GqRgAYAOy2wFqwAXBq2ADstvAANmsBLHFgJLABcJVwAXDCwapGQBdA7LnAWEDAWADwABsWGADss8BasAFwntdA7LnAWEDAWADwABsWGADss/AANnTBLHGgJLABcNuwAXEIAapGwBdA7LEAWEDAWADwABsWGADss8BasAFw5BdA7LEAWEDAWADwABsWGADss/AANn3BLHHgJLABcWTwAXGYQapHQBdA7LnAWEDAWADwABsGGADss8BasAFxcFdA7LnAWEDAWADwABsGGADss/AANooBLHIgJLABcbHwAXHgQapHwBdA7LEAWEDAWADwABsGGADss8BasAFxvFdA7LEAWEDAWADwABsGGADss/AANpMBLHJgJLABclEwAXKWgapIQBdA7LnAWEDAWADwABsGGADss8BasAFyYJdA7LnAWEDAWADwABsGGADss/AANp7BLHKgJLABcrEwAXLiAapIwBdA7LEAWEDAWADwABsGGADss8BasAFyv5dA7LEAWEDAWADwABsGGADss/AANqfBLHLgJLABc2NwAXOngapJQBdA7LnAWEDAWADwABsGGADss8BasAFzc1dA7LnAWEDAWADwABsGGADss/AANrNBLHMgJLABc8IwAXQAAapJwBdA7LEAWEDAWADwABsGGADss8BasAFz0RdA7LEAWEDAWADwABsGGADss/AANrxBLHNgJLABdHfwAXSBwapKQBdA7LEAWABwABsXAFqwAXR82ADstvAANsgBLHOgJLABdJVwAXS3gapLABgA7LbAWrABdJyYAOy28AA2yAEsc+AksAF0yvABdNTBqktAF0DssQBYAHAAGxcAWrABdM/YAOy28AA20oEsdCAksAF06HABdSJBqkxAGADstsBasAF075gA7LbwADbSgSx0YCSwAXU1sAF1QAGqTIAXQOyxAFgAcAAbFwBasAF1OtgA7LbwADbgwSx0oCSwAXVTsAF1gQGqTYAYAOy2wFqwAXVbGADstvAANuDBLHTgJLABdaiwAXYiQapNwBdA7LnAWEDAmADwABsGGADwABsGGADss8BasAF1tddA7LnAWEDAmADwABsGGADwABsGGADss/AANuwBLHUgJLABdkFwAXZzAapOgBdA7LEAWEDAmADwABsGGADwABsGGADss8BasAF2TpdA7LEAWEDAmADwABsGGADwABsGGADss/AANvdBLHVgJLABdyswAXc3AapPABdA7LEAWABwABsXAFqwAXcxGADstvAANwUBLHWgJLABd0qwAXeDgapQABgA7LbAWrABd1LYAOy28AA3BQEsdeAksAF3lvABd6LBqlBAF0DssQBYAHAAGxcAWrABd5zYAOy28AA3D4EsdiAksAF3tnABd/OBqlEAGADstsBasAF3vpgA7LbwADcPgSx2YCSwAXgG8AF4EsGqUUAXQOyxAFgAcAAbFwBasAF4DNgA7LbwADcdwSx2oCSwAXgmcAF4WQGqUkAYAOy2wFqwAXgumADstvAANx3gOcGsdyAkZjCmMmaIQABoCIAAAABA5jWmiEAAAABAQGY2wAAAIFMYAPAAGxYAABgA8AAbBgBPgFKmdcBIxyZ4oCZ3sAWUkInAQABKwDAAGxzKx6Z87hiAwADGpoKwABsbYCaEMAWUkIamhW4YAABYAPAAGwYBrHdgJGaappxm3EAAalKAAAAAQOafZtxAAAAAQEBmosAAACEaV0DwABsGQFgA8AAbBgAAGADwABsGAE+BU6ao5qqAACClmADwABtBgEfmrDAAG0MAAAAAEWawgGay5rNAACB1GADwABsHwGTARya1IKa0sAWUvOBOgEAARya4xaa3ICa1sAWUrWA4MAAbGpEAQABlADAAGzhAMAAbIUBiprowBZS8xya6YKa6MAWUvOBPwEAAZQAwABsiD4CPRya+oGa88AWUtVFAQABJ6lLAMAAbS49HJsTgZsMwBZS1YFlAQABHJsggJsbwBZStSkBAAGCmyHAFlLzAMAAbLgAwABtDz0cmzOBmyzAFlLVRQEAASepSwDAAG0uPRybSoGbQ8AWUtVFAQABFptWgJtQwBZStYcPwABtOgDAAG0uSptfASSbbwGBm2jAFlLVBrHegJGdOZ1AnoIAAYdBAAAAAQOdXJ6CAAAAAQEBnWQAAACBiGADwABsGAAAYAPAAGwYAT4FTp17nYUAAIdCXQPAAGwZAWADwABsGAEcnYyAnYfAFlQCh0MBAAEngfoAwABtPEmdmiIcna8WnaiBnZ7AFlQbgODAAGxqgToBAAGVAMAA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wBZzuABKwAEFoQEfwAEFrLLaAwABasABBbRdA7LEAWEDAWADwABsGGADss/AAGzkAoCWJMABBiADJ6msgMABBf7AFnO4J6loga0ywAEGM2ADwABsGFsBJ4GIgMABBjzAFnO4BrIDgJLAAQr+wAELBsABDE4AAamtrcwAAAABA8ABCyTAAQxOAAAAAgICwAELLAAAAId9YAPAAGwYAMABCzsAAACfW2ADwABsGAAAYAOyzwE+A0nAAQtIFsABC1OAwAELTMAWdJmBVsAAbI09MMABC1wnkrw/ScABC3oWwAELhoHAAQt+wBZ0qYFWwABsjT0wwAELjyeSvD9KwAELrQEfwAELuLLaAwABasABC8BdA7LEAWEDAmADwABsGGADwABsGGADss/AAG1sAoCWJMABDBgFJ6mugMABC/7AFnSZJ6mvgcABDAzAFnSpJ4D3ga0ywAEMJWADwABsGFsCJ4d9gMABDDDAFnSZJ59bgcABDEPAFnSpBrIEgJLAARNSwAETWsABFUgAAamwrcwAAAABA8ABE3zAARVIAAAAAgICwAEThAAAAIGIYAPAAGwYAMABE5EAAACHfWADwABsGAAAYAOyzwE+BEnAAROdFsABE6aAwAETocAWda2BVsAAbI09MMABE68nkqE/PYjAARPLwBZ1rR7AARPSsd4BAAGAwAET78AWda0AScABE/gWwAEUA4HAARP8wBZ1vYFWwABsjT0wwAEUDCeSvD9KwAEUKgEfwAEUNbLaBAABasABFD1dA7LEAWEDAmADwABsGGADwABsGGADss/AAG45A4CWJMABFKAFJ5OCgMABFHHAFnWtJ6mxgcABFJTAFnW9J5EkkSgnofKBrTLAARUlYAPAAGwYWwIngYiAwAEVLsAWda0nh32BwAEVPsAWdb0GsgWAksABF+7AARf2wAEZDgABqbKtzAAAAAEDwAEYGMABGQ4AAAABAQHAARggAAAAgYhgA8AAbBgAAGADss8BPgNJwAEYKhbAARgzgMABGC7AFnbkgVbAAGyNPTDAARg8J5KhPz2IwAEYWMAWduQewAEYX7HeAQABgMABGHzAFnbkAErAARiFAR/AARiQstoDAAFqwAEYmF0DssQBYQMBYAPAAGwYYAOyz8AAbqMCgJYkwAEY6gMnkqaAwAEYx8AWduQnqbOBrTLAARj9YAPAAGwYWwEn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HsACuh+x3gEAAYDAAro8wBa2kwBKwAK6RQEfwAK6ULLaBAABasACulhdA7LEAWEDAWADwABsGGADss/AAJSRA4CWJMACutQDJ5KmgMACupHAFraTJ6pgkSgnpH6BrTLAArseYAPAAGwYWwEngYiAwAK7J8AWtpMGskmAksACv7jAAr/AwALCGAABqmGtzAAAAAEDwAK/48ACwhgAAAADAwPAAr/wAAAAgYhgA8AAbBgAwAK//QAAAJMHYAPAAGwYAMACwAsAAACTDmADwABsGAAAYAOyzwE+B0nAAsAWFsACwB+AwALAGsAWt3mBVsAAbI09MMACwCgnkqE/PYjAAsBEwBa3eR7AAsBLsd4BAAGAwALAaMAWt3kAScACwHEWwALAe4HAAsB1wBa3iYFWwABsjT0wwALAhCeSoT89icACwKDAFreJHsACwKix3gEAAYHAAsDFwBa3iQBJwALAzxbAAsDZgsACwNPAFreZgVbAAGyNPTDAAsDiJ5KhPz2KwALA/sAWt5kewALBBrHeAQABgsACwSPAFreZAErAAsEtAR/AAsE4stoDAAFqwALBQF0DssQBYQMDYAPAAGwYYAPAAGwYYAPAAGwYYAOyz8AAlRkCgJYkwALB1AcnqmKAwALBjcAWt3knqYmBwALBmsAWt4knqmOCwALBycAWt5knkSSBrTLAAsHnYAPAAGwYWwMngYiAwALB8MAWt3knkweBwALB/8AWt4knkw6CwALCD8AWt5kGskqAksACxrbAAsa+wALIcgABqmStzAAAAAEDwALG3cACyHIAAAADAwPAAsblAAAAgYhgA8AAbBgAwALG7wAAAKl+YAPAAGxYAMACxvkAAACp6GADwABsWAAAYAOyzwE+BUnAAscEFsACxw2AwALHCMAWuTiBVsAAbI09MMACxxYnkqE/PYjAAscywBa5OB7AAsc5sd4BAAGAwALHVsAWuTgATsACx2bAAsdqAACBTGADwABsGAEewALHbLHcAQABgcACx3rAFrlIAE7AAseKwALHjwAAqelgA8AAbBgBHsACx5Gx3AEAAYLAAsefwBa5WABKwALHqQEfwALHtLLaAwABasACx7xdA7LEAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAJWwAoCWJMACyDIHJ6plgMACx/zAFrk4J6org8ACyAzAFrmyJ6pm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AAGAwARDtMAW8j8AScAEQ70WwARDx4HABEPBwBbyT4FWwABsjT0wwARD0CeSoT89icAEQ+zAFvJPHsAEQ/Sx3gEAAYHABEQRwBbyTwBKwAREGwEfwAREJrLaAwABasAERC5dA7LEAWEDAmADwABsGGADwABsGGADss/AALWYAoCWJMAERMwHJ5KmgMAERG3AFvI/J4D3gcAERHXAFvJPJ6rqgMAERKDAFvI/J6rrga0ywARE32ADwABsGFsCJ4GIgMAEROjAFvI/J5MHgcAERPfAFvJPBrKBgJLABEdAwARHSMAESDYAAarsrcwAAAABA8AER17ABEg2AAAAAQEBwARHZgAAAIGIYAPAAGwYAABgA7LPAT4DScAER3AWwARHeYDABEd0wBbzm4FWwABsjT0wwARHgieSoT89iMAER57AFvObHsAER6Wx3gEAAYDABEfCwBbzmwBKwARHywEfwARH1rLaAwABasAER95dA7LEAWEDAWADwABsGGADss/AALXzAoCWJMAESBgDJ5KmgMAESAHAFvObJ6rtga0ywARIJWADwABsGFsBJ4GIgMAESC7AFvObBrKCgJLABE0dwARNJcAETf8AAarurcwAAAABA8AETUTABE3/AAAAAQEBwARNSwAAAKlqYAO+TQAAYAOyzwE+Ak7ABE1dwARNZAAAqWtgA8AAbBgBFsAETWyAwARNZsAW9Hypa75nSsAETXYBH8AETYGy2gMAAWrABE2JXQOyxAFhAwFgA75NYAOyz8AAtpgCgJYkwARN2QMnkqaBwARNtcAW9JMnqu+BrTLABE3sYAPAAGwYWwEnqWqAwARN9sAW9HwGsoOAksAEUK7ABFC2wARRsQABqvCtzAAAAAEDwARQ2cAEUbEAAAABAQHABFDhAAAAh31gA8AAbBgAAGADss8BPgJJwARQ7RbABFD4gMAEUPHAFvU+gVbAAGyNPTDABFEBJ5K8P0rABFEfAR/ABFEqstoDAAFqwARRMl0DssQBYQMBYAPAAGwYYAOyz8AAtugCgJYkwARRiQKAwARRYcAW9T4nqvGBrTLABFGcYAPAAGwYWwEnh32AwARRp8AW9T4GsoSAksAEVkvABFZTwARXgwABqvKtzAAAAAEDwARWd8AEV4MAAAABAQHABFZ/AAAAgYhgA8AAbBgAAGADss8BPgNJwARWiRbABFaSgMAEVo3AFvX+gVbAAGyNPTDABFabJ5KhPz2IwARWt8AW9f4ewARWvrHeAQABgMAEVtvAFvX+AErABFbkAR/ABFbvstoDAAFqwARW910DssQBYQMBYAPAAGwYYAOyz8AAt2oCgJYkwARXXwMnqvOAwARXOMAW9f4nqvSBrTLABFdyYAPAAGwYWwEngYiAwARXe8AW9f4GsoWAksAEWiHABFopwARbTQABqvWtzAAAAAEDwARaT8AEW00AAAABAQHABFpXAAAAgYhgA8AAbBgAAGADss8BPgNJwARaYRbABFpqgMAEWmXAFvbfgVbAAGyNPTDABFpzJ5KhPz2IwARaj8AW9t8ewARalrHeAQABgMAEWrPAFvbfAErABFq8AR/ABFrHstoDAAFqwARaz10DssQBYQMBYAPAAGwYYAOyz8AAt7wCgJYkwARbKQMnqvaAwARbD8AW9t8nqveBrTLABFs8YAPAAGwYWwEngYiAwARbRcAW9t8GsoaAksAEXcDABF3IwARe7QABqvitzAAAAAEDwARd6MAEXu0AAAABAQHABF3wAAAAgYhgA8AAbBgAAGADss8BPgNJwARd+hbABF4DgMAEXf7AFvfAgVbAAGyNPTDABF4MJ5KhPz2IwAReKMAW98AewAReL7HeAQABgMAEXkzAFvfAAErABF5VAR/ABF5gstoDAAFqwAReaF0DssQBYQMBYAPAAGwYYAOyz8AAuA8CgJYkwAReyQMnqvmAwARen8AW98AnqvqBrTLABF7cYAPAAGwYWwEngYiAwARe5cAW98AGsoeAksAEYXTABGF8wARilQABqvutzAAAAAEDwARhnsAEYpUAAAABAQHABGGmAAAAgYhgA8AAbBgAAGADss8BPgNJwARhsBbABGG5gMAEYbTAFvihgVbAAGyNPTDABGHCJ5KhPz2IwARh3sAW+KEewARh5bHeAQABgMAEYgLAFvihAErABGILAR/ABGIWstoDAAFqwARiHl0DssQBYQMBYAPAAGwYYAOyz8AAuGECgJYkwARicQMnqvyAwARiV8AW+KEnqveBrTLABGKEYAPAAGwYWwEngYiAwARijcAW+KEGsoiAksAEZSHABGUpwARmWAABqv2tzAAAAAEDwARlTsAEZlgAAAABAQHABGVWAAAAgYhgA8AAbBgAAGADss8BPgNJwARlYBbABGVpgMAEZWTAFvmCgVbAAGyNPTDABGVyJ5KhPz2IwARljsAW+YIewARllbHeAQABgMAEZbLAFvmCAErABGW7AR/ABGXGstoDAAFqwARlzl0DssQBYQMBYAPAAGwYYAOyz8AAuLQCgJYkwARmNAMnqv6AwARmDcAW+YInqvSBrTLABGZHYAPAAGwYWwEngYiAwARmUMAW+YIGsomAksAEaPzABGkEwARqJwABqv+tzAAAAAEDwARpK8AEaicAAAABAQHABGkzAAAAgYhgA8AAbBgAAGADss8BPgNJwARpPRbABGlGgMAEaUHAFvpjgVbAAGyNPTDABGlPJ5KhPz2IwARpa8AW+mMewARpcrHeAQABgMAEaY/AFvpjAErABGmYAR/ABGmjstoDAAFqwARpq10DssQBYQMBYAPAAGwYYAOyz8AAuQYCgJYkwARqAwMnqwCAwARp6cAW+mMnqveBrTLABGoWYAPAAGwYWwEngYiAwARqH8AW+mMGsoqAksAEbK7ABGy2wARt8wABqwGtzAAAAAEDwARs2MAEbfMAAAABAQHABGzgAAAAgYhgA8AAbBgAAGADss8BPgNJwARs6hbABGzzgMAEbO7AFvtEgVbAAGyNPTDABGz8J5KhPz2IwARtGMAW+0QewARtH7HeAQABgMAEbTzAFvtEAErABG1FAR/ABG1QstoDAAFqwARtWF0DssQBYQMBYAPAAGwYYAOyz8AAuVkCgJYkwARtzwMnqwKAwARtp8AW+0QnqwOBrTLABG3iYAPAAGwYWwEngYiAwARt68AW+0QGsouAksAEcKfABHCvwARx7QABqwStzAAAAAEDwARw08AEce0AAAABAQHABHDbAAAAgYhgA8AAbBgAAGADss8BPgNJwARw5RbABHDugMAEcOnAFvwlgVbAAGyNPTDABHD3J5KhPz2IwARxE8AW/CUewARxGrHeAQABgMAEcTfAFvwlAErABHFAAR/ABHFLstoDAAFqwARxU10DssQBYQMBYAPAAGwYYAOyz8AAuasCgJYkwARxyQMnqwWAwARxocAW/CUnqwOBrTLABHHcYAPAAGwYWwEngYiAwARx5cAW/CUGsoyAksAEezTABHs8wAR9NgABqwatzAAAAAEDwAR7aMAEfTYAAAABAQHABHtwAAAAgYhgA8AAbBgAAGADss8BPgNJwAR7ehbABHuD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wAClB8AXsm82AQABhsAApRPAF7PNAMAAbH09HMAApSCDwAClF8AXspk2AQABhsAApSTAF7PNAMAAbEc/P0PAAKVeFsAApW6DwAClZcAXspkiwABsIj4ETsAApYrAAKWMAACBGGADgzIBHMAApZeDwACljsAXspmDkwAAAADAAG0EPgJOwAClywAAADxdA8AAbEoBYAOKQQEWwAClyx4AwABsLwEBXQPAAGwgAWADikEBFsAApcuFwAClycAXtFCDVYNFAD3AAGxLRQAAARzAAKXLhgDAF7R8PgAAAADAAGxNAD4CTsAApbwAAACDU2ADikEBFsAApd2GAMAXtHxAwABsTz4BScAApekcwACl9YLAAKXtwBeybzYBAAEWwACmA4fAAKX5wBe03YLTikYAwABsfT4BPRzAAKYmg8AAph3AF7KZNgEAARbAAKY0h8AApirAF7TdgtOKRgDAAGxHP0nAAKZeIRzAAKZwFsAApmSFwACmYsAXtFCDVINEJwEAASsAikw+AUnAAKaFHMAAppGCwACmicAXsm82AQABFsAApqMWwACml4XAAKaVwBe0UINUg0SC04pGAMAAbH0+AT0cwACmxoPAAKa9wBeymTYBAAEWwACm2BbAAKbMhcAApsrAF7RQg1SDRILTikYAwABsRz8/ScAApwIhHMAApxIWwACnCIXAAKcGwBe0UINTg0MnAQABKwCKTD4BScAApyccwACnM4LAAKcrwBeybzYBAAEWwACnQxbAAKc5hcAApzfAF7RQg1ODQ4LTikYAwABsfT4BPRzAAKdmg8AAp13AF7KZNgEAARbAAKd2FsAAp2yFwACnasAXtFCDU4NDgtOKRgDAAGxHPz8+Ak7AAKgXAAAAPF0DwABsSgFgA4MyARbAAKgXHgDAAGwvAQFdA8AAbCABYAODMgGCwACoF8AXsm8APcAAbEtFAAABHMAAqBeFAMAXtoU+AAAAAMAAbE0APgJOwACoEgAAAIEYYAODMgEWwACoIIUAwBe2hUDAAGxPPgJOwACoMsAAqDoAAIEVYAOCkgEWwACoPobAAKg8wBe23YOJg2VJwACo4iIcwACpBRbAAKj8FsAAqPUWwACo5i6r27NGq/nAAEIRq/3AAEf2gYoBAAEWwACpGYfAAKkRwBe2/oFngpQAwABsnQAiHMAAqUsWwACpNC6r7LNXJwEA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YAOCkgEWwADQNIDAANAswBfZeoEVwABBFT4CTsAA0F4AAAA8XQPAAGxKAWADgucBFsAA0F4eAMAAbC8BAV0DwABsIAFgA4LnARbAANBehcAA0FrAF9qYhDKCpQA9wABsS0UAAAEcwADQXoYAwBfawD4AAAAAwABsTQA+Ak7AANBSAAAAijxgA4LnARbAANBlhgDAF9rAQMAAbE9BPgROwADQccAA0H0AAKx0YAPAAGxYARzAANB/LqwzAwADFsAA0JKFwADQjsAX2piDbYKVh8AA0JvAF9shgcAA0KHAF9mKALNxScAA0LciIRzAANDFhMAA0LvAF9nXJwEAASsAwABsXgAcwADQ2oTAANDQwBfZ1ysBAAEUwADQ48AX20MIAADAAGx4QsAA0PEAPz0cwADRDYLAANEBwBfZmDUBAAEUwADRFMAX20MIAADAAGyYPTXAANEoAAABAF0DwABsXwJgA8AAbFhgA4uFAYPAANEowBfZsyMcwADRKBTAANEowBfb9gkAJwEAASsAwABsXiscwADROhTAANEowBfb9gkANQEAARTAANFBwBfbQwgAAMAAbJgBYAOLhQazdYCVwADSXcAA0mLAANPcAACsSwAAAAEDwADSjcAA09wAAAADAgPAANKdAAAAgRlgA4KSAMAA0rAAAACr7mADtVUAwADSzwAAAKxyXQPAAGxXAWADwABsWAFqAGABwABsXAIAXAE+Aj0cwADS/BbAANLhLqvls1E1AQABFsAA0weAwADTA8AX3IaDbYKVAMAAbJg+Ak7AANNLAAAAPF0DwABsSgFgA4LnARbAANNLHgDAAGwvAQFdA8AAbCABYAOC5wEWwADTS4DAANNHwBfchoQygqUAPcAAbEtFAAABHMAA00uDAMAX3PU+AAAAAMAAbE0APgJOwADTPwAAAIo8YAOC5wEWwADTUoMAwBfc9UDAAGxPPgJOwADTXsAA02oAAKx0YAPAAGxYARzAANNsLqwzAwADFsAA03+AwADTe8AX3IaDbYKVhMAA04jAF91WgcAA047AF9yUALNxPRzAANO/FsAA06Quq+WzUTUBAAGFwADTxsAX3XcAwABsmAazdoCVwADT+MAA0/zAANatAACsWQAAAAEDwADUCsAA1q0AAAAEBATAANQVAAAArFhdA8AAbBkBYAPAAGwfAMAA1DEAAACr7mAD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AWADwABsVgAAAQSzjICVwAESV8ABEl4JgJYAYAPAAGwYAAEFs5CAlcABEmPAARJpwAESkwEAAAPAARKFwAESkwAAAAEBAcABEosAAASAlmADwABsGAAAYAOzigE/AggBs4yAAMAYFq4JAcABEmnAAGxaAAAAAAEGs46AlcABEpjAARKfwAEStAAAgVMAAAABA8ABEqfAARK0AAAAAAAAAGADwABsGAFKwAESrQEWwAESrS6AlrOMAAAYFt8AGBcfAAAAAQKzkYCVwAESucABEr/AARNFA6yeAAABYAPAAGxWAAADBLOTgJXAARLlwAES/RisFABgA4RLASsEs5SAlcABEwvAARMbGICNAGADiyoBKwSzlYCVwAETKcABE0MYrF0AXQPAAGwZAWADwABsHwErAQWzlwAAAAAEAAADAAAAAAAAAAAAYAOzkQE/AQkBAMAAbFoAAAAAAAAAGBfCAAAAAAKzmICVwAETSMABE07AARVjA6yfAAABYAPAAGxWAAAEBLOagJXAARN6wAETjAmsRwBdA8AAbFcBYAPAAEEJAASzm4CVwAETq8ABE74JrE0AXQPAAGwZAWADwABBCQAEs5yAlcABE83AARPuCaxOAGADwABsWwAEs52AlcABFA3AARQcCav7AF0DwABsGQFgA8AAQQkAAQWzn4CVwAEUIcABFCHAARVhAAAAA8ABFC7AARVhAAAABAQEwAEUNAAABKxHXQPAAGxXAWADwABBCQDAARRNAAAErE1dA8AAbBkBYAPAAEEJAMABFG0AAASsTmADwABsWwDAARSVAAAEq/tdA8AAbBkBYAPAAEEJAABgA7OYAT8JCAGzmoAAwBgYhAgBs5uBAMAYGJsIAbOcggDAGBiyCAGznYMAwBgYwgwAQCEcwAEUyIDAARS1wBgYhCcBAAErAMAAbF7AARS1wAEUzwAMAEAhHMABFPWBwAEU4cAYGJsnAQABKwDAAGxiwAEU4cABFPwADABAIRzAARUwgsABFQ7AGBiyJwEAASsAwABsXsABFQ7AARU3AAwAQCEcwAEVWYPAARVJwBgYwicBAAErAMAAbGLAARVJwAEVYAAJAcABFCHAAGxaAAAAAAAAABgZrAAAAAACs6CAlcABFWbAARVswAEW+wOsoAAAAWADwABsVgAAAwSzooCVwAEVo8ABFbAJrCcAXQPAAGxXAWADwABBCQAEs6OAlcABFc7AARXoCaweAF0DwABsVwFgA8AAQQkABLOkgJXAARX7wAEWCQmr9gBdA8AAbFcBYAPAAGxYAAEFs6aAlcABFg7AARYOwAEW+QAAAAPAARYmwAEW+QAAAAMDA8ABFjMAAASsJ10DwABsVwFgA8AAQQkAwAEWRwAABKweXQPAAGxXAWADwABBCQDAARZoAAAEq/ZdA8AAbFcBYAPAAGxYAABgA7OgAT8HCAGzooAAwBgaVggBs6OBAMAYGm0IAbOkggDAGBqEDABAIRzAARaVgMABFofAGBpWJwEAASsAwABsXsABFofAARacAAwAQCEcwAEWyYHAARauwBgabScBAAErAMAAbF7AARauwAEW0AAMAEAhHMABFvGCwAEW4sAYGoQnAQABKwDAAGxewAEW4sABFvgACQHAARYOwABsWgAAAAAAAAAYGz8AAAAAArOngJXAARb+wAEXBMABGQ0DrKEAAAFgA8AARl8AAWADnGMBBLOpgJXAARdowAEXfxisCQBdA8AAbFcBYAODMgErAQWzr4CVwAEXg8ABF4PAARhHAAAAA8ABF5rAARhHAAAABAQEwAEXpgAAAID4YAOT2wDAARe3AAAAq6JgA8AAbFsAwAEX2QAAAKyiYAPAAEINAMABF/MAAACr7mADtVUAAGADs6cBPwEJAMABGArAAEaVBAAEgMABGBDAGBuugcABGBzAGBu8gsABGC3AGBvMg8ABGDnAGBvcAAIGs6uAlcABGEzAARhpwAEYiQEAieQAAAABA8ABGILAARiJAAAAAAAAAGADnGMBSsABGIUBLgazrYCVwAEYjsABGJ/AARkLAACWcAFqwAEYj2ADwABsVoC1AAABA8ABGKfAARkLAAAAAQEBwAEYrgAAAIEYYAODMgAAXAE+Aj0jHMABGM8WwAEYty6sCbOpJwEAASsAwABsXhfAARi3LqwJHsABGNfAAGx8AAFgA4MyAACzqSsBXQPAAGxXAWADgzI9HMABGQEWwAEY6S6sCbOpNgEAAYDAARkFwBgcjwDAAGx9AAAYHCUAGBxaABgdBwAAAAIAAAEGsz2AlcABEJ3AARChwAER4gABrKMAAAABA8ABEKvAARHiAAAAAgICwAEQsAAAAKykYAPAAGxYAMABEMcAAACKPGADgucAAGADwABsWAE+AUs+AUrA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AAAAtLFKwADQeQE1wADQhAAAAQBgA4UiAR/AANCEhSwBAAEcwADQli6tNgAAAAC0aQA1wADQvQAAAQBcARfAANC9g8AA0ITAGQWEhAGCwADQysAZBVyCWYPAANCEwBkFhAHAANDhasAA0OFgA8AAbB+ClQA+A07AAND6wADRAQAAhApgA8AAbB8BHMAA0QMurXwAAAAAtLE9HMAA0RkuhvsAAAAAtEpKwADRYgE1wADRbQAAAQBgA4UtAR/AANFthTgCAAIcwADReS6tpgAAAAC0kBzAANGSLq2rAAAAALSmADXAANG0AAABAFwBF8AA0bSDwADRbcAZBiaEAYLAANHBwBkF74JZg8AA0W3AGQYmAcAA0dhqwADR2GADwABsH4WnAD4ETsAA0fzAANICAACDKGADwABsHwEcwADSDIDAANIEwBkEMIH6AQABasAA0hJgA8AAbB+CgADAAGzeTsAA0jbAANI9AACECmADwABsHwEcwADSPy6tfAAAAAC0sT0cwADSVS6G+wAAAAC0SkrAANKeATXAANKpAAABAGADhS0BH8AA0qmFOAEAARzAANLCFsAA0rUurQ20MCkBAAGCwADSw8AZBp8AwABsuAA1wADSzAAAAQBcARfAANLMhMAA0qnAGQcPhAGDwADS2cAZBtiCWYTAANKpwBkHDwHAANLwasAA0vBgA8AAbB+CqgA+A07AANMJwADTEAAAhApgA8AAbB8BHMAA0xIurXwAAAAAtLE9HMAA0yguhvsAAAAAtEpKwADTcQE1wADTfAAAAQBgA4U5AR/AANN8hUQCAAIcwADTiC6tpgAAAAC0kBzAANOhLq0uAAAAALSUADXAANO/AAABAFwBF8AA07+DwADTfMAZB8SEAYLAANPMwBkHjYJZg8AA03zAGQfEAcAA0+NqwADT42ADwABsH4eGAD4ETsAA1AfAANQNAACDKGADwABsHwEcwADUF4DAANQPwBkEMIH6AQABasAA1B1gA8AAbB+CgADAAGzeTsAA1EHAANRIAACECmADwABsHwEcwADUSi6tfAAAAAC0sT0cwADUYC6G+wAAAAC0SkrAANSpATXAANS0AAABAGADhTkBH8AA1LSFRAIAAhzAANTNFsAA1MAurQ20MCkBAAGCwADUzsAZCD0AwABsuBzAANTWLq0uAAAAALSUADXAANT0AAABAFwBF8AA1PSEwADUtMAZCK2EAYPAANUBwBkIdoJZhMAA1LTAGQitAcAA1RhqwADVGGADwABsH4KJAD4CTsAA1THAANU4AACECmADwABsHwEcwADVOi6tfAAAAAC0sUrAANVQATXAANVbAAABAGADhUUBH8AA1VuFVgMAAxzAANWALq0uAAAAALSUHMAA1ZIuhwAAAAAAtHscwADVni6tbgEAAAGH2ym0eAA1wADV0AAAAQBcARfAANXQg8AA1VvAGQlhhAGCwADV3cAZCTmCWYPAANVbwBkJYQHAANX0asAA1fRgA8AAbB+CngA+Ak7AANYNwADWFAAAhApgA8AAbB8BHMAA1hYurXwAAAAAtLFKwADWLAE1wADWNwAAAQBgA4VXAR/AANY3hWkEAAQcwADWTy6tLgAAAAC0lBzAANZhLocAAAAAALR7HMAA1nkurS4AAAAAtJQcwADWiy6tbgEAAAGH2ym0eAA1wADWvQAAAQBcARfAANa9g8AA1jfAGQoThAGCwADWysAZCeuCWYPAANY3wBkKEwHAANbhasAA1uFgA8AAbB+HigA+A07AANb/wADXBgAAhApgA8AAbB8BHMAA1wgurXwAAAAAtLE9HMAA1x4urY8BAAFqwADXQWADwABsHwMAtIZKwADXVgE1wADXYQAAAQBgA4WgAR/AANdhhbACAAIcwADXiy6HAAAAAAC0exzAANeXLq1uAQAAAYfbKbR4ADXAANfJAAABAFwBF8AA18mDwADXYcAZCu6EAYLAANfWwBkKq4JZg8AA12HAGQruAcAA1+1qwADX7WADwABsH4eNAD4DTsAA2AvAANgSAACECmADwABsHwEcwADYFC6tfAAAAAC0sT0cwADYKi6tjwEAAWrAANhNYAPAAGwfAwC0hkrAANhiATXAANhtAAABAGADhbEBH8AA2G2FwgMAAxzAANiXLocAAAAAALR7HMAA2KMurS4AAAAAtJQcwADYtS6tbgEAAAGH2ym0eAA1wADY5wAAAQBcARfAANjng8AA2G3AGQuthAGCwADY9MAZC2qCWYPAANhtwBkLrQHAANkLasAA2QtgA8AAbB+CpwA+Ak7AANkqwADZMQAAhApgA8AAbB8BHMAA2TMurXwAAAAAtLFKwADZSQE1wADZVAAAAQBgA4VqAR/AANlUhXoCAAIcwADZfy6tLgAA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HwEcwAEQBS6tfAAAAAC0sUrAARAbATXAARAmAAABAGADiKcBH8ABECaIsAEAARzAARA2Lq2QAAAAALSTADXAARBPAAABAFwBF8ABEE+CwAEQJsAZOkuEAYHAARBcwBk6I4JZgsABECbAGTpLAcABEHNqwAEQc2ADwABsH4hIAD4DTsABEI/AARCUAACE+GADh/gBHMABEJYurZ0AAAAAtJpOwAEQs8ABELkAAIQwYAPAAGwfARzAARC7Lob5AAAAALRJSsABEM8BH8ABENqIvAMAAoHAARDjwBk6thzAARDpLq22AAAAALScAYQ7HMABEREcwAERDYLAAREHwBk61oH6AQABlQDAAGzeJwEAAZUAwABsMgHAAREnasABESdgA8AAbB+ISwA+AUrAARE7AR/AARFGiNMCAAIcwAERUS6tnQAAAAC0mhzAARFiLq2dAAAAALSaAAHAARGDasABEYNgA8AAbB+ITgA+A07AARGfwAERpgAAhApgA8AAbB8BHMABEagurXwAAAAAtLFOwAERwsABEcgAAIQwYAPAAGwfARzAARHKLob5AAAAALRJSsABEd4BNcABEekAAAEAYAOI1AEfwAER6YjmAwABHMABEfgurS4AAAAAtJQChikhHMABEkgcwAESKYLAARIjwBk7w4H6AQABasABEjpgA8AAbB8DAMAAbN4nAQABkwDAAGwyhiohHMABEoYcwAESaoLAARJkwBk7w4H6AQABasABEntgA8AAbB+FBADAAGzeJwEAAZMAwABsMjXAARKYAAABAFwBF8ABEpiDwAER6cAZO+uEAYHAARKlwBk7oYJZg8ABEenAGTvrAcABErxqwAESvGADwABsH4hRAD4DTsABEt3AARLmAACFFGADiOcBHMABEugura4AAAAAtLA9HMABExkWwAETCy6tDbQwNgEAAYHAARMdwBk8wwDAAGxHSsABE1oBgcABE2HAGTzDAcABE3pqwAETemADwABsH4hUAD4FTsABE5vAAROiAACECmADwABsHwEcwAETpC6tfAAAAAC0sU7AARO+wAETxwAAhRRgA4jnARzAARPJLq2uAAAAALSwPRzAARP6FsABE+wurQ20MDYBAAGCwAET/sAZPUsAwABsR07AARQ/wAEUSAAAhMdgA4TuARzAARRKLocDAAAAALSNSsABFGYBNcABFHEA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ASLFYAOJnIY4AcABIuJqwAEi4mADwABsH4hdAD4BSsABIvcBasABIwRgA4lkwADczQHAASMiasABIyJgA8AAbB+IYAA+AUrAASM3AWrAASNEYAOJcoWxAcABI2JqwAEjYmADwABsH4hjAD4BSsABI3QBasABI4FgA4mAjXsBwAEjnGrAASOcYAPAAGwfiFoAPgJOwAEjs8ABI8QAAK3AYAPAAGwfARzAASPGLob5AAAAALRJSsABI9oBH8ABI+WJmwEAARzAASQBasABI/tdA8AAbBkBYAOJR4cPKQEAAYHAASQCwBlMWwDAAGy4AAHAASQlasABJCVgA8AAbB+IaQA+Ak7AASRAwAEkUQAArcBgA8AAbB8BHMABJFMuhvkAAAAAtElKwAEkZwEfwAEkcom9AwADHMABJIwurTAAAAAAtHccwAEkwGrAASS6XQPAAGwZAWADiUeHDykBAAGBwAEkwcAZTMwAwABsuBzAASTULq2YAAAAALSjAAHAAST4asABJPhgA8AAbB+IZgA+Ak7AASUZwAElKgAArcBgA8AAbB8BHMABJSwuhvkAAAAAtElKwAElQAEfwAElS4m9AwADHMABJWUurTAAAAAAtHccwAElmWrAASWTXQPAAGwZAWADiUeHDykBAAGBwAElmsAZTVkAwABsuGrAASWtXQPAAGwZAWADiVWE8gABwAEl0WrAASXRYAPAAGwfiG8APgxOwAEl68ABJgQAAK2ZYAPAAGwfARbAASYZFsABJgYurRK0NYDgwABsak7AASYtwAEmPgAArcBgA8AAbB8BHMABJkAuhvkAAAAAtElOwAEmWMABJmcAAINjXQPAAGwZAWADiiYBHMABJmkurYQAAAAAtKhOwAEmlcABJqwAAITlYAPAAGwfARzAASauLob7AAAAALRKTsABJsbAASbaAACtwWADwABsHwEcwAEm3C6G+wAAAAC0Sk7AASb0wAEm/wAAhVtdA8AAbBkBYAOJVQEcwAEnAS6tmAAAAAC0o07AASchwAEnJwAAhSNdA8AAbBkBYAOJ7gEcwAEnKS6tvgAAAAC0pE7AASdKwAEnVgAAhltgA4lVARzAASdYLq2rAAAAALSmQBzAASeeHMABJ48WwAEniIbAASd9wBlOoIDgwABsaoE/AQABFsABJ5eHwAEnkcAZTseA4MAAbGoAwABsiCcBAAGFwAEnocAZTn4AwABsMsABJ33AASe0AE7AASfDwAEnzgAAhQNgA4lVARzAASfQLocBAAAAALSnPRfAASf7FsABJ+gurRK0NYDggcABKATAGU3qwABs9UrAASgmAR/AASgxidkHAAOGwAEoS8AZTqAUwAEoV8AZT2YJABzAASh1asABKG9dA8AAbBkBYAOJR4cPKQEAAYLAASh2wBlOEwDAAGy4BINjg8ABKKXAGU41hOWEwAEo2cAZTlyEcYfAASkOwBlOx4ZbJsABKS4BFMABKS7AGU7uCABgA4naAcABKUtqwAEpS2ADwABsH4hsAD4ETsABKWvAASl8AACtwGADwABsHwEcwAEpfi6G+QAAAAC0SU7AASmWwAEpoQAAhVtdA8AAbBkBYAOJVQEcwAEpoy6tmAAAAAC0o07AASnDwAEpzgAAhQNgA4lVARzAASnQLocBAAAAALSnSsABKegBH8ABKfOJ2QMAA4LAASoNwBlQYoPAASoZwBlQiRzAASo3asABKjFdA8AAbBkBYAOJR4cPKQEAAYHAASo4wBlQQADAAGy4AAHAASpbasABKltgA8AAbB+IcgA+BE7AASp6wAEqkwAArcJgA8AAbB8BHMABKpUuhvkAAAAAtElOwAEqrcABKrMAAIMoYAPAAGwfARzAASq1Lob7AAAAALRKTsABKs3AASrTAACFOWADiVUBHMABKtUurasAAAAAtKZKwAEq8wEfwAEq/ooRAwADHMABKyIWwAErEC6tErQ1KQEAAYLAASsjwBlRLADAAGy4HMABK0lqwAErQ10DwABsGQFgA4lHhw8pAQABgcABK0rAGVEKAMAAbLiDwAErZcAZUU4AAAE+AT0wwAErhBzAASuKLq0eAQABJMABK68CJ63DgMABK6vAGUruALRIBrSogJnAASu/wAEr08ABLpkAAK2EAAAAAQPAASvvwAEumQAAAAIAAsABLAwAAACDNV0DwABsGQFgA4omAWoAYAHAAGxcAsABLBsAAACEAGADglIBagBgAcAAbFwCAF0DwABsGQFgA4omAT4GTsABLC7AASw1AACA4GADwABsHwEcwAEsNy6G+wAAAAC0SknAASxHHMABLFKCwAEsS8AZUmgnAQABkwDAAGwySsABLFgBNcABLF8AAAEAXQPAAGwZAWADiiYBgMABLF/AGVIjIxzAASxf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M640rjWuNq43rjiuOa46rjuuPK49rj6uP65ArkGuQq5DrkSuRa5GrkeuSK5JrkquS65Mrk2uTq5PrlCuUa5SrlOuVK5VrlauV65YrlmuWq5brlyuXa5erl+uYK5hrmKuY65krmWuZq5nrmiuaa5qrmuubK5trm6ub65wrnGucq5zrnSuda52rneueK55rnque658rn2ufq5/roCuga6CroOuhK6Froauh66Iromuiq6Lroyuja6Oro+ukK6RrpKuk66UrpWulq6Xrpiuma6arpuunK6drp6un66grqGuoq6jrqSupa6mrqeuqK6prqquq66srq2urq6vrrCusa6yrrOutK61rraut664rrmuuq67rryuva6+rr+uwK7BrsKuw67ErsWuxq7Hrsiuya7KrsuuzK7Nrs6uz67QrtGu0q7TrtSu1a7Wrteu2K7Zrtqu267crt2u3q7fruCu4a7iruOu5K7lruau567orumu6q7rruyu7a7uru+u8K7xrvKu8670rvWu9q73rviu+a76rvuu/K79rv6u/68ArwGvAq8DrwSvBa8GrwevCK8JrwqvC68Mrw2vDq8PrxCvEa8SrxOvFK8VrxavF68YrxmvGq8brxyvHa8erx+vIK8hryKvI68kryWvJq8nryivKa8qryuvLK8try6vL68wrzGvMq8zrzSvNa82rzevOK85rzqvO688rz2vPq8/r0CvQa9Cr0OvRK9Fr0avR69Ir0mvSq9Lr0yvTa9Or0+vUK9Rr1KvU69Ur1WvVq9Xr1ivWa9ar1uvXK9dr16vX69gr2GvYq9jr2SvZa9mr2evaK9pr2qva69sr22vbq9vr3Cvca9yr3OvdK91r3avd694r3mveq97r3yvfa9+r3+vgK+Br4Kvg6+Er4Wvhq+Hr4ivia+Kr4uvjK+Nr46vj6+Qr5Gvkq+Tr5Svla+Wr5evmK+Zr5qvm6+cr52vnq+fr6Cvoa+ir6OvpK+lr6avp6+or6mvqq+rr6yvra+ur6+vsK+xr7Kvs6+0r7Wvtq+3r7ivua+6r7uvvK+9r76vv6/Ar8Gvwq/Dr8Svxa/Gr8evyK/Jr8qvy6/Mr82vzq/Pr9Cv0a/Sr9Ov1K/Vr9av16/Yr9mv2q/br9yv3a/er9+v4K/hr+Kv46/kr+Wv5q/nr+iv6a/qr+uv7K/tr+6v76/wr/Gv8q/zr/Sv9a/2r/ev+K/5r/qv+6/8r/2v/q//sACwAbACsAOwBLAFsAawB7AIsAmwCrALsAywDbAOsA+wELARsBKwE7AUsBWwFrAXsBiwGbAasBuwHLAdsB6wH7AgsCGwIrAjsCSwJbAmsCewKLApsCqwK7AssC2wLrAvsDCwMbAysDOwNLA1sDawN7A4sDmwOrA7sDywPbA+sD+wQLBBsEKwQ7BEsEWwRrBHsEiwSbBKsEuwTLBNsE6wT7BQsFGwUrBTsFSwVbBWsFewWLBZsFqwW7BcsF2wXrBfsGCwYbBisGOwZLBlsGawZ7BosGmwarBrsGywbbBusG+wcLBxsHKwc7B0sHWwdrB3sHiwebB6sHuwfLB9sH6wf7CAsIGwgrCDsISwhbCGsIewiLCJsIqwi7CMsI2wjrCPsJCwkbCSsJOwlLCVsJawl7CYsJmwmrCbsJywnbCesJ+woLChsKKwo7CksKWwprCnsKiwqbCqsKuwrLCtsK6wr7CwsLGwsrCzsLSwtbC2sLewuLC5sLqwu7C8sL2wvrC/sMCwwbDCsMOwxLDFsMawx7DIsMmwyrDLsMywzbDOsM+w0LDRsNKw07DUsNWw1rDXsNiw2bDasNuw3LDdsN6w37DgsOGw4rDjsOSw5bDmsOew6LDpsOqw67DssO2w7rDvsPCw8bDysPOw9LD1sPaw97D4sPmw+rD7sPyw/bD+sP+xALEBsQKxA7EEsQWxBrEHsQixCbEKsQuxDLENsQ6xD7EQsRGxErETsRSxFbEWsRexGLEZsRqxG7EcsR2xHrEfsSCxIbEisSOxJLElsSaxJ7EosSmxKrErsSyxLbEusS+xMLExsTKxM7E0sTWxNrE3sTixObE6sTuxPLE9sT6xP7FAsUGxQrFDsUSxRbFGsUexSLFJsUqxS7FMsU2xTrFPsVCxUbFSsVOxVLFVsVaxV7FYsVmxWrFbsVyxXbFesV+xYLFhsWKxY7FksWWxZrFnsWixabFqsWuxbLFtsW6xb7FwsXGxcrFzsXSxdbF2sXexeLF5sXqxe7F8sX2xfrF/sYCxgbGCsYOxhLGFsYaxh7GIsYmxirGLsYyxjbGOsY+xkLGRsZKxk7GUsZWxlrGXsZixmbGasZuxnLGdsZ6xn7GgsaGxorGjsaSxpbGmsaexqLGpsaqxq7Gssa2xrrGvsbCxsbGysbOxtLG1sbaxt7G4sbmxurG7sbyxvbG+sb+xwLHBscKxw7HEscWxxrHHscixybHKscuxzLHNsc6xz7HQsdGx0rHTsdSx1bHWsdex2LHZsdoAAAAAAAUGtTOAnoGUgZ2B0QEBkJsAAAABA4GngdEAAAAAAAAAYAPAAGxbAUqBqgEWgcoWgcIagbqUyR+UwY/alHsGtTWAnoHUgd2CVQABhtoAAAABA4HoglUAAAACAgKB7QAAAIFMYAPAAGxYAIH2AAAAic5gA8AAbB8AAGADi0QBPgFKggYBNYIwAAABAGADi4UBHIIwFoIlGoIdlMmBEZTCKQEAAYCCMcAZsmMAwABsYSMcgjCCgjDAGbKMJwEAASsAwABsXiscgjeCgjDAGbKMhtoCAAKAgkPAGbJjgYJIwBmycQCLjgFgA4tEBrU2gJ6CWIJhgtsAAa4bAAAAAQOCc4LbAAAAAgICgngAAACBTGADwABsWACCgQAAAInOYAPAAGwfAABgA4tEAT4CSYKRHIKggYKVwBmzHScBAAEcgqOUgVoAAAAAwABsjwDAAGwySoKnASs/SoK2AR6CvbU1AgACgILJwBmzD4GCzsAZsx0ABrU3gJ6C3oLlg40AAa4IAAAAAQOC8oONAAAAAQEBgvwAAACECGADi0QAAGADwABsGAE+AkmDChyDF4CDDsAZs5YnAQABKwDAAGxeSoMgASs/SoMvATWDWQAAAQBgA4uFARyDWRaDThqDRpTJgRGUwikBAAEWg2OAg1rAGbOWgXqLRgDAAGxhIxyDWYGDWcAZs84nAQABKwDAAGxeKxyDcYGDWcAZs86HCQEAARaDhoCDfcAZs5aBVYtHAIuNAWADwABsGAa1OICeg5CDmYY7AAGuHAAAAAEDg6yGOwAAAAEBAYO2AAAAhA1gA4JSAABgA4tEAT4BSYPAHIPcFoPJgIPEwBm0WoQHgmQnAQABKwDAAGxePgNOg/SD+wAAhABgA4JSAYCD/cAZtFpDhAciIRyEFYGEDsAZtI8nAQABKwDAAGxeACElhCcAgYQgwBm0j2ADgpI+AT2JhDzAGbSPFoRMgYRFwBm0j4QAglhJhF4lhGkAgYRiwBm0j2ADgpI+B06Eh4SRAACAjWADiyoBHITFFoSzFoSrGoSjlMkflMGAvpSLifwBAAEfhOuLQwEAAAGBERaFGhqFEpTJgRGUwgCOrT0chUMWhTmChS/AGbT6gRSLLjYBAAEUhUfAGbSPAQFgA4KSAMAAbEc9F4VdFIVWwBm0jwEBYAOCkoQAgoVmwBm0+oJYToWAhYcAAIGwYAOLRAEWhY6AhYnAGbRahAiCZT0chbIWhaiChZ7AGbT6gRSLLo3/AAAAAMAAbZ89F4XIFIXBwBm0jwEBYAOCkoQAK4JYSoXdAYOF5MAZtYA+AUqF/wErPgFKhiEBFoYtgIYowBm0WoQIgmUBgJ4AGbXzABmyBgAAAAAAGbIJABmyRQAZsvEAGbN4ABm0PAAZtfMAAAAFAAIItTmuHYCfAAAEgPMAAJOFAAEBAmuPy4FWAACCLgABAQKED4P9gZQAAJS8AAEBAWKBygAAtTEAAQEIgriQd4K8pOelCaURpRWQgAAAAAECtUGAn4MAgwaEWgOQhQAAAWADwABsVgAAAQS1Q4CfgyqDMQmAlgBgA7LuAAEFtUeAn4M2gzaEJQAAAAODQIQlAAAABAQEg0UAAACBTGADwABsWACDTgAAAInOYAPAAGwfAINjAAAAgJdgA5OLAIN4AAAArg1gA8AAbfgAAGADtUEBPwIIALVDHIP+HIPAaoORXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwACbk41vAgACHIPbaoPOXQPAAGxfAmADk4tgA8AAbBiPKCkBAAGCg9zAGbbQAMAAbGEkg+8Bg4PpwBm23ACy64uMAwADgIQLwBm2tIGEEMAZtsJqhBxgA8AAbB8DALLWCQGDNsAAbFoAAAAAAQa1RYCfhCqEKoRYAACBUwAAAAEDhDKEWAAAAAAAAABgA8AAbBgBSoQ4ASSEWAInrh4WhE8WhEcugJa1Q4CWsvYAABm3hAAZt8QAAAABAAAGBrU7gJ+GWYZhhx0AAY+9AAAAAQOGcIcdAAAAAwMDhnkAAACAlmADss8AhoYAAACJzmADwABsHwCGlgAAAIFMYAPAAGxYAABbAT4BPTCGnxyGvRqGtZTJkKACAAIchtOAhsvAGbfyi4wDAAOChuDAGbgMgYblwBm3/mqG8WADwABsHwMAstZqhwtgA5OLjjgAlM4GtTyAn4cghyiH1gABkIYAAAABA4c1h9YAAAADAwOHPQAAAK4fYAPAAGwYAIdHAAAAic5gA8AAbB8Ah1cAAACBTGADwABsWAAAWwE+AUqHYAEeh2e1OwMAAxyHo2qHfl0DsucBYQMBYAPAAGwYYAOyz8AAnuuNbwEAAYCHscAZuIQAsuuBh77AGbiSgofQwBm4oAAGtT2An4fZh+GInAABrgkAAAABA4fqiJwAAAAEBASH8gAAAK4fYAPAAGwYAIf/AAAAg0tgA8AAbBgAiAoAAACJzmADwABsHwCIGgAAAIFMYAPAAGxYAABbAT4BSogjAR6IKrU7AwADHIhiaohBXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwACejI1vAgACgIhwwBm5F4GIdsAZuSUAsuuCiITAGbkzg4iWwBm5QQAGtT6An4ifiKeJbgABriAAAAABA4ixiW4AAAAEBASIuQAAAK4hYAPAAGwYAIjKAAAAriJgA8AAbBgAiNYAAACJzmADwABsHwCI5gAAAIFMYAPAAGxYAABbAT4BSojvAR6I9rU7AwADHIkvaokNXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwACdzo1vAgACgIk9wBm5xYGJR8AZudMAsuuCiVbAGbnhg4lowBm57wAGtT+An4lxiXmKLQABriMAAAABA4mEii0AAAADAwOJjAAAAK4kYAPAAGwYAImbAAAAic5gA8AAbB8AiasAAACBTGADwABsWAAAWwE+AUqJtAEeibu1OwMAAxyJ9WqJ0l0DsucBYQMBYAPAAGwYYAOyz5JyjW8BAAGAigPAGbpzALLrgYoVwBm6gYKKJ8AZuo8ABrVAgJ+KMIo0is4AAa4lAAAAAQOKPorOAAAAAQEBikgAAACEDWADglIAAGADwABsWAE+AkSKUj4CSYpbJYpkAICKX8AZuwRgA4JySop0ARaKgBSKe8AZuwQAAWADgnKDbYJ0Pz2Iio3AGbsEFoqZgIqUwBm7BIQAglglirEAgIqswBm7BGADglJKisEBKwGAnwAZu3QAGbZuABm30QAAAAEAGbfUABm4ZgAZuPkAGbmnABm6VQAZuuYAGbt0AAAABgACCLVIriaAoAAAAAAAAAECtUmAoIDxgPeDbAOQhwAAAWADwABsVgAAAwS1S4CggRKBLwmuJwBgA8AAbaABNYEbAAABAGADwABtoAEfgRvAAG2iAAAAADWBKAAAAQBcARyBKICBG8AZu+YuAAAAAMAAbaSAgRvAGbvmBLVMgKCBOYFCGJCbAGADwABsWwAEtU2AoIFQgVwYrigAYAPAAG2QASsBBbVTgKCBYYFhgaMAAAADgWeBowAAAAEAAAGBbgAABJCbYAPAAGxbAWqBeWADwABsWx5gA7VJAT4BPReBhi6uKBaBmBaBlS6uJ7VLrinAAG8JtU0CCAG1TIAAwBm8ZQkBgWHAAGxaAAAAAAMGtU+AoIGoga2CRwAAkMYAAAABA4GygkcAAAABAQGBugAAAICWYAPAAGxWAABcAT4BPRyByS6eMgEAATSBzQOBzYJCAAAAAgICgdcAAACuKWADwABtkACB6QAAAK4qYAPAAG2QAABgAcAAbFwBPgE9HoH9wABsJwEAASSCOgaCggXAGb0NJ4aygIISwBm81CeD5xaCJ4GCH8AZvP+uK8AAbwsnriwAALVQBrVQgKCCTIJRgyUAAJ4yAAAAAQOCVIMlAAAAAQEBgloAAACB+WEDAmADwABtkGADwABtkFwAAFwBPgJOgpOCmwAArilgA8AAbZABFoKgFoKdLq4ntUuuKcAAbwlMPgFJgrkWgr0ukJu1TD0cgsmAgsjAGb19gJUCAAIcgtKBgsrAGb2bRAEAARaC1C6uKLVNAMAAbw2BguLAGb2bAAA/PgE9F4MCLq4oFoMUFoMRLq4ntUuuKcAAbwm1TQa1UYCggyqDL4NqAACKmAAAAAEDgzSDagAAAAAAAABcAT4CPRyDQBaDPS6uJ7VLipgAAAAAwABvDj0Xg00urigWg18Wg1wurie1S64pwABvCbVNAAAZvLYAGb1fABm+GgAZvm0AAAADAAAAAYCgABm+hQAZu7cAGb6CAAAAAQAZvoUAAAAAAAIItVSuLYChAAAFgPkAAJOFAAEBAWuBSQAAtOMAAQEBkHOBhwAAtWcAAQEBkIuB2AAAlLwAAQEBYoINAACU2AAAAAAAAQK1VYChgimCL490A5CIAAABYAPAAGxWAAACBLVXgKGCZIJxCa4uAGADtXUABLVYgKGChYKNCTQAYAO05AABBbVmgKGCkoKSgsIAAAADgp+CwgAAAAICAoKlAAAEri5gA7V1AIK5AAAENGADtOQAAGADtVUBPwMIAbVXgADAGb89CAG1WIEAwBm/SQkBgpLAAGxaAAAAAAoGtVqAoYLHgtGDLwAAri8AAAABA4Lfgy8AAAABAQGC5wAAAIY6YAPAAGwYAABdA8AAbBkBYAPAAGxYAUqC/QE1gwsAAAEAYAO1gAEcgwsWgv0uri61V64wAQABgIMawBm/mwC1eyMcgwuBgwvAGb+9JwEAASsAwABsXisWgyiBgwvAGb+9rjG1hAFdA8AAbBkBYAPAAGxYBrVbgKGDNIM5g/YAAK4yAAAAAQODUYP2AAAAAQEBg1YAAACBTGADwABsWAAAYAPAAGxbAT4DSYNhIRyDcBaDaYCDZcAZwDKBIsAAbIAnAQABJ4EjAMAAbDZKg3sBKj9Og5SDmQAAgSRgA8AAbBgBFoOfgIObwBnAMoEkwABsgUqDqQEiHIPTHIO+FoOwLq4utVeuMAEAAYGDzcAZwHQAtXsnAQABKwDAAGxeARyD44GD3sAZwHSBJQEAASeBJgDAAGyCBrVcgKGExITIhaoAAJ1EAAAAAQOE0YWqAAAAAgEChNYAAACBTGADwABsWACE4QAAAK4zYAPAAGxbAWqE8WADwABsWx4AYAPAAGxYAT4DSYT+HIUNFoUGgIUCwBnA9YEiwABsgCcBAAEngSMAwABsNkqFGAEchR8urjS1VAEAAYCFMcAZwPUAtWE/SYU7HIVKFoVDgIU/wBnA9YEiwABsgCcBAAEnPwDAAGw2PgFKhWABHIVnLq41tVQCAAKAhXzAGcD1gYWBwBnBAwC1Yj9KhZsBKwa1XYChhgCGB4eUAACuNgAAAAEDhhmHlAAAAAEBAYYeAAAAgUxgA8AAbFgAAGADwABsGAE+CEmGKRyGNhaGLS40tVgnAQABKwDAAGxeSoY/ASs/SYZQIRyGXxaGWICGVMAZwciBIsAAbIAnAQABJz8AwABsNkqGbQErP06GgoaNAACslmADwABsHwEchpgWhpOAho/AGcHIgSTAAGyBgTkBAAEnRwDAAGyESYaqHIa5gYauwBnCJicBAAEchryUgVoAAAAAwABsjwDAAGwySobAASs/TobYhuQAAIFbYAPAAGwYARyG7xaG6oCG5sAZwciBJMAAbIGBPQIAApOBhvzAGcImAMAAbIdOhxGHIAAArjdgA8AAbFgBHIcyHIcrFociLjS1WJ+mAAAAALTrKQEAAYKHM8AZwn8AwABsYUmHRRyHWIOHScAZwrQnAQABKwDAAGxzSodhASs/SodyARaHiIOHecAZwrSt+sAAbwYGtV6AoYfqh/GJPAAArjgAAAABA4gKiTwAAAAAAAAAYAPAAGwYAT4GTogXiCwAAK45YAPAAGxYARyIPhyINxaILi40tVifpgAAAAC06ykBAAEnAADAAGxhSYhIHIhhgIhMwBnDQicBAAErAMAAbHNKiGoBKz9OiIKIjgAAgVtgA8AAbBgBHIilgIiQwBnDQoFTAAAAAMAAbIlOiLmIyAAArjdgA8AAbFgBHIjaHIjTFojKLjS1WJ+mAAAAALTrKQEAAYGI28AZw48AwABsYUmI7RyJAIKI8cAZw7MnAQABKwDAAGxzSokJASs/SokaARaJMIKJIcAZw7Ot+sAAbwYGtV+AoYlBiUaKQgAArjoAAAABA4lYikIAAAABAQGJYAAAAIY6YAPAAGwYAABgA8AAbFsBPgFKifkBNYoOAAABAGADwABsWwE1ig4AAAEAYAO1gAEcig4WigAuri61V64wAQABgIodwBnENgC1eyMcig6Big7AGcRhJwEAASsAwABsXisWiiuBig7AGcRhhuO1hQFgA8AAbFsjHIoOgYoOwBnEUycBAAErAMAAbF4pgYoOwBnEUwFgA8AAbFsGtWGAoYpHikuKzgAArjS1VAAAAAEDilyKzgAAAAEBAYphAAAAgUxgA8AAbFgAAGADwABsWAE+AkmKbCEcinWAinHAGcT1rfsBAAEngSMAwABvB0qKhwErP0qKmAE1iq0AAAEAYAO1gAEciq0Wip8uri61V64wAQABForAgIq8wBnE9YEkwABsgQC1eyMciq2Biq3AGcUzJwEAASsAwABsXisWiseBiq3AGcUzgUy1gwFgA8AAbFgGtWKAoYrTiteNoQAArjW1VAAAAAEDiuuNoQAAAAICAorwAAAAgUxgA8AAbFgAivoAAACuM2ADwABsWwAAYAPAAGxYAT4BSz4BSoulATWLrAAAAQBgA7TkARaLrC40tVgjHIusgouswBnF2icBAAErAMAAbF4rHIu2gouswBnF2oFdAgABgIu+wBnFrAGt0COBi9fAGcW6aov1YQMBYAPAAGxYYAPAAGxYwADc8WqMGWEDAWADwABsWGADwABsWMAA3PQBYQMBYAPAAGxYYAPAAGxYtOgBYAPAAGxYAAGMPWADwABsngGMVQAAAYH4YAPAAGyeAAA+AkmM4YGM5cAZxbo+AT0cjRYajQ6UyZCoAgACHI1Tao05XQOy5wFhAwJgA8AAbFhgA8AAbBhgA7LPwACia41vAgACgI1hwBnFrCSNagGCjWjAGcZzALLrao12YAOTiwgAlM0/So2MASsGtWOAoY2mjbGPKAABrju1VAAAAAEDjcSPKAAAAAEBAY3JAAAAgUxgA8AAbFgAAGADwABsWAE+A06N243gAACBiGADwABsGAEWjfMWjeaAjeLAGccLgWjAAGyTgWnAAGyUPRyOFhqODpTJkKgCAAIcjk1qjjVdA7LnAWEDAmADwABsGGADwABsWGADss/AAL7UjW8CAAKBjlvAGcckgI5hwBnHCwCy62qOcGADk4sIAJTNSo8ZASsGtWSAoY8tjziPcgABrjy1VAAAAAEDj1OPcgAAAAEBAY9YAAAAgUxgA8AAbFgAAGADwABsWAE+AUqPYwErAAAZv30AGcAUABnA1wAZwaoAGcMZABnEGAAZxNUAGcWMABnG6wAZx6IAGcffAAAACgAAAAGAoQAZyBMAGb7mABnIEAAAAAEAGcgTAAAAAAACCLVnAICiAAACj6AAAMAAbLsAAQECrj2QVI/UAAC4XgABAQKgIqAgAAAABAK1aICikNCQ1qK/g5CJAAABYAPAAGxWAAABBLVrgKKRIZEpCa4+tWcAXQPAAGxfAmADwABsGGADtXUAAQW1dICikS6RNJGTAQAAA5FKkZMAAAABAAGRWAAABK4+XQPAAGxfAmADwABsGGADtXUBapFjXQPAAGxfAmADwABsGGADtXXAANz3AGADtWgBPwIIAbVrgADAGciwCQGRNMAAbFoAAAAABQa1bYCikfSSEZMdAACQ0QAAAAEDkiGTHQAAAAEBAZIpAAAAgL5gA8AAbBgAAGADtXUBPgNOklSSXwAArj9gA7V1ARySaRaSYS6uPrVntWspAQABgJJqwBnJHgDAAGxhSZJ3HJKGgZJ7wBnJNScBAAErAMAAbF4+AT0wkpcfkqG1kAEAASSS+wMnrkCAkvPAGckeJ4puAD9KkwgBgZMPwBnJNQa1boCik/eUFZ9WAAEgAAAAAQOUGp9WAAAAAgIClB8AAACt4mADwABsWACULwAAAJDPYAPAAGwYAABgA7VoAT4GSZQ7HJREgZQ/wBnJzScBAAErAMAAbDZKlE0BapRaYAO1aMAA3Q4/TpSNAAAArkFdA8AAbF8CYAPAAGwYWwBLPgNOlK+UtAAAgdxbAR6UtsAAbw8BAAGBlMHAGcnNAEmUziEllNcAg5TSwBnKJV0DwABsXwJbWz4BSpTqASaU6gUelPG1cAEAASeuQgBgA7VoPz2KlTXAGcoLJpU1ASaVRQCDlUDAGcolXQPAAGxfAltbXQPAAGxfAmADwABsGFsAAZVTYAPAAGynAZVtAAABgfhgA8AAbKcAAD4BPTCVeB+VgrWQAQABg5WiwBnKrQBOldqV4gAAigpdA8AAbF8CYAPAAGwYYAO1dQEylhJgA8AAbBhgA7V1AD0cliOClhrAGcoLgbEBAAE0lisDliufIQAAAAICApYzAAAAgOVgA8AAbBgAlj8AAACuQ1sAAFsBPghJllMclmKEllfAGcsZgSUBAAEnrkQAwABsgkqWegErP06WppawAACBFF0DwABsXwJgA8AAbBhgA7WAATKWx2ADwABsGGADtYAASZbRISWW4ACFltXAGcsnXQPAAGxfAltbPgFKlvMBHpb6tXABAAEkl0kDJ65FhJcwwBnLGSeuRgA/SZdaISaXXgUcl2qFl1/AGcsngYoBAAEngRQAAGADwABsWz4BSpeOAR6XlbVwAQABJJehBCeuRyeuSISXzcAZyxknrkkAP06YEZgfAACuSlsBHJgrhZghwBnLJykBAAEngRQAAEmYQCElmFIAh5hEwBnL/l0DwABsXwJbWz4BSphlAR6YbLVwAQABJJipAyeuS4SYkMAZyxknrkYAPz0cmMiHmLrAGcv+gbEBAAE0mNADmNCeugAAAAICApjYAAAAgYhgA8AAbBgAmN4AAACB3FsAAFsBPghJmO4hJZj3ABSY8sAZzIAJAF0DwABsXwJbWz4BSpkMAR6ZE7VwAQABJJluBSeuTBSZQ8AZzHIIACeuTYSZVcAZyxknrkYAP0+Zg5mHAAABrk5hAwFbYAPAAGxYAAOZlptVAAAAAQEBmZcAAACBUlsAAGADwABsWAE+BEmZriElmbwAFJmywBnM9QsAYAPAAGwYPgFKmdYBJpnWBR6Z3bVwAQABJJnpCCeuTxSZ98AZzPULACeuUCeuURSaNMAZzHIIACeuTYSaRsAZyxknrlIAYAPAAGxYP06acJp0AACBTGADwABsWAEemnrAAGx/AQABJpqABRSagMAZzPULAGADwABsGABJmpYiIRyapRaanhSamsAZzWYMAIEiwABsgCcBAAEnAADAAGw2ACEcmrkWmrIUmq7AGc1mDACBIsAAbIAnAQABJ4F6AMAAbDY+AUqa0gEmmtIFHprZtXABAAEkmxQDJ65TFJr3wBnM9QsAJ65UAGADwABsWD9Kmy0BHJs8gJs0wBnJv4D7AQABFJtHwBnNZgwAAMAAbHJOm2SbaAAAgUxgA8AAbFgBHJt5FJtqwBnM2AoAgJUBAAEcm34Um3rAGcyACQApAQABJ4FMAAAAAE6bmgAAAK4xXQPAAGwZAWADwABsWABJm6slm78AHJuzFJuvwBnMgAkAKQEAASeuMQAAXQPAAGwZAVs+AT0Vm9TAGc5iDCab1AUcnCAcm/wcm/AUm+zAGcyACQApAQABJ64xAACCoQEBYAPAAGxYATScBQOcBZweAAAAAQEBnAYAAACHvlsAAGADwABsWAFKnAwBHJwUgJwMwBnJv4FdAQABJpwcBRScHMAZzt4NAGADwABsGADAAGyQAACAoAAAAAAAXQPAAGwZAWADwABsWEmcOSWcTQAcnEEUnD3AGcyACQApAQABJ64xAABgA8AAbBg+AT0VnGTAGc5iDDGcbmADwABsWAEcnH4UnG/AGczYCgCAlQEAARycgxScf8AZzIAJACkBAAEnrjEAAAAASZyhHJy1HJypFJylwBnMgAkAKQEAASeuMQAAJwEAASsAwABsXj4BPRWcysAZzmIMapzUXQPAAGwZAWADwABsWMAA3Rk+AUqc+QEenQC1cAEAASSdUQMnrlUUnTHAGcxyCAAnrlYATp1vnXkAAK5XWwE1nX8AAAEAWwEcnX8UnXvAGcyACQApAQABJ65XAAAjHJ1/FJ1/wBnQAQ0AJwEAASsAwABsXikUnX/AGdABDQABW0mdniElnawAFJ2iwBnP9g0AYAPAAGxbPgFKncIBHp3JtXABAAEkndUGJ65YJ65ZFp4mFJ4cwBnP9g0AhU7AAG0tJ6txFJ43wBnP9g0AJ65SAD89HJ5hhp5YwBnLVoCcAgACFJ5iwBnMcggAH556tYkEAAMUnobAGcxyCAAUnozAGc4qCwAUnpHAGc5iDAABhuMmnqcFFJ6nwBnP9g0AYAPAAGxbAMAAbGMAAD0cnsqDnsPAGcrTgJwCAAKEnsvAGcsZH57ntX8CAAKEnwTAGcsZhp8QwBnLVgAAwABsYwDAAGywSp8oAR+fM7V0AQABg59KwBnK0wAGtXCAop9bn2KftgABrlq1ZwAAAAEDn26ftgAAAAEBAZ92AAAAJGADwABsGAAAWwFKn4YBMJ+GH5+QtZABAAGAn7DAGdFYAAa1cYCioCmgMKBvAACgMAAAAAEDoDygbwAAAAEBAaBBAAAArltgA8AAbFgAAGADwABsGAFKoE8BHqBPwABt9gEAARygWi6uXAEAAYCgZMAZ0Z0AtXIABrVygKKgdKB4or0AAK5cAAAAAQOggaK9AAAAAQEBoIYAAACuW2ADwABsWAAAXQPAAGxfAltbAT4FTqCboKIAAIGwXQPAAGxfAltbATKgpFtbAE6gsKC0AACQ3mADwABsWAEcoMCAoLbAGdHzgV0BAAEngPcAwABskE+g0qDZAAABrl1hAwFgA8AAbFhgA8AAbBgAA6DgoQ8AAAABAQGg5QAAAIFMYAPAAGxYAABgA8AAbBgBSqDtAR6g7bhiAwADgqD7wBnSKIShAMAZ0nMaoQW4YAA9HKEeFqEVLq4+tWe1a4GxAQABNKEmA6EmoqUAAAACAgKhJwAAAIDlYAPAAGwYAKEzAAAAgL5gA7V1AABgAcAAbFwBPgNOoUehUQAAgRRdA8AAbF8CW1sBMqFTW1sAPRyhbxahZIWhXcAZ0tiWOrVntXmBsQEAATShdwOhd6JoAAAAAgICoXgAAACBiGADwABsGAChfgAAAIEZYAO1gAAAYAHAAGxcAT4CPRyhloahjcAZ0u+AnAIAAoehl8AZ0y4yoZ9gA8AAbBhgA8AAbFYCJ4FMHKG5g6GywBnSUYCVAQABFqG+FKG6wBnTPAgAgUy1gwAAJ64xHKHyHKHlFqHdFKHZwBnTPAgArjG1hIKhAQFgA8AAbBgBg6HpwBnSUQDAAGzrgKAAAAAAwABsZgDAAGxjSaIPIRaiGBSiFMAZ0zwIAIbjtYU+AT0cokAcojqGojHAGdLvKQEAAYeiO8AZ0y4AwABsYYCcAgACJ65XKgAAPwDAAGywPRyid4GiccAZ0g+AnAIAAoSieMAZ0soyooZgA8AAbBhdA8AAbF8CW1sBJ4EUhqKUwBnS7wDAAGxjAMAAbLBKoqwBgaKzwBnSDwAAGckAABnJogAZ0TgAGdF/ABnR1QAZ1GoAAAAFArV1gKKjDaMTpMuDkIsAAAFgA8AAbFYAAAIEtXeAoqNko24JgOUAYAPAAGwYAAS1eYCio5KjnAmWOrVnAF0DwABsXwJgA8AAbBhgA7WAAAEFtX+AoqOho6ekDQEAAAOjw6QNAAAAAgECo8kAAASA5WADwABsGACj4QAABJY6XQPAAGxfAmADwABsGGADtYABaqPuXQPAAGxfAmADwABsGGADtYDAAN0hAGADtXUBPwMIAbV3gADAGdTwCAG1eYEAwBnU/gkBo6fAAGxaAAAAAAIGtXuAoqROpFqkiQAArjAAAAABA6RopIkAAAABAQGkcAAAAIGIYAPAAGwYAABgA7WAAUqkeQEcpIMWpHkuljq1Z7V5KQEAAYCkhMAZ1XYAwABsYQa1fYCipI6kqKTJAQCsJAAAAAEDpLWkyQAAAAAAAABdA8AAbCABYAO1gAFKpLgBFqTDFqS4LpY6tWe1eYGmwABspQAAGdVYABnVqwAZ1e0AAAACArWAgKKlFaUbp8SDrl4AAAFgA8AAbFYAAAQEtYKAoqWopawJgYgAYAPAAGwYAAS1g4Cipful/gmBTABgA8AAbFgABLWEgKKmW6ZiCa4xAF0DwABsGQFgA8AAbFgABLWFgKKm/acICYbjAGADwABsWwABBbWJgKKnDacTp2EBAAADpx6nYQAAAAQDA6ckAAAEgYhgA8AAbBgApy8AAASBTGADwABsWACnOQAABK4xXQPAAGwZAWADwABsWAABp04AAASG42ADwABsWwFqp1tgA8AAbFseYAO1gAE/BQgBtYKAAMAZ1okIAbWDgQDAGdaXCAG1hIIAwBnWpQgBtYWDAMAZ1rsJAacTwABsWgAAAAABBrWHgKKnlKecp8IBAIFnAAAAAQOnpqfCAAAAAAAAAGADwABsWAFKp6kBHqetwABsfwEAASSnwQInrVoWp7sugYi1ggAAABnXDwAZ11MAAAABArWKgKKnx6fNqFADkIoAAAFgA8AAbFYAAAEEtYyAoqf4p/0YJABgA8AAbFYAAQW1kICiqAGoAagsAAAAA6ggqCwAAAABAQGoJgAABCRgA8AAbFYAAGADtYoBPwIIAbWMgADAGdenCQGoAcAAbFoAAAAAAQa1joCiqDGoOKhOAACBUwAAAAEDqECoTgAAAAAAAABgA8AAbBgBSqhGASSoTgEWqEguJLWMAAAZ19MAGdgIAAAAAQAAAAGAogAZ2BgAGchbABnUhwAZ1f4AGddgABnYFQAAAAQAGdgYAAAAAAACCLWRrl+AowAABIEGAAC9YquYAIEnAAC9YgABAQKgH6uXgVMAAMAASTsAAQEBrmCBiQAAwABJjwAAAAAACAK1mICjglWCW5D1A5EdAAABYAO98AABYAO+HQMEtZqAo4QihDQGrmEAYAPAAGwfAWqEM2ADwABsH4DWBLWbgKOEXoRyGK5iAFsABLWcgKOOxI7tBa5jAGADwABJmQEfjtjAAEmpAAAAAAQFtayAo4UChQKGKgCGhgADhRiGKgAAAAUDA4UjAAAAgZdgA76VAIUwAAAAgT5gA8AAbBgAhTsAAACJzmADwABsHwAChVMAAACe8WADwABsWwFqhWFgA8AAbFschX4AAACrtGADvYEBagBgAcAAbFwCYAO1mAE/AggAtZsehb21pAQABIGF0cAZ2Q6TFoXhgYXbwBnZDoDgwABskYOF6cAZ2SsACQCGAL4cAwADgIYGwBnZAoKGDMAZ2RyEhhjAGdlDAAW1rYCjhraGtoipAK5kAAOGz4ipAAAABwUFhuEAAACBl2ADvpUAhu4AAACB3GADwABsGACG+AAAAC5gA8AAbB8AhwMAAACB7GADwABsHwCHDAAAAInOYAPAAGwfAAKHJAAAAJ7xYAPAAGxbAWqHMmADwABsWxyHTwAAAKu0YAO9gQFqAGABwABsXAJgA7WYAT4CToegh6cAAIDgYAPAAGwfARyHrYOHqcAZ2etEAQABgoevwBnZ3gDAAGzhSYe6HIfFh4e+wBnaPYMAAQABaofIYAPAAGwfgNYAwABs9j4BPReH4C6uYh6IAbWkBAAEgYgVwBnZ0IKIG8AZ2d6DiCLAGdnrhYgnwBnaCAC1mz4BPReISS6uYh6IbrXfBAAEgYh9wBnZ0IKIg8AZ2d6HiIrAGdo9hYiSwBnaCAC1mwIIAbWbKwkAh2u+HAMAA4CHccAZ2cSEh3fAGdn5hoeDwBnaIAAFta6Ao4ksiSyK9ACuZQADiUWK9AAAAAcGBolQAAAAgZdgA76VAIlgAAAAgdxdA8AAbBkBYAPAAGwfAIlqAAAALmADwABsHwCJdQAAAIHsYAPAAGwfAImFAAAAq7FgA8AAbFsAiZQAAACJzmADwABsHwABib0AAACrtGADvYEBagBgAcAAbFwCYAO1mAE+Ak6KDooVAACA4GADwABsHwEcihuDihfAGdtVRAEAAYKKHcAZ20gAwABs4UmKKByKM4eKLMAZ252DAAEAAWqKNmADwABsH4DWAMAAbPY+AT0Xik4urmIeimW1pQQABIGKcMAZ2zOCinbAGdtIg4p9wBnbVYSKgsAZ22MAtZs+AT0XiqEurmIeiry13wQABIGKy8AZ2zOCitHAGdtIh4rYwBnbnYSK4MAZ22MAtZsCCAG1mysJAInZvhwDAAOAid/AGdsnhYnlwBnbcYaJ8cAZ24AABbWwgKOK+Yr5i6UAgSa1kQADiwaLpQAAAAQDBIsRAAAAgZdgA76VAIscAAAErmJbAIs2AAAAic5gA8AAbB8Ai18AAACrtGADvYEBagBgAcAAbFwCAGADtZgBPwIIAbWbgQDAGdyVCQCLe74cAwADgIuBwBnciYKLh8AZ3J6Di5PAGdysAAkGtZ6Ao4uqi8GOJwEAqWsBaourYAPAAGxWgLUAAAEDi8iOJwAAAAAAAABgA8AAbBgBPgFJi84li+cAFovSLq5itZtgA8AAbBg+AUqL+gEmi/oFFowBLq5itZtgA8AAbBg+BkAljEYAFowxLq5itZtgA7XYjDGMVwBOjGiMbQAAgdxbARaMhBaMby6uYrWbgdwAToyUjJoAAC5gA8AAbB8BJoyUBRaMsRaMnC6uYrWbLgBgA8AAbB9OjMKMxgAAgexgA8AAbB8BJozCARyMzoGMyMAZ3YWBPwEAASaM5QUWjOUWjNAurmK1m4DgAGADwABsMADAAGyIYAPAAGwfSYzzJYz8AICM98AZ3WxgA8AAbBg+AT0XjREurmIejSi1pAQABBSNScAZ3WwAAWADwABsGIGNT8AZ3YWCjVbAGd2rJo1wBRaNcBaNWy6uYrWbrmYAYAPAAGxbALWbPgE9F42TLq5iHo22taUEAAQmjcEFgI3BwBndbF0DwABsGQFgA8AAbB+BjcfAGd2Fgo3OwBndqyaN6AUWjegWjdMurmK1m65mAGADwABsWwC1m0qOAgEmjgIFFo4JLq5itZtgA8AAbBgGtZ+Ao44sjkGOcgEArmcBao4tYAPAAGxWgLUAAAEDjk6OcgAAAAAAAABgA8AAbFsBSo5RAR6OUcAAbPcCAAIWjlsug76+CWqOYWADwABsH4hsAAa1o4CjjneOio6eAACBUwFqjnhgA8AAbFaAtQAAAQOOko6eAAAAAAAAAGADwABsGAFKjpgBFo6YLqlrtZ4GtaSAo47yjwCPrgABrmgAAAABA48Tj64AAAAEBASPIgAAAIe+YAPAAGwYAI8pAAAALmADwABsHwCPNAAAAIHsYAPAAGwfAI8+AAAAnvFgA8AAbFsAAGADwABsGAE+AkmPUiGDj1fAGd+MSo9lAYCPbMAZ32M/So9zARyPiBqPerWcnvEEAASAj5XAGd9jgY+YwBnfcYKPn8AZ334qAMAASaYGtaWAo4+zj8GQSAABrmkAAAABA4/LkEgAAAAEBASP1gAAAIHcXQPAAGwZAWADwABsHwCP4AAAAC5gA8AAbB8Aj+sAAACB7GADwABsHwCP9QAAAKuxYAPAAGxbAABgA8AAbBgBPgFKkAYBHJAbGpANtZye8QQABICQKMAZ4AWBkC7AGeAagpA1wBngJ4OQOsAZ4DUAwABJpga1poCjkE2QX5DKAACuagFqkE5gA8AAbFaAtQAAAQOQY5DKAAAAAAAAAGADvk0BSpBpAR+QbbWwBAAEFpCCLoGXvfIWkIgurmK1mxaQni6Jzr36JpCqARyQqi6uawEAARaQty6rtL4MAL4TYAO9gQAGtaeAo5DPkOKQ8wAAgT4BapDQYAPAAGxWgLUAAAEDkOeQ8wAAAAAAAABgA8AAbBgBSpDtARaQ7S6pa7WeBrWhgKQAvuAAAYCAjx29YgAAAAEDAAAAAAAAAAAAYAPAAGwYAUq+4AEmvuAFHL7gLorgAQABHwDAAG2rBQAFar7gYAPAAG2swADdOJRqAF0DwABsGQFgA8AAbW2Nu2oAXQPAAGwZAVuHZh6+4MAAbLYBAmADwABtrFsBagBdA8AAbF8CYAPAAG2sW43DAAAAwABtrWADwABsGAa1qoCkAL7gAAKAgI8dvWIAAAABAwAAAAAAAQEBAAAAAIE+YAPAAGwYAABcAUq+4AEcvuAuiuABAAEfAMAAbasFAAVqvuBgA8AAbazAAN09lWoAXQPAAGwZAWADwABtbY27HgDAAGypAQFbATEAWwGAAMAZ4eMAHr7gwABstgECYAPAAG2sWwFqAF0DwABsXwJgA8AAbaxbjcMAAADAAG2tAAAZ3PMAGd61ABnfCAAZ30UAGd/nABngfwAZ4O8AGeEsABnhxgAZ4mcAAAAJArWxgKORRZFLkvcDq5YAAAFgA7WYAAFgA744AAEFtbmAo5GlkaWSTAAAAAORuZJMAAAABAMEkcQAAACBl2ADvpUAkdEAAACBPmADwABsGACR3AAAAIQKYAPAAGwfAJIBAAAAq7RgA72BAWoAYAHAAGxcAgBgA7WxAT8BCQCSI7WwBAAEgJIlwBniyoGSK8AZ4taCkjLAGeLkg5I6wBni8gADBrWzgKOSUZJlknABAIDgAWqSUmADwABsVoC1AAABA5JsknAAAAAAAAAAYAPAAGwfAUqSbwGTBrW3gKOSdZKHkvUAAK5qAWqSdmADwABsVoC1AAABA5KLkvUAAAAAAAAAYAO+TQFKkpEBH5KVtbkEAAQWkrEugZe98iaStwUWkrcurmK1m2ADwABsGBaSzS6ECr3zJpLVARyS1S6uawEAARaS4i6rtL4MAL4TYAO9gQAGtbWApADAAEVQAAGAgJaJvWIAAAABAwAAAAAAAAAAAGADwABsHwFKwABFUAEmwABFUAUcwABFUC6K4AEAAR8AwABtqwUABWrAAEVQYAPAAG2swADdQpRqAF0DwABsGQFgA8AAbW2Nu2oAXQPAAGwZAVuHZh7AAEVQwABstgECYAPAAG2sWwFqAF0DwABsXwJgA8AAbaxbjcMAAADAAG2tYAPAAGwfAAAZ4zYAGeNsABnj5gAZ5IwAAAADArW6gKOS+pMAmNIDq5wAAAFgA7WYAAFgA72BAQS1vICjk2eTbRiEAAFqk0dgA8AAbFaAtWADvfABKwQFtcGAo5P6k/qU5gCuZAADlBSU5gAAAAYFBZQmAAAAgZdgA76VAJQzAAAAgdxgA8AAbBgAlD0AAAAuYAPAAGwfAJRIAAAAgexgA8AAbB8AlFEAAACJzmADwABsHwABlGkAAACe8WADwABsWwFqlHdgA8AAbFscYAO1ugE/AQkAlI21rQYABYCUm8AZ5PaBlKHAGeUCgpSnwBnlEIOUrsAZ5R2ElLPAGeUrAZ7xhZTZwBnlOgW1woCjlR6VHpWXAIaGAAOVNZWXAAAAAwMDlUAAAACBl2ADvpUAlU0AAACpa2ADwABsGACVWQAAAInOYAPAAGwfAABgA7W6AT8BCQCVc7WsAwADgJV+wBnlqYGVhMAZ5bWClYzAGeXDAAW1w4CjlhqWGpbZAK5lAAOWNJbZAAAABgYGlj8AAACBl2ADvpUAlk8AAACB3F0DwABsGQFgA8AAbB8AllkAAAAuYAPAAGwfAJZkAAAAgexgA8AAbB8AlnQAAACrsWADwABsWwCWgwAAAInOYAPAAGwfAABgA7W6AT8BCQCWnbWuBgAGgJarwBnmEoGWscAZ5h6ClrfAGeYzg5a+wBnmQISWw8AZ5k6Fls7AGeZcAAW1xYCjlt6W3pdaAIEmtZEAA5bsl1oAAAADAwOW9wAAAIGXYAO+lQCW/QAAAK5iWwCXFwAAAInOYAPAAGwfAABgA7W6AT8BCQCXMbWwAwADgJczwBnmwoGXOcAZ5s6Cl0/AGebXAAIGtb6Ao5dfl3iXwgAArmoBapdgYAPAAGxWgLUAAAEDl3yXwgAAAAAAAABgA7W6AUqXiAEfl4y1xQMAAxaXmy6Bl73yFpehLq5itZsWl7cuic69+gAGtb+Ao5fHl9iY0AAANQFql8hgA8AAbFaAtQAAAQOX3pjQAAAAAAAAAFwBPgFJl+chHJf0FpfrLop9vfQnAQABKwDAAGxePgI9HJgOFpgFLop9vfSubQEAARaYLC6DYL31AL54PTWYOQAAAQBgA75NARaYOS6DYL31IxyYOYCYOcAZ58cnAQABKwDAAGxeKxeYP4CYOcAZ58eKfRaYSi6Kfb30vnIBYAO+TT4CQByYhxaYdRaYbi6EALW8q7S+DCcBAAEuAMAAbF6YbpiOAD0XmJ4WmJcuhAC1vKu0Jpi3ABaYsi6DYL31YAO1ur4QAAAZ5w0AGedhABnoTwAAAAICtcaAo5k4mT6c8AOrngAAAWADtboAAAIEtciAo5mdmaIYq7sAYAPAAGwfAAS1yYCjmdiZ3RirvABgA8AAbB8AAwW1zYCjmeKZ4ppyAIM2AAOZ+5pyAAAABAQEmgMAAACBn2ADwABsGACaDQAAAIQKYAPAAGwfAJoaAAAEq7tgA8AAbB8AmiYAAASrvGADwABsHwAAYAO1xgE/AwgBtciCAMAZ6NcIAbXJgwDAGejlCQCaO7XCAwADappQYAO+lcAA3U2AmmXAGei7gZprwBnoyQAFtc6Ao5p3mneblgCuZAADmpmblgAAAAcGBpqoAAAAh31gA8AAbBgAmrQAAAAuYAPAAGwfAJq/AAAAgexgA8AAbB8AmsgAAACrs2ADwABsHwCa2QAABKu7YAPAAGwfAJrlAAAEq7xgA8AAbB8AAZr4AAAAnvFgA8AAbFsBagBgAcAAbFwCYAO1xgE/AwgBtciEAMAZ6YMIAbXJhQDAGemRCQCbFbXBBgAFaps6YAO+lcAA3U2Am0/AGelMgZtXwBnpWoKbXsAZ6WeDm2PAGel1AZ7xhpuJwBnpoAW1z4Cjm5ubm5x9AK5lAAObvZx9AAAABgYGm8gAAABUXQPAAGwZAWADwABsHwCb0wAAAC5gA8AAbB8Am94AAACB7GADwABsHwCb7QAAAKuzYAPAAGwfAJv+AAAEq7tgA8AAbB8AnAoAAASrvGADwABsHwAAYAO1xgE/AwgBtciEAMAZ6mMIAbXJhQDAGepxCQCcH7XDBgAGapxEYAO+lcAA3U2AnFnAGeomgZxgwBnqOoKcZ8AZ6kcpg5xywBnqVQABBrXLgKOcgpyjnO4AAK5qAWqcg2ADwABsVoC1AAABA5ynnO4AAAAAAAAAYAO1xgFKnLMBH5y3tc0EAAQWnNEuqWu1nhac2S6ECr3zFpzhLqu7tcgWnOguq7y1yQAAABnqzgAZ6yoAAAABArXQgKOc85z5oPIDq50AAAFgA7W6AAFgA72JAAMFtdSAo53ZndmexQCuZAADnfOexQAAAAYFBZ4FAAAAgZdgA76VAJ4SAAAAgdxgA8AAbBgAnhwAAAAuYAPAAGwfAJ4nAAAAgexgA8AAbB8AnjAAAACJzmADwABsHwABnkgAAACe8WADwABsWwFqnlZgA8AAbFscYAO10AE/AQkAnmy1wQYABYCeesAZ626BnoDAGet6gp6GwBnriIOejcAZ65WEnpLAGeujAZ7xhZ64wBnrsgW11YCjn0ifSKAHAK5lAAOfYqAHAAAABgYGn20AAACBl2ADvpUAn30AAACB3F0DwABsGQFgA8AAbB8An4cAAAAuYAPAAGwfAJ+SAAAAgexgA8AAbB8An6IAAACrsWADwABsWwCfsQAAAInOYAPAAGwfAABgA7XQAT8BCQCfy7XDBgAGgJ/ZwBnsIYGf38AZ7C2Cn+XAGexCg5/swBnsT4Sf8cAZ7F2Fn/zAGexrAAW114CjoAygDKCIAIEmtZEAA6AaoIgAAAADAwOgJQAAAIGXYAO+lQCgKwAAAK5iWwCgRQAAAInOYAPAAGwfAABgA7XQAT8BCQCgX7XFAwADgKBhwBns0YGgZ8AZ7N2CoH3AGezmAAEGtdKAo6CNoKag8AAArmoBaqCOYAPAAGxWgLUAAAEDoKqg8AAAAAAAAABgA7XQAUqgtgEfoLq11wMAAxagyS6Bl73yFqDPLq5itZsWoOUuic69+gAAABntHAAZ7XAAAAABArXYgKOhrqG9pVcHrm8AAAFgA8AAbFYAAAABBbXhgKOjnqOeo7cAk54AA6O1o7cAAAAAAAAAYAO12AE/AQkBo57AAGxaAAAAAAUGtdqAo6ILog+iEwECgdwAAAABA6ITohMAAAAAAAAAWwAGtduAo6IYoiCiJQECLgAAAAEDoiWiJQAAAAAAAABgA8AAbB8ABrXcgKOiKaIxojcBAoDgAAAAAQOiN6I3AAAAAAAAAGADwABsHwAGtd2Ao6OHo5CjmQECrmYAAAABA6OZo5kAAAAAAAAAYAPAAGxbAAa134Cjo7yjxKVVBAEAAAAAAQOj0qVVAAAABAQEo9MAAACB3FsAo90AAAAuYAPAAGwfAKPoAAAAgOBgA8AAbB8Ao/UAAACAo2ADwABsWwAAYAO12AE+AUmkLCIcpDaBpDDAGe5/gToBAAE3wBAAAADAAGyFABykS4KkRMAZ7oyBOgEAATeCAADAAGyFPgVOpGCkZwAAg8BgA8AAbB8BHKRwgaRqwBnuf4JMAQABNwkAwABs4z2MpH3AGe7oHKSNhKSGwBnu6IHVAQABgqSPwBnujADAAGy6PYykncAZ7ugcpK2EpKbAGe7ogkwBAAGUAMAAbONJpLmDpL3AGe6aPYykwMAZ7ugcpMeEpMDAGe7ogdUBAAGUAMAAbLo/SqTTAR+k3rXrAgACgKT0wBnudoSk+sAZ7ugAPgFKpRYBH6UhtfMEAASApTTAGe52gaU6wBnuf4KlQcAZ7oyDpUnAGe6aAAAAGe3HABnt6AAZ7g0AGe4zABnuWQAZ77sAAAAFArXigKOmZ6Ztp4MDrnAAAAFgA7XYAAACBLXkgKOmrKawCYHcAFsABLXlgKOmvqbECYPAAGADwABsHwABBbXrgKOmyabJpwkAAAADpt6nCQAAAAICAqbkAAAEgdxbAKbvAAAEg8BgA8AAbB8AAGADteIBPwMIAbXkgADAGfAtCAG15YEAwBnwNgkApv+14QAAAAADBrXngKOnDqcWpysBAC4AAAABA6ccpysAAAAAAAAAYAPAAGwfAUqnHwEcpyYWpx8ug8C15YJLAQABNwoAwABs4ga16ICjpy+nN6dWAQCA4AAAAAEDpz6nVgAAAAAAAABgA8AAbB8BSqdBARynTxynSRanQi6DwLXlgksBAAGUAMAAbOKB+gEAATeB/wDAAGzeBrXpgKOnWqdjp4EBAK5mAAAAAQOnbaeBAAAAAAAAAGADwABsWwFKp3ABHKd9HKd4FqdxLoPAteWB+gEAAZQAwABs3icBAAGUAMAAbDIAABnwawAZ8KsAGfD7ABnxSAAAAAMCteyAo6eGp4yocAOucQAAAWADtdgAAAQEte6Ao6fIp8wJgdwAWwAEte+Ao6fap98JLgBgA8AAbB8ABLXwgKOn7afzCYDgAGADwABsHwAEtfGAo6gCqAsJrmYAYAPAAGxbAAEFtfOAo6gPqA+obgAAAAOoIahuAAAABAQEqCcAAASB3FsAqDIAAAQuYAPAAGwfAKg+AAAEgOBgA8AAbB8AqEsAAASuZmADwABsWwAAYAO17AE/BQgBte6AAMAZ8dkIAbXvgQDAGfHiCAG18IIAwBnx7wgBtfGDAMAZ8f0JAKhkteEAAAAAAAAAGfJGAAAAAAAABQa1k4CjqHOoeKkkAAGucgAAAAEDqI+pJAAAAAEBAaiXAAAAgT5gA8AAbBgAAGADwABsWwE+AUqoogEiIiIeqKm1lQEAAYCousAZ8nAAAR6oyrWXAQABgKjawBnycAABHqjqtZYBAAGAqPzAGfJwAAEeqQy1lAEAAYCpHMAZ8nAABrWUgKOpJ6ksqWIAAa5zAAAAAQOpO6liAAAAAQEBqUMAAACBPmADwABsGAAAYAPAAGxbAUqpTQEeqU3AAGz3AgACgKlXwBny8CeB+wAGtZWAo6llqWqrpAABrnQAAAABA6l6q6QAAAABAQGpggAAAIE+YAPAAGwYAABgA8AAbFsBPgFKqY0BIiIiIiIiIiIiIiIiIiIiIh6plMAAbPcCAAKAqZ7AGfM9JycAAR6ptMAAbPcCAAKAqb7AGfM9JykAAR6p1MAAbPcCAAKAqd7AGfM9J4HvAAEeqfPAAGz3AgACgKn9wBnzPSdHAAEeqhLAAGz3AgACgKocwBnzPSeB/QABHqoxwABs9wIAAoCqO8AZ8z0ng9YAAR6qUcAAbPcCAAKAqlvAGfM9J4E/AAEeqnDAAGz3AgACgKp6wBnzPSeCTAABHqqQwABs9wIAAoCqmsAZ8z0ngksAAR6qsMAAbPcCAAKAqrrAGfM9J651AAEeqtHAAGz3AgACgKrbwBnzPSeD1wABHqrxwABs9wIAAoCq+8AZ8z0ngTsAAR6rEMAAbPcCAAKAqxrAGfM9J4MAAAEeqzDAAGz3AgACgKs6wBnzPSeBOgABHqtPwABs9wIAAoCrWcAZ8z0ngfoAAR6rbsAAbPcCAAKAq3jAGfM9J4HWAAEeq43AAGz3AgACgKuXwBnzPSeB1QAGtZaAo6unq6yr5gABrnYAAAABA6u9q+YAAAABAQGrxQAAAIE+YAPAAGwYAABgA8AAbFsBSqvPAR6rz8AAbPcCAAKAq9nAGfT5J4CcAAa1l4Cjq+mr7qwkAAGudwAAAAEDq/2sJAAAAAEBAawFAAAAgT5gA8AAbBgAAGADwABsWwFKrA8BHqwPwABs9wIAAoCsGcAZ9UYnRAACgKOApAAZ9XQAGdh+ABnilAAZ5KEAGehgABnrNwAZ7X0AGe/YABnxXQAZ8k8AAAAIABnyUgAZ8tIAGfMfABn02wAZ9SgAGfV0AAAABQACCLX0AIClAAAGgNoAAMAAbLsAAQEBkM+A/AAAgi4AAQEhhpqGVISFhpOGsYZEhqCGToS3hlqGS4a5hp2GVnWGs4arhlKGl4ZAhr+E6oa2hqSGp4bGg/2GZobKhoyGbYbNhlCEAQAAlxIAAQEClE+UTYROAADAAEmqAAEBAa54hJEAAJTYAAEBA5B3qL2owYT0AAC1OQABAQGuIwAAAAICtfeApYZMhlKsawOueQAAAWADwABsVgACXQOX3wFcXQOX+wFcBAS1+YClhrKGyQmEaQBdA8AAbBkBYAO2IAExhsdgA7YgAAS1+oClhvKHGQmuegBdA8AAbF8CYAPAAGwYXQPAAGwZAWADtiABMocXYAPAAGwYXQPAAGwZAWADtiAABLX7gKWHKIc4Ca57AGADwABsWwAEtfyApYdKh1AYgbAAXQPAAGwZAWADwABsVgErAQW2H4Clh1WHVYd3AAAAA4dgh3cAAAABAQGHZgAABK57YAPAAGxbAABgA7X3AT8CCAG1+4AAwBn3LQkBh1XAAGxaAAAAAB8Gtf6ApYh4iIWJWAAAkqQAAAABA4iOiVgAAAABAQGImAAAAIGXYAOJVQAAXQPAAGwZAWADwABsVgE+BEmI8xyI/ICI98AZ93gnAQABKwCJWUqJBQExiQxgA8AAbFYBJ658Pz0XiR8ugbAxiShgA8AAbFYAtfw9HIk1gIkwwBn3eIP4AQFcAS4AiVdKiUcBFolOLoGwtfwGtf+ApYpdimqLUQAAkrAAAAABA4p3i1EAAAABAQGKgQAAAIXgYAOKUAAAXQPAAGwZAWADwABsVgE+BEmK4ByK7YCK5MAZ+A4nAQABKwCKVUqK9gExiv1gA8AAbFYBJ659Pz0XixQugbAxix1gA8AAbFYAtfw9HIsugIslwBn4DoP4AQFcAS4AilNKi0ABFotHLoGwtfwGth2ApYvvi/qMswEAkqkAAAABA4wJjLMAAAAAAAAAYAPAAGwYAT4DTowcjCUAAKxqYAPAAG0GAR+MK8AAbQwAAAAAPgJOjFgAAAA8XQPAAGxKAWADtiABFoxYHgDAAGwvAQFdA8AAbCABYAO2IAEWjFguhGm1+QA9wABsS0UAAAEcjFiBAMAZ+Mw+AAAAAMAAbE0APgJOjFAAAACBiGADtiABFoxfgQDAGfjMQMAAbE8+AT0cjHCAjGfAGfivRQEAARaMe4KMdsAZ+R2ufrYqAMAAbS5KjJUBHIylgIycwBn4r4FTAAAAAMAAbRAGtgCApY0GjRKOEAABicQAAAABA40ajhAAAAABAQGNJAAAAIGXYAOJVQAAYAPAAGxbAT4CSY0wIiWNOQCAjTTAGfmRYAOJqgAcjWEWjVwWjVIUjU3AGfmRAAFgA4mqgtOJsIGIgzgnAQABJ4hsAMAAbDY+Ak6Neo2EAACBZ2ADwABsWAEWjaYWjZUWjYsUjYbAGfmRAAFgA4mqgtOJsIOJg2WBZ4KUSo23ASIcjc8WjciBjb7AGfnogSLAAGyAJwEAASeBIwDAAGw2AByN6xaN5oGN3MAZ+eiBJMAAbIEnAQABJ4npAMAAbDY/So4AASoGtgGApY4VjiGRYwAArn8AAAABA44ukWMAAAAEBASOPwAAAIQNYAOCUgCOTAAAAK6AYAPAAGwYAI5aAAAAgWdgA8AAbFgAjmkAAACDbWADwABsWAAAYAO2IAE+Ak6Oio6YAACugV0DwABsGQFgA7YgARyOoRaOmi6uerX6KQEAAYGOosAZ+o0AwABsYUmOsRyOw4SOtcAZ+sAnAQABKwDAAGxiPgROjxGPFgAAgYhgA7YgAR+PJrYsBQAFgI8ywBn6gYGPOMAZ+o2Cj0LAGfqbg49NwBn6qS4APRyPaRaPYy6EabX5NgEAAYWPbcAZ+wkAwABsRz0cj4EWj3ournq1+oCcAgACgY+CwBn6jTGPjmADtiABhY+PwBn7CQDAAGxjSo+cAYWPo8AZ+wk+BT4CTo/eAAAAPF0DwABsSgFgA7YgARaP3h4AwABsLwEBXQPAAGwgAWADtiABhI/ewBn6wAA9wABsS0UAAAEcj96FAMAZ+5Q+AAAAAMAAbE0APgJOj80AAACugmADtiABFo/thQDAGfuUQMAAbE8+AUmP9xyQDhaQCYaP+8AZ++SEDbYiJwEAAYCQEcAZ+oEAwABsXj4BSpBOAYaQVcAZ++Q/TpDGkMsAAIGIYAO2IAEfkNu2LAUABYCQ58AZ+oGBkO3AGfqNgpD3wBn6m4ORAsAZ+qkuAD0ckR4WkRguhGm1+TYBAAGFkSLAGfwzAMAAbEc9HJE9hJEvwBn6wDYBAAGFkUHAGfwzAMAAbEdKkU4BhZFVwBn8Mwa2AoClkWiRbZINAACugwAAAAEDkXuSDQAAAAEBAZGIAAAAg2VgA4lHAABcAT4BSZGbFpGfLq57tfs+AUmRuRyRyYCRvcAZ/MYnAQABapHYYAOJR4UeAMAAbF4+AT0ckfMWkewugbC1/DYBAAEnjdgAwABsRz8/BrYDgKWSEpIXkjcAAIgKAAAAAQOSJpI3AAAAAQEBkjAAAACBl2ADiVUAAFwBPgAGtgSApZI7kkCSZAAAhmgAAAABA5JQkmQAAAABAQGSXQAAAIQNYAOJ2gAAXAE+AAa2BYClkmmSbpMGAACGTAAAAAEDkn6TBgAAAAEBAZKLAAAAhA1gA4lkAABcAT4BPRyS7xaS6C6BsLX8NgEAASeVmgDAAGxHBrYGgKWTC5MQk6QAAIZVAAAAAQOTH5OkAAAAAQEBkysAAACEDWADiZwAAFwBPgE9HJOOFpOHLoGwtfw2AQABJ66EAMAAbEcGtgeApZOpk66UTQAAhlMAAAABA5O8lE0AAAABAQGTxwAAAIQNYAOJjgAAXAE+AT0clD0WlDYugbC1/DYBAAEnlZ0AwABsRwa2CICllFKUV5SZAACGTwAAAAEDlGeUmQAAAAEBAZR0AAAAhA1gA4lyAABcAT4BPRyUhxaUgC6BsLX8NgEAASeVmwDAAGxHBrYJgKWUnpSjlNwAAIZRAAAAAQOUsJTcAAAAAQEBlLoAAACEDWADiYAAAFwBPgE9HJTNFpTGLoGwtfw2AQABJ5WcAMAAbEcGtgqApZThlOaXdAAAhnIAAAABA5T8l3QAAAABAQGVDwAAAIQNYAOJ/gAAXAE+BU6VJJUrAACEAGADglIBFpUygJUtwBn+/oU4igFDlUEiISWVTwCBlUjAGf8QYAOCkgAhHJVlgZVewBn/ECcBAAErAMAAbF4+AT2JlXbAGf8QFpWGgZV/wBn/EIQAglhOljSWRQAAg4lgA4KSASaWNAGBlkfAGf8QYAOCkj0cllsWllQugbC1/DYBAAEcll8urn8EAAQWlnuAlnbAGf7+hTiKARaWnRaWk4CWjsAZ/v6FOIoBgYiKKiMclryClqvAGf9uJwEAASsAwABsXhqWxrX2FpbkgpbTwBn/boFngpQBYAPAAGxYIxyXCIKW98AZ/24nAQABKwDAAGxeGpcStfYWlzCClx/AGf9ug22ClQFgA8AAbFgAtgEAwABsRz0clz8uroMBAAEWl1OAl07AGf7+hm6KAAC2Aga2C4Cll3mXfp5fAACGXwAAAAEDl4+eXwAAAAEBAZedAAAAhA1gA4m+AABcAT4KPRyXuRaXroCXqcAaAGWFA4nGg/gBAVwBLgCJVz0cl9IWl8sugbC1/DYBAAEnroUAwABsR0mX6BaYABaX8YCX7MAaAGWDY4nAIsAAbCI+BD0cmBsWmBQugbC1/DYBAAEngToAwABsR06YMJg2AACBaWADwABsWwEpPgJOmGUAAAA8XQPAAGxKAWADiiYBFphlHgDAAGwvAQFdA8AAbCABYAOKJgEWmGWAmGDAGgBlg2OJwAA9wABsS0UAAAEcmGWCAMAaAPE+AAAAAMAAbE0APgJOmFcAAACLeGADiiYBFph1ggDAGgDxQMAAbE8+BEmYfyGBmITAGgDePRyYkhaYiy6BsLX8NgEAASeGrwDAAGxHPz0cmKwWmKUugbC1/DYBAAEWmLaDmLDAGgFIgYiKKgDAAGxHSZjFIh6YybYAAQABFpjYg5jSwBoBSIU5iisAACWY9AAWmOiDmOLAGgFIhXGKLGADiXI+AD4CPRyZcxaZbC6BsLX8NgEAASeuhgDAAGxHPRyZmxaZlYOZj8AaAUiFOYorg/gBAVwBLgCJVz2JmbvAGgDeKj0cmd8WmdgugbC1/DYBAAEngTsAwABsRz89HJn6FpnzLoGwtfw2AQABJ4bDAMAAbEdOmg2aEwAAgWlgA8AAbFsBKUWaHwGaKJoqAACB1GADwABsHwGTARyaMYKaL8AaAmSBOgEAARaaOICaM8AaAGWE5YnBAMAAbIUBippQwBoCZByaUYKaUMAaAmSBPwEAAZQAwABsiD4DSZpdIYGaYsAaAlA9HJpwFpppLoGwtfw2AQABJ4avAMAAbEc/PRyanhyamhaahoCagcAaAGWEcInCKQEAAYKam8AaAmQAwABsuIP4AQFcAS4AiVc9iZqywBoCUCpJmsscmvAWmukWmtSAms/AGgBlhHCJwoDgwABsaoE7AQABFpr3gJrywBoAZYTlicEAwABshj4FSZsXHJs3FpsggJsbwBoAZYTlicGBOwEAAZMAwABshj0cm0MWmzwugbC1/DYBAAEnhq8AwABsRz89HJtbFptULoGwtfw2AQABJ48bAMAAbEc9iZtrwBoCUClFm38Bm4ibigAAgdRgA8AAbB8BFpuRgJuMwBoAZYTlicEBHJu1gpuzwBoDpoE6AQABFpvRFpu8gJu3wBoAZYRwicKA4MAAbGoAwABshQGKm+PAGgOmHJvkgpvjwBoDpoE/AQABlADAAGyIPgNJm/IhgZv3wBoCUD0cnAUWm/4ugbC1/DYBAAEnhq8AwABsRz89HJw1HJwxFpwdgJwYwBoAZYRwicIpAQABgpwywBoDpgDAAGy4g/gBAVwBLgCJVz2JnEvAGgJQKj0cnG8WnGgugbC1/DYBAAEnjxAAwABsRz9JnIMWnJwWnIyAnIfAGgBlhHGJwyLAAGwiPgVJnLAWnM4WnLmAnLTAGgBlhHCJwiLAAGwiPRyc4Rac2i6BsLX8NgEAASeGrwDAAGxHPz0cnPkWnPIugbC1/DYBAAEnlRoAwABsRz2JnQnAGgJQKUWdHQGdJp0oAACB1GADwABsHwGTARydL4KdLcAaBPWBOgEAARadRhadNoCdMcAaAGWEcYnDgODAAGxqAMAAbIUBip1OwBoE9RydT4KdTsAaBPWBPwEAAZQAwABsiD4ESZ1dIYGdYsAaAlA9HJ1wFp1pLoGwtfw2AQABJ4avAMAAbEc/PRydoBadmxydlxadiICdg8AaAGWEcYnDKQEAAYKdmMAaBPUAwABsuIGXifKD+AEBXAEuAIlXPRydvRadti6BsLX8NgEAASSd4wIngXcWnd0cndkWncqAncXAGgBlhHGJwykBAAGCndrAGgT1AMAAbLiBiInxAMAAbEc9iZ3uwBoCUCo9HJ4SFp4LLoGwtfw2AQABJ4a+AMAAbEc/PRyeLRaeJi6BsLX8NgEAASeDowDAAGxHPRyeOy6ugwEAARaeT4CeSsAaAGWDZYnEALYCBrYMgKWeZJ5poJMAAIZYAAAAAQOee6CTAAAAAQEBnooAAACEDWADiaoAAFwBPgROnpyepgAAgtNgA4MyARaerYCeqMAaBmGC04mwPRyewxaevC6BsLX8NgEAARyexy6ufwQABIGe3sAaBnMWnvuBnvHAGgZzgYiDOBafJBafE4GfCcAaBnODiYNlgWeClBafUhafQYGfN8AaBnODiYNlg22ClQC2AQDAAGxHSZ9hFp94Fp9qgJ9lwBoGYYNzia4iwABsIj4EPRyfkxafjC6BsLX8NgEAASeBOgDAAGxHTp+on64AAIFpYAPAAGxbASk+Ak6f2gAAADxdA8AAbEoBYAOJVQEWn9oeAMAAbC8BAV0DwABsIAFgA4lVARaf2oCf1cAaBmGDc4muAD3AAGxLRQAAARyf2oMAwBoHNT4AAAAAwABsTQA+Ak6fygAAAIwFYAOJVQEWn+mDAMAaBzVAwABsTz4DSZ/zIYKf+MAaByI9HKAGFp//LoGwtfw2AQABJ4avAMAAbEc/PRygIYSgGcAaB4yD+AEBXAEuAIlXPYqgN8AaByIqPRygWxagVC6BsLX8NgEAASeBOwDAAGxHPz0coG8uroMBAAEWoIOAoH7AGgZhg2WJrQC2Aga2DYCloJignaC9AACIBAAAAAEDoKygvQAAAAEBAaC2AAAAhA1gA4pQAABcAT4ABrYOgKWgwqDHoQYAAIaYAAAAAQOg2KEGAAAAAQEBoOYAAACEDWADimYAAFwBPgE9HKD5FqDyLoGwtfw2AQABgKD9wBoIawDAAGxHBrYPgKWhC6EQoU8AAIabAAAAAQOhIaFPAAAAAQEBoS8AAACEDWADim4AAFwBPgE9HKFCFqE7LoGwtfw2AQABgKFGwBoItgDAAGxHBrYQgKWhVKFZoZYAAIaeAAAAAQOhaaGWAAAAAQEBoXYAAACEDWADinYAAFwBPgE9HKGJFqGCLoGwtfw2AQABgKGNwBoJAQDAAGxHBrYRgKWhm6GgoeMAAIahAAAAAQOhs6HjAAAAAQEBocMAAACEDWADin4AAFwBPgE9HKHWFqHPLoGwtfw2AQABgKHawBoJTADAAGxHBrYSgKWh6KHtojAAAIapAAAAAQOiAKIwAAAAAQEBohAAAACEDWADipEAAFwBPgE9HKIjFqIcLoGwtfw2AQABgKInwBoJlwDAAGxHBrYTgKWiNaI6opAAAIalAAAAAQOiTaKQAAAAAQEBol0AAACEDWADiokAAFwBPgE9HKJwFqJpLoGwtfw2AQABHKJ5aqJ0YAPAAG4PsfOB2QEAARaihYCigMAaCeKBPopeAMAAbxAAwABsRwa2FIClopWimqRhAACGugAAAAEDoq+kYQAAAAEBAaLBAAAAhA1gA4rfAABcAT4FPRyjIB+i0Ym8AwADFqLkgKLfwBoKTILTiudqovtgA4lHhOUWowiAowPAGgpMg3OK4gCD+AEBXAEuAIm1PRyjORajMi6BsLX8NgEAASeGvQDAAGxHTqNNo1MAAIFpYAPAAGxbASk+Ak6jggAAADxdA8AAbEoBYAODzAEWo4IeAMAAbC8BAV0DwABsIAFgA4PMARajghajeICjc8AaCkyC04rng8CDWAA9wABsS0UAAAEco4KCAMAaCsU+AAAAAMAAbE0APgJOo2oAAACDwWADg8wBFqOKggDAGgrFQMAAbE9BPgVJo5IWo5yDo5bAGgsjg72D30KjpgA/SaO2IYGju8AaCrI9HKPJFqPCLoGwtfw2AQABJ4avAMAAbEc/PRyj4Raj2i6BsLX8NgEAASSj9gIWo+6Do+jAGgsjgYiDsCeGsgDAAGxHPRykIRykDxakBICj/8AaCkyFpIrjKQEAARakFoOkEMAaCyOEDIJqAMAAbGGD+AEBXAEuAIpTPYmkNcAaCrIqPRykVRakTi6BsLX8NgEAASeGvgDAAGxHBrYVgKWkZqRrpZkAAIa0AAAAAQOkfKWZAAAAAQEBpIoAAACEDWADir0AAFwBPgY9HKSdFqSWLoGwtfw2AQABJ4E6AMAAbEc9HKS9FqSwgKSrwBoMGYWUir+D+AEBXAEuAIlXPRyk1hakzy6BsLX8NgEAASeVogDAAGxHTqTqpPAAAIFpYAPAAGxbASk+Ak6lGwAAADxdA8AAbEoBYAOKUAEWpRseAMAAbC8BAV0DwABsIAFgA4pQARalG4ClFsAaDBmDnYrAAD3AAGxLRQAAARylG4IAwBoMij4AAAAAwABsTQA+Ak6lCgAAAIXgYAOKUAEWpSSCAMAaDIpAwABsTz4DSaUsIYGlMcAaDHc9HKU/FqU4LoGwtfw2AQABJ4avAMAAbEc/PRylWYOlUMAaDOGD+AEBXAEuAIpTPYmlbcAaDHcqPRyljRalhi6BsLX8NgEAASePEADAAGxHBrYWgKWlnqWjps8AAIa3AAAAAQOls6bPAAAAAQEBpcAAAACEDWADis4AAFwBPgY9HKXTFqXMLoGwtfw2AQABJ4E6AMAAbEc9HKXzFqXmgKXhwBoNdYWUitCD+AEBXAEuAIlXPRymDBamBS6BsLX8NgEAASeVowDAAGxHTqYgpiYAAIFpYAPAAGxbASk+Ak6mUQAAADxdA8AAbEoBYAOKUAEWplEeAMAAbC8BAV0DwABsIAFgA4pQARamUYCmTMAaDXWDnYrRAD3AAGxLRQAAARymUYIAwBoN5j4AAAAAwABsTQA+Ak6mQAAAAIXgYAOKUAEWplqCAMAaDeZAwABsTz4DSaZiIYGmZ8AaDdM9HKZ1FqZuLoGwtfw2AQABJ4avAMAAbEc/PRymj4OmhsAaDj2D+AEBXAEuAIpTPYmmo8AaDdMqPRymwxamvC6BsLX8NgEAASeGvgDAAGxHBrYXgKWm1KbZqHUAAIatAAAAAQOm6ah1AAAAAQEBpvYAAACEDWADiqAAAFwBPgg9HKcJFqcCLoGwtfw2AQABJ4E6AMAAbEc9HKckFqccgKcXwBoO0YWdiqKD+AEBXAEuAIlXPRynPRanNi6BsLX8NgEAASeGrwDAAGxHPRynWxanUYCnTMAaDtGFnoqjg/gBAVwBLgCJVz0cp3QWp20ugbC1/DYBAAEnlaMAwABsR06niKeOAACBaWADwABsWwEpPgJOp74AAAA8XQPAAGxKAWADirIBFqe+HgDAAGwvAQFdA8AAbCABYAOKsgEWp76Ap7nAGg7Rg52KpAA9wABsS0UAAAEcp76CAMAaD3Y+AAAAAMAAbE0APgJOp7AAAACDnmADirIBFqfHggDAGg92QMAAbE8+BUmnzyGBp9TAGg9jPRyn4han2y6BsLX8NgEAASeGrwDAAGxHPz0cp/0Wp/mDp/PAGg/NgTyKtIP4AQFcAS4AilM9HKgYFqgRLoGwtfw2AQABJ4ayAMAAbEc9HKg1Fqgvg6gpwBoPzYE+irWD+AEBXAEuAIpTPYmoScAaD2MqPRyoaRaoYi6BsLX8NgEAASeGvgDAAGxHBrYYgKWoeqh/qhYAAIbIAAAAAQOok6oWAAAAAQEBqKQAAACEDWADiwEAAFwBPgROqLqoxAAAg7xgA4RLARaoy4CoxsAaEJyDvIsFTqjgqOoAAILTYAODMgEWqPaBqOzAGhCugzODtEmpCiEcqRiCqQ7AGhDKJwEAASsAwABsXj4CPRypMBapKS6BsLX8NgEAARypNC6ufwQABIKpTcAaEMoWqWyCqWLAGhDKgYiDOBaplxaphoKpfMAaEMqDiYNlgWeClBapxxaptoKprMAaEMqDiYNlg22ClQC2AQDAAGxHPRyp3xap2C6BsLX8NgEAASeA9wDAAGxHPz0cqfoWqfMugbC1/DYBAAEWqg0WqgiBqf7AGhCugYiDsIGIiSIAwABsRwa2GYClqhuqIKuOAACGwQAAAAEDqkGrjgAAAAEBAapfAAAAhA1gA4ryAABcAT4CPRyqgBaqcICqa8AaEcCGwIr0g/gBAVwBLgCLCUmqkhaqoRaqm4CqlsAaEcCDy4r1IsAAbCI+BD0cqrwWqrUugbC1/DYBAAEngToAwABsR06q0arXAACBaWADwABsWwEpPgJOqwMAAAA8XQPAAGxKAWADiVUBFqsDHgDAAGwvAQFdA8AAbCABYAOJVQEWqwOAqv7AGhHAg8uK9QA9wABsS0UAAAEcqwOCAMAaEjQ+AAAAAMAAbE0APgJOqvMAAACMBWADiVUBFqsKggDAGhI0QMAAbE8+A0mrFCGBqxnAGhIhPRyrJxarIC6BsLX8NgEAASeGrwDAAGxHPz0cq0KDqzrAGhKLg/gBAVwBLgCJVz2Jq1jAGhIhKj0cq3wWq3UugbC1/DYBAAEngTsAwABsRz8GthqApauTq5ir6wAAhssAAAABA6uwq+sAAAABAQGrxQAAAIQNYAOLEQAAXAE+AT0cq9sWq9aAq9HAGhMggZeLE4P4AQFcAS4AiVcGthuApavwq/WsaQAAhs4AAAABA6wNrGkAAAABAQGsIgAAAIQNYAOLHwAAXAE+AT0erC61PwMAAyeuhxysXJSBWgAAAADAAGyPKwAAABn3WgAZ9/AAGfiGABn5cwAZ+mMAGfyoABn9HwAZ/U4AGf19ABn9xAAZ/gsAGf5SABn+mQAZ/uAAGgBHABoGQwAaCB4AGghNABoImAAaCOMAGgkuABoJeQAaCcQAGgouABoL+wAaDVcAGg6zABoQfgAaEaIAGhMCABoTTQAaE5gAAAAfArYggKWsnKyishYDrogAAAFgA8AAbFYAAAUEtiKApazBrMUJhA0AYAOCUgAEtiOApazbrOYJrokAYAO19wAEtiSApaz3rPsJgYgAYAPAAGwYAAS2JYClrQmtEgmBZwBgA8AAbFgABLYmgKWtIK0nCYNtAGADwABsWAABBbYsgKWtLK0srYQAAAADrTethAAAAAUFBa1EAAAEhA1gA4JSAK1PAAAEgYhgA8AAbBgArVoAAASBZ2ADwABsWACtagAABINtYAPAAGxYAK14AAAErolgA7X3AABgA7YgAT8GCAG2IoAAwBoUsQgBtiSBAMAaFL0IAbYlggDAGhTLCAG2JoMAwBoU2QgBtiOEAMAaFOcJAa0swABsWgAAAAACBrYogKWtia2QrlgAAIFTAAAAAQOtmK5YAAAAAAAAAGADwABsGAE+A06ts63BAACugl0DwABsGQFgA7YgARyt1hatzxatwy6uibYjrnq1+ikBAAEWrdcugYi2JADAAGxhSa3iHK37Fq30gK3mwBoVY4DgwABsaicBAAGUAMAAbDI+AUquCQEWrhAugYi2JD9KriABJK5UBBauKS6BiLYkJ5VAHK5NHK4/gK4xwBoVY4E5AQABLgDAAG4pgT8BAAGUAMAAbIgnlRAGtiqApa5drmiyFAEArn4AAAABA652shQAAAAAAAAAYAPAAGwYAT4ESa58IhyukRauihaugC6BZ7YlgSLAAGyAJwEAASeBIwDAAGw2AByurRauqBauni6BZ7YlgSTAAGyBJwEAASeJ6QDAAGw2PgFJrsAiJa7JABauxC6EDbYiYAODMgAcruxqrtVdA8AAbBkBYAPAAGwYwADdhisBAAEWrvUugYi2JADAAGw0PgJOr1SvYgAAroJdA8AAbBkBYAO2IAEcr3cWr3AWr2Qurom2I656tfopAQABFq94LoGItiQAwABsYUmvhxyvoBavmYCvi8AaFrGA4MAAbGonAQABlADAAGwyPgFKr7IBJwA/Pz9Jr9kiHK/nFq/dLoFntiUnAQABGq/qtfYAwABscwEhJa/9ABav+C6EDbYiYAODMj4CTrCIsJYAAK6CXQPAAGwZAWADtiABHLCrFrCkFrCYLq6JtiOuerX6KQEAARawrC6BiLYkAMAAbGFJsLkcsNIWsMuAsL3AGhdFgODAAGxqJwEAAZQAwABsMj4BSrDiAScAPz9OsQexDwAAgJZgA7LPASMiHLEcFrESLoFntiUnAQABFrEfLoNttiYAwABscwEcsTsWsTQWsSougWe2JYEiwABsgCcBAAEngSMAwABsNhyxY2qxUF0DsucBYQMCYAPAAGwYYAPAAGxYYAOyz8AA1ESNbwIAAhyxcS6BUwAAAAC2KBaxfS6BZ7YlALLrHLGwarGSXQOy5wFhAwNgA8AAbBhgA8AAbFhgA8AAbFhgA7LPwADUoo1vAwADHLHLLoFTAAAAALYoFrHXLoFntiUWseIug222JgCy6wFgA7LPSrHwARyx/yeuioE/AQABFrIJgLIBwBoXp4CWstIAwABtPQAAGhU6ABoWAgAaGKQAAAACAAEEtfaApax4rJkFrosAYAPAAGxYAR6sicAAbH8BAAEnrowAAAGApQAaGNoAGfZhABoUHQAaGLUAAAACABoY2gAAAAAAAgi2La6NgKYAAECA9wAAwABsFwABAAGCz4EaAADAAEmtAACBZgAAk4UAAQEBa4G2AADAAEtdAAEBCa6Oro+ukK6RrpKO0K6TrpSulYK7AADAAEtnAAEBBq6WrpeumK6Zrpqum4OQAADAAEuEAACD0gAAwABLnQABAQGgH4QdAAC1kQABAQOudK53rnKEpAAAwABLuAAAhN4AAIIuAACFAAAAmrcAAIUwAADAAEAtAACFUgAAwABAegAAhXoAAMAAS/kAAIWoAADAAEw2AACF1gAAwABMTQAAhf0AAMAATGcAAIYpAADAAEyDAACGUQAAwABNZwAAhoQAAMAATYcAAIavAADAAE3gAACG3wAAwABN8wAAhxoAAMAAQQgAAIdEAADAAE4TAACHbQAAwABOWgAAh5gAAMAATnIAAIfFAADAAE6NAACH8wAAwABOqAAAiBwAAMAATrsAAIhIAADAAE8CAACIdQAAwABBhQAAiJwAAMAAQZsAAIjPAADAAE8eAACI/wAAwABPPgAAiSkAAMAAT0oAAIlUAADAAE9RAACJgQAAwABPVwABAQGunIm6AADAAEHiAAEBAavMif8AAJTYrp0AiicAAJTYAAEBBIK4kHeCvKApincAAMAAT2UAAQEFrp6un66grqGuooseAAC1MaxqAQEBrhuLXgAAwABPoQABAQauo66krqWupq6nrqiLyQAAwABP1QABAQOUva6prqqMBgAAtTkAAQEEj72uIK4JriOMXwAA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A8AATlsBFsAARv0uhES2OiMcwABG/YTAAEb9wBo6zycBAAErAMAAbF4WwABHBy6shLY8hMAARv3AGjrPAWADwABOWyMcwABHBITAAEcEwBo6vycBAAErAMAAbF4WwABHFy6scbY5hMAARwTAGjq/AWADwABOWxbAAEcnLoFMtkQAFsAARzUugUy2RADAAEJvScAARz8hHMAAR0uEwABHQ8AaOnMnAQABKwDAAGxePgE9HMAASHYurwsDAAOAwABIoMAaOR1qwABIul0DsucBYQMBYAPAAGwYYAOyz8AAeMoxwABI+mADsu4BhMAASPvAGjpzALZ/Pwa2gYCmwABJE8AASSrAAEmvAACvDgFqwABJFGADwABsVoC1AAABA8AASTrAAEmvAAAAAgICwABJSgAAAIO+YAPAAE/5AMAASVQAAACJzmADwABsHwAAYAO3hAE+AUrAAElmAR/AAElxt5oEAASAwABJfMAaPAQWwABJgi6uzrZRJsAASZgBFsAASZguhES2OmADwABOFIHAAEmgwBo8FAAGtoKApsAASbTAAEm5wABK8wAArw8AAAABA8AAScnAAErzAAAAAgICwABJ0wAAAIQAYAOCUgDAAEnsAAAAhBFdA8AAbBkBYAOFGgAAXAE+AUnAAEn/IRzAAEoPgcAASgPAGjylJwEAASsAwABsYj4CPTXAAEogAAABAGADwABQjwEWwABKIC6uwrZFIxzAAEoggsAASiDAGjzhJwEAASsAwABsXiscwABKLoLAAEogwBo84a8QAwADLoDAAEpCwBo8l4HAAEpKwBo8pQDAAFCbAVw9HMAASnQWwABKbRbAAEpeLqxxtjmr+cAARrqvEQQABIHAAEqPwBo8pRbAAEqmLq7QtlMWwABKvC6uz7ZSFsAASuEWwABK0i6scbY5gRXAAEbNAMAAXak/BraDgKbAAEr4wABLCcAAS5oAAK8SAWrAAEr5YAPAAGxWgLUAAAEDwABLFsAAS5oAAAABAQHAAEsdAAAAqWpgA75NAABcAT4DPRzAAEsqLq8TAQABJ68SALdnPR3AAEtRrvABAAEWwABLVi6u07ZXAMAAYlg9F8AAS2wurtNqwABLjmADwABPWMAA3hC2Vwa2hICmwABLn8AAS7DAAFMOAACvFQFqwABLoGADwABsVoC1AAABA8AAS7vAAFMOAAAAAwMD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ga1gA4XkASbAANIHARzAANITLq7zAAAAAMAAYltgA4XkTsAA0jPAANJBAACDc10DwABsGQFgA8AATz8BJsAA0jMBHMAA0kMurvMAAAAAwABiW10DwABsGQFgA8AATz9OwADSVcAA0l4AAIVJYAPAAGxWARzAANJgLq7zAAAAAMAAYltJwADSayIhHMAA0nmCwADSb8AanT4nAQABKwDAAGxeACEcwADSkoPAANKEwBqdaicBAAErAMAAbGI+AkAWwADS0xzAANKxFsAA0qourry2OK+dAQABgsAA0sjAGp0+AMAAVjqBVsAAbPPAANKqwADS2gA9HMAA0uoWwADS4y6uvLY4r54CAAKCwADTD8AanT4cwADTGi6vnwEAAYPAANMxwBqdagC3bQDAAFY7PgFAHMAA02qDwADTXMAanWonAQABKwDAAGxiwADTXMAA03EAScAA034lwADTiwCEwADTgsAanahgA8AAT2o+Ak7AANOnwADTrAAAgYhgA4kfAR7AANOyiSgCAAIWwADTwBTAANO3wBqdqAQBYAPAAE9qgYjAAE9sFsAA09UWwADTxi6scbY5rIjAAEbjAEnAANPoHMAA0/aCwADT7MAanT4nAQABKwDAAGxePgE9HMAA1AkurvABAAEfwADUEsAAVfwDAAMugMAA1DrAGpxZhcAA1EbAGp64AAC2cj4BPRzAANRlLq7wAQABH8AA1G7AAFXgBAAELoDAANSIwBqcWYXAANSUwBqeuILAANSawBqdPgAAtnJJwADUuhzAANTIgsAA1L7AGp0+JwEAASsAwABsXj4BPRzAANTZLq7wAQABhMAA1N7AGp2oALZyPgE9HMAA1PwurvABAAEcwADVAS6voAMAA4TAANUMwBqdqILAANUWwBqdPhbAANUsgMAA1SHAGpxZic6+VgC2ogC2cga2ooCmwADVR8AA1VPAANbpAACvoAFqwADVSGADwABsVoC1AAABA8AA1V3AANbpAAAAAwMDwADVZQAAAIVJYAPAAGxWAMAA1XkAAACBrWADheQAwADViAAAAInOYAPAAGwfAABbAT4BScAA1ZolwADVpwCAwADVnsAaoDxgA8AAUzk+AUrAANW9ARzAANXNFMAA1cTAGqA8AAFgA8AAUzmvoQIAAoLAANXawBqgWoHAANXmwBqgTADAAFNSScAA1f0lwADWCgCAwADWAcAaoDxgA8AAYsQ+AUrAANYlAR/AANYwwABVhQMAAy4rasAA1ldgA7LbwADQZQA+AUrAANaCARzAANaQFsAA1okurry2OK+iAwADgsAA1rbAGqBaHMAA1sIurvIBAAGAwADWysAaoDwAtnaBwADW1cAaoEwAwABWewa2o4CmwADW7sAA1v/AANoCAACvowFqwADW72ADwABsVoC1AAABA8AA1wvAANoCAAAAAQEBwADXEgAAAKlqYAO+TQAAXAE+Az0cwADXHy6vEwEAASevowC3Z07AANdKwADXVQAAhX5gA4UaARzAANdXLq7xAAAAALZzScAA12olwADXeQCBwADXbsAaoaZgA8AAQ90+Aj0cwADXjS6u8AEAARTAANeSwBqhpgEBYAPAAEPdALZyPRzAANelLq7wAQABHMAA16our6S2LQQABBbAANfeFMAA19PAGqGmAQFgA8AAQ92FFMAAQ9+AwADX6MAaoYAWwADX+hTAANfvwBqhpgEBYAPAAEPdhAGCWSsAtmwAtnI+BU7AANgmwADYMgAAr6VgA8AAbFsBHsAA2DTAAGIFAgACJ6+mgMAA2ETAGqGAAEnAANhSIoLAANhWwBqiYwAhFsAA2HUWwADYZi6scbY5g1bAAEbnPgE9HMAA2Jcur6cBAAGAwADYt8AaoYAAwABQOj9OwADY4cAA2OoAAIUUYAOI5wEcwADY/RbAANj2Lq68tjivqAEAAYHAANkfwBqhpgDAAFZ0PRzAANkyLq7wAQABNcAA2TsAAAEAYAPAAEPdAR/AANk7wABD6gIAAYPAANlDwBqi0wGvpYLAANlawBqiYzXAANlxAAABAFwBF8AA2XGEwADZO8AaoxOEARbAANmJgcAA2X7AGqGmhAGCWYJZhMAA2TvAGqMTALZyPRzAANmcLq7wAQABHMAA2aEur6S2LQQABIPAANnKwBqi04DAANnUwBqhgBbAANnmgcAA2dvAGqGmhAGCWSsAtmwAtnIGtqSApsAA2gfAANoYwADa6QAAr6kBasAA2ghgA8AAbFaAtQAAAQPAANoiwADa6QAAAAAAAABcAT4FPRzAANorLq8TAQABJ6+pALdnTsAA2lTAANpfAACFfmADhRoBHMAA2mEurvQAAAAAtnROwADafcAA2o0AAK+qYAPAAEPdASbAANp9ARzAANqPLq7zAAAAAMAAYltgA8AAQ909HMAA2qqBwADamsAapC+vqwEAAYDAANq/wBqkDwDAAEPkPRzAANrQLq7wAQABgcAA2tXAGqQvALZyBralgKbAANruwADa/8AA26IAAK+sAWrAANrvYAPAAGxWgLUAAAEDwADbEsAA26IAAAABAQHAANsZAAAAr61gA75NAABcAT4DPRzAANssLq8TAQABJ6+sALdnPR3AANtZrvABAAEWwADbXi6u07ZXAMAAYlg9F8AA23QurtNqwADblmADwABPWMAA3hC2Vwa2poCmwADbp8AA27jAANxkAACvrgFqwADbqGADwABsVoC1AAABA8AA28nAANxkAAAAAQEBwADb0AAAAIFYYAO+TQAAXAE+BD0cwADb3S6vEwEAASevrgC3Z07AANwNwADcGAAAhX5gA4UaARzAANwaLq7xAAAAALZzPRfAANwtLq7TJsAA3C0BHMAA3D8urvMAAAAAwABiW2ADwABPWLZXPR3AANxQrvABAAGBwADcVcAapYEAwABiWAa2p4CmwADcacAA3HrAAN1cAACvrwFqwADcamADwABsVoC1AAABA8AA3I/AAN1cAAAAAQEBwADclgAAAKlqYAO+TQAAXAE+AUnAANyjIh7AANynwABiBQIAAieH9YDAANy2wBqmFQABHsAA3MDAAGIFAgACJ4f2gMAA3M/AGqYVAD4DTsAA3OrAANzuAACeIWADhRoBHMAA3PAurvEAAAAAtnM9NcAA3QUAAAEAYAPAAFHZARbAAN0FLq7DtkYjHMAA3QWCwADdBcAapoUnAQABKwDAAGxeKxzAAN0TgsAA3QXAGqaFr7ACAAKBwADdKsAapmQWwADdNYDAAN0vwBqmFa+xvmwAwABR5QFcPRzAAN1JLq7wAQABgcAA3U7AGqZkALZyPwa2qICmwADdYcAA3XLAAN9dAACvsgFqwADdYmADwABsVoC1AAABA8AA3YXAAN9dAAAAAQEBwADdjAAAAKlqYAO+TQAAXAE+Aj0cwADdmS6vEwEAASevswC3Z0nAAN29IiIewADdwcAAYgUCAAIngPeAwADdz8AapzsAAR7AAN3hwABiBQIAAieQ5IDAAN3wwBqnOwABHsAA3gLAAGIFAgACJ6+mgMAA3hLAGqc7AD4BPRzAAN4iLq+0AQABgMAA3jvAGqc7ALatScAA3k4i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5jbAGq4IALZyBrargKbAAOZowADmbcAA5xUAAK+2AAAAAQPAAOZ1wADnFQAAAAEBAcAA5nwAAACpamADvk0AAFwBPgNOwADmlMAA5pYAAICjYAOFGgEcwADmmC6u8QAAAAC2c07AAOa2wADmuAAAgKJgA4UaARzAAOa6Lq7xAAAAALZzPRzAAObNLq7wAQABNcAA5tYAAAEAYAPAAEQSAR/AAObWwABEHQIAAoLAAObnwBqvQYHAAObqwBqvIQA1wADm7gAAAQBcARfAAObug8AA5tbAGq9thAEewADm+8AAUC4BAAGAwADnCsAarw0AglmDwADm1sAar20AtnIGtqyApsAA5zTAAOc5wADoqAAAr7gAAAABA8AA50TAAOioAAAAAQEBwADnSwAAAKlqYAO+TQAAXAE+Ak7AAOdfwADnZAAAr8JgA8AAbFYBHMAA52YurvMAAAAAwABiW0nAAOdxJcAA53oAgcAA53XAGrAWYAPAAFWkPgE9HMAA554urvABAAEcwADnqBTAAOejwBqwFgEBYAPAAFWknY0DAAIcwADntS6u8wAAAADAAGJbFsAA58KAwADnvMAasAKJzr5WAa+lKcAAVakAtnI+Az0cwADn9i6u8wAAAADAAGJbPYjAAOgDwBqwAhbAAOgRgMAA6AvAGrACg2C+aD0cwADoHS6u8AEAARzAAOgiLq74AwADHMAA6FBqwADoNV0DsucBYQMBYAO+TWADss/AAH/3jW8BAAGAwADoXsAasAIAsusewADocMAAUC4BAAGAwADof8AasAIAHsAA6IfAAGIPAQABgMAA6JbAGrACAAC3UAC2cga2rYCmwADorcAA6LLAAOpkAACvtAAAAAEDwADoysAA6mQAAAABAQHAAOjRAAAAqWpgA75NAABcAT4CTsAA6OXAAOjqAACvwmADwABsVgEcwADo7C6u8wAAAADAAGJbScAA6PclwADpAACBwADo+8AasYxgA8AAVaQ+Ak7AAOkrwADpNAAAhUlgA8AAbFYBIx7AAOk2wABiBQIAAieA94DAAOlEwBqxeAAcwADpTS6u8wAAAADAAGJbHMAA6VUurvEAAAAAtnMBYAPAAGxWPRzAAOlqLq7wAQABHMAA6XQUwADpb8AasYwBAWADwABVpJ2NAgACgsAA6YHAGrHMFsAA6ZGAwADpi8AasXiJzr5W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U5wDAAMugsABEd7AGsodh8ABEeXAGs0iAEnAARIAIiIWwAESBC6uwbZDABzAARIxgcABEizAGsoNJwEAAScRAMAAbDYAHMABElU1wAESSAAAAQBgA8AATlsBFsABEkguhES2OiMcwAESSBTAARJIwBrOywgAJwEAASsAwABsXisWwAESUBTAARJIwBrOywgAgYjAAE5dAWADwABsGCcBAAEnr+MAwABsNj4BSsABEnUBHMABEoMWwAESfC6uvLY4r1UBAAGFwAESlcAaymYAwABWQz4BSsABErkBHsABEsTAAFUAAwADLoLAARLiwBrKHYfAARLpwBrNIgBJwAETABbAARMQhsABEwTAGsrUr+TAAEBNPgJJwAETKyXAARM7AIbAARMvwBrK1GADwABCsD4CTsABE2/AARN7AACv5WADwABCsAEmwAETbwGGwAETfcAaytRgA8AAQrA9jsABE5LAGsrUFsABE6yHwAEToMAaz7OHg8AAQqY/SsABE8MBH8ABE87AAFTNBAAELoLAARPlwBrKHSbAARPsAYbAARPswBrK1GADwABBnIHAARP5wBrKDQBJwAEUCxbAARQbhsABFA/AGsrUr+bAAEBFPgROwAEUPMABFEwAAK/nYAPAAE9LASbAARQ8AYbAARROwBrK1GADwABPS0nAARRhIiIhHMABFHUWwAEUZS6u07ZXJwEAAWrAARSIYAPAAE9YwADdtgDAAGxeACEWwAEUq4fAARSbwBrQUYTBwABAOAAhFsABFMgWwAEUwS6ERLY6ifrAAEA5PgFKwAEU4QEfwAEU7MAAVcIDAAMugsABFRjAGsodasABFSVgA7LbwAC1NQA/TsABFWfAARVwAACFFGADiOcBFsABFYKHwAEVcsAa0FGFFMAAT01JwAEVkiEWwAEVp4fAARWXwBrQUYY0wABPTj4BSsABFb8BHMABFcYur6S2LQQABBTAARXkwBrRAwgAgsABFe7AGsodhcABFfXAGspmgcABFgHAGsoNALZsPgFKwAEWHwEfwAEWKsAAU3MDAAMugsABFkXAGsodFMABFkzAGtEDCAAAScABFmoWwAEWeobAARZuwBrK1K/owABAQz4DScABFpkiIiEcwAEWrRbAARadLq7TtlcnAQABasABFsBgA8AAT1jAAN22AMAAbF4AIRbAARbTLq7GtkkAIRbAARgJFsABGAIuhES2Oon6wABAOT4BPRzAARgiLqxgAwADasABGEBgA7LbwAC1NYXAARhfwBrKZhbAARhxgsABGGvAGsodgOC+ZgC3Yz9OwAEYjcABGI8AAIHSYAOJHwEewAEYlYkoAgACgcABGJrAGsoNFsABGK8WwAEYoC6scbY5rIjAAEbjAErAARjCAR/AARjNwABTnAMAAy6CwAEY78Aayh2HwAEY9sAa0lIAScABGQUWwAEZFYbAARkJwBrK1K/pwABARD4HTsABGUnAARlaAACv6mADwABMaAEmwAEZSQEWwAEZXC6uvbY7YAPAAExoTsABGYTAARmSAACv62ADwABOFAEcwAEZni6v7LYtBAAEgMABGb3AGsn9hsABGcTAGsrUgcABGdHAGsoNhcABGdfAGspmALZtScABGi4WwAEaPobAARoywBrK1In3wABAOz4BPY7AARpRwBrK1Cs/ScABGnMiIRzAARqFFMABGnfAGtL4CAAnAQABKwDAAGxeACIWwAEaqRTAARqbwBrS+AgAiffAAEA7ARbAARrCFMABGrTAGtL4CACDvcAAQEo+AT0VwAEa18Aa0vgIKz9JwAEa+yIcwAEbC4bAARr/wBrK1CcBAAErAMAAbF4AHMABGyQUwAEbFsAa0vgIACcBAAErAMAAbF4+AUrAARs3AR7AARtCwABVAAMAAy6CwAEbbcAayh0ewAEbeIkoAgACgcABG33AGsoNFsABG5IWwAEbgy6scbY5rIjAAEbjAAA/TsABG7zAARvKAACv7WADwABOFAEjJcABG+IAhsABG9bAGsrUYAPAAE4UFMABG/XAGsrUBgFgA8AAThQrAWADwABOFErAARwPAR7AARwawABUJwgACC6CwAEcYsAayh0WwAEchIfAARxzwBrSzoRHwABMbIHAARyZwBrKDRbAARypLq7atl4WwAEcwi6u27ZfFMABHOXAGtRICQAUwAEc/sAa0vgIAABJwAEdGRbAAR0phsABHR3AGsrUr+7AAEBHPgNAIhbAAR1VhsABHUnAGsrUg73AAEBKARbAAR1thsABHWHAGsrUifvAAEBMwAEdScABHXcATsABHY7AAR2cAACv72ADwABOFAEmwAEdjgGGwAEdnsAaytRgA8AAThRKwAEdsQEfwAEdvMAAVBwFAAUugsABHePAGsodgcABHerAGsoNFsABHf6HwAEd8MAa1T6ERMAAThkrAEnAAR4YJcABHigAhsABHhzAGsrUYAPAAE6pPgJAHMABHlCEwAEeScAaykgnAQABKwDAAGxewAEeScABHlcASsABHmABH8ABHmvAAFVVAwADLoLAAR6EwBrKHRTAAR6LwBrK1AYBYAPAAE6pAEnAAR6kJcABHrQAhsABHqjAGsrUYAPAAFtgPgFKwAEe0wEfwAEe3sAAVKgDAAMugsABHvnAGsodFMABHwDAGsrUBgFgA8AAW2AAScABHxkiFsABHymGwAEfHcAaytSv8MAAQDcAISXAAR9DAIbAAR83wBrK1GADwABCsD4BSsABH2MBhsABH2rAGsrUPgZOwAEfmMABH6YAAK/rYAPAAE4UARzAAR+yLq/sti0EAASAwAEf0cAayf2GwAEf2MAaytSBwAEf5cAayg2FwAEf68AaymYAtm1OwAEgDMABIBoAAK/tYAPAAE4UASMlwAEgMgCGwAEgJsAaytRgA8AAThQUwAEgRcAaytQGAWADwABOFCsBYAPAAE4UQCIhHMABIHQUwAEgZsAa1uQIACcBAAErAMAAbF4BIRzAASCNh8ABIH/AGtacJwEAASsAwABsXsABIGbAASCUAE7AASCzwAEgvQAArx5gA8AAVAQBHsABIMPAAFQKBQAFLoHAASD2wBrKDYLAASD8wBrKHRTAASEDwBrW5AgAh8ABIRLAGtacAEnAASEoIRzAASE8FsABISwurtO2VycBAAFqwAEhT2ADwABPWMAA3bYAwABsXj4CTsABIWbAASFxAACv8WADg6wBFsABIX0UwAEhc8Aa12cJAK/xwABUB0nAASGRISIiJcABIaIAFMABIZfAGtfeCgBgA4PMABbAASG5FMABIa7AGtfeCgFgA4PMhMGD3gElwAEiHAAUwAEiEcAa194KAGADhEs+AT0cwAEiNy6sYAMAA2rAASJXYAOy28AAtTWFwAEidsAaymYWwAEiiILAASKCwBrKHYDgvmYAt2M/P0rAASKpARTAASKwwBrXZwkABrZtgKbAASNawAEjaMABJasAAK/sti0AAAABA8ABI4bAASWrAAAABAQEwAEjlAAAAJppYAPAAEJNAMABI6MAAACatmADwABALgDAASO3AAAAgYhgA8AAbBgAwAEjwQAAAInOYAPAAGwfAABgA8AAThQBPgNOwAEj2wAAAILmYAPAAEAuAEnAASPnFsABI/eBwAEj68Aa2NeDf8AAQEk+AT2MwAEkCcAa2RKBwAEkEsAa2NdJwAEkKhbAASQ6gcABJC7AGtjXhP3AAEA9PgE9jMABJEzAGtkSHMABJFuAwAEkVcAa2Mev8gMAA4LAASRowBrY54PAASRuwBrY9xbAASR6LoFMtkQAwABCZUnAASSLFsABJJuBwAEkj8Aa2NeJ98AAQDs+Ak7AASS6wAEkxwAAry9gA8AAThQBJsABJLoBgcABJMnAGtjXYAPAAE4UScABJNwhFsABJO6FwAEk4cAa2cWGNMAAWcM+AT2MwAElBsAa2RIcwAElFYDAASUPwBrYx6/yAwADgsABJSLAGtjng8ABJSjAGtj3FsABJTQugUy2RADAAEJlPgE9jMABJVHAGtkSgcABJVrAGtjXP0rAASV5ASMlwAElhwCEwAElgMAa2RJgA8AAThQUwAElmsAa2RIEAWADwABOFCsBYAPAAE4UBra5gKbAASWwwAElwcABJxgAAK/zAWrAASWxYAPAAGxWgLUAAAEDwAEl0MABJxgAAAABAQHAASXXAAAArx1gA75NAABcAT4EPRzAASXlLq8TAQABJ6/0ALdnTsABJgnAASYOAACEDWADwABsVgEcwAEmEC6u8wAAAADAAGJbTsABJiLAASYsAACv9WADwABsVgEcwAEmLi6u8wAAAADAAGJbScABJjklwAEmRwCCwAEmPcAa2xFgA8AAYsQ+AT0cwAEmYi6u8AEAARTAASZnwBrbEQIBYAPAAGLEALZyScABJn4lwAEmhwCBwAEmgsAa2u1gA8AAYsQ+AT0cwAEmoi6u8AEAARTAASanwBra7QEBYAPAAGLEALZyPgJOwAEmzMABJtcAAJAlYAPAAE9qASbAASbMAYHAASbZwBra7WADwABPaj0cwAEm5S6u8AEAARzAASb1g8ABJurAGtuvr/YBAAGCwAEnA8Aa2xEAwABPdAC2cga2uoCmwAEnHcABJy7AASeJAACv9wFqwAEnHmADwABsVoC1AAABA8ABJ0DAASeJAAAAAQEBwAEnRwAAAKlqYAO+TQAAXAE+Aj0cwAEnVC6vEwEAASev9wC3Zz0cwAEnei6u8AEAAYDAASd/wBrcPAC2cga2u4CmwAEnjsABJ5/AASfwAACv+AFqwAEnj2ADwABsVoC1AAABA8ABJ6/AASfwAAAAAQEBwAEntgAAAKlqYAO+TQAAXAE+Aj0cwAEnwy6vEwEAASev+QC3Zz0cwAEn4S6u8AEAAYDAASfmwBrcrgC2cga2vICmwAEn9cABKAbAAS9fAACv+gFqwAEn9mADwABsVoC1AAABA8ABKBbAAS9fAAAAAgICwAEoGwAAAK/7YAPAAGwfAMABKDUAAACvGGADvk0AAFwBPgI9HMABKEUurxMBAAEnr/oAt2dJwAEoaRzAASiAgMABKG3AGt0gJwEAAZMAwABsMj4DTsABKJTAASiaAACpamADvk0BJsABKJQBHMABKJwurvMAAAAAwABiW2ADvk1OwAEosMABKLYAAIE+YAPAAGwYAR7AASi4wABLbwMAAxbAASjNgsABKMfAGt11qWu+Z4LAASjVwBrddS4APRzAASjpLq7wAQABHMABKPUWwAEo7i6uvLY4r/wCAAIewAEpCcAAUC4BAAGCwAEpGMAa3XUAg8ABKSDAGt2hAMAAVkQAtnI+C07AASlAwAEpRgAAilNgA8AAbB8BHMABKUqUgT8BAAEcwAEpX4DAASlMwBrdIIHvAQABlQDAAGzTAMAAbIhOwAEpd8ABKX0AAIQyXQPAAGwZAWADwABsVgEcwAEpoWrAASmFXQPAAGK5AWADwABsVsAA3o2u8wIAAhbAASmlLp93wABiUoLAASmswBreJwDAAGK7ScABKbocwAEpxIPAASm+wBreZCcBAAErAMAAbGI+Aj0cwAEp1y6u8AEAAR/AASngwABiygEAARbAASn4gcABKe/AGt0wic6+VgAAtnJKwAEqDgA/TsABKirAASowAACBaWADvk0BJsABKioBFsABKjiDwAEqMsAa3mSBacAAbJRgA75NTsABKkvAASpQAACHD2ADvk0BJsABKksBFsABKliDwAEqUsAa3mSHD8AAbTpgA75NTsABKmrAASpwAACv/WADwABLcgEewAEqcsAAS2kBAAEWwAEqhYTAASp/wBrfDalrvmcATsABKqXAASqxAACFkF0DwABsGQFgA4UaATHAASq/YAOFGgBJwAEq9BzAASsMFsABKwUWwAEq/oTAASr4wBrfDalrvmeA4MAAbJGBOwEAAZQAwABshj4CTsABKyLAASsoAACBPmADwABsGAEewAErNsAAS20E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ATbgwAE4xAAAAAMDA8ABNu0AAACwEmADwABsWwDAATcCAAAArxZgA75NAMABNxQAAACvGGADvk0AAFwBPgM9HMABNyQurxMBAAEnhhkAt2dOwAE3UsABN10AAIV+YAOFGgEjgMABN1/AGuqtHMABN28urvEAAAAAtnMrAWADhRpJwAE3iSIhHMABN5iDwAE3jcAa6vEnAQABKwDAAGxeABbAATejLq7ntmM+AT0cwAE3ui6u8AEAARzAATe/LrATAgACasABN+ZgA7LbwABrOBbAATgTgcABOAjAGuq9ic6+VgC3VQC2cj4BPRzAATg0Lq7wAQABHMABOEAWwAE4OS6uvLY4sBQDAAIewAE4VsAAUC4BAAGBwAE4ZcAa6r0Ag8ABOHLAGurxAbAVIR7AATiSwABs9wIAAhbAATingcABOJzAGuq9qWu+ZyeViwDAAFZjALZyBrbEgKbAATjJwAE42sABOYwAALAWAWrAATjKYAPAAGxWgLUAAAEDwAE47MABOYwAAAABAQHAATjzAAAAqWpgA75NAABcAT4ETsABOQvAATkVAACFimADhRoBHMABORcurvEAAAAAtnM9HMABOSousBcBAAGBwAE5RMAa7D8At2o9HMABOVQurvABAAGBwAE5WcAa7D8AtnI9HcABOW+wFgEAAYDAATmCwBrsKwDAAFAmBrbFgKbAATmRwAE5osABOgYAALAYAWrAATmSYAPAAGxWgLUAAAEDwAE5ssABOgYAAAABAQHAATm5AAAAqWpgA75NAABcAT4CPTXAATnGAAABAGADwABR2QEWwAE5xi6uw7ZGIxzAATnGgcABOcbAGuzxJwEAASsAwABsXiscwAE51IHAATnGwBrs8bAZAAAAAMAAUeQBXD0dwAE567AYAQABgMABOfzAGuzcAMAAUCcGtsaApsABOgvAATocwAE7XwAAsBoBasABOgxgA8AAbFaAtQAAAQPAAToqwAE7XwAAAAICAsABOjEAAACwG2ADvk0AwAE6QAAAALAcYAO+TQAAXAE+BU7AATpbwAE6ZAAAsB1gA4f4ARzAATpmLq8AAQABgcABOnzAGu2aALZ7TsABOpbAATqfAACwHmADh/gBHMABOqEurwEAAAAAtnxOwAE6wMABOsoAAIWKYAOFGgEmwAE6wAEcwAE6zC6u8wAAAADAAGJbYAOFGj01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iOcAtl2FwAFTFcAbAugBXQPAAGwZAV0DwABsGQFgA4jnNgEAAYLAAVNkwBsAoQDAAGxHPz0cwAFTfi6u8AEAARzAAVOKFsABU4Murry2OLA2AgACgsABU5/AGwChFsABU6ougUy2RADAAFZqALZyPRzAAVO7Lq7sti0AAAAAtmoGttCApsABVgDAAVYRwAFYigAAsDcBasABVgFgA8AAbFaAtQAAAQPAAVYbwAFYigAAAAICAsABViIAAACpamADvk0AwAFWMwAAALA4YAPAAGF8AABcAT4CScABVkQcwAFWUoHAAVZIwBsD/ycBAAFqwAFWX2ADwABhfMAA4D8AwABsXj4BPTXAAVa2AAABAF0DwABJrgJgA4JSYAOI5wE1wAFWtgAAAQBgA8AAUI8BFsABVrYursK2RSMcwAFWtoLAAVa2wBsEXCcBAAErAMAAbF4rFsABVsSCwAFWtsAbBFyu3cAAUJYBXQPAAEmuAmADglJgA4jnIxzAAVa2gsABVrbAGwRDJwEAASsAwABsXiscwAFW14LAAVa2wBsEQ7A6AAAAAMAASbYBXEnAAVbvHMABVv2BwAFW88AbA/8nAQABasABVwpgA8AAYXzAAOBWAMAAbF4+Aj0XwAFXbS6u3BzAAVemFsABV4Uurty2YK7KAQABNcABV64AAAEAXQPAAEmuAmADglJgA4jnATXAAVeuAAABAGADwABQjwEWwAFXri6uwrZFIxzAAVeugsABV67AGwVLJwEAASsAwABsXisWwAFXvILAAVeuwBsFS67dwABQlgFdA8AASa4CYAOCUmADiOcjHMABV66CwAFXrsAbBTInAQABKwDAAGxeKxzAAVfPgsABV67AGwUysDwAAAAAwABJuAFdA8AASdIBYAOI5wDAAEvGtmA9NcABWCwAAAEAXQPAAEmuAmADglJgA4jnATXAAVgsAAABAGADwABQjwEWwAFYLC6uwrZFIxzAAVgsgsABWCzAGwYCJwEAASsAwABsXisWwAFYOoLAAVgswBsGAq7dwABQlgFdA8AASa4CYAOCUmADiOcjHMABWCyCwAFYLMAbBeknAQABKwDAAGxeKxzAAVhNgsABWCzAGwXpsDoAAAAAwABJtgFcPz0dwAFYarA3AgACgMABWHXAGwPxgcABWHzAGwP/AMAAUBoGttGApsABWI/AAVigwAFa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qEIAAAABAQHAAaZFAAAAsKFgA75NAABcAT4GQBzAAaZYLq+ZAgACgMABpmPAG0KMMcABpmlgA8AAS4gBHsABpnHAAEuHAQABMcABpn5gA8AAS4gCasABpopgA8AAS4jAAN74asABpqFgA8AAS4jAAN8IAADAAGJWwAGmWMABprMAScABprohFsABps4WwAGmvy6scbY5g1bAAEbnPgE9HMABpu4usKIBAAGAwAGnFsAbQowAwABQPT9OwAGnLsABpzYAAIWCYAPAAGxWARzAAac4Lq7zAAAAAMAAYltOwAGnTgAAAIV+YAOFGgBJwAGnXiXAAadqAIHAAadiwBtDPmADwABTOT4BPYrAAaeAwBtDYhzAAaeVFMABp43AG0M+AQFgA8AAUzmu9wAAAADAAFNGPgJAJcABp8oAgcABp8LAG0M+YAOFGsABp8LAAafXAD2KwAGn4MAbQ2ImwAGn4AGBwAGn7cAbQz5gA4UaPRzAAagALq7wAQABHMABqAwWwAGoBS6uvLY4sKMCAAIewAGoHMAAUC4BAAGAwAGoK8AbQowAgsABqDLAG0NiAMAAVoAAtnIGtuqApsABqEfAAahYwAGxiwAAsKQBasABqEhgA8AAbFaAtQAAAQPAAahiwAGxiwAAAAICAsABqGkAAACvFmADvk0AwAGoewAAALClYAO+TQAAXAE+CT0cwAGo2y6vEwEAASeEfAC3Z0nAAajzIRbAAakHFsABqPgurHG2OYNWwABG5z4BPRzAAaknLrCmAQABgcABqUHAG0R8AMAAUDs/TsABqV/AAalyAACwp2ADwABsWwEhHMABqYGBwAGpdMAbRHwnAQABKwDAAGxeTsABqaPAAamtAACBrV0DwABsGQFgA8AATz8BJsABqaMBHMABqa8urvMAAAAAwABiW10DwABsGQFgA8AATz9OwAGpwcABqcYAAIGIYAPAAGxWARzAAanILq7zAAAAAMAAYltJwAGp0yXAAancAITAAanXwBtFRWADwABPjz4ETsABqgTAAaoOAACwqGADwABPjwEUwAGqEMAbRUUEAWADwABPj07AAaojwAGqKgAAi2FgA8AAbFYBFsABqjaFwAGqLMAbRYWv9cAAT5FOwAGqTcABqlQAALCpYAO+TQEewAGqVsAAT2kBAAGFwAGqbsAbRYUAScABqoAlwAGqiwCGwAGq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rvMAAAAAwABiW2ADwABPP0nAAcdiHMABx3sWwAHHZi6uzrZRJwEAAZMAwABsMj4BPRzAAclMLq82AQABFMAByVrAG16FCAAAt2w/TsAByW/AAcl5AACwMmADwABsHwEmwAHJbwEcwAHJey6u8wAAAADAAGJbYAPAAGwfScAByYYWwAHJii6uzLZPPgE9FcAByaHAG17wCRzAAcmrFMAByaHAG17wCQCB1QEAAWrAAcmuYAPAAGwfgpsAwABsuj9OwAHJ1MAByeAAAIQRXQPAAGwZAWADhRoBJsABydQBHMAByeIurvMAAAAAwABiW10DwABsGQFgA4UaScABye0lwAHJ+gCHwAHJ8cAbXmFgA8AAYsQ+Aj0cwAHKFS6u8AEAARTAAcoawBteYQcBYAPAAGLEALZySsAByisAP07AAcpIwAHKTQAAgYhgA8AAT2oBJsABykgBh8AByk/AG15hYAPAAE9qTsABynQAAACFOGADwABNaABJwAHKgyIiIRbAAcqILq7Mtk8AHMAByrYWwAHKoS6uzrZRJwEAAZMAwABsMgAhHMABytGGwAHKxsAbXconAQABasAByt9gA8AAYeXAAOEdAMAAbF4+A07AAcsQwAHLFwAAhERgA8AATYgBJsAByxABFsAByx4uhES2OmADwABNiD0VwAHLLMAbYAoMHMAByz8UwAHLOMAbYHENALDeAQABFMABy0nAG1/hCwAAwABNo0nAActWHMABy2QUwAHLWsAbYAoMACcBAAErAMAAbF4+Aj0cwAHL/y6u8AEAAR/AAcwIwABiygEAARbAAcwhgsABzBfAG12Qic6+VgAAtnJKwAHMNwA/PgE9FcABzFrAG2AKDDXAAcxqAAABAGADwABNaAEfwAHMasAATYYHAAcrFMABzIfAG17wCQA1wAHMkgAAAQBgA8AATz8BFMABzJLAG16FCAAjHMABzJIUwAHMksAbYVYNACcBAAErAMAAbF4rFsABzJgUwAHMksAbYVYNAIeDwABPQQFgA8AAQYY1wAHMqwAAAQBgA8AAT2oBFMABzKvAG1/hCwAjHMABzKsUwAHMq8AbYaoNACcBAAErAMAAbF4rFsABzLEUwAHMq8AbYaoNAIGIwABPbAFgA8AAbBgWwAHMty6scbY5HsABzMfAAFAuAQABgsABzNbAG12QABbAAcziLoFMtkQA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wAIlUi6uvLY4sSYBAAGBwAIlbcAbpz8AwABWOYDgwABsaoE7AQABFsACJacWwAIlkoDAAiWJwBunMYRwicKA4MAAbGoAwABshj4BSsACJbcBHMACJmMcwAIl6GrAAiXEXQOy5wFhAwJgA8AAbB9gA8AAbB9gA7LPwADSOY1vAgACFsACJhQWwAIl/4DAAiX2wBunMYRwicKA4MAAbGoWwAImUBzAAiYxFsACJiourry2OLEmAQABgcACJkXAG6c/AMAAVjmA4MAAbGoAsuuLjAMAAxbAAiZwLoFMtkQWwAImf4HAAiZ1wBunP4QBgllqwAImi2ADwABsHwMAstY/TsACJrbAAia8AACFI10DwABsGQFgA4XyARzAAibFFsACJr4urry2OLEnAQABgcACJtTAG6c/AMAAVjhJwAIm5BbAAibug8ACJujAG6l4IsAAbCI+Ak7AAicOwAInFAAAhGldA8AAbFcBYAPAAGwYAR7AAickwABsrwEBYAPAAGwYARzAAidGFsACJzaAwAInLcAbpzGEcYnDgqEBAVsBNMACJ0oDwAInSsACJ1cAAAABAQHAAidLAAAAgKJgA4nuAABgA8AAbBgBSsACJ1EBFsACJ1OEwAInUcAbqiqBiInxAMAAbOsAPgJOwAInggAAADxdA8AAbEoBYAOF8gEWwAIngh4AwABsLwEBXQPAAGwgAWADhfIBg8ACJ4LAG6l4AD3AAGxLRQAAARzAAieChQDAG6phPgAAAADAAGxNAD4CTsACJ3YAAACP5mADhfIBFsACJ4mFAMAbqmFAwABsTz4BScACJ5MhHMACJ56EwAInmMAbqc0rAQABFsACJ7CGwAInp8AbqrmBiIX0AMAAbHg+AUrAAifDARzAAigoHMACJ/xqwAIn0F0DsucBYQMBYAPAAGwYYAOyz8AAsVKNbwEAARbAAigThsACKArAG6q5gYiF9ACy64uMAwADFsACKDUugUy2RBbAAihDhsACKDrAG6q5hAGCWRbAAihdFsACKFiGwAIoT8AbqrmBiIX0gODAAGyRALLWPz9JwAIoghbAAiifFsACKI+AwAIohsAbpzGEcYnDIsAAbCI+AUnAAiizIhbAAijGFsACKLcurHG2OYNWwABG5wAWwAIpABbAAij5FsACKOourHG2Oav5wABGuo/kwABdeD4CTsACKSnAAik3AACxKV0DwABsVwFgA8AAbBgBHsACKT3AAGyvAQFgA8AAbBgBHMACKUyDwAIpRsAbqXiCoQEBWwE0wAIpUAPAAilQwAIpXQAAAAEBAcACKVEAAACAomADhfIAAGADwABsGAFKwAIpVwEWwAIpWYTAAilXwBusSIGIhfQAwABs6wA+Ak7AAimOAAAAPF0DwABsSgFgA4nuARbAAimOHgDAAGwvAQFdA8AAbCABYAOJ7gEWwAIpjoDAAimFwBunMYRxicMAPcAAbEtFAAABHMACKY6FAMAbrH8+AAAAAMAAbE0APgJOwAIpeAAAAIU4YAOJ7gEWwAIpn4UAwBusf0DAAGxPPgFJwAIpqyIWwAIpuYbAAimvwBus4IUhifMAIRzAAinWhMACKcjAG6v0KwEAARbAAinphsACKd/AG6zggYiJ8QDAAGx4PgFJwAIp/hbAAioYFsACKhEWwAIqAi6scbY5q/nAAEa6j+PAAF13PgFKwAIqOAEcwAIquxzAAiqKasACKkVdA7LnAWEDAWADwABsGGADss/AANp7jW8BAAEWwAIqoobAAiqYwBus4IGIifEAsuuLjAMAAxbAAirILoFMtkQWwAIq14HAAirNwBunP4QBgllqwAIq6WADwABsHwMAstY+AT0cwAIrFy6sYAMAAxzAAiuGasACKztdA7LnAWEDAWADwABsGGADss/AANrNjW8BAAEWwAIrnobAAiuUwBus4IGIifEAsusWwAIrwYHAAiu3wBunP4QBgllqwAIr5WADwABsHwMAt2M/Pz9OwAIsM8ACLDkAAIPLXQPAAGwZAWADwABsVgEcwAIsQhbAAiw7Lq68tjivnQEAAYHAAixZwBunPwDAAFY6TsACLH3AAiyMAACDY10DwABsGQFgA4omARbAAiyXgMACLI7AG6cxg2OJwEnAAiyrIiEcwAIsxRbAAiy+hcACLK/AG66LgODAAGxqJwEAARbAAizOhMACLMjAG65OgODAAGxqAMAAbDIAIRzAAizlFsACLN6EwAIs2MAbrk6A4MAAbGonAQABkwDAAGwyPgFKwAIthAEcwAIt6RzAAi25asACLZFdA7LnAWEDAWADwABsH2ADss/AANL3jW8BAAEWwAIt1oXAAi3HwBuui4DgwABsagCy64uMAwADFsACLfYugUy2RILAAi37wBunTWrAAi4DYAPA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AofQLq7wAQABFMACh9XAG/tMCwAAtnIGtnCApsACh+vAAof5wAKSjQAAsX+2LQAAAAEDwAKIDsACko0AAAAEBATAAogcAAAAsFtgA75NAMACiCwAAACxfWADvk0AwAKIPAAAALF+YAPAAGxWAMACiE4AAACE+GADh/gAAGADt8kBPgNOwAKIaMACiHEAAJDoYAO3yQEfwAKId7fTAAAAAEnAAoiMJcACiJcAgsACiJDAG/01YAOI5z4EPRfAAokrFMACiSTAG/01AgFgA4jnhNcqiQc9F8ACiUqEwAKJQcAb/VyxhRTAAolowBv9NQIBYAOI57fLPTXAAol2AAABAF0DwABJrgJgA4JSYAOI5wE1wAKJdgAAAQBgA8AAUI8BFsACiXYursK2RSMcwAKJdoXAAol2wBv96ScBAAErAMAAbF4rFsACiYSFwAKJdsAb/emu3cAAUJYBXQPAAEmuAmADglJgA4jnIxzAAol2hcACiXbAG/3QJwEAASsAwABsXiscwAKJl4XAAol2wBv90EUBAAEUwAKJncAb/TUCAWADiOcAwABJvwFcScACiawWwAKJtxTAAomwwBv9NQIBYAOI54TBiPo+AT0XwAKJ04TAAonKwBv9XLGAHMACiecurvgDAANqwAKKB2ADstvAAI77FsACij0UwAKKNsAb/TUCAWADiOeEAYJZFsACimEWwAKKXBTAAopVwBv9NQIBYAOI54GIiOuA4MAAbJEAt1C3zj8+Ak7AAoqZwAKKogAAhRRgA4jnARfAAoqthMACiqTAG/1csYYcwAKK3RbAAorWLq68tjixhwQAAx7AAosGwABQLgEAAYDAAosVwBv9GQArFsACiyYurs62UQGE1inAAFZzt8xJwAKLYCXAAotrAILAAotkwBv9NWADwABTOT4DTsACjNPAAozYAACv3WADwABSKgE1wAKM5gAAAQBgA8AAUdkBFsACjOYursO2RiMcwAKM5obAAozmwBv/nycBAAErAMAAbF4rHMACjPSGwAKM5sAb/5+v3gIAAoXAAo0FwBv/DhbAAo0PLq7OtlEAwABR6gFgA8AAUipOwAKNQcACjUcAAJppYAPAAFI7ATXAAo1JAAABAGADwABR2QEWwAKNSS6uw7ZGIxzAAo1Jh8ACjUnAHAAZJwEAASsAwABsXisWwAKNV4fAAo1JwBwAGa/f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wBwbRCMcwAKw3BTAArDcwBwcagsAJwEAASsAwABsXhbAArD6gsACsOrAHBs2r5e+WhTAArDcwBwcagsAAWADvk1OwAKxEMACsSMAALGmYAO+TQGCwAKxJcAcGzZBQ8ACsTwhFsACsVcUwAKxRMAcHL4MAKupvls+A07AArFuwAKxeAAAsadgA75NARbAArGNFMACsXrAHBy+DACDYL5oScACsZscwAKxqRTAArGfwBwc9g0AJwEAARTAArGswBwcWAsAAMAAbF4+AULAArHLAEnAArHhIh7AArHlwABiBQIAAieO8RTAArHzwBwc9g0AAAAcwAKyHBbAArIXFMACsg3AHBz2DQCDYL5oJwEAARTAArIfwBwcWAsAAMAAbF4+AULAArK4AD89FcACstHAHBy+DBTAArLmwBwc9g0AScACsv8WwAKzFhTAArMDwBwcvgwAq6m+Wz4BPRXAArMnwBwcRwoVwAKzM8AcHBgJHMACs0GUgVoAAAAAwABsjz4BPRXAArNcwBwcRwocwAKzghbAArN7FMACs2jAHBy+DACECr5pgT8BAAEWwAKzlxTAArOEwBwcvgwAgOC+ZgDAAGyISsACs64BHMACs7wWwAKztS6uvLY4saQFAAWHwAKz3cAcG8GGwAKz6cAcG6GFwAKz9MAcG3gUwAKz/cAcHBgJABTAArQKwBwcRwoAAMAAVlNBR8ACtCGBwAK0KcAcGyYDAcACtENqwAK0Q2ADwABhbsAA4lkAPgI9HMACtFYurvABAAEcwAK0cBTAArRbwBwb7wgAgJUAAAAAAAC2ckLAArR9AAHAArSXasACtJdgA8AAYW7AAOJxAD4CPRzAArUiLq7wAQABHMACtScurvgDAANqwAK1R2ADstvAAFhWh8ACtWLAHBvBFsACtXyAwAK1bsAcGxiA4L5mALdQALZyQsACtY4AAcACtahqwAK1qGADwABhbsAA4ogAPgI9HMACtb0urvABAAEcwAK1yRbAArXCLq68tjixqwIAAofAArXuwBwbwSbAArYPARzAArYPFMACtfrAHBvvCACAlQAAAAAAYAOIJgDAAFZSALZyQsACth0ABrc/gKbAArYxwAK2QsACtycAALGsAWrAArYyYAPAAGxWgLUAAAEDwAK2U8ACtycAAAADAwPAArZaAAAAsa1gA75NAMACtmwAAACwd2ADvk0AwAK2fQAAAK8YYAO+TQAAXAE+Aj0cwAK2jS6vEwEAASeGJgC3Zz0cwAK2ry6u8AEAARzAAra7FsACtrQurry2OLGuAwACHsACttDAAFAuAQABgMACtt/AHB/nABzAArbsLq7xAAAAALZzAYYpIRzAArcagcACtxDAHB/1JwEAASsAwABsXsAAVm4AtnIGt0CApsACtyzAArc9wAK4YAAAsa8BasACty1gA8AAbFaAtQAAAQPAArdNwAK4YAAAAAEBAcACt1QAAACpamADvk0AAFwBPgU9HMACt2EurxMBAAEnsa8At2c9NcACt8sAAAEAXQPAAEmuAmADglJgA4jnATXAArfLAAABAGADwABQjwEWwAK3yy6uwrZFIxzAArfLgcACt8vAHCEEJwEAASsAwABsXisWwAK32YHAArfLwBwhBK7dwABQlgFdA8AASa4CYAOCUmADiOcjHMACt8uBwAK3y8AcIOsnAQABKwDAAGxeKxzAArfsgcACt8vAHCDrsDoAAAAAwABJtgFcPRzAArf9Lq9+AQABJ7GwAMAAUBA9HMACuCIurwMAAAAAtn09HMACuDousEMBAAEWwAK4UYDAArhLwBwgxInOvlYAwABQEga3QYCmwAK4ZcACuHbAAr55AACxsQFqwAK4ZmADwABsVoC1AAABA8ACuIXAAr55AAAAAwMDwAK4igAAALGQYAPAAGwfAMACuJoAAACxsmADwABsHwDAArixAAAAsbNgA75NAABcAT4NPRzAArjDLq8TAQABJ7GxALdnTsACuOrAArjwAACKU2ADwABsHwEcwAK4/YDAArjywBwiCoE/AQABgcACuP/AHCIaAMAAbIhOwAK5IcACuTYAALG0XQPAAGwZAWADwABsVgEcwAK5YmrAArlGXQPAAGK5AWADwABsVsAA3o2u8wIAAhbAArlmLp93wABiUoPAArltwBwiUADAAGK7TsACuYXAArmMAACUk10DwABsGQFgA7fBASMcwAK5mYDAArmOwBwiCicBAAGTAMAAbDIrHsACuavAAGz8AQFgA7fBAYDAArm3wBwiCgABXQPAAGwZAWADt8FOwAK52cACueUAAIWQXQPAAGwZAWADhRoBHsACufPAAG0kAwFgA4UaAoHAAroLwBwiGisBhSQpTsACujvAArpGAACxtWADwABsHwGTTsACulPAArpjAACxtmADwABsHwGTScACumwhHMACuoWEwAK6cMAcIoUnAQABKwDAAGxiPgE+Ak7AArq3AAAAPF0DwABsSgFgA8AAbFYBFsACurceAMAAbC8BAV0DwABsIAFgA8AAbFYBhMACurfAHCKFAD3AAGxLRQAAARzAArq3FADAHCO2CQA+AAAAAMAAbE0APgJOwAK6ogAAALG3YAPAAGxWARbAArrNFADAHCO2CQBAwABsTz4BScACutclwAK67QAUwAK628AcJBQKAGADt8E+AT0cwAK7CYXAArsDwBwi2oCcAgACNcACuwoAAAEAYAPAAGwfAYfAArsKwBwjajXAArsUAAABAGADwABsHwGPwAK7FMAcI2ocwAK7FBTAArsKwBwkaQsAgT8BAAGUAMAAbIgUwAK7CsAcJGkLABTAArsawBwkFAoBYAO3wQDAAGzLPgE9HMACu1OGwAK7SMAcIzOAnAIAAjXAArtUAAABAGADwABsHwEUwAK7VMAcI38IADXAArtjAAABAGADwABsHwEVwAK7Y8AcI38IHMACu2MUwAK7VMAcJOsLAIE/AQABlADAAGyIFMACu1TAHCTrCwAmwAK7aQEUwAK7acAcJBQKAGADhRoAwABsyz9AHMACu6UWwAK7ny6aacAAUAgnAQABFsACu6gurtK2VQDAAGxewAK7n8ACu7MAScACu7ohHMACu8WFwAK7vsAcItonAQABKwDAAGxiPgE+Ak7AArvqAAAAPF0DwABsSgFgA7fBARbAArvqHgDAAGwvAQFdA8AAbCABYAO3wQGFwAK76sAcItoAPcAAbEtFAAABHMACu+oUAMAcJbEJAD4AAAAAwABsTQA+Ak7AArvhAAAAjT1gA7fBARbAArvyFADAHCWxCQBAwABsTz4CTsACvAPAArwNAACxuGADwABsGAEWwAK8FRTAArwPwBwmCwoAgYi3w0nAArwjHMACvC0WwAK8Jy6aacAAUAixuQEAARTAArw7wBwmLgsAAMAAQmo+AUnAArySIRzAArydFsACvJcummnAAFAIsboBAAEUwAK8qMAcJi4LAADAAEJtPgE9HMACvMIurGADAAMcwAK9IWrAArzkXQOy5wFhAwFgA8AAbBhgA7LPwABzYo1vAQABFMACvS/AHCYuCwAAsusWwAK9URTAAr1LwBwmCwoAic63xBbAAr13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AT0cwALHoRTAAseawBwxKwkAscoCAAIWwALHri6uvLY4hsACx7bAHC/SALeYPz9FwALH6AHAAsfxwALH8wAAgdRgA8AAbB8BkwEcwALH+oTAAsf4wBwxyYE6AQABHMACyAaAwALH/MAcLq5EAQABlADAAGzhAMAAbIUBjMACyAvAHDHJHMACyAyEwALIC8AcMcmBPwEAAZQAwABsiD4GTsACyCPAAsgrAABAYAOIgwEcwALIMoPAAsgtwBwu8ikBAAGEwALIM8AcMckAwABsuE7AAshDwALISQAAlXlgA4gIASbAAshDARbAAshThcACyEvAHDI0hPiIh2ADiAhOwALI2cACyOIAALHLYAOCUgEjFsACyP8WwALI9IbAAsjuwBwyZYXxiAqBVsAAbPMrFsACySEWwALJFobAAskQwBwyZYXxiAqHD8AAbToBYAOH+EnAAsktHMACyTgWwALJMS6uvLY4scwBAAGHwALJQMAcMpMAwABWbz4CTsACyYXAAsmLAACVeWADiAgBJsACyYUBh8ACyY3AHDKTYAOICD2PwALJn8AcMpMjFsACybsWwALJsBTAAsmqwBwzDwgAhfGICoFWwABs8ysWwALJ3RbAAsnSFMACyczAHDMPCACF8YgKhw/AAG06AWADh/g/ScACyfElwALJ/gCHwALJ9cAcMpNgA4f+PgJOwALKNMACyj4AAIUXYAOH/gEmwALKNAGHwALKQMAcMpNgA4f+PY/AAspSwBwykxbAAspnFMACyl3AHDOeCACFfogAP0nAAsqBIiIiIiElwALKjgCHwALKhcAcMpNgA4g9ACElwALKtwCHwALKrsAcMpNgA4iRACElwALK6QCHwALK4MAcMpNgA4ddACElwALLCwCHwALLAsAcMpNgA4inACEcwALLNBbAAsstLq68tjiZUwEAAYfAAss8wBwykwDAAFZoPgE9HMACy1eGwALLUcAcMmWF8wEAAR/AAst1iAcBAAEcwALLiS6xzQEAARbAAsunhcACy5/AHDI0hAGCWQC3UwAAiBA/PRzAAsvJLq7wAQABg8ACy87AHC7yALZyBrdFgKbAAsvdwALL7sACzHEAALHOAWrAAsveYAPAAGxWgLUAAAEDwALL/cACzHEAAAACAgLAAswEAAAAr61gA75NAMACzBcAAACBWGADvk0AAFwBPgE9HMAC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Z8ADL2oAAK82AWrAAy5TYAPAAGxWgLUAAAEDwAMudMADL2oAAAACAQHAAy6EAAAAshdgA8AATz8AAcADLqAAAACyCGADwABsWwFqwAMuumADwABsWxxgA4lVAT4CScADLsgcwAMu24DAAy7MwBx/FScBAAErAMAAbF5KwAMu5AErP0rAAy71ATXAAy8/AAABAGADwABBhgEWwAMvPxzAAy78LrIHAgACgMADLwzAHH8VgcADLxzAHH8mALdfh4PAAE9BIxzAAy8/gsADLz/AHH91JwEAASsAwABsXiscwAMvUYLAAy8/wBx/dayOAQABFsADL1curHG2OQDAAEGVAWADiVUGt22ApsADL2/AAy+KwAMw5gAAr58BasADL3BgA8AAbFaAtQAAAQPAAy+gwAMw5gAAAAEBAcADL7YAAACyGF0DwABsGQFgA8AATz8AAF0DwABsGQFgA4lVAT4EScADL80cwAMv4YDAAy/RwByAJScBAAErAMAAbGJKwAMv6gExwAMv+2ADiVUAP07AAzASwAMwGAAAg8tdA8AAbBkBYAOJVQEewAMwJsAAbSQDAWADiVUCFsADMEyAwAMwPMAcgCWA4MAAbGorAYUkKUXAAzBvAcADMHjAAzB6AACB1GADwABsHwGTARzAAzCBgsADMH/AHIDBgToBAAEWwAMwiYHAAzCDwByAeoDgwABsagDAAGyFAYrAAzCRwByAwRzAAzCSgsADMJHAHIDBgT8BAAGUAMAAbIg+AT0cwAMwo4HAAzCewByAeoCcAgACgsADMKTAHIDBHMADMKkurzYBAAEcwAMwxoDAAzC3wByAJSkBAAGCwAMwx8AcgMEAwABsuAC3bADAAGzLSsADMNYBgcADMN3AHIB6BrdugKbAAzDrwAMw/sADMocAAK9vAWrAAzDsYAPAAGxWgLUAAAEDwAMxG8ADMocAAAADAQHAAzEjAAAAgYhgA8AAbBgAAsADMTcAAACDmmADwABsGAFqAGABwABsXALAAzFHAAAAifRgA8AAbFsBasADMVBgA8AAbFscYAPAAGwYAT4CScADMV4cwAMxbIHAAzFiwByBzCcBAAErAMAAbDY+A07AAzGDwAMxhwAAgSxgA4MyARbAAzGWFsADMYkurIS2PIEswABAj0nAAzGhgsADMaXAHIHlPgI9i8ADMbjAHIIqFsADMcKD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wAM/GS6DbbejAAa3r4CmwAM/KsADPy/AAz/EAACwbgAAAAEDwAM/PMADP8QAAAADAwPAAz9LAAAArrxgA8AAVjMAwAM/XQAAAIC+YAOH+ADAAz9vAAAAsG1gA4f4AABcAT4BPRzAAz+SFsADP4YusES3nrBuAwADgMADP6DAHJe6gcADP6jAHJfKgsADP7DAHJfYALeWBrewgKbAAz/JwAM/4sADQFQAALBpAAAAAQPAAz/ywANAVAAAAAICAsADP/oAAACuvGADwABWMwDAA0AMAAAAgL5gA4f4AABdA8AAbBkBYAPAAEORAT4BSsADQBoBHMADQDAWwANAIS6wRrefsGkCAAKAwANAQcAcmEaBwANAScAcmFYAt5cGt7GApsADQFnAA0BewANAxwAAscoAAAABA8ADQGrAA0DHAAAAAgICwANAcgAAAK68YAPAAFYzAMADQIUAAACAvmADiIMAAFwBPgE9HsADQJO1PwMAAyexyhbAA0CvLonOt6EWwANAuy6DbbejAAa3qoCmwANAzMADQOPAA0EIAQCvjgFqwANAzWADwABsVoC1AAABA8ADQPXAA0EIAAAAAAAAAGADwABsGAFKwANA+AEnsiEAAByUTwAclKcAHJUFAByVcwAcldcAHJYOAByWRQAclnwAHJbYAByXNAAcl5IAHJgeAByYpAAcmRIAHJlYAAAADgK3tICmwANBDcADQRPAA0vVA7DxAAABYAPAAGxWAAAEBLe2gKbAA0FLwANBVQmLdwBdA8AAbBkBYAPAAE1oAAS3t4CmwANBY8ADQW0Jic4AYAPAAGwfAAS3uICmwANBe8ADQYEJgOAAYAPAAGwfAAS3uYCmwANBj8ADQZIJgUwAYAPAAGxYAAEFt8CApsADQZfAA0GXwANCQgAAAAPAA0GnwANCQgAAAAQEBMADQa0AAASLd10DwABsGQFgA8AATWgAwANBvgAABInOYAPAAGwfAMADQc8AAASA4GADwABsHwDAA0HcAAAEgUxgA8AAbFgAAGADt7QBPgFJwANB5zXAA0HrAAABAGADwABsWwE1wANB6wAAAQBdA8AAbBkBYAPAAE1oARbAA0HrLot3t7YjHMADQeuEwANB68AcmqknAQABKwDAAGxiKxbAA0H3hMADQevAHJqpgVbAAGzzAWADwABsWyMcwANB64TAA0HrwByamScBAAErAMAAbF4qhMADQevAHJqZAWADwABsWz4BPTDAA0IRJ7IiPwUIAbe2gADAHJpECAG3t4EAwByaWwgBt7iCAMAcmmsIAbe5gwDAHJp7CQHAA0GXwABsWgAAAAAEBre7gKbAA0JHwANCVMADR24AALFlAAAAAQPAA0JlwANHbgAAAAYGBsADQoIAAACBFWADwABGtwDAA0KgAAAAhQNgA8AATz8AwANCzAAAAINjXQPAAGwZAWADwABPHwDAA0LuAAAAr1BgA4ULAMADQw0AAACE+GADh/gAwANDHQAAAISHYAPAAGwfAABgA4TuAT4FTsADQz/AA0NEAACBl2ADib4BJsADQz8BHMADQ7wWwANDqxzAA0NGLrC1AwADgcADQ2LAHJukasADQ3RgA8AATpvAAOM3gsADQ5LAHJu0ALe8h4PAAE9BrI4BAAGAwANDwsAcm5QAwABBlWADib5OwAND6sADQ/8AAIRwXQPAAGwZAWADiOcBMcADRBZgA4jnAE7AA0Q4wANESAAAhHFdA8AAbBkBYAOI5wExwANEX2ADiOcAScADRGchHMADRHYWwANEay6Ld7e2JwEAASsAwABsYj4CPgJOwANEsAAAADxdA8AAbEoBYAPAAE1oARbAA0SwHgDAAGwvAQFdA8AAbCABYAPAAE1oARbAA0SwLot3t7YAPcAAbEtFAAABHMADRLAUAMAcnNcJAD4AAAAAwABsTQA+Ak7AA0SjAAAAhThgA8AATWgBFsADRLwUAMAcnNcJAEDAAGxPPgFJwANExhbAA0TUFMADRMrAHJ02CgCyJMAATXg+AT0cwANE+RTAA0TpwByckQgANgEAARbAA0UHFMADRP3AHJ02CgCFFMAATW8AwABsRz4BPRzAA0VCh8ADRS3AHJxuNgEAARbAA0VQFMADRUbAHJ02CgCFFMAATW8AwABsRz0cwANFgxTAA0VzwByckQgAgKEBAAE0wANFiAPAA0WIwANF6QAAAAICAsADRZ0AAACAomADiOcAwANFtAAAAICjYAOI5wAAYAPAAGwfAT4BSsADRcEBHMADRc8WwANFyhTAA0XIwByeAQkAgYiI64CkAQABFsADRdsUwANF2cAcng8KAIGIiOsAwABsZwDAAGxoP0rAA0X2ATXAA0YBAAABAGADhO4BH8ADRgGFCgcAAYTAA0YOwByb2QaDYxbAA0YxhsADRizAHJwAg2OJwIRwh8ADRl/AHJxuhHEUwANGjsAcnJEIAITlFsADRsSGwANGv8AcnACE5YnBhQMWwANG9YbAA0bwwBycAIUDicaFGoPAA0cWwBybyzXAA0ctAAABAFwBF8ADRy0UwANGAcAcnnEJAIQBFsADRzouic63t4JZNcADR00AAAEAXAEXwANHTRTAA0YBwByecQkAhIeFwANHXcAcm+eE8BTAA0YBwByecQkABre8gKbAA0dzwANHgsADSMMAALC1AAAAAQPAA0eQwANIwwAAAAMCA8ADR6cAAACFA2ADwABPPwDAA0fGAAAAsgtgA8AATpsAwANH+wAAAINjXQPAAGwZAWADwABPHwFqAGABwABsXAIAYAPAAE8/AT4BSsADSBIBH8ADSB3AAE9JAwADH8ADSDnAAE3yBAAENcADSE0AAAEAYAPAAE8/AYDAA0hNwByfdSMcwANITYPAA0hNwByf3icBAAErAMAAbF4rFsADSFmDwANITcAcn96Hg8AAT0EBYAPAAEGGgsADSGLAHJ+VFsADSHIui3e3toHAA0iKwByfhQAWwANIpy6Jzre3FsADSLsugUy3uQAGt72ApsADSMjAA0jOwANLeQAAr38AAAABA8ADSOnAA0t5AAAAAwMDwANI9wAAAIQAYAPAAEJNAMADSQcAAACatmADwABALgDAA0kuAAAAk69gA8AAVgoAAGADwABCTQE+BUnAA0k8HMADSUsWwANJQC6Ld7e2JwEAASsAwABsYkrAA0lUAYDAA0lbwByghT9AFsADSXkWwANJbi6Ld7e2IsAAbCLAA0luwANJgwBOwANJn8ADSaUAAJr2XQPAAGxfAmADwABsGGADwABALgEywANJuGADwABsGGADwABALgA+Ak7AA0nqAAAAPF0DwABsSgFgA8AATWgBFsADSeoeAMAAbC8BAV0DwABsIAFgA8AATWgBFsADSeoui3e3tgA9wABsS0UAAAEcwANJ6oQAwByhQT4AAAAAwABsTQA+Ak7AA0ndAAAAhThgA8AATWgBFsADSfaEAMAcoUFAwABsTz4CTsADSgbAA0oPAACBmWADwABALgEcwANKFoPAA0oRwByhDCkBAAEWwANKIYXAA0oXwByhnoGIwABNbQDAAGxhScADSi4hHMADSjuGwANKMsAcocEnAQABKwDAAGxePgE9HMADSlWCwANKTsAcoKWwsgMAA4bAA0p+wByhwRbAA0qShcADSojAHKGegYjAAE1tFsADSqKFwANKmMAcoZ6JzsAATmQAwABWLT4BPRzAA0rLg8ADSsbAHKEMgJwCAAIWwANK1oXAA0rMwByhnoGIwABNbYXAA0rewByhngDAAGxjSsADSvsBH8ADSwbAAEJ5BAAABJr2g8ADSxzAHKEMhACAwANLM8AcoIWyJSevQLCxKga3voCmwANLfsADS4XAA0vTAACBUwAAAAEDwANLjcADS9MAAAAAAAAAYAPAAGwYAT4BSsADS5YBJMADS88HJ7ImFsADS7Aui3e3tieGrxbAA0u9LonOt7cnhq8WwANLyi6BTLe5J4OjAAAcm2wAHJ9NABygXQAcotIAHKM6AAAABAK3wYCmwANTwsADU8jAA1Q/A5Z3AAABYAPAAGxWAAACBLfDgKbAA1PZwANT3RiBiABgA8AAbBgABLfEgKbAA1PlwANT7xiJzgBgA8AAbB8AAQW3yICmwANT9MADU/TAA1QVAAAAA8ADU/nAA1QVAAAAAgICwANT/wAABIGIYAPAAGwYAMADVAoAAASJzmADwABsHwAAYAO3wQE/AwgBt8OAAMAco8cIAbfEgQDAHKPXCQHAA1P0wABsWgAAAAABBrfGgKbAA1QawANUIcADVD0AAIFTAAAAAQPAA1QpwANUPQAAAAAAAABgA8AAbBgBSsADVC8BJMADVD0DJ7InFsADVDcugYi3wyeDowAAHKQSABykXgAAAAECt8mApsADVELAA1RIwANVigOyKAAAAWADwABsVgAABQS3y4CmwANUbsADVIkYsYUAYAOI5wErBLfMgKbAA1ShwANUvRixhgBgA4jnASsEt82ApsADVMzAA1TfGLGCAGADhRoBKwS3zoCmwANU7sADVP8YsYAAYAOFGgErBLfPgKbAA1UNwANVHhixgwBgA4f4ASsBBbfTAAAAAAQAAAMAAAAAAAAAAABgA7fJAT8BCQEAwABsWgAAAAABBrfRgKbAA1UjwANVO8ADVYgBAIUUAAAAAQPAA1VEwANViAAAAAAAAABgA4jnAUrAA1VNATXAA1VNAAABAGADiOcBFsADVU0usYW3yyMcwANVTYDAA1VNwBylWycBAAErAMAAbF4WwANVbC6xhrfMgMADVU3AHKVbAWADiOcAABylJgAcpaMAAAABAAIEti+AppFwkY4GsikAYAPAAGwfAWqRhmADwABsH4UZBLYwgKaSDZI2BrIqAGADwABsVgFqki5gA8AAbFbAAOCCBAa2MoCmwANMhMADTIrAA048AAGyKwAAAAEDwANMm8ADTjwAAAACAgLAA0ymAAAAhRdgA4f4AMADTLsAAACE+GADh/gAAGADiAgBPgFJwANMxSXAA0zOAIHAA0zJwBymKWADiAg+AknAA0zeJcADTOwAgMADTOLAHKYbYAOICD4CPRzAA00OFsADTQMUwANM/sAcpikBAWADiAiF8YgKn7MCAAKTFsADTSUUwANNG8AcphsAAWADiAiF8YgKAMAAbrY9HsADTTiCMgIAAhbAA01NFMADTUPAHKYbAAFgA4gIhfGIChTAA01ZwBymKQEBYAOICAA+Aj0cwANNgxbAA014FMADTXPAHKYpAQFgA4gIhfGICp+yAgACk4DAA02NwBymGwDAAG61PRfAA02pgMADTZ/AHKYbhAAUwANNssAcpikBAWADiAiCWErAA03CARTAA03JwBymKQEBYAOICD4BSsADTd4BNcADTekAAAEAYAOICAEfwANN6YgSAQABMcADTfpgA4f4AoDAA037wBymG4HAA04GwBymKQA1wANOFQAAAQBcARfAA04VgsADTenAHKdbhAEWwANOLIDAA04iwBymG4QBglmCWYLAA03pwBynWwa2M4CmwANOP8ADTkbAA074AAGyJQAAAAEDwANOT8ADTvgAAAADAgPAA05XAAAAg5pgA8AAbBgAwANOaQAAAIGIYAPAAGwYAMADTncAAACLYWADwABsGAFqAGABwABsXAIAYAPAAGwYAT4CTsADTovAA06SAACBsGADwABsGAEjFsADTpmBwANOlMAcp/+BVsAAbI2AwANOo8Acp+8kwANOwQOAwANOscAcp+8ngPeBwANOvMAcp/8BYAPAAGwYSsADTsUBIxzAA07TgsADTszAHKgPJwEAASsAwABsNoPAA07dwByoMyTAA072AoLAA07owByoDyeyLAFgA8AAbBgGtjSApsADT4bAA0+NwANQzQABsi0AAAABA8ADT5jAA1DNAAAAAQEBwANPoAAAAIQNYAPAAGxWAABgA8AAbBgBPgFJwANPqiXAA0+zAIDAA0+uwByo72ADwABPaj4BSsADT8gBFsADT9QUwANPz8AcqO8AAWADwABPaoGIwABPbEnAA0/jJcADT+wAgMADT+fAHKjvYAPAAEAuPgFKwANP/gEWwANQChTAA1AFwByo7wABYAPAAEAur47AAEA2ScADUCYlwANQLwCAwANQKsAcqO9gA8AAT48+AUrAA1BHAR7AA1BOwABPaAMAAxTAA1BawByo7wABYAPAAE+PFsADUGUUwANQYMAcqO8AAWADwABPj4nOwABPbSsAPgFKwANQhwEmwANQhwUewANQjrU9BAAEJMADUK0BFsADUKCAwANQm8AcqO+FTsAAbS0nsi0cwANQvpSBWgAAAADAAGyPKwBgA8AAbBgGtjWApsADUNDAA1DcwANTYQABsi4AAAABA8ADUPHAA1NhAAAAAgICwANQ+AAAALB2YAO+TQDAA1EKAAAAsHdgA75NAABgA4ULAT4BScADURkiHMADUSiAwANRHcAcqlcnAQABKwDAAGxeAR7AA1EzwABs9wIAAhbAA1FIgMADUT3AHKpXr7G+bCeVEwA+AUnAA1FkHMADUXKBwANRaMAcqmUnAQABKwDAAGxePgFKwANRgwFqwANRlmADhQuGlj4CQB7AA1G2wABs9wIAAhbAA1HKgcADUcDAHKplr7G+bCeB7wDAA1G2wANR2wBKwANR5AFqwANR92ADhQuGq0nAA1IQHsADUhTAAGz3AgACFsADUimAwANSHsAcqlevsb5sJ5UVAD4BScADUkYcwANSVIHAA1JKwByqZScBAAErAMAAbF4+AUrAA1JlAWrAA1J4YAOFC4a6PgJAHsADUpnAAGz3AgACFsADUq2BwANSo8AcqmWvsb5sJ4HvAMADUpnAA1K+AErAA1LHAWrAA1LaYAOFC4bKPgFKwANS+gEmwANS+gUewANTAbU9BAAEFsADUxaAwANTC8Acqlepa75nJ7IuFsADU0qAwANTP8AcqleJzr5WKwBgA4ULAYCmABysCgAaHDIAHIdKAByIGgAciXsAHJKiAByZmQAco1MAHKRrABylsAAAAAgAHKXzABynxwAcqMcAHKovABysCgAAAAQAAgi31LIvgKcAAAOA8AAAwABsFwABAAGCz4ETAACCLgAAgSYAAJYgAAAAAAADArfVgKeCFoIcwABLRwOyMAAAAWADwABsVgABXQOXdwFg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h+QABrhJgKfAAEkJwABJCcAASXEAAIUVAAAAAQPAAEkewABJcQAAAAEBAcAASTAAAACEDWADhNwAAGADglIBPgFKwABJPAEfwABJR4TkAQABHMAASVgunFcBAWADiOcBFsAASWOAwABJXsAc6I+FFITeALfqAAa4SoCnwABJdsAASXbAAEm7AACG2QAAAAEDwABJhMAASbsAAAABAQHAAEmPAAAAhA1gA4sqAABgA4JSAT4BSsAASZsBHMAASaIuhwUBAAGAwABJssAc6QIAuD8GuEuAp8AAScDAAEnAwABKZgAAhRIAAAABA8AASdvAAEpmAAAAAQEBwABJ8wAAAIQNYAOEzQAAYAOCUgE+AUrAAEn/AR/AAEoKhNsCAAIWwABKO4DAAEo2wBzpXYTkhM8cwABKTC6cVwEBYAOF5AEWwABKV4DAAEpSwBzpXYGthNAAt+oABrhMgKfAAEprwABKa8AASv8AAIUQAAAAAQPAAEqAwABK/wAAAAEBAcAASpIAAACEDWADhL4AAGADglIBPgFKwABKngEfwABKqYTMAgACFsAAStSAwABKz8Ac6eKE5ITAHMAASuUunFcBAWADheQBFsAASvCAwABK68Ac6eKBrYTBALfqAAa4TYCnwABLBMAASwTAAEtFAACEcgAAAAEDwABLEMAAS0UAAAABAQHAAEsZAAAAhA1gA4MBAABgA4JSAT4BSsAASyUBHMAASywuhwUBAAGAwABLPMAc6mcAuD8AAByugwAcrxIAHK9LAByvhAAcr70AHK/2ABywLwAcsGgAHLChAByxDgAcsmkAHLPzABy0QQActH4AHLTlABy1MgActa0AHLYsABy2pQActzwAHLenABy4MAAcuIsAHLkEABy5UQAcubwAHLpTABy63AAcu1UAHLvQABy8SwAcvKgAHL0FABy9jgAcvkEAHL66ABy/TwAcv+QAHMCVABzCNQAcwpwAHMNLABzD+gAcxEcAHMSgABzE3wAcxR4AHMV/ABzGJAAcxskAHMeKABzIBQAcyGIAHMi/ABzJMgAcyX8AHMnMABzKGQAcymYAHMqlABzLNQAcy7AAHMwNABzMhgAczP8AHM0+ABzN3wAczrYAHM8XABzPkgAc0A0AHNEcABzSEgAc068AHNRzABzU1AAc1XEAHNXSABzWeQAc12IAHNfdABzYcgAc2moA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YAODrAAEuYGArsAArxfAAK81CYkdAGADg6wABLmCgK7AAK9GwACvWwmJHgBgA4OsAAS5g4CuwACvbMAAr3sJiSIAYAODrAAEuYSArsAAr43AAK+YCYkkAGADgpIABLmFgK7AAK+swACvtQmAkABgA408AAS5hoCuwACvxcAAr9AJiScAYAODMgAEuYeArsAAr+DAAK/tCYkoAGADgzIABLmIgK7AAK/9wACwCgmJNABgA4MyAAS5iYCuwACwGsAAsCUJiVQAYAODMgAEuYqArsAAsDbAALBKCYlYAGADg6wABLmLgK7AALBawACwbQmJWgBgA4MyAAS5jICuwACwg8AAsJwJsvsAYAOEAgAEuY2ArsAAsK3AALDCCYldAGADg6wABLmOgK7AALDTwACw6QmJXABgA4OsAAS5j4CuwACw/8AAsRYJstYAYAOEAgAEuZCArsAAsSbAALE3CYliAGADgzIABLmRgK7AALFIwACxWwmJZABgA4OsAAS5koCuwACxbMAAsYkJiWYAYAODrAAEuZOArsAAsZnAALGiCYkaAGADgzIABLmUgK7AALG2wACxwAmLuwBgA4RLAAS5lYCuwACxysAAsdUYnFwAYAPAAGxbAAEFuZqArsAAsdrAALHawAC2tQCBJrjxAAPAALHnwAC2tQAAACUlJcAAsfQAAASy52ADhEsAwACyEgAABIkBYAOCkgDAALIrAAAEsuFgA4RLAMAAsk0AAASJA2ADg6wAwACydgAABIkGYAODrADAALKkAAAEiQhgA4OsAMAAstMAAASJCmADgzIAwACy/gAABIkMYAODrADAALMpAAAEswZgA4QCAMAAs1oAAASJDmADg6wAwACzhgAABIkQYAODrADAALOoAAAEiRJgA4OsAMAAs8wAAASy5GADhEsAwACz6QAABLMTYAOESwDAALQBAAAEiRtgA4MyAMAAtCYAAASJIGADg6wAwAC0SQAABIkdYAODrADAALR0AAAEiR5gA4OsAMAAtJYAAASJImADg6wAwAC0sgAABIkkYAOCkgDAALTKAAAEgJBgA408AMAAtOAAAASJJ2ADgzIAwAC0+AAABIkoYAODMgDAALUSAAAEiTRgA4MyAMAAtSwAAASJVGADgzIAwAC1RAAABIlYYAODrADAALVlAAAEiVpgA4MyAMAAtYUAAASy+2ADhAIA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pejAHpStFqXuLrO+ungASqYJAR+mEIY6AgACFqYhLrO5unMfpj2F8AIAATGmR2ADhRoBhKZIwB6VHAGDyzGmXmADiVUCgqZfwB6UfYGmbsAelE0ABrrLgLepBKkPrJEAALQxurIAAAABA6kjrJEAAAABAQGpNQAAAIQNYAOGKQAAYAOFGgE+BU6pR6laAAG0NmADiaoBH6lcibwDAAMWqXMus7K6bGqplGADiUeE5RapqxapoYCpnMAelcCBrYYsg8uF5gBOqbupwAAAgYhgA4kfAR6pwokoAgACJKnoAie0NzWp1wAAAQBgA8AAbB8BFqnXLrQnur01qdcAAAEAYAPAAGwfARep1y60Jxyp5IKp18Aeli+BPwEAAZQAwABsiLq9gqnXwB6WLxap6i6tjbq7AE6qC6oRAAGDwWADg8wBNaoTAAABAGADg8wBH6oThAEHAAGCqhnAHpYSBoGXH6otibwDAAMWqkgus7O6bWqqYmADiUeE5TGqamADiVUBgaprwB6V1QCEyx+qloY6AgACFqq0LrPAunofqt6F8AIAATGq6GADhRoBH6r4hjoCAAIWqwkus8G6exarL4CrKsAelcCBrYYsAAGDyzGrUGADiVUBgatgwB6V1QCDvSmE1imDbRar0xarxC6tjbq7g22ClYQMNavvAAABAGADg8wBNavvAAABAGADnD8BFqvvLrP7urwjHKvvg6vvwB6XTicBAAErAMAAbF4rHKwEg6vvwB6XTpZrAQABFqwVgqwQwB6WEoGIiSIAnFABYAODzCMcq++Dq+/AHpdCJwEAASsAwABsXisWrByDq+/AHpdChAyCagFgA4J+NawvAAABAFwBF6wvg6oTwB6WjoQBFqxBgKw8wB6VwIQBglmCWYOqE8Aelo49HKxgFqxRLq2NuruEQwEAAYOsasAeloAAgrZKrHYBH6x9hdEBAAGDrIfAHpaAAAa604C3rJasorc5AACFdAFqrJdgA8AAbFaAtQAAAQOst7c5AAAAAQEBrMkAAACEDWADhgQAAGADglIBPgQ9HazbhXQBAAGArPHAHphJAJeHTq0KrREAAYC+YAODrAEWrRiArRPAHphJgxuGC0s+AUmuZhyucYGuasAemHEnAQABFq50LrO6unQAwABsXj4FTq6jrq4AAbPoYAOJVQEfrrCJvAMAAxauyy6zsrpsaq7s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ucAAlmLAAJaOCbSouwEAXQPAAGxfAmADgzJgA8AAbFsBMsAAloxgA4MyYAPAAGxbAAEFvAGAucAAQorAAEKKwABEygAAAAPAAEKawABEygAAAAcHB8AAQqcAAASAvmADjpUAwABCugAABLSNYAOaugDAAELTAAAEtI5gA4GvAMAAQuoAAAS0j2ADutoAwABDCwAABLRmYAOoqwDAAEMlAAAEtJBgA7ryAMAAQ0MAAASdbGADqKQAAGADu2UBPgQ9HsAAQ2GpdgEAASEcwABDgBbAAENpLp1suwG7bicBAAErAMAAbF4APRfAAEOOLrScH8AAQ7C8LQEAAS4Au4s9HMAAQ+4WwABD1y60krsBu3CBNAEAAR7AAEP1uwUDAAIWwABECy60jrsBu2oWwABELhbAAEQkFsAARBcutI27AbtpgJCavIN0je0BgugqAMAAbRs9HMAARGQWwABEVy60k7sBu3GBNAEAAR7AAERruwUDAAIWwABEgS60jrsBu2oWwABEpBbAAESaFsAARI0utI27AbtpgJCavIN0je0BgugpAMAAbRsICAG7Z4AAwB7qAQgBu2mBAMAe6g8IAbtqggDAHuodCAG7a4MAwB7qKwgBu2yEAMAe6jkIAbtthQDAHupHCAG7boYAwB7qVQkBwABCipisAAAAAHAGu42AucAARM/AAETXwABfWwAAnW8AAAABA8AAROTAAF9bAAAAAgEBwABE7AAAAIREYAODrAABwABE+wAAAJ1xWwFqwABFHmADu1nAAOcUYAOodgE+Fz0ewABFM6l4AQABJMAARVUDJ7SpgMAARUfAHuvOJ7SqAD0ewABFXKl2AQABIRbAAEVsgMAARWXAHuvOgzSDtgA9F8AARX4ujri7AR/AAEWXmyMCAAKAwABFqcAe684WwABFsS60jbsBu2kAu3w9F8AARcQutJS7AR/AAEXZu1gBAAGAwABF8cAe684Au3M9F8AARf4utJW7AR7AAEYUwABs/AEBYAOowwEWwABGMhbAAEYjLrSUuwG7c7R9u0AAu3Q9F8AARkUutJa7AR7AAEZawABs/AEBYAOoCAEWwABGdBbAAEZlLrSUuwG7c7R9u0AAu3U9F8AARocutJe7AR7AAEafwABtJAIBYAPAAGwfAhbAAEa/FsAARrAutJS7AbtztH27QJMAu3Y9F8AARtUutJi7ASu7dz0XwABHBy60mbsBK7t4PRfAAEcnLrSauwEru3k9F8AAR0AutJu7ASu7ek7AAEddwABHaQABi5VgA8AAbFsBHsAAR2upegEAAYDAAEd6wB7rzgBJwABHiCXAAEeTAIDAAEeMwB7rzmADg8w+A0nAAEelgsAAR6nAHu1fPgNOwABHysAAR9IAAbSrYAPAAGwfASMcwABH8YHAAEfgwB7r3ScBAAFqwABIBWADu1nAAOcUAMAAbF6UlQFgA8AAbB89F8AASCMutGW7AR/AAEgyqIgCAAACneCDwABIV8Ae7bGd4YPAAEh6wB7tsbtyPRfAAEi3LrSbuwEcwABIwy60rLsBBAADJ5VzHMAASQAWwABI9hbAAEjpLrSNuwG7aYCQmryJvAEAARbAAEkVFMAASQ7AHuvOAAFgA4PMgzODtACOXSsBtK0pu5K7ej4BPRfAAEliLrRluwEfwABJcaiIAAAAALtyPRfAAEmLLrSduwEfwABJnbwVBAAEFsAAScIutGW7AbtyFsAAScwutJu7Abt6KxbAAEndLp1suwG7bgC7e0nAAEn9HMAAShKBwABKAcAe690nAQABasAASiZgA7tZwADnFADAAGxePgI9HsAASj6pdgEAASEcwABKWRbAAEpNFMAASkbAHuvOAAFgA4PMhMuD0CcBAAErAMAAbF4APRfAAEp0FsAASmsutGW7AbtygbAcwABKfS6bAbsBAQABFsAASosUwABKhMAe684AAWADg8yEy4PQALuQqH0+Ak7AAErAwABKywABtK5gA6fsARzAAErZLrSsuwEDAAMngT4WwABK+xTAAEr0wB7rzgABYAODzIGXg84rALuSPRfAAEsZFsAASxAutGW7AbtygbAcwABLIi60r7sBAwADg8AASy3AHu91FsAAS0AUwABLOcAe684AAWADg8yBl4POFMAAS0bAHuvOAAFgA4PMALueqH0+FE7AAEt3wABLgAAAhMdgA4TuARbAAEuJgMAAS4LAHuvOhMeDvk7AAEugwABLsgABtLBgA8AAbB8BHsAAS7SpewEAAYDAAEvCwB7rzgBOwABL18AAS+cAAY5AYAPAAGwfARzAAEv/I4LAAEvqwB7tX5STAWADwABsH4E/AQABhMAATAHAHvAvAMAAbIg9F8AATBsutGW7AR/AAEwqqIgDAAADneAcwABMkhzA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QMAAiaABALTWuwEAAAABA8AAiUrAAImgAAAAAAAAAGADqToBSsAAiU0BNcAAiU0AAAEAYAOpOgEWwACJTS60oLsBu38jHMAAiV2AwACJTcAfLKMnAQABKwCpTBfAAIlNLrSguwEfwACJa6lSAwADFsAAiYIWwACJeC601bsBu/aBLKk8Kx/AAImNinUBAAEpAAC7f4DAAIlNwB8sowFgA6k6Brv4gLnAAInGwACJ18AAijoBALTXuwEAAAABA8AAieLAAIo6AAAAAAAAAGADqToBSsAAieUBNcAAieUAAAEAYAOpOgEWwACJ5S60obsBu4AjHMAAifaAwACJ5cAfLVEnAQABKwCpTBfAAInlLrShuwEfwACKBKlSAwADFsAAihsWwACKES601bsBu/aBLKk8Kx/AAIominUBAAEqAAC7gIDAAInlwB8tUQFgA6k6Brv5gLnAAIpZwACKYsAAitgBALTYuwEAAAABA8AAim7AAIrYAAAAAAAAAGADqMgBSsAAinEBNcAAinEAAAEAYAOoyAEWwACKcS60orsBu4EjHMAAioOAwACKccAfLf8nAQABKwDAAGxeF8AAinEutKK7AR/AAIqLqTkBAAEcwACKqRbAAIqbLrRmuwG7bJz0AQABFsAAissWwACKwRbAAIq0LrSNuwG7aYCQmryJJY3VAKivALuBgMAAinHAHy3/AWADqMgGu/qAucAAivTAAIr9wACLaQEAtNm7AQAAAAEDwACLBsAAi2kAAAAAAAAAYAOoyAFKwACLCQE1wACLCQAAAQBgA6jIARbAAIsJLp35uwG7giMcwACLGIDAAIsJwB8uxCcBAAErAMAAbF4XwACLCS6d+bsBH8AAiyapOQEAARzAAIs9FsAAiy8utGa7AbtsnPQBAAEWwACLXxbAAItVFsAAi0gutI27AbtpgJCavIktjdoAqK8Au4KAwACLCcAfLsQBYAOoyAa7+4C5wACLiMAAi5HAAIwHAQC02rsBAAAAAQPAAIudwACMBwAAAAAAAABgA6jIAUrAAIugATXAAIugAAABAGADqMgBFsAAi6AutKO7AbuDIxzAAIuygMAAi6DAHy+JJwEAASsAwABsXhfAAIugLrSjuwEfwACLuqk5AQABHMAAi9gWwACLyi60ZrsBu2yc9AEAARbAAIv6FsAAi/AWwACL4y60jbsBu2mA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YUnAAK49HMAArlocwACuTxbAAK5BLrSWuwG7dSkBAAGEwACuUMAfS88AwABsuCcBAAErAMAAbF4+AT0cwACufBbAAK5tLrSVuwG7dICcAgAChMAArn3AH0vPg8AAronAH0s5AMAAbMs/P0rAAK6jAYPAAK6qwB9LOQa7soC5wACuucAArs7AAK8eAACFxAFqwACuumADwABsVoC1AAABA8AArt7AAK8eAAAAAQEBwACu6wAAAIQNYAOHLAAAYAOowwE+AUrAAK73ARzAAK7+LrTeuwEBAAEWwACvFIDAAK8PwB9MyoE+hy4Au6UGu7OAucAAryPAAK84wACviwAAhb8BasAAryRgA8AAbFaAtQAAAQPAAK9HwACviwAAAAEBAcAAr1MAAACEDWADhxoAAGADqMMBPgFKwACvXwEcwACvZi6037sBAgACFsAAr3uAwACvdsAfTT2BPoccKwC7pga7tIC5wACvkMAAr6XAALABAACFwgFqwACvkWADwABsVoC1AAABA8AAr7fAALABAAAAAQEBwACvxgAAAIQNYAOHIwAAYAOowwE+AUrAAK/SARzAAK/ZLrTguwECAAIWwACv8YDAAK/swB9NsYE+hyUrALunBru1gLnAALAGwACwG8AAsqEAAIWOAWrAALAHYAPAAGxWgLUAAAEDwACwNcAAsqEAAAABAQHAALBMAAAAhA1gA4Z0AABgA6jDAT4NTsAAsF7AALBoAAG06V0DwABsGQFgA6jDARzAALBqLrTAuwEBAAEWwACwfy60lbsBu3QAu5VOwACwm8AAsKYAAbTqXQPAAGwZAWADqMMBHMAAsKgutMC7AQEAARbAALC9LrSVuwG7dAC7lT0cwACw0y606LsBAwADFsAAsOiAwACw48AfTiWFioZ2gcAAsPPAH048gsAAsP7AH05xALusTsAAsRvAALEdAAGD+mADqAgBH8AAsSOoFQIAAiscwACxLi601LsBAQABgMAAsT7AH04lALujAD0cwACxUxbAALFKLrRluwG7cjYBAAGDwACxV8AfTtsAqIM9F8AAsWAutJW7AYHAALFywB9OPLt0PRzAALGKFsAAsYODwACxgcAfTtuBpqgNNgEAARzAALGOLpsBuwEBAAEWwACxmoDAALGVwB9OJYWLhncAu5AAwABsR07AALGswACxtwABtPNdA8AAbBkBYAOowwEWwACxuS60lbsBu3Q9F8AAsc8utJW7AYLAALHhwB9Ocbt0PRzAALH6FsAAsfODwACx8cAfTtuBpqgNNgEAARzAALH+LpsBuwEBAAEWwACyCoDAALIFwB9OJYWMhngAu5AAwABsRz0cwACyHC60wrsBAgAChMAAsjHAH0+NFsAAsj0utJW7Abt0ALuYPRfAALJTLrSVuwGEwACyZcAfT427dErAALJ1ARzAALJ8LrTRuwECAAKDwACyiMAfTtscwACyiy600LsBAQABgMAAspfAH04lALukALuhBru2gLnAALKmwACyu8AAtE4AAIV7AWrAALKnYAPAAGxWgLUAAAEDwACy1cAAtE4AAAABAQHAALLsAAAAhA1gA4Y8AABgA6jDAT4FTsAAswXAALMLAACJvWADqToBHMAAsyoWwACzFS60j7sBu2udTAEAARbAALNRFsAAs0GAwACzPMAfULOFfIZEgtOJsAC63k7AALNqwACzcwAAhUlgA6jDARzAALOJFsAAs30utJ27Abt7nfcCAAKBwACzocAfUMoWwACztxbAALOtgMAAs6jAH1Czga2GP4PLheYAvApOwACzycAAs84AARJdA6e3AWADqMMBHMAAs9AutLm7AQIAAoLAALPgwB9REBbAALPvgMAAs+rAH1Czga2GPwC7kT0cwACz/y60z7sBAwADgMAAtAnAH1CzH8AAtBOnmAEAARbAALQngMAAtCLAH1CzgL6GQwCDwAC0MMAfUV8Au6BKwAC0OwGCwAC0QsAfURAGu7eAucAAtFPAALRowAC2+AAAhVgBasAAtFRgA8AAbFaAtQAAAQPAALSDwAC2+AAAAAEBAcAAtJsAAACEDWADhY0AAGADqMMBPgdOwAC0rcAAtLYAAYVJYAOowwEcwAC0uC6bAbsBAQABFsAAtMSAwAC0v8AfUiOFSYWPALuQTsAAtNnAALTeAAESXQOntwFgA6jDARzAALTgLrS5uwECAAKBwAC08MAfUjoWwAC0/4DAALT6wB9SI4GthZEAu5FOwAC1FcAAtRwAAYC+YAOESwEWwAC1I4DAALUewB9SI4C+hZM9HsAAtS+pdgEAASElwAC1PgCDwAC1N8AfUq9gA4PMAD0ewAC1Tql2AQABIiEWwAC1XoPAALVXwB9Sr4T9hGwAIRbAALVyg8AAtWvAH1Kvg3+E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AAGEwADUdsAfaqUBnLhqwADUkWADp3DAAFOqH8AA1LKnogIAAYTAANTEwB9qpQGcuGrAANTfYAOncMAAU6oBYAOnmYPAANT3wB9qZAC7oD0cwADVCC607rsBBAADFsAA1SaAwADVIcAfaeWFSYVZgcAA1TDAH2n8FsAA1T+AwADVOsAfaeWBiIVaAYN/KbutSsAA1WIBgsAA1WnAH2owBrvGgLnAANV3wADVjMAA2d4AAIV3AWrAANV4YAPAAGxWgLUAAAEDwADVpsAA2d4AAAABAQHAANW9AAAAhA1gA4YXAABgA6jDAT4FPR7AANXJqXYBAAFqwADV0WADwABsWx4APR7AANXvqXYCAAEhHMAA1gEWwADV9y60m7sBu3onAQABKwDAAGxeAY6HgMAA1hPAH2yUTsAA1iTAANYpAAESXQOntwFgA6jDARzAANYrLrS5uwECAAIWwADWOy60m7sBu3oWwADWS4DAANZGwB9slIGthhoAu5FOwADWm8AA1qIAAYC+YAODrAEcwADWrxbAANakLrSOuwG7aoLlAgACFsAA1sEutN27Abv/FsAA1tOAwADWzsAfbJSBiIYZAIHZScAA1t4cwADW6YLAANbiwB9tOicBAAErAMAAbF4+AUrAANb6AWrAANcHYAOo6o1mPgFJwADXJyIlwADXMwCCwADXLMAfbTpgA4PMASIlwADXSQCCwADXQsAfbTpgA4RLABbAANdhFMAA11rAH206AgFgA4RLhP2EbD4DTsAA2BbAANghAAGcxGADqB8BHMAA2CMutM+7AQMAA4DAANg6wB9slB/AANhQp5gCAAGCwADYX8AfbToBnLhqwADYemADp3DAAFOZH8AA2JinyAEBYAOowwExwADYp2ADqMMBFsAA2KgutJu7Abt6AAC7oD0cwADYvi60z7sBAwADKxrAANjep64fwADY9afJAgFgA6jDAoHAANkHwB9s9oPAANkNwB9t/gAAu6BKwADZIwEcwADZKi600LsBAQABgMAA2TbAH2yUALukPgI9HMAA2WkWwADZVC60j7sBu2udfAEAAYLAANmDwB9tOgC64ErAANmUARzAANmbLrTPuwEDAAOAwADZpcAfbJQfwADZr6eYAQABgsAA2b7AH206AIHAANnHwB9s9gC7oAa7x4C5wADZ48AA2fjAANvqAACFYAFqwADZ5GADwABsVoC1AAABA8AA2g3AANvqAAAAAQEBwADaHwAAAIQNYAOFoAAAYAOowwE+BT0ewADaK6l2AQABasAA2jNgA8AAbFseAD0ewADaUal2AgABIRzAANpjFsAA2lkutJu7Abt6JwEAASsAwABsXgGOh4DAANp1wB9vX07AANqGwADaiwABEl0Dp7cBYAOowwEfwADakafIAQFgA6jDATHAANqgYAOowwEWwADaoS60m7sBu3oATsAA2vLAANr5AAGAvmADg6wBHMAA2wYWwADa+y60jrsBu2qC5QIAAhbAANsYLrTduwG7/xbAANsqgMAA2yXAH29fgYiFogCB2UnAANs1HMAA20CCwADbOcAfb/wnAQABKwDAAGxePgFKwADbUQFqwADbXmADqOqNZj4BSsAA234BHMAA24UutM+7AQMAA4DAANuPwB9vXx/AANujp5gCAAGCwADbssAfb/wBnLhqwADbzWADp3DAAFOZgcAA29vAH2/BALugBrvIgLnAANvvwADcBMAA3qUAAIViAWrAANvwYAPAAGxWgLUAAAEDwADcGcAA3qUAAAABAQHAANwrAAAAhA1gA4WxAABgA6jDAT4HPR7AANw3qXYBAAFqwADcP2ADwABsWx4APR7AANxdqXYCAAEhHMAA3G8WwADcZS60m7sBu3onAQABKwDAAGxeAY6HgMAA3IHAH3D2TsAA3JLAANyYAAGBPmADqMMBHMAA3JoumwG7AQEAARbAANymgMAA3KHAH3D2gT6FtAC7kE7AANy4wADcvQABEl0Dp7cBYAOowwEfwADcw6fIAQFgA6jDATHAANzSYAOowwIWwADc0y60m7sBu3qBwADc3sAfcVgATsAA3SvAAN0yAAGAvmADg6wBHMAA3UcWwADdPC60jrsBu2qC5QMAAhbAAN1ZLrTduwG7/xbAAN1rgMAA3WbAH3D2gYiFswGC5imB2UnAAN2EIRzAAN2Pg8AA3YjAH3HQJwEAASsAwABsXj4DPR7AAN2gqXYBAAEiJcAA3bAAg8AA3anAH3HQYAODzAEiJcAA3cYAg8AA3b/AH3HQYAOESwAWwADd3hTAAN3XwB9x0AMBYAOES4N/hG0APRzAAN4FFsAA3fAutI+7AbtrnXwBAAGDwADeH8AfcdAAuuA9HMAA3i4utM+7AQMAA4DAAN44wB9w9h/AAN5M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AGADqMMBPgI9HsAA5WipdgIAASEcwADlehbAAOVwLrSbuwG7eicBAAErAMAAbF4BjoeAwADljMAfecJKwADllwEWwADlni60m7sBu3oGu9OAucAA5bDAAOXFwADmTQAAhdEBasAA5bFgA8AAbFaAtQAAAQPAAOXPwADmTQAAAAEBAcAA5dYAAACEDWADh2YAAGADqMMBPgM9HMAA5eIumwG7AQEAARbAAOXugMAA5enAH3pShX6HaAC7kD0XwADl/y60lbsBHMAA5hEutMG7AQAAAAC7lrt0SsAA5jEBasAA5j5gA6jqjWYGu9SAucAA5lLAAOZnwADmpAAAhcsBasAA5lNgA8AAbFaAtQAAAQPAAOZ3wADmpAAAAAEBAcAA5oQAAACEDWADh0kAAGADqMMBPgFKwADmkAEWwADmly603LsBu/0Gu9WAucAA5qnAAOa+wADoZgAAhUUBasAA5qpgA8AAbFaAtQAAAQPAAObOwADoZgAAAAEBAcAA5tsAAACEDWADhS0AAGADqMMBPgROwADm7cAA5u8AAYP6YAOowwEcwADnABbAAObxLrSVuwG7dCkBAAEcwADnGBbAAOcQFsAA5wEutJS7AbtztHa7OCkBAAEWwADnHoDAAOcZwB97S4UUhS8AwABsYQDAAGy4ScAA5y4cwADnNIHAAOcywB97YicBAAErAMAAbF4+AT0wwADnRSTAAOeJBCe09xbAAOdrgMAA52bAH3tLhRSFLyeNqxbAAOd/gMAA53rAH3tLhAiCZT9JwADnliIhHMAA560WwADnoIDAAOebwB97S4VEhTAnAQABKwCJWQAhHMAA59QWwADnx4DAAOfCwB97S4VEhTAnAQABasAA591gA4lyhbEAiVk+AUrAAOf1ARzAAOf8LrTRuwECAAKBwADoE8Afe2IcwADoJBbAAOgWLrRmuwG7bJy7AgACFsAA6DiAwADoM8Afe0uFRIUwKgCosAC7oT9KwADoWgGBwADoYcAfe2IGu9aAucAA6GvAAOiAwADpEgAAhUcBasAA6GxgA8AAbFaAtQAAAQPAAOiQwADpEgAAAAEBAcAA6J0AAACEDWADhTkAAGADqMMBPgNOwADouMAA6L4AAYE+YAOowwEcwADowC6bAbsBAQABFsAA6MyAwADox8AffPuBPoU8ALuQPRzAAOjYLrS/uwECAAIW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FYC5wAESCsABEgrAARKAAAAAA8ABEiPAARKAAAAABAQEwAESKQAABJAqYAOodgDAARI3AAAEhUlgA6jDAMABEkwAAAS1AF0DwABsXwJgA4omYAOowwDAARJoAAAEjp5gA6ikAABgA7wCAT4ABQgBvASAAMAfoJ0IAbwHgQDAH6CrCAG8BYIAwB+guQgBvAiDAMAfoNIJAcABEgqX7AAAAAAFvBaAucABEubAARLmwAETggC1AgADwAETDsABE4IAAAABAQHAARMUAAAEjp5gA6ikAABgA7wCAT4ABQgBvAiAAMAfoUEIALwEKwgAvAUrCAC8BysJAcABEuaX7AAAAAAKBrwKgLnAAROHwAETkMABGEIAAJ33AAAAAQPAAROnwAEYQgAAAAICAsABE7UAAACBl2ADqToAwAETygAAAIv3XQPAAGwZAWADiVUAAGADqMMBPgpJwAET2hbAARPngcABE97AH6G0gVbAAGzzSsABE/ABgMABE/fAH6GmP07AARRuwAEUdAABib1gA4MyARbAARR/FsABFHuAwAEUdsAfoaaBLKk8gtOonE7AARSUwAEUoQABg81gA5Y4AR7AARSwlkICAAIWwAEUwILAARS6wB+h+4Njg0KBwAEU0MAfobQATsABFOXAART3AAGL+10DwABsGQFgA4lVARzAARUXFsABFQEujp68CJ05AQABgsABFTHAH6H7AKimTsABFUPAARVWAAG1A10DwABsGQFgA6jDAR7AARVcwABs/AEBYAOowwEWwAEVfYTAARVrwB+iYIDgwABsagBOwAEVkMABFaMAALUEYAPAAGxbASlOwAEVtMABFb8AALUFYAPAAGxbASlFwAEVywHAARXUwAEV1gAAgdRgA8AAbB8BkwEcwAEV3RTAARXbwB+jBggAgToBAAEWwAEV8YTAARXfwB+iYIDgwABsagDAAGyFARXAARX7wB+jBggcwAEV+RTAARX7wB+jBggAgT8BAAGUAMAAbIg+BE7AARYMwAEWFQABtQZgA6jDARzAARYhLp1EAQABHMABFjiDwAEWK8AfoiiDZwEAARzAARZYhMABFkfAH6JgKQEAARTAARZZwB+jBggAAMAAbLgAlkcAvAtJwAEWZSEcwAEWchTAARZpwB+jcgkAJwEAAWrAARZ7YAOpB41wAMAAbF49j8ABFobAH6LsKj9JwAEWoCXAARatABTAARakwB+jcgkAYAOn0T2OwAEWu8AfotcqPz0cwAEW74XAARbdwB+imYCcAgACFMABFvDAH6MGCAAUwAEW9cAfo3IJAADAAGzLScABFwqHwAEXDsAfouxKwAEXGgGAwAEXIcAfoaY/ScABFyyGwAEXMMAfotc+AUrAARdMAR/AARdXqVICAAIWwAEXdIDAARdvwB+hpoEsqTwewAEXfcAAbSUBAWADqMgBhcABF43AH6KZAAA+A07AARe8wAEXyAABtQdgA6hSAR/AARfOqFsCAAIWwAEX5oDAARfhwB+hpoEsqTyFwAEX68AfopkAPRzAARgOFsABGAYukCq8BDYBAAEUwAEYEsAfpMIIAACog0rAARgmARTAARgtwB+kwggABrwLgLnAARjkwAEY7cABG64AAJ1EAAAAAQPAARj2wAEbrgAAAAEBAcABGQAAAACBl2ADiVUAAGADqMMBPgdOwAEZEsABGRkAAZ07YAOowwEcwAEZJRbAARkbLrUBvAYpAQABgMABGSbAH6VUAMAAbGFJwAEZMSEcwAEZPIHAARk1wB+laycBAAErAMAAbF5KwAEZRQGBwAEZTMAfpWs/PRzAARrqFsABGuAutQG8BoCcAgACgMABGuvAH6VUasABGvlgA6kHjXAAwABsY07AARsOwAEbFQABgbBgA6jDARzAARscgMABGxfAH6VUg/gBAWADqMMBLgCJVz0ewAEbLql2AQABIiIlwAEbPQCCwAEbNsAfpfpgA6kHASXAARtSAILAARtLwB+l+mADqVMBJcABG2sAgsABG2TAH6X6YAOn0QA9HMABG4gWwAEbfi61AbwGgJwCAAKAwAEbicAfpVSCwAEbkcAfpfoAwABsY0rAARudAYLAARukwB+l+ga8DIC5wAEbs8ABG8jAARv5AACICgFqwAEbtGADwABsVoC1AAABA8ABG9fAARv5AAAAAQEBwAEb4QAAAIQNYAOJVQAAYAOowwFKwAEb6gFqwAEb8GADqQeNcAa8DYC5wAEb/sABHBPAARxUAACGTwFqwAEb/2ADwABsVoC1AAABA8ABHCPAARxUAAAAAQEBwAEcMAAAAIGXYAOJcgAAYAOowwFKwAEcOQEfwAEcPalpAgACgMABHEnAH6c5KwAGvA6AucABHFjAARxtwAEcqAAAhlEBasABHFlgA8AAbFaAtQAAAQPAARx6wAEcqAAAAAEBAcABHIQAAACBl2ADiYAAAGADqMMBSsABHI0BH8ABHJGpaQIAAoDAARydwB+nnSsABrwPgLnAARyswAEcwcABHQAAAIZVAWrAARytYAPAAGxWgLUAAAEDwAEc0MABHQAAAAABAQHAARzcAAAAgZdgA4mcAABgA6jDAUrAARzlAR/AARzpqWkCAAKAwAEc9cAfqAErAAa8EIC5wAEdBMABHRnAAR1WAACGUwFqwAEdBWADwABsVoC1AAABA8ABHSfAAR1WAAAAAQEBwAEdMgAAAIGXYAOJjgAAYAOowwFKwAEdOwEfwAEdP6lpAgACgMABHUvAH6hlKwAGvBGAucABHVvAAR1nwAEdpAAAhmgBasABHVxgA8AAbFaAtQAAAQPAAR13wAEdpAAAAAEBAcABHYQAAACEDWADidoAAGADqMMBSsABHY0BHMABHY0unUQBAAEWwAEdnIDAAR2XwB+oyYZFieIAvAsGvBKAucABHanAAR21wAEiFgAAhlgBasABHapgA8AAbFaAtQAAAQPAAR3HwAEiFgAAAAEBAcABHdYAAACBl2ADiaoAAGADqMMBPgdJwAEd4hbAAR35FsABHeuAwAEd5sAfqTiDc4mugVbAAGzzSsABHgIBH8ABHg2paQIAAoDAAR4ZwB+pOCsAP07AAR4xwAEePgABg81gA5Y4AR7AAR5NlkICAAIWwAEebxbAAR5lgMABHmDAH6k4gtOJsINjg0IWwAEehIDAAR5/wB+pOINzia4ATsABHp7AAR6wAAGL+10DwABsGQFgA4lVARzAAR7QFsABHroujp68CJ05AQABFsABHu+AwAEe6sAfqTiC04mwAKimTsABHwXAAR8YAAG1A10DwABsGQFgA6jDAR7AAR8ewABs/AEBYAOowwEWwAEfP4LAAR8twB+p14DgwABsagBOwAEfUsABH2QAALUIYAPAAGxbASlFwAEfcAHAAR95wAEfewAAgdRgA8AAbB8BkwEcwAEfgoXAAR+AwB+qcYE6AQABFsABH5aCwAEfhMAfqdeA4MAAbGoAwABshQGNwAEfoMAfqnEcwAEfnoXAAR+gwB+qcYE/AQABlADAAGyIPgROwAEfscABH7oAAbUGYAOowwEcwAEfxi6dRAEAARzAAR/dgcABH9DAH6mNg2cBAAEcwAEf/YLAAR/swB+p1ykBAAGFwAEf/sAfqnEAwABsuACWRwC8C0nAASAKHMABIBeGwAEgDsAfqtgnAQABasABICBgA6kHjXAAwABsXkrAASArAWrAASA4YAOpB41wP0nAASBJISXAASBWAIbAASBNwB+q2GADqVM9jMABIGfAH6pXKj89HMABIJqDwAEgiMAfqhmAnAIAAoXAASCbwB+qcYbAASCgwB+q2ADAAGzLScABILWEwAEgucAfqlc+AUrAASDUAR/AASDfqWkCAAIfwAEg+om8AgACFsABIQ2AwAEhCMAfqTiC04mwasABISRgA4lHhOUAHsABITvAAG0lAQFgA6lTAYPAASFSwB+qGQAAPgNOwAEhgcABIY0AAbUHYAOoXAEfwAEhnahlAgACFsABIbSAwAEhr8AfqTiC04mwg8ABIb/AH6oZAD0cwAEh4hbAASHaLpAqvAQ2AQABhcABIebAH6wcAKiDSsABIfoBhcABIgHAH6wcBrwTgLnAASIbwAEiJ8ABJDEAAIZyAWrAASIcYAPAAGxWgLUAAAEDwAEiPcABJDEAAAABAQHAASJQAAAAgZdgA4n+AABgA6jDAT4HScABIlwhHMABInYWwAEiYC61ALwFJwEAASsAwABsXj4CTsABIo3AASKUAAGBsGADqMMBHMABIqsWwAEili61ALwFKQEAARbAASKxgMABIqzAH6y3hTiKAQDAAGxhScABIsMhHMABIs6BwAEix8AfrO8nAQABKwDAAGxeSsABItcBgcABIt7AH6zvPz9JwAEi8CElwAEjCgAWwAEjAxbAASL5gMABIvTAH6y3hTiKAYQAglhgA4MySsABIxUBasABIyJgA6kHjXA/TsABIzfAASNGAAG1CWADgzIBJsABI14AFsABI1cWwAEjTYDAASNIwB+st4U4igGEAIJYYAODMj0ewAEjbKl2AQABIRzAASN9FsABI3QuhUm8BycBAAErAMAAbF4ATsABI5HAASOZAAGdymADqEcBH8ABI5+oUQMAAxbAASOnLoVJvAeBwAEjscAfrZccwAEj5xbAASPYgcABI8nAH62Xg2ODQoE5AQABFsABI/SAwAEj78AfrLeFOIoBAMAAbikAPRzAASQNFsABJAUukCq8BDYBAAGCwAEkEcAfrfQAqINKwAEkHwGCwAEkJsAfrfQAAB+hfgAfpSwAH6aqAB+nBAAfp2gAH6fMAB+oMAAfqJQAH6kDAB+sggAfroUAAAAKArwXgLnAASQ2wAEkPMABMOIDtQoAAAFdA5f7AWADqMgAAAIEvBmAucABJJHAASShCZ0WAGADu2UABLwagLnAASTAwAEk3gmLSgBdA8AAbF8CYAOKUGADqMgBMsABJNxgA4pQYAOoyAABBbwtgLnAASTjwAEk48ABJRUAAAADwAEk/sABJRUAAAABAQHAASUEAAAEnRZgA7tlAABgA7wXAT8CCAG8GYAAwB+vQgkBwAEk45gNAAAAAA8GvByAucABJavAASWwwAEmGAAAtLsAAAABA8ABJbfAASYYAAAAAQEBwAElwQAAAIXgYAOKUAAAYAOoyAE+AUrAASXRARzAASXiFsABJdgui0q8GoFvAgACgMABJe7AH6+XNMABJfgDwAEl+MABJhMAAAAAAAAAYAOoyAFKwAEl/gEcwAEmB4DAASX+wB+vl4P4AQFgA6jIAS4AilMAwABslwa8HoC5wAEmHcABJiLAASbDAAC1C7sBAAAAAQPAASYwwAEmwwAAAAEBAcABJjoAAACF4GADilAAAGADqMgBSsABJk0BHMABJmwWwAEmXhbAASZNLp0WvBm0ZrsBu2ycuwIAAhzAASaPgMABJobAH7A6hpQBAAEWwAEmqBbAASaXLp0WvBmOuLsBu3wAilYqAKiwBrwfgLnAASbIwAEm1MABJ0EAAIgEAWrAASbJYAPAAGxWgLUAAAEDwAEm48ABJ0EAAAABAQHAASbtAAAAheBgA4pQAABgA6jIAT4BPTDAASb9JMABJz0DJ46ZgMABJyfAH7DXJ46aBrwggLnAASdGwAEnV8ABJ6sAAIaYAWrAASdHYAPAAGxWgLUAAAEDwAEnaMABJ6sAAAABAQHAASd2AAAAheBgA4pmAABgA6jIAT4BSsABJ4YBFsABJ54WwAEnjS6dFrwZiLu7Abv+BrwhgLnAASewwAEnwcABKCwAAIabAWrAASexYAPAAGxWgLUAAAEDwAEn0sABKCwAAAABAQHAASfgAAAAheBgA4puAABgA6jIAT4BSsABJ/ABHMABKAgWwAEn9y6dFrwZtN67AQEAARbAASgigMABKBnAH7GjgT6KXgC7pQa8IoC5wAEoMcABKELAASi0AACGngFqwAEoMmADwABsVoC1AAABA8ABKFLAASi0AAAAAQEBwAEoXwAAAIXgYAOKdgAAYAOoyAE+AUrAAShvARzAASiHFsABKHYunRa8GbTfuwECAAIWwAEooIDAASiXwB+yH4E+il6AwAEop8Afsh8Au6YGvCOAucABKLnAASjKwAEpRQAAhqEBasABKLpgA8AAbFaAtQAAAQPAASjdwAEpRQAAAAEBAcABKO0AAACF4GADin4AAGADqMgBPgFKwAEo/QEcwAEpFRbAASkELp0WvBm04LsBAgACFsABKTGAwAEpKMAfsqSBPopegMABKTjAH7KkALunBrwkgLnAASlKwAEpW8ABKdYAAIalAWrAASlLYAPAAGxWgLUAAAEDwAEpbsABKdYAAAABAQHAASl+AAAAheBgA4qJAABgA6jIAT4BSsABKY4BHMABKaYWwAEplS6dFrwZtOG7AQIAAhbAASnCgMABKbnAH7MpgT6KXoDAASnJwB+zKQC7qAa8JYC5wAEp28ABKefAASpBAACGqQFqwAEp3GADwABsVoC1AAABA8ABKfrAASpBAAAAAQEBwAEqCgAAAIXgYAOKkQAAYAOoyAE+AUrAASoaARbAASoyFsABKiEunRa8GbTbuwG7/Aa8JoC5wAEqRsABKlfAASrLAACGrQFqwAEqR2ADwABsVoC1AAABA8ABKmfAASrLAAAAAQEBwAEqdAAAAIQNYAOKoAAAYAOoyAE+AT0wwAEqgCeOmwa8J4C5wAEq0MABKuHAASzsAACGtAFqwAEq0WADwABsVoC1AAABA8ABKvLAASzsAAAAAQEBwAErAAAAAIXgYAOKvQAAYAOoyAE+BD4CTsABKzYAAAA8XQPAAGxKAWADilABFsABKzYeAMAAbC8BAV0DwABsIAFgA4pQARbAASs2gMABKy3AH7Rog52KwAA9wABsS0UAAAEcwAErNoEAwB+0gT4AAAAAwABsTQA+Ak7AASskAAABg55gA4pQARbAASs/gQDAH7SBQMAAbE8+AT0cwAErRy60uwEAAYLAAStPwB+04gC8HE7AASttwAErewABjDdgA4MyARzAASueFsABK44WwAErfS6dFrwZgL67Z4n/AQABFsABK9oWwAErzRbAASu8Lp0WvBm0jbsBu2mAkJq8AI6wScABK+ohHMABK/yBwAEr7sAftRsnAQABKwDAAGxePgFKwAEsDQEfwAEsGKlSAwADFsABLJUcwAEsZRbAASxBFsABLDAunRa8GbSPuwG7a51MAQABgcABLHfAH7UbALregSypPCuAwAEstMAftGgAP0rAASzJARzAASzQLrULuwEBAAGAwAEs38AftGgAvB4GvCiAucABLPHAAS0CwAEurgAAhroBasABLPJgA8AAbFaAtQAAAQPAAS0XwAEurgAAAAEBAcABLSkAAACF4GADit8AAGADqMgBPgNOwAEtP8ABLUsAAbUMYAOpOgEcwAEtfBbAAS1eFsABLU0unRa8GbSPuwG7a51MAQABFsABLZeAwAEtjsAfti6C04rnALrePRzAAS28FsABLbCAwAEtp8Afti6FpIrjgbEBAAE0wAEtxAPAAS3EwAEuawAAAAICAsABLc8AAACFDWADgn4AwAEt6AAAAIE+YAOKUAAAYAHAAGxcAT4BPRzAAS4oFsABLggWwAEt9y6dFrwZtI+7AbtrnXgCAAIWwAEuTILAAS49wB+2u4QigogcwAEuVS60uwEAAYPAAS5dwB+2yQC8HAC63QDAAGywSsABLnIBH8ABLn2pUgMAAxbAAS6WgcABLorAH7ZFgSypPCuAwAEuocAfti4ABrwpgLnAAS6zwAEuxMABL64AAIbIAWrAAS60YAPAAGxWgLUAAAEDwAEu2MABL64AAAABAQHAAS7pAAAAheBgA4sBAABgA6jIAT4DTsABLwnAAS8TAAGDvGADhEsBFsABLx6AwAEvFcAft5SDvIsFPRzAAS9cFsABLz4WwAEvLS6dFrwZtI+7AbtrjqEBAAEfwAEva6eYAQABgcABL3rAH7erAAC63ErAAS+LARzAAS+SLrULuwEBAAGAwAEvocAft5QAvB4GvCqAucABL7PAAS/EwAEwaAAAhsEBasABL7RgA8AAbFaAtQAAAQPAAS/lwAEwaAAAAAEBAcABMAoAAACF4GADivIAAGADqMgBPgI9HMABMDMWwAEwI4DAATAawB+4WYbAivSD+AEBYAOoyAEuAIsJSsABMEUBHMABMEwutQu7AQEAAYDAATBbwB+4WQC8Hga8K4C5wAEwbcABMH7AATDgAACGywFqwAEwbmADwABsVoC1AAABA8ABMJbAATDgAAAAAQEBwAEwqwAAAIXgYAOLEQAAYAOoyAE+AUrAATC7ARbAATDTFsABMMIunRa8GbTcuwG7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RBjAAERjAAAAA8AARC3AAERjAAAAAgICwABENgAAALBwYAO9jgDAAERDAAAAhApgA8AAbB8AAGADvjEBPwEJAMAARE297wIAAoDAAERTwCA+yIHAAERcwCA+1gACBr4zgKTAAERowABEfMAARIcBAIDgAWrAAERpYAPAAGxWgLUAAAEDwABEg8AARIcAAAAAAAAAYAPAAGwfAUrAAESGAZMGvjWApMAARIzAAESewABE0gAArmoBasAARI1gA8AAbFaAtQAAAQPAAESiwABE0gAAAAAAAABgA75NAUrAAESoAR/AAESsvjcCAAIWwABEwi6wcL3mFsAARMsuhAq98wAAACA/DQAgP1EAID+xAAAAAgK+OICkwABFE8AARRnAAEduA6uWAAABYAO+HQAAAQS+O4CkwABFUMAARVcJlom9YgBgA8AAbB8AAQW+QoCkwABGPMAARjzAAEatAAAAA8AARlDAAEatAAAABAMEwABGWwAAAIGXYAO+lQDAAEZoAAAAgT5gA8AAbBgAwABGcwAAAIQKYAPAAGwfAMAARoEAAASWiWADwABsHwFqAGABwABsXAIAYAO+OAE/AggBvjuDAMAgQEwJAMAARpO+KAMAA4DAAEaZwCBAHoHAAEafwCBALILAAEamwCBAPAADBr49gKTAAEaywABGx8AARtoBAIQ7AWrAAEazYAPAAGxWgLUAAAEDwABG08AARtoAAAAAAAAAYAPAAGxbAUrAAEbWASkGvj6ApMAARt/AAEbzwABHFAEAgOABasAARuBgA8AAbFaAtQAAAQPAAEb6wABHFAAAAAAAAABgA8AAbB8BSsAARv0BNcAARv0AAAEAYAPAAGwfARbAAEb9LpaJvWK+OyMcwABG/YDAAEb9wCBBJycBAAErAMAAbDIYwABHDoDgvgqAwABG/cAgQScBYAPAAGwfBr5AgKTAAEcZwABHK8AAR2wAAK5qAWrAAEcaYAPAAGxWgLUAAAEDwABHL8AAR2wAAAAAAAAAYAO+TQFKwABHNQEfwABHOb5CBAAEFsAAR04ugZe98hbAAEdULo8dvWK+IBbAAEdcLoQKvfMWwABHZC6Wib1ivjsAAAAgQJ8AIEDjACBBdAAgQewAAAADAr5DgKTAAEePwABHlcAASLYDqH8AAAFgA73wAAABBL5FgKTAAEgTwABIIhi1wAFqwABI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AIsvBrYCAGADvpUBasAAirpgA76VwAD/nAS+uoCkwACLS8AAi74GtgMAYAO+lQFqwACLXGADvpXAAP/JBL67gKTAAIvawACMZwa2BQBgA76VAWrAAIvrYAO+lcAA//sEvryApMAAjIPAAI0ABrYGAGADvpUBasAAjJdgA76VwAEALgS+vYCkwACNHMAAjWAGtggAYAO+lQFqwACNL2ADvpXAAQBgBL6+gKTAAI18wACOAga2CQBgA76VAWrAAI2KYAO+lcABAI8Evr+ApMAAjh7AAI6oBrYKAGADvpUBasAAji9gA76VwAEAwgS+wICkwACOxMAAj0IGtWAAYAO+lQFqwACOz2ADvpXAAOdDBL7BgKTAAI9ewACP5ga2CwBgA76VAWrAAI9sYAO+lcABAPEEvsKApMAAkALAAJCFBrYMAGADvpUBasAAkBBgA76VwAEBHQS+w4CkwACQocAAkRQGtg0AYAO+lQFqwACQsmADvpXAAQFMBL7EgKTAAJEwwACRtQa2DwBgA76VAWrAAJE+YAO+lcABAXkEvsWApMAAkdHAAJJDBrYQAGADvpUBasAAkeJgA76VwAEBpgS+xoCkwACSX8AAktcGthIAYAO+lQFqwACSc2ADvpXAAQHWBL7HgKTAAJLzwACTYga1YQBgA76VAWrAAJMOYAO+lcAA53AEvsiApMAAk37AAJPaBrViAGADvpUBasAAk5dgA76VwADnogS+yYCkwACT9sAAlG0GtWMAYAO+lQFqwACUEmADvpXAAOfTBL7KgKTAAJSJwACVGga2EwBgA76VAWrAAJSZYAO+lcABAgYEvsuApMAAlTbAAJWuBrYUAGADvpUBasAAlUlgA76VwAECMwS+zICkwACVysAAlhoGthYAYAO+lQFqwACV32ADvpXAAQJlBL7NgKTAAJY2wACWtAa2FwBgA76VAWrAAJZMYAO+lcABApYEvs6ApMAAltDAAJdSBrYYAGADvpUBasAAlt1gA76VwAECxAS+z4CkwACXbsAAl90GthkAYAO+lQFqwACXfmADvpXAAQLxBL7QgKTAAJf5wACYawa2GwBgA76VAWrAAJgLYAO+lcABAyEEvtGApMAAmIfAAJj5BrYcAGADvpUBasAAmJhgA76VwAEDVAS+0oCkwACZFcAAmZoGth0AYAO+lQFqwACZLWADvpXAAQOF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wABsRz0cwADVfy62fgEAARTAANWRwCDlywEBYAO/6gC/N07AANWowADVrQAAg2BgA8AAbB8BHMAA1a8utrABAAEpAL9vQ8AA1c4ewADV1b8NAgAChMAA1efAIOeTKQA+Aj0cwADWCIPAANX+wCDmJjYBAAGEwADWDMAg55MAwABsRz2MwADWG8Ag55McwADWIi6rqgAAAAC/Iz0cwADWOy62bAEAAR/AANZLtawDAANqwADWbGADvpXAAPpBHsAA1obAAG1sAQABg8AA1pvAIOYmAILAANanwCDmFQAAv15KwADWuwGEwADWwsAg55M+Aj0cwADW2y62fgEAAYHAANbtwCDlywC/N0rAANcAARzAANcHLrawAQABKQC/bwa/boDBwADXLcAA1zLAANl3AAC2uwAAAAEDwADXRMAA2XcAAAAGAwPAANdJAAAAtrVgA8AAbB8AwADXWAAAALa5YAPAAGwfAMAA12gAAAAuYAPAAGwfAAPAANd7AAAAq7FgA8AAbFsBagBgAcAAbFwCwADXiwAAALa8YAPAAGxbAWoAYAHAAGxcAsAA150AAAC2vWADwABsWwFqAGABwABsXAJcAT4FTsAA17LAANe5AACwqWADwABsGAEewADXv8AAbWwBAAEjhMAA193AIOj/McAA1+tgA8AAbB8DgMAA1+zAIOi2gMAA1/fAIOi2gMAA2ALAIOi2McAA2A9gA8AAbB8BgMAA2BDAIOi2AV0DwABsGQFgA8AAbB8ATsAA2CjAANgvAACLYWADwABsGAEjhcAA2DHAIOkYJMAA2EQCJ7KvhsAA2DzAIOk2hsAA2EbAIOk2AWADwABsGD0cwADYUy62bQQABGrAANh7YAO+lcAA+vKCwADYg8Ag6NaDwADYisAg6OaGwADYlcAg6TYAvytOwADY4sAA2O0AALbEYAPAAGwfASMcwADY+hbAANjvLquzvxeBOgEAARbAANj8Lqusv3IAwABshRbAANkLLquzvxeBwADZGMAg6MYBYAPAAGwfPRzAANkoLrZ+AQABH8AA2T7AAEAZAwADh8AA2VHAIOmrFMAA2VnAIOoiCAAWwADZZS6rrL9yAAC/Nwa/b4DBwADZfMAA2YDAANo3AAC2sAAAAAEDwADZkcAA2jcAAAABAQHAANmXAAAAtsVgA8AAbFsAAGADwABsHwE+AknAANms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IQVmACEHAAAhB1UAIQeqACEJkwAhCcIAIQoUACEKyQAhC40AIQwAACENUAAhDZsAIQ6+ACEQnQAhES8AIRHTACESvgAhFh8AIRinACEZtgAhGswAIRwFACEdRQAhHm0AIR8BACEgvQAhIi8AISJyACEirgAAAD0Cv7mAwcAA23DAANt2wADi4QOK0gAAAWADv3UAAAIEv7uAwcAA27LAANu3GLbHAF0DwABsGQFgA8AAbB8BKwS/vIDBwADbv8AA284YtsgAYAPAAGwfAZMBBb/IgMHAANvTwADb08AA3dEAAAADwADb3cAA3dEAAAABAQHAANviAAAAtmdgA8AAbB8AAGADv7kBPgRJwADcMxzAANxJgMAA3DfAISQmJwEAASsAwABsMj2IwADcUsAhJCY3gSw/TsAA3LTAANzKAAG2yWADwABsHwEcwADczpSBPwEAARzAANzjgMAA3NHAISQmg9YBAAE3FgDAAG0TAMAAbIhJwADc8BzAAN0GgMAA3PTAISQmgTsBAAE3wAD//wDAAGyGPgE9F8AA3RcutscewADdI8AAbNkBAAGBwADdLsAhJGoAv7s+AT0XwADdWS62xx7AAN1lwABtagEAAYHAAN1wwCEkagC/uz0cwADdxy42AQABkwC/wgEJAcAA29O/uAAAAAAHBr++gMHAAN4LwADeE8AA3igBAIDgAAAAAQPAAN4awADeKAAAAAAAAABgA8AAbB8BSsAA3h0BFsAA3h0utsi/vAa/wIDBwADeLcAA3jrAAN6GAwApAAAAAQPAAN48wADehgAAAAEBAcAA3kEAAACDKGADwABsHwAAYAPAAGwfAT4CQBzAAN5bgMAA3lXAISWTgToBAAEWwADeXS62yL+8AMAAbIXAAN5VwADeaABKwADebwEcwADeexbAAN52LrbHv7spAQABgMAA3nzAISWTAMAAbLgGv8aAwcAA3ovAAN6UwADfDAIAgOAAAAABA8AA3prAAN8MAAAAAQEBwADenwAAAId6YAPAAGwfAABcAT4CScAA3rAcwADevoDAAN60wCEmKIE7AQABFsAA3sYWwADewC62x7+7gODAAGxqAMAAbIY+AT0cwADe1i62ygEAAYDAAN7bwCEmKAC/wz89F8AA3vEutsiAwADe/8AhJii/vAa/wYDBwADfEcAA3x/AAN+yAwCAnAAAAAED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AGwfAMAA52YAAAC2smADwABsWwAAYAPAAGxbAT4BSsAA53cBIiIiIiIcwADngmrAAOd/YAPAAGwfiGyDAAEAAYDAAOeFwCEttADAAGz2ABzAAOeSgMAA543AIS20gwABAAFqwADnlWADwABsH8AAQnAAwABs9gEiHMAA56ZqwADno2ADwABsH4gkgwABAAGAwADnqcAhLbQAwABs9gAcwADntoDAAOexwCEttIMAAQABasAA57lgA8AAbB+IXQDAAGz2ASIcwADnymrAAOfHYAPAAGwfh/SDAAEAAYDAAOfNwCEttADAAGz2ABzAAOfagMAA59XAIS20gwABAAFqwADn3WADwABsH4fZAMAAbPYBHsAA5+rAAGz3AgACgMAA5/TAIS20asAA5/pgA8AAbB+IcgABIh7AAOgIwABs9wIAAoDAAOgSwCEttGrAAOgYYAPAAGwfh7cAAIHAAOgfwCEtxAKAhYDBACEvIwAgaxEAIOyWACEjqwAhKvcAIS0JAAAABAAhLQwAIS2KACEvIwAAAAIAAgi/0rbRgMIAAASA/QAArcwAAQEJj6qQd6KpoFimdqZ7qPWpAakQgjcAAMAAV1EAAQECttK204JxAADAAEudAAEBAqAfttSCsQAAvWIAAQEDtV61vKuXAAAACQK/1YDCiI+Ino0XB6ufAAABYAO98AAAAAEFv+KAwojBiMGJAgAAAAOIy4kCAAAAAQEBiNAAAACECmADwABsHwAAYAO/1QE/AQkAiNq+HAMAA2qI6mADvpXAAQangIj1wCEv4isACQa/14DCiYiJnImnAQCA4AFqiYlgA8AAbFaAtQAAAQOJo4mnAAAAAAAAAGADwABsHwFKiaYBlAa/2IDCiayJt4v8AQCpawAAAAEDib6L/AAAAAAAAABgA8AAbBgBPgVOicuJ1AAAttVgA8AAbBgBFonnFonWLrbWv9mAlrLSToqKipIAALbXYAPAAGyxAR6KmMAAbLMBAAEnttgATorFitAAALbZXQPAAGwZAWADwABsGAEcivAciuUait3AAG36gVMAAAAAwABvSYdDAQABJxAAwABtPEFFiwEBiwqLEAAAgyhgA8AAbB8BHIskFosdgosSwCEwsoDgwABsakQBAAGVAMAAbOEBHIsvg4spwCEw8IPXAQABkwDAAG0UAYuLN8AhMPAcizWDizfAITDw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dvOBwABE8sAhdwMAwABA4AAGwABA44DEwABFBsAARRzAAEbFAAC3BgFqwABFB2ADwABsVoC1AAABA8AARSzAAEbFAAAAAgICwABFQwAAAIEVYAPAAEEJAMAARV4AAACBrV0DwABsGQFgA8AAQYYAAGADikEBPgJOwABFdcAARXkAAIEsYAODMgEjFsAARXsurFXAAEBqFsAARYwWwABFhS6v4cAAQM+BLMAAQI8WwABFly6BLMAAQI8BYAODMknAAEWgIRzAAEWugcAARaTAIXfsJwEAASsAwABsYj4BSsAARb8BH8AARcqKTgIAAoLAAEXUwCF4DBzAAEXZLrcEAgACgMAARezAIXfcgcAARfXAIXfsAMAAQOAAPgFKwABGFQEfwABGIIpOAgACgsAARjXAIXgMHsAARkjAAG0kAwFgA4lVAhbAAEaAFsAARnGCwABGbcAheAyDY4NCgODAAGxqasAARo5gA8AAWPzAAQjhAYUkKQAGwABA5IDEwABGysAARtvAAFUtAAC3BwFqwABGy2ADwABsVoC1AAABA8AARurAAFUtAAAAAQEBwABG9QAAAICQYAONPAAAXAE+Ck/AAEhFwABISgAAAa0eYQMCYAPAAE5zYAOyz1wAA8AASE7AAEm2AAAAAgICwABIYAAAAIC+YAPAAE5zAMAASHAAAACAlmADss8AAFwBPgROwABIhcAASJAAALclYAPAAGwfARbAAEiZgsAASJLAIXmAtyXAAE6HTsAASK/AAEi6AAC3JmADwABsHwEWwABIw4LAAEi8wCF5gLcmwABOiEnAAEkaHMAASSmEwABJHsAheaQnAQABHMAASSyUgVoAAAAAwABsjwDAAGwyPgI9jMAASTrAIXmkFsAASUwuic7AAE5kPY3AAElgwCF5zGrAAEltYAPAAGwfAz89HMAASYUurGADAAODwABJkMAheZCEwABJmcAheaSFwABJpcAhecwAwABMSk7AAEn+AAAAtDxgA8AAQHsATsAAShrAAEopAAC3J2ADwABBhgEWwABKKy6DU8AAQLhJwABKOiXAAEpNAIPAAEo+wCF6jGADwABOcz4DTsAASoHAAEqGAACLTWADwABBnAEWwABKlxTAAEqIwCF6jAMBYAPAAE5zmrbAAE54ScAASqolwABKswCEwABKrsAheshgA8AATwU+Ak7AAErjwABK8AAAsTpgA8AATwUBJsAASuMBhMAASvLAIXrIYAPAAE8FPYzAAEsAwCF6yBbAAEsUhcAASwfAIXsUsTvAAE8TP0nAAEvOJcAAS9cAhMAAS9LAIXrIYAPAAE9SPgE9HMAAS/mBwABL9cAheVmAlQIAAhTAAEv6wCF6jAMBYAPAAE5zasAATApgA7LbwACFhAAAScAATCwlwABMNQCEwABMMMAheshgA8AAWSo+AT0cwABMWIHAAExUwCF5WYCVAgACFMAATFnAIXqMAwFgA8AATnNqwABMaWADstvAAIVdAABJwABMjCXAAEyVAITAAEyQwCF6yGADwABAez4CScAATLAcwABMvRbAAEy5FMAATLTAIXrIBAFgA8AAQHuBLMAAQI8nAQABFsAATMqAwABMwMAheUGJKI3YAMAAbF4+AT0cwABM6YHAAEzlwCF5WYCVAgACFMAATOrAIXqMAwFgA8AATnNqwABM+mADstvAAIU2AAA/PYrAAE0lwCF6exTAAE0ywCF6yAQBYAPAAEB7Pz9JwABNShzAAE1ZFsAATU4ui0TAAEC5JwEAASsAwABsYkrAAE1iAD9OwABNogAAALcoXQPAAGxfAmADwABAe2ADwABsHwBOwABNxwAAALcpXQPAAGxfAmADwABAe2ADwABsHwBOwABN7sAATfoAALcqXQPAAGxXAWADwABAewEewABOAMAAbHwAAWADwABAewAAPgJOwABOMgAAADxdA8AAbEoBYAPAAEGGARbAAE4yHgDAAGwvAQFdA8AAbCABYAPAAEGGARbAAE4yLotEwABAuQA9wABsS0UAAAEcwABOMocAwCF9QD4AAAAAwABsTQA+Ak7AAE4qAAAAgZdgA8AAQYYBFsAATj6HAMAhfUBAwABsTz4BScAATkYlwABOTwAUwABOSsAhfZ8IAGADwABOcz4FTsAATnLAAE59AACJzmADwABsHwEcwABOf5SBWgAAAADAAGyPTsAATsbAAE7WAAC3K2ADwABBnAEWwABO3RTAAE7YwCF9nwgBYAPAAE5zmrbAAE54TsAATwnAAE8OAACLTWADwABBnAEjJcAATyAAFMAATxDAIX4ECgBgA8AATwUWwABPUhTAAE9CwCF+BAoBYAPAAE8FsTvAAE8TFMAAT3PAIX4ECgABYAPAAEGcScAAT4wlwABPlQAUwABPkMAhfjQLAGADwABAez4CTsAAT7/AAE/JAAC1jWADwABAewEUwABPy8AhfjQLAWADwABAe0nAAE/bHMAAT+qCwABP38AhensnAQABFMAAT+3AIX6sDAAAwABsXj4BPRzAAFAGLqxgAwADHMAAUD9qwABQIl0DsucBYQMBYAPAAGwYYAOyz8AAlFuNbwEAARbAAFBXFMAAUE3AIX6sDACBiMAATl0AsusWwABQcy6JzsAATmRqwABQj2ADwABsHwMAwABMSknAAFCrHMAAULuGwABQr8AhfRArAQABFMAAUMTAIX6sDAAAwABseD4FPSMcwABRDYTAAFEEwCF81CcBAAErAMAAbF6MwABRBMAhfNQewABRFcAAbJYAAmADwABAe2ADwABsHwAAKwFdA8AAbF8CYAPAAEB7YAPAAGwfPTXAAFE7AAABAF0DwABsXwJgA8AAQHtgA8AAbB8BhMAAUTvAIXzUNcAAUUQAAAEAYAPAAEB7ARTAAFFEwCF+rAwAIxzAAFFPHMAAUUMUwABRO8Ahf9wNACkBAAEUwABRRMAhgAIOAADAAGxhJwEAASsAwABsMhzAAFFDFMAAUTvAIX/cDQCAnAIAAhTAAFFEwCGAAg4AkwDAAGxjKwFgA8AAbB89NcAAUWIAAAEAXQPAAGxfAmADwABAe2ADwABsHwGEwABRYsAhfNQ1wABRawAAAQBgA8AAQHsBFMAAUWvAIX6sDAAcwABRahTAAFFiwCGAgA0AgJwCAAIUwABRa8AhgKYOABzAAFF2HMAAUWoUwABRYsAhgIANACkBAAEUwABRa8AhgKYOAADAAGxhgT8BAAGUAMAAbIgAwABsYz0jHMAAUZiFwABRiMAhfPInAQABKwDAAGxejcAAUYjAIXzyHsAAUaDAAGyWAAJgA8AAQHtgA8AAbB8AACsBXQPAAGxfAmADwABAe2ADwABsHz01wABRxgAAAQBdA8AAbF8CYAPAAEB7YAPAAGwfAYXAAFHGwCF88jXAAFHWAAABAGADwABAewEUwABR1sAhfqwMACMcwABR4RzAAFHVFMAAUcbAIYFsDQApAQABFMAAUdbAIYGSDgAAwABsYScBAAErAMAAbDIcwABR1RTAAFHGwCGBbA0AgJwCAAIUwABR1sAhgZIOABTAAFHlwCF94AkAAMAAbGMrAWADwABsH0nAAFICHMAAUhQWwABSEBTAAFIGwCF+rAwAgSzAAECPJwEAARbAAFIhgMAAUhfAIXlBiSiN2ADAAGxePgE9HMAAUkKBwABSPsAheVmAlQIAAhTAAFJDwCF9nwgBYAPAAE5zasAAUklgA7LbwACTlAAAPgE9HMAAUpCGwABShMAhfRA2AQABFMAAUpTAIX6sDAAAwABsfT9JwABSviEcwABSxxTAAFLCwCF+NAsAJwEAAYLAAFLKwCF6ewDAAGxePgFJwABTMiXAAFM7ABTAAFM2wCF+NAsAYAPAAE9SPgE9HMAAU2GBwABTXcAheVmAlQIAAhTAAFNiwCF9nwgBYAPAAE5zasAAU2hgA7LbwACUwgAAScAAU5ElwABTmgAUwABTlcAhfjQLAGADwABZKj4BPRzAAFPBgcAAU73AIXlZgJUCAAIUwABTwsAhfZ8IAWADwABOc2rAAFPIYAOy28AAk7sAAD8/P0nAAFQJIRzAAFQWhMAAVA3AIXzUJwEAASsAwABsXj4BPRzAAFQwhMAAVCfAIXzUgbEBAAE0wABUOAPAAFQ4wABVIgAAAAICAsAAVEYAAAC1jWADwABAewDAAFRVAAAAtyxgA8AAbB8AAGABwABsXAE+AT0cwABUbC6sYAMAAxzAAFSfasAAVIRdA7LnAWEDAmADwABsGGADwABsH2ADss/AAJPljW8CAAIWwABUyIfAAFS+wCGDyIGIwABOXRTAAFTOwCGD2AgAALLrHMAAVPeFwABU6MAhfPIpAQABh8AAVPjAIYPIAMAAbGFqwABVEGADwABsHwMAwABMSgDAAGywPwbAAEDlgMTAAFUywABVQ8AAXPYAALcIAWrAAFUzYAPAAGxWgLUAAAEDwABVWcAAXPYAAAACAgLAAFVrAAAAg1NgA4pBAMAAVYYAAACFNWADmroAAFwBPgNOwABVssAAVboAAIEVYAPAAEa3ASbAAFWyARbAAFXBLoEVwABMSGADwABGt07AAFXnwABV7gAAty1dA8AAbBkBYAPAAFd9AR7AAFXwwABXXAMAAh/AAFYUibwDAAMWwABWOYDAAFYvwCGEuYLTikYWwABWTILAAFZEwCGE24Q+wABBTxbAAFZjgMAAVlnAIYS5g3OKRACBwABWe8AhhMcBty4qScAAVrMhHMAAVr6DwABWt8AhhQcnAQABKwDAAGxiPgE+Ak7AAFbvAAAAPF0DwABsSgFgA8AAV30BFsAAVu8eAMAAbC8BAV0DwABsIAFgA8AAV30Bg8AAVu/AIYUHAD3AAGxLRQAAARzAAFbvhADAIYWgPgAAAADAAGxNAD4CTsAAVuYAAAC3L2ADwABXfQEWwABW94QAwCGFoEDAAGxPPgZOwABXCQAAAICWYAOyzwBOwABXI8AAVywAAI/mYAOJVQEWwABXNIXAAFcuwCGF/I/mwABXgE7AAFdUwABXYgAAhXBgA4omARbAAFdqhcAAV2TAIYX8hXDAAFeBTsAAV4bAAFePAAC3MGADwABsWwEcwABXpxbAAFeZgsAAV5HAIYTbtyPAAEbSKwEAAYfAAFewwCGGLgDAAGx4ScAAV8MiJcAAV9AAh8AAV8fAIYYuYAOJvgAcwABYAhbAAFf7FsAAV+wUwABX48Ahhi4HAWADib6DY4nAgODAAGxqgTsBAAGTAMAAbIY+AknAAFgTFMAAWBfAIYZ6CQA+AT2OwABYL8Ahhh8cwABYgmrAAFg5XQOy5wFhAwJgA4lVYAPAAGxbYAOyz5yTjW8CAAIUwABYkMAhhi4HAWADib4WwABYooLAAFiawCGE24NWwABG5wCy6z4BPY7AAFjawCGGH2rAAFjkYAOy28AAkBU9FcAAWS7AIYZUCCs+AUnAAFlfFMAAWWPAIYZ6CQA+AT2OwABZe8Ahhh8cwABZxmrAAFmVXQOy5wFhAwdgA4lVYAOJVWADwABsGGADwABsGGADwABsGGADwABsGGADwABsW2ADss+fco1vBwAHh8AAWenAIYYuFsAAWhUUwABaB8AhhlQIAIU5iisWwABaPhTAAFowwCGGVAgAgYiKKh7AAFpYwABXXgEAARbAAFpxhcAAWmvAIYX8tzHAAFeCABbAAFqpFsAAWp+AwABalcAhhLmC04pGgYiDOBbAAFrDLoGIwABBrBbAAFrlgsAAWt3AIYTbg1bAAEbnALLrPgE9jsAAWx3AIYYfHMAAW1BqwABbJ10DsucBYQMHYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbFtgA7LPnuONbwcAB4fAAFtvwCGGLhbAAFuXFMAAW4nAIYZUCACFOYorFsAAW7wUwABbrsAhhlQIAIGIiioewABb0sAAV14BAAEWwABb64XAAFvlwCGF/LcxwABXggAWwABcHxbAAFwVgMAAXAvAIYS5gtOKRoGIgzgWwABcNS6BiMAAQawWwABcU4LAAFxLwCGE24NWwABG5wCy6z0cwABck4LAAFyLwCGE27cyBAAEhsAAXLjAIYYfFsAAXMEug23AAE5lFsAAXMouic7AAE5kFMAAXNbAIYZUCAAAwABHNj8GwABA5oDEwABc+8AAXQzAAGoZAAC3CQFqwABc/GADwABsVoC1AAABA8AAXR/AAGoZAAAAAQEBwABdMAAAAIU1YAOaugAAXAE+CU7AAF1cwABdZAAAgRVgA8AARrcBJsAAXVwBFsAAXWsugRXAAExIYAPAAEa3PgJOwABdywAAADxdA8AAbEoBYAOKJgEWwABdyx4AwABsLwEBXQPAAGwgAWADiiYBFsAAXcsWwABdxy6BLMAAQI+DY4NCAD3AAGxLRQAAARzAAF3LggDAIYokPgAAAADAAGxNAD4CTsAAXboAAACFOGADiiYBFsAAXduCAMAhiiRAwABsTz4CTsAAXfvAAF4CAAC3LV0DwABsGQFgA8AAV30BHsAAXgTAAFdcAwACFsAAXjCDwABeJsAhioiFOYorgMAAXjfAIYniAbcuKUnAAF5yIRzAAF59hMAAXnbAIYqpJwEAASsAwABsYj4BPgJOwABesAAAADxdA8AAbEoBYAPAAFd9ARbAAF6wHgDAAGwvAQFdA8AAbCABYAPAAFd9AYTAAF6wwCGKqQA9wABsS0UAAAEcwABesIUAwCGLET4AAAAAwABsTQA+Ak7AAF6nAAAAty9gA8AAV30BFsAAXriFAMAhixFAwABsT0E+Bk7AAF7NwABe1gAAj+ZgA4lVARbAAF7ehsAAXtjAIYttj+bAAFeATsAAXwDAAF8OAACFcGADiiYBFsAAXxaGwABfEMAhi22FcMAAV4FJwABfLxzAAF9JFsAAXzuBwABfM8Ahifa3I8AARtIrAQABh8AAX1LAIYuRAMAAbHg+AULAAGDMAD9OwABg9QAAAICWYAOyzwBJwABhCCIlwABhFQCHwABhDMAhi5FgA4m+ABzAAGFHFsAAYUAWwABhMRTAAGEowCGLkQcBYAOJvoNjicCA4MAAbGqBOwEAAZMAwABshj4CPRXAAGFawCGMFglqwABhZGADstvAAJAVPRXAAGGkwCGLtwgrPgE9FcAAYdnAIYwWCRzAAGIBasAAYeNdA7LnAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyz53ujW8FAAWHwABiIMAhi5EWwABiSBTAAGI6wCGLtwgAhTmKKxbAAGJtFMAAYl/AIYu3CACBiIoqHsAAYoPAAFdeAQABFsAAYpyGwABilsAhi223McAAV4IAFsAAYsSBwABivMAhifaDVsAARucAsus9HMAAYvyBwABi9MAhifa3MgQABBTAAGMjwCGMFgkAFsAAYywug23AAE5lFsAAYz+DwABjNcAhioiEAYJZFMAAY0vAIYu3CAAAwABHNj9JwABjkCEcwABjohbAAGOYFsAAY5QugSzAAECPg1ODQycBAAErAIpMPgE9HMAAY7MutwgCAAIWwABjzhbAAGPKLoEswABAj4NTg0OAwABj2cAhieIAwABA5T9JwABj9SEcwABkCRbAAGP9FsAAY/kugSzAAECPg1SDRCcBAAErAIpMPgE9HMAAZBoutwgCAAIWwABkNRbAAGQxLoEswABAj4NUg0SAwABkQsAhieIAwABA5T9JwABkXiEcwABkdxbAAGRmFsAAZGIugSzAAECPg1WDRScBAAErAMAAbGI+AT4CTsAAZKgAAAA8XQPAAGxKAWADikEBFsAAZKgeAMAAbC8BAV0DwABsIAFgA4pBARbAAGSoFsAAZKQugSzAAECPg1WDRQA9wABsS0UAAAEcwABkqIIAwCGOdT4AAAAAwABsTQA+Ak7AAGSXAAAAg1NgA4pBARbAAGS6ggDAIY51QMAAbE8+AT0cwABkxC63CAIAAoPAAGTbwCGO2YDAAGTmwCGJ4gDAAEDlPz4CTsAAZUQAAAA8XQPAAGxKAWADhEsBFsAAZUQeAMAAbC8BAV0DwABsIAFgA4RLARbAAGVEFsAAZUAugSzAAECPg7uDWgA9wABsS0UAAAEcwABlRIIAwCGPID4AAAAAwABsTQA+Ak7AAGUzAAAAg7xgA4RLARbAAGVQggDAIY8gQMAAbE8+Aj0cwABlWC63MwMAA4PAAGVwwCGPhIDAAGV7wCGJ4hbAAGWQFsAAZYwugSzAAECPg2ODQgDAAEDoPRzAAGWvgcAAZafAIYn2tzQDAAMWwABl3oPAAGXUwCGPhITHhFCAwABl6MAhieIWwABl+S6DbcAATmUAwABHOj4CTsAAZjEAAAA8XQPAAGxKAWADhAIBFsAAZjEeAMAAbC8BAV0DwABsIAFgA4QCARbAAGYxFsAAZi0ugSzAAECPhJiDWQA9wABsS0UAAAEcwABmMYIAwCGQHz4AAAAAwABsTQA+Ak7AAGYeAAAAjclgA4QCARbAAGY/ggDAIZAfQMAAbE8+AT0cwABmT4HAAGZHwCGJ9rc0AwADFsAAZoCDwABmdMAhkIOEx4QGgMAAZorAIYniFsAAZpsug23AAE5lAMAARzo+Ak7AAGbtAAAAPF0DwABsSgFgA4QlARbAAGbtHgDAAGwvAQFdA8AAbCABYAOEJQEWwABm7RbAAGbpLoEswABAj4SZg1sAPcAAbEtFAAABHMAAZu2CAMAhkOY+AAAAAMAAbE0APgJOwABm0gAAALc1YAOEJQEWwABnDYIAwCGQ5kDAAGxPPgE9HMAAZx2BwABnFcAhifa3NgYAA4DAAGdHwCGJ4hbAAGdYLoNtwABOZRbAAGdtg8AAZ2HAIZFKhAGCWQODYxbAAGefg8AAZ5PAIZFKg2OEKoRwFsAAZ9uDwABnz8AhkUqEcIQrhHEWwABoGIPAAGgMwCGRSoRxhC3AAEc5PRzAAGg1LoGxAQABNMAAaD0DwABoPcAAahQAAAACAgLAAGhFAAAAgYhgA8AAbBgAwABoUwAAAIeDYAPAAEAuAABgAcAAbFwBPgJJwABoeyXAAGiHAIPAAGh/wCGSFmADwABMhD4CPRzAAGiiLrc3AwADFsAAaMwUwABoxMAhkhYDAWADwABMhIPBwABMiYDAAGjTwCGJ4hbAAGjoFsAAaOQugSzAAECPg2ODQgDAAEDnPRzAAGkJgcAAaQHAIYn2tzgCAAIUwABpG8AhkhYDAWADwABMhIDAAGkkwCGJ4gDAAEc3P0nAAGliIiIlwABpbgCDwABpZsAhkhZgA8AATYgAIRbAAGmXFMAAaY/AIZIWAwFgA8AATYiDNMAATZAAIRzAAGm/FsAAabcUwABpr8AhkhYDAWADwABNiK9AwABNjScBAAErAMAAbGI+AT0cwABp2oHAAGnSwCGJ9rc5AQABFsAAaf0UwABp9cAhkhYDAWADwABNiK9AwABNjQDAAEc4PwDAAEDbBsAAQOeAxMAAah7AAGojwABsxQAAtzcAAAABA8AAajfAAGzFAAAAAwMDwABqPgAAAIPBYAODzADAAGpVAAAAhTVgA5q6AMAAaoAAAACDY10DwABsGQFgA4omAABcAT4BPgJOwABqugAAADxdA8AAbEoBYAOKJgEWwABquh4AwABsLwEBXQPAAGwgAWADiiYBgsAAarrAIZO1AD3AAGxLRQAAARzAAGq6gwDAIZPSPgAAAADAAGxNAD4CTsAAaqkAAACFcGADiiYBFsAAasqDAMAhk9JAwABsTz4DTsAAatbAAGrkAAC3OmADwABsHwEewABq5sAAV2ICAAKEwABq9sAhlCoWwABrC4DAAGsFwCGTmYGXg84AScAAaxgWwABrIoDAAGscwCGTmYPCg+E+AT0cwABrPy63OwQABIXAAGtswCGUS4TAAGt7wCGUKhbAAGuQgMAAa4rAIZOZg22DsRbAAGufgMAAa5nAIZOZhAGCWQDAAEDpP0nAAGu6IhbAAGvEgMAAa77AIZOZg8OD4gAhFsAAa+CAwABr2sAhk5mE1YPcPgI9jcAAa/fAIZRLHsAAbBCKHQIAAmrAAGwhYAPAAGwfhQSFwABsMMAhlEsAPRzAAGxILrc7BAAEhcAAbHXAIZRLhMAAbITAIZQqFsAAbJmAwABsk8Ahk5mDbYOxFsAAbKiAwABsosAhk5mEAYJZAMAAQOk/BsAAQOiAxMAAbMrAAGzPwAB1YQAAtzMAAAABA8AAbObAAHVhAAAAAwMDwABs8QAAAIO8YAOESwDAAG0SAAAAhTVgA5q6AMAAbTcAAACDY10DwABsGQFgA4omAABcAT4ITsAAbWHAAG14AACK9V0DwABsGQFgA4omARbAAG2VFsAAbYyAwABtgsAhlbKEx4RQg2OE807AAG3DwABt2AAAhHBdA8AAbBkBYAOI5wEWwABt9RbAAG3sgMAAbeLAIZWyhMeEUIRwhPVOwABuKcAAbjkAAIRxXQPAAGwZAWADiOcBFsAAblYWwABuTYDAAG5DwCGVsoTHhFCEcYT2TsAAbnTAAG5/AACFA2ADiVUBFsAAbpQWwABui4DAAG6BwCGVsoTHhFCFA4T3ScAAbqUhHMAAbsCDwABuqcAhleknAQABKwDAAGxiPgE+Ak7AAG75AAAAPF0DwABsSgFgA4omARbAAG75HgDAAGwvAQFdA8AAbCABYAOKJgGDwABu+cAhlekAPcAAbEtFAAABHMAAbvmHAMAhltQ+AAAAAMAAbE0APgJOwABu5AAAALc8YAOKJgEWwABvEYcAwCGW1EDAAGxPPgE+Ak7AAG8/AAAAPF0DwABsSgFgA4omARbAAG8/HgDAAGwvAQFdA8AAbCABYAOKJgGCwABvP8Ahlc4APcAAbEtFAAABHMAAbz8UAMAhl08JAD4AAAAAwABsTQA+Ak7AAG8uAAAAhXBgA4omARbAAG9PFADAIZdPCQBAwABsTz4CTsAAb1/AAG9sAAC3PWADwABsHwEewABvd4odAgACasAAb4hgA8AAbB+E4B7AAG+hwABXYgIAAhTAAG+xwCGXqQoAFsAAb9IUwABvwMAhlywIAIU5iisAAD0cwABv5S63OwQABBTAAHAFwCGXzAsAFMAAcBPAIZepCgAWwABwIi6DbcAATmUWwABwSxTAAHA5wCGXLAgAhAGCWQDAAEDpP0nAAHB0IRzAAHCNhMAAcHjAIZYdJwEAASsAwABsYj4BPgJOwABwwQAAADxdA8AAbEoBYAOI5wEWwABwwR4AwABsLwEBXQPAAGwgAWADiOcBhMAAcMHAIZYdAD3AAGxLRQAAARzAAHDBhwDAIZiOPgAAAADAAGxNAD4CTsAAcLcAAACVImADiOcBFsAAcNeHAMAhmI5AwABsTz4BScAAcOEhFsAAcO0UwABw5sAhmOYIAITViPs+AT4CTsAAcSoAAAA8XQPAAGxKAWADiiYBFsAAcSoeAMAAbC8BAV0DwABsIAFgA4omAYLAAHEqwCGVzgA9wABsS0UAAAEcwABxKhQAwCGZJQkAPgAAAADAAGxNAD4CTsAAcRkAAACFcGADiiYBFsAAcToUAMAhmSUJAEDAAGxPPgJOwABxTMAAcVsAALc+YAPAAGwfAR7AAHFmih0CAAJqwABxd2ADwABsH4UEHsAAcZbAAFdiAgACFMAAcabAIZl/CgAWwABxvBTAAHG1wCGY5ggAgZeI7QAAPRzAAHHQLrc7BAAEFMAAcgHAIZmiCwAUwAByEcAhmX8KABbAAHIgLoNtwABOZRbAAHIwFMAAcinAIZjmCACEAYJZAMAAQOk/P0nAAHJlIRzAAHJ5hcAAcmnAIZZRJwEAASsAwABsYj4BPgJOwAByrAAAADxdA8AAbEoBYAOI5wEWwAByrB4AwABsLwEBXQPAAGwgAWADiOcBhcAAcqzAIZZRAD3AAGxLRQAAARzAAHKshwDAIZplPgAAAADAAGxNAD4CTsAAcqMAAACFI2ADiOcBFsAAcr2HAMAhmmVAwABsTz4BPgJOwABy6wAAADxdA8AAbEoBYAOKJgEWwABy6x4AwABsLwEBXQPAAGwgAWADiiYBgsAAcuvAIZXOAD3AAGxLRQAAARzAAHLrFADAIZrgCQA+AAAAAMAAbE0APgJOwABy2gAAAIVwYAOKJgEWwABy+xQAwCGa4AkAQMAAbE8+Ak7AAHMLwABzGQAAtz9gA8AAbB8BHsAAcySKHQIAAmrAAHM1YAPAAGwfhQQewABzUsAAV2ICAAIUwABzYsAhmzoKABbAAHN3FMAAc3HAIZq9CACBl4jtAAA9HMAAc4kutzsEAAQUwABzuMAhm10LABTAAHPHwCGbOgoAFsAAc9Yug23AAE5lFsAAc+UUwABz38Ahmr0IAIQBglkAwABA6T9JwAB0DiEcwAB0HYbAAHQSwCGWhScBAAErAIlZPgE+Ak7AAHRSAAAAPF0DwABsSgFgA4omARbAAHRSHgDAAGwvAQFdA8AAbCABYAOKJgGCwAB0UsAhlc4APcAAbEtFAAABHMAAdFKHAMAhnB0+AAAAAMAAbE0APgJOwAB0QQAAAIVwYAOKJgEWwAB0YocAwCGcHUDAAGxPPgJOwAB0cMAAdIMAALdAYAPAAGwfAR7AAHSFwABXYgIAAhTAAHSVwCGcdQgAhsAAdKTAIZaFAD0cwAB0uS63OwUABBTAAHTZwCGclgkAFMAAdO3AIZx1CAAWwAB1CC6DbcAATmUWwAB1JBbAAHUbgMAAdRHAIZWyhMeEUIQBglkBt0EpwABA6T8GwABA6YDEwAB1ZsAAdWvAAHkIAAC3OwAAAAEDwAB1isAAeQgAAAAFBATAAHWWAAAAhodgA8AAbB8AwAB1rgAAAIVwYAOKJgDAAHXBAAAAg21gA8AAbFgAwAB1zgAAAIQBYAPAAGwfAAHAAHXmAAAAt0FgA8AAbFsBasAAdfRgA8AAbFscXAE+Ak7AAHYXwAB2HwAAgRVgA8AARrcBJsAAdhcBFsAAdiYugRXAAExIYAPAAEa3ScAAdjMiIRbAAHZGgcAAdjjAIZ1WhpCKMwAhHsAAdm2KHwIAAoDAAHaAwCGdRhbAAHaYgcAAdorAIZ1WhoeKMgA+A07AAHazAAAAgJZgA7LPAEnAAHbChMAAdsbAIZ2FPgE9jsAAdt7AIZ4VHMAAdy1qwAB26F0DsucBYQMDYAPAAGwYYAPAAGwYYAPAAGwYYAOyz8AApKCNbwMAAx7AAHdEiiMBAAEWwAB3YIHAAHdSwCGdVoaHijIAFsAAd4mBwAB3e8AhnVaBiIoqHsAAd5iKIwEAAYDAAHemwCGdRgAAsus+AT2OwAB3ycAhnhUcwAB3/2rAAHfTXQOy5wFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPwACkNo1vAwADHsAAeCOKIwEAARbAAHg/gcAAeDHAIZ1WhoeKMgAWwAB4ZIHAAHhWwCGdVoGIiioewAB4f4ojAQABgMAAeI3AIZ1GAACy6z0cwAB4r4XAAHinwCGdprcyBAAEhsAAeNLAIZ4VgsAAeNvAIZ1kg8AAeOTAIZ10gcAAePDAIZ1WAMAARzY/BsAAQOqAxMAAeQ3AAHkewAB7cwAAtwoBasAAeQ5gA8AAbFaAtQAAAQPAAHkxwAB7cwAAAAUFBcAAeT8AAACDy2ADwABYeADAAHlTAAAAg8dgA4OsAMAAeXAAAAC3C2ADg6wAwAB5jAAAAIN/YAPAAGxbAMAAeZwAAACBjWEDA2ADg6xgA4OsYAPAAGxbWwAAXAE+AT4CTsAAepgAAAA8XQPAAGxKAWADikEBFsAAepgeAMAAbC8BAV0DwABsIAFgA4pBARbAAHqYFsAAeomCwAB6ecAhn8qDM4O0g3yDZAA9wABsS0UAAAEcwAB6mIUAwCGgDD4AAAAAwABsTQA+Ak7AAHpsAAAAg1NgA4pBARbAAHqghQDAIaAMQMAAbE8+Ak7AAHqvwAB6sQAAgQVgA4OsARzAAHrDFsAAermAwAB6s8Ahn6yBFsAAWHq3QgMAAxbAAHrxhsAAeufAIaB2gtOKRhbAAHsMgsAAevzAIZ/KgYiDsIPAAHsSwCGf2ADAAFnmScAAeyMhHMAAeymHwAB7J8AhoJcnAQABKwDAAGxePgE9HMAAe0SEwAB7PMAhn+iAlQMAA4HAAHtFwCGfvIfAAHtVwCGgl4PAAHtYwCGf2AAAPwbAAEDrgMTAAHt4wAB7icAAhrEAALcMAWrAAHt5YAPAAGxWgLUAAAEDwAB7lsAAhrEAAAAGBQXAAHukAAAAg8tgA8AAWHgAwAB7uAAAAIPHYAODrADAAHvVAAAAtwtgA4OsAMAAe/EAAACDf2ADwABsWwDAAHwBAAAAgY1hAwNgA4OsYAODrGADwABsW1sAAcAAfFUAAAC3DWADwABsWwFqwAB8aGADwABsWxxcAT4DScAAfHYcwAB8iYHAAHx6wCGhkScBAAGCwAB8jMAhoZ8AwABsXj4BSsAAfKUAP0nAAHy3IiXAAHzKAIHAAHy7wCGhkWADhAIBJcAAfOwAgsAAfNzAIaGfYAOEAj4BPR7AAH0EtTwDAAMnt0MWwAB9ToHAAH0/wCGhkYQBglkWwAB9Wi6DbcAATmUAP0nAAH1uIiXAAH2BAIHAAH1ywCGhkWADhEsAJcAAfaEAgsAAfZHAIaGfYAOESz4DScAAfbciHMAAfc8WwAB9yhTAAH27wCGhkQEBYAOES4O+hE4nAQABasAAfeBgA4SShmcAwABsXgAcwAB+CRbAAH4EFMAAffTAIaGfAgFgA4RLg76ETicBAAFqwAB+GmADhJKGZwDAAGxePgJOwAB+McAAfj8AALdEYAPAAGxbARzAAH5BLrcPBAAEgMAAfmLAIaGBFMAAfmnAIaGRAQFgA4RLFMAAfnnAIaGfAgFgA4RLhcAAforAIaHaAMAAQPNJwAB+pYbAAH6pwCGjID4BPRzAAH7ELrcKBQAFgMAAfufAIaGBFMAAfu7AIaGRAQFgA4RLFMAAfv7AIaGfAgFgA4RLg8AAfw/AIaGthMAAfxnAIaG9AMAAQOo/P0nAAH88IhzAAH9UFsAAf08UwAB/QMAhoZEBAWADhEuDvoROJwEAAWrAAH9lYAOEkoZYAMAAbF4AHMAAf44WwAB/iRTAAH95wCGhnwIBYAOES4O+hE4nAQABasAAf59gA4SShlgAwABsXj4BPRzAAH+xLrcQBAAEgMAAf9LAIaGBFMAAf9nAIaGRAQFgA4RLFMAAf+nAIaGfAgFgA4RLhcAAf/rAIaHaAMAAQPQ/ScAAgBsiHMAAgDMWwACALhTAAIAfwCGhkQEBYAOES4O+hE4nAQABasAAgERgA4SShQkAwABsXgAcwACAbRbAAIBoFMAAgFjAIaGfAgFgA4RLg76ETicBAAFqwACAfmADhJKFCQDAAGxePgJOwACAlcAAgKMAALdEYAPAAGxbARzAAIClLrcRBAAEgMAAgMbAIaGBFMAAgM3AIaGRAQFgA4RLFMAAgN3AIaGfAgFgA4RLhcAAgO7AIaHaAMAAQPVJwACBCYbAAIENwCGk6D4BPRzAAIEoLrcKBQAFgMAAgUvAIaGBFMAAgVLAIaGRAQFgA4RLFMAAgWLAIaGfAgFgA4RLg8AAgXPAIaGthMAAgX3AIaG9AMAAQOo/Pz4GTsAAgbLAAIHKAAC3RWADwABsWwEiJcAAgdsAgcAAgczAIaGRYAODzAEiJcAAggAAgcAAgfHAIaGRYAOESwAWwACCHxTAAIIQwCGhkQEBYAOES4T9hGxOwACCNMAAgk0AALdGYAPAAGxbASIlwACCXwCCwACCT8AhoZ9gA4PMASIlwACChQCCwACCdcAhoZ9gA4RLABbAAIKlFMAAgpXAIaGfAgFgA4RLhP2EbE7AAIK6wACC0gAAt0dgA8AAbFsBIiIiJcAAguQAgcAAgtXAIaGRYAODzAAhFsAAgw4UwACC/8AhoZEBAWADg8yE1oPdACEWwACDNxTAAIMowCGhkQEBYAODzITBg94BIiXAAINcAIHAAINNwCGhkWADhEsAFsAAg3sUwACDbMAhoZEBAWADhEuDf4RtTsAAg5DAAIOpAAC3SGADwABsWwEiIiIlwACDvACCwACDrMAhoZ9gA4PMACEWwACD5xTAAIPXwCGhnwIBYAODzITWg90AIRbAAIQRFMAAhAHAIaGfAgFgA4PMhMGD3gEiJcAAhDcAgsAAhCfAIaGfYAOESwAWwACEVxTAAIRHwCGhnwIBYAOES4N/hG1JwACEZyKGwACEa8AhpZoAh8AAhIbAIaXwPgE9HMAAhKoutxAEAASAwACEy8AhoYGBwACE0sAhoZGCwACE4sAhoZ+FwACE88AhodoAwABA9D9JwACFFCIUwACFGMAhpkYIAAAUwACFM8AhptIJAD4CTsAAhVzAAIVqAAC3RGADwABsWwEcwACFbC63EQQABIDAAIWNwCGhgYHAAIWUwCGhkYLAAIWkwCGhn4XAAIW1wCGh2gDAAED1ScAAhdAUwACF1MAhp84KAD4BPRzAAIXvLrcKBQAFgMAAhhLAIaGBgcAAhhnAIaGRgsAAhinAIaGfg8AAhjrAIaGthMAAhkTAIaG9AMAAQOo/PwbAAEDsgMTAAIa2wACGx8AAh8YAALcOAWrAAIa3YAPAAGxWgLUAAAEDwACG4cAAh8YAAAADAwPAAIbvAAAAib1gA4MyAMAAhwUAAACBFmADgXUAwACHFgAAAIlLYAODMgAAYAPAAGxbAT4CTsAAhzDAAIc9AACK4GADg6wBHMAAh0mBwACHP8AhqKyC5QIAAoDAAIdbwCGonhrAAIdiwABP7gCBhErAAId5ASIhHMAAh42DwACHgMAhqNMnAQABKwDAAGxeACEcwACHtBbAAIelg8AAh5jAIajTgzODtCcBAAGCwACHt8AhqLoAwABsXgbAAEDtgMTAAIfLwACH0MAAjQYAALdJAAAAAQPAAIf5wACNBgAAAAMDA8AAiAgAAAC3SmADg6wAwACILAAAAIC+YAPAAEZfAMAAiD4AAACDvGADhEsAAFwBPgpOwACIVsAAiF0AAIthYAPAAGwYASMWwACIcYLAAIhnwCGpn4T9hGwnjdYjFsAAiI+CwACIhcAhqZ+Df4RtJ43XJwABYAPAAGwYAWADwABsGE7AAIi2wACIwQAAnJxgA4UaARzAAIjYFsAAiMqBwACIw8AhqY+u3sAAWXGJ8wYABhbAAIkFFsAAiP6BwACI98AhqY+r+cAARmWAkMAAXXkfwACJHIdcAAAAABzAAIk9g8AAiTbAIamzgT8BAAEWwACJThbAAIlJgsAAiT/AIamfgYiDsIGIiSIAwABtPR7AAIlgheoCAAIWwACJfoLAAIl0wCGpn4THhFAWwACJkBbAAImILoEVwABMSIEVwABBFQAWwACJrILAAImiwCGpn4QBglkqAI6rTsAAieTAAInrAACBsGADhRoBNcAAifEAAAEAYAOGBAEfwACJ8YYVBAAEH8AAigaHXAAAAAAawACKIMAAT+4fwACKNoXwAQABMcAAikBgA4UaAYTAAIpBwCGqAwCAwACKT8AhqYEANcAAim4AAAEAXAEXwACKboXAAInxwCGq7IQBFsAAioWCwACKe8AhqZ+EAYJZglmFwACJ8cAhquxJwACKlSElwACKtwAWwACKrBbAAIqjgsAAipnAIamfhMeEUIUDhPdgA4mAPgE9jcAAis3AIaraNcAAitoAAAEAYAOG4wEfwACK2ob9AgAChcAAiufAIaraFsAAiwIWwACK+YLAAIrvwCGpn4THhFCFA4T3ADXAAIsYAAABAFwBF8AAixiGwACK2sAhq6+FtCmG8jXAAIs1AAABAFwBF8AAizWGwACK2sAhq6+FtimG9DXAAItTAAABAFwBF8AAi1OGwACK2sAhq6+FrhbAAIt3FsAAi28ugRXAAExIg1bAAEEZhvU1wACLmAAAAQBcARfAAIuYhsAAitrAIauvhAEWwACLr4LAAIulwCGpn4QBglmCWYbAAIrawCGrrz89F8AAi9gWwACLz4LAAIvFwCGpn4THhFCE+DXAAIvjAAABAGADiKcBH8AAi+OIsAEAAYXAAIvzwCGq2gA1wACMAwAAAQBcARfAAIwDhsAAi+PAIayvhAEWwACMGoLAAIwQwCGpn4QBglmCWYbAAIvjwCGsr4UIPRfAAIxCFsAAjD0WwACMNILAAIwqwCGpn4THhFCE+IUGhAAWwACMVYLAAIxLwCGpn4THhFCCWD0XwACMboLAAIxkwCGpn4M0KoR6PRfAAIyQgsAAjIbAIamfg7ophIE9F8AAjL6CwACMtMAhqZ+E8iqEfT0XwACM5oLAAIzcwCGpn4TzKoR+BsAAQO+AxMAAjQvAAI0PwACOTgAAt0vAAEB6AAAAAQPAAI0cwACOTgAAAAEBAcAAjSQAAACERGADg6wAAGADwABsWAE+A0nAAI0yJcAAjT0AgMAAjTbAIa2/YAODzErAAI1HARbAAI1VFMAAjU7AIa2/AAFgA4PMg22DsT9JwACNYiXAAI1tAIDAAI1mwCGtv2ADhEtKwACNewEWwACNiRTAAI2CwCGtvwABYAOES4Ntg7E/SsAAjgYBJsAAjgYFHsAAjg21PQQABCTAAI4uARbAAI4hgMAAjhrAIa2/hU7AAG0tJ7dLHMAAjkGUgVoAAAAAwABsjysAYAPAAGxYBsAAQPCAxMAAjlPAAI5gwACdiwAAt0zAAEB6AAAAAQPAAI59wACdiwAAAAYGBsAAjosAAACDy2ADwABYeADAAI6fAAAAg8dgA4OsAMAAjrwAAAC3C2ADg6wAwACO4AAAALdNYAOE7gDAAI8FAAAAt05gA4TuAMAAjyMAAAC3DWADwABsWwAAYAOWOAE+BE7AAI9IwACPXgAAt09gA5Y4AWrAAI9tYAOWOLHTScAAj3gWwACPqhbAAI+bFsAAj4yCwACPfMAhrtyDM4O0g2ODQiLAAGwiPgJOwACPxMAAj9MAAIMzYAODMgEWwACP5YLAAI/VwCGu3IMzg7Q9jsAAj/vAIa8fHsAAkCCWQgIAAhbAAJBEh8AAkDXAIa9og2ODQhzAAJB9FsAAkGSAwACQXsAhrr6BFsAAWHq3UAIAAhbAAJCgLoVfwABA0IfAAJCqwCGvaADAAFnkAD9JwACQxyEcwACQ9DXAAJDLAAABAF0DwABsGQFgA4omATXAAJDLAAABAGADhO4Bg8AAkMvAIa7qIxzAAJDLh8AAkMvAIbAMJwEAASsAwABsXisWwACQ3YfAAJDLwCGwDINjhPMBXQPAAGwZAWADiiYjHMAAkMuHwACQy8Ahr/cnAQABKwDAAGxiKxbAAJDth8AAkMvAIa/3gODAAGxqAWADwABsHycBAAE1wACQ/wAAAQBdA8AAbBkBYAOKJgE1wACQ/wAAAQBgA4TuAYTAAJD/wCGu+CMcwACQ/4fAAJD/wCGwqScBAAErAMAAbF4rFsAAkRKHwACQ/8AhsKmDY4TzAV0DwABsGQFgA4omIxzAAJD/h8AAkP/AIbCUJwEAASsAwABsYisWwACRIofAAJD/wCGwlIDgwABsagFgA8AAbB8AwABsMj4BPRzAAJEyLrcSBgAFhcAAkVPAIa8GgcAAkW/AIa7OHMAAka9qwACRiV0DsucBYQMCYAPAAGwYYAPAAGwYYAOyz8AAvmSNbwIAAiTAAJG8AxbAAJHtFsAAkd6BwACRz8Ahrs6DM4O0gYiDOCeA9xbAAJIeFsAAkhmBwACSCsAhrs6BiIOwgYiJIiTAAJIkAxbAAJJWFsAAkkeCwACSN8AhrtyDM4O0gYiDOCeA9xbAAJKIFsAAkoOCwACSc8AhrtyBiIOwgYiJIgCy6xbAAJKqgcAAkpvAIa7OhAGCWWrAAJLAYAPAAGwfAwGBMzHAAJLdYAOy7gEcwACTVBzAAJMaasAAkutdA7LnAWEDAWADwABsGGADss/AALxUjW8BAAEWwACTPRbAAJM4gsAAkyjAIa7cgYiDsIGIiSIAsuuLjAMAAxzAAJNhLrdLwABAegEAAYLAAJNvwCGu3ADAAEDvFsAAk6WCwACTlcAhrtyEAYJZasAAk7FgA8AAbB8DALLWwABA9knAAJPUIRzAAJP5NcAAk9gAAAEAYAOE7gGDwACT2MAhruojHMAAk9iHwACT2MAhssMnAQABKwDAAGxeKxbAAJPqh8AAk9jAIbLDg2OE8wFdA8AAbBkBYAOKJicBAAErAMAAbGI+BU7AAJQnwACUNwAAt1FdA8AAbF8CYAOKJmADiVUBMsAAlFxgA4omYAOJVQBFwACUZgHAAJRvwACUcQAAgdRgA8AAbB8BkwEcwACUeBTAAJR2wCGzTggAgToBAAEWwACUmhbAAJSLg8AAlHrAIa7qg2OE84DgwABsagDAAGyFARXAAJSkwCGzTggcwACUohTAAJSkwCGzTggAgT8BAAGUAMAAbIg+AT0cwACUwIfAAJSxwCGzHoCcAgACHMAAlOEWwACU04TAAJTBwCGu+INjhPMpAQABFMAAlOLAIbNOCAAAwABsuB/AAJT4ihMCAAIcwACVTBbAAJU+hMAAlSzAIa74g2OE8ykBAAEUwACVTcAhs04IAADAAGy4HMAAlYAWwACVcoPAAJVhwCGu6oNjhPMpAQABFMAAlYHAIbNOCAAAwABsuAAAwABsY07AAJWhwACVrgAAg81gA5Y4AR7AAJW9ljwBAAGHwACVxcAhsx4ARcAAld0BwACV5sAAlegAAIHUYAPAAGwfAZMBHMAAle8UwACV7cAhtJMJAIE6AQABFsAAlhEWwACWAoPAAJXxwCGu6oNjhPOA4MAAbGoAwABshQEVwACWG8AhtJMJHMAAlhkUwACWG8AhtJMJAIE/AQABlADAAGyIPgNOwACWNsAAlkgAALdSYAOKJgEcwACWaRbAAJZbg8AAlkrAIa7qg2OE8ykBAAEUwACWasAhtJMJAADAAGy4TsAAloTAAJaXAAC3U2ADiiYBHMAAlrkWwACWq4TAAJaZwCGu+INjhPMpAQABFMAAlrrAIbSTCQAAwABsuEnAAJbGIRbAAJbeFMAAlsvAIbVFCwCE2Io0PgVOwACXC8AAlxkAALdUYAOJVQEWwACXLRTAAJcbwCG1CAoAhTmKK07AAJdHwACXVgAAt1VgA4lVARbAAJdrFMAAl1jAIbVFCwCFOYorScAAl3whHMAAl5aGwACXgMAhrx8nAQABKwDAAGxePgI9FcAAl63AIbWeDBzAAJfThsAAl73AIa8fg2cBAAEUwACX4sAhtZ4MAACWRz0VwACX/sAhtcQNHMAAmDWGwACYH8Ahrx+DZwEAARTAAJhEwCG1xA0AAJZHP07AAJh0wACYggAAt1ZgA4lVARzAAJiRFMAAmITAIbRoCACDZwEAARTAAJigwCG1xA0AAJZHScAAmLshHMAAmRMcwACY1YDAAJjAwCGuvrdXAgACFMAAmObAIbWeDAAUwACY9cAhtmMOAADAAFh/leQAAAAAmuo+AT0cwACZRC63EgYABYXAAJlrwCGvBoHAAJmNwCGuzhzAAJnYasAAma1dA7LnAWEDBmADiVVgA8AAbBhgA8AAbBhgA4lVYAPAAGwYYAPAAGxbYAOyz6y6jW8GAAYUwACZ+8AhtZ4MABbAAJowFMAAmh7AIbUICgCBiIoqJMAAmjQDFsAAmmsWwACaXIHAAJpNwCGuzoMzg7SBiIM4J4D3FsAAmqIWwACanYHAAJqOwCGuzoGIg7CBiIkiFMAAmr7AIbZjDgAkwACaywMWwACbAxbAAJr0gsAAmuTAIa7cgzODtIGIgzgngPcWwACbOxbAAJs2gsAAmybAIa7cgYiDsIGIiSIWwACbXxbAAJtXLoEVwABMSINWwABBGQCy6xbAAJuXgcAAm4jAIa7OhAGCWWrAAJuzYAPAAGwfAwGBMzHAAJvWYAOy7gEcwACcXxzAAJwfasAAm+pdA7LnAWEDAWADwABsGGADss/AALxUjW8BAAEWwACcQhbAAJw9gsAAnC3AIa7cgYiDsIGIiSIAsuuLjAMAAxzAAJxsLrdLwABAegEAAYLAAJx6wCGu3ADAAEDvFsAAnLaCwACcpsAhrtyEAYJZasAAnMJgA8AAbB8DALLWwABA9j8/PY7AAJ0EwCGvHx7AAJ0zlkUCAAKGwACdO8Ahrx8UwACdUsAhtGgIAAA/SsAAnWsBhsAAnXLAIa8fBsAAQPGAxMAAnZDAAJ2dwACfkQAAt1jAAEB6AAAAAQPAAJ25wACfkQAAAAICAsAAnccAAACDy2ADwABYeADAAJ3VAAAAg8dgA4OsAABgA5Y4AT4DTsAAnfjAAJ4NAAC3WWADljgBasAAnhxgA5Y4sdNJwACeJxbAAJ5YFsAAnkkWwACeOoHAAJ4rwCG5KoMzg7SDY4NCIsAAbCI+Ak7AAJ5ywACegQAAgzNgA4MyARbAAJ6SgcAAnoPAIbkqgzODtD2KwACeqMAhuUEewACezJZCAgACFsAAnvCDwACe4cAhuYqDY4NCHMAAnykWwACfEIDAAJ8KwCG5GoEWwABYerdQAgACFsAAn0wuhV/AAEDQg8AAn1bAIbmKAMAAWeQAP0rAAJ9yAYLAAJ95wCG5QQbAAEDygMTAAJ+WwACfm8AArKYAALdawABAegAAAAEDwACfpsAArKYAAAALCgrAAJ+0AAAAg8tgA8AAWHgAwACfzgAAALdPYAOWOADAAJ/4AAAAt1lgA5Y4AMAAoBsAAACDx2ADg6wAwACgOAAAALcLYAODrADAAKBYAAAAt1tgA4lVAMAAoHUAAAC3XGADiVUAwACgjwAAAITVYAPAAGxbAMAAoLYAAAC3UmADiOcAwACg1AAAALcNYAPAAGxbAAHAAKDyAAAAt11gA8AAbFsBasAAoQpgA8AAbFscXAE+B0nAAKEYIRzAAKEygcAAoRzAIbpaJwEAASsAwABsXj4BPY7AAKFDwCG6oBzAAKFpgcAAoVPAIbpag2cBAAGGwACheMAhuqAAlkc/ScAAoZIhHMAAoauCwAChlsAhumgnAQABKwDAAGxePgE9jcAAobzAIbqSHMAAoeCCwAChy8AhumiDZwEAAYXAAKHvwCG6kgCWRz9JwACiCSIhFsAAoh2DwACiDsAhunaDVoO9ABbAAKJPhMAAoj/AIbqEg1aDvT4BPY7AAKJvwCG6oB7AAKJ/lvgCAAIWwACinRbAAKKTgMAAoo3AIbpKgRbAAFh6gJDAAFnchsAAoqjAIbqgAD9OwACiyMAAotQAALdeYAPAAGxbASIhHMAAougUwACi1sAhur4IACcBAAErAMAAbF4BFMAAovPAIbrdCgBOwACjF8AAox8AAILvYAOJVQEjFMAAoyHAIbv+CwCGwACjL8AhuqCFwACjP8AhupIBYAOJVU7AAKNawACjZAAAg1NgA4lVASMUwACjZsAhu/4LAIXAAKN0wCG6kobAAKODwCG6oAFgA4lVScAAo5ccwACjoYDAAKObwCG6SrdfAwADFMAAo7zAIbw6DAAUwACjxcAhvG8NAGrAAKPhYAOa9InSAMAAWHw+AEnAAKRHIofAAKRLwCG6rgAcwACkaIDAAKRiwCG6SrdfAwADFMAApIfAIbxvDQAUwACkksAhvDoMAGrAAKSsYAOa9InSAMAAWHw+AEnAAKVfIiXAAKVrABTAAKVjwCG8OgwAYAOJZAElwAClhwAUwAClfcAhvG8NAGADiWQ+AD4GTsAApjHAAKZEAAC3YGADwABsGAEkwACmkwMWwACmcRbAAKZig8AAplPAIbp2gzODtIGIgzgngPcWwACmjRbAAKaIg8AApnnAIbp2gYiDsIGIiSJOwACmosAAprYAALdhYAPAAGwYASTAAKcHAxbAAKbkFsAAptWEwACmxcAhuoSDM4O0gYiDOCeA9xbAAKcBFsAApvyEwACm7MAhuoSBiIOwgYiJIk7AAKcXAAAAgJZgA7LPAE7AAKcqAAAAhAFgA8AAbB8AScAApzwcwACnUhTAAKdAwCG6vggAJwEAASsAwABsXj4CScAAp2UUwACnacAhut0KAD4BPRXAAKe0wCG+ChAcwACn4WrAAKe+XQOy5wFhAwVgA8AAbBhgA4lVYAOJVWADwABsGGADwABsW2ADss+sR41vBQAFFMAAp/7AIb1kDgCFwACoIMAhupKGwACoPMAhuqAUwACoWcAhvbcPABbAAKiEFsAAqHwugRXAAExIg1bAAEEZALLrPgE9FcAAqLjAIb4KEBzAAKjpasAAqMJdA7LnAWEDBWADwABsGGADiVVgA4lVYAPAAGwYYAPAAGxbYAOyz6vTjW8FAAUUwACpBsAhvWQOAIXAAKkowCG6kobAAKlEwCG6oBTAAKlhwCG9tw8AFsAAqYwWwACphC6BFcAATEiDVsAAQRkAsus9FcAAqbfAIb4ZERbAAKnTg8AAqcTAIbp2hAGCWT4CPRXAAKn2wCG+ChAcwACqJmrAAKoAXQOy5wFhAwZgA8AAbBhgA8AAbBhgA4lVYAOJVWADwABsGGADwABsW2ADss+rQ41vBgAGFsAAqlMUwACqQcAhur4IAIGIiOsUwACqZcAhvWQOAIXAAKqFwCG6kobAAKqfwCG6oBTAAKq6wCG9tw8AFsAAquMWwACq2y6BFcAATEiDVsAAQRkAsus9FcAAqwTAIb4ZERbAAKsjFMAAqxHAIbq+CACEAYJZPRzAAKs9LrcSBgAFFMAAq17AIbrMCQCDwACrcMAhunYUwACrgMAhvgoQABTAAKuJwCG+GREAasAAq5VgA8AAbB8DAYEzMcAAq7JgA7LuARzAAKwpHMAAq+9qwACrwF0DsucBYQMBYAPAAGwYYAOyz8AAvFSNbwEAARbAAKwSFsAArA2EwACr/cAhuoSBiIOwgYiJIgCy64uMAwADHMAArDYut0vAAEB6AQABhMAArETAIbqEAMAAQO8WwACseoTAAKxqwCG6hIQBgllqwACshmADwABsHwMAstbAAED2BsAAQPOAxMAArKvAAKy8wADGAQAAtw8BasAArKxgA8AAbFaAtQAAAQPAAKzPwADGAQAAAAQEBMAArNYAAACDy2ADwABYeADAAKznAAAAg8dgA4RLAMAArQcAAAC3C2ADhEsAwACtHQAAALcNYAPAAGxbAABgA8AAbFsBPhRAHMAArVAWwACtS4HAAK08wCHBZ4O+hE4nAQABasAArWFgA4SShmcAwABsXsAArTzAAK1nAEAcwACtihbAAK2FgsAArXXAIcF1g76ETicBAAFqwACtm2ADhJKGZwDAAGxewACtdcAAraEATsAAra3AAK27AAC3RGADwABsWwEqTsAArdXAAK3mAAC3TWADhO4BFsAArfeBwACt6MAhwWeEx4RQTsAArhLAAK4kAAC3TmADhO4BFsAArjaCwACuJsAhwXWEx4RQTsAArlLAAK5oAAC3T2ADljgBHMAArmout0zAAEB6BgAGgMAArpHAIcFXgcAArqDAIcFngsAArrjAIcF1hcAArtHAIcIdhsAAruvAIcJBg8AArwbAIcGDAMAAQPBOwACvK8AAr0AAALdZYAOWOAEcwACvSi63WMAAQHoCAAKAwACvZ8AhwVeBwACvbsAhwWcAwABA8T0cwACvhC63WsAAQHoKAAqAwACvmcAhwVeHwACvqMAhwmUUwACvx8AhwsEIAIHAAK/lwCHBZ4LAAK/9wCHBdRbAALAnhcAAsBbAIcIdhQOE9xbAALBNhsAAsDvAIcJBhQOE9yorg8AAsH7AIcGDAMAAQPJJwACwlRzAALDGFsAAsL8WwACwqoXAALCZwCHCHYRwhPWA4MAAbGqBOgEAARbAALD3FsAAsOKGwACw0MAhwkGEcIT1gODAAGxqAMAAbIU+AT0cwACxBy63EgYABYPAALEowCHBg4HAALFEwCHBZxzAALGHasAAsV5dA7LnAWEDAmADwABsGGADwABsGGADss/AAL0XjW8CAAIkwACxlAMWwACxxRbAALG2gcAAsafAIcFngzODtIGIgzgngPcWwACx9hbAALHxgcAAseLAIcFngYiDsIGIiSIkwACx/AMWwACyLhbAALIfgsAAsg/AIcF1gzODtIGIgzgngPcWwACyYBbAALJbgsAAskvAIcF1gYiDsIGIiSIAsusWwACygoHAALJzwCHBZ4QBgllqwACymGADwABsHwMBgTMxwACytWADsu4BHMAAsywcwACy8mrAALLDXQOy5wFhAwFgA8AAbBhgA7LPwAC8VI1vAQABFsAAsxUWwACzEILAALMAwCHB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AM5xFsAAzmKBwADOU8Ah1hqDM4O0JwEAARbAAM50LoEswABAjwDAAGxePgE9HMAAzqQWwADOnC6BFcAATEisYAUABILAAM6vwCHWKIPAAM64wCHWNoTAAM7EwCHWRhbAAM7bgcAAzszAIdYag22DsQGBM4XAAM73wCHWV8AAQSI+Aj2NwADPFMAh1ldSBE7AAM8eAAABAF0DwABsGQFgA7LuATHAAM8eYAOy7gA9HMAAzzCGwADPHsAh1w82AQABHMAAzzCCwADPKMAh1iiLjAMAAxbAAM9MgcAAzz3AIdYag22DsYPAAM9VwCHWNoTAAM9hwCHWRgCy1gDAAGxHTsAAz3YAAAEAXQPAAGwgAWADsu4BhcAAz3bAIdZXScAAz3YhHMAAz3aHwADPdsAh14AnAQABKwDAAGxePgJOwADPdgAAADxdA8AAbEoBYAOy7gEWwADPdh4AwABsLwEBXQPAAGwgAWADsu4Bh8AAz3bAIdeAAD3AAGxLRQAAARzAAM92FADAIde+CAA+AAAAAMAAbE0APgJOwADPcgAAAQBgA7LuARYAFADAIde+CABAwABsTz0cwADPcobAAM8ewCHXDzYBAAEUwADPcsAh2BgJAADAAGxHP4bAAM8ewCHXD0nAAM+NgMAAz5HAIdYKPgE9HMAAz9AWwADPyC6BFcAATEisYAUABBzAAM//asAAz+hdA7LnAWEDAmADwABsGGADwABsGGADss/AAJozjW8CAAIWwADQMhbAANAtgcAA0B7AIdYagYiDsIGIiSIWwADQPBbAANA4LoEswABAj4GIgzgAsusWwADQUxbAANBPLoEswABAj4QBglkWwADQdBbAANBvFsAA0GsugSzAAECPgYiDOIDgwABskRbAANCMFsAA0IgugSzAAECPg22DQQGBM4XAANCqwCHWV8AAQSI+AUnAANDLFsAA0NMWwADQzy6BLMAAQI+DhoNUPgROwADRJsAA0S8AALdpYAPAAGwYARbAANFAFsAA0TUWwADRMS6BLMAAQI+C4YNchKSDYE7AANFgwADRagAAt2pgA8AAbBgBFsAA0X0WwADRcBbAANFsLoEswABAj4Shg12BiIM4TsAA0ZHAANGhAAC3a2ADwABsHwEWwADRxhbAANGnFsAA0aMugSzAAECPhKaDYoDgwABskT0cwADR4BbAANHYLoEVwABMSKxgBQAEHMAA0hhqwADR+l0DsucBYQMDYAPAAGwYYAPAAGwYYAPAAGwYYAOyz8AAlOmNbwMAA4fAANI5wCHZkYbAANJEwCHZXxbAANJiFsAA0l2BwADSTsAh1hqBiIOwgYiJIgCy6xbAANJ7FsAA0ncugSzAAECPhAGCWRTAANKVwCHZwwgAFsAA0rgWwADStC6BLMAAQI+DbYNBAYEzhcAA0tjAIdZXwABBIj4BPRzAANMwFsAA0ygugRXAAExIrGAFAAQcwADTZWrAANNKXQOy5wFhAwJgA8AAbBhgA8AAbBhgA7LPwACwcI1vAgACFsAA04oWwADThi6BLMAAQI+BiIM4FsAA06QWwADTn4HAANOQwCHWGoGIg7CBiIkiALLrFsAA070WwADTuS6BLMAAQI+EAYJZFsAA0+AWwADT2xbAANPXLoEswABAj4GIgziA4MAAbJEWwADT+hbAANP2LoEswABAj4Ntg0EBgTOFwADUGsAh1lfAAEEiBsAAQNWAxMAA1EPAANRawADVCwEAr44BasAA1ERgA8AAbFaAtQAAAQPAANRswADVCwAAAAAAAABgA8AAbBgBPgFKwADUcgEjIhbAANR5LoSjwABAygAhFsAA1JAutxzAAEDLJMAA1QEDFsAA1L8WwADUtS6DU8AAQLivjsAAQYwnh0QWwADU5RbAANTZLoNUwABAja+OwABBjBbAANUDLoGIwABBrAFgA8AAbBgGwABA94DEwADVEMAA1SHAANkMAAC3EwFqwADVEWADwABsVoC1AAABA8AA1TbAANkMAAAAAgICwADVRgAAAIEWYAOBdQDAANVbAAAAgJBgA408AABcAT4DTsAA1fnAANYDAACDU2ADiaoBFsAA1hMWwADWCRbAANYFLoEswABAj4NTg0ODaYpHTsAA1jXAANZCAACDzWADljgBHsAA1lGWPwEAARbAANZjFsAA1l8ugSzAAECPg1SDRAA+Ak7AANajAAAAPF0DwABsSgFgA4pBARbAANajHgDAAGwvAQFdA8AAbCABYAOKQQEcwADWoxbAANaWFsAA1pIugSzAAECPhKGDXYSdAAAAAINwAD3AAGxLRQAAARzAANajhADAIdzuPgAAAADAAGxNAD4CTsAA1oQAAAC3bGADikEBFsAA1ryEAMAh3O5AwABsTz4CTsAA1tLAANbcAAC1jWADiaoBFsAA1xUcwADW9YPAANbowCHcuoN3AQABhcAA1wnAId1fAJZIg2mKR0nAANcsIRzAANeZHMAA1zqAwADXMMAh3GiC4gQABILAANddwCHcihbAANdyhsAA12jAId2AgtOJsBbAANeFFsAA130ugRXAAExIgRXAAEEVgcAA147AIdx2AIGBJwEAAYbAANemwCHdgACJuD4BPRzAANfDFsAA17sugRXAAExIrGAEAAQcwADYCWrAANfbXQOy5wFhAwRgA4lVYAOJVWADiVVgA8AAbFtgA7LPplGNbwQABILAANgowCHciobAANhDwCHdgBbAANhuFsAA2GIWwADYXi6BLMAAQI+DVINEg2mKRxbAANiXFsAA2I8ugRXAAExIg1bAAEEZALLrFsAA2MAWwADYvC6BLMAAQI+EAYJZasAA2NhgA8AAbB8DFsAA2PIWwADY7i6BLMAAQI+DbYNBAMAAQSI/BsAAQPiAxMAA2RHAANkiwADf9wAAtuoBasAA2RJgA8AAbFaAtQAAAQPAANkswADf9wAAAAEBAcAA2TUAAAC1m2ADwABALgAAXAE+AUnAANlCJcAA2UwAgMAA2UbAId8qYAPAAEB7Pgg9F8AA2WsUwADZZcAh3yoAAWADwABAe7b5LsAAQIJJwADZhhrAANmKwABYWD4BPRfAANmqLrb6FMAA2bzAId8qAAFgA8AAQHvAAEC/Pz0cwADaFRbAANoPLpppwABMRbdtAQABNMAA2igDwADaKMAA2wQAAAACAgLAANowAAAAgYhgA8AAbBgAwADaPgAAAIREYAPAAEAuAABgAcAAbFwBPgJOwADaWMAA2mQAALduYAPAAEAuARzAANp+FsAA2ngUwADacsAh3yoAAWADwABAe5ppwABMOa8NAgABgcAA2pDAId/TAYLmKsAAQmZJwADariEcwADavoPAANqywCHf/icBAAErAMAAbF4+AT0cwADa2oLAANrTwCHf47bqAQABg8AA2uXAId/+AMAAQFE/AMAAQmg9HMAA2xMWwADbDS6aacAATEW3bwEAATTAANsmA8AA2ybAANv1AAAAAgICwADbLgAAAIGIYAPAAGwYAMAA2zwAAACERGADwABALgAAYAHAAGxcAT4CTsAA21bAANtiAAC3bmADwABALgEcwADbcBbAANtqFMAA22TAId8qAAFgA8AAQHuaacAATDmvDQIAAYHAANuCwCHguwGC5inAAEJmScAA258hHMAA26+DwADbo8Ah4OYnAQABKwDAAGxePgE9HMAA28uCwADbxMAh4Mu26gEAAYPAANvWwCHg5gDAAEBRPwDAAEJpPRzAANwRFsAA3AsWwADb/i6EmMAAQLua9sAAQn+BsQEAATTAANwZA8AA3BnAANzVAAAAAgICwADcIQAAAIGIYAPAAGwYAMAA3C8AAACERGADwABALgAAYAHAAGxcAT4CTsAA3EnAANxVAAC3bmADwABALgEcwADcbxbAANxqFsAA3F0UwADcV8Ah3yoAAWADwABAe4SYwABAhpr2wABCfykBAAGBwADccMAh4a4AwABsYUnAANx/IRzAANyPg8AA3IPAIeHZJwEAASsAwABsXj4BPRzAANyrgsAA3KTAIeG+tuoBAAGDwADctsAh4dkAwABAUT8AwABssE7AANzjwADc8AAAt3BgA8AAbB8BNcAA3PIAAAEAYAPAAGwfATXAANzyAAABAF0DwABsGQFgA8AATx8BFsAA3PIusK/AAEC3IxzAANzygcAA3PLAIeKXJwEAASsAwABsYisWwADdAYHAANzywCHil4DgwABsagFgA8AAbB8jHMAA3PKBwADc8sAh4ocnAQABKwDAAGwyk4HAANzywCHihwFgA8AAbB9OwADdGMAA3SQAALdxYAPAAGwfATXAAN0sAAABAGADwABsHwE1wADdLAAAAQBdA8AAbBkBYAPAAE8fARbAAN0sFMAA3SbAId8qAAFgA8AAQHuwr8AAQH0jHMAA3SyCwADdLMAh4z0nAQABKwDAAGxiKxbAAN07gsAA3SzAIeM9gODAAGxqAWADwABsHyMcwADdLILAAN0swCHjLScBAAErAMAAbDKTgsAA3SzAIeMtAWADwABsH0nAAN1OIRzAAN1fgcAA3VLAIeJzJwEAAYLAAN1iwCHjGQDAAGwyPgE9HMAA3X8UwADdecAh3yoAAWADwABAe6xgBAADasAA3YpgA7LbwADDURbAAN3EFMAA3b7AId8qAAFgA8AAQHuJzsAAQDRqwADd0GADwABsHwMBgTMxwADd42ADsu4BHMAA3gdqwADd72ADstvAAMMpi4wDAAMWwADeFC6DbcAATmUWwADeHS6JzsAATmRqwADeKWADwABsHwMA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LgFKwABJrAErBsAAQsWA0MAASbXAAEnNwABKDAEAgJYBasAASbZgA8AAbFaAtQAAAQPAAEnVwABKDAAAAAAAAABgA7LPAUrAAEnYARzAAEn5asAASdhdA7LnAWEDAWADwABsGGADss/AAHTujW8BAAEWwABKBy6BiMAAQqUAsusGwABCx4DQwABKOMAASkDAAEroAAC4CgAAAAEDwABKU8AASugAAAAAAAAAYAPAAEAuAT4DTsAASmTAAEpwAACatmADwABALgEWwABKci6Hg8AAQqZDwABKfyEcwABKlxbAAEqSgMAASobAIrg1g2DAAEAwJwEAASsAwABsXj4BPYjAAEqowCK4NRbAAErCgMAASrbAIrg1g2DAAEAwSsAAStIBgMAAStnAIrg1AAAit0MAIreJACK4AAAiuKwAAAADAsAAQsqA0MAASu3AAErzwABPQEe4CwAAAWADwABsVgABYAPAAE4UAAANBsAAQsyA0MAASyzAAEtDwABLUQEAhEQBasAASy1gA8AAbFaAtQAAAQPAAEtKwABLUQAAAAAAAABgA4OsAUrAAEtNASsGwABCzYDQwABLVsAAS23AAEt/AQCv8QFqwABLV2ADwABsVoC1AAABA8AAS3jAAEt/AAAAAAAAAGADg6wBSsAAS3sBKwbAAELOgNDAAEuEwABLm8AAS64BALgMAWrAAEuFYAPAAGxWgLUAAAEDwABLp8AAS64AAAAAAAAAYAODrAFKwABLqgErBsAAQs+A0MAAS7PAAEvKwABL3gEAuA0BasAAS7RgA8AAbFaAtQAAAQPAAEvXwABL3gAAAAAAAABgA4OsAUrAAEvaASsGwABC0IDQwABL48AAS+zAAEv9AQCGKgAAAAEDwABL9cAAS/0AAAAAAAAAYAPAAGxbAUrAAEv4ASoGwABC0YDQwABMAsAATBfAAEwsAQCGNAFqwABMA2ADwABsVoC1AAABA8AATCTAAEwsAAAAAAAAAGADwABsWwFKwABMJwEqBsAAQtKA0MAATDHAAExOwABMhAEArIQBasAATDJgA8AAbFaAtQAAAQPAAExbwABMhAAAAAAAAABgA8AAQHsBSsAATF4BJsAATF4BIyXAAExlABbAAExeLoQAwABAMmADwABAexbAAEx3LoQAwABAMisBYAPAAEAuYAPAAEB7BsAAQtiA0MAATInAAEyewABM+gIAhAABasAATIpgA8AAbFaAtQAAAQPAAEykwABM+gAAAAEBAcAATK0AAACBPmADwABALgAAXAE+AT0wwABMuh/AAEzEwABtWAEAASe4DgAGwABC04DQwABM/8AATR7AAE1sAQCBFQFqwABNAGADwABsVoC1AAABA8AATSbAAE1sAAAAAAAAAGADwABBCQE+AT0wwABNLB/AAE02wABtWAEAASe4DgAGwABC1IDQwABNwsAATeDAAE3sAQCDvgFqwABNw2ADwABsVoC1AAABA8AATeXAAE3sAAAAAAAAAGADhJIBSsAATegBKwbAAELagNDAAE3xwABOAsAATqYAALcAAWrAAE3yYAPAAGxWgLUAAAEDwABOGcAATqYAAAACAgLAAE4pAAAAgRVgA8AAQQkAwABOPAAAAICQYAONPAAAXAE+AT0wwABOTR/AAE5XwABtWAEAASe4DwAGwABC1YDQwABOq8AATs3AAE7yAQCsRgFqwABOrGADwABsVoC1AAABA8AATtrAAE7yAAAAAAAAAF0DwABsGQFgA8AAWb8BSsAATt0BasAATt1dA8AAbBkBYAPAAFm/wAEJGgbAAELWgNDAAE73wABPGcAATz4BALf5AWrAAE74YAPAAGxWgLUAAAEDwABPJsAATz4AAAAAAAAAXQPAAGwZAWADwABZvwFKwABPKQFqwABPKV0DwABsGQFgA8AAWb/AAQkaAAAiuOsAIrkvACK5cwAiubcAIrn7ACK6NAAiunoAIrr4ACK7WgAiu7EAIrv1ACK8ZQAivMcAIr0pAAAADQLAAELbgNDAAE9DwABPScAAUC43uBAAAAFgA8AAQsIAAWADwABCygABBcAAQu0AAAAABAAAAwAAAAAABAQEAAAAAIGIYAPAAGwYAAAAAACHg2ADwABALgAAAAAAic5gA8AAbB8AAAAAAINtYAPAAGxYAABgA8AAQtsBPwEJAADAAELJBAAEgADAIr2kgQDAIr2xggDAIr2+gwDAIr3LAA0GwABC3YDQwABLLMAAS0PAAEtRAQCERAFqwABLLWADwABsVoC1AAABA8AAS0rAAEtRAAAAAAAAAGADg6wBSsAAS00BKwbAAELegNDAAEtWwABLbcAAS38BAK/xAWrAAEtXYAPAAGxWgLUAAAEDwABLeMAAS38AAAAAAAAAYAODrAFK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wABOZBaYsC6DbcAATmUAwABBlgFgA4pBg0NJmL4iIiEWmMMuhJvAAEMLACEcmPUWmOsWmOEutwPAAEMIg1ODQycBAAErAIpMABaZHRaZEhaZCC63A8AAQwiC4YNchJuDVj4CPRyaXYCaVcAi0AysYAQABByajmqac10DsucBYQMBYAPAAGwYYAOyz8AAzvGNbwEAARaasRaaphaanC63A8AAQwiC4YNcgYiDOACy6xaawi6JzsAATmRqmthgA8AAbB8DFprsLoNtwABOZQDAAEcSPRebBhaa/C63A8AAQwiDUyuDQz9JmyIiHJs6FpswFpsmLrcDwABDCINTg0MnAQABKwCKTAAhJZtPABabRS6DU8AAQLhgA8AATnM+AT0Xm20ug1MrwABAuD89F5uJLoNUHJuXLrgeAQABFpumLoNUwABDCgDAAEMTwABDCj0Xm8IWm7gutwPAAEMIg1Q1m9gAAAEAYAPAAEGGARab2C6DVMAAQwojHJvYg5vYwCLU/ycBAAErAMAAbF4rHJvlg5vYwCLU/7cGAwADgJv2wCLQDBab/y6JzsAATmQWnAsug23AAE5lAMAAQZcBYAOKQYNESZwZIhycMxacJxacHS63A8AAQwiDVINEJwEAASsAikwAISWcSgAWnD4ug1TAAEMKYAPAAE5zPgE9F5xoLoNUK8AAQwo/PReckBachi63A8AAQwiEmxacpS6Em8AAQwuDbT0XnSoWnSYugSzAAEMPgzQWnTcugzTAAEDIg2lJnUchHJ1WFp1LLotEwABAuScBAAErAMAAbGI+AUWdZwGdcJ1yAACB1GADwABsHwGTARydeYOdd8Ai1gCBOgEAARadhhadey6LRMAAQLmA4MAAbGoAwABshQGLnZDAItYAHJ2Og52QwCLWAIE/AQABlADAAGyIPgM9HJ2nFp2dLotEwABAuYCcAgACg52owCLWABydrS64HgEAARydxhadvC6LRMAAQLkpAQABg53HwCLWAADAAGy4AMAAQxMAwABsy06d3p3oAACDU2ADikEBHJ4EHJ4AFp32LotEwABAuSkBAAGDngHAItYAAMAAbLi3BQMAA4CeE8Ai0AwWnhwuic7AAE5kFp4oLoNtwABOZQDAAEGWSZ46IRyeSISePsAi1qInAQABKwCKTD4BPRyethaepRaemy63A8AAQwiDVYNFNgEAAYSeusAi1qIAwABsRz8/PRye8Bae4y6EmMAAQLuBsQEAATSe+AOe+KIEAAAAAgICnwAAAACBiGADwABsGACfDgAAAI3JYAPAAEAuAABgAcAAbFwBPgVOnyufMgAAhERgA8AAQC4BHJ9AFp80LpqWwABMRikBAAGDn0HAItdUAMAAQphJn04cn1mFn1LAItd7JwEAASsAwABsXkqfYgA/SZ9wIRaffIWfdcAi13uDvcAAQEpKn4YAPz0coBMurGADAAMcoDpqoB5dA7LnAWEDAWADwABsGGADss/AAGIajW8BAAGDoEjAItdUALLrFqBlhKBZwCLXYonOwABANGqgcWADwABsHwMAwABMSkmgghagkoSghsAi12KFAMAAQDo+AT0coKcurGADAAMcoNxqoL9dA7LnAWEDAWADwABsGGADss/AAGHIjW8BAAEkoQADFqDyLoGIwABBrCeA94Og+sAi11QAsusWoRaFoQ/AItd7ic7AAEA0aqEuYAPAAGwfAwDAAExKPgE9HKFQLqxgAwADHKGaaqFoXQOy5wFhAwFgA8AAbBhgA7LPwABhZI1vAQABJKG+AxahsC6BiMAAQawngPeDobjAItdUALLrFqHUhaHNwCLXe4nOwABANGqh7GADwABsHwMAwABMSgDAAEKCPRyiEhaiDC6aacAATEW3bwEAATSiJQOiJaRKAAAAAgICoi0AAACBiGADwABsGACiOwAAAILmYAPAAEAuAABgAcAAbFwBPgROolOiWgAAhERgA8AAQC4BHKJoFqJcLpqWwABMRikBAAGDomnAItk3AMAAQphJonYiHKKBhaJ6wCLZXicBAAErAMAAbF4BISIiIhain4WimMAi2V6J98AAQDsAIRaisoWiq8Ai2V6E1sAAQDwAIRaixYWivsAi2V6EwcAAQDgBIiIWouWFot7AItler+7AAEBHABai/4Wi+MAi2V6DvcAAQEoAFqMShKMLwCLZRYO9wABASj4BSqMnAD89HKM9LqxgAwADHKNkaqNIXQOy5wFhAwFgA8AAbBhgA7LPwABiGo1vAQABg6NywCLZNwCy6xajioSjg8Ai2UWJzsAAQDRqo5ZgA8AAbB8DAMAATEo9HKPhLqxgAwADHKQIaqPsXQOy5wFhAwFgA8AAbBhgA7LPwABifo1vAQABg6QWwCLZNwCy6xakLoWkJ8Ai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wABDjQAAALgoYAPAAGxbAWoAYAHAAGxcAmADwABsWwE+DUAhHMAAQ7KCwABDp8Ai78AnAQABKwDAAGxewABDp8AAQ7kATsAAQ9DAAEPaAACBFmADgXUBFsAAQ+oWwABD44DAAEPcwCLvmqv5wABGZYEWwABdak7AAEQJwABEGQAAhTVgA5q6ARbAAERFFsAARDEWwABEKoDAAEQjwCLvmqv5wABGZa7kwABdca7pwABbg07AAERuwABEeQAAuCldA8AAbBkBYAODrAEcwABEjYPAAESDwCLwBoLqAgABFsAARKEugSzAAEMPAYLogsAARK/AIu/AgYdOwABEzcAARN0AALgqXQPAAGwZAWADg6wBHMAARPGDwABE58Ai8AaC5wIAARbAAEUELoEswABDDwGC6ILAAEUSwCLvwIGFTsAARTDAAEVAAAC4K10DwABsGQFgA4OsARzAAEVUg8AARUrAIvAGgusCAAEWwABFZy6BLMAAQw8BguiCwABFdcAi78CBiE7AAEWOwABFmwAAiuBgA4OsAR7AAEWsgZICAAIcwABF0IPAAEXGwCLwBoLqAQABFsAAReQugSzAAEMPAIGHGsAARerAAE/uAE7AAEYGwABGJAAAuCxgA8AAbFsBHMAARi4utw4DAAMWwABGSS6BLMAAQw+DwABGTsAi8AYWwABGYIDAAEZZwCLvmolLwABGkgDAAEDsTsAARnjAAEaAAACsFWADwABsWwEqTsAAR/3AAEgNAAC4LV0DwABsXwJgA4kfXQPAAGwZAWADg6wBMsAASA9gA4kfXQPAAGwZAWADg6wAPgJOwABILQAAADxdA8AAbEoBYAODrAEWwABILR4AwABsLwEBXQPAAGwgAWADg6wBhcAASC3AIvBzAD3AAGxLRQAAARzAAEgtFADAIvIqDAA+AAAAAMAAbE0APgJOwABIIwAAAIREYAODrAEWwABIORQAwCLyKgwAQMAAbE8+AT0cwABIZzXAAEhCAAABAF0DwABsXwJgA4kfXQPAAGwZAWADg6wBFMAASELAIvHvCwA1wABIWQAAAQBgA4kfARbAAEhZFMAASFLAIvKEDQCBiIOwNcAASFEAAAEAXQPAAGwZAWADg6wBHMAASFEUwABIQsAi8q0OACkBAAEUwABIWcAi8tgPAADAAGxhIxzAAEhfFMAASFHAIvL6EAAnAQABKwDAAGxiNcAASGMAAAEAXQPAAGwZAWADg6wBMcAASGNgA4OsADXAAEhRAAABAFwBHMAASFEUwABIQsAi8q0OAICcAgACFMAASFnAIvLYDwAUwABIY8Ai804RAADAAGxjFMAASGPAIvNOEQAUwABIUcAi8voQAAFdA8AAbBkBYAODrDYBAAEUwABIa8Ai8oQNAADAAGxHPgJOwABIoAAAADxdA8AAbEoBYAOJHwEWwABIoB4AwABsLwEBXQPAAGwgAWADiR8BFsAASKAUwABIkMAi8e8LAICfwABsZQA9wABsS0UAAAEcwABIoBQAwCLz4AwAPgAAAADAAGxNAD4CTsAASIgAAACBiGADiR8BFsAASKYUAMAi8+AMAEDAAGxPPgpOwABIu8AASMMAAIMSXQPAAGwZAWADg6wBHMAASNQUwABIxcAi8e8LACkBAAEUwABI1cAi9EcNAADAAGxhQBbAAEjxFMAASOnAIvRqDgAiwABsIsAASOnAAEj7AE7AAEkTwABJHwAAuC5dA8AAbBkBYAOJVQExwABJIWADiVUATsAASZ7AAEmoAAC4L2ADg6wBFsAASbIUwABJqsAi9GoOAIFpwABslE7AAEnIwABJ1gAAuDBgA4lVASOCwABJ4sAi78AWwABJ+RTAAEnvwCL06RAAhMmDwBbAAEoQFMAASgbAIvTpEACEyIO/AWADiVU9FcAASiLAIvURERzAAEqmHsAASj+WPwEAARzAAEpmg8AASlzAIvAGguACAAIWwABKey6BLMAAQw8WwABKihTAAEqAwCL06RAAgzODtACBgACDZwEAARTAAEq1wCL1EREAAJZHRcAASssBwABK1MAAStYAAIHUYAPAAGwfAZQBHMAASt0UwABK28Ai9cMSAIE6AQABFsAASucUwABK38Ai9GoOAIDgwABsagDAAGyFARXAAErxwCL1wxIcwABK7xTAAErxwCL1wxIAgT8BAAGUAMAAbIg+B07AAEsFwABLDwAAgqhgA4OsARzAAEsYFMAASxHAIvRqDgApAQABFMAASxnAIvXDEgAAwABsuE7AAEsuwABLPAAAuDFgA4lVASOCwABLSsAi78AWwABLYRTAAEtXwCL2MRMAhMmDwBbAAEt4FMAAS27AIvYxEwCEyIO/AWADiVVOwABLmcAAS6YAAIPNYAOWOAEewABLtZY/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AAEDwABFTcAARYQAAAACAgLAAEVmAAAAhy1gA8AAW/wAwABFeAAAALjPYAOJVQAAYAPAAFFWAAAAI06TACNO4wAAAAECwABD/IDVwABF8cAARffAAEfrA7jdAAABYAOGKQABYAPAAEP3AQTAAEP+gNXAAEZgwABGdxivagBgA8AAbFsBKgEFwABEAoDVwABGfMAARnzAAEciAAAAA8AARqDAAEciAAAAAwICwABGsgAAAIC+YAOESwDAAEbIAAAAga1gA8AAQ84AAcAARt8AAACEwWADwABsWwFqwABG6GADwABsWxxgA8AAQ/wBPwEJAMAARviGOgMAAoDAAEb+wCNPV4HAAEcGwCNPZQGEwYLAAEcawCNPdgEGwABEAIDVwABHJ8AAR03AAEfpAAC4fgFqwABHKGADwABsVoC1AAABA8AAR1zAAEfpAAAAAgICwABHdQAAAIctYAPAAFv8AMAAR4cAAAC4z2ADiVUAAGADwABRVgE+AUrAAEeaARzAAEepgMAAR6HAI0/8uN4CAAIugcAAR9nAI1AMAMAAXDsAACNPxQAjUEwAAAABAsAARAOA1cAASC7AAEg0wABJwwO43wAAAWADiRQAAAEEwABEBYDVwABIccAASI4YsWQAYAPAAGxbASoBBcAARAmA1cAASJPAAEiTwABJDAAAAAPAAEiqwABJDAAAAAICAsAASMoAAACFFGADwABEhwDAAEjhAAAAhMdgA4TuAABgA8AARAMBPwEJAMAASPOJHgIAAoDAAEj5wCNQuoHAAEkDwCNQygABBsAARAeA1cAASRHAAEkdwABJwQABuOAAAAABA8AASTXAAEnBAAAAAgICwABJVQAAAJq2YAPAAEQDAMAASWcAAACxZGADwABsWwAAXAE+AT0XwABJkIDAAEmEwCNRK7FkgcAASajAI1E7wABEBQAAI1EBACNRbgAAAAECwABECoDVwABKEsAAShjAAEvEA7jhAAABYAOE3AABYAPAAEQeAgTAAEQMgNXAAEqKwABKkAmAvgBgA4QCAATAAEQNgNXAAEqowABKuQm44gBgA8AAQ84AAQXAAEQRgNXAAEq+wABKvsAASz8AAAADwABK3cAASz8AAAADAwPAAErqAAAEgL5gA4QCAMAASvcAAAS44mADwABDzgDAAEseAAAAhRRgA4jnAABgA8AARAoBPwMI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AFwBPgJJwABoOSEcwABoRhbAAGg9LoUUwABEVicBAAErAMAAbF4+Aj0XwABoVy6FFCbAAGhXARzAAGhrFsAAaGIuhRTAAERWg/gBAWADglIBgMAAaHzAI2q+AIkMYAOI58AARFY9NcAAaIYAAAEAYAOI5wEWwABohi6FFMAARFYjHMAAaIaBwABohsAjazMnAQABKwDAAGxeKxfAAGiQgcAAaIbAI2szhAAuglgBYAPAAERUP0nAAGipIRzAAGi4FsAAaK0unJzAAERXJwEAASsAwABsXj4CPRfAAGjJLpycJsAAaMkBHMAAaOEWwABo1i6cnMAARFeD+AEBYAOCUgGAwABo8sAjar4AhR5gA4UawABEVz01wABo/AAAAQBgA4UaARbAAGj8LpycwABEVyMcwABo/IHAAGj8wCNr4ycBAAErAMAAbF4rF8AAaQiBwABo/MAja+OEAC6CWAFgA8AARFQ/AAAjaLIAI2k5ACNpjQAjaocAI2wxAAAABALAAERggNXAAGnkwABp6sAAbcoDuMUAAAFgA8AAQ8QAAAIEwABEYoDVwABqdMAAanwYhRQAYAOI5wAEwABEY4DVwABqysAAas4YimAAYAOFGgABBcAARGuA1cAAatPAAGrTwABrPAAAAAPAAGrnwABrPAAAAAICAsAAau0AAASFFGADiOcAwABq/AAABIpgYAOFGgAAYAPAAERgAT4CPTXAAGsIAAABAGADiOcBFsAAawguhRTAAERiIxzAAGsIgsAAawjAI2zqJwEAASsAwABsXisXwABrEoLAAGsIwCNs6oQALoJYAWADwABEYD01wABrJQAAAQBgA4UaARbAAGslLopgwABEYyMcwABrJYLAAGslwCNtOScBAAErAMAAbF4rF8AAayuCwABrJcAjbTmEAC6CWAFgA8AARGADCAHAAERigADAI2zCCAHAAERjgQDAI2zQCQHAAGrTwABDzQAAAAAEBsAARGWA1cAAa0HAAGtnwABr8wAAuH4BasAAa0JgA8AAbFaAtQAAAQPAAGt2wABr8wAAAAICAsAAa48AAACHLWADwABb/ADAAGuhAAAAuM9gA4lVAABgA8AAUVYBPgFKwABrtAEcwABrw4DAAGu7wCNt5bj4AgACLoHAAGvjwCNt9QDAAFxfBsAARGmA1cAAa/jAAGwfwABsWAEAg74BasAA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YAPAAGwfAAvAAIG/AAAEsChgA8AAbFsBasAAgdJgA8AAbFscwACB5AAABK9ZYAPAAGxbAWrAAIH8YAPAAGxbHMAAghQAAACEy2ADhRoBagBgAcAAbFwCwACCMAAAAIGXYAOJVQFqAGABwABsXALAAIJBAAAAhNZgA8AAbFsBasAAgkpgA8AAbFscwACCXAAAAITBYAPAAGxbAWrAAIJlYAPAAGxbHMAAgncAAACGMmADwABsWwFqwACChmADwABsWxzAAIKYAAAAhNVgA8AAbFsBasAAgqVgA8AAbFscwACCtwAAALFaYAPAAGxbAWrAAILIYAPAAGxbHMAAgtoAAACE12ADwABsWwFqwACC4mADwABsWxzAAIL0AAAAhSFgA8AAbFsBasAAgwBgA8AAbFscYAPAAESHAT8GCAHAAESMgQDAI3xXCAHAAESJggDAI3xoCAHAAESLgwDAI3yECADAAESKHMAAgymFwACDJMAjfLcnAQABKwCJWQgAwABEjxTAAINMwCN9PgoACQDAAINliRIJAAGAwACDa8AjfEcIhMuEwACDisAjfKCBlzXAAIOpAAABAGADiVUBhcAAg6nAI3y3IxzAAIOpFMAAg6nAI34PDQAnAQABKwCJWWrAAIO3YAOJcoWxFMAAg6nAI34PDQABYAOJVYTWhsAAg9vAI3zOhMGHwACD+cAjfOqGMhTAAIQdwCN9BggAhNUUwACERcAjfSIJAITXFMAAhGbAI31aCwCFIRTAAISGwCN9dgwABcAARJWA1cAAhJbAAISWwACFowC5CgADwACEt8AAhaMAAAABAQHAAITDAAAAhMtgA4UaAABgA8AARIcBPwYIAMAARIkqCADAAESMkwgAwABEiioIAMAARI8qCADAAESLKQkAwACFjokTAQABgMAAhZfAI37JAAXAAESWgNXAAIWowACFqMAAhrMAhjMAA8AAhcjAAIazAAAAAQEBwACF1AAAAITLYAOFGgAAYAPAAESHAT8GCADAAESJKggAwABEjJMIAMAARIopCADAAESPKggAwABEiykJAMAAhp6JEwEAAYDAAIanwCN/PwAAAAAjf5AAAAAAAsAARJeA1cAAiXLAAIl4wACLIgO5CwAAAWADhS0AAAMEwABEmYDVwACJuMAAibwJr90AYAPAAFIqAATAAESagNXAAInawACJ3wmaaQBgA8AAUjsABMAARJuA1cAAilrAAIpuCa/cAGADwABsWwABBcAARJ2A1cAAinPAAIpzwACLIAAAAAPAAIqCwACLIAAAAAQDA8AAipcAAACFFGADiOcAwACKpgAABK/dYAPAAFIqAMAAirEAAASaaWADwABSOwABwACKxAAABK/cYAPAAGxbAWoAYAHAAGxcAmADwABElwE/BQgBwABEmYEAwCOAOwgBwABEmoIAwCOASwgBwABEm4MAwCOAXAwAQCEcwACK/4PAAIrqwCOAXCcBAAErAMAAbF7AAIrqwACLBgAJAMAAixGFOAEAAYDAAIsXwCOALQAAAAAjgN0AAAAAAsAARJ6A1cAAi13AAItjwACL9AO5DAAAAWADh+IAAAEEwABEoIDVwACLm8AAi6QJga0AYAOF5AABBcAARKKA1cAAi6nAAIupwACL8gAAAAPAAIu4wACL8gAAAAICAsAAi8sAAACEW2ADgs0AwACL2AAABIGtYAOF5AAAYAPAAESeAT8CCAHAAESggQDAI4FSCQDAAIvlh+wBAAGAwACL68AjgUQAAAAAI4GMAAAAAALAAESjgNXAAIxEwACMSsAAjygDuL8AAAFgA8AAQ8QAAAIEwABEpYDVwACMjsAAjJQYhFsAYAOCzQAEwABEpoDVwACMosAAjKgYgL4AYAOESwABBcAARK6A1cAAjK3AAIytwACM2QAAAAPAAIy/wACM2QAAAAICAsAAjMUAAASEW2ADgs0AwACM0gAABIC+YAOESwAAYAPAAESjAT8DCAHAAESlgADAI4INCAHAAESmgQDAI4IbCQHAAIytwABDzQAAAAAEBsAARKiA1cAAjN7AAI0EwACNjgAAuH4BasAAjN9gA8AAbFaAtQAAAQPAAI0TwACNjgAAAAICAsAAjSwAAACHLWADwABb/ADAAI0+AAAAuM9gA4lVAABgA8AAUVYBPgFKwACNUQEcwACNYIDAAI1YwCOCkbkNAgACLoHAAI1+wCOCoQDAAFyTBsAARKyA1cAAjZPAAI26wACN6wEAg74BasAAjZRgA8AAbFaAtQAAAQPAAI2/wACN6wAAAAAAAABgA8AAQ5cBSsAAjcIBasAAjdlgA8AAQ5fAAQsgBsAARKmA1cAAjfDAAI4BwACOVQAAg/sBasAAjfFgA8AAbFaAtQAAAQPAAI4OwACOVQAAAAEBAcAAjiAAAACD+l0DmHABWwAAXAE+Aj01wACOKQAAAQBgA4LNARbAAI4pLoRbwABEpSMcwACOKYHAAI4pwCODgycBAAErAMAAbF4rHMAAjjGBwACOKcAjg4OD+AEBWwGAwACOOMAjg2wAgt4BWz01wACOQAAAAQBgA4RLARbAAI5ALoC+wABEpiMcwACOQIHAAI5AwCOD2icBAAErAMAAbF4rHMAAjkiBwACOQMAjg9qD+AEBWwGAwACOT8Ajg2wAhIgBWwbAAESqgNXAAI5awACOa8AAjyYAAIQCAWrAAI5bYAPAAGxWgLUAAAEDwACOfMAAjyYAAAABAQHAAI6JAAAAg/pgA5itAABcAT4CScAAjpIhHMAAjp0WwACOli6EW8AARKUnAQABKwDAAGxePgE9F8AAjq4uhFsmwACOrgEcwACOvhbAAI63LoRbwABEpYP4AQFgA4JSAYDAAI7PwCOEZgCC3mADgs3AAESlP0nAAI7dIRzAAI7oFsAAjuEugL7AAESmJwEAASsAwABsXj4BPRfAAI75LoC+JsAAjvkBHMAAjwkWwACPAi6AvsAARKaD+AEBYAOCUgGAwACPGsAjhGYAhIhgA4RLwABEpj8AACOCWgAjguEAI4M1ACOELwAjhTsAAAAEAsAARK+A1cAAkJbAAJCcwACWCgO4ugAAAWADwABDxAAABATAAESxgNXAAJEjwACRKxiFFABgA4jnAATAAESygNXAAJF5wACRfRiKYABgA4UaAATAAESzgNXAAJHXwACR3BhFAGADhRoABMAARLSA1cAAkjvAAJJECbkKAGADwABsWwABBcAARLyA1cAAkknAAJJJwACTCQAAAAPAAJJawACTCQAAAAQDA8AAkmAAAASFFGADiOcAwACSbwAABIpgYAOFGgDAAJJ6AAAERWADhRoAAcAAkocAAAS5CmADwABsWwFqAGABwABsXAJgA8AARK8BPgM9NcAAkrsAAAEAYAOI5wEWwACSuy6FFMAARLEjHMAAkruEwACSu8AjhksnAQABKwDAAGxeKxfAAJLFhMAAkrvAI4ZLhAAuglgBYAPAAESvPTXAAJLYAAABAGADhRoBFsAAktguimDAAESyIxzAAJLYhMAAktjAI4aaJwEAASsAwABsXisXwACS3oTAAJLYwCOGmoQALoJYAWADwABErz01wACS8QAAAQBgA4UaARbAAJLxLkXAAESzIxzAAJLxhMAAkvHAI4bpJwEAASsAwABsXisXwACS+ITAAJLxwCOG6YQALoJYAWADwABErwYIAcAARLGAAMAjhf0IAcAARLKBAMAjhgsIAcAARLOCAMAjhhkIAcAARLSDAMAjhicMAEAhHMAAkqyDwACSosAjhicnAQABKwDAAGxewACSosAAkrMACQHAAJJJwABDzQAAAAAEBsAARLaA1cAAkw7AAJM0wACTvQAAuH4BasAAkw9gA8AAbFaAtQAAAQPAAJNDwACTvQAAAAICAsAAk1wAAACHLWADwABb/ADAAJNuAAAAuM9gA4lVAABgA8AAUVYBPgFKwACTgQEcwACTkIDAAJOIwCOH0bkOAgACLoHAAJOtwCOH4QDAAFxnBsAARLqA1cAAk8LAAJPpwACUGQEAg74BasAAk8NgA8AAbFaAtQAAAQPAAJPuwACUGQAAAAAAAABgA8AAQ5cBSsAAk/EBasAAlAhgA8AAQ5fAAQqoBsAARLeA1cAAlB7AAJQvwACUmQAAg/sBasAAlB9gA8AAbFaAtQAAAQPAAJQ8wACUmQAAAAEBAcAAlE4AAACD+l0DmHABWwAAXAE+Az01wACUVwAAAQBgA4jnARbAAJRXLoUUwABEsSMcwACUV4HAAJRXwCOIwycBAAErAMAAbF4rHMAAlGGBwACUV8AjiMOD+AEBWwGAwACUaMAjiKwAiQwBWz01wACUcAAAAQBgA4UaARbAAJRwLopgwABEsiMcwACUcIHAAJRwwCOJGicBAAErAMAAbF4rHMAAlHaBwACUcMAjiRqD+AEBWwGAwACUfcAjiKwAhR4BWz01wACUhQAAAQBgA4UaARbAAJSFLkXAAESzIxzAAJSFgcAAlIXAI4lxJwEAASsAwABsXiscwACUjIHAAJSFwCOJcYP4AQFbAYDAAJSTwCOIrACFHgFbBsAARLiA1cAAlJ7AAJSvwACWCAAAhAIBasAAlJ9gA8AAbFaAtQAAAQPAAJTAwACWCAAAAAEBAcAAlM0AAACD+mADmK0AAFwBPgNJwACU1iEcwACU4xbAAJTaLoUUwABEsScBAAErAMAAbF4+Aj0XwACU9C6FFCbAAJT0ARzAAJUIFsAAlP8uhRTAAESxg/gBAWADglIBgMAAlRnAI4n8AIkMYAOI58AARLE9NcAAlSMAAAEAYAOI5wEWwACVIy6FFMAARLEjHMAAlSOBwACVI8AjinEnAQABKwDAAGxeKxfAAJUtgcAAlSPAI4pxhAAuglgBYAPAAESvP0nAAJVGIRzAAJVPFsAAlUouimDAAESyJwEAASsAwABsXj4CPRfAAJVgLopgJsAAlWABHMAAlWwWwACVZy6KYMAARLKD+AEBYAOCUgGAwACVfcAjifwAhR5gA4UawABEsj01wACVhwAAAQBgA4UaARbAAJWHLopgwABEsiMcwACVh4HAAJWHwCOLIScBAAErAMAAbF4rF8AAlY2BwACVh8AjiyGEAC6CWAFgA8AARK8/ScAAlaYhHMAAlbAWwACVqi5FwABEsycBAAErAMAAbF4+Aj0XwACVwS5FJsAAlcEBHMAAlc8WwACVyS5FwABEs4P4AQFgA4JSAYDAAJXgwCOJ/ACFHmADhRrAAESzPTXAAJXqAAABAGADhRoBFsAAleouRcAARLMjHMAAleqBwACV6sAji84nAQABKwDAAGxeKxfAAJXxgcAAlerAI4vOhAAuglgBYAPAAESvPwAAI4eaACOIIQAjiHUAI4nFACOMGwAAAAQCwABEvYDVwACXSsAAl1DAAJuGA7i7AAABYAPAAEPEAAADBMAARL+A1cAAl8LAAJfGGIpgAGADhRoABMAARMCA1cAAmCDAAJglGEUAYAOFGgAEwABEwYDVwACYhMAAmI0JuQoAYAPAAGxbAAEFwABEyYDVwACYksAAmJLAAJkeAAAAA8AAmJvAAJkeAAAAAwICwACYoQAABIpgYAOFGgDAAJisAAAERWADhRoAAcAAmLkAAAS5CmADwABsWwFqAGABwABsXAJgA8AARL0BPgI9NcAAmO0AAAEAYAOFGgEWwACY7S6KYMAARL8jHMAAmO2DwACY7cAjjQUnAQABKwDAAGxeKxfAAJjzg8AAmO3AI40FhAAuglgBYAPAAES9PTXAAJkGAAABAGADhRoBFsAAmQYuRcAARMAjHMAAmQaDwACZBsAjjVQnAQABKwDAAGxeKxfAAJkNg8AAmQbAI41UhAAuglgBYAPAAES9BQgBwABEv4AAwCOMxQgBwABEwIEAwCOM0wgBwABEwYIAwCOM4QwAQCEcwACY3oLAAJjUwCOM4ScBAAErAMAAbF7AAJjUwACY5QAJAcAAmJLAAEPNAAAAAAQGwABEw4DVwACZI8AAmUnAAJnKAAC4fgFqwACZJGADwABsVoC1AAABA8AAmVjAAJnKAAAAAgICwACZcQAAAIctYAPAAFv8AMAAmYMAAAC4z2ADiVUAAGADwABRVgE+AUrAAJmWARzAAJmlgMAAmZ3AI44wuQ8CAAIugcAAmbrAI45AAMAAXGgGwABEx4DVwACZz8AAmfbAAJoeAQCDvgFqwACZ0GADwABsVoC1AAABA8AAmfvAAJoeAAAAAAAAAGADwABDlwFKwACZ/gFqwACaFWADwABDl8ABCsAGwABExIDVwACaI8AAmjTAAJqFAACD+wFqwACaJGADwABsVoC1AAABA8AAmkHAAJqFAAAAAQEBwACaUwAAAIP6XQOYcAFbAABcAT4CPTXAAJpcAAABAGADhRoBFsAAmlwuimDAAES/IxzAAJpcgcAAmlzAI48iJwEAASsAwABsXiscwACaYoHAAJpcwCOPIoP4AQFbAYDAAJppwCOPCwCFHgFbPTXAAJpxAAABAGADhRoBFsAAmnEuRcAARMAjHMAAmnGBwACaccAjj3knAQABKwDAAGxeKxzAAJp4gcAAmnHAI495g/gBAVsBgMAAmn/AI48LAIUeAVsGwABExYDVwACaisAAmpvAAJuEAACEAgFqwACai2ADwABsVoC1AAABA8AAmqzAAJuEAAAAAQEBwACauQAAAIP6YAOYrQAAXAE+AknAAJrCIRzAAJrLFsAAmsYuimDAAES/JwEAASsAwABsXj4CPRfAAJrcLopgJsAAmtwBHMAAmugWwACa4y6KYMAARL+D+AEBYAOCUgGAwACa+cAjkAQAhR5gA4UawABEvz01wACbAwAAAQBgA4UaARbAAJsDLopgwABEvyMcwACbA4HAAJsDwCOQeScBAAErAMAAbF4rF8AAmwmBwACbA8AjkHmEAC6CWAFgA8AARL0/ScAAmyIhHMAAmywWwACbJi5FwABEwCcBAAErAMAAbF4+Aj0XwACbPS5FJsAAmz0BHMAAm0sWwACbRS5FwABEwIP4AQFgA4JSAYDAAJtcwCOQBACFHmADhRrAAETAPTXAAJtmAAABAGADhRoBFsAAm2YuRcAARMAjHMAAm2aBwACbZsAjkSYnAQABKwDAAGxeKxfAAJttgcAAm2bAI5EmhAAuglgBYAPAAES9PwAAI435ACOOgAAjjtQAI4/NACORcwAAAAQCwABEyoDVwACe1MAAntrAAKhpA7itAAABYAPAAEPEAAANBMAARMyA1cAAn1XAAJ9eCYRHAGADg4AABMAARM2A1cAAn9HAAJ/mCbkQAF0DwABsGQFgA4lVAATAAETOgNXAAKAtwACgNRiFSQBgA4UaAATAAETPgNXAAKCLwACglwm5EQBgA4kfAATAAETQgNXAAKDXwACg3QmWVQBgA4OsAATAAETRgNXAAKEywAChPAm5EgBgA4kfAATAAETSgNXAAKF/wAChghiNMQBgA4UaAATAAETTgNXAAKHDwAChyQmC5gBgA4OsAATAAETUgNXAAKJJwACiWQm5EwBgA8AAbFsABMAARNWA1cAAorjAAKLBCbkKAGADwABsWwAEwABE1oDVwACi/sAAowgJrXwAYAPAAGwfAATAAETXgNXAAKNHwACjUwm5FABgA8AAbB8ABMAARNiA1cAAo5HAAKOcCYfdAGADwABsHwABBcAAROCA1cAAo6HAAKOhwACl2wAAAAPAAKO1wACl2wAAAA0ICMAAo8IAAASER2ADg4AAwACj2AAABLkQXQPAAGwZAWADiVUAwACj+gAABIVJYAOFGgDAAKQPAAAEuRFgA4kfAMAApCgAAASWVWADg6wAwACkOwAABLkSYAOJHwDAAKRSAAAEjTFgA4UaAMAApGIAAASC5mADg6wABcAApHYAAAS5E2ADwABsWwFqAGABwABsXALAAKSTAAAEuQpgA8AAbFsBagBgAcAAbFwCwACkqQAABK18YAPAAGwfAWoAYAHAAGxcAsAApMAAAAS5FGADwABsHwFqAGABwABsXALAAKTZAAAEh91gA8AAbB8BagBgAcAAbFwCYAPAAETKAT4CPTXAAKWoAAABAGADhRoBFsAApaguhUnAAETOIxzAAKWoFMAApajAI5QdDQAnAQABKwDAAGxeKxfAAKWyFMAApajAI5QdDQCEAC6CWAFgA8AARMo9NcAApcUAAAEAYAOFGgEWwAClxS6NMcAARNIjHMAApcUUwAClxcAjlHANACcBAAErAMAAbF4rF8AApcoUwAClxcAjlHANAIQALoJYAWADwABEyhMIAcAARMyAAMAjkx0IAcAARM2BAMAjkysIAcAARM6CAMAjk0AIAcAARM+DAMAjk04IAcAARNCEAMAjk1wIAcAARNGFAMAjk2oIAcAARNKGAMAjk3gIAcAARNOHAMAjk4YIAcAARNQUAMAjk5UIAAgBwABE1RQAwCOTrgkACAHAAETWFADAI5PHCgAIAcAARNcUAMAjk+ALAAgBwABE2BQAwCOT+QwADABAIRzAAKUHFMAApPbAI5OVCAAnAQABKwDAAGxewACk9sAApQ4ADABAIRzAAKUqFMAApSDAI5OuCQAnAQABKwDAAGxewAClIMAApTEADABAIRzAAKVOFMAApUPAI5PHCgAnAQABKwDAAGwywAClQ8AApVUADABAIRzAAKV0FMAApWfAI5PgCwAnAQABKwDAAGwywAClZ8AApXsADABAIRzAAKWZFMAApY3AI5P5DAAnAQABKwDAAGwywACljcAApaAACQHAAKOhwABDzQAAAAAEBsAARNqA1cAApeDAAKYGwACmkgAAuH4BasAApeFgA8AAbFaAtQAAAQPAAKYVwACmkgAAAAICAsAApi4AAACHLWADwABb/ADAAKZAAAAAuM9gA4lVAABgA8AAUVYBPgFKwACmUwEcwACmYoDAAKZawCOWcbkVAgACLoHAAKaCwCOWgQDAAFw1BsAARN6A1cAAppfAAKa+wACm9wEAg74BasAApphgA8AAbFaAtQAAAQPAAKbDwACm9wAAAAAAAABgA8AAQ5cBSsAApswBasAApuNgA8AAQ5fAAQlwBsAARNuA1cAApvzAAKcNwACnYAAAg/sBasAApv1gA8AAbFaAtQAAAQPAAKcawACnYAAAAAEBAcAApywAAACD+l0DmHABWwAAXAE+Aj01wACnNQAAAQBgA4UaARbAAKc1LoVJwABEziMcwACnNYHAAKc1wCOXYycBAAErAMAAbF4rHMAApz+BwACnNcAjl2OD+AEBWwGAwACnRsAjl0wAhR4BWz01wACnTgAAAQBgA4UaARbAAKdOLo0xwABE0iMcwACnToHAAKdOwCOXuicBAAErAMAAbF4rHMAAp1OBwACnTsAjl7qD+AEBWwGAwACnWsAjl0wAhR4BWwbAAETcgNXAAKdlwACndsAAqGcAAIQCAWrAAKdmYAPAAGxWgLUAAAEDwACnh8AAqGcAAAABAQHAAKeUAAAAg/pgA5itAABcAT4CScAAp50hHMAAp6oWwACnoS6FScAARM4nAQABKwDAAGxePgI9F8AAp7suhUkmwACnuwEcwACnzxbAAKfGLoVJwABEzoP4AQFgA4JSAYDAAKfgwCOYRgCFHmADhRrAAETOPTXAAKfqAAABAGADhRoBFsAAp+ouhUnAAETOIxzAAKfqgcAAp+rAI5i7JwEAASsAwABsXisXwACn9IHAAKfqwCOYu4QALoJYAWADwABEyj9JwACoDSEcwACoFRbAAKgRLo0xwABE0icBAAErAMAAbF4+Aj0XwACoJi6NMSbAAKgmARzAAKgwFsAAqCwujTHAAETSg/gBAWADglIBgMAAqEHAI5hGAIUeYAOFGsAARNI9NcAAqEsAAAEAYAOFGgEWwACoSy6NMcAARNIjHMAAqEuBwACoS8AjmWsnAQABKwDAAGxeKxfAAKhQgcAAqEvAI5lrhAAuglgBYAPAAETKPwAAI5Y6ACOWwQAjlxUAI5gPACOZuQAAAAQCwABE4YDVwACptsAAqbzAALFnA7ivAAABYAPAAEPEAAAJBMAAROOA1cAAqjHAAKo5GIVJAGADhRoABMAAROSA1cAAqo/AAKqbCbkRAGADiR8ABMAAROWA1cAAqvDAAKr6CbkSAGADiR8ABMAAROaA1cAAqz3AAKtAGI0xAGADhRoABMAAROeA1cAAq5/AAKuoCbkKAGADwABsWwAEwABE6IDVwACsKMAArDgJuRMAYAPAAGxbAATAAETpgNXAAKx1wACsfwmtfABgA8AAbB8ABMAAROqA1cAArL7AAKzKCbkUAGADwABsHwAEwABE64DVwACtCMAArRMJh90AYAPAAGwfAAEFwABE84DVwACtGMAArRjAAK7hAAAAA8AArSvAAK7hAAAACQQEwACtOAAABIVJYAOFGgDAAK1HAAAEuRFgA4kfAMAArVoAAAS5EmADiR8AwACtawAABI0xYAOFGgAFwACtfAAABLkKYAPAAGxbAWoAYAHAAGxcAsAArZIAAAS5E2ADwABsWwFqAGABwABsXALAAK2vAAAErXxgA8AAbB8BagBgAcAAbFwCwACtxgAABLkUYAPAAGwfAWoAYAHAAGxcAsAArd8AAASH3WADwABsHwFqAGABwABsXAJgA8AAROEBPgI9NcAArq4AAAEAYAOFGgEWwACuri6FScAAROMjHMAArq4UwACursAjm70JACcBAAErAMAAbF4rF8AArrgUwACursAjm70JAIQALoJYAWADwABE4T01wACuywAAAQBgA4UaARbAAK7LLo0xwABE5iMcwACuyxTAAK7LwCOcEAkAJwEAASsAwABsXisXwACu0BTAAK7LwCOcEAkAhAAuglgBYAPAAEThDwgBwABE44AAwCOa/AgBwABE5IEAwCObCggBwABE5YIAwCObGAgBwABE5oMAwCObJggBwABE54QAwCObNQgBwABE6IUAwCObTggBwABE6YYAwCObZwgBwABE6ocAwCObgAgBwABE6xQAwCObmQgADABAIRzAAK4GhMAArfzAI5s1JwEAASsAwABsXsAArfzAAK4NAAwAQCEcwACuMIXAAK4fwCObTicBAAErAMAAbF7AAK4fwACuNwAMAEAhHMAArlSGwACuScAjm2cnAQABKwDAAGwywACuScAArlsADABAIRzAAK56h8AArm3AI5uAJwEAASsAwABsMsAArm3AAK6BAAwAQCEcwACunxTAAK6TwCObmQgAJwEAASsAwABsMsAArpPAAK6mAAkBwACtGMAAQ80AAAAABAbAAETtgNXAAK7mwACvDMAAr5cAALh+AWrAAK7nYAPAAGxWgLUAAAEDwACvG8AAr5cAAAACAgLAAK80AAAAhy1gA8AAW/wAwACvRgAAALjPYAOJVQAAYAPAAFFWAT4BSsAAr1kBHMAAr2iAwACvYMAjndG5FgIAAi6BwACvh8AjneEAwABcZgbAAETxgNXAAK+cwACvw8AAr/UBAIO+AWrAAK+dYAPAAGxWgLUAAAEDwACvyMAAr/UAAAAAAAAAYAPAAEOXAUrAAK/LAWrAAK/iYAPAAEOXwAEJoAbAAETugNXAAK/6wACwC8AAsF4AAIP7AWrAAK/7YAPAAGxWgLUAAAEDwACwGMAAsF4AAAABAQHAALAqAAAAg/pdA5hwAVsAAFwBPgI9NcAAsDMAAAEAYAOFGgEWwACwMy6FScAAROMjHMAAsDOBwACwM8AjnsMnAQABKwDAAGxeKxzAALA9gcAAsDPAI57Dg/gBAVsBgMAAsETAI56sAIUeAVs9NcAAsEwAAAEAYAOFGgEWwACwTC6NMcAAROYjHMAAsEyBwACwTMAjnxonAQABKwDAAGxeKxzAALBRgcAAsEzAI58ag/gBAVsBgMAAsFjAI56sAIUeAVsGwABE74DVwACwY8AAsHTAALFlAACEAgFqwACwZGADwABsVoC1AAABA8AAsIXAALFlAAAAAQEBwACwkgAAAIP6YAOYrQAAXAE+AknAALCbIRzAALCoFsAAsJ8uhUnAAETjJwEAASsAwABsXj4CPRfAALC5LoVJJsAAsLkBHMAAsM0WwACwxC6FScAAROOD+AEBYAOCUgGAwACw3sAjn6YAhR5gA4UawABE4z01wACw6AAAAQBgA4UaARbAALDoLoVJwABE4yMcwACw6IHAALDowCOgGycBAAErAMAAbF4rF8AAsPKBwACw6MAjoBuEAC6CWAFgA8AAROE/ScAAsQshHMAAsRMWwACxDy6NMcAAROYnAQABKwDAAGxePgI9F8AAsSQujTEmwACxJAEcwACxLhbAALEqLo0xwABE5oP4AQFgA4JSAYDAALE/wCOfpgCFHmADhRrAAETmPTXAALFJAAABAGADhRoBFsAAsUkujTHAAETmIxzAALFJgcAAsUnAI6DLJwEAASsAwABsXisXwACxToHAALFJwCOgy4QALoJYAWADwABE4T8AACOdmgAjniEAI551ACOfbwAjoRkAAAAEAsAARPSA1cAAslrAALJgwAC4AwO4yAAAAWADwABDxAAAAwTAAET2gNXAALNowACzcBiFFABgA4jnAATAAET3gNXAALPFwACzyRiKYABgA4jnAATAAET4gNXAALRLwAC0UBhFAGADiOcAAgXAAEUAgNXAALRVwAC0VcAAtOIAAAADwAC0Z8AAtOIAAAADAwPAALRtAAAEhRRgA4jnAMAAtHwAAASKYGADiOcAwAC0hwAABEVgA4jnAABgA8AARPQBPgM9NcAAtJQAAAEAYAOI5wEWwAC0lC6FFMAARPYjHMAAtJSDwAC0lMAjofYnAQABKwDAAGxeKxfAALSeg8AAtJTAI6H2hAAuglgBYAPAAET0PTXAALSxAAABAGADiOcBFsAAtLEuimDAAET3IxzAALSxg8AAtLHAI6JFJwEAASsAwABsXisXwAC0t4PAALSxwCOiRYQALoJYAWADwABE9D01wAC0ygAAAQBgA4jnARbAALTKLkXAAET4IxzAALTKg8AAtMrAI6KUJwEAASsAwABsXisXwAC00YPAALTKwCOilIQALoJYAWADwABE9AQIAcAARPaAAMAjocEIAcAARPeBAMAjoc8IAcAARPiCAMAjod0JAcAAtFXA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BMAARUOA1cAA0tbAANLcGILmAGADg6wABMAARUSA1cAA0xnAANMeGIMoAGADhRoABMAARUWA1cAA01vAANNgGIE+AGADhRoAAQXAAEVNgNXAANNlwADTZcAA09AAAAADwADTcsAA09AAAAADAwPAANN4AAAEguZgA4OsAMAA04UAAASDKGADhRoAwADTkQAABIE+YAOFGgAAYAPAAEVBAT4CPTXAANOeAAABAGADhRoBFsAA054ugyjAAEVEIxzAANOeg8AA057AI8NUJwEAASsAwABsXisXwADTpYPAANOewCPDVIQALoJYAWADwABFQT01wADTuAAAAQBgA4UaARbAANO4LoE+wABFRSMcwADTuIPAANO4wCPDoycBAAErAMAAbF4rF8AA07+DwADTuMAjw6OEAC6CWAFgA8AARUEECAHAAEVDgADAI8MeCAHAAEVEgQDAI8MsCAHAAEVFggDAI8M6CQHAANNlwABDzQAAAAAEBsAARUeA1cAA09XAANP7wADUgAAAuH4BasAA09ZgA8AAbFaAtQAAAQPAANQKwADUgAAAAAICAsAA1CMAAACHLWADwABb/ADAANQ1AAAAuM9gA4lVAABgA8AAUVYBPgFKwADUSAEcwADUV4DAANRPwCPEW7keAgACLoHAANRwwCPEawDAAFxrBsAARUuA1cAA1IXAANSswADU2AEAg74BasAA1IZgA8AAbFaAtQAAAQPAANSxwADU2AAAAAAAAABgA8AAQ5cBSsAA1LQBasAA1MtgA8AAQ5fAAQwoBsAARUiA1cAA1N3AANTuwADVQAAAg/sBasAA1N5gA8AAbFaAtQAAAQPAANT7wADVQAAAAAEBAcAA1Q0AAACD+l0DmHABWwAAXAE+Aj01wADVFgAAAQBgA4UaARbAANUWLoMowABFRCMcwADVFoHAANUWwCPFTScBAAErAMAAbF4rHMAA1R2BwADVFsAjxU2D+AEBWwGAwADVJMAjxTYAhR4BWz01wADVLAAAAQBgA4UaARbAANUsLoE+wABFRSMcwADVLIHAANUswCPFpCcBAAErAMAAbF4rHMAA1TOBwADVLMAjxaSD+AEBWwGAwADVOsAjxTYAhR4BWwbAAEVJgNXAANVFwADVVsAA1kMAAIQCAWrAANVGYAPAAGxWgLUAAAEDwADVZ8AA1kMAAAABAQHAANV0AAAAg/pgA5itAABcAT4CScAA1X0hHMAA1YcWwADVgS6DKMAARUQnAQABKwDAAGxePgI9F8AA1ZgugygmwADVmAEcwADVphbAANWgLoMowABFRIP4AQFgA4JSAYDAANW3wCPGMACFHmADhRrAAEVEPTXAANXBAAABAGADhRoBFsAA1cEugyjAAEVEIxzAANXBgcAA1cHAI8alJwEAASsAwABsXisXwADVyIHAANXBwCPGpYQALoJYAWADwABFQT9JwADV4SEcwADV6xbAANXlLoE+wABFRScBAAErAMAAbF4+Aj0XwADV/C6BPibAANX8ARzAANYKFsAA1gQugT7AAEVFg/gBAWADglIBgMAA1hvAI8YwAIUeYAOFGsAARUU9NcAA1iUAAAEAYAOFGgEWwADWJS6BPsAARUUjHMAA1iWBwADWJcAjx1UnAQABKwDAAGxeKxfAANYsgcAA1iXAI8dVhAAuglgBYAPAAEVBPwAAI8QkACPEqwAjxP8AI8X5ACPHowAAAAQCwABFToDVwADYdcAA2HvAAN7JA7i0AAABYAPAAEPEAAAGBMAARVCA1cAA2PPAANj8CYRHAGADg4AABMAARVGA1cAA2W/AANmECbkQAF0DwABsGQFgA4lVAATAAEVSgNXAANnAwADZyBiFSQBgA4UaAATAAEVTgNXAANnqwADZ8BiC5gBgA4OsAATAAEVUgNXAANotwADaMhiDKABgA4UaAATAAEVVgNXAANpvwADadBiBPgBgA4UaAAEFwABFXYDVwADaecAA2nnAANvDAAAAA8AA2orAANvDAAAABgYGwADakAAABIRHYAODgADAANqgAAAEuRBdA8AAbBkBYAOJVQDAANq8AAAEhUlgA4UaAMAA2tEAAASC5mADg6wAwADa3gAABIMoYAOFGgDAANrqAAAEgT5gA4UaAABgA8AARU4BPgM9NcAA23QAAAEAYAOFGgEWwADbdC6FScAARVIjHMAA23SGwADbdMAjyQInAQABKwDAAGxeKxfAANt+hsAA23TAI8kChAAuglgBYAPAAEVOPTXAANuRAAABAGADhRoBFsAA25EugyjAAEVUIxzAANuRhsAA25HAI8lRJwEAASsAwABsXisXwADbmIbAANuRwCPJUYQALoJYAWADwABFTj01wADbqwAAAQBgA4UaARbAANurLoE+wABFVSMcwADbq4bAANurwCPJoCcBAAErAMAAbF4rF8AA27KGwADbq8AjyaCEAC6CWAFgA8AARU4ICAHAAEVQgADAI8ibCAHAAEVRgQDAI8ipCAHAAEVSggDAI8i+CAHAAEVTgwDAI8jMCAHAAEVUhADAI8jaCAHAAEVVhQDAI8joDABAIhzAANsWgcAA2wDAI8ipJwEAASsAwABsYgEcwADbShbAANtDgcAA2y3AI8ipgODAAGxqJwEAARbAANtmFsAA21eAwADbTcAjyJuDY4OEgODAAGxqAMAAbDLAANsAwADbbAAJAcAA2nnAAEPNAAAAAAQGwABFV4DVwADbyMAA2+7AANx3AAC4fgFqwADbyWADwABsVoC1AAABA8AA2/3AANx3AAAAAgICwADcFgAAAIctYAPAAFv8AMAA3CgAAAC4z2ADiVUAAGADwABRVgE+AUrAANw7ARzAANxKgMAA3ELAI8rhuR8CAAIugcAA3GfAI8rxAMAAXGwGwABFW4DVwADcfMAA3KPAANzTAQCDvgFqwADcfWADwABsVoC1AAABA8AA3KjAANzTAAAAAAAAAGADwABDlwFKwADcqwFqwADcwmADwABDl8ABChgGwABFWIDVwADc2MAA3OnAAN1UAACD+wFqwADc2WADwABsVoC1AAABA8AA3PbAAN1UAAAAAQEBwADdCAAAAIP6XQOYcAFbAABcAT4DPTXAAN0RAAABAGADhRoBFsAA3REuhUnAAEVSIxzAAN0RgcAA3RHAI8vTJwEAASsAwABsXiscwADdG4HAAN0RwCPL04P4AQFbAYDAAN0iwCPLvACFHgFbPTXAAN0qAAABAGADhRoBFsAA3SougyjAAEVUIxzAAN0qgcAA3SrAI8wqJwEAASsAwABsXiscwADdMYHAAN0qwCPMKoP4AQFbAYDAAN04wCPLvACFHgFbPTXAAN1AAAABAGADhRoBFsAA3UAugT7AAEVVIxzAAN1AgcAA3UDAI8yBJwEAASsAwABsXiscwADdR4HAAN1AwCPMgYP4AQFbAYDAAN1OwCPLvACFHgFbBsAARVmA1cAA3VnAAN1qwADexwAAhAIBasAA3VpgA8AAbFaAtQAAAQPAAN17wADexwAAAAEBAcAA3YgAAACD+mADmK0AAFwBPgNJwADdkSEcwADdnhbAAN2VLoVJwABFUicBAAErAMAAbF4+Aj0XwADdry6FSSbAAN2vARzAAN3DFsAA3bouhUnAAEVSg/gBAWADglIBgMAA3dTAI80NAIUeYAOFGsAARVI9NcAA3d4AAAEAYAOFGgEWwADd3i6FScAARVIjHMAA3d6BwADd3sAjzYInAQABKwDAAGxeKxfAAN3ogcAA3d7AI82ChAAuglgBYAPAAEVOP0nAAN4BIRzAAN4LFsAA3gUugyjAAEVUJwEAASsAwABsXj4CPRfAAN4cLoMoJsAA3hwBHMAA3ioWwADeJC6DKMAARVSD+AEBYAOCUgGAwADeO8AjzQ0AhR5gA4UawABFVD01wADeRQAAAQBgA4UaARbAAN5FLoMowABFVCMcwADeRYHAAN5FwCPOMicBAAErAMAAbF4rF8AA3kyBwADeRcAjzjKEAC6CWAFgA8AARU4/ScAA3mUhHMAA3m8WwADeaS6BPsAARVUnAQABKwDAAGxePgI9F8AA3oAugT4mwADegAEcwADejhbAAN6ILoE+wABFVYP4AQFgA4JSAYDAAN6fwCPNDQCFHmADhRrAAEVVPTXAAN6pAAABAGADhRoBFsAA3qkugT7AAEVVIxzAAN6pgcAA3qnAI87iJwEAASsAwABsXisXwADesIHAAN6pwCPO4oQALoJYAWADwABFTj8AACPKqgAjyzEAI8uFACPM1gAjzzAAAAAEAsAARV6A1cAA4XTAAOF6wADo6wO4uQAAAWADwABDxAAACATAAEVggNXAAOH1wADh/RiFSQBgA4UaAATAAEVhgNXAAOI6wADiPxiDKABgA4UaAATAAEVigNXAAOJ8wADigRiBPgBgA4UaAATAAEVjgNXAAOK8wADixgmtfABgA8AAbB8ABMAARWSA1cAA4wHAAOMLCbkgAGADwABsHwAEwABFZYDVwADjR8AA41IJh90AYAPAAGwfAATAAEVmgNXAAOOxwADjugm5CgBgA8AAbFsABMAARWeA1cAA5DrAAORKCbkTAGADwABsWwABBcAARW+A1cAA5E/AAORPwADl6wAAAAPAAORdwADl6wAAAAgDA8AA5GMAAASFSWADhRoAwADkcgAABIMoYAOFGgDAAOR+AAAEgT5gA4UaAAXAAOSRAAAErXxgA8AAbB8BagBgAcAAbFwCwADkqAAABLkgYAPAAGwfAWoAYAHAAGxcAsAA5L8AAASH3WADwABsHwFqAGABwABsXALAAOTXAAAEuQpgA8AAbFsBagBgAcAAbFwCwADk7QAABLkTYAPAAGxbAWrAAOT/YAPAAGxbHGADwABFXgE+Az01wADlnAAAAQBgA4UaARbAAOWcLoVJwABFYCMcwADlnBTAAOWcwCPREQgAJwEAASsAwABsXisXwADlphTAAOWcwCPREQgAhAAuglgBYAPAAEVePTXAAOW5AAABAGADhRoBFsAA5bkugyjAAEVhIxzAAOW5FMAA5bnAI9FkCAAnAQABKwDAAGxeKxfAAOXAFMAA5bnAI9FkCACEAC6CWAFgA8AARV49NcAA5dMAAAEAYAOFGgEWwADl0y6BPsAARWIjHMAA5dMUwADl08Aj0bcIACcBAAErAMAAbF4rF8AA5doUwADl08Aj0bcIAIQALoJYAWADwABFXg0IAcAARWCAAMAj0FsIAcAARWGBAMAj0GkIAcAARWKCAMAj0HcIAcAARWODAMAj0IYIAcAARWSEAMAj0J8IAcAARWWFAMAj0LgIAcAARWaGAMAj0NEIAcAARWeHAMAj0OoMAEAhHMAA5SGDwADlFsAj0IYnAQABKwDAAGwywADlFsAA5SgADABAIRzAAOVFhMAA5TrAI9CfJwEAASsAwABsMsAA5TrAAOVMAAwAQCEcwADlaoXAAOVewCPQuCcBAAErAMAAbDLAAOVewADlcQAMAEAhHMAA5Y2GwADlg8Aj0NEnAQABKwDAAGxewADlg8AA5ZQACQHAAORPwABDzQAAAAAEBsAARWmA1cAA5fDAAOYWwADmnAAAuH4BasAA5fFgA8AAbFaAtQAAAQPAAOYlwADmnAAAAAICAsAA5j4AAACHLWADwABb/ADAAOZQAAAAuM9gA4lVAABgA8AAUVYBPgFKwADmYwEcwADmcoDAAOZqwCPTQ7khAgACLoHAAOaMwCPTUwDAAFxtBsAARW2A1cAA5qHAAObIwADm9QEAg74BasAA5qJgA8AAbFaAtQAAAQPAAObNwADm9QAAAAAAAABgA8AAQ5cBSsAA5tABasAA5udgA8AAQ5fAAQqQBsAARWqA1cAA5vrAAOcLwADndgAAg/sBasAA5vtgA8AAbFaAtQAAAQPAAOcYwADndgAAAAEBAcAA5yoAAACD+l0DmHABWwAAXAE+Az01wADnMwAAAQBgA4UaARbAAOczLoVJwABFYCMcwADnM4HAAOczwCPUNScBAAErAMAAbF4rHMAA5z2BwADnM8Aj1DWD+AEBWwGAwADnRMAj1B4AhR4BWz01wADnTAAAAQBgA4UaARbAAOdMLoMowABFYSMcwADnTIHAAOdMwCPUjCcBAAErAMAAbF4rHMAA51OBwADnTMAj1IyD+AEBWwGAwADnWsAj1B4AhR4BWz01wADnYgAAAQBgA4UaARbAAOdiLoE+wABFYiMcwADnYoHAAOdiwCPU4ycBAAErAMAAbF4rHMAA52mBwADnYsAj1OOD+AEBWwGAwADncMAj1B4AhR4BWwbAAEVrgNXAAOd7wADnjMAA6OkAAIQCAWrAAOd8YAPAAGxWgLUAAAEDwADnncAA6OkAAAABAQHAAOeqAAAAg/pgA5itAABcAT4DScAA57MhHMAA58AWwADnty6FScAARWAnAQABKwDAAGxePgI9F8AA59EuhUkmwADn0QEcwADn5RbAAOfcLoVJwABFYIP4AQFgA4JSAYDAAOf2wCPVbwCFHmADhRrAAEVgPTXAAOgAAAABAGADhRoBFsAA6AAuhUnAAEVgIxzAAOgAgcAA6ADAI9XkJwEAASsAwABsXisXwADoCoHAAOgAwCPV5IQALoJYAWADwABFXj9JwADoIyEcwADoLRbAAOgnLoMowABFYScBAAErAMAAbF4+Aj0XwADoPi6DKCbAAOg+ARzAAOhMFsAA6EYugyjAAEVhg/gBAWADglIBgMAA6F3AI9VvAIUeYAOFGsAARWE9NcAA6GcAAAEAYAOFGgEWwADoZy6DKMAARWEjHMAA6GeBwADoZ8Aj1pQnAQABKwDAAGxeKxfAAOhugcAA6GfAI9aUhAAuglgBYAPAAEVeP0nAAOiHIRzAAOiRFsAA6IsugT7AAEViJwEAASsAwABsXj4CPRfAAOiiLoE+JsAA6KIBHMAA6LAWwADoqi6BPsAARWKD+AEBYAOCUgGAwADowcAj1W8AhR5gA4UawABFYj01wADoywAAAQBgA4UaARbAAOjLLoE+wABFYiMcwADoy4HAAOjLwCPXRCcBAAErAMAAbF4rF8AA6NKBwADoy8Aj10SEAC6CWAFgA8AARV4/AAAj0wwAI9OTACPT5wAj1TgAI9eSAAAABALAAEVwgNXAAOsfwADrJcAA8T4DuLwAAAFgA8AAQ8QAAAgEwABFcoDVwADrdMAA63oYllUAYAODrAAEwABFc4DVwADrnMAA66IYguYAYAODrAAEwABFdIDVwADr38AA6+QYgygAYAOFGgAEwABFdYDVwADsIcAA7CYYgT4AYAOFGgAEwABFdoDVwADsYcAA7GsJrXwAYAPAAGwfAATAAEV3gNXAAOymwADssAm5IABgA8AAbB8ABMAARXiA1cAA7OzAAOz3CYfdAGADwABsHwAEwABFeYDVwADtVsAA7V8JuQoAYAPAAGxbAAEFwABFgYDVwADtZMAA7WTAAO69AAAAA8AA7XfAAO69AAAACAQEwADtfQAABJZVYAODrADAAO2KAAAEguZgA4OsAMAA7ZcAAASDKGADhRoAwADtowAABIE+YAOFGgAEwADttgAABK18YAPAAGwfAWoAYAHAAGxcAsAA7ccAAAS5IGADwABsHwFqAGABwABsXALAAO3YAAAEh91gA8AAbB8BagBgAcAAbFwCwADt6gAABLkKYAPAAGxbAWoAYAHAAGxcAmADwABFcAE+Aj01wADuiwAAAQBgA4UaARbAAO6LLoMowABFdCMcwADuixTAAO6LwCPZYwgAJwEAASsAwABsXisXwADukhTAAO6LwCPZYwgAhAAuglgBYAPAAEVwPTXAAO6lAAABAGADhRoBFsAA7qUugT7AAEV1IxzAAO6lFMAA7qXAI9m2CAAnAQABKwDAAGxeKxfAAO6sFMAA7qXAI9m2CACEAC6CWAFgA8AARXANCAHAAEVygADAI9i7CAHAAEVzgQDAI9jJCAHAAEV0ggDAI9jXCAHAAEV1gwDAI9jlCAHAAEV2hADAI9j0CAHAAEV3hQDAI9kNCAHAAEV4hgDAI9kmCAHAAEV5hwDAI9k/DABAIRzAAO4QhMAA7gXAI9j0JwEAASsAwABsMsAA7gXAAO4XAAwAQCEcwADuNIXAAO4pwCPZDScBAAErAMAAbDLAAO4pwADuOwAMAEAhHMAA7lmGwADuTcAj2SYnAQABKwDAAGwywADuTcAA7mAADABAIRzAAO58h8AA7nLAI9k/JwEAASsAwABsXsAA7nLAAO6DAAkBwADtZMAAQ80AAAAABAbAAEV7gNXAAO7CwADu6MAA73MAALh+AWrAAO7DYAPAAGxWgLUAAAEDwADu98AA73MAAAACAgLAAO8QAAAAhy1gA8AAW/wAwADvIgAAALjPYAOJVQAAYAPAAFFWAT4BSsAA7zUBHMAA70SAwADvPMAj20K5IgIAAi6BwADvY8Aj21IAwABcbgbAAEV/gNXAAO94wADvn8AA79EBAIO+AWrAAO95YAPAAGxWgLUAAAEDwADvpMAA79EAAAAAAAAAYAPAAEOXAUrAAO+nAWrAAO++YAPAAEOXwAEK2AbAAEV8gNXAAO/WwADv58AA8DkAAIP7AWrAAO/XYAPAAGxWgLUAAAEDwADv9MAA8DkAAAABAQHAAPAGAAAAg/pdA5hwAVsAAFwBPgI9NcAA8A8AAAEAYAOFGgEWwADwDy6DKMAARXQjHMAA8A+BwADwD8Aj3DQnAQABKwDAAGxeKxzAAPAWgcAA8A/AI9w0g/gBAVsBgMAA8B3AI9wdAIUeAVs9NcAA8CUAAAEAYAOFGgEWwADwJS6BPsAARXUjHMAA8CWBwADwJcAj3IsnAQABKwDAAGxeKxzAAPAsgcAA8CXAI9yLg/gBAVsBgMAA8DPAI9wdAIUeAVsGwABFfYDVwADwPsAA8E/AAPE8AACEAgFqwADwP2ADwABsVoC1AAABA8AA8GDAAPE8AAAAAQEBwADwbQAAAIP6YAOYrQAAXAE+AknAAPB2IRzAAPCAFsAA8HougyjAAEV0JwEAASsAwABsXj4CPRfAAPCRLoMoJsAA8JEBHMAA8J8WwADwmS6DKMAARXSD+AEBYAOCUgGAwADwsMAj3RcAhR5gA4UawABFdD01wADwugAAAQBgA4UaARbAAPC6LoMowABFdCMcwADwuoHAAPC6wCPdjCcBAAErAMAAbF4rF8AA8MGBwADwusAj3YyEAC6CWAFgA8AARXA/ScAA8NohHMAA8OQWwADw3i6BPsAARXUnAQABKwDAAGxePgI9F8AA8PUugT4mwADw9QEcwADxAxbAAPD9LoE+wABFdYP4AQFgA4JSAYDAAPEUwCPdFwCFHmADhRrAAEV1PTXAAPEeAAABAGADhRoBFsAA8R4ugT7AAEV1IxzAAPEegcAA8R7AI948JwEAASsAwABsXisXwADxJYHAAPEewCPePIQALoJYAWADwABFcD8AACPbCwAj25IAI9vmACPc4AAj3ooAAAAEAsAARYKA1cAA83LAAPN4wAD8eAO4uAAAAWADwABDxAAADATAAEWEgNXAAPO/wADzyAmERwBgA4OAAATAAEWFgNXAAPPiwADz9wm5EABdA8AAbBkBYAOJVQAEwABFhoDVwAD0JcAA9C0YhUkAYAOFGgAEwABFh4DVwAD0TsAA9FQYllUAYAODrAAEwABFiIDVwAD0dsAA9HwYguYAYAODrAAEwABFiYDVwAD0ucAA9L4YgygAYAOFGgAEwABFioDVwAD0+8AA9QAYgT4AYAOFGgAEwABFi4DVwAD1O8AA9UUJrXwAYAPAAGwfAATAAEWMgNXAAPWAwAD1igm5IABgA8AAbB8ABMAARY2A1cAA9cbAAPXRCYfdAGADwABsHwAEwABFjoDVwAD2MMAA9jkJuQoAYAPAAGxbAATAAEWPgNXAAPa5wAD2yQm5EwBgA8AAbFsAAQXAAEWXgNXAAPbOwAD2zsAA+WAAAAADwAD25cAA+WAAAAAMBwfAAPbrAAAEhEdgA4OAAMAA9vsAAAS5EF0DwABsGQFgA4lVAMAA9x0AAASFSWADhRoAwAD3LAAABJZVYAODrADAAPc5AAAEguZgA4OsAMAA90YAAASDKGADhRoAwAD3UgAABIE+YAOFGgAFwAD3ZQAABK18YAPAAGwfAWoAYAHAAGxcAsAA93wAAAS5IGADwABsHwFqAGABwABsXALAAPeTAAAEh91gA8AAbB8BagBgAcAAbFwCwAD3qwAABLkKYAPAAGxbAWoAYAHAAGxcAsAA98EAAAS5E2ADwABsWwFqAGABwABsXAJgA8AARYIBPgM9NcAA+REAAAEAYAOFGgEWwAD5ES6FScAARYYjHMAA+REUwAD5EcAj4Q4MACcBAAErAMAAbF4rF8AA+RsUwAD5EcAj4Q4MAIQALoJYAWADwABFgj01wAD5LgAAAQBgA4UaARbAAPkuLoMowABFiSMcwAD5LhTAAPkuwCPhYQwAJwEAASsAwABsXisXwAD5NRTAAPkuwCPhYQwAhAAuglgBYAPAAEWCPTXAAPlIAAABAGADhRoBFsAA+UgugT7AAEWKIxzAAPlIFMAA+UjAI+G0DAAnAQABKwDAAGxeKxfAAPlPFMAA+UjAI+G0DACEAC6CWAFgA8AARYITCAHAAEWEgADAI+AcCAHAAEWFgQDAI+AqCAHAAEWGggDAI+A/CAHAAEWHgwDAI+BNCAHAAEWIhADAI+BbCAHAAEWJhQDAI+BpCAHAAEWKhgDAI+B3CAHAAEWLhwDAI+CGCAHAAEWMFADAI+CfCAAIAcAARY0UAMAj4LgJAAgBwABFjhQAwCPg0QoACAHAAEWPFADAI+DqCwAMAEAiHMAA9/mBwAD348Aj4ConAQABKwDAAGxiARzAAPgtFsAA+CaBwAD4EMAj4CqA4MAAbGonAQABFsAA+EkWwAD4OoDAAPgwwCPgHINjg4SA4MAAbGoAwABsMsAA9+PAAPhPAAwAQCEcwAD4bIfAAPhhwCPghicBAAErAMAAbDLAAPhhwAD4cwAMAEAhHMAA+JAUwAD4hcAj4J8IACcBAAErAMAAbDLAAPiFwAD4lwAMAEAhHMAA+LUUwAD4qcAj4LgJACcBAAErAMAAbDLAAPipwAD4vAAMAEAhHMAA+NgUwAD4zsAj4NEKACcBAAErAMAAbF7AAPjOwAD43wAMAEAhHMAA+QIUwAD48cAj4OoLACcBAAErAMAAbF7AAPjxwAD5CQAJAcAA9s7AAEPNAAAAAAQGwABFkYDVwAD5ZcAA+YvAAPoaAAC4fgFqwAD5ZmADwABsVoC1AAABA8AA+ZrAAPoaAAAAAgICwAD5swAAAIctYAPAAFv8AMAA+cUAAAC4z2ADiVUAAGADwABRVgE+AUrAAPnYARzAAPnngMAA+d/AI+QKuSMCAAIugcAA+grAI+QaAMAAXG8GwABFlYDVwAD6H8AA+kbAAPqCAQCDvgFqwAD6IGADwABsVoC1AAABA8AA+kvAAPqCAAAAAAAAAGADwABDlwFKwAD6VAFqwAD6a2ADwABDl8ABCngGwABFkoDVwAD6h8AA+pjAAPsDAACD+wFqwAD6iGADwABsVoC1AAABA8AA+qXAAPsDAAAAAQEBwAD6twAAAIP6XQOYcAFbAABcAT4DPTXAAPrAAAABAGADhRoBFsAA+sAuhUnAAEWGIxzAAPrAgcAA+sDAI+T8JwEAASsAwABsXiscwAD6yoHAAPrAwCPk/IP4AQFbAYDAAPrRwCPk5QCFHgFbPTXAAPrZAAABAGADhRoBFsAA+tkugyjAAEWJIxzAAPrZgcAA+tnAI+VTJwEAASsAwABsXiscwAD64IHAAPrZwCPlU4P4AQFbAYDAAPrnwCPk5QCFHgFbPTXAAPrvAAABAGADhRoBFsAA+u8ugT7AAEWKIxzAAPrvgcAA+u/AI+WqJwEAASsAwABsXiscwAD69oHAAPrvwCPlqoP4AQFbAYDAAPr9wCPk5QCFHgFbBsAARZOA1cAA+wjAAPsZwAD8dgAAhAIBasAA+wlgA8AAbFaAtQAAAQPAAPsqwAD8dgAAAAEBAcAA+zcAAACD+mADmK0AAFwBPgNJwAD7QCEcwAD7TRbAAPtELoVJwABFhicBAAErAMAAbF4+Aj0XwAD7Xi6FSSbAAPteARzAAPtyFsAA+2kuhUnAAEWGg/gBAWADglIBgMAA+4PAI+Y2AIUeYAOFGsAARYY9NcAA+40AAAEAYAOFGgEWwAD7jS6FScAARYYjHMAA+42BwAD7jcAj5qsnAQABKwDAAGxeKxfAAPuXgcAA+43AI+arhAAuglgBYAPAAEWCP0nAAPuwIRzAAPu6FsAA+7QugyjAAEWJJwEAASsAwABsXj4CPRfAAPvLLoMoJsAA+8sBHMAA+9kWwAD70y6DKMAARYmD+AEBYAOCUgGAwAD76sAj5jYAhR5gA4UawABFiT01wAD79AAAAQBgA4UaARbAAPv0LoMowABFiSMcwAD79IHAAPv0wCPnWycBAAErAMAAbF4rF8AA+/uBwAD79MAj51uEAC6CWAFgA8AARYI/ScAA/BQhHMAA/B4WwAD8GC6BPsAARYonAQABKwDAAGxePgI9F8AA/C8ugT4mwAD8LwEcwAD8PRbAAPw3LoE+wABFioP4AQFgA4JSAYDAAPxOwCPmNgCFHmADhRrAAEWKPTXAAPxYAAABAGADhRoBFsAA/FgugT7AAEWKIxzAAPxYgcAA/FjAI+gLJwEAASsAwABsXisXwAD8X4HAAPxYwCPoC4QALoJYAWADwABFgj8AACPj0wAj5FoAI+SuACPl/wAj6FkAAAAEAsAARZiA1cAA/ibAAP4swAEGHAO4rgAAAWADwABDxAAACgTAAEWagNXAAP6pwAD+sRiFSQBgA4UaAATAAEWbgNXAAP7uwAD+8xiDKABgA4UaAATAAEWcgNXAAP8lwAD/Lxi5EgBgA4kfAATAAEWdgNXAAP9zwAD/dhiNMQBgA4UaAATAAEWegNXAAP+xwAD/uwmtfABgA8AAbB8ABMAARZ+A1cAA//fAAQACCYfdAGADwABsHwAEwABFoIDVwAEAQcABAE0JuRQAYAPAAGwfAATAAEWhgNXAAQCswAEAtQm5CgBgA8AAbFsABMAARaKA1cABAQfAAQEUCbkkAGADwABsWwAEwABFo4DVwAEBlMABAaQJuRMAYAPAAGxbAAEFwABFq4DVwAEBqcABAanAAQMiAAAAA8ABAbnAAQMiAAAACgQEwAEBvwAABIVJYAOFGgDAAQHOAAAEgyhgA4UaAMABAdoAAAS5EmADiR8AwAEB6wAABI0xYAOFGgAGwAEB/AAABK18YAPAAGwfAWoAYAHAAGxcAsABAhMAAAS5FGADwABsHwFqAGABwABsXALAAQIsAAAEh91gA8AAbB8BagBgAcAAbFwCwAECRAAABLkKYAPAAGxbAWoAYAHAAGxcAsABAloAAAS5JGADwABsWwFqAGABwABsXALAAQJ0AAAEuRNgA8AAbFsBasABAoZgA8AAbFscYAPAAEWYAT4EPTXAAQK2AAABAGADhRoBFsABArYuhUnAAEWaIxzAAQK2FMABArbAI+qTCgAnAQABKwDAAGxeKxfAAQLAFMABArbAI+qTCgCEAC6CWAFgA8AARZg9NcABAtMAAAEAYAOFGgEWwAEC0y6DKMAARZsjHMABAtMUwAEC08Aj6uYKACcBAAErAMAAbF4rF8ABAtoUwAEC08Aj6uYKAIQALoJYAWADwABFmD01wAEC7QAAAQBgA4UaARbAAQLtLo0xwABFnSMcwAEC7RTAAQLtwCPrOQoAJwEAASsAwABsXisXwAEC8hTAAQLtwCPrOQoAhAAuglgBYAPAAEWYPRfAAQMFLoQBFsABAxIuuRTAAEWgglkMCAHAAEWagADAI+m2CAHAAEWbgQDAI+nECAHAAEWcggDAI+nSCAHAAEWdgwDAI+ngCAHAAEWehADAI+nvCAHAAEWghQDAI+oICAHAAEWfhgDAI+ohCAHAAEWhhwDAI+o6CAHAAEWiFADAI+pTCAAIAcAARaMUAMAj6mwJAAwAQCEcwAECp4fAAQKdwCPqOicBAAErAMAAbF7AAQKdwAECrgAJAcABAanAAEPNAAAAAAQGwABFpYDVwAEDJ8ABA03AAQPVAAC4fgFqwAEDKGADwABsVoC1AAABA8ABA1zAAQPVAAAAAgICwAEDdQAAAIctYAPAAFv8AMABA4cAAAC4z2ADiVUAAGADwABRVgE+AUrAAQOaARzAAQOpgMABA6HAI+yJuSUCAAIugcABA8XAI+yZAMAAXHAGwABFqYDVwAED2sABBAHAAQQwAQCDvgFqwAED22ADwABsVoC1AAABA8ABBAbAAQQwAAAAAAAAAGADwABDlwFKwAEECQFqwAEEIGADwABDl8ABCYgGwABFpoDVwAEENcABBEbAAQSvAACD+wFqwAEENmADwABsVoC1AAABA8ABBFPAAQSvAAAAAQEBwAEEZQAAAIP6XQOYcAFbAABcAT4DPTXAAQRuAAABAGADhRoBFsABBG4uhUnAAEWaIxzAAQRugcABBG7AI+17JwEAASsAwABsXiscwAEEeIHAAQRuwCPte4P4AQFbAYDAAQR/wCPtZACFHgFbPTXAAQSHAAABAGADhRoBFsABBIcugyjAAEWbIxzAAQSHgcABBIfAI+3SJwEAASsAwABsXiscwAEEjoHAAQSHwCPt0oP4AQFbAYDAAQSVwCPtZACFHgFbPTXAAQSdAAABAGADhRoBFsABBJ0ujTHAAEWdIxzAAQSdgcABBJ3AI+4pJwEAASsAwABsXiscwAEEooHAAQSdwCPuKYP4AQFbAYDAAQSpwCPtZACFHgFbBsAARaeA1cABBLTAAQTFwAEGGgAAhAIBasABBLVgA8AAbFaAtQAAAQPAAQTWwAEGGgAAAAEBAcABBOMAAACD+mADmK0AAFwBPgNJwAEE7CEcwAEE+RbAAQTwLoVJwABFmicBAAErAMAAbF4+Aj0XwAEFCi6FSSbAAQUKARzAAQUeFsABBRUuhUnAAEWag/gBAWADglIBgMABBS/AI+61AIUeYAOFGsAARZo9NcABBTkAAAEAYAOFGgEWwAEFOS6FScAARZojHMABBTmBwAEFOcAj7yonAQABKwDAAGxeKxfAAQVDgcABBTnAI+8qhAAuglgBYAPAAEWYP0nAAQVcIRzAAQVmFsABBWAugyjAAEWbJwEAASsAwABsXj4CPRfAAQV3LoMoJsABBXcBHMABBYUWwAEFfy6DKMAARZuD+AEBYAOCUgGAwAEFlsAj7rUAhR5gA4UawABFmz01wAEFoAAAAQBgA4UaARbAAQWgLoMowABFmyMcwAEFoIHAAQWgwCPv2icBAAErAMAAbF4rF8ABBaeBwAEFoMAj79qEAC6CWAFgA8AARZg/ScABBcAhHMABBcgWwAEFxC6NMcAARZ0nAQABKwDAAGxePgI9F8ABBdkujTEmwAEF2QEcwAEF4xbAAQXfLo0xwABFnYP4AQFgA4JSAYDAAQX0wCPutQCFHmADhRrAAEWdPTXAAQX+AAABAGADhRoBFsABBf4ujTHAAEWdIxzAAQX+gcABBf7AI/CKJwEAASsAwABsXisXwAEGA4HAAQX+wCPwioQALoJYAWADwABFmD8AACPsUgAj7NkAI+0tACPufgAj8NgAAAAEAsAARayA1cABCvXAAQr7wAESYAO4wQAAAWADwABDxAAACQTAAEWugNXAAQt9wAELhRiFSQBgA4UaAATAAEWvgNXAAQu6wAELxhi5EQBgA4kfAATAAEWwgNXAAQv4wAEMAhi5EgBgA4kfAATAAEWxgNXAAQxGwAEMSRiNMQBgA4UaAATAAEWygNXAAQyGwAEMkAmtfABgA8AAbB8ABMAARbOA1cABDM7AAQzZCYfdAGADwABsHwAEwABFtIDVwAENGMABDSQJuRQAYAPAAGwfAATAAEW1gNXAAQ2DwAENjAm5CgBgA8AAbFsABMAARbaA1cABDd3AAQ3qCbkkAGADwABsWwABBcAARb6A1cABDe/AAQ3vwAEP0gAAAAPAAQ4DwAEP0gAAAAkEBMABDhAAAASFSWADhRoAwAEOHwAABLkRYAOJHwDAAQ4yAAAEuRJgA4kfAMABDkMAAASNMWADhRoABcABDlQAAAStfGADwABsHwFqAGABwABsXALAAQ5rAAAEuRRgA8AAbB8BagBgAcAAbFwCwAEOhAAABIfdYAPAAGwfAWoAYAHAAGxcAsABDpwAAAS5CmADwABsWwFqAGABwABsXALAAQ6yAAAEuSRgA8AAbFsBagBgAcAAbFwCYAPAAEWsAT4DPTXAAQ+AAAABAGADhRoBFsABD4AuhUnAAEWuIxzAAQ+AFMABD4DAI/LcCQAnAQABKwDAAGxeKxfAAQ+KFMABD4DAI/LcCQCEAC6CWAFgA8AARaw9NcABD50AAAEAYAOFGgEWwAEPnS6NMcAARbEjHMABD50UwAEPncAj8y8JACcBAAErAMAAbF4rF8ABD6IUwAEPncAj8y8JAIQALoJYAWADwABFrD0XwAEPtS6EARbAAQ/CLrkUwABFtIJZDwgBwABFroAAwCPyGwgBwABFr4EAwCPyKQgBwABFsIIAwCPyNwgBwABFsYMAwCPyRQgBwABFsoQAwCPyVAgBwABFtIUAwCPybQgBwABFs4YAwCPyhggBwABFtYcAwCPynwgBwABFthQAwCPyuAgADABAIRzAAQ7chMABDtHAI/JUJwEAASsAwABsMsABDtHAAQ7jAAwAQCEcwAEPAoXAAQ71wCPybScBAAErAMAAbDLAAQ71wAEPCQAMAEAhHMABDyeGwAEPG8Aj8oYnAQABKwDAAGwywAEPG8ABDy4ADABAIRzAAQ9Kh8ABD0DAI/KfJwEAASsAwABsXsABD0DAAQ9RAAwAQCEcwAEPcRTAAQ9jwCPyuAgAJwEAASsAwABsXsABD2PAAQ94AAkBwAEN78AAQ80AAAAABAbAAEW4gNXAAQ/XwAEP/cABEIkAALh+AWrAAQ/YYAPAAGxWgLUAAAEDwAEQDMABEIkAAAACAgLAARAlAAAAhy1gA8AAW/wAwAEQNwAAALjPYAOJVQAAYAPAAFFWAT4BSsABEEoBHMABEFmAwAEQUcAj9Qe5JgIAAi6BwAEQecAj9RcAwABccQbAAEW8gNXAARCOwAEQtcABEO4BAIO+AWrAARCPYAPAAGxWgLUAAAEDwAEQusABEO4AAAAAAAAAYAPAAEOXAUrAARDDAWrAARDaYAPAAEOXwAELUAbAAEW5gNXAARDzwAERBMABEVcAAIP7AWrAARD0YAPAAGxWgLUAAAEDwAEREcABEVcAAAABAQHAAREjAAAAg/pdA5hwAVsAAFwBPgI9NcABESwAAAEAYAOFGgEWwAERLC6FScAARa4jHMABESyBwAERLMAj9fknAQABKwDAAGxeKxzAARE2gcABESzAI/X5g/gBAVsBgMABET3AI/XiAIUeAVs9NcABEUUAAAEAYAOFGgEWwAERRS6NMcAARbEjHMABEUWBwAERRcAj9lAnAQABKwDAAGxeKxzAARFKgcABEUXAI/ZQg/gBAVsBgMABEVHAI/XiAIUeAVsGwABFuoDVwAERXMABEW3AARJeAACEAgFqwAERXWADwABsVoC1AAABA8ABEX7AARJeAAAAAQEBwAERiwAAAIP6YAOYrQAAXAE+AknAARGUIRzAARGhFsABEZguhUnAAEWuJwEAASsAwABsXj4CPRfAARGyLoVJJsABEbIBHMABEcYWwAERvS6FScAARa6D+AEBYAOCUgGAwAER18Aj9twAhR5gA4UawABFrj01wAER4QAAAQBgA4UaARbAARHhLoVJwABFriMcwAER4YHAARHhwCP3UScBAAErAMAAbF4rF8ABEeuBwAER4cAj91GEAC6CWAFgA8AARaw/ScABEgQhHMABEgwWwAESCC6NMcAARbEnAQABKwDAAGxePgI9F8ABEh0ujTEmwAESHQEcwAESJxbAARIjLo0xwABFsYP4AQFgA4JSAYDAARI4wCP23ACFHmADhRrAAEWxPTXAARJCAAABAGADhRoBFsABEkIujTHAAEWxIxzAARJCgcABEkLAI/gBJwEAASsAwABsXisXwAESR4HAARJCwCP4AYQALoJYAWADwABFrD8AACP00AAj9VcAI/WrACP2pQAj+E8AAAAEAsAARb+A1cABFTfAARU9wAEbjgO4wwAAAWADwABDxAAABwTAAEXBgNXAARW8wAEVxBiFSQBgA4UaAATAAEXCgNXAARYMwAEWEBiBiABgA4kfAATAAEXDgNXAARZqwAEWbxiBPgBgA4UaAATAAEXEgNXAARaswAEWtgmtfABgA8AAbB8ABMAARcWA1cABFvTAARb/CYfdAGADwABsHwAEwABFxoDVwAEXOsABF0QJuSAAYAPAAGwfAATAAEXHgNXAARejwAEXrAm5CgBgA8AAbFsAAQXAAEXPgNXAARexwAEXscABGQAAAAADwAEXw8ABGQAAAAAHAwPAARfJAAAEhUlgA4UaAMABF9gAAASBiGADiR8AwAEX4wAABIE+YAOFGgAEwAEX9gAABK18YAPAAGwfAWoAYAHAAGxcAsABGAcAAASH3WADwABsHwFqAGABwABsXALAARgZAAAEuSBgA8AAbB8BagBgAcAAbFwCwAEYKgAABLkKYAPAAGxbAWoAYAHAAGxcAmADwABFvwE+Aj01wAEYywAAAQBgA4UaARbAARjLLoVJwABFwSMcwAEYy4fAARjLwCP5+icBAAErAMAAbF4rF8ABGNWHwAEYy8Aj+fqEAC6CWAFgA8AARb89NcABGOgAAAEAYAOFGgEWwAEY6C6BPsAARcMjHMABGOiHwAEY6MAj+kknAQABKwDAAGxeKxfAARjvh8ABGOjAI/pJhAAuglgBYAPAAEW/DAgBwABFwYAAwCP5YAgBwABFwoEAwCP5bggBwABFw4IAwCP5fAgBwABFxIMAwCP5iwgBwABFxYQAwCP5pAgBwABFxoUAwCP5vQgBwABFx4YAwCP51gwAQCEcwAEYUIPAARhFwCP5iycBAAErAMAAbDLAARhFwAEYVwAMAEAhHMABGHWEwAEYacAj+aQnAQABKwDAAGwywAEYacABGHwADABAIRzAARiZhcABGI7AI/m9JwEAASsAwABsMsABGI7AARigAAwAQCEcwAEYvIbAARiywCP51icBAAErAMAAbF7AARiywAEYwwAJAcABF7HAAEPNAAAAAAQGwABFyYDVwAEZBcABGSvAARm1AAC4fgFqwAEZBmADwABsVoC1AAABA8ABGTrAARm1AAAAAgICwAEZUwAAAIctYAPAAFv8AMABGWUAAAC4z2ADiVUAAGADwABRVgE+AUrAARl4ARzAARmHgMABGX/AI/vFuScCAAIugcABGaXAI/vVAMAAXHcGwABFzYDVwAEZusABGeHAARoSAQCDvgFqwAEZu2ADwABsVoC1AAABA8ABGebAARoSAAAAAAAAAGADwABDlwFKwAEZ6QFqwAEaAGADwABDl8ABC4AGwABFyoDVwAEaF8ABGijAARp9AACD+wFqwAEaGGADwABsVoC1AAABA8ABGjXAARp9AAAAAQEBwAEaRwAAAIP6XQOYcAFbAABcAT4CPTXAARpQAAABAGADhRoBFsABGlAuhUnAAEXBIxzAARpQgcABGlDAI/y3JwEAASsAwABsXiscwAEaWoHAARpQwCP8t4P4AQFbAYDAARphwCP8oACFHgFbPTXAARppAAABAGADhRoBFsABGmkugT7AAEXDIxzAARppgcABGmnAI/0OJwEAASsAwABsXiscwAEacIHAARppwCP9DoP4AQFbAYDAARp3wCP8oACFHgFbBsAARcuA1cABGoLAARqTwAEbjAAAhAIBasABGoNgA8AAbFaAtQAAAQPAARqkwAEbjAAAAAEBAcABGrEAAACD+mADmK0AAFwBPgJJwAEauiEcwAEaxxbAARq+LoVJwABFwScBAAErAMAAbF4+Aj0XwAEa2C6FSSbAARrYARzAARrsFsABGuMuhUnAAEXBg/gBAWADglIBgMABGv3AI/2aAIUeYAOFGsAARcE9NcABGwcAAAEAYAOFGgEWwAEbBy6FScAARcEjHMABGweBwAEbB8Aj/g8nAQABKwDAAGxeKxfAARsRgcABGwfAI/4PhAAuglgBYAPAAEW/P0nAARsqIRzAARs0FsABGy4ugT7AAEXDJwEAASsAwABsXj4CPRfAARtFLoE+JsABG0UBHMABG1MWwAEbTS6BPsAARcOD+AEBYAOCUgGAwAEbZMAj/ZoAhR5gA4UawABFwz01wAEbbgAAAQBgA4UaARbAARtuLoE+wABFwyMcwAEbboHAARtuwCP+vycBAAErAMAAbF4rF8ABG3WBwAEbbsAj/r+EAC6CWAFgA8AARb8/AAAj+44AI/wVACP8aQAj/WMAI/8NAAAABALAAEXQgNXAAR0uwAEdNMABI+sDuLAAAAFgA8AAQ8QAAAoEwABF0oDVwAEdhcABHYsYllUAYAODrAAEwABF04DVwAEdrcABHbMYguYAYAODrAAEwABF1IDVwAEd8MABHfUYgygAYAOFGgAEwABF1YDVwAEeJ8ABHjEYuRIAYAOJHwAEwABF1oDVwAEedcABHngYjTEAYAOFGgAEwABF14DVwAEes8ABHr0JrXwAYAPAAGwfAATAAEXYgNXAAR75wAEfBAmH3QBgA8AAbB8ABMAARdmA1cABH0PAAR9PCbkUAGADwABsHwAEwABF2oDVwAEfrsABH7cJuQoAYAPAAGxbAATAAEXbgNXAASAJwAEgFgm5JABgA8AAbFsAAQXAAEXjgNXAASAbwAEgG8ABIWoAAAADwAEgMMABIWoAAAAKBQXAASA9AAAEllVgA4OsAMABIEoAAASC5mADg6wAwAEgVwAABIMoYAOFGgDAASBjAAAEuRJgA4kfAMABIHQAAASNMWADhRoABcABIIUAAAStfGADwABsHwFqAGABwABsXALAASCcAAAEuRRgA8AAbB8BagBgAcAAbFwCwAEgtQAABIfdYAPAAGwfAWoAYAHAAGxcAsABIM0AAAS5CmADwABsWwFqAGABwABsXALAASDjAAAEuSRgA8AAbFsBagBgAcAAbFwCYAPAAEXQAT4DPTXAASEbAAABAGADhRoBFsABIRsugyjAAEXUIxzAASEbFMABIRvAJAE3CgAnAQABKwDAAGxeKxfAASEiFMABIRvAJAE3CgCEAC6CWAFgA8AARdA9NcABITUAAAEAYAOFGgEWwAEhNS6NMcAARdYjHMABITUUwAEhNcAkAYoKACcBAAErAMAAbF4rF8ABIToUwAEhNcAkAYoKAIQALoJYAWADwABF0D0XwAEhTS6EARbAASFaLrkUwABF2YJZDAgBwABF0oAAwCQAaAgBwABF04EAwCQAdggBwABF1IIAwCQAhAgBwABF1YMAwCQAkggBwABF1oQAwCQAoAgBwABF14UAwCQArwgBwABF2YYAwCQAyAgBwABF2IcAwCQA4QgBwABF2hQAwCQA+ggACAHAAEXbFADAJAETCQAMAEAhHMABIQwUwAEhAsAkAPoIACcBAAErAMAAbF7AASECwAEhEwAJAcABIBvAAEPNAAAAAAQGwABF3YDVwAEhb8ABIZXAASIiAAC4fgFqwAEhcGADwABsVoC1AAABA8ABIaTAASIiAAAAAgICwAEhvQAAAIctYAPAAFv8AMABIc8AAAC4z2ADiVUAAGADwABRVgE+AUrAASHiARzAASHxgMABIenAJALcuSgCAAIugcABIhLAJALsAMAAXHIGwABF4YDVwAEiJ8ABIk7AASKIAQCDvgFqwAEiKGADwABsVoC1AAABA8ABIlPAASKIAAAAAAAAAGADwABDlwFKwAEiXAFqwAEic2ADwABDl8ABCbgGwABF3oDVwAEijcABIp7AASLuAACD+wFqwAEijmADwABsVoC1AAABA8ABIqvAASLuAAAAAQEBwAEivQAAAIP6XQOYcAFbAABcAT4CPTXAASLGAAABAGADhRoBFsABIsYugyjAAEXUIxzAASLGgcABIsbAJAPOJwEAASsAwABsXiscwAEizYHAASLGwCQDzoP4AQFbAYDAASLUwCQDtwCFHgFbPTXAASLcAAABAGADhRoBFsABItwujTHAAEXWIxzAASLcgcABItzAJAQlJwEAASsAwABsXiscwAEi4YHAASLcwCQEJYP4AQFbAYDAASLowCQDtwCFHgFbBsAARd+A1cABIvPAASMEwAEj6QAAhAIBasABIvRgA8AAbFaAtQAAAQPAASMVwAEj6QAAAAEBAcABIyIAAACD+mADmK0AAFwBPgJJwAEjKyEcwAEjNRbAASMvLoMowABF1CcBAAErAMAAbF4+Aj0XwAEjRi6DKCbAASNGARzAASNUFsABI04ugyjAAEXUg/gBAWADglIBgMABI2XAJASxAIUeYAOFGsAARdQ9NcABI28AAAEAYAOFGgEWwAEjby6DKMAARdQjHMABI2+BwAEjb8AkBSYnAQABKwDAAGxeKxfAASN2gcABI2/AJAUmhAAuglgBYAPAAEXQP0nAASOPIRzAASOXFsABI5MujTHAAEXWJwEAASsAwABsXj4CPRfAASOoLo0xJsABI6gBHMABI7IWwAEjri6NMcAARdaD+AEBYAOCUgGAwAEjw8AkBLEAhR5gA4UawABF1j01wAEjzQAAAQBgA4UaARbAASPNLo0xwABF1iMcwAEjzYHAASPNwCQF1icBAAErAMAAbF4rF8ABI9KBwAEjzcAkBdaEAC6CWAFgA8AARdA/AAAkAqUAJAMsACQDgAAkBHoAJAYkAAAABALAAEXkgNXAASaxwAEmt8ABMMQDuKwAAAFgA8AAQ8QAAA4EwABF5oDVwAEnAMABJwkJhEcAYAODgAAEwABF54DVwAEnI8ABJzgJuRAAXQPAAGwZAWADiVUABMAAReiA1cABJ0jAASdQGIVJAGADhRoABMAARemA1cABJ3HAASd3GJZVAGADg6wABMAAReqA1cABJ5nAASefGILmAGADg6wABMAAReuA1cABJ9zAASfhGIMoAGADhRoABMAAReyA1cABKBPAASgdGLkSAGADiR8ABMAARe2A1cABKGHAAShkGI0xAGADhRoABMAARe6A1cABKJ/AASipCa18AGADwABsHwAEwABF74DVwAEo5cABKPAJh90AYAPAAGwfAATAAEXwgNXAASkvwAEpOwm5FABgA8AAbB8ABMAARfGA1cABKZrAASmjCbkKAGADwABsWwAEwABF8oDVwAEp9cABKgIJuSQAYAPAAGxbAATAAEXzgNXAASptwAEqfQm5EwBgA8AAbFsAAQXAAEX7gNXAASqCwAEqgsABLbIAAAADwAEqm8ABLbIAAAAOCAjAASqoAAAEhEdgA4OAAMABKr4AAAS5EF0DwABsGQFgA4lVAMABKuAAAASFSWADhRoAwAEq9QAABJZVYAODrADAASsIAAAEguZgA4OsAMABKxsAAASDKGADhRoAwAErLQAABLkSYAOJHwDAAStEAAAEjTFgA4UaAAbAAStVAAAErXxgA8AAbB8BagBgAcAAbFwCwAErbAAABLkUYAPAAGwfAWoAYAHAAGxcAsABK4UAAASH3WADwABsHwFqAGABwABsXALAASudAAAEuQpgA8AAbFsBagBgAcAAbFwCwAErswAABLkkYAPAAGxbAWoAYAHAAGxcAsABK80AAAS5E2ADwABsWwFqAGABwABsXAJgA8AAReQBPgQ9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Lo0xwABF7ScBAAErAMAAbF4+Aj0XwAEwgS6NMSbAATCBARzAATCLFsABMIcujTHAAEXtg/gBAWADglIBgMABMJzAJA6FAIUeYAOFGsAARe09NcABMKYAAAEAYAOFGgEWwAEwpi6NMcAARe0jHMABMKaBwAEwpsAkEFonAQABKwDAAGxeKxfAATCrgcABMKbAJBBahAAuglgBYAPAAEXkPwAAJAwiACQMqQAkDP0AJA5OACQQqAAAAAQCwABF/IDVwAEzrsABM7TAAToGA7i2AAABYAPAAEPEAAAHBMAARf6A1cABM/DAATP5CYRHAGADg4AABMAARf+A1cABNBPAATQoCbkQAF0DwABsGQFgA4lVAATAAEYAgNXAATRfwAE0ZxiFSQBgA4UaAATAAEYBgNXAATSpwAE0rxiAvgBgA4OsAATAAEYCgNXAATTywAE09xiBPgBgA4UaAATAAEYDgNXAATVgwAE1aQm5CgBgA8AAbFsABMAARgSA1cABNdTAATXkCbkTAGADwABsWwABBcAARgyA1cABNenAATXpwAE3hAAAAAPAATX1wAE3hAAAAAcFBcABNfsAAASER2ADg4AAwAE2CwAABLkQXQPAAGwZAWADiVUAwAE2JwAABIVJYAOFGgDAATY8AAAEgL5gA4OsAMABNkkAAASBPmADhRoAAsABNlwAAAS5E2ADwABsWwFqAGABwABsXALAATZzAAAEuQpgA8AAbFsBagBgAcAAbFwCYAPAAEX8AT4CPTXAATdPAAABAGADhRoBFsABN08uhUnAAEYAIxzAATdPh8ABN0/AJBJHJwEAASsAwABsXisXwAE3WYfAATdPwCQSR4QALoJYAWADwABF/D01wAE3bAAAAQBgA4UaARbAATdsLoE+wABGAiMcwAE3bIfAATdswCQSlicBAAErAMAAbF4rF8ABN3OHwAE3bMAkEpaEAC6CWAFgA8AARfwLCAHAAEX+gADAJBG8CAHAAEX/gQDAJBHKCAHAAEYAggDAJBHfCAHAAEYBgwDAJBHtCAHAAEYChADAJBH7CAHAAEYEhQDAJBIKCAHAAEYDhgDAJBIjDABAIhzAATakgcABNo7AJBHKJwEAASsAwABsYgEcwAE22BbAATbRgcABNrvAJBHKgODAAGxqJwEAARbAATb0FsABNuWAwAE228AkEbyDY4OEgODAAGxqAMAAbDLAATaOwAE2+gAMAEAhHMABNx2FwAE3DMAkEgonAQABKwDAAGxewAE3DMABNyQADABAIRzAATdAhsABNzbAJBIjJwEAASsAwABsXsABNzbAATdHAAkBwAE16cAAQ80AAAAABAbAAEYGgNXAATeJwAE3r8ABODMAALh+AWrAATeKYAPAAGxWgLUAAAEDwAE3vsABODMAAAACAgLAATfXAAAAhy1gA8AAW/wAwAE36QAAALjPYAOJVQAAYAPAAFFWAT4BSsABN/wBHMABOAuAwAE4A8AkFC25KgIAAi6BwAE4I8AkFD0AwABcNAbAAEYKgNXAATg4wAE4X8ABOIoBAIO+AWrAATg5YAPAAGxWgLUAAAEDwAE4ZMABOIoAAAAAAAAAYAPAAEOXAUrAAThnAWrAATh+YAPAAEOXwAEKSAbAAEYHgNXAATiPwAE4oMABOPUAAIP7AWrAATiQYAPAAGxWgLUAAAEDwAE4rcABOPUAAAABAQHAATi/AAAAg/pdA5hwAVsAAFwBPgI9NcABOMgAAAEAYAOFGgEWwAE4yC6FScAARgAjHMABOMiBwAE4yMAkFR8nAQABKwDAAGxeKxzAATjSgcABOMjAJBUfg/gBAVsBgMABONnAJBUIAIUeAVs9NcABOOEAAAEAYAOFGgEWwAE44S6BPsAARgIjHMABOOGBwAE44cAkFXYnAQABKwDAAGxeKxzAATjogcABOOHAJBV2g/gBAVsBgMABOO/AJBUIAIUeAVsGwABGCIDVwAE4+sABOQvAAToEAACEAgFqwAE4+2ADwABsVoC1AAABA8ABORzAAToEAAAAAQEBwAE5KQAAAIP6YAOYrQAAXAE+AknAATkyIRzAATk/FsABOTYuhUnAAEYAJwEAASsAwABsXj4CPRfAATlQLoVJJsABOVABHMABOWQWwAE5Wy6FScAARgCD+AEBYAOCUgGAwAE5dcAkFgIAhR5gA4UawABGAD01wAE5fwAAAQBgA4UaARbAATl/LoVJwABGACMcwAE5f4HAATl/wCQWdycBAAErAMAAbF4rF8ABOYmBwAE5f8AkFneEAC6CWAFgA8AARfw/ScABOaIhHMABOawWwAE5pi6BPsAARgInAQABKwDAAGxePgI9F8ABOb0ugT4mwAE5vQEcwAE5yxbAATnFLoE+wABGAoP4AQFgA4JSAYDAATncwCQWAgCFHmADhRrAAEYCPTXAATnmAAABAGADhRoBFsABOeYugT7AAEYCIxzAATnmgcABOebAJBcnJwEAASsAwABsXisXwAE57YHAATnmwCQXJ4QALoJYAWADwABF/D8AACQT9gAkFH0AJBTRACQVywAkF3UAAAAEAsAARg2A1cABO2fAATttwAE+8wO4wgAAAWADwABDxAAAAgTAAEYPgNXAATuzwAE7uxiFFABgA4jnAATAAEYQgNXAATvKwAE71BiFfgBgA4UaAAEFwABGGIDVwAE72cABO9nAATxMAAAAA8ABO+vAATxMAAAAAgICwAE78QAABIUUYAOI5wDAATwAAAAEhX5gA4UaAABgA8AARg0BPgI9NcABPBIAAAEAYAOI5wEWwAE8Ei6FFMAARg8jHMABPBKCwAE8EsAkGC4nAQABKwDAAGxeKxfAATwcgsABPBLAJBguhAAuglgBYAPAAEYNPTXAATwvAAABAGADhRoBFsABPC8uhX7AAEYQIxzAATwvgsABPC/AJBh9JwEAASsAwABsXisXwAE8O4LAATwvwCQYfYQALoJYAWADwABGDQMIAcAARg+AAMAkGAYIAcAARhCBAMAkGBQJAcABO9nAAEPNAAAAAAQGwABGEoDVwAE8UcABPHfAAT0BAAC4fgFqwAE8UmADwABsVoC1AAABA8ABPIbAAT0BAAAAAgICwAE8nwAAAIctYAPAAFv8AMABPLEAAAC4z2ADiVUAAGADwABRVgE+AUrAATzEARzAATzTgMABPMvAJBkpuSsCAAIugcABPPHAJBk5AMAAXGEGwABGFoDVwAE9BsABPS3AAT1eAQCDvgFqwAE9B2ADwABsVoC1AAABA8ABPTLAAT1eAAAAAAAAAGADwABDlwFKwAE9NQFqwAE9TGADwABDl8ABC2gGwABGE4DVwAE9Y8ABPXTAAT3OAACD+wFqwAE9ZGADwABsVoC1AAABA8ABPYHAAT3OAAAAAQEBwAE9kwAAAIP6XQOYcAFbAABcAT4CPTXAAT2cAAABAGADiOcBFsABPZwuhRTAAEYPIxzAAT2cgcABPZzAJBobJwEAASsAwABsXiscwAE9poHAAT2cwCQaG4P4AQFbAYDAAT2twCQaBACJDAFbPTXAAT21AAABAGADhRoBFsABPbUuhX7AAEYQIxzAAT21gcAB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AAAAJLSRACS01wAkuMkAAAACAAAAAYDXACS43QAks+8AJLjaAAAAAQAkuN0AAAAAAAIIwABGsLmjgNgAADuBAQAAwABsuwABAQGQVIEpAACThQABAQFrgXkAAL1iAAEBAaAfgcIAAMAAXw8AAQEBuaSCKAAAgi4AAQEihWeEhYTdhXqGRIZOhTKErYS3hRmGWoZWhkt1hFSEZIXShdaEv4Y5hlKGQITqhQV2hdSFeIW8hpKGjIZthG6GLIZQhRUAAIFpAAEBAXOFWAAAt9QAAQEBsjCFmQAAnDUAAQEClmyWXoXzAADAAFdYAAEBBLbxtvO5pbb0hrAAAJYgAAEBAZPihuwAAJq3AAEBAYq9hzEAAMAAQC0AAIdTAADAAF8SAACHggAAwABAegAAh6oAAMAAS/kAAIfYAADAAFkQAACIEAAAwABZPAAAiD8AAMAATE0AAIhmAADAAExnAACIkgAAwABMgwAAiLoAAMAATWcAAIjtAADAAE2HAACJGAAAwABN4AAAiUgAAMAATfMAAImDAADAAEEIAACJrQAAwABOEwAAidYAAMAAWR8AAIoBAADAAF8dAACKNQAAwABBfwAAil0AAMAATnIAAIqKAADAAFkpAACKtwAAwABOjQAAiuUAAMAATqgAAIsOAADAAE67AACLOgAAwABPAgAAi2cAAMAAQYUAAIuOAADAAEGbAACLwQAAwABPHgAAi/EAAMAATz4AAIwbAADAAE9RAACMSAAAwABBvgABAQGEZ4x2AADAAFmXAAEBAbfbjKoAAMAAQhwAAQEBq86M0AAAlNgAAIzvAADAAE9lAAEBAq6grqKNLgAAwABCKQABAQGrz41UAADAAEM7AACNewAAwABDNgABAQS4ZrhouBi32o4bAADAAF8GAACOSAAAwABWogABAQauurbyuaa5p7mouamPRQAAwABH8QABAQGs049rAADAAE+hAAEBCresrqSuprmquau5rK6nua23rbmukI8AAMAAT9UAAQEBua+QugAAtTkAAQECriCuCZDxAADAAEI+AACRCgAAwABQZQABAQG5sJFQAADAAEMDAAEBAavQkY0AAMAAXzEAAQEBubGR0gAAwABdXAABAQG5SAAAAAgCwABGt4DYkq+StcAB5QgDq9cAAAFgA8AAQTsAACgEwABGuYDYkv2TMAa5sgBgA8AAbBgB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AAABAQHAAEH0AAAAgUxgA8AAbFgAAGADwABsWwFKwABB/AEhHMAAQgcWwABCAIDAAEH8wCTfeYEiwABsgCcBAAFqwABCCmADwABsGMAA3LQAwABsNgbAAEb1gNjAAEIjwABCJ8AAReMAAIFdAAAAAQPAAEIuwABF4wAAAAQDA8AAQjMAAACt4mADwABsWADAAEJDAAAAgUxgA8AAbBgAwABCTAAAALpCYAPAAGwfAAHAAEJYAAAArFRbAWrAAEJgYAPAAGxbHGADwABsWAE+BEnAAEJuHMAAQnaBwABCcsAk4AMnAQABKwDAAGw2PgI9HMAAQocurGAEAARqwABCkmADstvAAIJdgsAAQqbAJOATasAAQrFgA8AAbB8DFsAAQrsug23AAEbCAMAARxJKwABCywEewABC1sAAbgoBAAABgSJqwABC4mADwABsGMAA3LQ/TsAAQwcAAAC6Q2ADwABsWABLPgE9jMAAQyLAJODIHsAAQzLAAGx/AQABgcAAQzjAJOADAAABwABDRGADwABspwHAAENeAAABgfhgA8AAbKcAAD4CPRzAAEQkLqxgBAAEHMAAREhqwABEL10DsucBYQMCYAPAAGwYYAPAAGwYYAOyz8AAbUKNbwIAAoHAAERWwCTgAxbAAERdhcAARFvAJOEIgJbAAG2wALLrHMAARH8cwABEe4LAAERxwCTgE4E/AQABlADAAGyIgT8BAAE1wABEhAAAAQBgA8AAbB8BFsAARISFwABEgsAk4QiECsAAbf0jHMAARISGwABEhMAk4ZYnAQABKwDAAGwyHMAARI6UgVoAAAAAwABsj4bAAESEwCThlgFgA8AAbB8AwABsiJQWwABEli6DbcAARsIAwABHEkrAAESmAR7AAESxwABuCgIAAAKBImrAAETIYAPAAGwYwADctKymHsAAROnAAG7tAQABgcAARP7AJOADAEnAAEUPIibAAEUTBYPAAEUTwCTgJGADwABsWwAcwABFLBbAAEUlgMAARR3AJN/zgSLAAGyAJwEAASeBIwDAAGw2PgFKwABFcwEewABFesAAXxECAAKAwABFjcAk3/OEwABFlsAk4MgAPgFKwABFtQEcwABFxIDAAEW8wCTf84D7AQABhMAARc/AJODIAMAAbHIGwABG9oDYwABF6MAARe/AAEnPAAC6RAAAAAEDwABGEMAASc8AAAADAgLAAEYYAAAAgYhgA8AAbFYAwABGIgAAAInOYAPAAGwfAAHAAEY1AAAAhQBbAWrAAEZAYAPAAGxbHGADwABsGAE+CE7AAEZVwABGXwAAg5pgA8AAbBgBFsAARoIWwABGYS65uMAARsqBiMAAR4FOwABGkwAAAIthYAPAAGwYAE7AAEamAAAAsKlgA8AAbBgAScAARrIlwABGuwCAwABGtsAk4wBgA8AAT48+Aj2MwABG1cAk420mwABG1QEWwABG4xTAAEbewCTjAAABYAPAAE+Pr/XAAE+RYAPAAGwYPY3AAEb0wCTjfhbAAEcCFMAARv3AJOMAAAFgA8AAT4+BiMAAT2w+Aj2MwABHG8Ak420mwABHGwGAwABHJMAk4wBgA8AAbBg9jcAARzDAJON+K0nAAEdJHMAAR1SEwABHTcAk420nAQABg8AAR1fAJONCAMAAbDY+AUrAAEdqATXAAEdxAAABAGADwABsGAGFwABHccAk434jHMAAR3GGwABHccAk5FwnAQABKwDAAGw2JwCGwABHccAk5FwBYAPAAGwYP0nAAEeJIhzAAEeUhcAAR43AJON+JwEAASsAwABsNgAhJsAAR58FgsAAR6DAJOMhYAPAAGxbPgFKwABH+gErPz0cwABIEi6sYAUABGrAAEgmYAOy28AAa92BwABIR8Ak4xAWwABIWoTAAEhTwCTjbYDgwABskRbAAEhiLoNtwABGwgGBMzHAAEh8YAOy7gEcwABJAxzAAEi/asAASIhdA7LnAWEDAWADwABsGGADss/AAGwHjW8BAAEWwABI7hbAAEjNLrm4wABGyoGIwABHgQCy64uMAwADFsAASSMugWfAAEbrFsAASWEWwABJQC65uMAARsqJzsAAR4IWwABJpRbAAEmgFsAASX8uubjAAEbKgYjAAEeBgODAAGyRALLWwABHEkrAAEm+AYXAAEnFwCTjfgbAAEb3gNjAAEnUwABJ2cAATJ0AALpFAAAAAQPAAEniwABMnQAAAAYGBsAASgAAAACG0F0DwABsGQFgA8AAWSAAwABKFwAAAIFMYAPAAGwYAMAASjYAAAC33F0DwABsGQFgA8AAWZgAwABKXQAAAIRWXQPAAGwZAWADwABBvwDAAEp0AAAAic5gA8AAbB8AwABKigAAALpCYAPAAGwfAABcAT4EScAASpshHMAASq6CwABKn8Ak5iMnAQABKwDAAGxiPgFBPgJOwABK3AAAADxdA8AAbEoBYAPAAFmYARbAAErcHgDAAGwvAQFdA8AAbCABYAPAAFmYAYLAAErcwCTmIwA9wABsS0UAAAEcwABK3IYAwCTmmj4AAAAAwABsTQA+Ak7AAErSAAAAtmZgA8AAWZgBFsAASuyGAMAk5ppAwABsTz4BScAASvYcwABLIxzAAEr6LrpGAQABFsAASxeHwABLEMAk5va6R8AAWZsAwABG+CcBAAEWwABLLYfAAEsmwCTm9oWKwABZnADAAGw2PgI9icAAS0TAJOYTFsAAS1GHwABLSsAk5vaBZ8AAWZ1CwABLZgA/P07AAEuZwABLqQAAukhgA8AAQQkBHMAAS7IWwABLqy6r+cAARrqKYAMAAhzAAEvALoFdAwADFsAAS80ugWfAAEbrgcAAS9jAJOYThcAAS93AJOZhAMAARvWEwABL6cAk5lEBjnsuwABIBz0cwABMIobAAEwSwCTnjLeDAwADLoPAAEw0wCTmOoTAAExBwCTmUQDAAEEhPRzAAExaFsAATFIurDnAAEbANgEAAR/AAExiwABCKAQABC6GwABMb8Ak54yDwABMgMAk5jqEwABMjcAk5lEAAMAAbEcGwABG+IDYwABMosAATKnAAE+OAAC6RgAAAAEDwABMvsAAT44AAAABAQHAAEzGAAAAukdgA8AAbBgAAGADwABsGAE+BknAAE0DIRzAAE0TgMAATQjAJOiOgSUBAAFqwABNHmADwABsGMABDWoAwABsgkrAAE0nAScAPz2IwABNNsAk6I4cwABNToDAAE1DwCTojoE9AQABFsAATV9qwABNWGADwABsGMABDWqA4MAAbJEAwABsh0nAAE1sIRzAAE2NFsAATX8WwABNeBbAAE1xLqv5wABGuoC+wABdfKvuwABZcK46AQABgMAATaDAJOiOALVfSsAATa0BJwA/TsAATczAAE3VAACJ7GADwABBCQEcwABN7hbAAE3mFsAATd8uq/nAAEa6q/3AAEf2KQEAAR7AAE3zwABuCgIAAAKBIieBI4EkgMAATg3AJOiOAMAAbGFJwABOIBzAAE4tgcAATiTAJOliJwEAASsAwABsXj4CTsAATk3AAE5ZAACJJGADwABBCQEcwABOYhbAAE5bLqv5wABGuopgAgAC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DUnAAF/7HMAAYASAwABf/8Ak98AnAQABKwDAAGw2PgE9HsAAYBW1PQQABCeVdyeBiILAAGAvwCT34BbAAGA7LoNtwABGwgA/ScAAYE8hHMAAYF2DwABgU8Ak9/EnAQABKwDAAGxePgE9HMAAYJIWwABgdRbAAGBuLqv5wABGuqwiwABdbYCcAgACg8AAYJPAJPfxgcAAYKDAJPfQAMAAbGM/ScAAYLccwABg3BbAAGC7Lrm4wABGyicBAAEWwABg3y65s8AARrsAwABsXj4BScAAYPslwABhCwCBwABg/8Ak99BgA8AAThQ+AT0XwABhMxTAAGEnwCT30AEBYAPAAE4UhAAuwABOFknAAGFPJcAAYV8AgcAAYVPAJPfQYAPAAEGcPgE9F8AAYZAUwABhhMAk99ABAWADwABBnIQALsAAQaJJwABhrCXAAGG8AIHAAGGwwCT30GADwABOqT4BQBzAAGHyFsAAYesUwABh38Ak99ABAWADwABOqYQAwABOrScBAAEuAMAAbF7AAGHfwABh+QA+AUrAAGITASbAAGITBR7AAGIatT0EAAQkwABiTQEWwABiQIHAAGI0wCT30IVOwABtLSe3goLAAGJdwCT34BbAAGJpLoNtwABGwgBgA8AAQC4+AUAcwABivRbAAGK2FsAAYpUuubjAAEbKhADAAEdtJwEAARbAAGLALrmzwABGuwDAAGxewABilcAAYtIATsAAYuTAAGLyAACJ+mADwABsWwEiJcAAYwAAgcAAYvTAJPfQYAPAAE2IACIWwABjKxTAAGMfwCT30AEBYAPAAE2IifrAAE2SARbAAGNIFMAAYzzAJPfQAQFgA8AATYiFAMAATZdJwABjWCIhhMAAY13AJPozABzAAGNzgMAAY27AJPfAJwEAARbAAGOXFsAAY3YuubjAAEbKgYjAAEeBAMAAbDY+AT0cwABjpS6sYAQABGrAAGO7YAOy28AAqcaCwABj3cAk9+BqwABj6WADwABsHwMWwABj8y6DbcAARsIAwABHEj9OwABkHMAAZCQAAIMSXQPAAGxfAmADwABsGGADwABALgEjhMAAZCbAJPozFsAAZF8WwABkPi65uMAARsqEmMAAR28jFsAAZIOBwABkd8Ak99CDf8AAQEkWwABkuxbAAGSaLrm4wABGyoLowABHcBbAAGTyFsAAZNEuubjAAEbKgxLAAEduAV0DwABsXwJgA8AAbBhgA8AAQC4BXQPAAGxfAmADwABsGGADwABALk7AAGUIwABlEQAAgZlgA8AAQC4BHMAAZRqFwABlE8Ak+xkpAQABgMAAZRvAJPfAAMAAbGFJwABlJxzAAGU0hsAAZSvAJPvGJwEAAYHAAGU3wCT30ADAAGxeSsAAZUQBhsAAZUvAJPvGP0nAAGVaIiEcwABlbxbAAGVqgcAAZV7AJPfQg2DAAEAwJwEAASsAwABsXgAhHMAAZYsWwABlhoHAAGV6wCT30INgwABAMCcBAAGGwABljsAk+8YAwABsXj4BPR7AAGWgtT4EAAQkwABl8gMWwABlyhbAAGXFgcAAZbnAJPfQg2DAAEAwg23AAEAzJ4QVFsAAZeYWwABl4YHAAGXVwCT30INgwABAMInOwABANCTAAGYsAzXAAGYBAAABAGADwABALgGGwABmAcAk+8YjHMAAZgGHwABmAcAk/OAnAQABKwDAAGxeKxbAAGYLh8AAZgHAJPzgg23AAEAzAWADwABsWCeEFTXAAGYWAAABAGADwABALgGGwABmFsAk+8YjHMAAZhaHwABmFsAk/TEnAQABKwDAAGxeKxbAAGYgh8AAZhbAJP0xic7AAEA0AWADwABsHxbAAGZEgcAAZjjAJPfQic7AAEA0FsAAZmaBwABmWsAk99CDbcAAQDMAPz0XwABmhoHAAGZ6wCT30INghsAAZo3AJPvGwABAMEnAAGabIiXAAGarAIHAAGafwCT30GADwABOqQAlwABmyACGwABmv8Ak+8ZgA8AATqk+BkAhJcAAZvcAFsAAZvIUwABm6cAk+8YGAWADwABOqYNgwABAWGADwABOqcAAZunAAGcIAE7AAGcZAAAAlXxgA8AAQC4ATsAAZzEAAACB0WADwABALgBJwABnPhbAAGdOFMAAZ0LAJPfQAQFgA8AATqmVfMAATq4+Aj2PwABnYsAk/i0UwABnbcAk99ABAWADwABOqT0VwABngsAk/j4IFMAAZ4rAJPvGBgFgA8AATqlJwABnoRbAAGeuFMAAZ6XAJPvGBgFgA8AATqmVfMAATq4+Aj2PwABnwsAk/i0UwABnzcAk+8YGAWADwABOqT0VwABn38Ak/j4IFMAAZ+fAJPfQAQFgA8AATqk/ScAAaAIhHMAAaA+HwABoBsAk/i0nAQABKwDAAGxePgE9HMAAaCIurGAFAAQcwABoTmrAAGgtXQOy5wFhAwFgA8AAbBhgA7LPwABxdI1vAQABgMAAaFzAJPfAALLrFsAAaHiHwABob8Ak/i2JzsAAQDRqwABohGADwABsHwMWwABoji6DbcAARsIBgTMxwABorGADsu4BHMAAaRwcwABo9WrAAGi8XQOy5wFhAwFgA8AAbBhgA7LPwABx2I1vAQABgMAAaQPAJPfAALLri4wDAAMWwABpKS6DbcAARsIWwABpOBTAAGkywCT+PggAic7AAEA0asAAaURgA8AAbB8DALLWwABHEj9KwABpbAE1wABpcwAAAQBgA8AATqkBFMAAaXPAJPvGBgFgA8AATqk1wABpkgAAAQBcARzAAGmSFsAAaYYUwABpc8AlABEJAKwgwABOrLf7AgACFsAAaaQUwABpmMAk99ABAWADwABOqawgwABOrDTAAGm9A8AAab3AAGpZAAAAAwMDwABpxQAAAIGIYAPAAGwYAMAAadMAAACBmWADwABALgDAAGnlAAAAhERgA8AAQC4AAGADwABALgE+AUrAAGn5ARzAAGoALreHBAAEFMAAaivAJQCMCgAUwABqMcAlAJwLABTAAGo7wCUArAwAgsAAakPAJPfgAMAARygAwABCchTAAGlzwCUAEQkAScAAamccwABqay66VgIAAobAAGqDwCT7xoHAAGqNwCT30ADAAEb+PgNOwABqqsAAarMAALpXYAPAAGwYAYDAAGq1wCT3wEnAAGrBhMAAasXAJPozPgFJwABq3hbAAGrngMAAauLAJPfAgVbAAGyNPgE9j8AAavzAJQFAFsAAaygWwABrBy65uMAARsqBiMAAR4E+AT2PwABrScAlAUAkwABrhAMWwABreBbAAGtXLrm4wABGyoGIwABHgSeA94DAAGt/wCT3wD89HMAAa54urGAFAAQcwABrx2rAAGupXQOy5wFhAwFgA8AAbBhgA7LPwABz5I1vAQABh8AAa9XAJQFAALLrgsAAa+rAJPfgFsAAa/+HwABr9sAlAUCA4MAAbJEWwABsE4HAAGwHwCT30INtwABAMwGBMzHAAGw/YAOy7gEcwABsqhzAAGyBasAAbE1dA7LnAWEDAWADwABsGGADss/AAHRIjW8BAAGHwABsj8AlAUAAsuuLjAMAAxbAAGzVhsAA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pAjAJSg2AwFgA8AATwWGXsAATwqEDIJqAMAAbEdJwACkPCXAAKRLAIPAAKRAwCUoNmADwABMaD4BPRzAAKSMFsAApHoWwACkci6BFcAARs2BbIKkNgEAARbAAKSlFsAApJsUwACkkMAlKDYDAWADwABMaIRHwABMbIQMgmoAwABsR0nAAKTGJcAApNUAg8AApMrAJSg2YAPAAE4UPgE9HMAApRMWwAClARbAAKT5LoEVwABGzYFsgqQ2AQABFsAApSkWwAClIhTAAKUXwCUoNgMBYAPAAE4UhETAAE4ZhAyCagDAAGxHPgE9HsAApVy1PQQABCeERCesIBbAAKWKg8AApX/AJSg2ic7AAEA0FsAApbWDwAClqsAlKDaDbcAAQDMAPwDAAEJzBsAARwaA2MAApf7AAKYPwACocAAAt4YBasAApf9gA8AAbFaAtQAAAQPAAKYZwACocAAAAAQEBMAApiEAAACBiGADwABsGADAAKYvAAAAhERgA8AAQC4AwACmOwAAAInOYAPAAGwfAMAApkwAAACEYGADwABsWwAAXAE+A07AAKZkwACmbQAAgZlgA8AAQC4BHMAApoMWwACmdy6sPMAARsGvDQIAAYDAAKaVwCUqqAGC5hbAAKaqgcAApqPAJSq4g3/AAEBJwABCZknAAKa5IRzAAKbGhMAApr3AJSruJwEAASsAwABsXj4BScAAptchHMAApuSEwACm28AlKu4nAQABgcAApufAJSq4AMAAbF4+AT0cwACnBRbAAKb5Lqw8wABGwbebAwACgMAApyHAJSqoHMAApzMut4cFAASAwACnT8AlKqiEwACnVcAlKu6BwACnX8AlKriCwACnZ8AlKsgBhGCDwACnjcAlKtjAAEcoAYLmFsAAp7OBwACnrMAlKriDf8AAQEnAAEJnPz4BPRzAAKflFsAAp9kurDzAAEbBt5sDAAKAwACn9MAlKqiBwACn+sAlKrgBguYWwACoEYHAAKgKwCUquIN/wABAScAAQmdJwACoJhbAAKgxgcAAqCrAJSq4tufAAEA+PgE9HMAAqFIWwACoRi6sPMAARsGERgEAASbAAKhfAYHAAKhfwCUquGADwABMaADAAEJwPwbAAEcHgNjAAKjTwACo18AAqZoAALlbAAAAAQPAAKjjwACpmgAAAAAAAABgA8AAbB8BPgROwACo8MAAqPoAALppYAPAAGwfARbAAKkCFsAAqPwug8vAAEblgODAAGxqPgJOwACpJwAAADxdA8AAbEoBYAPAAE8/ARbAAKknHgDAAGwvAQFdA8AAbCABYAPAAE8/ARbAAKknLoPLwABG5QA9wABsS0UAAAEcwACpJ4EAwCUs8z4AAAAAwABsTQA+Ak7AAKkiAAAAi0ZgA8AATz8BFsAAqS6BAMAlLPNAwABsTz4CPRzAAKk4gsAAqTbAJS1Sse8CAAIWwACpQi6aacAAQT0uAMAAT0U9HMAAqViCwACpVsAlLVKd1wEAAS4AwABPRj0cwACpeRbAAKlzLoPLwABG5Y3/AAAAAMAAbZ9KwACphgGAwACpjcAlLMYGwABHCIDYwACpn8AAqa/AAKqCAAC27AFqwACpoGADwABsVoC1AAABA8AAqcLAAKqCAAAAAQEBwACpwwAACIEmYAPAAEAuAABgA8AAbB8BPgROwACp0MAAqdYAAIpTYAPAAGwfAZNOwACp8cAAqfoAAD1dA8AAbEoBYAPAAEAuARbAAKoBLj3AAEFMQ8AAqg8cwACqH4LAAKoWwCUuRj4AAAAAwABsTT4BPYnAAKozwCUuMRzAAKo5gcAAqjPAJS4xgT8BAAEcwACqTRbAAKpFgsAAqjzAJS5GQMAAbE+27AEAAS4AwABAUwDAAGyISsAAqnIBgcAAqnnAJS4xBsAARumA2MAAqofAAKqewACsJwEAr44BasAAqohgA8AAbFaAtQAAAQPAAKqwwACsJwAAAAAAAABgA8AAbBgBPgFKwACr/gE1wACsBQAAAQBgA8AAbBgBFsAArAUugYjAAEbGIxzAAKwFgMAArAXAJS8kJwEAASsAwABsNiTAAKwjAye3xxbAAKwZLoNtwABGwieV6YDAAKwFwCUvJAFgA8AAbBgGwABHCYDYwACsLMAArD3AAK0yAAC3lgFqwACsLWADwABsVoC1AAABA8AArEnAAK0yAAAAAwMDwACsTgAAAInOYAPAAGwfAMAArF4AAACA4GADwABsHwDAAKxqAAAAg21gA8AAbFgAAFwBPgQ9HMAArIMWwACseS65tcAARsQ2AQABgsAArIfAJS/XAMAAbEc9HMAArJ8WwACslS65tcAARsQ2AQABgMAArKPAJS+3AMAAbEc9HMAArL4WwACstC65tcAARsQ2AQABgcAArMLAJS/HAMAAbEdJwACszyEcwACs4RbAAKzTLrm6wABGzCcBAAErAMAAbF4+AT0cwACs8i6sYAQABBbAAKz9Lrm6wABGzIDAAK0MwCUvt4HAAK0YwCUvx4LAAK0gwCUv1wDAAEcSPwbAAEcKgNjAAK03wACtPMAAr4MAALpqAAAAAQPAAK1RwACvgwAAAAEBAcAArVoAAACAlmADss8AAFwBPgFJwACtaRzAAK17FsAArW0uubrAAEbMJwEAASsAwABsXj4DScAArYwiFsAArZoWwACtkC65tcAARsSBVsAAbPMAHMAAraouJwEAARbAAK20FsAAra0uq/nAAEa6gWnAAEf/AMAAbF4+AT0cwACuQhbAAK47Lqv5wABGuqxgBAAEgMAArk3AJTDeHMAArlaUgVoAAAAAwABsj5QrAMAASA4/RcAArnIBwACue8AArn0AAIHUYAPAAGwfAZMBHMAAroSBwACugsAlMZeBOgEAARbAAK6QFsAAroYuubXAAEbEgODAAGxqAMAAbIUBicAArpjAJTGXHMAArpqBwACumMAlMZeBPwEAAZYAwABsiD4ETsAArq7AAK63AACOe2ADwABsWAEmwACurgEcwACuwhbAAK65Lrm1wABGxCkBAAGBwACuw8AlMZcAwABsuGADwABsWE7AAK7TwACu3gAAic5gA8AAbB8BJsAArtMBHMAArukWwACu4C65tcAARsQpAQABHMAAruyBwACu6sAlMZeBPwEAAZQAwABsiADAAGy4YAPAAGwfTsAArv7AAK8FAACA4GADwABsHwEmwACu/gEcwACvEBbAAK8HLrm1wABGxCkBAAEcwACvE4HAAK8RwCUxl4E/AQABlQDAAGyIAMAAbLhgA8AAbB89HMAAryEurGAEAASAwACvLMAlMN6DwACvNcAlMkSEwACvQcAlMpeCwACvScAlMgEAwABHEj0XwACvYi65uoDAAK9ywCUw3sAARsw/BsAARuqA2MAAr4jAAK+twACvywEAr+EBasAAr4lgA8AAbFaAtQAAAQPAAK+0wACvywAAAAAAAABgA8AARrcBSsAAr7cBNcAAr7cAAAEAYAPAAEa3ARbAAK+3Lrb5wABGziMcwACvt4DAAK+3wCUzeycBAAErAMAAbF4ugMAAr7fAJTN7AWADwABGtwbAAEbrgNjAAK/QwACv2MAAr/YBAIFnAAAAAQPAAK/iwACv9gAAAAAAAABgA8AAbFgBSsAAr+UBFsAAr+0WwACv5S6BFcAARs2BZ4KUBsAARwuA2MAAr/vAALAAwACwhgAAt5MAAAABA8AAsCDAALCGAAAAAAAAAFwBPgE9HMAAsCkut4IDAAMnlZsfwACwTMAAWUEDAANqwACwZWADiXKFsS4cwACwepSBWgAAAADAAGyPABzAALB/lIFaAAAAAMAAbI8AwABG/QbAAEcMgNjAALCLwACwkMAAsUIAALeUAAAAAQPAALCuwACxQgAAAAAAAABcAT4BPRzAALC3LreCAwADJ5WdH8AAsODAAFkxAwADasAAsQRgA4mOhvcuHMAAsS6UgVoAAAAAwABsjwAcwACxO5SBWgAAAADAAGyPAMAARv0GwABHDYDYwACxR8AAsVPAALIvAAC6awAAAAEDwACxX8AAsi8AAAAEBATAALFnAAAAgYhgA8AAbFYAwACxgAAAALILYAPAAE6bAMAAsawAAACBrV0DwABsGQFgA8AAQYYAwACxuwAAAInOYAPAAGwfAABgA8AAQYYBPgFKwACxzQEcwACx1C6MKgIAAh/AALHpwABOiwMAA4DAALH6wCU1L4HAALIAwCU1P4LAALIUwCU1TwCDwACyIMAlNWYAwABG7QbAAEcOgNjAALI0wACyQMAAsvAAALpsAAAAAQPAALJTwACy8AAAAAMDA8AAsmcAAACDU2ADwABBhgDAALKEAAAAum1dA8AAbBkBYAPAAEGGAMAAspAAAACJzmADwABsHwAAYAPAAEGGAT4BSsAAsqIBHMAAsqkujCoCAAIfwACytcAAXzACAAKAwACyzcAlNfGBwACy2MAlNgEAgsAAsuHAJTYYAMAARu0GwABHD4DYwACy9cAAswHAALPqAAC6bgAAAAEDwACzDMAAs+oAAAABAQHAALMRAAAAic5gA8AAbB8AAGADwABBhgE+AUrAALNFATXAALNMAAABAGADwABBhgEcwACzTC66awQABCeVnGrAALNwYAPAAE6bwADhCyuAwACzlcAlNpoAwABHDTXAALOpAAABAFwBHMAAs6mBwACzTMAlNruMIwEAAR/AALOywABPVgMAA2rAALPIYAOJgI17LoDAALPawCU2mgAAwABBkIHAALNMwCU2uwbAAEcQgNjAALTkwAC06cAAtkYAALo3AAAAAQPAALT8wAC2RgAAAAQEBMAAtQwAAACAlmADss8AwAC1GQAAAInOYAPAAGwfAMAAtSkAAACA4GADwABsHwDAALU1AAAAg21gA8AAbFgAAFwBPgFJwAC1RBbAALVILrnBwABG3j4BPRzAALVpLqxgBAAEgMAAtXTAJTdugcAAtX3AJTd8gsAAtYnAJTeMg8AAtZHAJTecAMAARxI+Aj0jHMAAtcAWwAC1ri65wsAARt8nAQABKwDAAGxiF8AAta4uucIxwAC11mADwABHmADAAEbfKwFdA8AAbBkBYAPAAEeYPRzAALX9FsAAteAuucLAAEbfNgEAAR/AALYFwABHnwQABIDAALYWwCU3boHAALYfwCU3fILAALYrwCU3jIPAALYzwCU3nAAAwABsRwbAAEcRgNjAALZLwAC2UMAAt98AALpvAAAAAQPAALZmwAC33wAAAAAAAABcAT4EPRfAALZvLrnBKcAARt5JwAC2kxzAALapFsAAtpcuucLAAEbfJwEAASsAwABsYkrAALayAD9FwAC2vgHAALbHwAC2yQAAgdRgA8AAbB8BkwEcwAC20IDAALbOwCU49YE6AQABFsAAtuQWwAC20i65wsAARt+A4MAAbGoAwABshQGIwAC27sAlOPUcwAC27IDAALbuwCU49YE/AQABlADAAGyIPgJOwAC3CsAAtxsAALpwYAPAAEeYARzAALcuFsAAtx0uucLAAEbfKQEAAYDAALcvwCU49QDAAGy4PRzAALc5LqxgBAAEFsAAt1WBwAC3RMAlOV+AlsAAR5oWwAC3b4HAALdewCU5X4nOwABHmxbAALeWgcAAt4XAJTlfgODAAEecFsAAt6+BwAC3nsAlOV+DbcAAR50AwABHEj0XwAC3wy65wivAAEbfBsAARxKA2MAAt+TAALgBwAC6aAAArGABasAAt+VgA8AAbFaAtQAAAQPAALgLwAC6aAAAAAgEBMAAuBsAAACAlmADss8AwAC4KAAAAInOYAPAAGwfAMAAuDgAAACA4GADwABsHwDAALhEAAAAg21gA8AAbFgABMAAuFkAAACx9mADwABsWwFqwAC4ZWADwABsWxzAALiHAAAAgTNdA8AAbBkBYAOy7gFqAGABwABsXALAALifAAAAgJdgA5OLAWoAYAHAAGxcAsAAuLQAAAC3hGADwABsWwFq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AGxjPgE9HMAA0UYurGAFAARqwADRUWADstvAANUMFsAA0XeEwADRdMAlS2aJzsAATmQWwADRmRbAANGUhMAA0ZHAJUtmgYjAAEGsgODAAGyRFsAA0aEug23AAEbCAYEzMcAA0cFgA7LuARzAANI8HMAA0hBqwADR010DsucBYQMBYAPAAGwYYAOyz8AA1TaNbwEAARbAANIhhMAA0h7AJUtmgYjAAEGsALLri4wDAAMWwADSYi6DbcAARsIWwADSdIXAANJrwCVLiYnOwABOZBbAANKOFsAA0omFwADSgMAlS4mBiMAAQayA4MAAbJEAstbAAEcSPgI9HMAA0tyCwADSycAlStWAnAIAAhbAANLghMAA0t3AJUtmgYjAAEGshMAA0ujAJUtmAMAAbGNJwADS9CXAANL+AIHAANL4wCVKEWADwABAez4BScAA06wcwADTuBbAANOzhMAA07DAJUtmgYjAAEGsJwEAARbAANPBFMAA07vAJUoRAQFgA8AAQHuBiMAATl0AwABsNj4BPRzAANPVLqxgBAAEasAA0+BgA7LbwADV+xbAANQLhMAA1AjAJUtmic7AAE5kFsAA1C8WwADUKoTAANQnwCVLZoGIwABBrIDgwABskRbAANQ3LoNtwABGwgDAAEcSPz9KwADUaQGCwADUcMAlStUGwABHGIDYwADUjMAA1JHAAN8XAAC6gQAAAAEDwADUqMAA3xcAAAAJCQnAANS3AAAAubZgA8AAbBgAwADU6QAAAIbQXQPAAGwZAWADwABZIADAANT9AAAAsDJgA8AAbB8AwADVFQAAALqCYAPAAGwYAMAA1UQAAACwr10DwABsGQFgA8AATx8AwADVZQAAAIGXYAPAAEGGAMAA1XUAAACtKmADwABsHwDAANWMAAAAtyVgA8AAbB8AwADVogAAAIppYAPAAGwfAABcAT4RTsAA1hzAANYoAACatmADwABHZQE1wADWKgAAAQBgA8AAR2UBHMAA1iouujwCAAJqwADWX2ADwABHT8ABDaaDwADWdcAlTs4AwABG8zXAANaMAAABAFwBHMAA1owUwADWKsAlT08JALlbAgAChMAA1pnAJU7eLgDAAEd8FMAA1irAJU9PCQBAHMAA1s0WwADWxhTAANa6wCVPOwkAhADAAEdtJwEAARbAANbQLrmzwABGuwDAAGxewADWusAA1uIATsAA1wTAANcMAACDEl0DwABsXwJgA8AAbBhgA8AAThQBJsAA1wQBFsAA1xoUwADXDsAlTzsJAIMSwABHbl0DwABsXwJgA8AAbBhgA8AAThROwADXQsAA108AAISYXQPAAGxfAmADwABsGGADwABOFAEmwADXQgEWwADXXRTAANdRwCVPOwkAhJjAAEdvXQPAAGxfAmADwABsGGADwABOFE7AANeKwADXkgAAguhdA8AAbF8CYAPAAGwYYAPAAE4UARbAANegFMAA15TAJU87CQCC6MAAR3BOwADXtMAA178AALp2YAPAAEJNAR/AANfFwABCeQUAAAWa9hTAANfbwCVP+woAgugUwADX9cAlUJsMAIQAHMAA2BQWwADYDi6aacAAQT239QEAAYTAANgmwCVO3gDAAEJgsiUkwADYYwInuoSDwADYVcAlTs6wsSpOwADYksAA2KAAALJNYAODgAE1wADYqgAAAQBgA5w/ARbAANiqLrgZwABG3CMcwADYqhTAANiqwCVRXA4AJwEAASsAwABsXiscwADYwRTAANiqwCVRXA4AlmgBAAGDwADY0cAlTs4AnE0BYAODgE7AANj3wADZCAAAr+pgA8AATGgBH8AA2Q7AAF9ACwALgcAA2S7AJU6ngsAA2UDAJU6+g8AA2VPAJU7OhMAA2WrAJU7ehcAA2YHAJU71FMAA2Y/AJVDSDQAuhsAA2bHAJU8Fh8AA2cbAJU8VFMAA2drAJU8lCAAUwADZ7cAlUUoOAAA9NcAA2g8AAAEAYAPAAF8HARbAANoPFsAA2ggWwADaAS6r+cAARrqAvsAAXXy5TMAARmQjHMAA2g8UwADaD8AlUjsQACcBAAErAMAAbF4rHMAA2iIUwADaD8AlUjsQALpbAgACFsAA2lQUwADaQ8AlUbgPAIRHwABMbIDAANpfwCVOlwDAAF8MAVw9HMAA2pEWwADaey62/8AARryN/wAAAADAAG2fTsAA2r/AANrTAAC6el0DwABsXwJgA8AAbBhgA8AATx8BHMAA2t0uunsCAAKEwADa8MAlTt4UwADa/8AlUbgPAADAAEcXT8AA2xbAANsbAAABunxhAwJgA8AAbBhgA8AAThRcAAPAANskwADbvQAAAAICAsAA2ywAAACBiGADwABsGADAANtAAAAAhERgA8AAThQAAFwBPgFD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FsABEGwuub7AAEawwABG1pZrAQABFMABEJvAJXJ2EwAAnF5JwAEQshTAARC2wCVwig4APgM9FcABENvAJXBdCxzAAREmFsABEPQuub7AAEawwABG1pZrAQABHsABEUXAAEy9BwAHFMABEWjAJXEBDwAUwAERjMAlcX8QABTAARGpwCVxxREAFMABEcjAJXINEgCEwAER6cAlb6EUwAESAcAlcIoOAGrAARI6YAPAAEzCwAEOBQAAnF49FcABElLAJXBsDBzAARKaFsABEmguub7AAEawwABG1pZpAQABHsABEsbAAEy9BwAHFMABEunAJXEBDwAUwAETDcAlcX8QABTAARMqwCVxxREAFMABE0nAJXINEgCEwAETasAlb6EUwAETgsAlcIoOAGrAARO7YAPAAEzCwAEOHQAAnFw9FcABE8/AJXB7DRzAARQXFsABE+Uuub7AAEawwABG1pZqAQABHsABFEDAAEy9BwAHFMABFGPAJXEBDwAUwAEUh8AlcX8QABTAARSkwCVxxREAFMABFMPAJXINEgCEwAEU5MAlb6EUwAEU/MAlcIoOAGrAARU1YAPAAEzCwAEONAAAnF0/PgI9FcABFWDAJXBOChzAARWGFsABFXAuuBnAAEbclmsBAAEUwAEVksAlcnYTAACcUEnAARWpFMABFa3AJXCKDgA+Az0VwAEV0sAlcF0LHMABFgEWwAEV6y64GcAARtyWawEAAR7AARYvwABMvQcABxTAARZSwCVxAQ8AFMABFnbAJXF/EAAUwAEWk8AlccURABTAARaywCVyDRIAhMABFtPAJW+hFMABFuvAJXCKDgBqwAEXJGADwABMwsABDgUAAJxQPRXAARc8wCVwbAwcwAEXaBbAARdSLrgZwABG3JZpAQABHsABF6PAAEy9BwAHFMABF8bAJXEBDwAUwAEX6sAlcX8QABTAARgHwCVxxREAFMABGCbAJXINEgCEwAEYR8Alb6EUwAEYX8AlcIoOAGrAARiYYAPAAEzCwAEOHQAAnE49FcABGKzAJXB7DRzAARjYFsABGMIuuBnAAEbclmoBAAEewAEZEMAATL0HAAcUwAEZM8AlcQEPABTAARlXwCVxfxAAFMABGXTAJXHFEQAUwAEZk8Alcg0SAITAARm0wCVvoRTAARnMwCVwig4AasABGgVgA8AATMLAAQ40AACcTz8/TsABGj7AARpLAACvL2ADwABMmQEfwAEaUcAATMELAAuBwAEabcAlb2qDwAEaf8Alb5GEwAEajcAlb6GCwAEam8Alb4EuhcABGrzAJW+xhsABGtDAJW/BFMABGufAJXBOCgAUwAEa/sAlcF0LABTAARsewCVwbAwAFMABGzvAJXB7DQAAPRfAARtiFMABG1XAJXakEwC6VRTAARt6wCVv8AkAwABMoT0cwAEblS63ggQAA4TAARugwCVvoRTAARumwCV2pBMAhcABG7TAJW+xAYQMNcABG9MAAAEAYAODzAEUwAEb08AlcE4KACMcwAEb0xTAARvTwCV3dhQAJwEAASsAwABsXisWwAEb4hTAARvTwCV3dhQAhAyCagFgA4J+wABG/UnAARvyIhzAARv7g8ABG/bAJW+RJwEAASsAwABsXgAcwAEcGBbAARwTFMABHAbAJXakEwCDYMAAQFgnAQABKwDAAGxePgFJwAEcxSIcwAEc2ofAARzJwCVv0ScBAAErAMAAbF4AFsABHPIUwAEc5cAldqQTAIO9wABOaz4BPRfAAR2FFMABHXjAJXakEwCOPGrAAR2XYAOJcoWxwABMvz4CPRfAAR5XFMABHkrAJXakEwCOPB/AAR5zwABbTQIAAhTAAR6FwCV2pBMAh8ABHpPAJW/RAMAATL89HMABHq4uuqMBAAEUwAEey8AldqQTAADAAEdFPz01wAEe+gAAAQBgA8AAXwcBFsABHvoWwAEe8xbAAR7sLqv5wABGuoC+wABdfLlMwABGZCMcwAEe+hTAAR76wCV4vxQAJwEAASsAwABsXiscwAEfFhTAAR76wCV4vxQAulsCAAIWwAEfOxTAAR8uwCV2pBMAg8HAAEyugMABH0LAJW9aAMAAXwwBXAbAAEccgNjAAR9gwAEfZcABJrUAALqkAAAAAQPAAR9zwAEmtQAAAA4NDcABH4IAAAC5tmADwABsGADAAR+0AAAAhtBdA8AAbBkBYAPAAFkgAMABH8gAAACwMmADwABsHwDAAR/lAAAAhQNgA8AAQYYAwAEgBAAAAYGIYAPAAGxWAMABIBcAAAC3jWADwABsGADAASBIAAAAsK9dA8AAbBkBYAPAAE8fAMABIHoAAACvQF0DwABsGQFgA8AATWgAwAEgjQAAALgaYAPAAGwfAMABIKgAAACJzmADwABsHwDAASC+AAAAuqVgA8AAbB8AwAEg3QAAALgbYAPAAGwfAMABIPkAAAC6pmADwABsGAABwAEhGAAAAK9HYAO+TQFqAGABwABsXAJcAT4KTsABIUTAASFWAAC5TGADwABfBwEWwAEhZhbAASFfFsABIVguq/nAAEa6gL7AAF18uUzAAEZkTsABIYkAAACyTWADhAIAScABIZwhHMABIcMWwAEhoC65vsAARrDAAEbWJwEAASsAwABsXj4BPRXAASHUwCV6qQ8cwAEiERbAASHuLrm+wABGsMAARtaWbgEAAYXAASIjwCV5yACcWz9OwAEiUsABImUAALg/YAPAAEv6AR/AASJrwABMNQ0ADYHAASKLwCV5gRzAASKngsABIp3AJXmYgfoBAAEcwAEiqWrAASKqYAPAAGwfA4H7AAAAAMAAbN8AwABs3oPAASLAwCV5qIXAASLUwCV5yIbAASLtwCV52IfAASMEwCV57y4UwAEjI8AlegYIABTAASM8wCV6FgkAFMABI1DAJXomCgAUwAEjbcAlejYLABTAASOEwCV6qQ8AFMABI5vAJXpGDAAAPTXAASOyAAABAGADwABfBwEUwAEjssAlenMOACMcwAEjshTAASOywCV71hEAJwEAASsAwABsXiscwAEjxRTAASOywCV71hEAulsCAAIWwAEj+RTAASPmwCV7ERAAjcnAAEwHgMABJAbAJXlxAMAAXwwBXD01wAEkIQAAAQBgA8AAXwcBFMABJCHAJXpzDgAjHMABJCEUwAEkIcAlfEkRACcBAAErAMAAbF4rHMABJDQUwAEkIcAlfEkRALqnAgACFsABJGkUwAEkVsAlexEQAI3JwABMB4TAASR2wCV5uADAAF8LAVw9HMABJIEuunsCAAKGwAEklMAledgUwAEko8AlexEQAADAAEcXPRzAASS8LreCBAADhcABJMfAJXnIFMABJNjAJXsREAAUwAEk7MAlehYJAAGEDDXAASULAAABAGADhAIBFMABJQvAJXqpDwAjHMABJQsUwAElC8AlfQ4RACcBAAErAMAAbF4rFsABJRoUwAElC8AlfQ4RAIQMgmoBYAOCfsAARv1JwAElKiEcwAElPxTAASUuwCV6RgwAJwEAASsAwABsNj4BPRzAASVQLrqoAQABFMABJWDAJXsREAAAwABHKz9JwAElfxbAASWWFMABJYPAJXsREACEwcAAQDg+Aj01wAElpwAAAQBgA8AAR2UBFsABJacuubjAAEbKIxzAASWnFMABJafAJX29EQAnAQABKwDAAGxeKxfAASXJFMABJafAJX29EQCEnCnAAEdzAWADwABsWz0XwAEmZxTAASZUwCV7ERAAr0c1wAEmhQAAAQBgA75NARTAASaFwCV6Vw0AIxzAASaFFMABJoXAJX4mEQAnAQABKwDAAGxeHsABJp6+UwEAARzAASaolIFaAAAAAMAAbI8AFMABJoXAJX4mEQABYAO+TcAAS/8/BsAARx2A2MABJrrAASa/wAE0JAAAhEkAAAABA8ABJsvAATQkAAAADg0NwAEm2gAAALm2YAPAAGwYAMABJwwAAACG0F0DwABsGQFgA8AAWSAAwAEnIAAAALAyYAPAAGwfAMABJz0AAACFA2ADwABBhgDAASdWAAAAgYhgA8AAbBgAwAEnfAAAALCvXQPAAGwZAWADwABPHwDAASeuAAAAr0BdA8AAbBkBYAPAAE1oAMABJ8sAAACDvmADhJIAwAEn2wAAALgaYAPAAGwfAMABJ/YAAACJzmADwABsHwDAASgMAAAAuqVgA8AAbB8AwAEoKwAAALgbYAPAAGwfAMABKEcAAAC6pmADwABsGAABwAEoZQAAAIn7YAPAAGxbAWoAYAHAAGxcAlwBPgpOwAEoisABKJwAALlMYAPAAF8HARbAASisFsABKKUWwAEoni6r+cAARrqAvsAAXXy5TMAARmRJwAEowxzAASjSg8ABKMfAJX7qJwEAASsAwABsXj4BScABKOMiHMABKOyHwAEo58AlfzgnAQABasABKP1gA4SShnYAwABsXgAewAEpE8AAbPcCAAKEwAEpHcAlfvoWwAEpMBrAASkjwABP5YGIiSIAPgE9i8ABKUHAJX7qHMABKU4uum4BAAEUwAEpWsAlf1YJAADAAEcPScABKXQcwAEpfYfAASl4wCV/OCcBAAFqwAEpjmADhJKFCQDAAGxePgE9i8ABKaDAJX7qHMABKa0uum4BAAEUwAEpucAlf1YJAADAAEcPPz9OwAEp4gAAALJNYAOESwBOwAEp/wAAALqpYAOESwBJwAEqGSEcwAEqLBbAASodLqwywABG2ycBAAErAMAAbF4+AUnAASo9IRzAASpkFsABKkEuub7AAEawwABG1icBAAErAMAAbF4+AUnAASp3HMABKoCHwAEqe8AlfzgnAQABasABKpFgA4SShQkAwABsXj4BPRXAASqlwCWA0g8cwAEq5hbAASrDLrm+wABGsMAARtaWagEAAYTAASr8wCV++gCcXT4BPRXAASsewCWA0g8cwAErXxbAASs8Lrm+wABGsMAARtaWaQEAAYTAASt4wCV++gCcXD4BScABK6AcwAEryhbAASvFFsABK6QuubjAAEbKg77AAEeAJwEAAWrAASvwYAPAAEdPwAENpgDAAGxePgROwAEsF8ABLCkAALqqYAPAAGxbASEcwAEsRBzAASw2gsABLCzAJX7agfoBAAFqwAEsOGADwABsH4WhAMAAbN4nAQABkwDAAGwyTsABLFvAASxoAAC6nmADwABsGAEewAEsf8AATuwFAAUpFMABLLbAJYIEEQCHwAEs18AlfzgWwAEtDBbAASzrLrm4wABGyoGIwABHgYTAAS0gwCV++gBJwAEtMSIUwAEtNcAlggQRAAAcwAEtT4fAAS1KwCV/OCcBAAFqwAEtYGADhJKFCQDAAGxePgE9FcABLXbAJYDSDxzAAS2sFsABLZYuuBnAAEbclmoBAAEUwAEtwsAlgk0SAACcTz4BPRXAAS3wwCWA0g8cwAEuJhbAAS4QLrgZwABG3JZpAQABFMABLj/AJYJNEgAAnE5JwAEuZBzAAS5th8ABLmjAJX84JwEAAWrAAS5+YAOEkoZnAMAAbF4+Ak7AAS6bwAEurwAAuqtgA8AAbBgBHsABLtbAAE7sBQAFKSpqwAEvQmADhJKGWBbAAS9/FsABL14uubjAAEbKgYjAAEeBhMABL5nAJX76AD0VwAEvrMAlgOEQHMABL+oWwAEvwy64GcAARtyWaQEAARTAATADwCWDYhMAAJxOPz4BScABMEAcwAEwSYfAATBEwCV/OCcBAAFqwAEwWmADhJKFCQDAAGxePgE9FcABMHDAJYDSDxzAATCWFsABMIAuuBnAAEbclmoBAAGEwAEwrMAlfvoAnE8+AT0VwAEw0sAlgNIPHMABMQgWwAEw8i64GcAARtyWaQEAAYTAATEhwCV++gCcTj9OwAExYcABMXIAALqsYAPAAE68AR/AATF4wABO9A8AD4HAATGWwCV+w4LAATGowCV+2oPAATG7wCV+6oTAATHPwCV++oXAATHdwCV/CobAATH0wCV/IYfAATIFwCV/OC4UwAEyIcAlf0YIABTAATI6wCV/VgkAFMABMk7AJX9mCgAUwAEya8Alf3YLABTAATKCwCWA0g8AFMABMpnAJYDhEAAUwAEyt8Alf4YMAAA9NcABMs4AAAEAYAPAAF8HARTAATLOwCV/tQ4AIxzAATLOFMABMs7AJYUXEgAnAQABKwDAAGxeKxzAATLhFMABMs7AJYUXEgC6WwIAAhbAATMTFMABMwLAJYRoEQCDvMAATsOAwAEzHsAlfrMAwABfDAFcPRzAATM5Lrp7AgAChcABM0zAJX8KFMABM1vAJYRoEQAAwABHFz0cwAEzci63ggQAA4TAATN9wCV++hTAATODwCWEaBEAFMABM5XAJX9WCQABhAw1wAEztAAAAQBgA4RLARTAATO0wCWA0g8AIxzAATO0FMABM7TAJYXcEgAnAQABKwDAAGxeKxbAATPDFMABM7TAJYXcEgCEDIJqAWADgn7AAEb9ScABM9MhHMABM+gUwAEz18Alf4YMACcBAAErAMAAbDY+AT0cwAEz+S66qAEAARTAATQJwCWEaBEAAMAARys/BsAARx6A2MABNCnAATQuwAFBkQAAuq0AAAABA8ABND7AAUGRAAAACwsLwAE0TQAAALm2YAPAAGwYAMABNH8AAACG0F0DwABsGQFgA8AAWSAAwAE0kwAAALAyYAPAAGwfAMABNKsAAACBiGADwABsVgDAATTUAAAAr0BdA8AAbBkBYAPAAE1oAMABNP8AAACvbWADwABZEQDAATUcAAAAuBpgA8AAbB8AwAE1NwAAAInOYAPAAGwfAMABNU0AAAC6pWADwABsHwDAATVsAAAAuBtgA8AAbB8AwAE1iAAAALqmYAPAAGwYAABcAT4STsABNazAATW3AACFA2ADwABBhgEcwAE1uS66awQABBbAATX3FsABNfAWwAE1zy65uMAARsqEAMAAR22BiMAAR4FqwAE2C2ADwABOm8AA4zcxwAE2PmADwABBhgCHwAE2SsAlhxQAwABHDU7AATa9wAE20AAAuq5gA8AAR2UBHMABNtIuujwCAAJqwAE3B2ADwABHT8ABDkwnurAAwABG807AATdgAAAAurFgA8AAbBgATsABN3rAATeKAAC3jWADwABsGAEcwAE3lC66RAMAAoPAATe2wCWGzYfAATe8wCWHFAGFACnAAEb2ScABN94hHMABN/IUwAE34sAliAsOACcBAAErAMAAbDY+AT0VwAE4A8Alh/oNFMABOBPAJYgLDgA+AT0VwAE4N8Alh/oNJsABODcBg8ABOEfAJYbNYAPAAGwYTsABOGLAAThwAACyTWADhEsBNcABOHIAAAEAYAOcUwEWwAE4ci65vsAARrDAAEbWIxzAAThyFMABOHLAJYiwDwAnAQABKwDAAGxeKxzAATifFMABOHLAJYiwDwCWaQEAARTAATi4wCWH+g0AAJxcAWADhEtOwAE43gAAALqsYAPAAE68AEnAATj0IRzAATkKhcABOPjAJYb0JwEAASsAwABsXj4BPRXAATkbwCWJEhAfwAE5MsAATwEPAA+BwAE5V8AlhqYcwAE5dmrAATlrYAPAAGwfhaGB1QEAAYLAATl4wCWGvQDAAGy6FMABOY3AJYdaCwAUwAE5o8Alh/oNABzAATm8LrqRAgACNcABOf4AAAEAXQPAAGwZAWADwABPHwEWwAE5/hbAATndLrm4wABGyrCvwABHgyMcwAE5/hTAATn+wCWJqREAJwEAASsAwABsYmrAATohXQPAAGwZAWADwABPH8ABDmEUwAE5/sAliakRAAFdA8AAbBkBYAPAAE8fFMABOk7AJYfEDAAAwABHLYTAATptwCWG3S6GwAE6kMAlhwSHwAE6q8AlhxQUwAE6wcAlhyQIABTAATrgwCWHNAkAFMABOvnAJYieDwArFMABOyLAJYdECgCFwAE7PsAlhvQAPgE9FcABO2XAJYkSEB/AATt8wABO9A8AD4HAATucwCWGphzAATu7asABO7BgA8AAbB+FoYHVAQABgsABO73AJYa9AMAAbLoUwAE70sAlh1oLABTAATvowCWH+g0AHMABPAEuupECAAI1wAE8QwAAAQBdA8AAbBkBYAPAAE8fARbAATxDFsABPCIuubjAAEbKsK/AAEeDIxzAATxDFMABPEPAJYrsEQAnAQABKwDAAGxiasABPGZdA8AAbBkBYAPAAE8fwAEOYRTAATxDwCWK7BEAAV0DwABsGQFgA8AATx8UwAE8k8Alh8QMAADAAEcthMABPLLAJYbdasABPNNgA4SShkQuhsABPPbAJYcEh8ABPRHAJYcUFMABPSfAJYckCAAUwAE9RsAlhzQJABTAAT1fwCWI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JamWg2DAAEAwJwEAASsAwABsXj4BScABa1kiIoXAAWtdwCWp0wAlwAFrdQCBwAFracAlqYZgA8AATqkAJcABa48AgsABa4nAJamWYAPAAE6pPgFKwAFsBwE1wAFsDgAAAQBgA8AATqkBFMABbA7AJamGAQFgA8AATqk1wAFsMgAAAQBcARzAAWwyFsABbCYUwAFsDsAlsr4NAKwgwABOrLf7AgACFsABbD4UwAFsOMAlqZYCAWADwABOqawgwABOrDTAAWxZA8ABbFnAAW0zAAAAAwMDwAFsYQAAAIGIYAPAAGwYAMABbG8AAACBmWADwABALgDAAWyBAAAAhERgA8AAQC4AAGADwABALgE+AUrAAWyXARzAAWyeLreHBgAEFMABbMvAJbM5DgAUwAFs0cAls0kPABTAAWzbwCWzWRAAg8ABbOPAJammAoRfhMABbQnAJam3hGCFwAFtHcAlqdPAAEcoAMAAQnIUwAFsDsAlsr4NAD8/TsABbYPAAW2MAACgJV0DsucBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyzwEjhMABbZbAJam3asABbaFdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHVAasABbbxdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHYjAV0DsucBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyz07AAW3iwAFt6gAAgJZgA7LPARzAAW31FMABbezAJbPcDQCNbwMAA4DAAW4DwCWpdhTAAW4JwCWrkwkAFMABbg7AJaukCgAAsus9HMABbh0urGAEAAQUwAFuKMAltH8OAIPAAW4xwCWppmrAAW49YAPAAGwfAxbAAW5HLoNtwABGwgDAAEcSTsABbpDAAW6gAAC6yV0DsucBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyzwEjhMABbqrAJam3asABbsFdA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHW5asABbu5dA7LnAWEDA2ADwABsGGADwABsWGADwABsWGADss/AAHaLAV0DsucBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyzz0VwAFvEsAltH8OHMABbywUwAFvHMAltQUPAI1vAwADgMABb0PAJal2FMABb8rAJauTCQAUwAFv18Alq6QKAACy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AgAAAFwABsAAShSA48AAXaHAAF2mwABd/AACvS4AAAABA8AAXb3AAF38AAAAAgICwABd0AAAIL0vXwMCAADAAF3sAAAgvTBfAwIAAABcAAbAAEoVgOPAAF7KwABe5MAAXwMAAoVEAWrAAF7LYAOmYcAAU3wAAAEDwABe8MAAXwMAAAABAQHAAF76AAAghRRfAwMAAABfAwQAAAbAAEoWgOPAAGBcwABgYcAAYJQAAr0xAAAAAQPAAGB6wABglAAAAAICAsAAYIAAAACxwmADwABsWwDAAGCPAAAghA1fAwAAAABcAAbAAEoXgOPAAGHWwABh28AAYgEAAr0yAAAAAQPAAGHuwABiAQAAAAEBAcAAYfQAAAC9M2ADwABsWwAAXAAGwABKGIDjwABjosAAY6fAAGPfAAK9NAAAAAEDwABjxMAAY98AAAABAQHAAGPPAAAgscVfAwEAAABcAAbAAEoZgOPAAGhVwABoWsAAaHcAAr01AAAAAQPAAGh1wABodwAAAAAAAABcAAbAAEoagOPAAGmQwABplcAAabkAAr02AAAAAQPAAGmuwABpuQAAAAEBAcAAabQAACCE+F8DAAAAAFwABsAAShuA48AAawbAAGsLwABrZwACvTcAAAABA8AAayfAAGtnAAAAAgICwABrOAAAILLqXwMDAADAAGtUAAAgstlfAwMAAABcAAbAAEocgOPAAGv4wABr/cAAbBkAAr04AAAAAQPAAGwXwABsGQAAAAAAAABcAAbAAEodgOPAAGyYwABsncAAbLQAAr05AAAAAQPAAGyywABstAAAAAAAAABcAAbAAEoegOPAAG6IwABujcAAbqwAAr06AAAAAQPAAG6qwABurAAAAAAAAABcAAbAAEofgOPAAG/RwABv1sAAcAAAAr07AAAAAQPAAG/twABwAAAAAAEBAcAAb/MAACCMzV8DAAAAAFwABsAASiCA48AAcTDAAHE1wABxYAACvTwAAAABA8AAcVXAAHFgAAAAAQEBwABxWwAAIIT4XwMAAAAAXAAGwABKIYDjwAByRMAAcknAAHJ/AAK9PQAAAAEDwAByVcAAcn8AAAACAgLAAHJhAAAghX5fAwIAAMAAcnYAACCFFF8DAwAAAF8DBAAABsAASiKA48AAc1jAAHNdwABzpQACvT4AAAABA8AAc3XAAHOlAAAAAgICwABz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AAC9HwFqwACKbWADwABsVoC1AAABA8AAipLAAIr3AAAAAAAAAFwBPgFKwACKmwEcwACKoi69RcAASa0CAVwCJ71lNMAAiswDwACKzMAAivIAAAAAAAAAXAFKwACK0gEcwACK2xbAAIrSLr1CwABJrcAASim9HwAAAADAAEr2AMAASmsGwABKTIDjwACK/MAAiw3AAIuAAAC9IAFqwACK/WADwABsVoC1AAABA8AAixzAAIuAAAAAAQEBwACLIgAAAL0hYAPAAGxbAABcAT4BPRzAAIsxLr1FwABJrQIBXAIkwACLUgMnvWaAwACLScAnARong6M0wACLVAPAAItUwACLewAAAAAAAABcAUrAAItaARzAAItjFsAAi1ouvULAAEmtwABKKb0gAQABgMAAi3PAJwEaAMAASvcAwABKawbAAEpNgOPAAIuFwACLlsAAjC8AAL0iAWrAAIuGYAPAAGxWgLUAAAEDwACLq8AAjC8AAAABAQHAAIu3AAAghYpfAwIAAABcAT4BPRzAAIvILr1FwABJrQIBXAIkwACL8QMnvWeAwACL5sAnAdYng6M0wACL+wPAAIv7wACMKgAAAAAAAABcAUrAAIwBARzAAIwKFsAAjAEuvULAAEmtwABKKb0iAQABgMAAjCDAJwHWAMAASvgAwABKawbAAEpOgOPAAIw0wACMRcAAjLAAAKx8AWrAAIw1YAPAAGxWgLUAAAEDwACMT8AAjLAAAAABAQHAAIxZAAAghRRfAwMAAABcAT4BPRzAAIxpLr1FwABJrQIBXAIkwACMhgMnvWiAwACMfMAnApAng6M0wACMiAPAAIyIwACMqwAAAAAAAABcAUrAAIyOARzAAIyXFsAAjI4uvULAAEmtwABKKax8AQABgMAAjKLAJwKQAMAASvkAwABKawbAAEpPgOPAAIy1wACMxsAAjU8AAL0jAWrAAIy2YAPAAGxWgLUAAAEDwACM0MAAjU8AAAABAQHAAIzaAAAghRRfAwMAAABgA8AAbFsBPgFKwACM6gEcwACM8S69RcAASa0DAWADwABsWwIkwACNDgMnvWmAwACNBMAnA0ong6M0wACNEAPAAI0QwACNMwAAAAAAAABgA8AAbFsBSsAAjRYBHMAAjR8WwACNFi69QsAASa3AAEopvSMBAAGAwACNKsAnA0oAwABK+gG9RinAAEpr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owMBXwMBAAMWwADS6ILAANLjwCc0fr2twABKloPAANLwwCc0k4DAANL8wCc0VwBOwADTK8AA0zkAAL2uXQPAAEpvAl8DAABfAwEAASMewADTO8AAbPcCAAKFwADTRcAnNPwWwADTVYLAANNQwCc0fr2twABKlgAuHMAA03YuvZDAAEmtAgACgcAA05fAJzRwH8AA07HAAEqqBAFfAwEABBbAANPKgsAA08XAJzR+vZXAAEqVhcAA09nAJzT8FsAA0/mCwADT9MAnNH69r8AASpcWwADUCILAANQDwCc0fr2XwABKmAAAwABKgQFdA8AASm8CXwMAAF8DAQBOwADUN8AA1EkAAL2wXQPAAEpvAl8DAABfAwEAASMiHsAA1FPAAGz3AgAChMAA1F3AJzS1FsAA1HSCwADUb8AnNH69lcAASpUAAB7AANSWwABs9wIAAoXAANSgwCc0/BbAANSwgsAA1KvAJzR+va3AAEqWAC4cwADU2S69kMAASa0CAAKBwADU/sAnNHAfwADVHMAASqoEAV8DAQAEhMAA1TDAJzS1hcAA1ULAJzT8FsAA1WaCwADVYcAnNH69r8AASpcWwADVdYLAANVwwCc0fr2XwABKmAAAwABKgQFdA8AASm8CXwMAAF8DAQBKwADVigEfwADVlcAASeUDAl8DAABfAwEAAy6HwADVw8AnNhiGwADV1sAnNUwABsAASoGA48AA1lLAANZswADXpAAAvZDAAEmtAAAAAQPAANZ/wADXpAAAAAICAsAA1pAAACCFFF8DAAAAwADWrgAAIL2xXQPAAEqTAV8DAQAAAF0DwABKbwJfAwAAXwMBAAE+A07AANbewADW7gAAvZRdA8AAbF8CXwMAAF0DwABKkwFfAwEAAR7AANb8wABuXAECXwMAAF0DwABKkwFfAwEAARbAANckLr2MwABKcgA9HMAA10aCwADXN8AnN5eAnAIAAoDAANdHwCc3YIHAANdTwCc3bgDAAGxjSsAA114BH8AA12nAAEqJAgJfAwAAXwMBAAIWwADXhS69i8AASnGCwADXkMAnN5cABsAASoSA48AA2d/AANoAwADcoQABhrwAAAABA8AA2hTAANyhAAACAAAEvM5gA8AAbFYBWwAABIR8YAPAAGxWAVsDAwPAANo5AAAAvPtdA8AASooCXwMCAF8DAwAAwADaZwAA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J2OvACdkuQAnZesAJ2hyACdprgAAAA4CwABKrIDjwAEhk8ABIZnAASMNA73dAAIAAAS8zmADwABsVgFbAAAEhHxgA8AAbFYBWwFdA8AASzACXwMAAF8DAQAAAAEEwABKr4DjwAEiQsABIlBYvd7AAEmtAF0DwABJ3AJfAwAAXwMBAAErAQXAAEqzgOPAASJVwAEiVcABIpkAAAADwAEiY8ABIpkAAAABAQHAASJ+AAAAin1dA8AASm8CXwMAAF8DAQAAAF0DwABKrAJfAwAAXwMBAAE/AQkAwAEiisAASzcBAAGAwAEikMAnaoIAAQbAAEqxgOPAASKewAEiscABIwsAAIFTAWrAASKfYAPAAGxWgLUAAAEDwAEiucABIwsAAAAAAAAAYAPAAGwYAUrAASLFASTAASMLBSe93xbAASLgLpymwABJrcAASzMnveAWwAEi+y693sAASa3AAEqvJ4OjAAAnasYAJ2s6AAAAAQLAAEq0gOPAASPEwAEjysABJPgDveEAAgAABLzOYAPAAGxWAVsAAASEfGADwABsVgFbAWADwABLHQAAAQTAAEq3gOPAASRqwAEkeAm93sAASa0AXQPAAEncAl8DAABfAwEAAAEFwABKu4DjwAEkfcABJH3AASSgAAAAA8ABJIvAASSgAAAAAQEBwAEkkQAABL3eXQPAAEncAl8DAABfAwEAAABdA8AASrQCXwMAAF8DAQABPwIIAcAASreAAMAna9AJAcABJH3AAEsfAAAAAAEGwABKuYDjwAEkpcABJLjAAST2AACBUwFqwAEkpmADwABsVoC1AAABA8ABJMDAAST2AAAAAAAAAGADwABsGAFKwAEkxgEkwAEk9gMnveIWwAEk5i693sAASa3AAEq3J4OjAAAnbBcAJ2x4AAAAAQLAAEq8gOPAASWSwAElmMABJ7MDveMAAgAABLzOYAPAAGxWAVsAAASEfGADwABsVgFbAWADwABLHQAAAgTAAEq/gOPAASZywAEmfVi95MAASa0AXQPAAEpvAl8DAABfAwEAASsEwABKwIDjwAEnJMABJzJYveXAAEmtAF0DwABKbwJfAwAAXwMBAAErAQXAAErEAAAAAAQAAAMAAAAAAAAAAABdA8AASrwCXwMAAF8DAQABPwEJAQDAAEsfAAAAAAEGwABKwoDjwAEnN8ABJ0rAASexAACB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Sq89F8ABMkQuiWXAAEmtFsABMl2CwAEyT8AndAu89cAASeDAAErTBsAASt2A48ABMm3AATJ+wAEyzwAAvP8BasABMm5gA8AAbFaAtQAAAQPAATKKwAEyzwAAAAAAAABcAT4BPRzAATKaFsABMpMum+zAAEmtwABK0TYBAAEfwAEyosAASrMBAl8DAwBfAwQAARbAATLBLollwABJrcAAStMAAMAAbEcGwABK3oDjwAEy1MABMuXAATOqAAC9AAFqwAEy1WADwABsVoC1AAABA8ABMu/AATOqAAAAAAAAAFwBPgJOwAEzF8ABMx8AAIEzXQPAAEqsAl8DAwBfAwQAASbAATM9ABzAATMwFsABMykum+zAAEmtwABK0YOTAAAAAMAAbQRdA8AASqwCXwMDAF8DBAA9F8ABM2QuiWXAAEmtHMABM28uvffAAEmtAgACFsABM32AwAEzdcAndUicpsAASa3AAEszFsABM58WwAEzkIDAATOIwCd1SL3ewABJrcAASq+89MAASd8AwABLGcAAStMGwABK34DjwAEzr8ABM8DAATUCAAC9AQFqwAEzsGADwABsVoC1AAABA8ABM87AATUCAAAAAgICwAEz2gAAIIV+XwMCAADAATPrAAAAgT5gA8AAbFsAAFwBPgJOwAE0EsABNB4AAI06XQPAAEpvAl8DAwBfAwQAARzAATQpFsABNCAuiWXAAEmtwABK0527AQABKgDAAEp6PRzAATRCLr34wABJrQIAAoDAATRgwCd2LyOBwAE0dMAndj0fwAE0jMAASeUDAl8DAwBfAwQAAxbAATSbLollwABJrcAAStMWwAE0pS6JZcAASa3AAErTgsABNK/AJ3ZTAB/AATTOwABJ5QMCXwMDAF8DBAADFsABNN0uiWXAAEmtwABK04LAATTnwCd2UxbAATT0LollwABJrcAAStMAAV0DwABJ3AJfAwMAXwMEAADAAEsaBsAASuCA48ABNQfAATUYwAE2IgAAvQIBasABNQhgA8AAbFaAtQAAAQPAATUtwAE2IgAAAAEBAcABNTkAACCwzV8DAgAAAFwBPgNOwAE1c8ABNXsAAIEzXQPAAErFAl8DAwBfAwQAASbAATWRABbAATWMFsABNYUum+zAAEmtwABK0YcPwABtOl0DwABKxQJfAwMAXwMEAD0XwAE1xYHAATW9wCd3jr3pwABJrRzAATXRLr32wABJrQEAAYDAATXgwCd3egDAAEsXwABKyD0XwAE19S6JZcAASa0WwAE2FxbAATYIgcABNgDAJ3eOvd7AAEmtwABKt7z1wABJ4MAAStMGwABK4YDjwAE2J8ABNjjAATiLAAC9AwFqwAE2KGADwABsVoC1AAABA8ABNkfAATiLAAAAAgICwAE2WgAAIL0EXwMCAADAATZ8AAAgsMxfAwIAAABcAT4ETsABNrbAATa+AACBM10DwABKxQJfAwMAXwMEAAEmwAE23AAcwAE2zxbAATbILpvswABJrcAAStGDkwAAAADAAG0EXQPAAErFAl8DAwBfAwQATsABNyfAATcwAAC9+V0DwABJ3AJfAwMAXwMEAAEWwAE3OoLAATcywCd4nb3pwABJrcAASshOwAE3aMABN3EAAL36XQPAAEncAl8DAwBfAwQAARzAATdzLr32wABJrQEAAYHAATeCwCd4iQDAAEsXPRzAATeXLr34wABJrQIAAoDAATe1wCd4ex/AATfYwABJ5QMCXwMDAF8DBAADHMABN/QuvffAAEmtAgACFsABOAODwAE3+sAneO6888AASd4WwAE4E4TAATgKwCd5I7zzwABJ3gDAAEsZHMABOCcuvffAAEmtAgACFsABODaDwAE4LcAneO689MAASd8WwAE4R4TAATg+wCd5I7z0wABJ3wDAAEsZHMABOFwuvffAAEmtAgACFsABOGuDwAE4YsAneO689cAASeAWwAE4fYTAATh0wCd5I7z1wABJ4ADAAEsZAADAAEsaBsAASuKA48ABOJDAATihwAE5fAAAvQUBasABOJFgA8AAbFaAtQAAAQPAATi2wAE5fAAAAAEBAcABOMIAACCFil8DAgAAAFwBPgNOwAE48sABOQAAAL3qXQPAAEncAl8DAwBfAwQAARzAATkCLr32wABJrQEAAYDAATkRwCd6egDAAEsXPRzAATkoFsABOSEum+zAAEmtwABK0TYBAAEfwAE5MMAASswBAl8DAwBfAwQAAYHAATlEwCd6jgAAwABsRz0XwAE5WS6JZcAASa0WwAE5coHAATlkwCd6jrz0wABJ38AAStMGwABK44DjwAE5gcABOZLAATslAAC9BgFqwAE5gmADwABsVoC1AAABA8ABOafAATslAAAAAQEBwAE5sgAAILFxXwMBAAAAXAE+BU7AATnpwAE57gAAg0JdA8AASdIBXwMDAAEcwAE6CxbAATn4Lr3ywABJrcAASte84cAASa0BAAGAwAE6G8Ane2AAwABJwU7AATpSwAE6WgAAgTNdA8AASrwCXwMDAF8DBAABH8ABOmjAAErEAAJfAwMAXwMEAAAAPRzAATqbFsABOpQum+zAAEmtwABK0TYBAAGCwAE6n8Ane7kAwABsRz0XwAE6rS6JZcAASa0cwAE6wRbAATq4LollwABJrcAAStO9kQIAAhbAATrYgcABOtPAJ3t0il/AAEmtwABJ1RbAATrngcABOuLAJ3t0vNPAAEmtwABJ1gDAAEp4wABK0z0cwAE7ChbAATr3Lr3uwABJrcAAStKAnAIAAoDAATsLwCd7YILAATsawCd7uQDAAGxjBsAASuSA48ABOyrAATs7wAE8BAAAvQcBasABOytgA8AAbFaAtQAAAQPAATtVwAE8BAAAAAAAAABcAT4CTsABO4PAATuLAACBM10DwABKvAJfAwMAXwMEAAEmwAE7oQAWwAE7nBbAATuVLpvswABJrcAAStGHD8AAbTpdA8AASrwCXwMDAF8DBAA9F8ABO84uiWXAAEmtHMABO9kuvffAAEmtAgACFsABO98uiWXAAEmtwABK0xbAATvxgMABO+nAJ3zhveXAAEmtwABKwADAAEsZwABK0wbAAErlgOPAATwJwAE8GsABPQoAAL0IAWrAATwKYAPAAGxWgLUAAAEDwAE8KcABPQoAAAABAQHAATw1AAAghYpfAwIAAABcAT4CTsABPGvAATxzAACBM10DwABKvAJfAwMAXwMEAAEmwAE8kQAcwAE8hBbAATx9LpvswABJrcAAStGDkwAAAADAAG0EXQPAAEq8Al8DAwBfAwQAPRfAATy+LollwABJrRzAATzJLr33wABJrQIAAhbAATzpHMABPM8uvfbAAEmtAQABgMABPN7AJ32xAMAASxe89cAASeAWwAE8+oHAATzywCd9xb3kwABJrcAASr8AwABLGcAAStMGwABK5oDjwAE9D8ABPSDAAUDHAAC9CQFqwAE9EGADwABsVoC1AAABA8ABPS7AAUDHAAAAAwICwAE9OgAAIL0KXwMCAADAAT1WAAAgvQtfAwIAAAHAAT1wAAAAvQxgA8AAbFsBasABPXtgA8AAbFscXAE+B07A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Al8DAwBfAwQAASbAAUlNABzAAUlAFsABSTkum+zAAEmtwABK0YOTAAAAAMAAbQRdA8AASzgCXwMDAF8DBAA9F8ABSX0uiWXAAEmtHMABSYguvffAAEmtAgACFsABSY4uiWXAAEmtwABK0xbAAUmggMABSZjAJ4lqnKbAAEmtwABLOwDAAEsZwABK0wbAAErvgOPAAUmzwAFJxMABS14AAL0XAWrAAUm0YAPAAGxWgLUAAAEDwAFJ3MABS14AAAABAQHAAUniAAAghA1fAwAAAABcAT4FTsABShLAAUoXAACDQl0DwABJ0gFfAwMAARzAAUo0FsABSiEuvfLAAEmtwABK17zhwABJrQEAAYDAAUpEwCeKPgDAAEnBPRfAAUpRLr3xwABJrRzAAUpPFsABSlEuvfHAAEmtwABK1oE/AQABlADAAGyIwABK1j0XwAFKbC6JZcAASa0cwAFKgBbAAUp3LollwABJrcAAStO9kQIAAmrAAUqSXQPAAGwZAWABwABsXMAAVWIWwAFKoYHAAUqcwCeKUopfwABJrcAASdUAwABKeMAAStM9HMABSrcWwAFKsC6b7MAASa3AAErRNgEAAR/AAUq/wABLNwECXwMDAF8DBAABFsABSs4uiWXAAEmtwABK0wAAwABsRz0XwAFK3i6JZcAASa0cwAFK8hbAAUrpLollwABJrcAAStO9kQIAAhbAAUshFsABSxcWwAFLBC698sAASa3AAErXvNDAAEmtwABJsopfwABJrcAASdUWwAFLUBbAAUtGFsABSzMuvfLAAEmtwABK17zQwABJrcAASbK808AASa3AAEnWAMAASnjAAErTBsAASvCA48ABS2PAAUt0wAFMZAAAvRgBasABS2RgA8AAbFaAtQAAAQPAAUuKwAFMZAAAAAAAAABcAT4EPRfAAUuVLr3xwABJrRzAAUuTFsABS5UuvfHAAEmtwABK1kQBAAGUAMAAbOHAAErWQBzAAUvNFsABS7cuvfHAAEmtwABK1oPXAQABkwDAAG0UwAFLt8ABS9EATsABS/fAAUv/AACBM10DwABLMAJfAwMAXwMEAAEmwAFMHQAcwAFMEBbAAUwJLpvswABJrcAAStGDkwAAAADAAG0EXQPAAEswAl8DAwBfAwQAPRfAAUxELollwABJrRbAAUxXgMABTE/AJ4yMnKbAAEmtwABLM8AAStMGwABK8YDjwAFMacABTHrAAU18AAC9GQFqwAFMamADwABsVoC1AAABA8ABTIXAAU18AAAAAQEBwAFMkAAAIIC+XwMBAAAAXAE+A07AAUzDwAFMywAAgTNdA8AASrwCXwMDAF8DBAABHMABTOAWwAFMzS697sAASa3AAErSKQEAAYDAAUzhwCeNPADAAGxhScABTO4hHMABTPqBwAFM8sAnjVAnAQABKwDAAGxePgE9F8ABTROBwAFNC8AnjVC95MAASa0cwAFNIS6998AASa0CAAIWwAFNL4HAAU0nwCeNUL3kwABJrcAASr8WwAFNPC6JZcAASa3AAErTAMAASxnAAEq/Pz0XwAFNUS6JZcAASa0cwAFNZRbAAU1cLollwABJrcAAStOduwEAASoAwABKesAAStMGwABK8oDjwAFNgcABTZLAAU6dAAC9GgFqwAFNgmADwABsVoC1AAABA8ABTaDAAU6dAAAAAQEBwAFNqwAAIIC+XwMBAAAAXAE+A07AAU3ewAFN5gAAgTNdA8AASrwCXwMDAF8DBAABHMABTfsWwAFN6C697sAASa3AAErSKQEAAYDAAU38wCeOcQDAAGxhScABTgkhHMABThWBwAFODcAnjoUnAQABKwDAAGxePgE9F8ABTi6BwAFOJsAnjoW95cAASa0cwAFOPy6998AASa0CAAIWwAFOTYHAAU5FwCeOhb3lwABJrcAASsAWwAFOXS6JZcAASa3AAErTAMAASxnAAErAPz0XwAFOci6JZcAASa0cwAFOhhbAAU59LollwABJrcAAStOduwEAASoAwABKesAAStMGwABK84DjwAFOosABTrPAAU7xAAC9GwFqwAFOo2ADwABsVoC1AAABA8ABTr3AAU7xAAAAAAAAAFwBPgE9F8ABTsYuiWXAAEmtHMABTtoWwAFO0S6JZcAASa3AAErTnbsBAAEqAMAASnrAAErTBsAASvSA48ABTvbAAU8HwAFPwQAAvRwBasABTvdgA8AAbFaAtQAAAQPAAU8bwAFPwQAAAAAAAABcAT4CTsABT0PAAU9LAACBM10DwABLMAJfAwMAXwMEAAEmwAFPaQAcwAFPXBbAAU9VLpvswABJrcAAStGDkwAAAADAAG0EXQPAAEswAl8DAwBfAwQAPRfAAU+QLollwABJrRzAAU+bLr33wABJrQIA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AEsEgOPAAWNpwAFjesABY9kAAIVEAWrAAWNqYAPAAGxWgLUAAAEDwAFjhsABY9kAAAABAQHAAWOQAAAghRRfAwMAAABfAwQAAT4BSsABY6ABNcABY8IAAAEAXQPAAGwZAV8DBAABFsABY8IcwAFjsBbAAWOnLollwABJrcAAStODQwEAAYDAAWO4wCeiTQDAAEp2vZXAAEqVIxzAAWPCgcABY8LAJ6JqJwEAASsAwABsYisWwAFj0YHAAWPCwCeiaocPwABtOgFfAwQABsAASwWA48ABY97AAWPvwAFlqAAAvTEBasABY99gA8AAbFaAtQAAAQPAAWQIwAFlqAAAAAICAsABZA4AAACxwmADwABsWwDAAWQdAAAghA1fAwAAAABcAT4DTsABZE3AAWRSAACDQl0DwABJ0gFfAwMAARzAAWRvFsABZFwuvfLAAEmtwABK17zhwABJrQEAAYHAAWR/wCejKwDAAEnBTsABZLLAAWS6AACBM10DwABLOAJfAwMAXwMEAAEmwAFk0AAWwAFkyxbAAWTELpvswABJrcAAStGHD8AAbTpdA8AASzgCXwMDAF8DBABJwAFlAIDAAWUEwCejGz4BPRfAAWUWLollwABJrRzAAWU9FsABZTODwAFlK8Ano4ScpsAASa3AAEs7vZECAAIWwAFlVILAAWVPwCejP4pfwABJrcAASdUWwAFlY4LAAWVewCejP7zTwABJrcAASdYAwABKeMAAStM+AT0XwAFlgi6JZcAASa0WwAFllYPAAWWNwCejhJymwABJrcAASzvAAErTBsAASwaA48ABZa3AAWW+wAFoGwAAvTIBasABZa5gA8AAbFaAtQAAAQPAAWXRwAFoGwAAAAEBAcABZdcAAAC9M2ADwABsWwAAXAE+BU7AAWYTwAFmGwAAgTNdA8AASzgCXwMDAF8DBAABJsABZjkAHMABZiwWwAFmJS6b7MAASa3AAErRg5MAAAAAwABtBF0DwABLOAJfAwMAXwMEAE7AAWaDwAFmjgAAvf5dA8AASm8CXwMDAF8DBAABFsABZpiBwAFmkMAnpMC95MAASa3AAEq/PYrAAWc3wCelERzAAWdELr33wABJrQIAAoLAAWdKwCelERbAAWdWLollwABJrcAAStMAwABLGUnAAWe3IYDAAWe8wCekqj2KwAFnysAnpREcwAFn1y6998AASa0CAAKCwAFn3cAnpREWwAFn8YHAAWfpwCekwJymwABJrcAASzsAwABLGT89F8ABaAIuiWXAAEmtgsABaA3AJ6URwABK0wbAAEsHgOPAAWggwAFoMcABaTAAAL00AWrAAWghYAPAAGxWgLUAAAEDwAFoTsABaTAAAAABAQHAAWhZAAAgscVfAwEAAABcAT4DTsABaJjAAWigAACBM10DwABLOAJfAwMAXwMEAAEfwAForsAASz8BAl8DAwBfAwQAARbAAWjWLollwABJrcAAStMAPRzAAWjsFsABaOUum+zAAEmtwABK0TYBAAGBwAFo8MAnpjAAwABsRz0cwAFpERbAAWj+Lr3uwABJrcAAStKAnAIAAoDAAWkSwCemHIHAAWklwCemMADAAGxjBsAASwiA48ABaTXAAWlGwAFpowAAvTUBasABaTZgA8AAbFaAtQAAAQPAAWlhwAFpowAAAAAAAABcAT4BPRzAAWlxFsABaWoum+zAAEmtwABK0TYBAAEfwAFpecAAS0gBAl8DAwBfAwQAARbAAWmVLollwABJrcAAStMAAMAAbEcGwABLCYDjwAFpqMABabnAAWulAAC9NgFqwAFpqWADwABsVoC1AAABA8ABadLAAWulAAAAAQEBwAFp2AAAIIT4XwMAAAAAXAE+Bk7AAWoIwAFqDQAAg0JdA8AASdIBXwMDAAEcwAFqKhbAAWoXLr3ywABJrcAASte84cAASa0BAAGAwAFqOsAnp4IAwABJwU7AAWphwAFqaQAAgTNdA8AAS0ACXwMDAF8DBAABJsABan8AFsABanoWwAFqcy6b7MAASa3AAErRhw/AAG06XQPAAEtAAl8DAwBfAwQATsABar3AAWrIAAC+B10DwABKbwJfAwMAXwMEAAEWwAFq0oLAAWrKwCen25ymwABJrcAASzNOwAFq+8ABawcAAL4IXQPAAEpvAl8DAwBfAwQAARzAAWscg8ABaxHAJ6govZECAAIWwAFrM4HAAWsuwCenlopfwABJrcAASdUWwAFrQoHAAWs9wCenlrzTwABJrcAASdYAwABKeD0XwAFrWoLAAWtSwCen274JwABJrYTAAWtpwCeoXcAAS0M9F8ABa4KCwAFresAnp9u+CsAASa0WwAFrmS6JZcAASa3AAErTwABLRAbAAEsKgOPAAWuqwAFru8ABbWkAAL03AWrAAWurYAPAAGxWgLUAAAEDwAFr18ABbWkAAAACAgLAAWvoAAAgsupfAwMAAMABbAQAACCy2V8DAwAAAFwBPgROwAFsOsABbEIAAIEzXQPAAEtAAl8DAwBfAwQAASbAAWxYABbAAWxTFsABbEwum+zAAEmtwABK0YcPwABtOl0DwABLQAJfAwMAXwMEAD0XwAFsfC6JZcAASa0WwAFsj4LAAWyHwCepZb4JwABJrcAAS0PAAErTScABbKEhHMABbLeAwAFspcAnqUMnAQABKwDAAGxePgE9F8ABbMguiWXAAEmtHMABbNwWwAFs0y6JZcAASa3AAErTrHwBAAGAwAFs58AnqUMAwABKd8AAStM/ScABbQUhHMABbRyBwAFtCcAnqVEnAQABKwDAAGxePgE9F8ABbS0uiWXAAEmtHMABbUEWwAFtOC6JZcAASa3AAErTrHwBAAGBwAFtTMAnqVEAwABKd8AAStM/BsAASwuA48ABbW7AAW1/wAFuWAAAvTgBasABbW9gA8AAbFaAtQAAAQPAAW2ZwAFuWAAAAAAAAABcAT4CTsABbb7AAW3GAACBM10DwABLQAJfAwMAXwMEAAEmwAFt3AAWwAFt1xbAAW3QLpvswABJrcAAStGHD8AAbTpdA8AAS0ACXwMDAF8DBAA9F8ABbgiAwAFuAMAnqsu+CsAASa0cwAFuJy6998AASa0CAAIWwAFuNYDAAW4twCeqy74KwABJrcAAS0QWwAFuSy6JZcAASa3AAErTAMAASxnAAEtEBsAASwyA48ABbl3AAW5uwAFvHQAAvTkBasABbl5gA8AAbFaAtQAAAQPAAW6DwAFvHQAAAAAAAABcAT4CTsABbqjAAW6wAACBM10DwABLQAJfAwMAXwMEAAEmwAFuzgAcwAFuwRbAAW66LpvswABJrcAAStGDkwAAAADAAG0EXQPAAEtAAl8DAwBfAwQAPRfAAW7yLollwABJrRbAAW8FgMABbv3AJ6upvgrAAEmtwABLRMAAStMGwABLDYDjwAFvIsABbzPAAW+SAAC9OgFqwAFvI2ADwABsVoC1AAABA8ABb1DAAW+SAAAAAAAAAFwBPgE9HMABb2AWwAFvWS6b7MAASa3AAErRNgEAAR/AAW9owABLSAECXwMDAF8DBAABFsABb4QuiWXAAEmtwABK0wAAwABsRwbAAEsOgOPAAW+XwAFvqMABcQ4AAL07AWrAAW+YYAPAAGxWgLUAAAEDwAFvv8ABcQ4AAAABAQHAAW/FAAAgjM1fAwAAAABcAT4DTsABb/3AAXACAACDQl0DwABJ0gFfAwMAARzAAXAfFsABcAwuvfLAAEmtwABK17zhwABJrQEAAYDAAXAvwCes2QDAAEnBTsABcF7AAXBmAACBM10DwABLQAJfAwMAXwMEAAEmwAFwhAAcwAFwdxbAAXBwLpvswABJrcAAStGDkwAAAADAAG0EXQPAAEtAAl8DAwBfAwQAPRfAAXCoLollwABJrRzAAXC8FsABcLMuiWXAAEmtwABK072ZAwADFsABcM4uvPvAAErPFsABcOaCwAFw3sAnrTK+CsAASa3AAEtEFsABcQGBwAFw/MAnrO2KX8AASa3AAEnVAMAASnnAAErTBsAASw+A48ABcRPAAXEkwAFyrAAAvTwBasABcRRgA8AAbFaAtQAAAQPAAXFEwAFyrAAAAAEBAcABcUoAACCE+F8DAAAAAFwBPgROwAFxesABcX8AAINCXQPAAEnSAV8DAwABHMABcZwWwAFxiS698sAASa3AAErXvOHAAEmtAQABgMABcazAJ64lAMAAScFOwAFx08ABcdsAAIEzXQPAAEtAAl8DAwBfAwQAASbAAXHxABbAAXHsFsABceUum+zAAEmtwABK0YcPwABtOl0DwABLQAJfAwMAXwMEAD0XwAFyHYLAAXIVwCeufr4KwABJrRbAAXI0LollwABJrcAAStPAAEtEPRfAAXJCLollwABJrRzAAXJNLr33wABJrQIAAhbAAXJTLollwABJrcAAStMcwAFydxbAAXJtgsABcmXAJ65+nKbAAEmtwABLM72RAgACFsABco6BwAFyicAnrjmKX8AASa3AAEnVFsABcp2BwAFymMAnrjm808AASa3AAEnWAMAASngAwABLGcAAStMGwABLEIDjwAFyscABcsLAAXOJAAC9PQFqwAFysmADwABsVoC1AAABA8ABcs7AAXOJAAAAAgICwAFy2gAAIIV+XwMCAADAAXLvAAAghRRfAwMAAABfAwQAAT4CPRzAAXL/Lr34wABJrQIAAoDAAXMUwCevth/AAXMkwABLVAICXwMDAF8DBAACFsABczYuiWXAAEmtwABK04HAAXNAwCevxAAAwABLGkrA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Lr6RwABMUrHvBAAEFqovgaojwCg/2ZppwABBDhaqNi6JzsAATmQWqkIug23AAE5lgKpLwCg/ywDAAE57PRyqaxaqYC65TcAATFOx7wQABBaqioGqfsAoP9maacAAQQ4WqpEuic7AAE5kFqqdLoNtwABOZYCqpsAoP8sAwABOez0cqsQWqrsuhZbAAExUse8EAAQWqtqBqs7AKD/ZmmnAAEEOFqrhLonOwABOZBaq7S6DbcAATmWAqvbAKD/LAMAATntOqx+rMQAAvp5gA8AATJkBJqsfARyrMy63AgEAASeDKADAAEDdYAPAAEyZPRyrZIKrUsAoQQ+sjgEAAYCrasAoP8sAwABMuk6rhauQAAC+n2ADg8wBFqukgquSwChBD4PBwABMrk6rwqvTAAC+oGADwABMmQEmq8IBHKvVLrcCAQABJ4R1AMAAQN1gA8AATJk9HKwFhKv0wChBdKyOAQABgKwLwCg/ywDAAEy6TqwmrDAAAL6hYAODzAEWrEOErDLAKEF0g8HAAEyuTqxfrG8AAL6ZYAPAAE68ASasXwEcrHEutwIBAAEngVMAwABA3WADwABOvD0XrKOGrJPAKEHZhPgfrK6IsAEAAR+sy4V5AgACH6zhh1wAAAAAhazzwChBuwAAwABNq06tFa0cAACBpl0DwABsGQFgA4UaATGtKmADhRoASa0yIRytSBatNi66tMAATFAnAQABKwDAAGxiPgE+Ak6tgwAAADxdA8AAbEoBYAPAAExfARatgx4AwABsLwEBXQPAAGwgAWADwABMXwEWrYMuurTAAExQAD3AAGxLRQAAARytgxQAwChCcwgAPgAAAADAAGxNAD4CTq1vAAAAvppgA8AATF8BFq2WFADAKEJzCABAwABsTz4BSa2gIRyttRStpMAoQswJACcBAAErAMAAbF4+Ak6t0q3eAACatmADwABALgEcreAutwIBAAEWrgIUrfHAKELMCQCBiMAATGIAwABA3UmuExauIxSuF8AoQwkKAIn3wABAOz4DTq5NrloAAK8vYAPAAEyZASauTQEUrlzAKEMJCgBgA8AATJk9HK6CFK51wChDUAsArI4BAAGArojAKD/LAMAATLo9HK6sh66lwChCNzYBAAEfrrSF0QEAARauyxSuvsAoQ1ALAIPBwABMrgAAwABsRz8/P06vD68dAAC+mGADwABM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wABE5gEWwABE5i6+ycAATIPAAEzlBsAATOmA7cAARPHAAEUIwABFHAEAr/EBasAARPJgA8AAbFaAtQAAAQPAAEUTwABFHAAAAAAAAABgA4OsAUrAAEUWARbAAEUWLr7JwABMg8AATOUGwABM6oDtwABFIcAARTjAAEVNAQC4DAFqwABFImADwABsVoC1AAABA8AARUTAAEVNAAAAAAAAAGADg6wBSsAARUcBFsAARUcuvsnAAEyDwABM5QbAAEz0gO3AAEVSwABFcMAARcUAAL68AWrAAEVTYAPAAGxWgLUAAAEDwABFf8AARcUAAAABAQHAAEWTAAAAry9gA8AATJkAAF0DwABsGQFgA8AAWb8BSsAARaoBMcAARbdgA8AAWb8BgMAARbjAKICGBsAATPWA7cAARcrAAEXowABGNwAAvr0BasAARctgA8AAbFaAtQAAAQPAAEX3wABGNwAAAAEBAcAARgsAAACvL2ADwABMmQAAXQPAAGwZAWADwABZvwFKwABGIgFqwABGIl0DwABsGQFgA8AAWb/AAQkaAAAod00AKHeXACh38AAoeCwAKHjkACh5yAAofisAKH7/ACh/VgAof6kAKH/8ACiATwAogMAAKIEyAAAADQLAAEz4gO3AAEY8wABGS8AAbMAHvswAAAFgA8AAbFYAAWADwABM0AcEwABM+oDtwABGj8AARpMJgYgAYAPAAGwYAATAAEz7gO3AAEahwABGqwmEAQBgA8AAbB8ABMAATP2A7cAARrjAAEa9GJKfwABMgwBgA4lVASsEwABM/oDtwABGx8AARs0YvsnAAEyDAGADg8wBKwTAAEz/gO3AAEbXwABG5hi+zcAATIMAYAODzAErBMAATQCA7cAARvTAAEb/GL7OwABMgwBgA4RLASsEwABNAYDtwABHDcAARxgYvs/AAEyDAGADhEsBKwEFwABNGoDtwABHHcAARx3AAEsiAAAAA8AARzbAAEsiAAAACAgIwABHQwAABIGIYAPAAGwYAMAAR1MAAACDbWADwABsWADAAEdmAAAAic5gA8AAbB8AwABHfAAAALgbYAPAAGwfAMAAR5cAAACyTWADg8wAwABHsgAAALqaYAODzADAAEfaAAAAuptgA4RLAMAAR/8AAAC6nGADhEsAAGADwABM+AE+BD0XwABIOi6+ycAATIM1wABITwAAAQBgA4PMAR/AAEhPhAEDAAErAoNtgcAASGTAKIKShAw1wABIeAAAAQBgA4PMAYTAAEh4wCiCwiMcwABIeBTAAEh4wCiDOQgAJwEAASsAwABsXisWwABIhxTAAEh4wCiDOQgAhAyCagFgA4J+NcAASJ4AAAEAXAEXwABInhTAAEhPwCiDEggAhAGCwABIq8AogqKCWTXAAEjCAAABAFwBF8AASMIUwABIT8AogxIIAISHg8AASNLAKIKyg641wABI7AAAAQBcARfAAEjsFMAASE/AKIMSCACDVimD+BTAAEhPwCiDEggAwABM/j0XwABJDy6+zcAATIM1wABJJQAAAQBgA4PMAR/AAEklhAEDAAErAoNtgcAASULAKIKShAw1wABJVgAAAQBgA4PMAYXAAElWwCiC0CMcwABJVhTAAElWwCiEOAgAJwEAASsAwABsXisWwABJbhTAAElWwCiEOAgAhAyCagFgA4J+NcAASYEAAAEAXAEXwABJgRTAAEklwCiEEQgAhAGCwABJjsAogqKCWTXAAEmhAAABAFwBF8AASaEUwABJJcAohBEIAISHg8AASbHAKIKyg641wABJxwAAAQBcARfAAEnHFMAASSXAKIQRCACDVimD+BTAAEklwCiEEQgAwABM/z0XwABJ6i6+zsAATIM1wABJ/AAAAQBgA4RLAR/AAEn8hI8FAAMrasAASiNgA4SShlgfwABKL4UKAQABKwACg22BwABKVMAogpKEDDXAAEpoAAABAGADhEsBhsAASmjAKILeIxzAAEpoFMAASmjAKIVOCAAnAQABKwDAAGxeKxbAAEp9FMAASmjAKIVOCACEDIJqAWADgn41wABKkAAAAQBcARfAAEqQFMAASfzAKIUQCACEAYLAAEqdwCiCooJZNcAASrAAAAEAXAEXwABKsBTAAEn8wCiFEAgAg1YphIMUwABJ/MAohRAIAMAATQA9F8AAStMuvs/AAEyDHMAASuEuvtDAAEyDBAAEFsAASu8ugYjAAEz6gcAASvXAKIKSgsAASv7AKIKih8AASwrAKILsAMAATQvAAE0BAwgBwABM+oAAwCiCgggAwABM+4LAAEgpwCiCogkBwABHHcAAbFoAAAAAEwbAAE0DgO3AAEsnwABLOMAAS9kAAL62AWrAAEsoYAPAAGxWgLUAAAEDwABLScAAS9kAAAABAQHAAEtUAAAAgJBgA408AABcAT4BScAAS2UhHMAAS3kWwABLaS6+zcAATIPAAEz/JwEAASsAwABsXj4BPRfAAEuaFsAAS4ouvs3AAEyDwABM/4GXHMAAS6uAwABLocAohp6FcwEAAWrAAEvDYAOJR4UtAI5Jg84/BsAATQSA7cAAS97AAEvvwABOhgAAvrMBasAAS99gA8AAbFaAtQAAAQPAAEv7wABOhgAAAAICAsAATAYAAACAkGADjTwAwABMHAAAAITLYAOFGgAAXAE+BUAhHMAATDwWwABMNi6Sn8AATIPAAEz9JwEAASsAiVnAAEw2wABMQwEkwABMcgMnvtEWwABMbC6BiMAATPongPc9F8AATIAWwABMeS6+ycAATIPAAEz+hMs1wABMkgAAAQBgA4c1AR/AAEyShz0AAAAANcAATKEAAAEAXAEXwABMoYLAAEySwCiHxYQAFsAATKouvsnAAEyDwABM/oJYgsAATJLAKIfFg9BJwABMthbAAEzAFsAATLoukp/AAEyDwABM/YZHiWA+AT0XwABM7xbAAEzfLr7NwABMg8AATP+EyzXAAE0BAAABAGADhywBH8AATQGHNAEAASoANcAATR4AAAEAXAEXwABNHoLAAE0BwCiIToQAFsAATScuvs3AAEyDwABM/4JYgsAATQHAKIhOg9A/PRfAAE1XFsAATU4WwABNQi6+zsAATIPAAE0AhMeEUIT4NcAATV4AAAEAYAOH+AEcwABNXi6+0sAATIMDAAOAwABNcMAoh0sWwABNey6BiMAATPqBwABNgcAoh1kAwABNCjXAAE2WAAABAFwBF8AATZaCwABNXsAoiMKEABbAAE2rFsAATZ8uvs7AAEyDwABNAITHhFCCWILAAE1ewCiIwoUIScAATbkhHMAATckWwABNvS6+z8AATIPAAE0BJwEAASsAwABsXj4BPRfAAE3vFsAATeYWwABN2i6+z8AATIPAAE0BhMeEUIT4NcAATfYAAAEAYAOH+AEcwABN9i6+08AATIMDAAOAwABOE8Aoh0sWwABOHi6BiMAATPoWwABOThbAAE45FsAATjAWwABOJC6+z8AATIPAAE0BhMeEUIRwhPWBacAAbJQAwABNDDXAAE5fAAABAFwBF8AATl+CwABN9sAoiYuEABbAAE50FsAATmguvs/AAEyDwABNAYTH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cMAAAAAAAAAAYAOFGgFKwABwoAEcwABwoC6+1sAATIMBAAEWwABwsC6+zcAATIPAAEz/AMAATQgAACilNAAopngAAAABAsAATSOA7cAAcMrAAHDQwABy4Te+4wAAAWADwABM+AABYAPAAE0bAAEFwABNKAAAAAAEAAADAAAAAAAICAgAAAAAgYhgA8AAbBgAAAAAAINtYAPAAGxYAAAAAACJzmADwABsHwAAAAAAuBtgA8AAbB8AAAAAALJNYAODzAAAAAAAuppgA4PMAAAAAAC6m2ADhEsAAAAAALqcYAOESwAAYAPAAE0jAT8BCQAAwABNGggACIAAwCimw4EAwCim0IIAwCim3YMAwCim6oQAwCim94UAwCinAoYAwCinDYcAwCinGAABBsAATSaA7cAAbPfAAG0NwABu6gAAvtPAAEyDAWrAAGz4YAPAAGxWgLUAAAEDwABtHsAAbuoAAAADAwPAAG0wAAAAgJBgA408AMAAbUIAAACBiGADwABsGADAAG1cAAAAhThgA4jnAABgA4f4AT4CQCEcwABtehbAAG10LpKfwABMg8AATP0nAQABKwCJWcAAbXTAAG2BASTAAG2wAye+0YHAAG2qwCinsieA90rAAG23AR7AAG2+wABjFgcABBbAAG3dLoQBwABM+4HAAG3pwCinsoLAAG3vwCinwhbAAG36LpKfwABMg8AATP0Dvt0qvt40wABuQAPAAG5AwABugAAAAAEBAcAAbkwAAACBPmADhRoAAGADhRoBSsAAbmIBHMAAbmIuvtfAAEyDAgACFsAAbnIuvsnAAEyDwABM/oPAAG56wCiobwDAAE0Jvt80wABunAPAAG6cwABu5QAAAAEBAcAAbqgAAACBPmADhRoAAGADhRoBSsAAbr4BHMAAbr4uvtfAAEyDAgACFsAAbs4uvs3AAEyDwABM/4PAAG7fwCiozADAAE0JAAAop2kAKKkTAAAAAQLAAE0pgO3AAHDKwABw0MAAcuE3vuQAAAFgA8AATSMAAWADwABNHwABBcAATS4AAAAABAAAAwAAAAAACAgIAAAAAIGIWwAAAAAAg21gA8AAbFgAAAAAAInOYAPAAGwfAAAAAAC4G2ADwABsHwAAAAAAsk1gA4PMAAAAAAC6mmADg8wAAAAAALqbYAOESwAAAAAAupxgA4RLAABgA8AATSkBPwEJAADAAE0oCAAIgADAKKlegQDAKKlmggDAKKlzgwDAKKmAhADAKKmNhQDAKKmYhgDAKKmjhwDAKKmuAAEGwABNLIDtwABvLcAAb0PAAHDFAAC+0sAATIMBasAAby5gA8AAbFaAtQAAAQPAAG9UwABwxQAAAAMDA8AAb2YAAACAkGADjTwAwABveAAAAIGIYAPAAGwYAMAAb4kAAACEy2ADhRoAAGADh/gBPgJAIRzAAG+pFsAAb6Mukp/AAEyDwABM/ScBAAErAIlZwABvo8AAb7ABJMAAb98DJ77RgcAAb9nAKKpIJ4D3SsAAb+YBHsAAb+3AAGMVBwAFgMAAcCfAKKo6FsAAcDIuhAHAAEz7gcAAcD7AKKpIFsAAcEQugZfAAE0TJ4S3Ar7hFsAAcG8uvtTAAEyDwABNB77iNMAAcJoDwABwmsAAcMAAAAAAAAAAYAOFGgFKwABwoAEcwABwoC6+1sAATIMBAAEWwABwsC6+zcAATIPAAEz/AMAATQgAACip/wAoq0MAAAABAsAATS+A7cAAcMrAAHDQwABy4QO+5QAAAWADwABNKQAAAAEFwABNMYDtwABxSMAAcUjAAHLfAAAAA8AAcWvAAHLfAAAACAgIwABxegAAAIGIYAPAAGwYAMAAcYoAAACDbWADwABsWADAAHGdAAAAic5gA8AAbB8AwABxswAAALgbYAPAAGwfAMAAcc4AAACyTWADg8wAwABx6QAAALqaYAODzADAAHIRAAAAuptgA4RLAMAAcjYAAAC6nGADhEsAAGADwABNLwE/AQkAwAByU8AATS4IAAiAwAByWcAoq5iBwAByX8Aoq6iCwAByaMAoq7iDwABydMAoq8iEwAByg8Aoq9iFwABynsAoq+aGwABytsAoq/SHwAByy8AorAIAAAAAKKxxAAAAAALAAE0ygO3AAHLkwABy6sAAdzE3vuYAAAFgA8AATPgAAWADwABNGwABBcAATTcAAAAABAAAAwAAAAAACAgIAAAAAIGIYAPAAGwYAAAAAACDbWADwABsWAAAAAAAic5gA8AAbB8AAAAAALgbYAPAAGwfAAAAAACyTWADg8wAAAAAALqaYAODzAAAAAAAuptgA4RLAAAAAAC6nGADhEsAAGADwABNMgE/AQkAAMAATRoIAAiAAMAorLiBAMAorMWCAMAorNKDAMAorN+EAMAorOyFAMAorPeGAMAorQKHAMAorQ0AAQbAAE01gO3AAGz3wABtDcAAbuoAAL7TwABMgwFqwABs+GADwABsVoC1AAABA8AAbR7AAG7qAAAAAwMDwABtMAAAAICQYAONPADAAG1CAAAAgYhgA8AAbBgAwABtXAAAAIU4YAOI5wAAYAOH+AE+AkAhHMAAbXoWwABtdC6Sn8AATIPAAEz9JwEAASsAiVnAAG10wABtgQEkwABtsAMnvtGBwABtqsAoracngPdKwABttwEewABtvsAAYxYHAAQWwABt3S6EAcAATPuBwABt6cAoraeCwABt78AorbcWwABt+i6Sn8AATIPAAEz9A77dKr7eNMAAbkADwABuQMAAboAAAAABAQHAAG5MAAAAgT5gA4UaAABgA4UaAUrAAG5iARzAAG5iLr7XwABMgwIAAhbAAG5yLr7JwABMg8AATP6DwABuesAormQAwABNCb7fNMAAbpwDwABunMAAbuUAAAABAQHAAG6oAAAAgT5gA4UaAABgA4UaAUrAAG6+ARzAAG6+Lr7XwABMgwIAAhbAAG7OLr7NwABMg8AATP+DwABu38AorsEAwABNCQAAKK1eACivCAAAAAECwABNOIDtwABy5MAAcurAAHcxA77nAAABYAPAAE0yAAAAAQXAAE09gO3AAHNHwABzR8AAdNsAAAADwABzZ8AAdNsAAAAICAjAAHN2AAAAgYhgA8AAbBgAwABzhgAAAINtYAPAAGxYAMAAc5kAAACJzmADwABsHwDAAHOvAAAAuBtgA8AAbB8AwABzygAAALJNYAODzADAAHPlAAAAuppgA4PMAMAAdA0AAAC6m2ADhEsAwAB0MgAAALqcYAOESwAAYAPAAE04AT8BCQDAAHRPwABNNwgACIDAAHRVwCivXYHAAHRbwCivbYLAAHRkwCivfYPAAHRwwCivjYTAAHR/wCivnYXAAHSawCivq4bAAHSywCivuYfAAHTHwCivxwABBsAATTuA7cAAdODAAHT2wAB3LwAAvtLAAEyDAWrAAHThYAPAAGxWgLUAAAEDwAB1B8AAdy8AAAADAwPAAHUZAAAAgJBgA408AMAAdSsAAACBiGADwABsGADAAHU8AAAAhMtgA4UaAABgA4f4AT4CQCEcwAB1XBbAAHVWLpKfwABMg8AATP0nAQABKwCJWcAAdVbAAHVj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GADAAICBAAAAg21gA8AAbFgAwACAjgAAAInOYAPAAGwfAMAAgKQAAACyTWADhEsAAGADhEsBSsAAgLwBKwbAAE1PgO3AAIDFwACA28AAgUYAAL7TwABMgwFqwACAxmADwABsVoC1AAABA8AAgOzAAIFGAAAAAwMDwACBAgAAAICQYAONPADAAIEUAAAAgYhgA8AAbBgAwACBLgAAAIU4YAOI5wAAYAOH+AFKwACBQgErAAAouQQAKLsPACi7lQAovAkAAAADAsAATVKA7cAAgUvAAIFRwACGdAO+6wAAAWADwABsVgABYAPAAFm/AgTAAE1UgO3AAIGSwACBngmvLwBgA8AATJkABMAATVWA7cAAgbzAAIHCCYREAWrAAIGkYAPAAGxWgLVgA4OsAAEFwABNZoDtwACBx8AAgcfAAIHzAAAAA8AAgdPAAIHzAAAAAgICwACB2QAABK8vYAPAAEyZAMAAgewAAASERGADg6wAAGADwABNUgE/AwgBwABNVIAAwCi8qwgBwABNVYEAwCi8uwkBwACBx8AAbFoAAAAADQbAAE1XgO3AAIH4wACCFcAAgj4BAKyEAWrAAIH5YAPAAGxWgLUAAAEDwACCIsAAgj4AAAAAAAAAYAPAAEB7AUrAAIIlARbAAIIyFsAAgiUury/AAE1UrITAAE42BsAATViA7cAAgkPAAIJYwACCfwEArE8BasAAgkRgA8AAbFaAtQAAAQPAAIJkwACCfwAAAAAAAABgA8AAbFsBSsAAgmcBFsAAgnQWwACCZy6vL8AATVSsT8AAQHMGwABNWYDtwACChMAAgpnAAIK6AQCDvQFqwACChWADwABsVoC1AAABA8AAgqLAAIK6AAAAAAAAAGADwABsWwFKwACCpQEWwACCshbAAIKlLq8vwABNVIO9wABOawbAAE1agO3AAIK/wACC1MAAgu4BAIn3AWrAAILAYAPAAGxWgLUAAAEDwACC3MAAgu4AAAAAAAAAYAPAAGxbAUrAAILfASXAAILmABbAAILfLoREwABNVWADg8wGwABNW4DtwACC88AAgwjAAINiAQCGNAFqwACC9GADwABsVoC1AAABA8AAgxXAAINiAAAAAAAAAGADwABsWwE+Ak7AAIMiwACDKAAAg8FgA4OsARbAAIMqLoREwABNVUrAAIM2ASIlwACDQwCAwACDPcAovqtgA4PMABbAAINVFMAAg0/AKL6rAAFgA4PMhMOD6AbAAE1cgO3AAINnwACDfMAAg/UBAIN/AWrAAINoYAPAAGxWgLUAAAEDwACDhcAAg/UAAAAAAAAAYAPAAGxbAT4CTsAAg5LAAIOcAACDvGADg6wBFsAAg54uhETAAE1VSsAAg6oBIiXAAIO7AIDAAIOxwCi/PWADhEsAHMAAg9oWwACD1RTAAIPLwCi/PQABYAOES4O+hE4nAQABasAAg+tgA4SShQkAwABsXgbAAE1dgO3AAIP6wACED8AAhIgBAIT9AWrAAIP7YAPAAGxWgLUAAAEDwACEGMAAhIgAAAAAAAAAYAPAAGxbAT4CTsAAhCXAAIQvAACDvGADg6wBFsAAhDEuhETAAE1VSsAAhD0BIiXAAIROAIDAAIREwCi/6GADhEsAHMAAhG0WwACEaBTAAIRewCi/6AABYAOES4O+hE4nAQABasAAhH5gA4SShlgAwABsXgbAAE1egO3AAISNwACEosAAhPUBAITWAWrAAISOYAPAAGxWgLUAAAEDwACEqsAAhPUAAAAAAAAAYAPAAGxbAT4CTsAAhLfAAIS9AACDwWADg6wBFsAAhL8uhETAAE1VSsAAhMsBIiXAAITYAIDAAITSwCjAk2ADg8wAFsAAhOoUwACE5MAowJMAAWADg8yE1oPdBsAATV+A7cAAhPrAAIUPwACFYgEAhMEBasAAhPtgA8AAbFaAtQAAAQPAAIUXwACFYgAAAAAAAABgA8AAbFsBPgJOwACFJMAAhSoAAIPBYAODrAEWwACFLC6ERMAATVVKwACFOAEiJcAAhUUAgMAAhT/AKMElYAODzAAWwACFVxTAAIVRwCjBJQABYAODzITBg94GwABNYIDtwACFZ8AAhX7AAIWxAQCvjgFqwACFaGADwABsVoC1AAABA8AAhZDAAIWxAAAAAAAAAGADwABsGAFKwACFkwEWwACFoBbAAIWTLq8vwABNVK+OwABONQbAAE1hgO3AAIW2wACFysAAhekBAINtAWrAAIW3YAPAAGxWgLUAAAEDwACF0sAAhekAAAAAAAAAYAPAAGxYAUrAAIXVARbAAIXiFsAAhdUury/AAE1Ug23AAE5lBsAATWKA7cAAhe7AAIYCwACGJwEAic4BasAAhe9gA8AAbFaAtQAAAQPAAIYNwACGJwAAAAAAAABgA8AAbB8BSsAAhhABFsAAhh0WwACGEC6vL8AATVSJzsAATmQGwABNZIDtwACGLMAAhj/AAIZyAACBUwFqwACGLWADwABsVoC1AAABA8AAhkfAAIZyAAAAAAAAAGADwABsGAFKwACGTQEkwACGcgUnvuwWwACGXC6vL8AATVQnjvEWwACGai6ERMAATVUng6MAACi8+gAovVYAKL2yACi+DgAovmkAKL77ACi/pgAowFEAKMDjACjBdQAowdEAKMItACjCiQAowvUAAAANAAAAAYDtACjDNQAoVqIAKFmpAChxJQAocs4AKHXLACiBbwAoozUAKKUQACimhQAoqSAAKKtQACisegAorxUAKLJCACi0dwAot+MAKLweACjDMgAAABEAKMM1AAAAAAACCMAATWe+7YDuAAAUgQMAAMAAYZIAAQEDvu6+777wgd0AAMAAS10AAQEBrpCCOAAAwABLnQABAQGgH4KDAACCLgABAQOGToUyhiyC3AAAwABPVwABAQGunIMVAADAAE+hAACDMQAAwABCPgABAQGacINVAADAAEawAAEBAavXg6AAAMAAXVwAAQEBuUiD2gAAti0AAQEBrruEEgAAwABDOwABAQGr1IRWAADAAEAtAACEbQAAwABAegAAhIoAAMAAS/kAAIStAADAAEyDAACEygAAwABBCAAAhOkAAMAAWR8AAIUJAADAAE5aAACFKQAAwABBhQAAhUUAAMAAT0oAAAAAAAECwABNaIDuhb2Fw5wRA77xAAABYAPAAE5hAAFgA8AAT0sJBMAATWqA7oaChooJhtAAXQPAAGwZAWADwABZIAAEwABNa4DuhpmGogmwMgBgA8AAbB8ABMAATWyA7oa5hr0JgZcAYAPAAEGGAATAAE1tgO6Gz4bTCYGIAGADwABsGAAEwABNboDuh1OHdxiDvgBgA8AAYZcBaoduYAPAAGGXwADhNQTAAE1vgO6H0ofaGIUUAGADiOcBKwTAAE1wgO6IfIiMGLpTAGADvk0BKwTAAE1xgO6Iloi0GK9UAGADwABsWwEqBMAATXKA7oj8iRoYr1kAYAPAAGxbASoBBcAATYaA7okfiR+J6QAAAAOJNYnpAAAABwYHiTsAAASG0F0DwABsGQFgA8AAWSAAiUoAAASwMmADwABsHwCJWgAABIGXYAPAAEGGAIllAAAE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wABtLkqSPgGAkkXAKSDMBsAATjaA8pJUknGSpwEArIQBapJVYAPAAGxWgLUAAAEDkn6SpwAAAAAAAABgA8AAQHsBSpKBASaSgQEjJZKIABaSgS6EAMAATiZgA8AAQHsWkpouhADAAE4mKwFgA8AAQC5gA8AAQHsAACkbhAApG7cAKRwFACkcUwApHKEAKRzsACkdNwApHYIAKR3EACkd/AApHikAKR9yACkfzwApIBkAKSBgACkgoQApIVsAKSHDAAAAEQLAAE49gPKSrJKxk50LvxIAAAFgA8AAbFYAABAEwABOP4DykrGSsQmDKABgA8AAbB8ABMAATkGA8pKxkrEJhHXAAE4TAGADwABsGAAEwABOQoDykrGSsQaBpgBdA8AAbBkBYAPAAE49AWoAXQPAAGwZAWADwABOPcABEaQEwABOQ4DyksWSxQaE3QBgA8AATj0BagBgA8AATj3AARBZBMAATkSA8pLUktQGvxoAYAPAAE49AWoAYAPAAE49wAERAATAAE5FgPKS6pLqBoS3AGADwABOPQFqAGADwABOPcABEKAEwABORoDykvOS8waEuABgA8AATj0BagBgA8AATj3AAREXBMAATkeA8pL9kv0GvxsAYAPAAE49AWoAYAPAAE49wAEQiATAAE5IgPKTD5MPBr8cAGADwABOPQFqAGADwABOPcABES8EwABOSYDykyKTIga/HQBgA8AATj0BagBgA8AATj3AARFHBMAATkqA8pM1kzUGvx4AYAPAAE49AWoAYAPAAE49wAERXwTAAE5LgPKTSJNIBr8fAGADwABOPQFqAGADwABOPcABEXcEwABOTIDyk12TXQa4tQBgA8AATj0BagBgA8AATj3AARGPBMAATk2A8pNxk3EGvyAAYAPAAE49AWoAYAPAAE49wAEQuATAAE5OgPKTg5ODBr8hAGADwABOPQFqAGADwABOPcABENAEwABOT4Dyk5GTkQa/IgBgA8AATj0BagBgA8AATj3AARDoAQXAAE5TgPKSsZKxk50BAAADkrGTnQAAAAICApKxAAAEgyhgA8AAbB8AkrEAAASEdWADwABsGAAAYAPAAE49AT8DCADAAE4/gADAKSRiCADAAE5BgQDAKSRwCQAAwABsWgAAAAABBsAATlGA8pKxkrGTnQAAgVMAAAABA5Kxk50AAAAAAAAAYAPA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oWBqoWBgA4SShmehhWqhhWADhJKGdgA+Aj2NoZvAKWc1JwBCobcAAaHbaqHbYAOEkoZEAD4BPTCh8B+h+sAAbVgBAAEkokYCJ79HgqJAwClm9gA/SqJhASSijgSDomvAKWcCJ4HVhaJ8wClnNYSiiMApZxA+AUqiowGEoqrAKWcQBsAATu6A96S5pL644QAAv0jAAE67AAAAAQOk1LjhAAAAAgICpPEAAACscWADwABGtwClEgAAAK/qYAPAAExoAABcAT4aQCEcpUwWpTouv0TAAE67wABO0icBAAErAMAAbF6lOqVTASSlfwMnv00uJ4D3SaWGIRyloRalnBalii6/RMAATrvAAE7SgYiDsCcBAAErAIkrSqWqAD89F6W3Lr9FwABOuzKl12ADiOdgA4jnAMAATtNOpeSl7wAAhAFgA8AAbB8BFqX8FqXxLr9CwABOu8AATtCEAYJZTqYRpi0AALjSYAPAAGwfATWmSAAAAQBgA8AAbB8BNaZIAAABAF0DwABsGQFgA8AATx8BFqZIgaY3wCloT4NjwABMaiMcpkiDpkjAKWkXJwEAASsAwABsYisWpliDpkjAKWkXgODAAGxqAWADwABsHyMcpkiDpkjAKWkJJwEAASsAwABsMpODpkjAKWkJAWADwABsH06mfqaNAACDY10DwABsGQFgA4omATGmnmADiiYATqbEptQAALdRXQPAAGxfAmADiiZgA4lVATKm1mADiiZgA4lVAE6m7ab7AACDc10DwABsGQFgA4lVATGnB2ADiVUAPgJOpzwAAAA8XQPAAGxKAWADiiYBFqc8HgDAAGwvAQFdA8AAbCABYAOKJgEWpzwWpzMuhMfAAE26g2OE8wA9wABsS0UAAAEcpzyHAMApae4+AAAAAMAAbE0APgJOpyIAAACFcGADiiYBFqdMhwDAKWnuQMAAbE8+A06nYqdzAAC/TmADiiYBH6d5ikABAAEWp5UUp4fAKWpICACBiIoqAD0cp7GEp6LAKWmNNgEAARSntcApamUJAADAAGxHPRyn3IanzsApac82AQABNafgAAABAF0DwABsXwJgA4omYAOJVQGFp+DAKWmqNafwAAABAGADiiYBFKfwwClqSAgANagPAAABAGADif4BH6gPihMCAAIUqEHAKWpICAAUqFDAKWplCQAANafvAAABAFwBHKfvFKfg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KXh+ACl4vQApevYAKXtgACl8agAAABYCwABO9YD3wABAZcAAQGvAAE3eA79aAAABYAPAAE7NAAACBMAATveA98AAQMjAAEDZCa9tAGADwABZEQAEwABO+ID3wABA7MAAQPkYg3MAXQPAAGwZAWADiVUBKwEFwABPAYD3wABA/sAAQP7AAESaAAAAA8AAQRfAAESaAAAADw0PwABBNQAAAIbQXQPAAGwZAWADwABZIADAAEFJAAAAsDJgA8AAbB8AwABBZgAAAIUDYAPAAEGGAMAAQX8AAACBiGADwABsGADAAEGlAAAAsK9dA8AAbBkBYAPAAE8fAMAAQdcAAACvQF0DwABsGQFgA8AATWgAwABB+wAAAL59YAPAAEa3AMAAQhYAAAC4GmADwABsHwDAAEIxAAAAic5gA8AAbB8AwABCRwAAALqlYAPAAGwfAMAAQmYAAAC4G2ADwABsHwDAAEKFAAAAsk1gA4RLAMAAQqQAAAC6qWADhEsAwABCyAAAALqmYAPAAGwYAWoAYAHAAGxcAsAAQuUAAASvbWADwABZEQFqAGABwABsXAIAYAPAAE71AT8CCAHAAE73FADAKX5HDgAJAMAAQwHAAE70DwAPgMAAQxTAKX1NgcAAQyrAKX1kgsAAQ0HAKX10g8AAQ1nAKX2EhMAAQ2vAKX2UhcAAQ4bAKX2rasAAQ6lgA4SShkSGwABDvsApfcKHwABD28ApfdIUwABD+MApfeIIABTAAEQQwCl98gkAFMAARDHAKX4CCgAUwABETMApfhILABTAAERnwCl+IAwAFMAARInAKX4uDQAABQbAAE76gPfAAESfwABEucAARM0BAIT4AWrAAESgYAPAAGxWgLUAAAEDwABEvsAARM0AAAAAAAAAYAOH+AFKwABEwQEWwABEwS6++sAATbsGwABO/ID3wABE0sAAROPAAEooAAC4QQFqwABE02ADwABsVoC1AAABA8AARPzAAEooAAAAAgICwABFBAAAAIC+YAODrADAAEUbAAAAg3NdA8AAbBkBYAOJVQAAXAE+BknAAEUwIRzAAEVBFsAARTQuvvrAAE27JwEAASsAwABsXj4BPR7AAEVStT4EAAQnlXckwABFggEWwABFdRbAAEVoLr76wABNu4VOwABtLRbAAEWELonOwABOZBbAAEWQLoNtwABOZQA/ScAARe4iFsAARfIuhMHAAE5pACEWwABGBYDAAEX+wCl/ooTBg7c+AT0cwABGHhbAAEYWLoEVwABOM6xgBAAEasAARilgA7LbwABpVhbAAEZTLonOwABOZGrAAEZpYAPAAGwfAxbAAEZzLoNtwABOZQDAAEEiPz0XwABGiC6++h/AAEablfMCAAKAwABGssApf6KBwABGusApf7AAwABNuz0XwABG1xbAAEbOLoTHwABNuoT4FsAARt4uvvrAAE27hQg9NcAARvAAAAEAYAOH+AEWwABG8C6++sAATbsjHMAARvCCwABG8MApgPYnAQABKwDAAGxeKxfAAEb+gsAARvDAKYD2hAAWwABHBy6Ex8AATbqCWAFgA4TuScAARxUWwABHGS6sVcAAQGo+AknAAEcqIRzAAEdGFsAARzcWwABHLi6Ex8AATbqDY4TzJwEAASsAwABsYj4FTsAAR3bAAEeDAACDzV0DwABsXwJgA4omYAOJVQEywABHnmADiiZgA4lVAEXAAEeqAcAAR7PAAEe1AACB1GADwABsHwGTARzAAEe8g8AAR7rAKYG8gToBAAEWwABH1hbAAEfHFsAAR74uhMfAAE26g2OE84DgwABsagDAAGyFAYvAAEfewCmBvBzAAEffg8AAR97AKYG8gT8BAAGUAMAAbIg+AT0cwABH+4LAAEfvwCmBjICcAgACHMAASBMWwABIBRbAAEf8LoTHwABNuoNjhPMpAQABg8AASBTAKYG8AMAAbLgfwABILIoUAgACHMAASJYWwABIiBbAAEh/FsAASHIutvnAAE7XhMfAAE2Zg2OE8ykBAAGDwABIl8ApgbwAwABsuBbAAEijFsAASJsugRXAAE4zgRXAAEEVAADAAGxjTsAASM7AAEjfAACT2l0DwABsGQFgA4lVAR7AAEjxwABs/AEBYAOJVQEWwABJDoHAAEkAwCl/sIDgwABsagBFwABJHwHAAEkowABJKgAAgdRgA8AAbB8BkwEcwABJMYTAAEkvwCmDEIE6AQABFsAASUSDwABJM8Apgs2A4MAAbGoAwABshQGMwABJTMApgxAcwABJTYTAAElMwCmDEIE/AQABlADAAGyIPgE9HMAASW2DwABJXcApgs2AnAIAAoTAAEluwCmDEB7AAElzliQCAAIcwABJi4HAAEl+wCl/sCkBAAGEwABJjMApgxAAwABsuILAAEmQwCmBjAAAwABsyz2JwABJscApf7CDwABJwcApgs0/PRzAAEnuFsAASeEutvnAAE7XuEECAAKAwABKCMApf6KBwABKEMApf7AAwABNpD8GwABO/YD3wABKLcAASj7AAErvAAC4HQFqwABKLmADwABsVoC1AAABA8AASkrAAErvAAAAAgICwABKYQAAAIEVYAPAAEEJAMAASpEAAACB+WEDAmADg6xgA8AATj1cAABcAT4CTsAASqHAAEqoAACERGADg6wBHMAASqourI4BAAEmwABKsAGAwABKsMAphEZgA8AARrcAwABO/j0cwABKv4HAAEq+wCmEVoCVAgACgsAASsDAKYR0asAASthgA8AATj3AAREAAAAGwABO/oD3wABK9MAASwrAAEzHAACsjgFqwABK9WADwABsVoC1AAABA8AASw/AAEzHAAAAAQEBwABLJQAAAIEVYAPAAEa3AABgA4RLAT4ETsAASz7AAEtFAACBsGADhEsBHcAAS02sjgEAAYDAAEtTwCmFDwDAAE7rPRfAAEtogcAAS2HAKYUohPsphIBJwABLlCEcwABLuBbAAEuqFsAAS5gur23AAE73g3PAAFkWJwEAASsAwABsYj4CPRfAAEvJLoNzHsAAS+fAAGz8AQFgA4lVARbAAEwWFsAATAgWwABL9i6vbcAATveDc8AAWRaA4MAAbGoAwABO+EXAAEwlAcAATC7AAEwwAACB1GADwABsHwGTARzAAEw3gsAATDXAKYXZgToBAAEWwABMRxbAAEw5LoNzwABO+IDgwABsagDAAGyFAYrAAExPwCmF2RzAAExQgsAATE/AKYXZgT8BAAGUAMAAbIg+AT0cwABMaxbAAExeLoNzwABO+ICcAgACgsAATGzAKYXZHMAATJQcwABMkBbAAEyDFsAATHEur23AAE73g3PAAFkWKQEAAYLAAEyRwCmF2QDAAGy4rI4BAAGAwABMmsAphQ8AwABBlQDAAGzLP0rAAEy2AYHAAEy9wCmFKAbAAE7/gPfAAEzMwABM3MAATdwAALbrAWrAAEzNYAPAAGxWgLUAAAEDwABM58AATdwAAAAAAAAAYAPAAGwfAT4EScAATPAhFsAATPUurFXAAEBqSsAATP4Bkz89HcAATRO26wAAAADAAE7wScAATSclwABNMgAWwABNKy6v4cAATt5g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AQABKwDAAGxeKxanA4Om/cApn7OatsAAQYgBYAPAAEGcSacWIRynH4OnGsApn6MnAQABKwDAAGxePgE9iacywCmfXIOnPMApn6M+AUqnWQEuSad0HKeBgKd4wCmfASsBAAGBp4rAKZ9cAMAAbHhKp5QBLj9Kp6sBgaeywCmfXAAAKYsYACmLRwApi4YAKYvHACmMLgApjFsAKZDqACmTwwAplpAAKZiMACmcFQApnMoAKZ1GACme1gApoFsAAAAOAAEEwABPBID4p9Sn/QW/ZgBgA4lkAR+n8IlxAAAAAAABgPgAKaC8ACmItQApoJwAAAABACmgvAAAAAAAAgjAAE8ev2eA+QAACYEAAACCLgABAQSGRIZAhoyGbYFkAACU2AABAQOh8KUNqK6CFQAAwABGsAABAQGr14JgAADAAEB6AACCfQAAwABBCAAAgpwAAMAATnIAAIK+AADAAE6NAACC4QAAwABBhQAAgv0AAMAAQZsAAAAAAAECwABPH4D5gyaDLKQcA79oAAABYAPAAEGoAAAFBMAATyGA+YNzg3gYhTkAYAPAAEGGAATAAE8igPmDiYOUGIVxAGADwABBhgErBMAATyOA+YOtg7wJv2kAYAOKJgAEwABPJID5g9WD4Ri2+QBgA8AATx8BKwTAAE8lgPmD8YQJCbqAAGADwABsWwACBcAATzyA+YQOhA6FegAAAAOEIYV6AAAABgMDhDAAAACBiGADwABsGACESwAAAL59YAPAAEa3AIRgAAAAic5gA8AAbB8AA4R4AAAEhTlgA8AAQYYBagBgAcAAbFwChIQAAAS6gGADwABsWwFqhJ5gA8AAbFschKkAAAC60mADwABsHwFqAGABwABsXAJgA8AATx8BPwQIAcAATyGDAMApoiYIAcAATyWEAMApoj0IAMAATyM1hNoAAAEAYAOKJgEfhNqKQAIAAoCE6MApofsrADWFAAAAAQBcAReFAIaE2sApopSEAYKFDcApoheCWTWFJAAAAQBcAReFJIaE2sApopSGh4WFL8ApolWKN4aE2sApopQJAIVJwABBswUABSuTgIVYwCmh+4GFXsApogmChW/AKaIXAAXAAE89gPmFf4V/huoAv2oAA4WdhuoAAAACAgKFswAAAIU4YAOKJgCFzQAAAL59YAPAAEEJAABgA8AATx8BPwQIAcAATyErCADA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QSI9FZ3NwCmvOAgrPz4BPRWeB8AprzgIKz0XnjqHnjLAKa8khm4enneKCgEAARaem4eek8AprySFOIoBAIoAQ56vIRyev4SetsAprdwnAQABkwDAAGwyPgM9jJ7TwCmt3Bye0YSe08AprdxEAQABlADAAGzhPY+e58ApryQcnvaDnvHAKa2nKQEAAYSe98AprdwAwABsuD0XnxSHnwzAKa8khm4en1OKCgEAARafd4efb8AprySFOIoBAIoAPgE9F5+php+kwCmuvoZuHp/migoBAAEWoAeGoALAKa6+hTiKAQCKAAbAAE81gPmgKKAtoIAAALbqAAAAAQOgN6CAAAAAAQEBoFYAAAi1m2ADwABPHwAAXAE+AT0XoGmAoGPAKbJ1tvkuwABPJAbAAE82gPmghaCZofMAAJxXAAAAAQOgnqHzAAAAAQEBoLEAAAC3o10DwABsGQFgA8AAQYYAAGADwABPHwE+AUqhdQEfoYDAAE88BQADFqGULoGIwABBrCahmgEWoZouhADAAE5jYAPAAEa3FqGiLonOwABOZAKFORyhwxahvS6FOcAATyGcVwEAAYChycApsroAwABBlLrSFqHmLoaHwABPKwbAAE83gPmh+KISonADACcBaqH5YAPAAGxWgLUAAAEDohSicAAAAAEBAaIcAAAAgdFgA8AAbFYAAGADwABsWwE+AUqiKQEiJaI2AICiMMAps2ZgA8AATx8AHKJaFqJQLoU4wABPKicBAAEWomMUol3AKbNmAAFgA8AATx+FOMAATyoAwABsXgbAAE8sgPmidaKJoqcBAIHXAWqidmADwABsVoC1AAABA6KSoqcAAAAAAAAAYAPAAGwfAUqilQEWop8WopUuhTjAAE8qgdeCVgbAAE84gPmirKLHpBoAAb9vAAAAAQOi4aQaAAAAAQEBowMAAACr/V0DwABsGQFgA8AATx8AAF0DwABsGQFgA4omAT4ESaMTHKMggKMXwCm0KycBAAErAMAAbGJKoykBKz9Oo06jVQAAgbBdA8AAbBkBYAOKJgEeo2PAAG0kAwFgA4omAhajh4CjfsAptCuA4MAAbGorAYUkKUWjqgGjs6O1AACB1GADwABsHwGTARyjvIKjusAptKiBOgEAARajx4CjvsAptCuA4MAAbGoAwABshQGKo8/AKbSoHKPQgqPPwCm0qIE/AQAB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hsAAiTfAKj3ohAGCwACJU8AqPE+CWYbAAIk3wCo96AAANcAAiWkAAAEAXAEXwACJaYbAAIjfwCo9n4QBgsAAiXbAKjxPglmGwACI38AqPZ9OwACJksAAiZoAAJuaYAOFRQE1wACJqAAAAQBgA4VFAR/AAImohVUDAAMfwACJuIU4AQABhcAAicTAKj0dABrAAInIwABP2YTAAInSwCo8jgA1wACJ6gAAAQBcARfAAInqh8AAiajAKj5zhAGCwACJ98AqPE+CWYfAAImowCo+c07AAIoQwACKHAAAwABASWADiVUBHMAAimwcwACKJi7AAEBRAgAChMAAikPAKjyOgcAAik/AKjw/AMAAUN+DawEAARbAAIqLgcAAinzAKjw/g2WJrQCJWk7AAIqzwACKvwAAwABAUmADhnQBH8AAisWGgQQABIbAAIrbwCo9izXAAIryAAABAGADhzUBH8AAivKHPQAAAAA1wACLAQAAAQBcARfAAIsBFMAAivLAKj9fCQCEAYLAAIsOwCo8T4JZFMAAivLAKj9fCQCHwACLGsAqPmEUwACLI8AqPuEIAABKwACLNQEfwACLQMAAUdcCAAIUwACLVsAqPuEIADXAAItnAAABAGADh8oBH8AAi2eH1QIAAoXAAItrwCo9HRTAAItuwCo/OAkAADXAAIt8AAABAFwBF8AAi3wUwACLZ8AqP90KAIQBgsAAi4nAKjxPglkUwACLZ8AqP90KAAAGwABQx4EEwACMGsAAjCzAAJZ5AADAAEA8wABQZQAAAAEDwACMRcAAlnkAAAAFAgLAAIxWAAAAwABAM2ADiVUAwACMbAAAAMAAQAxgA4lVAAPAAIyIAAAAwABANGADwABsWwFqAGABwABsXALAAIysAAAAwABAEmADwABsWwFqAGABwABsXALAAIzGAAAAwABAPWADwABsWwFqAGABwABsXAJgA8AAUb8BPgtAIRzAAI0FgsAAjO3AKkCOJwEAASsAwABsXsAAjO3AAI0MAEAhHMAAjSiDwACNGsAqQKknAQABKwDAAGxewACNGsAAjS8AQCEcwACNVYTAAI09wCpAxCcBAAErAMAAbF7AAI09wACNXABOwACOIcAAji4AAMAAQFNgA8AAbFsBKknAAI47JcAAjk4AgcAAjj/AKkB9YAOJqj4DTsAAjm7AAI54AACC02ADgzIBFsAAjpwmwACOigAUwACOe8AqQH0BAWADiapgA4mqgtOJsE7AAI60wACOvwAAwABAT2ADg6wBHMAAjtoWwACOyy6Aj8AAUKuC6QIAAobAAI7twCpBgxrAAI74wABP2QCBhknAAI8JIiXAAI8YAIfAAI8NwCpBt2ADhEsAHMAAjzgWwACPMxTAAI8owCpBtwcBYAOES4O+hE4nAQABasAAj0lgA4SShmcAwABsXj4BScAAj1scwACPXy7AAEBUwABQZQIAAoDAAI9ywCpAbRTAAI9/wCpAfQEBYAOJqgDAAFDWPgM9jcAAj5zAKkFSKUnAAI+7IoLAAI+/wCpAjgAWwACP6YHAAI/awCpAfYZHiWA+AUrAAJAOAWrAAJAnYAPAAFG/wAEWxz89icAAkFbAKkB9HMAAkMEcwACQdS7AAEBRAgACFMAAkJLAKkG3BwFgA4RLgcAAkJ7AKkB9AMAAUN+DawEAARbAAJDggcAAkNHAKkB9g2WJXQCJWj8/P0nAAJELIiXAAJEeAIHAAJEPwCpAfWADiYAAIYPAAJEuwCpAqT4BSsAAkUUBasAAkV5gA8AAUb/AARZ5Pz4DTsAAkY/AAJGWAACBsGADmtkBHMAAkbkWwACRmC6u6cAAUK2V4AIAAoHAAJHdwCpAfYDAAJHtwCpAbQCbFE7AAJIGwACSGwAAwABAVWADwABsWwEjgsAAkh3AKkCOHMAAkkiGwACSQcAqQ1GV5AAAAACa6hzAAJJ9hsAAknbAKkNRleMAAAAAmukBYAPAAGxbScAAkqmHwACSrcAqQ44+AUrAAJLNASOFwACS1MAqQVJqwACTAWADwABRv8ABFitqwACTM2ADwABRv8ABFfkBYAPAAFG/P07AAJNXwACTbgAAwABAVmADwABsWwEjgsAAk3DAKkCOJcAAk6EAgcAAk5LAKkB9YAOJchzAAJQrHMAAk90WwACTui6u6cAAUK2V4AIAAoDAAJQBwCpAbYHAAJQOwCpAfQCbFJXjAAAAAJrpAWADwABsW0nAAJRVIYbAAJRawCpEJz4BSsAAlHoBI4XAAJSBwCpBUmrAAJSsYAPAAFG/wAEWrWrAAJTeYAPAAFG/wAEWXwFgA8AAUb8/ScAAlPaEwACU+sAqQMQ+AUrAAJWpAWrAAJXCYAPAAFG/wAEWkz9KwACWBQEjhcAAlgzAKkFSasAAljVgA8AAUb/AARZFasAAlmdgA8AAUb/AARYSAWADwABRvwbAAFDXgQTAAJZ+wACWg8AAlugAAInGAAAAAQPAAJaJwACW6AAAAAEBAcAAlpMAAACBl2ADiVUAAGADwABsWwE+AUrAAJafASIlwACWqwCAwACWpsAqRWRgA4mqABzAAJbOFsAAlsQUwACWv8AqRWQAAWADiaqC04mwJwEAARbAAJbbFsAAltEugJDAAFC1g3SN7QDAAGxeBsAAUNiBBMAAl/fAAJgGwACZ8gAAwABAVwAAAAEDwACYIsAAmfIAAAADAwPAAJgtAAAAhEdgA4OAAMAAmE0AAAC5EF0DwABsGQFgA4lVAMAAmG0AAACFS2ADiVUAAF0DwABsGQFgA4lVAT4BScAAmIEhHMAAmJuBwACYhcAqRgwnAQABKwDAAGxiPgJAHMAAmNAWwACYyYHAAJizwCpGDIDgwABsaicBAAEWwACY7BbAAJjdgMAAmNPAKkX+g2ODhIDgwABsagDAAGwywACYs8AAmPIASsAAmPsBgcAAmQLAKkYMScAAmSQWwACZQRbAAJkygMAAmSjAKkX+g2ODhIFWwABs8z4CQBzAAJlvgcAAmVnAKkYMJwEAASsAwABsYsAAmVnAAJl2AErAAJl/AWrAAJmGXQPAAGwZAWADiVWE8j4BSsAAma0BHMAAmbQuwABAWAIAAoDAAJnQwCpF/oLAAJnbwCpGIQDAAFDZBsAAUNmBBMAAmnrAAJqJwACcZwAAwABAWAAAAAEDwACapMAAnGcAAAACAgLAAJq2AAAAhEdgA4OAAMAAmsoAAACFS2ADiVUAAF0DwABsGQFgA4lVAT4FTsAAmvLAAJsBAACDY10DwABsGQFgA4omARbAAJsNgMAAmwPAKkdsg2ODhE7AAJsqwACbMQAAhK5gA4lVARbAAJs9gMAAmzPAKkdshK6DhU7AAJtYwACbZgAAtyNdA8AAbBkBYAOJVQEewACbdMAAbSQCAWADiVUCFsAAm5mCwACbisAqR5iA4MAAbGpqwACbp2ADwABY/MABCOEAPRzAAJvRFsAAm7surunAAFCtwABAWQcAByuCwACb8sAqR5gxwACcCmADiVUBg8AAnAvAKkfDMcAAnBRgA4lVAYHAAJwVwCpHeiuEwACcKsAqR+cWwACcQRbAAJw5LoEVwABQr4EVwABGzQDAAFvlSsAAnE8BhMAAnFbAKkfnBsAAUNqBBMAAnwzAAJ8fwAC9OAAAwABAWgAAAAEDwACfMsAAvTgAAAAGAwPAAJ9DAAAAhUtgA4lVAMAAn1YAAACBiGADiR8AwACfYAAAAIQBYAPAAGwfAAPAAJ94AAAAguZgA8AAbFsBasAAn4BgA8AAbFscwACfkgAAAMAAQFtgA8AAbFsBasAAn6BgA8AAbFsewACfsQAAAMAAQFxgA8AAbFsBasAAn8pgA8AAbFscYAPAAFGOAT4KQCIhHMAAn+yAwACf38AqSN0nAQABKwCJWQAewACf98AAWPUBAAGAwACf/8AqSN0AwACf38AAoAwAPYjAAKAUwCpI3RzAAKAjLsAAQF0BAAGAwACgOMAqSN0AwABRA0nAAKBMIiXAAKBdAIDAAKBQwCpI3WADib4AHMAAoHWBwACgcMAqSOsnAQABGsAAoHjAAE/ZAIkrPgFKwACgigFqwACgl2ADwABRjsABFvU/TsAAoMvAAKDVAACC02ADgzIBIyXAAKDkAIDAAKDXwCpI3WADiaoWwAChDBTAAKD/wCpI3QABYAOJqoLTibAWwAChKhbAAKEgLoCQwABQtYlLje8BYAODMk7AAKFCwAChUgAAtwtgA4OsARzAAKFcLsAAQF/AAFBlBAAEhsAAoXDAKkoagcAAoXvAKkjrg8AAoYHAKkkKgsAAoYnAKkj5AMAAUNROwAChrQAAAIC+YAPAAFGOAEnAAKG5IRzAAKHNh8AAob3AKkpyJwEAASsAwABsXj4BPRXAAKHewCpKvggewACh68AAUZUBAAGHwACiDsAqSnIAScAAoislwACiPACAwACiL8AqSN1gA4lyPgE9FcAAolTAKkq+CGrAAKJjYAPAAFGOwAEXI0nAAKKMJcAAop0AgMAAopDAKkjdYAOJjj4BQUfAAKKzFsAAosgUwACiu8AqSN0AAWADiY6DZYmQAwHAAKLwasAAovBgA4lHhS0APgI9FcAAowfAKkq+CGrAAKMWYAPAAFGOwAEXUULAAKM8AALAAKNcasAAo1xgA4lHhR7AAKN/asAAo39gA4lHhOUAPgFKwACjyAEcwACjzy7AAEBaAwADFsAAo+0WwACj4y6AkMAAULWDV44JgcAAo/fAKkjrgsAAo/3AKkj5AMAAUNoBwACkI2rAAKQjYAOJR4cDAD4BSsAApDsBJsAApDsFHsAApEK1OwMAAxzAAKSPasAApGFdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPoeKNbwMAAyTAAKTNARbAAKTAFMAApLPAKkjdAAFgA4mOg2WJkBTAAKThwCpI3QABYAOJjhbAAKUBLoNWwABQtgCy64LAAKUowCpI+RbAAKVKFsAApUIugRXAAFCvg23AAEbCAGADwABRjknAAKVnJcAApXgAgMAApWvAKkjdYAOJZD4BPRXAAKWQwCpKvghqwACln2ADwABRjsABF39JwAClyCIiJcAApdkAgMAApczAKkjdYAOJqgAcwACmDBbAAKYCFMAApfXAKkjdAAFgA4mqgtOJsCcBAAEWwACmGRbAAKYPLoCQwABQtYkmjdYAwABsXgAcwACmN4HAAKYywCpI6ycBAAEawACmOsAAT9kAiSs+AT0VwACmTMAqSr4IasAApltgA8AAUY7AARb1PgE9FcAAppHAKkq+CGrAAKagYAPAAFGOwAEXrUnAAKbIIiKEwACmzMAqSSYAIRzAAKbxgMAApuTAKkjdJwEAAWrAAKb6YAOJcoWxAIlZABbAAKcaFMAApxPAKkq+CACExMAAUZg+AT01wACnNAAAAQBgA8AAY/EBFsAApzQuwABAKcAAUKwjHMAApzQUwACnNMAqTfcJACcBAAErAMAAbF4rHMAAp0UUwACnNMAqTfcJAMAAQGQEAAQWwACnTC7AAEAkwABQqYLAAKdjwCpI+SeAvh/AAKeHwABkAQEAARbAAKesFMAAp6XAKkq+CACERMAAUZEAAMAAY/MBXD9JwACnwSIiFsAAp8wUwACnxcAqSr4IAITmwABRmwAhJcAAp/EAgMAAp+TAKkjdYAOJcgCFwACoDMAqSUQ+CU7AAKgywACoPAAAwABAZWADiR8BgcAAqD7AKkjrTsAAqE8AAADAAEBmYAPAAGxbAEnAAKhkHMAAqG2BwACoaMAqSOsnAQABGsAAqHDAAE/kAIkrPgI9FcAAqLPAKk7LCRrAAKi/wABP5T0VwACo1cAqTugKKknAAKj5HMAAqQKBwACo/cAqSOsnAQABGsAAqQXAAE/lAIkrPgI9FcAAqUjAKk7LCRrAAKlUwABP5D0VwACpasAqTugKKj4CPRXAAKmYwCpOywmBwACppMAqSOs9FcAAqbLAKk7oCiGDwACpw8AqSQpOwACp4cAAqe0AAMAAQGdgA4OsARzAAKn5LsAAQF/AAFBlBAAEhsAAqg3AKkoaFMAAqhjAKk7LCQAUwACqI8AqTugKAILAAKoywCpI+QDAAFDUScAAqkUhHMAAqlUUwACqScAqT7ALACcBAAErAMAAbF4+AUrAAKrrARTAAKrywCpKvggAP07AAKsiAAAAuC9gA8AAUbUATsAAq1LAAKtjAADAAEBoXQPAAGwZAWADwABRtQExwACrZWADwABRtQA9HMAAq3cWwACrby6BFcAAUK+66wEAATTAAKuPA8AAq4/AALxHAAAAAQEBwACroQAAAK/qYAPAAExoAABgAcAAbFwBPgNOwACry8AAq9cAAMAAQGlgA8AAThQBJsAAq8sBHMAAq/YUwACr5cAqUJoOAL6lAgABgcAArA7AKkjrAYLmg8AArBzAKkkKwABMb2ADwABOFE7AAKw7wACsSAAAwABAamADwABOFAEmwACsOwEcwACsaBTAAKxKwCpQmg4AvqUCAAEUwACsgMAqTssJAAGC5hTAAKyTwCpO6AoAwABMb2ADwABOFEnAAKyrIiIhHMAArLwUwACssMAqULUPACcBAAErAMAAbF4AIRbAAKzUFMAArMjAKlC1DwCDvcAAQEoBIiEcwACs+xTAAKzuwCpRBRAAJwEAASsAwABsXgAhFsAArRQUwACtB8AqUQUQAIO9wABASj4FTsAArTQAAACErmADiVUATsAArU8AAADAAEBrYAOJVQBOwACtgwAAAMAAQGxdA8AAbBkBYAOJVQBJwACtpBbAAK3SFsAArcMWwACtuRTAAK2owCpQmg4AhEfAAExsg2ODhIFWwABs8z4CPRXAAK3pwCpR2RIVwACuFcAqUcoRFsAArjkWwACuLxTAAK4ewCpQmg4AhEfAAExshK6DhT0VwACuTcAqUeoTasAArmVdA8AAbBkBYAOJVYTyPghOwACurMAArrsAAINjXQPAAGwZAWADiiYBFsAArugWwACu3hTAAK7NwCpQmg4AhEfAAExsg2ODhD0VwACvBMAqUeoTHMAArxwuwABAWAIAAhbAAK9aFMAAr0nAKlCaDgCER8AATGyAwACvZcAqSN0AwABQ2U7AAK+NwACvogAAwABAbWADljgBHsAAr8GWQgIAAhTAAK/LwCpShhQAFMAAr9vA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nJQ/SsAA0KABHMAA0K4WwADQpy6Tr8AAULCu+AMAAxzAANDUhMAA0MbAKmbrjW8DAAMWwADQ54LAANDiwCpmzYGIiSIcwADQ+y7AAEBdAQABgcAA0RDAKma/AMAAUQMWwADRHy6DVsAAULYAsuuDwADRQsAqZtuFwADRWMAqZ5wAwABkHz9KwADRawErBsAAUN6BBMAA0tzAANLlwADcxAAAwABAfAAAAAEDwADS8sAA3MQAAAACAgLAANMGAAAAgL5gA8AAUY4AwADTFwAAAIVLYAOJVQAAYAOJVQE+AkfAANMrFsAA0zqAwADTM8AqaPmDvsAAUZAFAcAA02RqwADTZGADwABRfMABFuEAPgFKwADTegGBwADTgcAqaQkEwADTsWrAANOxYAPAAFF8wAEXxsAA099qwADT32ADwABRfMABFw7AANQKasAA1ApgA8AAUXzAARdqwADUNWrAANQ1YAPAAFF8wAEXmAA+AUrAANRGAWrAANRTYAOJcoWxAcAA1IRqwADUhGADwABRfMABFzwAPgFKwADUkwFqwADUoGADiY6G9wHAANTmasAA1OZgA8AAUXzAARfgAD4BSsAA1P4BHMAA1QUuwABAUQIAAhbAANUpgMAA1SLAKmj5hETAAFGRgcAA1THAKmkJAMAAUN8BwADVYmrAANViYAPAAFF8wAEX+QA+AUFHwADVexbAANWKgMAA1YPAKmj5wABAgMAAUZ8DAsAA1b5qwADVvmADhJKGZ8AA1eNqwADV42ADhJKGdgA+BE7AANYGwADWEwAAuvpgA4m+ARzAANY8FsAA1jMWwADWLIDAANYlwCpo+YREwABRkYTHg76FBAEAARbAANZYFsAA1lAugRXAAFCvhD7AAEFPAIUBTsAA1obAANaeAACu210DwABsGQFgA4omARzAANciHMAA1t4WwADWvoLAANagwCpqi4NjicCOKwEAARbAANcJFsAA1uqAwADW48AqaPnAAECBwABRoIDgwABsagDAAG2bgKAAAAAAwABsZk7AANdFwADXUgAAg81gA5Y4AR7AANdhlkICAAKDwADXfMAqat4WwADXnIDAANeVwCpo+cAAQIHAAFGgAErAANfJARzAANfdhMAA19DAKmtIg2cBAAEfwADX8InZBgADHMAA2DgcwADYMBbAANgbgsAA2A7AKmqLhHCJwpUjAQABlADAAG4cgKAAAAAAwABsZhbAANhfgsAA2FLAKmqLhQOJxhbAANiDFsAA2HsugRXAAFCvhD7AAEFPA4RxFsAA2L6CwADYscAqaouEcYnDg2McwADZaBzAANkgFsAA2PyCwADY78AqaouDY4nAlSMBAAEWwADZSxbAANksgMAA2SXAKmj5wABAgcAAUaCA4MAAbGoAwABuHICgAAAAAMAAbGaE5RzAANnSFsAA2buCwADZrsAqaouE5YnBRAEAAZQAwABs4QCWRwHAANn2asAA2fZgA4SShlgAPgROwADaF8AA2iQAALr6YAOJvgEcwADaTRbAANpEFsAA2j2AwADaNsAqaPmERMAAUZGEx4O+hQQBAAEWwADaaRbAANphLoEVwABQr4Q+wABBTwCFAU7AANqXwADarwAArttdA8AAbBkBYAOKJgEcwADbMxzAANrvFsAA2s+CwADascAqbKKDY4nAjisBAAEWwADbGhbAANr7gMAA2vTAKmj5wABAgcAAUaCA4MAAbGoAwABtm4CgAAAAAMAAbGZOwADbVsAA22MAAIPNYAOWOAEewADbcpZCAgACg8AA243AKmz1FsAA262AwADbpsAqaPnAAECBwABRoABKwADb2gEcwADb7oTAANvhwCptX4NnAQABFsAA3AqCwADb/cAqbKKFA4nGAJZHAsAA3DRqwADcNGADhJKFCcAA3FlqwADcWWADhJKGRAA+AULAANxuAD0wwADciR7AANyPtT0EAAQkwADcogGAwADcm8AqaPknwABAfCsrAAbAAFDfgQTAAN41wADePsAA4VUAAMAAQFEAAAABA8AA3lrAAOFVAAAAAgICwADeaQAAALcLYAODrADAAN6DAAAAhUtgA4lVAABgA4lVAT4FTsAA3p3AAN6pAADAAECCYAODMgEWwADeu4DAAN6rwCpuQ4Mzg7RAIiXAAN7mAIDAAN7WwCpuQ2ADg8wBJcAA3wIAgMAA3vLAKm5DYAOES8AA3tbAAN8OASTAAN9HAyfAAECDgMAA3zbAKm5DJ4D3TsAA31fAAN9iAADAAECEYAOJVQEWwADfdIDAAN9kwCpuQ4TIg79JwADfhBbAAN+jFsAA35SCwADfiMAqbmiDY4NCIsAAbCI+Aj2JwADft8AqblEcwADfxi7AAEBdAQABgcAA39vAKm5RAMAAUQNJwADf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wAERTxTAARE/wCqGdAIBYAODzIGXg84+AT0wwAERcB7AARF2tT0EAAQcwAERnBbAARGQgsABEYDAKoZ0hU7AAG0tgVMAAAAAwABtiifAAECRKysAScABEeYWwAESBRbAARH2g8ABEerAKoaag2ODQiLAAGwiPgI9icABEh3AKoW3HMABEiwuwABAXQEAAYHAARJBwCqFtwDAAFEDScABElolwAESawCBwAESXsAqhbdgA4mqPgE9jMABEovAKobAHMABE2YewAESpZZCAgACFsABEtCDwAESxMAqhpqDY4NCHMABEwMWwAES9C6Aj8AAUKuC4wIAAhTAARM5wCqFtwEBYAOJqoPAARNHwCqGmgCBggCDZwEAAYTAARN1wCqGwACWRz8/SsABE6ABhMABE6fAKobAAcABE9VqwAET1WADwABRfMABF/kAPgJBR8ABE+4WwAET/YDAARP2wCqFp8AAQIDAAFGfAgHAARQxasABFDFgA4SShQkAPgROwAEUUsABFF8AALr6YAOJvgEcwAEUiBbAARR/FsABFHiAwAEUccAqhaeERMAAUZGEx4O+hQQBAAEWwAEUpBbAARScLoEVwABQr4Q+wABBTwCFAU7AARTSwAEU6gAArttdA8AAbBkBYAOKJgEcwAEVbhzAARUqFsABFQqCwAEU7MAqiWGDY4nAjisBAAEWwAEVVRbAARU2gMABFS/AKoWnwABAgcAAUaCA4MAAbGoAwABtm4CgAAAAAMAAbGZOwAEVkcABFZ4AAIPNYAOWOAEewAEVrZZCAgACg8ABFcjAKom0FsABFeiAwAEV4cAqhafAAECBwABRoABKwAEWFQEcwAEWOoTAARYcwCqKHoNnAQABHMABFmoWwAEWVoLAARZJwCqJYYRwicIpAQABlADAAGy4AJZHBMABFo1qwAEWjWADhJKGZ8ABFrJqwAEWsmADhJKGWMABFtdqwAEW12ADhJKGRMABFv1qwAEW/WADhJKGdgA+AULAARcTAUrAARdrAWrAARd4YAOJcoWxAcABF6lqwAEXqWADwABRfMABFuEAPgFCwAEXvwA9MMABF9AewAEX1rU9BAAEHMABF/MWwAEX54DAARfgwCqFp4VOwABtLYFTAAAAAMAAbYonwABAkSsrAAbAAFDqgQTAARgkwAEYLcABGP8AAMAAQAkAAAABA8ABGD7A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NguHwAE2C8AqnN0nAQABKwDAAGxeKxzAATYTh8ABNgvAKpzdrGADAANqwAE2K2ADstvAANuDFsABNk2AwAE2QsAqmgWEAYJZasABNllgA8AAbB8DAMAAZCEBXD8/ScABNnYlwAE2jgAWwAE2gYXAATZ6wCqbHI4wwABRWGADiY4+AT0cwAE2sRbAATakLq9SwABQpr0bAAAAAMAASgQ/SsABNskBhcABNtDAKpscBsAAUPKBBMABNt/AATb2wAE42AAArzEBasABNuBgA8AAbFaAtQAAAQPAATcLwAE42AAAAAMDA8ABNyEAAACTr2ADwABkGADAATc2AAAAgTNgA4lVAMABN04AAACEy2ADhRoAAGADhRoBPgdAHMABN3sWwAE3bC6LsMAAULEnAQABKwDAAGxewAE3bMABN4IAQCEWwAE3kS6J+8AAUKrAATeQwAE3mwA9F8ABN6cuk6+AwAE3sMAqneHAAFCwTsABN9bAATfoAACc0GADwABRVgEcwAE38i7AAECcBAADgsABOALAKp3/gcABOA/AKp3xKQHAAEASKcAAUPE9isABODjAKp3/HMABOEYuwABAGQMAAoHAAThdwCqd8YPAAThmwCqeaAHAAEASJcABOJgAgcABOJDAKp3xYAOJgMAAUME9F8ABOK8uk68rwABQsErAATjCAYLAATjJwCqd/wbAAFDzgQTAATjdwAE488ABO4YAAK9eAWrAATjeYAPAAGxWgLUAAAEDwAE5BMABO4YAAAAEBATAATkVAAAAk69gA8AAZBgAwAE5JgAAAIUDYAOJVQDAATlEAAAAhRpgA4ULAMABOVsAAACE+GADh/gAAGADh/gBPgpAIRzAATlzg8ABOW7AKp9qJwEAASsAwABsXsABOW7AATl6AEAcwAE5lxbAATmILouwwABQsScBAAErAMAAbF7AATmIwAE5ngA9F8ABOaouk6+AwAE5s8Aqnz7AAFCwPRfAATm/LouwHsABOdTAAFB3BAAELoLAATnpwCqfXIHAATn2wCqfTioAwABQsU7AATonwAE6LgAAgbBgA8AAUR0BHMABOjAuwABApAEAAYPAATo/wCqfagDAAFD/PRfAATpKLouwK8AAULE9F8ABOmouk68rwABQsEnAATp9IRzAATqQFsABOoEuvn7AAFCoJwEAASsAwABsXj4BScABOqEhFsABOrMWwAE6pi6vUsAAUKaOM8AASeo+AT0cwAE7GBbAATrsFsABOtkWwAE6yi6+fsAAUKjAAEAvwABbl8AAQKXAAFudNgEAAYPAATscwCqfagDAAGxHPz89HMABO0IWwAE7NS6vUsAAUKaHGAAAAADAAEn5SsABO1ABIxbAATtehMABO1fAKqANwABApsAAUSUWwAE7coTAATtrwCqgDYUXwABRJoPAATt+wCqfagFgA4f4BsAAUPSBBMABO4vAATulwAFB2gAAwABApwAAAAEDwAE7tMABQdoAAAALBQXAATu+AAAAuM9gA4lVAMABO88AAACECmADwABsHwDAATvqAAAAwABAhGADib4AwAE8AAAAAIGtYAOF5ADAATwQAAAAgOVgA4kfAAbAATwoAAAAhVlgA8AAbFsBasABPEhgA8AAbFscwAE8XgAAAIUDYAOJVQFqAGABwABsXALAATx5AAAAhUtgA4lVAWoAYAHAAGxcAsABPJIAAADAAECoYAPAAGxbAWrAATytYAPAAGxbHMABPL8AAACEwWADwABsWwFqwAE8yGADwABsWxzAATzaAAAAwABAqWADwABsWwFqwAE89WADwABsWxxgA8AAUT4BPgRAIhzAAT0ehsABPRPAKqHHJwEAASsAiVkBIR7AAT0qlikBAAGGwAE9TMAqoccAwAE9E8ABPVcBJMABPVcGJ8AAQKqGwAE9b8AqoccnwABAqyfAAECsgsABPbbAKqF+J4D3TsABPc3AAT3pAAC40mADwABsHwEewAE968AAQz4BAAGDwAE+CsAqoY4AScABPhohHMABPjoUwAE+HsAqorgLACcBAAGTAMAAbDI+AkAcwAE+WobAAT5PwCqhxycBAAErAIlZwAE+T8ABPmEBJ8AAQK1KwAE+uAEcwAE+vy7AAECuwABQZQsABhTAAT7mwCqiuAsAgMABPw3AKqFggcABPxrAKqFugsABPyLAKqF+g8ABPy7AKqGOhMABPznAKqGcBYVZhcABP2/AKqGrhUuHwAE/p8Aqod7AAECoFMABP9rAKqH1CACEwRTAAUAIwCqiEwkAwABAqRTAAUA2wCqiLwoAwABQyT9KwAFAXAEcwAFAYy7AAECvwABQZQsABYDAAUB9wCqhYIHAAUCKwCqhboLAAUCSwCqhfoPAAUCewCqhjoTAAUCpwCqhnAaF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HwDAAiXtAAAAga1gA4XkAAHAAiYEAAAAwABA1GADwABsWwFqAGABwABsXAJgA4UaAT4CQCEcwAImQYXAAiYqwCs3vScBAAErAMAAbF7AAiYqwAImSABJwAImTxbAAiZTLon7wABQqj4BSsACJmcBHMACJocWwAImdRbAAiZuLsAAQCjAAFCkrrzAAFuBshEEAASAwAImnsArN3SBwAImqsArN4SDwAImtMArN6CEwAImusArN64AwABWfD4BSsACJtkBHMACJucWwAIm4C6Tr8AAULCu+AMAAxzAAicXasACJv9dA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPsPONbwMAAxbAAicqg8ACJyXAKzeggYiJIhzAAic+LsAAQF0BAAGCwAInU8ArN5IAwABRAxbAAidiLoNWwABQtgCy64DAAieFwCs3dCOFwAInm8ArN71qwAIntGADwABsHwMWwAInyRbAAifEg8ACJ7/AKzeggYiJIoDgwABskQFgA8AAbB8AwABkHwbAAFEKgQTAAiffwAIn6sACKc0AAMAAQPcAAAABA8ACKALAAinNAAAABAQEwAIoBwAAAIQBYAPAAGwfAMACKB4AAACFSWADhRoAwAIoNwAAAIVLYAOJVQDAAihKAAAAuRFgA4kfAABgA4UaAT4BScACKF4WwAIoYi6J+8AAUKo+AUrAAih2ARzAAiiWFsACKIQWwAIofS7AAEAowABQpK68wABbgcAAQPgDAAOAwAIoqMArOWKBwAIotMArOXKDwAIovsArOY4AwABWgT4BSsACKOABHMACKO4WwAIo5y6Tr8AAULCu+AMAAxzAAikeasACKQZdA7LnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPsIONbwMAAxbAAik5g8ACKSzAKzmOgYiJIhzAAilNLsAAQF0BAAGCwAIpYsArOYAAwABRAxbAAilxLoNWwABQtgCy64DAAimUwCs5YhbAAim8FsACKbeDwAIpqsArOY6BiIkigODAAGyRAMAAZB8GwABRC4EEwAIp0sACKd3AAiwwAADAAED5AAAAAQPAAin1wAIsMAAAAAYFBcACKfoAAACEAWADwABsHwDAAioRAAAAhUlgA4UaAMACKioAAACFS2ADiVUAwAIqPQAAALkRYAOJHwDAAipWAAAAgT5gA4UaAAHAAippAAAA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WGYAAACFfmADhRoAAGADhRoAAAArWnYAK1qmACta5gAAAAICwABRRYEEwAJYdsACWHzAAlllA8AAQRgAAAFgA8AAbFYAAWADwABRPgEEwABRR4EEwAJY2sACWOYJjjABasACWMBgA8AAbFaAtWADiVUAAQXAAFFLgQTAAljrwAJY68ACWRcAAAADwAJZBMACWRcAAAABAQHAAlkKAAAEjjBgA4lVAABgA8AAUUUBPwIIAcAAUUeAAMArW2wJAcACWOvAAGxaAAAAAAEGwABRSYEEwAJZHMACWTPAAlljAADAAEDRAWrAAlkdYAPAAGxWgLUAAAEDwAJZPsACWWMAAAABAQHAAllKAAAAhX5gA4UaAABgA4UaAUrAAllZAYDAAllZwCtb2AAAK1ufACtb+wAAAAECwABRTIEEwAJZaMACWW7AAlsRA8AAQRkAAAFgA8AAbFYAAWADwABRPgQEwABRToEEwAJZz8ACWdsJjjABasACWbVgA8AAbFaAtWADiVUABMAAUU+BBMACWe7AAln1CYCWAGADss8ABMAAUVCBBMACWgTAAloKCYDgAGADwABsHwAEwABRUYEEwAJaJcACWisJk68AYAPAAGQYAAEFwABRVYEEwAJaMMACWjDAAlqOAAAAA8ACWkzAAlqOAAAABAQEwAJaWQAABI4wYAOJVQDAAlpsAAAEgJZgA7LPAMACWnoAAASA4GADwABsHwDAAlqHAAAEk69gA8AAZBgAAGADwABRTAE/BQgBwABRToAAwCtcyQgBwABRT4EAwCtc1wgBwABRUIIAwCtc5QgBwABRUYMAwCtc9QkBwAJaMMAAbFoAAAAAAQbAAFFTgQTAAlqTwAJaqsACWw8AAMAAQNEBasACWpRgA8AAbFaAtQAAAQPAAlq1wAJbDwAAAAEBAcACWsEAAACFfmADhRoAAGADhRoBPgFKwAJa0wEcwAJa4RbAAlraLpOvwABRUa8hAwADgMACWu/AK12HFsACWvsugJbAAFFPFsACWwQugODAAFFQAMAAZCIAACtdTgArXd8AAAABAsAAUVaBBMACWz/AAltFwAJehAPAAEEaAAABYAPAAGxWAAACBMAAUViBBMACW53AAlupCY4wAGADiVUABMAAUVmBBMACW97AAlvoCYV+AGADhRoAAQXAAFFhgQTAAlvtwAJb7cACXE0AAAAD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2AAAAAEDwABDLMAARgoAAAACAgLAAEM/AAAAgKJgA8AAUioAwABDVAAAAICjYAPAAFIqAABgA8AAUioBPgNDwABFMCEcwABFSBbAAEU5gMAARTfAK5owwABBYMAAUi4nAQABFsAARU2BwABFS8ArmkDAAEFgwABSLgDAAGwyPgFJwABFZRzAAEV6FsAARWuAwABFacArmjDAAEFgwABSLoE7AQABFsAARX6BwABFfMArmkDAAEFgwABSLgDAAGyGPgE9iMAARZjAK5owFsAARZ6AwABFnMArmjCKfcAAUi0+AT2JwABFv8ArmkAWwABFxYHAAEXDwCuaQIp9wABSLUAewABF6MAAbPcCAAKAwABF8sArmjCBwABF9cArmkAAwABF6MAARfcASsAARf4BgMAARgXAK5owBsAAUiSBBcAARojAAEaNwABJFwAAwABBZMAAUdgAAAABA8AARpjAAEkXAAAAAQEBwABGoAAAAIGIYAPAAGwYAABcAT4ET8AARqzAAEbIAAABwABBZWEDAWADwABSKl0DwABsIAFgA8AAUioAA8AARtHAAEdYAAEAAQEBwABG5AAAAK/dYAPAAFIqAABdA8AAbCABYAPAAFIqAT4ETgAAAAAYYAPAAGwfAZNOAAAAABlbAE/AAEasAAAAAKAuWwADwABG0cAAR1gEAAABAQEAAAAAmuVdA8AAbt0BYAPAAFIqAABgA8AAbFsBPgI+AUPAAEb4IRzAAEcEgsAARv/AK5vPJwEAASsAwABsXj4CPgI9FwCGAMArnCKJZcAAbBeCwABHHcArm8/AAG7gTcAARxcCKT2KwABHK8Arm88WwABHN4LAAEcywCubz8AAQWHAAFIvSsAAR1gBKkoAAR8AwABu4wEBYAPAAFIqAYUAwCucCwA9HMAAR3gcwABHXy7AAEFdwABR2AAAAADAAFIggbEBAAE0wABHgAPAAEeAwABIAwAAAAICAsAAR4EAAACFFGADiOcAwABHiwAAAK/dYAPAAFIqAABgAcAAbFwBPgJJwABHmRzAAEeig8AAR53AK50KJwEAASsAwABsXkrAAEerAD89HsAAR7nAAGwnAQABJMAAR/sEJ5TuNcAAR8QAAAEAYAOI5wGCwABHxMArnPwjHMAAR8SEwABHxMArnV8nAQABKwDAAGxeJ8AAQWaEwABHxMArnV8BYAPAAGxWJ4ayHMAAR+0cwABH5oHAAEfdwCubnoCVAQABg8AAR+fAK50KAACGvAEAASfAAEFnAMAAbS8AAMAAbLBJwABICiEcwABIIxbAAEgOLsAAQU/AAFHYwABSBycBAAErAMAAbF4+Aj0ewABINMAAbCcBAAEkwABIaQInwABBaBbAAEhULsAAQU/AAFHYwABSBwBJwABIciEewABId8AAbPcCAAIWwABIgS7AAEFQwABR2MAAUggWwABIoy7AAEFOwABR2MAAUgYAPgE9HsAASL3AAGwnAQABJMAASPMCJ8AAQWkWwABI0i7AAEFQwABR2MAAUggAPz89HsAASQjAAGwnAQABgMAASQ7AK5uEAAbAAFIlgQXAAEs8wABLQcAATCUAAMAAQVvAAFHYAAAAAQPAAEtbwABMJQAAAAMDA8AAS2cAAACFfmADhRoAwABLiwAAALz0YAPAAFIqAMAAS6UAAAC89WADwABSKgAAXAE+Az0XwABLtC7AAEFPwABR2IDAAEvLwCue38AAUgc9F8AAS9suwABBUMAAUdiBwABL/sArnu3AAFIIPRfAAEwKLsAAQU7AAFHYgsAATBrAK579wABSBgAAK4orACuKcAArizUAK4toACuMGAArjW0AK45cACuPOQArkNgAK5GcACuSZwArkpsAK5QTACuURwArlUsAK5WLACuVugArlekAK5YdACuZBQArmV0AK5oAACubVAArnq8AK59mAAAAGALAAFIqgQXAAFC6wABQycAAXpsHrrQAAAFgA8AAbFYAAAcEwABSLIEFwABRfsAAUYYJhRQAYAOI5wAEwABSLYEFwABSJcAAUi0Jin0AYAPAAFIqAATAAFIugQXAAFOiwABTsAnAAEFgAGADwABsHwAEwABSL4EFwABUXMAAVG8JwABBYQBgA8AAUioABMAAUjCBBcAAVMjAAFTcCa7OAGADwABsHwAEwABSMoEFwABWCsAAVhoYwABBasAAUdgAXQPAAGxXAWADwABSOwErBMAAUjOBBcAAV1rAAFd0GMAAQWvAAFHYAF0DwABsVwFgA8AAUjsBKwEFwABSOoEFwABXecAAV3nAAFf4AAAAA8AAV4rAAFf4AAAABQUFwABXkAAABMAAQWBgA8AAbB8AwABXpQAABIUUYAOI5wDAAFe0AAAEin1gA8AAUioAwABXyQAABMAA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AFN3hsAAS87ALCx/AbkKKcAAVoIAwABWdErAAEv5ATXAAEwEAAABAGADwABE9AEfwABMBMAARQADAAOEwABMF8AsK32FwABMIcAsK8eHwABMJ8AsLRAANcAATC8AAAEAXAEXwABMLxTAAEwEwCwt5AgAhAGBwABMPMAsKqmCWRTAAEwEwCwt5AgABsAAU4SBCMAATEvAAExhwABNRQAAsQ4BasAATExgA8AAbFaAtQAAAQPAAExzwABNRQAAAAMCAsAATH8AAACDKGADhRoAwABMjAAAAKlqYAO+TQABwABMnwAAAK+lYAPAAGxbAWoAYAHAAGxcAmADwABTOQE+AkAhHMAATMaCwABMusAsLqInAQABKwDAAGxewABMusAATM0ASsAATNQBH8AATN/AAFPdBQAEFsAATPYuwABBpcAAUzXAAFM8gcAATP/ALC6THMAATQYurvcAAAAAwABTf4DAAE0ZwCwuhQGvpYLAAE01wCwuogbAAFOFgQjAAE2XwABNqMAAT1MAAcAAQb4AAAABA8AATazAAE9TAAAABQUFwABNxwAAAJOvYAPAAFYKAMAATdUAAACpamADvk0AwABN7QAAAIVJYAOFGgDAAE38AAAAgYhgA4kfAMAATgcAAACvpWADwABsWwAAYAPAAFM5AT4BScAAThocwABOLBbAAE4lgMAATh7ALC9lrrzAAFYOshABAAGCwABOPcAsL4MAwABWcT4BSsAATlABH8AATlvAAFOcAwADgMAATnfALC9lgcAATn/ALC91g8AATobALC+RAD4BSsAATqABI4TAAE6nwCwvnx/AAE7DwABTsQQABIDAAE7kwCwvZYHAAE7swCwvdYLAAE7zwCwvg4PAAE79wCwvkQAfwABPE8AAU4cEAASAwABPK8AsL2WBwABPM8AsL3WCwABPOsAsL4ODwABPRMAsL5EAAWADwABTOQAALCK8ACwi/gAsI0wALCP0ACwk8gAsJX4ALCZTACwo2gAsKl8ALC5OACwvOQAsMJUAAAALAsAAU4iBCMAAU9fAAFPdwABhmQPAAEG/AAABYAPAAFM5AAABBMAAU4qBCMAAVHrAAFR+CYGIAGADiR8AAQXAAFOcgQjAAFSDwABUg8AAVPwAAAADwABUnsAAVPwAAAADAwPAAFTAAAAAk69gA8AAVgoAwABUzgAAAKlqYAO+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QckAwABuGz0ewACqcsAAR9EDAAIWwACqfi6DKMAAU/KAwACqhcAsflgBlLGBwACqm8Asfm49HMAAqrWAwACqsMAsflhFAQABJ8AAQcYAwABuGz0ewACqzsAAR9IDAAIWwACq4y6WVcAAU/OAwACq68AsflgBlLGBwACrAcAsfm49HMAAqxuAwACrFsAsflhFAQABJ8AAQccAwABuGz0ewACrNMAAR9IDAAIWwACrSS6C5sAAU/SAwACrUcAsflgBlLGBwACrZ8Asfm4AACx1IgAsdWIALHWlACx27gAsePIALHosACx7eQAsfIUALH02ACx+IQAsf2sAAAAKAsAAVASBCMAAsFbAALBcwADDfgPAAEHNAAABYAPAAFM5AAADBMAAVAaBCMAAsLzAALDGCYDlAGADwABsGAAEwABUB4EIwACx5sAAsfAJr/EAYAODrAAEwABUCIEIwACzGcAAsyQJuAwAYAODrAABBcAAVByBCMAAsynAALMpwAC0IwAAAAPAALM+wAC0IwAAAAUFBcAAs1kAAACTr2ADwABWCgDAALNnAAAAqWpgA75NAMAAs3kAAASA5WADwABsGADAALOKAAAEr/FgA4OsAMAAs5sAAAS4DGADg6wAAGADwABUBAE/BggBwABUBoIAwCyATggBwABUB4MAwCyAXggBwABUCIQAwCyAbAwAQCEcwACzwoLAALO3wCyATicBAAErAMAAbDbAALO3wACzyQAMAEAiIRzAALPmg8AAs9vALIBeJwEAASsAwABsXgEhHMAAs/2EwACz8cAsgGwnAQABKwDAAGxewACz28AAtAQACQDAALQPwABTXQIAAoDAALQVwCyAMIHAALQdwCyAQAANBsAAVAqBCMAAtCjAALQwwAC1cQQBwABBzgAAAAEDwAC0UcAAtXEAAAAFBQXAALRzAAAAk69gA8AAVgoAwAC0iAAAAIDlYAPAAGwYAMAAtKAAAACpamADvk0AwAC0uwAAAK/tYAPAAE4UAMAAtN4AAACv62ADwABOFAAAYAPAAFQEAT4BSsAAtPMBH8AAtP7AAFQcBQAFgMAAtRTALIFagsAAtRzALIF6gcAAtSPALIFqNcAAtTcAAAEAYAPAAE4UAYPAALU3wCyBiCMcwAC1N4XAALU3wCyB4CcBAAErAMAAbF4rFsAAtUaFwAC1N8AsgeCv8cAA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LJM8CAHAAFQhhADALJNMCAHAAFQihQDALJNaCAHAAFQjhgDALJNoCAHAAFQkhwDALJN2CAHAAFQlFADALJOECAAMAEAhHMAAzXWDwADNasAskzwnAQABKwDAAGw2wADNasAAzXwADABAIiIhHMAAzaaEwADNm8Ask0wnAQABKwDAAGxeASEcwADNvoXAAM2xwCyTWicBAAErAMAAbF4BIRzAAM3VhsAAzcnALJNoJwEAASsAwABsXsAAzZvAAM3cAAwAQCEcwADN/IfAAM3uwCyTdicBAAErAMAAbF7AAM3uwADOAwAJAMAAzg7AAFNdAgACgMAAzhTALJMQgcAAzhzALJMgAA8GwABUJ4EIwADOJ8AAzi/AANRIBAHAAEHOAAAAAQPAAM5bwADUSAAAAAgICMAAzn0AAACTr2ADwABWCgDAAM6RAAAAqWpgA75NAMAAzqgAAACER2ADg4AAwADOwAAAAIDlYAPAAGwYAMAAzuYAAACu2mADiOcAwADPDwAAAK7bXQPAAGwZAWADiiYAwADPPAAAAK/tYAPAAE4UAMAAz18AAACv62ADwABOFAAAYAPAAFQdAT4GTsAAz34AAACv8WADhEsATsAAz5gAAAC4DWADhEsAScAAz6ohHMAAz7yGwADPrsAslUonAQABKwDAAGxePgFJwADPzRbAAM/fhsAAz9HALJVKhP3AAEA9PgJAIRbAANAJhsAAz/vALJVKg73AAEBKwADP+sAA0BEAPRXAANAcwCyVdQgmwADQHAEWwADQN4bAANApwCyVSq/xwABOGmADhEtJwADQUBbAANBihsAA0FTALJVKr+7AAEBHPgNAIRbAANCThsAA0IXALJVKg73AAEBKwADQhMAA0JsAPRXAANCmwCyVdQgmwADQpgEWwADQwYbAANCzwCyVSq/xwABOGmADhEs9FcAA0NXALJWECSbAANDVARbAANDyhsAA0OTALJVKuA3AAE4cYAOES0nAANENFsAA0R+GwADREcAslUqwv8AAQEg+AkAhFsAA0UuGwADRPcAslUqDvcAAQErAANE8wADRUwA9FcAA0V7ALJWECSbAANFeARbAANF7hsAA0W3ALJVKuA3AAE4cYAOESz8/TsAA0aUAAAC4DGADhEsAScAA0bYhHMAA0ciHwADRusAslVonAQABKwDAAGxePgFJwADR2RbAANHrh8AA0d3ALJVag3/AAEBJPgNAIRbAANIVh8AA0gfALJVag73AAEBKwADSBsAA0h0APRXAANIowCyXBwomwADSKAEWwADSRIfAANI2wCyVWrgMwABOG2ADhEs9IxzAANJkg8AA0lnALJUXJwEAASsAwABsNovAANJZwCyVFxbAANJ2h8AA0mjALJVagYjAAE5dKwFgA8AAbBg+AUrAANKTASbAANKTBR7AANKatT0EAAQkwADSzwEWwADSwofAANK0wCyVWoVOwABtLSfAAEHTHsAA0xnAAFAuAQABgcAA0yjALJT7ABbAANNDgMAA0zzALJTrgUzAAGQbAGADwABUHT9KwADTWwEfwADTZsAAVDsJAAmAwADTkMAslOuBwADToMAslPuCwADTr8AslQmDwADTwsAslRcUwADT1sAslXUIABTAANPqwCyVhAkAFMAA1ADALJcHCgCEwADUFcAslSeFwADULMAslTUABsAAVCqBCMAA1E3AANRkwADUlAEAwABBqMAAUzUBasAA1E5gA8AAbFaAtQAAAQPAANRvwADUlAAAAAAAAABgA8AAbBgBSsAA1HIBJ8AAQdQGwABUK4EIwADUmcAA1LDAANTPAQDAAEGnwABTNQFqwADUmmADwABsVoC1AAABA8AA1MLAANTPAAAAAAAAAGADwABsGAFKwADUxQEWwADUxS6A5cAAVCAGwABULIEIwADU1MAA1NzAANUgAQC4dMAAUzUAAAABA8AA1PnAANUgAAAAAAAAAGADwABsHwFKwADU/AE1wADU/AAAAQBgA8AAbB8BNcAA1PwAAAEAXQPAAGwZAWADiiYBFsAA1PwurtvAAFQlIxzAANT8gMAA1PzALJmeJwEAASsAwABsYisWwADVFYDAANT8wCyZnoDgwABsagFgA8AAbB8jHMAA1PyAwADU/MAsmY4nAQABKwDAAGwyk4DAANT8wCyZjgFgA8AAbB8GwABUL4EIwADVJcAA1TTAANcKAADAAEHVwABTNQAAAAEDwADVUcAA1woAAAAAAAAAXQPAAGwZAWADiVUBPgNOwADVacAA1YAAALjUXQPAAGwZAWADiVUBasAA1YJdA8AAbBkBYAOJVYTyScAA1ZohHMAA1bYWwADVni6u28AAVCUnAQABKwDAAGxiPgI9iMAA1cfALJpdMcAA1eBgA4lVAD4CTsAA1g4AAAA8XQPAAGxKAWADiiYBFsAA1g4eAMAAbC8BAV0DwABsIAFgA4omARbAANYOLq7bwABUJQA9wABsS0UAAAEcwADWDoEAwCyawT4AAAAAwABsTQA+Ak7AANX9AAAAhXBgA4omARbAANYngQDALJrBQMAAbE8+AT0cwADWSIDAANYxwCyaXTYBAAEcwADWYRbAANZZLsAAQabAAFM1wABTQcAAQdYCAAKCwADWqsAsmxwWwADWwxbAANa5LoRHwABUH4OJg4gAwABWeQDAAGxHP0rAANbpAYDAANbwwCyaXQbAAFQygQjAANcPwADXJsAA11YAAK73AWrAANcQYAPAAGxWgLUAAAEDwADXNcAA11YAAAAAAAAAYAOFGgE+AUrAANc+ARzAANdFLsAAQbfAAFM1AAAAAMAAVDAGwABUMIEIwADXW8AA12bAANmcAADAAEG3wABTNQAAAAEDwADXccAA2ZwAAAAAAAAAYAOFGgE+A07AANeFAAAAimBgA4UaAEnAANePHMAA154WwADXky6v8cAAVCEnAQABKwDAAGxePgE9iMAA16/ALJw5HMAA17YuwABBsMAAUzUAAAAAwABTTj4BPYjAANfdwCycORzAANfsFsAA1+QuwABBpcAAUzXAAFM8sSQEAAMWwADYFi6EAcAAUz4WwADYLC6v8cAAVCEcwADYURbAANhKFsAA2EIuwABBpcAAUzXAAFM8rrzAAFYOwABAzwUABBbAANiCLoQBwABTPhbAANicLrh0wABTNcAAVCyTHMAA2OEWwADY2S7AAEGlwABTNcAAUzyv2wIAAhbAANjzLq7awABUJBbAANkCLoQBwABTPgDAAFYuAbjUHMAA2TUuwABB1cAAUzUAAAAAwABUL8AAVjYBsSUhHMAA2XkWwADZbC64DcAAVCInAQABKwDAAGxewABWGkrAANmNAYDAANmUwCycOQbAAFQzgQjAANmhwADZuMAA2j0AALGIAWrAANmiYAPAAGxWgLUAAAEDwADZx8AA2j0AAAACAQHAANnTAAAAgT5gA4UaAAHAANngAAAAsYlgA8AAbFsBasAA2e1gA8AAbFscYAOFGgE+AUrAANn7ARzAANoCLsAAQbjAAFM1AwACFsAA2g8uhAHAAFM+gMAA2hvALJ3OAbkKgcAA2i3ALJ3dwABUMQbAAFQxgQjAANpCwADaTcAA3DoAAMAAQbjAAFM1AAAAAQPAANpZwADcOgAAAAMCAsAA2l4AAACECmADwABsHwDAANpxAAAAgT5gA4UaAAHAANp+AAAAuQpgA8AAbFsBagBgAcAAbFwCYAOFGgE+BE7AANqbAAAARWADhRoAScAA2qYcwADathbAANqqLrgMwABUIycBAAErAMAAbF4+AT2LwADax8AsnqwcwADazy7AAEGxwABTNQEAAYHAANrhwCyefADAAFNPPgE9i8AA2vzALJ6sH8AA2wjAAEYMBwAFFsAA2yAuhEfAAFQfHMAA2zUuwABB1cAAUzUAAAAAwABULxzAANtoFsAA22AuwABBpcAAUzXAAFM8r9sCAAIWwADbei6u2sAAVCQWwADbiS6EAcAAUz4AwABWLhbAANugLrgMwABUI4HAANu3wCyefAK5CoLAANvTwCyei7kTKT0XwADcEYPAANwLwCyerIQBgMAA3B7ALJ5sgllKwADcKgGDwADcMcAsnqwGwABUNIEIwADcP8AA3FbAAN1lAADAAEGqAWrAANxAYAPAAGxWgLUAAAEDwADca8AA3WUAAAAEAwPAANx3AAAAgT5gA4UaAMAA3IcAAACBl2ADiVUAwADckQAAAIQKYAPAAGwfAAHAANylAAAAsYlgA8AAbFsBasAA3LJgA8AAbFscYAOFGgE+AUrAANzAATXAANzLAAABAGADwABEvQEfwADcy8AARMkDAAIcwADc3i7AAEG3wABTNQAAAADAAFQwHMAA3O0uwABBuMAAUzUDAAIWwADc+i6EAcAAUz6AwADdBsAsn/8BuQqDwADdGMAsoCzAAFQxAbkKg8AA3TnALKAsNcAA3U4AAAEAXAEXwADdToTAANzLwCygVoQBgsAA3VvALKAbglmEwADcy8AsoFYGwABUNYEIwADdasAA3YHAAN76AADAAEGrAWrAAN1rYAPAAGxWgLUAAAEDwADdmMAA3voAAAAGAgLAAN2eAAAAwABBrGADiR8AwADduQAAAIE+YAOFGgAEwADdywAAAIQKYAPAAGwfAWrAAN3cYAPAAGwfhRnAAN3xAAAAsYlgA8AAbFsBasAA3f5gA8AAbFscwADeEAAAAMAAQa1gA8AAbFsBasAA3h1gA8AAbFscwADeLwAAAMAAQa5gA8AAbFsBasAA3j1gA8AAbFscYAOFGgE+Ak7AAN5WwADeXQAAwABBuWADhRoBHMAA3ncWwADeZxbAAN5fLsAAQaXAAFM1wABTPK68wABWDq++BAAEgsAA3oTALKFQHMAA3owuwABBt8AAUzUAAAAAwABUMIDAAN6bwCyhMYHAAN6rwCyhQQDAAFaGSsAA3rcBHMAA3r4uwABBuMAAUzUDAAIWwADeyy6EAcAAUz6GwADe18Asoc0BuQqDwADe6sAsoW3AAFQxBsAAVDaBCMAA3v/AAN8WwADiQQAAwABBrwFqwADfAGADwABsVoC1AAABA8AA3yvAAOJBAAAAAwEBwADfMQAAAMAAQaxgA4kfAALAAN9MAAAAhApgA8AAbB8BasAA315gA8AAbB+FGcAA320AAACxiWADwABsWwFqwADfe2ADwABsWxxgA4UaAT4GTsAA35TAAN+aAACBPmADhRoBHMAA36QWwADfnC7AAEGmwABTNcAAU0GwCwIAAoHAAN+1wCyiw5QAwABWPknAAN/FgsAA38nALKLgPgFKwADf3gEcwADf5S7AAEGrBQACgMAA3/3ALKKyg8AA4A3ALKMEA4QKgcAA4CbALKLDsYmCwADgO8AsouDAAEGuKcAAVDU/TsAA4HvAAOCAAACKYGADiOcBHMAA4JkWwADgkhbAAOCKLsAAQaXAAFM1wABTPK68wABWDq+oAQABHMAA4LsuwABBt8AAUzUAAAAAwABUMADAAFZ0TsAA4NrAAODhAADAAEG5YAOFGgEcwADg8hbAAODrFsAA4OMuwABBpcAAUzXAAFM8rrzAAFYOr74EAASBwADg/8AsosMcwADhFxbAAOEPLsAAQaXAAFM1wABTPK/bAgAChMAA4SnALKOXFsAA4S8uhAHAAFM+AMAAVi6AwADhPMAsorKDwADhTMAsowQAwABWhk7AAOFswADhcgAARWADiOcBHMAA4YwWwADhfBbAAOF0LsAAQaXAAFM1wABTPK68wABWDq+oAQABHMAA4bsuwABBuMAAUzUDAAIWwADhyC6EAcAAUz6FwADh1MAso+sBuQopwABUMQDAAFZ0SsAA4fMBNcAA4f4AAAEAYAPAAET0AR/AAOH+wABFAQIAAoTAAOIcwCyjl4bAAOIiwCykfAA1wADiKgAAAQBcARfAAOIqh8AA4f7ALKTthAGBwADiN8AsosOCWYfAAOH+wCyk7QbAAFQ3gQjAAOJGwADiXcAA5eoAAK+hAWrAAOJHYAPAAGxWgLUAAAEDwADiacAA5eoAAAACAgLAAOJuAAAAhApgA8AAbB8AwADigAAAAIGtYAOF5AAAYAOFGgE+AUnAAOKRIRzAAOKiFsAA4pUuuA3AAFQiJwEAASsAwABsXj4BSsAA4rMBHMAA4sIWwADiui7AAEGlwABTNcAAUzyxJAQAA4DAAOLswCylgRbAAOL+LrgNwABUIhzAAOMeFsAA4xYuwABBpsAAUzXAAFNBwABAzwgABBbAAONPLoQBwABTPhbAAONpLrh0wABTNcAAVCwcwADjwRbAAOO6FsAA46sWwADjohbAAOOVLrgNwABUIoTHhFCDY4TzgODAAGxqRAEAARbAAOPVLrh0wABTNcAAVCwAwABs4RzAAOQJFsAA5AEuwABBpcAAUzXAAFM8r9sCAAIWwADkGy6u2sAAVCSAwADkKsAspYEAwABWLgS41BzAAORZLsAAQdXAAFM1AAAAAMAAVC+DcxbAAOShgcAA5JfALKWRg8uF5pzaFsAA5NWBwADky8AspZGFW4Xnm74WwADlCYHAAOT/wCylkYUjhejAAFY2AbElKsAAVho+AUrAAOVBARzAAOVXFsAA5VAWwADlSC7AAEGlwABTNcAAUzyuvMAAVg6vogMAAx7AAOV9wABTNwIAAhbAAOWTLsAAQafAAFM1wABUK4DAAOWmwCylgQAcwADluS6u9wAAAADAAFQygcAA5dbALKWRAMAAVnsGwABUOIEIwADl78AA5gXAAObpAACxDgFqwADl8GADwABsVoC1AAABA8AA5hfAAObpAAAAAwICwADmIwAAAIMoYAOFGgDAAOYwAAAAqWpgA75NAAHAAOZDAAAAr6VgA8AAbFsBagBgAcAAbFwCYAPAAFM5AT4CQCEcwADmaoLAAOZewCyn4icBAAErAMAAbF7AAOZewADmcQBKwADmeAEfwADmg8AAU90FAAQWwADmmi7AAEGlwABTNcAAUzyBwADmo8Asp9McwADmqi6u9wAAAADAAFQygMAA5r3ALKfFAa+lgsAA5tnALKfiBsAAVDmBCMAA5u7AAOb/wADoagAAt6EBasAA5u9gA8AAbFaAtQAAAQPAAOcGwADoagAAAAEBAcAA5xIAAACBC2ADwABuDgAAXAE+B07AAOcpwADnOAAAlLFgA5mDAR/AAOc+mZ4AAAAAPRzAAOdVgMAA51DALKiwRQEAASfAAEHPAMAAbhs9HMAA53eAwADncsAsqLBFAQABFsAA530ugOXAAFQgAMAAbhs9HMAA55OAwADnjsAsqLBFAQABJ8AAQdAAwABuGz0ewADnsMAAR9IDAAIWwADnxS6v8cAAVCGAwADn0cAsqLABlLGBwADn58AsqMY9HMAA6AGAwADn/MAsqLBFAQABJ8AAQdEAwABuGz0ewADoH8AAR9IDAAIWwADoNC64DMAAVCOAwADoQcAsqLABlLGBwADoV8AsqMYAACyUvwAsmKoALJj6ACyZUQAsmh0ALJulACycAAAsnZcALJ48ACyfxgAsoPgALKJ5ACylSgAsp44ALKh5ACypuQAAAA8CwABUPIEIwADq/8AA6wXAASY6A8AAQdcAAAFgA8AAUzkAAAoEwABUPoEIwADrpsAA68EJuNUAYAPAAGwfAATAAFQ/gQjAAOvWwADr3wmERwBgA4OAAATAAFRAgQjAAOwWwADsIAmA5QBgA4kfAATAAFRBgQjAAO1pwADtcwmv8QBgA4RLAATAAFRCgQjAAO6qwADutgm4DQBgA4RLAATAAFRDgQjAAPAcwADwJwm4DABgA4RLAATAAFREgQjAAPDMwADw1AmFSQBgA4UaAATAAFRFgQjAAPF3wADxjAm5EABdA8AAbBkBYAOJVQAEwABURoEIwADx5sAA8gEJuNIAYAPAAGwfAATAAFRHgQjAAPJVwADyYAmvpQBgA8AAbFsAAQXAAFRdgQjAAPJlwADyZcAA9McAAAADwADyjcAA9McAAAAMCwvAAPKvAAAAk69gA8AAVgoAwADywwAAAKlqYAO+TQDAAPLVAAAEuNVgA8AAbB8AwADy/QAABIRHYAODgADAAPMTAAAEgOVgA4kfAMAA8yoAAASv8WADhEsAwADzQQAABLgNYAOESwDAAPNaAAAEuAxgA4RLAMAA83IAAASFSWADhRoAwADzhwAABLkQXQPAAGwZAWADiVUAwADzqQAABLjSYAPAAGwfAAHAAPPSAAAEr6VgA8AAbFsBagBgAcAAbFwCYAPAAFQ8AT8PCAHAAFQ+ggDALKtjCAHAAFQ/gwDALKtzCAHAAFRAhADALKuBCAHAAFRBhQDALKuPCAHAAFRChgDALKudCAHAAFRDhwDALKurCAHAAFREFADALKu5CAAIAcAAVEUUAMAsq8cJAAgBwABURhQAwCyr3AoACAHAAFRHFADALKvtCwAMAEAhHMAA8/qEwADz78Asq4EnAQABKwCJK8AA8+/AAPQBAAwAQCIiIRzAAPQrhcAA9CDALKuPJwEAASsAwABsXgEhHMAA9EOGwAD0NsAsq50nAQABKwDAAGxeASEcwAD0WofAAPROwCyrqycBAAErAMAAbF7AAPQgwAD0YQAMAEAhHMAA9HwUwAD0c8Asq7kIACcBAAErAMAAbF7AAPRzwAD0gwAMAEAhHMAA9KEUwAD0lcAsq+0LACcBAAErAMAAbF7AAPSVwAD0qAAJAMAA9LPAAFNdAgACgMAA9LnALKtFgcAA9MHALKtVAA8GwABUSYEIwAD0zMAA9NTAAP9dBAHAAEHOAAAAAQPAAPUIwAD/XQAAAAsKCsAA9SoAAACTr2ADwABWCgDAAPU+AAAAqWpgA75NAMAA9U8AAAC41WADwABsHwDAAPV8AAAAhEdgA4OAAMAA9ZIAAACA5WADiR8AwAD1rAAAAK/tYAPAAEAuAMAA9ckAAACv62ADwABALgDAAPXpAAAAhUlgA4UaAMAA9ggAAAC5EF0DwABsGQFgA4lVAMAA9ikAAAC40mADwABsHwABwAD2UgAAAK+lYAPAAGxbAWoAYAHAAGxcAmADwABUPAE+B0AiIRzAAPZ7hcAA9m3ALK3yJwEAASsAwABsXgEhHMAA9pSGwAD2hsAsrgInAQABKwDAAGxewAD2bcAA9psATsAA9qwAAACv8WADhEsATsAA9sYAAAC4DWADhEsAScAA9tghHMAA9uqFwAD23MAsrfInAQABKwDAAGxePgJAIRbAAPcRhcAA9wPALK3yg73AAEBKwAD3AsAA9xkAScAA9yIlwAD3NACFwAD3JsAsrfJgA8AAQrA+A07AAPdowAD3bgAAJGADwABCsAEmwAD3aAGFwAD3cMAsrfJgA8AAQrA9jcAA94fALK3yFsAA950UwAD3l8AsryANAIeDwABCpkAWwAD4R4XAAPg5wCyt8oN/wABAScAA+DnAAPhPAEnAAPhfFsAA+HGFwAD4Y8AsrfKE/cAAQD0+A0AhFsAA+JuFwAD4jcAsrfKDvcAAQErAAPiMwAD4owBOwAD4vMAA+MoAAK/vYAPAAE4UASbAAPi8AYXAAPjMwCyt8mADwABOFD0VwAD448AsrqcLJsAA+OMBFsAA+P4UwAD48MAsr8ANAK/xwABOGmADhEtJwAD5FxbAAPkphcAA+RvALK3yr+7AAEBHPgRAIRbAAPlahcAA+UzALK3yg73AAEBKwAD5S8AA+WIATsAA+XvAAPmMAAC6rGADwABOFAEmwAD5ewGFwAD5jsAsrfJgA8AAThQ9FcAA+aXALK6nCybAAPmlARbAAPnDFMAA+bLALLBODQCv8cAAThpgA4RLPRXAAPnXwCyutgwmwAD51wEWwAD59xTAAPnmwCywTg0AuA3AAE4cYAOES0nAAPoSFsAA+iSFwAD6FsAsrfKwv8AAQEg+A0AhFsAA+lCFwAD6QsAsrfKDvcAAQErAAPpBwAD6WABOwAD6ccAA+n8AAK/vYAPAAE4UASbAAPpxAYXAAPqBwCyt8mADwABOFD0VwAD6mMAsrrYMJsAA+pgBFsAA+rUUwAD6p8AssQcNALgNwABOHGADhEs+AUrAAPraASbAAPraBR7AAPrhtT0EAAQkwAD7JwSFwAD6+sAsrfIng6QWwAD7GYXAAPsLwCyt8oVOwABtLSeDoyfAAEHYHsAA+3HAAFAuAQABgcAA+4DALK24ABbAAPubgMAA+5TALK2ogUzAAGQbAGADwABUPD9OwAD7vQAAALgMYAOESwBJwAD7ziEcwAD74IbAAPvSwCyuAicBAAErAMAAbF4+AkAhFsAA/AeGwAD7+cAsrgKDvcAAQErAAPv4wAD8DwBJwAD8GCXAAPwqAIbAAPwcwCyuAmADwABCsD4AScAA/GYWwAD8eIbAAPxqwCyuAoN/wABAST4DQCEWwAD8oobAAPyUwCyuAoO9wABASsAA/JPAAPyqAE7AAPzDwAD80QAAr+9gA8AAThQBJsAA/MMBhsAA/NPALK4CYAPAAE4UPRXAAPzqwCyx0w0mwAD86gEWwAD9BhTAAPz4wCyydw4AuAzAAE4bYAOESz4BSsAA/SoBJsAA/SoFHsAA/TG1PQQABCTAAP13BIbAAP1KwCyuAieDpBbAAP1phsAA/VvALK4ChU7AAG0tJ4OjJ8AAQdgewAD9wcAAUC4BAAGBwAD90MAsrbgAFsAA/euAwAD95MAsraiBTMAAZBsAYAPAAFQ8P0rAAP4DAR/AAP4OwABUXQwAC4DAAP5AwCytqIHAAP5QwCytuILAAP5fwCytxoPAAP6EwCyt1oTAAP6XwCyt5BTAAP6rwCyupwsAFMAA/r/ALK62DAAUwAD+1cAssdMNAIfAAP7qwCyuEhTAAP78wCyuIAgAFMAA/xvALK41CQABr6UUwAD/TcAsrkYKAAbAAFRMgQjAAP9iwAD/ecAA/7ABAMAAQajAAFM1AWrAAP9jYAPAAGxWgLUAAAEDwAD/hMAA/7AAAAAAAAAAYAPAAGwYAUrAAP+HASfAAEHZBsAAVE2BCMAA/7XAAP/MwAD/8AEAwABBp8AAUzUBasAA/7ZgA8AAbFaAtQAAAQPAAP/ewAD/8AAAAAAAAABgA8AAbBgBSsAA/+EBFsAA/+wWwAD/4S6A5cAAVECBiIkiBsAAVFGBCMAA//XAAQAEwAEAYAAAwABB1cAAUzUAAAABA8ABACHAAQBgAAAAAAAAAF0DwABsGQFgA4lVAT4BSsABACoBNcABADEAAAEAXQPAAGwZAWADiVUBFsABADEuuRDAAFRFIxzAAQAxgMABADHALLTFJwEAASsAwABsYmrAAQBKXQPAAGwZAWADiVWE8oDAAQAxwCy0xQFdA8AAbBkBYAOJVQbAAFROgQjAAQFswAEBdcABAZoBAMAAQdoAAAABA8ABAYPAAQGaAAAAAAAAAGADwABsWwFKwAEBhgEhHMABAZMWwAEBhi64DcAAVEInAQABKwDAAGxeBsAAVFSBCMABAZ/AAQG2wAEDXAAArvcBasABAaBgA8AAbFaAtQAAAQPAAQHFwAEDXAAAAAAAAABgA4UaAT4BScABAc4WwAEB0i6vpcAAVEc+Ak7AAQH7wAECBAAAhRRgA4jnARzAAQIfFsABAhgWwAECEC7AAEGlwABTNcAAUzyuvMAAVg6vqAEAARbAAQJBLoVJwABURADAAFZ0SsABAlIBNcABAl0AAAEAYAPAAEYNAR/AAQJdwABGGAIAAoDAAQJ7wCy1zhzAAQKPLsAAQbfAAFM1AQABHMABAqMWwAECmy7AAEGlwABTNcAAUzyv2wMAAoDAAQK1wCy1zhbAAQLIgMABAr/ALLXOhAGCWQGv3CnAAFYuAMAAVFIANcABAwoAAAEAXAEXwAEDCoHAAQJdwCy2HoQBFsABAxcuhAHAAFM+glmBwAECXcAsth4+AUrAAQM2ARzAAQM9LsAAQbfAAFM1AQABFsABA0kuhUnAAFREAMAAVFIGwABUUoEIwAEDYcABA2zAAQWfAADAAEG3wABTNQAAAAEDwAEDd8ABBZ8AAAABAQHAAQODAAAAhUlgA4UaAABgA4UaAT4DTsABA54AAACKYGADhRoAScABA6gcwAEDtxbAAQOsLq/xwABUQScBAAErAMAAbF4+AT2JwAEDyMAstzscwAEDzy7AAEGwwABTNQAAAADAAFNOPgE9icABA/bALLc7HMABBAUWwAED/S7AAEGlwABTNcAAUzyxJAQAAxbAAQQvLoQBwABTPhbAAQRFLq/xwABUQRzAAQRqFsABBGMWwAEEWy7AAEGlwABTNcAAUzyuvMAAVg7AAEDPBgAEFsABBJsuhAHAAFM+FsABBKcuuNLAAFRGk4DAAQTHwCy3JAK41BzAAQT3LsAAQdXAAFM1AAAAAMAAVFG41RbAAQVDLrjVwABUPsAAVjYBsSUWwAEFdi7AAEHawABUTsAAVhpKwAEFkAGBwAEFl8AstzsGwABUVYEIwAEFpMABBbvAAQhqAACxiAFqwAEFpWADwABsVoC1AAABA8ABBcrAAQhqAAAAAgEBwAEF1gAAAIE+YAOFGgABwAEF4wAAALGJYAPAAGxbAWrAAQXwYAPAAGxbHGADhRoBPgFJwAEF/hbAAQYCLq+lwABURz4CTsABBivAAQY0AACFFGADiOcBHMABBk8WwAEGSBbAAQZALsAAQaXAAFM1wABTPK68wABWDq+oAQABFsABBnEuhUnAAFREAMAAVnRKwAEGggE1wAEGjQAAAQBgA8AARg0BH8ABBo3AAEYYAgACgsABBqvALLjiHMABBr8uwABBuMAAUzUFAAMWwAEG2y6EAcAAUz4cwAEG/RbAAQb1LsAAQaXAAFM1wABTPK/bAwACgsABBw/ALLjiFsABByKCwAEHGcAsuOKEAYJZAa/cKcAAVi6AwAEHa8AsuJwCuQqBwAEHi8AsuKu5EynAAFRTADXAAQfJAAABAFwBF8ABB8mDwAEGjcAsuTKEARbAAQfWLoQBwABTPoJZg8ABBo3ALLkyPgFKwAEH9QEcwAEH/C7AAEG4wABTNQUAAxbAAQgJLoQBwABTPhbAAQgVLoVJwABURIDAAQgfwCy4nAK5CoHAAQg7wCy4q7kTKsAAVFMGwABUU4EIwAEIb8ABCHrAAQo9AADAAEG4wABTNQAAAAEDwAEIhsABCj0AAAAFAwPAAQiLAAAAhApgA8AAbB8AwAEIngAAAIVJYAOFGgDAAQizAAAAgT5gA4UaAALAAQjGAAAAuRNgA8AAbFsBagBgAcAAbFwCwAEI3QAAALkKYAPAAGxbAWoAYAHAAGxcAmADhRoBPgROwAEI+gAAAEVgA4UaAEnAAQkFHMABCRUWwAEJCS64DMAAVEMnAQABKwDAAGxePgE9jcABCSbALLrlHMABCS4uwABBscAAUzUBAAGCwAEJQMAsupwAwABTTz4BPY3AAQlbwCy65R/AAQlnwABGDAcABRbAAQl/LoRHwABUPxbAAQmKLrkQwABURYHAAQmhwCy6jhbAAQmrLrgMwABUQ4LAAQm4wCy6nAK5E4PAAQnbwCy6q7kKhMABCfjALLrEPRfAAQoUhcABCg7ALLrlhAGAwAEKIcAsun6CWUrAAQotAYXAAQo0wCy65QbAAFRWgQjAAQpCwAEKWcABD6oAAMAAQaoBasABCkNgA8AAbFaAtQAAAQPAAQpuwAEPqgAAAAQDA8ABCnoAAACBPmADhRoAwAEKigAAAIGXYAOJVQDAAQqUAAAAhApgA8AAbB8AAcABCqgAAACxiWADwABsWwFqwAEKtWADwABsWxxgA4UaAT4BScABCsMWwAEKxy6vpcAAVEc+BE7AAQrwwAEK+QAAhRRgA4jnARzAAQsUFsABCw0WwAELBS7AAEGlwABTNcAAUzyuvMAAVg6vqAEAARbAAQs2LoVJwABURADAAFZ0TsABC1LAAQtXAACKYGADhRoBHMABC1kuwABBt8AAUzUBAAEcwAELbRbAAQtlLsAAQaXAAFM1wABTPK/bAwAChMABC4rALLxqFsABC50WwAELlC6FScAAVESEAYJZAa/cKcAAVi4AwABUUk7AAQviwAEL6AAARWADhRoBHMABC+ouwABBuMAAUzUFAAMWwAEMAi6EAcAAUz4cwAEMIBbAAQwYLsAAQaXAAFM1wABTPK/bAwAChMABDDLALLxqFsABDEUWwAEMPC6FScAAVESEAYJZAa/cKcAAVi6AwAEMhsAsvAYCuQqDwAEMosAsvDO5EynAAFRTSsABDNgBNcABDOMAAAEAYAPAAEYNAR/AAQzjwABGGAIAAoTAAQ0BwCy8ajXAAQ0ZAAABAGADwABEvQEfwAENGcAARMkDAAKFwAENI8AsvLSGwAENKcAsvR4BuQqDwAENO8AsvDM1wAENVgAAAQBcARfAAQ1Wh8ABDRnALL3VhAGCwAENY8AsvCKCWYfAAQ0ZwCy91QA1wAENdQAAAQBcARfAAQ11h8ABDOPALL2whAEWwAENgi6EAcAAUz6CWYfAAQzjwCy9sD4ETsABDbXAAQ2+AACFFGADiOcBHMABDdkWwAEN0hbAAQ3KLsAAQaXAAFM1wABTPK68wABWDq+oAQABFsABDfsuhUnAAFREAMAAVnROwAEOF8ABDhwAAIpgYAOFGgEcwAEOKC7AAEG3wABTNQEAARzAAQ48FsABDjQuwABBpcAAUzXAAFM8r9sCAAKEwAEOTsAsvnMWwAEOYRbAAQ5YLoVJwABURIQBglkAwABWLgDAAFRSTsABDoDAAQ6GAABFYAOFGgEcwAEOiC7AAEG4wABTNQUAAxbAAQ6VLoQBwABTPhzAAQ6zFsABDqsuwABBpcAAUzXAAFM8r9sCAAKEwAEOxcAsvnMWwAEO2BbAAQ7PLoVJwABURIQBglkAwABWLoDAAQ7lwCy8BgK5CoPAAQ8BwCy8M7kTKcAAVFNKwAEPLQE1wAEPOAAAAQBgA8AARK8BH8ABDzjAAES8BAADhMABD0rALL5zhcABD1TALL69hsABD1rALL8kAbkKg8ABD3bALLwzNcABD40AAAEAXAEXwAEPjYfAAQ84wCy/s4QBgsABD5rALLwiglmHwAEPOMAsv7MGwABUV4EIwAEPr8ABD8bAARTBAADAAEGrAWrAAQ+wYAPAAGxWgLUAAAEDwAEP3cABFMEAAAAGAgLAAQ/jAAAAwABBrGADiR8AwAEP/gAAAIE+YAOFGgAEwAEQEAAAAIQKYAPAAGwfAWrAARAhYAPAAGwfhRnAARA2AAAAsYlgA8AAbFsBasABEENgA8AAbFscwAEQVQAAAMAAQa1gA8AAbFsBasABEGJgA8AAbFscwAEQdAAAAMAAQa5gA8AAbFsBasABEIJgA8AAbFscYAOFGgE+AUnAARCQFsABEJQur6XAAFRHPgROwAEQvcABEMYAAIUUYAOI5wEcwAEQ4RbAARDaFsABENIuwABBpcAAUzXAAFM8rrzAAFYOr6gBAAEWwAERAy6FScAAVEQAwABWdE7AAREfwAERJgAAwABBuWADhRoBHMABETcWwAERMBbAAREoLsAAQaXAAFM1wABTPK68wABWDq++BAAEgsABEU/ALMB8HMABEWEuwABBt8AAUzUBAAEcwAERdRbAARFtLsAAQaXAAFM1wABTPK/bAwAChsABEYfALMEMFsABEZoWwAERkS6FScAAVESEAYJZAa/cKcAAVi4AwABUUoDAARHcwCzAXYHAARH2wCzAbQDAAFaGTsABEg/AARIVAABFYAOFGgEcwAESFy7AAEG4wABTNQUAAxbAARIvLoQBwABTPhzAARJNFsABEkUuwABBpcAAUzXAAFM8r9sDAAKGwAESX8AswQwWwAESchbAARJpLoVJwABURIQBglkBr9wpwABWLofAARKzwCzBVgK5CoPAARLQwCzAmbkTKcAAVFNKwAETBgE1wAETEQAAAQBgA8AARg0BH8ABExHAAEYYAgAChsABEyTALMEMFMABEy7ALMIJCAAANcABEzYAAAEAXAEXwAETNhTAARMRwCzCmwkAhAGCwAETQ8AswHyCWRTAARMRwCzCmwkAPgFKwAETXgE1wAETaQAAAQBgA8AARMoBH8ABE2nAAETgDQAIFsABE34uhEfAAFQ/FsABE4kuuRDAAFRFFsABE6ouhUnAAFREFsABE7QugOXAAFRAFsABE8Aur/HAAFRBgMABE8zALMBdgcABE9zALMBtFsABE+MuuAzAAFRDBbkTKrkKg8ABFCjALMCZrXwWwAEUSy6EAcAAUz65FILAARRvwCzAfIfdFsABFI4uhAHAAFM+NcABFKQAAAEAXAEXwAEUpIbAARNpwCzDB4QBgsABFLHALMB8glmGwAETacAswwcGwABUWIEIwAEUxsABFN3AAR10AADAAEGvAWrAARTHYAPAAGxWgLUAAAEDwAEU8sABHXQAAAADAQHAART4AAAAwABBrGADiR8AAsABFRMAAACECmADwABsHwFqwAEVJWADwABsH4UZwAEVNAAAALGJYAPAAGxbAWrAARVCYAPAAGxbHGADhRoBPgJOwAEVW8ABFWEAAIE+YAOFGgEcwAEVaxbAARVjLsAAQabAAFM1wABTQbALAgACgcABFXzALMQrlADAAFY+ScABFYyCwAEVkMAsxEg+AUrAARWlARzAARWsLsAAQasFAAKAwAEVxMAsxBqDwAEV1MAsxGwDhAqBwAEV7cAsxCuxiYLAARYCwCzESMAAQa4pwABUV0nAARYvFsABFjMur6XAAFRHPgVOwAEWXMABFmUAAIUUYAOI5wEcwAEWgBbAARZ5FsABFnEuwABBpcAAUzXAAFM8rrzAAFYOr6gBAAEWwAEWoi6FScAAVEQAwABWdE7AARbHwAEWzAAAimBgA4jnARzAARboFsABFtYWwAEWzi7AAEGlwABTNcAAUzyuvMAAVg6vqAEAARzAARcKLsAAQbfAAFM1AQABHMABFy0WwAEXJS7AAEGlwABTNcAAUzyv2wMAAoTAARc/wCzFERbAARdSFsABF0kuhUnAAFREhAGCWQGv3CnAAFYuAMAAVFIAwABWdE7AARegwAEXpwAAwABBuWADhRoBHMABF7gWwAEXsRbAARepLsAAQaXAAFM1wABTPK68wABWDq++BAAEgcABF8XALMQrHMABF98WwAEX1y7AAEGlwABTNcAAUzyv2wIAAoXAARfxwCzFWxbAARf3LoQBwABTPgDAAFYugMABGATALMQag8ABGBTALMRsAMAAVoZOwAEYNsABGDwAAEVgA4jnARzAARhYFsABGEYWwAEYPi7AAEGlwABTNcAAUzyuvMAAVg6vqAEAATXAARh6AAABAGADhRoBHMABGHouwABBuMAAUzUFAAMWwAEYli6EAcAAUz4cwAEYuBbAARiwLsAAQaXAAFM1wABTPK/bAwAChMABGMrALMURFsABGN0WwAEY1C6FScAAVESEAYJZAa/cKcAAVi6GwAEZJsAsxfECuQqCwAEZR8AsxEi5EynAAFRTNcABGYgAAAEAXAEXwAEZiIfAARh6wCzGuoQBFsABGZUuhAHAAFM+glmHwAEYesAsxroAwABWdErAARmoATXAARmzAAABAGADwABGDQEfwAEZs8AARhgCAAKEwAEZ0cAsxRE1wAEZ3wAAAQBgA8AARQIBH8ABGd/AAEUNAgAChcABGe/ALMVbh8ABGfXALMaCADXAARn9AAABAFwBF8ABGf0UwAEZ38Asx6UIAIQBgcABGgrALMQrglkUwAEZ38Asx6UIAAA1wAEaHAAAAQBcARfAARocFMABGbPALMeACACEARbAARopLoQBwABTPoJZFMABGbPALMeACAA+BU7AARpcwAEaZQAAhRRgA4jnARzAARqAFsABGnkWwAEacS7AAEGlwABTNcAAUzyuvMAAVg6vqAEAARbAARqiLoVJwABURADAAFZ0TsABGsfAARrMAACKYGADiOcBHMABGugWwAEa1hbAARrOLsAAQaXAAFM1wABTPK68wABWDq+oAQABHMABGwouwABBt8AAUzUBAAEcwAEbLRbAARslLsAAQaXAAFM1wABTPK/bAgAChMABGz/ALMhAFsABG1IWwAEbSS6FScAAVESEAYJZAMAAVi4AwABUUgDAAFZ0TsABG3LAARt5AADAAEG5YAOFGgEcwAEbihbAARuDFsABG3suwABBpcAAUzXAAFM8rrzAAFYOr74EAASBwAEbl8AsxCscwAEbsRbAARupLsAAQaXAAFM1wABTPK/bAgAChcABG8PALMiKFsABG8kuhAHAAFM+AMAAVi6AwAEb1sAsxBqDwAEb5sAsxGwAwABWhk7AARwIwAEcDgAARWADiOcBHMABHCoWwAEcGBbAARwQLsAAQaXAAFM1wABTPK68wABWDq+oAQABNcABHEwAAAEAYAOFGgEcwAEcTC7AAEG4wABTNQUAAxbAARxZLoQBwABTPhzAARx7FsABHHMuwABBpcAAUzXAAFM8r9sCAAKEwAEcjcAsyEAWwAEcoBbAARyXLoVJwABURIQBglkAwABWLobAARytwCzJHQK5CoLAARzOwCzESLkTKcAAVFM1wAEdAQAAAQBcARfAAR0Bh8ABHEzALMnmhAEWwAEdDi6EAcAAUz6CWYfAARxMwCzJ5gDAAFZ0SsABHSEBNcABHSwAAAEAYAPAAET0AR/AAR0swABFAAMAA4TAAR0/wCzIQIXAAR1JwCzIiofAAR1PwCzJrgA1wAEdVwAAAQBcARfAAR1XFMABHSzALMqpCACEAYHAAR1kwCzEK4JZFMABHSzALMqpCAAGwABUWYEIwAEdecABHZDAASO4AACvoQFqwAEdemADwABsVoC1AAABA8ABHZzAASO4AAAAAgICwAEdoQAAAIQKYAPAAGwfAMABHbMAAACBrWADheQAAGADhRoBPgZOwAEd2AAAAMAAQdtgA4jnAE7AAR35wAEeDAAAwABBwmADhRoBFsABHg4uhUnAAFREScABHhwWwAEeIC6vpcAAVEc+Aj2KwAEeNcAsy3EcwAEeYRbAAR5aFsABHlIuwABBpcAAUzXAAFM8rrzAAFYOr6gBAAEWwAEegy6FScAAVEQAwABWdD2LwAEelMAsy4IcwAEesRbAAR6pLsAAQaXAAFM1wABTPK/bAwACgsABHs7ALMtxFsABHvGCwAEe4MAsy3GEAYJZAa/cKcAAVi4/TsABHzkAAACcnGADhRoAScABH0khHMABH1oWwAEfTS64DcAAVEInAQABKwDAAGxePgE9jMABH2vALMxBHMABH4AWwAEfeC7AAEGlwABTNcAAUzyxJAQAAxbAAR+qLoQBwABTPhbAAR/ALrgNwABUQhzAAR/gFsABH9guwABBpsAAUzXAAFNBwABAzwkABBbAASARLoQBwABTPhbAASArLrjSwABURhzAASCCFsABIHsWwAEgbBbAASBjFsABIFYuuA3AAFRChMeEUINjhPOA4MAAbGpEAQABFsABIJYuuNLAAFRGAMAAbOGDwAEgwcAsy4IFuNQcwAEg+y7AAEHVwABTNQAAAADAAFRRuNUWwAEhRy641cAAVD6DcxbAASGLgcABIYHALMtag8uF5pzaFsABIb+BwAEhtcAsy1qFW4Xnm74WwAEh84HAASHpwCzLWoUjhejAAFY2AbElKsAAVho+AT2MwAEiK8AszEEcwAEiRxbAASJAFsABIjguwABBpcAAUzXAAFM8rrzAAFYOr6IDAAMewAEibcAAUzcCAAIWwAEigy7AAEGnwABTNcAAVE2AwAEilsAsy0oAHMABIqkuwABBt8AAUzUBAAGDwAEitcAsy4IAwABUUoHAASLUwCzLWgDAAFZ7ScABIuoWwAEi7i6vpcAAVEc+AkAhHMABIxuCwAEjCsAsy3EnAQABKwDAAGxewAEjCsABIyIASsABIysBNcABIzYAAAEAYAPAAEYNAR/AASM2wABGGAIAAoLAASNJwCzLcYTAASNbwCzMQQA1wAEjcQAAAQBcARfAASNxhcABIzbALM5mhAEWwAEjfi6EAcAAUz6CWYXAASM2wCzOZj4BSsABI50BhMABI6TALMxBBsAAVFqBCMABI73AASPTwAEktwAAsQ4BasABI75gA8AAbFaAtQAAAQPAASPlwAEktwAAAAMCAsABI/EAAACDKGADhRoAwAEj/gAAAKlqYAO+TQABwAEkEQAAAK+lYAPAAGxbAWoAYAHAAGxcAmADwABTOQE+AkAhHMABJDiCwAEkLMAszysnAQABKwDAAGxewAEkLMABJD8ASsABJEYBH8ABJFHAAFPdBQAEFsABJGguwABBpcAAUzXAAFM8gcABJHHALM8cHMABJHgurvcAAAAAwABUVIDAASSLwCzPDgGvpYLAASSnwCzPKwbAAFRbgQjAASS8wAEkzcABJjgAALehAWrAASS9YAPAAGxWgLUAAAEDwAEk1MABJjgAAAABAQHAASTgAAAAgQtgA8AAbg4AAFwBPgdOwAEk98ABJQYAAJSxYAOZgwEfwAElDJmeAAAAAD0cwAElI4DAASUewCzP+UUBAAEnwABBzwDAAG4bPRzAASVFgMABJUDALM/5RQEAARbAASVLLoDlwABUQADAAG4bPRzAASVhgMABJVzALM/5RQEAASfAAEHQAMAAbhs9HsABJX7AAEfSAwACFsABJZMur/HAAFRBgMABJZ/ALM/5AZSxgcABJbXALNAPPRzAASXPgMABJcrALM/5RQEAASfAAEHRAMAAbhs9HsABJe3AAEfSAwACFsABJgIuuAzAAFRDgMABJg/ALM/5AZSxgcABJiXALNAPAAAsrXwALLPPACy0HwAstH8ALLUlACy1ewAstvQALLhlACy6TgAsu80ALMAkACzD4QAsyxMALM7XACzPwgAs0QIAAAAPAsAAVF6BCMABJj3AASZDwAFKnAPAAEHZAAABYAPAAFM5AAAJBMAAVGCBCMABJuPAASb+CbjVAGADwABsHwAEwABUYYEIwAEnE8ABJxwJhEcAYAODgAAEwABUYoEIwAEntsABJ8AJr/EAYAOESwAEwABUY4EIwAEoXMABKGcJuAwAYAOESwAEwABUZIEIwAEpAsABKQoJhUkAYAOFGgAEwABUZYEIwAEpPMABKUEJgygAYAOFGgAEwABUZoEIwAEp1sABKesJuRAAXQPAAGwZAWADiVUABMAAVGeBCMABKkXAASpgCbjSAGADwABsHwAEwABUaIEIwAEqcMABKnsJr6UAYAPAAGxbAAEFwABUe4EIwAEqgMABKoDAASx6AAAAA8ABKqfAASx6AAAACwoKwAEqyQAAAJOvYAPAAFYKAMABKt0AAACpamADvk0AwAEq7wAABLjVYAPAAGwfAMABKxcAAASER2ADg4AAwAErLQAABK/xYAOESwDAAStEAAAEuAxgA4RLAMABK1wAAASFSWADhRoAwAErcQAABIMoYAOFGgDAASuDAAAEuRBdA8AAbBkBYAOJVQDAASulAAAEuNJgA8AAbB8AAcABK84AAASvpWADwABsWwFqAGABwABsXAJgA8AAVF4BPw0IAcAAVGCCAMAs0pQIAcAAVGGDAMAs0qQIAcAAVGKEAMAs0rIIAcAAVGOFAMAs0sAIAcAAVGSGAMAs0s4IAcAAVGWHAMAs0twIAcAAVGYUAMAs0uoIAAgBwABUZxQAwCzS/wkACAHAAFRoFADALNMQCgAMAEAiIRzAASv2hMABK+vALNKyJwEAASsAwABsXgEhHMABLA2FwAEsAcAs0sAnAQABKwDAAGxewAEr68ABLBQADABAIRzAASwvhsABLCbALNLOJwEAASsAwABsXsABLCbAASw2AAwAQCEcwAEsVBTAASxIwCzTEAoAJwEAASsAwABsXsABLEjAASxbAAkAwAEsZsAAU10CAAKAwAEsbMAs0naBwAEsdMAs0oYADAbAAFRqgQjAASx/wAEsh8ABMw0EAcAAQc4AAAABA8ABLLrAATMNAAAACwoKwAEs3AAAAJOvYAPAAFYKAMABLPAAAACpamADvk0AwAEtAQAAALjVYAPAAGwfAMABLS4AAACER2ADg4AAwAEtRwAAAK/tYAPAAEAuAMABLWQAAACv62ADwABALgDAAS2EAAAAhUlgA4UaAMABLZ8AAACDKGADhRoAwAEtuwAAALkQXQPAAGwZAWADiVUAwAEt3AAAALjSYAPAAGwfAAHAAS4FAAAAr6VgA8AAbFsBagBgAcAAbFwCYAPAAFReAT4GQCEcwAEuLBTAAS4gwCzVGwoAJwEAASsAwABsXsABLiDAAS4zAE7AAS5EAAAAr/FgA4RLAEnAAS5UIRzAAS5mhMABLljALNS5JwEAASsAwABsXj4BScABLnclwAEuiQCEwAEue8As1LlgA8AAQrA+A07AAS69wAEuwwAAJGADwABCsAEmwAEuvQGEwAEuxcAs1LlgA8AAQrA9jMABLtzALNS5FsABLvIUwAEu7MAs1a4MAIeDwABCpkAlwAEvnACEwAEvjsAs1LlgA8AAThTAAS+OwAEvrABJwAEvvCXAAS/OAITAAS/AwCzUuWADwABOFD4CTsABL/jAATAJAAC6rGADwABOFAEUwAEwC8As1LkEAWADwABOFD0VwAEwIsAs1WMLJsABMCIBFsABMEAUwAEwL8As1jEMAIREwABOGWADhEs+AUrAATBfASbAATBfBR7AATBmtT0EAAQkwAEwmwEWwAEwjoTAATCAwCzUuYVOwABtLSfAAEHYHsABMOXAAFAuAQABgcABMPTALNSNABbAATEPgMABMQjALNR9gUzAAGQbAGADwABUXj9OwAExMQAAALgMYAOESwBJwAExQiXAATFUAIXAATFGwCzUyWADwABOFD4CTsABMXzAATGKAACv72ADwABOFAEUwAExjMAs1MkFAWADwABOFD0VwAExocAs1uoMJsABMaEBFsABMb0UwAExr8As1xUNAIREwABOGWADhEs/SsABMc8BH8ABMdrAAFR7CwAKgMABMgvALNR9gcABMhvALNSNgsABMirALNSbg8ABMk/ALNSrFMABMmLALNVjCwAUwAEydsAs1uoMAIbAATKLwCzU2YfAATKdwCzU5xTAATKswCzU9QgAFMABMsvALNUKCQABr6UUwAEy/cAs1RsKAAbAAFRtgQjAATMSwAEzIcABM30AAMAAQdXAAFM1AAAAAQPAATM+wAEzfQAAAAAAAABdA8AAbBkBYAOJVQE+AUrAATNHATXAATNOAAABAF0DwABsGQFgA4lVARbAATNOLrkQwABUZiMcwAEzToDAATNOwCzYLScBAAErAMAAbGJqwAEzZ10DwABsGQFgA4lVhPKAwAEzTsAs2C0BXQPAAGwZAWADiVUGwABUeIEIwAEzgsABM43AATOmAQDAAEGnwABTNQAAAAEDwAEzn8ABM6YAAAAAAAAAYAPAAGwYAUrAATOiAScpBsAAVHmBCMABM6vAATO2wAEz7QEAwABBqMAAUzUAAAABA8ABM8HAATPtAAAAAAAAAGADwABsGAFKwAEzxAEnwABB2QbAAFRugQjAATPywAE0CcABN/IAAK73AWrAATPzYAPAAGxWgLUAAAEDwAE0GMABN/IAAAAAAAAAYAOFGgE+B0nAATQhHMABNDAWwAE0JS6v8cAAVGInAQABKwDAAGxePgFKwAE0QQEcwAE0SC7AAEGwwABTNQAAAADAAFNOP07AATR6AAAAhRRgA4jnAE7AATSTAAAAtPBgA4UaAEnAATSmFsABNKour6XAAFRoPgI9iMABNL/ALNmPHMABNNIWwAE0yi7AAEGmwABTNcAAU0GvqAEAARbAATT0LoVJwABUZADAAFZ0PYnAATUFwCzZnhzAATUdFsAB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uRMUwAFFWcAs4xQIAEnAAUVwFsABRXQur6XAAFRoPgE9FcABRYnALOPiCTXAAUWWAAABAGADwABEVAEfwAFFlsAARF8CAAKGwAFFsMAs4vYUwAFFusAs4+IJAAA1wAFFzAAAAQBcARfAAUXMFMABRZbALOTACgCEARbAAUXZLoQBwABTPoJZFMABRZbALOTACgA/SsABRe8BFMABRfbALOPiCQAGwABUcoEIwAFGBcABRhzAAUdKAADAAEGvAWrAAUYGYAPAAGxWgLUAAAEDwAFGMcABR0oAAAADAQHAAUY3AAAAwABBrGADiR8AAsABRlIAAACECmADwABsHwFqwAFGZGADwABsH4UZwAFGcwAAALGJYAPAAGxbAWrAAUaBYAPAAGxbHGADhRoBPgJOwAFGmsABRqAAAIE+YAOFGgEcwAFGqhbAAUaiLsAAQabAAFM1wABTQbALAgACgcABRrvALOWClADAAFY+SsABRssBHMABRtIuwABBqwUAAoDAAUbqwCzlcYPAAUb6wCzlwwOECoHAAUcRwCzlgrGJgsABRybALOWfwABBrinAAFRxBsAAVHOBCMABR0/AAUdmwAFH/QAAr6EBasABR1BgA8AAbFaAtQAAAQPAAUdywAFH/QAAAAICAsABR3cAAACECmADwABsHwDAAUeJAAAAga1gA4XkAABgA4UaAT4BSsABR5oBHMABR7kWwAFHqRbAAUehLsAAQaXAAFM1wABTPK68wABWDq+iAwADgMABR9TALOZ7HMABR9wurvcAAAAAwABUboHAAUfvwCzmiwDAAFZ7BsAAVHSBCMABSALAAUgYwAFI/AAAsQ4BasABSANgA8AAbFaAtQAAAQPAAUgqwAFI/AAAAAMCAsABSDYAAACDKGADhRoAwAFIQwAAAKlqYAO+TQABwAFIVgAAAK+lYAPAAGxbAWoAYAHAAGxcAmADwABTOQE+AkAhHMABSH2CwAFIccAs50knAQABKwDAAGxewAFIccABSIQASsABSIsBH8ABSJbAAFPdBQAEFsABSK0uwABBpcAAUzXAAFM8gcABSLbALOc6HMABSL0urvcAAAAAwABUboDAAUjQwCznLAGvpYLAAUjswCznSQbAAFR1gQjAAUkBwAFJEsABSpoAALehAWrAAUkCYAPAAGxWgLUAAAEDwAFJGcABSpoAAAABAQHA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CmADwABsHwFqwAGpUGADwABsH4UZwAGpXwAAALGJYAPAAGxbAWrAAaltYAPAAGxbHGADhRoBPgJOwAGphsABqYwAAIE+YAOFGgEcwAGplhbAAamOLsAAQabAAFM1wABTQbALAgACgcABqafALTHklADAAFY+SsABqbcBHMABqb4uwABBqwUAAoDAAanWwC0x04PAAanmwC0yJQOECoHAAan9wC0x5LGJgsABqhLALTIBwABBrinAAFTdBsAAVN+BCMABqjvAAapHwAGq/QAAr6EBasABqjxgA8AAbFaAtQAAAQPAAapTwAGq/QAAAAICAsABqlgAAACECmADwABsHwDAAapqAAAAga1gA4XkAABbAT4BSsABqnsBHMABqpEWwAGqihbAAaqCLsAAQaXAAFM1wABTPK68wABWDq+iAwADHsABqrXAAFM3AgACFsABqssugOXAAFTQgMABqtfALTLdABzAAargLsAAQbfAAFM1AAAAAMAAVNqBwAGq78AtMu0AwABWewbAAFTggQjAAasCwAGrGMABrGcAALEOAWrAAasDYAPAAGxWgLUAAAEDwAGrKsABrGcAAAADAgLAAas2AAAAgyhgA4UaAMABq0MAAACpamADvk0AAcABq1YAAACvpWADwABsWwFqAGABwABsXAJgA8AAUzkBPgJAIRzAAat9gsABq3HALTPHJwEAASsAwABsXsABq3HAAauEAErAAav6AR/AAawFwABT3QUABBbAAawcLsAAQaXAAFM1wABTPIHAAawlwC0zuBzAAawsLsAAQbfAAFM1AAAAAMAAVNqAwAGsO8AtM6oBr6WCwAGsV8AtM8cGwABU4YEIwAGsbMABrH3AAa3QAAC3oQFqwAGsbWADwABsVoC1AAABA8ABrITAAa3QAAAAAQEBwAGskAAAAIELYAPAAG4OAABcAT4HTsABrKfAAay2AACUsWADmYMBH8ABrLyZngAAAAA9HMABrNOAwAGszsAtNJtFAQABJ8AAQfIAwABuGz0ewAGs8MAAR9EDAAIWwAGs/C6FfsAAVNGAwAGtCMAtNJsBlLGBwAGtHsAtNLE9HMABrTiAwAGtM8AtNJtFAQABJ8AAQe8AwABuGz0cwAGtYIDAAa1bwC00m0UBAAEWwAGtZi6A5cAAVNAAwABuGz0cwAGtfIDAAa13wC00m0UBAAEnwABB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GgbAAFXdgQjAAjc3wAI3TcACOAkAALEOAWrAAjc4YAPAAGxWgLUAAAEDwAI3X8ACOAkAAAADAgLAAjdrAAAAgyhgA4UaAMACN3gAAACpamADvk0AAcACN4sAAACvpWADwABsWwFqAGABwABsXAJgA8AAUzkBPgJAIRzAAjeygsACN6bALbRVJwEAASsAwABsXsACN6bAAje5AErAAjfAASbAAjfABR7AAjfHtT8DAAMnsQ4ewAI36cAAUC4BAAGBwAI3+MAttEYAFsACOAAuwABBqcAAUzXAAFNEAGADwABTOQbAAFXegQjAAjgOwAI4H8ACORYAALehAWrAAjgPYAPAAGxWgLUAAAEDwAI4JsACORYAAAABAQHAAjgyAAAAgQtgA8AAbg4AAFwBPgU9HMACOEOAwAI4PsAttRlFAQABJ8AAQb0AwABuGz0cwAI4X4DAAjhawC21GUUBAAEWwAI4ahbAAjhlLoGIwABVzYGIiSIAwABuGz0cwAI4eoDAAjh1wC21GUUBAAEnwABCGQDAAG4bTsACOKDAAjilAACEDWADheQBFsACOKcuga3AAFXOScACOLYlwAI4vwCBwAI4usAttZZgA4JKPgE9HsACONDAAEfRAgACgcACONzALbWWgMACOOLALbUZAD4BPRzAAjkBgMACOPzALbUZRQEAAYHAAjkHwC21lgDAAG4bAAAtrKUALaz4AC2tOwAtrakALa5BAC2vhAAtsDsALbGCAC2yewAts3gALbQBAC204gAtthAAAAAMAsAAVeGBCMACORvAAjkhwAJB2jfAAEIaAAABYAPAAFM5AAFgA8AAVaQAAQXAAFXoAAAAAAQAAAMAAAAAAAICAgAAAADAAEGlYAPAAFYKAAAAAACpamADvk0AAGADwABV4QE/AQkAAMAAU10CAAKAAMAttomBAMAttpgAAwbAAFXjgQjAAipOwAIqV8ACKlsBAoGIAAAAAQPAAipbwAIqWwAAAAAAAABgA4kfAAbAAFXmgQjAAipgwAIqYMACKqUAAp2NAAAAAQPAAipswAIqpQAAAAMCAsACKnQAAACFSWADwABsVgDAAiqCAAAAwABBsmADwABsHwABwAIqmAAAAK+lYAPAAGxbAWoAYAHAAGxcAlsABsAAVeSBCMACKqrAAiq4wAIqyQEAga0AAAABA8ACKsLAAirJAAAA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wABDocAt/YonAQABKwDAAGwywABDocAAQ7MASsAAQ7oBNcAAQ8UAAAEAYAPAAER4AR/AAEPFwABEfAIAAoLAAEPZwC39qYHAAEPiwC39mgA1wABD9gAAAQBcARfAAEP2g8AAQ8XALf32hAE1wABEAwAAAQBgA8AAbB8BgMAARAPALf2KIxzAAEQDhMAARAPALf5AJwEAASsAwABsMmrAAEQaYAPAAGwfhRmEwABEA8At/kABYAPAAGwfglmDwABDxcAt/fYGwABWZIEKwABEK8AARDbAAEUgAACv/gAAAAEDwABET8AARSAAAAACAgLAAERbAAAAhAFgA8AAbB8AwABEeAAAAIWQXQPAAGwZAWADhRoAAGADhRoBPgNAIRzAAESdgMAARJLALf7DJwEAASsAwABsMsAARJLAAESkAEAhHMAARL2AwABEssAt/sMnAQABasAARMlgA8AAbB+FGQDAAGwywABEssAARNEASsAARNgBNcAAROMAAAEAYAOGggEfwABE44aMAQABgcAARPfALf7TADXAAEUFAAABAFwBF8AARQWCwABE48At/0mEAYDAAEUSwC3+w4JZgsAAROPALf9JBsAAVmWBCsAARdHAAEXbwABGWgAAsGgAAAABA8AARfHAAEZaAAAAAQEBwABF/AAAAIUXYAOH+AAAYAOH+AE+AUrAAEYNATXAAEYYAAABAGADiDMBH8AARhiIPAEAAYDAAEYpwC3/wwA1wABGNQAAAQBcARfAAEY1gcAARhjALf/ghAEWwABGTIDAAEZCwC3/w4QBglmCWYHAAEYYwC3/4AbAAFZmgQrAAEZfwABGasAARu0AAMAAQcAAAAABA8AARn7AAEbtAAAAAQEBwABGgwAAAIQBYAPAAGwfAABgA4UaAT4CQCEcwABGp4DAAEacwC4AZScBAAErAMAAbDLAAEacwABGrgBKwABGtQE1wABGwAAAAQBgA4dUAR/AAEbAh1wAAAAANcAARtIAAAEAXAEXwABG0oHAAEbAwC4Ap4QBgMAARt/ALgBlglmBwABGwMAuAKcGwABWZ4EKwABHQcAAR0zAAEfeAACw0gAAAAEDwABHV8AAR94AAAACAgLAAEdcAAAAhAFgA8AAbB8AwABHcwAAAIV+YAOFGgAAYAOFGgE+AkAhHMAAR5eAwABHjMAuARgnAQABKwDAAGwywABHjMAAR54ASsAAR6UBNcAAR7AAAAEAYAOHZgEfwABHsIdwAQABgcAAR7bALgEoADXAAEfDAAABAFwBF8AAR8OCwABHsMAuAWiEAYDAAEfQwC4BGIJZgsAAR7DALgFoBsAAVmiBCsAAR+PAAEfowABIBwAAmVMAAAABA8AAR+/AAEgHAAAAAQEBwABH9wAAAICtYAPAAGxWAABgA8AAbFsBSsAAR/0BJcAAR/8AgMAAR/3ALgHiYAOHZgbAAFZpgQrAAEgMwABIFsAASRcAALEIAAAAAQPAAEgowABJFwAAAAQEBMAASC0AAACEAWADwABsHwDAAEhDAAAAjU5gA4f4AMAASF8AAACxBl0DwABsGQFgA4i9AMAASHYAAACMzWADh/gAAGADh/gBPgJAIRzAAEicgMAASJHALgI9JwEAASsAwABsMsAASJHAAEijAErAAEiqATXAAEi1AAABAGADwABDgQEfwABItcAAQ4sDAAOBwABIwsAuAk01wABIzAAAAQBdA8AAbBkBYAOIvQGCwABIzMAuAlsjHMAASMyEwABIzMAuAtUnAQABKwDAAGxiMcAASOJgA4i9AITAAEjMwC4C1QFdA8AAbBkBYAOIvYPAAEjmwC4CcAA1wABI/AAAAQBcARfAAEj8hMAASLXALgKwhAGAwABJCcAuAj2CWYTAAEi1wC4CsAbAAFZqgQrAAEkcwABJMsAASbwAALA2AAAAAQPAAElGwABJvAAAAAICAsAASWgAAADAAEIjXQPAAGwZAWADiOcAwABJegAAAIFMYAPAAGxYAABgA8AAVosBPgFKwABJhQEfwABJkMAAVpUCAAKAwABJpsAuA42BwABJtMAuA6QABsAAVmuBCsAAScHAAEnbwABKaAAAsEsAAAABA8AASgLAAEpoAAAAAQEBwABKIAAAALA2YAPAAFaLAABdA8AAbBkBYAOI5wE+AUrAAEo8ARbAAEpYgMAASkPALgQNwABCI8AAVo0GwABWbIEKwABKbcAASnfAAEwXAACvAgAAAAEDwABKhMAATBcAAAABAQHAAEqPAAAAhRdgA4f4AABgA4f4AT4BScAASqAlwABKrgCAwABKpMAuBHJgA8AAVos+AUrAAErQATXAAErbAAABAGADiAgBH8AAStuIEgEAAR7AAErwwABtJQIBYAOH+AEWwABLDxTAAEsFwC4EcgABYAPAAFaLwABCI8AAVo0BhSQpADXAAEs4AAABAFwBF8AASziBwABK28AuBKuEARbAAEtPFMAAS0XALgRyAAFgA8AAVouEAYJZglmBwABK28AuBKtJwABLZiXAAEt0AIDAAEtqwC4EcmADiOc+AUrAAEuUATXAAEufAAABAGADiAgBH8AAS5+IEgEAATHAAEuwYAOH+AEUwABLscAuBHIAAWADiOcANcAAS8cAAAEAXAEXwABLx4HAAEufwC4FVoQBFsAAS94UwABL1MAuBHIAAWADiOeEAYJZglmBwABLn8AuBVY+AUrAAEv9AYDAAEwEwC4EcgbAAFZtgQrAAEyfwABMqcAATWgAALGcAAAAAQPAAEy9wABNaAAAAAMDA8AATMkAAACEAWADwABsHwDAAEzgAAAAhYpgA4UaAMAATPUAAACE+GADh/gAAGADh/gBPgJAIRzAAE0TgMAATQjALgYAJwEAASsAwABsMsAATQjAAE0aAErAAE0hATXAAE0sAAABAGADiEcBH8AATSyIUQIAAoHAAE07wC4GEILAAE1GwC4GHgA1wABNTQAAAQBcARfAAE1Ng8AATSzALgZehAGAwABNWsAuBgCCWYPAAE0swC4GXgbAAFZugQrAAE4pwABOM8AATzMAALGuAAAAAQPAAE5HwABPMwAAAAMCAsAATkwAAACEAWADwABsHwDAAE5jAAAAhX5gA4UaAAHAAE57AAAAhilgA8AAbFsBagBgAcAAbFwCYAOH+AE+A0AhHMAATqGAwABOlsAuBuEnAQABKwDAAGwywABOlsAATqgAQCEcwABOwoLAAE62wC4HACcBAAErAMAAbF7AAE62wABOyQBKwABO0AE1wABO2wAAAQBgA4jUAR/AAE7biOYCAAGBwABO6sAuBvEBhimCwABPA8AuBwA1wABPGAAAAQBcARfAAE8Yg8AATtvALgdthAGAwABPJcAuBuGCWYPAAE7bwC4HbQbAAFZvgQrAAE84wABPPcAAT2IAALHMAAAAAQPAAE9EwABPYgAAAAEBAcAAT0wAAACEDWADwABsVgAAYAPAAGxbAUrAAE9VASXAAE9aAIDAAE9VwC4H8mADiAgGwABWcIEKwABPZ8AAT2zAAFEEAACxZwAAAAEDwABPe8AAUQQAAAABAQHAAE+DAAAAhA1gA8AAbFYAAGADwABsWwE+BEnAAE+PJcAAT5gAgMAAT5PALghNYAOH/j4CTsAAT8zAAE/WAACFF2ADh/4BJsAAT8wBgMAAT9jALghNYAOH/j2IwABP5MAuCE0WwABP9YHAAE/rwC4IgoV+iAA/ScAAUAslwABQFACAwABQD8AuCE1gA4jnPgJOwABQSMAAUFEAAIUUYAOI5wEmwABQSAGAwABQU8AuCE1gA4jnPYjAAFBfwC4ITRbAAFBvgcAAUGbALgjehMuI7z9JwABQhiXAAFCPAIDAAFCKwC4ITWADh8o+Ak7AAFCjwABQpwAAlXhgA4fKASbAAFCjAYDAAFCpwC4ITWADh8o9iMAAULXALghNFsAAUMkWwABQwIHAAFC8wC4JOoUUh8yEy4jvP0rAAFDgASXAAFDsAIDAAFDnwC4ITWADhSIGwABWcYEKwABRCcAAUQ7AAFFFAACyEAAAAAEDwABRHsAAUUUAAAABAQHAAFEmAAAAhA1gA8AAbFYAAGADwABsWwFKwABRLwElwABRNACAwABRL8AuCcdgA4dUBsAAVnKBCsAAUUrAAFFPwABRkwAAsEoAAAABA8AAUWXAAFGTAAAAAQEBwABRbQAAAIQNYAPAAGxWAABgA8AAbFsBSsAAUXYBJcAAUXsAgMAAUXbALgoiYAPAAFaLBsAAVnOBCsAAUgPAAFIXwABUtgAAsYcAAAABA8AAUjDAAFS2AAAACgMDwABSPAAAAIQBYAPAAGwfAMAAUk8AAACBiGADwABsGADAAFJZAAAArs5gA8AAbB8AB8AAUoEAAACEy2ADhRoBagBgAcAAbFwCwABSnQAAAIGXYAOJVQFqAGABwABsXALAAFKuAAAAhNZgA8AAbFsBasAAUrdgA8AAbFscwABSyQAAAITBYAPAAGxbAWrAAFLSYAPAAGxbHMAAUuQAAACGMmADwABsWwFqwABS82ADwABsWxzAAFMFAAAAhNVgA8AAbFsBasAAUxJgA8AAbFscwABTJAAAALFaYAPAAGxbAWrAAFM1YAPAAGxbHGADiOcBPgJAIRzAAFNVgMAAU0rALgp/JwEAASsAwABsMsAAU0rAAFNcAErAAFNjAR/AAFNuwABElAoAAoHAAFOGwC4Kj4LAAFOMwC4KnwiBl4TAAFOwwC4Kx4TLg8AAU8vALgqwhNaFwABT6cAuCt6EwYbAAFQDwC4K+oYyh8AAVCPALgsWhNUUwABUR8AuCzIIALFaFMAAVG3ALgtOCQCvWSEcwABUqoPAAFSewC4KsCcBAAErAMAAbF4GwABWdIEKwABUu8AAVM/AAFW4AACvqAAAAAEDwABU8MAAVbgAAAACAQHAAFT8AAAAhMtgA4UaAAHAAFUZAAAAgZdgA4lVAWrAAFUmYAOJcoWxYAOI5wE+AUrAAFU8ATXAAFVHAAABAGADwABEhwEfwABVR8AARJYBAAGAwABVaMAuDE8ANcAAVX0AAAEAXAEXwABVfYLAAFVHwC4MhYGXgcAAVYTALgxeiO01wABVkQAAAQBcARfAAFWRgsAAVUfALgyFhAEWwABVqoDAAFWewC4MT4QBglmCWYLAAFVHwC4MhQbAAFZ1gQrAAFW9wABVwcAAViIAALlBAAAAAQPAAFXKwABWIgAAAAICAsAAVd8AAACFFGADiOcAwABV9AAAAIT4YAOFGgAAYAOHygE+AUrAAFYAAR/AAFYLh9UCAAKAwABWD8AuDTKBwABWGcAuDUAABsAAVnaBCsAAVifAAFY0wABZEQAAwABCLAAAAAEDwABWRsAAWREAAAAJAgLAAFZLAAAAhAFgA8AAbB8AwABWYQAAAIT4YAOH+AAHwABWggAAAINjXQPAAGwZAWADiiYBagBgAcAAbFwCwABWsgAAAIRwXQPAAGwZAWADiOcBagBgAcAAbFwCwABW6AAAAIRxXQPAAGwZAWADiOcBagBgAcAAbFwCwABXAwAAAITlYAPAAGwfAWoAYAHAAGxcAsAAVyoAAACFA2ADiVUBasAAVzxgA4lyhbHAAFddAAAAhRpgA4ULAWrAAFd2YAOFC4aWwABXjgAAAIUbYAOFCwFqAGABwABsXAJgA4TuAT4CQCEcwABXuIDAAFetwC4NpScBAAErAMAAbDLAAFetwABXvwBKwABXxgEfwABX0YUKCAABgcAAV97ALg21B4NjgsAAV/zALg3EhHCDwABYKsAuDeKEcYTAAFhZwC4OAITlhcAAWIrALg4ehQOGwABYtsAuDjeFGofAAFjXwC4OUIUbFMAAWP3ALg5pCAAGwABWd4EKwABZFsAAWSTAAFltAADAAEItAAAAAQPAAFk3wABZbQAAAAEBAcAAWT8AAACBiGADwABsGAAAYAOKJgE+AUrAAFlLAR/AAFlWikABAAGAwABZZMAuDz8ABsAAVniBCsAAWXLAAFmEwABaGwAAsncAAAABA8AAWZvAAFobAAAAAgICwABZsQAAAIVwYAOKJgDAAFnMAAAAg2VgA4lHAABgA4n+AT4BSsAAWd8BH8AAWeqKEQIAAoDAAFn8wC4Pm4HAAFoLwC4PqQAGwABWeYEKwABaIMAAWjLAAFsHAADAAEHWAAAAAQPAAFppwABbBwAAAAICAsAAWn8AAACFcGADiiYAwABalgAAAIEVYAOCkgAAYAOJ/gE+AUrAAFqlAR/AAFqwihQCAAKAwABa7MAuEA6BwABa+8AuEBwABsAAVnqBCsAAWwzAAFsfwABb0AAAwABCLgAAAAEDwABbN8AAW9AAAAACAgLAAFtDAAAAhAFgA8AAbB8AwABbXAAAAITHYAOE7gAAYAOHswE+AkAhHMAAW36AwABbc8AuEIEnAQABKwDAAGwywABbc8AAW4UASsAAW4wBNcAAW5cAAAEAYAOHswEfwABbl4e9AQABgcAAW6rALhCRADXAAFu1AAABAFwBF8AAW7WCwABbl8AuENGEAYDAAFvCwC4QgYJZgsAAW5fALhDRBsAAVnuBCsAAW9XAAFvgwABcvgAAr6IAAAABA8AAW/rAAFy+AAAAAwMDwABcBgAAAIQBYAPAAGwfAMAAXB0AAACFfmADhRoAwABcMwAAAIGtYAOF5AAAYAOFGgE+AkAhHMAAXFaAwABcS8AuEUsnAQABKwDAAGwywABcS8AAXF0ASsAAXGQBNcAAXG8AAAEAYAPAAERDAR/AAFxvwABETgIAAoHAAFyEwC4RW4LAAFyQwC4RaQA1wABcowAAAQBcARfAAFyjg8AAXG/ALhGphAGAwABcsMAuEUuCWYPAAFxvwC4RqQbAAFZ8gQrAAFzDwABc1MAAXbsAALIRAAAAAQPAAFzqwABduwAAAAQEBMAAXPYAAACEAWADwABsHwDAAF0NAAAAhX5gA4UaAMAAXR4AAACBiGADiR8AwABdLgAAAIGtYAOF5AAAYAOGBAE+AkAhHMAAXVGAwABdRsAuEjAnAQABKwDAAGwywABdRsAAXVgASsAAXV8BNcAAXWoAAAEAYAOGBAEfwABdaoYVAwADgcAAXXvALhJAgsAAXYfALhJOg8AAXY3ALhJcADXAAF2gAAABAFwBF8AAXaCEwABdasAuEpyEAYDAAF2twC4SMIJZhMAAXWrALhKcBsAAVn2BCsAAXcDAAF3QwABekAAAwABCLwAAAAEDwABd5cAAXpAAAAADAwPAAF3xAAAAhAFgA8AAbB8AwABeBAAAAIGIYAPAAGwYAMAAXhUAAACFfmADhRoAAGADhfIBPgJAIRzAAF45gMAAXi7ALhMqJwEAASsAwABsMsAAXi7AAF5AAErAAF5HATXAAF5SAAABAGADhfIBH8AAXlKF+wIAAoHAAF5iwC4TOoLAAF5owC4TSgA1wABedQAAAQBcARfAAF51g8AAXlLALhOKhAGAwABegsAuEyqCWYPAAF5SwC4TigbAAFZ+gQrAAF6VwABepsAAX3IAAMAAQM4AAAABA8AAXrzAAF9yAAAAAwMDwABeyAAAAIQBYAPAAGwfAMAAXt4AAACDvGADhEsAwABe8wAAAIGtYAOF5AAAYAOGKQE+AkAhHMAAXxaAwABfC8AuFA8nAQABKwDAAGwywABfC8AAXx0ASsAAXyQBNcAAXy8AAAEAYAOGKQEfwABfL4Y6AgACgcAAX0DALhQfgsAAX0vALhQtADXAAF9XAAABAFwBF8AAX1eDwABfL8AuFG2EAYDAAF9kwC4UD4JZg8AAXy/ALhRtBsAAVn+BCsAAX3fAAF+NwABgewAAwABA9QAAAAEDwABfqMAAYHsAAAAEBATAAF+0AAAAhAFgA8AAbB8AwABfxQAAAIGIYAOJHwDAAF/VAAAAg7xgA4RLAMAAX+oAAACBrWADheQAAGADhhcBPgJAIRzAAGANgMAAYALALhTyJwEAASsAwABsMsAAYALAAGAUAErAAGAbATXAAGAmAAABAGADhhcBH8AAYCaGJwMAA4HAAGA8wC4VAoPAAGBCwC4VHoLAAGBNwC4VEAA1wABgYAAAAQBcARfAAGBghMAAYCbALhVehAGAwABgbcAuFPKCWYTAAGAmwC4VXgbAAFaAgQrAAGCAwABgisAAYSQAALCjAAAAAQPAAGCZwABhJAAAAAICAsAAYJ4AAACEAWADwABsHwDAAGC1AAAAhX5gA4UaAABgA4b+AT4CQCEcwABg2YDAAGDOwC4V6icBAAErAMAAbDLAAGDOwABg4ABKwABg5wE1wABg8gAAAQBgA4b+AR/AAGDyhwgBAAGBwABg/MAuFfoANcAAYQkAAAEAXAEXwABhCYLAAGDywC4WOoQBgMAAYRbALhXqglmCwABg8sAuFjoGwABWgYEKwABhKcAAYTXAAGIYAADAAED4AAAAAQPAAGFGwABiGAAAAAQDA8AAYUsAAACEAWADwABsHwDAAGFiAAAAhUlgA4UaAMAAYXEAAACBiGADiR8AAcAAYYUAAACDG2ADg6wBagBgAcAAbFwCYAOFRQE+AkAhHMAAYa+AwABhpMAuFrYnAQABKwDAAGwywABhpMAAYbYASsAAYb0BNcAAYcgAAAEAYAOFRQEfwABhyIVVAwADgcAAYdTALhbGgsAAYd7ALhbUg8AAYeTALhbjADXAAGH9AAABAFwBF8AAYf2EwABhyMAuFyuEAYDAAGIKwC4WtoJZhMAAYcjALhcrBsAAVoKBCsAAYh3AAGIpwABjwQAAwABA+gAAAAEDwABiOsAAY8EAAAAHBATAAGJGAAAAhAFgA8AAbB8AwABiXQAAAIVJYAOFGgDAAGJsAAAAgYhgA4kfAMAAYn0AAACBPmADhRoAA8AAYpIAAACDG2ADg6wBagBgAcAAbFwCwABiqAAAALkKYAPAAGxbAWoAYAHAAGxcAsAAYrgAAAC5E2ADwABsWwFqwABiymADwABsWxxgA4VXAT4CQCEcwABi6oDAAGLfwC4XuScBAAErAMAAbDLAAGLfwABi8QBKwABi+AE1wABjAwAAAQBgA8AARhkBH8AAYwPAAEYeBgADgcAAYxPALhfJgsAAYx3ALhfXg8AAYyPALhflA4MbhMAAY0PALhf0uQqFwABjZ8AuGAu5E4bAAGOMwC4YJDXAAGOmAAABAFwBF8AAY6aHwABjA8AuGHGEAYDAAGOzwC4XuYJZh8AAYwPALhhxBsAAVoOBCsAAY8bAAGPPwABkgwAAwABA/AAAAAEDwABj3cAAZIMAAAADAwPAAGPpAAAAhAFgA8AAbB8AwABkAAAAAIVJYAOFGgDAAGQVAAAAgyhgA4UaAABgA8AARSYBPgJAIRzAAGQ0gMAAZCnALhkkJwEAASsAwABsMsAAZCnAAGQ7AErAAGRCATXAAGRNAAABAGADwABFJgEfwABkTcAARTECAAKBwABkVsAuGTSCwABkYMAuGUIANcAAZGgAAAEAXAEXwABkaIPAAGRNwC4ZhIQBgMAAZHXALhkkglmDwABkTcAuGYQGwABWhIEKwABkiMAAZJHAAGYbAADAAED+AAAAAQPAAGSfwABmGwAAAAYEBMAAZKsAAACEAWADwABsHwDAAGTCAAAAhUlgA4UaAMAAZNcAAACDKGADhRoAwABk6QAAAIE+YAOFGgACwABk/AAAALkKYAPAAGxbAWoAYAHAAGxcAsAAZQwAAAC5E2ADwABsWwFqAGABwABsXAJgA8AARTIBPgRAIRzAAGU3gMAAZSzALhoNJwEAASsAwABsMsAAZSzAAGU+AEAhHMAAZVaEwABlTMAuGkgnAQABKwDAAGxewABlTMAAZV0AQCEcwABlfIXAAGVrwC4aYScBAAErAMAAbF7AAGVrwABlgwBKwABligE1wABllQAAAQBgA8AARTIBH8AAZZXAAEVABQADgcAAZZ7ALhodgsAAZajALhorg8AAZa/ALho5ArkKhMAAZcnALhpIuROFwABl5sAuGmE1wABmAAAAAQBcARfAAGYAhsAAZZXALhrzhAGAwABmDcAuGg2CWYbAAGWVwC4a8wbAAFaFgQrAAGYgwABmMcAAZycAAK+8AAAAAQPAAGY9wABnJwAAAAQDA8AAZkkAAACEAWADwABsHwDAAGZgAAAAhYVgA4UaAMAAZnEAAACFh2ADhRoAAcAAZoQAAACvumADwABsWwFqAGABwABsXAJgA8AARisBPgNAIRzAAGakgMAAZpnALhuZJwEAASsAwABsMsAAZpnAAGarAEAhHMAAZr+DwABmucAuG8YnAQABKwDAAGxewABmucAAZsYASsAAZs0BNcAAZtgAAAEAYAPAAEYrAR/AAGbYwABGNwMAAoHAAGbpwC4bqYLAAGbvwC4btwGvuoPAAGb9wC4bxjXAAGcMAAABAFwBF8AAZwyEwABm2MAuHDWEAYDAAGcZwC4bmYJZhMAAZtjALhw1BsAAVoaBCsAAZyzAAGc9wABoEwAAr74AAAABA8AAZ0nAAGgTAAAABAQEwABnVQAAAIQBYAPAAGwfAMAAZ2wAAACFhWADhRoAwABndwAAALkSYAOJHwDAAGeOAAAAhYdgA4UaAABgA8AARjgBPgJAIRzAAGetgMAAZ6LALhzHJwEAASsAwABsMsAAZ6LAAGe0AErAAGe7ATXAAGfGAAABAGADwABGOAEfwABnxsAARkQDAAOBwABn18AuHNeCwABn3cAuHOWDwABn6cAuHPMANcAAZ/gAAAEAXAEXwABn+ITAAGfGwC4dNYQBgMAAaAXALhzHglmEwABnxsAuHTUGwABWh4EKwABoGMAAaCjAAGjmAACxEwAAAAEDwABoM8AAaOYAAAADAwPAAGg/AAAAhAFgA8AAbB8AwABoUAAAALkyYAOJHwDAAGhmAAAAhX5gA4UaAABgA8AARkUBPgJAIRzAAGiKgMAAaH/ALh3FJwEAASsAwABsMsAAaH/AAGiRAErAAGiYATXAAGijAAABAGADwABGRQEfwABoo8AARlACAAKBwABos8AuHdWCwABovsAuHeMANcAAaMsAAAEAXAEXwABoy4PAAGijwC4eJYQBgMAAaNjALh3FglmDwABoo8AuHiUGwABWiIEKwABo68AAaQPAAGm2AADAAEIdAAAAAQPAAGkWwABptgAAAAICAsAAaSIAAACEAWADwABsHwDAAGk5AAAAhX5gA4UaAABgA8AARlEBPgJAIRzAAGldgMAAaVLALh6uJwEAASsAwABsMsAAaVLAAGlkAErAAGlrATXAAGl2AAABAGADwABGUQEfwABpdsAARlsBAAGBwABpjsAuHr4ANcAAaZsAAAEAXAEXwABpm4LAAGl2wC4fAIQBgMAAaajALh6uglmCwABpdsAuHwAAAC3W9QAt2A0ALdn3AC3aaQAt2rYALdsDAC3bUAAt27gALdxcAC3dAAAt3cYALd5CAC3fOwAt4DQALeFCAC3h0QAt4nUALeMZAC3jvQAt5HIALeUtAC3lzwAt5tQALeezAC3oiAAt6V0ALepKAC3rNwAt7GMALe2PAC3uMwAt7xgALe+6AC3yCQAt8q0ALfOeAC30TAAt9PAALfWlAC32RwAt9tYALfgEAC340AAt+kAALftkAC38LgAt/WAALf6ZAC3/mQAuADkALgDuAC4BuAAuAhMALgNjAC4D4wAuBEgALgXWAC4GtwAuB8gALggjAC4JnQAuCfgALgpVAC4MJQAuDQgALg15AC4PEwAuD3EALg/iAC4QVQAuESEALhIGAC4S/gAuE+MALhTGAC4VwAAuFooALheNAC4Y+AAuGeEALhtvAC4cnQAuHZsALh6CAC4fVAAAAFQCwABWi4EKwABpu8AAacHAAGvYA8AAQjAAAAFgA4f4AAACBMAAVo2BCsAAag3AAGoZCcAAQiMAXQPAAGwZAWADiOcABMAAVo6BCsAAaifAAGoqCYFMAGADwABsWAABBcAAVpWBCsAAai/AAGovwABqigAAAAPAAGpEwABqigAAAAICAsAAakoAAATAAEIjXQPAAGwZAWADiOcAwABqXQAABIFMYAPAAGxYAABgA8AAVosBPgE9HsAAamiCMgIAAhbAAGpzLsAAQiPAAFaNLgADCAHAAFaNgADALiEwCAHAAFaOgQDALiFHCQHAAGovh/0AAAAABAbAAFaQgQrAAGqPwABqkcAAatQAAIP4AAAAAQPAAGqawABq1AAAAQAABIP5YAPAAGxWAVsBAQHAAGqbAAAAg/pdA5dKAV8DAAAAAF8DAAABPgE9MMAAaqQewABqqrU/AwADJ4P4FsAAasAuhAGCWRbAAGrMLoFMwABWjgAGwABWkYEKwABq2cAAatvAAGsoAACFPgAAAAEDwABq6MAAaygAAAIAAASD+WADwABsVgFbAAAEhT9gA8AAbFYBWwICAsAAaukAAACD+l0DmOwCXwMAAF8DAQAAwABq7AAAAIVAXwMBAAAAXwMAAAE+AT0wwABq9x7AAGr9tT8DAAMnhT4WwABrFC6EAYJZFsAAayAugUzAAFaOAAbAAFaSgQrAAGstwABrLcAAa3sAAIP7AAAAAQPAAGs6wABrewAAAAEBAcAAazsAAACD+l0DmHABWwAAXAE+AT0wwABrRB7AAGtKtT8DAAMng/sWwABrZy6EAYJZFsAAa3MugUzAAFaOAAbAAFaTgQrAAGuAwABrgMAAa9YAAIQCAAAAAQPAAGuRwABr1gAAAAEBAcAAa5IAAACD+mADmK0AAFwBPgE9MMAAa5sewABrobU/AwADJ4QCFsAAa8IuhAGCWRbAAGvOLoFMwABWjgAAAC4hogAuIh4ALiK5AC4jIgAuI4kAAAAEAAAAAYEKAC4jpQAt1qQALiCtAC4jogAAAAIALiOlAAAAAAACCMAAVpbAAEIxgQsAAAOBAwAAgi4AAQEFhkSUTZROhkCUWIFwAACbYgAAgZ8AALU5AAEBAq4JriMAAAABAsAAVpeBC4LSgtiFxoOuuQAAAWADiVUAAAABBcAAVqGBC4MCgwiDHgEAAAODHIMeAAAAAAAAAGADwABWlwE/AQkBgwiJYwAAAAAGBsAAVpmBC4Mjgz+DcgEAg2UBaoMkYAPAAGxWgLUAAAEDg0uDcgAAAAAAAABgA4lHAUqDTgEmg04FHoNOtT8DAAMng2Ucg2mUgVoAAAAAwABsjysAYAOJRwbAAFabgQuDd4OFg+wAAIP4AWqDeGADwABsVoC1AAABA4OOg+wAAAEAAASD+WADwABsVgFbAQEBg6IAAACD+l0Dl98BXwMAAAAAXwMAAAE+AT0wg6seg7G1PQQABCSDyQEWg70uhU7AAG0tJIPdARaD0ICDzsAuJN2FTsAAbS0cg9+UgVoAAAAAwABsjysABsAAVpyBC4Pxg/+EdQAAhT4BaoPyYAPAAGxWgLUAAAEDhAyEdQAAAgAABIP5YAPAAGxWAVsAAASFP2ADwABsVgFbAgIChCQAAACD+l0Dl+0CXwMAAF8DAQAAhCkAAACFQF8DAQAAAF8DAAABPgE9MIQ0HoQ6tT0EAAQkhFIBFoRGLoVOwABtLSSEZgEWhFmAhFfALiV5hU7AAG0tHIRolIFaAAAAAMAAbI8rAAbAAFadgQuEeoSGhOgAAIP7AWqEe2ADwABsVoC1AAABA4SThOgAAAABAQGEpAAAAIP6XQOYcAFgA8AAbFYAAFwBPgE9HoSttT0EAAQkhMUBFoS5LoVOwABtLSSE2QEWhMyAhMrALiYLhU7AAG0tHITblIFaAAAAAMAAbI8rAAbAAFaegQuE7YUOhXAAAINrAWqE7mADwABsVoC1AAABA4UdhXAAAAABAQGFKgAAAINlYAOJRwAAYAPAAFaXAT4BSoU9ASaFPQUehUS1PwMAAyeDaxyFY5SBWgAAAADAAGyPKwBgA8AAVpcGwABWn4ELhXWFhoXEAACGSQFqhXZgA8AAbFaAtQAAAQOFjIXEAAAAAgIChZQAAACB0WADwABsVgCFpwAAAIZKYAObYwAAYAPAAGxbAUqFtwEchbwuJwEAAYCFv8AuJvMAiVkAAC4kTQAuJKUALiU0AC4l4AAuJl4ALibIAC4nKwAAAAYAAAABgQsALidPAC4kAgAuJ0wAAAABAC4nTwAAAAAAAgjAAFaiAIEMAAASgNwAAIIuAAEBDoZUhkSUTYZOhlqGVoZLhmqGUoaMhm2GZoZ7hlCCLgAAliAAAQEBirqCdAAAwABZMgABAQK3qMAAQjKCwgAAwABAegAAguoAAMAATWcAAIMdAADAAE3gAACDTQAAwABN8wAAg4gAAMAAQQgAAIOyAADAAE5yAACD3wAAwABOjQAAhA0AAMAATwIAAIQ6AADAAEGFAACEYQAAwABBmwAAhJQAAMAATx4AAITFAADAAEHJAAEBAavLhQYAAMAAWV4AAQEBt7eFUAAAlNgAAQEHgrigeaB/oISiAKaopqyGnwEAgi4AAQEBhnsBihUAAAICwABWt4EMwABCKMAAQi7AAEnFA8AAQjMAAAFgA8AAbFYAAV0DwABZNQFgA8AAbB8EBMAAVrmBDMAAQmXAAEJtGKybAF0DwABsGQFgA8AAbB8BKwTAAFa6gQzAAEKLwABClBiGBQBdA8AAbBkBYAPAAE8fAATAAFa7gQzAAEKqwABCsBiZyQBdA8AAbBkBYAPAAEGGAATAAFa8gQzAAENIwABDTRifcgBdA8AAbBkBXQPAAGwZAWADwABsHwErAQXAAFbAgQzAAENSwABDUsAASR8AAAADwABDZMAASR8AAAACAgLAAENqAAAEhgVdA8AAbBkBYAPAAE8fAMAAQ3oAAASZyV0DwABsGQFgA8AAQYYAAGADwABWtwE+B0AcwABDoBbAAEOZFsAAQ48uhgXAAFa6gODAAGxqJwEAARbAAEOqFsAAQ6MumcnAAFa7gODAAGxqAMAAbDLAAEOPwABDsAA9F8AAQ7gurJsewABDx8AAbPwBAWADwABsHwEWwABD2xbAAEPRLoYFwABWuoDgwABsagDAAFa5TsAARAbAAEQWAADAAEI0XQPAAGxfAmADwABPH2ADwABsHwEywABEOmADwABPH2ADwABsHwA9F8AAREIun3IewABETsAAbPwBAV0DwABsGQFgA8AAbB8BFsAARGgWwABEXi6GBcAAVrqA4MAAbGoAwABWvEXAAER1AcAARH7AAESAAACB1GADwABsHwGTARzAAESHg8AARIXALiqBgToBAAEWwABEkhbAAESJLqybwABWuYDgwABsagDAAGyFAYvAAESawC4qgRzAAESbg8AARJrALiqBgT8BAAGUAMAAbIg+Az0cwABErxbAAESnLqybwABWuYCcAgACg8AARLDALiqBg8AARLXALiqBAMAAbMs9HMAARM2CwABEvsAuKgmAnAIAAhzAAETXFsAARM4uhgXAAFa6KQEAAYPAAETYwC4qgQDAAGy4g8AARN7ALiqBAMAAbGM9HMAAROwWwABE5y6fcsAAVryAnAIAAoPAAETtwC4qgTHAAET3YAPAAGwfAADAAGzLT8AARQbAAEULAAABwABCNWEDAmADwABsH2ADwABBhlwAA8AARSDAAEi5AAAAAgICwABFJQAAAIMoYAPAAGwfAMAARTgAAACBl2ADwABBhgAAXAE+AUnAAEVGJcAARU8AhcAARUrALivOYAPAAE5zPgJJwABFbiIlwABFgwAWwABFdxTAAEVywC4rzgUBYAPAAE5zmrbAAE54YAPAAE8fABzAAEW4FsAARa4uhgXAAFa6KwEAARbAAEXGFMAARcHALivOBQFgA8AATnOatsAATngAwABsND4BPRzAAEYJHMAAReUWwABF4C6fcsAAVrwpAQABHMAARfWCwABF5sAuKgkpAQABFsAARfsUwABF9sAuK84FAWADwABOc5q2wABOeADAAGxhAMAAbLg2AQABhMAARg3ALiu+AMAAbEc/ScAARichHMAARjoWwABGMBTAAEYrwC4rzgUBYAPAAE5zga3AAE52JwEAASsAwABsYj4BPgJOwABGcQAAADxdA8AAbEoBYAPAAEGGARbAAEZxHgDAAGwvAQFdA8AAbCABYAPAAEGGARbAAEZxFMAARmzALivOBQFgA8AATnOBrcAATnYAPcAAbEtFAAABHMAARnGGAMAuLQI+AAAAAMAAbE0APgJOwABGYAAAAI/mYAPAAEGGARbAAEZ8hgDALi0CQMAAbE8+AT0cwABGn4PAAEaKwC4rk4CVAgAChMAARqDALiu+h8AARqfALi1xAAA/ScAARtUlwABG3gCFwABG2cAuK85gA8AATeE+A0nAAEcAIRzAAEcXFsAARwkUwABHBMAuK84FAWADwABN4bCvwABN5CcBAAErAMAAbGI+AT4CTsAAR1oAAAA8XQPAAGxKAWADwABPHwEWwABHWh4AwABsLwEBXQPAAGwgAWADwABPHwEWwABHWhTAAEdVwC4rzgUBYAPAAE3hsK/AAE3kAD3AAGxLRQAAARzAAEdahgDALi4OPgAAAADAAGxNAD4CTsAAR0UAAAC6iWADwABPHwEWwABHaYYAwC4uDkDAAGxPPgE9HMAAR4yDwABHd8AuK5OAlQIAAoTAAEeNwC4rvhbAAEehh8AAR5TALi59hTnAAE8hAAA/ScAAR8chHMAAR9gWwABH0BTAAEfLwC4rzgUBYAPAAE3hr0DAAE3lJwEAASsAwABsYj4BPgJOwABI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AEuHFMAAS4LALl8QAQFgA8AATnOBrcAATnYAPcAAbEtFAAABHMAAS4eDAMAuYBE+AAAAAMAAbE0APgJOwABLdgAAAI/mYAPAAEGGARbAAEuSgwDALmARQMAAbE8+AT0cwABLo4LAAEuewC5fMoE0AQABHsAAS6rAAFarAgACgMAAS8HALl8AhMAAS8vALmCAAADAAG0FP0nAAEv4JcAATAEAgcAAS/zALl8QYAPAAE3hPgM9HMAATCSCwABMH8AuXzKBNAEAAR7AAEwrwABWqwIAAoDAAExCwC5fABbAAExRFMAATEzALl8QAQFgA8AATeGFA8AATeMAAMAAbQVJwABMYyEcwABMehbAAExsFMAATGfALl8QAQFgA8AATeGwr8AATeQnAQABKwDAAGxiPgE+Ak7AAEy+AAAAPF0DwABsSgFgA8AATx8BFsAATL4eAMAAbC8BAV0DwABsIAFgA8AATx8BFsAATL4UwABMucAuXxABAWADwABN4bCvwABN5AA9wABsS0UAAAEcwABMvoMAwC5heD4AAAAAwABsTQA+Ak7AAEykAAAAwABCVWADwABPHwEWwABMzYMAwC5heEDAAGxPPgJJwABM1yEcwABM8xbAAEzthMAATNvALmHnhTnAAE8hJwEAASsAwABsXj4BPRzAAE0NgsAATQjALl8ygTQBAAEewABNI8AAVqsCAAKAwABNOsAuXwAWwABNVoTAAE1EwC5h54U5wABPIQAAwABtBT9JwABNcSEcwABNkxbAAE2HhMAATXXALmHnhXHAAE8iJwEAASsAwABsXj4BPRzAAE2tgsAATajALl8ygTQBAAEewABNw8AAVqsCAAKAwABN2sAuXwAWwABN9oTAAE3kwC5h54VxwABPIgAAwABtBT8/ScAATiEhHMAATjIWwABOKhTAAE4lwC5fEAEBYAPAAE3hr0DAAE3lJwEAASsAwABsYj4BPgJOwABObgAAADxdA8AAbEoBYAPAAE1oARbAAE5uHgDAAGwvAQFdA8AAbCABYAPAAE1oARbAAE5uFMAATmnALl8QAQFgA8AATeGvQMAATeUAPcAAbEtFAAABHMAATm6DAMAuYyA+AAAAAMAAbE0APgJOwABOXwAAAJUiYAPAAE1oARbAAE53gwDALmMgQMAAbE8+AT0cwABOhoLAAE6BwC5fMoE0AQABHsAA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AGwZAWADwABsVgE+BD0jHMAAbKGCwABsmcAueLMnAQABKwDAAGxeisAAbJnALnizHsAAbKnAAG4LAAFgA8AAQZwAACsBXQPAAGxXAWADwABBnE7AAGzmwABs7AAAwABCYV0DwABsGQFdA8AAbBkBYAPAAGxWATHAAGz8XQPAAGwZAWADwABsVgBJwABtAiXAAG0MAIDAAG0GwC54lGADwABOcz4CTsAAbT7AAG1KAACatmADwABBnAEWwABtUhTAAG1MwC54lAABYAPAAE5zmrbAAE54ScAAbWMcwABtdxbAAG1tFMAAbWfALniUAAFgA8AATnOBrcAATnYnAQABKwDAAGxiPgFJwABtiBzAAG2eFsAAbZIUwABtjMAueJQAAWADwABOc5q2wABOeCcBAAGBwABtocAueKMAwABsXj4BPRzAAG22g8AAbbDALnkzNgEAATHAAG3CYAPAAGxWARTAAG3DwC54lAABYAPAAE5zAMAAbEdJwABt2RzAAG3lgsAAbd3ALnizNgEAARbAAG3vFMAAbenALniUAAFgA8AATnOatsAATngAwABsfT4CScAAbgciJcAAbhcAhMAAbgvALnmGYAPAAEB7ACEcwABuRBbAAG42FMAAbirALnmGBAFgA8AAQHuwr8AAQH0nAQABKwDAAGxiPgE+Ak7AAG6KAAAAPF0DwABsSgFgA8AATx8BFsAAbooeAMAAbC8BAV0DwABsIAFgA8AATx8BFsAAbooUwABufsAueYYEAWADwABAe7CvwABAfQA9wABsS0UAAAEcwABuioUAwC563T4AAAAAwABsTQA+Ak7AAG5yAAAAhRRgA8AATx8BFsAAbpmFAMAuet1AwABsTz4BScAAbqchHMAAbroWwAButIbAAG6rwC57TIU5wABPIScBAAErAMAAbF4+AT4CTsAAbu0AAAA8XQPAAGxKAV0DwABsGQFgA8AAbFYBFsAAbu0eAMAAbC8BAV0DwABsIAFdA8AAbBkBYAPAAGxWAR7AAG7twABWrwMAAxbAAG8nhsAAbx7ALntMhTnAAE8hgcAAby7ALnijgsAAbzPALnizAAA9wABsS0UAAAEcwABu7YcAwC57nD4AAAAAwABsTQA+Ak7AAG7lAAAAgSRdA8AAbBkBYAPAAGxWARbAAG89hwDALnucQMAAbE8+AT0cwABvVYPAAG9P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/gDAAEjWAAAgwABCp10DwABsXwJgA4omXQPAAGxfAmADiVVgA8AAbB8AAGADwABsHwE+AknAAEjvHMAASQIWwABI+IDAAEjzwC7+bIU4igEnAQABFsAASQUuhXDAAFeHAMAAbF5KwABJFAFqwABJJGADwABsHwM/SsAASTMBasAASUNgA8AAbB8ABsAAV42BFMAASVXAAEllwABLTAAAhlgBasAASVZgA8AAbFaAtQAAAQPAAEl3wABLTAAAAAICAsAASYYAAACEDWADiaoAwABJuQAAIMAAQqddA8AAbF8CYAOKJl0DwABsXwJgA4lVYAPAAGwfAABgA8AAbB8BPgNOwABJ1sAASd0AAIGwYAPAAGwfAWrAAEnoYAPAAGwfAEXAAEn3AcAASgDAAEoCAACB1GADwABsHwGTARzAAEoJg8AASgfALv+fgToBAAEWwABKHhbAAEoQgMAASgvALv85g3OJroDgwABsagDAAGyFAYvAAEoowC7/nxzAAEomg8AASijALv+fgT8BAAGUAMAAbIg+AT2KwABKM8Au/3oewABKRYocAgACgsAASlXALv96HsAASnCKHQIAAhbAAEqoHMAASqQWwABKlhbAAEqMgMAASofALv85gtOJsINjg0IpAQABg8AASqXALv+fAMAAbLiGh4oyHsAASsDAAFdiAwACFsAAStAuhXDAAFeHHMAASvEWwABK5IDAAErfwC7/OYNzia4pAQABg8AASvLALv+fAMAAbLgBwABCp4HAAEsbwC7/RwAASsAASzsBgsAAS0LALv96BsAAV46BFMAAS1HAAEthwABPIwAAhmgBasAAS1JgA8AAbFaAtQAAAQPAAEtxwABPIwAAAAICAsAAS34AAACEDWADidoAwABLsQAAIMAAQqddA8AAbF8CYAOKJl0DwABsXwJgA4lVYAPAAGwfAABgA8AAbB8BPgNOwABLzsAAS9UAAIGwYAPAAGwfAWrAAEvgYAPAAGwfAEXAAEvvAcAAS/jAAEv6AACB1GADwABsHwGTARzAAEwBg8AAS//ALwFtgToBAAEWwABMFhbAAEwIgMAATAPALwEHg3OJ3oDgwABsagDAAGyFAYvAAEwgwC8BbRzAAEweg8AATCDALwFtgT8BAAGUAMAAbIg+BE7AAEwzwABMPwAAhmdgA4MBARbAAExGgMAATEHALwEH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AEnrAAAAhA1gA4fKAABcAT4CPRzAAEn3LsAAQswBAAGAwABKEcAvbvcAwABXtz0cwABKHC7AAELSAQABgMAASjTAL273AMAAV7oGwABYKYEVwABKQsAASlPAAErKAACF5gFqwABKQ2ADwABsVoC1AAABA8AASmfAAErKAAAAAQEBwABKeAAAAIQNYAOH1gAAXAE+Aj0cwABKhC7AAELMAQABgMAASp7AL295AMAAV7c9HMAASqkuwABC0gEAAYDAAErBwC9veQDAAFe6BsAAWCqBFcAASs/AAErgwABLTwAAhcYBasAAStBgA8AAbFaAtQAAAQPAAErwwABLTwAAAAEBAcAASv0AAACEDWADhzUAAFwBPgI9HMAASwkuwABCzAEAAYDAAEsjwC9v+wDAAFe3PRzAAEsuLsAAQtIBAAGAwABLRsAvb/sAwABXugbAAFgrgRXAAEtUwABLZcAAS9QAAIXEAWrAAEtVYAPAAGxWgLUAAAEDwABLdcAAS9QAAAABAQHAAEuCAAAAhA1gA4csAABcAT4CPRzAAEuOLsAAQswBAAGAwABLqMAvcH0AwABXtz0cwABLsy7AAELSAQABgMAAS8vAL3B9AMAAV7oGwABYLIEVwABL2cAAS+rAAExdAACFwgFqwABL2mADwABsVoC1AAABA8AAS/zAAExdAAAAAQEBwABMCwAAAIQNYAOHIwAAXAE+Aj0cwABMFy7AAELMAQABgMAATDHAL3D/AMAAV7c9HMAATDwuwABC0gEAAYDAAExUwC9w/wDAAFe6BsAAWC2BFcAATGLAAExzwABM4AAAhb8BasAATGNgA8AAbFaAtQAAAQPAAEyCwABM4AAAAAEBAcAATI4AAACEDWADhxoAAFwBPgI9HMAATJouwABCzAEAAYDAAEy0wC9xgQDAAFe3PRzAAEy/LsAAQtIBAAGAwABM18AvcYEAwABXugbAAFgugRXAAEzlwABM9sAATWkAAIW9AWrAAEzmYAPAAGxWgLUAAAEDwABNCMAATWkAAAABAQHAAE0XAAAAhA1gA4cRAABcAT4CPRzAAE0jLsAAQswBAAGAwABNPcAvcgMAwABXtz0cwABNSC7AAELSAQABgMAATWDAL3IDAMAAV7oGwABYL4EVwABNbsAATX/AAE38AACF4QFqwABNb2ADwABsVoC1AAABA8AATZbA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muk+AUrAAETlAWrAAETyYAOa2bLHP07AAEUgwABFLAAAwABC8V0DwABsGQFgA4lVARbAAEUwgMAARS7AL8IChHCJwk7AAEVZwABFZQAAwABC8l0DwABsGQFgA4lVARbAAEVpgcAARWfAL8IOhHCJwknAAEWDHMAARaAWwABFiYDAAEWHwC/CAoTlicGBOwEAARbAAEWkgcAARaLAL8IOhOWJwQDAAGyGPgFKwABF4AFqwABF7WADmtmyxz9JwABGDBzAAEYjFsAARhyGwABGEMAvxvOA4MAAbGqBOgEAARbAAEYxh8AARiXAL8cggODAAGxqAMAAbIU+AUrAAEZnAWrAAEZ0YAOa2bLHP0XAAEaTAcAARpzAAEaeAACB1GADwABsHwGTARzAAEalFMAARqPAL8fuCACBOgEAARbAAEazh8AARqfAL8cggODAAGxqAMAAbIUBFcAARrvAL8fuCBzAAEa8FMAARrvAL8fuCACBPwEAAZQAwABsiD4CPY3AAEbIwC/CuxzAAEbYhcAARtHAL8K7ld0BAAEcwABG4oLAAEbcwC/CGpXgAgACHMAARxyHwABHEcAvxyApAQABFMAARx3AL8fuCAAAwABsuBzAAEcshsAARyHAL8bzKQEAARTAAEctwC/H7ggAAMAAbLgAwABYfQCa5UnAAEc5IRzAAEdFhcAARz7AL8K7leMAAAAAmuk+AUrAAEeTAWrAAEegYAOa2bLHP07AAEfXwABH3gAAwABC810DwABsGQFgA4nuARbAAEfigMAAR+DAL8IChHGJw07AAEgHwABIDgAAwABC9F0DwABsGQFgA4nuARbAAEgSgcAASBDAL8IOhHGJw0nAAEgnIhbAAEgyFMAASCvAL8kGCAAiwABsIgEWwABIRxTAAEhAwC/JMwkAIsAAbCI+BEnAAEijIRzAAEi6FsAASLOGwABIp8AvxvOA4MAAbGonAQABFsAASMmHwABIvcAvxyCA4MAAbGoAwABsMj4BSsAASNsBasAASOhgA5rZssc/ScAASQshHMAASSgWwABJEYDAAEkPwC/CAoTlicEnAQABFsAASS2BwABJK8Avwg6E5YnBAMAAbDI+AUrAAElPAWrAAElcYAOa2bLHP07AAEpZwABKYAAAwABC9WADwABsHwGTRcAASmsBwABKdMAASnsAAMAAQvZgA8AAbB8BkwEcwABKhxTAAEqAwC/KSwsAgToBAAEWwABKkBTAAEqJwC/JMwkAgODAAGxqAMAAbIUBFcAASpjAL8pLCxzAAEqeFMAASpjAL8pLCwCBPwEAAZQAwABsiD4FTsAASrPAAEq4AACBiGADwABsGAEWwABKyRzAAErAFMAASrrAL8kzCQApAQABFMAASsHAL8pLCwAAwABsuIGIifFBRcAAStcAARzAAErlFMAASt7AL8ovCgCBOgEAARbAAEruFMAASufAL8kGCACA4MAAbGoAwABshQEVwABK9sAvyi8KHMAASvwUwABK9sAvyi8KAIE/AQABlADAAGyIPgFJwABLDBzAAEskFsAASx8cwABLFhTAAEsQwC/JBggAKQEAARTAAEsXwC/KLwoAAMAAbLiBiInxJwEAARTAAEsnwC/KuwwAAMAAbDZCwABLLQA/ScAAS0YcwABLURTAAEtKwC/KLwoAJwEAARbAAEtbFMAAS1TAL8kGCACA4MAAbGoAwABsMkrAAEtjAWrAAEtwYAOa2bLHPz2NwABLjcAvwrscwABLnYXAAEuWwC/Cu5XdAQABHMAAS6eCwABLocAvwhqV4AIAAhbAAEvnHMAAS94UwABL2MAvyTMJACkBAAEUwABL38AvyksLAADAAGy4gZeJ8hbAAEv8HMAAS/MUwABL7cAvyQYIACkBAAEUwABL9MAvyi8KAADAAGy4gZeJ8gDAAFh9AJrlScAATAwhHMAATBiFwABMEcAvwruV4wAAAACa6T4BSsAATEoBasAATFdgA5rZssc/P0rAAEyIARzAAEyWhcAATI/AL8K7ld0BAAEewABMnprtAgACgMAATMXAL8ICgcAATMjAL8IOAACa5QbAAFiugRjAAEzUwABM7MAATeEAAMAAQt0BasAATNVgA8AAbFaAtQAAAQPAAEz+wABN4QAAAAMDA8AATQ0AAACHvmADiaoAwABNHQAAIItGYAOJvgDAAE0mAAAAg8tgA8AAWHgAAGADmtkBPgJJwABNMxzAAE1DFsAATTmAwABNN8AvzSiC04mwJwEAARbAAE1WFsAATUyCwABNRsAvzUSBFsAAWHqDdMAAWdkAwABsXj4BSsAATXoBHsAATYWa7QIAAoDAAE2swC/NKIHAAE2vwC/NNgA/SsAATb0BasAATcpgA5rZsscGwABYr4EYwABN5sAA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kwEcwADRoYbAANGfwDDOdYE6AQABFsAA0bGDwADRo8AwzJiA4MAAbGoAwABshQGOwADRucAwznUcwADRuobAANG5wDDOdYE/AQABlADAAGyIPgE9HMAA0cmEwADRxsAwzhqAnAIAAhzAANHXg8AA0crAMMyYKQEAAYbAANHYwDDOdQDAAGy4HMAA0eeFwADR3sAwzkUpAQABhsAA0ejAMM51AMAAbLgAwABsY07AANIDwADSEAAAg81gA5Y4AR7AANIfljwBAAGEwADSJ8AwzhoATsAA0kAAAACBsF0DwABsGQFgA4lVAEXAANJMAcAA0lXAANJXAACB1GADwABsHwGTARzAANJeFMAA0lzAMM92CACBOgEAARbAANJrgcAA0mDAMMwlgODAAGxqAMAAbIUBFcAA0nPAMM92CBzAANJ0FMAA0nPAMM92CACBPwEAAZQAwABsiD4DTsAA0onAANKTAACDU2ADiVUBHMAA0p+BwADSlcAwzCUpAQABFMAA0qDAMM92CAAAwABsuE7AANKzwADSvwAAwABDzmADiVUBHMAA0ssuwABDvwEAARzAANLohsAA0tvAMM81g2cBAAEUwADS98Awz+IJAACWRwDAAFoIScAA0wohHMAA0xgUwADTDsAwz+IJACcBAAEUwADTG8Aw0BYKAACJWT4DPTXAANMyAAABAGADwABZugFqwADTMmADwABZugIjHMAA0zIUwADTMsAw0IgLACcBAAErAMAAbF4rHMAA0zkUwADTMsAw0IgLAJ4yAQABJMAA0zwGJ8AAQ8sWwADTVRbAANNILqyEwABZ76+OwABANieBdxTAANNpwDDP4gkAJ8AAQWcUwADThsAw0BYKAADAAFm8AVw9IxzAANOkh8AA053AMM9bJwEAASsAwABsYo/AANOdwDDPWxzAANOzgcAA06jAMMwlgKAAAAAAwABsZisBXQPAAGwZAWADiVU9HMAA08uHwADTxcAwz1uAnAIAAhTAANPMwDDPdggAFMAA09HAMNAWCgAAwABsyz4BPTXAANP1AAABAGADwABZugFqwADT9WADwABZugIjHMAA0/UUwADT9cAw0ZYLACcBAAErAMAAbF4rHMAA0/wUwADT9cAw0ZYLAJ4yAQABJMAA0/8FJ8AAQ8sWwADUGBbAANQLLqyEwABZ76+OwABANieBdxTAANQ7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vcAAWhyAwAERJ8AxCF4nwABDvQDAAFomP0rAARFKASTAARFWAYDAARFTwDEIXgbAAFomgSTAARFfwAERZMABEtQAAMAAQ+MAAAABA8ABEXDAARLUAAAAAwMDwAERigAAAIMSXQPAAGwZAWADwABZvwDAARGgAAAAg5xgA8AAbQYAwAERqwAAAMAAQ+RgA8AAbBgAAFwBPgQ9HMABEb2BwAERusAxDkFFAQABJ5TuAMAAbS49HMABEdGBwAERzsAxDkFFAQABgsABEdfAMQ5RAMAAbS49HMABEeiBwAER5cAxDkGBZQEAASeBWQDAAG0PPgJOwAESFQAAADxdA8AAbEoBYAPAAFm/ARbAARIVHgDAAGwvAQFdA8AAbCABYAPAAFm/AYDAARIVwDEOKgA9wABsS0UAAAEcwAESFYMAwDEOwz4AAAAAwABsTQA+Ak7AARILAAAAhERgA8AAWb8BFsABEh6DAMAxDsNAwABsTz4BPTXAARImAAABAGADwABtBgGBwAESJsAxDkE1wAESMwAAAQBcARzAARIzhcABEibAMQ9DRQEAASedXQDAAG0uNcABEksAAAEAXAEcwAESS4XAARImwDEPQ0UBAAEWwAESZRbAARJYhMABElHAMQ8frITAAFnLr47AAEA2AMAAbS41wAESggAAAQBcARzAARKChcABEibAMQ9DRQEAASeA9wDAAG0uNcABEpcAAAEAXAEcwAESl4XAARImwDEPQ0UBAAEWwAESpITAARKdwDEPH6+OwABZygDAAG0uNcABEsEAAAEAXAEcwAESwYXAARImwDEPQ4FlAAAAAMAAbQ+FwAESJsAxD0MGwABaJ4EkwAES2cABEuXAAROsAACC6QAAAAEDwAES98ABE6wAAAACAgLAARL9AAAAgYhgA4kfAMABEwgAAACDf2ADwABsWwAAYAPAAFm/AT4BSsABExgBHMABEx8uwABD5QIAAoDAARMzwDEQciOBwAETQcAxEIA1wAETWAAAAQBdA8AAbBkBYAPAAFm/ARbAARNYLsAAQ73AAFocIxzAARNYgsABE1jAMRDBJwEAASsAwABsYhbAARNsLsAAQ7vAAFoagsABE1jAMRDBAV0DwABsGQFgA8AAWb81wAEThwAAAQBdA8AAbBkBYAPAAFm/ARbAAROHLsAAQ7zAAFobIxzAAROHgsABE4fAMREkJwEAASsAwABsYhbAARObLsAAQ7rAAFoZgsABE4fAMREkAV0DwABsGQFgA8AAWb8BXQPAAGwZAWADwABZvwDAAFooBsAAWiiBJMABE7HAARO9wAEW3gAAwABD5QAAAAEDwAETx8ABFt4AAAACAgLAARPNAAAAgYhgA4kfAMABE+UAAADAAEIjXQPAAGwZAWADwABZvwAAYAPAAFm/AT4ETsABFM/AARTTAACDE2ADwABsHwGTTsABFNjAARTdAACDFGADwABsHwEcwAEU8xbAARTsgcABFN/AMRHTgODAAGxqRAEAAZQAwABs4UPAART8HMABFQeCwAEVA8AxEfeDAAEAAYPAARUKwDESDADAAGz2PgROwAEVHMABFSAAAIMVYAPAAGwfARzAARUmgsABFSLAMRH3gT8BAAEcwAEVNhzAARUvg8ABFSrAMRIMRAEAAYLAARUxwDER9wDAAGzhgksBAAGUAMAAbOIAwABsiE7AARVPwAEVVQAAgxZgA8AAWb8BHMABFWOBwAEVV8AxEdMpAQABhMABFWTAMRJrAMAAbLhOwAEVdMABFX8AAIMXYAPAAGwfAR7AARWQgZECAAKAwAEVncAxEcUWwAEVsBbAARWphcABFaPAMRLHhETAAFnIgYiDsABJwAEVvRzAARXMhsABFcHAMRL7gToBAAGTAMAAbIU+AT2LwAEV28AxEgwcwAEV5oTAARXiwDESa0QBAAGUAMAAbOFJwAEV+BzAARYHhsABFfzAMRL7gTsBAAGTAMAAbIY+AT2KwAEWFsAxEfccwAEWIITAARYcwDESa4E/AQABlADAAGyIScABFjIhHMABFjuDwAEWNsAxEgwnAQABhMABFj7AMRJrAMAAbDI+AT2LwAEWjMAxEgyEwAEWk8AxEms+AUrAARavAYXAARa2wDESx0rAARbPASsGwABaKYEkwAEW48ABFu/AARdkAACC5QAAAAEDwAEXAMABF2QAAAACAgLAARcGAAAAgYhgA4kfAMABFxEAAACDf2ADwABsWwAAYAPAAFm/AT4BSsABFyEBHMABFyguwABD5QIAAoDAARczwDEUQSOBwAEXOcAxFE8WwAEXRC7AAEO7wABaGhbAARdTLsAAQ7rAAFoZAV0DwABsGQFgA8AAWb8AwABaKAbAAFoqgSTAARdpwAEXdMABGAYAAcAAQ+YAAAABA8ABF43AARgGAAAAAgICwAEXqAAAAICiYAPAAFoWAMABF74AAACAo2ADwABaFgAAYAPAAGwfAT4BSsABF8cBHMABF+MWwAEX0IHAARfOwDEU+sAAQ03AAFofgKQBAAEWwAEX74DAARftwDEU6sAAQ03AAFofAMAAbkMAADEEbQAxBL4AMQgpADEN/gAxEEgAMRGZADEUFwAxFL4AMRVVAAAACALAAFotgSTAARgLwAEYEcABGKoDwABD5wAAAWADwABsVgAAAgTAAFovgSTAARg5wAEYRgnAAEPEAF0DwABsGQFgA8AAWb8ABMAAWjCBJMABGGPAARhwCcAAQ8UAXQPAAGwZAWADwABZvwABBcAAWjKBJMABGHXAARh1wAEYqAAAAAPAARiAwAEYqAAAAAICAsABGIYAAATAAEPEXQPAAGwZAWADwABZvwDAARiaAAAEwABDxV0DwABsGQFgA8AAWb8AAGADwABaLQE/AwgBwABaL4AAwDEWDggBwABaMIEAwDEWJwkBwAEYdcAAbFoAAAAAAAAAMRZxAAAAAALAAFozgSTAARitwAEYs8ABIYeDwABD6AAAAWADwABsVgAADwTAAFo1gSTAARjOwAEY0gmBiABgA8AAbBgABMAAWjaBJMABGOLAARjsCbgoAGADwABsWwAEwABaN4EkwAEY/MABGQ0JwABDrwBgA8AAbFsABMAAWjiBJMABGR3AARkrCcAAQ7AAYAPAAGxbAATAAFo5gSTAARk7wAEZSQnAAEOyAGADwABsWwAEwABaOoEkwAEZWcABGWwJwABDswBgA8AAbFsABMAAWjuBJMABGXzAARmMCcAAQ7YAYAPAAGxbAATAAFo8gSTAARsAwAEbmgbAAEPpAGADwABaMwFqwAEbGmADwABaM8ABGdUEwABaPYEkwAEb78ABHKEGwABD6gBgA8AAWjMBasABHAlgA8AAWjPAARoHBMAAWj6BJMABHObAAR1VBsAAQ+sAYAPAAFozAWrAAR0AYAPAAFozwAEanQTAAFo/gSTAAR2awAEeIQbAAEPsAGADwABaMwFqwAEdtGADwABaM8ABGs8EwABaQIEkwAEeccABHwYGwABD7QBgA8AAWjMBasABHotgA8AAWjPAARsBBMAAWkGBJMABH1bAASADBsAAQ+4AYAPAAFozAWrAAR9wYAPAAFozwAEbMwTAAFpCgSTAASBNwAEgxAbAAEPvAGADwABaMwFqwAEgaGADwABaM8ABGjkEwABaQ4EkwAEhDsABIYUGwABD8ABgA8AAWjMBasABISlgA8AAWjPAARprAQXAAFpHgSTAARmRwAEZl8ABGn8BAAADwAEZoMABGn8AAAAHAQHAARmmAAAEgYhgA8AAbBgABsABGbgAAAS4KGADwABsWwFqwAEZxGADwABsWxzAARnWAAAEwABDr2ADwABsWwFqwAEZ6WADwABsWxzAARn7AAAEwABDsGADwABsWwFqwAEaC2ADwABsWxzAARodAAAEwABDsmADwABsWwFqwAEaLWADwABsWxzAARo/AAAEwABDs2ADwABsWwFqwAEaVGADwABsWxzAARpmAAAEwABDtmADwABsWwFqwAEaeGADwABsWxxgA8AAWjMBPwgIAcAAWjWAAMAxGNwIAcAAWjaBAMAxGO0IAcAAWjeCAMAxGQkIAcAAWjiDAMAxGScIAcAAWjmEAMAxGUUIAcAAWjqFAMAxGWMIAcAAWjuGAMAxGYEJAcABGZfAAGxaAAAAAAEGwABaRYEkwAEahMABGovAARqrAACBUwAAAAEDwAEak8ABGqsAAAAAAAAAYAPAAGwYAUrAARqZASTAARqrAyfAAEPxFsABGqUugYjAAFo1J4OjAAAxGgsAMRpdAAAAAQLAAFpIgSTAASTowAEk7sABJ5ADwABD8gAAAWADwABREgAAAQTAAFpKgSTAASUwwAElMwmBLABgA8AAQHsAAQXAAFpPgSTAASU4wAElOMABJb0AAAADwAElTMABJb0AAAADAwPAASVZAAAEgSxgA8AAQHsAwAElaAAAAICQYAONPADAASWRAAAAwABBAWADwABaaQAAYAPAAFpIAT8CCAHAAFpKgADAMRrOCQDAASWjwABRHAIAAoHAASWpwDEa3oLAASW0wDEa7AACBsAAWkyBJMABJcLAASXMwAEmzQAAguQAAAABA8ABJd3AASbNAAAAAgICwAEl6AAAAIGXYAOKQQDAASX0AAAAguFgA4MyAABgA4pBAT4DTsABJhXAASYfAACBrV0DwABsGQFgA4lVARzAASYyFsABJikuwABBAcAAURWC4wIAAhbAASZUgMABJk/AMRtfg2mKR4HAASZlwDEbbQDAAGQ5ScABJnYcwAEmhILA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h8AAr40AAMAARB1gA4lVARzAAK+lFsAAr5GBwACvj8AxePiEcInCKQEAAYXAAK+mwDF5uADAAGy4PRzAAK/IhMAAr7TAMXmAgJwCAAKFwACvycAxebgcwACv3C7AAEAUAwADhsAAr/LAMXpQh8AAr/nAMXrJgsAAsADAMXkGAMAAZxwAwABsyz4BPRzAALA/hMAAsCvAMXmAgJwCAAKFwACwQMAxebiGwACwRcAxelAAwABsyz4BPRzAALCBhMAAsG3AMXmAgJwCAAKFwACwgsAxebgcwACwnRbAALCJgcAAsIfAMXj4hHCJwikBAAGFwACwnsAxebgAwABsuADAAGzLTsAAsV3AALF0AACE5WADwABsHwEewACxfsAAbiICAWADwABsHwIWwACxiYDAALGHwDF46oTlicEWwACxo4HAALGhwDF4+ITlicEATsAAscXAALHTAADAAEQeYAPAAGxbARzAALHshcAAsdXAMXvPgToBAAGDwACx7sAxeR0AwABshU7AALJAwACyUAAAhHFdA8AAbBkBYAOJ7gExwACyUmADie4APgNOwACyZsAAsmgAAIHUYAPAAGwfAZNOwACyd8AAsnkAAIL8YAPAAGwfAZNBQ8AAsoQpPgFJwACymxzAALKhFMAAsp/AMXx2CACBOgEAARbAALK1FsAAsqWAwACyo8AxeOqEcYnDgODAAGxqAMAAbIU+AUnAALLJHMAAss8UwACyzcAxfIsJAIE6AQABFsAAsuMWwACy04HAALLRwDF4+IRxicOA4MAAbGoAwABshT4ETsAAswDAALMGAADAAEQfYAPAAGwYARbAALMdHMAAsxkWwACzCoDAALMIwDF46oRxicMpAQABFMAAsxrAMXx2CAAAwABsuIGIifFOwACzNsAAszwAAMAARCBgA8AAbBgBFsAAs1McwACzTxbAALNAgcAAsz7AMXj4hHGJwykBAAEUwACzUMAxfIsJAADAAGy4gYiJ8U7AALNpwACzbwAAnfxgA8AAbB8BHMAAs3cUwACzccAxfSUKAICkAQABFMAAs4HAMX1vCwAAwABsZ0nAALOVHMAAs58UwACzmcAxfbkMAIE6AQABkwDAAGyFPgE9HMAAs8SHwACztMAxfFE2AQABHMAAs9kWwACzyoDAALPIwDF46oRxicMpAQABNcAAs9oAAAEAYAPAAGwf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FsABKP8WwAEo9S6BFsAAWmuAkMAAWdwGwABaboEkwAEpDcABKSPAASlHAQCJSwFqwAEpDmADwABsVoC1AAABA8ABKS/AASlHAAAAAAAAAGADgzIBSsABKTIBFsABKTwWwAEpMi6BFsAAWmuJS8AAWdUGwABab4EkwAEpTMABKWLAASmKAQCJJgFqwAEpTWADwABsVoC1AAABA8ABKXDAASmKAAAAAAAAAGADgzIBSsABKXMBFsABKX0WwAEpcy6BFsAAWmuJJsAAWdgGwABacIEkwAEpj8ABKaXAASnNAQCJKAFqwAEpkGADwABsVoC1AAABA8ABKbPAASnNAAAAAAAAAGADgzIBSsABKbYBFsABKcAWwAEpti6BFsAAWmuJKMAAWdcGwABacYEkwAEp0sABKejAASoIAQCDdAFqwAEp02ADwABsVoC1AAABA8ABKfLAASoIAAAAAAAAAGADgzIBSsABKfUBFsABKf8WwAEp9S6BFsAAWmuDdMAAWdkGwABac4EkwAEqDcABKh7AASrXAADAAEQnAWrAASoOYAPAAGxWgLUAAAEDwAEqK8ABKtcAAAADAwPAASpCAAAAt2xgA8AAW7IAwAEqVwAAAIZjYAOJVQDAASpmAAAAgt9gA4KSAABcAT4BPRfAASqGgMABKnvAMZUghmMcwAEqli7AAEAUAwADFsABKreAwAEqrMAxlSCGY8AAW7SBwAEqvsAxlTCCwAEqxcAxlT4AwABnHMAAW7QGwABadIEkwAEq3MABKu3AASumAADAAEQoAWrAASrdYAPAAGxWgLUAAAEDwAEq+sABK6YAAAADAwPAASsRAAAAt2xgA8AAW7IAwAErJgAAAIZkYAOJVQDAASs1AAAAgt9gA4KSAABcAT4BPRfAAStVgMABK0rAMZXXhmQcwAErZS7AAEP8AwADFsABK4aAwAEre8AxldeGZMAAW7WBwAErjcAxleeCwAErlMAxlfUAwABnGcAAW7UGwABadYEkwAErq8ABK77AASwVAACC6QFqwAErrGADwABsVoC1AAABA8ABK9DAASwVAAAAAwICwAEr1wAAAILbYAODMgDAASvkAAAAgYhgA4kfAAHAASvwAAAAguZgA8AAbFsBasABK/hgA8AAbFscYAODrAE+AUrAASwGASsGwABadoEkwAEsGsABLDTAASz1AACC4gFqwAEsG2ADwABsVoC1AAABA8ABLEfAASz1AAAABAQEwAEsVgAAAIGXYAOJqgDAASxiAAAAguFgA4MyAMABLHwAAACC32ADgpIAwAEslQAAAICQYAONPAAAYAOJqgE+AUrAASymARzAASy3FsABLK0ugRbAAFprwABC5wMAA4DAASzRwDGXCoHAASzXwDGXGILAASzjwDGXJgDAAFnjBsAAWneBJMABLPrAAS0VwAEtrgAAguMBasABLPtgA8AAbFaAtQAAAQPAAS0xwAEtrgAAAAICAsABLUcAAACBl2ADiaoAwAEtUwAAAILhYAODMgAAXQPAAGwZAWADiVUBPgFKwAEtZQEcwAEtdhbAAS1sLoEWwABaa7dQAgACgMABLZnAMZe/gcABLZ/AMZfNAMAAWeQGwABaeIEkwAEts8ABLc3AAS5hAACF6AFqwAEttGADwABsVoC1AAABA8ABLdfAAS5hAAAAAgICwAEt4QAAAIGXYAOJVQDAAS3zAAAAg2VgA4lHAABgA4mqAT4BSsABLgYBH8ABLhGJvAMAAxbAAS4yFsABLigugRbAAFpriSfAAFnWgcABLj/AMZhiMcABLlZgA4lVAYDAAS5XwDGYVAAGwABaeYEkwAEuZsABLnfAAS8TAACC7gFqwAEuZ2ADwABsVoC1AAABA8ABLoLAAS8TAAAAAwMDwAEukwAAAILvYAOJVQDAAS6lAAAAg1NgA4lVAMABLsEAAACV8GADmvQAAGADwABsWwE+AUrAAS7NARzAAS7kFsABLt4WwAEu1C6BFsAAWmuDy8AAWd23XwMAA4DAAS72wDGY84HAAS7/wDGZAYLAAS8KwDGZDwDAAFh8BsAAWnqBJMABLxjAAS8pwAEvrQAAwABD9QFqwAEvGWADwABsVoC1AAABA8ABLzrAAS+tAAAAAwMDwAEvRAAAAIe+YAOJVQDAAS9QAAAAi0ZgA4lVAMABL2QAAACV8GADmvQAAGADwABsWwE+AUrAAS9wASIcwAEvdy6C7gMAA4DAAS+DwDGZp4HAAS+GwDGZtYLAAS+JwDGZwwDAAFp5ABzAAS+SLoLuAwADgcABL57AMZm1gMABL6HAMZmngsABL6TAMZnDAMAAWnkGwABae4EkwAEvssABL8zAATCMAACC3AFqwAEvs2ADwABsVoC1AAABA8ABL+TAATCMAAAAAwMDwAEv+gAAAILdYAOJqgDAATAPAAAAgt5gA4mqAMABMB4AAACC32ADgpIAAGADiaoBPgFKwAEwMwEcwAEwRBbAATA6LoEWwABaa8AAQ0UDAAOAwAEwbMAxmnCBwAEwc8Axmn6CwAEwesAxmowAwABZ5QAAMZMlADGTfwAxk9kAMZQzADGUjQAxlOcAMZWeADGWVQAxltMAMZeIADGYHQAxmLwAMZluADGaOQAxmuAAAAAOAsAAWn6BJMABMJHAATCXwAFCvYO4ZQAAAWADwABsVgAAAwTAAFqAgSTAATDDwAEwzwmshABgA8AAQHsABMAAWoGBJMABMOXAATDmCYCiAGADwABZvwAEwABagoEkwAEw/MABMP0JgKMAYAPAAFm/AAEFwABahoEkwAExAsABMQjAATE/AQAAA8ABMRzAATE/AAAAAwMDwAExIgAABKyEYAPAAEB7AMABMTUAAASAomADwABZvwDAATE9AAAEgKNgA8AAWb8AAGADwABafgE/BAgBwABagIAAwDGbtwgBwABagYEAwDGbxwgBwABagoIAwDGb1wkBwAExCMAAbFoAAAAAAQbAAFqEgSTAATFEwAExScABQrsAAI6JAAAAAQPAATFOwAFCuwAAAAEBAcABMWUAAACBFmADwABZ0AAAXAE+BU/AATF2wAExewAAAYGNYQMDYAODrGADg6xgA8AAbFtcAAPAATGDwAEyggAAAAMDA8ABMZQAAACDx2ADg6wAwAExqwAAALcLYAODrADAATHBAAAAg39gA8AAbFsAAFwBPgE9HMABMeAWwAEx0y6shMAAWoC3DAYABRbAATIDgMABMfnAMZxOg8vAAFndgsABMgrAMZyTg8ABMhrAMZyhhMABMivAMZyvgcABMjXAMZxoAbcNIRbAATJpFsABMlwurITAAFqAhKPAAECLwABApU7AATKVwAEylwAAgKJgA8AAWb8BFsABMp4ugKLAAFqBPTXAATKlAAABAGADwABZugFqwAEypWADwABZugIjHMABMqWDwAEypcAxnVQnAQABKwDAAGxeKxzAATKsg8ABMqXAMZ1UnjIBAAEkwAEyrwYnwABEKR7AATLNwABZrQEAAYLAATLWwDGdMwAngXcewAEy58AAWa0BAAEWwAEy8C6Ao8AAWoIAJ8AARCoWwAEzCBbAATL7LqyEwABagK+OwABANgDAAFm8AVxJwAEzIhzAATMzFsABMyYurITAAFqAJwEAARbAATM4gsABMzbAMZ0zrITAAFnLAMAAbF4+AUnAATNOJcABM1QAgsABM1LAMZ0zYAPAAE68PgJJwAEzcyIWwAEzeRTAATN3wDGdMwIBYAPAAE68hP3AAE2UACEewAEzhsAAWbYBAAEUwAEznMAxnTMCAWADwABOvAA+A07AATO1AAAAgZdgA4lVAEnAATPFFsABM8sWwAEzyS6Ao8AAWoKE/cAAWcU+Ak7AATPtwAEz9QAAwABDmWADhEsBJsABM+0BFsABM/kWwAEz9y6Ao8AAWoKERMAAWchgA4RLPYvAATQNwDGekhbAATQlFsABNByEwAE0FMAxnr+Ex4RQhQOE90nAATRCFsABNEgWwAE0Ri6Ao8AAWoKDf8AAWcQ+Ak7AATRqwAE0cgAAwABDmWADhEsBJsABNGoBFsABNHYWwAE0dC6Ao8AAWoKERMAAWchgA4RLPYvAATSKwDGekhbAATS+FsABNLcWwAE0ohbAATSZhMABNJHAMZ83hMeEUIRwhPWA4sAAbGuBl4jtScABNNUWwAE02xbAATTZLoCjwABagon3wABZwj4CTsABNPjAATUAAADAAEOZYAODzAEmwAE0+AEWwAE1BBbAATUCLoCjwABagoREwABZyGADg8w9i8ABNRjAMZ6SFsABNSeEwAE1H8Axn8OBl4POP0nAATVDIRzAATVMg8ABNUfAMZ6SJwEAASsAiVk+Aj2LwAE1Y8AxnpIcwAE2zB7AATV3lkABAAEcwAE1qIDAATWewDGcTsAAQucDAAMcwAE17xbAATXlgMABNdvAMZxOgJDAAFnchKsCAAIWwAE2KxbAATYeLqyEwABagIEswABAjxbAATZFFsABNj0WwAE2MC6shMAAWoCBFcAATDuEPsAAQRsAjmEWwAE2dBbAATZtFsABNmsugKPAAFqChETAAFnIgzODtBbAATaxFsABNqkWwAE2nC6shMAAWoCBFcAATDuBFcAAQRUAwABZ4wCDZwEAAYPAATbbwDGekgCWR0nAATbuIiEWwAE29RTAATbzwDGdMwIBYAPAAE68vq7AAE6/ASEWwAE3DBbAATcKLoCjwABagoN/wABZxD4BPR7AATcmwABZsgUABRbAATdJLqyEwABagBTAATdXwDGdMwIBYAPAAE68g8ABN1rAMZ6SFsABN2IUwAE3YMAxnTMCAWADwABOvL6uwABOv4DAATd0wDGcTgA/P0nAATepIhbAATevFMABN63AMZ0zAgFgA8AATryDf8AATZUAIR7AATe8wABZtwIAAhTAATfewDGdMwIBYAPAAE68kwA+A07AATf6AAAAgZdgA4lVAEnAATgKFsABOBAWwAE4Di6Ao8AAWoKE/cAAWcU+Ak7AATgywAE4OgAAwABDmWADhEsBJsABODIBFsABOD4WwAE4PC6Ao8AAWoKERMAAWchgA4RLPYvAAThSwDGh8hbAAThqFsABOGGEwAE4WcAxoh+Ex4RQhQOE90nAATiHFsABOI0WwAE4iy6Ao8AAWoKDf8AAWcQ+Ak7AATivwAE4twAAwABDmWADhEsBJsABOK8BFsABOLsWwAE4uS6Ao8AAWoKERMAAWchgA4RLPYvAATjPwDGh8hbAATkDFsABOPwWwAE45xbAATjehMABONbAMaKXhMeEUIRwhPWA4sAAbGuBl4jtScABORoWwAE5IBbAATkeLoCjwABagon3wABZwj4CTsABOT3AATlFAADAAEOZYAODzAEmwAE5PQEWwAE5SRbAATlHLoCjwABagoREwABZyGADg8w9i8ABOV3AMaHyFsABOWyEwAE5ZMAxoyOBl4POP0nAATmIIRzAATmRg8ABOYzAMaHyJwEAASsAiVk+Aj2LwAE5qMAxofIcwAE7ER7AATm8lkABAAEcwAE57YDAATnjwDGcTsAAQucDAAMcwAE6NBbAAToqgMABOiDAMZxOgJDAAFnchKsCAAIWwAE6cBbAATpjLqyEwABagIEswABAjxbAATqKFsABOoIWwAE6dS6shMAAWoCBFcAATDuEPsAAQRsAjmEWwAE6uRbAATqyFsABOrAugKPAAFqChETAAFnIgzODtBbAATr2FsABOu4WwAE64S6shMAAWoCBFcAATDuBFcAAQRUAwABZ4wCDZwEAAYPAATsgwDGh8gCWR0nAATszIiEWwAE7OhTAATs4wDGdMwIBYAPAAE68vq7AAE6/ASEWwAE7URbAATtPLoCjwABagoT9wABZxT4BPR7AATtrwABZsAYABhbAATt+LqyEwABagBTAATuMwDGdMwIBYAPAAE68FsABO5kWwAE7kRTAATuPwDGdMwIBYAPAAE68r0DAAE2N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Zx0AAMAAREVgA4OsARzAAWeEH8ABZyPAAGdCBQAFgMABZ0HAMb9VJsABZ0wBFsABZ0wurITAAFqJYAPAAEMGgsABZ1rAMcB4FsABZ2UuwABCI8AAWoqEwAFnc8AxycIAwABERgAAAADAAGc2ScABZ5YcwAFnqxbAAWenFsABZ5ourITAAFqJgSzAAECPJwEAARbAAWezhsABZ67AMcuigzODtADAAGxePgU9HMABZ94WwAFn2hbAAWfNLqyEwABaiYEswABAj4RDAQABhsABZ+jAMcuiAIN0TsABaAzAAWgUAACBFWADwABGtwEmwAFoDAEWwAFoIxbAAWgWLqyEwABaiYEVwABMO2ADwABGt0nAAWg0JcABaEkAFsABaEKCwAFoOMAxwHiERMAAWchgA4RLPgE9NcABaGsAAAEAXQPAAGwZAWADhEsBFsABaGuHwAFoY8AxzIG4I8AARtE1wAFofgAAAQBcARzAAWh+FMABaGvAMczeCAA2AQABJsABaIIBhsABaILAMcuiYAOESwDAAGxHNcABaIkAAAEAXAEcwAFoiRTAAWhrwDHM3ggANgEAASbAAWiXARbAAWiXgsABaI3AMcB4hETAAFnIYAOESwDAAGxHFMABaGvAMczeCAA/PTXAAWiyAAABAGADwABZugFqwAFosmADwABZugIjHMABaLIUwAFossAxzY0IACcBAAErAMAAbF4rHMABaLkUwAFossAxzY0IAJ4yAQABJMABaLwFJ8AAREEWwAFo3S6vjsAAWpcnhrInwABER4bAAWkMwDHLogDAAFm8AVxJwAFpHBbAAWktFsABaSAurITAAFqJhKPAAECLPgFKwAFpTQEXwAFpVC7AAEQvFsABaX6CwAFpdMAxwHiERMAAWcjAAFquPgFKwAFpoQEXwAFpqC7AAEQvhsABacjAMcuiwABarj8/PTXAAWnrAAABAGADwABZugFqwAFp62ADwABZugIjHMABaeuGwAFp68AxznEnAQABKwDAAGxeKxzAAWnyhsABaevAMc5xnjIBAAEkwAFqRAMnwABEQRbAAWofLq+OwABalyfAAERIAMAAWbwBXErAAWpLARfAAWpSLsAARC8WwAFqfILAAWpywDHAeIREwABZyMAAWq4GwABatIEkwAFqi8ABaqXAAWtkAADAAEO1AWrAAWqMYAPAAGxWgLUAAAEDwAFqr8ABa2QAAAABAQHAAWq9AAAAhABgA8AAQHsAAGADwABahwE+AUrAAWrLASMcwAFq2YDAAWrSwDHPPScBAAEWwAFq4S6shMAAWokAwABsXi4fwAFrC8AAWrcEAASAwAFrKsAxzz0cwAFrPxbAAWsyLsAAQiPAAFqKgKAAAAAAwABsZhbAAWtJLoN/wABaixbAAWtTLsAARC3AAFqMAAFgA8AAWqsGwABatYEkwAFracABa3zAAW3fAAHAAEQyAAAAAQPAAWuEwAFt3wAAAAUFBcABa5IAAACEAGADwABAewDAAWumAAAAgKJgA8AAWb8AwAFrtQAAAICjYAPAAFm/AMABa8MAAACDf2ADwABsWwDAAWvSAAAAwABEM2ADwABsWwAAYAPAAFm/AT4ETsABa/zAAWwJAADAAEIjXQPAAGwZAWADwABZvwExwAFsGGADwABZvwBJwAFsICXAAWwmAIHAAWwkwDHQEmADwABahz4BPRzAAWxCFMABbEDAMdASAQFgA8AAWofAAENnAQABhcABbFfAMdBfAMAAWps+AT0cwAFshoXAAWx5wDHQXzYBAAGBwAFsisAx0BIAwABsR0nAAWyYJcABbJ4AgsABbJzAMdAiYAPAAFqHPgE9HMABbLoUwAFsuMAx0CICAWADwABah8AAQ2cBAAGFwAFsz8Ax0F8AwABamz4BPR7AAWzxwABZrAIAAoLAAW0LwDHQIoXAAW0OwDHQXwBJwAFtJxzAAW0/FsABbTiFwAFtK8Ax0F+A4MAAbGonAQABlADAAGwyPgFKwAFtTQEWwAFtYYXAAW1UwDHQX4DiwABsaz4BSsABbXwBH8ABbYfAAFq3BAAEgMABbaTAMdAChcABbazAMdBfg8ABbbrAMdAyhMABbcTAMdBCAAAAMbpiADG7IQAxvh0AMb8eADHPBAAxz9YAMdHZAAAABgLAAFq4gSTAAW3kwAFt6sABduEDwABESQAAAWADwABahwAAAAEFwABaw4EkwAFuK8ABbivAAW9YAAAAA8ABblHAAW9YAAAABQUFwAFuZgAAAIQAYAPAAEB7AMABboAAAADAAERKYAPAAFm/AMABbqIAAADAAEQxYAPAAFm/AMABbsUAAACDf2ADwABsWwDAAW7aAAAAwABELWADwABsWwAAYAPAAFq4AT8BCQDAAW7wwABanwQABIDAAW72wDHSRDHAAW8LYAPAAFm/AoLAAW8MwDHSZoHAAW8kwDHSVIPAAW9BwDHSeITAAW9LwDHSiAAHBsAAWrqBJMABb13AAW9twAFvlgEAwABEMQAAAAEDwAFvhMABb5YAAAAAAAAAYAPAAFm/AUrAAW+HARzAAW+TFsABb4cuwABCI8AAWoopAQABkwDAAGy4BsAAWruBJMABb5vAAW+rwAFvzAEAwABESgAAAAEDwAFvusABb8wAAAAAAAAAYAPAAFm/AUrAAW+9ARzAAW/JFsABb70uwABCI8AAWoopAQABlADAAGy4BsAAWr2BJMABb9HAAW/YwAFy0QAAjokAAAABA8ABb93AAXLRAAAAAQEBwAFv9AAAAIEWYAPAAFnQAABgA4OsAT4FScABcAUiIRbAAXAXFsABcAourITAAFqJgzTAAECIACEWwAFwUBzAAXA9FsABcDiAwAFwLsAx08SHK8AAWdIpAQABFsABcEsWwAFwPi6shMAAWomBLMAAQI8AwABsYcAAQ1DAAFogPgE9HMABcNIfwAFwbcAAWoYDAAMWwAFwkS6shMAAWokWwAFwny7AAEQxwABauhbAAXC3LsAARErAAFq7AI6JAQABgMABcNjAMdPEAMAAWoQ/TsABcP3AAXECAACDvmADhJIBasABcRJgA4SShmdJwAFxHiIWwAFxMRbAAXEiLsAARErAAFq7g3/AAFnEARbAAXFMFsABcT0uwABESsAAWruE/cAAWcU+AT2JwAFxXsAx1JQjFsABcWUug3/AAFqLasABcX5gA4SShQlqwAFxlWADhJKGWAFgA4SSP0nAAXGnFsABcasuwABELcAAWow+AT0cwAFymx/AAXI1wABnQgUABYDAAXJTwDHTxCbAAXJeARbAAXJeLqyEwABaiWADwABDBhbAAXJsLsAARErAAFq7FsABcnwuwABCI8AAWoqBwAFyisAx1JQAwABERgAAAADAAGc2P0rAAXKxARbAAXLHFsABcrguwABESsAAWruERMAAWcgGwABavoEkwAFy1sABcvDAAXPUAADAAEO1AWrAAXLXYAPAAGxWgLUAAAEDwAFy+sABc9QAAAABAQHAAXMIAAAAhABgA8AAQHsAAGADwABahwE+AUrAAXMWASMcwAFzJIDAAXMdwDHV8ScBAAEWwAFzLC6shMAAWokAwABs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AEZoFsAARlsUwABGVcAyZkUAAWADiaqDc4muKQEAAZMAwABsuILAAEZtwDJmXQDAAGcZAD9KwABGxAEcwABGyy7AAEP8AwADHMAARv8WwABG8hTAAEbswDJmUQEBYAOJqoNzia4pAQABkwDAAGy4gMAARwTAMmZFgsAARwvAMmZdAMAAZxk/SsAAR2ABasAAR21gA4mchjgGwABbyYElwABIpMAASK3AAEnoAADAAEAUAAAAAQPAAEjCwABJ6AAAAAMDA8AASNMAAACC3WADiVUAwABI4wAAAILeYAOJVQDAAEjyAAAAgt9gA4KSAABgA4lVAT4CScAASQcWwABJGYLAAEkLwDJuQINWgq8+AUrAAEk5ARzAAElALsAARAUDAAOAwABJZsAybiSBwABJbcAybjKCwABJdMAybkAAwABnHT9KwABJjgEcwABJlS7AAEQGAwADgMAAScjAMm4kgcAASc/AMm4ygsAASdbAMm5AAMAAZyYGwABbyoElwABJ7cAASfbAAGRHAADAAEQFAAAAAQPAAEobwABkRwAAAAMDA8AASiwAAACC3WADiVUAwABKPAAAAILeYAOJVQDAAEpLAAAAgt9gA4KSAABgA4lVAT4QScAASnQewABKeMAAbPcCAAKAwABKgsAybwKBwABKicAybxAASsAASpEBgMAASpjAMm8CP0nAAErWJcAASuAAgMAAStrAMm8CYAPAAFj8SsAASvABgcAASvfAMm8QP0nAAEsCJcAASwwAgcAASwbAMm8QYAPAAFj8SsAASxwBgMAASyPAMm8CP0nAAEvWHMAAS+QWwABL2i6AkMAAZxKJwgEAAYDAAEvqwDJvAgCOZD4CScAAS/ocwABMCBbAAEv+LoCQwABnEonCAQABgcAATA7AMm8QAI5kSsAATBYBIxzAAEwdLsAAQ/YCAAKAwABMJcAybwKBwABMLMAybxAAwABnF4DAAEw1wDJvAoHAAEw9wDJvEAFgA4lVP0rAAExKAYDAAExRwDJvAknAAExjHMAATHEWwABMZy6AkMAAZxKJwgEAAYHAAEx3wDJvEACOZD4BSsAATIcBgcAATI7AMm8QP0nAAE1WHMAATWQWwABNWi6AkMAAZxKJxQEAAYDAAE1twDJvAgCOZj4CScAATX0cwABNixbAAE2BLoCQwABnEonFAQABgcAATZTAMm8Q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igEWwACeXRbAAJ5TLoCQwABnEolvjghKwACehQEcwACfLRzAAJ6MLsAARAUDAAMewACewZYkAgACFsAAntKAwACezMAynl2FN4oChMAAnuHAMqHiAIHAAJ7+wDKea4LAAJ8TwDKeeQDAAGcdg2sBAAEewACfTJbgAgACFsAAn2WAwACfX8Aynl2DZYoPFsAAn3iBwACfcsAynmuDZYldAACJWgbAAFvTgSXAAJ+UwACfncAAqcEAAMAARAYAAAABA8AAn8bAAKnBAAAAAwMDwACf1wAAAILdYAOJVQDAAJ/nAAAAgt5gA4lVAMAAn/YAAACC32ADgpIAAGADiVUBPhVJwAChAB7AAKEEwABs9wIAAoDAAKEOwDKi64HAAKEVwDKi+QA+AUrAAKElAYDAAKEswDKi6z9JwAChcCXAAKF6AIDAAKF0wDKi62ADwABY/D4BSsAAoZIBgcAAoZnAMqL5P0nAAKGqJcAAobQAgcAAoa7AMqL5YAPAAFj8PgFKwAChzAGAwACh08Ayous/ScAAohAlwACiGgCAwACiFMAyoutgA4mAPgFKwACiLwEUwACiNsAyousAAWADiYA/ScAAokclwACiUQCBwACiS8AyovlgA4mAPgFKwACiZgEUwACibcAyovkBAWADiYA/ScAAosQlwACizgCAwACiyMAyoutgA4lyPgFKwACi5gEUwACi7cAyousAAWADiXI/ScAAov4lwACjCACBwACjAsAyovlgA4lyPgFKwACjIAEUwACjJ8AyovkBAWADiXI/ScAAo4YcwACjkIDAAKOKwDKi6ycBAAEWwACjnRbAAKOTLoCQwABnEoltjgYAiVk+AUrAAKO6AYDAAKPBwDKi6z9JwACj0hzAAKPcgcAAo9bAMqL5JwEAARbAAKPpFsAAo98ugJDAAGcSiW2OBgCJWT4BSsAApAYBgcAApA3AMqL5P0nAAKRLJcAApFUAgMAApE/AMqLrYAOJnErAAKRkAYHAAKRrwDKi+T9JwACkdiXAAKSAAIHAAKR6wDKi+WADiZxKwACkjwGAwACklsAyous/ScAApKEcwACkq4DAAKSlwDKi6ycBAAEWwACkuBbAAKSuLoCQwABnEoNXjgkAiVlKwACkwgGBwACkycAyovk/ScAApNQcwACk3oHAAKTYwDKi+ScBAAEWwACk6xbAAKThLoCQwABnEoNXjgkAiVlKwACk9QGAwACk/MAyous/ScAApQgiJcAApRIAgMAApQzAMqLrYAOJ/gElwAClMACBwAClKsAyovlgA4n+PgFKwAClTgEcwAClVS7AAEQWwABnDwMAA4DAAKWYwDKi64HAAKWfwDKi+YLAAKWmwDKjBwDAAGclP0nAAKZCIiXAAKZMAIDAAKZGwDKi62ADib4AJcAApmUAgcAApl/AMqL5YAOJqj4BPYjAAKZ/wDKi6xbAAKaRFsAApocugJDAAGcSiZyOLj9JwACmsiIlwACmvACBwACmtsAyovlgA4m+ACXAAKbVAIDAAKbPwDKi62ADiao+AT2JwACm78AyovkWwACnARbAAKb3LoCQwABnEomcji4/ScAAp4giJcAAp5IAgMAAp4zAMqLrYAOJqgAlwACnrACBwACnpsAyovlgA4mqPgFKwACnxgEcwACnzS7AAEQXwABnDwMAAxTAAKftwDKi6wABYAOJqhTAAKf0wDKi+QEBYAOJqoLAAKf7wDKjBwDAAGckP0nAAKgWIiXAAKggAIDAAKgawDKi62ADib4AJcAAqDkAgcAAqDPAMqL5YAOJvj4BSsAAqFIBHMAAqFkuwABEGMAAZw8DAAMUwACol8AyousAAWADib4UwAConsAyovkBAWADib6CwACopcAyowcAwABnIz9JwACowCIlwACoygCAwACoxMAyoutgA4lkASXAAKjiAIHAAKjcwDKi+WADiWQ+AUrAAKj6AWrAAKkHYAOJZMAA3M0/QCrAAKl1wACpegEkwACpnAQnwABEGYDAAKmGwDKi6yfAAEQagcAAqZbAMqL5SsAAqaMBasAAqbBgA4lyhbEGwABbz4ElwACsncAArKbAALiUAADAAEQEwABnDwAAAAEDwACs2MAAuJQAAAADAwPAAKztAAAAgflgA4m+AMAArP0AAACCVWADib4AwACtCAAAAILfYAOCkgAAYAOJVQE+C07AAK3/wACuDwAAwABEG2ADwABsHwEewACuGcAAbRICAWADwABsHwIWwACuORbAAK4kgMAAriLAMqhXhHCJwoDgwABsahbAAK5YFsAArkOBwACuQcAyqGWEcInCgODAAGxqAE7AAK50wACuiQAAhHBdA8AAbBkBYAOJVQEewACuj8AAbPwBAWADiVUBg8AArp7AMqiKAEXAAK60AcAArr3AAK6/AACB1GADwABsHwGTARzAAK7GhcAArsTAMqklgToBAAGDwACuyMAyqIoAwABshQGNwACu2cAyqSUcwACu2oXAAK7ZwDKpJYE/AQABlADAAGyIPgFJwACu5hzAAK7shcAArurAMqklgToBAAEWwACvBRbAAK7wgMAAru7AMqhXhHCJwoDgwABsagDAAGyFPgJOwACvIMAAryYAAMAARBxgA4lVARzAAK8+FsAAryqAwACvKMAyqFeEcInCKQEAAYXAAK8/wDKpJQDAAGy4ScAAr0scwACvUYXAAK9PwDKpJYE6AQABFsAAr2oWwACvVYHAAK9TwDKoZYRwicKA4MAAbGoAwABshT4CTsAAr4fAAK+NAADAAEQdYAOJVQEcwACvpRbAAK+RgcAAr4/AMqhlhHCJwikBAAGFwACvpsAyqSUAwABsuD0cwACvyITAAK+0wDKo7YCcAgAChcAAr8nAMqklHMAAr9wuwABAFAMAA4bAAK/ywDKpvYfAAK/5wDKqNoLAALAAwDKocwDAAGccAMAAbMs+AT0cwACwP4TAALArwDKo7YCcAgAChcAAsEDAMqklhsAAsEXAMqm9AMAAbMs+AT0cwACwgYTAALBtwDKo7YCcAgAChcAAsILAMqklHMAAsJ0WwACwiYHAALCHwDKoZYRwicIpAQABhcAAsJ7AMqklAMAAbLgAwABsy07AALFdwACxdAAAhOVgA8AAbB8BHsAAsX7AAG4iAgFgA8AAbB8CFsAAsYmAwACxh8AyqFeE5YnBFsAAsaOBwACxocAyqGWE5YnBAE7AALHFwACx0wAAwABEHmADwABsWwEcwACx7IXAALHVwDKrPIE6AQABg8AAse7AMqiKAMAAbIVOwACyQMAAslAAAIRxXQPAAGwZAWADie4BMcAAslJgA4nuAD4DTsAAsmbAALJoAACB1GADwABsHwGTTsAAsnfAALJ5AACC/GADwABsHwGTQUPAALKEKT4BScAAspscwACyoRTAALKfwDKr4wgAgToBAAEWwACytRbAALKlgMAAsqPAMqhXhHGJw4DgwABsagDAAGyFPgFJwACyyRzAALLPFMAAss3AMqv4CQCBOgEAARbAALLjFsAAstOBwACy0cAyqGWEcYnDgODAAGxqAMAAbIU+BE7AALMAwACzBgAAwABEH2ADwABsGAEW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wDK7ewDAAGy4gsAAz9PAMrkHAMAAZxwAwABsy0rAAM/7AR/AANAGibwDAAMWwADQGhTAANAUwDK46wABYAOJqoLTibAewADQL5bgAgACFsAA0EgUwADQQsAyuOsAAWADiaqDZYmtFsAA0FsUwADQVcAyuPkBAWADiaqDZYmtAIbAANBpwDK7NgA/SsAA0HsBHMAA0IIugtwDAAOAwADQm8AyuOuBwADQosAyuPmCwADQqcAyuQcAwABnFgbAAFvSgSXAANDAwADQycAA3X0AAMAARBbAAGcPAAAAAQPAANEAwADdfQAAAAMDA8AA0REAAACC3WADiVUAwADRIQAAAILeYAOJVQDAANEwAAAAgt9gA4KSAABgA4lVAT4DScAA2TocwADZPi6C7gMAA4DAANlKwDK/J4HAANlRwDK/NWrAANlpYAOa9InSAMAAZxQ+AUrAANmJAYHAANmQwDK/NT9JwADZoRzAANmlLoLuAwADgcAA2bHAMr81gMAA2bjAMr8nasAA2dBgA5r0idIAwABnFD4BSsAA2fABgMAA2ffAMr8nP0nAANoIJcAA2hIAgMAA2gzAMr8nYAOJ/j4BSsAA2v0BHMAA2wQuwABAFAMAAxzAANt7HsAA2zKWPAEAATLAANs6YAOKJmADiVUBFsAA20EUwADbO8AyvycAAWADif6FOIoBFsAA21YWwADbTC6AkMAAZxKJbY4GAINnAQABFsAA25oWwADbkBTAANuKwDK/JwABYAOJ/oU4igGFOYorAJZHgcAA26zAMr81gsAA273AMr9DAMAAZxxJwADb2CXAANviAIHAANvcwDK/NWADif4+AUrAANwAARzAANwHLsAAQBQDAAOAwADcKMAyvyccwADcjx7AANxGljwBAAEywADcTmADiiZgA4lVARbAANxVFMAA3E/AMr81AQFgA4n+hTiKARbAANxqFsAA3GAugJDAAGcSiW2OBgCDZwEAARbAANyuFsAA3KQUwADcnsAyvzUBAWADif6FOIoBhTmKKwCWR4LAANzAwDK/QwDAAGccPgJAKsAA3UvAAN1QAErAAN1ZAWrAAN1mYAOJcoWxAAAyTQYAMk0sADJNeAAyTcYAMk4QADJVswAyXZIAMl5GADJmHwAybfgAMm7WADJ9wgAyjm0AMp4tADKivwAyqCcAMrHGADK4uwAyvvcAMsFv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wACroRbAAKuUFsAAq4suuTzAAFv+r1LAAFCmvSABAAEhHMAAq8AWwACrtoDAAKuxwDNVZIWMiJ8nAQABKwDAAGxeAMAASghKwACrzgFqwACr22ADwABRHcABHEIGwABcSoEvwACr/sAArBjAAK+FAAC47AAAAAEDwACsKMAAr4UAAAACAgLAAKw8AAAAhA1gA8AARCMAwACsSwAAALjPYAOJVQAAYAPAAFFWAT4FScAArF4cwACsaxbAAKxiLrk8wABb/sAAQDIBAAGBwACse8AzWYIAwABQvz4CTsAArJjAAKykAAC46mADwABtFgEcwACsq4DAAKymwDNZcrjoAAAAAMAARCdJwACsvSEcwACszYLAAKzBwDNZyCcBAAErAMAAbDI+A07AAKzrwACs9wAAhAVgA4UaATXAAKz9AAABAGADhyMBH8AArP2HKwEAAYLAAK0LwDNZyAA1wACtJAAAAQBcARfAAK0kg8AArP3AM1omhAEWwACtNoDAAK0xwDNZcoQBglmCWYPAAKz9wDNaJk7AAK1TwACtYAAAjjBgA4lVARzAAK2BFsAArXcWwACtbi65PMAAW/6AkMAAULWFwQEAARbAAK2gFsAArZgWwACtjy65PMAAW/6BFcAAUK+EPsAAQU8AjkxKwACttgEfwACtwcAAUWECAAKEwACt28AzWoCDwACt6cAzWhQAPz9OwACuFMAArhoAACRgA4UaAR7AAK4cwABDQwQABBbAAK5HLrk8wABb/hbAAK5WgMAArlHAM1lygT6HHBbAAK5igMAArl3AM1lynI/AAEQlFsAArnCAwACua8AzWXKEAYJZAEnAAK6BIRzAAK6LgsAAroXAM1r/JwEAASsAwABsXj4BSsAArpwBH8AArqfAAFFhAgACasAArsdgA4lyhbGCwACu1sAzWv8AP07AAK7xwACu/gAAjjBgA4lVARzAAK8bFsAArxEWwACvCC65PMAAW/6AkMAAULWFTQEAARbAAK83FsAAry8WwACvJi65PMAAW/6BFcAAUK+EPsAAQU8AjkpKwACvSQEfwACvVMAAUWECAAKDwACvbsAzW6mAwACvfMAzWXIABsAAXEuBL8AAr4rAAK+kwAC0twAAuO8AAAABA8AAr77AALS3AAAAAgICwACv3AAAAIQNYAPAAEQrAMAAr+sAAAC4z2ADiVUAAGAD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0/gUwADT8MAzZwUAAWADwABSnoWKwABSoScBAAErAMAAbF4+A07AANQvwADUPwAAwABEzmADwABRVgEcwADUShbAANRBLrk8wABb/sAAQJwEAAMWwADUbxTAANRnwDNnBQABYAPAAFKehYrAAFKhHMAA1JkWwADUjxbAANSGLrk8wABb/oCQwABQtYVzAQABFsAA1LYWwADUrhbAANSlLrk8wABb/oEVwABQr4Q+wABBTwCOSSKEwADU0MAzZ1kBhcAA1OPAM2drAcAAQBIqwABQ8T0XwADVKBTAANUgwDNnBQABYAPAAFKehYo1wADVRAAAAQBgA4UaARbAANVEh8AA1TTAM3i2hX7AAFFZNcAA1VAAAAEAXAEXwADVUBTAANVEwDN5fQgAhAAUwADVWcAzZwUAAWADwABSnoJYFMAA1UTAM3l9CADAAFKhPRzAANWAg8AA1WrAM2c+gJwCAAIWwADViRTAANWBwDNnBQABYAPAAFKehYrAAFKhFsAA1bKHwADVosAzeLaOMMAAUVgAwABsYz89HMAA1eQWwADV1xbAANXOLrk8wABb/q9SwABQpr0PAgACKxbAANYAFMAA1fjAM2cFAAFgA8AAUp6FisAAUqEAwABJ+k7AANYswADWNwAAwABAy2ADwABRVgEcwADWOS7AAEUABgAGFsAA1lkUwADWUcAzZwUAAWADwABSnoT4wABSo4HAANZpwDNnE4LAANaJwDNnI4PAANaowDNnPoTAANbKwDNnWYXAANblwDNnawDAAFxRPRfAANcGFMAA1v7AM2cFAAFgA8AAUp6E+DXAANcYAAABAGADhRoBFsAA1xiHwADXDcAzemyFfsAAUVk1wADXJAAAAQBcARfAANckFMAA1xjAM3r2CACEABTAANctwDNnBQABYAPAAFKeglgUwADXGMAzevYIAMAAUqM9HMAA11IWwADXRRbAANc8Lrk8wABb/q9SwABQpr0SAAAAAMAASf1FwADXbAHAANd1wADXewAAgyhgA8AAbB8BkwEcwADXhhTAANeAwDN7gwgAgToBAAEWwADXmBbAANeQFMAA14jAM2cFAAFgA8AAUp6GBsAAUqKA4MAAbGoAwABshQEVwADXoMAze4MIHMAA16UUwADXoMAze4MIAIE/AQABlADAAGyIPgJOwADXzcAA19oAAMAARPhgA8AAUVYBHMAA1+UWwADX3C65PMAAW/7AAECcBAADHMAA2BEWwADYChTAANgCwDNnBQABYAPAAFKehgbAAFKiKQEAARTAANgSwDN7gwgAAMAAbLhqwADYLGADwABY/MABCOEihMAA2EfAM2dZAYXAANhawDNnawHAAEASKcAAUPE9HMAA2KUWwADYnhTAANiWwDNnBQABYAPAAFKehgbAAFKigJwCAAIUwADYpsAze4MIADXAANi8AAABAGADhRoBFsAA2LwUwADYr8AzfAIJAIV+wABRWTXAANjIAAABAFwBF8AA2MgUwADYvMAzfMQKAIQAFMAA2NHAM2cFAAFgA8AAUp6CWBTAANi8wDN8xAoAAMAAbMs9HMAA2P4WwADY8RbAANjoLrk8wABb/q9SwABQpr0RAAAAAMAASfxKwADZDwEfwADZGsAAUWECAAIWwADZP4fAANk0wDN6bI4wwABRWBTAANlNwDNnBQABYAPAAFKeAEnAANliJcAA2W4AgMAA2WbAM2cFYAPAAFKyPg1OwADZkwAAAIGwYAPAAFycAEnAANmhHMAA2bsWwADZthbAANmtFMAA2aXAM2cFAAFgA8AAUrKFFMAAUrSBiIjrJwEAASsAwABsNj4BPY7AANnOwDN9oxzAANnXLsAARPIHAAUUwADZ/8AzZwUAAWADwABSshbAANocFMAA2hTAM2cFAAFgA8AAUrKFFMAAUrQWwADaOhTAANoywDNnBQABYAPAAFKyhgrAAFK1FsAA2lgUwADaUMAzZwUAAWADwABSsrGCwABSthbAANqBFMAA2nnAM2cFAAFgA8AAUrKxg8AAUrcChgsWwADasRTAANqpwDNnBQABYAPAAFKyhgvAAFK6r/AhHMAA2uIWwADa2hTAANrSwDNnBQABYAPAAFKyr2HAAFK5JwEAASsAwABsXsAAXEA+AT2OwADbA8AzfaMcwADbDC7AAEToBQAEFMAA2ynAM2cFAAFgA8AAUrIWwADbOhTAANsywDNnBQABYAPAAFKyhRTAAFK0FsAA21gUwADbUMAzZwUAAWADwABSsoYKwABStRbAANtqFMAA22LAM2cFAAFgA8AAUrKxg8AAUrcBhgsWwADbmhTAANuSwDNnBQABYAPAAFKyhgvAAFK6wABcPT0XwADbuhTAANuywDNnBQABYAPAAFKyhRQ1wADbzAAA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AMABAGoAAACEAGADglIAwAEAgQAAAMAARQ5gA4lVAMABAKEAAADAAEUPYAOJVQDAAQDDAAAAwABFEGADiVUAwAEA5wAAAMAAQLddA8AAbBkBYAOJVQDAAQEJAAAAwABFEV0DwABsGQFgA4lVAMABAToAAADAAEUCXQPAAGxfAmADglJgA4lVAMABAW8AAADAAEUDXQPAAGxfAmADhRpgA4lVAMABAZIAAADAAEC1YAPAAGxbAMABAa4AAACcsGADwABsWwAAYAOHmQE+AUnAAQHGJcABAdAAgMABAcrAM5urYAPAAFLXPhdOwAECBcABAhIAAMAARQRgA8AAUVYBHMABAh0WwAECFC65PMAAW/7AAECcBAADFsABAj4UwAECOMAzm6sAAWADwABS14V+wABS2YTAAQJKwDOb5yIUwAECWcAznFsJAAEUwAECbMAznG0KAAHAAEASKcAAUPFJwAECpBbAAQKuFMABAqjAM5urAAFgA8AAUtevpcAAUto+AT0cwAECxS7AAETTAwADFsABAwsUwAEC/sAznKILAI4wwABRWCexThbAAQMyFsABAycUwAEDIcAzm6sAAWADwABS14V+wABS2YQBglkAwABcmT89F8ABA1MUwAEDTcAzm6sAAWADwABS14V+NcABA20AAAEAYAOFGgEWwAEDbRTAAQNgwDOcogsAhX7AAFFZNcABA3kAAAEAXAEXwAEDeRTAAQNtwDOdpQwAhAAUwAEDgsAzm6sAAWADwABS14JYFMABA23AM52lDADAAFLZTsABA5jAAQOjAADAAET/YAOJVQEWwAEDshTAAQOlwDOcogsAjjDAAFFYPRzAAQPZh8ABA8bAM5wlgJwCAAIWwAED4BTAAQPawDObqwABYAPAAFLXhX7AAFLZFMABA+7AM54IDAAAwABsY07AAQQEwAEECwAAgOBgA8AAbB8BFsABBBmFwAEEDcAzm/eA4MAAbGo9HMABBDOFwAEEJ8Azm/c2AQABKwDAAGxHPRzAAQRQhcABBETAM5v3NgEAASsAwABsRz0cwAEEYS7AAEULBAAEFMABBIzAM54IDAAWwAEEnhTAAQSYwDObqwABYAPAAFLXr6XAAFLahcABBKvAM5v3FMABBLjAM55yDQAAwABcVU7AAQTQwAEE3gAAwABFEmADiVUBHMABBOuFwAEE4MAzm/cp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FsABEwkuuTzAAFv+gRXAAFCvhDzAAEFOAI5RasABE0BgA5r0idIAwABb6EnAARNeIhTAARNiwDOoxBIAACEUwAETbMAzqVwTAD4BPRfAAROCLsAARMQWwAETmhTAAROUwDObqwABYAPAAFLXhAGCWcAAXAE/ScABE7QiIRTAARO5wDOoxBIAABTAARPCwDOpXBMAPgE9F8ABE9guwABExRbAARQAFsABE/UUwAET78Azm6sAAWADwABS14V+wABS2YQBglnAAFwCP0rAARQbARTAARQiwDOf4xEAScABFDolwAEURACAwAEUPsAzm6tgA8AAUuw+C07AARRkwAEUbQAAwABE5WADiVUBHMABFIwWwAEUghbAARR5Lrk8wABb/oCQwABQtYVzAQABFsABFKkWwAEUoRbAARSYLrk8wABb/oEVwABQr4Q+wABBTwCOSU7AARTXwAEU5wAAwABEzmADwABRVgEcwAEU8hbAARTpLrk8wABb/sAAQJwEAAMWwAEVExTAARUNwDObqwABYAPAAFLshYrAAFLuFMABFR7AM6rACwAUwAEVKMAznG0KAAHAAEASKsAAUPFOwAEVbMABFXYAAIWKYAOFGgEcwAEVixbAARWCLrk8wABb/sAAQBkCAAIUwAEVosAzqsALABTAARWswDOrGgwAAMAAUME9F8ABFcoUwAEVxMAzm6sAAWADwABS7IWKNcABFdYAAAEAYAOFGgEUwAEV1sAzq4QNADXAARXhAAABAFwBF8ABFeEUwAEV1sAzq+IOAIQAFMABFerAM5urAAFgA8AAUuyCWBTAARXWwDOr4g4AwABS7j0cwAEWDRbAARYAFsABFfcuuTzAAFv+r1LAAFCmvSIBAAEUwAEWI8Azq4QNAADAAEoJTsABFwTAARcJAACFi2ADh5kBHMABFwsuwABFDQsACxbAARcqFMABFyTAM5urAAFgA8AAUuyFi8AAUu8UwAEXOsAzm6sAAWADwABS7ILAARdLwDObx4PAARdmwDOb14TAAReDwDOb54XAARecwDOb94bAARezwDOcDofAARfQwDOcJRTAARfvwDOcQAgAFMABGBHAM5xbCQAUwAEYLMAznG0KAADAAFxWPRfAARhLFMABGEXAM5urAAFgA8AAUuyFizXAARhSAAABAGADh5kBFMABGFLAM6xsDgA1wAEYWAAA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FsABIRMUwAEhDMAzs74OAIV+wABRWTXAASEfAAABAFwBF8ABIR8UwAEhE8AztEcPAIQAFMABISjAM7MiDQCCWBTAASETwDO0Rw8AiO89F8ABIUcUwAEhPsAzsyINAIGXFsABIVUUwAEhTsAzs74OAI4wwABRWIjtPz4CTsABIaPAASGyAADAAET3YAPAAFEdARzAASHLFsABIcIuuTzAAFv+wABApAEAARTAASHawDOzIg0AAMAAUP9JwAEh7xbAASICFMABIfPAM7TQDgDAAECmwABRJT4CScABIhwcwAEiKhTAASIgwDOyiAsAJwEAASsAwABsYj4CPRXAASJDwDOyiAsxwAEiZGADiOcAPRzAASKAFMABInbAM7KICwCBNAEAARzAASKXFsABIo0UwAEih8Azm6sAAWADwABTAYYFwABTA4hfAgACkxTAASKiwDOyowwAAMAAbZ0AwABtBT9JwAEixRzAASLnFsABItgUwAEiycAztNAOALHBwABRJycBAAGUAMAAbDI+AT0cwAEjBxTAASL9wDOyiAsANgEAASbAASMaARbAASMaFMABIwvAM7TQDgCFF8AAUSZgA4jnAMAAbEc+AT4CTsABI30AAAA8XQPAAGxKAWADh/gBFsABI30eAMAAbC8BAV0DwABsIAFgA4f4ARbAASN9FMABI27AM7TQDgCF8cAAUSgAPcAAbEtFAAABHMABI30UAMAztiAPAD4AAAAAwABsTQA+Ak4AAAABAGADh/gBFsABI4kUAMAztiAPAEDAAGxPPgJOwAEjYgAAAIUUYAOI5wEmwAEjSQEUwAEjYsAztocQAGADiOc9HMABI6UUwAEjm8AzsogLADYBAAEUwAEjqcAztqYRAADAAGxHScABI+MhHMABI/EUwAEj58AzsogLACcBAAErAMAAbGI+AT0cwAEkEhTAASQIwDOyiAsANgEAARTAASQWwDOzIg0AAMAAbEc/ScABJEUhHMABJFMUwAEkScAzsogLACcBAAErAMAAbGI+Az0cwAEkdhbAASRsFMABJGbAM5urAAFgA8AAUwGGBcAAUwON/wAAAADAAG2fPRzAASSXFsABJI0UwAEkh8Azm6sAAWADwABTAYYFwABTA4E0AQABFMABJJ7AM7KICwAAwABtBT0ewAEksoIyAgACFMABJL3AM7KICwAUwAEkyMAzm6sAAWADwABTAQA/PRzAAST0FsABJOcWwAEk3i65PMAAW/6vUsAAUKa9EAEAARTAASUHwDObqwABYAPAAFMBAMAASftJwAElFSEcwAElKRbAASUfFMABJRnAM5urAAFgA8AAUwGFisAAUwQnAQABKwDAAGxePgNOwAElVsABJWYAAMAARM5gA8AAUVYBHMABJXEWwAElaC65PMAAW/7AAECcBAADFsABJZQUwAEljsAzm6sAAWADwABTAYWKwABTBBzAASW+FsABJbQWwAElqy65PMAAW/6AkMAAULWFcwEAARbAASXbFsABJdMWwAElyi65PMAAW/6BFcAAUK+EPsAAQU8AjkkiFMABJfXAM5xbCQABFMABJgjAM5xtCgABwABAEirAAFDxPRfAASZLFMABJkXAM5urAAFgA8AAUwGFijXAASZnAAABAGADhRoBFsABJmcUwAEmV8AzuFAMAIV+wABRWTXAASZzAAABAFwBF8ABJnMUwAEmZ8AzuRsNAIQAFMABJnzAM5urAAFgA8AAUwGCWBTAASZnwDO5Gw0AwABTBD0cwAEm5BTAASbOwDOcQAgAgJwCAAIWwAEm6xTAASblwDObqwABYAPAAFMBhYrAAFMEFsABJwgUwAEm+MAzuFAMAI4wwABRWADAAGxjPz0cwAEnOhbAASctFsABJyQuuTzAAFv+r1LAAFCmvQ8CAAIrFsABJ1QUwAEnTsAzm6sAAWADwABTAYWKwABTBADAAEn6TsABJ6bAASerAACE+GADh5kBHMABJ60uwABFDQsACxbAASfMFMABJ8bAM5urAAFgA8AAUwGE+MAAUwYUwAEn3MAzm6sAAWADwABTAYLAASftwDObx4PAASgIwDOb14TAASglwDOb54XAASg+wDOb94bAAShVwDOcDofAAShywDOcJRTAASiRwDOcQAgAFMABKLPAM5xbCQAUwAEozsAznG0KAADAAFxWPRfAASjtFMABKOfAM5urAAFgA8AAUwGE+DXAASj0AAABAGADh5kBFMABKPTAM7oQDAA1wAEo+gAAAQBcARfAASj6FMABKPTAM7rRDQCEABTAASkDwDObqwABYAPAAFMBglgUwAEo9MAzutENAMAAUwY9HMABKSYWwAEpGRbAASkQLrk8wABb/q9SwABQpr0SAAAAAMAASf1FwAEpQAHAASlJwAEpTwAAgyhgA8AAbB8BkwEcwAEpWhTAASlUwDO7VQ0AgToBAAEWwAEpahbAASliFMABKVzAM5urAAFgA8AAUwGGBsAAUwWA4MAAbGoAwABshQEVwAEpcsAzu1UNHMABKXcUwAEpcsAzu1UNAIE/AQABlADAAGyIPgJOwAEpn8ABKawAAMAARPhgA8AAUVYBHMABKbcWwAEpri65PMAAW/7AAECcBAADHMABKeEWwAEp2hTAASnUwDObqwABYAPAAFMBhgbAAFMFKQEAARTAASniwDO7VQ0AAMAAbLhqwAEp/GADwABY/MABCOEiFMABKhfAM5xbCQABFMABKirAM5xtCgABwABAEinAAFDxPRzAASpzFsABKmwUwAEqZsAzm6sAAWADwABTAYYGwABTBYCcAgACFMABKnTAM7tVDQA1wAEqigAAAQBgA4UaARbAASqKFMABKn3AM7vUDgCFfsAAUVk1wAEqlgAAAQBcARfAASqWFMABKorAM7yaDwCEABTAASqfwDObqwABYAPAAFMBglgUwAEqisAzvJoPAADAAGzLPRzAASrKFsABKr0WwAEqtC65PMAAW/6vUsAAUKa9EQAAAADAAEn8SsABKtsBFMABKuLAM5urAAFgA8AAUwFJwAEq9CXAASr+AIDAASr4wDObq2ADwABTFz4NTsABKyQAAACBsGADwABcnABJwAErMhzAAStKFsABK0UWwAErPBTAASs2wDObqwABYAPAAFMXhRTAAFMZgYiI6ycBAAErAMAAbDY+AT0VwAErXcAzvVgLHMABK2YuwABE8gcABRTAASuBwDObqwABYAPAAFMXFsABK44UwAEriMAzm6sAAWADwABTF4UUwABTGRbAASuqFMABK6TAM5urAAFgA8AAUxeGCsAAUxoWwAEruhTAASu0wDObqwABYAPAAFMXsYLAAFMbFsABK9UUwAErz8Azm6sAAWADwABTF7GDwABTHAKGCxbAASwDFMABK/3AM5urAAFgA8AAUxeGC8AAUx+v8CEcwAEsJhbAASweFMABLBjAM5urAAFgA8AAUxevYcAAUx4nAQABKwDAAGxewABcQD4BPRXAASxHwDO9WAscwAEsUC7AAEToBQAEFMABLHrAM5urAAFgA8AAUxcWwAEshxTAASyBwDObqwABYAPAAFMXhRTAAFMZFsABLJcUwAEskcAz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UMI9F8ABOggUwAE6AsAzxuQAAWADwABS14V+NcABOhUAAAEAYAOFGgGHwAE6FcAzyK81wAE6IQAAAQBcARfAATohFMABOhXAM8mICACEABTAAToqwDPG5AABYAPAAFLXglgUwAE6FcAzyYgIAMAAUtk/ScABOkQlwAE6TgCAwAE6SMAzxuRgA8AAUuw+A07AATpuwAE6cwAAhYtgA4eZARzAATp1LsAARRwFAAUWwAE6iRTAATqDwDPG5AABYAPAAFLshYvAAFLvgcABOo/AM8bygsABOpjAM8cAg8ABOq3AM8cOhMABOsLAM8cpAMAAXFc9F8ABOucUwAE64cAzxuQAAWADwABS7IWLNcABOu4AAAEAYAOHmQGGwAE67sAzyfs1wAE69AAAAQBcARfAATr0h8ABOu7AM8p4hAAUwAE6/cAzxuQAAWADwABS7IJYh8ABOu7AM8p4wABS70nAATsKIRzAATseFsABOxQUwAE7DsAzxuQAAWADwABS7IWMwABS8CcBAAErAMAAbF4+Ak7AATs6wAE7RAAAhYxgA4eZARzAATtGLsAARRwFAAUWwAE7WhTAATtUwDPG5AABYAPAAFLshYzAAFLwgcABO2XAM8bygsABO27AM8cAg8ABO4XAM8cOhMABO5rAM8cpAMAAXFc9F8ABO8EUwAE7u8AzxuQAAWADwABS7IWMNcABO80AAAEAYAOHmQGHwAE7zcAzyv01wAE72AAAAQBcARfAATvYFMABO83AM8t6CACEABTAATvhwDPG5AABYAPAAFLsglgUwAE7zcAzy3oIAMAAUvA/ScABO/slwAE8BQCAwAE7/8AzxuRgA8AAUwE+A0nAATwdIRzAATwxFsABPCcUwAE8IcAzxuQAAWADwABTAYWKwABTBCcBAAErAMAAbF4+A07AATxNwAE8WwAAwABFCGADiVUBHMABPHOEwAE8XcAzxykpAQABFsABPHoUwAE8dMAzxuQAAWADwABTAYWKwABTBADAAGxhTsABPJnAATyjAACFimADhRoBHMABPK4WwAE8pS65PMAAW/7AAEAQAwADHMABPN8WwAE81RbAATzMLrk8wABb/oCQwABQtYVzAQABFsABPPwWwAE89BbAATzrLrk8wABb/oEVwABQr4Q+wABBTwCOSYbAAT0WwDPMIBbAAT03FMABPTHAM8bkAAFg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hMbAAFGZPgFBR8ACVoAWwAJWk4bAAlaIwDSJqsAAQIDAAFGfAwHAAlbFasACVsVgA4SShlgAPgI9FcACVtfANIo+CDXAAlbiAAABAGADhikBH8ACVuKGOgIAAibAAlcNARbAAlcNhsACVwLANImqhETAAFGRYAOESzXAAlcnAAABAGADheQBH8ACVyeF8AIAATHAAlc9YAOFGgGBwAJXT8A0iSkBg8sWwAJXfIbAAldxwDSJqsAAQIHAAFGgNcACV64AAAEAXAEXwAJXrhTAAlcnwDSLQgkAhAGAwAJXu8A0iRmCWRTAAlcnwDSLQgkAADXAAlfVAAABAFwBF8ACV9UUwAJW4sA0iwwJAIQBgMACV+LANIkZglkUwAJW4sA0iwwJAELAAlf4AAHAAlgaasACWBpgA4SShmcAPgI9FcACWCzANIo+CDXAAlg3AAABAGADhikBH8ACWDeGOgIAAibAAlhiARbAAlhihsACWFfANImqwABBL8AAUaFgA4RLNcACWIMAAAEAYAOF5AEfwAJYg4XwAgABMcACWJlgA4UaAYHAAlirwDSJKQGDyxbAAljYhsACWM3ANImqwABAgcAAUaA1wAJZCgAAAQBcARfAAlkKFMACWIPANIxJCQCEAYDAAlkXwDSJGYJZFMACWIPANIxJCQAANcACWTEAAAEAXAEXwAJZMRTAAlg3wDSMEQkAhAGAwAJZPsA0iRmCWRTAAlg3wDSMEQkASsACWVQBHMACWWQWwAJZWy65PMAAW/7AAEDnAwADh8ACWXfANIn7hMACWYHANIlTFMACWY7ANIo+CAAAwABRAAPAAlmwasACWbBgA4SShQnAAlnTasACWdNgA4SShkTAAln3asACWfdgA4SShnYAPgI9HsACWgu1PQQABCTAAloiAYbAAloXwDSJqifAAEVFKysAQsACWk8APgdJwAJacSIiFsACWoCGwAJadcA0iaqExMAAUZgAIRzAAlq3FsACWqcWwAJani65PMAAW/7AAEApwABQrCcBAAErAMAAbF4AHMACWtmCwAJazMA0iTcnAQABasACWuJgA4lyhbEAiVk+AT0cwAJbFBbAAlsEFsACWvsuuTzAAFv+wABAKcAAUKzAAEBkBAAEFsACWzEWwAJbKC65PMAAW/7AAEAkwABQqYDAAltUwDSJGSeAvh/AAluGwABkAQEA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hRoAwAJouAAAAIVLYAOJVQDAAmjRAAAAuRFgA4kfAMACaPgAAAC4DGADwABRjgDAAmkWAAAAgT5gA4UaAALAAmktAAAAhZ5gA4lVAWoAYAHAAGxcAsACaUMAAAC5CmADwABsWwFqAGABwABsXAJgA4UaAT4GQCEcwAJpZofAAmlcwDSVqScBAAErAMAAbF7AAmlcwAJpbQBAIofAAml7wDSVqQEhHMACaZKGwAJpiMA0lZInAQABKwCJWcACaXvAAmmZASfAAEVGTsACafAAAABFYAOFGgBJwAJp+xbAAmoLhMACaf/ANJVzwABAe8AAUZ4+AT0VwAJqHsA0lh4IHMACai8WwAJqJi65PMAAW/7AAED5BgAFgMACalPANJU5gcACal/ANJVJgsACamnANJVXg8ACanfANJVlhcACaoXANJWDAbkKh8ACaqHANJWpwABRC0nAAmq4FsACasiEwAJqvMA0lXOExsAAUZk+AUnAAmrjh8ACaufANJWpPgE9FcACavzANJYeCDXAAmsIAAABAGADhikBH8ACawiGOgIAAibAAmsyARbAAmsyhMACaybANJVzhETAAFGRYAOESzXAAmtKAAABAGADheQBH8ACa0qF8AIAATHAAmtgYAOFGgKBwAJrYcA0lUmFwAJra8A0lYMBg8sWwAJrloTAAmuKwDSVc8AAQIHAAFGgNcACa8YAAAEAXAEXwAJrxhTAAmtKwDSXFQkAhAGAwAJr08A0lTmCWRTAAmtKwDSXFQkAADXAAmvrAAABAFwBF8ACa+sUwAJrCMA0lt8JAIQBgMACa/jANJU5glkUwAJrCMA0lt8JAD4DTsACbC/AAmw9AACy92ADiOcBHsACbD/AAENFAgAChcACbE7ANJWDhsACbFXANJWSAE7AAmx9wAJskAAAwABE3WADiOcBHsACbJLAAENFAgACNcACbLIAAAEAYAOGKQEfwAJssoY6AgACJsACbOABFsACbOCEwAJs1MA0lXOERMAAUZFgA4RLNcACbPwAAAEAYAOF5AEfwAJs/IXwAgABMcACbSdgA4UaAoHAAm0owDSVSR7AAm0ywABDRwEAARTAAm1EwDSXywkAAAGDyxbAAm18hMACbXDANJVzwABAgcAAUaA1wAJtsAAAAQBcARfAAm2wFMACbPzANJhSCgCEAYDAAm29wDSVOYJZFMAC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wAKS2oDAApLVwDSqGYfdwABFsxTAApLnwDSskgkAFMACkv7ANKy8CgAWwAKTGIDAApMTwDSqGbkRwABFrxTAApMmwDSvihMAFMACkzPANLCnFgABuQopwABcEU7AApNswAKTdwAAjjhgA4lVASMWwAKTfoDAApN5wDSqGbkkwABFthTAApOOwDStuQ0AFMACk5nANK9gEgABYAOJVU7AApO1AAAAgTBgA4UaAEnAApPBFsACk8qAwAKTxcA0qhm5CsAARbU+A0AcwAKT8RTAApPkwDSt4w4AJwEAASsAwABsXsACk+TAApP4AEAcwAKUFhTAApQIwDSwmBUAJwEAASsAwABsXsAClAjAApQdAD0VwAKVQcA0shIZFMAClUrANLFSFwBJwAKVXBbAApVlgMAClWDANKoZuSTAAEW2PgRAIRzAApdwFMACl2PANK3jDgAnAQABKwDAAGxewAKXY8ACl3cAQBzAApeVFMACl4fANLCYFQAnAQABKwDAAGxewAKXh8ACl5wATsACl7rAApfIAADAAETkYAOI5wEewAKX1MAAQ0UCAAIUwAKX48A0sVIXAGrAApfwYAOJgI17AD0VwAKYA8A0shIZHsACmAzAAENEAgACFMACmBbANK3jDgAewAKYLsAAQ0QCAAIUwAKYOMA0sv4aAB7AAphHwABDRwEAARTAAphZwDSt4w4AAAAAPgRAHMACmq4UwAKaocA0reMOACcBAAErAMAAbF7AApqhwAKatQBAIRzAAprTFMACmsXANLCYFQAnAQABKwDAAGxewAKaxcACmtoATsACmvjAApsGAADAAETkYAOI5wEewAKbEsAAQ0UCAAIUwAKbIcA0sVIXAGrAApsuYAOJgI17AD0VwAKbQcA0shIZHsACm0rAAENEAgACFMACm1TANLCYFQAewAKbbcAAQ0QCAAIUwAKbd8A0s9MaAB7AApuGwABDRwEAARTAApuYwDSwmBUAAAAASsACm7UBHMACm8UWwAKbvC65PMAAW/7AAEChAwADFMACm/fANLHQGAAUwAKcA8A0shIZABzAApwbhcACnAvANKsDrsoBAAGHwAKcI8A0rCwAwABLxgDAAFDwBsAAXHKBL8ACnDzAApxWwAKwXgAAuSgAAAABA8ACnHDAArBeAAAAAgICwAKcjgAAAIQNYAPAAEXQAMACnJ0AAAC4z2ADiVUAAGADwABRVgE+Hk7AApzDwAKczgAAr/FgA8AAUY4BIyEcwAKc3BbAApzVgMACnNDANLTgllXAAEXSJwEAASsAwABsXh7AApzywABRlQEAARbAAp0agMACnRXANLTgllXAAEXSAGrAAp0yYAPAAFGOwAEXrQFgA8AAUY5OwAKdXsACnWcAAMAAROBgA4lVARzAAp1yFsACnWkuuTzAAFv+wABAiQIAAoLAAp2AwDS1CRbAAp2VFsACnYwuuTzAAFv+hV/AAFCuAMAAUOJOwAKdrcACnbsAAMAARTlgA4lVARzAAp3OFsACncUuuTzAAFv+wABAiwIAAoLAAp3ewDS1CRbAAp3zFsACneouuTzAAFv+hV/AAFCuAMAAUOROwAKeHcACnikAAMAARTRgA8AAUVYBHMACnj0WwAKeKy65PMAAW/7AAECcBAADFsACnlKAwAKeTcA0tOCDKMAARdSEwAKeWcA0tcopAcAAQBIpwABQ8U7AAp6cwAKeqgAAwABFN2ADiOcBHsACnqzAAENGAQABhcACnsTANLYbAE7AAp7iwAKe7AAAwABFO2ADhRoBHsACnu7AAENHAQABhsACnwDANLZxAD2PwAKfFMA0tpscwAKfKRbAAp8gLrk8wABb/sAAQBADAAOEwAKfQ8A0tcoWwAKfXoXAAp9SwDS2G44wwABRWIfAAp9swDS2mwDAAFDCTsACn4gAAACKYGADhRoAScACn5IWwAKfoYLAAp+WwDS1CcAAQHvAAFGePgE9FcACn7TANLcSCBzAAp/EFsACn7suuTzAAFv+wABA9AIAAhbAAp/kgMACn9/ANLTgrXzAAEXXh8ACn/DANLabAMAAUQc+A0AWwAKgIYLAAqAWwDS1CYTEwABRmMACoBbAAqAxAD01wAKgQwAAAQBgA8AAY/EBFsACoEMWwAKgOi65PMAAW/7AAEApwABQrCMcwAKgQxTAAqBDwDS3pAkAJwEAASsAwABsXiscwAKgVBTAAqBDwDS3pAkAwABAZAQABBbAAqBvFsACoGYuuTzAAFv+wABAJMAAUKkWwAKglYDAAqCQwDS04K18wABF1yeAvh/AAqDDwABkAQEAARbAAqDmgMACoOHANLTgllXAAEXSAADAAGPzAVw9FcACoPbANLcSCDXAAqEBAAABAGADhhcBH8ACoQGGJwMAAxrAAqEiwABP5DXAAqE+AAABAGADheQBH8ACoT6F8AEAATHAAqFUYAOFGgGHwAKhYsA0tpsANcACoYgAAAEAXAEXwAKhiBTAAqE+wDS4hAkAhAEWwAKhmoDAAqGVwDS04K18wABF14JZFMACoT7ANLiECQAmwAKhuwEWwAKhu4LAAqGwwDS1CYREwABRkWADhEsANcACoc0AAAEAXAEXwAKhzRTAAqEBwDS4YwkAhAEWwAKh34DAAqHawDS04K18wABF14JZFMACoQHANLhjCQBOwAKiCgAAAMAARUdgA4jnAE7AAqInAAAAhYVgA4UaAEnAAqIxFsACojqAwAKiNcA0tOC5CsAARdo+AT0VwAKiTcA0uVwKFMAColTANLcSCABJwAKiZRbAAqJugMAComnANLTguSTAAEXbPgI9FcACooXANLlLCR7AAqKUwABDRQIAAhTAAqKjwDS3EggAg8ACoqnANLV5AD0VwAKiusA0uVwKHsACosHAAENHAQABFMACotPANLlLCQAAPgE9FcACovXANLlcChTAAqL8wDS3EggATsACoyfAAqM0AADAAEThYAPAAFFWARzAAqM2LsAAROLAAFv7BQAFFsACo12AwAKjWMA0tOC5FMAARdkUwAKja8A0uVwKAIPAAqNxwDS1eRbAAqOAgMACo3vANLTguRLAAEXVFsACo5GAwAKjjMA0tOCNMcAARdYAwABcDE7AAqOmwAKjrQAAwABBuWADhRoBFsACo7wUwAKjr8A0uh4LAIV+wABRWU7AAqPVwAKj4AAAwABE42ADiVUBFsACo+8UwAKj4sA0uh4LAI4wwABRWE7AAqQVwAKkIQAAuAxgA8AAUY4BIyEcwAKkLxbAAqQogMACpCPANLTggubAAEXTJwEAASsAwABsXh7AAqRFwABRlQEAARbAAqRtgMACpGjANLTggubAAEXTAGrAAqSFYAPAAFGOwAEXrQFgA8AAUY5OwAKkscACpMAAAMAARTpgA4lVARzAAqTTFsACpMouuTzAAFv+wABAiwIAAhTAAqTjwDS67g4AFsACpPkWwAKk8C65PMAAW/6FX8AAUK4AwABQ5E7AAqUTwAKlHgAAjpNgA4UaAR7AAqUgwABDRwEAAYbAAqUywDS2cQA9FcACpUbANLuxEBzAAqVcFsACpVMuuTzAAFv+wABAEAMAAxTAAqV2wDS7Xg8AFsACpZKFwAKlhsA0thuOMMAAUVgUwAKloMA0u7EQAADAAFDCTsACpbvAAqXFAACFnmADiVUBHMACpdgWwAKlzy65PMAAW/7AAECMAgACFMACpe3ANLruDgAWwAKmAxbAAqX6Lrk8wABb/oVfwABQrgDAAFDlTsACph3AAqYvAADAAEVKYAOFGgEcwAKmOhbAAqYxLrk8wABb/sAAQBAEAAMUwAKmVMA0vCsRABTAAqZfwDS6xA0AFMACpmvANLqaDAABhAEWwAKmjIDAAqaHwDS04IQBglnAAFDCScACpp0hHMACprMUwAKmocA0vHwSACcBAAErAMAAbF4+AT0VwAKmxMA0upoMFMACps3ANLx8EgA/TsACpv8AAACy92ADiOcATsACpx0AAADAAEVIYAOFGgBJwAKnMiIWwAKnO4DAAqc2wDS04LkKwABF2gEWwAKnTYDAAqdIwDS04LkkwABF2z4BPRXAAqdkwDS9KhQUwAKndsA0upoMAD4CPRXAAqeRwDS9GxMewAKnocAAQ0UCAAIUwAKnsMA0upoMABTAAqe4wDS6xA0AAD0VwAKny8A0vSoUHsACp93AAENHAQABFMACp+/ANL0bEwAATsACqBUAAABFYAOFGgBJwAKoIRbAAqgxFMACqCXANLruDgDAAEB7wABRnj4BPRXAAqhEwDS91RUcwAKoVRbAAqhMLrk8wABb/sAAQPYDAAMWwAKogIDAAqh7wDS04IfdwABF2BTAAqiNwDS7sRAAFMACqJnANL0qFAAAwABRCD4DQBbAAqjRFMACqMXANLruDgCExMAAUZjAAqjFwAKo4QA9NcACqPMAAAEAYAPAAGPxARbAAqjzFsACqOouuTzAAFv+wABAKcAAUKwjHMACqPMUwAKo88A0vncWACcBAAErAMAAbF4rHMACqQQUwAKo88A0vncWAMAAQGQEAAQWwAKpHxbAAqkWLrk8wABb/sAAQCTAAFCpFsACqUWAwAKpQMA0tOCH3cAARdgngL4fwAKpdMAAZAEBAAEWwAKpl4DAAqmSwDS04ILmwABF0wAAwABj8wFcPRXAAqmnwDS91RU1wAKpswAAAQBgA4YXAR/AAqmzhicDAAMawAKp1MAAT+U1wAKp8AAAAQBgA4XkAR/AAqnwhfABAAExwAKqBmADhRoCFMACqgfANLuxEAAUwAKqE8A0vSoUAAA1wAKqMwAAAQBcARfAAqozFMACqfDANL9XFgCEARbAAqpFgMACqkDANLTgh93AAEXYglkUwAKp8MA0v1cWACbAAqpoARbAAqpoFMACqlzANLruDgCERMAAUZFgA4RLADXAAqp6AAABAFwBF8ACqnoUwAKps8A0vzYWAIQBFsACqoyAwAKqh8A0tOCH3cAARdiCWRTAAqmzwDS/NhYATsACqq8AAACEBWADhRoAScACqsAWwAKqyYDAAqrEwDS04LkKwABF2j4DQBzAAqrwFMACquPANLlLCQAnAQABKwDAAGxewAKq48ACqvcAQBzAAqsVFMACqwfANL0bEwAnAQABKwDAAGxewAKrB8ACqxwAPRXAAquWwDTALRYewAKrpMAAQ0QCAAKGwAKrrsA0tnEUwAKrvcA0vdUVAABJwAKr0BbAAqvZgMACq9TANLTguSTAAEXbPgRAIRzAAqyhFMACrJTANLlLCQAnAQABKwDAAGxewAKslMACrKgAQBzAAqzGFMACrLjANL0bEwAnAQABKwDAAGxewAKsuMACrM0ATsACrOvAAqz5AADAAETkYAOI5wEewAKtBcAAQ0UCAAIUwAKtFMA0vdUVAGrAAq0hYAOJgI17AD0VwAKtNMA0wC0WHsACrULAAENEAgAChsACrVfANLZxHsACrXDAAENEAgACFMACrXrANLlLCQAewAKtlsAAQ0QCAAIUwAKtoMA0wS8XAB7AAq2vwABDRwEAARTAAq3BwDS5SwkAAAAAAD4EQBzAAq61FMACrqjANLlLCQAnAQABKwDAAGxewAKuqMACrrwAQCEcwAKu2hTAAq7MwDS9GxMAJwEAASsAwABsXsACrszAAq7hAE7AAq7/wAKvDQAAwABE5GADiOcBHsACrxnAAENFAgACFMACryjANL3VFQBqwAKvNWADiYCNewA9FcACr0jANMAtFh7AAq9WwABDRAIAAobAAq9rwDS2cR7AAq+EwABDRAIAAhTAAq+OwDS9GxMAHsACr6vAAENEAgACFMACr7XANMIaFwAewAKvxMAAQ0cBAAEUwAKv1sA0vRsTAAAAAABKwAKv9AEfwAKv/8AAUWECAAIjFsACsCeAwAKwIsA0tOC5JMAARduDwAKwN8A0tXkUwAKwQsA0usQNAAFgA4lVFMACsE7ANMAtFgAABsAAXHOBL8ACsGPAArB9wALHDgAAuSkAAAABA8ACsJvAAscOAAAAAgICwAKwvQAAAIQNYAPAAEXkAMACsMwAAAC4z2ADiVUAAGADwABRVgE+Jk7AArD5wAKxCAAAwABE2mADwABRVgEcwAKxExbAArEKLrk8wABb/sAAQJwEAAMWwAKxMYDAArEswDTDL4VJwABF6GrAArFBYAPAAFj8wAEI4SkBwABAEirAAFDxTsACsYnAArGgAAC41F0DwABsGQFgA4lVARzAArGzFsACsaouuTzAAFv+wABAVwMAAxbAArHVgMACsdDANMMvhEfAAEXmFsACsfGAwAKx7MA0wy+5EMAARecWwAKyF4LAArIIwDTDWI4wwABRWADAAFDYTsACsj7AArJJAACv8WADwABRjgEjIRzAArJXFsACslCAwAKyS8A0wy+WVcAAReknAQABKwDAAGxeH8ACsm3AAFG0BAAEFsACspWAwAKykMA0wy+WVcAARekrasACsrFgA4SShnaDwAKyu8A0w7QAasACsuNgA8AAUY7AARetAWADwABRjk7AArMPwAKzHAAAhUtgA4lVARzAArMnFsACsx4uuTzAAFv+wABAiAIAAhbAArNOgMACs0nANMMvhEfAAEXmg8ACs1nANMO0AMAAUOFOwAKzgsACs4sAAIVJYAOFGgEcwAKznhbAArOVLrk8wABb/sAAQBkCAAKFwAKztcA0xKuCwAKzw8A0w1gAwABQwU7AArPtAAAAwABB22ADiOcATsACtA4AAADAAETeYAOFGgBOwAK0KwAAAMAARN9gA4UaAEnAArQ+IhbAArRHgMACtELANMMvuRPAAEXzAB7AArRbwABs9wIAAobAArRlwDTE9xbAArR0gMACtG/ANMMvhUnAAEXoAD4CPRXAArSHwDTFSQiGwAK0lsA0xPc9FcACtKbANMVaCRzAArS2LsAARMfAAFv7AQABhsACtL3ANMT3AMAAXAY+Az2PwAK028A0xTgewAK07sAAQ0UCAAKGwAK0/cA0xPeFwAK1B8A0xKsAPRXAArUcwDTFSQgewAK1K8AAQ0cBAAGHwAK1PcA0xTgAPRXAArVWwDTFWgkewAK1ZsAAQ0cBAAGHwAK1eMA0xTgATsACtZ/AArWtAADAAEU5YAOJVQEcwAK1uBbAArWvLrk8wABb/sAAQIsCAAKEwAK1yMA0xCaFwAK11MA0xKsAwABQ5E7AArYCwAK2DgAAwABFNGADwABRVgEcwAK2IhbAArYQLrk8wABb/sAAQJwEAAMWwAK2N4DAArYywDTDL4MowABF6xTAArY+wDTGXQoAKQHAAEASKcAAUPFOwAK2gcACto8AAMAARTdgA4jnAR7AAraRwABDRgEAARTAArapwDTGoAsAAE7AArbHwAK20QAAwABFO2ADhRoBHsACttPAAENHAQABFMACtuXANMb4DAAAPRXAArb5wDTHJA0cwAK3DhbAArcFLrk8wABb/sAAQBADAAMUwAK3KMA0xl0KABbAArdDFMACtzfANMagCwCOMMAAUVgUwAK3UcA0xyQNAADAAFDCTsACt3zAAreHAADAAEUrYAPAAFFWARzAAreJLsAARTXAAFv7BgAGFsACt6iAwAK3o8A0wy+tfMAARe4UwAK3vMA0xUkIAIXAArfSwDTEq4TAArfowDTEJhTAArf8wDTHJA0AasACuC1gA8AAUILAARWZAMAAXA5OwAK4Q8ACuEgAAIpgYAOFGgEWwAK4VRTAArhKwDTHpA4AhX7AAFFZTsACuG7AArh3AADAAETgYAOJVQEWwAK4hBTAArh5wDTHpA4AjjDAAFFYTsACuKsAAADAAEVHYAOI5wBOwAK4yAAAAIWFYAOFGgBJwAK40hbAArjbgMACuNbANMMvuQrAAEXxPgE9FcACuO7ANMh+EhTAArj1wDTIGw8AScACuQYWwAK5D4DAArkKwDTDL7kkwABF8j4CPRXAArkmwDTIbREewAK5NcAAQ0UCAAIUwAK5RMA0yBsPABTAArlKwDTIQxAAAD0VwAK5W8A0yH4SHsACuWLAAENHAQABFMACuXTANMhtEQAAPgE9FcACuZbANMh+EhTAArmdwDTIGw8ATsACucjAArnVAADAAEThYAPAAFFWARzAArnXLsAAROLAAFv7BQAFFsACuf6AwAK5+cA0wy+5FMAARfAUwAK6DMA0yH4SABTAAroSwDTIQxAAFsACuiGAwAK6HMA0wy+5EsAARewWwAK6MoDAArotwDTDL40xwABF7QDAAFwMTsACukfAArpOAADAAEG5YAOFGgEWwAK6XRTAArpQwDTJQhMAhX7AAFFZTsACunbAArqBAADAAETjYAOJVQEWwAK6kBTAArqDwDTJQhMAjjDAAFFYTsACurbAArrCAAC4DGADwABRjgEjIRzAArrQFsACusmAwAK6xMA0wy+C5sAAReonAQABKwDAAGxeH8ACuubAAFG0BAAEFsACuw6AwAK7CcA0wy+C5sAAReorasACuypgA4SShnaDwAK7NMA0w7QAasACu1xgA8AAUY7AARetAWADwABRjk7AAruIwAK7lwAAwABFOmADiVUBHMACu6oWwAK7oS65PMAAW/7AAECMAgACFMACu7/ANMoUFgCFwAK7zMA0xKsAwABQ5U7AArvqwAK79QAAjpNgA4UaAR7AArv3wABDRwEAARTAArwJwDTG+AwAAD0VwAK8HcA0yt4YHMACvDMWwAK8Ki65PMAAW/7AAEAQAwADFMACvE3ANMqZFwAWwAK8aRTAArxdwDTGoAsAjjDAAFFYFMACvHfANMreGAAAwABQwk7AArySwAK8nAAAhZ5gA4lVARzAAryvFsACvKYuuTzAAFv+wABAjAIAAhTAArzEwDTKFBYAFsACvNoWwAK80S65PMAAW/6FX8AAUK4AwABQ5T0VwAK86cA0ycAUHMACvPsWwAK88i65PMAAW/7AAEAQBAADFMACvQzANMtcGQAUwAK9F8A0yeoVABTAAr0jwDTJwBQAAYQBFsACvUSAwAK9P8A0wy+EAYJZwABQwk7AAr1qAAAAsvdgA4jnAE7AAr2IAAAAwABFSGADhRoAScACvZ0iFsACvaaAwAK9ocA0wy+5CsAARfEBFsACvbiAwAK9s8A0wy+5JMAARfI+AT0VwAK9z8A0zBkbFMACveHANMnAFAA+Aj0VwAK9/MA0zAoaHsACvgzAAENFAgACFMACvhvANMnAFAAUwAK+I8A0yeoVAAA9FcACvjbANMwZGx7AAr5IwABDRwEAARTAAr5awDTMChoAAE7AAr6AwAK+hgAARWADhRoBHMACvoguwABFOMAAW/sGAAYWwAK+noDAAr6ZwDTDL4fdwABF7xTAAr6rwDTFWgkAhcACvsLANMSrFMACvtDANMoUFgAUwAK+3cA0yt4YABTAAr7pwDTMGRsAAMAAXA9OwAK/CwAAAIQFYAOFGgBJwAK/HBbAAr8lgMACvyDANMMvuQrAAEXxPgNAHMACv0wUwAK/P8A0yG0RACcBAAErAMAAbF7AAr8/wAK/UwBAHMACv3EUwAK/Y8A0zAoaACcBAAErAMAAbF7AAr9jwAK/eAA9FcACwF7ANM00HR7AAsBswABDRAIAAhTAAsB2wDTG+AwAFMACwIXANMzEHAAAScACwJgWwALAoYDAAsCcwDTDL7kkwABF8j4EQCEcwALCHxTAAsISwDTIbREAJwEAASsAwABsXsACwhLAAsImAEAcwALCRBTAAsI2wDTMChoAJwEAASsAwABsXsACwjbAAsJLAE7AAsJpwALCdwAAwABE5GADiOcBHsACwoPAAENFAgACFMACwpLANMzEHABqwALCn2ADiYCNewA9FcACwrLANM00HR7AAsLAwABDRAIAAhTAAsLVwDTG+AwAHsACwu7AAENEAgACFMACwvjANMhtEQAewALDFMAAQ0QCAAIUwALDHsA0zjgeAB7AAsMtwABDRwEAARTAAsM/wDTIbREAAAAAAD4EQBzAAsTRFMACxMTANMhtEQAnAQABKwDAAGxewALExMACxNgAQCEcwALE9hTAAsTowDTMChoAJwEAASsAwABsXsACxOjAAsT9AE7AAsUbwALFKQAAwABE5GADiOcBHsACxTXAAENFAgACFMACxUTANMzEHABqwALFUWADiYCNewA9FcACxWTANM00HR7AAsVywABDRAIAAhTAAsWHwDTG+AwAHsACxaDAAENEAgACFMACxarANMwKGgAewALFx8AAQ0QCAAIUwALF0cA0zyUeAB7AAsXgwABDRwEAARTAAsXywDTMChoAAAAAAEnAAsYQIRzAAsYlh8ACxhTANMU4JwEAASsAwABsXj4BPRXAAsY2wDTNNB0fwALGSIfVAgACh8ACxkzANMU4FMACxl7ANM00HQAAPz0XwALGghTAAsZ2wDTNNB0AhAEWwALGlIDAAsaPwDTDL4QBglmCWUrAAsakAR/AAsavwABRYQIAAiMWwALG14DAAsbSwDTDL7kkwABF8hTAAsbnwDTIQxAAFMACxvLANMnqFQABYAOJVRTAAsb+wDTNNB0AAAbAAFx0gS/AAscTwALHOcACx/cAAIXGAWrAAscUYAPAAGxWgLUAAAEDwALHScACx/cAAAACAgLAAsddAAAAhA1gA4c1AMACx2wAACC4z2ADiVUAAGADwABRVgE+Aj0cwALHlRbAAseIFsACx38uuTzAAFv+r1LAAFCmvS0BAAGAwALHocA00L0AwABKE0rAAsesAR/AAse3wABRYQIAAhbAAsfkFsACx9oWwALH0S65PMAAW/6AkMAAULWDV44JgMACx+7ANNC9AAbAAFx1gS/AAsf8wALIIsACyqcAAIXkAWrAAsf9YAPAAGxWgLUAAAEDwALIKsACyqcAAAACAgLAAsgvAAAAhA1gA4fKAMACyD4AACC4z2ADiVUAAGADwABRVgE+B07AAshawALIZwAAvaNgA4lVARbAAsh3FsACyG6AwALIacA00YaFFIfMgZeI7U7AAsibwALIrQAAnNBgA8AAUVYBHMACyLgWwALIry65PMAAW/7AAECcBAADFsACyN8WwALI1oDAAsjRwDTRhoUUh8yEy4jvgsACyOzANNGtKQHAAEASKcAAUPE9F8ACyTAWwALJJ4DAAskiwDTRhoUUh8yEyzXAAslQAAABAGADhRoBFsACyVCDwALJPsA00dqFfsAAUVk1wALJYwAAAQBcARfAAsljhMACyVDANNJPhAAWwALJcYDAAslswDTRhoUUh8yCWITAAslQwDTST4jvTsACyZnAAsmkAADAAEDLYAPAAFFWARzAAsm4FsACyaYuuTzAAFv+wABAnAQAAxbAAsnNgMACycjANNGGhPiHzYHAAsnTwDTRlCkBwABAEinAAFDxPRfAAsoFgMACygDANNGGhPg1wALKFwAAAQBgA4UaARbAAsoXhMACygzANNKrhX7AAFFZNcACyiMAAAEAXAEXwALKI4XAAsoXwDTTEIQAgMACyizANNGGgliFwALKF8A00xCHzU7AAso/wALKTAAAjjBgA4lVARbAAspZhMACyk7ANNKrjjDAAFFYSsACymsBH8ACynbAAFFhAgAChcACypDANNNjgMACyp7ANNGGAAbAAFx2gS/AAsqswALK0sAC0nEAAIVSAWrAAsqtYAPAAGxWgLUAAAEDwALK4sAC0nEAAAACAgLAAssEAAAIhA1gA8AARhkAwALLEwAAILjPYAOJVQAAYAPAAFFWAT4NTsACy0DAAstPAADAAETaYAPAAFFWARzAAstaFsACy1EuuTzAAFv+wABAnAQAAxbAAst4gMACy3PANNPkhUmFWWrAAsuIYAPAAFj8wAEI4SkBwABAEirAAFDxTsACy8kAAACFS2ADiVUATsACy+YAAACFSWADhRoATsACzAkAAADAAECeXQPAAEu5AWADwABRYgBJwALMHhbAAswrFsACzCIuuTzAAFv+g1bAAFC2PgM9jcACzEvANNSFFsACzGyCwALMXcA01A3AAECewABRWz2MwALMg8A01HYWwALMnYLAAsyOwDTUDcAAQJ/AAFFcPYvAAsy0wDTUZxbAAszSgsACzMPANNQNwABBG8AAUV0+Aj2MwALM+sA01HYWwALNFILAAs0FwDTUDYV+wABRWT2LwALNJsA01GcWwALNRILAAs01wDTUDY4wwABRWE7AAs1vwALNdgAAgL5gA8AAUY4BHMACzYEWwALNeC65PMAAW/7AAEBaBgADg8ACzZ7ANNRnFsACzbGAwALNrMA00+SBiIVaFsACzbyAwALNt8A00+SEAYJZA4LmKcAAQFspwABAXCnAAFDaScACzhYWwALOIYbAAs4awDTVW4TEwABRmD4CScACzjsiIRzAAs5YFsACzkgWwALOPy65PMAAW/7AAEApwABQrCcBAAErAMAAbF4AHMACznqDwALObcA01GcnAQABasACzoNgA4lyhbEAiVk+AT0cwALOtRbAAs6lFsACzpwuuTzAAFv+wABAKcAAUKzAAEBkBAAEFsACztIWwALOyS65PMAAW/7AAEAkwABQqRbAAs76gMACzvXANNPkhAGCWSeAvh/AAs8swABkAQEAARbAAs9RhsACz0rANNVbhETAAFGRAADAAGPzPz0XwALPboDAAs9pwDTT5IMbFsACz4eGwALPgMA01VuERMAAUZGFYD9OwALPosACz68AAMAARUtgA4lVARzAAs+6FsACz7EuuTzAAFv+wABAkQIAAobAAs/IwDTVW4PAAs/QwDTUZwDAAFDpTsACz/3AAtAHAADAAET7YAPAAFFWARzAAtASFsAC0AkuuTzAAFv+wABAnAQAAxbAAtAwgMAC0CvANNPkgT6FWzXAAtA3AAABAGADiVUBh8AC0DfANNbWIxzAAtA3FMAC0DfANNdZCAAnAQABKwCJWWrAAtBNYAPAAFj8wAEI4RTAAtA3wDTXWQgAAWADiVUpAcAAQBIpwABQ8U7AAtCNwALQlQAAwABFTGADiVUBFsAC0KEUwALQl8A01xkIAI4wwABRWE7AAtC+wALQwgAAjTFgA4UaARzAAtDNFsAC0MQuuTzAAFv+wABAGQQAAofAAtDkwDTW1hTAAtDywDTXGQgAAoQBFsAC0RaAwALREcA00+SEAYJZwABAEiXAAtE+AIfAAtExwDTW1mADiYDAAFDBTsAC0VzAAtFoAACEBWADhRoBHMAC0WouwABFLsAAW/sIAAYWwALRjIDAAtGHwDTT5IQBglmEwALRmMA01HaDwALRosA01GcWwALRtYDAAtGwwDTT5IGIhVqGwALRu8A01VsUwALRw8A0190KAAKFnhTAAtHbwDTXswkAuQoWwALR9IDAAtHvwDTT5LkKwABGG8AAXBFKwALSBQEcwALSFRbAAtIMLrk8wABb/sAAQKEDAAMUwALSR8A017MJABTAAtJQwDTYSwsAhcAC0l3ANNSFAMAAUPAGwABcd4EvwALSdsAC0pDAAuRcAAC5JwAAAAEDwALSp8AC5FwAAAACAgLAAtLCAAAAhA1gA8AARb8AwALS0QAAALjPYAOJVQAAYAPAAFFWAT4dTsAC0v7AAtMNAADAAETaYAPAAFFWARzAAtMYFsAC0w8uuTzAAFv+wABAnAQAAxbAAtM2gMAC0zHANNlLhUnAAEXBasAC00ZgA8AAWPzAAQjhKQHAAEASKsAAUPE9HMAC034uwABE0wMAAxbAAtPCgsAC07PANNl0jjDAAFFYJ6+3FsAC0+QWwALT24DAAtPWwDTZS4VJwABFwYQBglkAwABcmU7AAtQLAAAAwABAnl0DwABLuQFgA8AAUWIATsAC1CsAAACFSWADhRoATsAC1EIAAACFS2ADiVUAScAC1FQWwALUYRbAAtRYLrk8wABb/oNWwABQtj4DPYvAAtSBwDTaFxbAAtSigsAC1JPANNl0wABAnsAAUVs9jMAC1LnANNoxFsAC1NOCwALUxMA02XTAAECfwABRXD2NwALU6sA02kAWwALVCILAAtT5wDTZdMAAQRvAAFFdPgM9i8AC1TDANNoXasAC1UhdA8AAS7kBYAPAAFFiwAEYDj2MwALVZsA02jEWwALVgILAAtVxwDTZdIV+wABRWT2NwALVksA02kAWwALVsILAAtWhwDTZdI4wwABRWE7AAtXdwALV7gAAwABB22ADiOcBHsAC1fjAAENFAgAChMAC1gfANNoxhcAC1hHANNpAAE7AAtYzwALWQgAAwABBJ2ADwABRYgEcwALWVRbAAtZMLrk8wABb/sAAQKABAAGGwALWasA02ysAwABQ707AAtaMwALWmQAAwABE3mADhRoBHsAC1pvAAENHAQABhsAC1q3ANNsrAE7AAtbPwALW3QAAwABE32ADhRoBHsAC1t/AAENHAQABhsAC1vHANNsrAE7AAtcRwALXJQAAwABFSWADiVUBHMAC1zAWwALXJy65PMAAW/7AAEAtAQABhcAC10PANNpAAMAAULtOwALXccAC13wAAMAARStgA8AAUVYBHMAC134uwABFLcAAW/sGAAUWwALXl4DAAteSwDTZS618wABFxBTAAterwDTbmggAFMAC17nANNvuCgAWwALX04DAAtfOwDTZS4GIwABFwoHAAtfZwDTZWwHAAEDsJcAC2AwAFsAC2AOAwALX/sA02UuFScAARcFgA4dUwABcEE7AAtgvwALYNAAAimBgA4UaARbAAthBFMAC2DbANNwoCwCFfsAAUVlOwALYWsAC2GMAAMAAROBgA4lVARbAAthwFMAC2GXANNwoCwCOMMAAUVg9HMAC2JgWwALYixbAAtiCLrk8wABb/q9SwABQpr0dAQABFMAC2LTANNy9DAAAwABKBk7AAtjHwALY2AAAwABFTWADg6wBFsAC2TAcwALY7BbAAtjaLrk8wABb/sAAQFoDAAMUwALZAMA03OUNABrAAtkKwABP4BbAAtkbgMAC2RbANNlLuSDAAEXGAMAAUNqERMAAUZFOwALZUQAAAMAARTBgA4jnAEnAAtljIRbAAtltgMAC2WjANNlLuQrAAEXHPgI9FcAC2YDANN2lDx7AAtmPwABDRQIAAhTAAtmewDTcvQwAFMAC2aTANNzlDQAAPRXAAtm1wDTcvQwewALZvMAAQ0cBAAEUwALZzsA03aUPAAA/TsAC2fvAAtoHAAC4DGADwABRjgEcwALaEhbAAtoJLrk8wABb/sAAQFoFAAMUwALaL8A02+4KABbAAtpJgMAC2kTANNlLgYjAAEXCFsAC2lSAwALaT8A02UuH3cAARcUCguYpwABAXCnAAFDaTsAC2qXAAtqvAACFnmADiVUBHMAC2sIWwALauS65PMAAW/7AAECRAgACFMAC2tDANN4kEAAUwALa3cA02+4KAADAAFDpTsAC2xLAAtseAADAAETbYAPAAFFWARzAAtsyFsAC2yAuuTzAAFv+wABAnAQAAxbAAttHgMAC20LANNlLgT7AAEXDFMAC207ANN6QEQApAcAAQBIp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glmEwALnNsA05MeFwALnQMA05NYWwALnU4DAAudOwDTkM4GIhUiBwALnWcA05EEBwABA7CXAAueMABbAAueDgMAC537ANOQzhUmFR2ADh1TAAFwQSsAC56QBHMAC57QWwALnqy65PMAAW/7AAEChAwADFsAC5/GGwALn5sA05fqOMMAAUVgWwALoCobAAuf/wDTl+oV+wABRWYPAAugWwDTkrQDAAFDwBsAAXHmBL8AC6C/AAuhAwALsUwAAhRIBasAC6DBgA8AAbFaAtQAAAQPAAuhbwALsUwAAAAEBAcAC6HMAAACEDWADhM0AAFwBPgc9HMAC6IgWwALofy65PMAAW/7AAEAmAQABFsAC6KyAwALop8A05w+AvoTSAMAAUL1OwALozcAC6OEAAIr0XQPAAGwZAWADiiYBFsAC6QYWwALo9xbAAujwgMAC6OvANOcPgL6E0oMzg7SDY4NCTsAC6SnAAuk3AACDc10DwABsGQFgA4lVAR7AAulFwABs/AEBYAOJVQEWwALpaIHAAulUwDTnU4DgwABsagBFwALpdQHAAul+wALpgAAAgdRgA8AAbB8BkwEcwALph4PAAumFwDTn04E6AQABFsAC6ZeCwALpicA055CA4MAAbGoAwABshQGLwALpn8A059McwALpoIPAAumfwDTn04E/AQABlADAAGyIPgE9HMAC6bmCwALprMA055CAnAIAAoPAAum6wDTn0x/AAunDihQCAAIcwALqFIHAAuoBwDTnUykBAAGDwALqFcA059MAwABsuBbAAuoqFsAC6iIWwALqGS65PMAAW/6BFcAAUK+BFcAARs0AAMAAbMs9HsAC6kzAAEPYAgACJsAC6m8BFsAC6m+AwALqasA05w+BrYTQYAPAAEPOgsAC6nrANOeQAD0cwALqlxbAAuqOLrk8wABb/sAAQKcHAAUrFsAC6sOAwALqvsA05w+EAYJZHMAC6vkWwALq4xbAAurcgMAC6tfANOcPgL6E0oTHhAaFIgEAARbAAusiFsAC6xoWwALrES65PMAAW/6BFcAAUK+EPsAAQU8AhQAWwALrPYDAAus4wDTnD4GthNAWwALrXBbAAutVgMAC61DANOcPgL6E0oGIg7AChQMcwALriRbAAut/FsAC63YuuTzAAFv+gJDAAFC1hKsCAAIWwALrtBbAAuutgMAC66jA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A0p4gMADSnPANSHouQgUwANKhcA1LRoNAMAARJE9HMADSqGFwANKmsA1JtE2AQABFMADSqXANS4PDwAAwABsRz89F8ADSsGAwANKvMA1IeiE1yqJBz0XwANK3IDAA0rXwDUh6LkJFsADSuyAwANK58A1IeiBl4jtwABEkj0XwANK/YDAA0r4wDUh6IGXHMADSw0WwANLBC65PMAAW/7AAEAsAQABFsADSyKAwANLHcA1IeiBl4jtAMAAULqI7T0XwANLNIDAA0svwDUh6ITLK4jvSsADS08BH8ADS1rAAFE9AgACFsADS4GAwANLfMA1IeiEAYJZhcADS43ANSbRAD9KwANLoAFqwANLrWADwABRHcABHEIGwABcj4EvwANL0MADS/bAA1dUAACFRQFqwANL0WADwABsVoC1AAABA8ADTAbAA1dUAAAAAgICwANMKAAACIQNYAPAAESXAMADTDcAACC4z2ADiVUAAGADwABRVgE+Ck7AA0xiwANMawAAhRRgA8AARIcBJsADTGIBFsADTHKAwANMbcA1MVGFFIUvYAPAAESHTsADTIXAA0ySAADAAEVeYAPAAGxbASEcwANMqxbAA0yeFsADTJUuuTzAAFv+r1LAAFCmvSMBAAGCwANMtsA1MXoAwABKC0nAA0zFg8ADTMnANTGsPgI9NcADTOgAAAEAXQPAAGwZAWADglIBNcADTOgAAAEAYAPAAFuaATXAA0zoAAABAGADwABblQEWwANM6BbAA0zfLrk8wABb/r5+wABQqCMcwANM6ITAA0zowDUyKCcBAAErAMAAbF4rFsADTPiEwANM6MA1MijAAEAvwABblwFgA8AAW5ojHMADTOiEwANM6MA1MhgnAQABKwDAAGxeKxbAA00MhMADTOjANTIYwABEp8AAW54BXQPAAGwZAWADglIjHMADTOiEwANM6MA1MgMnAQABKwDAAGxiKxzAA00dhMADTOjANTIDNgEAAYDAA00hwDUxUQDAAGxHAVxJwANNLiIWwANNOxbAA00yLrk8wABb/oNWwABQtgAWwANNXhbAA01VLrk8wABb/o/kwABQuD4BScADTaoiIiIhHMADTbwWwANNt4LAA02uwDUxeoGIiOsnAQABKwDAAGw2ACEWwANN3YLAA03UwDUxerFawABEjwAhJcADTgoAFsADTgWCwANN/MA1MXqBl4jtYAOJZAAWwANONxbAA04ygsADTinANTF6gZeI7YZIiWE+AUnAA05dFsADTmoWwANOYS65PMAAW/6P48AAULc+AUrAA06IAR/AA06TwABRYQIAAh/AA07CiXEAAAAAHMADTvEWwANO6hbAA07hLrk8wABb/pOvwABQsK8hAwADgMADTxTANTFRHMADT2tqwANPLl0DsucBYQMBYAPAAGwYYAOyz8AAs1aNbwEAARbAA0+HFsADT36AwANPecA1MVGFFIUvgYiI6wCy6xbAA0+1FsADT7AWwANPp4DAA0+iwDUxUYUUhS+BiIjrgODAAGyRAMAAZCIAPgE9HMADT+8WwANP5xbAA0/eLrk8wABb/oEVwABQr6xgBAAEHMADUEZqwANQC10DsucBYQMBYAPAAGwYYAOyz8AAs6iNbwEAARbAA1BiFsADUFmAwANQVMA1MVGFFIUvgYiI6wCy6xbAA1B+gMADUHnANTFRhAGCWRbAA1CtFsADUKgWwANQn4DAA1CawDUxUYUUhS+BiIjrgODAAGyRFsADUNYWwANQzhbAA1DFLrk8wABb/oEVwABQr4NtwABGwgDAAEcSPz8/TsADURIAAACFRGADiVUATsADUS3AA1FEAADAAEVfYAOJVQE1wANRTwAAAQBgA4lVARbAA1FPgsADUUbANTF6uQnAAESSIxzAA1FPhcADUU/ANTVxJwEAASsAiVkWwANRZILAA1FbwDUxeoGXiO2FwANRT8A1NXEBYAOJVUnAA1FuFsADUXsWwANRci65PMAAW/6DVsAAULY+AUnAA1GbFsADUaSAwANRn8A1MVGv3MAARJs+Ak7AA1HNwANR3QAAicNgA4lVARzAA1HoFsADUd8uuTzAAFv+wABALQEAARbAA1IEgsADUfvANTF6gZeI7QDAAFC7ScADUhMhHMADUieGwANSF8A1NgMnAQABFsADUjOCwANSKsA1MXqBl4jtAIlZPgE9jMADUkXANTVOhsADUlTANTYDP0nAA1J8IRbAA1KKgsADUoHANTF6sVrAAESPPgE9jMADUs/ANTVOHMADUvQWwANS5xbAA1LeLrk8wABb/q9SwABQpr09AgACgMADUwHANTFRgsADUwfANTF6AMAASiE/PgJOwANTMsADU0MAALkEYAPAAGxbARbAA1NOgsADU0XANTF6uQTA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FsADW1QuuTzAAFv+i7DAAFCxTsADW4sAAADAAEAWYAPAAFFWAEnAA1uhFsADW7SBwANbpcA1PfzAAEAAwABQbT4DTsADW9LAA1veAAC4z2ADiVUBFsADW++BwANb4MA1PfzAAEABwABQbknAA1wLIhbAA1wUgMADXA/ANT3jhimI2wAhHMADXC+DwANcI8A1PlcnAQABKwCJWT4BPYvAA1xCwDU+VxzAA1xZFsADXFAuuTzAAFv+wABAHAMAA4PAA1xvwDU+VyMWwANcl4HAA1yIwDU9/IYLwABQbBbAA1zEFsADXLoWwANcsS65PMAAW/6AkMAAULWJVI32FsADXPUWwANc6xbAA1ziLrk8wABb/oCQwABQtYk0jd8BYAODMhbAA10hFsADXRkWwANdEC65PMAAW/6BFcAAUK+EPsAAQU8AwABRBj89isADXT3ANT4nHMADXVkWwANdUC65PMAAW/7AAECcBAADFsADXXmAwANddMA1PeOFfojWg8ADXYXANT5XKQHAAEASKcAAUPE+AT2KwANdy8A1PiccwANd5xbAA13eLrk8wABb/sAAQJwEAAMWwANeB4DAA14CwDU944V+iNZqwANeGWADwABY/MABCOEpAcAAQBIpwABQ8T0cwANeZ4HAA15YwDU9/MAAQBUDAAMWwANecy65PMAAW/6AwANefcA1PeOCwANeg8A1PicAwABQe0rAA16aAWrAA16nYAPAAFEdwAEcQgbAAFySgS/AA17KwANe8MADYP8AAIXpAWrAA17LYAPAAGxWgLUAAAEDwANfAMADYP8AAAACAgLAA18iAAAIhA1gA8AARJ4AwANfMQAAILjPYAOJVQAAYAPAAFFWAT4DTsADX03AA19aAACOMGADiVUBHMADX4QWwANfZRbAA19cLrk8wABb/q7pwABQrYXoAgACasADX5VgA4lyhbEWwANftRbAA1+tFsADX6QuuTzAAFv+gRXAAFCvhDzAAEFOAJrQScADX8QhHMADX9cWwANfzYDAA1/IwDVAeoGtwABEoCcBAAErAMAAbF4+Ak7AA1/1wANgAAAAwABAhGADib4BH8ADYBCJ2QMAAzHAA2AdYAOJVQCCwANgIcA1QKMWwANgQBbAA2A4FsADYC8uuTzAAFv+gRXAAFCvhD7AAEFPAD0cwANgXRbAA2BULrk8wABb/sAAQKcFAAWBwANgeMA1QIoWwANgioDAA2CFwDVAeoQBglmDwANglsA1QTEWwANgp4DAA2CiwDVAeoGtwABEoCsAwABQ9D9KwANgwwEfwANgzsAAUWECAAKCwANg6MA1QKOAwANg9sA1QHoABsAAXJOBL8ADYQTAA2EewANi5AAAuQ0AAAABA8ADYTXAA2LkAAAAAgICwANhUAAAAIQNYAPAAESjAMADYV8AAAC4z2ADiVUAAGADwABRVgE+A07AA2F7wANhiAAAjjBgA4lVAR/AA2GOidkDAAMxwANhpGADiVUAHMADYdwWwANhuRbAA2GwLrk8wABb/q7pwABQrYXoAgACasADYe1gA4lyhbEWwANiDRbAA2IFFsADYfwuuTzAAFv+gRXAAFCvhDzAAEFOAJrQFsADYjEWwANiKRbAA2IgLrk8wABb/oEVwABQr4Q+wABBTwBOwANiTsADYloAAIQFYAOFGgE1wANiYAAAAQBgA4XDAR/AA2JghdEBAAEWwANib4DAA2JqwDVCK4C+wABEpgA1wANifwAAAQBcARfAA2J/g8ADYmDANUMAhAEWwANikYDAA2KMwDVCK4QBglmCWYPAA2JgwDVDAErAA2KhAR/AA2KswABRYQIAAoLAA2LGwDVCVIPAA2LUwDVC7gAGwABclIEvwANi6cADYw/AA2QgAACF7AFqwANi6mADwABsVoC1AAABA8ADYyjAA2QgAAAAAgICwANjRQAAAIQNYAOH7QDAA2NUAAAguM9gA4lVAABgA8AAUVYBPgFKwANjrAEfwANjt8AAUWECAAIcwANj7RbAA2PjFsADY9ouuTzAAFv+gJDAAFC1hesBAAEWwANkDBbAA2QEFsADY/suuTzAAFv+gRXAAFCvhDzAAEFOAI5IgMADZBfANUPAAAbAAFyVgS/AA2QlwANkP8ADZYsAALkvAAAAAQPAA2RKwANliwAAAAICAsADZGMAAACEDWADwABGKwDAA2RyAAAAuM9gA4lVAABgA8AAUVYBPgJOwANkn8ADZKoAAMAARQlgA8AAUVYBHMADZL0WwANktC65PMAAW/7AAECcAwADFsADZNKAwANkzcA1RHKFhcAARi1qwANk3mADwABY/MABCOEpAMAAUPFKwANk+AEcwANk/y7AAEU8wABb+wUABBbAA2UdgMADZRjANURyhAGCWRbAA2U0gsADZSnANUSbhX7AAFFZFsADZVOCwANlSMA1RJuOMMAAUVgWwANlZoDAA2VhwDVEcoWHwABGLgGvuhbAA2WBgMADZXzANURyr7rAAEYvwABcCwbAAFyWgS/AA2WQwANlqsADZuwAALkwAAAAAQPAA2W1wANm7AAAAAICAsADZc4AAACEDWADwABGOADAA2XdAAAAuM9gA4lVAABgA8AAUVYBPgJOwANmCsADZhUAAMAARQlgA8AAUVYBHMADZigWwANmHy65PMAAW/7AAECcAwADFsADZj2AwANmOMA1RZuFhcAARjpqwANmSWADwABY/MABCOEpAMAAUPFKwANmYwEcwANmai7AAETiwABb+wUABRbAA2aIgMADZoPANUWbhAGCWRbAA2afgsADZpTANUXEhX7AAFFZFsADZr6CwANms8A1RcSOMMAAUVgWwANm0YDAA2bMwDVFm7kSwABGOxbAA2bigMADZt3ANUWbhYfAAEY8AMAAXAwGwABcl4EvwANm8cADZwvAA3UrAAC5MwAAAAEDwANnFcADdSsAAAACAgLAA2ctAAAAhA1gA8AARkUAwANnPAAAALjPYAOJVQAAYAPAAFFWAT4ETsADZ2kAAADAAEAWYAPAAFFWAEnAA2d/HMADZ5IWwANniIDAA2eDwDVGwrkywABGRycBAAEawANnlcAAT/QAiSs+AUnAA2pKJcADal4AFsADalOAwANqTsA1RsKFfsAARkhgA8AARCM+BE7AA2qEwANqjQAAhUlgA8AARCMBJsADaoQBFsADapSAwANqj8A1RsKFfsAARkhgA8AARCNJwANqqBzAA2q1FsADaqwuuTzAAFv+wABAMgEAAYHAA2rFwDVG0gDAAFC/PgJOwANq5sADavIAALjqYAPAAG0WARzAA2r9g8ADavTANUdVuOgBAAABjBQpwABEJ0nAA2sgIRzAA2swhMADayTANUe2JwEAASsAwABsMj4DTsADa1LAA2teAACEBWADhRoBNcADa2QAAAEAYAOHIwEfwANrZIcrAQABhMADa3LANUe2ADXAA2uPAAABAFwBF8ADa4+FwANrZMA1SBeEARbAA2uhgMADa5zANUbChAGCWYJZhcADa2TANUgXTsADa8LAA2vPAACOMGADiVUBHMADa/QWwANr6hbAA2vhLrk8wABb/oCQwABQtYXBAQABFsADbBMWwANsCxbAA2wCLrk8wABb/oEVwABQr4Q+wABBTwCOTErAA2wtAR/AA2w4wABRYQIAAobAA2xSwDVIcYXAA2xgwDVIBQA/P07AA2yXwANsnQAAJGADhRoBHsADbJ/AAENDBAAEFsADbM4uuTzAAFv+FsADbOGDwANs2MA1R1WBPoccFsADbPGDwANs6MA1R1Wcj8AARCUWwANtA4PAA2z6wDVHVYQBglkAScADbRghHMADbSKEwANtHMA1SPAnAQABKwDAAGxePgFKwANtNwEfwANtQsAAUWECAAJqwANtYmADiXKFsYTAA21xwDVI8AA/ScADbZAlwANtpAAWwANtmYDAA22UwDVGwoV+wABGSGADwABEKz4CTsADbd7AA23nAACFSWADwABEKwEmwANt3gEWwANt7oDAA23pwDVGwoV+wABGSGADwABEK0nAA24CIRbAA24Qg8ADbgfANUnBr5bAAEQvPgRJwANuLRzAA246FsADbjEuuTzAAFv+wABAMgEAAYHAA25KwDVG0gDAAFC/PgJOwANubcADbnkAALjqYAPAAG0WARzAA26Eg8ADbnvANUnBuOgBAAABjBQpwABEMUnAA26pIRzAA265hMADbq3ANUo+JwEAASsAwABsMj4DTsADbt3AA27pAACEBWADhRoBNcADbu8AAAEAYAOHIwEfwANu74crAQABhMADbv3ANUo+ADXAA28cAAABAFwBF8ADbxyFwANu78A1Sp+EARbAA28ugMADbynANUbChAGCWYJZhcADbu/ANUqfTsADb1HAA29eAACOMGADiVUBHMADb4YWwANvaRbAA29gLrk8wABb/oCQwABQtYXBAQABFsADb6UWwANvnRbAA2+ULrk8wABb/oEVwABQr4Q+wABBTwCOTErAA2/BAR/AA2/MwABRYQIAAobAA2/mwDVK+YXAA2/0wDVKjQA/P07AA3AqwANwMwAAuOlgA8AAbB8BHMADcD6DwANwNcA1ScG47gEAAAGMFCnAAEQyScADcGAcwANwbYTAA3BkwDVLeCcBAAErAMAAbDI+Ak7AA3CPwANwlQAAJGADhRoBHMADcKcWwANwoBbAA3CXLrk8wABb/pOvwABQsK74AwADHMADcP1qwANwxV0DsucBYQMBYAPAAGwYYAOyz8AAmcyNbwEAARbAA3EUg8AD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AAEFwABcs4EvwAN778ADe+/AA3wTAAAAA8ADfAHAA3wTAAAAAQEBwAN8BwAABMAARWVgA4U5AABgA8AAXKwBPwIIAcAAXK6AAMA1VtcJAcADe+/AAGxaAAAAAAIGwABcsIEvwAN8GMADfCHAA3xxAADAAET0AAAAAQPAA3wzwAN8cQAAAAEBAcADfEUAAAC5PGADwABQoQAAYAOJVQFKwAN8WAEWwAN8bRbAA3xkFsADfFguwABFZcAAXK6FFIU7gZeI7QbAAFyxgS/AA3x2wAN8gcADflIAAMAARPUAAAABA8ADfJDAA35SAAAAAgICwAN8ogAAALk8YAPAAFChAMADfLUAAADAAEVMYAOJVQAAYAOFGgE+BE7AA3zPwAN80wAAjTFgA4UaARzAA3zegMADfNXANVegwABAEAUAAx7AA3z4wABkZQIAAhbAA30RgMADfQjANVeggJDAAFC1FsADfTEWwAN9KBbAA30cLsAARWXAAFyuhRSFO4GXiO0AgcADfUDANVewFsADfV0WwAN9US7AAEVlwABcroE+hTwCwABANWrAA317XQOy5wFhAwNgA4lVYAOJVWADwABsW2ADss+bv8AAQBIpwABQwj0XwAN91RbAA33JLsAARWXAAFyugT41wAN93QAAAQBgA4UaAYLAA33dwDVXyTXAA33iAAABAFwBF8ADfeKDwAN93cA1WJaEABbAA33rLsAARWXAAFyugliDwAN93cA1WJaFPD0cwAN+EhbAA34FgMADffzANVegr1LAAFCmRQIAAhbAA34kFsADfhguwABFZcAAXK6FFIU7gcADfi7ANVewAMAASiVKwAN+PAEWwAN+Qy7AAEVlwABcrgAANVcMADVXdAA1WTkAAAACAsAAXLSBL8ADflfAA35dwAOGpAPAAEVmAAABYAPAAGxWAAFgA8AAXKYDBMAAXLaBL8ADfqLAA36tCcAARWcAYAOFVwAEwABcuIEvwAN+u8ADfsUYwABFaMAAW/sAYAOJVQErBMAAXLmBL8ADftXAA37ZGMAARWnAAFv7AGADhRoBKwEFwABcvoEvwAN+3sADft7AA38FAAAAA8ADfvPAA38FAAAAAQEBwAN++QAABMAARWdgA4VXAABgA8AAXLQBPwIIAcAAXLaAAMA1WfIJAcADft7AAGxaAAAAAAIGwABcu4EvwAN/CsAD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gMAARsvANaAMJ8AARcQAwABdCz9JwABHCCIWwABHEYDAAEcMwDWgDITBhkAAIRbAAEcpFsAARyKAwABHHcA1oAyAvoZDhMGEDT4BPRzAAEc6Lq9hAgACgMAAR03ANaAMJMAAR1EEJ8AARcUWwABHiIDAAEeDwDWgDIC+hkMnwABFxifAAEXHAMAAXQs/ScAAR70iFsAAR8Euu07AAFz9ABbAAEfUgMAAR8/ANaAMhMGGQD4BPRzAAEflLq9hAgACgMAAR+3ANaAMJMAASCYDJ8AARcgWwABIHIDAAEgXwDWgDIC+hkMnkSQAwABdCz8GwABdNoEwwABINsAASDvAAEqeAACvwwAAAAEDwABIUcAASp4AAAACAgLAAEhcAAAAga1gA4XkAMAASHQAAACEx2ADhO4AAGADwABsWwE+BEnAAEiEHMAASKQWwABInRbAAEiSgMAASIjANaGdhVuF54DgwABsaoE6AQABFsAASK+BwABIpsA1oauE5YT0AMAAbIU+AUrAAEjPASo/ScAASOccwABJBxbAAEkAFsAASPWAwABI68A1oZ2FW4XngODAAGxqgTsBAAEWwABJJxbAAEkSgcAASQnANaGrhHCE9YDgwABsagDAAGyGPgFKwABJNwEqP0XAAEleAcAASWfAAElpAACB1GADwABsHwGTARzAAElwgsAASW7ANaJugToBAAEWwABJghbAAEl8gMAASXLANaGdhSOF6IDgwABsagDAAGyFAYrAAEmMwDWibhzAAEmKgsAASYzANaJugT8BAAGUAMAAbIhBPgROwABJm8AASaQAAI/mYAOF8gEcwABJtRbAAEmwgMAASabANaGdhSOF6CkBAAGCwABJtsA1om4AwABsuE7AAEnHwABJzAAAgYhgA8AAbBgBFsAASdeDwABJzsA1ot+BiIX0RcAASeMBwABJ7MAASe4AAIL8YAPAAGwfAZMBHMAASfWFwABJ88A1o0WBOgEAARbAAEoQFsAASgCBwABJ98A1oauEcYT2gODAAGxqAMAAbIUBjcAAShrANaNFHMAAShiFwABKGsA1o0WBPwEAAZQAwABsiD4BScAASiccwABKTBbAAEpHHMAASkMWwABKNIHAAEorwDWhq4RxhPYpAQABhcAASkTANaNFAMAAbLiBiIjrJwEAAYTAAEpPwDWjGgDAAGw2QsAASlUAP0rAAEp3ASpKwABKjwEpBsAAXTeBMMAASqPAAEqvwABLSgAAhdMBasAASqRgA8AAbFaAtQAAAQPAAEq/wABLSgAAAAEBAcAASswAAACEDWADh3EAAFwBPgI9HMAAStgug/sBAAGAwABK5sA1pE4AwABdEEnAAErxIhbAAEr1LrtOwABc/QAWwABLCIDAAEsDwDWkToTBh3M+AT0cwABLGS6vYQIAAoDAAEshwDWkTifAAEXJAMAAXQs/BsAAXTiBMMAAS0/AAEtbwABL8wAAhdUBasAAS1BgA8AAbFaAtQAAAQPAAEtqwABL8wAAAAEBAcAAS3YAAACEDWADh34AAFwBPgI9HMAAS4Iug/sBAAGAwABLkMA1pPkAwABdEEnAAEubIhbAAEufLrtOwABc/QAWwABLsoDAAEutwDWk+YTBh4A+AT0cwABLwy6vYQIAAoDAAEvLwDWk+SfAAEXKAMAAXQs/BsAAXTmBMMAAS/jAAEwEwABMnAAAhdcBasAAS/lgA8AAbFaAtQAAAQPAAEwTwABMnAAAAAEBAcAATB8AAACEDWADh4sAAFwBPgI9HMAATCsug/sBAAGAwABMOcA1paQAwABdEEnAAExEIhbAAExILrtOwABc/QAWwABMW4DAAExWwDWlpITBh40+AT0cwABMbC6vYQIAAoDAAEx0wDWlpCfAAEXLAMAAXQs/BsAAXTqBMMAATKHAAEytwABNHAAAhckBasAATKJgA8AAbFaAtQAAAQPAAEy/wABNHAAAAAEBAcAATM4AAACEDWADhz4AAFwBPgFJwABM2hbAAEzeLrtOwABc/T4BPRzAAEzyLq9hAgACgMAATPrANaZPJ8AARcwAwABdCz8GwABdO4EwwABNIcAATS3AAE77AACGFgFqwABNImADwABsVoC1AAABA8AATUnAAE77AAAAAQEBwABNYgAAAIQNYAOIkQAAXAE+AUnAAE1uHMAATX4WwABNd4DAAE1ywDWmzIC+iJMnAQABKwDAAGxePgE9HMAATY8ur2ECAAKAwABNl8A1pswnwABFzQDAAF0LScAATbccwABNzhbAAE3HFsAATcCAwABNu8A1psyAvoiThACCWCcBAAErAMAAbF4+AT0cwABN3y6vYQIAAoDAAE3nwDWmzCfAAEXOAMAAXQs+A07AAE4qwABONAAAhRdgA4h4ASbAAE4qARbAAE5CFsAATjuAwABONsA1psyAvoiThACCWGADiHg+Ak7AAE54AAAAPF0DwABsSgFgA4iDARbAAE54HgDAAGwvAQFdA8AAbCABYAOIgwEWwABOeIHAAE5uwDWneYYOiHsAPcAAbEtFAAABHMAATniCAMA1p7I+AAAAAMAAbE0APgJOwABOYAAAAI1CYAOIgwEWwABOf4IAwDWnskDAAGxPPgFJwABOiRzAAE6Yg8AATo3ANagTJwEAARbAAE6ggMAATpvANabMgL6IkwDAAGxeSsAATqgAPz0cwABOvi6vYQIAAoDAAE7GwDWmzCfAAEXPAMAAXQsGwABdPIEwwABPAMAATwzAAFQcAACGugFqwABPAWADwABsVoC1AAABA8AATyHAAFQcAAAAAQEBwABPMwAAAIXgYAOK3wAAXAE+Bz0cwABPTIDAAE9DwDWovoP7AQABLgCK6knAAE9lIRzAAE+HFsAAT4AWwABPcoDAAE9pwDWovoNziuKA4MAAbGonAQABFsAAT7QWwABPpRbAAE+bgMAAT5LANai+gtOK54Njg0KA4MAAbGoAwABsMj4BPRzAAE/ELq9hAgACFsAAT9cuwABFgcAAXQMkwABP5AgnwABF0IDAAE/7wDWovifAAEXRFsAAUCYWwABQGIDAAFAPwDWovoNziuKA4MAAbGonwABF0ieBdxbAAFCTFsAAUIQWwABQeoDAAFBxwDWovoLTiueDY4NCgODAAGxqJ8AARdMAwABdCz9OwABQv8AAUMwAAMAARdRdA8AAbFcBYAODMgE1AAAAAQBdA8AAbFcBYAODMgEeAMAAbHwAAWADgzIAAIEAwDWp507AAFDhwABQ7AAAwABF1WADwABsHwGTRcAAUPUBwABRAMAAUQQAAIEsYAODMgEWwABRD4DAAFEGwDWovoLTiucBIRzAAFEeg8AAURrANaopJwEAASsAwABsXgGLwABRJ8A1qikWwABRMYPAAFEtwDWqKYLhg1w+Aj0cwABRUoHAAFFFwDWpzDYBAAGDwABRVsA1qikAwABsfT4CTsAAUXYAAAA8XQPAAGxKAWADg8wBFsAAUXYeAMAAbC8BAV0DwABsIAFgA4PMARbAAFF2g8AAUXLANaopg8CDWAA9wABsS0UAAAEcwABRdoQAwDWqqD4AAAAAwABsTQA+Ak7AAFFtAAAAgflgA4PMARbAAFF+hADANaqoQMAAbE8+AUnAAFGIIiEWwABRj4XAAFGNwDWrCYO9g98AIRbAAFGehcAAUZzANasJhMGD3j2KwABRp8A1qg0cwABRsYLAAFGnwDWqDYE/AQABlADAAGyIP0nAAFHHIRzAAFHnFsAAUeAWwABR1IDAAFHLwDWovoWkiuOA4MAAbP0nAQABgsAAUerANaoNAMAAbDI+AT0cwABR/i6vYQIAAhbAAFIRLsAARYHAAF0DJMAAUh4IJ8AARdCAwABSNcA1qL4nwABF0RbAAFJeFsAAUlKAwABSScA1qL6FpIrjgODAAGz9J8AARdYngXeCwABSpsA1qg0nwABF1wDAAF0LPz0cwABS2xbAAFLPgMAAUsbANai+haSK44GxAQABNMAAUuMDwABS48AAVBcAAAACAgLAAFLuAAAAhahgA4J+AMAAUwEAAACBPmADilAAAGABwABsXAE+Ak7AAFMWwABTHAAAg8FgA4PMARbAAFMng8AAUx7ANaxThCKCiEnAAFM2IRzAAFNIgcAAUzvANanMKwEAARbAAFNXhcAAU1HANax6gzODtADAAGx4PgE9HMAAU3Iur2ECAAIWwABThy7AAEWBwABdAyTAAFOUBifAAEXQgMAAU63ANai+J8AARdiFwABTx8A1rHonjvEnwABF2QDAAF0LPwDAAGywBsAAXT2BMMAAVCHAAFQtwABV+gAAhs4BasAAVCJgA8AAbFaAtQAAAQPAAFRFwABV+gAAAAEBAcAAVFoAAACF4GADix8AAFwBPghJwABUahbAAFRuLsAARX/AAFz/PgE9HMAAVI0ur2ECAAIWwABUlS7AAEWBwABdAyfAAEXaAMAAXQs/TsAAVOPAAFT+AADAAEXbYAPAAGxbARbAAFUALsAARX/AAFz/PRfAAFUbLsAARX8pwABc/07AAFVGwABVUAAAwABFh2ADglIBFsAAVVIuwABFgcAAXQM9F8AAVWUuwABFgSvAAF0DPRzAAFWTFsAAVYiAwABVf8A1rVSFfoshg/gBAVwBLgCFHj0XwABVpS7AAEWBgsAAVbXANa3WwABdAz0XwABVxC7AAEV/gcAAVdzANa2iwABc/wbAAF0+gTDAAFX/wABWC8AAVt8AAIgSAWrAAFYAYAPAAGxWgLUAAAEDwABWIcAAVt8AAAABAQHAAFYpAAAAhA1gA4OsAABcAT4BScAAVjUcwABWcBzAAFZPFsAAVj6AwABWOcA1rpCEwIOygfoBAAFqwABWYWADwABsH4UEAMAAbN4nAQABkwDAAGwyPgE9HMAAVn4ur2ECAAKAwABWkcA1rpAkwABW1AUnwABF3IDAAFawwDWukCfAAEXdFsAAVsqAwABWxcA1rpCEAIJYJ5EkAMAAXQs/BsAAXT+BMMAAVuTAAFbwwABXnAAAhKkBasAAVuVgA8AAbFaAtQAAAQPAAFcDwABXnAAAAAEBAcAAVwoAAACEDWADgzIAAFwBPgFJwABXFiEcwABXIxbAAFcbLoL3wABc9SsBAAGAwABXLMA1r2cAwABseD4BPRzAAFc7Lq9hAgACgMAAV07ANa9nJMAAV5EFJ8AARdyAwABXbcA1r2cnwABF3RbAAFeHgMAAV4LANa9nhACCWCeRJADAAF0LPwbAAF1AgTDAAFehwABXrcAAWF0AAIZpAWrAAFeiYAPAAGxWgLUAAAEDwABXwsAAWF0AAAABAQHAAFfLAAAAhA1gA4MBAABcAT4BScAAV9chHMAAV+UWwABX3C6EM8AAXPYrAQABgMAAV+7ANbAlAMAAbHg+AT0cwABX/S6vYQIAAoDAAFgQwDWwJSTAAFhSBSfAAEXcgMAAWC/ANbAlJ8AARd0WwABYSYDAAFhEwDWwJYQAglgnkqYAwABdCz8GwABdQYEwwABYYsAAWG7AAFqJAACGcgFqwABYY2ADwABsVoC1AAABA8AAWITAAFqJAAAAAQEBwABYlwAAAIQNYAOJ/gAAXAE+A07AAFinwABYsQAAhThgA4omARbAAFi4gMAAWLPANbDjhTiKAUnAAFjHIRzAAFjiFsAAWMwuwABFe8AAXPcrAQABgcAAWOvANbD3AMAAbHg+AT0cwABY/y6vYQIAAhbAAFkSLsAARYHAAF0DJMAAWR8GJ8AARZOBwABZPcA1sPcnwABF3ifAAEXfFsAAWYaBwABZfMA1sPeEAIJYJ5EkAMAAXQs/ScAAWZ0iJcAAWbIAFsAAWauBwABZocA1sPeEAIJYYAODMgAhFsAAWb8uwABFfsAAXPs+AT0cwABZ5i6vYQIAAhbAAFn5LsAARYHAAF0DJMAAWgYGJ8AARZOBwABaJMA1sPcnwABF4CfAAEXhFsAAWnSBwABaasA1sPeEAIJYJ5EkAMAAXQs/BsAAXUKBMMAAWo7AAFqawABcEgAAhlgBasAAWo9gA8AAbFaAtQAAAQPAAFqswABcEgAAAAEBAcAAWrsAAACEDWADiaoAAFwBPgI9HMAAWsyAwABax8A1sliD+wEAAS4AibdJwABa5SEcwABbAxbAAFr8FsAAWu6AwABa6cA1sliDc4mugODAAGxqJwEAARbAAFskFsAAWxUWwABbC4DAAFsGwDWyWILTibCDY4NCgODAAGxqAMAAbDI+AT0cwABbNC6vYQIAAhbAAFtHLsAARYHAAF0DJMAAW1QIJ5f7gMAAW2fANbJYJ8AARdEWwABbihbAAFt8gMAAW3fANbJYg3OJroDgwABsaifAAEXSJ4F3FsAAW/MWwABb5BbAAFvagMAAW9XANbJYgtOJsINjg0KA4MAAbGonwABF0wDAAF0LPwbAAF1DgTDAAFwXwABcI8AAXc0AAIZoAWrAAFwYYAPAAGxWgLUAAAEDwABcM8AAXc0AAAABAQHAAFxAAAAAhA1gA4naAABcAT4DPRzAAFxMLsAARZkBAAEWwABcXoDAAFxZwDWzmoZnieAAwABdHD0cwABcdYDAAFxwwDWzmoP7AQABLgCJ50nAAFyOIRzAAFysFsAAXKUWwABcl4DAAFySwDWzmoNzid6A4MAAbGonAQABFsAAXM8WwABcwBbAAFy0gMAAXK/ANbOahmeJ4INjgwaA4MAAbGoAwABsMj4BPRzAAFzfLq9hAgACFsAAXPIuwABFgcAAXQMkwABc/wgnwABF4oDAAF0ewDWzmifAAEXRFsAAXUEWwABdM4DAAF0uwDWzmoNzid6A4MAAbGonwABF4yeBdxbAAF2uFsAAXZ8WwABdk4DAAF2OwDWzmoZnieCDY4MGgODAAGxqJ8AARdMAwABdCz8AADVxAAA1cW0ANXH9ADVyTwA1csUANXMVADVzugA1dNUANXUeADV1XQA1djoANXa+ADV3OwA1eCIANXiqADV5pgA1ei4ANXuGADV74QA1fIQANYD0ADWBVgA1ghgANYQnADWEmAA1hssANYe8ADWJHwA1ioQANYtFADWN7wA1jjgANY6BADWOygA1jxMANZCmADWRKQA1kZEANZQZADWU3QA1lUoANZb7ADWYJAA1mcUANZw4ADWdqQA1nxUANZ/VADWhcwA1pBcANaTCADWlbQA1phgANaaVADWohwA1rR0ANa5ZADWvMAA1r+4ANbCsADWyIQA1s2MANbTMAAAAPgLAAF1GgTDAAF5MwABeUsAAY7EDwABF5AAAAV0DmKgBWwAAAwTAAF1IgTDAAF6ZwABenAmOtwBgA5q6AATAAF1JgTDAAF6nwABetBjAAEWAAGADg6wBKwTAAF1LgTDAAF7YwABe6gmOuMAAXNkAYAObJQABBcAAXVOBMMAAXu/AAF7vwABfVAAAAAPAAF8CwABfVAAAAAEBAcAAXwgAAASOt2ADmroAAGADwABdRgE/AwgBwABdSIAAwDW2ZggAwABdSx/AAF8um1kBAAGAwABfUMA1tmYACQHAAF7vmKwAAAAABQbAAF1NgTDAAF9ZwABfZcAAX/gAAIRTAWrAAF9aYAPAAGxWgLUAAAEDwABfccAAX/gAAAABAQHAAF96AAAAhA1gA4KSAABbAT4DPRzAAF+ZFsAAX4YujrjAAFzZwABdS4spAQABgMAAX6bANbboAJswPR3AAF+3hFMBAAGAwABfxMA1tugAl9A9HMAAX+IWwABfzy6OuMAAXNnAAF1Liy4BAAGAwABf78A1tugAmzEGwABdToEwwABf/cAAYAnAAGDIAACE2wFqwABf/mADwABsVoC1AAABA8AAYBPAAGDIAAAAAQEBwABgGgAAAIQNYAODzAAAWwE+BT0XwABgJi7AAEWAgMAAYDbANbeXwABdST0cwABgUxbAAGBALo64wABc2cAAXUuMLQEAAYDAAGBfwDW3lwCbLj0dwABgcITbAQABgMAAYHvANbeXAJfFPRzAAGCZFsAAYIYujrjAAFzZwABdS4xFAQABgMAAYKXANbeXAJsvPRfAAGCwLsAARYCAwABgwMA1t5fAAF1JBsAAXU+BMMAAYM3AAGDZwABhpAAAhQEBasAAYM5gA8AAbFaAtQAAAQPAAGDnwABhpAAAAAEBAcAAYPIAAACEDWADhEsAAFsBPgU9F8AAYP4uwABFgIDAAGEOwDW4dsAAXUk9HMAAYSsWwABhGC6OuMAAXNnAAF1LjC0BAAGAwABhN8A1uHYAmy49HcAAYUiFAQEAAYDAAGFXwDW4dgCXxD0cwABhdRbAAGFiLo64wABc2cAAXUuMRQEAAYDAAGGBwDW4dgCbLz0XwABhjC7AAEWAgMAAYZzANbh2wABdSQbAAF1QgTDAAGGpwABhtcAAYoYAAIThAWrAAGGqYAPAAGxWgLUAAAEDwABhxcAAYoYAAAABAQHAAGHSAAAAhA1gA4QCAABbAT4FPRfAAGHeLsAARYCAwABh7sA1uVXAAF1JPRzAAGILFsAAYfgujrjAAFzZwABdS4wtAQABgMAAYhfANblVAJsuPR3AAGIohOEBAAGAwABiOcA1uVUAl8M9HMAAYlcWwABiRC6OuMAAXNnAAF1LjEUBAAGAwABiY8A1uVUAmy89F8AAYm4uwABFgCvAAF1JBsAAXVGBMMAAYovAAGKXwABjrwAAiAwBasAAYoxgA8AAbFaAtQAAAQPAAGKowABjrwAAAAEBAcAAYrQAAACEDWADhRoAAFsBPgJLPgE9HMAAYtGAwABizMA1uiyFMwEAARbAAGLfLo64wABc2cAAXUsAhRwAAcAAYvpbAcAAYwEAAAGBJlsAAD4CPR7AAGMMwABsJwEAASTAAGMRCSfAAEXlFsAAYx0uwABFgMAAXUkng+c1wABjMAAAAQBgA4OsARbAAGMwLsAARYDAAF1JIxzAAGMwgsAAYzDANbqpJwEAASsAwABsXisWwABjP4LAAGMwwDW6qYNtg7EBYAPAAGxYJ4aygMAAY1fANbosJ4OkFsAAY2SAwABjX8A1uiyFTsAAbS0ng6MAPS/AAGN7PR3AAGOUiAwBAAGAwABjpsA1uiwAl3oAADW2sQA1t2AANbg/ADW5HgA1ufUANbs7AAAABQLAAF1UgTDAAGO0wABjusAAZgsDwABF5gAAAV0DmHABWwAAAQTAAF1WgTDAAGRMwABkUhiEAABgA4JSAAEFwABdW4EwwABkV8AAZFfAAGR5AAAAA8AAZGrAAGR5AAAAAQABwABkcQAABIQAYAOCUgFqAGABwABsXAIAYAPAAF1UAT8CCAHAAF1WgADANbu6CQHAAGRXmKcAAAAAAgbAAF1YgTDAAGPiwABj7sAAZD4AAY6JAAAAAQPAAGPzwABkPgAAAAEBAcAAY/0AAACEDWADglIAAFwBPgE9HMAAZA6AwABkCcA1vB6D+AEBWwEfwABkGcAAXVsBAAEWwABkMoDAAGQtwDW8HoQAglgAAIJbBsAAXVmBMMAAZH7AAGR+wABmCQAAhwUAAAABA8AAZI3AAGYJAAAAAQEBwABklwAAAIQNYAOCUgAAWwE+BUnAAGSjIRzAAGSzFsAAZKyAwABkp8A1vJKEAIJYJwEAARbAAGS2LoQAwABdVgDAAGxePgE9MMAAZMYfwABk0MAAXOYDAAMWwABk7S6EAMAAXVaAwABk/8A1vJIkwABlAwknwABF5xbAAGUqgMAAZSXANbyShU7AAG0tJ56qJ8AARegWwABlVxbAAGVQgMAAZUvANbyShACCWIVOwABtLSeeqifAAEXpFsAAZYoWwABlgy6EAMAAXVaFTsAAbS0nkSQAP07AAGWqwABltAAAwABFh2ADglIBFsAAZbYuhADAAF1WPRfAAGXCLoQAgMAAZcvANbySwABdVj0cwABl2oDAAGXVwDW8koP7AQABLgCCXD0XwABl8y6EAIHAAGX8wDW9acAAXVYAADW79AA1vGgANb3MAAAAAgAAAwbAAFzbgTCBeoF/giIAAazSAAAAAQOBjoIiAAAAAwEBgZkAAACAjWADiyoAAoGqAAAAu01gA8AAbFsBagBgAcAAbFwCgboAAAC7TmADwABsWwFqAGABwABsXAJcAT4BPR6B3MAAXQcDAAGAgeLANb4AArtNgYH+wDW+DbtOgoIVwDW+JAbAAFzcgTDAAF3SwABd18AAXkkAAblHAAAAAQPAAF3qwABeSQAAAAICAsAAXfsAAACOt2ADmroAwABeCgAAAICNYAOLKgAAXAE+AT0cwABeI4HAAF4ZwDW+nIP4AQFbAR/AAF4uwABdUwEAAYDAAF5CwDW+jgAAizgGwABc3YEwwABmDsAAZhPAAGZxAAHAAEXqAAAAAQPAAGYkwABmcQAAAAEBAcAAZjEAAACNyWADhAIAAFwBPgABgTAANb8cADVpagA1bH0ANW3oADW1zQA1u1gANb3dAAAABQA1veAANb5kADW+3QA1vxwAAAADAAIIwABdXMAAReuBMQAALYD4AADAAGwVAAEBAYh+gRoAAMAAbLsAAQEBg/WBPAAAwABsVAABAQGKDoFmAADAAFrEAAEBAbhKgcwAAMAAS10AAQECjtCuk4IqAADAAEudAAEBB6ufq562XKubvlugH75cgwcAAIIuAAEBD4VnhlSEhXSGRIUyhRmGVnWEVIZAhQV2hpKD/YReAACBaQABAQJzgtCEwAAAjTsAAQEBeYT5AACcNQABAQGWWYVFAACT2gAAhXUAAMAAWFYAAIWXAADAAGPtAAEBAb/yhdcAAMAASaoAAQEBrniGGgAAwABALQAAhjwAAMAAQHoAAIZkAADAAExNAACGiwAAwABMZwAAhrcAAMAATIMAAIbfAADAAEEIAACHCQAAwABOEwAAhzIAAMAATnIAAIdfAADAAE67AACHiwAAwABPAgAAh7gAAMAAQYUAAIffAADAAEGbAACIEwAAwABCHAABAQGrzog5AADAAEIpAAEBAavPiF8AAJTYAAEBGIK4kHegJKAppvWm+ab9p36CvJE0kH2h9qJvonSieKJ9o0yjUaRIpE2kUqUbqAmpGYu+AADAAEM2AAEBA6vTuGS4ZYwrAADAAEZcAAEBAavVjGUAALYtAAEBAa67jJ0AAMAAZ0sAAQEBwABF7IzoAADAAGeLAAEBAcAARe2NNAAAwABmmQABAQHAAEMdjX0AAMAAR/EAAQECrNO7iI28AAC1OQABAQGPvY3tAADAAFAsAAEBAa6xji8AAMAAW24AAI5nAADAAFBlAACOlwAAwABnnAABAQHAAEXujscAAMAAaBgAAQEBwABF747zAADAAGNNAAEBAcAARfCPJwAAwABDAwABAQGr0I9kAADAAEawAAEBAavXAAAAAwLAAF1jgTGPpY+rwACougO5SAAAAWADwABH9AAAEATAAF1lgTGQGZAjCYD4AGADk9sABMAAXWaBMZBokHcJq6IAYAPAAGxbAATAAF1ngTGQlpC2CaySAF0DwABsXwJgA8AAbFhdA8AAbBkBYAPAAGwfATKQtGADwABsWF0DwABsGQFgA8AAbB8ABMAAXWiBMZDRkOEYrCMAYAPAAFnQASsEwABdaYExkPmRCxiJ5gBgA5w2ASsEwABdaoExkUyRVRiBFgBgA4F1ASsEwABdbIExkWORbRjAAES/wABdXABgA408ASsEwABdbYExkkiSahisIgBdA8AAbF8CYAOCfmADwABALgEykmhgA4J+YAPAAEAuAATAAF1ugTGTF5MlGK9jAGADiVUBKwTAAF1vgTGT05PjGK9nAGADiVUBKwTAAF1wgTGUkZSfGK9lAGADiVUBKwTAAF1xgTGUvJTPGK7kAGADwABbjwErBMAAXXKBMZTklPMYwABAKQBgA8AAY/EBKwTAAF1zgTGVDpUjGMAARfEAYAPAAGdMASsEwABddIExlT6VUxjAAEXyAGADwABnjAErBMAA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sRLANdq0AMAAXYROsSmxMAAAhABgA8AAQC4BgLEywDXatEmxPyEcsVKBsUPANdrCJwEAASsAwABsNj4CTrFrsW8AAIEsYAPAAEAuARyxihaxfhSxccA13CsRAIb0wABnrZP3AwADgbGRwDXawhyxoZSBWgAAAADAAGyPKwDAAEJkSbGyJbG6ABSxtsA13IUTAGADwABAez4CPRWx1cA13FQSFLHewDXchRMBYAPAAEB7PTWx6wAAAQBgA8AAZ50BFLHrwDXcKxEANbIEAAABAFwBF7IEFLHrwDXc+xQAwABGBBSyGcA13IUTAWADwABAe8AAZ7M1sikAAAEAXAEXsikUsevANdz7FACG9ByyQRayOxSyN8A13IUTAWADwABAe5ppwABMObfyAgACHLJ4FrJsFLJfwDXcKxEAhvTAAGett/UBAAEWso4UsorANdyFEwFgA8AAQHuwr8AAQH0AwABCYCSy0AInwABGBYGywcA12sIAwABCXcAAZ60UsevANdz7FAA/P06y9rL+AACHg2ADwABOvAE1swQAAAEAYAPAAE7NAR+zBMAATvQOAA4rkysnwABGBisrarOIYAOEkoZngLOYwDXatJOTHLO/lIFaAAAAAMAAbI8cs8uUgVoAAAAAwABsjysrADWz8wAAAQBcARez8xSzBMA13eATAIQAFLP8wDXcVBIAwABOJhSzBMA13eATAE60FLQdAAC4XWADtjYBJrQUARy0LBS0H8A13CsRAMAARgcDAAIUtETANd3QEwAWtFoUtE3ANdwrEQCG9MAAZ60Brr6CtIzANdrQwABn9WADtjY9jbSpwDXbGxy0uRS0sMA13mAUAK97AwADH7TcwABhYQEAARS048A13mAUAAAUtO7ANdveEACDtPXANdreALaYQgAAPR4AwABsNwIAAoQAwDXa+oUAwDXbGwBKtQQAAwEAWwEAAAAAHVsAAQAAAAAeWwA+AT0cAIQAwDXa+i0CAAIUAMA13xQQABQAwDXfHBEAAMAAbDo9jgDANdstHgDAAGw7AQABFADANdtlDAAAPY8AwDXbNR4AwABsPAEAARQAwDXbZQwAAD0VAMA12z0IHgDAAGw9AQABFADANdtlDAAAPRyv5oQAwDXa+i4BAAEUAMA122UMAAAASgABFgCEAMA12vovwABsPwbAAF18gTG1CbUatTABAIC+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T8AARQ0AAAACAgLAAERUAAAAgUxgA8AAbFgAwABEaAAAAIEVYAPAAEEJAABgAcAAbFwBPgFJwABEeRzAAESMFsAARIWCwABEfcA17fer+cAAQRQnAQABLgDAAGxePgJOwABEtMAARMIAAMAARgtgA8AARrcBJsAARLQBgsAARMTANe33YAPAAEa3PYjAAETVwDXtqBzAAETfgMAARNXANe2ogT8BAAEcwABE8IPAAETiwDXuPLlbAAAAAMAARwcAwABsiD8AwABssD0cwABFGxbAAEUULpCXwABIA5DGAQABJMAARTwDJ8AARhOAwABFLMA17agnwABBCgC1TwbAAF2JgTHAAEVGwABFS8AARl8AALeIAAAAAQPAAEVlwABGXwAAAAAAAABcAT4DTsAARXLAAEV4AACKU2ADwABsHwGTPRzAAEWKFsAARYEuq/3AAEf2gbEBAAE0wABFkgPAAEWSwABGHgAAAAICAsAARZcAAACBTGADwABsWADAAEWrAAAAgRVgA8AAQQkAAGABwABsXAE+AUnAAEW8HMAARc8WwABFyILAAEXAwDXvWKv5wABBFCcBAAEuAMAAbF4+AT2IwABF4sA17wkcwABF6IDAAEXiwDXvCYE/AQABHMAARfOCwABF68A171i3iAAAAADAAEEmAMAAbIg/AMAAbLA9HMAARiwWwABGJS6Ql8AASAOQxgEAASTAAEZaAifAAEYUgMAARlTANe8JALVPBsAAXYqBMcAARmTAAEZpwABHeAAAuW8AAAABA8AARoXAAEd4AAAAAAAAAFwBPgNOwABGksAARpgAAIpTYAPAAGwfAZM9HMAARqoWwABGoS6r/cAAR/aBsQEAATTAAEayA8AARrLAAEc0AAAAAgICwABGtwAAAIFMYAPAAGxYAMAARssAAACBFWADwABBCQAAYAHAAGxcAT4BScAARtwcwABG7xbAAEbogsAARuDANfCJq/nAAEEUJwEAAS4AwABsXj4BPYjAAEcCwDXwOhzAAEcIgMAARwLANfA6gT8BAAEcwABHE4LAAEcLwDXwibeJAAAAAMAAQScAwABsiD8AwABssD0cwABHQhbAAEc7LpCXwABIA5DGAQABJMAAR3MDJ8AARhWAwABHYsA18DonwABGFgC1TwbAAF2LgTHAAEd9wABHgsAASIIAALbsAAAAAQPAAEeVwABIggAAAAAAAABcAT4DTsAAR6LAAEeoAACKU2ADwABsHwGTPRzAAEe6FsAAR7Euq/3AAEf2gbEBAAE0wABHwgPAAEfCwABISwAAAAICAsAAR8cAAACBTGADwABsWADAAEfbAAAAgRVgA8AAQQkAAGABwABsXAE+AUnAAEfsHMAAR/8WwABH+ILAAEfwwDXxv6v5wABBFCcBAAEuAMAAbF4+AT2IwABIEsA18XAcwABIGIDAAEgSwDXxcIE/AQABHMAASCOCwABIG8A18b+27AEAASsAwABAUwDAAGyIPwDAAGywPRzAAEhZFsAASFIukJfAAEgDkMYBAAEkwABIfQMnwABGE4DAAEhqwDXxcCfAAEYXALVPBsAAXYyBMcAASIfAAEiMwABJzwAAt48AAAABA8AASJ/AAEnPAAAAAgICwABIrQAAAIoWYAPAAEB7AMAASMEAAACx7GADwABBhgAAXAE+A07AAEjYwABI3gAAilNgA8AAbB8Bkz0cwABI8BbAAEjnLqv9wABH9oGxAQABNMAASPgDwABI+MAASZAAAAACAgLAAEj9AAAAgUxgA8AAbFgAwABJEQAAAIEVYAPAAEEJAABgAcAAbFwBPgFJwABJIhzAAEk1FsAASS6EwABJJsA18xar+cAAQRQnAQABLgDAAGxePgE9isAASUjANfLHHMAASU6CwABJSMA18seBPwEAARzAAElZhMAASVHANfMWt48CAAKAwABJbcA18qGBwABJdcA18rEAwABBKwDAAGyIPwDAAGywPRzAAEmeFsAASZcukJfAAEgDkMYBAAEkwABJygMnwABGE4LAAEmvwDXyxyfAAEYYALVPBsAAXY2BMcAASdTAAEnZwABK3gAAt5AAAAABA8AASenAAEreAAAAAAAAAFwBPgNOwABJ9sAASfwAAIpTYAPAAGwfAZM9HMAASg4WwABKBS6r/cAAR/aBsQEAATTAAEoWA8AAShbAAEqYAAAAAgICwABKGwAAAIFMYAPAAGxYAMAASi8AAACBFWADwABBCQAAYAHAAGxcAT4BScAASkAcwABKUxbAAEpMgsAASkTANfReq/nAAEEUJwEAAS4AwABsXj4BPYjAAEpmwDX0DxzAAEpsgMAASmbANfQPgT8BAAEcwABKd4LAAEpvwDX0XreQAAAAAMAAQSwAwABsiD8AwABssD0cwABKphbAAEqfLpCXwABIA5DGAQABJMAAStkDJ8AARhmAwABKxMA19A8nwABGGgC1TwbAAF2OgTHAAErjwABK6MAATHcAALeRAAAAAQPAAEr7wABMdwAAAAMDA8AASwgAAACx7GADwABBhgDAAEshAAAAse1gA8AAQYYAwABLQAAAAIlLYAPAAEB7AABcAT4DTsAAS1fAAEtdAACKU2ADwABsHwGTPRzAAEtvFsAAS2Yuq/3AAEf2gbEBAAE0wABLdwPAAEt3wABMLAAAAAICAsAAS3wAAACBTGADwABsWADAAEuQAAAAgRVgA8AAQQkAAGABwABsXAE+AUnAAEuhHMAAS7QWwABLrYXAAEulwDX1xKv5wABBFCcBAAEuAMAAbF4+AT2LwABLx8A19XUcwABLzYPAAEvHwDX1dYE/AQABHMAAS+SFwABL3MA19cS3kQMAA4DAAEv4wDX1P4HAAEwFwDX1T4LAAEwRwDX1XwDAAEEtAMAAbIg/AMAAbLA9HMAATDoWwABMMy6Ql8AASAOQxgEAASTAAExyAyfAAEYbg8AATF3ANfV1J8AARhoAtU8GwABdj4ExwABMfMAATIHAAE1/AAC3igAAAAEDwABMlMAATX8AAAAAAAAAXAE+A07AAEyhwABMpwAAilNgA8AAbB8Bkz0cwABMuRbAAEywLqv9wABH9oGxAQABNMAATMEDwABMwcAATUYAAAACAgLAAEzGAAAAgUxgA8AAbFgAwABM2gAAAIEVYAPAAEEJAABgAcAAbFwBPgFJwABM6xzAAEz+FsAATPeCwABM78A19xWr+cAAQRQnAQABLgDAAGxePgE9iMAATRHANfbGHMAATReAwABNEcA19saBPwEAARzAAE0igsAATRrANfcVt4oAAAAAwABBKADAAGyIPwDAAGywPRzAAE1UFsAATU0ukJfAAEgDkMYBAAEkwABNegMnwABGHIDAAE1lwDX2xifAAEYdALVPBsAAXZCBMcAATYTAAE2JwABOhAAAt4sAAAABA8AATZvAAE6EAAAAAAAAAFwBPgNOwABNqMAATa4AAIpTYAPAAGwfAZM9HMAATcAWwABNty6r/cAAR/aBsQEAATTAAE3IA8AATcjAAE5MAAAAAgICwABNzQAAAIFMYAPAAGxYAMAATeEAAACBFWADwABBCQAAYAHAAGxcAT4BScAATfIcwABOBRbAAE3+gsAATfbANfhLq/nAAEEUJwEAAS4AwABsXj4BPYjAAE4YwDX3/BzAAE4egMAAThjANff8gT8BAAEcwABOKYLAAE4hwDX4S7eLAAAAAMAAQSkAwABsiD8AwABssD0cwABOWhbAAE5TLpCXwABIA5DGAQABJMAATn8DJ8AARhyAwABOa8A19/wnwABGHgC1TwbAAF2RgTHAAE7gwABO5cAAUcEAAMAARh8AAAABA8AATv7AAFHBAAAAAQEBwABPDAAAAIlLYAPAAEB7AABcAT4BScAATx8iJcAATy8AgMAATyPANfkuYAPAAEMGABzAAE9rFsAAT2QWwABPXBTAAE9QwDX5LgABYAPAAEMGgRXAAEMQq/nAAEa6JwEAAS4AwABsXj4DScAAT3whHMAAT5YWwABPjBTAAE+AwDX5LgABYAPAAEMGg1PAAEC4JwEAASsAwABsXj4CPRfAAE+1FMAAT6nANfkuAAFgA8AAQwaDUyvAAEC4PRzAAE/bFMAAT8/ANfkuAAFgA8AAQwasYAMAA2rAAE/zYAOy28AAudoWwABQFRTAAFAJwDX5LgABYAPAAEMGic7AAE5kasAAUCFgA8AAbB8DAMAATEo/ScAAUDohHMAAUFUWwABQShTAAFA+wDX5LgABYAPAAEMGi0TAAEC5JwEAASsAwABsYj4CPRzAAFB0FMAAUGjANfkuAAFgA8AAQwasYAMAA2rAAFCMYAOy28AAugEWwABQsRTAAFClwDX5LgABYAPAAEMGic7AAE5kasAAUL1gA8AAbB8DAMAATEo9F8AAUNwUwABQ0MA1+S4AAWADwABDBotEK8AAQLk/ScAAUP0hHMAAURkWwABRDRTAAFEBwDX5LgABYAPAAEMGg1TAAEMKJwEAASsAwABsXj4CPRzAAFE4FMAAUSzANfkuAAFgA8AAQwasYAMAA2rAAFFQYAOy28AAuigWwABRchTAAFFmwDX5LgABYAPAAEMGic7AAE5kasAAUX5gA8AAbB8DAMAATEo9F8AAUZ0UwABRkcA1+S4AAWADwABDBoNUK8AAQwo/PwbAAF2SgTHAAFL/wABTGMAAXicAAMAARiAAAAABA8AAUy3AAF4nAAAAAQEBwABTOwAAAIlLYAPAAEB7AABdA8AAbBkBYAPAAEMGAT4NTsAAU7TAAFO9AACcnl0DwABsGQFgA8AAQwYBMcAAU9NgA8AAQwYAPgJOwABUAwAAADxdA8AAbEoBYAPAAEEJARbAAFQDHgDAAGwvAQFdA8AAbCABYAPAAEEJARbAAFQDFsAAU/ouq/3AAEf2gabAAGylAD3AAGxLRQAAARzAAFQDggDANfwHPgAAAADAAGxNAD4CTsAAU+8AAACBFWADwABBCQEWwABUC4IAwDX8B0DAAGxPPgFJwABUExzAAFQmFsAAVB+DwABUF8A1/HGr+cAAQRQnAQABLgDAAGxePgJOwABUS8AAVFMAAIMSXQPAAGxKAWADwABALgEWwABUXYPAAFRVwDX8cT3AAEEXQ8AAVG8cwABUfoTAAFR2wDX8vj4AAAAAwABsTT4CTsAAVJ7AAFSlAACERGADwABALgEWwABUr4TAAFSnwDX8vkDAAGxPScAAVMIlwABUzQCFwABUxsA1/QpgA8AAQwY+AT0cwABU+4HAAFTywDX73jYBAAEUwABU/8A1/QoFAWADwABDBgDAAGxHPz9OwABVQ8AAVVYAAMAARiFdA8AAbFcBYAPAAEB7AR7AAFVcwABsfAABYAPAAEB7AABFwABVdQHAAFV+wABVgAAAgdRgA8AAbB8BkwEcwABVh4PAAFWFwDX9rYE6AQABFsAAVaBqwABViV0DwABsGQFgA8AAbBjAAN2GgODAAGxqAMAAbIUBi8AAVajANf2tHMAAVamDwABVqMA1/a2BPwEAAZQAwABsiD4BPRzAAFXIgsAAVbXANf14NgEAASbAAFXjARzAAFXjFsAAVcwuiSTAAEf+rw0CAAEcwABWC2rAAFX1XQPAAGwZAWADwABsGMAA3YYpAQABg8AAVgzANf2tAMAAbLgBlZQpwABBMWADwABAewDAAGx9TsAAVmzAAFaHAADAAEYiXQPAAGxXAWADwABDBgEewABWlcAAbHwAAWADwABDBgAATsAAVs0AAADAAEYjXQPAAGwZAWADwABDBgBEwABW4z4DPYzAAFbuwDX+wIHAAFcBwDX73j2JwABXEcA1+94xwABXMGADwABDBgBFwABXOgHAAFdDwABXRQAAgdRgA8AAbB8BkwEcwABXTIXAAFdKwDX/D4E6AQABFsAAV1+EwABXTsA1/sCA4MAAbGoAwABshQGNwABXZ8A1/w8cwABXaIXAAFdnwDX/D4E/AQABlADAAGyIPgZOwABXicAAV40AAIEsYAPAAEMGARzAAFefhMAAV4/ANf7AKQEAAYXAAFegwDX/DwDAAGy4TsAAV7rAAFfLAADAAEYkXQPAAGwZAWADwABALgEcwABX3YbAAFfZwDX/drggAQABgMAAV/XANfu8AMAAQxZOwABYEMAAWCcAAMAARiVgA8AAbFsBKUFFwABYNwHAAFhAwABYQgAAgdRgA8AAbB8BkwEcwABYSRTAAFhHwDYABQkAgToBAAEWwABYXIfAAFhLwDX/qoDgwABsagDAAGyFARXAAFhkwDYABQkcwABYZRTAAFhkwDYABQkAgT8BAAGUAMAAbIg+Ak7AAFh9wABYhwAAg1NgA8AAQC4BHMAAWJmHwABYicA1/6opAQABFMAAWJrANgAFCQAAwABsuEnAAFioIiIlwABYtgAUwABYrMA2AHEKAGADwABDBgAcwABY9hbAAFjvFsAAWOcUwABY3cA2AHEKAWADwABDBoEVwABDEKv5wABGuicBAAEuAMAAbF4AIRzAAFkrg8AAWRDANf6QKwEAARTAAFk0wDYAcQoBYAPAAEMGAMAAbHg+Aj0VwABZTsA1/+gIKkLAAFl6AD9JwABZnyIUwABZo8A1/+gIAAAWwABZwYbAAFm9wDX/dqxVwABAaj4BPRXAAFnWwDX/6AgcwABaGIPAAFn9wDX+kCsBAAEWwABaJYbAAFohwDX/dq/hwABAzwDAAGx4P0nAAFpAFMAAWkTANf/oCAA+Aj0cwABag4PAAFpowDX+kDYBAAGGwABah8A1/3YAwABsfT0cwABaly7AAEYmAwADhsAAWqzANf92h8AAWrHANf+qgsAAWsPANf14AMAAXZU+AT0cwABa/IHAAFrzwDX73jYBAAGGwABbAMA1/3YAwABsRyEcwABbPRbAAFs2hMAAWyXANf7AgODAAGxqJwEAARbAAFtJgcAAW0DANfvegODAAGxqAMAAbDJOwABbb8AAW3cAAIL3XQPAAGwZAWADwABDBgEcwABblIPAAFt5wDX+kICgAAAAAMAAbGZOwABbu8AAW80AAMAARiddA8AAbBkBYAPAAEMGAYTAAFvPwDX+wD0cwABcn4bAAFyNwDYCiIChAAAAAMAAbGhFwABcqwHAAFy0wABctgAAgdRgA8AAbB8BkwEcwABcvYfAAFy7wDYCzIE6AQABFsAAXNGGwABcv8A2AoiA4MAAbGoAwABshQGPwABc2cA2AswcwABc2ofAAFzZwDYCzIE/AQABlADAAGyIPgROwABc+cAAXP0AAIEsYAPAAEMGARzAAF0QhsAAXP/ANgKIKQEAAYfAAF0RwDYCzADAAGy4PRzAAF0iFsAAXRsugL7AAF18t9cBAAEUwABdLcA2AzMIAADAAEZ3PRzAAF1BhcAAXTnANgJVNgEAARTAAF1FwDYDMwgAAMAAbEc9HMAAXVUUwABdUcA2AzMIAKxgAwADHMAAXYhqwABda10DsucBYQMBYAPAAGwYYAOyz8AAbnCNbwEAARbAAF2aFMAAXZbANgMzCACvjsAAQNUAsusWwABdvBTAAF24wDYDMwgAic7AAE5kasAAXdJgA8AAbB8DAMAATEo9HMAAXe8WwABd6C6Ql8AASAOQxgEAASfAAEYoALVPSsAAXhUBhcAAXhzANgJVBsAAXZSBMcAAXizAAF4xwABg3AAAwABGKcAAXVwAAAABA8AAXkvAAGDcAAAAAgICwABeZgAAAIEsYAPAAEMGAMAAXngAAACHg2ADwABAewAAXAE+AT4CTsAAXr4AAAA8XQPAAGxKAWADwABOFAEWwABevh4AwABsLwEBXQPAAGwgAWADwABOFAEWwABevhbAAF64FsAAXquBwABeo8A2BJmEmMAAQIaa9sAAQn+BpsAAbKUAPcAAbEtFAAABHMAAXr6CAMA2BLE+AAAAAMAAbE0APgJOwABelAAAAI3JYAPAAEAuARbAAF7GggDANgSxQMAAbE8+AUnAAF7OIhbAAF7eg8AAXtLANgUuifrAAEA5ACEWwABe/IPAAF7wwDYFLoQ7wABASz4BPRzAAF8XgMAAXxPANgSJrGAEAAMcwABfZmrAAF8vXQOy5wFhAwFgA8AAbBhgA7LPwACR9o1vAQABFsAAX3yBwABfdMA2BJmvjsAAQDYAsusWwABfoIDAAF+cwDYEiYnOwABOZGrAAF+4YAPAAGwfAwGBMzHAAF/XYAOy7gEcwABgYRzAAGAlasAAX+ddA7LnAWEDAWADwABsGGADss/AAJJajW8BAAEWwABgO4HAAGAzwDYEma+OwABANgCy64uMAwADFsAAYJGDwABghcA2BS6DbcAAQDMWwABgpoPAAGCawDYFLonOwABANGrAAGCyYAPAAGwfAwCy1sAATEo/BsAAXZWBMcAAYOHAAGDmwABoGgAAwABGJgAAAAEDwABg+sAAaBoAAAADAwPAAGEOAAAAgSxgA8AAQwYAwABhJwAAAMAARiRdA8AAbBkBYAPAAEAuAMAAYUsAAADAAEYhXQPAAGxXAWADwABAewAAXAE+A0XAAGGrAcAAYbTAAGG2AACB1GADwABsHwGTARzAAGG9g8AAYbvANgb6gToBAAEWwABh0IHAAGG/wDYGvYDgwABsagDAAGyFAYvAAGHYwDYG+hzAAGHZg8AAYdjANgb6gT8BAAGUAMAAbIg+A07AAGHtwABh9wAAg1NgA8AAQC4BHMAAYgmBwABh+cA2Br0pAQABg8AAYgrANgb6AMAAbLhJwABiFCXAAGIiAITAAGIYwDYHYWADwABPBT4CTsAAYlLAAGJfAACxOmADwABPBQEmwABiUgGEwABiYcA2B2FgA8AATwU9jMAAYnTANgdhFsAAYo2FwABigMA2B7GxO8AATxM/ScAAYq8lwABivQCEwABis8A2B2FgA8AATE4+AT0cwABi24DAAGLXwDYGraxgAwADHMAAYvxqwABi5l0DsucBYQMBYAPAAGwYYAOyz8AAhG6NbwEAARbAAGMUFMAAYwrANgdhBAFgA8AATE6BiMAAQawAsusWwABjK4DAAGMnwDYGrYnOwABOZGrAAGM3YAPAAGwfAwDAAExKScAAY08iIRbAAGNgFsAAY1iAwABjVMA2Bq2BFcAAQxC3fsAAQUMAHMAAY5yCwABjicA2BtYrAQABhMAAY6XANgdhAMAAbHg+AT0cwABjv4DAAGO7wDYGraxgAwADHMAAZARqwABj110DsucBYQMBYAPAAGwYYAOyz8AAhNKNbwEAARbAAGQchMAAZBLANgdhr47AAEA2ALLrFsAAZECAwABkPMA2Bq2JzsAATmRqwABkWGADwABsHwMAwABMSj9OwABkxMAAZNAAAYNUYAPAAEGGARbAAGTWgMAAZNLANgatg1TAAEMKScAAZOchHMAAZPeDwABk68A2CVEnAQABKwDAAGxePgNOwABlDcAAZRwAAMAARipgA8AAbFsBKknAAGUrJcAAZTsAg8AAZS/ANglRYAPAAE5zPgNOwABlccAAZXkAAIeDYAPAAEGcARbAAGWHFMAAZXvANglRAwFgA8AATnOatsAATnhJwABlnCXAAGWoAIXAAGWgwDYJzGADwABPBT4CTsAAZdrAAGXnAACxOmADwABPBQEmwABl2gGFwABl6cA2CcxgA8AATwU9jcAAZfzANgnMFsAAZhOGwABmBsA2ChixO8AATxM/ScAAZjklwABmRQCFwABmPcA2CcxgA8AAQHs+Aj2MwABmYsA2CZkpPRzAAGaDLsAARinAAF1cAgACgMAAZp7ANgatFMAAZqPANgnMBQFgA8AAQHsAwABdlD8/ScAAZsUhhMAAZsrANgmZPgE9HMAAZ3yAwABneMA2Bq2sYAMAAxzAAGepasAAZ5RdA7LnAWEDAWADwABsGGADss/AAJGSjW8BAAEWwABnw4PAAGe3wDYJUa+OwABBjACy6xbAAGfngMAAZ+PANgatic7AAE5kasAAZ/9gA8AAbB8DAMAATEo/PwbAAF2WgTHAAGgfwABoOMAAdN8AALldAAAAAQPAAGhGwAB03wAAAAEBAcAAaFQAAACJS2ADwABAewAAXQPAAGwZAWADwABDBgE+BT0cwABoZy7AAEYfAQABgMAAaIHANgtrAMAAXZFOwABorMAAaLQAAIL3XQPAAGwZAWADwABDBgEcwABoti7AAEYgAQABgMAAaMzANgtrAMAAXZI9HMAAaYAWwABpdy6r/cAAR/aBsQEAATTAAGmIA8AAaYjAAHSBAAAAAgICwABpjQAAAIFMYAPAAGxYAMAAaaEAAACBFWADwABBCQAAYAHAAGxcAT4BScAAabIiJcAAab4Ag8AAabbANgwZYAPAAEa3ABzAAGnoFsAAaeEUwABp2cA2DBkDAWADwABGt6v5wABGuicBAAEuAMAAbF4+AknAAGoVFsAAaikWwABqIRTAAGoZwDYMGQMBYAPAAEa3rDnAAEbAIsAAbCI+BE7AAGpbAAAAwABGK10DwABsXwJgA8AAbBhdA8AAbBkBYAPAAEIdAE7AAGp5wABqhgAAwABGLGADwABsWwEqPgJOwABqtwAAADxdA8AAbEoBYAPAAEIdARbAAGq3HgDAAGwvAQFdA8AAbCABYAPAAEIdARbAAGq3FMAAaq/ANgwZAwFgA8AARresOcAARsAAPcAAbEtFAAABHMAAareGAMA2DOo+AAAAAMAAbE0APgJOwABqpQAAAIRcYAPAAEIdARbAAGrAhgDANgzqQMAAbE8+Ak7AAGrVwABq2gAAgYhgA8AAbBgBNcAAauMAAAEAYAPAAGwYATXAAGrjAAABAGADwABBCQEWwABq44fAAGrcwDYNWaw7wABCICMcwABq4xTAAGrjwDYNoAgAJwEAASsAwABsXisWwABq7RTAAGrjwDYNoAgAgYjAAE5dAWADwABsGCMcwABq4xTAAGrjwDYNkAgAJwEAASsAwABsNicAFMAAauPANg2QCAABYAPAAGwYScAAawUhHMAAaw4UwABrCcA2DXwIACcBAAEnAADAAGw2PgQ9IxzAAGszhMAAayXANgyqJwEAASsAwABsXozAAGslwDYMqh7AAGs7wABslgACYAPAAGwYXQPAAGwZAWADwABCHQAAKwFdA8AAbF8CYAPAAGwYXQPAAGwZAWADwABCHU7AAGtzwABrewAArDldA8AAbBkBYAPAAEIdATXAAGt9AAABAF0DwABsXwJgA8AAbBhdA8AAbBkBYAPAAEIdAYTAAGt9wDYMqjXAAGuLAAABAGADwABsGAEUwABri8A2DXwIADXAAGuKAAABAF0DwABsGQFgA8AAQh0BHMAAa4oUwABrfcA2DskJACkBAAEUwABri8A2DvYKAADAAGxhIxzAAGuRFMAAa4rANg8RCwAnAQABKwDAAGxiNcAAa50AAAEAXQPAAGwZAWADwABCHQExwABrnWADwABCHQA1wABrigAAAQBcARzAAGuKFMAAa33ANg7JCQCAnAIAAhTAAGuLwDYO9goAFMAAa53ANg9nDAAAwABsYxTAAGudwDYPZwwAFMAAa4rANg8RCwABXQPAAGwZAWADwABCHT0cwABrtxTAAGuvwDYOrgkANgEAAYfAAGu7wDYNWQDAAGxHScAAa9IhHMAAa+oWwABr4RzAAGvdFMAAa9bANg6uCQApAQABkwDAAGy4rDvAAEIgJwEAARbAAGv0h8AAa+3ANg1ZrDvAAEIgAMAAbF49jcAAa/7ANgzRKT8/ScAAbDeFwABsO8A2DNE+AT4CTsAAbHkAAAA8XQPAAGxKAWADwABsGAEWwABseR4AwABsLwEBXQPAAGwgAWADwABsGAEWwABseYTAAGxrwDYMqoCfwABsZQA9wABsS0UAAAEcwABseYYAwDYQeD4AAAAAwABsTQA+Ak7AAGxjAAAAgYhgA8AAbBgBFsAAbH+GAMA2EHhAwABsT0E+BU7AAGycwABspAAArDldA8AAbBkBYAPAAEIdARzAAGyzhMAAbKbANgyqKQEAAYfAAGy0wDYQ3wDAAGxhScAAbMkcwABs3BbAAGzVFMAAbM3ANhEDCACA4MAAbGqBOgEAAZUAwABshULAAGzhAD9OwABtDsAAbRYAAIEzXQPAAGwZAWADsu4BMcAAbShgA7LuAD4CTsAAbVgAAAA8XQPAAGxKAWADwABCHQEWwABtWB4AwABsLwEBXQPAAGwgAWADwABCHQEcwABtWBTAAG1QwDYRAwgAlSMBAAGUAMAAbhwAPcAAbEtFAAABHMAAbVgUAMA2EZUKAD4AAAAAwABsTQA+Ak7AAG1GAAAAhFxgA8AAQh0BFsAAbWEUAMA2EZUKAEDAAGxPPgE9HMAAbXsUwABtc8A2EXAJADYBAAEcwABt5BzAAG27asAAbX9dA7LnAWEDAWADwABsGGADss/AAHdrjW8BAAGHwABtycA2EN8AsuuLjAMAA4LAAG3xwDYMCRbAAG39FMAAbfbANhIFCwCJzsAAQiJqwABuCWADwABsHwMAstYAwABsRz0cwABuOxTAAG4zwDYMGQMBYAPAAEa3rGAFAAQcwABueWrAAG5ZXQOy5wFhAwFgA8AAbBhgA7LPwAB3B41vAQABh8AAbofANhDfALLrFsAAbqscwABupxTAAG6gwDYRAwgAKQEAAZMAwABsuInOwABCImrAAG7JYAPAAGwfA4LAAG7lwDYMCQGBMxTAAG8FwDYRcAkAwABHEj8/ScAAb1YWwABvahbAAG9iFMAAb1rANgwZAwFgA8AARreU38AARr8iwABsIj4ETsAAb5wAAADAAEYtXQPAAGxfAmADwABsGF0DwABsGQFgA8AAQiwATsAAb7oAAADAAEYuYAPAAGxbAD4CTsAAb/AAAAA8XQPAAGxKAWADwABCLAEWwABv8B4AwABsLwEBXQPAAGwgAWADwABCLAEWwABv8BTAAG/owDYMGQMBYAPAAEa3lN/AAEa/AD3AAGxLRQAAARzAAG/whgDANhOxPgAAAADAAGxNAD4CTsAAb94AAACEW2ADwABCLAEWwABv+YYAwDYTsUDAAGxPPgJOwABwDsAAcBMAAIGIYAPAAGwYATXAAHAcAAABAGADwABsGAE1wABwHAAAAQBgA8AAQQkBFsAAcByHwABwFcA2FCCJ7MAAQi8jHMAAcBwUwABwHMA2FGcIACcBAAErAMAAbF4rFsAAcCYUwABwHMA2FGcIAIGIwABOXQFgA8AAbBgjHMAAcBwUwABwHMA2FFcIACcBAAErAMAAbDYnABTAAHAcwDYUVwgAAWADwABsGEnAAHA+IRzAAHBHFMAAcELANhRDCAAnAQABJwAAwABsNj4EPSMcwABwbITAAHBewDYTdScBAAErAMAAbF6MwABwXsA2E3UewABwdMAAbJYAAmADwABsGF0DwABsGQFgA8AAQiwAACsBXQPAAGxfAmADwABsGF0DwABsGQFgA8AAQixOwABwrMAAcLQAAJTfXQPAAGwZAWADwABCLAE1wABwtgAAAQBdA8AAbF8CYAPAAGwYXQPAAGwZAWADwABCLAGEwABwtsA2E3U1wABwxAAAAQBgA8AAbBgBFMAAcMTANhRDCAA1wABwwwAAAQBdA8AAbBkBYAPAAEIsARzAAHDDFMAAcLbANhWQCQApAQABFMAAcMTANhW9CgAAwABsYSMcwABwyhTAAHDDwDYV2AsAJwEAASsAwABsYjXAAHDWAAABAF0DwABsGQFgA8AAQiwBMcAAcNZgA8AAQiwANcAAcMMAAAEAXAEcwABwwxTAAHC2wDYVkAkAgJwCAAIUwABwxMA2Fb0KABTAAHDWwDYWLgwAAMAAbGMUwABw1sA2Fi4MABTAAHDDwDYV2AsAAV0DwABsGQFgA8AAQiw9HMAAcPAUwABw6MA2FXUJADYBAAGHwABw9MA2FCAAwABsR0nAAHELIRzAAHEjFsAAcRocwABxFhTAAHEPwDYVdQkAKQEAAZMAwABsuInswABCLycBAAEWwABxLYfAAHEmwDYUIInswABCLwDAAGxePY3AAHE3wDYTnCk/P0nAAHFwIRzAAHGBhcAAcXTANhOcJwEAASsAwABsXj4BPgJOwABxugAAADxdA8AAbEoBYAPAAGwYARbAAHG6HgDAAGwvAQFdA8AAbCABYAPAAGwYARbAAHG6hMAAcazANhN1gJ/AAGxlAD3AAGxLRQAAARzAAHG6hgDANhdPPgAAAADAAGxNAD4CTsAAcaQAAACBiGADwABsGAEWwABxwIYAwDYXT0DAAGxPQT4FTsAAcd3AAHHlAACU310DwABsGQFgA8AAQiwBHMAAcfSEwABx58A2E3UpAQABh8AAcfXANhe2AMAAbGFJwAByChzAAHIdFsAAchYUwAByDsA2F9oIAIDgwABsaoE6AQABlQDAAGyFQsAAciIAP07AAHJPwAByVwAAgTNdA8AAbBkBYAOy7gExwAByaWADsu4APgJOwABymQAAADxdA8AAbEoBYAPAAEIsARbAAHKZHgDAAGwvAQFdA8AAbCABYAPAAEIsARzAAHKZFMAAcpHANhfaCACVIwEAAZQAwABuHAA9wABsS0UAAAEcwABymRQAwDYYbAoAPgAAAADAAGxNAD4CTsAAcocAAACEW2ADwABCLAEWwAByohQAwDYYbAoAQMAAbE8+AT0cwAByvBTAAHK0wDYYRwkANgEAARzAAHMlHMAAcvxqwABywF0DsucBYQMBYAPAAGwYYAOyz8AAeCONbwEAAYfAAHMKwDYXtgCy64uMAwADgsAAczLANgwJFsAAcz4UwABzN8A2GNwLAInOwABCNWrAAHNKYAPAAGwfAwCy1gDAAGxHPRzAAHN8FMAAc3TANgwZAwFgA8AARresYAUABBzAAHO6asAAc5pdA7LnAWEDAWADwABsGGADss/AAHe+jW8BAAGHwABzyMA2F7YAsusWwABz7BzAAHPoFMAAc+HANhfaCAApAQABkwDAAGy4ic7AAEI1asAAdApgA8AAbB8DgsAAdCbANgwJAYEzFMAAdEbANhhHCQDAAEcSPz8/AMAAbLA9HMAAdI8WwAB0iC6Ql8AASAOQxgEAASfAAEYvALVPSsAAdM0BgcAAdNTANgupBsAAXZeBMcAAdOTAAHTpwAB3OwAAq5MAAAABA8AAdPfAAHc7AAAAAAAAAFwBPgI9HMAAdQkWwAB1AC6r/cAAR/aBsQEAATTAAHURA8AAdRHAAHcRAAAAAgICwAB1FgAAAIFMYAPAAGxYAMAAdSoAAACBFWADwABBCQAAYAHAAGxcAT4BScAAdTscwAB1ThbAAHVHgcAAdT/ANhq8q/nAAEEUJwEAAS4AwABsXj4DTsAAdXbAAHWEAADAAEYLYAPAAEa3ASbAAHV2AYHAAHWGwDYavGADwABGt07AAHWfwAB1pgAAgL5gA4KSARzAAHW2gsAAdajANhsBrI4BAAEWwAB1vC6JJMAAR/4AwABG/0nAAHXSIRbAAHXfgcAAddfANhq8rFXAAEBGPgJJwAB19CEcwAB2FRbAAHYGgsAAdfjANhsBrDLAAEbbJwEAASsAwABsXj4CPSMcwAB2PxbAAHYsLonmwABdaScBAAErAMAAbF4XwAB2LC6J5h/AAHZHnD4AAAAAwABdaSsBYAOcNj0cwAB2fBbAAHZpLonmwABdaZZbAgACg8AAdp/ANhssFsAAdrWCwAB2p8A2GwG4GcAARtwAnDs/PRzAAHbtFsAAduMugRTAAEf4NgEAAYPAAHbxwDYbLADAAGxHPz8AwABssD0cwAB3HxbAAHcYLpCXwABIA5DGAQABJ8AARjAAtU8GwABdmIExwAB3QMAAd0rAAHqIAADAAEYxAAAAAQPAAHdewAB6iAAAAAAAAABgA4sqAT4FTsAAd3TAAHd+AACBFF0DwABsVwFgA4KSAR7AAHeEwABsfAABYAOCkgAATsAAd6bAAHevAACcnl0DwABsGQFgA4KSATHAAHe6YAOCkgA9HMAAd8sWwAB3wi6r/cAAR/aBsQEAATTAAHfTA8AAd9PAAHk1AAAAAgICwAB32AAAAIFMYAPAAGxYAMAAd+wAAACscWADwABBCQAAYAHAAGxcAT4BScAAeAQiIRbAAHgYg8AAeAnANh0grFXAAEBGACIiHMAAeEQWwAB4PYPAAHguwDYdIKv5wABBFCcBAAEuAMAAbF4BHMAAeH0WwAB4dhbAAHhsg8AAeF3ANh0ggWfAAEEWgSLAAGyAJwEAASeBIwDAAGw2ARzAAHing8AAeJjANh0gJwEAARbAAHivLoFpwABH/wDAAGxePgFJwAB4wRzAAHjPgMAAeMXANhyZNgEAARbAAHjig8AAeNPANh0ggRXAAEEVAMAAbH0+AT0cwAB5AYHAAHj4wDYcwzYBAAEWwAB5FIPAAHkFwDYdIIEVwABBFQDAAGxHPz8AwABssEPAAHk8FsAAeUyBwAB5Q8A2HMMiwABsIj4CTsAAeWjAAHlwAACBFWADgpIBHMAAeXuBwAB5csA2HMODkwAAAADAAG0EPgJOwAB5vAAAADxdA8AAbEoBYAOCzQEWwAB5vB4AwABsLwEBXQPAAGwgAWADgs0BFsAAebyCwAB5tMA2HlKEMYKjAD3AAGxLRQAAARzAAHm8gwDANh5+PgAAAADAAGxNAD4CTsAAeaYAAACEa2ADgs0BFsAAecqDAMA2Hn5AwABsTz4BScAAedQcwAB54oDAAHnYwDYcmTYBAAEWwAB58YTAAHnmwDYe34RegtgAwABsfT4BPRzAAHoWgcAAeg3ANhzDNgEAARbAAHolhMAAehrANh7fhF6C2ADAAGxHP0rAAHpRATXAAHpcAAABAGADiyoBH8AAelyLQwAAAAA1wAB6cwAAAQBcARzAAHpzFsAAemmCwAB6XMA2H2GBFIsugTQBAAGAwAB6esA2HJkAwABtBYLAAHpcwDYfYQbAAF2ZgTHAAHqNwAB6ksAAfmQAALljAAAAAQPAAHqiwAB+ZAAAAAAAAABcAT4GTsAAesbAAHrcAADAAEYyXQPAAGwZAWADwABdsgExwAB63mADwABdsgBOwAB7AMAAexYAAIEtXgMAAwMDYAODMmADikFgA4pBAAFXA4FrAFwBNMAAeyADwAB7IMAAe8gAAAADAwPAAHsnAAAAgSxgA4MyAMAAezYAAACAomADikEAwAB7QwAAAICjYAOKQQAAYAHAAGxcAT4BScAAe04hHMAAe2iAwAB7UsA2H+cnAQABKwDAAGxiPgE9HMAAe5GAwAB7e8A2H+c2AQABH8AAe5nAAF24AwADgcAAe67ANiBLgsAAe7PANiBZg8AAe7bANiBnAADAAGxHP0nAAHvOHMAAe9wWwAB70i6BFsAAXWonAQABKwDAAGxePgE9F8AAe+0ugRYewAB7/YF3AwACHMAAfAwuwABGMQAAAADAAF2YFsAAfCQugJDAAF15AYEtgcAAfFDANiAQwABdaj4EPRfAAHyFFsAAfHsugRbAAF1qgS2BwAB8ncA2IBCBek7AAHzEwAB8zgAAgI1gA4sqARzAAHzQLsAARjEAAAAAwABdmD0XwAB8+BbAAHzuLoEWwABdaoCQFsAAfQQugJDAAF15gXk9HMAAfR8WwAB9FS6BFsAAXWqC8gMAAmrAAH0wXQPAAGwZAWADgpLAANybFsAAfUSCwAB9OsA2IWWBFIsuAYL1gsAAfXjANiFlgY0+Ak7AAH2yAAAAPF0DwABsSgFgA8AAXbIBFsAAfbIeAMAAbC8BAV0DwABsIAFgA8AAXbIBgMAAfbLANh/nAD3AAGxLRQAAARzAAH2yggDANiH4PgAAAADAAGxNAD4CTsAAfagAAADAAEBkYAPAAF2yARbAAH3JggDANiH4QMAAbE8+AT0cwAB90S7AAEYzAwADFsAAffKDwAB968A2IlSBLMAAXbQWwAB9/oPAAH33wDYiVICiwABdtRbAAH4Ig8AAfgHANiJUgKPAAF22AMAAXZo9iMAAfhbANh/nKz0cwAB+PxbAAH44LpCXwABIA5DGAQABJ8AARjQAtU8GwABdmoExwAB+acAAfm7AAH+dAADAAEYzAAAAAQPAAH6HwAB/nQAAAAMDA8AAfo4AAACBLGADgzIAwAB+nQAAAICiYAOKQQDAAH6qAAAAgKNgA4pBAABcAT4BPRzAAH6zLqxgBAAEHMAAfuNqwAB+x10DsucBYQMEYAPAAGwYYAOJVWADiVVgA8AAbFtgA7LPkr2NbwQABBbAAH71gMAAfvHANiMdgYiDOBbAAH79gcAAfvvANiMrg2mKRxbAAH8cgsAAfxrANiM5g2mKRxbAAH9CFsAAfzGAwAB/LcA2Ix2DiYNlg1aCrwCy6xbAAH9ngMAAf2PANiMdhAGCWWrAAH97YAPAAGwfAxbAAH+RgMAAf43ANiMdg22DQQDAAEgOBsAAXZuBMcAAf6LAAH+nwAB/5wAAgSsAAAABA8AAf8DAAH/nAAAAAwMDwAB/xwAAAIEsYAODMgDAAH/WAAAAgKJgA4pBAMAAf+MAAACAo2ADikEAAFwBPgAGwABdnIExwAB/7MAAf/HAAINeAAC5YQAAAAEDwACAAcAAg14AAAABAQHAAIAMAAAAgI1gA4sqAABcAT4GQBzAAIAvFsAAgCQuwABEv8AAXVzAAF1sJwEAASsAwABsXsAAgCTAAIA2ASfAAEY1PRfAAIBkLsAARL/AAF1cH8AAgHWOaQEAAYDAAIB/wDYklQDAAF1sPRfAAIGyLq9jH8AAgceJvAMAAxbAAIHfFsAAgdUugJDAAF15iSeN12rAAIIAYAOJR4UtMcAAghdgA4lVAWrAAIIeYAOJnIY4AMAAXW49F8AAgjIur2cfwACCSYm8AwADFsAAgmEWwACCVy6AkMAAXXmJNI3fasAAgoRgA4lHhS0xwACCm2ADiVUBasAAgqJgA4mchjgAwABdbz0XwACCti6vZR/AAILLibwDAAMWwACC4xbAAILZLoCQwABdeYlUjfZqwACDBGADiUeFLTHAAIMbYAOJVQFqwACDImADiZyGOADAAF1wPRzAAIM+FsAAgzcukJfAAEgDkMYBAAEnwABGNgC1TwbAAF2dgTHAAINjwACDaMAAhH4AALcHAAAAAQPAAIN3wACEfgAAAAEBAcAAg5EAAADAAEY3XQPAAGwZAWADwABDBgAAXAE+Aj4CTsAAg8kAAAA8XQPAAGxKAWADwABDBgEWwACDyR4AwABsLwEBXQPAAGwgAWADwABDBgGAwACDycA2Ji8APcAAbEtFAAABHMAAg8mBAMA2JlA+AAAAAMAAbE0APgJOwACDvgAAAIeDYAPAAEMGARbAAIPYgQDANiZQQMAAbE8+AUnAAIPgIhzAAIP7FsAAg/QWwACD7ILAAIPkwDYmrIEVwABDEKv5wABGuicBAAEuAMAAbF4AIRbAAIQPgsAAhAfANiasrFXAAEBqPgE9HMAAhCqCwACEIsA2Jqy3BwEAARbAAIQ6LoCQwABdeQDAAEDkPz0cwACEXxbAAIRYLpCXwABIA5DGAQABJ8AARjgAtU8GwABdnoExwACEg8AAhIjAAIXpAAC5ZQAAAAEDwACEksAAhekAAAAAAAAAXAE+Aj0cwACEpBbAAISbLqv9wABH9oGxAQABNMAAhKwDwACErMAAhZsAAAACAgLAAISxAAAAgUxgA8AAbFgAwACExQAAAIEVYAPAAEEJAABgAcAAbFwBPgFJwACE1iXAAITiAIHAAITawDYnyWADwABGtz4BScAAhQUcwACFGBbAAIURFMAAhQnANifJAQFgA8AARrer+cAARronAQABLgDAAGxePgE9HMAAhUQUwACFLcA2J8kBAWADwABGt7cJAQABFsAAhWwWwACFWC6u5MAAXXGu6cAAW4MAwABHRD8/AMAAbLA9HMAAhakWwACFoi6Ql8AASAOQxgEAASfAAEY5ALVPBsAAXZ+BMcAAhe7AAIXzwACH3AAAuWYAAAABA8AAhgHAAIfcAAAAAQEBwACGGwAAAMAARjddA8AAbBkBYAPAAEMGAABcAT4GTsAAhkvAAIZaAADAAEM5XQPAAGwZAWADwABafgEcwACGhBbAAIZ1FsAAhmQurCPAAF1owABDOcAAWdqAoAAAAADAAGxmPRzAAIayFsAAhqMWwACGki6sI8AAXWjAAEM5wABZ2o3/AAAAAMAAbZ9FwACGvwHAAIbIwACGygAAgdRgA8AAbB8BkwEcwACG0YLAAIbPwDYpS4E6AQABFsAAhuKBwACG08A2KNiA4MAAbGoAwABshQGKwACG6sA2KUscwACG64LAAIbqwDYpS4E/AQABlADAAGyIPgE9HMAAhwkcwACHBYHAAIb3wDYo2CkBAAGCwACHBsA2KUsAwABsuI6JAQABFsAAhw8urCPAAF1oAMAAWoQ9HMAAhzMWwACHLC6Ql8AASAOQxgEAASTAAIdlAyfAAEY6FsAAh1OBwACHRMA2KNiA4MAAbGonwABGOwC1Tz01wACHbQAAAQBgA8AAW48BFsAAh20uruTAAF1xIxzAAIdtgsAAh23ANiotJwEAASsAwABsXiscwACHgoLAAIdtwDYqLcAARKIAAAAAwABbigFcPRzAAIeyFsAAh6sukJfAAEgDkMYBAAEnwABGPAC1TwbAAF2ggTHAAIfhwACH5sAAirAAALlnAAAAAQPAAIf6wACKsAAAAAEBAcAAiBQAAADAAEY3XQPAAGwZAWADwABDBgAAXAE+B07AAIg9wACIUQAAwABDOl0DwABsGQFgA8AAWocBHMAAiIAWwACIbBbAAIhbLqwjwABdaMAAQzrAAFnbgKAAAAAAwABsZj0cwACIsxbAAIifFsAAiI4urCPAAF1owABDOsAAWduN/wAAAADAAG2fTsAAiMvAAIjaAADAAEY9XQPAAGxXAWADgzIBHsAAiODAAGx8AAFgA4MyAABFwACI8gHAAIj7wACI/QAAgdRgA8AAbB8BkwEcwACJBIPAAIkCwDYrhYE6AQABFsAAiRqBwACJBsA2KuaA4MAAbGoAwABshQGLwACJIsA2K4UcwACJI4PAAIkiwDYrhYE/AQABlADAAGyIPgI9HMAAiUYcwACJQoHAAIkvwDYq5ikBAAGDwACJQ8A2K4UAwABsuI6JAQABFsAAiUwurCPAAF1oAMAAWpw9HMAAiXSCwACJZcA2K1Q2AQABFsAAiZwWwACJjxzAAImLgcAAiXjANirmKQEAAYPAAImMwDYrhQDAAGy4rITAAFqJgSzAAECPAMAAbH09HMAAibMWwACJrC6Ql8AASAOQxgEAASTAAIoFAyfAAEY+FsAAieKBwACJzsA2KuaA4MAAbGonwABGPwC1Tz0cwACKFxbAAIoNLoEWwABdaoL2AgABgsAAiirANitUAYL4KoGOPRzAAIpnFsAAilcukJfAAEgDkMYBAAEkwACKqwMnwABGQBbAAIqHgsAAinjANitUgODAAG4hJ8AARkEAtU8GwABdoYExwACKtcAAirrAAIxUAAC3FwAAAAEDwACK08AAjFQAAAABAQHAAIrtAAAAwABGN10DwABsGQFgA8AAQwYAAFwBPgI+Ak7AAItdAAAAPF0DwABsSgFgA8AAQwYBFsAAi10eAMAAbC8BAV0DwABsIAFgA8AAQwYBgMAAi13ANi1BAD3AAGxLRQAAARzAAItdgQDANi1iPgAAAADAAGxNAD4CTsAAi1IAAACHg2ADwABDBgEWwACLbIEAwDYtYkDAAGxPPgFJwACLdCIcwACLjxbAAIuIFsAAi4CCwACLeMA2Lb6BFcAAQxCr+cAARronAQABLgDAAGxeACEWwACLo4LAAIubwDYtvqxVwABAaj4BPRzAAIu+gsAAi7bANi2+txcBAAEWwACL+RbAAIvlLq7kwABdca7pwABbgwDAAED8Pz0cwACMKhbAAIwjLpCXwABIA5DGAQABJ8AARkIAtU8GwABdooExwACMWcAAjF7AAI7QAAC4NgAAAAEDwACMd8AAjtAAAAABAQHAAIyRAAAAwABGN10DwABsGQFgA8AAQwYAAFwBPgVJwACM3iEWwACM+BbAAIzqFsAAjOMugL7AAF18rt7AAFlxid6OnUrAAI0WAD9OwACNL8AAjT4AAMAARj1dA8AAbBkBYAODMgEewACNRMAAbHYBAWADgzIBkwA+Ak7AAI16AAAAPF0DwABsSgFgA8AAQwYBFsAAjXoeAMAAbC8BAV0DwABsIAFgA8AAQwYBgMAAjXrANi6mAD3AAGxLRQAAARzAAI16ggDANi8hPgAAAADAAGxNAD4CTsAAjW8AAACHg2ADwABDBgEWwACNiYIAwDYvIUDAAGxPPgFJwACNkSIcwACNrBbAAI2lFsAAjZ2DwACNlcA2L32BFcAAQxCr+cAARronAQABLgDAAGxeACEWwACNwIPAAI24wDYvfaxVwABAaj4BScAAjdMcwACN34PAAI3XwDYvfbg2AgACFsAAjfkugL7AAF18FsAAjgEugRbAAF1qAMAAQx4+AT0cwACOKIHAAI4ZwDYu8jYBAAEWwACONIPAAI4swDYvfYEswABDDwDAAGxHPz89HMAAjmAWwACOVi6BFsAAXWqC9gIAAYHAAI5zwDYu8gGC+CmBjj0cwACOphbAAI6fLpCXwABIA5DGAQABJ8AARkMAtU8GwABdo4ExwACO1cAAjtrAAJCbAAC5aAAAAAEDwACO5cAAkJsAAAABAQHAAI7/AAAAwABGN10DwABsGQFgA8AAQwYAAFwBPgI+Ak7AAI83AAAAPF0DwABsSgFgA8AAQwYBFsAAjzceAMAAbC8BAV0DwABsIAFgA8AAQwYBgMAAjzfANjC/AD3AAGxLRQAAARzAAI83gQDANjDgPgAAAADAAGxNAD4CTsAAjywAAACHg2ADwABDBgEWwACPRoEAwDYw4EDAAGxPPgFJwACPTiIcwACPaRbAAI9iFsAAj1qCwACPUsA2MTyBFcAAQxCr+cAARronAQABLgDAAGxeACEWwACPfYLAAI91wDYxPKxVwABAaj4CTsAAj5bAAI+jAACEoWADgzIBFsAAj7EWwACPrYLAAI+lwDYxPIEswABDD4Shg11JwACPxyIhHMAAj9iDwACPy8A2MasnAQABKwDAAGxeABbAAI/wg8AAj+PANjGrhJuDVj4BPRzAAJAYgsAAkBDANjE8txMCAAIWwACQLi6BFsAAXWoWwACQOS6AkMAAXXkAwABA9z8/PRzAAJBoFsAAkGEukJfAAEgDkMYBAAEnwABGRAC1TwbAAF2kgTHAAJCgwACQpcAAk3wAALcAAAAAAQPAAJC8wACTfAAAAAEBAcAAkMcAAACAkGADjTwAAFwBPgE9HMAAkOEWwACQ2C6r/cAAR/aBsQEAATTAAJDpA8AAkOnAAJN3AAAAAgICwACQ7gAAAIFMYAPAAGxYAMAAkQIAAACBFWADwABBCQAAYAHAAGxcAT4BScAAkRMcwACRJhbAAJEfgsAAkRfANjLXq/nAAEEUJwEAAS4AwABsXj4DPRzAAJFBgsAAkTnANjLXtwAAAAAAwABBNU7AAJF2wACRfwAAPV0DwABsSgFgA8AAQC4BFsAAkYmCwACRgcA2Mtc9wABBF0PAAJGbHMAAkauDwACRosA2MzU+AAAAAMAAbE0+Ak7AAJHLwACR1wAAmrZgA8AAQC4BFsAAkeKDwACR2cA2MzVAwABsT0nAAJH1JcAAkgUAhMAAkfnANjOAYAPAAEB7PgE9HMAAkjAUwACSJMA2M4AEAWADwABAe7cAAgACgsAAkkjANjLXgMAAklHANjKJAMAAQJhJwACSbiXAAJJ+AITAAJJywDYzgGADwABMaD4BPRzAAJKtFMAAkqHANjOABAFgA8AATGi3AAIAAoLAAJLFwDYy14DAAJLOwDYyiQDAAExuScAAkuslwACS+wCEwACS78A2M4BgA8AAThQ+AT0cwACTJxTAAJMbwDYzgAQBYAPAAE4UtwACAAKCwACTP8A2MteAwACTSMA2MokAwABOIT8/AMAAbLAGwABdpYExwACTgcAAk4bAAJS6AAC5YgAAAAEDwACTmcAAlLoAAAACAgLAAJO6AAAAwABGN10DwABsGQFgA8AAQwYAwACT1gAAAIlLYAPAAEB7AABcAT4DPRfAAJPpLqwjHsAAlBLAAFnpBAAEgcAAlCHANjTdgMAAlC7ANjTELhbAAJRDLoCQwABdeQDAAF1oPTXAAJRTAAABAGADwABbjwEWwACUUy6u5MAAXXEjHMAAlFOCwACUU8A2NS0nAQABKwDAAGxeKxfAAJRogsAAlFPANjUtwABA8hbAAJR7LqwjwABdaMAAW38BYAPAAFnQPRzAAJSYFsAAlJEukJfAAEgDkMYBAAEnwABGRQC1TwbAAF2mgTHAAJS/wACUxMAAlSwAALlXAAAAAQPAAJTdwACVLAAAAAAAAABcAT4BPRfAAJTmLq7kH8AAlQDAAFuUAQABFsAAlRguwABAKcAAXXIAwABdcQbAAF2ngTHAAJUxwACVNsAAmssAALlkAAAAAQPAAJVOwACaywAAAAEBAcAAlWgAAADAAEY3XQPAAGwZAWADwABDBgAAXAE+Bz0cwACWhhbAAJZyLq7kwABdccAARKMCAAIWwACWli6AkMAAXXkWwACWoS6BFsAAXWoAwABbi07AAJbEwACW3QAAwABGRl0DwABsGQFgA8AATIQBMcAAlu1gA8AATIQAPgJOwACXHQAAADxdA8AAbEoBYAPAAEEJARbAAJcdHgDAAGwvAQFdA8AAbCABYAPAAEEJARbAAJcdFsAAlxQuq/3AAEf2gabAAGylAD3AAGxLRQAAARzAAJcdggDANjarPgAAAADAAGxNAD4CTsAAlwkAAACBFWADwABBCQEWwACXJYIAwDY2q0DAAGxPPgFJwACXLRzAAJdAFsAAlzmDwACXMcA2NxWr+cAAQRQnAQABLgDAAGxePgJOwACXZsAAl3wAAMAARkddA8AAbBkBYAPAAEyEARzAAJeSg8AAl4rANjcVt5cAAAAAwABBNknAAJe3IRzAAJfRhMAAl7vANjdiJwEAASsAwABsYj4BPRzAAJf/gcAAl+bANjaAgTQBAAGEwACYBsA2N2IAwABtBT8/RcAAmDsBwACYRMAAmEYAAIHUYAPAAGwfAZMBHMAAmE2CwACYS8A2N+CBOgEAARbAAJhogcAAmE/ANjaAgODAAGxqAMAAbIUBisAAmHDANjfgHMAAmHGCwACYcMA2N+CBPwEAAZQAwABsiD4BPRzAAJlAHMAAmTyBwACZJMA2NoApAQABgsAAmT3ANjfgAMAAbLi+sAAAAADAAEyWPRfAAJlsFsAAmVguruTAAF1xwABEoSnAAFuCPRfAAJpjFsAAmlkugRbAAF1qgS0WwACaey6BK8AAXZuBej0cwACaoRbAAJqaLpCXwABIA5DGAQABJ8AARkgAtU8GwABdqIExwACa0MAAmtXAAJ08AACvNAAAAAEDwACa68AAnTwAAAAEBATAAJr1AAAAhA1gA4JSAMAAmwAAAACu0GADwABsWwDAAJshAAAArs9gA8AAbFsAwACbPwAAAILfYAOCkgAAXAE+AknAAJtUgsAAm1jANjkaPgQ9IxzAAJuMFsAAm3YuwABF8cAAXXMnAQABKwDAAGxeF8AAm3YuwABF8R/AAJuUwABnigEAAS4AwABdcysBYAPAAGdMPRzAAJvNFsAAm7cuwABF8cAAXXOLKQEAAYPAAJvawDY5KgDAAGeHPRzAAJv1gMAAm/DANjj8g/gBAWADglIBFsAAm/wuwABF8cAAXXMAgls9HMAAnDAWwACcGi7AAEXxwABdc7MrAAAAAMAAZ4g/ScAAnEmBwACcTcA2OQo+BD0jHMAAnIEWwACcay7AAEXywABddCcBAAErAMAAbF4XwACcay7AAEXyH8AAnInAAGebAQABLgDAAF10KwFgA8AAZ4w9HMAAnMIWwACcrC7AAEXywABddIspAQABg8AAnM/ANjkqAMAAZ5g9HMAAnOqAwACc5cA2OPyD+AEBYAOCUgEWwACc8S7AAEXywABddACCWz0cwACdJRbAAJ0PLsAARfLAAF10sysAAAAAwABnmT8GwABdqYExwACdQcAAnUbAAKB0AACvEQAAAAEDwACdYMAAoHQAAAAEBATAAJ13AAAAgzVdA8AAbBkBYAOCUgDAAJ2IAAAArtBgA8AAbFsAwACdqQAAAK7PYAPAAGxbAMAAnc0AAACC32ADgpIAAFwBPgJJwACd4oLAAJ3mwDY7ED4ETsAAnhrAAJ4mAACNwmADwABnTAE1wACeMgAAAQBgA8AAZ0wBFsAAnjIuwABF8cAAXXMjHMAAnkiEwACeMsA2O1gnAQABKwDAAGxeF8AAnjIuwABF8R/AAJ5QwABnigEAAS4AwABdc4TAAJ4ywDY7WAFgA8AAZ0w9HMAAnn+EwACec8A2O0SLKQEAAYPAAJ6MwDY7IADAAGeHRcAAnqIBwACeq8AAnq0AAIHUYAPAAGwfAZMBHMAAnrSFwACessA2O+KBOgEAARbAAJ67gMAAnrbANjrrgODAAGxqAMAAbIUBjcAAnsXANjviHMAAnsOFwACexcA2O+KBPwEAAZQAwABsiD4BPRzAAJ7WgMAAntLANjrrgJwCAAKFwACe18A2O+IcwACe5BzAAJ7ggMAAntzANjrrKQEAAYXAAJ7hwDY74gDAAGy4g/gBAWADglIBhMAAnuvANjtEAIJbAMAAbMs9HMAAnxOEwACfB8A2O0SzKwAAAADAAGeIP0nAAJ8sgcAAnzDANjsAPgROwACfZMAAn3AAAI3CYAPAAGeMATXAAJ98AAABAGADwABnjAEWwACffC7AAEXywABddCMcwACfkoTAAJ98wDY84ycBAAErAMAAbF4XwACffC7AAEXyH8AAn5rAAGebAQABLgDAAF10hMAAn3zANjzjAWADwABnjD0cwACfyYTAAJ+9wDY8z4spAQABg8AAn9bANjsgAMAAZ5hFwACf7AHAAJ/1wACf9wAAgdRgA8AAbB8BkwEcwACf/oXAAJ/8wDY9bYE6AQABFsAAoAWAwACgAMA2OuuA4MAAbGoAwABshQGNwACgD8A2PW0cwACgDYXAAKAPwDY9bYE/AQABlADAAGyIPgE9HMAAoCCAwACgHMA2OuuAnAIAAoXAAKAhwDY9bRzAAKAuHMAAoCqAwACgJsA2OuspAQABhcAAoCvANj1tAMAAbLiD+AEBYAOCUgGEwACgNcA2PM8AglsAwABsyz0cwACgXYTAAKBRwDY8z7MrAAAAAMAAZ5k/BsAAXaqBMcAAoHnAAKCEwAChbAAAifMAAAABA8AAoJnAAKFsAAAABQUFwACgpQAAAIVJYAOFGgDAAKC2AAAAgYhgA8AAbBgAwACgzAAAAIGtYAOF5ADAAKDbAAAAhApgA8AAbB8AwACg6AAAAIn0YAPAAGxbAABgA4UaAT4BSsAAoPcBHMAAoRMWwAChBRbAAKD+LoC+wABdfK7ewABZcYnzBgAGFsAAoTIugJDAAF15gMAAoT3ANj5zgcAAoUfANj6BgsAAoU3ANj6Rg8AAoVjANj6fhMAAoWDANj6vAI6rBsAAXauBMcAAoXHAAKF8wACktQAAifUAAAABA8AAoZjAAKS1AAAADgQEwAChqwAAAIVJYAOFGgDAAKG8AAAAgYhgA8AAbBgAwAChzAAAAIGtYAOF5ADAAKHbAAAAhApgA8AAbB8ACsAAoe8AAACJ9mADwABsWwFqwACh+WADwABsWxzAAKILAAAAhP1gA8AAbFsBasAAohVgA8AAbFscwACiJwAAAIN/YAPAAGxbAWrAAKIxYAPAAGxbHMAAokMAAACJ92ADwABsWwFqwACiTGADwABsWxzAAKJeAAAAifhgA8AAbFsBasAAom9gA8AAbFscwACigQAAAIn5YAPAAGxbAWrAAKKMYAPAAGxbHMAAop4AAACJ9GADwABsWwFqwACip2ADwABsWxzAAKK5AAAAg71gA8AAbFsBasAAosNgA8AAbFscwACi1QAAAIn6YAPAAGxbAWrAAKLkYAPAAGxbHMAAovYAAACJ+2ADwABsWwFqwACjAmADwABsWxxgA4UaAT4BSsAAoxABHMAAoywWwACjHhbAAKMXLoC+wABdfK7ewABZcYn1DwAFFsAAo1IugJDAAF15gMAAo13ANj9UgcAAo2fANj9igsAAo23ANj9yg8AAo3jANj+ACon2hMAAo5LANj+RhP2FwACjrsA2P62Df4bAAKPKwDY/yYn3h8AAo+XANj/lifgUwACkB8A2QAEIAIn5FMAApCvANkAdCQCJ9BTAAKRHwDZAOQoAg70UwACkYsA2QFULAIn6FMAApIPANkBxDACJ+xTAAKSmwDZAjQ0AjqwGwABdrIExwACkusAApL/AAKYtAACsDAAAAAEDwACk2MAApi0AAAAAAAAAXAE+DD0XwACk4S6BFivAAF1qPRfAAKT3LqwjK8AAXWg9F8AApRQuruQrwABdcT01wAClNAAAAQBdA8AAbF8CYAPAAGxYYAPAAEEJARbAAKU0Lqv9wABH9iMcwAClNIDAAKU0wDZB3ycBAAErAMAAbF4rHMAApT6AwAClNMA2Qd+N/wAAAADAAG2ZAVw9NcAApUsAAAEAXQPAAGwZAWADgpIBFsAApUsugRTAAEf4IxzAAKVLgMAApUvANkI9JwEAASsAwABsYiscwAClVoDAAKVLwDZCPY3/AAAAAMAAbZ8BXD0XwAClYy6BaSvAAEf/PTXAAKV1AAABAF0DwABsXwJgA8AAbFhdA8AAbBkBYAPAAGwfARbAAKV1LqySwABdZyMcwACldYDAAKV1wDZCoScBAAErAMAAbF4rHMAApYKAwACldcA2QqGN/wAAAADAAG2ZAVw9NcAApY8AAAEAYAPAAEZfARbAAKWPLoC+wABdfCMcwAClj4DAAKWPwDZDBicBAAErAMAAbF4rHMAApZeAwAClj8A2QwasDAAAAADAAEaPAVw9F8AApbguwABEv8AAXVwrwABdbD0XwAClzy7AAEApK8AAXXI9F8AApesuwABF8SvAAF1zPRfAAKYNLsAARfIrwABddAbAAF2tgTHAAKYywACmS8AAp58AALuGAWrAAKYzYAPAAGxWgLUAAAEDwACmbcAAp58AAAABAQHAAKZ0AAAAgSxgA4MyAABgA8AAQHsBPgROwACmh8AAppUAAMAAQyFgA4KSARbAAKabgMAAppfANkPQg4mDZU7AAKbAwACmyAAAgRVgA8AAQQkBHMAAptIWwACmyi6r/cAAR/YpAQABFsAApuGBwACm08A2Q+mBZ4KUAMAAbGFJwACm8RzAAKb9gsAApvXANkQPJwEAASsAwABsXj4BSsAApw4BHMAApy4WwACnJxbAAKccFsAApxUugL7AAF18rKLAAEZjq/nAAEIRu4YBAAGAwACnUcA2Q9AAwABZWj9KwACnYQEmwACnYQEcwACncILAAKdowDZED68NAgABFsAAp4aAwACngsA2Q9CBiIM4AZWUKcAAQTFgA8AAQHsGwABdroExwACnpMAAp7zAAKgZAAC3swFqwACnpWADwABsVoC1AAABA8AAp87AAKgZAAAAAQEBwACn2AAAAIGXYAOJVQAAYAPAAEGGAT4BSsAAp+QBHMAAp/CAwACn68A2RSSD+AEBYAPAAEGGAR/AAKf7wABmqQEAAS4AAIlXBsAAXa+BMcAAqB7AAKgqwACouAAAwABEmQAAAAEDwACoQ8AAqLgAAAACAgLAAKhYAAAAg8FgA8AATIQAwACobAAAAK7CYAPAAFCPAABgA7Y2AT4BSsAAqIABH8AAqIu3cgIAAoDAAKigwDZFmIHAAKinwDZFqAAAADXEWgA1xKYANcTyADXFVwA1xeIANcYPADXQ3wA10sEANdO5ADXWOwA12pQANd+7ADXf+gA14GgANeQ8ADXqzAA17XgANe7ZADXwCgA18UAANfJ3ADXz3wA19RUANfaWADX3zAA1+QIANfuQADYEWQA2BoEANgtBADYaUgA2HGQANh+3ADYi8QA2JBIANiRrADYmBQA2J18ANiiPADYqnQA2LRcANi58ADYwlQA2Ml8ANjSaADY1qgA2NgEANjjSADY6wQA2PkkANj8qADZBhAA2Q5kANkTtADZFbAA2ReMAAAA3AsAAXbKBMcAAs8jAALPOwAC0W4PAAEZJAAABYAPAAGxWAAADBMAAXbSBMcAAs/PAALP2CYEsAGADgzIABMAAXbWBMcAAtArAALQLCYCiAGADikEABMAAXbaBMcAAtB/AALQgCYCjAGADikEAAQXAAF24gTHAALQlwAC0K8AAtFkBAAADwAC0P8AAtFkAAAADAwPAALRFAAAEgSxgA4MyAMAAtE8AAASAomADikEAwAC0VwAABICjYAOKQQAAYAPAAF2yAT8ECAHAAF20gADANkdaCAHAAF21gQDANkdoCAHAAF22ggDANkd2CQHAALQrwABsWgAAAAAAAAA2R8EAAAAAAsAAXbmBMcAAtF7AALRkwAC2IAPAAEZKAAABYAPAAGxWAAABBMAAXbyBMcAAtKHAALSvCcAARkvAAF1cAF0DwABsXwJgA4JSYAOCUgEywAC0rWADglJgA4JSAAEFwABdwQAAAAAEAAADAAAAAAAAAAAAYAPAAF25AT8BCQEAwABsWgAAAAACBsAAXb6BMcAAtQ3AALUSwAC1aAAAwABE0gAAAAEDwAC1H8AAtWgAAAACAgLAALUpAAAAgqBgA4JSAMAAtTwAAADAAEZMYAOCUgAAXAE+AT0cwAC1UhbAALVJLsAARkvAAF1cwABdvICcAgACgcAAtVPANkiLgMAAtVzANkh9AMAAbGMGwABdv4ExwAC10MAAtdnAALYeAADAAEZNAAAAAQPAALXjwAC2HgAAAAEBAcAAte0AAADAAEZMYAOCUgAAYAOCUgE+AUrAALX6ATXAALYKAAABAGADglIBHMAAtgoWwAC2AS7AAEZLwABdXMAAXbwpAQABgMAAtgvANkkAAMAAbGEjHMAAtgqBwAC2CsA2SR8nAQABKwDAAGxegMAAthXANkkAgcAAtgrANkkfAWADglIAADZIUQA2SNQANkmFAAAAAgAFBMAAXV6BMcAAqUfAAKy7BsAARk4AYAPAAGwYAWrAAKlfYAPAAGwYwAEciwTAAF1fgTHAAK1HwACwrAbAAEZPAGADwABsGAFqwACtYGADwABsGMABHJAEwABdYIExwACxPcAAsbQGwABGUABgA8AAbBgBasAAsVtgA8AAbBjAARyVBMAAXWGBMcAAskTAALKVBsAARlEAYAPAAGwYAWrAALJgYAPAAGwYwAEcmgTAAF1igTHAALMmwACzxQbAAEZSAGADwABsGAFqwACzQ2ADwABsGMABHJ8AAYExADZKcAA1wfQANkbIADZHygA2SZYAAAADADZKcAAAAAAAAgjAAF3CwABGU4EyAAANg9UAAMAAbBcAAQABgs+D+AAAwABsFo2JAIQRAACCLgAAhDMAAIFpAACEYQAAt9QAAISFAACNOwAAhK4AAKYSAACE0wAAlvYAAIUEAACWIAAAhS8AAJq3AACFXgAAjmoAAIWMAACU2AABAR2CuJB3oUuhT6FYoVyhc6F4oXyhgKGEgryhUJE+kUORSKFdkU2RbJFRkVWRWZFeoWGRY5FokXChaqGFilwAAMAAaB4AAAABAMAARlQADwLAAF3IgTKRt5G8kekLuUkAAAFgA8AAbFYAAAYEwABdyoEykbyRvAmDKABgA8AAbB8ABMAAXcyBMpG8kbwJhHXAAF3CAGADwABsGAAEwABdzYEykbyRvAaBpgBdA8AAbBkBYAPAAF3IAWoAXQPAAGwZAWADwABdyMABHKQEwABdzoEykc+RzwaGQwBgA8AAXcgBagBgA8AAXcjAAQ1PBMAAXc+BMpHZkdkGwABGVQBgA8AAXcgBagBgA8AAXcjAAQ04BMAAXdCBMpHhkeEGwABGVgBgA8AAXcgBagBgA8AAXcjAAQ0gAQXAAF3UgTKRvJG8kekBAAADkbyR6QAAAAICApG8AAAEgyhgA8AAbB8AkbwAAASEdWADwABsGAAAYAPAAF3IAT8DCADAAF3KgADANkxdCADAAF3MgQDANkxrCQAAwABsWgAAAAABBsAAXdKBMpG8kbyR6QAAgVMAAAABA5G8kekAAAAAAAAAYAPAAGwYAUoAAQ8ALsAAXcwAADZMpwA2TNkAAAABAsAAXdWBMpHskfLAAESDA8AARlcAAAFgA5itAAAJBMAAXdeBMpI2kj0JwABDJABgA46KAATAAF3YgTKSWZJqCcAARlgAYAPAAF4DAATAAF3ZgTKShJKTCYU1AGADmroABMAAXduBMpKpkrsYjrjAAF3CAGADmxgBKwTAAF3cgTKTGpMkCcAARlkAYAPAAGxbAATAAF3dgTKTM5NGCcAARloAYAPAAGxbAATAAF3egTKTVZNgCbmXAGADwABsWwAEwABd34Eyk2+TgAm2agBgA8AAbFsABMAAXeCBMpOPk6kJj9kAYAPAAGxbAAEFwABeAoEyk66TrpZBAAAAA5PClkEAAAAKCgqTzwAABMAAQyRgA46KAJPyAAAAgPBdA8AAbF8CYAPAAGwYYAPAAGwYAJQRAAAEwABGWWADwABsWwCUKAAABMAARlpgA8AAbFsAlEgAAAS5l2ADwABsWwCUYAAABLZqYAPAAGxbAJR+AAAEj9lgA8AAbFsAlKUAAASFNWADmroAlMoAAADAAEZbYAPAAF6vAJTuAAAAuZNgA8AAXcgAAGADwABd1QE/CQgBwABd14AAwDZN7QgBwABd3IIAwDZOFggBwABd3YMAwDZOJggBwABd3oQAwDZONggBwABd34UAwDZORAgBwABd4IYAwDZOUggBwABd2YcAwDZOYAgAwABd2B+VHsAAXnsIAASAlT3ANk3tgZVGwDZN+4eVWsA2TmAUlWvANk5sCAAEuZeElZPANk42tmqFlb/ANk5Ej9mGlfrANk5SuZMUljLANk58CQAJAZOumLQAAAAAHwbAAF3igTKWcZZ2mdIAAMAARlwAAAABA5aEmdIAAAABAQGWjQAAAIEVYAOCkgAAXAE+Cj0XlpwujrjAAF3CH5a9myQCAAKAlt7ANk9qFpbnLoU1wABd2QDAAF3bPRyW/i7AAEZdAgACFpcbgJcTwDZPaoQRgqKAlyjANk9qAMAAXes9Hpc3gjcDAAMWl02Al0XANk9qhDGCoy6Al2HANk9qAD0el2+CNwMAAxaXhYCXfcA2T2qEMoKlLoCXksA2T2oAPR6XoII3AwADFpe2gJeuwDZPaoQzgqYugJfGwDZPagA9HpfUgjcDAAMWl+qAl+LANk9qgveCpy6Al/nANk9qAD0emAeCNwMAAxaYHYCYFcA2T2qDu4KpLoCYL8A2T2oAPR6YPYI3AwADFphTgJhLwDZPaoPAgqougJhhwDZPagBJmHAhFph1LsAARlnAAF3cPgE9HJkyFpkggJkYwDZPaoFsgqSOjQEAATSZPgOZPpmoAAAAAQEBmUkAAACEDGADgn4AAGADwABsWwE+AUqZXgEiJZl0ABaZb4GZZcA2UMGEDYKEYAODzAAcmZgWmYqBmYDANlDBgW2CgCcBAAErAMAAbF4AwABtnj89F5m1Lo64wABdwivAAF3bBsAAXeOBMpnXme+akQAAhGYBapnYYAPAAGxWgLUAAAEDmf+akQAAAAEBAZoMAAAAhA1gA4LnAABgA4LnAT4CPRyaKhaaGC7AAEZYwABd2MAARl4BAWABwABsXAE0mj0Dmj2aewAAAAAAAABgAcAAbFwBPgE9HJpILsAARl0CAAIWmmKAml3ANlFPhBGC6YCab8A2UU8AwABd6wDAAF53SpqCAYCaicA2UU8GwABd5IEympaatJtiAACEYwFqmpdgA8AAbFaAtQAAAQOayptiAAAAAQEBmt0AAACEDWADgs0AAGADgs0BPgI9HJr7FprpLsAARljAAF3YwABGXgEBYAHAAGxcATSbDgObDptMAAAAAAAAAGABwABsXAE+AT0cmxkuwABGXQIAAhabM4CbLsA2UfmEEYLQgJtAwDZR+QDAAF3rAMAAXndKm1MBgJtawDZR+QbAAF3lgTKbZ5t5nf8AAISnAWqbaGADwABsVoC1AAABA5uDnf8AAAABAQGbigAAAIQNYAODMgAAYAODMgE+BU6bqJu9AADAAEZfYAObGAEWm78ujrjAAF3CwABd2z0Xm9cujrjAAF3CH5vwmyQCAAIWnB+AnBrANlKjg4mDZRacMS6FNcAAXdkAwABd2z0cnFkWnEcuwABGWMAAXdjAAEZeAQFgAcAAbFwBNJxsA5xsnboAAAAAAAAAYAHAAGxcAT4GPRycdy7AAEZdAgACFpyRgJyMwDZSo4QRgzeAnJ7ANlKjAMAAXes9HpyrgjcDAAMWnL6AnLnANlKjg8CDWC6AnMzANlKjAD0enNmCNwMAAxac7ICc58A2UqODY4NCLoCdAsA2UqMAPR6dD4I3AwADFp0igJ0dwDZSo4SYg1kugJ02wDZSowA9Hp1DgjcDAAMWnVaAnVHANlKjg7uDWi6AnWjANlKjAD0enXWCNwMAAxadiICdg8A2UqOEmYNbLoCdrsA2UqMAAMAAXnc9F53BLo64wABdwoGd1sA2UrjAAF3bSp3wAYCd98A2UqMGwABd5oEyngSeGp+6AACFAQFqngVgA8AAbFaAtQAAAQOeKJ+6AAAAAQEBnjMAAACEDWADhEsAAGADhEsBPgVOnlGeZgAAwABGX2ADmxgBFp5oLo64wABdwsAAXds9F56ALo64wABdwh+emZsjAgACgJ6rwDZUURaesS6FNcAAXdkAwABd2z0cntkWnscuwABGWMAAXdjAAEZeAQFgAcAAbFwBNJ7sA57sn3UAAAAAAAAAYAHAAGxcAT4CPRye9y7AAEZdAgACFp8RgJ8MwDZUUYQRg6+Anx7ANlRRAMAAXes9F58wgJ8rwDZUUYTHJp8wATWfSQAAAQBgA4JSARyfSRafQICfO8A2VFGEx4RQg/gBAWADglIBLgCFAjWfYQAAAQBcARefYYKfScA2VRmEAICfasA2VFGCWIKfScA2VRlgA4TuhFAAwABedz0Xn3wujrjAAF3CgZ+RwDZUZsAAXdtKn6sBgJ+ywDZUUQbAAF3ngTKfv5/Xoa8AAIThAWqfwGADwABsVoC1AAABA5/noa8AAAABAQGf9AAAAIQNYAOEAgAAYAOEAgE+BU6gEqAnAADAAEZfYAObGAEWoCkujrjAAF3CwABd2z0XoEEujrjAAF3CH6BamyMCAAKAoGzANlW+FqByLoU1wABd2QDAAF3bPRygmhagiC7AAEZYwABd2MAARl4BAWABwABsXAE0oK0DoK2hagAAAAAAAABgAcAAbFwBPgM9HKC4LsAARl0CAAIWoNKAoM3ANlW+hBGDr4Cg38A2Vb4AwABd6z0eoOyCNwMAAxag/4Cg+sA2Vb6E3oQHLoChE8A2Vb4APRehJYChIMA2Vb6ExyahJQE1oT4AAAEAYAOCUgEcoT4WoTWAoTDANlW+hMeEBoP4AQFgA4JSAS4AhQI1oVYAAAEAXAEXoVaCoT7ANlamhACAoV/ANlW+gliCoT7ANlamYAOE7oQGAMAAXnc9F6FxLo64wABdwoGhhsA2VdPAAF3bSqGgAYChp8A2Vb4GwABd6IEyobShyKNPAACEcgFqobVgA8AAbFaAtQAAAQOh1KNPAAAAAQEBod0AAACEDWADgwEAAGADgwEBPgI9HKH7FqHpLsAARljAAF3YwABGXgEBYAHAAGxcATSiDgOiDqM5AAAAAAAAAGABwABsXAE+BT0cohkuwABGXQIAAhaiM4CiLsA2V0uEEYMEgKJAwDZXSwDAAF3rPR6iTYI3AwADFqJggKJbwDZXS4NjgwYugKJ2wDZXSwA9HqKDgjcDAAMWopaAopHANldLhG+DCC6AorrANldLAD0eoseCNwMAAxai2oCi1cA2V0uEcIMJLoCi9sA2V0sAPR6jA4I3AwADFqMWgKMRwDZXS4RxgwougKMtwDZXSwAAwABed0qjQAGAo0fANldLBsAAXemBMqNUo36lqwAAhOgBaqNVYAPAAGxWgLUAAAEDo6ClqwAAAAEBAaPGAAAAhA1gA4QlAABgA4QlAT4FTqPko/kAAMAARl9gA5sYARaj+y6OuMAAXcLAAF3bPRekEy6OuMAAXcIfpCybIwIAAoCkPsA2WHUWpEQuhTXAAF3ZAMAAXds9HKRsFqRaLsAARljAAF3YwABGXgEBYAHAAGxcATSkfwOkf6VmAAAAAAAAAGABwABsXAE+BD0cpIouwABGXQIAAhakpICkn8A2WHWEEYOvgKSxwDZYdQDAAF3rPR6kvoI3AwADFqTRgKTMwDZYdYNjhCougKTnwDZYdQA9HqT0gjcDAAMWpQeApQLANlh1hHCEKy6ApSPANlh1AD0epTCCNwMAAxalQ4ClPsA2WHWEcYQtLoClWsA2WHUAAMAAXnc9F6VtLo64wABdwoGlgsA2WIrAAF3bSqWcAYClo8A2WHUGwABd6oEypbClyqY4AACGkQFqpbFgA8AAbFaAtQAAAQOl3KY4AAAAAQEBpesAAACEDWADiiYAAGADiiYBPgI9HKX3LsAARl0CAAIWphGApgzANlnchBGKKYCmHsA2WdwAwABd60qmKQGApjDANlncBsAAXeuBMqY9pkKm6AAAwABGXQAAAAEDplam6AAAAAICAqZoAAAAhytdA8AAbBkBYAOFGgCmeAAAAIQAYAOCUgAAXAE+AUmmhiIWpoouwABGWsAAXd0AHKauFqangKahwDZaQ4DgwABsaoE7AQABkwDAAGyGPgE9HKa7LsAARmACAAKAptDANlpDgabXwDZaVgDAAF3sPwbAAF3sgTKm7abyqAMAAMAARmAAAAABA6cGqAMAAAACAgKnGAAAAIcrXQPAAGwZAWADhRoApygAAACEAGADglIAAFwBPgE9HKdIFqc2LsAARljAAF3YwABGXgEBYAHAAGxcATSnWwOnW6f+AAAAAAAAAGABwABsXAE+AUWnZgGnb6dxAACB1GADwABsHwGTARyneIKndsA2WzeBOgEAARangICnesA2WtqA4MAAbGoAwABshQGKp4rANls3HKeIgqeKwDZbN4E/AQABlADAAGyIPgE9HKecgKeXwDZa2oCcAgACgqedwDZbNzWnogAAAQBgA4UaARynoi7AAEZhAgACgafCwDZa7Rynz4CnysA2WtopAQABgqfQwDZbNwDAAGy4AMAAXf01p+AAAAEAXAEXp+CDp6LANlujhACBp+nANlrtgliDp6LANlujAMAAbMsAwABedwbAAF3tgTKoLqhHrDMAAIUnAWqoL2ADwABsVoC1AAABA6hYrDMAAAABAQGoZgAAAIQNYAOE7gAAYAOE7gE+Bj0eqHKCNwMAAxaohYCogMA2XDmDY4TzLoCom8A2XDkATqiwqMkAAZ3hYAPAAGwfARao5Rao0ICoy8A2XDmEcIT1gODAAGxqRajxAaj6qPwAAIHUYAPAAGwfAZMBHKkDgqkBwDZcmIE6AQABgakFwDZcbgDAAGyFAYqpIcA2XJgcqR+CqSHANlyYgT8BAAGUAMAAbIg+A06pRqlPAAGFFGADiOcBHKlqFqlWgKlRwDZcOYRwhPUpAQABgqlrwDZcmADAAGy4PRypdS7AAEZdAgACFqmTg6mKwDZc5IQRiOqDqaDANlzkAMAAXetJqbEhHKnKFqm+g6m1wDZc5ITLiO8nAQABKwDAAGxePgE9F6nmg6ndwDZc5ITLNaoAAAABAGADhRoBHKoALsAARmECAAKDqiDANlzkFqozg6oqwDZc5ITLiO8AwABd/TWqUAAAAQBcAReqUISqAMA2XWeEAIOqWcA2XOSCWISqAMA2XWeI7z8+Ak6qpQAAADxdA8AAbEoBYAOI5wEWqqUeAMAAbC8BAV0DwABsIAFgA4jnARaqpYCqoMA2XDmEcYT2AD3AAGxLRQAAARyqpYIAwDZdwj4AAAAAwABsTQA+Ak6qlAAAAYUUYAOI5wEWqraCAMA2XcJAwABsTz4CPRyqvi7AAEZdAgACFqrcg6rTwDZeGYQRiOqDqunANl4ZAMAAXetJqvohHKsTFqsHg6r+wDZeGYTLiO8nAQABKwDAAGxePgE9F6svg6smwDZeGYTLNatJAAABAGADhRoBHKtJLsAARmECAAKDq2nANl4ZFqt8g6tzwDZeGYTLiO8AwABd/TWrmQAAAQBcARermYSrScA2XoqEAIOrosA2XhmCWISrScA2XoqI7z9Jq74hHKvMFqvHgKvCwDZcOYT4hQYnAQABKwDAAGxePgE9F6vigKvdwDZcOYT4JqviATWr8wAAAQBgA4JSARyr8xar7oCr6cA2XDmE+IUGg/gBAWADglIBLgCH+jWsCwAAAQBcAResC4Kr88A2XxWEAICsFMA2XDmCWIKr88A2XxVgA4f4hQg/SqwkAYCsK8A2XDkGwABd7oEyrDisWLAfAACGNgFqrDlgA8AAbFaAtQAAAQOscLAfAAAAAQEBrIUAAACEDWADiOcAAGADiOcBPgM9HKyRLsAARl0CAAIWrKuArKbANl+ghBGI6oCsuMA2X6AAwABd60msxCEcrNkWrM2ArMjANl+ghMuI7ycBAAErAMAAbF4+AUms6has84Cs7sA2X6CEwYj6PgROrRWtHgABheBgA4pQARytIC7AAEZiAgACgK00wDZfoBatP4CtOsA2X6CEy4jvAMAAXf49HK1rFq1nFq1VLsAARljAAF3YjrfAAF4dwABGYwIAAoCtfMA2X6CBrYLANmAPAMAAXpU9F62agK2VwDZfoITLNa2oAAABAGADhRoBHK2oLsAARmQCAAKBrb/ANmAPFq3OgK3JwDZfoITLiO8AwABd/zWt5wAAAQBcARet54KtqMA2YIKEAICt8MA2X6CCWIKtqMA2YIKI70muMhyuNi7AAEZlAQABFq5IgK5DwDZfoITLiO8AwABeAD4BSa5iISWubwCBrmbANmAPYAOLHz4BSq9uASs/Pz4BPRevrYCvqMA2X6CEyyavrQE1r8wAAAEAYAOCUgEcr8wWr8CAr7vANl+ghMuI74P4AQFgA4JSAS4AhR41r+8AAAEAXAEXr++Br8zANmEshACAr/jANl+ggliBr8zANmEsYAOFGojvP0qwEAGAsBfANl+gBsAAXe+BMrAksDazsgAAhNsBarAlYAPAAGxWgLUAAAEDsECzsgAAAAEBAbBHAAAAhA1gA4PMAABgA4PMAT4FTrBlsHoAAMAARl9gA5sYARawfC6OuMAAXcLAAF3bPRewlC6OuMAAXcIfsK2bIwIAAoCwv8A2YbcWsMUuhTXAAF3ZAMAAXdtOsOGw5wAAg8FgA4PMARyw+xaw6S7AAEZYwABd2MAARl4BAWADg8wBNLEOA7EOs2wAAAAAAAAAYAODzAE+AkmxGRaxIoCxHcA2YbeEwYPePgM9HLE1LsAARl0CAAIWsU+AsUrANmG3hBGDr4CxXMA2YbcAwABd6z0XsXCAsWvANmG3hMs1sYoAAAEAYAOFGgEcsYouwABGYQIAAoCxqsA2YbcWsbWAsbDANmG3hMuD0ADAAF39NbHSAAABAFwBF7HSgrGKwDZil4QAgLHbwDZht4JYgrGKwDZil4PQSbIdIiEWsiIuwABGWcAAXdwAHLIwLsAARmUBAAEWskKAsj3ANmG3hMuD0ADAAF4APgFKslwBKz8+Aj0csoouwABGXQIAAhaypICyn8A2YbeEEYOvgLKxwDZhtwDAAF3rSbLAIRyy1RayyYCyxMA2YbeEy4PQJwEAASsAwABsXj4BPRey74Cy6sA2YbeEyyay7wE1sw4AAAEAYAOCUgEcsw4WswKAsv3ANmG3hMuD0IP4AQFgA4JSAS4AhR41szMAAAEAXAEXszOCsw7ANmOBhACAszzANmG3gliCsw7ANmOBYAOFGoPQP0qzWgGAs2HANmG3AMAAXnc9F7NzLo64wABdwoGziMA2YczAAF3bSrOiAYKzqcA2YhMGwABd8IEytAC0F7SqAACFyQFqtAFgA8AAbFaAtQAAAQO0KbSqAAAAAQEBtDgAAACEDWADhz4AAGADhRoBPgFKtEQBHLRLLsAARmQCAAIctH0WtGsuwABGWMAAXdiTygIAAha0hi6OuMAAXcLAAF3bgLSawDZkMgDAAF4tgLShwDZkMgDAAF3/BsAAXfGBMrSvtMa3GgAAhWQBarSwYAPAAGxWgLUAAAEDtNS3GgAAAAEBAbTfAAAAhA1gA4XDAABgA4UaAT4DTrT4tP8AAYC+YAODrAEWtQaAtQHANmS6gL6Fx0m1EiIltR0AgbUWwDZkz2ADg8wAFrUwFLUpwDZkzwEBYAODzITBg94+Aj0XtX8UtXjANmTPAQFgA4PMhMs1tZcAAAEAYAOFGgEctZcuwABGYQIAAhS1t8A2ZM8BAWADg8wWtcYUtb/ANmTPAQFgA4PMhMuD0ADAAF39NbXhAAABAFwBF7XhgrWXwDZlKIQAFLXqwDZkzwEBYAODzIJYgrWXwDZlKIPQSbX4HLX8LsAARmUBAAEWthAUtgnANmTPAQFgA4PMhMuD0ADAAF4APgFKtigBHLYvLsAARmECAAKAtk/ANmS6gLZVwDZkugDAAF39P0m2byIltnoAgbZzwDZkz2ADhEsAHLaWFraRFLaKwDZkzwEBYAOES4O+hE4nAQABaranYAOEkoZnAMAAbF4+AUq2twEctr4uwABGYQIAAoC23sA2ZLqAtuTANmS6AMAAXf0/Srb1ASa29QEdtwKFZAEAAYC3EcA2ZLoAl4VgA4UaBsAAXfKBMrcftza3tQAAhhQBarcgYAPAAGxWgLUAAAEDt0W3tQAAAAEBAbdRAAAAhA1gA4iDAABgA4iDAT4CPRy3XS7AAEZgAgACFrd3gLdywDZmiIWQiIWAt4TANmaIAMAAXexKt48BJrePAR23nIYUAQABgLeswDZmiACX2WADiIMGwABd84Eyt7q30bl3AACFRQFqt7tgA8AAbFaAtQAAAQO34bl3AAAAAQEBt+4AAACEDWADhS0AAGADhRoBPgNOuBS4HQABhRRgA4jnARa4JIC4H8A2ZwuFFIUvSbgyFrg/gbg2wDZnIITBiPo+Aj0XuFmBuFDANmcghMs1uHEAAAEAYAOFGgEcuHEuwABGYQIAAoG4kcA2ZyAWuKSBuJvANmcghMuI7wDAAF39Nbi/AAABAFwBF7i/grhxwDZnXIQAgbjIwDZnIIJYgrhxwDZnXIjvSbjYHLjcLsAARmUBAAEWuPKBuOnANmcghMuI7wDAAF4APgFKuQoBHLkRLsAARmECAAKAuTHANmcLgLk3wDZnCwDAAF39Pz9KuVABJrlQAR25XYVFAQABgLluwDZnCwCXfWADhRoGwABd9IEyuXy5k7o7AACF0wFquX1gA8AAbFaAtQAAAQO5o7o7AAAAAQEBubAAAACEDWADh3EAAGADhRoBPgJJubwWucWAucDANmhDhMGHcz4BSrnWARy53S7AAEZhAgACgLn9wDZoQ4C6A8A2aEMAwABd/T9KuhQBJroUAR26IYXTAQABgLoywDZoQwCXnWADhRoGwABd9YEyukC6V7rCAACFlwFqukFgA8AAbFaAtQAAAQO6bbrCAAAAAQEBuoAAAACEDWADho0AAGADhRoBPgFKuowBHLqTLsAARmECAAKAurPANmjWgLq5wDZo1gDAAF39BsAAXfaBMrrHut67gwAAhdUBarrIYAPAAGxWgLUAAAEDuu27gwAAAAEBAbr5AAAAhA1gA4d+AABgA4UaAT4CSbsFFrsOgLsJwDZpN4TBh4A+AUq7HwEcuyYuwABGYQIAAoC7RsA2aTeAu0zANmk3AMAAXf0/SrtdASa7XQEdu2qF1QEAAYC7esA2aTcAl55gA4UaBsAAXfeBMruIu5+8CAAAhZsBaruJYAPAAGxWgLUAAAEDu7S8CAAAAAEBAbvGAAAAhA1gA4aZAABgA4UaAT4BSrvSARy72S7AAEZhAgACgLv5wDZpyoC7/8A2acoAwABd/QbAAF34gTK8DbwkvMkAAIXXAWq8DmADwABsVoC1AAABA7wzvMkAAAABAQG8PwAAAIQNYAOHiwAAYAOFGgE+Akm8Sxa8VIC8T8A2aiuEwYeNPgFKvGUBHLxsLsAARmECAAKAvIzANmorgLySwDZqKwDAAF39P0q8owEmvKMBHbywhdcBAAGAvMDANmorAJefYAOFGgbAAF35gTK8zrzlvU4AAIWhAWq8z2ADwABsVoC1AAABA7z6vU4AAAABAQG9DAAAAIQNYAOGpQAAYAOFGgE+AUq9GAEcvR8uwABGYQIAAoC9P8A2ar6AvUXANmq+AMAAXf0GwABd+oEyvVO9ar4wAACFewFqvVRgA8AAbFaAtQAAAQO9hL4wAAAAAQEBvZsAAACEDWADhjwAAGADhRoBPgJJvacWvbCAvavANmsfhMGGQD4BSr3BARy9yC7AAEZhAgACgL3owDZrH4C97sA2ax8AwABd/T9Kvf8BJr3/AR2+DIV7AQABgL4nwDZrHwCXi2ADhRoGwABd+4EyvjW+TL8DAACFeQFqvjZgA8AAbFaAtQAAAQO+Yb8DAAAAAQEBvnMAAACEDWADhikAAGADhRoBPgJJvn8WvoiAvoPANmuyhMGGLT4BSr6ZARy+oC7AAEZhAgACgL7AwDZrsoC+xsA2a7IAwABd/T9KvtcBJr7XAR2+5IV5AQABgL76wDZrsgCXimADhRoGwABd/IEyvwi/H8AAQIUAAIXhAWq/CWADwABsVoC1AAABA782wABAhQAAAAEBAb9KAAAAhA1gA4e+AABgA4UaAT4CTr9fv2gAAIXgYAOKUAEWv2+Av2rANmxJheCHwEm/fSW/igCBv4HANmxeYAOLHz4CTr+1v8AAAIV+YAOFGgEWv8sUv8LANmxeAQFgA4sfhX6LIUq/3QEcv+QuwABGYQIAAoLAAEAEwDZsjoLAAEAQwDZsjgDAAF39PgI9F8AAQDWAwABAMMA2bEmF4BzAAEBSFsAAQEAuwABGWMAAXdie8QEAAYHAAEBfwDZsXgDAAF51h8BKwABAcAGAwABAd8A2bEkGwABd/YEywABAisAAQJXAAEE4AADAAEZhAAAAAQPAAEC0wABBOAAAAAICAsAAQMUAAADAAEZmYAOCUgDAAEDdAAAAhA1gA4UaAABgA4UaAT4BSsAAQOkBHMAAQPAuwABGZAIAAhzAAEEHLsAARmICAAKAwABBG8A2bUuBwABBKMA2bVsAwABd/oHAAEEvwDZtWwDAAF3/BsAAXf6BMsAAQT3AAEFGwABCeQAAwABGYgAAAAEDwABBWcAAQnkAAAACAgLAAEFjAAAAwABGZmADglIAwABBewAAAIQNYAOFGgAAYAOKUAE+AknAAEGHHMAAQZeAwABBi8A2beInAQABgcAAQZrANm3yAMAAbF4+AUrAAEGoARzAAEHBFsAAQa8uwABGWMAAXdiTygIAAhbAAEHKLo64wABdwsAAXduBwABB3sA2bfIAwABeLT9KwABB8AEcwABCCRbAAEH3LsAARljAAF3YwABGZwIBYAOKUAKAwABCGsA2beI0wABCJwPAAEInwABCdAAAAAAAAABgA4pQAT4BSsAAQjIBHMAAQksWwABCOS7AAEZYwABd2JPKAgACFsAAQlQujrjAAF3CwABd24HAAEJowDZt8gDAAF4tAMAAXj0GwABd/4EywABCfsAAQonAAEPSAADAAEZkAAAAAQPAAEKfwABD0gAAAAICAsAAQqkAAACF4GADilAAwABCvgAAAIQNYAOFGgAAYAOFGgE+AknAAELKIiXAAELXAIDAAELOwDZvImADix8AJcAAQw0AFsAAQwIUwABC+cA2byIAAWADix+FfoshYAOFIj4BSsAAQysBFsAAQzsUwABDMsA2byIAAWADix+FfoshP0rAAENRATXAAENcAAABAGADh74BH8AAQ1yHyQIAAoDAAEN4wDZvIhzAAEOHgcAAQ4LANm8whTMBAAEWwABDlS6OuMAAXcLAAF3bAIUcADXAAEOyAAABAFwBF8AAQ7KCwABDXMA2b6qEARbAAEPEgcAAQ7/ANm8whAGCWYJZgsAAQ1zANm+qBsAAXgCBMsAAQ9fAAEPcwABEgQAAwABGZQAAAAEDwABD6MAARIEAAAABAQHAAEP0AAAAhMtgA4UaAABgA8AAbFsBPgJJwABEByXAAEQXAIDAAEQLwDZwVWADh74+AUrAAEQ2ARzAAERFFsAARD0uwABDJMAAXdeJ2AEAARTAAERawDZwVQABYAOHvgCOjz9KwABEcgEpAAA2T0gANlEkADZRzgA2UngANlQmADZVkwA2VyAANlhKADZZsQA2WiEANlq4ADZcDgA2X3UANmGMADZkBwA2ZI8ANmZdADZm4AA2aBgANmirADZpDAA2aZ8ANmoAADZqkwA2avQANmuHADZsGgA2bR8ANm22ADZu9gA2cCkANnC/AAAAHwLAAF4DgTLAAESGwABEjMABIBYDwABGaAAAAV0DmKgBYAOKUAAAHgTAAF4FgTLAAETcwABE4wnAAEMkAGADjooABMAAXgaBMsAARP3AAEUMCYnXAGADjn4ABMAAXgeBMsAARSLAAEUrGMAARmkAYAPAAGgfASsEwABeCIEywABFQ8AARVUYgPAAXQPAAGxfAmADwABsGGADwABsGAAEwABeCYEywABFZMAARX4Jj9kAYAPAAGxbAATAAF4KgTLAAEWSwABFmwmAkABgA408AATAAF4LgTLAAEW1wABFxAmFNQBgA5q6AATAAF4NgTLAAEXawABF7BiOuMAAXcIAYAObGAErBMAAXg6BMsAARgTAAEYRCcAARlsAYAPAAF6vAATAAF4PgTLAAEYqwABGOAm5kwBgA8AAXcgABMAAXhCBMsAARkjAAEZTCbmXAGADwABsWwAEwABeEYEywABGY8AARnUJwABGagBgA4PMAATAAF4SgTLAAEaFwABGlgm2agBgA8AAbFsABMAAXhOBMsAARrnAAEb6CcAARmsAYQMBYAOJVWADwABsWwEWwABG7B/AAEbUwABezwAAAADAAEZrwABewwTAAF4UgTLAAEcdwABHMgnAAEZsAF0DwABsXwJgA4pQYAOKUAAEwABeFYEywABHTsAAR1cJwABGbQBdA8AAbF8CYAOCSmADwABsVgAEwABeFoEywABHeMAAR50Jk88AYAO31QEfwABHhbhPAAAAAATAAF4XgTLAAEezwABHxhjAAEZuAF0DwABsXwJgA4MyYAPAAGxbASsEwABeGIEywABH3sAAR/8JwABGbwBgA4pmAR/AAEfxim0AAAAABMAAXhmBMsAASBbAAEg7CcAARnAAYAOKbgEfwABIKYp1AQABKQAEwABeGoEywABIUsAASHkJwABGcQBgA4puAR/AAEhminUBAAEqAATAAF4bgTLAAEiTwABIpAnAAEZyAF0DwABsGQFgA4JSATHAAEiiYAOCUgAEwABeHIEywABIucAASMgYwABGcwBgA8AAXnwBKwTAAF4dgTLAAEjiwABI5RiOtwBgA8AAXooABMAAXh6BMsAASPnAAEkqGMAARnQAXQPAAGxXAWADhRoBHsAASRDAAG4LAAFgA4UaAAAEwABeH4EywABJRsAASXYYwABGdQBdA8AAbF8CYAOKUGADilABHsAASVTAAG1mAAJgA4pQYAOKUAAABMAAXiCBMsAASYDAAEmUGMAARnYAYAPAAGxbASsEwABeIYEywABJyMAASdEYwABGdwBgA8AAbB8BKwTAAF4igTLAAJiqwACY8QXAAEZ4AGADwABssQEewACYzcAAbLMBAAEnwABGeQAEwABeI4EywACZEMAAmsoGwABGegBdA8AAbBkBYAPAAGwYAWrAAJkkXQPAAGwZAWADwABsGMABHLgBBcAAXnuBMsAASvzAAEr8wABQ0wAAAAPAAEsNwABQ0wAAAAgEBMAASxMAAATAAEMkYAOOigDAAEshAAAEgPBdA8AAbF8CYAPAAGwYYAPAAGwYAMAASzoAAASFNWADmroAwABLVgAABMAARltgA8AAXq8ABMAAS3EAAAS5l2ADwABsWwFqwABLf2ADwABsWxzAAEuRAAAEtmpgA8AAbFsBasAAS6VgA8AAbFscwABLtwAABI/ZYAPAAGxbAWrAAEvUYAPAAGxbHMAAS+YAAAS5k2ADwABdyAFqwABMBWADwABdyMABDU9gA8AAXgMBPgNJwABNtSIcwABNzBbAAE25LoDwwABeCCcBAAErAMAAbF4AIRbAAE3gFsAATdguwABDJMAAXgWJ2Y6SPgE9MMAATgYfwABOEMAAbKABAAEkwABOHQInwABGeyfAAEZ8AD89F8AATr4uwABGaR7AAE7OwABoIwIAAi4WwABO8y6J18AAXgYAwABeBz0XwABPCS7AAEZuMsAATyxgA4MyYAPAAGxbDBbAAE8+FsAATzQugJDAAF4KiRqNzikWwABPXxbAAE9VLoCQwABeCokljdUqFsAAT4MWwABPeS6AkMAAXgqJLY3aKRbAAE+jFsAAT5kugJDAAF4KiS6N2ykWwABPzhbAAE/ELoCQwABeCok7jeQpFsAAT+8WwABP5S6AkMAAXgqJQo3pKRbAAFAPFsAAUAUugJDAAF4Kg3SN7SkWwABQMBbAAFAmLoCQwABeColLje8pFsAAUFMWwABQSS6AkMAAXgqJQI3oKRbAAFBzFsAAUGkugJDAAF4KiV6N/SkWwABQlhbAAFCMLoCQwABeColfjf4pFsAAULkWwABQry6AkMAAXgqJaI4DKcAAXhcPCAHAAF4FgADANnWmCAHAAF4IgQDANnW2CAHAAF4LggDANnXTCAHAAF4OgwDANnXhCAHAAF4QhADANnX0CAHAAF4ShQDANnYQCAHAAF4JhgDANnYsCAHAAF4PhwDANnZICADAAF4GFsAATDCAwABMKMA2daaJ146RCADAAF4KFsAATGWCwABMVcA2ddOAkJq8CADAAF4UMsAATKRgA4pQYAOKUAAIAMAAXhUywABMzGADgkpgA4pQAAgAwABeHR/AAEziwABemgAAAAAIAMAAXhEmwABNFgEjhMAATRjANnX0HMAATWMWwABNTBbAAE1CgsAATTLANnXTgJCavIMojT+JBAMAAyecLCfAAEZ9J4pcAJwJKwFgA4OsYAODzAkBwABK/JisAAAAAFMGwABeJYEywABKAMAASgnAAEpGAQDAAEZ+AAAAAQPAAEodwABKRgAAAAAAAABgA8AAbFsBSsAASiABIhbAAEogLsAARnbAAF4gASEcwABKQhbAAEo4LsAARnfAAF4hJwEAAZMAwABsMgbAAF4mgTLAAEpLwABKVMAASpABAMAARn8AAAABA8AASmjAAEqQAAAAAAAAAGADwABsWwFKwABKawEcwABKexbAAEprLonXwABeBicBAAFqwABKjmADjn6IrwDAAGxeBsAAXieBMsAASpXAAEqewABK9wEAg1YAAAABA8AASrXAAEr3AAAAAAAAAGADwABsWwFKwABKvgEcwABK3RbAAErRFsAASr4ujrjAAF3CwABeDYQ+mx8nAQABasAASuxgA4lHhS0AwABs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AMAAbEdKwACHgAEcwACHhy7AAEarAwFgA4pQA4LAAIeewDakHobAAIelwDanMzTAAIe0A8AAh7TAAIqvAAAAAAAAAGADilABPgFKwACHvwEcwACHxi7AAEaSAgFgA4pQAoDAAIfiwDajazTAAIfoA8AAh+jAAIqnAAAAAAAAAGADilABPgRJwACIehbAAIh+LsAARn7AAF4lPgQ9HMAAiJ8uwABGiwAAAADAAF4zPRzAAIi2LsAARqwEAASBwACI4cA2o9WGwACI7sA2pzODwACI/cA2pKKEwACJCsA2pOEAwABeVj0cwACJHC7AAEaMAAAAAMAAXjRKwACJMwEcwACJOi7AAEaKAgACgMAAiUbANqNrHMAAiVwWwACJTC7AAEZzwABeHMAARq0AAAAAwABehwDAAF4wPz0cwACJiy7AAEasBAAEgcAAibTANqPVhsAAicHANqczg8AAidDANqSihMAAid3ANqThAMAAXlZJwACJ7RbAAInxLsAARn7AAF4lPgFKwACKEgEcwACKGS7AAEaKAgACgMAAiiXANqNrHMAAijsWwACKKy7AAEZzwABeHMAARq0AAAAAwABehwDAAF4wP0rAAIpqARzAAIpxLp7xAQABHMAAio4WwACKfi7AAEZzwABeHMAARq4AAAAAwABehgDAAF51AMAAXj4AwABedgbAAF5SgTLAAIq5wACKvsAAjGYAAMAARqAAAAABA8AAitPAAIxmAAAAAgICwACK3QAAAIQNYAOCUgDAAIrvAAAAjclgA4QCAABcAT4CScAAiwIhFsAAixOBwACLB8A2qm+EwYQNPgE9HMAAiyQuwABGiQIAAoDAAIsywDaqYSfAAEavAMAAXi8/ScAAi2giIRzAAIuGFsAAi4EWwACLeIHAAItswDaqb4THhAaE+IUGJwEAASsAwABsXgAhJcAAi7MAFsAAi64WwACLpYHAAIuZwDaqb4THhAaE+IUGYAOIHj4BPRzAAIvPLsAARokCAAKAwACL6MA2qmEkwACL7AYnwABGoYDAAIwHwDaqYSfAAEawJ4puFsAAjEwWwACMRxbAAIw+gcAAjDLANqpvhMeEBoT4hQaFTsAAbS0ngYwAwABeLz8GwABeU4EywACMa8AAjIDAAI/dAACFpwFqwACMbGADwABsVoC1AAABA8AAjJXAAI/dAAAAAQEBwACMpwAAAIQNYAOGsgAAYAOKUAE+AUrAAIyzARzAAIy6LsAARqsDAWADilADFsAAjN+AwACM2sA2q7GC04a6HMAAjOouwABGggEAARbAAIz8gMAAjPfANquxg3OGtQDAAF4qNMAAjQwDwACNDMAAj9gAAAAAAAAAYAOKUAE+BT4CTsAAjT4AAAA8XQPAAGxKAWADiCYBFsAAjT4eAMAAbC8BAV0DwABsIAFgA4gmARbAAI0+gMAAjTnANquxhaWGtwA9wABsS0UAAAEcwACNPoEAwDasMz4AAAAAwABsTQA+Ak7AAI0sAAAAhRdgA4gmARbAAI1HgQDANqwzQMAAbE8+AT0cwACNUS7AAEaxAQABgsAAjV3ANqyUAMAAXlc9HMAAjYgWwACNfIDAAI13wDarsYWkhraBsQEAATTAAI2QA8AAjZDAAI4lAAAAAgICwACNmwAAAIWoYAOCfgDAAI2wAAAAgT5gA4UaAABgAcAAbFwBPgE9HMAAjdEWwACNwS7AAEZzwABeHMAARrICAAIWwACN9YHAAI3swDatAYQigogcwACN/i7AAEaEwABdwgEAAYLAAI4VwDatDwDAAF47AMAAXoUAwABssD0cwACOQxbAAI4zgMAAji7ANquxhaaGuIGxAQABNMAAjksDwACOS8AAjx0AAAABAQHAAI5XAAAAgT5gA4UaAABgAcAAbFwBPgJOwACOccAAjnoAAIXgYAOKUAEcwACOfC7AAEaEwABdwgEAAYHAAI6TwDatrgDAAF47ScAAjqMlwACOsACCwACOp8A2rcdgA4sfPgE9HMAAjvQWwACO5BbAAI7ULsAARnPAAF4chabAAF6DNgEAARzAAI74Lp3KAQABFMAAjwDANq3HAgFgA4sfAMAAXjIAwABsRz8AwABtA0nAAI8mFsAAjyouwABGfsAAXiU+AUrAAI9JARzAAI9QLsAARooCAAKAwACPXMA2q7EcwACPchbAAI9iLsAARnPAAF4cwABGrQAAAADAAF6HAMAAXjA/SsAAj50BHMAAj6QunvEBAAEcwACPwRbAAI+xLsAARnPAAF4cwABGrgAAAADAAF6GAMAAXnUAwABedgbAAF5UgTLAAI/iwACP58AAlokAAMAARqkAAAABA8AAj/jAAJaJAAAAAQEBwACQAAAAAIGIYAPAAGwYAABgA8AAbFsBPglJwACUUxzAAJRcgMAAlFfANq8aJwEAASsAwABsNkrAAJRlASo/ScAAlHccwACUgIDAAJR7wDavGicBAAEnAADAAGw2SsAAlIcBKT9OwACUrMAAlLIAAYQyXQPAAGwZAWADwABsGAEcwACUuYDAAJS0wDavGodDAQABJ4D3AMAAbTxFwACU/QHAAJUGwACVCAAAgdRgA8AAbB8BkwEcwACVD4LAAJUNwDavu4E6AQABHMAAlR4WwACVF4HAAJURwDavgIDgwABsakQBAAGUAMAAbOEAwABshQGKwACVJcA2r7scwACVI4LAAJUlwDavu4E/AQABlADAAGyIPgFJwACVMCEcwACVNS7AAEazAQABHMAAlVKBwACVTcA2r4ApAQABgsAAlVPANq+7AMAAbLgAwABeVUrAAJVYASo/TsAAlXjAAJV9AACHD2ADwABsGAEWwACVhYHAAJV/wDavgIcPwABtOknAAJWPHMAAlaFqwACVk10DwABsGQFgA8AAbBjAAR1DKwEAAYLAAJWqwDawcQDAAGw0PgFKwACVuQEiFsAAlcAutmrAAF4SASEcwACV2oLAAJXVwDawcScBAAEnrnUAwABsNj9JwACV7hzAAJX3gsAAlfLANrBxgq4BAAEnSADAAGzwPgE9isAAlg7ANrBxHMAAlhqCwACWFcA2sHGBPQIAApMcwACWMxbAAJYsgsAAlifANrBxgODAAGyRRAEAAZQAwABs4QDAAGyHP0nAAJZDIRzAAJZILsAARrMBAAGCwACWYMA2sHEAwABeVUrAAJZnASo/SsAAlnoBKQbAAF5VgTLAAJrPwACa1MAAm1wAAMAARrMAAAABA8AAmuvAAJtcAAAAAQEBwACa8wAAAIGIYAPAAGwYAABgA8AAbFsBPgFKwACa/wEiHMAAmx0awACbBsAAXiKBugEAAYDAAJsmwDaxwADAAGy1ACEcwACbSmrAAJs4XQPAAGwZAWADwABsGMABHLgrAQABgMAAm1PANrHAAMAAbDQGwABeVoEywACbYcAAm2bAAKkEAADAAEasAAAAAQPAAJuBwACpBAAAAAQEBMAAm5UAAACNyWADhAIAwACbtwAAAINzXQPAAGwZAWADiVUAwACb2wAAAJzaXQPAAGwZAWADilAAwACcDAAAAJu+XQPAAGxfAmADwABsGGADilAAAFwBPgFKwACcIgEc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TsAAqbTAAKm8AACAlmADhRoBK0nAAKnKIRzAAKngFsAAqdiAwACpzsA2vOaAlogpJwEAASsAwABsXj4DPRzAAKnzLsAARosAAAAAwABeMz2KwACqCMA2vUkcwACqEi6dygEAARzAAKoaLsAARoTAAF3CAQABFsAAqjuAwACqMcA2vOaAlogpAMAAXjsAwABeMj0cwACqTi7AAEaMAAAAAMAAXjQ/PRzAAKqBFsAAqnkWwACqaS7AAEZzwABeHIWlwABegjYBAAEfwACqiYgyBAABHMAAqpkuncoBAAGBwACqocA2vPoAwABeMgOAloLAAKrAwDa9SYX5FsAAqvOAwACq6cA2vOaF+YgqhfoWwACrMYDAAKsnwDa85oX6iCsAwABsR0nAAKtSJcAAq2AAgcAAq1bANrz6YAOKbj4BScAAq3khFsAAq4gUwACrfsA2vPoBAWADim6BPopePgNJwACrmRzAAKuvFsAAq6eAwACrncA2vOaAlogpJwEAASsAwABsXj4BPRzAAKvELonNAgACFsAAq9WAwACry8A2vOaFiogoasAAq+BgA7LbwABmEgDAAF4uP07AAKwjwACsKwABgJZgA4pQARzAAKwtLsAARoTAAF3CAQABFsAArE6AwACsRMA2vOaAlogpAMAAXjtJwACsYBbAAKxkLsAARn7AAF4lPgE9HMAArJ0WwACslRbAAKyFLsAARnPAAF4chaXAAF6CNgEAAR/AAKyliDIEAAEcwACstS6dygEAARTAAKy9wDa8+gEBYAOKbgDAAF4yA4CWHMAArOAuncoBAAGCwACs6MA2vwAAwABeMoX5FsAArSCAwACtFsA2vOaF+YgqhfoWwACtYoDAAK1YwDa85oX6iCsAwABsR0nAAK2HJcAArZMAgsAArYvANr8AYAOKiT4BPRzAAK2yLonNAgACFsAArdKAwACtyMA2vOaFiogoHMAAripqwACt610DsucBYQMBYAPAAGwYYAOyz8AAZjqNbwEAARbAAK5AFMAArjjANr8AAgFgA4qJgT6KXgCy6wDAAF4uPgE9HMAArmQuic0CAAIWwACuhIDAAK56wDa85oCWiCkcwACuuGrAAK6bXQOy5wFhAwRgA4pQYAOJVWADiVVgA8AAbFtgA7LPl16NbwQABILAAK7ZwDa/ABbAAK8OFsAArwQWwACu9C6FNcAAXguAkJq8iX+OFhzAAK89gsAArzXANr8AhpQBAAEWwACvRS6OuMAAXcLAAF4NAIpWFsAAr2wug1bAAF4nALLrAMAAXi4/PgE9HMAAr6suic0CAAIWwACvx4DAAK+9wDa85oWKiCgcwACv+WrAAK/cXQOy5wFhAwRgA4pQYAOJVWADiVVgA8AAbFtgA7LPl16NbwQABIHAALAWwDa8+hbAALBJFsAAsD8WwACwLy6FNcAAXguAkJq8iXKOChzAALB0gcAAsGrANrz6hpQBAAEWwACwfC6OuMAAXcLAAF4NAIpWFsAAsJ8ug1bAAF4nALLrAMAAXi4GwABeWIEywACwxsAAsNvAALE8AACFQgFqwACwx2ADwABsVoC1AAABA8AAsPHAALE8AAAAAQEBwACxBAAAAIQNYAOFIgAAYAOKUAE+AUrAALEQARzAALEXLsAARokCAAKAwACxJcA2wfgWwACxMIDAALErwDbB+ICWhSQAwABeLwbAAF5ZgTLAALFBwACxVsAAyAUAAIV0AWrAALFCYAPAAGxWgLUAAAEDwACxa8AAyAUAAAABAQHAALF9AAAAhA1gA4YEAABgA4pQAT4IQBbAALHiFsAAsdwWwACx0oDAALHNwDbCeIGthgiFI4XogVbAAGzzwACxzcAAsekATsAAsgDAALIJAAGFSWADilABHMAAsgsuwABGhMAAXcIBAAEWwACyJ4DAALIiwDbCeIVJhgYAwABeO07AALJLwACyVQABga1dA8AAbBkBYAOKUAEcwACyXy7AAEakAQABFsAAsoCAwACye8A2wniBrYYIAMAAXnJJwACykRbAALKVLsAARn7AAF4lPgFKwACysgEcwACyuS7AAEaKAgACgMAAstDANsJ4H8AAsuSGFQMAAxzAALL1Lp3KAQABgcAAsv3ANsK/AMAAXjIWwACzDYDAALMIwDbCeIGIhgccwACzIS7AAEanAwADgsAAszbANsL5MsAAs0FgA8AAbBhgA4pQABbAALNUFsAAs0qAwACzRcA2wniBrYYIg8uF5gDAAF50AADAAF4wP07AALN2wACzeQABneNgA8AAbBgBFsAAs4UWwACzgIDAALN7wDbCeIGIhgeBiIkiScAAtCMiHMAAtDgWwAC0MYLAALQnwDbC+YDgwABsaicBAAGUAMAAbDIAHMAAtEODwAC0QMA2w+knAQABJycAwABsNj4CTsAAtGPAALRpAAGFh2ADilABHMAAtHSCwAC0a8A2wvkpAQABkwDAAGy4ScAAtIAiIiIiIiXAALSNAIHAALSEwDbCv2ADimYBJcAAtLMAgcAAtKrANsK/YAOKbgElwAC02QCBwAC00MA2wr9gA4p2ASXAALT+AIHAALT1wDbCv2ADin4BJcAAtSYAgcAAtR3ANsK/YAOKiQElwAC1SwCEwAC1RcA2xF1gA4pmPgFKwAC16AE1wAC17wAAAQBgA4pQARzAALXvLsAARrgCAAKBwAC2AsA2wr+EwAC2DMA2xF0AwABeaCMcwAC174XAALXvwDbFECcBAAErAIpVHMAAtiIuwABGlQEAARzAALY8gcAAtjPANsK/JwEAAYTAALY/wDbEXQCKVQDAAF5rhcAAte/ANsUQAWADilA+AUrAALZeARzAALZlLonNAgACgMAAtnnANsJ4HMAAtrVqwAC2i10DsucBYQMDYAOKUGADiVVgA8AAbFtgA7LPlXmNbwMAA4HAALbDwDbCvxzAALbmgcAAtt3ANsK/hpQBAAEWwAC27i6OuMAAXcLAAF4NAIpWFsAAtwMug1bAAF4nALLrAMAAXi4/ScAAt34lwAC3iwCBwAC3gsA2wr9gA4qJPgFJwAC3phzAALe7FsAAt7SCwAC3qsA2wvmA4MAAbGonAQABlADAAGwyPgFHwAC3y4PAALfTwDbD6QEBwAC36GrAALfoYAPAAGwYsi0APgNOwAC4CMAAuA4AAYHRYAOKUAEcwAC4GYLAALgQwDbC+SkBAAGTAMAAbLhJwAC4KiXAALg0AITAALguwDbGimADiok+AUrAALhXARzAALheLp7xAQABH8AAuIKKkAEAARzAALigFsAAuJoUwAC4kcA2wr8BAWADiomBPopegT8BAAEWwAC4qBTAALiiwDbGigQBYAOKiYE+il4AwABtPQAAwABedT9KwAC4ywEcwAC40i6JzQIAAoDAALjqwDbCeBzAALkqasAAuQBdA7LnAWEDBWADwABsGGADilBgA4lVYAOJVWADwABsW2ADss+VC41vBQAFJ4E/FMAAuWbANsK/AQFgA4qJFsAAuZ4WwAC5lBbAALmELoU1wABeC4CQmryJf44WHMAAuc2EwAC5x8A2xoqGlAEAARbAALnVLo64wABdwsAAXg0AilYWwAC5/i6DVsAAXicAsusAwABeLj9JwAC6NRzAALpDFsAAujkuwABGacAAXgeOJwEAAYHAALpJwDbCvwDAAGglPgFJwAC6XBzAALpxFsAAumqCwAC6YMA2wvmA4MAAbGonAQABkwDAAGwyPgFKwAC6gQEcwAC6iC6e8QEAARzAALqfFsAAupUuwABGacAAXgfAAEa5AwADgMAAurHANsJ4g8AAurfANsPpgcAAurvANsK/AMAAaCcAwABedUnAALrUHMAAuukWwAC64oLAALrYwDbC+YDgwABsaicBAAGUAMAAbDI+A07AALsIwAC7DgABgdFgA4pQARzAALsZgsAAuxDANsL5KQEAAZMAwABsuEnAALsmHMAAuzQWwAC7Ki7AAEZpwABeB44nAQABhMAAuzrANsi6AMAAaCU+AUrAALtOARzAALtVLp7xAQABHMAAu3sWwAC7cS7AAEZpwABeB8AARroEAASAwAC7jsA2wniDwAC7lMA2w+mBwAC7mMA2wr+EwAC7osA2yLoAwABoKADAAF51ScAAu7olwAC7xACEwAC7vsA2yLpgA4p+PgNJwAC74yIiIhzAALvrg8AAu+jANsPpJwEAASeB1QDAAGw2ARzAALv4g8AAu/XANsPpJwEAASeB+gDAAGw2ARzAALwFg8AAvALANsPpJwEAASeB1gDAAGw2ASIiHMAAvCKDwAC8H8A2w+knAQABJ4JMAMAAbDYBHMAAvDCDwAC8LcA2w+knAQABJ4JLAMAAbDYBHMAAvD6DwAC8O8A2w+knAQABJ651AMAAbDY+AUrAALxXARzAALxeLonNAgACgMAAvHbANsJ4HMAAvLZqwAC8jF0DsucBYQMFYAPAAGwYYAOKUGADiVVgA4lVYAPAAGxbYAOyz5ULjW8FAAWDwAC82cA2w+kUwAC88cA2yLoEAWADin4WwAC9JhbAAL0cFsAAvQwuhTXAAF4LgJCavIl1jg0cwAC9UhTAAL1MwDbIugQBYAOKfoaUAQABFsAAvVoujrjAAF3CwABeDQCKhBbAAL2DLoNWwABeJwCy6wDAAF4uP07AAL23wAC9xQAAtPBgA8AAbDABFsAAvewmwAC90QCBwAC9yMA2wr9dA4pcAWADwABsMIE+il5KwAC9/QEcwAC+BC6e8QEAARzAAL4RLsAARrsEAASDwAC+P8A2w+mFwAC+Q8A2yvcWwAC+WBTAAL5SwDbIugQBYAOKfoE+il6AwAC+X8A2wngAwABeeADAAF51P0rAAL55ARzAAL6ALonNAgACgMAAvpTANsJ4HMAAvtBqwAC+pl0DsucBYQMFYAPAAGwYYAOKUGADiVVgA4lVYAPAAGxbYAOyz5ULjW8FAAWDwAC+78A2w+mBwAC/A8A2wr8WwAC/NxbAAL8tFsAAvx0uhTXAAF4LgJCavIl4jhAcwAC/X4TAAL9ZwDbIuoaUAQABFsAAv2cujrjAAF3CwABeDQCKVhbAAL+MLoNWwABeJwCy6wDAAF4uP0nAAL+5JcAAv8YAgcAAv73ANsK/YAOKfj4CScAAv+EiIiIcwAC/6YPAAL/mwDbD6ScBAAEngdUAwABsNgEcwAC/9oPAAL/zwDbD6ScBAAEngfoAwABsNgEcwADAA4PAAMAAwDbD6ScBAAEngdYAwABsNgEiIhzAAMAcg8AAwBnANsPpJwEAASeCTADAAGw2ARzAAMAqg8AAwCfANsPpJwEAASeCSwDAAGw2ARzAAMA4g8AAwDXANsPpJwEAASeudQDAAGw2PgFKwADATQEcwADAVC6JzQIAAoDAAMBowDbCeBzAAMCkasAAwHpdA7LnAWEDBWADwABsGGADilBgA4lVYAOJVWADwABsW2ADss+VC41vBQAFg8AAwMPANsPpFMAAwNfANsK/AQFgA4p+FsAAwQsWwADBARbAAMDxLoU1wABeC4CQmryJdY4NHMAAwTYUwADBLcA2wr8BAWADin6GlAEAARbAAME+Lo64wABdwsAAXg0AioQWwADBYy6DVsAAXicAsusAwABeLj9JwADBixzAAMGgFsAAwZmCwADBj8A2wvmA4MAAbGonAQABkwDAAGwyPgFHwADBsIPAAMG4wDbD6QEBwADBzWrAAMHNYAPAAGwYwAEdQAA+AUrAAMHjARzAAMHqLp7xAQABH8AAwfuKiAEAARzAAMIKFsAAwhQUwADCC8A2wr8BAWADin6BPopegVoAAAAAwABvVgAAwABedUnAAMI0HMAAwkkWwADCQoLAAMI4wDbC+YDgwABsaicBAAGUAMAAbDI+A07AAMJowADCbgABgdFgA4pQARzAAMJ5gsAAwnDANsL5KQEAAZMAwABsuEnAAMKHIiXAAMKRAITAAMKLwDbOk2ADinYBJcAAwqkAhMAAwqPANs6TYAOKfj4CTsAAwtLAAMLYAAGBPmADwABsMAEWwADC/CbAAMLhAITAAMLbwDbOk10DilwBYAPAAGwwgT6KXkrAAMMNARzAAMMULp7xAQABHMAAwzAuwABGuwQABIPAAMNPwDbD6RbAAMNcFMAAw1PANsK/AQFgA4p+gT6KXoXAAMNjwDbO7IDAAMNqwDbCeADAAF54AMAAXnU/SsAAw4QBHMAAw4suic0CAAKAwADDn8A2wngcwADD22rAAMOxXQOy5wFhAwVgA8AAbBhgA4pQYAOJVWADiVVgA8AAbFtgA7LPlQuNbwUABYPAAMP6wDbD6RTAAMQOwDbCvwEBYAOKfhbAAMRCFsAAxDgWwADEKC6FNcAAXguAkJq8iXiOEBzAAMRqhMAAxGTANs6ThpQBAAEWwADEci6OuMAAXcLAAF4NAIpWFsAAxJcug1bAAF4nALLrAMAAXi4/ScAAxMQlwADE0QCBwADEyMA2wr9gA4puPgFJwADE6hzAAMT/FsAAxPiCwADE7sA2wvmA4MAAbGonAQABlADAAGwyPgJOwADFHsAAxSQAAYHRYAOKUAEcwADFL4LAAMUmwDbC+SkBAAGTAMAAbLhJwADFPCXAAMVGAITAAMVAwDbQg2ADim4+AUfAAMVjg8AAxWvANsPpAwHAAMWCasAAxYJgA8AAbBiyHgA+AUrAAMWVARzAAMWcLp7xAQABH8AAxcCKdQEAASIWwADF1hTAAMXNwDbCvwEBYAOKboE+il4BFsAAxeUUwADF38A20IMEAWADim6BPopeAADAAF51AcAAxf9qwADF/2ADwABsGLIkAD4BSsAAxhIBHMAAxhkunvEBAAEfwADGPYp1AQABIhbAAMZTFMAAxkrANsK/AQFgA4pugT6KXgAWwADGYhTAAMZcwDbQgwQBYAOKboE+il4AAMAAXnUBwADGfGrAAMZ8YAPAAGwYsiEAPgFKwADGjwEcwADGli6e8QEAAR/AAMa6inUBAAEhHMAAxtYWwADG0BTAAMbHwDbCvwEBYAOKboE+il4nAQABFsAAxt8UwADG2cA20IMEAWADim6BPopeAMAAbF4AAMAAXnU/P0nAAMcRJcAAxx4AgcAAxxXANsK/YAOKZj4BSsAAxzcBHMAAxz4uic0CAAKAwADHRcA2wnhqwADHS2ADstvAAGgxAMAAXi4/SsAAx3IBHMAAx3kuic0CAAKAwADHicA2wngcwADHwGrAAMeXXQOy5wFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyz5XTjW8DAAODwADH28A2w+mBwADH38A2wr8WwADH6S6DVsAAXicAsusAwABeLgbAAF5agTLAAMgKwADIH8AA0RcAAIWIAWrAAMgLYAPAAGxWgLUAAAEDwADINcAA0RcAAAABAQHAAMhIAAAAhA1gA4ZnAABgA4pQAT4DTsAAyGPAAMhoAAGFhWADilABHMAAyGouwABGhMAAXcIBAAEWwADIhoDAAMiBwDbTB4WFhmkAwABeO0nAAMiRFsAAyJUuwABGfsAAXiU+BD0cwADIsi7AAEaLAAAAAMAAXjNOwADIzsAAyNQAAIWHYAOKUAEcwADI1i7AAEaEwABdwgEAARbAAMjygMAAyO3ANtMHhYeGawDAAF47PRzAAMkALsAARowAAAAAwABeNErAAMkTARzAAMkaLsAARooCAAKAwADJJsA20wcfwADJOoZzAwADHMAAyUwuncoBAAGBwADJVMA20x4AwABeMhbAAMlggMAAyVvANtMHhYaGahzAAMlqLp3KAQABgsAAyXLANtOAAMAAXjIAAMAAXjA/R8AAyYYWwADJk4DAAMmOwDbTB4WGhmoEAcAAyapqwADJqmADwABsGIeuAD4CScAAybglwADJwQCBwADJvMA20x5gA4puPgRJwADJ3hbAAMnnFMAAyeLANtMeAQFgA4pugT6KXkrAAMnuARbAAMn1LsAARnDAAF4ZP07AAModwADKIwABhYdgA4pQARzAAMolLsAARoTAAF3CAQABFsAAykGAwADKPMA20weFh4ZrAMAAXjtJwADKUyIlwADKXQCCwADKV8A21LdgA4puASXAAMp2AILAAMpwwDbUt2ADix8+AUrAAMqcAYLAAMqjwDbUtz9KwADKwQEcwADKyC6JzQIAAoDAAMrewDbTBxzAAMscasAAyvJdA7LnAWEDBWADwABsGGADilBgA4lVYAOJVWADwABsW2ADss+VC41vBQAFFsAAy0KAwADLPcA20weFhoZqFMAAy17ANtMeAQFgA4puFsAAy5AWwADLhhbAAMt2LoU1wABeC4CQmryJco4KHMAAy7uCwADLtcA21LeGlAEAARbAAMvDLo64wABdwsAAXg0AilYWwADL6i6DVsAAXicAsusAwABeLj9KwADMFgEcwADMHS6JzQIAAoDAAMwxwDbTBxzAAMxsasAAzENdA7LnAWEDA2ADwABsGGADilBgA8AAbFtgA7LPldONbwMAAxbAAMyQgMAAzIvANtMHhYaGaoHAAMyawDbTHhbAAMygLoNWwABeJwCy6wDAAF4uAcAAzMVqwADMxWADwABsGIerAD4CScAAzNMlwADM3ACBwADM18A20x5gA4puPgRJwADM+SEWwADNAxTAAMz+wDbTHgEBYAOKboE+il5KwADNCgEWwADNES7AAEZxwABeGj9OwADNOsAAzUAAAYWHYAOKUAEcwADNQi7AAEaEwABdwgEAARbAAM1egMAAzVnANtMHhYeGawDAAF47ScAAzXAiJcAAzXoAgsAAzXTANtbRYAOKbgElwADNkwCCwADNjcA21tFgA4sfPgFKwADNuQGCwADNwMA21tE/SsAAzd4BHMAAzeUuic0CAAKAwADN+8A20wccwADOOWrAAM4PXQOy5wFhAwVgA8AAbBhgA4pQYAOJVWADiVVgA8AAbFtgA7LPlQuNbwUABRbAAM5fgMAAzlrANtMHhYaGahTAAM57wDbTHgEBYAOKbhbAAM6tFsAAzqMWwADOky6FNcAAXguAkJq8iXKOChzAAM7YgsAAztLANtbRhpQBAAEWwADO4C6OuMAAXcLAAF4NAIpWFsAAzwcug1bAAF4nALLrAMAAXi4/SsAAzzMBHMAAzzouic0CAAKAwADPTsA20wccwADPiWrAAM9gXQOy5wFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyz5XTjW8DAAMWwADPrYDAAM+owDbTB4WGhmqBwADPt8A20x4WwADPvS6DVsAAXicAsusAwABeLgHAAM/iasAAz+JgA8AAbBiyCgA+AUrAAM/wASMhJcAAz/0AgcAAz/jANtMeYAOKZoHAANAdwDbTHhzAANAwLsAARoTAAF3CAQABFsAA0EyAwADQR8A20weFh4ZrAMAAXjsBYAOKUAABPgFKwADQawEcwADQci6JzQIAAoDAANCGwDbTBxzAANDBasAA0JhdA7LnAWEDA2ADwABsGGADilBgA8AAbFtgA7LPldONbwMAAxbAANDlgMAA0ODANtMHhYaGaoHAANDvwDbTHhbAAND1LoNWwABeJwCy6wDAAF4uBsAAXluBMsAA0RzAANExwADVAQAAhY4BasAA0R1gA8AAbFaAtQAAAQPAANFLwADVAQAAAAEBAcAA0WIAAACEDWADhnQAAGADilABPgJOwADRfcAA0YcAAYWKYAOKUAEcwADRiS7AAEaEwABdwgEAARbAANGlgMAA0aDANtmfhYqGdgDAAF47ScAA0bUcwADRw4HAANG5wDbZticBAAEWwADRxi7AAEZwwABeGQCKVT4BSsAA0dwBHMAA0eMuwABGhMAAXcIBAAEWwADR/4DAANH6wDbZn4WLhncAwABeO0nAANIRHMAA0h+BwADSFcA22bYnAQABFsAA0iIuwABGccAAXhoAilU+AUrAANI5ARzAANJALsAARoTAAF3CAQABFsAA0lyAwADSV8A22Z+FjIZ4AMAAXjtJwADScxbAANJ3LsAARn7AAF4lPgU9HMAA0pQuwABGiwAAAADAAF4zTsAA0rDAANK1AACFi2ADilABHMAA0rcuwABGhMAAXcIBAAEWwADS04DAANLOwDbZn4WLhncAwABeO07AANLpwADS8wAAhYxgA4pQARzAANL1LsAARoTAAF3CAQABFsAA0xGAwADTDMA22Z+FjIZ4AMAAXjs9HMAA0yMuwABGjAAAAADAAF40SsAA0zYBHMAA0z0uwABGigIAAoDAANNUwDbZnx/AANNohoEEAAQcwADTfi6dygEAAYHAANOGwDbZtgDAAF4yHMAA05IuncoBAAGCwADTmsA22sgAwABeMhzAANOvLp3KAQABg8AA07fANtsCAMAAXjIWwADTyIDAANPDwDbZn4WNhnkAAMAAXjA+AUrAANPpARzAANPwLonNAgACFsAA1AeAwADUAsA22Z+FioZ2HMAA1DlqwADUHF0DsucBYQMEYAOKUGADiVVgA4lVYAPAAGxbYAOyz5dejW8EAASBwADUVsA22bYWwADUiRbAANR/FsAA1G8uhTXAAF4LgJCavIlyjgocwADUtIHAANSqwDbZtoaUAQABFsAA1LwujrjAAF3CwABeDQCKVhbAANTfLoNWwABeJwCy6wDAAF4uBsAAXlyBMsAA1QbAANUbwADZqQAAhVABasAA1QdgA8AAbFaAtQAAAQPAANUrwADZqQAAAAEBAcAA1TgAAACEDWADhUUAAGADilABPgRJwADVRCXAANVWABbAANVNgMAA1UjANtzDhUmFR2ADh1Q+A0nAANWiHMAA1bYWwADVpi7AAEZzwABeHCcBAAErAMAAbF4+AUrAANXJARzAANXQLsAARokCAAKAwADV3sA23MMnwABGvADAAF4vPz4CTsAA1lEAAAA8XQPAAGxKAWADg8wBFsAA1lEeAMAAbC8BAV0DwABsIAFgA4PMARbAANZRFsAA1koWwADWOi7AAEZzwABeHIPAwABegYCfwABsZQA9wABsS0UAAAEcwADWUYEAwDbdSj4AAAAAwABsTQA+Ak7AANYxAAABg8FgA4PMARbAANZXgQDANt1KQMAAbE8+AUnAANZhHMAA1nAWwADWa4LAANZlwDbdvYGIg7AnAQABFsAA1niAwADWc8A23MOBiIVIAIkrPgFKwADWigEcwADWpxbAANahFsAA1pEuwABGc8AAXhyDwMAAXoEpAQABgsAA1qjANt29AMAAbGE/SsAA1sgBHMAA1s8uwABGiQIAAoDAANbdwDbcwyTAANcvAyfAAEa9FsAA1xKAwADXDcA23MOBiIVIJ8AARr4AwABeLz9OwADXTMAA11UAAYVJYAOKUAEcwADXVy7AAEaEwABdwgEAARbAANdzgMAA127ANtzDhUmFRwDAAF47ScAA14IiJcAA148AgcAA14bANt6QYAOKiQAcwADXsxbAANeuFsAA16mAwADXpMA23MOBiIVIgYiJIicBAAEngOAAwABsNj4BSsAA18gBHMAA188unvEBAAEcwADX5hbAANfcLsAARmnAAF4HwABGlgEAARbAANgFFsAA1/8UwADX9sA23pABAWADiomBPopegODAAGyRAMAAaCYAwABedUnAANgaFsAA2B4uwABGfsAAXiU+AUrAANg7ARzAANhCLsAARooCAAKAwADYTsA23MMfwADYYoVVAwADHMAA2G4uncoBAAGBwADYdsA23pAAwABeMhbAANiGgMAA2IHANtzDgYiFSBbAANiRgMAA2IzANtzDgxuFSwAAwABeMEnAANivJcAA2LwAgcAA2LPANt6QYAOKZj4BSsAA2NUBHMAA2Nwuic0CAAKAwADY48A23MNqwADY6WADstvAAGgxAMAAXi4/SsAA2Q8BHMAA2RYuic0CAAKAwADZJsA23MMcwADZWGrAANk0XQOy5wFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyz5Y/jW8DAAMWwADZfRbAANl4gMAA2XPANtzDgYiFSIGIiSKBwADZg8A23pAWwADZjS6DVsAAXicAsusAwABeLgbAAF5dgTLAANmuwADZw8AA2m0AAIXkAWrAANmvYAPAAGxWgLUAAAEDwADZy8AA2m0AAAABAQHAANnQAAAAhA1gA4fKAABgA4pQAT4CPRzAANngFsAA2dwujrfAAF4dwABGYwIAAhbAANn/gMAA2frANuDkhRSHzBzAANoJLsAARoTAAF3CAQABFsAA2i4WwADaJYDAANogwDbg5IUUh8yEy4jvAMAAXjsAwABelUrAANpBARzAANpILsAARoTAAF3CAQABFsAA2mSAwADaX8A24OSE+IfNAMAAXjsGwABeXoEywADacsAA2ofAAN3eAACFRQFqwADac2ADwABsVoC1AAABA8AA2pfAAN3eAAAAAQEBwADapAAAAIQNYAOFLQAAYAOKUAE+BE7AANwUwADcHQABhRRgA4jnARbAANwkgMAA3B/ANuHAhRSFL0nAANwyIiXAANxGABbAANw/gcAA3DbANuHXhACCWGADh8oBHsAA3FDAAF3HAQABgcAA3GPANuHXAD4BSsAA3HYBNcAA3IEAAAEAYAOKUAEcwADcgRbAANx9Lo63wABeHcAARr8BAAEWwADclYDAANyQwDbhwIUUhS8AwABelyMcwADcgYLAANyBwDbiPCcBAAErAIpVHMAA3Kwuic0CAAKAwADcwsA24cAcwADdEWrAANzWXQOy5wFhAwFgA8AAbBhgA7LPwABnW41vAQABFsAA3SiBwADdH8A24deBiIjrALLrAMAAXi6CwADcgcA24jwBYAOKUD9JwADdOhbAAN1HgcAA3T7ANuHXhMGI+j4BSsAA3VgBHMAA3V8uwABGhMAAXcIBAAEWwADdf4HAAN12wDbh14TLiO8AwABeOz9KwADdlwEcwADdni7AAEaJAgACgMAA3azANuHAJ8AARsAAwABeLwbAAF5fgTLAAN3jwADd+MAA4YIAAIVkAWrAAN3kYAPAAGxWgLUAAAEDwADeBsAA4YIAAAABAQHAAN4RAAAAhA1gA4XDAABgA4pQAT4BSsAA3h0BHMAA3iQuwABGXgEBYAOKUAE0wADeNwPAAN43wADhfQAAAAAAAABgA4pQAT4CTsAA3k/AAN5WAAGAvmADg6wBFsAA3l2AwADeWMA245aAvoXHScAA3mslwADedgCBwADeb8A24+BgA4PMPgJJwADeihbAAN6VFMAA3o7ANuPgAQFgA4PMhMGD3j4BSsAA3qoBHMAA3rEuwABGZwIBYAOKUAIUwADewsA24+ABAWADg8w0wADeygPAAN7KwADfGQAAAAAAAABgA4pQAT4BSsAA3tsBHMAA3uIuwABGhMAAXcIBAAEWwADfABTAAN75wDbj4AEBYAODzITLg9AAwABeOwDAAF49P0rAAN8uARzAAN81LonNAgACgMAA30nANuOWHMAA35VqwADfW10DsucBYQMBYAPAAGwYYAOyz8AAZo2NbwEAARbAAN+vFsAA36oUwADfo8A24+ABAWADg8yBiIOwgYiJIgCy6wDAAF4uScAA38QlwADfzwCBwADfyMA24+BgA4RLPgJJwADf5xzAAN/3FsAA3/IUwADf68A24+ABAWADhEuDvoROJwEAAWrAAOAIYAOEkoZnAMAAbF4+AUrAAOAcARzAAOAjLp7xAQABH8AA4DSLDwEAARTAAOBEwDbj4AEBYAOESwAAwABedT9KwADgYAEcwADgZy6JzQIAAoDAAOB7wDbjlhzAAODHasAA4I1dA7LnAWEDAWADwABsGGADss/AAGaNjW8BAAEWwADg4RbAAODcFMAA4NXANuPgAQFgA4RLgYiDsIGIiSIAsusAwABeLj4CPRzAAOEALsAARokCAAKAwADhG8A245YkwADhWAMnwABGwRbAAOE6gcAA4TPANuPghU7AAG0tJ8AARsIAwABeL0rAAOFjASsAwABedwbAAF5ggTLAAOGHwADhnMAA6Q8AAIWSAWrAAOGIYAPAAGxWgLUAAAEDwADhtMAA6Q8AAAABAQHAAOHJAAAAhA1gA4aCAABgA4pQAT4ETsAA4ejAAOH1AAHAAEbDXQPAAGwZAWADwABsVgExwADh/2ADwABsVgEfwADiBMAAbQwAAAAARcAA4hkBwADiIsAA4iQAAIHUYAPAAGwfAZMBHMAA4iuCwADiKcA25uKBOgEAARbAAOI+FsAA4jKAwADiLcA25pCFkIaEgODAAGxqAMAAbIUBisAA4kbANubiHMAA4keCwADiRsA25uKBPwEAAZQAwABsiD4CTsAA4lzAAOJlAACF4GADilABHMAA4mcuwABGhMAAXcIBAAEcwADijhbAAOKDgMAA4n7ANuaQhZCGhCkBAAGCwADij8A25uIAwABsuADAAF47ScAA4polwADipwCDwADinsA251JdA4pcAWADwABsVj4ETsAA4tYAAACBPmADwABsGABJwADi5SIlwADi8gAUwADi6cA251IDAV0DilwBYAPAAGxWYAOKfgAcwADjERbAAOMHLsAARmnAAF4HjicBAAEUwADjF8A251IDAWADin4AwABoJT4BPYzAAOMuwDbnxBzAAONWHsAA4zrAAG9ZAQABFsAA408UwADjRsA251IDAWADin6BPopeAIFTAAAAAMAAb2A+AT2MwADjfcA258QcwADjjhTAAOOFwDbnUgMBXQOKXAFgA8AAbFaBUwAAAACKYE7AAOOzwADjuAAAhw9gA8AAbFYBFsAA48eBwADjusA25qeHD8AAbTpJwADj1SXAAOPeAIXAAOPZwDbol2ADwABtBj4BPRzAAOQAFMAA4/vANuiXBQFgA8AAbQZFAQABhMAA5AbANufEAMAAbS4+AT0cwADkNoHAAOQpwDbmpzYBAAEfwADkPsAAbQwBAAGEwADkS8A258QAAMAAbEdJwADkaxbAAORvLsAARn7AAF4lPgE9HMAA5VaBwADlScA25qc2AQABg8AA5VrANudSAMAAbEc+AUrAAOV8ARzAAOWDLonNAgACgMAA5ZfANuaQHMAA5dxqwADlqV0DsucBYQMCYAOKUGADwABsW2ADss+Wq41vAgACg8AA5fvANudSFsAA5gUug1bAAF4nALLrAMAAXi5JwADmMRzAAOZJFsAA5kKBwADmNcA25qeA4MAAbGqBOwEAAZQAwABshj4DTsAA5m3AAOZ5AAGFkF0DwABsGQFgA4UaAR7AAOaJwABs/AEBYAOFGgEWwADmp4HAAOaawDbmp4DgwABsagBFwADmtgHAAOa/wADmwQAAgdRgA8AAbB8BkwEcwADmyIPAAObGwDbqOIE6AQABFsAA5teBwADmysA25qeA4MAAbGoAwABshQGLwADm38A26jgcwADm4IPAAObfwDbqOIE/AQABlADAAGyIPgJOwADm9cAA5vsAAIE+YAPAAGxWARzAAOcJgcAA5v3ANuanKQEAAYPAAOcKwDbqOADAAGy4ScAA5xYlwADnIACEwADnGsA26p9gA8AAbQY+AT0cwADnSILAAOc9wDbp9YCcAgACg8AA50nANuo4H8AA51KHyQEAARzAAOd0Lp7xAQABH8AA54WKkAEAARzAAOeaFMAA55TANuqfBAFgA8AAbQaBUwAAAADAAG0QAADAAF51AADAAGzLPgE9HMAA6EyCwADoQcA26fWAnAIAAoPAAOhNwDbqOBzAAOhSLp3KAQABJsAA6FoBhMAA6FrANuqfYAOKUADAAF4yAMAAbMtKwADoegEcwADogS7AAEaKAgACgMAA6I3ANuaQH8AA6JeGjAEAAYLAAOirwDbp9QAAwABeMD9KwADoxAEcwADoyy6e8QEAAR/AAOjcipABAAEcwADo/xbAAOj4gcAA6OvANuangOLAAGxrgVMAAAAAwABtigAAwABedQbAAF5hgTLAAOkUwADpKcAA+QUAAIV5AWrAAOkVYAPAAGxWgLUAAAEDwADpPsAA+QUAAAABAQHAAOlQAAAAhA1gA4YpAABgA4pQAT4JTsAA6WzAAOlzAAGAvmADhEsBFsAA6XqAwADpdcA27E6AvoYwTsAA6ZbAAOmgAAGBrWADheQBFsAA6aeAwADposA27E6BrYYsTsAA6cvAAOnXAAHAAEajXQPAAGwZAWADilABHMAA6dkuwABGpAEAAYLAAOn1wDbsiQDAAF5yTsAA6iHAAOonAAGFI10DwABsXwJgA8AAbBhgA4pQARzAAOopLsAARqUBAAGCwADqQMA27IkAwABec0nAAOpQFsAA6lQuwABGfsAAXiU+AUrAAOpxARzAAOp4LsAARooCAAKAwADqj8A27E4fwADqo4Y6AwACgcAA6sPANuxlHMAA6ssuwABGpwMAA4PAAOrgwDbsrYTAAOrtwDbs4xbAAOr+gsAA6vTANuyJg8uF5gDAAF50AYTBKQDAAF4wP0nAAOsvHMAA6z8WwADrOoHAAOszwDbsZYO+hE4nAQABasAA61BgA4SShkQAwABsXj4BScAA62EiIiIWwADrbIHAAOtlwDbsZYTBhGMAHMAA65IWwADrjRbAAOuIgcAA64HANuxlgYiDsIGIiSInAQABJ4lsAMAAbDYAHMAA68wWwADru4HAAOu0wDbsZYOJg7UnAQABFsAA69kWwADrzy6AkMAAXgqJJI3UAMAAbF4AHMAA7AUWwADr/oPAAOvywDbsrYDgwABsaicBAAGUAMAAbDI+AUnAAOwVIRzAAOwsFsAA7BkugPDAAF4IJwEAASsAwABsXj4CTsAA7HbAAOx7AACBiGADilABFsAA7ImDwADsfcA27K2A4sAAbGtJwADsmyXAAOykAIXAAOyfwDbumWADiok+A07AAOzMwADs0gAAgT5gA8AAbBgBHMAA7OYWwADs1C6A8MAAXggpAQABFsAA7OwUwADs58A27pkFAWADiomBPopeAMAAbGFOwADtCcAA7RYAAIHCYAOKUAEcwADtHYTAAO0YwDbs4ykBAAEngcIAwABsYUnAAO08HMAA7VYWwADtR4HAAO1AwDbsZYMzg7QnAQABFsAA7WMWwADtWS6AkMAAXgqJGo3OAMAAbF4+Ak7AAO2HwADtlAAAwABGxGADilABIxzAAO2chsAA7ZbANu7ZJwEAASeBHADAAGw2FsAA7bouwABGcMAAXhkjHMAA7eGGwADt28A27tknAQABJ4EeAMAAbDYWwADuBC7AAEZxwABeGiMlwADuNwCHwADuKsA27x9gA4puHMAA7mMuwABGlQEAARbAAO6BFMAA7nTANu8fBwFgA4pugT6KXgDAAF5rIyXAAO6xAIfAAO6kwDbvH2ADimYWwADu4S7AAEZvwABeGBbAAO8OLsAARnHAAF4aAWADilABYAOKUAFgA4pQAWADilBKwADvKwEUwADvMsA274cIAEnAAO9THMAA720WwADvXoHAAO9XwDbsZYMzg7QnAQABFsAA73oWwADvcC6AkMAAXgqJLY3aAMAAbF4+BE7AAO+YwADvoQAAuOlgA8AAbB8BIyEcwADvqYbAAO+jwDbu2ScBAAErAMAAbDYewADvt8AAbfcBAAGGwADvwMA27tkAKwFgA8AAbB9OwADv5gAAAMAARsVgA4pQAEnAAPABIRzAAPAOFMAA8AXANvC8CAAnAQABKwDAAGwyPgJOwADwLsAA8DYAAIwUYAPAAGxbARzAAPA+hsAA8DjANu7ZgSUBAAEnRADAAGyCPRXAAPBfwDbxCAkcwADwixbAAPCBLsAARmnAAF4HwABGlgIAARTAAPCbwDbwvAgAAcAARpchFMAA8LDANvE7CgDAAGgmScAA8M8cwADw3RbAAPDTLsAARmnAAF4HjicBAAGHwADw48A27x8AwABoJT4BPRXAAPEEwDbxCAmHwADxEsA27x8+AT0VwADxR8A28QgJFsAA8VUuwABGb8AAXhhKwADxgQEcwADxiC6e8QEAARTAAPGVwDbxCAkAAMAAXnVJwADxthzAAPHQFsAA8cGBwADxusA27GWDM4O0JwEAARbAAPHdFsAA8dMugJDAAF4KiV6N/QDAAGxePgM9IxzAAPIAhsAA8frANu7ZJwEAASsAwABsNo7AAPH6wDbu2SMlwADyIwCHwADyFsA27x9gA4qJFsAA8kQUwADyN8A27x8HAWADiomBPopeKwFgA8AAbBgrAWADwABsGEnAAPJgHMAA8mqGwADyZMA27tknAQABKwDAAGw2SsAA8nMBFsAA8nouwABGb8AAXhg/SsAA8pYBHMAA8p0unvEBAAEfwADyroqQAQABhsAA8r3ANu7ZAADAAF51P0nAAPLlJcAA8u4AhcAA8unANu6ZYAOKZj4BSsAA8w0BHMAA8xQuic0CAAKAwADzG8A27E5qwADzIWADstvAAGgxAMAAXi4/PgFKwADzmQEcwADzoC7AAEaKAgACgMAA87vANuxOH8AA89OGOgMAAoHAAPPkwDbsZRzAAPP+LsAARqcDAAODwAD0E8A27K2EwAD0IMA27OMWwAD0MYLAAPQnwDbsiYPLheYAwABedAGEwSkAwABeMD9JwAD0eRzAAPSOFsAA9IkWwAD0hIHAAPR9wDbsZYGIg7CBiIkiJwEAASeJLADAAGw2PgJOwAD09sAA9P0AAYQAYAOCUgEWwAD1BoHAAPT/wDbsZYQAglhJwAD1FCIlwAD1HwCFwAD1GMA29A5gA4KSABzAAPU0FMAA9S3ANvQOBQFgA4KSJwEAARbAAPVBFsAA9TcugJDAAF4KiSSN1ADAAGxePgROwAD1Z8AA9WwAAYWFYAOKUAEcwAD1eYPAAPVuwDbsrSkBAAGTAMAAbLhOwAD1lcAA9ZsAAYWHYAOKUAEcwAD1qIPAAPWdwDbsrSkBAAGUAMAAbLhJwAD1thbAAPW6LsAARn/AAF4mPgFKwAD2XQE1wAD2ZAAAAQBgA4pQARzAAPZkLsAARrgCAAKGwAD2d8A29ICHwAD2fcA29KoAwABeaCMcwAD2ZBTAAPZkwDb07wgAJwEAASsAilUcwAD2lS7AAEaVAQABHsAA9qbAAGz3AgAChsAA9rDANvSAh8AA9rbANvSqAADAAF5rFMAA9mTANvTvCAABYAOKUD9KwAD3OgEcwAD3QS7AAEaVAQABHsAA91LAAGz3AgAChsAA91zANvSAh8AA92LANvSqAADAAF5rP0nAAPd+FsAA94mBwAD3gsA27GWExoRqPgFKwAD3pAEcwAD3qy6JzQIAAoDAAPeywDbsTmrAAPe4YAOy28AAZegAwABeLj9OwAD35sAA9+sAAIGIYAPAAGwYARbAAPf5FsAA9/SBwAD37cA27GWBiIOwgYiJIknAAPgDIiXAAPgOAIHAAPgHwDbsZWADhEsAFsAA+CUUwAD4HsA27GUBAWADhEuFAIRxPgFJwAD4OBbAAPhBhcAA+DzANvX6gVbAAGyNPgE9jcAA+FTANvX6FsAA+HEWwAD4YhTAAPhbwDbsZQEBYAOES4Mzg7SBiIM4PgE9jcAA+I7ANvX6JMAA+LwDFsAA+K4WwAD4nxTAAPiYwDbsZQEBYAOES4Mzg7SBiIM4J4D3hcAA+LbANvX6P0rAAPjQARzAAPjXLsAARokCAAKAwAD45cA27E4kwAD5AAInwABGxoXAAPj7wDb1+gDAAF4vBsAAXmKBMsAA+QrAAPkfwAD63QAAhbcBasAA+QtgA8AAbFaAtQAAAQPAAPkwwAD63QAAAAEBAcAA+T4AAACEDWADhuMAAGADilABPgNOwAD5WcAA+WIAAYXgYAOKUAEcwAD5ZC7AAEaEwABdwgEAARbAAPmAgMAA+XvANvdOhYKG5gDAAF47ScAA+Y4WwAD5ki7AAEZ+wABeJT4BSsAA+a8BHMAA+bYuwABGigIAAoDAAPnNwDb3TjXAAPnhAAABAGADhuMBH8AA+eGG/QIAAhzAAPnuLp3KAQABgcAA+fbANvdlAMAAXjIcwAD6BRbAAPoBLo63wABeHYNnAQABFsAA+hmAwAD6FMA2906Bl4bnAMAAXpgANcAA+i4AAAEAXAEXwAD6LoLAAPnhwDb30IWuFsAA+m0WwAD6Wi6OuMAAXcLAAF4Ng1abIYb1gsAA+eHANvfQAMAAXjA/SsAA+pABHMAA+pcuwABGxwMAA4HAAPqnwDb3ZRzAAPqxLsAARpgCAAKAwAD6wsA2904WwAD6zYDAAPrIwDb3ToGXhucAwABecYDAAPrUwDb3TgDAAF5tBsAAXmOBMsAA+uLAAPr3wAD9uwAAha8BasAA+uNgA8AAbFaAtQAAAQPAAPsIwAD9uwAAAAEBAcAA+xYAAACEDWADhtEAAGADilABPgROwAD7McAA+zoAAYXgYAOKUAEcwAD7SRbAAPtBgMAA+zzANvkBhYKG1IP4AQFgA4pQAS4AhR5JwAD7WxbAAPtfLsAARn7AAF4lPgFKwAD7fAEcwAD7gy7AAEaKAgACgMAA+5rANvkBNcAA+64AAAEAYAOG0QEfwAD7robiAgACHMAA+7suncoBAAGBwAD7w8A2+RgAwABeMhbAAPvTgMAA+87ANvkBgZeG1QA1wAD75wAAAQBcARfAAPvngsAA+67ANvl/hAEWwAD7+YDAAPv0wDb5AYQBglmCWTXAAPwSAAABAFwBF8AA/BKCwAD7rsA2+X+EMBbAAPwfgMAA/BrANvkBhDCG04bTgsAA+67ANvl/AMAAXjA/ScAA/DElwAD8PgCBwAD8NcA2+RhgA4pmPgJOwAD8YMAA/GkAAMAARshgA4lVARbAAPxwgMAA/GvANvkBgZeG1UrAAPx8ARzAAPyDLsAARpUBAAEiIhzAAPydgsAA/JTANvpKJwEAARbAAPywFsAA/KAuhTXAAF4Lg1eayACJWQEiJcAA/M8AgsAA/MbANvpKYAOJqgAcwAD9BBbAAPz6FMAA/PHANvpKAgFgA4mqgtOJsCcBAAEWwAD9IRbAAP0XFsAA/QcuhTXAAF4LgJCavIlLje8AwABsXgElwAD9RAAWwAD9P4DAAP06wDb5AYGXhtVgA4lyAMAAXms/SsAA/V8BHMAA/WYuwABGlQEAARzAAP2ALp1SAgACgcAA/YrANvkYHMAA/ZQuwABGmAIAAoDAAP2lwDb5ARbAAP2wgMAA/avANvkBgZeG1QDAAF5xAMAAXmwAwABeawbAAF5kgTLAAP3AwAD91cAA//AAAIWDAWrAAP3BYAPAAGxWgLUAAAEDwAD93cAA//AAAAABAQHAAP3iAAAAhA1gA4ZcAABgA4pQAT4ETsAA/f3AAP4GAAGF4GADilABHMAA/gguwABGhMAAXcIBAAEWwAD+JIDAAP4fwDb7wIWChl4AwABeO0nAAP4yJcAA/j8AgcAA/jbANvvXYAOKbj4BSsAA/lgBHMAA/l8uwABGlQEAASEcwAD+eRTAAP5wwDb71wEBYAOKbicBAAEWwAD+fC7AAEZwwABeGQCKYQDAAF5rP0nAAP6VFsAA/pkuwABGfsAAXiU+AUrAAP62ARzAAP69LsAARooCAAKAwAD+ycA2+8AfwAD+04ZmAQABHMAA/tcuncoBAAGBwAD+38A2+9cAwABeMgAAwABeMD9KwAD+9gEcwAD+/S6JzQIAAoDAAP8NwDb7wBzAAP84asAA/xtdA7LnAWEDBGADilBgA4lVYAOJVWADwABsW2ADss+XXo1vBAAEgcAA/1PANvvXFsAA/4MWwAD/eRbAAP9pLoU1wABeC4CQmryJco4KHMAA/6uBwAD/osA2+9eGlAEAARbAAP+zLo64wABdwsAAXg0AilYWwAD/1C6DVsAAXicAsusAwABeLgbAAF5lgTLAAP/1wAEACsABAO4AAIXJAWrAAP/2YAPAAGxWgLUAAAEDwAEAHMABAO4AAAABAQHAAQArAAAAhA1gA4c+AABgA4pQAT4CTsABAEfAAQBYAAGGqGADgn4BIxzAAQBtFsABAGeAwAEAYsA2/amBPodAgSUBAAEngSYAwABsghbAAQCPHMABAH8uwABGyQEAAYDAAQCJwDb9qQDAAF55hAyCaisBYAOCfkrAAQClARzAAQCsLp7xAQABH8ABAL2KnwIAAhbAAQDRgMABAMzANv2pgT6HQIHAAQDYwDb9wAAAwABedQbAAF5mgTLAAQDzwAEBCMABBX0AAIWAAWrAAQD0YAPAAGxWgLUAAAEDwAEBGsABBX0AAAABAQHAAQEpAAAAhA1gA4ZQAABgA4pQAT4ETsABAUTAAQFNAAGF4GADilABHMABAU8uwABGhMAAXcIBAAEWwAEBa4DAAQFmwDb+k4V+hlIAwABeO0nAAQF8FsABAYAuwABGfsAAXiU+AUrAAQGdARzAAQGkLsAARooCAAKAwAEBu8A2/pMfwAEBz4ZbAgACHMABAd0uncoBAAGBwAEB5cA2/qoAwABeMhzAAQIzHMABAhEWwAECA4DAAQH+wDb+k4NzhlOCoQEBYAOJVQE0wAECFQPAAQIVwAECMQAAAAEBAcABAhYAAACLRmADiVUAAGADiVUBSsABAhwBHMABAiAWwAECHC6Ot8AAXh2DZwEAAYLAAQIvwDb/cADAAF6YAMAAbOuAoAAAAADAAGxmAADAAF4wP0nAAQJJJcABAlYAgcABAk3ANv6qYAOLAT4CScABAnIcwAECkBbAAQKJFsABAnuAwAECdsA2/pODc4ZTgODAAGxqJwEAARbAAQLIFsABArkWwAECsBbAAQKmFMABAp3ANv6qAQFgA4sBg7yLBYTHhFCDY4TzgODAAGxqAMAAbDI+Ak7AAQLvwAEC/QABg3NdA8AAbBkBYAOJVQEcwAEDCy7AAEaCAQABHMABAxguwABGygIAAoDAAQMqwDb+kxbAAQM1gMABAzDANv6Tg3OGUwDAAF5wAMAAXipKwAEDTgEcwAEDVS6e8QEAAR/AAQNziwACAAIUwAEDkMA2/qoBAWADiwGCwAEDmsA3AEYAAMAAXnU/SsABA7kBHMABA8AuwABGiQIAAoDAAQPZwDb+kyTAAQPdBCfAAEbLJ8AARswUwAEEbsA2/qoBAWADiwEngPcAwABeLz9KwAEFHAEcwAEFIy7AAEaJAgACgMABBTrANv6TJ8AARs0AwABeLwbAAF5ngTLAAQWCwAEFl8ABBjQAAIXsAWrAAQWDYAPAAGxWgLUAAAEDwAEFsMABBjQAAAABAQHAAQXGAAAAhA1gA4ftAABgA4pQAT4BSsABBdIBHMABBdkuic0CAAKAwAEF6cA3AXgcwAEGEGrAAQXvXQOy5wFhAwFgA8AAbBhgA7LPwABlgY1vAQABFsABBioWwAEGI4DAAQYewDcBeIRbh++BiILSALLrAMAAXi4GwABeaIEywAEG+cABBwLAAQf/AADAAEa4AAAAAQPAAQcUwAEH/wAAAAICAsABBx4AAACAomADilAAwAEHKgAAAICjYAOKUAAAYAOKUAE+AknAAQczIiXAAQc5AIDAAQc3wDcCHGADin4AJcABB1AAgcABB07ANwIqYAOKfj4CScABB2siFsABB3cWwAEHcRTAAQdvwDcCHAABYAOKfoE+il6Go8AAbSwAFsABB4gWwAEHghTAAQeAwDcCKgEBYAOKfoE+il6Go8AAbSxKwAEHjwEWwAEHli7AAEZxwABeGj9JwAEHqyIcwAEHtxbAAQexFMABB6/ANwIcAAFgA4p+gT6KXicBAAEoAAAAAAAAAAAAwABsMgAcwAEHyRbAAQfDFMABB8HANwIqAQFgA4p+gT6KXicBAAEoAAAAAAAAAAAAwABsMkrAAQfRARbAAQfYLsAARnDAAF4ZPz9KwAEH8AErBsAAXmmBMsABCATAAQgJwAEI7AAAwABGzgAAAAEDwAEIGsABCOwAAAABAQHAAQgkAAAAheBgA4pQAABgA8AAbFsBPgNJwAEINBzAAQhCFsABCDguwABGacAAXgeOJwEAAYDAAQhIwDcDfwDAAGglSsABCFMBKT9OwAEIbcABCHIAAIGXYAOJVQEcwAEIfYDAAQh0wDcDf4aUAQABFsABCIUujrjAAF3CwABeDQCKVkrAAQieASEiJcABCKwAgcABCKfANwPLYAOJqgAhHMABCMEuwABGzwEAARbAAQjdFMABCNjANwPLAQFgA4mqgtOJsADAAF5qBsAAXmqBMsABCPHAAQj2wAELPgAAwABGzwAAAAEDwAEJDMABCz4AAAABAQHAAQkTAAAAib1gA4MyAABgA8AAbFsBPgVOwAEJJcABCSwAAJ07YAPAAGxbARzAAQlBFsABCS4uwABGbsAAXhcpAQABgMABCULANwR1AMAAbGFJwAEJTiEcwAEJWYHAAQlSwDcEjicBAAErAMAAbF5KwAEJYgGBwAEJacA3BI4/PgJOwAEJlwAAADxdA8AAbEoBYAOESwEWwAEJlx4AwABsLwEBXQPAAGwgAWADhEsBFsABCZeAwAEJkcA3BHWDu4NaAD3AAGxLRQAAARzAAQmXggDANwT3PgAAAADAAGxNAD4CTsABCYQAAACDvGADhEsBFsABCaOCAMA3BPdAwABsTz4BScABCasiIiIcwAEJvhbAAQm5g8ABCa/ANwVYg76ETicBAAFqwAEJz2ADhJKGdgDAAGxeABzAAQn5FsABCfQWwAEJ74PAAQnlwDcFWIGIg7CBiIkiJwEAAScnAMAAbDYAIRbAAQoZg8ABCg/ANwVYgzSEYQAhFsABCjyDwAEKMsA3BViE8oRkPgFKwAEKWAE1wAEKXwAAAQBdA8AAbF8CYAODMmADwABsWwEWwAEKXy7AAEZuwABeFzXAAQpzAAABAGADgzIBgMABCnPANwR1NcABCnwAAAEAYAPAAGxbASo1wAEKcgAAAQBcARzAAQpyhMABCl/ANwYIgJwCAAKFwAEKc8A3BjGGwAEKfMA3BkgAwABsY4bAAQp8wDcGSD9JwAEKlRzAAQqpFsABCp+AwAEKmcA3BHWDU4NDJwEAASsAikxKwAEKsgEpP0rAAQrdATXAAQrkAAABAF0DwABsXwJgA4MyYAPAAGxbARbAAQrkLsAARm7AAF4XNcABCvgAAAEAYAODMgGAwAEK+MA3BHU1wAELCQAAAQBgA8AAbFsBHMABCwkuwABGzwEAARbAAQswFsABCyaAwAELIMA3BHWDU4NDgtOKRgDAAF5qNcABCvcAAAEAXAEcwAEK94LAAQrkwDcGyoCcAgACg8ABCvjANwbzhMABCwnANwcKAMAAbGOEwAELCcA3BwoGwABea4EywAELQ8ABC1DAAQuaAADAAEaVAAAAAQPAAQtgwAELmgAAAAEBAcABC2YAAACBPmADwABsWwAAYAOKbgFKwAELdgEjgMABC3bANwewFsABC34uwABGcMAAXhkWwAELjS7AAEZxwABeGgFgA4puBsAAXmyBMsABC5/AAQukwAEPYgAAnVIAAAABA8ABC63AAQ9iAAAAAgICwAELtwAAAIXgYAOKUADAAQvKAAAAgZdgA4lVAABgA8AAbFsBPgNOwAEL38ABC+wAAMAARtBgA4lVARzAAQv3gMABC+7ANwghhpQBAAEWwAEL/y6OuMAAXcLAAF4NAIpWScABDBgWwAEMHC7AAEZ/wABeJj4CScABDDkiIiIlwAEMSgCCwAEMPcA3CEhgA4mqABzAAQx/FsABDHUUwAEMaMA3CEgCAWADiaqC04mwJwEAARbAAQycFsABDJIWwAEMgi6FNcAAXguAkJq8iS2N2gDAAGxeACXAAQy3AIHAAQyywDcIL2ADiaoAHMABDOQWwAEM2hTAAQzVwDcILwEBYAOJqoLTibAnAQABFsABDQEWwAEM9xbAAQznLoU1wABeC4CQmryJJY3VAMAAbF4+AUrAAQ1TASk/ScABDW8iIiIlwAENgACCwAENc8A3CEhgA4mqABzAAQ21FsABDasUwAENnsA3CEgCAWADiaqC04mwJwEAARbAAQ3SFsABDcgWwAENuC6FNcAAXguAkJq8iSWN1QDAAGxeACXAAQ3wAIHAAQ3rwDcIL2ADiaoAHMABDh0WwAEOExTAAQ4OwDcILwEBYAOJqoLTibAnAQABFsABDjoWwAEOMBbAAQ4gLoU1wABeC4CQmryJLY3aAMAAbF4+Ak7AAQ5VwAEOWwAAgT5gA8AAbRYBFsABDnomwAEOZwCAwAEOXsA3CCFgA4p+gT6KXknAAQ6JIhbAAQ6Tg8ABDo3ANwoVwABG0cAAb44AHMABDqWDwAEOn8A3ChUnAQABHMABDq6DwAEOqMA3ChXAAEbSAAAAAMAAb48AwABsMj4BSsABDs4BKT8/P0rAAQ73ARzAAQ8OFsABDv4uhTXAAF4Lgu4DAAOCwAEPI8A3CEiBwAEPMcA3CC9qwAEPSGADmvSJ0gCbEwbAAF5tgTLAAQ9nwAEPcMABEK4AAMAARscAAAABA8ABD3/AARCuAAAAAwMDwAEPiQAAAIXgYAOKUADAAQ+cAAAAgZdgA4lVAMABD6sAAACEDWADglIAAGADilABPgJJwAEPtyEcwAEPvC6dUgIAAoDAAQ/GwDcLBoHAAQ/QwDcLFADAAF5sPgFKwAEP3wEcwAEP5i6JzQIAAoLAAQ/4wDcLIhzAARAlasABEAhdA7LnAWEDBGADilBgA4lVYAOJVWADwABsW2ADss+XXo1vBAAEgMABEDPANwsGgcABED3ANwsUHMABEFqAwAEQUcA3CwaGlAEAARbAARBiLo64wABdwsAAXg0AilYWwAEQdy6DVsAAXicAsusAwABeLj9KwAEQmwGAwAEQosA3CwYGwABeboEywAEQs8ABEMLAARE1AADAAEaqAAAAAQPAARDXwAERNQAAAAICAsABEOEAAACEDWADglIAwAEQ8QAAAIGtYAOF5AAAXQPAAGwZAWADiVUBPgFKwAERAgEcwAERCS7AAEbKAgACgMABERvANwwzFsABESuBwAERIcA3DEGDy4XmAMAAXnAGwABeb4EywAEROsABEUnAARG/AADAAEa1AAAAAQPAARFjwAERvwAAAAICAsABEW0AAACEDWADglIAwAERfQAAAIGXYAOKQQAAXQPAAGwZAWADiVUBPgFKwAERiQEcwAERkC7AAEbKAgACgMABEaLANwy9FsABEa2BwAERqMA3DMuDc4pEAMAAXnAGwABecIEywAERxMABEdPAARMNAADAAEbKAAAAAQPAARHkwAETDQAAAAICAsABEe4AAACEDWADglIAwAESAwAAAIPLXQPAAGwZAWADiVUAAF0DwABsGQFgA4lVAT4BSsABEs4BHMABEwEcwAES24HAARLVwDcNVYKhAQFgA4lVATTAARLfA8ABEt/AARL/AAAAAQEBwAES4AAAAItGYAOJVQAAYAOJVQFKwAES5gEcwAES5i7AAEaYAgACgMABEvfANw1HgsABEv3ANw2vAMAAXnEAwABs64CgAAAAAMAAbGYGwABecYEywAETEsABExvAARRRAADAAEaYAAAAAQPAARMrwAEUUQAAAAICAsABEzUAAACEDWADglIAwAETRAAAAIGXYAOJVQAAYAOJVQE+A07AARNfwAETZgABgbBgA4lVARzAARNsFsABE2gujrfAAF4dg2cBAAGBwAETe8A3DjYAwABemEnAAROHIRzAAROMLsAARmsBAAGCwAETm8A3Dk0AwABeEz4BSsABE6wBHMABE7Muic0CAAKAwAETxcA3DigcwAET+GrAARPVXQOy5wFhAwJgA4lVYAPAAGxbYAOyz5S5jW8CAAKBwAEUFcA3DjYWwAEUGy6DVsAAXicAsusAwABeLj9KwAEUQAGCwAEUR8A3Dk0GwABecoEywAEUVsABFGXAARUOAADAAEakAAAAAQPAARSAwAEVDgAAAAEBAcABFIsAAACBrWADheQAAF0DwABsGQFgA4pQAT4BSsABFJwBHMABFQIcwAEUuBbAARStgMABFKPANw8/hVuF54KhAQFgA4pQATTAARS8A8ABFLzAARUAAAAAAQEBwAEUyAAAAIQNYAOFGgAAYAOKUAE+AUrAARTWARzAARTdLsAARoTAAF3CAQABgcABFPTANw+bAMAAXjsAwABs64CgAAAAAMAAbGYGwABec4EywAEVE8ABFSnAARZWAADAAEalAAAAAQPAARU/wAEWVgAAAAEBAcABFUoAAACBrWADheQAAF0DwABsXwJgA8AAbBhgA4pQAT4EScABFVsWwAEVbxbAARVpgMABFV/ANxARhSOF6IFWwABs80rAARV4AWrAARV/XQPAAGxfAmADwABsGGADilDAAR1/P07AARW8wAEVwgABhSNdA8AAbF8CYAPAAGwYYAOKUAEywAEVxGADwABsGGADilAAPRzAARXcFsABFdaAwAEVzMA3EBGFI4XogbEBAAE0wAEV5APAARXkwAEWPwAAAAEBAcABFfUAAACdQGADhfIAAGABwABsXAE+AT0cwAEWCIHAARYDwDcQeICcAgACFsABFg6CwAEWCcA3ENeBiIX0HMABFhYuwABGhMAAXcIBAAEWwAEWMoLAARYtwDcQ14E+hfUAwABeOwDAAGxjAMAAbQNKwAEWRgGBwAEWTcA3EHgGwABedIEywAEWW8ABFmXAARjPAADAAEanAAAAAQPAARZ5wAEYzwAAAAMDA8ABFokAAACNpF0DwABsGQFgA4pQAMABFrUAAADAAEbTXQPAAGxfAmADwABsGGADilAAwAEWzwAAAIPLXQPAAGwZAWADiVUAAGADheQBPgZOwAEW88ABFv4AAYVbXQPAAGwZAWADhRoBHsABFwzAAGz8AQFgA4UaARbAARcsgMABFx3ANxGCgODAAGxqAE7AARdVwAEXWwABhSNdA8AAbBkBYAOF8gEewAEXacAAbPwBAWADhfIBFsABF4mBwAEXf8A3EZeA4MAAbP0ARcABF5YBwAEXn8ABF6EAAIHUYAPAAGwfAZMBHMABF6iFwAEXpsA3ElOBOgEAARbAARe5gMABF6rANxGCgODAAGxqAMAAbIUBjcABF8PANxJTHMABF8GFwAEXw8A3ElOBPwEAAZQAwABsiD4BPRzAARfYg8ABF87ANxHSgJwCAAKFwAEX2cA3ElMcwAEX3i6dygEAARzAARf0gMABF+bANxGCKQEAAYXAARf1wDcSUwDAAGy4AMAAXjIAwABsy07AARgIwAEYCgAAgdRgA8AAbB8Bkz0cwAEYHYHAARgTwDcRl4GxAQABNMABGCUDwAEYJcABGIgAAAACAgLAARgtAAAAgYhgA8AAbBgAwAEYPAAAAIE+YAOKUAAAYAHAAGxcAT4BPRzAARhQhMABGEvANxIQgJwCAAI1wAEYUQAAAQBgA8AAbB8BhcABGFHANxMMNcABGFIAAAEAYAPAAGwfAY3AARhSwDcTDBzAARhSFMABGFHANxOFCACBPwEAAZQAwABsiBTAARhRwDcThQgAH8ABGFyF+wIAAobAARhswDcTSBzAARhyLp3KAQABh8ABGHrANxNYAMAAXjIAAMAAbMsAwABssErAARiPAR/AARiahfADAAGDwAEYpMA3EdIChSOEwAEYt8A3EhCDy4LAARjFwDcRtAbAAF51gTLAARjUwAEY3cABGUkAAJ7xAAAAAQPAARjpwAEZSQAAAAEBAcABGPMAAACF4GADilAAAGADilABPgFKwAEZAwEcwAEZIBbAARkKLsAARmzAAF4UgW8CAAKAwAEZLMA3FG00wAEZNgPAARk2wAEZRAAAAAAAAABgA4pQAUrAARk8AYDAARk8wDcUbQDAAGyXBsAAXnaBMsABGU7AARlQwAEabAAAwABGqwAAAAEDwAEZacABGmwAAAEAAASBL2ADwABsVgFbAwMDwAEZdwAAAIm9YAODMgDAARmNAAAAg3NdA8AAbBkBYAOJVQDAARmeAAAAs3phAwBfAwAAAABfAwAAAT4CTsABGbrAARm+AACatGADwABefAEWwAEZwC7AAEZzwABeHEw+Aj0XwAEZ4S7AAEZzH8ABGffAAF6JAwADLoDAARoNwDcVEYHAARoUwDcVHwDAAF4cSsABGioBHMABGjOCwAEaMcA3FTSAlQAAAAAAPgE9F8ABGk0uwABGc4PAARpfwDcVTsAAXhwGwABed4EywAEaccABGnPAARszAADAAEZeAAAAAQPAARqIwAEbMwAAAQAABIEvYAPAAGxWAVsBAQHAARqLAAAAs3phAwBfAwAAAABfAwAAAT4CTsABGrPAARq6AAHAAEbUYAPAAF6KARbAARq8Lo63wABeHUw+Aj0XwAEa0S6Otx/AARrbwABemgAAAADAAF4dSsABGvoBHMABGwOAwAEbAcA3Fg+AlQAAAAAAPgE9F8ABGx0ujreBwAEbI8A3FinAAF4dBsAAXniBMsABG4jAARuRwAEfLwAAwABGuwAAAAEDwAEbr8ABHy8AAAAEBATAARu+AAAAneNgA8AAbBgAwAEbxgAAAICiYAPAAGwwAMABG80AAACAo2ADwABsMADAARvZAAAAhA1gA4JSAABgA4pQAT4DR8ABG+WAwAEb7cA3FsYGAcABG/5qwAEb/mADwABsGLItAD4BSsABHAsBH8ABHBaKiAEAASbAARwnARzAARwngcABHCXANxbWgT8BAAGCwAEcKcA3FuYAwABsiGADwABtFgABwAEcOGrAARw4YAPAAGwYsjAAPgFKwAEcRQEfwAEcUIqIAQABJsABHGEBHMABHGGBwAEcX8A3FtZEAQABgsABHGPANxbmAMAAbOFgA8AAbRYAAcABHHJqwAEccmADwABsGLIyAD4BSsABHH8BH8ABHIqKiAEAASbAARybARzAARybgcABHJnANxbWge8BAAGCwAEcncA3FuYAwABs02ADwABtFgABwAEcrGrAARysYAPAAGwYsjgAPgFKwAEcuQEfwAEcxIqIAQABHMABHNWBwAEc08A3FtZHAQABgsABHNfANxbmAMAAbRcAAcABHOZqwAEc5mADwABsGLI6AD4CScABHPQcwAEc+oLAARz4wDcW5icBAAGTAMAAbDI+AUrAAR0MARzAAR0TLonNAgACg8ABHSnANxb2HMABHUxqwAEdL10DsucBYQMCYAPAAGwYYAPAAGwYYAOyz8AAaKeNbwIAAoDAAR1awDcWxiTAAR1iAYHAAR1gwDcW1gCy6wDAAF4uP0rAAR14ARzAAR2JFsABHX8uwABGacAAXgfAAEbVAgACgcABHZrANxbWgsABHZ3ANxbmAMAAaCkBwAEdrGrAAR2sYAPAAGwYsjUAPgFKwAEduQEfwAEdxIqIAQABJsABHdUBHMABHdWBwAEd08A3FtaB/QEAAYLAAR3XwDcW5gDAAGzgYAPAAG0WAEfAAR3mgMABHe7ANxbGBAHAAR3/asABHf9gA8AAbBiyGAA+AUrAAR4MARzAAR4TLsAARpUBAAEcwAEeJoHAAR4kwDcW1oE6AQABgsABHijANxbmAMAAbIUAwABeawHAAR43asABHjdgA8AAbBiyGwA+AUrAAR5FARzAAR5MLsAARpUBAAEcwAEeX4HAAR5dwDcW1oMAAQABgsABHmLANxbmAMAAbPYAwABeawHAAR5xasABHnFgA8AAbBiyFQA+AUrAAR5/ARzAAR6GLsAARpUBAAEcwAEemYHAAR6XwDcW1oPXAQABgsABHpzANxbmAMAAbRQAwABeawHAAR6rasABHqtgA8AAbBiyEgA+AUrAAR64ARzAAR6/LsAARpUBAAEcwAEe0oHAAR7QwDcW1oE7AQABgsABHtTANxbmAMAAbIYAwABea0rAAR7jARzAAR7qLsAARokCAAKDwAEe+MA3FvYkwAEfKgMnwABG1oDAAR8lwDcWxieRJADAAF4vBsAAXnmBMsABHzTAAR88wAEgFAAAwABGyQAAAAEDwAEfRcABIBQAAAABAQHAAR9PAAAAhA1gA4JSAABgA4KSAT4BQ8ABH7spPgJJwAEf0CXAAR/ZAIDAAR/UwDcbKGADgpJKwAEf5QEUwAEf7MA3GygAAWADgpI/PYjAAR/4wDcbKBbAASAEgMABH//ANxsohACCWAAANnlMADZ5tAA2ehMANnp9ADZ7dAA2fNIANn3AADZ+9QA2hTgANoXWADaGTwA2h0gANofBADaIvAA2iU8ANonhADaK+wA2i6QANoxKADaM8AA2jZYANpCTADaRMAA2kegANpKzADaTGgA2k9cANpRxADaU7AA2lUsANpXCADaWWwA2ltsANpdbADaYIwA2mXEANpsRADaccwA2nhMANp93ADahOwA2osEANqM0ADaqNQA2q3oANq7uADaxlAA2sjEANry6ADbBwQA2wkEANtLQADbZaAA23IwANuCtADbhiQA2418ANuZZADbsFwA29xcANvjKADb7iQA2/XIANv5cADcBQQA3AfAANwNTADcESQA3B4QANwf3ADcK2gA3DAcANwyRADcNGwA3DfwANw8TADcP5QA3EVYANxRDADcU2AA3FdYANxaaADca/AA3G5AAAABTAsAAXnyBMsABITTAASE6wAEmkAPAAEbXAAABYAPAAGxWAAAGBMAAXn6BMsABIWDAASFpGMAARtgAYAPAAF4DAATAAF5/gTLAASGfwAEhpAmJvQBgA4MyAATAAF6AgTLAASH7wAEiCAmDcwBdA8AAbBkBYAOJVQAEwABegYEywAEiVMABInAJg8AAXQPAAGxfAmADg8xgA4pQATLAASJuYAODzGADilAABMAAXoKBMsABIpHAASKuCYWlAF0DwABsGQFgA4gmATHAASKsYAOIJgAEwABeg4EywAEiysABIuoJhaYAXQPAAGwZAWADhRoBMcABIuhgA4UaAAEFwABeiYEywAEi78ABIu/AASMuAAAAA8ABIv7AASMuAAAAAwMDwAEjBAAABMAARthgA8AAXgMAwAEjFAAABIm9YAODMgDAASMgAAAEg3NdA8AAbBkBYAOJVQAAYAPAAF58AT8ECAHAAF5+gADANx4FCAHAAF5/gQDANx4XCAHAAF6AggDANx4lCQHAASLvwABsWgAAAAADBsAAXoWBMsABIzPAASM4wAEjiAAAwABGsgAAAAEDwAEjRcABI4gAAAACAgLAASNMAAAAg8FgA4PMAMABI1wAAACF4GADilAAAFwBPgE9HMABI3IWwAEjbC6DwMAAXoGAnAIAAoDAASNzwDceo4HAASN8wDcesQDAAGxjBsAAXoaBMsABI43AASOewAElIAAAwABGrgAAAAEDwAEjq8ABJSAAAAAAAAAAYAOK3wE+BUAWwAEjwxbAASO7LoWlwABegoFWwABs88ABI7vAASPKAE7AASPwwAEj/AABhaRdA8AAbF8CYAOCfmADilABMsABJBNgA4J+YAOKUAA9HMABJCIWwAEkGy6DwMAAXoGBsQEAATTAASQqA8ABJCrAASSoAAAAAgICwAEkMQAAAIPBYAODzADAASRBAAAAgT5gA4pQAABgAcAAbFwBPgJAISXAASRdAILAASRXwDcfq2ADix/AASRXwAEkdAA9HMABJIiAwAEkfcA3H0iAnAIAAhbAASSPgcABJInANx+dhAyCaoLAASScwDcfqwDAAGxjAMAAbLBAFsABJMYWwAEkti6FpsAAXoOBVsAAbPPAASS2wAEkzQBKwAEk1AEfwAEk34rxAwADFsABJPYWwAEk8C6JvcAAXn+EDIJqFsABJQEug3PAAF6AgMABJRDANx9IAAbAAF6HgTLAASUlwAElNsABJo4AAMAARq0AAAABA8ABJU7AASaOAAAAAAAAAGADhrIBPgNOwAEleMABJYQAAYWkXQPAAGxfAmADgn5gA4UaATLAASWdYAOCfmADhRoAPRzAASWsFsABJaUug8DAAF6BgbEBAAE0wAEltAPAASW0wAEmGAAAAAICAsABJbsAAACDwWADg8wAwAElywAAAIE+YAOKUAAAYAHAAGxcAT4BPRzAASXlgMABJdrANyCrgJwCAAIWwAEl7IHAASXmwDchAIQMgmocwAEmAxbAASX5LsAARtjAAF5+ncoBAAGCwAEmC8A3IQ4AwABeMgDAAGxjAMAAbLBKwAEmHwEfwAEmKobCBQAFFsABJkoWwAEmRC6JvcAAXn+EDIJqFsABJlUug3PAAF6AgMABJmTANyCrFsABJnEuhaXAAF6CFsABJnouhabAAF6DAAAANx53ADce8gA3IHYANyHPAAAAAwLAAF6KgTLAASbawAEm4MABLmoDwABG2QAAAWADwABsVgAAAwTAAF6NgTLAASdPwAEngQm6/sAAXcIAXQPAAGxfAmADiiZgA4lVATLAASd/YAOKJmADiVUABMAAXo6BMsABJ+bAASgaCcAARtrAAF3CAF0DwABsXwJgA4jnYAOKUAEywAEoGGADiOdgA4pQAATAAF6PgTLAASjnwAEpKQnAAEbbwABdwgBdA8AAbFcBYAOI5wEewAEpD8AAbHwAAWADiOcAAAEFwABemgAAAAAEAAADAAAAAAAAAAAAYAPAAF6KAT8BCQEAwABsWgAAAAAHBsAAXpGBMsABKV7AASlnwAEpngEAgVYAAAABA8ABKW/AASmeAAAAAAAAAGADwABsWwFKwAEpcgEiFsABKYEWwAEpci66/sAAXcLAAF6NgVbAAG07ABbAASmXFsABKYwuwABG2sAAXcLAAF6OgVbAAG07BsAAXpSBMsABKaPAASmowAEqRgAAwABGtAAAAAEDwAEpvcABKkYAAAACAgLAASnMAAAAhThgA4omAMABKeAAAACBPmADiVUAAFwBPgJAIRzAASoEFsABKfUuuv7AAF3CwABejYGKAQABgMABKhDANyN0AMAAbJ3AASn0wAEqGgA9HMABKi8WwAEqIS66/sAAXcLAAF6NgJwCAAKAwAEqMMA3I3SBwAEqPcA3I4IAwABsYwbAAF6VgTLAASpLwAEqUMABKxQAAMAARmMAAAABA8ABKmDAASsUAAAAAgICwAEqdQAAAIUUYAOI5wDAASqIAAAAgT5gA4pQAABcAT4CPRzAASqfFsABKpUuwABG2sAAXcLAAF6OgJwCAAKAwAEqoMA3JCaBwAEqrMA3JDQAwABsY0nAASq3JcABKsEAgcABKrvANyQ0YAOLHz4BPRzAASr9FsABKuEuwABG28AAXcLAAF6PNgEAAYDAASsBwDckJgDAAGx9PwbAAF6WgTLAASsZwAErIsABK7cAAMAARtwAAAABA8ABKzbAASu3AAAAAQEBwAErRQAAAIU4YAOKJgAAYAOJVQE+A07AAStlwAErawABgT5gA4lVARzAASt7FsABK20uuv7AAF3CwABejSkBAAGAwAErfMA3JOwAwABsYUAhHMABK5mBwAErk8A3JQMnAQABKwCJWcABK5PAASugAErAASunAYHAASuuwDclAwbAAF6XgTLAASu8wAErxcABLJUAAMAARr8AAAABA8ABK9PAASyVAAAAAQEBwAEr6AAAAIUUYAOI5wAAYAOKUAE+A07AASwBwAEsBwAAgT5gA4pQARzAASwTFsABLAkuwABG2sAAXcLAAF6OKQEAAYDAASwUwDcllwDAAGxhScABLCMlwAEsLQCBwAEsJ8A3Ja5gA4sfPgE9HMABLGkWwAEsTS7AAEbbwABdwsAAXo81AQABgMABLHDANyWXAMAAbH4/SsABLIUBgcABLIzANyWuBsAAXpKBMsABLN3AASz/wAEt3gEAwABGtwAAAAEDwAEtGsABLd4AAAAAAAAAXQPAAGwgAWADix8BPgJJwAEtIBbAAS1AFsABLSQuwABG28AAXcLAAF6PgVbAAGzzSsABLUkBasABLVBdA8AAbBkBYAOLH8ABHZY/SsABLV4BHMABLYEWwAEtZS7AAEbbwABdwsAAXo+CoQEBYAOLHwE0wAEtowPAAS2jwAEt2QAAAAEBAcABLbgAAACFFGADiOcAAGADix8BSsABLcUBJsABLcUBHMABLc8WwAEtxS7AAEbawABdwsAAXo4pAQABgMABLdDANybuAMAAbGFgA4sfAMAAbOsGwABemIEywAEt48ABLezAAS5oAACDZwAAAAEDwAEt+sABLmgAAAABAQHAAS4EAAAAgZdgA4lVAABgA4lVAT4CScABLhAWwAEuIxbAAS4ULrr+wABdwsAAXo2BVsAAbTtKwAEuLAGAwAEuM8A3J2o/SsABLj0BHsABLkSWJAIAAoDAAS5PwDcnahbAAS5VLrr+wABdwsAAXo0AAAA3ItYANyNIADcj+gA3JMAANyVrADcmPAA3J0AANyfaAAAABwLAAF6bgTLAAS5twAEuc8ABME8DwABG3QAAAWADmK0AAAEEwABenYEywAEuscABLsYYwABG3gBgA8AAbFgBKwEFwABeoQAAAAAEAAADAAAAAAAAAAAAYAPAAF6bAT8BCQEAmLQAAAAAAQbAAF6fgTLAAS7LwAEu1MABME0AAIWrAAAAAQPAAS7qwAEwTQAAAAEBAcABLv0AAACEDWADhsMAAGADglIBPgFJwAEvCRzAAS8aFsABLxKAwAEvDcA3KJKDbYbFJwEAARbAAS8dLsAARt7AAF6dAMAAbHM+AUrAAS81ARzAAS9MFsABL0GAwAEvPMA3KJKFfobGg/gBAWADglIBLgCFHj4FTsABL3HAAS98AADAAEbfYAPAAGxYARbAAS9+LsAARt7AAF6dPRfAAS+ULsAARt4WwAEvqoDAAS+lwDcokoNthsXAAF6dPRfAAS++gMABL7nANyiShX41wAEv6AAAAQBgA4UaASbAAS/oABzAAS/bFsABL9CAwAEvy8A3KJKFfobGg/gBAWADglIBLgCFHmADhRo1wAEwAAAAAQBcARfAATAAgsABL+jANylghACAwAEwCcA3KJKCWILAAS/owDcpYIbGPRfAATAVLsAARt6BwAEwJsA3KQrAAF6dSsABMDgBgMABMD/ANyiSAAA3KGgANynzAAAAAQLAAF6igTLAATCLwAEwkcABMTgDwABG4AAAAWADwABsVgAAAwTAAF6kgTLAATC1wAEwuQmEDQBgA4JSAATAAF6lgTLAATDLwAEw0gmAlgBgA7LPAATAAF6mgTLAATDxwAEw+AmBMwBdA8AAbBkBYAOy7gABBcAAXqiBMsABMP3AATD9wAExNgAAAAPAATENwAExNgAAAAMCAsABMRMAAASEDWADglIAwAExHgAABICWYAOyzwABwAExLQAABIEzXQPAAGwZAWADsu4BagBgAcAAbFwCYAPAAF6iAT8ECAHAAF6kgADANyqZCAHAAF6lgQDANyqnCAHAAF6mggDANyq2CQHAATD9wABsWgAAAAAAAAA3KxAAAAAAAsAAXqmBMsABMTvAATFBwAExyQPAAEbhAAABYAPAAGxWAAACBMAAXquBMsABMXHAATF1CYQNAGADglIABMAAXqyBMsABMYbAATGNCYCWAGADwABsGAABBcAAXq6BMsABMZLAATGSwAExxwAAAAPAATGuwAExxwAAAAICAsABMbQAAASEDWADglIAwAExvwAABICWYAPAAGwYAABgA8AAXqkBPwMIAcAAXquAAMA3K5UIAcAAXqyBAMA3K6MJAcABMZLAAGxaAAAAAAAAADcr5AAAAAACwABer4EywAExzMABMdvAATKDh8AARuIAAAFgA8AAbFYAAAABBcAAXrSBMsABMe3AATHzwAEyAgEAAAPAATIAwAEyAgAAAAAAAABgA8AAXq8BPwEJAcABMfPAAGxaAAAAAAIGwABesYEywAEyB8ABMgzAATJIAAKJzQAAAAEDwAEyEsABMkgAAAACAgLAATIiAAAAgJZgA7LuAMABMkAAAACBM10DwABsGQFgA7LuAABcAAbAAF6ygTLAATJNwAEyUsABMoEAAsAARogAAAABA8ABMmnAATKBAAAAAQEBwAEyfAAAAIQNYAOFIgAAXAAAADcsUAA3LKAANyzdAAAAAgLAAF61gTLAATKGwAEyjMABNQ+DwABG4wAAAWADwABsVgABYAPAAF6vAAEFwABevYEywAEyvcABMsPAATLYAQAAA8ABMtbAATLYAAAAAAAAAGADwABetQE/AQkBwAEyw8AAbFoAAAAABAbAAF63gTLAATLdwAEy7sABM58AAInNAWrAATLeYAPAAGxWgLUAAAEDwAEy9MABM58AAAACAgLAATMEAAAAgJZgA7LuAMABMyIAAACBM10DwABsGQFgA7LuAABcAT4CPRzAATMxLsAARuTAAF3CAQABgMABMznANy2OAMAAXro+Ak7AATNtAAAAPF0DwABsSgFgA7LuARbAATNtHgDAAGwvAQFdA8AAbCABYAOy7gGBwAEzbcA3LZwAPcAAbEtFAAABHMABM22CAMA3Ldk+AAAAAMAAbE0APgJOwAEzWwAAAK/HYAOy7gEWwAEzdoIAwDct2UDAAGxPPgE9HMABM34uwABG5MAAXcIBAAGDwAEzhsA3LjEAwABeugbAAF64gTLAATOkwAEztcABM/gAAMAARogBasABM6VgA8AAbFaAtQAAAQPAATPMwAEz+AAAAAEBAcABM98AAACEDWADhSIAAFwBPgAGwABeuoEywAEz/cABNALAATRrAADAAEbkwABdwgAAAAEDwAE0CcABNGsAAAABAQHAATQZAAAAgJZgA7LuAABcAT4BPRzAATQoLq4zAwADFsABND6AwAE0NsA3Lu2BTLLwFsABNEuAwAE0Q8A3Lu2JzrLxFsABNF+AwAE0V8A3Lu2AlrL2AMAAXrsGwABeu4EywAE0cMABNHXAATUNAACuMwAAAAEDwAE0gsABNQ0AAAADAwPAATSHAAAAgUxgA8AAbFgAwAE0kAAAAIQKYAPAAGwfAMABNJ8AAACAlmADwABsGAAAXAE+Aj0bwAE0scAAbCk3Kj0cwAE0zhrAATTHwABt7YFlAQABJMABNQgFgMABNNjANy9xJ4FZgcABNN3ANy+BJ8AARuWCwAE1AMA3L5EAwABvkAAANy1XADcucQA3Lr0ANy9HADcv9AAAAAQCwABevoEywAE1EsABNRjAATqnA8AARuYAAAFdA5ffAWADwABsWwAAAQTAAF7BgTLAATVWwAE1hAnAAEbnwABdwgBdA8AAbFcBYAOKJgEewAE1cMAAbHwAAWADiiYAAAEFwABezwAAAAAEAAADAAAAAAAAAAAAYAPAAF6+AT8BCQEAl+wAAAAACwbAAF7DgTLAATWJwAE1jsABNc4AAMAARmsAAAABA8ABNZzAATXOAAAAAQEBwAE1pgAAAIGXYAOJVQAAYAPAAGxbAT4BSsABNbIBHMABNb6AwAE1ucA3MMKD+AEBYAPAAGxbAS4AiVcGwABexIEywAE108ABNeTAATZAAACICgFqwAE11GADwABsVoC1AAABA8ABNfPAATZAAAAAAQEBwAE1/QAAAIQNYAOJVQAAYAPAAGxbAT4BPTDAATYJJ8AARugGwABexYEywAE2RcABNlbAATaAAACGTAFqwAE2RmADwABsVoC1AAABA8ABNmbAATaAAAAAAQEBwAE2cwAAAIQNYAOJZAAAYAPAAGxbAUrAATZ8ASkGwABexoEywAE2hcABNpbAATbAAACGTwFqwAE2hmADwABsVoC1AAABA8ABNqbAATbAAAAAAQEBwAE2swAAAIQNYAOJcgAAYAPAAGxbAUrAATa8ASkGwABex4EywAE2xcABNtbAATb6AACGUQFqwAE2xmADwABsVoC1AAABA8ABNuPAATb6AAAAAQEBwAE27QAAAIQNYAOJgAAAYAPAAGxbAUrAATb2ASkGwABeyIEywAE2/8ABNxDAATc4AACGVQFqwAE3AGADwABsVoC1AAABA8ABNx/AATc4AAAAAQEBwAE3KwAAAIQNYAOJnAAAYAPAAGxbAUrAATc0ASkGwABeyYEywAE3PcABN07AATe6AACGcgFqwAE3PmADwABsVoC1AAABA8ABN2TAATe6AAAAAQEBwAE3dwAAAIQNYAOJ/gAAYAPAAGxbAT4BSsABN4MBHMABN54WwAE3ii7AAEbnwABdwsAAXsErAQABFsABN6yAwAE3p8A3Mt6FOIoBAMAAbHgGwABeyoEywAE3v8ABN9DAAThfAACGWAFqwAE3wGADwABsVoC1AAABA8ABN+LAAThfAAAAAQEBwAE38QAAAIQNYAOJqgAAYAPAAGxbAT4BSsABN/0BHMABOCAWwAE4CYDAATgEwDczZYNzia6LVgEAATTAATgmA8ABOCbAAThaAAAAAQEBwAE4MAAAAIWUYAOJVQAAYAPAAGxbAUrAAThBARzAAThOgcABOEHANzOzg/gBAWADwABsWwEuAIlXAMAAbXkGwABey4EywAE4ZMABOHXAAToGAACGXwFqwAE4ZWADwABsVoC1AAABA8ABOIbAAToGAAAAAQEBwAE4lAAAAIQNYAOJvgAAYAPAAGxbAT4FTsABOLrAATjFAAGLd10DwABsGQFgA4omARbAATjMgMABOMfANzQog2OJwD0cwAE49BbAATjgLsAARufAAF3CwABewYE0AQABgcABOPvANzRBAMAAbRtOwAE5F8ABOR4AAYGwYAPAAGxbASIiHMABOTAWwAE5JYDAATkgwDc0KIUDicaD+AEBYAPAAGxbAS4A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CCk/SZmXFpmih5mbwDdvxa/uwABARz4BPRWZ3MA3cBAIKT9JmfsUmf/AN3AQCAA+Aj0cmhMurGADAAMcmjpqmh5dA7LnAWEDAWADwABsGGADss/AAGIajW8BAAGFmkjAN2+eALLrFppihppbwDdvrInOwABANGqabmADwABsHwMAwABMSj0cmr0urGADAAMcmuRqmshdA7LnAWEDAWADwABsGGADss/AAGJ+jW8BAAGFmvLAN2+eALLrFpsMh5sFwDdvxYnOwABANGqbGGADwABsHwMAwABMSj8AwABCaT0Xm0MWmzguwABHAMAAXzHAAF81hK41m0wAAAEAYAPAAEGGARabTC6ErsAATHUjHJtMhZtMwDdxiicBAAErAMAAbF4rHJtUhZtMwDdxiqyOAQABgJtawDdo3ADAAEGVAWADiVWDhUqbcAEWm3cuwABHAMAAXzHAAF81BsAAXz2BOZuKm5ufngAAtuoBapuLYAPAAGxWgLUAAAEDm6WfngAAAAEBAZuuAAAAtZtgA8AAQC4AAFwBPgFJm7slm8UAgJu/wDdyGGADwABfMj4EPReb7hSb6MA3chgAAWADwABfMsAARwHAAF8xLsAAXzZJnAQanAjAAFhYPgE9F5woLrb6FJw6wDdyGAABYAPAAF8ywABfNz89HJxVFpxPLpppwABMRbdtAQABNJxoA5xonUQAAAACAgKccAAAAIGIYAPAAGwYAJx+AAAAhERgA8AAQC4AAGABwABsXAE+Ak6cmJykAAC3bmADwABALgEcnL4WnLgUnLLAN3IYAAFgA8AAXzKaacAATEWvDQIAAYGc0MA3cqkBguYqwABCZkmc7iEcnP6DnPLAN3LQJwEAASsAwABsXj4BPRydGoKdE8A3cre26gEAAYOdJcA3ctAAwABAUT8AwABCaD0cnVMWnU0ummnAAExFt28BAAE0nWYDnWaeNQAAAAICAp1uAAAAgYhgA8AAbBgAnXwAAACERGADwABALgAAYAHAAGxcAT4CTp2WnaIAALduYAPAAEAuARydsBadqhSdpMA3chgAAWADwABfMpppwABMRa8NAgABgZ3CwDdzawGC5inAAEJmSZ3fIRyd74Od48A3c5InAQABKwDAAGxePgE9HJ4Lgp4EwDdzebbqAQABg54WwDdzkgDAAEBRPwDAAEJpPgE9HJ7BFp65LoEV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PgAGwABfqIE6wABKLsAASjPAAEqhAADAAEdbAAAAAQPAAEpYwABKoQAAAAEBAcAASl8AAADAAEdWYAO+TQAAXAE+AT0cwABKci7AAEcGAQABJ8AAR1wAwABfSwbAAF+pgTrAAEyswABMscAATVMAAMAAR10AAAABA8AATMnAAE1TAAAABQUFwABM0AAAALZ7YAO+TQDAAEzdAAAAwABHGWADvk0AwABM8QAAAIZJYAO+TQDAAE0FAAAAwABHFWADvk0AwABNHgAAAK8YYAO+TQAAXAE+AT0cwABNLi7AAEcGAQABJ8AAR14AwABfSwbAAF+qgTrAAE1YwABNXcAATXsAAMAARIYAAAABA8AATWbAAE17AAAAAQEBwABNbQAAAMAAR19gA75NAABcAT4ABsAAX6uBOsAATePAAE3owABOHQAAwABEiwAAAAEDwABN78AATh0AAAABAQHAAE32AAAAwABHX2ADvk0AAFwBPgE9HMAATgkuwABHBgEAASfAAEdgAMAAX0sGwABfrIE6wABOIsAATifAAE5rAADAAEdhAAAAAQPAAE47wABOawAAAAEBAcAATkAAAACKU2ADwABsHwAAXAE+AT0cwABOTS7AAEcGAQABJ8AAR2IAwABfSwbAAF+tgTrAAE5wwABOdcAATpEAAMAAR2MAAAABA8AAToLAAE6RAAAAAQEBwABOiQAAAKlqYAO+TQAAXAE+AAbAAF+ugTrAAE6WwABOm8AATtAAAMAAR2QAAAABA8AATqbAAE7QAAAAAQEBwABOqwAAAIpTYAPAAGwfAABcAT4BPRzAAE64LsAARwYBAAEnwABHZQDAAF9LBsAAX6+BOsAATtXAAE7awABO+QAAwABHZgAAAAEDwABO6sAATvkAAAABAQHAAE7xAAAAqWpgA75NAABcAT4ABsAAX7CBOsAATv7AAE8DwABPUwAAsBoAAAABA8AATxHAAE9TAAAAAgICwABPGAAAALAbYAO+TQDAAE8nAAAAsBxgA75NAABcAT4BPRzAAE84LsAARwYBAAEnhhcAwABfSwbAAF+xgTrAAE9YwABPXcAAT34AALAWAAAAAQPAAE9vwABPfgAAAAEBAcAAT3YAAACpamADvk0AAFwBPgAGwABfsoE6wABPg8AAT4jAAE/JAACwGAAAAAEDwABPmMAAT8kAAAABAQHAAE+f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AcAAoTsAAAABAQHAAKEIAAAAsUtgA75NAABcAT4BPRzAAKEbLsAARwYBAAEnsUwAwABfSwbAAGA3gTrAAKGkwAChqcAAodkAALDkAAAAAQPAAKHKwACh2QAAAAEBAcAAodEAAACpamADvk0AAFwBPgAGwABgOIE6wACibsAAonPAAKLmAACw5QAAAAEDwACiksAAouYAAAACAgLAAKKZAAAAsDBgA75NAMAAoqoAAACwyGADvk0AAFwBPgE9HMAAorouwABHBgEAASew5gDAAF9LBsAAYDmBOsAAo1/AAKNkwACjvQAAr9EAAAABA8AAo3TAAKO9AAAAAgICwACjewAAAKlqYAO+TQDAAKOUAAAAgTNgA8AAYaoAAFwBPgE9HMAAo6MuwABHBgEAASeungDAAF9LBsAAYDqBOsAAo8LAAKPHwACkQAAAsQkAAAABA8AAo97AAKRAAAAAAgICwACj7AAAALEKYAO+TQDAAKQFAAAAsQtgA75NAABcAT4BPRzAAKQfLsAARwYBAAEnsQwAwABfSwbAAGA7gTrAAKRFwACkSsAApJgAALC+AAAAAQPAAKRawACkmAAAAAICAsAApGEAAACwv2ADvk0AwACkcwAAALDAYAO+TQAAXAE+AT0cwACkfi7AAEcGAQABJ7DBAMAAX0sGwABgPIE6wACkncAApKLAAKTiAACwjQAAAAEDwACks8AApOIAAAABAQHAAKS6AAAAqWpgA75NAABcAT4BPRzAAKTHLsAARwYBAAEnsI4AwABfSwbAAGA9gTrAAKTnwACk7MAApWAAALHQAAAAAQPAAKUAwAClYAAAAAMDA8AApQ0AAACx0WADwABsWwDAAKUeAAAAsdJgA75NAMAApTIAAACvGGADvk0AAFwBPgE9HMAApUIuwABHBgEAASeF/gDAAF9LBsAAYD6BOsAApWXAAKVqwACl5wAAsdkAAAABA8AApYHAAKXnAAAAAwMDwACljgAAALHRYAPAAGxbAMAApZ8AAACx2mADvk0AwACltgAAAK8YYAO+TQAAXAE+AT0cwAClxi7AAEcGAQABJ7HbAMAAX0sGwABgP4E6wACl7MAApfHAAKY3AACxnQAAAAEDwACmBcAApjcAAAABAQHAAKYMAAAAqWpgA75NAABcAT4BPRzAAKYZLsAARwYBAAEnhfYAwABfSwbAAGBAgTrAAKY8wACmQcAApnAAALGfAAAAAQPAAKZMwACmcAAAAAICAsAAplMAAACxoGADvk0AwACmaQAAAIO+YAPAAGFuAABcAT4ABsAAYEGBOsAApnXAAKZ6wACnBwAAsaEAAAABA8AApoPAAKcHAAAABQUFwACmigAAALGgYAO+TQDAAKagAAAAg75gA8AAYW4AwACmrAAAALF4YAO+TQDAAKbJAAAAsaJgA75NAMAAptsAAACxo2ADvk0AAFwBPgE9HMAApvEuwABHBgEAASeujgDAAF9LBsAAYEKBOsAAp4nAAKeOwACn0gAAsJAAAAABA8AAp6HAAKfSAAAAAQEBwACnqAAAAKlqYAO+TQAAXAE+AT0cwACntS7AAEcGAQABJ7CRAMAAX0sGwABgQ4E6wACoVsAAqFvAAKiZAACwCAAAAAEDwACoa8AAqJkAAAABAQHAAKhyAAAAqWpgA75NAABcAT4BPRzAAKh/LsAARwYBAAEnsAkAwABfSwbAAGBEgTrAAKiewACoo8AAqSMAALB5AAAAAQPAAKi0wACpIwAAAAQEBMAAqMAAAACKU2ADwABsHwDAAKjNAAAAsHpgA75NAMAAqOAAAACwe2ADvk0AwACo9AAAALB8YAO+TQAAXAE+AT0cwACpCC7AAEcGAQABJ7B9AMAAX0sGwABgRYE6wACpKMAAqS3AAKpvAACwhQAAAAEDwACpQsAAqm8AAAAFBQXAAKlMAAAAilNgA8AAbB8AwACpXQAAALCBYAO+TQDAAKlyAAAAsHtgA75NAMAAqYoAAACwhmADvk0AwACqOQAAALCHYAPAAGxbAABcAT4BPRzAAKpQLsAARwYBAAEnsIgAwABfSwbAAGBGgTrAAKp0wACqecAAqrkAALCTAAAAAQPAAKqKwACquQAAAAEBAcAAqpEAAACpamADvk0AAFwBPgE9HMAAqp4uwABHBgEAASewlADAAF9LBsAAYEeBOsAAqr7AAKrDwACrGQAAr/8AAAABA8AAqtXAAKsZAAAAAgICwACq3AAAALAAYAO+TQDAAKruAAAAsAFgA8AAbFsAAFwBPgE9HMAAqv0uwABHBgEAASewAgDAAF9LBsAAYEiBOsAAqx7AAKsjwACrZwAAsVYAAAABA8AAqzbAAKtnAAAAAQEBwACrPQAAAIFYYAO+TQAAXAE+AT0cwACrSi7AAEcGAQABJ7FXAMAAX0sGwABgSYE6wACrbMAAq3HAAKuSAACxKwAAAAEDwACrg8AAq5IAAAABAQHAAKuKAAAAqWpgA75NAABcAT4ABsAAYEqBOsAAq5fAAKucwACr3QAAsTEAAAABA8AAq6zAAKvdAAAAAQEBwACrswAAAKlqYAO+TQAAXAE+AT0cwACrwC7AAEcGAQABJ7EyAMAAX0sGwABgS4E6wACr4sAAq+fAAKwnAADAAEe4AAAAAQPAAKv4wACsJwAAAAEBAcAAq/8AAACpamADvk0AAFwBPgE9HMAArAwuwABHBgEAASfAAEe5AMAAX0sGwABgTIE6wACsLMAArDHAAKzDAADAAEe6AAAAAQPAAKxrwACswwAAAAEBAcAArHIAAACpamADvk0AAFwBPgE9HMAArH8uwABHBgEAASfAAEe7AMAAX0sGwABgTYE6wACsyMAArM3AAK0KAADAAEe8AAAAAQPAAKzZwACtCgAAAAEBAcAArOAAAADAAEdAYAO+TQAAXAE+AT0cwACs9C7AAEcGAQABJ8AAR70AwABfSwbAAGBOgTrAAK0PwACtFMAArVwAALHxAAAAAQPAAK0pwACtXAAAAAEBAcAArTAAAACpamADvk0AAFwBPgE9HMAArT0uwABHBgEAASex8gDAAF9LBsAAYE+BOsAArWHAAK1mwACtoAAAsgIAAAABA8AArXTAAK2gAAAAAQEBwACtewAAAKlqYAO+TQAAXAE+AT0cwACtiC7AAEcGAQABJ4S7AMAAX0sGwABgUIE6wACtpcAArarAAK3oAACyAwAAAAEDwACtusAAregAAAABAQHAAK3BAAAAqWpgA75NAABcAT4BPRzAAK3OLsAARwYBAAEnsgQAwABfSwbAAGBRgTrAAK4xwACuNsAAro8AAMAAR74AAAABA8AArkjAAK6PAAAAAgICwACuTwAAAMAAR79gA75NAMAArmYAAACpamADvk0AAFwBPgE9HMAArnMuwABHBgEAASfAAEfAAMAAX0sGwABgUoE6wACvCsAArw/AAK92AADAAEfBAAAAAQPAAK8owACvdgAAAAICAsAAry8AAADAAEe/YAO+TQDAAK9GAAAAqWpgA75NAABcAT4BPRzAAK9TLsAARwYBAAEnwABHwgDAAF9LBsAAYFOBOsAAsAXAALAKwACwYAAAr5IAAAABA8AAsCbAALBgAAAAAQEBwACwLQAAAKlqYAO+TQAAXAE+AT0cwACwOi7AAEcGAQABJ6+TAMAAX0sGwABgVIE6wACxFMAAsRnAALFxAACvlAAAAAEDwACxNsAAsXEAAAABAQHAALE9AAAAqWpgA75NAABcAT4BPRzAALFKLsAARwYBAAEnr5UAwABfSwbAAGBVgTrAALJ2wACye8AAsrgAAK/zAAAAAQPAALKKwACyuAAAAAEBAcAAspEAAACvHWADvk0AAFwBPgE9HMAAsp8uwABHBgEAASev9ADAAF9LBsAAYFaBOsAAsr3AALLCwACzAAAAr/gAAAABA8AAstLAALMAAAAAAQEBwACy2QAAAKlqYAO+TQAAXAE+AT0cwACy5i7AAEcGAQABJ6/5AMAAX0sGwABgV4E6wACzBcAAswrAALNtAACxVAAAAAEDwACzH8AAs20AAAACAgLAALMmAAAAqWpgA75NAMAAsz8AAACBM2ADwABhqgAAXAE+AT0cwACzTi7AAEcGAQABJ7FVAMAAX0sGwABgWIE6wACzcsAAs3fAALO/AACxsQAAAAEDwACzhsAAs78AAAADAwPAALOLAAAAsZBgA8AAbB8AwACzmwAAALGyYAPAAGwfAMAAs7IAAACxs2ADvk0AAFwBPgAGwABgWYE6wACzxMAAs8nAALSsAACxvgAAAAEDwACz1sAAtKwAAAAHBwfAALPiAAAAsZBgA8AAbB8AwACz+AAAALGyYAPAAGwfAMAAtBUAAACxv2ADvk0AwAC0MQAAALHAYAO+TQDAALROAAAAscFgA8AAbB8AwAC0agAAALGzYAO+TQDAALSCAAAArxhgA75NAABcAT4BPRzAALSSLsAARwYBAAEnhhAAwABfSwbAAGBagTrAALSxwAC0tsAAtRcAALFTAAAAAQPAALTKwAC1FwAAAAICAsAAtNEAAACpamADvk0AwAC06gAAAIEzYAPAAGGqAABcAT4BPRzAALT5LsAARwYBAAEnhcwAwABfSwbAAGBbgTrAALUcwAC1IcAAtYsAALEZAAAAAQPAALVHwAC1iwAAAAEBAcAAtU4AAACpamADvk0AAFwBPgE9HMAAtVsuwABHBgEAASexGgDAAF9LBsAAYFyBOsAAtZDAALWVwAC16QAAsQ8AAAABA8AAtbDAALXpAAAAAQEBwAC1twAAAKlqYAO+TQAAXAE+AT0cwAC1xC7AAEcGAQABJ7EQAMAAX0sGwABgXYE6wAC17sAAtfPAALZbAACxFgAAAAEDwAC2GMAAtlsAAAABAQHAALYfAAAAqWpgA75NAABcAT4BPRzAALYsLsAARwYBAAEnsRcAwABfSwbAAGBegTrAALZgwAC2ZcAAtpMAALDnAAAAAQPAALaPwAC2kwAAAAAAAABcAT4ABsAAYF+BOsAAtpjAALadwAC3AwAAsOgAAAABA8AAtsXAALcDAAAAAAAAAFwBPgE9HMAAts4uwABHBgEAASew6QDAAF9LBsAAYGCBOsAAtwjAALcNwAC3bwAAsOsAAAABA8AAtyjAALdvAAAAAgICwAC3LwAAAIZJYAO+TQDAALc9AAAAqWpgA75NAABcAT4BPRzAALdKLsAARwYBAAEnsOwAwABfSwbAAGBhgTrAALd0wAC3ecAAt9kAALDtAAAAAQPAALeawAC32QAAAAEBAcAAt6EAAACpamADvk0AAFwBPgE9HMAAt64uwABHBgEAASew7gDAAF9LBsAAYGKBOsAAt97AALfjwAC4IwAAsLYAAAABA8AAt/TAALgjAAAAAQEBwAC3+wAAAKlqYAO+TQAAXAE+AT0cwAC4CC7AAEcGAQABJ7C3AMAAX0sGwABgY4E6wAC4KMAAuC3AALhPAADAAEfDAAAAAQPAALhAwAC4TwAAAAEBAcAAuEcAAACpamADvk0AAFwBPgAGwABgZIE6wAC4VMAAuFnAALjCAACxrAAAAAEDwAC4asAAuMIAAAADAwPAALhxAAAAsa1gA75NAMAAuIMAAACwd2ADvk0AwAC4lAAAAK8YYAO+TQAAXAE+AT0cwAC4pC7AAEcGAQABJ4YmAMAAX0sGwABgZYE6wAC5+MAAuf3AALpPAACwXgAAAAEDwAC6E8AAuk8AAAADAwPAALojAAAAgJZgA7LPAMAAujIAAACrp2ADvk0AwAC6RAAAAK8YYAO+TQAAXAE+AAbAAGBmgTrAALtLwAC7UMAAu7kAAMAAR8QAAAABA8AAu2DAALu5AAAAAQEBwAC7bAAAAKlqYAO/1QAAXAE+AT0cwAC7eS6wXgMAAxbAALuWgMAAu5DAN9Yrtta/2YDAALuowDfWK4DAALuvwDfWKwDAAGBlBsAAYGeBOsAAu77AALvPwAC8ZgAAvk4BasAAu79gA8AAbFaAtQAAAQPAALviwAC8ZgAAAAQEBMAAu/IAAACAlmADss8AwAC8AQAACIQIYAO+TQDAALwPAAAAq6xgA8AAbB8AwAC8IQAAAIDgYAPAAGwfAABcAT4BPRzAALwvLrBeAwADgMAAvEbAN9aqgcAAvE/AN9a4gcAAvFnAN9a4AMAAYGUGwABgaIE6wAC9o8AAvajAAL4UAACx9QAAAAEDwAC9vsAAvhQAAAACAgLAAL3FAAAAqWpgA75NAMAAvdQAAACAlmADss8AAFwBPgE9HMAAveMusF4DAAOBwAC9+sA310+AwAC+A8A310GAwAC+CsA310EAwABgZQbAAGBpgTrAAL4ZwAC+HsAAvlQAALADAAAAAQPAAL4qwAC+VAAAAAEBAcAAvjEAAACpamADvk0AAFwBPgE9HMAAvj4uwABHBgEAASewBADAAF9LBsAAYGqBOsAAvz/AAL9EwAC/cAAAwABHxQAAAAEDwAC/bMAAv3AAAAAAAAAAXAE+AAbAAGBrgTrAAMFPwADBVMAAwcYAAMAAR8YAAAABA8AAwW7AAMHGAAAAAgICwADBdgAAAMAAR8dgA8AAbBgAwADBiwAAAMAAR8hgA8AAbB8AAFwBPgE9HMAAwaIuwABHBgEAASfAAEfJAMAAX0sGwABgbIE6wADDEMAAwxXAAMNvAADAAEfKAAAAAQPAAMMrwADDbwAAAAQEBMAAwzkAAADAAEfLYAO+TQDAAMNLAAAAi2FgA75NAMAAw1kAAACvHWADvk0AwADDZwAAAKlqYAO+TQAAXAE+AAbAAGBtgTrAAMPlwADD6sAAxAYAAMAAR8wAAAABA8AAxALAAMQGAAAAAAAAAFwBPgAAADd3PwA3d2wAN3ehADd31gA3eAkAN3hoADd4uQA3eOwAN3k9ADd5nAA3edsAN3pIADd6eQA3eqoAN3rjADd7FAA3e1sAN3ucADd8CwA3fD4AN3yLADd81gA3fTEAN32UADd90QA3fiQAN35lADd+vAA3fwcAN39EADd/mwA3f9AAN4ARADeAdAA3gKcAN4DyADeBJQA3gUwAN4GjADeB1AA3ghsAN4JNADeCqQA3gtoAN4M3ADeDaAA3g68AN4PgADeEJwA3hFwAN4TBADeE9AA3hUkAN4WeADeF4wA3hjQAN4aTADeHAgA3h3EAN4fUADeIZQA3iLwAN4j7ADeJaAA3ifcAN4q0ADeLcQA3i7YAN4wJADeMXAA3jI0AN4zkADeNKQA3jVoAN42hADeN9gA3jjsAN45sADeOsQA3juIAN48pADePWgA3j58AN4/QADeQFQA3kFIAN5DDADeRGgA3kWsAN5GqADeSCwA3kkoAN5K/ADeTGAA3k2EAN5O+ADeUFwA3lKoAN5TrADeVRAA3lZ0AN5XcADeWNQA3lnQAN5bVADeXEgA3l2cAN5ekADeX+QA3mDoAN5ijADeZCAA3mV8AN5meADeZ9wA3mjgAN5qvADebGAA3m1UAN5uoADeb5wA3nDoAN5x3ADec2gA3nS0AN51sADedvwA3nhIAN55PADeepAA3nuEAN59SADeflwA3n+wAN6BBADegmAA3oOsAN6E4ADehjQA3ocwAN6IzADeilAA3otEAN6MeADejgwA3o+YAN6QXADekbgA3pLMAN6U6ADelxwA3pnwAN6cxADen5gA3qJsAN6lQADepjwA3qeQAN6ohADeqkAA3qs8AN6tAADerfwA3q+YAN6wlADesrAA3rOsAN61OADetjQA3rfIAN65XADeuugA3rw8AN69wADev4QA3sEIAN7CDADew3AA3sRsAN7F8ADexuQA3sioAN7JpADeyzAA3sy0AN7NsADezzQA3tCQAN7R7ADe0ugA3tWMAN7W0ADe2JQA3tmIAN7bDADe3AAA3t1MAN7fCADe4FQA3uIYAN7jnADe5PAA3uZMAN7nQADe6MQA3unAAN7rhADe7NgA3u40AN7vKADe8FwA3vJYAN7zVADe9NgA3veIAN74fADe+gAA3vtkAN788ADe/eQA3v9oAN8AtADfAgAA3wL0AN8EQADfBTQA3wXwAN8HdADfCGgA3wm8AN8K6ADfDDQA3w2AAN8OdADfD2gA3xC8AN8SCADfE1QA3xSgAN8VlADfFxgA3xikAN8aKADfG6wA3xz4AN8evADfIIAA3yHMAN8jAADfJTQA3yaAAN8nzADfKcgA3ywEAN8tUADfLtwA3zAoAN8xHADfMmgA3zPEAN81IADfNoQA3zfQAN85HADfOmgA3zwEAN89oADfPuwA30A4AN9BhADfQtAA30RcAN9F0ADfSIQA30oQAN9LXADfTKgA3030AN9OsADfT8QA31FIAN9SlADfU+AA31TcAN9WmADfV/wA31nMAN9cXADfXjgA31+EAN9gSADfYfwA32OoAN9kbAAABJQAAAAGBOgA33bsAN3ZFADd27gA33bgAAAACADfduwAAAAAAAgjAAGBywABHzYE7AAAWgQYAAK3MAAEBApB3oCmBPwAArcyMRACBagAAwABLnQABAQKrn6AfgaQAAL1iAAEBDbZFtV62RrZLtWe2VLZMtlW1xLXFq5aof6uXgycAAMAASTsAAQEUvKO8f7x0vHC8m7yAvJe8grx3rmC8dbxxvIa8g7yFvIS8j7y2vJW8eIVaAADAAGFtAAEBAa6OhX0AAMAAaEQAAQEBsHiFrwAAwABhewAAhcoAAMAAWtEAAQEBuEuGAAAAwABoUwAAhiIAAMAAYZIAAQEDrpC+7r7whsYAAMAAaHIAAQEBwABHzocCAADAAGGkAAEBAq6RwABHz4daAADAAF9BAAEBAb4mh4EAAMAAaaEAAQEEwABH0MAAR9HAAEfSwABH04gXAADAAGmwAAEBAcAAR9SIQQAAwABh5AABAQGukohtAADAAGm+AAEBAsAAR9W1s4i3AADAAGnpAAEBA8AAR9bAAEfXwABH2IlMAADAAGoOAAEBAcAAR9mJiwAAwABqOQABAQjAAEfawABH28AAR9y+usAAR93AAEfewABH38AAR+CKewAAwABiAwABAQjAAEfhwABH4sAAR+PAAEfkwABH5cAAR+aexK6VAAABwABgdIE7wAPEL8AAR+cAAQAAAoEvYAPAAGxWAVteAwABAQFfAwAAAAFXA8AAYHQBXwMAAGADss8AAcADxFsAAAAAXwMAAAAAAQLAAGB1gTunbadzwAPD2wOO0AAAAWADwABsVgAABwTAAGB3gTunh6ePGLhdAGADwABfRwAEwABgeIE7p7mn2xjAAERmAGADwABsWwEpBMAAYHmBO6jWqPUYwABEZwBgA8AAaEUBaqjxYAPAAGhFwAEdoQTAAGB6gTurIqtDGMAARGgAYAPAAGmxAWqrOGADwABpscABHboEwABge4E7q8Sr0hjAAEfqAGADwABqFwErBMAAYHyBO8ACIGzAAiB+GMAAR+sAYAPAAGwfAZMEwABgfYE7wAI7R8ACO1oYwABH7ABgA8AAbB8BkwEFwABhYYE7rE6sTqxjAAAAA6xUrGMAAAABAQGsWgAABLhdYAPAAF9HAABgA8AAYHUBPwIIAcAAYHeAAMA34QEJAaxOwABsWgAAAACA3wbAAGB/gTunlKecp68BAIFMAAAAAQOnoKevAAAAAAAAAGADwABsWAFKp6MBFqesFqejLrhdwABgd4FMwABfSQbAAGCAgTur16vvrEkBALMVAAAAAQOr+KxJAAAAAAAAAGADwABqFwE+Aj0jHKwNFqv+LsAAR+rAAGB7JwEAASsAwABsXher/i7AAEfqH6wVwABqIAAAAADAAGB7KwFgA8AAahdKrDABFqw3LsAAR+rAAGB7BsAAYIGBO6xorHGs4wEAwABH7QAAAAEDrH2s4wAAAAAAAABgA8AAbFsBPgFKrIMBIhyslRasii7AAERnwABgeScBAAFqrKZgA8AAaEXAAR3TAMAAbF4BHKzGFqy7LsAARGfAAGB5JwEAAWqs12ADwABoRcABHe0AwABsXgbAAGCCgTus6KzxrVwBAMAAR/AAAAABA6z5rVwAAAAAAAAAYAPAAGxbAT4BSqz/ASIcrREWrQYuwABEZ8AAYHknAQABaq0iYAPAAGhFwAEeBgDAAGxeARytPhatMy7AAERnwABgeScBAAFqrU9gA8AAaEXAAR3TAMAAbF4GwABgg4E7rWGtaq2ZAQDAAEfyAAAAAQOtdq2ZAAAAAAAAAGADwABsWwFKrXkBHK2EFq15LsAARGfAAGB5JwEAAWqtlWADwABoRcABHaEAwABsXgbAAGCEgTutnq2nrdsBAMAAR/MAAAABA622rdsAAAAAAAAAYAPAAGxbAUqtuQEhHK3DFq25LsAARGjAAGB6JwEAAWqt0GADwABpscABHboAwABsXgbAAGCFgTut4K3prh8BAMAAR/QAAAABA637rh8AAAAAAAAAYAPAAGxbAUqt/gEcrggWrf4uwABEaMAAYHonAQABaq4VYAPAAGmxwAEeIADAAGxeBsAAYIaBO64kri2ubQEAwABH9gAAAAEDrkiubQAAAAAAAABgA8AAbFsBSq5LASEcrlUWrksuwABEaMAAYHonAQABaq5iYAPAAGmxwAEdugDAAGxeBsAAYIiBO7CZsJ+2eAAAuF8AAAABA7CotngAAAABAQGwrwAAAKlqYAO+TQAAYAO+TQE+DU6xQrFNAAC2w2ADvk0BgLFPwDfkTD2IsVrAN+RMHLFiLsAAR/cBAAGBsXLAN+RhAMAAYVA9HLGNFrGELrhdwABgd8AARzABAAGAsaLAN+RMAMAAX2xOsbKxuAAAilNgA8AAbB8Bk06x0rHhAADAAEf4YAPAAGhUAR+x58AAaGAAAAAAPYix/8A35Ewcsgcur4EBAAGAsh7AN+RMAMAAYVZJsioesi7AAGz3AgACFrJDFrI+gLI4wDfkTINgvmiBl75tarJTYAO+lcAA+sIAPgI9NbJoAAABAGADwABoVAGDsmjAN+THIxyyaISyaMA35TInAQABKwDAAGxeKxyyeISyaMA35TLAAEf5AgACLhayk4CyjcA35EyDYL5oAMAAaFgBXD2IsqDAN+RMHLKoLsAAR/oBAAGAsrTAN+RMAMAAYKI/Q7LGIRay2Ray1ICyzsA35EyDYL5oq6m+Wz4FTrL0svoAAS5gA75NARazAoCy/MA35EyDYL5oPYizDsA35EwcsxYuwABH+wIAAoCzM8A35EyDszrAN+THAMAAYIs9HLNaFrNRLrhdwABgd8AAR6gBAAEWs3eAs3HAN+RMg2C+aADAAGADPYqzhMA35LYcs4mCs4TAN+S2gT8BAAGUAMAAbIhJs5Mcs52Es5fAN+W/JwEAARazpoCzoMA35EyDYL5oAMAAbF4+Bz2ItFbAN+RMFrRkgLRewDfkTINgvmg9HLR7FrRyLrhdwABgd8AAR5IBAAGAtI3AN+RMAMAAX+Q9HLSmFrSdLrhdwABgd68iAQABkwDAAF/lPRy0wi7AAEf8AgACgLTvwDfkTGq0/F0DsucBYQMBYAO+TWADss/AAH6AAMAAYU49HLUrFrUiLrhdwABgd8AAR6oBAAGAtUzAN+RMAMAAYAQ9HLVlFrVcLrhdwABgd8AAR6gBAAEWtYKAtXzAN+RMg2C+aADAAGADPYq1kcA35LYctZaCtZHAN+S2gT8BAAGUAMAAbIg/PYi1rMA35EwWtbqAtbTAN+RMg2C+aD0ctcQuwABH/QEAAYG12cA35GEAwABhTz0ctfMWteouuF3AAGB3wABHMgIAAoK2BsA35LaAtg3AN+RMAMAAX249F7ZNLsAAR+orwABge0q2aAGAtm/AN+RMBsAAYImBO7iTuJm/fwAAwABH/gAAAAEDuKi/fwAAAAEBAbivAAAAqWpgA75NAABgA75NAT4JPRy4xRa4vC64XcAAYHfAAEcwAQABgLjawDfn4QDAAF9sTrjquPAAAIpTYAPAAGwfAZNOuQq5GQAAwABH+GADwABoVAEfuR/AAGhgAAAAAD2IuTfAN+fhHLk/Lq+BAQABgLlWwDfn4QDAAGFWQUO5YiEWuXUWuXCAuWrAN+fhg2C+aKupvls+BU65kLmWAAEuYAO+TQEWuZ6AuZjAN+fhg2C+aE65t7nBAAHAAEf/YAPAAGwYARa5zha5yYO5w8A36H6DYL5or7G+bEm6LCIiHrowwABs9wIAAoS6OsA36JkngPcAAR66V8AAbPcCAAKEumHAN+iZJ4E6AAEeun7AAGz3AgAChLqIwDfomSeGwwA+AUK6owA/Sbq5Hrq9wABs9wIAAha60ha6zYC6x8A35+GDYL5ogZe+bWq64mADvpXAAPrCAD4CPTW6+QAAAQBgA8AAaFQBgrr5wDfoKCMcuvmFuvnAN+k+JwEAASsAwABsXiscuwmFuvnAN+k+wABH+QIAAi4WuySAux7AN+fhg2C+aADAAGhYAVw9iLszwDfn4Ry7Oy7AAEf6AQABgLtHwDfn4QDAAGCiPgQ9iLtmwDfn4Ry7bi7AAEgAAQABgLuAwDfn4QDAAGCgTruWu54AALBwYAO+TQEWu6aAu6DAN+fhg2C+aE67wbvHAAGBPmADwABsGAEWu9GFu8nAN+nQr7G+bEm75h676sAAbPcCAAKGu/TAN+nsJ4RbAD4CPTW8EgAAAQBgA8AAaFQBgrwSwDfoKCMcvBKHvBLAN+olJwEAASsAwABsXiscvCKHvBLAN+olwABIAQIAAi6FvDTAN+nQAMAAaFsBXD2IvEjAN+fhHLxQLsAASAIBAAGFvFzAN+nQAMAAYJJJvHUevHnAAGz3AgAChryDwDfp7CeEXAA+Aj01vKEAAAEAYAPAAGhUAYK8ocA36CgjHLyhh7yhwDfqqicBAAErAMAAbF4rHLyxh7yhwDfqqsAASAMCAAIuhbzDwDfp0ADAAGhaAVw9iLzXwDfn4Ry83y7AAEgEAQABhbzrwDfp0ADAAGCXSb0EHr0IwABs9wIAAoa9EsA36ewngRUAPgI9Nb0xAAABAGADwABoVAGCvTHAN+goIxy9MYe9McA36y8nAQABKwDAAGxeKxy9QYe9McA36y/AAEgFAgACLoW9VMA36dAAwABoXAFcPYi9aMA35+EcvXAuwABIBgEAAYW9gcA36dAAwABgkEm9mh69nsAAbPcCAAKGvajAN+nsJ4o8AD4BPYi9xMA35+EcvcwuwABIBwIAAoW93sA36dCCvefAN+goAMAAYJ1JvgcevgvAAGz3AgAChr4VwDfp7CeU3gA+AT2Ivi7AN+fhg742wDfofj4CPRy+YRa+WC64XcAAYHfAAEcxAAAAAMAAX21CvoMAPRy+qxa+oi64XcAAYHfAAEeoAQABFr7IgL7CwDfn4YNgvmgAwABgAz2IvtnAN+fhFr7ngL7hwDfn4YNgvmg9HL76Fr7xLrhdwABgd8AARzICAAKBvw3AN+gXgL8UwDfn4QDAAF9uPRe/VC7AAEfqK8AAYHtKv28BgL92wDfn4QbAAGCKgTvAAEC2wABAvMAAQYAAAMAASAgAAAABA8AAQNTAAEGAAAAAAQEBwABA2wAAAKlqYAO+TQAAYAO+TQE+Az2IwABA6MA37MwWwABBOhzAAED4LsAAR/sCAAIcwABBFS6vgQEAAYDAAEEswDfszADAAGFWKwDAAGCLg2C+aD0cwABBTRbAAEFELrhdwABgd8AAR6gBAAGAwABBZMA37MwAwABgA0rAAEFwAYDAAEF3wDfszAbAAGCLgTvAAEOFwABDi8AAS7QAAMAAR/sAAAABA8AAQ6fAAEu0AAAAAgICwABDtQAAAKlqYAO+TQDAAEPNAAAAwABH+GADwABoVAAAYAO+TQE+Cj2IwABD48A37YMcwABD6y7AAEgAAQABgMAAQ/3AN+2DAMAAYKBOwABED8AARBQAAINgYAO+TQEWwABEHIDAAEQWwDftg4NgvmhJwABEJhbAAEQvgsAARCrAN+3RtbS+Yj4BSsAAREoBHMAARFEuwABICQMAA4DAAERxwDftg4LAAER4wDft0YHAAER+wDftkQDAAGCPP07AAESfwABEpQAALmADvk0BgMAARKfAN+2DScAARPIWwABE+4LAAET2wDft0bWzvl8+AknAAEUPIiIewABFE8AAYgUCAAInlZWCwABFI8A37dEAAR7AAEU2wABiBQIAAieVNYLAAEVHwDft0QABIiIewABFXMAAYgUCAAInlTmCwABFbsA37dEAAR7AAEV3wABiBQIAAieVOILAAEWJwDft0QAAIR7AAEYrwABiBQIAAieVSRbAAEZCgsAARj3AN+3Rg2C+aAA+Aj01wABGVAAAAQBgA8AAaFQBgcAARlTAN+2RIxzAAEZUhMAARlTAN+8MJwEAASsAwABsXiscwABGZITAAEZUwDfvDMAASAoAAAAAwABoWQFcSsAARoABHMAARocuwABICwEAAYDAAEafwDftgwDAAGDJP0PAAEa1FsAARscWwABGwoDAAEa8wDftg4Ngvmi1s75fPgE9iMAARt3AN+2DFsAARuuAwABG5cA37YODYL5oPz2KwABHA8A37dEWwABHEIDAAEcKwDftg4NgvmhJwABHGhbAAEcjgsAARx7AN+3RtbS+Yj4BSsAARz4BHMAAR0UuwABICQMAA4PAAEdlwDfuQoLAAEdswDft0YHAAEdywDftkQDAAGCPScAAR44WwABHl4LAAEeSwDft0bW7vl4+Aj01wABIHAAAAQBgA8AAaFQBgcAASBzAN+2RIxzAAEgchMAASBzAN/A+JwEAASsAwABsXiscwABILITAAEgcwDfwPsAASAoAAAAAwABoWQFcSsAASEYBHMAASE0uwABICwEAAYPAAEhlwDfuQgDAAGDJScAASHghHMAASIcWwABIgoPAAEh8wDfuQoNgvmgnAQABgsAASIrAN+3RAMAAbF4+Aj01wABImAAAAQBgA8AAaFQBgcAASJjAN+2RIxzAAEiYhMAASJjAN/DgJwEAASsAwABsXiscwABIqITAAEiYwDfw4MAASAoAAAAAwABoWQFcSsAASRABHMAASRcuwABICwEAAYPAAEkvwDfuQgDAAGDJP0nAAElRIhbAAElagsAASVXAN+3RsL++YAAewABJaMAAYgUCAAInhsMWwABJe4LAAEl2wDft0YNgvmgAPgM9HMAASdouwABIDAIAAoLAAEnxwDft0WrAAEn9YAOy28AA0qAAwABhTT0cwABKhBbAAEp7LrMVwABggMAASA0CAAKCwABKqcA37dEkwABK1wInwABIDhbAAErLgsAASsbAN+3Ric6+VgDAAGo1SsAASuABHMAASucuwABICwEAAYLAAEr/wDft0QDAAGDJPz0cwABLZBbAAEtbLrhdwABgd8AAR6wBAAGCwABLeMA37dEAwABgBUrAAEuDARzAAEuKLsAASA8BAAGAwABLqsA37YMAwABhUQbAAGCMgTvAAEwywABMOMAATdMAAMAASBAAAAABA8AATFbAAE3TAAAAAgICwABMXQAAAC5gA75NAMAATGoAAACwcGADvk0AAGADvk0BPgNOwABMf8AATIgAAL+XYAO+TQEWwABMkIDAAEyKwDfykINgvmhDwABMmiEcwABMqoLAAEyhwDfytCcBAAGBwABMrcA38p0AwABsXj4CScAATL4ewABMwsAAYgUCAAInlUKCwABM18A38rQAPgI9HMAATOwuwABIEQIAAoLAAE0KwDfytIHAAE0UwDfynQDAAGCNSsAATSYBgsAATS3AN/K0PgE9HMAATWIuwABIEgIAAoLAAE1+wDfytIHAAE2IwDfynQDAAGCOPYrAAE2gwDfytBbAAE20gsAATavAN/K0g2C+aErAAE3EASsGwABgjYE7wABOG8AATiDAAE8PAADAAEgRAAAAAQPAAE49wABPDwAAAAICAsAATkQAAAAuYAO+TQDAAE5RAAAAsHBgA75NAABcAT4CTsAATmbAAE5vAAC/l2ADvk0BFsAATneAwABOccA388mDYL5oQ8AAToEhHMAATpGCwABOiMA38+onAQABgcAATpTAN/PWAMAAbF4+Aj0cwABOty7AAEgSAgACgsAATtPAN/PqgcAATt3AN/PWAMAAYI49isAATu3AN/PqFsAATwGCwABO+MA38+qDYL5oBsAAYI6BO8AAT4DAAE+FwABS4gAAwABIEgAAAAEDwABPoMAAUuIAAAACAgLAAE+nAAAAv5dgA75NAMAAT7cAAADAAEgTYAO+TQAAXAE+AUnAAE/NIh7AAE/RwABiBQIAAieVOYDAAE/jwDf0ogAAHsAAT/DAAGIFAgACJ5VJgcAAUALAN/SwAD4BPRzAAFAbLsAASAwCAAKAwABQMsA39KJqwABQQmADstvAAGOPAMAAYU1JwABQYR7AAFBlwABiBQIAAieVQYDAAFB6wDf0ogA+AUnAAFCNHsAAUJHAAGIFAgACJ5VJgcAAUKPAN/SwAD4BPRzAAFC+LsAASAwCAAKAwABQ1cA39KJqwABQ5WADstvAAIaHAMAAYU1JwABRCR7AAFENwABiBQIAAie1eoHAAFEewDf0sAA+AT0cwABROS7AAEgMAgACgMAAUVDAN/SiasAAUWBgA7LbwACHHQDAAGFNScAAUYMewABRh8AAYgUCAAInhl6BwABRm8A39LAAPgE9HMAAUbYuwABIDAIAAoDAAFHNwDf0omrAAFHdYAOy28AAh/UAwABhTT4BPRzAAFIN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rawhHsAArbHAAGIFAgACJ47xhMAArb/AODLHAD4DTsAArdbAAK3bAACDYGADvk0BFsAAreOAwACt3cA4MhWDYL5oScAArfEewACt9cAAYgUCAAIng6OGwACuA8A4NZMAPgE9iMAArhbAODIVhsAArh7AODWTPgFJwACuVRbAAK5oFsAArl+CwACuWcA4Mjyvl75ahDu+YT4BPYjAAK8JwDgyFRzAAK8aFsAArxEusxXAAGCAwABILwIAAoDAAK8owDgyFRbAAK81gsAAry/AODI8r5e+WgDAAGobScAAr1EiHMAAr18WwACvWobAAK9VwDg1k4O+vmUnAQABasAAr2JgA8AAbB+IbADAAGwyABzAAK+TFsAAr44WwACviYbAAK+EwDg1k4NgvmiDvr5lJwEAAWrAAK+WYAPAAGwfiGwAwABsMj4CPYjAAK/gwDgyFRzAAK/oLsAASFkDAAOAwACwC8A4MhUcwACwP2rAALAoXQOy5wFhAwFgA8AAbBhgA7LPwAB9c41vAQABJ47xALLrH8AAsGe+TAIAAmrAALCAYAO+lcAA/XgWwACwjIbAALCHwDg1k4nOvlYAAMAAYNpCwACwpgE+AT2IwACwz8A4MhUcwACw1y7AAEhVAgACgMAAsOjAODIVgsAAsO/AODI8AMAAYNZCwACxFQA/PYjAALEqwDgyFYTAALEywDgyx0AewACxScAAYgUCAAIng6OAwACxV8A4MhUAwACxScAAsV0APRzAALFtFsAAsWQuuF3AAGB3sPAEAASDwACxgcA4MqiCwACxkcA4MjyAwACxmMA4MhWBwACxn8A4MiMAwABfh0rAALGqAYDAALGxwDgyFQbAAGCtgTvAALIewACyJsAAs4MAAMAASE8AAAABA8AAsj3AALODAAAAAQEBwACySQAAAIO+YAPAAGHlAABgA7LPAT4CScAAslUcwACyXoDAALJZwDg4IycBAAFqwACybGADwABh5cABIRIAwABsXj4BSsAAsocBasAAspRgA7LbwACuJknAALLAIhzAALLJgMAAssTAODgjJwEAAWrAALLXYAPAAGHlwAEhLADAAGxeARzAALL3gMAAsvLAODgjJwEAAWrAALMFYAPAAGHlwAEhRgDAAGxePgFKwACzGwFqwACzKGADstvAAK0pP0rAALNSAWrAALNfYAOy28AArBMG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E7rAOHKfg2C+aKlrvmcAwABsND4CPRzAARPYLsAASAwCAAIWwAEUAoDAARP8wDhyn4NgvmgcwAEUJmrAARQOXQOy5wFhAwFgA8AAbBhgA7LPwACASI1vAQABJ5VPALLrAMAAYU09iMABFETAOHKfHMABFEwuwABIhwEAAYDAARRZwDhynwDAAGDBPgE9iMABFHjAOHKfHMABFIAuwABIhQEAAYDAARSQwDhynwDAAGDAScABFKchHMABFMYWwAEUvITAARSrwDhy+LD5wABqBicBAAErAMAAbF4+AUnAARTZhcABFN3AOHNfPgE9HMABFPAuwABIDAIAAhbAARUnhMABFRbAOHL4sPnAAGoGasABFThgA7LbwACvswDAAGFNPgJJwAEVbobAARVywDhzmT4BPRzAARWPLsAASAwCAAIWwAEVyITAARW3wDhy+LD5wABqBmrAARXZYAOy28AAkz0AwABhTT89jcABFgvAOHNfKT89iMABFjLAOHKfHMABFjouwABIegEAAYDAARZZwDhynwDAAGC8ScABFmghHMABFo8WwAEWfYTAARZswDhy+MAARxXAAGoHJwEAASsAwABsXj4BScABFqKGwAEWpsA4c5k+AT0cwAEWwS7AAEgMAgACFsABFumEwAEW2MA4cvjAAEcVwABqB2rAARcQYAOy28AAr1YAwABhTT4BPY7AARdHwDhzmSk/PRzAARd/FsABF3YuuF3AAGB3wABHJAAAAADAAF9lIiEewAEX9cAAYgUCAAInlRoWwAEYCYDAARgDwDhyn4NgvmgAACEcwAEYGIfAARgSwDhz8ycBAAGAwAEYG8A4cp8AwABsXj0XwAEYKC64XYPAARgzwDhy1sAAYHdKwAEYSAGAwAEYT8A4cp8GwABgwIE7wAEYr8ABGLXAARleAADAAEiFAAAAAQPAARjEwAEZXgAAAAEBAcABGMsAAACpamADvk0AAGADvk0BPgJJwAEY2CEewAEY3cAAYgUCAAInlU8WwAEY8oDAARjswDh3ioNgvmgAPgI9HMABGQoWwAEZAS64XcAAYHfAAEcgAgACK5MAwABfY0rAARkoAYDAARkvwDh3ij9KwAEZQAEcwAEZRy7AAEiHAQABgMABGVTAOHeKAMAAYMEGwABgwYE7wAEZY8ABGWnAARtYAADAAEiHAAAAAQPAARl1wAEbWAAAAAEBAcABGXwAAACpamADvk0AAGADvk0BPgZOwAEZj8ABGZkAALD5YAO+TQEWwAEZoYDAARmbwDh4R4NgvmhAIiIewAEZ98AAYgUCAAInlU+BwAEaBsA4eF4AAR7AARocwABiBQIAAieVS4HAARowwDh4XgABHMABGlcWwAEaUIHAARpGwDh4XqlrvmcnAQABJ8AASH8AwABsNsABGffAARpiAE7AARptwAEadwAAumlgA8AAbB8Bk0TAARqAPgI9iMABGovAOHhHHMABGrEewAEak8AAakECAAIWwAEapYDAARqfwDh4R4NgvmgpAMAASHQCAAIWwAEayYDAARrDwDh4R4NgvmguAMAAako9isABGt7AOHjnHMABGtyCwAEa3sA4eOeBPwEAAZQAwABsiB7AARr2wABiBQIAAieO8RbAARsKgMABGwTAOHhHg2C+aAA9HMABGx8WwAEbFi64XcAAYHfAAEcgAgACgcABGy3AOHhegsABGzjAOHjnAMAAX2NKwAEbSAGAwAEbT8A4eEcGwABgwoE7wAEb6MABG+7AASSvAADAAEgWAAAAAQPAARv8wAEkrwAAAAEBAcABHAMAAADAAEcpYAO+TQAAYAO+TQE+D0AewAEcIsAAYgUCAAInhEeAwAEcOMA4egAAwAEcIsABHEkATsABHFbAARxcAACpamADvk0BgMABHF7AOHoAPRzAARx9FsABHHQuuF3AAGB3wABHKAEAAYDAARyewDh6AADAAF9nTsABHLvAARzAAACBiGADvk0BFsABHMiBwAEcwsA4ejyDYL5oScABHNIiFsABHNuCwAEc1sA4en6uZ75cACEewAEc7MAAYgUCAAInlU+CwAEc+8A4en4APgI9icABHQrAOHo8gsABHRLAOHp+ScABHR4WwAEdLBbAAR0ngsABHSLAOHp+gZe+bbWxvvc+AT0cwAEdQS7AAEf8AgACgcABHW7AOHo8asABHXtdA7LnAWEDAWADvk1gA7LPwABbhwDAAGFOPz4BPYrAAR2/wDh6fis9icABHdbAOHo8HMABHgEewAEd3sAAakICAAKBwAEd9MA4ejwpAMAASEUCAAKBwAEeEMA4ejwuAMAAalg9HMABHisWwAEeIi64XcAAYHfAAEcqAgACgMABHkXAOHoAgsABHlfAOHp+AMAAX2hOwAEeaMABHnIAALD5YAO+TQEWwAEeeoHAAR50wDh6PINgvmhJwAEehCEewAEeicAAYgUCAAInlU+DwAEemMA4e7sAPgFJwAEeviIiHsABHsLAAGIFAgACJ5VLg8ABHtbAOHu7AAEewAEe7sAAYgUCAAInlUyDwAEfBcA4e7sAAR7AAR8dwABiBQIAAieVSoPAAR8uwDh7uwA+AT0cwAEfRC7AAEgMAgACg8ABH2jAOHu7HMABH5FqwAEfeV0DsucBYQMBYAPAAGwYYAOyz8AAgEiNbwEAASeVTwCy6wDAAGFNPgI9HMABH74uwABIDAIAAoHAAR/iwDh6PBzAASALasABH+9dA7LnAWEDAWADwABsGGADss/AAHxSjW8BAAEnlU8AsusAwABhTT2LwAEgKcA4e7scwAEgPhbAASA1LrMVwABggMAASEoCAAKBwAEgVcA4ejxqwAEgZGADvY7AAPIAAMAAajY/TsABIITAASCNAADAAEhCYAPAAGpEAR7AASCPwABqQQIAAoPAASCbwDh7uykAPYnAASCxwDh6PBzAASDChMABILnAOH0kwABINQIAAoPAASDTwDh7uy4AwABqS0nAASDpIR7AASDuwABiBQIAAieVGhbAASECgcABIPzAOHo8g2C+aAA+A07AASEpwAEhLgAAg2BgA75NARbAASE2gcABITDAOHo8g2C+aEFDwAEhQiEWwAEhT4XAASFKwDh9qaupvls+AUnAASFgIiIiIh7AASFkwABiBQIAAieO8YXAASFywDh9qQABHsABIYfAAGIFAgACJ5VLhcABIZvAOH2pAAEewAEhsMAAYgUCAAInlUyFwAEhx8A4fakAAR7AASHcwABiBQIAAieVT4XAASHrwDh9qQABHsABIgDAAGIFAgACJ5VKhcABIhHAOH2pAD4EPRzAASKULsAAR/wCAAKFwAEitMA4falqwAEiwF0DsucBYQMBYAO+TWADss/AANcDAMAAYU49icABIuTAOHo8hcABIuzAOH2pPY3AASL8wDh9qRbAASMJgcABIwPAOHo8g2C+aEnAASMZFsABIyKFwAEjHcA4famuZ75cPgI9icABIz7AOHo8hcABI0bAOH2pPY3AASNYwDh9qRbAASNlgcABI1/AOHo8g2C+aD8+AULAASOSAD0cwAEjsS7AAEhuAwADgcABI73AOHo8KyfAAEiIAMAAYNQ/PYnAASPuwDh6PBzAASP2LsAASHgDAAOBwAEkIMA4ejxqwAEkN2ADwABa0sABG8Y1wAEkQgAAAQBgA75NAYLAASRCwDh6fiMcwAEkQoXAASRCwDh/eycBAAErAMAAbF4rFsABJEiFwAEkQsA4f3upa75nAWADwABsGADAAGDfPRzAASReFsABJFUuuF3AAGB3wABHKwMAA4DAASR2wDh6AIPAASSIwDh7u4HAASSTwDh6PADAAF9pSsABJJ8BgcABJKbAOHo8BsAAYMOBO8ABJLTAASS6wAEmGQAAwABIiQAAAAEDwAEkycABJhkAAAABAQHAASTQAAAAqWpgA75NAABgA75NAT4ETsABJOPAASToAACDYGADvk0BFsABJPCAwAEk6sA4gD2DYL5oScABJPohHMABJQgWwAElA4HAAST+wDiAVIO+vmUnAQABasABJQtgA8AAbB+HWwDAAGwyPgI9HMABJSEuwABH/AIAAoHAASVBwDiAVGrAASVNXQOy5wFhAwFgA75NYAOyz8AAgUgAwABhTj2JwAElbMA4gFQcwAElfBbAASVzLrMVwABggMAASIoCAAKAwAEliMA4gD0fwAElnb5CAwADasABJbxgA76VwAD68icAFsABJc2BwAElyMA4gFSJzr5WAADAAGoaPz0cwAEl7hbAASXlLrhdwABgd6/4AQABgcABJf/AOIBUAMAAYFZKwAEmCgGBwAEmEcA4gFQGwABgxIE7wAEm08ABJtnAASgWAADAAEgNAAAAAQPAASbywAEoFgAAAAQCAsABJvkAAACpamADvk0AwAEnEgAAAIEzYAPAAGGqAALAAScqAAAAgJZgA7LPAWoAYAHAAGxcAsABJzkAAADAAEiLYAO+TQFqAGABwABsXAJgA75NAT4DTsABJ1bAASdbAACDYGADvk0BFsABJ2OAwAEnXcA4gZ6DYL5oPRzAASdtLsAASAwCAAI1wAEnhAAAAQBgA75NAYPAASeEwDiB1CMcwAEnhIXAASeEwDiCJycBAAErAMAAbF6EwAEnlsA4gfWFwAEnhMA4gicBYAO+TTXAASekAAABAGADss8BgsABJ6TAOIG9IxzAASekhcABJ6TAOIJuJwEAASsAwABsXhzAASfIFsABJ7eBwAEnr8A4gazAAEiMwABh3o1vAQABhMABJ9bAOIH1ALLrhcABJ6TAOIJuAWADss8AwABhTUrAASfiARzAASfyFsABJ+kusxXAAGCAwABIDQEAAYDAASgMwDiBngDAAGo1BsAAYMWBO8ABKVnAASlfwAEq6AAAwABIHwAAAAEDwAEpb8ABKugAAAACAgLAASl2AAAAqWpgA75NAMABKY8AAACBM2ADwABhqgAAYAO+TQE+BUAhHMABKa2BwAEppcA4g0InAQABKwDAAGxewAEppcABKbQATsABKcHAASnMAACQJWADvk0BFsABKdSAwAEpzsA4gzSDYL5oScABKd4hHMABKfIWwAEp7YLAASniwDiDfoO+vmUnAQABasABKfVgA8AAbB+IbADAAGwyPgM9isABKg/AOIN+HMABKiSBwAEqHMA4g0LAAEgfAgACgMABKjXAOIM0LgDAAGHhQCEcwAEqW4LAASpQwDiDficBAAErAMAAbF7AASpQwAEqYgBAFsABKn2CwAEqcsA4g361u75ewAEqcsABKpIAPz0cwAEqqBbAASqfLrhdwABgd6/RAgACgsABKrnAOIN+gcABKsXAOINCAMAAYDlKwAEq0wGCwAEq2sA4g34GwABgxoE7wAEq7cABKvLAASt9AADAAEiNAAAAAQPAASr/wAErfQAAAAICAsABKwcAAACBPmADwABsGADAASsUAAAAqWpgA75NAABgA8AAbFsBPgFKwAErIQEiIR7AASspwABs9wIAAhbAASs5gcABKzPAOIS9g76+ZWrAASs/YAPAAGwfAAAAIR7AAStWwABs9wIAAoDAAStgwDiErRbAASttgcABK2fAOIS9r7G+bAAGwABgx4E7wAErgsABK4jAASv6AADAAEiOAAAAAQPAASudwAEr+gAAAAEBAcABK6QAAACpamADvk0AAGADvk0BPgFKwAErsQEcwAEr2x7AASu4wABqQgIAAoDAASvOwDiFXikAwABIRQIAAoDAASvqwDiFXi4AwABqWAbAAGDIgTvAAS03wAEtPcABLdAAAMAASI8AAAABA8ABLVDAAS3QAAAAAQEBwAEtVwAAAKlqYAO+TQAAYAO+TQE+Aj2IwAEtZMA4hdgcwAEtbC7AAEgAAQABHMABLX4ur4EBAAGAwAEtlcA4hdgAwABhVgDAAGCgSsABLaIBFsABLcgcwAEtqS7AAEgLAQABgMABLcHAOIXYAMAAYMmDYL5oBsAAYMmBO8ABLdXAAS3bwAFDewAAwABICwAAAAEDwAEt8sABQ3sAAAABAQHAAS35AAAAqWpgA75NAABgA75NAT4VTsABLgzAAS4YAADAAEiQYAO+TQGAwAEuGsA4hnlOwAEuK8ABLjAAAINgYAO+TQEWwAEuOIDAAS4ywDiGeYNgvmg9HMABLksWwAEuQi64XcAAYHfAAEesAQABgsABLl/AOIatAMAAYAVOwAEucQAAAMAAR0FgA75NAE7AAS6KAAAAryhgA75NAE7AAS6fAAAArylgA75NAEnAAS61HsABLrnAAGnAAQABgsABLsTAOIatAD4CScABLtMewAEu18AAYgUCAAInlUGCwAEu7MA4hq0APgI9i8ABLv3AOIb4iMABLw3AOIZ5gsABLxXAOIatPYrAAS8jwDiGrRbAAS8wgMABLyrAOIZ5g2C+aD9JwAEvRB7AAS9IwABpwAEAAYLAAS9TwDiGrQA+AknAAS9kHsABL2jAAGIFAgACJ5U4gsABL3rAOIatAD4CPY3AAS+NwDiHGIjAAS+fwDiGeYLAAS+nwDiGrT2KwAEvt8A4hq0WwAEvxIDAAS++wDiGeYNgvmhJwAEv2R7AAS/dwABiBQIAAieVlYLAAS/twDiGrQA+Aj2NwAEwAMA4hxiIwAEwEsA4hnmCwAEwGsA4hq09isABMCrAOIatFsABMDeAwAEwMcA4hnmDYL5oScABMEwewAEwUMAAYgUCAAInlTmCwAEwYsA4hq0APgI9jcABMHXAOIcYiMABMIfAOIZ5gsABMI/AOIatPYrAATCfwDiGrRbAATCsgMABMKbAOIZ5g2C+aEnAATDBHsABMMXAAGIFAgACJ5U1gsABMNbAOIatAD4DPYzAATDpwDiHCYjAATD1wDiGeYLAATD9wDiGrT2KwAExDcA4hq0WwAExGoDAATEUwDiGeYNgvmhJwAExKiIewAExLsAAacABAAGCwAExOcA4hq0AAB7AATFCwABiBQIAAieVOILAATFUwDiGrQA+Aj2NwAExacA4hxiIwAExe8A4hnmCwAExg8A4hq09isABMZXAOIatFsABMaKAwAExnMA4hnmDYL5oPz9JwAExxh7AATHKwABpwAEAAYLAATHVwDiGrQA+AUnAATH+IiEcwAEyEoXAATICwDiHGCcBAAErAMAAbF4AIiIewAEyLMAAYgUCAAInlTiCwAEyPsA4hq0AAR7AATJZwABiBQIAAieVlYLAATJpwDiGrQABHsABMoTAAGIFAgACJ5U5gsABMpbAOIatAD4APgdOwAEzZsABM24AAIEzYAPAAGnBATXAATN0AAABAGADwABpwQEfwAEzdMAAaegBAAEuADXAATOiAAABAFwBF8ABM6KGwAEzdMA4ijDAAEdBg8ABM7LAOIb4wABpxzXAATPQAAABAFwBF8ABM9CGwAEzdMA4ijCvKITAATPcwDiHCcAAack1wAEz9gAAAQBcARfAATP2hsABM3TAOIowrymFwAE0CMA4hxjAAGnQhsABM3TAOIowPYjAATQmwDiGeRzAATQ2hsABNC7AOIocwABIkQEAAYDAATRNwDiGeQDAAGnXPYrAATRhwDiGrRbAATRugMABNGjAOIZ5g2C+aD2LwAE0gcA4hvgWwAE0mYbAATSRwDiKHMAAR0HAAGnHPYzAATS0wDiHCRbAATTIhsABNMDAOIocryjAAGnJPY3AATTfwDiHGBbAATT5hsABNPHAOIocrynAAGnSPY7AATUXwDiKHCs/Pz9OwAE1VsABNWEAAMAASGJgA75NAYDAATVjwDiGeU7AATV3wAE1gAAAwABIQmADwABqRAEewAE1gsAAakEDAAOAwAE1jsA4hnkqKQA9iMABNafAOIZ5HMABNbiHwAE1r8A4i6HAAEhDAQABgMABNcHAOIZ5AMAAak49isABNc3AOIatFsABNdqAwAE11MA4hnmDYL5oTsABNesAAAC4UmADvk0ATsABNgDAATYGAACBPmADwABsGAEWwAE2DYLAATYIwDiGra+xvmxJwAE2HiIewAE2IsAAbPcCAAIUwAE2LMA4jCcJACeKEgABHsABNj3AAGz3AgACFMABNkfAOIwnCQAnjdAAPgFJwAE2XhbAATZsFsABNmeCwAE2YsA4hq2DYL5orme+XD4CPRXAATaEwDiMGAiIwAE2j8A4hnmCwAE2l8A4hq09isABNqXAOIatFsABNrKAwAE2rMA4hnmDYL5oPz9JwAE2yyEcwAE22RbAATbUgsABNs/AOIatgZe+bScBAAFqwAE25mADvpXAAPpBAMAAbF4+Aj0VwAE2+sA4jCcJFsABNweCwAE3AsA4hq2vsb5sScABNxoiHsABNx7AAGz3AgACFMABNyjAOIwnCQAn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JJnAOSASJ5U4AD4DTsACJLjAAiTDAADAAEjeYAO+TQEWwAIky4DAAiTFwDkfPINgvmhJwAIk1yEewAIk3MAAacABAAEWwAIk8oLAAiTnwDkhDYNgvmgAPgFKwAIlAwEcwAIlCi7AAEjbBgAGgsACJUvAOSENgMACJVfAOR88K4LAAiVkwDkhDSsqAMAAYSw/SsACJYwBHMACJZMuwABI3wEAAYDAAiW5wDkfPADAAGErScACJcwewAIl0MAAbPcCAAKBwAIl2sA5IBInlYkAPgFKwAIl8AEcwAIl9y7AAEjgAQABgMACJgjAOR88AMAAYS9JwAImGyIewAImH8AAbPcCAAKBwAImKcA5IBInlXYAAB7AAiY8wABiBQIAAieVghbAAiZXFsACJlKAwAImTMA5HzyDYL5og2C+aAA+AUrAAiZmARzAAiZtLsAASOECAAIWwAImhYDAAiZ/wDkfPINgvmgWwAImkYDAAiaLwDkfPINgvmgAwABhMEnAAiajHsACJqfAAGz3AgACgcACJrHAOSASJ5WCAD4BSsACJsgBHMACJs8uwABI4QIAAoDAAibhwDkfPCsAwABhMEnAAib6HsACJv7AAGz3AgACgcACJwjAOSASJ5V0AD4BSsACJyMBHMACJyouwABI4gEAAYDAAidAwDkfPADAAGE+ScACJ1MewAInV8AAbPcCAAKBwAInYcA5IBInlYAAPgFKwAInegEcwAIngS7AAEjjAQABgMACJ5XAOR88AMAAYTdJwAInqB7AAieswABs9wIAAoHAAie2wDkgEieVgQA+AUrAAifMARzAAifTLsAASOQBAAGAwAIn6cA5HzwAwABhOEnAAif8HsACKADAAGz3AgACgcACKArAOSASJ5WMAD4BSsACKCEBHMACKCguwABI5QEAAYDAAig6wDkfPADAAGE/ScACKE0ewAIoUcAAbPcCAAKBwAIoW8A5IBInlYQAPgFKwAIodQEcwAIofC7AAEjmAQABgMACKJHAOR88AMAAYUBJwAIopB7AAiiowABs9wIAAoHAAiiywDkgEieVfwA+AUrAAijLARzAAijSLsAASOcBAAGAwAIo5sA5HzwAwABhREnAAij5HsACKP3AAGz3AgACgcACKQfAOSASJ5WIAD4BSsACKSMBHMACKSouwABI6AEAAYDAAilBwDkfPADAAGFHScACKVQewAIpWMAAbPcCAAKBwAIpYsA5IBInlX0APgFKwAIpfAEcwAIpgy7AAEjpAQABgMACKZjAOR88AMAAYUZJwAIpqx7AAimvwABs9wIAAoHAAim5wDkgEieU3gA+AUrAAinOARzAAinVLsAASOoBAAGAwAIp6cA5HzwAwABhSEnAAin8HsACKgDAAGz3AgACgcACKgrAOSASJ5WSAD4CR8ACKiMWwAIqKy7AAERnwABgeQMBwAIqVGrAAipUYAPAAGhFwAEdoQA+AknAAipkHsACKmjAAGIFAgACJ4FZFsACKoEWwAIqfIDAAip2wDkfPINgvmiDYL5oAD4BSsACKpYBHMACKp0uwABI2gEAAYDAAiqzwDkfPADAAGD4P0rAAirRARzAAirYLsAASN8BAAGAwAIq/sA5HzwAwABhKwLAAisiasACKyJgA8AAaEXAAR3twAIrR2rAAitHYAPAAGhFwAEd0wA+AUrAAitcARzAAitjLsAASOsBAAGAwAIrd8A5HzwAwABg9QHAAiubasACK5tgA8AAaEXAAR4GAD4CPRzAAiusLsAASAwCAAIWwAIryYDAAivDwDkfPINgvmhqwAIr1WADstvAANx3AMAAYU1KwAIr+gEcwAIsAS7AAEjrAQABgMACLBXAOR88AMAAYPU9MMACLCskwAIsZQMnwABI7BbAAixYLsAARGfAAGB5J5EkScACLHIewAIsdsAAbPcCAAKBwAIsgMA5IBInlTkAPgFKwAIsmQEcwAIsoC7AAEjtAQABgMACLMvAOR88AMAAYSpJwAIs3h7AAiziwABs9wIAAoHAAizswDkgEieVdgA+AknAAi0FFsACLQkuwABH8sAAYIM+AUnAAi0gIRzAAi0lLsAASO4BAAGAwAItPsA5HzwAwABhOz4BSsACLVIBHMACLVkuwABI3wEAAYDAAi1/wDkfPADAAGErPz9KwAIufAEcwAIugy7AAEjvAQABgMACLpzAOR88AMAAYPlJwAIuryIewAIus8AAbPcCAAKBwAIuvcA5IBInjdAAABbAAi7eFsACLtkWwAIu1IDAAi7OwDkfPINgvmiDYL5orme+XD4CPRzAAi8cLsAAR/wCAAIWwAIvTYDAAi9HwDkfPINgvmhqwAIvWV0DsucBYQMBYAO+TWADss/AANcDAMAAYU5KwAIveQEcwAIv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AgACgMACkBXAOWadFsACkCeDwAKQHMA5Zt+vl75aAMAAahs+Aj0cwAKQkS7AAEgMAgAChsACkLnAOWhAHMACkNxqwAKQxV0DsucBYQMBYAPAAGwYYAOyz8AAfXONbwEAASePEACy6wDAAGFNPYjAApD9wDlmnRbAApEQg8ACkQXAOWbfr5e+WkLAApEwAD9OwAKR08ACkdkAAJYZYAO+QwEfwAKR375MAgACasACkfhgA76VwAD9eBbAApIEhsACkf/AOWhAhAq+aQBOwAKSHcACkiUAAICWYAOyzwEjHMACki+HwAKSJ8A5aJ6BOwEAAZMAwABshmrAApJHYAOy28AAfuAcwAKSjWrAApJ2XQOy5wFhAwFgA8AAbBhgA7LPwAB9c41vAQABJ47xALLrAWADss89jsACkqnAOWhAHMACkrAuwABIWQMAA4DAApLCwDlmnRTAApLJwDlroAoAFMACktLAOWtkCQAAwABg2j89iMACkujAOWadhsACkvDAOWhAPRfAApMALsAARGaFwAKTHsA5aAXAAGB4PRzAApMwFsACkycuuF3AAGB3sHkEAASEwAKTQsA5Z0mDwAKTScA5Zt+BwAKTVcA5ZquAwAKTY8A5Zp0AwABgRErAApNvAYDAApN2wDlmnQbAAGEMgTvAApQXwAKUHcACoBUAAMAASRIAAAABA8AClDfAAqAVAAAAAgICwAKUPgAAAKlqYAO+TQDAApRLAAAAsHtgA75NAABgA75NAT4JTsAClGXAApRvAACwgWADvk0BiMAClHHAOWzqFsAClH+AwAKUecA5bOqDYL5oQB7AApSQwABiBQIAAieVGoLAApSewDltDwDAApSQwAKUqABOwAKUtcAClLoAAINgYAO+TQEWwAKUwoDAApS8wDls6oNgvmhJwAKUzB7AApTQwABiBQIAAieGvoPAApTewDltXwA+Aj0cwAKU9hbAApTtLrhdwABgd7CFBQAFk4LAApUPwDltD4HAApUawDls+IPAApUowDltXyoAwABgRUrAApU8AYPAApVDwDltXz9OwAKVX8AClWMAAZq0YAPAAGxbARbAApVlLsAARGbAAGB4PRfAApWGLsAARGYpwABgeE7AApWywAKVuAAAilNgA8AAbB8Bk07AApZgAAAAsIdgA8AAbFsAQ8AClnIpPglOwAKWi8AClpMAAMAASRpgA8AAbB8Bk07AApavwAKWtAAAg0JgA8AAaacBHsAClrbAAGmlAQABgMAClsrAOWzqAEnAApbYHMACluEUwAKW3MA5bmMIACcBAAFqwAKW5GADwABpp8ABJkgAwABsXj4EPYjAApd4wDls6hzAApeALq+AAQABgMACl5DAOWzqAMAAYPpOwAKXpcACl7AAAMAASR5gA8AAbFsBHsACl7LAAGIFAgACJ4FZFsACl8aAwAKXwMA5bOqDYL5oAD0jHMACl+GGwAKX1cA5bjMnAQABKwDAAGxejsACl9XAOW4zIRTAApfmwDlu3wkAKwFgA8AAbFtJwAKX+hTAApf+wDlu3wkAPgNOwAKYHMACmCIAAIFYYAO+TQEWwAKYKoDAApgkwDls6oNgvmg9iMACmDrAOWzqHMACmEIur4ABAAEUwAKYUsA5b2AKAADAAGD6PRzAAphtFsACmGQuuF3AAGB3sJcCAAIUwAKYg8A5b2AKABbAApiQgMACmIrAOWzqg2C+aADAAF/VPz4BQ8ACmLghHMACmMQUwAKYv8A5bmMIACcBAAErAMAAbF4+A0nAApjZFsACmOIUwAKY3cA5bmMIAMAASRvAAGmpPgI9iMACmPrAOWzqHMACmQIur4ABAAGAwAKZEsA5bOoAwABg+knAApkmHsACmSrAAGIFAgACJ4FZFsACmT6AwAKZOMA5bOqDYL5oAD4DTsACmVvAAplhAACBWGADvk0BFsACmWmAwAKZY8A5bOqDYL5oPYjAApl9wDls6hzAApmFLq+AAQABFMACmZXAOXByCQAAwABg+j0cwAKZtBbAApmrLrhdwABgd7CXAgACFMACmcrAOXByCQAWwAKZ14DAApnRwDls6oNgvmgAwABf1T8+AT2IwAKaC8A5bOocwAKaGBTAApoTwDluYwgAIAIAAoDAApoewDls6i4AwABprD2PwAKaQsA5bkwcwAKaSofAAppCwDluTIE/AQABFsACmlIUwAKaTcA5bmMIAMAASRzAAGmqAMAAbIg9FcACmm7AOW5jCBzAApp6FMACmnXAOW5jCADAAEkdAQABgMACmobAOWzqAMAAaa09jcACmqjAOW4eHMACmqaFwAKaqMA5bh6BPwEAAZQAwABsiD2LwAKatcA5bV8WwAKawoDAApq8wDls6oNgvmhOwAKa1QAAAJYZYAO+TQBJwAKa4h7AAprmwABiBQIAAieO8YPAApr0wDltXwA+Aj0VwAKbBcA5cc0JiMACmw3AOWzqg8ACmxXAOW1fPYvAApsjwDltXxbAApswgMACmyrAOWzqg2C+aD9JwAKbRB7AAptIwABiBQIAAieGvoPAAptWwDltXwA+Az0cwAKbcBbAAptnLrhdwABgd7CFBQAFhcACm5PAOW4egsACm5rAOW0PgcACm6XAOWz4g8ACm7PAOW1fNcACm7kAAAEAYAPAAGxbAYbAApu5wDluMyMcwAKbuRTAApu5wDlykQoAJwEAASsAwABsXioUwAKbucA5cpEKAAFgA8AAbFsAwABgRT0XwAKb2C7AAERmhMACm/bAOW3swABgeErAApwDAYPAApwKwDltXz9JwAKcHxzAApwpFMACnCPAOXHNCQAnAQABKwDAAGxePgFJwAKcUB7AApxUwABppgEAAYPAApxqwDltXwA+A07AAp1OwAKdVAAAlhlgA75DAR/AAp1ovkwCAAJqwAKdgWADvpXAAP14FsACnY2DwAKdiMA5bV+ECr5pAE7AAp2owAKdsAAAgJZgA7LPASMcwAKduofAAp2ywDluTIE7AQABkwDAAGyGasACndRgA7LbwAB+4BzAAp4casACngVdA7LnAWEDAWADwABsGGADss/AAH1zjW8BAAEnjvEAsusBYAOyzz2IwAKeOsA5bOocwAKeQi7AAEhZAwADgMACnlTAOWzqFMACnlvAOXN/CwAUwAKeZMA5c0MKAADAAGDaPgU9HMACnocuwABIDAIAAoPAAp6twDltXxzAAp7QasACnrldA7LnAWEDAWADwABsGGADss/AAH1zjW8BAAEnhr4AsusAwABhTT2LwAKfJ8A5bV8WwAKfOILAAp8uwDltD6+Xvlo9HMACn1UWwAKfTC64XcAAYHewhQUABYXAAp96wDluHoLAAp+BwDltD4HAAp+MwDls+IPAAp+awDltXzXAAp+gAAABAGADwABsWwGGwAKfoMA5bjMjHMACn6AUwAKfoMA5dMMKACcBAAErAMAAbF4qFMACn6DAOXTDCgABYAPAAGxbAMAAYEU9F8ACn8EuwABEZoTAAp/fwDlt7MAAYHhKwAKf7gGDwAKf9cA5bV8/BsAAYQ2BO8ACoOPAAqDpwAKi/QAAwABJHwAAAAEDwAKhA8ACov0AAAAB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ArezAAAAAgICwAK2igAAAKlqYAO+TQDAArakAAAAjAVgA8AAalEAAGADvk0BPgZOwAK2ucACtr8AALZ7YAO+TQGAwAK2wcA5g3k9HMACttUWwAK2zC64XcAAYHexLwEAAYDAArb1wDmDeQDAAF++PYjAArcBwDmDeRzAArcJLsAASNACAAKAwAK3I8A5g3mBwAK3KsA5g4cAwABg7D2IwAK3OMA5g3kcwAK3QC7AAEklAQABgMACt2TAOYN5AMAAYRI9HMACt3kWwAK3cC64XcAAYHexNwEAAYLAAreXwDmDoADAAF+/SsACt6MBgMACt6rAOYN5BsAAYRWBO8ACuVrAArlgwAK94gAAwABJDwAAAAEDwAK5dMACveIAAAABAQHAArl7AAAAqWpgA75NAABgA75NAT4MTsACuY7AArmbAACwe2ADvk0BiMACuZ3AOYSSFsACuauAwAK5pcA5hJKDYL5oQB7AArm8wABiBQIAAieVOYHAArnOwDmEqQDAArm8wAK52wBOwAK56MACue0AAINgYAO+TQEWwAK59YDAArnvwDmEkoNgvmhOwAK6DMACuhIAAYE+YAPAAGwYARbAAroZgsACuhTAOYT5r7G+bEnAAroqIh7AArovwABs9wIAAoPAAro5wDmFHSePGwABHsACukrAAGz3AgACg8ACulTAOYUdJykAPgU9HMACunQWwAK6ay64XcAAYHexLgEAAYLAArqGwDmE+QDAAF9vPRzAArqcFsACupMuuF3AAGB3wABHtAEAAYLAArqywDmE+QDAAGAYPYjAArq/wDmEkhzAArrHLsAASRECAAKAwAK63sA5hJKBwAK65cA5hKkAwABhCz0cwAK7AxbAArr6LrhdwABgd7EwAQABFsACuxmAwAK7E8A5hJKDYL5oAMAAX3BKwAK7JgGAwAK7LcA5hJI/ScACuz4ewAK7QsAAbPcCAAKDwAK7TMA5hR0nlRoAPgU9HMACu2oWwAK7YS64XcAAYHexLgEAAYLAArt8wDmE+QDAAF9vPRzAAruSFsACu4kuuF3AAGB3wABHtAEAAYLAAruowDmE+QDAAGAYPYjAAru1wDmEkhzAAru9LsAASRICAAKAwAK72MA5hJKBwAK738A5hKkAwABhDD0cwAK7/RbAArv0LrhdwABgd7EwAQABFsACvBOAwAK8DcA5hJKD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AGwfAZQ9iMACxOvAOYxMHMACxPMuwABIHwIAAoDAAsUEwDmMTGrAAsUdYAPAAGqhwAEmXgDAAGDFQ8ACxTMewALFOsAAYgUCAAIngPcWwALFToDAAsVIwDmMTINgvmgAPgI9i8ACxV/AOY3tHMACxWSDwALFX8A5je2BPwEAAZQAwABsiD2IwALFcMA5jEwcwALFeC7AAEgfAgACFsACxZyAwALFlsA5jEyDYL5oasACxbRgA8AAaqHAASadAMAAYMU9HMACxecWwALF3i64XcAAYHewmwIAAoHAAsX4wDmMY4PAAsYDwDmN7QDAAF//SsACxhEBgMACxhjAOYxMBsAAYRqBO8ACxizAAsYywALLDQAAwABJJgAAAAEDwALGSsACyw0AAAABAQHAAsZRAAAAqWpgA75NAABgA75NAT4JPYjAAsZewDmPJxbAAsZsgMACxmbAOY8ng2C+aEAewALGfcAAbPcCAAIWwALGjYDAAsaHwDmPJ4O+vmVqwALGk2ADwABsH4dbAMACxn3AAsagAD0cwALGsBbAAsanLrhdwABgd6/3AQABgMACxsPAOY8nAMAAX9ZOwALHEcACxyQAAK/7YAPAAGwfAZNOwALHM8ACxzgAAINgYAO+TQEWwALHQIDAAsc6wDmPJ4NgvmhOwALHTsACx1MAAIO+YAPAAGwfARbAAsdagsACx1XAOY/Kg76+ZUFDwALHZCEcwALHcIPAAsdrwDmP7icBAAFqwALHc2ADwABsHwAAwABsMj4FScACx4YewALHisAAbPcCAAKDwALHlMA5j+5qwALHmmADwABsH4WnAD4DPYjAAsfjwDmPJxbAAsgBHMACx+sur4ABAAGCwALH+8A5j8oAwABg+oNgvmhJwALIDyEewALIFMAAYgUCAAInhr6AwALIIsA5jycAPgI9HMACyDYuwABIDAIAAoDAAshcwDmPJxzAAsiAasACyGldA7LnAWEDAWADwABsGGADss/AAH1zjW8BAAEnhr4AsusAwABhTT2IwALIn8A5jycWwALIrILAAsinwDmPyq+Xvlo/PRzAAsjRFsACyMguuF3AAGB3wABHhgIAAoLAAsjvwDmPyoDAAsj1wDmPJwDAAF/XScACyQoewALJDsAAbPcCAAKDwALJGMA5j+5qwALJHmADwABsH8AARIQAPgI9iMACyXDAOY8nHMACyXguwABEZQEAAYLAAsmSwDmPygDAAGEbPRzAAsmqFsACyaEuuF3AAGB3wABHhgIAAoLAAsnIwDmPyisAwABf1z4BQsACyewAPYnAAsoDwDmPtRzAAsoBgcACygPAOY+1gT8BAAGUAMAAbIg9iMACymnAOY8nHMACynEuwABIiQEAAYDAAsqBwDmPJwDAAGDDPYrAAsqPwDmPyhbAAsqcgMACypbAOY8ng2C+aD2LwALKqMA5j+4WwALKtILAAsqvwDmPyoO+vmU9HMACys0WwALKxC64XcAAYHev+gIAAoHAAsrewDmPtYLAAsrywDmPygDAAF/YSsACyv0BgMACywTAOY8nBsAAYRuBO8ACyxLAAssYwALMWQAAwABEZQAAAAEDwALLMcACzFkAAAABAQHAAss4AAAAqWpgA75NAABgA75NAT4CTsACy0vAAstQAACDYGADvk0BFsACy1iAwALLUsA5krSDYL5oScACy2IiHMACy3AWwALLa4HAAstmwDmSy4O+vmUnAQABasACy3NgA8AAbB/AAEHRAMAAbDIAHsACy4TAAGz3AgACFsACy5OBwALLjsA5ksuvsb5sJ5VzAD4CPRzAAsu6FsACy7EuuF3AAGB3sVMCAAKBwALLz8A5kstqwALL52ADwABqh8ABI/UAwABgWkrAAsv6AYHAAswBwDmSyz4BSsACzBoBHMACzCEuwABJAgIAAoDAAswrwDmStGrAAsxEYAPAAGqHwAEj9QDAAGEfBsAAYRyBO8ACzLHAAsy3wALNawAAwABJCgAAAAEDwALMx8ACzWsAAAABAQHAAszOAAAAqWpgA75NAABgA75NAT4EPYjAAszbwDmT6RbAAszpgMACzOPAOZPpg2C+aEAiHsACzPrAAGIFAgACJ4EegMACzQzAOZPpAAEewALNFsAAYgUCAAIngRyAwALNJ8A5k+kAwALM+sACzS0APRzAAs09FsACzTQuuF3AAGB3sI0BAAGAwALNT8A5k+kAwABgPErAAs1bAYDAAs1iwDmT6QbAAGEdgTvAAs2uwALNtMACzkwAAMAASQsAAAABA8ACzcTAAs5MAAAAAQEBwALNywAAAKlqYAO+TQAAYAO+TQE+BD2IwALN2MA5lLkWwALN5oDAAs3gwDmUuYNgvmhAHsACzffAAGIFAgACJ5V3gMACzgjAOZS5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lROAwALmm8A5pO4AScAC5rAewALmtMAAYgUCAAInlRuAwALmw8A5pO4APgFKwALnIwEpPz9KwALnQgEqBsAAYSmBO8AC55zAAuehwALoUQAAwABJIgAAAAEDwALntsAC6FEAAAABAQHAAue9AAAAqWpgA75NAABgA8AAbFsBPgFKwALnygEiIiIewALn0cAAYgUCAAInlRqAwALn38A5pwAAAR7AAufxwABiBQIAAieVG4DAAugAwDmnAAABHsAC6BLAAGIFAgACJ5UVgMAC6CTAOacAAAEewALoNsAAYgUCAAInlROAwALoR8A5pwAABsAAYSqBO8AC6FbAAuhcwALr4wAAwABI7QAAAAEDwALohsAC6+MAAAABAQHAAuiTAAABLmADvk0AAGADvk0BPgROwALopsAC6LEAAMAAR0JgA75NARbAAui5gMAC6LPAOae0g2C+aEAewALoysAAYgUCAAInlTmBwALo3MA5p8oAwALoysAC6OcAScAC6O4hHsAC6PPAAGnAAQABFsAC6QmBwALo/sA5p8qDYL5oAD4DTsAC6SHAAukqAADAAEhCYAPAAGpEAR7AAukswABqQQIAAoHAAuk4wDmnyioAScAC6VIcwALpX4LAAulWwDmoOicBAAFqwALpYmADwABqRMABIMcAwABsXj4ETsAC6XrAAul/AACDYGADvk0BFsAC6YyBwALpgcA5p8qDYL5oScAC6ZohFsAC6aSDwALpn8A5qJSuZ75cPgFKwALpvgEcwALpxS7AAEjvAQABgMAC6d7AOae0AMAAYPk/PYvAAun4wDmolBbAAuoEg8AC6f/AOaiUg2C+aEnAAuoSISIiIiIewALqGMAAYgUCAAInSIPAAuomwDmolAABFsAC6liDwALqU8A5qJS1u75eAR7AAup9wABiBQIAAieU3oPAAuqLwDmolAABHsAC6qDAAGIFAgACJ47xg8AC6q7AOaiUAAEewALqw8AAYgUCAAInlRqDwALq0cA5qJQAPgFKwALq5QEcwALq7C7AAEjvAQABgMAC6wXAOae0AMAAYPk/P0rAAuslARzAAussLsAASNsGAAaBwALra8A5p8qAwALrd8A5p7QrgcAC64TAOafKgsAC65DAOag6KgDAAGEsP0rAAuusARzAAuuzLsAASN8BAAGAwALr2cA5p7QAwABhKwbAAGEr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A8AAYXwAAGADvk0BPglOwAM1ZMADNWoAALZ7YAO+TQGIwAM1bMA517gcwAM1dC7AAEhuAwADgMADNYDAOde4KxbAAzWXgcADNY3AOdfGwABIpcAAYYwAwABg1D0cwAM1txbAAzWuLrhdwABgd7A3AgACgsADNcLAOdffgcADNcnAOdfGAMAAX1JOwAM13cADNewAALHBYAPAAGwfAZNOwAM1+8ADNgYAAKunYAO+TQEWwAM2DoDAAzYIwDnXuINgvmhDwAM2GBzAAzYfLsAASI0CAAInhr6EwAM2MsA52G8AwABgxj4EPYjAAzZHwDnXuBzAAzZPLsAASNYBAAGAwAM2XsA517gAwABg80nAAzZsHsADNnDAAGz3AgACFsADNoCAwAM2esA517iDYL5ohMADNobAOdhvAD4CPYjAAzcLwDnXuBbAAzcZgMADNxPAOde4g2C+aD0cwAM3Jy7AAEgMAgACgMADN0vAOde4HMADN3BqwAM3WF0DsucBYQMBYAO+TWADss/AANcDjW8BAAGAwAM3fsA517gAsusAwABhTT89i8ADN5fAOdhaHMADN5WDwAM3l8A52FqBPwEAAZQAwABsiD2MwAM3rcA52G8WwAM3wIDAAze6wDnXuINgvmg9iMADN9DAOde4FsADN96AwAM32MA517iDYL5oQCIWwAM39YDAAzfvwDnXuKupvlsBHsADN/7AAGIFAgACJ4a+gMADOAzAOde4AMADN+/AAzgSAD0cwAM4IhbAAzgZLrhdwABgd7A9BAAEg8ADOCvAOdhagsADODvAOdffgMADOELAOde4gcADOEnAOdfGAMAAX1NKwAM4WQGAwAM4YMA517gGwABhOoE7wAM4bsADOHTAAzqcAADAAERuAAAAAQPAAziFwAM6nAAAAAEBAcADOIwAAACpamADvk0AAGADvk0BPghOwAM4n8ADOKUAALZ7YAO+TQEWwAM4rYDAAzinwDnagINgvmhAHsADOL7AAGIFAgACJ5UagcADOMzAOdqXAMADOL7AAzjSAE7AAzliwAM5cwAAwABJNmADwABfRwEWwAM5dS64XcAAYHc9F8ADOYMuuF01wAM5kgAAAQBgA8AAaHMBH8ADOZLAAGmgAQABFsADOaUuuF3AAGB3ADXAAzmwAAABAFwBF8ADObCDwAM5ksA52wnAAElEKsAAaHaDwAM5ksA52wnAAGB3PYjAAzoJwDnagBzAAzoRLsAASNwCAAKAwAM6HMA52oBqwAM6LWADwABhfMABJ4gAwABhOT0XwAM6Oy64XYLAAzpGwDna3sAAYHc9HMADOmUWwAM6XC64XcAAYHewPwEAAYHAAzqAwDnalwDAAF9USsADOowBgMADOpPAOdqABsAAYTuBO8ADOyfAAzsswAM9ywAAwABI7gAAAAEDwAM7RMADPcsAAAABAQHAAztLAAAAqWpgA75NAABgA8AAbFsBPgU9iMADO1jAOdwKFsADO2aAwAM7YMA53AqDYL5oQB7AAzt3wABiBQIAAieVdoDAAzuJwDncCgDAAzt3wAM7jwA9iMADO5bAOdwKFsADO6SAwAM7nsA53AqDYL5oScADPIkWwAM8k4DAAzyNwDncCq5nvlw+Aj2IwAM8qcA53AoWwAM8t4DAAzyxwDncCoNgvmhJwAM8wx7AAzzHwABiBQIAAieGw4DAAzzVwDncCgA+Aj2IwAM858A53AoWwAM8/hbAAzz1gMADPO/AOdwKr5e+WoNgvmhJwAM9DB7AAz0QwABiDQIAAoDAAz0YwDncCjHAAz0fYAPAAGwYBSeU3ieA9yeQ5CeN2CevtwA+AUrAAz1JASk/ScADPW0ewAM9ccAAYg0CAAKAwAM9ecA53AoxwAM9gGADwABsGAMngPcng6MnjxAAPgFKwAM9nAEpPz9KwAM9uwEqBsAAYTyBO8ADPiPAAz4pwANAdAAAwABJBAAAAAEDwAM+PcADQHQAAAACAgLAAz5EAAAAqWpgA75NAMADPlAAAADAAEj2YAPAAGxbAABgA75NAT4GTsADPmvAAz52AACxd2ADvk0BFsADPn6AwAM+eMA53aWDYL5oQB7AAz6PwABiBQIAAieVdoLAAz6hwDndzgDAAz6PwAM+rAA9HMADPrwWwAM+sy64XcAAYHfAAEcJAQABgsADPtHAOd3OAMAAX089iMADPuLAOd2lHMADPuouwABI8wMAA4LAAz8NwDndzmrAAz8ZYAPAAGwfgpuBwAM/LcA53bMAwABg/UnAAz9BFsADP0UuwABH8MAAYII+AT0cwAM/XxbAAz9WLrhdwABgd7BvAgACgsADP3LAOd3OFsADP4SAwAM/fsA53aWDYL5oAMAAX1A+A07AAz+wwAM/ugAAsHRgA7LbAWrAAz/CYAOy28AAWVI9HMADP94uwABIDAIAAoLAAz/1wDndzoPAA0ABwDnexQDAAGFNPRzAA0AcFsADQBMuuF3AAGB3sHMDAAOCwANANsA53c4WwANASIDAA0BCwDndpYNgvmiDwANATsA53sUAwABfUUrAA0BkAYDAA0BrwDndpQbAAGE9gTvAA0EjwANBKcADRG0AAMAASPIAAAABA8ADQT3AA0RtAAAAAgICwANBRAAAAKlqYAO+TQDAA0FQAAAAwABI9mADwABsWwAAYAO+TQE+Bk7AA0FrwANBdgAAsNBgA75NARbAA0F+gMADQXjAOd+Dg2C+aEAewANBj8AAYgUCAAInlXWCwANBocA536wAwANBj8ADQawAScADQbMewANBt8AAYgUCAAInlN4WwANB0ILAA0HFwDnfrINgvmgAPgI9HMADQqouwABIDAIAAhbAA0LXgsADQszAOd+sg2C+aGrAA0LjYAOy28AAq9cAwABhTT0cwANDFBbAA0MLLrMVwABggMAASIoCAAKCwANDK8A536wfwANDRb5CBAAEasADQ3NgA76VwAD68ifAAEirFsADQ5EWwANDjILAA0OBwDnfrINgvmiJzr5WkwAAwABqGj89iMADQ6zAOd+DI4HAA0O0wDnfkRzAA0PMLq+AAQABgsADQ9zAOd+sAMAAYPocwAND8i7AAEj0AQABgsADRBDAOd+sAMAAYPsBYAO+TT0cwANEKhbAA0QhLrhdwABgd7DPAgACgsADREDAOd+sFsADRFKAwANETMA534ODYL5oAMAAYABKwANEXQGAwANEZMA534MGwABhPoE7wANEvMADRMLAA0XZAADAAEjiAAAAAQPAA0TXwANF2QAAAAEBAcADRN4AAACpamADvk0AAGADvk0BPgZOwANE8cADRPwAALDQYAO+TQEWwANFBIDAA0T+wDnhbYNgvmhAHsADRRXAAGIFAgACJ5V0gcADRSnAOeGEAMADRRXAA0U0AD0cwANFRBbAA0U7LrhdwABgd8AAR6cBAAGBwANFWsA54YQAwABgAT2IwANFa8A54W0cwANFcy7AAEgcAQABgcADRYPAOeGEAMAAYNk9HMADRZ0WwANFlC64XcAAYHexlAIAAoHAA0WxwDnhhIDAA0W9wDnhbQDAAGACSsADRckBgMADRdDAOeFtBsAAYT+BO8ADRy3AA0czwANYjwAAwABI5QAAAAEDwANHRMADWI8AAAABAQHAA0dLAAAAqWpgA75NAABgA75NAT4MTsADR17AA0dpAACxBGADvk0BFsADR3GAwANHa8A54n+DYL5oQB7AA0eCwABiBQIAAieVjIHAA0eSwDnilgDAA0eCwANHnQA9HMADR60WwANHpC64XcAAYHexAQEAAYHAA0e/wDnilgDAAGAJTsADR9bAA0fjAADAAEdAYAO+TQEcwANH5S7AAEjcAgACgcADR/DAOeKWasADSAZgA8AAYXzAAOA/AMAAYTk9iMADSBnAOeJ/FsADSC6CwANIIcA54wKDYL5oTsADSDzAA0hHAACxA2ADwABsHwGTTsADSFjAA0heAACBPmADwABsGAEWwANIZoDAA0hgwDnif6+xvmxDwANIdyIewANIfsAAbPcCAAKEwANIiMA543EnlY0AAR7AA0ibwABs9wIAAoTAA0ilwDnjcSeVTwA+DD0cwANIxBbAA0i7LrhdwABgd7D1AQABgMADSNXAOeJ/AMAAYAtOwANI6cADSPMAALD5YAO+TQErScADSQEewANJBcAAbPcCAAKEwANJD8A543EnlU8APgQ9jcADSUfAOeP3gMADSVPAOeJ/PYrAA0liwDnjAhzAA0mKHsADSXHAAGpBAgACgMADSX3AOeJ/KQDAAEh0AgACgMADSZzAOeJ/LgDAAGpKPYjAA0mywDnifxbAA0nHgsADSbrAOeMCg2C+aD2MwANJ1cA543EWwANJ44DAA0ndwDnif6+xvmw/TsADSgTAA0oRAACw+mADvk0BK07AA0olwANKKwAAlhlgA75NAStJwANKOR7AA0o9wABs9wIAAoTAA0pHwDnjcSeVjQA+CD2OwANKYsA55LKAwANKccA54n9OwANKh8ADSpIAAMAASUVgA75NARbAA0qhhsADSpTAOeSyg2C+aEnAA0qvIR7AA0q0wABiBQIAAieGwxTAA0rCwDnlCwgAAD4CPRzAA0rbLsAASAwCAAIUwANK8sA55QsIAGrAA0sEYAOy28AAX90AwABhTT0VwANLI8A55QsIHMADSzkWwANLMC6zFcAAYIDAAEgsAgAChsADS0bAOeSyKQDAAGoZP07AA0t0wANLggAAwABJRmADvk0BFsADS48UwANLhMA55QsIAINgvmhJwANLnSEcwANLtBbAA0uvFMADS6HAOeWyCQCDvr5lJwEAAWrAA0u3YAPAAGwfiGwAwABsMj4BPRXAA0vVwDnlsgkcwANMFWrAA0v3YAPAAGphwAEnocAASB8CAAIUwANMJsA55QsIAC4AwABqYz9JwANMTB7AA0xQwABiBQIAAieDoxbAA0xsFMADTF7AOeWyCQCDYL5oAD4APgM9j8ADTLfAOeTFFsADTM0UwANMv8A55bIJAINgvmhJwANM3SEewANM4sAAYgUCAAInjvGHwANM8MA55MUAPgJJwANNHiEWwANNMRTAA00jwDnlsgkAhDu+YT4BPRzAA01OLsAASAwCAAKHwANNZcA55MVqwANNcmADstvAAF/dAMAAYU0/ScADUMYWwANQ3hbAA1DVFMADUMrAOeULCACvl75ahDu+YT4CPRzAA1FMFsADUUMusxXAAGCAwABILwIAAhTAA1FawDnlsgkAFsADUXQUwANRacA55QsIAK+XvloAwABqGz2PwANRjcA55MUrPgE9j8ADUb7AOeTFHMADUeEWwANR2C6zFcAAYIDAAEiXAgACFMADUfbAOeWyCQBqwANSD2ADvpXAAP14AMAAajc/ScADUjshHMADUkWHwANSP8A55MUnAQABKwDAAGxePgNOwANSYsADUmwAAMAASUhgA75NARbAA1J0h8ADUm7AOeTFg2C+aEnAA1KGIRzAA1KZFsADUpQUwANSisA558kKAIO+vmUnAQABasADUpxgA8AAbB+IbADAAGwyPgE9FcADUr7AOefJChzAA1L+asADUtxgA8AAamHAASehwABIHwIAAofAA1MPwDnkxS4AwABqYz9JwANTNyEewANTPMAAYgUCAAIng6MWwANTVBTAA1NKwDnnyQoAg2C+aAA+AknAA1OFIRbAA1OUFMADU4rAOefJCgCEO75hPgE9HMADU7MuwABIDAIAAhbAA1PpFMADU9/AOefJCgCDYL5oasADU/VgA7LbwABgBADAAGFNP0nAA1Q3FsADVE8WwANURhTAA1Q7wDnlCwgAr5e+WoQ7vmE+AT0cwANUwRbAA1S4LrMVwABggMAASC8CAAIUwANUz8A558kKABbAA1TlFMADVNrAOeULCACvl75aAMAAahs/Pz89isADVSzAOeMCHMADVTsuwABITQIAAobAA1VRwDnksmrAA1VqYAPAAGHlwAEn4ADAAGCrPYjAA1V6wDnifxbAA1WPgsADVYLAOeMCg2C+aD89HMADVawWwANVoy64XcAAYHew9gEAAYDAA1W7wDnifwDAAGAMPYrAA1XJwDnjAhzAA1XYLsAASNwCAAKCwANV48A54wJqwANV+2ADwABhfMABJ/kAwABhOT2IwANWD8A54n8WwANWJILAA1YXwDnjAoNgvmg9i8ADVjLAOeNcHMADVjCDwANWMsA541yBPwEAAZQAwABsiD0cwANWTRbAA1ZELrhdwABgd7D4AwADhcADVl7AOeP3hsADVmnAOeSyh8ADVnfAOeTFAMAAYA09jMADVoXAOeNxFsADVpOAwANWjcA54n+vsb5sTsADVsTAA1bTAACxBWADvk0BK0nAA1bfHsADVuPAAGIFAgACJ5WPgMADVvfAOeJ/AD4EPY3AA1cHwDnqeYDAA1cYwDnifz2KwANXJcA54wIcwANXNC7AAEjcAgACgMADVz/AOeJ/asADV1BgA8AAYXzAAOBWAMAAYTk9iMADV2bAOeJ/FsADV3uCwANXbsA54wKDYL5oPRzAA1eQFsADV4cuuF3AAGB3sZgBAAGFwANXo8A56nkAwABgDj4BScADV8ccwANX1oPAA1fLwDnjXCcBAAGTAMAAbDI+AT0cwANX5i7AAEgMAgACgcADV/3AOeKWasADWA9gA7LbwAC6UgDAAGFNPz0cwANYOxbAA1gyLrhdwABgd7ECAwADg8ADWEvAOeNcgcADWFfAOeKWhcADWGPAOep5AMAAYA9KwANYeAGCwANYf8A54wIGwABhQIE7wANY/MADWQLAA1r+AADAAEjmAAAAAQPAA1kWwANa/gAAAAEBAcADWR0AAACpamADvk0AAGADvk0BPgpOwANZMMADWT4AALHEYAO+TQEWwANZRoDAA1lAwDnr8INgvmhAHsADWVfAAGIFAgACJ5WEgcADWWrAOewHAMADWVfAA1l4AD0cwANZiBbAA1l/LrhdwABgd8AAR6UBAAGBwANZncA57AcAwABf+j2IwANZscA56/AcwANZuS7AAEkVAQABgcADWdbAOewHAMAAYQVOwANZ9MADWgMAAMAASNVgA8AAabEBFsADWgUuwABEaMAAYHpJwANaFBzAA1oiFsADWhguwABEaMAAYHonAQABasADWi9gA8AAabHAAR26AMAAbF4+AT0XwANaRC7AAERoasADWlpgA8AAabHAASgSwABgej89iMADWnLAOevwHMADWnouwABJTAEAAYDAA1qLwDnr8ADAAGFBPRfAA1qXLsAARGiCwANao8A57JrAAGB6PRzAA1rAFsADWrcuuF3AAGB3scMCAAKBwANa08A57AeAwANa4sA56/AAwABf+0rAA1ruAYDAA1r1wDnr8AbAAGFBgTvAA1tbwANbYcADZQoAAMAASUwAAAABA8ADW3HAA2UKAAAAAQEBwANbeAAAAKlqYAO+TQAAYAO+TQE+Ck7AA1uLwANblwAAwABJTWADvk0BiMADW5nAOe20HMADW6EuwABIbgMAA4DAA1utwDnttCsnwABJTgDAAGDUPRzAA1vcFsADW9MuuF3AAGB3sa8BAAGBwANb7cA57csAwABf/E7AA1wDwANcDQAAscdgA8AAbB8Bk07AA1wcwANcKwAAsb9gA75NAStOwANcPcADXE8AALHAYAO+TQErQ8ADXFscwANcYi7AAEiNAgACJ4a+FsADXHuAwANcdcA57bSDYL5oAMAAYMY+B07AA1yQwANcmgAAwABJT2ADvk0BFsADXKKAwANcnMA57bSDYL5oTsADXLLAA1zCAACxsmADwABsHwGTTsADXNHAA1zcAACxkGADwABsHwGTTsADXO3AA1zyAACrq2ADvk0BHMADXPQuwABJUAEAAYXAA10DwDnulwDAAGFCQUPAA10VKT4CTsADXYDAA12GAACBPmADwABsGAEWwANdjRTAA12IwDnu5wgAr7G+bEnAA12iHsADXabAAGz3AgACFMADXbDAOe8dCQAnlYcAPgZDwANdzyEewANd18AAbPcCAAIWwANd54DAA13hwDnttINgvmgUwANd7cA57ucIAAA+Aj2IwANeAsA57bQcwANeCi7AAEjwAQABgMADXhXAOe20AMAAYPc9j8ADXinAOe7SHMADXjOHwANeKcA57tKBPwEAAZQAwABsiEnAA15NIRzAA15gg8ADXlHAOe5DJwEAASsAwABsXj4BPRzAA153LsAASAwCAAIWwANepYDAA16fwDnttINgvmhqwANesWADstvAANA7AMAAYU0/PYvAA17qwDnuQxbAA18BgMADXvvAOe20g2C+aD2MwANfEcA57laIwANfJcA57bQcwANfLS7AAEipAQABg8ADXznAOe5DAMAAYNc9FcADX1TAOe7nCBbAA19hgMADX1vAOe20g2C+aELAA19xAEnAA1+HHsADX4vAAGz3AgACFMADX5XAOe8dCQAnlYYAPgpDwANfsSEewANfucAAbPcCAAIWwANfyYDAA1/DwDnttINgvmgUwANfz8A57ucIAAA+Aj2IwANf5MA57bQcwANf7C7AAEjwAQABgMADX/fAOe20AMAAYPc9j8ADYAvAOe7SHMADYBWHwANgC8A57tKBPwEAAZQAwABsiE7AA2A1wANgQQAAr61gA75NARbAA2BJgMADYEPAOe20g2C+aEnAA2BZIRzAA2Bsg8ADYF3AOe5DJwEAASsAwABsXj4BPRzAA2CDLsAASAwCAAIUwANgq8A58T0KAGrAA2C+YAOy28AA0A4AwABhTT89HMADYQAWwANg9y64XcAAYHevrAEAARTAA2EUwDnxPQoAAMAAX1c9iMADYSzAOe20HMADYTQur4ABAAEUwANhRMA58T0KAADAAGD6PYjAA2FcwDnttBzAA2FkLsAASKkBAAGAwANhcMA57bQAwABg1z0cwANhixbAA2GCLrhdwABgd6+uAQABgMADYZ3AOe20AMAAX1g9HMADYbgWwANhry64XcAAYHexzgIAAhTAA2HIwDnxPQoAgMADYdXAOe20AMAAYAo9jsADYefAOe69HMADYfaGwANh58A57r2BPwEAAZQAwABsiD0VwANiBMA57ucIHMADYgsuwABJUAEAARbAA2IggMADYhrAOe20g2C+aADAAGFCScADYjYcwANiSobAA2I6wDnuvYE7AQABkwDAAGyGPgFCwANiWwA+BT0cwANiky7AAEgMAgACFMADYrnAOe7nCAAcwANi22rAA2LFXQOy5wFhAwFgA8AAbBhgA7LPwACBqI1vAQABJ5WGALLrAMAAYU1OwANjA8ADYwwAAK+XYAO+TQEWwANjGoHAA2MOwDnty6+XvlpDwANjLiEcwANjQBbAA2M7gMADYzXAOe20g2C+aCcBAAEUwANjQ8A58zYKAADAAGxePgE9iMADY1vAOe20FsADY2mAwANjY8A57bSDYL5oPRXAA2OFwDnu5wgcwANjjC7AAElQAQABFsADY6GAwANjm8A57bSDYL5oAMAAYUJCwANjsgA9iMADY9HAOe20HMADY9kuwABJUQcAB4DAA2P1wDnttBTAA2P8wDnu5wgAhcADZALAOe6Xh8ADZA3AOe7ShsADZCPAOe69g8ADZDTAOe5DhMADZETAOe5WAMAAYUM9isADZGDAOe4uHMADZF6CwANkYMA57i6BPwEAAZQAwABsiD2IwANkdcA57bQWwANkg4DAA2R9wDnttINgvmg9HMADZJYWwANkjS64XcAAYHexxgMAA4LAA2SlwDnuLoHAA2SwwDnty4DAA2S9wDnttADAAF/9QCIWwANk1oDAA2TQwDnttKupvlsBHsADZN/AAGIFAgACJ4a+gMADZO3AOe20AMADZNDAA2TzAErAA2T6AYDAA2UBwDnttAbAAGFCgTvAA2WqwANlsMADZkUAAMAASVAAAAABA8ADZb7AA2ZFAAAAAQEBwANlxQAAAKlqYAO+TQAAYAO+TQE+AkPAA2XSIhbAA2XfgMADZdnAOfUirme+XAAewANl78AAYgUCAAIngVkWwANmA4DAA2X9wDn1IoNgvmgAPgE9iMADZhLAOfUiFsADZiUWwANmIIDAA2YawDn1IoNgvmiDYL5oSsADZjUBgMADZjzAOfUiBsAAYUOBO8ADZofAA2aNwANruAAAwABJUQAAAAEDwANmqMADa7gAAAAHBwfAA2a2AAAAqWpgA75NAMADZskAAACrq2ADvk0AwANm2wAAALZ7YAO+TQDAA2bsAAAAsZBgA8AAbB8AwANnAgAAALGyYAPAAGwfAMADZx8AAACxv2ADvk0AwANnOwAAALHAYAO+TQAAYAO+TQE+BT0cwANnXRbAA2dULrhdwABgd7GxAwADg8ADZ23AOfX/hMADZ3nAOfYPgsADZ4rAOfXxAMAAYFhOwANnwsADZ9EAALHBYAPAAGwfAZNBQ8ADZ9ohHsADZ+LAAGz3AgACFsADZ/cWwANn8oDAA2fswDn11YNgvmiDvr5lasADZ/1gA8AAbB8AAD4DTsADaBjAA2geAACBPmADwABsGAEWwANoJYHAA2ggwDn146+xvmxJwANoOCIiHsADaD3AAGz3AgACFMADaEfAOfbNCAAnlYYAAR7AA2hlwABs9wIAAhTAA2hvwDn2zQgAJ5WHAAEiHsADaJHAAGz3AgACFMADaJvAOfbNCAAnhr4AAB7AA2iswABs9wIAAhbAA2i8gMADaLbAOfXVg2C+aIHAA2jCwDn14wA+AULAA2keAD4FTsADaULAA2lNAACrp2ADvk0BFsADaVWAwANpT8A59dWDYL5oPYjAA2ljwDn11RzAA2lrLsAASNYBAAGAwANpesA59dUAwABg807AA2mQwANplQAAg2BgA75NARbAA2mdgMADaZfAOfXVg2C+aEnAA2mrHsADaa/AAGz3AgACFMADabnAOffKCgAUwANpv8A594EJAAA+Aj0cwANqSi7AAEgMAgACFMADanDAOffKCgAcwANqlGrAA2p8XQOy5wFhAwFgA75NYAOyz8AA1wONbwEAARTAA2qiwDn3ygoAALLrAMAAYU09iMADarTAOfXVFMADarzAOffKCgA/PY/AA2rWwDn2exzAA2rUh8ADatbAOfZ7gT8BAAGUAMAAbIg9icADavTAOfXjHMADavsuwABJUAEAARbAA2sQgMADawrAOfXVg2C+aADAAGFCPRzAA2sqFsADayEuuF3AAGB3sb4HAAeDwANrOMA59f+EwANrRMA59g+FwANrVcA59h+GwANrbcA59i2HwANrgMA59nuCwANrkMA59fEWwANrnYDAA2uXwDn11YNgvmgAwABgWUrAA2uoAYDAA2uvwDn11QbAAGFEgTvAA2wPwANsFcADbiIAAMAASOcAAAABA8ADbCjAA24iAAAAAQEBwANsLwAAAKlqYAO+TQAAYAO+TQE+B07AA2xCwANsTwAAsdJgA75NAYjAA2xRwDn5bBbAA2xfgMADbFnAOflsg2C+aEAewANscMAAYgUCAAInlX+BwANsgsA5+YMAwANscMADbI8ATsADbJvAA2ylAACx0WADwABsWwEqScADbLIWwANswRbAA2y8gMADbLbAOflsg2C+aK5nvlw+Aj2IwANs18A5+WwcwANs3y7AAEgfAgACgMADbPDAOflsasADbQlgA8AAarLAASgrAMAAYMU9isADbSDAOfnTKUnAA209IRbAA21CLsAAR/PAAGCEPgE9HMADbVouwABIDAIAAoHAA21xwDn5g2rAA22FYAOy28AAWqgAwABhTT89iMADbavAOflsHMADbbMuwABIHAEAAYDAA23DwDn5bADAAGDZPRzAA23YFsADbc8uuF3AAGB3sdADAAOCwANt7cA5+dOBwANt+MA5+YOAwANuBsA5+WwAwABgPUrAA24SAYDAA24ZwDn5bAbAAGFFgTvAA26PwANulcADdYQAAMAASKEAAAABA8ADbqDAA3WEAAAAAgICwANupwAAAKlqYAO+TQDAA261AAAAg75gA8AAYW4AAGADvk0BPhM9iMADbsHAOfsfFsADbs+AwANuycA5+x+DYL5oQB7AA27gwABiBQIAAieVfYDAA27zwDn7HwDAA27gwANu+QA9HMADbwkWwANvAC64XcAAYHexnwIAAoDAA28VwDn7H4HAA28cwDn7LQDAAGBATsADby3AA287AACxoGADvk0BgMADbz3AOfsfTsADb07AA29eAACxeGADvk0BFsADb2aAwANvYMA5+x+DYL5oScADb3AhHsADb3XAAGIFAgACJ4bDg8ADb4PAOfvOAD4CPRzAA2+vLsAASAwCAAKDwANv0cA5+84cwANv/2rAA2/oXQOy5wFhAwFgA8AAbBhgA7LPwAB9c41vAQABJ4bDALLrAMAAYU09i8ADcBrAOfvOHMADcDUWwANwLC6zFcAAYIDAAEgsAgACgMADcELAOfsfKQDAAGoZPz2IwANwWsA5+x+DwANwYsA5+85OwANwfcADcIgAALGiYAO+TQErTsADcJnAA3CdAACatGADwABsWwEWwANwny7AAERmwABgeD0XwANwwC7AAERmKcAAYHg9iMADcOnAOfsfHMADcPEur4ABAAGAwANxAcA5+x8AwABg+knAA3ENHsADcRHAAGIFAgACJ47xFsADcSWAwANxH8A5+x+DYL5oAD4CPYjAA3E0wDn7HxbAA3FCgMADcTzAOfsfg2C+aEnAA3FOIR7AA3FTwABiBQIAAieDoxbAA3FngMADcWHAOfsfg2C+aAA+Az2MwANxeMA5/J+AwANxhcA5+x89iMADcZTAOfsfHMADcZwur4ABAAGAwANxrMA5+x8AwABg+knAA3G8HsADccDAAGIFAgACJ47xFsADcdSAwANxzsA5+x+DYL5oAD4BPYjAA3IPwDn7HxbAA3IdgMADchfAOfsfg2C+aD8/P07AA3JGwANyTwAAr5dgA75NARbAA3Jhg8ADclHAOfvOr5e+WknAA3JvHMADcn4WwANyeYDAA3JzwDn7H4NgvmgnAQABhsADcoHAOf30AMAAbF4+AT2IwANyk8A5+x+GwANym8A5/fQ+AUnAA3LKFsADcteGwANyzsA5/fSEO75hPgE9iMADczzA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nZ1gA8AAasvAASRzBMAAYceBQJ8rn3cGwABJhABgA8AAassBap9GYAPAAGrLwAEkcwTAAGHIgUCgGaBrBsAASM4AYAPAAGqnAWqgQGADwABqp8ABJOUEwABhyYFAobOiHgbAAEmFAGADwABqpwFqoeZgA8AAaqfAASokBMAAYcqBQKKuovgGvpMAYAPAAGpwAWqi0WADwABqcMABJSIEwABhy4FAo72kIAbAAEjRAGADwABqcAFqo+xgA8AAanDAASVhBMAAYcyBQKTypYQGwABI0gBgA8AAanABaqUzYAPAAGpwwAEloATAAGHNgUCmIKZiBsAASPEAYAPAAGqtAWqmP2ADwABqrcABJfYEwABhzoFApvynOAbAAEknAGADwABqoQFqpxhgA8AAaqHAASZeBMAAYc+BQKgIqF0GwABJKABgA8AAaqEBaqgwYAPAAGqhwAEmnQTAAGHQgUCo5qkcBoV+AGADwABqhwFqqP9gA8AAaofAASP1BMAAYdGBQKmXqeYGwABIpABgA8AAaocBaqm8YAPAAGqHwAEkNATAAGHSgUCqmqroBsAASSwAYAPAAGrSAWqqv2ADwABq0sABJtwEwABh04FAq3WrxwbAAEk7AGADwABqvwFqq5xgA8AAar/AASdLBMAAYdSBQKxlrKMGwABJUgBgA8AAarIBaqyCYAPAAGqywAEoKwTAAGHWgUCstay6CYR1wABhpABgA8AAbBgABMAAYdeBQK0irS8Jr9YAYAPAAGxbAATAAGHYgUCtnK24CcAASYYAYAPAAGxbAATAAGHZgUCuC64TCcAASYcAYAPAAGxbAATAAGHagUCuWa5nCcAASYgAYAPAAGxbAATAAGHbgUCuyK7YCa/UAGADwABsWwAEwABh3IFArzKvTAnAAEmJAGADwABsWwAEwABh3YFAr8qv5Qmv2gBgA8AAbFsABMAAYd6BQLAWsCYJwABIjABdA7LnAV4DAAEBAWADvk0AAVcDwABhpgFgA75NYAOyzwABBcAAYeOBQLArsDGzBgEAAAOwQrMGAAAACQEBsEgAAASEdWADwABsGAAIsFsAAASv1mADwABsWwFqsGpgA8AAbFscsHwAAATAAEmGYAPAAGxbAWqwmmADwABsWxywrAAABMAASYdgA8AAbFsBarC2YAPAAGxbHLDIAAAEwABJiGADwABsWwFq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AAEBAa6bguUAAMAAS4QAAAAAAAgCwABiGoFEgwCDBYYEC66uAAABYAPAAGxWAAAuBMAAYhyBRIMFgwUJgygAYAPAAGwfAATAAGIegUSDBYMFCYR1wABiGQBgA8AAbBgABMAAYh+BRIMFgwUGgaYAXQPAAGwZAWADwABiGgFqAF0DwABsGQFgA8AAYhrAAS2fBMAAYiCBRIMTgxMGhWcAYAPAAGIaAWoAYAPAAGIawADenQTAAGIhgUSDIIMgBsAASb4AYAPAAGIaAWoAYAPAAGIawAErNQTAAGIigUSDJoMmBsAASb8AYAPAAGIaAWoAYAPAAGIawADiNgTAAGIjgUSDNIM0BoXwAGADwABiGgFqAGADwABiGsAA3mEEwABiJIFEgz2DPQbAAEnAAGADwABiGgFqAGADwABiGsABE5EEwABiJYFEg0yDTAbAAEnBAGADwABiGgFqAGADwABiGsABK04EwABiJoFEg1+DXwbAAEcvAGADwABiGgFqAGADwABiGsABK2gEwABiJ4FEg26DbgbAAEnCAGADwABiGgFqAGADwABiGsABK4IEwABiKIFEg3qDegbAAEdyAGADwABiGgFqAGADwABiGsABK5wEwABiKYFEg42DjQbAAEnDAGADwABiGgFqAGADwABiGsABK7YEwABiKoFEg6yDrAbAAEnEAGADwABiGgFqAGADwABiGsABK9AEwABiK4FEg8+DzwbAAEnFAGADwABiGgFqAGADwABiGsABK+oEwABiLIFEg+qD6gbAAEnGAGADwABiGgFqAGADwABiGsABLAQEwABiLYFEhCCEIAbAAEnHAGADwABiGgFqAGADwABiGsABE6kEwABiLoFEhDKEMgbAAEnIAGADwABiGgFqAGADwABiGsABLB4EwABiL4FEhD6EPgbAAEnJAGADwABiGgFqAGADwABiGsABLDgEwABiMIFEhFaEVgaFMgBgA8AAYhoBagBgA8AAYhrAAOBtBMAAYjGBRIRkhGQGwABJygBgA8AAYhoBagBgA8AAYhrAASxSBMAAYjKBRIR1hHUGhQwAYAPAAGIaAWoAYAPAAGIawADgBATAAGIzgUSEiYSJBrDxAGADwABiGgFqAGADwABiGsABE9oEwABiNIFEhJ2EnQbAAEnLAGADwABiGgFqAGADwABiGsAA4sQEwABiNYFEhK2E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wABjNoFIgZSBlAbAAEoeAGADwABjLgFqAGADwABjLsABLpcEwABjN4FIgaKBogbAAEofAGADwABjLgFqAGADwABjLsABLrEEwABjOIFIga+BrwbAAEogAGADwABjLgFqAGADwABjLsABLssEwABjOYFIgb2BvQbAAEohAGADwABjLgFqAGADwABjLsABLuUEwABjOoFIgceBxwaGSQBgA8AAYy4BagBgA8AAYy7AAS7/BMAAYzuBSIHRgdEGhoIAYAPAAGMuAWoAYAPAAGMuwAEvGQTAAGM8gUiB4IHgBsAASiIAYAPAAGMuAWoAYAPAAGMuwAEvMwTAAGM9gUiB9YH1BsAASiMAYAPAAGMuAWoAYAPAAGMuwAEvTQTAAGM+gUiCAYIBBsAASiQAYAPAAGMuAWoAYAPAAGMuwAEvZwTAAGM/gUiCDYINBsAASiUAYAPAAGMuAWoAYAPAAGMuwAEvgQTAAGNAgUiCGoIaBoaEAGADwABjLgFqAGADwABjLsABL5sEwABjQYFIgiaCJgbAAEomAGADwABjLgFqAGADwABjLsABL7UEwABjQoFIgjiCOAbAAEonAGADwABjLgFqAGADwABjLsABL88EwABjQ4FIgkKCQgbAAEooAGADwABjLgFqAGADwABjLsABL+kEwABjRIFIgk6CTgbAAEopAGADwABjLgFqAGADwABjLsABMAMEwABjRYFIglyCXAaQBABgA8AAYy4BagBgA8AAYy7AATAdBMAAY0aBSIJrgmsGwABKKgBgA8AAYy4BagBgA8AAYy7AATA3BMAAY0eBSIJ3gncGwABG1QBgA8AAYy4BagBgA8AAYy7AATBRBMAAY0iBSIKLgosGwABKKwBgA8AAYy4BagBgA8AAYy7AATBrAQXAAGNMgUiBcoFygpcBAAADgXKClwAAAAICAoFyAAAEgyhgA8AAbB8AgXIAAASEdWADwABsGAAAYAPAAGMuAT8DCADAAGMwgADAOuI7CADAAGMygQDAOuJJCQAAwABsWgAAAAABBsAAY0qBSIFygXKClwAAgVMAAAABA4FygpcAAAAAAAAAYAPAAGwYAUoAAQ8ALsAAYzIAADrihQA64rcAAAABAAADBsAAYyuBSIKagqOHnAABwABKLAAAAAEDgrWHnAAAAAEBAYK9AAAAh31gA8AAbBgAAGADwABjLgE+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wAEvz44Rao4RYAPAAGMuwAEv6Y4tao4tYAPAAGMuwAEwA45Lao5LYAPAAGMuwAEwHY5qao5qYAPAAGMuwAEwN46Gao6GYAPAAGMuwAEwUQA+AUqOngGUAY67ao67YAPAAGMuwAEvZwA+AUqOywGVSo7bARyO4pSBWgAAAADAAGyPAYFIADrqiQA63roAOuLEAAAAAQA64scAOuZ0ADro3AA66okAAAADAAIIwABjTcAASi+BSQAAH4D6AADAAEtdAAEBB66OuEuukK6RrpSukq6Vgd0AAMAAS2cAAQEBrpuCLgAAwABiGQABAQOuq66urq+CqgAAwABLhAAAguwAAMAAS50AAQEBoB+DNwAAgi4AAQEEhkuGQIUFhnuDlQAAwABZEAAAg80AAMAATE0AAIP0AADAAGMYAACEIQAAwABNZwAAhFQAAMAATeAAAISEAADAAE3zAACEvwAAwABZHwAAhOoAAMAAXx0AAIUeAADAAE5yAACFSwAAwABOjQAAhXkAAMAAQYUAAIWgAADAAE8eAACF0AAAwABPPgAAhfsAAMAAQb4AAQEBhGeGKQAAwABZlwABAQG324ZdAACU2AAAhnwAAMAAT2UAAQECrqCuooa7AADAAGrvAAEBAcAASjCG/gAAwABWogAAhygAAMAAT6EAAQEQv42/jr+Pv5Cuo7+Rv5K3rK6krqW/mq6mrqe5ra6oua6IgQAAwABjKQABAQSEu8AASizAAEotwABKLokUAAC1OQABAQGuCYk/AADAAEawAAEBBLr7uu67EqvXieIAAMAAUCwAAIoGAADAAFBAAAAAAAACAsAAY06BSYoiiieKZQu/4gAAAWADwABsVgAABgTAAGNQgUmKJ4onCYMoAGADwABsHwAEwABjUoFJiieKJwmEdcAAY00AYAPAAGwYAATAAGNTgUmKJ4onBoGmAF0DwABsGQFgA8AAY04BagBdA8AAbBkBYAPAAGNOwAExKATAAGNUgUmKNoo2Br+MAGADwABjTgFqAGADwABjTsABMOEEwABjVYFJikKKQgbAAEo0AGADwABjTgFqAGADwABjTsABMPoEwABjVoFJik2KTQaTnQBgA8AAY04BagBgA8AAY07AATETAQXAAGNagUmKJ4onimUBAAADiieKZQAAAAICAoonAAAEgyhgA8AAbB8AiicAAASEdWADwABs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VfkeAMAAbC8BAV0DwABsIAFgA8AAQYYBhMAAVfnAOyWrAD3AAGxLRQAAARzAAFX5FADAOyk3DAA+AAAAAMAAbE0APgJOwABV7AAAAINTYAPAAEGGARbAAFYPFADAOyk3DABAwABsTz4BScAAVhscwABWUhzAAFY8FsAAVikUwABWH8A7KZUNALILwABBiqyOAQABFsAAVkIurHHAAGNdAMAATqInAQABasAAVm9gA4lHhR4AwABsXj4BScAAVocWwABWoRbAAFaaFsAAVosurHHAAGNdq/nAAEa6j+PAAF13PgE9HMAAVtAWwABWwS6sccAAY12sYAQABBzAAFclasAAVu5dA7LnAWEDAWADwABsGGADss/AALiQjW8BAAEWwABXPRTAAFczwDsplQ0Ar47AAEGMALLrhsAAV2PAOyZKFsAAV5QUwABXgcA7KPALAIDgwABskRbAAFeuLoFMwABjZgDAAEcSPgE9HMAAV+YWwABX1y6sccAAY12sYAQABBzAAFg9asAAWARdA7LnAWEDAWADwABsGGADss/AALjijW8BAAEWwABYVRTAAFhLwDsplQ0Ar47AAEGMALLrhsAAWHvAOyZKFsAAWKwUwABYmcA7KPALAIDgwABskRbAAFjGLoFMwABjZgDAAEcSPz9JwABY/iEcwABZDYPAAFkCwDslXicBAAErAMAAbGI+AT4CTsAAWT4AAAA8XQPAAGxKAWADwABBhgEWwABZPh4AwABsLwEBXQPAAGwgAWADwABBhgGDwABZPsA7JV4APcAAbEtFAAABHMAAWT4UAMA7K2QMAD4AAAAAwABsTQA+Ak7AAFkxAAAAtY1gA8AAQYYBFsAAWUoUAMA7K2QMAEDAAGxPPgFJwABZVhzAAFmNHMAAWXcWwABZZBTAAFlawDsrwg0AsgvAAEGKrI4BAAEWwABZfS6sccAAY10AwABOoicBAAFqwABZqmADiUeFHgDAAGxePgFJwABZwhbAAFncFsAAWdUWwABZxi6sccAAY12r+cAARrqP48AAXXc+AT0cwABaCxbAAFn8LqxxwABjXaxgBAAEHMAAWl9qwABaKV0DsucBYQMBYAPAAGwYYAOyz8AAt0aNbwEAARbAAFp3FMAAWm3AOyvCDQCvjsAAQYwAsuuGwABancA7JkoWwABazhTAAFq7wDso8AsAgODAAGyR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tQAAAQPAAHASwABw2QAAAAICAsAAcBkAAACwAGADvk0AwABwLAAAALANYAO+TQAAXAE+Aj0cwABwPS6vEwEAASfAAEeeAMAAY9NJwABwYyEcwABweBbAAHBnLrqmwABjYycBAAErAMAAbDY+AT0cwABwiS6u8AEAAWrAAHCZYAPAAGNOwAEw+gDAAGJYPgE9HMAAcLYurvABAAFqwABwxmADwABjTsABMOEAwABiWAbAAGOXgUnAAHDewABw78AAcWQAAMAAR58BasAAcN9gA8AAbFaAtQAAAQPAAHEOwABxZAAAAAICAsAAcRUAAACwAGADvk0AwABxKAAAALANYAO+TQAAXAE+AT0cwABxOS6vEwEAASfAAEegAMAAY9MGwABjmIFJwABxacAAcXrAAHJkAAC4WQFqwABxamADwABsVoC1AAABA8AAcZnAAHJkAAAAAgICwABxoAAAALAAYAO+TQDAAHGzAAAAsA1gA75NAABcAT4CScAAccQhFsAAcckuie7AAGNePgE9HcAAceWwXgMAA2rAAHIHYAOy28AAfRyAwAByI8A7P76AwAByMMA7P74AwABigT89HMAAckgurvABAAFqwAByWGADwABjTsABMPoAwABiWAbAAGOZgUnAAHJpwAByesAAczoAAMAAR0wBasAAcmpgA8AAbFaAtQAAAQPAAHKOwABzOgAAAAEBAcAAcpUAAACpamADvk0AAFwBPgI9HMAAcqIurxMBAAEnwABHTQDAAGPTScAAcsQhHMAActkWwAByyC66psAAY2MnAQABKwDAAGw2PgE9HMAAcuourvABAAFqwABy+mADwABjTsABMPoAwABiWD4BPRzAAHMXLq7wAQABasAAcydgA8AAY07AATDhAMAAYlgGwABjmoFJwABzP8AAc1DAAHPdAADAAEdOAWrAAHNAYAPAAGxWgLUAAAEDwABzacAAc90AAAACAgLAAHNwAAAAqWpgA75NAMAAc3wAAADAAEdPYAPAAGxbAABcAT4CPRzAAHOULq8TAQABJ8AAR04AwABj0z0cwABzwS6u8AEAAWrAAHPRYAPAAGNOwAEw+gDAAGJYBsAAY5uBScAAc+LAAHPzwAB47gAAwABHiwFqwABz42ADwABsVoC1AAABA8AAc/7AAHjuAAAABgYGwAB0BQAAAMAAR0FgA75NAMAAdBoA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YC6sccAAY12sYAQABBzAAKDAasAAoItdA7LnAWEDAWADwABsGGADss/AALiQjW8BAAEWwACg2BTAAKDOwDtj+g8Ar47AAEGMALLrFMAAoPzAO2JHCgAWwAChKxTAAKEYwDtjqA0AgODAAGyRFsAAoUMugUzAAGNmAMAARxI+AT0cwAChdxbAAKFoLqxxwABjXaxgBAAEHMAAocpqwAChk10DsucBYQMBYAPAAGwYYAOyz8AAuOKNbwEAARbAAKHiFMAAodjAO2P6DwCvjsAAQYwAsusUwACiBsA7YkcKABbAAKI1FMAAoiLAO2OoDQCA4MAAbJEWwACiTS6BTMAAY2YAwABHEj8/PgJOwACikQAAADxdA8AAbEoBYAPAAEGGARbAAKKRHgDAAGwvAQFdA8AAbCABYAPAAEGGARTAAKKRwDtkJBAAAD3AAGxLRQAAARzAAKKRFADAO2YfEQA+AAAAAMAAbE0APgJOwACiiAAAAISiYAPAAEGGARbAAKKZFADAO2YfEQBAwABsTz4BScAAoqMcwACi1hzAAKLAFsAAoq0UwACip8A7Zn8SALILwABBiqyOAQABFsAAosYurHHAAGNdAMAATqInAQABasAAovFgA4lHhR4AwABsXj4BScAAowcWwACjIRbAAKMaFsAAowsurHHAAGNdq/nAAEa6j+PAAF13PgE9HMAAo04WwACjPy6sccAAY12sYAQABBzAAKOaasAAo2pdA7LnAWEDAWADwABsGGADss/AALfrjW8BAAEWwACjrhTAAKOowDtmfxIAr47AAEGMALLrFMAAo9LAO2JHCgAWwACkARTAAKPuwDtjqA0AgODAAGyRFsAApBkugUzAAGNmAMAARxI+AT0cwACkTRbAAKQ+LqxxwABjXaxgBAAEHMAApJtqwACkaV0DsucBYQMBYAPAAGwYYAOyz8AAuD2NbwEAARbAAKSvFMAApKnAO2Z/EgCvjsAAQYwAsusUwACk08A7YkcKABbAAKUCFMAApO/AO2OoDQCA4MAAbJEWwAClGi6BTMAAY2YAwABHEj9JwAClRCEcwAClU4bAAKVIwDthbicBAAErAMAAbGI+AT4CTsAApYQAAAA8XQPAAGxKAWADwABBhgEWwAClhB4AwABsLwEBXQPAAGwgAWADwABBhgGGwAClhMA7YW4APcAAbEtFAAABHMAApYQUAMA7aFERAD4AAAAAwABsTQA+Ak7AAKV3AAAAtY1gA8AAQYYBFsAApZAUAMA7aFERAEDAAGxPPgFJwAClnBzAAKXTHMAApb0WwAClqhTAAKWgwDtorxIAsgvAAEGKrI4BAAEWwAClwy6sccAAY10AwABOoicBAAFqwACl8GADiUeFHgDAAGxePgFJwACmCBbAAKYiFsAAphsWwACmDC6sccAAY12r+cAARrqP48AAXXc+AT0cwACmURbAAKZCLqxxwABjXaxgBAAEHMAApqVqwACmb10DsucBYQMBYAPAAGwYYAOyz8AAt0aNbwEAARbAAKa9FMAAprPAO2ivEgCvjsAAQYwAsusUwACm48A7YkcKABbAAKcUFMAApwHAO2OoDQCA4MAAbJEWwACnLi6BTMAAY2YAwABHEj4BPRzAAKdmFsAAp1curHHAAGNdrGAEAAQcwACnvGrAAKeEXQOy5wFhAwFgA8AAbBhgA7LPwAC3mI1vAQABFsAAp9QUwACnysA7aK8SAK+OwABBjACy6xTAAKf6wDtiRwoAFsAAqCsUwACoGMA7Y6gNAIDgwABskRbAAKhFLoFMwABjZgDAAEcSPz8/TsAAqIbAAKiWAAC4GmADwABsHwEWwACoo4DAAKiYwDtg3onOvlZOwACot8AAqMUAALgbYAPAAGwfARbAAKjQhMAAqMfAO2Eaic6+Vj0cwACo7xbAAKjgLqxxwABjXbqXCgAKhcAAqRHAO2FEFMAAqS/AO2KbDAAmwACpQQEUwACpQcA7YncLAGADwABsGBTAAKlPwDtiCQkAFMAAqWbAO2HZCAAmwACpeQGHwACpecA7YbVgA8AAQYaGwACpk8A7YW4UwACpp8A7amENABTAAKnAwDtiRwoAFMAAqdTAO2qHDgAAwABHGgbAAGOfgUnAAKnrwACp/MAAqsYAALFPAWrAAKnsYAPAAGxWgLUAAAEDwACqDMAAqsYAAAADAwPAAKoRAAAAilNgA8AAbB8AwACqHgAAAK8WYAO+TQDAAKowAAAArxhgA75NAABcAT4CPRzAAKpALq8TAQABJ7FQAMAAY9M9HMAAqmEurvABAAE1wACqjQAAAQBdA8AAbBkBYAPAAEGGARzAAKqNasAAqmxdA8AAYrkBYAPAAEGGwAExcK7zAgACFsAAqpEun3fAAGJSgMAAqpjAO2t/AMAAYrsjHMAAqo2DwACqjcA7a9EnAQABKwDAAGxiasAAqrRgA8AAYhrAAN7Hg8AAqo3AO2vRAWADwABsVgDAAGJYBsAAY6CBScAAqsvAAKrcwACrUgAAsVEBasAAqsxgA8AAbFaAtQAAAQPAAKr2wACrUgAAAAEBAcAAqv0AAACpamADvk0AAFwBPgI9HMAAqwourxMBAAEnsVIAwABj0z0cwACrMi6u8wEAAWrAAKtAYAPAAGIawADexwDAAGJbBsAAY6GBScAAq1fAAKtowACroAAAsAMBasAAq1hgA8AAbFaAtQAAAQPAAKt0wACroAAAAAEBAcAAq3sAAACpamADvk0AAFwBPgE9HMAAq4gurxMBAAEnsAQAwABj0wbAAGOigUnAAKulwACrtsAArFEAALCgAWrAAKumYAPAAGxWgLUAAAEDwACr08AArFEAAAABAQHAAKvaAAAAsKFgA75NAABcAT4BScAAq+YhFsAAq/oWwACr6y6sccAAY12DVsAARuc+AT0cwACsGi6wogEAAYDAAKxCwDttcQDAAFA9PwbAAGOjgUnAAKxWwACsZ8AArp0AALCkAWrAAKxXYAPAAGxWgLUAAAEDwACsccAArp0AAAACAgLAAKx4AAAArxZgA75NAMAArIoAAACwpWADvk0AAFwBPgc9HMAArJ4urxMBAAEnhHwAwABj00nAAKy2IRbAAKzKFsAArLsurHHAAGNdg1bAAEbnPgE9HMAArOousKYBAAGBwACtBMA7bgMAwABQOz9OwACtIsAArTUAALCnYAPAAGxbASEcwACtRIHAAK03wDtuAycBAAErAMAAbF5OwACtY8AArW0AAIGtXQPAAGwZAWADwABBhgEmwACtYwEcwACtby6u8wAAAADAAGJbXQPAAGwZAWADwABBhk7AAK1+wACtiQAAic5gA8AAbB8BJsAArX4BHMAArYsurvMAAAAAwABiW2ADwABsH07AAK2dwACtogAAgYhgA8AAbFYBHMAAraQurvMAAAAAwABiW0nAAK2vJcAArbgAhcAArbPAO28AYAPAAGLEPgE9HMAArdMurvABAAEUwACt2MA7bwAFAWADwABixADAAGJYPgE9HMAArfIurvABAAEcwACuBhbAAK33LqxxwABjXbprBAAEhcAArh7AO28AHMAArj0WwACuLi6sccAAY12wrAEAAYLAAK5TwDtuZQDAAEFng8AArnLAO26ShMAArofAO27QAMAARw0AwABiWAbAAGOkgUnAAK6iwACus8AAr1UAAMAAR2QBasAArqNgA8AAbFaAtQAAAQPAAK6+wACvVQAAAAEBAcAArsMAAACKU2ADwABsHwAAXAE+Aj0cwACu0C6vEwEAASfAAEdlAMAAY9M9HMAAruwurvABAAE1wACvHQAAAQBdA8AAbBkBYAPAAE5zARzAAK8dasAArvddA8AAYrkBYAPAAE5zwAExY67zAgACFsAAryEun3fAAGJSgMAAryjAO3AHAMAAYrsjHMAArx2BwACvHcA7cD8nAQABKwDAAGxiH8AArz7AAGLKAQABHMAAr02UgVoAAAAAwABsjwCBwACvHcA7cD8BYAPAAGxWAMAAYlgGwABjpYFJwACvWsAAr2vAAK/ZAACx8QFqwACvW2ADwABsVoC1AAABA8AAr4DAAK/ZAAAAAQEBwACvhwAAAKlqYAO+TQAAXAE+Aj0dwACvmrHxAQABgMAAr7DAO3ERAMAAYm49F8AAr7wuwABKNSrAAGNhBsAAY6aBScAAr97AAK/vwACwaQAAsLYBasAAr99gA8AAbFaAtQAAAQPAALAAwACwaQAAAAEBAcAAsAcAAACpamADvk0AAFwBPgI9HMAAsBQurxMBAAEnsLcAwABj0z0cwACwMy6u8AEAARzAALBHFsAAsDgurHHAAGNdum4BAAEWwACwWYDAALBTwDtxhInOvlYAwABHDwDAAGJYBsAAY6eBScAAsG7AALB/wACyNQAAsNMBasAAsG9gA8AAbFaAtQAAAQPAALCTwACyNQAAAAUFBcAAsJoAAACpamADvk0AwACwrAAAAIO+YAPAAGHlAMAAsLgAAACw1GADvk0AwACw0wAAAK8nYAO+TQDAALDpAAAArylgA75NAABcAT4CScAAsQAiIRzAALESgsAAsQTAO3I+JwEAASsAwABsXgAhFsAAsS0WwACxHi6sccAAY12DVsAARuc+AT0cwACxTS6vKwEAAYLAALFswDtyPgDAAFA8Pz0cwACxhi6u8AEAARzAALHtHMAAsbgjIRzAALGbg8AAsYzAO3JMJwEAASsAwABsXmrAALGlYAPAAGwfgNaTAWADwABsH4HVAQABIyEcwACx0YLAALHDwDtyPicBAAErAMAA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AGJbXQPAAGwZAWADwABNaE7AAM8WwADPJAAAwABKTmADwABsHwEmwADPFgEcwADPJi6u8wAAAADAAGJbYAPAAGwfTsAAzz3AAM9IAACFA2ADwABBhgEmwADPPQEcwADPSi6u8wAAAADAAGJbYAPAAEGGTsAAz2/AAM99AACwr10DwABsGQFgA8AATx8BJsAAz28BHMAAz38urvMAAAAAwABiW10DwABsGQFgA8AATx9JwADPiiEWwADPnhbAAM+PLqxxwABjXYNWwABG5z4BPRzAAM++LrCmAQABgcAAz9jAO4trAMAAUDs/PRzAAM/tLq7wAQABHMAA0AEWwADP8i6sccAAY126uQUABYTAANARwDuMA4XAANAdwDuMM4LAANAswDuLkxzAANBMFsAA0D0urHHAAGNdsKwBAAEhHMAA0GuBwADQYsA7i2snAQABKwDAAGxeAMAAQWeDwADQdcA7i9EAwABHIQDAAGJYBsAAY7eBScAA0I3AANCewADaagAAwABHUgFqwADQjmADwABsVoC1AAABA8AA0LLAANpqAAAAAwMDwADQwAAAAMAAR1NgA75NAMAA0NYAAACGSWADvk0AwADQ5AAAAK8YYAO+TQAAXAE+Cj0cwADQ9C6vEwEAASfAAEdSAMAAY9NOwADRI8AA0TgAALm2YAPAAGwYAR7AANE6wABj0gEAAYDAANFSwDuNZwBOwADRgQAAALCvXQPAAGwZAWADwABPHwBOwADRmwAAAIGIYAPAAGxWAE7AANGpAAAAic5gA8AAbB8ATsAA0cUAAADAAEpZYAPAAEGGAEnAANHWHMAA0eGBwADR2sA7jXcnAQABKwDAAGxePglOwADSD8AA0hcAAK9AXQPAAGwZAWADwABNaAEmwADSDwEcwADSGS6u8wAAAADAAGJbXQPAAGwZAWADwABNaD0cwADSJi6u8wAAAADAAGJbPYzAANJFwDuN2SbAANJFARzAANJVLq7zAAAAAMAAYltdA8AAbBkBYAPAAE8fPY7AANJiwDuOAibAANJiARzAANJvLq7zAAAAAMAAYltgA8AAbB89jcAA0nzAO43xHMAA0oMurvMAAAAAwABiW07AANKcwADSpwAAhQNgA8AAQYYBJsAA0pwBHMAA0qkurvMAAAAAwABiW2ADwABBhknAANMWJcAA0x8AhcAA0xrAO43xYAPAAGLEPgM9HMAA0zwurvMAAAAAwABiWz0cwADTZxbAANNYLqxxwABjXbo8AgACasAA06BgA8AAR0/AAQ5sJ7pAAMAARvNKwADTxAA/PRzAANPpFsAA09ourHHAAGNdujkDAAJqwADUImADwABHT8ABDoQnursBujoqwABG8j2PwADUrsA7jhMcwADUyxbAANS8LqxxwABjXbq5BQAFFMAA1NvAO48BCQArFMAA1O3AO45FCABqwADVBmADwABOm8AA4zeGwADVJMA7jgIAwABHIT4GTsAA1UvAANVQAACBl2ADwABsVgEcwADVUi6u8wAAAADAAGJbPYzAANVfwDuN2SbAANVfARzAANVvLq7zAAAAAMAAYltdA8AAbBkBYAPAAE8fPY7AANV8wDuOAibAANV8ARzAANWJLq7zAAAAAMAAYltgA8AAbB89jcAA1ZbAO43xHMAA1Z0urvMAAAAAwABiW0nAANWqJcAA1bMAhcAA1a7AO43xYAPAAGLEPgM9HMAA1dAurvMAAAAAwABiWz0cwADV+xbAANXsLqxxwABjXbo8AgACasAA1jRgA8AAR0/AAQ6EJ7pAAMAARvNKwADWXQA/ScAA1nMlwADWfAAUwADWd8A7kBoIAGADwABN4T4BPY/AANflwDuOExTAANfzwDuQGggBYAPAAE3hScAA2AYWwADYJxbAANggFsAA2BkWwADYCi6sccAAY12r+cAARrqAvsAAXXzAAEMqwABZfD4BScAA2E8lwADYWAAUwADYU8A7kBoIAGADwABBhj4BPY/AANh0wDuOExTAANiCwDuQGggBYAPAAEGGPgE9HMAA2KMurGADAANqwADYrmADstvAANaaFsAA2MyBwADYxcA7jXeJzr5WFsAA2N+BwADY2MA7jXeA4L5mAMAAY9A+AT0cwADZOy6sYAMAA2rAANlGYAOy28AA1mEWwADZaIHAANlhwDuNd4nOvlYWwADZe4HAANl0wDuNd4DgvmYAwABj0E7AANmswADZtQAAhtBdA8AAbBkBYAPAAFkgASbAANmsARzAANm3Lq7zAAAAAMAAYltdA8AAbBkBYAPAAFkgPRzAANnCLq+FAQABFsAA2dyAwADZzcA7jWeJzr5WAMAAYmM9HMAA2fwWwADZ7S6sccAAY126tQYABoPAANoRwDuNrxTAANonwDuSPQgAJsAA2jEBhcAA2jHAO43xYAPAAGwYhMAA2j/AO43Zh8AA2k7AO44ThsAA2lvAO44CAMAARyAGwABjuIFJwADab8AA2oDAAN5TAACvJQFqwADacGADwABsVoC1AAABA8AA2pHAAN5TAAAABwcHwADanwAAAK8mYAO+TQDAANq4AAAArydgA75NAMAA2tQAAACvKGADvk0AwADa6wAAAK8pYAO+TQDAANsGAAAAilNgA8AAbB8AwADbGQAAAK8WYAO+TQDAANsxAAAArxhgA75NAABcAT4KPRzAANtBLq8TAQABJ68lAMAAY9NJwADbZiIhHMAA23SCwADbasA7k1AnAQABKwDAAGxeACEWwADbjxbAANuALqxxwABjXYNWwABG5z4BPRzAANuvLq8rAQABgsAA287AO5NQAMAAUDw/TsAA2/TAANv/AAC6UV0DwABsGQFgA8AAR4gBHMAA3AEuwABKWgEAAYTAANwPwDuTbADAAGO6TsAA3CfAANwsAACBl2ADwABBhgEmwADcJwEcwADcLi7AAEpGAQABHMAA3EMurvMAAAAAwABiWwDAAGOOYAPAAEGGTsAA3FPAANxdAACwMmADwABsHwEcwADc6hzAANy9HMAA3IYjIRzAANxsgMAA3GDAO5M0JwEAASsAwABsXmrAANx2YAPAAGwfhaGTAWADwABsH4HVAQABIyEcwADcoIHAANyRwDuTQicBAAErAMAAbF5qwADcqmADwABsH4DWkwFgA8AAbB8AwABsuoHVAQABIyEcwADc0oLAANzIwDuTUCcBAAErAMAAbF5qwADc3GADwABsH4WkkwFgA8AAbB8AwABsuoHVAQABHsAA3P3AAE/SAQABNcAA3RUAAAEAYAO+TQGDwADdFcA7k14jHMAA3RUUwADdFcA7lVQJACcBAAErAMAAbF4rFsAA3SYUwADdFcA7lVQJAKlrvmcBYAPAAGwYAADAAGy6TsAA3UnAAN1SAACG0F0DwABsGQFgA8AAWSABJsAA3UkBHMAA3VQurvMAAAAAwABiW10DwABsGQFgA8AAWSA9HMAA3V8ur4UBAAEWwADddYXAAN1qwDuTfInOvlYAwABiY0nAAN2GHMAA3ZWHwADdisA7lAcnAQABKwDAAGxiSsAA3Z4AP07AAN2xwADdxgAAubZgA8AAbBgBHsAA3cjAAGPSAQAB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URTAAEVGwDvtzQIBYAOES4T9hGw+Ak7AAEVuwABFdwAAhXJgA4lVARbAAEWEFMAARXnAO+3NAgFgA4RLhMiEdUnAAEWYIRzAAEWlg8AARZzAO+5HJwEAASsAiVk+Aj2LwABFusA77kccwABF+x7AAEXglkABAAEUwABF8sA75lsAAWADiaoAg2cBAAGDwABGCsA77kcAlkdKwABH6AEcwABH7y7AAEp6wABkJgIAAoPAAEf/wDvuR4HAAEgJwDvmZwDAAGRDPz8/SsAASDEBKgbAAGREgU3AAEhGwABIS8AASOIAAMAASonAAGQmAAAAAQPAAEhRwABI4gAAAAEBAcAASFsAAACBl2ADiVUAAGADwABsWwFKwABIagEiIiXAAEhvAIDAAEhqwDvvMGADiXIBJcAASIwAgMAASIfAO+8wYAOJgAEiJcAASKcAgMAASKLAO+8wYAOJqgAewABIu8AAbPcCAAIWwABIyhTAAEjFwDvvMAABYAOJqoLTibAWwABI1S6JS8AAZDAABsAAZEWBTcAASnTAAEp5wABO/gAAwABKgcAAZCYAAAABA8AASorAAE7+AAAABQUFwABKpgAAAMAASopdA8AAbBkBYAOKJgDAAErJAAAAwABKi10DwABsGQFgA4omAMAASvUAAADAAEqMXQPAAGxfAmADiiZgA4lVAMAASycAAADAAEqNXQPAAGxfAmADiiZgA4lVAMAAS1AAAADAAEqAXQPAAGwZAWADiiYAAGADwABsWwE+A0AcwABLgBbAAEt5gMAAS3HAO+/sgODAAGxqJwEAARbAAEuLgcAAS4PAO/ADgODAAGxqAMAAbDLAAEtxwABLkQBFwABMqwHAAEy0wABMtgAAgdRgA8AAbB8BkwEcwABMvYXAAEy7wDvwt4E6AQABFsAATMeAwABMv8A77+yA4MAAbGoAwABshQGNwABM0cA78LccwABMz4XAAEzRwDvwt4E/AQABlADAAGyIPglOwABM6sAATPEAAMAASo5gA4omAR/AAEz3ikABAAEWwABNEBzAAE0MgcAATQXAO/ADKQEAAYXAAE0NwDvwtwDAAGy4gYiKKgA9HMAATTCEwABNHcA78FA2AQABhsAATTTAO/EeAMAAbEdOwABNTMAATVoAAMAASo9gA4lVAR/AAE1qihMCAAIcwABNlIHAAE2NwDvwAykB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FrJigrJcwDw3s44HwABkncAASp0CAAKBsnjAPDeng7KAwDw3xwDAAGSRPRyyji7AAErLAgACgbKZwDw3p4SyocA8N/AAwABlLj0csrgWsq8ukEHAAGUswABC0QMAA4CywMA8N5mBssjAPDengrLQwDw3swDAAGSjPRyy3C7AAErLAgACgbLnwDw3p4Oy78A8N8cAwABlLgAAPDasADw3dwA8OJsAAAACAsAAZTSBULPZs9+3doPAAErOAAIAAAST32ADwABsVgFbAAAEgS9gA8AAbFYBWwFdA8AAZKABXQPAAGTwAl8DAABfAwEAAAACBMAAZTaBULQrtDIJttcAXQPAAGSgAV8DAAAABMAAZTeBULROtFIJwABKzwBdA8AAZKABXwMBAAABBcAAZTyBULRXtF20egEAAAO0YbR6AAAAAgICtGcAAAS2110DwABkoAFfAwAAALR1AAAEwABKz10DwABkoAFfAwEAAABdA8AAZTQCXwMAAF8DAQABPwMIAcAAZTaAAMA8OUgIAcAAZTeBAMA8OVsJAbRdwABkpwAAAAACBsAAZTmBULR/tIy2AQAAwABCzwAAAAEDtJS2AQAAAAICArSmAAAAswldA8AAbEoBYAPAAGxWALTDAAAAlLpgA8AAZJUAAF0DwABk8AJfAwAAXwMBAAE+BU601LThAADAAErQYAPAAGSVAR+058AAZJoCAAIftQnAAGSIAQFgA4JKARa1KoG1JMA8Od+OB8AAZJcAFrU+gbU4wDw534bSwABkmABOtU+1VQAAgWlfAwAAARy1Xxa1Vy6218AAZTbAAELPAgACgLVowDw5yoK1cMA8OgEAwABkoj0ctZwWtZCCtYPAPDoBjgfAAGSXSQAAAADAAGSGTrWrtbIAAIL6XwMBAAEctbkWtbQuwABKz8AAZTfAAELPAgACgLXCwDw5yoK1ysA8OgEAwABkokq13QEftejAAGT1AgJfAwAAXwMBAAKDte/APDpNhLX2wDw6nwAGwABlOoFQtga2C7d0AADAAELRAAAAAQO2Erd0AAAAAwMDticAAACClmADwABtBgC2PAAAIMAAStFdA8AAZPACXwMAAF8DAQAAtlYAAACUumADwABkmwAAXAE+BU62Z7Z0AADAAErQYAPAAGSbAR+2gsAAZJ8BAAEftpnAAGSUAQFgA4JKARa2uIK2ssA8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GAFKkKkBJ7PtAAA8UWAAPFGxADxR7AA8UicAPFJiADxSnQA8UtgAPFMTADxTTgA8U5YAPFPTADxUEAA8VEsAPFSGADxUwQA8VPwAPFU3ADxVcgA8Va0APFXoADxWQAA8VpgAPFbwADxXKwA8V2gAPFelADxX4gA8WB8APFhcADxYmQA8WNYAPFkTADxZUAA8WY0APFnKADxaBwA8WmEAPFqgADxa+gA8WzUAAAAnAsAAZmSBUsAASF7AAEhkwABL7IPAAEsCAAABXQPAAGSgAWADmR8AAAEEwABmZoFSwABIusAASMoGwABLAwBgA8AAbBgBasAASMZgA8AAbBizEAEFwABmbIFSwABIz8AASNXAAEjuAQAAA8AASOzAAEjuAAAAAAAAAGADwABmZAE/AQkBwABI1cAAZKcAAAAAAwbAAGZogVLAAEjzwABI/8AASeUAAYbvAAAAAQPAAEkIwABJ5QAAAAICAsAASRcAAACBiGADmR8AwABJKgAAAIKWYAPAAG0GAABcAT4BScAASTghFsAASUKAwABJPcA8XJWHspkqPgJJwABJUiEWwABJYxbAAElcgMAASVfAPFyVhACZKYeymSo+Aj0ewABJdcAAZmgCAAIWwABJhIDAAEl/wDxclYQAmSmBwABJjMA8XKMAPRzAAEmkgcAASZ3APFyjRQEAAWrAAEmqYAPAAGwYsxAAwABtLj89HMAAScuBwABJxMA8XKNFAQABFsAASdaAwABJ0cA8XJWBiJklAMAAbS4/BsAAZmmBUsAASerAAEn4wABLCQAAwABCzwAAAAEDwABKAMAASwkAAAACAgLAAEoSAAAAswldA8AAbEoBYAPAAGxWAMAASi8AAACUumADwABklQAAYAOZHwE+BE7AAEpDwABKSgAAh31gA8AAbBgBHMAASl9qwABKUmADwABksMABMcTAAELPAgACgMAASmjAPF2bgcAASnDAPF2yAMAAZLJOwABKisAASo8AAIGIYAOZHwEWwABKl4HAAEqRwDxdsobSwABkmD4CTsAASr0AAAA8XQPAAGxKAWADwABsGAEWwABKvR4AwABsLwEBXQPAAGwgAWADwABsGAEcwABKvYLAAEq2wDxdy4dDAQABasAASsNgA8AAbBizEADAAG08AD3AAGxLRQAAARzAAEq9hADAPF45PgAAAADAAGxNAD4C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7gE+AUrAAKopAR/AAKo0hQoHAAEWwACqThbAAKpHgMAAqkHAPOrwgvrAAGTzgvrAAGTzBoNjFsAAqngWwACqcoDAAKpswDzq8IFpwABk8oFpwABk8oRwHMAAqr4WwACquBbAAKqxFsAAqquAwACqpcA86vCBacAAZPKC+sAAZPOBacAAZQKBPwEAARbAAKrTFsAAqswWwACqxoDAAKrAwDzq8IFpwABk8oL6wABk84L6wABlAwDAAG6zhHEWwACrBRbAAKr+FsAAqviAwACq8sA86vCBacAAZPKC+sAAZPPAAErAwABlBITlFsAAq0MWwACrPRbAAKs2FsAAqzCAwACrKsA86vCBacAAZPKC+sAAZPOBacAAZQKA4MAAbGqFAxbAAKtqFsAAq2OAwACrXcA86vCC+sAAZPOBacAAZPKFGmrAAKuQYAOFC4baBsAAZi6BUsAArAfAAKwMwAC3tAABwABCwAAAAAEDwACsIcAAt7QAAAAAAAAAXAE+CD0cwACsQhbAAKw9GsAArCjAAGWTwABKr8AAZMuBNAEAATHAAKxJYAPAAGwYLCeHfSeIbyeIcSeIbieVdyeaaCewwCeH9SeH9ifAAErsJ8AASu0nlXMnlXQnlXUnlXYnnoInlW0nlPIngZcngzUnwABK7ieN0CfAAErvJ4KhJ8AASvAnlXgnwABK8SfAAEryJ8AASvMnwABK9CfAAEr1J8AASvYnwABK9yfAAEr4J8AASvknwABK+ifAAEr7J8AASvwnwABK/ifAAEr9J8AASv8nwABLASfAAEsAJ7PtAMAAbQU9HMAArysWwACvHxrAAK8KwABlk8AASrDAAGTMgTQBAAExwACvMl0DwABkoAFgA4UaLBrAAK84wABlbBrAAK9VwABlbRrAAK9vwABlbhrAAK+MwABlbxrAAK+nwABlcBrAAK/CwABlZxrAAK/jwABlaBrAAK/2wABlaRrAALAQwABlahrAALApwABlaxrAALBMwABlcRrAALBpwABlchrAALCHwABlcxrAALCewABldBrAALCzwABldRrAALDSwABldhrAALD3wABldxrAALETwABleBrAALEvwABleRrAALFKwABlehrAALFlwABlexrAALGFwABlfBrAALGfwABlfRrAALG+wABlfhrAALHYwABlfxrAALH3wABlgBrAALIKwABlgRrAALIlwABlghrAALJAwABlgxrAALJgwABlhBrAALKAwABlhRrAALKgwABlhhrAALLFwABlhxrAALLgwABliBrAALL7wABliRrAALMUwABlihrAALMtwABlixrAALNOwABljBrAALNvwABljRrAALOPwABljhrAALO0wABljxrAALPawABlkBrAALP/wABlkRrAALQpwABlkgDAAG0FPRzAALRnFsAAtGIawAC0T8AAZaPAAEqvwABky4E0AQABMcAAtG5gA8AAbBgGJ5poJ5WbJ5WcJ8AASwknwABKbyfAAEsKAMAAbQU9HMAAtOQWwAC02BrAALTFwABlo8AASrDAAGTMgTQBAAExwAC0610DwABkoAFgA4lVBhrAALTxwABlnBrAALUMwABlnRrAALUnwABlnhrAALU/wABlnxrAALVZwABloBrAALV1wABlogDAAG0FPRzAALWzFsAAta4awAC1msAAZabAAEqvwABky4E0AQABMcAAtbpgA8AAbBgCJ4veJ7T5AMAAbQU9HMAAtfsWwAC17xrAALXbwABlpsAASrDAAGTMgTQBAAExwAC2Al0DwABkoAFgA4f4AhrAALYIwABlpBrAALYrwABlpQDAAG0FPRzAALZqFsAAtmUawAC2TsAAZazAAEqvwABky4E0AQABMcAAtnFgA8AAbBgFJ5UTJ5UVJ8AASw4nwABLDSfAAEsPAMAAbQU9HMAAtu8WwAC24xrAALbMwABlrMAASrDAAGTMgTQBAAExwAC29l0DwABkoAFgA4TuBRrAALb8wABlpxrAALccwABlqBrAALc9wABlqRrAALdhwABlqhrAALeGwABlqwDAAG0FAYFSADzxVgA8T6QAPFBCADxRAQA8W9oAPGALADxhpwA8ZFwAPGXXADxnaQAAAAgAPKE7ADyhgwA8oc0APKJdADyiuAA8owIAPKNOADyjlAA8o9wAPKRQADykwwA8pTYAPKWFADyl1gA8ph4APKZoADymsAA8pvoAPKdCADynjAA8p9QAPKgeADyoUQA8qI8APKjXADypIQA8qVQAPKmSADypxQA8qgMAPKpJADyqkQA8qtcAPKsfADyrvwA8rFsAPKzPADytPwA8rbMAPK4jADyuaQA8rrEAPK8zADyvrwA8sCsAPLCtADyxKQA8saUAPLPvADy2GgA8uEUAPLi5ADy5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ALqJYAPAAE8fAABgA8AAbBgBPgNOwABICMAASA0AAIGIYAPAAGwYARbAAEgcgMAASA/APUMugYjAAEGsScAASCQhHMAASDsWwABINYDAAEgowD1DLoU5wABPIScBAAErAMAAbF4+AUrAAEhKASTAAEiJA4HAAEhTwD1DSSeuhh7AAEhiwABm0QEAARbAAEiBgMAASHTAPUMuhTnAAE8hAD9KwABIkQGBwABImMA9Q0kGwABm04FXwABI6cAASPDAAEm6AAHAAEwbAAAAAQPAAEj8wABJugAAAAIBAcAASRQAAACRH10DwABsGQFgA7L+AAHAAEkiAAAAwABMHGADwABsWwFqwABJLGADwABsWxxgA8AAbBgBPgFJwABJOIHAAEk8wD1EJj4BSsAASUwBHMAASW0cwABJWoDAAElTwD1EEIKhAQFdA7LEAVsBNMAASV4DwABJXsAASWsAAAABAQHAAElfAAAAgQVgA7L+AABdA7LEAVsBSsAASWUBFsAASWeCwABJZcA9RJWLcrMHAMAAbOuGvAEAASeO8QDAAG0vPgFKwABJhwEcwABJqxzAAEmVgMAASY7APUQQgqEBAWADwABsGAE0wABJmQPAAEmZwABJqQAAAAEBAcAASZoAAACBBWADsv4AAGADwABsGAFKwABJoAEWwABJooLAAEmgwD1FD4CWswgAwABs64a8AQABJ47xAMAAbS8GwABm1IFXwABKCcAAShDAAE2YAAHAAEwdAAAAAQPAAEovwABNmAAAAAEBAcAASkoAAACIAWADg58AAGADwABsGAE+CU7AAEpnwABKagAAg5xgA8AAbQYBH8AASnDAAG0MAAAAAEnAAEqCFsAASpGAwABKhsA9RXuDvYOnPgE9HMAASqSBwABKocA9RZRFAQABJ8AATB4AwABtLj9BR8AASrwWwABKz4DAAErEwD1Fe4O+g6MGAcAASvRqwABK9GADg4+FzAA+AULAAEsCAAHAAEsmasAASyZgA4OPhdsAPgI9HMAASzeBwABLNMA9RZRFAQABJ8AATB8AwABtLkLAAEtPAAHAAEtzasAAS3NgA4OPhesAPgI9HMAAS4SBwABLgcA9RZRFAQABJ8AATCAAwABtLkLAAEucAAHAAEvAasAAS8BgA4OPhfsAPgI9HMAAS9OBwABL0MA9RZRFAQABJ8AATCEAwABtLkLAAEvtAAHAAEwRasAATBFgA4OPhb0APgI9HMAATCGBwABMHsA9RZRFAQABJ8AATCIAwABtLkLAAEw4AAHAAExcasAATFxgA4OPhgsAPgI9HMAATG6BwABMa8A9RZRFAQABJ8AATCMAwABtLkLAAEyHAD0cwABMl4HAAEyUwD1FlEUBAAEWwABMrRbAAEyogMAATJ3APUV7gYiDooGIiSIAwABtLj0cwABMuYHAAEy2wD1FlEUBAAEnSADAAG0uTsAATM7AAEzVAACERGADg6wBFsAATOkWwABM4oDAAEzXwD1Fe4REg6WEIIKHTsAATPzAAE0BAACBiGADwABsGAEWwABNDxbAAE0KgsAATQPAPUd5gYiDsIGIiSJJwABNFyIlwABNIgCCwABNG8A9R3lgA4RLABbAAE05FMAATTLAPUd5AgFgA4RLg3+EbT4BPRzAAE1MgcAATUnAPUWURQEAASTAAE1aAoPAAE1UwD1HpidIAMAAbS4+AT0cwABNb4HAAE1swD1FlEUBAAGDwABNdcA9R6YAwABtLkrAAE2CARzAAE2MgcAATYnAPUWUgVMAAAAAwABtEAbAAGbVgVfAAE3owABN78AAUi4AAcAATCQAAAABA8AATgDAAFIuAAAAAgICwABOEgAAAINlYAOJRwDAAE4yAAAAwABL6mADwABm1gAAYAPAAGwYAT4CQUfAAE5KgMAATlLAPUieBAHAAE52asAATnZgA4lHhS0APgJHwABOiYHAAE6RwD1IrAIDwABOx2rAAE7HYAPAAGbWwAE008AATvFqwABO8WADwABm1sABNLrAAE8ZasAATxlgA8AAZtbAATTsAD4BSsAATzkBJ5VYAcAAT2VqwABPZWADwABm1sABNQYAPgFKwABPhQEnAELAAE+eAAHAAE+6asAAT7pgA4lHhR4APgFKwABPygEnjdgBwABP62rAAE/rYAOJR4cDAD4CR8AAT/+BwABQB8A9SKwCAcAAUD1qwABQPWADwABm1sABNOwAPgFKwABQXQEnAAABPgFKwABQgwEngf1CwABQnQABwABQuWrAAFC5YAOJR4TlAD4CR8AAUMeBwABQz8A9SKwCAcAAUQVqwABRBWADwABm1sABNLoAPgFKwABRFwEnAAPAAFFCasAAUUJgA8AAZtbAATTTwABRbGrAAFFsYAPAAGbWwAE1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wABBdMA9ZS8AAWADiaoWwABBhRbAAEF7LoCQwABnEokojdgAFsAAQa0UwABBp8A9ZTsBAWADiaqDZYmtADHAAEHTYAOJVQEcwABB5S7AAEP8AwADHMAAQg4WwABCARTAAEH7wD1lLwABYAOJqoNzia4pAQABkwDAAGy4HMAAQjoWwABCLRTAAEInwD1lOwEBYAOJqoNzia4pAQABkwDAAGy4gsAAQj/APWVHAMAAZxkAPz9KwABCogEcwABCqS7AAEP8AwADHMAAQt0WwABC0BTAAELKwD1lLwABYAOJqoNzia4pAQABkwDAAGy4gcAAQuLAPWU7gsAAQunAPWVHAMAAZxk/ScAAREwiJcAARFYAgcAARFDAPWU7YAOJqgAcwABEehbAAERwFMAARGrAPWU7AQFgA4mqgtOJsCcBAAEWwABEhxbAAER9LoCQwABnEokojdgAwABsXj4CScAARJ4iJcAARKgAgMAARKLAPWUvYAOJqgAcwABEzBbAAETCFMAARLzAPWUvAAFgA4mqgtOJsCcBAAEWwABE2RbAAETPLoCQwABnEoknjdcAwABsXj4BSsAARSwBH8AARTeJvAMAAxbAAEVcFsAARVIugJDAAGcSiSeN1x7AAEV1luECAAIWwABFkhTAAEWMwD1lLwABYAOJqoNlia0ewABFr5biAgACFMAARczAPWU7AQFgA4mqFsAARd0WwABF0y6AkMAAZxKJKI3YAAAxwABGBGADiVUBHMAARhQuwABD/AMAAxzAAEZQFsAARkMUwABGPcA9ZTsBAWADiaqDc4muKQEAAZMAwABsuBzAAEZoFsAARlsUwABGVcA9ZS8AAWADiaqDc4muKQEAAZMAwABsuILAAEZtwD1lRwDAAGcZAD9KwABGxAEcwABGyy7AAEP8AwADHMAARv8WwABG8hTAAEbswD1lOwEBYAOJqoNzia4pAQABkwDAAGy4gMAARwTAPWUvgsAARwvAPWVHAMAAZxk/SsAAR2ABasAAR21gA4mchjgGwABnHIElwABIpMAASK3AAEnoAADAAEAUAAAAAQPAAEjCwABJ6AAAAAMDA8AASNMAAACC3WADiVUAwABI4wAAAILeYAOJVQDAAEjyAAAAgt9gA4KSAABgA4lVAT4CScAASQcWwABJGYLAAEkLwD1tKoNWgq8+AUrAAEk5ARzAAElALsAARAUDAAOAwABJZsA9bQ6BwABJbcA9bRyCwABJdMA9bSoAwABnHT9KwABJjgEcwABJlS7AAEQGAwADgMAAScjAPW0OgcAASc/APW0cgsAASdbAPW0qAMAAZyYGwABnHYElwABJ7cAASfbAAGRHAADAAEQFAAAAAQPAAEobwABkRwAAAAMDA8AASiwAAACC3WADiVUAwABKPAAAAILeYAOJVQDAAEpLAAAAgt9gA4KSAABgA4lVAT4QScAASnQewABKeMAAbPcCAAKAwABKgsA9beyBwABKicA9bfoASsAASpEBgMAASpjAPW3sP0nAAErWJcAASuAAgMAAStrAPW3sYAPAAFj8SsAASvABgcAASvfAPW36P0nAAEsCJcAASwwAgcAASwbAPW36YAPAAFj8SsAASxwBgMAASyPAPW3sP0nAAEvWHMAAS+QWwABL2i6AkMAAZxKJwgEAAYDAAEvqwD1t7ACOZD4CScAAS/ocwABMCBbAAEv+LoCQwABnEonCAQABgcAATA7APW36AI5kSsAATBYBIxzAAEwdLsAAQ/YCAAKAwABMJcA9beyBwABMLMA9bfoAwABnF4DAAEw1wD1t7IHAAEw9wD1t+gFgA4lVP0rAAExKAYDAAExRwD1t7EnAAExjHMAATHEWwABMZy6AkMAAZxKJwgEAAYHAAEx3wD1t+gCOZD4BSsAATIcBgcAATI7APW36P0nAAE1WHMAATWQWwABNWi6AkMAAZxKJxQEAAYDAAE1twD1t7ACOZj4CScAATX0cwABNixbAAE2BLoCQwABnEonFAQABgcAATZTAPW36AI5mPgFKwABNpgEjHMAATa0uwABD+gIAAoDAAE24wD1t7IHAAE2/wD1t+gDAAGcYgcAATcjAPW36gMAATdDAPW3sAWADiVU/SsAATeUBgcAATezAPW36ScAATf4cwABODBbAAE4CLoCQwABnEonFAQABgcAAThXAPW36AI5mPgFKwABOJQGAwABOLMA9bew/ScAAT1YcwABPZBbAAE9aLoCQwABnEonGAQABgMAAT2vAPW3sAI5nPgJJwABPexzAAE+JFsAAT38ugJDAAGcSicYBAAGBwABPkMA9bfoAjmc+AUrAAE+iASMcwABPqS7AAEP6AgACgMAAT7TAPW3sgcAAT7vAPW36AMAAZxiBwABPxMA9bfqAwABP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iV0AAIlaP0nAAF6pIiXAAF6zAIDAAF6twD1t7GADiaoAJcAAXs0AgcAAXsfAPW36YAOJqj4CTsAAXu3AAF7zAACJvWADgzIBFsAAXvsUwABe9cA9bewAAWADiaqC04mwScAAXwwcwABfIBbAAF8WFMAAXxDAPW36AQFgA4mqgtOJsCcBAAGDwABfI8A9eCcAwABsXj4GTsAAXzjAAF86AACB0mADwABsHwEWwABfURbAAF9Cg8AAXzzAPXgng2ODQoDgwABsak7AAF9wwABffgAAwABEC10DwABsGQFgA4lVARbAAF+GFMAAX4DAPW3sAAFgA4mqg3OJrk7AAF+swABfuwAAwABEDF0DwABsGQFgA4lVARbAAF/DFMAAX73APW36AQFgA4mqg3OJrk7AAF/pwABf9wAAg3NdA8AAbBkBYAOJVQEewABf/cAAbPwBAWADiVUBhMAAYAzAPXiHAEXAAGAYAcAAYCHAAGAjAACB1GADwABsHwGTARzAAGAqFMAAYCjAPXlWCACBOgEAAYTAAGAswD14hwDAAGyFARXAAGAxwD15VggcwABgLxTAAGAxwD15VggAgT8BAAGUAMAAbIg+Ak7AAGBEwABgTQAAhodgA8AAbB8BFsAAYGccwABgYxbAAGBVg8AAYE/APXgng2ODQikBAAEUwABgZMA9eVYIAADAAGy4hoeKMknAAGB7HMAAYIgUwABgf8A9ebcJACcBAAFqwABglGADwABsH4UEAMAAbDI+AT0cwABgvofAAGCxwD15HoCcAgACFMAAYL/APXlWCAAcwABgxC7AAEP9AwADHMAAYQiFwABg+8A9eLgpAQABFMAAYQnAPXlWCAAAwABsuBzAAGEbhsAAYQ3APXjrKQEAARTAAGEcwD15VggAAMAAbLiCwABhIMA9bggAwABnGgDAAGzLScAAYUEcwABhThTAAGFFwD15twkAJwEAAWrAAGFaYAPAAGwfhOAAwABsMj4BScAAYXMhHMAAYXguwABD9QMAAxzAAGGXhcAAYYrAPXi4KQEAARTAAGGYwD15VggAAMAAbLgcwABhqobAAGGcwD146ykBAAEUwABhq8A9eVYIAADAAGy4asAAYdBgA5r0svAAwABnFT4BSsAAYfQBHMAAYfsugtwDAAMUwABiFMA9bewAAWADiaoUwABiG8A9bfoBAWADiaqC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Eomcji4/ScAAp4giJcAAp5IAgMAAp4zAPaHVYAOJqgAlwACnrACBwACnpsA9oeNgA4mqPgFKwACnxgEcwACnzS7AAEQXwABnDwMAAxTAAKftwD2h1QABYAOJqhTAAKf0wD2h4wEBYAOJqoLAAKf7wD2h8QDAAGckP0nAAKgWIiXAAKggAIDAAKgawD2h1WADib4AJcAAqDkAgcAAqDPAPaHjYAOJvj4BSsAAqFIBHMAAqFkuwABEGMAAZw8DAAMUwACol8A9odUAAWADib4UwAConsA9oeMBAWADib6CwACopcA9ofEAwABnIz9JwACowCIlwACoygCAwACoxMA9odVgA4lkASXAAKjiAIHAAKjcwD2h42ADiWQ+AUrAAKj6AWrAAKkHYAOJZMAA3M0/QCrAAKl1wACpegEkwACpnAQnwABEGYDAAKmGwD2h1SfAAEQagcAAqZbAPaHjSsAAqaMBasAAqbBgA4lyhbEGwABnIoElwACsncAArKbAALiUAADAAEQEwABnDwAAAAEDwACs2MAAuJQAAAADAwPAAKztAAAAgflgA4m+AMAArP0AAACCVWADib4AwACtCAAAAILfYAOCkgAAYAOJVQE+C07AAK3/wACuDwAAwABEG2ADwABsHwEewACuGcAAbRICAWADwABsHwIWwACuORbAAK4kgMAAriLAPadBhHCJwoDgwABsahbAAK5YFsAArkOBwACuQcA9p0+EcInCgODAAGxqAE7AAK50wACuiQAAhHBdA8AAbBkBYAOJVQEewACuj8AAbPwBAWADiVUBg8AArp7APad0AEXAAK60AcAArr3AAK6/AACB1GADwABsHwGTARzAAK7GhcAArsTAPagPgToBAAGDwACuyMA9p3QAwABshQGNwACu2cA9qA8cwACu2oXAAK7ZwD2oD4E/AQABlADAAGyIPgFJwACu5hzAAK7shcAArurAPagPgToBAAEWwACvBRbAAK7wgMAAru7APadBhHCJwoDgwABsagDAAGyFPgJOwACvIMAAryYAAMAARBxgA4lVARzAAK8+FsAAryqAwACvKMA9p0GEcInCKQEAAYXAAK8/wD2oDwDAAGy4ScAAr0scwACvUYXAAK9PwD2oD4E6AQABFsAAr2oWwACvVYHAAK9TwD2nT4RwicKA4MAAbGoAwABshT4CTsAAr4fAAK+NAADAAEQdYAOJVQEcwACvpRbAAK+RgcAAr4/APadPhHCJwikBAAGFwACvpsA9qA8AwABsuD0cwACvyITAAK+0wD2n14CcAgAChcAAr8nAPagPHMAAr9wuwABAFAMAA4bAAK/ywD2op4fAAK/5wD2pIILAALAAwD2nXQDAAGccAMAAbMs+AT0cwACwP4TAALArwD2n14CcAgAChcAAsEDAPagPhsAAsEXAPainAMAAbMs+AT0cwACwgYTAALBtwD2n14CcAgAChcAAsILAPagPHMAAsJ0WwACwiYHAALCHwD2nT4RwicIpAQABhcAAsJ7APagPAMAAbLgAwABsy07AALFdwACxdAAAhOVgA8AAbB8BHsAAsX7AAG4iAgFgA8AAbB8CFsAAsYmAwACxh8A9p0GE5YnBFsAAsaOBwACxocA9p0+E5YnBAE7AALHFwACx0wAAwABEHmADwABsWwEcwACx7IXAALHVwD2qJoE6AQABg8AAse7APad0AMAAbIVOwACyQMAAslAAAIRxXQPAAGwZAWADie4BMcAAslJgA4nuAD4DTsAAsmbAALJoAACB1GADwABsHwGTTsAAsnfAALJ5AACC/GADwABsHwGTQUPAALKEKT4BScAAspscwACyoRTAALKfwD2qzQgAgToBAAEWwACytRbAALKlgMAAsqPAPadBhHGJw4DgwABsagDAAGyFPgFJwACyyRzAALLPFMAAss3APariCQCBOgEAARbAALLjFsAAstOBwACy0cA9p0+EcYnDgODAAGxqAMAAbIU+BE7AALMAwACzBgAAwABEH2ADwABsGAEWwACzHRzAALMZFsAAswqAwACzCMA9p0GEcYnDKQEAARTAALMawD2qzQgAAMAAbLiBiInxTsAAszbAALM8AADAAEQgYAPAAGwYARbAALNTHMAAs08WwACzQIHAALM+wD2nT4RxicMpAQABFMAAs1DAPariCQAAwABsuIGIifFOwACzacAAs28AAJ38YAPAAGwfARzAALN3FMAAs3HAPat8CgCApAEAARTAALOBwD2rxgsAAMAAbGdJwACzlRzAALOfFMAAs5nAPawQDACBOgEAAZMAwABshT4BPRzAALPEh8AAs7TAPaqoNgEAARzAALPZFsAAs8qAwACzyMA9p0GEcYnDKQEAATXAALPaAAABAGADwABsHwEUwACz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umWBPwEAAZQAwABsiD4BScAAzR8cwADNNxbAAM0uHMAAzSqFwADNI8A9uWQpAQABh8AAzSvAPbplAMAAbLiGh4oyJwEAAWrAAM1DYAPAAGwfhQQAwABsMj4BPRzAAM1jhsAAzV7APboggJwCAAKHwADNZMA9umUcwADNaS7AAEP8AwADHMAAzYWDwADNf8A9uP4pAQABh8AAzYbAPbplAMAAbLgcwADNkITAAM2KwD25MSkBAAGHwADNkcA9umUAwABsuILAAM2VwD238QDAAGcZAMAAbMtJwADNtBzAAM3MFsAAzcMcwADNv4XAAM24wD25ZCkBAAGHwADNwMA9umUAwABsuIaHijInAQABasAAzdhgA8AAbB+E4ADAAGwyPgJJwADN7yEcwADN9C7AAEP1AwADHMAAzhuDwADOFcA9uP4pAQABh8AAzhzAPbplAMAAbLgcwADOJoTAAM4gwD25MSkBAAGHwADOJ8A9umUAwABsuGrAAM48YAOa9InSAMAAZxU+AUrAAM6sARzAAM6zLoLcAwADFMAAzszAPbfVAAFgA4mqFMAAztPAPbfjAQFgA4mqgsAAztrAPbfxAMAAZxY/PRzAAM9whsAAz2vAPboggJwCAAKHwADPccA9umUcwADPfIPAAM92wD24/ikBAAGHwADPfcA9umUAwABsuADAAGzLPgE9HMAAz6GGwADPnMA9uiCAnAIAAofAAM+iwD26ZRzAAM+nLsAAQBQDAAMcwADPw4PAAM+9wD24/ikBAAGHwADPxMA9umUAwABsuBzAAM/OhMAAz8jAPbkxKQEAAYfAAM/PwD26ZQDAAGy4gsAAz9PAPbfxAMAAZxwAwABsy0rAAM/7AR/AANAGibwDAAMWwADQGhTAANAUwD231QABYAOJqoLTibAewADQL5bgAgACFsAA0EgUwADQQsA9t9UAAWADiaqDZYmtFsAA0FsUwADQVcA9t+MBAWADiaqDZYmtAIbAANBpwD26IAA/SsAA0HsBHMAA0IIugtwDAAOAwADQm8A9t9WBwADQosA9t+OCwADQqcA9t/EAwABnFgbAAGclgSXAANDAwADQycAA3X0AAMAARBbAAGcPAAAAAQPAANEAwADdfQAAAAMDA8AA0REAAACC3WADiVUAwADRIQAAAILeYAOJVQDAANEwAAAAgt9gA4KSAABgA4lV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wABAiQEAAYLAAERAwD3icADAAGdAAJZHTsAARFYAAADAAExAYAODrABJwABEZyIlwABEcgCCwABEa8A94nBgA4RLABbAAESJFMAARILAPeJwAgFgA4RLhPKEZD4BPRXAAESjwD3oiQkWwABEuBTAAESxwD3icAIBYAOES4T2hHQ+AT0VwABE6sA96IkJgsAARPjAPeJwTsAARRQAAACyTWADhEsAScAARSchHMAARU4WwABFOBbAAEUrLqyEwABnLbgZwABDDScBAAErAMAAbF4+AUnAAEVfHMAARWgWwABFYy6DvsAAZy8nAQABasAARXlgA4SShQkAwABsXj4BPRXAAEWLwD3pBwocwABFyhbAAEW0FsAARacurITAAGctuBnAAEMNlmoBAAEWwABF5RbAAEXgLoGIwABnM4GIiSIAnF0+AT0VwABGA8A96QcKHMAARkMWwABGIBbAAEYTLqyEwABnLbgZwABDDZZpAQABFsAARmEWwABGXC6BiMAAZzOBiIkiAJxcP0rAAEZ6ATXAAEaFAAABAGADhEsBH8AARoWEjwkAAxbAAEaPLoGIwABnMxbAAEaVLoO+wABnLxTAAEabwD3n+ggABoM0KYTyIYPAAEbawD3ifYT0g8AARwnAPeJ9g20WwABHPRbAAEcuLoMzwABnNINtg0GE9hTAAEdtwD3oiQkAhAw1wABHjQAAAQBgA4RLARTAAEeNwD3pBwoAIxzAAEeNFMAAR43APep9CwAnAQABKwDAAGxeKxbAAEecFMAAR43APep9CwCEDIJqAWADgn41wABHrwAAAQBcARfAAEevFMAARoXAPeoBCwCEhhbAAEfQFsAAR8EugzPAAGc0hAGCWYRNNcAAR+MAAAEAXAEXwABH4xTAAEaFwD3qAQsAhAEWwABH/xbAAEfwLoMzwABnNIQBglmCWTXAAEgSAAABAFwBF8AASBIUwABGhcA96gELAIQAFsAASBsugzPAAGc0glg1wABIMgAAAQBcARfAAEgyFMAARoXAPeoBCwCDVhbAAEh1FsAASGQWwABIVS6DM8AAZzSDiYNlg1aCr4SDFMAARoXAPeoBCwAGwABnPYFYwABI4sAASOnAAEl1AADAAEwrAAAAAQPAAEj3wABJdQAAAAEBAcAASPwAAACB1GADwABsHwAAYAODrAE+A07AAEkRwABJGwAAgqhgA8AAWb8BHMAASSgWwABJHS7AAEwmwABnKcAAZzEpAQABgMAASSnAPevRAMAAbLhAISXAAElCAIHAAEk4wD3r6mADwABah8AASTjAAElTAErAAElaARbAAElrgcAASWHAPevqhETAAFnIBsAAZzuBWMAASXrAAEmIwABLtAABjHfAAGcpAAAAAQPAAEmlwABLtAAAAAEBAcAASbAAAADAAExBYAOESwAAYAODrAE+A07AAEoxwABKNgAAhPhgA4inASbAAEoxARbAAEpQFsAASkeAwABKOMA97I6Ex4RQhPiFBmADiKdOwABKZcAASnAAAIV+YAOFGgEWwABKd4HAAEpywD3sp4V+iKlJwABKhyXAAEqWAILAAEqLwD3s3mADhhc+AUrAAEq4ARbAAErKFMAASr/APezeAgFgA4YXgxuGHUnAAErmJcAASvUAgsAASurAPezeYAOFsT4BSsAASxIBFsAASyQUwABLGcA97N4CAWADhbGDG4W3PgFKwABLSAEmwABLSAUewABLT7U9BAAEJMAAS3QBFsAAS2eCwABLXMA97N6FTsAAbS0njHccwABLoZSBWgAAAADAAGyPKwBgA4OsBsAAZzyBWMAAS7nAAEvGwABPqgAAwABMLMAAZykAAAABA8AAS9bAAE+qAAAAAwMDwABL8gAAAMAATCldA8AAbBkBYAOKJgDAAEwNAAAAgqhgA4OsAMAATB4AAACC22ADgzIAAGADljgBPgNOwABMOcAATEYAAIPNYAOWOAEewABMVZZAAQABHMAATHoWwABMcC6BFsAAZyzAAELnAwADHMAATMYWwABMqxbAAEyhLoEWwABnLICQwABZ3ISrAgACgsAATNjAPe4RFsAATPgWwABM54LAAEzgwD3uEYOJg2WEPoKxAI5hFsAATRyBwABNEsA97gODM4O0FsAATT+CwABNOMA97hGDiYNlAMAAWeMAScAATVchHMAATW6AwABNW8A97ewnAQABKwDAAGxiPgNOwABOGcAATh0AAIKhXQPAAGxfAmADiiZgA4n+ATLAAE4fYAOKJmADif4ARcAATikBwABOMsAATjQAAIHUYAPAAGwfAZMBHMAATjuFwABOOcA97x6BOgEAARbAAE5QgMAATj3APe3sgODAAGxqAMAAbIUBjcAATljAPe8eHMAATlmFwABOWMA97x6B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gIlywD352IMojT+JBAMAAyeIayeJQScAAJwJYAOES06JwInFAACE+GADleYBJonAATWJxwAAAQBgA4TuATWJxwAAAQBgA4RLAYGJx8A9+e0jHInHgonHwD36QicBAAErAMAAbF4rFonQgonHwD36QoTHhFABYAOE7iMciceCicfAPfo2JwEAASsAwABsXisWidqCicfAPfo2hPiFBgFgA4f4YAOV5kqJ5AEmieQBNYnrAAABAGADleYBgonrwD36JCMcieuDievAPfqzJwEAASsAwABsXisWifGDievAPfqzgL6V6AFgA4OsYAOESwbAAGdfgVqN5o3vk5wAAMAATEvAAGdLAAAAAQOOApOcAAAABAMDjhUAAACEDWADhRoAjiQAAACVzWADiVUAjkIAAACQ6F0DwABsGQFgA4UaAAGOWAAAAIvqYAPAAGxbAWqOX2ADwABsWxxgA4JSAT4JTo68jr4AAIHUYAPAAGwfAZNBRY7HAAEcjtCEjs7APftkgToBAAEWjtuCjtLAPfswgODAAGxqAMAAbIUBjI7lwD37ZByO44SO5cA9+2SBPwEAAZQAwABsiD4CSY7wJY8AAByO/IKO9MA9+zApAQABhI79wD37ZADAAGy4YAPAAFJqQo8XAD89HI8sgo8kwD37MICcAgAChI8twD37ZCaPPgE1jz4AAAEAYAOCUgEcjz4cjzqCjzLAPfswKQEAAYSPO8A9+2QAwABsuIP4AQFgA4JSAS4AhR41j1YAAAEAXAEXj1aFjz7APfwFhACAj1/APfsYgliFjz7APfwFYAOFGgDAAGzLSY+kHI+qhI+owD37ZCcBAAEWj7aCj63APfswgODAAGxqAMAAbDJKj74BgI/FwD37GD9OkCUAAACBsGADiOcASZAxg5A1wD37RD4BPY2QRMA9/JsckE0uwABMTMAAZ0sCAAIckGguwABMTcAAZ0sDAAMWkH+AkHrAPfsYhAGCWYGQi8A9+yQxkJhgA4UaAADAAGd0HJC3FpCnLoU1wABnT4WaAgACgZC/wD37JBaQ3BaQzC6HacAAZ0vAAGdbhD6CsQCazADAAGduPgE9jZD+wD38mxyRBy7AAExMwABnSwIAAhyRIi7AAExOwABnSwMAAxaROoCRNcA9+xiEAYJZgZFGwD37JDGRU2ADhRoAAMAAZ3MckXIWkWIuhTXAAGdP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8wAAAADAAGJbPRzAAEOhLq7zAAAAAMAAYls9HMAAQ7gur4UBAAEWwABDzoHAAEPDwD6QxInOvlYAwABiYwbAAGfwgVzAAEQwwABEQcAARPYAAMAAR5sBasAARDFgA8AAbFaAtQAAAQPAAERawABE9gAAAAICAsAARGEAAACvFmADvk0AwABEcwAAAK8YYAO+TQAAXAE+Az0cwABEgy6vEwEAASeTnQDAAGgRPRzAAEStLsAASdwBAAGUAMAAYlc9F8AARNYuwABMg8AAZ5wpwABnqgbAAGfxgVzAAET7wABFDMAARXMAAMAAR50BasAARPxgA8AAbFaAtQAAAQPAAEUkwABFcwAAAAICAsAARSsAAACwAGADvk0AwABFPgAAALANYAO+TQAAXAE+AT0cwABFTy6vEwEAASfAAEeeAMAAaBEGwABn8oFcwABFeMAARYnAAEX+AADAAEefAWrAAEV5YAPAAGxWgLUAAAEDwABFqMAARf4AAAACAgLAAEWvAAAAsABgA75NAMAARcIAAACwDWADvk0AAFwBPgE9HMAARdMurxMBAAEnwABHoADAAGgRBsAAZ/OBXMAARgPAAEYUwABHDQAAuFkBasAARgRgA8AAbFaAtQAAAQPAAEYzwABHDQAAAAICAsAARjoAAACwAGADvk0AwABGTQAAALANYAO+TQAAXAE+Aj0cwABGXi6vEwEAASfAAEehAMAAaBFJwABGiyEWwABGkC6J7sAAZ6I+AT0dwABGrLBeAwADasAARs5gA7LbwAB9HIDAAEbqwD6TGoDAAEb3wD6TGgDAAGKBPwbAAGf0gVzAAEcSwABHI8AASwIAALhRAWrAAEcTYAPAAGxWgLUAAAEDwABHMcAASwIAAAAFBQXAAEc4AAAAuFJgA75NAMAAR0gAAACvFmADvk0AwABHWgAAALhTYAO+TQDAAEdyAAAAr0dgA75NAMAAR4sAAACvGGADvk0AAFwBPgk9HMAAR5surxMBAAEnhLgAwABoET0cwABIey6u8wAAAADAAGJbTsAASJrAAEifAACBiGADwABsVgEcwABIoS6u8wAAAADAAGJbTsAASLLAAEi7AACG0GADvk0BJsAASLIBHMAASL0urvMAAAAAwABiW2ADvk09HMAASMgur4UBAAEWwABI3oHAAEjTwD6T2onOvlYAwABiY0nAAEjvIiXAAEj4AIXAAEjzwD6UPWADwABixAEWwABJDS7AAEyEwABnq0rAAEkrAD9OwABJRwAAAIeDYAPAAE2IAEnAAElUIiXAAEldAIXAAElYwD6UPWADwABPjwEiHMAASYOAwABJesA+k8wnAQABKwDAAGxeABzAAEmThcAASY7APpQ9JwEAATXAAEmWAAABAGADwABAewEWwABJli6En8AAZ7EjHMAASZYUwABJlsA+lToIACcBAAErAMAAbF4rFsAASaQUwABJlsA+lToIAIGIwABOXQFgA8AAbBgAwABsXj4BPY/AAEmzwD6U4SbAAEmzARzAAEm9LpZuAgACgcAASc/APpPahcAASdvAPpQ9AMAAaA1gA8AATYg+AT2PwABJ9cA+lOEmwABJ9QEcwABJ/y7AAEyGAwADgcAASg3APpPagMAAShnAPpPMJsAASiMBhcAASiPAPpQ9YAPAAGwYAMAAaAxgA8AATYg9HMAASjQuwABMjAQABBzAAEpPLsAATIsBAAEmwABKZgGHwABKZsA+lOFgA8AATa4AwABn94LAAEp4wD6T6IbAAEqMwD6UYSMWwABKpofAAEqewD6U4YO9wABASmrAAErIYAPAAGHlwAEhRmrAAEruYAPAAGHlwAEhLAFgA8AAYeUAwABoCgbAAGf1gVzAAEsHwABLGcAAT6MAAMAARgcAAAABA8AASyfAAE+jAAAABwICwABLOAAAAIeDYAPAAE5bAMAAS0cAAACG9GADwABCTQAFwABLYAAAAK6+YAPAAGxbAWoAYAHAAGxcAsAAS5cAAACu2mADiOcBagBgAcAAbFwCwABLwAAAAK7bXQPAAGwZAWADiiYBagBgAcAAbFwCwABL5QAAAK7FYAPAAEJNAWoAYAHAAGxcAsAATBkAAADAAEySYAPAAFuVAWoAYAHAAGxcAmADwABQLwE+BE7AAE08wABNRQAAhV9gA4mqASMcwABNXYPAAE1PwD6XCicBAAErAMAAbF41wABNZwAAAQBgA8AATDcBFsAATWcuwABGBMAAZ7AjHMAATWeHwABNZ8A+l6gnAQABKwDAAGxeKxbAAE17h8AATWfAPpeohV/AAEw8AWADiaorAWADiapOwABNncAATaoAAK7CYAPAAFCPATXAAE2sAAABAGADwABbfAEWwABNrC6u5MAAZ6QjHMAATawUwABN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NcAAQ+kAAAEAYAPAAF9HARbAAEPpLrhdwABodSMcwABD6YHAAEPpwD89dScBAAErAMAAbF4rHMAAQ/OBwABD6cA/PXWwYwEAAYDAAEQDwD89YADAAF+QAVwGwABo/4FhwABEFcAARCbAAER1AAC/zwFqwABEFmADwABsVoC1AAABA8AARDnAAER1AAAAAQEBwABEQAAAAKlqYAO+TQAAXAE+AT01wABETQAAAQBgA8AAX0cBFsAARE0uuF3AAGh1IxzAAERNgcAARE3APz4ZJwEAASsAwABsXiscwABEV4HAAERNwD8+Gb/PAQABgMAARGvAPz4EAMAAX5IBXAbAAGkAgWHAAER6wABEi8AARPwAALFrAWrAAER7YAPAAGxWgLUAAAEDwABEoMAARPwAAAACAgLAAESnAAAArxZgA75NAMAARLkAAACpamADvk0AAFwBPgE9NcAARMYAAAEAYAPAAF9HARbAAETGLrhdwABodSMcwABExoLAAETGwD8+yycBAAErAMAAbF4rHMAARNCCwABExsA/PsuxawIAAoDAAETmwD8+qIHAAETywD8+tgDAAGAgAVwGwABpAYFhwABFAcAARRLAAEV3AACxWAFqwABFAmADwABsVoC1AAABA8AARSHAAEV3AAAAAgICwABFKAAAAK8WYAO+TQDAAEU6AAAAqWpgA75NAABcAT4BPTXAAEVHAAABAGADwABfRwEWwABFRy64XcAAaHUjHMAARUeCwABFR8A/P4YnAQABKwDAAGxeKxzAAEVRgsAARUfAPz+GsVgCAAKAwABFYcA/P2OBwABFbcA/P3EAwABfogFcBsAAaQKBYcAARXzAAEWNwABGBgAAsLMBasAARX1gA8AAbFaAtQAAAQPAAEWcwABGBgAAAAICAsAARaMAAACwtGADvk0AwABFuAAAALClYAO+TQAAXAE+AT01wABFzAAAAQBgA8AAX0cBFsAARcwuuF3AAGh1IxzAAEXMgsAARczAP0BBJwEAASsAwABsXiscwABF1oLAAEXMwD9AQbCzAgACgMAARebAP0AegcAARfXAP0AsAMAAYBQBXAbAAGkDgWHAAEYLwABGHMAARrYAAMAAR1IBasAARgxgA8AAbFaAtQAAAQPAAEYwwABGtgAAAAMDA8AARj4AAADAAEdTYAO+TQDAAEZUAAAAhklgA75NAMAARmIAAACvGGADvk0AAFwBPgE9NcAARnIAAAEAYAPAAF9HARbAAEZyLrhdwABodSMcwABGcoPAAEZywD9BDicBAAErAMAAbF4rHMAARnyDwABGcsA/QQ7AAEdSAwADgMAARpHAP0DbgcAARqHAP0DrgsAARqnAP0D5AMAAX6QBXAbAAGkEgWHAAEa7wABGzMAAR1UAALDlAWrAAEa8YAPAAGxWgLUAAAEDwABG68AAR1UAAAACAgLAAEbyAAAAsDBgA75NAMAARwMAAACwyGADvk0AAFwBPgE9NcAARxMAAAEAYAPAAF9HARbAAEcTLrhdwABodSMcwABHE4LAAEcTwD9B1CcBAAErAMAAbF4rHMAARx2CwABHE8A/QdSw5QIAAoDAAEc9wD9BsYHAAEdIwD9BvwDAAGA4AVwGwABpBYFhwABHWsAAR2vAAEeuAADAAESLAWrAAEdbYAPAAGxWgLUAAAEDwABHcsAAR64AAAABAQHAAEd5AAAAwABHX2ADvk0AAFwBPgE9NcAAR4wAAAEAYAPAAF9HARbAAEeMLrhdwABodSMcwABHjIHAAEeMwD9ChScBAAErAMAAbF4rHMAAR5aBwABHjMA/QoXAAESLAQABgMAAR57AP0JuAMAAX6sBXAbAAGkGgWHAAEezwABHxMAASA0AALFBAWrAAEe0YAPAAGxWgLUAAAEDwABH1MAASA0AAAABAQHAAEfbAAAAqWpgA75NAABcAT4BPTXAAEfoAAABAGADwABfRwEWwABH6C64XcAAaHUjHMAAR+iBwABH6MA/QysnAQABKwDAAGxeKxzAAEfygcAAR+jAP0MrsUEBAAGAwABIA8A/QxYAwABgNAFcBsAAaQeBYcAASBLAAEgjwABIdAAAsUQBasAASBNgA8AAbFaAtQAAAQPAAEg3wABIdAAAAAEBAcAASD4AAACpamADvk0AAFwBPgE9NcAASEsAAAEAYAPAAF9HARbAAEhLLrhdwABodSMcwABIS4HAAEhLwD9DzycBAAErAMAAbF4rHMAASFWBwABIS8A/Q8+xRAEAAYDAAEhqwD9DugDAAGA1AVwGwABpCIFhwABIecAASIrAAEjvAACwGgFqwABIemADwABsVoC1AAABA8AASJjAAEjvAAAAAgICwABInwAAALAbYAO+TQDAAEiuAAAAsBxgA75NAABcAT4BPTXAAEi/AAABAGADwABfRwEWwABIvy64XcAAaHUjHMAASL+CwABIv8A/RIEnAQABKwDAAGxeKxzAAEjJgsAASL/AP0SBsBoCAAKAwABI2MA/RF6BwABI4cA/RGwAwABfsAFcBsAAaQmBYcAASPTAAEkFwABJaAAAsTcBasAASPVgA8AAbFaAtQAAAQPAAEkiwABJaAAAAAEBAcAASSkAAACpamADvk0AAFwBPgE9NcAASTYAAAEAYAPAAF9HARbAAEk2LrhdwABodSMcwABJNoHAAEk2wD9FLicBAAErAMAAbF4rHMAASUCBwABJNsA/RS6xNwEAAYDAAElewD9FGQDAAF+/AVwGwABpCoFhwABJbcAASX7AAEnlAADAAESMAWrAAEluYAPAAGxWgLUAAAEDwABJh8AASeUAAAACAgLAAEmOAAAAwABHaWADvk0AwABJowAAALANYAO+TQAAXAE+AT01wABJtAAAAQBgA8AAX0cBFsAASbQuuF3AAGh1IxzAAEm0gsAASbTAP0XkJwEAASsAwABsXiscwABJvoLAAEm0wD9F5MAARIwCAAKAwABJyMA/Rb+BwABJ18A/Rc8AwABftwFcBsAAaQuBYcAASerAAEn7wABKXAAAsC8BasAASetgA8AAbFaAtQAAAQPAAEoTwABKXAAAAAEBAcAAShoAAACwMGADvk0AAFwBPgE9NcAASisAAAEAYAPAAF9HARbAAEorLrhdwABodSMcwABKK4HAAEorwD9GkycBAAErAMAAbF4rHMAASjWBwABKK8A/RpOwLwEAAYDAAEpOwD9GfgDAAF/BAVwGwABpDIFhwABKYcAASnLAAEq3AACvSwFqwABKYmADwABsVoC1AAABA8AASoDAAEq3AAAAAQEBwABKhwAAAKlqYAO+TQAAXAE+AT01wABKlAAAAQBgA8AAX0cBFsAASpQuuF3AAGh1IxzAAEqUgcAASpTAP0c3JwEAASsAwABsXiscwABKnoHAAEqUwD9HN69LAQABgMAASq3AP0ciAMAAX8kBXAbAAGkNgWHAAEq8wABKzcAAS0oAAK9IAWrAAEq9YAPAAGxWgLUAAAEDwABK3MAAS0oAAAADAwPAAErhAAAAilNgA8AAbB8AwABK7gAAAK8WYAO+TQDAAEsAAAAArxhgA75NAABcAT4BPTXAAEsQAAAB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HMAAaM+DwABoxcA/bnfAAEcYAwADgMAAaOHAP25EgcAAaOjAP25SgsAAaPbAP25iAMAAX18BXAbAAGk/gWHAAGkLwABpHMAAaWMAAMAAR1gBasAAaQxgA8AAbFaAtQAAAQPAAGkzwABpYwAAAAAAAABcAT4BPTXAAGk8AAABAGADwABfRwEWwABpPC64XcAAaHUjHMAAaTyAwABpPMA/byMnAQABKwDAAGxeKxzAAGlGgMAAaTzAP28jwABHWAAAAADAAF+mAVwGwABpQIFhwABpaMAAaXnAAGofAADAAEcUAWrAAGlpYAPAAGxWgLUAAAEDwABplcAAah8AAAACAgLAAGmjAAAAwABHFWADvk0AwABpugAAAMAARxZgA8AAbB8AAFwBPgE9NcAAadEAAAEAYAPAAF9HARbAAGnRLrhdwABodSMcwABp0YLAAGnRwD9v1icBAAErAMAAbF4rHMAAaduCwABp0cA/b9bAAEcUAgACgMAAafjAP2+tgcAAagvAP2+9AMAAX14BXAbAAGlBgWHAAGokwABqNcAAapQAAMAAR1UBasAAaiVgA8AAbFaAtQAAAQPAAGpKwABqlAAAAAEBAcAAalEAAADAAEdWYAO+TQAAXAE+AT01wABqZAAAAQBgA8AAX0cBFsAAamQuuF3AAGh1IxzAAGpkgcAAamTAP3CJJwEAASsAwABsXiscwABqboHAAGpkwD9wicAAR1UBAAGAwABqhMA/cHIAwABfpQFcBsAAaUKBYcAAapnAAGqqwABrUAAAwABHygFqwABqmmADwABsVoC1AAABA8AAasDAAGtQAAAABAQEwABqzgAAAMAAR8tgA75NAMAAauAAAACLYWADvk0AwABq7gAAAK8dYAO+TQDAAGr8AAAAqWpgA75NAABcAT4BPTXAAGsJAAABAGADwABfRwEWwABrCS64XcAAaHUjHMAAawmEwABrCcA/cV0nAQABKwDAAGxeKxzAAGsThMAAawnAP3FdwABHygQABIDAAGsqwD9xHIHAAGs2wD9xLILAAGs+wD9xOoPAAGtGwD9xSADAAGBsAVwGwABpQ4FhwABrVcAAa2bAAGv+AADAAEfGAWrAAGtWYAPAAGxWgLUAAAEDwABrgMAAa/4AAAACAgLAAGuIAAAAwABHx2ADwABsGADAAGudAAAAwABHyGADwABsHwAAXAE+AT01wABrtAAAAQBgA8AAX0cBFsAAa7QuuF3AAGh1IxzAAGu0gsAAa7TAP3I2JwEAASsAwABsXiscwABrvoLAAGu0wD9yNsAAR8YCAAKAwABr2cA/cguBwABr6sA/ch0AwABgawFcBsAAaUSBYcAAbAPAAGwUwABsbQAAsMoBasAAbARgA8AAbFaAtQAAAQPAAGw0wABsbQAAAAAAAABcAT4BPTXAAGw9AAABAGADwABfRwEWwABsPS64XcAAaHUjHMAAbD2AwABsPcA/ctcnAQABKwDAAGxeKxzAAGxHgMAAbD3AP3LXsMoAAAAAwABgKgFcBsAAaUWBYcAAbHLAAGyDwABtKgAAsdkBasAAbHNgA8AAbFaAtQAAAQPAAGyawABtKgAAAAMDA8AAbKcAAACx0WADwABsWwDAAGy4AAAAsdpgA75NAMAAbM8AAACvGGADvk0AAFwBPgE9NcAAbN8AAAEAYAPAAF9HARbAAGzfLrhdwABodSMcwABs34PAAGzfwD9zkCcBAAErAMAAbF4rHMAAbOmDwABs38A/c5Cx2QMAA4DAAG0BwD9zXYHAAG0MwD9zbYLAAG0dwD9zewDAAGA+AVwGwABpRoFhwABtL8AAbUDAAG2BAADAAEcxAWrAAG0wYAPAAGxWgLUAAAEDwABtVMAAbYEAAAAAAAAAXAE+AT01wABtXQAAAQBgA8AAX0cBFsAAbV0uuF3AAGh1IxzAAG1dgMAAbV3AP3Q6JwEAASsAwABsXiscwABtZ4DAAG1dwD90OsAARzEAAAAAwABfbQFcBsAAaUeBYcAAbYbAAG2XwABuBgAAwABHeAFqwABth2ADwABsVoC1AAABA8AAbafAAG4GAAAAAgICwABtrAAAAIpTYAPAAGwfAMAAbbkAAADAAEd5YAO+TQAAXAE+AT01wABt0AAAAQBgA8AAX0cBFsAAbdAuuF3AAGh1IxzAAG3QgsAAbdDAP3TrJwEAASsAwABsXiscwABt2oLAAG3QwD9068AAR3gCAAKAwABt68A/dMSBwABt8sA/dNQAwABfvQFcBsAAaUiBYcAAbgvAAG4cwABudwAAsUABasAAbgxgA8AAbFaAtQAAAQPAAG4xwABudwAAAAEBAcAAbjgAAACwHGADvk0AAFwBPgE9NcAAbkkAAAEAYAPAAF9HARbAAG5JLrhdwABodSMcwABuSYHAAG5JwD91micBAAErAMAAbF4rHMAAblOBwABuScA/dZqxQAEAAYDAAG5pwD91hQDAAGAzAVwGwABpSYFhwABufMAAbo3AAG7sAACwDAFqwABufWADwABsVoC1AAABA8AAbqTAAG7sAAAAAQEBwABuqwAAALANYAO+TQAAXAE+AT01wABuvAAAAQBgA8AAX0cBFsAAbrwuuF3AAGh1IxzAAG68gcAAbrzAP3Y+JwEAASsAwABsXiscwABuxoHAAG68wD92PrAMAQABgMAAbt7AP3YpAMAAX/QBXAbAAGlKgWHAAG7xwABvAsAAb1MAALGdAWrAAG7yYAPAAGxWgLUAAAEDwABvFsAAb1MAAAABAQHAAG8dAAAAqWpgA75NAABcAT4BPTXAAG8qAAABAGADwABfRwEWwABvKi64XcAAaHUjHMAAbyqBwABvKsA/duInAQABKwDAAGxeKxzAAG80gcAAbyrAP3bisZ0BAAGAwABvScA/ds0AwABgPwFcBsAAaUuBYcAAb1jAAG9pwABvtwAAwABHxAFqwABvWWADwABsVoC1AAABA8AAb3nAAG+3AAAAAQEBwABvhQAAAKlqYAO/1QAAXAE+AT01wABvkgAAAQBgA8AAX0cBFsAAb5IuuF3AAGh1IxzAAG+SgcAAb5LAP3eIJwEAASsAwABsXiscwABvnIHAAG+SwD93iMAAR8QBAAGAwABvrcA/d3MAwABgZgFcBsAAaUyBYcAAb7zAAG/NwABwUgAAsA8BasAAb71gA8AAbFaAtQAAAQPAAG/pwABwUgAAAAICAsAAb/AAAACwEGADvk0AwABwAgAAAK8YYAO+TQAAXAE+AT01wABwEgAAAQBgA8AAX0cBFsAAcBIuuF3AAGh1IxzAAHASgsAAcBLAP3g8JwEAASsAwABsXiscwABwHILAAHASwD94PLAPAgACgMAAcDnAP3gZgcAAcEXAP3gnAMAAX/UBXAbAAGlNgWHAAHBXwABwaMAAcMMAAK+PAWrAAHBYYAPAAGxWgLUAAAEDwABwgcAAcMMAAAABAQHAAHCIAAAAqWpgA75NAABcAT4BPTXAAHCVAAABAGADwABfRwEWwABwlS64XcAAaHUjHMAAcJWBwABwlcA/eOknAQABKwDAAGxeKxzAAHCfgcAAcJXAP3jpr48BAAGAwABwucA/eNQAwABffgFcBsAAaU6BYcAAcMjAAHDZwABxUAAAwABHPQFqwABwyWADwABsVoC1AAABA8AAcPPAAHFQAAAAAgICwABw+gAAAKlqYAO+TQDAAHEJAAAAgJZgA7LPAABcAT4BPTXAAHEYAAABAGADwABfRwEWwABxGC64XcAAaHUjHMAAcRiCwABxGMA/eZ0nAQABKwDAAGxeKxzAAHEigsAAcRjAP3mdwABHPQIAAoDAAHE9wD95eoHAAHFEwD95iADAAF99AVwGwABpT4FhwABxVcAAcWbAAHHFAACxmAFqwABxVmADwABsVoC1AAABA8AAcXjAAHHFAAAAAQEBwABxfwAAALEFYAO+TQAAXAE+AT01wABxlQAAAQBgA8AAX0cBFsAAcZUuuF3AAGh1IxzAAHGVgcAAcZXAP3pMJwEAASsAwABsXiscwABxn4HAAHGVwD96TLGYAQABgMAAcbLAP3o3AMAAYA4BXAbAAGlQgWHAAHHKwABx28AAckgAALBMAWrAAHHLYAPAAGxWgLUAAAEDwABx/cAAckgAAAABAQHAAHIEAAAAqWpgA75NAABcAT4BPTXAAHIRAAABAGADwABfRwEWwAByES64XcAAaHUjHMAAchGBwAByEcA/evAnAQABKwDAAGxeKxzAAHIbgcAAchHAP3rwsEwBAAGAwAByPsA/etsAwABfiwFcBsAAaVGBYcAAck3AAHJewABy6AAAsE8BasAAck5gA8AAbFaAtQAAAQPAAHKFwABy6AAAAAICAsAAcowAAACpamADvk0AwABymAAAALBQYAPAAGxbAABcAT4BPTXAAHKlAAABAGADwABfRwEWwABypS64XcAAaHUjHMAAcqWCwABypcA/e6QnAQABKwDAAGxeKxzAAHKvgsAAcqXAP3uksE8CAAKAwABy18A/e3+BwABy3sA/e40AwABfjAFcBsAAaVKBYcAAcu3AAHL+wABzkgAAsFIBasAAcu5gA8AAbFaAtQAAAQPAAHMqwABzkgAAAAICAsAAczEAAACpamADvk0AwABzPQAAALBQYAPAAGxbAABcAT4BPTXAAHNKAAABAGADwABfRwEWwABzSi64XcAAaHUjHMAAc0qCwABzSsA/fGEnAQABKwDAAGxeKxzAAHNUgsAAc0rAP3xhsFICAAKAwABzgcA/fDyBwABziMA/fEoA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KcAAadJKrSwBga0zwD/SrwbAAGnfgWStQK1Gr44AAMAATNAAAAABA61Pr44AAAABAQGtVgAAAKlqYAO+TQAAYAO+TQE+BU6taa1uAACDYGADvk0BFq12gK1wwD/U0oNgvmhAHq2HwABiBQIAAieVNYGtmMA/1OcArYetnQBJraQcrbIWraguryjAAGnJJwEAASsAwABsXj4DPRetwy6vKIGtz8A/1OfAAGnJSa3cIRyt6xat4C7AAEdCwABpxScBAAErAMAAbF4+AT0crf4uwABM1gIAAoGuGcA/1OcWrh8uwABHQsAAacUAwABp40muOSEcrkYWrj0uwABMw8AAacwnAQABKwDAAGxePgE9HK5ZLsAATNUCAAKBrnLAP9TnFq6BFq54LsAATMPAAGnMqWu+ZwDAAGnmSa6XIRyuphaumy7AAEzCwABpyCcBAAErAMAAbF4+AT0crrkuwABM1QIAAoGu0sA/1OcWruMWrtguwABMwsAAacipa75nAMAAaeY/Sq76AYGvAcA/1Oc/PRyvKRavIi6BicAAacPAAEf8AgACga9SwD/U52qvXl0DsucBYQMBYAO+TWADss/AAHh5AMAAYU5Kr38Bga+GwD/U5wbAAGnggWSvk6+ZsoQAAMAATNEAAAABA6+msoQAAAABAQGvrQAAAKlqYAO+TQAAYAO+TQE+BU6vwK/FAACDYGADvk0BFq/NgK/HwD/WlINgvmhAHq/ewABiBQIAAieVlIGv88A/1qkAr96v+ABJr/8csBEWsAMusNTAAGnKJwEAASsAwABsXj4DPRewIi6w1IGwMsA/1qnAAGnKSbA/IRywThawQy7AAEdCwABpxScBAAErAMAAbF4+AT0csGEuwABM1QIAAhawei6w1MAAacoWsJQWsIkuwABHQsAAacWpa75nAMAAaeZJsKohHLC9FrCuLq8nwABpxicBAAErAMAAbF4+AT0csNAuwABM1QIAAhaw6S6w1MAAacoWsQcWsPguryfAAGnGqWu+ZwDAAGnmSbEdIRyxLBaxIS7AAEzCwABpyCcBAAErAMAAbF4+AT0csT8uwABM1QIAAhaxWC6w1MAAacoWsXIWsWcuwABMwsAAacipa75nAMAAaeZJsYghHLGVFrGMLsAATMPAAGnMJwEAASsAwABsXj4BPRyxqC7AAEzVAgACFrHBLrDUwABpyhax2Rax0C7AAEzDwABpzKlrvmcAwABp5j9KsfABgbH3wD/WqT89HLIfFrIYLoGJwABpw8AAR/wCAAKBskjAP9aparJUXQOy5wFhAwFgA75NYAOyz8AAeHkAwABhTkqydQGBsnzAP9apBsAAaeGBZLKJso+2mAAAwABM0gAAAAEDspq2mAAAAAEBAbKhAAAAqWpgA75NAABgA75NAT4FTrK0srkAAINgYAO+TQEWssGAsrvAP9ivg2C+aEAestLAAGIFAgACJ5U2gbLlwD/YxACy0rLqAEmy8SIiHLMEFrL1Lq8nwABpxicBAAErAMAAbF4AHLMbFrMPLq8mwABpyycBAAErAMAAbF4AIRazJy7AAEzEwABpzT4DPRezPS6vJoGzS8A/2MTAAGnLSbNYIRyzZxazXC7AAEdCwABpxScBAAErAMAAbF4+AT0cs3ouwABM1QIAAoGzk8A/2MQWs6QWs5kuwABHQsAAacWpa75nAMAAaeZJs7ohHLPJFrO+LsAATMLAAGnIJwEAASsAwABsXj4BPRyz3C7AAEzVAgACgbP1wD/YxBa0Bhaz+y7AAEzCwABpyKlrvmcAwABp5km0HCEctCkWtCAuwABMw8AAacwnAQABKwDAAGxePgE9HLQ8LsAATNUCAAKBtFXAP9jEFrRkFrRbLsAATMPAAGnMqWu+ZwDAAGnmSbR6IRy0iBa0fi6vKMAAacknAQABKwDAAGxePgE9HLSbLsAATNUCAAKBtLTAP9jEFrTEFrS6Lq8owABpyalrvmcAwABp5j9KtNsBgbTiwD/YxD9JtQMhHLUWFrUHLq8nwABpxicBAAErAMAAbF4+AT0ctS4WtScugYnAAGnDwABIDAIAAoG1RcA/2MRqtVFgA7LbwABtowDAAGFNSbV4IRy1iBa1fC6vJsAAacsnAQABKwDAAGxePgE9HLWgFrWZLoGJwABpw8AAR/wCAAKBtcvAP9jEarXXXQOy5wFhAwFgA75NYAOyz8AAeHkAwABhTkm1/xa2Ay7AAEzEwABpzT4BPRy2GS7AAEzJAQABgbYywD/YxADAAGnkPgE9MLZMJLZ9AifAAEzYgbZ4wD/YxEq2iQGBtpDAP9jEBsAAaeKBZLadtqO5ZwAAwABM0wAAAAEDtqu5ZwAAAAEBAbayAAAAqWpgA75NAABgA75NAT4FTrbFtsoAAINgYAO+TQEWttKAtszAP9uLg2C+aEAetuPAAGIFAgACJ5WVgbbzwD/boAC247b4AEm2/yIctxMWtwMurynAAGnSJwEAASsAwABsXgAhFrcfLsAATMTAAGnNPgI9F7c1LsAATMOBt0DAP9ugwABpzEq3TAGBt1PAP9ugP0m3dCEct4EWt3guwABMw8AAacwnAQABKwDAAGxePgE9HLeZFreSLoGJwABpw8AAR/wCAAKBt8TAP9ugarfQXQOy5wFhAwFgA75NYAOyz8AAeHkAwABhTkm3+Ba3/C7AAEzEwABpzT4BPRy4Ei7AAEzJAQABgbgrwD/boADAAGnkSbg9IRy4TBa4QS7AAEdCwABpxScBAAErAMAAbF4+AT0cuF0uwABM1gIAAoG4eMA/26AWuH4uwABHQsAAacUAwABp40m4liEcuKUWuJouwABMwsAAacgnAQABKwDAAGxePgE9HLi9Fri2LoGJwABpw8AASAwCAAKBuNTAP9ugarjgYAOy28AAjI4AwABhTT4BPTC5CCS5TAInwABM1xa5PC6vKcAAadJKuVgBgblfwD/boAbAAGnjgWS5bLlxul0AAMAATNYAAAABA7mLul0AAAACAgK5kgAAAL+XYAO+TQC5ogAAAMAATNlgA75NAABcAT4BPRy5wBa5uS6BicAAacPAAEgMAgACgLngwD/ddRy6Imq5+F0DsucBYQMCYAPAAGwYYAPAAGwYYAOyz8AAYQONbwIAAha6OYC6MMA/3XWpa75nFrpRgbpBwD/dgalrvmcAsusAwABhTQbAAGnkgWS6YrpnuxsAAMAATMkAAAABA7p/uxsAAAABAQG6hgAAAL+XYAO+TQAAXAE+AUm6liEcuqOAuprAP94dJwEAASsAwABsXj4BPRy6uxa6tC6BicAAacPAAEf8AgACgLrmwD/eHWq69l0DsucBYQMBYAO+TWADss/AAIgiAMAAYU4/BsAAaeWBZLsguyW77wAAwABMygAAAAEDu0i77wAAAAEBAbtPAAAAv5dgA75NAABcAT4BSbtfIRy7bIC7Y8A/3qMnAQABKwDAAGxePgE9HLuEFrt9LoGJwABpw8AAR/wCAAKAu6/AP96jaru/XQOy5wFhAwFgA75NYAOyz8AAiHMAwABhTj8GwABp5oFku/S7+bzZAADAAEzVAAAAAQO8EbzZAAAAAgICvBgAAAC/l2ADvk0AvCkAAADAAEzaYAPAAGwYAABcAT4BPRy8Rha8Py6BicAAacPAAEgMAgACgLxmwD/fKRy8pmq8fl0DsucBYQMCYAPAAGwYYAPAAGwYYAOyz8AArn2NbwIAAha8vYC8tMA/3ympa75ngbzFwD/fNQCy6wDAAGFNAAA/vdMAP77HAD+/bwA/wNoAP8GmAD/ESgA/xT8AP8YNAD/G+AA/yjMAP8shAD/NlwA/0IcAP9J4AD/UsAA/1nIAP9iNAD/baQA/3VMAP937AD/egQA/3wcAP9+qAAAAFgAAAQbAAGnAgWSB0oHXhIYAAbWzAAAAAQOB4YSGAAAAAQEBgegAAACpamADvk0AAGADwABsWwE+AkmB8yEWgf6AgfjAP+AutbO+Xz4BSoIQASpJgicWgjYWgjGAgivAP+AugZe+bbWxvvc+A06D2IPdAACDYGADvk0BFoPlgIPfwD/gLoNgvmhOg/eD/wAAsHBgA72OARaEBoGEAcA/4HiwcL5kSYQTIiIchB+ChBfAP+CUJwEAASsAwABsXgAhFoQwgYQrwD/geK5nvlwBHIRIgoRAwD/glCcBAAFqhFNgA72OwADvlwDAAGxePgFKhF8BKj8/SoR5ASkBgWQAP+EFAD+8cgA/4AsAAAABAD/gDgA/4QUAAAABAAIIwABp6QCBZQAAAoDaAAC9YgABAQGgH4EGAADAAGhyAAEBAcAAR84AAAADAsAAaeqBZYFCgUiESAPAAEfWAAABYAPAAGhzAAADBMAAaeyBZYGJgZcYwABHEgBgA75NASsEwABp7YFlgaGBshjAAEcVAGADvk0BKwTAAGnugWWBvIHHGMAAR1YAYAO+TQErAQXAAGn1AAAAAAQAAAMAAAAAAAAAAABgA8AAaeoBPwEJAQDAAGmgAAAAAAQGwABp8IFlgcyB0YIuAACN/wAAAAEDgdaCLgAAAAAAAABcAT4DPReB3y7AAEcSK8AAaew9F4H6LsAARxUrwABp7T0XghguwABHVivAAGnuBsAAafGBZYIzgkSCyQAAwABHEQFqgjRgA8AAbFaAtQAAAQOCVoLJAAAAAQEBgl0AAADAAEcSYAO+TQAAXAE+Aj0XgnguwABHEoCCicA/4lzAAGnsPR2Co8AARxEBAAGAgrbAP+JcAMAAaT0GwABp8oFlgs6C34OxAADAAEcUAWqCz2ADwABsVoC1AAABA4L7g7EAAAACAgKDCQAAAMAARxVgA75NAIMgAAAAwABHFmADwABsHwAAXAE+Aj0XgzwuwABHFYCDUMA/4sfAAGntPR2DbcAARxQCAAKAg4rAP+LHgYOdwD/i1QDAAGlABsAAafOBZYO2g8eERgAAwABHVQFqg7dgA8AAbFaAtQAAAQOD3IRGAAAAAQEBg+MAAADAAEdWYAO+TQAAXAE+Aj0Xg/suwABHVoCECcA/40nAAGnuPR2EIMAAR1UBAAGAhDbAP+NJAMAAaUEAAD/h4AA/4i8AP+KaAD/jHAA/44cAAAAEAsAAafaBZYRLhFGHqwPAAEfXAAABYAPAAGhzAAAEBMAAafiBZYSNhJYYwABHbABgA75NASsEwABp+YFlhKCErxjAAEdrAGADvk0BKwTAAGn6gWWEuYTCGMAAR3QAYAO+TQErBMAAafuBZYTLhOAYwABIKQBgA8AAbFsBKgEFwABqAwAAAAAEAAADAAAAAAAAAAAAYAPAAGn2AT8BCQEAwABpoAAAAAAFBsAAaf2BZYTlhOqFWQAAjf8AAAABA4TvhVkAAAAAAAAAXAE+BD0XhPguwABHbCvAAGn4PReFDi7AAEdrK8AAafk9F4UqLsAAR3QrwABp+j0XhUAuwABIKSrAAGn7BsAAaf6BZYVehWOGCgAAwABHdQAAAAEDhXSGCgAAAAMDA4V7AAAAwABHdGADvk0AhYwAAACwVmADvk0AhZ0AAADAAEd2YAO+TQAAXAE+Aj0XhbMuwABHdICFv8A/5MfAAGn6PR2F1MAAR3UDAAOAhebAP+THgYXxwD/k1YKF/MA/5OEAwABo5gbAAGn/gWWGD4YUhnIAAMAARIsAAAABA4YbhnIAAAABAQGGIgAAAMAAR19gA75NAABcAT4CPReGOi7AAEgpKcAAafs9HYZawABEiwEAAYCGYsA/5U8AwABpBQbAAGoAgWWGd4Z8htoAAMAARI4AAAABA4aDhtoAAAABAQGGigAAAMAAR6NgA75NAABcAT4CPReGoi7AAEgpKcAAafs9HYbCwABEjgEAAYCGysA/5akAwABpJQbAAGoBgWWG34bkh6kAAMAAR2oAAAABA4b2h6kAAAACAgKG/QAAAMAAR2tgA75NAIcUAAAAwABHbGADvk0AAFwBPgM9F4cqLsAAR2uAhzzAP+YDwABp+T0Xh1YuwABHbIGHYsA/5hHAAGn4PR2Hd8AAR2oCAAKAh4rAP+YDgYebwD/mEQDAAGlZAAA/5EgAP+SlAD/lLQA/5YcAP+XhAD/magAAAAUCwABqBIFlh66HtInkA8AAR9gAAAFgA8AAaHMAAAIEwABqBoFlh/WH/hiw+QBgA75NASsEwABqB4FliAiIGRjAAEcVAGADvk0BKwEFwABqDQAAAAAEAAADAAAAAAAAAAAAYAPAAGoEAT8BCQEAwABpoAAAAAADBsAAagmBZYgeiCOIYwAAjf8AAAABA4goiGMAAAAAAAAAXAE+Aj0XiDEusPkrwABqBj0XiEcuwABHFSvAAGoHBsAAagqBZYhoiHmJSwAAwABHFAFqiGlgA8AAbFaAtQAAAQOIlYlLAAAAAgICiKMAAADAAEcVYAO+TQCIugAAAMAARxZgA8AAbB8AAFwBPgI9F4jWLsAARxWAiOrAP+dpwABqBz0diQfAAEcUAgACgIkkwD/naYGJN8A/53cAwABpQAbAAGoLgWWJUIlhieIAAMAARyABaolRYAPAAGxWgLUAAAEDiW6J4gAAAAICAol1AAAAsPlgA75NAImEAAAAumlgA8AAbB8AAFwBPgI9F4maLrD5gImmwD/n68AAagY9HYm7wABHIAIAAoCJycA/5+uBidTAP+f3AMAAaW8AAD/m/QA/5zwAP+e+AD/oOgAAAAMAAAABgWUAP+hSAD/hUQA/46AAP+aHAD/oTwAAAAMAP+hSAAAAAAACCMAAag4AgWYAAAKA2gAAv9IAAQEBqPiBFQAAvWIAAQEJtV61Z7W8tcS1xauWqH+gH6uXAAAABQLAAGoPgWaCt4K9kbM3wABM2wAAAWADwABsVgABYAPAAGozAAEFwABqFgAAAAAFAAADAAAAAAAAAAAAYAPAAGoPAT8BCQAAwABsWgAAAAAEBsAAahGBZplgmWaaNQAAwABIDQAAAAEDmX+aNQAAAAIBApmGAAAAqWpgA75NAJmVAAAAgT5gA8AAbBgBagBgAcAAbFwCAGADvk0BPgFKmaMBHJmqLsAASIoCAAKAmb/AP+kgH5nSvkIEAARqmf5gA76VwAD6QTWaCgAAAQBgA8AAbBgBgZoKwD/pLCMcmgqCmgrAP+l1JwEAASsAwABsNicAgpoKwD/pdQFgA8AAbBgWmiIWmh2AmhfAP+kgg2C+aInOvlaTAADAAGo4BsAAahKBZpqJmo+bGwAAwABISgAAAAEDmqWbGwAAAAICApqsAAAAqWpgA75NAJq7AAAAsHBgA72OAABgA75NAUqaxwEcmscuwABIigIAAoCa2sA/6ewfmuW+NwIAAoGa+8A/6fgWmw8WmwqAmwTAP+nsg2C+aInOvlYAAMAAajgGwABqE4Fmm4qbkJx7AADAAEiXAAAAAQObpJx7AAAAAgICm6sAAACpamADvk0Am7wAAADAAEzcYAO+lQAAYAO+TQE+AkAhJZvkAIGb18A/6nhgA72Om9eb7wEnwABM3UqcHAEcnCMuwABIigIAAoCcOMA/6mwfnEO+TAIAAoGcUsA/6ngWnGsWnGaAnGDAP+psg2C+aInOvlYAAMAAajgGwABqFIFmnL2cw5zrAALAAEiKAAAAAQOczpzrAAAAAgICnNUAAACpamADvk0AnOIAAADAAEiqYAO+TQAAYAO+TQAAAD/o/gA/6coAP+pKAD/q6QA/6ysAAAAEAsAAaheBZoK3gr2RswPAAEfZAAABYAPAAGoPAAAAAQXAAGogAAAAAAQAAAMAAAAAAAAAAABgA8AAahcBPwEJAQDAAGoWAAAAAAUGwABqGYFmhpqGoIjrAADAAEgsAAAAAQOGrIjrAAAAAgIChrMAAACpamADvk0Ahr8AAADAAEzeYAPAAGxbAABgA75NAT4JTobehuMAAINgYAO+TQEWhuuAhuXAP+uwg2C+aE6G+YcAAACECmADwABsHwEWhweChwLAP+vVic6+Vk6HIocsAACwVmADvXYBioc2wD/r1R+HQb4wAgACaodfYAO+lcAA56KDh2vAP+vxAEmHeIGHfMA/67w+AT2Kh5fAP+vVHIejgoeewD/r1bXCAQABH4e6vkIEAARqh9lgA76VwAD6QScAg4fpwD/r8ZMAAL53Pz2KiADAP+vVHIgMgogHwD/r1bXCAQABH4gYvkwCAAJqiDFgA76VwAD+MIOIPsA/6/EAAL53PReIVoSITMA/7A+vl4KIYcA/69W9fj0ciHCCiGvAP+vVtcIBAAEWiH6AiHjAP+uwg2C+aAC+dz0ciL6AiLjAP+uwtcIBAAGEiMbAP+wPAL53SojXAYSI3sA/7A8GwABqGoFmiS2JM4nkAADAAEiKAAAAAQOJPonkAAAAAgICiUUAAACpamADvk0AiVIAAADAAEiqYAO+TQAAYAO+TQE+Az0ciWuBiWLAP+1CtcIBAAEWiXmAiXPAP+02g2C+aAC+dz0cibmAibPAP+02tcIBAAGBicHAP+1CAL53SonRAYGJ2MA/7UIGwABqG4Fmin6KhI0FAADAAEgvAAAAAQOKkY0FAAAAAgICipgAAACpamADvk0AiqUAAACvl2ADvk0AAGADvk0BPgtAIRyK1RaKxYGKvMA/7cy1wL5YJwEAASsAwABsXoq8itwASYrjHIrtgIrnwD/twCcBAAGBivDAP+3MAMAAbF5KivoBgYsBwD/tzD9OixUAAAC2w2ADvk0ASYslJYs3ABaLMoGLKcA/7cyDYL5oYAPAAEAkPgE9iotSwD/uLBaLaIGLX8A/7cyDYL5oPz0ci8MWi7OBi6rAP+3MtcC+WLXCAQABFovkNYvMAAABAGADvk0BgovMwD/uLCMci8yDi8zAP+6HJwEAASsAwABsXoGL2sA/7cyDi8zAP+6HAWADvk2DYL5oAL53TowjjCgAAINgYAO+TQEWjDCAjCrAP+3Ag2C+aD0cjECAjDrAP+3AtcIBAAGBjEjAP+3MAL53PRyMcDWMWAAAAQBgA75NAYKMWMA/7iwjHIxYhIxYwD/vAycBAAErAMAAbF6BjGbAP+3MhIxYwD/vAwFgA75NtcIBAAGDjHjAP+7JAL53PReMjIGMg8A/7cyEChaMmoOMlcA/7smECr5pvnFJjKYhHIy1goyqwD/uLCcBAAErAMAAbF4+AT0XjNGCjMbAP+4shAoWjN+DjNrAP+7JhAq+ab5xP0qM8gGBjPnAP+3MBsAAahyBZo27jcGPKwAAwABIrQAAAAEDjdaPKwAAAAICAo3dAAAAwABJU2ADvk0AjfIAAADAAEzfYAO+TQAAYAO+TQE+BU6OEI4eAADAAEzgYAO+TQEWji6AjiDAP+/Og2C+aD0cjkaAjjjAP+/OtcIBAAGBjk7AP+/cAL53PReOiCaOeACBjmfAP+/cYAO98Ku0Jo6IARaOsoKOpMA/7/OrtL5qYAO9gb4QPRyO7hyOyi7AAEzhwABqDgEAAYGO3MA/79wAwABqHrXCAQABFo8Ego72wD/v84NgvmgAvndKjxABgY8XwD/v3AbAAGoegWaQJJAqkbEAAMAATOHAAGoOAAAAAQOQO5GxAAAAAQEBkEIAAACxs2ADvk0AAGADvk0BPgVOkFoAAACKfWADvk0ATpBukHYAAEBgA75NAYCQeMA/8L1DkIgiIRyQnBaQl4KQj8A/8N+DYL5oJwEAASsAwABsXgAhHJC5FpC0FpCvgpCnwD/w34NgvmiBl75tJwEAAWqQxmADvpXAAPiPAMAAbF4+A0mQ0yEckOCBkNfAP/DSJwEAASsAwABsXj4BPReQ+4KQ88A/8N+KfYGRBsA/8NK+cj89iZEewD/w0oKRKcA/8N89ipE4wD/w3xaRSoKRQsA/8N+DYL5oSZFaIRyRZ4GRXsA/8NInAQABKwDAAGxePgE9F5GAgpF4wD/w34p9gZGLwD/w0r5yP0qRnwGCkabAP/DfAAA/644AP+0UAD/tngA/76wAP/CXAD/x1AAAAAUCwABqIYFmkmeSbZjwN8AATOIAAAFgA8AAbFYAAWADwABqMwABBcAAaigAAAAABQAAAwAAAAAAAAAAAGADwABqIQE/AQkAAMAAbFoAAAAABAbAAGojgWaZYJlmmjUAAMAASA0AAAABA5l/mjUAAAACAQKZhgAAAKlqYAO+TQCZlQAAAIE+YAPAAGwYAWoAYAHAAGxcAgBgA75NAT4BSpmjARyZqi7AAEiKAgACgJm/wD/yYx+Z0r5CBAAEapn+YAO+lcAA+kE1mgoAAAEAYAPAAGwYAYGaCsA/8m8jHJoKgpoKwD/yuCcBAAErAMAAbDYnAIKaCsA/8rgBYAPAAGwYFpoiFpodgJoXwD/yY4NgvmiJzr5WkwAAwABqOAbAAGokgWaaiZqPmxsAAMAASEoAAAABA5qlmxsAAAACAgKarAAAAKlqYAO+TQCauwAAALBwYAO9jgAAYAO+TQFKmscBHJrHLsAASIoCAAKAmtrAP/MvH5rlvjcCAAKBmvvAP/M7FpsPFpsKgJsEwD/zL4NgvmiJzr5WAADAAGo4BsAAaiWBZpuKm5CcewAAwABIlwAAAAEDm6ScewAAAAICApurAAAAqWpgA75NAJu8AAAAwABM3GADvpUAAGADvk0BPgJAISWb5ACBm9fAP/O7YAO9jpvXm+8BJ8AATN1KnBwBHJwjLsAASIoCAAKAnDjAP/OvH5xDvkwCAAKBnFLAP/O7FpxrFpxmgJxgwD/zr4NgvmiJzr5WAADAAGo4BsAAaiaBZpy9nMOc6wACwABIigAAAAEDnM6c6wAAAAICApzVAAAAqWpgA75NAJziAAAAwABIqmADvk0AAGADvk0AAAA/8kEAP/MNAD/zjQA/9CwAP/RuAAAABALAAGopgWaSZ5JtmPADwABM4wAAAWADwABqIQABYAPAAGoXAAEFwABqMgAAAAAEAAADAAAAAAAAAAAAYAPAAGopAT8BCQEAwABqKAAAAAAFBsAAaiuBZpLGktiVCQAAwABILAFqksdgA8AAbFaAtQAAAQOS5JUJAAAAAgICkusAAACpamADvk0AkvcAAADAAEzeYAPAAGxbAABgA75NAT4ITpMWkxsAAINgYAO+TQEWkyOAkx3AP/UEg2C+aE6TMZM4AACECmADwABsHwEWkz+CkzrAP/Upic6+Vk6TWpNkAACwVmADvXYBipNuwD/1KR+Teb4wAgACapOXYAO+lcAA56KDk6PAP/VFAEmTsIGTtMA/9RA+A06T1ZPgAACQJWADvk0BH5PwvkIEAARqlA9gA76VwAD6QScAg5QfwD/1RZMAPReUNoKUMcA/9SmDYIWUPcA/9Z++cD2KlE/AP/UphZRWwD/1nz9OlHKUfQAAwABM5GADvk0BH5SDvkwCAAJqlJxgA76VwAD+MIOUqcA/9UUAPReUu4KUtsA/9SmDYIWUwsA/9fG+cD0XlN2FlNLAP/Xxg2AWlOqAlOTAP/UEg2C+aL5wSpT1AYSU/MA/9WMGwABqLIFmlQ6VIJWCAADAAEiKAWqVD2ADwABsVoC1AAABA5UrlYIAAAACAgKVMgAAAKlqYAO+TQCVPwAAAMAASKpgA75NAABgA75NAT4CPReVWIGVT8A/9pKDYBaVZYCVX8A/9oaDYL5ovnBKlW8BgZV2wD/2kgbAAGotgWaVh5WZll0AAMAASC8BapWIYAPAAGxWgLUAAAEDlaaWXQAAAAICApWtAAAAqWpgA75NAJW6AAAAr5dgA75NAABgA75NAT4DTpXQldwAAMAATOVgA75NAR+V6r5MAgACFpYCgZX5wD/3CYGXvm0WlhMWlg6AlgjAP/b9g2C+aInOvlYAPReWMIKWJMA/9x6DYBaWPYCWN8A/9v2DYL5ovnBKlkcBgpZOwD/3HgbAAGougWaWYpZ0l64AAMAASK0BapZjYAPAAGxWgLUAAAEDlomXrgAAAAICApaQAAAAwABJU2ADvk0AlqUAAADAAEzfYAO+TQAAYAO+TQE+BE6Ww5bRAADAAEzgYAO+TQEWluGAltPAP/eug2C+aD0Xlw4mlv4AgZbtwD/3vGADvfCrtCaXDgEWlziClyrAP/fTq7S+amADvYG+ED0Xl3Qcl1AuwABM4cAAag4BAAGBl2LAP/e8AMAAajCDYBaXiYKXe8A/99ODYL5ovnBKl5MBgZeawD/3vAbAAGowgWaYH5glmO4AAMAATOHAAGoOAAAAAQOYNpjuAAAAAQEBmD0AAACxs2ADvk0AAGADvk0BPgNOmFWYXQAAQGADvk0BgJhfwD/4f0OYbyIhHJiDFph+gZh2wD/4lINgvmgnAQABKwDAAGxeACEcmKAWmJsWmJaBmI7AP/iUg2C+aIGXvm0nAQABapitYAO+lcAA+I8AwABsXj4BPYmYusA/+JQWmMyBmMTAP/iUg2C+aEqY3AGBmOPAP/iUAAA/9NcAP/ZZAD/20AA/94EAP/hZAD/5GAAAAAUCwABqM4FmmPOY+ZztR8AATOYAAAFgA8AAbFYAAAAABAbAAGo1gWaZYJlmmjUAAMAASA0AAAABA5l/mjUAAAACAQKZhgAAAKlqYAO+TQCZlQAAAIE+YAPAAGwYAWoAYAHAAGxcAgBgA75NAT4BSpmjARyZqi7AAEiKAgACgJm/wD/5dx+Z0r5CBAAEapn+YAO+lcAA+kE1mgoAAAEAYAPAAGwYAYGaCsA/+YMjHJoKgpoKwD/5zCcBAAErAMAAbDYnAIKaCsA/+cwBYAPAAGwYFpoiFpodgJoXwD/5d4NgvmiJzr5WkwAAwABqOAbAAGo2gWaaiZqPmxsAAMAASEoAAAABA5qlmxsAAAACAgKarAAAAKlqYAO+TQCauwAAALBwYAO9jgAAYAO+TQFKmscBHJrHLsAASIoCAAKAmtrAP/pDH5rlvjcCAAKBmvvAP/pPFpsPFpsKgJsEwD/6Q4NgvmiJzr5WAADAAGo4BsAAajeBZpuKm5CcewAAwABIlwAAAAEDm6ScewAAAAICApurAAAAqWpgA75NAJu8AAAAwABM3GADvpUAAGADvk0BPgJAISWb5ACBm9fAP/rPYAO9jpvXm+8BJ8AATN1KnBwBHJwjLsAASIoCAAKAnDjAP/rDH5xDvkwCAAKBnFLAP/rPFpxrFpxmgJxgwD/6w4NgvmiJzr5WAADAAGo4BsAAajiBZpy9nMOc6wACwABIigAAAAEDnM6c6wAAAAICApzVAAAAqWpgA75NAJziAAAAwABIqmADvk0AAGADvk0AAAA/+VUAP/ohAD/6oQA/+0AAP/uCAAAABAAAAAGBZgA/+54AP+iuAD/rRAA/8fEAP/SHAD/5NQA/+5sAAAAFAD/7ngAAAAAAAgjAAGo5wABM54FnAAAFgQkAAL1iAAEBAqAfq5eBQAAAwABJOwABAQKuYLxxgZAAAMAAYHIAAQEBjtCBuAAAwABrVwAAgdcAAMAAYgMAAQECwABH5a6VAAAAAgLAAGpEgWeCaYJ4i6cHwABH2gAAAWADwABsVgAAAAEFwABqUAAAAAAEAAADAAAAAAAAAAAAYAPAAGpEAT8BCQEAwABsWgAAAAAIBsAAakaBZ4MZgyaDMwECwABJLwAAAAEDgzODMwAAAAAAAABgA8AAakQABsAAakeBZ4RUhF2EbgECwABJNAAAAAEDhG6EbgAAAAAAAABgA8AAbFsABsAAakiBZ4SphLKEvAEChEEAAAABA4S8hLwAAAAAAAAAYAPAAGxbAAbAAGpKgWeGKoYwhl0AAsAASHQAAAABA4ZBhl0AAAACAgKGSAAAAKlqYAO+TQCGVgAAAIGJYAPAAGB1AABgA75NAAbAAGpLgWeHyIfOh/oAAsAASDUAAAABA4feh/oAAAACAgKH5QAAAKlqYAO+TQCH8wAAAIGJYAPAAGB1AABgA75NAAbAAGpMgWeJLIkyiV4AAsAATOgAAAABA4lCiV4AAAACAgKJSQAAAKlqYAO+TQCJVwAAAIGJYAPAAGB1AABgA75NAAbAAGpNgWeKjIqSircAAsAASEgAAAABA4qbircAAAACAgKKogAAAKlqYAO+TQCKsAAAAIGJYAPAAGB1AABgA75NAAbAAGpOgWeLiouQi6UAAsAASEMAAAABA4uYi6UAAAABAQGLnwAAAKlqYAO+TQAAYAO+TQAAAD/8bwA//JkAP/zDAD/86wA//S0AP/1vAD/9sQA//fMAP/4nAAAACALAAGpRgWeMRIxTkhCHwABH2wAAAWADwABsVgAAAAEFwABqW4FnjGqMcIyEAQAAA4yCjIQAAAAAAAAAYAPAAGpRAT8BCQGMcMAAbFoAAAAABgbAAGpTgWeMz4zYjPUBAMAATOkAAAABA4ztjPUAAAAAAAAAYAPAAGxbAUqM8AEqBsAAalSBZ40kjSyNPQECrTEAAAABA409jT0AAAAAAAAAYAPAAGwfAAbAAGpVgWeNzI3Zji0BAMAASEIAAAABA43iji0AAAAAAAAAYAPAAGpEAT4BPTCN6CSOKQMnwABMxRaOAC6FTsAAbS0nwABM6gbAAGpXgWePX49lj48AAsAASEAAAAABA49zj48AAAACAgKPegAAAKlqYAO+TQCPiAAAAIGJYAPAAGB1AABgA75NAAbAAGpYgWeQ6JDukRgAAsAASEUAAAABA5D8kRgAAAACAgKRAwAAAKlqYAO+TQCREQAAAIGJYAPAAGB1AABgA75NAAbAAGpZgWeR95H9kg4AApUjAAAAAQOSAZIOAAAAAQEBkggAAACpamADvk0AAGADvk0AAAA//qEAP/7QAD/++AA//0AAP/+CAD//xAA///YAAAAGAAMEwABqO4FnkpqSsQbAAEffAGADwABqRAFqkqlgA8AAa2rAASDHBMAAajyBZ5Nik40GwABH4ABgA8AAalEBapN7YAPAAGvfwAEiJwTAAGo9gWeUC5QmBsAATOsAYAPAAGpEAWqUHGADwABrtMABNm8FBsAAaj+BZ5QplC6UvwABwABM7AAAAAEDlEeUvwAAAAEBAZROAAAAqWpgA75NAABgA8AAbFsBPgFKlFkBIh6UYMAAYgUCAAIniHiAlHXAQACrAAAiHpSGwABiBQIAAieBOhaUmoCUlMBAAKuDYL5oAAEelKPAAGIFAgACJ4bDFpS3gJSxwEAAq4NgvmgABsAAakCBZ5TClMeWRwABwABH3gAAAAEDlNuWRwAAAAEBAZTiAAAAqWpgA75NAABgA8AAbFsBPgROlPGU9gAAg75gA8AAbB8BFpT+gJT4wEABOIO+vmVJlQYclRtqlQpgA8AAbB+IbCcBAAGBlR7AQAFPAMAAbDJKlSQBKT9JlTMclUVqlTdgA8AAbB/AAEHRJwEAAYGVSMBAAU8AwABsMj4DTpVelWMAAIGXYAO+lQEWlWuAlWXAQAE4gZe+bU6VfJWCAACBPmADwABsGAEWlYmClYTAQAG5qWu+70qVlQEiIiIWlaGClZzAQAG5tbK++wEiFpW7gpW2wEABubWxvvcAHpXIwABiBQIAAieA9xaV3ICV1sBAATiDYL5oAAEele/AAGz3AgACg5X5wEAB1SeVmwABHpYYwABs9wIAAoOWIsBAAdUnlZwAP0qWOQEqBsAAakGBZ5drl3StgwABvroAAAABA5d/rYMAAAADAgOXjAAAAalqYAO+TQCXmAAAAJWUYAPAAGxbAJesAAAAr9ZgA8AAbFsBape8YAPAAGxbHABgA8AAakQBPg1Ol86X0wAAg2BgA75NARaX24CX1cBAAoaDYL5oSZfjIR6X6MAAakABAAGDl/3AQALDAD4CSZgKFpgYFpgTg5gOwEACw4GXvm21sb73PgJOmD6YTQAAwABJIGADwABqUQEemFnAAGpCAgACg5hvwEACw4KYdcBAAqAASZiLIRyYnoSYj8BAAxEnAQABapihYAPAAGpRwAEiJwDAAGxePgFJmOcigZjrwEACkgEemPfAAGtkAQABFpkfHJkUhJkFwEADEZUjAQABg5kZwEACwwDAAGpZg2C+aAA+AUqZMgEcmXMfmT3AAGvcAgACgJlNwEAChoSZVMBAAxEAwABM7QEAAYGZjcBAApIAwABr1z9Jma8igZmzwEACkgEemb/AAGo/AQABFpneg5nZwEACw4NgvmgAPgJOmfaZ/AAAgT5gA8AAbBgBFpoDg5n+wEACw6+xvmxJmhgiIiIiIR6aHsAAbPcCAAInihKFmi/AQAP4AAAhHppGwABs9wIAAieN0IWaV8BAA/gAACEemm7AAGz3AgACJ5OkhZqDwEAD+AAAIR6amsAAbPcCAAInhYaFmrDAQAP4AAAhIh6ayMAAbPcCAAInhl6Fmt3AQAP4AAAWmvEWmuyDmufAQALDg2C+aK5nvlw+AUqbDQEcm04fmxjAAGvcAgACgJsowEAChoSbL8BAAxEAwABM7QEAAYGbaMBAApIAwABr1z8/SZuQgZuUwEACkj4BSZu4Hpu8wABiBQIAAieA94ObysBAAsMAPgFKnBIBHJx+H5wdwABr3AIAAoCcPsBAAoYenEXAAGpCAgACg5xbwEACw4KcYcBAAqAAAMAATO4BAAGBnJLAQAKSAMAAa9lJnKoiHpyuwABiBQIAAieVlYOcvsBAAsMAAB6c0cAAYg0CAAIWnN6DnNnAQALDg2C+aGqc5F0DwABsGQFgA8AAbBjAATZ2AD4BSp0GARydch+dEcAAa9wCAAKAnTLAQAKGHp05wABqQgIAAoOdT8BAAsOCnVXAQAKgAADAAEztAQABgZ2MwEACkgDAAGvXPz9KnakBap2wYAPAAGpEwAEgxz9Jnb8encPAAGIFAgACJ5Wcg53UwEACwwA+Az2LneHAQALDFp3tg53owEACw4NgvmhJnfcenfvAAGo/AQABg54VwEACwwA+AUqeQwEcnoIfnk7AAGvcAgACgJ5ewEAChmqeZWADwABqUcABIicAwABM7wEAAYGekcBAApIAwABr1D9KnrQBap67YAPAAGpEwAE2bz9JnswentDAAGo/AQABg57qwEACwwA+AUqfDQEcn0ofnxjAAGvcAgACgJ8owEAChmqfL2ADwABqUcABIicAwABM8AIAAoCfW8BAAoaBn2LAQAKSAMAAa9M/Tp+nn7YAAMAASSBgA8AAalEBHp++wABqQgIAAoOf1MBAAsOCn9rAQAKgAEmf7CEcn/+En/DAQAbVJwEAAWqgAmADwABqUcABIicAwABsXj4CSaAaFqAthKAewEAG1cAATOnAAGpTPgI9i6B9wEACwxagnhygk4SghMBABtWVIwEAAYOgmMBAAsMAwABqWYNgvmhJoKoeoK7AAGIFAgACJ43Yg6C8wEACwwA+Aj2LoM3AQALDFqDZg6DUwEACw4NgvmhJoOchHqDswABqPwEAAYOhBsBAAsMAPgJJoRkiIoGhHsBAApIBHqEqwABrZAEAAYOhOMBAAsMAAByhX4ShUMBABtUnAQABaqFiYAPAAGpRwAE2hADAAGxePgFKocEBaqHIYAPAAGpEwAE2iz9Koj0BaqJEYAPAAGpEwAEgxz9JomMhHqJowABqPwEAAYOigsBAAsMAPgJJopMigaKXwEACkgEeoqPAAGtkAQABg6KxwEACwwA+AUqi+gEWoxCEowHAQAbVwABIQsAAalU/SqNkAWqja2ADwABqRMABIMc/P0qkNgEcpHEfpEHAAGvcAgACgKRRwEAChoSkWMBABtUAwABM8QEAAYGkkMBAApIAwABr2D9AHKS4hKSpwEAG1ScBAAFqpLtgA8AAalHAASInAMAAbF6kqaTLAD2LpNDAQALDFqTcg6TXwEACw4NgvmhJpOQepOjAAGIFAgACJ4D3g6T2wEACwwA+BD2LpQPAQALDFqUPg6UKwEACw4NgvmhJpRkepR3AAGpAAQABg6UywEACwwA+BD2MpW/AQAbVHqWAwABqQgIAAoOllsBAAsOCpZzAQAKgAD2LpbLAQALDFqW+g6W5wEACw4NgvmhJpcocpd2Epc7AQAbVJwEAAWql4GADwABqUcABIicAwABsXj4BSaX8HqYAwABiBQIAAieN2IOmDsBAAsMAPgI9i6YhwEACwxamLYOmKMBAAsODYL5oSaY9IR6mQsAAaj8BAAGDplzAQALDAD4BSaZxIoGmdcBAApIBHqaBwABrZAEAAYOmj8BAAsMAPgA+AUqnrQFqp7RgA8AAakTAASDHPz4BSafxIR6n9sAAaj8BAAGDqBDAQALDAD4BSaglIoGoKcBAApIBHqg1wABrZAEAAYOoQ8BAAsMAPgFKqJABaqiXYAPAAGpEwAE2mj4BSqkCAWqpCWADwABqRMABIMc/P0qpZgEcqaMfqXHAAGvcAgACgKmBwEAChoSpiMBABtUAwABM7gEAAYGpt8BAApIAwABr2T9JqfGBqfXAQAKSPgI9jKoHwEAG1R6qGMAAakICAAIWqjkWqjSAqi7AQAKGg2C+aINgvmiCqj/AQAKgAEqqVQEcqpIfqmDAAGvcAgACgKpwwEAChoSqd8BABtUAwABM7gEAAYGqpsBAApIAwABr2T9KqrsBaqrCYAPAAGpEwAEgxz9AHKrnhKrYwEAG1ScBAAFqqupgA8AAalHAASInAMAAbF6q2Kr6AEmq/x6rA8AAaj8BAAGDqx3AQALDAD4BSqtHARyrhB+rUsAAa9wCAAKAq2LAQAKGaqtpYAPAAGpRwAEiJwDAAEzyAQABgauZwEACkgDAAGvVP0mrqx6rr8AAYgUCAAInjdiDq73AQALDAD4CPYurysBAAsMWq9aDq9HAQALDg2C+aEmr4B6r5MAAaj8BAAGDq/7AQALDAD4BSqwyARyscR+sPcAAa9wCAAKArE3AQAKGaqxUYAPAAGpRwAEiJwDAAEzzAQABgayOwEACkgDAAGvWSaykIoGsqMBAApIBHqy0wABrZAEAAYOswsBAAsMAPgFKrOkBaqzwYAPAAGpEwAE2oT9JrRMiga0XwEACkgEerSPAAGtkAQABg60xwEACwwA+AUqtWwFqrWJgA8AAakTAATaoP0qtdAFqrXtgA8AAakTAASDHBsAAakKBZ67GrtmyPwABwABH3QAAAAEDru6yPwAAAAMBA671AAAAqWpgA75NAK8GAAAAr9ZgA8AAbFsBaq8WYAPAAGxbHK8iAAAAwABM9GADwABsWwFqrzNgA8AAbFscAGADwABqUQE+BU6vRa9QAADAAEinYAO+TQEWr1iAr1LAQAyog2C+aEmvYCEer2XAAGIFAgACJ4E6g69zwEAM8QA+AUqvhgFqr41gA8AAalHAASInP06wBrALAACDYGADvk0BFrAYg7ANwEAM8YNgvmhJsCAiHLAvFrAqhLAlwEANPIO+vmUnAQABarAyYAPAAGwfiGwAwABsMgEWsFAWsEuEsEbAQA08gZe+bbWyvvs+AUmwYR6wZcAAYgUCAAIngTsWsHiEsHPAQA08g2C+aAA+AUqwhwFqsI5gA8AAalHAATaESbCuHrCywABiBQIAAieCSxawxoSwwcBADTyDYL5oAD4BSrDVAWqw3GADwABqUcABNq9JsQAesQTAAGIFAgACJ4PXFrEYhLETwEANPINgvmgAPgFKsScBarEuYAPAAGpRwAE2tj9JsVYesVrAAGIFAgACJ4bDhLFowEANPAA+AUqxdQFqsXxgA8AAalHAASInP0qx4gEcsjQfse3AAGwUAwADgLIHwEAMqIGyDsBADLSCsh3AQAzMAMAATPUAAAAAwABsDQbAAGpDgWe0T7RitRgAAcAAR9wAAAABA7R8tRgAAAABAQG0gwAAAKlqYAO+TQAAYAPAAGpRAT4CTrShtKkAAIwFYAPAAGpRAR60q8AAakIBAAGAtMHAQA6wAEq0ywEjHrTSwABiBQIAAieGwxa09By06IG04MBADseVIwEAAYC07cBADrAAwABqWYNgvmgAgbT8wEAOx2q1BmADwABqUcABIicBYAPAAGpRAYFnAEAPOAA//CUAP/5QAEAAFwAAAAIAQACJAEABFgBAAmYAQAyGAEAOjgBADzgAAAAFAAIIwABqXACBaAAAB4DaAACtzIxEAIEFAAC9YgABAQGgH4ExAADAAEk7AAEBAq5gvHiBgAAAwABhpAAAgaMAAMAAYHIAAQEBjtCBywAAwABqOQABAQHAAEfegf8AAMAAYgMAAQECwABH5q6VAAAAGQLAAGphgWiCXIJihhaDwABM9gAAAWADwABhqgAAAAEFwABqZYFogqCCpoLhAQAAA4LFguEAAAAAAAAAYAPAAGphAT8BCQCCysAAYeMBAAEnwABJRwABBsAAamOBaILmgviGFAAAwABIHwFqgudgA8AAbFaAtQAAAQODCIYUAAAAAgICgw8AAACpamADvk0Agx0AAACBiWADwABgdQAAYAO+TQE+Bk6DMYM8AACQJWADvk0BFoNEgIM+wEAQXoNgvmhAIRyDZRaDYIKDVcBAEIGDvr5lJwEAAWqDaGADwABsH4hsAMAAbDKDVYN4AEmDfxaDjoKDg8BAEIGuZ75cPgI9HoOkwABqXgIAAoKDxcBAEIGBg9HAQBBqAEqD4AGCg+fAQBCBPz0chBWBhA7AQBBqwABIDAIAAoKELMBAEIFqhD5gA7LbwABf3QDAAGFNSYRXIh6EW8AAYakBAAGChHPAQBCBAAEehIrAAGIOAgACgoSXwEAQgWqEo10DwABsGQFgA8AAbBjAATa9AD4BSoS+ARyE1RaEzIGExcBAEGqzFcAAYIDAAEgNAQABgITvwEAQXgDAAGo1SYUCIRaFEoKFB8BAEIG1u75ePgFKhbcBHIXOFoXFgYW+wEAQarMVwABggMAASA0BAAGChejAQBCBAMAAajU/SoX/AYKGBsBAEIEAAEAQMQBAEd0AAAABAsAAamaBaIZZhl+Lq4PAAEz3AAABYAPAAGGqAAAAAQXAAGpqgWiGpoash0MBAAADhtSHQwAAAAAAAABgA8AAamYBPwEJAIbfwABh4wMAASfAAEhxAq/WKcAASYkqAQbAAGpogWiHSIdai6kAAMAASB8BaodJYAPAAGxWgLUAAAEDh2qLqQAAAAICAodxAAAAqWpgA75NAId/AAAAgYlgA8AAYHUAAGADvk0BPgVOh5OHngAAkCVgA75NARaHpoCHoMBAEnWDYL5oQCEch8cWh8KCh7fAQBKYg76+ZScBAAFqh8pgA8AAbB+IbADAAGwyh7eH2gBJh+EWh/UWh/CCh+XAQBKYgZe+bbWyvvs+AUqIBwGCiA7AQBKYP0mINSIeiDnAAGpgAQABgohhwEASmAABHoh4wABiDgIAAoKIhcBAEphqiJ1dA8AAbBkBYAPAAGwYwAE2ywA+AT2KiN/AQBKYHIjzgYjswEASgcAASA0DAAKAiQ3AQBJ1LgGAlhyJTmqJM10DsucBYQMBYAO+TWADss/AAH/3jW8BAAGCiVzAQBKYALLrwABgxEmJdRaJiRaJhIKJecBAEpiBl75ttbG+9z4BPRyJo4GJnMBAEoHAAEf8AgACgonOwEASmGqJ4F0DsucBYQMBYAO+TWADss/AAFuHAMAAYU4+Aj0ciiOBihzAQBKBwABH/AIAAoKKTsBAEphqimBdA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOSYqDIRaKk4KKiMBAEpi1u75ePgE9ios+wEASmByLWxaLUoGLS8BAEoGzFcAAYIDAAEgNAQABgot1wEASmADAAGo1P0qLlAGCi5vAQBKYAABAEkgAQBRpAAAAAQLAAGprgWiL1ovckc2DwABM+AAAAWADwABhqgAAAAEFwABqb4FojBaMHIxPAQAAA4w3jE8AAAAAAAAAYAPAAGprAT8BCQCMPMAAYeMBAAEnrIkAAQbAAGptgWiMVIxmkcsAAMAASB8BaoxVYAPAAGxWgLUAAAEDjHaRywAAAAICAox9AAAAqWpgA75NAIyLAAAAgYlgA8AAYHUAAGADvk0BPgVOjJ+MqgAAkCVgA75NARaMsoCMrMBAFPeDYL5oQCEcjNMWjM6CjMPAQBUag76+ZScBAAFqjNZgA8AAbB+IbADAAGwyjMOM5gBJjW8WjX6CjXPAQBUarme+XD4BSY2UIiEejZnAAGpgAQABgo3BwEAVGgABHo3awABiDgIAAhaN8oKN58BAFRqDYL5oao34XQPAAGwZAWADwABsGMABNukAPgFKjhQBgo4bwEAVGj8/SY8qIh6PLsAAYg4CAAKCjzvAQBUaao9HXQPAAGwZAWADwABsGMABNukAAR6PY8AAamABAAGCj4vAQBUaAD4BPYqPoMBAFRocj7SBj63AQBUDwABIDQMAAoCPzsBAFPcuAYCWHJAPao/0XQOy5wFhAwFgA75NYAOyz8AAf/eNbwEAAYKQHcBAFRoAsuvAAGDEPgI9HJBFgZA+wEAVA8AAR/wCAAKCkHDAQBUaapCCXQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTkmQpSEWkLWCkKrAQBUatbu+Xj4BPYqRYMBAFRockX0WkXSBkW3AQBUDsxXAAGCAwABIDQEAAYKRl8BAFRoAwABqNT9KkbYBgpG9wEAVGgAAQBTKAEAW3QAAAAECwABqcIFoko6SlJb9g8AATPkAAAFgA8AAYaoAAAADBcAAanSBaJLYkt6TQwEAAAOTA5NDAAAAAAAAAGADwABqcAE/AQkAkw7AAGHjAgABJ76TAa/UKQXAAGp1gWiTSJNOk8oBjMoAA5OAk8oAAAAAAAAAYAPAAGpwAT8BCQCTi8AAYeMCAAEnwABI0QHAAEmIKQXAAGp2gWiTz5PVlIEBwABM+gADlBmUgQAAAAAAAABgA8AAanABPwEJAJQkwABh4wIAASfAAEjSAcAASYgpAQbAAGpygWiUhpSYlvsAAMAASB8BapSHYAPAAGxWgLUAAAEDlKiW+wAAAAICApSvAAAAqWpgA75NAJS9AAAAgYlgA8AAYHUAAGADvk0BPgVOlNGU3AAAkCVgA75NARaU5ICU3sBAF+iDYL5oQCEclQUWlQCClPXAQBgLg76+ZScBAAFqlQhgA8AAbB+IbADAAGwylPWVGABJlR8WlS6ClSPAQBgLrme+XD4CPR6VRMAAal4CAAKClWXAQBgLgZVxwEAX9ABKlYABgpWHwEAYCz9Jla4hFpW+gpWzwEAYC7W7vl4+AT2Kld3AQBgLHJXxgZXqwEAX9MAASA0DAAKAlgvAQBfoLgGAlhyWTGqWMV0DsucBYQMBYAO+TWADss/AAH/3jW8BAAGCllrAQBgLALLrwABgxD4BPRyWgoGWe8BAF/TAAEf8AgACgpatwEAYC2qWv10DsucBYQMBYAO+TWADss/AAH/3AMAAYU5KluYBgpbtwEAYCwAAQBe7AEAZMgAAAAECwABqd4FolyiXLp1fg8AATPsAAAFgA8AAYaoAAAACBcAAanuBaJdol26XoQEAAAOXiZehAAAAAAAAAGADwABqdwE/AQkAl47AAGHjAQABJ7pHAAXAAGp8gWiXppesmBQBjMoAA5fUmBQAAAAAAAAAYAPAAGp3AT8BCQCX38AAYeMCAAEnwABIMAHAAEmIKQEGwABqeYFomBmYK51dAADAAEgfAWqYGmADwABsVoC1AAABA5g7nV0AAAACAgKYQgAAAKlqYAO+TQCYUAAAAIGJYAPAAGB1AABgA75NAT4FTphkmG8AAJAlYAO+TQEWmHeAmHHAQBn8g2C+aEAhHJiYFpiTgpiIwEAaH4O+vmUnAQABapibYAPAAGwfiGwAwABsMpiImKsASZj0FpkDgpj4wEAaH65nvlw+AUmaHSIhFpotgpoiwEAaH7W0vmIBHppMwABiDgIAAhaaZIKaWcBAGh+DYL5oappqXQPAAGwZAWADwABsGMABNwcAPgFKmoYBgpqNwEAaHz8/SZq8Ih6awMAAamABAAGCmujAQBofAAEemv/AAGIOAgACgpsMwEAaH2qbGF0DwABsGQFgA8AAbBjAATcHAD4BPYqbMsBAGh8cm0aBmz/AQBoIwABIDQMAAoCbYMBAGfwuAYCWHJuhapuGXQOy5wFhAwFgA75NYAOyz8AAf/eNbwEAAYKbr8BAGh8AsuvAAGDEPgI9HJvXgZvQwEAaCMAAR/wCAAKCnALAQBofapwUXQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTkmcNyEWnEeCnDzAQBoftbu+Xj4BPYqc8sBAGh8cnQ8WnQaBnP/AQBoIsxXAAGCAwABIDQEAAYKdKcBAGh8AwABqNT9KnUgBgp1PwEAaHwAAQBnPAEAb3gAAAAECwABqfYFonY+dlaKRg8AATPwAAAFgA8AAYaoAAAABBcAAaoGBaJ3UndqeYQEAAAOd+p5hAAAAAAAAAGADwABqfQE/AQkAngXAAGHjAwABJ8AASG8Cr9YpwABJiSoBBsAAan+BaJ5mnniijwAAwABIHwFqnmdgA8AAbFaAtQAAAQOeiKKPAAAAAgICno8AAACpamADvk0Anp0AAACBiWADwABgdQAAYAO+TQE+BU6esZ68AACQJWADvk0BFp7EgJ6+wEAcdoNgvmhAIRye5Rae4IKe1cBAHJmDvr5lJwEAAWqe6GADwABsH4hsAMAAbDKe1Z74AEme/xafExafDoKfA8BAHJmBl75ttbK++z4BSp8lAYKfLMBAHJk/SZ9TIh6fV8AAamABAAGCn3/AQByZAAEen5bAAGIOAgACgp+jwEAcmWqfr10DwABsGQFgA8AAbBjAATcZAD4BPYqfxcBAHJkcn9mBn9LAQByCwABIDQMAAoCf88BAHHYuAYCWHKA0aqAZXQOy5wFhAwFgA75NYAOyz8AAf/eNbwEAAYKgQsBAHJkAsuvAAGDESaBbFqBvFqBqgqBfwEAcmYGXvm21sb73PgE9HKCJgaCCwEAcgsAAR/wCAAKCoLTAQByZaqDGXQOy5wFhAwFgA75NYAOyz8AAW4cAwABhTj4CPRyhCYGhAsBAHILAAEf8AgACgqE0wEAcmWqhRl0DsucBYQMBYAO+TWADss/AAH/3AMAAYU5JoWkhFqF5gqFuwEAcmbW7vl4+AT2KoiTAQByZHKJBFqI4gaIxwEAcgrMVwABggMAASA0BAAGColvAQByZAMAAajU/SqJ6AYKigcBAHJkAAEAcSQBAHmoAAAABAsAAaoKBaKLGosymm4PAAEz9AAABYAPAAGGqAAAAAQXAAGqGgWijEKMWo3gBAAADozujeAAAAAAAAABgA8AAaoIBPwEJAKNGwABh4wIAASfAAEhwAa/WKQEGwABqhIFoo32jj6aZAADAAEgfAWqjfmADwABsVoC1AAABA6OfppkAAAACAgKjpgAAAKlqYAO+TQCjtAAAAIGJYAPAAGB1AABgA75NAT4GTqPIo9MAAJAlYAO+TQEWo9uAo9XAQB79g2C+aEAhHKP8FqP3gqPswEAfIIO+vmUnAQABaqP/YAPAAGwfiGwAwABsMqPspA8ASaQWFqQlgqQawEAfIK5nvlw+AUqkOwGCpELAQB8gPz0cpHCBpGnAQB8JwABH/AIAAoKkmcBAHyBqpKtdA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOSaTMIh6k0MAAamABAAGCpPjAQB8gAAEepQ/AAGIOAgACgqUcwEAfIGqlKF0DwABsGQFgA8AAbBjAATclAD4BSqVDARylWhalUYGlSsBAHwmzFcAAYIDAAEgNAQABgKV0wEAe/QDAAGo1SaWHIRall4KljMBAHyC1u75ePgFKpjwBHKZTFqZKgaZDwEAfCbMVwABggMAASA0BAAGCpm3AQB8gAMAAajU/SqaEAYKmi8BAHyAAAEAe0ABAIG4AAAABAsAAaoeBaKbGpsyvPYPAAEz+AAABYAPAAGGqAAAAAgXAAGqLgWinBqcMp10BAAADpyenXQAAAAAAAABgA8AAaocBPwEJAKcywABh4wIAASeFfgGv1CkFwABqjIFop2KnaKfQAYzKAAOnkKfQAAAAAAAAAGADwABqhwE/AQkAp5vAAGHjAgABJ8AASKQBwABJiCkBBsAAaomBaKfVp+evOwAAwABIHwFqp9ZgA8AAbFaAtQAAAQOn9687AAAAAgICp/4AAACpamADvk0AqAwAAACBiWADwABgdQAAYAO+TQE+Bk6oIKgrAACQJWADvk0BFqgzgKgtwEAhO4NgvmhAIRyoVBaoT4KoRMBAIV6Dvr5lJwEAAWqoV2ADwABsH4hsAMAAbDKoRKhnAEmobhaofYKocsBAIV6uZ75cPgJJqJMiHqiXwABiBQIAAieVdoKoqcBAIV4AABaoyBaow4KouMBAIV6DYL5orme+XD4CPRyp3IGp1cBAIUfAAEf8AgACgqoJwEAhXmqqG10DsucBYQMBYAO+TWADss/AANcDAMAAYU5Kqu8BFqsBgqr2wEAhXoNgvmg+AT0eqx7AAGpeAgACgqs/wEAhXoGrS8BAIUcASqtiAYKracBAIV4/PRyrl4GrkMBAIUfAAEf8AgACgqvAwEAhXmqr0l0DsucBYQMBYAO+TWADss/AAH/3AMAAYU5Jq/MiIh6r98AAYgUCAAIntimArAbAQCE7AAAWrCOCrBjAQCFetbq+XQAcrE0WrEgWrEOCrDjAQCFeg2C+aIO+vmUnAQABaqxQYAPAAGwfh1sAwABsMj4BSqyiAYKsqcBAIV5JrMAhHqzFwABhqQEAAYKs3cBAIV4APgFJrPIWrQGCrPbAQCFetbu+Xj4BSa0iIhatJi7AAEmIwABh2gEhHq05wABiDgIAAoKtRsBAIV5qrVJdA8AAbBkBYAPAAGwYwAE3MwA+AUqtcwGCrXrAQCFeP0mtnSIhFq2tgq2iwEAhXrC/vmAAIR6txsAAYg4CAAKCrdPAQCFeaq3tXQPAAGwZAWADwABsGMABN0MAPgI9iK5+wEAhO4KuhsBAIV49iq6awEAhXhaurYCup8BAITuDYL5oPz9KrwABHK8XFq8Oga8HwEAhR7MVwABggMAASA0BAAGArzHAQCE7AMAAajUAAEAhDgBAI+8AAAABAsAAao2BaK9ur3Szu4PAAEz/AAABYAPAAGGqAAAAAQXAAGqRgWivtK+6sBQBAAADr9uwFAAAAAAAAABgA8AAao0BPwEJAK/mwABh4wIAASev2AGv1ikBBsAAao+BaLAZsCuzuQAAwABIHwFqsBpgA8AAbFaAtQAAAQOwO7O5AAAAAgICsEIAAACpamADvk0AsFAAAACBiWADwABgdQAAYAO+TQE+BE6wZLBvAACQJWADvk0BFrB3gLBxwEAkgINgvmhAIRywmBawk4KwiMBAJKODvr5lJwEAAWqwm2ADwABsH4hsAMAAbDKwiLCrAEmwshawwYKwtsBAJKOuZ75cPgFKsNcBgrDewEAkoz9JsQUiHrEJwABiDgIAAoKxFsBAJKNqsSJdA8AAbBkBYAPAAGwYwAE3dQABHrFJwABqXwEAAYKxacBAJKMAPgFKsX4BHLGMgbGFwEAkjMAASA0CAAKAsabAQCSALgDAAGDESbG/IRaxz4KxxMBAJKO1u75ePgFKsnQBHLKCgbJ7wEAkjMAASA0EAAKCspzAQCSjLgKAlhyy4mqyx10DsucBYQMBYAO+TWADss/AAH/3jW8BAAGCsvDAQCSjALLrwABIi4KzF8BAJKPAAGDEPgI9HLM+gbM3wEAkjMAAR/wCAAKCs2nAQCSjarN7XQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTkqzngGCs6XAQCSjAABAJFMAQCYYAAAAAQLAAGqSgWiz7LPytoGDwABNAAAAAWADwABhqgAAAAEFwABqloFotDK0OLSTAQAAA7RZtJMAAAAAAAAAYAPAAGqSAT8BCQC0ZMAAYeMCAAEnwABIZgHAAEmIKQEGwABqlIFotJi0qrZ/AADAAEgfAWq0mWADwABsVoC1AAABA7S6tn8AAAACAgK0wQAAAKlqYAO+TQC0zwAAAIGJYAPAAGB1AABgA75NAT4GQB605MAAYgUCAAIngPeAtPLAQCatALTktPgATrUFtRAAAJAlYAO+TQEWtRiAtRLAQCatg2C+aEAhHLU5FrU0grUpwEAm64O+vmUnAQABarU8YAPAAGwfiGwAwABsMrUptUwASbVTFrVigrVXwEAm665nvlw+AUq1eAGCtX/AQCbrPz0cta2BtabAQCa5wABH/AIAAoK11sBAJutqtehdA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOSrZEARy2Wxa2UoG2S8BAJrmzFcAAYIDAAEgNAQABgLZ1wEAmrQDAAGo1AABAJoAAQCewAAAAAQLAAGqXgWi2vLbCvBGDwABNAQAAAWADwABhqgAAAAEFwABqm4Fotwy3EreAAQAAA7c9t4AAAAAAAAAAYAPAAGqXAT8BCQC3SMAAYeMCAAEnwABIZQGv1ikBBsAAapmBaLeFt5e8DwAAwABIHwFqt4ZgA8AAbFaAtQAAAQO3p7wPAAAAAgICt64AAACpamADvk0At7wAAACBiWADwABgdQAAYAO+TQE+BU630LfbAACQJWADvk0BFrfjgLfdwEAoQ4NgvmhAIRy4BBa3/4K39MBAKGaDvr5lJwEAAWq4B2ADwABsH4hsAMAAbDK39LgXAEm4Hha4LYK4IsBAKGauZ75cPgI9HrhDwABqXgIAAoK4ZMBAKGaBuHDAQChPAEq4fwGCuIbAQChmP0m5RyIiHrlLwABqXwEAAYK5a8BAKGYAAR65gsAAYakBAAGCuZrAQChmAAEeubHAAGIOAgACgrm+wEAoZmq5yl0DwABsGQFgA8AAbBjAATeLAD4BPYq55MBAKGYcufiBufHAQChPwABIDQMAAoC6EsBAKEMuAYCWHLpTaro4XQOy5wFhAwFgA75NYAOyz8AAf/eNbwEAAYK6YcBAKGYAsuvAAGDEPgI9HLqJgbqCwEAoT8AAR/wCAAKCurTAQChmarrGXQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTkm66SEWuvmCuu7AQChmtbu+Xj4BPYq7pMBAKGYcu8EWu7iBu7HAQChPsxXAAGCAwABIDQEAAYK728BAKGYAwABqNT9Ku/oBgrwBwEAoZgAAQCgWAEAqDwAAAAECwABqnIFovEm8T8AAQhODwABNAgAAAWADwABhqgAAAAEFwABqoIFovIu8kb0dAQAAA7yuvR0AAAAAAAAAYAPAAGqcAT8BCQC8ucAAYeMDAAEnwABIIAKv1inAAEmJKgEGwABqnoFovSK9NMAAQhEAAMAASB8Bar0jYAPAAGxWgLUAAAEDvUTAAEIRAAAAAgICvUsAAACpamADvk0AvVkAAACBiWADwABgdQAAYAO+TQE+BU69bb14AACQJWADvk0BFr2AgL16wEAqrYNgvmhAIRy9oRa9nIK9kcBAKtCDvr5lJwEAAWq9pGADwABsH4hsAMAAbDK9kb20AEm9uxa9zxa9yoK9v8BAKtCBl75ttbK++z4BSr3hAYK96MBAKtA/Sb6XIha+qxa+poK+m8BAKtCBl75ttbG+9wAevsDAAGIOAgACFr7Ygr7NwEAq0INgvmhqvt5dA8AAbBkBYAPAAGwYwAE3tQA+AT0cvv+BvvjAQCq5wABH/AIAAoK/KsBAKtBqvzxdA7LnAWEDAWADvk1gA7LPwABbhwDAAGFOSb9wIh6/dMAAamABAAGCv5zAQCrQAAEev7PAAGIOAgACgr/AwEAq0Gq/zF0DwABsGQFgA8AAbBjAATe1AD4BPYq/5sBAKtAcv/qBv/PAQCq5wABIDQMAAoDAAEAUwEAqrS4BgJYcwABAVWrAAEA6XQOy5wFhAwFgA75NYAOyz8AAf/eNbwEAAYLAAEBjwEAq0ACy68AAYMQ+Aj0cwABAi4HAAECEwEAqucAAR/wCAAKCwABAtsBAKtBqwABAyF0DsucBYQMBYAO+TWADss/AAH/3AMAAYU5JwABA6yEWwABA+4LAAEDwwEAq0LW7vl4+AT2KwABBpsBAKtAcwABBwxbAAEG6gcAAQbPAQCq5sxXAAGCAwABIDQEAAYLAAEHdwEAq0ADAAGo1P0rAAEH8AYLAAEIDwEAq0AAAQCp8AEAs9AAAAAECwABqoYFowABCFsAAQhzAAES7g8AATQMAAAFgA8AAYaoAAAACBcAAaqWBaMAAQlnAAEJfwABCrgEAAAPAAEJ9wABCrgAAAAAAAABgA8AAaqEBPwEJAMAAQojAAGHjAgABJ8AASScBwABJhykFwABqpoFowABCs8AAQrnAAENDAYzKAAPAAELkwABDQwAAAAAAAABgA8AAaqEBPwEJAMAAQu/AAGHjAwABJ8AASSgCwABJhynAAEmIKQEGwABqo4FowABDSMAAQ1rAAES5AADAAEgfAWrAAENJYAPAAGxWgLUAAAEDwABDasAARLkAAAACAgLAAENxAAAAqWpgA75NAMAAQ38AAACBiWADwABgdQAAYAO+TQE+BE7AAEOTwABDngAAkCVgA75NARbAAEOmgMAAQ6DAQC30g2C+aEAhHMAAQ8cWwABDwoLAAEO3wEAuG4O+vmUnAQABasAAQ8pgA8AAbB+IbADAAGwywABDt8AAQ9oAScAAQ+EWwABD8ILAAEPlwEAuG65nvlw+AUrAAEQGAYLAAEQNwEAuGz9KwABENAEcwABEQoHAAEQ7wEAuAsAASA0DAAKAwABEXMBALfQuAYCWHMAARJtqwABEgF0DsucBYQMBYAO+TWADss/AAH/3jW8BAAGCwABEqcBALhsAsuvAAGDEAABALbsAQC76AAAAAQLAAGqngWjAAEU1wABFO8AASm+DwABNBAAAAWADwABhqgAAAAIFwABqq4FowABFg8AARYnAAEXzAQAAA8AARbLAAEXzAAAAAAAAAGADwABqpwE/AQkAwABFvcAAYeMCAAEnwABIzgGv1ikFwABqrIFowABF+MAARf7AAEajAYzKAAPAAEY0wABGowAAAAAAAABgA8AAaqcBPwEJAMAARj/AAGHjAwABJ8AASYUCr9YpwABJiCkBBsAAaqmBaMAARqjAAEa6wABKbQAAwABIHwFqwABGqWADwABsVoC1AAABA8AARsrAAEptAAAAAgICwABG0QAAAKlqYAO+TQDAAEbfAAAAgYlgA8AAYHUAAGADvk0BPgVOwABG88AARv4AAJAlYAO+TQEWwABHBoDAAEcAwEAv9oNgvmhAIRzAAEcnFsAARyKCwABHF8BAMB2Dvr5lJwEAAWrAAEcqYAPAAGwfiGwAwABsMsAARxfAAEc6AEnAAEdBFsAAR1CCwABHRcBAMB2uZ75cPgI9HsAAR2bAAGpeAgACgsAAR4fAQDAdgcAAR5PAQDAEAErAAEeiAYLAAEepwEAwHT9JwABH0CIewABH1MAAYg4CAAKCwABH4cBAMB1qwABH7V0DwABsGQFgA8AAbBjAATfVAAEewABIFcAAYakBAAGCwABILcBAMB0APgE9isAASELAQDAdHMAASFaBwABIT8BAMATAAEgNAwACgMAASHDAQC/2LgGAlhzAAEixasAASJZdA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAASL/AQDAdALLrwABgxD4CPRzAAEjngcAASODAQDAEwABH/AIAAoLAAEkSwEAwHWrAAEkkXQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTknAAElHIRbAAElXgsAASUzAQDAdtbu+Xj4BPYrAAEoCwEAwHRzAAEofFsAAShaBwABKD8BAMASzFcAAYIDAAEgNAQABgsAASjnAQDAdAMAAajU/SsAASlgBgsAASl/AQDAdAABAL70AQDIMAAAAAQLAAGqtgWjAAEqgwABKpsAATwKDwABNBQAAAWADwABhqgAAAAEFwABqsYFowABK5sAASuzAAEtGAQAAA8AASw3AAEtGAAAAAAAAAGADwABqrQE/AQkAwABLGMAAYeMCAAEnwABI8QGv1ikBBsAAaq+BaMAAS0vAAEtdwABPAAAAwABIHwFqwABLTGADwABsVoC1AAABA8AAS23AAE8AAAAAAgICwABLdAAAAKlqYAO+TQDAAEuCAAAAgYlgA8AAYHUAAGADvk0BPgVOwABLlsAAS6EAAJAlYAO+TQEWwABLqYDAAEujwEAyvYNgvmhAIRzAAEvKFsAAS8WCwABLusBAMuSDvr5lJwEAAWrAAEvNYAPAAGwfiGwAwABsMsAAS7rAAEvdAEnAAEvkFsAAS/OCwABL6MBAMuSuZ75cPgI9HsAATAnAAGpeAgACgsAATCrAQDLkgcAATDbAQDLLAErAAExFAYLAAExMwEAy5D9JwABMcyIewABMd8AAYg4CAAKCwABMhMBAMuRqwABMkF0DwABsGQFgA8AAbBjAATftAAEewABMqMAAYakBAAGCwABMwMBAMuQAPgE9isAATNXAQDLkHMAATOmBwABM4sBAMsvAAEgNAwACgMAATQPAQDK9LgGAlhzAAE1EasAATSldA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAATVLAQDLkALLrwABgxD4CPRzAAE16gcAATXPAQDLLwABH/AIAAoLAAE2lwEAy5GrAAE23XQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTknAAE3aIRbAAE3qgsAATd/AQDLktbu+Xj4BPYrAAE6VwEAy5BzAAE6yFsAATqmBwABOosBAMsuzFcAAYIDAAEgNAQABgsAATszAQDLkAMAAajU/SsAATusBgsAATvLAQDLkAABAMoQAQDTTAAAAAQLAAGqygWjAAE8xwABPN8AAU0ODwABNBgAAAWADwABhqgAAAAEFwABqtoFowABPdcAAT3vAAE+2AQAAA8AAT5rAAE+2AAAAAAAAAGADwABqsgE/AQkAwABPn8AAYeMBAAEnwABJUgABBsAAarSBaMAAT7vAAE/NwABTQQAAwABIHwFqwABPvGADwABsVoC1AAABA8AAT93AAFNBAAAAAgICwABP5AAAAKlqYAO+TQDAAE/yAAAAgYlgA8AAYHUAAGADvk0BPgVOwABQBsAAUBEAAJAlYAO+TQEWwABQGYDAAFATwEA1gYNgvmhAIRzAAFA6FsAAUDWCwABQKsBANaiDvr5lJwEAAWrAAFA9YAPAAGwfiGwAwABsMsAAUCrAAFBNAEnAAFBUFsAAUGOCwABQWMBANaiuZ75cPgI9HsAAUHnAAGpeAgACgsAAUJrAQDWogcAAUKbAQDWPAErAAFC1AYLAAFC8wEA1qD9JwABQ4x7AAFDnwABiDgIAAoLAAFD0wEA1qGrAAFEAXQPAAGwZAWADwABsGMABN/kAPgE9isAAURbAQDWoHMAAUSqBwABRI8BANY/AAEgNAwACgMAAUUTAQDWBLgGAlhzAAFGFasAAUWpdA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAAUZPAQDWoALLrwABgxD4CPRzAAFG7gcAAUbTAQDWPwABH/AIAAoLAAFHmwEA1qGrAAFH4XQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTknAAFIbIRbAAFIrgsAAUiDAQDWotbu+Xj4BPYrAAFLWwEA1qBzAAFLzFsAAUuqBwABS48BANY+zFcAAYIDAAEgNAQABgsAAUw3AQDWoAMAAajU/SsAAUywBgsAAUzPAQDWoAABANUgAQDd/AAAAAQLAAGq3gWjAAFP7wABUAcAAW52DwABNBwAAAWADwABhqgAAAAQFwABqu4FowABUOMAAVD7AAFSZAQAAA8AAVFbAAFSZAAAAAAAAAGADwABqtwE/AQkAwABUYcAAYeMCAAEnhjoBwABJhikFwABqvIFowABUnsAAVKTAAFU6AYzKAAPAAFTJwABVOgAAAAAAAABgA8AAarcBPwEJAMAAVNTAAGHjAwABJ8AASBsCwABJhinAAEmIKQXAAGq9gWjAAFU/wABVRcAAVaYBwABIOgADwABVZsAAVaYAAAAAAAAAYAPAAGq3AT8BCQDAAFVxwABh4wIAASfAAEg6AcAASYYpBcAAar6BaMAAVavAAFWxwABWTAHAAEg7AAPAAFXewABWTAAAAAAAAABgA8AAarcBPwEJAMAAVenAAGHjAwABJ8AASDsCwABJhinAAEmIKQEGwABquYFowABWUcAAVmPAAFubAADAAEgfAWrAAFZSYAPAAGxWgLUAAAEDwABWc8AAW5sAAAACAgLAAFZ6AAAAqWpgA75NAMAAVogAAACBiWADwABgdQAAYAO+TQE+BU7AAFacwABWpwAAkCVgA75NARbAAFavgMAAVqnAQDkWg2C+aEAhHMAAVtAWwABWy4LAAFbAwEA5PYO+vmUnAQABasAAVtNgA8AAbB+IbADAAGwywABWwMAAVuMAScAAVyYWwABXNYLAAFcqwEA5Pa5nvlw+Ak7AAFdRwABXVgAAg2BgA75NARbAAFdjgsAAV1jAQDk9g2C+aEnAAFdvIiEewABXdMAAamABAAGCwABXnMBAOT0AAR7AAFe1wABiDgIAAoPAAFfCwEA5smrAAFfIXQPAAGwZAWADwABsGMABOAUAPgFKwABX5AGCwABX68BAOT0/P0nAAFj6Ih7AAFj+wABiDgIAAoLAAFkLwEA5PWrAAFkXXQPAAGwZAWADwABsGMABOAUAAR7AAFkzwABqYAEAAYLAAFlbwEA5PQA+AT2KwABZcMBAOT0cwABZhIHAAFl9wEA5JMAASA0DAAKAwABZnsBAORYuAYCWHMAAWd9qwABZxF0DsucBYQMBYAO+TWADss/AAH/3jW8BAAGCwABZ7cBAOT0AsuvAAGDEPgI9HMAAWhWBwABaDsBAOSTAAEf8AgACgsAAWkDAQDk9asAAWlJdA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOScAAWnUhFsAAWoWCwABaesBAOT21u75ePgE9isAAWzDAQDk9HMAAW00WwABbRIHAAFs9wEA5JLMVwABggMAASA0BAAGCwABbZ8BAOT0AwABqNT9KwABbhgGCwABbjcBAOT0AAEA43QBAO30AAAABAsAAar+BaMAAW9bAAFvcwABgj4PAAE0IAAABYAPAAGGqAAAAAQXAAGrDgWjAAFwkwABcKsAAXJQBAAADwABcU8AAXJQAAAAAAAAAYAPAAGq/AT8BCQDAAFxewABh4wIAASfAAEk7Aa/WKQEGwABqwYFowABcmcAAXKvAAGCNAADAAEgfAWrAAFyaYAPAAGxWgLUAAAEDwABcu8AAYI0AAAACAgLAAFzCAAAAqWpgA75NAMAAXNAAAACBiWADwABgdQAAYAO+TQE+BU7AAFzkwABc7wAAkCVgA75NARbAAFz3gMAAXPHAQDwug2C+aEAhHMAAXRgWwABdE4LAAF0IwEA8VYO+vmUnAQABasAAXRtgA8AAbB+IbADAAGwywABdCMAAXSsAScAAXTIWwABdQYLAAF02wEA8Va5nvlw+Aj0ewABdV8AAal4CAAKCwABdeMBAPFWBwABdhMBAPDwASsAAXZMBgsAAXZrAQDxVP0nAAF3BIiIewABdxcAAYg4CAAKCwABd0sBAPFVqwABd3l0DwABsGQFgA8AAbBjAATgVAAEewABeCsAAYakBAAGCwABeIsBAPFUAARzAAF5JFsAAXkSCwABeOcBAPFWDvr5lJwEAAWrAAF5MYAPAAGwfh1sAwABsMj4BPYrAAF5iwEA8VRzAAF52gcAAXm/AQDw8wABIDQMAAoDAAF6QwEA8Li4BgJYcwABe0WrAAF62XQOy5wFhAwFgA75NYAOyz8AAf/eNbwEAAYLAAF7fwEA8VQCy68AAYMQ+Aj0cwABfB4HAAF8AwEA8PMAAR/wCAAKCwABfMsBAPFVqwABfRF0DsucBYQMBYAO+TWADss/AAH/3AMAAYU5JwABfZyEWwABfd4LAAF9swEA8VbW7vl4+AT2KwABgIsBAPFUcwABgPxbAAGA2gcAAYC/AQDw8sxXAAGCAwABIDQEAAYLAAGBZwEA8VQDAAGo1P0rAAGB4AYLAAGB/wEA8VQAAQDv1AEA+cwAAAAECwABqxIFowABhNcAAYTvAAGc7g8AATQkAAAFgA8AAYaoAAAADBcAAasiBaMAAYXzAAGGCwABh4QEAAAPAAGGkwABh4QAAAAAAAABgA8AAasQBPwEJAMAAYa/AAGHjAgABJ8AASD0Br9QpBcAAasmBaMAAYebAAGHswABiWQGMygADwABiG8AAYlkAAAAAAAAAYAPAAGrEAT8BCQDAAGImwABh4wIAASfAAEg/AcAASYgpBcAAasqBaMAAYl7AAGJkwABi9QHAAEz6AAPAAGKlwABi9QAAAAAAAABgA8AAasQBPwEJAMAAYrDAAGHjAgABJ8AASEEBwABJiCkBBsAAasaBaMAAYvrAAGMMwABnOQAAwABIHwFqwABi+2ADwABsVoC1AAABA8AAYxzAAGc5AAAAAgICwABjIwAAAKlqYAO+TQDAAGMxAAAAgYlgA8AAYHUAAGADvk0BPgVOwABjRcAAY1AAAJAlYAO+TQEWwABjWIDAAGNSwEA/toNgvmhAIRzAAGN5FsAAY3SCwABjacBAP92Dvr5lJwEAAWrAAGN8YAPAAGwfiGwAwABsMsAAY2nAAGOMAEnAAGOTFsAAY6KCwABjl8BAP92uZ75cPgI9HsAAY7jAAGpeAgACgsAAY9nAQD/dgcAAY+XAQD/EAErAAGP0AYLAAGP7wEA/3T9JwABkIiIiIh7AAGQmwABiDgIAAoLAAGQzwEA/3WrAAGQ/XQPAAGwZAWADwABsGMABOC8AAR7AAGRrwABqYAEAAYLAAGSTwEA/3QABHsAAZKrAAGpfAQABgsAAZMrAQD/dAAEewABk4cAAYakBAAGCwABk+cBAP90APgE9isAAZQ7AQD/dHMAAZSKBwABlG8BAP8TAAEgNAwACgMAAZTzAQD+2LgGAlhzAAGV9asAAZWJdA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAAZYvAQD/dALLrwABgxD4CPRzAAGWzgcAAZazAQD/EwABH/AIAAoLAAGXewEA/3WrAAGXwXQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTknAAGYTIRbAAGYjgsAAZhjAQD/dtbu+Xj4BPYrAAGbOwEA/3RzAAGbrFsAAZuKBwABm28BAP8SzFcAAYIDAAEgNAQABgsAAZwXAQD/dAMAAajU/SsAAZyQBgsAAZyvAQD/dAABAP30AQEH8AAAAAQLAAGrLgWjAAGfSwABn2MAAbiCDwABNCgAAAWADwABhqgAAAAMFwABqz4FowABoGcAAaB/AAGh7AQAAA8AAaEHAAGh7AAAAAAAAAGADwABqywE/AQkAwABoTMAAYeMCAAEnwABIkwGv1ikFwABq0IFowABogMAAaIbAAGkdAYzKAAPAAGi1wABpHQAAAAAAAABgA8AAassBPwEJAMAAaMDAAGHjAwABJ8AASLwCr9YpwABJiCkFwABq0YFowABpIsAAaSjAAGmMAcAASYQAA8AAaVfAAGmMAAAAAAAAAGADwABqywE/AQkAwABpYsAAYeMCAAEnwABJhAGv1ikBBsAAas2BaMAAaZHAAGmjwABuHgAAwABIHwFqwABpkmADwABsVoC1AAABA8AAabPAAG4eAAAAAgICwABpugAAAKlqYAO+TQDAAGnIAAAAgYlgA8AAYHUAAGADvk0BPgROwABp3MAAaecAAJAlYAO+TQEWwABp74DAAGnpwEBDQINgvmhAIRzAAGoQFsAAaguCwABqAMBAQ2eDvr5lJwEAAWrAAGoTYAPAAGwfiGwAwABsMsAAagDAAGojAEnAAGoqFsAAajmCwABqLsBAQ2euZ75cPgFKwABqTwGCwABqVsBAQ2c/ScAAan0iFsAAaoyCwABqgcBAQ2eucr5jACEWwABqqC7AAEmIwABh2j4BSsAAasABHMAAas6BwABqx8BAQ07AAEgNBAACgsAAaujAQENnLgKAlmrAAGsTYAOy28AArVnAAEiLgsAAa0zAQENnwABgxEnAAGtkIh7AAGtowABiDgIAAoLAAGt1wEBDZ2rAAGuBXQPAAGwZAWADwABsGMABOEsAAR7AAGuuwABqXwEAAYLAAGvOwEBDZwA+AUrAAGvjARzAAGvxgcAAa+rAQENOwABIDQIAAoDAAGwLwEBDQC4AwABgxEnAAGwkIRbAAGw0gsAAbCnAQENntbu+Xj4BSsAAbNkBHMAAbOeBwABs4MBAQ07AAEgNBAACgsAAbQHAQENnLgKAlhzAAG1HasAAbSxdA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAAbVXAQENnALLrwABIi4LAAG18wEBDZ8AAYMQ+Aj0cwABto4HAAG2cwEBDTsAAR/wCAAKCwABtzsBAQ2dqwABt4F0DsucBYQMBYAO+TWADss/AAH/3AMAAYU5KwABuAwGCwABuCsBAQ2cAAEBDBwBARaAAAAABAsAAatKBaMAAblfAAG5dwAByqoPAAE0LAAABYAPAAGGqAAAAAQXAAGrWgWjAAG6jwABuqcAAbx0BAAADwABu0MAAbx0AAAAAAAAAYAPAAGrSAT8BCQDAAG7bwABh4wIAASfAAEksAa/aKQEGwABq1IFowABvIsAAbzTAAHKoAADAAEgfAWrAAG8jYAPAAGxWgLUAAAEDwABvRMAAcqgAAAACAgLAAG9LAAAAqWpgA75NAMAAb1kAAACBiWADwABgdQAAYAO+TQE+BU7AAG9twABveAAAkCVgA75NARbAAG+AgMAAb3rAQEZRg2C+aEAhHMAAb6EWwABvnILAAG+RwEBGeIO+vmUnAQABasAAb6RgA8AAbB+IbADAAGwywABvkcAAb7QAScAAb7sWwABvyoLAAG+/wEBGeK5nvlw+Aj0ewABv4MAAal4CAAKCwABwAcBARniBwABwDcBARl8ASsAAcBwBgsAAcCPAQEZ4P0nAAHBKHsAAcE7AAGIOAgACgsAAcFvAQEZ4asAAcGddA8AAbBkBYAPAAGwYwAE37QA+AT2KwABwfcBARngcwABwkYHAAHCKwEBGX8AASA0DAAKAwABwq8BARlEuAYCWHMAAcOxqwABw0V0DsucBYQMBYAO+TWADss/AAH/3jW8BAAGCwABw+sBARngAsuvAAGDEPgI9HMAAcSKBwABxG8BARl/AAEf8AgACgsAAcU3AQEZ4asAAcV9dA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOScAAcYIhFsAAcZKCwABxh8BARni1u75ePgE9isAAcj3AQEZ4HMAAcloWwAByUYHAAHJKwEBGX7MVwABggMAASA0BAAGCwABydMBARngAwABqNT9KwABykwGCwABymsBARngAAEBGGABASE8AAAABAsAAateBaMAAcx7AAHMkwAB5q4PAAE0MAAABYAPAAGGqAAABBMAAatmBaMAAc3rAAHOJCcAATQ0AXQPAAGwZAWADwABsGAABBcAAat2BaMAAc47AAHOUwAB0BAEAAAPAAHO4wAB0BAAAAAICAsAAc8AAAACBiGADwABsGADAAHPLAAAEwABNDV0DwABsGQFgA8AAbBgAAGADwABq1wE/AggBwABq2YEAwEBI2QkAwABz5MAAYeMCAAGAwABz6sBASMkBr9YpAQbAAGrbgWjAAHQJwAB0G8AAeakAAMAASB8BasAAdApgA8AAbFaAtQAAAQPAAHQrwAB5qQAAAAICAsAAdDIAAACpamADvk0AwAB0QAAAAIGJYAPAAGB1AABgA75NAT4FTsAAdFTAAHRfAACQJWADvk0BFsAAdGeAwAB0YcBASVyDYL5oQCEcwAB0iBbAAHSDgsAAdHjAQEmDg76+ZScBAAFqwAB0i2ADwABsH4hsAMAAbDLAAHR4wAB0mwBJwAB0oxbAAHSygsAAdKfAQEmDrme+XD4CTsAAdM7AAHTTAACDYGADvk0BFsAAdOCCwAB01cBASYODYL5oScAAdOwiIR7AAHTxwABqYAEAAYLAAHUZwEBJgwABHsAAdTLAAGIOAgACg8AAdT/AQEn4FsAAdUUuwABNDcAAatkAPgFKwAB1YQGCwAB1aMBASYM/P0nAAHZpIh7AAHZtwABqYAEAAYLAAHaVwEBJgwABHsAAdqzAAGIOAgACgsAAdrnAQEmDFsAAdsUuwABNDcAAatkAPgE9isAAdt/AQEmDHMAAdvOBwAB27MBASWrAAEgNAwACgMAAdw3AQElcLgGAlhzAAHdOasAAdzNdA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAAd1zAQEmDALLrwABgxEnAAHd1FsAAd4kWwAB3hILAAHd5wEBJg4GXvm21sb73PgE9HMAAd6OBwAB3nMBASWrAAEf8AgACgsAAd87AQEmDasAAd+BdA7LnAWEDAWADvk1gA7LPwABbhwDAAGFOPgI9HMAAeCOBwAB4HMBASWrAAEf8AgACgsAAeE7AQEmDasAAeGBdA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOScAAeIMhFsAAeJOCwAB4iMBASYO1u75ePgE9isAAeT7AQEmDHMAAeVsWwAB5UoHAAHlLwEBJarMVwABggMAASA0BAAGCwAB5dcBASYMAwABqNT9KwAB5lAGCwAB5m8BASYMAAEBJIwBATBIAAAABAsAAat6BaMAAed7AAHnkwACADYPAAE0OAAABYAPAAGGqAAAAAQXAAGrigWjAAHomwAB6LMAAerkBAAADwAB6T8AAerkAAAAAAAAAYAPAAGreAT8BCQDAAHpawABh4wMAASfAAEhEAq/WKcAASYkqAQbAAGrggWjAAHq+wAB60MAAgAsAAMAASB8BasAAer9gA8AAbFaAtQAAAQPAAHrgwACACwAAAAICAsAAeucAAACpamADvk0AwAB69QAAAIGJYAPAAGB1AABgA75NAT4FTsAAewnAAHsUAACQJWADvk0BFsAAexyAwAB7FsBATMiDYL5oQCEcwAB7PRbAAHs4gsAAey3AQEzvg76+ZScBAAFqwAB7QGADwABsH4hsAMAAbDLAAHstwAB7UABJwAB7VxbAAHtrFsAAe2aCwAB7W8BATO+Bl75ttbK++z4CScAAe30ewAB7gcAAYgUCAAIniHiCwAB7lsBATO8APgE9HMAAe7SBwAB7rcBATNbAAEf8AgACgsAAe+HAQEzvasAAe/NdA7LnAWEDAWADvk1gA7LPwAB/9wDAAGFOP0rAAHweAYLAAHwlwEBM7z9JwAB8kSIWwAB8pRbAAHyggsAAfJXAQEzvgZe+bbWxvvcAHsAAfLrAAGIOAgACFsAAfNKCwAB8x8BATO+DYL5oasAAfNhdA8AAbBkBYAPAAGwYwAE4ZwA+AT0cwAB8+YHAAHzywEBM1sAAR/wCAAKCwAB9JMBATO9qwAB9Nl0DsucBYQMBYAO+TWADss/AAFuHAMAAYU5JwAB9aiIewAB9bsAAamABAAGCwAB9lsBATO8AAR7AAH2twABiDgIAAoLAAH26wEBM72rAAH3GXQPAAGwZAWADwABsGMABOGcAPgE9isAAfeDAQEzvHMAAffSBwAB97cBATNbAAEgNAwACgMAAfg7AQEzILgGAlhzAAH5PasAAfjRdA7LnAWEDAWADvk1gA7LPwAB/941vAQABgsAAfl3AQEzvALLrwABgxD4CPRzAAH6FgcAAfn7AQEzWwABH/AIAAoLAAH6wwEBM72rAAH7CXQOy5wFhAwFgA75NYAOyz8AAf/cAwABhTknAAH7lIRbAAH71gsAAfurAQEzvtbu+Xj4BPYrAAH+gwEBM7xzAAH+9FsAAf7SBwAB/rcBATNazFcAAYIDAAEgNAQABgsAAf9fAQEzvAMAAajU/SsAAf/YBgsAAf/3AQEzvAABATI8AQE+7AAAAAQLAAGrjgWjAAIA7wACAQcAAh7CDwABNDwAAAWADwABhqgAAAAMFwABq54FowACAfsAAgITAAIFQAQAAA8AAgKLAAIFQAAAAAAAAAGADwABq4wE/AQkAwACArcAAYeMEAAEnwABJggOv1CnAAEmJKsAASIxqwACBO10DsucBYQMBYAO+TWADss/AAIH9BcAAauiBaMAAgVXAAIFbwACB+AGMygADwACBhsAAgfgAAAAAAAAAYAPAAGrjAT8BCQDAAIGRwABh4wMAASfAAEmDAsAASYgpwABJiSoFwABq6YFowACB/cAAggPAAILfAcAATRAAA8AAgirAAILfAAAAAAAAAGADwABq4wE/AQkAwACCNcAAYeMEAAEnwABJgQOv1CnAAEmJKcAASIxqwACCyl0DsucBYQMBYAO+TWADss/AAIH9AQbAAGrlgWjAAILkwACC9sAAh64AAMAASB8BasAAguVgA8AAbFaAtQAAAQPAAIMGwACHrgAAAAICAsAAgw0AAACpamADvk0AwACDGwAAAIGJYAPAAGB1AABgA75NAT4GTsAAgy/AAIM0AACDYGADvk0BFsAAgzyAwACDNsBAUUWDYL5oQCEcwACDVxbAAINSgsAAg03AQFFsg76+ZScBAAFqwACDWmADwABsH4hsAMAAbDLAAINNwACDagBJwACDcR7AAIN1wABqQAEAAYLAAIOKwEBRbAA+AUrAAIOZAYLAAIOgwEBRbEnAAIOxFsAAg7qCwACDtcBAUWy1u75ePgJJwACD2R7AAIPdwABiBQIAAieVnILAAIPuwEBRbAA+AT0cwACEBoHAAIP/wEBRU8AASAwCAAKCwACEHcBAUWxqwACEKWADstvAAKVzAMAAYU1JwACESxbAAIRZFsAAhFSCwACET8BAUWyBl75ttbG+9z4BScAAhG4hFsAAhHMuwABJicAAYdw+AT0cwACEooHAAISbwEBRU8AAR/wCAAKCwACE0cBAUWxqwACE3V0DsucBYQMBYAO+TWADss/AAFsnAMAAYU4/ScAAhRYewACFGsAAYgUCAAInlZWCwACFKsBAUWwAPgE9HMAAhUKBwACFO8BAUVPAAEgMAgACgsAAhVnAQFFsasAAhWVgA7LbwADbIADAAGFNPgE9HMAAhZqBwACF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aAABHoVtwABiBQIAAieBWRaFgYCFe8BAXDWDYL5oAD4CPReFti7AAE0XKcAAavg9iIXMwEBcNRyF24GF1MBAXEHAAElBBAAEgIX+wEBcNYOGBcBAXHSEhhHAQFzIhYYbwEBdUADAAGE2PgI9F4ZmLsAATRcqwABq+D2Ihn3AQFw1HIaMgYaFwEBcQcAASUADAAOAhqLAQFw1hIapwEBcyIOGs8BAXHQAwABhNEqGygGAhtHAQFw1BsAAavuBaobfhvyJeAAAwABJHQFqhuBgA8AAbFaAtQAAAQOHB4l4AAAAAQEBhw4AAACpamADvk0AAGADwABppwE+A06HIYcmAACDYGADvk0BFocugIcowEBeoINgvmhJhzgiHoc8wABiBQIAAieVgoGHTMBAXrcAASIeh17AAGIFAgACJ5V2gYdwwEBetwAAHod5wABiBQIAAieVghaHjoGHicBAXreDYL5oAD4BSoeeAR+HqcAAa1YCAAIfh73AAGr9AAAAACMWh9UuwABNF8AAavhqh+VgA8AAaxfAATj7aof9YAPAAGsSwAE5DAFgA8AAaacASYggHogkwABiBQIAAieViYGIM8BAXrcAPgFKiEIBH4hNwABrVgIAAmqIXWADwABpp8ABNjkjFohyLsAATRfAAGr4aoiCYAPAAGsXwAE4+2qImmADwABrEsABOQwBYAPAAGmnAEmIvSIeiMHAAGIFAgACJ64WgYjRwEBetwABHojawABiBQIAAiexToGI68BAXrcAPgFKiPoBIxaJAS7AAE0XwABq+GqJEWADwABrA8ABOR1qiSdgA8AAav7AATkuAWADwABrRz9KiT4BIxaJRS7AAE0XwABq+GqJVWADwABrDcABOT9qiWpgA8AAawjAATlQAWADwABppwAAQFwLAEBecwBAYGMAAAACAsAAav6BaonUidqKcYPAAE0YAAABYAPAAGtHAAAAAQXAAGsCgWqJ/4oFihABAAADig6KEAAAAAAAAABgA8AAav4BPwEJAYoFwABrSwAAAAABBsAAawCBaooVijKKbwAAwABJHQFqihZgA8AAbFaAtQAAAQOKPYpvAAAAAQEBikQAAACpamADvk0AAGADwABppwE+AUqKUQFqil5gA8AAaxLAATkMAABAYMUAQGEZAAAAAQLAAGsDgWqKzorUi3GDwABNGQAAAWADwABr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AZPrAAAAqWpgA75NAABgA8AAaacBSpP1AWqT+2ADwABrLMABOWEAAEBoHABAaG4AAAABAsAAayeBapR1lHuVEoPAAE0gAAABYAPAAGmnAAAAAQXAAGsrgWqUoJSmlMABAAADlK2UwAAAAAAAAABgA8AAaycBPwEJAJSywABprwIAAimTAAEGwABrKYFqlMWU4pUQAADAAEkdAWqUxmADwABsVoC1AAABA5TtlRAAAAABAQGU9AAAAKlqYAO+TQAAYAPAAGmnAUqU/gFqlQRgA8AAayzAATlhAABAaM4AQGkgAAAAAQLAAGssgWqVFZUblpaDwABNIQAAAWADwABppwAAAAEFwABrMYFqlUOVSZVnAQAAA5VTlWcAAAAAAAAAYAPAAGssAT8BCQCVWMAAaa8CAAIqkwACBsAAay6BapVslX6WFAAAIAFqlW1gA8AAbFaAtQAAAQOVg5YUAAAAAgIClYoAAACpamADvk0AlZgAAACBiWADwABgdQAAYAO+TQE+AkmVpiEelavAAGIFAgACJ5WKFpXCgJW8wEBpqoNgvmgAPgE9HJXhFpXYgZXRwEBptrhdwABgd7FBAQABgJXywEBpqgDAAGA0P0qWBAGAlgvAQGmqBsAAay+BapYZljaWlAAAwABJHQFqlhpgA8AAbFaAtQAAAQOWQZaUAAAAAQEBlkgAAACpamADvk0AAGADwABppwE+AUqWVQEjHpZcwABiBQIAAieVihaWc4CWbcBAakyDYL5oAGqWgWADwABrMsABOZQrAWADwABrMgAAQGmAAEBqHwBAapgAAAACAsAAazKBapbcluKaE4PAAE0iAAABYAPAAGmnAAAAAQXAAGs3gWqXBpcMlycBAAADlxKXJwAAAAAAAABgA8AAazIBPwEJAJcXwABprwIAAioclySUgVoAAAAAwABsjwACBsAAazSBapcslz6X+wAAIAFqly1gA8AAbFaAtQAAAQOXQ5f7AAAAAgICl0oAAACpamADvk0Al1gAAACBiWADwABgdQAAYAO+TQE+BE6XbJd2AACwHGADvk0BFpd+gJd4wEBrM4NgvmhAHpePwABiBQIAAieVioKXoMBAa1YAl4+XqgA9HJfBFpe4gZexwEBrP7hdwABgd7FAAQABgpfXwEBrVgDAAGAzSpfnAYKX7sBAa1YGwABrNYFqmACYHZoRAADA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TQFKsg8BHLIPLsAASEgCAAKAshnAQJJagbIgwECSZgDAAGvRBsAAa9GBa7Issj7AAEAHAADAAEhIAWqyLWADwABsVoC1AAABA7JHwABABwAAAAICArJOAAAAqWpgA75NALJcAAAAgYlgA8AAYHUAAGADvk0BPgpAHrJxwABs9wIAAhaygYCye8BAks2DYL5oFrKHLi7AAGvDALJxso0ASbKVHrKZwABiBQIAAieA9xaypy4uwABrwwA+AT0XsvsuLhyzCoGzA8BAktnAAEgNAgACgLMvwECSzWqzSGADwABq48ABKWcAwABgxMAAa8M/TrN9s5MAAcAATThdA8AAbBkBYAO+TQExs5xgA75NAEWzpAGztbO3AACLRl0DwABLuQFgA75NARazuS7AAE01wABrxwEWs9GDs8/AQJOLIsAAS78Bi7PdwECTixaz44Oz4cBAk4uu7cAAS7w+Aj0ctAeCs/HAQJNpNgEAARy0Oh60FsAAakICAAIWtC6DtCzAQJOLk6rAAEu7KQDAAEhFAgACFrRLg7RJwECTi5OqwABLu4G0UcBAktkAwABqWADAAGxHPRy0cRa0aIG0YcBAktm4XcAAYHewrgEAARa0gy4uwABrwwDAAGATSbSWHLSrFrSaLsAATTbAAGvIJwEAASoAwABsXj4BPRy1WWq1UmADwABqRMABIMfAAEhIAgACgLVjwECSzYG1asBAktkAwABqTT4CTrWMtZwAAMAATTlgA75NARa1pIC1nsBAks2DYL5oSbWwHrW0wABiBQIAAieVnIO1xcBAlJ4APgE9iLXhwECSzRy18mq16WADwABqRMABNm/AAEhIAgACgLX8wECSzYG2A8BAktkAwABqTT4FSbYjIiEetijAAGIFAgACJ4D3g7Y2wECUngAAIR62V8AAYgUCAAIngPcWtnWDtmXAQJSeg2C+aAA+AT2ItojAQJLNHLalgbaewECS2cAASB8CAAKAtrbAQJLNarbPYAPAAGrjwAEppgDAAGDFPgM9iLb6wECSzRy3CYG3AsBAktnAAEgfAgACgLcpwECSzWq3QmADwABq48ABKWcAwABgxT2It2TAQJLNHLdzgbdswECS2cAASG0CAAKAt5XAQJLNareuYAPAAGrjwAEp5QDAAGCzSbfUIha33oC32MBAks2EO75hABy38Ra37S6B7MAAa8YnAQABFrgEg7f0wECUnoNgvmgAwABsXj4BPRe4Zi6B7IC4bMBAks3AAGvGPz2IuJHAQJLNHLinFriZLoNzwABrxMAASEACAAKAuLbAQJLNgbi9wECS2QDAAGpXTrkXuSQAALClYAO+TQEWuSyAuSbAQJLNg2C+aEm5OiIeuT7AAGIFAgACJ43YhLlMwECWVwAAIha5gIK5asBAk2kiwABsIgEhHLmhFrmOLsAATTTAAGvFJwEAASsAwABsXj4BPYi5t8BAks2Eub/AQJZXPgE9jLnowECWVys9HLogFroXgboQwECS2bhdwABgd7CkAgACg7orwECUnoS6PMBAllcAwABgEE66YrpwAADAAE06YAPAAGwfARy6jxa6iIK6csBAk2mA4MAAbGpEAQABlADAAGzhRbqYAbqpuqsAAItGXQPAAEu5AWADvk0BFrqtLsAATTXAAGvHARa6xYS6w8BAlzIiwABLvwGMutHAQJcyFrrXhLrVwECXMq7twABLvD4JPYi65cBAks0WuvOAuu3AQJLNg2C+aEAeuwbAAGIFAgACJ4h4gLsbwECSzQC7BrshAE67MLs+AACwtGADvk0BgLtAwECSzUm7Th67UsAAYgUCAAIngToWu2aAu2DAQJLNg2C+aAA+Aj2Iu7DAQJLNHLvNgru4wECTaSkBAAGDu87AQJcAAMAAbLhAHrvtwABiBQIAAieBO4C7+8BAks0Au+28AQA/PYi8EsBAks0cvCGBvBrAQJLZwABIRgIAAoC8TcBAks1qvF9gA8AAYeXAAOEdAMAAYKpOvMa80wAAsKVgA75NARa824C81cBAks2DYL5oSbznIh6868AAYgUCAAInjdiGvPnAQJhUAAAiHL0jg70VwECXAIE7AQABkwDAAGyGASEcvT0WvSouwABNNMAAa8UnAQABKwDAAGxePgE9iL1RwECSzYa9WcBAmFQ+AT2OvX7AQJhUKz2LvaTAQJcAHL2ig72kwECXAEQBAAGUAMAAbOE9HL3JFr3Agb25wECS2bhdwABgd7CzAgAChb3ZwECXroa96MBAmFQAwABgFEAiHr9AwABs9wIAAoC/SsBAks0Wv1EugezAAGvGAAEev1nAAGIFAgACJ4E7gL9nwECSzQC/QL9tAD0Xv+YugeyAv+zAQJLNwABrxkq/9wGAv/7AQJLNBsAAa9KBa8AAQAzAAEAewABASAAAwABIQwFqwABADWADwABsVoC1AAABA8AAQCbAAEBIAAAAAQEBwABALQAAAKlqYAO+TQAAYAO+TQE+AUrAAEA6ARbAAEBBLoHswABrxgbAAGvTgWvAAEDHwABA0MAAQgEAAMAATPAAAAABA8AAQODAAEIBAAAAAgICwABA5wAAAMAASJBgA75NAMAAQPkAAACVlGADwABsWwAAYAPAAGpEAT4GQB7AAEEQwABiBQIAAieIeBbAAEElLi7AAGvDAMAAQRDAAEErAEAcwABBShbAAEFFgMAAQTnAQJoBg2C+aCcBAAEWwABBTS4uwABrwwDAAGxewABBOcAAQVIAPRzAAEFaLsAATTsCAAKAwABBZsBAmgGBwABBc8BAmhEAwABr2knAAEGCHMAAQZcWwABBhi7AAE02wABryCcBAAErAMAAbF4+AUrAAEGoASOBwABBr8BAmhFqwABBumADwABqRMABNqhqwABBx2ADwABqRMABIMcBYAPAAGpEP0AhHMAAQeQWwABB4C6B7MAAa8YnAQABKwDAAGxewABB4MAAQesASsAAQfIBLgbAAGvUgWvAAEKFwABCjsAAQ5EAAMAATO8AAAABA8AAQpzAAEORAAAAAQEBwABCogAAAJWUYAPAAGxbAABgA8AAakQBPgZAHsAAQrnAAGIFAgACJ5WcFsAAQsouLsAAa8MAwABCucAAQtAAQB7AAELewABiBQIAAieIeBbAAEL5FsAAQvMuLsAAa8ODYL5oAMAAQt7AAEL+AD0cwABDBi7AAE07AgACFsAAQxIuLsAAa8OAwABDGcBAm10AwABr2knAAEMoHMAAQz0WwABDLC7AAE02wABryCcBAAErAMAAbF4+AUrAAENOAWrAAENVYAPAAGpEwAE2bz9AIRzAAEN0FsAAQ3AugezAAGvGJwEAASsAwABsXsAAQ3DAAEN7AErAAEOCAS4GwABr1YFrwABEG8AARCTAAEUzAADAAEzyAAAAAQPAAEQ4wABFMwAAAAEBAcAARD4AAACVlGADwABsWwAAYAPAAGpEAT4GQB7AAERVwABqQAEAARbAAERqLi7AAGvDAMAARFXAAERwAEAewABEfsAAYgUCAAIniHgWwABEmRbAAESTLi7AAGvDg2C+aADAAER+wABEngA9HMAARKYuwABNOwIAAhbAAESyLi7AAGvDgMAARLnAQJyEAMAAa9pJwABEyBzAAETdFsAARMwuwABNNsAAa8gnAQABKwDAAGxePgFKwABE7gFqwABE9WADwABqRMABNqg/QCEcwABFFhbAAEUSLoHswABrxicBAAErAMAAbF7AAEUSwABFHQBKwABFJAEuBsAAa9aBa8AARcHAAEXKwABHFQAAwABM8wAAAAEDwABF5sAARxUAAAABAQHAAEXsAAAAlZRgA8AAbFsAAGADwABqRAE+B0AewABGA8AAakABAAEWwABGGC4uwABrwwDAAEYDwABGHgBAHsAARizAAGIFAgACJ43YFsAARkAWwABGOi4uwABrw4NgvmgAwABGLMAARkUAQB7AAEZTwABiBQIAAieIeBbAAEZzFsAARm4WwABGaC4uwABrw4NgvmiDYL5oAMAARlPAAEZ4AD0cwABGgC7AAE07AgACFsAARowuLsAAa8OAwABGk8BAnagAwABr2knAAEaiHMAARrcWwABGpi7AAE02wABryCcBAAErAMAAbF4+AUrAAEbIAWrAAEbPYAPAAGpEwAE2oT9AIRzAAEb4FsAARvQugezAAGvGJwEAASsAwABsXsAARvTAAEb/AErAAEcGAS4GwABr14FrwABHksAAR5vAAEh0AADAAEztAAAAAQPAAEe0wABIdAAAAAEBAcAAR7oAAACVlGADwABsWwAAYAPAAGpEAT4FQCIWwABH3BbAAEfXFsAAR9EuLsAAa8OBl75ttbG+9wEewABH6cAAYgUCAAInlZUWwABH+S4uwABrwwDAAEfRwABH/wA9F8AASAcugewcwABIGxbAAEgNLoNzwABrxJUjAQABFsAASCAuLsAAa8MAwABqWcAAa8Y9HMAASCwuwABNOwIAAhbAAEg4LoHswABrxoDAAEg9wECfAwDAAGvaQCEcwABIVxbAAEhTLoHswABrxicBAAErAMAAbF7AAEhTwABIXgBKwABIZQEuBsAAa9iBa8AASPDAAEj5wABKgwAAwABM8QAAAAEDwABJF8AASoMAAAABAQHAAEkdAAAAlZRgA8AAbFsAAGADwABqRAE+CEAewABJNMAAakABAAEWwABJSS4uwABrwwDAAEk0wABJTwBAHsAASV3AAGIFAgACJ4E6FsAASXEWwABJay4uwABrw4NgvmgAwABJXcAASXYAQCEcwABJkhbAAEmELoNzwABrxCcBAAFqwABJlWADwABqUcABIicAwABsXsAASYTAAEmlAD0XwABJrS6B7BzAAEnBFsAASbMug3PAAGvElSMBAAEWwABJxi4uwABrwwDAAGpZwABrxj0cwABJ0i7AAE07AgACFsAASd4ugezAAGvGgMAASePAQKAVAMAAa9pJwABJ8yIiIYDAAEn4wECgFQAhHsAASgXAAGtkAQABFsAAShcWwABKEy6B7MAAa8aDYL5oAAAcwABKMRbAAEogLsAATTbAAGvIJwEAASsAwABsXj4BSsAASkIBasAASklgA8AAakTAASDHP0AhHMAASmYWwABKYi6B7MAAa8YnAQABKwDAAGxewABKYsAASm0ASsAASnQBLgbAAGvZgWvAAEs7wABLRMAATTYAAMAATO4AAAABA8AAS1fAAE02AAAAAQEBwABLXQAAAJWUYAPAAGxbAABgA8AAakQBPglOwABLc8AAS3kAAKlqYAO+TQEWwABLey4uwABrw0nAAEuGIR7AAEuLwABiBQIAAieA94HAAEuZwECh7QA+AkAWwABLtoHAAEuwwECh7bW7vl7AAEuwwABLywA9icAAS9TAQKHtFsAAS+KBwABL3MBAoe2DYL5oP0AewABL+cAAYgUCAAIngPeBwABMB8BAoe0AwABL+cAATA0AScAATBQWwABMIxbAAEwegcAATBjAQKHtg2C+aLW7vl4+AT2JwABMQsBAoe0WwABMUIHAAExKwECh7YNgvmg/PRfAAExhLoHsHMAATHUWwABMZy6Dc8AAa8SVIwEAAYHAAEx6wECh7QDAAGpZwABrxj0cwABMhi7AAE07AgACFsAATJIugezAAGvGgMAATJfAQKHSAMAAa9pJwABMpiIiIYDAAEyrwECh0gAhHsAATLjAAGtkAQABFsAATMoWwABMxi6B7MAAa8aDYL5oAAAcwABM5BbAAEzTLsAATTbAAGvIJwEAASsAwABsXj4BSsAATPUBasAATPxgA8AAakTAASDHP0AhHMAATRkWwABNFS6B7MAAa8YnAQABKwDAAGxewABNFcAATSAASsAATScBLgbAAGvagWvAAE07wABNQMAAUikAAMAATTsAAAABA8AATUvAAFIpAAAAAgICwABNUgAAAKlqYAO+TQDAAE1eAAAAlZRgA8AAbFsAAFwBPgNJwABNbh7AAE1ywABiBQIAAieN2BbAAE2GgMAATYDAQKPig2C+aAA+Aj0XwABNlS7AAE00gMAATarAQKPiwABrxT0XwABNty6B7IjAAE29wECj4hbAAE3LgMAATcXAQKPig2C+aMAAa8Y/PYjAAE3bwECj4hbAAE3pgMAATePAQKPig2C+aEFDwABN8x7AAE36wABiBQIAAieIeIDAAE4PwECj4gA+Dk7AAE4lwABONwAAwABNPGADvk0BgMAATjnAQKPiPYjAAE6DwECj4hzAAE6uHsAATovAAGpCAgACgMAATqHAQKPiKQCVIwEAAYDAAE6zwECj4gDAAGpZPYjAAE7BwECj4hbAAE7PgMAATsnAQKPig2C+aEnAAE7bIR7AAE7gwABiBQIAAieGw4DAAE7uwECj4gA+AULAAE8AAD89iMAATy3AQKPiFsAATzuAwABPNcBAo+Kvl75aScAAT0scwABPVYDAAE9PwECj4icBAAErAMAAbF4+AULAAE9oAD9JwABPlSGBwABPmsBAo/A+A07AAE+0wABPuQAAg2BgA75NARbAAE/BgMAAT7vAQKPig2C+aEnAAE/PHsAAT9PAAGIFAgACJ43Yg8AAT+HAQKWaAD4BPYvAAE/0wEClmhbAAFAAg8AAT/vAQKWag2C+aD9JwABQGCEiFsAAUCODwABQHsBApZquZ75cAR7AAFAzwABiBQIAAieVc4PAAFBEwEClmgA+AULAAFBYAD8/QB7AAFC4wABiBQIAAieDo4DAAFDGwECj4gDAAFC4wABQzAA9IxzAAFDmFsAAUNUuwABNNsAAa8gnAQABKwDAAGxeF8AAUNUuwABNNiEcwABQ/ILAAFDqwECkrScBAAEWwABQ/y4uwABrwwDAAGxewABryCsBYAPAAGxbPRfAAFEMLsAATTUcwABROBbAAFEjLsAATTXAAGvHrsoBAAGCwABRQMBApK0AwABLxsAAa8c9F8AAUVsuwABNNCvAAGvFPRfAAFF8LoHsgMAAUYLAQKPiwABrxj2IwABRj8BAo+IWwABRnYDAAFGXwECj4oNgvmhJwABRqh7AAFGuwABiBQIAAieN2IDAAFG8wECj4gA+Az0XwABRzi7AAE00FsAAUeMugezAAGvGwABrxT0XwABR8C6B7IDAAFH2wECj4sAAa8Y9iMAAUgXAQKPiFsAAUhOAwABSDcBAo+KDYL5oPwAAQI/sAECQiwBAkP4AQJFPAECRvgBAki0AQJKcAECZdABAmdUAQJsxAECcWABAnXwAQJ7XAECf6QBAoaYAQKO2AECnlwAAABACwABr34FrwABSSsAAUlDAAFQYg8AATT0AAAFgA8AAalEAAAABBcAAa+eBa8AAUoDAAFKGwABSmAEAAAPAAFKWwABSmAAAAAAAAABgA8AAa98BPwEJAcAAUobAAGpbAAAAAAQGwABr4YFrwABSncAAUrHAAFLHAQCtMQFqwABSnmADwABsVoC1AAABA8AAUsPAAFLHAAAAAAAAAGADwABsHwFKwABSxgGTBsAAa+OBa8AAUszAAFLewABTVgAAwABIQAFqwABSzWADwABsVoC1AAABA8AAUuzAAFNWAAAAAgICwABS8wAAAKlqYAO+TQDAAFMBAAAAgYlgA8AAYHUAAGADvk0BPgI9HMAAUx8WwABTFoHAAFMPwECo0LhdwABgd8AAR7QBAAEWwABTO4DAAFM1wECowoNgvmgAwABgGErAAFNGAYDAAFNNwECowgbAAGvkgWvAAFNbwABTbcAAU+UAAMAASEUBasAAU1xgA8AAbFaAtQAAAQPAAFN7wABT5QAAAAICAsAAU4IAAACpamADvk0AwABTkAAAAIGJYAPAAGB1AABgA75NAT4CPRzAAFOuFsAAU6WBwABTnsBAqXa4XcAAYHex8QEAARbAAFPKgMAAU8TAQKlog2C+aADAAGBOSsAAU9UBgMAAU9zAQKloBsAAa+WBa8AAU+rAAFP8wABUFgAAlSMBasAAU+tgA8AAbFaAtQAAAQPAAFQAwABUFgAAAAEBAcAAVAcAAACpamADvk0AAGADvk0BSsAAVBEBgMAAVBHAQKoKAABAqEMAQKiJAECpLwBAqdMAQKotAAAABALAAGvogWvAAFQbwABUIcAAW1WDwABNPgAAAWADwABqUQAAAAEFwABr9IFrwABUVMAAVFrAAFRvAQAAA8AAVG3AAFRvAAAAAAAAAGADwABr6AE/AQkBwABUWsAAalsAAAAACAbAAGvqgWvAAFR0wABUicAAVKUBAMAATOkBasAAVHVgA8AAbFaAtQAAAQPAAFSewABUpQAAAAAAAABgA8AAbFsBSsAAVKEBKQbAAGvrgWvAAFSqwABUvsAAVNQBAK0xAWrAAFSrYAPAAGxWgLUAAAEDwABU0MAAVNQAAAAAAAAAYAPAAGwfAUrAAFTTAZQGwABr7IFrwABU2cAAVPLAAFUVAQDAAEhCAWrAAFTaYAPAAGxWgLUAAAEDwABU+8AAVRUAAAAAAAAAYAPAAGpEAUrAAFT+AWrAAFT+YAPAAGpEwAE52QbAAGvugWvAAFUawABVLMAAVr4AAMAASEABasAAVRtgA8AAbFaAtQAAAQPAAFU6wABWvgAAAAICAsAAVUEAAACpamADvk0AwABVTwAAAIGJYAPAAGB1AABgA75NAT4ITsAAVWPAAFVuAADAAEinYAO+TQEWwABVdoDAAFVwwECrxoNgvmhAHsAAVYfAAGIFAgACJ4E6gsAAVZXAQKvtAMAAVYfAAFWgAE7AAFWtwABVtgAAr5dgA75NARzAAFW4LsAATT8CAAKCwABVxsBAq+0WwABV3YLAAFXSwECr7YNgvmgAwABr8k7AAFXxwABV+gAAuF1gA8AAX0cBFsAAVgOBwABV/MBAq9S4XcAAYHc9HMAAVhqEwABWEcBArHXAAEeyAQABgsAAVi3AQKvtAMAAYBU9HMAAVklqwABWPmADwABqRMABNqjAAEhIAgACgsAAVlPAQKvtgcAAVl/AQKvUAMAAak09HMAAVnwWwABWc4HAAFZswECr1LhdwABgd7FPAwADlILAAFaQwECr7YPAAFacwECsNgDAAGAWSsAAVqsBg8AAVrLAQKw2BsAAa++Ba8AAVsPAAFbVwABZjgAAwABIRQFqwABWxGADwABsVoC1AAABA8AAVuPAAFmOAAAAAgICwABW6gAAAKlqYAO+TQDAAFb4AAAAgYlgA8AAYHUAAGADvk0BPg9OwABXDMAAVxcAAMAASKdgA75NARbAAFcfgMAAVxnAQK1yg2C+aEAewABXMMAAYgUCAAIngTqCwABXPsBArZkAwABXMMAAV0kAPYjAAFdQwECtchbAAFdjgsAAV1jAQK2Zg2C+aE7AAFdzwABXfAAAr5dgA75NARzAAFd+LsAATT8CAAKCwABXjMBArZmAwABXmMBArXIAwABr8k7AAFetwABXtgAAuF1gA8AAX0cBFsAAV7+BwABXuMBArYC4XcAAYHc9HMAAV9aEwABXzcBArjTAAEe1AQABgsAAV+nAQK2ZAMAAYBw9HMAAWAOEwABX+sBArjTAAEeSAQABgMAAWBXAQK1yAMAAX+Q9HMAAWCqEwABYIcBArjSvIgEAAZMAwABf5T0cwABYS4TAAFhCwECuNK/RAgACgMAAWFzAQK1yasAAWHVgA8AAaurAASkoAMAAYDk9HMAAWJyEwABYk8BArjSx4gEAAYDAAFiuwECtcgDAAGAZPRzAAFjDhMAAWLrAQK40seMCAAKAwABY3sBArXKUAMAAYBo9HMAAWPaEwABY7cBArjTAAEe8AQABgMAAWQPAQK1yAMAAYE09HMAAWRiEwABZD8BArjSx5AQABIPAAFkowECt/pMrKwDAAGAbPRzAAFlPhMAAWUbAQK40sekCAAKCwABZYMBArZmDwABZbMBArf4AwABgHUrAAFl7AYPAAFmCwECt/gbAAGvwgWvAAFmTwABZpcAAWlYAAJUjAWrAAFmUYAPAAGxWgLUAAAEDwABZqcAAWlYAAAABAQHAAFmwAAAAqWpgA75NAABgA75NAT4FPYjAAFm9wECv7RbAAFnLgMAAWcXAQK/tg2C+aEAewABZ3MAAYgUCAAIngTqAwABZ6sBAr+0AwABZ3MAAWfAAPYjAAFn3wECv7RbAAFoFgMAAWf/AQK/tg2C+aEAWwABaHIDAAFoWwECv7bW7vl7AAFoWwABaMQBKwABaOAEcwABaPy7AAE1AAQABgMAAWkzAQK/tAMAAa/EGwABr8YFrwABaW8AAWmHAAFrLAADAAE1AAAAAAQPAAFptwABaywAAAAEBAcAAWnQAAACpamADvk0AAGADvk0BPgM9iMAAWoHAQLDHFsAAWo+AwABaicBAsMeDYL5oQB7AAFqgwABiBQIAAieBO4DAAFquwECwxwDAAFqgwABatABKwABauwGAwABawsBAsMcGwABr8oFrwABa0MAAWtbAAFtTAADAAE0/AAAAAQPAAFrjwABbUwAAAAICAsAAWuoAAADAAEinYAO+TQDAAFr8AAAAqWpgA75NAABgA75NAT4DPYnAAFsJwECxZxbAAFsXgcAAWxHAQLFng2C+aEAewABbKMAAYgUCAAIngTuBwABbNsBAsWcAwABbKMAAWzwASsAAW0MBgcAAW0rAQLFnAABAqqkAQKrxAECrNwBAq40AQK05AECvtgBAsJsAQLErAECxywAAAAgCwABr9YFrwABbWMAAW17AAF2og8AATUEAAAFgA8AAa+gAAAABBcAAa/yBa8AAW5bAAFucwABbtQEAAAPAAFuzwABbtQAAAAAAAABgA8AAa/UBPwEJAcAAW5zAAGv0AAAAAAMGwABr94FrwABbusAAW9PAAFv6AQDAAEhCAWrAAFu7YAPAAGxWgLUAAAEDwABb3MAAW/oAAAAAAAAAYAPAAGpEAUrAAFvfAWrAAFvfYAPAAGpEwAE58wbAAGv5gWvAAFv/wABcBcAAXHsAAMAATUAAAAABA8AAXBHAAFx7AAAAAQEBwABcGAAAAKlqYAO+TQAAYAO+TQE+Az2IwABcJcBAstkWwABcM4DAAFwtwECy2YNgvmhAHsAAXETAAGIFAgACJ4PXgMAAXFPAQLLZAMAAXETAAFxZAErAAFxgAR7AAFxnwABiEgEAAYDAAFxxwECy2QAGwABr+oFrwABcgMAAXIbAAF2mAADAAE0/AAAAAQPAAFyTwABdpgAAAAICAsAAXJoAAADAAEinYAO+TQDAAFysAAAAwABNQmADvk0AAGADvk0BPgROwABcyMAAXNEAAK+XYAO+TQEWwABc4oHAAFzTwECzhoNgvmhJwABc7CEewABc8cAAYgUCAAIngTuCwABc/8BAs58APgI9isAAXRLAQLOfHsAAXR3AAGISAQABgsAAXSfAQLOfAD0cwABdRhbAAF1BgsAAXTjAQLOfg2C+aLXCAQABFsAAXVwWwABdV4LAAF1OwECzn4NgvmiDYL5oAL53Pz0cwABdfIHAAF1twECzhrXCAQABgsAAXYTAQLOfAL53SsAAXZMBgsAAXZrAQLOfAABAslcAQLKtAECzSgBAtG4AAAADAsAAa/2Ba8AAXavAAF2xwABf+4PAAE1DAAABYAPAAGvoAAAAAQXAAGwEgWvAAF3pwABd78AAXggBAAADwABeBsAAXggAAAAAAAAAYAPAAGv9AT8BCQHAAF3vwABr9AAAAAADBsAAa/+Ba8AAXg3AAF4mwABeTQEAwABIQgFqwABeDmADwABsVoC1AAABA8AAXi/AAF5NAAAAAAAAAGADwABqRAFKwABeMgFqwABeMmADwABqRMABOgIGwABsAYFrwABeUsAAXljAAF7OAADAAE1AAAAAAQPAAF5kwABezgAAAAEBAcAAXmsAAACpamADvk0AAGADvk0BPgM9iMAAXnjAQLVoFsAAXoaAwABegMBAtWiDYL5oQB7AAF6XwABiBQIAAieCS4DAAF6mwEC1aADAAF6XwABerABKwABeswEewABeusAAYhMBAAGAwABexMBAtWgABsAAbAKBa8AAXtPAAF7ZwABf+QAAwABNPwAAAAEDwABe5sAAX/kAAAACAgLAAF7tAAAAwABIp2ADvk0AwABe/wAAAMAATUJgA75NAABgA75NAT4ETsAAXxvAAF8kAACvl2ADvk0BFsAAXzWBwABfJsBAthWDYL5oScAAXz8hHsAAX0TAAGIFAgACJ4E7gsAAX1LAQLYuAD4CPYrAAF9lwEC2Lh7AAF9wwABiEwEAAYLAAF96wEC2LgA9HMAAX5kWwABflILAAF+LwEC2LoNgvmi1wgEAARbAAF+vFsAAX6qCwABfocBAti6DYL5og2C+aAC+dz89HMAAX8+BwABfwMBAthW1wgEAAYLAAF/XwEC2LgC+d0rAAF/mAYLAAF/twEC2LgAAQLTmAEC1PABAtdkAQLb9AAAAAwLAAGwFgWvAAF/+wABgBMAAjVADwABNRAAAAWADwABqUQAABQTAAGwHgWvAAGBwwABgdQkuAGADvk0ABMAAbAiBa8AAYRbAAGEjCa/WAGADwABsWwAEwABsCYFrwABh28AAYekJwABM9ABgA8AAbFsABMAAbAqBa8AAYf7AAGIPGK0xAWrAAGHvYAPAAGxWgLVgA8AAbB8BKwTAAGwLgWvAAGMcwABjIxjAAE1FAGADvk0BKwEFwABsFIFrwABjKMAAYyjAAGQTAAAAA8AAY0HAAGQTAAAAAwMDwABjTwAAAKlqYAO+TQDAAGNbAAAEr9ZgA8AAbFsAwABjbwAABMAATPRgA8AAbFsAAGADwABsBQE/BwgBwABsCIEAwEC3+ggBwABsCYIAwEC4CgwAQB7AAGOOwABiBQIAAieBOhbAAGOigMAAY5zAQLfsg2C+aADAAGOOwABjpwAMAEAhHMAAY8eBwABjucBAt/onAQABKwDAAGxewABjucAAY84ADABAIRzAAGPvgsAAY+DAQLgKJwEAASsAwABsXsAAY+DAAGP2AAgAwABsBxbAAGQPgMAAZAnAQLfsg2C+aAkBwABjKMAAalsAAAAABgbAAGwNgWvAAGS+wABk0cAAbAAAAMAATPUAAAABA8AAZNjAAGwAAAAAAAAAAGADwABqUQE+B07AAGTnAAAAqWpgA75NAE7AAGT4wABk/QAAg2BgA75NARbAAGT/Li7AAGwHPRfAAGUKLq0xk8AAbApBQ8AAZSUpPgdOwABlQ8AAZUwAAMAASEJgA8AAakQBHsAAZU7AAGpBAwADgcAAZVrAQLkjKRbAAGVmLq/WwABsCABJwABlfBzAAGWJgsAAZYDAQLlXJwEAAWrAAGWMYAPAAGpEwAEgxwDAAGxePgNDwABlniIcwABlroLAAGWlwEC5VycBAAFqwABlsWADwABqRMABIMcAwABsXgAewABlu8AAYgUCAAInhBUWwABlzoHAAGXJwEC5I4NgvmgAPgI9icAAZeHAQLkjHsAAZejAAGIRAQABgcAAZfXAQLkjAD2KwABmBsBAuVcewABmEcAAakEDAAOBwABmHcBAuSMpFsAAZikur9bAAGwIAEnAAGZLHMAAZliCwABmT8BAuVcnAQABasAAZltgA8AAakTAASDHAMAAbF4+AknAAGZvIiIcwABmeIHAAGZzwEC5IycBAAEWwABmey4uwABsBwDAAGxeACEWwABmhS6v1sAAbAgAIR7AAGaXwABrZwEAARbAAGalgcAAZqDAQLkjg2C+aAA+AUrAAGa6AWrAAGbBYAPAAGpRwAEiJz9JwABm6SEewABm7sAAYgUCAAInjvEWwABnAYHAAGb8wEC5I4NgvmgAPgM9iMAAZxbAQLkUgcAAZx7AQLkjPYnAAGcwwEC5IxbAAGc9gMAAZzfAQLkUg2C+aELAAGdPAD8/QCIhHMAAZ4SCwABne8BAuVcnAQABasAAZ4dgA8AAakTAASDHAMAAbF4BHsAAZ5HAAGIFAgACJ47xFsAAZ6SBwABnn8BAuSODYL5oAMAAZ3vAAGepAD89F8AAZ/0urTEcwABn+xbAAGf9Lq0xwABsCoE/AQABlADAAGyIwABsCj2IwABoFsBAuRQcwABoJ4LAAGgewEC5V8AASEMBAAGBwABoMMBAuSMAwABqTj2JwABoPcBAuSMWwABoSoDAAGhEwEC5FINgvmhJwABoVh7AAGhawABiBQIAAieVS4HAAGhuwEC5IwA+Aj2IwABof8BAuRQcwABorh7AAGiHwABqQQMAA4HAAGiTwEC5IykWwABony6v1sAAbAgAwABIQwEAAYHAAGi3wEC5IwDAAGpOPYnAAGjGwEC5IxbAAGjTgMAAaM3AQLkUg2C+aD9JwABo5yEewABo7MAAYgUCAAInjvGBwABo+sBAuSMAPgU9F8AAaQsuwABNRR7AAGkVwABraQEAAYHAAGkhwEC5IwDAAGwLScAAaTAhHMAAaTwWwABpNC7AAE1FwABsCycBAAErAMAAbF4+AUrAAGlRAS4/ScAAaXAhFsAAaXUur9bAAGwIPgFKwABpkAFqwABpl2ADwABqUcABIic/ScAAadAhHsAAadXAAGtlAgACFsAAae0ur9bAAGwIgcAAafzAQLkjAD4BQsAAag8APz2JwABqX8BAuSOAwABqZsBAuRQ/PRfAAGqQLsAATUUewABqmsAAa2kBAAGBwABqpsBAuSMAwABsC0nAAGqxHMAAar0WwABqtS7AAE1FwABsCycBAAErAMAAbF4+BEnAAGrOHsAAatLAAGIFAgACJ4bDgcAAauDAQLkjAD4CPYjAAGrxwEC5FBbAAGr+gcAAavnAQLkjr5e+Wj2JwABrEMBAuSMWwABrHYDAAGsXwEC5FINgvmg/PRfAAGsxLsAATUUewABrO8AAa2kBAAGBwABrR8BAuSMAwABsC0nAAGtUHMAAa2AWwABrWC7AAE1FwABsCycBAAErAMAAbF4+AT0XwABrcy7AAE1FHsAAa33AAGtpAQABFsAAa46BwABricBAuSODYL5oAMAAbAs/ScAAa6McwABrrxbAAGunLsAATUXAAGwLJwEAASsAwABsXj4BPRfAAGvCLsAATUUewABrzMAAYhgBAAGBwABr2MBAuSMAwABsCz8/SsAAa/EBLgbAAGwOgWvAAGwFwABsF8AAcRkAAMAASEABasAAbAZgA8AAbFaAtQAAAQPAAGwlwABxGQAAAAICAsAAbCwAAACpamADvk0AwABsOgAAAIGJYAPAAGB1AABgA75NAT4IQB7AAGxPwABs9wIAAhbAAGxfgMAAbFnAQL8rg2C+aBbAAGxlLi7AAGwHAMAAbE/AAGxrAE7AAGx4wABsfQAAg2BgA75NARbAAGx/Li7AAGwHPRzAAGyaFsAAbJGBwABsisBAvzm4XcAAYHfAAEeyAQABFsAAbK0uLsAAbAcAwABgFU7AAGy9wABswwAAilNgA8AAbB8Bk0FDwABszCk+Bk7AAGzqwABs8wAAwABIQmADwABqRAEewABs9cAAakEDAAOCwABtAcBAv4YpFsAAbQ0ur9bAAGwIAEnAAG0jHMAAbTCEwABtJ8BAv/InAQABasAAbTNgA8AAakTAASDHAMAAbF4+AUPAAG1ZIhzAAG1phMAAbWDAQL/yJwEAAWrAAG1sYAPAAGpEwAEgxwDAAGxeAB7AAG12wABiBQIAAieEFRbAAG2JgsAAbYTAQL+Gg2C+aAA+Az0cwABto4HAAG2cwEC/OcAAR/wCAAIWwABt14LAAG3SwEC/hoNgvmhqwABt410DsucBYQMBYAO+TWADss/AANcDAMAAYU49isAAbgfAQL+GHsAAbg7AAGIRAQABgsAAbhvAQL+GAD2MwABuLMBAv/IewABuN8AAakEDAAOCwABuQ8BAv4YpFsAAbk8ur9bAAGwIAD89iMAAbrjAQL8rHMAAbsmEwABuwMBAv/LAAEg1AgACgsAAbtrAQL+GgcAAbuDAQL85AMAAaks9isAAbu/AQL+GFsAAbvyAwABu9sBAvyuDYL5oPYvAAG8KwEC/1BzAAG8Ig8AAbwrAQL/UgT8BAAGUAMAAbIhJwABvFyEewABvHMAAYgUCAAInjvGCwABvKsBAv4YAPgNJwABvOx7AAG8/wABraAEAAYDAAG9LwEC/KwA+AULAAG9fAD9JwABvjSEewABvksAAa2UCAAIWwABvqi6v1sAAbAiCwABvucBAv4YAPgI9iMAAb8zAQL8rHMAAb9QuwABNRgMAA4DAAG/nwEC/KymBwABv9MBAvzkAwABsEULAAHAHAD89isAAcGzAQL+GHMAAcHMuwABNRwIAAoDAAHCFwEC/K4HAAHCMwEC/OQDAAGwQP07AAHCtwABwtgAAr5dgA75NARbAAHC+gMAAcLjAQL8rg2C+aD0cwABw2BbAAHDPgcAAcMjAQL85uF3AAGB3sU8DAAODwABw6cBAv9QWwABw8C4uwABsB4TAAHD3wEDChgDAAGAWSsAAcQYBhMAAcQ3AQMKGBsAAbA+Ba8AAcR7AAHEwwAB+uAAAwABIRQFqwABxH2ADwABsVoC1AAABA8AAcT7AAH64AAAAAgICwABxRQAAAKlqYAO+TQDAAHFTAAAAgYlgA8AAYHUAAGADvk0BPhRAHsAAcWjAAGz3AgACFsAAcXiAwABxcsBAwzKDYL5oFsAAcX4uLsAAbAcAwABxaMAAcYQATsAAcZHAAHGWAACDYGADvk0BFsAAcZguLsAAbAdOwABxrMAAcbUAALhdYAPAAF9HARbAAHG+gcAAcbfAQMNAuF3AAGB3PRzAAHHVg8AAcczAQMOqwABHtQEAARbAAHHoLi7AAGwHAMAAYBxOwABx+MAAcf4AAIpTYAPAAGwfAZNOwAByFMAAch8AAMAATUhdA8AAS7kBYAO+TQFqwAByJ10DwABLuQFgA75NwAE56E7AAHJJwAByWAAAwABNSV0DwABLuQFgA8AAakQBasAAcmBdA8AAS7kBYAPAAGpEwAE6EU7AAHKCwAByjAAAwABNSl0DwABLuQFgA75NAWrAAHKUXQPAAEu5AWADvk3AATnoQUPAAHKoKT4MPYjAAHK9wEDDMhzAAHLMgcAAcsXAQMNAwABIAAEAAYLAAHLewEDDjQDAAGCgTsAAcvLAAHL7AACGh2ADvk0BFsAAcwKCwABy/cBAw42DYL5oTsAAcxTAAHMfAACQJWADvk0BFsAAcyoUwABzIcBAxNQIAINgvmhJwABzNiIiIhbAAHM6LsAATPTAAGwJAB7AAHNWwABrZgEAARTAAHNhwEDE1AgAAAAhHMAAc4MUwABzeMBAxPgJACcBAAErAMAAbF4AFsAAc6MUwABzmMBAxPgJALW7vl4+Az2PwABzxMBAxG8cwABz2ofAAHPQwEDEb67KAQABFMAAc+LAQMTUCAAAwABLxkPAAHQqIiIewAB0McAAa2YBAAEUwAB0PMBAxPgJAAAAIRzAAHRnFsAAdGIUwAB0V8BAxPgJAINgvmgnAQABKwDAAGxeABbAAHSOFsAAdIkUwAB0fsBAxPgJAINgvmi1u75ePgM9HMAAdPCBwAB06cBAw0DAAEgMAgACFMAAdRbAQMT4CQBqwAB1KGADstvAAK/gAMAAYU09FcAAdVXAQMTUCBbAAHVpFMAAdWDAQMTUCACDYL5oPRXAAHV5wEDE+AkWwAB1kRTAAHWGwEDE+AkAg2C+aD2IwAB1qsBAwzIUwAB1ssBAxNQIAD4BPY/AAHXTwEDEbxzAAHXph8AAdd/AQMRvrsoBAAErAMAAS8Y9isAAdgfAQMONHMAAdhWBwAB2DsBAw0DAAEgfAgACgMAAdjHAQMMyasAAdkpgA8AAaurAASkoAMAAYMU9iMAAdmrAQMMygsAAdnLAQMONPRzAAHaHg8AAdn7AQMOqseIBAAGAwAB2mcBAwzIAwABgGT2NwAB2p8BAxA0cwAB2v4XAAHa0wEDEDa7KAQABgMAAdsfAQMMyAMAAS8Y9isAAdtbAQMONFsAAduOAwAB23cBAwzKDYL5oScAAdu8ewAB288AAYgUCAAInlUuCwAB3B8BAw40APgROwAB3IcAAdyoAAMAASEJgA8AAakQBHsAAdyzAAGpBAwADgsAAdzjAQMONKRbAAHdELq/WwABsCAA9iMAAd1zAQMMyHMAAd20UwAB3ZMBAx5QKAMAASEMBAAGCwAB3dsBAw40AwABqTj2KwAB3hcBAw40WwAB3koDAAHeMwEDDMoNgvmg9jsAAd6DAQMQ8HMAAd8CGwAB3scBAxDyuygEAARTAAHfIwEDHlAoAAMAAS8Y+AT2OwAB36sBAxDwcwAB4CobAAHf7wEDEPK7KAQABKwDAAEvGPYzAAHgqwEDD+BzAAHgohMAAeCrAQMP4gT8BAAGUAMAAbIhJwAB4NyEewAB4PMAAYgUCAAInjvGCwAB4SsBAw40APgNJwAB4Wx7AAHhfwABrZwEAAYDAAHhowEDDMgA+AULAAHh8AD9JwAB4qiEewAB4r8AAa2UCAAIWwAB4xy6v1sAAbAiCwAB41sBAw40APgFCwAB46QA/PYrAAHlOwEDDjRzAAHlVLsAATUcCAAKAwAB5Z8BAwzKBwAB5bsBAw0AAwABsED9AHMAAeZeEwAB5kcBAw/iBOwEAAZMAwABshsAAeZHAAHmaAEAcwAB5wBzAAHmzhcAAeajAQMQNvmgAAAAAwABL0ScBAAGEwAB5w8BAw/gAwABsMsAAeajAAHnIAEAcwAB58hzAAHnlhsAAedbAQMQ8vmgAAAAAwABL0ScBAAGEwAB59cBAw/gAwABsMsAAedbAAHn6AEAcwAB6HxzAAHoSh8AAegjAQMRvvmgAAAAAwABL0ScBAAGEwAB6IsBAw/gAwABsMsAAegjAAHonAD0cwAB6N4PAAHouwEDDqrHjAgACgMAAelLAQMMyhMAAelnAQMP4AMAAYBo9iMAAembAQMMyK0PAAHp4FsAAeoqFwAB6f8BAxA0iwABLvz4LTsAAeqTAAHqrAADAAE1LYAO+TQEWwAB6uIXAAHqtwEDEDZOqwABLu07AAHrNwAB61gAAwABIQmADwABqRAEWwAB654bAAHrYwEDEPJOqwABLu07AAHr5wAB7AgAAhodgA75NARbAAHsOh8AAewTAQMRvk6rAAEu7TsAAeyHAAHswAACx5WADvk0BK07AAHtEwAB7SgAAg2FgA75NARbAAHtTFMAAe0zAQMpQCACDYL5oScAAe18hHMAAe2wUwAB7Y8BAyngJACcBAAErAMAAbF4+BEAewAB7hsAAYgUCAAInlUsUwAB7msBAytsMAADAAHuGwAB7oAA9FcAAe6vAQMrICxTAAHu8wEDK2wwAPRXAAHvLwEDKUAgcwAB73RTAAHvUwEDKeAkAwABIdAIAAhTAAHvvwEDK2wwAgcAAe/bAQMNAAMAAako9FcAAfAfAQMrbDBbAAHwWFMAAfA/AQMpQCACDYL5oPgJAIR7AAHw7wABiBQIAAieVSxTAAHxPwEDK2wwAAMAAfDrAAHxVAD0cwAB8aYPAAHxgwEDDqsAAR7wBAAEUwAB8dsBAylAIAADAAGBNPSMcwAB9I4DAAH0dwEDDMicBAAErAMAAbF6IwAB9HcBAwzIUwAB9J8BAylAIACsBYAO+TT0cwAB9PoPAAH01wEDDqrHkBAAEFMAAfU7AQMrbDACMwAB9V8BAw/gcwAB9VYTAAH1XwEDD+EQBAAGUAMAAbOEUwAB9XsBAysgLABTAAH1uwEDKogoAAMAAYBs9jcAAfYDAQMQNFsAAfZiFwAB9jcBAxA2u7cAAS7w9jsAAfaTAQMQ8FsAAfcSGwAB9tcBAxDyu7cAAS7w9j8AAfdDAQMRvFsAAfeaHwAB93MBAxG+u7cAAS7xJwAB99yEewAB9/MAAa2gBAAGAwAB+CMBAwzIAPgE9iMAAfhjAQMMyHMAAfiAuwABNRgMAA4DAAH4zwEDDMiqBwAB+QcBAw0AAwABsET9OwAB+WsAAfmMAAK+XYAO+TQEWwAB+a4DAAH5lwEDDMoNgvmg9HMAAfn6DwAB+dcBAw6qx6QIAAhbAAH6PLi7AAGwHFMAAfpbAQM09CAAAwABgHUrAAH6lARTAAH6swEDNPQgABsAAbBCBa8AAfr3AAH7DwAB/4wAAwABNRwAAAAEDwAB+1MAAf+MAAAACAgLAAH7bAAAAqWpgA75NAMAAfukAAACBiWADwABgdQAAYAO+TQE+A07AAH79wAB/AgAAg2BgA75NARbAAH8KgMAAfwTAQM3Mg2C+aD0cwAB/G4HAAH8UwEDN2sAASAwCAAKCwAB/O8BAzfMcwAB/XmrAAH9HXQOy5wFhAwFgA8AAbBhgA7LPwAB9c41vAQABJ47xALLrAMAAYU1KwAB/dwEcwAB/jhbAAH+FgcAAf37AQM3asxXAAGCAwABIigIAAoDAAH+jwEDNzB/AAH+uvkwCAAJqwAB/x2ADvpXAAP14FsAAf9OCwAB/zsBAzfOJzr5WAADAAGoaBsAAbBGBa8AAf+jAAH/uwACM8AAAwABNRgAAAAEDwACAAMAAjPAAAAADAwPAAIAHAAAAqWpgA75NAMAAgBMAAADAAE1MYAPAAGxbAMAAgCcAAACBiWADwABgdQAAYAO+TQE+DU7AAIA7wACAQAAAg2BgA75NARbAAIBIgMAAgELAQM7vg2C+aE7AAIBXwACAZQAAwABNTWADwABsWwEiFsAAgG2AwACAZ8BAzu+EO75hASIWwACAgoPAAIB9wEDPKIQ7vmEAIRbAAICXg8AAgJLAQM8oq6m+W07AAICpwACAvAAAwABNTmADwABsWwEqScAAgMkewACAzcAAYgUCAAInlUuDwACA4cBAzygAPgVJwACA8CGEwACA9cBAz0w+Aj0cwACBFYLAAIEOwEDPD8AASAwCAAKAwACBOcBAzu8cwACBYmrAAIFGXQOy5wFhAwFgA8AAbBhgA7LPwAB8Uo1vAQABJ4E7ALLrAMAAYU09jMAAgX/AQM9MKT89iMAAgaPAQM7vg8AAgavAQM8oPYvAAIG3wEDPKBbAAIHEgMAAgb7AQM7vg2C+aD2NwACB0MBAz50ewACB5cAAakABAAGDwACB+sBAzygAScAAgggewACCDMAAa2gBAAGAwACCGMBAzu8APgFKwACCKgGAwACCMcBAzu8/P0nAAIJLIiIihcAAgk/AQM+dAR7AAIJtwABiBQIAAieVm4PAAIKBwEDPKAABHsAAgpLAAGIFAgACJ5Wcg8AAgqPAQM8oAAEewACCtMAAYgUCAAIniHiDwACCycBAzygAPgJOwACC4cAAgu0AAMAATU9gA8AAakQBHsAAgu/AAGpBAgACgMAAgvvAQM7vKQBJwACDDyEcwACDH4bAAIMTwEDRHicBAAFqwACDImADwABqRMABIMcAwABsXj4HScAAgzQhhMAAgznAQM9MPgI9HMAAg1uCwACDVMBAzw/AAEgMAgACgMAAg4HAQM7vHMAAg6pqwACDjl0DsucBYQMBYAPAAGwYYAOyz8AAfFKNbwEAASeBOwCy6wDAAGFNPYzAAIPJwEDPTCk/TsAAhJrAAISrAAHAAEk2YAPAAF9HARbAAIS0gsAAhK3AQM8PuF3AAGB3PRfAAITNgsAAhMbAQM8PuF0fwACE3MAAaaAAAAAAwABgdz2IwACE+sBAzu8cwACFDobAAIUCwEDRHsAASEgCAAKAwACFGMBAzu+CwACFH8BAzw8AwABqTT2LwACFMMBAzygWwACFPYDAAIU3wEDO74Ngvmg9F8AAhVKCwACFS8BAzw+4XYfAAIVdwEDR5cAAYHdJwACFeB7AAIV8wABraAEAAYDAAIWIwEDO7wA+AUrAAIWcAYDAAIWjwEDO7z8/P07AAIXawACF6QAAwABNUGADwABqUQEewACF88AAakICAAKAwACGCcBAzu8WwACGEC6v1sAAbAgAScAAhiQhHMAAhjeGwACGKMBA0tAnAQABasAAhjpgA8AAalHAASInAMAAbF4+B0nAAIZUIYTAAIZZwEDPTD4CPRzAAIZ5gsAAhnLAQM8PwABIDAIAAoDAAIadwEDO7xzAAIbGasAAhqpdA7LnAWEDAWADwABsGGADss/AAHxSjW8BAAEngTsAsusAwABhTT2MwACG48BAz0wpP07AAIeswACHvQABwABJNmADwABfRwEWwACHxoLAAIe/wEDPD7hdwABgdz0XwACH3YLAAIfWwEDPD7hdH8AAh+zAAGmgAAAAAMAAYHc9iMAAiAjAQM7vI4HAAIgQwEDO/RzAAIg3hsAAiCjAQNLQwABIQAIAAoDAAIhGwEDO74LAAIhNwEDPDwDAAGpXHMAAiHCGwACIYcBA0tDAAEhFAgACgMAAiH/AQM7vgsAAiIbAQM8PAMAAalgBYAO+TT2LwACIlcBAzygWwACIooDAAIicwEDO74Ngvmg9F8AAiLWCwACIrsBAzw+4XYfAAIjAwEDTosAAYHdJwACI2R7AAIjdwABraAEAAYDAAIjpwEDO7wA+AUrAAIj7AYDAAIkCwEDO7z8/ScAAiRwiHsAAiSDAAGIFAgACJ4bDg8AAiS7AQM8oAAAhHMAAiUUWwACJPIPAAIk3wEDPKK+XvlonAQABKwDAAGxePgRJwACJViGEwACJW8BAz0w+Aj0cwACJwYLAAIm6wEDPD8AASAwCAAKAwACJ5cBAzu8cwACKDmrAAInyXQOy5wFhAwFgA8AAbBhgA7LPwAB8Uo1vAQABJ4E7ALLrAMAAYU09jMAAiivAQM9MKT89iMAAik/AQM7vFsAAilyDwACKV8BAzyivl75aPYvAAIpswEDPKBbAAIp5gMAAinPAQM7vg2C+aEnAAIqGHsAAiorAAGtoAQABgMAAipbAQM7vAD4BSsAAiqgBgMAAiq/AQM7vPz9JwACKySGEwACKzsBAz0w+AT0cwACLMILAAIspwEDPD8AASAwCAAKAwACLUsBAzu8cwACLe2rAAItfXQOy5wFhAwFgA8AAbBhgA7LPwAB8Uo1vAQABJ4E7ALLrAMAAYU0/ScAAi5oewACLnsAAa2gBAAGDwACLqsBAzygAPgFKwACLuQGDwACLwMBAzyg/TsAAi9bAAIvfAACvl2ADvk0BFsAAi+cWwACL4S4uwABsB6+XvlpJwACL9SEcwACMAofAAIv5wEDWaycBAAErAMAAbF4+AUPAAIwTIiEcwACMJRbAAIwggMAAjBrAQM7vg2C+aCcBAAGHwACMKMBA1msAwABsXgAhFsAAjDuAwACMNcBAzu+rqb5bPgE9iMAAjEzAQM7vFsAAjFqAwACMVMBAzu+DYL5oPgM9j8AAjHvAQNZrHsAAjIbAAGIYAQABg8AAjJLAQM8oAD0cwACMqIfAAIyfwEDWa7XCAQABg8AAjLDAQM8oAL53PRzAAIzDgMAAjL3AQM7vtcIBAAGHwACMy8BA1msAvndKwACM4AGAwACM58BAzu8GwABsEoFrwACM9cAAjQfAAI1OAACVIwFqwACM9mADwABsVoC1AAABA8AAjQvAAI1OAAAAAQEBwACNEgAAAKlqYAO+TQAAYAO+TQE+AkAhHMAAjS4WwACNJi7AAE1FwABsCycBAAErAMAAbF7AAI0mwACNNQBKwACNPAEWwACNQy7AAE1FwABsCwAAQLjdAEC+8gBAwvkAQM2gAEDOwwBA14MAQNgMAAAABgAKBMAAa1mBa4RZhHgGwABNUQBgA8AAakQBaoRsYAPAAGumwAE2qATAAGtagWuFJoVVBsAATVIAYAPAAGpEAWqFQWADwABrncABNqEEwABrW4FrhfeGGgbAAE1TAGADwABqRAFqhgxgA8AAa3fAATaaBMAAa1yBa4bPhx8GwABNVABgA8AAakQBaobzYAPAAGuNwAE52QTAAGtdgWuH1YgtBsAATVUAYAPAAGpEAWqH/WADwABrjcABOfMEwABrXoFriOOJOwbAAE1WAGADwABqRAFqiQtgA8AAa43AAToCBMAAa1+Ba4n8ikkGwABNVwBgA8AAakQBaoooYAPAAGuEwAE2iwTAAGtggWuLDYs+BsAATVgAYAPAAGpRAWqLKWADwABr6MABNoQEwABrYYFrjAOMQAbAAE1ZAGADwABqUQFqjCdgA8AAa/XAATa2BMAAa2KBa40FjUIGwABNWgBgA8AAalEBao0pYAPAAGv9wAE2rwYGwABrZIFrp1enXKjSAAHAAE1bAAAAAQOnaajSAAAAAQEBp3AAAACpamADvk0AAGADwABsWwFKp34BIiIcp4kWp4SAp37AQNnEg76+ZScBAAFqp4xgA8AAbB+IbADAAGwyAR6npMAAYgUCAAInlXOAp7XAQNnEAAEiFqfKgKfEwEDZxK5nvlwAIiEeqJrAAGIFAgACJ4ZegKiuwEDZxAABIRaoxBaov4CoucBA2cSDYL5orme+XAbAAGtlgWupXqljqoMAAcAATVwAAAABA6l6qoMAAAACAgKpgAAAAK/WYAPAAGxbAKmVAAAAqWpgA75NAABgA8AAbFsBPgJJqaAigKmkwEDaegAcqcAWqbuBqbXAQNqIg76+ZScBAAFqqcNgA8AAbB+IbADAAGwyPgJOqeGp5gAAg2BgA75NARap7oGp6MBA2oiDYL5oSan4IiIcqgYWqgGCqfzAQNrSg76+ZScBAAFqqglgA8AAbB+IbADAAGwyAR6qJcAAYgUCAAInjvGCqjPAQNrSAAEeqkTAAGtnAQABgqpNwEDa0gA+AUqqXAEpPz9KqnUBKgbAAGtmgWvAAI2RwACNlsAAjhIAAcAATV0AAAABA8AAjaDAAI4SAAAAAQEBwACNpwAAAKlqYAO+TQAAYAPAAGxbAT4BSsAAjbIBIiIewACNucAAYgUCAAInhoiAwACNyMBA23oAAR7AAI3YwABiBQIAAieGiYDAAI3qwEDbegABHsAAjfrAAGIFAgACJ4aKgMAAjgrAQNt6AAbAAGtngWvAAI5mwACOa8AAj3EAAcAATV4AAAABA8AAjnPAAI9xAAAAAQEBwACOegAAAKlqYAO+TQAAYAPAAGxbAT4CTsAAjpLAAI6YAAGBPmADwABsGAEWwACOoIDAAI6awEDcE6+xvmxKwACOrwEiIiIiIh7AAI62wABs9wIAAoHAAI7AwEDcLCeBOwABHsAAjtXAAGz3AgACgcAAjt/AQNwsJ4JLAAEewACO9cAAbPcCAAKBwACO/8BA3Cwng9cAAR7AAI8VwABs9wIAAoHAAI8fwEDcLCeudQABHsAAjzbAAGz3AgACgcAAj0DAQNwsJ7YEAAEewACPV8AAbPcCAAKBwACPYcBA3CwntgcABsAAa2iBa8AAj/bAAI/7wACRGQABwABNXwAAAAEDwACQBsAAkRkAAAABAQHAAJANAAAAwABNYGADvk0AAGADwABsWwE+Bk7AAJAlwACQLQAAwABNYWADvk0BFsAAkDyAwACQL8BA3SODYL5oTsAAkErAAJBQAACHQ2ADvk0BHsAAkFLAAGtpAQABgcAAkF7AQN0+AEnAAJBqHMAAkHSCwACQbsBA3WQnAQABgcAAkHfAQN0+AMAAbF4+AUrAAJCGASlJwACQnBzAAJCmgsAAkKDAQN1kJwEAASsAwABsXj4BSsAAkLUBKj89HMAAkNQWwACQz4LAAJDJwEDdZINgvmi1wgEAARbAAJDkgcAAkNzAQN0+g2C+aAC+dz0cwACQ+oDAAJDtwEDdI7XCAQABgsAAkQLAQN1kAL53SsAAkQwBKQbAAGtpgWvAAJIRwACSF8AAlBQAAcAATWIAAAABA8AAkiLAAJQUAAAAAQEBwACSKQAAAMAASGhgA75NAABgA75NAT4DTsAAkjzAAJJCAACBPmADwABsGAEWwACSS4DAAJJEwEDeZa+xvmxJwACSWh7AAJJewABs9wIAAoHAAJJowEDefieBOwA+AUrAAJJ7AYDAAJKCwEDeZUnAAJKTHsAAkpfAAGz3AgACgcAAkqHAQN5+J4JLAD4BSsAAkrUBHsAAkrzAAGITAQABgMAAksbAQN5lAEnAAJLYHsAAktzAAGz3AgACgcAAkubAQN5+J4PXAD4BSsAAkvoBHsAAkwHAAGISAQABgMAAkwvAQN5lAEnAAJMdHsAAkyHAAGz3AgACgcAAkyvAQN5+J651AD4BSsAAk0ABHsAAk0fAAGIWAQABgMAAk1nAQN5lAEnAAJNrHsAAk2/AAGz3AgACgcAAk3nAQN5+J7YEAD4BSsAAk44BHsAAk5XAAGIVAQABgMAAk6fAQN5lAEnAAJO5HsAAk73AAGz3AgACgcAAk8fAQN5+J7YHAD4BSsAAk90BHsAAk+TAAGIXAQABgMAAk/jAQN5lAD9KwACUBwErAYFrAEDgBgBAdIkAQHhAAEB84gBAfyUAQIPuAECF7ABAijQAQI3RAECn4ABAqkYAQLH0AEC0gwBAtxIAQNgtAAAADQBA2aIAQNpYAEDbTgBA2+cAQNz3AEDeOQBA4AYAAAAGAAABbAAAAAA7ZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdG9wYXovcnVudGltZS9kYXJ0L2NvbXBpbGVyLmRhcnSMcC8vIENvcHlyaWdodCAyMDE4IFRoZSBGdWNoc2lhIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDppbyc7CgppbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmNyeXB0by9jcnlwdG8uZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6dm0va2VybmVsX2Zyb250X2VuZC5kYXJ0JwogICAgc2hvdyBjcmVhdGVDb21waWxlckFyZ1BhcnNlciwgcnVuQ29tcGlsZXIsIHN1Y2Nlc3NFeGl0Q29kZTsKCmZpbmFsIEFyZ1BhcnNlciBfYXJnUGFyc2VyID0gY3JlYXRlQ29tcGlsZXJBcmdQYXJzZXIoKQogIC4uYWRkT3B0aW9uKCdjb21wb25lbnQtbmFtZScsIGhlbHA6ICdOYW1lIG9mIHRoZSBjb21wb25lbnQnKQogIC4uYWRkT3B0aW9uKCdkYXRhLWRpcicsCiAgICAgIGhlbHA6ICdOYW1lIG9mIHRoZSBzdWJkaXJlY3Rvcnkgb2YgLy9kYXRhIGZvciBvdXRwdXQgZmlsZXMnKQogIC4uYWRkT3B0aW9uKCdtYW5pZmVzdCcsIGhlbHA6ICdQYXRoIHRvIG91dHB1dCBGdWNoc2lhIHBhY2thZ2UgbWFuaWZlc3QnKTsKClN0cmluZyBfdXNhZ2UgPSAnJycKVXNhZ2U6IGNvbXBpbGVyIFtvcHRpb25zXSBpbnB1dC5kYXJ0CgpPcHRpb25zOgoke19hcmdQYXJzZXIudXNhZ2V9CicnJzsKCkZ1dHVyZTx2b2lkPiBtYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CiAgQXJnUmVzdWx0cyBvcHRpb25zOwogIHRyeSB7CiAgICBvcHRpb25zID0gX2FyZ1BhcnNlci5wYXJzZShhcmdzKTsKICAgIGlmICghb3B0aW9ucy5yZXN0LmlzTm90RW1wdHkpIHsKICAgICAgdGhyb3cgRXhjZXB0aW9uKCdNdXN0IHNwZWNpZnkgaW5wdXQuZGFydCcpOwogICAgfQogIH0gb24gRXhjZXB0aW9uIGNhdGNoIChlcnJvcikgewogICAgcHJpbnQoJ0VSUk9SOiAkZXJyb3JcbicpOwogICAgcHJpbnQoX3VzYWdlKTsKICAgIGV4aXRDb2RlID0gMTsKICAgIHJldHVybjsKICB9CgogIGZpbmFsIGNvbXBpbGVyRXhpdENvZGUgPSBhd2FpdCBydW5Db21waWxlcihvcHRpb25zLCBfdXNhZ2UpOwogIGlmIChjb21waWxlckV4aXRDb2RlICE9IHN1Y2Nlc3NFeGl0Q29kZSkgewogICAgZXhpdENvZGUgPSBjb21waWxlckV4aXRDb2RlOwogICAgcmV0dXJuOwogIH0KCiAgZmluYWwgU3RyaW5nIG91dHB1dCA9IG9wdGlvbnNbJ291dHB1dCddOwogIGZpbmFsIFN0cmluZyBkYXRhRGlyID0gb3B0aW9ucy5vcHRpb25zLmNvbnRhaW5zKCdjb21wb25lbnQtbmFtZScpCiAgICAgID8gb3B0aW9uc1snY29tcG9uZW50LW5hbWUnXQogICAgICA6IG9wdGlvbnNbJ2RhdGEtZGlyJ107CiAgZmluYWwgU3RyaW5nIG1hbmlmZXN0RmlsZW5hbWUgPSBvcHRpb25zWydtYW5pZmVzdCddOwoKICBpZiAobWFuaWZlc3RGaWxlbmFtZSAhPSBudWxsKSB7CiAgICBhd2FpdCBjcmVhdGVNYW5pZmVzdChtYW5pZmVzdEZpbGVuYW1lLCBkYXRhRGlyLCBvdXRwdXQpOwogIH0KfQoKRnV0dXJlIGNyZWF0ZU1hbmlmZXN0KAogICAgU3RyaW5nIHBhY2thZ2VNYW5pZmVzdEZpbGVuYW1lLCBTdHJpbmcgZGF0YURpciwgU3RyaW5nIG91dHB1dCkgYXN5bmMgewogIExpc3Q8U3RyaW5nPiBwYWNrYWdlcyA9IGF3YWl0IEZpbGUoJyRvdXRwdXQtcGFja2FnZXMnKS5yZWFkQXNMaW5lcygpOwoKICAvLyBNYWtlIHN1cmUgdGhlICdtYWluJyBwYWNrYWdlIGlzIHRoZSBsYXN0IChjb252ZW50aW9uIHdpdGggcGFja2FnZSBsb2FkZXIpLgogIHBhY2thZ2VzLnJlbW92ZSgnbWFpbicpOwogIHBhY2thZ2VzLmFkZCgnbWFpbicpOwoKICBmaW5hbCBJT1NpbmsgcGFja2FnZU1hbmlmZXN0ID0gRmlsZShwYWNrYWdlTWFuaWZlc3RGaWxlbmFtZSkub3BlbldyaXRlKCk7CgogIGZpbmFsIFN0cmluZyBrZXJuZWxMaXN0RmlsZW5hbWUgPSAnJHBhY2thZ2VNYW5pZmVzdEZpbGVuYW1lLmRpbHBsaXN0JzsKICBmaW5hbCBJT1Npbmsga2VybmVsTGlzdCA9IEZpbGUoa2VybmVsTGlzdEZpbGVuYW1lKS5vcGVuV3JpdGUoKTsKICBmb3IgKFN0cmluZyBwYWNrYWdlIGluIHBhY2thZ2VzKSB7CiAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWVJblBhY2thZ2UgPSAnJHBhY2thZ2UuZGlscCc7CiAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWVJbkJ1aWxkID0gJyRvdXRwdXQtJHBhY2thZ2UuZGlscCc7CiAgICBwYWNrYWdlTWFuaWZlc3QKICAgICAgICAud3JpdGUoJ2RhdGEvJGRhdGFEaXIvJGZpbGVuYW1lSW5QYWNrYWdlPSRmaWxlbmFtZUluQnVpbGRcbicpOwogICAga2VybmVsTGlzdC53cml0ZSgnJGZpbGVuYW1lSW5QYWNrYWdlXG4nKTsKICB9CiAgYXdhaXQga2VybmVsTGlzdC5jbG9zZSgpOwoKICBmaW5hbCBTdHJpbmcgZnJhbWV3b3JrVmVyc2lvbkZpbGVuYW1lID0gJyRwYWNrYWdlTWFuaWZlc3RGaWxlbmFtZS5mcmFtZXdvcmt2ZXJzaW9uJzsKICBmaW5hbCBJT1NpbmsgZnJhbWV3b3JrVmVyc2lvbiA9IEZpbGUoZnJhbWV3b3JrVmVyc2lvbkZpbGVuYW1lKS5vcGVuV3JpdGUoKTsKICBmb3IgKFN0cmluZyBwYWNrYWdlIGluIFsnY29sbGVjdGlvbicsICdmbHV0dGVyJywgJ21ldGEnLCAndHlwZWRfZGF0YScsICd2ZWN0b3JfbWF0aCddKSB7CiAgICBEaWdlc3QgZGlnZXN0OwogICAgaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBhY2thZ2UpKSB7CiAgICAgIGZpbmFsIGZpbGVuYW1lSW5CdWlsZCA9ICckb3V0cHV0LSRwYWNrYWdlLmRpbHAnOwogICAgICBmaW5hbCBieXRlcyA9IGF3YWl0IEZpbGUoZmlsZW5hbWVJbkJ1aWxkKS5yZWFkQXNCeXRlcygpOwogICAgICBkaWdlc3QgPSBzaGEyNTYuY29udmVydChieXRlcyk7CiAgICB9CiAgICBmcmFtZXdvcmtWZXJzaW9uLndyaXRlKCckcGFja2FnZT0kZGlnZXN0XG4nKTsKICB9CiAgYXdhaXQgZnJhbWV3b3JrVmVyc2lvbi5jbG9zZSgpOwoKICBwYWNrYWdlTWFuaWZlc3Qud3JpdGUoJ2RhdGEvJGRhdGFEaXIvYXBwLmRpbHBsaXN0PSRrZXJuZWxMaXN0RmlsZW5hbWVcbicpOwogIHBhY2thZ2VNYW5pZmVzdC53cml0ZSgnZGF0YS8kZGF0YURpci9hcHAuZnJhbWV3b3JrdmVyc2lvbj0kZnJhbWV3b3JrVmVyc2lvbkZpbGVuYW1lXG4nKTsKICBhd2FpdCBwYWNrYWdlTWFuaWZlc3QuY2xvc2UoKTsKfQpiADxKHgEVEgEhASUBKkABNz8aQ0wBFCUBCRQFAS0WCCYkMgYhHhMSDAQBPy0hDAQBK0QiHTcBIj0EAgEXS0gBUBsYAUwBSUIlNjwURy4EHAFXTlsTJjc/JgYyBCIBTVshAgFGcGFja2FnZTp0b3Bhei5ydW50aW1lLmRhcnQuX2tlcm5lbF9jb21waWxlcl9kYXJ0X2xpYnJhcnkvY29tcGlsZXIuZGFydEZmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvYXJncy9saWIvYXJncy5kYXJ0gXovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKZXhwb3J0ICdzcmMvYXJnX3BhcnNlci5kYXJ0JzsKZXhwb3J0ICdzcmMvYXJnX3BhcnNlcl9leGNlcHRpb24uZGFydCc7CmV4cG9ydCAnc3JjL2FyZ19yZXN1bHRzLmRhcnQnIGhpZGUgbmV3QXJnUmVzdWx0czsKZXhwb3J0ICdzcmMvb3B0aW9uLmRhcnQnIGhpZGUgbmV3T3B0aW9uOwoKAE5OPAEeKDIpARZwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0SmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jcnlwdG8vbGliL2NyeXB0by5kYXJ0gYYvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKZXhwb3J0ICdzcmMvZGlnZXN0LmRhcnQnOwpleHBvcnQgJ3NyYy9oYXNoLmRhcnQnOwpleHBvcnQgJ3NyYy9obWFjLmRhcnQnOwpleHBvcnQgJ3NyYy9tZDUuZGFydCc7CmV4cG9ydCAnc3JjL3NoYTEuZGFydCc7CmV4cG9ydCAnc3JjL3NoYTI1Ni5kYXJ0JzsKZXhwb3J0ICdzcmMvc2hhNTEyLmRhcnQnOwoNAE5OPAEaGBgXGBoaARpwYWNrYWdlOmNyeXB0by9jcnlwdG8uZGFydExmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIva2VybmVsX2Zyb250X2VuZC5kYXJ0wABySS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVmaW5lcyB0aGUgVk0tc3BlY2lmaWMgdHJhbnNsYXRpb24gb2YgRGFydCBzb3VyY2UgY29kZSB0byBrZXJuZWwgYmluYXJpZXMuCmxpYnJhcnkgdm0ua2VybmVsX2Zyb250X2VuZDsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDppbycgc2hvdyBGaWxlLCBJT1NpbmssIElPRXhjZXB0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JyBzaG93IEFyZ1BhcnNlciwgQXJnUmVzdWx0czsKCmltcG9ydCAncGFja2FnZTpidWlsZF9pbnRlZ3JhdGlvbi9maWxlX3N5c3RlbS9tdWx0aV9yb290LmRhcnQnCiAgICBzaG93IE11bHRpUm9vdEZpbGVTeXN0ZW0sIE11bHRpUm9vdEZpbGVTeXN0ZW1FbnRpdHk7CgppbXBvcnQgJ3BhY2thZ2U6Y3J5cHRvL2NyeXB0by5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS92bS5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbXBpbGVyQ29udGV4dCwKICAgICAgICBDb21waWxlck9wdGlvbnMsCiAgICAgICAgQ29tcGlsZXJSZXN1bHQsCiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2UsCiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVyLAogICAgICAgIEZpbGVTeXN0ZW0sCiAgICAgICAgRmlsZVN5c3RlbUVudGl0eSwKICAgICAgICBGaWxlU3lzdGVtRXhjZXB0aW9uLAogICAgICAgIFByb2Nlc3NlZE9wdGlvbnMsCiAgICAgICAgU2V2ZXJpdHksCiAgICAgICAgU3RhbmRhcmRGaWxlU3lzdGVtLAogICAgICAgIGdldE1lc3NhZ2VVcmksCiAgICAgICAga2VybmVsRm9yUHJvZ3JhbSwKICAgICAgICBwYXJzZUV4cGVyaW1lbnRhbEFyZ3VtZW50cywKICAgICAgICBwYXJzZUV4cGVyaW1lbnRhbEZsYWdzLAogICAgICAgIHByaW50RGlhZ25vc3RpY01lc3NhZ2UsCiAgICAgICAgcmVzb2x2ZUlucHV0VXJpOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBDb21wb25lbnQsIExpYnJhcnksIFJlZmVyZW5jZTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeVByaW50ZXI7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0JwogICAgc2hvdyBMaW1pdGVkQmluYXJ5UHJpbnRlcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnIHNob3cgVGFyZ2V0LCBUYXJnZXRGbGFncywgZ2V0VGFyZ2V0OwoKaW1wb3J0ICdieXRlY29kZS9ieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnQnIHNob3cgQnl0ZWNvZGVTaXplU3RhdGlzdGljczsKaW1wb3J0ICdieXRlY29kZS9nZW5fYnl0ZWNvZGUuZGFydCcKICAgIHNob3cgZ2VuZXJhdGVCeXRlY29kZSwgY3JlYXRlRnJlc2hDb21wb25lbnRXaXRoQnl0ZWNvZGU7CmltcG9ydCAnYnl0ZWNvZGUvb3B0aW9ucy5kYXJ0JyBzaG93IEJ5dGVjb2RlT3B0aW9uczsKaW1wb3J0ICdodHRwX2ZpbGVzeXN0ZW0uZGFydCcgc2hvdyBIdHRwQXdhcmVGaWxlU3lzdGVtOwppbXBvcnQgJ3RhcmdldC9pbnN0YWxsLmRhcnQnIHNob3cgaW5zdGFsbEFkZGl0aW9uYWxUYXJnZXRzOwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy9kZXZpcnR1YWxpemF0aW9uLmRhcnQnIGFzIGRldmlydHVhbGl6YXRpb24KICAgIHNob3cgdHJhbnNmb3JtQ29tcG9uZW50OwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy9taXhpbl9kZWR1cGxpY2F0aW9uLmRhcnQnIGFzIG1peGluX2RlZHVwbGljYXRpb24KICAgIHNob3cgdHJhbnNmb3JtQ29tcG9uZW50OwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy9ub19keW5hbWljX2ludm9jYXRpb25zX2Fubm90YXRvci5kYXJ0JwogICAgYXMgbm9fZHluYW1pY19pbnZvY2F0aW9uc19hbm5vdGF0b3Igc2hvdyB0cmFuc2Zvcm1Db21wb25lbnQ7CmltcG9ydCAndHJhbnNmb3JtYXRpb25zL3Byb3RvYnVmX2F3YXJlX3RyZWVzaGFrZXIvdHJhbnNmb3JtZXIuZGFydCcKICAgIGFzIHByb3RvYnVmX3RyZWVfc2hha2VyOwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIuZGFydCcgYXMgZ2xvYmFsVHlwZUZsb3cKICAgIHNob3cgdHJhbnNmb3JtQ29tcG9uZW50OwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy9vYmZ1c2NhdGlvbl9wcm9oaWJpdGlvbnNfYW5ub3RhdG9yLmRhcnQnCiAgICBhcyBvYmZ1c2NhdGlvblByb2hpYml0aW9uczsKaW1wb3J0ICd0cmFuc2Zvcm1hdGlvbnMvY2FsbF9zaXRlX2Fubm90YXRvci5kYXJ0JyBhcyBjYWxsX3NpdGVfYW5ub3RhdG9yOwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy91bnJlYWNoYWJsZV9jb2RlX2VsaW1pbmF0aW9uLmRhcnQnCiAgICBhcyB1bnJlYWNoYWJsZV9jb2RlX2VsaW1pbmF0aW9uOwoKLy8vIERlY2xhcmUgb3B0aW9ucyBjb25zdW1lZCBieSBbcnVuQ29tcGlsZXJdLgp2b2lkIGRlY2xhcmVDb21waWxlck9wdGlvbnMoQXJnUGFyc2VyIGFyZ3MpIHsKICBhcmdzLmFkZE9wdGlvbigncGxhdGZvcm0nLAogICAgICBoZWxwOiAnUGF0aCB0byB2bV9wbGF0Zm9ybV9zdHJvbmcuZGlsbCBmaWxlJywgZGVmYXVsdHNUbzogbnVsbCk7CiAgYXJncy5hZGRPcHRpb24oJ3BhY2thZ2VzJywgaGVscDogJ1BhdGggdG8gLnBhY2thZ2VzIGZpbGUnLCBkZWZhdWx0c1RvOiBudWxsKTsKICBhcmdzLmFkZE9wdGlvbignb3V0cHV0JywKICAgICAgYWJicjogJ28nLCBoZWxwOiAnUGF0aCB0byByZXN1bHRpbmcgZGlsbCBmaWxlJywgZGVmYXVsdHNUbzogbnVsbCk7CiAgYXJncy5hZGRGbGFnKCdhb3QnLAogICAgICBoZWxwOgogICAgICAgICAgJ1Byb2R1Y2Uga2VybmVsIGZpbGUgZm9yIEFPVCBjb21waWxhdGlvbiAoZW5hYmxlcyBnbG9iYWwgdHJhbnNmb3JtYXRpb25zKS4nLAogICAgICBkZWZhdWx0c1RvOiBmYWxzZSk7CiAgYXJncy5hZGRPcHRpb24oJ2RlcGZpbGUnLCBoZWxwOiAnUGF0aCB0byBvdXRwdXQgTmluamEgZGVwZmlsZScpOwogIGFyZ3MuYWRkRmxhZygnbGluay1wbGF0Zm9ybScsCiAgICAgIGhlbHA6ICdJbmNsdWRlIHBsYXRmb3JtIGludG8gcmVzdWx0aW5nIGtlcm5lbCBmaWxlLicsIGRlZmF1bHRzVG86IHRydWUpOwogIGFyZ3MuYWRkRmxhZygnZW1iZWQtc291cmNlcycsCiAgICAgIGhlbHA6ICdFbWJlZCBzb3VyY2UgZmlsZXMgaW4gdGhlIGdlbmVyYXRlZCBrZXJuZWwgY29tcG9uZW50JywKICAgICAgZGVmYXVsdHNUbzogdHJ1ZSk7CiAgYXJncy5hZGRNdWx0aU9wdGlvbignZmlsZXN5c3RlbS1yb290JywKICAgICAgaGVscDogJ0EgYmFzZSBwYXRoIGZvciB0aGUgbXVsdGktcm9vdCB2aXJ0dWFsIGZpbGUgc3lzdGVtLicKICAgICAgICAgICcgSWYgbXVsdGktcm9vdCBmaWxlIHN5c3RlbSBpcyB1c2VkLCB0aGUgaW5wdXQgc2NyaXB0IGFuZCAucGFja2FnZXMgZmlsZSBzaG91bGQgYmUgc3BlY2lmaWVkIHVzaW5nIFVSSS4nKTsKICBhcmdzLmFkZE9wdGlvbignZmlsZXN5c3RlbS1zY2hlbWUnLAogICAgICBoZWxwOiAnVGhlIFVSSSBzY2hlbWUgZm9yIHRoZSBtdWx0aS1yb290IHZpcnR1YWwgZmlsZXN5c3RlbS4nKTsKICBhcmdzLmFkZE9wdGlvbigndGFyZ2V0JywKICAgICAgaGVscDogJ1RhcmdldCBtb2RlbCB0aGF0IGRldGVybWluZXMgd2hhdCBjb3JlIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlJywKICAgICAgYWxsb3dlZDogPFN0cmluZz5bJ3ZtJywgJ2ZsdXR0ZXInLCAnZmx1dHRlcl9ydW5uZXInLCAnZGFydF9ydW5uZXInXSwKICAgICAgZGVmYXVsdHNUbzogJ3ZtJyk7CiAgYXJncy5hZGRGbGFnKCd0ZmEnLAogICAgICBoZWxwOgogICAgICAgICAgJ0VuYWJsZSBnbG9iYWwgdHlwZSBmbG93IGFuYWx5c2lzIGFuZCByZWxhdGVkIHRyYW5zZm9ybWF0aW9ucyBpbiBBT1QgbW9kZS4nLAogICAgICBkZWZhdWx0c1RvOiB0cnVlKTsKICBhcmdzLmFkZEZsYWcoJ3Byb3RvYnVmLXRyZWUtc2hha2VyJywKICAgICAgaGVscDogJ0VuYWJsZSBwcm90b2J1ZiB0cmVlIHNoYWtlciB0cmFuc2Zvcm1hdGlvbiBpbiBBT1QgbW9kZS4nLAogICAgICBkZWZhdWx0c1RvOiBmYWxzZSk7CiAgYXJncy5hZGRNdWx0aU9wdGlvbignZGVmaW5lJywKICAgICAgYWJicjogJ0QnLAogICAgICBoZWxwOiAnVGhlIHZhbHVlcyBmb3IgdGhlIGVudmlyb25tZW50IGNvbnN0YW50cyAoZS5nLiAtRGtleT12YWx1ZSkuJyk7CiAgYXJncy5hZGRGbGFnKCdlbmFibGUtYXNzZXJ0cycsCiAgICAgIGhlbHA6ICdXaGV0aGVyIGFzc2VydHMgd2lsbCBiZSBlbmFibGVkLicsIGRlZmF1bHRzVG86IGZhbHNlKTsKICBhcmdzLmFkZEZsYWcoJ3NwbGl0LW91dHB1dC1ieS1wYWNrYWdlcycsCiAgICAgIGhlbHA6CiAgICAgICAgICAnU3BsaXQgcmVzdWx0aW5nIGtlcm5lbCBmaWxlIGludG8gbXVsdGlwbGUgZmlsZXMgKG9uZSBwZXIgcGFja2FnZSkuJywKICAgICAgZGVmYXVsdHNUbzogZmFsc2UpOwogIGFyZ3MuYWRkRmxhZygnZ2VuLWJ5dGVjb2RlJywgaGVscDogJ0dlbmVyYXRlIGJ5dGVjb2RlJywgZGVmYXVsdHNUbzogZmFsc2UpOwogIGFyZ3MuYWRkTXVsdGlPcHRpb24oJ2J5dGVjb2RlLW9wdGlvbnMnLAogICAgICBoZWxwOiAnU3BlY2lmeSBvcHRpb25zIGZvciBieXRlY29kZSBnZW5lcmF0aW9uOicsCiAgICAgIHZhbHVlSGVscDogJ29wdDEsb3B0MiwuLi4nLAogICAgICBhbGxvd2VkOiBCeXRlY29kZU9wdGlvbnMuY29tbWFuZExpbmVGbGFncy5rZXlzLAogICAgICBhbGxvd2VkSGVscDogQnl0ZWNvZGVPcHRpb25zLmNvbW1hbmRMaW5lRmxhZ3MpOwogIGFyZ3MuYWRkRmxhZygnZHJvcC1hc3QnLAogICAgICBoZWxwOiAnSW5jbHVkZSBvbmx5IGJ5dGVjb2RlIGludG8gdGhlIG91dHB1dCBmaWxlJywgZGVmYXVsdHNUbzogdHJ1ZSk7CiAgYXJncy5hZGRNdWx0aU9wdGlvbignZW5hYmxlLWV4cGVyaW1lbnQnLAogICAgICBoZWxwOiAnQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZXhwZXJpbWVudGFsIGZlYXR1cmVzIHRvIGVuYWJsZS4nKTsKICBhcmdzLmFkZEZsYWcoJ2hlbHAnLAogICAgICBhYmJyOiAnaCcsIG5lZ2F0YWJsZTogZmFsc2UsIGhlbHA6ICdQcmludCB0aGlzIGhlbHAgbWVzc2FnZS4nKTsKfQoKLy8vIENyZWF0ZSBBcmdQYXJzZXIgYW5kIHBvcHVsYXRlIGl0IHdpdGggb3B0aW9ucyBjb25zdW1lZCBieSBbcnVuQ29tcGlsZXJdLgpBcmdQYXJzZXIgY3JlYXRlQ29tcGlsZXJBcmdQYXJzZXIoKSB7CiAgZmluYWwgQXJnUGFyc2VyIGFyZ1BhcnNlciA9IG5ldyBBcmdQYXJzZXIoYWxsb3dUcmFpbGluZ09wdGlvbnM6IHRydWUpOwogIGRlY2xhcmVDb21waWxlck9wdGlvbnMoYXJnUGFyc2VyKTsKICByZXR1cm4gYXJnUGFyc2VyOwp9Cgpjb25zdCBpbnQgc3VjY2Vzc0V4aXRDb2RlID0gMDsKY29uc3QgaW50IGJhZFVzYWdlRXhpdENvZGUgPSAxOwpjb25zdCBpbnQgY29tcGlsZVRpbWVFcnJvckV4aXRDb2RlID0gMjU0OwoKLy8vIFJ1biBrZXJuZWwgY29tcGlsZXIgdG9vbCB3aXRoIGdpdmVuIFtvcHRpb25zXSBhbmQgW3VzYWdlXQovLy8gYW5kIHJldHVybiBleGl0IGNvZGUuCkZ1dHVyZTxpbnQ+IHJ1bkNvbXBpbGVyKEFyZ1Jlc3VsdHMgb3B0aW9ucywgU3RyaW5nIHVzYWdlKSBhc3luYyB7CiAgZmluYWwgU3RyaW5nIHBsYXRmb3JtS2VybmVsID0gb3B0aW9uc1sncGxhdGZvcm0nXTsKCiAgaWYgKG9wdGlvbnNbJ2hlbHAnXSkgewogICAgcHJpbnQodXNhZ2UpOwogICAgcmV0dXJuIHN1Y2Nlc3NFeGl0Q29kZTsKICB9CgogIGlmICgob3B0aW9ucy5yZXN0Lmxlbmd0aCAhPSAxKSB8fCAocGxhdGZvcm1LZXJuZWwgPT0gbnVsbCkpIHsKICAgIHByaW50KHVzYWdlKTsKICAgIHJldHVybiBiYWRVc2FnZUV4aXRDb2RlOwogIH0KCiAgZmluYWwgU3RyaW5nIGlucHV0ID0gb3B0aW9ucy5yZXN0LnNpbmdsZTsKICBmaW5hbCBTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBvcHRpb25zWydvdXRwdXQnXSA/PyAiJGlucHV0LmRpbGwiOwogIGZpbmFsIFN0cmluZyBwYWNrYWdlcyA9IG9wdGlvbnNbJ3BhY2thZ2VzJ107CiAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSBvcHRpb25zWyd0YXJnZXQnXTsKICBmaW5hbCBTdHJpbmcgZmlsZVN5c3RlbVNjaGVtZSA9IG9wdGlvbnNbJ2ZpbGVzeXN0ZW0tc2NoZW1lJ107CiAgZmluYWwgU3RyaW5nIGRlcGZpbGUgPSBvcHRpb25zWydkZXBmaWxlJ107CiAgZmluYWwgTGlzdDxTdHJpbmc+IGZpbGVTeXN0ZW1Sb290cyA9IG9wdGlvbnNbJ2ZpbGVzeXN0ZW0tcm9vdCddOwogIGZpbmFsIGJvb2wgYW90ID0gb3B0aW9uc1snYW90J107CiAgZmluYWwgYm9vbCB0ZmEgPSBvcHRpb25zWyd0ZmEnXTsKICBmaW5hbCBib29sIGxpbmtQbGF0Zm9ybSA9IG9wdGlvbnNbJ2xpbmstcGxhdGZvcm0nXTsKICBmaW5hbCBib29sIGVtYmVkU291cmNlcyA9IG9wdGlvbnNbJ2VtYmVkLXNvdXJjZXMnXTsKICBmaW5hbCBib29sIGdlbkJ5dGVjb2RlID0gb3B0aW9uc1snZ2VuLWJ5dGVjb2RlJ107CiAgZmluYWwgYm9vbCBkcm9wQVNUID0gb3B0aW9uc1snZHJvcC1hc3QnXTsKICBmaW5hbCBib29sIGVuYWJsZUFzc2VydHMgPSBvcHRpb25zWydlbmFibGUtYXNzZXJ0cyddOwogIGZpbmFsIGJvb2wgdXNlUHJvdG9idWZUcmVlU2hha2VyID0gb3B0aW9uc1sncHJvdG9idWYtdHJlZS1zaGFrZXInXTsKICBmaW5hbCBib29sIHNwbGl0T3V0cHV0QnlQYWNrYWdlcyA9IG9wdGlvbnNbJ3NwbGl0LW91dHB1dC1ieS1wYWNrYWdlcyddOwogIGZpbmFsIExpc3Q8U3RyaW5nPiBleHBlcmltZW50YWxGbGFncyA9IG9wdGlvbnNbJ2VuYWJsZS1leHBlcmltZW50J107CiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMgPSB7fTsKCiAgaWYgKCFwYXJzZUNvbW1hbmRMaW5lRGVmaW5lcyhvcHRpb25zWydkZWZpbmUnXSwgZW52aXJvbm1lbnREZWZpbmVzLCB1c2FnZSkpIHsKICAgIHJldHVybiBiYWRVc2FnZUV4aXRDb2RlOwogIH0KCiAgaWYgKGFvdCkgewogICAgaWYgKCFsaW5rUGxhdGZvcm0pIHsKICAgICAgcHJpbnQoJ0Vycm9yOiAtLW5vLWxpbmstcGxhdGZvcm0gb3B0aW9uIGNhbm5vdCBiZSB1c2VkIHdpdGggLS1hb3QnKTsKICAgICAgcmV0dXJuIGJhZFVzYWdlRXhpdENvZGU7CiAgICB9CiAgICBpZiAoc3BsaXRPdXRwdXRCeVBhY2thZ2VzKSB7CiAgICAgIHByaW50KAogICAgICAgICAgJ0Vycm9yOiAtLXNwbGl0LW91dHB1dC1ieS1wYWNrYWdlcyBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCAtLWFvdCcpOwogICAgICByZXR1cm4gYmFkVXNhZ2VFeGl0Q29kZTsKICAgIH0KICB9CgogIGZpbmFsIEJ5dGVjb2RlT3B0aW9ucyBieXRlY29kZU9wdGlvbnMgPSBuZXcgQnl0ZWNvZGVPcHRpb25zKAogICAgZW5hYmxlQXNzZXJ0czogZW5hYmxlQXNzZXJ0cywKICAgIGVtaXRTb3VyY2VGaWxlczogZW1iZWRTb3VyY2VzLAogICAgZW52aXJvbm1lbnREZWZpbmVzOiBlbnZpcm9ubWVudERlZmluZXMsCiAgICBhb3Q6IGFvdCwKICApLi5wYXJzZUNvbW1hbmRMaW5lRmxhZ3Mob3B0aW9uc1snYnl0ZWNvZGUtb3B0aW9ucyddKTsKCiAgZmluYWwgdGFyZ2V0ID0gY3JlYXRlRnJvbnRFbmRUYXJnZXQodGFyZ2V0TmFtZSk7CiAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICBwcmludCgnRmFpbGVkIHRvIGNyZWF0ZSBmcm9udC1lbmQgdGFyZ2V0ICR0YXJnZXROYW1lLicpOwogICAgcmV0dXJuIGJhZFVzYWdlRXhpdENvZGU7CiAgfQoKICBmaW5hbCBmaWxlU3lzdGVtID0KICAgICAgY3JlYXRlRnJvbnRFbmRGaWxlU3lzdGVtKGZpbGVTeXN0ZW1TY2hlbWUsIGZpbGVTeXN0ZW1Sb290cyk7CgogIGZpbmFsIFVyaSBwYWNrYWdlc1VyaSA9IHBhY2thZ2VzICE9IG51bGwgPyByZXNvbHZlSW5wdXRVcmkocGFja2FnZXMpIDogbnVsbDsKCiAgZmluYWwgcGxhdGZvcm1LZXJuZWxVcmkgPSBVcmkuYmFzZS5yZXNvbHZlVXJpKG5ldyBVcmkuZmlsZShwbGF0Zm9ybUtlcm5lbCkpOwogIGZpbmFsIExpc3Q8VXJpPiBsaW5rZWREZXBlbmRlbmNpZXMgPSA8VXJpPltdOwogIGlmIChhb3QgfHwgbGlua1BsYXRmb3JtKSB7CiAgICBsaW5rZWREZXBlbmRlbmNpZXMuYWRkKHBsYXRmb3JtS2VybmVsVXJpKTsKICB9CgogIFVyaSBtYWluVXJpID0gcmVzb2x2ZUlucHV0VXJpKGlucHV0KTsKICBpZiAocGFja2FnZXNVcmkgIT0gbnVsbCkgewogICAgbWFpblVyaSA9IGF3YWl0IGNvbnZlcnRUb1BhY2thZ2VVcmkoZmlsZVN5c3RlbSwgbWFpblVyaSwgcGFja2FnZXNVcmkpOwogIH0KCiAgZmluYWwgZXJyb3JQcmludGVyID0gbmV3IEVycm9yUHJpbnRlcigpOwogIGZpbmFsIGVycm9yRGV0ZWN0b3IgPSBuZXcgRXJyb3JEZXRlY3RvcihwcmV2aW91c0Vycm9ySGFuZGxlcjogZXJyb3JQcmludGVyKTsKCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKQogICAgLi5zZGtTdW1tYXJ5ID0gcGxhdGZvcm1LZXJuZWxVcmkKICAgIC4udGFyZ2V0ID0gdGFyZ2V0CiAgICAuLmZpbGVTeXN0ZW0gPSBmaWxlU3lzdGVtCiAgICAuLmxpbmtlZERlcGVuZGVuY2llcyA9IGxpbmtlZERlcGVuZGVuY2llcwogICAgLi5wYWNrYWdlc0ZpbGVVcmkgPSBwYWNrYWdlc1VyaQogICAgLi5leHBlcmltZW50YWxGbGFncyA9IHBhcnNlRXhwZXJpbWVudGFsRmxhZ3MoCiAgICAgICAgcGFyc2VFeHBlcmltZW50YWxBcmd1bWVudHMoZXhwZXJpbWVudGFsRmxhZ3MpLAogICAgICAgIG9uRXJyb3I6IHByaW50KQogICAgLi5vbkRpYWdub3N0aWMgPSAoRGlhZ25vc3RpY01lc3NhZ2UgbSkgewogICAgICBlcnJvckRldGVjdG9yKG0pOwogICAgfQogICAgLi5lbWJlZFNvdXJjZVRleHQgPSBlbWJlZFNvdXJjZXM7CgogIGZpbmFsIHJlc3VsdHMgPSBhd2FpdCBjb21waWxlVG9LZXJuZWwobWFpblVyaSwgY29tcGlsZXJPcHRpb25zLAogICAgICBpbmNsdWRlUGxhdGZvcm06IGxpbmtlZERlcGVuZGVuY2llcy5pc05vdEVtcHR5LAogICAgICBhb3Q6IGFvdCwKICAgICAgdXNlR2xvYmFsVHlwZUZsb3dBbmFseXNpczogdGZhLAogICAgICBlbnZpcm9ubWVudERlZmluZXM6IGVudmlyb25tZW50RGVmaW5lcywKICAgICAgZW5hYmxlQXNzZXJ0czogZW5hYmxlQXNzZXJ0cywKICAgICAgZ2VuQnl0ZWNvZGU6IGdlbkJ5dGVjb2RlLAogICAgICBieXRlY29kZU9wdGlvbnM6IGJ5dGVjb2RlT3B0aW9ucywKICAgICAgZHJvcEFTVDogZHJvcEFTVCAmJiAhc3BsaXRPdXRwdXRCeVBhY2thZ2VzLAogICAgICB1c2VQcm90b2J1ZlRyZWVTaGFrZXI6IHVzZVByb3RvYnVmVHJlZVNoYWtlcik7CgogIGVycm9yUHJpbnRlci5wcmludENvbXBpbGF0aW9uTWVzc2FnZXMoKTsKCiAgaWYgKGVycm9yRGV0ZWN0b3IuaGFzQ29tcGlsYXRpb25FcnJvcnMgfHwgKHJlc3VsdHMuY29tcG9uZW50ID09IG51bGwpKSB7CiAgICByZXR1cm4gY29tcGlsZVRpbWVFcnJvckV4aXRDb2RlOwogIH0KCiAgaWYgKGJ5dGVjb2RlT3B0aW9ucy5zaG93Qnl0ZWNvZGVTaXplU3RhdGlzdGljcyAmJiAhc3BsaXRPdXRwdXRCeVBhY2thZ2VzKSB7CiAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLnJlc2V0KCk7CiAgfQoKICBmaW5hbCBJT1Npbmsgc2luayA9IG5ldyBGaWxlKG91dHB1dEZpbGVOYW1lKS5vcGVuV3JpdGUoKTsKICBmaW5hbCBCaW5hcnlQcmludGVyIHByaW50ZXIgPSBuZXcgQmluYXJ5UHJpbnRlcihzaW5rKTsKICBwcmludGVyLndyaXRlQ29tcG9uZW50RmlsZShyZXN1bHRzLmNvbXBvbmVudCk7CiAgYXdhaXQgc2luay5jbG9zZSgpOwoKICBpZiAoYnl0ZWNvZGVPcHRpb25zLnNob3dCeXRlY29kZVNpemVTdGF0aXN0aWNzICYmICFzcGxpdE91dHB1dEJ5UGFja2FnZXMpIHsKICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3MuZHVtcCgpOwogIH0KCiAgaWYgKGRlcGZpbGUgIT0gbnVsbCkgewogICAgYXdhaXQgd3JpdGVEZXBmaWxlKAogICAgICAgIGZpbGVTeXN0ZW0sIHJlc3VsdHMuY29tcGlsZWRTb3VyY2VzLCBvdXRwdXRGaWxlTmFtZSwgZGVwZmlsZSk7CiAgfQoKICBpZiAoc3BsaXRPdXRwdXRCeVBhY2thZ2VzKSB7CiAgICBhd2FpdCB3cml0ZU91dHB1dFNwbGl0QnlQYWNrYWdlcygKICAgICAgbWFpblVyaSwKICAgICAgY29tcGlsZXJPcHRpb25zLAogICAgICByZXN1bHRzLAogICAgICBvdXRwdXRGaWxlTmFtZSwKICAgICAgZ2VuQnl0ZWNvZGU6IGdlbkJ5dGVjb2RlLAogICAgICBieXRlY29kZU9wdGlvbnM6IGJ5dGVjb2RlT3B0aW9ucywKICAgICAgZHJvcEFTVDogZHJvcEFTVCwKICAgICk7CiAgfQoKICByZXR1cm4gc3VjY2Vzc0V4aXRDb2RlOwp9CgovLy8gUmVzdWx0cyBvZiBbY29tcGlsZVRvS2VybmVsXTogZ2VuZXJhdGVkIGtlcm5lbCBbQ29tcG9uZW50XSBhbmQKLy8vIGNvbGxlY3Rpb24gb2YgY29tcGlsZWQgc291cmNlcy4KY2xhc3MgS2VybmVsQ29tcGlsYXRpb25SZXN1bHRzIHsKICBmaW5hbCBDb21wb25lbnQgY29tcG9uZW50OwoKICAvLy8gU2V0IG9mIGxpYnJhcmllcyBsb2FkZWQgZnJvbSAuZGlsbCwgd2l0aCBvciB3aXRob3V0IHRoZSBTREsgZGVwZW5kaW5nIG9uCiAgLy8vIHRoZSBjb21waWxhdGlvbiBzZXR0aW5ncy4KICBmaW5hbCBTZXQ8TGlicmFyeT4gbG9hZGVkTGlicmFyaWVzOwogIGZpbmFsIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5OwogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgSXRlcmFibGU8VXJpPiBjb21waWxlZFNvdXJjZXM7CgogIEtlcm5lbENvbXBpbGF0aW9uUmVzdWx0cyh0aGlzLmNvbXBvbmVudCwgdGhpcy5sb2FkZWRMaWJyYXJpZXMsCiAgICAgIHRoaXMuY2xhc3NIaWVyYXJjaHksIHRoaXMuY29yZVR5cGVzLCB0aGlzLmNvbXBpbGVkU291cmNlcyk7Cn0KCi8vLyBHZW5lcmF0ZXMgYSBrZXJuZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2dyYW0gd2hvc2UgbWFpbiBsaWJyYXJ5IGlzIGluCi8vLyB0aGUgZ2l2ZW4gW3NvdXJjZV0uIEludGVuZGVkIGZvciB3aG9sZSBwcm9ncmFtIChub24tbW9kdWxhcikgY29tcGlsYXRpb24uCi8vLwovLy8gVk0tc3BlY2lmaWMgcmVwbGFjZW1lbnQgb2YgW2tlcm5lbEZvclByb2dyYW1dLgovLy8KRnV0dXJlPEtlcm5lbENvbXBpbGF0aW9uUmVzdWx0cz4gY29tcGlsZVRvS2VybmVsKAogICAgVXJpIHNvdXJjZSwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCiAgICB7Ym9vbCBpbmNsdWRlUGxhdGZvcm06IGZhbHNlLAogICAgYm9vbCBhb3Q6IGZhbHNlLAogICAgYm9vbCB1c2VHbG9iYWxUeXBlRmxvd0FuYWx5c2lzOiBmYWxzZSwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzLAogICAgYm9vbCBlbmFibGVBc3NlcnRzOiB0cnVlLAogICAgYm9vbCBnZW5CeXRlY29kZTogZmFsc2UsCiAgICBCeXRlY29kZU9wdGlvbnMgYnl0ZWNvZGVPcHRpb25zLAogICAgYm9vbCBkcm9wQVNUOiBmYWxzZSwKICAgIGJvb2wgdXNlUHJvdG9idWZUcmVlU2hha2VyOiBmYWxzZX0pIGFzeW5jIHsKICAvLyBSZXBsYWNlIGVycm9yIGhhbmRsZXIgdG8gZGV0ZWN0IGlmIHRoZXJlIGFyZSBjb21waWxhdGlvbiBlcnJvcnMuCiAgZmluYWwgZXJyb3JEZXRlY3RvciA9CiAgICAgIG5ldyBFcnJvckRldGVjdG9yKHByZXZpb3VzRXJyb3JIYW5kbGVyOiBvcHRpb25zLm9uRGlhZ25vc3RpYyk7CiAgb3B0aW9ucy5vbkRpYWdub3N0aWMgPSBlcnJvckRldGVjdG9yOwoKICBzZXRWTUVudmlyb25tZW50RGVmaW5lcyhlbnZpcm9ubWVudERlZmluZXMsIG9wdGlvbnMpOwogIENvbXBpbGVyUmVzdWx0IGNvbXBpbGVyUmVzdWx0ID0gYXdhaXQga2VybmVsRm9yUHJvZ3JhbShzb3VyY2UsIG9wdGlvbnMpOwogIENvbXBvbmVudCBjb21wb25lbnQgPSBjb21waWxlclJlc3VsdD8uY29tcG9uZW50OwogIGZpbmFsIGNvbXBpbGVkU291cmNlcyA9IGNvbXBvbmVudD8udXJpVG9Tb3VyY2U/LmtleXM7CgogIFNldDxMaWJyYXJ5PiBsb2FkZWRMaWJyYXJpZXMgPSBjcmVhdGVMb2FkZWRMaWJyYXJpZXNTZXQoCiAgICAgIGNvbXBpbGVyUmVzdWx0Py5sb2FkZWRDb21wb25lbnRzLCBjb21waWxlclJlc3VsdD8uc2RrQ29tcG9uZW50LAogICAgICBpbmNsdWRlUGxhdGZvcm06IGluY2x1ZGVQbGF0Zm9ybSk7CgogIC8vIFJ1biBnbG9iYWwgdHJhbnNmb3JtYXRpb25zIG9ubHkgaWYgY29tcG9uZW50IGlzIGNvcnJlY3QuCiAgaWYgKGFvdCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewogICAgYXdhaXQgcnVuR2xvYmFsVHJhbnNmb3JtYXRpb25zKAogICAgICAgIG9wdGlvbnMudGFyZ2V0LAogICAgICAgIGNvbXBvbmVudCwKICAgICAgICB1c2VHbG9iYWxUeXBlRmxvd0FuYWx5c2lzLAogICAgICAgIGVuYWJsZUFzc2VydHMsCiAgICAgICAgdXNlUHJvdG9idWZUcmVlU2hha2VyLAogICAgICAgIGVycm9yRGV0ZWN0b3IpOwogIH0KCiAgaWYgKGdlbkJ5dGVjb2RlICYmICFlcnJvckRldGVjdG9yLmhhc0NvbXBpbGF0aW9uRXJyb3JzICYmIGNvbXBvbmVudCAhPSBudWxsKSB7CiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcyA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIGlmIChsb2FkZWRMaWJyYXJpZXMuY29udGFpbnMobGlicmFyeSkpIGNvbnRpbnVlOwogICAgICBsaWJyYXJpZXMuYWRkKGxpYnJhcnkpOwogICAgfQoKICAgIGF3YWl0IHJ1bldpdGhGcm9udEVuZENvbXBpbGVyQ29udGV4dChzb3VyY2UsIG9wdGlvbnMsIGNvbXBvbmVudCwgKCkgewogICAgICBnZW5lcmF0ZUJ5dGVjb2RlKGNvbXBvbmVudCwKICAgICAgICAgIGxpYnJhcmllczogbGlicmFyaWVzLAogICAgICAgICAgaGllcmFyY2h5OiBjb21waWxlclJlc3VsdC5jbGFzc0hpZXJhcmNoeSwKICAgICAgICAgIGNvcmVUeXBlczogY29tcGlsZXJSZXN1bHQuY29yZVR5cGVzLAogICAgICAgICAgb3B0aW9uczogYnl0ZWNvZGVPcHRpb25zKTsKICAgIH0pOwoKICAgIGlmIChkcm9wQVNUKSB7CiAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZUZyZXNoQ29tcG9uZW50V2l0aEJ5dGVjb2RlKGNvbXBvbmVudCk7CiAgICB9CiAgfQoKICAvLyBSZXN0b3JlIGVycm9yIGhhbmRsZXIgKGluIGNhc2UgJ29wdGlvbnMnIGFyZSByZXVzZWQpLgogIG9wdGlvbnMub25EaWFnbm9zdGljID0gZXJyb3JEZXRlY3Rvci5wcmV2aW91c0Vycm9ySGFuZGxlcjsKCiAgcmV0dXJuIG5ldyBLZXJuZWxDb21waWxhdGlvblJlc3VsdHMoCiAgICAgIGNvbXBvbmVudCwKICAgICAgbG9hZGVkTGlicmFyaWVzLAogICAgICBjb21waWxlclJlc3VsdD8uY2xhc3NIaWVyYXJjaHksCiAgICAgIGNvbXBpbGVyUmVzdWx0Py5jb3JlVHlwZXMsCiAgICAgIGNvbXBpbGVkU291cmNlcyk7Cn0KClNldDxMaWJyYXJ5PiBjcmVhdGVMb2FkZWRMaWJyYXJpZXNTZXQoCiAgICBMaXN0PENvbXBvbmVudD4gbG9hZGVkQ29tcG9uZW50cywgQ29tcG9uZW50IHNka0NvbXBvbmVudCwKICAgIHtib29sIGluY2x1ZGVQbGF0Zm9ybTogZmFsc2V9KSB7CiAgZmluYWwgU2V0PExpYnJhcnk+IGxvYWRlZExpYnJhcmllcyA9IHt9OwogIGlmIChsb2FkZWRDb21wb25lbnRzICE9IG51bGwpIHsKICAgIGZvciAoQ29tcG9uZW50IGMgaW4gbG9hZGVkQ29tcG9uZW50cykgewogICAgICBmb3IgKExpYnJhcnkgbGliIGluIGMubGlicmFyaWVzKSB7CiAgICAgICAgbG9hZGVkTGlicmFyaWVzLmFkZChsaWIpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChzZGtDb21wb25lbnQgIT0gbnVsbCkgewogICAgaWYgKGluY2x1ZGVQbGF0Zm9ybSkgewogICAgICBmb3IgKExpYnJhcnkgbGliIGluIHNka0NvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgICBsb2FkZWRMaWJyYXJpZXMucmVtb3ZlKGxpYik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoTGlicmFyeSBsaWIgaW4gc2RrQ29tcG9uZW50LmxpYnJhcmllcykgewogICAgICAgIGxvYWRlZExpYnJhcmllcy5hZGQobGliKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbG9hZGVkTGlicmFyaWVzOwp9Cgp2b2lkIHNldFZNRW52aXJvbm1lbnREZWZpbmVzKAogICAgTWFwPFN0cmluZywgZHluYW1pYz4gZW52aXJvbm1lbnREZWZpbmVzLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgewogIC8vIFRPRE8oYWxleG1hcmtvdik6IG1vdmUgdGhpcyBsb2dpYyBpbnRvIFZtVGFyZ2V0IGFuZCBjYWxsIGZyb20gZnJvbnQtZW5kCiAgLy8gaW4gb3JkZXIgdG8gaGF2ZSB0aGUgc2FtZSBkZWZpbmVzIHdoZW4gY29tcGlsaW5nIHBsYXRmb3JtLgogIGFzc2VydChlbnZpcm9ubWVudERlZmluZXMgIT0gbnVsbCk7CiAgaWYgKGVudmlyb25tZW50RGVmaW5lc1snZGFydC52bS5wcm9kdWN0J10gPT0gJ3RydWUnKSB7CiAgICBlbnZpcm9ubWVudERlZmluZXNbJ2RhcnQuZGV2ZWxvcGVyLmNhdXNhbF9hc3luY19zdGFja3MnXSA9ICdmYWxzZSc7CiAgfQogIGVudmlyb25tZW50RGVmaW5lc1snZGFydC5pc1ZNJ10gPSAndHJ1ZSc7CiAgLy8gVE9ETyhkYXJ0YnVnLmNvbS8zNjQ2MCk6IERlcml2ZSBkYXJ0LmxpYnJhcnkuKiBkZWZpbml0aW9ucyBmcm9tIHBsYXRmb3JtLgogIGZvciAoU3RyaW5nIGxpYnJhcnkgaW4gb3B0aW9ucy50YXJnZXQuZXh0cmFSZXF1aXJlZExpYnJhcmllcykgewogICAgVXJpIGxpYnJhcnlVcmkgPSBVcmkucGFyc2UobGlicmFyeSk7CiAgICBpZiAobGlicmFyeVVyaS5zY2hlbWUgPT0gJ2RhcnQnKSB7CiAgICAgIGZpbmFsIHBhdGggPSBsaWJyYXJ5VXJpLnBhdGg7CiAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCdfJykpIHsKICAgICAgICBlbnZpcm9ubWVudERlZmluZXNbJ2RhcnQubGlicmFyeS4ke3BhdGh9J10gPSAndHJ1ZSc7CiAgICAgIH0KICAgIH0KICB9CiAgLy8gZGFydDpjb3JlIGlzIG5vdCBtZW50aW9uZWQgaW4gVGFyZ2V0LmV4dHJhUmVxdWlyZWRMaWJyYXJpZXMuCiAgZW52aXJvbm1lbnREZWZpbmVzWydkYXJ0LmxpYnJhcnkuY29yZSddID0gJ3RydWUnOwogIG9wdGlvbnMuZW52aXJvbm1lbnREZWZpbmVzID0gZW52aXJvbm1lbnREZWZpbmVzOwp9CgpGdXR1cmUgcnVuR2xvYmFsVHJhbnNmb3JtYXRpb25zKAogICAgVGFyZ2V0IHRhcmdldCwKICAgIENvbXBvbmVudCBjb21wb25lbnQsCiAgICBib29sIHVzZUdsb2JhbFR5cGVGbG93QW5hbHlzaXMsCiAgICBib29sIGVuYWJsZUFzc2VydHMsCiAgICBib29sIHVzZVByb3RvYnVmVHJlZVNoYWtlciwKICAgIEVycm9yRGV0ZWN0b3IgZXJyb3JEZXRlY3RvcikgYXN5bmMgewogIGlmIChlcnJvckRldGVjdG9yLmhhc0NvbXBpbGF0aW9uRXJyb3JzKSByZXR1cm47CgogIGZpbmFsIGNvcmVUeXBlcyA9IG5ldyBDb3JlVHlwZXMoY29tcG9uZW50KTsKCiAgLy8gVE9ETyhhbGV4bWFya292LCBkbWl0cnlhcyk6IENvbnNpZGVyIGRvaW5nIGNhbm9uaWNhbGl6YXRpb24gb2YgaWRlbnRpY2FsCiAgLy8gbWl4aW4gYXBwbGljYXRpb25zIHdoZW4gY3JlYXRpbmcgbWl4aW4gYXBwbGljYXRpb25zIGluIGZyb250ZW5kLAogIC8vIHNvIGFsbCBiYWNrZW5kcyAoYW5kIGFsbCB0cmFuc2Zvcm1hdGlvbiBwYXNzZXMgZnJvbSB0aGUgdmVyeSBiZWdpbm5pbmcpCiAgLy8gY2FuIGJlbmVmaXQgZnJvbSBtaXhpbiBkZS1kdXBsaWNhdGlvbi4KICAvLyBBdCBsZWFzdCwgaW4gYWRkaXRpb24gdG8gVk0vQU9UIGNhc2Ugd2Ugc2hvdWxkIHJ1biB0aGlzIHRyYW5zZm9ybWF0aW9uCiAgLy8gd2hlbiBidWlsZGluZyBhIHBsYXRmb3JtIGRpbGwgZmlsZSBmb3IgVk0vSklUIGNhc2UuCiAgbWl4aW5fZGVkdXBsaWNhdGlvbi50cmFuc2Zvcm1Db21wb25lbnQoY29tcG9uZW50KTsKCiAgLy8gVW5yZWFjaGFibGUgY29kZSBlbGltaW5hdGlvbiB0cmFuc2Zvcm1hdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkCiAgLy8gYmVmb3JlIHR5cGUgZmxvdyBhbmFseXNpcyBzbyBURkEgd29uJ3QgdGFrZSB1bnJlYWNoYWJsZSBjb2RlIGludG8gYWNjb3VudC4KICB1bnJlYWNoYWJsZV9jb2RlX2VsaW1pbmF0aW9uLnRyYW5zZm9ybUNvbXBvbmVudChjb21wb25lbnQsIGVuYWJsZUFzc2VydHMpOwoKICBpZiAodXNlR2xvYmFsVHlwZUZsb3dBbmFseXNpcykgewogICAgZ2xvYmFsVHlwZUZsb3cudHJhbnNmb3JtQ29tcG9uZW50KHRhcmdldCwgY29yZVR5cGVzLCBjb21wb25lbnQpOwogIH0gZWxzZSB7CiAgICBkZXZpcnR1YWxpemF0aW9uLnRyYW5zZm9ybUNvbXBvbmVudChjb3JlVHlwZXMsIGNvbXBvbmVudCk7CiAgICBub19keW5hbWljX2ludm9jYXRpb25zX2Fubm90YXRvci50cmFuc2Zvcm1Db21wb25lbnQoY29tcG9uZW50KTsKICB9CgogIGlmICh1c2VQcm90b2J1ZlRyZWVTaGFrZXIpIHsKICAgIGlmICghdXNlR2xvYmFsVHlwZUZsb3dBbmFseXNpcykgewogICAgICB0aHJvdyAnUHJvdG9idWYgdHJlZSBzaGFrZXIgcmVxdWlyZXMgdHlwZSBmbG93IGFuYWx5c2lzICgtLXRmYSknOwogICAgfQoKICAgIHByb3RvYnVmX3RyZWVfc2hha2VyLnJlbW92ZVVudXNlZFByb3RvUmVmZXJlbmNlcygKICAgICAgICBjb21wb25lbnQsIGNvcmVUeXBlcywgbnVsbCk7CgogICAgZ2xvYmFsVHlwZUZsb3cudHJhbnNmb3JtQ29tcG9uZW50KHRhcmdldCwgY29yZVR5cGVzLCBjb21wb25lbnQpOwogIH0KCiAgLy8gVE9ETygzNTA2OSk6IGF2b2lkIHJlY29tcHV0aW5nIENTQSBieSByZWFkaW5nIGl0IGZyb20gdGhlIHBsYXRmb3JtIGZpbGVzLgogIHZvaWQgaWdub3JlQW1iaWd1b3VzU3VwZXJ0eXBlcyhjbHMsIGEsIGIpIHt9CiAgZmluYWwgaGllcmFyY2h5ID0gbmV3IENsYXNzSGllcmFyY2h5KGNvbXBvbmVudCwgY29yZVR5cGVzLAogICAgICBvbkFtYmlndW91c1N1cGVydHlwZXM6IGlnbm9yZUFtYmlndW91c1N1cGVydHlwZXMpOwogIGNhbGxfc2l0ZV9hbm5vdGF0b3IudHJhbnNmb3JtTGlicmFyaWVzKAogICAgICBjb21wb25lbnQsIGNvbXBvbmVudC5saWJyYXJpZXMsIGNvcmVUeXBlcywgaGllcmFyY2h5KTsKCiAgLy8gV2UgZG9uJ3Qga25vdyB5ZXQgd2hldGhlciBnZW5fc25hcHNob3Qgd2lsbCB3YW50IHRvIGRvIG9iZnVzY2F0aW9uLCBidXQgaWYKICAvLyBpdCBkb2VzIGl0IHdpbGwgbmVlZCB0aGUgb2JmdXNjYXRpb24gcHJvaGliaXRpb25zLgogIG9iZnVzY2F0aW9uUHJvaGliaXRpb25zLnRyYW5zZm9ybUNvbXBvbmVudChjb21wb25lbnQsIGNvcmVUeXBlcyk7Cn0KCi8vLyBSdW5zIGdpdmVuIFthY3Rpb25dIHdpdGggW0NvbXBpbGVyQ29udGV4dF0uIFRoaXMgaXMgbmVlZGVkIHRvCi8vLyBiZSBhYmxlIHRvIHJlcG9ydCBjb21waWxlLXRpbWUgZXJyb3JzLgpGdXR1cmU8VD4gcnVuV2l0aEZyb250RW5kQ29tcGlsZXJDb250ZXh0PFQ+KFVyaSBzb3VyY2UsCiAgICBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zLCBDb21wb25lbnQgY29tcG9uZW50LCBUIGFjdGlvbigpKSBhc3luYyB7CiAgZmluYWwgcHJvY2Vzc2VkT3B0aW9ucyA9CiAgICAgIG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IGNvbXBpbGVyT3B0aW9ucywgaW5wdXRzOiBbc291cmNlXSk7CgogIC8vIFJ1biB3aXRoaW4gdGhlIGNvbnRleHQsIHNvIHdlIGhhdmUgdXJpIHNvdXJjZSB0b2tlbnMuLi4KICByZXR1cm4gYXdhaXQgQ29tcGlsZXJDb250ZXh0LnJ1bldpdGhPcHRpb25zKHByb2Nlc3NlZE9wdGlvbnMsCiAgICAgIChDb21waWxlckNvbnRleHQgY29udGV4dCkgYXN5bmMgewogICAgLy8gVG8gbWFrZSB0aGUgZmlsZVVyaS9maWxlT2Zmc2V0IC0+IGxpbmUvY29sdW1uIG1hcHBpbmcsIHdlIG5lZWQgdG8KICAgIC8vIHByZS1maWxsIHRoZSBtYXAuCiAgICBjb250ZXh0LnVyaVRvU291cmNlLmFkZEFsbChjb21wb25lbnQudXJpVG9Tb3VyY2UpOwoKICAgIHJldHVybiBhY3Rpb24oKTsKICB9KTsKfQoKY2xhc3MgRXJyb3JEZXRlY3RvciB7CiAgZmluYWwgRGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVyIHByZXZpb3VzRXJyb3JIYW5kbGVyOwogIGJvb2wgaGFzQ29tcGlsYXRpb25FcnJvcnMgPSBmYWxzZTsKCiAgRXJyb3JEZXRlY3Rvcih7dGhpcy5wcmV2aW91c0Vycm9ySGFuZGxlcn0pOwoKICB2b2lkIGNhbGwoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogICAgaWYgKG1lc3NhZ2Uuc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuZXJyb3IpIHsKICAgICAgaGFzQ29tcGlsYXRpb25FcnJvcnMgPSB0cnVlOwogICAgfQoKICAgIHByZXZpb3VzRXJyb3JIYW5kbGVyPy5jYWxsKG1lc3NhZ2UpOwogIH0KfQoKY2xhc3MgRXJyb3JQcmludGVyIHsKICBmaW5hbCBEaWFnbm9zdGljTWVzc2FnZUhhbmRsZXIgcHJldmlvdXNFcnJvckhhbmRsZXI7CiAgZmluYWwgY29tcGlsYXRpb25NZXNzYWdlcyA9IDxVcmksIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+Pnt9OwoKICBFcnJvclByaW50ZXIoe3RoaXMucHJldmlvdXNFcnJvckhhbmRsZXJ9KTsKCiAgdm9pZCBjYWxsKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIGZpbmFsIHNvdXJjZVVyaSA9IGdldE1lc3NhZ2VVcmkobWVzc2FnZSk7CiAgICAoY29tcGlsYXRpb25NZXNzYWdlc1tzb3VyY2VVcmldID8/PSA8RGlhZ25vc3RpY01lc3NhZ2U+W10pLmFkZChtZXNzYWdlKTsKICAgIHByZXZpb3VzRXJyb3JIYW5kbGVyPy5jYWxsKG1lc3NhZ2UpOwogIH0KCiAgdm9pZCBwcmludENvbXBpbGF0aW9uTWVzc2FnZXMoKSB7CiAgICBmaW5hbCBzb3J0ZWRVcmlzID0gY29tcGlsYXRpb25NZXNzYWdlcy5rZXlzLnRvTGlzdCgpCiAgICAgIC4uc29ydCgoYSwgYikgPT4gJyRhJy5jb21wYXJlVG8oJyRiJykpOwogICAgZm9yIChmaW5hbCBVcmkgc291cmNlVXJpIGluIHNvcnRlZFVyaXMpIHsKICAgICAgZm9yIChmaW5hbCBEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlIGluIGNvbXBpbGF0aW9uTWVzc2FnZXNbc291cmNlVXJpXSkgewogICAgICAgIHByaW50RGlhZ25vc3RpY01lc3NhZ2UobWVzc2FnZSwgcHJpbnQpOwogICAgICB9CiAgICB9CiAgfQp9Cgpib29sIHBhcnNlQ29tbWFuZExpbmVEZWZpbmVzKAogICAgTGlzdDxTdHJpbmc+IGRGbGFncywgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMsIFN0cmluZyB1c2FnZSkgewogIGZvciAoZmluYWwgU3RyaW5nIGRmbGFnIGluIGRGbGFncykgewogICAgZmluYWwgZXF1YWxzU2lnbkluZGV4ID0gZGZsYWcuaW5kZXhPZignPScpOwogICAgaWYgKGVxdWFsc1NpZ25JbmRleCA8IDApIHsKICAgICAgLy8gSWdub3JlZC4KICAgIH0gZWxzZSBpZiAoZXF1YWxzU2lnbkluZGV4ID4gMCkgewogICAgICBmaW5hbCBrZXkgPSBkZmxhZy5zdWJzdHJpbmcoMCwgZXF1YWxzU2lnbkluZGV4KTsKICAgICAgZmluYWwgdmFsdWUgPSBkZmxhZy5zdWJzdHJpbmcoZXF1YWxzU2lnbkluZGV4ICsgMSk7CiAgICAgIGVudmlyb25tZW50RGVmaW5lc1trZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBwcmludCgnVGhlIGVudmlyb25tZW50IGNvbnN0YW50IG9wdGlvbnMgbXVzdCBoYXZlIGEga2V5ICh3YXM6ICIkZGZsYWciKScpOwogICAgICBwcmludCh1c2FnZSk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCi8vLyBDcmVhdGUgZnJvbnQtZW5kIHRhcmdldCB3aXRoIGdpdmVuIG5hbWUuClRhcmdldCBjcmVhdGVGcm9udEVuZFRhcmdldChTdHJpbmcgdGFyZ2V0TmFtZSwKICAgIHtib29sIHRyYWNrV2lkZ2V0Q3JlYXRpb24gPSBmYWxzZX0pIHsKICAvLyBNYWtlIHN1cmUgVk0tc3BlY2lmaWMgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlLgogIGluc3RhbGxBZGRpdGlvbmFsVGFyZ2V0cygpOwoKICBmaW5hbCBUYXJnZXRGbGFncyB0YXJnZXRGbGFncyA9CiAgICAgIG5ldyBUYXJnZXRGbGFncyh0cmFja1dpZGdldENyZWF0aW9uOiB0cmFja1dpZGdldENyZWF0aW9uKTsKICByZXR1cm4gZ2V0VGFyZ2V0KHRhcmdldE5hbWUsIHRhcmdldEZsYWdzKTsKfQoKLy8vIENyZWF0ZSBhIGZyb250LWVuZCBmaWxlIHN5c3RlbS4KLy8vCi8vLyBJZiByZXF1ZXN0ZWQsIGNyZWF0ZSBhIHZpcnR1YWwgbXV0bGktcm9vdCBmaWxlIHN5c3RlbSBhbmQvb3IgYW4gaHR0cCBhd2FyZQovLy8gZmlsZSBzeXN0ZW0uCkZpbGVTeXN0ZW0gY3JlYXRlRnJvbnRFbmRGaWxlU3lzdGVtKAogICAgU3RyaW5nIG11bHRpUm9vdEZpbGVTeXN0ZW1TY2hlbWUsIExpc3Q8U3RyaW5nPiBtdWx0aVJvb3RGaWxlU3lzdGVtUm9vdHMsCiAgICB7Ym9vbCBhbGxvd0h0dHB9KSB7CiAgYWxsb3dIdHRwID8/PSBmYWxzZTsKICBGaWxlU3lzdGVtIGZpbGVTeXN0ZW0gPSBTdGFuZGFyZEZpbGVTeXN0ZW0uaW5zdGFuY2U7CiAgaWYgKGFsbG93SHR0cCkgewogICAgZmlsZVN5c3RlbSA9IEh0dHBBd2FyZUZpbGVTeXN0ZW0oZmlsZVN5c3RlbSk7CiAgfQogIGlmIChtdWx0aVJvb3RGaWxlU3lzdGVtUm9vdHMgIT0gbnVsbCAmJgogICAgICBtdWx0aVJvb3RGaWxlU3lzdGVtUm9vdHMuaXNOb3RFbXB0eSAmJgogICAgICBtdWx0aVJvb3RGaWxlU3lzdGVtU2NoZW1lICE9IG51bGwpIHsKICAgIGZpbmFsIHJvb3RVcmlzID0gPFVyaT5bXTsKICAgIGZvciAoU3RyaW5nIHJvb3QgaW4gbXVsdGlSb290RmlsZVN5c3RlbVJvb3RzKSB7CiAgICAgIHJvb3RVcmlzLmFkZChyZXNvbHZlSW5wdXRVcmkocm9vdCkpOwogICAgfQogICAgZmlsZVN5c3RlbSA9IG5ldyBNdWx0aVJvb3RGaWxlU3lzdGVtKAogICAgICAgIG11bHRpUm9vdEZpbGVTeXN0ZW1TY2hlbWUsIHJvb3RVcmlzLCBmaWxlU3lzdGVtKTsKICB9CiAgcmV0dXJuIGZpbGVTeXN0ZW07Cn0KCi8vLyBDb252ZXJ0IGEgVVJJIHdoaWNoIG1heSB1c2UgdmlydHVhbCBmaWxlIHN5c3RlbSBzY2hlbWEgdG8gYSByZWFsIGZpbGUgVVJJLgpGdXR1cmU8VXJpPiBhc0ZpbGVVcmkoRmlsZVN5c3RlbSBmaWxlU3lzdGVtLCBVcmkgdXJpKSBhc3luYyB7CiAgRmlsZVN5c3RlbUVudGl0eSBmc2UgPSBmaWxlU3lzdGVtLmVudGl0eUZvclVyaSh1cmkpOwogIGlmIChmc2UgaXMgTXVsdGlSb290RmlsZVN5c3RlbUVudGl0eSkgewogICAgZnNlID0gYXdhaXQgKGZzZSBhcyBNdWx0aVJvb3RGaWxlU3lzdGVtRW50aXR5KS5kZWxlZ2F0ZTsKICB9CiAgcmV0dXJuIGZzZS51cmk7Cn0KCi8vLyBDb252ZXJ0IFVSSSB0byBhIHBhY2thZ2UgVVJJIGlmIGl0IGlzIGluc2lkZSBvbmUgb2YgdGhlIHBhY2thZ2VzLgpGdXR1cmU8VXJpPiBjb252ZXJ0VG9QYWNrYWdlVXJpKAogICAgRmlsZVN5c3RlbSBmaWxlU3lzdGVtLCBVcmkgdXJpLCBVcmkgcGFja2FnZXNVcmkpIGFzeW5jIHsKICBpZiAodXJpLnNjaGVtZSA9PSAncGFja2FnZScpIHsKICAgIHJldHVybiB1cmk7CiAgfQogIC8vIENvbnZlcnQgdmlydHVhbCBVUkkgdG8gYSByZWFsIGZpbGUgVVJJLgogIFN0cmluZyB1cmlTdHJpbmcgPSAoYXdhaXQgYXNGaWxlVXJpKGZpbGVTeXN0ZW0sIHVyaSkpLnRvU3RyaW5nKCk7CiAgTGlzdDxTdHJpbmc+IHBhY2thZ2VzOwogIHRyeSB7CiAgICBwYWNrYWdlcyA9CiAgICAgICAgYXdhaXQgbmV3IEZpbGUoKGF3YWl0IGFzRmlsZVVyaShmaWxlU3lzdGVtLCBwYWNrYWdlc1VyaSkpLnRvRmlsZVBhdGgoKSkKICAgICAgICAgICAgLnJlYWRBc0xpbmVzKCk7CiAgfSBvbiBJT0V4Y2VwdGlvbiB7CiAgICAvLyBDYW4ndCByZWFkIHBhY2thZ2VzIGZpbGUgLSBzaWxlbnRseSBnaXZlIHVwLgogICAgcmV0dXJuIHVyaTsKICB9CiAgLy8gZmlsZTovLy9hL2IveC95L21haW4uZGFydCAtPiBwYWNrYWdlOngueS9tYWluLmRhcnQKICBmb3IgKHZhciBsaW5lIGluIHBhY2thZ2VzKSB7CiAgICBpZiAobGluZS5pc0VtcHR5IHx8IGxpbmUuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGZpbmFsIGNvbG9uID0gbGluZS5pbmRleE9mKCc6Jyk7CiAgICBpZiAoY29sb24gPT0gLTEpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBmaW5hbCBwYWNrYWdlTmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbG9uKTsKICAgIFN0cmluZyBwYWNrYWdlUGF0aDsKICAgIHRyeSB7CiAgICAgIHBhY2thZ2VQYXRoID0gKGF3YWl0IGFzRmlsZVVyaSgKICAgICAgICAgICAgICBmaWxlU3lzdGVtLCBwYWNrYWdlc1VyaS5yZXNvbHZlKGxpbmUuc3Vic3RyaW5nKGNvbG9uICsgMSkpKSkKICAgICAgICAgIC50b1N0cmluZygpOwogICAgfSBvbiBGaWxlU3lzdGVtRXhjZXB0aW9uIHsKICAgICAgLy8gQ2FuJ3QgcmVzb2x2ZSBwYWNrYWdlIHBhdGguCiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHVyaVN0cmluZy5zdGFydHNXaXRoKHBhY2thZ2VQYXRoKSkgewogICAgICByZXR1cm4gVXJpLnBhcnNlKAogICAgICAgICAgJ3BhY2thZ2U6JHBhY2thZ2VOYW1lLyR7dXJpU3RyaW5nLnN1YnN0cmluZyhwYWNrYWdlUGF0aC5sZW5ndGgpfScpOwogICAgfQogIH0KICByZXR1cm4gdXJpOwp9CgovLy8gV3JpdGUgYSBzZXBhcmF0ZSBrZXJuZWwgYmluYXJ5IGZvciBlYWNoIHBhY2thZ2UuIFRoZSBuYW1lIG9mIHRoZQovLy8gb3V0cHV0IGtlcm5lbCBiaW5hcnkgaXMgJ1tvdXRwdXRGaWxlTmFtZV0tJHBhY2thZ2UuZGlscCcuCi8vLyBUaGUgbGlzdCBvZiBwYWNrYWdlIG5hbWVzIGlzIHdyaXR0ZW4gaW50byBhIGZpbGUgJ1tvdXRwdXRGaWxlTmFtZV0tcGFja2FnZXMnLgovLy8KLy8vIEdlbmVyYXRlcyBieXRlY29kZSBmb3IgZWFjaCBwYWNrYWdlIGlmIHJlcXVlc3RlZC4KRnV0dXJlIHdyaXRlT3V0cHV0U3BsaXRCeVBhY2thZ2VzKAogIFVyaSBzb3VyY2UsCiAgQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucywKICBLZXJuZWxDb21waWxhdGlvblJlc3VsdHMgY29tcGlsYXRpb25SZXN1bHRzLAogIFN0cmluZyBvdXRwdXRGaWxlTmFtZSwgewogIGJvb2wgZ2VuQnl0ZWNvZGU6IGZhbHNlLAogIEJ5dGVjb2RlT3B0aW9ucyBieXRlY29kZU9wdGlvbnMsCiAgYm9vbCBkcm9wQVNUOiBmYWxzZSwKfSkgYXN5bmMgewogIGlmIChieXRlY29kZU9wdGlvbnMuc2hvd0J5dGVjb2RlU2l6ZVN0YXRpc3RpY3MpIHsKICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3MucmVzZXQoKTsKICB9CgogIGZpbmFsIHBhY2thZ2VzID0gbmV3IExpc3Q8U3RyaW5nPigpOwogIGF3YWl0IHJ1bldpdGhGcm9udEVuZENvbXBpbGVyQ29udGV4dCgKICAgICAgc291cmNlLCBjb21waWxlck9wdGlvbnMsIGNvbXBpbGF0aW9uUmVzdWx0cy5jb21wb25lbnQsICgpIGFzeW5jIHsKICAgIC8vIFdoZW4gbG9hZGluZyBhIGtlcm5lbCBmaWxlIGxpc3QsIGZsdXR0ZXJfcnVubmVyIGFuZCBkYXJ0X3J1bm5lciBleHBlY3QKICAgIC8vICdtYWluJyB0byBiZSBsYXN0LgogICAgYXdhaXQgZm9yRWFjaFBhY2thZ2UoY29tcGlsYXRpb25SZXN1bHRzLAogICAgICAgIChTdHJpbmcgcGFja2FnZSwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpIGFzeW5jIHsKICAgICAgcGFja2FnZXMuYWRkKHBhY2thZ2UpOwogICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSAnJG91dHB1dEZpbGVOYW1lLSRwYWNrYWdlLmRpbHAnOwogICAgICBmaW5hbCBJT1Npbmsgc2luayA9IG5ldyBGaWxlKGZpbGVuYW1lKS5vcGVuV3JpdGUoKTsKCiAgICAgIENvbXBvbmVudCBwYXJ0Q29tcG9uZW50ID0gY29tcGlsYXRpb25SZXN1bHRzLmNvbXBvbmVudDsKICAgICAgaWYgKGdlbkJ5dGVjb2RlKSB7CiAgICAgICAgZ2VuZXJhdGVCeXRlY29kZShwYXJ0Q29tcG9uZW50LAogICAgICAgICAgICBvcHRpb25zOiBieXRlY29kZU9wdGlvbnMsCiAgICAgICAgICAgIGxpYnJhcmllczogbGlicmFyaWVzLAogICAgICAgICAgICBoaWVyYXJjaHk6IGNvbXBpbGF0aW9uUmVzdWx0cy5jbGFzc0hpZXJhcmNoeSwKICAgICAgICAgICAgY29yZVR5cGVzOiBjb21waWxhdGlvblJlc3VsdHMuY29yZVR5cGVzKTsKCiAgICAgICAgaWYgKGRyb3BBU1QpIHsKICAgICAgICAgIHBhcnRDb21wb25lbnQgPSBjcmVhdGVGcmVzaENvbXBvbmVudFdpdGhCeXRlY29kZShwYXJ0Q29tcG9uZW50KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZpbmFsIEJpbmFyeVByaW50ZXIgcHJpbnRlciA9IG5ldyBMaW1pdGVkQmluYXJ5UHJpbnRlcigKICAgICAgICAgIHNpbmssCiAgICAgICAgICAobGliKSA9PgogICAgICAgICAgICAgIHBhY2thZ2VGb3IobGliLCBjb21waWxhdGlvblJlc3VsdHMubG9hZGVkTGlicmFyaWVzKSA9PSBwYWNrYWdlLAogICAgICAgICAgZmFsc2UgLyogZXhjbHVkZVVyaVRvU291cmNlICovKTsKICAgICAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUocGFydENvbXBvbmVudCk7CgogICAgICBhd2FpdCBzaW5rLmNsb3NlKCk7CiAgICB9LCBtYWluRmlyc3Q6IGZhbHNlKTsKICB9KTsKCiAgaWYgKGJ5dGVjb2RlT3B0aW9ucy5zaG93Qnl0ZWNvZGVTaXplU3RhdGlzdGljcykgewogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5kdW1wKCk7CiAgfQoKICBmaW5hbCBJT1NpbmsgcGFja2FnZXNMaXN0ID0gbmV3IEZpbGUoJyRvdXRwdXRGaWxlTmFtZS1wYWNrYWdlcycpLm9wZW5Xcml0ZSgpOwogIGZvciAoU3RyaW5nIHBhY2thZ2UgaW4gcGFja2FnZXMpIHsKICAgIHBhY2thZ2VzTGlzdC53cml0ZWxuKHBhY2thZ2UpOwogIH0KICBhd2FpdCBwYWNrYWdlc0xpc3QuY2xvc2UoKTsKfQoKU3RyaW5nIHBhY2thZ2VGb3IoTGlicmFyeSBsaWIsIFNldDxMaWJyYXJ5PiBsb2FkZWRMaWJyYXJpZXMpIHsKICAvLyBDb3JlIGxpYnJhcmllcyBhcmUgbm90IHdyaXR0ZW4gaW50byBhbnkgcGFja2FnZSBrZXJuZWwgYmluYXJpZXMuCiAgaWYgKGxvYWRlZExpYnJhcmllcy5jb250YWlucyhsaWIpKSByZXR1cm4gbnVsbDsKCiAgLy8gUGFja2FnZXMgYXJlIHdyaXR0ZW4gaW50byB0aGVpciBvd24ga2VybmVsIGJpbmFyaWVzLgogIFVyaSB1cmkgPSBsaWIuaW1wb3J0VXJpOwogIGlmICh1cmkuc2NoZW1lID09ICdwYWNrYWdlJykgcmV0dXJuIHVyaS5wYXRoU2VnbWVudHMuZmlyc3Q7CgogIC8vIEV2ZXJ5dGhpbmcgZWxzZSAoZS5nLiwgZmlsZTogb3IgZGF0YTogaW1wb3J0cykgaXMgbHVtcGVkIGludG8gdGhlIG1haW4KICAvLyBrZXJuZWwgYmluYXJ5LgogIHJldHVybiAnbWFpbic7Cn0KCi8vLyBTb3J0IHRoZSBsaWJyYXJpZXMgZXRjIGluIHRoZSBjb21wb25lbnQuIEhlbHBzIHBhY2thZ2VzIHRvIHByb2R1Y2UgaWRlbnRpY2FsCi8vLyBvdXRwdXQgd2hlbiB0aGVpciBwYXJ0cyBhcmUgaW1wb3J0ZWQgaW4gZGlmZmVyZW50IG9yZGVycyBpbiBkaWZmZXJlbnQKLy8vIGNvbnRleHRzLgp2b2lkIHNvcnRDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgewogIGNvbXBvbmVudC5saWJyYXJpZXMuc29ydCgoTGlicmFyeSBhLCBMaWJyYXJ5IGIpIHsKICAgIHJldHVybiBhLmltcG9ydFVyaS50b1N0cmluZygpLmNvbXBhcmVUbyhiLmltcG9ydFVyaS50b1N0cmluZygpKTsKICB9KTsKICBjb21wb25lbnQuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgZm9yIChMaWJyYXJ5IGxpYiBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICBsaWIuYWRkaXRpb25hbEV4cG9ydHMuc29ydCgoUmVmZXJlbmNlIGEsIFJlZmVyZW5jZSBiKSB7CiAgICAgIHJldHVybiBhLmNhbm9uaWNhbE5hbWUudG9TdHJpbmcoKS5jb21wYXJlVG8oYi5jYW5vbmljYWxOYW1lLnRvU3RyaW5nKCkpOwogICAgfSk7CiAgfQp9CgpGdXR1cmU8TnVsbD4gZm9yRWFjaFBhY2thZ2U8VD4oS2VybmVsQ29tcGlsYXRpb25SZXN1bHRzIHJlc3VsdHMsCiAgICBUIGFjdGlvbihTdHJpbmcgcGFja2FnZSwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpLAogICAge2Jvb2wgbWFpbkZpcnN0fSkgYXN5bmMgewogIGZpbmFsIENvbXBvbmVudCBjb21wb25lbnQgPSByZXN1bHRzLmNvbXBvbmVudDsKICBmaW5hbCBTZXQ8TGlicmFyeT4gbG9hZGVkTGlicmFyaWVzID0gcmVzdWx0cy5sb2FkZWRMaWJyYXJpZXM7CiAgc29ydENvbXBvbmVudChjb21wb25lbnQpOwoKICBmaW5hbCBwYWNrYWdlcyA9IG5ldyBNYXA8U3RyaW5nLCBMaXN0PExpYnJhcnk+PigpOwogIHBhY2thZ2VzWydtYWluJ10gPSBuZXcgTGlzdDxMaWJyYXJ5PigpOyAvLyBBbHdheXMgY3JlYXRlICdtYWluJy4KICBmb3IgKExpYnJhcnkgbGliIGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgIHBhY2thZ2VzCiAgICAgICAgLnB1dElmQWJzZW50KAogICAgICAgICAgICBwYWNrYWdlRm9yKGxpYiwgbG9hZGVkTGlicmFyaWVzKSwgKCkgPT4gbmV3IExpc3Q8TGlicmFyeT4oKSkKICAgICAgICAuYWRkKGxpYik7CiAgfQogIHBhY2thZ2VzLnJlbW92ZShudWxsKTsgLy8gSWdub3JlIGV4dGVybmFsIGxpYnJhcmllcy4KCiAgZmluYWwgbWFpbkxpYnJhcmllcyA9IHBhY2thZ2VzLnJlbW92ZSgnbWFpbicpOwogIGlmIChtYWluRmlyc3QpIHsKICAgIGF3YWl0IGFjdGlvbignbWFpbicsIG1haW5MaWJyYXJpZXMpOwogIH0KCiAgZmluYWwgbWFpbk1ldGhvZCA9IGNvbXBvbmVudC5tYWluTWV0aG9kOwogIGZpbmFsIHByb2JsZW1zQXNKc29uID0gY29tcG9uZW50LnByb2JsZW1zQXNKc29uOwogIGNvbXBvbmVudC5tYWluTWV0aG9kID0gbnVsbDsKICBjb21wb25lbnQucHJvYmxlbXNBc0pzb24gPSBudWxsOwogIGZvciAoU3RyaW5nIHBhY2thZ2UgaW4gcGFja2FnZXMua2V5cykgewogICAgYXdhaXQgYWN0aW9uKHBhY2thZ2UsIHBhY2thZ2VzW3BhY2thZ2VdKTsKICB9CiAgY29tcG9uZW50Lm1haW5NZXRob2QgPSBtYWluTWV0aG9kOwogIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbiA9IHByb2JsZW1zQXNKc29uOwoKICBpZiAoIW1haW5GaXJzdCkgewogICAgYXdhaXQgYWN0aW9uKCdtYWluJywgbWFpbkxpYnJhcmllcyk7CiAgfQp9CgpTdHJpbmcgX2VzY2FwZVBhdGgoU3RyaW5nIHBhdGgpIHsKICByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKCdcXCcsICdcXFxcJykucmVwbGFjZUFsbCgnICcsICdcXCAnKTsKfQoKLy8vIENyZWF0ZSBuaW5qYSBkZXBlbmRlbmNpZXMgZmlsZSwgYXMgZGVzY3JpYmVkIGluCi8vLyBodHRwczovL25pbmphLWJ1aWxkLm9yZy9tYW51YWwuaHRtbCNfZGVwZmlsZQpGdXR1cmU8dm9pZD4gd3JpdGVEZXBmaWxlKEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSwgSXRlcmFibGU8VXJpPiBjb21waWxlZFNvdXJjZXMsCiAgICBTdHJpbmcgb3V0cHV0LCBTdHJpbmcgZGVwZmlsZSkgYXN5bmMgewogIGZpbmFsIElPU2luayBmaWxlID0gbmV3IEZpbGUoZGVwZmlsZSkub3BlbldyaXRlKCk7CiAgZmlsZS53cml0ZShfZXNjYXBlUGF0aChvdXRwdXQpKTsKICBmaWxlLndyaXRlKCc6Jyk7CiAgZm9yIChVcmkgZGVwIGluIGNvbXBpbGVkU291cmNlcykgewogICAgLy8gU2tpcCBlbXB0eSBvciBjb3JlbGliIGRlcGVuZGVuY2llcy4KICAgIGlmIChkZXAgPT0gbnVsbCB8fCBkZXAuc2NoZW1lID09ICdvcmctZGFydGxhbmctc2RrJykgY29udGludWU7CiAgICBVcmkgdXJpID0gYXdhaXQgYXNGaWxlVXJpKGZpbGVTeXN0ZW0sIGRlcCk7CiAgICBmaWxlLndyaXRlKCcgJyk7CiAgICBmaWxlLndyaXRlKF9lc2NhcGVQYXRoKHVyaS50b0ZpbGVQYXRoKCkpKTsKICB9CiAgZmlsZS53cml0ZSgnXG4nKTsKICBhd2FpdCBmaWxlLmNsb3NlKCk7Cn0KCkZ1dHVyZTx2b2lkPiBjcmVhdGVGYXJNYW5pZmVzdCgKICAgIFN0cmluZyBvdXRwdXQsIFN0cmluZyBkYXRhRGlyLCBTdHJpbmcgcGFja2FnZU1hbmlmZXN0RmlsZW5hbWUpIGFzeW5jIHsKICBMaXN0PFN0cmluZz4gcGFja2FnZXMgPSBhd2FpdCBGaWxlKCckb3V0cHV0LXBhY2thZ2VzJykucmVhZEFzTGluZXMoKTsKCiAgLy8gTWFrZSBzdXJlIHRoZSAnbWFpbicgcGFja2FnZSBpcyB0aGUgbGFzdCAoY29udmVudGlvbiB3aXRoIHBhY2thZ2UgbG9hZGVyKS4KICBwYWNrYWdlcy5yZW1vdmUoJ21haW4nKTsKICBwYWNrYWdlcy5hZGQoJ21haW4nKTsKCiAgZmluYWwgSU9TaW5rIHBhY2thZ2VNYW5pZmVzdCA9IEZpbGUocGFja2FnZU1hbmlmZXN0RmlsZW5hbWUpLm9wZW5Xcml0ZSgpOwoKICBmaW5hbCBTdHJpbmcga2VybmVsTGlzdEZpbGVuYW1lID0gJyRwYWNrYWdlTWFuaWZlc3RGaWxlbmFtZS5kaWxwbGlzdCc7CiAgZmluYWwgSU9TaW5rIGtlcm5lbExpc3QgPSBGaWxlKGtlcm5lbExpc3RGaWxlbmFtZSkub3BlbldyaXRlKCk7CiAgZm9yIChTdHJpbmcgcGFja2FnZSBpbiBwYWNrYWdlcykgewogICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lSW5QYWNrYWdlID0gJyRwYWNrYWdlLmRpbHAnOwogICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lSW5CdWlsZCA9ICckb3V0cHV0LSRwYWNrYWdlLmRpbHAnOwogICAgcGFja2FnZU1hbmlmZXN0CiAgICAgICAgLndyaXRlKCdkYXRhLyRkYXRhRGlyLyRmaWxlbmFtZUluUGFja2FnZT0kZmlsZW5hbWVJbkJ1aWxkXG4nKTsKICAgIGtlcm5lbExpc3Qud3JpdGUoJyRmaWxlbmFtZUluUGFja2FnZVxuJyk7CiAgfQogIGF3YWl0IGtlcm5lbExpc3QuY2xvc2UoKTsKCiAgZmluYWwgU3RyaW5nIGZyYW1ld29ya1ZlcnNpb25GaWxlbmFtZSA9CiAgICAgICckcGFja2FnZU1hbmlmZXN0RmlsZW5hbWUuZnJhbWV3b3JrdmVyc2lvbic7CiAgZmluYWwgSU9TaW5rIGZyYW1ld29ya1ZlcnNpb24gPSBGaWxlKGZyYW1ld29ya1ZlcnNpb25GaWxlbmFtZSkub3BlbldyaXRlKCk7CiAgZm9yIChTdHJpbmcgcGFja2FnZSBpbiBbCiAgICAnY29sbGVjdGlvbicsCiAgICAnZmx1dHRlcicsCiAgICAnbWV0YScsCiAg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dmUgdGhpcyBpZ25vcmUgd2hlbiBzZGsjMzAwODQgaXMgZml4ZWQgb3Igd2hlbiBhcmdzIG5vCi8vIGxvbmdlciByZWZlcnMgdG8gaXRzIG93biBkZXByZWNhdGVkIG1lbWJlcnMuCi8vIGlnbm9yZV9mb3JfZmlsZTogZGVwcmVjYXRlZF9tZW1iZXJfdXNlCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ2FsbG93X2FueXRoaW5nX3BhcnNlci5kYXJ0JzsKaW1wb3J0ICdhcmdfcmVzdWx0cy5kYXJ0JzsKaW1wb3J0ICdvcHRpb24uZGFydCc7CmltcG9ydCAncGFyc2VyLmRhcnQnOwppbXBvcnQgJ3VzYWdlLmRhcnQnOwoKLy8vIEEgY2xhc3MgZm9yIHRha2luZyBhIGxpc3Qgb2YgcmF3IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHBhcnNpbmcgb3V0Ci8vLyBvcHRpb25zIGFuZCBmbGFncyBmcm9tIHRoZW0uCmNsYXNzIEFyZ1BhcnNlciB7CiAgZmluYWwgTWFwPFN0cmluZywgT3B0aW9uPiBfb3B0aW9uczsKICBmaW5hbCBNYXA8U3RyaW5nLCBBcmdQYXJzZXI+IF9jb21tYW5kczsKCiAgLy8vIFRoZSBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoaXMgcGFyc2VyLgogIGZpbmFsIE1hcDxTdHJpbmcsIE9wdGlvbj4gb3B0aW9uczsKCiAgLy8vIFRoZSBjb21tYW5kcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGlzIHBhcnNlci4KICBmaW5hbCBNYXA8U3RyaW5nLCBBcmdQYXJzZXI+IGNvbW1hbmRzOwoKICAvLy8gQSBsaXN0IG9mIHRoZSBbT3B0aW9uXXMgaW4gW29wdGlvbnNdIGludGVybWluZ2xlZCB3aXRoIFtTdHJpbmddCiAgLy8vIHNlcGFyYXRvcnMuCiAgZmluYWwgX29wdGlvbnNBbmRTZXBhcmF0b3JzID0gW107CgogIC8vLyBXaGV0aGVyIG9yIG5vdCB0aGlzIHBhcnNlciBwYXJzZXMgb3B0aW9ucyB0aGF0IGFwcGVhciBhZnRlciBub24tb3B0aW9uCiAgLy8vIGFyZ3VtZW50cy4KICBmaW5hbCBib29sIGFsbG93VHJhaWxpbmdPcHRpb25zOwoKICAvLy8gQW4gb3B0aW9uYWwgbWF4aW11bSBsaW5lIGxlbmd0aCBmb3IgW3VzYWdlXSBtZXNzYWdlcy4KICAvLy8KICAvLy8gSWYgc3BlY2lmaWVkLCB0aGVuIGhlbHAgbWVzc2FnZXMgaW4gdGhlIHVzYWdlIGFyZSB3cmFwcGVkIGF0IHRoZSBnaXZlbgogIC8vLyBjb2x1bW4sIGFmdGVyIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHdpZHRoIG9mIHRoZSBvcHRpb25zLiBXaWxsIHJlZnVzZSB0bwogIC8vLyB3cmFwIGhlbHAgdGV4dCB0byBsZXNzIHRoYW4gMTAgY2hhcmFjdGVycyBvZiBoZWxwIHRleHQgcGVyIGxpbmUgaWYgdGhlcmUKICAvLy8gaXNuJ3QgZW5vdWdoIHNwYWNlIG9uIHRoZSBsaW5lLiBJdCBwcmVzZXJ2ZXMgZW1iZWRkZWQgbmV3bGluZXMsIGFuZAogIC8vLyBhdHRlbXB0cyB0byB3cmFwIGF0IHdoaXRlc3BhY2UgYnJlYWtzIChhbHRob3VnaCBpdCB3aWxsIHNwbGl0IHdvcmRzIGlmCiAgLy8vIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UgYXQgd2hpY2ggdG8gc3BsaXQpLgogIC8vLwogIC8vLyBJZiBudWxsICh0aGUgZGVmYXVsdCksIGhlbHAgbWVzc2FnZXMgYXJlIG5vdCB3cmFwcGVkLgogIGZpbmFsIGludCB1c2FnZUxpbmVMZW5ndGg7CgogIC8vLyBXaGV0aGVyIG9yIG5vdCB0aGlzIHBhcnNlciB0cmVhdHMgdW5yZWNvZ25pemVkIG9wdGlvbnMgYXMgbm9uLW9wdGlvbgogIC8vLyBhcmd1bWVudHMuCiAgYm9vbCBnZXQgYWxsb3dzQW55dGhpbmcgPT4gZmFsc2U7CgogIC8vLyBDcmVhdGVzIGEgbmV3IEFyZ1BhcnNlci4KICAvLy8KICAvLy8gSWYgW2FsbG93VHJhaWxpbmdPcHRpb25zXSBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHBhcnNlciB3aWxsIHBhcnNlCiAgLy8vIGZsYWdzIGFuZCBvcHRpb25zIHRoYXQgYXBwZWFyIGFmdGVyIHBvc2l0aW9uYWwgYXJndW1lbnRzLiBJZiBpdCdzIGBmYWxzZWAsCiAgLy8vIHRoZSBwYXJzZXIgc3RvcHMgcGFyc2luZyBhcyBzb29uIGFzIGl0IGZpbmRzIGFuIGFyZ3VtZW50IHRoYXQgaXMgbmVpdGhlcgogIC8vLyBhbiBvcHRpb24gbm9yIGEgY29tbWFuZC4KICBmYWN0b3J5IEFyZ1BhcnNlcih7Ym9vbCBhbGxvd1RyYWlsaW5nT3B0aW9ucyA9IHRydWUsIGludCB1c2FnZUxpbmVMZW5ndGh9KSA9PgogICAgICBBcmdQYXJzZXIuXyg8U3RyaW5nLCBPcHRpb24+e30sIDxTdHJpbmcsIEFyZ1BhcnNlcj57fSwKICAgICAgICAgIGFsbG93VHJhaWxpbmdPcHRpb25zOiBhbGxvd1RyYWlsaW5nT3B0aW9ucywKICAgICAgICAgIHVzYWdlTGluZUxlbmd0aDogdXNhZ2VMaW5lTGVuZ3RoKTsKCiAgLy8vIENyZWF0ZXMgYSBuZXcgQXJnUGFyc2VyIHRoYXQgdHJlYXRzICphbGwgaW5wdXQqIGFzIG5vbi1vcHRpb24gYXJndW1lbnRzLgogIC8vLwogIC8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdGhyb3VnaCB0byBjaGlsZAogIC8vLyBwcm9jZXNzZXMgd2l0aG91dCBuZWVkaW5nIHRvIGJlIHJlZGVmaW5lZCBpbiB0aGUgcGFyZW50LgogIC8vLwogIC8vLyBPcHRpb25zIG1heSBub3QgYmUgZGVmaW5lZCBmb3IgdGhpcyBwYXJzZXIuCiAgZmFjdG9yeSBBcmdQYXJzZXIuYWxsb3dBbnl0aGluZygpID0gQWxsb3dBbnl0aGluZ1BhcnNlcjsKCiAgQXJnUGFyc2VyLl8oTWFwPFN0cmluZywgT3B0aW9uPiBvcHRpb25zLCBNYXA8U3RyaW5nLCBBcmdQYXJzZXI+IGNvbW1hbmRzLAogICAgICB7Ym9vbCBhbGxvd1RyYWlsaW5nT3B0aW9ucyA9IHRydWUsIHRoaXMudXNhZ2VMaW5lTGVuZ3RofSkKICAgICAgOiB0aGlzLl9vcHRpb25zID0gb3B0aW9ucywKICAgICAgICB0aGlzLm9wdGlvbnMgPSBVbm1vZGlmaWFibGVNYXBWaWV3KG9wdGlvbnMpLAogICAgICAgIHRoaXMuX2NvbW1hbmRzID0gY29tbWFuZHMsCiAgICAgICAgdGhpcy5jb21tYW5kcyA9IFVubW9kaWZpYWJsZU1hcFZpZXcoY29tbWFuZHMpLAogICAgICAgIHRoaXMuYWxsb3dUcmFpbGluZ09wdGlvbnMgPQogICAgICAgICAgICBhbGxvd1RyYWlsaW5nT3B0aW9ucyAhPSBudWxsID8gYWxsb3dUcmFpbGluZ09wdGlvbnMgOiBmYWxzZTsKCiAgLy8vIERlZmluZXMgYSBjb21tYW5kLgogIC8vLwogIC8vLyBBIGNvbW1hbmQgaXMgYSBuYW1lZCBhcmd1bWVudCB3aGljaCBtYXkgaW4gdHVybiBkZWZpbmUgaXRzIG93biBvcHRpb25zIGFuZAogIC8vLyBzdWJjb21tYW5kcyB1c2luZyB0aGUgZ2l2ZW4gcGFyc2VyLiBJZiBbcGFyc2VyXSBpcyBvbWl0dGVkLCBpbXBsaWNpdGx5CiAgLy8vIGNyZWF0ZXMgYSBuZXcgb25lLiBSZXR1cm5zIHRoZSBwYXJzZXIgZm9yIHRoZSBjb21tYW5kLgogIEFyZ1BhcnNlciBhZGRDb21tYW5kKFN0cmluZyBuYW1lLCBbQXJnUGFyc2VyIHBhcnNlcl0pIHsKICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmFtZSBpc24ndCBpbiB1c2UuCiAgICBpZiAoX2NvbW1hbmRzLmNvbnRhaW5zS2V5KG5hbWUpKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0R1cGxpY2F0ZSBjb21tYW5kICIkbmFtZSIuJyk7CiAgICB9CgogICAgaWYgKHBhcnNlciA9PSBudWxsKSBwYXJzZXIgPSBBcmdQYXJzZXIoKTsKICAgIF9jb21tYW5kc1tuYW1lXSA9IHBhcnNlcjsKICAgIHJldHVybiBwYXJzZXI7CiAgfQoKICAvLy8gRGVmaW5lcyBhIGJvb2xlYW4gZmxhZy4KICAvLy8KICAvLy8gVGhpcyBhZGRzIGFuIFtPcHRpb25dIHdpdGggdGhlIGdpdmVuIHByb3BlcnRpZXMgdG8gW29wdGlvbnNdLgogIC8vLwogIC8vLyBUaGUgW2FiYnJdIGFyZ3VtZW50IGlzIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhCiAgLy8vIHNob3J0aGFuZCBmb3IgdGhpcyBmbGFnLiBGb3IgZXhhbXBsZSwgYGFiYnI6ICJhImAgd2lsbCBhbGxvdyB0aGUgdXNlciB0bwogIC8vLyBwYXNzIGAtYWAgdG8gZW5hYmxlIHRoZSBmbGFnLgogIC8vLwogIC8vLyBUaGUgW2hlbHBdIGFyZ3VtZW50IGlzIHVzZWQgYnkgW3VzYWdlXSB0byBkZXNjcmliZSB0aGlzIGZsYWcuCiAgLy8vCiAgLy8vIFRoZSBbZGVmYXVsdHNUb10gYXJndW1lbnQgaW5kaWNhdGVzIHRoZSB2YWx1ZSB0aGlzIGZsYWcgd2lsbCBoYXZlIGlmIHRoZQogIC8vLyB1c2VyIGRvZXNuJ3QgZXhwbGljaXRseSBwYXNzIGl0IGluLgogIC8vLwogIC8vLyBUaGUgW25lZ2F0YWJsZV0gYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBmbGFnJ3MgdmFsdWUgY2FuIGJlIHNldCB0bwogIC8vLyBgZmFsc2VgLiBGb3IgZXhhbXBsZSwgaWYgW25hbWVdIGlzIGBmbGFnYCwgdGhlIHVzZXIgY2FuIHBhc3MgYC0tbm8tZmxhZ2AKICAvLy8gdG8gc2V0IGl0cyB2YWx1ZSB0byBgZmFsc2VgLgogIC8vLwogIC8vLyBUaGUgW2NhbGxiYWNrXSBhcmd1bWVudCBpcyBpbnZva2VkIHdpdGggdGhlIGZsYWcncyB2YWx1ZSB3aGVuIHRoZSBmbGFnCiAgLy8vIGlzIHBhcnNlZC4gTm90ZSB0aGF0IHRoaXMgbWFrZXMgYXJndW1lbnQgcGFyc2luZyBvcmRlci1kZXBlbmRlbnQgaW4gd2F5cwogIC8vLyB0aGF0IGFyZSBvZnRlbiBzdXJwcmlzaW5nLCBhbmQgaXRzIHVzZSBpcyBkaXNjb3VyYWdlZCBpbiBmYXZvciBvZiByZWFkaW5nCiAgLy8vIHZhbHVlcyBmcm9tIHRoZSBbQXJnUmVzdWx0XS4KICAvLy8KICAvLy8gSWYgW2hpZGVdIGlzIGB0cnVlYCwgdGhpcyBvcHRpb24gd29uJ3QgYmUgaW5jbHVkZWQgaW4gW3VzYWdlXS4KICAvLy8KICAvLy8gVGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXSBpZjoKICAvLy8KICAvLy8gKiBUaGVyZSBpcyBhbHJlYWR5IGFuIG9wdGlvbiBuYW1lZCBbbmFtZV0uCiAgLy8vICogVGhlcmUgaXMgYWxyZWFkeSBhbiBvcHRpb24gdXNpbmcgYWJicmV2aWF0aW9uIFthYmJyXS4KICB2b2lkIGFkZEZsYWcoU3RyaW5nIG5hbWUsCiAgICAgIHtTdHJpbmcgYWJiciwKICAgICAgU3RyaW5nIGhlbHAsCiAgICAgIGJvb2wgZGVmYXVsdHNUbyA9IGZhbHNlLAogICAgICBib29sIG5lZ2F0YWJsZSA9IHRydWUsCiAgICAgIHZvaWQgY2FsbGJhY2soYm9vbCB2YWx1ZSksCiAgICAgIGJvb2wgaGlkZSA9IGZhbHNlfSkgewogICAgX2FkZE9wdGlvbigKICAgICAgICBuYW1lLAogICAgICAgIGFiYnIsCiAgICAgICAgaGVscCwKICAgICAgICBudWxsLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBkZWZhdWx0c1RvLAogICAgICAgIGNhbGxiYWNrID09IG51bGwgPyBudWxsIDogKHZhbHVlKSA9PiBjYWxsYmFjayh2YWx1ZSBhcyBib29sKSwKICAgICAgICBPcHRpb25UeXBlLmZsYWcsCiAgICAgICAgbmVnYXRhYmxlOiBuZWdhdGFibGUsCiAgICAgICAgaGlkZTogaGlkZSk7CiAgfQoKICAvLy8gRGVmaW5lcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhIHZhbHVlLgogIC8vLwogIC8vLyBUaGlzIGFkZHMgYW4gW09wdGlvbl0gd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydGllcyB0byBbb3B0aW9uc10uCiAgLy8vCiAgLy8vIFRoZSBbYWJicl0gYXJndW1lbnQgaXMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEKICAvLy8gc2hvcnRoYW5kIGZvciB0aGlzIG9wdGlvbi4gRm9yIGV4YW1wbGUsIGBhYmJyOiAiYSJgIHdpbGwgYWxsb3cgdGhlIHVzZXIgdG8KICAvLy8gcGFzcyBgLWEgdmFsdWVgIG9yIGAtYXZhbHVlYC4KICAvLy8KICAvLy8gVGhlIFtoZWxwXSBhcmd1bWVudCBpcyB1c2VkIGJ5IFt1c2FnZV0gdG8gZGVzY3JpYmUgdGhpcyBvcHRpb24uCiAgLy8vCiAgLy8vIFRoZSBbdmFsdWVIZWxwXSBhcmd1bWVudCBpcyB1c2VkIGJ5IFt1c2FnZV0gYXMgYSBuYW1lIGZvciB0aGUgdmFsdWUgdGhpcwogIC8vLyBvcHRpb24gdGFrZXMuIEZvciBleGFtcGxlLCBgdmFsdWVIZWxwOiAiRk9PImAgd2lsbCBpbmNsdWRlCiAgLy8vIGAtLW9wdGlvbj08Rk9PPmAgcmF0aGVyIHRoYW4ganVzdCBgLS1vcHRpb25gIGluIHRoZSB1c2FnZSBzdHJpbmcuCiAgLy8vCiAgLy8vIFRoZSBbYWxsb3dlZF0gYXJndW1lbnQgaXMgYSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBvcHRpb24uIElmCiAgLy8vIGl0J3Mgbm9uLWBudWxsYCBhbmQgdGhlIHVzZXIgcGFzc2VzIGEgdmFsdWUgdGhhdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUKICAvLy8gbGlzdCwgW3BhcnNlXSB3aWxsIHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uIFRoZSBhbGxvd2VkIHZhbHVlcyB3aWxsIGFsc28KICAvLy8gYmUgaW5jbHVkZWQgaW4gW3VzYWdlXS4KICAvLy8KICAvLy8gVGhlIFthbGxvd2VkSGVscF0gYXJndW1lbnQgaXMgYSBtYXAgZnJvbSB2YWx1ZXMgaW4gW2FsbG93ZWRdIHRvCiAgLy8vIGRvY3VtZW50YXRpb24gZm9yIHRob3NlIHZhbHVlcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gW3VzYWdlXS4KICAvLy8KICAvLy8gVGhlIFtkZWZhdWx0c1RvXSBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlIHZhbHVlIHRoaXMgb3B0aW9uIHdpbGwgaGF2ZSBpZiB0aGUKICAvLy8gdXNlciBkb2Vzbid0IGV4cGxpY2l0bHkgcGFzcyBpdCBpbiAob3IgYG51bGxgIGJ5IGRlZmF1bHQpLgogIC8vLwogIC8vLyBUaGUgW2NhbGxiYWNrXSBhcmd1bWVudCBpcyBpbnZva2VkIHdpdGggdGhlIG9wdGlvbidzIHZhbHVlIHdoZW4gdGhlIG9wdGlvbgogIC8vLyBpcyBwYXJzZWQuIE5vdGUgdGhhdCB0aGlzIG1ha2VzIGFyZ3VtZW50IHBhcnNpbmcgb3JkZXItZGVwZW5kZW50IGluIHdheXMKICAvLy8gdGhhdCBhcmUgb2Z0ZW4gc3VycHJpc2luZywgYW5kIGl0cyB1c2UgaXMgZGlzY291cmFnZWQgaW4gZmF2b3Igb2YgcmVhZGluZwogIC8vLyB2YWx1ZXMgZnJvbSB0aGUgW0FyZ1Jlc3VsdF0uCiAgLy8vCiAgLy8vIFRoZSBbYWxsb3dNdWx0aXBsZV0gYW5kIFtzcGxpdENvbW1hc10gb3B0aW9ucyBhcmUgZGVwcmVjYXRlZDsgdGhlCiAgLy8vIFthZGRNdWx0aU9wdGlvbl0gbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgLy8vCiAgLy8vIElmIFtoaWRlXSBpcyBgdHJ1ZWAsIHRoaXMgb3B0aW9uIHdvbid0IGJlIGluY2x1ZGVkIGluIFt1c2FnZV0uCiAgLy8vCiAgLy8vIFRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0gaWY6CiAgLy8vCiAgLy8vICogVGhlcmUgaXMgYWxyZWFkeSBhbiBvcHRpb24gd2l0aCBuYW1lIFtuYW1lXS4KICAvLy8gKiBUaGVyZSBpcyBhbHJlYWR5IGFuIG9wdGlvbiB1c2luZyBhYmJyZXZpYXRpb24gW2FiYnJdLgogIC8vLyAqIFtzcGxpdENvbW1hc10gaXMgcGFzc2VkIGJ1dCBbYWxsb3dNdWx0aXBsZV0gaXMgYGZhbHNlYC4KICB2b2lkIGFkZE9wdGlvbihTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBhYmJyLAogICAgICBTdHJpbmcgaGVscCwKICAgICAgU3RyaW5nIHZhbHVlSGVscCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBhbGxvd2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwLAogICAgICBTdHJpbmcgZGVmYXVsdHNUbywKICAgICAgRnVuY3Rpb24gY2FsbGJhY2ssCiAgICAgIEBEZXByZWNhdGVkKCJVc2UgYWRkTXVsdGlPcHRpb24oKSBpbnN0ZWFkLiIpIGJvb2wgYWxsb3dNdWx0aXBsZSA9IGZhbHNlLAogICAgICBARGVwcmVjYXRlZCgiVXNlIGFkZE11bHRpT3B0aW9uKCkgaW5zdGVhZC4iKSBib29sIHNwbGl0Q29tbWFzLAogICAgICBib29sIGhpZGUgPSBmYWxzZX0pIHsKICAgIGlmICghYWxsb3dNdWx0aXBsZSAmJiBzcGxpdENvbW1hcyAhPSBudWxsKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAnc3BsaXRDb21tYXMgbWF5IG5vdCBiZSBzZXQgaWYgYWxsb3dNdWx0aXBsZSBpcyBmYWxzZS4nKTsKICAgIH0KCiAgICBfYWRkT3B0aW9uKAogICAgICAgIG5hbWUsCiAgICAgICAgYWJiciwKICAgICAgICBoZWxwLAogICAgICAgIHZhbHVlSGVscCwKICAgICAgICBhbGxvd2VkLAogICAgICAgIGFsbG93ZWRIZWxwLAogICAgICAgIGFsbG93TXVsdGlwbGUKICAgICAgICAgICAgPyAoZGVmYXVsdHNUbyA9PSBudWxsID8gPFN0cmluZz5bXSA6IFtkZWZhdWx0c1RvXSkKICAgICAgICAgICAgOiBkZWZhdWx0c1RvLAogICAgICAgIGNhbGxiYWNrLAogICAgICAgIGFsbG93TXVsdGlwbGUgPyBPcHRpb25UeXBlLm11bHRpcGxlIDogT3B0aW9uVHlwZS5zaW5nbGUsCiAgICAgICAgc3BsaXRDb21tYXM6IHNwbGl0Q29tbWFzLAogICAgICAgIGhpZGU6IGhpZGUpOwogIH0KCiAgLy8vIERlZmluZXMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgbXVsdGlwbGUgdmFsdWVzLgogIC8vLwogIC8vLyBUaGUgW2FiYnJdIGFyZ3VtZW50IGlzIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhCiAgLy8vIHNob3J0aGFuZCBmb3IgdGhpcyBvcHRpb24uIEZvciBleGFtcGxlLCBgYWJicjogImEiYCB3aWxsIGFsbG93IHRoZSB1c2VyIHRvCiAgLy8vIHBhc3MgYC1hIHZhbHVlYCBvciBgLWF2YWx1ZWAuCiAgLy8vCiAgLy8vIFRoZSBbaGVscF0gYXJndW1lbnQgaXMgdXNlZCBieSBbdXNhZ2VdIHRvIGRlc2NyaWJlIHRoaXMgb3B0aW9uLgogIC8vLwogIC8vLyBUaGUgW3ZhbHVlSGVscF0gYXJndW1lbnQgaXMgdXNlZCBieSBbdXNhZ2VdIGFzIGEgbmFtZSBmb3IgdGhlIHZhbHVlIHRoaXMKICAvLy8gYXJndW1lbnQgdGFrZXMuIEZvciBleGFtcGxlLCBgdmFsdWVIZWxwOiAiRk9PImAgd2lsbCBpbmNsdWRlCiAgLy8vIGAtLW9wdGlvbj08Rk9PPmAgcmF0aGVyIHRoYW4ganVzdCBgLS1vcHRpb25gIGluIHRoZSB1c2FnZSBzdHJpbmcuCiAgLy8vCiAgLy8vIFRoZSBbYWxsb3dlZF0gYXJndW1lbnQgaXMgYSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBhcmd1bWVudC4gSWYKICAvLy8gaXQncyBub24tYG51bGxgIGFuZCB0aGUgdXNlciBwYXNzZXMgYSB2YWx1ZSB0aGF0J3Mgbm90IGluY2x1ZGVkIGluIHRoZQogIC8vLyBsaXN0LCBbcGFyc2VdIHdpbGwgdGhyb3cgYSBbRm9ybWF0RXhjZXB0aW9uXS4gVGhlIGFsbG93ZWQgdmFsdWVzIHdpbGwgYWxzbwogIC8vLyBiZSBpbmNsdWRlZCBpbiBbdXNhZ2VdLgogIC8vLwogIC8vLyBUaGUgW2FsbG93ZWRIZWxwXSBhcmd1bWVudCBpcyBhIG1hcCBmcm9tIHZhbHVlcyBpbiBbYWxsb3dlZF0gdG8KICAvLy8gZG9jdW1lbnRhdGlvbiBmb3IgdGhvc2UgdmFsdWVzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiBbdXNhZ2VdLgogIC8vLwogIC8vLyBUaGUgW2RlZmF1bHRzVG9dIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgdmFsdWVzIHRoaXMgb3B0aW9uIHdpbGwgaGF2ZSBpZgogIC8vLyB0aGUgdXNlciBkb2Vzbid0IGV4cGxpY2l0bHkgcGFzcyBpdCBpbiAob3IgYFtdYCBieSBkZWZhdWx0KS4KICAvLy8KICAvLy8gVGhlIFtjYWxsYmFja10gYXJndW1lbnQgaXMgaW52b2tlZCB3aXRoIHRoZSBvcHRpb24ncyB2YWx1ZSB3aGVuIHRoZSBvcHRpb24KICAvLy8gaXMgcGFyc2VkLiBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhcmd1bWVudCBwYXJzaW5nIG9yZGVyLWRlcGVuZGVudCBpbiB3YXlzCiAgLy8vIHRoYXQgYXJlIG9mdGVuIHN1cnByaXNpbmcsIGFuZCBpdHMgdXNlIGlzIGRpc2NvdXJhZ2VkIGluIGZhdm9yIG9mIHJlYWRpbmcKICAvLy8gdmFsdWVzIGZyb20gdGhlIFtBcmdSZXN1bHRdLgogIC8vLwogIC8vLyBJZiBbc3BsaXRDb21tYXNdIGlzIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBtdWx0aXBsZSBvcHRpb25zIG1heSBiZSBwYXNzZWQKICAvLy8gYnkgd3JpdGluZyBgLS1vcHRpb24gYSxiYCBpbiBhZGRpdGlvbiB0byBgLS1vcHRpb24gYSAtLW9wdGlvbiBiYC4KICAvLy8KICAvLy8gSWYgW2hpZGVdIGlzIGB0cnVlYCwgdGhpcyBvcHRpb24gd29uJ3QgYmUgaW5jbHVkZWQgaW4gW3VzYWdlXS4KICAvLy8KICAvLy8gVGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXSBpZjoKICAvLy8KICAvLy8gKiBUaGVyZSBpcyBhbHJlYWR5IGFuIG9wdGlvbiB3aXRoIG5hbWUgW25hbWVdLgogIC8vLyAqIFRoZXJlIGlzIGFscmVhZHkgYW4gb3B0aW9uIHVzaW5nIGFiYnJldmlhdGlvbiBbYWJicl0uCiAgdm9pZCBhZGRNdWx0aU9wdGlvbihTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBhYmJyLAogICAgICBTdHJpbmcgaGVscCwKICAgICAgU3RyaW5nIHZhbHVlSGVscCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBhbGxvd2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IGRlZmF1bHRzVG8sCiAgICAgIHZvaWQgY2FsbGJhY2soTGlzdDxTdHJpbmc+IHZhbHVlcyksCiAgICAgIGJvb2wgc3BsaXRDb21tYXMgPSB0cnVlLAogICAgICBib29sIGhpZGUgPSBmYWxzZX0pIHsKICAgIF9hZGRPcHRpb24oCiAgICAgICAgbmFtZSwKICAgICAgICBhYmJyLAogICAgICAgIGhlbHAsCiAgICAgICAgdmFsdWVIZWxwLAogICAgICAgIGFsbG93ZWQsCiAgICAgICAgYWxsb3dlZEhlbHAsCiAgICAgICAgZGVmYXVsdHNUbz8udG9MaXN0KCkgPz8gPFN0cmluZz5bXSwKICAgICAgICBjYWxsYmFjayA9PSBudWxsID8gbnVsbCA6ICh2YWx1ZSkgPT4gY2FsbGJhY2sodmFsdWUgYXMgTGlzdDxTdHJpbmc+KSwKICAgICAgICBPcHRpb25UeXBlLm11bHRpcGxlLAogICAgICAgIHNwbGl0Q29tbWFzOiBzcGxpdENvbW1hcywKICAgICAgICBoaWRlOiBoaWRlKTsKICB9CgogIHZvaWQgX2FkZE9wdGlvbigKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIFN0cmluZyBhYmJyLAogICAgICBTdHJpbmcgaGVscCwKICAgICAgU3RyaW5nIHZhbHVlSGVscCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBhbGxvd2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwLAogICAgICBkZWZhdWx0c1RvLAogICAgICBGdW5jdGlvbiBjYWxsYmFjaywKICAgICAgT3B0aW9uVHlwZSB0eXBlLAogICAgICB7Ym9vbCBuZWdhdGFibGUgPSBmYWxzZSwKICAgICAgYm9vbCBzcGxpdENvbW1hcywKICAgICAgYm9vbCBoaWRlID0gZmFsc2V9KSB7CiAgICAvLyBNYWtlIHN1cmUgdGhlIG5hbWUgaXNuJ3QgaW4gdXNlLgogICAgaWYgKF9vcHRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0R1cGxpY2F0ZSBvcHRpb24gIiRuYW1lIi4nKTsKICAgIH0KCiAgICAvLyBNYWtlIHN1cmUgdGhlIGFiYnJldmlhdGlvbiBpc24ndCB0b28gbG9uZyBvciBpbiB1c2UuCiAgICBpZiAoYWJiciAhPSBudWxsKSB7CiAgICAgIHZhciBleGlzdGluZyA9IGZpbmRCeUFiYnJldmlhdGlvbihhYmJyKTsKICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAnQWJicmV2aWF0aW9uICIkYWJiciIgaXMgYWxyZWFkeSB1c2VkIGJ5ICIke2V4aXN0aW5nLm5hbWV9Ii4nKTsKICAgICAgfQogICAgfQoKICAgIHZhciBvcHRpb24gPSBuZXdPcHRpb24obmFtZSwgYWJiciwgaGVscCwgdmFsdWVIZWxwLCBhbGxvd2VkLCBhbGxvd2VkSGVscCwKICAgICAgICBkZWZhdWx0c1RvLCBjYWxsYmFjaywgdHlwZSwKICAgICAgICBuZWdhdGFibGU6IG5lZ2F0YWJsZSwgc3BsaXRDb21tYXM6IHNwbGl0Q29tbWFzLCBoaWRlOiBoaWRlKTsKICAgIF9vcHRpb25zW25hbWVdID0gb3B0aW9uOwogICAgX29wdGlvbnNBbmRTZXBhcmF0b3JzLmFkZChvcHRpb24pOwogIH0KCiAgLy8vIEFkZHMgYSBzZXBhcmF0b3IgbGluZSB0byB0aGUgdXNhZ2UuCiAgLy8vCiAgLy8vIEluIHRoZSB1c2FnZSB0ZXh0IGZvciB0aGUgcGFyc2VyLCB0aGlzIHdpbGwgYXBwZWFyIGJldHdlZW4gYW55IG9wdGlvbnMKICAvLy8gYWRkZWQgYmVmb3JlIHRoaXMgY2FsbCBhbmQgb25lcyBhZGRlZCBhZnRlciBpdC4KICB2b2lkIGFkZFNlcGFyYXRvcihTdHJpbmcgdGV4dCkgewogICAgX29wdGlvbnNBbmRTZXBhcmF0b3JzLmFkZCh0ZXh0KTsKICB9CgogIC8vLyBQYXJzZXMgW2FyZ3NdLCBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgbWF0Y2hlcyB0aGVtIGFnYWluc3QgdGhlCiAgLy8vIGZsYWdzIGFuZCBvcHRpb25zIGRlZmluZWQgYnkgdGhpcyBwYXJzZXIsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCiAgQXJnUmVzdWx0cyBwYXJzZShJdGVyYWJsZTxTdHJpbmc+IGFyZ3MpID0+CiAgICAgIFBhcnNlcihudWxsLCB0aGlzLCBhcmdzLnRvTGlzdCgpKS5wYXJzZSgpOwoKICAvLy8gR2VuZXJhdGVzIGEgc3RyaW5nIGRpc3BsYXlpbmcgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWZpbmVkIG9wdGlvbnMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBoZWxwIHRleHQgc2hvd24gb24gdGhlIGNvbW1hbmQgbGluZS4KICBARGVwcmVjYXRlZCgiUmVwbGFjZWQgd2l0aCBnZXQgdXNhZ2UuIGdldFVzYWdlKCkgd2lsbCBiZSByZW1vdmVkIGluIGFyZ3MgMS4wIikKICBTdHJpbmcgZ2V0VXNhZ2UoKSA9PiB1c2FnZTsKCiAgLy8vIEdlbmVyYXRlcyBhIHN0cmluZyBkaXNwbGF5aW5nIHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGUgZGVmaW5lZCBvcHRpb25zLgogIC8vLwogIC8vLyBUaGlzIGlzIGJhc2ljYWxseSB0aGUgaGVscCB0ZXh0IHNob3duIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgU3RyaW5nIGdldCB1c2FnZSB7CiAgICByZXR1cm4gVXNhZ2UoX29wdGlvbnNBbmRTZXBhcmF0b3JzLCBsaW5lTGVuZ3RoOiB1c2FnZUxpbmVMZW5ndGgpLmdlbmVyYXRlKCk7CiAgfQoKICAvLy8gR2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb24uIFVzZWZ1bCBhZnRlciBwYXJzaW5nIHRvIHRlc3QgaWYgdGhlCiAgLy8vIHVzZXIgc3BlY2lmaWVkIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgogIGdldERlZmF1bHQoU3RyaW5nIG9wdGlvbikgewogICAgaWYgKCFvcHRpb25zLmNvbnRhaW5zS2V5KG9wdGlvbikpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm8gb3B0aW9uIG5hbWVkICRvcHRpb24nKTsKICAgIH0KICAgIHJldHVybiBvcHRpb25zW29wdGlvbl0uZGVmYXVsdHNUbzsKICB9CgogIC8vLyBGaW5kcyB0aGUgb3B0aW9uIHdob3NlIGFiYnJldmlhdGlvbiBpcyBbYWJicl0sIG9yIGBudWxsYCBpZiBubyBvcHRpb24gaGFzCiAgLy8vIHRoYXQgYWJicmV2aWF0aW9uLgogIE9wdGlvbiBmaW5kQnlBYmJyZXZpYXRpb24oU3RyaW5nIGFiYnIpIHsKICAgIHJldHVybiBvcHRpb25zLnZhbHVlcwogICAgICAgIC5maXJzdFdoZXJlKChvcHRpb24pID0+IG9wdGlvbi5hYmJyID09IGFiYnIsIG9yRWxzZTogKCkgPT4gbnVsbCk7CiAgfQp9CoFkAE5OPAFLMCoBGgElGxYWFQFMIRImKgE6JQE7KQFGEiQBTREjATwGTVFPSk0xBjwdAUsRJAEfBk9RTx9QPTYtAU8GSD8GMjsBTEAhNSM3JEkBGQZRTT06KCc5BgEuHhMEAR4GRAZNTyQGRAZPKgZRTyMGTU9QIwZFBiQGMT4cFBMfHSEcEA4ODg4ODhRGGR4VBAEsBkQGTVEkBkYGT0FIBktNUR4GRkcGUUEGUU9QIwZINgZFBiQGNT5AHhQTGCAnGRlPRRwxG0QGARAODg4TERUWPxoSQSIVBAE0Bk1RJAZGBk9DSAZNTVEeBkZHBk5DBlFPUCMGT0gGRQYkBjU+IxQTGCAnIyofHBAODg4TERUsTh0iFQQBExMTExggJxIZFx8YHCgmOAYBPBgvHh1MCAYBTiRFHScEASoGTTYjJQQBUEgtMQFPBkFRHgFPBkEVUQQBTzceKDYGJwQBUBkrGkoEAgEgcGFja2FnZTphcmdzL3NyYy9hcmdfcGFyc2VyLmRhcnRaZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2FyZ3MvbGliL3NyYy9hcmdfcGFyc2VyX2V4Y2VwdGlvbi5kYXJ0goYvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYEFyZ1BhcnNlcmAuCmNsYXNzIEFyZ1BhcnNlckV4Y2VwdGlvbiBleHRlbmRzIEZvcm1hdEV4Y2VwdGlvbiB7CiAgLy8vIFRoZSBjb21tYW5kKHMpIHRoYXQgd2VyZSBwYXJzZWQgYmVmb3JlIGRpc2NvdmVyaW5nIHRoZSBlcnJvci4KICAvLy8KICAvLy8gVGhpcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBlcnJvciB3YXMgb24gdGhlIHJvb3QgcGFyc2VyLgogIGZpbmFsIExpc3Q8U3RyaW5nPiBjb21tYW5kczsKCiAgQXJnUGFyc2VyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBbSXRlcmFibGU8U3RyaW5nPiBjb21tYW5kc10pCiAgICAgIDogY29tbWFuZHMgPSBjb21tYW5kcyA9PSBudWxsID8gY29uc3QgW10gOiBMaXN0LnVubW9kaWZpYWJsZShjb21tYW5kcyksCiAgICAgICAgc3VwZXIobWVzc2FnZSk7Cn0KEQBOTjwBKDNEBj4fAUJOGAIBKnBhY2thZ2U6YXJncy9zcmMvYXJnX3BhcnNlcl9leGNlcHRpb24uZGFydFFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvYXJncy9saWIvc3JjL2FyZ19yZXN1bHRzLmRhcnSM1y8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ2FyZ19wYXJzZXIuZGFydCc7CgovLy8gQ3JlYXRlcyBhIG5ldyBbQXJnUmVzdWx0c10uCi8vLwovLy8gU2luY2UgW0FyZ1Jlc3VsdHNdIGRvZXNuJ3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciwgdGhpcyBsZXRzIFtBcmdQYXJzZXJdCi8vLyBnZXQgdG8gaXQuIFRoaXMgZnVuY3Rpb24gaXNuJ3QgZXhwb3J0ZWQgdG8gdGhlIHB1YmxpYyBBUEkgb2YgdGhlIHBhY2thZ2UuCkFyZ1Jlc3VsdHMgbmV3QXJnUmVzdWx0cygKICAgIEFyZ1BhcnNlciBwYXJzZXIsCiAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBwYXJzZWQsCiAgICBTdHJpbmcgbmFtZSwKICAgIEFyZ1Jlc3VsdHMgY29tbWFuZCwKICAgIExpc3Q8U3RyaW5nPiByZXN0LAogICAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cykgewogIHJldHVybiBBcmdSZXN1bHRzLl8ocGFyc2VyLCBwYXJzZWQsIG5hbWUsIGNvbW1hbmQsIHJlc3QsIGFyZ3VtZW50cyk7Cn0KCi8vLyBUaGUgcmVzdWx0cyBvZiBwYXJzaW5nIGEgc2VyaWVzIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdXNpbmcKLy8vIFtBcmdQYXJzZXIucGFyc2UoKV0uCi8vLwovLy8gSW5jbHVkZXMgdGhlIHBhcnNlZCBvcHRpb25zIGFuZCBhbnkgcmVtYWluaW5nIHVucGFyc2VkIGNvbW1hbmQgbGluZQovLy8gYXJndW1lbnRzLgpjbGFzcyBBcmdSZXN1bHRzIHsKICAvLy8gVGhlIFtBcmdQYXJzZXJdIHdob3NlIG9wdGlvbnMgd2VyZSBwYXJzZWQgZm9yIHRoZXNlIHJlc3VsdHMuCiAgZmluYWwgQXJnUGFyc2VyIF9wYXJzZXI7CgogIC8vLyBUaGUgb3B0aW9uIHZhbHVlcyB0aGF0IHdlcmUgcGFyc2VkIGZyb20gYXJndW1lbnRzLgogIGZpbmFsIE1hcDxTdHJpbmcsIGR5bmFtaWM+IF9wYXJzZWQ7CgogIC8vLyBJZiB0aGVzZSBhcmUgdGhlIHJlc3VsdHMgZm9yIHBhcnNpbmcgYSBjb21tYW5kJ3Mgb3B0aW9ucywgdGhpcyB3aWxsIGJlIHRoZQogIC8vLyBuYW1lIG9mIHRoZSBjb21tYW5kLiBGb3IgdG9wLWxldmVsIHJlc3VsdHMsIHRoaXMgcmV0dXJucyBgbnVsbGAuCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgY29tbWFuZCB0aGF0IHdhcyBzZWxlY3RlZCwgb3IgYG51bGxgIGlmIG5vbmUgd2FzLgogIC8vLwogIC8vLyBUaGlzIHdpbGwgY29udGFpbiB0aGUgb3B0aW9ucyB0aGF0IHdlcmUgc2VsZWN0ZWQgZm9yIHRoYXQgY29tbWFuZC4KICBmaW5hbCBBcmdSZXN1bHRzIGNvbW1hbmQ7CgogIC8vLyBUaGUgcmVtYWluaW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdGhhdCB3ZXJlIG5vdCBwYXJzZWQgYXMgb3B0aW9ucyBvcgogIC8vLyBmbGFncy4KICAvLy8KICAvLy8gSWYgYC0tYCB3YXMgdXNlZCB0byBzZXBhcmF0ZSB0aGUgb3B0aW9ucyBmcm9tIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLAogIC8vLyBpdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGlzIGxpc3QgdW5sZXNzIHBhcnNpbmcgc3RvcHBlZCBiZWZvcmUgdGhlCiAgLy8vIGAtLWAgd2FzIHJlYWNoZWQuCiAgZmluYWwgTGlzdDxTdHJpbmc+IHJlc3Q7CgogIC8vLyBUaGUgb3JpZ2luYWwgbGlzdCBvZiBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhcnNlZC4KICBmaW5hbCBMaXN0PFN0cmluZz4gYXJndW1lbnRzOwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbQXJnUmVzdWx0c10uCiAgQXJnUmVzdWx0cy5fKHRoaXMuX3BhcnNlciwgdGhpcy5fcGFyc2VkLCB0aGlzLm5hbWUsIHRoaXMuY29tbWFuZCwKICAgICAgTGlzdDxTdHJpbmc+IHJlc3QsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMpCiAgICAgIDogdGhpcy5yZXN0ID0gVW5tb2RpZmlhYmxlTGlzdFZpZXcocmVzdCksCiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBVbm1vZGlmaWFibGVMaXN0Vmlldyhhcmd1bWVudHMpOwoKICAvLy8gR2V0cyB0aGUgcGFyc2VkIGNvbW1hbmQtbGluZSBvcHRpb24gbmFtZWQgW25hbWVdLgogIG9wZXJhdG9yIFtdKFN0cmluZyBuYW1lKSB7CiAgICBpZiAoIV9wYXJzZXIub3B0aW9ucy5jb250YWluc0tleShuYW1lKSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdDb3VsZCBub3QgZmluZCBhbiBvcHRpb24gbmFtZWQgIiRuYW1lIi4nKTsKICAgIH0KCiAgICByZXR1cm4gX3BhcnNlci5vcHRpb25zW25hbWVdLmdldE9yRGVmYXVsdChfcGFyc2VkW25hbWVdKTsKICB9CgogIC8vLyBHZXQgdGhlIG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBhcyBhbiBbSXRlcmFibGVdLgogIC8vLwogIC8vLyBUaGlzIGluY2x1ZGVzIHRoZSBvcHRpb25zIHdob3NlIHZhbHVlcyB3ZXJlIHBhcnNlZCBvciB0aGF0IGhhdmUgZGVmYXVsdHMuCiAgLy8vIE9wdGlvbnMgdGhhdCB3ZXJlbid0IHByZXNlbnQgYW5kIGhhdmUgbm8gZGVmYXVsdCB3aWxsIGJlIG9taXR0ZWQuCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgb3B0aW9ucyB7CiAgICB2YXIgcmVzdWx0ID0gU2V0PFN0cmluZz4uZnJvbShfcGFyc2VkLmtleXMpOwoKICAgIC8vIEluY2x1ZGUgdGhlIG9wdGlvbnMgdGhhdCBoYXZlIGRlZmF1bHRzLgogICAgX3BhcnNlci5vcHRpb25zLmZvckVhY2goKG5hbWUsIG9wdGlvbikgewogICAgICBpZiAob3B0aW9uLmRlZmF1bHRzVG8gIT0gbnVsbCkgcmVzdWx0LmFkZChuYW1lKTsKICAgIH0pOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbiB3aXRoIFtuYW1lXSB3YXMgcGFyc2VkIGZyb20gYW4gYWN0dWFsCiAgLy8vIGFyZ3VtZW50LgogIC8vLwogIC8vLyBSZXR1cm5zIGBmYWxzZWAgaWYgaXQgd2Fzbid0IHByb3ZpZGVkIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBubyBkZWZhdWx0CiAgLy8vIHZhbHVlIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC4KICBib29sIHdhc1BhcnNlZChTdHJpbmcgbmFtZSkgewogICAgdmFyIG9wdGlvbiA9IF9wYXJzZXIub3B0aW9uc1tuYW1lXTsKICAgIGlmIChvcHRpb24gPT0gbnVsbCkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdDb3VsZCBub3QgZmluZCBhbiBvcHRpb24gbmFtZWQgIiRuYW1lIi4nKTsKICAgIH0KCiAgICByZXR1cm4gX3BhcnNlZC5jb250YWluc0tleShuYW1lKTsKICB9Cn0KZABOTjwBGgEaASAEUE4aFiERGBceRwIBRBkESA8TQxsBOSYBUUcVATwGSRwBTg0GTU0YGwE3IAEiRDEwOgE4HS5GBgE+BAE/BlBIITEBLy03CAETBAFJEAZQIyAoGkYGASYEAgEhcGFja2FnZTphcmdzL3NyYy9hcmdfcmVzdWx0cy5kYXJ0TGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9hcmdzL2xpYi9zcmMvb3B0aW9uLmRhcnSXhi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQ3JlYXRlcyBhIG5ldyBbT3B0aW9uXS4KLy8vCi8vLyBTaW5jZSBbT3B0aW9uXSBkb2Vzbid0IGhhdmUgYSBwdWJsaWMgY29uc3RydWN0b3IsIHRoaXMgbGV0cyBgQXJnUGFyc2VyYAovLy8gZ2V0IHRvIGl0LiBUaGlzIGZ1bmN0aW9uIGlzbid0IGV4cG9ydGVkIHRvIHRoZSBwdWJsaWMgQVBJIG9mIHRoZSBwYWNrYWdlLgpPcHRpb24gbmV3T3B0aW9uKAogICAgU3RyaW5nIG5hbWUsCiAgICBTdHJpbmcgYWJiciwKICAgIFN0cmluZyBoZWxwLAogICAgU3RyaW5nIHZhbHVlSGVscCwKICAgIEl0ZXJhYmxlPFN0cmluZz4gYWxsb3dlZCwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsb3dlZEhlbHAsCiAgICBkZWZhdWx0c1RvLAogICAgRnVuY3Rpb24gY2FsbGJhY2ssCiAgICBPcHRpb25UeXBlIHR5cGUsCiAgICB7Ym9vbCBuZWdhdGFibGUsCiAgICBib29sIHNwbGl0Q29tbWFzLAogICAgYm9vbCBoaWRlID0gZmFsc2V9KSB7CiAgcmV0dXJuIE9wdGlvbi5fKG5hbWUsIGFiYnIsIGhlbHAsIHZhbHVlSGVscCwgYWxsb3dlZCwgYWxsb3dlZEhlbHAsIGRlZmF1bHRzVG8sCiAgICAgIGNhbGxiYWNrLCB0eXBlLAogICAgICBuZWdhdGFibGU6IG5lZ2F0YWJsZSwgc3BsaXRDb21tYXM6IHNwbGl0Q29tbWFzLCBoaWRlOiBoaWRlKTsKfQoKLy8vIEEgY29tbWFuZC1saW5lIG9wdGlvbi4KLy8vCi8vLyBUaGlzIHJlcHJlc2VudHMgYm90aCBib29sZWFuIGZsYWdzIGFuZCBvcHRpb25zIHdoaWNoIHRha2UgYSB2YWx1ZS4KY2xhc3MgT3B0aW9uIHsKICAvLy8gVGhlIG5hbWUgb2YgdGhlIG9wdGlvbiB0aGF0IHRoZSB1c2VyIHBhc3NlcyBhcyBhbiBhcmd1bWVudC4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIEEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHNob3J0aGFuZCBmb3IgdGhpcyBvcHRpb24uCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBgYWJicjogImEiYCB3aWxsIGFsbG93IHRoZSB1c2VyIHRvIHBhc3MgYC1hIHZhbHVlYCBvcgogIC8vLyBgLWF2YWx1ZWAuCiAgZmluYWwgU3RyaW5nIGFiYnI7CgogIEBEZXByZWNhdGVkKCJVc2UgYWJiciBpbnN0ZWFkLiIpCiAgU3RyaW5nIGdldCBhYmJyZXZpYXRpb24gPT4gYWJicjsKCiAgLy8vIEEgZGVzY3JpcHRpb24gb2YgdGhpcyBvcHRpb24uCiAgZmluYWwgU3RyaW5nIGhlbHA7CgogIC8vLyBBIG5hbWUgZm9yIHRoZSB2YWx1ZSB0aGlzIG9wdGlvbiB0YWtlcy4KICBmaW5hbCBTdHJpbmcgdmFsdWVIZWxwOwoKICAvLy8gQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBvcHRpb24uCiAgZmluYWwgTGlzdDxTdHJpbmc+IGFsbG93ZWQ7CgogIC8vLyBBIG1hcCBmcm9tIHZhbHVlcyBpbiBbYWxsb3dlZF0gdG8gZG9jdW1lbnRhdGlvbiBmb3IgdGhvc2UgdmFsdWVzLgogIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsb3dlZEhlbHA7CgogIC8vLyBUaGUgdmFsdWUgdGhpcyBvcHRpb24gd2lsbCBoYXZlIGlmIHRoZSB1c2VyIGRvZXNuJ3QgZXhwbGljaXRseSBwYXNzIGl0IGluCiAgZmluYWwgZGVmYXVsdHNUbzsKCiAgQERlcHJlY2F0ZWQoIlVzZSBkZWZhdWx0c1RvIGluc3RlYWQuIikKICBnZXQgZGVmYXVsdFZhbHVlID0+IGRlZmF1bHRzVG87CgogIC8vLyBXaGV0aGVyIHRoaXMgZmxhZydzIHZhbHVlIGNhbiBiZSBzZXQgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGlmIFtuYW1lXSBpcyBgZmxhZ2AsIHRoZSB1c2VyIGNhbiBwYXNzIGAtLW5vLWZsYWdgIHRvIHNldCBpdHMKICAvLy8gdmFsdWUgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gVGhpcyBpcyBgbnVsbGAgdW5sZXNzIFt0eXBlXSBpcyBbT3B0aW9uVHlwZS5mbGFnXS4KICBmaW5hbCBib29sIG5lZ2F0YWJsZTsKCiAgLy8vIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCB0aGUgb3B0aW9uJ3MgdmFsdWUgd2hlbiB0aGUgb3B0aW9uIGlzIHBhcnNlZC4KICBmaW5hbCBGdW5jdGlvbiBjYWxsYmFjazsKCiAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhIGZsYWcsIGEgc2luZ2xlIHZhbHVlIG9wdGlvbiwgb3IgYSBtdWx0aS12YWx1ZSBvcHRpb24uCiAgZmluYWwgT3B0aW9uVHlwZSB0eXBlOwoKICAvLy8gV2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgbWF5IGJlIHBhc3NlZCBieSB3cml0aW5nIGAtLW9wdGlvbiBhLGJgIGluCiAgLy8vIGFkZGl0aW9uIHRvIGAtLW9wdGlvbiBhIC0tb3B0aW9uIGJgLgogIGZpbmFsIGJvb2wgc3BsaXRDb21tYXM7CgogIC8vLyBXaGV0aGVyIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBoaWRkZW4gZnJvbSB1c2FnZSBkb2N1bWVudGF0aW9uLgogIGZpbmFsIGJvb2wgaGlkZTsKCiAgLy8vIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBib29sZWFuLXZhbHVlZCBmbGFnLgogIGJvb2wgZ2V0IGlzRmxhZyA9PiB0eXBlID09IE9wdGlvblR5cGUuZmxhZzsKCiAgLy8vIFdoZXRoZXIgdGhlIG9wdGlvbiB0YWtlcyBhIHNpbmdsZSB2YWx1ZS4KICBib29sIGdldCBpc1NpbmdsZSA9PiB0eXBlID09IE9wdGlvblR5cGUuc2luZ2xlOwoKICAvLy8gV2hldGhlciB0aGUgb3B0aW9uIGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMuCiAgYm9vbCBnZXQgaXNNdWx0aXBsZSA9PiB0eXBlID09IE9wdGlvblR5cGUubXVsdGlwbGU7CgogIE9wdGlvbi5fKAogICAgICB0aGlzLm5hbWUsCiAgICAgIHRoaXMuYWJiciwKICAgICAgdGhpcy5oZWxwLAogICAgICB0aGlzLnZhbHVlSGVscCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBhbGxvd2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwLAogICAgICB0aGlzLmRlZmF1bHRzVG8sCiAgICAgIHRoaXMuY2FsbGJhY2ssCiAgICAgIE9wdGlvblR5cGUgdHlwZSwKICAgICAge3RoaXMubmVnYXRhYmxlLAogICAgICBib29sIHNwbGl0Q29tbWFzLAogICAgICB0aGlzLmhpZGUgPSBmYWxzZX0pCiAgICAgIDogdGhpcy5hbGxvd2VkID0gYWxsb3dlZCA9PSBudWxsID8gbnVsbCA6IExpc3QudW5tb2RpZmlhYmxlKGFsbG93ZWQpLAogICAgICAgIHRoaXMuYWxsb3dlZEhlbHAgPQogICAgICAgICAgICBhbGxvd2VkSGVscCA9PSBudWxsID8gbnVsbCA6IE1hcC51bm1vZGlmaWFibGUoYWxsb3dlZEhlbHApLAogICAgICAgIHRoaXMudHlwZSA9IHR5cGUsCiAgICAgICAgLy8gSWYgdGhlIHVzZXIgZG9lc24ndCBzcGVjaWZ5IFtzcGxpdENvbW1hc10sIGl0IGRlZmF1bHRzIHRvIHRydWUgZm9yCiAgICAgICAgLy8gbXVsdGlwbGUgb3B0aW9ucy4KICAgICAgICB0aGlzLnNwbGl0Q29tbWFzID0KICAgICAgICAgICAgc3BsaXRDb21tYXMgPT0gbnVsbCA/IHR5cGUgPT0gT3B0aW9uVHlwZS5tdWx0aXBsZSA6IHNwbGl0Q29tbWFzIHsKICAgIGlmIChuYW1lLmlzRW1wdHkpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTmFtZSBjYW5ub3QgYmUgZW1wdHkuJyk7CiAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgnLScpKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ05hbWUgJG5hbWUgY2Fubm90IHN0YXJ0IHdpdGggIi0iLicpOwogICAgfQoKICAgIC8vIEVuc3VyZSBuYW1lIGRvZXMgbm90IGNvbnRhaW4gYW55IGludmFsaWQgY2hhcmFjdGVycy4KICAgIGlmIChfaW52YWxpZENoYXJzLmhhc01hdGNoKG5hbWUpKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ05hbWUgIiRuYW1lIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuJyk7CiAgICB9CgogICAgaWYgKGFiYnIgIT0gbnVsbCkgewogICAgICBpZiAoYWJici5sZW5ndGggIT0gMSkgewogICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0FiYnJldmlhdGlvbiBtdXN0IGJlIG51bGwgb3IgaGF2ZSBsZW5ndGggMS4nKTsKICAgICAgfSBlbHNlIGlmIChhYmJyID09ICctJykgewogICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0FiYnJldmlhdGlvbiBjYW5ub3QgYmUgIi0iLicpOwogICAgICB9CgogICAgICBpZiAoX2ludmFsaWRDaGFycy5oYXNNYXRjaChhYmJyKSkgewogICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0FiYnJldmlhdGlvbiBpcyBhbiBpbnZhbGlkIGNoYXJhY3Rlci4nKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJldHVybnMgW3ZhbHVlXSBpZiBub24tYG51bGxgLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKICAvLy8gdGhpcyBvcHRpb24uCiAgLy8vCiAgLy8vIEZvciBzaW5nbGUtdmFsdWVkIG9wdGlvbnMsIGl0IHdpbGwgYmUgW2RlZmF1bHRzVG9dIGlmIHNldCBvciBgbnVsbGAKICAvLy8gb3RoZXJ3aXNlLiBGb3IgbXVsdGlwbGUtdmFsdWVkIG9wdGlvbnMsIGl0IHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBvciBhCiAgLy8vIGxpc3QgY29udGFpbmluZyBbZGVmYXVsdHNUb10gaWYgc2V0LgogIGR5bmFtaWMgZ2V0T3JEZWZhdWx0KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlOwogICAgaWYgKGlzTXVsdGlwbGUpIHJldHVybiBkZWZhdWx0c1RvID8/IDxTdHJpbmc+W107CiAgICByZXR1cm4gZGVmYXVsdHNUbzsKICB9CgogIHN0YXRpYyBmaW5hbCBfaW52YWxpZENoYXJzID0gUmVnRXhwKHInJydbIFx0XHJcbiInXFwvXScnJyk7Cn0KCi8vLyBXaGF0IGtpbmRzIG9mIHZhbHVlcyBhbiBvcHRpb24gYWNjZXB0cy4KY2xhc3MgT3B0aW9uVHlwZSB7CiAgLy8vIEFuIG9wdGlvbiB0aGF0IGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLgogIC8vLwogIC8vLyBUaGUgcHJlc2VuY2Ugb2YgdGhlIG9wdGlvbiBuYW1lIGl0c2VsZiBpbiB0aGUgYXJndW1lbnQgbGlzdCBtZWFucyBgdHJ1ZWAuCiAgc3RhdGljIGNvbnN0IGZsYWcgPSBPcHRpb25UeXBlLl8oIk9wdGlvblR5cGUuZmxhZyIpOwoKICBARGVwcmVjYXRlZCgiVXNlIE9wdGlvblR5cGUuZmxhZyBpbnN0ZWFkLiIpCiAgc3RhdGljIGNvbnN0IEZMQUcgPSBmbGFnOyAvLyBpZ25vcmU6IGNvbnN0YW50X2lkZW50aWZpZXJfbmFtZXMKCiAgLy8vIEFuIG9wdGlvbiB0aGF0IHRha2VzIGEgc2luZ2xlIHZhbHVlLgogIC8vLwogIC8vLyBFeGFtcGxlczoKICAvLy8KICAvLy8gICAgIC0tbW9kZSBkZWJ1ZwogIC8vLyAgICAgLW1kZWJ1ZwogIC8vLyAgICAgLS1tb2RlPWRlYnVnCiAgLy8vCiAgLy8vIElmIHRoZSBvcHRpb24gaXMgcGFzc2VkIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCBvbmUgd2lucy4KICBzdGF0aWMgY29uc3Qgc2luZ2xlID0gT3B0aW9uVHlwZS5fKCJPcHRpb25UeXBlLnNpbmdsZSIpOwoKICBARGVwcmVjYXRlZCgiVXNlIE9wdGlvblR5cGUuc2luZ2xlIGluc3RlYWQuIikKICBzdGF0aWMgY29uc3QgU0lOR0xFID0gc2luZ2xlOyAvLyBpZ25vcmU6IGNvbnN0YW50X2lkZW50aWZpZXJfbmFtZXMKCiAgLy8vIEFuIG9wdGlvbiB0aGF0IGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMuCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICAtLW91dHB1dCB0ZXh0IC0tb3V0cHV0IHhtbAogIC8vLwogIC8vLyBJbiB0aGUgcGFyc2VkIGBBcmdSZXN1bHRzYCwgYSBtdWx0aXBsZS12YWx1ZWQgb3B0aW9uIHdpbGwgYWx3YXlzIHJldHVybgogIC8vLyBhIGxpc3QsIGV2ZW4gaWYgb25lIG9yIG5vIHZhbHVlcyB3ZXJlIHBhc3NlZC4KICBzdGF0aWMgY29uc3QgbXVsdGlwbGUgPSBPcHRpb25UeXBlLl8oIk9wdGlvblR5cGUubXVsdGlwbGUiKTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBPcHRpb25UeXBlLm11bHRpcGxlIGluc3RlYWQuIikKICBzdGF0aWMgY29uc3QgTVVMVElQTEUgPSBtdWx0aXBsZTsgLy8gaWdub3JlOiBjb25zdGFudF9pZGVudGlmaWVyX25hbWVzCgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBjb25zdCBPcHRpb25UeXBlLl8odGhpcy5uYW1lKTsKfQqAwQBOTjwBHARMThIREREWHiUQFxUVFhpRFkMCARsERw9CFQFRBkkRFQEjIwEkFQEuGgEuHgFIKQFQFAEpIgE3BlEYBjkYAVAbAU4ZAUkrGgFFEwExLgEvMgExNgEMERERFiAnFxUXFxgaTBtIGk4dG04YNCdABgE8KEgGARgeTCA8CAEqRggGBAFNEwZKTCsgJTUXBAE+AgEsEzQGUDcBLkEBKwYQBhcSFwZBOwEwRQEtBg8GJQZOND8BMkkBFQEhAgEccGFja2FnZTphcmdzL3NyYy9vcHRpb24uZGFydE5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY3J5cHRvL2xpYi9zcmMvZGlnZXN0LmRhcnSEsS8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6Y29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6Y29udmVydC9jb252ZXJ0LmRhcnQnOwoKLy8vIEEgbWVzc2FnZSBkaWdlc3QgYXMgY29tcHV0ZWQgYnkgYSBgSGFzaGAgb3IgYEhNQUNgIGZ1bmN0aW9uLgpjbGFzcyBEaWdlc3QgewogIC8vLyBUaGUgbWVzc2FnZSBkaWdlc3QgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCiAgZmluYWwgTGlzdDxpbnQ+IGJ5dGVzOwoKICBEaWdlc3QodGhpcy5ieXRlcyk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBlcXVhbCB0byBhbm90aGVyIGRpZ2VzdC4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIG1hbnVhbCBjb21wYXJpc29ucyB0byBhdm9pZCBsZWFraW5nCiAgLy8vIGluZm9ybWF0aW9uIHZpYSB0aW1pbmcuCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBEaWdlc3QpIHsKICAgICAgZmluYWwgYSA9IGJ5dGVzOwogICAgICBmaW5hbCBiID0gb3RoZXIuYnl0ZXM7CiAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmaW5hbCBuID0gYS5sZW5ndGg7CiAgICAgIGludCBtaXNtYXRjaCA9IDA7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgbWlzbWF0Y2ggfD0gYVtpXSBeIGJbaV07CiAgICAgIH0KICAgICAgcmV0dXJuIG1pc21hdGNoID09IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGNvbnN0IExpc3RFcXVhbGl0eSgpLmhhc2goYnl0ZXMpOwoKICAvLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGFzIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cy4KICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBoZXguZW5jb2RlKGJ5dGVzKTsKfQotAE5OPAEtJwFBDy8ZARYBNwZJHgwjGxcdIhYIGhgkIQgcBhIEAQw4ATwMKgIBHnBhY2thZ2U6Y3J5cHRvL3NyYy9kaWdlc3QuZGFydExmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY3J5cHRvL2xpYi9zcmMvaGFzaC5kYXJ0hD8vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnZGlnZXN0X3NpbmsuZGFydCc7CgovLy8gQW4gaW50ZXJmYWNlIGZvciBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb25zLgovLy8KLy8vIEV2ZXJ5IGhhc2ggaXMgYSBjb252ZXJ0ZXIgdGhhdCB0YWtlcyBhIGxpc3Qgb2YgaW50cyBhbmQgcmV0dXJucyBhIHNpbmdsZQovLy8gZGlnZXN0LiBXaGVuIHVzZWQgaW4gY2h1bmtlZCBtb2RlLCBpdCB3aWxsIG9ubHkgZXZlciBhZGQgb25lIGRpZ2VzdCB0byB0aGUKLy8vIGlubmVyIFtTaW5rXS4KYWJzdHJhY3QgY2xhc3MgSGFzaCBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIERpZ2VzdD4gewogIC8vLyBUaGUgaW50ZXJuYWwgYmxvY2sgc2l6ZSBvZiB0aGUgaGFzaCBpbiBieXRlcy4KICAvLy8KICAvLy8gVGhpcyBpcyBleHBvc2VkIGZvciB1c2UgYnkgdGhlIGBIbWFjYCBjbGFzcywgd2hpY2ggbmVlZHMgdG8ga25vdyB0aGUgYmxvY2sKICAvLy8gc2l6ZSBmb3IgdGhlIFtIYXNoXSBpdCB1c2VzLgogIGludCBnZXQgYmxvY2tTaXplOwoKICBjb25zdCBIYXNoKCk7CgogIEBvdmVycmlkZQogIERpZ2VzdCBjb252ZXJ0KExpc3Q8aW50PiBkYXRhKSB7CiAgICB2YXIgaW5uZXJTaW5rID0gRGlnZXN0U2luaygpOwogICAgdmFyIG91dGVyU2luayA9IHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oaW5uZXJTaW5rKTsKICAgIG91dGVyU2luay5hZGQoZGF0YSk7CiAgICBvdXRlclNpbmsuY2xvc2UoKTsKICAgIHJldHVybiBpbm5lclNpbmsudmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luayk7Cn0KJQBOTjwBFwEWGwEzBE1PEjs0BlEjFQEQAQwjIjcZFxwEAQxAAgEccGFja2FnZTpjcnlwdG8vc3JjL2hhc2guZGFydExmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY3J5cHRvL2xpYi9zcmMvaG1hYy5kYXJ0jEkvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKaW1wb3J0ICdkaWdlc3Rfc2luay5kYXJ0JzsKaW1wb3J0ICdoYXNoLmRhcnQnOwoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFtrZXllZC1oYXNoIG1ldGhvZCBhdXRoZW50aWNhdGlvbiBjb2Rlc11bcmZjXS4KLy8vCi8vLyBbcmZjXTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIxMDQKLy8vCi8vLyBITUFDIGFsbG93cyBtZXNzYWdlcyB0byBiZSBjcnlwdG9ncmFwaGljYWxseSBhdXRoZW50aWNhdGVkIHVzaW5nIGFueQovLy8gaXRlcmF0ZWQgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLgpjbGFzcyBIbWFjIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgRGlnZXN0PiB7CiAgLy8vIFRoZSBoYXNoIGZ1bmN0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgYXV0aGVudGljYXRpb24gZGlnZXN0LgogIGZpbmFsIEhhc2ggX2hhc2g7CgogIC8vLyBUaGUgc2VjcmV0IGtleSBzaGFyZWQgYnkgdGhlIHNlbmRlciBhbmQgdGhlIHJlY2VpdmVyLgogIGZpbmFsIFVpbnQ4TGlzdCBfa2V5OwoKICAvLy8gQ3JlYXRlIGFuIFtIbWFjXSBvYmplY3QgZnJvbSBhIFtIYXNoXSBhbmQgYSBiaW5hcnkga2V5LgogIC8vLwogIC8vLyBUaGUga2V5IHNob3VsZCBiZSBhIHNlY3JldCBzaGFyZWQgYmV0d2VlbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciBvZiB0aGUKICAvLy8gbWVzc2FnZS4KICBIbWFjKEhhc2ggaGFzaCwgTGlzdDxpbnQ+IGtleSkKICAgICAgOiBfaGFzaCA9IGhhc2gsCiAgICAgICAgX2tleSA9IFVpbnQ4TGlzdChoYXNoLmJsb2NrU2l6ZSkgewogICAgLy8gSGFzaCB0aGUga2V5IGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGJsb2NrIHNpemUgb2YgdGhlIGhhc2guCiAgICBpZiAoa2V5Lmxlbmd0aCA+IF9oYXNoLmJsb2NrU2l6ZSkga2V5ID0gX2hhc2guY29udmVydChrZXkpLmJ5dGVzOwoKICAgIC8vIElmIFtrZXldIGlzIHNob3J0ZXIgdGhhbiB0aGUgYmxvY2sgc2l6ZSwgdGhlIHJlc3Qgb2YgW19rZXldIHdpbGwgYmUKICAgIC8vIDAtcGFkZGVkLgogICAgX2tleS5zZXRSYW5nZSgwLCBrZXkubGVuZ3RoLCBrZXkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGlnZXN0IGNvbnZlcnQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIHZhciBpbm5lclNpbmsgPSBEaWdlc3RTaW5rKCk7CiAgICB2YXIgb3V0ZXJTaW5rID0gc3RhcnRDaHVua2VkQ29udmVyc2lvbihpbm5lclNpbmspOwogICAgb3V0ZXJTaW5rLmFkZChkYXRhKTsKICAgIG91dGVyU2luay5jbG9zZSgpOwogICAgcmV0dXJuIGlubmVyU2luay52YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8RGlnZXN0PiBzaW5rKSA9PgogICAgICBfSG1hY1Npbmsoc2luaywgX2hhc2gsIF9rZXkpOwp9CgovLy8gVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBITUFDIGFsZ29yaXRobS4KY2xhc3MgX0htYWNTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rIHsKICAvLy8gVGhlIHNpbmsgZm9yIHRoZSBvdXRlciBoYXNoIGNvbXB1dGF0aW9uLgogIGZpbmFsIEJ5dGVDb252ZXJzaW9uU2luayBfb3V0ZXJTaW5rOwoKICAvLy8gVGhlIHNpbmsgdGhhdCBbX2lubmVyU2lua10ncyByZXN1bHQgd2lsbCBiZSBhZGRlZCB0byB3aGVuIGl0J3MgYXZhaWxhYmxlLgogIGZpbmFsIF9pbm5lclJlc3VsdFNpbmsgPSBEaWdlc3RTaW5rKCk7CgogIC8vLyBUaGUgc2luayBmb3IgdGhlIGlubmVyIGhhc2ggY29tcHV0YXRpb24uCiAgQnl0ZUNvbnZlcnNpb25TaW5rIF9pbm5lclNpbms7CgogIC8vLyBXaGV0aGVyIFtjbG9zZV0gaGFzIGJlZW4gY2FsbGVkLgogIGJvb2wgX2lzQ2xvc2VkID0gZmFsc2U7CgogIF9IbWFjU2luayhTaW5rPERpZ2VzdD4gc2luaywgSGFzaCBoYXNoLCBMaXN0PGludD4ga2V5KQogICAgICA6IF9vdXRlclNpbmsgPSBoYXNoLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oc2luaykgewogICAgX2lubmVyU2luayA9IGhhc2guc3RhcnRDaHVua2VkQ29udmVyc2lvbihfaW5uZXJSZXN1bHRTaW5rKTsKCiAgICAvLyBDb21wdXRlIG91dGVyIHBhZGRpbmcuCiAgICB2YXIgcGFkZGluZyA9IFVpbnQ4TGlzdChrZXkubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFkZGluZy5sZW5ndGg7IGkrKykgewogICAgICBwYWRkaW5nW2ldID0gMHg1YyBeIGtleVtpXTsKICAgIH0KICAgIF9vdXRlclNpbmsuYWRkKHBhZGRpbmcpOwoKICAgIC8vIENvbXB1dGUgaW5uZXIgcGFkZGluZy4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFkZGluZy5sZW5ndGg7IGkrKykgewogICAgICBwYWRkaW5nW2ldID0gMHgzNiBeIGtleVtpXTsKICAgIH0KICAgIF9pbm5lclNpbmsuYWRkKHBhZGRpbmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGlmIChfaXNDbG9zZWQpIHRocm93IFN0YXRlRXJyb3IoJ0hNQUMgaXMgY2xvc2VkJyk7CiAgICBfaW5uZXJTaW5rLmFkZChkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChfaXNDbG9zZWQpIHRocm93IFN0YXRlRXJyb3IoJ0hNQUMgaXMgY2xvc2VkJyk7CiAgICBfaW5uZXJTaW5rLmFkZFNsaWNlKGRhdGEsIHN0YXJ0LCBlbmQsIGlzTGFzdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOwogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKCiAgICBfaW5uZXJTaW5rLmNsb3NlKCk7CiAgICBfb3V0ZXJTaW5rLmFkZChfaW5uZXJSZXN1bHRTaW5rLnZhbHVlLmJ5dGVzKTsKICAgIF9vdXRlclNpbmsuY2xvc2UoKTsKICB9Cn0KbQBOTjwBFxoBFhsUAUgELwRJKjJDFAE8GAE+Bk8PIRYrREYBSxEnBAEMIyI3GRccBAEMQiQCATctLycBUCkBLyEBJxoBOTlAAR4pLyIGHQEeLyIGHQQBDB03GgQBDEM3MwQBDBEbFgEYMhgEAgEccGFja2FnZTpjcnlwdG8vc3JjL2htYWMuZGFydEtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY3J5cHRvL2xpYi9zcmMvbWQ1LmRhcnSOvi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZGlnZXN0LmRhcnQnOwppbXBvcnQgJ2hhc2guZGFydCc7CmltcG9ydCAnaGFzaF9zaW5rLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8vIEFuIGluc3RhbmNlIG9mIFtNRDVdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgY29udmVuaWVudCBhY2Nlc3MgdG8gdGhlIFtNRDVdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzEzMjEKLy8vCi8vLyAqKldhcm5pbmcqKjogTUQ1IGhhcyBrbm93biBjb2xsaXNpb25zIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gcmVxdWlyZWQKLy8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KZmluYWwgbWQ1ID0gTUQ1Ll8oKTsKCi8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW01ENV1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTMyMQovLy8KLy8vICoqV2FybmluZyoqOiBNRDUgaGFzIGtub3duIGNvbGxpc2lvbnMgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiByZXF1aXJlZAovLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgovLy8KLy8vIE5vdGUgdGhhdCBpdCdzIGFsbW9zdCBhbHdheXMgZWFzaWVyIHRvIHVzZSBbbWQ1XSByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldwovLy8gaW5zdGFuY2UuCmNsYXNzIE1ENSBleHRlbmRzIEhhc2ggewogIEBvdmVycmlkZQogIGZpbmFsIGludCBibG9ja1NpemUgPSAxNiAqIGJ5dGVzUGVyV29yZDsKCiAgTUQ1Ll8oKTsKCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspID0+CiAgICAgIEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKF9NRDVTaW5rKHNpbmspKTsKfQoKLy8vIERhdGEgZnJvbSBhIG5vbi1saW5lYXIgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uIHRoYXQgZnVuY3Rpb25zIGFzCi8vLyByZXByb2R1Y2libGUgbm9pc2UuCmNvbnN0IF9ub2lzZSA9IFsKICAweGQ3NmFhNDc4LCAweGU4YzdiNzU2LCAweDI0MjA3MGRiLCAweGMxYmRjZWVlLCAweGY1N2MwZmFmLCAweDQ3ODdjNjJhLCAvLwogIDB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsIDB4Njk4MDk4ZDgsIDB4OGI0NGY3YWYsIDB4ZmZmZjViYjEsIDB4ODk1Y2Q3YmUsCiAgMHg2YjkwMTEyMiwgMHhmZDk4NzE5MywgMHhhNjc5NDM4ZSwgMHg0OWI0MDgyMSwgMHhmNjFlMjU2MiwgMHhjMDQwYjM0MCwKICAweDI2NWU1YTUxLCAweGU5YjZjN2FhLCAweGQ2MmYxMDVkLCAweDAyNDQxNDUzLCAweGQ4YTFlNjgxLCAweGU3ZDNmYmM4LAogIDB4MjFlMWNkZTYsIDB4YzMzNzA3ZDYsIDB4ZjRkNTBkODcsIDB4NDU1YTE0ZWQsIDB4YTllM2U5MDUsIDB4ZmNlZmEzZjgsCiAgMHg2NzZmMDJkOSwgMHg4ZDJhNGM4YSwgMHhmZmZhMzk0MiwgMHg4NzcxZjY4MSwgMHg2ZDlkNjEyMiwgMHhmZGU1MzgwYywKICAweGE0YmVlYTQ0LCAweDRiZGVjZmE5LCAweGY2YmI0YjYwLCAweGJlYmZiYzcwLCAweDI4OWI3ZWM2LCAweGVhYTEyN2ZhLAogIDB4ZDRlZjMwODUsIDB4MDQ4ODFkMDUsIDB4ZDlkNGQwMzksIDB4ZTZkYjk5ZTUsIDB4MWZhMjdjZjgsIDB4YzRhYzU2NjUsCiAgMHhmNDI5MjI0NCwgMHg0MzJhZmY5NywgMHhhYjk0MjNhNywgMHhmYzkzYTAzOSwgMHg2NTViNTljMywgMHg4ZjBjY2M5MiwKICAweGZmZWZmNDdkLCAweDg1ODQ1ZGQxLCAweDZmYTg3ZTRmLCAweGZlMmNlNmUwLCAweGEzMDE0MzE0LCAweDRlMDgxMWExLAogIDB4Zjc1MzdlODIsIDB4YmQzYWYyMzUsIDB4MmFkN2QyYmIsIDB4ZWI4NmQzOTEKXTsKCi8vLyBQZXItcm91bmQgc2hpZnQgYW1vdW50cy4KY29uc3QgX3NoaWZ0QW1vdW50cyA9IFsKICAwNywgMTIsIDE3LCAyMiwgMDcsIDEyLCAxNywgMjIsIDA3LCAxMiwgMTcsIDIyLCAwNywgMTIsIDE3LCAyMiwgMDUsIDA5LCAxNCwgLy8KICAyMCwgMDUsIDA5LCAxNCwgMjAsIDA1LCAwOSwgMTQsIDIwLCAwNSwgMDksIDE0LCAyMCwgMDQsIDExLCAxNiwgMjMsIDA0LCAxMSwKICAxNiwgMjMsIDA0LCAxMSwgMTYsIDIzLCAwNCwgMTEsIDE2LCAyMywgMDYsIDEwLCAxNSwgMjEsIDA2LCAxMCwgMTUsIDIxLCAwNiwKICAxMCwgMTUsIDIxLCAwNiwgMTAsIDE1LCAyMQpdOwoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbTUQ1XS4KLy8vCi8vLyBUaGlzIGlzIHNlcGFyYXRlIHNvIHRoYXQgaXQgY2FuIGV4dGVuZCBbSGFzaFNpbmtdIHdpdGhvdXQgbGVha2luZyBhZGRpdGlvbmFsCi8vLyBwdWJsaWMgbWVtYmVycy4KY2xhc3MgX01ENVNpbmsgZXh0ZW5kcyBIYXNoU2luayB7CiAgQG92ZXJyaWRlCiAgZmluYWwgZGlnZXN0ID0gVWludDMyTGlzdCg0KTsKCiAgX01ENVNpbmsoU2luazxEaWdlc3Q+IHNpbmspIDogc3VwZXIoc2luaywgMTYsIGVuZGlhbjogRW5kaWFuLmxpdHRsZSkgewogICAgZGlnZXN0WzBdID0gMHg2NzQ1MjMwMTsKICAgIGRpZ2VzdFsxXSA9IDB4ZWZjZGFiODk7CiAgICBkaWdlc3RbMl0gPSAweDk4YmFkY2ZlOwogICAgZGlnZXN0WzNdID0gMHgxMDMyNTQ3NjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdXBkYXRlSGFzaChVaW50MzJMaXN0IGNodW5rKSB7CiAgICBhc3NlcnQoY2h1bmsubGVuZ3RoID09IDE2KTsKCiAgICB2YXIgYSA9IGRpZ2VzdFswXTsKICAgIHZhciBiID0gZGlnZXN0WzFdOwogICAgdmFyIGMgPSBkaWdlc3RbMl07CiAgICB2YXIgZCA9IGRpZ2VzdFszXTsKCiAgICBpbnQgZTsKICAgIGludCBmOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgZSA9IChiICYgYykgfCAoKH5iICYgbWFzazMyKSAmIGQpOwogICAgICAgIGYgPSBpOwogICAgICB9IGVsc2UgaWYgKGkgPCAzMikgewogICAgICAgIGUgPSAoZCAmIGIpIHwgKCh+ZCAmIG1hc2szMikgJiBjKTsKICAgICAgICBmID0gKCg1ICogaSkgKyAxKSAlIDE2OwogICAgICB9IGVsc2UgaWYgKGkgPCA0OCkgewogICAgICAgIGUgPSBiIF4gYyBeIGQ7CiAgICAgICAgZiA9ICgoMyAqIGkpICsgNSkgJSAxNjsKICAgICAgfSBlbHNlIHsKICAgICAgICBlID0gYyBeIChiIHwgKH5kICYgbWFzazMyKSk7CiAgICAgICAgZiA9ICg3ICogaSkgJSAxNjsKICAgICAgfQoKICAgICAgdmFyIHRlbXAgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhZGQzMigKICAgICAgICAgIGIsCiAgICAgICAgICByb3RsMzIoYWRkMzIoYWRkMzIoYSwgZSksIGFkZDMyKF9ub2lzZVtpXSwgY2h1bmtbZl0pKSwKICAgICAgICAgICAgICBfc2hpZnRBbW91bnRzW2ldKSk7CiAgICAgIGEgPSB0ZW1wOwogICAgfQoKICAgIGRpZ2VzdFswXSA9IGFkZDMyKGEsIGRpZ2VzdFswXSk7CiAgICBkaWdlc3RbMV0gPSBhZGQzMihiLCBkaWdlc3RbMV0pOwogICAgZGlnZXN0WzJdID0gYWRkMzIoYywgZGlnZXN0WzJdKTsKICAgIGRpZ2VzdFszXSA9IGFkZDMyKGQsIGRpZ2VzdFszXSk7CiAgfQp9Cn4ATk48ARcaARYUGRUBGgROBC8EUCEVATcELwRQIQRQDhkMKwELAQxCLwIBQxgRTUpKSkpKSkpKSjEDAR0YUU5OHQMBKgRRFCIMIAFJHBwcHAQBDCYgARcXFxcBCwsBIxQrDxsrIBsXIA8lGggBFA0NEQ1BIhAGASUlJSUEAgEbcGFja2FnZTpjcnlwdG8vc3JjL21kNS5kYXJ0TGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jcnlwdG8vbGliL3NyYy9zaGExLmRhcnSK1y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZGlnZXN0LmRhcnQnOwppbXBvcnQgJ2hhc2guZGFydCc7CmltcG9ydCAnaGFzaF9zaW5rLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8vIEFuIGluc3RhbmNlIG9mIFtTaGExXS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBbU0hBLTFdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzE3NApmaW5hbCBzaGExID0gU2hhMS5fKCk7CgovLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtTSEEtMV1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMTc0CmNsYXNzIFNoYTEgZXh0ZW5kcyBIYXNoIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgYmxvY2tTaXplID0gMTYgKiBieXRlc1BlcldvcmQ7CgogIFNoYTEuXygpOwoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luaykgPT4KICAgICAgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oX1NoYTFTaW5rKHNpbmspKTsKfQoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbU2hhMV0uCi8vLwovLy8gVGhpcyBpcyBzZXBhcmF0ZSBzbyB0aGF0IGl0IGNhbiBleHRlbmQgW0hhc2hTaW5rXSB3aXRob3V0IGxlYWtpbmcgYWRkaXRpb25hbAovLy8gcHVibGljIG1lbWViZXJzLgpjbGFzcyBfU2hhMVNpbmsgZXh0ZW5kcyBIYXNoU2luayB7CiAgQG92ZXJyaWRlCiAgZmluYWwgZGlnZXN0ID0gVWludDMyTGlzdCg1KTsKCiAgLy8vIFRoZSBzaXh0ZWVuIHdvcmRzIGZyb20gdGhlIG9yaWdpbmFsIGNodW5rLCBleHRlbmRlZCB0byA4MCB3b3Jkcy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSB0byBhdm9pZCByZS1hbGxvY2F0aW5nLCBidXQgaXRzIGRhdGEgaXNuJ3QKICAvLy8gdXNlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgW3VwZGF0ZUhhc2hdLgogIGZpbmFsIFVpbnQzMkxpc3QgX2V4dGVuZGVkOwoKICBfU2hhMVNpbmsoU2luazxEaWdlc3Q+IHNpbmspCiAgICAgIDogX2V4dGVuZGVkID0gVWludDMyTGlzdCg4MCksCiAgICAgICAgc3VwZXIoc2luaywgMTYpIHsKICAgIGRpZ2VzdFswXSA9IDB4Njc0NTIzMDE7CiAgICBkaWdlc3RbMV0gPSAweEVGQ0RBQjg5OwogICAgZGlnZXN0WzJdID0gMHg5OEJBRENGRTsKICAgIGRpZ2VzdFszXSA9IDB4MTAzMjU0NzY7CiAgICBkaWdlc3RbNF0gPSAweEMzRDJFMUYwOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVIYXNoKFVpbnQzMkxpc3QgY2h1bmspIHsKICAgIGFzc2VydChjaHVuay5sZW5ndGggPT0gMTYpOwoKICAgIHZhciBhID0gZGlnZXN0WzBdOwogICAgdmFyIGIgPSBkaWdlc3RbMV07CiAgICB2YXIgYyA9IGRpZ2VzdFsyXTsKICAgIHZhciBkID0gZGlnZXN0WzNdOwogICAgdmFyIGUgPSBkaWdlc3RbNF07CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7CiAgICAgIGlmIChpIDwgMTYpIHsKICAgICAgICBfZXh0ZW5kZWRbaV0gPSBjaHVua1tpXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfZXh0ZW5kZWRbaV0gPSByb3RsMzIoCiAgICAgICAgICAgIF9leHRlbmRlZFtpIC0gM10gXgogICAgICAgICAgICAgICAgX2V4dGVuZGVkW2kgLSA4XSBeCiAgICAgICAgICAgICAgICBfZXh0ZW5kZWRbaSAtIDE0XSBeCiAgICAgICAgICAgICAgICBfZXh0ZW5kZWRbaSAtIDE2XSwKICAgICAgICAgICAgMSk7CiAgICAgIH0KCiAgICAgIHZhciBuZXdBID0gYWRkMzIoYWRkMzIocm90bDMyKGEsIDUpLCBlKSwgX2V4dGVuZGVkW2ldKTsKICAgICAgaWYgKGkgPCAyMCkgewogICAgICAgIG5ld0EgPSBhZGQzMihhZGQzMihuZXdBLCAoYiAmIGMpIHwgKH5iICYgZCkpLCAweDVBODI3OTk5KTsKICAgICAgfSBlbHNlIGlmIChpIDwgNDApIHsKICAgICAgICBuZXdBID0gYWRkMzIoYWRkMzIobmV3QSwgKGIgXiBjIF4gZCkpLCAweDZFRDlFQkExKTsKICAgICAgfSBlbHNlIGlmIChpIDwgNjApIHsKICAgICAgICBuZXdBID0gYWRkMzIoYWRkMzIobmV3QSwgKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpKSwgMHg4RjFCQkNEQyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3QSA9IGFkZDMyKGFkZDMyKG5ld0EsIGIgXiBjIF4gZCksIDB4Q0E2MkMxRDYpOwogICAgICB9CgogICAgICBlID0gZDsKICAgICAgZCA9IGM7CiAgICAgIGMgPSByb3RsMzIoYiwgMzApOwogICAgICBiID0gYTsKICAgICAgYSA9IG5ld0EgJiBtYXNrMzI7CiAgICB9CgogICAgZGlnZXN0WzBdID0gYWRkMzIoYSwgZGlnZXN0WzBdKTsKICAgIGRpZ2VzdFsxXSA9IGFkZDMyKGIsIGRpZ2VzdFsxXSk7CiAgICBkaWdlc3RbMl0gPSBhZGQzMihjLCBkaWdlc3RbMl0pOwogICAgZGlnZXN0WzNdID0gYWRkMzIoZCwgZGlnZXN0WzNdKTsKICAgIGRpZ2VzdFs0XSA9IGFkZDMyKGUsIGRpZ2VzdFs0XSk7CiAgfQp9CmoATk48ARcaARYUGRUBGwRQBC4XATkELhoMKwEMAQxCMAIBKwRRFSMMIAFHBk4vHgEfJBocHBwcHAQBDCYgARcXFxcXASMUIQ8fHyMkIxAIAT4UQxs8G0wPOggBDQ0ZDRkGASUlJSUlBAIBHHBhY2thZ2U6Y3J5cHRvL3NyYy9zaGExLmRhcnROZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NyeXB0by9saWIvc3JjL3NoYTI1Ni5kYXJ0mAgvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKaW1wb3J0ICdoYXNoLmRhcnQnOwppbXBvcnQgJ2hhc2hfc2luay5kYXJ0JzsKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCi8vLyBBbiBpbnN0YW5jZSBvZiBbU2hhMjU2XS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBbU2hhMjU2XVtyZmNdIGhhc2ggZnVuY3Rpb24uCi8vLwovLy8gW3JmY106IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyMzQKZmluYWwgc2hhMjU2ID0gU2hhMjU2Ll8oKTsKCi8vLyBBbiBpbnN0YW5jZSBvZiBbU2hhMjI0XS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBbU2hhMjI0XVtyZmNdIGhhc2ggZnVuY3Rpb24uCi8vLwovLy8gW3JmY106IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyMzQKZmluYWwgc2hhMjI0ID0gU2hhMjI0Ll8oKTsKCi8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW1NIQS0yNTZdW3JmY10gaGFzaCBmdW5jdGlvbi4KLy8vCi8vLyBbcmZjXTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjIzNAovLy8KLy8vIE5vdGUgdGhhdCBpdCdzIGFsbW9zdCBhbHdheXMgZWFzaWVyIHRvIHVzZSBbc2hhMjU2XSByYXRoZXIgdGhhbiBjcmVhdGluZyBhCi8vLyBuZXcgaW5zdGFuY2UuCmNsYXNzIFNoYTI1NiBleHRlbmRzIEhhc2ggewogIEBvdmVycmlkZQogIGZpbmFsIGludCBibG9ja1NpemUgPSAxNiAqIGJ5dGVzUGVyV29yZDsKCiAgU2hhMjU2Ll8oKTsKCiAgU2hhMjU2IG5ld0luc3RhbmNlKCkgPT4gU2hhMjU2Ll8oKTsKCiAgQG92ZXJyaWRlCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxEaWdlc3Q+IHNpbmspID0+CiAgICAgIEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKF9TaGEyNTZTaW5rKHNpbmspKTsKfQoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbU0hBLTIyNF1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM0Ci8vLwovLy8gTm90ZSB0aGF0IGl0J3MgYWxtb3N0IGFsd2F5cyBlYXNpZXIgdG8gdXNlIFtzaGEyMjRdIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEKLy8vIG5ldyBpbnN0YW5jZS4KY2xhc3MgU2hhMjI0IGV4dGVuZHMgSGFzaCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGJsb2NrU2l6ZSA9IDE2ICogYnl0ZXNQZXJXb3JkOwoKICBTaGEyMjQuXygpOwoKICBTaGEyMjQgbmV3SW5zdGFuY2UoKSA9PiBTaGEyMjQuXygpOwoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luaykgPT4KICAgICAgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oX1NoYTIyNFNpbmsoc2luaykpOwp9CgovLy8gRGF0YSBmcm9tIGEgbm9uLWxpbmVhciBmdW5jdGlvbiB0aGF0IGZ1bmN0aW9ucyBhcyByZXByb2R1Y2libGUgbm9pc2UuCmNvbnN0IExpc3Q8aW50PiBfbm9pc2UgPSBbCiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgLy8KICAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLAogIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsCiAgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwKICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LAogIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsCiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwKICAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLAogIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsCiAgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwKICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCl07CgphYnN0cmFjdCBjbGFzcyBfU2hhMzJCaXRTaW5rIGV4dGVuZHMgSGFzaFNpbmsgewogIGZpbmFsIFVpbnQzMkxpc3QgX2RpZ2VzdDsKCiAgLy8vIFRoZSBzaXh0ZWVuIHdvcmRzIGZyb20gdGhlIG9yaWdpbmFsIGNodW5rLCBleHRlbmRlZCB0byA2NCB3b3Jkcy4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSB0byBhdm9pZCByZS1hbGxvY2F0aW5nLCBidXQgaXRzIGRhdGEgaXNuJ3QKICAvLy8gdXNlZCBhY3Jvc3MgaW52b2NhdGlvbnMgb2YgW3VwZGF0ZUhhc2hdLgogIGZpbmFsIF9leHRlbmRlZCA9IFVpbnQzMkxpc3QoNjQpOwoKICBfU2hhMzJCaXRTaW5rKFNpbms8RGlnZXN0PiBzaW5rLCB0aGlzLl9kaWdlc3QpIDogc3VwZXIoc2luaywgMTYpOwoKICAvLyBUaGUgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbnMgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20KICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM0LgoKICBpbnQgX3JvdHIzMihpbnQgbiwgaW50IHgpID0+ICh4ID4+IG4pIHwgKCh4IDw8ICgzMiAtIG4pKSAmIG1hc2szMik7CiAgaW50IF9jaChpbnQgeCwgaW50IHksIGludCB6KSA9PiAoeCAmIHkpIF4gKCh+eCAmIG1hc2szMikgJiB6KTsKICBpbnQgX21haihpbnQgeCwgaW50IHksIGludCB6KSA9PiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7CiAgaW50IF9ic2lnMChpbnQgeCkgPT4gX3JvdHIzMigyLCB4KSBeIF9yb3RyMzIoMTMsIHgpIF4gX3JvdHIzMigyMiwgeCk7CiAgaW50IF9ic2lnMShpbnQgeCkgPT4gX3JvdHIzMig2LCB4KSBeIF9yb3RyMzIoMTEsIHgpIF4gX3JvdHIzMigyNSwgeCk7CiAgaW50IF9zc2lnMChpbnQgeCkgPT4gX3JvdHIzMig3LCB4KSBeIF9yb3RyMzIoMTgsIHgpIF4gKHggPj4gMyk7CiAgaW50IF9zc2lnMShpbnQgeCkgPT4gX3JvdHIzMigxNywgeCkgXiBfcm90cjMyKDE5LCB4KSBeICh4ID4+IDEwKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVIYXNoKFVpbnQzMkxpc3QgY2h1bmspIHsKICAgIGFzc2VydChjaHVuay5sZW5ndGggPT0gMTYpOwoKICAgIC8vIFByZXBhcmUgbWVzc2FnZSBzY2hlZHVsZS4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICBfZXh0ZW5kZWRbaV0gPSBjaHVua1tpXTsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxNjsgaSA8IDY0OyBpKyspIHsKICAgICAgX2V4dGVuZGVkW2ldID0gYWRkMzIoYWRkMzIoX3NzaWcxKF9leHRlbmRlZFtpIC0gMl0pLCBfZXh0ZW5kZWRbaSAtIDddKSwKICAgICAgICAgIGFkZDMyKF9zc2lnMChfZXh0ZW5kZWRbaSAtIDE1XSksIF9leHRlbmRlZFtpIC0gMTZdKSk7CiAgICB9CgogICAgLy8gU2h1ZmZsZSBhcm91bmQgdGhlIGJpdHMuCiAgICB2YXIgYSA9IF9kaWdlc3RbMF07CiAgICB2YXIgYiA9IF9kaWdlc3RbMV07CiAgICB2YXIgYyA9IF9kaWdlc3RbMl07CiAgICB2YXIgZCA9IF9kaWdlc3RbM107CiAgICB2YXIgZSA9IF9kaWdlc3RbNF07CiAgICB2YXIgZiA9IF9kaWdlc3RbNV07CiAgICB2YXIgZyA9IF9kaWdlc3RbNl07CiAgICB2YXIgaCA9IF9kaWdlc3RbN107CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgIHZhciB0ZW1wMSA9IGFkZDMyKGFkZDMyKGgsIF9ic2lnMShlKSksCiAgICAgICAgICBhZGQzMihfY2goZSwgZiwgZyksIGFkZDMyKF9ub2lzZVtpXSwgX2V4dGVuZGVkW2ldKSkpOwogICAgICB2YXIgdGVtcDIgPSBhZGQzMihfYnNpZzAoYSksIF9tYWooYSwgYiwgYykpOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBlID0gYWRkMzIoZCwgdGVtcDEpOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhOwogICAgICBhID0gYWRkMzIodGVtcDEsIHRlbXAyKTsKICAgIH0KCiAgICAvLyBVcGRhdGUgaGFzaCB2YWx1ZXMgYWZ0ZXIgaXRlcmF0aW9uLgogICAgX2RpZ2VzdFswXSA9IGFkZDMyKGEsIF9kaWdlc3RbMF0pOwogICAgX2RpZ2VzdFsxXSA9IGFkZDMyKGIsIF9kaWdlc3RbMV0pOwogICAgX2RpZ2VzdFsyXSA9IGFkZDMyKGMsIF9kaWdlc3RbMl0pOwogICAgX2RpZ2VzdFszXSA9IGFkZDMyKGQsIF9kaWdlc3RbM10pOwogICAgX2RpZ2VzdFs0XSA9IGFkZDMyKGUsIF9kaWdlc3RbNF0pOwogICAgX2RpZ2VzdFs1XSA9IGFkZDMyKGYsIF9kaWdlc3RbNV0pOwogICAgX2RpZ2VzdFs2XSA9IGFkZDMyKGcsIF9kaWdlc3RbNl0pOwogICAgX2RpZ2VzdFs3XSA9IGFkZDMyKGgsIF9kaWdlc3RbN10pOwogIH0KfQoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbU2hhMjU2XS4KLy8vCi8vLyBUaGlzIGlzIHNlcGFyYXRlIHNvIHRoYXQgaXQgY2FuIGV4dGVuZCBbSGFzaFNpbmtdIHdpdGhvdXQgbGVha2luZyBhZGRpdGlvbmFsCi8vLyBwdWJsaWMgbWVtYmVycy4KY2xhc3MgX1NoYTI1NlNpbmsgZXh0ZW5kcyBfU2hhMzJCaXRTaW5rIHsKICBAb3ZlcnJpZGUKICBVaW50MzJMaXN0IGdldCBkaWdlc3QgPT4gX2RpZ2VzdDsKCiAgLy8gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgaGFzaCBwYXJ0cy4gRmlyc3QgMzIgYml0cyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0cwogIC8vIG9mIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlIGZpcnN0IDggcHJpbWUgbnVtYmVycy4KICBfU2hhMjU2U2luayhTaW5rPERpZ2VzdD4gc2luaykKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgc2luaywKICAgICAgICAgICAgVWludDMyTGlzdC5mcm9tTGlzdChbCiAgICAgICAgICAgICAgMHg2YTA5ZTY2NywKICAgICAgICAgICAgICAweGJiNjdhZTg1LAogICAgICAgICAgICAgIDB4M2M2ZWYzNzIsCiAgICAgICAgICAgICAgMHhhNTRmZjUzYSwKICAgICAgICAgICAgICAweDUxMGU1MjdmLAogICAgICAgICAgICAgIDB4OWIwNTY4OGMsCiAgICAgICAgICAgICAgMHgxZjgzZDlhYiwKICAgICAgICAgICAgICAweDViZTBjZDE5LAogICAgICAgICAgICBdKSk7Cn0KCi8vLyBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW1NoYTIyNF0uCi8vLwovLy8gVGhpcyBpcyBzZXBhcmF0ZSBzbyB0aGF0IGl0IGNhbiBleHRlbmQgW0hhc2hTaW5rXSB3aXRob3V0IGxlYWtpbmcgYWRkaXRpb25hbAovLy8gcHVibGljIG1lbWJlcnMuCmNsYXNzIF9TaGEyMjRTaW5rIGV4dGVuZHMgX1NoYTMyQml0U2luayB7CiAgQG92ZXJyaWRlCiAgVWludDMyTGlzdCBnZXQgZGlnZXN0ID0+IF9kaWdlc3QuYnVmZmVyLmFzVWludDMyTGlzdCgwLCA3KTsKCiAgX1NoYTIyNFNpbmsoU2luazxEaWdlc3Q+IHNpbmspCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHNpbmssCiAgICAgICAgICAgIFVpbnQzMkxpc3QuZnJvbUxpc3QoWwogICAgICAgICAgICAgIDB4YzEwNTllZDgsCiAgICAgICAgICAgICAgMHgzNjdjZDUwNywKICAgICAgICAgICAgICAweDMwNzBkZDE3LAogICAgICAgICAgICAgIDB4ZjcwZTU5MzksCiAgICAgICAgICAgICAgMHhmZmMwMGIzMSwKICAgICAgICAgICAgICAweDY4NTgxNTExLAogICAgICAgICAgICAgIDB4NjRmOThmYTcsCiAgICAgICAgICAgICAgMHhiZWZhNGZhNCwKICAgICAgICAgICAgXSkpOwp9CoDHAE5OPAEXGgEWFBkVAR0EUQQuGwEdBFEELhsBOwQuBE8SHAwrAQ4BJgEMQjICATsELgRPEhwMKwEOASYBDEIyAgFKG01KSkpKSkpKSkoxAwEwHAFHBk4vJAFEATwpAUZBQEhIQkQBDCYgASEjHwYkTkAGASAYGBgYGBgYGAEjLUAzDQ0NGw0NDR8GASsnJycnJycnJwQCAS0EURQqDCQBTDchDxIiGhoaGhoaGhoRAgEtBFEUKgw+ASEPEiIaGhoaGhoaGhECAR5wYWNrYWdlOmNyeXB0by9zcmMvc2hhMjU2LmRhcnROZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NyeXB0by9saWIvc3JjL3NoYTUxMi5kYXJ0hrUvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnaGFzaC5kYXJ0JzsKLy8gaWdub3JlOiB1cmlfZG9lc19ub3RfZXhpc3QKaW1wb3J0ICdzaGE1MTJfZmFzdHNpbmtzLmRhcnQnIGlmIChkYXJ0LmxpYnJhcnkuanMpICdzaGE1MTJfc2xvd3NpbmtzLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKLy8vIEFuIGluc3RhbmNlIG9mIFtTaGEyU2hhMzg0XS4KLy8vCi8vLyBUaGlzIGluc3RhbmNlIHByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBbU2hhMzg0XVtyZmNdIGhhc2ggZnVuY3Rpb24uCi8vLwovLy8gW3JmY106IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyMzQKZmluYWwgc2hhMzg0ID0gU2hhMzg0Ll8oKTsKCi8vLyBBbiBpbnN0YW5jZSBvZiBbU2hhMlNoYTUxMl0uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgW1NoYTUxMl1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM0CmZpbmFsIHNoYTUxMiA9IFNoYTUxMi5fKCk7CgovLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtTSEEtMzg0XVtyZmNdIGhhc2ggZnVuY3Rpb24uCi8vLwovLy8gW3JmY106IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyMzQKLy8vCi8vLyBOb3RlIHRoYXQgaXQncyBhbG1vc3QgYWx3YXlzIGVhc2llciB0byB1c2UgW3NoYTM4NF0gcmF0aGVyIHRoYW4gY3JlYXRpbmcgYQovLy8gbmV3IGluc3RhbmNlLgpjbGFzcyBTaGEzODQgZXh0ZW5kcyBIYXNoIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgYmxvY2tTaXplID0gMzIgKiBieXRlc1BlcldvcmQ7CgogIFNoYTM4NC5fKCk7CgogIFNoYTM4NCBuZXdJbnN0YW5jZSgpID0+IFNoYTM4NC5fKCk7CgogIEBvdmVycmlkZQogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8RGlnZXN0PiBzaW5rKSA9PgogICAgICBCeXRlQ29udmVyc2lvblNpbmsuZnJvbShTaGEzODRTaW5rKHNpbmspKTsKfQoKLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbU0hBLTUxMl1bcmZjXSBoYXNoIGZ1bmN0aW9uLgovLy8KLy8vIFtyZmNdOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjM0Ci8vLwovLy8gTm90ZSB0aGF0IGl0J3MgYWxtb3N0IGFsd2F5cyBlYXNpZXIgdG8gdXNlIFtzaGE1MTJdIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEKLy8vIG5ldyBpbnN0YW5jZS4KY2xhc3MgU2hhNTEyIGV4dGVuZHMgU2hhMzg0IHsKICBTaGE1MTIuXygpIDogc3VwZXIuXygpOwoKICBTaGE1MTIgbmV3SW5zdGFuY2UoKSA9PiBTaGE1MTIuXygpOwoKICBAb3ZlcnJpZGUKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPERpZ2VzdD4gc2luaykgPT4KICAgICAgQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oU2hhNTEyU2luayhzaW5rKSk7Cn0KPgBOTjwBFwEWFB5NFQEhBFEELhsBIQRRBC4bATsELgRPEhwMKwEOASYBDEIxAgE7BC4ETxIeGgEmAQxCMQIBHnBhY2thZ2U6Y3J5cHRvL3NyYy9zaGE1MTIuZGFydGFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9idWlsZF9pbnRlZ3JhdGlvbi9saWIvZmlsZV9zeXN0ZW0vbXVsdGlfcm9vdC5kYXJ0jZcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9idWlsZF9pbnRlZ3JhdGlvbi5kYXJ0JzsKCi8vLyBXcmFwcyBhIGZpbGUgc3lzdGVtIHRvIGNyZWF0ZSBhbiBvdmVybGF5IG9mIGZpbGVzIGZyb20gbXVsdGlwbGUgcm9vdHMuCi8vLwovLy8gUmVndWxhciBgZmlsZTpgIFVSSXMgYXJlIHJlc29sdmVkIGRpcmVjdGx5IGluIHRoZSB1bmRlcmx5aW5nIGZpbGUgc3lzdGVtLAovLy8gYnV0IFVSSXMgdGhhdCB1c2UgYSBzcGVjaWFsIFttYXJrZXJTY2hlbWVdIGFyZSByZXNvbHZlZCBieSBzZWFyY2hpbmcKLy8vIHVuZGVyIGEgc2V0IG9mIGdpdmVuIHJvb3RzIGluIG9yZGVyLgovLy8KLy8vIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGlucHV0czoKLy8vCi8vLyAgIC0gbWFya2VyU2NoZW1lIGlzIGBtdWx0aS1yb290YAovLy8gICAtIHRoZSBzZXQgb2Ygcm9vdHMgYXJlIGBmaWxlOi8vL2EvYCBhbmQgYGZpbGU6Ly8vYi9gCi8vLyAgIC0gdGhlIHVuZGVybHlpbmcgZmlsZSBzeXN0ZW0gY29udGFpbnMgZmlsZXM6Ci8vLyAgICAgICAgIGEvYy9hMS5kYXJ0Ci8vLyAgICAgICAgIGEvYy9hMi5kYXJ0Ci8vLyAgICAgICAgIGIvYy9iMS5kYXJ0Ci8vLyAgICAgICAgIGIvYy9hMi5kYXJ0Ci8vLyAgICAgICAgIGMvYzEuZGFydAovLy8KLy8vIFRoZW46Ci8vLwovLy8gICAtIGZpbGU6Ly8vYy9jMS5kYXJ0IGlzIHJlc29sdmVkIGFzIGZpbGU6Ly8vYy9jMS5kYXJ0Ci8vLyAgIC0gbXVsdGktcm9vdDovLy9jL2ExLmRhcnQgaXMgcmVzb2x2ZWQgYXMgZmlsZTovLy9hL2MvYTEuZGFydAovLy8gICAtIG11bHRpLXJvb3Q6Ly8vYy9iMS5kYXJ0IGlzIHJlc29sdmVkIGFzIGZpbGU6Ly8vYi9jL2IxLmRhcnQKLy8vICAgLSBtdWx0aS1yb290Oi8vL2MvYTIuZGFydCBpcyByZXNvbHZlZCBhcyBmaWxlOi8vL2EvYy9iMi5kYXJ0CmNsYXNzIE11bHRpUm9vdEZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtIHsKICBmaW5hbCBTdHJpbmcgbWFya2VyU2NoZW1lOwogIGZpbmFsIExpc3Q8VXJpPiByb290czsKICBmaW5hbCBGaWxlU3lzdGVtIG9yaWdpbmFsOwoKICBNdWx0aVJvb3RGaWxlU3lzdGVtKHRoaXMubWFya2VyU2NoZW1lLCBMaXN0IHJvb3RzLCB0aGlzLm9yaWdpbmFsKQogICAgICA6IHJvb3RzID0gcm9vdHMubWFwKF9ub3JtYWxpemUpLnRvTGlzdCgpOwoKICBAb3ZlcnJpZGUKICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSA9PgogICAgICBuZXcgTXVsdGlSb290RmlsZVN5c3RlbUVudGl0eSh0aGlzLCB1cmkpOwp9CgovLy8gRW50aXR5IHRoYXQgc2VhcmNoZXMgdGhlIG11bHRpcGxlIHJvb3RzIGFuZCByZXNvbHZlIGEsIHBvc3NpYmx5IG11bHRpLXJvb3QsCi8vLyBlbnRpdHkgdG8gYSBwbGFpbiBlbnRpdHkgdW5kZXIgYG11bHRpUm9vdEZpbGVTeXN0ZW0ub3JpZ2luYWxgLgpjbGFzcyBNdWx0aVJvb3RGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgZmluYWwgTXVsdGlSb290RmlsZVN5c3RlbSBtdWx0aVJvb3RGaWxlU3lzdGVtOwogIGZpbmFsIFVyaSB1cmk7CiAgRmlsZVN5c3RlbUVudGl0eSBfZGVsZWdhdGU7CiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+IGdldCBkZWxlZ2F0ZSBhc3luYyA9PgogICAgICBfZGVsZWdhdGUgPz89IGF3YWl0IF9yZXNvbHZlRW50aXR5KCk7CgogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PiBfcmVzb2x2ZUVudGl0eSgpIGFzeW5jIHsKICAgIGlmICh1cmkuc2NoZW1lID09IG11bHRpUm9vdEZpbGVTeXN0ZW0ubWFya2VyU2NoZW1lKSB7CiAgICAgIGlmICghdXJpLmlzQWJzb2x1dGUpIHsKICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICAgdXJpLCAiVGhpcyBNdWx0aVJvb3RGaWxlU3lzdGVtIG9ubHkgaGFuZGxlcyBhYnNvbHV0ZXMgVVJJczogJHVyaSIpOwogICAgICB9CiAgICAgIHZhciBvcmlnaW5hbCA9IG11bHRpUm9vdEZpbGVTeXN0ZW0ub3JpZ2luYWw7CiAgICAgIGFzc2VydCh1cmkucGF0aC5zdGFydHNXaXRoKCcvJykpOwogICAgICB2YXIgcGF0aCA9IHVyaS5wYXRoLnN1YnN0cmluZygxKTsKICAgICAgZm9yICh2YXIgcm9vdCBpbiBtdWx0aVJvb3RGaWxlU3lzdGVtLnJvb3RzKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IG9yaWdpbmFsLmVudGl0eUZvclVyaShyb290LnJlc29sdmUocGF0aCkpOwogICAgICAgIGlmIChhd2FpdCBjYW5kaWRhdGUuZXhpc3RzKCkpIHJldHVybiBjYW5kaWRhdGU7CiAgICAgIH0KICAgICAgcmV0dXJuIE1pc3NpbmdGaWxlU3lzdGVtRW50aXR5KHVyaSk7CiAgICB9CiAgICByZXR1cm4gbXVsdGlSb290RmlsZVN5c3RlbS5vcmlnaW5hbC5lbnRpdHlGb3JVcmkodXJpKTsKICB9CgogIE11bHRpUm9vdEZpbGVTeXN0ZW1FbnRpdHkodGhpcy5tdWx0aVJvb3RGaWxlU3lzdGVtLCB0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSBhc3luYyA9PiAoYXdhaXQgZGVsZWdhdGUpLmV4aXN0cygpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpIGFzeW5jID0+IChhd2FpdCBkZWxlZ2F0ZSkucmVhZEFzQnl0ZXMoKTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCkgYXN5bmMgPT4gKGF3YWl0IGRlbGVnYXRlKS5yZWFkQXNTdHJpbmcoKTsKfQoKY2xhc3MgTWlzc2luZ0ZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBNaXNzaW5nRmlsZVN5c3RlbUVudGl0eSh0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSA9PiBGdXR1cmUudmFsdWUoZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpID0+CiAgICAgIEZ1dHVyZS5lcnJvcihGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0ZpbGUgbm90IGZvdW5kJykpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8U3RyaW5nPiByZWFkQXNTdHJpbmcoKSA9PgogICAgICBGdXR1cmUuZXJyb3IoRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksICdGaWxlIG5vdCBmb3VuZCcpKTsKfQoKVXJpIF9ub3JtYWxpemUocm9vdCkgewogIFVyaSB1cmkgPSByb290OwogIHJldHVybiB1cmkucGF0aC5lbmRzV2l0aCgnLycpID8gdXJpIDogdXJpLnJlcGxhY2UocGF0aDogJyR7dXJpLnBhdGh9LycpOwp9CmsATk48ARUBRAFLBE5JKQQwBCU7MxgYGBgWBAoEO0NDQzIdGR0BRDABDCwwAgFQQz4xER4xLAE0Oh0nUAgzKCg0QzgIKwY7BAFBAQw8AQxLAQxKAgE8DBEBJQEMMAEMJUABDCNAAgEXEksCATVwYWNrYWdlOmJ1aWxkX2ludGVncmF0aW9uL2ZpbGVfc3lzdGVtL211bHRpX3Jvb3QuZGFydFZmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfdW5zdGFibGUvdm0uZGFydIoULy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmV4cG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9kaWFnbm9zdGljX21lc3NhZ2UuZGFydCcKICAgIHNob3cgRGlhZ25vc3RpY01lc3NhZ2UsIERpYWdub3N0aWNNZXNzYWdlSGFuZGxlciwgZ2V0TWVzc2FnZVVyaTsKCmV4cG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2NvbXBpbGVyX29wdGlvbnMuZGFydCcKICAgIHNob3cgQ29tcGlsZXJPcHRpb25zLCBwYXJzZUV4cGVyaW1lbnRhbEFyZ3VtZW50cywgcGFyc2VFeHBlcmltZW50YWxGbGFnczsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydCcKICAgIHNob3cgZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzLCBFeHBlcmltZW50YWxGbGFnOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnQnCiAgICBzaG93IEZpbGVTeXN0ZW0sIEZpbGVTeXN0ZW1FbnRpdHksIEZpbGVTeXN0ZW1FeGNlcHRpb247CgpleHBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZnJvbnRfZW5kLmRhcnQnIHNob3cgQ29tcGlsZXJSZXN1bHQ7CgpleHBvcnQgJy4uL2FwaV9wcm90b3R5cGUvaW5jcmVtZW50YWxfa2VybmVsX2dlbmVyYXRvci5kYXJ0JwogICAgc2hvdyBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvciwgSW5jcmVtZW50YWxTZXJpYWxpemVyLCBpc0xlZ2FsSWRlbnRpZmllcjsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnQnCiAgICBzaG93IGtlcm5lbEZvck1vZHVsZSwga2VybmVsRm9yUHJvZ3JhbTsKCmV4cG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBNZW1vcnlGaWxlU3lzdGVtOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL3N0YW5kYXJkX2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgU3RhbmRhcmRGaWxlU3lzdGVtOwoKZXhwb3J0ICcuLi9hcGlfcHJvdG90eXBlL3Rlcm1pbmFsX2NvbG9yX3N1cHBvcnQuZGFydCcKICAgIHNob3cgcHJpbnREaWFnbm9zdGljTWVzc2FnZTsKCmV4cG9ydCAnLi4vYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgpleHBvcnQgJy4uL2NvbXB1dGVfcGxhdGZvcm1fYmluYXJpZXNfbG9jYXRpb24uZGFydCcKICAgIHNob3cgY29tcHV0ZVBsYXRmb3JtQmluYXJpZXNMb2NhdGlvbjsKCmV4cG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmV4cG9ydCAnLi4vZmFzdGEvZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkVG9vTWFueUFyZ3VtZW50cywKICAgICAgICBtZXNzYWdlRmZpRXhjZXB0aW9uYWxSZXR1cm5OdWxsLAogICAgICAgIG1lc3NhZ2VGZmlFeHBlY3RlZENvbnN0YW50LAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlRmZpRGFydFR5cGVNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZUZmaUV4cGVjdGVkRXhjZXB0aW9uYWxSZXR1cm4sCiAgICAgICAgdGVtcGxhdGVGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm4sCiAgICAgICAgdGVtcGxhdGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MsCiAgICAgICAgdGVtcGxhdGVGZmlGaWVsZEFubm90YXRpb24sCiAgICAgICAgdGVtcGxhdGVGZmlGaWVsZEluaXRpYWxpemVyLAogICAgICAgIHRlbXBsYXRlRmZpRmllbGROb0Fubm90YXRpb24sCiAgICAgICAgdGVtcGxhdGVGZmlOb3RTdGF0aWMsCiAgICAgICAgdGVtcGxhdGVGZmlTdHJ1Y3RHZW5lcmljLAogICAgICAgIHRlbXBsYXRlRmZpVHlwZUludmFsaWQsCiAgICAgICAgdGVtcGxhdGVGZmlUeXBlTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVJbGxlZ2FsUmVjdXJzaXZlVHlwZTsKCmV4cG9ydCAnLi4vZmFzdGEvaHlicmlkX2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgSHlicmlkRmlsZVN5c3RlbTsKCmV4cG9ydCAnLi4vZmFzdGEva2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JwogICAgc2hvdyBpc1JlZGlyZWN0aW5nRmFjdG9yeUZpZWxkOwoKZXhwb3J0ICcuLi9mYXN0YS9rZXJuZWwvdXRpbHMuZGFydCcKICAgIHNob3cKICAgICAgICBjcmVhdGVFeHByZXNzaW9uRXZhbHVhdGlvbkNvbXBvbmVudCwKICAgICAgICBzZXJpYWxpemVDb21wb25lbnQsCiAgICAgICAgc2VyaWFsaXplUHJvY2VkdXJlOwoKZXhwb3J0ICcuLi9mYXN0YS9yZXNvbHZlX2lucHV0X3VyaS5kYXJ0JyBzaG93IHJlc29sdmVJbnB1dFVyaTsKSgBOTjwBSkUBTwEwTgEyNQErPAE+ATxPATAsAUkBTQE2IQE/ATQqAT4BIwkYNikkEiUuMDMkJSYeIiAhJgFBATckASQJLRwcAT8BKnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvdm0uZGFydE9maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL2NsYXNzX2hpZXJhcmNoeS5kYXJ0wADp5C8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmNsYXNzX2hpZXJhcmNoeTsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKaW1wb3J0ICdkYXJ0Om1hdGgnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9ubmJkX3RvcF9tZXJnZS5kYXJ0JzsKCmltcG9ydCAnYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAnY29yZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICd0eXBlX2FsZ2VicmEuZGFydCc7CmltcG9ydCAnc3JjL2Z1dHVyZV9vci5kYXJ0JzsKaW1wb3J0ICdzcmMvaGVhcC5kYXJ0JzsKaW1wb3J0ICdzcmMvbGVnYWN5X2VyYXN1cmUuZGFydCc7CmltcG9ydCAnc3JjL25vcm0uZGFydCc7Cgp0eXBlZGVmIEhhbmRsZUFtYmlndW91c1N1cGVydHlwZXMgPSB2b2lkIEZ1bmN0aW9uKENsYXNzLCBTdXBlcnR5cGUsIFN1cGVydHlwZSk7CgphYnN0cmFjdCBjbGFzcyBNaXhpbkluZmVycmVyIHsKICB2b2lkIGluZmVyKENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgQ2xhc3MgY2xhc3NOb2RlKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgYW5zd2VyaW5nIHZhcmlvdXMgc3ViY2xhc3NpbmcgcXVlcmllcy4KYWJzdHJhY3QgY2xhc3MgQ2xhc3NIaWVyYXJjaHkgewogIGZhY3RvcnkgQ2xhc3NIaWVyYXJjaHkoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAge0hhbmRsZUFtYmlndW91c1N1cGVydHlwZXMgb25BbWJpZ3VvdXNTdXBlcnR5cGVzLAogICAgICBNaXhpbkluZmVycmVyIG1peGluSW5mZXJyZXJ9KSB7CiAgICBvbkFtYmlndW91c1N1cGVydHlwZXMgPz89IChDbGFzcyBjbHMsIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikgewogICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMyMDkxCiAgICAgIHRocm93ICIkY2xzIGNhbid0IGltcGxlbWVudCBib3RoICRhIGFuZCAkYiI7CiAgICB9OwogICAgcmV0dXJuIG5ldyBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5Ll9pbnRlcm5hbCgKICAgICAgICBjb3JlVHlwZXMsIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcywgbWl4aW5JbmZlcnJlcikKICAgICAgLi5faW5pdGlhbGl6ZShjb21wb25lbnQubGlicmFyaWVzKTsKICB9CgogIHZvaWQgc2V0IGNvcmVUeXBlcyhDb3JlVHlwZXMgY29yZVR5cGVzKTsKCiAgdm9pZCBzZXQgb25BbWJpZ3VvdXNTdXBlcnR5cGVzKAogICAgICBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CgogIHZvaWQgc2V0IG1peGluSW5mZXJyZXIoTWl4aW5JbmZlcnJlciBtaXhpbkluZmVycmVyKTsKCiAgLy8vIEdpdmVuIHRoZSBbdW5vcmRlcmVkXSBjbGFzc2VzLCByZXR1cm4gdGhlbSBpbiBzdWNoIG9yZGVyIHRoYXQgY2xhc3NlcwogIC8vLyBvY2N1ciBhZnRlciB0aGVpciBzdXBlcmNsYXNzZXMuICBJZiBzb21lIHN1cGVyY2xhc3NlcyBhcmUgbm90IGluCiAgLy8vIFt1bm9yZGVyZWRdLCB0aGV5IGFyZSBub3QgaW5jbHVkZWQuCiAgSXRlcmFibGU8Q2xhc3M+IGdldE9yZGVyZWRDbGFzc2VzKEl0ZXJhYmxlPENsYXNzPiB1bm9yZGVyZWQpOwoKICAvLyBSZXR1cm5zIHRoZSBpbnN0YW50aWF0aW9uIG9mIGVhY2ggZ2VuZXJpYyBzdXBlcnR5cGUgaW1wbGVtZW50ZWQgYnkgdGhpcwogIC8vIGNsYXNzIChlLmcuIGdldENsYXNzQXNJbnN0YW5jZU9mIGFwcGxpZWQgdG8gYWxsIHN1cGVyY2xhc3NlcyBhbmQKICAvLyBpbnRlcmZhY2VzKS4KICBMaXN0PFN1cGVydHlwZT4gZ2VuZXJpY1N1cGVydHlwZXNPZihDbGFzcyBjbGFzc18pOwoKICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIGludGVyZmFjZSB0eXBlcywgYXMgZGVmaW5lZCBieSBEYXJ0CiAgLy8vIDEuMC4KICAvLy8KICAvLy8gR2l2ZW4gdHdvIGludGVyZmFjZXMgSSBhbmQgSiwgbGV0IFNfSSBiZSB0aGUgc2V0IG9mIHN1cGVyaW50ZXJmYWNlcyBvZiBJLAogIC8vLyBsZXQgU19KIGJlIHRoZSBzZXQgb2Ygc3VwZXJpbnRlcmZhY2VzIG9mIEosIGFuZCBsZXQKICAvLy8gUyA9IChJIHVuaW9uIFNfSSkgaW50ZXJzZWN0IChKIHVuaW9uIFNfSikuICBGdXJ0aGVybW9yZSwgd2UgZGVmaW5lCiAgLy8vIFNfbiA9IHtUIHwgVCBpbiBTIGFuZCBkZXB0aChUKSA9IG59IGZvciBhbnkgZmluaXRlIG4gd2hlcmUgZGVwdGgoVCkgaXMKICAvLy8gdGhlIG51bWJlciBvZiBzdGVwcyBpbiB0aGUgbG9uZ2VzdCBpbmhlcml0YW5jZSBwYXRoIGZyb20gVCB0byBPYmplY3QuICBMZXQKICAvLy8gcSBiZSB0aGUgbGFyZ2VzdCBudW1iZXIgc3VjaCB0aGF0IFNfcSBoYXMgY2FyZGluYWxpdHkgb25lLiAgVGhlIGxlYXN0CiAgLy8vIHVwcGVyIGJvdW5kIG9mIEkgYW5kIEogaXMgdGhlIHNvbGUgZWxlbWVudCBvZiBTX3EuCiAgLy8vCiAgLy8vIFRoaXMgaXMgY2FsbGVkIHRoZSAibGVnYWN5IiBsZWFzdCB1cHBlciBib3VuZCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZQogIC8vLyBEYXJ0IDIgbGVhc3QgdXBwZXIgYm91bmQsIHdoaWNoIGhhcyBzcGVjaWFsIGJlaGF2aW9ycyBpbiB0aGUgY2FzZSB3aGVyZQogIC8vLyBvbmUgdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIG90aGVyLCBvciB3aGVyZSBib3RoIHR5cGVzIGFyZSBiYXNlZCBvbiB0aGUKICAvLy8gc2FtZSBjbGFzcy4KICBJbnRlcmZhY2VUeXBlIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZChJbnRlcmZhY2VUeXBlIHR5cGUxLAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnksIENvcmVUeXBlcyBjb3JlVHlwZXMpOwoKICAvLy8gUmV0dXJucyB0aGUgaW5zdGFudGlhdGlvbiBvZiBbc3VwZXJjbGFzc10gdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBbY2xhc3NfXSwKICAvLy8gb3IgYG51bGxgIGlmIFtjbGFzc19dIGRvZXMgbm90IGltcGxlbWVudCBbc3VwZXJjbGFzc10gYXQgYWxsLgogIFN1cGVydHlwZSBnZXRDbGFzc0FzSW5zdGFuY2VPZihDbGFzcyBjbGFzc18sIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gUmV0dXJucyB0aGUgaW5zdGFudGlhdGlvbiBvZiBbc3VwZXJjbGFzc10gdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBbdHlwZV0sCiAgLy8vIG9yIGBudWxsYCBpZiBbdHlwZV0gZG9lcyBub3QgaW1wbGVtZW50IFtzdXBlcmNsYXNzXSBhdCBhbGwuCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcywKICAgICAgTGlicmFyeSBjbGllbnRMaWJyYXJ5LCBDb3JlVHlwZXMgY29yZVR5cGVzKTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBpbnN0YW50aWF0aW9uIG9mIFtzdXBlcmNsYXNzXSB0aGF0IGlzCiAgLy8vIGltcGxlbWVudGVkIGJ5IFt0eXBlXSwgb3IgYG51bGxgIGlmIFt0eXBlXSBkb2VzIG5vdCBpbXBsZW1lbnQgW3N1cGVyY2xhc3NdCiAgLy8vIGF0IGFsbC4KICBMaXN0PERhcnRUeXBlPiBnZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gUmV0dXJucyB0aGUgaW5zdGFudGlhdGlvbiBvZiBbc3VwZXJjbGFzc10gdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBbdHlwZV0sCiAgLy8vIG9yIGBudWxsYCBpZiBbdHlwZV0gZG9lcyBub3QgaW1wbGVtZW50IFtzdXBlcmNsYXNzXS4gIFtzdXBlcmNsYXNzXSBtdXN0CiAgLy8vIGJlIGEgZ2VuZXJpYyBjbGFzcy4KICBTdXBlcnR5cGUgYXNJbnN0YW50aWF0aW9uT2YoU3VwZXJ0eXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gUmV0dXJucyB0aGUgaW5zdGFuY2UgbWVtYmVyIHRoYXQgd291bGQgcmVzcG9uZCB0byBhIGR5bmFtaWMgZGlzcGF0Y2ggb2YKICAvLy8gW25hbWVdIHRvIGFuIGluc3RhbmNlIG9mIFtjbGFzc19dLCBvciBgbnVsbGAgaWYgbm8gc3VjaCBtZW1iZXIgZXhpc3RzLgogIC8vLwogIC8vLyBJZiBbc2V0dGVyXSBpcyBgZmFsc2VgLCB0aGUgbmFtZSBpcyBkaXNwYXRjaGVkIGFzIGEgZ2V0dGVyIG9yIGNhbGwsCiAgLy8vIGFuZCB3aWxsIHJldHVybiBhIGZpZWxkLCBnZXR0ZXIsIG1ldGhvZCwgb3Igb3BlcmF0b3IgKG9yIG51bGwpLgogIC8vLwogIC8vLyBJZiBbc2V0dGVyXSBpcyBgdHJ1ZWAsIHRoZSBuYW1lIGlzIGRpc3BhdGNoZWQgYXMgYSBzZXR0ZXIsIHJvdWdobHkKICAvLy8gY29ycmVzcG9uZGluZyB0byBgbmFtZT1gIGluIHRoZSBEYXJ0IHNwZWNpZmljYXRpb24sIGJ1dCBub3RlIHRoYXQgdGhlCiAgLy8vIHJldHVybmVkIG1lbWJlciB3aWxsIG5vdCBoYXZlIGEgbmFtZSBlbmRpbmcgd2l0aCBgPWAuICBJbiB0aGlzIGNhc2UsCiAgLy8vIGEgbm9uLWZpbmFsIGZpZWxkIG9yIHNldHRlciAob3IgbnVsbCkgd2lsbCBiZSByZXR1cm5lZC4KICAvLy8KICAvLy8gSWYgdGhlIGNsYXNzIGlzIGFic3RyYWN0LCBhYnN0cmFjdCBtZW1iZXJzIGFyZSBpZ25vcmVkIGFuZCB0aGUgZGlzcGF0Y2gKICAvLy8gaXMgcmVzb2x2ZWQgaWYgdGhlIGNsYXNzIHdhcyBub3QgYWJzdHJhY3QuCiAgTWVtYmVyIGdldERpc3BhdGNoVGFyZ2V0KENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHBvdGVudGlhbCB0YXJnZXRzIG9mIGR5bmFtaWMgZGlzcGF0Y2ggdG8gYW4gaW5zdGFuY2UKICAvLy8gb2YgW2NsYXNzX10uCiAgLy8vCiAgLy8vIElmIFtzZXR0ZXJzXSBpcyBgZmFsc2VgLCBvbmx5IHBvdGVudGlhbCB0YXJnZXRzIG9mIGEgZ2V0dGVyIG9yIGNhbGwKICAvLy8gZGlzcGF0Y2ggYXJlIHJldHVybmVkLiAgSWYgW3NldHRlcnNdIGlzIGB0cnVlYCwgb25seSBwb3RlbnRpYWwgdGFyZ2V0cwogIC8vLyBvZiBhIHNldHRlciBkaXNwYXRjaCBhcmUgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIFNlZSBbZ2V0RGlzcGF0Y2hUYXJnZXRdIGZvciBtb3JlIGRldGFpbHMuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCiAgTGlzdDxNZW1iZXI+IGdldERpc3BhdGNoVGFyZ2V0cyhDbGFzcyBjbGFzc18sIHtib29sIHNldHRlcnM6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm5zIHRoZSBwb3NzaWJseSBhYnN0cmFjdCBpbnRlcmZhY2UgbWVtYmVyIG9mIFtjbGFzc19dIHdpdGggdGhlIGdpdmVuCiAgLy8vIFtuYW1lXS4KICAvLy8KICAvLy8gSWYgW3NldHRlcl0gaXMgYGZhbHNlYCwgb25seSBmaWVsZHMsIG1ldGhvZHMsIGFuZCBnZXR0ZXJzIHdpdGggdGhhdCBuYW1lCiAgLy8vIHdpbGwgYmUgZm91bmQuICBJZiBbc2V0dGVyXSBpcyBgdHJ1ZWAsIG9ubHkgbm9uLWZpbmFsIGZpZWxkcyBhbmQgc2V0dGVycwogIC8vLyB3aWxsIGJlIGZvdW5kLgogIC8vLwogIC8vLyBJZiBtdWx0aXBsZSBtZW1iZXJzIHdpdGggdGhhdCBuYW1lIGFyZSBpbmhlcml0ZWQgYW5kIG5vdCBvdmVycmlkZGVuLCB0aGUKICAvLy8gbWVtYmVyIGZyb20gdGhlIGZpcnN0IGRlY2xhcmVkIHN1cGVydHlwZSBpcyByZXR1cm5lZC4KICBNZW1iZXIgZ2V0SW50ZXJmYWNlTWVtYmVyKENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIG1lbWJlcnMgZGVub3RpbmcgdGhlIGludGVyZmFjZSBmb3IgW2NsYXNzX10sIHdoaWNoCiAgLy8vIG1heSBpbmNsdWRlIGFic3RyYWN0IG1lbWJlcnMuCiAgLy8vCiAgLy8vIFRoZSBsaXN0IG1heSBjb250YWluIG11bHRpcGxlIG1lbWJlcnMgd2l0aCBhIGdpdmVuIG5hbWUuICBUaGlzIGhhcHBlbnMKICAvLy8gd2hlbiBtZW1iZXJzIGFyZSBpbmhlcml0ZWQgdGhyb3VnaCBkaWZmZXJlbnQgc3VwZXJ0eXBlcyBhbmQgbm90IG92ZXJyaWRkZW4KICAvLy8gaW4gdGhlIGNsYXNzLgogIC8vLwogIC8vLyBBbHNvIHNlZSBbZ2V0SW50ZXJmYWNlTWVtYmVyXS4KICBMaXN0PE1lbWJlcj4gZ2V0SW50ZXJmYWNlTWVtYmVycyhDbGFzcyBjbGFzc18sIHtib29sIHNldHRlcnM6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIG1lbWJlcnMgZGVjbGFyZWQgaW4gW2NsYXNzX10sIGluY2x1ZGluZyBhYnN0cmFjdAogIC8vLyBtZW1iZXJzLgogIC8vLwogIC8vLyBNZW1iZXJzIGFyZSBzb3J0ZWQgYnkgbmFtZSBzbyB0aGF0IHRoZXkgbWF5IGJlIGVmZmljaWVudGx5IGNvbXBhcmVkIGFjcm9zcwogIC8vLyBjbGFzc2VzLgogIExpc3Q8TWVtYmVyPiBnZXREZWNsYXJlZE1lbWJlcnMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pOwoKICAvLy8gVHJ1ZSBpZiBbc3ViY2xhc3NdIGluaGVyaXRzIGZyb20gW3N1cGVyY2xhc3NdIHRob3VnaCB6ZXJvIG9yIG1vcmUKICAvLy8gYGV4dGVuZHNgIHJlbGF0aW9uc2hpcHMuCiAgYm9vbCBpc1N1YmNsYXNzT2YoQ2xhc3Mgc3ViY2xhc3MsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gVHJ1ZSBpZiBbc3VidHlwZV0gaW5oZXJpdHMgZnJvbSBbc3VwZXJjbGFzc10gdGhvdWdoIHplcm8gb3IgbW9yZQogIC8vLyBgZXh0ZW5kc2AsIGB3aXRoYCwgYW5kIGBpbXBsZW1lbnRzYCByZWxhdGlvbnNoaXBzLgogIGJvb2wgaXNTdWJ0eXBlT2YoQ2xhc3Mgc3VidHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIC8vLyBUcnVlIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyB1c2VkIGFzIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgdG8gYQogIC8vLyBtaXhpbiBhcHBsaWNhdGlvbiAoaS5lLiBbQ2xhc3MubWl4ZWRJblR5cGVdKS4KICBib29sIGlzVXNlZEFzTWl4aW4oQ2xhc3MgY2xhc3NfKTsKCiAgLy8vIEludm9rZXMgW2NhbGxiYWNrXSBmb3IgZXZlcnkgbWVtYmVyIGRlY2xhcmVkIGluIG9yIGluaGVyaXRlZCBieSBbY2xhc3NfXQogIC8vLyB0aGF0IG92ZXJyaWRlcyBvciBpbXBsZW1lbnRzIGEgbWVtYmVyIGluIGEgc3VwZXJ0eXBlIG9mIFtjbGFzc19dCiAgLy8vIChvciBpbiByYXJlIGNhc2VzLCBvdmVycmlkZXMgYSBtZW1iZXIgZGVjbGFyZWQgaW4gW2NsYXNzX10pLgogIC8vLwogIC8vLyBXZSB1c2UgdGhlIHRlcm0gImluaGVyaXRhYmxlIiBmb3IgbWVtYmVycyB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvcgogIC8vLyBpbmhlcml0YW5jZSBidXQgbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLiAgVGhlICJkZWNsYXJlZCIgbWVtYmVycyBvZiBhCiAgLy8vIG1peGluIGFwcGxpY2F0aW9uIGFyZSB0aG9zZSBkZWNsYXJlZCBpbiB0aGUgbWl4ZWQtaW4gdHlwZS4gVGhlIGNhbGxiYWNrIGlzCiAgLy8vIGludm9rZWQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKICAvLy8KICAvLy8gMS4gQSBtZW1iZXIgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIG92ZXJyaWRlcyBhIG1lbWJlciBpbmhlcml0YWJsZSB0aHJvdWdoCiAgLy8vIG9uZSBvZiB0aGUgc3VwZXJ0eXBlcyBvZiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIDIuIEEgbm9uLWFic3RyYWN0IG1lbWJlciBpcyBpbmhlcml0ZWQgZnJvbSBhIHN1cGVyY2xhc3MsIGFuZCBpbiB0aGUKICAvLy8gY29udGV4dCBvZiB0aGlzIGNsYXNzLCBpdCBvdmVycmlkZXMgYW4gYWJzdHJhY3QgbWVtYmVyIGluaGVyaXRhYmxlIHRocm91Z2gKICAvLy8gb25lIG9mIGl0cyBzdXBlcmludGVyZmFjZXMuCiAgLy8vCiAgLy8vIDMuIEEgbm9uLWFic3RyYWN0IG1lbWJlciBpcyBpbmhlcml0ZWQgZnJvbSBhIHN1cGVyY2xhc3MsIGFuZCBpdCBvdmVycmlkZXMKICAvLy8gYW4gYWJzdHJhY3QgbWVtYmVyIGRlY2xhcmVkIGluIHRoaXMgY2xhc3MuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJlcG9ydCB0aGF0IGEgbWVtYmVyIG92ZXJyaWRlcyBpdHNlbGYuIEEgZ2l2ZW4gcGFpcgogIC8vLyBtYXkgYmUgcmVwb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UgcGF0aHMKICAvLy8gdG8gdGhlIG92ZXJyaWRkZW4gbWVtYmVyLgogIC8vLwogIC8vLyBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIG1ldGhvZHMgdG8gb3ZlcnJpZGUgb25lIGFub3RoZXIgaW4gYm90aCBkaXJlY3Rpb25zLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0IGdldHRlcnMgYW5kIHNldHRlcnMgYXJlIG92ZXJyaWRkZW4gc2VwYXJhdGVseS4gIFRoZSBbaXNTZXR0ZXJdCiAgLy8vIGNhbGxiYWNrIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoaWNoIHR5cGUgb2YgYWNjZXNzIGlzIGJlaW5nIG92ZXJyaWRkZW4uCiAgdm9pZCBmb3JFYWNoT3ZlcnJpZGVQYWlyKENsYXNzIGNsYXNzXywKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSk7CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBjbGllbnQgYWZ0ZXIgYSBjaGFuZ2U6IHJlbW92YWwsIGFkZGl0aW9uLAogIC8vLyBvciBtb2RpZmljYXRpb24gb2YgY2xhc3NlcyAodmlhIGxpYnJhcmllcykuCiAgLy8vCiAgLy8vIEZvciBtb2RpZmllZCBjbGFzc2VzIHNwZWNpZnkgYSBjbGFzcyBhcyBib3RoIHJlbW92ZWQgYW5kIGFkZGVkOiBTb21lIG9mCiAgLy8vIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoaXMgaGllcmFyY2h5IG1pZ2h0IGhhdmUgY2FjaGVkLCBpcyBub3QgdmFsaWQKICAvLy8gYW55bW9yZS4KICAvLy8KICAvLy8gTm90ZSwgdGhhdCBpdCBpcyB0aGUgY2xpZW50cyByZXNwb25zaWJpbGl0eSB0byBtYXJrIGFsbCBzdWJjbGFzc2VzIGFzCiAgLy8vIGNoYW5nZWQgdG9vLgogIENsYXNzSGllcmFyY2h5IGFwcGx5VHJlZUNoYW5nZXMoSXRlcmFibGU8TGlicmFyeT4gcmVtb3ZlZExpYnJhcmllcywKICAgICAgSXRlcmFibGU8TGlicmFyeT4gZW5zdXJlS25vd25MaWJyYXJpZXMsCiAgICAgIHtDb21wb25lbnQgcmVpc3N1ZUFtYmlndW91c1N1cGVydHlwZXNGb3J9KTsKCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIGNsaWVudCBhZnRlciBhIG1lbWJlciBjaGFuZ2Ugb24gY2xhc3NlczoKICAvLy8gU29tZSBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGlzIGhpZXJhcmNoeSBtaWdodCBoYXZlIGNhY2hlZCwKICAvLy8gaXMgbm90IHZhbGlkIGFueW1vcmUuCiAgLy8vIE5vdGUsIHRoYXQgaXQgaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gbWFyayBhbGwgc3ViY2xhc3NlcyBhcwogIC8vLyBjaGFuZ2VkIHRvbywgb3IgLSBpZiBbZmluZERlc2NlbmRhbnRzXSBpcyB0cnVlLCB0aGUgQ2xhc3NIaWVyYXJjaHkgd2lsbAogIC8vLyBzcGVuZCB0aGUgdGltZSB0byBmaW5kIHRoZW0gZm9yIHRoZSBjYWxsZXIuCiAgQ2xhc3NIaWVyYXJjaHkgYXBwbHlNZW1iZXJDaGFuZ2VzKEl0ZXJhYmxlPENsYXNzPiBjbGFzc2VzLAogICAgICB7Ym9vbCBmaW5kRGVzY2VuZGFudHM6IGZhbHNlfSk7CgogIC8vLyBNZXJnZXMgdHdvIHNvcnRlZCBsaXN0cy4KICAvLy8KICAvLy8gSWYgYSBnaXZlbiBtZW1iZXIgb2NjdXJzIGluIGJvdGggbGlzdHMsIHRoZSBtZXJnZSB3aWxsIGF0dGVtcHQgdG8gZXhjbHVkZQogIC8vLyB0aGUgZHVwbGljYXRlIG1lbWJlciwgYnV0IGlzIG5vdCBzdHJpY3RseSBndWFyYW50ZWVkIHRvIGRvIHNvLgogIC8vLwogIC8vLyBUaGUgc29ydCBoYXMgdGhlIGZvbGxvd2luZyBzdGFiaWxpdHkgcHJvcGVydGllczoKICAvLy8KICAvLy8gLSBJZiBib3RoIHggYW5kIHkgY2FtZSBmcm9tIHRoZSBzYW1lIGlucHV0IGxpc3QsIGFuZCB4IHByZWNlZGVkIHkgaW4gdGhlCiAgLy8vICAgaW5wdXQgbGlzdCwgeCB3aWxsIHByZWNlZGUgeSBpbiB0aGUgb3V0cHV0IGxpc3QuICBUaGlzIGhvbGRzIGV2ZW4gaWYgeAogIC8vLyAgIGFuZCB5IGhhdmUgbWF0Y2hpbmcgbmFtZXMuCiAgLy8vCiAgLy8vIC0gSWYgbSBpcyBhIGNvbnRpZ3VvdXMgc3Vic2VxdWVuY2Ugb2YgdGhlIG91dHB1dCBsaXN0IGNvbnRhaW5pbmcgYXQgbGVhc3QKICAvLy8gICBvbmUgZWxlbWVudCBmcm9tIGVhY2ggaW5wdXQgbGlzdCwgYW5kIGFsbCBlbGVtZW50cyBvZiBtIGhhdmUgbWF0Y2hpbmcKICAvLy8gICBuYW1lcywgdGhlbiB0aGUgZWxlbWVudHMgb2YgbSBmcm9tIFtmaXJzdF0gd2lsbCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZgogIC8vLyAgIG0gZnJvbSBbc2Vjb25kXS4KICBzdGF0aWMgTGlzdDxNZW1iZXI+IG1lcmdlU29ydGVkTGlzdHMoCiAgICAgIExpc3Q8TWVtYmVyPiBmaXJzdCwgTGlzdDxNZW1iZXI+IHNlY29uZCkgewogICAgaWYgKGZpcnN0LmlzRW1wdHkpIHJldHVybiBzZWNvbmQ7CiAgICBpZiAoc2Vjb25kLmlzRW1wdHkpIHJldHVybiBmaXJzdDsKICAgIExpc3Q8TWVtYmVyPiByZXN1bHQgPSA8TWVtYmVyPltdLi5sZW5ndGggPSBmaXJzdC5sZW5ndGggKyBzZWNvbmQubGVuZ3RoOwogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIHdoaWxlIChpIDwgZmlyc3QubGVuZ3RoICYmIGogPCBzZWNvbmQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBmaXJzdE1lbWJlciA9IGZpcnN0W2ldOwogICAgICBNZW1iZXIgc2Vjb25kTWVtYmVyID0gc2Vjb25kW2pdOwogICAgICBpbnQgY29tcGFyZSA9IENsYXNzSGllcmFyY2h5LmNvbXBhcmVNZW1iZXJzKGZpcnN0TWVtYmVyLCBzZWNvbmRNZW1iZXIpOwogICAgICBpZiAoY29tcGFyZSA8PSAwKSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBmaXJzdE1lbWJlcjsKICAgICAgICArK2k7CiAgICAgICAgLy8gSWYgdGhlIHNhbWUgbWVtYmVyIG9jY3VycyBpbiBib3RoIGxpc3RzLCBza2lwIHRoZSBkdXBsaWNhdGUuCiAgICAgICAgaWYgKGlkZW50aWNhbChmaXJzdE1lbWJlciwgc2Vjb25kTWVtYmVyKSkgewogICAgICAgICAgKytqOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IHNlY29uZE1lbWJlcjsKICAgICAgICArK2o7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChpIDwgZmlyc3QubGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gZmlyc3RbaSsrXTsKICAgIH0KICAgIHdoaWxlIChqIDwgc2Vjb25kLmxlbmd0aCkgewogICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IHNlY29uZFtqKytdOwogICAgfQogICAgcmVzdWx0Lmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENvbXBhcmVzIG1lbWJlcnMgYnkgbmFtZSwgdXNpbmcgdGhlIHNhbWUgc29ydCBvcmRlciBhcwogIC8vLyBbZ2V0RGVjbGFyZWRNZW1iZXJzXSBhbmQgW2dldEludGVyZmFjZU1lbWJlcnNdLgogIHN0YXRpYyBpbnQgY29tcGFyZU1lbWJlcnMoTWVtYmVyIGZpcnN0LCBNZW1iZXIgc2Vjb25kKSB7CiAgICBpZiAoZmlyc3QgPT0gc2Vjb25kKSByZXR1cm4gMDsKICAgIHJldHVybiBjb21wYXJlTmFtZXMoZmlyc3QubmFtZSwgc2Vjb25kLm5hbWUpOwogIH0KCiAgLy8vIENvbXBhcmVzIG5hbWVzLCB1c2luZyB0aGUgc2FtZSBzb3J0IG9yZGVyIGFzIFtnZXREZWNsYXJlZE1lbWJlcnNdIGFuZAogIC8vLyBbZ2V0SW50ZXJmYWNlTWVtYmVyc10uCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGFzLWZhc3QtYXMtcG9zc2libGUgc29ydGluZyBjcml0ZXJpb24uCiAgc3RhdGljIGludCBjb21wYXJlTmFtZXMoTmFtZSBmaXJzdE5hbWUsIE5hbWUgc2Vjb25kTmFtZSkgewogICAgaW50IGZpcnN0SGFzaCA9IGZpcnN0TmFtZS5oYXNoQ29kZTsKICAgIGludCBzZWNvbmRIYXNoID0gc2Vjb25kTmFtZS5oYXNoQ29kZTsKICAgIGlmIChmaXJzdEhhc2ggIT0gc2Vjb25kSGFzaCkgcmV0dXJuIGZpcnN0SGFzaCAtIHNlY29uZEhhc2g7CiAgICBTdHJpbmcgZmlyc3RTdHJpbmcgPSBmaXJzdE5hbWUubmFtZTsKICAgIFN0cmluZyBzZWNvbmRTdHJpbmcgPSBzZWNvbmROYW1lLm5hbWU7CiAgICBpbnQgZmlyc3RMZW5ndGggPSBmaXJzdFN0cmluZy5sZW5ndGg7CiAgICBpbnQgc2Vjb25kTGVuZ3RoID0gc2Vjb25kU3RyaW5nLmxlbmd0aDsKICAgIGlmIChmaXJzdExlbmd0aCAhPSBzZWNvbmRMZW5ndGgpIHsKICAgICAgcmV0dXJuIGZpcnN0TGVuZ3RoIC0gc2Vjb25kTGVuZ3RoOwogICAgfQogICAgTGlicmFyeSBmaXJzdExpYnJhcnkgPSBmaXJzdE5hbWUubGlicmFyeTsKICAgIExpYnJhcnkgc2Vjb25kTGlicmFyeSA9IHNlY29uZE5hbWUubGlicmFyeTsKICAgIGlmIChmaXJzdExpYnJhcnkgIT0gc2Vjb25kTGlicmFyeSkgewogICAgICBpZiAoZmlyc3RMaWJyYXJ5ID09IG51bGwpIHJldHVybiAtMTsKICAgICAgaWYgKHNlY29uZExpYnJhcnkgPT0gbnVsbCkgcmV0dXJuIDE7CiAgICAgIHJldHVybiBmaXJzdExpYnJhcnkuY29tcGFyZVRvKHNlY29uZExpYnJhcnkpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdExlbmd0aDsgKytpKSB7CiAgICAgIGludCBmaXJzdFVuaXQgPSBmaXJzdFN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBpbnQgc2Vjb25kVW5pdCA9IHNlY29uZFN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBpbnQgZGVsdGEgPSBmaXJzdFVuaXQgLSBzZWNvbmRVbml0OwogICAgICBpZiAoZGVsdGEgIT0gMCkgcmV0dXJuIGRlbHRhOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgbWVtYmVyIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGBudWxsYCBpZiBubyBtZW1iZXIgaGFzIHRoZQogIC8vLyBuYW1lLiAgSW4gY2FzZSB0aGUgbGlzdCBjb250YWlucyBtdWx0aXBsZSBtZW1iZXJzIHdpdGggdGhlIGdpdmVuIG5hbWUsCiAgLy8vIHRoZSBvbmUgdGhhdCBvY2N1cnMgZmlyc3QgaW4gdGhlIGxpc3QgaXMgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIFRoZSBsaXN0IGlzIGFzc3VtZWQgdG8gYmUgc29ydGVkIGFjY29yZGluZyB0byBbY29tcGFyZU1lbWJlcnNdLgogIHN0YXRpYyBNZW1iZXIgZmluZE1lbWJlckJ5TmFtZShMaXN0PE1lbWJlcj4gbWVtYmVycywgTmFtZSBuYW1lKSB7CiAgICBpbnQgbG93ID0gMCwgaGlnaCA9IG1lbWJlcnMubGVuZ3RoIC0gMTsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICBpbnQgbWlkID0gbG93ICsgKChoaWdoIC0gbG93KSA+PiAxKTsKICAgICAgTWVtYmVyIHBpdm90ID0gbWVtYmVyc1ttaWRdOwogICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmVOYW1lcyhuYW1lLCBwaXZvdC5uYW1lKTsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgaGlnaCA9IG1pZCAtIDE7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA+IDApIHsKICAgICAgICBsb3cgPSBtaWQgKyAxOwogICAgICB9IGVsc2UgaWYgKGhpZ2ggIT0gbWlkKSB7CiAgICAgICAgLy8gRW5zdXJlIHdlIGZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIG5hbWUuCiAgICAgICAgaGlnaCA9IG1pZDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gcGl2b3Q7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlcyB7CiAgLy8vIFJldHVybnMgdGhlIHN1YnR5cGVzIG9mIFtjbGFzc19dIGFzIGFuIGludGVydmFsIGxpc3QuCiAgQ2xhc3NTZXQgZ2V0U3VidHlwZXNPZihDbGFzcyBjbGFzc18pOwoKICAvLy8gUmV0dXJucyB0aGUgc2luZ2xlIGNvbmNyZXRlIHRhcmdldCBmb3IgaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gaW50ZXJmYWNlCiAgLy8vIHRhcmdldCwgb3IgYG51bGxgIGlmIGl0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCBvciB0aGVyZSBhcmUgbXVsdGlwbGUKICAvLy8gcG9zc2libGUgdGFyZ2V0cy4KICBNZW1iZXIgZ2V0U2luZ2xlVGFyZ2V0Rm9ySW50ZXJmYWNlSW52b2NhdGlvbihNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSk7Cn0KCmNsYXNzIF9DbGFzc0luZm9TdWJ0eXBlIHsKICBmaW5hbCBfQ2xhc3NJbmZvIGNsYXNzSW5mbzsKICBpbnQgdG9wRG93bkluZGV4ID0gLTE7CgogIC8vLyBUb3AtZG93biBpbmRpY2VzIG9mIGFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MsIHJlcHJlc2VudGVkIGFzCiAgLy8vIGludGVybGVhdmVkIGJlZ2luL2VuZCBpbnRlcnZhbCBlbmQgcG9pbnRzLgogIFVpbnQzMkxpc3Qgc3VidHlwZUludGVydmFsTGlzdDsKCiAgX0NsYXNzSW5mb1N1YnR5cGUodGhpcy5jbGFzc0luZm8pOwp9CgpjbGFzcyBfQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIGltcGxlbWVudHMgQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlcyB7CiAgZmluYWwgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CiAgZmluYWwgTGlzdDxDbGFzcz4gX2NsYXNzZXNCeVRvcERvd25JbmRleDsKICBmaW5hbCBNYXA8Q2xhc3MsIF9DbGFzc0luZm9TdWJ0eXBlPiBfaW5mb01hcCA9IDxDbGFzcywgX0NsYXNzSW5mb1N1YnR5cGU+e307CiAgYm9vbCBpbnZhbGlkYXRlZCA9IGZhbHNlOwoKICBfQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzKHRoaXMuaGllcmFyY2h5KQogICAgICA6IF9jbGFzc2VzQnlUb3BEb3duSW5kZXggPSBuZXcgTGlzdDxDbGFzcz4oaGllcmFyY2h5Ll9pbmZvTWFwLmxlbmd0aCkgewogICAgaGllcmFyY2h5LmFsbEJldHNPZmYgPSB0cnVlOwogICAgaWYgKGhpZXJhcmNoeS5faW5mb01hcC5pc05vdEVtcHR5KSB7CiAgICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIGhpZXJhcmNoeS5faW5mb01hcC5rZXlzKSB7CiAgICAgICAgX2luZm9NYXBbY2xhc3NfXSA9IG5ldyBfQ2xhc3NJbmZvU3VidHlwZShoaWVyYXJjaHkuX2luZm9NYXBbY2xhc3NfXSk7CiAgICAgIH0KCiAgICAgIF90b3BEb3duU29ydFZpc2l0KF9pbmZvTWFwW2hpZXJhcmNoeS5faW5mb01hcC5rZXlzLmZpcnN0XSk7CiAgICB9CiAgfQoKICAvLy8gRG93bndhcmRzIHRyYXZlcnNhbCBvZiB0aGUgY2xhc3MgaGllcmFyY2h5IHRoYXQgb3JkZXJzIGNsYXNzZXMgc28gbG9jYWwKICAvLy8gaGllcmFyY2hpZXMgaGF2ZSBjb250aWd1b3VzIGluZGljZXMuCiAgaW50IF90b3BEb3duU29ydEluZGV4ID0gMDsKICB2b2lkIF90b3BEb3duU29ydFZpc2l0KF9DbGFzc0luZm9TdWJ0eXBlIHN1YkluZm8pIHsKICAgIGlmIChzdWJJbmZvLnRvcERvd25JbmRleCAhPSAtMSkgcmV0dXJuOwogICAgaW50IGluZGV4ID0gX3RvcERvd25Tb3J0SW5kZXgrKzsKICAgIHN1YkluZm8udG9wRG93bkluZGV4ID0gaW5kZXg7CiAgICBfY2xhc3Nlc0J5VG9wRG93bkluZGV4W2luZGV4XSA9IHN1YkluZm8uY2xhc3NJbmZvLmNsYXNzTm9kZTsKICAgIHZhciBzdWJ0eXBlU2V0QnVpbGRlciA9IG5ldyBfSW50ZXJ2YWxMaXN0QnVpbGRlcigpLi5hZGRTaW5nbGV0b24oaW5kZXgpOwogICAgZm9yIChfQ2xhc3NJbmZvIHN1YnR5cGUgaW4gc3ViSW5mby5jbGFzc0luZm8uZGlyZWN0RXh0ZW5kZXJzKSB7CiAgICAgIF9DbGFzc0luZm9TdWJ0eXBlIHN1YnR5cGVJbmZvID0gX2luZm9NYXBbc3VidHlwZS5jbGFzc05vZGVdOwogICAgICBfdG9wRG93blNvcnRWaXNpdChzdWJ0eXBlSW5mbyk7CiAgICAgIHN1YnR5cGVTZXRCdWlsZGVyLmFkZEludGVydmFsTGlzdChzdWJ0eXBlSW5mby5zdWJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KICAgIGZvciAoX0NsYXNzSW5mbyBzdWJ0eXBlIGluIHN1YkluZm8uY2xhc3NJbmZvLmRpcmVjdE1peGVycykgewogICAgICBfQ2xhc3NJbmZvU3VidHlwZSBzdWJ0eXBlSW5mbyA9IF9pbmZvTWFwW3N1YnR5cGUuY2xhc3NOb2RlXTsKICAgICAgX3RvcERvd25Tb3J0VmlzaXQoc3VidHlwZUluZm8pOwogICAgICBzdWJ0eXBlU2V0QnVpbGRlci5hZGRJbnRlcnZhbExpc3Qoc3VidHlwZUluZm8uc3VidHlwZUludGVydmFsTGlzdCk7CiAgICB9CiAgICBmb3IgKF9DbGFzc0luZm8gc3VidHlwZSBpbiBzdWJJbmZvLmNsYXNzSW5mby5kaXJlY3RJbXBsZW1lbnRlcnMpIHsKICAgICAgX0NsYXNzSW5mb1N1YnR5cGUgc3VidHlwZUluZm8gPSBfaW5mb01hcFtzdWJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIF90b3BEb3duU29ydFZpc2l0KHN1YnR5cGVJbmZvKTsKICAgICAgc3VidHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1YnR5cGVJbmZvLnN1YnR5cGVJbnRlcnZhbExpc3QpOwogICAgfQogICAgc3ViSW5mby5zdWJ0eXBlSW50ZXJ2YWxMaXN0ID0gc3VidHlwZVNldEJ1aWxkZXIuYnVpbGRJbnRlcnZhbExpc3QoKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXRTaW5nbGVUYXJnZXRGb3JJbnRlcmZhY2VJbnZvY2F0aW9uKE1lbWJlciBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICBpZiAoaW52YWxpZGF0ZWQpIHRocm93ICJUaGlzIGRhdGEgc3RydWN0dXJlIGhhcyBiZWVuIGludmFsaWRhdGVkIjsKICAgIE5hbWUgbmFtZSA9IGludGVyZmFjZVRhcmdldC5uYW1lOwogICAgTWVtYmVyIHRhcmdldCA9IG51bGw7CiAgICBDbGFzc1NldCBzdWJ0eXBlcyA9IGdldFN1YnR5cGVzT2YoaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzKTsKICAgIGZvciAoQ2xhc3MgYyBpbiBzdWJ0eXBlcykgewogICAgICBpZiAoIWMuaXNBYnN0cmFjdCkgewogICAgICAgIE1lbWJlciBjYW5kaWRhdGUgPSBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQoYywgbmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgICAgIGlmICgoY2FuZGlkYXRlICE9IG51bGwpICYmICFjYW5kaWRhdGUuaXNBYnN0cmFjdCkgewogICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICAgIHRhcmdldCA9IGNhbmRpZGF0ZTsKICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICE9IGNhbmRpZGF0ZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc1NldCBnZXRTdWJ0eXBlc09mKENsYXNzIGNsYXNzXykgewogICAgaWYgKGludmFsaWRhdGVkKSB0aHJvdyAiVGhpcyBkYXRhIHN0cnVjdHVyZSBoYXMgYmVlbiBpbnZhbGlkYXRlZCI7CiAgICBTZXQ8Q2xhc3M+IHJlc3VsdCA9IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgICBVaW50MzJMaXN0IGxpc3QgPSBfaW5mb01hcFtjbGFzc19dLnN1YnR5cGVJbnRlcnZhbExpc3Q7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaW50IGZyb20gPSBsaXN0W2ldOwogICAgICBpbnQgdG8gPSBsaXN0W2kgKyAxXTsKICAgICAgZm9yIChpbnQgaiA9IGZyb207IGogPCB0bzsgaisrKSB7CiAgICAgICAgcmVzdWx0LmFkZChfY2xhc3Nlc0J5VG9wRG93bkluZGV4W2pdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBDbGFzc1NldChyZXN1bHQpOwogIH0KfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtDbGFzc0hpZXJhcmNoeV0gZm9yIGNsb3NlZCB3b3JsZC4KY2xhc3MgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSBpbXBsZW1lbnRzIENsYXNzSGllcmFyY2h5IHsKICBDb3JlVHlwZXMgY29yZVR5cGVzOwogIEhhbmRsZUFtYmlndW91c1N1cGVydHlwZXMgX29uQW1iaWd1b3VzU3VwZXJ0eXBlczsKICBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzIF9vbkFtYmlndW91c1N1cGVydHlwZXNOb3RXcmFwcGVkOwogIE1peGluSW5mZXJyZXIgbWl4aW5JbmZlcnJlcjsKCiAgdm9pZCBzZXQgb25BbWJpZ3VvdXNTdXBlcnR5cGVzKAogICAgICBIYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcykgewogICAgX29uQW1iaWd1b3VzU3VwZXJ0eXBlc05vdFdyYXBwZWQgPSBvbkFtYmlndW91c1N1cGVydHlwZXM7CiAgICBfb25BbWJpZ3VvdXNTdXBlcnR5cGVzID0gKENsYXNzIGNsYXNzXywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlcyhjbGFzc18sIGEsIGIpOwogICAgICBMaXN0PFN1cGVydHlwZT4gcmVjb3JkZWQgPSBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzW2NsYXNzX107CiAgICAgIGlmIChyZWNvcmRlZCA9PSBudWxsKSB7CiAgICAgICAgcmVjb3JkZWQgPSBuZXcgTGlzdDxTdXBlcnR5cGU+KCk7CiAgICAgICAgX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlc1tjbGFzc19dID0gcmVjb3JkZWQ7CiAgICAgIH0KICAgICAgcmVjb3JkZWQuYWRkKGEpOwogICAgICByZWNvcmRlZC5hZGQoYik7CiAgICB9OwogIH0KCiAgLy8vIFRoZSBpbnNlcnQgb3JkZXIgaXMgaW1wb3J0YW50LgogIGZpbmFsIE1hcDxDbGFzcywgX0NsYXNzSW5mbz4gX2luZm9NYXAgPQogICAgICBuZXcgTGlua2VkSGFzaE1hcDxDbGFzcywgX0NsYXNzSW5mbz4oKTsKCiAgTGlzdDxGb3JUZXN0aW5nQ2xhc3NJbmZvPiBnZXRUZXN0aW5nQ2xhc3NJbmZvKCkgewogICAgTGlzdDxGb3JUZXN0aW5nQ2xhc3NJbmZvPiByZXN1bHQgPSBuZXcgTGlzdDxGb3JUZXN0aW5nQ2xhc3NJbmZvPigpOwogICAgZm9yIChfQ2xhc3NJbmZvIGluZm8gaW4gX2luZm9NYXAudmFsdWVzKSB7CiAgICAgIHJlc3VsdC5hZGQobmV3IEZvclRlc3RpbmdDbGFzc0luZm8uXyhpbmZvKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgX0NsYXNzSW5mbyBpbmZvRm9yKENsYXNzIGMpIHsKICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvTWFwW2NdOwogICAgaW5mbz8udXNlZCA9IHRydWU7CiAgICByZXR1cm4gaW5mbzsKICB9CgogIExpc3Q8Q2xhc3M+IGdldFVzZWRDbGFzc2VzKCkgewogICAgTGlzdDxDbGFzcz4gcmVzdWx0ID0gbmV3IExpc3Q8Q2xhc3M+KCk7CiAgICBmb3IgKF9DbGFzc0luZm8gY2xhc3NJbmZvIGluIF9pbmZvTWFwLnZhbHVlcykgewogICAgICBpZiAoY2xhc3NJbmZvLnVzZWQpIHsKICAgICAgICByZXN1bHQuYWRkKGNsYXNzSW5mby5jbGFzc05vZGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCByZXNldFVzZWQoKSB7CiAgICBmb3IgKF9DbGFzc0luZm8gY2xhc3NJbmZvIGluIF9pbmZvTWFwLnZhbHVlcykgewogICAgICBjbGFzc0luZm8udXNlZCA9IGZhbHNlOwogICAgfQogICAgYWxsQmV0c09mZiA9IGZhbHNlOwogIH0KCiAgZmluYWwgU2V0PExpYnJhcnk+IGtub3duTGlicmFyaWVzID0gbmV3IFNldDxMaWJyYXJ5PigpOwogIGJvb2wgYWxsQmV0c09mZiA9IGZhbHNlOwoKICAvLy8gUmVjb3JkZWQgZXJyb3JzIGZvciBjbGFzc2VzIHdlIGhhdmUgYWxyZWFkeSBjYWxjdWxhdGVkIHRoZSBjbGFzcyBoaWVyYXJjaHkKICAvLy8gZm9yLCBidXQgd2lsbCBoYXZlIHRvIGJlIHJlaXNzdWVkIHdoZW4gcmUtdXNpbmcgdGhlIGNhbGN1bGF0aW9uLgogIGZpbmFsIE1hcDxDbGFzcywgTGlzdDxTdXBlcnR5cGU+PiBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzID0KICAgICAgbmV3IExpbmtlZEhhc2hNYXA8Q2xhc3MsIExpc3Q8U3VwZXJ0eXBlPj4oKTsKCiAgSXRlcmFibGU8Q2xhc3M+IGdldCBjbGFzc2VzIHsKICAgIGFsbEJldHNPZmYgPSB0cnVlOwogICAgcmV0dXJuIF9pbmZvTWFwLmtleXM7CiAgfQoKICBpbnQgZ2V0IG51bWJlck9mQ2xhc3NlcyB7CiAgICBhbGxCZXRzT2ZmID0gdHJ1ZTsKICAgIHJldHVybiBfaW5mb01hcC5sZW5ndGg7CiAgfQoKICBfQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzOwoKICBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5Ll9pbnRlcm5hbCh0aGlzLmNvcmVUeXBlcywKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMsIHRoaXMubWl4aW5JbmZlcnJlcikgewogICAgdGhpcy5vbkFtYmlndW91c1N1cGVydHlwZXMgPSBvbkFtYmlndW91c1N1cGVydHlwZXM7CiAgfQoKICBDbGFzc0hpZXJhcmNoeVN1YnR5cGVzIGNvbXB1dGVTdWJ0eXBlc0luZm9ybWF0aW9uKCkgewogICAgX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXMgPz89CiAgICAgICAgbmV3IF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXModGhpcyk7CiAgICByZXR1cm4gX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxDbGFzcz4gZ2V0T3JkZXJlZENsYXNzZXMoSXRlcmFibGU8Q2xhc3M+IHVub3JkZXJlZCkgewogICAgdmFyIHVub3JkZXJlZFNldCA9IHVub3JkZXJlZC50b1NldCgpOwogICAgZm9yIChDbGFzcyBjIGluIHVub3JkZXJlZCkgX2luZm9NYXBbY10/LnVzZWQgPSB0cnVlOwogICAgcmV0dXJuIF9pbmZvTWFwLmtleXMud2hlcmUodW5vcmRlcmVkU2V0LmNvbnRhaW5zKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJjbGFzc09mKENsYXNzIHN1YmNsYXNzLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBpZiAoaWRlbnRpY2FsKHN1YmNsYXNzLCBzdXBlcmNsYXNzKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gaW5mb0ZvcihzdWJjbGFzcykuaXNTdWJjbGFzc09mKGluZm9Gb3Ioc3VwZXJjbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGVPZihDbGFzcyBzdWJ0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBpZiAoaWRlbnRpY2FsKHN1YnR5cGUsIHN1cGVyY2xhc3MpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBpbmZvRm9yKHN1YnR5cGUpLmlzU3VidHlwZU9mKGluZm9Gb3Ioc3VwZXJjbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1VzZWRBc01peGluKENsYXNzIGNsYXNzXykgewogICAgcmV0dXJuIGluZm9Gb3IoY2xhc3NfKS5kaXJlY3RNaXhlcnMuaXNOb3RFbXB0eTsKICB9CgogIExpc3Q8X0NsYXNzSW5mbz4gX2dldFJhbmtlZFN1cGVyY2xhc3NJbmZvcyhfQ2xhc3NJbmZvIGluZm8pIHsKICAgIGlmIChpbmZvLmxlYXN0VXBwZXJCb3VuZEluZm9zICE9IG51bGwpIHJldHVybiBpbmZvLmxlYXN0VXBwZXJCb3VuZEluZm9zOwogICAgdmFyIGhlYXAgPSBuZXcgX0x1YkhlYXAoKS4uYWRkKGluZm8pOwogICAgdmFyIGNoYWluID0gPF9DbGFzc0luZm8+W107CiAgICBpbmZvLmxlYXN0VXBwZXJCb3VuZEluZm9zID0gY2hhaW47CiAgICBfQ2xhc3NJbmZvIGxhc3RJbmZvID0gbnVsbDsKICAgIHdoaWxlIChoZWFwLmlzTm90RW1wdHkpIHsKICAgICAgdmFyIG5leHRJbmZvID0gaGVhcC5yZW1vdmUoKTsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0SW5mbywgbGFzdEluZm8pKSBjb250aW51ZTsKICAgICAgY2hhaW4uYWRkKG5leHRJbmZvKTsKICAgICAgbGFzdEluZm8gPSBuZXh0SW5mbzsKICAgICAgdmFyIGNsYXNzTm9kZSA9IG5leHRJbmZvLmNsYXNzTm9kZTsKICAgICAgdm9pZCBhZGRUb0hlYXAoU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogICAgICAgIGhlYXAuYWRkKGluZm9Gb3Ioc3VwZXJ0eXBlLmNsYXNzTm9kZSkpOwogICAgICB9CgogICAgICBpZiAoY2xhc3NOb2RlLnN1cGVydHlwZSAhPSBudWxsKSBhZGRUb0hlYXAoY2xhc3NOb2RlLnN1cGVydHlwZSk7CiAgICAgIGlmIChjbGFzc05vZGUubWl4ZWRJblR5cGUgIT0gbnVsbCkgYWRkVG9IZWFwKGNsYXNzTm9kZS5taXhlZEluVHlwZSk7CiAgICAgIGNsYXNzTm9kZS5pbXBsZW1lbnRlZFR5cGVzLmZvckVhY2goYWRkVG9IZWFwKTsKICAgIH0KICAgIHJldHVybiBjaGFpbjsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKEludGVyZmFjZVR5cGUgdHlwZTEsCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZTIsIExpYnJhcnkgY2xpZW50TGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgLy8gVGhlIGFsZ29yaXRobSBpczogZmlyc3Qgd2UgY29tcHV0ZSBhIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGZvciBib3RoIHR5cGVzLAogICAgLy8gb3JkZXJlZCBmcm9tIGdyZWF0ZXN0IHRvIGxlYXN0IGRlcHRoLCBhbmQgb3JkZXJlZCBieSB0b3BvbG9naWNhbCBzb3J0CiAgICAvLyBpbmRleCB3aXRoaW4gZWFjaCBkZXB0aC4gIER1ZSB0byB0aGUgc29ydCBvcmRlciwgd2UgY2FuIGZpbmQgdGhlCiAgICAvLyBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgbGlzdHMgYnkgYSBzaW1wbGUgd2Fsay4KICAgIC8vCiAgICAvLyBUaGVuLCBmb3IgZWFjaCBjbGFzcyBpbiB0aGUgaW50ZXJzZWN0aW9uLCBkZXRlcm1pbmUgdGhlIGV4YWN0IHR5cGUgdGhhdAogICAgLy8gaXMgaW1wbGVtZW50ZWQgYnkgdHlwZTEgYW5kIHR5cGUyLiAgSWYgdGhlIHR5cGVzIG1hdGNoLCB0aGF0IHR5cGUgaXMgYQogICAgLy8gY2FuZGlkYXRlIChpdCdzIGEgbWVtYmVyIG9mIFNfbikuICBBcyBzb29uIGFzIHdlIGZpbmQgYSBjYW5kaWRhdGUgd2hpY2gKICAgIC8vIGlzIHVuaXF1ZSBmb3IgaXRzIGRlcHRoLCB3ZSByZXR1cm4gaXQuCiAgICAvLwogICAgLy8gQXMgYW4gb3B0aW1pemF0aW9uLCBpZiB0aGUgY2xhc3MgZm9yIEkgaXMgYSBzdWJ0eXBlIG9mIHRoZSBjbGFzcyBmb3IgSiwKICAgIC8vIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBsaXN0IG9mIHN1cGVyY2xhc3NlcyBvZiBKIGlzIGEgc3Vic2V0IG9mIHRoZSBsaXN0CiAgICAvLyBvZiBzdXBlcmNsYXNzZXMgZm9yIEk7IHRoZXJlZm9yZSBpdCBpcyBzdWZmaWNpZW50IHRvIGNvbXB1dGUganVzdCB0aGUKICAgIC8vIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGZvciBKLiAgVG8gYXZvaWQgY29tcGxpY2F0aW5nIHRoZSBjb2RlIGJlbG93ICh3aGljaAogICAgLy8gaW50ZXJzZWN0cyB0aGUgdHdvIGxpc3RzKSwgd2Ugc2V0IGJvdGggbGlzdHMgZXF1YWwgdG8gdGhlIGxpc3Qgb2YKICAgIC8vIHN1cGVyY2xhc3NlcyBmb3IgSi4gIEFuZCB2aWNlIHZlcnNhIHdpdGggdGhlIHJvbGUgb2YgSSBhbmQgSiBzd2FwcGVkLgoKICAgIC8vIENvbXB1dGUgdGhlIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGZvciBib3RoIHR5cGVzLCB3aXRoIHRoZSBhYm92ZQogICAgLy8gb3B0aW1pemF0aW9uLgoKICAgIC8vIExMVUIoTnVsbCwgTGlzdDxkeW5hbWljPiopIHdvcmtzIGRpZmZlcmVudGx5IGZvciBvcHQtaW4gYW5kIG9wdC1vdXQKICAgIC8vIGxpYnJhcmllcy4gIEluIG9wdC1vdXQgbGlicmFyaWVzIHRoZSBsZWdhY3kgYmVoYXZpb3IgaXMgcHJlc2VydmVkLCBzbwogICAgLy8gTExVQihOdWxsLCBMaXN0PGR5bmFtaWM+KikgPSBMaXN0PGR5bmFtaWM+Ki4gIEluIG9wdC1pbiBsaWJyYXJpZXMgdGhlCiAgICAvLyBydWxlcyBpbXBseSB0aGF0IExMVUIoTnVsbCwgTGlzdDxkeW5hbWljPiopID0gTGlzdDxkeW5hbWljPj8uCiAgICBpZiAoIWNsaWVudExpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBpZiAodHlwZTEgPT0gY29yZVR5cGVzLm51bGxUeXBlKSByZXR1cm4gdHlwZTI7CiAgICAgIGlmICh0eXBlMiA9PSBjb3JlVHlwZXMubnVsbFR5cGUpIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICBfQ2xhc3NJbmZvIGluZm8xID0gaW5mb0Zvcih0eXBlMS5jbGFzc05vZGUpOwogICAgX0NsYXNzSW5mbyBpbmZvMiA9IGluZm9Gb3IodHlwZTIuY2xhc3NOb2RlKTsKICAgIExpc3Q8X0NsYXNzSW5mbz4gY2xhc3NlczE7CiAgICBMaXN0PF9DbGFzc0luZm8+IGNsYXNzZXMyOwogICAgaWYgKGlkZW50aWNhbChpbmZvMSwgaW5mbzIpIHx8IGluZm8xLmlzU3VidHlwZU9mKGluZm8yKSkgewogICAgICBjbGFzc2VzMSA9IGNsYXNzZXMyID0gX2dldFJhbmtlZFN1cGVyY2xhc3NJbmZvcyhpbmZvMik7CiAgICB9IGVsc2UgaWYgKGluZm8yLmlzU3VidHlwZU9mKGluZm8xKSkgewogICAgICBjbGFzc2VzMSA9IGNsYXNzZXMyID0gX2dldFJhbmtlZFN1cGVyY2xhc3NJbmZvcyhpbmZvMSk7CiAgICB9IGVsc2UgewogICAgICBjbGFzc2VzMSA9IF9nZXRSYW5rZWRTdXBlcmNsYXNzSW5mb3MoaW5mbzEpOwogICAgICBjbGFzc2VzMiA9IF9nZXRSYW5rZWRTdXBlcmNsYXNzSW5mb3MoaW5mbzIpOwogICAgfQoKICAgIC8vIFdhbGsgdGhlIGxpc3RzIGZpbmRpbmcgdGhlaXIgaW50ZXJzZWN0aW9uLCBsb29raW5nIGZvciBhIGRlcHRoIHRoYXQgaGFzIGEKICAgIC8vIHNpbmdsZSBjYW5kaWRhdGUuCiAgICBpbnQgaTEgPSAwOwogICAgaW50IGkyID0gMDsKICAgIEludGVyZmFjZVR5cGUgY2FuZGlkYXRlID0gbnVsbDsKICAgIGludCBjdXJyZW50RGVwdGggPSAtMTsKICAgIGludCBudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGggPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgX0NsYXNzSW5mbyBuZXh0ID0gY2xhc3NlczFbaTFdOwogICAgICBfQ2xhc3NJbmZvIG5leHQyID0gY2xhc3NlczJbaTJdOwogICAgICBpZiAoIWlkZW50aWNhbChuZXh0LCBuZXh0MikpIHsKICAgICAgICBpZiAoX0x1YkhlYXAuc29ydHNCZWZvcmVTdGF0aWMobmV4dCwgbmV4dDIpKSB7CiAgICAgICAgICArK2kxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICArK2kyOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICArK2kyOwogICAgICArK2kxOwogICAgICBpZiAobmV4dC5kZXB0aCAhPSBjdXJyZW50RGVwdGgpIHsKICAgICAgICBpZiAobnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRoID09IDEpIHJldHVybiBjYW5kaWRhdGU7CiAgICAgICAgY3VycmVudERlcHRoID0gbmV4dC5kZXB0aDsKICAgICAgICBudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGggPSAwOwogICAgICAgIGNhbmRpZGF0ZSA9IG51bGw7CiAgICAgIH0gZWxzZSBpZiAobnVtQ2FuZGlkYXRlc0F0VGhpc0RlcHRoID4gMSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvLyBGb3IgZWFjaCBjbGFzcyBpbiB0aGUgaW50ZXJzZWN0aW9uLCBmaW5kIHRoZSBleGFjdCB0eXBlIHRoYXQgaXMKICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdHlwZTEgYW5kIHR5cGUyLiAgSWYgdGhleSBtYXRjaCwgaXQncyBhIGNhbmRpZGF0ZS4KICAgICAgLy8KICAgICAgLy8gVHdvIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uczoKICAgICAgLy8KICAgICAgLy8gLSBJZiB0aGlzIGNsYXNzIGxhY2tzIHR5cGUgcGFyYW1ldGVycywgd2Uga25vdyB0aGVyZSBpcyBhIG1hdGNoIHdpdGhvdXQKICAgICAgLy8gICBuZWVkaW5nIHRvIHN1YnN0aXR1dGUuCiAgICAgIC8vCiAgICAgIC8vIC0gSWYgdGhlIGRlcHRoIGlzIDAsIHdlIGhhdmUgcmVhY2hlZCBPYmplY3QsIHNvIHdlIGNhbiByZXR1cm4gaXQKICAgICAgLy8gICBpbW1lZGlhdGVseS4gIFNpbmNlIGFsbCBpbnRlcmZhY2UgdHlwZXMgYXJlIHN1YnR5cGVzIG9mIE9iamVjdCwgdGhpcwogICAgICAvLyAgIGVuc3VyZXMgdGhlIGxvb3AgdGVybWluYXRlcy4KICAgICAgaWYgKG5leHQuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICBjYW5kaWRhdGUgPSBjb3JlVHlwZXMucmF3VHlwZShuZXh0LmNsYXNzTm9kZSwKICAgICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSkpOwogICAgICAgIGlmIChjdXJyZW50RGVwdGggPT0gMCkgcmV0dXJuIGNhbmRpZGF0ZTsKICAgICAgICArK251bUNhbmRpZGF0ZXNBdFRoaXNEZXB0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgc3VwZXJUeXBlMSA9IGlkZW50aWNhbChpbmZvMSwgbmV4dCkKICAgICAgICAgICAgPyB0eXBlMQogICAgICAgICAgICA6IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZSh0eXBlMSkuc3Vic3RpdHV0ZVR5cGUoCiAgICAgICAgICAgICAgICBpbmZvMS5nZW5lcmljU3VwZXJUeXBlW25leHQuY2xhc3NOb2RlXS5hc0ludGVyZmFjZVR5cGUpOwogICAgICAgIHZhciBzdXBlclR5cGUyID0gaWRlbnRpY2FsKGluZm8yLCBuZXh0KQogICAgICAgICAgICA/IHR5cGUyCiAgICAgICAgICAgIDogU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHR5cGUyKS5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgICAgICAgIGluZm8yLmdlbmVyaWNTdXBlclR5cGVbbmV4dC5jbGFzc05vZGVdLmFzSW50ZXJmYWNlVHlwZSk7CiAgICAgICAgaWYgKHN1cGVyVHlwZTEgPT0gc3VwZXJUeXBlMikgewogICAgICAgICAgY2FuZGlkYXRlID0gc3VwZXJUeXBlMS53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSkpOwogICAgICAgICAgKytudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgZ2V0Q2xhc3NBc0luc3RhbmNlT2YoQ2xhc3MgY2xhc3NfLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICBpZiAoaWRlbnRpY2FsKGNsYXNzXywgc3VwZXJjbGFzcykpIHJldHVybiBjbGFzc18uYXNUaGlzU3VwZXJ0eXBlOwogICAgX0NsYXNzSW5mbyBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICB0aHJvdyAiJHtjbGFzc18uZmlsZVVyaX06IE5vIGNsYXNzIGluZm8gZm9yICR7Y2xhc3NfLm5hbWV9IjsKICAgIH0KICAgIF9DbGFzc0luZm8gc3VwZXJJbmZvID0gaW5mb0ZvcihzdXBlcmNsYXNzKTsKICAgIGlmIChzdXBlckluZm8gPT0gbnVsbCkgewogICAgICB0aHJvdyAiJHtzdXBlcmNsYXNzLmZpbGVVcml9OiBObyBjbGFzcyBpbmZvIGZvciAke3N1cGVyY2xhc3MubmFtZX0iOwogICAgfQogICAgaWYgKCFpbmZvLmlzU3VidHlwZU9mKHN1cGVySW5mbykpIHJldHVybiBudWxsOwogICAgaWYgKHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIHN1cGVyY2xhc3MuYXNSYXdTdXBlcnR5cGU7CiAgICBhc3NlcnQoaW5mby5nZW5lcmljU3VwZXJUeXBlLmNvbnRhaW5zS2V5KHN1cGVyY2xhc3MpLAogICAgICAgICJObyBjYW5vbmljYWwgaW5zdGFuY2Ugb2YgJHN1cGVyY2xhc3MgZm91bmQgZm9yICRjbGFzc18uIik7CiAgICByZXR1cm4gaW5mby5nZW5lcmljU3VwZXJUeXBlW3N1cGVyY2xhc3NdOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcywKICAgICAgTGlicmFyeSBjbGllbnRMaWJyYXJ5LCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBnZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MpOwogICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBhIGxlZ2FjeSB0eXBlIGlmIGl0J3MgY29tcHV0ZWQgZm9yIGFuCiAgICAvLyBvcHRlZC1vdXQgbGlicmFyeSwgdW5sZXNzIHRoZSByZXR1cm4gdmFsdWUgaXMgTnVsbD8gd2hpY2ggaXMgYWx3YXlzCiAgICAvLyBudWxsYWJsZS4KICAgIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5ID0gc3VwZXJjbGFzcyA9PSBjb3JlVHlwZXMubnVsbENsYXNzIHx8CiAgICAgICAgICAgIGNsaWVudExpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgID8gdHlwZS5udWxsYWJpbGl0eQogICAgICAgIDogTnVsbGFiaWxpdHkubGVnYWN5OwogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKHN1cGVyY2xhc3MsIG51bGxhYmlsaXR5LCB0eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgU3VwZXJ0eXBlIGNhc3RlZFR5cGUgPSBnZXRDbGFzc0FzSW5zdGFuY2VPZih0eXBlLmNsYXNzTm9kZSwgc3VwZXJjbGFzcyk7CiAgICBpZiAoY2FzdGVkVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHR5cGUpCiAgICAgICAgLnN1YnN0aXR1dGVTdXBlcnR5cGUoY2FzdGVkVHlwZSkKICAgICAgICAudHlwZUFyZ3VtZW50czsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXREaXNwYXRjaFRhcmdldChDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIExpc3Q8TWVtYmVyPiBsaXN0ID0KICAgICAgICBfYnVpbGRJbXBsZW1lbnRlZE1lbWJlcnMoY2xhc3NfLCBpbmZvRm9yKGNsYXNzXyksIHNldHRlcnM6IHNldHRlcik7CiAgICByZXR1cm4gQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShsaXN0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TWVtYmVyPiBnZXREaXNwYXRjaFRhcmdldHMoQ2xhc3MgY2xhc3NfLCB7Ym9vbCBzZXR0ZXJzOiBmYWxzZX0pIHsKICAgIHJldHVybiBfYnVpbGRJbXBsZW1lbnRlZE1lbWJlcnMoY2xhc3NfLCBpbmZvRm9yKGNsYXNzXyksIHNldHRlcnM6IHNldHRlcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldEludGVyZmFjZU1lbWJlcihDbGFzcyBjbGFzc18sIE5hbWUgbmFtZSwge2Jvb2wgc2V0dGVyOiBmYWxzZX0pIHsKICAgIExpc3Q8TWVtYmVyPiBsaXN0ID0gZ2V0SW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIHNldHRlcnM6IHNldHRlcik7CiAgICByZXR1cm4gQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZShsaXN0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8TWVtYmVyPiBnZXRJbnRlcmZhY2VNZW1iZXJzKENsYXNzIGNsYXNzXywge2Jvb2wgc2V0dGVyczogZmFsc2V9KSB7CiAgICByZXR1cm4gX2J1aWxkSW50ZXJmYWNlTWVtYmVycyhjbGFzc18sIGluZm9Gb3IoY2xhc3NfKSwgc2V0dGVyczogc2V0dGVycyk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PE1lbWJlcj4gZ2V0RGVjbGFyZWRNZW1iZXJzKENsYXNzIGNsYXNzXywge2Jvb2wgc2V0dGVyczogZmFsc2V9KSB7CiAgICByZXR1cm4gX2J1aWxkRGVjbGFyZWRNZW1iZXJzKGNsYXNzXywgaW5mb0ZvcihjbGFzc18pLCBzZXR0ZXJzOiBzZXR0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yRWFjaE92ZXJyaWRlUGFpcihDbGFzcyBjbGFzc18sCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlciksCiAgICAgIHtib29sIGNyb3NzR2V0dGVyc1NldHRlcnM6IGZhbHNlfSkgewogICAgX0NsYXNzSW5mbyBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgZm9yICh2YXIgc3VwZXJ0eXBlIGluIGNsYXNzXy5zdXBlcnMpIHsKICAgICAgdmFyIHN1cGVyY2xhc3MgPSBzdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgICB2YXIgc3VwZXJHZXR0ZXJzID0gZ2V0SW50ZXJmYWNlTWVtYmVycyhzdXBlcmNsYXNzKTsKICAgICAgdmFyIHN1cGVyU2V0dGVycyA9IGdldEludGVyZmFjZU1lbWJlcnMoc3VwZXJjbGFzcywgc2V0dGVyczogdHJ1ZSk7CiAgICAgIF9yZXBvcnRPdmVycmlkZXMoX2J1aWxkRGVjbGFyZWRNZW1iZXJzKGNsYXNzXywgaW5mbywgc2V0dGVyczogZmFsc2UpLAogICAgICAgICAgc3VwZXJHZXR0ZXJzLCBjYWxsYmFjayk7CiAgICAgIF9yZXBvcnRPdmVycmlkZXMoX2J1aWxkRGVjbGFyZWRNZW1iZXJzKGNsYXNzXywgaW5mbywgc2V0dGVyczogdHJ1ZSksCiAgICAgICAgICBzdXBlclNldHRlcnMsIGNhbGxiYWNrLAogICAgICAgICAgaXNTZXR0ZXI6IHRydWUpOwogICAgfQogIH0KCiAgc3RhdGljIHZvaWQgX3JlcG9ydE92ZXJyaWRlcygKICAgICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkTGlzdCwKICAgICAgTGlzdDxNZW1iZXI+IGluaGVyaXRlZExpc3QsCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlciksCiAgICAgIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pIHsKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICB3aGlsZSAoaSA8IGRlY2xhcmVkTGlzdC5sZW5ndGggJiYgaiA8IGluaGVyaXRlZExpc3QubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZCA9IGRlY2xhcmVkTGlzdFtpXTsKICAgICAgTWVtYmVyIGluaGVyaXRlZCA9IGluaGVyaXRlZExpc3Rbal07CiAgICAgIGludCBjb21wYXJpc29uID0gQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoZGVjbGFyZWQsIGluaGVyaXRlZCk7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgICsraTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgICsrajsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIWlkZW50aWNhbChkZWNsYXJlZCwgaW5oZXJpdGVkKSkgewogICAgICAgICAgY2FsbGJhY2soZGVjbGFyZWQsIGluaGVyaXRlZCwgaXNTZXR0ZXIpOwogICAgICAgIH0KICAgICAgICAvLyBBIGdpdmVuIGRlY2xhcmVkIG1lbWJlciBtYXkgb3ZlcnJpZGUgbXVsdGlwbGUgaW50ZXJmYWNlIG1lbWJlcnMsCiAgICAgICAgLy8gc28gb25seSBtb3ZlIHBhc3QgdGhlIGludGVyZmFjZSBtZW1iZXIuCiAgICAgICAgKytqOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PFN1cGVydHlwZT4gZ2VuZXJpY1N1cGVydHlwZXNPZihDbGFzcyBjbGFzc18pIHsKICAgIGZpbmFsIHN1cGVydHlwZXMgPSBpbmZvRm9yKGNsYXNzXykuZ2VuZXJpY1N1cGVyVHlwZTsKICAgIGlmIChzdXBlcnR5cGVzID09IG51bGwpIHJldHVybiBjb25zdCA8U3VwZXJ0eXBlPltdOwogICAgcmV0dXJuIHN1cGVydHlwZXMudmFsdWVzLnRvTGlzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NIaWVyYXJjaHkgYXBwbHlUcmVlQ2hhbmdlcyhJdGVyYWJsZTxMaWJyYXJ5PiByZW1vdmVkTGlicmFyaWVzLAogICAgICBJdGVyYWJsZTxMaWJyYXJ5PiBlbnN1cmVLbm93bkxpYnJhcmllcywKICAgICAge0NvbXBvbmVudCByZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0Zvcn0pIHsKICAgIC8vIFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmVtb3ZlZCBjbGFzc2VzLgogICAgZm9yIChMaWJyYXJ5IGxpYiBpbiByZW1vdmVkTGlicmFyaWVzKSB7CiAgICAgIGlmICgha25vd25MaWJyYXJpZXMuY29udGFpbnMobGliKSkgY29udGludWU7CiAgICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIGxpYi5jbGFzc2VzKSB7CiAgICAgICAgX0NsYXNzSW5mbyBpbmZvID0gX2luZm9NYXBbY2xhc3NfXTsKICAgICAgICBpZiAoY2xhc3NfLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgICAgICBfaW5mb01hcFtjbGFzc18uc3VwZXJ0eXBlLmNsYXNzTm9kZV0/LmRpcmVjdEV4dGVuZGVycz8ucmVtb3ZlKGluZm8pOwogICAgICAgIH0KICAgICAgICBpZiAoY2xhc3NfLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICAgIF9pbmZvTWFwW2NsYXNzXy5taXhlZEluVHlwZS5jbGFzc05vZGVdPy5kaXJlY3RNaXhlcnM/LnJlbW92ZShpbmZvKTsKICAgICAgICB9CiAgICAgICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGNsYXNzXy5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgICAgICBfaW5mb01hcFtzdXBlcnR5cGUuY2xhc3NOb2RlXT8uZGlyZWN0SW1wbGVtZW50ZXJzPy5yZW1vdmUoaW5mbyk7CiAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBkaXJlY3RNaXhlcnMgdG9vIGFzIHRoZSBtaXhpbiB0cmFuc2Zvcm1hdGlvbiB3aWxsCiAgICAgICAgICAvLyAibW92ZSIgdGhlIHR5cGUgaGVyZS4KICAgICAgICAgIGlmIChjbGFzc18uaXNBbm9ueW1vdXNNaXhpbiB8fCBjbGFzc18uaXNFbGltaW5hdGVkTWl4aW4pIHsKICAgICAgICAgICAgX2luZm9NYXBbc3VwZXJ0eXBlLmNsYXNzTm9kZV0/LmRpcmVjdE1peGVycz8ucmVtb3ZlKGluZm8pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgX2luZm9NYXAucmVtb3ZlKGNsYXNzXyk7CiAgICAgICAgX3JlY29yZGVkQW1iaWd1b3VzU3VwZXJ0eXBlcy5yZW1vdmUoY2xhc3NfKTsKICAgICAgfQogICAgICBrbm93bkxpYnJhcmllcy5yZW1vdmUobGliKTsKICAgIH0KCiAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIGNvbXB1dGF0aW9uIG9mIHN1YnR5cGVzLCBpbnZhbGlkYXRlIGl0IGFuZCBzdG9wCiAgICAvLyBjYWNoaW5nIGl0LgogICAgaWYgKF9jYWNoZWRDbGFzc0hpZXJhcmNoeVN1YnR5cGVzICE9IG51bGwpIHsKICAgICAgX2NhY2hlZENsYXNzSGllcmFyY2h5U3VidHlwZXMuaW52YWxpZGF0ZWQgPSB0cnVlOwogICAgfQoKICAgIGlmIChfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzLmlzTm90RW1wdHkgJiYKICAgICAgICByZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0ZvciAhPSBudWxsKSB7CiAgICAgIFNldDxMaWJyYXJ5PiBsaWJzID0KICAgICAgICAgIG5ldyBTZXQ8TGlicmFyeT4uZnJvbShyZWlzc3VlQW1iaWd1b3VzU3VwZXJ0eXBlc0Zvci5saWJyYXJpZXMpOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzLmtleXMpIHsKICAgICAgICBpZiAoIWxpYnMuY29udGFpbnMoY2xhc3NfLmVuY2xvc2luZ0xpYnJhcnkpKSBjb250aW51ZTsKICAgICAgICBMaXN0PFN1cGVydHlwZT4gcmVjb3JkZWQgPSBfcmVjb3JkZWRBbWJpZ3VvdXNTdXBlcnR5cGVzW2NsYXNzX107CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRlZC5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgX29uQW1iaWd1b3VzU3VwZXJ0eXBlc05vdFdyYXBwZWQoCiAgICAgICAgICAgICAgY2xhc3NfLCByZWNvcmRlZFtpXSwgcmVjb3JkZWRbaSArIDFdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgdGhlIG5ldyBjbGFzc2VzLgogICAgTGlzdDxDbGFzcz4gYWRkZWRDbGFzc2VzU29ydGVkID0gbmV3IExpc3Q8Q2xhc3M+KCk7CiAgICBpbnQgZXhwZWN0ZWRTdGFydEluZGV4ID0gX3RvcFNvcnRJbmRleDsKICAgIGZvciAoTGlicmFyeSBsaWIgaW4gZW5zdXJlS25vd25MaWJyYXJpZXMpIHsKICAgICAgaWYgKGtub3duTGlicmFyaWVzLmNvbnRhaW5zKGxpYikpIGNvbnRpbnVlOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBsaWIuY2xhc3NlcykgewogICAgICAgIF90b3BvbG9naWNhbFNvcnRWaXNpdChjbGFzc18sIG5ldyBTZXQ8Q2xhc3M+KCksCiAgICAgICAgICAgIG9yZGVyZWRMaXN0OiBhZGRlZENsYXNzZXNTb3J0ZWQpOwogICAgICB9CiAgICAgIGtub3duTGlicmFyaWVzLmFkZChsaWIpOwogICAgfQogICAgX2luaXRpYWxpemVUb3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcygKICAgICAgICBhZGRlZENsYXNzZXNTb3J0ZWQsIGV4cGVjdGVkU3RhcnRJbmRleCk7CgogICAgYXNzZXJ0KHNhbml0eUNoZWNrcygpKTsKCiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIENsYXNzSGllcmFyY2h5IGFwcGx5TWVtYmVyQ2hhbmdlcyhJdGVyYWJsZTxDbGFzcz4gY2xhc3NlcywKICAgICAge2Jvb2wgZmluZERlc2NlbmRhbnRzOiBmYWxzZX0pIHsKICAgIGlmIChjbGFzc2VzLmlzRW1wdHkpIHJldHVybiB0aGlzOwoKICAgIExpc3Q8X0NsYXNzSW5mbz4gaW5mb3MgPSBuZXcgTGlzdDxfQ2xhc3NJbmZvPigpOwogICAgaWYgKGZpbmREZXNjZW5kYW50cykgewogICAgICBTZXQ8X0NsYXNzSW5mbz4gcHJvY2Vzc2VkQ2xhc3NlcyA9IG5ldyBTZXQ8X0NsYXNzSW5mbz4oKTsKICAgICAgTGlzdDxfQ2xhc3NJbmZvPiB3b3JrbGlzdCA9IDxfQ2xhc3NJbmZvPltdOwogICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBjbGFzc2VzKSB7CiAgICAgICAgX0NsYXNzSW5mbyBpbmZvID0gaW5mb0ZvcihjbGFzc18pOwogICAgICAgIHdvcmtsaXN0LmFkZChpbmZvKTsKICAgICAgfQoKICAgICAgd2hpbGUgKHdvcmtsaXN0LmlzTm90RW1wdHkpIHsKICAgICAgICBfQ2xhc3NJbmZvIGluZm8gPSB3b3JrbGlzdC5yZW1vdmVMYXN0KCk7CiAgICAgICAgaWYgKHByb2Nlc3NlZENsYXNzZXMuYWRkKGluZm8pKSB7CiAgICAgICAgICB3b3JrbGlzdC5hZGRBbGwoaW5mby5kaXJlY3RFeHRlbmRlcnMpOwogICAgICAgICAgd29ya2xpc3QuYWRkQWxsKGluZm8uZGlyZWN0SW1wbGVtZW50ZXJzKTsKICAgICAgICAgIHdvcmtsaXN0LmFkZEFsbChpbmZvLmRpcmVjdE1peGVycyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGluZm9zLmFkZEFsbChwcm9jZXNzZWRDbGFzc2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIGNsYXNzZXMpIHsKICAgICAgICBfQ2xhc3NJbmZvIGluZm8gPSBpbmZvRm9yKGNsYXNzXyk7CiAgICAgICAgaW5mb3MuYWRkKGluZm8pOwogICAgICB9CiAgICB9CgogICAgZm9yIChfQ2xhc3NJbmZvIGluZm8gaW4gaW5mb3MpIHsKICAgICAgaW5mby5sYXp5RGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHMgPSBudWxsOwogICAgICBpbmZvLmxhenlEZWNsYXJlZFNldHRlcnMgPSBudWxsOwogICAgICBpbmZvLmxhenlJbXBsZW1lbnRlZEdldHRlcnNBbmRDYWxscyA9IG51bGw7CiAgICAgIGluZm8ubGF6eUltcGxlbWVudGVkU2V0dGVycyA9IG51bGw7CiAgICAgIGluZm8ubGF6eUludGVyZmFjZUdldHRlcnNBbmRDYWxscyA9IG51bGw7CiAgICAgIGluZm8ubGF6eUludGVyZmFjZVNldHRlcnMgPSBudWxsOwogICAgfQogICAgYXNzZXJ0KHNhbml0eUNoZWNrcygpKTsKCiAgICByZXR1cm4gdGhpczsKICB9CgogIGJvb2wgc2FuaXR5Q2hlY2tzKCkgewogICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IG1hcCA9IHt9OwogICAgZm9yIChDbGFzcyBjIGluIF9pbmZvTWFwLmtleXMpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICIke2MuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcml9Ojoke2MubmFtZX0iOwogICAgICBMaXN0PENsYXNzPiBsaXN0ID0gbWFwW2NsYXNzTmFtZV07CiAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKICAgICAgICBtYXBbY2xhc3NOYW1lXSA9IGxpc3QgPSBbXTsKICAgICAgfQogICAgICBsaXN0LmFkZChjKTsKICAgIH0KCiAgICBTdHJpbmdCdWZmZXIgc2I7CiAgICBmb3IgKE1hcEVudHJ5PFN0cmluZywgTGlzdDxDbGFzcz4+IGVudHJ5IGluIG1hcC5lbnRyaWVzKSB7CiAgICAgIGlmIChlbnRyeS52YWx1ZS5sZW5ndGggIT0gMSkgewogICAgICAgIHNiID8/PSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgc2Iud3JpdGVsbigiRm91bmQgJHtlbnRyeS52YWx1ZS5sZW5ndGh9IGVudHJpZXMgZm9yICR7ZW50cnkua2V5fSIpOwogICAgICB9CiAgICB9CiAgICBpZiAoc2IgIT0gbnVsbCkgdGhyb3cgbmV3IFN0YXRlRXJyb3Ioc2IudG9TdHJpbmcoKSk7CgogICAgZm9yIChDbGFzcyBjIGluIF9pbmZvTWFwLmtleXMpIHsKICAgICAgaWYgKCFrbm93bkxpYnJhcmllcy5jb250YWlucyhjLmVuY2xvc2luZ0xpYnJhcnkpKSB7CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkRpZG4ndCBrbm93IGxpYnJhcnkgb2YgJGMgKGZyb20gJHtjLmZpbGVVcml9KSIpOwogICAgICB9CiAgICB9CgogICAgZm9yIChfQ2xhc3NJbmZvIGluZm8gaW4gX2luZm9NYXAudmFsdWVzKSB7CiAgICAgIGZvciAoX0NsYXNzSW5mbyBzdWJJbmZvIGluIGluZm8uZGlyZWN0RXh0ZW5kZXJzKSB7CiAgICAgICAgaWYgKCFfaW5mb01hcC5jb250YWluc0tleShzdWJJbmZvLmNsYXNzTm9kZSkpCiAgICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgICAiRm91bmQgJHN1YkluZm8gKCR7c3ViSW5mby5jbGFzc05vZGV9KSBpbiBkaXJlY3RFeHRlbmRlcnMiKTsKICAgICAgfQogICAgICBmb3IgKF9DbGFzc0luZm8gc3ViSW5mbyBpbiBpbmZvLmRpcmVjdE1peGVycykgewogICAgICAgIGlmICghX2luZm9NYXAuY29udGFpbnNLZXkoc3ViSW5mby5jbGFzc05vZGUpKQogICAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICAgIkZvdW5kICRzdWJJbmZvICgke3N1YkluZm8uY2xhc3NOb2RlfSkgaW4gZGlyZWN0TWl4ZXJzIik7CiAgICAgIH0KICAgICAgZm9yIChfQ2xhc3NJbmZvIHN1YkluZm8gaW4gaW5mby5kaXJlY3RJbXBsZW1lbnRlcnMpIHsKICAgICAgICBpZiAoIV9pbmZvTWFwLmNvbnRhaW5zS2V5KHN1YkluZm8uY2xhc3NOb2RlKSkKICAgICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAgICJGb3VuZCAkc3ViSW5mbyAoJHtzdWJJbmZvLmNsYXNzTm9kZX0pIGluIGRpcmVjdEltcGxlbWVudGVycyIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIFN1cGVydHlwZSBhc0luc3RhbnRpYXRpb25PZihTdXBlcnR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIGdldFR5cGVBc0luc3RhbmNlT2YsIGV4Y2VwdCB0aGF0IGl0IGFzc3VtZXMgdGhhdAogICAgLy8gc3VwZXJjbGFzcyBpcyBhIGdlbmVyaWMgY2xhc3MuICBJdCB0aHVzIGRvZXMgbm90IHJlbHkgb24gYmVpbmcgYWJsZQogICAgLy8gdG8gYW5zd2VyIGlzU3VidHlwZU9mIHF1ZXJpZXMgYW5kIHNvIGNhbiBiZSB1c2VkIGJlZm9yZSB3ZSBoYXZlIGJ1aWx0CiAgICAvLyB0aGUgaW50ZXJ2YWxzIG5lZWRlZCBmb3IgdGhvc2UgcXVlcmllcy4KICAgIGFzc2VydChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpOwogICAgaWYgKHR5cGUuY2xhc3NOb2RlID09IHN1cGVyY2xhc3MpIHsKICAgICAgcmV0dXJuIHN1cGVyY2xhc3MuYXNUaGlzU3VwZXJ0eXBlOwogICAgfQogICAgdmFyIG1hcCA9IGluZm9Gb3IodHlwZS5jbGFzc05vZGUpPy5nZW5lcmljU3VwZXJUeXBlOwogICAgcmV0dXJuIG1hcCA9PSBudWxsID8gbnVsbCA6IG1hcFtzdXBlcmNsYXNzXTsKICB9CgogIHZvaWQgX2luaXRpYWxpemUoTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpIHsKICAgIC8vIEJ1aWxkIHRoZSBjbGFzcyBvcmRlcmluZyBiYXNlZCBvbiBhIHRvcG9sb2dpY2FsIHNvcnQuCiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGxpYnJhcmllcykgewogICAgICBmb3IgKHZhciBjbGFzc05vZGUgaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgX3RvcG9sb2dpY2FsU29ydFZpc2l0KGNsYXNzTm9kZSwgbmV3IFNldDxDbGFzcz4oKSk7CiAgICAgIH0KICAgICAga25vd25MaWJyYXJpZXMuYWRkKGxpYnJhcnkpOwogICAgfQoKICAgIF9pbml0aWFsaXplVG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMoX2luZm9NYXAua2V5cywgMCk7CiAgfQoKICAvLy8gLSBCdWlsZCBpbmRleCBvZiBkaXJlY3QgY2hpbGRyZW4uCiAgLy8vIC0gQnVpbGQgbGlzdCBvZiBzdXBlciBjbGFzc2VzIGFuZCBzdXBlciB0eXBlcy4KICAvLy8gLSBJbmZlciBhbmQgcmVjb3JkIHN1cGVydHlwZXMgZm9yIHRoZSBjbGFzc2VzLgogIC8vLyAtIFJlY29yZCBpbnRlcmZhY2UgbWVtYmVycy4KICAvLy8gLSBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNraW5nLgogIC8vLyBEbyB0aGlzIGFmdGVyIHRoZSB0b3BvbG9naWNhbCBzb3J0IHNvIHRoYXQgc3VwZXIgdHlwZXMgYWx3YXlzIG9jY3VyCiAgLy8vIGJlZm9yZSBzdWJ0eXBlcy4KICB2b2lkIF9pbml0aWFsaXplVG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMoCiAgICAgIEl0ZXJhYmxlPENsYXNzPiBjbGFzc2VzLCBpbnQgZXhwZWN0ZWRTdGFydGluZ1RvcG9sb2dpY2FsSW5kZXgpIHsKICAgIGludCBpID0gZXhwZWN0ZWRTdGFydGluZ1RvcG9sb2dpY2FsSW5kZXg7CiAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBjbGFzc2VzKSB7CiAgICAgIF9DbGFzc0luZm8gaW5mbyA9IF9pbmZvTWFwW2NsYXNzX107CiAgICAgIGlmIChjbGFzc18uc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICBfaW5mb01hcFtjbGFzc18uc3VwZXJ0eXBlLmNsYXNzTm9kZV0uZGlyZWN0RXh0ZW5kZXJzLmFkZChpbmZvKTsKICAgICAgfQogICAgICBpZiAoY2xhc3NfLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICBfaW5mb01hcFtjbGFzc18ubWl4ZWRJblR5cGUuY2xhc3NOb2RlXS5kaXJlY3RNaXhlcnMuYWRkKGluZm8pOwogICAgICB9CiAgICAgIGZvciAodmFyIHN1cGVydHlwZSBpbiBjbGFzc18uaW1wbGVtZW50ZWRUeXBlcykgewogICAgICAgIF9pbmZvTWFwW3N1cGVydHlwZS5jbGFzc05vZGVdLmRpcmVjdEltcGxlbWVudGVycy5hZGQoaW5mbyk7CiAgICAgIH0KICAgICAgX2NvbGxlY3RTdXBlcnNGb3JDbGFzcyhjbGFzc18pOwoKICAgICAgaWYgKGNsYXNzXy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICAgIF9yZWNvcmRTdXBlclR5cGVzKGluZm8sIGNsYXNzXy5zdXBlcnR5cGUpOwogICAgICB9CiAgICAgIGlmIChjbGFzc18ubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICAgIG1peGluSW5mZXJyZXI/LmluZmVyKHRoaXMsIGNsYXNzXyk7CiAgICAgICAgX3JlY29yZFN1cGVyVHlwZXMoaW5mbywgY2xhc3NfLm1peGVkSW5UeXBlKTsKICAgICAgfQogICAgICBmb3IgKFN1cGVydHlwZSBzdXBlcnR5cGUgaW4gY2xhc3NfLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgICBfcmVjb3JkU3VwZXJUeXBlcyhpbmZvLCBzdXBlcnR5cGUpOwogICAgICB9CgogICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgIk5vIGluZm8gZm9yICR7Y2xhc3NfLm5hbWV9IGZyb20gJHtjbGFzc18uZmlsZVVyaX0uIjsKICAgICAgfQogICAgICBpZiAoaW5mby50b3BvbG9naWNhbEluZGV4ICE9IGkpIHsKICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCB0b3BvbG9naWNhbEluZGV4ICgke2luZm8udG9wb2xvZ2ljYWxJbmRleH0gIT0gJGkpICIKICAgICAgICAgICAgImZvciAke2NsYXNzXy5uYW1lfSBmcm9tICR7Y2xhc3NfLmZpbGVVcml9LiI7CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogIH0KCiAgLy8vIFVwd2FyZHMgdHJhdmVyc2FsIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgdGhhdCBvcmRlcnMgY2xhc3NlcyBzbyBzdXBlcgogIC8vLyB0eXBlcyBiZWZvcmUgdGhlaXIgc3VidHlwZXMuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIGRlcHRoIG9mIHRoZSB2aXNpdGVkIGNsYXNzICh0aGUgbnVtYmVyIG9mIHN0ZXBzIGluIHRoZSBsb25nZXN0CiAgLy8vIGluaGVyaXRhbmNlIHBhdGggdG8gdGhlIHJvb3QgY2xhc3MpLgogIGludCBfdG9wU29ydEluZGV4ID0gMDsKICBpbnQgX3RvcG9sb2dpY2FsU29ydFZpc2l0KENsYXNzIGNsYXNzTm9kZSwgU2V0PENsYXNzPiBiZWluZ1Zpc2l0ZWQsCiAgICAgIHtMaXN0PENsYXNzPiBvcmRlcmVkTGlzdH0pIHsKICAgIHZhciBpbmZvID0gX2luZm9NYXBbY2xhc3NOb2RlXTsKICAgIGlmIChpbmZvICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGluZm8uZGVwdGg7CiAgICB9CgogICAgaWYgKCFiZWluZ1Zpc2l0ZWQuYWRkKGNsYXNzTm9kZSkpIHsKICAgICAgdGhyb3cgJ0N5Y2xpYyBpbmhlcml0YW5jZSBpbnZvbHZpbmcgJHtjbGFzc05vZGUubmFtZX0nOwogICAgfQoKICAgIGluZm8gPSBuZXcgX0NsYXNzSW5mbyhjbGFzc05vZGUpOwoKICAgIGludCBzdXBlckRlcHRoID0gLTE7CiAgICBpZiAoY2xhc3NOb2RlLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIHN1cGVyRGVwdGggPSBtYXgoCiAgICAgICAgICBzdXBlckRlcHRoLAogICAgICAgICAgX3RvcG9sb2dpY2FsU29ydFZpc2l0KGNsYXNzTm9kZS5zdXBlcnR5cGUuY2xhc3NOb2RlLCBiZWluZ1Zpc2l0ZWQsCiAgICAgICAgICAgICAgb3JkZXJlZExpc3Q6IG9yZGVyZWRMaXN0KSk7CiAgICB9CiAgICBpZiAoY2xhc3NOb2RlLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgc3VwZXJEZXB0aCA9IG1heCgKICAgICAgICAgIHN1cGVyRGVwdGgsCiAgICAgICAgICBfdG9wb2xvZ2ljYWxTb3J0VmlzaXQoY2xhc3NOb2RlLm1peGVkSW5UeXBlLmNsYXNzTm9kZSwgYmVpbmdWaXNpdGVkLAogICAgICAgICAgICAgIG9yZGVyZWRMaXN0OiBvcmRlcmVkTGlzdCkpOwogICAgfQogICAgZm9yICh2YXIgc3VwZXJ0eXBlIGluIGNsYXNzTm9kZS5pbXBsZW1lbnRlZFR5cGVzKSB7CiAgICAgIHN1cGVyRGVwdGggPSBtYXgoCiAgICAgICAgICBzdXBlckRlcHRoLAogICAgICAgICAgX3RvcG9sb2dpY2FsU29ydFZpc2l0KHN1cGVydHlwZS5jbGFzc05vZGUsIGJlaW5nVmlzaXRlZCwKICAgICAgICAgICAgICBvcmRlcmVkTGlzdDogb3JkZXJlZExpc3QpKTsKICAgIH0KCiAgICBpbmZvLnRvcG9sb2dpY2FsSW5kZXggPSBfdG9wU29ydEluZGV4Kys7CgogICAgX2luZm9NYXBbY2xhc3NOb2RlXSA9IGluZm87CiAgICBvcmRlcmVkTGlzdD8uYWRkKGNsYXNzTm9kZSk7CiAgICBiZWluZ1Zpc2l0ZWQucmVtb3ZlKGNsYXNzTm9kZSk7CiAgICByZXR1cm4gaW5mby5kZXB0aCA9IHN1cGVyRGVwdGggKyAxOwogIH0KCiAgTGlzdDxNZW1iZXI+IF9idWlsZEltcGxlbWVudGVkTWVtYmVycyhDbGFzcyBjbGFzc05vZGUsIF9DbGFzc0luZm8gaW5mbywKICAgICAge2Jvb2wgc2V0dGVyc30pIHsKICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgdGhyb3cgIiR7Y2xhc3NOb2RlLmZpbGVVcml9OiBObyBjbGFzcyBpbmZvIGZvciAke2NsYXNzTm9kZS5uYW1lfSI7CiAgICB9CiAgICBMaXN0PE1lbWJlcj4gbWVtYmVycyA9IHNldHRlcnMKICAgICAgICA/IGluZm8ubGF6eUltcGxlbWVudGVkU2V0dGVycwogICAgICAgIDogaW5mby5sYXp5SW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHM7CiAgICBpZiAobWVtYmVycyAhPSBudWxsKSByZXR1cm4gbWVtYmVyczsKCiAgICBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkOwogICAgaWYgKGNsYXNzTm9kZS5zdXBlcnR5cGUgPT0gbnVsbCkgewogICAgICBpbmhlcml0ZWQgPSBjb25zdCA8TWVtYmVyPltdOwogICAgfSBlbHNlIHsKICAgICAgQ2xhc3Mgc3VwZXJDbGFzc05vZGUgPSBjbGFzc05vZGUuc3VwZXJ0eXBlLmNsYXNzTm9kZTsKICAgICAgX0NsYXNzSW5mbyBzdXBlckluZm8gPSBfaW5mb01hcFtzdXBlckNsYXNzTm9kZV07CiAgICAgIGluaGVyaXRlZCA9CiAgICAgICAgICBfYnVpbGRJbXBsZW1lbnRlZE1lbWJlcnMoc3VwZXJDbGFzc05vZGUsIHN1cGVySW5mbywgc2V0dGVyczogc2V0dGVycyk7CiAgICB9CiAgICBtZW1iZXJzID0gX2luaGVyaXRNZW1iZXJzKAogICAgICAgIF9idWlsZERlY2xhcmVkTWVtYmVycyhjbGFzc05vZGUsIGluZm8sIHNldHRlcnM6IHNldHRlcnMpLCBpbmhlcml0ZWQsCiAgICAgICAgc2tpcEFic3RyYWN0TWVtYmVyczogdHJ1ZSk7CiAgICBpZiAoc2V0dGVycykgewogICAgICBpbmZvLmxhenlJbXBsZW1lbnRlZFNldHRlcnMgPSBtZW1iZXJzOwogICAgfSBlbHNlIHsKICAgICAgaW5mby5sYXp5SW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHMgPSBtZW1iZXJzOwogICAgfQogICAgcmV0dXJuIG1lbWJlcnM7CiAgfQoKICBMaXN0PE1lbWJlcj4gX2J1aWxkRGVjbGFyZWRNZW1iZXJzKENsYXNzIGNsYXNzTm9kZSwgX0NsYXNzSW5mbyBpbmZvLAogICAgICB7Ym9vbCBzZXR0ZXJzfSkgewogICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICB0aHJvdyAiJHtjbGFzc05vZGUuZmlsZVVyaX06IE5vIGNsYXNzIGluZm8gZm9yICR7Y2xhc3NOb2RlLm5hbWV9IjsKICAgIH0KICAgIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0KICAgICAgICBzZXR0ZXJzID8gaW5mby5sYXp5RGVjbGFyZWRTZXR0ZXJzIDogaW5mby5sYXp5RGVjbGFyZWRHZXR0ZXJzQW5kQ2FsbHM7CiAgICBpZiAobWVtYmVycyAhPSBudWxsKSByZXR1cm4gbWVtYmVyczsKCiAgICBpZiAoY2xhc3NOb2RlLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgQ2xhc3MgbWl4ZWRJbkNsYXNzTm9kZSA9IGNsYXNzTm9kZS5taXhlZEluVHlwZS5jbGFzc05vZGU7CiAgICAgIF9DbGFzc0luZm8gbWl4ZWRJbkluZm8gPSBfaW5mb01hcFttaXhlZEluQ2xhc3NOb2RlXTsKCiAgICAgIG1lbWJlcnMgPSA8TWVtYmVyPltdOwogICAgICBmb3IgKE1lbWJlciBtaXhpbk1lbWJlciBpbiBfYnVpbGREZWNsYXJlZE1lbWJlcnMoCiAgICAgICAgICBtaXhlZEluQ2xhc3NOb2RlLCBtaXhlZEluSW5mbywKICAgICAgICAgIHNldHRlcnM6IHNldHRlcnMpKSB7CiAgICAgICAgaWYgKG1peGluTWVtYmVyIGlzISBQcm9jZWR1cmUgfHwKICAgICAgICAgICAgKG1peGluTWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgICAgICAgIW1peGluTWVtYmVyLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyKSkgewogICAgICAgICAgbWVtYmVycy5hZGQobWl4aW5NZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbWVtYmVycyA9IG5ldyBMaXN0PE1lbWJlcj4oKTsKICAgICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGNsYXNzTm9kZS5wcm9jZWR1cmVzKSB7CiAgICAgICAgaWYgKHByb2NlZHVyZS5pc1N0YXRpYykgY29udGludWU7CiAgICAgICAgaWYgKHByb2NlZHVyZS5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSB7CiAgICAgICAgICBpZiAoc2V0dGVycykgewogICAgICAgICAgICBtZW1iZXJzLmFkZChwcm9jZWR1cmUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXNldHRlcnMpIHsKICAgICAgICAgICAgbWVtYmVycy5hZGQocHJvY2VkdXJlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChGaWVsZCBmaWVsZCBpbiBjbGFzc05vZGUuZmllbGRzKSB7CiAgICAgICAgaWYgKGZpZWxkLmlzU3RhdGljKSBjb250aW51ZTsKICAgICAgICBpZiAoIXNldHRlcnMgJiYgZmllbGQuaGFzSW1wbGljaXRHZXR0ZXIpIHsKICAgICAgICAgIG1lbWJlcnMuYWRkKGZpZWxkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNldHRlcnMgJiYgZmllbGQuaGFzSW1wbGljaXRTZXR0ZXIpIHsKICAgICAgICAgIG1lbWJlcnMuYWRkKGZpZWxkKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIG1lbWJlcnMuc29ydChDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyk7CiAgICB9CgogICAgaWYgKHNldHRlcnMpIHsKICAgICAgaW5mby5sYXp5RGVjbGFyZWRTZXR0ZXJzID0gbWVtYmVyczsKICAgIH0gZWxzZSB7CiAgICAgIGluZm8ubGF6eURlY2xhcmVkR2V0dGVyc0FuZENhbGxzID0gbWVtYmVyczsKICAgIH0KICAgIHJldHVybiBtZW1iZXJzOwogIH0KCiAgTGlzdDxNZW1iZXI+IF9idWlsZEludGVyZmFjZU1lbWJlcnMoQ2xhc3MgY2xhc3NOb2RlLCBfQ2xhc3NJbmZvIGluZm8sCiAgICAgIHtib29sIHNldHRlcnN9KSB7CiAgICBpZiAoaW5mbyA9PSBudWxsKSB7CiAgICAgIHRocm93ICIke2NsYXNzTm9kZS5maWxlVXJpfTogTm8gY2xhc3MgaW5mbyBmb3IgJHtjbGFzc05vZGUubmFtZX0iOwogICAgfQogICAgTGlzdDxNZW1iZXI+IG1lbWJlcnMgPQogICAgICAgIHNldHRlcnMgPyBpbmZvLmxhenlJbnRlcmZhY2VTZXR0ZXJzIDogaW5mby5sYXp5SW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzOwogICAgaWYgKG1lbWJlcnMgIT0gbnVsbCkgcmV0dXJuIG1lbWJlcnM7CiAgICBMaXN0PE1lbWJlcj4gYWxsSW5oZXJpdGVkTWVtYmVycyA9IDxNZW1iZXI+W107CiAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWQgPQogICAgICAgIF9idWlsZERlY2xhcmVkTWVtYmVycyhjbGFzc05vZGUsIGluZm8sIHNldHRlcnM6IHNldHRlcnMpOwoKICAgIHZvaWQgaW5oZXJpdEZyb20oU3VwZXJ0eXBlIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgICBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkID0gX2J1aWxkSW50ZXJmYWNlTWVtYmVycygKICAgICAgICAgIHR5cGUuY2xhc3NOb2RlLCBfaW5mb01hcFt0eXBlLmNsYXNzTm9kZV0sCiAgICAgICAgICBzZXR0ZXJzOiBzZXR0ZXJzKTsKICAgICAgaW5oZXJpdGVkID0gX2dldFVuc2hhZG93ZWRJbmhlcml0ZWRNZW1iZXJzKGRlY2xhcmVkLCBpbmhlcml0ZWQpOwogICAgICBhbGxJbmhlcml0ZWRNZW1iZXJzID0KICAgICAgICAgIENsYXNzSGllcmFyY2h5Lm1lcmdlU29ydGVkTGlzdHMoYWxsSW5oZXJpdGVkTWVtYmVycywgaW5oZXJpdGVkKTsKICAgIH0KCiAgICBpbmhlcml0RnJvbShjbGFzc05vZGUuc3VwZXJ0eXBlKTsKICAgIGluaGVyaXRGcm9tKGNsYXNzTm9kZS5taXhlZEluVHlwZSk7CiAgICBjbGFzc05vZGUuaW1wbGVtZW50ZWRUeXBlcy5mb3JFYWNoKGluaGVyaXRGcm9tKTsKICAgIG1lbWJlcnMgPSBfaW5oZXJpdE1lbWJlcnMoZGVjbGFyZWQsIGFsbEluaGVyaXRlZE1lbWJlcnMpOwogICAgaWYgKHNldHRlcnMpIHsKICAgICAgaW5mby5sYXp5SW50ZXJmYWNlU2V0dGVycyA9IG1lbWJlcnM7CiAgICB9IGVsc2UgewogICAgICBpbmZvLmxhenlJbnRlcmZhY2VHZXR0ZXJzQW5kQ2FsbHMgPSBtZW1iZXJzOwogICAgfQogICAgcmV0dXJuIG1lbWJlcnM7CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIGxpc3Qgb2YgaW1wbGVtZW50ZWQgbWVtYmVycywgYmFzZWQgb24gdGhlIGRlY2xhcmVkIGluc3RhbmNlCiAgLy8vIG1lbWJlcnMgYW5kIGluaGVyaXRlZCBpbnN0YW5jZSBtZW1iZXJzLgogIC8vLwogIC8vLyBCb3RoIGxpc3RzIG11c3QgYmUgc29ydGVkIGJ5IG5hbWUgYmVmb3JlaGFuZC4KICBzdGF0aWMgTGlzdDxNZW1iZXI+IF9pbmhlcml0TWVtYmVycygKICAgICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkLCBMaXN0PE1lbWJlcj4gaW5oZXJpdGVkLAogICAgICB7Ym9vbCBza2lwQWJzdHJhY3RNZW1iZXJzOiBmYWxzZX0pIHsKICAgIExpc3Q8TWVtYmVyPiByZXN1bHQgPSA8TWVtYmVyPltdLi5sZW5ndGggPQogICAgICAgIGRlY2xhcmVkLmxlbmd0aCArIGluaGVyaXRlZC5sZW5ndGg7CiAgICAvLyBTaW5jZSBib3RoIGxpc3RzIGFyZSBzb3J0ZWQsIHdlIGNhbiBmdXNlIHRoZW0gbGlrZSBpbiBtZXJnZSBzb3J0LgogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIHdoaWxlIChpIDwgZGVjbGFyZWQubGVuZ3RoICYmIGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciA9IGRlY2xhcmVkW2ldOwogICAgICBNZW1iZXIgaW5oZXJpdGVkTWVtYmVyID0gaW5oZXJpdGVkW2pdOwogICAgICBpZiAoc2tpcEFic3RyYWN0TWVtYmVycyAmJiBkZWNsYXJlZE1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgKytpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChza2lwQWJzdHJhY3RNZW1iZXJzICYmIGluaGVyaXRlZE1lbWJlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgKytqOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGludCBjb21wYXJpc29uID0KICAgICAgICAgIENsYXNzSGllcmFyY2h5LmNvbXBhcmVNZW1iZXJzKGRlY2xhcmVkTWVtYmVyLCBpbmhlcml0ZWRNZW1iZXIpOwogICAgICBpZiAoY29tcGFyaXNvbiA8IDApIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGRlY2xhcmVkTWVtYmVyOwogICAgICAgICsraTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uID4gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkTWVtYmVyOwogICAgICAgICsrajsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IGRlY2xhcmVkTWVtYmVyOwogICAgICAgICsraTsKICAgICAgICArK2o7IC8vIE1vdmUgcGFzdCBvdmVycmlkZGVuIG1lbWJlci4KICAgICAgfQogICAgfQogICAgLy8gT25lIG9mIHRoZSB0d28gbGlzdHMgaXMgbm93IGV4aGF1c3RlZCwgY29weSBvdmVyIHRoZSByZW1haW5zLgogICAgd2hpbGUgKGkgPCBkZWNsYXJlZC5sZW5ndGgpIHsKICAgICAgTWVtYmVyIGRlY2xhcmVkTWVtYmVyID0gZGVjbGFyZWRbaSsrXTsKICAgICAgaWYgKHNraXBBYnN0cmFjdE1lbWJlcnMgJiYgZGVjbGFyZWRNZW1iZXIuaXNBYnN0cmFjdCkgY29udGludWU7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gZGVjbGFyZWRNZW1iZXI7CiAgICB9CiAgICB3aGlsZSAoaiA8IGluaGVyaXRlZC5sZW5ndGgpIHsKICAgICAgTWVtYmVyIGluaGVyaXRlZE1lbWJlciA9IGluaGVyaXRlZFtqKytdOwogICAgICBpZiAoc2tpcEFic3RyYWN0TWVtYmVycyAmJiBpbmhlcml0ZWRNZW1iZXIuaXNBYnN0cmFjdCkgY29udGludWU7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkTWVtYmVyOwogICAgfQogICAgcmVzdWx0Lmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHN1YnNldCBvZiBtZW1iZXJzIGluIFtpbmhlcml0ZWRdIGZvciB3aGljaCBhIG1lbWJlciB3aXRoIHRoZQogIC8vLyBzYW1lIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gW2RlY2xhcmVkXS4KICAvLy8KICAvLy8gVGhlIGlucHV0IGxpc3RzIG11c3QgYmUgc29ydGVkLCBhbmQgdGhlIHJldHVybmVkIGxpc3QgaXMgc29ydGVkLgogIHN0YXRpYyBMaXN0PE1lbWJlcj4gX2dldFVuc2hhZG93ZWRJbmhlcml0ZWRNZW1iZXJzKAogICAgICBMaXN0PE1lbWJlcj4gZGVjbGFyZWQsIExpc3Q8TWVtYmVyPiBpbmhlcml0ZWQpIHsKICAgIExpc3Q8TWVtYmVyPiByZXN1bHQgPSA8TWVtYmVyPltdLi5sZW5ndGggPSBpbmhlcml0ZWQubGVuZ3RoOwogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIHdoaWxlIChpIDwgZGVjbGFyZWQubGVuZ3RoICYmIGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciA9IGRlY2xhcmVkW2ldOwogICAgICBNZW1iZXIgaW5oZXJpdGVkTWVtYmVyID0gaW5oZXJpdGVkW2pdOwogICAgICBpbnQgY29tcGFyaXNvbiA9CiAgICAgICAgICBDbGFzc0hpZXJhcmNoeS5jb21wYXJlTWVtYmVycyhkZWNsYXJlZE1lbWJlciwgaW5oZXJpdGVkTWVtYmVyKTsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgKytpOwogICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgcmVzdWx0W3N0b3JlSW5kZXgrK10gPSBpbmhlcml0ZWRNZW1iZXI7CiAgICAgICAgKytqOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIE1vdmUgcGFzdCB0aGUgc2hhZG93ZWQgbWVtYmVyLCBidXQgcmV0YWluIHRoZSBkZWNsYXJlZCBtZW1iZXIsIGFzCiAgICAgICAgLy8gaXQgbWF5IHNoYWRvdyBtdWx0aXBsZSBtZW1iZXJzLgogICAgICAgICsrajsKICAgICAgfQogICAgfQogICAgLy8gSWYgdGhlIGxpc3Qgb2YgZGVjbGFyZWQgbWVtYmVycyBpcyBleGhhdXN0ZWQsIGNvcHkgb3ZlciB0aGUgcmVtYWlucyBvZgogICAgLy8gdGhlIGluaGVyaXRlZCBtZW1iZXJzLgogICAgd2hpbGUgKGogPCBpbmhlcml0ZWQubGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaW5oZXJpdGVkW2orK107CiAgICB9CiAgICByZXN1bHQubGVuZ3RoID0gc3RvcmVJbmRleDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9yZWNvcmRTdXBlclR5cGVzKF9DbGFzc0luZm8gc3ViSW5mbywgU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogICAgX0NsYXNzSW5mbyBzdXBlckluZm8gPSBfaW5mb01hcFtzdXBlcnR5cGUuY2xhc3NOb2RlXTsKICAgIGlmIChzdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIGlmIChzdXBlckluZm8uZ2VuZXJpY1N1cGVyVHlwZXMgPT0gbnVsbCkgcmV0dXJuOwogICAgICAvLyBDb3B5IG92ZXIgdGhlIHN1cGVyIHR5cGUgZW50cmllcy4KICAgICAgc3ViSW5mby5nZW5lcmljU3VwZXJUeXBlID8/PSA8Q2xhc3MsIFN1cGVydHlwZT57fTsKICAgICAgc3ViSW5mby5nZW5lcmljU3VwZXJUeXBlcyA/Pz0gPENsYXNzLCBMaXN0PFN1cGVydHlwZT4+e307CiAgICAgIHN1cGVySW5mby5nZW5lcmljU3VwZXJUeXBlcz8uZm9yRWFjaCgoQ2xhc3Mga2V5LCBMaXN0PFN1cGVydHlwZT4gdHlwZXMpIHsKICAgICAgICBmb3IgKFN1cGVydHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgICAgICBzdWJJbmZvLnJlY29yZEdlbmVyaWNTdXBlclR5cGUoCiAgICAgICAgICAgICAgY29yZVR5cGVzLCBrZXksIHR5cGUsIF9vbkFtYmlndW91c1N1cGVydHlwZXMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICAvLyBDb3B5IG92ZXIgYWxsIHRyYW5zaXRpdmUgZ2VuZXJpYyBzdXBlciB0eXBlcywgYW5kIHN1YnN0aXR1dGUgdGhlCiAgICAgIC8vIGZyZWUgdmFyaWFibGVzIHdpdGggdGhvc2UgcHJvdmlkZWQgaW4gW3N1cGVydHlwZV0uCiAgICAgIENsYXNzIHN1cGVyY2xhc3MgPSBzdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgICB2YXIgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMsIHN1cGVydHlwZS50eXBlQXJndW1lbnRzKTsKICAgICAgc3ViSW5mby5nZW5lcmljU3VwZXJUeXBlID8/PSA8Q2xhc3MsIFN1cGVydHlwZT57fTsKICAgICAgc3ViSW5mby5nZW5lcmljU3VwZXJUeXBlcyA/Pz0gPENsYXNzLCBMaXN0PFN1cGVydHlwZT4+e307CiAgICAgIHN1cGVySW5mby5nZW5lcmljU3VwZXJUeXBlcz8uZm9yRWFjaCgoQ2xhc3Mga2V5LCBMaXN0PFN1cGVydHlwZT4gdHlwZXMpIHsKICAgICAgICBmb3IgKFN1cGVydHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgICAgICBzdWJJbmZvLnJlY29yZEdlbmVyaWNTdXBlclR5cGUoY29yZVR5cGVzLCBrZXksCiAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUodHlwZSksIF9vbkFtYmlndW91c1N1cGVydHlwZXMpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBzdWJJbmZvLnJlY29yZEdlbmVyaWNTdXBlclR5cGUoCiAgICAgICAgICBjb3JlVHlwZXMsIHN1cGVyY2xhc3MsIHN1cGVydHlwZSwgX29uQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CiAgICB9CiAgfQoKICAvLy8gQnVpbGQgbGlzdHMgb2Ygc3VwZXIgdHlwZXMgYW5kIHN1cGVyIGNsYXNzZXMuCiAgLy8vIE5vdGUgdGhhdCB0aGUgc3VwZXIgY2xhc3MgYW5kIHN1cGVyIHR5cGVzIG9mIHRoZSBjbGFzcyBtdXN0IGFscmVhZHkgaGF2ZQogIC8vLyBoYWQgdGhlaXIgc3VwZXJzIGNvbGxlY3RlZC4KICB2b2lkIF9jb2xsZWN0U3VwZXJzRm9yQ2xhc3MoQ2xhc3MgY2xhc3NfKSB7CiAgICBfQ2xhc3NJbmZvIGluZm8gPSBfaW5mb01hcFtjbGFzc19dOwoKICAgIHZhciBzdXBlcmNsYXNzU2V0QnVpbGRlciA9IG5ldyBfSW50ZXJ2YWxMaXN0QnVpbGRlcigpCiAgICAgIC4uYWRkU2luZ2xldG9uKGluZm8udG9wb2xvZ2ljYWxJbmRleCk7CiAgICB2YXIgc3VwZXJ0eXBlU2V0QnVpbGRlciA9IG5ldyBfSW50ZXJ2YWxMaXN0QnVpbGRlcigpCiAgICAgIC4uYWRkU2luZ2xldG9uKGluZm8udG9wb2xvZ2ljYWxJbmRleCk7CgogICAgaWYgKGNsYXNzXy5zdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICBfQ2xhc3NJbmZvIHN1cGVydHlwZUluZm8gPSBfaW5mb01hcFtjbGFzc18uc3VwZXJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIHN1cGVyY2xhc3NTZXRCdWlsZGVyCiAgICAgICAgICAuYWRkSW50ZXJ2YWxMaXN0KHN1cGVydHlwZUluZm8uc3VwZXJjbGFzc0ludGVydmFsTGlzdCk7CiAgICAgIHN1cGVydHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1cGVydHlwZUluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KCiAgICBpZiAoY2xhc3NfLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgX0NsYXNzSW5mbyBtaXhlZEluVHlwZUluZm8gPSBfaW5mb01hcFtjbGFzc18ubWl4ZWRJblR5cGUuY2xhc3NOb2RlXTsKICAgICAgc3VwZXJ0eXBlU2V0QnVpbGRlcgogICAgICAgICAgLmFkZEludGVydmFsTGlzdChtaXhlZEluVHlwZUluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KCiAgICBmb3IgKFN1cGVydHlwZSBzdXBlcnR5cGUgaW4gY2xhc3NfLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgX0NsYXNzSW5mbyBzdXBlcnR5cGVJbmZvID0gX2luZm9NYXBbc3VwZXJ0eXBlLmNsYXNzTm9kZV07CiAgICAgIHN1cGVydHlwZVNldEJ1aWxkZXIuYWRkSW50ZXJ2YWxMaXN0KHN1cGVydHlwZUluZm8uc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0KTsKICAgIH0KCiAgICBpbmZvLnN1cGVyY2xhc3NJbnRlcnZhbExpc3QgPSBzdXBlcmNsYXNzU2V0QnVpbGRlci5idWlsZEludGVydmFsTGlzdCgpOwogICAgaW5mby5zdXBlcnR5cGVJbnRlcnZhbExpc3QgPSBzdXBlcnR5cGVTZXRCdWlsZGVyLmJ1aWxkSW50ZXJ2YWxMaXN0KCk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGhpc3RvZ3JhbSBzdWNoIHRoYXQgaW5kZXggYE5gIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgY2xhc3NlcwogIC8vLyB0aGF0IGhhdmUgYE5gIGludGVydmFscyBpbiBpdHMgc3VwZXJ0eXBlIHNldC4KICAvLy8KICAvLy8gVGhlIG1vcmUgbnVtYmVycyBhcmUgY29uZGVuc2VkIG5lYXIgdGhlIGJlZ2lubmluZywgdGhlIG1vcmUgZWZmaWNpZW50IHRoZQogIC8vLyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBpcy4KICBMaXN0PGludD4gZ2V0RXhwZW5zZUhpc3RvZ3JhbSgpIHsKICAgIHZhciByZXN1bHQgPSA8aW50PltdOwogICAgZm9yIChDbGFzcyBjbGFzc18gaW4gX2luZm9NYXAua2V5cykgewogICAgICB2YXIgaW5mbyA9IF9pbmZvTWFwW2NsYXNzX107CiAgICAgIGludCBpbnRlcnZhbHMgPSBpbmZvLnN1cGVydHlwZUludGVydmFsTGlzdC5sZW5ndGggfi8gMjsKICAgICAgaWYgKGludGVydmFscyA+PSByZXN1bHQubGVuZ3RoKSB7CiAgICAgICAgaW50IG9sZExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7CiAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGludGVydmFscyArIDE7CiAgICAgICAgcmVzdWx0LmZpbGxSYW5nZShvbGRMZW5ndGgsIHJlc3VsdC5sZW5ndGgsIDApOwogICAgICB9CiAgICAgIHJlc3VsdFtpbnRlcnZhbHNdICs9IDE7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGludGVydmFscyBwZXIgc3VwZXJ0eXBlIHJlbGF0aW9uIChsZXNzCiAgLy8vIGlzIGJldHRlciwgMS4wIGlzIGJhZCkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIG1lbW9yeSB1c2UgY29tcGFyZWQgdG8gYSBkYXRhIHN0cnVjdHVyZSB0aGF0CiAgLy8vIGVudW1lcmF0ZXMgYWxsIHN1cGVyY2xhc3Mvc3VwZXJ0eXBlIHBhaXJzLgogIGRvdWJsZSBnZXRDb21wcmVzc2lvblJhdGlvKCkgewogICAgaW50IGludGVydmFscyA9IDA7CiAgICBpbnQgc2l6ZXMgPSAwOwogICAgZm9yIChDbGFzcyBjbGFzc18gaW4gX2luZm9NYXAua2V5cykgewogICAgICB2YXIgaW5mbyA9IF9pbmZvTWFwW2NsYXNzX107CiAgICAgIGludGVydmFscyArPSAoaW5mby5zdXBlcmNsYXNzSW50ZXJ2YWxMaXN0Lmxlbmd0aCArCiAgICAgICAgICAgICAgaW5mby5zdXBlcnR5cGVJbnRlcnZhbExpc3QubGVuZ3RoKSB+LwogICAgICAgICAgMjsKICAgICAgc2l6ZXMgKz0gX2ludGVydmFsTGlzdFNpemUoaW5mby5zdXBlcmNsYXNzSW50ZXJ2YWxMaXN0KSArCiAgICAgICAgICBfaW50ZXJ2YWxMaXN0U2l6ZShpbmZvLnN1cGVydHlwZUludGVydmFsTGlzdCk7CiAgICB9CgogICAgcmV0dXJuIHNpemVzID09IDAgPyAxLjAgOiBpbnRlcnZhbHMgLyBzaXplczsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBoYXNoIHRhYmxlcyBzdG9yaW5nIGhpZXJhcmNoeSBkYXRhLgogIGludCBnZXRTdXBlclR5cGVIYXNoVGFibGVTaXplKCkgewogICAgaW50IHN1bSA9IDA7CiAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBfaW5mb01hcC5rZXlzKSB7CiAgICAgIHN1bSArPSBfaW5mb01hcFtjbGFzc19dLmdlbmVyaWNTdXBlclR5cGVzPy5sZW5ndGggPz8gMDsKICAgIH0KICAgIHJldHVybiBzdW07CiAgfQp9CgpjbGFzcyBfSW50ZXJ2YWxMaXN0QnVpbGRlciB7CiAgZmluYWwgTGlzdDxpbnQ+IGV2ZW50cyA9IDxpbnQ+W107CgogIHZvaWQgYWRkSW50ZXJ2YWwoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBBZGQgYW4gZXZlbnQgcG9pbnQgZm9yIGVhY2ggaW50ZXJ2YWwgZW5kIHBvaW50LCB1c2luZyB0aGUgbG93IGJpdCB0bwogICAgLy8gZGlzdGluZ3Vpc2ggb3BlbmluZyBmcm9tIGNsb3NpbmcgZW5kIHBvaW50cy4gQ2xvc2luZyBlbmQgcG9pbnRzIHNob3VsZAogICAgLy8gaGF2ZSB0aGUgaGlnaCBiaXQgdG8gZW5zdXJlIHRoZXkgb2NjdXIgYWZ0ZXIgYW4gb3BlbmluZyBlbmQgcG9pbnQuCiAgICBldmVudHMuYWRkKHN0YXJ0IDw8IDEpOwogICAgZXZlbnRzLmFkZCgoZW5kIDw8IDEpICsgMSk7CiAgfQoKICB2b2lkIGFkZFNpbmdsZXRvbihpbnQgeCkgewogICAgYWRkSW50ZXJ2YWwoeCwgeCArIDEpOwogIH0KCiAgdm9pZCBhZGRJbnRlcnZhbExpc3QoVWludDMyTGlzdCBpbnRlcnZhbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJ2YWxzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIGFkZEludGVydmFsKGludGVydmFsc1tpXSwgaW50ZXJ2YWxzW2kgKyAxXSk7CiAgICB9CiAgfQoKICBVaW50MzJMaXN0IGJ1aWxkSW50ZXJ2YWxMaXN0KCkgewogICAgLy8gU29ydCB0aGUgZXZlbnQgcG9pbnRzIGFuZCBzd2VlcCBsZWZ0IHRvIHJpZ2h0IHdoaWxlIHRyYWNraW5nIGhvdyBtYW55CiAgICAvLyBpbnRlcnZhbHMgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUuICBSZWNvcmQgYW4gaW50ZXJ2YWwgZW5kIHBvaW50IHdoZW4gdGhlCiAgICAvLyBudW1iZXIgb2YgaW50ZXJ2YWxzIGRyb3AgdG8gemVybyBvciBpbmNyZWFzZSBmcm9tIHplcm8gdG8gb25lLgogICAgLy8gRXZlbnQgcG9pbnRzIGFyZSBlbmNvZGVkIHNvIHRoYXQgYW4gb3BlbmluZyBlbmQgcG9pbnQgb2NjdXIgYmVmb3JlIGEKICAgIC8vIGNsb3NpbmcgZW5kIHBvaW50IGF0IHRoZSBzYW1lIHZhbHVlLgogICAgZXZlbnRzLnNvcnQoKTsKICAgIGludCBpbnNpZGVDb3VudCA9IDA7IC8vIFRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlLgogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IGV2ZW50ID0gZXZlbnRzW2ldOwogICAgICBpZiAoZXZlbnQgJiAxID09IDApIHsKICAgICAgICAvLyBTdGFydCBwb2ludAogICAgICAgICsraW5zaWRlQ291bnQ7CiAgICAgICAgaWYgKGluc2lkZUNvdW50ID09IDEpIHsKICAgICAgICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzIHRlbXBvcmFyaWx5IGJhY2sgaW4gdGhlIGV2ZW50IGFycmF5LgogICAgICAgICAgZXZlbnRzW3N0b3JlSW5kZXgrK10gPSBldmVudCA+PiAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFbmQgcG9pbnQKICAgICAgICAtLWluc2lkZUNvdW50OwogICAgICAgIGlmIChpbnNpZGVDb3VudCA9PSAwKSB7CiAgICAgICAgICBldmVudHNbc3RvcmVJbmRleCsrXSA9IGV2ZW50ID4+IDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBDb3B5IHRoZSByZXN1bHRzIG92ZXIgdG8gYSB0eXBlZCBhcnJheSBvZiB0aGUgY29ycmVjdCBsZW5ndGguCiAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQzMkxpc3Qoc3RvcmVJbmRleCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlSW5kZXg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBldmVudHNbaV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKYm9vbCBfaW50ZXJ2YWxMaXN0Q29udGFpbnMoVWludDMyTGlzdCBpbnRlcnZhbExpc3QsIGludCB4KSB7CiAgaW50IGxvdyA9IDAsIGhpZ2ggPSBpbnRlcnZhbExpc3QubGVuZ3RoIC0gMTsKICBpZiAoaGlnaCA9PSAtMSB8fCB4IDwgaW50ZXJ2YWxMaXN0WzBdIHx8IGludGVydmFsTGlzdFtoaWdoXSA8PSB4KSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIC8vIEZpbmQgdGhlIGxvd2VyIGJvdW5kIG9mIHggaW4gdGhlIGxpc3QuCiAgLy8gSWYgdGhlIGxvd2VyIGJvdW5kIGlzIGF0IGFuIGV2ZW4gaW5kZXgsIHRoZSBsb3dlciBib3VuZCBpcyBhbiBvcGVuaW5nIHBvaW50CiAgLy8gb2YgYW4gaW50ZXJ2YWwgdGhhdCBjb250YWlucyB4LCBvdGhlcndpc2UgaXQgaXMgYSBjbG9zaW5nIHBvaW50IG9mIGFuCiAgLy8gaW50ZXJ2YWwgYmVsb3cgeCBhbmQgdGhlcmUgaXMgbm8gaW50ZXJ2YWwgY29udGFpbmluZyB4LgogIHdoaWxlIChsb3cgPCBoaWdoKSB7CiAgICBpbnQgbWlkID0gaGlnaCAtICgoaGlnaCAtIGxvdykgPj4gMSk7IC8vIEdldCBtaWRkbGUsIHJvdW5kaW5nIHVwLgogICAgaW50IHBpdm90ID0gaW50ZXJ2YWxMaXN0W21pZF07CiAgICBpZiAocGl2b3QgPD0geCkgewogICAgICBsb3cgPSBtaWQ7CiAgICB9IGVsc2UgewogICAgICBoaWdoID0gbWlkIC0gMTsKICAgIH0KICB9CiAgcmV0dXJuIGxvdyA9PSBoaWdoICYmIChsb3cgJiAxKSA9PSAwOwp9CgppbnQgX2ludGVydmFsTGlzdFNpemUoVWludDMyTGlzdCBpbnRlcnZhbExpc3QpIHsKICBpbnQgc2l6ZSA9IDA7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnZhbExpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgIHNpemUgKz0gaW50ZXJ2YWxMaXN0W2kgKyAxXSAtIGludGVydmFsTGlzdFtpXTsKICB9CiAgcmV0dXJuIHNpemU7Cn0KCmNsYXNzIEZvclRlc3RpbmdDbGFzc0luZm8gewogIGZpbmFsIENsYXNzIGNsYXNzTm9kZTsKICBmaW5hbCBMaXN0PE1lbWJlcj4gbGF6eURlY2xhcmVkR2V0dGVyc0FuZENhbGxzOwogIGZpbmFsIExpc3Q8TWVtYmVyPiBsYXp5RGVjbGFyZWRTZXR0ZXJzOwogIGZpbmFsIExpc3Q8TWVtYmVyPiBsYXp5SW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHM7CiAgZmluYWwgTGlzdDxNZW1iZXI+IGxhenlJbXBsZW1lbnRlZFNldHRlcnM7CiAgZmluYWwgTGlzdDxNZW1iZXI+IGxhenlJbnRlcmZhY2VHZXR0ZXJzQW5kQ2FsbHM7CiAgZmluYWwgTGlzdDxNZW1iZXI+IGxhenlJbnRlcmZhY2VTZXR0ZXJzOwoKICBGb3JUZXN0aW5nQ2xhc3NJbmZvLl8oX0NsYXNzSW5mbyBjKQogICAgICA6IGNsYXNzTm9kZSA9IGMuY2xhc3NOb2RlLAogICAgICAgIGxhenlEZWNsYXJlZEdldHRlcnNBbmRDYWxscyA9IGMubGF6eURlY2xhcmVkR2V0dGVyc0FuZENhbGxzLAogICAgICAgIGxhenlEZWNsYXJlZFNldHRlcnMgPSBjLmxhenlEZWNsYXJlZFNldHRlcnMsCiAgICAgICAgbGF6eUltcGxlbWVudGVkR2V0dGVyc0FuZENhbGxzID0gYy5sYXp5SW1wbGVtZW50ZWRHZXR0ZXJzQW5kQ2FsbHMsCiAgICAgICAgbGF6eUltcGxlbWVudGVkU2V0dGVycyA9IGMubGF6eUltcGxlbWVudGVkU2V0dGVycywKICAgICAgICBsYXp5SW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzID0gYy5sYXp5SW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzLAogICAgICAgIGxhenlJbnRlcmZhY2VTZXR0ZXJzID0gYy5sYXp5SW50ZXJmYWNlU2V0dGVyczsKfQoKY2xhc3MgX0NsYXNzSW5mbyB7CiAgYm9vbCB1c2VkID0gZmFsc2U7CiAgZmluYWwgQ2xhc3MgY2xhc3NOb2RlOwogIGludCB0b3BvbG9naWNhbEluZGV4ID0gMDsKICBpbnQgZGVwdGggPSAwOwoKICAvLyBTdXBlciB0eXBlcyBtdXN0IGFsd2F5cyBvY2N1ciBiZWZvcmUgc3VidHlwZXMgaW4gdGhlc2UgbGlzdHMuCiAgLy8gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgIGNsYXNzIEEgZXh0ZW5kcyBPYmplY3QKICAvLyAgIGNsYXNzIEIgZXh0ZW5kcyBPYmplY3QgaW1wbGVtZW50cyBBCiAgLy8KICAvLyBIZXJlIGBBYCBtdXN0IG9jY3VyIGJlZm9yZSBgQmAgaW4gdGhlIGxpc3Qgb2YgZGlyZWN0IGV4dGVuZGVycyBvZiBPYmplY3QsCiAgLy8gYmVjYXVzZSBgQmAgaXMgYSBzdWJ0eXBlIG9mIGBBYC4KICBmaW5hbCBTZXQ8X0NsYXNzSW5mbz4gZGlyZWN0RXh0ZW5kZXJzID0gbmV3IExpbmtlZEhhc2hTZXQ8X0NsYXNzSW5mbz4oKTsKICBmaW5hbCBTZXQ8X0NsYXNzSW5mbz4gZGlyZWN0TWl4ZXJzID0gbmV3IExpbmtlZEhhc2hTZXQ8X0NsYXNzSW5mbz4oKTsKICBmaW5hbCBTZXQ8X0NsYXNzSW5mbz4gZGlyZWN0SW1wbGVtZW50ZXJzID0gbmV3IExpbmtlZEhhc2hTZXQ8X0NsYXNzSW5mbz4oKTsKCiAgVWludDMyTGlzdCBzdXBlcmNsYXNzSW50ZXJ2YWxMaXN0OwogIFVpbnQzMkxpc3Qgc3VwZXJ0eXBlSW50ZXJ2YWxMaXN0OwoKICBMaXN0PF9DbGFzc0luZm8+IGxlYXN0VXBwZXJCb3VuZEluZm9zOwoKICAvLy8gTWFwcyBnZW5lcmljIHN1cGVydHlwZSBjbGFzc2VzIHRvIHRoZSBpbnN0YW50aWF0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGlzCiAgLy8vIGNsYXNzLgogIC8vLwogIC8vLyBFLmcuIGBMaXN0YCBtYXBzIHRvIGBMaXN0PFN0cmluZz5gIGZvciBhIGNsYXNzIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQogIC8vLyBpbXBsZW1lbnRzIGBMaXN0PFN0cmluZz5gLgogIE1hcDxDbGFzcywgTGlzdDxTdXBlcnR5cGU+PiBnZW5lcmljU3VwZXJUeXBlczsKCiAgLy8vIE1hcHMgZ2VuZXJpYyBzdXBlcnR5cGUgY2xhc3NlcyB0byB0aGUgY2Fub25pY2FsIGluc3RhbnRpYXRpb24gaW1wbGVtZW50ZWQKICAvLy8gYnkgdGhpcyBjbGFzcy4KICAvLy8KICAvLy8gRS5nLiBgTGlzdGAgbWFwcyB0byBgTGlzdDxTdHJpbmc+YCBmb3IgYSBjbGFzcyB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKICAvLy8gaW1wbGVtZW50cyBgTGlzdDxTdHJpbmc+YC4KCiAgTWFwPENsYXNzLCBTdXBlcnR5cGU+IGdlbmVyaWNTdXBlclR5cGU7CgogIC8vLyBJbnN0YW5jZSBmaWVsZHMsIGdldHRlcnMsIG1ldGhvZHMsIGFuZCBvcGVyYXRvcnMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcwogIC8vLyBvciBpdHMgbWl4ZWQtaW4gY2xhc3MsIHNvcnRlZCBhY2NvcmRpbmcgdG8gW19jb21wYXJlTWVtYmVyc10uCiAgTGlzdDxNZW1iZXI+IGxhenlEZWNsYXJlZEdldHRlcnNBbmRDYWxsczsKCiAgLy8vIE5vbi1maW5hbCBpbnN0YW5jZSBmaWVsZHMgYW5kIHNldHRlcnMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcyBvciBpdHMKICAvLy8gbWl4ZWQtaW4gY2xhc3MsIHNvcnRlZCBhY2NvcmRpbmcgdG8gW19jb21wYXJlTWVtYmVyc10uCiAgTGlzdDxNZW1iZXI+IGxhenlEZWNsYXJlZFNldHRlcnM7CgogIC8vLyBJbnN0YW5jZSBmaWVsZHMsIGdldHRlcnMsIG1ldGhvZHMsIGFuZCBvcGVyYXRvcnMgaW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcwogIC8vLyAoZGVjbGFyZWQgb3IgaW5oZXJpdGVkKS4KICBMaXN0PE1lbWJlcj4gbGF6eUltcGxlbWVudGVkR2V0dGVyc0FuZENhbGxzOwoKICAvLy8gTm9uLWZpbmFsIGluc3RhbmNlIGZpZWxkcyBhbmQgc2V0dGVycyBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzCiAgLy8vIChkZWNsYXJlZCBvciBpbmhlcml0ZWQpLgogIExpc3Q8TWVtYmVyPiBsYXp5SW1wbGVtZW50ZWRTZXR0ZXJzOwoKICBMaXN0PE1lbWJlcj4gbGF6eUludGVyZmFjZUdldHRlcnNBbmRDYWxsczsKICBMaXN0PE1lbWJlcj4gbGF6eUludGVyZmFjZVNldHRlcnM7CgogIF9DbGFzc0luZm8odGhpcy5jbGFzc05vZGUpOwoKICBib29sIGlzU3ViY2xhc3NPZihfQ2xhc3NJbmZvIG90aGVyKSB7CiAgICByZXR1cm4gX2ludGVydmFsTGlzdENvbnRhaW5zKAogICAgICAgIHN1cGVyY2xhc3NJbnRlcnZhbExpc3QsIG90aGVyLnRvcG9sb2dpY2FsSW5kZXgpOwogIH0KCiAgYm9vbCBpc1N1YnR5cGVPZihfQ2xhc3NJbmZvIG90aGVyKSB7CiAgICByZXR1cm4gX2ludGVydmFsTGlzdENvbnRhaW5zKHN1cGVydHlwZUludGVydmFsTGlzdCwgb3RoZXIudG9wb2xvZ2ljYWxJbmRleCk7CiAgfQoKICB2b2lkIHJlY29yZEdlbmVyaWNTdXBlclR5cGUoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3MgY2xzLCBTdXBlcnR5cGUgdHlwZSwKICAgICAgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlcyBvbkFtYmlndW91c1N1cGVydHlwZXMpIHsKICAgIFN1cGVydHlwZSBjYW5vbmljYWwgPSBnZW5lcmljU3VwZXJUeXBlW2Nsc107CiAgICBpZiAoY2Fub25pY2FsID09IG51bGwpIHsKICAgICAgaWYgKCFjbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgICAgY2Fub25pY2FsID0gbGVnYWN5RXJhc3VyZVN1cGVydHlwZShjb3JlVHlwZXMsIHR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbm9uaWNhbCA9IHR5cGU7CiAgICAgIH0KICAgICAgYXNzZXJ0KGNhbm9uaWNhbCAhPSBudWxsLAogICAgICAgICAgIk5vIGNhbm9uaWNhbCBpbnN0YW50aWF0aW9uIGNvbXB1dGVkIGZvciAkY2xzIGluICRjbGFzc05vZGUuIik7CiAgICAgIGdlbmVyaWNTdXBlclR5cGVbY2xzXSA9IGNhbm9uaWNhbDsKICAgICAgZ2VuZXJpY1N1cGVyVHlwZXNbY2xzXSA9IDxTdXBlcnR5cGU+W3R5cGVdOwogICAgfSBlbHNlIHsKICAgICAgZ2VuZXJpY1N1cGVyVHlwZXNbY2xzXS5hZGQodHlwZSk7CgogICAgICBpZiAoY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgIFN1cGVydHlwZSByZXN1bHQgPSBubmJkVG9wTWVyZ2VTdXBlcnR5cGUoCiAgICAgICAgICAgIGNvcmVUeXBlcywKICAgICAgICAgICAgbm9ybVN1cGVydHlwZShjb3JlVHlwZXMsIHR5cGUpLAogICAgICAgICAgICBub3JtU3VwZXJ0eXBlKGNvcmVUeXBlcywgY2Fub25pY2FsKSk7CiAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICBvbkFtYmlndW91c1N1cGVydHlwZXMoY2xhc3NOb2RlLCBjYW5vbmljYWwsIHR5cGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnZW5lcmljU3VwZXJUeXBlW2Nsc10gPSByZXN1bHQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHR5cGUgPSBsZWdhY3lFcmFzdXJlU3VwZXJ0eXBlKGNvcmVUeXBlcywgdHlwZSk7CiAgICAgICAgaWYgKHR5cGUgIT0gY2Fub25pY2FsKSB7CiAgICAgICAgICBvbkFtYmlndW91c1N1cGVydHlwZXMoY2xhc3NOb2RlLCBjYW5vbmljYWwsIHR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXNzZXJ0KGdlbmVyaWNTdXBlclR5cGUuY29udGFpbnNLZXkoY2xzKSwKICAgICAgICAiTm8gY2Fub25pY2FsIGluc3RhbnRpYXRpb24gY29tcHV0ZWQgZm9yICRjbHMgaW4gJGNsYXNzTm9kZS4iKTsKICAgIGFzc2VydChnZW5lcmljU3VwZXJUeXBlcy5jb250YWluc0tleShjbHMpLAogICAgICAgICJObyBpbnN0YW50aWF0aW9ucyBjb21wdXRlZCBmb3IgJGNscyBpbiAkY2xhc3NOb2RlLiIpOwogIH0KfQoKLy8vIEFuIGltbXV0YWJsZSBzZXQgb2YgY2xhc3Nlcy4KY2xhc3MgQ2xhc3NTZXQgZXh0ZW5kcyBJdGVyYWJsZUJhc2U8Q2xhc3M+IHsKICBmaW5hbCBTZXQ8Q2xhc3M+IF9jbGFzc2VzOwogIENsYXNzU2V0KHRoaXMuX2NsYXNzZXMpOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBjbGFzc18pIHsKICAgIHJldHVybiBfY2xhc3Nlcy5jb250YWlucyhjbGFzc18pOwogIH0KCiAgQ2xhc3NTZXQgdW5pb24oQ2xhc3NTZXQgb3RoZXIpIHsKICAgIFNldDxDbGFzcz4gcmVzdWx0ID0gbmV3IFNldDxDbGFzcz4uZnJvbShfY2xhc3Nlcyk7CiAgICByZXN1bHQuYWRkQWxsKG90aGVyLl9jbGFzc2VzKTsKICAgIHJldHVybiBuZXcgQ2xhc3NTZXQocmVzdWx0KTsKICB9CgogIEBvdmVycmlkZQogIEl0ZXJhdG9yPENsYXNzPiBnZXQgaXRlcmF0b3IgPT4gX2NsYXNzZXMuaXRlcmF0b3I7Cn0KCi8vLyBIZWFwIGZvciB1c2UgaW4gY29tcHV0aW5nIGxlYXN0IHVwcGVyIGJvdW5kcy4KLy8vCi8vLyBUaGUgaGVhcCBpcyBzb3J0ZWQgc3VjaCB0aGF0IGNsYXNzZXMgdGhhdCBhcmUgZGVlcGVzdCBpbiB0aGUgaGllcmFyY2h5Ci8vLyBhcmUgcmVtb3ZlZCBmaXJzdDsgaW4gdGhlIGNhc2Ugb2YgdGllcywgY2xhc3NlcyB3aXRoIGxvd2VyIHRvcG9sb2dpY2FsIHNvcnQKLy8vIGluZGV4IGFyZSByZW1vdmVkIGZpcnN0LgpjbGFzcyBfTHViSGVhcCBleHRlbmRzIEhlYXA8X0NsYXNzSW5mbz4gewogIEBvdmVycmlkZQogIGJvb2wgc29ydHNC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Ly8gICAtIHR5cGVfY2hlY2tlci5kYXJ0IChpZiByZWxldmFudCkKLy8vCi8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBIQU5ETElORwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyBBcyBhIHJ1bGUgb2YgdGh1bWIsIGVycm9ycyB0aGF0IGNhbiBiZSBkZXRlY3RlZCBzdGF0aWNhbGx5IGFyZSBoYW5kbGVkIGJ5Ci8vLyB0aGUgZnJvbnRlbmQsIHR5cGljYWxseSBieSB0cmFuc2xhdGluZyB0aGUgZXJyb25lb3VzIGNvZGUgaW50byBhICd0aHJvdycgb3IKLy8vIGEgY2FsbCB0byAnbm9TdWNoTWV0aG9kJy4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdGhlcmUgYXJlIG5vIGFyaXR5IG1pc21hdGNoZXMgaW4gc3RhdGljIGludm9jYXRpb25zLCBhbmQKLy8vIHRoZXJlIGFyZSBubyBkaXJlY3QgaW52b2NhdGlvbnMgb2YgYSBjb25zdHJ1Y3RvciBvbiBhIGFic3RyYWN0IGNsYXNzLgovLy8KLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRJQyB2cyBUT1AtTEVWRUwKLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLwovLy8gVGhlIHRlcm0gYHN0YXRpY2AgaW5jbHVkZXMgYm90aCBzdGF0aWMgY2xhc3MgbWVtYmVycyBhbmQgdG9wLWxldmVsIG1lbWJlcnMuCi8vLwovLy8gIlN0YXRpYyBjbGFzcyBtZW1iZXIiIGlzIHRoZSBwcmVmZXJyZWQgdGVybSBmb3Igbm9uLXRvcCBsZXZlbCBzdGF0aWNzLgovLy8KLy8vIFN0YXRpYyBjbGFzcyBtZW1iZXJzIGFyZSBub3QgbGlmdGVkIHRvIHRoZSBsaWJyYXJ5IGxldmVsIGJlY2F1c2UgbWlycm9ycwovLy8gYW5kIHN0YWNrIHRyYWNlcyBjYW4gb2JzZXJ2ZSB0aGF0IHRoZXkgYXJlIGNsYXNzIG1lbWJlcnMuCi8vLwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VEVVJFUwovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vCi8vLyAiUHJvY2VkdXJlIiBpcyBhbiB1bWJyZWxsYSB0ZXJtIGZvciBtZXRob2QsIGdldHRlciwgc2V0dGVyLCBpbmRleC1nZXR0ZXIsCi8vLyBpbmRleC1zZXR0ZXIsIG9wZXJhdG9yIG92ZXJsb2FkZXIsIGFuZCBmYWN0b3J5IGNvbnN0cnVjdG9yLgovLy8KLy8vIEdlbmVyYXRpdmUgY29uc3RydWN0b3JzLCBmaWVsZCBpbml0aWFsaXplcnMsIGxvY2FsIGZ1bmN0aW9ucyBhcmUgTk9UCi8vLyBwcm9jZWR1cmVzLgovLy8KLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0ZPUk1BVElPTlMKLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLwovLy8gQVNUIHRyYW5zZm9ybWF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIFtUcmVlTm9kZS5yZXBsYWNlV2l0aF0gb3IgdGhlCi8vLyBbVHJhbnNmb3JtZXJdIHZpc2l0b3IgY2xhc3MuCi8vLwovLy8gVXNlIFtUcmFuc2Zvcm1lcl0gZm9yIGJ1bGsgdHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlIGxpa2VseSB0byB0cmFuc2Zvcm0gbG90cwovLy8gb2Ygbm9kZXMsIGFuZCBbVHJlZU5vZGUucmVwbGFjZVdpdGhdIGZvciBzcGFyc2UgdHJhbnNmb3JtYXRpb25zIHRoYXQgbXV0YXRlCi8vLyByZWxhdGl2ZWx5IGZldyBub2Rlcy4gIE9yIHVzZSB3aGljaGV2ZXIgaXMgbW9yZSBjb252ZW5pZW50LgovLy8KLy8vIFRoZSBBU1QgY2FuIGFsc28gYmUgbXV0YXRlZCBieSBkaXJlY3QgZmllbGQgbWFuaXB1bGF0aW9uLCBidXQgdGhlIHVzZXIgdGhlbgovLy8gaGFzIHRvIHVwZGF0ZSBwYXJlbnQgcG9pbnRlcnMgbWFudWFsbHkuCi8vLwpsaWJyYXJ5IGtlcm5lbC5hc3Q7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBMaXN0QmFzZTsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdXRmODsKCmltcG9ydCAndmlzaXRvci5kYXJ0JzsKZXhwb3J0ICd2aXNpdG9yLmRhcnQnOwoKaW1wb3J0ICdjYW5vbmljYWxfbmFtZS5kYXJ0JyBzaG93IENhbm9uaWNhbE5hbWU7CmV4cG9ydCAnY2Fub25pY2FsX25hbWUuZGFydCcgc2hvdyBDYW5vbmljYWxOYW1lOwoKaW1wb3J0ICd0cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydCc7CmltcG9ydCAndGV4dC9hc3RfdG9fdGV4dC5kYXJ0JzsKaW1wb3J0ICdjb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3R5cGVfYWxnZWJyYS5kYXJ0JzsKaW1wb3J0ICd0eXBlX2Vudmlyb25tZW50LmRhcnQnOwppbXBvcnQgJ3NyYy9hc3N1bXB0aW9ucy5kYXJ0JzsKCi8vLyBBbnkgdHlwZSBvZiBub2RlIGluIHRoZSBJUi4KYWJzdHJhY3QgY2xhc3MgTm9kZSB7CiAgY29uc3QgTm9kZSgpOwoKICBSIGFjY2VwdDxSPihWaXNpdG9yPFI+IHYpOwogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpOwoKICAvLy8gUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuCiAgLy8vCiAgLy8vIFt0b1N0cmluZ10gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBzaG9ydC1ydW5uaW5nIHRlc3QgdG9vbHMKICAvLy8gYXMgaXQgY2FuIGNhdXNlIHNlcmlvdXMgbWVtb3J5IGxlYWtzLgogIC8vLwogIC8vLyBTeW50aGV0aWMgbmFtZXMgYXJlIGNhY2hlZCBnbG9iYWxseSB0byByZXRhaW4gY29uc2lzdGVuY3kgYWNyb3NzIGRpZmZlcmVudAogIC8vLyBbdG9TdHJpbmddIGNhbGxzIChoZW5jZSB0aGUgbWVtb3J5IGxlYWspLgogIC8vLwogIC8vLyBOb2RlcyB0aGF0IGFyZSBuYW1lZCwgc3VjaCBhcyBbQ2xhc3NdIGFuZCBbTWVtYmVyXSwgcmV0dXJuIHRoZWlyCiAgLy8vIChwb3NzaWJseSBzeW50aGVzaXplZCkgbmFtZSwgd2hlcmVhcyBvdGhlciBBU1Qgbm9kZXMgcmV0dXJuIHRoZSBjb21wbGV0ZQogIC8vLyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZWlyIHN1YnRyZWUuCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVidWdOb2RlVG9TdHJpbmcodGhpcyk7CgogIC8vLyBSZXR1cm5zIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgdXNlIGluIGRlYnVnZ2luZy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgYWRkcyBzb21lIG5vZGVzIHRvIGEgc3RhdGljIG1hcCB0byBlbnN1cmUgY29uc2lzdGVudAogIC8vLyBuYW1pbmcsIGJ1dCB0aGF0IGl0IHRodXMgYWxzbyBsZWFrcyBtZW1vcnkuCiAgU3RyaW5nIGxlYWtpbmdEZWJ1Z1RvU3RyaW5nKCkgPT4gZGVidWdOb2RlVG9TdHJpbmcodGhpcyk7Cn0KCi8vLyBBIG11dGFibGUgQVNUIG5vZGUgd2l0aCBhIHBhcmVudCBwb2ludGVyLgovLy8KLy8vIFRoaXMgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBbTmFtZV0gYW5kIFtEYXJ0VHlwZV0gbm9kZXMuCmFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgTm9kZSB7CiAgc3RhdGljIGludCBfaGFzaENvdW50ZXIgPSAwOwogIGZpbmFsIGludCBoYXNoQ29kZSA9IF9oYXNoQ291bnRlciA9IChfaGFzaENvdW50ZXIgKyAxKSAmIDB4M2ZmZmZmZmY7CiAgc3RhdGljIGNvbnN0IGludCBub09mZnNldCA9IC0xOwoKICBUcmVlTm9kZSBwYXJlbnQ7CgogIC8vLyBPZmZzZXQgaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtub09mZnNldF0pIGlmIHRoZSBmaWxlIG9mZnNldCBpcwogIC8vLyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5IHNldCkuCiAgaW50IGZpbGVPZmZzZXQgPSBub09mZnNldDsKCiAgUiBhY2NlcHQ8Uj4oVHJlZVZpc2l0b3I8Uj4gdik7CiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdik7CiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KTsKCiAgLy8vIFJlcGxhY2VzIFtjaGlsZF0gd2l0aCBbcmVwbGFjZW1lbnRdLgogIC8vLwogIC8vLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBBU1QgcmVtYWlucyBhIHRyZWUuICBJbgogIC8vLyBwYXJ0aWN1bGFyLCBbcmVwbGFjZW1lbnRdIHNob3VsZCBiZSBhbiBvcnBoYW4gb3IgYmUgcGFydCBvZiBhbiBvcnBoYW5lZAogIC8vLyBzdWJ0cmVlLgogIC8vLwogIC8vLyBIYXMgbm8gZWZmZWN0IGlmIFtjaGlsZF0gaXMgbm90IGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBub2RlLgogIC8vLwogIC8vLyBJZiBbcmVwbGFjZW1lbnRdIGlzIGBudWxsYCwgdGhpcyB3aWxsIFtyZW1vdmVdIHRoZSBbY2hpbGRdIG5vZGUuCiAgdm9pZCByZXBsYWNlQ2hpbGQoVHJlZU5vZGUgY2hpbGQsIFRyZWVOb2RlIHJlcGxhY2VtZW50KSB7CiAgICB0cmFuc2Zvcm1DaGlsZHJlbihuZXcgX0NoaWxkUmVwbGFjZXIoY2hpbGQsIHJlcGxhY2VtZW50KSk7CiAgfQoKICAvLy8gSW5zZXJ0cyBhbm90aGVyIG5vZGUgaW4gcGxhY2Ugb2YgdGhpcyBvbmUuCiAgLy8vCiAgLy8vIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIEFTVCByZW1haW5zIGEgdHJlZS4gIEluCiAgLy8vIHBhcnRpY3VsYXIsIFtyZXBsYWNlbWVudF0gc2hvdWxkIGJlIGFuIG9ycGhhbiBvciBiZSBwYXJ0IG9mIGFuIG9ycGhhbmVkCiAgLy8vIHN1YnRyZWUuCiAgLy8vCiAgLy8vIElmIFtyZXBsYWNlbWVudF0gaXMgYG51bGxgLCB0aGlzIHdpbGwgW3JlbW92ZV0gdGhlIG5vZGUuCiAgdm9pZCByZXBsYWNlV2l0aChUcmVlTm9kZSByZXBsYWNlbWVudCkgewogICAgcGFyZW50LnJlcGxhY2VDaGlsZCh0aGlzLCByZXBsYWNlbWVudCk7CiAgICBwYXJlbnQgPSBudWxsOwogIH0KCiAgLy8vIFJlbW92ZXMgdGhpcyBub2RlIGZyb20gdGhlIFtMaXN0XSBpdCBpcyBjdXJyZW50bHkgc3RvcmVkIGluLCBvciBhc3NpZ25zCiAgLy8vIGBudWxsYCB0byB0aGUgZmllbGQgb24gdGhlIHBhcmVudCBjdXJyZW50bHkgcG9pbnRpbmcgdG8gdGhlIG5vZGUuCiAgLy8vCiAgLy8vIEhhcyBubyBlZmZlY3QgaWYgdGhlIG5vZGUgaXMgb3JwaGFuZWQgb3IgaWYgdGhlIHBhcmVudCBwb2ludGVyIGlzIHN0YWxlLgogIHZvaWQgcmVtb3ZlKCkgewogICAgcGFyZW50Py5yZXBsYWNlQ2hpbGQodGhpcywgbnVsbCk7CiAgICBwYXJlbnQgPSBudWxsOwogIH0KCiAgQ29tcG9uZW50IGdldCBlbmNsb3NpbmdDb21wb25lbnQgPT4gcGFyZW50Py5lbmNsb3NpbmdDb21wb25lbnQ7CgogIC8vLyBSZXR1cm5zIHRoZSBiZXN0IGtub3duIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gQVNUIG5vZGUsIG9yIGBudWxsYCBpZgogIC8vLyB0aGUgbm9kZSBpcyBvcnBoYW5lZC4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgaXMgaW50ZW5kZWQgZm9yIGRpYWdub3N0aWNzIGFuZCBkZWJ1Z2dpbmcsIGFuZCBzaG91bGQgYmUKICAvLy8gYXZvaWRlZCBpbiBwcm9kdWN0aW9uIGNvZGUuCiAgTG9jYXRpb24gZ2V0IGxvY2F0aW9uIHsKICAgIGlmIChmaWxlT2Zmc2V0ID09IG5vT2Zmc2V0KSByZXR1cm4gcGFyZW50Py5sb2NhdGlvbjsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoZmlsZU9mZnNldCk7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIHBhcmVudD8uX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKG9mZnNldCk7CiAgfQp9CgovLy8gQW4gQVNUIG5vZGUgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdGhlciBub2Rlcy4KLy8vCi8vLyBUaGVyZSBpcyBhIHNpbmdsZSBbcmVmZXJlbmNlXSBiZWxvbmdpbmcgdG8gdGhpcyBub2RlLCBwcm92aWRpbmcgYSBsZXZlbCBvZgovLy8gaW5kaXJlY3Rpb24gdGhhdCBpcyBuZWVkZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uCmFic3RyYWN0IGNsYXNzIE5hbWVkTm9kZSBleHRlbmRzIFRyZWVOb2RlIHsKICBmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlOwoKICBOYW1lZE5vZGUoUmVmZXJlbmNlIHJlZmVyZW5jZSkKICAgICAgOiB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZSA/PyBuZXcgUmVmZXJlbmNlKCkgewogICAgdGhpcy5yZWZlcmVuY2Uubm9kZSA9IHRoaXM7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldCBjYW5vbmljYWxOYW1lID0+IHJlZmVyZW5jZT8uY2Fub25pY2FsTmFtZTsKCiAgLy8vIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZS4KICAvLy8KICAvLy8gU2VlIFtDb21wb25lbnQucmVsaW5rXSBmb3IgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uLgogIC8vLwogIC8vLyBNYWtlcyBzdXJlIHRoZSByZWZlcmVuY2UgaW4gdGhpcyBuYW1lZCBub2RlIHBvaW50cyB0byBpdHNlbGYuCiAgdm9pZCBfcmVsaW5rTm9kZSgpIHsKICAgIHRoaXMucmVmZXJlbmNlLm5vZGUgPSB0aGlzOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRmlsZVVyaU5vZGUgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgLy8vIFRoZSBVUkkgb2YgdGhlIHNvdXJjZSBmaWxlIHRoaXMgbm9kZSB3YXMgbG9hZGVkIGZyb20uCiAgVXJpIGdldCBmaWxlVXJpOwp9CgphYnN0cmFjdCBjbGFzcyBBbm5vdGF0YWJsZSBleHRlbmRzIFRyZWVOb2RlIHsKICBMaXN0PEV4cHJlc3Npb24+IGdldCBhbm5vdGF0aW9uczsKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBub2RlKTsKfQoKLy8vIEluZGlyZWN0aW9uIGJldHdlZW4gYSByZWZlcmVuY2UgYW5kIGl0cyBkZWZpbml0aW9uLgovLy8KLy8vIFRoZXJlIGlzIG9ubHkgb25lIHJlZmVyZW5jZSBvYmplY3QgcGVyIFtOYW1lZE5vZGVdLgpjbGFzcyBSZWZlcmVuY2UgewogIENhbm9uaWNhbE5hbWUgY2Fub25pY2FsTmFtZTsKCiAgTmFtZWROb2RlIF9ub2RlOwoKICBOYW1lZE5vZGUgZ2V0IG5vZGUgewogICAgaWYgKF9ub2RlID09IG51bGwpIHsKICAgICAgLy8gRWl0aGVyIHRoaXMgaXMgYW4gdW5ib3VuZCByZWZlcmVuY2Ugb3IgaXQgYmVsb25ncyB0byBhIGxhenktbG9hZGVkCiAgICAgIC8vIChhbmQgbm90IHlldCBsb2FkZWQpIGNsYXNzLiBJZiBpdCBiZWxvbmdzIHRvIGEgbGF6eS1sb2FkZWQgY2xhc3MsCiAgICAgIC8vIGxvYWQgdGhlIGNsYXNzLgoKICAgICAgQ2Fub25pY2FsTmFtZSBjYW5vbmljYWxOYW1lUGFyZW50ID0gY2Fub25pY2FsTmFtZT8ucGFyZW50OwogICAgICB3aGlsZSAoY2Fub25pY2FsTmFtZVBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNhbm9uaWNhbE5hbWVQYXJlbnQubmFtZS5zdGFydHNXaXRoKCJAIikpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYW5vbmljYWxOYW1lUGFyZW50ID0gY2Fub25pY2FsTmFtZVBhcmVudC5wYXJlbnQ7CiAgICAgIH0KICAgICAgaWYgKGNhbm9uaWNhbE5hbWVQYXJlbnQgIT0gbnVsbCkgewogICAgICAgIE5hbWVkTm9kZSBwYXJlbnROYW1lZE5vZGUgPQogICAgICAgICAgICBjYW5vbmljYWxOYW1lUGFyZW50Py5wYXJlbnQ/LnJlZmVyZW5jZT8uX25vZGU7CiAgICAgICAgaWYgKHBhcmVudE5hbWVkTm9kZSBpcyBDbGFzcykgewogICAgICAgICAgQ2xhc3MgcGFyZW50Q2xhc3MgPSBwYXJlbnROYW1lZE5vZGU7CiAgICAgICAgICBpZiAocGFyZW50Q2xhc3MubGF6eUJ1aWxkZXIgIT0gbnVsbCkgewogICAgICAgICAgICBwYXJlbnRDbGFzcy5lbnN1cmVMb2FkZWQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfbm9kZTsKICB9CgogIHZvaWQgc2V0IG5vZGUoTmFtZWROb2RlIG5vZGUpIHsKICAgIF9ub2RlID0gbm9kZTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChjYW5vbmljYWxOYW1lICE9IG51bGwpIHsKICAgICAgcmV0dXJuICdSZWZlcmVuY2UgdG8gJGNhbm9uaWNhbE5hbWUnOwogICAgfQogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gJ1JlZmVyZW5jZSB0byAkbm9kZSc7CiAgICB9CiAgICByZXR1cm4gJ1VuYm91bmQgcmVmZXJlbmNlJzsKICB9CgogIExpYnJhcnkgZ2V0IGFzTGlicmFyeSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgbGlicmFyeSB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgTGlicmFyeTsKICB9CgogIENsYXNzIGdldCBhc0NsYXNzIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBjbGFzcyB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgQ2xhc3M7CiAgfQoKICBNZW1iZXIgZ2V0IGFzTWVtYmVyIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBtZW1iZXIgd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIE1lbWJlcjsKICB9CgogIEZpZWxkIGdldCBhc0ZpZWxkIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBmaWVsZCB3YXMgZXhwZWN0ZWQnOwogICAgfQogICAgcmV0dXJuIG5vZGUgYXMgRmllbGQ7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgYXNDb25zdHJ1Y3RvciB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgY29uc3RydWN0b3Igd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIENvbnN0cnVjdG9yOwogIH0KCiAgUHJvY2VkdXJlIGdldCBhc1Byb2NlZHVyZSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgcHJvY2VkdXJlIHdhcyBleHBlY3RlZCc7CiAgICB9CiAgICByZXR1cm4gbm9kZSBhcyBQcm9jZWR1cmU7CiAgfQoKICBUeXBlZGVmIGdldCBhc1R5cGVkZWYgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB0aHJvdyAnJHRoaXMgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIHR5cGVkZWYgd2FzIGV4cGVjdGVkJzsKICAgIH0KICAgIHJldHVybiBub2RlIGFzIFR5cGVkZWY7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgTElCUkFSSUVTIGFuZCBDTEFTU0VTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgTGlicmFyeSBleHRlbmRzIE5hbWVkTm9kZQogICAgaW1wbGVtZW50cyBBbm5vdGF0YWJsZSwgQ29tcGFyYWJsZTxMaWJyYXJ5PiwgRmlsZVVyaU5vZGUgewogIC8vLyBBbiBpbXBvcnQgcGF0aCB0byB0aGlzIGxpYnJhcnkuCiAgLy8vCiAgLy8vIFRoZSBbVXJpXSBzaG91bGQgaGF2ZSB0aGUgYGRhcnRgLCBgcGFja2FnZWAsIGBhcHBgLCBvciBgZmlsZWAgc2NoZW1lLgogIC8vLwogIC8vLyBJZiB0aGUgVVJJIGhhcyB0aGUgYGFwcGAgc2NoZW1lLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24gcm9vdC4KICBVcmkgaW1wb3J0VXJpOwoKICAvLy8gVGhlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUgdGhpcyBsaWJyYXJ5IHdhcyBsb2FkZWQgZnJvbS4KICBVcmkgZmlsZVVyaTsKCiAgLy8gVE9ETyhqZW5zaik6IERvIHdlIGhhdmUgYSBiZXR0ZXIgb3B0aW9uIHRoYW4gdGhpcz8KICBzdGF0aWMgaW50IGRlZmF1bHRMYW5ndWFnZVZlcnNpb25NYWpvciA9IDI7CiAgc3RhdGljIGludCBkZWZhdWx0TGFuZ3VhZ2VWZXJzaW9uTWlub3IgPSA4OwoKICBpbnQgX2xhbmd1YWdlVmVyc2lvbk1ham9yOwogIGludCBfbGFuZ3VhZ2VWZXJzaW9uTWlub3I7CiAgaW50IGdldCBsYW5ndWFnZVZlcnNpb25NYWpvciA9PgogICAgICBfbGFuZ3VhZ2VWZXJzaW9uTWFqb3IgPz8gZGVmYXVsdExhbmd1YWdlVmVyc2lvbk1ham9yOwogIGludCBnZXQgbGFuZ3VhZ2VWZXJzaW9uTWlub3IgPT4KICAgICAgX2xhbmd1YWdlVmVyc2lvbk1pbm9yID8/IGRlZmF1bHRMYW5ndWFnZVZlcnNpb25NaW5vcjsKICB2b2lkIHNldExhbmd1YWdlVmVyc2lvbihpbnQgbGFuZ3VhZ2VWZXJzaW9uTWFqb3IsIGludCBsYW5ndWFnZVZlcnNpb25NaW5vcikgewogICAgaWYgKGxhbmd1YWdlVmVyc2lvbk1ham9yID09IG51bGwgfHwgbGFuZ3VhZ2VWZXJzaW9uTWlub3IgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVHJ5aW5nIHRvIHNldCBsYW5ndWFnZSB2ZXJzaW9uICdudWxsJyIpOwogICAgfQogICAgX2xhbmd1YWdlVmVyc2lvbk1ham9yID0gbGFuZ3VhZ2VWZXJzaW9uTWFqb3I7CiAgICBfbGFuZ3VhZ2VWZXJzaW9uTWlub3IgPSBsYW5ndWFnZVZlcnNpb25NaW5vcjsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgU3ludGhldGljRmxhZyA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IE5vbk51bGxhYmxlQnlEZWZhdWx0RmxhZyA9IDEgPDwgMjsKCiAgaW50IGZsYWdzID0gMDsKCiAgLy8vIElmIHRydWUsIHRoZSBsaWJyYXJ5IGlzIHN5bnRoZXRpYywgZm9yIGluc3RhbmNlIGxpYnJhcnkgdGhhdCBkb2Vzbid0CiAgLy8vIHJlcHJlc2VudHMgYW4gYWN0dWFsIGZpbGUgYW5kIGlzIGNyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBlcnJvciByZWNvdmVyeS4KICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBmbGFncyAmIFN5bnRoZXRpY0ZsYWcgIT0gMDsKICB2b2lkIHNldCBpc1N5bnRoZXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgU3ludGhldGljRmxhZykgOiAoZmxhZ3MgJiB+U3ludGhldGljRmxhZyk7CiAgfQoKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+IChmbGFncyAmIE5vbk51bGxhYmxlQnlEZWZhdWx0RmxhZykgIT0gMDsKICB2b2lkIHNldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IE5vbk51bGxhYmxlQnlEZWZhdWx0RmxhZykKICAgICAgICA6IChmbGFncyAmIH5Ob25OdWxsYWJsZUJ5RGVmYXVsdEZsYWcpOwogIH0KCiAgU3RyaW5nIG5hbWU7CgogIC8vLyBQcm9ibGVtcyBpbiB0aGlzIFtMaWJyYXJ5XSBlbmNvZGVkIGFzIGpzb24gb2JqZWN0cy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgZmllbGQgY2FuIGJlIG51bGwsIGFuZCBieSBjb252ZW50aW9uIHNob3VsZCBiZSBudWxsIGlmIHRoZQogIC8vLyBsaXN0IGlzIGVtcHR5LgogIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbjsKCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uczsKCiAgZmluYWwgTGlzdDxMaWJyYXJ5RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzOwoKICAvLy8gUmVmZXJlbmNlcyB0byBub2RlcyBleHBvcnRlZCBieSBgZXhwb3J0YCBkZWNsYXJhdGlvbnMgdGhhdDoKICAvLy8gLSBhcmVuJ3QgYW1iaWd1b3VzLCBvcgogIC8vLyAtIGFyZW4ndCBoaWRkZW4gYnkgbG9jYWwgZGVjbGFyYXRpb25zLgogIGZpbmFsIExpc3Q8UmVmZXJlbmNlPiBhZGRpdGlvbmFsRXhwb3J0cyA9IDxSZWZlcmVuY2U+W107CgogIEBpbmZvcm1hdGl2ZQogIGZpbmFsIExpc3Q8TGlicmFyeVBhcnQ+IHBhcnRzOwoKICBmaW5hbCBMaXN0PFR5cGVkZWY+IHR5cGVkZWZzOwogIGZpbmFsIExpc3Q8Q2xhc3M+IGNsYXNzZXM7CiAgZmluYWwgTGlzdDxFeHRlbnNpb24+IGV4dGVuc2lvbnM7CiAgZmluYWwgTGlzdDxQcm9jZWR1cmU+IHByb2NlZHVyZXM7CiAgZmluYWwgTGlzdDxGaWVsZD4gZmllbGRzOwoKICBMaWJyYXJ5KHRoaXMuaW1wb3J0VXJpLAogICAgICB7dGhpcy5uYW1lLAogICAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zLAogICAgICBMaXN0PExpYnJhcnlEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXMsCiAgICAgIExpc3Q8TGlicmFyeVBhcnQ+IHBhcnRzLAogICAgICBMaXN0PFR5cGVkZWY+IHR5cGVkZWZzLAogICAgICBMaXN0PENsYXNzPiBjbGFzc2VzLAogICAgICBMaXN0PEV4dGVuc2lvbj4gZXh0ZW5zaW9ucywKICAgICAgTGlzdDxQcm9jZWR1cmU+IHByb2NlZHVyZXMsCiAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcywKICAgICAgdGhpcy5maWxlVXJpLAogICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlfSkKICAgICAgOiB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPz8gPEV4cHJlc3Npb24+W10sCiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMgPz8gPExpYnJhcnlEZXBlbmRlbmN5PltdLAogICAgICAgIHRoaXMucGFydHMgPSBwYXJ0cyA/PyA8TGlicmFyeVBhcnQ+W10sCiAgICAgICAgdGhpcy50eXBlZGVmcyA9IHR5cGVkZWZzID8/IDxUeXBlZGVmPltdLAogICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXMgPz8gPENsYXNzPltdLAogICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgPz8gPEV4dGVuc2lvbj5bXSwKICAgICAgICB0aGlzLnByb2NlZHVyZXMgPSBwcm9jZWR1cmVzID8/IDxQcm9jZWR1cmU+W10sCiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMgPz8gPEZpZWxkPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLmRlcGVuZGVuY2llcywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMucGFydHMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVkZWZzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5jbGFzc2VzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5leHRlbnNpb25zLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5wcm9jZWR1cmVzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5maWVsZHMsIHRoaXMpOwogIH0KCiAgTnVsbGFiaWxpdHkgZ2V0IG51bGxhYmxlIHsKICAgIHJldHVybiBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID8gTnVsbGFiaWxpdHkubnVsbGFibGUgOiBOdWxsYWJpbGl0eS5sZWdhY3k7CiAgfQoKICBOdWxsYWJpbGl0eSBnZXQgbm9uTnVsbGFibGUgewogICAgcmV0dXJuIGlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICA/IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlCiAgICAgICAgOiBOdWxsYWJpbGl0eS5sZWdhY3k7CiAgfQoKICBOdWxsYWJpbGl0eSBudWxsYWJsZUlmVHJ1ZShib29sIGlzTnVsbGFibGUpIHsKICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJldHVybiBpc051bGxhYmxlID8gTnVsbGFiaWxpdHkubnVsbGFibGUgOiBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKICAgIH0KICAgIHJldHVybiBOdWxsYWJpbGl0eS5sZWdhY3k7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdG9wLWxldmVsIGZpZWxkcyBhbmQgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHRoaXMgbGlicmFyeS4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgaXMgZm9yIGNvbnZlbmllbmNlLCBub3QgZWZmaWNpZW5jeS4gIENvbnNpZGVyIG1hbnVhbGx5CiAgLy8vIGl0ZXJhdGluZyB0aGUgbWVtYmVycyB0byBzcGVlZCB1cCBjb2RlIGluIHByb2R1Y3Rpb24uCiAgSXRlcmFibGU8TWVtYmVyPiBnZXQgbWVtYmVycyA9PgogICAgICA8SXRlcmFibGU8TWVtYmVyPj5bZmllbGRzLCBwcm9jZWR1cmVzXS5leHBhbmQoKHgpID0+IHgpOwoKICB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBtZW1iZXIucGFyZW50ID0gdGhpczsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIHByb2NlZHVyZXMuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICBmaWVsZHMuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihtZW1iZXIpOwogICAgfQogIH0KCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgbm9kZS5wYXJlbnQgPSB0aGlzOwogICAgYW5ub3RhdGlvbnMuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCBhZGRDbGFzcyhDbGFzcyBjbGFzc18pIHsKICAgIGNsYXNzXy5wYXJlbnQgPSB0aGlzOwogICAgY2xhc3Nlcy5hZGQoY2xhc3NfKTsKICB9CgogIHZvaWQgYWRkRXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24pIHsKICAgIGV4dGVuc2lvbi5wYXJlbnQgPSB0aGlzOwogICAgZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKICB9CgogIHZvaWQgYWRkRmllbGQoRmllbGQgZmllbGQpIHsKICAgIGZpZWxkLnBhcmVudCA9IHRoaXM7CiAgICBmaWVsZHMuYWRkKGZpZWxkKTsKICB9CgogIHZvaWQgYWRkUHJvY2VkdXJlKFByb2NlZHVyZSBwcm9jZWR1cmUpIHsKICAgIHByb2NlZHVyZS5wYXJlbnQgPSB0aGlzOwogICAgcHJvY2VkdXJlcy5hZGQocHJvY2VkdXJlKTsKICB9CgogIHZvaWQgYWRkVHlwZWRlZihUeXBlZGVmIHR5cGVkZWZfKSB7CiAgICB0eXBlZGVmXy5wYXJlbnQgPSB0aGlzOwogICAgdHlwZWRlZnMuYWRkKHR5cGVkZWZfKTsKICB9CgogIHZvaWQgY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCkgewogICAgYXNzZXJ0KGNhbm9uaWNhbE5hbWUgIT0gbnVsbCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVkZWZzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVkZWYgdHlwZWRlZl8gPSB0eXBlZGVmc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21UeXBlZGVmKHR5cGVkZWZfKS5iaW5kVG8odHlwZWRlZl8ucmVmZXJlbmNlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgKytpKSB7CiAgICAgIEZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkRnJvbU1lbWJlcihmaWVsZCkuYmluZFRvKGZpZWxkLnJlZmVyZW5jZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZXMubGVuZ3RoOyArK2kpIHsKICAgICAgUHJvY2VkdXJlIG1lbWJlciA9IHByb2NlZHVyZXNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKG1lbWJlcikuYmluZFRvKG1lbWJlci5yZWZlcmVuY2UpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgKytpKSB7CiAgICAgIENsYXNzIGNsYXNzXyA9IGNsYXNzZXNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGQoY2xhc3NfLm5hbWUpLmJpbmRUbyhjbGFzc18ucmVmZXJlbmNlKTsKICAgICAgY2xhc3NfLmNvbXB1dGVDYW5vbmljYWxOYW1lcygpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkKGV4dGVuc2lvbi5uYW1lKS5iaW5kVG8oZXh0ZW5zaW9uLnJlZmVyZW5jZSk7CiAgICB9CiAgfQoKICAvLy8gVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlLiBVc2Ugb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvb3JkaW5hdGVkCiAgLy8vIHdpdGggdGhlIGtlcm5lbCB0ZWFtLgogIC8vLwogIC8vLyBTZWUgW0NvbXBvbmVudC5yZWxpbmtdIGZvciBhIGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24uCiAgLy8vCiAgLy8vIE1ha2VzIHN1cmUgYWxsIHJlZmVyZW5jZXMgaW4gbmFtZWQgbm9kZXMgaW4gdGhpcyBsaWJyYXJ5IHBvaW50cyB0byBzYWlkCiAgLy8vIG5hbWVkIG5vZGUuCiAgdm9pZCByZWxpbmsoKSB7CiAgICBfcmVsaW5rTm9kZSgpOwogICAgYXNzZXJ0KGNhbm9uaWNhbE5hbWUgIT0gbnVsbCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVkZWZzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVkZWYgdHlwZWRlZl8gPSB0eXBlZGVmc1tpXTsKICAgICAgdHlwZWRlZl8uX3JlbGlua05vZGUoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgKytpKSB7CiAgICAgIEZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwogICAgICBmaWVsZC5fcmVsaW5rTm9kZSgpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZWR1cmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFByb2NlZHVyZSBtZW1iZXIgPSBwcm9jZWR1cmVzW2ldOwogICAgICBtZW1iZXIuX3JlbGlua05vZGUoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7ICsraSkgewogICAgICBDbGFzcyBjbGFzc18gPSBjbGFzc2VzW2ldOwogICAgICBjbGFzc18ucmVsaW5rKCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07CiAgICAgIGV4dGVuc2lvbi5fcmVsaW5rTm9kZSgpOwogICAgfQogIH0KCiAgdm9pZCBhZGREZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGRlcGVuZGVuY2llcy5hZGQobm9kZS4ucGFyZW50ID0gdGhpcyk7CiAgfQoKICB2b2lkIGFkZFBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgcGFydHMuYWRkKG5vZGUuLnBhcmVudCA9IHRoaXMpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oVHJlZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdExpYnJhcnkodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdmlzaXRMaXN0KGRlcGVuZGVuY2llcywgdik7CiAgICB2aXNpdExpc3QocGFydHMsIHYpOwogICAgdmlzaXRMaXN0KHR5cGVkZWZzLCB2KTsKICAgIHZpc2l0TGlzdChjbGFzc2VzLCB2KTsKICAgIHZpc2l0TGlzdChleHRlbnNpb25zLCB2KTsKICAgIHZpc2l0TGlzdChwcm9jZWR1cmVzLCB2KTsKICAgIHZpc2l0TGlzdChmaWVsZHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGRlcGVuZGVuY2llcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHBhcnRzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QodHlwZWRlZnMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChjbGFzc2VzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QoZXh0ZW5zaW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHByb2NlZHVyZXMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdChmaWVsZHMsIHYsIHRoaXMpOwogIH0KCiAgc3RhdGljIGludCBfbGlicmFyeUlkQ291bnRlciA9IDA7CiAgaW50IF9saWJyYXJ5SWQgPSArK19saWJyYXJ5SWRDb3VudGVyOwoKICBpbnQgY29tcGFyZVRvKExpYnJhcnkgb3RoZXIpID0+IF9saWJyYXJ5SWQgLSBvdGhlci5fbGlicmFyeUlkOwoKICAvLy8gUmV0dXJucyBhIHBvc3NpYmx5IHN5bnRoZXNpemVkIG5hbWUgZm9yIHRoaXMgbGlicmFyeSwgY29uc2lzdGVudCB3aXRoCiAgLy8vIHRoZSBuYW1lcyBhY3Jvc3MgYWxsIFt0b1N0cmluZ10gY2FsbHMuCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVidWdMaWJyYXJ5TmFtZSh0aGlzKTsKCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChlbmNsb3NpbmdDb21wb25lbnQsIGZpbGVVcmksIG9mZnNldCk7CiAgfQp9CgovLy8gQW4gaW1wb3J0IG9yIGV4cG9ydCBkZWNsYXJhdGlvbiBpbiBhIGxpYnJhcnkuCi8vLwovLy8gSXQgY2FuIHJlcHJlc2VudCBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3JtcywKLy8vCi8vLyAgICAgaW1wb3J0IDx1cmw+OwovLy8gICAgIGltcG9ydCA8dXJsPiBhcyA8bmFtZT47Ci8vLyAgICAgaW1wb3J0IDx1cmw+IGRlZmVycmVkIGFzIDxuYW1lPjsKLy8vICAgICBleHBvcnQgPHVybD47Ci8vLwovLy8gb3B0aW9uYWxseSB3aXRoIG1ldGFkYXRhIGFuZCBbQ29tYmluYXRvcnNdLgpjbGFzcyBMaWJyYXJ5RGVwZW5kZW5jeSBleHRlbmRzIFRyZWVOb2RlIHsKICBpbnQgZmxhZ3M7CgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnM7CgogIFJlZmVyZW5jZSBpbXBvcnRlZExpYnJhcnlSZWZlcmVuY2U7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgaW1wb3J0IHByZWZpeCwgaWYgYW55LCBvciBgbnVsbGAgaWYgdGhpcyBpcyBub3QgYW4gaW1wb3J0CiAgLy8vIHdpdGggYSBwcmVmaXguCiAgLy8vCiAgLy8vIE11c3QgYmUgbm9uLW51bGwgZm9yIGRlZmVycmVkIGltcG9ydHMsIGFuZCBtdXN0IGJlIG51bGwgZm9yIGV4cG9ydHMuCiAgU3RyaW5nIG5hbWU7CgogIGZpbmFsIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnM7CgogIExpYnJhcnlEZXBlbmRlbmN5KGludCBmbGFncywgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucywKICAgICAgTGlicmFyeSBpbXBvcnRlZExpYnJhcnksIFN0cmluZyBuYW1lLCBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIGZsYWdzLCBhbm5vdGF0aW9ucywgaW1wb3J0ZWRMaWJyYXJ5LnJlZmVyZW5jZSwgbmFtZSwgY29tYmluYXRvcnMpOwoKICBMaWJyYXJ5RGVwZW5kZW5jeS5kZWZlcnJlZEltcG9ydChMaWJyYXJ5IGltcG9ydGVkTGlicmFyeSwgU3RyaW5nIG5hbWUsCiAgICAgIHtMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zfSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKERlZmVycmVkRmxhZywgYW5ub3RhdGlvbnMgPz8gPEV4cHJlc3Npb24+W10sCiAgICAgICAgICAgIGltcG9ydGVkTGlicmFyeS5yZWZlcmVuY2UsIG5hbWUsIGNvbWJpbmF0b3JzID8/IDxDb21iaW5hdG9yPltdKTsKCiAgTGlicmFyeURlcGVuZGVuY3kuaW1wb3J0KExpYnJhcnkgaW1wb3J0ZWRMaWJyYXJ5LAogICAgICB7U3RyaW5nIG5hbWUsIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMsIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnN9KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoMCwgYW5ub3RhdGlvbnMgPz8gPEV4cHJlc3Npb24+W10sCiAgICAgICAgICAgIGltcG9ydGVkTGlicmFyeS5yZWZlcmVuY2UsIG5hbWUsIGNvbWJpbmF0b3JzID8/IDxDb21iaW5hdG9yPltdKTsKCiAgTGlicmFyeURlcGVuZGVuY3kuZXhwb3J0KExpYnJhcnkgaW1wb3J0ZWRMaWJyYXJ5LAogICAgICB7TGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uc30pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShFeHBvcnRGbGFnLCBhbm5vdGF0aW9ucyA/PyA8RXhwcmVzc2lvbj5bXSwKICAgICAgICAgICAgaW1wb3J0ZWRMaWJyYXJ5LnJlZmVyZW5jZSwgbnVsbCwgY29tYmluYXRvcnMgPz8gPENvbWJpbmF0b3I+W10pOwoKICBMaWJyYXJ5RGVwZW5kZW5jeS5ieVJlZmVyZW5jZSh0aGlzLmZsYWdzLCB0aGlzLmFubm90YXRpb25zLAogICAgICB0aGlzLmltcG9ydGVkTGlicmFyeVJlZmVyZW5jZSwgdGhpcy5uYW1lLCB0aGlzLmNvbWJpbmF0b3JzKSB7CiAgICBzZXRQYXJlbnRzKGFubm90YXRpb25zLCB0aGlzKTsKICAgIHNldFBhcmVudHMoY29tYmluYXRvcnMsIHRoaXMpOwogIH0KCiAgTGlicmFyeSBnZXQgZW5jbG9zaW5nTGlicmFyeSA9PiBwYXJlbnQ7CiAgTGlicmFyeSBnZXQgdGFyZ2V0TGlicmFyeSA9PiBpbXBvcnRlZExpYnJhcnlSZWZlcmVuY2UuYXNMaWJyYXJ5OwoKICBzdGF0aWMgY29uc3QgaW50IEV4cG9ydEZsYWcgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBEZWZlcnJlZEZsYWcgPSAxIDw8IDE7CgogIGJvb2wgZ2V0IGlzRXhwb3J0ID0+IGZsYWdzICYgRXhwb3J0RmxhZyAhPSAwOwogIGJvb2wgZ2V0IGlzSW1wb3J0ID0+ICFpc0V4cG9ydDsKICBib29sIGdldCBpc0RlZmVycmVkID0+IGZsYWdzICYgRGVmZXJyZWRGbGFnICE9IDA7CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRMaWJyYXJ5RGVwZW5kZW5jeSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB2aXNpdExpc3QoY29tYmluYXRvcnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGNvbWJpbmF0b3JzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBBIHBhcnQgZGVjbGFyYXRpb24gaW4gYSBsaWJyYXJ5LgovLy8KLy8vICAgICBwYXJ0IDx1cmw+OwovLy8KLy8vIG9wdGlvbmFsbHkgd2l0aCBtZXRhZGF0YS4KY2xhc3MgTGlicmFyeVBhcnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9uczsKICBmaW5hbCBTdHJpbmcgcGFydFVyaTsKCiAgTGlicmFyeVBhcnQodGhpcy5hbm5vdGF0aW9ucywgdGhpcy5wYXJ0VXJpKSB7CiAgICBzZXRQYXJlbnRzKGFubm90YXRpb25zLCB0aGlzKTsKICB9CgogIHZvaWQgYWRkQW5ub3RhdGlvbihFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRMaWJyYXJ5UGFydCh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBBIGBzaG93YCBvciBgaGlkZWAgY2xhdXNlIGZvciBhbiBpbXBvcnQgb3IgZXhwb3J0LgpjbGFzcyBDb21iaW5hdG9yIGV4dGVuZHMgVHJlZU5vZGUgewogIGJvb2wgaXNTaG93OwoKICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXM7CgogIExpYnJhcnlEZXBlbmRlbmN5IGdldCBkZXBlbmRlbmN5ID0+IHBhcmVudDsKCiAgQ29tYmluYXRvcih0aGlzLmlzU2hvdywgdGhpcy5uYW1lcyk7CiAgQ29tYmluYXRvci5zaG93KHRoaXMubmFtZXMpIDogaXNTaG93ID0gdHJ1ZTsKICBDb21iaW5hdG9yLmhpZGUodGhpcy5uYW1lcykgOiBpc1Nob3cgPSBmYWxzZTsKCiAgYm9vbCBnZXQgaXNIaWRlID0+ICFpc1Nob3c7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRDb21iaW5hdG9yKHRoaXMpOwoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKLy8vIERlY2xhcmF0aW9uIG9mIGEgdHlwZSBhbGlhcy4KY2xhc3MgVHlwZWRlZiBleHRlbmRzIE5hbWVkTm9kZSBpbXBsZW1lbnRzIEZpbGVVcmlOb2RlIHsKICAvLy8gVGhlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhpcyB0eXBlZGVmLgogIFVyaSBmaWxlVXJpOwogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICBTdHJpbmcgbmFtZTsKICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOwogIERhcnRUeXBlIHR5cGU7CgogIC8vIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBkZXNjcmliZSBwYXJhbWV0ZXJzIG9mIHRoZSB1bmRlcmx5aW5nIHR5cGUgd2hlbgogIC8vIHRoYXQgaXMgYSBmdW5jdGlvbiB0eXBlLiAgVGhleSBhcmUgbmVlZGVkIHRvIGtlZXAgc3VjaCBhdHRyaWJ1dGVzIGFzIG5hbWVzCiAgLy8gYW5kIGFubm90YXRpb25zLiBXaGVuIHRoZSB1bmRlcmx5aW5nIHR5cGUgaXMgbm90IGEgZnVuY3Rpb24gdHlwZSwgdGhleSBhcmUKICAvLyBlbXB0eS4KICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGU7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVyczsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKCiAgVHlwZWRlZih0aGlzLm5hbWUsIHRoaXMudHlwZSwKICAgICAge1JlZmVyZW5jZSByZWZlcmVuY2UsCiAgICAgIHRoaXMuZmlsZVVyaSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyc30pCiAgICAgIDogdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzID8/IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUgPz8gPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzID0gbmFtZWRQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICB9CgogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50OwoKICBSIGFjY2VwdDxSPihUcmVlVmlzaXRvcjxSPiB2KSB7CiAgICByZXR1cm4gdi52aXNpdFR5cGVkZWYodGhpcyk7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QodHlwZVBhcmFtZXRlcnMsIHYsIHRoaXMpOwogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICB0eXBlID0gdi52aXNpdERhcnRUeXBlKHR5cGUpOwogICAgfQogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB2aXNpdExpc3QodHlwZVBhcmFtZXRlcnMsIHYpOwogICAgdHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9CgogIExvY2F0aW9uIF9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5Db21wb25lbnQoZW5jbG9zaW5nQ29tcG9uZW50LCBmaWxlVXJpLCBvZmZzZXQpOwogIH0KfQoKLy8vIFRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIGEgY2xhc3MgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIG1lbW9yeS4KLy8vCi8vLyBFYWNoIGxldmVsIGltcGx5IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHByZXZpb3VzIG9uZXMuCmVudW0gQ2xhc3NMZXZlbCB7CiAgLy8vIFRlbXBvcmFyeSBsb2FkaW5nIGxldmVsIGZvciBpbnRlcm5hbCB1c2UgYnkgSVIgcHJvZHVjZXJzLiAgQ29uc3VtZXJzIG9mCiAgLy8vIGtlcm5lbCBjb2RlIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBjbGFzc2VzIGF0IHRoaXMgbGV2ZWwuCiAgVGVtcG9yYXJ5LAoKICAvLy8gVGhlIGNsYXNzIG1heSBiZSB1c2VkIGFzIGEgdHlwZSwgYW5kIGl0IG1heSBjb250YWluIG1lbWJlcnMgdGhhdCBhcmUKICAvLy8gcmVmZXJlbmNlZCBmcm9tIHRoaXMgYnVpbGQgdW5pdC4KICAvLy8KICAvLy8gVGhlIHR5cGUgcGFyYW1ldGVycyBhbmQgdGhlaXIgYm91bmRzIGFyZSBwcmVzZW50LgogIC8vLwogIC8vLyBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgbWVtYmVycyBhcmUgcHJlc2VudC4KICAvLy8KICAvLy8gQWxsIHN1cGVydHlwZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXQgW1R5cGVdIGxldmVsIG9yIGhpZ2hlci4KICBUeXBlLAoKICAvLy8gQWxsIGluc3RhbmNlIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGFyZSBwcmVzZW50LgogIC8vLwogIC8vLyBBbGwgc3VwZXJ0eXBlcyBvZiB0aGlzIGNsYXNzIGFyZSBhdCBbSGllcmFyY2h5XSBsZXZlbCBvciBoaWdoZXIuCiAgLy8vCiAgLy8vIFRoaXMgbGV2ZWwgZXhpc3RzIHNvIHN1cGVydHlwZXMgb2YgYSBmdWxseSBsb2FkZWQgY2xhc3MgY29udGFpbiBhbGwgdGhlCiAgLy8vIG1lbWJlcnMgbmVlZGVkIHRvIGRldGVjdCBvdmVycmlkZSBjb25zdHJhaW50cy4KICBIaWVyYXJjaHksCgogIC8vLyBBbGwgaW5zdGFuY2UgbWVtYmVycyBvZiB0aGUgY2xhc3MgaGF2ZSB0aGVpciBib2R5IGxvYWRlZCwgYW5kIHRoZWlyCiAgLy8vIGFubm90YXRpb25zIGFyZSBwcmVzZW50LgogIC8vLwogIC8vLyBBbGwgc3VwZXJ0eXBlcyBvZiB0aGlzIGNsYXNzIGFyZSBhdCBbSGllcmFyY2h5XSBsZXZlbCBvciBoaWdoZXIuCiAgLy8vCiAgLy8vIElmIHRoaXMgY2xhc3MgaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiwgdGhlbiBpdHMgbWl4aW4gaXMgbG9hZGVkIGF0IFtNaXhpbl0KICAvLy8gbGV2ZWwgb3IgaGlnaGVyLgogIC8vLwogIC8vLyBUaGlzIGxldmVsIGV4aXN0cyBzbyB0aGUgY29udGVudHMgb2YgYSBtaXhpbiBjYW4gYmUgY2xvbmVkIGludG8gYQogIC8vLyBtaXhpbiBhcHBsaWNhdGlvbi4KICBNaXhpbiwKCiAgLy8vIEFsbCBtZW1iZXJzIG9mIHRoZSBjbGFzcyBhcmUgZnVsbHkgbG9hZGVkIGFuZCBhcmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCiAgLy8vCiAgLy8vIEFubm90YXRpb25zIGFyZSBwcmVzZW50IG9uIGNsYXNzZXMgYW5kIG1lbWJlcnMuCiAgLy8vCiAgLy8vIEFsbCBzdXBlcnR5cGVzIG9mIHRoaXMgY2xhc3MgYXJlIGF0IFtIaWVyYXJjaHldIGxldmVsIG9yIGhpZ2hlciwKICAvLy8gbm90IG5lY2Vzc2FyaWx5IGF0IFtCb2R5XSBsZXZlbC4KICBCb2R5LAp9CgovLy8gTGlzdC13cmFwcGVyIHRoYXQgbWFya3MgdGhlIHBhcmVudC1jbGFzcyBhcyBkaXJ0eSBpZiB0aGUgbGlzdCBpcyBtb2RpZmllZC4KLy8vCi8vLyBUaGUgaWRlYSBiZWluZywgdGhhdCBmb3Igbm9uLWRpcnR5IGNsYXNzZXMgKGNsYXNzZXMganVzdCBsb2FkZWQgZnJvbSBkaWxsKQovLy8gdGhlIGNhbm9uaWNhbCBuYW1lcyBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQsIGFuZCByZWNhbGN1bGF0aW5nIHRoZW0gaXMKLy8vIG5vdCBuZWVkZWQuIElmLCBob3dldmVyLCB3ZSBjaGFuZ2UgYW55dGhpbmcsIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNhbm9uaWNhbAovLy8gbmFtZXMgY2FuIGJlIG5lZWRlZC4KY2xhc3MgRGlydGlmeWluZ0xpc3Q8RT4gZXh0ZW5kcyBMaXN0QmFzZTxFPiB7CiAgZmluYWwgQ2xhc3MgZGlydGlmeUNsYXNzOwogIGZpbmFsIExpc3Q8RT4gd3JhcHBlZDsKCiAgRGlydGlmeWluZ0xpc3QodGhpcy5kaXJ0aWZ5Q2xhc3MsIHRoaXMud3JhcHBlZCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoIHsKICAgIHJldHVybiB3cmFwcGVkLmxlbmd0aDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGxlbmd0aChpbnQgbGVuZ3RoKSB7CiAgICBkaXJ0aWZ5Q2xhc3MuZGlydHkgPSB0cnVlOwogICAgd3JhcHBlZC5sZW5ndGggPSBsZW5ndGg7CiAgfQoKICBAb3ZlcnJpZGUKICBFIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgcmV0dXJuIHdyYXBwZWRbaW5kZXhdOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBkaXJ0aWZ5Q2xhc3MuZGlydHkgPSB0cnVlOwogICAgd3JhcHBlZFtpbmRleF0gPSB2YWx1ZTsKICB9Cn0KCi8vLyBEZWNsYXJhdGlvbiBvZiBhIHJlZ3VsYXIgY2xhc3Mgb3IgYSBtaXhpbiBhcHBsaWNhdGlvbi4KLy8vCi8vLyBNaXhpbiBhcHBsaWNhdGlvbnMgbWF5IG5vdCBjb250YWluIGZpZWxkcyBvciBwcm9jZWR1cmVzLCBhcyB0aGV5IGltcGxpY2l0bHkKLy8vIHVzZSB0aG9zZSBmcm9tIGl0cyBtaXhlZC1pbiB0eXBlLiAgSG93ZXZlciwgdGhlIElSIGRvZXMgbm90IGVuZm9yY2UgdGhpcwovLy8gcnVsZSBkaXJlY3RseSwgYXMgZG9pbmcgc28gY2FuIG9ic3RydWN0IHRyYW5zZm9ybWF0aW9ucy4gIEl0IGlzIHBvc3NpYmxlIHRvCi8vLyB0cmFuc2Zvcm0gYSBtaXhpbiBhcHBsaWNhdGlvbiB0byBiZWNvbWUgYSByZWd1bGFyIGNsYXNzLCBhbmQgdmljZSB2ZXJzYS4KY2xhc3MgQ2xhc3MgZXh0ZW5kcyBOYW1lZE5vZGUgaW1wbGVtZW50cyBBbm5vdGF0YWJsZSwgRmlsZVVyaU5vZGUgewogIC8vLyBTdGFydCBvZmZzZXQgb2YgdGhlIGNsYXNzIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhbm5vdGF0aW9ucyBpZiBhbnkuCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlCiAgLy8vIHN0YXJ0IG9mZnNldCBpcyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5CiAgLy8vIHNldCkuCiAgaW50IHN0YXJ0RmlsZU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICAvLy8gRW5kIG9mZnNldCBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kCiAgLy8vIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUgZW5kIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlCiAgLy8vICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5IHNldCkuCiAgaW50IGZpbGVFbmRPZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgLy8vIFRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBoYXZlIGJlZW4gbG9hZGVkLgogIENsYXNzTGV2ZWwgbGV2ZWwgPSBDbGFzc0xldmVsLkJvZHk7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgLy8vIE5hbWUgb2YgdGhlIGNsYXNzLgogIC8vLwogIC8vLyBNdXN0IGJlIG5vbi1udWxsIGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGxpYnJhcnkuCiAgLy8vCiAgLy8vIFRoZSBuYW1lIG1heSBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHZhbGlkIGluIGEgRGFydCBpZGVudGlmaWVyLAogIC8vLyBpbiBwYXJ0aWN1bGFyLCB0aGUgc3ltYm9sICcmJyBpcyB1c2VkIGluIGNsYXNzIG5hbWVzIGdlbmVyYXRlZCBmb3IgbWl4aW4KICAvLy8gYXBwbGljYXRpb25zLgogIFN0cmluZyBuYW1lOwoKICAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IExldmVsTWFzayA9IDB4MzsgLy8gQml0cyAwIGFuZCAxLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0Fic3RyYWN0ID0gMSA8PCAyOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0VudW0gPSAxIDw8IDM7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnQW5vbnltb3VzTWl4aW4gPSAxIDw8IDQ7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnRWxpbWluYXRlZE1peGluID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ01peGluRGVjbGFyYXRpb24gPSAxIDw8IDY7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnSGFzQ29uc3RDb25zdHJ1Y3RvciA9IDEgPDwgNzsKCiAgaW50IGZsYWdzID0gMDsKCiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiBmbGFncyAmIEZsYWdBYnN0cmFjdCAhPSAwOwoKICB2b2lkIHNldCBpc0Fic3RyYWN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQWJzdHJhY3QpIDogKGZsYWdzICYgfkZsYWdBYnN0cmFjdCk7CiAgfQoKICAvLy8gV2hldGhlciB0aGlzIGNsYXNzIGlzIGFuIGVudW0uCiAgYm9vbCBnZXQgaXNFbnVtID0+IGZsYWdzICYgRmxhZ0VudW0gIT0gMDsKCiAgdm9pZCBzZXQgaXNFbnVtKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRW51bSkgOiAoZmxhZ3MgJiB+RmxhZ0VudW0pOwogIH0KCiAgLy8vIFdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhIHN5bnRoZXRpYyBpbXBsZW1lbnRhdGlvbiBjcmVhdGVkIGZvciBlYWNoCiAgLy8vIG1peGVkLWluIGNsYXNzLiBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGNvZGU6CiAgLy8vIGNsYXNzIFogZXh0ZW5kcyBBIHdpdGggQiwgQywgRCB7fQogIC8vLyBjbGFzcyBBIHt9CiAgLy8vIGNsYXNzIEIge30KICAvLy8gY2xhc3MgQyB7fQogIC8vLyBjbGFzcyBEIHt9CiAgLy8vIC4uLmNyZWF0ZXM6CiAgLy8vIGFic3RyYWN0IGNsYXNzIF9aJkEmQiBleHRlbmRzIEEgbWl4ZWRJbiBCIHt9CiAgLy8vIGFic3RyYWN0IGNsYXNzIF9aJkEmQiZDIGV4dGVuZHMgQSZCIG1peGVkSW4gQyB7fQogIC8vLyBhYnN0cmFjdCBjbGFzcyBfWiZBJkImQyZEIGV4dGVuZHMgQSZCJkMgbWl4ZWRJbiBEIHt9CiAgLy8vIGNsYXNzIFogZXh0ZW5kcyBfWiZBJkImQyZEIHt9CiAgLy8vIEFsbCBYJlkgY2xhc3NlcyBhcmUgbWFya2VkIGFzIHN5bnRoZXRpYy4KICBib29sIGdldCBpc0Fub255bW91c01peGluID0+IGZsYWdzICYgRmxhZ0Fub255bW91c01peGluICE9IDA7CgogIHZvaWQgc2V0IGlzQW5vbnltb3VzTWl4aW4oYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPQogICAgICAgIHZhbHVlID8gKGZsYWdzIHwgRmxhZ0Fub255bW91c01peGluKSA6IChmbGFncyAmIH5GbGFnQW5vbnltb3VzTWl4aW4pOwogIH0KCiAgLy8vIFdoZXRoZXIgdGhpcyBjbGFzcyB3YXMgdHJhbnNmb3JtZWQgZnJvbSBhIG1peGluIGFwcGxpY2F0aW9uLgogIC8vLyBJbiBzdWNoIGNhc2UsIGl0cyBtaXhlZC1pbiB0eXBlIHdhcyBwdWxsZWQgaW50byB0aGUgZW5kIG9mIGltcGxlbWVudGVkCiAgLy8vIHR5cGVzIGxpc3QuCiAgYm9vbCBnZXQgaXNFbGltaW5hdGVkTWl4aW4gPT4gZmxhZ3MgJiBGbGFnRWxpbWluYXRlZE1peGluICE9IDA7CgogIHZvaWQgc2V0IGlzRWxpbWluYXRlZE1peGluKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0KICAgICAgICB2YWx1ZSA/IChmbGFncyB8IEZsYWdFbGltaW5hdGVkTWl4aW4pIDogKGZsYWdzICYgfkZsYWdFbGltaW5hdGVkTWl4aW4pOwogIH0KCiAgLy8vIFRydWUgaWYgdGhpcyBjbGFzcyB3YXMgYSBtaXhpbiBkZWNsYXJhdGlvbiBpbiBEYXJ0LgogIC8vLwogIC8vLyBNaXhpbnMgYXJlIGRlY2xhcmVkIGluIERhcnQgd2l0aCB0aGUgYG1peGluYCBrZXl3b3JkLiAgVGhleSBhcmUgY29tcGlsZWQKICAvLy8gdG8gS2VybmVsIGNsYXNzZXMuCiAgYm9vbCBnZXQgaXNNaXhpbkRlY2xhcmF0aW9uID0+IGZsYWdzICYgRmxhZ01peGluRGVjbGFyYXRpb24gIT0gMDsKCiAgdm9pZCBzZXQgaXNNaXhpbkRlY2xhcmF0aW9uKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdNaXhpbkRlY2xhcmF0aW9uKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdNaXhpbkRlY2xhcmF0aW9uKTsKICB9CgogIC8vLyBUcnVlIGlmIHRoaXMgY2xhc3MgZGVjbGFyZXMgb25lIG9yIG1vcmUgY29uc3RhbnQgY29uc3RydWN0b3JzLgogIGJvb2wgZ2V0IGhhc0NvbnN0Q29uc3RydWN0b3IgPT4gZmxhZ3MgJiBGbGFnSGFzQ29uc3RDb25zdHJ1Y3RvciAhPSAwOwoKICB2b2lkIHNldCBoYXNDb25zdENvbnN0cnVjdG9yKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdIYXNDb25zdENvbnN0cnVjdG9yKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdIYXNDb25zdENvbnN0cnVjdG9yKTsKICB9CgogIExpc3Q8U3VwZXJ0eXBlPiBzdXBlcmNsYXNzQ29uc3RyYWludHMoKSB7CiAgICB2YXIgY29uc3RyYWludHMgPSA8U3VwZXJ0eXBlPltdOwoKICAgIC8vIE5vdCBhIG1peGluIGRlY2xhcmF0aW9uLgogICAgaWYgKCFpc01peGluRGVjbGFyYXRpb24pIHJldHVybiBjb25zdHJhaW50czsKCiAgICAvLyBPdGhlcndpc2Ugd2UgaGF2ZSBhIGxlZnQtbGluZWFyIGJpbmFyeSB0cmVlIChzdWJ0cmVlcyBhcmUgc3VwZXJ0eXBlIGFuZAogICAgLy8gbWl4ZWRJblR5cGUpIG9mIGNvbnN0cmFpbnRzLCB3aGVyZSBhbGwgdGhlIGludGVyaW9yIG5vZGVzIGFyZSBhbm9ueW1vdXMKICAgIC8vIG1peGluIGFwcGxpY2F0aW9ucy4KICAgIFN1cGVydHlwZSBjdXJyZW50ID0gc3VwZXJ0eXBlOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmNsYXNzTm9kZS5pc0Fub255bW91c01peGluKSB7CiAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnQuY2xhc3NOb2RlOwogICAgICBhc3NlcnQoY3VycmVudENsYXNzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RoID09IDIpOwogICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoY3VycmVudCk7CiAgICAgIGNvbnN0cmFpbnRzLmFkZCgKICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKGN1cnJlbnRDbGFzcy5pbXBsZW1lbnRlZFR5cGVzWzFdKSk7CiAgICAgIGN1cnJlbnQgPQogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVTdXBlcnR5cGUoY3VycmVudENsYXNzLmltcGxlbWVudGVkVHlwZXNbMF0pOwogICAgfQogICAgcmV0dXJuIGNvbnN0cmFpbnRzLi5hZGQoY3VycmVudCk7CiAgfQoKICAvLy8gVGhlIFVSSSBvZiB0aGUgc291cmNlIGZpbGUgdGhpcyBjbGFzcyB3YXMgbG9hZGVkIGZyb20uCiAgVXJpIGZpbGVVcmk7CgogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CgogIC8vLyBUaGUgaW1tZWRpYXRlIHN1cGVyIHR5cGUsIG9yIGBudWxsYCBpZiB0aGlzIGlzIHRoZSByb290IGNsYXNzLgogIFN1cGVydHlwZSBzdXBlcnR5cGU7CgogIC8vLyBUaGUgbWl4ZWQtaW4gdHlwZSBpZiB0aGlzIGlzIGEgbWl4aW4gYXBwbGljYXRpb24sIG90aGVyd2lzZSBgbnVsbGAuCiAgU3VwZXJ0eXBlIG1peGVkSW5UeXBlOwoKICAvLy8gVGhlIHR5cGVzIGZyb20gdGhlIGBpbXBsZW1lbnRzYCBjbGF1c2UuCiAgZmluYWwgTGlzdDxTdXBlcnR5cGU+IGltcGxlbWVudGVkVHlwZXM7CgogIC8vLyBJbnRlcm5hbC4gU2hvdWxkICpPTkxZKiBiZSB1c2VkIGZyb20gd2l0aGluIGtlcm5lbC4KICAvLy8KICAvLy8gSWYgbm9uLW51bGwsIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgaGF2ZSB0byBiZSBjYWxsZWQgdG8gZmlsbC1vdXQgdGhlCiAgLy8vIGNvbnRlbnQgb2YgdGhpcyBjbGFzcy4gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkKICAvLy8gdGhvdWdoLgogIHZvaWQgRnVuY3Rpb24oKSBsYXp5QnVpbGRlcjsKCiAgLy8vIE1ha2VzIHN1cmUgdGhlIGNsYXNzIGlzIGxvYWRlZCwgaS5lLiB0aGUgZmllbGRzLCBwcm9jZWR1cmVzIGV0YyBoYXZlIGJlZW4KICAvLy8gbG9hZGVkIGZyb20gdGhlIGRpbGwuIEdlbmVyYWxseSwgb25lIHNob3VsZCBub3QgbmVlZCB0byBjYWxsIHRoaXMgYXMgaXQgaXMKICAvLy8gZG9uZSBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzaW5nIHRoZSBsaXN0cy4KICB2b2lkIGVuc3VyZUxvYWRlZCgpIHsKICAgIGlmIChsYXp5QnVpbGRlciAhPSBudWxsKSB7CiAgICAgIHZhciBsYXp5QnVpbGRlckxvY2FsID0gbGF6eUJ1aWxkZXI7CiAgICAgIGxhenlCdWlsZGVyID0gbnVsbDsKICAgICAgbGF6eUJ1aWxkZXJMb2NhbCgpOwogICAgfQogIH0KCiAgLy8vIEludGVybmFsLiBTaG91bGQgKk9OTFkqIGJlIHVzZWQgZnJvbSB3aXRoaW4ga2VybmVsLgogIC8vLwogIC8vLyBVc2VkIGZvciBhZGRpbmcgZmllbGRzIHdoZW4gcmVhZGluZyB0aGUgZGlsbCBmaWxlLgogIGZpbmFsIExpc3Q8RmllbGQ+IGZpZWxkc0ludGVybmFsOwogIERpcnRpZnlpbmdMaXN0PEZpZWxkPiBfZmllbGRzVmlldzsKCiAgLy8vIEZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBtaXhpbiBhcHBsaWNhdGlvbnMgdGhpcyBzaG91bGQgYmUgZW1wdHkuCiAgTGlzdDxGaWVsZD4gZ2V0IGZpZWxkcyB7CiAgICBlbnN1cmVMb2FkZWQoKTsKICAgIC8vIElmIGFscmVhZHkgZGlydHkgdGhlIGNhbGxlciBqdXN0IG1pZ2h0IGFzIHdlbGwgYWRkIHN0dWZmIGRpcmVjdGx5IHRvby4KICAgIGlmIChkaXJ0eSkgcmV0dXJuIGZpZWxkc0ludGVybmFsOwogICAgX2ZpZWxkc1ZpZXcgPz89IG5ldyBEaXJ0aWZ5aW5nTGlzdCh0aGlzLCBmaWVsZHNJbnRlcm5hbCk7CiAgICByZXR1cm4gX2ZpZWxkc1ZpZXc7CiAgfQoKICAvLy8gSW50ZXJuYWwuIFNob3VsZCAqT05MWSogYmUgdXNlZCBmcm9tIHdpdGhpbiBrZXJuZWwuCiAgLy8vCiAgLy8vIFVzZWQgZm9yIGFkZGluZyBjb25zdHJ1Y3RvcnMgd2hlbiByZWFkaW5nIHRoZSBkaWxsIGZpbGUuCiAgZmluYWwgTGlzdDxDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzSW50ZXJuYWw7CiAgRGlydGlmeWluZ0xpc3Q8Q29uc3RydWN0b3I+IF9jb25zdHJ1Y3RvcnNWaWV3OwoKICAvLy8gQ29uc3RydWN0b3JzIGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICBMaXN0PENvbnN0cnVjdG9yPiBnZXQgY29uc3RydWN0b3JzIHsKICAgIGVuc3VyZUxvYWRlZCgpOwogICAgLy8gSWYgYWxyZWFkeSBkaXJ0eSB0aGUgY2FsbGVyIGp1c3QgbWlnaHQgYXMgd2VsbCBhZGQgc3R1ZmYgZGlyZWN0bHkgdG9vLgogICAgaWYgKGRpcnR5KSByZXR1cm4gY29uc3RydWN0b3JzSW50ZXJuYWw7CiAgICBfY29uc3RydWN0b3JzVmlldyA/Pz0gbmV3IERpcnRpZnlpbmdMaXN0KHRoaXMsIGNvbnN0cnVjdG9yc0ludGVybmFsKTsKICAgIHJldHVybiBfY29uc3RydWN0b3JzVmlldzsKICB9CgogIC8vLyBJbnRlcm5hbC4gU2hvdWxkICpPTkxZKiBiZSB1c2VkIGZyb20gd2l0aGluIGtlcm5lbC4KICAvLy8KICAvLy8gVXNlZCBmb3IgYWRkaW5nIHByb2NlZHVyZXMgd2hlbiByZWFkaW5nIHRoZSBkaWxsIGZpbGUuCiAgZmluYWwgTGlzdDxQcm9jZWR1cmU+IHByb2NlZHVyZXNJbnRlcm5hbDsKICBEaXJ0aWZ5aW5nTGlzdDxQcm9jZWR1cmU+IF9wcm9jZWR1cmVzVmlldzsKCiAgLy8vIFByb2NlZHVyZXMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogIC8vLwogIC8vLyBGb3IgbWl4aW4gYXBwbGljYXRpb25zIHRoaXMgc2hvdWxkIG9ubHkgY29udGFpbiBmb3J3YXJkaW5nIHN0dWJzLgogIExpc3Q8UHJvY2VkdXJlPiBnZXQgcHJvY2VkdXJlcyB7CiAgICBlbnN1cmVMb2FkZWQoKTsKICAgIC8vIElmIGFscmVhZHkgZGlydHkgdGhlIGNhbGxlciBqdXN0IG1pZ2h0IGFzIHdlbGwgYWRkIHN0dWZmIGRpcmVjdGx5IHRvby4KICAgIGlmIChkaXJ0eSkgcmV0dXJuIHByb2NlZHVyZXNJbnRlcm5hbDsKICAgIF9wcm9jZWR1cmVzVmlldyA/Pz0gbmV3IERpcnRpZnlpbmdMaXN0KHRoaXMsIHByb2NlZHVyZXNJbnRlcm5hbCk7CiAgICByZXR1cm4gX3Byb2NlZHVyZXNWaWV3OwogIH0KCiAgLy8vIEludGVybmFsLiBTaG91bGQgKk9OTFkqIGJlIHVzZWQgZnJvbSB3aXRoaW4ga2VybmVsLgogIC8vLwogIC8vLyBVc2VkIGZvciBhZGRpbmcgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvciB3aGVuIHJlYWRpbmcgdGhlIGRpbGwKICAvLy8gZmlsZS4KICBmaW5hbCBMaXN0PFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yPgogICAgICByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNJbnRlcm5hbDsKICBEaXJ0aWZ5aW5nTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4KICAgICAgX3JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1ZpZXc7CgogIC8vLyBSZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgLy8vCiAgLy8vIEZvciBtaXhpbiBhcHBsaWNhdGlvbnMgdGhpcyBzaG91bGQgYmUgZW1wdHkuCiAgTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4gZ2V0IHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyB7CiAgICBlbnN1cmVMb2FkZWQoKTsKICAgIC8vIElmIGFscmVhZHkgZGlydHkgdGhlIGNhbGxlciBqdXN0IG1pZ2h0IGFzIHdlbGwgYWRkIHN0dWZmIGRpcmVjdGx5IHRvby4KICAgIGlmIChkaXJ0eSkgcmV0dXJuIHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0ludGVybmFsOwogICAgX3JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1ZpZXcgPz89CiAgICAgICAgbmV3IERpcnRpZnlpbmdMaXN0KHRoaXMsIHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0ludGVybmFsKTsKICAgIHJldHVybiBfcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzVmlldzsKICB9CgogIENsYXNzKAogICAgICB7dGhpcy5uYW1lLAogICAgICBib29sIGlzQWJzdHJhY3Q6IGZhbHNlLAogICAgICBib29sIGlzQW5vbnltb3VzTWl4aW46IGZhbHNlLAogICAgICB0aGlzLnN1cGVydHlwZSwKICAgICAgdGhpcy5taXhlZEluVHlwZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgTGlzdDxTdXBlcnR5cGU+IGltcGxlbWVudGVkVHlwZXMsCiAgICAgIExpc3Q8Q29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycywKICAgICAgTGlzdDxQcm9jZWR1cmU+IHByb2NlZHVyZXMsCiAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcywKICAgICAgTGlzdDxSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcj4gcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLAogICAgICB0aGlzLmZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2V9KQogICAgICA6IHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycyA/PyA8VHlwZVBhcmFtZXRlcj5bXSwKICAgICAgICB0aGlzLmltcGxlbWVudGVkVHlwZXMgPSBpbXBsZW1lbnRlZFR5cGVzID8/IDxTdXBlcnR5cGU+W10sCiAgICAgICAgdGhpcy5maWVsZHNJbnRlcm5hbCA9IGZpZWxkcyA/PyA8RmllbGQ+W10sCiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvcnNJbnRlcm5hbCA9IGNvbnN0cnVjdG9ycyA/PyA8Q29uc3RydWN0b3I+W10sCiAgICAgICAgdGhpcy5wcm9jZWR1cmVzSW50ZXJuYWwgPSBwcm9jZWR1cmVzID8/IDxQcm9jZWR1cmU+W10sCiAgICAgICAgdGhpcy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNJbnRlcm5hbCA9CiAgICAgICAgICAgIHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyA/PyA8UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3I+W10sCiAgICAgICAgc3VwZXIocmVmZXJlbmNlKSB7CiAgICBzZXRQYXJlbnRzKHRoaXMudHlwZVBhcmFtZXRlcnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLmNvbnN0cnVjdG9yc0ludGVybmFsLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5wcm9jZWR1cmVzSW50ZXJuYWwsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLmZpZWxkc0ludGVybmFsLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNJbnRlcm5hbCwgdGhpcyk7CiAgICB0aGlzLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwogICAgdGhpcy5pc0Fub255bW91c01peGluID0gaXNBbm9ueW1vdXNNaXhpbjsKICB9CgogIHZvaWQgY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCkgewogICAgYXNzZXJ0KGNhbm9uaWNhbE5hbWUgIT0gbnVsbCk7CiAgICBpZiAoIWRpcnR5KSByZXR1cm47CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7ICsraSkgewogICAgICBGaWVsZCBtZW1iZXIgPSBmaWVsZHNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKG1lbWJlcikuYmluZFRvKG1lbWJlci5yZWZlcmVuY2UpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZWR1cmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFByb2NlZHVyZSBtZW1iZXIgPSBwcm9jZWR1cmVzW2ldOwogICAgICBjYW5vbmljYWxOYW1lLmdldENoaWxkRnJvbU1lbWJlcihtZW1iZXIpLmJpbmRUbyhtZW1iZXIucmVmZXJlbmNlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgKytpKSB7CiAgICAgIENvbnN0cnVjdG9yIG1lbWJlciA9IGNvbnN0cnVjdG9yc1tpXTsKICAgICAgY2Fub25pY2FsTmFtZS5nZXRDaGlsZEZyb21NZW1iZXIobWVtYmVyKS5iaW5kVG8obWVtYmVyLnJlZmVyZW5jZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycy5sZW5ndGg7ICsraSkgewogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBtZW1iZXIgPSByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNbaV07CiAgICAgIGNhbm9uaWNhbE5hbWUuZ2V0Q2hpbGRGcm9tTWVtYmVyKG1lbWJlcikuYmluZFRvKG1lbWJlci5yZWZlcmVuY2UpOwogICAgfQogICAgZGlydHkgPSBmYWxzZTsKICB9CgogIC8vLyBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUuIFVzZSBvZiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29vcmRpbmF0ZWQKICAvLy8gd2l0aCB0aGUga2VybmVsIHRlYW0uCiAgLy8vCiAgLy8vIFNlZSBbQ29tcG9uZW50LnJlbGlua10gZm9yIGEgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbi4KICAvLy8KICAvLy8gTWFrZXMgc3VyZSBhbGwgcmVmZXJlbmNlcyBpbiBuYW1lZCBub2RlcyBpbiB0aGlzIGNsYXNzIHBvaW50cyB0byBzYWlkCiAgLy8vIG5hbWVkIG5vZGUuCiAgdm9pZCByZWxpbmsoKSB7CiAgICB0aGlzLnJlZmVyZW5jZS5ub2RlID0gdGhpczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgKytpKSB7CiAgICAgIEZpZWxkIG1lbWJlciA9IGZpZWxkc1tpXTsKICAgICAgbWVtYmVyLl9yZWxpbmtOb2RlKCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZXMubGVuZ3RoOyArK2kpIHsKICAgICAgUHJvY2VkdXJlIG1lbWJlciA9IHByb2NlZHVyZXNbaV07CiAgICAgIG1lbWJlci5fcmVsaW5rTm9kZSgpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyArK2kpIHsKICAgICAgQ29uc3RydWN0b3IgbWVtYmVyID0gY29uc3RydWN0b3JzW2ldOwogICAgICBtZW1iZXIuX3JlbGlua05vZGUoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLmxlbmd0aDsgKytpKSB7CiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG1lbWJlciA9IHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1tpXTsKICAgICAgbWVtYmVyLl9yZWxpbmtOb2RlKCk7CiAgICB9CiAgICBkaXJ0eSA9IGZhbHNlOwogIH0KCiAgLy8vIFRoZSBpbW1lZGlhdGUgc3VwZXIgY2xhc3MsIG9yIGBudWxsYCBpZiB0aGlzIGlzIHRoZSByb290IGNsYXNzLgogIENsYXNzIGdldCBzdXBlcmNsYXNzID0+IHN1cGVydHlwZT8uY2xhc3NOb2RlOwoKICAvLy8gVGhlIG1peGVkLWluIGNsYXNzIGlmIHRoaXMgaXMgYSBtaXhpbiBhcHBsaWNhdGlvbiwgb3RoZXJ3aXNlIGBudWxsYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGl0c2VsZiBiZSBhIG1peGluIGFwcGxpY2F0aW9uLiAgVXNlIFttaXhpbl0gdG8gZ2V0IHRoZQogIC8vLyBjbGFzcyB0aGF0IGhhcyB0aGUgZmllbGRzIGFuZCBwcm9jZWR1cmVzLgogIENsYXNzIGdldCBtaXhlZEluQ2xhc3MgPT4gbWl4ZWRJblR5cGU/LmNsYXNzTm9kZTsKCiAgLy8vIFRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoZSBmaWVsZCBhbmQgcHJvY2VkdXJlcyBvZiB0aGlzIGNsYXNzLgogIENsYXNzIGdldCBtaXhpbiA9PiBtaXhlZEluQ2xhc3M/Lm1peGluID8/IHRoaXM7CgogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbiA9PiBtaXhlZEluVHlwZSAhPSBudWxsOwoKICBTdHJpbmcgZ2V0IGRlbWFuZ2xlZE5hbWUgewogICAgaWYgKGlzQW5vbnltb3VzTWl4aW4pIHJldHVybiBuYW1lQXNNaXhpbkFwcGxpY2F0aW9uOwogICAgYXNzZXJ0KCFuYW1lLmNvbnRhaW5zKCcmJykpOwogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWVBc01peGluQXBwbGljYXRpb24gewogICAgYXNzZXJ0KGlzQW5vbnltb3VzTWl4aW4pOwogICAgcmV0dXJuIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWVBc01peGluQXBwbGljYXRpb25TdWJjbGFzcyB7CiAgICBhc3NlcnQoaXNBbm9ueW1vdXNNaXhpbik7CiAgICByZXR1cm4gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uU3ViY2xhc3NOYW1lKG5hbWUpOwogIH0KCiAgLy8vIE1lbWJlcnMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcy4KICAvLy8KICAvLy8gVGhpcyBnZXR0ZXIgaXMgZm9yIGNvbnZlbmllbmNlLCBub3QgZWZmaWNpZW5jeS4gIENvbnNpZGVyIG1hbnVhbGx5CiAgLy8vIGl0ZXJhdGluZyB0aGUgbWVtYmVycyB0byBzcGVlZCB1cCBjb2RlIGluIHByb2R1Y3Rpb24uCiAgSXRlcmFibGU8TWVtYmVyPiBnZXQgbWVtYmVycyA9PiA8SXRlcmFibGU8TWVtYmVyPj5bCiAgICAgICAgZmllbGRzLAogICAgICAgIGNvbnN0cnVjdG9ycywKICAgICAgICBwcm9jZWR1cmVzLAogICAgICAgIHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycwogICAgICBdLmV4cGFuZCgoeCkgPT4geCk7CgogIC8vLyBUaGUgaW1tZWRpYXRlbHkgZXh0ZW5kZWQsIG1peGVkLWluLCBhbmQgaW1wbGVtZW50ZWQgdHlwZXMuCiAgLy8vCiAgLy8vIFRoaXMgZ2V0dGVyIGlzIGZvciBjb252ZW5pZW5jZSwgbm90IGVmZmljaWVuY3kuICBDb25zaWRlciBtYW51YWxseQogIC8vLyBpdGVyYXRpbmcgdGhlIHN1cGVyIHR5cGVzIHRvIHNwZWVkIHVwIGNvZGUgaW4gcHJvZHVjdGlvbi4KICBJdGVyYWJsZTxTdXBlcnR5cGU+IGdldCBzdXBlcnMgPT4gPEl0ZXJhYmxlPFN1cGVydHlwZT4+WwogICAgICAgIHN1cGVydHlwZSA9PSBudWxsID8gY29uc3QgW10gOiBbc3VwZXJ0eXBlXSwKICAgICAgICBtaXhlZEluVHlwZSA9PSBudWxsID8gY29uc3QgW10gOiBbbWl4ZWRJblR5cGVdLAogICAgICAgIGltcGxlbWVudGVkVHlwZXMKICAgICAgXS5leHBhbmQoKHgpID0+IHgpOwoKICAvLy8gVGhlIGxpYnJhcnkgY29udGFpbmluZyB0aGlzIGNsYXNzLgogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50OwoKICAvLy8gSW50ZXJuYWwuIFNob3VsZCAqT05MWSogYmUgdXNlZCBmcm9tIHdpdGhpbiBrZXJuZWwuCiAgLy8vCiAgLy8vIElmIHRydWUgd2UgaGF2ZSB0byBjb21wdXRlIGNhbm9uaWNhbCBuYW1lcyBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoaXMgY2xhc3MuCiAgLy8vIGlmIGZhbHNlIHdlIGNhbiBza2lwIGl0LgogIGJvb2wgZGlydHkgPSB0cnVlOwoKICAvLy8gQWRkcyBhIG1lbWJlciB0byB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBUaHJvd3MgYW4gZXJyb3IgaWYgYXR0ZW1wdGluZyB0byBhZGQgYSBmaWVsZCBvciBwcm9jZWR1cmUgdG8gYSBtaXhpbgogIC8vLyBhcHBsaWNhdGlvbi4KICB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBkaXJ0eSA9IHRydWU7CiAgICBtZW1iZXIucGFyZW50ID0gdGhpczsKICAgIGlmIChtZW1iZXIgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgY29uc3RydWN0b3JzSW50ZXJuYWwuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgcHJvY2VkdXJlc0ludGVybmFsLmFkZChtZW1iZXIpOwogICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgZmllbGRzSW50ZXJuYWwuYWRkKG1lbWJlcik7CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICByZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNJbnRlcm5hbC5hZGQobWVtYmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKG1lbWJlcik7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSkgewogICAgICBhbm5vdGF0aW9ucyA9IDxFeHByZXNzaW9uPltdOwogICAgfQogICAgYW5ub3RhdGlvbnMuYWRkKG5vZGUpOwogICAgbm9kZS5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oVHJlZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdENsYXNzKHRoaXMpOwogIFIgYWNjZXB0UmVmZXJlbmNlPFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdENsYXNzUmVmZXJlbmNlKHRoaXMpOwoKICBTdXBlcnR5cGUgZ2V0IGFzUmF3U3VwZXJ0eXBlIHsKICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKHRoaXMsCiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IER5bmFtaWNUeXBlKCkpKTsKICB9CgogIFN1cGVydHlwZSBnZXQgYXNUaGlzU3VwZXJ0eXBlIHsKICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKAogICAgICAgIHRoaXMsIGdldEFzVHlwZUFyZ3VtZW50cyh0eXBlUGFyYW1ldGVycywgdGhpcy5lbmNsb3NpbmdMaWJyYXJ5KSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBgdGhpc2AgZm9yIHRoZSBjbGFzcyB1c2luZyBbY29yZVR5cGVzXSBmb3IgY2FjaGluZy4KICBJbnRlcmZhY2VUeXBlIGdldFRoaXNUeXBlKENvcmVUeXBlcyBjb3JlVHlwZXMsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICByZXR1cm4gY29yZVR5cGVzLnRoaXNJbnRlcmZhY2VUeXBlKHRoaXMsIG51bGxhYmlsaXR5KTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcG9zc2libHkgc3ludGhlc2l6ZWQgbmFtZSBmb3IgdGhpcyBjbGFzcywgY29uc2lzdGVudCB3aXRoCiAgLy8vIHRoZSBuYW1lcyB1c2VkIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICB2aXNpdExpc3QodHlwZVBhcmFtZXRlcnMsIHYpOwogICAgc3VwZXJ0eXBlPy5hY2NlcHQodik7CiAgICBtaXhlZEluVHlwZT8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGltcGxlbWVudGVkVHlwZXMsIHYpOwogICAgdmlzaXRMaXN0KGNvbnN0cnVjdG9ycywgdik7CiAgICB2aXNpdExpc3QocHJvY2VkdXJlcywgdik7CiAgICB2aXNpdExpc3QoZmllbGRzLCB2KTsKICAgIHZpc2l0TGlzdChyZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHR5cGVQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIGlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewogICAgICBzdXBlcnR5cGUgPSB2LnZpc2l0U3VwZXJ0eXBlKHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAobWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBtaXhlZEluVHlwZSA9IHYudmlzaXRTdXBlcnR5cGUobWl4ZWRJblR5cGUpOwogICAgfQogICAgdHJhbnNmb3JtU3VwZXJ0eXBlTGlzdChpbXBsZW1lbnRlZFR5cGVzLCB2KTsKICAgIHRyYW5zZm9ybUxpc3QoY29uc3RydWN0b3JzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QocHJvY2VkdXJlcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGZpZWxkcywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywgdiwgdGhpcyk7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCi8vLyBEZWNsYXJhdGlvbiBvZiBhbiBleHRlbnNpb24uCi8vLwovLy8gVGhlIG1lbWJlcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRvcC1sZXZlbCBwcm9jZWR1cmVzIGFuZCBvbmx5IGFjY2Vzc2libGUKLy8vIGJ5IHJlZmVyZW5jZSBpbiB0aGUgW0V4dGVuc2lvbl0gbm9kZS4KY2xhc3MgRXh0ZW5zaW9uIGV4dGVuZHMgTmFtZWROb2RlIGltcGxlbWVudHMgRmlsZVVyaU5vZGUgewogIC8vLyBOYW1lIG9mIHRoZSBleHRlbnNpb24uCiAgLy8vCiAgLy8vIElmIHVubmFtZWQsIHRoZSBleHRlbnNpb24gd2lsbCBiZSBnaXZlbiBhIHN5bnRoZXNpemVkIG5hbWUgYnkgdGhlCiAgLy8vIGZyb250IGVuZC4KICBTdHJpbmcgbmFtZTsKCiAgLy8vIFRoZSBVUkkgb2YgdGhlIHNvdXJjZSBmaWxlIHRoaXMgY2xhc3Mgd2FzIGxvYWRlZCBmcm9tLgogIFVyaSBmaWxlVXJpOwoKICAvLy8gVHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIG9uIHRoZSBleHRlbnNpb24uCiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKCiAgLy8vIFRoZSB0eXBlIGluIHRoZSAnb24gY2xhdXNlJyBvZiB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgQSBpbjoKICAvLy8KICAvLy8gICBjbGFzcyBBIHt9CiAgLy8vICAgZXh0ZW5zaW9uIEIgb24gQSB7fQogIC8vLwogIERhcnRUeXBlIG9uVHlwZTsKCiAgLy8vIFRoZSBtZW1iZXJzIGRlY2xhcmVkIGJ5IHRoZSBleHRlbnNpb24uCiAgLy8vCiAgLy8vIFRoZSBtZW1iZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0b3AtbGV2ZWwgbWVtYmVycyBhbmQgb25seSBhY2Nlc3NpYmxlCiAgLy8vIGJ5IHJlZmVyZW5jZSB0aHJvdWdoIFtFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yXS4KICBmaW5hbCBMaXN0PEV4dGVuc2lvbk1lbWJlckRlc2NyaXB0b3I+IG1lbWJlcnM7CgogIEV4dGVuc2lvbigKICAgICAge3RoaXMubmFtZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgdGhpcy5vblR5cGUsCiAgICAgIExpc3Q8UmVmZXJlbmNlPiBtZW1iZXJzLAogICAgICB0aGlzLmZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2V9KQogICAgICA6IHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycyA/PyA8VHlwZVBhcmFtZXRlcj5bXSwKICAgICAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzID8/IDxFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yPltdLAogICAgICAgIHN1cGVyKHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICB9CgogIExpYnJhcnkgZ2V0IGVuY2xvc2luZ0xpYnJhcnkgPT4gcGFyZW50OwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihUcmVlVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0RXh0ZW5zaW9uKHRoaXMpOwoKICBAb3ZlcnJpZGUKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KHR5cGVQYXJhbWV0ZXJzLCB2KTsKICAgIG9uVHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdCh0eXBlUGFyYW1ldGVycywgdiwgdGhpcyk7CiAgICBpZiAob25UeXBlICE9IG51bGwpIHsKICAgICAgb25UeXBlID0gdi52aXNpdERhcnRUeXBlKG9uVHlwZSk7CiAgICB9CiAgfQp9CgplbnVtIEV4dGVuc2lvbk1lbWJlcktpbmQgewogIEZpZWxkLAogIE1ldGhvZCwKICBHZXR0ZXIsCiAgU2V0dGVyLAogIE9wZXJhdG9yLAogIFRlYXJPZmYsCn0KCi8vLyBJbmZvcm1hdGlvbiBhYm91dCBhbiBtZW1iZXIgZGVjbGFyYXRpb24gaW4gYW4gZXh0ZW5zaW9uLgpjbGFzcyBFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yIHsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdTdGF0aWMgPSAxIDw8IDA7IC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBtZW1iZXIuCiAgLy8vCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgdG9wLWxldmVsIG1lbWJlciBpcyBtYW5nbGVkIHRvIGVuc3VyZQogIC8vLyB1bmlxdWVuZXNzLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBsb29rdXAgYW4gZXh0ZW5zaW9uIG1ldGhvZCB0aGUKICAvLy8gZXh0ZW5zaW9uIGl0c2VsZi4KICBOYW1lIG5hbWU7CgogIC8vLyBbRXh0ZW5zaW9uTWVtYmVyS2luZF0ga2luZCBvZiB0aGUgb3JpZ2luYWwgbWVtYmVyLgogIC8vLwogIC8vLyBBbiBleHRlbnNpb24gbWV0aG9kIGlzIGNvbnZlcnRlZCBpbnRvIGEgcmVndWxhciB0b3AtbGV2ZWwgbWV0aG9kLiBGb3IKICAvLy8gaW5zdGFuY2U6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHsKICAvLy8gICAgICAgdmFyIGZvbzsKICAvLy8gICAgIH0KICAvLy8gICAgIGV4dGVuc2lvbiBCIG9uIEEgewogIC8vLyAgICAgICBnZXQgYmFyID0+IHRoaXMuZm9vOwogIC8vLyAgICAgfQogIC8vLwogIC8vLyB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvCiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHt9CiAgLy8vICAgICBCfGdldCNiYXIoQSAjdGhpcykgPT4gI3RoaXMuZm9vOwogIC8vLwogIC8vLyB3aGVyZSBgQnxnZXQjYmFyYCBpcyB0aGUgc3ludGhlc2l6ZWQgbmFtZSBvZiB0aGUgdG9wLWxldmVsIG1ldGhvZCBhbmQKICAvLy8gYCN0aGlzYCBpcyB0aGUgc3ludGhlc2l6ZWQgcGFyYW1ldGVyIHRoYXQgaG9sZHMgcmVwcmVzZW50cyBgdGhpc2AuCiAgLy8vCiAgRXh0ZW5zaW9uTWVtYmVyS2luZCBraW5kOwoKICBpbnQgZmxhZ3MgPSAwOwoKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSB0b3AtbGV2ZWwgbWVtYmVyIGNyZWF0ZWQgZm9yIHRoZSBleHRlbnNpb24gbWV0aG9kLgogIFJlZmVyZW5jZSBtZW1iZXI7CgogIEV4dGVuc2lvbk1lbWJlckRlc2NyaXB0b3IoCiAgICAgIHt0aGlzLm5hbWUsIHRoaXMua2luZCwgYm9vbCBpc1N0YXRpYzogZmFsc2UsIHRoaXMubWVtYmVyfSkgewogICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOwogIH0KCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGV4dGVuc2lvbiBtZXRob2Qgd2FzIGRlY2xhcmVkIGFzIGBzdGF0aWNgLgogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZsYWdzICYgRmxhZ1N0YXRpYyAhPSAwOwoKICB2b2lkIHNldCBpc1N0YXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ1N0YXRpYykgOiAoZmxhZ3MgJiB+RmxhZ1N0YXRpYyk7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNQkVSUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFic3RyYWN0IGNsYXNzIE1lbWJlciBleHRlbmRzIE5hbWVkTm9kZSBpbXBsZW1lbnRzIEFubm90YXRhYmxlLCBGaWxlVXJpTm9kZSB7CiAgLy8vIEVuZCBvZmZzZXQgaW4gdGhlIHNvdXJjZSBmaWxlIGl0IGNvbWVzIGZyb20uCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlCiAgLy8vIGVuZCBvZmZzZXQgaXMgbm90IGF2YWlsYWJsZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseQogIC8vLyBzZXQpLgogIGludCBmaWxlRW5kT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSBtZW1iZXIuCiAgLy8vCiAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gYW4gaW1tdXRhYmxlIGVtcHR5IGxpc3QuIFVzZSBbYWRkQW5ub3RhdGlvbl0gdG8gYWRkCiAgLy8vIGFubm90YXRpb25zIGlmIG5lZWRlZC4KICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gY29uc3QgPEV4cHJlc3Npb24+W107CgogIE5hbWUgbmFtZTsKCiAgLy8vIFRoZSBVUkkgb2YgdGhlIHNvdXJjZSBmaWxlIHRoaXMgbWVtYmVyIHdhcyBsb2FkZWQgZnJvbS4KICBVcmkgZmlsZVVyaTsKCiAgLy8vIEZsYWdzIHN1bW1hcml6aW5nIHRoZSBraW5kcyBvZiBBU1Qgbm9kZXMgY29udGFpbmVkIGluIHRoaXMgbWVtYmVyLCBmb3IKICAvLy8gc3BlZWRpbmcgdXAgdHJhbnNmb3JtYXRpb25zIHRoYXQgb25seSBhZmZlY3QgY2VydGFpbiB0eXBlcyBvZiBub2Rlcy4KICAvLy8KICAvLy8gU2VlIFtUcmFuc2Zvcm1lckZsYWddIGZvciB0aGUgbWVhbmluZyBvZiBlYWNoIGJpdC4KICAvLy8KICAvLy8gVGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBhbnkgcHVycG9zZSBvdGhlciB0aGFuIHNraXBwaW5nIGNlcnRhaW4KICAvLy8gbWVtYmVycyBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCB0aGF0IG5vIHdvcmsgaXMgbmVlZGVkIGluIHRoZXJlLgogIC8vLwogIC8vLyBJdCBpcyB2YWxpZCBmb3IgdGhlc2UgZmxhZ3MgdG8gYmUgZmFsc2UgcG9zaXRpdmVzIGluIHJhcmUgY2FzZXMsIHNvCiAgLy8vIHRyYW5zZm9ybWVycyBtdXN0IHRvbGVyYXRlIHRoZSBjYXNlIHdoZXJlIGEgZmxhZyBpcyBzcHVyaW91c2x5IHNldC4KICAvLy8KICAvLy8gVGhpcyB2YWx1ZSBpcyBub3Qgc2VyaWFsaXplZDsgaXQgaXMgcG9wdWxhdGVkIGJ5IHRoZSBmcm9udGVuZCBhbmQgdGhlCiAgLy8vIGRlc2VyaWFsaXplci4KICAvLwogIC8vIFRPRE8oYXNnZXJmKTogSXQgbWlnaHQgYmUgd29ydGh3aGlsZSB0byBwdXQgdGhpcyBvbiBjbGFzc2VzIGFzIHdlbGwuCiAgaW50IHRyYW5zZm9ybWVyRmxhZ3MgPSAwOwoKICBNZW1iZXIodGhpcy5uYW1lLCB0aGlzLmZpbGVVcmksIFJlZmVyZW5jZSByZWZlcmVuY2UpIDogc3VwZXIocmVmZXJlbmNlKTsKCiAgQ2xhc3MgZ2V0IGVuY2xvc2luZ0NsYXNzID0+IHBhcmVudCBpcyBDbGFzcyA/IHBhcmVudCA6IG51bGw7CiAgTGlicmFyeSBnZXQgZW5jbG9zaW5nTGlicmFyeSA9PiBwYXJlbnQgaXMgQ2xhc3MgPyBwYXJlbnQucGFyZW50IDogcGFyZW50OwoKICBSIGFjY2VwdDxSPihNZW1iZXJWaXNpdG9yPFI+IHYpOwogIGFjY2VwdFJlZmVyZW5jZShNZW1iZXJSZWZlcmVuY2VWaXNpdG9yIHYpOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gYWJzdHJhY3QgcHJvY2VkdXJlLgogIGJvb2wgZ2V0IGlzQWJzdHJhY3QgPT4gZmFsc2U7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lbWJlciBoYXMgdGhlICdjb25zdCcgbW9kaWZpZXIuCiAgYm9vbCBnZXQgaXNDb25zdDsKCiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIGZpZWxkIG9yIG5vbi1zZXR0ZXIgcHJvY2VkdXJlLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgb3BlcmF0b3JzIGFuZCBmYWN0b3JpZXMgcmV0dXJuIGB0cnVlYCwgZXZlbiB0aG91Z2ggdGhlcmUgYXJlCiAgLy8vIG5vcm1hbGx5IG5vIGNhbGxzIHRvIHRoZWlyIGdldHRlci4KICBib29sIGdldCBoYXNHZXR0ZXI7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBzZXR0ZXIgb3IgYSBtdXRhYmxlIGZpZWxkLgogIGJvb2wgZ2V0IGhhc1NldHRlcjsKCiAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIG5vbi1zdGF0aWMgZmllbGQgb3IgcHJvY2VkdXJlLgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXI7CgogIC8vLyBUcnVlIGlmIHRoZSBtZW1iZXIgaGFzIHRoZSBgZXh0ZXJuYWxgIG1vZGlmaWVyLCBpbXBseWluZyB0aGF0IHRoZQogIC8vLyBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCBieSB0aGUgYmFja2VuZCwgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSB3cml0dGVuCiAgLy8vIGluIERhcnQuCiAgLy8vCiAgLy8vIE1lbWJlcnMgY2FuIGhhdmUgdGhpcyBtb2RpZmllciBpbmRlcGVuZGVudGx5IG9mIHdoZXRoZXIgdGhlIGVuY2xvc2luZwogIC8vLyBsaWJyYXJ5IGlzIGV4dGVybmFsLgogIGJvb2wgZ2V0IGlzRXh0ZXJuYWw7CiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKTsKCiAgLy8vIElmIGB0cnVlYCB0aGlzIG1lbWJlciBpcyBjb21waWxlZCBmcm9tIGEgbWVtYmVyIGRlY2xhcmVkIGluIGFuIGV4dGVuc2lvbgogIC8vLyBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBmaWVsZGAsIGBtZXRob2QxYCBhbmQgYG1ldGhvZDJgIGluOgogIC8vLwogIC8vLyAgICAgZXh0ZW5zaW9uIEEgb24gQiB7CiAgLy8vICAgICAgIHN0YXRpYyB2YXIgZmllbGQ7CiAgLy8vICAgICAgIEIgbWV0aG9kMSgpID0+IHRoaXM7CiAgLy8vICAgICAgIHN0YXRpYyBCIG1ldGhvZDIoKSA9PiBuZXcgQigpOwogIC8vLyAgICAgfQogIC8vLwogIGJvb2wgZ2V0IGlzRXh0ZW5zaW9uTWVtYmVyOwoKICAvLy8gSWYgYHRydWVgIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQgaW4gYSBsaWJyYXJ5IGZvciB3aGljaCBub24tbnVsbGFibGUgYnkKICAvLy8gZGVmYXVsdCBpcyBlbmFibGVkLgogIGJvb2wgZ2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CiAgdm9pZCBzZXQgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdChib29sIHZhbHVlKTsKCiAgLy8vIFRoZSBib2R5IG9mIHRoZSBwcm9jZWR1cmUgb3IgY29uc3RydWN0b3IsIG9yIGBudWxsYCBpZiB0aGlzIGlzIGEgZmllbGQuCiAgRnVuY3Rpb25Ob2RlIGdldCBmdW5jdGlvbiA9PiBudWxsOwoKICAvLy8gUmV0dXJucyBhIHBvc3NpYmx5IHN5bnRoZXNpemVkIG5hbWUgZm9yIHRoaXMgbWVtYmVyLCBjb25zaXN0ZW50IHdpdGgKICAvLy8gdGhlIG5hbWVzIHVzZWQgYWNyb3NzIGFsbCBbdG9TdHJpbmddIGNhbGxzLgogIFN0cmluZyB0b1N0cmluZygpID0+IGRlYnVnUXVhbGlmaWVkTWVtYmVyTmFtZSh0aGlzKTsKCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldCBnZXR0ZXJUeXBlOwogIERhcnRUeXBlIGdldCBzZXR0ZXJUeXBlOwoKICBib29sIGdldCBjb250YWluc1N1cGVyQ2FsbHMgewogICAgcmV0dXJuIHRyYW5zZm9ybWVyRmxhZ3MgJiBUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscyAhPSAwOwogIH0KfQoKLy8vIEEgZmllbGQgZGVjbGFyYXRpb24uCi8vLwovLy8gVGhlIGltcGxpZWQgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoZSBmaWVsZCBhcmUgbm90IHJlcHJlc2VudGVkIGV4cGxpY2l0bHksCi8vLyBidXQgY2FuIGJlIG1hZGUgZXhwbGljaXQgaWYgbmVlZGVkLgpjbGFzcyBGaWVsZCBleHRlbmRzIE1lbWJlciB7CiAgRGFydFR5cGUgdHlwZTsgLy8gTm90IG51bGwuIERlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIGludCBmbGFncyA9IDA7CiAgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8gTWF5IGJlIG51bGwuCgogIEZpZWxkKE5hbWUgbmFtZSwKICAgICAge3RoaXMudHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy5pbml0aWFsaXplciwKICAgICAgYm9vbCBpc0NvdmFyaWFudDogZmFsc2UsCiAgICAgIGJvb2wgaXNGaW5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGhhc0ltcGxpY2l0R2V0dGVyLAogICAgICBib29sIGhhc0ltcGxpY2l0U2V0dGVyLAogICAgICBib29sIGlzTGF0ZTogZmFsc2UsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZX0pCiAgICAgIDogc3VwZXIobmFtZSwgZmlsZVVyaSwgcmVmZXJlbmNlKSB7CiAgICBhc3NlcnQodHlwZSAhPSBudWxsKTsKICAgIGluaXRpYWxpemVyPy5wYXJlbnQgPSB0aGlzOwogICAgdGhpcy5pc0NvdmFyaWFudCA9IGlzQ292YXJpYW50OwogICAgdGhpcy5pc0ZpbmFsID0gaXNGaW5hbDsKICAgIHRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7CiAgICB0aGlzLmlzTGF0ZSA9IGlzTGF0ZTsKICAgIHRoaXMuaGFzSW1wbGljaXRHZXR0ZXIgPSBoYXNJbXBsaWNpdEdldHRlciA/PyAhaXNTdGF0aWM7CiAgICB0aGlzLmhhc0ltcGxpY2l0U2V0dGVyID0gaGFzSW1wbGljaXRTZXR0ZXIgPz8gKCFpc1N0YXRpYyAmJiAhaXNGaW5hbCk7CiAgICB0aGlzLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBGbGFnRmluYWwgPSAxIDw8IDA7IC8vIE11c3QgbWF0Y2ggc2VyaWFsaXplZCBiaXQgcG9zaXRpb25zLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ1N0YXRpYyA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdIYXNJbXBsaWNpdEdldHRlciA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdIYXNJbXBsaWNpdFNldHRlciA9IDEgPDwgNDsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb3ZhcmlhbnQgPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwgPSAxIDw8IDY7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTGF0ZSA9IDEgPDwgNzsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdFeHRlbnNpb25NZW1iZXIgPSAxIDw8IDg7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQgPSAxIDw8IDk7CgogIC8vLyBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkZWNsYXJlZCB3aXRoIHRoZSBgY292YXJpYW50YCBrZXl3b3JkLgogIGJvb2wgZ2V0IGlzQ292YXJpYW50ID0+IGZsYWdzICYgRmxhZ0NvdmFyaWFudCAhPSAwOwoKICBib29sIGdldCBpc0ZpbmFsID0+IGZsYWdzICYgRmxhZ0ZpbmFsICE9IDA7CiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZsYWdzICYgRmxhZ1N0YXRpYyAhPSAwOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4dGVuc2lvbk1lbWJlciA9PiBmbGFncyAmIEZsYWdFeHRlbnNpb25NZW1iZXIgIT0gMDsKCiAgLy8vIElmIHRydWUsIGEgZ2V0dGVyIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZmllbGQuCiAgLy8vCiAgLy8vIElmIGZhbHNlLCB0aGVyZSBtYXkgb3IgbWF5IG5vdCBleGlzdCBhbiBleHBsaWNpdCBnZXR0ZXIgaW4gdGhlIHNhbWUgY2xhc3MKICAvLy8gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmaWVsZC4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCwgYWxsIG5vbi1zdGF0aWMgZmllbGRzIGhhdmUgaW1wbGljaXQgZ2V0dGVycy4KICBib29sIGdldCBoYXNJbXBsaWNpdEdldHRlciA9PiBmbGFncyAmIEZsYWdIYXNJbXBsaWNpdEdldHRlciAhPSAwOwoKICAvLy8gSWYgdHJ1ZSwgYSBzZXR0ZXIgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBmaWVsZC4KICAvLy8KICAvLy8gSWYgZmFsc2UsIHRoZXJlIG1heSBvciBtYXkgbm90IGV4aXN0IGFuIGV4cGxpY2l0IHNldHRlciBpbiB0aGUgc2FtZSBjbGFzcwogIC8vLyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGZpZWxkLgogIC8vLwogIC8vLyBGaW5hbCBmaWVsZHMgbmV2ZXIgaGF2ZSBpbXBsaWNpdCBzZXR0ZXJzLCBidXQgYSBmaWVsZCB3aXRob3V0IGFuIGltcGxpY2l0CiAgLy8vIHNldHRlciBpcyBub3QgbmVjZXNzYXJpbHkgZmluYWwsIGFzIGl0IG1heSBiZSBtdXRhdGVkIGJ5IGRpcmVjdCBmaWVsZAogIC8vLyBhY2Nlc3MuCiAgLy8vCiAgLy8vIEJ5IGRlZmF1bHQsIGFsbCBub24tc3RhdGljLCBub24tZmluYWwgZmllbGRzIGhhdmUgaW1wbGljaXQgc2V0dGVycy4KICBib29sIGdldCBoYXNJbXBsaWNpdFNldHRlciA9PiBmbGFncyAmIEZsYWdIYXNJbXBsaWNpdFNldHRlciAhPSAwOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGltcGxpY2l0IHNldHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWVsZCBuZWVkcyB0bwogIC8vLyBjb250YWluIGEgcnVudGltZSB0eXBlIGNoZWNrIHRvIGRlYWwgd2l0aCBnZW5lcmljIGNvdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFdoZW4gYHRydWVgLCBydW50aW1lIGNoZWNrcyBtYXkgbmVlZCB0byBiZSBwZXJmb3JtZWQ7IHNlZQogIC8vLyBbRGlzcGF0Y2hDYXRlZ29yeV0gZm9yIGRldGFpbHMuCiAgYm9vbCBnZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9PiBmbGFncyAmIEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCAhPSAwOwoKICAvLy8gV2hldGhlciB0aGUgZmllbGQgaXMgZGVjbGFyZWQgd2l0aCB0aGUgYGxhdGVgIGtleXdvcmQuCiAgYm9vbCBnZXQgaXNMYXRlID0+IGZsYWdzICYgRmxhZ0xhdGUgIT0gMDsKCiAgdm9pZCBzZXQgaXNDb3ZhcmlhbnQoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb3ZhcmlhbnQpIDogKGZsYWdzICYgfkZsYWdDb3ZhcmlhbnQpOwogIH0KCiAgdm9pZCBzZXQgaXNGaW5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0ZpbmFsKSA6IChmbGFncyAmIH5GbGFnRmluYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNTdGF0aWMoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdTdGF0aWMpIDogKGZsYWdzICYgfkZsYWdTdGF0aWMpOwogIH0KCiAgdm9pZCBzZXQgaXNFeHRlbnNpb25NZW1iZXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPQogICAgICAgIHZhbHVlID8gKGZsYWdzIHwgRmxhZ0V4dGVuc2lvbk1lbWJlcikgOiAoZmxhZ3MgJiB+RmxhZ0V4dGVuc2lvbk1lbWJlcik7CiAgfQoKICB2b2lkIHNldCBoYXNJbXBsaWNpdEdldHRlcihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnSGFzSW1wbGljaXRHZXR0ZXIpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0hhc0ltcGxpY2l0R2V0dGVyKTsKICB9CgogIHZvaWQgc2V0IGhhc0ltcGxpY2l0U2V0dGVyKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdIYXNJbXBsaWNpdFNldHRlcikKICAgICAgICA6IChmbGFncyAmIH5GbGFnSGFzSW1wbGljaXRTZXR0ZXIpOwogIH0KCiAgdm9pZCBzZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsKTsKICB9CgogIHZvaWQgc2V0IGlzTGF0ZShib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0xhdGUpIDogKGZsYWdzICYgfkZsYWdMYXRlKTsKICB9CgogIC8vLyBUcnVlIGlmIHRoZSBmaWVsZCBpcyBuZWl0aGVyIGZpbmFsIG5vciBjb25zdC4KICBib29sIGdldCBpc011dGFibGUgPT4gZmxhZ3MgJiAoRmxhZ0ZpbmFsIHwgRmxhZ0NvbnN0KSA9PSAwOwogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gIWlzU3RhdGljOwogIGJvb2wgZ2V0IGhhc0dldHRlciA9PiB0cnVlOwogIGJvb2wgZ2V0IGhhc1NldHRlciA9PiBpc011dGFibGUgfHwgaXNMYXRlICYmIGluaXRpYWxpemVyID09IG51bGw7CgogIGJvb2wgZ2V0IGlzRXh0ZXJuYWwgPT4gZmFsc2U7CiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUpIHRocm93ICdGaWVsZHMgY2Fubm90IGJlIGV4dGVybmFsJzsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPT4gZmxhZ3MgJiBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQgIT0gMDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICB9CgogIFIgYWNjZXB0PFI+KE1lbWJlclZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEZpZWxkKHRoaXMpOwoKICBhY2NlcHRSZWZlcmVuY2UoTWVtYmVyUmVmZXJlbmNlVmlzaXRvciB2KSA9PiB2LnZpc2l0RmllbGRSZWZlcmVuY2UodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdHlwZT8uYWNjZXB0KHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgaW5pdGlhbGl6ZXI/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIGlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgaW5pdGlhbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBnZXQgZ2V0dGVyVHlwZSA9PiB0eXBlOwogIERhcnRUeXBlIGdldCBzZXR0ZXJUeXBlID0+IGhhc1NldHRlciA/IHR5cGUgOiBjb25zdCBCb3R0b21UeXBlKCk7CgogIExvY2F0aW9uIF9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5Db21wb25lbnQoZW5jbG9zaW5nQ29tcG9uZW50LCBmaWxlVXJpLCBvZmZzZXQpOwogIH0KfQoKLy8vIEEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciwgcG9zc2libHkgcmVkaXJlY3RpbmcuCi8vLwovLy8gTm90ZSB0aGF0IGZhY3RvcnkgY29uc3RydWN0b3JzIGFyZSB0cmVhdGVkIGFzIFtQcm9jZWR1cmVdcy4KLy8vCi8vLyBDb25zdHJ1Y3RvcnMgZG8gbm90IHRha2UgdHlwZSBwYXJhbWV0ZXJzLiAgVHlwZSBhcmd1bWVudHMgZnJvbSBhIGNvbnN0cnVjdG9yCi8vLyBpbnZvY2F0aW9uIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIHR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCi8vLwovLy8gRm9yIHVubmFtZWQgY29uc3RydWN0b3JzLCB0aGUgbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcgKGluIGEgW05hbWVdKS4KY2xhc3MgQ29uc3RydWN0b3IgZXh0ZW5kcyBNZW1iZXIgewogIC8vLyBTdGFydCBvZmZzZXQgb2YgdGhlIGNvbnN0cnVjdG9yIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhbm5vdGF0aW9ucyBpZiBhbnkuCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlCiAgLy8vIHN0YXJ0IG9mZnNldCBpcyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5CiAgLy8vIHNldCkuCiAgaW50IHN0YXJ0RmlsZU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICBpbnQgZmxhZ3MgPSAwOwogIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbjsKICBMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnM7CgogIENvbnN0cnVjdG9yKHRoaXMuZnVuY3Rpb24sCiAgICAgIHtOYW1lIG5hbWUsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNTeW50aGV0aWM6IGZhbHNlLAogICAgICBMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZX0pCiAgICAgIDogdGhpcy5pbml0aWFsaXplcnMgPSBpbml0aWFsaXplcnMgPz8gPEluaXRpYWxpemVyPltdLAogICAgICAgIHN1cGVyKG5hbWUsIGZpbGVVcmksIHJlZmVyZW5jZSkgewogICAgZnVuY3Rpb24/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKHRoaXMuaW5pdGlhbGl6ZXJzLCB0aGlzKTsKICAgIHRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICB0aGlzLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgdGhpcy5pc1N5bnRoZXRpYyA9IGlzU3ludGhldGljOwogICAgdGhpcy50cmFuc2Zvcm1lckZsYWdzID0gdHJhbnNmb3JtZXJGbGFnczsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdFeHRlcm5hbCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdTeW50aGV0aWMgPSAxIDw8IDI7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQgPSAxIDw8IDM7CgogIGJvb2wgZ2V0IGlzQ29uc3QgPT4gZmxhZ3MgJiBGbGFnQ29uc3QgIT0gMDsKICBib29sIGdldCBpc0V4dGVybmFsID0+IGZsYWdzICYgRmxhZ0V4dGVybmFsICE9IDA7CgogIC8vLyBUcnVlIGlmIHRoaXMgaXMgYSBzeW50aGV0aWMgY29uc3RydWN0b3IgaW5zZXJ0ZWQgaW4gYSBjbGFzcyB0aGF0CiAgLy8vIGRvZXMgbm90IG90aGVyd2lzZSBkZWNsYXJlIGFueSBjb25zdHJ1Y3RvcnMuCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gZmxhZ3MgJiBGbGFnU3ludGhldGljICE9IDA7CgogIHZvaWQgc2V0IGlzQ29uc3QoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb25zdCkgOiAoZmxhZ3MgJiB+RmxhZ0NvbnN0KTsKICB9CgogIHZvaWQgc2V0IGlzRXh0ZXJuYWwoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdFeHRlcm5hbCkgOiAoZmxhZ3MgJiB+RmxhZ0V4dGVybmFsKTsKICB9CgogIHZvaWQgc2V0IGlzU3ludGhldGljKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnU3ludGhldGljKSA6IChmbGFncyAmIH5GbGFnU3ludGhldGljKTsKICB9CgogIGJvb2wgZ2V0IGlzSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaGFzR2V0dGVyID0+IGZhbHNlOwogIGJvb2wgZ2V0IGhhc1NldHRlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeHRlbnNpb25NZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPT4gZmxhZ3MgJiBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQgIT0gMDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICB9CgogIFIgYWNjZXB0PFI+KE1lbWJlclZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdENvbnN0cnVjdG9yKHRoaXMpOwoKICBhY2NlcHRSZWZlcmVuY2UoTWVtYmVyUmVmZXJlbmNlVmlzaXRvciB2KSA9PgogICAgICB2LnZpc2l0Q29uc3RydWN0b3JSZWZlcmVuY2UodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGluaXRpYWxpemVycywgdik7CiAgICBmdW5jdGlvbj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KGluaXRpYWxpemVycywgdiwgdGhpcyk7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0IGdldHRlclR5cGUgPT4gY29uc3QgQm90dG9tVHlwZSgpOwogIERhcnRUeXBlIGdldCBzZXR0ZXJUeXBlID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChlbmNsb3NpbmdDb21wb25lbnQsIGZpbGVVcmksIG9mZnNldCk7CiAgfQp9CgovLy8gUmVzaWR1ZSBvZiBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3IgZm9yIHRoZSBsaW5raW5nIHBoYXNlLgovLy8KLy8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYGJhcmAgaXMgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yLgovLy8KLy8vICAgICBjbGFzcyBBIHsKLy8vICAgICAgIEEuZm9vKCk7Ci8vLyAgICAgICBmYWN0b3J5IEEuYmFyKCkgPSBBLmZvbzsKLy8vICAgICB9Ci8vLwovLy8gQW4gaW52b2NhdGlvbiBvZiBgbmV3IEEuYmFyKClgIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgYW4gaW52b2NhdGlvbiBvZgovLy8gYG5ldyBBLmZvbygpYC4gIEluIEtlcm5lbCwgdGhlIGludm9jYXRpb25zIG9mIGBiYXJgIGFyZSByZXBsYWNlZCB3aXRoCi8vLyBpbnZvY2F0aW9ucyBvZiBgZm9vYCwgYW5kIGFmdGVyIGl0IGlzIGRvbmUsIHRoZSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciBjYW4KLy8vIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2xhc3MuICBIb3dldmVyLCBpdCBpcyBuZWVkZWQgZHVyaW5nIHRoZSBsaW5raW5nIHBoYXNlLAovLy8gYmVjYXVzZSBvdGhlciBtb2R1bGVzIGNhbiByZWZlciB0byB0aGF0IGNvbnN0cnVjdG9yLgovLy8KLy8vIFtSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcl1zIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IKLy8vIGxpbmtpbmcgYW5kIGFyZSB0cmVhdGVkIGFzIG5vbi1ydW5uYWJsZSBtZW1iZXJzIG9mIGNsYXNzZXMgdGhhdCBtZXJlbHkgc2VydmUKLy8vIGFzIGNvbnRhaW5lcnMgZm9yIHRoYXQgaW5mb3JtYXRpb24uCi8vLwovLy8gUmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgY2FuIGJlIHVubmFtZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBuYW1lIGlzCi8vLyBhbiBlbXB0eSBzdHJpbmcgKGluIGEgW05hbWVdKS4KY2xhc3MgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgZXh0ZW5kcyBNZW1iZXIgewogIGludCBmbGFncyA9IDA7CgogIC8vLyBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBtYXkgcmVkaXJlY3QgdG8gY29uc3RydWN0b3JzIG9yIGZhY3RvcmllcwogIC8vLyBvZiBpbnN0YW50aWF0ZWQgZ2VuZXJpYyB0eXBlcywgdGhhdCBpcywgZ2VuZXJpYyB0eXBlcyB3aXRoIHN1cHBsaWVkIHR5cGUKICAvLy8gYXJndW1lbnRzLiAgVGhlIHN1cHBsaWVkIHR5cGUgYXJndW1lbnRzIGFyZSBzdG9yZWQgaW4gdGhpcyBmaWVsZC4KICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBvciB0aGUgZmFjdG9yeSB0aGF0IHRoaXMKICAvLy8gW1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yXSByZWRpcmVjdHMgdG8uCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKCiAgLy8vIFt0eXBlUGFyYW1ldGVyc10gYXJlIGR1cGxpY2F0ZXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nCiAgLy8vIGNsYXNzLiAgQmVjYXVzZSBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBhcmVuJ3QgaW5zdGFuY2UgbWVtYmVycywKICAvLy8gcmVmZXJlbmNlcyB0byB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MgaW4gdGhlCiAgLy8vIHJlZGlyZWN0aW9uIHRhcmdldCBkZXNjcmlwdGlvbiBhcmUgZW5jb2RlZCB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnRzCiAgLy8vIG9mIFt0eXBlUGFyYW1ldGVyc10uCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKCiAgLy8vIFBvc2l0aW9uYWwgcGFyYW1ldGVycyBvZiBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBzaG91bGQgYmUKICAvLy8gY29tcGF0aWJsZSB3aXRoIHRoYXQgb2YgdGhlIHRhcmdldCBjb25zdHJ1Y3Rvci4KICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50OwoKICAvLy8gTmFtZWQgcGFyYW1ldGVycyBvZiBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdcyBzaG91bGQgYmUgY29tcGF0aWJsZQogIC8vLyB3aXRoIHRoYXQgb2YgdGhlIHRhcmdldCBjb25zdHJ1Y3Rvci4KICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKCiAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IodGhpcy50YXJnZXRSZWZlcmVuY2UsCiAgICAgIHtOYW1lIG5hbWUsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlfSkKICAgICAgOiB0aGlzLnR5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzID8/IDxEYXJ0VHlwZT5bXSwKICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPz8gPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMubmFtZWRQYXJhbWV0ZXJzID0gbmFtZWRQYXJhbWV0ZXJzID8/IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdLAogICAgICAgIHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9CiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPz8gcG9zaXRpb25hbFBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwLAogICAgICAgIHN1cGVyKG5hbWUsIGZpbGVVcmksIHJlZmVyZW5jZSkgewogICAgc2V0UGFyZW50cyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMubmFtZWRQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICB0aGlzLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgdGhpcy50cmFuc2Zvcm1lckZsYWdzID0gdHJhbnNmb3JtZXJGbGFnczsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0NvbnN0ID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdFeHRlcm5hbCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IDEgPDwgMjsKCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwogIGJvb2wgZ2V0IGlzRXh0ZXJuYWwgPT4gZmxhZ3MgJiBGbGFnRXh0ZXJuYWwgIT0gMDsKCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNFeHRlcm5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0V4dGVybmFsKSA6IChmbGFncyAmIH5GbGFnRXh0ZXJuYWwpOwogIH0KCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKICBib29sIGdldCBoYXNHZXR0ZXIgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaGFzU2V0dGVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4dGVuc2lvbk1lbWJlciA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNVbnJlc29sdmVkID0+IHRhcmdldFJlZmVyZW5jZSA9PSBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+IGZsYWdzICYgRmxhZ05vbk51bGxhYmxlQnlEZWZhdWx0ICE9IDA7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ05vbk51bGxhYmxlQnlEZWZhdWx0KQogICAgICAgIDogKGZsYWdzICYgfkZsYWdOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgfQoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCB0YXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgYXNzZXJ0KG1lbWJlciBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAgIChtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuRmFjdG9yeSkpOwogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBSIGFjY2VwdDxSPihNZW1iZXJWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcih0aGlzKTsKCiAgYWNjZXB0UmVmZXJlbmNlKE1lbWJlclJlZmVyZW5jZVZpc2l0b3IgdikgPT4KICAgICAgdi52aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yUmVmZXJlbmNlKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIHRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1UeXBlTGlzdCh0eXBlQXJndW1lbnRzLCB2KTsKICB9CgogIERhcnRUeXBlIGdldCBnZXR0ZXJUeXBlID0+IGNvbnN0IEJvdHRvbVR5cGUoKTsKICBEYXJ0VHlwZSBnZXQgc2V0dGVyVHlwZSA9PiBjb25zdCBCb3R0b21UeXBlKCk7CgogIExvY2F0aW9uIF9nZXRMb2NhdGlvbkluRW5jbG9zaW5nRmlsZShpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX2dldExvY2F0aW9uSW5Db21wb25lbnQoZW5jbG9zaW5nQ29tcG9uZW50LCBmaWxlVXJpLCBvZmZzZXQpOwogIH0KfQoKLy8vIEEgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgaW5kZXgtZ2V0dGVyLCBpbmRleC1zZXR0ZXIsIG9wZXJhdG9yIG92ZXJsb2FkZXIsCi8vLyBvciBmYWN0b3J5LgovLy8KLy8vIFByb2NlZHVyZXMgY2FuIGhhdmUgdGhlIHN0YXRpYywgYWJzdHJhY3QsIGFuZC9vciBleHRlcm5hbCBtb2RpZmllciwgYWx0aG91Z2gKLy8vIG9ubHkgdGhlIHN0YXRpYyBhbmQgZXh0ZXJuYWwgbW9kaWZpZXJzIG1heSBiZSB1c2VkIHRvZ2V0aGVyLgovLy8KLy8vIEZvciBub24tc3RhdGljIHByb2NlZHVyZXMgdGhlIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgZGlzcGF0Y2guCi8vLyBGb3IgZXh0ZXJuYWwgcHJvY2VkdXJlcyB0aGUgbmFtZSBpcyByZXF1aXJlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGV4dGVybmFsCi8vLyBpbXBsZW1lbnRhdGlvbi4KLy8vCi8vLyBGb3IgbWV0aG9kcywgZ2V0dGVycywgYW5kIHNldHRlcnMgdGhlIG5hbWUgaXMganVzdCBhcyBpdCB3YXMgZGVjbGFyZWQuCi8vLyBGb3Igc2V0dGVycyB0aGlzIGRvZXMgbm90IGluY2x1ZGUgYSB0cmFpbGluZyBgPWAuCi8vLyBGb3IgaW5kZXgtZ2V0dGVycy9zZXR0ZXJzLCB0aGlzIGlzIGBbXWAgYW5kIGBbXT1gLgovLy8gRm9yIG9wZXJhdG9ycywgdGhpcyBpcyB0aGUgdG9rZW4gZm9yIHRoZSBvcGVyYXRvciwgZS5nLiBgK2Agb3IgYD09YCwKLy8vIGV4Y2VwdCBmb3IgdGhlIHVuYXJ5IG1pbnVzIG9wZXJhdG9yLCB3aG9zZSBuYW1lIGlzIGB1bmFyeS1gLgpjbGFzcyBQcm9jZWR1cmUgZXh0ZW5kcyBNZW1iZXIgewogIC8vLyBTdGFydCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhbm5vdGF0aW9ucyBpZiBhbnkuCiAgLy8vCiAgLy8vIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIGFuZCB1cCwgb3IgLTEgKFtUcmVlTm9kZS5ub09mZnNldF0pIGlmIHRoZSBmaWxlCiAgLy8vIHN0YXJ0IG9mZnNldCBpcyBub3QgYXZhaWxhYmxlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5CiAgLy8vIHNldCkuCiAgaW50IHN0YXJ0RmlsZU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICBQcm9jZWR1cmVLaW5kIGtpbmQ7CiAgaW50IGZsYWdzID0gMDsKICAvLyBmdW5jdGlvbiBpcyBudWxsIGlmIGFuZCBvbmx5IGlmIGFic3RyYWN0LCBleHRlcm5hbC4KICBGdW5jdGlvbk5vZGUgZnVuY3Rpb247CgogIC8vIFRoZSBmdW5jdGlvbiBub2RlJ3MgYm9keSBtaWdodCBiZSBsYXppbHkgbG9hZGVkLCBtZWFuaW5nIHRoYXQgdGhpcyB2YWx1ZQogIC8vIG1pZ2h0IG5vdCBiZSBzZXQgY29ycmVjdGx5IHlldC4gTWFrZSBzdXJlIHRoZSBib2R5IGlzIGxvYWRlZCBiZWZvcmUKICAvLyByZXR1cm5pbmcgYW55dGhpbmcuCiAgaW50IGdldCB0cmFuc2Zvcm1lckZsYWdzIHsKICAgIGZ1bmN0aW9uPy5ib2R5OwogICAgcmV0dXJuIHN1cGVyLnRyYW5zZm9ybWVyRmxhZ3M7CiAgfQoKICAvLyBUaGUgZnVuY3Rpb24gbm9kZSdzIGJvZHkgbWlnaHQgYmUgbGF6aWx5IGxvYWRlZCwgbWVhbmluZyB0aGF0IHRoaXMgdmFsdWUKICAvLyBtaWdodCBnZXQgb3ZlcndyaXR0ZW4gbGF0ZXIgKHdoZW4gdGhlIGJvZHkgaXMgcmVhZCkuIFRvIGF2b2lkIHRoYXQgcmVhZCB0aGUKICAvLyBib2R5IG5vdyBhbmQgb25seSBzZXQgdGhlIHZhbHVlIGFmdGVyd2FyZHMuCiAgdm9pZCBzZXQgdHJhbnNmb3JtZXJGbGFncyhpbnQgbmV3VmFsdWUpIHsKICAgIGZ1bmN0aW9uPy5ib2R5OwogICAgc3VwZXIudHJhbnNmb3JtZXJGbGFncyA9IG5ld1ZhbHVlOwogIH0KCiAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgdHJhbnNmb3JtZXIgZmxhZ3Mgd2l0aG91dCBsb2FkaW5nIHRoZSBib2R5LgogIC8vIFVzZWQgd2hlbiByZWFkaW5nIHRoZSBiaW5hcnkuIEZvciBvdGhlciBjYXNlcyBvbmUgc2hvdWxkIHByb2JhYmx5IHVzZQogIC8vIGB0cmFuc2Zvcm1lckZsYWdzID0gdmFsdWU7YC4KICB2b2lkIHNldFRyYW5zZm9ybWVyRmxhZ3NXaXRob3V0TGF6eUxvYWRpbmcoaW50IG5ld1ZhbHVlKSB7CiAgICBzdXBlci50cmFuc2Zvcm1lckZsYWdzID0gbmV3VmFsdWU7CiAgfQoKICBSZWZlcmVuY2UgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZTsKICBSZWZlcmVuY2UgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogIFByb2NlZHVyZShOYW1lIG5hbWUsIFByb2NlZHVyZUtpbmQga2luZCwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogICAgICB7Ym9vbCBpc0Fic3RyYWN0OiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlcm5hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNGb3J3YXJkaW5nU3R1YjogZmFsc2UsCiAgICAgIGJvb2wgaXNGb3J3YXJkaW5nU2VtaVN0dWI6IGZhbHNlLAogICAgICBib29sIGlzTWVtYmVyU2lnbmF0dXJlOiBmYWxzZSwKICAgICAgYm9vbCBpc0V4dGVuc2lvbk1lbWJlcjogZmFsc2UsCiAgICAgIGludCB0cmFuc2Zvcm1lckZsYWdzOiAwLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSwKICAgICAgTWVtYmVyIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQsCiAgICAgIE1lbWJlciBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldH0pCiAgICAgIDogdGhpcy5fYnlSZWZlcmVuY2VSZW5hbWVkKG5hbWUsIGtpbmQsIGZ1bmN0aW9uLAogICAgICAgICAgICBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0LAogICAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsCiAgICAgICAgICAgIGlzRXh0ZXJuYWw6IGlzRXh0ZXJuYWwsCiAgICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgICAgIGlzRm9yd2FyZGluZ1N0dWI6IGlzRm9yd2FyZGluZ1N0dWIsCiAgICAgICAgICAgIGlzTWVtYmVyU2lnbmF0dXJlOiBpc01lbWJlclNpZ25hdHVyZSwKICAgICAgICAgICAgaXNGb3J3YXJkaW5nU2VtaVN0dWI6IGlzRm9yd2FyZGluZ1NlbWlTdHViLAogICAgICAgICAgICBpc0V4dGVuc2lvbk1lbWJlcjogaXNFeHRlbnNpb25NZW1iZXIsCiAgICAgICAgICAgIHRyYW5zZm9ybWVyRmxhZ3M6IHRyYW5zZm9ybWVyRmxhZ3MsCiAgICAgICAgICAgIGZpbGVVcmk6IGZpbGVVcmksCiAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLAogICAgICAgICAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlOgogICAgICAgICAgICAgICAgZ2V0TWVtYmVyUmVmZXJlbmNlKGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQpLAogICAgICAgICAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZToKICAgICAgICAgICAgICAgIGdldE1lbWJlclJlZmVyZW5jZShmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldCkpOwoKICBQcm9jZWR1cmUuX2J5UmVmZXJlbmNlUmVuYW1lZChOYW1lIG5hbWUsIHRoaXMua2luZCwgdGhpcy5mdW5jdGlvbiwKICAgICAge2Jvb2wgaXNBYnN0cmFjdDogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGlzRXh0ZXJuYWw6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzRm9yd2FyZGluZ1N0dWI6IGZhbHNlLAogICAgICBib29sIGlzRm9yd2FyZGluZ1NlbWlTdHViOiBmYWxzZSwKICAgICAgYm9vbCBpc01lbWJlclNpZ25hdHVyZTogZmFsc2UsCiAgICAgIGJvb2wgaXNFeHRlbnNpb25NZW1iZXI6IGZhbHNlLAogICAgICBpbnQgdHJhbnNmb3JtZXJGbGFnczogMCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFJlZmVyZW5jZSByZWZlcmVuY2UsCiAgICAgIHRoaXMuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZSwKICAgICAgdGhpcy5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZX0pCiAgICAgIDogc3VwZXIobmFtZSwgZmlsZVVyaSwgcmVmZXJlbmNlKSB7CiAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHRoaXMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7CiAgICB0aGlzLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgdGhpcy5pc0NvbnN0ID0gaXNDb25zdDsKICAgIHRoaXMuaXNGb3J3YXJkaW5nU3R1YiA9IGlzRm9yd2FyZGluZ1N0dWI7CiAgICB0aGlzLmlzRm9yd2FyZGluZ1NlbWlTdHViID0gaXNGb3J3YXJkaW5nU2VtaVN0dWI7CiAgICB0aGlzLmlzTWVtYmVyU2lnbmF0dXJlID0gaXNNZW1iZXJTaWduYXR1cmU7CiAgICB0aGlzLmlzRXh0ZW5zaW9uTWVtYmVyID0gaXNFeHRlbnNpb25NZW1iZXI7CiAgICB0aGlzLnRyYW5zZm9ybWVyRmxhZ3MgPSB0cmFuc2Zvcm1lckZsYWdzOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBGbGFnU3RhdGljID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdBYnN0cmFjdCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdFeHRlcm5hbCA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb25zdCA9IDEgPDwgMzsgLy8gT25seSBmb3IgZXh0ZXJuYWwgY29uc3QgZmFjdG9yaWVzLgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZvcndhcmRpbmdTdHViID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZvcndhcmRpbmdTZW1pU3R1YiA9IDEgPDwgNTsKICAvLyBUT0RPKDI5ODQxKTogUmVtb3ZlIHRoaXMgZmxhZyBhZnRlciB0aGUgaXNzdWUgaXMgcmVzb2x2ZWQuCiAgc3RhdGljIGNvbnN0IGludCBGbGFnUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgPSAxIDw8IDY7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyID0gMSA8PCA3OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0V4dGVuc2lvbk1lbWJlciA9IDEgPDwgODsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdNZW1iZXJTaWduYXR1cmUgPSAxIDw8IDk7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQgPSAxIDw8IDEwOwoKICBib29sIGdldCBpc1N0YXRpYyA9PiBmbGFncyAmIEZsYWdTdGF0aWMgIT0gMDsKICBib29sIGdldCBpc0Fic3RyYWN0ID0+IGZsYWdzICYgRmxhZ0Fic3RyYWN0ICE9IDA7CiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiBmbGFncyAmIEZsYWdFeHRlcm5hbCAhPSAwOwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGhhcyB0aGUgYGNvbnN0YCBtb2RpZmllci4gIFRoaXMgaXMgb25seSBwb3NzaWJsZSBmb3IgZXh0ZXJuYWwKICAvLy8gY29uc3RhbnQgZmFjdG9yaWVzLCBzdWNoIGFzIGBTdHJpbmcuZnJvbUVudmlyb25tZW50YC4KICBib29sIGdldCBpc0NvbnN0ID0+IGZsYWdzICYgRmxhZ0NvbnN0ICE9IDA7CgogIC8vLyBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24gZXhpc3RzCiAgLy8vIHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgdHlwZSBjaGVja2luZyBhcmd1bWVudHMgYW5kIGZvcndhcmRpbmcgdG8KICAvLy8gW2ZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRdLgogIC8vLwogIC8vLyBOb3RlIHRoYXQganVzdCBiZWNhdXNlIHRoaXMgYml0IGlzIHNldCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgZnVuY3Rpb24gd2FzCiAgLy8vIG5vdCBkZWNsYXJlZCBpbiB0aGUgc291cmNlOyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBpcyBhIGZvcndhcmRpbmcKICAvLy8gc2VtaS1zdHViIChzZWUgaXNGb3J3YXJkaW5nU2VtaVN0dWIpLiAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBmdW5jdGlvbgogIC8vLyB3YXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBjb25zdWx0IFtpc1N5bnRoZXRpY0ZvcndhcmRlcl0uCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nU3R1YiA9PiBmbGFncyAmIEZsYWdGb3J3YXJkaW5nU3R1YiAhPSAwOwoKICAvLy8gSWYgc2V0LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgYWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBhIGZvcndhcmRpbmcKICAvLy8gc3R1YiwgaXQgd2FzIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBhcyBhbiBhYnN0cmFjdCBtZXRob2QuCiAgYm9vbCBnZXQgaXNGb3J3YXJkaW5nU2VtaVN0dWIgPT4gZmxhZ3MgJiBGbGFnRm9yd2FyZGluZ1NlbWlTdHViICE9IDA7CgogIC8vLyBJZiBzZXQsIHRoaXMgbWV0aG9kIGlzIGEgY2xhc3MgbWVtYmVyIGFkZGVkIHRvIHNob3cgdGhlIHR5cGUgb2YgYW4KICAvLy8gaW5oZXJpdGVkIG1lbWJlci4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHdoZW4gdGhlIHR5cGUgb2YgdGhlIGluaGVyaXRlZCBtZW1iZXIgY2Fubm90IGJlIGNvbXB1dGVkCiAgLy8vIGRpcmVjdGx5IGZyb20gdGhlIG1lbWJlcihzKSBpbiB0aGUgc3VwZXJ0eXBlcy4gRm9yIGluc3RhbmNlIGluIGNhc2Ugb2YKICAvLy8gYW4gbm5iZCBvcHQtb3V0IGNsYXNzIGluaGVyaXRpbmcgZnJvbSBhbiBubmJkIG9wdC1pbiBjbGFzczsgaGVyZSBhbGwgbm5iZC0KICAvLy8gYXdhcmUgdHlwZXMgYXJlIHJlcGxhY2VkIHdpdGggbGVnYWN5IHR5cGVzIGluIHRoZSBpbmhlcml0ZWQgc2lnbmF0dXJlLgogIGJvb2wgZ2V0IGlzTWVtYmVyU2lnbmF0dXJlID0+IGZsYWdzICYgRmxhZ01lbWJlclNpZ25hdHVyZSAhPSAwOwoKICAvLyBJbmRpY2F0ZXMgaWYgdGhpcyBbUHJvY2VkdXJlXSByZXByZXNlbnRzIGEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcgogIC8vIGFuZCBkb2Vzbid0IGhhdmUgYSBydW5uYWJsZSBib2R5LgogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgewogICAgcmV0dXJuIGZsYWdzICYgRmxhZ1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yICE9IDA7CiAgfQoKICAvLy8gSWYgc2V0LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhpcyBmdW5jdGlvbiB3YXMgbm90IHByZXNlbnQgaW4gdGhlCiAgLy8vIHNvdXJjZSwgYW5kIGl0IGV4aXN0cyBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIHR5cGUgY2hlY2tpbmcgYXJndW1lbnRzCiAgLy8vIGFuZCBmb3J3YXJkaW5nIHRvIFtmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0XS4KICBib29sIGdldCBpc1N5bnRoZXRpY0ZvcndhcmRlciA9PiBpc0ZvcndhcmRpbmdTdHViICYmICFpc0ZvcndhcmRpbmdTZW1pU3R1YjsKCiAgYm9vbCBnZXQgaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIgPT4gZmxhZ3MgJiBGbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyICE9IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXh0ZW5zaW9uTWVtYmVyID0+IGZsYWdzICYgRmxhZ0V4dGVuc2lvbk1lbWJlciAhPSAwOwoKICB2b2lkIHNldCBpc1N0YXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ1N0YXRpYykgOiAoZmxhZ3MgJiB+RmxhZ1N0YXRpYyk7CiAgfQoKICB2b2lkIHNldCBpc0Fic3RyYWN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQWJzdHJhY3QpIDogKGZsYWdzICYgfkZsYWdBYnN0cmFjdCk7CiAgfQoKICB2b2lkIHNldCBpc0V4dGVybmFsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnRXh0ZXJuYWwpIDogKGZsYWdzICYgfkZsYWdFeHRlcm5hbCk7CiAgfQoKICB2b2lkIHNldCBpc0NvbnN0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQ29uc3QpIDogKGZsYWdzICYgfkZsYWdDb25zdCk7CiAgfQoKICB2b2lkIHNldCBpc0ZvcndhcmRpbmdTdHViKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0KICAgICAgICB2YWx1ZSA/IChmbGFncyB8IEZsYWdGb3J3YXJkaW5nU3R1YikgOiAoZmxhZ3MgJiB+RmxhZ0ZvcndhcmRpbmdTdHViKTsKICB9CgogIHZvaWQgc2V0IGlzRm9yd2FyZGluZ1NlbWlTdHViKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdGb3J3YXJkaW5nU2VtaVN0dWIpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0ZvcndhcmRpbmdTZW1pU3R1Yik7CiAgfQoKICB2b2lkIHNldCBpc01lbWJlclNpZ25hdHVyZShib29sIHZhbHVlKSB7CiAgICBmbGFncyA9CiAgICAgICAgdmFsdWUgPyAoZmxhZ3MgfCBGbGFnTWVtYmVyU2lnbmF0dXJlKSA6IChmbGFncyAmIH5GbGFnTWVtYmVyU2lnbmF0dXJlKTsKICB9CgogIHZvaWQgc2V0IGlzUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZQogICAgICAgID8gKGZsYWdzIHwgRmxhZ1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvcik7CiAgfQoKICB2b2lkIHNldCBpc05vU3VjaE1ldGhvZEZvcndhcmRlcihib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnTm9TdWNoTWV0aG9kRm9yd2FyZGVyKQogICAgICAgIDogKGZsYWdzICYgfkZsYWdOb1N1Y2hNZXRob2RGb3J3YXJkZXIpOwogIH0KCiAgdm9pZCBzZXQgaXNFeHRlbnNpb25NZW1iZXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPQogICAgICAgIHZhbHVlID8gKGZsYWdzIHwgRmxhZ0V4dGVuc2lvbk1lbWJlcikgOiAoZmxhZ3MgJiB+RmxhZ0V4dGVuc2lvbk1lbWJlcik7CiAgfQoKICBib29sIGdldCBpc0luc3RhbmNlTWVtYmVyID0+ICFpc1N0YXRpYzsKICBib29sIGdldCBpc0dldHRlciA9PiBraW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyOwogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXI7CiAgYm9vbCBnZXQgaXNBY2Nlc3NvciA9PiBpc0dldHRlciB8fCBpc1NldHRlcjsKICBib29sIGdldCBoYXNHZXR0ZXIgPT4ga2luZCAhPSBQcm9jZWR1cmVLaW5kLlNldHRlcjsKICBib29sIGdldCBoYXNTZXR0ZXIgPT4ga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcjsKICBib29sIGdldCBpc0ZhY3RvcnkgPT4ga2luZCA9PSBQcm9jZWR1cmVLaW5kLkZhY3Rvcnk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPT4gZmxhZ3MgJiBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQgIT0gMDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnTm9uTnVsbGFibGVCeURlZmF1bHQpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICB9CgogIE1lbWJlciBnZXQgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCA9PgogICAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBNZW1iZXIgZ2V0IGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0ID0+CiAgICAgIGZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQoTWVtYmVyIHRhcmdldCkgewogICAgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIFIgYWNjZXB0PFI+KE1lbWJlclZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFByb2NlZHVyZSh0aGlzKTsKCiAgYWNjZXB0UmVmZXJlbmNlKE1lbWJlclJlZmVyZW5jZVZpc2l0b3IgdikgPT4gdi52aXNpdFByb2NlZHVyZVJlZmVyZW5jZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChhbm5vdGF0aW9ucywgdik7CiAgICBuYW1lPy5hY2NlcHQodik7CiAgICBmdW5jdGlvbj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdChhbm5vdGF0aW9ucywgdiwgdGhpcyk7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0IGdldHRlclR5cGUgewogICAgcmV0dXJuIGlzR2V0dGVyCiAgICAgICAgPyBmdW5jdGlvbi5yZXR1cm5UeXBlCiAgICAgICAgOiBmdW5jdGlvbi5jb21wdXRlRnVuY3Rpb25UeXBlKGVuY2xvc2luZ0xpYnJhcnkubm9uTnVsbGFibGUpOwogIH0KCiAgRGFydFR5cGUgZ2V0IHNldHRlclR5cGUgewogICAgcmV0dXJuIGlzU2V0dGVyCiAgICAgICAgPyBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXS50eXBlCiAgICAgICAgOiBjb25zdCBCb3R0b21UeXBlKCk7CiAgfQoKICBMb2NhdGlvbiBfZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGUoaW50IG9mZnNldCkgewogICAgcmV0dXJuIF9nZXRMb2NhdGlvbkluQ29tcG9uZW50KGVuY2xvc2luZ0NvbXBvbmVudCwgZmlsZVVyaSwgb2Zmc2V0KTsKICB9Cn0KCmVudW0gUHJvY2VkdXJlS2luZCB7CiAgTWV0aG9kLAogIEdldHRlciwKICBTZXR0ZXIsCiAgT3BlcmF0b3IsCiAgRmFjdG9yeSwKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNUT1IgSU5JVElBTElaRVJTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIFBhcnQgb2YgYW4gaW5pdGlhbGl6ZXIgbGlzdCBpbiBhIGNvbnN0cnVjdG9yLgphYnN0cmFjdCBjbGFzcyBJbml0aWFsaXplciBleHRlbmRzIFRyZWVOb2RlIHsKICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgc3ludGhldGljIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyLgogIEBpbmZvcm1hdGl2ZQogIGJvb2wgaXNTeW50aGV0aWMgPSBmYWxzZTsKCiAgUiBhY2NlcHQ8Uj4oSW5pdGlhbGl6ZXJWaXNpdG9yPFI+IHYpOwp9CgovLy8gQW4gaW5pdGlhbGl6ZXIgd2l0aCBhIGNvbXBpbGUtdGltZSBlcnJvci4KLy8vCi8vLyBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGF0IHJ1bnRpbWUuCi8vCi8vIERFU0lHTiBUT0RPOiBUaGUgZnJvbnRlbmQgc2hvdWxkIHVzZSB0aGlzIGluIGEgbG90IG1vcmUgY2FzZXMgdG8gY2F0Y2gKLy8gaW52YWxpZCBjYXNlcy4KY2xhc3MgSW52YWxpZEluaXRpYWxpemVyIGV4dGVuZHMgSW5pdGlhbGl6ZXIgewogIFIgYWNjZXB0PFI+KEluaXRpYWxpemVyVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SW52YWxpZEluaXRpYWxpemVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgovLy8gQSBmaWVsZCBhc3NpZ25tZW50IGBmaWVsZCA9IHZhbHVlYCBvY2N1cnJpbmcgaW4gdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YKLy8vIGEgY29uc3RydWN0b3IuCi8vLwovLy8gVGhpcyBub2RlIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZGVjbGFyYXRpb24tc2l0ZSBmaWVsZCBpbml0aWFsaXplcnM7IHRob3NlCi8vLyBhcmUgW0V4cHJlc3Npb25dcyBzdG9yZWQgaW4gW0ZpZWxkLmluaXRpYWxpemVyXS4KLy8KLy8gVE9ETzogVGhlIGZyb250ZW5kIHNob3VsZCBjaGVjayB0aGF0IGFsbCBmaW5hbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkCi8vICBleGFjdGx5IG9uY2UsIGFuZCB0aGF0IG5vIGZpZWxkcyBhcmUgYXNzaWduZWQgdHdpY2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCmNsYXNzIEZpZWxkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgZmllbGQgYmVpbmcgaW5pdGlhbGl6ZWQuICBOb3QgbnVsbC4KICBSZWZlcmVuY2UgZmllbGRSZWZlcmVuY2U7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgRmllbGRJbml0aWFsaXplcihGaWVsZCBmaWVsZCwgRXhwcmVzc2lvbiB2YWx1ZSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGZpZWxkPy5yZWZlcmVuY2UsIHZhbHVlKTsKCiAgRmllbGRJbml0aWFsaXplci5ieVJlZmVyZW5jZSh0aGlzLmZpZWxkUmVmZXJlbmNlLCB0aGlzLnZhbHVlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEZpZWxkIGdldCBmaWVsZCA9PiBmaWVsZFJlZmVyZW5jZT8ubm9kZTsKCiAgdm9pZCBzZXQgZmllbGQoRmllbGQgZmllbGQpIHsKICAgIGZpZWxkUmVmZXJlbmNlID0gZmllbGQ/LnJlZmVyZW5jZTsKICB9CgogIFIgYWNjZXB0PFI+KEluaXRpYWxpemVyVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0RmllbGRJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGZpZWxkPy5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBIHN1cGVyIGNhbGwgYHN1cGVyKHgseSlgIG9jY3VycmluZyBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiBhCi8vLyBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBUaGVyZSBhcmUgbm8gdHlwZSBhcmd1bWVudHMgb24gdGhpcyBjYWxsLgovLwovLyBUT0RPOiBUaGUgZnJvbnRlbmQgc2hvdWxkIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSB0aGFuIG9uZSBzdXBlciBjYWxsLgovLwovLyBERVNJR04gVE9ETzogQ29uc2lkZXIgaWYgdGhlIGZyb250ZW5kIHNob3VsZCBpbnNlcnQgdHlwZSBhcmd1bWVudHMgZGVyaXZlZAovLyBmcm9tIHRoZSBleHRlbmRzIGNsYXVzZS4KY2xhc3MgU3VwZXJJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWluZyBpbnZva2VkIGluIHRoZSBzdXBlciBjbGFzcy4gTm90IG51bGwuCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBBcmd1bWVudHMgYXJndW1lbnRzOwoKICBTdXBlckluaXRpYWxpemVyKENvbnN0cnVjdG9yIHRhcmdldCwgQXJndW1lbnRzIGFyZ3VtZW50cykKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCBhcmd1bWVudHMpOwoKICBTdXBlckluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLmFyZ3VtZW50cykgewogICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzQ29uc3RydWN0b3I7CgogIHZvaWQgc2V0IHRhcmdldChDb25zdHJ1Y3RvciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oSW5pdGlhbGl6ZXJWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRTdXBlckluaXRpYWxpemVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgcmVkaXJlY3RpbmcgY2FsbCBgdGhpcyh4LHkpYCBvY2N1cnJpbmcgaW4gdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YKLy8vIGEgY29uc3RydWN0b3IuCi8vCi8vIFRPRE86IFRoZSBmcm9udGVuZCBzaG91bGQgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IGluaXRpYWxpemVyIGFuZCBpZiB0aGUKLy8gY29uc3RydWN0b3IgaGFzIGEgYm9keSBvciBpZiB0aGVyZSBpcyBhIGN5Y2xlIGluIHRoZSBpbml0aWFsaXplciBjYWxscy4KY2xhc3MgUmVkaXJlY3RpbmdJbml0aWFsaXplciBleHRlbmRzIEluaXRpYWxpemVyIHsKICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWluZyBpbnZva2VkIGluIHRoZSBzYW1lIGNsYXNzLiBOb3QgbnVsbC4KICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoQ29uc3RydWN0b3IgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cyk7CgogIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UodGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzKSB7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNDb25zdHJ1Y3RvcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KENvbnN0cnVjdG9yIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBSIGFjY2VwdDxSPihJbml0aWFsaXplclZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQmluZGluZyBvZiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBvZiBhIGNvbnN0cnVjdG9yLgovLy8KLy8vIFRoZSB2YXJpYWJsZSBpcyBpbiBzY29wZSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCwgYnV0IGlzCi8vLyBub3QgaW4gc2NvcGUgaW4gdGhlIGNvbnN0cnVjdG9yIGJvZHkuCmNsYXNzIExvY2FsSW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgTG9jYWxJbml0aWFsaXplcih0aGlzLnZhcmlhYmxlKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICB9CgogIFIgYWNjZXB0PFI+KEluaXRpYWxpemVyVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0TG9jYWxJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZhcmlhYmxlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgQXNzZXJ0SW5pdGlhbGl6ZXIgZXh0ZW5kcyBJbml0aWFsaXplciB7CiAgQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudDsKCiAgQXNzZXJ0SW5pdGlhbGl6ZXIodGhpcy5zdGF0ZW1lbnQpIHsKICAgIHN0YXRlbWVudC5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oSW5pdGlhbGl6ZXJWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRBc3NlcnRJbml0aWFsaXplcih0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHN0YXRlbWVudC5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgIHN0YXRlbWVudC5wYXJlbnQgPSB0aGlzOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBBIGZ1bmN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlcnMgYW5kIGhhcyBhIGJvZHkuCi8vLwovLy8gVGhpcyBtYXkgb2NjdXIgaW4gYSBwcm9jZWR1cmUsIGNvbnN0cnVjdG9yLCBmdW5jdGlvbiBleHByZXNzaW9uLCBvciBsb2NhbAovLy8gZnVuY3Rpb24gZGVjbGFyYXRpb24uCmNsYXNzIEZ1bmN0aW9uTm9kZSBleHRlbmRzIFRyZWVOb2RlIHsKICAvLy8gRW5kIG9mZnNldCBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kCiAgLy8vIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUgZW5kIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlCiAgLy8vICh0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vbmUgaXMgc3BlY2lmaWNhbGx5IHNldCkuCiAgaW50IGZpbGVFbmRPZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgLy8vIEtlcm5lbCBhc3luYyBtYXJrZXIgZm9yIHRoZSBmdW5jdGlvbi4KICAvLy8KICAvLy8gU2VlIGFsc28gW2RhcnRBc3luY01hcmtlcl0uCiAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXI7CgogIC8vLyBEYXJ0IGFzeW5jIG1hcmtlciBmb3IgdGhlIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBTZWUgYWxzbyBbYXN5bmNNYXJrZXJdLgogIC8vLwogIC8vLyBBIEtlcm5lbCBmdW5jdGlvbiBjYW4gcmVwcmVzZW50IGEgRGFydCBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IGFzeW5jCiAgLy8vIG1hcmtlci4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIHdoZW4gYXN5bmMvYXdhaXQgaXMgdHJhbnNsYXRlZCBhd2F5LAogIC8vLyBhIERhcnQgYXN5bmMgZnVuY3Rpb24gbWlnaHQgYmUgcmVwcmVzZW50ZWQgYnkgYSBLZXJuZWwgc3luYyBmdW5jdGlvbi4KICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXI7CgogIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVyczsKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVyczsKICBEYXJ0VHlwZSByZXR1cm5UeXBlOyAvLyBOb3QgbnVsbC4KICBTdGF0ZW1lbnQgX2JvZHk7CgogIHZvaWQgRnVuY3Rpb24oKSBsYXp5QnVpbGRlcjsKCiAgdm9pZCBfYnVpbGRMYXp5KCkgewogICAgaWYgKGxhenlCdWlsZGVyICE9IG51bGwpIHsKICAgICAgdmFyIGxhenlCdWlsZGVyTG9jYWwgPSBsYXp5QnVpbGRlcjsKICAgICAgbGF6eUJ1aWxkZXIgPSBudWxsOwogICAgICBsYXp5QnVpbGRlckxvY2FsKCk7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgZ2V0IGJvZHkgewogICAgX2J1aWxkTGF6eSgpOwogICAgcmV0dXJuIF9ib2R5OwogIH0KCiAgdm9pZCBzZXQgYm9keShTdGF0ZW1lbnQgYm9keSkgewogICAgX2J1aWxkTGF6eSgpOwogICAgX2JvZHkgPSBib2R5OwogIH0KCiAgRnVuY3Rpb25Ob2RlKHRoaXMuX2JvZHksCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIHRoaXMucmV0dXJuVHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy5hc3luY01hcmtlcjogQXN5bmNNYXJrZXIuU3luYywKICAgICAgdGhpcy5kYXJ0QXN5bmNNYXJrZXJ9KQogICAgICA6IHRoaXMucG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycyA/PyA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICB0aGlzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPQogICAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50ID8/IHBvc2l0aW9uYWxQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCwKICAgICAgICB0aGlzLm5hbWVkUGFyYW1ldGVycyA9IG5hbWVkUGFyYW1ldGVycyA/PyA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPz8gPFR5cGVQYXJhbWV0ZXI+W10gewogICAgYXNzZXJ0KHJldHVyblR5cGUgIT0gbnVsbCk7CiAgICBzZXRQYXJlbnRzKHRoaXMudHlwZVBhcmFtZXRlcnMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh0aGlzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHNldFBhcmVudHModGhpcy5uYW1lZFBhcmFtZXRlcnMsIHRoaXMpOwogICAgX2JvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBkYXJ0QXN5bmNNYXJrZXIgPz89IGFzeW5jTWFya2VyOwogIH0KCiAgc3RhdGljIERhcnRUeXBlIF9nZXRUeXBlT2ZWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpID0+IG5vZGUudHlwZTsKCiAgc3RhdGljIE5hbWVkVHlwZSBfZ2V0TmFtZWRUeXBlT2ZWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTmFtZWRUeXBlKG5vZGUubmFtZSwgbm9kZS50eXBlLCBpc1JlcXVpcmVkOiBub2RlLmlzUmVxdWlyZWQpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIG5vZGUgcmV1c2luZyBpdHMgdHlwZSBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBUaGlzIGdldHRlciB3b3JrcyBzaW1pbGFybHkgdG8gW2Z1bmN0aW9uVHlwZV0sIGJ1dCByZXVzZXMgdHlwZSBwYXJhbWV0ZXJzCiAgLy8vIG9mIHRoZSBmdW5jdGlvbiBub2RlIChvciB0aGUgY2xhc3MgZW5jbG9zaW5nIGl0IC0tIHNlZSB0aGUgY29tbWVudCBvbgogIC8vLyBbZnVuY3Rpb25UeXBlXSBhYm91dCBjb25zdHJ1Y3RvcnMgb2YgZ2VuZXJpYyBjbGFzc2VzKSBpbiB0aGUgcmVzdWx0LiAgSXQKICAvLy8gaXMgdXNlZnVsIGluIHNvbWUgY29udGV4dHMsIGVzcGVjaWFsbHkgd2hlbiByZWFzb25pbmcgYWJvdXQgdGhlIGZ1bmN0aW9uCiAgLy8vIHR5cGUgb2YgdGhlIGVuY2xvc2luZyBnZW5lcmljIGZ1bmN0aW9uIGFuZCBpbiBjb21iaW5hdGlvbiB3aXRoCiAgLy8vIFtGdW5jdGlvblR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzXS4KICBGdW5jdGlvblR5cGUgY29tcHV0ZVRoaXNGdW5jdGlvblR5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIFRyZWVOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkID0KICAgICAgICBuYW1lZFBhcmFtZXRlcnMubWFwKF9nZXROYW1lZFR5cGVPZlZhcmlhYmxlKS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgIG5hbWVkLnNvcnQoKTsKICAgIC8vIFdlIG5lZWQgY3JlYXRlIGEgY29weSBvZiB0aGUgbGlzdCBvZiB0eXBlIHBhcmFtZXRlcnMsIG90aGVyd2lzZQogICAgLy8gdHJhbnNmb3JtYXRpb25zIGxpa2UgZXJhc3VyZSBkb24ndCB3b3JrLgogICAgdmFyIHR5cGVQYXJhbWV0ZXJzQ29weSA9IG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXI+LmZyb20ocGFyZW50IGlzIENvbnN0cnVjdG9yCiAgICAgICAgPyBwYXJlbnQuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMKICAgICAgICA6IHR5cGVQYXJhbWV0ZXJzKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChfZ2V0VHlwZU9mVmFyaWFibGUpLnRvTGlzdChncm93YWJsZTogZmFsc2UpLAogICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgbnVsbGFiaWxpdHksCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnNDb3B5LAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG5vZGUuCiAgLy8vCiAgLy8vIElmIHRoZSBmdW5jdGlvbiBub2RlIGRlc2NyaWJlcyBhIGdlbmVyaWMgZnVuY3Rpb24sIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24KICAvLy8gdHlwZSB3aWxsIGJlIGdlbmVyaWMuICBJZiB0aGUgZnVuY3Rpb24gbm9kZSBkZXNjcmliZXMgYSBjb25zdHJ1Y3RvciBvZiBhCiAgLy8vIGdlbmVyaWMgY2xhc3MsIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gdHlwZSB3aWxsIGJlIGdlbmVyaWMgd2l0aCBpdHMgdHlwZQogIC8vLyBwYXJhbWV0ZXJzIGNvbnN0cnVjdGVkIGFmdGVyIHRob3NlIG9mIHRoZSBjbGFzcy4gIEluIGJvdGggY2FzZXMsIGlmIHRoZQogIC8vLyByZXN1bHRpbmcgZnVuY3Rpb24gdHlwZSBpcyBnZW5lcmljLCBhIGZyZXNoIHNldCBvZiB0eXBlIHBhcmFtZXRlcnMgaXMgdXNlZAogIC8vLyBpbiBpdC4KICBGdW5jdGlvblR5cGUgY29tcHV0ZUZ1bmN0aW9uVHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkKICAgICAgICA/IGNvbXB1dGVUaGlzRnVuY3Rpb25UeXBlKG51bGxhYmlsaXR5KQogICAgICAgIDogZ2V0RnJlc2hUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykKICAgICAgICAgICAgLmFwcGx5VG9GdW5jdGlvblR5cGUoY29tcHV0ZVRoaXNGdW5jdGlvblR5cGUobnVsbGFiaWxpdHkpKTsKICB9CgogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRGdW5jdGlvbk5vZGUodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodHlwZVBhcmFtZXRlcnMsIHYpOwogICAgdmlzaXRMaXN0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB2KTsKICAgIHZpc2l0TGlzdChuYW1lZFBhcmFtZXRlcnMsIHYpOwogICAgcmV0dXJuVHlwZT8uYWNjZXB0KHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtTGlzdCh0eXBlUGFyYW1ldGVycywgdiwgdGhpcyk7CiAgICB0cmFuc2Zvcm1MaXN0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QobmFtZWRQYXJhbWV0ZXJzLCB2LCB0aGlzKTsKICAgIHJldHVyblR5cGUgPSB2LnZpc2l0RGFydFR5cGUocmV0dXJuVHlwZSk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgplbnVtIEFzeW5jTWFya2VyIHsKICAvLyBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSwgdGhlIGZyb250ZW5kcyBkZXBlbmQgb24gaXQuCiAgU3luYywKICBTeW5jU3RhciwKICBBc3luYywKICBBc3luY1N0YXIsCgogIC8vIGBTeW5jWWllbGRpbmdgIGlzIGEgbWFya2VyIHRoYXQgdGVsbHMgRGFydCBWTSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYW4KICAvLyBhcnRpZmljaWFsIGNsb3N1cmUgaW50cm9kdWNlZCBieSBhbiBhc3luYyB0cmFuc2Zvcm1lciB3aGljaCBkZXN1Z2FyZWQgYWxsCiAgLy8gYXN5bmMgc3ludGF4IGludG8gYSBjb21iaW5hdGlvbiBvZiBuYXRpdmUgeWllbGRzIGFuZCBoZWxwZXIgbWV0aG9kIGNhbGxzLgogIC8vCiAgLy8gTmF0aXZlIHlpZWxkcyAoZm9ybWF0dGVkIGFzIGBbeWllbGRdYCkgYXJlIHNlbWFudGljYWxseSBjbG9zZSB0bwogIC8vIGB5aWVsZCB4YCBzdGF0ZW1lbnQ6IHRoZXkgZGVub3RlIGEgeWllbGQvcmVzdW1lIHBvaW50IHdpdGhpbiBhIGZ1bmN0aW9uCiAgLy8gYnV0IGFyZSBjb21wbGV0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBub3Rpb24gb2YgaXRlcmF0b3JzLiBXaGVuCiAgLy8gZXhlY3V0aW9uIG9mIHRoZSBjbG9zdXJlIHJlYWNoZXMgYFt5aWVsZF0geGAgaXQgc3RvcHMgYW5kIHJldHVybiB0aGUKICAvLyB2YWx1ZSBvZiBgeGAgdG8gdGhlIGNhbGxlci4gSWYgY2xvc3VyZSBpcyBjYWxsZWQgYWdhaW4gaXQgY29udGludWVzCiAgLy8gdG8gdGhlIG5leHQgc3RhdGVtZW50IGFmdGVyIHRoaXMgeWllbGQgYXMgaWYgaXQgd2FzIHN1c3BlbmRlZCBhbmQgcmVzdW1lZC4KICAvLwogIC8vIENvbnNpZGVyIHRoaXMgZXhhbXBsZToKICAvLwogIC8vICAgZygpIHsKICAvLyAgICAgdmFyIDphd2FpdF9qdW1wX3ZhciA9IDA7CiAgLy8gICAgIHZhciA6YXdhaXRfY3R4X3ZhcjsKICAvLwogIC8vICAgICBmKHgpIHlpZWxkaW5nIHsKICAvLyAgICAgICBbeWllbGRdICcke3h9OjAnOwogIC8vICAgICAgIFt5aWVsZF0gJyR7eH06MSc7CiAgLy8gICAgICAgW3lpZWxkXSAnJHt4fToyJzsKICAvLyAgICAgfQogIC8vCiAgLy8gICAgIHJldHVybiBmOwogIC8vICAgfQogIC8vCiAgLy8gICBwcmludChmKCdhJykpOyAgLyogcHJpbnRzICdhOjAnLCA6YXdhaXRfanVtcF92YXIgPSAxICAqLwogIC8vICAgcHJpbnQoZignYicpKTsgIC8qIHByaW50cyAnYjoxJywgOmF3YWl0X2p1bXBfdmFyID0gMiAgKi8KICAvLyAgIHByaW50KGYoJ2MnKSk7ICAvKiBwcmludHMgJ2M6MicsIDphd2FpdF9qdW1wX3ZhciA9IDMgICovCiAgLy8KICAvLyBOb3RlOiBjdXJyZW50bHkgRGFydCBWTSBpbXBsaWNpdGx5IHJlbGllcyBvbiBhc3luYyB0cmFuc2Zvcm1lciB0bwogIC8vIGluamVjdCBjZXJ0YWluIGFydGlmaWNpYWwgdmFyaWFibGVzIGludG8gZyAobGlrZSBgOmF3YWl0X2p1bXBfdmFyYCkuCiAgLy8gQXMgc3VjaCBTeW5jWWllbGRpbmcgYW5kIG5hdGl2ZSB5aWVsZCBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgb24gdGhlaXIKICAvLyBvd24sIGJ1dCBhcmUgcmF0aGVyIGFuIGltcGxlbWVudGF0aW9uIGFydGlmYWN0IG9mIHRoZSBhc3luYyB0cmFuc2Zvcm1lcgogIC8vIGl0c2VsZi4KICBTeW5jWWllbGRpbmcsCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQUkVTU0lPTlMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVHJlZU5vZGUgewogIC8vLyBSZXR1cm5zIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4KICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpOwoKICAvLy8gUmV0dXJucyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYXMgYW4gaW5zdGFudGlhdGlvbiBvZgogIC8vLyBbc3VwZXJjbGFzc10uCiAgLy8vCiAgLy8vIFNob3VsZG4ndCBiZSB1c2VkIG9uIGNvZGUgY29tcGlsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoaXMgbWV0aG9kIGFzc3VtZXMKICAvLy8gdGhlIElSIGlzIHN0cm9uZ2x5IHR5cGVkLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBmdXJ0aGVybW9yZSBhc3N1bWVzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYWN0dWFsbHkKICAvLy8gaXMgYSBzdWJ0eXBlIG9mIChzb21lIGluc3RhbnRpYXRpb24gb2YpIHRoZSBnaXZlbiBbc3VwZXJjbGFzc10uCiAgLy8vIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBlaXRoZXIgYW4gZXhjZXB0aW9uIGlzIHRocm93biBvciB0aGUgcmF3IHR5cGUgb2YKICAvLy8gW3N1cGVyY2xhc3NdIGlzIHJldHVybmVkLgogIEludGVyZmFjZVR5cGUgZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZigKICAgICAgQ2xhc3Mgc3VwZXJjbGFzcywgU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUgcHJvZ3JhbSBpcyBjb3JyZWN0bHkgdHlwZWQsIHNvIGlmIHRoZSBzdXBlcmNsYXNzCiAgICAvLyBpcyBub3QgZ2VuZXJpYywgd2UgY2FuIGp1c3QgcmV0dXJuIGl0cyByYXcgdHlwZSB3aXRob3V0IGNvbXB1dGluZyB0aGUKICAgIC8vIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiAgSXQgYWxzbyBlbnN1cmVzIHRoYXQgYWxsIHR5cGVzIGFyZSBjb25zaWRlcmVkCiAgICAvLyBzdWJ0eXBlcyBvZiBPYmplY3QgKG5vdCBqdXN0IGludGVyZmFjZSB0eXBlcyksIGFuZCBmdW5jdGlvbiB0eXBlcyBhcmUKICAgIC8vIGNvbnNpZGVyZWQgc3VidHlwZXMgb2YgRnVuY3Rpb24uCiAgICBpZiAoc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMKICAgICAgICAgIC5yYXdUeXBlKHN1cGVyY2xhc3MsIGNvbnRleHQubm9uTnVsbGFibGUpOwogICAgfQogICAgdmFyIHR5cGUgPSBnZXRTdGF0aWNUeXBlKGNvbnRleHQpOwogICAgd2hpbGUgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgdHlwZVBhcmFtZXRlclR5cGUgPSB0eXBlOwogICAgICB0eXBlID0KICAgICAgICAgIHR5cGVQYXJhbWV0ZXJUeXBlLnByb21vdGVkQm91bmQgPz8gdHlwZVBhcmFtZXRlclR5cGUucGFyYW1ldGVyLmJvdW5kOwogICAgfQogICAgaWYgKHR5cGUgPT0gY29udGV4dC50eXBlRW52aXJvbm1lbnQubnVsbFR5cGUpIHsKICAgICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcwogICAgICAgICAgLmJvdHRvbUludGVyZmFjZVR5cGUoc3VwZXJjbGFzcywgY29udGV4dC5udWxsYWJsZSk7CiAgICB9CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHVwY2FzdFR5cGVBcmd1bWVudHMgPSBjb250ZXh0LnR5cGVFbnZpcm9ubWVudAogICAgICAgICAgLmdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgICAgIGlmICh1cGNhc3RUeXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIHN1cGVyY2xhc3MsIHR5cGUubnVsbGFiaWxpdHksIHVwY2FzdFR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgQm90dG9tVHlwZSkgewogICAgICByZXR1cm4gY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzCiAgICAgICAgICAuYm90dG9tSW50ZXJmYWNlVHlwZShzdXBlcmNsYXNzLCBjb250ZXh0Lm5vbk51bGxhYmxlKTsKICAgIH0KICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50CiAgICAgICAgLnR5cGVFcnJvcih0aGlzLCAnJHR5cGUgaXMgbm90IGEgc3VidHlwZSBvZiAkc3VwZXJjbGFzcycpOwogICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcwogICAgICAgIC5yYXdUeXBlKHN1cGVyY2xhc3MsIGNvbnRleHQubm9uTnVsbGFibGUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdik7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZyk7Cn0KCi8vLyBBbiBleHByZXNzaW9uIGNvbnRhaW5pbmcgY29tcGlsZS10aW1lIGVycm9ycy4KLy8vCi8vLyBTaG91bGQgdGhyb3cgYSBydW50aW1lIGVycm9yIHdoZW4gZXZhbHVhdGVkLgovLy8KLy8vIFRoZSBbZmlsZU9mZnNldF0gb2YgYW4gW0ludmFsaWRFeHByZXNzaW9uXSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIGluIHRoZQovLy8gdHJlZSB3aGVyZSB0aGUgZXhwcmVzc2lvbiBvY2N1cnMsIHJhdGhlciB0aGFuIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCmNsYXNzIEludmFsaWRFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgU3RyaW5nIG1lc3NhZ2U7CgogIEludmFsaWRFeHByZXNzaW9uKHRoaXMubWVzc2FnZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4gY29uc3QgQm90dG9tVHlwZSgpOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SW52YWxpZEV4cHJlc3Npb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdEludmFsaWRFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBSZWFkIGEgbG9jYWwgdmFyaWFibGUsIGEgbG9jYWwgZnVuY3Rpb24sIG9yIGEgZnVuY3Rpb24gcGFyYW1ldGVyLgpjbGFzcyBWYXJpYWJsZUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgRGFydFR5cGUgcHJvbW90ZWRUeXBlOyAvLyBOdWxsIGlmIG5vdCBwcm9tb3RlZC4KCiAgVmFyaWFibGVHZXQodGhpcy52YXJpYWJsZSwgW3RoaXMucHJvbW90ZWRUeXBlXSkgOiBhc3NlcnQodmFyaWFibGUgIT0gbnVsbCk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIHByb21vdGVkVHlwZSA/PyB2YXJpYWJsZS50eXBlOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFZhcmlhYmxlR2V0KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRWYXJpYWJsZUdldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgcHJvbW90ZWRUeXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocHJvbW90ZWRUeXBlICE9IG51bGwpIHsKICAgICAgcHJvbW90ZWRUeXBlID0gdi52aXNpdERhcnRUeXBlKHByb21vdGVkVHlwZSk7CiAgICB9CiAgfQp9CgovLy8gQXNzaWduIGEgbG9jYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24gcGFyYW1ldGVyLgovLy8KLy8vIEV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgW3ZhbHVlXS4KY2xhc3MgVmFyaWFibGVTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwogIEV4cHJlc3Npb24gdmFsdWU7CgogIFZhcmlhYmxlU2V0KHRoaXMudmFyaWFibGUsIHRoaXMudmFsdWUpIDogYXNzZXJ0KHZhcmlhYmxlICE9IG51bGwpIHsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICB2YWx1ZS5nZXRTdGF0aWNUeXBlKGNvbnRleHQpOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VmFyaWFibGVTZXQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFZhcmlhYmxlU2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHguZmllbGRgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIGdldHRlciwgcmVhZCBhIGZpZWxkLCBvciB0ZWFyIG9mZiBhIG1ldGhvZC4KY2xhc3MgUHJvcGVydHlHZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIE5hbWUgbmFtZTsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgUHJvcGVydHlHZXQoRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBbTWVtYmVyIGludGVyZmFjZVRhcmdldF0pCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShyZWNlaXZlciwgbmFtZSwgZ2V0TWVtYmVyUmVmZXJlbmNlKGludGVyZmFjZVRhcmdldCkpOwoKICBQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy5uYW1lLCB0aGlzLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IGludGVyZmFjZVRhcmdldCA9PiBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBpbnRlcmZhY2VUYXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHZhciBpbnRlcmZhY2VUYXJnZXQgPSB0aGlzLmludGVyZmFjZVRhcmdldDsKICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICBDbGFzcyBzdXBlcmNsYXNzID0gaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgICB2YXIgcmVjZWl2ZXJUeXBlID0KICAgICAgICAgIHJlY2VpdmVyLmdldFN0YXRpY1R5cGVBc0luc3RhbmNlT2Yoc3VwZXJjbGFzcywgY29udGV4dCk7CiAgICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlKTsKICAgIH0KICAgIC8vIFRyZWF0IHRoZSBwcm9wZXJ0aWVzIG9mIE9iamVjdCBzcGVjaWFsbHkuCiAgICBTdHJpbmcgbmFtZVN0cmluZyA9IG5hbWUubmFtZTsKICAgIGlmIChuYW1lU3RyaW5nID09ICdoYXNoQ29kZScpIHsKICAgICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5pbnRSYXdUeXBlKGNvbnRleHQubm9uTnVsbGFibGUpOwogICAgfSBlbHNlIGlmIChuYW1lU3RyaW5nID09ICdydW50aW1lVHlwZScpIHsKICAgICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy50eXBlUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKICAgIH0KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFByb3BlcnR5R2V0KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRQcm9wZXJ0eUdldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIGludGVyZmFjZVRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHguZmllbGQgPSB2YWx1ZWAuCi8vLwovLy8gVGhpcyBtYXkgaW52b2tlIGEgc2V0dGVyIG9yIGFzc2lnbiBhIGZpZWxkLgovLy8KLy8vIEV2YWx1YXRlcyB0byB0aGUgdmFsdWUgb2YgW3ZhbHVlXS4KY2xhc3MgUHJvcGVydHlTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIHJlY2VpdmVyOwogIE5hbWUgbmFtZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBSZWZlcmVuY2UgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlOwoKICBQcm9wZXJ0eVNldChFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIFtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWNlaXZlciwgbmFtZSwgdmFsdWUsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgUHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgdGhpcy5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IGludGVyZmFjZVRhcmdldCA9PiBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCBpbnRlcmZhY2VUYXJnZXQoTWVtYmVyIG1lbWJlcikgewogICAgaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKG1lbWJlcik7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIHZhbHVlLmdldFN0YXRpY1R5cGUoY29udGV4dCk7CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRQcm9wZXJ0eVNldCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0UHJvcGVydHlTZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICBpbnRlcmZhY2VUYXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBEaXJlY3RseSByZWFkIGEgZmllbGQsIGNhbGwgYSBnZXR0ZXIsIG9yIHRlYXIgb2ZmIGEgbWV0aG9kLgpjbGFzcyBEaXJlY3RQcm9wZXJ0eUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKCiAgRGlyZWN0UHJvcGVydHlHZXQoRXhwcmVzc2lvbiByZWNlaXZlciwgTWVtYmVyIHRhcmdldCkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKHJlY2VpdmVyLCBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KSk7CgogIERpcmVjdFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKHRoaXMucmVjZWl2ZXIsIHRoaXMudGFyZ2V0UmVmZXJlbmNlKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IHRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdERpcmVjdFByb3BlcnR5R2V0KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXREaXJlY3RQcm9wZXJ0eUdldCh0aGlzLCBhcmcpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIENsYXNzIHN1cGVyY2xhc3MgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICB2YXIgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIuZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZihzdXBlcmNsYXNzLCBjb250ZXh0KTsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0YXJnZXQuZ2V0dGVyVHlwZSk7CiAgfQp9CgovLy8gRGlyZWN0bHkgYXNzaWduIGEgZmllbGQsIG9yIGNhbGwgYSBzZXR0ZXIuCi8vLwovLy8gRXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBbdmFsdWVdLgpjbGFzcyBEaXJlY3RQcm9wZXJ0eVNldCBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBEaXJlY3RQcm9wZXJ0eVNldChFeHByZXNzaW9uIHJlY2VpdmVyLCBNZW1iZXIgdGFyZ2V0LCBFeHByZXNzaW9uIHZhbHVlKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UocmVjZWl2ZXIsIGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCB2YWx1ZSk7CgogIERpcmVjdFByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICB0aGlzLnJlY2VpdmVyLCB0aGlzLnRhcmdldFJlZmVyZW5jZSwgdGhpcy52YWx1ZSkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IHRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0RGlyZWN0UHJvcGVydHlTZXQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdERpcmVjdFByb3BlcnR5U2V0KHRoaXMsIGFyZyk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgdmFsdWUuZ2V0U3RhdGljVHlwZShjb250ZXh0KTsKfQoKLy8vIERpcmVjdGx5IGNhbGwgYW4gaW5zdGFuY2UgbWV0aG9kLCBieXBhc3Npbmcgb3JkaW5hcnkgZGlzcGF0Y2guCmNsYXNzIERpcmVjdE1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwogIEFyZ3VtZW50cyBhcmd1bWVudHM7CgogIERpcmVjdE1ldGhvZEludm9jYXRpb24oCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFByb2NlZHVyZSB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShyZWNlaXZlciwgZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cyk7CgogIERpcmVjdE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMudGFyZ2V0UmVmZXJlbmNlLCB0aGlzLmFyZ3VtZW50cykgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzUHJvY2VkdXJlOwoKICB2b2lkIHNldCB0YXJnZXQoUHJvY2VkdXJlIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBOYW1lIGdldCBuYW1lID0+IHRhcmdldD8ubmFtZTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24odGhpcywgYXJnKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSB7CiAgICBpZiAoY29udGV4dC50eXBlRW52aXJvbm1lbnQuaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKHRhcmdldCkpIHsKICAgICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKAogICAgICAgICAgcmVjZWl2ZXIuZ2V0U3RhdGljVHlwZShjb250ZXh0KSwKICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdLmdldFN0YXRpY1R5cGUoY29udGV4dCkpOwogICAgfQogICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IHRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIHZhciByZWNlaXZlclR5cGUgPSByZWNlaXZlci5nZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mKHN1cGVyY2xhc3MsIGNvbnRleHQpOwogICAgdmFyIHJldHVyblR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUocmVjZWl2ZXJUeXBlKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBhcmd1bWVudHMudHlwZXMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVyblR5cGUpOwogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgc3VwZXIuZmllbGRgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIGdldHRlciwgcmVhZCBhIGZpZWxkLCBvciB0ZWFyIG9mZiBhIG1ldGhvZC4KY2xhc3MgU3VwZXJQcm9wZXJ0eUdldCBleHRlbmRzIEV4cHJlc3Npb24gewogIE5hbWUgbmFtZTsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgU3VwZXJQcm9wZXJ0eUdldChOYW1lIG5hbWUsIFtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKG5hbWUsIGdldE1lbWJlclJlZmVyZW5jZShpbnRlcmZhY2VUYXJnZXQpKTsKCiAgU3VwZXJQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSh0aGlzLm5hbWUsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKCiAgTWVtYmVyIGdldCBpbnRlcmZhY2VUYXJnZXQgPT4gaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgaW50ZXJmYWNlVGFyZ2V0KE1lbWJlciBtZW1iZXIpIHsKICAgIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZShtZW1iZXIpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSB7CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwZXJQcm9wZXJ0eUdldCB3aXRob3V0IGEgdGFyZ2V0IHNob3VsZCBiZQogICAgICAvLyByZXBsYWNlZCBieSBpbnZhbGlkIGV4cHJlc3Npb25zLgogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIENsYXNzIGRlY2xhcmluZ0NsYXNzID0gaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGRlY2xhcmluZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gcmVjZWl2ZXJBcmd1bWVudHMgPSBjb250ZXh0LnR5cGVFbnZpcm9ubWVudAogICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKGNvbnRleHQudGhpc1R5cGUsIGRlY2xhcmluZ0NsYXNzKTsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICBkZWNsYXJpbmdDbGFzcy50eXBlUGFyYW1ldGVycywgcmVjZWl2ZXJBcmd1bWVudHMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVRhcmdldC5nZXR0ZXJUeXBlKTsKICB9CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRTdXBlclByb3BlcnR5R2V0KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRTdXBlclByb3BlcnR5R2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBpbnRlcmZhY2VUYXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBFeHByZXNzaW9uIG9mIGZvcm0gYHN1cGVyLmZpZWxkID0gdmFsdWVgLgovLy8KLy8vIFRoaXMgbWF5IGludm9rZSBhIHNldHRlciBvciBhc3NpZ24gYSBmaWVsZC4KLy8vCi8vLyBFdmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIFt2YWx1ZV0uCmNsYXNzIFN1cGVyUHJvcGVydHlTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBOYW1lIG5hbWU7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgU3VwZXJQcm9wZXJ0eVNldChOYW1lIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUsIE1lbWJlciBpbnRlcmZhY2VUYXJnZXQpCiAgICAgIDogdGhpcy5ieVJlZmVyZW5jZShuYW1lLCB2YWx1ZSwgZ2V0TWVtYmVyUmVmZXJlbmNlKGludGVyZmFjZVRhcmdldCkpOwoKICBTdXBlclByb3BlcnR5U2V0LmJ5UmVmZXJlbmNlKAogICAgICB0aGlzLm5hbWUsIHRoaXMudmFsdWUsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChNZW1iZXIgbWVtYmVyKSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UobWVtYmVyKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgdmFsdWUuZ2V0U3RhdGljVHlwZShjb250ZXh0KTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN1cGVyUHJvcGVydHlTZXQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFN1cGVyUHJvcGVydHlTZXQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGludGVyZmFjZVRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gUmVhZCBhIHN0YXRpYyBmaWVsZCwgY2FsbCBhIHN0YXRpYyBnZXR0ZXIsIG9yIHRlYXIgb2ZmIGEgc3RhdGljIG1ldGhvZC4KY2xhc3MgU3RhdGljR2V0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLy8vIEEgc3RhdGljIGZpZWxkLCBnZXR0ZXIsIG9yIG1ldGhvZCAoZm9yIHRlYXItb2ZmKS4KICBSZWZlcmVuY2UgdGFyZ2V0UmVmZXJlbmNlOwoKICBTdGF0aWNHZXQoTWVtYmVyIHRhcmdldCkgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpKTsKCiAgU3RhdGljR2V0LmJ5UmVmZXJlbmNlKHRoaXMudGFyZ2V0UmVmZXJlbmNlKTsKCiAgTWVtYmVyIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc01lbWJlcjsKCiAgdm9pZCBzZXQgdGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIHRhcmdldFJlZmVyZW5jZSA9IGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PiB0YXJnZXQuZ2V0dGVyVHlwZTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN0YXRpY0dldCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0U3RhdGljR2V0KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB0YXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBBc3NpZ24gYSBzdGF0aWMgZmllbGQgb3IgY2FsbCBhIHN0YXRpYyBzZXR0ZXIuCi8vLwovLy8gRXZhbHVhdGVzIHRvIHRoZSB2YWx1ZSBvZiBbdmFsdWVdLgpjbGFzcyBTdGF0aWNTZXQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvLy8gQSBtdXRhYmxlIHN0YXRpYyBmaWVsZCBvciBhIHN0YXRpYyBzZXR0ZXIuCiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBTdGF0aWNTZXQoTWVtYmVyIHRhcmdldCwgRXhwcmVzc2lvbiB2YWx1ZSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCB2YWx1ZSk7CgogIFN0YXRpY1NldC5ieVJlZmVyZW5jZSh0aGlzLnRhcmdldFJlZmVyZW5jZSwgdGhpcy52YWx1ZSkgewogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiB0YXJnZXRSZWZlcmVuY2U/LmFzTWVtYmVyOwoKICB2b2lkIHNldCB0YXJnZXQoTWVtYmVyIHRhcmdldCkgewogICAgdGFyZ2V0UmVmZXJlbmNlID0gZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIHZhbHVlLmdldFN0YXRpY1R5cGUoY29udGV4dCk7CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRTdGF0aWNTZXQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFN0YXRpY1NldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBUaGUgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gY2FsbCwgZGl2aWRlZCBpbnRvIHR5cGUgYXJndW1lbnRzLAovLy8gcG9zaXRpb25hbCBhcmd1bWVudHMsIGFuZCBuYW1lZCBhcmd1bWVudHMuCmNsYXNzIEFyZ3VtZW50cyBleHRlbmRzIFRyZWVOb2RlIHsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlczsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWw7CiAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkOwoKICBBcmd1bWVudHModGhpcy5wb3NpdGlvbmFsLAogICAgICB7TGlzdDxEYXJ0VHlwZT4gdHlwZXMsIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZH0pCiAgICAgIDogdGhpcy50eXBlcyA9IHR5cGVzID8/IDxEYXJ0VHlwZT5bXSwKICAgICAgICB0aGlzLm5hbWVkID0gbmFtZWQgPz8gPE5hbWVkRXhwcmVzc2lvbj5bXSB7CiAgICBzZXRQYXJlbnRzKHRoaXMucG9zaXRpb25hbCwgdGhpcyk7CiAgICBzZXRQYXJlbnRzKHRoaXMubmFtZWQsIHRoaXMpOwogIH0KCiAgQXJndW1lbnRzLmVtcHR5KCkKICAgICAgOiB0eXBlcyA9IDxEYXJ0VHlwZT5bXSwKICAgICAgICBwb3NpdGlvbmFsID0gPEV4cHJlc3Npb24+W10sCiAgICAgICAgbmFtZWQgPSA8TmFtZWRFeHByZXNzaW9uPltdOwoKICBmYWN0b3J5IEFyZ3VtZW50cy5mb3J3YXJkZWQoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBuZXcgQXJndW1lbnRzKAogICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcCgocCkgPT4gbmV3IFZhcmlhYmxlR2V0KHApKS50b0xpc3QoKSwKICAgICAgICBuYW1lZDogZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAgIC5tYXAoKHApID0+IG5ldyBOYW1lZEV4cHJlc3Npb24ocC5uYW1lLCBuZXcgVmFyaWFibGVHZXQocCkpKQogICAgICAgICAgICAudG9MaXN0KCksCiAgICAgICAgdHlwZXM6IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgIC5tYXAoKHApID0+IG5ldyBUeXBlUGFyYW1ldGVyVHlwZS53aXRoRGVmYXVsdE51bGxhYmlsaXR5Rm9yTGlicmFyeSgKICAgICAgICAgICAgICAgIHAsIGxpYnJhcnkpKQogICAgICAgICAgICAudG9MaXN0KCkpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oVHJlZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEFyZ3VtZW50cyh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdCh0eXBlcywgdik7CiAgICB2aXNpdExpc3QocG9zaXRpb25hbCwgdik7CiAgICB2aXNpdExpc3QobmFtZWQsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHJhbnNmb3JtVHlwZUxpc3QodHlwZXMsIHYpOwogICAgdHJhbnNmb3JtTGlzdChwb3NpdGlvbmFsLCB2LCB0aGlzKTsKICAgIHRyYW5zZm9ybUxpc3QobmFtZWQsIHYsIHRoaXMpOwogIH0KfQoKLy8vIEEgbmFtZWQgYXJndW1lbnQsIGBuYW1lOiB2YWx1ZWAuCmNsYXNzIE5hbWVkRXhwcmVzc2lvbiBleHRlbmRzIFRyZWVOb2RlIHsKICBTdHJpbmcgbmFtZTsKICBFeHByZXNzaW9uIHZhbHVlOwoKICBOYW1lZEV4cHJlc3Npb24odGhpcy5uYW1lLCB0aGlzLnZhbHVlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXROYW1lZEV4cHJlc3Npb24odGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBDb21tb24gc3VwZXIgY2xhc3MgZm9yIFtEaXJlY3RNZXRob2RJbnZvY2F0aW9uXSwgW01ldGhvZEludm9jYXRpb25dLAovLy8gW1N1cGVyTWV0aG9kSW52b2NhdGlvbl0sIFtTdGF0aWNJbnZvY2F0aW9uXSwgYW5kIFtDb25zdHJ1Y3Rvckludm9jYXRpb25dLgphYnN0cmFjdCBjbGFzcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIEFyZ3VtZW50cyBnZXQgYXJndW1lbnRzOwogIHNldCBhcmd1bWVudHMoQXJndW1lbnRzIHZhbHVlKTsKCiAgLy8vIE5hbWUgb2YgdGhlIGludm9rZWQgbWV0aG9kLgogIC8vLwogIC8vLyBNYXkgYmUgYG51bGxgIGlmIHRoZSB0YXJnZXQgaXMgYSBzeW50aGV0aWMgc3RhdGljIG1lbWJlciB3aXRob3V0IGEgbmFtZS4KICBOYW1lIGdldCBuYW1lOwp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4LmZvbyh5KWAuCmNsYXNzIE1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBOYW1lIG5hbWU7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgTWV0aG9kSW52b2NhdGlvbihFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0XSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWNlaXZlciwgbmFtZSwgYXJndW1lbnRzLCBnZXRNZW1iZXJSZWZlcmVuY2UoaW50ZXJmYWNlVGFyZ2V0KSk7CgogIE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdGhpcy5hcmd1bWVudHMsIHRoaXMuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIE1lbWJlciBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNNZW1iZXI7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChNZW1iZXIgdGFyZ2V0KSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgdmFyIGludGVyZmFjZVRhcmdldCA9IHRoaXMuaW50ZXJmYWNlVGFyZ2V0OwogICAgaWYgKGludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGlmIChpbnRlcmZhY2VUYXJnZXQgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudAogICAgICAgICAgICAgIC5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IoaW50ZXJmYWNlVGFyZ2V0KSkgewogICAgICAgIHJldHVybiBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5nZXRUeXBlT2ZPdmVybG9hZGVkQXJpdGhtZXRpYygKICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0U3RhdGljVHlwZShjb250ZXh0KSwKICAgICAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0uZ2V0U3RhdGljVHlwZShjb250ZXh0KSk7CiAgICAgIH0KICAgICAgQ2xhc3Mgc3VwZXJjbGFzcyA9IGludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgICAgdmFyIHJlY2VpdmVyVHlwZSA9CiAgICAgICAgICByZWNlaXZlci5nZXRTdGF0aWNUeXBlQXNJbnN0YW5jZU9mKHN1cGVyY2xhc3MsIGNvbnRleHQpOwogICAgICB2YXIgZ2V0dGVyVHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZShyZWNlaXZlclR5cGUpCiAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlVGFyZ2V0LmdldHRlclR5cGUpOwogICAgICBpZiAoZ2V0dGVyVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgICAgIGlmIChnZXR0ZXJUeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBhcmd1bWVudHMudHlwZXMubGVuZ3RoKSB7CiAgICAgICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgIGdldHRlclR5cGUudHlwZVBhcmFtZXRlcnMsIGFyZ3VtZW50cy50eXBlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZSBmcm9udCBlbmQgc2hvdWxkIG5vcm1hbGl6ZSB0aGUgdHlwZQogICAgICAgICAgLy8gIGFyZ3VtZW50IGNvdW50IG9yIGNyZWF0ZSBhbiBpbnZhbGlkIGV4cHJlc3Npb24gaW4gY2FzZSBvZiBtZXRob2QKICAgICAgICAgIC8vICBpbnZvY2F0aW9ucyB3aXRoIGludmFsaWQgdHlwZSBhcmd1bWVudCBjb3VudC4KICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgZ2V0dGVyVHlwZS50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICBnZXR0ZXJUeXBlLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgIC5tYXAoKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgPT4KICAgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGUpCiAgICAgICAgICAgICAgICAgIC50b0xpc3QoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZ2V0dGVyVHlwZS5yZXR1cm5UeXBlKTsKICAgICAgfQogICAgICAvLyBUaGUgZnJvbnQgZW5kIGN1cnJlbnRseSBkbyBub3QgcmVwbGFjZSBhIHByb3BlcnR5IGNhbGwgYG8uZm9vKClgLCB3aGVyZQogICAgICAvLyBgZm9vYCBpcyBhIGZpZWxkIG9yIGdldHRlciwgd2l0aCBhIGZ1bmN0aW9uIGNhbGwgb24gdGhlIHByb3BlcnR5LAogICAgICAvLyBgby5mb28uY2FsbCgpYCwgc28gd2UgbG9vayB1cCB0aGUgY2FsbCBtZXRob2QgZXhwbGljaXRseSBoZXJlLgogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyB3aGVuIHRoZSBmcm9udCBlbmQgcGVyZm9ybXMgdGhlCiAgICAgIC8vIGNvcnJlY3QgcmVwbGFjZW1lbnQuCiAgICAgIGlmIChnZXR0ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICBNZW1iZXIgbWVtYmVyID0gY29udGV4dC50eXBlRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihnZXR0ZXJUeXBlLmNsYXNzTm9kZSwgbmV3IE5hbWUoJ2NhbGwnKSk7CiAgICAgICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgICBEYXJ0VHlwZSBjYWxsVHlwZSA9IG1lbWJlci5nZXR0ZXJUeXBlOwogICAgICAgICAgaWYgKGNhbGxUeXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgICAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKGdldHRlclR5cGUpCiAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUoY2FsbFR5cGUucmV0dXJuVHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgaWYgKG5hbWUubmFtZSA9PSAnY2FsbCcpIHsKICAgICAgdmFyIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLmdldFN0YXRpY1R5cGUoY29udGV4dCk7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgaWYgKHJlY2VpdmVyVHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRzLnR5cGVzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgICByZWNlaXZlclR5cGUudHlwZVBhcmFtZXRlcnMsIGFyZ3VtZW50cy50eXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJlY2VpdmVyVHlwZS5yZXR1cm5UeXBlKTsKICAgICAgfQogICAgfQogICAgaWYgKG5hbWUubmFtZSA9PSAnPT0nKSB7CiAgICAgIC8vIFdlIHVzZSB0aGlzIHNwZWNpYWwgY2FzZSB0byBzaW1wbGlmeSBnZW5lcmF0aW9uIG9mICc9PScgY2hlY2tzLgogICAgICByZXR1cm4gY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmJvb2xSYXdUeXBlKGNvbnRleHQubm9uTnVsbGFibGUpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0TWV0aG9kSW52b2NhdGlvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0TWV0aG9kSW52b2NhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIGludGVyZmFjZVRhcmdldD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgbmFtZT8uYWNjZXB0KHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGBzdXBlci5mb28oeClgLgovLy8KLy8vIFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbWlnaHQgbm90IG1hdGNoIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0YXJnZXQuCmNsYXNzIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIEludm9jYXRpb25FeHByZXNzaW9uIHsKICBOYW1lIG5hbWU7CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgUmVmZXJlbmNlIGludGVyZmFjZVRhcmdldFJlZmVyZW5jZTsKCiAgU3VwZXJNZXRob2RJbnZvY2F0aW9uKE5hbWUgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgW1Byb2NlZHVyZSBpbnRlcmZhY2VUYXJnZXRdKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UobmFtZSwgYXJndW1lbnRzLCBnZXRNZW1iZXJSZWZlcmVuY2UoaW50ZXJmYWNlVGFyZ2V0KSk7CgogIFN1cGVyTWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5uYW1lLCB0aGlzLmFyZ3VtZW50cywgdGhpcy5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpIHsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIFByb2NlZHVyZSBnZXQgaW50ZXJmYWNlVGFyZ2V0ID0+IGludGVyZmFjZVRhcmdldFJlZmVyZW5jZT8uYXNQcm9jZWR1cmU7CgogIHZvaWQgc2V0IGludGVyZmFjZVRhcmdldChQcm9jZWR1cmUgdGFyZ2V0KSB7CiAgICBpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsKSByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIENsYXNzIHN1cGVyY2xhc3MgPSBpbnRlcmZhY2VUYXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICBMaXN0PERhcnRUeXBlPiByZWNlaXZlclR5cGVBcmd1bWVudHMgPSBjb250ZXh0LnR5cGVFbnZpcm9ubWVudAogICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKGNvbnRleHQudGhpc1R5cGUsIHN1cGVyY2xhc3MpOwogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9CiAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLCByZWNlaXZlclR5cGVBcmd1bWVudHMpCiAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShpbnRlcmZhY2VUYXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgaW50ZXJmYWNlVGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBhcmd1bWVudHMudHlwZXMpCiAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVyblR5cGUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBpbnRlcmZhY2VUYXJnZXQ/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIG5hbWU/LmFjY2VwdCh2KTsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cyA9IGFyZ3VtZW50cy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBhcmd1bWVudHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGBmb28oeClgLCBvciBgY29uc3QgZm9vKHgpYCBpZiB0aGUgdGFyZ2V0IGlzIGFuCi8vLyBleHRlcm5hbCBjb25zdGFudCBmYWN0b3J5LgovLy8KLy8vIFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbWlnaHQgbm90IG1hdGNoIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0YXJnZXQuCmNsYXNzIFN0YXRpY0ludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBBcmd1bWVudHMgYXJndW1lbnRzOwoKICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQgY2FsbCB0byBhbiBleHRlcm5hbCBjb25zdGFudCBmYWN0b3J5LgogIGJvb2wgaXNDb25zdDsKCiAgTmFtZSBnZXQgbmFtZSA9PiB0YXJnZXQ/Lm5hbWU7CgogIFN0YXRpY0ludm9jYXRpb24oUHJvY2VkdXJlIHRhcmdldCwgQXJndW1lbnRzIGFyZ3VtZW50cywge2Jvb2wgaXNDb25zdDogZmFsc2V9KQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGFyZ3VtZW50cywKICAgICAgICAgICAgaXNDb25zdDogaXNDb25zdCk7CgogIFN0YXRpY0ludm9jYXRpb24uYnlSZWZlcmVuY2UodGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzLAogICAgICB7dGhpcy5pc0NvbnN0OiBmYWxzZX0pIHsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIFByb2NlZHVyZSBnZXQgdGFyZ2V0ID0+IHRhcmdldFJlZmVyZW5jZT8uYXNQcm9jZWR1cmU7CgogIHZvaWQgc2V0IHRhcmdldChQcm9jZWR1cmUgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgIHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0YXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0U3RhdGljSW52b2NhdGlvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0U3RhdGljSW52b2NhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgbmV3IEZvbyh4KWAgb3IgYGNvbnN0IEZvbyh4KWAuCi8vLwovLy8gVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBtaWdodCBub3QgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRhcmdldC4KLy8KLy8gREVTSUdOIFRPRE86IFNob3VsZCB3ZSBwYXNzIHR5cGUgYXJndW1lbnRzIGluIGEgc2VwYXJhdGUgZmllbGQKLy8gYGNsYXNzVHlwZUFyZ3VtZW50c2A/IFRoZXkgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHR5cGUgYXJndW1lbnRzIHRvCi8vIGdlbmVyaWMgZnVuY3Rpb25zLgpjbGFzcyBDb25zdHJ1Y3Rvckludm9jYXRpb24gZXh0ZW5kcyBJbnZvY2F0aW9uRXhwcmVzc2lvbiB7CiAgUmVmZXJlbmNlIHRhcmdldFJlZmVyZW5jZTsKICBBcmd1bWVudHMgYXJndW1lbnRzOwogIGJvb2wgaXNDb25zdDsKCiAgTmFtZSBnZXQgbmFtZSA9PiB0YXJnZXQ/Lm5hbWU7CgogIENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3RvciB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtib29sIGlzQ29uc3Q6IGZhbHNlfSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldE1lbWJlclJlZmVyZW5jZSh0YXJnZXQpLCBhcmd1bWVudHMsCiAgICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpOwoKICBDb25zdHJ1Y3Rvckludm9jYXRpb24uYnlSZWZlcmVuY2UodGhpcy50YXJnZXRSZWZlcmVuY2UsIHRoaXMuYXJndW1lbnRzLAogICAgICB7dGhpcy5pc0NvbnN0OiBmYWxzZX0pIHsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIENvbnN0cnVjdG9yIGdldCB0YXJnZXQgPT4gdGFyZ2V0UmVmZXJlbmNlPy5hc0NvbnN0cnVjdG9yOwoKICB2b2lkIHNldCB0YXJnZXQoQ29uc3RydWN0b3IgdGFyZ2V0KSB7CiAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZXRNZW1iZXJSZWZlcmVuY2UodGFyZ2V0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlcy5pc0VtcHR5CiAgICAgICAgPyBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMKICAgICAgICAgICAgLnJhd1R5cGUodGFyZ2V0LmVuY2xvc2luZ0NsYXNzLCBjb250ZXh0Lm5vbk51bGxhYmxlKQogICAgICAgIDogbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIHRhcmdldC5lbmNsb3NpbmdDbGFzcywgY29udGV4dC5ub25OdWxsYWJsZSwgYXJndW1lbnRzLnR5cGVzKTsKICB9CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGFyZ2V0Py5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICBhcmd1bWVudHM/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgLy8gVE9ETyhkbWl0cnlhcyk6IENoYW5nZSB0aGUgZ2V0dGVyIGludG8gYSBtZXRob2QgdGhhdCBhY2NlcHRzIGEgQ29yZVR5cGVzLgogIEludGVyZmFjZVR5cGUgZ2V0IGNvbnN0cnVjdGVkVHlwZSB7CiAgICBDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IHRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBHZXQgcmF3IHR5cGUgZnJvbSBhIENvcmVUeXBlcyBvYmplY3QgaWYgYXJndW1lbnRzIGlzCiAgICAvLyBlbXB0eS4KICAgIHJldHVybiBhcmd1bWVudHMudHlwZXMuaXNFbXB0eQogICAgICAgID8gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSkKICAgICAgICA6IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBlbmNsb3NpbmdDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBhcmd1bWVudHMudHlwZXMpOwogIH0KfQoKLy8vIEFuIGV4cGxpY2l0IHR5cGUgaW5zdGFudGlhdGlvbiBvZiBhIGdlbmVyaWMgZnVuY3Rpb24uCmNsYXNzIEluc3RhbnRpYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgSW5zdGFudGlhdGlvbih0aGlzLmV4cHJlc3Npb24sIHRoaXMudHlwZUFyZ3VtZW50cykgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgRnVuY3Rpb25UeXBlIHR5cGUgPSBleHByZXNzaW9uLmdldFN0YXRpY1R5cGUoY29udGV4dCk7CiAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21QYWlycyh0eXBlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKQogICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0eXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycyk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SW5zdGFudGlhdGlvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0SW5zdGFudGlhdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtVHlwZUxpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGAheGAuCi8vLwovLy8gVGhlIGBpcyFgIGFuZCBgIT1gIG9wZXJhdG9ycyBhcmUgZGVzdWdhcmVkIGludG8gW05vdF0gbm9kZXMgd2l0aCBgaXNgIGFuZAovLy8gYD09YCBleHByZXNzaW9ucyBpbnNpZGUsIHJlc3BlY3RpdmVseS4KY2xhc3MgTm90IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiBvcGVyYW5kOwoKICBOb3QodGhpcy5vcGVyYW5kKSB7CiAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuYm9vbFJhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXROb3QodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4gdi52aXNpdE5vdCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgb3BlcmFuZD8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKG9wZXJhbmQgIT0gbnVsbCkgewogICAgICBvcGVyYW5kID0gb3BlcmFuZC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgeCAmJiB5YCBvciBgeCB8fCB5YApjbGFzcyBMb2dpY2FsRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gbGVmdDsKICBTdHJpbmcgb3BlcmF0b3I7IC8vICYmIG9yIHx8IG9yID8/CiAgRXhwcmVzc2lvbiByaWdodDsKCiAgTG9naWNhbEV4cHJlc3Npb24odGhpcy5sZWZ0LCB0aGlzLm9wZXJhdG9yLCB0aGlzLnJpZ2h0KSB7CiAgICBsZWZ0Py5wYXJlbnQgPSB0aGlzOwogICAgcmlnaHQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5ib29sUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdExvZ2ljYWxFeHByZXNzaW9uKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRMb2dpY2FsRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgbGVmdD8uYWNjZXB0KHYpOwogICAgcmlnaHQ/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChsZWZ0ICE9IG51bGwpIHsKICAgICAgbGVmdCA9IGxlZnQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgbGVmdD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChyaWdodCAhPSBudWxsKSB7CiAgICAgIHJpZ2h0ID0gcmlnaHQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmlnaHQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4ID8geSA6IHpgLgpjbGFzcyBDb25kaXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBFeHByZXNzaW9uIHRoZW47CiAgRXhwcmVzc2lvbiBvdGhlcndpc2U7CgogIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uIFNob3VsZCBub3QgYmUgYG51bGxgLgogIERhcnRUeXBlIHN0YXRpY1R5cGU7CgogIENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgdGhpcy5jb25kaXRpb24sIHRoaXMudGhlbiwgdGhpcy5vdGhlcndpc2UsIHRoaXMuc3RhdGljVHlwZSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4gc3RhdGljVHlwZTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHRoZW4/LmFjY2VwdCh2KTsKICAgIG90aGVyd2lzZT8uYWNjZXB0KHYpOwogICAgc3RhdGljVHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodGhlbiAhPSBudWxsKSB7CiAgICAgIHRoZW4gPSB0aGVuLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHRoZW4/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAob3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgb3RoZXJ3aXNlID0gb3RoZXJ3aXNlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChzdGF0aWNUeXBlICE9IG51bGwpIHsKICAgICAgc3RhdGljVHlwZSA9IHYudmlzaXREYXJ0VHlwZShzdGF0aWNUeXBlKTsKICAgIH0KICB9Cn0KCi8vLyBDb252ZXJ0IGV4cHJlc3Npb25zIHRvIHN0cmluZ3MgYW5kIGNvbmNhdGVuYXRlIHRoZW0uICBTZW1hbnRpY2FsbHksIGNhbGxzCi8vLyBgdG9TdHJpbmdgIG9uIGV2ZXJ5IGFyZ3VtZW50LCBjaGVja3MgdGhhdCBhIHN0cmluZyBpcyByZXR1cm5lZCwgYW5kIHJldHVybnMKLy8vIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCB0aGUgc3RyaW5ncy4KLy8vCi8vLyBJZiBbZXhwcmVzc2lvbnNdIGlzIGVtcHR5IHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgovLy8KLy8vIFRoZXNlIGFyaXNlIGZyb20gc3RyaW5nIGludGVycG9sYXRpb25zIGFuZCBhZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMuCmNsYXNzIFN0cmluZ0NvbmNhdGVuYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwoKICBTdHJpbmdDb25jYXRlbmF0aW9uKHRoaXMuZXhwcmVzc2lvbnMpIHsKICAgIHNldFBhcmVudHMoZXhwcmVzc2lvbnMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuc3RyaW5nUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChleHByZXNzaW9ucywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBDb25jYXRlbmF0ZSBsaXN0cyBpbnRvIGEgc2luZ2xlIGxpc3QuCi8vLwovLy8gSWYgW2xpc3RzXSBpcyBlbXB0eSB0aGVuIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCi8vLwovLy8gVGhlc2UgYXJpc2UgZnJvbSBzcHJlYWQgYW5kIGNvbnRyb2wtZmxvdyBlbGVtZW50cyBpbiBjb25zdCBsaXN0IGxpdGVyYWxzLgovLy8gVGhleSBhcmUgb25seSBwcmVzZW50IGJlZm9yZSBjb25zdGFudCBldmFsdWF0aW9uLCBvciB3aXRoaW4gdW5ldmFsdWF0ZWQKLy8vIGNvbnN0YW50cyBpbiBjb25zdGFudCBleHByZXNzaW9ucy4KY2xhc3MgTGlzdENvbmNhdGVuYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBsaXN0czsKCiAgTGlzdENvbmNhdGVuYXRpb24odGhpcy5saXN0cywge3RoaXMudHlwZUFyZ3VtZW50OiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgc2V0UGFyZW50cyhsaXN0cywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5saXN0VHlwZSh0eXBlQXJndW1lbnQsIGNvbnRleHQubm9uTnVsbGFibGUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdExpc3RDb25jYXRlbmF0aW9uKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRMaXN0Q29uY2F0ZW5hdGlvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QobGlzdHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpc3RzLCB2LCB0aGlzKTsKICB9Cn0KCi8vLyBDb25jYXRlbmF0ZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LgovLy8KLy8vIElmIFtzZXRzXSBpcyBlbXB0eSB0aGVuIGFuIGVtcHR5IHNldCBpcyByZXR1cm5lZC4KLy8vCi8vLyBUaGVzZSBhcmlzZSBmcm9tIHNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzIGluIGNvbnN0IHNldCBsaXRlcmFscy4KLy8vIFRoZXkgYXJlIG9ubHkgcHJlc2VudCBiZWZvcmUgY29uc3RhbnQgZXZhbHVhdGlvbiwgb3Igd2l0aGluIHVuZXZhbHVhdGVkCi8vLyBjb25zdGFudHMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCi8vLwovLy8gRHVwbGljYXRlZCB2YWx1ZXMgaW4gb3IgYWNyb3NzIHRoZSBzZXRzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsZS10aW1lIGVycm9yCi8vLyBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KY2xhc3MgU2V0Q29uY2F0ZW5hdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHNldHM7CgogIFNldENvbmNhdGVuYXRpb24odGhpcy5zZXRzLCB7dGhpcy50eXBlQXJndW1lbnQ6IGNvbnN0IER5bmFtaWNUeXBlKCl9KSB7CiAgICBzZXRQYXJlbnRzKHNldHMsIHRoaXMpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSB7CiAgICByZXR1cm4gY29udGV4dC50eXBlRW52aXJvbm1lbnQuc2V0VHlwZSh0eXBlQXJndW1lbnQsIGNvbnRleHQubm9uTnVsbGFibGUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFNldENvbmNhdGVuYXRpb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFNldENvbmNhdGVuYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGVBcmd1bWVudD8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KHNldHMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KHNldHMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIENvbmNhdGVuYXRlIG1hcHMgaW50byBhIHNpbmdsZSBtYXAuCi8vLwovLy8gSWYgW21hcHNdIGlzIGVtcHR5IHRoZW4gYW4gZW1wdHkgbWFwIGlzIHJldHVybmVkLgovLy8KLy8vIFRoZXNlIGFyaXNlIGZyb20gc3ByZWFkIGFuZCBjb250cm9sLWZsb3cgZWxlbWVudHMgaW4gY29uc3QgbWFwIGxpdGVyYWxzLgovLy8gVGhleSBhcmUgb25seSBwcmVzZW50IGJlZm9yZSBjb25zdGFudCBldmFsdWF0aW9uLCBvciB3aXRoaW4gdW5ldmFsdWF0ZWQKLy8vIGNvbnN0YW50cyBpbiBjb25zdGFudCBleHByZXNzaW9ucy4KLy8vCi8vLyBEdXBsaWNhdGVkIGtleXMgaW4gb3IgYWNyb3NzIHRoZSBtYXBzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsZS10aW1lIGVycm9yCi8vLyBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KY2xhc3MgTWFwQ29uY2F0ZW5hdGlvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIERhcnRUeXBlIGtleVR5cGU7CiAgRGFydFR5cGUgdmFsdWVUeXBlOwogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gbWFwczsKCiAgTWFwQ29uY2F0ZW5hdGlvbih0aGlzLm1hcHMsCiAgICAgIHt0aGlzLmtleVR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIHRoaXMudmFsdWVUeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgc2V0UGFyZW50cyhtYXBzLCB0aGlzKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50CiAgICAgICAgLm1hcFR5cGUoa2V5VHlwZSwgdmFsdWVUeXBlLCBjb250ZXh0Lm5vbk51bGxhYmxlKTsKICB9CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRNYXBDb25jYXRlbmF0aW9uKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRNYXBDb25jYXRlbmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBrZXlUeXBlPy5hY2NlcHQodik7CiAgICB2YWx1ZVR5cGU/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChtYXBzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGtleVR5cGUgPSB2LnZpc2l0RGFydFR5cGUoa2V5VHlwZSk7CiAgICB2YWx1ZVR5cGUgPSB2LnZpc2l0RGFydFR5cGUodmFsdWVUeXBlKTsKICAgIHRyYW5zZm9ybUxpc3QobWFwcywgdiwgdGhpcyk7CiAgfQp9CgovLy8gQ3JlYXRlIGFuIGluc3RhbmNlIGRpcmVjdGx5IGZyb20gdGhlIGZpZWxkIHZhbHVlcy4KLy8vCi8vLyBUaGVzZSBleHByZXNzaW9ucyBhcmlzZSBmcm9tIGNvbnN0IGNvbnN0cnVjdG9yIGNhbGxzIHdoZW4gb25lIG9yIG1vcmUgZmllbGQKLy8vIGluaXRpYWxpemluZyBleHByZXNzaW9ucywgZmllbGQgaW5pdGlhbGl6ZXJzLCBhc3NlcnQgaW5pdGlhbGl6ZXJzIG9yIHVudXNlZAovLy8gYXJndW1lbnRzIGNvbnRhaW4gdW5ldmFsdWF0ZWQgZXhwcmVzc2lvbnMuIFRoZXkgb25seSBldmVyIG9jY3VyIHdpdGhpbgovLy8gdW5ldmFsdWF0ZWQgY29uc3RhbnRzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLgpjbGFzcyBJbnN0YW5jZUNyZWF0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgZmluYWwgTWFwPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj4gZmllbGRWYWx1ZXM7CiAgZmluYWwgTGlzdDxBc3NlcnRTdGF0ZW1lbnQ+IGFzc2VydHM7CiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1bnVzZWRBcmd1bWVudHM7CgogIEluc3RhbmNlQ3JlYXRpb24odGhpcy5jbGFzc1JlZmVyZW5jZSwgdGhpcy50eXBlQXJndW1lbnRzLCB0aGlzLmZpZWxkVmFsdWVzLAogICAgICB0aGlzLmFzc2VydHMsIHRoaXMudW51c2VkQXJndW1lbnRzKSB7CiAgICBzZXRQYXJlbnRzKGZpZWxkVmFsdWVzLnZhbHVlcy50b0xpc3QoKSwgdGhpcyk7CiAgICBzZXRQYXJlbnRzKGFzc2VydHMsIHRoaXMpOwogICAgc2V0UGFyZW50cyh1bnVzZWRBcmd1bWVudHMsIHRoaXMpOwogIH0KCiAgQ2xhc3MgZ2V0IGNsYXNzTm9kZSA9PiBjbGFzc1JlZmVyZW5jZS5hc0NsYXNzOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiB0eXBlQXJndW1lbnRzLmlzRW1wdHkKICAgICAgICA/IGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcwogICAgICAgICAgICAucmF3VHlwZShjbGFzc05vZGUsIGNvbnRleHQubm9uTnVsbGFibGUpCiAgICAgICAgOiBuZXcgSW50ZXJmYWNlVHlwZShjbGFzc05vZGUsIGNvbnRleHQubm9uTnVsbGFibGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEluc3RhbmNlQ3JlYXRpb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdEluc3RhbmNlQ3JlYXRpb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNsYXNzUmVmZXJlbmNlLmFzQ2xhc3MuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogICAgZm9yIChmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlIGluIGZpZWxkVmFsdWVzLmtleXMpIHsKICAgICAgcmVmZXJlbmNlLmFzRmllbGQuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgfQogICAgZm9yIChmaW5hbCBFeHByZXNzaW9uIHZhbHVlIGluIGZpZWxkVmFsdWVzLnZhbHVlcykgewogICAgICB2YWx1ZS5hY2NlcHQodik7CiAgICB9CiAgICB2aXNpdExpc3QoYXNzZXJ0cywgdik7CiAgICB2aXNpdExpc3QodW51c2VkQXJndW1lbnRzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBFeHByZXNzaW9uIHRyYW5zZm9ybWVkID0gdmFsdWUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgaWYgKHRyYW5zZm9ybWVkICE9IG51bGwgJiYgIWlkZW50aWNhbCh2YWx1ZSwgdHJhbnNmb3JtZWQpKSB7CiAgICAgICAgZmllbGRWYWx1ZXNbZmllbGRSZWZdID0gdHJhbnNmb3JtZWQ7CiAgICAgICAgdHJhbnNmb3JtZWQucGFyZW50ID0gdGhpczsKICAgICAgfQogICAgfSk7CiAgICB0cmFuc2Zvcm1MaXN0KGFzc2VydHMsIHYsIHRoaXMpOwogICAgdHJhbnNmb3JtTGlzdCh1bnVzZWRBcmd1bWVudHMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIEEgbWFya2VyIGluZGljYXRpbmcgdGhhdCBhIHN1YmV4cHJlc3Npb24gb3JpZ2luYXRlcyBpbiBhIGRpZmZlcmVudCBzb3VyY2UKLy8vIGZpbGUgdGhhbiB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4KLy8vCi8vLyBUaGVzZSBleHByZXNzaW9ucyBhcmlzZSBmcm9tIGlubGluaW5nIG9mIGNvbnN0IHZhcmlhYmxlcyBkdXJpbmcgY29uc3RhbnQKLy8vIGV2YWx1YXRpb24uIFRoZXkgb25seSBldmVyIG9jY3VyIHdpdGhpbiB1bmV2YWx1YXRlZCBjb25zdGFudHMgaW4gY29uc3RhbnQKLy8vIGV4cHJlc3Npb25zLgpjbGFzcyBGaWxlVXJpRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBGaWxlVXJpTm9kZSB7CiAgLy8vIFRoZSBVUkkgb2YgdGhlIHNvdXJjZSBmaWxlIGluIHdoaWNoIHRoZSBzdWJleHByZXNzaW9uIGlzIGxvY2F0ZWQuCiAgLy8vIENhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBbRmlsZVVyaUV4cHJlc3Npb25dLgogIFVyaSBmaWxlVXJpOwoKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIEZpbGVVcmlFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5maWxlVXJpKSB7CiAgICBleHByZXNzaW9uLnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGV4cHJlc3Npb24uZ2V0U3RhdGljVHlwZShjb250ZXh0KTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEZpbGVVcmlFeHByZXNzaW9uKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRGaWxlVXJpRXhwcmVzc2lvbih0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbi5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpLi5wYXJlbnQgPSB0aGlzOwogIH0KCiAgTG9jYXRpb24gX2dldExvY2F0aW9uSW5FbmNsb3NpbmdGaWxlKGludCBvZmZzZXQpIHsKICAgIHJldHVybiBfZ2V0TG9jYXRpb25JbkNvbXBvbmVudChlbmNsb3NpbmdDb21wb25lbnQsIGZpbGVVcmksIG9mZnNldCk7CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4IGlzIFRgLgpjbGFzcyBJc0V4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBpbnQgZmxhZ3MgPSAwOwogIEV4cHJlc3Npb24gb3BlcmFuZDsKICBEYXJ0VHlwZSB0eXBlOwoKICBJc0V4cHJlc3Npb24odGhpcy5vcGVyYW5kLCB0aGlzLnR5cGUpIHsKICAgIG9wZXJhbmQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IDEgPDwgMDsKCiAgLy8vIElmIGB0cnVlYCwgdGhpcyB0ZXN0IHRha2UgdGhlIG51bGxhYmlsaXR5IG9mIFt0eXBlXSBpbnRvIGFjY291bnQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGlzLXRlc3RzIHdyaXR0ZW4gaW4gbGlicmFyaWVzIHRoYXQgYXJlIG9wdGVkIGluIHRvCiAgLy8vIHRoZSBub24gbnVsbGFibGUgYnkgZGVmYXVsdCBmZWF0dXJlLgogIGJvb2wgZ2V0IGlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPT4KICAgICAgZmxhZ3MgJiBGbGFnRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgIT0gMDsKCiAgdm9pZCBzZXQgaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnRm9yTm9uTnVsbGFibGVCeURlZmF1bHQpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0KTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmJvb2xSYXdUeXBlKGNvbnRleHQubm9uTnVsbGFibGUpOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SXNFeHByZXNzaW9uKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRJc0V4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG9wZXJhbmQ/LmFjY2VwdCh2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChvcGVyYW5kICE9IG51bGwpIHsKICAgICAgb3BlcmFuZCA9IG9wZXJhbmQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgfQp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGB4IGFzIFRgLgpjbGFzcyBBc0V4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBpbnQgZmxhZ3MgPSAwOwogIEV4cHJlc3Npb24gb3BlcmFuZDsKICBEYXJ0VHlwZSB0eXBlOwoKICBBc0V4cHJlc3Npb24odGhpcy5vcGVyYW5kLCB0aGlzLnR5cGUpIHsKICAgIG9wZXJhbmQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdUeXBlRXJyb3IgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnQ292YXJpYW5jZUNoZWNrID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZvckR5bmFtaWMgPSAxIDw8IDI7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSAxIDw8IDM7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoaXMgdGVzdCBpcyBhbiBpbXBsaWNpdCBkb3duIGNhc3QuCiAgLy8vCiAgLy8vIElmIGB0cnVlYCBhIFR5cGVFcnJvciBzaG91bGQgYmUgdGhyb3duLiBJZiBgZmFsc2VgIGEgQ2FzdEVycm9yIHNob3VsZCBiZQogIC8vLyB0aHJvd24uCiAgYm9vbCBnZXQgaXNUeXBlRXJyb3IgPT4gZmxhZ3MgJiBGbGFnVHlwZUVycm9yICE9IDA7CgogIHZvaWQgc2V0IGlzVHlwZUVycm9yKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUgPyAoZmxhZ3MgfCBGbGFnVHlwZUVycm9yKSA6IChmbGFncyAmIH5GbGFnVHlwZUVycm9yKTsKICB9CgogIC8vLyBJZiBgdHJ1ZWAsIHRoaXMgdGVzdCBpcyBuZWVkZWQgdG8gZW5zdXJlIHNvdW5kbmVzcyBvZiBjb3ZhcmlhbnQgdHlwZQogIC8vLyB2YXJpYWJsZXMgdXNpbmcgaW4gY29udHJhdmFyaWFudCBwb3NpdGlvbnMuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZQogIC8vLwogIC8vLyAgICBjbGFzcyBDbGFzczxUPiB7CiAgLy8vICAgICAgdm9pZCBGdW5jdGlvbihUKSBmaWVsZDsKICAvLy8gICAgICBDbGFzcyh0aGlzLmZpZWxkKTsKICAvLy8gICAgfQogIC8vLyAgICBtYWluKCkgewogIC8vLyAgICAgIENsYXNzPG51bT4gYyA9IG5ldyBDbGFzczxpbnQ+KChpbnQgaSkge30pOwogIC8vLyAgICAgIHZvaWQgRnVuY3Rpb248bnVtPiBmaWVsZCA9IGMuZmllbGQ7IC8vIENoZWNrIG5lZWRlZCBvbiBgYy5maWVsZGAKICAvLy8gICAgICBmaWVsZCgwLjUpOwogIC8vLyAgICB9CiAgLy8vCiAgLy8vIEhlcmUgYSBjb3ZhcmlhbnQgY2hlY2sgYGMuZmllbGQgYXMgdm9pZCBGdW5jdGlvbihudW0pYCBpcyBuZWVkZWQgYmVjYXVzZQogIC8vLyB0aGUgZmllbGQgY291bGQgYmUgKGFuZCBpbmRlZWQgaXMpIG5vdCBhIHN1YnR5cGUgb2YgdGhlIHN0YXRpYyB0eXBlIG9mCiAgLy8vIHRoZSBleHByZXNzaW9uLgogIGJvb2wgZ2V0IGlzQ292YXJpYW5jZUNoZWNrID0+IGZsYWdzICYgRmxhZ0NvdmFyaWFuY2VDaGVjayAhPSAwOwoKICB2b2lkIHNldCBpc0NvdmFyaWFuY2VDaGVjayhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9CiAgICAgICAgdmFsdWUgPyAoZmxhZ3MgfCBGbGFnQ292YXJpYW5jZUNoZWNrKSA6IChmbGFncyAmIH5GbGFnQ292YXJpYW5jZUNoZWNrKTsKICB9CgogIC8vLyBJZiBgdHJ1ZWAsIHRoaXMgaXMgYW4gaW1wbGljaXQgZG93biBjYXN0IGZyb20gYW4gZXhwcmVzc2lvbiBvZiB0eXBlCiAgLy8vIGBkeW5hbWljYC4KICBib29sIGdldCBpc0ZvckR5bmFtaWMgPT4gZmxhZ3MgJiBGbGFnRm9yRHluYW1pYyAhPSAwOwoKICB2b2lkIHNldCBpc0ZvckR5bmFtaWMoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdGb3JEeW5hbWljKSA6IChmbGFncyAmIH5GbGFnRm9yRHluYW1pYyk7CiAgfQoKICAvLy8gSWYgYHRydWVgLCB0aGlzIHRlc3QgdGFrZSB0aGUgbnVsbGFiaWxpdHkgb2YgW3R5cGVdIGludG8gYWNjb3VudC4KICAvLy8KICAvLy8gVGhpcyBpcyB0aGUgY2FzZSBmb3IgaXMtdGVzdHMgd3JpdHRlbiBpbiBsaWJyYXJpZXMgdGhhdCBhcmUgb3B0ZWQgaW4gdG8KICAvLy8gdGhlIG5vbiBudWxsYWJsZSBieSBkZWZhdWx0IGZlYXR1cmUuCiAgYm9vbCBnZXQgaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9PgogICAgICBmbGFncyAmIEZsYWdGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCAhPSAwOwoKICB2b2lkIHNldCBpc0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0KGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCkKICAgICAgICA6IChmbGFncyAmIH5GbGFnRm9yTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PiB0eXBlOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0QXNFeHByZXNzaW9uKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRBc0V4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIG9wZXJhbmQ/LmFjY2VwdCh2KTsKICAgIHR5cGU/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChvcGVyYW5kICE9IG51bGwpIHsKICAgICAgb3BlcmFuZCA9IG9wZXJhbmQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHR5cGUgPSB2LnZpc2l0RGFydFR5cGUodHlwZSk7CiAgfQp9CgovLy8gTnVsbCBjaGVjayBleHByZXNzaW9uIG9mIGZvcm0gYHghYC4KLy8vCi8vLyBUaGlzIGV4cHJlc3Npb24gd2FzIGFkZGVkIGFzIHBhcnQgb2YgTk5CRCBhbmQgaXMgY3VycmVudGx5IG9ubHkgY3JlYXRlZCB3aGVuCi8vLyB0aGUgJ25vbi1udWxsYWJsZScgZXhwZXJpbWVudGFsIGZlYXR1cmUgaXMgZW5hYmxlZC4KY2xhc3MgTnVsbENoZWNrIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRXhwcmVzc2lvbiBvcGVyYW5kOwoKICBOdWxsQ2hlY2sodGhpcy5vcGVyYW5kKSB7CiAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSB7CiAgICBEYXJ0VHlwZSBvcGVyYW5kVHlwZSA9IG9wZXJhbmQuZ2V0U3RhdGljVHlwZShjb250ZXh0KTsKICAgIHJldHVybiBvcGVyYW5kVHlwZSA9PSBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5udWxsVHlwZQogICAgICAgID8gY29uc3QgTmV2ZXJUeXBlKE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKQogICAgICAgIDogb3BlcmFuZFR5cGUud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICB9CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXROdWxsQ2hlY2sodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdE51bGxDaGVjayh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgb3BlcmFuZD8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKG9wZXJhbmQgIT0gbnVsbCkgewogICAgICBvcGVyYW5kID0gb3BlcmFuZC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBvcGVyYW5kPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEFuIGludGVnZXIsIGRvdWJsZSwgYm9vbGVhbiwgc3RyaW5nLCBvciBudWxsIGNvbnN0YW50LgphYnN0cmFjdCBjbGFzcyBCYXNpY0xpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBPYmplY3QgZ2V0IHZhbHVlOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBTdHJpbmdMaXRlcmFsIGV4dGVuZHMgQmFzaWNMaXRlcmFsIHsKICBTdHJpbmcgdmFsdWU7CgogIFN0cmluZ0xpdGVyYWwodGhpcy52YWx1ZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLnN0cmluZ1Jhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRTdHJpbmdMaXRlcmFsKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRTdHJpbmdMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBCYXNpY0xpdGVyYWwgewogIC8vLyBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBob2xkcyBhIHVpbnQ2NCB2YWx1ZS4KICAvLy8gRS5nLiAiMHg4MDAwMDAwMDAwMDAwMDAwIiB3aWxsIGJlIHNhdmVkIGFzICItOTIyMzM3MjAzNjg1NDc3NTgwOCIgZGVzcGl0ZQogIC8vLyB0ZWNobmljYWxseSAob24gc29tZSBwbGF0Zm9ybXMsIHBhcnRpY3VsYXJseSBKYXZhc2NyaXB0KSBiZWluZyBwb3NpdGl2ZS4KICAvLy8gSWYgdGhlIG51bWJlciBpcyBtZWFudCB0byBiZSBuZWdhdGl2ZSBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gYSAidW5hcnktIi4KICBpbnQgdmFsdWU7CgogIEludExpdGVyYWwodGhpcy52YWx1ZSk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmludFJhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRJbnRMaXRlcmFsKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRJbnRMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIERvdWJsZUxpdGVyYWwgZXh0ZW5kcyBCYXNpY0xpdGVyYWwgewogIGRvdWJsZSB2YWx1ZTsKCiAgRG91YmxlTGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuZG91YmxlUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdERvdWJsZUxpdGVyYWwodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdERvdWJsZUxpdGVyYWwodGhpcywgYXJnKTsKfQoKY2xhc3MgQm9vbExpdGVyYWwgZXh0ZW5kcyBCYXNpY0xpdGVyYWwgewogIGJvb2wgdmFsdWU7CgogIEJvb2xMaXRlcmFsKHRoaXMudmFsdWUpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5ib29sUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEJvb2xMaXRlcmFsKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRCb29sTGl0ZXJhbCh0aGlzLCBhcmcpOwp9CgpjbGFzcyBOdWxsTGl0ZXJhbCBleHRlbmRzIEJhc2ljTGl0ZXJhbCB7CiAgT2JqZWN0IGdldCB2YWx1ZSA9PiBudWxsOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50Lm51bGxUeXBlOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0TnVsbExpdGVyYWwodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdE51bGxMaXRlcmFsKHRoaXMsIGFyZyk7Cn0KCmNsYXNzIFN5bWJvbExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBTdHJpbmcgdmFsdWU7IC8vIEV2ZXJ5dGhpbmcgc3RyaWN0bHkgYWZ0ZXIgdGhlICcjJy4KCiAgU3ltYm9sTGl0ZXJhbCh0aGlzLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuc3ltYm9sUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN5bWJvbExpdGVyYWwodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFN5bWJvbExpdGVyYWwodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgVHlwZUxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSB0eXBlOwoKICBUeXBlTGl0ZXJhbCh0aGlzLnR5cGUpOwoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy50eXBlUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFR5cGVMaXRlcmFsKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRUeXBlTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICB9Cn0KCmNsYXNzIFRoaXNFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PiBjb250ZXh0LnRoaXNUeXBlOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VGhpc0V4cHJlc3Npb24odGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFRoaXNFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCmNsYXNzIFJldGhyb3cgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgICAgPyBjb25zdCBOZXZlclR5cGUoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpCiAgICAgICAgICA6IGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFJldGhyb3codGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFJldGhyb3codGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgVGhyb3cgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIFRocm93KHRoaXMuZXhwcmVzc2lvbikgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgY29udGV4dC5pc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgICA/IGNvbnN0IE5ldmVyVHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkKICAgICAgICAgIDogY29uc3QgQm90dG9tVHlwZSgpOwoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VGhyb3codGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4gdi52aXNpdFRocm93KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBMaXN0TGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewogIGJvb2wgaXNDb25zdDsKICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7IC8vIE5vdCBudWxsLCBkZWZhdWx0cyB0byBEeW5hbWljVHlwZS4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zOwoKICBMaXN0TGl0ZXJhbCh0aGlzLmV4cHJlc3Npb25zLAogICAgICB7dGhpcy50eXBlQXJndW1lbnQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50ICE9IG51bGwpOwogICAgc2V0UGFyZW50cyhleHByZXNzaW9ucywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5saXN0VHlwZSh0eXBlQXJndW1lbnQsIGNvbnRleHQubm9uTnVsbGFibGUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdExpc3RMaXRlcmFsKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRMaXN0TGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoZXhwcmVzc2lvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIFNldExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBib29sIGlzQ29uc3Q7CiAgRGFydFR5cGUgdHlwZUFyZ3VtZW50OyAvLyBOb3QgbnVsbCwgZGVmYXVsdHMgdG8gRHluYW1pY1R5cGUuCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9uczsKCiAgU2V0TGl0ZXJhbCh0aGlzLmV4cHJlc3Npb25zLAogICAgICB7dGhpcy50eXBlQXJndW1lbnQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMuaXNDb25zdDogZmFsc2V9KSB7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50ICE9IG51bGwpOwogICAgc2V0UGFyZW50cyhleHByZXNzaW9ucywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5zZXRUeXBlKHR5cGVBcmd1bWVudCwgY29udGV4dC5ub25OdWxsYWJsZSk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0U2V0TGl0ZXJhbCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0U2V0TGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50Py5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoZXhwcmVzc2lvbnMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgdHlwZUFyZ3VtZW50ID0gdi52aXNpdERhcnRUeXBlKHR5cGVBcmd1bWVudCk7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIE1hcExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBib29sIGlzQ29uc3Q7CiAgRGFydFR5cGUga2V5VHlwZTsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIERhcnRUeXBlIHZhbHVlVHlwZTsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIER5bmFtaWNUeXBlLgogIGZpbmFsIExpc3Q8TWFwRW50cnk+IGVudHJpZXM7CgogIE1hcExpdGVyYWwodGhpcy5lbnRyaWVzLAogICAgICB7dGhpcy5rZXlUeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICB0aGlzLnZhbHVlVHlwZTogY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgdGhpcy5pc0NvbnN0OiBmYWxzZX0pIHsKICAgIGFzc2VydChrZXlUeXBlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhbHVlVHlwZSAhPSBudWxsKTsKICAgIHNldFBhcmVudHMoZW50cmllcywgdGhpcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiBjb250ZXh0LnR5cGVFbnZpcm9ubWVudAogICAgICAgIC5tYXBUeXBlKGtleVR5cGUsIHZhbHVlVHlwZSwgY29udGV4dC5ub25OdWxsYWJsZSk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0TWFwTGl0ZXJhbCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0TWFwTGl0ZXJhbCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAga2V5VHlwZT8uYWNjZXB0KHYpOwogICAgdmFsdWVUeXBlPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QoZW50cmllcywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBrZXlUeXBlID0gdi52aXNpdERhcnRUeXBlKGtleVR5cGUpOwogICAgdmFsdWVUeXBlID0gdi52aXNpdERhcnRUeXBlKHZhbHVlVHlwZSk7CiAgICB0cmFuc2Zvcm1MaXN0KGVudHJpZXMsIHYsIHRoaXMpOwogIH0KfQoKY2xhc3MgTWFwRW50cnkgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgRXhwcmVzc2lvbiBrZXk7CiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgTWFwRW50cnkodGhpcy5rZXksIHRoaXMudmFsdWUpIHsKICAgIGtleT8ucGFyZW50ID0gdGhpczsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oVHJlZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdE1hcEVudHJ5KHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAga2V5Py5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGtleSAhPSBudWxsKSB7CiAgICAgIGtleSA9IGtleS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBrZXk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEV4cHJlc3Npb24gb2YgZm9ybSBgYXdhaXQgeGAuCmNsYXNzIEF3YWl0RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gb3BlcmFuZDsKCiAgQXdhaXRFeHByZXNzaW9uKHRoaXMub3BlcmFuZCkgewogICAgb3BlcmFuZD8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShvcGVyYW5kLmdldFN0YXRpY1R5cGUoY29udGV4dCkpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEF3YWl0RXhwcmVzc2lvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0QXdhaXRFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBvcGVyYW5kPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAob3BlcmFuZCAhPSBudWxsKSB7CiAgICAgIG9wZXJhbmQgPSBvcGVyYW5kLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIG9wZXJhbmQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQ29tbW9uIHN1cGVyLWludGVyZmFjZSBmb3IgW0Z1bmN0aW9uRXhwcmVzc2lvbl0gYW5kIFtGdW5jdGlvbkRlY2xhcmF0aW9uXS4KYWJzdHJhY3QgY2xhc3MgTG9jYWxGdW5jdGlvbiBpbXBsZW1lbnRzIFRyZWVOb2RlIHsKICBGdW5jdGlvbk5vZGUgZ2V0IGZ1bmN0aW9uOwp9CgovLy8gRXhwcmVzc2lvbiBvZiBmb3JtIGAoeCx5KSA9PiAuLi5gIG9yIGAoeCx5KSB7IC4uLiB9YAovLy8KLy8vIFRoZSBhcnJvdy1ib2R5IGZvcm0gYD0+IGVgIGlzIGRlc3VnYXJlZCBpbnRvIGByZXR1cm4gZTtgLgpjbGFzcyBGdW5jdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgTG9jYWxGdW5jdGlvbiB7CiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uOwoKICBGdW5jdGlvbkV4cHJlc3Npb24odGhpcy5mdW5jdGlvbikgewogICAgZnVuY3Rpb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiBmdW5jdGlvbi5jb21wdXRlRnVuY3Rpb25UeXBlKGNvbnRleHQubm9uTnVsbGFibGUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBmdW5jdGlvbj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgZnVuY3Rpb24gPSBmdW5jdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBmdW5jdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIENvbnN0YW50RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewogIENvbnN0YW50IGNvbnN0YW50OwogIERhcnRUeXBlIHR5cGU7CgogIENvbnN0YW50RXhwcmVzc2lvbih0aGlzLmNvbnN0YW50LCBbdGhpcy50eXBlID0gY29uc3QgRHluYW1pY1R5cGUoKV0pIHsKICAgIGFzc2VydChjb25zdGFudCAhPSBudWxsKTsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4gdHlwZTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdENvbnN0YW50RXhwcmVzc2lvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjb25zdGFudD8uYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdHlwZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgY29uc3RhbnQgPSB2LnZpc2l0Q29uc3RhbnQoY29uc3RhbnQpOwogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICB9Cn0KCi8vLyBTeW50aGV0aWMgZXhwcmVzc2lvbiBvZiBmb3JtIGBsZXQgdiA9IHggaW4geWAKY2xhc3MgTGV0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsgLy8gTXVzdCBoYXZlIGFuIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gYm9keTsKCiAgTGV0KHRoaXMudmFyaWFibGUsIHRoaXMuYm9keSkgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBib2R5LmdldFN0YXRpY1R5cGUoY29udGV4dCk7CgogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRMZXQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4gdi52aXNpdExldCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmFyaWFibGU/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBCbG9ja0V4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKICBCbG9jayBib2R5OwogIEV4cHJlc3Npb24gdmFsdWU7CgogIEJsb2NrRXhwcmVzc2lvbih0aGlzLmJvZHksIHRoaXMudmFsdWUpIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgdmFsdWUuZ2V0U3RhdGljVHlwZShjb250ZXh0KTsKCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEJsb2NrRXhwcmVzc2lvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oRXhwcmVzc2lvblZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0QmxvY2tFeHByZXNzaW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBdHRlbXB0IHRvIGxvYWQgdGhlIGxpYnJhcnkgcmVmZXJyZWQgdG8gYnkgYSBkZWZlcnJlZCBpbXBvcnQuCi8vLwovLy8gVGhpcyBpbnN0cnVjdGlvbiBpcyBjb25jZXJuZWQgd2l0aDoKLy8vIC0ga2VlcGluZyB0cmFjayB3aGV0aGVyIHRoZSBkZWZlcnJlZCBpbXBvcnQgaXMgbWFya2VkIGFzICdsb2FkZWQnCi8vLyAtIGtlZXBpbmcgdHJhY2sgb2Ygd2hldGhlciB0aGUgbGlicmFyeSBjb2RlIGhhcyBhbHJlYWR5IGJlZW4gZG93bmxvYWRlZAovLy8gLSBhY3R1YWxseSBkb3dubG9hZGluZyBhbmQgbGlua2luZyB0aGUgbGlicmFyeQovLy8KLy8vIFNob3VsZCByZXR1cm4gYSBmdXR1cmUuICBUaGUgdmFsdWUgaW4gdGhpcyBmdXR1cmUgd2lsbCBiZSB0aGUgc2FtZSB2YWx1ZQovLy8gc2VlbiBieSBjYWxsZXJzIG9mIGBsb2FkTGlicmFyeWAgZnVuY3Rpb25zLgovLy8KLy8vIE9uIGJhY2tlbmRzIHRoYXQgbGluayB0aGUgZW50aXJlIHByb2dyYW0gZWFnZXJseSwgdGhpcyBpbnN0cnVjdGlvbiBuZWVkcwovLy8gdG8gbWFyayB0aGUgZGVmZXJyZWQgaW1wb3J0IGFzICdsb2FkZWQnIGFuZCByZXR1cm4gYSBmdXR1cmUuCmNsYXNzIExvYWRMaWJyYXJ5IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLy8vIFJlZmVyZW5jZSB0byBhIGRlZmVycmVkIGltcG9ydCBpbiB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuCiAgTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0OwoKICBMb2FkTGlicmFyeSh0aGlzLmltcG9ydCk7CgogIERhcnRUeXBlIGdldFN0YXRpY1R5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgewogICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50CiAgICAgICAgLmZ1dHVyZVR5cGUoY29uc3QgRHluYW1pY1R5cGUoKSwgY29udGV4dC5ub25OdWxsYWJsZSk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0TG9hZExpYnJhcnkodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdExvYWRMaWJyYXJ5KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vLyBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gZGVmZXJyZWQgaW1wb3J0IGhhcyBiZWVuIG1hcmtlZCBhcyAnbG9hZGVkJy4KY2xhc3MgQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKICAvLy8gUmVmZXJlbmNlIHRvIGEgZGVmZXJyZWQgaW1wb3J0IGluIHRoZSBlbmNsb3NpbmcgbGlicmFyeS4KICBMaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnQ7CgogIENoZWNrTGlicmFyeUlzTG9hZGVkKHRoaXMuaW1wb3J0KTsKCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSB7CiAgICByZXR1cm4gY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLm9iamVjdFJhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7CiAgfQoKICBSIGFjY2VwdDxSPihFeHByZXNzaW9uVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0Q2hlY2tMaWJyYXJ5SXNMb2FkZWQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KEV4cHJlc3Npb25WaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHt9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFTUVOVFMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpOwp9CgpjbGFzcyBFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcy5leHByZXNzaW9uKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBCbG9jayBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CgogIEJsb2NrKHRoaXMuc3RhdGVtZW50cykgewogICAgLy8gRW5zdXJlIHN0YXRlbWVudHMgaXMgbXV0YWJsZS4KICAgIGFzc2VydCgoc3RhdGVtZW50cwogICAgICAgICAgLi5hZGQobnVsbCkKICAgICAgICAgIC4ucmVtb3ZlTGFzdCgpKSAhPQogICAgICAgIG51bGwpOwogICAgc2V0UGFyZW50cyhzdGF0ZW1lbnRzLCB0aGlzKTsKICB9CgogIFIgYWNjZXB0PFI+KFN0YXRlbWVudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEJsb2NrKHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihTdGF0ZW1lbnRWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4gdi52aXNpdEJsb2NrKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3Qoc3RhdGVtZW50cywgdik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHN0YXRlbWVudHMsIHYsIHRoaXMpOwogIH0KCiAgdm9pZCBhZGRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0YXRlbWVudHMuYWRkKG5vZGUpOwogICAgbm9kZS5wYXJlbnQgPSB0aGlzOwogIH0KfQoKLy8vIEEgYmxvY2sgdGhhdCBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gYXNzZXJ0cyBhcmUgZW5hYmxlZC4KLy8vCi8vLyBTb21ldGltZXMgYXJiaXRyYXJ5IHN0YXRlbWVudHMgbXVzdCBiZSBndWFyZGVkIGJ5IHdoZXRoZXIgYXNzZXJ0cyBhcmUKLy8vIGVuYWJsZWQuICBGb3IgZXhhbXBsZSwgd2hlbiBhIHN1YmV4cHJlc3Npb24gb2YgYW4gYXNzZXJ0IGluIGFzeW5jIGNvZGUgaXMKLy8vIGxpbmVhcml6ZWQgYW5kIG5hbWVkLCBpdCBjYW4gcHJvZHVjZSBzdWNoIGEgYmxvY2sgb2Ygc3RhdGVtZW50cy4KY2xhc3MgQXNzZXJ0QmxvY2sgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzOwoKICBBc3NlcnRCbG9jayh0aGlzLnN0YXRlbWVudHMpIHsKICAgIC8vIEVuc3VyZSBzdGF0ZW1lbnRzIGlzIG11dGFibGUuCiAgICBhc3NlcnQoKHN0YXRlbWVudHMKICAgICAgICAgIC4uYWRkKG51bGwpCiAgICAgICAgICAuLnJlbW92ZUxhc3QoKSkgIT0KICAgICAgICBudWxsKTsKICAgIHNldFBhcmVudHMoc3RhdGVtZW50cywgdGhpcyk7CiAgfQoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRBc3NlcnRCbG9jayh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRBc3NlcnRCbG9jayh0aGlzLCBhcmcpOwoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHN0YXRlbWVudHMsIHYsIHRoaXMpOwogIH0KCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChzdGF0ZW1lbnRzLCB2KTsKICB9CgogIHZvaWQgYWRkU3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICBzdGF0ZW1lbnRzLmFkZChub2RlKTsKICAgIG5vZGUucGFyZW50ID0gdGhpczsKICB9Cn0KCmNsYXNzIEVtcHR5U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRFbXB0eVN0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRFbXB0eVN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBBc3NlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gY29uZGl0aW9uOwogIEV4cHJlc3Npb24gbWVzc2FnZTsgLy8gTWF5IGJlIG51bGwuCgogIC8vLyBDaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSBzb3VyY2Ugd2hlcmUgdGhlIGFzc2VydGlvbiBjb25kaXRpb24gYmVnaW5zLgogIC8vLwogIC8vLyBOb3RlOiBUaGlzIGlzIG5vdCB0aGUgb2Zmc2V0IGludG8gdGhlIFVURjggZW5jb2RlZCBgTGlzdDxpbnQ+YCBzb3VyY2UuCiAgaW50IGNvbmRpdGlvblN0YXJ0T2Zmc2V0OwoKICAvLy8gQ2hhcmFjdGVyIG9mZnNldCBpbiB0aGUgc291cmNlIHdoZXJlIHRoZSBhc3NlcnRpb24gY29uZGl0aW9uIGVuZHMuCiAgLy8vCiAgLy8vIE5vdGU6IFRoaXMgaXMgbm90IHRoZSBvZmZzZXQgaW50byB0aGUgVVRGOCBlbmNvZGVkIGBMaXN0PGludD5gIHNvdXJjZS4KICBpbnQgY29uZGl0aW9uRW5kT2Zmc2V0OwoKICBBc3NlcnRTdGF0ZW1lbnQodGhpcy5jb25kaXRpb24sCiAgICAgIHt0aGlzLm1lc3NhZ2UsIHRoaXMuY29uZGl0aW9uU3RhcnRPZmZzZXQsIHRoaXMuY29uZGl0aW9uRW5kT2Zmc2V0fSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgbWVzc2FnZT8ucGFyZW50ID0gdGhpczsKICB9CgogIFIgYWNjZXB0PFI+KFN0YXRlbWVudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEFzc2VydFN0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRBc3NlcnRTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgbWVzc2FnZT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIG1lc3NhZ2U/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQSB0YXJnZXQgb2YgYSBbQnJlYWtdIHN0YXRlbWVudC4KLy8vCi8vLyBUaGUgbGFiZWwgaXRzZWxmIGhhcyBubyBuYW1lOyBicmVha3MgcmVmZXJlbmNlIHRoZSBzdGF0ZW1lbnQgZGlyZWN0bHkuCi8vLwovLy8gVGhlIGZyb250ZW5kIGRvZXMgbm90IGdlbmVyYXRlIGxhYmVsZWQgc3RhdGVtZW50cyB3aXRob3V0IHVzZXMuCmNsYXNzIExhYmVsZWRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIFN0YXRlbWVudCBib2R5OwoKICBMYWJlbGVkU3RhdGVtZW50KHRoaXMuYm9keSkgewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIFIgYWNjZXB0PFI+KFN0YXRlbWVudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdExhYmVsZWRTdGF0ZW1lbnQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KFN0YXRlbWVudFZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0TGFiZWxlZFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEJyZWFrcyBvdXQgb2YgYW4gZW5jbG9zaW5nIFtMYWJlbGVkU3RhdGVtZW50XS4KLy8vCi8vLyBCb3RoIGBicmVha2AgYW5kIGxvb3AgYGNvbnRpbnVlYCBzdGF0ZW1lbnRzIGFyZSB0cmFuc2xhdGVkIGludG8gdGhpcyBub2RlLgovLy8KLy8vIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGxvb3Agd2l0aCBhIGBjb250aW51ZWAgd2lsbCBiZSBkZXN1Z2FyZWQ6Ci8vLwovLy8gICAgIHdoaWxlKHgpIHsKLy8vICAgICAgIGlmICh5KSBjb250aW51ZTsKLy8vICAgICAgIEJPRFknCi8vLyAgICAgfQovLy8KLy8vICAgICA9PT4KLy8vCi8vLyAgICAgd2hpbGUoeCkgewovLy8gICAgICAgTDogewovLy8gICAgICAgICBpZiAoeSkgYnJlYWsgTDsKLy8vICAgICAgICAgQk9EWScKLy8vICAgICAgIH0KLy8vICAgICB9Ci8vCmNsYXNzIEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBMYWJlbGVkU3RhdGVtZW50IHRhcmdldDsKCiAgQnJlYWtTdGF0ZW1lbnQodGhpcy50YXJnZXQpOwoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRCcmVha1N0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRCcmVha1N0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7fQp9CgpjbGFzcyBXaGlsZVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgRXhwcmVzc2lvbiBjb25kaXRpb247CiAgU3RhdGVtZW50IGJvZHk7CgogIFdoaWxlU3RhdGVtZW50KHRoaXMuY29uZGl0aW9uLCB0aGlzLmJvZHkpIHsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRXaGlsZVN0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRXaGlsZVN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIERvU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgYm9keTsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKCiAgRG9TdGF0ZW1lbnQodGhpcy5ib2R5LCB0aGlzLmNvbmRpdGlvbikgewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICB9CgogIFIgYWNjZXB0PFI+KFN0YXRlbWVudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdERvU3RhdGVtZW50KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihTdGF0ZW1lbnRWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdERvU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgRm9yU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlczsgLy8gTWF5IGJlIGVtcHR5LCBidXQgbm90IG51bGwuCiAgRXhwcmVzc2lvbiBjb25kaXRpb247IC8vIE1heSBiZSBudWxsLgogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlczsgLy8gTWF5IGJlIGVtcHR5LCBidXQgbm90IG51bGwuCiAgU3RhdGVtZW50IGJvZHk7CgogIEZvclN0YXRlbWVudCh0aGlzLnZhcmlhYmxlcywgdGhpcy5jb25kaXRpb24sIHRoaXMudXBkYXRlcywgdGhpcy5ib2R5KSB7CiAgICBzZXRQYXJlbnRzKHZhcmlhYmxlcywgdGhpcyk7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKHVwZGF0ZXMsIHRoaXMpOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIFIgYWNjZXB0PFI+KFN0YXRlbWVudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEZvclN0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRGb3JTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdCh2YXJpYWJsZXMsIHYpOwogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QodXBkYXRlcywgdik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHZhcmlhYmxlcywgdiwgdGhpcyk7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QodXBkYXRlcywgdiwgdGhpcyk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBGb3JJblN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgLy8vIE9mZnNldCBpbiB0aGUgc291cmNlIGZpbGUgaXQgY29tZXMgZnJvbS4KICAvLy8KICAvLy8gVmFsaWQgdmFsdWVzIGFyZSBmcm9tIDAgYW5kIHVwLCBvciAtMSAoW1RyZWVOb2RlLm5vT2Zmc2V0XSkgaWYgdGhlIGZpbGUKICAvLy8gb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZSBpcyBzcGVjaWZpY2FsbHkgc2V0KS4KICBpbnQgYm9keU9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBIYXMgbm8gaW5pdGlhbGl6ZXIuCiAgRXhwcmVzc2lvbiBpdGVyYWJsZTsKICBTdGF0ZW1lbnQgYm9keTsKICBib29sIGlzQXN5bmM7IC8vIFRydWUgaWYgdGhpcyBpcyBhbiAnYXdhaXQgZm9yJyBsb29wLgoKICBGb3JJblN0YXRlbWVudCh0aGlzLnZhcmlhYmxlLCB0aGlzLml0ZXJhYmxlLCB0aGlzLmJvZHksCiAgICAgIHt0aGlzLmlzQXN5bmM6IGZhbHNlfSkgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRGb3JJblN0YXRlbWVudCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRGb3JJblN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgaXRlcmFibGU/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChpdGVyYWJsZSAhPSBudWxsKSB7CiAgICAgIGl0ZXJhYmxlID0gaXRlcmFibGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgaXRlcmFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gU3RhdGVtZW50IG9mIGZvcm0gYHN3aXRjaCAoZSkgeyBjYXNlIHg6IC4uLiB9YC4KLy8vCi8vLyBBZGphY2VudCBjYXNlIGNsYXVzZXMgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlIFtTd2l0Y2hDYXNlXS4gQSBydW50aW1lCi8vLyBleGNlcHRpb24gbXVzdCBiZSB0aHJvd24gaWYgb25lIFtTd2l0Y2hDYXNlXSBmYWxscyB0aHJvdWdoIHRvIGFub3RoZXIgY2FzZS4KY2xhc3MgU3dpdGNoU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgZmluYWwgTGlzdDxTd2l0Y2hDYXNlPiBjYXNlczsKCiAgU3dpdGNoU3RhdGVtZW50KHRoaXMuZXhwcmVzc2lvbiwgdGhpcy5jYXNlcykgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHMoY2FzZXMsIHRoaXMpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0U3dpdGNoU3RhdGVtZW50KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihTdGF0ZW1lbnRWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFN3aXRjaFN0YXRlbWVudCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGNhc2VzLCB2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QoY2FzZXMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIEEgZ3JvdXAgb2YgYGNhc2VgIGNsYXVzZXMgYW5kL29yIGEgYGRlZmF1bHRgIGNsYXVzZS4KLy8vCi8vLyBUaGlzIGlzIGEgcG90ZW50aWFsIHRhcmdldCBvZiBbQ29udGludWVTd2l0Y2hTdGF0ZW1lbnRdLgpjbGFzcyBTd2l0Y2hDYXNlIGV4dGVuZHMgVHJlZU5vZGUgewogIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnM7CiAgZmluYWwgTGlzdDxpbnQ+IGV4cHJlc3Npb25PZmZzZXRzOwogIFN0YXRlbWVudCBib2R5OwogIGJvb2wgaXNEZWZhdWx0OwoKICBTd2l0Y2hDYXNlKHRoaXMuZXhwcmVzc2lvbnMsIHRoaXMuZXhwcmVzc2lvbk9mZnNldHMsIHRoaXMuYm9keSwKICAgICAge3RoaXMuaXNEZWZhdWx0OiBmYWxzZX0pIHsKICAgIHNldFBhcmVudHMoZXhwcmVzc2lvbnMsIHRoaXMpOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIFN3aXRjaENhc2UuZGVmYXVsdENhc2UodGhpcy5ib2R5KQogICAgICA6IGlzRGVmYXVsdCA9IHRydWUsCiAgICAgICAgZXhwcmVzc2lvbnMgPSA8RXhwcmVzc2lvbj5bXSwKICAgICAgICBleHByZXNzaW9uT2Zmc2V0cyA9IDxpbnQ+W10gewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIFN3aXRjaENhc2UuZW1wdHkoKQogICAgICA6IGV4cHJlc3Npb25zID0gPEV4cHJlc3Npb24+W10sCiAgICAgICAgZXhwcmVzc2lvbk9mZnNldHMgPSA8aW50PltdLAogICAgICAgIGJvZHkgPSBudWxsLAogICAgICAgIGlzRGVmYXVsdCA9IGZhbHNlOwoKICBSIGFjY2VwdDxSPihUcmVlVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0U3dpdGNoQ2FzZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHZpc2l0TGlzdChleHByZXNzaW9ucywgdik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGV4cHJlc3Npb25zLCB2LCB0aGlzKTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBKdW1wIHRvIGEgY2FzZSBpbiBhbiBlbmNsb3Npbmcgc3dpdGNoLgpjbGFzcyBDb250aW51ZVN3aXRjaFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgU3dpdGNoQ2FzZSB0YXJnZXQ7CgogIENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KHRoaXMudGFyZ2V0KTsKCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KFN0YXRlbWVudFZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikge30KfQoKY2xhc3MgSWZTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIEV4cHJlc3Npb24gY29uZGl0aW9uOwogIFN0YXRlbWVudCB0aGVuOwogIFN0YXRlbWVudCBvdGhlcndpc2U7CgogIElmU3RhdGVtZW50KHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlKSB7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SWZTdGF0ZW1lbnQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KFN0YXRlbWVudFZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0SWZTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdGhlbj8uYWNjZXB0KHYpOwogICAgb3RoZXJ3aXNlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh0aGVuICE9IG51bGwpIHsKICAgICAgdGhlbiA9IHRoZW4uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChvdGhlcndpc2UgIT0gbnVsbCkgewogICAgICBvdGhlcndpc2UgPSBvdGhlcndpc2UuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKY2xhc3MgUmV0dXJuU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247IC8vIE1heSBiZSBudWxsLgoKICBSZXR1cm5TdGF0ZW1lbnQoW3RoaXMuZXhwcmVzc2lvbl0pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRSZXR1cm5TdGF0ZW1lbnQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KFN0YXRlbWVudFZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0UmV0dXJuU3RhdGVtZW50KHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBUcnlDYXRjaCBleHRlbmRzIFN0YXRlbWVudCB7CiAgU3RhdGVtZW50IGJvZHk7CiAgTGlzdDxDYXRjaD4gY2F0Y2hlczsKICBib29sIGlzU3ludGhldGljOwoKICBUcnlDYXRjaCh0aGlzLmJvZHksIHRoaXMuY2F0Y2hlcywge3RoaXMuaXNTeW50aGV0aWM6IGZhbHNlfSkgewogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHMoY2F0Y2hlcywgdGhpcyk7CiAgfQoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRUcnlDYXRjaCh0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRUcnlDYXRjaCh0aGlzLCBhcmcpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgYm9keT8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGNhdGNoZXMsIHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtTGlzdChjYXRjaGVzLCB2LCB0aGlzKTsKICB9Cn0KCmNsYXNzIENhdGNoIGV4dGVuZHMgVHJlZU5vZGUgewogIERhcnRUeXBlIGd1YXJkOyAvLyBOb3QgbnVsbCwgZGVmYXVsdHMgdG8gZHluYW1pYy4KICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvbjsgLy8gTWF5IGJlIG51bGwuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBzdGFja1RyYWNlOyAvLyBNYXkgYmUgbnVsbC4KICBTdGF0ZW1lbnQgYm9keTsKCiAgQ2F0Y2godGhpcy5leGNlcHRpb24sIHRoaXMuYm9keSwKICAgICAge3RoaXMuZ3VhcmQ6IGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMuc3RhY2tUcmFjZX0pIHsKICAgIGFzc2VydChndWFyZCAhPSBudWxsKTsKICAgIGV4Y2VwdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHN0YWNrVHJhY2U/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oVHJlZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdENhdGNoKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgZ3VhcmQ/LmFjY2VwdCh2KTsKICAgIGV4Y2VwdGlvbj8uYWNjZXB0KHYpOwogICAgc3RhY2tUcmFjZT8uYWNjZXB0KHYpOwogICAgYm9keT8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgZ3VhcmQgPSB2LnZpc2l0RGFydFR5cGUoZ3VhcmQpOwogICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CiAgICAgIGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBleGNlcHRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoc3RhY2tUcmFjZSAhPSBudWxsKSB7CiAgICAgIHN0YWNrVHJhY2UgPSBzdGFja1RyYWNlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHN0YWNrVHJhY2U/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBUcnlGaW5hbGx5IGV4dGVuZHMgU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgYm9keTsKICBTdGF0ZW1lbnQgZmluYWxpemVyOwoKICBUcnlGaW5hbGx5KHRoaXMuYm9keSwgdGhpcy5maW5hbGl6ZXIpIHsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBmaW5hbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBSIGFjY2VwdDxSPihTdGF0ZW1lbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRUcnlGaW5hbGx5KHRoaXMpOwogIFIgYWNjZXB0MTxSLCBBPihTdGF0ZW1lbnRWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFRyeUZpbmFsbHkodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICAgIGZpbmFsaXplcj8uYWNjZXB0KHYpOwogIH0KCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGJvZHkgIT0gbnVsbCkgewogICAgICBib2R5ID0gYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGZpbmFsaXplciAhPSBudWxsKSB7CiAgICAgIGZpbmFsaXplciA9IGZpbmFsaXplci5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBmaW5hbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gU3RhdGVtZW50IG9mIGZvcm0gYHlpZWxkIHhgIG9yIGB5aWVsZCogeGAuCi8vLwovLy8gRm9yIG5hdGl2ZSB5aWVsZCBzZW1hbnRpY3Mgc2VlIGBBc3luY01hcmtlci5TeW5jWWllbGRpbmdgLgpjbGFzcyBZaWVsZFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGludCBmbGFncyA9IDA7CgogIFlpZWxkU3RhdGVtZW50KHRoaXMuZXhwcmVzc2lvbiwKICAgICAge2Jvb2wgaXNZaWVsZFN0YXI6IGZhbHNlLCBib29sIGlzTmF0aXZlOiBmYWxzZX0pIHsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB0aGlzLmlzWWllbGRTdGFyID0gaXNZaWVsZFN0YXI7CiAgICB0aGlzLmlzTmF0aXZlID0gaXNOYXRpdmU7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IEZsYWdZaWVsZFN0YXIgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnTmF0aXZlID0gMSA8PCAxOwoKICBib29sIGdldCBpc1lpZWxkU3RhciA9PiBmbGFncyAmIEZsYWdZaWVsZFN0YXIgIT0gMDsKICBib29sIGdldCBpc05hdGl2ZSA9PiBmbGFncyAmIEZsYWdOYXRpdmUgIT0gMDsKCiAgdm9pZCBzZXQgaXNZaWVsZFN0YXIoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdZaWVsZFN0YXIpIDogKGZsYWdzICYgfkZsYWdZaWVsZFN0YXIpOwogIH0KCiAgdm9pZCBzZXQgaXNOYXRpdmUoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdOYXRpdmUpIDogKGZsYWdzICYgfkZsYWdOYXRpdmUpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0WWllbGRTdGF0ZW1lbnQodGhpcyk7CiAgUiBhY2NlcHQxPFIsIEE+KFN0YXRlbWVudFZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0WWllbGRTdGF0ZW1lbnQodGhpcywgYXJnKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBEZWNsYXJhdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlLgovLy8KLy8vIFRoaXMgbWF5IG9jY3VyIGFzIGEgc3RhdGVtZW50LCBidXQgaXMgYWxzbyB1c2VkIGluIHNldmVyYWwgbm9uLXN0YXRlbWVudAovLy8gY29udGV4dHMsIHN1Y2ggYXMgaW4gW0ZvclN0YXRlbWVudF0sIFtDYXRjaF0sIGFuZCBbRnVuY3Rpb25Ob2RlXS4KLy8vCi8vLyBXaGVuIHRoaXMgb2NjdXJzIGFzIGEgc3RhdGVtZW50LCBpdCBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGEgW0Jsb2NrXS4KLy8KLy8gREVTSUdOIFRPRE86IFNob3VsZCB3ZSByZW1vdmUgdGhlICdmaW5hbCcgbW9kaWZpZXIgZnJvbSB2YXJpYWJsZXM/CmNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgewogIC8vLyBPZmZzZXQgb2YgdGhlIGVxdWFscyBzaWduIGluIHRoZSBzb3VyY2UgZmlsZSBpdCBjb21lcyBmcm9tLgogIC8vLwogIC8vLyBWYWxpZCB2YWx1ZXMgYXJlIGZyb20gMCBhbmQgdXAsIG9yIC0xIChbVHJlZU5vZGUubm9PZmZzZXRdKQogIC8vLyBpZiB0aGUgZXF1YWxzIHNpZ24gb2Zmc2V0IGlzIG5vdCBhdmFpbGFibGUgKGUuZy4gaWYgbm90IGluaXRpYWxpemVkKQogIC8vLyAodGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBub25lIGlzIHNwZWNpZmljYWxseSBzZXQpLgogIGludCBmaWxlRXF1YWxzT2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQ7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgLy8vIEZvciBuYW1lZCBwYXJhbWV0ZXJzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuIE5vIHR3byBuYW1lZAogIC8vLyBwYXJhbWV0ZXJzIChpbiB0aGUgc2FtZSBwYXJhbWV0ZXIgbGlzdCkgY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4KICAvLy8KICAvLy8gSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgbmFtZSBpcyBjb3NtZXRpYywgbWF5IGJlIGVtcHR5IG9yIG51bGwsCiAgLy8vIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgdW5pcXVlLgogIFN0cmluZyBuYW1lOwogIGludCBmbGFncyA9IDA7CiAgRGFydFR5cGUgdHlwZTsgLy8gTm90IG51bGwsIGRlZmF1bHRzIHRvIGR5bmFtaWMuCgogIC8vLyBPZmZzZXQgb2YgdGhlIGRlY2xhcmF0aW9uLCBzZXQgYW5kIHVzZWQgd2hlbiB3cml0aW5nIHRoZSBiaW5hcnkuCiAgaW50IGJpbmFyeU9mZnNldE5vVGFnID0gLTE7CgogIC8vLyBGb3IgbG9jYWxzLCB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlLgogIC8vLyBGb3IgcGFyYW1ldGVycywgdGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KICAvLy8KICAvLy8gU2hvdWxkIGJlIG51bGwgaW4gb3RoZXIgY2FzZXMuCiAgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8gTWF5IGJlIG51bGwuCgogIFZhcmlhYmxlRGVjbGFyYXRpb24odGhpcy5uYW1lLAogICAgICB7dGhpcy5pbml0aWFsaXplciwKICAgICAgdGhpcy50eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICBpbnQgZmxhZ3M6IC0xLAogICAgICBib29sIGlzRmluYWw6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzRmllbGRGb3JtYWw6IGZhbHNlLAogICAgICBib29sIGlzQ292YXJpYW50OiBmYWxzZSwKICAgICAgYm9vbCBpc0xhdGU6IGZhbHNlLAogICAgICBib29sIGlzUmVxdWlyZWQ6IGZhbHNlfSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICBpbml0aWFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIGlmIChmbGFncyAhPSAtMSkgewogICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzRmluYWwgPSBpc0ZpbmFsOwogICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgICB0aGlzLmlzRmllbGRGb3JtYWwgPSBpc0ZpZWxkRm9ybWFsOwogICAgICB0aGlzLmlzQ292YXJpYW50ID0gaXNDb3ZhcmlhbnQ7CiAgICAgIHRoaXMuaXNMYXRlID0gaXNMYXRlOwogICAgICB0aGlzLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkOwogICAgfQogIH0KCiAgLy8vIENyZWF0ZXMgYSBzeW50aGV0aWMgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBpbml0aWFsaXplci4KICBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHRoaXMuaW5pdGlhbGl6ZXIsCiAgICAgIHtib29sIGlzRmluYWw6IHRydWUsCiAgICAgIGJvb2wgaXNDb25zdDogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZEZvcm1hbDogZmFsc2UsCiAgICAgIGJvb2wgaXNMYXRlOiBmYWxzZSwKICAgICAgYm9vbCBpc1JlcXVpcmVkOiBmYWxzZSwKICAgICAgdGhpcy50eXBlOiBjb25zdCBEeW5hbWljVHlwZSgpfSkgewogICAgYXNzZXJ0KHR5cGUgIT0gbnVsbCk7CiAgICBpbml0aWFsaXplcj8ucGFyZW50ID0gdGhpczsKICAgIHRoaXMuaXNGaW5hbCA9IGlzRmluYWw7CiAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwogICAgdGhpcy5pc0ZpZWxkRm9ybWFsID0gaXNGaWVsZEZvcm1hbDsKICAgIHRoaXMuaXNMYXRlID0gaXNMYXRlOwogICAgdGhpcy5pc1JlcXVpcmVkID0gaXNSZXF1aXJlZDsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ0ZpbmFsID0gMSA8PCAwOyAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb25zdCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdGaWVsZEZvcm1hbCA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdDb3ZhcmlhbnQgPSAxIDw8IDM7CiAgc3RhdGljIGNvbnN0IGludCBGbGFnSW5TY29wZSA9IDEgPDwgNDsgLy8gVGVtcG9yYXJ5IGZsYWcgdXNlZCBieSB2ZXJpZmllci4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCA9IDEgPDwgNTsKICBzdGF0aWMgY29uc3QgaW50IEZsYWdMYXRlID0gMSA8PCA2OwogIHN0YXRpYyBjb25zdCBpbnQgRmxhZ1JlcXVpcmVkID0gMSA8PCA3OwoKICBib29sIGdldCBpc0ZpbmFsID0+IGZsYWdzICYgRmxhZ0ZpbmFsICE9IDA7CiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmbGFncyAmIEZsYWdDb25zdCAhPSAwOwoKICAvLy8gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHdpdGggdGhlIGBjb3ZhcmlhbnRgIGtleXdvcmQuCiAgYm9vbCBnZXQgaXNDb3ZhcmlhbnQgPT4gZmxhZ3MgJiBGbGFnQ292YXJpYW50ICE9IDA7CgogIC8vLyBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBhcyBhIGZpZWxkIGZvcm1hbCBwYXJhbWV0ZXIgb2YKICAvLy8gYSBjb25zdHJ1Y3Rvci4KICBAaW5mb3JtYXRpdmUKICBib29sIGdldCBpc0ZpZWxkRm9ybWFsID0+IGZsYWdzICYgRmxhZ0ZpZWxkRm9ybWFsICE9IDA7CgogIC8vLyBJZiB0aGlzIFtWYXJpYWJsZURlY2xhcmF0aW9uXSBpcyBhIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW5kaWNhdGVzCiAgLy8vIHdoZXRoZXIgdGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjb250YWluIGEgcnVudGltZSB0eXBlIGNoZWNrIHRvCiAgLy8vIGRlYWwgd2l0aCBnZW5lcmljIGNvdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFdoZW4gYHRydWVgLCBydW50aW1lIGNoZWNrcyBtYXkgbmVlZCB0byBiZSBwZXJmb3JtZWQ7IHNlZQogIC8vLyBbRGlzcGF0Y2hDYXRlZ29yeV0gZm9yIGRldGFpbHMuCiAgYm9vbCBnZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9PiBmbGFncyAmIEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCAhPSAwOwoKICAvLy8gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgd2l0aCB0aGUgYGxhdGVgIGtleXdvcmQuCiAgLy8vCiAgLy8vIFRoZSBgbGF0ZWAgbW9kaWZpZXIgaXMgb25seSBzdXBwb3J0ZWQgb24gbG9jYWwgdmFyaWFibGVzIGFuZCBub3Qgb24KICAvLy8gcGFyYW1ldGVycy4KICBib29sIGdldCBpc0xhdGUgPT4gZmxhZ3MgJiBGbGFnTGF0ZSAhPSAwOwoKICAvLy8gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHdpdGggdGhlIGByZXF1aXJlZGAga2V5d29yZC4KICAvLy8KICAvLy8gVGhlIGByZXF1aXJlZGAgbW9kaWZpZXIgaXMgb25seSBzdXBwb3J0ZWQgb24gbmFtZWQgcGFyYW1ldGVycyBhbmQgbm90IG9uCiAgLy8vIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhbmQgbG9jYWwgdmFyaWFibGVzLgogIGJvb2wgZ2V0IGlzUmVxdWlyZWQgPT4gZmxhZ3MgJiBGbGFnUmVxdWlyZWQgIT0gMDsKCiAgLy8vIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGFzc2lnbmFibGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYHRydWVgIGlmIHRoZSB2YXJpYWJsZSBpcyBuZWl0aGVyIGNvbnN0YW50IG5vciBmaW5hbCwgb3IgaWYgaXQKICAvLy8gaXMgbGF0ZSBmaW5hbCB3aXRob3V0IGFuIGluaXRpYWxpemVyLgogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSB7CiAgICBpZiAoaXNDb25zdCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGlzRmluYWwpIHsKICAgICAgaWYgKGlzTGF0ZSkgcmV0dXJuIGluaXRpYWxpemVyID09IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCBzZXQgaXNGaW5hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0ZpbmFsKSA6IChmbGFncyAmIH5GbGFnRmluYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNDb25zdChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0NvbnN0KSA6IChmbGFncyAmIH5GbGFnQ29uc3QpOwogIH0KCiAgdm9pZCBzZXQgaXNDb3ZhcmlhbnQoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdDb3ZhcmlhbnQpIDogKGZsYWdzICYgfkZsYWdDb3ZhcmlhbnQpOwogIH0KCiAgQGluZm9ybWF0aXZlCiAgdm9pZCBzZXQgaXNGaWVsZEZvcm1hbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0ZpZWxkRm9ybWFsKSA6IChmbGFncyAmIH5GbGFnRmllbGRGb3JtYWwpOwogIH0KCiAgdm9pZCBzZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbChib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlCiAgICAgICAgPyAoZmxhZ3MgfCBGbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpCiAgICAgICAgOiAoZmxhZ3MgJiB+RmxhZ0dlbmVyaWNDb3ZhcmlhbnRJbXBsKTsKICB9CgogIHZvaWQgc2V0IGlzTGF0ZShib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IHZhbHVlID8gKGZsYWdzIHwgRmxhZ0xhdGUpIDogKGZsYWdzICYgfkZsYWdMYXRlKTsKICB9CgogIHZvaWQgc2V0IGlzUmVxdWlyZWQoYm9vbCB2YWx1ZSkgewogICAgZmxhZ3MgPSB2YWx1ZSA/IChmbGFncyB8IEZsYWdSZXF1aXJlZCkgOiAoZmxhZ3MgJiB+RmxhZ1JlcXVpcmVkKTsKICB9CgogIHZvaWQgY2xlYXJBbm5vdGF0aW9ucygpIHsKICAgIGFubm90YXRpb25zID0gY29uc3QgPEV4cHJlc3Npb24+W107CiAgfQoKICB2b2lkIGFkZEFubm90YXRpb24oRXhwcmVzc2lvbiBhbm5vdGF0aW9uKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSkgewogICAgICBhbm5vdGF0aW9ucyA9IDxFeHByZXNzaW9uPltdOwogICAgfQogICAgYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24uLnBhcmVudCA9IHRoaXMpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QoYW5ub3RhdGlvbnMsIHYpOwogICAgdHlwZT8uYWNjZXB0KHYpOwogICAgaW5pdGlhbGl6ZXI/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QoYW5ub3RhdGlvbnMsIHYsIHRoaXMpOwogICAgdHlwZSA9IHYudmlzaXREYXJ0VHlwZSh0eXBlKTsKICAgIGlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIGluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgaW5pdGlhbGl6ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICAvLy8gUmV0dXJucyBhIHBvc3NpYmx5IHN5bnRoZXNpemVkIG5hbWUgZm9yIHRoaXMgdmFyaWFibGUsIGNvbnNpc3RlbnQgd2l0aAogIC8vLyB0aGUgbmFtZXMgdXNlZCBhY3Jvc3MgYWxsIFt0b1N0cmluZ10gY2FsbHMuCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gZGVidWdWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSh0aGlzKTsKfQoKLy8vIERlY2xhcmF0aW9uIGEgbG9jYWwgZnVuY3Rpb24uCi8vLwovLy8gVGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIG1heSB1c2UgW3ZhcmlhYmxlXSBhcyBpdHMgc2VsZi1yZWZlcmVuY2UuCmNsYXNzIEZ1bmN0aW9uRGVjbGFyYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBMb2NhbEZ1bmN0aW9uIHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBJcyBmaW5hbCBhbmQgaGFzIG5vIGluaXRpYWxpemVyLgogIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbjsKCiAgRnVuY3Rpb25EZWNsYXJhdGlvbih0aGlzLnZhcmlhYmxlLCB0aGlzLmZ1bmN0aW9uKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbih0aGlzKTsKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKHRoaXMsIGFyZyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgZnVuY3Rpb24/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBmdW5jdGlvbiA9IGZ1bmN0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBBIHB1YmxpYyBuYW1lLCBvciBhIHByaXZhdGUgbmFtZSBxdWFsaWZpZWQgYnkgYSBsaWJyYXJ5LgovLy8KLy8vIE5hbWVzIGFyZSBvbmx5IHVzZWQgZm9yIGV4cHJlc3Npb25zIHdpdGggZHluYW1pYyBkaXNwYXRjaCwgYXMgYWxsCi8vLyBzdGF0aWNhbGx5IHJlc29sdmVkIHJlZmVyZW5jZXMgYXJlIHJlcHJlc2VudGVkIGluIG5hbWVsZXNzIGZvcm0uCi8vLwovLy8gW05hbWVdcyBhcmUgaW1tdXRhYmxlIGFuZCBjb21wYXJlIGJhc2VkIG9uIHN0cnVjdHVyYWwgZXF1YWxpdHksIGFuZCB0aGV5Ci8vLyBhcmUgbm90IEFTVCBub2Rlcy4KLy8vCi8vLyBUaGUgW3RvU3RyaW5nXSBtZXRob2QgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyB0aGF0IGluY2x1ZGVzIHRoZQovLy8gbGlicmFyeSBuYW1lIGZvciBwcml2YXRlIG5hbWVzOyB1bmlxdWVuZXNzIGlzIG5vdCBndWFyYW50ZWVkLgphYnN0cmFjdCBjbGFzcyBOYW1lIGltcGxlbWVudHMgTm9kZSB7CiAgZmluYWwgaW50IGhhc2hDb2RlOwogIGZpbmFsIFN0cmluZyBuYW1lOwogIFJlZmVyZW5jZSBnZXQgbGlicmFyeU5hbWU7CiAgTGlicmFyeSBnZXQgbGlicmFyeTsKICBib29sIGdldCBpc1ByaXZhdGU7CgogIE5hbWUuX2ludGVybmFsKHRoaXMuaGFzaENvZGUsIHRoaXMubmFtZSk7CgogIGZhY3RvcnkgTmFtZShTdHJpbmcgbmFtZSwgW0xpYnJhcnkgbGlicmFyeV0pID0+CiAgICAgIG5ldyBOYW1lLmJ5UmVmZXJlbmNlKG5hbWUsIGxpYnJhcnk/LnJlZmVyZW5jZSk7CgogIGZhY3RvcnkgTmFtZS5ieVJlZmVyZW5jZShTdHJpbmcgbmFtZSwgUmVmZXJlbmNlIGxpYnJhcnlOYW1lKSB7CiAgICAvLy8gVXNlIHNlcGFyYXRlIHN1YmNsYXNzZXMgZm9yIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUgY2FzZSB0byBzYXZlIG1lbW9yeQogICAgLy8vIGZvciBwdWJsaWMgbmFtZXMuCiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdfJykpIHsKICAgICAgYXNzZXJ0KGxpYnJhcnlOYW1lICE9IG51bGwpOwogICAgICByZXR1cm4gbmV3IF9Qcml2YXRlTmFtZShuYW1lLCBsaWJyYXJ5TmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IF9QdWJsaWNOYW1lKG5hbWUpOwogICAgfQogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIE5hbWUgJiYgbmFtZSA9PSBvdGhlci5uYW1lICYmIGxpYnJhcnkgPT0gb3RoZXIubGlicmFyeTsKICB9CgogIFIgYWNjZXB0PFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdE5hbWUodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICAvLyBERVNJR04gVE9ETzogU2hvdWxkIHdlIHZpc2l0IHRoZSBsaWJyYXJ5IGFzIGEgbGlicmFyeSByZWZlcmVuY2U/CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIGFkZHMgc29tZSBub2RlcyB0byBhIHN0YXRpYyBtYXAgdG8gZW5zdXJlIGNvbnNpc3RlbnQKICAvLy8gbmFtaW5nLCBidXQgdGhhdCBpdCB0aHVzIGFsc28gbGVha3MgbWVtb3J5LgogIFN0cmluZyBsZWFraW5nRGVidWdUb1N0cmluZygpID0+IGRlYnVnTm9kZVRvU3RyaW5nKHRoaXMpOwp9CgpjbGFzcyBfUHJpdmF0ZU5hbWUgZXh0ZW5kcyBOYW1lIHsKICBmaW5hbCBSZWZlcmVuY2UgbGlicmFyeU5hbWU7CiAgYm9vbCBnZXQgaXNQcml2YXRlID0+IHRydWU7CgogIF9Qcml2YXRlTmFtZShTdHJpbmcgbmFtZSwgUmVmZXJlbmNlIGxpYnJhcnlOYW1lKQogICAgICA6IHRoaXMubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZSwKICAgICAgICBzdXBlci5faW50ZXJuYWwoX2NvbXB1dGVIYXNoQ29kZShuYW1lLCBsaWJyYXJ5TmFtZSksIG5hbWUpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBsaWJyYXJ5ICE9IG51bGwgPyAnJGxpYnJhcnk6OiRuYW1lJyA6IG5hbWU7CgogIExpYnJhcnkgZ2V0IGxpYnJhcnkgPT4gbGlicmFyeU5hbWUuYXNMaWJyYXJ5OwoKICBzdGF0aWMgaW50IF9jb21wdXRlSGFzaENvZGUoU3RyaW5nIG5hbWUsIFJlZmVyZW5jZSBsaWJyYXJ5TmFtZSkgewogICAgLy8gVE9ETyhkbWl0cnlhcyk6IEZhY3RvciBpbiBbbGlicmFyeU5hbWVdIGluIGEgbm9uLWRldGVybWluaXN0aWMgd2F5IGludG8KICAgIC8vIHRoZSByZXN1bHQuICBOb3RlLCB0aGUgcHJldmlvdXMgY29kZSBoZXJlIHdhcyB0aGUgZm9sbG93aW5nOgogICAgLy8gICAgIHJldHVybiAxMzEgKiBuYW1lLmhhc2hDb2RlICsgMTcgKiBsaWJyYXJ5TmFtZS5hc0xpYnJhcnkuX2xpYnJhcnlJZDsKICAgIHJldHVybiBuYW1lLmhhc2hDb2RlOwogIH0KfQoKY2xhc3MgX1B1YmxpY05hbWUgZXh0ZW5kcyBOYW1lIHsKICBSZWZlcmVuY2UgZ2V0IGxpYnJhcnlOYW1lID0+IG51bGw7CiAgTGlicmFyeSBnZXQgbGlicmFyeSA9PiBudWxsOwogIGJvb2wgZ2V0IGlzUHJpdmF0ZSA9PiBmYWxzZTsKCiAgX1B1YmxpY05hbWUoU3RyaW5nIG5hbWUpIDogc3VwZXIuX2ludGVybmFsKG5hbWUuaGFzaENvZGUsIG5hbWUpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVTCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIFJlcHJlc2VudHMgbnVsbGFiaWxpdHkgb2YgYSB0eXBlLgplbnVtIE51bGxhYmlsaXR5IHsKICAvLy8gTm9uLWxlZ2FjeSB0eXBlcyBub3Qga25vd24gdG8gYmUgbnVsbGFibGUgb3Igbm9uLW51bGxhYmxlIHN0YXRpY2FsbHkuCiAgLy8vCiAgLy8vIEFuIGV4YW1wbGUgb2Ygc3VjaCB0eXBlIGlzIHR5cGUgVCBpbiB0aGUgZXhhbXBsZSBiZWxvdy4gIE5vdGUgdGhhdCBib3RoCiAgLy8vIGludCBhbmQgaW50PyBjYW4gYmUgcGFzc2VkIGluIGZvciBULCBzbyBhbiBhdHRlbXB0IHRvIGFzc2lnbiBudWxsIHRvIHggaXMKICAvLy8gYSBjb21waWxlLXRpbWUgZXJyb3IgYXMgd2VsbCBhcyBhc3NpZ25pbmcgeCB0byB5LgogIC8vLwogIC8vLyAgIGNsYXNzIEE8VCBleHRlbmRzIE9iamVjdD8+IHsKICAvLy8gICAgIGZvbyhUIHgpIHsKICAvLy8gICAgICAgeCA9IG51bGw7ICAgICAgLy8gQ29tcGlsZS10aW1lIGVycm9yLgogIC8vLyAgICAgICBPYmplY3QgeSA9IHg7ICAvLyBDb21waWxlLXRpbWUgZXJyb3IuCiAgLy8vICAgICB9CiAgLy8vICAgfQogIHVuZGV0ZXJtaW5lZCwKCiAgLy8vIE51bGxhYmxlIHR5cGVzIGFyZSBtYXJrZWQgd2l0aCB0aGUgJz8nIG1vZGlmaWVyLgogIC8vLwogIC8vLyBOdWxsLCBkeW5hbWljLCBhbmQgdm9pZCBhcmUgbnVsbGFibGUgYnkgZGVmYXVsdC4KICBudWxsYWJsZSwKCiAgLy8vIE5vbi1udWxsYWJsZSB0eXBlcyBhcmUgdHlwZXMgdGhhdCBhcmVuJ3QgbWFya2VkIHdpdGggdGhlICc/JyBtb2RpZmllci4KICAvLy8KICAvLy8gTm90ZSB0aGF0IE51bGwsIGR5bmFtaWMsIGFuZCB2b2lkIHRoYXQgYXJlIG51bGxhYmxlIGJ5IGRlZmF1bHQuICBOb3RlIGFsc28KICAvLy8gdGhhdCBzb21lIHR5cGVzIGRlbm90ZWQgYnkgYSB0eXBlIHBhcmFtZXRlciB3aXRob3V0IHRoZSAnPycgbW9kaWZpZXIgY2FuCiAgLy8vIGJlIHNvbWV0aGluZyBlbHNlIHJhdGhlciB0aGFuIG5vbi1udWxsYWJsZS4KICBub25OdWxsYWJsZSwKCiAgLy8vIFR5cGVzIGluIG9wdC1vdXQgbGlicmFyaWVzIGFyZSAnbGVnYWN5JyB0eXBlcy4KICAvLy8KICAvLy8gVGhleSBhcmUgYm90aCBzdWJ0eXBlcyBhbmQgc3VwZXJ0eXBlcyBvZiB0aGUgbnVsbGFibGUgYW5kIG5vbi1udWxsYWJsZQogIC8vLyB2ZXJzaW9ucyBvZiB0aGUgdHlwZS4KICBsZWdhY3kKfQoKLy8vIEEgc3ludGF4LWluZGVwZW5kZW50IG5vdGlvbiBvZiBhIHR5cGUuCi8vLwovLy8gW0RhcnRUeXBlXXMgYXJlIG5vdCBBU1Qgbm9kZXMgYW5kIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgcGFyZW50cy4KLy8vCi8vLyBbRGFydFR5cGVdIG9iamVjdHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdW5tb2RpZmlhYmxlIG9iamVjdHMsIGFsdGhvdWdoCi8vLyBpbW11dGFiaWxpdHkgaXMgbm90IGVuZm9yY2VkIGZvciBMaXN0IGZpZWxkcywgYW5kIFtUeXBlUGFyYW1ldGVyXXMgYXJlCi8vLyBjeWNsaWMgc3RydWN0dXJlcyB0aGF0IGFyZSBjb25zdHJ1Y3RlZCBieSBtdXRhdGlvbi4KLy8vCi8vLyBUaGUgYD09YCBvcGVyYXRvciBvbiBbRGFydFR5cGVdcyBjb21wYXJlIGJhc2VkIG9uIHR5cGUgZXF1YWxpdHksIG5vdAovLy8gb2JqZWN0IGlkZW50aXR5LgphYnN0cmFjdCBjbGFzcyBEYXJ0VHlwZSBleHRlbmRzIE5vZGUgewogIGNvbnN0IERhcnRUeXBlKCk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KERhcnRUeXBlVmlzaXRvcjxSPiB2KTsKCiAgUiBhY2NlcHQxPFIsIEE+KERhcnRUeXBlVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eTsKCiAgLy8vIElmIHRoaXMgaXMgYSB0eXBlZGVmIHR5cGUsIHJlcGVhdGVkbHkgdW5mb2xkcyBpdHMgdHlwZSBkZWZpbml0aW9uIHVudGlsCiAgLy8vIHRoZSByb290IHRlcm0gaXMgbm90IGEgdHlwZWRlZiB0eXBlLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgdHlwZSBpdHNlbGYuCiAgLy8vCiAgLy8vIFdpbGwgbmV2ZXIgcmV0dXJuIGEgdHlwZWRlZiB0eXBlLgogIERhcnRUeXBlIGdldCB1bmFsaWFzID0+IHRoaXM7CgogIC8vLyBJZiB0aGlzIGlzIGEgdHlwZWRlZiB0eXBlLCB1bmZvbGRzIGl0cyB0eXBlIGRlZmluaXRpb24gb25jZSwgb3RoZXJ3aXNlCiAgLy8vIHJldHVybnMgdGhlIHR5cGUgaXRzZWxmLgogIERhcnRUeXBlIGdldCB1bmFsaWFzT25jZSA9PiB0aGlzOwoKICAvLy8gQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gW251bGxhYmlsaXR5XSBpZiBwb3NzaWJsZS4KICAvLy8KICAvLy8gU29tZSB0eXBlcyBoYXZlIGZpeGVkIG51bGxhYmlsaXRpZXMsIHN1Y2ggYXMgYGR5bmFtaWNgLCBgaW52YWxpZC10eXBlYCwKICAvLy8gYHZvaWRgLCBvciBgYm90dG9tYC4KICBEYXJ0VHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpOwoKICAvLy8gQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIHBvdGVudGlhbGx5IG51bGxhYmxlLgogIC8vLwogIC8vLyBBIHR5cGUgaXMgcG90ZW50aWFsbHkgbnVsbGFibGUgaWYgaXQncyBudWxsYWJsZSBvciBpZiBpdCdzIG51bGxhYmlsaXR5IGlzCiAgLy8vIHVuZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUuCiAgYm9vbCBnZXQgaXNQb3RlbnRpYWxseU51bGxhYmxlIHsKICAgIHJldHVybiBudWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSB8fAogICAgICAgIG51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDsKICB9CgogIC8vLyBDaGVja3MgaWYgdGhlIHR5cGUgaXMgcG90ZW50aWFsbHkgbm9uLW51bGxhYmxlLgogIC8vLwogIC8vLyBBIHR5cGUgaXMgcG90ZW50aWFsbHkgbm9uLW51bGxhYmxlIGlmIGl0J3MgbnVsbGFibGUgb3IgaWYgaXQncyBudWxsYWJpbGl0eQogIC8vLyBpcyB1bmRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLgogIGJvb2wgZ2V0IGlzUG90ZW50aWFsbHlOb25OdWxsYWJsZSB7CiAgICByZXR1cm4gbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUgfHwKICAgICAgICBudWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ7CiAgfQoKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKTsKfQoKLy8vIFRoZSB0eXBlIGFyaXNpbmcgZnJvbSBpbnZhbGlkIHR5cGUgYW5ub3RhdGlvbnMuCi8vLwovLy8gQ2FuIHVzdWFsbHkgYmUgdHJlYXRlZCBhcyAnZHluYW1pYycsIGJ1dCBzaG91bGQgb2NjYXNpb25hbGx5IGJlIGhhbmRsZWQKLy8vIGRpZmZlcmVudGx5LCBlLmcuIGB4IGlzIEVSUk9SYCBzaG91bGQgZXZhbHVhdGUgdG8gZmFsc2UuCmNsYXNzIEludmFsaWRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZSA9IDEyMzQ1OwoKICBjb25zdCBJbnZhbGlkVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihEYXJ0VHlwZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEludmFsaWRUeXBlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdEludmFsaWRUeXBlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBlcXVhbHMob3RoZXIsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKSA9PiBvdGhlciBpcyBJbnZhbGlkVHlwZTsKCiAgQG92ZXJyaWRlCiAgTnVsbGFiaWxpdHkgZ2V0IG51bGxhYmlsaXR5ID0+IHRocm93ICJJbnZhbGlkVHlwZSBkb2Vzbid0IGhhdmUgbnVsbGFiaWxpdHkiOwoKICBAb3ZlcnJpZGUKICBJbnZhbGlkVHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpID0+IHRoaXM7Cn0KCmNsYXNzIER5bmFtaWNUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZSA9IDU0MzIxOwoKICBjb25zdCBEeW5hbWljVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihEYXJ0VHlwZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdER5bmFtaWNUeXBlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdER5bmFtaWNUeXBlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBlcXVhbHMob3RoZXIsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKSA9PiBvdGhlciBpcyBEeW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgTnVsbGFiaWxpdHkgZ2V0IG51bGxhYmlsaXR5ID0+IE51bGxhYmlsaXR5Lm51bGxhYmxlOwoKICBAb3ZlcnJpZGUKICBEeW5hbWljVHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpID0+IHRoaXM7Cn0KCmNsYXNzIFZvaWRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIEBvdmVycmlkZQogIGZpbmFsIGludCBoYXNoQ29kZSA9IDEyMzEyMTsKCiAgY29uc3QgVm9pZFR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8Uj4oRGFydFR5cGVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRWb2lkVHlwZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQxPFIsIEE+KERhcnRUeXBlVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYudmlzaXRWb2lkVHlwZSh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4gZXF1YWxzKG90aGVyLCBudWxsKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBlcXVhbHMoT2JqZWN0IG90aGVyLCBBc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgPT4gb3RoZXIgaXMgVm9pZFR5cGU7CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eSA9PiBOdWxsYWJpbGl0eS5udWxsYWJsZTsKCiAgQG92ZXJyaWRlCiAgVm9pZFR5cGUgd2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSA9PiB0aGlzOwp9CgpjbGFzcyBOZXZlclR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHk7CgogIGNvbnN0IE5ldmVyVHlwZSh0aGlzLm51bGxhYmlsaXR5KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gNDg1Nzg2IF4gKCgweDMzMzMzMzMzID4+IG51bGxhYmlsaXR5LmluZGV4KSBeIDB4MzMzMzMzMzMpOwogIH0KCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8Uj4oRGFydFR5cGVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXROZXZlclR5cGUodGhpcyk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0MTxSLCBBPihEYXJ0VHlwZVZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0TmV2ZXJUeXBlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBlcXVhbHMob3RoZXIsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKSA9PgogICAgICBvdGhlciBpcyBOZXZlclR5cGUgJiYgbnVsbGFiaWxpdHkgPT0gb3RoZXIubnVsbGFiaWxpdHk7CgogIEBvdmVycmlkZQogIE5ldmVyVHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiB0aGlzLm51bGxhYmlsaXR5ID09IG51bGxhYmlsaXR5ID8gdGhpcyA6IG5ldyBOZXZlclR5cGUobnVsbGFiaWxpdHkpOwogIH0KfQoKY2xhc3MgQm90dG9tVHlwZSBleHRlbmRzIERhcnRUeXBlIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgaGFzaENvZGUgPSA1MTQyMTM7CgogIGNvbnN0IEJvdHRvbVR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8Uj4oRGFydFR5cGVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRCb3R0b21UeXBlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdEJvdHRvbVR5cGUodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdikge30KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IGVxdWFscyhvdGhlciwgbnVsbCk7CgogIEBvdmVycmlkZQogIGJvb2wgZXF1YWxzKE9iamVjdCBvdGhlciwgQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpID0+IG90aGVyIGlzIEJvdHRvbVR5cGU7CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eSA9PiBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKCiAgQG92ZXJyaWRlCiAgQm90dG9tVHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpID0+IHRoaXM7Cn0KCmNsYXNzIEludGVyZmFjZVR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgUmVmZXJlbmNlIGNsYXNzTmFtZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHk7CgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIC8vLyBUaGUgW3R5cGVBcmd1bWVudHNdIGxpc3QgbXVzdCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgdGhpcyBjYWxsLiBJZiB0aGUKICAvLy8gbGlzdCBpcyBvbWl0dGVkLCAnZHluYW1pYycgdHlwZSBhcmd1bWVudHMgYXJlIGZpbGxlZCBpbi4KICBJbnRlcmZhY2VUeXBlKENsYXNzIGNsYXNzTm9kZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHksCiAgICAgIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldENsYXNzUmVmZXJlbmNlKGNsYXNzTm9kZSksIG51bGxhYmlsaXR5LAogICAgICAgICAgICB0eXBlQXJndW1lbnRzID8/IF9kZWZhdWx0VHlwZUFyZ3VtZW50cyhjbGFzc05vZGUpKTsKCiAgSW50ZXJmYWNlVHlwZS5ieVJlZmVyZW5jZSgKICAgICAgdGhpcy5jbGFzc05hbWUsIHRoaXMubnVsbGFiaWxpdHksIHRoaXMudHlwZUFyZ3VtZW50cykKICAgICAgOiBhc3NlcnQobnVsbGFiaWxpdHkgIT0gbnVsbCk7CgogIENsYXNzIGdldCBjbGFzc05vZGUgPT4gY2xhc3NOYW1lLmFzQ2xhc3M7CgogIHN0YXRpYyBMaXN0PERhcnRUeXBlPiBfZGVmYXVsdFR5cGVBcmd1bWVudHMoQ2xhc3MgY2xhc3NOb2RlKSB7CiAgICBpZiAoY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSB7CiAgICAgIC8vIEF2b2lkIGFsbG9jYXRpbmcgYSBsaXN0IGluIHRoaXMgdmVyeSBjb21tb24gY2FzZS4KICAgICAgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihEYXJ0VHlwZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEludGVyZmFjZVR5cGUodGhpcyk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0MTxSLCBBPihEYXJ0VHlwZVZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0SW50ZXJmYWNlVHlwZSh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBjbGFzc05vZGUuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IGVxdWFscyhvdGhlciwgbnVsbCk7CgogIEBvdmVycmlkZQogIGJvb2wgZXF1YWxzKE9iamVjdCBvdGhlciwgQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmIChudWxsYWJpbGl0eSAhPSBvdGhlci5udWxsYWJpbGl0eSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoY2xhc3NOYW1lICE9IG90aGVyLmNsYXNzTmFtZSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzW2ldLmVxdWFscyhvdGhlci50eXBlQXJndW1lbnRzW2ldLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gMHgzZmZmZmZmZiAmIGNsYXNzTmFtZS5oYXNoQ29kZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIHR5cGVBcmd1bWVudHNbaV0uaGFzaENvZGUpKTsKICAgIH0KICAgIGludCBudWxsYWJpbGl0eUhhc2ggPSAoMHgzMzMzMzMzMyA+PiBudWxsYWJpbGl0eS5pbmRleCkgXiAweDMzMzMzMzMzOwogICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgKGhhc2ggXiBudWxsYWJpbGl0eUhhc2gpKTsKICAgIHJldHVybiBoYXNoOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBudWxsYWJpbGl0eSA9PSB0aGlzLm51bGxhYmlsaXR5CiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgSW50ZXJmYWNlVHlwZS5ieVJlZmVyZW5jZShjbGFzc05hbWUsIG51bGxhYmlsaXR5LCB0eXBlQXJndW1lbnRzKTsKICB9Cn0KCi8vLyBBIHBvc3NpYmx5IGdlbmVyaWMgZnVuY3Rpb24gdHlwZS4KY2xhc3MgRnVuY3Rpb25UeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CiAgZmluYWwgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgZmluYWwgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVyczsgLy8gTXVzdCBiZSBzb3J0ZWQuCiAgZmluYWwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHk7CgogIC8vLyBUaGUgW1R5cGVkZWZdIHRoaXMgZnVuY3Rpb24gdHlwZSBpcyBjcmVhdGVkIGZvci4KICBmaW5hbCBUeXBlZGVmVHlwZSB0eXBlZGVmVHlwZTsKCiAgZmluYWwgRGFydFR5cGUgcmV0dXJuVHlwZTsKICBpbnQgX2hhc2hDb2RlOwoKICBGdW5jdGlvblR5cGUoCiAgICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB0aGlzLnJldHVyblR5cGUsIHRoaXMubnVsbGFiaWxpdHksCiAgICAgIHt0aGlzLm5hbWVkUGFyYW1ldGVyczogY29uc3QgPE5hbWVkVHlwZT5bXSwKICAgICAgdGhpcy50eXBlUGFyYW1ldGVyczogY29uc3QgPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICB0aGlzLnR5cGVkZWZUeXBlfSkKICAgICAgOiB0aGlzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgdGhpcy5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID0KICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA/PyBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CgogIFJlZmVyZW5jZSBnZXQgdHlwZWRlZlJlZmVyZW5jZSA9PiB0eXBlZGVmVHlwZT8udHlwZWRlZlJlZmVyZW5jZTsKCiAgVHlwZWRlZiBnZXQgdHlwZWRlZiA9PiB0eXBlZGVmUmVmZXJlbmNlPy5hc1R5cGVkZWY7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KERhcnRUeXBlVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0RnVuY3Rpb25UeXBlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdEZ1bmN0aW9uVHlwZSh0aGlzLCBhcmcpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QodHlwZVBhcmFtZXRlcnMsIHYpOwogICAgdmlzaXRMaXN0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB2KTsKICAgIHZpc2l0TGlzdChuYW1lZFBhcmFtZXRlcnMsIHYpOwogICAgdHlwZWRlZlR5cGU/LmFjY2VwdCh2KTsKICAgIHJldHVyblR5cGUuYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IGVxdWFscyhvdGhlciwgbnVsbCk7CgogIEBvdmVycmlkZQogIGJvb2wgZXF1YWxzKE9iamVjdCBvdGhlciwgQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvdGhlciBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKG51bGxhYmlsaXR5ICE9IG90aGVyLm51bGxhYmlsaXR5KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXIudHlwZVBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IG90aGVyLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgfHwKICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPSBvdGhlci5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggfHwKICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXIubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIGFzc3VtcHRpb25zID8/PSBuZXcgQXNzdW1wdGlvbnMoKTsKICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBhc3N1bXB0aW9ucy5hc3N1bWUoCiAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNbaW5kZXhdLCBvdGhlci50eXBlUGFyYW1ldGVyc1tpbmRleF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXJzW2luZGV4XQogICAgICAgICAgICAgIC5ib3VuZAogICAgICAgICAgICAgIC5lcXVhbHMob3RoZXIudHlwZVBhcmFtZXRlcnNbaW5kZXhdLmJvdW5kLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIXJldHVyblR5cGUuZXF1YWxzKG90aGVyLnJldHVyblR5cGUsIGFzc3VtcHRpb25zKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGlmICghcG9zaXRpb25hbFBhcmFtZXRlcnNbaW5kZXhdCiAgICAgICAgICAgIC5lcXVhbHMob3RoZXIucG9zaXRpb25hbFBhcmFtZXRlcnNbaW5kZXhdLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICBpZiAoIW5hbWVkUGFyYW1ldGVyc1tpbmRleF0KICAgICAgICAgICAgLmVxdWFscyhvdGhlci5uYW1lZFBhcmFtZXRlcnNbaW5kZXhdLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBhc3N1bXB0aW9ucy5mb3JnZXQoCiAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNbaW5kZXhdLCBvdGhlci50eXBlUGFyYW1ldGVyc1tpbmRleF0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgdmFyaWFudCBvZiB0aGlzIGZ1bmN0aW9uIHR5cGUgdGhhdCBkb2VzIG5vdCBkZWNsYXJlIGFueSB0eXBlCiAgLy8vIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIEFueSB1c2VzIG9mIGl0cyB0eXBlIHBhcmFtZXRlcnMgYmVjb21lIGZyZWUgdmFyaWFibGVzIGluIHRoZSByZXR1cm5lZAogIC8vLyB0eXBlLgogIEZ1bmN0aW9uVHlwZSBnZXQgd2l0aG91dFR5cGVQYXJhbWV0ZXJzIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gdGhpczsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLCBudWxsYWJpbGl0eSwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHR5cGVkZWZUeXBlOiBudWxsKTsKICB9CgogIC8vLyBMb29rcyB1cCB0aGUgdHlwZSBvZiB0aGUgbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIG5hbWVkIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgogIERhcnRUeXBlIGdldE5hbWVkUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CiAgICBpbnQgbG93ZXIgPSAwOwogICAgaW50IHVwcGVyID0gbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAobG93ZXIgPD0gdXBwZXIpIHsKICAgICAgaW50IHBpdm90ID0gKGxvd2VyICsgdXBwZXIpIH4vIDI7CiAgICAgIHZhciBuYW1lZFBhcmFtZXRlciA9IG5hbWVkUGFyYW1ldGVyc1twaXZvdF07CiAgICAgIGludCBjb21wYXJpc29uID0gbmFtZS5jb21wYXJlVG8obmFtZWRQYXJhbWV0ZXIubmFtZSk7CiAgICAgIGlmIChjb21wYXJpc29uID09IDApIHsKICAgICAgICByZXR1cm4gbmFtZWRQYXJhbWV0ZXIudHlwZTsKICAgICAgfSBlbHNlIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgIHVwcGVyID0gcGl2b3QgLSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGxvd2VyID0gcGl2b3QgKyAxOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2hhc2hDb2RlID8/PSBfY29tcHV0ZUhhc2hDb2RlKCk7CgogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgewogICAgaW50IGhhc2ggPSAxMjM3OwogICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcnNbaV07CiAgICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIHBhcmFtZXRlci5ib3VuZC5oYXNoQ29kZSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLmhhc2hDb2RlKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIG5hbWVkUGFyYW1ldGVyc1tpXS5oYXNoQ29kZSk7CiAgICB9CiAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyByZXR1cm5UeXBlLmhhc2hDb2RlKTsKICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIG51bGxhYmlsaXR5LmluZGV4KTsKICAgIHJldHVybiBoYXNoOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIHdpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgaWYgKG51bGxhYmlsaXR5ID09IHRoaXMubnVsbGFiaWxpdHkpIHJldHVybiB0aGlzOwogICAgRnVuY3Rpb25UeXBlIHJlc3VsdCA9IEZ1bmN0aW9uVHlwZSgKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycywgcmV0dXJuVHlwZSwgbnVsbGFiaWxpdHksCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgdHlwZWRlZlR5cGU6IHR5cGVkZWZUeXBlPy53aXRoTnVsbGFiaWxpdHkobnVsbGFiaWxpdHkpKTsKICAgIGlmICh0eXBlUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIGdldEZyZXNoVHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpLmFwcGx5VG9GdW5jdGlvblR5cGUocmVzdWx0KTsKICB9Cn0KCi8vLyBBIHVzZSBvZiBhIFtUeXBlZGVmXSBhcyBhIHR5cGUuCi8vLwovLy8gVGhlIHVuZGVybHlpbmcgdHlwZSBjYW4gYmUgZXh0cmFjdGVkIHVzaW5nIFt1bmFsaWFzXS4KY2xhc3MgVHlwZWRlZlR5cGUgZXh0ZW5kcyBEYXJ0VHlwZSB7CiAgZmluYWwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHk7CiAgZmluYWwgUmVmZXJlbmNlIHR5cGVkZWZSZWZlcmVuY2U7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgVHlwZWRlZlR5cGUoVHlwZWRlZiB0eXBlZGVmTm9kZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHksCiAgICAgIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKHR5cGVkZWZOb2RlLnJlZmVyZW5jZSwgbnVsbGFiaWxpdHksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPz8gY29uc3QgPERhcnRUeXBlPltdKTsKCiAgVHlwZWRlZlR5cGUuYnlSZWZlcmVuY2UoCiAgICAgIHRoaXMudHlwZWRlZlJlZmVyZW5jZSwgdGhpcy5udWxsYWJpbGl0eSwgdGhpcy50eXBlQXJndW1lbnRzKTsKCiAgVHlwZWRlZiBnZXQgdHlwZWRlZk5vZGUgPT4gdHlwZWRlZlJlZmVyZW5jZS5hc1R5cGVkZWY7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KERhcnRUeXBlVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VHlwZWRlZlR5cGUodGhpcyk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0MTxSLCBBPihEYXJ0VHlwZVZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSA9PgogICAgICB2LnZpc2l0VHlwZWRlZlR5cGUodGhpcywgYXJnKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogICAgdi52aXNpdFR5cGVkZWZSZWZlcmVuY2UodHlwZWRlZk5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0IHVuYWxpYXNPbmNlIHsKICAgIERhcnRUeXBlIHJlc3VsdCA9CiAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21UeXBlZGVmVHlwZSh0aGlzKS5zdWJzdGl0dXRlVHlwZSh0eXBlZGVmTm9kZS50eXBlKTsKICAgIHJldHVybiByZXN1bHQud2l0aE51bGxhYmlsaXR5KAogICAgICAgIGNvbWJpbmVOdWxsYWJpbGl0aWVzRm9yU3Vic3RpdHV0aW9uKHJlc3VsdC5udWxsYWJpbGl0eSwgbnVsbGFiaWxpdHkpKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCB1bmFsaWFzIHsKICAgIHJldHVybiB1bmFsaWFzT25jZS51bmFsaWFzOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IGVxdWFscyhvdGhlciwgbnVsbCk7CgogIEBvdmVycmlkZQogIGJvb2wgZXF1YWxzKE9iamVjdCBvdGhlciwgQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvdGhlciBpcyBUeXBlZGVmVHlwZSkgewogICAgICBpZiAobnVsbGFiaWxpdHkgIT0gb3RoZXIubnVsbGFiaWxpdHkpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHR5cGVkZWZSZWZlcmVuY2UgIT0gb3RoZXIudHlwZWRlZlJlZmVyZW5jZSB8fAogICAgICAgICAgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzW2ldLmVxdWFscyhvdGhlci50eXBlQXJndW1lbnRzW2ldLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gMHgzZmZmZmZmZiAmIHR5cGVkZWZOb2RlLmhhc2hDb2RlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhc2ggPSAweDNmZmZmZmZmICYgKGhhc2ggKiAzMSArIChoYXNoIF4gdHlwZUFyZ3VtZW50c1tpXS5oYXNoQ29kZSkpOwogICAgfQogICAgaW50IG51bGxhYmlsaXR5SGFzaCA9ICgweDMzMzMzMzMzID4+IG51bGxhYmlsaXR5LmluZGV4KSBeIDB4MzMzMzMzMzM7CiAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIG51bGxhYmlsaXR5SGFzaCkpOwogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlZGVmVHlwZSB3aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBudWxsYWJpbGl0eSA9PSB0aGlzLm51bGxhYmlsaXR5CiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgVHlwZWRlZlR5cGUuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHR5cGVkZWZSZWZlcmVuY2UsIG51bGxhYmlsaXR5LCB0eXBlQXJndW1lbnRzKTsKICB9Cn0KCi8vLyBBIG5hbWVkIHBhcmFtZXRlciBpbiBbRnVuY3Rpb25UeXBlXS4KY2xhc3MgTmFtZWRUeXBlIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8TmFtZWRUeXBlPiB7CiAgLy8gRmxhZyB1c2VkIGZvciBzZXJpYWxpemF0aW9uIGlmIFtpc1JlcXVpcmVkXS4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdSZXF1aXJlZE5hbWVkVHlwZSA9IDEgPDwgMDsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKICBmaW5hbCBib29sIGlzUmVxdWlyZWQ7CgogIE5hbWVkVHlwZSh0aGlzLm5hbWUsIHRoaXMudHlwZSwge3RoaXMuaXNSZXF1aXJlZDogZmFsc2V9KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+IGVxdWFscyhvdGhlciwgbnVsbCk7CgogIGJvb2wgZXF1YWxzKE9iamVjdCBvdGhlciwgQXNzdW1wdGlvbnMgYXNzdW1wdGlvbnMpIHsKICAgIHJldHVybiBvdGhlciBpcyBOYW1lZFR5cGUgJiYKICAgICAgICBuYW1lID09IG90aGVyLm5hbWUgJiYKICAgICAgICBpc1JlcXVpcmVkID09IG90aGVyLmlzUmVxdWlyZWQgJiYKICAgICAgICB0eXBlLmVxdWFscyhvdGhlci50eXBlLCBhc3N1bXB0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBuYW1lLmhhc2hDb2RlICogMzEgKyB0eXBlLmhhc2hDb2RlICogMzcgKyBpc1JlcXVpcmVkLmhhc2hDb2RlICogNDE7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgY29tcGFyZVRvKE5hbWVkVHlwZSBvdGhlcikgPT4gbmFtZS5jb21wYXJlVG8ob3RoZXIubmFtZSk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdE5hbWVkVHlwZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZS5hY2NlcHQodik7CiAgfQp9CgovLy8gUmVmZXJlbmNlIHRvIGEgdHlwZSB2YXJpYWJsZS4KLy8vCi8vLyBBIHR5cGUgdmFyaWFibGUgaGFzIGFuIG9wdGlvbmFsIGJvdW5kIGJlY2F1c2UgdHlwZSBwcm9tb3Rpb24gY2FuIGNoYW5nZSB0aGUKLy8vIGJvdW5kLiAgQSBib3VuZCBvZiBgbnVsbGAgaW5kaWNhdGVzIHRoYXQgdGhlIGJvdW5kIGhhcyBub3QgYmVlbiBwcm9tb3RlZCBhbmQKLy8vIGlzIHRoZSBzYW1lIGFzIHRoZSBbVHlwZVBhcmFtZXRlcl0ncyBib3VuZC4gIFRoaXMgYWxsb3dzIG9uZSB0byBkZXRlY3QKLy8vIHdoZXRoZXIgdGhlIGJvdW5kIGhhcyBiZWVuIHByb21vdGVkLiAgVGhlIGNhc2Ugb2YgcHJvbW90ZWQgYm91bmQgY2FuIGJlCi8vLyB2aWV3ZWQgYXMgcmVwcmVzZW50aW5nIGFuIGludGVyc2VjdGlvbiB0eXBlIGJldHdlZW4gdGhlIHR5cGUtcGFyYW1ldGVyIHR5cGUKLy8vIGFuZCB0aGUgcHJvbW90ZWQgYm91bmQuCmNsYXNzIFR5cGVQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIC8vLyBOdWxsYWJpbGl0eSBvZiB0aGUgdHlwZS1wYXJhbWV0ZXIgdHlwZSBvciBvZiBpdHMgcGFydCBvZiB0aGUgaW50ZXJzZWN0aW9uLgogIC8vLwogIC8vLyBEZWNsYXJhdGlvbnMgb2YgdHlwZS1wYXJhbWV0ZXIgdHlwZXMgY2FuIHNldCB0aGUgbnVsbGFiaWxpdHkgb2YgYQogIC8vLyB0eXBlLXBhcmFtZXRlciB0eXBlIHRvIFtOdWxsYWJpbGl0eS5udWxsYWJsZV0gKGlmIHRoZSBgP2AgbWFya2VyIGlzIHVzZWQpCiAgLy8vIG9yIFtOdWxsYWJpbGl0eS5sZWdhY3ldIChpZiB0aGUgdHlwZSBjb21lcyBmcm9tIGEgbGlicmFyeSBvcHRlZCBvdXQgZnJvbQogIC8vLyBOTkJEKS4gIE90aGVyd2lzZSwgaXQncyBkZWZpbmVkIGluZGlyZWN0bHkgdmlhIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUKICAvLy8gYm91bmQgb2YgW3BhcmFtZXRlcl0uICBJbiBjYXNlcyB3aGVuIHRoZSBbVHlwZVBhcmFtZXRlclR5cGVdIHJlcHJlc2VudHMgYW4KICAvLy8gaW50ZXJzZWN0aW9uIGJldHdlZW4gYSB0eXBlLXBhcmFtZXRlciB0eXBlIGFuZCBbcHJvbW90ZWRCb3VuZF0sCiAgLy8vIFt0eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5XSByZXByZXNlbnRzIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUgbGVmdC1oYW5kCiAgLy8vIHNpZGUgb2YgdGhlIGludGVyc2VjdGlvbi4KICBOdWxsYWJpbGl0eSB0eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5OwoKICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcjsKCiAgLy8vIEFuIG9wdGlvbmFsIHByb21vdGVkIGJvdW5kIG9uIHRoZSB0eXBlIHBhcmFtZXRlci4KICAvLy8KICAvLy8gJ251bGwnIGluZGljYXRlcyB0aGF0IHRoZSB0eXBlIHBhcmFtZXRlcidzIGJvdW5kIGhhcyBub3QgYmVlbiBwcm9tb3RlZCBhbmQKICAvLy8gaXMgdGhlcmVmb3JlIHRoZSBzYW1lIGFzIHRoZSBib3VuZCBvZiBbcGFyYW1ldGVyXS4KICBEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kOwoKICBUeXBlUGFyYW1ldGVyVHlwZSh0aGlzLnBhcmFtZXRlciwgdGhpcy50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5LAogICAgICBbdGhpcy5wcm9tb3RlZEJvdW5kXSk7CgogIC8vLyBDcmVhdGVzIGFuIGludGVyc2VjdGlvbiB0eXBlIGJldHdlZW4gYSB0eXBlIHBhcmFtZXRlciBhbmQgW3Byb21vdGVkQm91bmRdLgogIFR5cGVQYXJhbWV0ZXJUeXBlLmludGVyc2VjdGlvbigKICAgICAgdGhpcy5wYXJhbWV0ZXIsIHRoaXMudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSwgdGhpcy5wcm9tb3RlZEJvdW5kKTsKCiAgLy8vIENyZWF0ZXMgYSB0eXBlLXBhcmFtZXRlciB0eXBlIHRvIGJlIHVzZWQgaW4gYWxwaGEtcmVuYW1pbmcuCiAgLy8vCiAgLy8vIFRoZSBjb25zdHJ1Y3RlZCB0eXBlIG9iamVjdCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGFzIGEgdmFsdWUgaW4gYQogIC8vLyBzdWJzdGl0dXRpb24gbWFwIGNyZWF0ZWQgdG8gcGVyZm9ybSBhbiBhbHBoYS1yZW5hbWluZyBmcm9tIHBhcmFtZXRlcgogIC8vLyBbZnJvbV0gdG8gcGFyYW1ldGVyIFt0b10gb24gYSBnZW5lcmljIHR5cGUuICBUaGUgcmVzdWx0aW5nIHR5cGUtcGFyYW1ldGVyCiAgLy8vIHR5cGUgaXMgYW4gb2NjdXJyZW5jZSBvZiBbdG9dIGFzIGEgdHlwZSwgYnV0IHRoZSBudWxsYWJpbGl0eSBwcm9wZXJ0eSBpcwogIC8vLyBkZXJpdmVkIGZyb20gdGhlIGJvdW5kIG9mIFtmcm9tXS4gIEl0IGFsbG93cyB0byBhc3NpZ24gdGhlIGJvdW5kIHRvIFt0b10KICAvLy8gYWZ0ZXIgdGhlIGRlc2lyZWQgYWxwaGEtcmVuYW1pbmcgaXMgcGVyZm9ybWVkLCB3aGljaCBpcyBvZnRlbiB0aGUgY2FzZS4KICBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKFR5cGVQYXJhbWV0ZXIgZnJvbSwgVHlwZVBhcmFtZXRlciB0bykKICAgICAgOiB0aGlzKHRvLCBjb21wdXRlTnVsbGFiaWxpdHlGcm9tQm91bmQoZnJvbSkpOwoKICAvLy8gQ3JlYXRlcyBhIHR5cGUtcGFyYW1ldGVyIHR5cGUgd2l0aCBkZWZhdWx0IG51bGxhYmlsaXR5IGZvciB0aGUgbGlicmFyeS4KICAvLy8KICAvLy8gVGhlIG51bGxhYmlsaXR5IGlzIGNvbXB1dGVkIGFzIGlmIHRoZSBwcm9ncmFtbWVyIG9taXR0ZWQgdGhlIG1vZGlmaWVyLiBJdAogIC8vLyBtZWFucyB0aGF0IGluIHRoZSBvcHQtb3V0IGxpYnJhcmllcyBgTnVsbGFiaWxpdHkubGVnYWN5YCB3aWxsIGJlIHVzZWQsIGFuZAogIC8vLyBpbiBvcHQtaW4gbGlicmFyaWVzIGVpdGhlciBgTnVsbGFiaWxpdHkubm9uTnVsbGFibGVgIG9yCiAgLy8vIGBOdWxsYWJpbGl0eS51bmRldGVybWluZWRgIHdpbGwgYmUgdXNlZCwgZGVwZW5kaW5nIG9uIHRoZSBudWxsYWJpbGl0eSBvZgogIC8vLyB0aGUgYm91bmQgb2YgW3BhcmFtZXRlcl0uCiAgVHlwZVBhcmFtZXRlclR5cGUud2l0aERlZmF1bHROdWxsYWJpbGl0eUZvckxpYnJhcnkoCiAgICAgIHRoaXMucGFyYW1ldGVyLCBMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPSBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICA/IGNvbXB1dGVOdWxsYWJpbGl0eUZyb21Cb3VuZChwYXJhbWV0ZXIpCiAgICAgICAgOiBOdWxsYWJpbGl0eS5sZWdhY3k7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihEYXJ0VHlwZVZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBBIGFyZykgPT4KICAgICAgdi52aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBlcXVhbHMob3RoZXIsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAob3RoZXIgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgaWYgKG51bGxhYmlsaXR5ICE9IG90aGVyLm51bGxhYmlsaXR5KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChwYXJhbWV0ZXIgIT0gb3RoZXIucGFyYW1ldGVyKSB7CiAgICAgICAgaWYgKHBhcmFtZXRlci5wYXJlbnQgPT0gbnVsbCkgewogICAgICAgICAgLy8gRnVuY3Rpb24gdHlwZSBwYXJhbWV0ZXJzIGFyZSBhbHNvIGVxdWFsIGJ5IGFzc3VtcHRpb24uCiAgICAgICAgICBpZiAoYXNzdW1wdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWFzc3VtcHRpb25zLmlzQXNzdW1lZChwYXJhbWV0ZXIsIG90aGVyLnBhcmFtZXRlcikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgICBpZiAob3RoZXIucHJvbW90ZWRCb3VuZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKCFwcm9tb3RlZEJvdW5kLmVxdWFscyhvdGhlci5wcm9tb3RlZEJvdW5kLCBhc3N1bXB0aW9ucykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob3RoZXIucHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaW5jZSB3ZSB1c2UgYSB1bmlmaWNhdGlvbiBzdHJhdGVneSBmb3IgZnVuY3Rpb24KICAgIC8vICB0eXBlIHR5cGUgcGFyYW1ldGVyIGVxdWFsaXR5LCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGV5IGNhbiBlbmQgdXAgYmVpbmcKICAgIC8vICBlcXVhbC4gTWF5YmUgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgZXF1YWxpdHkgc3RyYXRlZ3kuCiAgICBpbnQgaGFzaCA9IHBhcmFtZXRlci5pc0Z1bmN0aW9uVHlwZVR5cGVQYXJhbWV0ZXIgPyAwIDogcGFyYW1ldGVyLmhhc2hDb2RlOwogICAgaW50IG51bGxhYmlsaXR5SGFzaCA9ICgweDMzMzMzMzMzID4+IG51bGxhYmlsaXR5LmluZGV4KSBeIDB4MzMzMzMzMzM7CiAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIG51bGxhYmlsaXR5SGFzaCkpOwogICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgKGhhc2ggXiBwcm9tb3RlZEJvdW5kLmhhc2hDb2RlKSk7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBib3VuZCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIsIGFjY291bnRpbmcgZm9yIHByb21vdGlvbnMuCiAgRGFydFR5cGUgZ2V0IGJvdW5kID0+IHByb21vdGVkQm91bmQgPz8gcGFyYW1ldGVyLmJvdW5kOwoKICAvLy8gTnVsbGFiaWxpdHkgb2YgdGhlIHR5cGUsIGNhbGN1bGF0ZWQgZnJvbSBpdHMgcGFydHMuCiAgLy8vCiAgLy8vIFtudWxsYWJpbGl0eV0gaXMgY2FsY3VsYXRlZCBmcm9tIFt0eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5XSBhbmQgdGhlCiAgLy8vIG51bGxhYmlsaXR5IG9mIFtwcm9tb3RlZEJvdW5kXSBpZiBpdCdzIHByZXNlbnQuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCBpbiB0aGUgZm9sbG93aW5nIHByb2dyYW0gW3R5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHldIG9mCiAgLy8vIGJvdGggYHhgIGFuZCBgeWAgaXMgW051bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZF0sIGJlY2F1c2UgaXQncyBjb3BpZWQgZnJvbQogIC8vLyB0aGF0IG9mIGBiYXJgIGFuZCBUIGhhcyBhIG51bGxhYmxlIHR5cGUgYXMgaXRzIGJvdW5kLiAgSG93ZXZlciwgZGVzcGl0ZQogIC8vLyBbbnVsbGFiaWxpdHldIG9mIGB4YCBpcyBbTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkXSwgW251bGxhYmlsaXR5XSBvZiBgeWAKICAvLy8gaXMgW051bGxhYmlsaXR5Lm5vbk51bGxhYmxlXSBiZWNhdXNlIG9mIGl0cyBbcHJvbW90ZWRCb3VuZF0uCiAgLy8vCiAgLy8vICAgICBjbGFzcyBBPFQgZXh0ZW5kcyBPYmplY3Q/PiB7CiAgLy8vICAgICAgIGZvbyhUIGJhcikgewogIC8vLyAgICAgICAgIHZhciB4ID0gYmFyOwogIC8vLyAgICAgICAgIGlmIChiYXIgaXMgaW50KSB7CiAgLy8vICAgICAgICAgICB2YXIgeSA9IGJhcjsKICAvLy8gICAgICAgICB9CiAgLy8vICAgICAgIH0KICAvLy8gICAgIH0KICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFiaWxpdHkgewogICAgcmV0dXJuIGdldE51bGxhYmlsaXR5KAogICAgICAgIHR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPz8gY29tcHV0ZU51bGxhYmlsaXR5RnJvbUJvdW5kKHBhcmFtZXRlciksCiAgICAgICAgcHJvbW90ZWRCb3VuZCk7CiAgfQoKICAvLy8gR2V0cyBhIG5ldyBbVHlwZVBhcmFtZXRlclR5cGVdIHdpdGggZ2l2ZW4gW3R5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHldLgogIC8vLwogIC8vLyBJbiBjb250cmFzdCB3aXRoIG90aGVyIHR5cGVzLCBbVHlwZVBhcmFtZXRlclR5cGUud2l0aE51bGxhYmlsaXR5XSBkb2Vzbid0CiAgLy8vIHNldCB0aGUgb3ZlcmFsbCBudWxsYWJpbGl0eSBvZiB0aGUgcmV0dXJuZWQgdHlwZSBidXQgc2V0cyB0aGF0IG9mIHRoZQogIC8vLyBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUuICBJbiBjYXNlIFtwcm9tb3RlZEJvdW5kXSBpcyBudWxsLAogIC8vLyBpdCBpcyBhbiBlcXVpdmFsZW50IG9mIHNldHRpbmcgdGhlIG92ZXJhbGwgbnVsbGFiaWxpdHkuCiAgQG92ZXJyaWRlCiAgVHlwZVBhcmFtZXRlclR5cGUgd2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5IHR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkpIHsKICAgIGFzc2VydChwcm9tb3RlZEJvdW5kID09IG51bGwsCiAgICAgICAgIkNhbid0IGNoYW5nZSB0aGUgbnVsbGFiaWxpdHkgYXR0cmlidXRlIG9mIGFuIGludGVyc2VjdGlvbiB0eXBlLiIpOwogICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPT0gdGhpcy50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5CiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICAgIHBhcmFtZXRlciwgdHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSwgcHJvbW90ZWRCb3VuZCk7CiAgfQoKICAvLy8gR2V0cyB0aGUgbnVsbGFiaWxpdHkgb2YgYSB0eXBlLXBhcmFtZXRlciB0eXBlIGJhc2VkIG9uIHRoZSBib3VuZC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gdGhlIGJvdW5kIG9mIHRoZSB0eXBlIHBhcmFtZXRlcgogIC8vLyBpcyBjaGFuZ2luZyBvciBpcyBiZWluZyBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgdGhlIHVwZGF0ZSBvbiBzb21lCiAgLy8vIHR5cGUtcGFyYW1ldGVyIHR5cGVzIGlzIHJlcXVpcmVkLgogIHN0YXRpYyBOdWxsYWJpbGl0eSBjb21wdXRlTnVsbGFiaWxpdHlGcm9tQm91bmQoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyKSB7CiAgICAvLyBJZiB0aGUgYm91bmQgaXMgbnVsbGFibGUgb3IgJ3VuZGV0ZXJtaW5lZCcsIGJvdGggbnVsbGFibGUgYW5kCiAgICAvLyBub24tbnVsbGFibGUgdHlwZXMgY2FuIGJlIHBhc3NlZCBpbiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVyLCBtYWtpbmcgdGhlCiAgICAvLyBjb3JyZXNwb25kaW5nIHR5cGUgcGFyYW1ldGVyIHR5cGVzICd1bmRldGVybWluZWQuJyAgT3RoZXJ3aXNlLCB0aGUKICAgIC8vIG51bGxhYmlsaXR5IG1hdGNoZXMgdGhhdCBvZiB0aGUgYm91bmQuCiAgICBEYXJ0VHlwZSBib3VuZCA9IHR5cGVQYXJhbWV0ZXIuYm91bmQ7CiAgICBpZiAoYm91bmQgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQ2FuJ3QgY29tcHV0ZSBudWxsYWJpbGl0eSBmcm9tIGFuIGFic2VudCBib3VuZC4iKTsKICAgIH0KICAgIE51bGxhYmlsaXR5IGJvdW5kTnVsbGFiaWxpdHkgPQogICAgICAgIGJvdW5kIGlzIEludmFsaWRUeXBlID8gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkIDogYm91bmQubnVsbGFiaWxpdHk7CiAgICByZXR1cm4gYm91bmROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSB8fAogICAgICAgICAgICBib3VuZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZAogICAgICAgID8gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkCiAgICAgICAgOiBib3VuZE51bGxhYmlsaXR5OwogIH0KCiAgLy8vIEdldHMgbnVsbGFiaWxpdHkgb2YgW1R5cGVQYXJhbWV0ZXJUeXBlXSBmcm9tIGFyZ3VtZW50cyB0byBpdHMgY29uc3RydWN0b3IuCiAgLy8vCiAgLy8vIFRoZSBtZXRob2QgY29tYmluZXMgW3R5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHldIGFuZCB0aGUgbnVsbGFiaWxpdHkgb2YKICAvLy8gW3Byb21vdGVkQm91bmRdIHRvIHlpZWxkIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUuICBJZiB0aGUKICAvLy8gcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBpbnRlcnNlY3Rpb24gaXMgYWJzZW50ICh0aGF0IGlzLCBpZiBbcHJvbW90ZWRCb3VuZF0KICAvLy8gaXMgbnVsbCksIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUgaXMgc2ltcGx5CiAgLy8vIFt0eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5XS4KICBzdGF0aWMgTnVsbGFiaWxpdHkgZ2V0TnVsbGFiaWxpdHkoCiAgICAgIE51bGxhYmlsaXR5IHR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHksIERhcnRUeXBlIHByb21vdGVkQm91bmQpIHsKICAgIC8vIElmIHByb21vdGVkQm91bmQgaXMgbnVsbCwgZ2V0TnVsbGFiaWxpdHkgc2ltcGx5IHJldHVybnMgdGhlIG51bGxhYmlsaXR5CiAgICAvLyBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIgdHlwZS4KICAgIE51bGxhYmlsaXR5IGxoc051bGxhYmlsaXR5ID0gdHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eTsKICAgIGlmIChwcm9tb3RlZEJvdW5kID09IG51bGwpIHsKICAgICAgcmV0dXJuIGxoc051bGxhYmlsaXR5OwogICAgfQoKICAgIC8vIElmIHByb21vdGVkQm91bmQgaXNuJ3QgbnVsbCwgZ2V0TnVsbGFiaWxpdHkgcmV0dXJucyB0aGUgbnVsbGFiaWxpdHkgb2YgYW4KICAgIC8vIGludGVyc2VjdGlvbiBvZiB0aGUgbGVmdC1oYW5kIHNpZGUgKHJlZmVycmVkIHRvIGFzIExIUyBiZWxvdykgYW5kIHRoZQogICAgLy8gcmlnaHQtaGFuZCBzaWRlIChyZWZlcnJlZCB0byBhcyBSSFMgYmVsb3cpLiAgTm90ZSB0aGF0IFJIUyBpcyBhbHdheXMgYQogICAgLy8gc3VidHlwZSBvZiB0aGUgYm91bmQgb2YgdGhlIHR5cGUgcGFyYW1ldGVyLgoKICAgIC8vIFRoZSBjb2RlIGJlbG93IGltcGxlbWVudHMgdGhlIHJ1bGUgZm9yIHRoZSBudWxsYWJpbGl0eSBvZiBhbiBpbnRlcnNlY3Rpb24KICAgIC8vIHR5cGUgYXMgcGVyIHRoZSBmb2xsb3dpbmcgdGFibGU6CiAgICAvLwogICAgLy8gfCBMSFMgXCBSSFMgfCAgISAgfCAgPyAgfCAgKiAgfCAgJSAgfAogICAgLy8gfC0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfAogICAgLy8gfCAgICAgISAgICAgfCAgISAgfCBOL0EgfCBOL0EgfCAgISAgfAogICAgLy8gfCAgICAgPyAgICAgfCBOL0EgfCBOL0EgfCBOL0EgfCBOL0EgfAogICAgLy8gfCAgICAgKiAgICAgfCBOL0EgfCBOL0EgfCAgKiAgfCBOL0EgfAogICAgLy8gfCAgICAgJSAgICAgfCAgISAgfCAgJSAgfCBOL0EgfCAgJSAgfAogICAgLy8KICAgIC8vIEluIHRoZSB0YWJsZSwgTEhTIGNvcnJlc3BvbmRzIHRvIGxoc051bGxhYmlsaXR5IGluIHRoZSBjb2RlIGJlbG93OyBSSFMKICAgIC8vIGNvcnJlc3BvbmRzIHRvIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHk7ICEsID8sICosIGFuZCAlIGNvcnJlc3BvbmQgdG8KICAgIC8vIG5vbk51bGxhYmxlLCBudWxsYWJsZSwgbGVnYWN5LCBhbmQgdW5kZXRlcm1pbmVkIHZhbHVlcyBvZiB0aGUgTnVsbGFiaWxpdHkKICAgIC8vIGVudW0uCiAgICAvLwogICAgLy8gV2hlbmV2ZXIgdGhlcmUncyBOL0EgaW4gdGhlIHRhYmxlLCBpdCBtZWFucyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nCiAgICAvLyBjb21iaW5hdGlvbiBvZiB0aGUgTEhTIGFuZCBSSFMgbnVsbGFiaWxpdHkgaXMgbm90IHBvc3NpYmxlIHdoZW4gY29tcGlsaW5nCiAgICAvLyBmcm9tIERhcnQgc291cmNlIGZpbGVzLCBzbyB3ZSBjYW4gZGVmaW5lIGl0IHRvIGJlIHdoYXRldmVyIGlzIGZhc3RlciBhbmQKICAgIC8vIG1vcmUgY29udmVuaWVudCB0byBpbXBsZW1lbnQuICBUaGUgdmVyaWZpZXIgc2hvdWxkIGNoZWNrIHRoYXQgdGhlIGNhc2VzCiAgICAvLyBtYXJrZWQgYXMgTi9BIG5ldmVyIG9jY3VyIGluIHRoZSBvdXRwdXQgb2YgdGhlIENGRS4KICAgIC8vCiAgICAvLyBUaGUgY29kZSBiZWxvdyB1c2VzIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIG9mIHRoZSB0YWJsZSBmdW5jdGlvbjoKICAgIC8vCiAgICAvLyB8IExIUyBcIFJIUyB8ICAhICB8ICA/ICB8ICAqICB8ICAlICB8CiAgICAvLyB8LS0tLS0tLS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18CiAgICAvLyB8ICAgICAhICAgICB8ICAhICB8ICAhICB8ICAhICB8ICAhICB8CiAgICAvLyB8ICAgICA/ICAgICB8ICAhICB8ICAqICB8ICAqICB8ICAlICB8CiAgICAvLyB8ICAgICAqICAgICB8ICAhICB8ICAqICB8ICAqICB8ICAlICB8CiAgICAvLyB8ICAgICAlICAgICB8ICAhICB8ICAlICB8ICAlICB8ICAlICB8CgogICAgLy8gSW50ZXJzZWN0aW9uIHdpdGggYSBub24tbnVsbGFibGUgdHlwZSBhbHdheXMgeWllbGRzIGEgbm9uLW51bGxhYmxlIHR5cGUsCiAgICAvLyBhcyBpdCdzIHRoZSBtb3N0IHJlc3RyaWN0aXZlIGtpbmQgb2YgdHlwZXMuCiAgICBpZiAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUgfHwKICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKICAgIH0KCiAgICAvLyBJZiB0aGUgbnVsbGFiaWxpdHkgb2YgTEhTIGlzICd1bmRldGVybWluZWQnLCB0aGUgbnVsbGFiaWxpdHkgb2YgdGhlCiAgICAvLyBpbnRlcnNlY3Rpb24gaXMgYWxzbyAndW5kZXRlcm1pbmVkJyBpZiBSSFMgaXMgJ3VuZGV0ZXJtaW5lZCcgb3IgbnVsbGFibGUuCiAgICAvLwogICAgLy8gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgogICAgLy8KICAgIC8vICAgICBjbGFzcyBBPFggZXh0ZW5kcyBPYmplY3Q/LCBZIGV4dGVuZHMgWD4gewogICAgLy8gICAgICAgZm9vKFggeCkgewogICAgLy8gICAgICAgICBpZiAoeCBpcyBZKSB7CiAgICAvLyAgICAgICAgICAgeCA9IG51bGw7ICAgICAvLyBDb21waWxlLXRpbWUgZXJyb3IuICBDb25zaWRlciBYID0gWSA9IGludC4KICAgIC8vICAgICAgICAgICBPYmplY3QgYSA9IHg7IC8vIENvbXBpbGUtdGltZSBlcnJvci4gIENvbnNpZGVyIFggPSBZID0gaW50Py4KICAgIC8vICAgICAgICAgfQogICAgLy8gICAgICAgICBpZiAoeCBpcyBpbnQ/KSB7CiAgICAvLyAgICAgICAgICAgeCA9IG51bGw7ICAgICAvLyBDb21waWxlLXRpbWUgZXJyb3IuICBDb25zaWRlciBYID0gaW50LgogICAgLy8gICAgICAgICAgIE9iamVjdCBiID0geDsgLy8gQ29tcGlsZS10aW1lIGVycm9yLiAgQ29uc2lkZXIgWCA9IGludD8uCiAgICAvLyAgICAgICAgIH0KICAgIC8vICAgICAgIH0KICAgIC8vICAgICB9CiAgICBpZiAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkIHx8CiAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpIHsKICAgICAgcmV0dXJuIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDsKICAgIH0KCiAgICByZXR1cm4gTnVsbGFiaWxpdHkubGVnYWN5OwogIH0KfQoKLy8vIFZhbHVlIHNldCBmb3IgdmFyaWFuY2Ugb2YgYSB0eXBlIHBhcmFtZXRlciBYIGluIGEgdHlwZSB0ZXJtIFQuCmNsYXNzIFZhcmlhbmNlIHsKICAvLy8gVXNlZCB3aGVuIFggZG9lcyBub3Qgb2NjdXIgZnJlZSBpbiBULgogIHN0YXRpYyBjb25zdCBpbnQgdW5yZWxhdGVkID0gMDsKCiAgLy8vIFVzZWQgd2hlbiBYIG9jY3VycyBmcmVlIGluIFQsIGFuZCBVIDw6IFYgaW1wbGllcyBbVS9YXVQgPDogW1YvWF1ULgogIHN0YXRpYyBjb25zdCBpbnQgY292YXJpYW50ID0gMTsKCiAgLy8vIFVzZWQgd2hlbiBYIG9jY3VycyBmcmVlIGluIFQsIGFuZCBVIDw6IFYgaW1wbGllcyBbVi9YXVQgPDogW1UvWF1ULgogIHN0YXRpYyBjb25zdCBpbnQgY29udHJhdmFyaWFudCA9IDI7CgogIC8vLyBVc2VkIHdoZW4gdGhlcmUgZXhpc3RzIGEgcGFpciBVIGFuZCBWIHN1Y2ggdGhhdCBVIDw6IFYsIGJ1dCBbVS9YXVQgYW5kCiAgLy8vIFtWL1hdVCBhcmUgaW5jb21wYXJhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgaW52YXJpYW50ID0gMzsKCiAgLy8vIFZhcmlhbmNlIHZhbHVlcyBmb3JtIGEgbGF0dGljZSB3aGVyZSBbdW5yZWxhdGVkXSBpcyB0aGUgdG9wLCBbaW52YXJpYW50XQogIC8vLyBpcyB0aGUgYm90dG9tLCBhbmQgW2NvdmFyaWFudF0gYW5kIFtjb250cmF2YXJpYW50XSBhcmUgaW5jb21wYXJhYmxlLgogIC8vLyBbbWVldF0gY2FsY3VsYXRlcyB0aGUgbWVldCBvZiB0d28gZWxlbWVudHMgb2Ygc3VjaCBsYXR0aWNlLiAgSXQgY2FuIGJlCiAgLy8vIHVzZWQsIGZvciBleGFtcGxlLCB0byBjYWxjdWxhdGUgdGhlIHZhcmlhbmNlIG9mIGEgdHlwZWRlZiB0eXBlIHBhcmFtZXRlcgogIC8vLyBpZiBpdCdzIGVuY291bnRlcmVkIG9uIHRoZSByLmgucy4gb2YgdGhlIHR5cGVkZWYgbXVsdGlwbGUgdGltZXMuCiAgc3RhdGljIGludCBtZWV0KGludCBhLCBpbnQgYikgPT4gYSB8IGI7CgogIC8vLyBDb21iaW5lcyB2YXJpYW5jZXMgb2YgWCBpbiBUIGFuZCBZIGluIFMgaW50byB2YXJpYW5jZSBvZiBYIGluIFtZL1RdUy4KICAvLy8KICAvLy8gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlczoKICAvLy8KICAvLy8gKiB2YXJpYW5jZSBvZiBYIGluIEZ1bmN0aW9uKFgpIGlzIFtjb250cmF2YXJpYW50XSwgdmFyaWFuY2Ugb2YgWSBpbgogIC8vLyBMaXN0PFk+IGlzIFtjb3ZhcmlhbnRdLCBzbyB2YXJpYW5jZSBvZiBYIGluIExpc3Q8RnVuY3Rpb24oWCk+IGlzCiAgLy8vIFtjb250cmF2YXJpYW50XTsKICAvLy8KICAvLy8gKiB2YXJpYW5jZSBvZiBYIGluIExpc3Q8WD4gaXMgW2NvdmFyaWFudF0sIHZhcmlhbmNlIG9mIFkgaW4gRnVuY3Rpb24oWSkgaXMKICAvLy8gW2NvbnRyYXZhcmlhbnRdLCBzbyB2YXJpYW5jZSBvZiBYIGluIEZ1bmN0aW9uKExpc3Q8WD4pIGlzIFtjb250cmF2YXJpYW50XTsKICAvLy8KICAvLy8gKiB2YXJpYW5jZSBvZiBYIGluIEZ1bmN0aW9uKFgpIGlzIFtjb250cmF2YXJpYW50XSwgdmFyaWFuY2Ugb2YgWSBpbgogIC8vLyBGdW5jdGlvbihZKSBpcyBbY29udHJhdmFyaWFudF0sIHNvIHZhcmlhbmNlIG9mIFggaW4gRnVuY3Rpb24oRnVuY3Rpb24oWCkpCiAgLy8vIGlzIFtjb3ZhcmlhbnRdOwogIC8vLwogIC8vLyAqIGxldCB0aGUgZm9sbG93aW5nIGJlIGRlY2xhcmVkOgogIC8vLwogIC8vLyAgICAgdHlwZWRlZiBGPFo+ID0gRnVuY3Rpb24oKTsKICAvLy8KICAvLy8gdGhlbiB2YXJpYW5jZSBvZiBYIGluIEY8WD4gaXMgW3VucmVsYXRlZF0sIHZhcmlhbmNlIG9mIFkgaW4gTGlzdDxZPiBpcwogIC8vLyBbY292YXJpYW50XSwgc28gdmFyaWFuY2Ugb2YgWCBpbiBMaXN0PEY8WD4+IGlzIFt1bnJlbGF0ZWRdOwogIC8vLwogIC8vLyAqIGxldCB0aGUgZm9sbG93aW5nIGJlIGRlY2xhcmVkOgogIC8vLwogIC8vLyAgICAgdHlwZWRlZiBHPFo+ID0gWiBGdW5jdGlvbihaKTsKICAvLy8KICAvLy8gdGhlbiB2YXJpYW5jZSBvZiBYIGluIExpc3Q8WD4gaXMgW2NvdmFyaWFudF0sIHZhcmlhbmNlIG9mIFkgaW4gRzxZPiBpcwogIC8vLyBbaW52YXJpYW50XSwgc28gdmFyaWFuY2Ugb2YgYFhgIGluIGBHPExpc3Q8WD4+YCBpcyBbaW52YXJpYW50XS4KICBzdGF0aWMgaW50IGNvbWJpbmUoaW50IGEsIGludCBiKSB7CiAgICBpZiAoYSA9PSB1bnJlbGF0ZWQgfHwgYiA9PSB1bnJlbGF0ZWQpIHJldHVybiB1bnJlbGF0ZWQ7CiAgICBpZiAoYSA9PSBpbnZhcmlhbnQgfHwgYiA9PSBpbnZhcmlhbnQpIHJldHVybiBpbnZhcmlhbnQ7CiAgICByZXR1cm4gYSA9PSBiID8gY292YXJpYW50IDogY29udHJhdmFyaWFudDsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW2FdIGlzIGdyZWF0ZXIgdGhhbiAoYWJvdmUpIFtiXSBpbiB0aGUgcGFydGlhbCBvcmRlcgogIC8vLyBpbmR1Y2VkIGJ5IHRoZSB2YXJpYW5jZSBsYXR0aWNlLgogIHN0YXRpYyBib29sIGdyZWF0ZXJUaGFuKGludCBhLCBpbnQgYikgewogICAgcmV0dXJuIGdyZWF0ZXJUaGFuT3JFcXVhbChhLCBiKSAmJiBhICE9IGI7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFthXSBpcyBncmVhdGVyIHRoYW4gKGFib3ZlKSBvciBlcXVhbCB0byBbYl0gaW4gdGhlCiAgLy8vIHBhcnRpYWwgb3JkZXIgaW5kdWNlZCBieSB0aGUgdmFyaWFuY2UgbGF0dGljZS4KICBzdGF0aWMgYm9vbCBncmVhdGVyVGhhbk9yRXF1YWwoaW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gbWVldChhLCBiKSA9PSBiOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBbYV0gaXMgbGVzcyB0aGFuIChiZWxvdykgW2JdIGluIHRoZSBwYXJ0aWFsIG9yZGVyCiAgLy8vIGluZHVjZWQgYnkgdGhlIHZhcmlhbmNlIGxhdHRpY2UuCiAgc3RhdGljIGJvb2wgbGVzc1RoYW4oaW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gbGVzc1RoYW5PckVxdWFsKGEsIGIpICYmIGEgIT0gYjsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW2FdIGlzIGxlc3MgdGhhbiAoYmVsb3cpIG9yIGVxdWFsIHRvIFtiXSBpbiB0aGUKICAvLy8gcGFydGlhbCBvcmRlciBpbmR1Y2VkIGJ5IHRoZSB2YXJpYW5jZSBsYXR0aWNlLgogIHN0YXRpYyBib29sIGxlc3NUaGFuT3JFcXVhbChpbnQgYSwgaW50IGIpIHsKICAgIHJldHVybiBtZWV0KGEsIGIpID09IGE7CiAgfQoKICBzdGF0aWMgaW50IGZyb21TdHJpbmcoU3RyaW5nIHZhcmlhbmNlKSB7CiAgICBpZiAodmFyaWFuY2UgPT0gImluIikgewogICAgICByZXR1cm4gY29udHJhdmFyaWFudDsKICAgIH0gZWxzZSBpZiAodmFyaWFuY2UgPT0gImlub3V0IikgewogICAgICByZXR1cm4gaW52YXJpYW50OwogICAgfSBlbHNlIGlmICh2YXJpYW5jZSA9PSAib3V0IikgewogICAgICByZXR1cm4gY292YXJpYW50OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVucmVsYXRlZDsKICAgIH0KICB9CgogIC8vIFJldHVybnMgdGhlIGtleXdvcmQgbGV4ZW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFyaWFuY2UgZ2l2ZW4uCiAgc3RhdGljIFN0cmluZyBrZXl3b3JkU3RyaW5nKGludCB2YXJpYW5jZSkgewogICAgc3dpdGNoICh2YXJpYW5jZSkgewogICAgICBjYXNlIFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQ6CiAgICAgICAgcmV0dXJuICdpbic7CiAgICAgIGNhc2UgVmFyaWFuY2UuaW52YXJpYW50OgogICAgICAgIHJldHVybiAnaW5vdXQnOwogICAgICBjYXNlIFZhcmlhbmNlLmNvdmFyaWFudDoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gJ291dCc7CiAgICB9CiAgfQp9CgovLy8gRGVjbGFyYXRpb24gb2YgYSB0eXBlIHZhcmlhYmxlLgovLy8KLy8vIFR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBpbiBhIFtDbGFzc10gb3IgW0Z1bmN0aW9uTm9kZV0gYXJlIHBhcnQgb2YgdGhlIEFTVCwKLy8vIGhhdmUgYSBwYXJlbnQgcG9pbnRlciB0byBpdHMgZGVjbGFyaW5nIGNsYXNzIG9yIGZ1bmN0aW9uLCBhbmQgd2lsbCBiZSBzZWVuCi8vLyBieSB0cmVlIHZpc2l0b3JzLgovLy8KLy8vIFR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBieSBhIFtGdW5jdGlvblR5cGVdIGFyZSBvcnBoYW5zIGFuZCBoYXZlIGEgYG51bGxgCi8vLyBwYXJlbnQgcG9pbnRlci4gIFtUeXBlUGFyYW1ldGVyXSBvYmplY3RzIHNob3VsZCBub3QgYmUgc2hhcmVkIGJldHdlZW4KLy8vIGRpZmZlcmVudCBbRnVuY3Rpb25UeXBlXSBvYmplY3RzLgpjbGFzcyBUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVHJlZU5vZGUgewogIGludCBmbGFncyA9IDA7CgogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIGFubm90YXRpb25zIG9uIHRoZSB0eXBlIHBhcmFtZXRlci4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBhbiBpbW11dGFibGUgZW1wdHkgbGlzdC4gVXNlIFthZGRBbm5vdGF0aW9uXSB0byBhZGQKICAvLy8gYW5ub3RhdGlvbnMgaWYgbmVlZGVkLgogIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKCiAgU3RyaW5nIG5hbWU7IC8vIENvc21ldGljIG5hbWUuCgogIC8vLyBUaGUgYm91bmQgb24gdGhlIHR5cGUgdmFyaWFibGUuCiAgLy8vCiAgLy8vIFNob3VsZCBub3QgYmUgbnVsbCBleGNlcHQgdGVtcG9yYXJpbHkgZHVyaW5nIElSIGNvbnN0cnVjdGlvbi4gIFNob3VsZAogIC8vLyBiZSBzZXQgdG8gdGhlIHJvb3QgY2xhc3MgZm9yIHR5cGUgcGFyYW1ldGVycyB3aXRob3V0IGFuIGV4cGxpY2l0IGJvdW5kLgogIERhcnRUeXBlIGJvdW5kOwoKICAvLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHR5cGUgdmFyaWFibGUuIEl0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBtaXNzaW5nIHR5cGUgYXJndW1lbnQgaW4gdHlwZSBhbm5vdGF0aW9ucyBhbmQgYXMgdGhlCiAgLy8vIGZhbGwtYmFjayB0eXBlIHZhbHVlIGluIHR5cGUgaW5mZXJlbmNlIGF0IGNvbXBpbGUgdGltZS4gQXQgcnVuIHRpbWUsCiAgLy8vIFtkZWZhdWx0VHlwZV0gaXMgdXNlZCBieSB0aGUgYmFja2VuZHMgaW4gcGxhY2Ugb2YgdGhlIG1pc3NpbmcgdHlwZQogIC8vLyBhcmd1bWVudCBvZiBhIGR5bmFtaWMgaW52b2NhdGlvbiBvZiBhIGdlbmVyaWMgZnVuY3Rpb24uCiAgRGFydFR5cGUgZGVmYXVsdFR5cGU7CgogIC8vLyBEZXNjcmliZXMgdmFyaWFuY2Ugb2YgdGhlIHR5cGUgcGFyYW1ldGVyIHcuci50LiBkZWNsYXJhdGlvbiBvbiB3aGljaCBpdCBpcwogIC8vLyBkZWZpbmVkLiBGb3IgY2xhc3NlcywgaWYgdmFyaWFuY2UgaXMgbm90IGV4cGxpY2l0bHkgc2V0LCB0aGUgdHlwZQogIC8vLyBwYXJhbWV0ZXIgaGFzIGxlZ2FjeSBjb3ZhcmlhbmNlIGRlZmluZWQgYnkgW2lzTGVnYWN5Q292YXJpYW50XSB3aGljaAogIC8vLyBvbiB0aGUgbGF0dGljZSBpcyBlcXVpdmFsZW50IHRvIFtWYXJpYW5jZS5jb3ZhcmlhbnRdLiBGb3IgdHlwZWRlZnMsIGl0J3MKICAvLy8gdGhlIHZhcmlhbmNlIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgaW4gdGhlIHR5cGUgdGVybSBvbiB0aGUgci5oLnMuIG9mIHRoZQogIC8vLyB0eXBlZGVmLgogIGludCBfdmFyaWFuY2U7CgogIGludCBnZXQgdmFyaWFuY2UgPT4gX3ZhcmlhbmNlID8/IFZhcmlhbmNlLmNvdmFyaWFudDsKCiAgdm9pZCBzZXQgdmFyaWFuY2UoaW50IG5ld1ZhcmlhbmNlKSA9PiBfdmFyaWFuY2UgPSBuZXdWYXJpYW5jZTsKCiAgYm9vbCBnZXQgaXNMZWdhY3lDb3ZhcmlhbnQgPT4gX3ZhcmlhbmNlID09IG51bGw7CgogIHN0YXRpYyBjb25zdCBpbnQgbGVnYWN5Q292YXJpYW50U2VyaWFsaXphdGlvbk1hcmtlciA9IDQ7CgogIFR5cGVQYXJhbWV0ZXIoW3RoaXMubmFtZSwgdGhpcy5ib3VuZCwgdGhpcy5kZWZhdWx0VHlwZV0pOwoKICAvLyBNdXN0IG1hdGNoIHNlcmlhbGl6ZWQgYml0IHBvc2l0aW9ucy4KICBzdGF0aWMgY29uc3QgaW50IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCA9IDEgPDwgMDsKCiAgLy8vIElmIHRoaXMgW1R5cGVQYXJhbWV0ZXJdIGlzIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBnZW5lcmljIG1ldGhvZCwgaW5kaWNhdGVzCiAgLy8vIHdoZXRoZXIgdGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjb250YWluIGEgcnVudGltZSB0eXBlIGNoZWNrIHRvCiAgLy8vIGRlYWwgd2l0aCBnZW5lcmljIGNvdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFdoZW4gYHRydWVgLCBydW50aW1lIGNoZWNrcyBtYXkgbmVlZCB0byBiZSBwZXJmb3JtZWQ7IHNlZQogIC8vLyBbRGlzcGF0Y2hDYXRlZ29yeV0gZm9yIGRldGFpbHMuCiAgYm9vbCBnZXQgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9PiBmbGFncyAmIEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCAhPSAwOwoKICB2b2lkIHNldCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gdmFsdWUKICAgICAgICA/IChmbGFncyB8IEZsYWdHZW5lcmljQ292YXJpYW50SW1wbCkKICAgICAgICA6IChmbGFncyAmIH5GbGFnR2VuZXJpY0NvdmFyaWFudEltcGwpOwogIH0KCiAgdm9pZCBhZGRBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKICAgICAgYW5ub3RhdGlvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIH0KICAgIGFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uLi5wYXJlbnQgPSB0aGlzKTsKICB9CgogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRUeXBlUGFyYW1ldGVyKHRoaXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdmlzaXRMaXN0KGFubm90YXRpb25zLCB2KTsKICAgIGJvdW5kLmFjY2VwdCh2KTsKICAgIGRlZmF1bHRUeXBlPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KGFubm90YXRpb25zLCB2LCB0aGlzKTsKICAgIGJvdW5kID0gdi52aXNpdERhcnRUeXBlKGJvdW5kKTsKICAgIGlmIChkZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgIGRlZmF1bHRUeXBlID0gdi52aXNpdERhcnRUeXBlKGRlZmF1bHRUeXBlKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGEgcG9zc2libHkgc3ludGhlc2l6ZWQgbmFtZSBmb3IgdGhpcyB0eXBlIHBhcmFtZXRlciwgY29uc2lzdGVudAogIC8vLyB3aXRoIHRoZSBuYW1lcyB1c2VkIGFjcm9zcyBhbGwgW3RvU3RyaW5nXSBjYWxscy4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBkZWJ1Z1F1YWxpZmllZFR5cGVQYXJhbWV0ZXJOYW1lKHRoaXMpOwoKICBib29sIGdldCBpc0Z1bmN0aW9uVHlwZVR5cGVQYXJhbWV0ZXIgPT4gcGFyZW50ID09IG51bGw7Cn0KCmNsYXNzIFN1cGVydHlwZSBleHRlbmRzIE5vZGUgewogIFJlZmVyZW5jZSBjbGFzc05hbWU7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKCiAgU3VwZXJ0eXBlKENsYXNzIGNsYXNzTm9kZSwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cykKICAgICAgOiB0aGlzLmJ5UmVmZXJlbmNlKGdldENsYXNzUmVmZXJlbmNlKGNsYXNzTm9kZSksIHR5cGVBcmd1bWVudHMpOwoKICBTdXBlcnR5cGUuYnlSZWZlcmVuY2UodGhpcy5jbGFzc05hbWUsIHRoaXMudHlwZUFyZ3VtZW50cyk7CgogIENsYXNzIGdldCBjbGFzc05vZGUgPT4gY2xhc3NOYW1lLmFzQ2xhc3M7CgogIFIgYWNjZXB0PFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN1cGVydHlwZSh0aGlzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNsYXNzTm9kZS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB2aXNpdExpc3QodHlwZUFyZ3VtZW50cywgdik7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBhc0ludGVyZmFjZVR5cGUgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNsYXNzTm9kZSwgTnVsbGFiaWxpdHkubGVnYWN5LCB0eXBlQXJndW1lbnRzKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAob3RoZXIgaXMgU3VwZXJ0eXBlKSB7CiAgICAgIGlmIChjbGFzc05hbWUgIT0gb3RoZXIuY2xhc3NOYW1lKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSBvdGhlci50eXBlQXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAodHlwZUFyZ3VtZW50c1tpXSAhPSBvdGhlci50eXBlQXJndW1lbnRzW2ldKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCBoYXNoID0gMHgzZmZmZmZmZiAmIGNsYXNzTmFtZS5oYXNoQ29kZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyAoaGFzaCBeIHR5cGVBcmd1bWVudHNbaV0uaGFzaENvZGUpKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVFMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphYnN0cmFjdCBjbGFzcyBDb25zdGFudCBleHRlbmRzIE5vZGUgewogIC8vLyBDYWxscyB0aGUgYHZpc2l0KkNvbnN0YW50UmVmZXJlbmNlKClgIG1ldGhvZCBvbiB2aXNpdG9yIFt2XSBmb3IgYWxsCiAgLy8vIGNvbnN0YW50cyByZWZlcmVuY2VkIGluIHRoaXMgY29uc3RhbnQuCiAgLy8vCiAgLy8vIChOb3RlIHRoYXQgYSBjb25zdGFudCBjYW4gYmUgc2VlbiBhcyBhIERBRyAoZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCkgYW5kCiAgLy8vICBub3QgYSB0cmVlISkKICB2aXNpdENoaWxkcmVuKFZpc2l0b3Igdik7CgogIC8vLyBDYWxscyB0aGUgYHZpc2l0KkNvbnN0YW50KClgIG1ldGhvZCBvbiB0aGUgdmlzaXRvciBbdl0uCiAgUiBhY2NlcHQ8Uj4oQ29uc3RhbnRWaXNpdG9yPFI+IHYpOwoKICAvLy8gQ2FsbHMgdGhlIGB2aXNpdCpDb25zdGFudFJlZmVyZW5jZSgpYCBtZXRob2Qgb24gdGhlIHZpc2l0b3IgW3ZdLgogIFIgYWNjZXB0UmVmZXJlbmNlPFI+KFZpc2l0b3I8Uj4gdik7CgogIC8vLyBUaGUgS2VybmVsIEFTVCB3aWxsIHJlZmVyZW5jZSBbQ29uc3RhbnRdcyB2aWEgW0NvbnN0YW50RXhwcmVzc2lvbl1zLiAgVGhlCiAgLy8vIGNvbnN0YW50cyBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIGNhbm9uaWNhbGl6ZWQsIGJ1dCB0aGV5IGhhdmUgdG8gYmUgZGVlcGx5CiAgLy8vIGNvbXBhcmFibGUgdmlhIGhhc2hDb2RlLz09IQogIGludCBnZXQgaGFzaENvZGU7CiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpOwoKICAvLy8gR2V0cyB0aGUgdHlwZSBvZiB0aGlzIGNvbnN0YW50LgogIERhcnRUeXBlIGdldFR5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCk7CgogIEV4cHJlc3Npb24gYXNFeHByZXNzaW9uKCkgewogICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24odGhpcyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBQcmltaXRpdmVDb25zdGFudDxUPiBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBUIHZhbHVlOwoKICBQcmltaXRpdmVDb25zdGFudCh0aGlzLnZhbHVlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR2YWx1ZSc7CgogIGludCBnZXQgaGFzaENvZGUgPT4gdmFsdWUuaGFzaENvZGU7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBQcmltaXRpdmVDb25zdGFudDxUPiAmJiBvdGhlci52YWx1ZSA9PSB2YWx1ZTsKfQoKY2xhc3MgTnVsbENvbnN0YW50IGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnQ8TnVsbD4gewogIE51bGxDb25zdGFudCgpIDogc3VwZXIobnVsbCk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIFIgYWNjZXB0PFI+KENvbnN0YW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0TnVsbENvbnN0YW50KHRoaXMpOwogIFIgYWNjZXB0UmVmZXJlbmNlPFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdE51bGxDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5udWxsVHlwZTsKfQoKY2xhc3MgQm9vbENvbnN0YW50IGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnQ8Ym9vbD4gewogIEJvb2xDb25zdGFudChib29sIHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgUiBhY2NlcHQ8Uj4oQ29uc3RhbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRCb29sQ29uc3RhbnQodGhpcyk7CiAgUiBhY2NlcHRSZWZlcmVuY2U8Uj4oVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0Qm9vbENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5ib29sUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKfQoKLy8vIEFuIGludGVnZXIgY29uc3RhbnQgb24gYSBub24tSlMgdGFyZ2V0LgpjbGFzcyBJbnRDb25zdGFudCBleHRlbmRzIFByaW1pdGl2ZUNvbnN0YW50PGludD4gewogIEludENvbnN0YW50KGludCB2YWx1ZSkgOiBzdXBlcih2YWx1ZSk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIFIgYWNjZXB0PFI+KENvbnN0YW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SW50Q29uc3RhbnQodGhpcyk7CiAgUiBhY2NlcHRSZWZlcmVuY2U8Uj4oVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0SW50Q29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIERhcnRUeXBlIGdldFR5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmludFJhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7Cn0KCi8vLyBBIGRvdWJsZSBjb25zdGFudCBvbiBhIG5vbi1KUyB0YXJnZXQgb3IgYW55IG51bWVyaWMgY29uc3RhbnQgb24gYSBKUyB0YXJnZXQuCmNsYXNzIERvdWJsZUNvbnN0YW50IGV4dGVuZHMgUHJpbWl0aXZlQ29uc3RhbnQ8ZG91YmxlPiB7CiAgRG91YmxlQ29uc3RhbnQoZG91YmxlIHZhbHVlKSA6IHN1cGVyKHZhbHVlKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHt9CiAgUiBhY2NlcHQ8Uj4oQ29uc3RhbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXREb3VibGVDb25zdGFudCh0aGlzKTsKICBSIGFjY2VwdFJlZmVyZW5jZTxSPihWaXNpdG9yPFI+IHYpID0+IHYudmlzaXREb3VibGVDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiB2YWx1ZS5pc05hTiA/IDE5OSA6IHN1cGVyLmhhc2hDb2RlOwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBEb3VibGVDb25zdGFudCAmJiBpZGVudGljYWwodmFsdWUsIG90aGVyLnZhbHVlKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuZG91YmxlUmF3VHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKfQoKY2xhc3MgU3RyaW5nQ29uc3RhbnQgZXh0ZW5kcyBQcmltaXRpdmVDb25zdGFudDxTdHJpbmc+IHsKICBTdHJpbmdDb25zdGFudChTdHJpbmcgdmFsdWUpIDogc3VwZXIodmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQogIFIgYWNjZXB0PFI+KENvbnN0YW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0U3RyaW5nQ29uc3RhbnQodGhpcyk7CiAgUiBhY2NlcHRSZWZlcmVuY2U8Uj4oVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIERhcnRUeXBlIGdldFR5cGUoU3RhdGljVHlwZUNvbnRleHQgY29udGV4dCkgPT4KICAgICAgY29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLnN0cmluZ1Jhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7Cn0KCmNsYXNzIFN5bWJvbENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIFJlZmVyZW5jZSBsaWJyYXJ5UmVmZXJlbmNlOwoKICBTeW1ib2xDb25zdGFudCh0aGlzLm5hbWUsIHRoaXMubGlicmFyeVJlZmVyZW5jZSk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7fQoKICBSIGFjY2VwdDxSPihDb25zdGFudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN5bWJvbENvbnN0YW50KHRoaXMpOwogIFIgYWNjZXB0UmVmZXJlbmNlPFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFN5bWJvbENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gbGlicmFyeVJlZmVyZW5jZSAhPSBudWxsCiAgICAgICAgPyAnIyR7bGlicmFyeVJlZmVyZW5jZS5hc0xpYnJhcnkuaW1wb3J0VXJpfTo6JG5hbWUnCiAgICAgICAgOiAnIyRuYW1lJzsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gX0hhc2guaGFzaDIobmFtZSwgbGlicmFyeVJlZmVyZW5jZSk7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBpZGVudGljYWwodGhpcywgb3RoZXIpIHx8CiAgICAgIChvdGhlciBpcyBTeW1ib2xDb25zdGFudCAmJgogICAgICAgICAgb3RoZXIubmFtZSA9PSBuYW1lICYmCiAgICAgICAgICBvdGhlci5saWJyYXJ5UmVmZXJlbmNlID09IGxpYnJhcnlSZWZlcmVuY2UpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5zeW1ib2xSYXdUeXBlKGNvbnRleHQubm9uTnVsbGFibGUpOwp9CgpjbGFzcyBNYXBDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBEYXJ0VHlwZSBrZXlUeXBlOwogIGZpbmFsIERhcnRUeXBlIHZhbHVlVHlwZTsKICBmaW5hbCBMaXN0PENvbnN0YW50TWFwRW50cnk+IGVudHJpZXM7CgogIE1hcENvbnN0YW50KHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMuZW50cmllcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBrZXlUeXBlLmFjY2VwdCh2KTsKICAgIHZhbHVlVHlwZS5hY2NlcHQodik7CiAgICBmb3IgKGZpbmFsIENvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gZW50cmllcykgewogICAgICBlbnRyeS5rZXkuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgICBlbnRyeS52YWx1ZS5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgfQoKICBSIGFjY2VwdDxSPihDb25zdGFudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdE1hcENvbnN0YW50KHRoaXMpOwogIFIgYWNjZXB0UmVmZXJlbmNlPFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdE1hcENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHt0aGlzLnJ1bnRpbWVUeXBlfTwka2V5VHlwZSwgJHZhbHVlVHlwZT4oJGVudHJpZXMpJzsKCiAgaW50IF9jYWNoZWRIYXNoQ29kZTsKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfY2FjaGVkSGFzaENvZGUgPz89IF9IYXNoLmNvbWJpbmUyRmluaXNoKAogICAgICAgIGtleVR5cGUuaGFzaENvZGUsIHZhbHVlVHlwZS5oYXNoQ29kZSwgX0hhc2guY29tYmluZUxpc3RIYXNoKGVudHJpZXMpKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBpZGVudGljYWwodGhpcywgb3RoZXIpIHx8CiAgICAgIChvdGhlciBpcyBNYXBDb25zdGFudCAmJgogICAgICAgICAgb3RoZXIua2V5VHlwZSA9PSBrZXlUeXBlICYmCiAgICAgICAgICBvdGhlci52YWx1ZVR5cGUgPT0gdmFsdWVUeXBlICYmCiAgICAgICAgICBsaXN0RXF1YWxzKG90aGVyLmVudHJpZXMsIGVudHJpZXMpKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5tYXBUeXBlKGtleVR5cGUsIHZhbHVlVHlwZSwgY29udGV4dC5ub25OdWxsYWJsZSk7Cn0KCmNsYXNzIENvbnN0YW50TWFwRW50cnkgewogIGZpbmFsIENvbnN0YW50IGtleTsKICBmaW5hbCBDb25zdGFudCB2YWx1ZTsKICBDb25zdGFudE1hcEVudHJ5KHRoaXMua2V5LCB0aGlzLnZhbHVlKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRrZXk6ICR2YWx1ZSc7CgogIGludCBnZXQgaGFzaENvZGUgPT4gX0hhc2guaGFzaDIoa2V5LCB2YWx1ZSk7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBvdGhlciBpcyBDb25zdGFudE1hcEVudHJ5ICYmIG90aGVyLmtleSA9PSBrZXkgJiYgb3RoZXIudmFsdWUgPT0gdmFsdWU7Cn0KCmNsYXNzIExpc3RDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllczsKCiAgTGlzdENvbnN0YW50KHRoaXMudHlwZUFyZ3VtZW50LCB0aGlzLmVudHJpZXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZUFyZ3VtZW50LmFjY2VwdCh2KTsKICAgIGZvciAoZmluYWwgQ29uc3RhbnQgY29uc3RhbnQgaW4gZW50cmllcykgewogICAgICBjb25zdGFudC5hY2NlcHRSZWZlcmVuY2Uodik7CiAgICB9CiAgfQoKICBSIGFjY2VwdDxSPihDb25zdGFudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdExpc3RDb25zdGFudCh0aGlzKTsKICBSIGFjY2VwdFJlZmVyZW5jZTxSPihWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRMaXN0Q29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICcke3RoaXMucnVudGltZVR5cGV9PCR0eXBlQXJndW1lbnQ+KCRlbnRyaWVzKSc7CgogIGludCBfY2FjaGVkSGFzaENvZGU7CiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gX2NhY2hlZEhhc2hDb2RlID8/PSBfSGFzaC5jb21iaW5lRmluaXNoKAogICAgICAgIHR5cGVBcmd1bWVudC5oYXNoQ29kZSwgX0hhc2guY29tYmluZUxpc3RIYXNoKGVudHJpZXMpKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICBpZGVudGljYWwodGhpcywgb3RoZXIpIHx8CiAgICAgIChvdGhlciBpcyBMaXN0Q29uc3RhbnQgJiYKICAgICAgICAgIG90aGVyLnR5cGVBcmd1bWVudCA9PSB0eXBlQXJndW1lbnQgJiYKICAgICAgICAgIGxpc3RFcXVhbHMob3RoZXIuZW50cmllcywgZW50cmllcykpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGNvbnRleHQudHlwZUVudmlyb25tZW50Lmxpc3RUeXBlKHR5cGVBcmd1bWVudCwgY29udGV4dC5ub25OdWxsYWJsZSk7Cn0KCmNsYXNzIFNldENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICBmaW5hbCBMaXN0PENvbnN0YW50PiBlbnRyaWVzOwoKICBTZXRDb25zdGFudCh0aGlzLnR5cGVBcmd1bWVudCwgdGhpcy5lbnRyaWVzKTsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIHR5cGVBcmd1bWVudC5hY2NlcHQodik7CiAgICBmb3IgKGZpbmFsIENvbnN0YW50IGNvbnN0YW50IGluIGVudHJpZXMpIHsKICAgICAgY29uc3RhbnQuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgfQogIH0KCiAgUiBhY2NlcHQ8Uj4oQ29uc3RhbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRTZXRDb25zdGFudCh0aGlzKTsKICBSIGFjY2VwdFJlZmVyZW5jZTxSPihWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRTZXRDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7dGhpcy5ydW50aW1lVHlwZX08JHR5cGVBcmd1bWVudD4oJGVudHJpZXMpJzsKCiAgaW50IF9jYWNoZWRIYXNoQ29kZTsKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfY2FjaGVkSGFzaENvZGUgPz89IF9IYXNoLmNvbWJpbmVGaW5pc2goCiAgICAgICAgdHlwZUFyZ3VtZW50Lmhhc2hDb2RlLCBfSGFzaC5jb21iaW5lTGlzdEhhc2goZW50cmllcykpOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIFNldENvbnN0YW50ICYmCiAgICAgICAgICBvdGhlci50eXBlQXJndW1lbnQgPT0gdHlwZUFyZ3VtZW50ICYmCiAgICAgICAgICBsaXN0RXF1YWxzKG90aGVyLmVudHJpZXMsIGVudHJpZXMpKTsKCiAgRGFydFR5cGUgZ2V0VHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5zZXRUeXBlKHR5cGVBcmd1bWVudCwgY29udGV4dC5ub25OdWxsYWJsZSk7Cn0KCmNsYXNzIEluc3RhbmNlQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgZmluYWwgTWFwPFJlZmVyZW5jZSwgQ29uc3RhbnQ+IGZpZWxkVmFsdWVzOwoKICBJbnN0YW5jZUNvbnN0YW50KHRoaXMuY2xhc3NSZWZlcmVuY2UsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5maWVsZFZhbHVlcyk7CgogIENsYXNzIGdldCBjbGFzc05vZGUgPT4gY2xhc3NSZWZlcmVuY2UuYXNDbGFzczsKCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yIHYpIHsKICAgIGNsYXNzUmVmZXJlbmNlLmFzQ2xhc3MuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgdmlzaXRMaXN0KHR5cGVBcmd1bWVudHMsIHYpOwogICAgZm9yIChmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlIGluIGZpZWxkVmFsdWVzLmtleXMpIHsKICAgICAgcmVmZXJlbmNlLmFzRmllbGQuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgfQogICAgZm9yIChmaW5hbCBDb25zdGFudCBjb25zdGFudCBpbiBmaWVsZFZhbHVlcy52YWx1ZXMpIHsKICAgICAgY29uc3RhbnQuYWNjZXB0UmVmZXJlbmNlKHYpOwogICAgfQogIH0KCiAgUiBhY2NlcHQ8Uj4oQ29uc3RhbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRJbnN0YW5jZUNvbnN0YW50KHRoaXMpOwogIFIgYWNjZXB0UmVmZXJlbmNlPFI+KFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdEluc3RhbmNlQ29uc3RhbnRSZWZlcmVuY2UodGhpcyk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGZpbmFsIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJyR7Y2xhc3NSZWZlcmVuY2UuYXNDbGFzc30nKTsKICAgIGlmICghY2xhc3NSZWZlcmVuY2UuYXNDbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHNiLndyaXRlKCc8Jyk7CiAgICAgIHNiLndyaXRlKHR5cGVBcmd1bWVudHMubWFwKCh0eXBlKSA9PiB0eXBlLnRvU3RyaW5nKCkpLmpvaW4oJywgJykpOwogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogICAgc2Iud3JpdGUoJyB7Jyk7CiAgICBmaWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIENvbnN0YW50IGNvbnN0YW50KSB7CiAgICAgIHNiLndyaXRlKCcke2ZpZWxkUmVmLmFzRmllbGQubmFtZX06ICRjb25zdGFudCwgJyk7CiAgICB9KTsKICAgIHNiLndyaXRlKCd9Jyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIGludCBfY2FjaGVkSGFzaENvZGU7CiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gX2NhY2hlZEhhc2hDb2RlID8/PSBfSGFzaC5jb21iaW5lMkZpbmlzaCgKICAgICAgICBjbGFzc1JlZmVyZW5jZS5oYXNoQ29kZSwKICAgICAgICBsaXN0SGFzaENvZGUodHlwZUFyZ3VtZW50cyksCiAgICAgICAgX0hhc2guY29tYmluZU1hcEhhc2hVbm9yZGVyZWQoZmllbGRWYWx1ZXMpKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICAgIChvdGhlciBpcyBJbnN0YW5jZUNvbnN0YW50ICYmCiAgICAgICAgICAgIG90aGVyLmNsYXNzUmVmZXJlbmNlID09IGNsYXNzUmVmZXJlbmNlICYmCiAgICAgICAgICAgIGxpc3RFcXVhbHMob3RoZXIudHlwZUFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cykgJiYKICAgICAgICAgICAgbWFwRXF1YWxzKG90aGVyLmZpZWxkVmFsdWVzLCBmaWVsZFZhbHVlcykpOwogIH0KCiAgRGFydFR5cGUgZ2V0VHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBuZXcgSW50ZXJmYWNlVHlwZShjbGFzc05vZGUsIGNvbnRleHQubm9uTnVsbGFibGUsIHR5cGVBcmd1bWVudHMpOwp9CgpjbGFzcyBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewogIGZpbmFsIFRlYXJPZmZDb25zdGFudCB0ZWFyT2ZmQ29uc3RhbnQ7CiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gdHlwZXM7CgogIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQodGhpcy50ZWFyT2ZmQ29uc3RhbnQsIHRoaXMudHlwZXMpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdGVhck9mZkNvbnN0YW50LmFjY2VwdFJlZmVyZW5jZSh2KTsKICAgIHZpc2l0TGlzdCh0eXBlcywgdik7CiAgfQoKICBSIGFjY2VwdDxSPihDb25zdGFudFZpc2l0b3I8Uj4gdikgPT4KICAgICAgdi52aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQodGhpcyk7CiAgUiBhY2NlcHRSZWZlcmVuY2U8Uj4oVmlzaXRvcjxSPiB2KSA9PgogICAgICB2LnZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICcke3J1bnRpbWVUeXBlfSgke3RlYXJPZmZDb25zdGFudC5wcm9jZWR1cmV9PCR7dHlwZXMuam9pbignLCAnKX0+KSc7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9IYXNoLmNvbWJpbmVGaW5pc2goCiAgICAgIHRlYXJPZmZDb25zdGFudC5oYXNoQ29kZSwgX0hhc2guY29tYmluZUxpc3RIYXNoKHR5cGVzKSk7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCAmJgogICAgICAgIG90aGVyLnRlYXJPZmZDb25zdGFudCA9PSB0ZWFyT2ZmQ29uc3RhbnQgJiYKICAgICAgICBsaXN0RXF1YWxzKG90aGVyLnR5cGVzLCB0eXBlcyk7CiAgfQoKICBEYXJ0VHlwZSBnZXRUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIGZpbmFsIEZ1bmN0aW9uVHlwZSB0eXBlID0gdGVhck9mZkNvbnN0YW50LmdldFR5cGUoY29udGV4dCk7CiAgICBmaW5hbCBtYXBwaW5nID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgZm9yIChmaW5hbCBwYXJhbWV0ZXIgaW4gdHlwZS50eXBlUGFyYW1ldGVycykgewogICAgICBtYXBwaW5nW3BhcmFtZXRlcl0gPSB0eXBlc1ttYXBwaW5nLmxlbmd0aF07CiAgICB9CiAgICByZXR1cm4gc3Vic3RpdHV0ZSh0eXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycywgbWFwcGluZyk7CiAgfQp9CgpjbGFzcyBUZWFyT2ZmQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgUmVmZXJlbmNlIHByb2NlZHVyZVJlZmVyZW5jZTsKCiAgVGVhck9mZkNvbnN0YW50KFByb2NlZHVyZSBwcm9jZWR1cmUpCiAgICAgIDogcHJvY2VkdXJlUmVmZXJlbmNlID0gcHJvY2VkdXJlLnJlZmVyZW5jZSB7CiAgICBhc3NlcnQocHJvY2VkdXJlLmlzU3RhdGljKTsKICB9CgogIFRlYXJPZmZDb25zdGFudC5ieVJlZmVyZW5jZSh0aGlzLnByb2NlZHVyZVJlZmVyZW5jZSk7CgogIFByb2NlZHVyZSBnZXQgcHJvY2VkdXJlID0+IHByb2NlZHVyZVJlZmVyZW5jZT8uYXNQcm9jZWR1cmU7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBwcm9jZWR1cmVSZWZlcmVuY2UuYXNQcm9jZWR1cmUuYWNjZXB0UmVmZXJlbmNlKHYpOwogIH0KCiAgUiBhY2NlcHQ8Uj4oQ29uc3RhbnRWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRUZWFyT2ZmQ29uc3RhbnQodGhpcyk7CiAgUiBhY2NlcHRSZWZlcmVuY2U8Uj4oVmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VGVhck9mZkNvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJyR7cnVudGltZVR5cGV9KCR7cHJvY2VkdXJlfSknOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBwcm9jZWR1cmVSZWZlcmVuY2UuaGFzaENvZGU7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgVGVhck9mZkNvbnN0YW50ICYmCiAgICAgICAgb3RoZXIucHJvY2VkdXJlUmVmZXJlbmNlID09IHByb2NlZHVyZVJlZmVyZW5jZTsKICB9CgogIEZ1bmN0aW9uVHlwZSBnZXRUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKICAgIHJldHVybiBwcm9jZWR1cmUuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShjb250ZXh0Lm5vbk51bGxhYmxlKTsKICB9Cn0KCmNsYXNzIFR5cGVMaXRlcmFsQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgVHlwZUxpdGVyYWxDb25zdGFudCh0aGlzLnR5cGUpOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3IgdikgewogICAgdHlwZS5hY2NlcHQodik7CiAgfQoKICBSIGFjY2VwdDxSPihDb25zdGFudFZpc2l0b3I8Uj4gdikgPT4gdi52aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQodGhpcyk7CiAgUiBhY2NlcHRSZWZlcmVuY2U8Uj4oVmlzaXRvcjxSPiB2KSA9PgogICAgICB2LnZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZSh0aGlzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7cnVudGltZVR5cGV9KCR7dHlwZX0pJzsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlLmhhc2hDb2RlOwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIGlzIFR5cGVMaXRlcmFsQ29uc3RhbnQgJiYgb3RoZXIudHlwZSA9PSB0eXBlOwogIH0KCiAgRGFydFR5cGUgZ2V0VHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSA9PgogICAgICBjb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMudHlwZVJhd1R5cGUoY29udGV4dC5ub25OdWxsYWJsZSk7Cn0KCmNsYXNzIFVuZXZhbHVhdGVkQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CiAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBVbmV2YWx1YXRlZENvbnN0YW50KHRoaXMuZXhwcmVzc2lvbikgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gbnVsbDsKICB9CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICBleHByZXNzaW9uLmFjY2VwdCh2KTsKICB9CgogIFIgYWNjZXB0PFI+KENvbnN0YW50VmlzaXRvcjxSPiB2KSA9PiB2LnZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudCh0aGlzKTsKICBSIGFjY2VwdFJlZmVyZW5jZTxSPihWaXNpdG9yPFI+IHYpID0+CiAgICAgIHYudmlzaXRVbmV2YWx1YXRlZENvbnN0YW50UmVmZXJlbmNlKHRoaXMpOwoKICBEYXJ0VHlwZSBnZXRUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpID0+CiAgICAgIGV4cHJlc3Npb24uZ2V0U3RhdGljVHlwZShjb250ZXh0KTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24oKSA9PiBleHByZXNzaW9uOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBBIHdheSB0byBidW5kbGUgdXAgbGlicmFyaWVzIGluIGEgY29tcG9uZW50LgpjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBUcmVlTm9kZSB7CiAgZmluYWwgQ2Fub25pY2FsTmFtZSByb290OwoKICAvLy8gUHJvYmxlbXMgaW4gdGhpcyBbQ29tcG9uZW50XSBlbmNvZGVkIGFzIGpzb24gb2JqZWN0cy4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgZmllbGQgY2FuIGJlIG51bGwsIGFuZCBieSBjb252ZW50aW9uIHNob3VsZCBiZSBudWxsIGlmIHRoZQogIC8vLyBsaXN0IGlzIGVtcHR5LgogIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbjsKCiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXM7CgogIC8vLyBNYXAgZnJvbSBhIHNvdXJjZSBmaWxlIFVSSSB0byBhIGxpbmUtc3RhcnRzIHRhYmxlIGFuZCBzb3VyY2UgY29kZS4KICAvLy8gR2l2ZW4gYSBzb3VyY2UgZmlsZSBVUkkgYW5kIGEgb2Zmc2V0IGluIHRoYXQgZmlsZSBvbmUgY2FuIHRyYW5zbGF0ZQogIC8vLyBpdCB0byBhIGxpbmU6Y29sdW1uIHBvc2l0aW9uIGluIHRoYXQgZmlsZS4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlOwoKICAvLy8gTWFwcGluZyBiZXR3ZWVuIHN0cmluZyB0YWdzIGFuZCBbTWV0YWRhdGFSZXBvc2l0b3J5XSBjb3JyZXNwb25kaW5nIHRvCiAgLy8vIHRob3NlIHRhZ3MuCiAgZmluYWwgTWFwPFN0cmluZywgTWV0YWRhdGFSZXBvc2l0b3J5PGR5bmFtaWM+PiBtZXRhZGF0YSA9CiAgICAgIDxTdHJpbmcsIE1ldGFkYXRhUmVwb3NpdG9yeTxkeW5hbWljPj57fTsKCiAgLy8vIFJlZmVyZW5jZSB0byB0aGUgbWFpbiBtZXRob2QgaW4gb25lIG9mIHRoZSBsaWJyYXJpZXMuCiAgUmVmZXJlbmNlIG1haW5NZXRob2ROYW1lOwoKICBDb21wb25lbnQoCiAgICAgIHtDYW5vbmljYWxOYW1lIG5hbWVSb290LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZX0pCiAgICAgIDogcm9vdCA9IG5hbWVSb290ID8/IG5ldyBDYW5vbmljYWxOYW1lLnJvb3QoKSwKICAgICAgICBsaWJyYXJpZXMgPSBsaWJyYXJpZXMgPz8gPExpYnJhcnk+W10sCiAgICAgICAgdXJpVG9Tb3VyY2UgPSB1cmlUb1NvdXJjZSA/PyA8VXJpLCBTb3VyY2U+e30gewogICAgYWRvcHRDaGlsZHJlbigpOwogIH0KCiAgdm9pZCBhZG9wdENoaWxkcmVuKCkgewogICAgaWYgKGxpYnJhcmllcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgLy8gVGhlIGxpYnJhcmllcyBhcmUgb3duZWQgYnkgdGhpcyBjb21wb25lbnQsIGFuZCBzbyBhcmUgdGhlaXIgY2Fub25pY2FsCiAgICAgICAgLy8gbmFtZXMgaWYgdGhleSBleGlzdC4KICAgICAgICBMaWJyYXJ5IGxpYnJhcnkgPSBsaWJyYXJpZXNbaV07CiAgICAgICAgbGlicmFyeS5wYXJlbnQgPSB0aGlzOwogICAgICAgIENhbm9uaWNhbE5hbWUgbmFtZSA9IGxpYnJhcnkucmVmZXJlbmNlLmNhbm9uaWNhbE5hbWU7CiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnBhcmVudCAhPSByb290KSB7CiAgICAgICAgICByb290LmFkb3B0Q2hpbGQobmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGNvbXB1dGVDYW5vbmljYWxOYW1lc0ZvckxpYnJhcnkobGlicmFyaWVzW2ldKTsKICAgIH0KICB9CgogIC8vLyBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUuIFVzZSBvZiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29vcmRpbmF0ZWQKICAvLy8gd2l0aCB0aGUga2VybmVsIHRlYW0uCiAgLy8vCiAgLy8vIE1ha2VzIHN1cmUgYWxsIHJlZmVyZW5jZXMgaW4gbmFtZWQgbm9kZXMgaW4gdGhpcyBjb21wb25lbnQgcG9pbnRzIHRvIHNhaWQKICAvLy8gbmFtZWQgbm9kZS4KICAvLy8KICAvLy8gVGhlIHVzZSBjYXNlIGlzIGFkdmFuY2VkIGluY3JlbWVudGFsIGNvbXBpbGF0aW9uLCB3aGVyZSB3ZSB3YW50IHRvIHJlYnVpbGQKICAvLy8gYSBzaW5nbGUgbGlicmFyeSBhbmQgbWFrZSBhbGwgb3RoZXIgbGlicmFyaWVzIHVzZSB0aGUgbmV3IGxpYnJhcnkgYW5kIHRoZQogIC8vLyBjb250ZW50IHRoZXJlaW4gKndoaWxlKiBoYXZpbmcgdGhlIG9wdGlvbiB0byBnbyBiYWNrIHRvIHBvaW50aW5nIChiZQogIC8vLyAibGlua2VkIikgdG8gdGhlIG9sZCBsaWJyYXJ5IGlmIHRoZSBkZWx0YSBpcyByZWplY3RlZC4KICAvLy8KICAvLy8gUGxlYXNlIG5vdGUgdGhhdCBjYWxsaW5nIHRoaXMgaXMgYSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdGhpbmcgdG8gZG8sCiAgLy8vIGFuZCB0aGF0IHN0dWZmICpjYW4qIGdvIHdyb25nLCBhbmQgeW91IGNvdWxkIGVuZCB1cCBpbiBhIHNpdHVhdGlvbiB3aGVyZQogIC8vLyB5b3UgcG9pbnQgdG8gc2V2ZXJhbCB2ZXJzaW9ucyBvZiAidGhlIHNhbWUiIGxpYnJhcnkuIEV4YW1wbGVzOgogIC8vLyAgKiBJZiB5b3Ugb25seSByZWxpbmsgcGFydCAoZS5nLiBhIGNsYXNzKSBpZiB5b3VyIGNvbXBvbmVudCB5b3UgY2FuIHdpbmQKICAvLy8gICAgdXAgaW4gYW4gdW5mb3J0dW5hdGUgc2l0dWF0aW9uIHdoZXJlIGlmIHRoZSBsaWJyYXJ5IChzYXkgbGliQSkgY29udGFpbnMKICAvLy8gICAgY2xhc3MgJ0InIGFuZCBjbGFzcyAnQycsIHlvdSBvbmx5IHJlcGxhY2UgJ0InICh3aXRoIG9uZSBpbiBsaWJyYXJ5CiAgLy8vICAgICdsaWJBUHJpbWUnKSwgZXZlcnl0aGluZyBwb2ludGluZyB0byAnQicgdmlhIHBhcmVudCBwb2ludGVycyB0YWxrcwogIC8vLyAgICBhYm91dCAnbGliQVByaW1lJywgd2hlcmVhcyBldmVyeXRoaW5nIHBvaW50aW5nIHRvICdDJyB3b3VsZCBzdGlsbAogIC8vLyAgICB1bHRpbWF0ZWx5IHBvaW50IHRvICdsaWJBJy4KICAvLy8gICogSWYgeW91IHJlbGluayB0byBhIGxpYnJhcnkgdGhhdCBkb2Vzbid0IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBtZW1iZXJzCiAgLy8vICAgIGFzIHRoZSBvbmUgeW91J3JlICJsaW5raW5nIGZyb20iIHlvdSBjYW4gd2luZCB1cCBpbiBhbiB1bmZvcnR1bmF0ZQogIC8vLyAgICBzaXR1YXRpb24sIGUuZy4gaWYgdGhlIHRoaW5nIHlvdSByZWxpbmsgdHdvIGlzIG1pc3NpbmcgYSBzdGF0aWMgbWV0aG9kLAogIC8vLyAgICBhbnkgbGlua3MgdG8gdGhhdCBzdGF0aWMgbWV0aG9kIHdpbGwgc3RpbGwgcG9pbnQgdG8gdGhlIG9sZCBzdGF0aWMKICAvLy8gICAgbWV0aG9kIGFuZCB0aHVzICh2aWEgcGFyZW50IHBvaW50ZXJzKSB0byB0aGUgb2xkIGxpYnJhcnkuCiAgLy8vICAqIChwcm9iYWJseSBtb3JlKS4KICB2b2lkIHJlbGluaygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGxpYnJhcmllc1tpXS5yZWxpbmsoKTsKICAgIH0KICB9CgogIHZvaWQgY29tcHV0ZUNhbm9uaWNhbE5hbWVzRm9yTGlicmFyeShMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJvb3QuZ2V0Q2hpbGRGcm9tVXJpKGxpYnJhcnkuaW1wb3J0VXJpKS5iaW5kVG8obGlicmFyeS5yZWZlcmVuY2UpOwogICAgbGlicmFyeS5jb21wdXRlQ2Fub25pY2FsTmFtZXMoKTsKICB9CgogIHZvaWQgdW5iaW5kQ2Fub25pY2FsTmFtZXMoKSB7CiAgICAvLyBUT0RPKGplbnNqKTogR2V0IHJpZCBvZiB0aGlzLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgTGlicmFyeSBsaWIgPSBsaWJyYXJpZXNbaV07CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGliLmNsYXNzZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICBDbGFzcyBjID0gbGliLmNsYXNzZXNbal07CiAgICAgICAgYy5kaXJ0eSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJvb3QudW5iaW5kQWxsKCk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IG1haW5NZXRob2QgPT4gbWFpbk1ldGhvZE5hbWU/LmFzUHJvY2VkdXJlOwoKICB2b2lkIHNldCBtYWluTWV0aG9kKFByb2NlZHVyZSBtYWluKSB7CiAgICBtYWluTWV0aG9kTmFtZSA9IGdldE1lbWJlclJlZmVyZW5jZShtYWluKTsKICB9CgogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYudmlzaXRDb21wb25lbnQodGhpcyk7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvciB2KSB7CiAgICB2aXNpdExpc3QobGlicmFyaWVzLCB2KTsKICAgIG1haW5NZXRob2Q/LmFjY2VwdFJlZmVyZW5jZSh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QobGlicmFyaWVzLCB2LCB0aGlzKTsKICB9CgogIENvbXBvbmVudCBnZXQgZW5jbG9zaW5nQ29tcG9uZW50ID0+IHRoaXM7CgogIC8vLyBUcmFuc2xhdGVzIGFuIG9mZnNldCB0byBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBpbiB0aGUgZ2l2ZW4gZmlsZS4KICBMb2NhdGlvbiBnZXRMb2NhdGlvbihVcmkgZmlsZSwgaW50IG9mZnNldCkgewogICAgcmV0dXJuIHVyaVRvU291cmNlW2ZpbGVdPy5nZXRMb2NhdGlvbihmaWxlLCBvZmZzZXQpOwogIH0KCiAgdm9pZCBhZGRNZXRhZGF0YVJlcG9zaXRvcnkoTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKICAgIG1ldGFkYXRhW3JlcG9zaXRvcnkudGFnXSA9IHJlcG9zaXRvcnk7CiAgfQp9CgovLy8gQSB0dXBsZSB3aXRoIGZpbGUsIGxpbmUsIGFuZCBjb2x1bW4gbnVtYmVyLCBmb3IgZGlzcGxheWluZyBodW1hbi1yZWFkYWJsZQovLy8gbG9jYXRpb25zLgpjbGFzcyBMb2NhdGlvbiB7CiAgZmluYWwgVXJpIGZpbGU7CiAgZmluYWwgaW50IGxpbmU7IC8vIDEtYmFzZWQuCiAgZmluYWwgaW50IGNvbHVtbjsgLy8gMS1iYXNlZC4KCiAgTG9jYXRpb24odGhpcy5maWxlLCB0aGlzLmxpbmUsIHRoaXMuY29sdW1uKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRmaWxlOiRsaW5lOiRjb2x1bW4nOwp9CgphYnN0cmFjdCBjbGFzcyBNZXRhZGF0YVJlcG9zaXRvcnk8VD4gewogIC8vLyBVbmlxdWUgc3RyaW5nIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LgogIFN0cmluZyBnZXQgdGFnOwoKICAvLy8gTXV0YWJsZSBtYXBwaW5nIGJldHdlZW4gbm9kZXMgYW5kIHRoZWlyIG1ldGFkYXRhLgogIE1hcDxUcmVlTm9kZSwgVD4gZ2V0IG1hcHBpbmc7CgogIC8vLyBXcml0ZSBbbWV0YWRhdGFdIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBbTm9kZV0gaW50bwogIC8vLyB0aGUgZ2l2ZW4gW0JpbmFyeVNpbmtdLgogIC8vLwogIC8vLyBNZXRhZGF0YSBpcyBzZXJpYWxpemVkIGltbWVkaWF0ZWx5IGJlZm9yZSBzZXJpYWxpemluZyBbbm9kZV0sCiAgLy8vIHNvIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGNhbiB1c2Ugc2VyaWFsaXphdGlvbiBjb250ZXh0IG9mCiAgLy8vIFtub2RlXSdzIHBhcmVudHMgKHN1Y2ggYXMgZGVjbGFyZWQgdHlwZSBwYXJhbWV0ZXJzIGFuZCB2YXJpYWJsZXMpLgogIC8vLyBJbiBvcmRlciB0byB1c2Ugc2NvcGUgZGVjbGFyZWQgYnkgdGhlIFtub2RlXSBpdHNlbGYsIGltcGxlbWVudGF0aW9uIG9mCiAgLy8vIHRoaXMgbWV0aG9kIGNhbiB1c2UgW0JpbmFyeVNpbmsuZW50ZXJTY29wZV0gYW5kIFtCaW5hcnlTaW5rLmxlYXZlU2NvcGVdCiAgLy8vIG1ldGhvZHMuCiAgLy8vCiAgLy8vIFttZXRhZGF0YV0gbXVzdCBiZSBhbiBvYmplY3Qgb3duZWQgYnkgdGhpcyByZXBvc2l0b3J5LgogIHZvaWQgd3JpdGVUb0JpbmFyeShUIG1ldGFkYXRhLCBOb2RlIG5vZGUsIEJpbmFyeVNpbmsgc2luayk7CgogIC8vLyBDb25zdHJ1Y3QgYSBtZXRhZGF0YSBvYmplY3QgZnJvbSBpdHMgYmluYXJ5IHBheWxvYWQgcmVhZCBmcm9tIHRoZQogIC8vLyBnaXZlbiBbQmluYXJ5U291cmNlXS4KICAvLy8KICAvLy8gTWV0YWRhdGEgaXMgZGVzZXJpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlc2VyaWFsaXppbmcgW25vZGVdLAogIC8vLyBzbyBpdCBjYW4gdXNlIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0IG9mIFtub2RlXSdzIHBhcmVudHMuCiAgLy8vIEluIG9yZGVyIHRvIHVzZSBzY29wZSBkZWNsYXJlZCBieSB0aGUgW25vZGVdIGl0c2VsZiwgaW1wbGVtZW50YXRpb24gb2YKICAvLy8gdGhpcyBtZXRob2QgY2FuIHVzZSBbQmluYXJ5U291cmNlLmVudGVyU2NvcGVdIGFuZAogIC8vLyBbQmluYXJ5U291cmNlLmxlYXZlU2NvcGVdIG1ldGhvZHMuCiAgVCByZWFkRnJvbUJpbmFyeShOb2RlIG5vZGUsIEJpbmFyeVNvdXJjZSBzb3VyY2UpOwoKICAvLy8gTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBub2RlIGNhbiBoYXZlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIGl0CiAgLy8vIG9yIHJlZmVyZW5jZWQgZnJvbSB0aGUgbWV0YWRhdGEgcGF5bG9hZC4KICAvLy8KICAvLy8gQ3VycmVudGx5IGR1ZSB0byBiaW5hcnkgZm9ybWF0IHNwZWNpZmljcyBDYXRjaCBhbmQgTWFwRW50cnkgbm9kZXMKICAvLy8gY2FuJ3QgaGF2ZSBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGVtLiBBbHNvLCBtZXRhZGF0YSBpcyBub3Qgc2F2ZWQgb24KICAvLy8gQmxvY2sgbm9kZXMgaW5zaWRlIEJsb2NrRXhwcmVzc2lvbnMuCiAgc3RhdGljIGJvb2wgaXNTdXBwb3J0ZWQoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuICEobm9kZSBpcyBNYXBFbnRyeSB8fAogICAgICAgIG5vZGUgaXMgQ2F0Y2ggfHwKICAgICAgICAobm9kZSBpcyBCbG9jayAmJiBub2RlLnBhcmVudCBpcyBCbG9ja0V4cHJlc3Npb24pKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEJpbmFyeVNpbmsgewogIGludCBnZXRCdWZmZXJPZmZzZXQoKTsKCiAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpOwogIHZvaWQgd3JpdGVCeXRlcyhMaXN0PGludD4gYnl0ZXMpOwogIHZvaWQgd3JpdGVVSW50MzIoaW50IHZhbHVlKTsKICB2b2lkIHdyaXRlVUludDMwKGludCB2YWx1ZSk7CgogIC8vLyBXcml0ZSBMaXN0PEJ5dGU+IGludG8gdGhlIHNpbmsuCiAgdm9pZCB3cml0ZUJ5dGVMaXN0KExpc3Q8aW50PiBieXRlcyk7CgogIHZvaWQgd3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoQ2Fub25pY2FsTmFtZSBuYW1lKTsKICB2b2lkIHdyaXRlU3RyaW5nUmVmZXJlbmNlKFN0cmluZyBzdHIpOwogIHZvaWQgd3JpdGVOYW1lKE5hbWUgbm9kZSk7CiAgdm9pZCB3cml0ZURhcnRUeXBlKERhcnRUeXBlIHR5cGUpOwogIHZvaWQgd3JpdGVDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBjb25zdGFudCk7CiAgdm9pZCB3cml0ZU5vZGUoTm9kZSBub2RlKTsKCiAgdm9pZCBlbnRlclNjb3BlKAogICAgICB7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgYm9vbCBtZW1iZXJTY29wZTogZmFsc2UsCiAgICAgIGJvb2wgdmFyaWFibGVTY29wZTogZmFsc2V9KTsKICB2b2lkIGxlYXZlU2NvcGUoCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBib29sIG1lbWJlclNjb3BlOiBmYWxzZSwKICAgICAgYm9vbCB2YXJpYWJsZVNjb3BlOiBmYWxzZX0pOwp9CgphYnN0cmFjdCBjbGFzcyBCaW5hcnlTb3VyY2UgewogIGludCBnZXQgY3VycmVudE9mZnNldDsKICBMaXN0PGludD4gZ2V0IGJ5dGVzOwoKICBpbnQgcmVhZEJ5dGUoKTsKICBMaXN0PGludD4gcmVhZEJ5dGVzKGludCBsZW5ndGgpOwogIGludCByZWFkVUludCgpOwogIGludCByZWFkVWludDMyKCk7CgogIC8vLyBSZWFkIExpc3Q8Qnl0ZT4gZnJvbSB0aGUgc291cmNlLgogIExpc3Q8aW50PiByZWFkQnl0ZUxpc3QoKTsKCiAgQ2Fub25pY2FsTmFtZSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogIFN0cmluZyByZWFkU3RyaW5nUmVmZXJlbmNlKCk7CiAgTmFtZSByZWFkTmFtZSgpOwogIERhcnRUeXBlIHJlYWREYXJ0VHlwZSgpOwogIENvbnN0YW50IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogIEZ1bmN0aW9uTm9kZSByZWFkRnVuY3Rpb25Ob2RlKCk7CgogIHZvaWQgZW50ZXJTY29wZSh7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc30pOwogIHZvaWQgbGVhdmVTY29wZSh7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc30pOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSTkFMIEZVTkNUSU9OUwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgc2V0UGFyZW50cyhMaXN0PFRyZWVOb2RlPiBub2RlcywgVHJlZU5vZGUgcGFyZW50KSB7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7ICsraSkgewogICAgbm9kZXNbaV0ucGFyZW50ID0gcGFyZW50OwogIH0KfQoKdm9pZCB2aXNpdExpc3QoTGlzdDxOb2RlPiBub2RlcywgVmlzaXRvciB2aXNpdG9yKSB7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7ICsraSkgewogICAgbm9kZXNbaV0uYWNjZXB0KHZpc2l0b3IpOwogIH0KfQoKdm9pZCB2aXNpdEl0ZXJhYmxlKEl0ZXJhYmxlPE5vZGU+IG5vZGVzLCBWaXNpdG9yIHZpc2l0b3IpIHsKICBmb3IgKHZhciBub2RlIGluIG5vZGVzKSB7CiAgICBub2RlLmFjY2VwdCh2aXNpdG9yKTsKICB9Cn0KCnZvaWQgdHJhbnNmb3JtVHlwZUxpc3QoTGlzdDxEYXJ0VHlwZT4gbm9kZXMsIFRyYW5zZm9ybWVyIHZpc2l0b3IpIHsKICBpbnQgc3RvcmVJbmRleCA9IDA7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7ICsraSkgewogICAgdmFyIHJlc3VsdCA9IHZpc2l0b3IudmlzaXREYXJ0VHlwZShub2Rlc1tpXSk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgbm9kZXNbc3RvcmVJbmRleF0gPSByZXN1bHQ7CiAgICAgICsrc3RvcmVJbmRleDsKICAgIH0KICB9CiAgaWYgKHN0b3JlSW5kZXggPCBub2Rlcy5sZW5ndGgpIHsKICAgIG5vZGVzLmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgfQp9Cgp2b2lkIHRyYW5zZm9ybVN1cGVydHlwZUxpc3QoTGlzdDxTdXBlcnR5cGU+IG5vZGVzLCBUcmFuc2Zvcm1lciB2aXNpdG9yKSB7CiAgaW50IHN0b3JlSW5kZXggPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIHZhciByZXN1bHQgPSB2aXNpdG9yLnZpc2l0U3VwZXJ0eXBlKG5vZGVzW2ldKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICBub2Rlc1tzdG9yZUluZGV4XSA9IHJlc3VsdDsKICAgICAgKytzdG9yZUluZGV4OwogICAgfQogIH0KICBpZiAoc3RvcmVJbmRleCA8IG5vZGVzLmxlbmd0aCkgewogICAgbm9kZXMubGVuZ3RoID0gc3RvcmVJbmRleDsKICB9Cn0KCnZvaWQgdHJhbnNmb3JtTGlzdChMaXN0PFRyZWVOb2RlPiBub2RlcywgVHJhbnNmb3JtZXIgdmlzaXRvciwgVHJlZU5vZGUgcGFyZW50KSB7CiAgaW50IHN0b3JlSW5kZXggPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgIHZhciByZXN1bHQgPSBub2Rlc1tpXS5hY2NlcHQodmlzaXRvcik7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgbm9kZXNbc3RvcmVJbmRleF0gPSByZXN1bHQ7CiAgICAgIHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICsrc3RvcmVJbmRleDsKICAgIH0KICB9CiAgaWYgKHN0b3JlSW5kZXggPCBub2Rlcy5sZW5ndGgpIHsKICAgIG5vZGVzLmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgfQp9CgpjbGFzcyBfQ2hpbGRSZXBsYWNlciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBUcmVlTm9kZSBjaGlsZDsKICBmaW5hbCBUcmVlTm9kZSByZXBsYWNlbWVudDsKCiAgX0NoaWxkUmVwbGFjZXIodGhpcy5jaGlsZCwgdGhpcy5yZXBsYWNlbWVudCk7CgogIEBvdmVycmlkZQogIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBjaGlsZCkgewogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICB9Cn0KCmNsYXNzIFNvdXJjZSB7CiAgZmluYWwgTGlzdDxpbnQ+IGxpbmVTdGFydHM7CgogIC8vLyBBIFVURjggZW5jb2Rpbmcgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLgogIGZpbmFsIExpc3Q8aW50PiBzb3VyY2U7CgogIGZpbmFsIFVyaSBpbXBvcnRVcmk7CgogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBTdHJpbmcgY2FjaGVkVGV4dDsKCiAgU291cmNlKHRoaXMubGluZVN0YXJ0cywgdGhpcy5zb3VyY2UsIHRoaXMuaW1wb3J0VXJpLCB0aGlzLmZpbGVVcmkpOwoKICAvLy8gUmV0dXJuIHRoZSB0ZXh0IGNvcnJlc3BvbmRpbmcgdG8gW2xpbmVdIHdoaWNoIGlzIGEgMS1iYXNlZCBsaW5lCiAgLy8vIG51bWJlci4gVGhlIHJldHVybmVkIGxpbmUgY29udGFpbnMgbm8gbGluZSBzZXBhcmF0b3JzLgogIFN0cmluZyBnZXRUZXh0TGluZShpbnQgbGluZSkgewogICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8CiAgICAgICAgc291cmNlLmlzRW1wdHkgfHwKICAgICAgICBsaW5lU3RhcnRzID09IG51bGwgfHwKICAgICAgICBsaW5lU3RhcnRzLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChsaW5lLCAxLCBsaW5lU3RhcnRzLmxlbmd0aCwgJ2xpbmUnKTsKCiAgICBjYWNoZWRUZXh0ID8/PSB1dGY4LmRlY29kZShzb3VyY2UsIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgIC8vIC0xIGFzIGxpbmUgbnVtYmVycyBzdGFydCBhdCAxLgogICAgaW50IGluZGV4ID0gbGluZSAtIDE7CiAgICBpZiAoaW5kZXggKyAxID09IGxpbmVTdGFydHMubGVuZ3RoKSB7CiAgICAgIC8vIExhc3QgbGluZS4KICAgICAgcmV0dXJuIGNhY2hlZFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydHNbaW5kZXhdKTsKICAgIH0gZWxzZSBpZiAoaW5kZXggPCBsaW5lU3RhcnRzLmxlbmd0aCkgewogICAgICAvLyBXZSBzdWJ0cmFjdCAxIGZyb20gdGhlIG5leHQgbGluZSBmb3IgdHdvIHJlYXNvbnM6CiAgICAgIC8vIDEuIElmIHRoZSBmaWxlIGlzbid0IHRlcm1pbmF0ZWQgYnkgYSBuZXdsaW5lLCB0aGF0IGluZGV4IGlzIGludmFsaWQuCiAgICAgIC8vIDIuIFRvIHJlbW92ZSB0aGUgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgogICAgICBpbnQgZW5kT2ZMaW5lID0gbGluZVN0YXJ0c1tpbmRleCArIDFdIC0gMTsKICAgICAgaWYgKGVuZE9mTGluZSA+IGluZGV4ICYmIGNhY2hlZFRleHRbZW5kT2ZMaW5lIC0gMV0gPT0gIlxyIikgewogICAgICAgIC0tZW5kT2ZMaW5lOyAvLyBXaW5kb3dzIGxpbmUgZW5kaW5ncy4KICAgICAgfQogICAgICByZXR1cm4gY2FjaGVkVGV4dC5zdWJzdHJpbmcobGluZVN0YXJ0c1tpbmRleF0sIGVuZE9mTGluZSk7CiAgICB9CiAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW46IHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IHRoZSByYW5nZSBjaGVjayBhYm92ZS4KICAgIHRocm93ICJJbnRlcm5hbCBlcnJvciI7CiAgfQoKICAvLy8gVHJhbnNsYXRlcyBhbiBvZmZzZXQgdG8gbGluZSBhbmQgY29sdW1uIG51bWJlcnMgaW4gdGhlIGdpdmVuIGZpbGUuCiAgTG9jYXRpb24gZ2V0TG9jYXRpb24oVXJpIGZpbGUsIGludCBvZmZzZXQpIHsKICAgIGlmIChsaW5lU3RhcnRzID09IG51bGwgfHwgbGluZVN0YXJ0cy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBuZXcgTG9jYXRpb24oZmlsZSwgVHJlZU5vZGUubm9PZmZzZXQsIFRyZWVOb2RlLm5vT2Zmc2V0KTsKICAgIH0KICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwob2Zmc2V0LCAwLCBsaW5lU3RhcnRzLmxhc3QsICdvZmZzZXQnKTsKICAgIGludCBsb3cgPSAwLCBoaWdoID0gbGluZVN0YXJ0cy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHsKICAgICAgaW50IG1pZCA9IGhpZ2ggLSAoKGhpZ2ggLSBsb3cpID4+IDEpOyAvLyBHZXQgbWlkZGxlLCByb3VuZGluZyB1cC4KICAgICAgaW50IHBpdm90ID0gbGluZVN0YXJ0c1ttaWRdOwogICAgICBpZiAocGl2b3QgPD0gb2Zmc2V0KSB7CiAgICAgICAgbG93ID0gbWlkOwogICAgICB9IGVsc2UgewogICAgICAgIGhpZ2ggPSBtaWQgLSAxOwogICAgICB9CiAgICB9CiAgICBpbnQgbGluZUluZGV4ID0gbG93OwogICAgaW50IGxpbmVTdGFydCA9IGxpbmVTdGFydHNbbGluZUluZGV4XTsKICAgIGludCBsaW5lTnVtYmVyID0gMSArIGxpbmVJbmRleDsKICAgIGludCBjb2x1bW5OdW1iZXIgPSAxICsgb2Zmc2V0IC0gbGluZVN0YXJ0OwogICAgcmV0dXJuIG5ldyBMb2NhdGlvbihmaWxlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIpOwogIH0KfQoKLy8vIFJldHVybnMgdGhlIFtSZWZlcmVuY2VdIG9iamVjdCBmb3IgdGhlIGdpdmVuIG1lbWJlci4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgbWVtYmVyIGlzIGBudWxsYC4KUmVmZXJlbmNlIGdldE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbWVtYmVyKSB7CiAgcmV0dXJuIG1lbWJlcj8ucmVmZXJlbmNlOwp9CgovLy8gUmV0dXJucyB0aGUgW1JlZmVyZW5jZV0gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi8vLwovLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIGNsYXNzIGlzIGBudWxsYC4KUmVmZXJlbmNlIGdldENsYXNzUmVmZXJlbmNlKENsYXNzIGNsYXNzXykgewogIHJldHVybiBjbGFzc18/LnJlZmVyZW5jZTsKfQoKLy8vIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIFttZW1iZXJdLCBvciB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQovLy8gbWVtYmVyIGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIGNhbm9uaWNhbCBuYW1lIHlldC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgbWVtYmVyIGlzIGBudWxsYC4KQ2Fub25pY2FsTmFtZSBnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIoTWVtYmVyIG1lbWJlcikgewogIGlmIChtZW1iZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgaWYgKG1lbWJlci5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgIHRocm93ICckbWVtYmVyIGhhcyBubyBjYW5vbmljYWwgbmFtZSc7CiAgfQogIHJldHVybiBtZW1iZXIuY2Fub25pY2FsTmFtZTsKfQoKLy8vIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIFtjbGFzc19dLCBvciB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQovLy8gY2xhc3MgaGFzIG5vdCBiZWVuIGFzc2lnbmVkIGEgY2Fub25pY2FsIG5hbWUgeWV0LgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBjbGFzcyBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mQ2xhc3MoQ2xhc3MgY2xhc3NfKSB7CiAgaWYgKGNsYXNzXyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAoY2xhc3NfLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgdGhyb3cgJyRjbGFzc18gaGFzIG5vIGNhbm9uaWNhbCBuYW1lJzsKICB9CiAgcmV0dXJuIGNsYXNzXy5jYW5vbmljYWxOYW1lOwp9CgovLy8gUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgW2V4dGVuc2lvbl0sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyBjbGFzcyBoYXMgbm90IGJlZW4gYXNzaWduZWQgYSBjYW5vbmljYWwgbmFtZSB5ZXQuCi8vLwovLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIGV4dGVuc2lvbiBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mRXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24pIHsKICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHJldHVybiBudWxsOwogIGlmIChleHRlbnNpb24uY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICB0aHJvdyAnJGV4dGVuc2lvbiBoYXMgbm8gY2Fub25pY2FsIG5hbWUnOwogIH0KICByZXR1cm4gZXh0ZW5zaW9uLmNhbm9uaWNhbE5hbWU7Cn0KCi8vLyBSZXR1cm5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBbbGlicmFyeV0sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyBsaWJyYXJ5IGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIGNhbm9uaWNhbCBuYW1lIHlldC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgbGlicmFyeSBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mTGlicmFyeShMaWJyYXJ5IGxpYnJhcnkpIHsKICBpZiAobGlicmFyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICBpZiAobGlicmFyeS5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgIHRocm93ICckbGlicmFyeSBoYXMgbm8gY2Fub25pY2FsIG5hbWUnOwogIH0KICByZXR1cm4gbGlicmFyeS5jYW5vbmljYWxOYW1lOwp9CgovLy8gTXVybXVyLWluc3BpcmVkIGhhc2hpbmcsIHdpdGggYSBmYWxsLWJhY2sgdG8gSmVua2lucy1pbnNwaXJlZCBoYXNoaW5nIHdoZW4KLy8vIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQuCi8vLwovLy8gQSBoYXNoIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBvZiBzZXZlcmFsIFtjb21iaW5lXSBjYWxscyBmb2xsb3dlZCBieQovLy8gYSBbZmluaXNoXSBjYWxsLgpjbGFzcyBfSGFzaCB7CiAgc3RhdGljIGNvbnN0IGludCBNID0gMHg5ZGRmZWEwOGViMzgyMDAwICsgMHhkNjk7CiAgc3RhdGljIGNvbnN0IGJvb2wgaW50SXM2NEJpdCA9ICgxIDw8IDYzKSAhPSAwOwoKICAvLy8gUHJpbWl0aXZlIGhhc2ggY29tYmluaW5nIHN0ZXAuCiAgc3RhdGljIGludCBjb21iaW5lKGludCB2YWx1ZSwgaW50IGhhc2gpIHsKICAgIGlmIChpbnRJczY0Qml0KSB7CiAgICAgIHZhbHVlICo9IE07CiAgICAgIHZhbHVlIF49IF9zaHJ1KHZhbHVlLCA0Nyk7CiAgICAgIHZhbHVlICo9IE07CiAgICAgIGhhc2ggXj0gdmFsdWU7CiAgICAgIGhhc2ggKj0gTTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEZhbGwgYmFjayB0byBKZW5raW5zLWluc3BpcmVkIGhhc2hpbmcgb24gSmF2YVNjcmlwdCBwbGF0Zm9ybXMuCiAgICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyB2YWx1ZSk7CiAgICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwN2ZmZmYgJiBoYXNoKSA8PCAxMCkpOwogICAgICBoYXNoID0gaGFzaCBeIChoYXNoID4+IDYpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICAvLy8gUHJpbWl0aXZlIGhhc2ggZmluYWxpemF0aW9uIHN0ZXAuCiAgc3RhdGljIGludCBmaW5pc2goaW50IGhhc2gpIHsKICAgIGlmIChpbnRJczY0Qml0KSB7CiAgICAgIGhhc2ggXj0gX3NocnUoaGFzaCwgNDQpOwogICAgICBoYXNoICo9IE07CiAgICAgIGhhc2ggXj0gX3NocnUoaGFzaCwgNDEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRmFsbCBiYWNrIHRvIEplbmtpbnMtaW5zcGlyZWQgaGFzaGluZyBvbiBKYXZhU2NyaXB0IHBsYXRmb3Jtcy4KICAgICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwM2ZmZmZmZiAmIGhhc2gpIDw8IDMpKTsKICAgICAgaGFzaCA9IGhhc2ggXiAoaGFzaCA+PiAxMSk7CiAgICAgIGhhc2ggPSAweDFmZmZmZmZmICYgKGhhc2ggKyAoKDB4MDAwMDNmZmYgJiBoYXNoKSA8PCAxNSkpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBzdGF0aWMgaW50IGNvbWJpbmVGaW5pc2goaW50IHZhbHVlLCBpbnQgaGFzaCkgewogICAgcmV0dXJuIGZpbmlzaChjb21iaW5lKHZhbHVlLCBoYXNoKSk7CiAgfQoKICBzdGF0aWMgaW50IGNvbWJpbmUyKGludCB2YWx1ZTEsIGludCB2YWx1ZTIsIGludCBoYXNoKSB7CiAgICByZXR1cm4gY29tYmluZSh2YWx1ZTIsIGNvbWJpbmUodmFsdWUxLCBoYXNoKSk7CiAgfQoKICBzdGF0aWMgaW50IGNvbWJpbmUyRmluaXNoKGludCB2YWx1ZTEsIGludCB2YWx1ZTIsIGludCBoYXNoKSB7CiAgICByZXR1cm4gZmluaXNoKGNvbWJpbmUyKHZhbHVlMSwgdmFsdWUyLCBoYXNoKSk7CiAgfQoKICBzdGF0aWMgaW50IGhhc2gyKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewogICAgcmV0dXJuIGNvbWJpbmUyRmluaXNoKG9iamVjdDIuaGFzaENvZGUsIG9iamVjdDIuaGFzaENvZGUsIDApOwogIH0KCiAgc3RhdGljIGludCBjb21iaW5lTGlzdEhhc2goTGlzdCBsaXN0LCBbaW50IGhhc2ggPSAxXSkgewogICAgZm9yICh2YXIgaXRlbSBpbiBsaXN0KSB7CiAgICAgIGhhc2ggPSBfSGFzaC5jb21iaW5lKGl0ZW0uaGFzaENvZGUsIGhhc2gpOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBzdGF0aWMgaW50IGNvbWJpbmVMaXN0KExpc3Q8aW50PiBoYXNoZXMsIGludCBoYXNoKSB7CiAgICBmb3IgKHZhciBpdGVtIGluIGhhc2hlcykgewogICAgICBoYXNoID0gY29tYmluZShpdGVtLCBoYXNoKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KCiAgc3RhdGljIGludCBjb21iaW5lTWFwSGFzaFVub3JkZXJlZChNYXAgbWFwLCBbaW50IGhhc2ggPSAyXSkgewogICAgaWYgKG1hcCA9PSBudWxsIHx8IG1hcC5pc0VtcHR5KSByZXR1cm4gaGFzaDsKICAgIExpc3Q8aW50PiBlbnRyeUhhc2hlcyA9IExpc3QobWFwLmxlbmd0aCk7CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKHZhciBlbnRyeSBpbiBtYXAuZW50cmllcykgewogICAgICBlbnRyeUhhc2hlc1tpKytdID0gY29tYmluZShlbnRyeS5rZXkuaGFzaENvZGUsIGVudHJ5LnZhbHVlLmhhc2hDb2RlKTsKICAgIH0KICAgIGVudHJ5SGFzaGVzLnNvcnQoKTsKICAgIHJldHVybiBjb21iaW5lTGlzdChlbnRyeUhhc2hlcywgaGFzaCk7CiAgfQoKICAvLyBUT0RPKHNyYSk6IFJlcGxhY2Ugd2l0aCAnPj4+Jy4KICBzdGF0aWMgaW50IF9zaHJ1KGludCB2LCBpbnQgbikgewogICAgYXNzZXJ0KG4gPj0gMSk7CiAgICBhc3NlcnQoaW50SXM2NEJpdCk7CiAgICByZXR1cm4gKCh2ID4+IDEpICYgKDB4N2ZmZkZGRkZmZmZmRjAwMCArIDB4RkZGKSkgPj4gKG4gLSAxKTsKICB9Cn0KCmludCBsaXN0SGFzaENvZGUoTGlzdCBsaXN0KSB7CiAgcmV0dXJuIF9IYXNoLmZpbmlzaChfSGFzaC5jb21iaW5lTGlzdEhhc2gobGlzdCkpOwp9CgppbnQgbWFwSGFzaENvZGUoTWFwIG1hcCkgewogIHJldHVybiBtYXBIYXNoQ29kZVVub3JkZXJlZChtYXApOwp9CgppbnQgbWFwSGFzaENvZGVPcmRlcmVkKE1hcCBtYXAsIFtpbnQgaGFzaCA9IDJdKSB7CiAgZm9yIChmaW5hbCBPYmplY3QgeCBpbiBtYXAua2V5cykgaGFzaCA9IF9IYXNoLmNvbWJpbmUoeC5oYXNoQ29kZSwgaGFzaCk7CiAgZm9yIChmaW5hbCBPYmplY3QgeCBpbiBtYXAudmFsdWVzKSBoYXNoID0gX0hhc2guY29tYmluZSh4Lmhhc2hDb2RlLCBoYXNoKTsKICByZXR1cm4gX0hhc2guZmluaXNoKGhhc2gpOwp9CgppbnQgbWFwSGFzaENvZGVVbm9yZGVyZWQoTWFwIG1hcCkgewogIHJldHVybiBfSGFzaC5maW5pc2goX0hhc2guY29tYmluZU1hcEhhc2hVbm9yZGVyZWQobWFwKSk7Cn0KCmJvb2wgbGlzdEVxdWFscyhMaXN0IGEsIExpc3QgYikgewogIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgaWYgKGFbaV0gIT0gYltpXSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBtYXBFcXVhbHMoTWFwIGEsIE1hcCBiKSB7CiAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgZm9yIChmaW5hbCBPYmplY3Qga2V5IGluIGEua2V5cykgewogICAgaWYgKCFiLmNvbnRhaW5zS2V5KGtleSkgfHwgYVtrZXldICE9IGJba2V5XSkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKLy8vIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIFt0eXBlZGVmX10sIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi8vLyB0eXBlZGVmIGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIGNhbm9uaWNhbCBuYW1lIHlldC4KLy8vCi8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGUgdHlwZWRlZiBpcyBgbnVsbGAuCkNhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZU9mVHlwZWRlZihUeXBlZGVmIHR5cGVkZWZfKSB7CiAgaWYgKHR5cGVkZWZfID09IG51bGwpIHJldHVybiBudWxsOwogIGlmICh0eXBlZGVmXy5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgIHRocm93ICckdHlwZWRlZl8gaGFzIG5vIGNhbm9uaWNhbCBuYW1lJzsKICB9CiAgcmV0dXJuIHR5cGVkZWZfLmNhbm9uaWNhbE5hbWU7Cn0KCi8vLyBBbm5vdGF0aW9uIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gd2hpY2ggaXMgbm90IHBhcnQgb2YgRGFydCBzZW1hbnRpY3M7IGluCi8vLyBvdGhlciB3b3JkcywgaWYgdGhpcyBpbmZvcm1hdGlvbiAob3IgYW55IGluZm9ybWF0aW9uIGl0IHJlZmVycyB0bykgY2hhbmdlcywKLy8vIHN0YXRpYyBhbmFseXNpcyBhbmQgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgbGlicmFyeSBhcmUgdW5hZmZlY3RlZC4KY29uc3QgaW5mb3JtYXRpdmUgPSBudWxsOwoKTG9jYXRpb24gX2dldExvY2F0aW9uSW5Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgVXJpIGZpbGVVcmksIGludCBvZmZzZXQpIHsKICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKICAgIHJldHVybiBjb21wb25lbnQuZ2V0TG9jYXRpb24oZmlsZVVyaSwgb2Zmc2V0KTsKICB9IGVsc2UgewogICAgcmV0dXJuIG5ldyBMb2NhdGlvbihmaWxlVXJpLCBUcmVlTm9kZS5ub09mZnNldCwgVHJlZU5vZGUubm9PZmZzZXQpOwogIH0KfQoKLy8vIENvbnZlcnQgdGhlIHN5bnRoZXRpYyBuYW1lIG9mIGFuIGltcGxpY2l0IG1peGluIGFwcGxpY2F0aW9uIGNsYXNzCi8vLyBpbnRvIGEgbmFtZSBzdWl0YWJsZSBmb3IgdXNlci1mYWNlZCBzdHJpbmdzLgovLy8KLy8vIEZvciBleGFtcGxlLCB3aGVuIGNvbXBpbGluZyAiY2xhc3MgQSBleHRlbmRzIFMgd2l0aCBNMSwgTTIiLCB0aGUKLy8vIHR3byBzeW50aGV0aWMgY2xhc3NlcyB3aWxsIGJlIG5hbWVkICJfQSZTJk0xIiBhbmQgIl9BJlMmTTEmTTIiLgovLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAiUyB3aXRoIE0xIiBhbmQgIlMgd2l0aCBNMSwgTTIiLCByZXNwZWN0aXZlbHkuClN0cmluZyBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKFN0cmluZyBuYW1lKSB7CiAgTGlzdDxTdHJpbmc+IG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJyYnKTsKICBpZiAobmFtZVBhcnRzLmxlbmd0aCA8IDIgfHwgbmFtZSA9PSAiJiIpIHJldHVybiBuYW1lOwogIFN0cmluZyBkZW1hbmdsZWROYW1lID0gbmFtZVBhcnRzWzFdOwogIGZvciAoaW50IGkgPSAyOyBpIDwgbmFtZVBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICBkZW1hbmdsZWROYW1lICs9IChpID09IDIgPyAiIHdpdGggIiA6ICIsICIpICsgbmFtZVBhcnRzW2ldOwogIH0KICByZXR1cm4gZGVtYW5nbGVkTmFtZTsKfQoKLy8vIEV4dHJhY3QgZnJvbSB0aGUgc3ludGhldGljIG5hbWUgb2YgYW4gaW1wbGljaXQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKLy8vIHRoZSBuYW1lIG9mIHRoZSBmaW5hbCBzdWJjbGFzcyBvZiB0aGUgbWl4aW4gYXBwbGljYXRpb24uCi8vLwovLy8gRm9yIGV4YW1wbGUsIHdoZW4gY29tcGlsaW5nICJjbGFzcyBBIGV4dGVuZHMgUyB3aXRoIE0xLCBNMiIsIHRoZQovLy8gdHdvIHN5bnRoZXRpYyBjbGFzc2VzIHdpbGwgYmUgbmFtZWQgIl9BJlMmTTEiIGFuZCAiX0EmUyZNMSZNMiIuCi8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICJBIiBmb3IgYm90aCBjbGFzc2VzLgpTdHJpbmcgZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uU3ViY2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7CiAgTGlzdDxTdHJpbmc+IG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJyYnKTsKICBpZiAobmFtZVBhcnRzLmxlbmd0aCA8IDIpIHJldHVybiBuYW1lOwogIGFzc2VydChuYW1lUGFydHNbMF0uc3RhcnRzV2l0aCgnXycpKTsKICByZXR1cm4gbmFtZVBhcnRzWzBdLnN1YnN0cmluZygxKTsKfQoKLy8vIENvbXB1dGVzIGEgbGlzdCBvZiBbdHlwZVBhcmFtZXRlcnNdIHRha2VuIGFzIHR5cGVzLgpMaXN0PERhcnRUeXBlPiBnZXRBc1R5cGVBcmd1bWVudHMoCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBMaWJyYXJ5IGxpYnJhcnkpIHsKICBpZiAodHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICBuZXcgTGlzdDxEYXJ0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LEglBBECARdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydFRmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnTAAUOuLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuYXN0X3RvX2JpbmFyeTsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1dGY4OwppbXBvcnQgJ2RhcnQ6ZGV2ZWxvcGVyJzsKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IEJ5dGVzQnVpbGRlcjsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CmltcG9ydCAndGFnLmRhcnQnOwoKLy8vIFdyaXRlcyB0byBhIGJpbmFyeSBmaWxlLgovLy8KLy8vIEEgW0JpbmFyeVByaW50ZXJdIGNhbiBiZSB1c2VkIHRvIHdyaXRlIG9uZSBmaWxlIGFuZCBtdXN0IHRoZW4gYmUKLy8vIGRpc2NhcmRlZC4KY2xhc3MgQmluYXJ5UHJpbnRlciBpbXBsZW1lbnRzIFZpc2l0b3I8dm9pZD4sIEJpbmFyeVNpbmsgewogIFZhcmlhYmxlSW5kZXhlciBfdmFyaWFibGVJbmRleGVyOwogIExhYmVsSW5kZXhlciBfbGFiZWxJbmRleGVyOwogIFN3aXRjaENhc2VJbmRleGVyIF9zd2l0Y2hDYXNlSW5kZXhlcjsKICBmaW5hbCBUeXBlUGFyYW1ldGVySW5kZXhlciBfdHlwZVBhcmFtZXRlckluZGV4ZXIgPSBuZXcgVHlwZVBhcmFtZXRlckluZGV4ZXIoKTsKICBmaW5hbCBTdHJpbmdJbmRleGVyIHN0cmluZ0luZGV4ZXI7CiAgQ29uc3RhbnRJbmRleGVyIF9jb25zdGFudEluZGV4ZXI7CiAgZmluYWwgVXJpSW5kZXhlciBfc291cmNlVXJpSW5kZXhlciA9IG5ldyBVcmlJbmRleGVyKCk7CiAgYm9vbCBfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbiA9IGZhbHNlOwogIGZpbmFsIExpc3Q8Ym9vbD4gX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uID0gbmV3IExpc3Q8Ym9vbD4oKTsKICBmaW5hbCBMaXN0PGJvb2w+IF9zb3VyY2VzVXNlZEluTGlicmFyeSA9IG5ldyBMaXN0PGJvb2w+KCk7CiAgTWFwPExpYnJhcnlEZXBlbmRlbmN5LCBpbnQ+IF9saWJyYXJ5RGVwZW5kZW5jeUluZGV4ID0KICAgICAgPExpYnJhcnlEZXBlbmRlbmN5LCBpbnQ+e307CgogIExpc3Q8X01ldGFkYXRhU3Vic2VjdGlvbj4gX21ldGFkYXRhU3Vic2VjdGlvbnM7CgogIGZpbmFsIEJ1ZmZlcmVkU2luayBfbWFpblNpbms7CiAgZmluYWwgQnVmZmVyZWRTaW5rIF9tZXRhZGF0YVNpbms7CiAgZmluYWwgQnl0ZXNTaW5rIF9jb25zdGFudHNCeXRlc1Npbms7CiAgQnVmZmVyZWRTaW5rIF9jb25zdGFudHNTaW5rOwogIEJ1ZmZlcmVkU2luayBfc2luazsKICBib29sIGluY2x1ZGVTb3VyY2VzOwogIGJvb2wgaW5jbHVkZU9mZnNldHM7CgogIExpc3Q8aW50PiBsaWJyYXJ5T2Zmc2V0czsKICBMaXN0PGludD4gY2xhc3NPZmZzZXRzOwogIExpc3Q8aW50PiBwcm9jZWR1cmVPZmZzZXRzOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGUgPSAtMTsKICBpbnQgX2JpbmFyeU9mZnNldEZvckxpbmtUYWJsZSA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2FkcyA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5ncyA9IC0xOwogIGludCBfYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGUgPSAtMTsKICBpbnQgX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUgPSAtMTsKCiAgTGlzdDxDYW5vbmljYWxOYW1lPiBfY2Fub25pY2FsTmFtZUxpc3Q7CiAgU2V0PENhbm9uaWNhbE5hbWU+IF9rbm93bkNhbm9uaWNhbE5hbWVOb25Sb290VG9wcyA9IG5ldyBTZXQ8Q2Fub25pY2FsTmFtZT4oKTsKICBTZXQ8Q2Fub25pY2FsTmFtZT4gX3JlaW5kZXhlZENhbm9uaWNhbE5hbWVzID0gbmV3IFNldDxDYW5vbmljYWxOYW1lPigpOwoKICBMaWJyYXJ5IF9jdXJyZW50TGlicmFyeTsKCiAgLy8vIENyZWF0ZSBhIHByaW50ZXIgdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIFtzaW5rXS4KICAvLy8KICAvLy8gVGhlIEJpbmFyeVByaW50ZXIgd2lsbCB1c2UgaXRzIG93biBidWZmZXIsIHNvIHRoZSBbc2lua10gZG9lcyBub3QgbmVlZAogIC8vLyBvbmUuCiAgQmluYXJ5UHJpbnRlcihTaW5rPExpc3Q8aW50Pj4gc2luaywKICAgICAge1N0cmluZ0luZGV4ZXIgc3RyaW5nSW5kZXhlciwKICAgICAgdGhpcy5pbmNsdWRlU291cmNlcyA9IHRydWUsCiAgICAgIHRoaXMuaW5jbHVkZU9mZnNldHMgPSB0cnVlfSkKICAgICAgOiBfbWFpblNpbmsgPSBuZXcgQnVmZmVyZWRTaW5rKHNpbmspLAogICAgICAgIF9tZXRhZGF0YVNpbmsgPSBuZXcgQnVmZmVyZWRTaW5rKG5ldyBCeXRlc1NpbmsoKSksCiAgICAgICAgX2NvbnN0YW50c0J5dGVzU2luayA9IG5ldyBCeXRlc1NpbmsoKSwKICAgICAgICBzdHJpbmdJbmRleGVyID0gc3RyaW5nSW5kZXhlciA/PyBuZXcgU3RyaW5nSW5kZXhlcigpIHsKICAgIF9jb25zdGFudHNTaW5rID0gbmV3IEJ1ZmZlcmVkU2luayhfY29uc3RhbnRzQnl0ZXNTaW5rKTsKICAgIF9jb25zdGFudEluZGV4ZXIgPSBuZXcgQ29uc3RhbnRJbmRleGVyKHRoaXMuc3RyaW5nSW5kZXhlciwgdGhpcyk7CiAgICBfc2luayA9IF9tYWluU2luazsKICB9CgogIHZvaWQgX2ZsdXNoKCkgewogICAgX3NpbmsuZmx1c2hBbmREZXN0cm95KCk7CiAgfQoKICB2b2lkIHdyaXRlQnl0ZShpbnQgYnl0ZSkgewogICAgYXNzZXJ0KChieXRlICYgMHhGRikgPT0gYnl0ZSk7CiAgICBfc2luay5hZGRCeXRlKGJ5dGUpOwogIH0KCiAgdm9pZCB3cml0ZUJ5dGVzKExpc3Q8aW50PiBieXRlcykgewogICAgX3NpbmsuYWRkQnl0ZXMoYnl0ZXMpOwogIH0KCiAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgdm9pZCB3cml0ZVVJbnQzMChpbnQgdmFsdWUpIHsKICAgIGFzc2VydCh2YWx1ZSA+PSAwICYmIHZhbHVlID4+IDMwID09IDApOwogICAgaWYgKHZhbHVlIDwgMHg4MCkgewogICAgICBfc2luay5hZGRCeXRlKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPCAweDQwMDApIHsKICAgICAgX3NpbmsuYWRkQnl0ZTIoKHZhbHVlID4+IDgpIHwgMHg4MCwgdmFsdWUgJiAweEZGKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zaW5rLmFkZEJ5dGU0KCh2YWx1ZSA+PiAyNCkgfCAweEMwLCAodmFsdWUgPj4gMTYpICYgMHhGRiwKICAgICAgICAgICh2YWx1ZSA+PiA4KSAmIDB4RkYsIHZhbHVlICYgMHhGRik7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlVUludDMyKGludCB2YWx1ZSkgewogICAgX3NpbmsuYWRkQnl0ZTQoKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLAogICAgICAgICh2YWx1ZSA+PiA4KSAmIDB4RkYsIHZhbHVlICYgMHhGRik7CiAgfQoKICB2b2lkIHdyaXRlQnl0ZUxpc3QoTGlzdDxpbnQ+IHV0ZjhCeXRlcykgewogICAgd3JpdGVVSW50MzAodXRmOEJ5dGVzLmxlbmd0aCk7CiAgICB3cml0ZUJ5dGVzKHV0ZjhCeXRlcyk7CiAgfQoKICBpbnQgZ2V0QnVmZmVyT2Zmc2V0KCkgewogICAgcmV0dXJuIF9zaW5rLm9mZnNldDsKICB9CgogIHZvaWQgd3JpdGVTdHJpbmdUYWJsZShTdHJpbmdJbmRleGVyIGluZGV4ZXIpIHsKICAgIF9iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSA9IGdldEJ1ZmZlck9mZnNldCgpOwoKICAgIC8vIENvbnRhaW5lcnMgZm9yIHRoZSB1dGY4IGVuY29kZWQgc3RyaW5ncy4KICAgIGZpbmFsIExpc3Q8VWludDhMaXN0PiBkYXRhID0gbmV3IExpc3Q8VWludDhMaXN0PigpOwogICAgaW50IHRvdGFsTGVuZ3RoID0gMDsKICAgIGNvbnN0IGludCBtaW5MZW5ndGggPSAxIDw8IDE2OwogICAgVWludDhMaXN0IGJ1ZmZlcjsKICAgIGludCBpbmRleCA9IDA7CgogICAgLy8gV3JpdGUgdGhlIGVuZCBvZmZzZXRzLgogICAgd3JpdGVVSW50MzAoaW5kZXhlci5pbmRleC5sZW5ndGgpOwogICAgZm9yIChTdHJpbmcga2V5IGluIGluZGV4ZXIuaW5kZXgua2V5cykgewogICAgICBpZiAoa2V5LmlzTm90RW1wdHkpIHsKICAgICAgICBpbnQgcmVxdWlyZWRNaW5MZW5ndGggPSBrZXkubGVuZ3RoOwogICAgICAgIGludCBhbGxvY2F0ZU1pbkxlbmd0aCA9IHJlcXVpcmVkTWluTGVuZ3RoICogMzsKICAgICAgICBpbnQgbmV3SW5kZXg7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBpbmRleCArIHJlcXVpcmVkTWluTGVuZ3RoID49IGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgICAgICAgaW50IG5ld0xlbmd0aCA9IG1pbkxlbmd0aDsKICAgICAgICAgICAgaWYgKGFsbG9jYXRlTWluTGVuZ3RoID4gbmV3TGVuZ3RoKSBuZXdMZW5ndGggPSBhbGxvY2F0ZU1pbkxlbmd0aDsKICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsICYmIGluZGV4ID4gMCkgewogICAgICAgICAgICAgIGRhdGEuYWRkKG5ldyBVaW50OExpc3QudmlldyhidWZmZXIuYnVmZmVyLCAwLCBpbmRleCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChuZXdMZW5ndGgpOwogICAgICAgICAgfQogICAgICAgICAgbmV3SW5kZXggPSBOb3RRdWl0ZVN0cmluZy53cml0ZVV0ZjgoYnVmZmVyLCBpbmRleCwga2V5KTsKICAgICAgICAgIGlmIChuZXdJbmRleCAhPSAtMSkgYnJlYWs7CiAgICAgICAgICByZXF1aXJlZE1pbkxlbmd0aCA9IGFsbG9jYXRlTWluTGVuZ3RoOwogICAgICAgIH0KICAgICAgICBpZiAobmV3SW5kZXggPCAwKSB7CiAgICAgICAgICAvLyBVdGY4IGVuY29kaW5nIGZhaWxlZC4KICAgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCAmJiBpbmRleCA+IDApIHsKICAgICAgICAgICAgZGF0YS5hZGQobmV3IFVpbnQ4TGlzdC52aWV3KGJ1ZmZlci5idWZmZXIsIDAsIGluZGV4KSk7CiAgICAgICAgICAgIGJ1ZmZlciA9IG51bGw7CiAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIExpc3Q8aW50PiBjb252ZXJ0ZWQgPSB1dGY4LmVuY29kZXIuY29udmVydChrZXkpOwogICAgICAgICAgZGF0YS5hZGQoY29udmVydGVkKTsKICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IGNvbnZlcnRlZC5sZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IG5ld0luZGV4IC0gaW5kZXg7CiAgICAgICAgICBpbmRleCA9IG5ld0luZGV4OwogICAgICAgIH0KICAgICAgfQogICAgICB3cml0ZVVJbnQzMCh0b3RhbExlbmd0aCk7CiAgICB9CiAgICBpZiAoYnVmZmVyICE9IG51bGwgJiYgaW5kZXggPiAwKSB7CiAgICAgIGRhdGEuYWRkKFVpbnQ4TGlzdC52aWV3KGJ1ZmZlci5idWZmZXIsIDAsIGluZGV4KSk7CiAgICB9CgogICAgLy8gV3JpdGUgdGhlIFVURi04IGVuY29kZWQgc3RyaW5ncy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkgewogICAgICB3cml0ZUJ5dGVzKGRhdGFbaV0pOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1JlZmVyZW5jZShTdHJpbmcgc3RyaW5nKSB7CiAgICB3cml0ZVVJbnQzMChzdHJpbmdJbmRleGVyLnB1dChzdHJpbmcpKTsKICB9CgogIHZvaWQgd3JpdGVTdHJpbmdSZWZlcmVuY2VMaXN0KExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7CiAgICB3cml0ZUxpc3Qoc3RyaW5ncywgd3JpdGVTdHJpbmdSZWZlcmVuY2UpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICB3cml0ZVVJbnQzMChfY29uc3RhbnRJbmRleGVyLnB1dChjb25zdGFudCkpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnN0YW50VGFibGUoQ29uc3RhbnRJbmRleGVyIGluZGV4ZXIpIHsKICAgIF9iaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CgogICAgd3JpdGVVSW50MzAoaW5kZXhlci5lbnRyaWVzLmxlbmd0aCk7CiAgICBhc3NlcnQoaWRlbnRpY2FsKF9zaW5rLCBfbWFpblNpbmspKTsKICAgIF9jb25zdGFudHNTaW5rLmZsdXNoQW5kRGVzdHJveSgpOwogICAgd3JpdGVCeXRlcyhfY29uc3RhbnRzQnl0ZXNTaW5rLmJ1aWxkZXIudGFrZUJ5dGVzKCkpOwogIH0KCiAgaW50IHdyaXRlQ29uc3RhbnRUYWJsZUVudHJ5KENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBCdWZmZXJlZFNpbmsgb2xkU2luayA9IF9zaW5rOwogICAgX3NpbmsgPSBfY29uc3RhbnRzU2luazsKICAgIGludCBpbml0aWFsT2Zmc2V0ID0gX3Npbmsub2Zmc2V0OwogICAgaWYgKGNvbnN0YW50IGlzIE51bGxDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuTnVsbENvbnN0YW50KTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5Cb29sQ29uc3RhbnQpOwogICAgICB3cml0ZUJ5dGUoY29uc3RhbnQudmFsdWUgPyAxIDogMCk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIEludENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5JbnRDb25zdGFudCk7CiAgICAgIHdyaXRlSW50ZWdlcihjb25zdGFudC52YWx1ZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5Eb3VibGVDb25zdGFudCk7CiAgICAgIHdyaXRlRG91YmxlKGNvbnN0YW50LnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLlN0cmluZ0NvbnN0YW50KTsKICAgICAgd3JpdGVTdHJpbmdSZWZlcmVuY2UoY29uc3RhbnQudmFsdWUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBTeW1ib2xDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuU3ltYm9sQ29uc3RhbnQpOwogICAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKGNvbnN0YW50LmxpYnJhcnlSZWZlcmVuY2UpOwogICAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShjb25zdGFudC5uYW1lKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgTWFwQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLk1hcENvbnN0YW50KTsKICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC5rZXlUeXBlKTsKICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC52YWx1ZVR5cGUpOwogICAgICB3cml0ZVVJbnQzMChjb25zdGFudC5lbnRyaWVzLmxlbmd0aCk7CiAgICAgIGZvciAoZmluYWwgQ29uc3RhbnRNYXBFbnRyeSBlbnRyeSBpbiBjb25zdGFudC5lbnRyaWVzKSB7CiAgICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShlbnRyeS5rZXkpOwogICAgICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoZW50cnkudmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIExpc3RDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuTGlzdENvbnN0YW50KTsKICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlQXJndW1lbnQpOwogICAgICB3cml0ZVVJbnQzMChjb25zdGFudC5lbnRyaWVzLmxlbmd0aCk7CiAgICAgIGNvbnN0YW50LmVudHJpZXMuZm9yRWFjaCh3cml0ZUNvbnN0YW50UmVmZXJlbmNlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgU2V0Q29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLlNldENvbnN0YW50KTsKICAgICAgd3JpdGVEYXJ0VHlwZShjb25zdGFudC50eXBlQXJndW1lbnQpOwogICAgICB3cml0ZVVJbnQzMChjb25zdGFudC5lbnRyaWVzLmxlbmd0aCk7CiAgICAgIGNvbnN0YW50LmVudHJpZXMuZm9yRWFjaCh3cml0ZUNvbnN0YW50UmVmZXJlbmNlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgSW5zdGFuY2VDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuSW5zdGFuY2VDb25zdGFudCk7CiAgICAgIHdyaXRlQ2xhc3NSZWZlcmVuY2UoY29uc3RhbnQuY2xhc3NOb2RlKTsKICAgICAgd3JpdGVVSW50MzAoY29uc3RhbnQudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgICBjb25zdGFudC50eXBlQXJndW1lbnRzLmZvckVhY2god3JpdGVEYXJ0VHlwZSk7CiAgICAgIHdyaXRlVUludDMwKGNvbnN0YW50LmZpZWxkVmFsdWVzLmxlbmd0aCk7CiAgICAgIGNvbnN0YW50LmZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGZpZWxkUmVmLmNhbm9uaWNhbE5hbWUpOwogICAgICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UodmFsdWUpOwogICAgICB9KTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCk7CiAgICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoY29uc3RhbnQudGVhck9mZkNvbnN0YW50KTsKICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGNvbnN0YW50LnR5cGVzLmxlbmd0aDsKICAgICAgd3JpdGVVSW50MzAobGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIHdyaXRlRGFydFR5cGUoY29uc3RhbnQudHlwZXNbaV0pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIFRlYXJPZmZDb25zdGFudCkgewogICAgICB3cml0ZUJ5dGUoQ29uc3RhbnRUYWcuVGVhck9mZkNvbnN0YW50KTsKICAgICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShjb25zdGFudC5wcm9jZWR1cmUuY2Fub25pY2FsTmFtZSk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIFR5cGVMaXRlcmFsQ29uc3RhbnQpIHsKICAgICAgd3JpdGVCeXRlKENvbnN0YW50VGFnLlR5cGVMaXRlcmFsQ29uc3RhbnQpOwogICAgICB3cml0ZURhcnRUeXBlKGNvbnN0YW50LnR5cGUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgIHdyaXRlQnl0ZShDb25zdGFudFRhZy5VbmV2YWx1YXRlZENvbnN0YW50KTsKICAgICAgd3JpdGVOb2RlKGNvbnN0YW50LmV4cHJlc3Npb24pOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbnN0YW50ICRjb25zdGFudCcpOwogICAgfQogICAgX3NpbmsgPSBvbGRTaW5rOwogICAgcmV0dXJuIF9jb25zdGFudHNTaW5rLm9mZnNldCAtIGluaXRpYWxPZmZzZXQ7CiAgfQoKICB2b2lkIHdyaXRlRGFydFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgdHlwZS5hY2NlcHQodGhpcyk7CiAgfQoKICAvLyBSZXR1cm5zIHRoZSBuZXcgYWN0aXZlIGZpbGUgdXJpLgogIHZvaWQgd3JpdGVVcmlSZWZlcmVuY2UoVXJpIHVyaSkgewogICAgZmluYWwgaW50IGluZGV4ID0gX3NvdXJjZVVyaUluZGV4ZXIucHV0KHVyaSk7CiAgICB3cml0ZVVJbnQzMChpbmRleCk7CiAgICBpZiAoIV9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uKSB7CiAgICAgIGlmIChfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb24ubGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgICAgX3NvdXJjZXNGcm9tUmVhbEltcGxlbWVudGF0aW9uLmxlbmd0aCA9IGluZGV4ICsgMTsKICAgICAgfQogICAgICBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb25baW5kZXhdID0gdHJ1ZTsKICAgIH0KICAgIGlmIChfc291cmNlc1VzZWRJbkxpYnJhcnkubGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgIF9zb3VyY2VzVXNlZEluTGlicmFyeS5sZW5ndGggPSBpbmRleCArIDE7CiAgICB9CiAgICBfc291cmNlc1VzZWRJbkxpYnJhcnlbaW5kZXhdID0gdHJ1ZTsKICB9CgogIHZvaWQgd3JpdGVMaXN0PFQ+KExpc3Q8VD4gaXRlbXMsIHZvaWQgd3JpdGVJdGVtKFQgeCkpIHsKICAgIHdyaXRlVUludDMwKGl0ZW1zLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlSXRlbShpdGVtc1tpXSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTm9kZUxpc3QoTGlzdDxOb2RlPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlUHJvY2VkdXJlTm9kZUxpc3QoTGlzdDxQcm9jZWR1cmU+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlUHJvY2VkdXJlTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVGaWVsZE5vZGVMaXN0KExpc3Q8RmllbGQ+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlRmllbGROb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNsYXNzTm9kZUxpc3QoTGlzdDxDbGFzcz4gbm9kZXMpIHsKICAgIGZpbmFsIGxlbiA9IG5vZGVzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgd3JpdGVDbGFzc05vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlRXh0ZW5zaW9uTm9kZUxpc3QoTGlzdDxFeHRlbnNpb24+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlRXh0ZW5zaW9uTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDb25zdHJ1Y3Rvck5vZGVMaXN0KExpc3Q8Q29uc3RydWN0b3I+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlQ29uc3RydWN0b3JOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yTm9kZUxpc3QoCiAgICAgIExpc3Q8UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3I+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVN3aXRjaENhc2VOb2RlTGlzdChMaXN0PFN3aXRjaENhc2U+IG5vZGVzKSB7CiAgICBmaW5hbCBsZW4gPSBub2Rlcy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBub2RlID0gbm9kZXNbaV07CiAgICAgIHdyaXRlU3dpdGNoQ2FzZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQ2F0Y2hOb2RlTGlzdChMaXN0PENhdGNoPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZUNhdGNoTm9kZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVUeXBlZGVmTm9kZUxpc3QoTGlzdDxUeXBlZGVmPiBub2RlcykgewogICAgZmluYWwgbGVuID0gbm9kZXMubGVuZ3RoOwogICAgd3JpdGVVSW50MzAobGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZmluYWwgbm9kZSA9IG5vZGVzW2ldOwogICAgICB3cml0ZVR5cGVkZWZOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5vZGUoTm9kZSBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUFyZ3VtZW50c05vZGUoQXJndW1lbnRzIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlOb2RlKExpYnJhcnkgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlUHJvY2VkdXJlTm9kZShQcm9jZWR1cmUgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlRmllbGROb2RlKEZpZWxkIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUNsYXNzTm9kZShDbGFzcyBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVFeHRlbnNpb25Ob2RlKEV4dGVuc2lvbiBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVDb25zdHJ1Y3Rvck5vZGUoQ29uc3RydWN0b3Igbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2b2lkIHdyaXRlUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JOb2RlKAogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVTd2l0Y2hDYXNlTm9kZShTd2l0Y2hDYXNlIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZUNhdGNoTm9kZShDYXRjaCBub2RlKSB7CiAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICBfd3JpdGVOb2RlTWV0YWRhdGEobm9kZSk7CiAgICB9CiAgICBub2RlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgd3JpdGVUeXBlZGVmTm9kZShUeXBlZGVmIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIG5vZGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCB3cml0ZU9wdGlvbmFsTm9kZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5Ob3RoaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU29tZXRoaW5nKTsKICAgICAgd3JpdGVOb2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU9wdGlvbmFsRnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuTm90aGluZyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlNvbWV0aGluZyk7CiAgICAgIHdyaXRlRnVuY3Rpb25Ob2RlKG5vZGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpbmtUYWJsZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBfYmluYXJ5T2Zmc2V0Rm9yTGlua1RhYmxlID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICB3cml0ZUxpc3QoX2Nhbm9uaWNhbE5hbWVMaXN0LCB3cml0ZUNhbm9uaWNhbE5hbWVFbnRyeSk7CiAgfQoKICB2b2lkIGluZGV4TGlua1RhYmxlKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIF9jYW5vbmljYWxOYW1lTGlzdCA9IDxDYW5vbmljYWxOYW1lPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnQubGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IGNvbXBvbmVudC5saWJyYXJpZXNbaV07CiAgICAgIGlmICghc2hvdWxkV3JpdGVMaWJyYXJ5Q2Fub25pY2FsTmFtZXMobGlicmFyeSkpIGNvbnRpbnVlOwogICAgICBfaW5kZXhMaW5rVGFibGVJbnRlcm5hbChsaWJyYXJ5LmNhbm9uaWNhbE5hbWUpOwogICAgICBfa25vd25DYW5vbmljYWxOYW1lTm9uUm9vdFRvcHMuYWRkKGxpYnJhcnkuY2Fub25pY2FsTmFtZSk7CiAgICB9CiAgfQoKICB2b2lkIF9pbmRleExpbmtUYWJsZUludGVybmFsKENhbm9uaWNhbE5hbWUgbm9kZSkgewogICAgbm9kZS5pbmRleCA9IF9jYW5vbmljYWxOYW1lTGlzdC5sZW5ndGg7CiAgICBfY2Fub25pY2FsTmFtZUxpc3QuYWRkKG5vZGUpOwogICAgSXRlcmFibGU8Q2Fub25pY2FsTmFtZT4gY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuT3JOdWxsOwogICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKICAgICAgZm9yIChDYW5vbmljYWxOYW1lIGNoaWxkIGluIGNoaWxkcmVuKSB7CiAgICAgICAgX2luZGV4TGlua1RhYmxlSW50ZXJuYWwoY2hpbGQpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ29tcHV0ZSBjYW5vbmljYWwgbmFtZXMgZm9yIHRoZSB3aG9sZSBjb21wb25lbnQgb3IgcGFydHMgb2YgaXQuCiAgdm9pZCBjb21wdXRlQ2Fub25pY2FsTmFtZXMoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgY29tcG9uZW50LmNvbXB1dGVDYW5vbmljYWxOYW1lcygpOwogIH0KCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgYWxsIGNhbm9uaWNhbCBuYW1lcyBvZiB0aGUgW2xpYnJhcnldIHNob3VsZCBiZSB3cml0dGVuCiAgLy8vIGludG8gdGhlIGxpbmsgdGFibGUuICBJZiBzb21lIGxpYnJhcmllcyBvZiB0aGUgY29tcG9uZW50IGFyZSBza2lwcGVkLAogIC8vLyB0aGVuIGFsbCB0aGUgYWRkaXRpb25hbCBuYW1lcyByZWZlcmVuY2VkIGJ5IHRoZSBsaWJyYXJpZXMgdGhhdCBhcmUgd3JpdHRlbgogIC8vLyBieSBbd3JpdGVMaWJyYXJpZXNdIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkLgogIGJvb2wgc2hvdWxkV3JpdGVMaWJyYXJ5Q2Fub25pY2FsTmFtZXMoTGlicmFyeSBsaWJyYXJ5KSA9PiB0cnVlOwoKICB2b2lkIHdyaXRlQ2Fub25pY2FsTmFtZUVudHJ5KENhbm9uaWNhbE5hbWUgbm9kZSkgewogICAgQ2Fub25pY2FsTmFtZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgIGlmIChwYXJlbnQuaXNSb290KSB7CiAgICAgIHdyaXRlVUludDMwKDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVVSW50MzAocGFyZW50LmluZGV4ICsgMSk7CiAgICB9CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUpOwogIH0KCiAgdm9pZCB3cml0ZUNvbXBvbmVudEZpbGUoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgVGltZWxpbmUudGltZVN5bmMoIkJpbmFyeVByaW50ZXIud3JpdGVDb21wb25lbnRGaWxlIiwgKCkgewogICAgICBjb21wdXRlQ2Fub25pY2FsTmFtZXMoY29tcG9uZW50KTsKICAgICAgZmluYWwgY29tcG9uZW50T2Zmc2V0ID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICAgIHdyaXRlVUludDMyKFRhZy5Db21wb25lbnRGaWxlKTsKICAgICAgd3JpdGVVSW50MzIoVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pOwogICAgICB3cml0ZUxpc3RPZlN0cmluZ3MoY29tcG9uZW50LnByb2JsZW1zQXNKc29uKTsKICAgICAgaW5kZXhMaW5rVGFibGUoY29tcG9uZW50KTsKICAgICAgX2NvbGxlY3RNZXRhZGF0YShjb21wb25lbnQpOwogICAgICBpZiAoX21ldGFkYXRhU3Vic2VjdGlvbnMgIT0gbnVsbCkgewogICAgICAgIF93cml0ZU5vZGVNZXRhZGF0YUltcGwoY29tcG9uZW50LCBjb21wb25lbnRPZmZzZXQpOwogICAgICB9CiAgICAgIGxpYnJhcnlPZmZzZXRzID0gPGludD5bXTsKICAgICAgQ2Fub25pY2FsTmFtZSBtYWluID0gZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKGNvbXBvbmVudC5tYWluTWV0aG9kKTsKICAgICAgaWYgKG1haW4gIT0gbnVsbCkgewogICAgICAgIGNoZWNrQ2Fub25pY2FsTmFtZShtYWluKTsKICAgICAgfQogICAgICB3cml0ZUxpYnJhcmllcyhjb21wb25lbnQpOwogICAgICB3cml0ZVVyaVRvU291cmNlKGNvbXBvbmVudC51cmlUb1NvdXJjZSk7CiAgICAgIHdyaXRlTGlua1RhYmxlKGNvbXBvbmVudCk7CiAgICAgIF93cml0ZU1ldGFkYXRhU2VjdGlvbihjb21wb25lbnQpOwogICAgICB3cml0ZVN0cmluZ1RhYmxlKHN0cmluZ0luZGV4ZXIpOwogICAgICB3cml0ZUNvbnN0YW50VGFibGUoX2NvbnN0YW50SW5kZXhlcik7CiAgICAgIHdyaXRlQ29tcG9uZW50SW5kZXgoY29tcG9uZW50LCBjb21wb25lbnQubGlicmFyaWVzKTsKCiAgICAgIF9mbHVzaCgpOwogICAgfSk7CiAgfQoKICB2b2lkIHdyaXRlTGlzdE9mU3RyaW5ncyhMaXN0PFN0cmluZz4gc3RyaW5ncykgewogICAgd3JpdGVVSW50MzAoc3RyaW5ncz8ubGVuZ3RoID8/IDApOwogICAgaWYgKHN0cmluZ3MgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICBTdHJpbmcgcyA9IHN0cmluZ3NbaV07CiAgICAgICAgLy8gVGhpcyBpcyBzbG93LCBidXQgd2UgZXhwZWN0IHRoZXJlIHRvIGluIGdlbmVyYWwgYmUgbm8gcHJvYmxlbXMuIElmIHRoaXMKICAgICAgICAvLyB0dXJucyBvdXQgdG8gYmUgd3Jvbmcgd2UgY2FuIG9wdGltaXplIGl0IGFzIHdlIGRvIFVSTHMgZm9yIGluc3RhbmNlLgogICAgICAgIHdyaXRlQnl0ZUxpc3QodXRmOC5lbmNvZGVyLmNvbnZlcnQocykpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ29sbGVjdCBub24tZW1wdHkgbWV0YWRhdGEgcmVwb3NpdG9yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50LgogIHZvaWQgX2NvbGxlY3RNZXRhZGF0YShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wb25lbnQubWV0YWRhdGEuZm9yRWFjaCgodGFnLCByZXBvc2l0b3J5KSB7CiAgICAgIGlmIChyZXBvc2l0b3J5Lm1hcHBpbmcuaXNFbXB0eSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgX21ldGFkYXRhU3Vic2VjdGlvbnMgPz89IDxfTWV0YWRhdGFTdWJzZWN0aW9uPltdOwogICAgICBfbWV0YWRhdGFTdWJzZWN0aW9ucy5hZGQobmV3IF9NZXRhZGF0YVN1YnNlY3Rpb24ocmVwb3NpdG9yeSkpOwogICAgfSk7CiAgfQoKICAvLy8gV3JpdGVzIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gW05vZGVdLgogIHZvaWQgX3dyaXRlTm9kZU1ldGFkYXRhKE5vZGUgbm9kZSkgewogICAgX3dyaXRlTm9kZU1ldGFkYXRhSW1wbChub2RlLCBnZXRCdWZmZXJPZmZzZXQoKSk7CiAgfQoKICB2b2lkIF93cml0ZU5vZGVNZXRhZGF0YUltcGwoTm9kZSBub2RlLCBpbnQgbm9kZU9mZnNldCkgewogICAgZm9yIChfTWV0YWRhdGFTdWJzZWN0aW9uIHN1YnNlY3Rpb24gaW4gX21ldGFkYXRhU3Vic2VjdGlvbnMpIHsKICAgICAgZmluYWwgcmVwb3NpdG9yeSA9IHN1YnNlY3Rpb24ucmVwb3NpdG9yeTsKICAgICAgZmluYWwgdmFsdWUgPSByZXBvc2l0b3J5Lm1hcHBpbmdbbm9kZV07CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmICghTWV0YWRhdGFSZXBvc2l0b3J5LmlzU3VwcG9ydGVkKG5vZGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgICJOb2RlcyBvZiB0eXBlICR7bm9kZS5ydW50aW1lVHlwZX0gY2FuJ3QgaGF2ZSBtZXRhZGF0YS4iKTsKICAgICAgfQoKICAgICAgaWYgKCFpZGVudGljYWwoX3NpbmssIF9tYWluU2luaykpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgIk5vZGUgd3JpdHRlbiBpbnRvIG1ldGFkYXRhIGNhbid0IGhhdmUgbWV0YWRhdGEgIgogICAgICAgICAgICAiKG1ldGFkYXRhOiAke3JlcG9zaXRvcnkudGFnfSwgbm9kZTogJHtub2RlLnJ1bnRpbWVUeXBlfSAkbm9kZSkiKTsKICAgICAgfQoKICAgICAgX3NpbmsgPSBfbWV0YWRhdGFTaW5rOwogICAgICBzdWJzZWN0aW9uLm1ldGFkYXRhTWFwcGluZy5hZGQobm9kZU9mZnNldCk7CiAgICAgIHN1YnNlY3Rpb24ubWV0YWRhdGFNYXBwaW5nLmFkZChnZXRCdWZmZXJPZmZzZXQoKSk7CiAgICAgIHJlcG9zaXRvcnkud3JpdGVUb0JpbmFyeSh2YWx1ZSwgbm9kZSwgdGhpcyk7CiAgICAgIF9zaW5rID0gX21haW5TaW5rOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlclNjb3BlKAogICAgICB7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgYm9vbCBtZW1iZXJTY29wZTogZmFsc2UsCiAgICAgIGJvb2wgdmFyaWFibGVTY29wZTogZmFsc2V9KSB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBfdHlwZVBhcmFtZXRlckluZGV4ZXIuZW50ZXIodHlwZVBhcmFtZXRlcnMpOwogICAgfQogICAgaWYgKG1lbWJlclNjb3BlKSB7CiAgICAgIF92YXJpYWJsZUluZGV4ZXIgPSBudWxsOwogICAgfQogICAgaWYgKHZhcmlhYmxlU2NvcGUpIHsKICAgICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsZWF2ZVNjb3BlKAogICAgICB7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgYm9vbCBtZW1iZXJTY29wZTogZmFsc2UsCiAgICAgIGJvb2wgdmFyaWFibGVTY29wZTogZmFsc2V9KSB7CiAgICBpZiAodmFyaWFibGVTY29wZSkgewogICAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgICB9CiAgICBpZiAobWVtYmVyU2NvcGUpIHsKICAgICAgX3ZhcmlhYmxlSW5kZXhlciA9IG51bGw7CiAgICB9CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBfdHlwZVBhcmFtZXRlckluZGV4ZXIuZXhpdCh0eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZU1ldGFkYXRhU2VjdGlvbihDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICAvLyBNYWtlIHN1cmUgbWV0YWRhdGEgcGF5bG9hZHMgc2VjdGlvbiBpcyA4LWJ5dGUgYWxpZ25lZCwKICAgIC8vIHNvIGNlcnRhaW4ga2luZHMgb2YgbWV0YWRhdGEgY2FuIGNvbnRhaW4gYWxpZ25lZCBkYXRhLgogICAgY29uc3QgaW50IG1ldGFkYXRhUGF5bG9hZHNBbGlnbm1lbnQgPSA4OwogICAgaW50IHBhZGRpbmcgPSAoKGdldEJ1ZmZlck9mZnNldCgpICsgbWV0YWRhdGFQYXlsb2Fkc0FsaWdubWVudCAtIDEpICYKICAgICAgICAgICAgLW1ldGFkYXRhUGF5bG9hZHNBbGlnbm1lbnQpIC0KICAgICAgICBnZXRCdWZmZXJPZmZzZXQoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFkZGluZzsgKytpKSB7CiAgICAgIHdyaXRlQnl0ZSgwKTsKICAgIH0KCiAgICBfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2FkcyA9IGdldEJ1ZmZlck9mZnNldCgpOwoKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyA9PSBudWxsKSB7CiAgICAgIF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICAgIHdyaXRlVUludDMyKDApOyAvLyBFbXB0eSBzZWN0aW9uLgogICAgICByZXR1cm47CiAgICB9CgogICAgYXNzZXJ0KGlkZW50aWNhbChfc2luaywgX21haW5TaW5rKSk7CiAgICBfbWV0YWRhdGFTaW5rLmZsdXNoQW5kRGVzdHJveSgpOwogICAgd3JpdGVCeXRlcygoX21ldGFkYXRhU2luay5fc2luayBhcyBCeXRlc1NpbmspLmJ1aWxkZXIudGFrZUJ5dGVzKCkpOwoKICAgIC8vIFJMaXN0PE1ldGFkYXRhTWFwcGluZz4gbWV0YWRhdGFNYXBwaW5ncwogICAgX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MgPSBnZXRCdWZmZXJPZmZzZXQoKTsKICAgIGZvciAoX01ldGFkYXRhU3Vic2VjdGlvbiBzdWJzZWN0aW9uIGluIF9tZXRhZGF0YVN1YnNlY3Rpb25zKSB7CiAgICAgIC8vIFVJbnQzMiB0YWcKICAgICAgd3JpdGVVSW50MzIoc3RyaW5nSW5kZXhlci5wdXQoc3Vic2VjdGlvbi5yZXBvc2l0b3J5LnRhZykpOwoKICAgICAgLy8gUkxpc3Q8UGFpcjxVSW50MzIsIFVJbnQzMj4+IG5vZGVPZmZzZXRUb01ldGFkYXRhT2Zmc2V0CiAgICAgIGZpbmFsIG1hcHBpbmdMZW5ndGggPSBzdWJzZWN0aW9uLm1ldGFkYXRhTWFwcGluZy5sZW5ndGg7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ0xlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgd3JpdGVVSW50MzIoc3Vic2VjdGlvbi5tZXRhZGF0YU1hcHBpbmdbaV0pOyAvLyBub2RlIG9mZnNldAogICAgICAgIHdyaXRlVUludDMyKHN1YnNlY3Rpb24ubWV0YWRhdGFNYXBwaW5nW2kgKyAxXSk7IC8vIG1ldGFkYXRhIG9mZnNldAogICAgICB9CiAgICAgIHdyaXRlVUludDMyKG1hcHBpbmdMZW5ndGggfi8gMik7CiAgICB9CiAgICB3cml0ZVVJbnQzMihfbWV0YWRhdGFTdWJzZWN0aW9ucy5sZW5ndGgpOwogIH0KCiAgLy8vIFdyaXRlIGFsbCBvZiBzb21lIG9mIHRoZSBsaWJyYXJpZXMgb2YgdGhlIFtjb21wb25lbnRdLgogIHZvaWQgd3JpdGVMaWJyYXJpZXMoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnQubGlicmFyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIHdyaXRlTGlicmFyeU5vZGUoY29tcG9uZW50LmxpYnJhcmllc1tpXSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQ29tcG9uZW50SW5kZXgoQ29tcG9uZW50IGNvbXBvbmVudCwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpIHsKICAgIC8vIEl0IGlzIGFsbG93ZWQgdG8gY29uY2F0ZW5hdGUgc2V2ZXJhbCBrZXJuZWwgYmluYXJpZXMgdG8gY3JlYXRlIGEKICAgIC8vIG11bHRpLWNvbXBvbmVudCBrZXJuZWwgZmlsZS4gSW4gb3JkZXIgdG8gbWFpbnRhaW4gYWxpZ25tZW50IG9mCiAgICAvLyBtZXRhZGF0YSBzZWN0aW9ucyB3aXRoaW4ga2VybmVsIGJpbmFyaWVzIGFmdGVyIGNvbmNhdGVuYXRpb24sCiAgICAvLyBzaXplIG9mIGVhY2gga2VybmVsIGJpbmFyeSBzaG91bGQgYmUgYWxpZ25lZC4KICAgIC8vIENvbXBvbmVudCBpbmRleCBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgYSBrZXJuZWwgYmluYXJ5LCBzbyBwYWRkaW5nCiAgICAvLyBpcyBhZGRlZCBiZWZvcmUgY29tcG9uZW50IGluZGV4LgogICAgY29uc3QgaW50IGtlcm5lbEZpbGVBbGlnbm1lbnQgPSA4OwoKICAgIC8vIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggbnVtYmVyIG9mIHdyaXRlVUludDMyIGJlbG93LgogICAgaW50IG51bUNvbXBvbmVudEluZGV4RW50cmllcyA9IDcgKyBsaWJyYXJ5T2Zmc2V0cy5sZW5ndGggKyAzOwoKICAgIGludCB1bmFsaWduZWRTaXplID0gZ2V0QnVmZmVyT2Zmc2V0KCkgKyBudW1Db21wb25lbnRJbmRleEVudHJpZXMgKiA0OwogICAgaW50IHBhZGRpbmcgPQogICAgICAgICgodW5hbGlnbmVkU2l6ZSArIGtlcm5lbEZpbGVBbGlnbm1lbnQgLSAxKSAmIC1rZXJuZWxGaWxlQWxpZ25tZW50KSAtCiAgICAgICAgICAgIHVuYWxpZ25lZFNpemU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkgewogICAgICB3cml0ZUJ5dGUoMCk7CiAgICB9CgogICAgLy8gRml4ZWQtc2l6ZSBpbnRzIGF0IHRoZSBlbmQgdXNlZCBhcyBhbiBpbmRleC4KICAgIGFzc2VydChfYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGUgPj0gMCk7CiAgICB3cml0ZVVJbnQzMihfYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGUpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JMaW5rVGFibGUgPj0gMCk7CiAgICB3cml0ZVVJbnQzMihfYmluYXJ5T2Zmc2V0Rm9yTGlua1RhYmxlKTsKICAgIGFzc2VydChfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2FkcyA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzKTsKICAgIGFzc2VydChfYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5ncyA+PSAwKTsKICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzKTsKICAgIGFzc2VydChfYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGUgPj0gMCk7CiAgICB3cml0ZVVJbnQzMihfYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGUpOwogICAgYXNzZXJ0KF9iaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlID49IDApOwogICAgd3JpdGVVSW50MzIoX2JpbmFyeU9mZnNldEZvckNvbnN0YW50VGFibGUpOwoKICAgIENhbm9uaWNhbE5hbWUgbWFpbiA9IGdldENhbm9uaWNhbE5hbWVPZk1lbWJlcihjb21wb25lbnQubWFpbk1ldGhvZCk7CiAgICBpZiAobWFpbiA9PSBudWxsKSB7CiAgICAgIHdyaXRlVUludDMyKDApOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVVSW50MzIobWFpbi5pbmRleCArIDEpOwogICAgfQoKICAgIGFzc2VydChsaWJyYXJ5T2Zmc2V0cy5sZW5ndGggPT0gbGlicmFyaWVzLmxlbmd0aCk7CiAgICBmb3IgKGludCBvZmZzZXQgaW4gbGlicmFyeU9mZnNldHMpIHsKICAgICAgd3JpdGVVSW50MzIob2Zmc2V0KTsKICAgIH0KICAgIHdyaXRlVUludDMyKF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSk7IC8vIGVuZCBvZiBsYXN0IGxpYnJhcnkuCiAgICB3cml0ZVVJbnQzMihsaWJyYXJpZXMubGVuZ3RoKTsKCiAgICB3cml0ZVVJbnQzMihnZXRCdWZmZXJPZmZzZXQoKSArIDQpOyAvLyB0b3RhbCBzaXplLgogIH0KCiAgdm9pZCB3cml0ZVVyaVRvU291cmNlKE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UpIHsKICAgIF9iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZSA9IGdldEJ1ZmZlck9mZnNldCgpOwoKICAgIGludCBsZW5ndGggPSBfc291cmNlVXJpSW5kZXhlci5pbmRleC5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMihsZW5ndGgpOwogICAgTGlzdDxpbnQ+IGluZGV4ID0gbmV3IExpc3Q8aW50PihsZW5ndGgpOwoKICAgIC8vIFdyaXRlIGRhdGEuCiAgICBpbnQgaSA9IDA7CiAgICBVaW50OExpc3QgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxIDw8IDE2KTsKICAgIGZvciAoVXJpIHVyaSBpbiBfc291cmNlVXJpSW5kZXhlci5pbmRleC5rZXlzKSB7CiAgICAgIGluZGV4W2ldID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICAgIFNvdXJjZSBzb3VyY2UgPSB1cmlUb1NvdXJjZVt1cmldOwogICAgICBpZiAoc291cmNlID09IG51bGwgfHwKICAgICAgICAgICEoaW5jbHVkZVNvdXJjZXMgJiYKICAgICAgICAgICAgICBfc291cmNlc0Zyb21SZWFsSW1wbGVtZW50YXRpb24ubGVuZ3RoID4gaSAmJgogICAgICAgICAgICAgIF9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbltpXSA9PSB0cnVlKSkgewogICAgICAgIHNvdXJjZSA9IG5ldyBTb3VyY2UoCiAgICAgICAgICAgIDxpbnQ+W10sIGNvbnN0IDxpbnQ+W10sIHNvdXJjZT8uaW1wb3J0VXJpLCBzb3VyY2U/LmZpbGVVcmkpOwogICAgICB9CgogICAgICBTdHJpbmcgdXJpQXNTdHJpbmcgPSB1cmkgPT0gbnVsbCA/ICIiIDogIiR1cmkiOwogICAgICBvdXRwdXRTdHJpbmdWaWFCdWZmZXIodXJpQXNTdHJpbmcsIGJ1ZmZlcik7CgogICAgICB3cml0ZUJ5dGVMaXN0KHNvdXJjZS5zb3VyY2UpOwoKICAgICAgTGlzdDxpbnQ+IGxpbmVTdGFydHMgPSBzb3VyY2UubGluZVN0YXJ0czsKICAgICAgd3JpdGVVSW50MzAobGluZVN0YXJ0cy5sZW5ndGgpOwogICAgICBpbnQgcHJldmlvdXNMaW5lU3RhcnQgPSAwOwogICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpbmVTdGFydHMubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnQgbGluZVN0YXJ0ID0gbGluZVN0YXJ0c1tqXTsKICAgICAgICB3cml0ZVVJbnQzMChsaW5lU3RhcnQgLSBwcmV2aW91c0xpbmVTdGFydCk7CiAgICAgICAgcHJldmlvdXNMaW5lU3RhcnQgPSBsaW5lU3RhcnQ7CiAgICAgIH0KCiAgICAgIFN0cmluZyBpbXBvcnRVcmlBc1N0cmluZyA9CiAgICAgICAgICBzb3VyY2UuaW1wb3J0VXJpID09IG51bGwgPyAiIiA6ICIke3NvdXJjZS5pbXBvcnRVcml9IjsKICAgICAgb3V0cHV0U3RyaW5nVmlhQnVmZmVyKGltcG9ydFVyaUFzU3RyaW5nLCBidWZmZXIpOwoKICAgICAgaSsrOwogICAgfQoKICAgIC8vIFdyaXRlIGluZGV4IGZvciByYW5kb20gYWNjZXNzLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleC5sZW5ndGg7ICsraSkgewogICAgICB3cml0ZVVJbnQzMihpbmRleFtpXSk7CiAgICB9CiAgfQoKICB2b2lkIG91dHB1dFN0cmluZ1ZpYUJ1ZmZlcihTdHJpbmcgdXJpQXNTdHJpbmcsIFVpbnQ4TGlzdCBidWZmZXIpIHsKICAgIGlmICh1cmlBc1N0cmluZy5sZW5ndGggKiAzIDwgYnVmZmVyLmxlbmd0aCkgewogICAgICBpbnQgbGVuZ3RoID0gTm90UXVpdGVTdHJpbmcud3JpdGVVdGY4KGJ1ZmZlciwgMCwgdXJpQXNTdHJpbmcpOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIC8vIFV0ZjggZW5jb2RpbmcgZmFpbGVkLgogICAgICAgIHdyaXRlQnl0ZUxpc3QodXRmOC5lbmNvZGVyLmNvbnZlcnQodXJpQXNTdHJpbmcpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZVVJbnQzMChsZW5ndGgpOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICAgIHdyaXRlQnl0ZShidWZmZXJbal0pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gVW5jb21tb24gY2FzZSB3aXRoIHZlcnkgbG9uZyB1cmwuCiAgICAgIHdyaXRlQnl0ZUxpc3QodXRmOC5lbmNvZGVyLmNvbnZlcnQodXJpQXNTdHJpbmcpKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICBpbnQgaW5kZXggPSBfbGlicmFyeURlcGVuZGVuY3lJbmRleFtub2RlXTsKICAgIGlmIChpbmRleCA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgJ1JlZmVyZW5jZSB0byBsaWJyYXJ5IGRlcGVuZGVuY3kgJG5vZGUgb3V0IG9mIHNjb3BlJyk7CiAgICB9CiAgICB3cml0ZVVJbnQzMChpbmRleCk7CiAgfQoKICB2b2lkIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2UoUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlVUludDMwKDApOwogICAgfSBlbHNlIHsKICAgICAgQ2Fub25pY2FsTmFtZSBuYW1lID0gcmVmZXJlbmNlLmNhbm9uaWNhbE5hbWU7CiAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJHJlZmVyZW5jZScpOwogICAgICB9CiAgICAgIGNoZWNrQ2Fub25pY2FsTmFtZShuYW1lKTsKICAgICAgd3JpdGVVSW50MzAobmFtZS5pbmRleCArIDEpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5vbk51bGxSZWZlcmVuY2UoUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdHb3QgbnVsbCByZWZlcmVuY2UnKTsKICAgIH0gZWxzZSB7CiAgICAgIENhbm9uaWNhbE5hbWUgbmFtZSA9IHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lOwogICAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgY2Fub25pY2FsIG5hbWUgZm9yICRyZWZlcmVuY2UnKTsKICAgICAgfQogICAgICBjaGVja0Nhbm9uaWNhbE5hbWUobmFtZSk7CiAgICAgIHdyaXRlVUludDMwKG5hbWUuaW5kZXggKyAxKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tDYW5vbmljYWxOYW1lKENhbm9uaWNhbE5hbWUgbm9kZSkgewogICAgaWYgKF9rbm93bkNhbm9uaWNhbE5hbWVOb25Sb290VG9wcy5jb250YWlucyhub2RlLm5vblJvb3RUb3ApKSByZXR1cm47CiAgICBpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuaXNSb290KSByZXR1cm47CiAgICBpZiAoX3JlaW5kZXhlZENhbm9uaWNhbE5hbWVzLmNvbnRhaW5zKG5vZGUpKSByZXR1cm47CgogICAgY2hlY2tDYW5vbmljYWxOYW1lKG5vZGUucGFyZW50KTsKICAgIG5vZGUuaW5kZXggPSBfY2Fub25pY2FsTmFtZUxpc3QubGVuZ3RoOwogICAgX2Nhbm9uaWNhbE5hbWVMaXN0LmFkZChub2RlKTsKICAgIF9yZWluZGV4ZWRDYW5vbmljYWxOYW1lcy5hZGQobm9kZSk7CiAgfQoKICB2b2lkIHdyaXRlTnVsbEFsbG93ZWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKENhbm9uaWNhbE5hbWUgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICB3cml0ZVVJbnQzMCgwKTsKICAgIH0gZWxzZSB7CiAgICAgIGNoZWNrQ2Fub25pY2FsTmFtZShuYW1lKTsKICAgICAgd3JpdGVVSW50MzAobmFtZS5pbmRleCArIDEpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKENhbm9uaWNhbE5hbWUgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICdFeHBlY3RlZCBhIGNhbm9uaWNhbCBuYW1lIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLicpOwogICAgfSBlbHNlIHsKICAgICAgY2hlY2tDYW5vbmljYWxOYW1lKG5hbWUpOwogICAgICB3cml0ZVVJbnQzMChuYW1lLmluZGV4ICsgMSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeVJlZmVyZW5jZShMaWJyYXJ5IG5vZGUsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBpZiAobm9kZS5jYW5vbmljYWxOYW1lID09IG51bGwgJiYgIWFsbG93TnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICdFeHBlY3RlZCBhIGxpYnJhcnkgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLicpOwogICAgfQogICAgd3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2Uobm9kZS5jYW5vbmljYWxOYW1lKTsKICB9CgogIHdyaXRlT2Zmc2V0KGludCBvZmZzZXQpIHsKICAgIC8vIFRPRE8oamVuc2opOiBEZWx0YS1lbmNvZGluZy4KICAgIC8vIEZpbGUgb2Zmc2V0IHJhbmdlcyBmcm9tIC0xIGFuZCB1cCwKICAgIC8vIGJ1dCBpcyBoZXJlIHNhdmVkIGFzIHVuc2lnbmVkICh0aHVzIHRoZSArMSkKICAgIGlmICghaW5jbHVkZU9mZnNldHMpIHsKICAgICAgd3JpdGVVSW50MzAoMCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVVJbnQzMChvZmZzZXQgKyAxKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVDbGFzc1JlZmVyZW5jZShDbGFzcyBjbGFzc18pIHsKICAgIGlmIChjbGFzc18gPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICdFeHBlY3RlZCBhIGNsYXNzIHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC4nKTsKICAgIH0KICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mQ2xhc3MoY2xhc3NfKSk7CiAgfQoKICB2b2lkIHdyaXRlTmFtZShOYW1lIG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSk7CiAgICAvLyBUT0RPOiBDb25zaWRlciBhIG1vcmUgY29tcHJlc3NlZCBmb3JtYXQgZm9yIHByaXZhdGUgbmFtZXMgd2l0aGluIHRoZQogICAgLy8gZW5jbG9zaW5nIGxpYnJhcnkuCiAgICBpZiAobm9kZS5pc1ByaXZhdGUpIHsKICAgICAgd3JpdGVMaWJyYXJ5UmVmZXJlbmNlKG5vZGUubGlicmFyeSk7CiAgICB9CiAgfQoKICBib29sIGluc2lkZUV4dGVybmFsTGlicmFyeSA9IGZhbHNlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIF9jdXJyZW50TGlicmFyeSA9IG5vZGU7CgogICAgbGlicmFyeU9mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKCiAgICB3cml0ZVVJbnQzMChub2RlLmxhbmd1YWdlVmVyc2lvbk1ham9yKTsKICAgIHdyaXRlVUludDMwKG5vZGUubGFuZ3VhZ2VWZXJzaW9uTWlub3IpOwoKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTGlicmFyeShub2RlKSk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVVcmlSZWZlcmVuY2Uobm9kZS5maWxlVXJpKTsKICAgIHdyaXRlTGlzdE9mU3RyaW5ncyhub2RlLnByb2JsZW1zQXNKc29uKTsKICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlTGlicmFyeURlcGVuZGVuY2llcyhub2RlKTsKICAgIHdyaXRlQWRkaXRpb25hbEV4cG9ydHMobm9kZS5hZGRpdGlvbmFsRXhwb3J0cyk7CiAgICB3cml0ZUxpYnJhcnlQYXJ0cyhub2RlKTsKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwoKICAgIHdyaXRlVHlwZWRlZk5vZGVMaXN0KG5vZGUudHlwZWRlZnMpOwogICAgY2xhc3NPZmZzZXRzID0gbmV3IExpc3Q8aW50PigpOwogICAgd3JpdGVDbGFzc05vZGVMaXN0KG5vZGUuY2xhc3Nlcyk7CiAgICBjbGFzc09mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgIHdyaXRlRXh0ZW5zaW9uTm9kZUxpc3Qobm9kZS5leHRlbnNpb25zKTsKICAgIHdyaXRlRmllbGROb2RlTGlzdChub2RlLmZpZWxkcyk7CiAgICBwcm9jZWR1cmVPZmZzZXRzID0gbmV3IExpc3Q8aW50PigpOwogICAgd3JpdGVQcm9jZWR1cmVOb2RlTGlzdChub2RlLnByb2NlZHVyZXMpOwogICAgcHJvY2VkdXJlT2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwoKICAgIC8vIER1bXAgYWxsIHNvdXJjZS1yZWZlcmVuY2VzIHVzZWQgaW4gdGhpcyBsaWJyYXJ5OyB1c2VkIGJ5IHRoZSBWTS4KICAgIGludCBzb3VyY2VSZWZlcmVuY2VzT2Zmc2V0ID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICBpbnQgc291cmNlUmVmZXJlbmNlc0NvdW50ID0gMDsKICAgIC8vIE5vdGU6IFdlIHN0YXJ0IGF0IDEgYmVjYXVzZSAwIGlzIHRoZSBudWxsLWVudHJ5IGFuZCB3ZSBkb24ndCB3YW50IHRvCiAgICAvLyBpbmNsdWRlIHRoYXQuCiAgICBmb3IgKGludCBpID0gMTsgaSA8IF9zb3VyY2VzVXNlZEluTGlicmFyeS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoX3NvdXJjZXNVc2VkSW5MaWJyYXJ5W2ldID09IHRydWUpIHsKICAgICAgICBzb3VyY2VSZWZlcmVuY2VzQ291bnQrKzsKICAgICAgfQogICAgfQogICAgd3JpdGVVSW50MzAoc291cmNlUmVmZXJlbmNlc0NvdW50KTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX3NvdXJjZXNVc2VkSW5MaWJyYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChfc291cmNlc1VzZWRJbkxpYnJhcnlbaV0gPT0gdHJ1ZSkgewogICAgICAgIHdyaXRlVUludDMwKGkpOwogICAgICAgIF9zb3VyY2VzVXNlZEluTGlicmFyeVtpXSA9IGZhbHNlOwogICAgICB9CiAgICB9CgogICAgLy8gRml4ZWQtc2l6ZSBpbnRzIGF0IHRoZSBlbmQgdXNlZCBhcyBhbiBpbmRleC4KICAgIHdyaXRlVUludDMyKHNvdXJjZVJlZmVyZW5jZXNPZmZzZXQpOwogICAgYXNzZXJ0KGNsYXNzT2Zmc2V0cy5sZW5ndGggPiAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NPZmZzZXRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGludCBvZmZzZXQgPSBjbGFzc09mZnNldHNbaV07CiAgICAgIHdyaXRlVUludDMyKG9mZnNldCk7CiAgICB9CiAgICB3cml0ZVVJbnQzMihjbGFzc09mZnNldHMubGVuZ3RoIC0gMSk7CgogICAgYXNzZXJ0KHByb2NlZHVyZU9mZnNldHMubGVuZ3RoID4gMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2NlZHVyZU9mZnNldHMubGVuZ3RoOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHByb2NlZHVyZU9mZnNldHNbaV07CiAgICAgIHdyaXRlVUludDMyKG9mZnNldCk7CiAgICB9CiAgICB3cml0ZVVJbnQzMihwcm9jZWR1cmVPZmZzZXRzLmxlbmd0aCAtIDEpOwoKICAgIF9jdXJyZW50TGlicmFyeSA9IG51bGw7CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeURlcGVuZGVuY2llcyhMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIF9saWJyYXJ5RGVwZW5kZW5jeUluZGV4ID0gbGlicmFyeS5kZXBlbmRlbmNpZXMuaXNFbXB0eQogICAgICAgID8gY29uc3QgPExpYnJhcnlEZXBlbmRlbmN5LCBpbnQ+e30KICAgICAgICA6IDxMaWJyYXJ5RGVwZW5kZW5jeSwgaW50Pnt9OwogICAgd3JpdGVVSW50MzAobGlicmFyeS5kZXBlbmRlbmNpZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeS5kZXBlbmRlbmNpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeURlcGVuZGVuY3kgaW1wb3J0Tm9kZSA9IGxpYnJhcnkuZGVwZW5kZW5jaWVzW2ldOwogICAgICBfbGlicmFyeURlcGVuZGVuY3lJbmRleFtpbXBvcnROb2RlXSA9IGk7CiAgICAgIHdyaXRlTGlicmFyeURlcGVuZGVuY3koaW1wb3J0Tm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQWRkaXRpb25hbEV4cG9ydHMoTGlzdDxSZWZlcmVuY2U+IGFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICB3cml0ZVVJbnQzMChhZGRpdGlvbmFsRXhwb3J0cy5sZW5ndGgpOwogICAgZm9yIChSZWZlcmVuY2UgcmVmIGluIGFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShyZWYpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnlEZXBlbmRlbmN5IG5vZGUpIHsKICAgIGlmIChfbWV0YWRhdGFTdWJzZWN0aW9ucyAhPSBudWxsKSB7CiAgICAgIF93cml0ZU5vZGVNZXRhZGF0YShub2RlKTsKICAgIH0KICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVMaWJyYXJ5UmVmZXJlbmNlKG5vZGUudGFyZ2V0TGlicmFyeSwgYWxsb3dOdWxsOiB0cnVlKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUubmFtZSA/PyAnJyk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuY29tYmluYXRvcnMpOwogIH0KCiAgdm9pZCB2aXNpdENvbWJpbmF0b3IoQ29tYmluYXRvciBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1Nob3cgPyAxIDogMCk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZUxpc3Qobm9kZS5uYW1lcyk7CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeVBhcnRzKExpYnJhcnkgbGlicmFyeSkgewogICAgd3JpdGVVSW50MzAobGlicmFyeS5wYXJ0cy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJ5LnBhcnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIExpYnJhcnlQYXJ0IHBhcnROb2RlID0gbGlicmFyeS5wYXJ0c1tpXTsKICAgICAgd3JpdGVMaWJyYXJ5UGFydChwYXJ0Tm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUucGFydFVyaSk7CiAgfQoKICB2b2lkIHZpc2l0VHlwZWRlZihUeXBlZGVmIG5vZGUpIHsKICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVOb25OdWxsQ2Fub25pY2FsTmFtZVJlZmVyZW5jZShnZXRDYW5vbmljYWxOYW1lT2ZUeXBlZGVmKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CgogICAgZW50ZXJTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywgdmFyaWFibGVTY29wZTogdHJ1ZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CgogICAgZW50ZXJTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzKTsKCiAgICBsZWF2ZVNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUpOwogICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywgdmFyaWFibGVTY29wZTogdHJ1ZSk7CiAgICBsZWF2ZVNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICB9CgogIHZvaWQgd3JpdGVBbm5vdGF0aW9uKEV4cHJlc3Npb24gYW5ub3RhdGlvbikgewogICAgd3JpdGVOb2RlKGFubm90YXRpb24pOwogIH0KCiAgdm9pZCB3cml0ZUFubm90YXRpb25MaXN0KExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGZpbmFsIGxlbiA9IGFubm90YXRpb25zLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKICAgICAgd3JpdGVBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgfQogIH0KCiAgaW50IF9lbmNvZGVDbGFzc0ZsYWdzKGludCBmbGFncywgQ2xhc3NMZXZlbCBsZXZlbCkgewogICAgYXNzZXJ0KChmbGFncyAmIENsYXNzLkxldmVsTWFzaykgPT0gMCk7CiAgICBmaW5hbCBsZXZlbEluZGV4ID0gbGV2ZWwuaW5kZXggLSAxOwogICAgYXNzZXJ0KChsZXZlbEluZGV4ICYgQ2xhc3MuTGV2ZWxNYXNrKSA9PSBsZXZlbEluZGV4KTsKICAgIHJldHVybiBmbGFncyB8IGxldmVsSW5kZXg7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgY2xhc3NPZmZzZXRzLmFkZChnZXRCdWZmZXJPZmZzZXQoKSk7CgogICAgaWYgKG5vZGUuaXNBbm9ueW1vdXNNaXhpbikgX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb24gPSB0cnVlOwoKICAgIGludCBmbGFncyA9IF9lbmNvZGVDbGFzc0ZsYWdzKG5vZGUuZmxhZ3MsIG5vZGUubGV2ZWwpOwogICAgaWYgKG5vZGUuY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciAkbm9kZScpOwogICAgfQogICAgd3JpdGVCeXRlKFRhZy5DbGFzcyk7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZkNsYXNzKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLnN0YXJ0RmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKCiAgICB3cml0ZUJ5dGUoZmxhZ3MpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lID8/ICcnKTsKCiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICBsZWF2ZVNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUuc3VwZXJ0eXBlKTsKICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUubWl4ZWRJblR5cGUpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmltcGxlbWVudGVkVHlwZXMpOwogICAgd3JpdGVGaWVsZE5vZGVMaXN0KG5vZGUuZmllbGRzKTsKICAgIHdyaXRlQ29uc3RydWN0b3JOb2RlTGlzdChub2RlLmNvbnN0cnVjdG9ycyk7CiAgICBwcm9jZWR1cmVPZmZzZXRzID0gPGludD5bXTsKICAgIHdyaXRlUHJvY2VkdXJlTm9kZUxpc3Qobm9kZS5wcm9jZWR1cmVzKTsKICAgIHByb2NlZHVyZU9mZnNldHMuYWRkKGdldEJ1ZmZlck9mZnNldCgpKTsKICAgIHdyaXRlUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JOb2RlTGlzdCgKICAgICAgICBub2RlLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyk7CiAgICBsZWF2ZVNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzKTsKCiAgICBhc3NlcnQocHJvY2VkdXJlT2Zmc2V0cy5sZW5ndGggPiAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlT2Zmc2V0cy5sZW5ndGg7ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0c1tpXTsKICAgICAgd3JpdGVVSW50MzIob2Zmc2V0KTsKICAgIH0KICAgIHdyaXRlVUludDMyKHByb2NlZHVyZU9mZnNldHMubGVuZ3RoIC0gMSk7CiAgICBfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbiA9IGZhbHNlOwogIH0KCiAgc3RhdGljIGZpbmFsIE5hbWUgX2VtcHR5TmFtZSA9IG5ldyBOYW1lKCcnKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KICAgIGVudGVyU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogICAgd3JpdGVCeXRlKFRhZy5Db25zdHJ1Y3Rvcik7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZk1lbWJlcihub2RlKSk7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5zdGFydEZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CgogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSA/PyBfZW1wdHlOYW1lKTsKCiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgYXNzZXJ0KG5vZGUuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSk7CiAgICB3cml0ZUZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uKTsKICAgIC8vIFBhcmFtZXRlcnMgYXJlIGluIHNjb3BlIGluIHRoZSBpbml0aWFsaXplcnMuCiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnJlc3RvcmVTY29wZShub2RlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCArCiAgICAgICAgbm9kZS5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5pbml0aWFsaXplcnMpOwoKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgcHJvY2VkdXJlT2Zmc2V0cy5hZGQoZ2V0QnVmZmVyT2Zmc2V0KCkpOwoKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KCiAgICBmaW5hbCBib29sIGN1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb25TYXZlZCA9CiAgICAgICAgX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb247CiAgICBpZiAobm9kZS5pc05vU3VjaE1ldGhvZEZvcndhcmRlciB8fCBub2RlLmlzU3ludGhldGljRm9yd2FyZGVyKSB7CiAgICAgIF9jdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uID0gdHJ1ZTsKICAgIH0KCiAgICBlbnRlclNjb3BlKG1lbWJlclNjb3BlOiB0cnVlKTsKICAgIHdyaXRlQnl0ZShUYWcuUHJvY2VkdXJlKTsKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLnN0YXJ0RmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmtpbmQuaW5kZXgpOwogICAgd3JpdGVVSW50MzAobm9kZS5mbGFncyk7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lID8/IF9lbXB0eU5hbWUpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU9wdGlvbmFsRnVuY3Rpb25Ob2RlKG5vZGUuZnVuY3Rpb24pOwogICAgbGVhdmVTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CgogICAgX2N1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb24gPSBjdXJyZW50bHlJbk5vbmltcGxlbWVudGF0aW9uU2F2ZWQ7CiAgICBhc3NlcnQoKG5vZGUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCAhPSBudWxsKSB8fAogICAgICAgICEobm9kZS5pc0ZvcndhcmRpbmdTdHViICYmIG5vZGUuZnVuY3Rpb24uYm9keSAhPSBudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGQoRmllbGQgbm9kZSkgewogICAgaWYgKG5vZGUuY2Fub25pY2FsTmFtZSA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGNhbm9uaWNhbCBuYW1lIGZvciAkbm9kZScpOwogICAgfQogICAgZW50ZXJTY29wZShtZW1iZXJTY29wZTogdHJ1ZSk7CiAgICB3cml0ZUJ5dGUoVGFnLkZpZWxkKTsKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICAgIHdyaXRlVUludDMwKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmluaXRpYWxpemVyKTsKICAgIGxlYXZlU2NvcGUobWVtYmVyU2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGlmIChub2RlLmNhbm9uaWNhbE5hbWUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignTWlzc2luZyBjYW5vbmljYWwgbmFtZSBmb3IgJG5vZGUnKTsKICAgIH0KICAgIHdyaXRlQnl0ZShUYWcuUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwogICAgZW50ZXJTY29wZSgKICAgICAgICB0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywKICAgICAgICBtZW1iZXJTY29wZTogdHJ1ZSwKICAgICAgICB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKG5vZGUpKTsKICAgIHdyaXRlVXJpUmVmZXJlbmNlKG5vZGUuZmlsZVVyaSk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwoKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlVUludDMwKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIHdyaXRlVUludDMwKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CgogICAgbGVhdmVTY29wZSgKICAgICAgICB0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywKICAgICAgICBtZW1iZXJTY29wZTogdHJ1ZSwKICAgICAgICB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuSW52YWxpZEluaXRpYWxpemVyKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzU3ludGhldGljID8gMSA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkZpZWxkSW5pdGlhbGl6ZXIpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNTeW50aGV0aWMgPyAxIDogMCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS5maWVsZFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3VwZXJJbml0aWFsaXplcik7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1N5bnRoZXRpYyA/IDEgOiAwKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5SZWRpcmVjdGluZ0luaXRpYWxpemVyKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzU3ludGhldGljID8gMSA6IDApOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZUFyZ3VtZW50c05vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxvY2FsSW5pdGlhbGl6ZXIpOwogICAgd3JpdGVCeXRlKG5vZGUuaXNTeW50aGV0aWMgPyAxIDogMCk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Bc3NlcnRJbml0aWFsaXplcik7CiAgICB3cml0ZUJ5dGUobm9kZS5pc1N5bnRoZXRpYyA/IDEgOiAwKTsKICAgIHdyaXRlTm9kZShub2RlLnN0YXRlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkZ1bmN0aW9uTm9kZSk7CiAgICBlbnRlclNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzLCB2YXJpYWJsZVNjb3BlOiB0cnVlKTsKICAgIExhYmVsSW5kZXhlciBvbGRMYWJlbHMgPSBfbGFiZWxJbmRleGVyOwogICAgX2xhYmVsSW5kZXhlciA9IG51bGw7CiAgICBTd2l0Y2hDYXNlSW5kZXhlciBvbGRDYXNlcyA9IF9zd2l0Y2hDYXNlSW5kZXhlcjsKICAgIF9zd2l0Y2hDYXNlSW5kZXhlciA9IG51bGw7CiAgICAvLyBOb3RlOiBGdW5jdGlvbk5vZGUgaGFzIG5vIHRhZy4KICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpOwogICAgd3JpdGVCeXRlKG5vZGUuYXN5bmNNYXJrZXIuaW5kZXgpOwogICAgd3JpdGVCeXRlKG5vZGUuZGFydEFzeW5jTWFya2VyLmluZGV4KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVVJbnQzMChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCArIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICB3cml0ZVVJbnQzMChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMpOwogICAgd3JpdGVOb2RlKG5vZGUucmV0dXJuVHlwZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmJvZHkpOwogICAgX2xhYmVsSW5kZXhlciA9IG9sZExhYmVsczsKICAgIF9zd2l0Y2hDYXNlSW5kZXhlciA9IG9sZENhc2VzOwogICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycywgdmFyaWFibGVTY29wZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnZhbGlkRXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5tZXNzYWdlID8/ICcnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBpbnQgaW5kZXggPSBfdmFyaWFibGVJbmRleGVyW25vZGUudmFyaWFibGVdOwogICAgYXNzZXJ0KGluZGV4ICE9IG51bGwsICJObyBpbmRleCBmb3VuZCBmb3IgJHtub2RlLnZhcmlhYmxlfSIpOwogICAgaWYgKGluZGV4ICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2sgPT0gaW5kZXggJiYKICAgICAgICBub2RlLnByb21vdGVkVHlwZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU3BlY2lhbGl6ZWRWYXJpYWJsZUdldCArIGluZGV4KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlZhcmlhYmxlR2V0KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICAgIHdyaXRlVUludDMwKGluZGV4KTsKICAgICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5wcm9tb3RlZFR5cGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIGludCBpbmRleCA9IF92YXJpYWJsZUluZGV4ZXJbbm9kZS52YXJpYWJsZV07CiAgICBhc3NlcnQoaW5kZXggIT0gbnVsbCwgIk5vIGluZGV4IGZvdW5kIGZvciAke25vZGUudmFyaWFibGV9Iik7CiAgICBpZiAoaW5kZXggJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzayA9PSBpbmRleCkgewogICAgICB3cml0ZUJ5dGUoVGFnLlNwZWNpYWxpemVkVmFyaWFibGVTZXQgKyBpbmRleCk7CiAgICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICAgIHdyaXRlVUludDMwKG5vZGUudmFyaWFibGUuYmluYXJ5T2Zmc2V0Tm9UYWcpOwogICAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLlZhcmlhYmxlU2V0KTsKICAgICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgICAgd3JpdGVVSW50MzAobm9kZS52YXJpYWJsZS5iaW5hcnlPZmZzZXROb1RhZyk7CiAgICAgIHdyaXRlVUludDMwKGluZGV4KTsKICAgICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuUHJvcGVydHlHZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLnJlY2VpdmVyKTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Qcm9wZXJ0eVNldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgd3JpdGVOYW1lKG5vZGUubmFtZSk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdXBlclByb3BlcnR5R2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlTnVsbEFsbG93ZWRSZWZlcmVuY2Uobm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN1cGVyUHJvcGVydHlTZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5EaXJlY3RQcm9wZXJ0eUdldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkRpcmVjdFByb3BlcnR5U2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdGF0aWNHZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0YXRpY1NldCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5NZXRob2RJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU3VwZXJNZXRob2RJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5hbWUobm9kZS5uYW1lKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgICB3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNlKG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICB3cml0ZU5vbk51bGxSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVBcmd1bWVudHNOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUuaXNDb25zdCA/IFRhZy5Db25zdFN0YXRpY0ludm9jYXRpb24gOiBUYWcuU3RhdGljSW52b2NhdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlQXJndW1lbnRzTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5pc0NvbnN0CiAgICAgICAgPyBUYWcuQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb24KICAgICAgICA6IFRhZy5Db25zdHJ1Y3Rvckludm9jYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZUFyZ3VtZW50c05vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFyZ3VtZW50cyhBcmd1bWVudHMgbm9kZSkgewogICAgd3JpdGVVSW50MzAobm9kZS5wb3NpdGlvbmFsLmxlbmd0aCArIG5vZGUubmFtZWQubGVuZ3RoKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlcyk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUucG9zaXRpb25hbCk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUubmFtZWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROb3QoTm90IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuTm90KTsKICAgIHdyaXRlTm9kZShub2RlLm9wZXJhbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDaGVjayhOdWxsQ2hlY2sgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5OdWxsQ2hlY2spOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLm9wZXJhbmQpOwogIH0KCiAgaW50IGxvZ2ljYWxPcGVyYXRvckluZGV4KFN0cmluZyBvcGVyYXRvcikgewogICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICBjYXNlICcmJic6CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGNhc2UgJ3x8JzoKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdOb3QgYSBsb2dpY2FsIG9wZXJhdG9yOiAkb3BlcmF0b3InKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxvZ2ljYWxFeHByZXNzaW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmxlZnQpOwogICAgd3JpdGVCeXRlKGxvZ2ljYWxPcGVyYXRvckluZGV4KG5vZGUub3BlcmF0b3IpKTsKICAgIHdyaXRlTm9kZShub2RlLnJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQ29uZGl0aW9uYWxFeHByZXNzaW9uKTsKICAgIHdyaXRlTm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZU5vZGUobm9kZS50aGVuKTsKICAgIHdyaXRlTm9kZShub2RlLm90aGVyd2lzZSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLnN0YXRpY1R5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlN0cmluZ0NvbmNhdGVuYXRpb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5MaXN0Q29uY2F0ZW5hdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5saXN0cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uY2F0ZW5hdGlvbihTZXRDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuU2V0Q29uY2F0ZW5hdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5zZXRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBDb25jYXRlbmF0aW9uKE1hcENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5NYXBDb25jYXRlbmF0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5rZXlUeXBlKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlVHlwZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUubWFwcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDcmVhdGlvbihJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuSW5zdGFuY2VDcmVhdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUuY2xhc3NSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgd3JpdGVVSW50MzAobm9kZS5maWVsZFZhbHVlcy5sZW5ndGgpOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKGZpZWxkUmVmKTsKICAgICAgd3JpdGVOb2RlKHZhbHVlKTsKICAgIH0pOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmFzc2VydHMpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnVudXNlZEFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmlsZVVyaUV4cHJlc3Npb24oRmlsZVVyaUV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5GaWxlVXJpRXhwcmVzc2lvbik7CiAgICB3cml0ZVVyaVJlZmVyZW5jZShub2RlLmZpbGVVcmkpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Jc0V4cHJlc3Npb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlQnl0ZShub2RlLmZsYWdzKTsKICAgIHdyaXRlTm9kZShub2RlLm9wZXJhbmQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkFzRXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVOb2RlKG5vZGUub3BlcmFuZCk7CiAgICB3cml0ZU5vZGUobm9kZS50eXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TdHJpbmdMaXRlcmFsKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUludGVnZXIobm9kZS52YWx1ZSk7CiAgfQoKICB3cml0ZUludGVnZXIoaW50IHZhbHVlKSB7CiAgICBpbnQgYmlhc2VkVmFsdWUgPSB2YWx1ZSArIFRhZy5TcGVjaWFsaXplZEludExpdGVyYWxCaWFzOwogICAgaWYgKGJpYXNlZFZhbHVlID49IDAgJiYKICAgICAgICBiaWFzZWRWYWx1ZSAmIFRhZy5TcGVjaWFsaXplZFBheWxvYWRNYXNrID09IGJpYXNlZFZhbHVlKSB7CiAgICAgIHdyaXRlQnl0ZShUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsICsgYmlhc2VkVmFsdWUpOwogICAgfSBlbHNlIGlmICh2YWx1ZS5hYnMoKSA+PiAzMCA9PSAwKSB7CiAgICAgIGlmICh2YWx1ZSA8IDApIHsKICAgICAgICB3cml0ZUJ5dGUoVGFnLk5lZ2F0aXZlSW50TGl0ZXJhbCk7CiAgICAgICAgd3JpdGVVSW50MzAoLXZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZUJ5dGUoVGFnLlBvc2l0aXZlSW50TGl0ZXJhbCk7CiAgICAgICAgd3JpdGVVSW50MzAodmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPOiBQaWNrIGEgYmV0dGVyIGZvcm1hdCBmb3IgYmlnIGludCBsaXRlcmFscy4KICAgICAgd3JpdGVCeXRlKFRhZy5CaWdJbnRMaXRlcmFsKTsKICAgICAgd3JpdGVTdHJpbmdSZWZlcmVuY2UoJyR2YWx1ZScpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkRvdWJsZUxpdGVyYWwpOwogICAgd3JpdGVEb3VibGUobm9kZS52YWx1ZSk7CiAgfQoKICB3cml0ZURvdWJsZShkb3VibGUgdmFsdWUpIHsKICAgIF9zaW5rLmFkZERvdWJsZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKG5vZGUudmFsdWUgPyBUYWcuVHJ1ZUxpdGVyYWwgOiBUYWcuRmFsc2VMaXRlcmFsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLk51bGxMaXRlcmFsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5TeW1ib2xMaXRlcmFsKTsKICAgIHdyaXRlU3RyaW5nUmVmZXJlbmNlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuVHlwZUxpdGVyYWwpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UaGlzRXhwcmVzc2lvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuUmV0aHJvdyk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRocm93KFRocm93IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuVGhyb3cpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmlzQ29uc3QgPyBUYWcuQ29uc3RMaXN0TGl0ZXJhbCA6IFRhZy5MaXN0TGl0ZXJhbCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShub2RlLmlzQ29uc3QgPyBUYWcuQ29uc3RTZXRMaXRlcmFsIDogVGFnLlNldExpdGVyYWwpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5pc0NvbnN0ID8gVGFnLkNvbnN0TWFwTGl0ZXJhbCA6IFRhZy5NYXBMaXRlcmFsKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5rZXlUeXBlKTsKICAgIHdyaXRlTm9kZShub2RlLnZhbHVlVHlwZSk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuZW50cmllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwRW50cnkoTWFwRW50cnkgbm9kZSkgewogICAgLy8gTm90ZTogdGhlcmUgaXMgbm8gdGFnIG9uIE1hcEVudHJ5CiAgICB3cml0ZU5vZGUobm9kZS5rZXkpOwogICAgd3JpdGVOb2RlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Bd2FpdEV4cHJlc3Npb24pOwogICAgd3JpdGVOb2RlKG5vZGUub3BlcmFuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVGdW5jdGlvbk5vZGUobm9kZS5mdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGV0KExldCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxldCk7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkJsb2NrRXhwcmVzc2lvbik7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLmJvZHkuc3RhdGVtZW50cyk7CiAgICB3cml0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuSW5zdGFudGlhdGlvbik7CiAgICB3cml0ZU5vZGUobm9kZS5leHByZXNzaW9uKTsKICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkxvYWRMaWJyYXJ5KTsKICAgIHdyaXRlTGlicmFyeURlcGVuZGVuY3lSZWZlcmVuY2Uobm9kZS5pbXBvcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQ2hlY2tMaWJyYXJ5SXNMb2FkZWQpOwogICAgd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZShub2RlLmltcG9ydCk7CiAgfQoKICB3cml0ZVN0YXRlbWVudE9yRW1wdHkoU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5FbXB0eVN0YXRlbWVudCk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZU5vZGUobm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRXhwcmVzc2lvblN0YXRlbWVudCk7CiAgICB3cml0ZU5vZGUobm9kZS5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVCeXRlKFRhZy5CbG9jayk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUuc3RhdGVtZW50cyk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgewogICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5wdXNoU2NvcGUoKTsKICAgIHdyaXRlQnl0ZShUYWcuQXNzZXJ0QmxvY2spOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnN0YXRlbWVudHMpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5wb3BTY29wZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRW1wdHlTdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Bc3NlcnRTdGF0ZW1lbnQpOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuY29uZGl0aW9uU3RhcnRPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5jb25kaXRpb25FbmRPZmZzZXQpOwogICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5tZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKF9sYWJlbEluZGV4ZXIgPT0gbnVsbCkgewogICAgICBfbGFiZWxJbmRleGVyID0gbmV3IExhYmVsSW5kZXhlcigpOwogICAgfQogICAgX2xhYmVsSW5kZXhlci5lbnRlcihub2RlKTsKICAgIHdyaXRlQnl0ZShUYWcuTGFiZWxlZFN0YXRlbWVudCk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF9sYWJlbEluZGV4ZXIuZXhpdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Db25zdGFudEV4cHJlc3Npb24pOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlRGFydFR5cGUobm9kZS50eXBlKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZS5jb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5CcmVha1N0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVVSW50MzAoX2xhYmVsSW5kZXhlcltub2RlLnRhcmdldF0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuV2hpbGVTdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmNvbmRpdGlvbik7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb1N0YXRlbWVudChEb1N0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLkRvU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIHdyaXRlTm9kZShub2RlLmNvbmRpdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSB7CiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVCeXRlKFRhZy5Gb3JTdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3Qobm9kZS52YXJpYWJsZXMpOwogICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5jb25kaXRpb24pOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnVwZGF0ZXMpOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgICBfdmFyaWFibGVJbmRleGVyLnBvcFNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgX3ZhcmlhYmxlSW5kZXhlciA/Pz0gbmV3IFZhcmlhYmxlSW5kZXhlcigpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5wdXNoU2NvcGUoKTsKICAgIHdyaXRlQnl0ZShub2RlLmlzQXN5bmMgPyBUYWcuQXN5bmNGb3JJblN0YXRlbWVudCA6IFRhZy5Gb3JJblN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5ib2R5T2Zmc2V0KTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLnZhcmlhYmxlKTsKICAgIHdyaXRlTm9kZShub2RlLml0ZXJhYmxlKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgX3ZhcmlhYmxlSW5kZXhlci5wb3BTY29wZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKF9zd2l0Y2hDYXNlSW5kZXhlciA9PSBudWxsKSB7CiAgICAgIF9zd2l0Y2hDYXNlSW5kZXhlciA9IG5ldyBTd2l0Y2hDYXNlSW5kZXhlcigpOwogICAgfQogICAgX3N3aXRjaENhc2VJbmRleGVyLmVudGVyKG5vZGUpOwogICAgd3JpdGVCeXRlKFRhZy5Td2l0Y2hTdGF0ZW1lbnQpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgd3JpdGVTd2l0Y2hDYXNlTm9kZUxpc3Qobm9kZS5jYXNlcyk7CiAgICBfc3dpdGNoQ2FzZUluZGV4ZXIuZXhpdChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTd2l0Y2hDYXNlKFN3aXRjaENhc2Ugbm9kZSkgewogICAgLy8gTm90ZTogdGhlcmUgaXMgbm8gdGFnIG9uIFN3aXRjaENhc2UuCiAgICBpbnQgbGVuZ3RoID0gbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7CiAgICB3cml0ZVVJbnQzMChsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICB3cml0ZU9mZnNldChub2RlLmV4cHJlc3Npb25PZmZzZXRzW2ldKTsKICAgICAgd3JpdGVOb2RlKG5vZGUuZXhwcmVzc2lvbnNbaV0pOwogICAgfQogICAgd3JpdGVCeXRlKG5vZGUuaXNEZWZhdWx0ID8gMSA6IDApOwogICAgd3JpdGVOb2RlKG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Db250aW51ZVN3aXRjaFN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVVSW50MzAoX3N3aXRjaENhc2VJbmRleGVyW25vZGUudGFyZ2V0XSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JZlN0YXRlbWVudCk7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVOb2RlKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlTm9kZShub2RlLnRoZW4pOwogICAgd3JpdGVTdGF0ZW1lbnRPckVtcHR5KG5vZGUub3RoZXJ3aXNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuUmV0dXJuU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgaW50IF9lbmNvZGVUcnlDYXRjaEZsYWdzKGJvb2wgbmVlZHNTdGFja1RyYWNlLCBib29sIGlzU3ludGhldGljKSB7CiAgICByZXR1cm4gKG5lZWRzU3RhY2tUcmFjZSA/IDEgOiAwKSB8IChpc1N5bnRoZXRpYyA/IDIgOiAwKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlRyeUNhdGNoKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgYm9vbCBuZWVkc1N0YWNrVHJhY2UgPSBub2RlLmNhdGNoZXMuYW55KChDYXRjaCBjKSA9PiBjLnN0YWNrVHJhY2UgIT0gbnVsbCk7CiAgICB3cml0ZUJ5dGUoX2VuY29kZVRyeUNhdGNoRmxhZ3MobmVlZHNTdGFja1RyYWNlLCBub2RlLmlzU3ludGhldGljKSk7CiAgICB3cml0ZUNhdGNoTm9kZUxpc3Qobm9kZS5jYXRjaGVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyB0YWcgb24gQ2F0Y2guCiAgICBfdmFyaWFibGVJbmRleGVyID8/PSBuZXcgVmFyaWFibGVJbmRleGVyKCk7CiAgICBfdmFyaWFibGVJbmRleGVyLnB1c2hTY29wZSgpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlTm9kZShub2RlLmd1YXJkKTsKICAgIHdyaXRlT3B0aW9uYWxWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUuZXhjZXB0aW9uKTsKICAgIHdyaXRlT3B0aW9uYWxWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUuc3RhY2tUcmFjZSk7CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF92YXJpYWJsZUluZGV4ZXIucG9wU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5UcnlGaW5hbGx5KTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogICAgd3JpdGVOb2RlKG5vZGUuZmluYWxpemVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLllpZWxkU3RhdGVtZW50KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZU5vZGUobm9kZS5leHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5WYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTsKICB9CgogIHZvaWQgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgaWYgKF9tZXRhZGF0YVN1YnNlY3Rpb25zICE9IG51bGwpIHsKICAgICAgX3dyaXRlTm9kZU1ldGFkYXRhKG5vZGUpOwogICAgfQogICAgbm9kZS5iaW5hcnlPZmZzZXROb1RhZyA9IGdldEJ1ZmZlck9mZnNldCgpOwogICAgd3JpdGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZUVxdWFsc09mZnNldCk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVCeXRlKG5vZGUuZmxhZ3MpOwogICAgd3JpdGVTdHJpbmdSZWZlcmVuY2Uobm9kZS5uYW1lID8/ICcnKTsKICAgIHdyaXRlTm9kZShub2RlLnR5cGUpOwogICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5pbml0aWFsaXplcik7CiAgICAvLyBEZWNsYXJlIHRoZSB2YXJpYWJsZSBhZnRlciBpdHMgaW5pdGlhbGl6ZXIuIEl0IGlzIG5vdCBpbiBzY29wZSBpbiBpdHMKICAgIC8vIG93biBpbml0aWFsaXplci4KICAgIF92YXJpYWJsZUluZGV4ZXIgPz89IG5ldyBWYXJpYWJsZUluZGV4ZXIoKTsKICAgIF92YXJpYWJsZUluZGV4ZXIuZGVjbGFyZShub2RlKTsKICB9CgogIHZvaWQgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5vZGVzKSB7CiAgICB3cml0ZUxpc3Qobm9kZXMsIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZUJ5dGUoVGFnLk5vdGhpbmcpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVCeXRlKFRhZy5Tb21ldGhpbmcpOwogICAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuRnVuY3Rpb25EZWNsYXJhdGlvbik7CiAgICB3cml0ZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVGdW5jdGlvbk5vZGUobm9kZS5mdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuQm90dG9tVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLk5ldmVyVHlwZSk7CiAgICB3cml0ZUJ5dGUobm9kZS5udWxsYWJpbGl0eS5pbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5JbnZhbGlkVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5EeW5hbWljVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgewogICAgd3JpdGVCeXRlKFRhZy5Wb2lkVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgICB3cml0ZUJ5dGUoVGFnLlNpbXBsZUludGVyZmFjZVR5cGUpOwogICAgICB3cml0ZUJ5dGUobm9kZS5udWxsYWJpbGl0eS5pbmRleCk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLkludGVyZmFjZVR5cGUpOwogICAgICB3cml0ZUJ5dGUobm9kZS5udWxsYWJpbGl0eS5pbmRleCk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICAgIHdyaXRlTm9kZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlcnR5cGUoU3VwZXJ0eXBlIG5vZGUpIHsKICAgIC8vIFdyaXRpbmcgbnVsbGFiaWxpdHkgYmVsb3cgaXMgb25seSBuZWNlc3NhcnkgYmVjYXVzZQogICAgLy8gQmluYXJ5QnVpbGRlci5yZWFkU3VwZXJ0eXBlIHJlYWRzIHRoZSBzdXBlcnR5cGUgYXMgYW4gSW50ZXJmYWNlVHlwZSBhbmQKICAgIC8vIGJyZWFrcyBpdCBpbnRvIGNvbXBvbmVudHMgYWZ0ZXJ3YXJkcywgYW5kIHJlYWRpbmcgYW4gSW50ZXJmYWNlVHlwZQogICAgLy8gcmVxdWlyZXMgdGhlIG51bGxhYmlsaXR5IGJ5dGUuCiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TaW1wbGVJbnRlcmZhY2VUeXBlKTsKICAgICAgd3JpdGVCeXRlKF9jdXJyZW50TGlicmFyeS5ub25OdWxsYWJsZS5pbmRleCk7CiAgICAgIHdyaXRlTm9uTnVsbFJlZmVyZW5jZShub2RlLmNsYXNzTmFtZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUoVGFnLkludGVyZmFjZVR5cGUpOwogICAgICB3cml0ZUJ5dGUoX2N1cnJlbnRMaWJyYXJ5Lm5vbk51bGxhYmxlLmluZGV4KTsKICAgICAgd3JpdGVOb25OdWxsUmVmZXJlbmNlKG5vZGUuY2xhc3NOYW1lKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9PSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAmJgogICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSAmJgogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkgJiYKICAgICAgICBub2RlLnR5cGVkZWZUeXBlID09IG51bGwpIHsKICAgICAgd3JpdGVCeXRlKFRhZy5TaW1wbGVGdW5jdGlvblR5cGUpOwogICAgICB3cml0ZUJ5dGUobm9kZS5udWxsYWJpbGl0eS5pbmRleCk7CiAgICAgIHdyaXRlTm9kZUxpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycyk7CiAgICAgIHdyaXRlTm9kZShub2RlLnJldHVyblR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVCeXRlKFRhZy5GdW5jdGlvblR5cGUpOwogICAgICB3cml0ZUJ5dGUobm9kZS5udWxsYWJpbGl0eS5pbmRleCk7CiAgICAgIGVudGVyU2NvcGUodHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgICB3cml0ZVVJbnQzMChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgICB3cml0ZVVJbnQzMCgKICAgICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgICAgd3JpdGVOb2RlTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycyk7CiAgICAgIHdyaXRlT3B0aW9uYWxOb2RlKG5vZGUudHlwZWRlZlR5cGUpOwogICAgICB3cml0ZU5vZGUobm9kZS5yZXR1cm5UeXBlKTsKICAgICAgbGVhdmVTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUpOwogICAgd3JpdGVOb2RlKG5vZGUudHlwZSk7CiAgICBpbnQgZmxhZ3MgPSAobm9kZS5pc1JlcXVpcmVkID8gTmFtZWRUeXBlLkZsYWdSZXF1aXJlZE5hbWVkVHlwZSA6IDApOwogICAgd3JpdGVCeXRlKGZsYWdzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICB3cml0ZUJ5dGUoVGFnLlR5cGVQYXJhbWV0ZXJUeXBlKTsKICAgIHdyaXRlQnl0ZShub2RlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkuaW5kZXgpOwogICAgd3JpdGVVSW50MzAoX3R5cGVQYXJhbWV0ZXJJbmRleGVyW25vZGUucGFyYW1ldGVyXSk7CiAgICB3cml0ZU9wdGlvbmFsTm9kZShub2RlLnByb21vdGVkQm91bmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHdyaXRlQnl0ZShUYWcuVHlwZWRlZlR5cGUpOwogICAgd3JpdGVCeXRlKG5vZGUubnVsbGFiaWxpdHkuaW5kZXgpOwogICAgd3JpdGVOdWxsQWxsb3dlZFJlZmVyZW5jZShub2RlLnR5cGVkZWZSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlTGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICB3cml0ZUJ5dGUobm9kZS5mbGFncyk7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgaWYgKG5vZGUuaXNMZWdhY3lDb3ZhcmlhbnQpIHsKICAgICAgd3JpdGVCeXRlKFR5cGVQYXJhbWV0ZXIubGVnYWN5Q292YXJpYW50U2VyaWFsaXphdGlvbk1hcmtlcik7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUJ5dGUobm9kZS52YXJpYW5jZSk7CiAgICB9CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVOb2RlKG5vZGUuYm91bmQpOwogICAgd3JpdGVPcHRpb25hbE5vZGUobm9kZS5kZWZhdWx0VHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RXh0ZW5zaW9uKEV4dGVuc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZS5jYW5vbmljYWxOYW1lID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgY2Fub25pY2FsIG5hbWUgZm9yICRub2RlJyk7CiAgICB9CiAgICB3cml0ZUJ5dGUoVGFnLkV4dGVuc2lvbik7CiAgICB3cml0ZU5vbk51bGxDYW5vbmljYWxOYW1lUmVmZXJlbmNlKGdldENhbm9uaWNhbE5hbWVPZkV4dGVuc2lvbihub2RlKSk7CiAgICB3cml0ZVN0cmluZ1JlZmVyZW5jZShub2RlLm5hbWUgPz8gJycpOwogICAgd3JpdGVVcmlSZWZlcmVuY2Uobm9kZS5maWxlVXJpKTsKICAgIHdyaXRlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCk7CgogICAgZW50ZXJTY29wZSh0eXBlUGFyYW1ldGVyczogbm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZU5vZGVMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVEYXJ0VHlwZShub2RlLm9uVHlwZSk7CiAgICBsZWF2ZVNjb3BlKHR5cGVQYXJhbWV0ZXJzOiBub2RlLnR5cGVQYXJhbWV0ZXJzKTsKCiAgICBmaW5hbCBpbnQgbGVuID0gbm9kZS5tZW1iZXJzLmxlbmd0aDsKICAgIHdyaXRlVUludDMwKGxlbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGZpbmFsIEV4dGVuc2lvbk1lbWJlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5vZGUubWVtYmVyc1tpXTsKICAgICAgd3JpdGVOYW1lKGRlc2NyaXB0b3IubmFtZSk7CiAgICAgIHdyaXRlQnl0ZShkZXNjcmlwdG9yLmtpbmQuaW5kZXgpOwogICAgICB3cml0ZUJ5dGUoZGVzY3JpcHRvci5mbGFncyk7CiAgICAgIHdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoZGVzY3JpcHRvci5tZW1iZXIuY2Fub25pY2FsTmFtZSk7CiAgICB9CiAgfQoKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gVGhlc2UgYXJlIG5vZGVzIHRoYXQgYXJlIG5ldmVyIHNlcmlhbGl6ZWQgZGlyZWN0bHkuICBSZWFjaGluZyBvbmUKICAvLyBkdXJpbmcgc2VyaWFsaXphdGlvbiBpcyBhbiBlcnJvci4KICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBOb2RlOiAke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBDb25zdGFudDogJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBCYXNpY0xpdGVyYWw6ICR7bm9kZX0gKCR7bm9kZS5ydW50aW1lVHlwZX0pJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIENvbnN0YW50IHJlZmVyZW5jZTogJwogICAgICAgICcke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBEYXJ0VHlwZTogJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIEV4cHJlc3Npb246ICR7bm9kZX0gKCR7bm9kZS5ydW50aW1lVHlwZX0pJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRJbml0aWFsaXplcihJbml0aWFsaXplciBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIEluaXRpYWxpemVyOiAke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIE1lbWJlcjogJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBNZW1iZXIgcmVmZXJlbmNlOiAnCiAgICAgICAgJyR7bm9kZX0gKCR7bm9kZS5ydW50aW1lVHlwZX0pJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgU3RhdGVtZW50OiAke25vZGV9ICgke25vZGUucnVudGltZVR5cGV9KScpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBUcmVlTm9kZTogJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEJvb2xDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCb29sQ29uc3RhbnRSZWZlcmVuY2UoQm9vbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIEJvb2xDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgQ2xhc3MgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIENvbnN0cnVjdG9yIHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBEb3VibGVDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudFJlZmVyZW5jZShEb3VibGVDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBEb3VibGVDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGRSZWZlcmVuY2UoRmllbGQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgRmllbGQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBJbnN0YW5jZUNvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEluc3RhbmNlQ29uc3RhbnRSZWZlcmVuY2UoSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBJbnN0YW5jZUNvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBJbnRDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnRDb25zdGFudFJlZmVyZW5jZShJbnRDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBJbnRDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlicmFyeURlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTGlicmFyeURlcGVuZGVuY2llcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpYnJhcnlQYXJ0KExpYnJhcnlQYXJ0IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIExpYnJhcnlQYXJ0cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTGlzdENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpc3RDb25zdGFudFJlZmVyZW5jZShMaXN0Q29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTGlzdENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBTZXRDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTZXRDb25zdGFudFJlZmVyZW5jZShTZXRDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBTZXRDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTWFwQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwQ29uc3RhbnRSZWZlcmVuY2UoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTWFwQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hbWUoTmFtZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBOYW1lcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTnVsbENvbnN0YW50cycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudFJlZmVyZW5jZShOdWxsQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgTnVsbENvbnN0YW50IHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQcm9jZWR1cmVSZWZlcmVuY2UoUHJvY2VkdXJlIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFByb2NlZHVyZSByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29tcG9uZW50KENvbXBvbmVudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBDb21wb25lbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdzZXJpYWxpemF0aW9uIG9mIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBTdHJpbmdDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdDb25zdGFudFJlZmVyZW5jZShTdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBTdHJpbmdDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU3ltYm9sQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3ltYm9sQ29uc3RhbnRSZWZlcmVuY2UoU3ltYm9sQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgU3ltYm9sQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAnc2VyaWFsaXphdGlvbiBvZiBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50cyAnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50UmVmZXJlbmNlKAogICAgICBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdzZXJpYWxpemF0aW9uIG9mIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgVGVhck9mZkNvbnN0YW50cyAnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUZWFyT2ZmQ29uc3RhbnRSZWZlcmVuY2UoVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFRlYXJPZmZDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudChUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdzZXJpYWxpemF0aW9uIG9mIFR5cGVMaXRlcmFsQ29uc3RhbnRzJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZShUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICdzZXJpYWxpemF0aW9uIG9mIFR5cGVMaXRlcmFsQ29uc3RhbnQgcmVmZXJlbmNlcycpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignc2VyaWFsaXphdGlvbiBvZiBUeXBlZGVmIHJlZmVyZW5jZXMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ3NlcmlhbGl6YXRpb24gb2YgVW5ldmFsdWF0ZWRDb25zdGFudHMnKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50UmVmZXJlbmNlKFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ3NlcmlhbGl6YXRpb24gb2YgVW5ldmFsdWF0ZWRDb25zdGFudCByZWZlcmVuY2VzJyk7CiAgfQp9Cgp0eXBlZGVmIGJvb2wgTGlicmFyeUZpbHRlcihMaWJyYXJ5IF8pOwoKY2xhc3MgVmFyaWFibGVJbmRleGVyIHsKICBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgaW50PiBpbmRleDsKICBMaXN0PGludD4gc2NvcGVzOwogIGludCBzdGFja0hlaWdodCA9IDA7CgogIHZvaWQgZGVjbGFyZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGluZGV4ID8/PSA8VmFyaWFibGVEZWNsYXJhdGlvbiwgaW50Pnt9OwogICAgaW5kZXhbbm9kZV0gPSBzdGFja0hlaWdodCsrOwogIH0KCiAgdm9pZCBwdXNoU2NvcGUoKSB7CiAgICBzY29wZXMgPz89IG5ldyBMaXN0PGludD4oKTsKICAgIHNjb3Blcy5hZGQoc3RhY2tIZWlnaHQpOwogIH0KCiAgdm9pZCBwb3BTY29wZSgpIHsKICAgIHN0YWNrSGVpZ2h0ID0gc2NvcGVzLnJlbW92ZUxhc3QoKTsKICB9CgogIHZvaWQgcmVzdG9yZVNjb3BlKGludCBudW1iZXJPZlZhcmlhYmxlcykgewogICAgc3RhY2tIZWlnaHQgKz0gbnVtYmVyT2ZWYXJpYWJsZXM7CiAgfQoKICBpbnQgb3BlcmF0b3IgW10oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gaW5kZXggPT0gbnVsbCA/IG51bGwgOiBpbmRleFtub2RlXTsKICB9Cn0KCmNsYXNzIExhYmVsSW5kZXhlciB7CiAgZmluYWwgTWFwPExhYmVsZWRTdGF0ZW1lbnQsIGludD4gaW5kZXggPSA8TGFiZWxlZFN0YXRlbWVudCwgaW50Pnt9OwogIGludCBzdGFja0hlaWdodCA9IDA7CgogIHZvaWQgZW50ZXIoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBpbmRleFtub2RlXSA9IHN0YWNrSGVpZ2h0Kys7CiAgfQoKICB2b2lkIGV4aXQoKSB7CiAgICAtLXN0YWNrSGVpZ2h0OwogIH0KCiAgaW50IG9wZXJhdG9yIFtdKExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gaW5kZXhbbm9kZV07Cn0KCmNsYXNzIFN3aXRjaENhc2VJbmRleGVyIHsKICBmaW5hbCBNYXA8U3dpdGNoQ2FzZSwgaW50PiBpbmRleCA9IDxTd2l0Y2hDYXNlLCBpbnQ+e307CiAgaW50IHN0YWNrSGVpZ2h0ID0gMDsKCiAgdm9pZCBlbnRlcihTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgZm9yIChTd2l0Y2hDYXNlIGNhc2VOb2RlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgaW5kZXhbY2FzZU5vZGVdID0gc3RhY2tIZWlnaHQrKzsKICAgIH0KICB9CgogIHZvaWQgZXhpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RhY2tIZWlnaHQgLT0gbm9kZS5jYXNlcy5sZW5ndGg7CiAgfQoKICBpbnQgb3BlcmF0b3IgW10oU3dpdGNoQ2FzZSBub2RlKSA9PiBpbmRleFtub2RlXTsKfQoKY2xhc3MgQ29uc3RhbnRJbmRleGVyIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgU3RyaW5nSW5kZXhlciBzdHJpbmdJbmRleGVyOwoKICBmaW5hbCBMaXN0PENvbnN0YW50PiBlbnRyaWVzID0gPENvbnN0YW50PltdOwogIGZpbmFsIE1hcDxDb25zdGFudCwgaW50PiBvZmZzZXRzID0gPENvbnN0YW50LCBpbnQ+e307CiAgaW50IG5leHRPZmZzZXQgPSAwOwoKICBmaW5hbCBCaW5hcnlQcmludGVyIF9wcmludGVyOwoKICBDb25zdGFudEluZGV4ZXIodGhpcy5zdHJpbmdJbmRleGVyLCB0aGlzLl9wcmludGVyKTsKCiAgaW50IHB1dChDb25zdGFudCBjb25zdGFudCkgewogICAgZmluYWwgaW50IG9sZE9mZnNldCA9IG9mZnNldHNbY29uc3RhbnRdOwogICAgaWYgKG9sZE9mZnNldCAhPSBudWxsKSByZXR1cm4gb2xkT2Zmc2V0OwoKICAgIC8vIFRyYXZlcnNlIERBRyBpbiBwb3N0LW9yZGVyIHRvIGVuc3VyZSBjaGlsZHJlbiBoYXZlIHRoZWlyIG9mZnNldHMgYXNzaWduZWQKICAgIC8vIGJlZm9yZSB0aGUgcGFyZW50LgogICAgY29uc3RhbnQudmlzaXRDaGlsZHJlbih0aGlzKTsKCiAgICBpZiAoY29uc3RhbnQgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgc3RyaW5nSW5kZXhlci5wdXQoY29uc3RhbnQudmFsdWUpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBTeW1ib2xDb25zdGFudCkgewogICAgICBzdHJpbmdJbmRleGVyLnB1dChjb25zdGFudC5uYW1lKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgRG91YmxlQ29uc3RhbnQpIHsKICAgICAgc3RyaW5nSW5kZXhlci5wdXQoJyR7Y29uc3RhbnQudmFsdWV9Jyk7CiAgICB9IGVsc2UgaWYgKGNvbnN0YW50IGlzIEludENvbnN0YW50KSB7CiAgICAgIGZpbmFsIGludCB2YWx1ZSA9IGNvbnN0YW50LnZhbHVlOwogICAgICBpZiAoKHZhbHVlLmFicygpID4+IDMwKSAhPSAwKSB7CiAgICAgICAgc3RyaW5nSW5kZXhlci5wdXQoJyR2YWx1ZScpOwogICAgICB9CiAgICB9CgogICAgZmluYWwgaW50IG5ld09mZnNldCA9IG5leHRPZmZzZXQ7CiAgICBlbnRyaWVzLmFkZChjb25zdGFudCk7CiAgICBuZXh0T2Zmc2V0ICs9IF9wcmludGVyLndyaXRlQ29uc3RhbnRUYWJsZUVudHJ5KGNvbnN0YW50KTsKICAgIHJldHVybiBvZmZzZXRzW2NvbnN0YW50XSA9IG5ld09mZnNldDsKICB9CgogIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBub2RlKSB7CiAgICBwdXQobm9kZSk7CiAgfQoKICBpbnQgb3BlcmF0b3IgW10oQ29uc3RhbnQgbm9kZSkgPT4gb2Zmc2V0c1tub2RlXTsKfQoKY2xhc3MgVHlwZVBhcmFtZXRlckluZGV4ZXIgewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBpbnQ+IGluZGV4ID0gPFR5cGVQYXJhbWV0ZXIsIGludD57fTsKICBpbnQgc3RhY2tIZWlnaHQgPSAwOwoKICB2b2lkIGVudGVyKExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgaW5kZXhbcGFyYW1ldGVyXSA9IHN0YWNrSGVpZ2h0OwogICAgICArK3N0YWNrSGVpZ2h0OwogICAgfQogIH0KCiAgdm9pZCBleGl0KExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICAgIHN0YWNrSGVpZ2h0IC09IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgaW5kZXgucmVtb3ZlKHR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgIH0KICB9CgogIGludCBvcGVyYXRvciBbXShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcikgPT4KICAgICAgaW5kZXhbcGFyYW1ldGVyXSA/PwogICAgICAodGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ1R5cGUgcGFyYW1ldGVyICRwYXJhbWV0ZXIgaXMgbm90IGluZGV4ZWQnKSk7Cn0KCmNsYXNzIFN0cmluZ0luZGV4ZXIgewogIC8vIE5vdGUgdGhhdCB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIGltcG9ydGFudC4KICBmaW5hbCBNYXA8U3RyaW5nLCBpbnQ+IGluZGV4ID0gbmV3IE1hcDxTdHJpbmcsIGludD4oKTsKCiAgU3RyaW5nSW5kZXhlcigpIHsKICAgIHB1dCgnJyk7CiAgfQoKICBpbnQgcHV0KFN0cmluZyBzdHJpbmcpIHsKICAgIGludCByZXN1bHQgPSBpbmRleFtzdHJpbmddOwogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IGluZGV4Lmxlbmd0aDsKICAgICAgaW5kZXhbc3RyaW5nXSA9IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpbnQgb3BlcmF0b3IgW10oU3RyaW5nIHN0cmluZykgPT4gaW5kZXhbc3RyaW5nXTsKfQoKY2xhc3MgVXJpSW5kZXhlciB7CiAgLy8gTm90ZSB0aGF0IHRoZSBpdGVyYXRpb24gb3JkZXIgaXMgaW1wb3J0YW50LgogIGZpbmFsIE1hcDxVcmksIGludD4gaW5kZXggPSBuZXcgTWFwPFVyaSwgaW50PigpOwoKICBVcmlJbmRleGVyKCkgewogICAgcHV0KG51bGwpOwogIH0KCiAgaW50IHB1dChVcmkgdXJpKSB7CiAgICBpbnQgcmVzdWx0ID0gaW5kZXhbdXJpXTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICByZXN1bHQgPSBpbmRleC5sZW5ndGg7CiAgICAgIGluZGV4W3VyaV0gPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLy8vIFB1dHMgYSBidWZmZXIgaW4gZnJvbnQgb2YgYSBbU2luazxMaXN0PGludD4+XS4KY2xhc3MgQnVmZmVyZWRTaW5rIHsKICBzdGF0aWMgY29uc3QgaW50IFNJWkUgPSAxMDAwMDA7CiAgc3RhdGljIGNvbnN0IGludCBTQUZFX1NJWkUgPSBTSVpFIC0gNTsKICBzdGF0aWMgY29uc3QgaW50IFNNQUxMID0gMTAwMDA7CiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwogIFVpbnQ4TGlzdCBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICBpbnQgbGVuZ3RoID0gMDsKICBpbnQgZmx1c2hlZExlbmd0aCA9IDA7CgogIEZsb2F0NjRMaXN0IF9kb3VibGVCdWZmZXIgPSBuZXcgRmxvYXQ2NExpc3QoMSk7CiAgVWludDhMaXN0IF9kb3VibGVCdWZmZXJVaW50ODsKCiAgaW50IGdldCBvZmZzZXQgPT4gbGVuZ3RoICsgZmx1c2hlZExlbmd0aDsKCiAgQnVmZmVyZWRTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZERvdWJsZShkb3VibGUgZCkgewogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4ID8/PSBfZG91YmxlQnVmZmVyLmJ1ZmZlci5hc1VpbnQ4TGlzdCgpOwogICAgX2RvdWJsZUJ1ZmZlclswXSA9IGQ7CiAgICBhZGRCeXRlNChfZG91YmxlQnVmZmVyVWludDhbMF0sIF9kb3VibGVCdWZmZXJVaW50OFsxXSwKICAgICAgICBfZG91YmxlQnVmZmVyVWludDhbMl0sIF9kb3VibGVCdWZmZXJVaW50OFszXSk7CiAgICBhZGRCeXRlNChfZG91YmxlQnVmZmVyVWludDhbNF0sIF9kb3VibGVCdWZmZXJVaW50OFs1XSwKICAgICAgICBfZG91YmxlQnVmZmVyVWludDhbNl0sIF9kb3VibGVCdWZmZXJVaW50OFs3XSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIGFkZEJ5dGUoaW50IGJ5dGUpIHsKICAgIF9idWZmZXJbbGVuZ3RoKytdID0gYnl0ZTsKICAgIGlmIChsZW5ndGggPT0gU0laRSkgewogICAgICBfc2luay5hZGQoX2J1ZmZlcik7CiAgICAgIF9idWZmZXIgPSBuZXcgVWludDhMaXN0KFNJWkUpOwogICAgICBsZW5ndGggPSAwOwogICAgICBmbHVzaGVkTGVuZ3RoICs9IFNJWkU7CiAgICB9CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIGFkZEJ5dGUyKGludCBieXRlMSwgaW50IGJ5dGUyKSB7CiAgICBpZiAobGVuZ3RoIDwgU0FGRV9TSVpFKSB7CiAgICAgIF9idWZmZXJbbGVuZ3RoKytdID0gYnl0ZTE7CiAgICAgIF9idWZmZXJbbGVuZ3RoKytdID0gYnl0ZTI7CiAgICB9IGVsc2UgewogICAgICBhZGRCeXRlKGJ5dGUxKTsKICAgICAgYWRkQnl0ZShieXRlMik7CiAgICB9CiAgfQoKICBAcHJhZ21hKCJ2bTpwcmVmZXItaW5saW5lIikKICB2b2lkIGFkZEJ5dGU0KGludCBieXRlMSwgaW50IGJ5dGUyLCBpbnQgYnl0ZTMsIGludCBieXRlNCkgewogICAgaWYgKGxlbmd0aCA8IFNBRkVfU0laRSkgewogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUxOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUyOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGUzOwogICAgICBfYnVmZmVyW2xlbmd0aCsrXSA9IGJ5dGU0OwogICAgfSBlbHNlIHsKICAgICAgYWRkQnl0ZShieXRlMSk7CiAgICAgIGFkZEJ5dGUoYnl0ZTIpOwogICAgICBhZGRCeXRlKGJ5dGUzKTsKICAgICAgYWRkQnl0ZShieXRlNCk7CiAgICB9CiAgfQoKICB2b2lkIGFkZEJ5dGVzKExpc3Q8aW50PiBieXRlcykgewogICAgLy8gQXZvaWQgY29weWluZyBhIGxhcmdlIGJ1ZmZlciBpbnRvIHRoZSBhbm90aGVyIGxhcmdlIGJ1ZmZlci4gQWxzbywgaWYKICAgIC8vIHRoZSBieXRlcyBidWZmZXIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBvdXIgb3duIGJ1ZmZlciwganVzdCBlbWl0IGJvdGguCiAgICBpZiAobGVuZ3RoICsgYnl0ZXMubGVuZ3RoIDwgU0laRSAmJgogICAgICAgIChieXRlcy5sZW5ndGggPCBTTUFMTCB8fCBsZW5ndGggPCBTTUFMTCkpIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShsZW5ndGgsIGxlbmd0aCArIGJ5dGVzLmxlbmd0aCwgYnl0ZXMpOwogICAgICBsZW5ndGggKz0gYnl0ZXMubGVuZ3RoOwogICAgfSBlbHNlIGlmIChieXRlcy5sZW5ndGggPCBTTUFMTCkgewogICAgICAvLyBGbHVzaCBhcyBtdWNoIGFzIHdlIGNhbiBpbiB0aGUgY3VycmVudCBidWZmZXIuCiAgICAgIF9idWZmZXIuc2V0UmFuZ2UobGVuZ3RoLCBTSVpFLCBieXRlcyk7CiAgICAgIF9zaW5rLmFkZChfYnVmZmVyKTsKICAgICAgLy8gQ29weSBvdmVyIHRoZSByZW1haW5kZXIgaW50byBhIG5ldyBidWZmZXIuIEl0IGlzIGd1YXJhbnRlZWQgdG8gZml0CiAgICAgIC8vIGJlY2F1c2UgdGhlIGlucHV0IGJ5dGUgYXJyYXkgaXMgc21hbGwuCiAgICAgIGludCBhbHJlYWR5RW1pdHRlZCA9IFNJWkUgLSBsZW5ndGg7CiAgICAgIGludCByZW1haW5kZXIgPSBieXRlcy5sZW5ndGggLSBhbHJlYWR5RW1pdHRlZDsKICAgICAgX2J1ZmZlciA9IG5ldyBVaW50OExpc3QoU0laRSk7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UoMCwgcmVtYWluZGVyLCBieXRlcywgYWxyZWFkeUVtaXR0ZWQpOwogICAgICBsZW5ndGggPSByZW1haW5kZXI7CiAgICAgIGZsdXNoZWRMZW5ndGggKz0gU0laRTsKICAgIH0gZWxzZSB7CiAgICAgIGZsdXNoKCk7CiAgICAgIF9zaW5rLmFkZChieXRlcyk7CiAgICAgIGZsdXNoZWRMZW5ndGggKz0gYnl0ZXMubGVuZ3RoOwogICAgfQogIH0KCiAgdm9pZCBmbHVzaCgpIHsKICAgIF9zaW5rLmFkZChfYnVmZmVyLnN1Ymxpc3QoMCwgbGVuZ3RoKSk7CiAgICBfYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChTSVpFKTsKICAgIGZsdXNoZWRMZW5ndGggKz0gbGVuZ3RoOwogICAgbGVuZ3RoID0gMDsKICB9CgogIHZvaWQgZmx1c2hBbmREZXN0cm95KCkgewogICAgX3NpbmsuYWRkKF9idWZmZXIuc3VibGlzdCgwLCBsZW5ndGgpKTsKICB9Cn0KCi8vLyBOb24tZW1wdHkgbWV0YWRhdGEgc3Vic2VjdGlvbi4KY2xhc3MgX01ldGFkYXRhU3Vic2VjdGlvbiB7CiAgZmluYWwgTWV0YWRhdGFSZXBvc2l0b3J5PE9iamVjdD4gcmVwb3NpdG9yeTsKCiAgLy8vIExpc3Qgb2YgKG5vZGVPZmZzZXQsIG1ldGFkYXRhT2Zmc2V0KSBwYWlycy4KICAvLy8gR3JhZHVhbGx5IGZpbGxlZCBieSB0aGUgd3JpdGVyIGFzIHdyaXRpbmcgcHJvZ3Jlc3Nlcywgd2hpY2ggYnkKICAvLy8gY29uc3RydWN0aW9uIGd1YXJhbnRlZXMgdGhhdCBwYWlycyBhcmUgc29ydGVkIGJ5IGZpcnN0IGNvbXBvbmVudAogIC8vLyAobm9kZU9mZnNldCkgaW4gYXNjZW5kaW5nIG9yZGVyLgogIGZpbmFsIExpc3Q8aW50PiBtZXRhZGF0YU1hcHBpbmcgPSA8aW50PltdOwoKICBfTWV0YWRhdGFTdWJzZWN0aW9uKHRoaXMucmVwb3NpdG9yeSk7Cn0KCi8vLyBBIFtTaW5rXSB0aGF0IGRpcmVjdGx5IHdyaXRlcyBkYXRhIGludG8gYSBieXRlIGJ1aWxkZXIuCi8vIFRPRE8oZGFydGJ1Zy5jb20vMjgzMTYpOiBSZW1vdmUgdGhpcyB3cmFwcGVyIGNsYXNzLgpjbGFzcyBCeXRlc1NpbmsgaW1wbGVtZW50cyBTaW5rPExpc3Q8aW50Pj4gewogIGZpbmFsIEJ5dGVzQnVpbGRlciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZChMaXN0PGludD4gZGF0YSkgewogICAgYnVpbGRlci5hZGQoZGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNsb3NlKCkgewogICAgLy8gTm90aGluZyB0byBkby4KICB9Cn0KCmNsYXNzIE5vdFF1aXRlU3RyaW5nIHsKICAvKioKICAgKiBXcml0ZSBbc291cmNlXSBzdHJpbmcgaW50byBbdGFyZ2V0XSBzdGFydGluZyBhdCBpbmRleCBbaW5kZXhdLgogICAqCiAgICogT3B0aW9uYWxseSBvbmx5IHdyaXRlIHBhcnQgb2YgdGhlIGlucHV0IFtzb3VyY2VdIHN0YXJ0aW5nIGF0IFtzdGFydF0gYW5kCiAgICogZW5kaW5nIGF0IFtlbmRdLgogICAqCiAgICogVGhlIG91dHB1dCBzcGFjZSBuZWVkZWQgaXMgYXQgbW9zdCBbc291cmNlLmxlbmd0aF0gKiAzLgogICAqCiAgICogUmV0dXJucwogICAqICAqIE5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzICh0aGUgbmV3IGluZGV4IGluIFt0YXJnZXRdKS4KICAgKiAgKiAtMSB3aGVuIFt0YXJnZXRdIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhY2UuIE5vdGUgdGhhdCBbdGFyZ2V0XSBjYW4gYmUKICAgKiAgICBwb2xsdXRlZCBzdGFydGluZyBhdCBbaW5kZXhdLgogICAqICAqIC0yIG9uIGlucHV0IGVycm9yLCBpLmUuIGFuIHVucGFpcmVkIGxlYWQgb3IgdGFpbCBzdXJyb2dhdGUuCiAgICovCiAgc3RhdGljIGludCB3cml0ZVV0ZjgoTGlzdDxpbnQ+IHRhcmdldCwgaW50IGluZGV4LCBTdHJpbmcgc291cmNlLAogICAgICBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0YXJnZXQsIG51bGwsIHRhcmdldC5sZW5ndGgpOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gaW5kZXg7CiAgICBpbnQgaSA9IHN0YXJ0OwogICAgaW50IGxlbmd0aCA9IHRhcmdldC5sZW5ndGg7CiAgICBkbyB7CiAgICAgIGludCBjb2RlVW5pdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGkrKyk7CiAgICAgIHdoaWxlIChjb2RlVW5pdCA8IDEyOCkgewogICAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICB0YXJnZXRbaW5kZXgrK10gPSBjb2RlVW5pdDsKICAgICAgICBpZiAoaSA+PSBlbmQpIHJldHVybiBpbmRleDsKICAgICAgICBjb2RlVW5pdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGkrKyk7CiAgICAgIH0KICAgICAgaWYgKGNvZGVVbml0IDwgMHg4MDApIHsKICAgICAgICBpbmRleCArPSAyOwogICAgICAgIGlmIChpbmRleCA+IGxlbmd0aCkgcmV0dXJuIC0xOwogICAgICAgIHRhcmdldFtpbmRleCAtIDJdID0gMHhDMCB8IChjb2RlVW5pdCA+PiA2KTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAxXSA9IDB4ODAgfCAoY29kZVVuaXQgJiAweDNmKTsKICAgICAgfSBlbHNlIGlmIChjb2RlVW5pdCAmIDB4RjgwMCAhPSAweEQ4MDApIHsKICAgICAgICAvLyBOb3QgYSBzdXJyb2dhdGUuCiAgICAgICAgaW5kZXggKz0gMzsKICAgICAgICBpZiAoaW5kZXggPiBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAzXSA9IDB4RTAgfCAoY29kZVVuaXQgPj4gMTIpOwogICAgICAgIHRhcmdldFtpbmRleCAtIDJdID0gMHg4MCB8ICgoY29kZVVuaXQgPj4gNikgJiAweDNmKTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAxXSA9IDB4ODAgfCAoY29kZVVuaXQgJiAweDNmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY29kZVVuaXQgPj0gMHhEQzAwKSByZXR1cm4gLTI7IC8vIFVucGFpcmVkIHRhaWwgc3Vycm9nYXRlLgogICAgICAgIGlmIChpID49IGVuZCkgcmV0dXJuIC0yOyAvLyBVbnBhaXJlZCBsZWFkIHN1cnJvZ2F0ZS4KICAgICAgICBpbnQgbmV4dENoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKyspOwogICAgICAgIGlmIChuZXh0Q2hhciAmIDB4RkMwMCAhPSAweERDMDApIHJldHVybiAtMjsgLy8gVW5wYWlyZWQgbGVhZCBzdXJyb2dhdGUuCiAgICAgICAgaW5kZXggKz0gNDsKICAgICAgICBpZiAoaW5kZXggPiBsZW5ndGgpIHJldHVybiAtMTsKICAgICAgICBjb2RlVW5pdCA9IChjb2RlVW5pdCAmIDB4M0ZGKSArIDB4NDA7CiAgICAgICAgdGFyZ2V0W2luZGV4IC0gNF0gPSAweEYwIHwgKGNvZGVVbml0ID4+IDgpOwogICAgICAgIHRhcmdldFtpbmRleCAtIDNdID0gMHg4MCB8ICgoY29kZVVuaXQgPj4gMikgJiAweDNGKTsKICAgICAgICB0YXJnZXRbaW5kZXggLSAyXSA9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YXJpZXMgb2YgYSBjb21wb25lbnQsIHdoZW4gb25seQovLy8gYSB0aW55IHN1YnNldCBpcyB1c2VkLgpjbGFzcyBMaW1pdGVkQmluYXJ5UHJpbnRlciBleHRlbmRzIEJpbmFyeVByaW50ZXIgewogIGZpbmFsIExpYnJhcnlGaWx0ZXIgcHJlZGljYXRlOwoKICAvLy8gRXhjbHVkZXMgYWxsIHVyaVRvU291cmNlIGluZm9ybWF0aW9uLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0IHRoZSBbcHJlZGljYXRlXSBhYm92ZSB3aWxsIG9ubHkgZXhjbHVkZSBjYW5vbmljYWwgbmFtZXMgYW5kCiAgLy8vIGtlcm5lbCBsaWJyYXJpZXMsIGJ1dCBpdCB3aWxsIHN0aWxsIGVtaXQgdGhlIHNvdXJjZXMgZm9yIGFsbCBsaWJyYXJpZXMuCiAgLy8vIGZpbHRlcmVkIGJ5IGxpYnJhcmllcyBtYXRjaGluZyBbcHJlZGljYXRlXS4KICAvLyBUT0RPKHNpZ211bmQpOiBwcm92aWRlIGEgd2F5IHRvIGZpbHRlciBzb3VyY2VzIGRpcmVjdGx5IGJhc2VkIG9uCiAgLy8gW3ByZWRpY2F0ZV0uIFRoYXQgcmVxdWlyZXMgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgc291cmNlcyBmcm9tIHBhcnQgZmlsZXMuCiAgZmluYWwgYm9vbCBleGNsdWRlVXJpVG9Tb3VyY2U7CgogIExpbWl0ZWRCaW5hcnlQcmludGVyKAogICAgICBTaW5rPExpc3Q8aW50Pj4gc2luaywgdGhpcy5wcmVkaWNhdGUsIHRoaXMuZXhjbHVkZVVyaVRvU291cmNlLAogICAgICB7Ym9vbCBpbmNsdWRlT2Zmc2V0cyA9IHRydWV9KQogICAgICA6IHN1cGVyKHNpbmssCiAgICAgICAgICAgIGluY2x1ZGVTb3VyY2VzOiAhZXhjbHVkZVVyaVRvU291cmNlLAogICAgICAgICAgICBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGNvbXB1dGVDYW5vbmljYWxOYW1lcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgaWYgKHByZWRpY2F0ZShsaWJyYXJ5KSkgewogICAgICAgIGNvbXBvbmVudC5yb290CiAgICAgICAgICAgIC5nZXRDaGlsZEZyb21VcmkobGlicmFyeS5pbXBvcnRVcmkpCiAgICAgICAgICAgIC5iaW5kVG8obGlicmFyeS5yZWZlcmVuY2UpOwogICAgICAgIGxpYnJhcnkuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgc2hvdWxkV3JpdGVMaWJyYXJ5Q2Fub25pY2FsTmFtZXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gcHJlZGljYXRlKGxpYnJhcnkpOwogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gY29tcG9uZW50LmxpYnJhcmllc1tpXTsKICAgICAgaWYgKHByZWRpY2F0ZShsaWJyYXJ5KSkgd3JpdGVMaWJyYXJ5Tm9kZShsaWJyYXJ5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgTGlicmFyeSAmJiAhcHJlZGljYXRlKG5vZGUpKSByZXR1cm47CiAgICBzdXBlci53cml0ZU5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29tcG9uZW50SW5kZXgoQ29tcG9uZW50IGNvbXBvbmVudCwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMpIHsKICAgIHZhciBsaWJyYXJpZXNUb1dyaXRlID0gbGlicmFyaWVzLndoZXJlKHByZWRpY2F0ZSkudG9MaXN0KCk7CiAgICBzdXBlci53cml0ZUNvbXBvbmVudEluZGV4KGNvbXBvbmVudCwgbGlicmFyaWVzVG9Xcml0ZSk7CiAgfQp9CkUATk48ASIzATMESkwbMyEBLAZNTjJGUSEBGEUkFDEtAQw0LyAXMCgpCAYEAQw7HwQBLTswOQYEAQweNRsEAQxLQDwEAgEwcGFja2FnZTprZXJuZWwvYmluYXJ5L2xpbWl0ZWRfYXN0X3RvX2JpbmFyeS5kYXJ0SmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvY29yZV90eXBlcy5kYXJ0wACzUi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmNvcmVfdHlwZXM7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2luZGV4LmRhcnQnOwoKLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY2xhc3NlcyBhbmQgbGlicmFyaWVzIGluIHRoZSBjb3JlIGxpYnJhcmllcy4KY2xhc3MgQ29yZVR5cGVzIHsKICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXF1aXJlZENsYXNzZXMgPSB7CiAgICAnZGFydDpjb3JlJzogWwogICAgICAnT2JqZWN0JywKICAgICAgJ051bGwnLAogICAgICAnYm9vbCcsCiAgICAgICdpbnQnLAogICAgICAnbnVtJywKICAgICAgJ2RvdWJsZScsCiAgICAgICdTdHJpbmcnLAogICAgICAnTGlzdCcsCiAgICAgICdNYXAnLAogICAgICAnSXRlcmFibGUnLAogICAgICAnSXRlcmF0b3InLAogICAgICAnU3ltYm9sJywKICAgICAgJ1R5cGUnLAogICAgICAnRnVuY3Rpb24nLAogICAgICAnSW52b2NhdGlvbicsCiAgICAgICdGYWxsVGhyb3VnaEVycm9yJywKICAgIF0sCiAgICAnZGFydDpfaW50ZXJuYWwnOiBbCiAgICAgICdMYXRlSW5pdGlhbGl6YXRpb25FcnJvckltcGwnLAogICAgICAnU3ltYm9sJywKICAgIF0sCiAgICAnZGFydDphc3luYyc6IFsKICAgICAgJ0Z1dHVyZScsCiAgICAgICdTdHJlYW0nLAogICAgXQogIH07CgogIGZpbmFsIExpYnJhcnlJbmRleCBpbmRleDsKCiAgTGlicmFyeSBfY29yZUxpYnJhcnk7CiAgQ2xhc3MgX29iamVjdENsYXNzOwogIENsYXNzIF9udWxsQ2xhc3M7CiAgQ2xhc3MgX2Jvb2xDbGFzczsKICBDbGFzcyBfaW50Q2xhc3M7CiAgQ2xhc3MgX251bUNsYXNzOwogIENsYXNzIF9kb3VibGVDbGFzczsKICBDbGFzcyBfc3RyaW5nQ2xhc3M7CiAgQ2xhc3MgX2xpc3RDbGFzczsKICBDbGFzcyBfc2V0Q2xhc3M7CiAgQ2xhc3MgX21hcENsYXNzOwogIENsYXNzIF9pdGVyYWJsZUNsYXNzOwogIENsYXNzIF9pdGVyYXRvckNsYXNzOwogIENsYXNzIF9zeW1ib2xDbGFzczsKICBDbGFzcyBfdHlwZUNsYXNzOwogIENsYXNzIF9mdW5jdGlvbkNsYXNzOwogIENsYXNzIF9pbnZvY2F0aW9uQ2xhc3M7CiAgQ2xhc3MgX2ludm9jYXRpb25NaXJyb3JDbGFzczsKICBDb25zdHJ1Y3RvciBfaW52b2NhdGlvbk1pcnJvcldpdGhUeXBlQ29uc3RydWN0b3I7CiAgQ29uc3RydWN0b3IgX25vU3VjaE1ldGhvZEVycm9yRGVmYXVsdENvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfbGlzdERlZmF1bHRDb25zdHJ1Y3RvcjsKICBQcm9jZWR1cmUgX2xpc3RGcm9tQ29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9saXN0VW5tb2RpZmlhYmxlQ29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9pZGVudGljYWxQcm9jZWR1cmU7CiAgQ29uc3RydWN0b3IgX2ZhbGxUaHJvdWdoRXJyb3JVcmxBbmRMaW5lQ29uc3RydWN0b3I7CiAgUHJvY2VkdXJlIF9vYmplY3RFcXVhbHM7CiAgUHJvY2VkdXJlIF9tYXBVbm1vZGlmaWFibGU7CiAgUHJvY2VkdXJlIF9pdGVyYWJsZUdldEl0ZXJhdG9yOwogIFByb2NlZHVyZSBfaXRlcmF0b3JNb3ZlTmV4dDsKICBQcm9jZWR1cmUgX2l0ZXJhdG9yR2V0Q3VycmVudDsKCiAgQ2xhc3MgX2ludGVybmFsU3ltYm9sQ2xhc3M7CgogIExpYnJhcnkgX2FzeW5jTGlicmFyeTsKICBDbGFzcyBfZnV0dXJlQ2xhc3M7CiAgQ2xhc3MgX3N0YWNrVHJhY2VDbGFzczsKICBDbGFzcyBfc3RyZWFtQ2xhc3M7CiAgQ2xhc3MgX2FzeW5jQXdhaXRDb21wbGV0ZXJDbGFzczsKICBDbGFzcyBfZnV0dXJlT3JDbGFzczsKICBDb25zdHJ1Y3RvciBfYXN5bmNBd2FpdENvbXBsZXRlckNvbnN0cnVjdG9yOwogIFByb2NlZHVyZSBfY29tcGxldGVPbkFzeW5jUmV0dXJuUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfY29tcGxldGVyQ29tcGxldGVFcnJvcjsKICBDb25zdHJ1Y3RvciBfc3luY0l0ZXJhYmxlRGVmYXVsdENvbnN0cnVjdG9yOwogIENvbnN0cnVjdG9yIF9zdHJlYW1JdGVyYXRvckRlZmF1bHRDb25zdHJ1Y3RvcjsKICBDb25zdHJ1Y3RvciBfYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckRlZmF1bHRDb25zdHJ1Y3RvcjsKICBQcm9jZWR1cmUgX2FzeW5jU3Rhckxpc3RlbkhlbHBlclByb2NlZHVyZTsKICBQcm9jZWR1cmUgX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXN5bmNUaGVuV3JhcHBlckhlbHBlclByb2NlZHVyZTsKICBQcm9jZWR1cmUgX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlOwogIFByb2NlZHVyZSBfYXdhaXRIZWxwZXJQcm9jZWR1cmU7CiAgUHJvY2VkdXJlIF9ib29sRnJvbUVudmlyb25tZW50OwogIENvbnN0cnVjdG9yIF9sYXRlSW5pdGlhbGl6YXRpb25FcnJvckNvbnN0cnVjdG9yOwoKICAvLy8gVGhlIGBkYXJ0Om1pcnJvcnNgIGxpYnJhcnksIG9yIGBudWxsYCBpZiB0aGUgY29tcG9uZW50IGRvZXMgbm90IHVzZSBpdC4KICBMaWJyYXJ5IF9taXJyb3JzTGlicmFyeTsKCiAgQ2xhc3MgX3ByYWdtYUNsYXNzOwogIEZpZWxkIF9wcmFnbWFOYW1lOwogIEZpZWxkIF9wcmFnbWFPcHRpb25zOwogIENvbnN0cnVjdG9yIF9wcmFnbWFDb25zdHJ1Y3RvcjsKCiAgSW50ZXJmYWNlVHlwZSBfb2JqZWN0TGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9vYmplY3ROdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfb2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX251bGxUeXBlOwogIEludGVyZmFjZVR5cGUgX2Jvb2xMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2Jvb2xOdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfYm9vbE5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pbnRMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2ludE51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pbnROb25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfbnVtTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9udW1OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfbnVtTm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2RvdWJsZUxlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfZG91YmxlTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2RvdWJsZU5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zdHJpbmdMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX3N0cmluZ051bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zdHJpbmdOb25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfbGlzdExlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfbGlzdE51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9saXN0Tm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX3NldExlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfc2V0TnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX3NldE5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9tYXBMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX21hcE51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9tYXBOb25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfaXRlcmFibGVMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2l0ZXJhYmxlTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2l0ZXJhYmxlTm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2l0ZXJhdG9yTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pdGVyYXRvck51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pdGVyYXRvck5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zeW1ib2xMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX3N5bWJvbE51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zeW1ib2xOb25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfdHlwZUxlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfdHlwZU51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF90eXBlTm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2Z1bmN0aW9uTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9mdW5jdGlvbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9mdW5jdGlvbk5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pbnZvY2F0aW9uTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pbnZvY2F0aW9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2ludm9jYXRpb25Ob25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfaW52b2NhdGlvbk1pcnJvckxlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfaW52b2NhdGlvbk1pcnJvck51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9pbnZvY2F0aW9uTWlycm9yTm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2Z1dHVyZUxlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfZnV0dXJlTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2Z1dHVyZU5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zdGFja1RyYWNlTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zdGFja1RyYWNlTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX3N0YWNrVHJhY2VOb25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfc3RyZWFtTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9zdHJlYW1OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfc3RyZWFtTm9uTnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX2Z1dHVyZU9yTGVnYWN5UmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9mdXR1cmVPck51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9mdXR1cmVPck5vbk51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9wcmFnbWFMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX3ByYWdtYU51bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9wcmFnbWFOb25OdWxsYWJsZVJhd1R5cGU7CiAgZmluYWwgTWFwPENsYXNzLCBJbnRlcmZhY2VUeXBlPiBfbGVnYWN5UmF3VHlwZXMgPQogICAgICBuZXcgTWFwPENsYXNzLCBJbnRlcmZhY2VUeXBlPi5pZGVudGl0eSgpOwogIGZpbmFsIE1hcDxDbGFzcywgSW50ZXJmYWNlVHlwZT4gX251bGxhYmxlUmF3VHlwZXMgPQogICAgICBuZXcgTWFwPENsYXNzLCBJbnRlcmZhY2VUeXBlPi5pZGVudGl0eSgpOwogIGZpbmFsIE1hcDxDbGFzcywgSW50ZXJmYWNlVHlwZT4gX25vbk51bGxhYmxlUmF3VHlwZXMgPQogICAgICBuZXcgTWFwPENsYXNzLCBJbnRlcmZhY2VUeXBlPi5pZGVudGl0eSgpOwogIGZpbmFsIE1hcDxDbGFzcywgSW50ZXJmYWNlVHlwZT4gX3RoaXNJbnRlcmZhY2VUeXBlcyA9CiAgICAgIG5ldyBNYXA8Q2xhc3MsIEludGVyZmFjZVR5cGU+LmlkZW50aXR5KCk7CiAgZmluYWwgTWFwPFR5cGVkZWYsIFR5cGVkZWZUeXBlPiBfdGhpc1R5cGVkZWZUeXBlcyA9CiAgICAgIG5ldyBNYXA8VHlwZWRlZiwgVHlwZWRlZlR5cGU+LmlkZW50aXR5KCk7CiAgZmluYWwgTWFwPENsYXNzLCBJbnRlcmZhY2VUeXBlPiBfYm90dG9tSW50ZXJmYWNlVHlwZXMgPQogICAgICBuZXcgTWFwPENsYXNzLCBJbnRlcmZhY2VUeXBlPi5pZGVudGl0eSgpOwoKICBDb3JlVHlwZXMoQ29tcG9uZW50IGNvbXBvbmVudCkKICAgICAgOiBpbmRleCA9IG5ldyBMaWJyYXJ5SW5kZXguY29yZUxpYnJhcmllcyhjb21wb25lbnQpOwoKICBQcm9jZWR1cmUgZ2V0IGFzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlIHsKICAgIHJldHVybiBfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmUgPz89CiAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyJyk7CiAgfQoKICBMaWJyYXJ5IGdldCBhc3luY0xpYnJhcnkgewogICAgcmV0dXJuIF9hc3luY0xpYnJhcnkgPz89IGluZGV4LmdldExpYnJhcnkoJ2RhcnQ6YXN5bmMnKTsKICB9CgogIE1lbWJlciBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZCB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJywgJ2FkZCcpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkRXJyb3IgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcigKICAgICAgICAnZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICdhZGRFcnJvcicpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtIHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoCiAgICAgICAgJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXInLCAnYWRkU3RyZWFtJyk7CiAgfQoKICBDbGFzcyBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckNsYXNzIHsKICAgIHJldHVybiBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicpOwogIH0KCiAgTWVtYmVyIGdldCBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xvc2UgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICdjbG9zZScpOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyRGVmYXVsdENvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcicsICcnKTsKICB9CgogIE1lbWJlciBnZXQgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlclN0cmVhbSB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKAogICAgICAgICdkYXJ0OmFzeW5jJywgJ19Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyJywgJ2dldDpzdHJlYW0nKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFyTGlzdGVuSGVscGVyIHsKICAgIHJldHVybiBfYXN5bmNTdGFyTGlzdGVuSGVscGVyUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19hc3luY1N0YXJMaXN0ZW5IZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFyTW92ZU5leHRIZWxwZXIgewogICAgcmV0dXJuIF9hc3luY1N0YXJNb3ZlTmV4dEhlbHBlclByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlIHsKICAgIHJldHVybiBfYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19hc3luY1N0YWNrVHJhY2VIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXN5bmNUaGVuV3JhcHBlckhlbHBlclByb2NlZHVyZSB7CiAgICByZXR1cm4gX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJQcm9jZWR1cmUgPz89CiAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX2FzeW5jVGhlbldyYXBwZXJIZWxwZXInKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYXdhaXRIZWxwZXJQcm9jZWR1cmUgewogICAgcmV0dXJuIF9hd2FpdEhlbHBlclByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfYXdhaXRIZWxwZXInKTsKICB9CgogIENsYXNzIGdldCBib29sQ2xhc3MgewogICAgcmV0dXJuIF9ib29sQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnYm9vbCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcyB7CiAgICByZXR1cm4gX2FzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcyA/Pz0KICAgICAgICBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdfQXN5bmNBd2FpdENvbXBsZXRlcicpOwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGFzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX2FzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jQXdhaXRDb21wbGV0ZXInLCAnJyk7CiAgfQoKICBNZW1iZXIgZ2V0IGNvbXBsZXRlT25Bc3luY1JldHVybiB7CiAgICByZXR1cm4gX2NvbXBsZXRlT25Bc3luY1JldHVyblByb2NlZHVyZSA/Pz0KICAgICAgICBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDphc3luYycsICdfY29tcGxldGVPbkFzeW5jUmV0dXJuJyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGNvbXBsZXRlckNvbXBsZXRlRXJyb3IgewogICAgcmV0dXJuIF9jb21wbGV0ZXJDb21wbGV0ZUVycm9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdDb21wbGV0ZXInLCAnY29tcGxldGVFcnJvcicpOwogIH0KCiAgTWVtYmVyIGdldCBjb21wbGV0ZXJGdXR1cmUgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdDb21wbGV0ZXInLCAnZ2V0OmZ1dHVyZScpOwogIH0KCiAgTGlicmFyeSBnZXQgY29yZUxpYnJhcnkgewogICAgcmV0dXJuIF9jb3JlTGlicmFyeSA/Pz0gaW5kZXguZ2V0TGlicmFyeSgnZGFydDpjb3JlJyk7CiAgfQoKICBDbGFzcyBnZXQgZG91YmxlQ2xhc3MgewogICAgcmV0dXJuIF9kb3VibGVDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdkb3VibGUnKTsKICB9CgogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzIHsKICAgIHJldHVybiBfZnVuY3Rpb25DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdGdW5jdGlvbicpOwogIH0KCiAgQ2xhc3MgZ2V0IGZ1dHVyZUNsYXNzIHsKICAgIHJldHVybiBfZnV0dXJlQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnRnV0dXJlJyk7CiAgfQoKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyB7CiAgICByZXR1cm4gX2Z1dHVyZU9yQ2xhc3MgPz89IChpbmRleC50cnlHZXRDbGFzcygnZGFydDpjb3JlJywgJ0Z1dHVyZU9yJykgPz8KICAgICAgICBpbmRleC5nZXRDbGFzcygnZGFydDphc3luYycsICdGdXR1cmVPcicpKTsKICB9CgogIFByb2NlZHVyZSBnZXQgaWRlbnRpY2FsUHJvY2VkdXJlIHsKICAgIHJldHVybiBfaWRlbnRpY2FsUHJvY2VkdXJlID8/PQogICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmNvcmUnLCAnaWRlbnRpY2FsJyk7CiAgfQoKICBDbGFzcyBnZXQgaW50Q2xhc3MgewogICAgcmV0dXJuIF9pbnRDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdpbnQnKTsKICB9CgogIENsYXNzIGdldCBpbnRlcm5hbFN5bWJvbENsYXNzIHsKICAgIHJldHVybiBfaW50ZXJuYWxTeW1ib2xDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6X2ludGVybmFsJywgJ1N5bWJvbCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGludm9jYXRpb25DbGFzcyB7CiAgICByZXR1cm4gX2ludm9jYXRpb25DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdJbnZvY2F0aW9uJyk7CiAgfQoKICBDbGFzcyBnZXQgaW52b2NhdGlvbk1pcnJvckNsYXNzIHsKICAgIHJldHVybiBfaW52b2NhdGlvbk1pcnJvckNsYXNzID8/PQogICAgICAgIGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnX0ludm9jYXRpb25NaXJyb3InKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBpbnZvY2F0aW9uTWlycm9yV2l0aFR5cGVDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gX2ludm9jYXRpb25NaXJyb3JXaXRoVHlwZUNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19JbnZvY2F0aW9uTWlycm9yJywgJ193aXRoVHlwZScpOwogIH0KCiAgQ2xhc3MgZ2V0IGl0ZXJhYmxlQ2xhc3MgewogICAgcmV0dXJuIF9pdGVyYWJsZUNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ0l0ZXJhYmxlJyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGl0ZXJhYmxlR2V0SXRlcmF0b3IgewogICAgcmV0dXJuIF9pdGVyYWJsZUdldEl0ZXJhdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0l0ZXJhYmxlJywgJ2dldDppdGVyYXRvcicpOwogIH0KCiAgQ2xhc3MgZ2V0IGl0ZXJhdG9yQ2xhc3MgewogICAgcmV0dXJuIF9pdGVyYXRvckNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ0l0ZXJhdG9yJyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGl0ZXJhdG9yTW92ZU5leHQgewogICAgcmV0dXJuIF9pdGVyYXRvck1vdmVOZXh0ID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0l0ZXJhdG9yJywgJ21vdmVOZXh0Jyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGl0ZXJhdG9yR2V0Q3VycmVudCB7CiAgICByZXR1cm4gX2l0ZXJhdG9yR2V0Q3VycmVudCA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdJdGVyYXRvcicsICdnZXQ6Y3VycmVudCcpOwogIH0KCiAgQ2xhc3MgZ2V0IGxpc3RDbGFzcyB7CiAgICByZXR1cm4gX2xpc3RDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdMaXN0Jyk7CiAgfQoKICBQcm9jZWR1cmUgZ2V0IGxpc3REZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9saXN0RGVmYXVsdENvbnN0cnVjdG9yID8/PSBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJycpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBsaXN0RnJvbUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfbGlzdEZyb21Db25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ2Zyb20nKTsKICB9CgogIFByb2NlZHVyZSBnZXQgbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfbGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0xpc3QnLCAndW5tb2RpZmlhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgc2V0Q2xhc3MgewogICAgcmV0dXJuIF9zZXRDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdTZXQnKTsKICB9CgogIENsYXNzIGdldCBtYXBDbGFzcyB7CiAgICByZXR1cm4gX21hcENsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ01hcCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBtYXBVbm1vZGlmaWFibGUgewogICAgcmV0dXJuIF9tYXBVbm1vZGlmaWFibGUgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnTWFwJywgJ3VubW9kaWZpYWJsZScpOwogIH0KCiAgTGlicmFyeSBnZXQgbWlycm9yc0xpYnJhcnkgewogICAgcmV0dXJuIF9taXJyb3JzTGlicmFyeSA/Pz0gaW5kZXgudHJ5R2V0TGlicmFyeSgnZGFydDptaXJyb3JzJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9ub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3RvciA/Pz0KICAgICAgICAvLyBUT0RPKHJlZ2lzKTogUmVwbGFjZSAnd2l0aEludm9jYXRpb24nIHdpdGggJycgYWZ0ZXIgZGFydDJqcyBpcyBmaXhlZC4KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdOb1N1Y2hNZXRob2RFcnJvcicsICd3aXRoSW52b2NhdGlvbicpOwogIH0KCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyB7CiAgICByZXR1cm4gX251bGxDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdOdWxsJyk7CiAgfQoKICBDbGFzcyBnZXQgbnVtQ2xhc3MgewogICAgcmV0dXJuIF9udW1DbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdudW0nKTsKICB9CgogIENsYXNzIGdldCBvYmplY3RDbGFzcyB7CiAgICByZXR1cm4gX29iamVjdENsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ09iamVjdCcpOwogIH0KCiAgUHJvY2VkdXJlIGdldCBvYmplY3RFcXVhbHMgewogICAgcmV0dXJuIF9vYmplY3RFcXVhbHMgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ09iamVjdCcsICc9PScpOwogIH0KCiAgQ2xhc3MgZ2V0IHByYWdtYUNsYXNzIHsKICAgIHJldHVybiBfcHJhZ21hQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAncHJhZ21hJyk7CiAgfQoKICBGaWVsZCBnZXQgcHJhZ21hTmFtZSB7CiAgICByZXR1cm4gX3ByYWdtYU5hbWUgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ3ByYWdtYScsICduYW1lJyk7CiAgfQoKICBGaWVsZCBnZXQgcHJhZ21hT3B0aW9ucyB7CiAgICByZXR1cm4gX3ByYWdtYU9wdGlvbnMgPz89IGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ3ByYWdtYScsICdvcHRpb25zJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgcHJhZ21hQ29uc3RydWN0b3IgewogICAgcmV0dXJuIF9wcmFnbWFDb25zdHJ1Y3RvciA/Pz0gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAncHJhZ21hJywgJ18nKTsKICB9CgogIENsYXNzIGdldCBzdGFja1RyYWNlQ2xhc3MgewogICAgcmV0dXJuIF9zdGFja1RyYWNlQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RhY2tUcmFjZScpOwogIH0KCiAgQ2xhc3MgZ2V0IHN0cmVhbUNsYXNzIHsKICAgIHJldHVybiBfc3RyZWFtQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RyZWFtJyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN0cmVhbUl0ZXJhdG9yU3Vic2NyaXB0aW9uIHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJ19zdWJzY3JpcHRpb24nKTsKICB9CgogIE1lbWJlciBnZXQgc3RyZWFtSXRlcmF0b3JDYW5jZWwgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDphc3luYycsICdfU3RyZWFtSXRlcmF0b3InLCAnY2FuY2VsJyk7CiAgfQoKICBDbGFzcyBnZXQgc3RyZWFtSXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJyk7CiAgfQoKICBDb25zdHJ1Y3RvciBnZXQgc3RyZWFtSXRlcmF0b3JEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9zdHJlYW1JdGVyYXRvckRlZmF1bHRDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJycpOwogIH0KCiAgTWVtYmVyIGdldCBzdHJlYW1JdGVyYXRvck1vdmVOZXh0IHsKICAgIHJldHVybiBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX1N0cmVhbUl0ZXJhdG9yJywgJ21vdmVOZXh0Jyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN0cmVhbUl0ZXJhdG9yQ3VycmVudCB7CiAgICByZXR1cm4gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ19TdHJlYW1JdGVyYXRvcicsICdnZXQ6Y3VycmVudCcpOwogIH0KCiAgQ2xhc3MgZ2V0IHN0cmluZ0NsYXNzIHsKICAgIHJldHVybiBfc3RyaW5nQ2xhc3MgPz89IGluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnU3RyaW5nJyk7CiAgfQoKICBDbGFzcyBnZXQgc3ltYm9sQ2xhc3MgewogICAgcmV0dXJuIF9zeW1ib2xDbGFzcyA/Pz0gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdTeW1ib2wnKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBzeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3IgewogICAgcmV0dXJuIF9zeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3IgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnX1N5bmNJdGVyYWJsZScsICcnKTsKICB9CgogIENsYXNzIGdldCBzeW5jSXRlcmF0b3JDbGFzcyB7CiAgICByZXR1cm4gaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdfU3luY0l0ZXJhdG9yJyk7CiAgfQoKICBNZW1iZXIgZ2V0IHN5bmNJdGVyYXRvckN1cnJlbnQgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19TeW5jSXRlcmF0b3InLCAnX2N1cnJlbnQnKTsKICB9CgogIE1lbWJlciBnZXQgc3luY0l0ZXJhdG9yWWllbGRFYWNoSXRlcmFibGUgewogICAgcmV0dXJuIGluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19TeW5jSXRlcmF0b3InLCAnX3lpZWxkRWFjaEl0ZXJhYmxlJyk7CiAgfQoKICBDbGFzcyBnZXQgdHlwZUNsYXNzIHsKICAgIHJldHVybiBfdHlwZUNsYXNzID8/PSBpbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ1R5cGUnKTsKICB9CgogIENvbnN0cnVjdG9yIGdldCBmYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yIHsKICAgIHJldHVybiBfZmFsbFRocm91Z2hFcnJvclVybEFuZExpbmVDb25zdHJ1Y3RvciA/Pz0KICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdGYWxsVGhyb3VnaEVycm9yJywgJ19jcmVhdGUnKTsKICB9CgogIFByb2NlZHVyZSBnZXQgYm9vbEZyb21FbnZpcm9ubWVudCB7CiAgICByZXR1cm4gX2Jvb2xGcm9tRW52aXJvbm1lbnQgPz89CiAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnYm9vbCcsICdmcm9tRW52aXJvbm1lbnQnKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdExlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9vYmplY3RMZWdhY3lSYXdUeXBlID8/PSBfbGVnYWN5UmF3VHlwZXNbb2JqZWN0Q2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKG9iamVjdENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBvYmplY3ROdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9vYmplY3ROdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW29iamVjdENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgb2JqZWN0Q2xhc3MsIE51bGxhYmlsaXR5Lm51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfb2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlID8/PSBfbm9uTnVsbGFibGVSYXdUeXBlc1tvYmplY3RDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIG9iamVjdENsYXNzLCBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgb2JqZWN0UmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gb2JqZWN0TGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gb2JqZWN0TnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBvYmplY3ROb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICAvLy8gTnVsbCBpcyBhbHdheXMgbnVsbGFibGUsIHNvIHRoZXJlJ3Mgb25seSBvbmUgcmF3IHR5cGUgZm9yIHRoYXQgY2xhc3MuCiAgSW50ZXJmYWNlVHlwZSBnZXQgbnVsbFR5cGUgewogICAgcmV0dXJuIF9udWxsVHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbbnVsbENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShudWxsQ2xhc3MsIE51bGxhYmlsaXR5Lm51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgYm9vbExlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9ib29sTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW2Jvb2xDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoYm9vbENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBib29sTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfYm9vbE51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbYm9vbENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShib29sQ2xhc3MsIE51bGxhYmlsaXR5Lm51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgYm9vbE5vbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2Jvb2xOb25OdWxsYWJsZVJhd1R5cGUgPz89IF9ub25OdWxsYWJsZVJhd1R5cGVzW2Jvb2xDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGJvb2xDbGFzcywgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGJvb2xSYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBib29sTGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gYm9vbE51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZToKICAgICAgICByZXR1cm4gYm9vbE5vbk51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSAkbnVsbGFiaWxpdHkgb24gYW4gSW50ZXJmYWNlVHlwZS4iKTsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IGludExlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9pbnRMZWdhY3lSYXdUeXBlID8/PSBfbGVnYWN5UmF3VHlwZXNbaW50Q2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKGludENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpbnROdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9pbnROdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW2ludENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShpbnRDbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpbnROb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9pbnROb25OdWxsYWJsZVJhd1R5cGUgPz89IF9ub25OdWxsYWJsZVJhd1R5cGVzW2ludENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgaW50Q2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBpbnRSYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBpbnRMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBpbnROdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIGludE5vbk51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSAkbnVsbGFiaWxpdHkgb24gYW4gSW50ZXJmYWNlVHlwZS4iKTsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IG51bUxlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9udW1MZWdhY3lSYXdUeXBlID8/PSBfbGVnYWN5UmF3VHlwZXNbbnVtQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKG51bUNsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBudW1OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9udW1OdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW251bUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShudW1DbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBudW1Ob25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9udW1Ob25OdWxsYWJsZVJhd1R5cGUgPz89IF9ub25OdWxsYWJsZVJhd1R5cGVzW251bUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgbnVtQ2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBudW1SYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBudW1MZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBudW1OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIG51bU5vbk51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSAkbnVsbGFiaWxpdHkgb24gYW4gSW50ZXJmYWNlVHlwZS4iKTsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IGRvdWJsZUxlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9kb3VibGVMZWdhY3lSYXdUeXBlID8/PSBfbGVnYWN5UmF3VHlwZXNbZG91YmxlQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKGRvdWJsZUNsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBkb3VibGVOdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9kb3VibGVOdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW2RvdWJsZUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgZG91YmxlQ2xhc3MsIE51bGxhYmlsaXR5Lm51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgZG91YmxlTm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfZG91YmxlTm9uTnVsbGFibGVSYXdUeXBlID8/PSBfbm9uTnVsbGFibGVSYXdUeXBlc1tkb3VibGVDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGRvdWJsZUNsYXNzLCBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZG91YmxlUmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gZG91YmxlTGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gZG91YmxlTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBkb3VibGVOb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzdHJpbmdMZWdhY3lSYXdUeXBlIHsKICAgIHJldHVybiBfc3RyaW5nTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW3N0cmluZ0NsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShzdHJpbmdDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgc3RyaW5nTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfc3RyaW5nTnVsbGFibGVSYXdUeXBlID8/PSBfbnVsbGFibGVSYXdUeXBlc1tzdHJpbmdDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIHN0cmluZ0NsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHN0cmluZ05vbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX3N0cmluZ05vbk51bGxhYmxlUmF3VHlwZSA/Pz0gX25vbk51bGxhYmxlUmF3VHlwZXNbc3RyaW5nQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBzdHJpbmdDbGFzcywgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIHN0cmluZ1Jhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIHN0cmluZ0xlZ2FjeVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHN0cmluZ051bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZToKICAgICAgICByZXR1cm4gc3RyaW5nTm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgbGlzdExlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9saXN0TGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW2xpc3RDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUobGlzdENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgbGlzdE51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2xpc3ROdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW2xpc3RDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUobGlzdENsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBsaXN0Tm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfbGlzdE5vbk51bGxhYmxlUmF3VHlwZSA/Pz0gX25vbk51bGxhYmxlUmF3VHlwZXNbbGlzdENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShsaXN0Q2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLAogICAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W2NvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIEludGVyZmFjZVR5cGUgbGlzdFJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIGxpc3RMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBsaXN0TnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBsaXN0Tm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgc2V0TGVnYWN5UmF3VHlwZSB7CiAgICByZXR1cm4gX3NldExlZ2FjeVJhd1R5cGUgPz89IF9sZWdhY3lSYXdUeXBlc1tzZXRDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoc2V0Q2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzZXROdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9zZXROdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW3NldENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShzZXRDbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgc2V0Tm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfc2V0Tm9uTnVsbGFibGVSYXdUeXBlID8/PSBfbm9uTnVsbGFibGVSYXdUeXBlc1tzZXRDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoc2V0Q2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLAogICAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W2NvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIEludGVyZmFjZVR5cGUgc2V0UmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gc2V0TGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gc2V0TnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBzZXROb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBtYXBMZWdhY3lSYXdUeXBlIHsKICAgIHJldHVybiBfbWFwTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW21hcENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShtYXBDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LAogICAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W2NvbnN0IER5bmFtaWNUeXBlKCksIGNvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IG1hcE51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX21hcE51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbbWFwQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKG1hcENsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpLCBjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBtYXBOb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9tYXBOb25OdWxsYWJsZVJhd1R5cGUgPz89IF9ub25OdWxsYWJsZVJhd1R5cGVzW21hcENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShtYXBDbGFzcywgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKSwgY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBtYXBSYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBtYXBMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBtYXBOdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIG1hcE5vbk51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSAkbnVsbGFiaWxpdHkgb24gYW4gSW50ZXJmYWNlVHlwZS4iKTsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IGl0ZXJhYmxlTGVnYWN5UmF3VHlwZSB7CiAgICByZXR1cm4gX2l0ZXJhYmxlTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW2l0ZXJhYmxlQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKGl0ZXJhYmxlQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpdGVyYWJsZU51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2l0ZXJhYmxlTnVsbGFibGVSYXdUeXBlID8/PSBfbnVsbGFibGVSYXdUeXBlc1tpdGVyYWJsZUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShpdGVyYWJsZUNsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpdGVyYWJsZU5vbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2l0ZXJhYmxlTm9uTnVsbGFibGVSYXdUeXBlID8/PQogICAgICAgIF9ub25OdWxsYWJsZVJhd1R5cGVzW2l0ZXJhYmxlQ2xhc3NdID8/PSBuZXcgSW50ZXJmYWNlVHlwZShpdGVyYWJsZUNsYXNzLAogICAgICAgICAgICBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGl0ZXJhYmxlUmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gaXRlcmFibGVMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBpdGVyYWJsZU51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZToKICAgICAgICByZXR1cm4gaXRlcmFibGVOb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpdGVyYXRvckxlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9pdGVyYXRvckxlZ2FjeVJhd1R5cGUgPz89IF9sZWdhY3lSYXdUeXBlc1tpdGVyYXRvckNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShpdGVyYXRvckNsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgaXRlcmF0b3JOdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9pdGVyYXRvck51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbaXRlcmF0b3JDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoaXRlcmF0b3JDbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgaXRlcmF0b3JOb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9pdGVyYXRvck5vbk51bGxhYmxlUmF3VHlwZSA/Pz0KICAgICAgICBfbm9uTnVsbGFibGVSYXdUeXBlc1tpdGVyYXRvckNsYXNzXSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoaXRlcmF0b3JDbGFzcywKICAgICAgICAgICAgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBpdGVyYXRvclJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gaXRlcmF0b3JOdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgc3ltYm9sTGVnYWN5UmF3VHlwZSB7CiAgICByZXR1cm4gX3N5bWJvbExlZ2FjeVJhd1R5cGUgPz89IF9sZWdhY3lSYXdUeXBlc1tzeW1ib2xDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoc3ltYm9sQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHN5bWJvbE51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX3N5bWJvbE51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbc3ltYm9sQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBzeW1ib2xDbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzeW1ib2xOb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9zeW1ib2xOb25OdWxsYWJsZVJhd1R5cGUgPz89IF9ub25OdWxsYWJsZVJhd1R5cGVzW3N5bWJvbENsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgc3ltYm9sQ2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBzeW1ib2xSYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBzeW1ib2xMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBzeW1ib2xOdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHN5bWJvbE5vbk51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSAkbnVsbGFiaWxpdHkgb24gYW4gSW50ZXJmYWNlVHlwZS4iKTsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHR5cGVMZWdhY3lSYXdUeXBlIHsKICAgIHJldHVybiBfdHlwZUxlZ2FjeVJhd1R5cGUgPz89IF9sZWdhY3lSYXdUeXBlc1t0eXBlQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGVDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgdHlwZU51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX3R5cGVOdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW3R5cGVDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUodHlwZUNsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHR5cGVOb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF90eXBlTm9uTnVsbGFibGVSYXdUeXBlID8/PSBfbm9uTnVsbGFibGVSYXdUeXBlc1t0eXBlQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICB0eXBlQ2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSB0eXBlUmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gdHlwZUxlZ2FjeVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHR5cGVOdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHR5cGVOb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBmdW5jdGlvbkxlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9mdW5jdGlvbkxlZ2FjeVJhd1R5cGUgPz89IF9sZWdhY3lSYXdUeXBlc1tmdW5jdGlvbkNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgZnVuY3Rpb25DbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgZnVuY3Rpb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9mdW5jdGlvbk51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbZnVuY3Rpb25DbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGZ1bmN0aW9uQ2xhc3MsIE51bGxhYmlsaXR5Lm51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgZnVuY3Rpb25Ob25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9mdW5jdGlvbk5vbk51bGxhYmxlUmF3VHlwZSA/Pz0KICAgICAgICBfbm9uTnVsbGFibGVSYXdUeXBlc1tmdW5jdGlvbkNsYXNzXSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGZ1bmN0aW9uQ2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBmdW5jdGlvblJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uTGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gZnVuY3Rpb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uTm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgaW52b2NhdGlvbkxlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9pbnZvY2F0aW9uTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW2ludm9jYXRpb25DbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGludm9jYXRpb25DbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgaW52b2NhdGlvbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2ludm9jYXRpb25OdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW2ludm9jYXRpb25DbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGludm9jYXRpb25DbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpbnZvY2F0aW9uTm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfaW52b2NhdGlvbk5vbk51bGxhYmxlUmF3VHlwZSA/Pz0KICAgICAgICBfbm9uTnVsbGFibGVSYXdUeXBlc1tpbnZvY2F0aW9uQ2xhc3NdID8/PSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgaW52b2NhdGlvbkNsYXNzLCBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgaW52b2NhdGlvblJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIGludm9jYXRpb25MZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBpbnZvY2F0aW9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBpbnZvY2F0aW9uTm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgaW52b2NhdGlvbk1pcnJvckxlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIF9pbnZvY2F0aW9uTWlycm9yTGVnYWN5UmF3VHlwZSA/Pz0KICAgICAgICBfbGVnYWN5UmF3VHlwZXNbaW52b2NhdGlvbk1pcnJvckNsYXNzXSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGludm9jYXRpb25NaXJyb3JDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgaW52b2NhdGlvbk1pcnJvck51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2ludm9jYXRpb25NaXJyb3JOdWxsYWJsZVJhd1R5cGUgPz89CiAgICAgICAgX251bGxhYmxlUmF3VHlwZXNbaW52b2NhdGlvbk1pcnJvckNsYXNzXSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGludm9jYXRpb25NaXJyb3JDbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBpbnZvY2F0aW9uTWlycm9yTm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfaW52b2NhdGlvbk1pcnJvck5vbk51bGxhYmxlUmF3VHlwZSA/Pz0KICAgICAgICBfbm9uTnVsbGFibGVSYXdUeXBlc1tpbnZvY2F0aW9uTWlycm9yQ2xhc3NdID8/PSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgaW52b2NhdGlvbk1pcnJvckNsYXNzLCBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgaW52b2NhdGlvbk1pcnJvclJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIGludm9jYXRpb25NaXJyb3JMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBpbnZvY2F0aW9uTWlycm9yTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBpbnZvY2F0aW9uTWlycm9yTm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgZnV0dXJlTGVnYWN5UmF3VHlwZSB7CiAgICByZXR1cm4gX2Z1dHVyZUxlZ2FjeVJhd1R5cGUgPz89IF9sZWdhY3lSYXdUeXBlc1tmdXR1cmVDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoZnV0dXJlQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBmdXR1cmVOdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9mdXR1cmVOdWxsYWJsZVJhd1R5cGUgPz89IF9udWxsYWJsZVJhd1R5cGVzW2Z1dHVyZUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShmdXR1cmVDbGFzcywgTnVsbGFiaWxpdHkubnVsbGFibGUsCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgZnV0dXJlTm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfZnV0dXJlTm9uTnVsbGFibGVSYXdUeXBlID8/PSBfbm9uTnVsbGFibGVSYXdUeXBlc1tmdXR1cmVDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoZnV0dXJlQ2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLAogICAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W2NvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIEludGVyZmFjZVR5cGUgZnV0dXJlUmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gZnV0dXJlTGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gZnV0dXJlTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBmdXR1cmVOb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzdGFja1RyYWNlTGVnYWN5UmF3VHlwZSB7CiAgICByZXR1cm4gX3N0YWNrVHJhY2VMZWdhY3lSYXdUeXBlID8/PSBfbGVnYWN5UmF3VHlwZXNbc3RhY2tUcmFjZUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgc3RhY2tUcmFjZUNsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzdGFja1RyYWNlTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfc3RhY2tUcmFjZU51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbc3RhY2tUcmFjZUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgc3RhY2tUcmFjZUNsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHN0YWNrVHJhY2VOb25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9zdGFja1RyYWNlTm9uTnVsbGFibGVSYXdUeXBlID8/PQogICAgICAgIF9ub25OdWxsYWJsZVJhd1R5cGVzW3N0YWNrVHJhY2VDbGFzc10gPz89IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBzdGFja1RyYWNlQ2xhc3MsIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBzdGFja1RyYWNlUmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gc3RhY2tUcmFjZUxlZ2FjeVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHN0YWNrVHJhY2VOdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHN0YWNrVHJhY2VOb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzdHJlYW1MZWdhY3lSYXdUeXBlIHsKICAgIHJldHVybiBfc3RyZWFtTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW3N0cmVhbUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShzdHJlYW1DbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LAogICAgICAgICAgICBjb25zdCA8RGFydFR5cGU+W2NvbnN0IER5bmFtaWNUeXBlKCldKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHN0cmVhbU51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX3N0cmVhbU51bGxhYmxlUmF3VHlwZSA/Pz0gX251bGxhYmxlUmF3VHlwZXNbc3RyZWFtQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKHN0cmVhbUNsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBzdHJlYW1Ob25OdWxsYWJsZVJhd1R5cGUgewogICAgcmV0dXJuIF9zdHJlYW1Ob25OdWxsYWJsZVJhd1R5cGUgPz89IF9ub25OdWxsYWJsZVJhd1R5cGVzW3N0cmVhbUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShzdHJlYW1DbGFzcywgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsCiAgICAgICAgICAgIGNvbnN0IDxEYXJ0VHlwZT5bY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBzdHJlYW1SYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBzd2l0Y2ggKG51bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBzdHJlYW1MZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBzdHJlYW1OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHN0cmVhbU5vbk51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICJVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSAkbnVsbGFiaWxpdHkgb24gYW4gSW50ZXJmYWNlVHlwZS4iKTsKICAgIH0KICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IGZ1dHVyZU9yTGVnYWN5UmF3VHlwZSB7CiAgICByZXR1cm4gX2Z1dHVyZU9yTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW2Z1dHVyZU9yQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKGZ1dHVyZU9yQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBmdXR1cmVPck51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2Z1dHVyZU9yTnVsbGFibGVSYXdUeXBlID8/PSBfbnVsbGFibGVSYXdUeXBlc1tmdXR1cmVPckNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShmdXR1cmVPckNsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwKICAgICAgICAgICAgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBmdXR1cmVPck5vbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX2Z1dHVyZU9yTm9uTnVsbGFibGVSYXdUeXBlID8/PQogICAgICAgIF9ub25OdWxsYWJsZVJhd1R5cGVzW2Z1dHVyZU9yQ2xhc3NdID8/PSBuZXcgSW50ZXJmYWNlVHlwZShmdXR1cmVPckNsYXNzLAogICAgICAgICAgICBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yUmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gZnV0dXJlT3JMZWdhY3lSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm51bGxhYmxlOgogICAgICAgIHJldHVybiBmdXR1cmVPck51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZToKICAgICAgICByZXR1cm4gZnV0dXJlT3JOb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldCBwcmFnbWFMZWdhY3lSYXdUeXBlIHsKICAgIHJldHVybiBfcHJhZ21hTGVnYWN5UmF3VHlwZSA/Pz0gX2xlZ2FjeVJhd1R5cGVzW3ByYWdtYUNsYXNzXSA/Pz0KICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShwcmFnbWFDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBjb25zdCA8RGFydFR5cGU+W10pOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXQgcHJhZ21hTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfcHJhZ21hTnVsbGFibGVSYXdUeXBlID8/PSBfbnVsbGFibGVSYXdUeXBlc1twcmFnbWFDbGFzc10gPz89CiAgICAgICAgbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIHByYWdtYUNsYXNzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwgY29uc3QgPERhcnRUeXBlPltdKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0IHByYWdtYU5vbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX3ByYWdtYU5vbk51bGxhYmxlUmF3VHlwZSA/Pz0gX25vbk51bGxhYmxlUmF3VHlwZXNbcHJhZ21hQ2xhc3NdID8/PQogICAgICAgIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBwcmFnbWFDbGFzcywgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIHByYWdtYVJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5sZWdhY3k6CiAgICAgICAgcmV0dXJuIHByYWdtYUxlZ2FjeVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgICAgcmV0dXJuIHByYWdtYU51bGxhYmxlUmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZToKICAgICAgICByZXR1cm4gcHJhZ21hTm9uTnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5ICRudWxsYWJpbGl0eSBvbiBhbiBJbnRlcmZhY2VUeXBlLiIpOwogICAgfQogIH0KCiAgSW50ZXJmYWNlVHlwZSBsZWdhY3lSYXdUeXBlKENsYXNzIGtsYXNzKSB7CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogQ29uc2lkZXIgdXNpbmcgY29tcHV0ZUJvdW5kcyBpbnN0ZWFkIG9mIER5bmFtaWNUeXBlIGhlcmUuCiAgICByZXR1cm4gX2xlZ2FjeVJhd1R5cGVzW2tsYXNzXSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAga2xhc3MsCiAgICAgICAgTnVsbGFiaWxpdHkubGVnYWN5LAogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgIGtsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBudWxsYWJsZVJhd1R5cGUoQ2xhc3Mga2xhc3MpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBDb25zaWRlciB1c2luZyBjb21wdXRlQm91bmRzIGluc3RlYWQgb2YgRHluYW1pY1R5cGUgaGVyZS4KICAgIHJldHVybiBfbnVsbGFibGVSYXdUeXBlc1trbGFzc10gPz89IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGtsYXNzLAogICAgICAgIE51bGxhYmlsaXR5Lm51bGxhYmxlLAogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgIGtsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBub25OdWxsYWJsZVJhd1R5cGUoQ2xhc3Mga2xhc3MpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBDb25zaWRlciB1c2luZyBjb21wdXRlQm91bmRzIGluc3RlYWQgb2YgRHluYW1pY1R5cGUgaGVyZS4KICAgIHJldHVybiBfbm9uTnVsbGFibGVSYXdUeXBlc1trbGFzc10gPz89IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGtsYXNzLAogICAgICAgIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLAogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgIGtsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSByYXdUeXBlKENsYXNzIGtsYXNzLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gbGVnYWN5UmF3VHlwZShrbGFzcyk7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgICAgcmV0dXJuIG51bGxhYmxlUmF3VHlwZShrbGFzcyk7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgcmV0dXJuIG5vbk51bGxhYmxlUmF3VHlwZShrbGFzcyk7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKAogICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgJG51bGxhYmlsaXR5IG9uIGFuIEludGVyZmFjZVR5cGUuIik7CiAgICB9CiAgfQoKICBJbnRlcmZhY2VUeXBlIHRoaXNJbnRlcmZhY2VUeXBlKENsYXNzIGtsYXNzLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgSW50ZXJmYWNlVHlwZSByZXN1bHQgPSBfdGhpc0ludGVyZmFjZVR5cGVzW2tsYXNzXTsKICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICByZXR1cm4gX3RoaXNJbnRlcmZhY2VUeXBlc1trbGFzc10gPSBuZXcgSW50ZXJmYWNlVHlwZShrbGFzcywgbnVsbGFiaWxpdHksCiAgICAgICAgICBnZXRBc1R5cGVBcmd1bWVudHMoa2xhc3MudHlwZVBhcmFtZXRlcnMsIGtsYXNzLmVuY2xvc2luZ0xpYnJhcnkpKTsKICAgIH0KICAgIGlmIChyZXN1bHQubnVsbGFiaWxpdHkgIT0gbnVsbGFiaWxpdHkpIHsKICAgICAgcmV0dXJuIF90aGlzSW50ZXJmYWNlVHlwZXNba2xhc3NdID0gcmVzdWx0LndpdGhOdWxsYWJpbGl0eShudWxsYWJpbGl0eSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVHlwZWRlZlR5cGUgdGhpc1R5cGVkZWZUeXBlKFR5cGVkZWYgdHlwZWRlZiwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIFR5cGVkZWZUeXBlIHJlc3VsdCA9IF90aGlzVHlwZWRlZlR5cGVzW3R5cGVkZWZdOwogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfdGhpc1R5cGVkZWZUeXBlc1t0eXBlZGVmXSA9IG5ldyBUeXBlZGVmVHlwZSh0eXBlZGVmLCBudWxsYWJpbGl0eSwKICAgICAgICAgIGdldEFzVHlwZUFyZ3VtZW50cyh0eXBlZGVmLnR5cGVQYXJhbWV0ZXJzLCB0eXBlZGVmLmVuY2xvc2luZ0xpYnJhcnkpKTsKICAgIH0KICAgIGlmIChyZXN1bHQubnVsbGFiaWxpdHkgIT0gbnVsbGFiaWxpdHkpIHsKICAgICAgcmV0dXJuIF90aGlzVHlwZWRlZlR5cGVzW3R5cGVkZWZdID0gcmVzdWx0LndpdGhOdWxsYWJpbGl0eShudWxsYWJpbGl0eSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQ29uc3RydWN0b3IgZ2V0IGxhdGVJbml0aWFsaXphdGlvbkVycm9yQ29uc3RydWN0b3IgewogICAgcmV0dXJuIF9sYXRlSW5pdGlhbGl6YXRpb25FcnJvckNvbnN0cnVjdG9yID8/PQogICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpfaW50ZXJuYWwnLCAnTGF0ZUluaXRpYWxpemF0aW9uRXJyb3JJbXBsJywgJycpOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBib3R0b21JbnRlcmZhY2VUeXBlKENsYXNzIGtsYXNzLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgSW50ZXJmYWNlVHlwZSByZXN1bHQgPSBfYm90dG9tSW50ZXJmYWNlVHlwZXNba2xhc3NdOwogICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfYm90dG9tSW50ZXJmYWNlVHlwZXNba2xhc3NdID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICBrbGFzcywKICAgICAgICAgIG51bGxhYmlsaXR5LAogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICBrbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IEJvdHRvbVR5cGUoKSkpOwogICAgfQogICAgaWYgKHJlc3VsdC5udWxsYWJpbGl0eSAhPSBudWxsYWJpbGl0eSkgewogICAgICByZXR1cm4gX2JvdHRvbUludGVyZmFjZVR5cGVzW2tsYXNzXSA9IHJlc3VsdC53aXRoTnVsbGFiaWxpdHkobnVsbGFiaWxpdHkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBDaGVja3MgaWYgW3R5cGVdIHNhdGlzZmllcyB0aGUgVE9QIHByZWRpY2F0ZS4KICAvLy8KICAvLy8gRm9yIHRoZSBkZWZpbml0aW9uIG9mIFRPUCBzZWUgdGhlIGZvbGxvd2luZzoKICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9ibG9iL21hc3Rlci9yZXNvdXJjZXMvdHlwZS1zeXN0ZW0vdXBwZXItbG93ZXItYm91bmRzLm1kI2hlbHBlci1wcmVkaWNhdGVzCiAgYm9vbCBpc1RvcChEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnZhbGlkVHlwZSkgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFRPUChkeW5hbWljKSBpcyB0cnVlLgogICAgaWYgKHR5cGUgaXMgRHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwoKICAgIC8vIFRPUCh2b2lkKSBpcyB0cnVlLgogICAgaWYgKHR5cGUgaXMgVm9pZFR5cGUpIHJldHVybiB0cnVlOwoKICAgIC8vIFRPUChUPykgaXMgdHJ1ZSBpZmYgVE9QKFQpIG9yIE9CSkVDVChUKS4KICAgIC8vIFRPUChUKikgaXMgdHJ1ZSBpZmYgVE9QKFQpIG9yIE9CSkVDVChUKS4KICAgIGlmICh0eXBlLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlIHx8CiAgICAgICAgdHlwZS5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgRGFydFR5cGUgbm9uTnVsbGFibGVUeXBlID0gdHlwZS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBhc3NlcnQodHlwZSAhPSBub25OdWxsYWJsZVR5cGUpOwogICAgICByZXR1cm4gaXNUb3Aobm9uTnVsbGFibGVUeXBlKSB8fCBpc09iamVjdChub25OdWxsYWJsZVR5cGUpOwogICAgfQoKICAgIC8vIFRPUChGdXR1cmVPcjxUPikgaXMgVE9QKFQpLgogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlLmNsYXNzTm9kZSA9PSBmdXR1cmVPckNsYXNzKSB7CiAgICAgIHJldHVybiBpc1RvcCh0eXBlLnR5cGVBcmd1bWVudHMuc2luZ2xlKTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gQ2hlY2tzIGlmIFt0eXBlXSBzYXRpc2ZpZXMgdGhlIE9CSkVDVCBwcmVkaWNhdGUuCiAgLy8vCiAgLy8vIEZvciB0aGUgZGVmaW5pdGlvbiBvZiBPQkpFQ1Qgc2VlIHRoZSBmb2xsb3dpbmc6CiAgLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvYmxvYi9tYXN0ZXIvcmVzb3VyY2VzL3R5cGUtc3lzdGVtL3VwcGVyLWxvd2VyLWJvdW5kcy5tZCNoZWxwZXItcHJlZGljYXRlcwogIGJvb2wgaXNPYmplY3QoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgaXMgSW52YWxpZFR5cGUpIHJldHVybiBmYWxzZTsKCiAgICAvLyBPQkpFQ1QoT2JqZWN0KSBpcyB0cnVlLgogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGUuY2xhc3NOb2RlID09IG9iamVjdENsYXNzICYmCiAgICAgICAgdHlwZS5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBPQkpFQ1QoRnV0dXJlT3I8VD4pIGlzIE9CSkVDVChUKS4KICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICB0eXBlLmNsYXNzTm9kZSA9PSBmdXR1cmVPckNsYXNzICYmCiAgICAgICAgdHlwZS5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICByZXR1cm4gaXNPYmplY3QodHlwZS50eXBlQXJndW1lbnRzLnNpbmdsZSk7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIENoZWNrcyBpZiBbdHlwZV0gc2F0aXNmaWVzIHRoZSBCT1RUT00gcHJlZGljYXRlLgogIC8vLwogIC8vLyBGb3IgdGhlIGRlZmluaXRpb24gb2YgQk9UVE9NIHNlZSB0aGUgZm9sbG93aW5nOgogIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2Jsb2IvbWFzdGVyL3Jlc291cmNlcy90eXBlLXN5c3RlbS91cHBlci1sb3dlci1ib3VuZHMubWQjaGVscGVyLXByZWRpY2F0ZXMKICBib29sIGlzQm90dG9tKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIEludmFsaWRUeXBlKSByZXR1cm4gZmFsc2U7CgogICAgLy8gQk9UVE9NKE5ldmVyKSBpcyB0cnVlLgogICAgaWYgKHR5cGUgaXMgTmV2ZXJUeXBlICYmIHR5cGUubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gQk9UVE9NKFgmVCkgaXMgdHJ1ZSBpZmYgQk9UVE9NKFQpLgogICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICB0eXBlLnByb21vdGVkQm91bmQgIT0gbnVsbCAmJgogICAgICAgIHR5cGUuaXNQb3RlbnRpYWxseU5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiBpc0JvdHRvbSh0eXBlLnByb21vdGVkQm91bmQpOwogICAgfQoKICAgIC8vIEJPVFRPTShYIGV4dGVuZHMgVCkgaXMgdHJ1ZSBpZmYgQk9UVE9NKFQpLgogICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYgdHlwZS5pc1BvdGVudGlhbGx5Tm9uTnVsbGFibGUpIHsKICAgICAgYXNzZXJ0KHR5cGUucHJvbW90ZWRCb3VuZCA9PSBudWxsKTsKICAgICAgcmV0dXJuIGlzQm90dG9tKHR5cGUucGFyYW1ldGVyLmJvdW5kKTsKICAgIH0KCiAgICBpZiAodHlwZSBpcyBCb3R0b21UeXBlKSByZXR1cm4gdHJ1ZTsKCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gQ2hlY2tzIGlmIFt0eXBlXSBzYXRpc2ZpZXMgdGhlIE5VTEwgcHJlZGljYXRlLgogIC8vLwogIC8vLyBGb3IgdGhlIGRlZmluaXRpb24gb2YgTlVMTCBzZWUgdGhlIGZvbGxvd2luZzoKICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9ibG9iL21hc3Rlci9yZXNvdXJjZXMvdHlwZS1zeXN0ZW0vdXBwZXItbG93ZXItYm91bmRzLm1kI2hlbHBlci1wcmVkaWNhdGVzCiAgYm9vbCBpc051bGwoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgaXMgSW52YWxpZFR5cGUpIHJldHVybiBmYWxzZTsKCiAgICAvLyBOVUxMKE51bGwpIGlzIHRydWUuCiAgICBpZiAodHlwZSA9PSBudWxsVHlwZSkgcmV0dXJuIHRydWU7CgogICAgLy8gTlVMTChUPykgaXMgdHJ1ZSBpZmYgTlVMTChUKSBvciBCT1RUT00oVCkuCiAgICAvLyBOVUxMKFQqKSBpcyB0cnVlIGlmZiBOVUxMKFQpIG9yIEJPVFRPTShUKS4KICAgIGlmICh0eXBlLm51bGxhYmlsaXR5ID09IE51bGxhYmls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IHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGtlcm5lbC50YXJnZXQudGFyZ2V0czsKCmltcG9ydCAnLi4vYXN0LmRhcnQnOwppbXBvcnQgJy4uL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi9jb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3JlZmVyZW5jZV9mcm9tX2luZGV4LmRhcnQnOwppbXBvcnQgJ2NoYW5nZWRfc3RydWN0dXJlX25vdGlmaWVyLmRhcnQnOwoKZmluYWwgTGlzdDxTdHJpbmc+IHRhcmdldE5hbWVzID0gdGFyZ2V0cy5rZXlzLnRvTGlzdCgpOwoKY2xhc3MgVGFyZ2V0RmxhZ3MgewogIGZpbmFsIGJvb2wgdHJhY2tXaWRnZXRDcmVhdGlvbjsKICBmaW5hbCBib29sIGZvcmNlTGF0ZUxvd2VyaW5nRm9yVGVzdGluZzsKICBmaW5hbCBib29sIGVuYWJsZU51bGxTYWZldHk7CgogIFRhcmdldEZsYWdzKAogICAgICB7dGhpcy50cmFja1dpZGdldENyZWF0aW9uID0gZmFsc2UsCiAgICAgIHRoaXMuZm9yY2VMYXRlTG93ZXJpbmdGb3JUZXN0aW5nID0gZmFsc2UsCiAgICAgIHRoaXMuZW5hYmxlTnVsbFNhZmV0eSA9IGZhbHNlfSk7Cn0KCnR5cGVkZWYgVGFyZ2V0IF9UYXJnZXRCdWlsZGVyKFRhcmdldEZsYWdzIGZsYWdzKTsKCmZpbmFsIE1hcDxTdHJpbmcsIF9UYXJnZXRCdWlsZGVyPiB0YXJnZXRzID0gPFN0cmluZywgX1RhcmdldEJ1aWxkZXI+ewogICdub25lJzogKFRhcmdldEZsYWdzIGZsYWdzKSA9PiBuZXcgTm9uZVRhcmdldChmbGFncyksCn07CgpUYXJnZXQgZ2V0VGFyZ2V0KFN0cmluZyBuYW1lLCBUYXJnZXRGbGFncyBmbGFncykgewogIF9UYXJnZXRCdWlsZGVyIGJ1aWxkZXIgPSB0YXJnZXRzW25hbWVdOwogIGlmIChidWlsZGVyID09IG51bGwpIHJldHVybiBudWxsOwogIHJldHVybiBidWlsZGVyKGZsYWdzKTsKfQoKYWJzdHJhY3QgY2xhc3MgRGlhZ25vc3RpY1JlcG9ydGVyPE0sIEM+IHsKICB2b2lkIHJlcG9ydChNIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge0xpc3Q8Qz4gY29udGV4dH0pOwp9CgovLy8gVGhlIGRpZmZlcmVudCBraW5kcyBvZiBudW1iZXIgc2VtYW50aWNzIHN1cHBvcnRlZCBieSB0aGUgY29uc3RhbnQgZXZhbHVhdG9yLgplbnVtIE51bWJlclNlbWFudGljcyB7CiAgLy8vIERhcnQgVk0gbnVtYmVyIHNlbWFudGljcy4KICB2bSwKCiAgLy8vIEphdmFTY3JpcHQgKERhcnQyanMgYW5kIEREQykgbnVtYmVyIHNlbWFudGljcy4KICBqcywKfQoKLy8gQmFja2VuZCBzcGVjaWZpYyBjb25zdGFudCBldmFsdWF0aW9uIGJlaGF2aW9yCmNsYXNzIENvbnN0YW50c0JhY2tlbmQgewogIGNvbnN0IENvbnN0YW50c0JhY2tlbmQoKTsKCiAgLy8vIExvd2VyaW5nIG9mIGEgbGlzdCBjb25zdGFudCB0byBhIGJhY2tlbmQtc3BlY2lmaWMgcmVwcmVzZW50YXRpb24uCiAgQ29uc3RhbnQgbG93ZXJMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IGNvbnN0YW50KSA9PiBjb25zdGFudDsKCiAgLy8vIExvd2VyaW5nIG9mIGEgc2V0IGNvbnN0YW50IHRvIGEgYmFja2VuZC1zcGVjaWZpYyByZXByZXNlbnRhdGlvbi4KICBDb25zdGFudCBsb3dlclNldENvbnN0YW50KFNldENvbnN0YW50IGNvbnN0YW50KSA9PiBjb25zdGFudDsKCiAgLy8vIExvd2VyaW5nIG9mIGEgbWFwIGNvbnN0YW50IHRvIGEgYmFja2VuZC1zcGVjaWZpYyByZXByZXNlbnRhdGlvbi4KICBDb25zdGFudCBsb3dlck1hcENvbnN0YW50KE1hcENvbnN0YW50IGNvbnN0YW50KSA9PiBjb25zdGFudDsKCiAgLy8vIE51bWJlciBzZW1hbnRpY3MgdG8gdXNlIGZvciB0aGlzIGJhY2tlbmQuCiAgTnVtYmVyU2VtYW50aWNzIGdldCBudW1iZXJTZW1hbnRpY3MgPT4gTnVtYmVyU2VtYW50aWNzLnZtOwoKICAvLy8gSW5saW5lIGNvbnRyb2wgb2YgY29uc3RhbnQgdmFyaWFibGVzLiBUaGUgZ2l2ZW4gY29uc3RhbnQgZXhwcmVzc2lvbgogIC8vLyBpcyB0aGUgaW5pdGlhbGl6ZXIgb2YgYSBbRmllbGRdIG9yIFtWYXJpYWJsZURlY2xhcmF0aW9uXSBub2RlLgogIC8vLyBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCwgdGhlIHZhcmlhYmxlIHdpbGwgYmUgaW5saW5lZCBhdCBhbGwKICAvLy8gcG9pbnRzIG9mIHJlZmVyZW5jZSBhbmQgdGhlIHZhcmlhYmxlIGl0c2VsZiByZW1vdmVkICh1bmxlc3Mgb3ZlcnJpZGRlbgogIC8vLyBieSB0aGUgYGtlZXBGaWVsZHNgIG9yIGBrZWVwVmFyaWFibGVzYCBmbGFnIHRvIHRoZSBjb25zdGFudCB0cmFuc2Zvcm1lcikuCiAgLy8vIFRoaXMgbWV0aG9kIG11c3QgYmUgZGV0ZXJtaW5pc3RpYywgaS5lLiBpdCBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUKICAvLy8gdmFsdWUgZm9yIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGFuZCBwbGFjZSBpbiB0aGUgQVNULgogIGJvb2wgc2hvdWxkSW5saW5lQ29uc3RhbnQoQ29uc3RhbnRFeHByZXNzaW9uIGluaXRpYWxpemVyKSA9PiB0cnVlOwoKICAvLy8gV2hldGhlciB0aGlzIHRhcmdldCBzdXBwb3J0cyB1bmV2YWx1YXRlZCBjb25zdGFudHMuCiAgLy8vCiAgLy8vIElmIG5vdCwgdGhlbiB0cnlpbmcgdG8gcGVyZm9ybSBjb25zdGFudCBldmFsdWF0aW9uIHdpdGhvdXQgYW4gZW52aXJvbm1lbnQKICAvLy8gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KICAvLy8KICAvLy8gVGhpcyBkZWZhdWx0cyB0byBgZmFsc2VgIHNpbmNlIGl0IHJlcXVpcmVzIGFkZGl0aW9uYWwgd29yayBmb3IgYSBiYWNrZW5kCiAgLy8vIHRvIHN1cHBvcnQgdW5ldmFsdWF0ZWQgY29uc3RhbnRzLgogIGJvb2wgZ2V0IHN1cHBvcnRzVW5ldmFsdWF0ZWRDb25zdGFudHMgPT4gZmFsc2U7Cn0KCi8vLyBBIHRhcmdldCBwcm92aWRlcyBiYWNrZW5kLXNwZWNpZmljIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcga2VybmVsIElSLgphYnN0cmFjdCBjbGFzcyBUYXJnZXQgewogIFN0cmluZyBnZXQgbmFtZTsKCiAgLy8vIEEgbGlzdCBvZiBVUklzIG9mIHJlcXVpcmVkIGxpYnJhcmllcywgbm90IGluY2x1ZGluZyBkYXJ0OmNvcmUuCiAgLy8vCiAgLy8vIExpYnJhcmllcyB3aWxsIGJlIGxvYWRlZCBpbiBvcmRlci4KICBMaXN0PFN0cmluZz4gZ2V0IGV4dHJhUmVxdWlyZWRMaWJyYXJpZXMgPT4gY29uc3QgPFN0cmluZz5bXTsKCiAgLy8vIEEgbGlzdCBvZiBVUklzIG9mIGV4dHJhIHJlcXVpcmVkIGxpYnJhcmllcyB3aGVuIGNvbXBpbGluZyB0aGUgcGxhdGZvcm0uCiAgLy8vCiAgLy8vIExpYnJhcmllcyB3aWxsIGJlIGxvYWRlZCBpbiBvcmRlciBhZnRlciB0aGUgW2V4dHJhUmVxdWlyZWRMaWJyYXJpZXNdCiAgLy8vIGFib3ZlLgogIC8vLwogIC8vLyBOb3JtYWxseSBub3QgbmVlZGVkLCBidXQgY2FuIGJlIHVzZWZ1bCBpZiByZW1vdmluZyBsaWJyYXJpZXMgZnJvbSB0aGUKICAvLy8gW2V4dHJhUmVxdWlyZWRMaWJyYXJpZXNdIGxpc3Qgc28gbGlicmFyaWVzIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIGluIHRoZQogIC8vLyBwbGF0Zm9ybSBpZiBoYXZpbmcgYSB3ZWlyZCBtaXggb2YgY3VycmVudCBhbmQgbm90LXF1aXRlLWN1cnJlbnQgYXMgY2FuCiAgLy8vIHNvbWV0aW1lcyBiZSB0aGUgY2FzZS4KICBMaXN0PFN0cmluZz4gZ2V0IGV4dHJhUmVxdWlyZWRMaWJyYXJpZXNQbGF0Zm9ybSA9PiBjb25zdCA8U3RyaW5nPltdOwoKICAvLy8gQSBsaXN0IG9mIFVSSXMgb2YgbGlicmFyaWVzIHRvIGJlIGluZGV4ZWQgaW4gdGhlIENvcmVUeXBlcyBpbmRleCwgbm90CiAgLy8vIGluY2x1ZGluZyBkYXJ0Ol9pbnRlcm5hbCwgZGFydDphc3luYywgZGFydDpjb3JlIGFuZCBkYXJ0Om1pcnJvcnMuCiAgTGlzdDxTdHJpbmc+IGdldCBleHRyYUluZGV4ZWRMaWJyYXJpZXMgPT4gY29uc3QgPFN0cmluZz5bXTsKCiAgLy8vIEFkZGl0aW9uYWwgZGVjbGFyZWQgdmFyaWFibGVzIGltcGxpZWQgYnkgdGhpcyB0YXJnZXQuCiAgLy8vCiAgLy8vIFRoZXNlIGNhbiBhbHNvIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZC1saW5lIG9mIGZvcm0gYC1EPG5hbWU+PTx2YWx1ZT5gLAogIC8vLyBhbmQgdGhvc2UgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQtbGluZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBkZWZpbmVkCiAgLy8vIGJ5IHRoZSB0YXJnZXQuCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgZXh0cmFEZWNsYXJlZFZhcmlhYmxlcyA9PiBjb25zdCA8U3RyaW5nLCBTdHJpbmc+e307CgogIC8vLyBDbGFzc2VzIGZyb20gdGhlIFNESyB3aG9zZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgZm9yIHRoZSBtb2R1bGFyCiAgLy8vIHRyYW5zZm9ybWF0aW9ucy4KICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldCByZXF1aXJlZFNka0NsYXNzZXMgPT4gQ29yZVR5cGVzLnJlcXVpcmVkQ2xhc3NlczsKCiAgLy8vIEEgZGVyaXZlZCBjbGFzcyBtYXkgY2hhbmdlIHRoaXMgdG8gYHRydWVgIHRvIGVuYWJsZSBmb3J3YXJkZXJzIHRvCiAgLy8vIHVzZXItZGVmaW5lZCBgbm9TdWNoTWV0aG9kYCB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggYWJzdHJhY3QgbWVtYmVyCiAgLy8vIGlmIHN1Y2ggYG5vU3VjaE1ldGhvZGAgaXMgcHJlc2VudC4KICAvLy8KICAvLy8gVGhlIGZvcndhcmRlcnMgYXJlIGFic3RyYWN0IFtQcm9jZWR1cmVdcyB3aXRoIFtpc05vU3VjaE1ldGhvZEZvcndhcmRlcl0KICAvLy8gYml0IHNldC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmVoYXZpb3Igb2Ygc3VjaCBmb3J3YXJkZXJzIGlzIHVwCiAgLy8vIGZvciB0aGUgdGFyZ2V0IGJhY2tlbmQuCiAgYm9vbCBnZXQgZW5hYmxlTm9TdWNoTWV0aG9kRm9yd2FyZGVycyA9PiBmYWxzZTsKCiAgLy8vIEEgZGVyaXZlZCBjbGFzcyBtYXkgY2hhbmdlIHRoaXMgdG8gYHRydWVgIHRvIGVuYWJsZSBGbHV0dGVyIHNwZWNpZmljCiAgLy8vICJzdXBlci1taXhpbnMiIHNlbWFudGljcy4KICAvLy8KICAvLy8gVGhpcyBzZW1hbnRpY3MgcmVsYXhlcyBhIG51bWJlciBvZiBjb25zdHJhaW50IHByZXZpb3VzbHkgaW1wb3NlZCBvbgogIC8vLyBtaXhpbnMuIEltcG9ydGFudGx5IGl0IGltcG9zZXMgdGhlIGZvbGxvd2luZyBjaGFuZ2U6CiAgLy8vCiAgLy8vICAgICBBbiBhYnN0cmFjdCBjbGFzcyBtYXkgY29udGFpbiBhIG1lbWJlciB3aXRoIGEgc3VwZXItaW52b2NhdGlvbiB0aGF0CiAgLy8vICAgICBjb3JyZXNwb25kcyB0byBhIG1lbWJlciBvZiB0aGUgc3VwZXJjbGFzcyBpbnRlcmZhY2UsIGJ1dCB3aGVyZSB0aGUKICAvLy8gICAgIGFjdHVhbCBzdXBlcmNsYXNzIGRvZXMgbm90IGRlY2xhcmUgb3IgaW5oZXJpdCBhIG1hdGNoaW5nIG1ldGhvZC4KICAvLy8gICAgIFNpbmNlIG5vIGFtb3VudCBvZiBvdmVycmlkaW5nIGNhbiBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSwgc3VjaCBhIGNsYXNzCiAgLy8vICAgICBjYW5ub3QgYmUgZXh0ZW5kZWQgdG8gYSBjbGFzcyB0aGF0IGlzIG5vdCBhYnN0cmFjdCwgaXQgY2FuIG9ubHkgYmUKICAvLy8gICAgIHVzZWQgdG8gZGVyaXZlIGEgbWl4aW4gZnJvbS4KICAvLy8KICAvLy8gU2VlIGRhcnRidWcuY29tLzMxNTQyIGZvciBkZXRhaWxzIG9mIHRoZSBzZW1hbnRpY3MuCiAgYm9vbCBnZXQgZW5hYmxlU3VwZXJNaXhpbnMgPT4gZmFsc2U7CgogIC8vLyBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIG91dGxpbmVzIHN0b3JlZCBpbgogIC8vLyBbQ29tcG9uZW50XSB3aGVuIGdlbmVyYXRpbmcgc3VtbWFyaWVzLgogIC8vLwogIC8vLyBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWRkIG1ldGFkYXRhIG9uIG91dGxpbmVzIGFuZCB0byBmaWx0ZXIKICAvLy8gdW5uZWNlc3NhcnkgaW5mb3JtYXRpb24gYmVmb3JlIGdlbmVyYXRpbmcgcHJvZ3JhbSBzdW1tYXJpZXMuIFRoaXMKICAvLy8gdHJhbnNmb3JtYXRpb24gaXMgbm90IGFwcGxpZWQgd2hlbiBjb21waWxpbmcgZnVsbCBrZXJuZWwgcHJvZ3JhbXMgdG8KICAvLy8gcHJldmVudCBhZmZlY3RpbmcgdGhlIGludGVybmFsIGludmFyaWFudHMgb2YgdGhlIGNvbXBpbGVyIGFuZCBhY2NpZGVudGFsbHkKICAvLy8gc2xvd2luZyBkb3duIGNvbXBpbGF0aW9uLgogIHZvaWQgcGVyZm9ybU91dGxpbmVUcmFuc2Zvcm1hdGlvbnMoQ29tcG9uZW50IGNvbXBvbmVudCkge30KCiAgLy8vIFBlcmZvcm0gdGFyZ2V0LXNwZWNpZmljIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgZ2l2ZW4gbGlicmFyaWVzIHRoYXQgbXVzdAogIC8vLyBydW4gYmVmb3JlIGNvbnN0YW50IGV2YWx1YXRpb24uCiAgdm9pZCBwZXJmb3JtUHJlQ29uc3RhbnRFdmFsdWF0aW9uVHJhbnNmb3JtYXRpb25zKAogICAgICBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpLAogICAgICBDaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyfSkge30KCiAgLy8vIFBlcmZvcm0gdGFyZ2V0LXNwZWNpZmljIG1vZHVsYXIgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBnaXZlbiBsaWJyYXJpZXMuCiAgdm9pZCBwZXJmb3JtTW9kdWxhclRyYW5zZm9ybWF0aW9uc09uTGlicmFyaWVzKAogICAgICBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLAogICAgICAvLyBUT0RPKGFza2VzYyk6IENvbnNpZGVyIGhvdyB0byBnZW5lcmFsbHkgcGFzcyBjb21waWxlciBvcHRpb25zIHRvCiAgICAgIC8vIHRyYW5zZm9ybWF0aW9ucy4KICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgIFJlZmVyZW5jZUZyb21JbmRleCByZWZlcmVuY2VGcm9tSW5kZXgsCiAgICAgIHt2b2lkIGxvZ2dlcihTdHJpbmcgbXNnKSwKICAgICAgQ2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyIGNoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllcn0pOwoKICAvLy8gUGVyZm9ybSB0YXJnZXQtc3BlY2lmaWMgbW9kdWxhciB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIGdpdmVuIHByb2dyYW0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIGFuIGluZGl2aWR1YWwgZXhwcmVzc2lvbiBpcyBjb21waWxlZCwgZS5nLiBmb3IgZGVidWdnaW5nCiAgLy8vIHB1cnBvc2VzLiBJdCBpcyBpbGxlZ2FsIHRvIG1vZGlmeSBhbnkgb2YgdGhlIGVuY2xvc2luZyBub2RlcyBvZiB0aGUKICAvLy8gcHJvY2VkdXJlLgogIHZvaWQgcGVyZm9ybVRyYW5zZm9ybWF0aW9uc09uUHJvY2VkdXJlKAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIFByb2NlZHVyZSBwcm9jZWR1cmUsCiAgICAgIHt2b2lkIGxvZ2dlcihTdHJpbmcgbXNnKX0pIHt9CgogIC8vLyBXaGV0aGVyIGEgcGxhdGZvcm0gbGlicmFyeSBtYXkgZGVmaW5lIGEgcmVzdHJpY3RlZCB0eXBlLCBzdWNoIGFzIGBib29sYCwKICAvLy8gYGludGAsIGBkb3VibGVgLCBgbnVtYCwgYW5kIGBTdHJpbmdgLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0IG9ubHkgYGRhcnQ6Y29yZWAgbWF5IGRlZmluZSByZXN0cmljdGVkIHR5cGVzLCBidXQgc29tZSB0YXJnZXQKICAvLy8gaW1wbGVtZW50YXRpb25zIG92ZXJyaWRlIHRoaXMuCiAgYm9vbCBtYXlEZWZpbmVSZXN0cmljdGVkVHlwZShVcmkgdXJpKSA9PgogICAgICB1cmkuc2NoZW1lID09ICdkYXJ0JyAmJiB1cmkucGF0aCA9PSAnY29yZSc7CgogIC8vLyBXaGV0aGVyIGEgbGlicmFyeSBpcyBhbGxvd2VkIHRvIGltcG9ydCBhIHBsYXRmb3JtIHByaXZhdGUgbGlicmFyeS4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCBvbmx5IGBkYXJ0OipgIGxpYnJhcmllcyBhcmUgYWxsb3dlZC4gTWF5IGJlIG92ZXJyaWRkZW4gZm9yCiAgLy8vIHRlc3RpbmcgcHVycG9zZXMuCiAgYm9vbCBhbGxvd1BsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MoVXJpIGltcG9ydGVyLCBVcmkgaW1wb3J0ZWQpID0+CiAgICAgIGltcG9ydGVkLnNjaGVtZSAhPSAiZGFydCIgfHwKICAgICAgIWltcG9ydGVkLnBhdGguc3RhcnRzV2l0aCgiXyIpIHx8CiAgICAgIGltcG9ydGVyLnNjaGVtZSA9PSAiZGFydCIgfHwKICAgICAgKGltcG9ydGVyLnNjaGVtZSA9PSAicGFja2FnZSIgJiYKICAgICAgICAgIGltcG9ydGVyLnBhdGguc3RhcnRzV2l0aCgiZGFydF9pbnRlcm5hbC8iKSk7CgogIC8vLyBXaGV0aGVyIHRoZSBgbmF0aXZlYCBsYW5ndWFnZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkIHdpdGhpbiBbbGlicmFyeV0uCiAgLy8vCiAgLy8vIFRoZSBgbmF0aXZlYCBsYW5ndWFnZSBleHRlbnNpb24gaXMgbm90IHBhcnQgb2YgdGhlIGxhbmd1YWdlIHNwZWNpZmljYXRpb24sCiAgLy8vIGl0IG1lYW5zIHNvbWV0aGluZyBlbHNlIHRvIGVhY2ggdGFyZ2V0LCBhbmQgaXQgaXMgZW5hYmxlZCB1bmRlciBkaWZmZXJlbnQKICAvLy8gY2lyY3Vtc3RhbmNlcyBmb3IgZWFjaCB0YXJnZXQgaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlLCB0aGUgVk0gdGFyZ2V0CiAgLy8vIGVuYWJsZXMgaXQgZXZlcnl3aGVyZSBiZWNhdXNlIG9mIGV4aXN0aW5nIHN1cHBvcnQgZm9yICJkYXJ0LWV4dDoiIG5hdGl2ZQogIC8vLyBleHRlbnNpb25zLCBidXQgdGFyZ2V0cyBsaWtlIGRhcnQyanMgb25seSBlbmFibGUgaXQgb24gdGhlIGNvcmUgbGlicmFyaWVzLgogIGJvb2wgZW5hYmxlTmF0aXZlKFVyaSB1cmkpID0+IGZhbHNlOwoKICAvLy8gVGhlcmUgYXJlIHR3byB2YXJpYW50cyBvZiB0aGUgYG5hdGl2ZWAgbGFuZ3VhZ2UgZXh0ZW5zaW9uLiBUaGUgVk0gZXhwZWN0cwogIC8vLyB0aGUgbmF0aXZlIHRva2VuIHRvIGJlIGZvbGxvd2VkIGJ5IHN0cmluZywgd2hlcmVhcyBkYXJ0MmpzIGFuZCBEREMgZG8gbm90LgogIC8vIFRPRE8oc2lnbXVuZCwgYWhlKTogaWRlYWxseSB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBgbmF0aXZlYCBzeW50YXgsIGlmIG5vdCwKICAvLyB3ZSBzaG91bGQgYXQgbGVhc3QgdW5pZnkgdGhlIFZNIGFuZCBub24tVk0gdmFyaWFudHMuCiAgYm9vbCBnZXQgbmF0aXZlRXh0ZW5zaW9uRXhwZWN0c1N0cmluZyA9PiBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgaW50ZWdlciBsaXRlcmFscyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IG9uIHRoZSB3ZWIKICAvLy8gKGkuZS4gaW4gSmF2YXNjcmlwdCkgc2hvdWxkIGNhdXNlIGFuIGVycm9yIHRvIGJlIGlzc3VlZC4KICAvLy8gQW4gZXhhbXBsZSBvZiBzdWNoIGEgbnVtYmVyIGlzIGAyXjUzICsgMWAgd2hlcmUgaW4gSmF2YXNjcmlwdCAtIGJlY2F1c2UKICAvLy8gaW50ZWdlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMKICAvLy8gYE1hdGgucG93KDIsIDUzKSA9IE1hdGgucG93KDIsIDUzKSArIDFgLgogIGJvb2wgZ2V0IGVycm9yT25VbmV4YWN0V2ViSW50TGl0ZXJhbHMgPT4gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHNldCBsaXRlcmFscyBhcmUgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IHRoaXMgdGFyZ2V0LiBJZiBzZXQKICAvLy8gbGl0ZXJhbHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCwgdGhleSB3aWxsIGJlIGRlc3VnYXJlZCBpbnRvCiAgLy8vIGV4cGxpY2l0IGBTZXRgIGNyZWF0aW9uIChmb3Igbm9uLWNvbnN0IHNldCBsaXRlcmFscykgb3Igd3JhcHBlZCBtYXAKICAvLy8gbGl0ZXJhbHMgKGZvciBjb25zdCBzZXQgbGl0ZXJhbHMpLgogIGJvb2wgZ2V0IHN1cHBvcnRzU2V0TGl0ZXJhbHMgPT4gdHJ1ZTsKCiAgLy8vIFdoZXRoZXIgbGF0ZSBmaWVsZHMgYW5kIHZhcmlhYmxlIGFyZSBzdXBwb3J0IGJ5IHRoaXMgdGFyZ2V0LgogIC8vLwogIC8vLyBJZiBgZmFsc2VgLCBsYXRlIGZpZWxkcyBhbmQgdmFyaWFibGVzIGFyZSBsb3dlcmVkIGZpZWxkcywgZ2V0dGVyLCBzZXR0ZXJzCiAgLy8vIGV0Yy4gdGhhdCBwcm92aWRlIGVxdWl2YWxlbnQgc2VtYW50aWNzLiBTZWUgYHBrZy9rZXJuZWwvbm5iZF9hcGkubWRgIGZvcgogIC8vLyBkZXRhaWxzLgogIGJvb2wgZ2V0IHN1cHBvcnRzTGF0ZUZpZWxkczsKCiAgLy8vIEJ1aWxkcyBhbiBleHByZXNzaW9uIHRoYXQgaW5zdGFudGlhdGVzIGFuIFtJbnZvY2F0aW9uXSB0aGF0IGNhbiBiZSBwYXNzZWQKICAvLy8gdG8gW25vU3VjaE1ldGhvZF0uCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZUludm9jYXRpb24oQ29yZVR5cGVzIGNvcmVUeXBlcywgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIGJvb2wgaXNTdXBlcik7CgogIEV4cHJlc3Npb24gaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcihDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaXNNZXRob2Q6IGZhbHNlLAogICAgICBib29sIGlzR2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1NldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZDogZmFsc2UsCiAgICAgIGJvb2wgaXNMb2NhbFZhcmlhYmxlOiBmYWxzZSwKICAgICAgYm9vbCBpc0R5bmFtaWM6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0cnVjdG9yOiBmYWxzZSwKICAgICAgYm9vbCBpc1RvcExldmVsOiBmYWxzZX0pOwoKICAvLy8gQ29uZmlndXJlIHRoZSBnaXZlbiBbQ29tcG9uZW50XSBpbiBhIHRhcmdldCBzcGVjaWZpYyB3YXkuCiAgLy8vIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQgY29tcG9uZW50LgogIENvbXBvbmVudCBjb25maWd1cmVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgPT4gY29tcG9uZW50OwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVGFyZ2V0KCRuYW1lKSc7CgogIENsYXNzIGNvbmNyZXRlTGlzdExpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzKSA9PiBudWxsOwogIENsYXNzIGNvbmNyZXRlQ29uc3RMaXN0TGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+IG51bGw7CgogIENsYXNzIGNvbmNyZXRlTWFwTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpID0+IG51bGw7CiAgQ2xhc3MgY29uY3JldGVDb25zdE1hcExpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzKSA9PiBudWxsOwoKICBDbGFzcyBjb25jcmV0ZUludExpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzLCBpbnQgdmFsdWUpID0+IG51bGw7CiAgQ2xhc3MgY29uY3JldGVEb3VibGVMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcywgZG91YmxlIHZhbHVlKSA9PiBudWxsOwogIENsYXNzIGNvbmNyZXRlU3RyaW5nTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMsIFN0cmluZyB2YWx1ZSkgPT4gbnVsbDsKCiAgQ29uc3RhbnRzQmFja2VuZCBjb25zdGFudHNCYWNrZW5kKENvcmVUeXBlcyBjb3JlVHlwZXMpOwp9CgpjbGFzcyBOb25lQ29uc3RhbnRzQmFja2VuZCBleHRlbmRzIENvbnN0YW50c0JhY2tlbmQgewogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgc3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50czsKCiAgY29uc3QgTm9uZUNvbnN0YW50c0JhY2tlbmQoe3RoaXMuc3VwcG9ydHNVbmV2YWx1YXRlZENvbnN0YW50c30pOwp9CgpjbGFzcyBOb25lVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKICBmaW5hbCBUYXJnZXRGbGFncyBmbGFnczsKCiAgTm9uZVRhcmdldCh0aGlzLmZsYWdzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgc3VwcG9ydHNMYXRlRmllbGRzID0+ICFmbGFncy5mb3JjZUxhdGVMb3dlcmluZ0ZvclRlc3Rpbmc7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAnbm9uZSc7CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllcyA9PiA8U3RyaW5nPltdOwoKICBAb3ZlcnJpZGUKICB2b2lkIHBlcmZvcm1Nb2R1bGFyVHJhbnNmb3JtYXRpb25zT25MaWJyYXJpZXMoCiAgICAgIENvbXBvbmVudCBjb21wb25lbnQsCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzLAogICAgICBEaWFnbm9zdGljUmVwb3J0ZXIgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgICBSZWZlcmVuY2VGcm9tSW5kZXggcmVmZXJlbmNlRnJvbUluZGV4LAogICAgICB7dm9pZCBsb2dnZXIoU3RyaW5nIG1zZyksCiAgICAgIENoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllciBjaGFuZ2VkU3RydWN0dXJlTm90aWZpZXJ9KSB7fQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGluc3RhbnRpYXRlSW52b2NhdGlvbihDb3JlVHlwZXMgY29yZVR5cGVzLCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgYm9vbCBpc1N1cGVyKSB7CiAgICByZXR1cm4gbmV3IEludmFsaWRFeHByZXNzaW9uKG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yKENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc01ldGhvZDogZmFsc2UsCiAgICAgIGJvb2wgaXNHZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkOiBmYWxzZSwKICAgICAgYm9vbCBpc0xvY2FsVmFyaWFibGU6IGZhbHNlLAogICAgICBib29sIGlzRHluYW1pYzogZmFsc2UsCiAgICAgIGJvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTdGF0aWM6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3RydWN0b3I6IGZhbHNlLAogICAgICBib29sIGlzVG9wTGV2ZWw6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBJbnZhbGlkRXhwcmVzc2lvbihudWxsKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50c0JhY2tlbmQgY29uc3RhbnRzQmFja2VuZChDb3JlVHlwZXMgY29yZVR5cGVzKSA9PgogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgdGhpcyB2YXJ5IHdpdGggdGhlIHVzZSBjYXNlPwogICAgICBjb25zdCBOb25lQ29uc3RhbnRzQmFja2VuZChzdXBwb3J0c1VuZXZhbHVhdGVkQ29uc3RhbnRzOiB0cnVlKTsKfQqBVQBOTjwfARYiHScqATgBFCIqHwEPKTAnAgEyAUY4AwEzKiQZAgEqQhoCAVEXIAYBNQYCATEZHAFIQQFHPwFHPwEwPQFKRUlNUE0+RQE6BlAbBk8oMgIBSRgTAUUGKT8BTgZLDQZMUE0dRwFMSD4BPAZPUBVOAUcXUQFITikGTkweMgFLIAZKOwZOTUtPTScGOicBSC0GTEhLUSA9AU8mNBsbHy0gPQFOMRsbIB9KGi4tLSA7AUwGUUoRKkokAU8sBk8lKzIBSQZMGEgjKCMnNwFNBlFQT09RJwFQUU86MgFNP04qLzIBSUxKKSgBQwZQTw8fAVAZTUMBP0kdHBwbIx0bHCEgAUAoQgEoAT9EAT5DAUlPTwE6AgE2DCsBQwIBIhsBGgEMRQEMHQEMOQEMMRsbIB8uLS0gPQEMTUQoBAEMP0kdHBwbIx0bHCEhKAQBDDxCRgIBInBhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnRbZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL2J5dGVjb2RlL2J5dGVjb2RlX3NlcmlhbGl6YXRpb24uZGFydMAATG0vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5ieXRlY29kZS5ieXRlY29kZV9zZXJpYWxpemF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBCaW5hcnlTaW5rOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBCeXRlRGF0YSwgRW5kaWFuLCBVaW50OExpc3QsIFVpbnQxNkxpc3Q7CgphYnN0cmFjdCBjbGFzcyBTdHJpbmdXcml0ZXIgewogIGludCBwdXQoU3RyaW5nIHN0cmluZyk7Cn0KCmFic3RyYWN0IGNsYXNzIFN0cmluZ1JlYWRlciB7CiAgU3RyaW5nIGdldChpbnQgcmVmKTsKfQoKYWJzdHJhY3QgY2xhc3MgQnl0ZWNvZGVPYmplY3Qge30KCmFic3RyYWN0IGNsYXNzIE9iamVjdFdyaXRlciB7CiAgdm9pZCB3cml0ZU9iamVjdChCeXRlY29kZU9iamVjdCBvYmplY3QsIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcik7Cn0KCmFic3RyYWN0IGNsYXNzIE9iamVjdFJlYWRlciB7CiAgQnl0ZWNvZGVPYmplY3QgcmVhZE9iamVjdChCdWZmZXJlZFJlYWRlciByZWFkZXIpOwp9CgpjbGFzcyBCdWZmZXJlZFdyaXRlciB7CiAgLy8vIEluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIEJ1ZmZlcmVkV3JpdGVyLgogIHN0YXRpYyBjb25zdCBpbnQgaW5pdGlhbFNpemUgPSAxMDI0OwoKICAvLy8gTGlzdHMgbGVzcyB0aGFuIHRoaXMgc2l6ZSBhcmUgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KICAvLy8gTGFyZ2VyIGxpc3RzIGFyZSBhcHBlbmRlZCB3aXRob3V0IGNvcHlpbmcuCiAgc3RhdGljIGNvbnN0IGludCBhdm9pZENvcHlpbmdTaXplID0gMTAyNDsKCiAgLy8vIEtlZXAgYnVmZmVycyB3aXRoIHRoaXMgcmVtYWluaW5nIGJ5dGVzIG9yIG1vcmUsIGluc3RlYWQgb2YKICAvLy8gY3JlYXRpbmcgYSBuZXcgYnVmZmVyLgogIHN0YXRpYyBjb25zdCBpbnQgbWluUmVtYWluZGVyVG9LZWVwID0gMjU2OwoKICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbjsKICBmaW5hbCBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyOwogIGZpbmFsIE9iamVjdFdyaXRlciBvYmplY3RXcml0ZXI7CiAgZmluYWwgTGlua1dyaXRlciBsaW5rV3JpdGVyOwoKICAvLyBQcmVmaXggb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoaXMgd3JpdGVyLgogIC8vIExpc3Qgb2YgcGFpcnMgVWludDhMaXN0IGJ1ZmZlciwgaW50IGxlbmd0aC4KICBMaXN0PGR5bmFtaWM+IF9idWZmZXJzOwogIC8vIFRvdGFsIGxlbmd0aCBvZiBkYXRhIGluIFtfYnVmZmVyc10uCiAgaW50IF9idWZmZXJzTGVuZ3RoID0gMDsKCiAgVWludDhMaXN0IF9jdXJyZW50QnVmZmVyID0gbmV3IFVpbnQ4TGlzdChpbml0aWFsU2l6ZSk7CiAgaW50IF9jdXJyZW50TGVuZ3RoID0gMDsKICBpbnQgX25leHRCdWZmZXJTaXplID0gaW5pdGlhbFNpemUgPDwgMTsKCiAgQnVmZmVyZWRXcml0ZXIodGhpcy5mb3JtYXRWZXJzaW9uLCB0aGlzLnN0cmluZ1dyaXRlciwgdGhpcy5vYmplY3RXcml0ZXIsCiAgICAgIHRoaXMubGlua1dyaXRlcik7CgogIGZhY3RvcnkgQnVmZmVyZWRXcml0ZXIuZnJvbVdyaXRlcihCdWZmZXJlZFdyaXRlciB3cml0ZXIpID0+CiAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcih3cml0ZXIuZm9ybWF0VmVyc2lvbiwgd3JpdGVyLnN0cmluZ1dyaXRlciwKICAgICAgICAgIHdyaXRlci5vYmplY3RXcml0ZXIsIHdyaXRlci5saW5rV3JpdGVyKTsKCiAgVWludDhMaXN0IGdldENvbnRlbnRzKCkgewogICAgaWYgKF9idWZmZXJzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBVaW50OExpc3QudmlldygKICAgICAgICAgIF9jdXJyZW50QnVmZmVyLmJ1ZmZlciwgX2N1cnJlbnRCdWZmZXIub2Zmc2V0SW5CeXRlcywgX2N1cnJlbnRMZW5ndGgpOwogICAgfQogICAgZmluYWwgVWludDhMaXN0IHJlc3VsdCA9IG5ldyBVaW50OExpc3QoX2J1ZmZlcnNMZW5ndGggKyBfY3VycmVudExlbmd0aCk7CiAgICBpbnQgcG9zaXRpb24gPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfYnVmZmVycy5sZW5ndGg7IGkgKz0gMikgewogICAgICBmaW5hbCBVaW50OExpc3QgYnVmID0gX2J1ZmZlcnNbaV07CiAgICAgIGZpbmFsIGludCBsZW4gPSBfYnVmZmVyc1tpICsgMV07CiAgICAgIHJlc3VsdC5zZXRSYW5nZShwb3NpdGlvbiwgcG9zaXRpb24gKyBsZW4sIGJ1Zik7CiAgICAgIHBvc2l0aW9uICs9IGxlbjsKICAgIH0KICAgIGFzc2VydChwb3NpdGlvbiA9PSBfYnVmZmVyc0xlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UocG9zaXRpb24sIHBvc2l0aW9uICsgX2N1cnJlbnRMZW5ndGgsIF9jdXJyZW50QnVmZmVyKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHdyaXRlQ29udGVudHNUb0JpbmFyeVNpbmsoQmluYXJ5U2luayBzaW5rKSB7CiAgICBpZiAoX2J1ZmZlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9idWZmZXJzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgVWludDhMaXN0IGJ1ZiA9IF9idWZmZXJzW2ldOwogICAgICAgIGZpbmFsIGludCBsZW4gPSBfYnVmZmVyc1tpICsgMV07CiAgICAgICAgaWYgKGxlbiAhPSBidWYubGVuZ3RoKSB7CiAgICAgICAgICBidWYgPSBuZXcgVWludDhMaXN0LnZpZXcoYnVmLmJ1ZmZlciwgYnVmLm9mZnNldEluQnl0ZXMsIGxlbik7CiAgICAgICAgfQogICAgICAgIHNpbmsud3JpdGVCeXRlcyhidWYpOwogICAgICB9CiAgICB9CiAgICBVaW50OExpc3QgYnVmID0gX2N1cnJlbnRCdWZmZXI7CiAgICBpZiAoX2N1cnJlbnRMZW5ndGggIT0gYnVmLmxlbmd0aCkgewogICAgICBidWYgPSBuZXcgVWludDhMaXN0LnZpZXcoYnVmLmJ1ZmZlciwgYnVmLm9mZnNldEluQnl0ZXMsIF9jdXJyZW50TGVuZ3RoKTsKICAgIH0KICAgIHNpbmsud3JpdGVCeXRlcyhidWYpOwogIH0KCiAgaW50IGdldCBvZmZzZXQgPT4gX2J1ZmZlcnNMZW5ndGggKyBfY3VycmVudExlbmd0aDsKCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBfYWRkQnl0ZShpbnQgdmFsdWUpIHsKICAgIGFzc2VydCgodmFsdWUgPj4gOCkgPT0gMCk7CiAgICBfY3VycmVudEJ1ZmZlcltfY3VycmVudExlbmd0aF0gPSB2YWx1ZTsKICAgICsrX2N1cnJlbnRMZW5ndGg7CiAgfQoKICB2b2lkIF9mbHVzaEJ1ZmZlcihVaW50OExpc3QgYnVmLCBpbnQgbGVuKSB7CiAgICBfYnVmZmVycyA/Pz0gPGR5bmFtaWM+W107CiAgICBfYnVmZmVycy5hZGQoYnVmKTsKICAgIF9idWZmZXJzLmFkZChsZW4pOwogICAgX2J1ZmZlcnNMZW5ndGggKz0gbGVuOwogIH0KCiAgdm9pZCBfZmx1c2hDdXJyZW50QnVmZmVyKCkgewogICAgX2ZsdXNoQnVmZmVyKF9jdXJyZW50QnVmZmVyLCBfY3VycmVudExlbmd0aCk7CiAgICBfY3VycmVudEJ1ZmZlciA9IG51bGw7CiAgICBfY3VycmVudExlbmd0aCA9IDA7CiAgfQoKICBAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQogIHZvaWQgX2dyb3coKSB7CiAgICBfZmx1c2hDdXJyZW50QnVmZmVyKCk7CiAgICAvLyBDYWxsZXJzIG9mIF9ncm93KCkgZXhwZWN0IHVwIHRvIGF2b2lkQ29weWluZ1NpemUgYnl0ZXMgdG8gYmUgYXZhaWxhYmxlLgogICAgYXNzZXJ0KF9uZXh0QnVmZmVyU2l6ZSA+PSBhdm9pZENvcHlpbmdTaXplKTsKICAgIF9jdXJyZW50QnVmZmVyID0gbmV3IFVpbnQ4TGlzdChfbmV4dEJ1ZmZlclNpemUpOwogICAgX25leHRCdWZmZXJTaXplID0gX25leHRCdWZmZXJTaXplIDw8IDE7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIHdyaXRlQnl0ZShpbnQgdmFsdWUpIHsKICAgIGlmIChfY3VycmVudExlbmd0aCA9PSBfY3VycmVudEJ1ZmZlci5sZW5ndGgpIHsKICAgICAgX2dyb3coKTsKICAgIH0KICAgIF9hZGRCeXRlKHZhbHVlKTsKICB9CgogIHZvaWQgYXBwZW5kVWludDhMaXN0KFVpbnQ4TGlzdCBzcmMpIHsKICAgIGlmIChzcmMubGVuZ3RoIDwgYXZvaWRDb3B5aW5nU2l6ZSkgewogICAgICBpZiAoX2N1cnJlbnRMZW5ndGggPiBfY3VycmVudEJ1ZmZlci5sZW5ndGggLSBzcmMubGVuZ3RoKSB7CiAgICAgICAgX2dyb3coKTsKICAgICAgfQogICAgICBfY3VycmVudEJ1ZmZlci5zZXRSYW5nZShfY3VycmVudExlbmd0aCwgX2N1cnJlbnRMZW5ndGggKyBzcmMubGVuZ3RoLCBzcmMpOwogICAgICBfY3VycmVudExlbmd0aCArPSBzcmMubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IHJlbWFpbmluZ0J5dGVzID0gX2N1cnJlbnRCdWZmZXIubGVuZ3RoIC0gX2N1cnJlbnRMZW5ndGg7CiAgICAgIGlmIChyZW1haW5pbmdCeXRlcyA+PSBtaW5SZW1haW5kZXJUb0tlZXApIHsKICAgICAgICBmaW5hbCBVaW50OExpc3QgcmVtYWluZGVyID0gbmV3IFVpbnQ4TGlzdC52aWV3KF9jdXJyZW50QnVmZmVyLmJ1ZmZlciwKICAgICAgICAgICAgX2N1cnJlbnRCdWZmZXIub2Zmc2V0SW5CeXRlcyArIF9jdXJyZW50TGVuZ3RoLCByZW1haW5pbmdCeXRlcyk7CiAgICAgICAgX2ZsdXNoQ3VycmVudEJ1ZmZlcigpOwogICAgICAgIF9mbHVzaEJ1ZmZlcihzcmMsIHNyYy5sZW5ndGgpOwogICAgICAgIF9jdXJyZW50QnVmZmVyID0gcmVtYWluZGVyOwogICAgICAgIF9jdXJyZW50TGVuZ3RoID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBfZmx1c2hDdXJyZW50QnVmZmVyKCk7CiAgICAgICAgX2N1cnJlbnRCdWZmZXIgPSBzcmM7CiAgICAgICAgX2N1cnJlbnRMZW5ndGggPSBzcmMubGVuZ3RoOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFwcGVuZFdyaXRlcihCdWZmZXJlZFdyaXRlciBvdGhlcikgewogICAgZmluYWwgaW50IHJlbWFpbmluZ0J5dGVzID0gX2N1cnJlbnRCdWZmZXIubGVuZ3RoIC0gX2N1cnJlbnRMZW5ndGg7CiAgICBVaW50OExpc3QgcmVtYWluZGVyOwogICAgaWYgKHJlbWFpbmluZ0J5dGVzID49IG1pblJlbWFpbmRlclRvS2VlcCAmJgogICAgICAgIHJlbWFpbmluZ0J5dGVzID4gKG90aGVyLl9jdXJyZW50QnVmZmVyLmxlbmd0aCAtIG90aGVyLl9jdXJyZW50TGVuZ3RoKSkgewogICAgICByZW1haW5kZXIgPSBuZXcgVWludDhMaXN0LnZpZXcoX2N1cnJlbnRCdWZmZXIuYnVmZmVyLAogICAgICAgICAgX2N1cnJlbnRCdWZmZXIub2Zmc2V0SW5CeXRlcyArIF9jdXJyZW50TGVuZ3RoLCByZW1haW5pbmdCeXRlcyk7CiAgICB9CiAgICBfZmx1c2hDdXJyZW50QnVmZmVyKCk7CiAgICBpZiAob3RoZXIuX2J1ZmZlcnMgIT0gbnVsbCkgewogICAgICBfYnVmZmVycy5hZGRBbGwob3RoZXIuX2J1ZmZlcnMpOwogICAgICBfYnVmZmVyc0xlbmd0aCArPSBvdGhlci5fYnVmZmVyc0xlbmd0aDsKICAgIH0KICAgIGlmIChyZW1haW5kZXIgIT0gbnVsbCkgewogICAgICBfZmx1c2hCdWZmZXIob3RoZXIuX2N1cnJlbnRCdWZmZXIsIG90aGVyLl9jdXJyZW50TGVuZ3RoKTsKICAgICAgX2N1cnJlbnRCdWZmZXIgPSByZW1haW5kZXI7CiAgICAgIF9jdXJyZW50TGVuZ3RoID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIF9jdXJyZW50QnVmZmVyID0gb3RoZXIuX2N1cnJlbnRCdWZmZXI7CiAgICAgIF9jdXJyZW50TGVuZ3RoID0gb3RoZXIuX2N1cnJlbnRMZW5ndGg7CiAgICB9CiAgICAvLyBSZXNldCBbb3RoZXJdIHRvIG1ha2Ugc3VyZSBpdCBpcyBubyBsb25nZXIgdXNlZC4KICAgIG90aGVyLl9idWZmZXJzID0gbnVsbDsKICAgIG90aGVyLl9idWZmZXJzTGVuZ3RoID0gMDsKICAgIG90aGVyLl9jdXJyZW50QnVmZmVyID0gbnVsbDsKICAgIG90aGVyLl9jdXJyZW50TGVuZ3RoID0gMDsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgd3JpdGVVSW50MzIoaW50IHZhbHVlKSB7CiAgICBpZiAoKHZhbHVlID4+IDMyKSAhPSAwKSB7CiAgICAgIHRocm93ICdVbmFibGUgdG8gd3JpdGUgJHZhbHVlIGFzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyJzsKICAgIH0KICAgIGlmIChfY3VycmVudExlbmd0aCA+IF9jdXJyZW50QnVmZmVyLmxlbmd0aCAtIDQpIHsKICAgICAgX2dyb3coKTsKICAgIH0KICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGNvbnNpZGVyIHVzaW5nIG5hdGl2ZSBieXRlIG9yZGVyCiAgICBfYWRkQnl0ZSgodmFsdWUgPj4gMjQpICYgMHhGRik7CiAgICBfYWRkQnl0ZSgodmFsdWUgPj4gMTYpICYgMHhGRik7CiAgICBfYWRkQnl0ZSgodmFsdWUgPj4gOCkgJiAweEZGKTsKICAgIF9hZGRCeXRlKHZhbHVlICYgMHhGRik7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIHdyaXRlUGFja2VkVUludDMwKGludCB2YWx1ZSkgewogICAgaWYgKCh2YWx1ZSA+PiAzMCkgIT0gMCkgewogICAgICB0aHJvdyAnVW5hYmxlIHRvIHdyaXRlICR2YWx1ZSBhcyAzMC1iaXQgdW5zaWduZWQgaW50ZWdlcic7CiAgICB9CiAgICBpZiAodmFsdWUgPCAweDgwKSB7CiAgICAgIHdyaXRlQnl0ZSh2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMHg0MDAwKSB7CiAgICAgIGlmIChfY3VycmVudExlbmd0aCA+IF9jdXJyZW50QnVmZmVyLmxlbmd0aCAtIDIpIHsKICAgICAgICBfZ3JvdygpOwogICAgICB9CiAgICAgIF9hZGRCeXRlKCh2YWx1ZSA+PiA4KSB8IDB4ODApOwogICAgICBfYWRkQnl0ZSh2YWx1ZSAmIDB4RkYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9jdXJyZW50TGVuZ3RoID4gX2N1cnJlbnRCdWZmZXIubGVuZ3RoIC0gNCkgewogICAgICAgIF9ncm93KCk7CiAgICAgIH0KICAgICAgX2FkZEJ5dGUoKHZhbHVlID4+IDI0KSB8IDB4QzApOwogICAgICBfYWRkQnl0ZSgodmFsdWUgPj4gMTYpICYgMHhGRik7CiAgICAgIF9hZGRCeXRlKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwogICAgICBfYWRkQnl0ZSh2YWx1ZSAmIDB4RkYpOwogICAgfQogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCB3cml0ZVNMRUIxMjgoaW50IHZhbHVlKSB7CiAgICBib29sIGxhc3QgPSBmYWxzZTsKICAgIGRvIHsKICAgICAgaW50IHBhcnQgPSB2YWx1ZSAmIDB4N2Y7CiAgICAgIHZhbHVlID4+PSA3OwogICAgICBpZiAoKHZhbHVlID09IDAgJiYgKHBhcnQgJiAweDQwKSA9PSAwKSB8fAogICAgICAgICAgKHZhbHVlID09IC0xICYmIChwYXJ0ICYgMHg0MCkgIT0gMCkpIHsKICAgICAgICBsYXN0ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJ0IHw9IDB4ODA7CiAgICAgIH0KICAgICAgd3JpdGVCeXRlKHBhcnQpOwogICAgfSB3aGlsZSAoIWxhc3QpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCB3cml0ZVBhY2tlZFN0cmluZ1JlZmVyZW5jZShTdHJpbmcgdmFsdWUpIHsKICAgIHdyaXRlUGFja2VkVUludDMwKHN0cmluZ1dyaXRlci5wdXQodmFsdWUpKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgd3JpdGVQYWNrZWRPYmplY3QoQnl0ZWNvZGVPYmplY3Qgb2JqZWN0KSB7CiAgICBvYmplY3RXcml0ZXIud3JpdGVPYmplY3Qob2JqZWN0LCB0aGlzKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgd3JpdGVQYWNrZWRMaXN0KExpc3Q8Qnl0ZWNvZGVPYmplY3Q+IG9iamVjdHMpIHsKICAgIHdyaXRlUGFja2VkVUludDMwKG9iamVjdHMubGVuZ3RoKTsKICAgIGZvciAodmFyIG9iaiBpbiBvYmplY3RzKSB7CiAgICAgIHdyaXRlUGFja2VkT2JqZWN0KG9iaik7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIHdyaXRlTGlua09mZnNldChPYmplY3QgdGFyZ2V0KSB7CiAgICBmaW5hbCBvZmZzZXQgPSBsaW5rV3JpdGVyLmdldE9mZnNldCh0YXJnZXQpOwogICAgd3JpdGVQYWNrZWRVSW50MzAob2Zmc2V0KTsKICB9Cn0KCmNsYXNzIEJ1ZmZlcmVkUmVhZGVyIHsKICBpbnQgZm9ybWF0VmVyc2lvbjsKICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyOwogIE9iamVjdFJlYWRlciBvYmplY3RSZWFkZXI7CiAgTGlua1JlYWRlciBsaW5rUmVhZGVyOwogIGZpbmFsIExpc3Q8aW50PiBieXRlczsKICBmaW5hbCBpbnQgYmFzZU9mZnNldDsKCiAgLy8vIFBvc2l0aW9uIHdpdGhpbiBbYnl0ZXNdLCBhbHJlYWR5IGluY2x1ZGVzIFtiYXNlT2Zmc2V0XS4KICBpbnQgX3BvczsKCiAgQnVmZmVyZWRSZWFkZXIodGhpcy5mb3JtYXRWZXJzaW9uLCB0aGlzLnN0cmluZ1JlYWRlciwgdGhpcy5vYmplY3RSZWFkZXIsCiAgICAgIHRoaXMubGlua1JlYWRlciwgdGhpcy5ieXRlcywKICAgICAge3RoaXMuYmFzZU9mZnNldDogMH0pCiAgICAgIDogX3BvcyA9IGJhc2VPZmZzZXQgewogICAgYXNzZXJ0KCgwIDw9IF9wb3MpICYmIChfcG9zIDw9IGJ5dGVzLmxlbmd0aCkpOwogIH0KCiAgaW50IGdldCBvZmZzZXQgPT4gX3BvcyAtIGJhc2VPZmZzZXQ7CgogIHNldCBvZmZzZXQoaW50IG9mZnMpIHsKICAgIF9wb3MgPSBiYXNlT2Zmc2V0ICsgb2ZmczsKICAgIGFzc2VydCgoMCA8PSBfcG9zKSAmJiAoX3BvcyA8PSBieXRlcy5sZW5ndGgpKTsKICB9CgogIGludCByZWFkQnl0ZSgpID0+IGJ5dGVzW19wb3MrK107CgogIGludCByZWFkVUludDMyKCkgewogICAgcmV0dXJuIChyZWFkQnl0ZSgpIDw8IDI0KSB8CiAgICAgICAgKHJlYWRCeXRlKCkgPDwgMTYpIHwKICAgICAgICAocmVhZEJ5dGUoKSA8PCA4KSB8CiAgICAgICAgcmVhZEJ5dGUoKTsKICB9CgogIGludCByZWFkUGFja2VkVUludDMwKCkgewogICAgdmFyIGJ5dGUgPSByZWFkQnl0ZSgpOwogICAgaWYgKGJ5dGUgJiAweDgwID09IDApIHsKICAgICAgLy8gMHh4eHh4eHgKICAgICAgcmV0dXJuIGJ5dGU7CiAgICB9IGVsc2UgaWYgKGJ5dGUgJiAweDQwID09IDApIHsKICAgICAgLy8gMTB4eHh4eHgKICAgICAgcmV0dXJuICgoYnl0ZSAmIDB4M0YpIDw8IDgpIHwgcmVhZEJ5dGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIDExeHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCAyNCkgfAogICAgICAgICAgKHJlYWRCeXRlKCkgPDwgMTYpIHwKICAgICAgICAgIChyZWFkQnl0ZSgpIDw8IDgpIHwKICAgICAgICAgIHJlYWRCeXRlKCk7CiAgICB9CiAgfQoKICBpbnQgcmVhZFNMRUIxMjgoKSB7CiAgICBpbnQgdmFsdWUgPSAwOwogICAgaW50IHNoaWZ0ID0gMDsKICAgIGludCBwYXJ0ID0gMDsKICAgIGRvIHsKICAgICAgcGFydCA9IHJlYWRCeXRlKCk7CiAgICAgIHZhbHVlIHw9IChwYXJ0ICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgIHNoaWZ0ICs9IDc7CiAgICB9IHdoaWxlICgocGFydCAmIDB4ODApICE9IDApOwogICAgY29uc3QgaW50IGtCaXRzUGVySW50ID0gNjQ7CiAgICBpZiAoKHNoaWZ0IDwga0JpdHNQZXJJbnQpICYmICgocGFydCAmIDB4NDApICE9IDApKSB7CiAgICAgIHZhbHVlIHw9ICgtMSkgPDwgc2hpZnQ7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBTdHJpbmcgcmVhZFBhY2tlZFN0cmluZ1JlZmVyZW5jZSgpIHsKICAgIHJldHVybiBzdHJpbmdSZWFkZXIuZ2V0KHJlYWRQYWNrZWRVSW50MzAoKSk7CiAgfQoKICBCeXRlY29kZU9iamVjdCByZWFkUGFja2VkT2JqZWN0KCkgewogICAgcmV0dXJuIG9iamVjdFJlYWRlci5yZWFkT2JqZWN0KHRoaXMpOwogIH0KCiAgTGlzdDxUPiByZWFkUGFja2VkTGlzdDxUIGV4dGVuZHMgQnl0ZWNvZGVPYmplY3Q+KCkgewogICAgZmluYWwgaW50IGxlbiA9IHJlYWRQYWNrZWRVSW50MzAoKTsKICAgIGZpbmFsIGxpc3QgPSBuZXcgTGlzdDxUPihsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBsaXN0W2ldID0gcmVhZFBhY2tlZE9iamVjdCgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBVaW50OExpc3QgcmVhZEJ5dGVzQXNVaW50OExpc3QoaW50IGNvdW50KSB7CiAgICBmaW5hbCBVaW50OExpc3QgcmVzdWx0ID0gbmV3IFVpbnQ4TGlzdChjb3VudCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgcmVzdWx0Lmxlbmd0aCwgYnl0ZXMsIF9wb3MpOwogICAgX3BvcyArPSBjb3VudDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBVaW50MTZMaXN0IHJlYWRCeXRlc0FzVWludDE2TGlzdChpbnQgY291bnQpIHsKICAgIGZpbmFsIFVpbnQxNkxpc3QgcmVzdWx0ID0gbmV3IFVpbnQxNkxpc3QoY291bnQpOwogICAgaW50IHBvcyA9IF9wb3M7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gYnl0ZXNbcG9zXSB8IChieXRlc1twb3MgKyAxXSA8PCA4KTsKICAgICAgcG9zICs9IDI7CiAgICB9CiAgICBfcG9zICs9IGNvdW50IDw8IDE7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVCByZWFkTGlua09mZnNldDxUIGV4dGVuZHMgQnl0ZWNvZGVEZWNsYXJhdGlvbj4oKSB7CiAgICBmaW5hbCBvZmZzZXQgPSByZWFkUGFja2VkVUludDMwKCk7CiAgICByZXR1cm4gbGlua1JlYWRlci5nZXQ8VD4ob2Zmc2V0KTsKICB9CgogIEZvcndhcmRSZWZlcmVuY2U8VD4KICAgICAgcmVhZExpbmtPZmZzZXRBc0ZvcndhcmRSZWZlcmVuY2U8VCBleHRlbmRzIEJ5dGVjb2RlRGVjbGFyYXRpb24+KCkgewogICAgZmluYWwgb2Zmc2V0ID0gcmVhZFBhY2tlZFVJbnQzMCgpOwogICAgcmV0dXJuIG5ldyBGb3J3YXJkUmVmZXJlbmNlPFQ+KG9mZnNldCwgbGlua1JlYWRlcik7CiAgfQoKICB2b2lkIGFsaWduKGludCBhbGlnbm1lbnQpIHsKICAgIGFzc2VydChhbGlnbm1lbnQgJiAoYWxpZ25tZW50IC0gMSkgPT0gMCk7CiAgICBfcG9zID0gKChfcG9zICsgYWxpZ25tZW50IC0gMSkgJiAtYWxpZ25tZW50KTsKICB9Cn0KCmNsYXNzIFN0cmluZ1RhYmxlIGltcGxlbWVudHMgU3RyaW5nV3JpdGVyLCBTdHJpbmdSZWFkZXIgewogIC8vIEJpdCAwIGluIHN0cmluZyByZWZlcmVuY2UgaXMgc2V0IGZvciB0d28tYnl0ZSBzdHJpbmdzLgogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ1R3b0J5dGVTdHJpbmcgPSAxOwoKICBNYXA8U3RyaW5nLCBpbnQ+IF9tYXAgPSA8U3RyaW5nLCBpbnQ+e307CiAgTGlzdDxTdHJpbmc+IF9vbmVCeXRlU3RyaW5ncyA9IDxTdHJpbmc+W107CiAgTGlzdDxTdHJpbmc+IF90d29CeXRlU3RyaW5ncyA9IDxTdHJpbmc+W107CiAgYm9vbCBfd3JpdHRlbiA9IGZhbHNlOwoKICBTdHJpbmdUYWJsZSgpOwoKICBAb3ZlcnJpZGUKICBpbnQgcHV0KFN0cmluZyBzdHJpbmcpIHsKICAgIGludCByZWYgPSBfbWFwW3N0cmluZ107CiAgICBpZiAocmVmID09IG51bGwpIHsKICAgICAgaWYgKF93cml0dGVuKSB7CiAgICAgICAgdGhyb3cgJ1VuYWJsZSB0byBhZGQgYSBzdHJpbmcgdG8gc3RyaW5nIHRhYmxlIGFmdGVyIGl0IHdhcyB3cml0dGVuJzsKICAgICAgfQogICAgICBpZiAoaXNPbmVCeXRlU3RyaW5nKHN0cmluZykpIHsKICAgICAgICByZWYgPSAoX29uZUJ5dGVTdHJpbmdzLmxlbmd0aCA8PCAxKTsKICAgICAgICBfb25lQnl0ZVN0cmluZ3MuYWRkKHN0cmluZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVmID0gKF90d29CeXRlU3RyaW5ncy5sZW5ndGggPDwgMSkgfCBmbGFnVHdvQnl0ZVN0cmluZzsKICAgICAgICBfdHdvQnl0ZVN0cmluZ3MuYWRkKHN0cmluZyk7CiAgICAgIH0KICAgICAgX21hcFtzdHJpbmddID0gcmVmOwogICAgfQogICAgcmV0dXJuIHJlZjsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQoaW50IHJlZikgewogICAgaWYgKChyZWYgJiBmbGFnVHdvQnl0ZVN0cmluZykgPT0gMCkgewogICAgICByZXR1cm4gX29uZUJ5dGVTdHJpbmdzW3JlZiA+PiAxXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfdHdvQnl0ZVN0cmluZ3NbcmVmID4+IDFdOwogICAgfQogIH0KCiAgYm9vbCBpc09uZUJ5dGVTdHJpbmcoU3RyaW5nIHZhbHVlKSB7CiAgICBjb25zdCBpbnQgbWF4TGF0aW4xID0gMHhmZjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHZhbHVlLmNvZGVVbml0QXQoaSkgPiBtYXhMYXRpbjEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIGZpbmFsIHN0YXJ0ID0gd3JpdGVyLm9mZnNldDsKICAgIHdyaXRlci53cml0ZVVJbnQzMihfb25lQnl0ZVN0cmluZ3MubGVuZ3RoKTsKICAgIHdyaXRlci53cml0ZVVJbnQzMihfdHdvQnl0ZVN0cmluZ3MubGVuZ3RoKTsKICAgIGludCBlbmRPZmZzZXQgPSAwOwogICAgZm9yICh2YXIgc3RyIGluIF9vbmVCeXRlU3RyaW5ncykgewogICAgICBlbmRPZmZzZXQgKz0gc3RyLmxlbmd0aDsKICAgICAgd3JpdGVyLndyaXRlVUludDMyKGVuZE9mZnNldCk7CiAgICB9CiAgICBmb3IgKHZhciBzdHIgaW4gX3R3b0J5dGVTdHJpbmdzKSB7CiAgICAgIGVuZE9mZnNldCArPSBzdHIubGVuZ3RoIDw8IDE7CiAgICAgIHdyaXRlci53cml0ZVVJbnQzMihlbmRPZmZzZXQpOwogICAgfQogICAgZm9yICh2YXIgc3RyIGluIF9vbmVCeXRlU3RyaW5ncykgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgIHdyaXRlci53cml0ZUJ5dGUoc3RyLmNvZGVVbml0QXQoaSkpOwogICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBzdHIgaW4gX3R3b0J5dGVTdHJpbmdzKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaW50IHV0ZjE2Y29kZVVuaXQgPSBzdHIuY29kZVVuaXRBdChpKTsKICAgICAgICB3cml0ZXIud3JpdGVCeXRlKHV0ZjE2Y29kZVVuaXQgJiAweEZGKTsKICAgICAgICB3cml0ZXIud3JpdGVCeXRlKHV0ZjE2Y29kZVVuaXQgPj4gOCk7CiAgICAgIH0KICAgIH0KICAgIF93cml0dGVuID0gdHJ1ZTsKICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3Muc3RyaW5nVGFibGVTaXplICs9ICh3cml0ZXIub2Zmc2V0IC0gc3RhcnQpOwogIH0KCiAgU3RyaW5nVGFibGUucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIGludCBudW1PbmVCeXRlU3RyaW5ncyA9IHJlYWRlci5yZWFkVUludDMyKCk7CiAgICBmaW5hbCBpbnQgbnVtVHdvQnl0ZVN0cmluZ3MgPSByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgTGlzdDxpbnQ+IG9uZUJ5dGVFbmRPZmZzZXRzID0gbmV3IExpc3Q8aW50PihudW1PbmVCeXRlU3RyaW5ncyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG9uZUJ5dGVFbmRPZmZzZXRzLmxlbmd0aDsgKytpKSB7CiAgICAgIG9uZUJ5dGVFbmRPZmZzZXRzW2ldID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIH0KICAgIExpc3Q8aW50PiB0d29CeXRlRW5kT2Zmc2V0cyA9IG5ldyBMaXN0PGludD4obnVtVHdvQnl0ZVN0cmluZ3MpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0d29CeXRlRW5kT2Zmc2V0cy5sZW5ndGg7ICsraSkgewogICAgICB0d29CeXRlRW5kT2Zmc2V0c1tpXSA9IHJlYWRlci5yZWFkVUludDMyKCk7CiAgICB9CiAgICBpbnQgc3RhcnQgPSAwOwogICAgaWYgKG51bU9uZUJ5dGVTdHJpbmdzID4gMCkgewogICAgICBfb25lQnl0ZVN0cmluZ3MgPSBuZXcgTGlzdDxTdHJpbmc+KG51bU9uZUJ5dGVTdHJpbmdzKTsKICAgICAgZmluYWwgY2hhckNvZGVzID0gcmVhZGVyLnJlYWRCeXRlc0FzVWludDhMaXN0KG9uZUJ5dGVFbmRPZmZzZXRzLmxhc3QpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9vbmVCeXRlU3RyaW5ncy5sZW5ndGg7ICsraSkgewogICAgICAgIGZpbmFsIGVuZCA9IG9uZUJ5dGVFbmRPZmZzZXRzW2ldOwogICAgICAgIGZpbmFsIHN0ciA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhjaGFyQ29kZXMsIHN0YXJ0LCBlbmQpOwogICAgICAgIF9vbmVCeXRlU3RyaW5nc1tpXSA9IHN0cjsKICAgICAgICBfbWFwW3N0cl0gPSBpIDw8IDE7CiAgICAgICAgc3RhcnQgPSBlbmQ7CiAgICAgIH0KICAgIH0KICAgIGZpbmFsIGludCB0d29CeXRlQmFzZU9mZnNldCA9IHN0YXJ0OwogICAgaWYgKG51bVR3b0J5dGVTdHJpbmdzID4gMCkgewogICAgICBpbnQgc3RhcnQgPSAwOwogICAgICBfdHdvQnl0ZVN0cmluZ3MgPSBuZXcgTGlzdDxTdHJpbmc+KG51bVR3b0J5dGVTdHJpbmdzKTsKICAgICAgZmluYWwgY2hhckNvZGVzID0gcmVhZGVyLnJlYWRCeXRlc0FzVWludDE2TGlzdCgKICAgICAgICAgICh0d29CeXRlRW5kT2Zmc2V0cy5sYXN0IC0gdHdvQnl0ZUJhc2VPZmZzZXQpID4+IDEpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IF90d29CeXRlU3RyaW5ncy5sZW5ndGg7ICsraSkgewogICAgICAgIGZpbmFsIGVuZCA9ICh0d29CeXRlRW5kT2Zmc2V0c1tpXSAtIHR3b0J5dGVCYXNlT2Zmc2V0KSA+PiAxOwogICAgICAgIGZpbmFsIHN0ciA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhjaGFyQ29kZXMsIHN0YXJ0LCBlbmQpOwogICAgICAgIF90d29CeXRlU3RyaW5nc1tpXSA9IHN0cjsKICAgICAgICBfbWFwW3N0cl0gPSAoaSA8PCAxKSB8IGZsYWdUd29CeXRlU3RyaW5nOwogICAgICAgIHN0YXJ0ID0gZW5kOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZWxuKCdTdHJpbmdUYWJsZSB7Jyk7CiAgICBzYi53cml0ZWxuKCcgIC8vIE9uZSBCeXRlIFN0cmluZ3MnKTsKICAgIGZvciAoU3RyaW5nIHN0ciBpbiBfb25lQnl0ZVN0cmluZ3MpIHsKICAgICAgc2Iud3JpdGVsbignICAiJHN0ciInKTsKICAgIH0KICAgIHNiLndyaXRlbG4oJyAgLy8gVHdvIEJ5dGUgU3RyaW5ncycpOwogICAgZm9yIChTdHJpbmcgc3RyIGluIF90d29CeXRlU3RyaW5ncykgewogICAgICBzYi53cml0ZWxuKCcgICIkc3RyIicpOwogICAgfQogICAgc2Iud3JpdGVsbignfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgppbnQgZG91YmxlVG9JbnRCaXRzKGRvdWJsZSB2YWx1ZSkgewogIGZpbmFsIGJ1ZiA9IG5ldyBCeXRlRGF0YSg4KTsKICBidWYuc2V0RmxvYXQ2NCgwLCB2YWx1ZSwgRW5kaWFuLmxpdHRsZSk7CiAgcmV0dXJuIGJ1Zi5nZXRJbnQ2NCgwLCBFbmRpYW4ubGl0dGxlKTsKfQoKZG91YmxlIGludEJpdHNUb0RvdWJsZShpbnQgYml0cykgewogIGZpbmFsIGJ1ZiA9IG5ldyBCeXRlRGF0YSg4KTsKICBidWYuc2V0SW50NjQoMCwgYml0cywgRW5kaWFuLmxpdHRsZSk7CiAgcmV0dXJuIGJ1Zi5nZXRGbG9hdDY0KDAsIEVuZGlhbi5saXR0bGUpOwp9CgpjbGFzcyBQYWNrZWRVSW50MzBEZWx0YUVuY29kZXIgewogIGludCBfbGFzdCA9IDA7CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGUsIGludCB2YWx1ZSkgewogICAgd3JpdGUud3JpdGVQYWNrZWRVSW50MzAodmFsdWUgLSBfbGFzdCk7CiAgICBfbGFzdCA9IHZhbHVlOwogIH0KfQoKY2xhc3MgUGFja2VkVUludDMwRGVsdGFEZWNvZGVyIHsKICBpbnQgX2xhc3QgPSAwOwoKICBpbnQgcmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGludCB2YWx1ZSA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgKyBfbGFzdDsKICAgIF9sYXN0ID0gdmFsdWU7CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9CgpjbGFzcyBTTEVCMTI4RGVsdGFFbmNvZGVyIHsKICBpbnQgX2xhc3QgPSAwOwoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciwgaW50IHZhbHVlKSB7CiAgICB3cml0ZXIud3JpdGVTTEVCMTI4KHZhbHVlIC0gX2xhc3QpOwogICAgX2xhc3QgPSB2YWx1ZTsKICB9Cn0KCmNsYXNzIFNMRUIxMjhEZWx0YURlY29kZXIgewogIGludCBfbGFzdCA9IDA7CgogIGludCByZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgaW50IHZhbHVlID0gcmVhZGVyLnJlYWRTTEVCMTI4KCkgKyBfbGFzdDsKICAgIF9sYXN0ID0gdmFsdWU7CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9CgpjbGFzcyBCeXRlY29kZURlY2xhcmF0aW9uIHsKICBpbnQgX29mZnNldDsKfQoKY2xhc3MgTGlua1dyaXRlciB7CiAgdm9pZCBwdXQoQnl0ZWNvZGVEZWNsYXJhdGlvbiB0YXJnZXQsIGludCBvZmZzZXQpIHsKICAgIHRhcmdldC5fb2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgaW50IGdldE9mZnNldChCeXRlY29kZURlY2xhcmF0aW9uIHRhcmdldCkgewogICAgcmV0dXJuIHRhcmdldC5fb2Zmc2V0ID8/CiAgICAgICAgKHRocm93ICdPZmZzZXQgb2YgJHt0YXJnZXQucnVudGltZVR5cGV9ICR0YXJnZXQgaXMgbm90IHNldCcpOwogIH0KfQoKY2xhc3MgTGlua1JlYWRlciB7CiAgZmluYWwgX21hcCA9IDxUeXBlLCBNYXA8aW50LCBCeXRlY29kZURlY2xhcmF0aW9uPj57fTsKCiAgdm9pZCBzZXRPZmZzZXQ8VCBleHRlbmRzIEJ5dGVjb2RlRGVjbGFyYXRpb24+KFQgdGFyZ2V0LCBpbnQgb2Zmc2V0KSB7CiAgICBmaW5hbCBvZmZzZXRUb09iamVjdCA9IChfbWFwW1RdID8/PSA8aW50LCBCeXRlY29kZURlY2xhcmF0aW9uPnt9KTsKICAgIGZpbmFsIHByZXZpb3VzID0gb2Zmc2V0VG9PYmplY3Rbb2Zmc2V0XTsKICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CiAgICAgIHRocm93ICdVbmFibGUgdG8gYXNzb2NpYXRlIG9mZnNldCAkVC8kb2Zmc2V0IHdpdGggJHt0YXJnZXQucnVudGltZVR5cGV9ICR0YXJnZXQuJwogICAgICAgICAgJyBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCAke3ByZXZpb3VzLnJ1bnRpbWVUeXBlfSAkcHJldmlvdXMnOwogICAgfQogICAgb2Zmc2V0VG9PYmplY3Rbb2Zmc2V0XSA9IHRhcmdldDsKICB9CgogIFQgZ2V0PFQgZXh0ZW5kcyBCeXRlY29kZURlY2xhcmF0aW9uPihpbnQgb2Zmc2V0KSB7CiAgICByZXR1cm4gX21hcFtUXVtvZmZzZXRdID8/ICh0aHJvdyAnTm8gb2JqZWN0IGF0IG9mZnNldCAkVC8kb2Zmc2V0Jyk7CiAgfQp9CgovLyBQbGFjZWhvbGRlciBmb3IgYW4gb2JqZWN0IHdoaWNoIHdpbGwgYmUgcmVhZCBpbiBmdXR1cmUuCmNsYXNzIEZvcndhcmRSZWZlcmVuY2U8VCBleHRlbmRzIEJ5dGVjb2RlRGVjbGFyYXRpb24+IHsKICBmaW5hbCBpbnQgb2Zmc2V0OwogIGZpbmFsIExpbmtSZWFkZXIgbGlua1JlYWRlcjsKCiAgRm9yd2FyZFJlZmVyZW5jZSh0aGlzLm9mZnNldCwgdGhpcy5saW5rUmVhZGVyKTsKCiAgVCBnZXQoKSA9PiBsaW5rUmVhZGVyLmdldDxUPihvZmZzZXQpOwp9CgpjbGFzcyBOYW1lZEVudHJ5U3RhdGlzdGljcyB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgaW50IHNpemUgPSAwOwogIGludCBjb3VudCA9IDA7CgogIE5hbWVkRW50cnlTdGF0aXN0aWNzKHRoaXMubmFtZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIke25hbWUucGFkUmlnaHQoNDApfTogICAgJHtzaXplLnRvU3RyaW5nKCkucGFkTGVmdCgxMCl9IgogICAgICAiICAoY291bnQ6ICR7Y291bnQudG9TdHJpbmcoKS5wYWRMZWZ0KDgpfSkiOwp9CgpjbGFzcyBCeXRlY29kZVNpemVTdGF0aXN0aWNzIHsKICBzdGF0aWMgaW50IGNvbXBvbmVudFNpemUgPSAwOwogIHN0YXRpYyBpbnQgb2JqZWN0VGFibGVTaXplID0gMDsKICBzdGF0aWMgaW50IG9iamVjdFRhYmxlRW50cmllc0NvdW50ID0gMDsKICBzdGF0aWMgaW50IHN0cmluZ1RhYmxlU2l6ZSA9IDA7CiAgc3RhdGljIGludCBsaWJyYXJpZXNTaXplID0gMDsKICBzdGF0aWMgaW50IGNsYXNzZXNTaXplID0gMDsKICBzdGF0aWMgaW50IG1lbWJlcnNTaXplID0gMDsKICBzdGF0aWMgaW50IGNvZGVTaXplID0gMDsKICBzdGF0aWMgaW50IHNvdXJjZVBvc2l0aW9uc1NpemUgPSAwOwogIHN0YXRpYyBpbnQgc291cmNlRmlsZXNTaXplID0gMDsKICBzdGF0aWMgaW50IGxpbmVTdGFydHNTaXplID0gMDsKICBzdGF0aWMgaW50IGxvY2FsVmFyaWFibGVzU2l6ZSA9IDA7CiAgc3RhdGljIGludCBhbm5vdGF0aW9uc1NpemUgPSAwOwogIHN0YXRpYyBpbnQgY29uc3RhbnRQb29sU2l6ZSA9IDA7CiAgc3RhdGljIGludCBpbnN0cnVjdGlvbnNTaXplID0gMDsKICBzdGF0aWMgTGlzdDxOYW1lZEVudHJ5U3RhdGlzdGljcz4gY29uc3RhbnRQb29sU3RhdHMgPQogICAgICA8TmFtZWRFbnRyeVN0YXRpc3RpY3M+W107CiAgc3RhdGljIExpc3Q8TmFtZWRFbnRyeVN0YXRpc3RpY3M+IG9iamVjdFRhYmxlU3RhdHMgPSA8TmFtZWRFbnRyeVN0YXRpc3RpY3M+W107CgogIHN0YXRpYyB2b2lkIHJlc2V0KCkgewogICAgY29tcG9uZW50U2l6ZSA9IDA7CiAgICBvYmplY3RUYWJsZVNpemUgPSAwOwogICAgb2JqZWN0VGFibGVFbnRyaWVzQ291bnQgPSAwOwogICAgc3RyaW5nVGFibGVTaXplID0gMDsKICAgIGxpYnJhcmllc1NpemUgPSAwOwogICAgY2xhc3Nlc1NpemUgPSAwOwogICAgbWVtYmVyc1NpemUgPSAwOwogICAgY29kZVNpemUgPSAwOwogICAgc291cmNlUG9zaXRpb25zU2l6ZSA9IDA7CiAgICBzb3VyY2VGaWxlc1NpemUgPSAwOwogICAgbGluZVN0YXJ0c1NpemUgPSAwOwogICAgbG9jYWxWYXJpYWJsZXNTaXplID0gMDsKICAgIGFubm90YXRpb25zU2l6ZSA9IDA7CiAgICBjb25zdGFudFBvb2xTaXplID0gMDsKICAgIGluc3RydWN0aW9uc1NpemUgPSAwOwogICAgY29uc3RhbnRQb29sU3RhdHMgPSA8TmFtZWRFbnRyeVN0YXRpc3RpY3M+W107CiAgICBvYmplY3RUYWJsZVN0YXRzID0gPE5hbWVkRW50cnlTdGF0aXN0aWNzPltdOwogIH0KCiAgc3RhdGljIHZvaWQgZHVtcCgpIHsKICAgIHByaW50KCJCeXRlY29kZSBzaXplIHN0YXRpc3RpY3M6Iik7CiAgICBwcmludCgiICBCeXRlY29kZSBjb21wb25lbnQ6ICAkY29tcG9uZW50U2l6ZSIpOwogICAgcHJpbnQoCiAgICAgICAgIiAgIC0gb2JqZWN0IHRhYmxlOiAgICAgJG9iamVjdFRhYmxlU2l6ZSAgIChjb3VudDogJG9iamVjdFRhYmxlRW50cmllc0NvdW50KSIpOwogICAgZm9yICh2YXIgZW50cnkgaW4gb2JqZWN0VGFibGVTdGF0cykgewogICAgICBwcmludCgiICAgICAgIC0gJGVudHJ5Iik7CiAgICB9CiAgICBwcmludCgiICAgLSBzdHJpbmcgdGFibGU6ICAgICAkc3RyaW5nVGFibGVTaXplIik7CiAgICBwcmludCgiICBMaWJyYXJpZXM6ICAgICAgICAgICAkbGlicmFyaWVzU2l6ZSIpOwogICAgcHJpbnQoIiAgQ2xhc3NlczogICAgICAgICAgICAgJGNsYXNzZXNTaXplIik7CiAgICBwcmludCgiICBNZW1iZXJzOiAgICAgICAgICAgICAkbWVtYmVyc1NpemUiKTsKICAgIHByaW50KCIgIFNvdXJjZSBwb3NpdGlvbnM6ICAgICRzb3VyY2VQb3NpdGlvbnNTaXplIik7CiAgICBwcmludCgiICBTb3VyY2UgZmlsZXM6ICAgICAgICAkc291cmNlRmlsZXNTaXplIik7CiAgICBwcmludCgiICBMaW5lIHN0YXJ0czogICAgICAgICAkbGluZVN0YXJ0c1NpemUiKTsKICAgIHByaW50KCIgIExvY2FsIHZhcmlhYmxlczogICAgICRsb2NhbFZhcmlhYmxlc1NpemUiKTsKICAgIHByaW50KCIgIEFubm90YXRpb25zOiAgICAgICAgICRhbm5vdGF0aW9uc1NpemUiKTsKICAgIHByaW50KCIgIENvZGU6ICAgICAgICAgICAgICAgICRjb2RlU2l6ZSIpOwogICAgcHJpbnQoIiAgIC0gY29uc3RhbnQgcG9vbDogICAgJGNvbnN0YW50UG9vbFNpemUiKTsKICAgIGZvciAodmFyIGVudHJ5IGluIGNvbnN0YW50UG9vbFN0YXRzKSB7CiAgICAgIHByaW50KCIgICAgICAgLSAkZW50cnkiKTsKICAgIH0KICAgIHByaW50KCIgICAtIGluc3RydWN0aW9uczogICAgICRpbnN0cnVjdGlvbnNTaXplIik7CiAgfQp9CoK0AE5OPAEsATJHAR4aAgEeFwIBIQEeQgIBHjQCARc0JwE8MSwBQR0tARsjIx8BLzEaKRoBORoqAUsYAT5EMwEcHCFQBk0WMyknNhcGKEoTBAE0HDUlKSFICh4IBiQoTwYaBAE1AR4dHywWBAEuHhcXGwQBHzIbGAQBHREbTzE1LAQBHh4zDwYVBAEoKUERCFEkDUkyTkwfJyQcDx8eJQgGBAEsRxkwUTxKBhsiJy4GHUAiGg0tLQY4Gx4hHgQBHiAeQQY2DwY6JCQjHAQBHiYeQQYYGCE4EQglHg04EQgmJiUeBgQBHiEXCR8TMDEVDxYIFxUEAR4yMAQBHjIsBAEeNycfHgYEAR4oMR8EAgEXFR0dGRkYAT4MAUsjHBwzBAEnARkeMwQBIwEVIB0cFAQBGxscEhMjEjANEiUfHhYGBAEWExMSCRknEiIgOR4GEgQBJzEEASYqBAE3KCMkJAYRBAEuMzQTEwQBMDUUJjYQBhgTBAE2JyYEARZKJzgEAR4uMgQCATo8KgErLS0ZAREBDBscFxZNCCUtJQ9BJQgaBhAEAQwYKigNKAYEAScgLS0WCAYRBAEmITAwFycfJQYnJCUGJy0tCAYnLS8wLggGFUcEASw3N0o5MgZEOTIGEyE9TTkqRSIcFQgGKSEVPTY+OUVFIjIVCAYEAQwWKiEpKh4GKSoeBhUaBAIBJB8rKQIBIx8oKwIBIREBMCwTBAIBIREBJDMTEgQCARwRATEoEwQCARwRASQuExIEAgEcDwIBEzUdBAEuHUYEAgETOAFIRy0cWE4GJQQBNUgEAgE7OBQfATIBKAIBHRUQEQEjAVEzAgEfICIqIiAeHhsmIiElIiMjOCBRARgXGSEZFxUVEh0ZGBwZGhoyMQQBFyg0C1gqIAY2NDIyOjY1OTYvNysgBjcEAgEvcGFja2FnZTp2bS9ieXRlY29kZS9ieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnRRZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL2J5dGVjb2RlL2dlbl9ieXRlY29kZS5kYXJ0wAJkli8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLmJ5dGVjb2RlLmdlbl9ieXRlY29kZTsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS92bS5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbXBpbGVyQ29udGV4dCwKICAgICAgICBTZXZlcml0eSwKICAgICAgICBpc1JlZGlyZWN0aW5nRmFjdG9yeUZpZWxkLAogICAgICAgIG1lc3NhZ2VCeXRlY29kZUxpbWl0RXhjZWVkZWRUb29NYW55QXJndW1lbnRzLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlSWxsZWdhbFJlY3Vyc2l2ZVR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBoaWRlIE1hcEVudHJ5LCBDb21wb25lbnQsIEZ1bmN0aW9uRGVjbGFyYXRpb247CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGFzIGFzdCBzaG93IENvbXBvbmVudCwgRnVuY3Rpb25EZWNsYXJhdGlvbjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2V4dGVybmFsX25hbWUuZGFydCcKICAgIHNob3cgZ2V0RXh0ZXJuYWxOYW1lLCBnZXROYXRpdmVFeHRlbnNpb25VcmlzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2xpYnJhcnlfaW5kZXguZGFydCcgc2hvdyBMaWJyYXJ5SW5kZXg7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JwogICAgc2hvdyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcywgTmFtZVN5c3RlbTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcKICAgIHNob3cgU3Vic3RpdHV0aW9uLCBjb250YWluc1R5cGVWYXJpYWJsZTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQsIFN1YnR5cGVDaGVja01vZGUsIFR5cGVFbnZpcm9ubWVudDsKaW1wb3J0ICdhc3NlbWJsZXIuZGFydCc7CmltcG9ydCAnYnl0ZWNvZGVfc2VyaWFsaXphdGlvbi5kYXJ0JyBzaG93IFN0cmluZ1RhYmxlOwppbXBvcnQgJ2NvbnN0YW50X3Bvb2wuZGFydCc7CmltcG9ydCAnZGJjLmRhcnQnOwppbXBvcnQgJ2RlY2xhcmF0aW9ucy5kYXJ0JzsKaW1wb3J0ICdleGNlcHRpb25zLmRhcnQnOwppbXBvcnQgJ2dlbmVyaWNzLmRhcnQnCiAgICBzaG93CiAgICAgICAgZmxhdHRlbkluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsCiAgICAgICAgZ2V0RGVmYXVsdEZ1bmN0aW9uVHlwZUFyZ3VtZW50cywKICAgICAgICBnZXRJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLAogICAgICAgIGdldFN0YXRpY1R5cGUsCiAgICAgICAgZ2V0VHlwZVBhcmFtZXRlclR5cGVzLAogICAgICAgIGhhc0ZyZWVUeXBlUGFyYW1ldGVycywKICAgICAgICBoYXNJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLAogICAgICAgIGlzQWxsRHluYW1pYywKICAgICAgICBpc0NhbGxUaHJvdWdoR2V0dGVyLAogICAgICAgIGlzSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbCwKICAgICAgICBpc1VuY2hlY2tlZENhbGwsCiAgICAgICAgaXNVbmNoZWNrZWRDbG9zdXJlQ2FsbDsKaW1wb3J0ICdsb2NhbF92YXJpYWJsZV90YWJsZS5kYXJ0JyBzaG93IExvY2FsVmFyaWFibGVUYWJsZTsKaW1wb3J0ICdsb2NhbF92YXJzLmRhcnQnIHNob3cgTG9jYWxWYXJpYWJsZXM7CmltcG9ydCAnbnVsbGFiaWxpdHlfZGV0ZWN0b3IuZGFydCcgc2hvdyBOdWxsYWJpbGl0eURldGVjdG9yOwppbXBvcnQgJ29iamVjdF90YWJsZS5kYXJ0JwogICAgc2hvdyBPYmplY3RIYW5kbGUsIE9iamVjdFRhYmxlLCBOYW1lQW5kVHlwZSwgdG9wTGV2ZWxDbGFzc05hbWU7CmltcG9ydCAnb3B0aW9ucy5kYXJ0JyBzaG93IEJ5dGVjb2RlT3B0aW9uczsKaW1wb3J0ICdyZWNvZ25pemVkX21ldGhvZHMuZGFydCcgc2hvdyBSZWNvZ25pemVkTWV0aG9kczsKaW1wb3J0ICdyZWN1cnNpdmVfdHlwZXNfdmFsaWRhdG9yLmRhcnQnIHNob3cgSWxsZWdhbFJlY3Vyc2l2ZVR5cGVFeGNlcHRpb247CmltcG9ydCAnc291cmNlX3Bvc2l0aW9ucy5kYXJ0JyBzaG93IExpbmVTdGFydHMsIFNvdXJjZVBvc2l0aW9uczsKaW1wb3J0ICcuLi9tZXRhZGF0YS9ieXRlY29kZS5kYXJ0JzsKaW1wb3J0ICcuLi9tZXRhZGF0YS9kaXJlY3RfY2FsbC5kYXJ0JwogICAgc2hvdyBEaXJlY3RDYWxsTWV0YWRhdGEsIERpcmVjdENhbGxNZXRhZGF0YVJlcG9zaXRvcnk7CmltcG9ydCAnLi4vbWV0YWRhdGEvaW5mZXJyZWRfdHlwZS5kYXJ0JwogICAgc2hvdyBJbmZlcnJlZFR5cGUsIEluZmVycmVkVHlwZU1ldGFkYXRhUmVwb3NpdG9yeTsKaW1wb3J0ICcuLi9tZXRhZGF0YS9vYmZ1c2NhdGlvbl9wcm9oaWJpdGlvbnMuZGFydCcKICAgIHNob3cgT2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNNZXRhZGF0YVJlcG9zaXRvcnk7CmltcG9ydCAnLi4vbWV0YWRhdGEvcHJvY2VkdXJlX2F0dHJpYnV0ZXMuZGFydCcKICAgIHNob3cgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhLCBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5OwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgdXRmODsKaW1wb3J0ICdkYXJ0OmRldmVsb3Blcic7CmltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwoKLy8gVGhpcyBzeW1ib2wgaXMgdXNlZCBhcyB0aGUgbmFtZSBpbiBhc3NlcnQgYXNzaWduYWJsZSdzIHRvIGluZGljYXRlIGl0IGNvbWVzCi8vIGZyb20gYW4gZXhwbGljaXQgJ2FzJyBjaGVjay4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgcnVudGltZSB0byB0aHJvdyB0aGUgcmlnaHQKLy8gZXhjZXB0aW9uLgpjb25zdCBTdHJpbmcgc3ltYm9sRm9yVHlwZUNhc3QgPSAnIGluIHR5cGUgY2FzdCc7Cgp2b2lkIGdlbmVyYXRlQnl0ZWNvZGUoCiAgYXN0LkNvbXBvbmVudCBjb21wb25lbnQsIHsKICBCeXRlY29kZU9wdGlvbnMgb3B0aW9ucywKICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICBDb3JlVHlwZXMgY29yZVR5cGVzLAogIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKfSkgewogIFRpbWVsaW5lLnRpbWVTeW5jKCJnZW5lcmF0ZUJ5dGVjb2RlIiwgKCkgewogICAgb3B0aW9ucyA/Pz0gbmV3IEJ5dGVjb2RlT3B0aW9ucygpOwogICAgdmVyaWZ5Qnl0ZWNvZGVJbnN0cnVjdGlvbkRlY2xhcmF0aW9ucygpOwogICAgY29yZVR5cGVzID8/PSBuZXcgQ29yZVR5cGVzKGNvbXBvbmVudCk7CiAgICB2b2lkIGlnbm9yZUFtYmlndW91c1N1cGVydHlwZXMoQ2xhc3MgY2xzLCBTdXBlcnR5cGUgYSwgU3VwZXJ0eXBlIGIpIHt9CiAgICBoaWVyYXJjaHkgPz89IG5ldyBDbGFzc0hpZXJhcmNoeShjb21wb25lbnQsIGNvcmVUeXBlcywKICAgICAgICBvbkFtYmlndW91c1N1cGVydHlwZXM6IGlnbm9yZUFtYmlndW91c1N1cGVydHlwZXMpOwogICAgZmluYWwgdHlwZUVudmlyb25tZW50ID0gbmV3IFR5cGVFbnZpcm9ubWVudChjb3JlVHlwZXMsIGhpZXJhcmNoeSk7CiAgICBsaWJyYXJpZXMgPz89IGNvbXBvbmVudC5saWJyYXJpZXM7CgogICAgLy8gU2F2ZS9yZXN0b3JlIGdsb2JhbCBOYW1lU3lzdGVtIHRvIGF2b2lkIGFjY3VtdWxhdGluZyBnYXJiYWdlLgogICAgLy8gTmFtZVN5c3RlbSBob2xkcyB0aGUgd2hvbGUgQVNUIGFzIGl0IGlzIHN0cm9uZ2x5IGNvbm5lY3RlZCBkdWUgdG8KICAgIC8vIHBhcmVudCBwb2ludGVycy4gT2JqZWN0cyBhcmUgYWRkZWQgdG8gTmFtZVN5c3RlbSB3aGVuIHRvU3RyaW5nKCkKICAgIC8vIGlzIGNhbGxlZCBmcm9tIEFTVCBub2Rlcy4gIEJ5dGVjb2RlIGdlbmVyYXRvciB3aWRlbHkgdXNlcwogICAgLy8gRXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBlLCB3aGljaCBjYWxscyBFeHByZXNzaW9uLmdldFN0YXRpY1R5cGVBc0luc3RhbmNlT2YsCiAgICAvLyB3aGljaCB1c2VzIHRvU3RyaW5nKCkgd2hlbiBpdCBjcmFzaGVzIGR1ZSB0byBodHRwOi8vZGFydGJ1Zy5jb20vMzQ0OTYuCiAgICBmaW5hbCBzYXZlZEdsb2JhbERlYnVnZ2luZ05hbWVzID0gZ2xvYmFsRGVidWdnaW5nTmFtZXM7CiAgICBnbG9iYWxEZWJ1Z2dpbmdOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CgogICAgTGlicmFyeSBsaWJyYXJ5OwogICAgdHJ5IHsKICAgICAgZmluYWwgYnl0ZWNvZGVHZW5lcmF0b3IgPSBuZXcgQnl0ZWNvZGVHZW5lcmF0b3IoCiAgICAgICAgICBjb21wb25lbnQsIGNvcmVUeXBlcywgaGllcmFyY2h5LCB0eXBlRW52aXJvbm1lbnQsIG9wdGlvbnMpOwogICAgICBmb3IgKGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgICAgYnl0ZWNvZGVHZW5lcmF0b3IudmlzaXRMaWJyYXJ5KGxpYnJhcnkpOwogICAgICB9CiAgICB9IG9uIElsbGVnYWxSZWN1cnNpdmVUeXBlRXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMucmVwb3J0KAogICAgICAgICAgdGVtcGxhdGVJbGxlZ2FsUmVjdXJzaXZlVHlwZQogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGUudHlwZSwgbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KQogICAgICAgICAgICAgIC53aXRob3V0TG9jYXRpb24oKSwKICAgICAgICAgIFNldmVyaXR5LmVycm9yKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGdsb2JhbERlYnVnZ2luZ05hbWVzID0gc2F2ZWRHbG9iYWxEZWJ1Z2dpbmdOYW1lczsKICAgIH0KICB9KTsKfQoKY2xhc3MgQnl0ZWNvZGVHZW5lcmF0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPE51bGw+IHsKICBzdGF0aWMgZmluYWwgTmFtZSBjYWxsTmFtZSA9IG5ldyBOYW1lKCdjYWxsJyk7CiAgc3RhdGljIGZpbmFsIE5hbWUgbm9TdWNoTWV0aG9kTmFtZSA9IG5ldyBOYW1lKCdub1N1Y2hNZXRob2QnKTsKCiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudDsKICBmaW5hbCBTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0IHN0YXRpY1R5cGVDb250ZXh0OwogIGZpbmFsIEJ5dGVjb2RlT3B0aW9ucyBvcHRpb25zOwogIGZpbmFsIEJ5dGVjb2RlTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhID0gbmV3IEJ5dGVjb2RlTWV0YWRhdGFSZXBvc2l0b3J5KCk7CiAgZmluYWwgUmVjb2duaXplZE1ldGhvZHMgcmVjb2duaXplZE1ldGhvZHM7CiAgZmluYWwgaW50IGZvcm1hdFZlcnNpb247CiAgZmluYWwgTWFwPFVyaSwgU291cmNlPiBhc3RVcmlUb1NvdXJjZTsKICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZTsKICBPYmplY3RUYWJsZSBvYmplY3RUYWJsZTsKICBDb21wb25lbnQgYnl0ZWNvZGVDb21wb25lbnQ7CiAgTnVsbGFiaWxpdHlEZXRlY3RvciBudWxsYWJpbGl0eURldGVjdG9yOwogIE1hcDxUcmVlTm9kZSwgRGlyZWN0Q2FsbE1ldGFkYXRhPiBkaXJlY3RDYWxsTWV0YWRhdGE7CiAgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeSBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5OwogIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGE7CiAgTWFwPFRyZWVOb2RlLCBJbmZlcnJlZFR5cGU+IGluZmVycmVkVHlwZU1ldGFkYXRhOwogIExpc3Q8Q29uc3RhbnQ+IGluZmVycmVkVHlwZXNBdHRyaWJ1dGU7CgogIExpc3Q8Q2xhc3NEZWNsYXJhdGlvbj4gY2xhc3NEZWNsYXJhdGlvbnM7CiAgTGlzdDxGaWVsZERlY2xhcmF0aW9uPiBmaWVsZERlY2xhcmF0aW9uczsKICBMaXN0PEZ1bmN0aW9uRGVjbGFyYXRpb24+IGZ1bmN0aW9uRGVjbGFyYXRpb25zOwogIENsYXNzIGVuY2xvc2luZ0NsYXNzOwogIE1lbWJlciBlbmNsb3NpbmdNZW1iZXI7CiAgRnVuY3Rpb25Ob2RlIGVuY2xvc2luZ0Z1bmN0aW9uOwogIEZ1bmN0aW9uTm9kZSBwYXJlbnRGdW5jdGlvbjsKICBib29sIGlzQ2xvc3VyZTsKICBTZXQ8VHlwZVBhcmFtZXRlcj4gY2xhc3NUeXBlUGFyYW1ldGVyczsKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnM7CiAgU2V0PFR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnNTZXQ7CiAgTGlzdDxEYXJ0VHlwZT4gaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50czsKICBMb2NhbFZhcmlhYmxlcyBsb2NhbHM7CiAgTWFwPExhYmVsZWRTdGF0ZW1lbnQsIExhYmVsPiBsYWJlbGVkU3RhdGVtZW50czsKICBNYXA8U3dpdGNoQ2FzZSwgTGFiZWw+IHN3aXRjaENhc2VzOwogIE1hcDxUcnlDYXRjaCwgVHJ5QmxvY2s+IHRyeUNhdGNoZXM7CiAgTWFwPFRyeUZpbmFsbHksIExpc3Q8RmluYWxseUJsb2NrPj4gZmluYWxseUJsb2NrczsKICBMaXN0PExhYmVsPiB5aWVsZFBvaW50czsKICBNYXA8VHJlZU5vZGUsIGludD4gY29udGV4dExldmVsczsKICBMaXN0PENsb3N1cmVEZWNsYXJhdGlvbj4gY2xvc3VyZXM7CiAgU2V0PEZpZWxkPiBpbml0aWFsaXplZEZpZWxkczsKICBMaXN0PE9iamVjdEhhbmRsZT4gbnVsbGFibGVGaWVsZHM7CiAgQ29uc3RhbnRQb29sIGNwOwogIEJ5dGVjb2RlQXNzZW1ibGVyIGFzbTsKICBMaXN0PEJ5dGVjb2RlQXNzZW1ibGVyPiBzYXZlZEFzc2VtYmxlcnM7CiAgYm9vbCBoYXNFcnJvcnM7CiAgaW50IGN1cnJlbnRMb29wRGVwdGg7CiAgTGlzdDxpbnQ+IHNhdmVkTWF4U291cmNlUG9zaXRpb25zOwogIGludCBtYXhTb3VyY2VQb3NpdGlvbjsKCiAgQnl0ZWNvZGVHZW5lcmF0b3IoCiAgICAgIGFzdC5Db21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsCiAgICAgIEJ5dGVjb2RlT3B0aW9ucyBvcHRpb25zKQogICAgICA6IHRoaXMuX2ludGVybmFsKGNvbXBvbmVudCwgY29yZVR5cGVzLCBoaWVyYXJjaHksIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgb3B0aW9ucywgbmV3IFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQuZmxhdCh0eXBlRW52aXJvbm1lbnQpKTsKCiAgQnl0ZWNvZGVHZW5lcmF0b3IuX2ludGVybmFsKAogICAgICBhc3QuQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgdGhpcy5jb3JlVHlwZXMsCiAgICAgIHRoaXMuaGllcmFyY2h5LAogICAgICB0aGlzLnR5cGVFbnZpcm9ubWVudCwKICAgICAgdGhpcy5vcHRpb25zLAogICAgICB0aGlzLnN0YXRpY1R5cGVDb250ZXh0KQogICAgICA6IHJlY29nbml6ZWRNZXRob2RzID0gbmV3IFJlY29nbml6ZWRNZXRob2RzKHN0YXRpY1R5cGVDb250ZXh0KSwKICAgICAgICBmb3JtYXRWZXJzaW9uID0gY3VycmVudEJ5dGVjb2RlRm9ybWF0VmVyc2lvbiwKICAgICAgICBhc3RVcmlUb1NvdXJjZSA9IGNvbXBvbmVudC51cmlUb1NvdXJjZSB7CiAgICBudWxsYWJpbGl0eURldGVjdG9yID0gbmV3IE51bGxhYmlsaXR5RGV0ZWN0b3IocmVjb2duaXplZE1ldGhvZHMpOwogICAgY29tcG9uZW50LmFkZE1ldGFkYXRhUmVwb3NpdG9yeShtZXRhZGF0YSk7CgogICAgYnl0ZWNvZGVDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGZvcm1hdFZlcnNpb24sIGNvcmVUeXBlcyk7CiAgICBtZXRhZGF0YS5tYXBwaW5nW2NvbXBvbmVudF0gPSBuZXcgQnl0ZWNvZGVNZXRhZGF0YShieXRlY29kZUNvbXBvbmVudCk7CgogICAgc3RyaW5nVGFibGUgPSBieXRlY29kZUNvbXBvbmVudC5zdHJpbmdUYWJsZTsKICAgIG9iamVjdFRhYmxlID0gYnl0ZWNvZGVDb21wb25lbnQub2JqZWN0VGFibGU7CgogICAgaWYgKGNvbXBvbmVudC5tYWluTWV0aG9kICE9IG51bGwpIHsKICAgICAgYnl0ZWNvZGVDb21wb25lbnQubWFpbkxpYnJhcnkgPQogICAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKGNvbXBvbmVudC5tYWluTWV0aG9kLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgfQoKICAgIGRpcmVjdENhbGxNZXRhZGF0YSA9CiAgICAgICAgY29tcG9uZW50Lm1ldGFkYXRhW0RpcmVjdENhbGxNZXRhZGF0YVJlcG9zaXRvcnkucmVwb3NpdG9yeVRhZ10/Lm1hcHBpbmc7CgogICAgcHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeSA9CiAgICAgICAgY29tcG9uZW50Lm1ldGFkYXRhW1Byb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YVJlcG9zaXRvcnkucmVwb3NpdG9yeVRhZ107CgogICAgaW5mZXJyZWRUeXBlTWV0YWRhdGEgPSBjb21wb25lbnQKICAgICAgICAubWV0YWRhdGFbSW5mZXJyZWRUeXBlTWV0YWRhdGFSZXBvc2l0b3J5LnJlcG9zaXRvcnlUYWddPy5tYXBwaW5nOwoKICAgIGZpbmFsIG9iZnVzY2F0aW9uUHJvaGliaXRpb25zTWV0YWRhdGFSZXBvc2l0b3J5ID0gY29tcG9uZW50CiAgICAgICAgLm1ldGFkYXRhW09iZnVzY2F0aW9uUHJvaGliaXRpb25zTWV0YWRhdGFSZXBvc2l0b3J5LnJlcG9zaXRvcnlUYWddOwogICAgaWYgKG9iZnVzY2F0aW9uUHJvaGliaXRpb25zTWV0YWRhdGFSZXBvc2l0b3J5ICE9IG51bGwpIHsKICAgICAgYnl0ZWNvZGVDb21wb25lbnQucHJvdGVjdGVkTmFtZXMgPQogICAgICAgICAgb2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNNZXRhZGF0YVJlcG9zaXRvcnkKICAgICAgICAgICAgICAubWFwcGluZ1tjb21wb25lbnRdPy5wcm90ZWN0ZWROYW1lczsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIHN0YXRpY1R5cGVDb250ZXh0LmVudGVyTGlicmFyeShub2RlKTsKCiAgICBzdGFydE1lbWJlcnMoKTsKICAgIHZpc2l0TGlzdChub2RlLnByb2NlZHVyZXMsIHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUuZmllbGRzLCB0aGlzKTsKICAgIGZpbmFsIG1lbWJlcnMgPSBlbmRNZW1iZXJzKG5vZGUpOwoKICAgIGNsYXNzRGVjbGFyYXRpb25zID0gPENsYXNzRGVjbGFyYXRpb24+WwogICAgICBnZXRUb3BMZXZlbENsYXNzRGVjbGFyYXRpb24obm9kZSwgbWVtYmVycykKICAgIF07CgogICAgdmlzaXRMaXN0KG5vZGUuY2xhc3NlcywgdGhpcyk7CgogICAgYnl0ZWNvZGVDb21wb25lbnQubGlicmFyaWVzCiAgICAgICAgLmFkZChnZXRMaWJyYXJ5RGVjbGFyYXRpb24obm9kZSwgY2xhc3NEZWNsYXJhdGlvbnMpKTsKICAgIGNsYXNzRGVjbGFyYXRpb25zID0gbnVsbDsKICAgIHN0YXRpY1R5cGVDb250ZXh0LmxlYXZlTGlicmFyeShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgc3RhcnRNZW1iZXJzKCk7CiAgICB2aXNpdExpc3Qobm9kZS5jb25zdHJ1Y3RvcnMsIHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUucHJvY2VkdXJlcywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5maWVsZHMsIHRoaXMpOwogICAgZmluYWwgbWVtYmVycyA9IGVuZE1lbWJlcnMobm9kZSk7CgogICAgY2xhc3NEZWNsYXJhdGlvbnMuYWRkKGdldENsYXNzRGVjbGFyYXRpb24obm9kZSwgbWVtYmVycykpOwogIH0KCiAgdm9pZCBzdGFydE1lbWJlcnMoKSB7CiAgICBmaWVsZERlY2xhcmF0aW9ucyA9IDxGaWVsZERlY2xhcmF0aW9uPltdOwogICAgZnVuY3Rpb25EZWNsYXJhdGlvbnMgPSA8RnVuY3Rpb25EZWNsYXJhdGlvbj5bXTsKICB9CgogIE1lbWJlcnMgZW5kTWVtYmVycyhUcmVlTm9kZSBub2RlKSB7CiAgICBmaW5hbCBtZW1iZXJzID0gbmV3IE1lbWJlcnMoZmllbGREZWNsYXJhdGlvbnMsIGZ1bmN0aW9uRGVjbGFyYXRpb25zKTsKICAgIGJ5dGVjb2RlQ29tcG9uZW50Lm1lbWJlcnMuYWRkKG1lbWJlcnMpOwogICAgZmllbGREZWNsYXJhdGlvbnMgPSBudWxsOwogICAgZnVuY3Rpb25EZWNsYXJhdGlvbnMgPSBudWxsOwogICAgcmV0dXJuIG1lbWJlcnM7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0U2NyaXB0KFVyaSB1cmksIGJvb2wgaW5jbHVkZVNvdXJjZUluZm8pIHsKICAgIFNvdXJjZUZpbGUgc291cmNlOwogICAgaWYgKG9wdGlvbnMuZW1pdFNvdXJjZUZpbGVzIHx8IG9wdGlvbnMuZW1pdFNvdXJjZVBvc2l0aW9ucykgewogICAgICBmaW5hbCBhc3RTb3VyY2UgPSBhc3RVcmlUb1NvdXJjZVt1cmldOwogICAgICBpZiAoYXN0U291cmNlICE9IG51bGwpIHsKICAgICAgICBzb3VyY2UgPSBieXRlY29kZUNvbXBvbmVudC51cmlUb1NvdXJjZVt1cmldOwogICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewogICAgICAgICAgZmluYWwgaW1wb3J0VXJpID0KICAgICAgICAgICAgICBvYmplY3RUYWJsZS5nZXRDb25zdFN0cmluZ0hhbmRsZShhc3RTb3VyY2UuaW1wb3J0VXJpLnRvU3RyaW5nKCkpOwogICAgICAgICAgc291cmNlID0gbmV3IFNvdXJjZUZpbGUoaW1wb3J0VXJpKTsKICAgICAgICAgIGJ5dGVjb2RlQ29tcG9uZW50LnNvdXJjZUZpbGVzLmFkZChzb3VyY2UpOwogICAgICAgICAgYnl0ZWNvZGVDb21wb25lbnQudXJpVG9Tb3VyY2VbdXJpXSA9IHNvdXJjZTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuZW1pdFNvdXJjZVBvc2l0aW9ucyAmJgogICAgICAgICAgICBpbmNsdWRlU291cmNlSW5mbyAmJgogICAgICAgICAgICBzb3VyY2UubGluZVN0YXJ0cyA9PSBudWxsKSB7CiAgICAgICAgICBMaW5lU3RhcnRzIGxpbmVTdGFydHMgPSBuZXcgTGluZVN0YXJ0cyhhc3RTb3VyY2UubGluZVN0YXJ0cyk7CiAgICAgICAgICBieXRlY29kZUNvbXBvbmVudC5saW5lU3RhcnRzLmFkZChsaW5lU3RhcnRzKTsKICAgICAgICAgIHNvdXJjZS5saW5lU3RhcnRzID0gbGluZVN0YXJ0czsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuZW1pdFNvdXJjZUZpbGVzICYmCiAgICAgICAgICAgIGluY2x1ZGVTb3VyY2VJbmZvICYmCiAgICAgICAgICAgIHNvdXJjZS5zb3VyY2UgPT0gbnVsbCkgewogICAgICAgICAgU3RyaW5nIHRleHQgPSBhc3RTb3VyY2UuY2FjaGVkVGV4dCA/PwogICAgICAgICAgICAgIHV0ZjguZGVjb2RlKGFzdFNvdXJjZS5zb3VyY2UsIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgICAgICAgIHNvdXJjZS5zb3VyY2UgPSB0ZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iamVjdFRhYmxlLmdldFNjcmlwdEhhbmRsZSh1cmksIHNvdXJjZSk7CiAgfQoKICBMaWJyYXJ5RGVjbGFyYXRpb24gZ2V0TGlicmFyeURlY2xhcmF0aW9uKAogICAgICBMaWJyYXJ5IGxpYnJhcnksIExpc3Q8Q2xhc3NEZWNsYXJhdGlvbj4gY2xhc3NlcykgewogICAgZmluYWwgaW1wb3J0VXJpID0KICAgICAgICBvYmplY3RUYWJsZS5nZXRDb25zdFN0cmluZ0hhbmRsZShsaWJyYXJ5LmltcG9ydFVyaS50b1N0cmluZygpKTsKICAgIGludCBmbGFncyA9IDA7CiAgICBmb3IgKHZhciBkZXBlbmRlbmN5IGluIGxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgIGZpbmFsIHRhcmdldExpYnJhcnkgPSBkZXBlbmRlbmN5LnRhcmdldExpYnJhcnk7CiAgICAgIGFzc2VydCh0YXJnZXRMaWJyYXJ5ICE9IG51bGwpOwogICAgICBpZiAodGFyZ2V0TGlicmFyeSA9PSBjb3JlVHlwZXMubWlycm9yc0xpYnJhcnkpIHsKICAgICAgICBmbGFncyB8PSBMaWJyYXJ5RGVjbGFyYXRpb24udXNlc0RhcnRNaXJyb3JzRmxhZzsKICAgICAgfSBlbHNlIGlmICh0YXJnZXRMaWJyYXJ5ID09IGRhcnRGZmlMaWJyYXJ5KSB7CiAgICAgICAgZmxhZ3MgfD0gTGlicmFyeURlY2xhcmF0aW9uLnVzZXNEYXJ0RmZpRmxhZzsKICAgICAgfQogICAgfQogICAgZmluYWwgbmFtZSA9IG9iamVjdFRhYmxlLmdldFB1YmxpY05hbWVIYW5kbGUobGlicmFyeS5uYW1lID8/ICcnKTsKICAgIGZpbmFsIHNjcmlwdCA9IGdldFNjcmlwdChsaWJyYXJ5LmZpbGVVcmksIHRydWUpOwogICAgZmluYWwgZXh0ZW5zaW9uVXJpcyA9CiAgICAgICAgb2JqZWN0VGFibGUuZ2V0Q29uc3RTdHJpbmdIYW5kbGVzKGdldE5hdGl2ZUV4dGVuc2lvblVyaXMobGlicmFyeSkpOwogICAgaWYgKGV4dGVuc2lvblVyaXMuaXNOb3RFbXB0eSkgewogICAgICBmbGFncyB8PSBMaWJyYXJ5RGVjbGFyYXRpb24uaGFzRXh0ZW5zaW9uc0ZsYWc7CiAgICB9CiAgICBpZiAobGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIGZsYWdzIHw9IExpYnJhcnlEZWNsYXJhdGlvbi5pc05vbk51bGxhYmxlQnlEZWZhdWx0RmxhZzsKICAgIH0KICAgIHJldHVybiBuZXcgTGlicmFyeURlY2xhcmF0aW9uKAogICAgICAgIGltcG9ydFVyaSwgZmxhZ3MsIG5hbWUsIHNjcmlwdCwgZXh0ZW5zaW9uVXJpcywgY2xhc3Nlcyk7CiAgfQoKICBDbGFzc0RlY2xhcmF0aW9uIGdldENsYXNzRGVjbGFyYXRpb24oQ2xhc3MgY2xzLCBNZW1iZXJzIG1lbWJlcnMpIHsKICAgIGludCBmbGFncyA9IDA7CiAgICBpZiAoY2xzLmlzQWJzdHJhY3QpIHsKICAgICAgZmxhZ3MgfD0gQ2xhc3NEZWNsYXJhdGlvbi5pc0Fic3RyYWN0RmxhZzsKICAgIH0KICAgIGlmIChjbHMuaXNFbnVtKSB7CiAgICAgIGZsYWdzIHw9IENsYXNzRGVjbGFyYXRpb24uaXNFbnVtRmxhZzsKICAgIH0KICAgIGludCBudW1UeXBlQXJndW1lbnRzID0gMDsKICAgIFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlcnM7CiAgICBpZiAoaGFzSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyhjbHMpKSB7CiAgICAgIGZsYWdzIHw9IENsYXNzRGVjbGFyYXRpb24uaGFzVHlwZUFyZ3VtZW50c0ZsYWc7CiAgICAgIG51bVR5cGVBcmd1bWVudHMgPSBmbGF0dGVuSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICBjbHMsIGdldFR5cGVQYXJhbWV0ZXJUeXBlcyhjbHMudHlwZVBhcmFtZXRlcnMpKQogICAgICAgICAgLmxlbmd0aDsKICAgICAgYXNzZXJ0KG51bVR5cGVBcmd1bWVudHMgPiAwKTsKICAgICAgaWYgKGNscy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgZmxhZ3MgfD0gQ2xhc3NEZWNsYXJhdGlvbi5oYXNUeXBlUGFyYW1zRmxhZzsKICAgICAgICB0eXBlUGFyYW1ldGVycyA9IGdldFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24oY2xzLnR5cGVQYXJhbWV0ZXJzKTsKICAgICAgfQogICAgfQogICAgaWYgKGNscy5pc0VsaW1pbmF0ZWRNaXhpbikgewogICAgICBmbGFncyB8PSBDbGFzc0RlY2xhcmF0aW9uLmlzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uRmxhZzsKICAgIH0KICAgIGludCBwb3NpdGlvbiA9IFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgaW50IGVuZFBvc2l0aW9uID0gVHJlZU5vZGUubm9PZmZzZXQ7CiAgICBpZiAob3B0aW9ucy5lbWl0U291cmNlUG9zaXRpb25zICYmIGNscy5maWxlT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIGZsYWdzIHw9IENsYXNzRGVjbGFyYXRpb24uaGFzU291cmNlUG9zaXRpb25zRmxhZzsKICAgICAgcG9zaXRpb24gPSBjbHMuc3RhcnRGaWxlT2Zmc2V0OwogICAgICBlbmRQb3NpdGlvbiA9IGNscy5maWxlRW5kT2Zmc2V0OwogICAgfQogICAgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhjbHMuYW5ub3RhdGlvbnMpOwogICAgaWYgKGFubm90YXRpb25zLm9iamVjdCAhPSBudWxsKSB7CiAgICAgIGZsYWdzIHw9IENsYXNzRGVjbGFyYXRpb24uaGFzQW5ub3RhdGlvbnNGbGFnOwogICAgICBpZiAoYW5ub3RhdGlvbnMuaGFzUHJhZ21hKSB7CiAgICAgICAgZmxhZ3MgfD0gQ2xhc3NEZWNsYXJhdGlvbi5oYXNQcmFnbWFGbGFnOwogICAgICB9CiAgICB9CgogICAgZmluYWwgbmFtZUhhbmRsZSA9IG9iamVjdFRhYmxlLmdldE5hbWVIYW5kbGUoCiAgICAgICAgY2xzLm5hbWUuc3RhcnRzV2l0aCgnXycpID8gY2xzLmVuY2xvc2luZ0xpYnJhcnkgOiBudWxsLCBjbHMubmFtZSk7CiAgICBmaW5hbCBzY3JpcHQgPSBnZXRTY3JpcHQoY2xzLmZpbGVVcmksICFjbHMuaXNBbm9ueW1vdXNNaXhpbik7CiAgICBmaW5hbCBzdXBlclR5cGUgPSBvYmplY3RUYWJsZS5nZXRIYW5kbGUoY2xzLnN1cGVydHlwZT8uYXNJbnRlcmZhY2VUeXBlKTsKICAgIGZpbmFsIGludGVyZmFjZXMgPSBvYmplY3RUYWJsZS5nZXRIYW5kbGVzKAogICAgICAgIGNscy5pbXBsZW1lbnRlZFR5cGVzLm1hcCgodCkgPT4gdC5hc0ludGVyZmFjZVR5cGUpLnRvTGlzdCgpKTsKCiAgICBmaW5hbCBjbGFzc0RlY2xhcmF0aW9uID0gbmV3IENsYXNzRGVjbGFyYXRpb24oCiAgICAgICAgbmFtZUhhbmRsZSwKICAgICAgICBmbGFncywKICAgICAgICBzY3JpcHQsCiAgICAgICAgcG9zaXRpb24sCiAgICAgICAgZW5kUG9zaXRpb24sCiAgICAgICAgdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgbnVtVHlwZUFyZ3VtZW50cywKICAgICAgICBzdXBlclR5cGUsCiAgICAgICAgaW50ZXJmYWNlcywKICAgICAgICBtZW1iZXJzLAogICAgICAgIGFubm90YXRpb25zLm9iamVjdCk7CiAgICBieXRlY29kZUNvbXBvbmVudC5jbGFzc2VzLmFkZChjbGFzc0RlY2xhcmF0aW9uKTsKICAgIHJldHVybiBjbGFzc0RlY2xhcmF0aW9uOwogIH0KCiAgQ2xhc3NEZWNsYXJhdGlvbiBnZXRUb3BMZXZlbENsYXNzRGVjbGFyYXRpb24oCiAgICAgIExpYnJhcnkgbGlicmFyeSwgTWVtYmVycyBtZW1iZXJzKSB7CiAgICBpbnQgZmxhZ3MgPSAwOwogICAgaW50IHBvc2l0aW9uID0gVHJlZU5vZGUubm9PZmZzZXQ7CiAgICBpZiAob3B0aW9ucy5lbWl0U291cmNlUG9zaXRpb25zICYmCiAgICAgICAgbGlicmFyeS5maWxlT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIGZsYWdzIHw9IENsYXNzRGVjbGFyYXRpb24uaGFzU291cmNlUG9zaXRpb25zRmxhZzsKICAgICAgcG9zaXRpb24gPSBsaWJyYXJ5LmZpbGVPZmZzZXQ7CiAgICB9CiAgICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IGdldExpYnJhcnlBbm5vdGF0aW9ucyhsaWJyYXJ5KTsKICAgIGlmIChhbm5vdGF0aW9ucy5vYmplY3QgIT0gbnVsbCkgewogICAgICBmbGFncyB8PSBDbGFzc0RlY2xhcmF0aW9uLmhhc0Fubm90YXRpb25zRmxhZzsKICAgICAgaWYgKGFubm90YXRpb25zLmhhc1ByYWdtYSkgewogICAgICAgIGZsYWdzIHw9IENsYXNzRGVjbGFyYXRpb24uaGFzUHJhZ21hRmxhZzsKICAgICAgfQogICAgfQoKICAgIGZpbmFsIG5hbWVIYW5kbGUgPSBvYmplY3RUYWJsZS5nZXRQdWJsaWNOYW1lSGFuZGxlKHRvcExldmVsQ2xhc3NOYW1lKTsKICAgIGZpbmFsIHNjcmlwdCA9IGdldFNjcmlwdChsaWJyYXJ5LmZpbGVVcmksIHRydWUpOwoKICAgIGZpbmFsIGNsYXNzRGVjbGFyYXRpb24gPSBuZXcgQ2xhc3NEZWNsYXJhdGlvbigKICAgICAgICBuYW1lSGFuZGxlLAogICAgICAgIGZsYWdzLAogICAgICAgIHNjcmlwdCwKICAgICAgICBwb3NpdGlvbiwKICAgICAgICAvKiBlbmRQb3NpdGlvbiAqLyBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgICAvKiB0eXBlUGFyYW1ldGVycyAqLyBudWxsLAogICAgICAgIC8qIG51bVR5cGVBcmd1bWVudHMgKi8gMCwKICAgICAgICAvKiBzdXBlclR5cGUgKi8gbnVsbCwKICAgICAgICAvKiBpbnRlcmZhY2VzICovIGNvbnN0IDxPYmplY3RIYW5kbGU+W10sCiAgICAgICAgbWVtYmVycywKICAgICAgICBhbm5vdGF0aW9ucy5vYmplY3QpOwogICAgYnl0ZWNvZGVDb21wb25lbnQuY2xhc3Nlcy5hZGQoY2xhc3NEZWNsYXJhdGlvbik7CiAgICByZXR1cm4gY2xhc3NEZWNsYXJhdGlvbjsKICB9CgogIGJvb2wgX2lzUHJhZ21hKENvbnN0YW50IGFubm90YXRpb24pID0+CiAgICAgIGFubm90YXRpb24gaXMgSW5zdGFuY2VDb25zdGFudCAmJgogICAgICBhbm5vdGF0aW9uLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMucHJhZ21hQ2xhc3M7CgogIEFubm90YXRpb25zIGdldEFubm90YXRpb25zKExpc3Q8RXhwcmVzc2lvbj4gbm9kZXMpIHsKICAgIGlmIChub2Rlcy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBjb25zdCBBbm5vdGF0aW9ucyhudWxsLCBmYWxzZSk7CiAgICB9CiAgICBMaXN0PENvbnN0YW50PiBjb25zdGFudHMgPSBub2Rlcy5tYXAoX2dldENvbnN0YW50KS50b0xpc3QoKTsKICAgIGJvb2wgaGFzUHJhZ21hID0gY29uc3RhbnRzLmFueShfaXNQcmFnbWEpOwogICAgaWYgKCFvcHRpb25zLmVtaXRBbm5vdGF0aW9ucykgewogICAgICBpZiAoaGFzUHJhZ21hKSB7CiAgICAgICAgY29uc3RhbnRzID0gY29uc3RhbnRzLndoZXJlKF9pc1ByYWdtYSkudG9MaXN0KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IEFubm90YXRpb25zKG51bGwsIGZhbHNlKTsKICAgICAgfQogICAgfQogICAgZmluYWwgb2JqZWN0ID0KICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUobmV3IExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBjb25zdGFudHMpKTsKICAgIGZpbmFsIGRlY2wgPSBuZXcgQW5ub3RhdGlvbnNEZWNsYXJhdGlvbihvYmplY3QpOwogICAgYnl0ZWNvZGVDb21wb25lbnQuYW5ub3RhdGlvbnMuYWRkKGRlY2wpOwogICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9ucyhkZWNsLCBoYXNQcmFnbWEpOwogIH0KCiAgT2JqZWN0SGFuZGxlIGdldE1lbWJlckF0dHJpYnV0ZXMoKSB7CiAgICBpZiAocHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhID09IG51bGwgJiYgaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gTGlzdCBvZiBwYWlycyAodGFnLCB2YWx1ZSkuCiAgICBmaW5hbCBhdHRycyA9IDxDb25zdGFudD5bXTsKICAgIGlmIChwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgIT0gbnVsbCkgewogICAgICBmaW5hbCBhdHRyaWJ1dGUgPSBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5CiAgICAgICAgICAuZ2V0Qnl0ZWNvZGVBdHRyaWJ1dGUocHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhKTsKICAgICAgYXR0cnMuYWRkKAogICAgICAgICAgU3RyaW5nQ29uc3RhbnQoUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeS5yZXBvc2l0b3J5VGFnKSk7CiAgICAgIGF0dHJzLmFkZChhdHRyaWJ1dGUpOwogICAgfQogICAgaWYgKGluZmVycmVkVHlwZXNBdHRyaWJ1dGUgIT0gbnVsbCkgewogICAgICBhdHRycy5hZGQoU3RyaW5nQ29uc3RhbnQoSW5mZXJyZWRUeXBlTWV0YWRhdGFSZXBvc2l0b3J5LnJlcG9zaXRvcnlUYWcpKTsKICAgICAgYXR0cnMuYWRkKExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBpbmZlcnJlZFR5cGVzQXR0cmlidXRlKSk7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0VGFibGUuZ2V0SGFuZGxlKExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBhdHRycykpOwogIH0KCiAgT2JqZWN0SGFuZGxlIGdldENsb3N1cmVBdHRyaWJ1dGVzKCkgewogICAgaWYgKGluZmVycmVkVHlwZXNBdHRyaWJ1dGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZpbmFsIGF0dHJzID0gPENvbnN0YW50PlsKICAgICAgU3RyaW5nQ29uc3RhbnQoSW5mZXJyZWRUeXBlTWV0YWRhdGFSZXBvc2l0b3J5LnJlcG9zaXRvcnlUYWcpLAogICAgICBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZSksCiAgICBdOwogICAgcmV0dXJuIG9iamVjdFRhYmxlLmdldEhhbmRsZShMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgYXR0cnMpKTsKICB9CgogIC8vIEluc2VydCBhbm5vdGF0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uIGFuZCBpdHMgcGFyYW1ldGVycyBpbnRvIHRoZSBhbm5vdGF0aW9ucwogIC8vIHNlY3Rpb24uIFJldHVybiB0aGUgYW5ub3RhdGlvbnMgZm9yIHRoZSBmdW5jdGlvbiBvbmx5LiBUaGUgYnl0ZWNvZGUgcmVhZGVyCiAgLy8gd2lsbCBpbXBsaWNpdGx5IGZpbmQgdGhlIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBieSByZWFkaW5nIE4gcGFja2VkIG9iamVjdHMKICAvLyBhZnRlciByZWFkaW5nIHRoZSBmdW5jdGlvbidzIGFubm90YXRpb25zLCBvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLgogIEFubm90YXRpb25zIGdldEZ1bmN0aW9uQW5ub3RhdGlvbnMoTWVtYmVyIG1lbWJlcikgewogICAgZmluYWwgZnVuY3Rpb25Ob2RlcyA9IG1lbWJlci5hbm5vdGF0aW9uczsKICAgIGZpbmFsIHBhcmFtZXRlck5vZGVMaXN0cyA9IG5ldyBMaXN0PExpc3Q8RXhwcmVzc2lvbj4+KCk7CiAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gbWVtYmVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHBhcmFtZXRlck5vZGVMaXN0cy5hZGQodmFyaWFibGUuYW5ub3RhdGlvbnMpOwogICAgfQogICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIG1lbWJlci5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgcGFyYW1ldGVyTm9kZUxpc3RzLmFkZCh2YXJpYWJsZS5hbm5vdGF0aW9ucyk7CiAgICB9CgogICAgaWYgKGZ1bmN0aW9uTm9kZXMuaXNFbXB0eSAmJgogICAgICAgIHBhcmFtZXRlck5vZGVMaXN0cy5ldmVyeSgobm9kZXMpID0+IG5vZGVzLmlzRW1wdHkpKSB7CiAgICAgIHJldHVybiBjb25zdCBBbm5vdGF0aW9ucyhudWxsLCBmYWxzZSk7CiAgICB9CgogICAgTGlzdDxDb25zdGFudD4gZnVuY3Rpb25Db25zdGFudHMgPSBmdW5jdGlvbk5vZGVzLm1hcChfZ2V0Q29uc3RhbnQpLnRvTGlzdCgpOwogICAgYm9vbCBoYXNQcmFnbWEgPSBmdW5jdGlvbkNvbnN0YW50cy5hbnkoX2lzUHJhZ21hKTsKICAgIGlmICghb3B0aW9ucy5lbWl0QW5ub3RhdGlvbnMgJiYgIWhhc1ByYWdtYSkgewogICAgICByZXR1cm4gY29uc3QgQW5ub3RhdGlvbnMobnVsbCwgZmFsc2UpOwogICAgfQoKICAgIGZpbmFsIGZ1bmN0aW9uT2JqZWN0ID0gb2JqZWN0VGFibGUKICAgICAgICAuZ2V0SGFuZGxlKG5ldyBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgZnVuY3Rpb25Db25zdGFudHMpKTsKICAgIGZpbmFsIGZ1bmN0aW9uRGVjbCA9IG5ldyBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uKGZ1bmN0aW9uT2JqZWN0KTsKICAgIGJ5dGVjb2RlQ29tcG9uZW50LmFubm90YXRpb25zLmFkZChmdW5jdGlvbkRlY2wpOwoKICAgIGZvciAoZmluYWwgcGFyYW1ldGVyTm9kZXMgaW4gcGFyYW1ldGVyTm9kZUxpc3RzKSB7CiAgICAgIExpc3Q8Q29uc3RhbnQ+IHBhcmFtZXRlckNvbnN0YW50cyA9CiAgICAgICAgICBwYXJhbWV0ZXJOb2Rlcy5tYXAoX2dldENvbnN0YW50KS50b0xpc3QoKTsKICAgICAgZmluYWwgcGFyYW1ldGVyT2JqZWN0ID0gb2JqZWN0VGFibGUKICAgICAgICAgIC5nZXRIYW5kbGUobmV3IExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBwYXJhbWV0ZXJDb25zdGFudHMpKTsKICAgICAgZmluYWwgcGFyYW1ldGVyRGVjbCA9IG5ldyBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uKHBhcmFtZXRlck9iamVjdCk7CiAgICAgIGJ5dGVjb2RlQ29tcG9uZW50LmFubm90YXRpb25zLmFkZChwYXJhbWV0ZXJEZWNsKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEFubm90YXRpb25zKGZ1bmN0aW9uRGVjbCwgaGFzUHJhZ21hKTsKICB9CgogIC8vIEluc2VydCBhbm5vdGF0aW9ucyBmb3IgbGlicmFyeSBhbmQgaXRzIGRlcGVuZGVuY2llcyBpbnRvIHRoZQogIC8vIGFubm90YXRpb25zIHNlY3Rpb24uIFJldHVybnMgYW5ub3RhdGlvbnMgZm9yIHRoZSBsaWJyYXJ5IG9ubHkuCiAgLy8gQnl0ZWNvZGUgcmVhZGVyIHdpbGwgaW1wbGljaXRseSBmaW5kIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGJ5IHJlYWRpbmcKICAvLyBhbiBleHRyYSBvYmplY3QgYWZ0ZXIgcmVhZGluZyBsaWJyYXJ5IGFubm90YXRpb25zLgogIEFubm90YXRpb25zIGdldExpYnJhcnlBbm5vdGF0aW9ucyhMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIEFubm90YXRpb25zIGFubm90YXRpb25zID0gZ2V0QW5ub3RhdGlvbnMobGlicmFyeS5hbm5vdGF0aW9ucyk7CiAgICBmaW5hbCBib29sIGVtaXREZXBlbmRlbmNpZXMgPQogICAgICAgIG9wdGlvbnMuZW1pdEFubm90YXRpb25zICYmIGxpYnJhcnkuZGVwZW5kZW5jaWVzLmlzTm90RW1wdHk7CiAgICBpZiAoYW5ub3RhdGlvbnMub2JqZWN0ID09IG51bGwgJiYgIWVtaXREZXBlbmRlbmNpZXMpIHsKICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgfQoKICAgIC8vIFdlIG5lZWQgdG8gZW1pdCBib3RoIGFubm90YXRpb25zIGFuZCBkZXBlbmRlbmNpZXMgb2JqZWN0cywgYXBwZW5kaW5nCiAgICAvLyBudWxsIGlmIGFuIG9iamVjdCBpcyBtaXNzaW5nLgogICAgaWYgKGFubm90YXRpb25zLm9iamVjdCA9PSBudWxsKSB7CiAgICAgIGZpbmFsIGFubm90YXRpb25zRGVjbCA9IG5ldyBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uKG51bGwpOwogICAgICBieXRlY29kZUNvbXBvbmVudC5hbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbnNEZWNsKTsKICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnNEZWNsLCBmYWxzZSk7CiAgICB9CiAgICBpZiAoIWVtaXREZXBlbmRlbmNpZXMpIHsKICAgICAgYnl0ZWNvZGVDb21wb25lbnQuYW5ub3RhdGlvbnMuYWRkKG5ldyBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uKG51bGwpKTsKICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgfQoKICAgIC8vIENyZWF0ZSBhIGNvbnN0YW50IG9iamVjdCByZXByZXNlbnRpbmcgbGlicmFyeSBkZXBlbmRlbmNpZXMuCiAgICAvLyBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIGJ5IGRhcnQ6bWlycm9ycyBhbmQgdm0tc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KICAgIGZpbmFsIGRlcHMgPSA8Q29uc3RhbnQ+W107CiAgICBmb3IgKHZhciBkZXBlbmRlbmN5IGluIGxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgIGZpbmFsIHByZWZpeCA9IGRlcGVuZGVuY3kubmFtZSAhPSBudWxsCiAgICAgICAgICA/IFN0cmluZ0NvbnN0YW50KGRlcGVuZGVuY3kubmFtZSkKICAgICAgICAgIDogTnVsbENvbnN0YW50KCk7CiAgICAgIGZpbmFsIHNob3dOYW1lcyA9IGRlcGVuZGVuY3kuY29tYmluYXRvcnMKICAgICAgICAgIC53aGVyZSgoYykgPT4gYy5pc1Nob3cpCiAgICAgICAgICAuZXhwYW5kKChjKSA9PiBjLm5hbWVzKQogICAgICAgICAgLm1hcCgobmFtZSkgPT4gU3RyaW5nQ29uc3RhbnQobmFtZSkpCiAgICAgICAgICAudG9MaXN0KCk7CiAgICAgIGZpbmFsIGhpZGVOYW1lcyA9IGRlcGVuZGVuY3kuY29tYmluYXRvcnMKICAgICAgICAgIC53aGVyZSgoYykgPT4gYy5pc0hpZGUpCiAgICAgICAgICAuZXhwYW5kKChjKSA9PiBjLm5hbWVzKQogICAgICAgICAgLm1hcCgobmFtZSkgPT4gU3RyaW5nQ29uc3RhbnQobmFtZSkpCiAgICAgICAgICAudG9MaXN0KCk7CiAgICAgIGZpbmFsIGRlcEFubm90cyA9IGRlcGVuZGVuY3kuYW5ub3RhdGlvbnMubWFwKF9nZXRDb25zdGFudCkudG9MaXN0KCk7CiAgICAgIGRlcHMuYWRkKExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCA8Q29uc3RhbnQ+WwogICAgICAgIFN0cmluZ0NvbnN0YW50KGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeS5pbXBvcnRVcmkudG9TdHJpbmcoKSksCiAgICAgICAgQm9vbENvbnN0YW50KGRlcGVuZGVuY3kuaXNFeHBvcnQpLAogICAgICAgIEJvb2xDb25zdGFudChkZXBlbmRlbmN5LmlzRGVmZXJyZWQpLAogICAgICAgIHByZWZpeCwKICAgICAgICBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgc2hvd05hbWVzKSwKICAgICAgICBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgaGlkZU5hbWVzKSwKICAgICAgICBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgZGVwQW5ub3RzKSwKICAgICAgXSkpOwogICAgfQogICAgZmluYWwgT2JqZWN0SGFuZGxlIGRlcGVuZGVuY2llc09iamVjdCA9CiAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKExpc3RDb25zdGFudChjb25zdCBEeW5hbWljVHlwZSgpLCBkZXBzKSk7CiAgICBmaW5hbCBkZXBlbmRlbmNpZXNEZWNsID0gbmV3IEFubm90YXRpb25zRGVjbGFyYXRpb24oZGVwZW5kZW5jaWVzT2JqZWN0KTsKICAgIGJ5dGVjb2RlQ29tcG9uZW50LmFubm90YXRpb25zLmFkZChkZXBlbmRlbmNpZXNEZWNsKTsKCiAgICByZXR1cm4gYW5ub3RhdGlvbnM7CiAgfQoKICBGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkRGVjbGFyYXRpb24oRmllbGQgZmllbGQsIENvZGUgaW5pdGlhbGl6ZXIpIHsKICAgIGludCBmbGFncyA9IDA7CiAgICBDb25zdGFudCB2YWx1ZTsKICAgIGlmIChfaGFzTm9uVHJpdmlhbEluaXRpYWxpemVyKGZpZWxkKSkgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmhhc05vbnRyaXZpYWxJbml0aWFsaXplckZsYWc7CiAgICB9IGVsc2UgaWYgKGZpZWxkLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSBfZ2V0Q29uc3RhbnQoZmllbGQuaW5pdGlhbGl6ZXIpOwogICAgfQogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgZmxhZ3MgfD0gRmllbGREZWNsYXJhdGlvbi5oYXNJbml0aWFsaXplckNvZGVGbGFnOwogICAgfQogICAgaWYgKGZpZWxkLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgZmxhZ3MgfD0gRmllbGREZWNsYXJhdGlvbi5oYXNJbml0aWFsaXplckZsYWc7CiAgICB9CiAgICBmaW5hbCBuYW1lID0gb2JqZWN0VGFibGUuZ2V0TmFtZUhhbmRsZSgKICAgICAgICBmaWVsZC5uYW1lLmxpYnJhcnksIG9iamVjdFRhYmxlLm1hbmdsZU1lbWJlck5hbWUoZmllbGQsIGZhbHNlLCBmYWxzZSkpOwogICAgT2JqZWN0SGFuZGxlIGdldHRlck5hbWU7CiAgICBPYmplY3RIYW5kbGUgc2V0dGVyTmFtZTsKICAgIGlmIChfbmVlZHNHZXR0ZXIoZmllbGQpKSB7CiAgICAgIGZsYWdzIHw9IEZpZWxkRGVjbGFyYXRpb24uaGFzR2V0dGVyRmxhZzsKICAgICAgZ2V0dGVyTmFtZSA9IG9iamVjdFRhYmxlLmdldE5hbWVIYW5kbGUoCiAgICAgICAgICBmaWVsZC5uYW1lLmxpYnJhcnksIG9iamVjdFRhYmxlLm1hbmdsZU1lbWJlck5hbWUoZmllbGQsIHRydWUsIGZhbHNlKSk7CiAgICB9CiAgICBpZiAoX25lZWRzU2V0dGVyKGZpZWxkKSkgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmhhc1NldHRlckZsYWc7CiAgICAgIHNldHRlck5hbWUgPSBvYmplY3RUYWJsZS5nZXROYW1lSGFuZGxlKAogICAgICAgICAgZmllbGQubmFtZS5saWJyYXJ5LCBvYmplY3RUYWJsZS5tYW5nbGVNZW1iZXJOYW1lKGZpZWxkLCBmYWxzZSwgdHJ1ZSkpOwogICAgfQogICAgaWYgKGlzUmVmbGVjdGFibGUoZmllbGQpKSB7CiAgICAgIGZsYWdzIHw9IEZpZWxkRGVjbGFyYXRpb24uaXNSZWZsZWN0YWJsZUZsYWc7CiAgICB9CiAgICBpZiAoZmllbGQuaXNTdGF0aWMpIHsKICAgICAgZmxhZ3MgfD0gRmllbGREZWNsYXJhdGlvbi5pc1N0YXRpY0ZsYWc7CiAgICB9CiAgICBpZiAoZmllbGQuaXNDb25zdCkgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmlzQ29uc3RGbGFnOwogICAgfQogICAgLy8gQ29uc3QgZmllbGRzIGFyZSBpbXBsaWNpdGx5IGZpbmFsLgogICAgaWYgKGZpZWxkLmlzQ29uc3QgfHwgZmllbGQuaXNGaW5hbCkgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmlzRmluYWxGbGFnOwogICAgfQogICAgaWYgKGZpZWxkLmlzQ292YXJpYW50KSB7CiAgICAgIGZsYWdzIHw9IEZpZWxkRGVjbGFyYXRpb24uaXNDb3ZhcmlhbnRGbGFnOwogICAgfQogICAgaWYgKGZpZWxkLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgZmxhZ3MgfD0gRmllbGREZWNsYXJhdGlvbi5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsRmxhZzsKICAgIH0KICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbk1lbWJlcikgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmlzRXh0ZW5zaW9uTWVtYmVyRmxhZzsKICAgIH0KICAgIGlmIChmaWVsZC5pc0xhdGUpIHsKICAgICAgZmxhZ3MgfD0gRmllbGREZWNsYXJhdGlvbi5pc0xhdGVGbGFnOwogICAgfQogICAgaW50IHBvc2l0aW9uID0gVHJlZU5vZGUubm9PZmZzZXQ7CiAgICBpbnQgZW5kUG9zaXRpb24gPSBUcmVlTm9kZS5ub09mZnNldDsKICAgIGlmIChvcHRpb25zLmVtaXRTb3VyY2VQb3NpdGlvbnMgJiYgZmllbGQuZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmhhc1NvdXJjZVBvc2l0aW9uc0ZsYWc7CiAgICAgIHBvc2l0aW9uID0gZmllbGQuZmlsZU9mZnNldDsKICAgICAgZW5kUG9zaXRpb24gPSBmaWVsZC5maWxlRW5kT2Zmc2V0OwogICAgfQogICAgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhmaWVsZC5hbm5vdGF0aW9ucyk7CiAgICBpZiAoYW5ub3RhdGlvbnMub2JqZWN0ICE9IG51bGwpIHsKICAgICAgZmxhZ3MgfD0gRmllbGREZWNsYXJhdGlvbi5oYXNBbm5vdGF0aW9uc0ZsYWc7CiAgICAgIGlmIChhbm5vdGF0aW9ucy5oYXNQcmFnbWEpIHsKICAgICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmhhc1ByYWdtYUZsYWc7CiAgICAgIH0KICAgIH0KICAgIGZpbmFsIE9iamVjdEhhbmRsZSBhdHRyaWJ1dGVzID0gZ2V0TWVtYmVyQXR0cmlidXRlcygpOwogICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmhhc0F0dHJpYnV0ZXNGbGFnOwogICAgfQogICAgT2JqZWN0SGFuZGxlIHNjcmlwdDsKICAgIGlmIChmaWVsZC5maWxlVXJpICE9IG51bGwgJiYKICAgICAgICBmaWVsZC5maWxlVXJpICE9IChmaWVsZC5wYXJlbnQgYXMgRmlsZVVyaU5vZGUpLmZpbGVVcmkpIHsKICAgICAgZmluYWwgaXNJbkFub255bW91c01peGluID0KICAgICAgICAgIGVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYgZW5jbG9zaW5nQ2xhc3MuaXNBbm9ueW1vdXNNaXhpbjsKICAgICAgc2NyaXB0ID0gZ2V0U2NyaXB0KGZpZWxkLmZpbGVVcmksICFpc0luQW5vbnltb3VzTWl4aW4pOwogICAgICBmbGFncyB8PSBGaWVsZERlY2xhcmF0aW9uLmhhc0N1c3RvbVNjcmlwdEZsYWc7CiAgICB9CiAgICByZXR1cm4gbmV3IEZpZWxkRGVjbGFyYXRpb24oCiAgICAgICAgZmxhZ3MsCiAgICAgICAgbmFtZSwKICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUoZmllbGQudHlwZSksCiAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKHZhbHVlKSwKICAgICAgICBzY3JpcHQsCiAgICAgICAgcG9zaXRpb24sCiAgICAgICAgZW5kUG9zaXRpb24sCiAgICAgICAgZ2V0dGVyTmFtZSwKICAgICAgICBzZXR0ZXJOYW1lLAogICAgICAgIGluaXRpYWxpemVyLAogICAgICAgIGFubm90YXRpb25zLm9iamVjdCwKICAgICAgICBhdHRyaWJ1dGVzKTsKICB9CgogIEZ1bmN0aW9uRGVjbGFyYXRpb24gZ2V0RnVuY3Rpb25EZWNsYXJhdGlvbihNZW1iZXIgbWVtYmVyLCBDb2RlIGNvZGUpIHsKICAgIGludCBmbGFncyA9IDA7CiAgICBpZiAobWVtYmVyIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvckZsYWc7CiAgICB9CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICBpZiAobWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgICAgZmxhZ3MgfD0gRnVuY3Rpb25EZWNsYXJhdGlvbi5pc0dldHRlckZsYWc7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgICAgZmxhZ3MgfD0gRnVuY3Rpb25EZWNsYXJhdGlvbi5pc1NldHRlckZsYWc7CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzRmFjdG9yeSkgewogICAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaXNGYWN0b3J5RmxhZzsKICAgICAgfQogICAgICBpZiAobWVtYmVyLmlzU3RhdGljKSB7CiAgICAgICAgZmxhZ3MgfD0gRnVuY3Rpb25EZWNsYXJhdGlvbi5pc1N0YXRpY0ZsYWc7CiAgICAgIH0KICAgICAgaWYgKG1lbWJlci5pc0ZvcndhcmRpbmdTdHViKSB7CiAgICAgICAgZmxhZ3MgfD0gRnVuY3Rpb25EZWNsYXJhdGlvbi5pc0ZvcndhcmRpbmdTdHViRmxhZzsKICAgICAgfQogICAgICBpZiAobWVtYmVyLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyKSB7CiAgICAgICAgZmxhZ3MgfD0gRnVuY3Rpb25EZWNsYXJhdGlvbi5pc05vU3VjaE1ldGhvZEZvcndhcmRlckZsYWc7CiAgICAgIH0KICAgIH0KICAgIGlmIChtZW1iZXIuaXNBYnN0cmFjdCAmJiAhX2hhc0NvZGUobWVtYmVyKSkgewogICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmlzQWJzdHJhY3RGbGFnOwogICAgfQogICAgaWYgKG1lbWJlci5pc0NvbnN0KSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaXNDb25zdEZsYWc7CiAgICB9CiAgICBpZiAobWVtYmVyLmlzRXh0ZW5zaW9uTWVtYmVyKSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaXNFeHRlbnNpb25NZW1iZXJGbGFnOwogICAgfQoKICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IG1lbWJlci5mdW5jdGlvbjsKICAgIGlmIChmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9CiAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zRmxhZzsKICAgIH0KICAgIGlmIChmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmhhc09wdGlvbmFsTmFtZWRQYXJhbXNGbGFnOwogICAgfQogICAgVHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyczsKICAgIGlmIChmdW5jdGlvbi50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaGFzVHlwZVBhcmFtc0ZsYWc7CiAgICAgIHR5cGVQYXJhbWV0ZXJzID0gZ2V0VHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbihmdW5jdGlvbi50eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgICBpZiAoaXNSZWZsZWN0YWJsZShtZW1iZXIpKSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaXNSZWZsZWN0YWJsZUZsYWc7CiAgICB9CiAgICBpZiAoaXNEZWJ1Z2dhYmxlKG1lbWJlcikpIHsKICAgICAgZmxhZ3MgfD0gRnVuY3Rpb25EZWNsYXJhdGlvbi5pc0RlYnVnZ2FibGVGbGFnOwogICAgfQogICAgc3dpdGNoIChmdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luYzoKICAgICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmlzQXN5bmNGbGFnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEFzeW5jTWFya2VyLkFzeW5jU3RhcjoKICAgICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmlzQXN5bmNTdGFyRmxhZzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jU3RhcjoKICAgICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmlzU3luY1N0YXJGbGFnOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQogICAgT2JqZWN0SGFuZGxlIG5hdGl2ZU5hbWU7CiAgICBpZiAobWVtYmVyLmlzRXh0ZXJuYWwpIHsKICAgICAgZmluYWwgU3RyaW5nIGV4dGVybmFsTmFtZSA9IGdldEV4dGVybmFsTmFtZShtZW1iZXIpOwogICAgICBpZiAoZXh0ZXJuYWxOYW1lID09IG51bGwpIHsKICAgICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmlzRXh0ZXJuYWxGbGFnOwogICAgICB9IGVsc2UgewogICAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaXNOYXRpdmVGbGFnOwogICAgICAgIG5hdGl2ZU5hbWUgPSBvYmplY3RUYWJsZS5nZXRDb25zdFN0cmluZ0hhbmRsZShleHRlcm5hbE5hbWUpOwogICAgICB9CiAgICB9CiAgICBpbnQgcG9zaXRpb24gPSBUcmVlTm9kZS5ub09mZnNldDsKICAgIGludCBlbmRQb3NpdGlvbiA9IFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgaWYgKG9wdGlvbnMuZW1pdFNvdXJjZVBvc2l0aW9ucyAmJiBtZW1iZXIuZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmhhc1NvdXJjZVBvc2l0aW9uc0ZsYWc7CiAgICAgIHBvc2l0aW9uID0gKG1lbWJlciBhcyBkeW5hbWljKS5zdGFydEZpbGVPZmZzZXQ7CiAgICAgIGVuZFBvc2l0aW9uID0gbWVtYmVyLmZpbGVFbmRPZmZzZXQ7CiAgICB9CiAgICBmaW5hbCBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IGdldEZ1bmN0aW9uQW5ub3RhdGlvbnMobWVtYmVyKTsKICAgIGlmIChhbm5vdGF0aW9ucy5vYmplY3QgIT0gbnVsbCkgewogICAgICBmbGFncyB8PSBGdW5jdGlvbkRlY2xhcmF0aW9uLmhhc0Fubm90YXRpb25zRmxhZzsKICAgICAgaWYgKGFubm90YXRpb25zLmhhc1ByYWdtYSkgewogICAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaGFzUHJhZ21hRmxhZzsKICAgICAgfQogICAgfQogICAgZmluYWwgT2JqZWN0SGFuZGxlIGF0dHJpYnV0ZXMgPSBnZXRNZW1iZXJBdHRyaWJ1dGVzKCk7CiAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaGFzQXR0cmlidXRlc0ZsYWc7CiAgICB9CiAgICBPYmplY3RIYW5kbGUgc2NyaXB0OwogICAgaWYgKG1lbWJlci5maWxlVXJpICE9IG51bGwgJiYKICAgICAgICBtZW1iZXIuZmlsZVVyaSAhPSAobWVtYmVyLnBhcmVudCBhcyBGaWxlVXJpTm9kZSkuZmlsZVVyaSkgewogICAgICBmaW5hbCBpc0luQW5vbnltb3VzTWl4aW4gPQogICAgICAgICAgZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCAmJiBlbmNsb3NpbmdDbGFzcy5pc0Fub255bW91c01peGluOwogICAgICBmaW5hbCBpc1N5bnRoZXRpYyA9IG1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgIChtZW1iZXIuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIgfHwgbWVtYmVyLmlzU3ludGhldGljRm9yd2FyZGVyKTsKICAgICAgc2NyaXB0ID0gZ2V0U2NyaXB0KG1lbWJlci5maWxlVXJpLCAhaXNJbkFub255bW91c01peGluICYmICFpc1N5bnRoZXRpYyk7CiAgICAgIGZsYWdzIHw9IEZ1bmN0aW9uRGVjbGFyYXRpb24uaGFzQ3VzdG9tU2NyaXB0RmxhZzsKICAgIH0KCiAgICBmaW5hbCBuYW1lID0gb2JqZWN0VGFibGUuZ2V0TmFtZUhhbmRsZShtZW1iZXIubmFtZS5saWJyYXJ5LAogICAgICAgIG9iamVjdFRhYmxlLm1hbmdsZU1lbWJlck5hbWUobWVtYmVyLCBmYWxzZSwgZmFsc2UpKTsKCiAgICBmaW5hbCBwYXJhbWV0ZXJzID0gPFBhcmFtZXRlckRlY2xhcmF0aW9uPltdOwogICAgZm9yICh2YXIgcGFyYW0gaW4gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgcGFyYW1ldGVycy5hZGQoZ2V0UGFyYW1ldGVyRGVjbGFyYXRpb24ocGFyYW0pKTsKICAgIH0KICAgIGZvciAodmFyIHBhcmFtIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICBwYXJhbWV0ZXJzLmFkZChnZXRQYXJhbWV0ZXJEZWNsYXJhdGlvbihwYXJhbSkpOwogICAgfQoKICAgIHJldHVybiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbigKICAgICAgICBmbGFncywKICAgICAgICBuYW1lLAogICAgICAgIHNjcmlwdCwKICAgICAgICBwb3NpdGlvbiwKICAgICAgICBlbmRQb3NpdGlvbiwKICAgICAgICB0eXBlUGFyYW1ldGVycywKICAgICAgICBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHBhcmFtZXRlcnMsCiAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKGZ1bmN0aW9uLnJldHVyblR5cGUpLAogICAgICAgIG5hdGl2ZU5hbWUsCiAgICAgICAgY29kZSwKICAgICAgICBhbm5vdGF0aW9ucy5vYmplY3QsCiAgICAgICAgYXR0cmlidXRlcyk7CiAgfQoKICBib29sIGlzUmVmbGVjdGFibGUoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBGaWVsZCAmJiBtZW1iZXIuZmlsZU9mZnNldCA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmaW5hbCBsaWJyYXJ5ID0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnk7CiAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JyAmJiBtZW1iZXIubmFtZS5pc1ByaXZhdGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICBtZW1iZXIuaXNTdGF0aWMgJiYKICAgICAgICBsaWJyYXJ5LmltcG9ydFVyaS50b1N0cmluZygpID09ICdkYXJ0Ol9pbnRlcm5hbCcpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGlzRGVidWdnYWJsZShNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIENvbnN0cnVjdG9yICYmIG1lbWJlci5pc1N5bnRoZXRpYykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAobWVtYmVyLmZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciAhPSBBc3luY01hcmtlci5TeW5jKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChtZW1iZXIgPT0gYXN5bmNBd2FpdENvbXBsZXRlckdldEZ1dHVyZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24gZ2V0VHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbigKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1zKSB7CiAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24oCiAgICAgICAgb2JqZWN0VGFibGUuZ2V0VHlwZVBhcmFtZXRlckhhbmRsZXModHlwZVBhcmFtcykpOwogIH0KCiAgUGFyYW1ldGVyRGVjbGFyYXRpb24gZ2V0UGFyYW1ldGVyRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgZmluYWwgbmFtZSA9IHZhcmlhYmxlLm5hbWU7CiAgICBmaW5hbCBsaWIgPSBuYW1lLnN0YXJ0c1dpdGgoJ18nKSA/IGVuY2xvc2luZ01lbWJlci5lbmNsb3NpbmdMaWJyYXJ5IDogbnVsbDsKICAgIGZpbmFsIG5hbWVIYW5kbGUgPSBvYmplY3RUYWJsZS5nZXROYW1lSGFuZGxlKGxpYiwgbmFtZSk7CiAgICBmaW5hbCB0eXBlSGFuZGxlID0gb2JqZWN0VGFibGUuZ2V0SGFuZGxlKHZhcmlhYmxlLnR5cGUpOwogICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJEZWNsYXJhdGlvbihuYW1lSGFuZGxlLCB0eXBlSGFuZGxlKTsKICB9CgogIExpc3Q8aW50PiBnZXRQYXJhbWV0ZXJGbGFncyhGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIGludCBnZXRGbGFncyhWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICAgIGludCBmbGFncyA9IDA7CiAgICAgIGlmICh2YXJpYWJsZS5pc0NvdmFyaWFudCkgewogICAgICAgIGZsYWdzIHw9IFBhcmFtZXRlckRlY2xhcmF0aW9uLmlzQ292YXJpYW50RmxhZzsKICAgICAgfQogICAgICBpZiAodmFyaWFibGUuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGZsYWdzIHw9IFBhcmFtZXRlckRlY2xhcmF0aW9uLmlzR2VuZXJpY0NvdmFyaWFudEltcGxGbGFnOwogICAgICB9CiAgICAgIGlmICh2YXJpYWJsZS5pc0ZpbmFsKSB7CiAgICAgICAgZmxhZ3MgfD0gUGFyYW1ldGVyRGVjbGFyYXRpb24uaXNGaW5hbEZsYWc7CiAgICAgIH0KICAgICAgcmV0dXJuIGZsYWdzOwogICAgfQoKICAgIGZpbmFsIExpc3Q8aW50PiBwYXJhbUZsYWdzID0gPGludD5bXTsKICAgIGZvciAodmFyIHBhcmFtIGluIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHBhcmFtRmxhZ3MuYWRkKGdldEZsYWdzKHBhcmFtKSk7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbSBpbiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgcGFyYW1GbGFncy5hZGQoZ2V0RmxhZ3MocGFyYW0pKTsKICAgIH0KCiAgICBmb3IgKGludCBmbGFncyBpbiBwYXJhbUZsYWdzKSB7CiAgICAgIGlmIChmbGFncyAhPSAwKSB7CiAgICAgICAgcmV0dXJuIHBhcmFtRmxhZ3M7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgUHJvY2VkdXJlICYmIG5vZGUuaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm47CiAgICB9CiAgICB0cnkgewogICAgICBmaW5hbCBib29sIGhhc0NvZGUgPSBfaGFzQ29kZShub2RlKTsKICAgICAgc3RhcnQobm9kZSwgaGFzQ29kZSk7CiAgICAgIGlmIChub2RlIGlzIEZpZWxkKSB7CiAgICAgICAgaWYgKGhhc0NvZGUpIHsKICAgICAgICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgICAgICAgX2dlblB1c2hDb25zdEV4cHIobm9kZS5pbml0aWFsaXplcik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgICAgICAgfQogICAgICAgICAgX2dlblJldHVyblRPUygpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgobm9kZSBpcyBQcm9jZWR1cmUgJiYgIW5vZGUuaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikgfHwKICAgICAgICAgIChub2RlIGlzIENvbnN0cnVjdG9yKSkgewogICAgICAgIGlmIChoYXNDb2RlKSB7CiAgICAgICAgICBpZiAobm9kZSBpcyBDb25zdHJ1Y3RvcikgewogICAgICAgICAgICBfZ2VuQ29uc3RydWN0b3JJbml0aWFsaXplcnMobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS5pc0V4dGVybmFsKSB7CiAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYXRpdmVOYW1lID0gZ2V0RXh0ZXJuYWxOYW1lKG5vZGUpOwogICAgICAgICAgICBpZiAobmF0aXZlTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgX2dlbk5hdGl2ZUNhbGwobmF0aXZlTmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogZ2VuZXJhdGUgdGhyb3dpbmcgVW5pbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgICAgLy8gICgiTm8gZGVmaW5pdGlvbiBnaXZlbiBmb3IgZXh0ZXJuYWwgbWV0aG9kIEZvby5iYXIiKS4KICAgICAgICAgICAgICBhc20uZW1pdFB1c2hOdWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5mdW5jdGlvbj8uYm9keSk7CiAgICAgICAgICAgIC8vIEJ5dGVjb2RlQXNzZW1ibGVyIGVsaW1pbmF0ZXMgdGhpcyBieXRlY29kZSBpZiBpdCBpcyB1bnJlYWNoYWJsZS4KICAgICAgICAgICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUuZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgICBfcmVjb3JkU291cmNlUG9zaXRpb24obm9kZS5mdW5jdGlvbi5maWxlRW5kT2Zmc2V0KTsKICAgICAgICAgIH0KICAgICAgICAgIF9nZW5SZXR1cm5UT1MoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgbWVtYmVyICR7bm9kZS5ydW50aW1lVHlwZX0gJG5vZGUnOwogICAgICB9CiAgICAgIGVuZChub2RlLCBoYXNDb2RlKTsKICAgIH0gb24gVG9vTWFueUFyZ3VtZW50c0V4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLnJlcG9ydCgKICAgICAgICAgIG1lc3NhZ2VCeXRlY29kZUxpbWl0RXhjZWVkZWRUb29NYW55QXJndW1lbnRzLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICBub2RlLmZpbGVVcmksIGUuZmlsZU9mZnNldCwgbm9MZW5ndGgpLAogICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICBoYXNFcnJvcnMgPSB0cnVlOwogICAgICBlbmQobm9kZSwgZmFsc2UpOwogICAgfQogIH0KCiAgYm9vbCBfaGFzQ29kZShNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBGcm9udC1lbmQgbWlnaHQgc2V0IGFic3RyYWN0IGZsYWcgb24gc3RhdGljIGV4dGVybmFsIHByb2NlZHVyZXMsCiAgICAvLyBidXQgdGhleSBjYW4gYmUgY2FsbGVkIGFuZCBzaG91bGQgaGF2ZSBhIGJvZHkuCiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNTdGF0aWMgJiYgbWVtYmVyLmlzRXh0ZXJuYWwpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAobWVtYmVyLmlzQWJzdHJhY3QpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICAvLyBUT0RPKGRhcnRidWcuY29tLzM0Mjc3KQogICAgICAvLyBGcm9udC1lbmQgaW5zZXJ0cyBzeW50aGV0aWMgc3RhdGljIGZpZWxkcyAiX3JlZGlyZWN0aW5nIyIgdG8gcmVjb3JkCiAgICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9ycyBpbiBrZXJuZWwuCiAgICAgIC8vIFRoZSBwcm9ibGVtIGlzIHRoYXQgaW5pdGlhbGl6ZXJzIG9mIHRoZXNlIHN5bnRoZXRpYyBzdGF0aWMgZmllbGRzCiAgICAgIC8vIGNvbnRhaW4gaW5jb3JyZWN0IGtlcm5lbCBBU1QsIGUuZy4gU3RhdGljR2V0IHdoaWNoIHRha2VzIHRlYXItb2ZmCiAgICAgIC8vIG9mIGEgY29uc3RydWN0b3IuIERvIG5vdCBnZW5lcmF0ZSBieXRlY29kZSBmb3IgdGhlbSwgYXMgdGhleSBzaG91bGQKICAgICAgLy8gbmV2ZXIgYmUgdXNlZC4KICAgICAgaWYgKGlzUmVkaXJlY3RpbmdGYWN0b3J5RmllbGQobWVtYmVyKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gaGFzSW5pdGlhbGl6ZXJDb2RlKG1lbWJlcik7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgaGFzSW5pdGlhbGl6ZXJDb2RlKEZpZWxkIGZpZWxkKSA9PgogICAgICAoZmllbGQuaXNTdGF0aWMgfHwKICAgICAgICAgIGZpZWxkLmlzTGF0ZSB8fAogICAgICAgICAgb3B0aW9ucy5lbWl0SW5zdGFuY2VGaWVsZEluaXRpYWxpemVycykgJiYKICAgICAgX2hhc05vblRyaXZpYWxJbml0aWFsaXplcihmaWVsZCk7CgogIGJvb2wgX25lZWRzR2V0dGVyKEZpZWxkIGZpZWxkKSB7CiAgICAvLyBBbGwgaW5zdGFuY2UgZmllbGRzIG5lZWQgYSBnZXR0ZXIuCiAgICBpZiAoIWZpZWxkLmlzU3RhdGljKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBTdGF0aWMgZmllbGRzIGFsc28gbmVlZCBhIGdldHRlciBpZiB0aGV5IGhhdmUgYSBub24tdHJpdmlhbCBpbml0aWFsaXplciwKICAgIC8vIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgbGF6aWx5LgogICAgaWYgKF9oYXNOb25Ucml2aWFsSW5pdGlhbGl6ZXIoZmllbGQpKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBTdGF0aWMgbGF0ZSBmaWVsZHMgd2l0aCBubyBpbml0aWFsaXplciBhbHNvIG5lZWQgYSBnZXR0ZXIsIHRvIGNoZWNrIGlmCiAgICAvLyBpdCdzIGJlZW4gaW5pdGlhbGl6ZWQuCiAgICByZXR1cm4gZmllbGQuaXNMYXRlICYmIGZpZWxkLmluaXRpYWxpemVyID09IG51bGw7CiAgfQoKICBib29sIF9uZWVkc1NldHRlcihGaWVsZCBmaWVsZCkgewogICAgLy8gTGF0ZSBmaWVsZHMgYWx3YXlzIG5lZWQgYSBzZXR0ZXIsIHVubGVzcyB0aGV5J3JlIHN0YXRpYyBhbmQgbm9uLWZpbmFsLCBvcgogICAgLy8gZmluYWwgd2l0aCBhbiBpbml0aWFsaXplci4KICAgIGlmIChmaWVsZC5pc0xhdGUpIHsKICAgICAgaWYgKGZpZWxkLmlzU3RhdGljICYmICFmaWVsZC5pc0ZpbmFsKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChmaWVsZC5pc0ZpbmFsICYmIGZpZWxkLmluaXRpYWxpemVyICE9IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gTm9uLWxhdGUgc3RhdGljIGZpZWxkcyBuZXZlciBuZWVkIGEgc2V0dGVyLgogICAgaWYgKGZpZWxkLmlzU3RhdGljKSByZXR1cm4gZmFsc2U7CgogICAgLy8gT3RoZXJ3aXNlLCB0aGUgZmllbGQgb25seSBuZWVkcyBhIHNldHRlciBpZiBpdCBpc24ndCBmaW5hbC4KICAgIHJldHVybiAhZmllbGQuaXNGaW5hbDsKICB9CgogIHZvaWQgX2dlbk5hdGl2ZUNhbGwoU3RyaW5nIG5hdGl2ZU5hbWUpIHsKICAgIGZpbmFsIGZ1bmN0aW9uID0gZW5jbG9zaW5nTWVtYmVyLmZ1bmN0aW9uOwogICAgYXNzZXJ0KGZ1bmN0aW9uICE9IG51bGwpOwoKICAgIGlmIChsb2NhbHMuaGFzRmFjdG9yeVR5cGVBcmdzVmFyKSB7CiAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuZ2V0VmFySW5kZXhJbkZyYW1lKGxvY2Fscy5mYWN0b3J5VHlwZUFyZ3NWYXIpKTsKICAgIH0gZWxzZSBpZiAobG9jYWxzLmhhc0Z1bmN0aW9uVHlwZUFyZ3NWYXIpIHsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5mdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lKTsKICAgIH0KICAgIGlmIChsb2NhbHMuaGFzUmVjZWl2ZXIpIHsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5nZXRWYXJJbmRleEluRnJhbWUobG9jYWxzLnJlY2VpdmVyVmFyKSk7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbSBpbiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmdldFZhckluZGV4SW5GcmFtZShwYXJhbSkpOwogICAgfQogICAgLy8gTmF0aXZlIG1ldGhvZHMgYWNjZXNzIHRoZWlyIHBhcmFtZXRlcnMgYnkgaW5kaWNlcywgc28KICAgIC8vIG5hdGl2ZSB3cmFwcGVycyBzaG91bGQgcGFzcyBhcmd1bWVudHMgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uCiAgICAvLyBvcmRlciBpbnN0ZWFkIG9mIHNvcnRlZCBvcmRlci4KICAgIGZvciAodmFyIHBhcmFtIGluIGxvY2Fscy5vcmlnaW5hbE5hbWVkUGFyYW1ldGVycykgewogICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmdldFZhckluZGV4SW5GcmFtZShwYXJhbSkpOwogICAgfQoKICAgIGZpbmFsIG5hdGl2ZUVudHJ5Q3BJbmRleCA9IGNwLmFkZE5hdGl2ZUVudHJ5KG5hdGl2ZU5hbWUpOwogICAgYXNtLmVtaXROYXRpdmVDYWxsKG5hdGl2ZUVudHJ5Q3BJbmRleCk7CiAgfQoKICBMaWJyYXJ5SW5kZXggZ2V0IGxpYnJhcnlJbmRleCA9PiBjb3JlVHlwZXMuaW5kZXg7CgogIFByb2NlZHVyZSBfbGlzdEZyb21MaXRlcmFsOwogIFByb2NlZHVyZSBnZXQgbGlzdEZyb21MaXRlcmFsID0+IF9saXN0RnJvbUxpdGVyYWwgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ19mcm9tTGl0ZXJhbCcpOwoKICBQcm9jZWR1cmUgX21hcEZyb21MaXRlcmFsOwogIFByb2NlZHVyZSBnZXQgbWFwRnJvbUxpdGVyYWwgPT4gX21hcEZyb21MaXRlcmFsID8/PQogICAgICBsaWJyYXJ5SW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnTWFwJywgJ19mcm9tTGl0ZXJhbCcpOwoKICBQcm9jZWR1cmUgX2ludGVycG9sYXRlU2luZ2xlOwogIFByb2NlZHVyZSBnZXQgaW50ZXJwb2xhdGVTaW5nbGUgPT4gX2ludGVycG9sYXRlU2luZ2xlID8/PQogICAgICBsaWJyYXJ5SW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnX1N0cmluZ0Jhc2UnLCAnX2ludGVycG9sYXRlU2luZ2xlJyk7CgogIFByb2NlZHVyZSBfaW50ZXJwb2xhdGU7CiAgUHJvY2VkdXJlIGdldCBpbnRlcnBvbGF0ZSA9PiBfaW50ZXJwb2xhdGUgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdfU3RyaW5nQmFzZScsICdfaW50ZXJwb2xhdGUnKTsKCiAgQ2xhc3MgX2Nsb3N1cmVDbGFzczsKICBDbGFzcyBnZXQgY2xvc3VyZUNsYXNzID0+CiAgICAgIF9jbG9zdXJlQ2xhc3MgPz89IGxpYnJhcnlJbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ19DbG9zdXJlJyk7CgogIFByb2NlZHVyZSBfb2JqZWN0SW5zdGFuY2VPZjsKICBQcm9jZWR1cmUgZ2V0IG9iamVjdEluc3RhbmNlT2YgPT4gX29iamVjdEluc3RhbmNlT2YgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdPYmplY3QnLCAnX2luc3RhbmNlT2YnKTsKCiAgUHJvY2VkdXJlIF9vYmplY3RTaW1wbGVJbnN0YW5jZU9mOwogIFByb2NlZHVyZSBnZXQgb2JqZWN0U2ltcGxlSW5zdGFuY2VPZiA9PiBfb2JqZWN0U2ltcGxlSW5zdGFuY2VPZiA/Pz0KICAgICAgbGlicmFyeUluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ09iamVjdCcsICdfc2ltcGxlSW5zdGFuY2VPZicpOwoKICBGaWVsZCBfY2xvc3VyZUluc3RhbnRpYXRvclR5cGVBcmd1bWVudHM7CiAgRmllbGQgZ2V0IGNsb3N1cmVJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzID0+CiAgICAgIF9jbG9zdXJlSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyA/Pz0gbGlicmFyeUluZGV4LmdldE1lbWJlcigKICAgICAgICAgICdkYXJ0OmNvcmUnLCAnX0Nsb3N1cmUnLCAnX2luc3RhbnRpYXRvcl90eXBlX2FyZ3VtZW50cycpOwoKICBGaWVsZCBfY2xvc3VyZUZ1bmN0aW9uVHlwZUFyZ3VtZW50czsKICBGaWVsZCBnZXQgY2xvc3VyZUZ1bmN0aW9uVHlwZUFyZ3VtZW50cyA9PgogICAgICBfY2xvc3VyZUZ1bmN0aW9uVHlwZUFyZ3VtZW50cyA/Pz0gbGlicmFyeUluZGV4LmdldE1lbWJlcigKICAgICAgICAgICdkYXJ0OmNvcmUnLCAnX0Nsb3N1cmUnLCAnX2Z1bmN0aW9uX3R5cGVfYXJndW1lbnRzJyk7CgogIEZpZWxkIF9jbG9zdXJlRGVsYXllZFR5cGVBcmd1bWVudHM7CiAgRmllbGQgZ2V0IGNsb3N1cmVEZWxheWVkVHlwZUFyZ3VtZW50cyA9PgogICAgICBfY2xvc3VyZURlbGF5ZWRUeXBlQXJndW1lbnRzID8/PSBsaWJyYXJ5SW5kZXguZ2V0TWVtYmVyKAogICAgICAgICAgJ2RhcnQ6Y29yZScsICdfQ2xvc3VyZScsICdfZGVsYXllZF90eXBlX2FyZ3VtZW50cycpOwoKICBGaWVsZCBfY2xvc3VyZUZ1bmN0aW9uOwogIEZpZWxkIGdldCBjbG9zdXJlRnVuY3Rpb24gPT4gX2Nsb3N1cmVGdW5jdGlvbiA/Pz0KICAgICAgbGlicmFyeUluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19DbG9zdXJlJywgJ19mdW5jdGlvbicpOwoKICBGaWVsZCBfY2xvc3VyZUNvbnRleHQ7CiAgRmllbGQgZ2V0IGNsb3N1cmVDb250ZXh0ID0+IF9jbG9zdXJlQ29udGV4dCA/Pz0KICAgICAgbGlicmFyeUluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19DbG9zdXJlJywgJ19jb250ZXh0Jyk7CgogIFByb2NlZHVyZSBfcHJlcGVuZFR5cGVBcmd1bWVudHM7CiAgUHJvY2VkdXJlIGdldCBwcmVwZW5kVHlwZUFyZ3VtZW50cyA9PiBfcHJlcGVuZFR5cGVBcmd1bWVudHMgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDpfaW50ZXJuYWwnLCAnX3ByZXBlbmRUeXBlQXJndW1lbnRzJyk7CgogIFByb2NlZHVyZSBfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbjsKICBQcm9jZWR1cmUgZ2V0IGJvdW5kc0NoZWNrRm9yUGFydGlhbEluc3RhbnRpYXRpb24gPT4KICAgICAgX2JvdW5kc0NoZWNrRm9yUGFydGlhbEluc3RhbnRpYXRpb24gPz89IGxpYnJhcnlJbmRleC5nZXRUb3BMZXZlbE1lbWJlcigKICAgICAgICAgICdkYXJ0Ol9pbnRlcm5hbCcsICdfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbicpOwoKICBQcm9jZWR1cmUgX2Z1dHVyZVZhbHVlOwogIFByb2NlZHVyZSBnZXQgZnV0dXJlVmFsdWUgPT4KICAgICAgX2Z1dHVyZVZhbHVlID8/PSBsaWJyYXJ5SW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmFzeW5jJywgJ0Z1dHVyZScsICd2YWx1ZScpOwoKICBQcm9jZWR1cmUgX3Rocm93TmV3TGF0ZUluaXRpYWxpemF0aW9uRXJyb3I7CiAgUHJvY2VkdXJlIGdldCB0aHJvd05ld0xhdGVJbml0aWFsaXphdGlvbkVycm9yID0+CiAgICAgIF90aHJvd05ld0xhdGVJbml0aWFsaXphdGlvbkVycm9yID8/PSBsaWJyYXJ5SW5kZXguZ2V0TWVtYmVyKAogICAgICAgICAgJ2RhcnQ6Y29yZScsICdfTGF0ZUluaXRpYWxpemF0aW9uRXJyb3InLCAnX3Rocm93TmV3Jyk7CgogIFByb2NlZHVyZSBfdGhyb3dOZXdBc3NlcnRpb25FcnJvcjsKICBQcm9jZWR1cmUgZ2V0IHRocm93TmV3QXNzZXJ0aW9uRXJyb3IgPT4gX3Rocm93TmV3QXNzZXJ0aW9uRXJyb3IgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdfQXNzZXJ0aW9uRXJyb3InLCAnX3Rocm93TmV3Jyk7CgogIFByb2NlZHVyZSBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yOwogIFByb2NlZHVyZSBnZXQgYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yID0+CiAgICAgIF9hbGxvY2F0ZUludm9jYXRpb25NaXJyb3IgPz89IGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoCiAgICAgICAgICAnZGFydDpjb3JlJywgJ19JbnZvY2F0aW9uTWlycm9yJywgJ19hbGxvY2F0ZUludm9jYXRpb25NaXJyb3InKTsKCiAgUHJvY2VkdXJlIF91bnNhZmVDYXN0OwogIFByb2NlZHVyZSBnZXQgdW5zYWZlQ2FzdCA9PiBfdW5zYWZlQ2FzdCA/Pz0KICAgICAgbGlicmFyeUluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0Ol9pbnRlcm5hbCcsICd1bnNhZmVDYXN0Jyk7CgogIFByb2NlZHVyZSBfaXRlcmFibGVJdGVyYXRvcjsKICBQcm9jZWR1cmUgZ2V0IGl0ZXJhYmxlSXRlcmF0b3IgPT4gX2l0ZXJhYmxlSXRlcmF0b3IgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdJdGVyYWJsZScsICdnZXQ6aXRlcmF0b3InKTsKCiAgUHJvY2VkdXJlIF9pdGVyYXRvck1vdmVOZXh0OwogIFByb2NlZHVyZSBnZXQgaXRlcmF0b3JNb3ZlTmV4dCA9PiBfaXRlcmF0b3JNb3ZlTmV4dCA/Pz0KICAgICAgbGlicmFyeUluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0l0ZXJhdG9yJywgJ21vdmVOZXh0Jyk7CgogIFByb2NlZHVyZSBfaXRlcmF0b3JDdXJyZW50OwogIFByb2NlZHVyZSBnZXQgaXRlcmF0b3JDdXJyZW50ID0+IF9pdGVyYXRvckN1cnJlbnQgPz89CiAgICAgIGxpYnJhcnlJbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdJdGVyYXRvcicsICdnZXQ6Y3VycmVudCcpOwoKICBQcm9jZWR1cmUgX2FzeW5jQXdhaXRDb21wbGV0ZXJHZXRGdXR1cmU7CiAgUHJvY2VkdXJlIGdldCBhc3luY0F3YWl0Q29tcGxldGVyR2V0RnV0dXJlID0+CiAgICAgIF9hc3luY0F3YWl0Q29tcGxldGVyR2V0RnV0dXJlID8/PSBsaWJyYXJ5SW5kZXgudHJ5R2V0TWVtYmVyKAogICAgICAgICAgJ2RhcnQ6YXN5bmMnLCAnX0FzeW5jQXdhaXRDb21wbGV0ZXInLCAnZ2V0OmZ1dHVyZScpOwoKICBQcm9jZWR1cmUgX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZTsKICBQcm9jZWR1cmUgZ2V0IHNldEFzeW5jVGhyZWFkU3RhY2tUcmFjZSA9PiBfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlID8/PQogICAgICBsaWJyYXJ5SW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6YXN5bmMnLCAnX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZScpOwoKICBQcm9jZWR1cmUgX2NsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlOwogIFByb2NlZHVyZSBnZXQgY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2UgPT4KICAgICAgX2NsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlID8/PSBsaWJyYXJ5SW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoCiAgICAgICAgICAnZGFydDphc3luYycsICdfY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2UnKTsKCiAgTGlicmFyeSBfZGFydEZmaUxpYnJhcnk7CiAgTGlicmFyeSBnZXQgZGFydEZmaUxpYnJhcnkgPT4KICAgICAgX2RhcnRGZmlMaWJyYXJ5ID8/PSBsaWJyYXJ5SW5kZXgudHJ5R2V0TGlicmFyeSgnZGFydDpmZmknKTsKCiAgdm9pZCBfcmVjb3JkU291cmNlUG9zaXRpb24oaW50IGZpbGVPZmZzZXQpIHsKICAgIGFzbS5jdXJyZW50U291cmNlUG9zaXRpb24gPSBmaWxlT2Zmc2V0OwogICAgbWF4U291cmNlUG9zaXRpb24gPSBtYXRoLm1heChtYXhTb3VyY2VQb3NpdGlvbiwgZmlsZU9mZnNldCk7CiAgfQoKICB2b2lkIF9nZW5lcmF0ZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmaW5hbCBzYXZlZFNvdXJjZVBvc2l0aW9uID0gYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbjsKICAgIF9yZWNvcmRTb3VyY2VQb3NpdGlvbihub2RlLmZpbGVPZmZzZXQpOwogICAgbm9kZS5hY2NlcHQodGhpcyk7CiAgICBhc20uY3VycmVudFNvdXJjZVBvc2l0aW9uID0gc2F2ZWRTb3VyY2VQb3NpdGlvbjsKICB9CgogIHZvaWQgX2dlbmVyYXRlTm9kZUxpc3QoTGlzdDxUcmVlTm9kZT4gbm9kZXMpIHsKICAgIG5vZGVzLmZvckVhY2goX2dlbmVyYXRlTm9kZSk7CiAgfQoKICB2b2lkIF9nZW5Db25zdHJ1Y3RvckluaXRpYWxpemVycyhDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBib29sIGlzUmVkaXJlY3RpbmcgPSBmYWxzZTsKICAgIFNldDxGaWVsZD4gaW5pdGlhbGl6ZWRJbkluaXRpYWxpemVyc0xpc3QgPSBuZXcgU2V0PEZpZWxkPigpOwogICAgZm9yICh2YXIgaW5pdGlhbGl6ZXIgaW4gbm9kZS5pbml0aWFsaXplcnMpIHsKICAgICAgaWYgKGluaXRpYWxpemVyIGlzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpIHsKICAgICAgICBpc1JlZGlyZWN0aW5nID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBGaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgaW5pdGlhbGl6ZWRJbkluaXRpYWxpemVyc0xpc3QuYWRkKGluaXRpYWxpemVyLmZpZWxkKTsKICAgICAgfQogICAgfQoKICAgIGlmICghaXNSZWRpcmVjdGluZykgewogICAgICBpbml0aWFsaXplZEZpZWxkcyA9IG5ldyBTZXQ8RmllbGQ+KCk7CiAgICAgIGZvciAodmFyIGZpZWxkIGluIG5vZGUuZW5jbG9zaW5nQ2xhc3MuZmllbGRzKSB7CiAgICAgICAgaWYgKCFmaWVsZC5pc1N0YXRpYykgewogICAgICAgICAgaWYgKGZpZWxkLmlzTGF0ZSkgewogICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkSW5Jbml0aWFsaXplcnNMaXN0LmNvbnRhaW5zKGZpZWxkKSkgewogICAgICAgICAgICAgIF9nZW5MYXRlRmllbGRJbml0aWFsaXplcihmaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWRJbkluaXRpYWxpemVyc0xpc3QuY29udGFpbnMoZmllbGQpKSB7CiAgICAgICAgICAgICAgLy8gRG8gbm90IHN0b3JlIGEgdmFsdWUgaW50byB0aGUgZmllbGQgYXMgaXQgaXMgZ29pbmcgdG8gYmUKICAgICAgICAgICAgICAvLyBvdmVyd3JpdHRlbiBieSBpbml0aWFsaXplcnMgbGlzdC4KICAgICAgICAgICAgICBfZ2VuZXJhdGVOb2RlKGZpZWxkLmluaXRpYWxpemVyKTsKICAgICAgICAgICAgICBhc20uZW1pdERyb3AxKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2dlbkZpZWxkSW5pdGlhbGl6ZXIoZmllbGQsIGZpZWxkLmluaXRpYWxpemVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9nZW5lcmF0ZU5vZGVMaXN0KG5vZGUuaW5pdGlhbGl6ZXJzKTsKCiAgICBpZiAoIWlzUmVkaXJlY3RpbmcpIHsKICAgICAgbnVsbGFibGVGaWVsZHMgPSA8T2JqZWN0SGFuZGxlPltdOwogICAgICBmb3IgKHZhciBmaWVsZCBpbiBub2RlLmVuY2xvc2luZ0NsYXNzLmZpZWxkcykgewogICAgICAgIGlmICghZmllbGQuaXNTdGF0aWMgJiYKICAgICAgICAgICAgIWZpZWxkLmlzTGF0ZSAmJgogICAgICAgICAgICAhaW5pdGlhbGl6ZWRGaWVsZHMuY29udGFpbnMoZmllbGQpKSB7CiAgICAgICAgICBudWxsYWJsZUZpZWxkcy5hZGQob2JqZWN0VGFibGUuZ2V0SGFuZGxlKGZpZWxkKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGluaXRpYWxpemVkRmllbGRzID0gbnVsbDsgLy8gTm8gbW9yZSBpbml0aWFsaXplZCBmaWVsZHMsIHBsZWFzZS4KICAgIH0KICB9CgogIHZvaWQgX2dlbkZpZWxkSW5pdGlhbGl6ZXIoRmllbGQgZmllbGQsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKICAgIGFzc2VydCghZmllbGQuaXNTdGF0aWMpOwoKICAgIGlmIChpbml0aWFsaXplciBpcyBOdWxsTGl0ZXJhbCAmJiAhaW5pdGlhbGl6ZWRGaWVsZHMuY29udGFpbnMoZmllbGQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBfZ2VuUHVzaFJlY2VpdmVyKCk7CiAgICBfZ2VuZXJhdGVOb2RlKGluaXRpYWxpemVyKTsKCiAgICBmaW5hbCBpbnQgY3BJbmRleCA9IGNwLmFkZEluc3RhbmNlRmllbGQoZmllbGQpOwogICAgYXNtLmVtaXRTdG9yZUZpZWxkVE9TKGNwSW5kZXgpOwoKICAgIGluaXRpYWxpemVkRmllbGRzLmFkZChmaWVsZCk7CiAgfQoKICB2b2lkIF9nZW5MYXRlRmllbGRJbml0aWFsaXplcihGaWVsZCBmaWVsZCkgewogICAgYXNzZXJ0KCFmaWVsZC5pc1N0YXRpYyk7CgogICAgaWYgKF9pc1RyaXZpYWxJbml0aWFsaXplcihmaWVsZC5pbml0aWFsaXplcikpIHsKICAgICAgX2dlbkZpZWxkSW5pdGlhbGl6ZXIoZmllbGQsIGZpZWxkLmluaXRpYWxpemVyKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIF9nZW5QdXNoUmVjZWl2ZXIoKTsKCiAgICBmaW5hbCBpbnQgY3BJbmRleCA9IGNwLmFkZEluc3RhbmNlRmllbGQoZmllbGQpOwogICAgYXNtLmVtaXRJbml0TGF0ZUZpZWxkKGNwSW5kZXgpOwoKICAgIGluaXRpYWxpemVkRmllbGRzLmFkZChmaWVsZCk7CiAgfQoKICB2b2lkIF9nZW5Bcmd1bWVudHMoRXhwcmVzc2lvbiByZWNlaXZlciwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2ludCBzdG9yZVJlY2VpdmVyVG9Mb2NhbH0pIHsKICAgIGlmIChhcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICBfZ2VuVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMudHlwZXMpOwogICAgfQogICAgX2dlbmVyYXRlTm9kZShyZWNlaXZlcik7CiAgICBpZiAoc3RvcmVSZWNlaXZlclRvTG9jYWwgIT0gbnVsbCkgewogICAgICBhc20uZW1pdFN0b3JlTG9jYWwoc3RvcmVSZWNlaXZlclRvTG9jYWwpOwogICAgfQogICAgX2dlbmVyYXRlTm9kZUxpc3QoYXJndW1lbnRzLnBvc2l0aW9uYWwpOwogICAgYXJndW1lbnRzLm5hbWVkLmZvckVhY2goKE5hbWVkRXhwcmVzc2lvbiBuZSkgPT4gX2dlbmVyYXRlTm9kZShuZS52YWx1ZSkpOwogIH0KCiAgdm9pZCBfZ2VuUHVzaEJvb2woYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIGFzbS5lbWl0UHVzaFRydWUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzbS5lbWl0UHVzaEZhbHNlKCk7CiAgICB9CiAgfQoKICB2b2lkIF9nZW5QdXNoSW50KGludCB2YWx1ZSkgewogICAgLy8gVE9ETyhhbGV4bWFya292KTogcmVsYXggdGhpcyBjb25zdHJhaW50IGFzIFB1c2hJbnQgaW5zdHJ1Y3Rpb24gY2FuCiAgICAvLyBob2xkIHVwIHRvIDMyLWJpdCBzaWduZWQgb3BlcmFuZCAobm90ZSB0aGF0IGludGVycHJldGVyIGFzc3VtZXMKICAgIC8vIGl0IGlzIFNtaSkuCiAgICBpZiAodmFsdWUuYml0TGVuZ3RoICsgMSA8PSAxNikgewogICAgICBhc20uZW1pdFB1c2hJbnQodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQoY3AuYWRkT2JqZWN0UmVmKG5ldyBJbnRDb25zdGFudCh2YWx1ZSkpKTsKICAgIH0KICB9CgogIHZvaWQgX2dlblB1c2hObmJkTW9kZSgpIHsKICAgIGFzbS5lbWl0UHVzaEludCgKICAgICAgICBzdGF0aWNUeXBlQ29udGV4dC5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID8ga09wdGVkSW4gOiBrTGVnYWN5KTsKICB9CgogIENvbnN0YW50IF9nZXRDb25zdGFudChFeHByZXNzaW9uIGV4cHIpIHsKICAgIGlmIChleHByIGlzIENvbnN0YW50RXhwcmVzc2lvbikgewogICAgICByZXR1cm4gZXhwci5jb25zdGFudDsKICAgIH0KCiAgICAvLyBMaXRlcmFscyBvdXRzaWRlIG9mIGNvbnN0IGV4cHJlc3Npb25zIGFyZSBub3QgdHJhbnNmb3JtZWQgYnkgdGhlCiAgICAvLyBjb25zdGFudCB0cmFuc2Zvcm1lciwgYnV0IHRoZXkgbmVlZCB0byBiZSB0cmVhdGVkIGFzIGNvbnN0YW50cyBoZXJlLgogICAgaWYgKGV4cHIgaXMgQm9vbExpdGVyYWwpIHJldHVybiBuZXcgQm9vbENvbnN0YW50KGV4cHIudmFsdWUpOwogICAgaWYgKGV4cHIgaXMgRG91YmxlTGl0ZXJhbCkgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChleHByLnZhbHVlKTsKICAgIGlmIChleHByIGlzIEludExpdGVyYWwpIHJldHVybiBuZXcgSW50Q29uc3RhbnQoZXhwci52YWx1ZSk7CiAgICBpZiAoZXhwciBpcyBOdWxsTGl0ZXJhbCkgcmV0dXJuIG5ldyBOdWxsQ29uc3RhbnQoKTsKICAgIGlmIChleHByIGlzIFN0cmluZ0xpdGVyYWwpIHJldHVybiBuZXcgU3RyaW5nQ29uc3RhbnQoZXhwci52YWx1ZSk7CgogICAgdGhyb3cgJ0V4cGVjdGVkIGNvbnN0YW50LCBnb3QgJHtleHByLnJ1bnRpbWVUeXBlfSc7CiAgfQoKICB2b2lkIF9nZW5QdXNoQ29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChjb25zdGFudCBpcyBOdWxsQ29uc3RhbnQpIHsKICAgICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgX2dlblB1c2hCb29sKGNvbnN0YW50LnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoY29uc3RhbnQgaXMgSW50Q29uc3RhbnQpIHsKICAgICAgX2dlblB1c2hJbnQoY29uc3RhbnQudmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQoY3AuYWRkT2JqZWN0UmVmKGNvbnN0YW50KSk7CiAgICB9CiAgfQoKICB2b2lkIF9nZW5QdXNoQ29uc3RFeHByKEV4cHJlc3Npb24gZXhwcikgewogICAgaWYgKGV4cHIgaXMgQ29uc3RhbnRFeHByZXNzaW9uKSB7CiAgICAgIF9nZW5QdXNoQ29uc3RhbnQoZXhwci5jb25zdGFudCk7CiAgICB9IGVsc2UgaWYgKGV4cHIgaXMgTnVsbExpdGVyYWwpIHsKICAgICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgfSBlbHNlIGlmIChleHByIGlzIEJvb2xMaXRlcmFsKSB7CiAgICAgIF9nZW5QdXNoQm9vbChleHByLnZhbHVlKTsKICAgIH0gZWxzZSBpZiAoZXhwciBpcyBJbnRMaXRlcmFsKSB7CiAgICAgIF9nZW5QdXNoSW50KGV4cHIudmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgX2dlblB1c2hDb25zdGFudChfZ2V0Q29uc3RhbnQoZXhwcikpOwogICAgfQogIH0KCiAgdm9pZCBfZ2VuUmV0dXJuVE9TKFtpbnQgeWllbGRTb3VyY2VQb3NpdGlvbiA9IG51bGxdKSB7CiAgICBpZiAob3B0aW9ucy5jYXVzYWxBc3luY1N0YWNrcyAmJgogICAgICAgIHBhcmVudEZ1bmN0aW9uICE9IG51bGwgJiYKICAgICAgICAocGFyZW50RnVuY3Rpb24uZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jIHx8CiAgICAgICAgICAgIHBhcmVudEZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luY1N0YXIpKSB7CiAgICAgIGZpbmFsIHNhdmVkU291cmNlUG9zaXRpb24gPSBhc20uY3VycmVudFNvdXJjZVBvc2l0aW9uOwogICAgICBfcmVjb3JkU291cmNlUG9zaXRpb24oVHJlZU5vZGUubm9PZmZzZXQpOwogICAgICBfZ2VuRGlyZWN0Q2FsbCgKICAgICAgICAgIGNsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlLCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDApLCAwKTsKICAgICAgYXNtLmVtaXREcm9wMSgpOwogICAgICBhc20uY3VycmVudFNvdXJjZVBvc2l0aW9uID0gc2F2ZWRTb3VyY2VQb3NpdGlvbjsKICAgIH0KCiAgICBpZiAoeWllbGRTb3VyY2VQb3NpdGlvbiAhPSBudWxsICYmIG9wdGlvbnMuZW1pdFNvdXJjZVBvc2l0aW9ucykgewogICAgICBhc20uZW1pdFlpZWxkUG9pbnRTb3VyY2VQb3NpdGlvbih5aWVsZFNvdXJjZVBvc2l0aW9uKTsKICAgIH0KICAgIGFzbS5lbWl0UmV0dXJuVE9TKCk7CiAgfQoKICB2b2lkIF9nZW5EaXJlY3RDYWxsKE1lbWJlciB0YXJnZXQsIE9iamVjdEhhbmRsZSBhcmdEZXNjLCBpbnQgdG90YWxBcmdDb3VudCwKICAgICAge2Jvb2wgaXNHZXQ6IGZhbHNlLAogICAgICBib29sIGlzU2V0OiBmYWxzZSwKICAgICAgYm9vbCBpc0R5bmFtaWNGb3J3YXJkZXI6IGZhbHNlLAogICAgICBib29sIGlzVW5jaGVja2VkOiBmYWxzZSwKICAgICAgVHJlZU5vZGUgbm9kZX0pIHsKICAgIGFzc2VydCghaXNHZXQgfHwgIWlzU2V0KTsKICAgIGZpbmFsIGtpbmQgPSBpc0dldAogICAgICAgID8gSW52b2NhdGlvbktpbmQuZ2V0dGVyCiAgICAgICAgOiAoaXNTZXQgPyBJbnZvY2F0aW9uS2luZC5zZXR0ZXIgOiBJbnZvY2F0aW9uS2luZC5tZXRob2QpOwogICAgZmluYWwgY3BJbmRleCA9IGNwLmFkZERpcmVjdENhbGwoa2luZCwgdGFyZ2V0LCBhcmdEZXNjLCBpc0R5bmFtaWNGb3J3YXJkZXIpOwoKICAgIGlmICh0b3RhbEFyZ0NvdW50ID49IGFyZ3VtZW50c0xpbWl0KSB7CiAgICAgIHRocm93IG5ldyBUb29NYW55QXJndW1lbnRzRXhjZXB0aW9uKG5vZGUuZmlsZU9mZnNldCk7CiAgICB9CiAgICBpZiAoaW5mZXJyZWRUeXBlTWV0YWRhdGEgIT0gbnVsbCAmJiBub2RlICE9IG51bGwpIHsKICAgICAgX2FwcGVuZEluZmVycmVkVHlwZShub2RlLCBhc20ub2Zmc2V0KTsKICAgIH0KICAgIGlmIChpc1VuY2hlY2tlZCkgewogICAgICBhc20uZW1pdFVuY2hlY2tlZERpcmVjdENhbGwoY3BJbmRleCwgdG90YWxBcmdDb3VudCk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdERpcmVjdENhbGwoY3BJbmRleCwgdG90YWxBcmdDb3VudCk7CiAgICB9CiAgICBpZiAoaW5mZXJyZWRUeXBlTWV0YWRhdGEgIT0gbnVsbCAmJiBub2RlICE9IG51bGwpIHsKICAgICAgX3JlcGxhY2VXaXRoQ29uc3RhbnRWYWx1ZShub2RlKTsKICAgIH0KICB9CgogIHZvaWQgX2dlbkRpcmVjdENhbGxXaXRoQXJncyhNZW1iZXIgdGFyZ2V0LCBBcmd1bWVudHMgYXJncywKICAgICAge2Jvb2wgaGFzUmVjZWl2ZXI6IGZhbHNlLAogICAgICBib29sIGlzRmFjdG9yeTogZmFsc2UsCiAgICAgIGJvb2wgaXNVbmNoZWNrZWQ6IGZhbHNlLAogICAgICBUcmVlTm9kZSBub2RlfSkgewogICAgZmluYWwgYXJnRGVzYyA9IG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGVCeUFyZ3VtZW50cyhhcmdzLAogICAgICAgIGhhc1JlY2VpdmVyOiBoYXNSZWNlaXZlciwgaXNGYWN0b3J5OiBpc0ZhY3RvcnkpOwoKICAgIGludCB0b3RhbEFyZ0NvdW50ID0gYXJncy5wb3NpdGlvbmFsLmxlbmd0aCArIGFyZ3MubmFtZWQubGVuZ3RoOwogICAgaWYgKGhhc1JlY2VpdmVyKSB7CiAgICAgIHRvdGFsQXJnQ291bnQrKzsKICAgIH0KICAgIGlmIChhcmdzLnR5cGVzLmlzTm90RW1wdHkgfHwgaXNGYWN0b3J5KSB7CiAgICAgIC8vIFZNIG5lZWRzIHR5cGUgYXJndW1lbnRzIGZvciBldmVyeSBpbnZvY2F0aW9uIG9mIGEgZmFjdG9yeSBjb25zdHJ1Y3Rvci4KICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogQ2xlYW4gdGhpcyB1cC4KICAgICAgdG90YWxBcmdDb3VudCsrOwogICAgfQoKICAgIF9nZW5EaXJlY3RDYWxsKHRhcmdldCwgYXJnRGVzYywgdG90YWxBcmdDb3VudCwKICAgICAgICBpc1VuY2hlY2tlZDogaXNVbmNoZWNrZWQsIG5vZGU6IG5vZGUpOwogIH0KCiAgdm9pZCBfZ2VuVHlwZUFyZ3VtZW50cyhMaXN0PERhcnRUeXBlPiB0eXBlQXJncywge0NsYXNzIGluc3RhbnRpYXRpbmdDbGFzc30pIHsKICAgIGludCB0eXBlQXJnc0NQSW5kZXgoKSB7CiAgICAgIGlmIChpbnN0YW50aWF0aW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIHR5cGVBcmdzID0gZ2V0SW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyhpbnN0YW50aWF0aW5nQ2xhc3MsIHR5cGVBcmdzKTsKICAgICAgfQogICAgICByZXR1cm4gY3AuYWRkVHlwZUFyZ3VtZW50cyh0eXBlQXJncyk7CiAgICB9CgogICAgaWYgKHR5cGVBcmdzLmlzRW1wdHkgfHwgIWhhc0ZyZWVUeXBlUGFyYW1ldGVycyh0eXBlQXJncykpIHsKICAgICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQodHlwZUFyZ3NDUEluZGV4KCkpOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgZmxhdHRlbmVkVHlwZUFyZ3MgPSAoaW5zdGFudGlhdGluZ0NsYXNzICE9IG51bGwgJiYKICAgICAgICAgICAgICAoaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyAhPSBudWxsIHx8CiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkpCiAgICAgICAgICA/IGZsYXR0ZW5JbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKGluc3RhbnRpYXRpbmdDbGFzcywgdHlwZUFyZ3MpCiAgICAgICAgICA6IHR5cGVBcmdzOwogICAgICBpZiAoX2NhblJldXNlSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyhmbGF0dGVuZWRUeXBlQXJncykpIHsKICAgICAgICBfZ2VuUHVzaEluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMoKTsKICAgICAgfSBlbHNlIGlmIChfY2FuUmV1c2VGdW5jdGlvblR5cGVBcmd1bWVudHMoZmxhdHRlbmVkVHlwZUFyZ3MpKSB7CiAgICAgICAgX2dlblB1c2hGdW5jdGlvblR5cGVBcmd1bWVudHMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfZ2VuUHVzaEluc3RhbnRpYXRvckFuZEZ1bmN0aW9uVHlwZUFyZ3VtZW50cyh0eXBlQXJncyk7CiAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogT3B0aW1pemUgdHlwZSBhcmd1bWVudHMgaW5zdGFudGlhdGlvbgogICAgICAgIC8vIGJ5IHBhc3NpbmcgckEgPSAxIGluIEluc3RhbnRpYXRlVHlwZUFyZ3VtZW50c1RPUy4KICAgICAgICAvLyBGb3IgdGhpcyBwdXJwb3NlLCB3ZSBuZWVkIHRvIGRldGVjdCBpZiB0eXBlIGFyZ3VtZW50cwogICAgICAgIC8vIHdvdWxkIGJlIGFsbC1keW5hbWljIGluIGNhc2Ugb2YgYWxsLWR5bmFtaWMgaW5zdGFudGlhdG9yIGFuZAogICAgICAgIC8vIGZ1bmN0aW9uIHR5cGUgYXJndW1lbnRzLgogICAgICAgIC8vIENvcnJlc3BvbmRpbmcgY2hlY2sgaXMgaW1wbGVtZW50ZWQgaW4gVk0gaW4KICAgICAgICAvLyBUeXBlQXJndW1lbnRzOjpJc1Jhd1doZW5JbnN0YW50aWF0ZWRGcm9tUmF3LgogICAgICAgIGFzbS5lbWl0SW5zdGFudGlhdGVUeXBlQXJndW1lbnRzVE9TKDAsIHR5cGVBcmdzQ1BJbmRleCgpKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfZ2VuUHVzaEluc3RhbnRpYXRvckFuZEZ1bmN0aW9uVHlwZUFyZ3VtZW50cyhMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgaWYgKGNsYXNzVHlwZVBhcmFtZXRlcnMgIT0gbnVsbCAmJgogICAgICAgIHR5cGVzLmFueSgodCkgPT4gY29udGFpbnNUeXBlVmFyaWFibGUodCwgY2xhc3NUeXBlUGFyYW1ldGVycykpKSB7CiAgICAgIGFzc2VydChpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzICE9IG51bGwpOwogICAgICBfZ2VuUHVzaEluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzbS5lbWl0UHVzaE51bGwoKTsKICAgIH0KICAgIGlmIChmdW5jdGlvblR5cGVQYXJhbWV0ZXJzU2V0ICE9IG51bGwgJiYKICAgICAgICB0eXBlcy5hbnkoKHQpID0+IGNvbnRhaW5zVHlwZVZhcmlhYmxlKHQsIGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnNTZXQpKSkgewogICAgICBfZ2VuUHVzaEZ1bmN0aW9uVHlwZUFyZ3VtZW50cygpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgfQogIH0KCiAgdm9pZCBfZ2VuUHVzaEluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMoKSB7CiAgICBpZiAoaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGlmIChsb2NhbHMuaGFzRmFjdG9yeVR5cGVBcmdzVmFyKSB7CiAgICAgICAgYXNzZXJ0KGVuY2xvc2luZ01lbWJlciBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAgICAgKGVuY2xvc2luZ01lbWJlciBhcyBQcm9jZWR1cmUpLmlzRmFjdG9yeSk7CiAgICAgICAgX2dlbkxvYWRWYXIobG9jYWxzLmZhY3RvcnlUeXBlQXJnc1Zhcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2dlblB1c2hSZWNlaXZlcigpOwogICAgICAgIGZpbmFsIGludCBjcEluZGV4ID0gY3AuYWRkVHlwZUFyZ3VtZW50c0ZpZWxkKGVuY2xvc2luZ0NsYXNzKTsKICAgICAgICBhc20uZW1pdExvYWRUeXBlQXJndW1lbnRzRmllbGQoY3BJbmRleCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFzbS5lbWl0UHVzaE51bGwoKTsKICAgIH0KICB9CgogIGJvb2wgX2NhblJldXNlSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyhMaXN0PERhcnRUeXBlPiB0eXBlQXJncykgewogICAgaWYgKGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKHR5cGVBcmdzLmxlbmd0aCA+IGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmICh0eXBlQXJnc1tpXSAhPSBpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzW2ldKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIF9jYW5SZXVzZUZ1bmN0aW9uVHlwZUFyZ3VtZW50cyhMaXN0PERhcnRUeXBlPiB0eXBlQXJncykgewogICAgaWYgKGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMgPT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKHR5cGVBcmdzLmxlbmd0aCA+IGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGZpbmFsIHR5cGVBcmcgPSB0eXBlQXJnc1tpXTsKICAgICAgaWYgKCEodHlwZUFyZyBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgICAgdHlwZUFyZy5wYXJhbWV0ZXIgPT0gZnVuY3Rpb25UeXBlUGFyYW1ldGVyc1tpXSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgX2dlblB1c2hGdW5jdGlvblR5cGVBcmd1bWVudHMoKSB7CiAgICBpZiAobG9jYWxzLmhhc0Z1bmN0aW9uVHlwZUFyZ3NWYXIpIHsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5mdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzbS5lbWl0UHVzaE51bGwoKTsKICAgIH0KICB9CgogIHZvaWQgX2dlblB1c2hDb250ZXh0Rm9yVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwKICAgICAge2ludCBjdXJyZW50Q29udGV4dExldmVsfSkgewogICAgY3VycmVudENvbnRleHRMZXZlbCA/Pz0gbG9jYWxzLmN1cnJlbnRDb250ZXh0TGV2ZWw7CiAgICBpbnQgZGVwdGggPSBjdXJyZW50Q29udGV4dExldmVsIC0gbG9jYWxzLmdldENvbnRleHRMZXZlbE9mVmFyKHZhcmlhYmxlKTsKICAgIGFzc2VydChkZXB0aCA+PSAwKTsKCiAgICBhc20uZW1pdFB1c2gobG9jYWxzLmNvbnRleHRWYXJJbmRleEluRnJhbWUpOwogICAgaWYgKGRlcHRoID4gMCkgewogICAgICBmb3IgKDsgZGVwdGggPiAwOyAtLWRlcHRoKSB7CiAgICAgICAgYXNtLmVtaXRMb2FkQ29udGV4dFBhcmVudCgpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9nZW5QdXNoQ29udGV4dElmQ2FwdHVyZWQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKGxvY2Fscy5pc0NhcHR1cmVkKHZhcmlhYmxlKSkgewogICAgICBfZ2VuUHVzaENvbnRleHRGb3JWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICB9CiAgfQoKICB2b2lkIF9nZW5Mb2FkVmFyKFZhcmlhYmxlRGVjbGFyYXRpb24gdiwge2ludCBjdXJyZW50Q29udGV4dExldmVsfSkgewogICAgaWYgKGxvY2Fscy5pc0NhcHR1cmVkKHYpKSB7CiAgICAgIF9nZW5QdXNoQ29udGV4dEZvclZhcmlhYmxlKHYsIGN1cnJlbnRDb250ZXh0TGV2ZWw6IGN1cnJlbnRDb250ZXh0TGV2ZWwpOwogICAgICBhc20uZW1pdExvYWRDb250ZXh0VmFyKAogICAgICAgICAgbG9jYWxzLmdldFZhckNvbnRleHRJZCh2KSwgbG9jYWxzLmdldFZhckluZGV4SW5Db250ZXh0KHYpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuZ2V0VmFySW5kZXhJbkZyYW1lKHYpKTsKICAgIH0KICB9CgogIHZvaWQgX2dlblB1c2hSZWNlaXZlcigpIHsKICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGdlbmVyYXRlIG1vcmUgZWZmaWNpZW50IGFjY2VzcyB0byByZWNlaXZlcgogICAgLy8gZXZlbiBpZiBpdCBpcyBjYXB0dXJlZC4KICAgIF9nZW5Mb2FkVmFyKGxvY2Fscy5yZWNlaXZlclZhcik7CiAgfQoKICAvLyBTdG9yZXMgdmFsdWUgaW50byB2YXJpYWJsZS4KICAvLyBJZiB2YXJpYWJsZSBpcyBjYXB0dXJlZCwgY29udGV4dCBzaG91bGQgYmUgcHVzaGVkIGJlZm9yZSB2YWx1ZS4KICB2b2lkIF9nZW5TdG9yZVZhcihWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAobG9jYWxzLmlzQ2FwdHVyZWQodmFyaWFibGUpKSB7CiAgICAgIGFzbS5lbWl0U3RvcmVDb250ZXh0VmFyKGxvY2Fscy5nZXRWYXJDb250ZXh0SWQodmFyaWFibGUpLAogICAgICAgICAgbG9jYWxzLmdldFZhckluZGV4SW5Db250ZXh0KHZhcmlhYmxlKSk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5nZXRWYXJJbmRleEluRnJhbWUodmFyaWFibGUpKTsKICAgIH0KICB9CgogIC8vLyBHZW5lcmF0ZXMgYm9vbCBjb25kaXRpb24uIFJldHVybnMgYHRydWVgIGlmIGNvbmRpdGlvbiBpcyBuZWdhdGVkLgogIGJvb2wgX2dlbkNvbmRpdGlvbihFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgYm9vbCBuZWdhdGVkID0gZmFsc2U7CiAgICBpZiAoY29uZGl0aW9uIGlzIE5vdCkgewogICAgICBjb25kaXRpb24gPSAoY29uZGl0aW9uIGFzIE5vdCkub3BlcmFuZDsKICAgICAgbmVnYXRlZCA9IHRydWU7CiAgICB9CiAgICBfZ2VuZXJhdGVOb2RlKGNvbmRpdGlvbik7CiAgICBpZiAobnVsbGFiaWxpdHlEZXRlY3Rvci5pc051bGxhYmxlKGNvbmRpdGlvbikpIHsKICAgICAgYXNtLmVtaXRBc3NlcnRCb29sZWFuKDApOwogICAgfQogICAgcmV0dXJuIG5lZ2F0ZWQ7CiAgfQoKICAvLy8gUmV0dXJucyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpZiBpdCBpcyBhIGJvb2wgY29uc3RhbnQuCiAgLy8vIE90aGVyd2lzZSwgcmV0dXJucyBgbnVsbGAuCiAgYm9vbCBfY29uc3RhbnRDb25kaXRpb25WYWx1ZShFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgaWYgKG9wdGlvbnMua2VlcFVucmVhY2hhYmxlQ29kZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIFRPRE8oZGFydGJ1Zy5jb20vMzQ1ODUpOiB1c2UgY29uc3RhbnQgZXZhbHVhdG9yIHRvIGV2YWx1YXRlCiAgICAvLyBleHByZXNzaW9ucyBpbiBhIG5vbi1jb25zdGFudCBjb250ZXh0LgogICAgaWYgKGNvbmRpdGlvbiBpcyBOb3QpIHsKICAgICAgZmluYWwgb3BlcmFuZCA9IF9jb25zdGFudENvbmRpdGlvblZhbHVlKGNvbmRpdGlvbi5vcGVyYW5kKTsKICAgICAgcmV0dXJuIChvcGVyYW5kICE9IG51bGwpID8gIW9wZXJhbmQgOiBudWxsOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBCb29sTGl0ZXJhbCkgewogICAgICByZXR1cm4gY29uZGl0aW9uLnZhbHVlOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgQ29uc3RhbnQgY29uc3RhbnQgPSBjb25kaXRpb24uY29uc3RhbnQ7CiAgICAgIGlmIChjb25zdGFudCBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gY29uc3RhbnQudmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBfZ2VuQ29uZGl0aW9uQW5kSnVtcElmKEV4cHJlc3Npb24gY29uZGl0aW9uLCBib29sIHZhbHVlLCBMYWJlbCBkZXN0KSB7CiAgICBmaW5hbCBib29sIGNvbnN0YW50VmFsdWUgPSBfY29uc3RhbnRDb25kaXRpb25WYWx1ZShjb25kaXRpb24pOwogICAgaWYgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCkgewogICAgICBpZiAoY29uc3RhbnRWYWx1ZSA9PSB2YWx1ZSkgewogICAgICAgIGFzbS5lbWl0SnVtcChkZXN0KTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY29uZGl0aW9uIGlzIE1ldGhvZEludm9jYXRpb24gJiYKICAgICAgICBjb25kaXRpb24ubmFtZS5uYW1lID09ICc9PScgJiYKICAgICAgICAoY29uZGl0aW9uLnJlY2VpdmVyIGlzIE51bGxMaXRlcmFsIHx8CiAgICAgICAgICAgIGNvbmRpdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGUgaXMgTnVsbExpdGVyYWwpKSB7CiAgICAgIGlmIChjb25kaXRpb24ucmVjZWl2ZXIgaXMgTnVsbExpdGVyYWwpIHsKICAgICAgICBfZ2VuZXJhdGVOb2RlKGNvbmRpdGlvbi5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGUpOwogICAgICB9IGVsc2UgewogICAgICAgIF9nZW5lcmF0ZU5vZGUoY29uZGl0aW9uLnJlY2VpdmVyKTsKICAgICAgfQogICAgICBpZiAob3B0aW9ucy5lbWl0RGVidWdnZXJTdG9wcyAmJgogICAgICAgICAgY29uZGl0aW9uLmZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgICBmaW5hbCBzYXZlZFNvdXJjZVBvc2l0aW9uID0gYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbjsKICAgICAgICBfcmVjb3JkU291cmNlUG9zaXRpb24oY29uZGl0aW9uLmZpbGVPZmZzZXQpOwogICAgICAgIGFzbS5lbWl0RGVidWdDaGVjaygpOwogICAgICAgIGFzbS5jdXJyZW50U291cmNlUG9zaXRpb24gPSBzYXZlZFNvdXJjZVBvc2l0aW9uOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGFzbS5lbWl0SnVtcElmTnVsbChkZXN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdEp1bXBJZk5vdE51bGwoZGVzdCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBOb3QpIHsKICAgICAgX2dlbkNvbmRpdGlvbkFuZEp1bXBJZihjb25kaXRpb24ub3BlcmFuZCwgIXZhbHVlLCBkZXN0KTsKICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uIGlzIExvZ2ljYWxFeHByZXNzaW9uKSB7CiAgICAgIGFzc2VydChjb25kaXRpb24ub3BlcmF0b3IgPT0gJ3x8JyB8fCBjb25kaXRpb24ub3BlcmF0b3IgPT0gJyYmJyk7CiAgICAgIGZpbmFsIGlzT1IgPSAoY29uZGl0aW9uLm9wZXJhdG9yID09ICd8fCcpOwoKICAgICAgTGFiZWwgc2hvcnRDaXJjdWl0LCBkb25lOwogICAgICBpZiAoaXNPUiA9PSB2YWx1ZSkgewogICAgICAgIHNob3J0Q2lyY3VpdCA9IGRlc3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2hvcnRDaXJjdWl0ID0gZG9uZSA9IG5ldyBMYWJlbCgpOwogICAgICB9CiAgICAgIF9nZW5Db25kaXRpb25BbmRKdW1wSWYoY29uZGl0aW9uLmxlZnQsIGlzT1IsIHNob3J0Q2lyY3VpdCk7CiAgICAgIF9nZW5Db25kaXRpb25BbmRKdW1wSWYoY29uZGl0aW9uLnJpZ2h0LCB2YWx1ZSwgZGVzdCk7CiAgICAgIGlmIChkb25lICE9IG51bGwpIHsKICAgICAgICBhc20uYmluZChkb25lKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYm9vbCBuZWdhdGVkID0gX2dlbkNvbmRpdGlvbihjb25kaXRpb24pOwogICAgICBpZiAobmVnYXRlZCkgewogICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGFzbS5lbWl0SnVtcElmVHJ1ZShkZXN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdEp1bXBJZkZhbHNlKGRlc3QpOwogICAgICB9CiAgICB9CiAgfQoKICBpbnQgX2dldERlZmF1bHRQYXJhbUNvbnN0SW5kZXgoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSkgewogICAgaWYgKHBhcmFtLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNwLmFkZE9iamVjdFJlZihudWxsKTsKICAgIH0KICAgIGZpbmFsIGNvbnN0YW50ID0gX2dldENvbnN0YW50KHBhcmFtLmluaXRpYWxpemVyKTsKICAgIHJldHVybiBjcC5hZGRPYmplY3RSZWYoY29uc3RhbnQpOwogIH0KCiAgLy8gRHVwbGljYXRlcyB2YWx1ZSBvbiB0b3Agb2YgdGhlIHN0YWNrIHVzaW5nIHRlbXBvcmFyeSB2YXJpYWJsZSB3aXRoCiAgLy8gZ2l2ZW4gaW5kZXguCiAgdm9pZCBfZ2VuRHVwVE9TKGludCB0ZW1wSW5kZXhJbkZyYW1lKSB7CiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBDb25zaWRlciBpbnRyb2R1Y2luZyBEdXAgYnl0ZWNvZGUgb3Iga2VlcGluZyB0cmFjayBvZgogICAgLy8gZXhwcmVzc2lvbiBzdGFjayBkZXB0aC4KICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wSW5kZXhJbkZyYW1lKTsKICAgIGFzbS5lbWl0UHVzaCh0ZW1wSW5kZXhJbkZyYW1lKTsKICB9CgogIC8vLyBHZW5lcmF0ZXMgaXMtdGVzdCBmb3IgdGhlIHZhbHVlIGF0IFRPUy4KICB2b2lkIF9nZW5JbnN0YW5jZU9mKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlRW52aXJvbm1lbnQuaXNUb3AodHlwZSkpIHsKICAgICAgYXNtLmVtaXREcm9wMSgpOwogICAgICBhc20uZW1pdFB1c2hUcnVlKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgKHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5IHx8IGlzQWxsRHluYW1pYyh0eXBlLnR5cGVBcmd1bWVudHMpKSkgewogICAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGRUeXBlKHR5cGUpKTsKICAgICAgZmluYWwgYXJnRGVzYyA9IG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMik7CiAgICAgIGZpbmFsIGNwSW5kZXggPSBjcC5hZGRJbnRlcmZhY2VDYWxsKAogICAgICAgICAgSW52b2NhdGlvbktpbmQubWV0aG9kLCBvYmplY3RTaW1wbGVJbnN0YW5jZU9mLCBhcmdEZXNjKTsKICAgICAgYXNtLmVtaXRJbnRlcmZhY2VDYWxsKGNwSW5kZXgsIDIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGhhc0ZyZWVUeXBlUGFyYW1ldGVycyhbdHlwZV0pKSB7CiAgICAgIF9nZW5QdXNoSW5zdGFudGlhdG9yQW5kRnVuY3Rpb25UeXBlQXJndW1lbnRzKFt0eXBlXSk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdFB1c2hOdWxsKCk7IC8vIEluc3RhbnRpYXRvciB0eXBlIGFyZ3VtZW50cy4KICAgICAgYXNtLmVtaXRQdXNoTnVsbCgpOyAvLyBGdW5jdGlvbiB0eXBlIGFyZ3VtZW50cy4KICAgIH0KICAgIGFzbS5lbWl0UHVzaENvbnN0YW50KGNwLmFkZFR5cGUodHlwZSkpOwogICAgX2dlblB1c2hObmJkTW9kZSgpOwogICAgZmluYWwgYXJnRGVzYyA9IG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoNSk7CiAgICBmaW5hbCBjcEluZGV4ID0KICAgICAgICBjcC5hZGRJbnRlcmZhY2VDYWxsKEludm9jYXRpb25LaW5kLm1ldGhvZCwgb2JqZWN0SW5zdGFuY2VPZiwgYXJnRGVzYyk7CiAgICBhc20uZW1pdEludGVyZmFjZUNhbGwoY3BJbmRleCwgNSk7CiAgfQoKICB2b2lkIHN0YXJ0KE1lbWJlciBub2RlLCBib29sIGhhc0NvZGUpIHsKICAgIGVuY2xvc2luZ0NsYXNzID0gbm9kZS5lbmNsb3NpbmdDbGFzczsKICAgIGVuY2xvc2luZ01lbWJlciA9IG5vZGU7CiAgICBlbmNsb3NpbmdGdW5jdGlvbiA9IG5vZGUuZnVuY3Rpb247CiAgICBwYXJlbnRGdW5jdGlvbiA9IG51bGw7CiAgICBpc0Nsb3N1cmUgPSBmYWxzZTsKICAgIGhhc0Vycm9ycyA9IGZhbHNlOwogICAgc3RhdGljVHlwZUNvbnRleHQuZW50ZXJNZW1iZXIobm9kZSk7CiAgICBmaW5hbCBpc0ZhY3RvcnkgPSBub2RlIGlzIFByb2NlZHVyZSAmJiBub2RlLmlzRmFjdG9yeTsKICAgIGlmIChub2RlLmlzSW5zdGFuY2VNZW1iZXIgfHwgbm9kZSBpcyBDb25zdHJ1Y3RvciB8fCBpc0ZhY3RvcnkpIHsKICAgICAgaWYgKGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgICAgbmV3IFNldDxUeXBlUGFyYW1ldGVyPi5mcm9tKGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzKTsKICAgICAgICAvLyBUcmVhdCB0eXBlIGFyZ3VtZW50cyBvZiBmYWN0b3J5IGNvbnN0cnVjdG9ycyBhcyBjbGFzcwogICAgICAgIC8vIHR5cGUgcGFyYW1ldGVycy4KICAgICAgICBpZiAoaXNGYWN0b3J5KSB7CiAgICAgICAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzLmFkZEFsbChub2RlLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGhhc0luc3RhbnRpYXRvclR5cGVBcmd1bWVudHMoZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgICAgZmluYWwgdHlwZVBhcmFtZXRlcnMgPSBnZXRUeXBlUGFyYW1ldGVyVHlwZXMoaXNGYWN0b3J5CiAgICAgICAgICAgID8gbm9kZS5mdW5jdGlvbi50eXBlUGFyYW1ldGVycwogICAgICAgICAgICA6IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzKTsKICAgICAgICBpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzID0KICAgICAgICAgICAgZmxhdHRlbkluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMoZW5jbG9zaW5nQ2xhc3MsIHR5cGVQYXJhbWV0ZXJzKTsKICAgICAgfQogICAgfQogICAgaWYgKGVuY2xvc2luZ0Z1bmN0aW9uICE9IG51bGwgJiYKICAgICAgICBlbmNsb3NpbmdGdW5jdGlvbi50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZnJvbShlbmNsb3NpbmdGdW5jdGlvbi50eXBlUGFyYW1ldGVycyk7CiAgICAgIGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnNTZXQgPSBmdW5jdGlvblR5cGVQYXJhbWV0ZXJzLnRvU2V0KCk7CiAgICB9CiAgICBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgPSBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5ICE9IG51bGwKICAgICAgICA/IHByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YVJlcG9zaXRvcnkubWFwcGluZ1tub2RlXQogICAgICAgIDogbnVsbDsKCiAgICBpZiAoaW5mZXJyZWRUeXBlTWV0YWRhdGEgIT0gbnVsbCkgewogICAgICBpZiAobm9kZSBpcyBGaWVsZCkgewogICAgICAgIC8vIEZpZWxkIHR5cGUgaXMgYXQgUEMgPSAtMS4KICAgICAgICBfYXBwZW5kSW5mZXJyZWRUeXBlKG5vZGUsIC0xKTsKICAgICAgfSBlbHNlIGlmIChlbmNsb3NpbmdGdW5jdGlvbiAhPSBudWxsICYmIGhhc0NvZGUpIHsKICAgICAgICBhc3NlcnQobm9kZSBpcyBQcm9jZWR1cmUgfHwgbm9kZSBpcyBDb25zdHJ1Y3Rvcik7CiAgICAgICAgLy8gUGFyYW1ldGVyIHR5cGVzIGFyZSBhdCBQQyA9IC1OLC4uLC0xIHdoZXJlIE4gLSBudW1iZXIgb2YgZGVjbGFyZWQKICAgICAgICAvLyAoZXhwbGljaXQpIHBhcmFtZXRlcnMuCiAgICAgICAgaW50IGkgPSAtKGVuY2xvc2luZ0Z1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCArCiAgICAgICAgICAgIGVuY2xvc2luZ0Z1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIHYgaW4gZW5jbG9zaW5nRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgICAgIF9hcHBlbmRJbmZlcnJlZFR5cGUodiwgaSk7CiAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHYgaW4gZW5jbG9zaW5nRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICBfYXBwZW5kSW5mZXJyZWRUeXBlKHYsIGkpOwogICAgICAgICAgKytpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICghaGFzQ29kZSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgbGFiZWxlZFN0YXRlbWVudHMgPSBudWxsOwogICAgc3dpdGNoQ2FzZXMgPSBudWxsOwogICAgdHJ5Q2F0Y2hlcyA9IG51bGw7CiAgICBmaW5hbGx5QmxvY2tzID0gbnVsbDsKICAgIHlpZWxkUG9pbnRzID0gbnVsbDsgLy8gSW5pdGlhbGl6ZWQgd2hlbiBlbnRlcmluZyBzeW5jLXlpZWxkaW5nIGNsb3N1cmUuCiAgICBjb250ZXh0TGV2ZWxzID0gbnVsbDsKICAgIGNsb3N1cmVzID0gbnVsbDsKICAgIGluaXRpYWxpemVkRmllbGRzID0gbnVsbDsgLy8gVHJhY2tlZCBmb3IgY29uc3RydWN0b3JzIG9ubHkuCiAgICBudWxsYWJsZUZpZWxkcyA9IGNvbnN0IDxPYmplY3RIYW5kbGU+W107CiAgICBjcCA9IG5ldyBDb25zdGFudFBvb2woc3RyaW5nVGFibGUsIG9iamVjdFRhYmxlKTsKICAgIGFzbSA9IG5ldyBCeXRlY29kZUFzc2VtYmxlcihvcHRpb25zKTsKICAgIHNhdmVkQXNzZW1ibGVycyA9IG51bGw7CiAgICBjdXJyZW50TG9vcERlcHRoID0gMDsKICAgIHNhdmVkTWF4U291cmNlUG9zaXRpb25zID0gPGludD5bXTsKICAgIG1heFNvdXJjZVBvc2l0aW9uID0gbm9kZS5maWxlT2Zmc2V0OwoKICAgIGxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlcygKICAgICAgICBub2RlLCBvcHRpb25zLCBzdGF0aWNUeXBlQ29udGV4dCwgZGlyZWN0Q2FsbE1ldGFkYXRhKTsKICAgIGxvY2Fscy5lbnRlclNjb3BlKG5vZGUpOwogICAgYXNzZXJ0KCFsb2NhbHMuaXNTeW5jWWllbGRpbmdGcmFtZSk7CgogICAgaW50IHBvc2l0aW9uOwogICAgaWYgKG5vZGUgaXMgUHJvY2VkdXJlKSB7CiAgICAgIHBvc2l0aW9uID0gbm9kZS5zdGFydEZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgcG9zaXRpb24gPSBub2RlLnN0YXJ0RmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIHBvc2l0aW9uID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfQogICAgX3JlY29yZFNvdXJjZVBvc2l0aW9uKHBvc2l0aW9uKTsKICAgIF9nZW5Qcm9sb2d1ZShub2RlLCBub2RlLmZ1bmN0aW9uKTsKICAgIF9zZXR1cEluaXRpYWxDb250ZXh0KG5vZGUuZnVuY3Rpb24pOwogICAgX2VtaXRGaXJzdERlYnVnQ2hlY2sobm9kZS5mdW5jdGlvbik7CiAgICBpZiAobm9kZSBpcyBQcm9jZWR1cmUgJiYgbm9kZS5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIF9jaGVja0FyZ3VtZW50cyhub2RlLmZ1bmN0aW9uKTsKICAgIH0KICAgIF9nZW5FcXVhbHNPcGVyYXRvck51bGxIYW5kbGluZyhub2RlKTsKICB9CgogIHZvaWQgX2FwcGVuZEluZmVycmVkVHlwZShUcmVlTm9kZSBub2RlLCBpbnQgcGMpIHsKICAgIGZpbmFsIEluZmVycmVkVHlwZSBtZCA9IGluZmVycmVkVHlwZU1ldGFkYXRhW25vZGVdOwogICAgaWYgKG1kID09IG51bGwgfHwgKHBjID49IDAgJiYgYXNtLmlzVW5yZWFjaGFibGUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGluZmVycmVkVHlwZXNBdHRyaWJ1dGUgPz89IDxDb25zdGFudD5bXTsKICAgIC8vIExpc3Qgb2YgdHJpcGxldHMgKFBDLCBjb25jcmV0ZUNsYXNzLCBmbGFncykuCiAgICAvLyBWZXJpZnkgdGhhdCBQQ3MgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KICAgIGFzc2VydChpbmZlcnJlZFR5cGVzQXR0cmlidXRlLmlzRW1wdHkgfHwKICAgICAgICAoaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZVtpbmZlcnJlZFR5cGVzQXR0cmlidXRlLmxlbmd0aCAtIDNdCiAgICAgICAgICAgICAgICAgICAgYXMgSW50Q29uc3RhbnQpCiAgICAgICAgICAgICAgICAudmFsdWUgPAogICAgICAgICAgICBwYyk7CiAgICBpbmZlcnJlZFR5cGVzQXR0cmlidXRlLmFkZChJbnRDb25zdGFudChwYykpOwogICAgQ2xhc3MgY29uY3JldGVDbGFzcyA9IG1kLmNvbmNyZXRlQ2xhc3M7CiAgICAvLyBWTSB1c2VzIG1vcmUgc3BlY2lmaWMgZnVuY3Rpb24gdHlwZSBhbmQgZG9lc24ndCBleHBlY3QgdG8KICAgIC8vIHNlZSBpbmZlcnJlZCBfQ2xvc3VyZSBjbGFzcy4KICAgIGlmIChjb25jcmV0ZUNsYXNzICE9IG51bGwgJiYgY29uY3JldGVDbGFzcyAhPSBjbG9zdXJlQ2xhc3MpIHsKICAgICAgaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZS5hZGQoVHlwZUxpdGVyYWxDb25zdGFudChjb3JlVHlwZXMucmF3VHlwZSgKICAgICAgICAgIGNvbmNyZXRlQ2xhc3MsCiAgICAgICAgICAoY29uY3JldGVDbGFzcyA9PSBjb3JlVHlwZXMubnVsbENsYXNzKQogICAgICAgICAgICAgID8gTnVsbGFiaWxpdHkubnVsbGFibGUKICAgICAgICAgICAgICA6IHN0YXRpY1R5cGVDb250ZXh0Lm5vbk51bGxhYmxlKSkpOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZS5hZGQoTnVsbENvbnN0YW50KCkpOwogICAgfQogICAgLy8gSW5mZXJyZWQgY29uc3RhbnQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIGJ5dGVjb2RlIGdlbmVyYXRvcgogICAgLy8gKF9yZXBsYWNlV2l0aENvbnN0YW50VmFsdWUsIF9pbml0Q29uc3RhbnRQYXJhbWV0ZXJzKSBhbmQKICAgIC8vIG5vdCBwcm9wYWdhdGVkIHRvIFZNLgogICAgZmluYWwgZmxhZ3MgPSBtZC5mbGFncyAmIH5JbmZlcnJlZFR5cGUuZmxhZ0NvbnN0YW50OwogICAgaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZS5hZGQoSW50Q29uc3RhbnQoZmxhZ3MpKTsKICB9CgogIHZvaWQgX3JlcGxhY2VXaXRoQ29uc3RhbnRWYWx1ZShUcmVlTm9kZSBub2RlKSB7CiAgICBmaW5hbCBJbmZlcnJlZFR5cGUgbWQgPSBpbmZlcnJlZFR5cGVNZXRhZGF0YVtub2RlXTsKICAgIGlmIChtZCA9PSBudWxsIHx8IG1kLmNvbnN0YW50VmFsdWUgPT0gbnVsbCB8fCBhc20uaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBhc20uZW1pdERyb3AxKCk7CiAgICBfZ2VuUHVzaENvbnN0YW50KG1kLmNvbnN0YW50VmFsdWUpOwogIH0KCiAgLy8gR2VuZXJhdGUgYWRkaXRpb25hbCBjb2RlIGZvciAnb3BlcmF0b3IgPT0nIHRvIGhhbmRsZSBudWxscy4KICB2b2lkIF9nZW5FcXVhbHNPcGVyYXRvck51bGxIYW5kbGluZyhNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLm5hbWUubmFtZSAhPSAnPT0nIHx8CiAgICAgICAgbG9jYWxzLm51bVBhcmFtZXRlcnMgIT0gMiB8fAogICAgICAgIG1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PSBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIExhYmVsIGRvbmUgPSBuZXcgTGFiZWwoKTsKCiAgICBfZ2VuTG9hZFZhcihtZW1iZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbMF0pOwogICAgYXNtLmVtaXRKdW1wSWZOb3ROdWxsKGRvbmUpOwoKICAgIGFzbS5lbWl0UHVzaEZhbHNlKCk7CiAgICBfZ2VuUmV0dXJuVE9TKCk7CgogICAgYXNtLmJpbmQoZG9uZSk7CiAgfQoKICB2b2lkIGVuZChNZW1iZXIgbm9kZSwgYm9vbCBoYXNDb2RlKSB7CiAgICBpZiAoIWhhc0Vycm9ycykgewogICAgICBDb2RlIGNvZGU7CiAgICAgIGlmIChoYXNDb2RlKSB7CiAgICAgICAgaWYgKG9wdGlvbnMuZW1pdExvY2FsVmFySW5mbykgewogICAgICAgICAgLy8gTGVhdmUgdGhlIHNjb3BlcyB3aGljaCB3ZXJlIGVudGVyZWQgaW4gX2dlblByb2xvZ3VlIGFuZAogICAgICAgICAgLy8gX3NldHVwSW5pdGlhbENvbnRleHQuCiAgICAgICAgICBhc20ubG9jYWxWYXJpYWJsZVRhYmxlLmxlYXZlQWxsU2NvcGVzKAogICAgICAgICAgICAgIGFzbS5vZmZzZXQsCiAgICAgICAgICAgICAgbm9kZS5mdW5jdGlvbiAhPSBudWxsCiAgICAgICAgICAgICAgICAgID8gbm9kZS5mdW5jdGlvbi5maWxlRW5kT2Zmc2V0CiAgICAgICAgICAgICAgICAgIDogbm9kZS5maWxlRW5kT2Zmc2V0KTsKICAgICAgICB9CgogICAgICAgIExpc3Q8aW50PiBwYXJhbWV0ZXJGbGFncyA9IG51bGw7CiAgICAgICAgaW50IGZvcndhcmRpbmdTdHViVGFyZ2V0Q3BJbmRleCA9IG51bGw7CiAgICAgICAgaW50IGRlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleCA9IG51bGw7CgogICAgICAgIGlmIChub2RlIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgICAgICBwYXJhbWV0ZXJGbGFncyA9IGdldFBhcmFtZXRlckZsYWdzKG5vZGUuZnVuY3Rpb24pOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBQcm9jZWR1cmUpIHsKICAgICAgICAgIHBhcmFtZXRlckZsYWdzID0gZ2V0UGFyYW1ldGVyRmxhZ3Mobm9kZS5mdW5jdGlvbik7CgogICAgICAgICAgaWYgKG5vZGUuaXNGb3J3YXJkaW5nU3R1YikgewogICAgICAgICAgICBmb3J3YXJkaW5nU3R1YlRhcmdldENwSW5kZXggPQogICAgICAgICAgICAgICAgY3AuYWRkT2JqZWN0UmVmKG5vZGUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCk7CiAgICAgICAgICB9CgogICAgICAgICAgZmluYWwgZGVmYXVsdFR5cGVzID0gZ2V0RGVmYXVsdEZ1bmN0aW9uVHlwZUFyZ3VtZW50cyhub2RlLmZ1bmN0aW9uKTsKICAgICAgICAgIGlmIChkZWZhdWx0VHlwZXMgIT0gbnVsbCkgewogICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb25UeXBlQXJnc0NwSW5kZXggPSBjcC5hZGRUeXBlQXJndW1lbnRzKGRlZmF1bHRUeXBlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvZGUgPSBuZXcgQ29kZSgKICAgICAgICAgICAgY3AsCiAgICAgICAgICAgIGFzbS5ieXRlY29kZSwKICAgICAgICAgICAgYXNtLmV4Y2VwdGlvbnNUYWJsZSwKICAgICAgICAgICAgZmluYWxpemVTb3VyY2VQb3NpdGlvbnMoKSwKICAgICAgICAgICAgZmluYWxpemVMb2NhbFZhcmlhYmxlcygpLAogICAgICAgICAgICBudWxsYWJsZUZpZWxkcywKICAgICAgICAgICAgY2xvc3VyZXMgPz8gY29uc3QgPENsb3N1cmVEZWNsYXJhdGlvbj5bXSwKICAgICAgICAgICAgcGFyYW1ldGVyRmxhZ3MsCiAgICAgICAgICAgIGZvcndhcmRpbmdTdHViVGFyZ2V0Q3BJbmRleCwKICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uVHlwZUFyZ3NDcEluZGV4KTsKICAgICAgICBieXRlY29kZUNvbXBvbmVudC5jb2Rlcy5hZGQoY29kZSk7CiAgICAgIH0KICAgICAgaWYgKG5vZGUgaXMgRmllbGQpIHsKICAgICAgICBmaWVsZERlY2xhcmF0aW9ucy5hZGQoZ2V0RmllbGREZWNsYXJhdGlvbihub2RlLCBjb2RlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZnVuY3Rpb25EZWNsYXJhdGlvbnMuYWRkKGdldEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSwgY29kZSkpOwogICAgICB9CiAgICB9CgogICAgc3RhdGljVHlwZUNvbnRleHQubGVhdmVNZW1iZXIobm9kZSk7CiAgICBlbmNsb3NpbmdDbGFzcyA9IG51bGw7CiAgICBlbmNsb3NpbmdNZW1iZXIgPSBudWxsOwogICAgZW5jbG9zaW5nRnVuY3Rpb24gPSBudWxsOwogICAgcGFyZW50RnVuY3Rpb24gPSBudWxsOwogICAgaXNDbG9zdXJlID0gbnVsbDsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnMgPSBudWxsOwogICAgZnVuY3Rpb25UeXBlUGFyYW1ldGVycyA9IG51bGw7CiAgICBmdW5jdGlvblR5cGVQYXJhbWV0ZXJzU2V0ID0gbnVsbDsKICAgIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMgPSBudWxsOwogICAgbG9jYWxzID0gbnVsbDsKICAgIGxhYmVsZWRTdGF0ZW1lbnRzID0gbnVsbDsKICAgIHN3aXRjaENhc2VzID0gbnVsbDsKICAgIHRyeUNhdGNoZXMgPSBudWxsOwogICAgZmluYWxseUJsb2NrcyA9IG51bGw7CiAgICB5aWVsZFBvaW50cyA9IG51bGw7CiAgICBjb250ZXh0TGV2ZWxzID0gbnVsbDsKICAgIGNsb3N1cmVzID0gbnVsbDsKICAgIGluaXRpYWxpemVkRmllbGRzID0gbnVsbDsKICAgIG51bGxhYmxlRmllbGRzID0gbnVsbDsKICAgIGNwID0gbnVsbDsKICAgIGFzbSA9IG51bGw7CiAgICBzYXZlZEFzc2VtYmxlcnMgPSBudWxsOwogICAgaGFzRXJyb3JzID0gZmFsc2U7CiAgICBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgPSBudWxsOwogICAgaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZSA9IG51bGw7CiAgfQoKICBTb3VyY2VQb3NpdGlvbnMgZmluYWxpemVTb3VyY2VQb3NpdGlvbnMoKSB7CiAgICBpZiAoYXNtLnNvdXJjZVBvc2l0aW9ucy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYnl0ZWNvZGVDb21wb25lbnQuc291cmNlUG9zaXRpb25zLmFkZChhc20uc291cmNlUG9zaXRpb25zKTsKICAgIHJldHVybiBhc20uc291cmNlUG9zaXRpb25zOwogIH0KCiAgTG9jYWxWYXJpYWJsZVRhYmxlIGZpbmFsaXplTG9jYWxWYXJpYWJsZXMoKSB7CiAgICBmaW5hbCBsb2NhbFZhcmlhYmxlcyA9IGFzbS5sb2NhbFZhcmlhYmxlVGFibGU7CiAgICBhc3NlcnQoIWxvY2FsVmFyaWFibGVzLmhhc0FjdGl2ZVNjb3Blcyk7CiAgICBpZiAobG9jYWxWYXJpYWJsZXMuaXNFbXB0eSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGJ5dGVjb2RlQ29tcG9uZW50LmxvY2FsVmFyaWFibGVzLmFkZChsb2NhbFZhcmlhYmxlcyk7CiAgICByZXR1cm4gbG9jYWxWYXJpYWJsZXM7CiAgfQoKICB2b2lkIF9nZW5Qcm9sb2d1ZShOb2RlIG5vZGUsIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgaWYgKGxvY2Fscy5oYXNPcHRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgZmluYWwgaW50IG51bU9wdGlvbmFsUG9zaXRpb25hbCA9IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAtCiAgICAgICAgICBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgICBmaW5hbCBpbnQgbnVtT3B0aW9uYWxOYW1lZCA9IGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIGZpbmFsIGludCBudW1GaXhlZCA9CiAgICAgICAgICBsb2NhbHMubnVtUGFyYW1ldGVycyAtIChudW1PcHRpb25hbFBvc2l0aW9uYWwgKyBudW1PcHRpb25hbE5hbWVkKTsKCiAgICAgIGFzbS5lbWl0RW50cnlPcHRpb25hbChudW1GaXhlZCwgbnVtT3B0aW9uYWxQb3NpdGlvbmFsLCBudW1PcHRpb25hbE5hbWVkKTsKCiAgICAgIGlmIChudW1PcHRpb25hbFBvc2l0aW9uYWwgIT0gMCkgewogICAgICAgIGFzc2VydChudW1PcHRpb25hbE5hbWVkID09IDApOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT3B0aW9uYWxQb3NpdGlvbmFsOyBpKyspIHsKICAgICAgICAgIGZpbmFsIHBhcmFtID0gZnVuY3Rpb24KICAgICAgICAgICAgICAucG9zaXRpb25hbFBhcmFtZXRlcnNbZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCArIGldOwogICAgICAgICAgYXNtLmVtaXRMb2FkQ29uc3RhbnQobnVtRml4ZWQgKyBpLCBfZ2V0RGVmYXVsdFBhcmFtQ29uc3RJbmRleChwYXJhbSkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQobnVtT3B0aW9uYWxOYW1lZCAhPSAwKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9wdGlvbmFsTmFtZWQ7IGkrKykgewogICAgICAgICAgZmluYWwgcGFyYW0gPSBsb2NhbHMuc29ydGVkTmFtZWRQYXJhbWV0ZXJzW2ldOwogICAgICAgICAgYXNtLmVtaXRMb2FkQ29uc3RhbnQobnVtRml4ZWQgKyBpLCBjcC5hZGROYW1lKHBhcmFtLm5hbWUpKTsKICAgICAgICAgIGFzbS5lbWl0TG9hZENvbnN0YW50KG51bUZpeGVkICsgaSwgX2dldERlZmF1bHRQYXJhbUNvbnN0SW5kZXgocGFyYW0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzbS5lbWl0RnJhbWUobG9jYWxzLmZyYW1lU2l6ZSAtIGxvY2Fscy5udW1QYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSBpZiAoaXNDbG9zdXJlKSB7CiAgICAgIGFzbS5lbWl0RW50cnlGaXhlZChsb2NhbHMubnVtUGFyYW1ldGVycywgbG9jYWxzLmZyYW1lU2l6ZSk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdEVudHJ5KGxvY2Fscy5mcmFtZVNpemUpOwogICAgfQoKICAgIGlmIChpc0Nsb3N1cmUpIHsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5jbG9zdXJlVmFySW5kZXhJbkZyYW1lKTsKICAgICAgYXNtLmVtaXRMb2FkRmllbGRUT1MoY3AuYWRkSW5zdGFuY2VGaWVsZChjbG9zdXJlQ29udGV4dCkpOwogICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5jb250ZXh0VmFySW5kZXhJbkZyYW1lKTsKICAgIH0KCiAgICBpZiAobG9jYWxzLmhhc0Z1bmN0aW9uVHlwZUFyZ3NWYXIgJiYgZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBhc3NlcnQoIShub2RlIGlzIFByb2NlZHVyZSAmJiBub2RlLmlzRmFjdG9yeSkpOwoKICAgICAgTGFiZWwgZG9uZSA9IG5ldyBMYWJlbCgpOwoKICAgICAgaWYgKGlzQ2xvc3VyZSkgewogICAgICAgIF9oYW5kbGVEZWxheWVkVHlwZUFyZ3VtZW50cyhkb25lKTsKICAgICAgfQoKICAgICAgYXNtLmVtaXRDaGVja0Z1bmN0aW9uVHlwZUFyZ3MoZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgbG9jYWxzLmZ1bmN0aW9uVHlwZUFyZ3NWYXJJbmRleEluRnJhbWUpOwoKICAgICAgX2hhbmRsZURlZmF1bHRUeXBlQXJndW1lbnRzKGZ1bmN0aW9uLCBkb25lKTsKCiAgICAgIGFzbS5iaW5kKGRvbmUpOwogICAgfSBlbHNlIGlmIChpc0Nsb3N1cmUgJiYKICAgICAgICAhKHBhcmVudEZ1bmN0aW9uICE9IG51bGwgJiYKICAgICAgICAgICAgcGFyZW50RnVuY3Rpb24uZGFydEFzeW5jTWFya2VyICE9IEFzeW5jTWFya2VyLlN5bmMpKSB7CiAgICAgIC8vIENsb3N1cmVzIGNhbiBiZSBjYWxsZWQgZHluYW1pY2FsbHkgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLAogICAgICAvLyBzbyB0aGV5IHNob3VsZCBjaGVjayBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMsIGV2ZW4gaWYKICAgICAgLy8gY2xvc3VyZSBpcyBub3QgZ2VuZXJpYy4KICAgICAgLy8gU3ludGhldGljIGFzeW5jX29wIGNsb3N1cmVzIGRvbid0IG5lZWQgdGhpcyBjaGVjay4KICAgICAgYXNtLmVtaXRDaGVja0Z1bmN0aW9uVHlwZUFyZ3MoMCwgbG9jYWxzLnNjcmF0Y2hWYXJJbmRleEluRnJhbWUpOwogICAgfQoKICAgIC8vIE9wZW4gaW5pdGlhbCBzY29wZSBiZWZvcmUgdGhlIGZpcnN0IENoZWNrU3RhY2ssIGFzIFZNIG1pZ2h0CiAgICAvLyBuZWVkIHRvIGtub3cgY29udGV4dCBsZXZlbC4KICAgIGlmIChvcHRpb25zLmVtaXRMb2NhbFZhckluZm8gJiYgZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBhc20ubG9jYWxWYXJpYWJsZVRhYmxlLmVudGVyU2NvcGUoCiAgICAgICAgICBhc20ub2Zmc2V0LAogICAgICAgICAgaXNDbG9zdXJlID8gbG9jYWxzLmNvbnRleHRMZXZlbEF0RW50cnkgOiBsb2NhbHMuY3VycmVudENvbnRleHRMZXZlbCwKICAgICAgICAgIGZ1bmN0aW9uLmZpbGVPZmZzZXQpOwogICAgICBpZiAobG9jYWxzLmhhc0NvbnRleHRWYXIpIHsKICAgICAgICBhc20ubG9jYWxWYXJpYWJsZVRhYmxlCiAgICAgICAgICAgIC5yZWNvcmRDb250ZXh0VmFyaWFibGUoYXNtLm9mZnNldCwgbG9jYWxzLmNvbnRleHRWYXJJbmRleEluRnJhbWUpOwogICAgICB9CiAgICAgIGlmIChsb2NhbHMuaGFzUmVjZWl2ZXIgJiYKICAgICAgICAgICghaXNDbG9zdXJlIHx8IGxvY2Fscy5pc0NhcHR1cmVkKGxvY2Fscy5yZWNlaXZlclZhcikpKSB7CiAgICAgICAgX2RlY2xhcmVMb2NhbFZhcmlhYmxlKGxvY2Fscy5yZWNlaXZlclZhciwgZnVuY3Rpb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgdiBpbiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGlmICghbG9jYWxzLmlzQ2FwdHVyZWQodikpIHsKICAgICAgICAgIF9kZWNsYXJlTG9jYWxWYXJpYWJsZSh2LCBmdW5jdGlvbi5maWxlT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh2YXIgdiBpbiBsb2NhbHMuc29ydGVkTmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKCFsb2NhbHMuaXNDYXB0dXJlZCh2KSkgewogICAgICAgICAgX2RlY2xhcmVMb2NhbFZhcmlhYmxlKHYsIGZ1bmN0aW9uLmZpbGVPZmZzZXQpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobG9jYWxzLmhhc0Z1bmN0aW9uVHlwZUFyZ3NWYXIpIHsKICAgICAgICBfZGVjbGFyZUxvY2FsVmFyaWFibGUobG9jYWxzLmZ1bmN0aW9uVHlwZUFyZ3NWYXIsIGZ1bmN0aW9uLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICB9CgogICAgLy8gQ2hlY2tTdGFjayBtdXN0IHNlZSBhIHByb3Blcmx5IGluaXRpYWxpemVkIGNvbnRleHQgd2hlbiBzdHJlc3MtdGVzdGluZwogICAgLy8gc3RhY2sgdHJhY2UgY29sbGVjdGlvbi4KICAgIGFzbS5lbWl0Q2hlY2tTdGFjaygwKTsKCiAgICBpZiAobG9jYWxzLmhhc0Z1bmN0aW9uVHlwZUFyZ3NWYXIgJiYgaXNDbG9zdXJlKSB7CiAgICAgIGlmIChmdW5jdGlvbi50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgZmluYWwgaW50IG51bVBhcmVudFR5cGVBcmdzID0gbG9jYWxzLm51bVBhcmVudFR5cGVBcmd1bWVudHM7CiAgICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5mdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lKTsKICAgICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmNsb3N1cmVWYXJJbmRleEluRnJhbWUpOwogICAgICAgIGFzbS5lbWl0TG9hZEZpZWxkVE9TKGNwLmFkZEluc3RhbmNlRmllbGQoY2xvc3VyZUZ1bmN0aW9uVHlwZUFyZ3VtZW50cykpOwogICAgICAgIF9nZW5QdXNoSW50KG51bVBhcmVudFR5cGVBcmdzKTsKICAgICAgICBfZ2VuUHVzaEludChudW1QYXJlbnRUeXBlQXJncyArIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICAgICAgX2dlbkRpcmVjdENhbGwoCiAgICAgICAgICAgIHByZXBlbmRUeXBlQXJndW1lbnRzLCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDQpLCA0KTsKICAgICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5mdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmNsb3N1cmVWYXJJbmRleEluRnJhbWUpOwogICAgICAgIGFzbS5lbWl0TG9hZEZpZWxkVE9TKGNwLmFkZEluc3RhbmNlRmllbGQoY2xvc3VyZUZ1bmN0aW9uVHlwZUFyZ3VtZW50cykpOwogICAgICAgIGFzbS5lbWl0UG9wTG9jYWwobG9jYWxzLmZ1bmN0aW9uVHlwZUFyZ3NWYXJJbmRleEluRnJhbWUpOwogICAgICB9CiAgICB9CgogICAgaWYgKGluZmVycmVkVHlwZU1ldGFkYXRhICE9IG51bGwgJiYgZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICBfaW5pdENvbnN0YW50UGFyYW1ldGVycyhmdW5jdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVEZWxheWVkVHlwZUFyZ3VtZW50cyhMYWJlbCBkb25lQ2hlY2tpbmdUeXBlQXJndW1lbnRzKSB7CiAgICBMYWJlbCBub0RlbGF5ZWRUeXBlQXJncyA9IG5ldyBMYWJlbCgpOwoKICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuY2xvc3VyZVZhckluZGV4SW5GcmFtZSk7CiAgICBhc20uZW1pdExvYWRGaWVsZFRPUyhjcC5hZGRJbnN0YW5jZUZpZWxkKGNsb3N1cmVEZWxheWVkVHlwZUFyZ3VtZW50cykpOwogICAgYXNtLmVtaXRTdG9yZUxvY2FsKGxvY2Fscy5mdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lKTsKICAgIGFzbS5lbWl0UHVzaENvbnN0YW50KGNwLmFkZEVtcHR5VHlwZUFyZ3VtZW50cygpKTsKICAgIGFzbS5lbWl0SnVtcElmRXFTdHJpY3Qobm9EZWxheWVkVHlwZUFyZ3MpOwoKICAgIC8vIFRoZXJlIGFyZSBub24tZW1wdHkgZGVsYXllZCB0eXBlIGFyZ3VtZW50cywgYW5kIHRoZXkgYXJlIHN0b3JlZAogICAgLy8gaW50byBmdW5jdGlvbiB0eXBlIGFyZ3MgdmFyaWFibGUgYWxyZWFkeS4KICAgIC8vIEp1c3QgdmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIHBhc3NlZCB0eXBlIGFyZ3VtZW50cy4KICAgIGFzbS5lbWl0Q2hlY2tGdW5jdGlvblR5cGVBcmdzKDAsIGxvY2Fscy5zY3JhdGNoVmFySW5kZXhJbkZyYW1lKTsKICAgIGFzbS5lbWl0SnVtcChkb25lQ2hlY2tpbmdUeXBlQXJndW1lbnRzKTsKCiAgICBhc20uYmluZChub0RlbGF5ZWRUeXBlQXJncyk7CiAgfQoKICB2b2lkIF9oYW5kbGVEZWZhdWx0VHlwZUFyZ3VtZW50cygKICAgICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBMYWJlbCBkb25lQ2hlY2tpbmdUeXBlQXJndW1lbnRzKSB7CiAgICBMaXN0PERhcnRUeXBlPiBkZWZhdWx0VHlwZXMgPSBnZXREZWZhdWx0RnVuY3Rpb25UeXBlQXJndW1lbnRzKGZ1bmN0aW9uKTsKICAgIGlmIChkZWZhdWx0VHlwZXMgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgYXNtLmVtaXRKdW1wSWZOb3RaZXJvVHlwZUFyZ3MoZG9uZUNoZWNraW5nVHlwZUFyZ3VtZW50cyk7CgogICAgLy8gTG9hZCBwYXJlbnQgZnVuY3Rpb24gdHlwZSBhcmd1bWVudHMgaWYgdGhleSBhcmUgdXNlZCB0bwogICAgLy8gaW5zdGFudGlhdGUgZGVmYXVsdCB0eXBlcy4KICAgIGlmIChpc0Nsb3N1cmUgJiYKICAgICAgICBkZWZhdWx0VHlwZXMKICAgICAgICAgICAgLmFueSgodCkgPT4gY29udGFpbnNUeXBlVmFyaWFibGUodCwgZnVuY3Rpb25UeXBlUGFyYW1ldGVyc1NldCkpKSB7CiAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuY2xvc3VyZVZhckluZGV4SW5GcmFtZSk7CiAgICAgIGFzbS5lbWl0TG9hZEZpZWxkVE9TKGNwLmFkZEluc3RhbmNlRmllbGQoY2xvc3VyZUZ1bmN0aW9uVHlwZUFyZ3VtZW50cykpOwogICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5mdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lKTsKICAgIH0KCiAgICBfZ2VuVHlwZUFyZ3VtZW50cyhkZWZhdWx0VHlwZXMpOwogICAgYXNtLmVtaXRQb3BMb2NhbChsb2NhbHMuZnVuY3Rpb25UeXBlQXJnc1ZhckluZGV4SW5GcmFtZSk7CiAgfQoKICB2b2lkIF9pbml0Q29uc3RhbnRQYXJhbWV0ZXJzKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuZm9yRWFjaChfaW5pdFBhcmFtZXRlcklmQ29uc3RhbnQpOwogICAgbG9jYWxzLnNvcnRlZE5hbWVkUGFyYW1ldGVycy5mb3JFYWNoKF9pbml0UGFyYW1ldGVySWZDb25zdGFudCk7CiAgfQoKICB2b2lkIF9pbml0UGFyYW1ldGVySWZDb25zdGFudChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBmaW5hbCBtZCA9IGluZmVycmVkVHlwZU1ldGFkYXRhW3ZhcmlhYmxlXTsKICAgIGlmIChtZCAhPSBudWxsICYmIG1kLmNvbnN0YW50VmFsdWUgIT0gbnVsbCkgewogICAgICBfZ2VuUHVzaENvbnN0YW50KG1kLmNvbnN0YW50VmFsdWUpOwogICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5pc0NhcHR1cmVkKHZhcmlhYmxlKQogICAgICAgICAgPyBsb2NhbHMuZ2V0T3JpZ2luYWxQYXJhbVNsb3RJbmRleCh2YXJpYWJsZSkKICAgICAgICAgIDogbG9jYWxzLmdldFZhckluZGV4SW5GcmFtZSh2YXJpYWJsZSkpOwogICAgfQogIH0KCiAgdm9pZCBfc2V0dXBJbml0aWFsQ29udGV4dChGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIF9hbGxvY2F0ZUNvbnRleHRJZk5lZWRlZCgpOwoKICAgIGlmIChvcHRpb25zLmVtaXRMb2NhbFZhckluZm8gJiYgbG9jYWxzLmN1cnJlbnRDb250ZXh0U2l6ZSA+IDApIHsKICAgICAgLy8gT3BlbiBhIG5ldyBzY29wZSBhZnRlciBhbGxvY2F0aW5nIGNvbnRleHQuCiAgICAgIGFzbS5sb2NhbFZhcmlhYmxlVGFibGUuZW50ZXJTY29wZShhc20ub2Zmc2V0LCBsb2NhbHMuY3VycmVudENvbnRleHRMZXZlbCwKICAgICAgICAgIGZ1bmN0aW9uICE9IG51bGwgPyBmdW5jdGlvbi5maWxlT2Zmc2V0IDogZW5jbG9zaW5nTWVtYmVyLmZpbGVPZmZzZXQpOwogICAgfQoKICAgIGlmIChsb2NhbHMuaGFzQ2FwdHVyZWRQYXJhbWV0ZXJzKSB7CiAgICAgIC8vIENvcHkgY2FwdHVyZWQgcGFyYW1ldGVycyB0byB0aGVpciByZXNwZWN0aXZlIGxvY2F0aW9ucyBpbiB0aGUgY29udGV4dC4KICAgICAgaWYgKCFpc0Nsb3N1cmUpIHsKICAgICAgICBpZiAobG9jYWxzLmhhc0ZhY3RvcnlUeXBlQXJnc1ZhcikgewogICAgICAgICAgX2NvcHlQYXJhbUlmQ2FwdHVyZWQobG9jYWxzLmZhY3RvcnlUeXBlQXJnc1Zhcik7CiAgICAgICAgfQogICAgICAgIGlmIChsb2NhbHMuaGFzQ2FwdHVyZWRSZWNlaXZlclZhcikgewogICAgICAgICAgX2dlblB1c2hDb250ZXh0Rm9yVmFyaWFibGUobG9jYWxzLmNhcHR1cmVkUmVjZWl2ZXJWYXIpOwogICAgICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5nZXRWYXJJbmRleEluRnJhbWUobG9jYWxzLnJlY2VpdmVyVmFyKSk7CiAgICAgICAgICBfZ2VuU3RvcmVWYXIobG9jYWxzLmNhcHR1cmVkUmVjZWl2ZXJWYXIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZvckVhY2goX2NvcHlQYXJhbUlmQ2FwdHVyZWQpOwogICAgICAgIGxvY2Fscy5zb3J0ZWROYW1lZFBhcmFtZXRlcnMuZm9yRWFjaChfY29weVBhcmFtSWZDYXB0dXJlZCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2VtaXRGaXJzdERlYnVnQ2hlY2soRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBpZiAob3B0aW9ucy5lbWl0RGVidWdnZXJTdG9wcykgewogICAgICAvLyBEZWJ1Z0NoZWNrIGluc3RydWN0aW9uIHNob3VsZCBiZSBlbWl0dGVkIGFmdGVyIHBhcmFtZXRlciB2YXJpYWJsZXMKICAgICAgLy8gYXJlIGRlY2xhcmVkIGFuZCBjb3BpZWQgaW50byBjb250ZXh0LgogICAgICAvLyBUaGUgZGVidWdnZXIgZXhwZWN0cyB0aGUgc291cmNlIHBvc2l0aW9uIHRvIGNvcnJlc3BvbmQgdG8gdGhlCiAgICAgIC8vIGRlY2xhcmF0aW9uIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHBhcmFtZXRlciwgaWYgYW55LCBvciBvZiB0aGUgZnVuY3Rpb24uCiAgICAgIC8vIFRoZSBEZWJ1Z0NoZWNrIG11c3QgYmUgZW5jb3VudGVyZWQgZWFjaCB0aW1lIGFuIGFzeW5jIG9wIGlzIHJlZW50ZXJlZC4KICAgICAgaWYgKG9wdGlvbnMuZW1pdFNvdXJjZVBvc2l0aW9ucyAmJiBmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgICAgdmFyIHBvcyA9IFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgICAgIGlmIChmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgICAgcG9zID0gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmxhc3QuZmlsZU9mZnNldDsKICAgICAgICB9IGVsc2UgaWYgKGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICAgIHBvcyA9IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxhc3QuZmlsZU9mZnNldDsKICAgICAgICB9CiAgICAgICAgaWYgKHBvcyA9PSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICAgICAgcG9zID0gZnVuY3Rpb24uZmlsZU9mZnNldDsKICAgICAgICB9CiAgICAgICAgX3JlY29yZFNvdXJjZVBvc2l0aW9uKHBvcyk7CiAgICAgIH0KICAgICAgYXNtLmVtaXREZWJ1Z0NoZWNrKCk7CiAgICB9CiAgfQoKICB2b2lkIF9jb3B5UGFyYW1JZkNhcHR1cmVkKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGlmIChsb2NhbHMuaXNDYXB0dXJlZCh2YXJpYWJsZSkpIHsKICAgICAgaWYgKG9wdGlvbnMuZW1pdExvY2FsVmFySW5mbykgewogICAgICAgIF9kZWNsYXJlTG9jYWxWYXJpYWJsZSh2YXJpYWJsZSwgZW5jbG9zaW5nRnVuY3Rpb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgX2dlblB1c2hDb250ZXh0Rm9yVmFyaWFibGUodmFyaWFibGUpOwogICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmdldE9yaWdpbmFsUGFyYW1TbG90SW5kZXgodmFyaWFibGUpKTsKICAgICAgX2dlblN0b3JlVmFyKHZhcmlhYmxlKTsKICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogV2UgbmVlZCB0byBzdG9yZSBudWxsIGF0IHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIKICAgICAgLy8gbG9jYXRpb24sIGJlY2F1c2UgdGhlIG9yaWdpbmFsIHZhbHVlIG1heSBuZWVkIHRvIGJlIEdDJ2VkLgogICAgfQogIH0KCiAgdm9pZCBfZGVjbGFyZUxvY2FsVmFyaWFibGUoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBpbml0aWFsaXplZFBvc2l0aW9uKSB7CiAgICBhc3NlcnQodmFyaWFibGUubmFtZSAhPSBudWxsKTsKICAgIGJvb2wgaXNDYXB0dXJlZCA9IGxvY2Fscy5pc0NhcHR1cmVkKHZhcmlhYmxlKTsKICAgIGFzbS5sb2NhbFZhcmlhYmxlVGFibGUuZGVjbGFyZVZhcmlhYmxlKAogICAgICAgIGFzbS5vZmZzZXQsCiAgICAgICAgaXNDYXB0dXJlZCwKICAgICAgICBpc0NhcHR1cmVkCiAgICAgICAgICAgID8gbG9jYWxzLmdldFZhckluZGV4SW5Db250ZXh0KHZhcmlhYmxlKQogICAgICAgICAgICA6IGxvY2Fscy5nZXRWYXJJbmRleEluRnJhbWUodmFyaWFibGUpLAogICAgICAgIGNwLmFkZE5hbWUodmFyaWFibGUubmFtZSksCiAgICAgICAgY3AuYWRkVHlwZSh2YXJpYWJsZS50eXBlKSwKICAgICAgICB2YXJpYWJsZS5maWxlT2Zmc2V0LAogICAgICAgIGluaXRpYWxpemVkUG9zaXRpb24pOwogIH0KCiAgYm9vbCBnZXQgY2FuU2tpcFR5cGVDaGVja3NGb3JOb25Db3ZhcmlhbnRBcmd1bWVudHMgPT4KICAgICAgIWlzQ2xvc3VyZSAmJiBlbmNsb3NpbmdNZW1iZXIubmFtZS5uYW1lICE9ICdjYWxsJzsKCiAgYm9vbCBnZXQgc2tpcFR5cGVDaGVja3NGb3JHZW5lcmljQ292YXJpYW50SW1wbEFyZ3VtZW50cyA9PgogICAgICBwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgIT0gbnVsbCAmJgogICAgICAhcHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhLmhhc05vblRoaXNVc2VzICYmCiAgICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGZpeCBidWlsZGluZyBvZiBmbG93IGdyYXBoIGZvciBpbXBsaWNpdCBjbG9zdXJlcyBzbwogICAgICAvLyBpdCB3b3VsZCBpbmNsdWRlIG1pc3NpbmcgY2hlY2tzIGFuZCByZW1vdmUgdGhpcyBjb25kaXRpb24uCiAgICAgICFwcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEuaGFzVGVhck9mZlVzZXM7CgogIE1lbWJlciBfZ2V0Rm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCgpIHsKICAgIGlmICghaXNDbG9zdXJlKSB7CiAgICAgIGZpbmFsIG1lbWJlciA9IGVuY2xvc2luZ01lbWJlcjsKICAgICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBtZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICBtZW1iZXIuaXNGb3J3YXJkaW5nU3R1YikgewogICAgICAgIHJldHVybiBtZW1iZXIuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBUeXBlcyBpbiBhIHRhcmdldCBvZiBhIGZvcndhcmRpbmcgc3R1YiBhcmUgZW5jb2RlZCBpbiB0ZXJtcyBvZiB0YXJnZXQgdHlwZQogIC8vIHBhcmFtZXRlcnMuIFN1YnN0aXR1dGUgdGhlbSB3aXRoIGhvc3QgdHlwZSBwYXJhbWV0ZXJzIHRvIGJlIGFibGUKICAvLyB0byB1c2UgdGhlbSAoZS5nLiBpbnN0YW50aWF0ZSkgaW4gdGhlIGNvbnRleHQgb2YgaG9zdC4KICBTdWJzdGl0dXRpb24gX2dldEZvcndhcmRpbmdTdWJzdGl0dXRpb24oCiAgICAgIEZ1bmN0aW9uTm9kZSBob3N0LCBNZW1iZXIgZm9yd2FyZGluZ1RhcmdldCkgewogICAgaWYgKGZvcndhcmRpbmdUYXJnZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZpbmFsIENsYXNzIHRhcmdldENsYXNzID0gZm9yd2FyZGluZ1RhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIGZpbmFsIFN1cGVydHlwZSBpbnN0YW50aWF0ZWRUYXJnZXRDbGFzcyA9CiAgICAgICAgaGllcmFyY2h5LmdldENsYXNzQXNJbnN0YW5jZU9mKGVuY2xvc2luZ0NsYXNzLCB0YXJnZXRDbGFzcyk7CiAgICBpZiAoaW5zdGFudGlhdGVkVGFyZ2V0Q2xhc3MgPT0gbnVsbCkgewogICAgICB0aHJvdyAnQ2xhc3MgJHRhcmdldENsYXNzIGlzIG5vdCBmb3VuZCBhbW9uZyBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzIG9mJwogICAgICAgICAgJyAkZW5jbG9zaW5nQ2xhc3MgKGZvciBmb3J3YXJkaW5nIHN0dWIgJGVuY2xvc2luZ01lbWJlciknOwogICAgfQogICAgYXNzZXJ0KGluc3RhbnRpYXRlZFRhcmdldENsYXNzLmNsYXNzTm9kZSA9PSB0YXJnZXRDbGFzcyk7CiAgICBhc3NlcnQoaW5zdGFudGlhdGVkVGFyZ2V0Q2xhc3MudHlwZUFyZ3VtZW50cy5sZW5ndGggPT0KICAgICAgICB0YXJnZXRDbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBtYXAgPQogICAgICAgIG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXMoCiAgICAgICAgICAgIHRhcmdldENsYXNzLnR5cGVQYXJhbWV0ZXJzLCBpbnN0YW50aWF0ZWRUYXJnZXRDbGFzcy50eXBlQXJndW1lbnRzKTsKICAgIGlmIChmb3J3YXJkaW5nVGFyZ2V0LmZ1bmN0aW9uICE9IG51bGwpIHsKICAgICAgZmluYWwgdGFyZ2V0VHlwZVBhcmFtZXRlcnMgPSBmb3J3YXJkaW5nVGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgICBhc3NlcnQoaG9zdC50eXBlUGFyYW1ldGVycy5sZW5ndGggPT0gdGFyZ2V0VHlwZVBhcmFtZXRlcnMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRUeXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIG1hcFt0YXJnZXRUeXBlUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUoaG9zdC50eXBlUGFyYW1ldGVyc1tpXSwgTnVsbGFiaWxpdHkubGVnYWN5KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tTWFwKG1hcCk7CiAgfQoKICAvLy8gSWYgbWVtYmVyIGJlaW5nIGNvbXBpbGVkIGlzIGEgZm9yd2FyZGluZyBzdHViLCB0aGVuIHJldHVybnMgdHlwZQogIC8vLyBwYXJhbWV0ZXIgYm91bmRzIHRvIGNoZWNrIGZvciB0aGUgZm9yd2FyZGluZyBzdHViIHRhcmdldC4KICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IF9nZXRGb3J3YXJkaW5nQm91bmRzKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICAgICAgTWVtYmVyIGZvcndhcmRpbmdUYXJnZXQsIFN1YnN0aXR1dGlvbiBmb3J3YXJkaW5nU3Vic3RpdHV0aW9uKSB7CiAgICBpZiAoZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSB8fCBmb3J3YXJkaW5nVGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmaW5hbCBmb3J3YXJkaW5nQm91bmRzID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBEYXJ0VHlwZSBib3VuZCA9IGZvcndhcmRpbmdTdWJzdGl0dXRpb24KICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShmb3J3YXJkaW5nVGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kKTsKICAgICAgZm9yd2FyZGluZ0JvdW5kc1tmdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXV0gPSBib3VuZDsKICAgIH0KICAgIHJldHVybiBmb3J3YXJkaW5nQm91bmRzOwogIH0KCiAgLy8vIElmIG1lbWJlciBiZWluZyBjb21waWxlZCBpcyBhIGZvcndhcmRpbmcgc3R1YiwgdGhlbiByZXR1cm5zIHBhcmFtZXRlcgogIC8vLyB0eXBlcyB0byBjaGVjayBmb3IgdGhlIGZvcndhcmRpbmcgc3R1YiB0YXJnZXQuCiAgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIERhcnRUeXBlPiBfZ2V0Rm9yd2FyZGluZ1BhcmFtZXRlclR5cGVzKAogICAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIE1lbWJlciBmb3J3YXJkaW5nVGFyZ2V0LAogICAgICBTdWJzdGl0dXRpb24gZm9yd2FyZGluZ1N1YnN0aXR1dGlvbikgewogICAgaWYgKGZvcndhcmRpbmdUYXJnZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoZm9yd2FyZGluZ1RhcmdldCBpcyBGaWVsZCkgewogICAgICBpZiAoKGVuY2xvc2luZ01lbWJlciBhcyBQcm9jZWR1cmUpLmlzR2V0dGVyKSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IDxWYXJpYWJsZURlY2xhcmF0aW9uLCBEYXJ0VHlwZT57fTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBGb3J3YXJkaW5nIHN0dWIgZm9yIGEgY292YXJpYW50IGZpZWxkIHNldHRlci4KICAgICAgICBhc3NlcnQoKGVuY2xvc2luZ01lbWJlciBhcyBQcm9jZWR1cmUpLmlzU2V0dGVyKTsKICAgICAgICBhc3NlcnQoZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSAmJgogICAgICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggPT0gMSAmJgogICAgICAgICAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoID09IDApOwogICAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbiwgRGFydFR5cGU+ewogICAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuc2luZ2xlOgogICAgICAgICAgICAgIGZvcndhcmRpbmdTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZm9yd2FyZGluZ1RhcmdldC50eXBlKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KCiAgICBmaW5hbCBmb3J3YXJkaW5nUGFyYW1zID0gPFZhcmlhYmxlRGVjbGFyYXRpb24sIERhcnRUeXBlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBEYXJ0VHlwZSB0eXBlID0gZm9yd2FyZGluZ1N1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSgKICAgICAgICAgIGZvcndhcmRpbmdUYXJnZXQuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0udHlwZSk7CiAgICAgIGZvcndhcmRpbmdQYXJhbXNbZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV1dID0gdHlwZTsKICAgIH0KICAgIGZvciAodmFyIGhvc3RQYXJhbSBpbiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0YXJnZXRQYXJhbSA9IGZvcndhcmRpbmdUYXJnZXQKICAgICAgICAgIC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgIC5maXJzdFdoZXJlKChwKSA9PiBwLm5hbWUgPT0gaG9zdFBhcmFtLm5hbWUpOwogICAgICBmb3J3YXJkaW5nUGFyYW1zW2hvc3RQYXJhbV0gPQogICAgICAgICAgZm9yd2FyZGluZ1N1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0YXJnZXRQYXJhbS50eXBlKTsKICAgIH0KICAgIHJldHVybiBmb3J3YXJkaW5nUGFyYW1zOwogIH0KCiAgdm9pZCBfY2hlY2tBcmd1bWVudHMoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICAvLyBXaGVuIGNoZWNraW5nIGFyZ3VtZW50cyBvZiBhIGZvcndhcmRpbmcgc3R1Yiwgd2UgbmVlZCB0byB1c2UgcGFyYW1ldGVyCiAgICAvLyB0eXBlcyAoYW5kIGJvdW5kcyBvZiB0eXBlIHBhcmFtZXRlcnMpIGZyb20gc3R1YidzIHRhcmdldC4KICAgIC8vIFRoZXNlIG1vcmUgYWNjdXJhdGUgdHlwZSBjaGVja3MgaXMgdGhlIHNvbGUgcHVycG9zZSBvZiBhIGZvcndhcmRpbmcgc3R1Yi4KICAgIGZpbmFsIGZvcndhcmRpbmdUYXJnZXQgPSBfZ2V0Rm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCgpOwogICAgZmluYWwgZm9yd2FyZGluZ1N1YnN0aXR1dGlvbiA9CiAgICAgICAgX2dldEZvcndhcmRpbmdTdWJzdGl0dXRpb24oZnVuY3Rpb24sIGZvcndhcmRpbmdUYXJnZXQpOwogICAgZmluYWwgZm9yd2FyZGluZ0JvdW5kcyA9IF9nZXRGb3J3YXJkaW5nQm91bmRzKAogICAgICAgIGZ1bmN0aW9uLCBmb3J3YXJkaW5nVGFyZ2V0LCBmb3J3YXJkaW5nU3Vic3RpdHV0aW9uKTsKICAgIGZpbmFsIGZvcndhcmRpbmdQYXJhbVR5cGVzID0gX2dldEZvcndhcmRpbmdQYXJhbWV0ZXJUeXBlcygKICAgICAgICBmdW5jdGlvbiwgZm9yd2FyZGluZ1RhcmdldCwgZm9yd2FyZGluZ1N1YnN0aXR1dGlvbik7CgogICAgaWYgKF9oYXNTa2lwcGFibGVUeXBlQ2hlY2tzKAogICAgICAgIGZ1bmN0aW9uLCBmb3J3YXJkaW5nQm91bmRzLCBmb3J3YXJkaW5nUGFyYW1UeXBlcykpIHsKICAgICAgZmluYWwgTGFiZWwgc2tpcENoZWNrcyA9IG5ldyBMYWJlbCgpOwogICAgICBhc20uZW1pdEp1bXBJZlVuY2hlY2tlZChza2lwQ2hlY2tzKTsKCiAgICAgIC8vIFdlIGNhbiBza2lwIGJvdW5kcyBjaGVja3Mgb2YgdHlwZSBwYXJhbWV0ZXIgYW5kIHR5cGUgY2hlY2tzIG9mCiAgICAgIC8vIG5vbi1jb3ZhcmlhbnQgcGFyYW1ldGVycyBpZiBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIHVuY2hlY2tlZCBjYWxsLgoKICAgICAgZm9yICh2YXIgdHlwZVBhcmFtIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKF90eXBlUGFyYW1ldGVyTmVlZHNCb3VuZENoZWNrKHR5cGVQYXJhbSwgZm9yd2FyZGluZ0JvdW5kcykpIHsKICAgICAgICAgIF9nZW5UeXBlUGFyYW1ldGVyQm91bmRDaGVjayh0eXBlUGFyYW0sIGZvcndhcmRpbmdCb3VuZHMpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHZhciBwYXJhbSBpbiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGlmICghcGFyYW0uaXNDb3ZhcmlhbnQgJiYKICAgICAgICAgICAgX3BhcmFtZXRlck5lZWRzVHlwZUNoZWNrKHBhcmFtLCBmb3J3YXJkaW5nUGFyYW1UeXBlcykpIHsKICAgICAgICAgIF9nZW5Bcmd1bWVudFR5cGVDaGVjayhwYXJhbSwgZm9yd2FyZGluZ1BhcmFtVHlwZXMpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHZhciBwYXJhbSBpbiBsb2NhbHMuc29ydGVkTmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKCFwYXJhbS5pc0NvdmFyaWFudCAmJgogICAgICAgICAgICBfcGFyYW1ldGVyTmVlZHNUeXBlQ2hlY2socGFyYW0sIGZvcndhcmRpbmdQYXJhbVR5cGVzKSkgewogICAgICAgICAgX2dlbkFyZ3VtZW50VHlwZUNoZWNrKHBhcmFtLCBmb3J3YXJkaW5nUGFyYW1UeXBlcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBhc20uYmluZChza2lwQ2hlY2tzKTsKICAgIH0KCiAgICAvLyBDb3ZhcmlhbnQgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGNoZWNrZWQgZXZlbiBpZiBmdW5jdGlvbiBpcyBjYWxsZWQKICAgIC8vIHZpYSB1bmNoZWNrZWQgY2FsbCwgc28gdGhleSBhcmUgZ2VuZXJhdGVkIG91dHNpZGUgb2YgSnVtcElmVW5jaGVja2VkLgoKICAgIGZvciAodmFyIHBhcmFtIGluIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwYXJhbS5pc0NvdmFyaWFudCAmJgogICAgICAgICAgX3BhcmFtZXRlck5lZWRzVHlwZUNoZWNrKHBhcmFtLCBmb3J3YXJkaW5nUGFyYW1UeXBlcykpIHsKICAgICAgICBfZ2VuQXJndW1lbnRUeXBlQ2hlY2socGFyYW0sIGZvcndhcmRpbmdQYXJhbVR5cGVzKTsKICAgICAgfQogICAgfQogICAgZm9yICh2YXIgcGFyYW0gaW4gbG9jYWxzLnNvcnRlZE5hbWVkUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW0uaXNDb3ZhcmlhbnQgJiYKICAgICAgICAgIF9wYXJhbWV0ZXJOZWVkc1R5cGVDaGVjayhwYXJhbSwgZm9yd2FyZGluZ1BhcmFtVHlwZXMpKSB7CiAgICAgICAgX2dlbkFyZ3VtZW50VHlwZUNoZWNrKHBhcmFtLCBmb3J3YXJkaW5nUGFyYW1UeXBlcyk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgYm91bmQgb2YgW3R5cGVQYXJhbV0gc2hvdWxkIGJlIGNoZWNrZWQuCiAgYm9vbCBfdHlwZVBhcmFtZXRlck5lZWRzQm91bmRDaGVjayhUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSwKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBmb3J3YXJkaW5nVHlwZVBhcmFtZXRlckJvdW5kcykgewogICAgaWYgKGNhblNraXBUeXBlQ2hlY2tzRm9yTm9uQ292YXJpYW50QXJndW1lbnRzICYmCiAgICAgICAgKCF0eXBlUGFyYW0uaXNHZW5lcmljQ292YXJpYW50SW1wbCB8fAogICAgICAgICAgICBza2lwVHlwZUNoZWNrc0ZvckdlbmVyaWNDb3ZhcmlhbnRJbXBsQXJndW1lbnRzKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmaW5hbCBEYXJ0VHlwZSBib3VuZCA9IChmb3J3YXJkaW5nVHlwZVBhcmFtZXRlckJvdW5kcyAhPSBudWxsKQogICAgICAgID8gZm9yd2FyZGluZ1R5cGVQYXJhbWV0ZXJCb3VuZHNbdHlwZVBhcmFtXQogICAgICAgIDogdHlwZVBhcmFtLmJvdW5kOwogICAgaWYgKHR5cGVFbnZpcm9ubWVudC5pc1RvcChib3VuZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHR5cGUgb2YgW3BhcmFtXSBzaG91bGQgYmUgY2hlY2tlZC4KICBib29sIF9wYXJhbWV0ZXJOZWVkc1R5cGVDaGVjayhWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtLAogICAgICBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgRGFydFR5cGU+IGZvcndhcmRpbmdQYXJhbWV0ZXJUeXBlcykgewogICAgaWYgKGNhblNraXBUeXBlQ2hlY2tzRm9yTm9uQ292YXJpYW50QXJndW1lbnRzICYmCiAgICAgICAgIXBhcmFtLmlzQ292YXJpYW50ICYmCiAgICAgICAgKCFwYXJhbS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsIHx8CiAgICAgICAgICAgIHNraXBUeXBlQ2hlY2tzRm9yR2VuZXJpY0NvdmFyaWFudEltcGxBcmd1bWVudHMpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZpbmFsIERhcnRUeXBlIHR5cGUgPSAoZm9yd2FyZGluZ1BhcmFtZXRlclR5cGVzICE9IG51bGwpCiAgICAgICAgPyBmb3J3YXJkaW5nUGFyYW1ldGVyVHlwZXNbcGFyYW1dCiAgICAgICAgOiBwYXJhbS50eXBlOwogICAgaWYgKHR5cGVFbnZpcm9ubWVudC5pc1RvcCh0eXBlKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHBhcmFtZXRlciB0eXBlL2JvdW5kIGNoZWNrcyB3aGljaCBjYW4KICAvLy8gYmUgc2tpcHBlZCBvbiB1bmNoZWNrZWQgY2FsbC4KICBib29sIF9oYXNTa2lwcGFibGVUeXBlQ2hlY2tzKAogICAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZm9yd2FyZGluZ0JvdW5kcywKICAgICAgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIERhcnRUeXBlPiBmb3J3YXJkaW5nUGFyYW1UeXBlcykgewogICAgZm9yICh2YXIgdHlwZVBhcmFtIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChfdHlwZVBhcmFtZXRlck5lZWRzQm91bmRDaGVjayh0eXBlUGFyYW0sIGZvcndhcmRpbmdCb3VuZHMpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIHBhcmFtIGluIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmICghcGFyYW0uaXNDb3ZhcmlhbnQgJiYKICAgICAgICAgIF9wYXJhbWV0ZXJOZWVkc1R5cGVDaGVjayhwYXJhbSwgZm9yd2FyZGluZ1BhcmFtVHlwZXMpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIHBhcmFtIGluIGxvY2Fscy5zb3J0ZWROYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKCFwYXJhbS5pc0NvdmFyaWFudCAmJgogICAgICAgICAgX3BhcmFtZXRlck5lZWRzVHlwZUNoZWNrKHBhcmFtLCBmb3J3YXJkaW5nUGFyYW1UeXBlcykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBfZ2VuVHlwZVBhcmFtZXRlckJvdW5kQ2hlY2soVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0sCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZm9yd2FyZGluZ1R5cGVQYXJhbWV0ZXJCb3VuZHMpIHsKICAgIGZpbmFsIERhcnRUeXBlIGJvdW5kID0gKGZvcndhcmRpbmdUeXBlUGFyYW1ldGVyQm91bmRzICE9IG51bGwpCiAgICAgICAgPyBmb3J3YXJkaW5nVHlwZVBhcmFtZXRlckJvdW5kc1t0eXBlUGFyYW1dCiAgICAgICAgOiB0eXBlUGFyYW0uYm91bmQ7CiAgICAvLyBUT0RPKHJlZ2lzKTogUmV2aXNpdCBhbmQgdGFrZSBubmJkTW9kZSBpbnRvIGNvbnNpZGVyYXRpb24uCiAgICBmaW5hbCBEYXJ0VHlwZSB0eXBlID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKHR5cGVQYXJhbSwgTnVsbGFiaWxpdHkubGVnYWN5KTsKICAgIF9nZW5QdXNoSW5zdGFudGlhdG9yQW5kRnVuY3Rpb25UeXBlQXJndW1lbnRzKFt0eXBlLCBib3VuZF0pOwogICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQoY3AuYWRkVHlwZSh0eXBlKSk7CiAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGRUeXBlKGJvdW5kKSk7CiAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGROYW1lKHR5cGVQYXJhbS5uYW1lKSk7CiAgICBhc20uZW1pdEFzc2VydFN1YnR5cGUoKTsKICB9CgogIHZvaWQgX2dlbkFyZ3VtZW50VHlwZUNoZWNrKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsCiAgICAgIE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBEYXJ0VHlwZT4gZm9yd2FyZGluZ1BhcmFtZXRlclR5cGVzKSB7CiAgICBmaW5hbCBEYXJ0VHlwZSB0eXBlID0gKGZvcndhcmRpbmdQYXJhbWV0ZXJUeXBlcyAhPSBudWxsKQogICAgICAgID8gZm9yd2FyZGluZ1BhcmFtZXRlclR5cGVzW3ZhcmlhYmxlXQogICAgICAgIDogdmFyaWFibGUudHlwZTsKICAgIGlmIChsb2NhbHMuaXNDYXB0dXJlZCh2YXJpYWJsZSkpIHsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5nZXRPcmlnaW5hbFBhcmFtU2xvdEluZGV4KHZhcmlhYmxlKSk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmdldFZhckluZGV4SW5GcmFtZSh2YXJpYWJsZSkpOwogICAgfQogICAgX2dlbkFzc2VydEFzc2lnbmFibGUodHlwZSwgbmFtZTogdmFyaWFibGUubmFtZSk7CiAgICBhc20uZW1pdERyb3AxKCk7CiAgfQoKICB2b2lkIF9nZW5Bc3NlcnRBc3NpZ25hYmxlKERhcnRUeXBlIHR5cGUsIHtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2V9KSB7CiAgICBhc3NlcnQoIXR5cGVFbnZpcm9ubWVudC5pc1RvcCh0eXBlKSk7CiAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGRUeXBlKHR5cGUpKTsKICAgIF9nZW5QdXNoSW5zdGFudGlhdG9yQW5kRnVuY3Rpb25UeXBlQXJndW1lbnRzKFt0eXBlXSk7CiAgICBhc20uZW1pdFB1c2hDb25zdGFudCgKICAgICAgICBuYW1lICE9IG51bGwgPyBjcC5hZGROYW1lKG5hbWUpIDogY3AuYWRkU3RyaW5nKG1lc3NhZ2UpKTsKICAgIC8vIFRPRE8ocmVnaXMpOiBSZXZpc2l0IGFuZCB0YWtlIG5uYmQgbW9kZSBpbnRvIGNvbnNpZGVyYXRpb24uCiAgICBib29sIGlzSW50T2sgPSB0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5pbnRMZWdhY3lSYXdUeXBlLAogICAgICAgIHR5cGUsCiAgICAgICAgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpOwogICAgaW50IHN1YnR5cGVUZXN0Q2FjaGVDcEluZGV4ID0gY3AuYWRkU3VidHlwZVRlc3RDYWNoZSgpOwogICAgYXNtLmVtaXRBc3NlcnRBc3NpZ25hYmxlKGlzSW50T2sgPyAxIDogMCwgc3VidHlwZVRlc3RDYWNoZUNwSW5kZXgpOwogIH0KCiAgdm9pZCBfcHVzaEFzc2VtYmxlclN0YXRlKCkgewogICAgc2F2ZWRBc3NlbWJsZXJzID8/PSA8Qnl0ZWNvZGVBc3NlbWJsZXI+W107CiAgICBzYXZlZEFzc2VtYmxlcnMuYWRkKGFzbSk7CiAgICBhc20gPSBuZXcgQnl0ZWNvZGVBc3NlbWJsZXIob3B0aW9ucyk7CiAgfQoKICB2b2lkIF9wb3BBc3NlbWJsZXJTdGF0ZSgpIHsKICAgIGFzbSA9IHNhdmVkQXNzZW1ibGVycy5yZW1vdmVMYXN0KCk7CiAgfQoKICBpbnQgX2dlbkNsb3N1cmVCeXRlY29kZSgKICAgICAgTG9jYWxGdW5jdGlvbiBub2RlLCBTdHJpbmcgbmFtZSwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBfcHVzaEFzc2VtYmxlclN0YXRlKCk7CgogICAgbG9jYWxzLmVudGVyU2NvcGUobm9kZSk7CgogICAgZmluYWwgc2F2ZWRQYXJlbnRGdW5jdGlvbiA9IHBhcmVudEZ1bmN0aW9uOwogICAgcGFyZW50RnVuY3Rpb24gPSBlbmNsb3NpbmdGdW5jdGlvbjsKICAgIGZpbmFsIHNhdmVkSXNDbG9zdXJlID0gaXNDbG9zdXJlOwogICAgaXNDbG9zdXJlID0gdHJ1ZTsKICAgIGVuY2xvc2luZ0Z1bmN0aW9uID0gZnVuY3Rpb247CiAgICBmaW5hbCBzYXZlZExvb3BEZXB0aCA9IGN1cnJlbnRMb29wRGVwdGg7CiAgICBjdXJyZW50TG9vcERlcHRoID0gMDsKICAgIGZpbmFsIHNhdmVkSW5mZXJyZWRUeXBlc0F0dHJpYnV0ZSA9IGluZmVycmVkVHlwZXNBdHRyaWJ1dGU7CiAgICBpbmZlcnJlZFR5cGVzQXR0cmlidXRlID0gbnVsbDsKCiAgICBpZiAoZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBmdW5jdGlvblR5cGVQYXJhbWV0ZXJzID8/PSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPigpOwogICAgICBmdW5jdGlvblR5cGVQYXJhbWV0ZXJzLmFkZEFsbChmdW5jdGlvbi50eXBlUGFyYW1ldGVycyk7CiAgICAgIGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnNTZXQgPSBmdW5jdGlvblR5cGVQYXJhbWV0ZXJzLnRvU2V0KCk7CiAgICB9CgogICAgTGlzdDxMYWJlbD4gc2F2ZWRZaWVsZFBvaW50cyA9IHlpZWxkUG9pbnRzOwogICAgeWllbGRQb2ludHMgPSBsb2NhbHMuaXNTeW5jWWllbGRpbmdGcmFtZSA/IDxMYWJlbD5bXSA6IG51bGw7CgogICAgY2xvc3VyZXMgPz89IDxDbG9zdXJlRGVjbGFyYXRpb24+W107CiAgICBmaW5hbCBpbnQgY2xvc3VyZUluZGV4ID0gY2xvc3VyZXMubGVuZ3RoOwogICAgZmluYWwgY2xvc3VyZSA9IGdldENsb3N1cmVEZWNsYXJhdGlvbihub2RlLCBmdW5jdGlvbiwgbmFtZSwgY2xvc3VyZUluZGV4LAogICAgICAgIHNhdmVkSXNDbG9zdXJlID8gcGFyZW50RnVuY3Rpb24gOiBlbmNsb3NpbmdNZW1iZXIpOwogICAgY2xvc3VyZXMuYWRkKGNsb3N1cmUpOwoKICAgIGZpbmFsIGludCBjbG9zdXJlRnVuY3Rpb25JbmRleCA9IGNwLmFkZENsb3N1cmVGdW5jdGlvbihjbG9zdXJlSW5kZXgpOwoKICAgIF9yZWNvcmRTb3VyY2VQb3NpdGlvbihmdW5jdGlvbi5maWxlT2Zmc2V0KTsKICAgIF9nZW5Qcm9sb2d1ZShub2RlLCBmdW5jdGlvbik7CgogICAgaWYgKG9wdGlvbnMuY2F1c2FsQXN5bmNTdGFja3MgJiYKICAgICAgICBwYXJlbnRGdW5jdGlvbiAhPSBudWxsICYmCiAgICAgICAgKHBhcmVudEZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luYyB8fAogICAgICAgICAgICBwYXJlbnRGdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQXN5bmNTdGFyKSkgewogICAgICBmaW5hbCBzYXZlZFNvdXJjZVBvc2l0aW9uID0gYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbjsKICAgICAgX3JlY29yZFNvdXJjZVBvc2l0aW9uKFRyZWVOb2RlLm5vT2Zmc2V0KTsKICAgICAgX2dlbkxvYWRWYXIobG9jYWxzLmFzeW5jU3RhY2tUcmFjZVZhciwKICAgICAgICAgIGN1cnJlbnRDb250ZXh0TGV2ZWw6IGxvY2Fscy5jb250ZXh0TGV2ZWxBdEVudHJ5KTsKICAgICAgX2dlbkRpcmVjdENhbGwoCiAgICAgICAgICBzZXRBc3luY1RocmVhZFN0YWNrVHJhY2UsIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMSksIDEpOwogICAgICBhc20uZW1pdERyb3AxKCk7CiAgICAgIGFzbS5jdXJyZW50U291cmNlUG9zaXRpb24gPSBzYXZlZFNvdXJjZVBvc2l0aW9uOwogICAgfQoKICAgIExhYmVsIGNvbnRpbnVhdGlvblN3aXRjaExhYmVsOwogICAgaW50IGNvbnRpbnVhdGlvblN3aXRjaFZhcjsKICAgIGlmIChsb2NhbHMuaXNTeW5jWWllbGRpbmdGcmFtZSkgewogICAgICBjb250aW51YXRpb25Td2l0Y2hMYWJlbCA9IG5ldyBMYWJlbCgpOwogICAgICBjb250aW51YXRpb25Td2l0Y2hWYXIgPSBsb2NhbHMuc2NyYXRjaFZhckluZGV4SW5GcmFtZTsKICAgICAgX2dlblN5bmNZaWVsZGluZ1Byb2xvZ3VlKAogICAgICAgICAgZnVuY3Rpb24sIGNvbnRpbnVhdGlvblN3aXRjaExhYmVsLCBjb250aW51YXRpb25Td2l0Y2hWYXIpOwogICAgfSBlbHNlIHsKICAgICAgX3NldHVwSW5pdGlhbENvbnRleHQoZnVuY3Rpb24pOwogICAgICBfZW1pdEZpcnN0RGVidWdDaGVjayhmdW5jdGlvbik7CiAgICB9CiAgICBfY2hlY2tBcmd1bWVudHMoZnVuY3Rpb24pOwoKICAgIF9nZW5lcmF0ZU5vZGUoZnVuY3Rpb24uYm9keSk7CgogICAgLy8gQnl0ZWNvZGVBc3NlbWJsZXIgZWxpbWluYXRlcyB0aGlzIGJ5dGVjb2RlIGlmIGl0IGlzIHVucmVhY2hhYmxlLgogICAgX3JlY29yZFNvdXJjZVBvc2l0aW9uKGZ1bmN0aW9uLmZpbGVFbmRPZmZzZXQpOwogICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgX2dlblJldHVyblRPUygpOwoKICAgIGlmIChsb2NhbHMuaXNTeW5jWWllbGRpbmdGcmFtZSkgewogICAgICBfZ2VuU3luY1lpZWxkaW5nRXBpbG9ndWUoCiAgICAgICAgICBmdW5jdGlvbiwgY29udGludWF0aW9uU3dpdGNoTGFiZWwsIGNvbnRpbnVhdGlvblN3aXRjaFZhcik7CiAgICB9CgogICAgaWYgKG9wdGlvbnMuZW1pdExvY2FsVmFySW5mbykgewogICAgICAvLyBMZWF2ZSB0aGUgc2NvcGVzIHdoaWNoIHdlcmUgZW50ZXJlZCBpbiBfZ2VuUHJvbG9ndWUgYW5kCiAgICAgIC8vIF9zZXR1cEluaXRpYWxDb250ZXh0LgogICAgICBhc20ubG9jYWxWYXJpYWJsZVRhYmxlLmxlYXZlQWxsU2NvcGVzKGFzbS5vZmZzZXQsIGZ1bmN0aW9uLmZpbGVFbmRPZmZzZXQpOwogICAgfQoKICAgIGNwLmFkZEVuZENsb3N1cmVGdW5jdGlvblNjb3BlKCk7CgogICAgaWYgKGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgZnVuY3Rpb25UeXBlUGFyYW1ldGVycy5sZW5ndGggLT0gZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBmdW5jdGlvblR5cGVQYXJhbWV0ZXJzU2V0ID0gZnVuY3Rpb25UeXBlUGFyYW1ldGVycy50b1NldCgpOwogICAgfQoKICAgIGVuY2xvc2luZ0Z1bmN0aW9uID0gcGFyZW50RnVuY3Rpb247CiAgICBwYXJlbnRGdW5jdGlvbiA9IHNhdmVkUGFyZW50RnVuY3Rpb247CiAgICBpc0Nsb3N1cmUgPSBzYXZlZElzQ2xvc3VyZTsKICAgIGN1cnJlbnRMb29wRGVwdGggPSBzYXZlZExvb3BEZXB0aDsKCiAgICBmaW5hbCBhdHRyaWJ1dGVzID0gZ2V0Q2xvc3VyZUF0dHJpYnV0ZXMoKTsKICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKICAgICAgY2xvc3VyZS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKICAgICAgY2xvc3VyZS5mbGFncyB8PSBDbG9zdXJlRGVjbGFyYXRpb24uaGFzQXR0cmlidXRlc0ZsYWc7CiAgICB9CiAgICBpbmZlcnJlZFR5cGVzQXR0cmlidXRlID0gc2F2ZWRJbmZlcnJlZFR5cGVzQXR0cmlidXRlOwoKICAgIGxvY2Fscy5sZWF2ZVNjb3BlKCk7CgogICAgY2xvc3VyZS5jb2RlID0gbmV3IENsb3N1cmVDb2RlKGFzbS5ieXRlY29kZSwgYXNtLmV4Y2VwdGlvbnNUYWJsZSwKICAgICAgICBmaW5hbGl6ZVNvdXJjZVBvc2l0aW9ucygpLCBmaW5hbGl6ZUxvY2FsVmFyaWFibGVzKCkpOwoKICAgIF9wb3BBc3NlbWJsZXJTdGF0ZSgpOwogICAgeWllbGRQb2ludHMgPSBzYXZlZFlpZWxkUG9pbnRzOwoKICAgIHJldHVybiBjbG9zdXJlRnVuY3Rpb25JbmRleDsKICB9CgogIENsb3N1cmVEZWNsYXJhdGlvbiBnZXRDbG9zdXJlRGVjbGFyYXRpb24oTG9jYWxGdW5jdGlvbiBub2RlLAogICAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sIFN0cmluZyBuYW1lLCBpbnQgY2xvc3VyZUluZGV4LCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIG9iamVjdFRhYmxlLmRlY2xhcmVDbG9zdXJlKGZ1bmN0aW9uLCBlbmNsb3NpbmdNZW1iZXIsIGNsb3N1cmVJbmRleCk7CgogICAgaW50IGZsYWdzID0gMDsKICAgIGludCBwb3NpdGlvbiA9IFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgaW50IGVuZFBvc2l0aW9uID0gVHJlZU5vZGUubm9PZmZzZXQ7CiAgICBpZiAob3B0aW9ucy5lbWl0U291cmNlUG9zaXRpb25zKSB7CiAgICAgIHBvc2l0aW9uID0gKG5vZGUgaXMgYXN0LkZ1bmN0aW9uRGVjbGFyYXRpb24pCiAgICAgICAgICA/IG5vZGUuZmlsZU9mZnNldAogICAgICAgICAgOiBmdW5jdGlvbi5maWxlT2Zmc2V0OwogICAgICBlbmRQb3NpdGlvbiA9IGZ1bmN0aW9uLmZpbGVFbmRPZmZzZXQ7CiAgICAgIGlmIChwb3NpdGlvbiAhPSBUcmVlTm9kZS5ub09mZnNldCkgewogICAgICAgIGZsYWdzIHw9IENsb3N1cmVEZWNsYXJhdGlvbi5oYXNTb3VyY2VQb3NpdGlvbnNGbGFnOwogICAgICB9CiAgICB9CgogICAgc3dpdGNoIChmdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luYzoKICAgICAgICBmbGFncyB8PSBDbG9zdXJlRGVjbGFyYXRpb24uaXNBc3luY0ZsYWc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgIGZsYWdzIHw9IENsb3N1cmVEZWNsYXJhdGlvbi5pc0FzeW5jU3RhckZsYWc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgZmxhZ3MgfD0gQ2xvc3VyZURlY2xhcmF0aW9uLmlzU3luY1N0YXJGbGFnOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGZsYWdzIHw9IENsb3N1cmVEZWNsYXJhdGlvbi5pc0RlYnVnZ2FibGVGbGFnOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGZpbmFsIExpc3Q8TmFtZUFuZFR5cGU+IHBhcmFtZXRlcnMgPSA8TmFtZUFuZFR5cGU+W107CiAgICBmb3IgKHZhciB2IGluIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBOYW1lQW5kVHlwZShvYmplY3RUYWJsZS5nZXRQdWJsaWNOYW1lSGFuZGxlKHYubmFtZSksCiAgICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUodi50eXBlKSkpOwogICAgfQogICAgZm9yICh2YXIgdiBpbiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgcGFyYW1ldGVycy5hZGQobmV3IE5hbWVBbmRUeXBlKG9iamVjdFRhYmxlLmdldFB1YmxpY05hbWVIYW5kbGUodi5uYW1lKSwKICAgICAgICAgIG9iamVjdFRhYmxlLmdldEhhbmRsZSh2LnR5cGUpKSk7CiAgICB9CiAgICBpZiAoZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBwYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICBpZiAoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBmbGFncyB8PSBDbG9zdXJlRGVjbGFyYXRpb24uaGFzT3B0aW9uYWxOYW1lZFBhcmFtc0ZsYWc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmxhZ3MgfD0gQ2xvc3VyZURlY2xhcmF0aW9uLmhhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtc0ZsYWc7CiAgICAgIH0KICAgIH0KCiAgICBmaW5hbCB0eXBlUGFyYW1zID0KICAgICAgICBvYmplY3RUYWJsZS5nZXRUeXBlUGFyYW1ldGVySGFuZGxlcyhmdW5jdGlvbi50eXBlUGFyYW1ldGVycyk7CiAgICBpZiAodHlwZVBhcmFtcy5pc05vdEVtcHR5KSB7CiAgICAgIGZsYWdzIHw9IENsb3N1cmVEZWNsYXJhdGlvbi5oYXNUeXBlUGFyYW1zRmxhZzsKICAgIH0KCiAgICByZXR1cm4gbmV3IENsb3N1cmVEZWNsYXJhdGlvbigKICAgICAgICBmbGFncywKICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUocGFyZW50KSwKICAgICAgICBvYmplY3RUYWJsZS5nZXRQdWJsaWNOYW1lSGFuZGxlKG5hbWUpLAogICAgICAgIHBvc2l0aW9uLAogICAgICAgIGVuZFBvc2l0aW9uLAogICAgICAgIHR5cGVQYXJhbXMsCiAgICAgICAgZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgIHBhcmFtZXRlcnMsCiAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKGZ1bmN0aW9uLnJldHVyblR5cGUpKTsKICB9CgogIHZvaWQgX2dlblN5bmNZaWVsZGluZ1Byb2xvZ3VlKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgTGFiZWwgY29udGludWF0aW9uTGFiZWwsCiAgICAgIGludCBzd2l0Y2hWYXJJbmRleEluRnJhbWUpIHsKICAgIExhYmVsIGRlYnVnQ2hlY2tMYWJlbCA9IG5ldyBMYWJlbCgpOwoKICAgIC8vIHN3aXRjaF92YXIgPSA6YXdhaXRfanVtcF92YXIKICAgIF9nZW5Mb2FkVmFyKGxvY2Fscy5hd2FpdEp1bXBWYXIpOwogICAgYXNtLmVtaXRTdG9yZUxvY2FsKHN3aXRjaFZhckluZGV4SW5GcmFtZSk7CgogICAgX2dlblB1c2hJbnQoMCk7CgogICAgaWYgKG9wdGlvbnMuZW1pdERlYnVnZ2VyU3RvcHMpIHsKICAgICAgLy8gaWYgKHN3aXRjaF92YXIgIT0gMCkgZ290byBkZWJ1Z0NoZWNrTGFiZWwKICAgICAgYXNtLmVtaXRKdW1wSWZOZVN0cmljdChkZWJ1Z0NoZWNrTGFiZWwpOwoKICAgICAgX3NldHVwSW5pdGlhbENvbnRleHQoZnVuY3Rpb24pOwoKICAgICAgYXNtLmJpbmQoZGVidWdDaGVja0xhYmVsKTsKICAgICAgLy8gVGhlIGRlYnVnZ2VyIG1heSBzZXQgYSBicmVha3BvaW50IG9uIHRoaXMgRGVidWdDaGVjayBvcGNvZGUgYW5kIGl0CiAgICAgIC8vIGV4cGVjdHMgdG8gaGl0IGl0IG9uIHRoZSBmaXJzdCBlbnRyeSB0byB0aGUgYXN5bmMgb3AsIGFzIHdlbGwgYXMgb24KICAgICAgLy8gZWFjaCBzdWJzZXF1ZW50IHJlZW50cnkuCiAgICAgIF9lbWl0Rmlyc3REZWJ1Z0NoZWNrKGZ1bmN0aW9uKTsKCiAgICAgIF9nZW5Mb2FkVmFyKGxvY2Fscy5hd2FpdEp1bXBWYXIpOwoKICAgICAgLy8gaWYgKHN3aXRjaF92YXIgIT0gMCkgZ290byBjb250aW51YXRpb25MYWJlbAogICAgICBfZ2VuUHVzaEludCgwKTsKICAgICAgYXNtLmVtaXRKdW1wSWZOZVN0cmljdChjb250aW51YXRpb25MYWJlbCk7CiAgICB9IGVsc2UgewogICAgICAvLyBpZiAoc3dpdGNoX3ZhciAhPSAwKSBnb3RvIGNvbnRpbnVhdGlvbkxhYmVsCiAgICAgIGFzbS5lbWl0SnVtcElmTmVTdHJpY3QoY29udGludWF0aW9uTGFiZWwpOwoKICAgICAgX3NldHVwSW5pdGlhbENvbnRleHQoZnVuY3Rpb24pOwogICAgfQoKICAgIC8vIFByb2NlZWQgdG8gbm9ybWFsIGVudHJ5LgogIH0KCiAgdm9pZCBfZ2VuU3luY1lpZWxkaW5nRXBpbG9ndWUoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBMYWJlbCBjb250aW51YXRpb25MYWJlbCwKICAgICAgaW50IHN3aXRjaFZhckluZGV4SW5GcmFtZSkgewogICAgYXNtLmJpbmQoY29udGludWF0aW9uTGFiZWwpOwoKICAgIGlmICh5aWVsZFBvaW50cy5pc0VtcHR5KSB7CiAgICAgIGFzbS5lbWl0VHJhcCgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gY29udGV4dCA9IDphd2FpdF9jdHhfdmFyCiAgICBfZ2VuTG9hZFZhcihsb2NhbHMuYXdhaXRDb250ZXh0VmFyKTsKICAgIGFzbS5lbWl0UG9wTG9jYWwobG9jYWxzLmNvbnRleHRWYXJJbmRleEluRnJhbWUpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeWllbGRQb2ludHMubGVuZ3RoOyBpKyspIHsKICAgICAgLy8gMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIGVudHJ5LCB5aWVsZCBwb2ludHMgYXJlIGNvdW50ZWQgZnJvbSAxLgogICAgICBmaW5hbCBpbnQgaW5kZXggPSBpICsgMTsKCiAgICAgIC8vIGlmIChzd2l0Y2hfdmFyID09ICNpbmRleCkgZ290byB5aWVsZFBvaW50c1tpXQogICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHRlc3Qgc3dpdGNoX3ZhciBmb3IgdGhlIGxhc3QgeWllbGQgc3RhdGVtZW50LgogICAgICBpZiAoaSAhPSB5aWVsZFBvaW50cy5sZW5ndGggLSAxKSB7CiAgICAgICAgYXNtLmVtaXRQdXNoKHN3aXRjaFZhckluZGV4SW5GcmFtZSk7CiAgICAgICAgX2dlblB1c2hJbnQoaW5kZXgpOwogICAgICAgIGFzbS5lbWl0SnVtcElmRXFTdHJpY3QoeWllbGRQb2ludHNbaV0pOwogICAgICB9IGVsc2UgewogICAgICAgIGFzbS5lbWl0SnVtcCh5aWVsZFBvaW50c1tpXSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2dlbkFsbG9jYXRlQ2xvc3VyZUluc3RhbmNlKAogICAgICBUcmVlTm9kZSBub2RlLCBpbnQgY2xvc3VyZUZ1bmN0aW9uSW5kZXgsIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgYXNtLmVtaXRBbGxvY2F0ZUNsb3N1cmUoY2xvc3VyZUZ1bmN0aW9uSW5kZXgpOwoKICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICBhc20uZW1pdFN0b3JlTG9jYWwodGVtcCk7CgogICAgLy8gVE9ETyhhbGV4bWFya292KTogV2UgbmVlZCB0byBmaWxsIF9pbnN0YW50aWF0b3JfdHlwZV9hcmd1bWVudHMgZmllbGQKICAgIC8vIG9ubHkgaWYgZnVuY3Rpb24gc2lnbmF0dXJlIHVzZXMgaW5zdGFudGlhdG9yIHR5cGUgYXJndW1lbnRzLgogICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgX2dlblB1c2hJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKCk7CiAgICBhc20uZW1pdFN0b3JlRmllbGRUT1MoCiAgICAgICAgY3AuYWRkSW5zdGFuY2VGaWVsZChjbG9zdXJlSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cykpOwoKICAgIGFzbS5lbWl0UHVzaCh0ZW1wKTsKICAgIF9nZW5QdXNoRnVuY3Rpb25UeXBlQXJndW1lbnRzKCk7CiAgICBhc20uZW1pdFN0b3JlRmllbGRUT1MoY3AuYWRkSW5zdGFuY2VGaWVsZChjbG9zdXJlRnVuY3Rpb25UeXBlQXJndW1lbnRzKSk7CgogICAgLy8gRGVsYXllZCB0eXBlIGFyZ3VtZW50cyBhcmUgb25seSB1c2VkIGJ5IGdlbmVyaWMgY2xvc3VyZXMuCiAgICBpZiAoZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBhc20uZW1pdFB1c2godGVtcCk7CiAgICAgIGFzbS5lbWl0UHVzaENvbnN0YW50KGNwLmFkZEVtcHR5VHlwZUFyZ3VtZW50cygpKTsKICAgICAgYXNtLmVtaXRTdG9yZUZpZWxkVE9TKGNwLmFkZEluc3RhbmNlRmllbGQoY2xvc3VyZURlbGF5ZWRUeXBlQXJndW1lbnRzKSk7CiAgICB9CgogICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQoY2xvc3VyZUZ1bmN0aW9uSW5kZXgpOwogICAgYXNtLmVtaXRTdG9yZUZpZWxkVE9TKGNwLmFkZEluc3RhbmNlRmllbGQoY2xvc3VyZUZ1bmN0aW9uKSk7CgogICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5jb250ZXh0VmFySW5kZXhJbkZyYW1lKTsKICAgIGFzbS5lbWl0U3RvcmVGaWVsZFRPUyhjcC5hZGRJbnN0YW5jZUZpZWxkKGNsb3N1cmVDb250ZXh0KSk7CiAgfQoKICB2b2lkIF9nZW5DbG9zdXJlKExvY2FsRnVuY3Rpb24gbm9kZSwgU3RyaW5nIG5hbWUsIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgZmluYWwgaW50IGNsb3N1cmVGdW5jdGlvbkluZGV4ID0gX2dlbkNsb3N1cmVCeXRlY29kZShub2RlLCBuYW1lLCBmdW5jdGlvbik7CiAgICBfZ2VuQWxsb2NhdGVDbG9zdXJlSW5zdGFuY2Uobm9kZSwgY2xvc3VyZUZ1bmN0aW9uSW5kZXgsIGZ1bmN0aW9uKTsKICB9CgogIHZvaWQgX2FsbG9jYXRlQ29udGV4dElmTmVlZGVkKCkgewogICAgZmluYWwgaW50IGNvbnRleHRTaXplID0gbG9jYWxzLmN1cnJlbnRDb250ZXh0U2l6ZTsKICAgIGlmIChjb250ZXh0U2l6ZSA+IDApIHsKICAgICAgYXNtLmVtaXRBbGxvY2F0ZUNvbnRleHQobG9jYWxzLmN1cnJlbnRDb250ZXh0SWQsIGNvbnRleHRTaXplKTsKCiAgICAgIGlmIChsb2NhbHMuY3VycmVudENvbnRleHRMZXZlbCA+IDApIHsKICAgICAgICBfZ2VuRHVwVE9TKGxvY2Fscy5zY3JhdGNoVmFySW5kZXhJbkZyYW1lKTsKICAgICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmNvbnRleHRWYXJJbmRleEluRnJhbWUpOwogICAgICAgIGFzbS5lbWl0U3RvcmVDb250ZXh0UGFyZW50KCk7CiAgICAgIH0KCiAgICAgIGFzbS5lbWl0UG9wTG9jYWwobG9jYWxzLmNvbnRleHRWYXJJbmRleEluRnJhbWUpOwogICAgfQogIH0KCiAgdm9pZCBfZW50ZXJTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBsb2NhbHMuZW50ZXJTY29wZShub2RlKTsKICAgIF9hbGxvY2F0ZUNvbnRleHRJZk5lZWRlZCgpOwogICAgaWYgKG9wdGlvbnMuZW1pdExvY2FsVmFySW5mbykgewogICAgICBhc20ubG9jYWxWYXJpYWJsZVRhYmxlCiAgICAgICAgICAuZW50ZXJTY29wZShhc20ub2Zmc2V0LCBsb2NhbHMuY3VycmVudENvbnRleHRMZXZlbCwgbm9kZS5maWxlT2Zmc2V0KTsKICAgICAgX3N0YXJ0UmVjb3JkaW5nTWF4UG9zaXRpb24obm9kZS5maWxlT2Zmc2V0KTsKICAgIH0KICB9CgogIHZvaWQgX2xlYXZlU2NvcGUoKSB7CiAgICBpZiAob3B0aW9ucy5lbWl0TG9jYWxWYXJJbmZvKSB7CiAgICAgIGFzbS5sb2NhbFZhcmlhYmxlVGFibGUubGVhdmVTY29wZShhc20ub2Zmc2V0LCBfZW5kUmVjb3JkaW5nTWF4UG9zaXRpb24oKSk7CiAgICB9CiAgICBpZiAobG9jYWxzLmN1cnJlbnRDb250ZXh0U2l6ZSA+IDApIHsKICAgICAgX2dlblVud2luZENvbnRleHQobG9jYWxzLmN1cnJlbnRDb250ZXh0TGV2ZWwgLSAxKTsKICAgIH0KICAgIGxvY2Fscy5sZWF2ZVNjb3BlKCk7CiAgfQoKICB2b2lkIF9zdGFydFJlY29yZGluZ01heFBvc2l0aW9uKGludCBmaWxlT2Zmc2V0KSB7CiAgICBzYXZlZE1heFNvdXJjZVBvc2l0aW9ucy5hZGQobWF4U291cmNlUG9zaXRpb24pOwogICAgbWF4U291cmNlUG9zaXRpb24gPSBmaWxlT2Zmc2V0OwogIH0KCiAgaW50IF9lbmRSZWNvcmRpbmdNYXhQb3NpdGlvbigpIHsKICAgIGludCBsb2NhbE1heCA9IG1heFNvdXJjZVBvc2l0aW9uOwogICAgbWF4U291cmNlUG9zaXRpb24gPQogICAgICAgIG1hdGgubWF4KGxvY2FsTWF4LCBzYXZlZE1heFNvdXJjZVBvc2l0aW9ucy5yZW1vdmVMYXN0KCkpOwogICAgcmV0dXJuIGxvY2FsTWF4OwogIH0KCiAgdm9pZCBfZ2VuVW53aW5kQ29udGV4dChpbnQgdGFyZ2V0Q29udGV4dExldmVsKSB7CiAgICBpbnQgY3VycmVudENvbnRleHRMZXZlbCA9IGxvY2Fscy5jdXJyZW50Q29udGV4dExldmVsOwogICAgYXNzZXJ0KGN1cnJlbnRDb250ZXh0TGV2ZWwgPj0gdGFyZ2V0Q29udGV4dExldmVsKTsKICAgIHdoaWxlIChjdXJyZW50Q29udGV4dExldmVsID4gdGFyZ2V0Q29udGV4dExldmVsKSB7CiAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuY29udGV4dFZhckluZGV4SW5GcmFtZSk7CiAgICAgIGFzbS5lbWl0TG9hZENvbnRleHRQYXJlbnQoKTsKICAgICAgYXNtLmVtaXRQb3BMb2NhbChsb2NhbHMuY29udGV4dFZhckluZGV4SW5GcmFtZSk7CiAgICAgIC0tY3VycmVudENvbnRleHRMZXZlbDsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHRyeS1maW5hbGx5IGJsb2NrcyBiZXR3ZWVuIFtmcm9tXSBhbmQgW3RvXSwKICAvLy8gb3JkZXJlZCBmcm9tIGlubmVyIHRvIG91dGVyLiBJZiBbdG9dIGlzIG51bGwsIHJldHVybnMgYWxsIGVuY2xvc2luZwogIC8vLyB0cnktZmluYWxseSBibG9ja3MgdXAgdG8gdGhlIGZ1bmN0aW9uIGJvdW5kYXJ5LgogIExpc3Q8VHJ5RmluYWxseT4gX2dldEVuY2xvc2luZ1RyeUZpbmFsbHlCbG9ja3MoVHJlZU5vZGUgZnJvbSwgVHJlZU5vZGUgdG8pIHsKICAgIExpc3Q8VHJ5RmluYWxseT4gYmxvY2tzID0gPFRyeUZpbmFsbHk+W107CiAgICBUcmVlTm9kZSBub2RlID0gZnJvbTsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKG5vZGUgPT0gdG8pIHsKICAgICAgICByZXR1cm4gYmxvY2tzOwogICAgICB9CiAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZSBpcyBGdW5jdGlvbk5vZGUgfHwgbm9kZSBpcyBNZW1iZXIpIHsKICAgICAgICBpZiAodG8gPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGJsb2NrczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgJ1VuYWJsZSB0byBmaW5kIG5vZGUgJHRvIHVwIGZyb20gJGZyb20nOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBJbnNwZWN0IHBhcmVudCBhcyB3ZSBvbmx5IG5lZWQgdHJ5LWZpbmFsbHkgYmxvY2tzIGVuY2xvc2luZyBbbm9kZV0KICAgICAgLy8gaW4gdGhlIGJvZHksIGFuZCBub3QgaW4gdGhlIGZpbmFsbHktYmxvY2suCiAgICAgIGZpbmFsIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICBpZiAocGFyZW50IGlzIFRyeUZpbmFsbHkgJiYgcGFyZW50LmJvZHkgPT0gbm9kZSkgewogICAgICAgIGJsb2Nrcy5hZGQocGFyZW50KTsKICAgICAgfQogICAgICBub2RlID0gcGFyZW50OwogICAgfQogIH0KCiAgLy8vIEFwcGVuZHMgY2hhaW5lZCBbRmluYWxseUJsb2NrXXMgdG8gZWFjaCB0cnktZmluYWxseSBpbiB0aGUgZ2l2ZW4KICAvLy8gbGlzdCBbdHJ5RmluYWxseUJsb2Nrc10gKG9yZGVyZWQgZnJvbSBpbm5lciB0byBvdXRlcikuCiAgLy8vIFtjb250aW51YXRpb25dIGlzIGludm9rZWQgdG8gZ2VuZXJhdGUgY29udHJvbCB0cmFuc2ZlciBjb2RlIGZvbGxvd2luZwogIC8vLyB0aGUgbGFzdCBmaW5hbGx5IGJsb2NrLgogIHZvaWQgX2FkZEZpbmFsbHlCbG9ja3MoCiAgICAgIExpc3Q8VHJ5RmluYWxseT4gdHJ5RmluYWxseUJsb2NrcywgR2VuZXJhdGVDb250aW51YXRpb24gY29udGludWF0aW9uKSB7CiAgICAvLyBBZGQgZmluYWxseSBibG9ja3MgdG8gYWxsIHRyeS1maW5hbGx5IGZyb20gb3V0ZXIgdG8gaW5uZXIuCiAgICAvLyBUaGUgb3V0ZXJtb3N0IGZpbmFsbHkgYmxvY2sgc2hvdWxkIGdlbmVyYXRlIGNvbnRpbnVhdGlvbiwgZWFjaCBpbm5lcgogICAgLy8gZmluYWxseSBibG9jayBzaG91bGQgcHJvY2VlZCB0byBhIGNvcnJlc3BvbmRpbmcgb3V0ZXIgYmxvY2suCiAgICBmb3IgKHZhciB0cnlGaW5hbGx5IGluIHRyeUZpbmFsbHlCbG9ja3MucmV2ZXJzZWQpIHsKICAgICAgZmluYWwgZmluYWxseUJsb2NrID0gbmV3IEZpbmFsbHlCbG9jayhjb250aW51YXRpb24pOwogICAgICBmaW5hbGx5QmxvY2tzW3RyeUZpbmFsbHldLmFkZChmaW5hbGx5QmxvY2spOwoKICAgICAgZmluYWwgTGFiZWwgbmV4dEZpbmFsbHkgPSBmaW5hbGx5QmxvY2suZW50cnk7CiAgICAgIGNvbnRpbnVhdGlvbiA9ICgpIHsKICAgICAgICBhc20uZW1pdEp1bXAobmV4dEZpbmFsbHkpOwogICAgICB9OwogICAgfQoKICAgIC8vIEdlbmVyYXRlIGp1bXAgdG8gdGhlIGlubmVybW9zdCBmaW5hbGx5IChvciB0byB0aGUgb3JpZ2luYWwKICAgIC8vIGNvbnRpbnVhdGlvbiBpZiB0aGVyZSBhcmUgbm8gdHJ5LWZpbmFsbHkgYmxvY2tzKS4KICAgIGNvbnRpbnVhdGlvbigpOwogIH0KCiAgLy8vIEdlbmVyYXRlcyBub24tbG9jYWwgdHJhbnNmZXIgZnJvbSBpbm5lciBub2RlIFtmcm9tXSBpbnRvIHRoZSBvdXRlcgogIC8vLyBub2RlLCBleGVjdXRpbmcgZmluYWxseSBibG9ja3Mgb24gdGhlIHdheSBvdXQuIFt0b10gY2FuIGJlIG51bGwsCiAgLy8vIGluIHN1Y2ggY2FzZSBhbGwgZW5jbG9zaW5nIGZpbmFsbHkgYmxvY2tzIGFyZSBleGVjdXRlZC4KICAvLy8gW2NvbnRpbnVhdGlvbl0gaXMgaW52b2tlZCB0byBnZW5lcmF0ZSBjb250cm9sIHRyYW5zZmVyIGNvZGUgZm9sbG93aW5nCiAgLy8vIHRoZSBsYXN0IGZpbmFsbHkgYmxvY2suCiAgdm9pZCBfZ2VuZXJhdGVOb25Mb2NhbENvbnRyb2xUcmFuc2ZlcigKICAgICAgVHJlZU5vZGUgZnJvbSwgVHJlZU5vZGUgdG8sIEdlbmVyYXRlQ29udGludWF0aW9uIGNvbnRpbnVhdGlvbikgewogICAgaWYgKG9wdGlvbnMuZW1pdERlYnVnZ2VyU3RvcHMgJiYgZnJvbS5maWxlT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIGFzbS5lbWl0RGVidWdDaGVjaygpOyAvLyBCZWZvcmUgY29udGV4dCBpcyB1bndvdW5kLgogICAgfQogICAgTGlzdDxUcnlGaW5hbGx5PiB0cnlGaW5hbGx5QmxvY2tzID0gX2dldEVuY2xvc2luZ1RyeUZpbmFsbHlCbG9ja3MoZnJvbSwgdG8pOwogICAgX2FkZEZpbmFsbHlCbG9ja3ModHJ5RmluYWxseUJsb2NrcywgY29udGludWF0aW9uKTsKICB9CgogIC8vIEZvciBjZXJ0YWluIGV4cHJlc3Npb25zIHdyYXBwZWQgaW50byBFeHByZXNzaW9uU3RhdGVtZW50IHdlIGNhbgogIC8vIG9taXQgcHVzaGluZyByZXN1bHQgb24gdGhlIHN0YWNrLgogIGJvb2wgaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdChFeHByZXNzaW9uIGV4cHIpID0+CiAgICAgIGV4cHIucGFyZW50IGlzIEV4cHJlc3Npb25TdGF0ZW1lbnQgJiYKICAgICAgKGV4cHIgaXMgVmFyaWFibGVTZXQgfHwKICAgICAgICAgIGV4cHIgaXMgUHJvcGVydHlTZXQgfHwKICAgICAgICAgIGV4cHIgaXMgU3RhdGljU2V0IHx8CiAgICAgICAgICBleHByIGlzIFN1cGVyUHJvcGVydHlTZXQgfHwKICAgICAgICAgIGV4cHIgaXMgRGlyZWN0UHJvcGVydHlTZXQpOwoKICB2b2lkIF9jcmVhdGVBcmd1bWVudHNBcnJheShpbnQgdGVtcCwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3MsCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYXJncywgYm9vbCBzdG9yZUxhc3RBcmd1bWVudFRvVGVtcCkgewogICAgZmluYWwgaW50IHRvdGFsQ291bnQgPSAodHlwZUFyZ3MuaXNOb3RFbXB0eSA/IDEgOiAwKSArIGFyZ3MubGVuZ3RoOwoKICAgIF9nZW5UeXBlQXJndW1lbnRzKFtjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgICBfZ2VuUHVzaEludCh0b3RhbENvdW50KTsKICAgIGFzbS5lbWl0Q3JlYXRlQXJyYXlUT1MoKTsKCiAgICBhc20uZW1pdFN0b3JlTG9jYWwodGVtcCk7CgogICAgaW50IGluZGV4ID0gMDsKICAgIGlmICh0eXBlQXJncy5pc05vdEVtcHR5KSB7CiAgICAgIGFzbS5lbWl0UHVzaCh0ZW1wKTsKICAgICAgX2dlblB1c2hJbnQoaW5kZXgrKyk7CiAgICAgIF9nZW5UeXBlQXJndW1lbnRzKHR5cGVBcmdzKTsKICAgICAgYXNtLmVtaXRTdG9yZUluZGV4ZWRUT1MoKTsKICAgIH0KCiAgICBmb3IgKEV4cHJlc3Npb24gYXJnIGluIGFyZ3MpIHsKICAgICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgICBfZ2VuUHVzaEludChpbmRleCsrKTsKICAgICAgX2dlbmVyYXRlTm9kZShhcmcpOwogICAgICBpZiAoc3RvcmVMYXN0QXJndW1lbnRUb1RlbXAgJiYgaW5kZXggPT0gdG90YWxDb3VudCkgewogICAgICAgIC8vIEFyZ3VtZW50cyBhcnJheSBpbiAndGVtcCcgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudAogICAgICAgIC8vIGluIG9yZGVyIHRvIHJldHVybiByZXN1bHQgb2YgUkhTIHZhbHVlIGluIGNhc2Ugb2Ygc2V0dGVyLgogICAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKICAgICAgfQogICAgICBhc20uZW1pdFN0b3JlSW5kZXhlZFRPUygpOwogICAgfQogIH0KCiAgdm9pZCBfZ2VuTm9TdWNoTWV0aG9kRm9yU3VwZXJDYWxsKFN0cmluZyBuYW1lLCBpbnQgdGVtcCwgaW50IGFyZ0Rlc2NDcEluZGV4LAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJncywgTGlzdDxFeHByZXNzaW9uPiBhcmdzLAogICAgICB7Ym9vbCBzdG9yZUxhc3RBcmd1bWVudFRvVGVtcDogZmFsc2V9KSB7CiAgICAvLyBSZWNlaXZlciBmb3Igbm9TdWNoTWV0aG9kKCkgY2FsbC4KICAgIF9nZW5QdXNoUmVjZWl2ZXIoKTsKCiAgICAvLyBBcmd1bWVudCAwIGZvciBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yKCk6IGZ1bmN0aW9uIG5hbWUuCiAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGROYW1lKG5hbWUpKTsKCiAgICAvLyBBcmd1bWVudCAxIGZvciBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yKCk6IGFyZ3VtZW50cyBkZXNjcmlwdG9yLgogICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQoYXJnRGVzY0NwSW5kZXgpOwoKICAgIC8vIEFyZ3VtZW50IDIgZm9yIF9hbGxvY2F0ZUludm9jYXRpb25NaXJyb3IoKTogbGlzdCBvZiBhcmd1bWVudHMuCiAgICBfY3JlYXRlQXJndW1lbnRzQXJyYXkodGVtcCwgdHlwZUFyZ3MsIGFyZ3MsIHN0b3JlTGFzdEFyZ3VtZW50VG9UZW1wKTsKCiAgICAvLyBBcmd1bWVudCAzIGZvciBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yKCk6IGlzU3VwZXJJbnZvY2F0aW9uIGZsYWcuCiAgICBhc20uZW1pdFB1c2hUcnVlKCk7CgogICAgX2dlbkRpcmVjdENhbGwoCiAgICAgICAgYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yLCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDQpLCA0KTsKCiAgICBmaW5hbCBNZW1iZXIgdGFyZ2V0ID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KAogICAgICAgIGVuY2xvc2luZ0NsYXNzLnN1cGVyY2xhc3MsIG5vU3VjaE1ldGhvZE5hbWUpOwogICAgYXNzZXJ0KHRhcmdldCAhPSBudWxsKTsKICAgIF9nZW5EaXJlY3RDYWxsKHRhcmdldCwgb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZSgyKSwgMik7CiAgfQoKICBAb3ZlcnJpZGUKICBkZWZhdWx0VHJlZU5vZGUoTm9kZSBub2RlKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcigKICAgICAgJ1Vuc3VwcG9ydGVkIG5vZGUgJHtub2RlLnJ1bnRpbWVUeXBlfScpOwoKICBAb3ZlcnJpZGUKICB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gbm9kZSkgewogICAgX2dlbmVyYXRlTm9kZShub2RlLm9wZXJhbmQpOwoKICAgIGZpbmFsIHR5cGUgPSBub2RlLnR5cGU7CiAgICBpZiAodHlwZUVudmlyb25tZW50LmlzVG9wKHR5cGUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBfZ2VuQXNzZXJ0QXNzaWduYWJsZSh0eXBlLAogICAgICAgIG1lc3NhZ2U6IG5vZGUuaXNUeXBlRXJyb3IgPyAnJyA6IHN5bWJvbEZvclR5cGVDYXN0KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgX2dlblB1c2hCb29sKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgX2dlblB1c2hJbnQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICBmaW5hbCBjcEluZGV4ID0gY3AuYWRkT2JqZWN0UmVmKG5ldyBEb3VibGVDb25zdGFudChub2RlLnZhbHVlKSk7CiAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcEluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBMYWJlbCBvdGhlcndpc2VQYXJ0ID0gbmV3IExhYmVsKCk7CiAgICBmaW5hbCBMYWJlbCBkb25lID0gbmV3IExhYmVsKCk7CiAgICBmaW5hbCBpbnQgdGVtcCA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUpOwoKICAgIF9nZW5Db25kaXRpb25BbmRKdW1wSWYobm9kZS5jb25kaXRpb24sIGZhbHNlLCBvdGhlcndpc2VQYXJ0KTsKCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUudGhlbik7CiAgICBhc20uZW1pdFBvcExvY2FsKHRlbXApOwogICAgYXNtLmVtaXRKdW1wKGRvbmUpOwoKICAgIGFzbS5iaW5kKG90aGVyd2lzZVBhcnQpOwogICAgX2dlbmVyYXRlTm9kZShub2RlLm90aGVyd2lzZSk7CiAgICBhc20uZW1pdFBvcExvY2FsKHRlbXApOwoKICAgIGFzbS5iaW5kKGRvbmUpOwogICAgYXNtLmVtaXRQdXNoKHRlbXApOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgX2dlblB1c2hDb25zdEV4cHIobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBjb25zdHJ1Y3RlZENsYXNzID0gbm9kZS5jb25zdHJ1Y3RlZFR5cGUuY2xhc3NOb2RlOwogICAgZmluYWwgY2xhc3NJbmRleCA9IGNwLmFkZENsYXNzKGNvbnN0cnVjdGVkQ2xhc3MpOwoKICAgIGlmIChoYXNJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKGNvbnN0cnVjdGVkQ2xhc3MpKSB7CiAgICAgIF9nZW5UeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzLnR5cGVzLAogICAgICAgICAgaW5zdGFudGlhdGluZ0NsYXNzOiBjb25zdHJ1Y3RlZENsYXNzKTsKICAgICAgYXNtLmVtaXRQdXNoQ29uc3RhbnQoY3AuYWRkQ2xhc3MoY29uc3RydWN0ZWRDbGFzcykpOwogICAgICBhc20uZW1pdEFsbG9jYXRlVCgpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5vZGUuYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpOwogICAgICBhc20uZW1pdEFsbG9jYXRlKGNsYXNzSW5kZXgpOwogICAgfQoKICAgIF9nZW5EdXBUT1MobG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSkpOwoKICAgIC8vIFJlbW92ZSB0eXBlIGFyZ3VtZW50cyBhcyB0aGV5IGFyZSBvbmx5IHBhc3NlZCB0byBpbnN0YW5jZSBhbGxvY2F0aW9uLAogICAgLy8gYW5kIG5vdCBwYXNzZWQgdG8gYSBjb25zdHJ1Y3Rvci4KICAgIGZpbmFsIGFyZ3MgPQogICAgICAgIG5ldyBBcmd1bWVudHMobm9kZS5hcmd1bWVudHMucG9zaXRpb25hbCwgbmFtZWQ6IG5vZGUuYXJndW1lbnRzLm5hbWVkKQogICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgX2dlbkFyZ3VtZW50cyhudWxsLCBhcmdzKTsKICAgIF9nZW5EaXJlY3RDYWxsV2l0aEFyZ3Mobm9kZS50YXJnZXQsIGFyZ3MsIGhhc1JlY2VpdmVyOiB0cnVlLCBub2RlOiBub2RlKTsKICAgIGFzbS5lbWl0RHJvcDEoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGZpbmFsIGFyZ3MgPSBub2RlLmFyZ3VtZW50czsKICAgIF9nZW5Bcmd1bWVudHMobm9kZS5yZWNlaXZlciwgYXJncyk7CiAgICBmaW5hbCB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmICF0YXJnZXQuaXNHZXR0ZXIgJiYgIXRhcmdldC5pc1NldHRlcikgewogICAgICBfZ2VuRGlyZWN0Q2FsbFdpdGhBcmdzKHRhcmdldCwgYXJncywgaGFzUmVjZWl2ZXI6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoCiAgICAgICAgICAnVW5zdXBwb3J0ZWQgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiB3aXRoIHRhcmdldCAke3RhcmdldC5ydW50aW1lVHlwZX0gJHRhcmdldCcpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkIHx8ICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5pc0dldHRlcikpIHsKICAgICAgX2dlbkRpcmVjdENhbGwodGFyZ2V0LCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDEpLCAxLAogICAgICAgICAgaXNHZXQ6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoCiAgICAgICAgICAnVW5zdXBwb3J0ZWQgRGlyZWN0UHJvcGVydHlHZXQgd2l0aCAke3RhcmdldC5ydW50aW1lVHlwZX0gJHRhcmdldCcpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBmaW5hbCBpbnQgdGVtcCA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUpOwogICAgZmluYWwgYm9vbCBoYXNSZXN1bHQgPSAhaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdChub2RlKTsKCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgX2dlbmVyYXRlTm9kZShub2RlLnZhbHVlKTsKCiAgICBpZiAoaGFzUmVzdWx0KSB7CiAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKICAgIH0KCiAgICBmaW5hbCB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGFzc2VydCh0YXJnZXQgaXMgRmllbGQgfHwgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmlzU2V0dGVyKSk7CiAgICBfZ2VuRGlyZWN0Q2FsbCh0YXJnZXQsIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMiksIDIsCiAgICAgICAgaXNTZXQ6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgYXNtLmVtaXREcm9wMSgpOwoKICAgIGlmIChoYXNSZXN1bHQpIHsKICAgICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIF9nZW5DbG9zdXJlKG5vZGUsICc8YW5vbnltb3VzIGNsb3N1cmU+Jywgbm9kZS5mdW5jdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBpbnQgb2xkQ2xvc3VyZSA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUsIHRlbXBJbmRleDogMCk7CiAgICBmaW5hbCBpbnQgbmV3Q2xvc3VyZSA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUsIHRlbXBJbmRleDogMSk7CiAgICBmaW5hbCBpbnQgdHlwZUFyZ3VtZW50cyA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUsIHRlbXBJbmRleDogMik7CgogICAgX2dlbmVyYXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgYXNtLmVtaXRTdG9yZUxvY2FsKG9sZENsb3N1cmUpOwoKICAgIF9nZW5UeXBlQXJndW1lbnRzKG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICBhc20uZW1pdFN0b3JlTG9jYWwodHlwZUFyZ3VtZW50cyk7CgogICAgX2dlbkRpcmVjdENhbGwoCiAgICAgICAgYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbiwgb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZSgyKSwgMik7CiAgICBhc20uZW1pdERyb3AxKCk7CgogICAgYXNzZXJ0KGNsb3N1cmVDbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KTsKICAgIGFzbS5lbWl0QWxsb2NhdGUoY3AuYWRkQ2xhc3MoY2xvc3VyZUNsYXNzKSk7CiAgICBhc20uZW1pdFN0b3JlTG9jYWwobmV3Q2xvc3VyZSk7CgogICAgYXNtLmVtaXRQdXNoKHR5cGVBcmd1bWVudHMpOwogICAgYXNtLmVtaXRTdG9yZUZpZWxkVE9TKGNwLmFkZEluc3RhbmNlRmllbGQoY2xvc3VyZURlbGF5ZWRUeXBlQXJndW1lbnRzKSk7CgogICAgLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIGZyb20gb2xkIGNsb3N1cmUgdG8gYSBuZXcgY2xvc3VyZS4KICAgIGZpbmFsIGZpZWxkc1RvQ29weSA9IDxGaWVsZD5bCiAgICAgIGNsb3N1cmVJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLAogICAgICBjbG9zdXJlRnVuY3Rpb25UeXBlQXJndW1lbnRzLAogICAgICBjbG9zdXJlRnVuY3Rpb24sCiAgICAgIGNsb3N1cmVDb250ZXh0LAogICAgXTsKCiAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGZpZWxkc1RvQ29weSkgewogICAgICBmaW5hbCBmaWVsZE9mZnNldENwSW5kZXggPSBjcC5hZGRJbnN0YW5jZUZpZWxkKGZpZWxkKTsKICAgICAgYXNtLmVtaXRQdXNoKG5ld0Nsb3N1cmUpOwogICAgICBhc20uZW1pdFB1c2gob2xkQ2xvc3VyZSk7CiAgICAgIGFzbS5lbWl0TG9hZEZpZWxkVE9TKGZpZWxkT2Zmc2V0Q3BJbmRleCk7CiAgICAgIGFzbS5lbWl0U3RvcmVGaWVsZFRPUyhmaWVsZE9mZnNldENwSW5kZXgpOwogICAgfQoKICAgIGFzbS5lbWl0UHVzaChuZXdDbG9zdXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUub3BlcmFuZCk7CiAgICBfZ2VuSW5zdGFuY2VPZihub2RlLnR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIF9lbnRlclNjb3BlKG5vZGUpOwogICAgX2dlbmVyYXRlTm9kZShub2RlLnZhcmlhYmxlKTsKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5ib2R5KTsKICAgIF9sZWF2ZVNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgX2dlblB1c2hDb25zdEV4cHIobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBfZ2VuVHlwZUFyZ3VtZW50cyhbbm9kZS50eXBlQXJndW1lbnRdKTsKCiAgICBpZiAobm9kZS5leHByZXNzaW9ucy5pc0VtcHR5KSB7CiAgICAgIGFzbS5lbWl0UHVzaENvbnN0YW50KAogICAgICAgICAgY3AuYWRkT2JqZWN0UmVmKG5ldyBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgY29uc3QgW10pKSk7CiAgICB9IGVsc2UgewogICAgICBfZ2VuRHVwVE9TKGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUpKTsKICAgICAgX2dlblB1c2hJbnQobm9kZS5leHByZXNzaW9ucy5sZW5ndGgpOwogICAgICBhc20uZW1pdENyZWF0ZUFycmF5VE9TKCk7CiAgICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGFzbS5lbWl0UHVzaCh0ZW1wKTsKICAgICAgICBfZ2VuUHVzaEludChpKTsKICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZXhwcmVzc2lvbnNbaV0pOwogICAgICAgIGFzbS5lbWl0U3RvcmVJbmRleGVkVE9TKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBMaXN0Ll9mcm9tTGl0ZXJhbCBpcyBhIGZhY3RvcnkgY29uc3RydWN0b3IuCiAgICAvLyBUeXBlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBmYWN0b3J5IGNvbnN0cnVjdG9yIGFyZSBjb3VudGVkIGFzIGEgbm9ybWFsCiAgICAvLyBhcmd1bWVudCBhbmQgbm90IGNvdW50ZWQgaW4gbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzLgogICAgYXNzZXJ0KGxpc3RGcm9tTGl0ZXJhbC5pc0ZhY3RvcnkpOwogICAgX2dlbkRpcmVjdENhbGwobGlzdEZyb21MaXRlcmFsLCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDIpLCAyKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgYXNzZXJ0KG5vZGUub3BlcmF0b3IgPT0gJ3x8JyB8fCBub2RlLm9wZXJhdG9yID09ICcmJicpOwoKICAgIGZpbmFsIExhYmVsIHNob3J0Q2lyY3VpdCA9IG5ldyBMYWJlbCgpOwogICAgZmluYWwgTGFiZWwgZG9uZSA9IG5ldyBMYWJlbCgpOwogICAgZmluYWwgaW50IHRlbXAgPSBsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlKTsKICAgIGZpbmFsIGlzT1IgPSAobm9kZS5vcGVyYXRvciA9PSAnfHwnKTsKCiAgICBfZ2VuQ29uZGl0aW9uQW5kSnVtcElmKG5vZGUubGVmdCwgaXNPUiwgc2hvcnRDaXJjdWl0KTsKCiAgICBib29sIG5lZ2F0ZWQgPSBfZ2VuQ29uZGl0aW9uKG5vZGUucmlnaHQpOwogICAgaWYgKG5lZ2F0ZWQpIHsKICAgICAgYXNtLmVtaXRCb29sZWFuTmVnYXRlVE9TKCk7CiAgICB9CiAgICBhc20uZW1pdFBvcExvY2FsKHRlbXApOwogICAgYXNtLmVtaXRKdW1wKGRvbmUpOwoKICAgIGFzbS5iaW5kKHNob3J0Q2lyY3VpdCk7CiAgICBfZ2VuUHVzaEJvb2woaXNPUik7CiAgICBhc20uZW1pdFBvcExvY2FsKHRlbXApOwoKICAgIGFzbS5iaW5kKGRvbmUpOwogICAgYXNtLmVtaXRQdXNoKHRlbXApOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICBfZ2VuUHVzaENvbnN0RXhwcihub2RlKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIF9nZW5UeXBlQXJndW1lbnRzKFtub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlXSk7CgogICAgaWYgKG5vZGUuZW50cmllcy5pc0VtcHR5KSB7CiAgICAgIGFzbS5lbWl0UHVzaENvbnN0YW50KAogICAgICAgICAgY3AuYWRkT2JqZWN0UmVmKG5ldyBMaXN0Q29uc3RhbnQoY29uc3QgRHluYW1pY1R5cGUoKSwgY29uc3QgW10pKSk7CiAgICB9IGVsc2UgewogICAgICBfZ2VuVHlwZUFyZ3VtZW50cyhbY29uc3QgRHluYW1pY1R5cGUoKV0pOwogICAgICBfZ2VuUHVzaEludChub2RlLmVudHJpZXMubGVuZ3RoICogMik7CiAgICAgIGFzbS5lbWl0Q3JlYXRlQXJyYXlUT1MoKTsKCiAgICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8ga2V5CiAgICAgICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgICAgIF9nZW5QdXNoSW50KGkgKiAyKTsKICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZW50cmllc1tpXS5rZXkpOwogICAgICAgIGFzbS5lbWl0U3RvcmVJbmRleGVkVE9TKCk7CiAgICAgICAgLy8gdmFsdWUKICAgICAgICBhc20uZW1pdFB1c2godGVtcCk7CiAgICAgICAgX2dlblB1c2hJbnQoaSAqIDIgKyAxKTsKICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZW50cmllc1tpXS52YWx1ZSk7CiAgICAgICAgYXNtLmVtaXRTdG9yZUluZGV4ZWRUT1MoKTsKICAgICAgfQogICAgfQoKICAgIC8vIE1hcC5fZnJvbUxpdGVyYWwgaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLgogICAgLy8gVHlwZSBhcmd1bWVudHMgcGFzc2VkIHRvIGEgZmFjdG9yeSBjb25zdHJ1Y3RvciBhcmUgY291bnRlZCBhcyBhIG5vcm1hbAogICAgLy8gYXJndW1lbnQgYW5kIG5vdCBjb3VudGVkIGluIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cy4KICAgIGFzc2VydChtYXBGcm9tTGl0ZXJhbC5pc0ZhY3RvcnkpOwogICAgX2dlbkRpcmVjdENhbGwobWFwRnJvbUxpdGVyYWwsIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMiksIDIpOwogIH0KCiAgdm9pZCBfZ2VuTWV0aG9kSW52b2NhdGlvblVzaW5nU3BlY2lhbGl6ZWRCeXRlY29kZSgKICAgICAgT3Bjb2RlIG9wY29kZSwgTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICBjYXNlIE9wY29kZS5rRXF1YWxzTnVsbDoKICAgICAgICBpZiAobm9kZS5yZWNlaXZlciBpcyBOdWxsTGl0ZXJhbCkgewogICAgICAgICAgX2dlbmVyYXRlTm9kZShub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLnNpbmdsZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBPcGNvZGUua05lZ2F0ZUludDoKICAgICAgY2FzZSBPcGNvZGUua05lZ2F0ZURvdWJsZToKICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBPcGNvZGUua0FkZEludDoKICAgICAgY2FzZSBPcGNvZGUua1N1YkludDoKICAgICAgY2FzZSBPcGNvZGUua011bEludDoKICAgICAgY2FzZSBPcGNvZGUua1RydW5jRGl2SW50OgogICAgICBjYXNlIE9wY29kZS5rTW9kSW50OgogICAgICBjYXNlIE9wY29kZS5rQml0QW5kSW50OgogICAgICBjYXNlIE9wY29kZS5rQml0T3JJbnQ6CiAgICAgIGNhc2UgT3Bjb2RlLmtCaXRYb3JJbnQ6CiAgICAgIGNhc2UgT3Bjb2RlLmtTaGxJbnQ6CiAgICAgIGNhc2UgT3Bjb2RlLmtTaHJJbnQ6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlSW50RXE6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlSW50R3Q6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlSW50THQ6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlSW50R2U6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlSW50TGU6CiAgICAgIGNhc2UgT3Bjb2RlLmtBZGREb3VibGU6CiAgICAgIGNhc2UgT3Bjb2RlLmtTdWJEb3VibGU6CiAgICAgIGNhc2UgT3Bjb2RlLmtNdWxEb3VibGU6CiAgICAgIGNhc2UgT3Bjb2RlLmtEaXZEb3VibGU6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlRG91YmxlRXE6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlRG91YmxlR3Q6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlRG91YmxlTHQ6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlRG91YmxlR2U6CiAgICAgIGNhc2UgT3Bjb2RlLmtDb21wYXJlRG91YmxlTGU6CiAgICAgICAgX2dlbmVyYXRlTm9kZShub2RlLnJlY2VpdmVyKTsKICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlKTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgc3BlY2lhbGl6ZWQgYnl0ZWNvZGUgJG9wY29kZSc7CiAgICB9CgogICAgYXNtLmVtaXRTcGVjaWFsaXplZEJ5dGVjb2RlKG9wY29kZSk7CiAgfQoKICBib29sIF9pc1VuY2hlY2tlZENhbGwoCiAgICAgICAgICBOb2RlIG5vZGUsIE1lbWJlciBpbnRlcmZhY2VUYXJnZXQsIEV4cHJlc3Npb24gcmVjZWl2ZXIpID0+CiAgICAgIGlzVW5jaGVja2VkQ2FsbChpbnRlcmZhY2VUYXJnZXQsIHJlY2VpdmVyLCBzdGF0aWNUeXBlQ29udGV4dCkgfHwKICAgICAgKGluZmVycmVkVHlwZU1ldGFkYXRhICE9IG51bGwgJiYKICAgICAgICAgIGluZmVycmVkVHlwZU1ldGFkYXRhW25vZGVdPy5za2lwQ2hlY2sgPT0gdHJ1ZSk7CgogIHZvaWQgX2dlbkluc3RhbmNlQ2FsbCgKICAgICAgTm9kZSBub2RlLAogICAgICBJbnZvY2F0aW9uS2luZCBpbnZvY2F0aW9uS2luZCwKICAgICAgTWVtYmVyIGludGVyZmFjZVRhcmdldCwKICAgICAgTmFtZSB0YXJnZXROYW1lLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBpbnQgdG90YWxBcmdDb3VudCwKICAgICAgT2JqZWN0SGFuZGxlIGFyZ0Rlc2MpIHsKICAgIGZpbmFsIGlzRHluYW1pYyA9IGludGVyZmFjZVRhcmdldCA9PSBudWxsOwogICAgZmluYWwgaXNVbmNoZWNrZWQgPSBpbnZvY2F0aW9uS2luZCAhPSBJbnZvY2F0aW9uS2luZC5nZXR0ZXIgJiYKICAgICAgICBfaXNVbmNoZWNrZWRDYWxsKG5vZGUsIGludGVyZmFjZVRhcmdldCwgcmVjZWl2ZXIpOwoKICAgIGlmIChpbmZlcnJlZFR5cGVNZXRhZGF0YSAhPSBudWxsICYmIG5vZGUgIT0gbnVsbCkgewogICAgICBfYXBwZW5kSW5mZXJyZWRUeXBlKG5vZGUsIGFzbS5vZmZzZXQpOwogICAgfQoKICAgIGJvb2wgZ2VuZXJhdGVkID0gZmFsc2U7CiAgICBpZiAoaW52b2NhdGlvbktpbmQgIT0gSW52b2NhdGlvbktpbmQuZ2V0dGVyICYmICFpc0R5bmFtaWMgJiYgIWlzVW5jaGVja2VkKSB7CiAgICAgIGZpbmFsIHN0YXRpY1JlY2VpdmVyVHlwZSA9IGdldFN0YXRpY1R5cGUocmVjZWl2ZXIsIHN0YXRpY1R5cGVDb250ZXh0KTsKICAgICAgaWYgKGlzSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbChpbnRlcmZhY2VUYXJnZXQsIHN0YXRpY1JlY2VpdmVyVHlwZSkpIHsKICAgICAgICBmaW5hbCBjYWxsQ3BJbmRleCA9IGNwLmFkZEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwoCiAgICAgICAgICAgIGludm9jYXRpb25LaW5kLCBpbnRlcmZhY2VUYXJnZXQsIGFyZ0Rlc2MsIHN0YXRpY1JlY2VpdmVyVHlwZSk7CiAgICAgICAgYXNtLmVtaXRJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsKGNhbGxDcEluZGV4LCB0b3RhbEFyZ0NvdW50KTsKICAgICAgICBnZW5lcmF0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgaWYgKCFnZW5lcmF0ZWQpIHsKICAgICAgZmluYWwgY2FsbENwSW5kZXggPSBjcC5hZGRJbnN0YW5jZUNhbGwoCiAgICAgICAgICBpbnZvY2F0aW9uS2luZCwgaW50ZXJmYWNlVGFyZ2V0LCB0YXJnZXROYW1lLCBhcmdEZXNjKTsKICAgICAgaWYgKGlzRHluYW1pYykgewogICAgICAgIGFzc2VydCghaXNVbmNoZWNrZWQpOwogICAgICAgIGFzbS5lbWl0RHluYW1pY0NhbGwoY2FsbENwSW5kZXgsIHRvdGFsQXJnQ291bnQpOwogICAgICB9IGVsc2UgaWYgKGlzVW5jaGVja2VkKSB7CiAgICAgICAgYXNtLmVtaXRVbmNoZWNrZWRJbnRlcmZhY2VDYWxsKGNhbGxDcEluZGV4LCB0b3RhbEFyZ0NvdW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdEludGVyZmFjZUNhbGwoY2FsbENwSW5kZXgsIHRvdGFsQXJnQ291bnQpOwogICAgICB9CiAgICB9CgogICAgaWYgKGluZmVycmVkVHlwZU1ldGFkYXRhICE9IG51bGwgJiYgbm9kZSAhPSBudWxsKSB7CiAgICAgIF9yZXBsYWNlV2l0aENvbnN0YW50VmFsdWUobm9kZSk7CiAgICB9CiAgfQoKICAvLy8gR2VuZXJhdGVzIGJ5dGVjb2RlIGZvciBvLmZvbyhhMCwgLi4uLCBhTikgY2FsbCB3aGVyZSBvLmZvbyBpcyBhCiAgLy8vIGZpZWxkIG9yIGdldHRlci4KICB2b2lkIF9nZW5DYWxsVGhyb3VnaEdldHRlcihNZXRob2RJbnZvY2F0aW9uIG5vZGUsIGludCB0b3RhbEFyZ0NvdW50KSB7CiAgICBmaW5hbCBhcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50czsKICAgIGlmIChhcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSkgewogICAgICBfZ2VuVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMudHlwZXMpOwogICAgfQoKICAgIC8vIEtlZXAgb3JkZXIgb2YgZXZhbHVhdGlvbjogbywgYTAsIC4uLCBhTiwgby5mb28sIG8uZm9vLmNhbGwoYTAsIC4uLiwgYU4pLgogICAgZmluYWwgcmVjZWl2ZXIgPSBub2RlLnJlY2VpdmVyOwogICAgX2dlbmVyYXRlTm9kZShyZWNlaXZlcik7CiAgICBmaW5hbCByZWNlaXZlclRlbXAgPSBsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlLCB0ZW1wSW5kZXg6IDApOwogICAgZmluYWwgY2hlY2tGb3JOdWxsID0KICAgICAgICBub2RlLmludGVyZmFjZVRhcmdldC5lbmNsb3NpbmdDbGFzcyAhPSBjb3JlVHlwZXMub2JqZWN0Q2xhc3M7CiAgICBpZiAoY2hlY2tGb3JOdWxsKSB7CiAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbChyZWNlaXZlclRlbXApOwogICAgfQoKICAgIGludCBjb3VudCA9IDA7CiAgICBmb3IgKHZhciBhcmcgaW4gYXJndW1lbnRzLnBvc2l0aW9uYWwpIHsKICAgICAgX2dlbmVyYXRlTm9kZShhcmcpOwogICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUsIHRlbXBJbmRleDogY291bnQgKyAxKSk7CiAgICAgICsrY291bnQ7CiAgICB9CiAgICBmb3IgKHZhciBhcmcgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgIF9nZW5lcmF0ZU5vZGUoYXJnLnZhbHVlKTsKICAgICAgYXNtLmVtaXRQb3BMb2NhbChsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlLCB0ZW1wSW5kZXg6IGNvdW50ICsgMSkpOwogICAgICArK2NvdW50OwogICAgfQoKICAgIC8vIENoZWNrIHJlY2VpdmVyIGZvciBudWxsIGJlZm9yZSBjYWxsaW5nIGdldHRlciB0byByZXBvcnQKICAgIC8vIGNvcnJlY3Qgbm9TdWNoTWV0aG9kIGZvciBtZXRob2QgY2FsbC4KICAgIGlmIChjaGVja0Zvck51bGwpIHsKICAgICAgYXNtLmVtaXRQdXNoKHJlY2VpdmVyVGVtcCk7CiAgICAgIGFzbS5lbWl0TnVsbENoZWNrKGNwLmFkZFNlbGVjdG9yTmFtZShub2RlLm5hbWUsIEludm9jYXRpb25LaW5kLm1ldGhvZCkpOwogICAgfQoKICAgIF9nZW5JbnN0YW5jZUNhbGwobnVsbCwgSW52b2NhdGlvbktpbmQuZ2V0dGVyLCBub2RlLmludGVyZmFjZVRhcmdldCwKICAgICAgICBub2RlLm5hbWUsIHJlY2VpdmVyLCAxLCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDEpKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUsIHRlbXBJbmRleDogaSArIDEpKTsKICAgIH0KCiAgICBmaW5hbCBhcmdEZXNjID0KICAgICAgICBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlQnlBcmd1bWVudHMoYXJndW1lbnRzLCBoYXNSZWNlaXZlcjogdHJ1ZSk7CgogICAgX2dlbkluc3RhbmNlQ2FsbChub2RlLCBJbnZvY2F0aW9uS2luZC5tZXRob2QsIG51bGwsIGNhbGxOYW1lLCBudWxsLAogICAgICAgIHRvdGFsQXJnQ291bnQsIGFyZ0Rlc2MpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgZmluYWwgZGlyZWN0Q2FsbCA9CiAgICAgICAgZGlyZWN0Q2FsbE1ldGFkYXRhICE9IG51bGwgPyBkaXJlY3RDYWxsTWV0YWRhdGFbbm9kZV0gOiBudWxsOwogICAgZmluYWwgT3Bjb2RlIG9wY29kZSA9IHJlY29nbml6ZWRNZXRob2RzLnNwZWNpYWxpemVkQnl0ZWNvZGVGb3Iobm9kZSk7CiAgICBpZiAob3Bjb2RlICE9IG51bGwgJiYgZGlyZWN0Q2FsbCA9PSBudWxsKSB7CiAgICAgIF9nZW5NZXRob2RJbnZvY2F0aW9uVXNpbmdTcGVjaWFsaXplZEJ5dGVjb2RlKG9wY29kZSwgbm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZpbmFsIGFyZ3MgPSBub2RlLmFyZ3VtZW50czsKICAgIGZpbmFsIHRvdGFsQXJnQ291bnQgPSBhcmdzLnBvc2l0aW9uYWwubGVuZ3RoICsKICAgICAgICBhcmdzLm5hbWVkLmxlbmd0aCArCiAgICAgICAgMSAvKiByZWNlaXZlciAqLyArCiAgICAgICAgKGFyZ3MudHlwZXMuaXNOb3RFbXB0eSA/IDEgOiAwKSAvKiB0eXBlIGFyZ3VtZW50cyAqLzsKICAgIGlmICh0b3RhbEFyZ0NvdW50ID49IGFyZ3VtZW50c0xpbWl0KSB7CiAgICAgIHRocm93IG5ldyBUb29NYW55QXJndW1lbnRzRXhjZXB0aW9uKG5vZGUuZmlsZU9mZnNldCk7CiAgICB9CiAgICAvLyBGcm9udC1lbmQgZ3VhcmFudGVlcyB0aGF0IGFsbCBjYWxscyB3aXRoIGtub3duIGZ1bmN0aW9uIHR5cGUKICAgIC8vIGRvIG5vdCBuZWVkIGFueSBhcmd1bWVudCB0eXBlIGNoZWNrcy4KICAgIGlmIChpc1VuY2hlY2tlZENsb3N1cmVDYWxsKG5vZGUsIHN0YXRpY1R5cGVDb250ZXh0LCBvcHRpb25zKSkgewogICAgICBmaW5hbCBpbnQgcmVjZWl2ZXJUZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICAgIF9nZW5Bcmd1bWVudHMobm9kZS5yZWNlaXZlciwgYXJncywgc3RvcmVSZWNlaXZlclRvTG9jYWw6IHJlY2VpdmVyVGVtcCk7CiAgICAgIC8vIER1cGxpY2F0ZSByZWNlaXZlciAoY2xvc3VyZSkgZm9yIFVuY2hlY2tlZENsb3N1cmVDYWxsLgogICAgICBhc20uZW1pdFB1c2gocmVjZWl2ZXJUZW1wKTsKICAgICAgZmluYWwgYXJnRGVzY0NwSW5kZXggPSBjcC5hZGRBcmdEZXNjQnlBcmd1bWVudHMoYXJncywgaGFzUmVjZWl2ZXI6IHRydWUpOwogICAgICBhc20uZW1pdFVuY2hlY2tlZENsb3N1cmVDYWxsKGFyZ0Rlc2NDcEluZGV4LCB0b3RhbEFyZ0NvdW50KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIE1lbWJlciBpbnRlcmZhY2VUYXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgIGlmIChpc0NhbGxUaHJvdWdoR2V0dGVyKGludGVyZmFjZVRhcmdldCkpIHsKICAgICAgYXNzZXJ0KGRpcmVjdENhbGwgPT0gbnVsbCk7CiAgICAgIF9nZW5DYWxsVGhyb3VnaEdldHRlcihub2RlLCB0b3RhbEFyZ0NvdW50KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChkaXJlY3RDYWxsICE9IG51bGwgJiYgZGlyZWN0Q2FsbC5jaGVja1JlY2VpdmVyRm9yTnVsbCkgewogICAgICBmaW5hbCBpbnQgcmVjZWl2ZXJUZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICAgIF9nZW5Bcmd1bWVudHMobm9kZS5yZWNlaXZlciwgYXJncywgc3RvcmVSZWNlaXZlclRvTG9jYWw6IHJlY2VpdmVyVGVtcCk7CiAgICAgIGFzbS5lbWl0UHVzaChyZWNlaXZlclRlbXApOwogICAgICBhc20uZW1pdE51bGxDaGVjayhjcC5hZGRTZWxlY3Rvck5hbWUobm9kZS5uYW1lLCBJbnZvY2F0aW9uS2luZC5tZXRob2QpKTsKICAgIH0gZWxzZSB7CiAgICAgIF9nZW5Bcmd1bWVudHMobm9kZS5yZWNlaXZlciwgYXJncyk7CiAgICB9CgogICAgZmluYWwgYXJnRGVzYyA9CiAgICAgICAgb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZUJ5QXJndW1lbnRzKGFyZ3MsIGhhc1JlY2VpdmVyOiB0cnVlKTsKCiAgICBpZiAoZGlyZWN0Q2FsbCAhPSBudWxsKSB7CiAgICAgIGZpbmFsIGlzRHluYW1pY0ZvcndhcmRlciA9IChpbnRlcmZhY2VUYXJnZXQgPT0gbnVsbCk7CiAgICAgIGZpbmFsIGlzVW5jaGVja2VkID0KICAgICAgICAgIF9pc1VuY2hlY2tlZENhbGwobm9kZSwgaW50ZXJmYWNlVGFyZ2V0LCBub2RlLnJlY2VpdmVyKTsKICAgICAgX2dlbkRpcmVjdENhbGwoZGlyZWN0Q2FsbC50YXJnZXQsIGFyZ0Rlc2MsIHRvdGFsQXJnQ291bnQsCiAgICAgICAgICBpc0R5bmFtaWNGb3J3YXJkZXI6IGlzRHluYW1pY0ZvcndhcmRlciwKICAgICAgICAgIGlzVW5jaGVja2VkOiBpc1VuY2hlY2tlZCwKICAgICAgICAgIG5vZGU6IG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgX2dlbkluc3RhbmNlQ2FsbChub2RlLCBJbnZvY2F0aW9uS2luZC5tZXRob2QsIGludGVyZmFjZVRhcmdldCwgbm9kZS5uYW1lLAogICAgICAgICAgbm9kZS5yZWNlaXZlciwgdG90YWxBcmdDb3VudCwgYXJnRGVzYyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5yZWNlaXZlcik7CiAgICBmaW5hbCBhcmdEZXNjID0gb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZSgxKTsKCiAgICBmaW5hbCBkaXJlY3RDYWxsID0KICAgICAgICBkaXJlY3RDYWxsTWV0YWRhdGEgIT0gbnVsbCA/IGRpcmVjdENhbGxNZXRhZGF0YVtub2RlXSA6IG51bGw7CiAgICBpZiAoZGlyZWN0Q2FsbCAhPSBudWxsKSB7CiAgICAgIGlmIChkaXJlY3RDYWxsLmNoZWNrUmVjZWl2ZXJGb3JOdWxsKSB7CiAgICAgICAgZmluYWwgaW50IHJlY2VpdmVyVGVtcCA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUpOwogICAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbChyZWNlaXZlclRlbXApOwogICAgICAgIGFzbS5lbWl0UHVzaChyZWNlaXZlclRlbXApOwogICAgICAgIGFzbS5lbWl0TnVsbENoZWNrKGNwLmFkZFNlbGVjdG9yTmFtZShub2RlLm5hbWUsIEludm9jYXRpb25LaW5kLmdldHRlcikpOwogICAgICB9CiAgICAgIF9nZW5EaXJlY3RDYWxsKGRpcmVjdENhbGwudGFyZ2V0LCBhcmdEZXNjLCAxLCBpc0dldDogdHJ1ZSwgbm9kZTogbm9kZSk7CiAgICB9IGVsc2UgewogICAgICBfZ2VuSW5zdGFuY2VDYWxsKG5vZGUsIEludm9jYXRpb25LaW5kLmdldHRlciwgbm9kZS5pbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgICBub2RlLm5hbWUsIG5vZGUucmVjZWl2ZXIsIDEsIGFyZ0Rlc2MpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBmaW5hbCBpbnQgdGVtcCA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUpOwogICAgZmluYWwgYm9vbCBoYXNSZXN1bHQgPSAhaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdChub2RlKTsKCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUucmVjZWl2ZXIpOwoKICAgIGZpbmFsIGRpcmVjdENhbGwgPQogICAgICAgIGRpcmVjdENhbGxNZXRhZGF0YSAhPSBudWxsID8gZGlyZWN0Q2FsbE1ldGFkYXRhW25vZGVdIDogbnVsbDsKICAgIGlmIChkaXJlY3RDYWxsICE9IG51bGwgJiYgZGlyZWN0Q2FsbC5jaGVja1JlY2VpdmVyRm9yTnVsbCkgewogICAgICBhc20uZW1pdFN0b3JlTG9jYWwodGVtcCk7CiAgICAgIF9nZW5lcmF0ZU5vZGUobm9kZS52YWx1ZSk7CiAgICAgIGFzbS5lbWl0UHVzaCh0ZW1wKTsKICAgICAgYXNtLmVtaXROdWxsQ2hlY2soY3AuYWRkU2VsZWN0b3JOYW1lKG5vZGUubmFtZSwgSW52b2NhdGlvbktpbmQuc2V0dGVyKSk7CiAgICB9IGVsc2UgewogICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUudmFsdWUpOwogICAgfQoKICAgIGlmIChoYXNSZXN1bHQpIHsKICAgICAgYXNtLmVtaXRTdG9yZUxvY2FsKHRlbXApOwogICAgfQoKICAgIGNvbnN0IGludCBudW1Bcmd1bWVudHMgPSAyOwogICAgZmluYWwgYXJnRGVzYyA9IG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUobnVtQXJndW1lbnRzKTsKCiAgICBpZiAoZGlyZWN0Q2FsbCAhPSBudWxsKSB7CiAgICAgIGZpbmFsIGlzRHluYW1pY0ZvcndhcmRlciA9IChub2RlLmludGVyZmFjZVRhcmdldCA9PSBudWxsKTsKICAgICAgZmluYWwgaXNVbmNoZWNrZWQgPQogICAgICAgICAgX2lzVW5jaGVja2VkQ2FsbChub2RlLCBub2RlLmludGVyZmFjZVRhcmdldCwgbm9kZS5yZWNlaXZlcik7CiAgICAgIF9nZW5EaXJlY3RDYWxsKGRpcmVjdENhbGwudGFyZ2V0LCBhcmdEZXNjLCBudW1Bcmd1bWVudHMsCiAgICAgICAgICBpc1NldDogdHJ1ZSwKICAgICAgICAgIGlzRHluYW1pY0ZvcndhcmRlcjogaXNEeW5hbWljRm9yd2FyZGVyLAogICAgICAgICAgaXNVbmNoZWNrZWQ6IGlzVW5jaGVja2VkLAogICAgICAgICAgbm9kZTogbm9kZSk7CiAgICB9IGVsc2UgewogICAgICBfZ2VuSW5zdGFuY2VDYWxsKG5vZGUsIEludm9jYXRpb25LaW5kLnNldHRlciwgbm9kZS5pbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgICBub2RlLm5hbWUsIG5vZGUucmVjZWl2ZXIsIG51bUFyZ3VtZW50cywgYXJnRGVzYyk7CiAgICB9CgogICAgYXNtLmVtaXREcm9wMSgpOwoKICAgIGlmIChoYXNSZXN1bHQpIHsKICAgICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGZpbmFsIGFyZ3MgPSBub2RlLmFyZ3VtZW50czsKICAgIGZpbmFsIE1lbWJlciB0YXJnZXQgPQogICAgICAgIGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldChlbmNsb3NpbmdDbGFzcy5zdXBlcmNsYXNzLCBub2RlLm5hbWUpOwogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICAgIF9nZW5Ob1N1Y2hNZXRob2RGb3JTdXBlckNhbGwoCiAgICAgICAgICBub2RlLm5hbWUubmFtZSwKICAgICAgICAgIHRlbXAsCiAgICAgICAgICBjcC5hZGRBcmdEZXNjQnlBcmd1bWVudHMoYXJncywgaGFzUmVjZWl2ZXI6IHRydWUpLAogICAgICAgICAgYXJncy50eXBlcywKICAgICAgICAgIDxFeHByZXNzaW9uPltuZXcgVGhpc0V4cHJlc3Npb24oKV0KICAgICAgICAgICAgLi5hZGRBbGwoYXJncy5wb3NpdGlvbmFsKQogICAgICAgICAgICAuLmFkZEFsbChhcmdzLm5hbWVkLm1hcCgoeCkgPT4geC52YWx1ZSkpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2dlbkFyZ3VtZW50cyhuZXcgVGhpc0V4cHJlc3Npb24oKSwgYXJncyk7CiAgICBfZ2VuRGlyZWN0Q2FsbFdpdGhBcmdzKHRhcmdldCwgYXJncywKICAgICAgICBoYXNSZWNlaXZlcjogdHJ1ZSwgaXNVbmNoZWNrZWQ6IHRydWUsIG5vZGU6IG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgZmluYWwgTWVtYmVyIHRhcmdldCA9CiAgICAgICAgaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGVuY2xvc2luZ0NsYXNzLnN1cGVyY2xhc3MsIG5vZGUubmFtZSk7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgZmluYWwgaW50IHRlbXAgPSBsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlKTsKICAgICAgX2dlbk5vU3VjaE1ldGhvZEZvclN1cGVyQ2FsbChub2RlLm5hbWUubmFtZSwgdGVtcCwgY3AuYWRkQXJnRGVzYygxKSwgW10sCiAgICAgICAgICA8RXhwcmVzc2lvbj5bbmV3IFRoaXNFeHByZXNzaW9uKCldKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2dlblB1c2hSZWNlaXZlcigpOwogICAgX2dlbkRpcmVjdENhbGwodGFyZ2V0LCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDEpLCAxLAogICAgICAgIGlzR2V0OiB0cnVlLCBub2RlOiBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICBmaW5hbCBib29sIGhhc1Jlc3VsdCA9ICFpc0V4cHJlc3Npb25XaXRob3V0UmVzdWx0KG5vZGUpOwoKICAgIGZpbmFsIE1lbWJlciB0YXJnZXQgPSBoaWVyYXJjaHkKICAgICAgICAuZ2V0RGlzcGF0Y2hUYXJnZXQoZW5jbG9zaW5nQ2xhc3Muc3VwZXJjbGFzcywgbm9kZS5uYW1lLCBzZXR0ZXI6IHRydWUpOwogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIF9nZW5Ob1N1Y2hNZXRob2RGb3JTdXBlckNhbGwobm9kZS5uYW1lLm5hbWUsIHRlbXAsIGNwLmFkZEFyZ0Rlc2MoMiksIFtdLAogICAgICAgICAgPEV4cHJlc3Npb24+W25ldyBUaGlzRXhwcmVzc2lvbigpLCBub2RlLnZhbHVlXSwKICAgICAgICAgIHN0b3JlTGFzdEFyZ3VtZW50VG9UZW1wOiBoYXNSZXN1bHQpOwogICAgfSBlbHNlIHsKICAgICAgX2dlblB1c2hSZWNlaXZlcigpOwogICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUudmFsdWUpOwoKICAgICAgaWYgKGhhc1Jlc3VsdCkgewogICAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKICAgICAgfQoKICAgICAgYXNzZXJ0KHRhcmdldCBpcyBGaWVsZCB8fCAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQuaXNTZXR0ZXIpKTsKICAgICAgX2dlbkRpcmVjdENhbGwodGFyZ2V0LCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDIpLCAyLAogICAgICAgICAgaXNTZXQ6IHRydWUsIGlzVW5jaGVja2VkOiB0cnVlLCBub2RlOiBub2RlKTsKICAgIH0KCiAgICBhc20uZW1pdERyb3AxKCk7CgogICAgaWYgKGhhc1Jlc3VsdCkgewogICAgICBhc20uZW1pdFB1c2godGVtcCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgYm9vbCBuZWdhdGVkID0gX2dlbkNvbmRpdGlvbihub2RlLm9wZXJhbmQpOwogICAgaWYgKCFuZWdhdGVkKSB7CiAgICAgIGFzbS5lbWl0Qm9vbGVhbk5lZ2F0ZVRPUygpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROdWxsQ2hlY2soTnVsbENoZWNrIG5vZGUpIHsKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5vcGVyYW5kKTsKICAgIGZpbmFsIG9wZXJhbmRUZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICBhc20uZW1pdFN0b3JlTG9jYWwob3BlcmFuZFRlbXApOwogICAgYXNtLmVtaXRQdXNoKG9wZXJhbmRUZW1wKTsKICAgIGFzbS5lbWl0TnVsbENoZWNrKGNwLmFkZE9iamVjdFJlZihudWxsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpIHsKICAgIGFzbS5lbWl0UHVzaE51bGwoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpIHsKICAgIFRyeUNhdGNoIHRyeUNhdGNoOwogICAgZm9yICh2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50KSB7CiAgICAgIGlmIChwYXJlbnQgaXMgQ2F0Y2gpIHsKICAgICAgICB0cnlDYXRjaCA9IHBhcmVudC5wYXJlbnQgYXMgVHJ5Q2F0Y2g7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudCBpcyBGdW5jdGlvbk5vZGUpIHsKICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZW5jbG9zaW5nIGNhdGNoIGZvciAkbm9kZSc7CiAgICAgIH0KICAgIH0KICAgIHRyeUNhdGNoZXNbdHJ5Q2F0Y2hdLm5lZWRzU3RhY2tUcmFjZSA9IHRydWU7CgogICAgaWYgKG9wdGlvbnMuZW1pdERlYnVnZ2VyU3RvcHMpIHsKICAgICAgYXNtLmVtaXREZWJ1Z0NoZWNrKCk7IC8vIEFsbG93IGJyZWFrcG9pbnQgb24gZXhwbGljaXQgcmV0aHJvdyBzdGF0ZW1lbnQuCiAgICB9CiAgICBfZ2VuUmV0aHJvdyh0cnlDYXRjaCk7CiAgfQoKICBib29sIF9oYXNOb25Ucml2aWFsSW5pdGlhbGl6ZXIoRmllbGQgZmllbGQpIHsKICAgIGlmIChmaWVsZC5pbml0aWFsaXplciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gIV9pc1RyaXZpYWxJbml0aWFsaXplcihmaWVsZC5pbml0aWFsaXplcik7CiAgfQoKICBib29sIF9pc1RyaXZpYWxJbml0aWFsaXplcihFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CiAgICBpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGluaXRpYWxpemVyIGlzIFN0cmluZ0xpdGVyYWwgfHwKICAgICAgICBpbml0aWFsaXplciBpcyBCb29sTGl0ZXJhbCB8fAogICAgICAgIGluaXRpYWxpemVyIGlzIEludExpdGVyYWwgfHwKICAgICAgICBpbml0aWFsaXplciBpcyBEb3VibGVMaXRlcmFsIHx8CiAgICAgICAgaW5pdGlhbGl6ZXIgaXMgTnVsbExpdGVyYWwpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgQ29uc3RhbnRFeHByZXNzaW9uICYmCiAgICAgICAgaW5pdGlhbGl6ZXIuY29uc3RhbnQgaXMgUHJpbWl0aXZlQ29uc3RhbnQpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkKSB7CiAgICAgIGlmICh0YXJnZXQuaXNDb25zdCkgewogICAgICAgIF9nZW5QdXNoQ29uc3RFeHByKHRhcmdldC5pbml0aWFsaXplcik7CiAgICAgIH0gZWxzZSBpZiAoIV9uZWVkc0dldHRlcih0YXJnZXQpKSB7CiAgICAgICAgaWYgKGluZmVycmVkVHlwZU1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICAgIGZpbmFsIEluZmVycmVkVHlwZSBtZCA9IGluZmVycmVkVHlwZU1ldGFkYXRhW25vZGVdOwogICAgICAgICAgaWYgKG1kICE9IG51bGwgJiYgbWQuY29uc3RhbnRWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIF9nZW5QdXNoQ29uc3RhbnQobWQuY29uc3RhbnRWYWx1ZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXNtLmVtaXRMb2FkU3RhdGljKGNwLmFkZFN0YXRpY0ZpZWxkKHRhcmdldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIF9nZW5EaXJlY3RDYWxsKHRhcmdldCwgb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZSgwKSwgMCwKICAgICAgICAgICAgaXNHZXQ6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUpIHsKICAgICAgaWYgKHRhcmdldC5pc0dldHRlcikgewogICAgICAgIF9nZW5EaXJlY3RDYWxsKHRhcmdldCwgb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZSgwKSwgMCwKICAgICAgICAgICAgaXNHZXQ6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgICB9IGVsc2UgaWYgKHRhcmdldC5pc0ZhY3RvcnkgfHwgdGFyZ2V0LmlzUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpIHsKICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCB0YXJnZXQgZm9yIFN0YXRpY0dldDogZmFjdG9yeSAkdGFyZ2V0JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGRPYmplY3RSZWYobmV3IFRlYXJPZmZDb25zdGFudCh0YXJnZXQpKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdVbmV4cGVjdGVkIHRhcmdldCBmb3IgU3RhdGljR2V0OiAke3RhcmdldC5ydW50aW1lVHlwZX0gJHRhcmdldCc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIF9nZW5QdXNoQ29uc3RFeHByKG5vZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBBcmd1bWVudHMgYXJncyA9IG5vZGUuYXJndW1lbnRzOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0ID09IHVuc2FmZUNhc3QpIHsKICAgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgdW5zYWZlQ2FzdCgpIGludHJpbnNpYyBtZXRob2QgaXMgaXRzIHNvbGUgYXJndW1lbnQsCiAgICAgIC8vIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgY2hlY2tzIG9yIHR5cGUgY2FzdHMuCiAgICAgIGFzc2VydChhcmdzLm5hbWVkLmlzRW1wdHkpOwogICAgICBfZ2VuZXJhdGVOb2RlKGFyZ3MucG9zaXRpb25hbC5zaW5nbGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIW9wdGlvbnMuY2F1c2FsQXN5bmNTdGFja3MgJiYKICAgICAgICB0YXJnZXQgPT0gY29yZVR5cGVzLmFzeW5jU3RhY2tUcmFjZUhlbHBlclByb2NlZHVyZSkgewogICAgICAvLyBFbGltaW5hdGUgY2FsbHMgdG8gX2FzeW5jU3RhY2tUcmFjZUhlbHBlciBhcyBjYXVzYWwgYXN5bmMgc3RhY2tzIGFyZQogICAgICAvLyBkaXNhYmxlZC4gVGhlc2UgY2FsbHMgYXJlIGluc2VydGVkIGJ5IGFzeW5jIHRyYW5zZm9ybWF0aW9uCiAgICAgIC8vIChwa2cva2VybmVsL2xpYi90cmFuc2Zvcm1hdGlvbnMvY29udGludWF0aW9uLmRhcnQpLCBidXQgdGhleSBzaG91bGQgYmUKICAgICAgLy8gY29uc2lzdGVudCB3aXRoIF9zZXRBc3luY1RocmVhZFN0YWNrVHJhY2UgYW5kCiAgICAgIC8vIF9jbGVhckFzeW5jVGhyZWFkU3RhY2tUcmFjZSBjYWxscyBnZW5lcmF0ZWQgYnkgYnl0ZWNvZGUgZ2VuZXJhdG9yLgogICAgICAvLwogICAgICAvLyBQdXNoIG51bGwgYXMgX2FzeW5jU3RhY2tUcmFjZUhlbHBlciBjYWxsIHNob3VsZCBsZWF2ZSByZXN1bHQKICAgICAgLy8gb24gdGhlIHN0YWNrLgogICAgICBhc20uZW1pdFB1c2hOdWxsKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0YXJnZXQuaXNGYWN0b3J5KSB7CiAgICAgIGZpbmFsIGNvbnN0cnVjdGVkQ2xhc3MgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGlmIChoYXNJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKGNvbnN0cnVjdGVkQ2xhc3MpKSB7CiAgICAgICAgX2dlblR5cGVBcmd1bWVudHMoYXJncy50eXBlcywgaW5zdGFudGlhdGluZ0NsYXNzOiBjb25zdHJ1Y3RlZENsYXNzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoYXJncy50eXBlcy5pc0VtcHR5KTsKICAgICAgICAvLyBWTSBuZWVkcyB0eXBlIGFyZ3VtZW50cyBmb3IgZXZlcnkgaW52b2NhdGlvbiBvZiBhIGZhY3RvcnkKICAgICAgICAvLyBjb25zdHJ1Y3Rvci4gVE9ETyhhbGV4bWFya292KTogQ2xlYW4gdGhpcyB1cC4KICAgICAgICBhc20uZW1pdFB1c2hOdWxsKCk7CiAgICAgIH0KICAgICAgYXJncyA9CiAgICAgICAgICBuZXcgQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwsIG5hbWVkOiBub2RlLmFyZ3VtZW50cy5uYW1lZCkKICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgfQogICAgX2dlbkFyZ3VtZW50cyhudWxsLCBhcmdzKTsKICAgIF9nZW5EaXJlY3RDYWxsV2l0aEFyZ3ModGFyZ2V0LCBhcmdzLAogICAgICAgIGlzRmFjdG9yeTogdGFyZ2V0LmlzRmFjdG9yeSwgbm9kZTogbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgZmluYWwgYm9vbCBoYXNSZXN1bHQgPSAhaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdChub2RlKTsKCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUudmFsdWUpOwoKICAgIGlmIChoYXNSZXN1bHQpIHsKICAgICAgX2dlbkR1cFRPUyhsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlKSk7CiAgICB9CgogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkICYmICFfbmVlZHNTZXR0ZXIodGFyZ2V0KSkgewogICAgICBpZiAob3B0aW9ucy5lbWl0RGVidWdnZXJTdG9wcyAmJgogICAgICAgICAgX3ZhcmlhYmxlU2V0TmVlZHNEZWJ1Z0NoZWNrKG5vZGUudmFsdWUpKSB7CiAgICAgICAgYXNtLmVtaXREZWJ1Z0NoZWNrKCk7CiAgICAgIH0KICAgICAgaW50IGNwSW5kZXggPSBjcC5hZGRTdGF0aWNGaWVsZCh0YXJnZXQpOwogICAgICBhc20uZW1pdFN0b3JlU3RhdGljVE9TKGNwSW5kZXgpOwogICAgfSBlbHNlIHsKICAgICAgX2dlbkRpcmVjdENhbGwodGFyZ2V0LCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDEpLCAxLAogICAgICAgICAgaXNTZXQ6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgICBhc20uZW1pdERyb3AxKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5leHByZXNzaW9ucy5sZW5ndGggPT0gMSkgewogICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZXhwcmVzc2lvbnMuc2luZ2xlKTsKICAgICAgX2dlbkRpcmVjdENhbGwoaW50ZXJwb2xhdGVTaW5nbGUsIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMSksIDEpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgICBfZ2VuUHVzaEludChub2RlLmV4cHJlc3Npb25zLmxlbmd0aCk7CiAgICAgIGFzbS5lbWl0Q3JlYXRlQXJyYXlUT1MoKTsKCiAgICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGFzbS5lbWl0UHVzaCh0ZW1wKTsKICAgICAgICBfZ2VuUHVzaEludChpKTsKICAgICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZXhwcmVzc2lvbnNbaV0pOwogICAgICAgIGFzbS5lbWl0U3RvcmVJbmRleGVkVE9TKCk7CiAgICAgIH0KCiAgICAgIF9nZW5EaXJlY3RDYWxsKGludGVycG9sYXRlLCBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKDEpLCAxKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKICAgIGZpbmFsIGNwSW5kZXggPSBjcC5hZGRTdHJpbmcobm9kZS52YWx1ZSk7CiAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcEluZGV4KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIF9nZW5QdXNoQ29uc3RFeHByKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBfZ2VuUHVzaFJlY2VpdmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRocm93KFRocm93IG5vZGUpIHsKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5leHByZXNzaW9uKTsKCiAgICBpZiAob3B0aW9ucy5lbWl0RGVidWdnZXJTdG9wcykgewogICAgICBhc20uZW1pdERlYnVnQ2hlY2soKTsKICAgIH0KICAgIGFzbS5lbWl0VGhyb3coMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIGZpbmFsIERhcnRUeXBlIHR5cGUgPSBub2RlLnR5cGU7CiAgICBmaW5hbCBpbnQgdHlwZUNQSW5kZXggPSBjcC5hZGRUeXBlKHR5cGUpOwogICAgaWYgKCFoYXNGcmVlVHlwZVBhcmFtZXRlcnMoW3R5cGVdKSkgewogICAgICBhc20uZW1pdFB1c2hDb25zdGFudCh0eXBlQ1BJbmRleCk7CiAgICB9IGVsc2UgewogICAgICBfZ2VuUHVzaEluc3RhbnRpYXRvckFuZEZ1bmN0aW9uVHlwZUFyZ3VtZW50cyhbdHlwZV0pOwogICAgICBhc20uZW1pdEluc3RhbnRpYXRlVHlwZSh0eXBlQ1BJbmRleCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIGZpbmFsIHYgPSBub2RlLnZhcmlhYmxlOwogICAgaWYgKHYuaXNDb25zdCkgewogICAgICBfZ2VuUHVzaENvbnN0RXhwcih2LmluaXRpYWxpemVyKTsKICAgIH0gZWxzZSBpZiAodi5pc0xhdGUpIHsKICAgICAgX2dlbkxvYWRWYXIodik7CgogICAgICBmaW5hbCBMYWJlbCBkb25lID0gbmV3IExhYmVsKCk7CiAgICAgIGFzbS5lbWl0SnVtcElmSW5pdGlhbGl6ZWQoZG9uZSk7CgogICAgICBpZiAodi5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgZmluYWwgaW5pdCA9IHYuaW5pdGlhbGl6ZXI7CiAgICAgICAgX2dlblB1c2hDb250ZXh0SWZDYXB0dXJlZCh2KTsKICAgICAgICAvLyBMYXRlIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemVycyBhcmUgdHJhbnNmb3JtZWQgdG8gd3JhcCB0aGUKICAgICAgICAvLyBpbml0aWFsaXplciBpbiBhIGNsb3N1cmUgKHNlZSBsYXRlX3Zhcl9pbml0X3RyYW5zZm9ybWVyLmRhcnQpLiBUaGUKICAgICAgICAvLyBjbG9zdXJlIGNhbGwgbmVlZHMgb25lIHRlbXBvcmFyeSwgc28gd2l0aFRlbXAgbGV0cyB1cyB1c2UgdGhpcwogICAgICAgIC8vIFZhcmlhYmxlR2V0J3MgdGVtcG9yYXJ5IHdoZW4gdmlzaXRpbmcgdGhlIGluaXRpYWxpemVyLgogICAgICAgIGFzc2VydChpbml0IGlzIE1ldGhvZEludm9jYXRpb24gJiYKICAgICAgICAgICAgaW5pdC5uYW1lLm5hbWUgPT0gImNhbGwiICYmCiAgICAgICAgICAgIGluaXQuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID09IDApOwogICAgICAgIGxvY2Fscy53aXRoVGVtcCgKICAgICAgICAgICAgaW5pdCwgbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSksICgpID0+IF9nZW5lcmF0ZU5vZGUoaW5pdCkpOwogICAgICAgIF9nZW5TdG9yZVZhcih2KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGROYW1lKHYubmFtZSkpOwogICAgICAgIF9nZW5EaXJlY3RDYWxsKHRocm93TmV3TGF0ZUluaXRpYWxpemF0aW9uRXJyb3IsCiAgICAgICAgICAgIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMSksIDEpOwogICAgICAgIGFzbS5lbWl0RHJvcDEoKTsKICAgICAgfQoKICAgICAgYXNtLmJpbmQoZG9uZSk7CiAgICAgIF9nZW5Mb2FkVmFyKHYpOwogICAgfSBlbHNlIHsKICAgICAgX2dlbkxvYWRWYXIodik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIGZpbmFsIHYgPSBub2RlLnZhcmlhYmxlOwogICAgZmluYWwgYm9vbCBoYXNSZXN1bHQgPSAhaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdChub2RlKTsKICAgIGZpbmFsIGJvb2wgaXNMYXRlRmluYWwgPSB2LmlzTGF0ZSAmJiB2LmlzRmluYWw7CgogICAgaWYgKCFpc0xhdGVGaW5hbCkgewogICAgICBfZ2VuUHVzaENvbnRleHRJZkNhcHR1cmVkKHYpOwogICAgfQoKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS52YWx1ZSk7CgogICAgaWYgKG9wdGlvbnMuZW1pdERlYnVnZ2VyU3RvcHMgJiYgX3ZhcmlhYmxlU2V0TmVlZHNEZWJ1Z0NoZWNrKG5vZGUudmFsdWUpKSB7CiAgICAgIGFzbS5lbWl0RGVidWdDaGVjaygpOwogICAgfQoKICAgIGlmIChpc0xhdGVGaW5hbCkgewogICAgICBmaW5hbCBpbnQgdGVtcCA9IGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUpOwogICAgICBhc20uZW1pdFBvcExvY2FsKHRlbXApOwoKICAgICAgZmluYWwgTGFiZWwgZXJyb3IgPSBuZXcgTGFiZWwoKTsKICAgICAgZmluYWwgTGFiZWwgZG9uZSA9IG5ldyBMYWJlbCgpOwogICAgICBfZ2VuTG9hZFZhcih2KTsKICAgICAgYXNtLmVtaXRKdW1wSWZJbml0aWFsaXplZChlcnJvcik7CgogICAgICBfZ2VuUHVzaENvbnRleHRJZkNhcHR1cmVkKHYpOwogICAgICBhc20uZW1pdFB1c2godGVtcCk7CiAgICAgIF9nZW5TdG9yZVZhcih2KTsKICAgICAgYXNtLmVtaXRKdW1wKGRvbmUpOwoKICAgICAgYXNtLmJpbmQoZXJyb3IpOwogICAgICBhc20uZW1pdFB1c2hDb25zdGFudChjcC5hZGROYW1lKHYubmFtZSkpOwogICAgICBfZ2VuRGlyZWN0Q2FsbCgKICAgICAgICAgIHRocm93TmV3TGF0ZUluaXRpYWxpemF0aW9uRXJyb3IsIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMSksIDEpOwogICAgICBhc20uZW1pdERyb3AxKCk7CgogICAgICBhc20uYmluZChkb25lKTsKCiAgICAgIGlmIChoYXNSZXN1bHQpIHsKICAgICAgICBhc20uZW1pdFB1c2godGVtcCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobG9jYWxzLmlzQ2FwdHVyZWQodikpIHsKICAgICAgZmluYWwgaW50IHRlbXAgPSBsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlKTsKICAgICAgaWYgKGhhc1Jlc3VsdCkgewogICAgICAgIGFzbS5lbWl0U3RvcmVMb2NhbCh0ZW1wKTsKICAgICAgfQoKICAgICAgX2dlblN0b3JlVmFyKHYpOwoKICAgICAgaWYgKGhhc1Jlc3VsdCkgewogICAgICAgIGFzbS5lbWl0UHVzaCh0ZW1wKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IGxvY2FsSW5kZXggPSBsb2NhbHMuZ2V0VmFySW5kZXhJbkZyYW1lKHYpOwogICAgICBpZiAoaGFzUmVzdWx0KSB7CiAgICAgICAgYXNtLmVtaXRTdG9yZUxvY2FsKGxvY2FsSW5kZXgpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzbS5lbWl0UG9wTG9jYWwobG9jYWxJbmRleCk7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgX3ZhcmlhYmxlU2V0TmVlZHNEZWJ1Z0NoZWNrKEV4cHJlc3Npb24gcmhzKSA9PgogICAgICByaHMgaXMgQmFzaWNMaXRlcmFsIHx8CiAgICAgIHJocyBpcyBDb25zdGFudEV4cHJlc3Npb24gfHwKICAgICAgcmhzIGlzIFN0YXRpY0dldCB8fAogICAgICByaHMgaXMgRnVuY3Rpb25FeHByZXNzaW9uIHx8CiAgICAgIHJocyBpcyBWYXJpYWJsZUdldCB8fAogICAgICByaHMgaXMgQXNFeHByZXNzaW9uOwoKICB2b2lkIF9nZW5GdXR1cmVOdWxsKCkgewogICAgYXNtLmVtaXRQdXNoTnVsbCgpOwogICAgX2dlbkRpcmVjdENhbGwoZnV0dXJlVmFsdWUsIG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMSksIDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlKSB7CiAgICBfZ2VuRnV0dXJlTnVsbCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICBfZ2VuRnV0dXJlTnVsbCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKICAgIGlmICghb3B0aW9ucy5lbmFibGVBc3NlcnRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBMYWJlbCBkb25lID0gbmV3IExhYmVsKCk7CiAgICBhc20uZW1pdEp1bXBJZk5vQXNzZXJ0cyhkb25lKTsKCiAgICBfZ2VuQ29uZGl0aW9uQW5kSnVtcElmKG5vZGUuY29uZGl0aW9uLCB0cnVlLCBkb25lKTsKCiAgICBfZ2VuUHVzaEludCgKICAgICAgICBvcHRpb25zLm9taXRBc3NlcnRTb3VyY2VQb3NpdGlvbnMgPyAwIDogbm9kZS5jb25kaXRpb25TdGFydE9mZnNldCk7CiAgICBfZ2VuUHVzaEludCgKICAgICAgICBvcHRpb25zLm9taXRBc3NlcnRTb3VyY2VQb3NpdGlvbnMgPyAwIDogbm9kZS5jb25kaXRpb25FbmRPZmZzZXQpOwoKICAgIGlmIChub2RlLm1lc3NhZ2UgIT0gbnVsbCkgewogICAgICBfZ2VuZXJhdGVOb2RlKG5vZGUubWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdFB1c2hOdWxsKCk7CiAgICB9CgogICAgX2dlbkRpcmVjdENhbGwodGhyb3dOZXdBc3NlcnRpb25FcnJvciwgb2JqZWN0VGFibGUuZ2V0QXJnRGVzY0hhbmRsZSgzKSwgMyk7CiAgICBhc20uZW1pdERyb3AxKCk7CgogICAgYXNtLmJpbmQoZG9uZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIF9lbnRlclNjb3BlKG5vZGUpOwogICAgX2dlbmVyYXRlTm9kZUxpc3Qobm9kZS5zdGF0ZW1lbnRzKTsKICAgIF9sZWF2ZVNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpIHsKICAgIGlmICghb3B0aW9ucy5lbmFibGVBc3NlcnRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBMYWJlbCBkb25lID0gbmV3IExhYmVsKCk7CiAgICBhc20uZW1pdEp1bXBJZk5vQXNzZXJ0cyhkb25lKTsKCiAgICBfZW50ZXJTY29wZShub2RlKTsKICAgIF9nZW5lcmF0ZU5vZGVMaXN0KG5vZGUuc3RhdGVtZW50cyk7CiAgICBfbGVhdmVTY29wZSgpOwoKICAgIGFzbS5iaW5kKGRvbmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIF9lbnRlclNjb3BlKG5vZGUpOwogICAgX2dlbmVyYXRlTm9kZUxpc3Qobm9kZS5ib2R5LnN0YXRlbWVudHMpOwogICAgX2dlbmVyYXRlTm9kZShub2RlLnZhbHVlKTsKICAgIF9sZWF2ZVNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIGZpbmFsIHRhcmdldExhYmVsID0gbGFiZWxlZFN0YXRlbWVudHNbbm9kZS50YXJnZXRdID8/CiAgICAgICAgKHRocm93ICdUYXJnZXQgbGFiZWwgJHtub2RlLnRhcmdldH0gd2FzIG5vdCByZWdpc3RlcmVkIGZvciBicmVhayAkbm9kZScpOwogICAgZmluYWwgdGFyZ2V0Q29udGV4dExldmVsID0gY29udGV4dExldmVsc1tub2RlLnRhcmdldF07CgogICAgX2dlbmVyYXRlTm9uTG9jYWxDb250cm9sVHJhbnNmZXIobm9kZSwgbm9kZS50YXJnZXQsICgpIHsKICAgICAgX2dlblVud2luZENvbnRleHQodGFyZ2V0Q29udGV4dExldmVsKTsKICAgICAgYXNtLmVtaXRKdW1wKHRhcmdldExhYmVsKTsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBmaW5hbCB0YXJnZXRMYWJlbCA9IHN3aXRjaENhc2VzW25vZGUudGFyZ2V0XSA/PwogICAgICAgICh0aHJvdyAnVGFyZ2V0IGxhYmVsICR7bm9kZS50YXJnZXR9IHdhcyBub3QgcmVnaXN0ZXJlZCBmb3IgY29udGludWUtc3dpdGNoICRub2RlJyk7CiAgICBmaW5hbCB0YXJnZXRDb250ZXh0TGV2ZWwgPSBjb250ZXh0TGV2ZWxzW25vZGUudGFyZ2V0LnBhcmVudF07CgogICAgX2dlbmVyYXRlTm9uTG9jYWxDb250cm9sVHJhbnNmZXIobm9kZSwgbm9kZS50YXJnZXQucGFyZW50LCAoKSB7CiAgICAgIF9nZW5VbndpbmRDb250ZXh0KHRhcmdldENvbnRleHRMZXZlbCk7CiAgICAgIGFzbS5lbWl0SnVtcCh0YXJnZXRMYWJlbCk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKGFzbS5pc1VucmVhY2hhYmxlKSB7CiAgICAgIC8vIEJhaWwgb3V0IGJlZm9yZSBiaW5kaW5nIGEgbGFiZWwgd2hpY2ggYWxsb3dzIGJhY2t3YXJkIGp1bXBzLAogICAgICAvLyBhcyBpdCBpcyBub3QgaGFuZGxlZCBieSBsb2NhbCB1bnJlYWNoYWJsZSBjb2RlIGVsaW1pbmF0aW9uLgogICAgICByZXR1cm47CiAgICB9CgogICAgZmluYWwgTGFiZWwgam9pbiA9IG5ldyBMYWJlbChhbGxvd3NCYWNrd2FyZEp1bXBzOiB0cnVlKTsKICAgIGFzbS5iaW5kKGpvaW4pOwoKICAgIGFzbS5lbWl0Q2hlY2tTdGFjaygrK2N1cnJlbnRMb29wRGVwdGgpOwoKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5ib2R5KTsKCiAgICBfZ2VuQ29uZGl0aW9uQW5kSnVtcElmKG5vZGUuY29uZGl0aW9uLCB0cnVlLCBqb2luKTsKCiAgICAtLWN1cnJlbnRMb29wRGVwdGg7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIG5vLW9wCiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICBmaW5hbCBleHByID0gbm9kZS5leHByZXNzaW9uOwogICAgX2dlbmVyYXRlTm9kZShleHByKTsKICAgIGlmICghaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdChleHByKSkgewogICAgICBhc20uZW1pdERyb3AxKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIFNob3VsZCBiZSBsb3dlcmVkIGJ5IHRoZSBhc3luYyB0cmFuc2Zvcm1hdGlvbi4KICAgIHRocm93ICJ1bnJlYWNoYWJsZSI7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgX2VudGVyU2NvcGUobm9kZSk7CiAgICB0cnkgewogICAgICBfZ2VuZXJhdGVOb2RlTGlzdChub2RlLnZhcmlhYmxlcyk7CgogICAgICBpZiAoYXNtLmlzVW5yZWFjaGFibGUpIHsKICAgICAgICAvLyBCYWlsIG91dCBiZWZvcmUgYmluZGluZyBhIGxhYmVsIHdoaWNoIGFsbG93cyBiYWNrd2FyZCBqdW1wcywKICAgICAgICAvLyBhcyBpdCBpcyBub3QgaGFuZGxlZCBieSBsb2NhbCB1bnJlYWNoYWJsZSBjb2RlIGVsaW1pbmF0aW9uLgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZmluYWwgTGFiZWwgZG9uZSA9IG5ldyBMYWJlbCgpOwogICAgICBmaW5hbCBMYWJlbCBqb2luID0gbmV3IExhYmVsKGFsbG93c0JhY2t3YXJkSnVtcHM6IHRydWUpOwogICAgICBhc20uYmluZChqb2luKTsKCiAgICAgIGFzbS5lbWl0Q2hlY2tTdGFjaygrK2N1cnJlbnRMb29wRGVwdGgpOwoKICAgICAgaWYgKG5vZGUuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgICBfZ2VuQ29uZGl0aW9uQW5kSnVtcElmKG5vZGUuY29uZGl0aW9uLCBmYWxzZSwgZG9uZSk7CiAgICAgIH0KCiAgICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5ib2R5KTsKCiAgICAgIGlmIChsb2NhbHMuY3VycmVudENvbnRleHRTaXplID4gMCkgewogICAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuY29udGV4dFZhckluZGV4SW5GcmFtZSk7CiAgICAgICAgYXNtLmVtaXRDbG9uZUNvbnRleHQoCiAgICAgICAgICAgIGxvY2Fscy5jdXJyZW50Q29udGV4dElkLCBsb2NhbHMuY3VycmVudENvbnRleHRTaXplKTsKICAgICAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5jb250ZXh0VmFySW5kZXhJbkZyYW1lKTsKICAgICAgfQoKICAgICAgZm9yICh2YXIgdXBkYXRlIGluIG5vZGUudXBkYXRlcykgewogICAgICAgIF9nZW5lcmF0ZU5vZGUodXBkYXRlKTsKICAgICAgICBhc20uZW1pdERyb3AxKCk7CiAgICAgIH0KCiAgICAgIGFzbS5lbWl0SnVtcChqb2luKTsKCiAgICAgIGFzbS5iaW5kKGRvbmUpOwogICAgICAtLWN1cnJlbnRMb29wRGVwdGg7CiAgICB9IGZpbmFsbHkgewogICAgICBfbGVhdmVTY29wZSgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKGFzdC5GdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGlmIChvcHRpb25zLmVtaXREZWJ1Z2dlclN0b3BzKSB7CiAgICAgIGFzbS5lbWl0RGVidWdDaGVjaygpOwogICAgfQogICAgX2dlblB1c2hDb250ZXh0SWZDYXB0dXJlZChub2RlLnZhcmlhYmxlKTsKICAgIF9nZW5DbG9zdXJlKG5vZGUsIG5vZGUudmFyaWFibGUubmFtZSwgbm9kZS5mdW5jdGlvbik7CiAgICBfZ2VuU3RvcmVWYXIobm9kZS52YXJpYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpIHsKICAgIGZpbmFsIExhYmVsIG90aGVyd2lzZVBhcnQgPSBuZXcgTGFiZWwoKTsKCiAgICBfZ2VuQ29uZGl0aW9uQW5kSnVtcElmKG5vZGUuY29uZGl0aW9uLCBmYWxzZSwgb3RoZXJ3aXNlUGFydCk7CgogICAgX2dlbmVyYXRlTm9kZShub2RlLnRoZW4pOwoKICAgIGlmIChub2RlLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIExhYmVsIGRvbmUgPSBuZXcgTGFiZWwoKTsKICAgICAgYXNtLmVtaXRKdW1wKGRvbmUpOwogICAgICBhc20uYmluZChvdGhlcndpc2VQYXJ0KTsKICAgICAgX2dlbmVyYXRlTm9kZShub2RlLm90aGVyd2lzZSk7CiAgICAgIGFzbS5iaW5kKGRvbmUpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmJpbmQob3RoZXJ3aXNlUGFydCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBmaW5hbCBsYWJlbCA9IG5ldyBMYWJlbCgpOwogICAgbGFiZWxlZFN0YXRlbWVudHMgPz89IG5ldyBNYXA8TGFiZWxlZFN0YXRlbWVudCwgTGFiZWw+KCk7CiAgICBsYWJlbGVkU3RhdGVtZW50c1tub2RlXSA9IGxhYmVsOwogICAgY29udGV4dExldmVscyA/Pz0gbmV3IE1hcDxUcmVlTm9kZSwgaW50PigpOwogICAgY29udGV4dExldmVsc1tub2RlXSA9IGxvY2Fscy5jdXJyZW50Q29udGV4dExldmVsOwogICAgX2dlbmVyYXRlTm9kZShub2RlLmJvZHkpOwogICAgYXNtLmJpbmQobGFiZWwpOwogICAgbGFiZWxlZFN0YXRlbWVudHMucmVtb3ZlKG5vZGUpOwogICAgY29udGV4dExldmVscy5yZW1vdmUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgZmluYWwgZXhwciA9IG5vZGUuZXhwcmVzc2lvbiA/PyBuZXcgTnVsbExpdGVyYWwoKTsKCiAgICBmaW5hbCBMaXN0PFRyeUZpbmFsbHk+IHRyeUZpbmFsbHlCbG9ja3MgPQogICAgICAgIF9nZXRFbmNsb3NpbmdUcnlGaW5hbGx5QmxvY2tzKG5vZGUsIG51bGwpOwogICAgaWYgKHRyeUZpbmFsbHlCbG9ja3MuaXNFbXB0eSkgewogICAgICBfZ2VuZXJhdGVOb2RlKGV4cHIpOwogICAgICBfZ2VuUmV0dXJuVE9TKCk7CiAgICB9IGVsc2UgewogICAgICBpZiAob3B0aW9ucy5lbWl0RGVidWdnZXJTdG9wcykgewogICAgICAgIC8vIFN0b3Agb24gdGhlIHJldHVybiBzdGF0ZW1lbnQgYmVmb3JlIGV4ZWN1dGluZyBmaW5hbGx5IGJsb2Nrcy4KICAgICAgICBhc20uZW1pdERlYnVnQ2hlY2soKTsKICAgICAgfQogICAgICBpZiAoZXhwciBpcyBCYXNpY0xpdGVyYWwpIHsKICAgICAgICBfYWRkRmluYWxseUJsb2Nrcyh0cnlGaW5hbGx5QmxvY2tzLCAoKSB7CiAgICAgICAgICBfZ2VuZXJhdGVOb2RlKGV4cHIpOwogICAgICAgICAgX2dlblJldHVyblRPUygpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEtlZXAgcmV0dXJuIHZhbHVlIGluIGEgdmFyaWFibGUgYXMgdHJ5LWNhdGNoIHN0YXRlbWVudHMKICAgICAgICAvLyBpbnNpZGUgZmluYWxseSBjYW4gemFwIGV4cHJlc3Npb24gc3RhY2suCiAgICAgICAgX2dlbmVyYXRlTm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgICAgIGFzbS5lbWl0UG9wTG9jYWwobG9jYWxzLnJldHVyblZhckluZGV4SW5GcmFtZSk7CgogICAgICAgIF9hZGRGaW5hbGx5QmxvY2tzKHRyeUZpbmFsbHlCbG9ja3MsICgpIHsKICAgICAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMucmV0dXJuVmFySW5kZXhJbkZyYW1lKTsKICAgICAgICAgIF9nZW5SZXR1cm5UT1MoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGNvbnRleHRMZXZlbHMgPz89IG5ldyBNYXA8VHJlZU5vZGUsIGludD4oKTsKICAgIGNvbnRleHRMZXZlbHNbbm9kZV0gPSBsb2NhbHMuY3VycmVudENvbnRleHRMZXZlbDsKCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZXhwcmVzc2lvbik7CgogICAgaWYgKGFzbS5pc1VucmVhY2hhYmxlKSB7CiAgICAgIC8vIEJhaWwgb3V0IGJlZm9yZSBiaW5kaW5nIGxhYmVscyB3aGljaCBhbGxvdyBiYWNrd2FyZCBqdW1wcywKICAgICAgLy8gYXMgdGhleSBhcmUgbm90IGhhbmRsZWQgYnkgbG9jYWwgdW5yZWFjaGFibGUgY29kZSBlbGltaW5hdGlvbi4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIGludCB0ZW1wID0gbG9jYWxzLnRlbXBJbmRleEluRnJhbWUobm9kZSk7CiAgICBhc20uZW1pdFBvcExvY2FsKHRlbXApOwoKICAgIGZpbmFsIExhYmVsIGRvbmUgPSBuZXcgTGFiZWwoKTsKICAgIGZpbmFsIExpc3Q8TGFiZWw+IGNhc2VMYWJlbHMgPSBuZXcgTGlzdDxMYWJlbD4uZ2VuZXJhdGUoCiAgICAgICAgbm9kZS5jYXNlcy5sZW5ndGgsIChfKSA9PiBuZXcgTGFiZWwoYWxsb3dzQmFja3dhcmRKdW1wczogdHJ1ZSkpOwogICAgZmluYWwgZXF1YWxzQXJnRGVzYyA9IG9iamVjdFRhYmxlLmdldEFyZ0Rlc2NIYW5kbGUoMik7CgogICAgc3dpdGNoQ2FzZXMgPz89IG5ldyBNYXA8U3dpdGNoQ2FzZSwgTGFiZWw+KCk7CgogICAgTGFiZWwgZGVmYXVsdExhYmVsID0gZG9uZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5jYXNlcy5sZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBTd2l0Y2hDYXNlIHN3aXRjaENhc2UgPSBub2RlLmNhc2VzW2ldOwogICAgICBmaW5hbCBMYWJlbCBjYXNlTGFiZWwgPSBjYXNlTGFiZWxzW2ldOwogICAgICBzd2l0Y2hDYXNlc1tzd2l0Y2hDYXNlXSA9IGNhc2VMYWJlbDsKCiAgICAgIGlmIChzd2l0Y2hDYXNlLmlzRGVmYXVsdCkgewogICAgICAgIGRlZmF1bHRMYWJlbCA9IGNhc2VMYWJlbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaW5hbCBzYXZlZFNvdXJjZVBvc2l0aW9uID0gYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbjsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN3aXRjaENhc2UuZXhwcmVzc2lvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIF9yZWNvcmRTb3VyY2VQb3NpdGlvbihzd2l0Y2hDYXNlLmV4cHJlc3Npb25PZmZzZXRzW2ldKTsKICAgICAgICAgIF9nZW5QdXNoQ29uc3RFeHByKHN3aXRjaENhc2UuZXhwcmVzc2lvbnNbaV0pOwogICAgICAgICAgYXNtLmVtaXRQdXNoKHRlbXApOwogICAgICAgICAgYXNtLmVtaXRJbnRlcmZhY2VDYWxsKAogICAgICAgICAgICAgIGNwLmFkZEludGVyZmFjZUNhbGwoCiAgICAgICAgICAgICAgICAgIEludm9jYXRpb25LaW5kLm1ldGhvZCwgY29yZVR5cGVzLm9iamVjdEVxdWFscywgZXF1YWxzQXJnRGVzYyksCiAgICAgICAgICAgICAgMik7CiAgICAgICAgICBhc20uZW1pdEp1bXBJZlRydWUoY2FzZUxhYmVsKTsKICAgICAgICB9CiAgICAgICAgYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbiA9IHNhdmVkU291cmNlUG9zaXRpb247CiAgICAgIH0KICAgIH0KCiAgICBhc20uZW1pdEp1bXAoZGVmYXVsdExhYmVsKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuY2FzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgZmluYWwgU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlID0gbm9kZS5jYXNlc1tpXTsKICAgICAgZmluYWwgTGFiZWwgY2FzZUxhYmVsID0gY2FzZUxhYmVsc1tpXTsKCiAgICAgIGFzbS5iaW5kKGNhc2VMYWJlbCk7CiAgICAgIF9nZW5lcmF0ZU5vZGUoc3dpdGNoQ2FzZS5ib2R5KTsKCiAgICAgIC8vIEZyb250LWVuZCBpc3N1ZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlcmUgaXMgYSBmYWxsdGhyb3VnaAogICAgICAvLyBiZXR3ZWVuIGNhc2VzLiBBbHNvLCBkZWZhdWx0IGNhc2Ugc2hvdWxkIGJlIHRoZSBsYXN0IG9uZS4KICAgIH0KCiAgICBhc20uYmluZChkb25lKTsKICAgIG5vZGUuY2FzZXMuZm9yRWFjaChzd2l0Y2hDYXNlcy5yZW1vdmUpOwogICAgY29udGV4dExldmVscy5yZW1vdmUobm9kZSk7CiAgfQoKICBib29sIF9pc1RyeUJsb2NrKFRyZWVOb2RlIG5vZGUpID0+IG5vZGUgaXMgVHJ5Q2F0Y2ggfHwgbm9kZSBpcyBUcnlGaW5hbGx5OwoKICBpbnQgX3NhdmVkQ29udGV4dFZhcihUcmVlTm9kZSBub2RlKSB7CiAgICBhc3NlcnQoX2lzVHJ5QmxvY2sobm9kZSkpOwogICAgYXNzZXJ0KGxvY2Fscy5jYXB0dXJlZFNhdmVkQ29udGV4dFZhcihub2RlKSA9PSBudWxsKTsKICAgIHJldHVybiBsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlLCB0ZW1wSW5kZXg6IDApOwogIH0KCiAgLy8gRXhjZXB0aW9uIHZhciBvY2N1cGllcyB0aGUgc2FtZSBzbG90IGFzIHNhdmVkIGNvbnRleHQsIHNvIGNvbnRleHQKICAvLyBzaG91bGQgYmUgcmVzdG9yZWQgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGV4Y2VwdGlvbi4KICBpbnQgX2V4Y2VwdGlvblZhcihUcmVlTm9kZSBub2RlKSB7CiAgICBhc3NlcnQoX2lzVHJ5QmxvY2sobm9kZSkpOwogICAgcmV0dXJuIGxvY2Fscy50ZW1wSW5kZXhJbkZyYW1lKG5vZGUsIHRlbXBJbmRleDogMCk7CiAgfQoKICBpbnQgX3N0YWNrVHJhY2VWYXIoVHJlZU5vZGUgbm9kZSkgewogICAgYXNzZXJ0KF9pc1RyeUJsb2NrKG5vZGUpKTsKICAgIHJldHVybiBsb2NhbHMudGVtcEluZGV4SW5GcmFtZShub2RlLCB0ZW1wSW5kZXg6IDEpOwogIH0KCiAgX3NhdmVDb250ZXh0Rm9yVHJ5QmxvY2soVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKCFsb2NhbHMuaGFzQ29udGV4dFZhcikgewogICAgICByZXR1cm47CiAgICB9CiAgICBmaW5hbCBjYXB0dXJlZFNhdmVkQ29udGV4dFZhciA9IGxvY2Fscy5jYXB0dXJlZFNhdmVkQ29udGV4dFZhcihub2RlKTsKICAgIGlmIChjYXB0dXJlZFNhdmVkQ29udGV4dFZhciAhPSBudWxsKSB7CiAgICAgIGFzc2VydChsb2NhbHMuaXNTeW5jWWllbGRpbmdGcmFtZSk7CiAgICAgIF9nZW5QdXNoQ29udGV4dEZvclZhcmlhYmxlKGNhcHR1cmVkU2F2ZWRDb250ZXh0VmFyKTsKICAgICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5jb250ZXh0VmFySW5kZXhJbkZyYW1lKTsKICAgICAgX2dlblN0b3JlVmFyKGNhcHR1cmVkU2F2ZWRDb250ZXh0VmFyKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzbS5lbWl0UHVzaChsb2NhbHMuY29udGV4dFZhckluZGV4SW5GcmFtZSk7CiAgICAgIGFzbS5lbWl0UG9wTG9jYWwoX3NhdmVkQ29udGV4dFZhcihub2RlKSk7CiAgICB9CiAgfQoKICBfcmVzdG9yZUNvbnRleHRGb3JUcnlCbG9jayhUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAoIWxvY2Fscy5oYXNDb250ZXh0VmFyKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZpbmFsIGNhcHR1cmVkU2F2ZWRDb250ZXh0VmFyID0gbG9jYWxzLmNhcHR1cmVkU2F2ZWRDb250ZXh0VmFyKG5vZGUpOwogICAgaWYgKGNhcHR1cmVkU2F2ZWRDb250ZXh0VmFyICE9IG51bGwpIHsKICAgICAgLy8gMS4gUmVzdG9yZSBjb250ZXh0IGZyb20gY2xvc3VyZSB2YXIuCiAgICAgIC8vIFRoaXMgY29udGV4dCBoYXMgYSBjb250ZXh0IGxldmVsIGF0IGZyYW1lIGVudHJ5LgogICAgICBhc20uZW1pdFB1c2gobG9jYWxzLmNsb3N1cmVWYXJJbmRleEluRnJhbWUpOwogICAgICBhc20uZW1pdExvYWRGaWVsZFRPUyhjcC5hZGRJbnN0YW5jZUZpZWxkKGNsb3N1cmVDb250ZXh0KSk7CiAgICAgIGFzbS5lbWl0UG9wTG9jYWwobG9jYWxzLmNvbnRleHRWYXJJbmRleEluRnJhbWUpOwoKICAgICAgLy8gMi4gUmVzdG9yZSBjb250ZXh0IGZyb20gY2FwdHVyZWQgOnNhdmVkX3RyeV9jb250ZXh0X3ZhciR7ZGVwdGh9LgogICAgICBhc3NlcnQobG9jYWxzLmlzQ2FwdHVyZWQoY2FwdHVyZWRTYXZlZENvbnRleHRWYXIpKTsKICAgICAgX2dlbkxvYWRWYXIoY2FwdHVyZWRTYXZlZENvbnRleHRWYXIsCiAgICAgICAgICBjdXJyZW50Q29udGV4dExldmVsOiBsb2NhbHMuY29udGV4dExldmVsQXRFbnRyeSk7CiAgICB9IGVsc2UgewogICAgICBhc20uZW1pdFB1c2goX3NhdmVkQ29udGV4dFZhcihub2RlKSk7CiAgICB9CiAgICBhc20uZW1pdFBvcExvY2FsKGxvY2Fscy5jb250ZXh0VmFySW5kZXhJbkZyYW1lKTsKICB9CgogIC8vLyBTdGFydCB0cnkgYmxvY2sKICBUcnlCbG9jayBfc3RhcnRUcnlCbG9jayhUcmVlTm9kZSBub2RlKSB7CiAgICBhc3NlcnQoX2lzVHJ5QmxvY2sobm9kZSkpOwoKICAgIF9zYXZlQ29udGV4dEZvclRyeUJsb2NrKG5vZGUpOwoKICAgIHJldHVybiBhc20uZXhjZXB0aW9uc1RhYmxlLmVudGVyVHJ5QmxvY2soYXNtLm9mZnNldCk7CiAgfQoKICAvLy8gRW5kIHRyeSBibG9jayBhbmQgc3RhcnQgaXRzIGhhbmRsZXIuCiAgdm9pZCBfZW5kVHJ5QmxvY2soVHJlZU5vZGUgbm9kZSwgVHJ5QmxvY2sgdHJ5QmxvY2spIHsKICAgIHRyeUJsb2NrLmVuZFBDID0gYXNtLm9mZnNldDsKICAgIHRyeUJsb2NrLmhhbmRsZXJQQyA9IGFzbS5vZmZzZXQ7CgogICAgLy8gRXhjZXB0aW9uIGhhbmRsZXJzIGFyZSByZWFjaGFibGUgYWx0aG91Z2ggdGhlcmUgYXJlIG5vIGxhYmVscyBvciBqdW1wcy4KICAgIGFzbS5pc1VucmVhY2hhYmxlID0gZmFsc2U7CgogICAgYXNtLmVtaXRTZXRGcmFtZShsb2NhbHMuZnJhbWVTaXplKTsKCiAgICBfcmVzdG9yZUNvbnRleHRGb3JUcnlCbG9jayhub2RlKTsKCiAgICBhc20uZW1pdE1vdmVTcGVjaWFsKFNwZWNpYWxJbmRleC5leGNlcHRpb24sIF9leGNlcHRpb25WYXIobm9kZSkpOwogICAgYXNtLmVtaXRNb3ZlU3BlY2lhbChTcGVjaWFsSW5kZXguc3RhY2tUcmFjZSwgX3N0YWNrVHJhY2VWYXIobm9kZSkpOwoKICAgIGZpbmFsIGNhcHR1cmVkRXhjZXB0aW9uVmFyID0gbG9jYWxzLmNhcHR1cmVkRXhjZXB0aW9uVmFyKG5vZGUpOwogICAgaWYgKGNhcHR1cmVkRXhjZXB0aW9uVmFyICE9IG51bGwpIHsKICAgICAgX2dlblB1c2hDb250ZXh0Rm9yVmFyaWFibGUoY2FwdHVyZWRFeGNlcHRpb25WYXIpOwogICAgICBhc20uZW1pdFB1c2goX2V4Y2VwdGlvblZhcihub2RlKSk7CiAgICAgIF9nZW5TdG9yZVZhcihjYXB0dXJlZEV4Y2VwdGlvblZhcik7CiAgICB9CgogICAgZmluYWwgY2FwdHVyZWRTdGFja1RyYWNlVmFyID0gbG9jYWxzLmNhcHR1cmVkU3RhY2tUcmFjZVZhcihub2RlKTsKICAgIGlmIChjYXB0dXJlZFN0YWNrVHJhY2VWYXIgIT0gbnVsbCkgewogICAgICBfZ2VuUHVzaENvbnRleHRGb3JWYXJpYWJsZShjYXB0dXJlZFN0YWNrVHJhY2VWYXIpOwogICAgICBhc20uZW1pdFB1c2goX3N0YWNrVHJhY2VWYXIobm9kZSkpOwogICAgICBfZ2VuU3RvcmVWYXIoY2FwdHVyZWRTdGFja1RyYWNlVmFyKTsKICAgIH0KICB9CgogIHZvaWQgX2dlblJldGhyb3coVHJlZU5vZGUgbm9kZSkgewogICAgZmluYWwgY2FwdHVyZWRFeGNlcHRpb25WYXIgPSBsb2NhbHMuY2FwdHVyZWRFeGNlcHRpb25WYXIobm9kZSk7CiAgICBpZiAoY2FwdHVyZWRFeGNlcHRpb25WYXIgIT0gbnVsbCkgewogICAgICBhc3NlcnQobG9jYWxzLmlzQ2FwdHVyZWQoY2FwdHVyZWRFeGNlcHRpb25WYXIpKTsKICAgICAgX2dlbkxvYWRWYXIoY2FwdHVyZWRFeGNlcHRpb25WYXIpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmVtaXRQdXNoKF9leGNlcHRpb25WYXIobm9kZSkpOwogICAgfQoKICAgIGZpbmFsIGNhcHR1cmVkU3RhY2tUcmFjZVZhciA9IGxvY2Fscy5jYXB0dXJlZFN0YWNrVHJhY2VWYXIobm9kZSk7CiAgICBpZiAoY2FwdHVyZWRTdGFja1RyYWNlVmFyICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGxvY2Fscy5pc0NhcHR1cmVkKGNhcHR1cmVkU3RhY2tUcmFjZVZhcikpOwogICAgICBfZ2VuTG9hZFZhcihjYXB0dXJlZFN0YWNrVHJhY2VWYXIpOwogICAgfSBlbHNlIHsKICAgICAgYXNtLmVtaXRQdXNoKF9zdGFja1RyYWNlVmFyKG5vZGUpKTsKICAgIH0KCiAgICBhc20uZW1pdFRocm93KDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICBpZiAoYXNtLmlzVW5yZWFjaGFibGUpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIExhYmVsIGRvbmUgPSBuZXcgTGFiZWwoKTsKCiAgICBmaW5hbCBUcnlCbG9jayB0cnlCbG9jayA9IF9zdGFydFRyeUJsb2NrKG5vZGUpOwogICAgdHJ5QmxvY2suaXNTeW50aGV0aWMgPSBub2RlLmlzU3ludGhldGljOwogICAgdHJ5Q2F0Y2hlcyA/Pz0gbmV3IE1hcDxUcnlDYXRjaCwgVHJ5QmxvY2s+KCk7CiAgICB0cnlDYXRjaGVzW25vZGVdID0gdHJ5QmxvY2s7IC8vIFVzZWQgYnkgcmV0aHJvdy4KCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuYm9keSk7CiAgICBhc20uZW1pdEp1bXAoZG9uZSk7CgogICAgX2VuZFRyeUJsb2NrKG5vZGUsIHRyeUJsb2NrKTsKCiAgICBmaW5hbCBpbnQgZXhjZXB0aW9uID0gX2V4Y2VwdGlvblZhcihub2RlKTsKICAgIGZpbmFsIGludCBzdGFja1RyYWNlID0gX3N0YWNrVHJhY2VWYXIobm9kZSk7CgogICAgYm9vbCBoYXNDYXRjaEFsbCA9IGZhbHNlOwoKICAgIGZpbmFsIHNhdmVkU291cmNlUG9zaXRpb24gPSBhc20uY3VycmVudFNvdXJjZVBvc2l0aW9uOwogICAgZm9yIChDYXRjaCBjYXRjaENsYXVzZSBpbiBub2RlLmNhdGNoZXMpIHsKICAgICAgX3JlY29yZFNvdXJjZVBvc2l0aW9uKGNhdGNoQ2xhdXNlLmZpbGVPZmZzZXQpOwogICAgICB0cnlCbG9jay50eXBlcy5hZGQoY3AuYWRkVHlwZShjYXRjaENsYXVzZS5ndWFyZCkpOwoKICAgICAgTGFiZWwgc2tpcENhdGNoOwogICAgICBpZiAoY2F0Y2hDbGF1c2UuZ3VhcmQgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgIGhhc0NhdGNoQWxsID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc20uZW1pdFB1c2goZXhjZXB0aW9uKTsKICAgICAgICBfZ2VuSW5zdGFuY2VPZihjYXRjaENsYXVzZS5ndWFyZCk7CgogICAgICAgIHNraXBDYXRjaCA9IG5ldyBMYWJlbCgpOwogICAgICAgIGFzbS5lbWl0SnVtcElmRmFsc2Uoc2tpcENhdGNoKTsKICAgICAgfQoKICAgICAgX2VudGVyU2NvcGUoY2F0Y2hDbGF1c2UpOwoKICAgICAgaWYgKGNhdGNoQ2xhdXNlLmV4Y2VwdGlvbiAhPSBudWxsKSB7CiAgICAgICAgX2dlblB1c2hDb250ZXh0SWZDYXB0dXJlZChjYXRjaENsYXVzZS5leGNlcHRpb24pOwogICAgICAgIGFzbS5lbWl0UHVzaChleGNlcHRpb24pOwogICAgICAgIF9nZW5TdG9yZVZhcihjYXRjaENsYXVzZS5leGNlcHRpb24pOwogICAgICB9CgogICAgICBpZiAoY2F0Y2hDbGF1c2Uuc3RhY2tUcmFjZSAhPSBudWxsKSB7CiAgICAgICAgdHJ5QmxvY2submVlZHNTdGFja1RyYWNlID0gdHJ1ZTsKICAgICAgICBfZ2VuUHVzaENvbnRleHRJZkNhcHR1cmVkKGNhdGNoQ2xhdXNlLnN0YWNrVHJhY2UpOwogICAgICAgIGFzbS5lbWl0UHVzaChzdGFja1RyYWNlKTsKICAgICAgICBfZ2VuU3RvcmVWYXIoY2F0Y2hDbGF1c2Uuc3RhY2tUcmFjZSk7CiAgICAgIH0KCiAgICAgIF9nZW5lcmF0ZU5vZGUoY2F0Y2hDbGF1c2UuYm9keSk7CgogICAgICBfbGVhdmVTY29wZSgpOwogICAgICBhc20uZW1pdEp1bXAoZG9uZSk7CgogICAgICBpZiAoc2tpcENhdGNoICE9IG51bGwpIHsKICAgICAgICBhc20uYmluZChza2lwQ2F0Y2gpOwogICAgICB9CiAgICB9CiAgICBhc20uY3VycmVudFNvdXJjZVBvc2l0aW9uID0gc2F2ZWRTb3VyY2VQb3NpdGlvbjsKCiAgICBpZiAoIWhhc0NhdGNoQWxsKSB7CiAgICAgIHRyeUJsb2NrLm5lZWRzU3RhY2tUcmFjZSA9IHRydWU7CiAgICAgIF9nZW5SZXRocm93KG5vZGUpOwogICAgfQoKICAgIGFzbS5iaW5kKGRvbmUpOwogICAgdHJ5Q2F0Y2hlcy5yZW1vdmUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICBpZiAoYXNtLmlzVW5yZWFjaGFibGUpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIFRyeUJsb2NrIHRyeUJsb2NrID0gX3N0YXJ0VHJ5QmxvY2sobm9kZSk7CiAgICB0cnlCbG9jay5pc1N5bnRoZXRpYyA9IHRydWU7CiAgICBmaW5hbGx5QmxvY2tzID8/PSBuZXcgTWFwPFRyeUZpbmFsbHksIExpc3Q8RmluYWxseUJsb2NrPj4oKTsKICAgIGZpbmFsbHlCbG9ja3Nbbm9kZV0gPSA8RmluYWxseUJsb2NrPltdOwoKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5ib2R5KTsKCiAgICBpZiAoIWFzbS5pc1VucmVhY2hhYmxlKSB7CiAgICAgIGZpbmFsIG5vcm1hbENvbnRpbnVhdGlvbiA9IG5ldyBGaW5hbGx5QmxvY2soKCkgewogICAgICAgIC8qIGRvIG5vdGhpbmcgKGZhbGwgdGhyb3VnaCkgKi8KICAgICAgfSk7CiAgICAgIGZpbmFsbHlCbG9ja3Nbbm9kZV0uYWRkKG5vcm1hbENvbnRpbnVhdGlvbik7CiAgICAgIGFzbS5lbWl0SnVtcChub3JtYWxDb250aW51YXRpb24uZW50cnkpOwogICAgfQoKICAgIF9lbmRUcnlCbG9jayhub2RlLCB0cnlCbG9jayk7CgogICAgdHJ5QmxvY2sudHlwZXMuYWRkKGNwLmFkZFR5cGUoY29uc3QgRHluYW1pY1R5cGUoKSkpOwoKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5maW5hbGl6ZXIpOwoKICAgIHRyeUJsb2NrLm5lZWRzU3RhY2tUcmFjZSA9IHRydWU7IC8vIEZvciByZXRocm93aW5nLgogICAgX2dlblJldGhyb3cobm9kZSk7CgogICAgZm9yICh2YXIgZmluYWxseUJsb2NrIGluIGZpbmFsbHlCbG9ja3Nbbm9kZV0pIHsKICAgICAgYXNtLmJpbmQoZmluYWxseUJsb2NrLmVudHJ5KTsKICAgICAgX3Jlc3RvcmVDb250ZXh0Rm9yVHJ5QmxvY2sobm9kZSk7CiAgICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5maW5hbGl6ZXIpOwogICAgICBmaW5hbGx5QmxvY2suZ2VuZXJhdGVDb250aW51YXRpb24oKTsKICAgIH0KCiAgICBmaW5hbGx5QmxvY2tzLnJlbW92ZShub2RlKTsKICB9CgogIGJvb2wgX3NraXBWYXJpYWJsZUluaXRpYWxpemF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gdiwgYm9vbCBpc0NhcHR1cmVkKSB7CiAgICAvLyBXZSBjYW4gc2tpcCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBpZiB0aGUgdmFyaWFibGUgaXMgc3VwcG9zZWQgdG8gYmUKICAgIC8vIGluaXRpYWxpemVkIHRvIG51bGwgYW5kIGl0J3MgY2FwdHVyZWQuIFRoaXMgaXMgYmVjYXVzZSBhbGwgdGhlIHNsb3RzIGluCiAgICAvLyB0aGUgY2FwdHVyZSBjb250ZXh0IGFyZSBpbXBsaWNpdGx5IGluaXRpYWxpemVkIHRvIG51bGwuCgogICAgLy8gQ2hlY2sgaWYgdGhlIHZhcmlhYmxlIGlzIHN1cHBvc2VkIHRvIGJlIGluaXRpYWxpemVkIHRvIG51bGwuCiAgICBpZiAoISh2LmluaXRpYWxpemVyID09IG51bGwgfHwgdi5pbml0aWFsaXplciBpcyBOdWxsTGl0ZXJhbCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIExhdGUgdmFyaWFibGVzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gYSBzZW50aW5lbCwgbm90IG51bGwuCiAgICBpZiAodi5pc0xhdGUpIHJldHVybiBmYWxzZTsKCiAgICAvLyBOb24tY2FwdHVyZWQgdmFyaWFibGVzIGdvIGluIHN0YWNrIHNsb3RzIHRoYXQgYXJlbid0IGltcGxpY2l0bHkgbnVsbGVkLgogICAgcmV0dXJuIGlzQ2FwdHVyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgewogICAgICBmaW5hbCBib29sIGlzQ2FwdHVyZWQgPSBsb2NhbHMuaXNDYXB0dXJlZChub2RlKTsKICAgICAgZmluYWwgaW5pdGlhbGl6ZXIgPSBub2RlLmluaXRpYWxpemVyOwogICAgICBmaW5hbCBib29sIGVtaXRTdG9yZSA9ICFfc2tpcFZhcmlhYmxlSW5pdGlhbGl6YXRpb24obm9kZSwgaXNDYXB0dXJlZCk7CiAgICAgIGludCBtYXhJbml0aWFsaXplclBvc2l0aW9uID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICBpZiAoZW1pdFN0b3JlKSB7CiAgICAgICAgaWYgKGlzQ2FwdHVyZWQpIHsKICAgICAgICAgIF9nZW5QdXNoQ29udGV4dEZvclZhcmlhYmxlKG5vZGUpOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS5pc0xhdGUgJiYgIV9pc1RyaXZpYWxJbml0aWFsaXplcihpbml0aWFsaXplcikpIHsKICAgICAgICAgIGFzbS5lbWl0UHVzaFVuaW5pdGlhbGl6ZWRTZW50aW5lbCgpOwogICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgX3N0YXJ0UmVjb3JkaW5nTWF4UG9zaXRpb24obm9kZS5maWxlT2Zmc2V0KTsKICAgICAgICAgIF9nZW5lcmF0ZU5vZGUoaW5pdGlhbGl6ZXIpOwogICAgICAgICAgbWF4SW5pdGlhbGl6ZXJQb3NpdGlvbiA9IF9lbmRSZWNvcmRpbmdNYXhQb3NpdGlvbigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc20uZW1pdFB1c2hOdWxsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5lbWl0RGVidWdnZXJTdG9wcyAmJgogICAgICAgICAgKGluaXRpYWxpemVyID09IG51bGwgfHwgX3ZhcmlhYmxlU2V0TmVlZHNEZWJ1Z0NoZWNrKGluaXRpYWxpemVyKSkpIHsKICAgICAgICBmaW5hbCBzYXZlZFNvdXJjZVBvc2l0aW9uID0gYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbjsKICAgICAgICBpZiAobm9kZS5maWxlRXF1YWxzT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgICAgICBfcmVjb3JkU291cmNlUG9zaXRpb24obm9kZS5maWxlRXF1YWxzT2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgYXNtLmVtaXREZWJ1Z0NoZWNrKCk7CiAgICAgICAgYXNtLmN1cnJlbnRTb3VyY2VQb3NpdGlvbiA9IHNhdmVkU291cmNlUG9zaXRpb247CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLmVtaXRMb2NhbFZhckluZm8gJiYgIWFzbS5pc1VucmVhY2hhYmxlICYmIG5vZGUubmFtZSAhPSBudWxsKSB7CiAgICAgICAgX2RlY2xhcmVMb2NhbFZhcmlhYmxlKG5vZGUsIG1heEluaXRpYWxpemVyUG9zaXRpb24gKyAxKTsKICAgICAgfQoKICAgICAgaWYgKGVtaXRTdG9yZSkgewogICAgICAgIF9nZW5TdG9yZVZhcihub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoYXNtLmlzVW5yZWFjaGFibGUpIHsKICAgICAgLy8gQmFpbCBvdXQgYmVmb3JlIGJpbmRpbmcgYSBsYWJlbCB3aGljaCBhbGxvd3MgYmFja3dhcmQganVtcHMsCiAgICAgIC8vIGFzIGl0IGlzIG5vdCBoYW5kbGVkIGJ5IGxvY2FsIHVucmVhY2hhYmxlIGNvZGUgZWxpbWluYXRpb24uCiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBMYWJlbCBkb25lID0gbmV3IExhYmVsKCk7CiAgICBmaW5hbCBMYWJlbCBqb2luID0gbmV3IExhYmVsKGFsbG93c0JhY2t3YXJkSnVtcHM6IHRydWUpOwogICAgYXNtLmJpbmQoam9pbik7CgogICAgYXNtLmVtaXRDaGVja1N0YWNrKCsrY3VycmVudExvb3BEZXB0aCk7CgogICAgX2dlbkNvbmRpdGlvbkFuZEp1bXBJZihub2RlLmNvbmRpdGlvbiwgZmFsc2UsIGRvbmUpOwoKICAgIF9nZW5lcmF0ZU5vZGUobm9kZS5ib2R5KTsKCiAgICBhc20uZW1pdEp1bXAoam9pbik7CiAgICAtLWN1cnJlbnRMb29wRGVwdGg7CgogICAgYXNtLmJpbmQoZG9uZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmICghbm9kZS5pc05hdGl2ZSkgewogICAgICB0aHJvdyAnWWllbGRTdGF0ZW1lbnQgbXVzdCBiZSBkZXN1Z2FyZWQ6ICRub2RlJzsKICAgIH0KCiAgICBpZiAoYXNtLmlzVW5yZWFjaGFibGUpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIG5vcm1hbCBlbnRyeSwgeWllbGQgcG9pbnRzIGFyZSBjb3VudGVkIGZyb20gMS4KICAgIGZpbmFsIGludCB5aWVsZEluZGV4ID0geWllbGRQb2ludHMubGVuZ3RoICsgMTsKICAgIGZpbmFsIExhYmVsIGNvbnRpbnVhdGlvbkxhYmVsID0gbmV3IExhYmVsKGFsbG93c0JhY2t3YXJkSnVtcHM6IHRydWUpOwogICAgeWllbGRQb2ludHMuYWRkKGNvbnRpbnVhdGlvbkxhYmVsKTsKCiAgICAvLyA6YXdhaXRfanVtcF92YXIgPSAjaW5kZXgKICAgIGFzc2VydChsb2NhbHMuaXNDYXB0dXJlZChsb2NhbHMuYXdhaXRKdW1wVmFyKSk7CiAgICBfZ2VuUHVzaENvbnRleHRGb3JWYXJpYWJsZShsb2NhbHMuYXdhaXRKdW1wVmFyKTsKICAgIF9nZW5QdXNoSW50KHlpZWxkSW5kZXgpOwogICAgX2dlblN0b3JlVmFyKGxvY2Fscy5hd2FpdEp1bXBWYXIpOwoKICAgIC8vIDphd2FpdF9jdHhfdmFyID0gY29udGV4dAogICAgYXNzZXJ0KGxvY2Fscy5pc0NhcHR1cmVkKGxvY2Fscy5hd2FpdENvbnRleHRWYXIpKTsKICAgIF9nZW5QdXNoQ29udGV4dEZvclZhcmlhYmxlKGxvY2Fscy5hd2FpdENvbnRleHRWYXIpOwogICAgYXNtLmVtaXRQdXNoKGxvY2Fscy5jb250ZXh0VmFySW5kZXhJbkZyYW1lKTsKICAgIF9nZW5TdG9yZVZhcihsb2NhbHMuYXdhaXRDb250ZXh0VmFyKTsKCiAgICAvLyByZXR1cm4gPGV4cHJlc3Npb24+CiAgICAvLyBOb3RlOiBmaW5hbGx5IGJsb2NrcyBhcmUgKm5vdCogZXhlY3V0ZWQgb24gdGhlIHdheSBvdXQuCiAgICBfZ2VuZXJhdGVOb2RlKG5vZGUuZXhwcmVzc2lvbik7CiAgICBfZ2VuUmV0dXJuVE9TKG5vZGUuZmlsZU9mZnNldCk7CgogICAgYXNtLmJpbmQoY29udGludWF0aW9uTGFiZWwpOwoKICAgIGlmIChwYXJlbnRGdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQXN5bmMgfHwKICAgICAgICBwYXJlbnRGdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQXN5bmNTdGFyKSB7CiAgICAgIGZpbmFsIGludCBleGNlcHRpb25QYXJhbSA9IGxvY2Fscy5hc3luY0V4Y2VwdGlvblBhcmFtSW5kZXhJbkZyYW1lOwogICAgICBmaW5hbCBpbnQgc3RhY2tUcmFjZVBhcmFtID0gbG9jYWxzLmFzeW5jU3RhY2tUcmFjZVBhcmFtSW5kZXhJbkZyYW1lOwoKICAgICAgLy8gaWYgKDpleGNlcHRpb24gIT0gbnVsbCkgcmV0aHJvdyAoOmV4Y2VwdGlvbiwgOnN0YWNrX3RyYWNlKQogICAgICBmaW5hbCBMYWJlbCBjb250ID0gbmV3IExhYmVsKCk7CiAgICAgIGFzbS5lbWl0UHVzaChleGNlcHRpb25QYXJhbSk7CiAgICAgIGFzbS5lbWl0SnVtcElmTnVsbChjb250KTsKCiAgICAgIGFzbS5lbWl0UHVzaChleGNlcHRpb25QYXJhbSk7CiAgICAgIGFzbS5lbWl0UHVzaChzdGFja1RyYWNlUGFyYW0pOwogICAgICBhc20uZW1pdFRocm93KDEpOwoKICAgICAgYXNtLmJpbmQoY29udCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICBfZ2VuRmllbGRJbml0aWFsaXplcihub2RlLmZpZWxkLCBub2RlLnZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcihSZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUpIHsKICAgIGZpbmFsIGFyZ3MgPSBub2RlLmFyZ3VtZW50czsKICAgIGFzc2VydChhcmdzLnR5cGVzLmlzRW1wdHkpOwogICAgX2dlbkFyZ3VtZW50cyhuZXcgVGhpc0V4cHJlc3Npb24oKSwgYXJncyk7CiAgICBfZ2VuRGlyZWN0Q2FsbFdpdGhBcmdzKG5vZGUudGFyZ2V0LCBhcmdzLCBoYXNSZWNlaXZlcjogdHJ1ZSwgbm9kZTogbm9kZSk7CiAgICBhc20uZW1pdERyb3AxKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICBmaW5hbCBhcmdzID0gbm9kZS5hcmd1bWVudHM7CiAgICBhc3NlcnQoYXJncy50eXBlcy5pc0VtcHR5KTsKICAgIF9nZW5Bcmd1bWVudHMobmV3IFRoaXNFeHByZXNzaW9uKCksIGFyZ3MpOwogICAgLy8gUmUtcmVzb2x2ZSB0YXJnZXQgZHVlIHRvIHBhcnRpYWwgbWl4aW4gcmVzb2x1dGlvbi4KICAgIE1lbWJlciB0YXJnZXQ7CiAgICBmb3IgKHZhciByZXBsYWNlbWVudCBpbiBlbmNsb3NpbmdDbGFzcy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9ycykgewogICAgICBpZiAobm9kZS50YXJnZXQubmFtZSA9PSByZXBsYWNlbWVudC5uYW1lKSB7CiAgICAgICAgdGFyZ2V0ID0gcmVwbGFjZW1lbnQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydCh0YXJnZXQgIT0gbnVsbCk7CiAgICBfZ2VuRGlyZWN0Q2FsbFdpdGhBcmdzKHRhcmdldCwgYXJncywgaGFzUmVjZWl2ZXI6IHRydWUsIG5vZGU6IG5vZGUpOwogICAgYXNtLmVtaXREcm9wMSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMb2NhbEluaXRpYWxpemVyKExvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgX2dlbmVyYXRlTm9kZShub2RlLnZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgX2dlbmVyYXRlTm9kZShub2RlLnN0YXRlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgX2dlblB1c2hDb25zdGFudChub2RlLmNvbnN0YW50KTsKICB9Cn0KCmNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IodGhpcy5tZXNzYWdlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbWVzc2FnZTsKfQoKY2xhc3MgVG9vTWFueUFyZ3VtZW50c0V4Y2VwdGlvbiBleHRlbmRzIEJ5dGVjb2RlTGltaXRFeGNlZWRlZEV4Y2VwdGlvbiB7CiAgZmluYWwgaW50IGZpbGVPZmZzZXQ7CiAgVG9vTWFueUFyZ3VtZW50c0V4Y2VwdGlvbih0aGlzLmZpbGVPZmZzZXQpOwp9Cgp0eXBlZGVmIHZvaWQgR2VuZXJhdGVDb250aW51YXRpb24oKTsKCmNsYXNzIEZpbmFsbHlCbG9jayB7CiAgZmluYWwgTGFiZWwgZW50cnkgPSBuZXcgTGFiZWwoKTsKICBmaW5hbCBHZW5lcmF0ZUNvbnRpbnVhdGlvbiBnZW5lcmF0ZUNvbnRpbnVhdGlvbjsKCiAgRmluYWxseUJsb2NrKHRoaXMuZ2VuZXJhdGVDb250aW51YXRpb24pOwp9CgpjbGFzcyBBbm5vdGF0aW9ucyB7CiAgZmluYWwgQW5ub3RhdGlvbnNEZWNsYXJhdGlvbiBvYmplY3Q7CiAgZmluYWwgYm9vbCBoYXNQcmFnbWE7CgogIGNvbnN0IEFubm90YXRpb25zKHRoaXMub2JqZWN0LCB0aGlzLmhhc1ByYWdtYSk7Cn0KCmFzdC5Db21wb25lbnQgY3JlYXRlRnJlc2hDb21wb25lbnRXaXRoQnl0ZWNvZGUoYXN0LkNvbXBvbmVudCBjb21wb25lbnQpIHsKICBmaW5hbCBuZXdDb21wb25lbnQgPSBuZXcgYXN0LkNvbXBvbmVudCgpOwogIGZpbmFsIG5ld1JlcG9zaXRvcnkgPSBuZXcgQnl0ZWNvZGVNZXRhZGF0YVJlcG9zaXRvcnkoKTsKICBuZXdDb21wb25lbnQuYWRkTWV0YWRh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b25zIHsKICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjb21tYW5kTGluZUZsYWdzID0gewogICAgJ2Fubm90YXRpb25zJzogJ0VtaXQgRGFydCBhbm5vdGF0aW9ucycsCiAgICAnbG9jYWwtdmFyLWluZm8nOiAnRW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbiBhYm91dCBsb2NhbCB2YXJpYWJsZXMnLAogICAgJ2RlYnVnZ2VyLXN0b3BzJzogJ0VtaXQgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGZvciBzdG9wcGluZyBpbiB0aGUgZGVidWdnZXInLAogICAgJ3Nob3ctYnl0ZWNvZGUtc2l6ZS1zdGF0JzogJ1Nob3cgYnl0ZWNvZGUgc2l6ZSBicmVha2Rvd24nLAogICAgJ3NvdXJjZS1wb3NpdGlvbnMnOiAnRW1pdCBzb3VyY2UgcG9zaXRpb25zJywKICAgICdpbnN0YW5jZS1maWVsZC1pbml0aWFsaXplcnMnOiAnRW1pdCBzZXBhcmF0ZSBpbnN0YW5jZSBmaWVsZCBpbml0aWFsaXplcnMnLAogICAgJ2tlZXAtdW5yZWFjaGFibGUtY29kZSc6CiAgICAgICAgJ0RvIG5vdCByZW1vdmUgdW5yZWFjaGFibGUgY29kZSAodXNlZnVsIGlmIGNvbGxlY3RpbmcgY29kZSBjb3ZlcmFnZSknLAogICAgJ2F2b2lkLWNsb3N1cmUtY2FsbC1pbnN0cnVjdGlvbnMnOgogICAgICAgICdEbyBub3QgZW1pdCBjbG9zdXJlIGNhbGwgaW5zdHJ1Y3Rpb25zICh1c2VmdWwgaWYgY29sbGVjdGluZyBjb2RlICcKICAgICAgICAgICAgJ2NvdmVyYWdlLCBhcyBjbG9zdXJlIGNhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgdHJhY2tlZCBieSBjb2RlICcKICAgICAgICAgICAgJ2NvdmVyYWdlKScsCiAgfTsKCiAgYm9vbCBlbmFibGVBc3NlcnRzOwogIGJvb2wgY2F1c2FsQXN5bmNTdGFja3M7CiAgYm9vbCBlbWl0U291cmNlUG9zaXRpb25zOwogIGJvb2wgZW1pdFNvdXJjZUZpbGVzOwogIGJvb2wgZW1pdExvY2FsVmFySW5mbzsKICBib29sIGVtaXREZWJ1Z2dlclN0b3BzOwogIGJvb2wgZW1pdEFubm90YXRpb25zOwogIGJvb2wgZW1pdEluc3RhbmNlRmllbGRJbml0aWFsaXplcnM7CiAgYm9vbCBvbWl0QXNzZXJ0U291cmNlUG9zaXRpb25zOwogIGJvb2wga2VlcFVucmVhY2hhYmxlQ29kZTsKICBib29sIGF2b2lkQ2xvc3VyZUNhbGxJbnN0cnVjdGlvbnM7CiAgYm9vbCBzaG93Qnl0ZWNvZGVTaXplU3RhdGlzdGljczsKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lczsKCiAgQnl0ZWNvZGVPcHRpb25zKAogICAgICB7dGhpcy5lbmFibGVBc3NlcnRzID0gZmFsc2UsCiAgICAgIHRoaXMuY2F1c2FsQXN5bmNTdGFja3MsCiAgICAgIHRoaXMuZW1pdFNvdXJjZVBvc2l0aW9ucyA9IGZhbHNlLAogICAgICB0aGlzLmVtaXRTb3VyY2VGaWxlcyA9IGZhbHNlLAogICAgICB0aGlzLmVtaXRMb2NhbFZhckluZm8gPSBmYWxzZSwKICAgICAgdGhpcy5lbWl0RGVidWdnZXJTdG9wcyA9IGZhbHNlLAogICAgICB0aGlzLmVtaXRBbm5vdGF0aW9ucyA9IGZhbHNlLAogICAgICB0aGlzLmVtaXRJbnN0YW5jZUZpZWxkSW5pdGlhbGl6ZXJzID0gZmFsc2UsCiAgICAgIHRoaXMub21pdEFzc2VydFNvdXJjZVBvc2l0aW9ucyA9IGZhbHNlLAogICAgICB0aGlzLmtlZXBVbnJlYWNoYWJsZUNvZGUgPSBmYWxzZSwKICAgICAgdGhpcy5hdm9pZENsb3N1cmVDYWxsSW5zdHJ1Y3Rpb25zID0gZmFsc2UsCiAgICAgIHRoaXMuc2hvd0J5dGVjb2RlU2l6ZVN0YXRpc3RpY3MgPSBmYWxzZSwKICAgICAgYm9vbCBhb3QgPSBmYWxzZSwKICAgICAgdGhpcy5lbnZpcm9ubWVudERlZmluZXMgPSBjb25zdCA8U3RyaW5nLCBTdHJpbmc+e319KSB7CiAgICBjYXVzYWxBc3luY1N0YWNrcyA/Pz0KICAgICAgICBlbnZpcm9ubWVudERlZmluZXNbJ2RhcnQuZGV2ZWxvcGVyLmNhdXNhbF9hc3luY19zdGFja3MnXSA9PSAndHJ1ZSc7CiAgICBpZiAoYW90KSB7CiAgICAgIGVtaXRTb3VyY2VQb3NpdGlvbnMgPSB0cnVlOwogICAgICBlbWl0TG9jYWxWYXJJbmZvID0gdHJ1ZTsKICAgICAgY2F1c2FsQXN5bmNTdGFja3MgPSB0cnVlOwogICAgfQogIH0KCiAgdm9pZCBwYXJzZUNvbW1hbmRMaW5lRmxhZ3MoTGlzdDxTdHJpbmc+IGZsYWdzKSB7CiAgICBpZiAoZmxhZ3MgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKFN0cmluZyBmbGFnIGluIGZsYWdzKSB7CiAgICAgIHN3aXRjaCAoZmxhZykgewogICAgICAgIGNhc2UgJ3NvdXJjZS1wb3NpdGlvbnMnOgogICAgICAgICAgZW1pdFNvdXJjZVBvc2l0aW9ucyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdsb2NhbC12YXItaW5mbyc6CiAgICAgICAgICBlbWl0TG9jYWxWYXJJbmZvID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2RlYnVnZ2VyLXN0b3BzJzoKICAgICAgICAgIGVtaXREZWJ1Z2dlclN0b3BzID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2Fubm90YXRpb25zJzoKICAgICAgICAgIGVtaXRBbm5vdGF0aW9ucyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdpbnN0YW5jZS1maWVsZC1pbml0aWFsaXplcnMnOgogICAgICAgICAgZW1pdEluc3RhbmNlRmllbGRJbml0aWFsaXplcnMgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAna2VlcC11bnJlYWNoYWJsZS1jb2RlJzoKICAgICAgICAgIGtlZXBVbnJlYWNoYWJsZUNvZGUgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYXZvaWQtY2xvc3VyZS1jYWxsLWluc3RydWN0aW9ucyc6CiAgICAgICAgICBhdm9pZENsb3N1cmVDYWxsSW5zdHJ1Y3Rpb25zID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3Nob3ctYnl0ZWNvZGUtc2l6ZS1zdGF0JzoKICAgICAgICAgIHNob3dCeXRlY29kZVNpemVTdGF0aXN0aWNzID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBieXRlY29kZSBmbGFnICRmbGFnJzsKICAgICAgfQogICAgfQogIH0KfQpjAE5OPAEdATIYMixGUT8xUB1PJ0xOGQUBFhocGBkaGCYiHCUjKgETIx4oJCUmJDIuKDEvGD0aTA8iHyAGBAEzGQ4GIRYhJhEfIxEfJBEcIhEsMBEmJhEwLxEoLRERMggGBAIBIHBhY2thZ2U6dm0vYnl0ZWNvZGUvb3B0aW9ucy5kYXJ0S2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9odHRwX2ZpbGVzeXN0ZW0uZGFydIeZaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS92bS5kYXJ0JzsKCmNsYXNzIEh0dHBBd2FyZUZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtIHsKICBGaWxlU3lzdGVtIG9yaWdpbmFsOwoKICBIdHRwQXdhcmVGaWxlU3lzdGVtKHRoaXMub3JpZ2luYWwpOwoKICBAb3ZlcnJpZGUKICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSB7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAnaHR0cCcgfHwgdXJpLnNjaGVtZSA9PSAnaHR0cHMnKSB7CiAgICAgIHJldHVybiBuZXcgSHR0cEZpbGVTeXN0ZW1FbnRpdHkodGhpcywgdXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBvcmlnaW5hbC5lbnRpdHlGb3JVcmkodXJpKTsKICAgIH0KICB9Cn0KCmNsYXNzIEh0dHBGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgSHR0cEF3YXJlRmlsZVN5c3RlbSBmaWxlU3lzdGVtOwogIFVyaSB1cmk7CgogIEh0dHBGaWxlU3lzdGVtRW50aXR5KHRoaXMuZmlsZVN5c3RlbSwgdGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgewogICAgcmV0dXJuIGNvbm5lY3RBbmRSdW4oKGlvLkh0dHBDbGllbnQgaHR0cENsaWVudCkgYXN5bmMgewogICAgICBpby5IdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gYXdhaXQgaHR0cENsaWVudC5oZWFkVXJsKHVyaSk7CiAgICAgIGlvLkh0dHBDbGllbnRSZXNwb25zZSByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuY2xvc2UoKTsKICAgICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gaW8uSHR0cFN0YXR1cy5vazsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICByZXR1cm4gY29ubmVjdEFuZFJ1bigoaW8uSHR0cENsaWVudCBodHRwQ2xpZW50KSBhc3luYyB7CiAgICAgIGlvLkh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPSBhd2FpdCBodHRwQ2xpZW50LmdldFVybCh1cmkpOwogICAgICBpby5IdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmNsb3NlKCk7CiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9IGlvLkh0dHBTdGF0dXMub2spIHsKICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksIHJlc3BvbnNlLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICAgIExpc3Q8TGlzdDxpbnQ+PiBsaXN0ID0gYXdhaXQgcmVzcG9uc2UudG9MaXN0KCk7CiAgICAgIHJldHVybiBsaXN0LmV4cGFuZCgobGlzdCkgPT4gbGlzdCkudG9MaXN0KCk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhhd2FpdCByZWFkQXNCeXRlcygpKTsKICB9CgogIFQgY29ubmVjdEFuZFJ1bjxUPihUIGJvZHkoaW8uSHR0cENsaWVudCBodHRwQ2xpZW50KSkgewogICAgaW8uSHR0cENsaWVudCBodHRwQ2xpZW50OwogICAgdHJ5IHsKICAgICAgaHR0cENsaWVudCA9IG5ldyBpby5IdHRwQ2xpZW50KCk7CiAgICAgIC8vIFNldCB0aW1lb3V0IHRvIGJlIHNob3J0ZXIgdGhhbiBhbnRpY2lwYXRlZCBPUyBkZWZhdWx0CiAgICAgIGh0dHBDbGllbnQuY29ubmVjdGlvblRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiA1KTsKICAgICAgcmV0dXJuIGJvZHkoaHR0cENsaWVudCk7CiAgICB9IG9uIEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksIGUudG9TdHJpbmcoKSk7CiAgICB9IGZpbmFsbHkgewogICAgICBodHRwQ2xpZW50Py5jbG9zZShmb3JjZTogdHJ1ZSk7CiAgICB9CiAgfQp9CkUAFRgBNQEyFwEmAQwrOTINKQYEAgE5IgsBMwEMIDxEPjYIBAEMKjxDPjVBCDYzCAQBDCg2BAE5HgooP0EfHzgQJgYEAgEfcGFja2FnZTp2bS9odHRwX2ZpbGVzeXN0ZW0uZGFydEpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdGFyZ2V0L2luc3RhbGwuZGFydIPPLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0udGFyZ2V0Lmluc3RhbGw7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnIHNob3cgdGFyZ2V0cywgVGFyZ2V0RmxhZ3M7CmltcG9ydCAncGFja2FnZTp2bS90YXJnZXQvZGFydF9ydW5uZXIuZGFydCcgc2hvdyBEYXJ0UnVubmVyVGFyZ2V0OwppbXBvcnQgJ3BhY2thZ2U6dm0vdGFyZ2V0L2ZsdXR0ZXIuZGFydCcgc2hvdyBGbHV0dGVyVGFyZ2V0OwppbXBvcnQgJ3BhY2thZ2U6dm0vdGFyZ2V0L2ZsdXR0ZXJfcnVubmVyLmRhcnQnIHNob3cgRmx1dHRlclJ1bm5lclRhcmdldDsKaW1wb3J0ICdwYWNrYWdlOnZtL3RhcmdldC92bS5kYXJ0JyBzaG93IFZtVGFyZ2V0OwoKYm9vbCBfaW5zdGFsbGVkID0gZmFsc2U7Cgp2b2lkIGluc3RhbGxBZGRpdGlvbmFsVGFyZ2V0cygpIHsKICBpZiAoIV9pbnN0YWxsZWQpIHsKICAgIHRhcmdldHNbImRhcnRfcnVubmVyIl0gPSAoVGFyZ2V0RmxhZ3MgZmxhZ3MpID0+IERhcnRSdW5uZXJUYXJnZXQoZmxhZ3MpOwogICAgdGFyZ2V0c1siZmx1dHRlciJdID0gKFRhcmdldEZsYWdzIGZsYWdzKSA9PiBGbHV0dGVyVGFyZ2V0KGZsYWdzKTsKICAgIHRhcmdldHNbImZsdXR0ZXJfcnVubmVyIl0gPQogICAgICAgIChUYXJnZXRGbGFncyBmbGFncykgPT4gRmx1dHRlclJ1bm5lclRhcmdldChmbGFncyk7CiAgICB0YXJnZXRzWyJ2bSJdID0gKFRhcmdldEZsYWdzIGZsYWdzKSA9PiBWbVRhcmdldChmbGFncyk7CiAgICBfaW5zdGFsbGVkID0gdHJ1ZTsKICB9Cn0KGgBOTjwBGwFHQzxJMgEZASIVTUYgOzwXBAIBHnBhY2thZ2U6dm0vdGFyZ2V0L2luc3RhbGwuZGFydFxmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL2RldmlydHVhbGl6YXRpb24uZGFydJbeLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0udHJhbnNmb3JtYXRpb25zLmNoYV9kZXZpcnR1YWxpemF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcKICAgIHNob3cgQ2xhc3NIaWVyYXJjaHksIENsYXNzSGllcmFyY2h5U3VidHlwZXMsIENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJy4uL21ldGFkYXRhL2RpcmVjdF9jYWxsLmRhcnQnOwoKLy8vIERldmlydHVhbGl6YXRpb24gb2YgbWV0aG9kIGludm9jYXRpb25zIGJhc2VkIG9uIHRoZSBjbGFzcyBoaWVyYXJjaHkKLy8vIGFuYWx5c2lzLiBBc3N1bWVzIHN0cm9uZyBtb2RlIGFuZCBjbG9zZWQgd29ybGQuCkNvbXBvbmVudCB0cmFuc2Zvcm1Db21wb25lbnQoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ29tcG9uZW50IGNvbXBvbmVudCkgewogIHZvaWQgaWdub3JlQW1iaWd1b3VzU3VwZXJ0eXBlcyhDbGFzcyBjbHMsIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikge30KICBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSA9IG5ldyBDbGFzc0hpZXJhcmNoeShjb21wb25lbnQsIGNvcmVUeXBlcywKICAgICAgb25BbWJpZ3VvdXNTdXBlcnR5cGVzOiBpZ25vcmVBbWJpZ3VvdXNTdXBlcnR5cGVzKTsKICBmaW5hbCBoaWVyYXJjaHlTdWJ0eXBlcyA9IGhpZXJhcmNoeS5jb21wdXRlU3VidHlwZXNJbmZvcm1hdGlvbigpOwogIG5ldyBDSEFEZXZpcnR1YWxpemF0aW9uKGNvcmVUeXBlcywgY29tcG9uZW50LCBoaWVyYXJjaHksIGhpZXJhcmNoeVN1YnR5cGVzKQogICAgICAudmlzaXRDb21wb25lbnQoY29tcG9uZW50KTsKICByZXR1cm4gY29tcG9uZW50Owp9CgovLy8gQmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGRldmlydHVhbGl6YXRpb24gb2YgbWV0aG9kIGludm9jYXRpb25zLgovLy8gU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHBhcnRpY3VsYXIgZGV2aXJ0dWFsaXphdGlvbiBzdHJhdGVneSBpbgovLy8gW2dldERpcmVjdENhbGxdIG1ldGhvZC4gT25jZSBkaXJlY3QgdGFyZ2V0IGlzIGRldGVybWluZWQsIHRoZSBpbnZvY2F0aW9uCi8vLyBub2RlIGlzIGFubm90YXRlZCB3aXRoIGRpcmVjdCBjYWxsIG1ldGFkYXRhLgphYnN0cmFjdCBjbGFzcyBEZXZpcnR1YWxpemF0aW9uIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjxOdWxsPiB7CiAgLy8vIFRvZ2dsZXMgdHJhY2luZyAodXNlZnVsIGZvciBkZWJ1Z2dpbmcpLgogIHN0YXRpYyBjb25zdCBfdHJhY2UgPSBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgndHJhY2UuZGV2aXJ0dWFsaXphdGlvbicpOwoKICBmaW5hbCBEaXJlY3RDYWxsTWV0YWRhdGFSZXBvc2l0b3J5IF9tZXRhZGF0YTsKICBTZXQ8TmFtZT4gX29iamVjdE1lbWJlck5hbWVzOwoKICBEZXZpcnR1YWxpemF0aW9uKAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBDb21wb25lbnQgY29tcG9uZW50LCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpCiAgICAgIDogX21ldGFkYXRhID0gbmV3IERpcmVjdENhbGxNZXRhZGF0YVJlcG9zaXRvcnkoKSB7CiAgICBfb2JqZWN0TWVtYmVyTmFtZXMgPSBuZXcgU2V0PE5hbWU+LmZyb20oaGllcmFyY2h5CiAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcnMoY29yZVR5cGVzLm9iamVjdENsYXNzKQogICAgICAgIC5tYXAoKE1lbWJlciBtKSA9PiBtLm5hbWUpKTsKICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkoX21ldGFkYXRhKTsKICB9CgogIGJvb2wgaXNNZXRob2QoTWVtYmVyIG1lbWJlcikgPT4gKG1lbWJlciBpcyBQcm9jZWR1cmUpICYmICFtZW1iZXIuaXNHZXR0ZXI7CgogIGJvb2wgaXNGaWVsZE9yR2V0dGVyKE1lbWJlciBtZW1iZXIpID0+CiAgICAgIChtZW1iZXIgaXMgRmllbGQpIHx8ICgobWVtYmVyIGlzIFByb2NlZHVyZSkgJiYgbWVtYmVyLmlzR2V0dGVyKTsKCiAgYm9vbCBpc0xlZ2FsVGFyZ2V0Rm9yTWV0aG9kSW52b2NhdGlvbihNZW1iZXIgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBmaW5hbCBGdW5jdGlvbk5vZGUgZnVuYyA9IHRhcmdldC5mdW5jdGlvbjsKCiAgICBmaW5hbCBwb3NpdGlvbmFsQXJncyA9IGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aDsKICAgIGlmICgocG9zaXRpb25hbEFyZ3MgPCBmdW5jLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHx8CiAgICAgICAgKHBvc2l0aW9uYWxBcmdzID4gZnVuYy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgZmluYWwgbmFtZXMgPSBhcmd1bWVudHMubmFtZWQubWFwKCh2KSA9PiB2Lm5hbWUpLnRvU2V0KCk7CiAgICAgIG5hbWVzLnJlbW92ZUFsbChmdW5jLm5hbWVkUGFyYW1ldGVycy5tYXAoKHYpID0+IHYubmFtZSkpOwogICAgICBpZiAobmFtZXMuaXNOb3RFbXB0eSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChhcmd1bWVudHMudHlwZXMuaXNOb3RFbXB0eSAmJgogICAgICAgIGFyZ3VtZW50cy50eXBlcy5sZW5ndGggIT0gZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgYm9vbCBoYXNFeHRyYVRhcmdldEZvck51bGwoRGlyZWN0Q2FsbE1ldGFkYXRhIGRpcmVjdENhbGwpID0+CiAgICAgIGRpcmVjdENhbGwuY2hlY2tSZWNlaXZlckZvck51bGwgJiYKICAgICAgX29iamVjdE1lbWJlck5hbWVzLmNvbnRhaW5zKGRpcmVjdENhbGwudGFyZ2V0Lm5hbWUpOwoKICBEaXJlY3RDYWxsTWV0YWRhdGEgZ2V0RGlyZWN0Q2FsbChUcmVlTm9kZSBub2RlLCBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LAogICAgICB7Ym9vbCBzZXR0ZXIgPSBmYWxzZX0pOwoKICBtYWtlRGlyZWN0Q2FsbChUcmVlTm9kZSBub2RlLCBNZW1iZXIgdGFyZ2V0LCBEaXJlY3RDYWxsTWV0YWRhdGEgZGlyZWN0Q2FsbCkgewogICAgaWYgKF90cmFjZSkgewogICAgICBwcmludCgiW2RldmlydF0gUmVzb2x2aW5nICR7dGFyZ2V0fSB0byAke2RpcmVjdENhbGwudGFyZ2V0fSIKICAgICAgICAgICIgYXQgJHtub2RlLmxvY2F0aW9ufSIpOwogICAgfQogICAgX21ldGFkYXRhLm1hcHBpbmdbbm9kZV0gPSBkaXJlY3RDYWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgaWYgKF90cmFjZSkgewogICAgICBwcmludCgiW2RldmlydF0gUHJvY2Vzc2luZyBsaWJyYXJ5ICR7bm9kZS5uYW1lfSIpOwogICAgfQogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgc3VwZXIudmlzaXRNZXRob2RJbnZvY2F0aW9uKG5vZGUpOwoKICAgIGZpbmFsIE1lbWJlciB0YXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiAhaXNNZXRob2QodGFyZ2V0KSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgZmluYWwgRGlyZWN0Q2FsbE1ldGFkYXRhIGRpcmVjdENhbGwgPSBnZXREaXJlY3RDYWxsKG5vZGUsIHRhcmdldCk7CgogICAgLy8gVE9ETyhhbGV4bWFya292KTogQ29udmVydCBfaXNMZWdhbFRhcmdldEZvck1ldGhvZEludm9jYXRpb24oKQogICAgLy8gY2hlY2sgaW50byBhbiBhc3NlcnRpb24gb25jZSBmcm9udC1lbmQgaW1wbGVtZW50cyBhbGwgb3ZlcnJpZGUgY2hlY2tzLgogICAgaWYgKChkaXJlY3RDYWxsICE9IG51bGwpICYmCiAgICAgICAgaXNNZXRob2QoZGlyZWN0Q2FsbC50YXJnZXQpICYmCiAgICAgICAgaXNMZWdhbFRhcmdldEZvck1ldGhvZEludm9jYXRpb24oZGlyZWN0Q2FsbC50YXJnZXQsIG5vZGUuYXJndW1lbnRzKSAmJgogICAgICAgICFoYXNFeHRyYVRhcmdldEZvck51bGwoZGlyZWN0Q2FsbCkpIHsKICAgICAgbWFrZURpcmVjdENhbGwobm9kZSwgdGFyZ2V0LCBkaXJlY3RDYWxsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgc3VwZXIudmlzaXRQcm9wZXJ0eUdldChub2RlKTsKCiAgICBmaW5hbCBNZW1iZXIgdGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgIWlzRmllbGRPckdldHRlcih0YXJnZXQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBEaXJlY3RDYWxsTWV0YWRhdGEgZGlyZWN0Q2FsbCA9IGdldERpcmVjdENhbGwobm9kZSwgdGFyZ2V0KTsKCiAgICBpZiAoKGRpcmVjdENhbGwgIT0gbnVsbCkgJiYKICAgICAgICBpc0ZpZWxkT3JHZXR0ZXIoZGlyZWN0Q2FsbC50YXJnZXQpICYmCiAgICAgICAgIWhhc0V4dHJhVGFyZ2V0Rm9yTnVsbChkaXJlY3RDYWxsKSkgewogICAgICBtYWtlRGlyZWN0Q2FsbChub2RlLCB0YXJnZXQsIGRpcmVjdENhbGwpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBzdXBlci52aXNpdFByb3BlcnR5U2V0KG5vZGUpOwoKICAgIGZpbmFsIE1lbWJlciB0YXJnZXQgPSBub2RlLmludGVyZmFjZVRhcmdldDsKICAgIGZpbmFsIERpcmVjdENhbGxNZXRhZGF0YSBkaXJlY3RDYWxsID0KICAgICAgICBnZXREaXJlY3RDYWxsKG5vZGUsIHRhcmdldCwgc2V0dGVyOiB0cnVlKTsKICAgIGlmIChkaXJlY3RDYWxsICE9IG51bGwpIHsKICAgICAgbWFrZURpcmVjdENhbGwobm9kZSwgdGFyZ2V0LCBkaXJlY3RDYWxsKTsKICAgIH0KICB9Cn0KCi8vLyBEZXZpcnR1YWxpemF0aW9uIGJhc2VkIG9uIHRoZSBjbG9zZWQtd29ybGQgY2xhc3MgaGllcmFyY2h5IGFuYWx5c2lzLgpjbGFzcyBDSEFEZXZpcnR1YWxpemF0aW9uIGV4dGVuZHMgRGV2aXJ0dWFsaXphdGlvbiB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlcyBfaGllcmFyY2h5U3VidHlwZTsKCiAgQ0hBRGV2aXJ0dWFsaXphdGlvbihDb3JlVHlwZXMgY29yZVR5cGVzLCBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgdGhpcy5faGllcmFyY2h5U3VidHlwZSkKICAgICAgOiBzdXBlcihjb3JlVHlwZXMsIGNvbXBvbmVudCwgaGllcmFyY2h5KTsKCiAgQG92ZXJyaWRlCiAgRGlyZWN0Q2FsbE1ldGFkYXRhIGdldERpcmVjdENhbGwoVHJlZU5vZGUgbm9kZSwgTWVtYmVyIGludGVyZmFjZVRhcmdldCwKICAgICAge2Jvb2wgc2V0dGVyID0gZmFsc2V9KSB7CiAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBNZW1iZXIgc2luZ2xlVGFyZ2V0ID0gX2hpZXJhcmNoeVN1YnR5cGUKICAgICAgICAuZ2V0U2luZ2xlVGFyZ2V0Rm9ySW50ZXJmYWNlSW52b2NhdGlvbihpbnRlcmZhY2VUYXJnZXQsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChzaW5nbGVUYXJnZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBuZXcgRGlyZWN0Q2FsbE1ldGFkYXRhKHNpbmdsZVRhcmdldCwgdHJ1ZSk7CiAgfQp9CoCuAE5OPAExASI4LUwBJwFINElJUTlETiIUAgFISE0xQS5OATAgARRKOTY0JTAEAU0BKUcBTi8BODo/FAYBJkBAHhYIBgEmQBQGAREEAT8pOwFKHgFQEkMjBioEAQwfEjkGHgQBDDEnATAvDgYBRwFFTiAnTy4wBgQBDCciATA2DgYBRwEgLi4wBgQBDCciATAqMx4wBgQCAUk1MgFAQzABDEofIxMGLFEgEwY3BAIBMHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL2RldmlydHVhbGl6YXRpb24uZGFydF9maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL21peGluX2RlZHVwbGljYXRpb24uZGFydJ1DLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0udHJhbnNmb3JtYXRpb25zLm1peGluX2RlZHVwbGljYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCi8vLyBEZS1kdXBsaWNhdGlvbiBvZiBpZGVudGljYWwgbWl4aW4gYXBwbGljYXRpb25zLgp2b2lkIHRyYW5zZm9ybUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgZmluYWwgZGVkdXBsaWNhdGVNaXhpbnMgPSBuZXcgRGVkdXBsaWNhdGVNaXhpbnNUcmFuc2Zvcm1lcigpOwogIGZpbmFsIGludGVyZmFjZVRhcmdldFJlc29sdmVyID0gSW50ZXJmYWNlVGFyZ2V0UmVzb2x2ZXIoZGVkdXBsaWNhdGVNaXhpbnMpOwoKICAvLyBEZWR1cGxpY2F0ZSBtaXhpbnMgYW5kIHJlLXJlc29sdmUgc3VwZXIgaW5pdGlhbGl6ZXJzLgogIC8vICh0aGlzIGlzIGEgc2hhbGxvdyB0cmFuc2Zvcm1hdGlvbikKICBjb21wb25lbnQubGlicmFyaWVzLmZvckVhY2goZGVkdXBsaWNhdGVNaXhpbnMudmlzaXRMaWJyYXJ5KTsKCiAgLy8gRG8gYSBkZWVwIHRyYW5zZm9ybWF0aW9uIHRvIHJlLXJlc29sdmUgYWxsIGludGVyZmFjZSB0YXJnZXRzIHRoYXQgcG9pbnQgdG8KICAvLyBtZW1iZXJzIG9mIHJlbW92ZWQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3Nlcy4KCiAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgaWZmIHRoZSBjb21wb25lbnQgd2FzIGFzc2VtYmxlZCBmcm9tIGluZGl2aWR1YWwgbW9kdWxhcgogIC8vIGtlcm5lbCBjb21waWxhdGlvbnM6CiAgLy8KICAvLyAgICogaWYgdGhlIENGRSByZWFkcyBpbiB0aGUgZW50aXJlIHByb2dyYW0gYXMgc291cmNlLCBpbnRlcmZhY2UgdGFyZ2V0cwogIC8vICAgICB3aWxsIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBtaXhpbiBjbGFzcwogIC8vCiAgLy8gICAqIGlmIHRoZSBDRkUgcmVhZHMgaW4gZGVwZW5kZW5jaWVzIGFzIGtlcm5lbCwgaW50ZXJmYWNlIHRhcmdldHMgd2lsbAogIC8vICAgICBwb2ludCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzc2VzLgogIC8vCiAgLy8gVE9ETyhkYXJ0YnVnLmNvbS8zOTM3NSk6IFJlbW92ZSB0aGlzIGV4dHJhIE8oTikgcGFzcyBvdmVyIHRoZSBBU1QgaWYgdGhlCiAgLy8gQ0ZFIGRlY2lkZXMgdG8gY29uc2lzdGVudGx5IGxldCB0aGUgaW50ZXJmYWNlIHRhcmdldCBwb2ludCB0byB0aGUgbWl4aW4KICAvLyBjbGFzcyAoaW5zdGVhZCBvZiBtaXhpbiBhcHBsaWNhdGlvbikuCiAgY29tcG9uZW50LmxpYnJhcmllcy5mb3JFYWNoKGludGVyZmFjZVRhcmdldFJlc29sdmVyLnZpc2l0TGlicmFyeSk7Cn0KCmNsYXNzIF9EZWR1cGxpY2F0ZU1peGluS2V5IHsKICBmaW5hbCBDbGFzcyBfY2xhc3M7CiAgX0RlZHVwbGljYXRlTWl4aW5LZXkodGhpcy5fY2xhc3MpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKG90aGVyIGlzIF9EZWR1cGxpY2F0ZU1peGluS2V5KSB7CiAgICAgIGZpbmFsIHRoaXNDbGFzcyA9IF9jbGFzczsKICAgICAgZmluYWwgb3RoZXJDbGFzcyA9IG90aGVyLl9jbGFzczsKICAgICAgaWYgKGlkZW50aWNhbCh0aGlzQ2xhc3MsIG90aGVyQ2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgLy8gRG8gbm90IGRlZHVwbGljYXRlIHBhcmFtZXRlcml6ZWQgbWl4aW4gYXBwbGljYXRpb25zLgogICAgICBpZiAodGhpc0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkgfHwKICAgICAgICAgIG90aGVyQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICAvLyBEZWR1cGxpY2F0ZSBtaXhpbiBhcHBsaWNhdGlvbnMgd2l0aCBtYXRjaGluZyBzdXBlcnR5cGUsIG1peGVkLWluIHR5cGUKICAgICAgLy8gYW5kIGltcGxlbWVudGVkIGludGVyZmFjZXMuCiAgICAgIHJldHVybiB0aGlzQ2xhc3Muc3VwZXJ0eXBlID09IG90aGVyQ2xhc3Muc3VwZXJ0eXBlICYmCiAgICAgICAgICB0aGlzQ2xhc3MubWl4ZWRJblR5cGUgPT0gb3RoZXJDbGFzcy5taXhlZEluVHlwZSAmJgogICAgICAgICAgbGlzdEVxdWFscyh0aGlzQ2xhc3MuaW1wbGVtZW50ZWRUeXBlcywgb3RoZXJDbGFzcy5pbXBsZW1lbnRlZFR5cGVzKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaWYgKF9jbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHJldHVybiBfY2xhc3MuaGFzaENvZGU7CiAgICB9CiAgICBpbnQgaGFzaCA9IDMxOwogICAgaGFzaCA9IDB4M2ZmZmZmZmYgJiAoaGFzaCAqIDMxICsgX2NsYXNzLnN1cGVydHlwZS5oYXNoQ29kZSk7CiAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBfY2xhc3MubWl4ZWRJblR5cGUuaGFzaENvZGUpOwogICAgZm9yICh2YXIgaSBpbiBfY2xhc3MuaW1wbGVtZW50ZWRUeXBlcykgewogICAgICBoYXNoID0gMHgzZmZmZmZmZiAmIChoYXNoICogMzEgKyBpLmhhc2hDb2RlKTsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KfQoKY2xhc3MgRGVkdXBsaWNhdGVNaXhpbnNUcmFuc2Zvcm1lciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBfY2Fub25pY2FsTWl4aW5zID0gbmV3IE1hcDxfRGVkdXBsaWNhdGVNaXhpbktleSwgQ2xhc3M+KCk7CiAgZmluYWwgX2R1cGxpY2F0ZWRNaXhpbnMgPSBuZXcgTWFwPENsYXNzLCBDbGFzcz4oKTsKCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgdHJhbnNmb3JtTGlzdChub2RlLmNsYXNzZXMsIHRoaXMsIG5vZGUpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdENsYXNzKENsYXNzIGMpIHsKICAgIGlmIChfZHVwbGljYXRlZE1peGlucy5jb250YWluc0tleShjKSkgewogICAgICByZXR1cm4gbnVsbDsgLy8gQ2xhc3Mgd2FzIGRlLWR1cGxpY2F0ZWQgYWxyZWFkeSwganVzdCByZW1vdmUgaXQuCiAgICB9CgogICAgaWYgKGMuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgYy5zdXBlcnR5cGUgPSBfdHJhbnNmb3JtU3VwZXJ0eXBlKGMuc3VwZXJ0eXBlLCBjLCB0cnVlKTsKICAgIH0KICAgIGlmIChjLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgdGhyb3cgJ0FsbCBtaXhpbnMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGFscmVhZHkuJzsKICAgIH0KICAgIHRyYW5zZm9ybVN1cGVydHlwZUxpc3QoYy5pbXBsZW1lbnRlZFR5cGVzLCB0aGlzKTsKCiAgICBpZiAoIWMuaXNBbm9ueW1vdXNNaXhpbikgewogICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBDbGFzcyBjYW5vbmljYWwgPQogICAgICAgIF9jYW5vbmljYWxNaXhpbnMucHV0SWZBYnNlbnQobmV3IF9EZWR1cGxpY2F0ZU1peGluS2V5KGMpLCAoKSA9PiBjKTsKICAgIGFzc2VydChjYW5vbmljYWwgIT0gbnVsbCk7CgogICAgaWYgKGNhbm9uaWNhbCAhPSBjKSB7CiAgICAgIGMuY2Fub25pY2FsTmFtZT8udW5iaW5kKCk7CiAgICAgIF9kdXBsaWNhdGVkTWl4aW5zW2NdID0gY2Fub25pY2FsOwogICAgICByZXR1cm4gbnVsbDsgLy8gUmVtb3ZlIGNsYXNzLgogICAgfQoKICAgIHJldHVybiBjOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSB7CiAgICByZXR1cm4gX3RyYW5zZm9ybVN1cGVydHlwZShub2RlLCBudWxsLCBmYWxzZSk7CiAgfQoKICBTdXBlcnR5cGUgX3RyYW5zZm9ybVN1cGVydHlwZSgKICAgICAgU3VwZXJ0eXBlIHN1cGVydHlwZSwgQ2xhc3MgY2xzLCBib29sIGlzU3VwZXJjbGFzcykgewogICAgQ2xhc3Mgb2xkU3VwZXIgPSBzdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgQ2xhc3MgbmV3U3VwZXIgPSB2aXNpdENsYXNzKG9sZFN1cGVyKTsKICAgIGlmIChuZXdTdXBlciA9PSBudWxsKSB7CiAgICAgIENsYXNzIGNhbm9uaWNhbFN1cGVyID0gX2R1cGxpY2F0ZWRNaXhpbnNbb2xkU3VwZXJdOwogICAgICBhc3NlcnQoY2Fub25pY2FsU3VwZXIgIT0gbnVsbCk7CiAgICAgIHN1cGVydHlwZSA9IG5ldyBTdXBlcnR5cGUoY2Fub25pY2FsU3VwZXIsIHN1cGVydHlwZS50eXBlQXJndW1lbnRzKTsKICAgICAgaWYgKGlzU3VwZXJjbGFzcykgewogICAgICAgIF9jb3JyZWN0Rm9yd2FyZGluZ0NvbnN0cnVjdG9ycyhjbHMsIG9sZFN1cGVyLCBjYW5vbmljYWxTdXBlcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlcnR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgPT4KICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgbm9kZSAke25vZGUucnVudGltZVR5cGV9OiAkbm9kZSc7Cn0KCi8vLyBSZXdyaXRlcyBpbnRlcmZhY2UgdGFyZ2V0cyB0byBwb2ludCB0byB0aGUgZGVkdXBsaWNhdGVkIG1peGluIGFwcGxpY2F0aW9uCi8vLyBjbGFzcy4KY2xhc3MgSW50ZXJmYWNlVGFyZ2V0UmVzb2x2ZXIgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPFRyZWVOb2RlPiB7CiAgZmluYWwgRGVkdXBsaWNhdGVNaXhpbnNUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKCiAgSW50ZXJmYWNlVGFyZ2V0UmVzb2x2ZXIodGhpcy50cmFuc2Zvcm1lcik7CgogIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQgPSBfcmVzb2x2ZU5ld0ludGVyZmFjZVRhcmdldChub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQgPSBfcmVzb2x2ZU5ld0ludGVyZmFjZVRhcmdldChub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRQcm9wZXJ0eVNldChub2RlKTsKICB9CgogIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gX3Jlc29sdmVOZXdJbnRlcmZhY2VUYXJnZXQobm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0TWV0aG9kSW52b2NhdGlvbihub2RlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gX3Jlc29sdmVOZXdJbnRlcmZhY2VUYXJnZXQobm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U3VwZXJQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gX3Jlc29sdmVOZXdJbnRlcmZhY2VUYXJnZXQobm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgcmV0dXJuIHN1cGVyLnZpc2l0U3VwZXJQcm9wZXJ0eVNldChub2RlKTsKICB9CgogIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBub2RlLmludGVyZmFjZVRhcmdldCA9IF9yZXNvbHZlTmV3SW50ZXJmYWNlVGFyZ2V0KG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgIHJldHVybiBzdXBlci52aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihub2RlKTsKICB9CgogIE1lbWJlciBfcmVzb2x2ZU5ld0ludGVyZmFjZVRhcmdldChNZW1iZXIgbSkgewogICAgZmluYWwgQ2xhc3MgYyA9IG0/LmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGMgIT0gbnVsbCAmJiBjLmlzQW5vbnltb3VzTWl4aW4pIHsKICAgICAgZmluYWwgQ2xhc3MgcmVwbGFjZW1lbnQgPSB0cmFuc2Zvcm1lci5fZHVwbGljYXRlZE1peGluc1tjXTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICAvLyBUaGUgY2xhc3MgZ290IHJlbW92ZWQsIHNvIHdlIG5lZWQgdG8gcmUtcmVzb2x2ZSB0aGUgaW50ZXJmYWNlIHRhcmdldC4KICAgICAgICByZXR1cm4gX2ZpbmRNZW1iZXIocmVwbGFjZW1lbnQsIG0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbTsKICB9CgogIE1lbWJlciBfZmluZE1lbWJlcihDbGFzcyBrbGFzcywgTWVtYmVyIG0pIHsKICAgIGlmIChtIGlzIEZpZWxkKSB7CiAgICAgIHJldHVybiBrbGFzcy5tZW1iZXJzLndoZXJlKChvdGhlcikgPT4gb3RoZXIubmFtZSA9PSBtLm5hbWUpLnNpbmdsZTsKICAgIH0gZWxzZSBpZiAobSBpcyBQcm9jZWR1cmUpIHsKICAgICAgcmV0dXJuIGtsYXNzLnByb2NlZHVyZXMKICAgICAgICAgIC53aGVyZSgob3RoZXIpID0+IG90aGVyLmtpbmQgPT0gbS5raW5kICYmIG90aGVyLm5hbWUgPT0gbS5uYW1lKQogICAgICAgICAgLnNpbmdsZTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdIaXQgdW5leHBlY3RlZCBpbnRlcmZhY2UgdGFyZ2V0IHdoaWNoIGlzIG5vdCBhIEZpZWxkL1Byb2NlZHVyZSc7CiAgICB9CiAgfQp9CgovLy8gQ29ycmVjdHMgZm9yd2FyZGluZyBjb25zdHJ1Y3RvcnMgaW5zZXJ0ZWQgYnkgbWl4aW4gcmVzb2x1dGlvbiBhZnRlcgovLy8gcmVwbGFjaW5nIHN1cGVyY2xhc3MuCnZvaWQgX2NvcnJlY3RGb3J3YXJkaW5nQ29uc3RydWN0b3JzKENsYXNzIGMsIENsYXNzIG9sZFN1cGVyLCBDbGFzcyBuZXdTdXBlcikgewogIGZvciAodmFyIGNvbnN0cnVjdG9yIGluIGMuY29uc3RydWN0b3JzKSB7CiAgICBmb3IgKHZhciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKICAgICAgaWYgKChpbml0aWFsaXplciBpcyBTdXBlckluaXRpYWxpemVyKSAmJgogICAgICAgICAgaW5pdGlhbGl6ZXIudGFyZ2V0LmVuY2xvc2luZ0NsYXNzID09IG9sZFN1cGVyKSB7CiAgICAgICAgQ29uc3RydWN0b3IgcmVwbGFjZW1lbnQgPSBudWxsOwogICAgICAgIGZvciAodmFyIGMgaW4gbmV3U3VwZXIuY29uc3RydWN0b3JzKSB7CiAgICAgICAgICBpZiAoYy5uYW1lID09IGluaXRpYWxpemVyLnRhcmdldC5uYW1lKSB7CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gYzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgYSByZXBsYWNlbWVudCBmb3IgJGMgaW4gJG5ld1N1cGVyJzsKICAgICAgICB9CiAgICAgICAgaW5pdGlhbGl6ZXIudGFyZ2V0ID0gcmVwbGFjZW1lbnQ7CiAgICAgIH0KICAgIH0KICB9Cn0KgOkATk48ATABIgE0L0BOATsoPwFQMwFPGgVNMAVMQgVOTStFAgEdFiUBDCMpICcuFQg+MTIWCE8lPD1PBhIEAQwVLB4GE0FDLTQGEQQCATlDNQEMKC0RBAEMISxHBgEfPwYhOQY2AR8QBgEWTB8BGiEoJAYBDgQBDC0zBAEhOyorHDomShpHCAYWBAEMLToCAU4LQzIBLQEjHhEEASdNKQQBJ00pBAExTS4EATFNLgQBMU0uBAE7TTMEATAnK0IhUSwIBg4EAS4WSiEeShMNTgYEAgFIGk8sOC87KC8zHRMMCiNECioIBgQCATNwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9taXhpbl9kZWR1cGxpY2F0aW9uLmRhcnRsZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9ub19keW5hbWljX2ludm9jYXRpb25zX2Fubm90YXRvci5kYXJ0nnsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMubm9fZHluYW1pY19pbnZvY2F0aW9uc19hbm5vdGF0b3I7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vbWV0YWRhdGEvcHJvY2VkdXJlX2F0dHJpYnV0ZXMuZGFydCc7CgovLy8gQXNzdW1lcyBzdHJvbmcgbW9kZSBhbmQgY2xvc2VkIHdvcmxkLiBJZiBhIHByb2NlZHVyZSBjYW4gbm90IGJlIHJpY2hlZAovLy8gdmlhIGR5bmFtaWMgaW52b2NhdGlvbiBmcm9tIGFueXdoZXJlIHRoZW4gYW5ub3RhdGVzIGl0IHdpdGggYXBwcm9wcmlhdGUKLy8vIFtQcm9jZWR1cmVBdHRyaWJ1dGVNZXRhZGF0YV0gYW5ub3RhdGlvbi4KQ29tcG9uZW50IHRyYW5zZm9ybUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgbmV3IE5vRHluYW1pY1VzZXNBbm5vdGF0b3IoY29tcG9uZW50KS52aXNpdENvbXBvbmVudChjb21wb25lbnQpOwogIHJldHVybiBjb21wb25lbnQ7Cn0KCmVudW0gQWN0aW9uIHsgZ2V0LCBzZXQsIGludm9rZSB9CgpjbGFzcyBTZWxlY3RvciB7CiAgZmluYWwgQWN0aW9uIGFjdGlvbjsKICBmaW5hbCBOYW1lIHRhcmdldDsKCiAgU2VsZWN0b3IodGhpcy5hY3Rpb24sIHRoaXMudGFyZ2V0KTsKCiAgU2VsZWN0b3IuZG9JbnZva2UoTmFtZSB0YXJnZXQpIDogdGhpcyhBY3Rpb24uaW52b2tlLCB0YXJnZXQpOwogIFNlbGVjdG9yLmRvR2V0KE5hbWUgdGFyZ2V0KSA6IHRoaXMoQWN0aW9uLmdldCwgdGFyZ2V0KTsKICBTZWxlY3Rvci5kb1NldChOYW1lIHRhcmdldCkgOiB0aGlzKEFjdGlvbi5zZXQsIHRhcmdldCk7CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiBvdGhlciBpcyBTZWxlY3RvciAmJgogICAgICAgIG90aGVyLmFjdGlvbiA9PSB0aGlzLmFjdGlvbiAmJgogICAgICAgIG90aGVyLnRhcmdldCA9PSB0aGlzLnRhcmdldDsKICB9CgogIGludCBnZXQgaGFzaENvZGUgPT4gKGFjdGlvbi5pbmRleCAqIDMxKSBeIHRhcmdldC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgICAgY2FzZSBBY3Rpb24uZ2V0OgogICAgICAgIHJldHVybiAnZ2V0OiR7dGFyZ2V0fSc7CiAgICAgIGNhc2UgQWN0aW9uLnNldDoKICAgICAgICByZXR1cm4gJ3NldDoke3RhcmdldH0nOwogICAgICBjYXNlIEFjdGlvbi5pbnZva2U6CiAgICAgICAgcmV0dXJuICcke3RhcmdldH0nOwogICAgfQogICAgcmV0dXJuICc/JzsKICB9Cn0KCi8vIFRPRE8oa3VzdGVybWFubik6IFRyeSB0byBleHRlbmQgdGhlIGlkZWEgb2YgdHJhY2tpbmcgdXNlcyBiYXNlZCBvbiB0aGUgJ3RoaXMnCi8vIGhpZXJhcmNoeS4KY2xhc3MgTm9EeW5hbWljVXNlc0Fubm90YXRvciB7CiAgZmluYWwgRHluYW1pY1NlbGVjdG9yc0NvbGxlY3RvciBfc2VsZWN0b3JzOwogIGZpbmFsIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YVJlcG9zaXRvcnkgX21ldGFkYXRhOwoKICBOb0R5bmFtaWNVc2VzQW5ub3RhdG9yKENvbXBvbmVudCBjb21wb25lbnQpCiAgICAgIDogX3NlbGVjdG9ycyA9IER5bmFtaWNTZWxlY3RvcnNDb2xsZWN0b3IuY29sbGVjdChjb21wb25lbnQpLAogICAgICAgIF9tZXRhZGF0YSA9IG5ldyBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5KCkgewogICAgY29tcG9uZW50LmFkZE1ldGFkYXRhUmVwb3NpdG9yeShfbWV0YWRhdGEpOwogIH0KCiAgdmlzaXRDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgZm9yICh2YXIgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIGZvciAodmFyIGtsYXNzIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIHZpc2l0Q2xhc3Moa2xhc3MpOwogICAgICB9CiAgICB9CiAgfQoKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGZvciAodmFyIG1lbWJlciBpbiBub2RlLm1lbWJlcnMpIHsKICAgICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICB2aXNpdFByb2NlZHVyZShtZW1iZXIpOwogICAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICAgIHZpc2l0RmllbGQobWVtYmVyKTsKICAgICAgfQogICAgfQogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBpZiAobm9kZS5pc1N0YXRpYyB8fCBub2RlLm5hbWUubmFtZSA9PSAnY2FsbCcpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmRvU2V0KG5vZGUubmFtZSk7CiAgICBpZiAoX3NlbGVjdG9ycy5keW5hbWljU2VsZWN0b3JzLmNvbnRhaW5zKHNlbGVjdG9yKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhIG1ldGFkYXRhOwogICAgaWYgKCFfc2VsZWN0b3JzLm5vblRoaXNTZWxlY3RvcnMuY29udGFpbnMoc2VsZWN0b3IpKSB7CiAgICAgIG1ldGFkYXRhID0gY29uc3QgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhKAogICAgICAgICAgbWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTogZmFsc2UsCiAgICAgICAgICBnZXR0ZXJDYWxsZWREeW5hbWljYWxseTogZmFsc2UsCiAgICAgICAgICBoYXNOb25UaGlzVXNlczogdHJ1ZSwKICAgICAgICAgIGhhc1RlYXJPZmZVc2VzOiBmYWxzZSk7CiAgICB9IGVsc2UgewogICAgICBtZXRhZGF0YSA9IGNvbnN0IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YS5ub0R5bmFtaWNVc2VzKCk7CiAgICB9CiAgICBfbWV0YWRhdGEubWFwcGluZ1tub2RlXSA9IG1ldGFkYXRhOwogIH0KCiAgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpIHsKICAgIGlmIChub2RlLmlzU3RhdGljIHx8IG5vZGUubmFtZS5uYW1lID09ICdjYWxsJykgewogICAgICByZXR1cm47CiAgICB9CgogICAgU2VsZWN0b3Igc2VsZWN0b3I7CiAgICBpZiAobm9kZS5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmRvSW52b2tlKG5vZGUubmFtZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3Rvci5kb1NldChub2RlLm5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChfc2VsZWN0b3JzLmR5bmFtaWNTZWxlY3RvcnMuY29udGFpbnMoc2VsZWN0b3IpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBib29sIGhhc05vblRoaXNVc2VzID0gX3NlbGVjdG9ycy5ub25UaGlzU2VsZWN0b3JzLmNvbnRhaW5zKHNlbGVjdG9yKTsKICAgIGZpbmFsIGJvb2wgaGFzVGVhck9mZlVzZXMgPSBfc2VsZWN0b3JzLnRlYXJPZmZTZWxlY3RvcnMuY29udGFpbnMoc2VsZWN0b3IpOwogICAgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhIG1ldGFkYXRhOwogICAgaWYgKCFoYXNOb25UaGlzVXNlcyAmJiAhaGFzVGVhck9mZlVzZXMpIHsKICAgICAgbWV0YWRhdGEgPSBjb25zdCBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEoCiAgICAgICAgICBtZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OiBmYWxzZSwKICAgICAgICAgIGdldHRlckNhbGxlZER5bmFtaWNhbGx5OiBmYWxzZSwKICAgICAgICAgIGhhc05vblRoaXNVc2VzOiBmYWxzZSwKICAgICAgICAgIGhhc1RlYXJPZmZVc2VzOiBmYWxzZSk7CiAgICB9IGVsc2UgaWYgKCFoYXNOb25UaGlzVXNlcyAmJiBoYXNUZWFyT2ZmVXNlcykgewogICAgICBtZXRhZGF0YSA9IGNvbnN0IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSgKICAgICAgICAgIG1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6IGZhbHNlLAogICAgICAgICAgZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6IGZhbHNlLAogICAgICAgICAgaGFzTm9uVGhpc1VzZXM6IGZhbHNlLAogICAgICAgICAgaGFzVGVhck9mZlVzZXM6IHRydWUpOwogICAgfSBlbHNlIGlmIChoYXNOb25UaGlzVXNlcyAmJiAhaGFzVGVhck9mZlVzZXMpIHsKICAgICAgbWV0YWRhdGEgPSBjb25zdCBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEoCiAgICAgICAgICBtZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OiBmYWxzZSwKICAgICAgICAgIGdldHRlckNhbGxlZER5bmFtaWNhbGx5OiBmYWxzZSwKICAgICAgICAgIGhhc05vblRoaXNVc2VzOiB0cnVlLAogICAgICAgICAgaGFzVGVhck9mZlVzZXM6IGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIG1ldGFkYXRhID0gY29uc3QgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhLm5vRHluYW1pY1VzZXMoKTsKICAgIH0KICAgIF9tZXRhZGF0YS5tYXBwaW5nW25vZGVdID0gbWV0YWRhdGE7CiAgfQp9CgpjbGFzcyBEeW5hbWljU2VsZWN0b3JzQ29sbGVjdG9yIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjxOdWxsPiB7CiAgZmluYWwgU2V0PFNlbGVjdG9yPiBkeW5hbWljU2VsZWN0b3JzID0gbmV3IFNldDxTZWxlY3Rvcj4oKTsKICBmaW5hbCBTZXQ8U2VsZWN0b3I+IG5vblRoaXNTZWxlY3RvcnMgPSBuZXcgU2V0PFNlbGVjdG9yPigpOwogIGZpbmFsIFNldDxTZWxlY3Rvcj4gdGVhck9mZlNlbGVjdG9ycyA9IG5ldyBTZXQ8U2VsZWN0b3I+KCk7CgogIHN0YXRpYyBEeW5hbWljU2VsZWN0b3JzQ29sbGVjdG9yIGNvbGxlY3QoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgZmluYWwgdiA9IG5ldyBEeW5hbWljU2VsZWN0b3JzQ29sbGVjdG9yKCk7CiAgICB2LnZpc2l0Q29tcG9uZW50KGNvbXBvbmVudCk7CgogICAgLy8gV2Ugb25seSBwb3B1bGF0ZSBbbm9uVGhpc1NlbGVjdG9yc10gYW5kIFt0ZWFyT2ZmU2VsZWN0b3JzXSBpbnNpZGUgdGhlCiAgICAvLyBub24tZHluYW1pYyBjYXNlIChmb3IgZWZmaWNpZW5jeSByZWFzb25zKSB3aGlsZSB2aXNpdGluZyB0aGUgW0NvbXBvbmVudF0uCiAgICAvLwogICAgLy8gQWZ0ZXIgdGhlIHJlY3Vyc2l2ZSB2aXNpdCBvZiBbQ29tcG9uZW50XSB3ZSBjb21wbGV0ZSB0aGUgc2V0cyBoZXJlLgogICAgZm9yIChmaW5hbCBTZWxlY3RvciBzZWxlY3RvciBpbiB2LmR5bmFtaWNTZWxlY3RvcnMpIHsKICAgICAgLy8gQWxsIGR5bmFtaWMgZ2V0dGVycyBjYW4gYmUgdGVhcm9mZnMuCiAgICAgIGlmIChzZWxlY3Rvci5hY3Rpb24gPT0gQWN0aW9uLmdldCkgewogICAgICAgIHYudGVhck9mZlNlbGVjdG9ycy5hZGQobmV3IFNlbGVjdG9yLmRvSW52b2tlKHNlbGVjdG9yLnRhcmdldCkpOwogICAgICB9CgogICAgICAvLyBBbGwgZHluYW1pYyBzZWxlY3RvcnMgYXJlIG5vbi10aGlzIHNlbGVjdG9ycy4KICAgICAgdi5ub25UaGlzU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7CiAgICB9CgogICAgcmV0dXJuIHY7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBzdXBlci52aXNpdE1ldGhvZEludm9jYXRpb24obm9kZSk7CgogICAgU2VsZWN0b3Igc2VsZWN0b3I7CiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgPT0gbnVsbCkgewogICAgICBkeW5hbWljU2VsZWN0b3JzLmFkZChuZXcgU2VsZWN0b3IuZG9JbnZva2Uobm9kZS5uYW1lKSk7CiAgICB9IGVsc2UgewogICAgICBpZiAobm9kZS5yZWNlaXZlciBpcyEgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgICBub25UaGlzU2VsZWN0b3JzLmFkZChzZWxlY3RvciA/Pz0gbmV3IFNlbGVjdG9yLmRvSW52b2tlKG5vZGUubmFtZSkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBzdXBlci52aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24obm9kZSk7CgogICAgU2VsZWN0b3Igc2VsZWN0b3I7CiAgICBpZiAobm9kZS5yZWNlaXZlciBpcyEgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgbm9uVGhpc1NlbGVjdG9ycwogICAgICAgICAgLmFkZChzZWxlY3RvciA/Pz0gbmV3IFNlbGVjdG9yLmRvSW52b2tlKG5vZGUudGFyZ2V0Lm5hbWUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgc3VwZXIudmlzaXRQcm9wZXJ0eUdldChub2RlKTsKCiAgICBTZWxlY3RvciBzZWxlY3RvcjsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIGR5bmFtaWNTZWxlY3RvcnMuYWRkKHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmRvR2V0KG5vZGUubmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgICAgbm9uVGhpc1NlbGVjdG9ycy5hZGQoc2VsZWN0b3IgPz89IG5ldyBTZWxlY3Rvci5kb0dldChub2RlLm5hbWUpKTsKICAgICAgfQoKICAgICAgZmluYWwgdGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgICAgdGVhck9mZlNlbGVjdG9ycy5hZGQobmV3IFNlbGVjdG9yLmRvSW52b2tlKG5vZGUubmFtZSkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHN1cGVyLnZpc2l0RGlyZWN0UHJvcGVydHlHZXQobm9kZSk7CgogICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgIG5vblRoaXNTZWxlY3RvcnMuYWRkKG5ldyBTZWxlY3Rvci5kb0dldChub2RlLnRhcmdldC5uYW1lKSk7CiAgICB9CgogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICB0ZWFyT2ZmU2VsZWN0b3JzLmFkZChuZXcgU2VsZWN0b3IuZG9JbnZva2UodGFyZ2V0Lm5hbWUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgc3VwZXIudmlzaXRQcm9wZXJ0eVNldChub2RlKTsKCiAgICBTZWxlY3RvciBzZWxlY3RvcjsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIGR5bmFtaWNTZWxlY3RvcnMuYWRkKHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yLmRvU2V0KG5vZGUubmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgICAgbm9uVGhpc1NlbGVjdG9ycy5hZGQoc2VsZWN0b3IgPz89IG5ldyBTZWxlY3Rvci5kb1NldChub2RlLm5hbWUpKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBzdXBlci52aXNpdERpcmVjdFByb3BlcnR5U2V0KG5vZGUpOwoKICAgIFNlbGVjdG9yIHNlbGVjdG9yOwogICAgaWYgKG5vZGUucmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgIG5vblRoaXNTZWxlY3RvcnMuYWRkKHNlbGVjdG9yID8/PSBuZXcgU2VsZWN0b3IuZG9TZXQobm9kZS50YXJnZXQubmFtZSkpOwogICAgfQogIH0KfQqBBQBOTjwBPQEiATABS0wtNEMUAgEhAREXFQEmAUA6OgEcICclBAE9AQwWFhcgFyAaHAYQBAIBUQ4fLjkBLkNCMAQBKC8rGwgGBAEbJyEgJBwIBgQBGzUOBgE0Og4GASo7NDIqICINRAYoBAEjNQ4GARctMzQwDQ4GAToOBgFQUCouNDIqISI0NDIqISE0NDIqICINRAYoBAIBQT4+PgFCLyEBTVEHSzouK0gIATcoBgEOBAEMMScBFyg+DS5NCAYEAQw9LQEXLBdGBgQBDCciARcoRg0uSggBK0hACAYEAQwzKAEsQgYBIEZABgQBDCciARcoRg0uSggGBAEMMygBFyxPBgQCAUBwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9ub19keW5hbWljX2ludm9jYXRpb25zX2Fubm90YXRvci5kYXJ0cWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvcHJvdG9idWZfYXdhcmVfdHJlZXNoYWtlci90cmFuc2Zvcm1lci5kYXJ0qHcvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIuZGFydCcgYXMgZ2xvYmFsVHlwZUZsb3cKICAgIHNob3cgdHJhbnNmb3JtQ29tcG9uZW50OwppbXBvcnQgJ3BhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL25vX2R5bmFtaWNfaW52b2NhdGlvbnNfYW5ub3RhdG9yLmRhcnQnCiAgICBzaG93IFNlbGVjdG9yOwoKY2xhc3MgVHJhbnNmb3JtYXRpb25JbmZvIHsKICBmaW5hbCBMaXN0PFN0cmluZz4gcmVtb3ZlZE1lc3NhZ2VGaWVsZHMgPSA8U3RyaW5nPltdOwogIGZpbmFsIExpc3Q8Q2xhc3M+IHJlbW92ZWRNZXNzYWdlQ2xhc3NlcyA9IDxDbGFzcz5bXTsKfQoKVHJhbnNmb3JtYXRpb25JbmZvIHRyYW5zZm9ybUNvbXBvbmVudCgKICAgIENvbXBvbmVudCBjb21wb25lbnQsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsIFRhcmdldCB0YXJnZXQsCiAgICB7QHJlcXVpcmVkIGJvb2wgY29sbGVjdEluZm99KSB7CiAgZmluYWwgY29yZVR5cGVzID0gbmV3IENvcmVUeXBlcyhjb21wb25lbnQpOwoKICBUcmFuc2Zvcm1hdGlvbkluZm8gaW5mbyA9IGNvbGxlY3RJbmZvID8gVHJhbnNmb3JtYXRpb25JbmZvKCkgOiBudWxsOwoKICBfdHJlZXNoYWtlUHJvdG9zKHRhcmdldCwgY29tcG9uZW50LCBjb3JlVHlwZXMsIGluZm8pOwogIHJldHVybiBpbmZvOwp9Cgp2b2lkIF90cmVlc2hha2VQcm90b3MoVGFyZ2V0IHRhcmdldCwgQ29tcG9uZW50IGNvbXBvbmVudCwgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgIFRyYW5zZm9ybWF0aW9uSW5mbyBpbmZvKSB7CiAgZ2xvYmFsVHlwZUZsb3cudHJhbnNmb3JtQ29tcG9uZW50KHRhcmdldCwgY29yZVR5cGVzLCBjb21wb25lbnQpOwoKICBmaW5hbCBjb2xsZWN0b3IgPSByZW1vdmVVbnVzZWRQcm90b1JlZmVyZW5jZXMoY29tcG9uZW50LCBjb3JlVHlwZXMsIGluZm8pOwogIGlmIChjb2xsZWN0b3IgIT0gbnVsbCkgewogICAgZ2xvYmFsVHlwZUZsb3cudHJhbnNmb3JtQ29tcG9uZW50KHRhcmdldCwgY29yZVR5cGVzLCBjb21wb25lbnQpOwogICAgaWYgKGluZm8gIT0gbnVsbCkgewogICAgICBmb3IgKENsYXNzIGdtU3ViY2xhc3MgaW4gY29sbGVjdG9yLmdtU3ViY2xhc3NlcykgewogICAgICAgIGlmICghZ21TdWJjbGFzcy5lbmNsb3NpbmdMaWJyYXJ5LmNsYXNzZXMuY29udGFpbnMoZ21TdWJjbGFzcykpIHsKICAgICAgICAgIGluZm8ucmVtb3ZlZE1lc3NhZ2VDbGFzc2VzLmFkZChnbVN1YmNsYXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlbW92ZSBtZXRhZGF0YSBhZGRlZCBieSB0aGUgdHlwZWZsb3cgYW5hbHlzaXMgKGV2ZW4gaWYgdGhlIGNvZGUgZG9lc24ndAogIC8vIHVzZSBhbnkgcHJvdG9zKS4KICBjb21wb25lbnQubWV0YWRhdGEuY2xlYXIoKTsKfQoKSW5mb0NvbGxlY3RvciByZW1vdmVVbnVzZWRQcm90b1JlZmVyZW5jZXMoCiAgICBDb21wb25lbnQgY29tcG9uZW50LCBDb3JlVHlwZXMgY29yZVR5cGVzLCBUcmFuc2Zvcm1hdGlvbkluZm8gaW5mbykgewogIGZpbmFsIHByb3RvYnVmVXJpID0gVXJpLnBhcnNlKCdwYWNrYWdlOnByb3RvYnVmL3Byb3RvYnVmLmRhcnQnKTsKICBmaW5hbCBwcm90b2J1ZkxpYnMgPQogICAgICBjb21wb25lbnQubGlicmFyaWVzLndoZXJlKChsaWIpID0+IGxpYi5pbXBvcnRVcmkgPT0gcHJvdG9idWZVcmkpOwogIGlmIChwcm90b2J1ZkxpYnMuaXNFbXB0eSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGZpbmFsIHByb3RvYnVmTGliID0gcHJvdG9idWZMaWJzLnNpbmdsZTsKCiAgZmluYWwgZ21DbGFzcyA9IHByb3RvYnVmTGliLmNsYXNzZXMKICAgICAgLndoZXJlKChrbGFzcykgPT4ga2xhc3MubmFtZSA9PSAnR2VuZXJhdGVkTWVzc2FnZScpCiAgICAgIC5zaW5nbGU7CiAgZmluYWwgdGFnTnVtYmVyQ2xhc3MgPQogICAgICBwcm90b2J1ZkxpYi5jbGFzc2VzLndoZXJlKChrbGFzcykgPT4ga2xhc3MubmFtZSA9PSAnVGFnTnVtYmVyJykuc2luZ2xlOwoKICBmaW5hbCBjb2xsZWN0b3IgPSBJbmZvQ29sbGVjdG9yKGdtQ2xhc3MpOwoKICBmaW5hbCBiaUNsYXNzID0KICAgICAgcHJvdG9idWZMaWIuY2xhc3Nlcy53aGVyZSgoa2xhc3MpID0+IGtsYXNzLm5hbWUgPT0gJ0J1aWxkZXJJbmZvJykuc2luZ2xlOwogIGZpbmFsIGFkZE1ldGhvZCA9CiAgICAgIGJpQ2xhc3MubWVtYmVycy5zaW5nbGVXaGVyZSgoTWVtYmVyIG1lbWJlcikgPT4gbWVtYmVyLm5hbWUubmFtZSA9PSAnYWRkJyk7CgogIGNvbXBvbmVudC5hY2NlcHQoY29sbGVjdG9yKTsKCiAgX1VudXNlZEZpZWxkTWV0YWRhdGFQcnVuZXIodGFnTnVtYmVyQ2xhc3MsIGJpQ2xhc3MsIGFkZE1ldGhvZCwKICAgICAgICAgIGNvbGxlY3Rvci5keW5hbWljU2VsZWN0b3JzLCBjb3JlVHlwZXMsIGluZm8pCiAgICAgIC5yZW1vdmVNZXRhZGF0YUZvclVudXNlZEZpZWxkcygKICAgIGNvbGxlY3Rvci5nbVN1YmNsYXNzZXMsCiAgICBjb2xsZWN0b3IuZ21TdWJjbGFzc2VzSW52b2tlZE1ldGhvZHMsCiAgICBjb3JlVHlwZXMsCiAgICBpbmZvLAogICk7CgogIHJldHVybiBjb2xsZWN0b3I7Cn0KCi8vLyBGb3IgcHJvdG9idWYgZmllbGRzIHdoaWNoIGFyZSBub3QgYWNjZXNzZWQsIHBydW5lIGF3YXkgaXRzIG1ldGFkYXRhLgpjbGFzcyBfVW51c2VkRmllbGRNZXRhZGF0YVBydW5lciBleHRlbmRzIFRyZWVWaXNpdG9yPHZvaWQ+IHsKICBmaW5hbCBDbGFzcyB0YWdOdW1iZXJDbGFzczsKICBmaW5hbCBSZWZlcmVuY2UgdGFnTnVtYmVyRmllbGQ7CiAgLy8gQWxsIG9mIHRob3NlIG1ldGhvZHMgaGF2ZSB0aGUgZGFydCBmaWVsZCBuYW1lIGFzIHNlY29uZCBwb3NpdGlvbmFsCiAgLy8gcGFyYW1ldGVyLgogIC8vIE1ldGhvZCBuYW1lcyBhcmUgZGVmaW5lZCBpbjoKICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Byb3RvYnVmL2Jsb2IvbWFzdGVyL3Byb3RvYnVmL2xpYi9zcmMvcHJvdG9idWYvYnVpbGRlcl9pbmZvLmRhcnQKICAvLyBUaGUgY29kZSBpcyBnZW5lcmF0ZWQgYnk6CiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9wcm90b2J1Zi9ibG9iL21hc3Rlci9wcm90b2NfcGx1Z2luL2xpYi9wcm90b2J1Zl9maWVsZC5kYXJ0LgogIHN0YXRpYyBmaW5hbCBmaWVsZEFkZGluZ01ldGhvZHMgPSBTZXQ8U3RyaW5nPi5mcm9tKGNvbnN0IDxTdHJpbmc+WwogICAgJ2EnLAogICAgJ2FPTScsCiAgICAnYU9TJywKICAgICdhUU0nLAogICAgJ3BQUycsCiAgICAnYVFTJywKICAgICdhSW50NjQnLAogICAgJ2FPQicsCiAgICAnZScsCiAgICAncCcsCiAgICAncGMnLAogICAgJ20nLAogIF0pOwoKICBmaW5hbCBDbGFzcyBidWlsZGVySW5mb0NsYXNzOwogIENsYXNzIHZpc2l0ZWRDbGFzczsKICBmaW5hbCBuYW1lcyA9IFNldDxTdHJpbmc+KCk7CiAgZmluYWwgdXNlZFRhZ051bWJlcnMgPSBTZXQ8aW50PigpOwoKICBmaW5hbCBkeW5hbWljTmFtZXMgPSBTZXQ8U3RyaW5nPigpOwogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgVHJhbnNmb3JtYXRpb25JbmZvIGluZm87CiAgZmluYWwgTWVtYmVyIGFkZE1ldGhvZDsKCiAgX1VudXNlZEZpZWxkTWV0YWRhdGFQcnVuZXIodGhpcy50YWdOdW1iZXJDbGFzcywgdGhpcy5idWlsZGVySW5mb0NsYXNzLAogICAgICB0aGlzLmFkZE1ldGhvZCwgU2V0PFNlbGVjdG9yPiBkeW5hbWljU2VsZWN0b3JzLCB0aGlzLmNvcmVUeXBlcywgdGhpcy5pbmZvKQogICAgICA6IHRhZ051bWJlckZpZWxkID0gdGFnTnVtYmVyQ2xhc3MuZmllbGRzCiAgICAgICAgICAgIC5maXJzdFdoZXJlKChmKSA9PiBmLm5hbWUubmFtZSA9PSAndGFnTnVtYmVyJykKICAgICAgICAgICAgLnJlZmVyZW5jZSB7CiAgICBkeW5hbWljTmFtZXMuYWRkQWxsKGR5bmFtaWNTZWxlY3RvcnMubWFwKChzZWwpID0+IHNlbC50YXJnZXQubmFtZSkpOwogIH0KCiAgLy8vIElmIGEgcHJvdG8gbWVzc2FnZSBmaWVsZCBpcyBuZXZlciBhY2Nlc3NlZCAobmVpdGhlciByZWFkIG5vciB3cml0dGVuIHRvKSwKICAvLy8gcmVtb3ZlIGl0cyBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIE1lc3NhZ2UuX2kKICAvLy8gZmllbGQgKGkuZS4gdGhlIEJ1aWxkZXJJbmZvIG1ldGFkYXRhKS4KICB2b2lkIHJlbW92ZU1ldGFkYXRhRm9yVW51c2VkRmllbGRzKAogICAgICBTZXQ8Q2xhc3M+IGdtU3ViY2xhc3NlcywKICAgICAgTWFwPENsYXNzLCBTZXQ8U2VsZWN0b3I+PiBpbnZva2VkTWV0aG9kcywKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgVHJhbnNmb3JtYXRpb25JbmZvIGluZm8pIHsKICAgIGZvciAoZmluYWwga2xhc3MgaW4gZ21TdWJjbGFzc2VzKSB7CiAgICAgIGZpbmFsIHNlbGVjdG9ycyA9IGludm9rZWRNZXRob2RzW2tsYXNzXSA/PyBTZXQ8U2VsZWN0b3I+KCk7CiAgICAgIGZpbmFsIGJ1aWxkZXJJbmZvRmllbGRzID0ga2xhc3MuZmllbGRzLndoZXJlKChmKSA9PiBmLm5hbWUubmFtZSA9PSAnX2knKTsKICAgICAgaWYgKGJ1aWxkZXJJbmZvRmllbGRzLmlzRW1wdHkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmaW5hbCBidWlsZGVySW5mb0ZpZWxkID0gYnVpbGRlckluZm9GaWVsZHMuc2luZ2xlOwogICAgICBfcHJ1bmVCdWlsZGVySW5mb0ZpZWxkKGJ1aWxkZXJJbmZvRmllbGQsIHNlbGVjdG9ycywga2xhc3MpOwogICAgfQogIH0KCiAgdm9pZCBfcHJ1bmVCdWlsZGVySW5mb0ZpZWxkKAogICAgICBGaWVsZCBmaWVsZCwgU2V0PFNlbGVjdG9yPiBzZWxlY3RvcnMsIENsYXNzIGdtU3ViY2xhc3MpIHsKICAgIG5hbWVzLmNsZWFyKCk7CiAgICBuYW1lcy5hZGRBbGwoc2VsZWN0b3JzLm1hcCgoc2VsKSA9PiBzZWwudGFyZ2V0Lm5hbWUpKTsKICAgIHZpc2l0ZWRDbGFzcyA9IGdtU3ViY2xhc3M7CiAgICBfY29tcHV0ZVVzZWRUYWdOdW1iZXJzKGdtU3ViY2xhc3MpOwogICAgZmllbGQuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpOwogIH0KCiAgdm9pZCBfY29tcHV0ZVVzZWRUYWdOdW1iZXJzKENsYXNzIGdtU3ViY2xhc3MpIHsKICAgIHVzZWRUYWdOdW1iZXJzLmNsZWFyKCk7CiAgICBmb3IgKGZpbmFsIHByb2NlZHVyZSBpbiBnbVN1YmNsYXNzLnByb2NlZHVyZXMpIHsKICAgICAgZm9yIChmaW5hbCBhbm5vdGF0aW9uIGluIHByb2NlZHVyZS5hbm5vdGF0aW9ucykgewogICAgICAgIGlmIChhbm5vdGF0aW9uIGlzIENvbnN0YW50RXhwcmVzc2lvbikgewogICAgICAgICAgZmluYWwgY29uc3RhbnQgPSBhbm5vdGF0aW9uLmNvbnN0YW50OwogICAgICAgICAgaWYgKGNvbnN0YW50IGlzIEluc3RhbmNlQ29uc3RhbnQgJiYKICAgICAgICAgICAgICBjb25zdGFudC5jbGFzc1JlZmVyZW5jZSA9PSB0YWdOdW1iZXJDbGFzcy5yZWZlcmVuY2UpIHsKICAgICAgICAgICAgZmluYWwgbmFtZSA9IHByb2NlZHVyZS5uYW1lLm5hbWU7CiAgICAgICAgICAgIGlmIChkeW5hbWljTmFtZXMuY29udGFpbnMobmFtZSkgfHwgbmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgICB1c2VkVGFnTnVtYmVycy5hZGQoCiAgICAgICAgICAgICAgICAgIChjb25zdGFudC5maWVsZFZhbHVlc1t0YWdOdW1iZXJGaWVsZF0gYXMgSW50Q29uc3RhbnQpLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIC8vIFRoZSBCdWlsZGVySW5mbyBmaWVsZCBgX2lgIGlzIHNldCB1cCB3aXRoIGEgcm93IG9mIGNhc2NhZGVkIGNhbGxzLgogICAgLy8gYGBgCiAgICAvLyBzdGF0aWMgZmluYWwgQnVpbGRlckluZm8gX2kgPSBCdWlsZGVySW5mbygnTWVzc2FnZU5hbWUnKQogICAgLy8gICAgIC4uYSgxLCAnZm9vJywgUGJGaWVsZFR5cGUuT00pCiAgICAvLyAgICAgLi5hKDIsICdiYXInLCBQYkZpZWxkVHlwZS5PTSkKICAgIC8vIGBgYAogICAgLy8gRWFjaCBjYXNjYWRlZCBjYWxsIHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4ga2VybmVsIGFzIGEgbGV0LCB3aGVyZSB0aGUKICAgIC8vIGluaXRpYWxpemVyIHdpbGwgYmUgYSBjYWxsIHRvIGEgbWV0aG9kIG9mIGBidWlsZGVySW5mb2AuIEZvciBleGFtcGxlOgogICAgLy8gYGBgCiAgICAvLyB7cHJvdG9idWY6OkJ1aWxkZXJJbmZvOjphfTxkYXJ0LmNvcmU6OmludCo+KDEsICJmb28iLCAjQzEwKQogICAgLy8gYGBgCiAgICAvLyBUaGUgbWV0aG9kcyBlbnVtZXJhdGVkIGluIGBmaWVsZEFkZGluZ01ldGhvZHNgIGFyZSB0aGUgb25lcyB0aGF0IHNldCB1cAogICAgLy8gZmllbGRzIChvdGhlciBtZXRob2RzIGRvIG90aGVyIHRoaW5ncykuCiAgICAvLwogICAgLy8gRmlyc3QgYXJndW1lbnQgaXMgdGhlIHRhZy1udW1iZXIgb2YgdGhlIGFkZGVkIGZpZWxkLgogICAgLy8gU2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBmaWVsZC1uYW1lLgogICAgLy8gRnVydGhlciBhcmd1bWVudHMgYXJlIHNwZWNpZmljIHRvIHRoZSBtZXRob2QuCiAgICBmaW5hbCBpbml0aWFsaXplciA9IG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgTWV0aG9kSW52b2NhdGlvbiAmJgogICAgICAgIGluaXRpYWxpemVyLmludGVyZmFjZVRhcmdldD8uZW5jbG9zaW5nQ2xhc3MgPT0gYnVpbGRlckluZm9DbGFzcyAmJgogICAgICAgIGZpZWxkQWRkaW5nTWV0aG9kcy5jb250YWlucyhpbml0aWFsaXplci5uYW1lLm5hbWUpKSB7CiAgICAgIGZpbmFsIHRhZ051bWJlciA9CiAgICAgICAgICAoaW5pdGlhbGl6ZXIuYXJndW1lbnRzLnBvc2l0aW9uYWxbMF0gYXMgSW50TGl0ZXJhbCkudmFsdWU7CiAgICAgIGlmICghdXNlZFRhZ051bWJlcnMuY29udGFpbnModGFnTnVtYmVyKSkgewogICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKICAgICAgICAgIGZpbmFsIGZpZWxkTmFtZSA9CiAgICAgICAgICAgICAgKGluaXRpYWxpemVyLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzFdIGFzIFN0cmluZ0xpdGVyYWwpLnZhbHVlOwogICAgICAgICAgaW5mby5yZW1vdmVkTWVzc2FnZUZpZWxkcy5hZGQoIiR7dmlzaXRlZENsYXNzLm5hbWV9LiRmaWVsZE5hbWUiKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlcGxhY2UgdGhlIGZpZWxkIG1ldGFkYXRhIG1ldGhvZCB3aXRoIGEgZHVtbXkgY2FsbCB0bwogICAgICAgIC8vIGBCdWlsZGVySW5mby5hZGRgLiBUaGlzIGlzIHRvIHByZXNlcnZlIHRoZSBpbmRleCBjYWxjdWxhdGlvbnMgd2hlbgogICAgICAgIC8vIHJlbW92aW5nIGEgZmllbGQuCiAgICAgICAgLy8gQ2hhbmdlIHRoZSB0YWctbnVtYmVyIHRvIDAuIE90aGVyd2lzZSB0aGUgZGVjb2RlciB3aWxsIGdldCBjb25mdXNlZC4KICAgICAgICBpbml0aWFsaXplci5pbnRlcmZhY2VUYXJnZXQgPSBhZGRNZXRob2Q7CiAgICAgICAgaW5pdGlhbGl6ZXIubmFtZSA9IGFkZE1ldGhvZC5uYW1lOwogICAgICAgIGluaXRpYWxpemVyLmFyZ3VtZW50cy5yZXBsYWNlV2l0aCgKICAgICAgICAgIEFyZ3VtZW50cygKICAgICAgICAgICAgPEV4cHJlc3Npb24+WwogICAgICAgICAgICAgIEludExpdGVyYWwoMCksIC8vIHRhZ051bWJlcgogICAgICAgICAgICAgIE51bGxMaXRlcmFsKCksIC8vIG5hbWUKICAgICAgICAgICAgICBOdWxsTGl0ZXJhbCgpLCAvLyBmaWVsZFR5cGUKICAgICAgICAgICAgICBOdWxsTGl0ZXJhbCgpLCAvLyBkZWZhdWx0T3JNYWtlcgogICAgICAgICAgICAgIE51bGxMaXRlcmFsKCksIC8vIHN1YkJ1aWxkZXIKICAgICAgICAgICAgICBOdWxsTGl0ZXJhbCgpLCAvLyB2YWx1ZU9mCiAgICAgICAgICAgICAgTnVsbExpdGVyYWwoKSwgLy8gZW51bVZhbHVlcwogICAgICAgICAgICBdLAogICAgICAgICAgICB0eXBlczogPERhcnRUeXBlPlsKICAgICAgICAgICAgICBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5udWxsQ2xhc3MsIE51bGxhYmlsaXR5Lm51bGxhYmxlKQogICAgICAgICAgICBdLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogIH0KfQoKLy8vIEZpbmRzIGFsbCBzdWJjbGFzc2VzIG9mIFtHZW5lcmF0ZWRNZXNzYWdlXSBhbmQgYWxsIG1ldGhvZHMgaW52b2tlZCBvbiB0aGVtCi8vLyAocG90ZW50aWFsbHkgaW4gYSBkeW5hbWljIGNhbGwpLgpjbGFzcyBJbmZvQ29sbGVjdG9yIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjx2b2lkPiB7CiAgZmluYWwgZHluYW1pY1NlbGVjdG9ycyA9IFNldDxTZWxlY3Rvcj4oKTsKICBmaW5hbCBDbGFzcyBnZW5lcmF0ZWRNZXNzYWdlQ2xhc3M7CiAgZmluYWwgZ21TdWJjbGFzc2VzID0gU2V0PENsYXNzPigpOwogIGZpbmFsIGdtU3ViY2xhc3Nlc0ludm9rZWRNZXRob2RzID0gTWFwPENsYXNzLCBTZXQ8U2VsZWN0b3I+PigpOwoKICBJbmZvQ29sbGVjdG9yKHRoaXMuZ2VuZXJhdGVkTWVzc2FnZUNsYXNzKTsKCiAgQG92ZXJyaWRlCiAgdmlzaXRDbGFzcyhDbGFzcyBrbGFzcykgewogICAgaWYgKGlzR2VuZXJhdGVkTWV0aG9kU3ViY2xhc3Moa2xhc3MpKSB7CiAgICAgIGdtU3ViY2xhc3Nlcy5hZGQoa2xhc3MpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0Q2xhc3Moa2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgZHluYW1pY1NlbGVjdG9ycy5hZGQoU2VsZWN0b3IuZG9JbnZva2Uobm9kZS5uYW1lKSk7CiAgICB9CgogICAgZmluYWwgdGFyZ2V0Q2xhc3MgPSBub2RlLmludGVyZmFjZVRhcmdldD8uZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoaXNHZW5lcmF0ZWRNZXRob2RTdWJjbGFzcyh0YXJnZXRDbGFzcykpIHsKICAgICAgYWRkSW52b2tlZE1ldGhvZCh0YXJnZXRDbGFzcywgU2VsZWN0b3IuZG9JbnZva2Uobm9kZS5uYW1lKSk7CiAgICB9CiAgICBzdXBlci52aXNpdE1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIGR5bmFtaWNTZWxlY3RvcnMuYWRkKFNlbGVjdG9yLmRvR2V0KG5vZGUubmFtZSkpOwogICAgfQoKICAgIGZpbmFsIHRhcmdldENsYXNzID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ/LmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGlzR2VuZXJhdGVkTWV0aG9kU3ViY2xhc3ModGFyZ2V0Q2xhc3MpKSB7CiAgICAgIGFkZEludm9rZWRNZXRob2QodGFyZ2V0Q2xhc3MsIFNlbGVjdG9yLmRvR2V0KG5vZGUubmFtZSkpOwogICAgfQogICAgc3VwZXIudmlzaXRQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgZHluYW1pY1NlbGVjdG9ycy5hZGQoU2VsZWN0b3IuZG9TZXQobm9kZS5uYW1lKSk7CiAgICB9CgogICAgZmluYWwgdGFyZ2V0Q2xhc3MgPSBub2RlLmludGVyZmFjZVRhcmdldD8uZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoaXNHZW5lcmF0ZWRNZXRob2RTdWJjbGFzcyh0YXJnZXRDbGFzcykpIHsKICAgICAgYWRkSW52b2tlZE1ldGhvZCh0YXJnZXRDbGFzcywgU2VsZWN0b3IuZG9TZXQobm9kZS5uYW1lKSk7CiAgICB9CiAgICBzdXBlci52aXNpdFByb3BlcnR5U2V0KG5vZGUpOwogIH0KCiAgYm9vbCBpc0dlbmVyYXRlZE1ldGhvZFN1YmNsYXNzKENsYXNzIGtsYXNzKSB7CiAgICByZXR1cm4ga2xhc3M/LnN1cGVyY2xhc3MgPT0gZ2VuZXJhdGVkTWVzc2FnZUNsYXNzOwogIH0KCiAgdm9pZCBhZGRJbnZva2VkTWV0aG9kKENsYXNzIGtsYXNzLCBTZWxlY3RvciBzZWxlY3RvcikgewogICAgZmluYWwgc2VsZWN0b3JzID0KICAgICAgICBnbVN1YmNsYXNzZXNJbnZva2VkTWV0aG9kcy5wdXRJZkFic2VudChrbGFzcywgKCkgPT4gU2V0PFNlbGVjdG9yPigpKTsKICAgIHNlbGVjdG9ycy5hZGQoc2VsZWN0b3IpOwogIH0KfQqBMgBOTjwBJS0pIVEdShMBGzg3AgEnSSQuAUcBOA8CAU8fQwFNG0UYOUk2CggGBAFOFh4CAStJQxdIHhEEKwEmOg8ZTgEsARJQFFEBHwFBNyYcKg8KBQEUAgFJPR4iSBAiYx9eRQkLCwsLCw4LCQkKCQYBIBYfJQEmHSEaAUlRLzsZSQQBUE4tJh8wGyEoQlAnEgg5QgYEAR9AEzsfKCQEATIcNTgwMC5FLkciUA4MCggGBAEMF0oLQCkpC0xNC0MLTy8HPCo1MytLPhhFMRwcTEwKAUJOHVAxKysVGiolKi8rKCsPH0cPDQsIBhwEAgFPJTUsJSVCAS0BDBwsHwYkBAEMMSg6BgE+MkMGJwQBDCcoNwYBPjJABiIEAQwnKDcGAT4yQAYiBAEwNwQBOhZOHQQCAUVwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9wcm90b2J1Zl9hd2FyZV90cmVlc2hha2VyL3RyYW5zZm9ybWVyLmRhcnRhZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIuZGFydMAArCQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRyYW5zZm9ybWF0aW9ucyBiYXNlZCBvbiB0eXBlIGZsb3cgYW5hbHlzaXMuCmxpYnJhcnkgdm0udHJhbnNmb3JtYXRpb25zLnR5cGVfZmxvdy50cmFuc2Zvcm1lcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBoaWRlIFN0YXRlbWVudCwgU3RhdGVtZW50VmlzaXRvcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2xpYnJhcnlfaW5kZXguZGFydCcgc2hvdyBMaWJyYXJ5SW5kZXg7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKCmltcG9ydCAnYW5hbHlzaXMuZGFydCc7CmltcG9ydCAnY2FsbHMuZGFydCc7CmltcG9ydCAnc3VtbWFyeS5kYXJ0JzsKaW1wb3J0ICd0YWJsZV9zZWxlY3Rvci5kYXJ0JzsKaW1wb3J0ICd0eXBlcy5kYXJ0JzsKaW1wb3J0ICd1dGlscy5kYXJ0JzsKaW1wb3J0ICcuLi9wcmFnbWEuZGFydCc7CmltcG9ydCAnLi4vZGV2aXJ0dWFsaXphdGlvbi5kYXJ0JyBzaG93IERldmlydHVhbGl6YXRpb247CmltcG9ydCAnLi4vLi4vbWV0YWRhdGEvZGlyZWN0X2NhbGwuZGFydCc7CmltcG9ydCAnLi4vLi4vbWV0YWRhdGEvaW5mZXJyZWRfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9tZXRhZGF0YS9wcm9jZWR1cmVfYXR0cmlidXRlcy5kYXJ0JzsKaW1wb3J0ICcuLi8uLi9tZXRhZGF0YS91bnJlYWNoYWJsZS5kYXJ0JzsKCmNvbnN0IGJvb2wga0R1bXBDbGFzc0hpZXJhcmNoeSA9CiAgICBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgnZ2xvYmFsLnR5cGUuZmxvdy5kdW1wLmNsYXNzLmhpZXJhcmNoeScpOwoKLy8vIFdob2xlLXByb2dyYW0gdHlwZSBmbG93IGFuYWx5c2lzIGFuZCB0cmFuc2Zvcm1hdGlvbi4KLy8vIEFzc3VtZXMgc3Ryb25nIG1vZGUgYW5kIGNsb3NlZCB3b3JsZC4KQ29tcG9uZW50IHRyYW5zZm9ybUNvbXBvbmVudCgKICAgIFRhcmdldCB0YXJnZXQsIENvcmVUeXBlcyBjb3JlVHlwZXMsIENvbXBvbmVudCBjb21wb25lbnQsCiAgICBbUHJhZ21hQW5ub3RhdGlvblBhcnNlciBtYXRjaGVyXSkgewogIHZvaWQgaWdub3JlQW1iaWd1b3VzU3VwZXJ0eXBlcyhDbGFzcyBjbHMsIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikge30KICBmaW5hbCBoaWVyYXJjaHkgPSBuZXcgQ2xhc3NIaWVyYXJjaHkoY29tcG9uZW50LCBjb3JlVHlwZXMsCiAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlczogaWdub3JlQW1iaWd1b3VzU3VwZXJ0eXBlcyk7CiAgZmluYWwgdHlwZXMgPSBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KTsKICBmaW5hbCBsaWJyYXJ5SW5kZXggPSBuZXcgTGlicmFyeUluZGV4LmFsbChjb21wb25lbnQpOwogIGZpbmFsIGdlbmVyaWNJbnRlcmZhY2VzSW5mbyA9IG5ldyBHZW5lcmljSW50ZXJmYWNlc0luZm9JbXBsKGhpZXJhcmNoeSk7CgogIFN0YXRpc3RpY3MucmVzZXQoKTsKICBmaW5hbCBhbmFseXNpc1N0b3BXYXRjaCA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKCiAgZmluYWwgdHlwZUZsb3dBbmFseXNpcyA9IG5ldyBUeXBlRmxvd0FuYWx5c2lzKHRhcmdldCwgY29tcG9uZW50LCBjb3JlVHlwZXMsCiAgICAgIGhpZXJhcmNoeSwgZ2VuZXJpY0ludGVyZmFjZXNJbmZvLCB0eXBlcywgbGlicmFyeUluZGV4LAogICAgICBtYXRjaGVyOiBtYXRjaGVyKTsKCiAgUHJvY2VkdXJlIG1haW4gPSBjb21wb25lbnQubWFpbk1ldGhvZDsKCiAgLy8gYG1haW5gIGNhbiBiZSBudWxsLCByb290cyBjYW4gYWxzbyBjb21lIGZyb20gQHByYWdtYSgidm06ZW50cnktcG9pbnQiKS4KICBpZiAobWFpbiAhPSBudWxsKSB7CiAgICBmaW5hbCBTZWxlY3RvciBtYWluU2VsZWN0b3IgPSBuZXcgRGlyZWN0U2VsZWN0b3IobWFpbik7CiAgICB0eXBlRmxvd0FuYWx5c2lzLmFkZFJhd0NhbGwobWFpblNlbGVjdG9yKTsKICB9CgogIHR5cGVGbG93QW5hbHlzaXMucHJvY2VzcygpOwoKICBhbmFseXNpc1N0b3BXYXRjaC5zdG9wKCk7CgogIGlmIChrRHVtcENsYXNzSGllcmFyY2h5KSB7CiAgICBkZWJ1Z1ByaW50KHR5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUpOwogIH0KCiAgZmluYWwgdHJhbnNmb3Jtc1N0b3BXYXRjaCA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKCiAgZmluYWwgdHJlZVNoYWtlciA9IG5ldyBUcmVlU2hha2VyKGNvbXBvbmVudCwgdHlwZUZsb3dBbmFseXNpcyk7CiAgdHJlZVNoYWtlci50cmFuc2Zvcm1Db21wb25lbnQoY29tcG9uZW50KTsKCiAgbmV3IFRGQURldmlydHVhbGl6YXRpb24oCiAgICAgICAgICBjb21wb25lbnQsIHR5cGVGbG93QW5hbHlzaXMsIGhpZXJhcmNoeSwgdHJlZVNoYWtlci5maWVsZE1vcnBoZXIpCiAgICAgIC52aXNpdENvbXBvbmVudChjb21wb25lbnQpOwoKICBuZXcgQW5ub3RhdGVLZXJuZWwoY29tcG9uZW50LCB0eXBlRmxvd0FuYWx5c2lzLCB0cmVlU2hha2VyLmZpZWxkTW9ycGhlcikKICAgICAgLnZpc2l0Q29tcG9uZW50KGNvbXBvbmVudCk7CgogIHRyYW5zZm9ybXNTdG9wV2F0Y2guc3RvcCgpOwoKICBzdGF0UHJpbnQoIlRGIGFuYWx5c2lzIHRvb2sgJHthbmFseXNpc1N0b3BXYXRjaC5lbGFwc2VkTWlsbGlzZWNvbmRzfW1zIik7CiAgc3RhdFByaW50KCJURiB0cmFuc2Zvcm1zIHRvb2sgJHt0cmFuc2Zvcm1zU3RvcFdhdGNoLmVsYXBzZWRNaWxsaXNlY29uZHN9bXMiKTsKCiAgU3RhdGlzdGljcy5wcmludCgiVEZBIHN0YXRpc3RpY3MiKTsKCiAgcmV0dXJuIGNvbXBvbmVudDsKfQoKLy8vIERldmlydHVhbGl6YXRpb24gYmFzZWQgb24gcmVzdWx0cyBvZiB0eXBlIGZsb3cgYW5hbHlzaXMuCmNsYXNzIFRGQURldmlydHVhbGl6YXRpb24gZXh0ZW5kcyBEZXZpcnR1YWxpemF0aW9uIHsKICBmaW5hbCBUeXBlRmxvd0FuYWx5c2lzIF90eXBlRmxvd0FuYWx5c2lzOwogIGZpbmFsIEZpZWxkTW9ycGhlciBmaWVsZE1vcnBoZXI7CgogIFRGQURldmlydHVhbGl6YXRpb24oQ29tcG9uZW50IGNvbXBvbmVudCwgdGhpcy5fdHlwZUZsb3dBbmFseXNpcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCB0aGlzLmZpZWxkTW9ycGhlcikKICAgICAgOiBzdXBlcihfdHlwZUZsb3dBbmFseXNpcy5lbnZpcm9ubWVudC5jb3JlVHlwZXMsIGNvbXBvbmVudCwgaGllcmFyY2h5KTsKCiAgQG92ZXJyaWRlCiAgRGlyZWN0Q2FsbE1ldGFkYXRhIGdldERpcmVjdENhbGwoVHJlZU5vZGUgbm9kZSwgTWVtYmVyIGludGVyZmFjZVRhcmdldCwKICAgICAge2Jvb2wgc2V0dGVyID0gZmFsc2V9KSB7CiAgICBmaW5hbCBjYWxsU2l0ZSA9IF90eXBlRmxvd0FuYWx5c2lzLmNhbGxTaXRlKG5vZGUpOwogICAgaWYgKGNhbGxTaXRlICE9IG51bGwpIHsKICAgICAgZmluYWwgTWVtYmVyIHNpbmdsZVRhcmdldCA9IGZpZWxkTW9ycGhlcgogICAgICAgICAgLmdldE1vcnBoZWRNZW1iZXIoY2FsbFNpdGUubW9ub21vcnBoaWNUYXJnZXQsIGlzU2V0dGVyOiBzZXR0ZXIpOwogICAgICBpZiAoc2luZ2xlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gbmV3IERpcmVjdENhbGxNZXRhZGF0YSgKICAgICAgICAgICAgc2luZ2xlVGFyZ2V0LCBjYWxsU2l0ZS5pc051bGxhYmxlUmVjZWl2ZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBBbm5vdGF0ZXMga2VybmVsIEFTVCB3aXRoIG1ldGFkYXRhIHVzaW5nIHJlc3VsdHMgb2YgdHlwZSBmbG93IGFuYWx5c2lzLgpjbGFzcyBBbm5vdGF0ZUtlcm5lbCBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3I8TnVsbD4gewogIGZpbmFsIFR5cGVGbG93QW5hbHlzaXMgX3R5cGVGbG93QW5hbHlzaXM7CiAgZmluYWwgRmllbGRNb3JwaGVyIGZpZWxkTW9ycGhlcjsKICBmaW5hbCBJbmZlcnJlZFR5cGVNZXRhZGF0YVJlcG9zaXRvcnkgX2luZmVycmVkVHlwZU1ldGFkYXRhOwogIGZpbmFsIFVucmVhY2hhYmxlTm9kZU1ldGFkYXRhUmVwb3NpdG9yeSBfdW5yZWFjaGFibGVOb2RlTWV0YWRhdGE7CiAgZmluYWwgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeSBfcHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhOwogIGZpbmFsIFRhYmxlU2VsZWN0b3JBc3NpZ25lciBfdGFibGVTZWxlY3RvckFzc2lnbmVyOwogIGZpbmFsIENsYXNzIF9pbnRDbGFzczsKICBDb25zdGFudCBfbnVsbENvbnN0YW50OwoKICBBbm5vdGF0ZUtlcm5lbChDb21wb25lbnQgY29tcG9uZW50LCB0aGlzLl90eXBlRmxvd0FuYWx5c2lzLCB0aGlzLmZpZWxkTW9ycGhlcikKICAgICAgOiBfaW5mZXJyZWRUeXBlTWV0YWRhdGEgPSBuZXcgSW5mZXJyZWRUeXBlTWV0YWRhdGFSZXBvc2l0b3J5KCksCiAgICAgICAgX3VucmVhY2hhYmxlTm9kZU1ldGFkYXRhID0gbmV3IFVucmVhY2hhYmxlTm9kZU1ldGFkYXRhUmVwb3NpdG9yeSgpLAogICAgICAgIF9wcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgPQogICAgICAgICAgICBuZXcgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeSgpLAogICAgICAgIF90YWJsZVNlbGVjdG9yQXNzaWduZXIgPSBuZXcgVGFibGVTZWxlY3RvckFzc2lnbmVyKCksCiAgICAgICAgX2ludENsYXNzID0gX3R5cGVGbG93QW5hbHlzaXMuZW52aXJvbm1lbnQuY29yZVR5cGVzLmludENsYXNzIHsKICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkoX2luZmVycmVkVHlwZU1ldGFkYXRhKTsKICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkoX3VucmVhY2hhYmxlTm9kZU1ldGFkYXRhKTsKICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkoX3Byb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSk7CiAgfQoKICBJbmZlcnJlZFR5cGUgX2NvbnZlcnRUeXBlKFR5cGUgdHlwZSwKICAgICAge2Jvb2wgc2tpcENoZWNrOiBmYWxzZSwgYm9vbCByZWNlaXZlck5vdEludDogZmFsc2V9KSB7CiAgICBhc3NlcnR4KHR5cGUgIT0gbnVsbCk7CgogICAgQ2xhc3MgY29uY3JldGVDbGFzczsKICAgIENvbnN0YW50IGNvbnN0YW50VmFsdWU7CiAgICBib29sIGlzSW50ID0gZmFsc2U7CgogICAgZmluYWwgbnVsbGFibGUgPSB0eXBlIGlzIE51bGxhYmxlVHlwZTsKICAgIGlmIChudWxsYWJsZSkgewogICAgICB0eXBlID0gKHR5cGUgYXMgTnVsbGFibGVUeXBlKS5iYXNlVHlwZTsKICAgIH0KCiAgICBpZiAobnVsbGFibGUgJiYgdHlwZSA9PSBjb25zdCBFbXB0eVR5cGUoKSkgewogICAgICBjb25jcmV0ZUNsYXNzID0gX3R5cGVGbG93QW5hbHlzaXMuZW52aXJvbm1lbnQuY29yZVR5cGVzLm51bGxDbGFzczsKICAgICAgY29uc3RhbnRWYWx1ZSA9IF9udWxsQ29uc3RhbnQgPz89IG5ldyBOdWxsQ29uc3RhbnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbmNyZXRlQ2xhc3MgPSB0eXBlLmdldENvbmNyZXRlQ2xhc3MoX3R5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUpOwoKICAgICAgaWYgKGNvbmNyZXRlQ2xhc3MgPT0gbnVsbCkgewogICAgICAgIGlzSW50ID0gdHlwZS5pc1N1YnR5cGVPZihfdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZSwgX2ludENsYXNzKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGUgaXMgQ29uY3JldGVUeXBlICYmICFudWxsYWJsZSkgewogICAgICAgIGNvbnN0YW50VmFsdWUgPSB0eXBlLmNvbnN0YW50OwogICAgICB9CiAgICB9CgogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3M7CiAgICBpZiAodHlwZSBpcyBDb25jcmV0ZVR5cGUgJiYgdHlwZS50eXBlQXJncyAhPSBudWxsKSB7CiAgICAgIHR5cGVBcmdzID0gdHlwZS50eXBlQXJncwogICAgICAgICAgLnRha2UodHlwZS5udW1JbW1lZGlhdGVUeXBlQXJncykKICAgICAgICAgIC5tYXAoKHQpID0+IHQgaXMgQW55VHlwZSA/IG51bGwgOiAodCBhcyBSdW50aW1lVHlwZSkucmVwcmVzZW50ZWRUeXBlKQogICAgICAgICAgLnRvTGlzdCgpOwogICAgfQoKICAgIGlmIChjb25jcmV0ZUNsYXNzICE9IG51bGwgfHwKICAgICAgICAhbnVsbGFibGUgfHwKICAgICAgICBpc0ludCB8fAogICAgICAgIGNvbnN0YW50VmFsdWUgIT0gbnVsbCB8fAogICAgICAgIHNraXBDaGVjayB8fAogICAgICAgIHJlY2VpdmVyTm90SW50KSB7CiAgICAgIHJldHVybiBuZXcgSW5mZXJyZWRUeXBlKGNvbmNyZXRlQ2xhc3MsIG51bGxhYmxlLCBpc0ludCwgY29uc3RhbnRWYWx1ZSwKICAgICAgICAgIGV4YWN0VHlwZUFyZ3VtZW50czogdHlwZUFyZ3MsCiAgICAgICAgICBza2lwQ2hlY2s6IHNraXBDaGVjaywKICAgICAgICAgIHJlY2VpdmVyTm90SW50OiByZWNlaXZlck5vdEludCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIF9zZXRJbmZlcnJlZFR5cGUoVHJlZU5vZGUgbm9kZSwgVHlwZSB0eXBlLAogICAgICB7Ym9vbCBza2lwQ2hlY2s6IGZhbHNlLCBib29sIHJlY2VpdmVyTm90SW50OiBmYWxzZX0pIHsKICAgIGZpbmFsIGluZmVycmVkVHlwZSA9IF9jb252ZXJ0VHlwZSh0eXBlLAogICAgICAgIHNraXBDaGVjazogc2tpcENoZWNrLCByZWNlaXZlck5vdEludDogcmVjZWl2ZXJOb3RJbnQpOwogICAgaWYgKGluZmVycmVkVHlwZSAhPSBudWxsKSB7CiAgICAgIF9pbmZlcnJlZFR5cGVNZXRhZGF0YS5tYXBwaW5nW25vZGVdID0gaW5mZXJyZWRUeXBlOwogICAgfQogIH0KCiAgdm9pZCBfc2V0VW5yZWFjaGFibGUoVHJlZU5vZGUgbm9kZSkgewogICAgX3VucmVhY2hhYmxlTm9kZU1ldGFkYXRhLm1hcHBpbmdbbm9kZV0gPSBjb25zdCBVbnJlYWNoYWJsZU5vZGUoKTsKICB9CgogIHZvaWQgX2Fubm90YXRlQ2FsbFNpdGUoVHJlZU5vZGUgbm9kZSwgTWVtYmVyIGludGVyZmFjZVRhcmdldCkgewogICAgZmluYWwgY2FsbFNpdGUgPSBfdHlwZUZsb3dBbmFseXNpcy5jYWxsU2l0ZShub2RlKTsKICAgIGlmIChjYWxsU2l0ZSA9PSBudWxsKSByZXR1cm47CiAgICBpZiAoIWNhbGxTaXRlLmlzUmVhY2hhYmxlKSB7CiAgICAgIF9zZXRVbnJlYWNoYWJsZShub2RlKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZpbmFsIGJvb2wgbWFya1NraXBDaGVjayA9ICFjYWxsU2l0ZS51c2VDaGVja2VkRW50cnkgJiYKICAgICAgICAobm9kZSBpcyBNZXRob2RJbnZvY2F0aW9uIHx8IG5vZGUgaXMgUHJvcGVydHlTZXQpOwoKICAgIGJvb2wgbWFya1JlY2VpdmVyTm90SW50ID0gZmFsc2U7CgogICAgaWYgKCFjYWxsU2l0ZS5yZWNlaXZlck1heUJlSW50KSB7CiAgICAgIC8vIE5vIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBmb3Igc3RhdGljIGNhbGxzLgogICAgICBpZiAobm9kZSBpcyEgU3RhdGljSW52b2NhdGlvbiAmJgogICAgICAgICAgbm9kZSBpcyEgU3RhdGljU2V0ICYmCiAgICAgICAgICBub2RlIGlzISBTdGF0aWNHZXQpIHsKICAgICAgICAvLyBUaGUgY29tcGlsZXIgdXNlcyBhbm90aGVyIGhldXJpc3RpYyBpbiBhZGRpdGlvbiB0byB0aGUgY2FsbC1zaXRlCiAgICAgICAgLy8gYW5ub3RhdGlvbjogaWYgdGhlIGNhbGwtc2l0ZSBpcyBub24tZHluYW1pYyBhbmQgdGhlIGludGVyZmFjZSB0YXJnZXQgZG9lcwogICAgICAgIC8vIG5vdCBleGlzdCBpbiB0aGUgcGFyZW50IGNoYWluIG9mIF9TbWkgKGludCBpcyB1c2VkIGFzIGFuIGFwcHJveG1pYXRpb24KICAgICAgICAvLyBoZXJlKSwgdGhlbiB0aGUgcmVjZWl2ZXIgY2Fubm90IGJlIF9TbWkuIFRoaXMgaGV1cmlzdGljIGNvdmVycyBtb3N0CiAgICAgICAgLy8gY2FzZXMsIHNvIHdlIHNraXAgdGhlc2UgdG8gYXZvaWQgc2hvd2VyaW5nIHRoZSBBU1Qgd2l0aCBhbm5vdGF0aW9ucy4KICAgICAgICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwgfHwKICAgICAgICAgICAgX3R5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUuaGllcmFyY2h5LmlzU3VidHlwZU9mKAogICAgICAgICAgICAgICAgX3R5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUuY29yZVR5cGVzLmludENsYXNzLAogICAgICAgICAgICAgICAgaW50ZXJmYWNlVGFyZ2V0LmVuY2xvc2luZ0NsYXNzKSkgewogICAgICAgICAgbWFya1JlY2VpdmVyTm90SW50ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgY2FsbCBpcyBub3QgbWFya2VkIGFzICdpc1Jlc3VsdFVzZWQnLCB0aGUgJ3Jlc3VsdFR5cGUnIHdpbGwKICAgIC8vIG5vdCBiZSBvYnNlcnZlZCAoaS5lLiwgaXQgd2lsbCBhbHdheXMgYmUgRW1wdHlUeXBlKS4gVGhpcyBpcyB0aGUKICAgIC8vIGNhc2UgZXZlbiBpZiB0aGUgcmVzdWx0IGFjdXRhbGx5IG1pZ2h0IGJlIHVzZWQgYnV0IGlzIG5vdCB1c2VkIGJ5CiAgICAvLyB0aGUgc3VtbWFyeSwgZS5nLiBpZiB0aGUgcmVzdWx0IGlzIGFuIGFyZ3VtZW50IHRvIGEgY2xvc3VyZSBjYWxsLgogICAgLy8gVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHBhc3MgaW4gJ051bGxhYmxlVHlwZShBbnlUeXBlKScgYXMgdGhlCiAgICAvLyBpbmZlcnJlZCByZXN1bHQgdHlwZSBoZXJlIChzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQgaXQgYWN0dWFsbHkKICAgIC8vIGlzKS4KICAgIGZpbmFsIFR5cGUgcmVzdWx0VHlwZSA9IGNhbGxTaXRlLmlzUmVzdWx0VXNlZAogICAgICAgID8gY2FsbFNpdGUucmVzdWx0VHlwZQogICAgICAgIDogTnVsbGFibGVUeXBlKGNvbnN0IEFueVR5cGUoKSk7CgogICAgaWYgKG1hcmtTa2lwQ2hlY2sgfHwgbWFya1JlY2VpdmVyTm90SW50IHx8IGNhbGxTaXRlLmlzUmVzdWx0VXNlZCkgewogICAgICBfc2V0SW5mZXJyZWRUeXBlKG5vZGUsIHJlc3VsdFR5cGUsCiAgICAgICAgICBza2lwQ2hlY2s6IG1hcmtTa2lwQ2hlY2ssIHJlY2VpdmVyTm90SW50OiBtYXJrUmVjZWl2ZXJOb3RJbnQpOwogICAgfQogIH0KCiAgdm9pZCBfYW5ub3RhdGVNZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKF90eXBlRmxvd0FuYWx5c2lzLmlzTWVtYmVyVXNlZChtZW1iZXIpKSB7CiAgICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgICBfc2V0SW5mZXJyZWRUeXBlKG1lbWJlciwgX3R5cGVGbG93QW5hbHlzaXMuZmllbGRUeXBlKG1lbWJlcikpOwogICAgICB9IGVsc2UgewogICAgICAgIEFyZ3M8VHlwZT4gYXJnVHlwZXMgPSBfdHlwZUZsb3dBbmFseXNpcy5hcmd1bWVudFR5cGVzKG1lbWJlcik7CiAgICAgICAgZmluYWwgdW5jaGVja2VkUGFyYW1ldGVycyA9CiAgICAgICAgICAgIF90eXBlRmxvd0FuYWx5c2lzLnVuY2hlY2tlZFBhcmFtZXRlcnMobWVtYmVyKTsKICAgICAgICBhc3NlcnR4KGFyZ1R5cGVzICE9IG51bGwpOwoKICAgICAgICBmaW5hbCBpbnQgZmlyc3RQYXJhbUluZGV4ID0KICAgICAgICAgICAgbnVtVHlwZVBhcmFtcyhtZW1iZXIpICsgKGhhc1JlY2VpdmVyQXJnKG1lbWJlcikgPyAxIDogMCk7CgogICAgICAgIGZpbmFsIHBvc2l0aW9uYWxQYXJhbXMgPSBtZW1iZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICAgICAgYXNzZXJ0eChhcmdUeXBlcy5wb3NpdGlvbmFsQ291bnQgPT0KICAgICAgICAgICAgZmlyc3RQYXJhbUluZGV4ICsgcG9zaXRpb25hbFBhcmFtcy5sZW5ndGgpOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIF9zZXRJbmZlcnJlZFR5cGUoCiAgICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtc1tpXSwgYXJnVHlwZXMudmFsdWVzW2ZpcnN0UGFyYW1JbmRleCArIGldLAogICAgICAgICAgICAgIHNraXBDaGVjazogdW5jaGVja2VkUGFyYW1ldGVycy5jb250YWlucyhwb3NpdGlvbmFsUGFyYW1zW2ldKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBUT0RPKGRhcnRidWcuY29tLzMyMjkyKTogbWFrZSBzdXJlIHBhcmFtZXRlcnMgYXJlIHNvcnRlZCBpbiBrZXJuZWwKICAgICAgICAvLyBBU1QgYW5kIGl0ZXJhdGUgcGFyYW1ldGVycyBpbiBwYXJhbGxlbCwgd2l0aG91dCBsb29rdXAuCiAgICAgICAgZmluYWwgbmFtZXMgPSBhcmdUeXBlcy5uYW1lczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBwYXJhbSA9IGZpbmROYW1lZFBhcmFtZXRlcihtZW1iZXIuZnVuY3Rpb24sIG5hbWVzW2ldKTsKICAgICAgICAgIGFzc2VydHgocGFyYW0gIT0gbnVsbCk7CiAgICAgICAgICBfc2V0SW5mZXJyZWRUeXBlKHBhcmFtLAogICAgICAgICAgICAgIGFyZ1R5cGVzLnZhbHVlc1tmaXJzdFBhcmFtSW5kZXggKyBwb3NpdGlvbmFsUGFyYW1zLmxlbmd0aCArIGldLAogICAgICAgICAgICAgIHNraXBDaGVjazogdW5jaGVja2VkUGFyYW1ldGVycy5jb250YWlucyhwYXJhbSkpOwogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogZmlndXJlIG91dCBob3cgdG8gcGFzcyByZWNlaXZlciB0eXBlLgogICAgICB9CiAgICB9IGVsc2UgaWYgKCFtZW1iZXIuaXNBYnN0cmFjdCAmJgogICAgICAgICFmaWVsZE1vcnBoZXIuaXNFeHRyYU1lbWJlcldpdGhSZWFjaGFibGVCb2R5KG1lbWJlcikpIHsKICAgICAgX3NldFVucmVhY2hhYmxlKG1lbWJlcik7CiAgICB9CgogICAgLy8gV2UgbmVlZCB0byBhdHRhY2ggUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhIHRvIGFsbCBtZW1iZXJzLCBldmVuCiAgICAvLyB1bnJlYWNoYWJsZSBvbmVzLCBzaW5jZSBhbiB1bnJlYWNoYWJsZSBtZW1iZXIgY291bGQgc3RpbGwgYmUgdXNlZCBhcyBhbgogICAgLy8gaW50ZXJmYWNlIHRhcmdldCwgYW5kIHRhYmxlIGRpc3BhdGNoIGNhbGxzIG5lZWQgc2VsZWN0b3IgSURzIGZvciBhbGwKICAgIC8vIGludGVyZmFjZSB0YXJnZXRzLgogICAgaWYgKG1lbWJlci5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIGZpbmFsIG9yaWdpbmFsID0gZmllbGRNb3JwaGVyLmdldE9yaWdpbmFsTWVtYmVyKG1lbWJlcik7CiAgICAgIGZpbmFsIGF0dHJzID0gbmV3IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSgKICAgICAgICAgIG1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6CiAgICAgICAgICAgICAgX3R5cGVGbG93QW5hbHlzaXMuaXNDYWxsZWREeW5hbWljYWxseShvcmlnaW5hbCksCiAgICAgICAgICBnZXR0ZXJDYWxsZWREeW5hbWljYWxseToKICAgICAgICAgICAgICBfdHlwZUZsb3dBbmFseXNpcy5pc0dldHRlckNhbGxlZER5bmFtaWNhbGx5KG9yaWdpbmFsKSwKICAgICAgICAgIGhhc1RoaXNVc2VzOiBfdHlwZUZsb3dBbmFseXNpcy5pc0NhbGxlZFZpYVRoaXMob3JpZ2luYWwpLAogICAgICAgICAgaGFzTm9uVGhpc1VzZXM6IF90eXBlRmxvd0FuYWx5c2lzLmlzQ2FsbGVkTm90VmlhVGhpcyhvcmlnaW5hbCksCiAgICAgICAgICBoYXNUZWFyT2ZmVXNlczogX3R5cGVGbG93QW5hbHlzaXMuaXNUZWFyT2ZmVGFrZW4ob3JpZ2luYWwpLAogICAgICAgICAgbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOgogICAgICAgICAgICAgIF90YWJsZVNlbGVjdG9yQXNzaWduZXIubWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkKG1lbWJlciksCiAgICAgICAgICBnZXR0ZXJTZWxlY3RvcklkOiBfdGFibGVTZWxlY3RvckFzc2lnbmVyLmdldHRlclNlbGVjdG9ySWQobWVtYmVyKSk7CiAgICAgIF9wcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEubWFwcGluZ1ttZW1iZXJdID0gYXR0cnM7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIF9hbm5vdGF0ZU1lbWJlcihub2RlKTsKICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3Iobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgX2Fubm90YXRlTWVtYmVyKG5vZGUpOwogICAgc3VwZXIudmlzaXRQcm9jZWR1cmUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIF9hbm5vdGF0ZU1lbWJlcihub2RlKTsKICAgIHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBfYW5ub3RhdGVDYWxsU2l0ZShub2RlLCBub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICBzdXBlci52aXNpdE1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIF9hbm5vdGF0ZUNhbGxTaXRlKG5vZGUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgIHN1cGVyLnZpc2l0UHJvcGVydHlHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBfYW5ub3RhdGVDYWxsU2l0ZShub2RlLCBub2RlLnRhcmdldCk7CiAgICBzdXBlci52aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIF9hbm5vdGF0ZUNhbGxTaXRlKG5vZGUsIG5vZGUudGFyZ2V0KTsKICAgIHN1cGVyLnZpc2l0RGlyZWN0UHJvcGVydHlHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgX2Fubm90YXRlQ2FsbFNpdGUobm9kZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgc3VwZXIudmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBfYW5ub3RhdGVDYWxsU2l0ZShub2RlLCBub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICBzdXBlci52aXNpdFN1cGVyUHJvcGVydHlHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBfYW5ub3RhdGVDYWxsU2l0ZShub2RlLCBub2RlLnRhcmdldCk7CiAgICBzdXBlci52aXNpdFN0YXRpY0ludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgX2Fubm90YXRlQ2FsbFNpdGUobm9kZSwgbm9kZS50YXJnZXQpOwogICAgc3VwZXIudmlzaXRTdGF0aWNHZXQobm9kZSk7CiAgfQp9CgovLy8gVHJlZSBzaGFraW5nIGJhc2VkIG9uIHJlc3VsdHMgb2YgdHlwZSBmbG93IGFuYWx5c2lzIChURkEpLgovLy8KLy8vIFRGQSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhbGxvY2F0ZWQgY2xhc3NlcyBhbmQgcmVhY2hhYmxlIG1lbWJlcgovLy8gYm9kaWVzLiBIb3dldmVyLCBpdCBpcyBub3QgZW5vdWdoIHRvIHBlcmZvcm0gdHJlZSBzaGFraW5nIGluIG9uZSBwYXNzOgovLy8gd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGNsYXNzZXMsIG1lbWJlcnMgYW5kIHR5cGVkZWZzIGFyZSB1c2VkCi8vLyBpbiB0eXBlcywgaW50ZXJmYWNlIHRhcmdldHMgYW5kIGFubm90YXRpb25zLgovLy8KLy8vIFNvLCB0cmVlIHNoYWtpbmcgaXMgcGVyZm9ybWVkIGluIDIgcGFzc2VzOgovLy8KLy8vICogUGFzcyAxIHZpc2l0cyBkZWNsYXJhdGlvbnMgb2YgY2xhc3NlcyBhbmQgbWVtYmVycywgYW5kIGRpdmVzIGRlZXAgaW50bwovLy8gICBib2RpZXMgb2YgcmVhY2hhYmxlIG1lbWJlcnMuIEl0IGNvbGxlY3RzIHNldHMgb2YgdXNlZCBjbGFzc2VzLCBtZW1iZXJzCi8vLyAgIGFuZCB0eXBlZGVmcy4gQWxzbywgd2hpbGUgdmlzaXRpbmcgYm9kaWVzIG9mIHJlYWNoYWJsZSBtZW1iZXJzLCBpdAovLy8gICB0cmFuc2Zvcm1zIHVucmVhY2hhYmxlIGNhbGxzIGludG8gJ3Rocm93JyBleHByZXNzaW9ucy4KLy8vCi8vLyAqIFBhc3MgMiByZW1vdmVzIHVudXNlZCBjbGFzc2VzIGFuZCBtZW1iZXJzLCBhbmQgcmVwbGFjZXMgYm9kaWVzIG9mCi8vLyAgIHVzZWQgYnV0IHVucmVhY2hhYmxlIG1lbWJlcnMuCi8vLwpjbGFzcyBUcmVlU2hha2VyIHsKICBmaW5hbCBUeXBlRmxvd0FuYWx5c2lzIHR5cGVGbG93QW5hbHlzaXM7CiAgZmluYWwgU2V0PENsYXNzPiBfdXNlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogIGZpbmFsIFNldDxDbGFzcz4gX2NsYXNzZXNVc2VkSW5UeXBlID0gbmV3IFNldDxDbGFzcz4oKTsKICBmaW5hbCBTZXQ8TWVtYmVyPiBfdXNlZE1lbWJlcnMgPSBuZXcgU2V0PE1lbWJlcj4oKTsKICBmaW5hbCBTZXQ8RXh0ZW5zaW9uPiBfdXNlZEV4dGVuc2lvbnMgPSBuZXcgU2V0PEV4dGVuc2lvbj4oKTsKICBmaW5hbCBTZXQ8VHlwZWRlZj4gX3VzZWRUeXBlZGVmcyA9IG5ldyBTZXQ8VHlwZWRlZj4oKTsKICBGaWVsZE1vcnBoZXIgZmllbGRNb3JwaGVyOwogIF9UcmVlU2hha2VyVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3I7CiAgX1RyZWVTaGFrZXJDb25zdGFudFZpc2l0b3IgY29uc3RhbnRWaXNpdG9yOwogIF9UcmVlU2hha2VyUGFzczEgX3Bhc3MxOwogIF9UcmVlU2hha2VyUGFzczIgX3Bhc3MyOwoKICBUcmVlU2hha2VyKENvbXBvbmVudCBjb21wb25lbnQsIHRoaXMudHlwZUZsb3dBbmFseXNpcykgewogICAgZmllbGRNb3JwaGVyID0gbmV3IEZpZWxkTW9ycGhlcih0aGlzKTsKICAgIHR5cGVWaXNpdG9yID0gbmV3IF9UcmVlU2hha2VyVHlwZVZpc2l0b3IodGhpcyk7CiAgICBjb25zdGFudFZpc2l0b3IgPSBuZXcgX1RyZWVTaGFrZXJDb25zdGFudFZpc2l0b3IodGhpcywgdHlwZVZpc2l0b3IpOwogICAgX3Bhc3MxID0gbmV3IF9UcmVlU2hha2VyUGFzczEodGhpcyk7CiAgICBfcGFzczIgPSBuZXcgX1RyZWVTaGFrZXJQYXNzMih0aGlzKTsKICB9CgogIHRyYW5zZm9ybUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBfcGFzczEudHJhbnNmb3JtKGNvbXBvbmVudCk7CiAgICBfcGFzczIudHJhbnNmb3JtKGNvbXBvbmVudCk7CiAgfQoKICBib29sIGlzQ2xhc3NSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoQ2xhc3MgYykgPT4KICAgICAgdHlwZUZsb3dBbmFseXNpcy5uYXRpdmVDb2RlT3JhY2xlLmlzQ2xhc3NSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoYyk7CiAgYm9vbCBpc0NsYXNzVXNlZChDbGFzcyBjKSA9PiBfdXNlZENsYXNzZXMuY29udGFpbnMoYyk7CiAgYm9vbCBpc0NsYXNzVXNlZEluVHlwZShDbGFzcyBjKSA9PiBfY2xhc3Nlc1VzZWRJblR5cGUuY29udGFpbnMoYyk7CiAgYm9vbCBpc0NsYXNzQWxsb2NhdGVkKENsYXNzIGMpID0+IHR5cGVGbG93QW5hbHlzaXMuaXNDbGFzc0FsbG9jYXRlZChjKTsKICBib29sIGlzTWVtYmVyVXNlZChNZW1iZXIgbSkgPT4gX3VzZWRNZW1iZXJzLmNvbnRhaW5zKG0pOwogIGJvb2wgaXNFeHRlbnNpb25Vc2VkKEV4dGVuc2lvbiBlKSA9PiBfdXNlZEV4dGVuc2lvbnMuY29udGFpbnMoZSk7CiAgYm9vbCBpc01lbWJlckJvZHlSZWFjaGFibGUoTWVtYmVyIG0pID0+CiAgICAgIHR5cGVGbG93QW5hbHlzaXMuaXNNZW1iZXJVc2VkKG0pIHx8CiAgICAgIGZpZWxkTW9ycGhlci5pc0V4dHJhTWVtYmVyV2l0aFJlYWNoYWJsZUJvZHkobSk7CiAgYm9vbCBpc0ZpZWxkSW5pdGlhbGl6ZXJSZWFjaGFibGUoRmllbGQgZikgPT4KICAgICAgdHlwZUZsb3dBbmFseXNpcy5pc0ZpZWxkSW5pdGlhbGl6ZXJVc2VkKGYpOwogIGJvb2wgaXNGaWVsZEdldHRlclJlYWNoYWJsZShGaWVsZCBmKSA9PiB0eXBlRmxvd0FuYWx5c2lzLmlzRmllbGRHZXR0ZXJVc2VkKGYpOwogIGJvb2wgaXNGaWVsZFNldHRlclJlYWNoYWJsZShGaWVsZCBmKSA9PiB0eXBlRmxvd0FuYWx5c2lzLmlzRmllbGRTZXR0ZXJVc2VkKGYpOwogIGJvb2wgaXNNZW1iZXJSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoTWVtYmVyIG0pID0+CiAgICAgIHR5cGVGbG93QW5hbHlzaXMubmF0aXZlQ29kZU9yYWNsZS5pc01lbWJlclJlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZShtKTsKICBib29sIGlzVHlwZWRlZlVzZWQoVHlwZWRlZiB0KSA9PiBfdXNlZFR5cGVkZWZzLmNvbnRhaW5zKHQpOwoKICBib29sIHJldGFpbkZpZWxkKEZpZWxkIGYpID0+CiAgICAgIGlzRmllbGRHZXR0ZXJSZWFjaGFibGUoZikgfHwKICAgICAgKGYuaW5pdGlhbGl6ZXIgIT0gbnVsbCAmJgogICAgICAgICAgaXNGaWVsZEluaXRpYWxpemVyUmVhY2hhYmxlKGYpICYmCiAgICAgICAgICBtYXlIYXZlU2lkZUVmZmVjdHMoZi5pbml0aWFsaXplcikpIHx8CiAgICAgIChmLmlzTGF0ZSAmJiBmLmlzRmluYWwpIHx8CiAgICAgIGlzTWVtYmVyUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlKGYpOwoKICB2b2lkIGFkZENsYXNzVXNlZEluVHlwZShDbGFzcyBjKSB7CiAgICBpZiAoX2NsYXNzZXNVc2VkSW5UeXBlLmFkZChjKSkgewogICAgICBpZiAoa1ByaW50RGVidWcpIHsKICAgICAgICBkZWJ1Z1ByaW50KCdDbGFzcyAke2MubmFtZX0gdXNlZCBpbiB0eXBlJyk7CiAgICAgIH0KICAgICAgX3VzZWRDbGFzc2VzLmFkZChjKTsKICAgICAgdmlzaXRJdGVyYWJsZShjLnN1cGVycywgdHlwZVZpc2l0b3IpOwogICAgICB0cmFuc2Zvcm1MaXN0KGMudHlwZVBhcmFtZXRlcnMsIF9wYXNzMSwgYyk7CiAgICAgIHRyYW5zZm9ybUxpc3QoYy5hbm5vdGF0aW9ucywgX3Bhc3MxLCBjKTsKICAgICAgLy8gUHJlc2VydmUgTlNNIGZvcndhcmRlcnMuIFRoZXkgYXJlIG92ZXJsb29rZWQgYnkgVEZBIC8gdHJlZSBzaGFrZXIKICAgICAgLy8gYXMgdGhleSBhcmUgYWJzdHJhY3QgYW5kIGRvbid0IGhhdmUgYSBib2R5LgogICAgICBmb3IgKFByb2NlZHVyZSBwIGluIGMucHJvY2VkdXJlcykgewogICAgICAgIGlmIChwLmlzQWJzdHJhY3QgJiYgcC5pc05vU3VjaE1ldGhvZEZvcndhcmRlcikgewogICAgICAgICAgYWRkVXNlZE1lbWJlcihwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgYWRkVXNlZE1lbWJlcihNZW1iZXIgbSkgewogICAgaWYgKF91c2VkTWVtYmVycy5hZGQobSkpIHsKICAgICAgZmluYWwgZW5jbG9zaW5nQ2xhc3MgPSBtLmVuY2xvc2luZ0NsYXNzOwogICAgICBpZiAoZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgIGlmIChrUHJpbnREZWJ1ZykgewogICAgICAgICAgZGVidWdQcmludCgnTWVtYmVyICRtIGZyb20gY2xhc3MgJHtlbmNsb3NpbmdDbGFzcy5uYW1lfSBpcyB1c2VkJyk7CiAgICAgICAgfQogICAgICAgIF91c2VkQ2xhc3Nlcy5hZGQoZW5jbG9zaW5nQ2xhc3MpOwogICAgICB9CgogICAgICBGdW5jdGlvbk5vZGUgZnVuYyA9IG51bGw7CiAgICAgIGlmIChtIGlzIEZpZWxkKSB7CiAgICAgICAgbS50eXBlLmFjY2VwdCh0eXBlVmlzaXRvcik7CiAgICAgIH0gZWxzZSBpZiAobSBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBmdW5jID0gbS5mdW5jdGlvbjsKICAgICAgICBpZiAobS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgIG0uZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCA9IGZpZWxkTW9ycGhlci5hZGp1c3RJbnN0YW5jZUNhbGxUYXJnZXQoCiAgICAgICAgICAgICAgbS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0LAogICAgICAgICAgICAgIGlzU2V0dGVyOiBtLmlzU2V0dGVyKTsKICAgICAgICAgIGFkZFVzZWRNZW1iZXIobS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgaWYgKG0uZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICAgICAgbS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldCA9IGZpZWxkTW9ycGhlcgogICAgICAgICAgICAgIC5hZGp1c3RJbnN0YW5jZUNhbGxUYXJnZXQobS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldCwKICAgICAgICAgICAgICAgICAgaXNTZXR0ZXI6IG0uaXNTZXR0ZXIpOwogICAgICAgICAgYWRkVXNlZE1lbWJlcihtLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobSBpcyBDb25zdHJ1Y3RvcikgewogICAgICAgIGZ1bmMgPSBtLmZ1bmN0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93ICdVbmV4cGVjdGVkIG1lbWJlciAke20ucnVudGltZVR5cGV9OiAkbSc7CiAgICAgIH0KCiAgICAgIGlmIChmdW5jICE9IG51bGwpIHsKICAgICAgICB0cmFuc2Zvcm1MaXN0KGZ1bmMudHlwZVBhcmFtZXRlcnMsIF9wYXNzMSwgZnVuYyk7CiAgICAgICAgdHJhbnNmb3JtTGlzdChmdW5jLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCBfcGFzczEsIGZ1bmMpOwogICAgICAgIHRyYW5zZm9ybUxpc3QoZnVuYy5uYW1lZFBhcmFtZXRlcnMsIF9wYXNzMSwgZnVuYyk7CiAgICAgICAgZnVuYy5yZXR1cm5UeXBlLmFjY2VwdCh0eXBlVmlzaXRvcik7CiAgICAgIH0KCiAgICAgIHRyYW5zZm9ybUxpc3QobS5hbm5vdGF0aW9ucywgX3Bhc3MxLCBtKTsKCiAgICAgIC8vIElmIHRoZSBtZW1iZXIgaXMga2VwdCBhbGl2ZSB3ZSBuZWVkIHRvIGtlZXAgdGhlIGV4dGVuc2lvbiBhbGl2ZS4KICAgICAgaWYgKG0uaXNFeHRlbnNpb25NZW1iZXIpIHsKICAgICAgICAvLyBUaGUgQVNUIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIFtFeHRlbnNpb25dIGZvciBbbV0uCiAgICAgICAgZmluYWwgZXh0ZW5zaW9uID0gbS5lbmNsb3NpbmdMaWJyYXJ5LmV4dGVuc2lvbnMuZmlyc3RXaGVyZSgoZXh0ZW5zaW9uKSB7CiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLm1lbWJlcnMKICAgICAgICAgICAgICAuYW55KChkZXNjcmlwdG9yKSA9PiBkZXNjcmlwdG9yLm1lbWJlci5hc01lbWJlciA9PSBtKTsKICAgICAgICB9LCBvckVsc2U6ICgpID0+IG51bGwpOwogICAgICAgIGFzc2VydHgoZXh0ZW5zaW9uICE9IG51bGwpOwoKICAgICAgICAvLyBFbnN1cmUgd2UgcmV0YWluIHRoZSBbRXh0ZW5zaW9uXSBpdHNlbGYgKHRob3VnaCBtZW1iZXJzIG1pZ2h0IGJlCiAgICAgICAgLy8gc2hha2VuKQogICAgICAgIGFkZFVzZWRFeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBhZGRVc2VkRXh0ZW5zaW9uKEV4dGVuc2lvbiBub2RlKSB7CiAgICBpZiAoX3VzZWRFeHRlbnNpb25zLmFkZChub2RlKSkgewogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIF9wYXNzMSwgbm9kZSk7CiAgICAgIG5vZGUub25UeXBlPy5hY2NlcHQodHlwZVZpc2l0b3IpOwogICAgfQogIH0KCiAgdm9pZCBhZGRVc2VkVHlwZWRlZihUeXBlZGVmIHR5cGVkZWYpIHsKICAgIGlmIChfdXNlZFR5cGVkZWZzLmFkZCh0eXBlZGVmKSkgewogICAgICB0cmFuc2Zvcm1MaXN0KHR5cGVkZWYuYW5ub3RhdGlvbnMsIF9wYXNzMSwgdHlwZWRlZik7CiAgICAgIHRyYW5zZm9ybUxpc3QodHlwZWRlZi50eXBlUGFyYW1ldGVycywgX3Bhc3MxLCB0eXBlZGVmKTsKICAgICAgdHJhbnNmb3JtTGlzdCh0eXBlZGVmLnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUsIF9wYXNzMSwgdHlwZWRlZik7CiAgICAgIHRyYW5zZm9ybUxpc3QodHlwZWRlZi5wb3NpdGlvbmFsUGFyYW1ldGVycywgX3Bhc3MxLCB0eXBlZGVmKTsKICAgICAgdHJhbnNmb3JtTGlzdCh0eXBlZGVmLm5hbWVkUGFyYW1ldGVycywgX3Bhc3MxLCB0eXBlZGVmKTsKICAgICAgdHlwZWRlZi50eXBlPy5hY2NlcHQodHlwZVZpc2l0b3IpOwogICAgfQogIH0KfQoKY2xhc3MgRmllbGRNb3JwaGVyIHsKICBmaW5hbCBUcmVlU2hha2VyIHNoYWtlcjsKICBmaW5hbCBTZXQ8TWVtYmVyPiBfZXh0cmFNZW1iZXJzV2l0aFJlYWNoYWJsZUJvZHkgPSA8TWVtYmVyPnt9OwogIGZpbmFsIE1hcDxGaWVsZCwgTWVtYmVyPiBfZ2V0dGVyc0ZvclJlbW92ZWRGaWVsZHMgPSA8RmllbGQsIE1lbWJlcj57fTsKICBmaW5hbCBNYXA8RmllbGQsIE1lbWJlcj4gX3NldHRlcnNGb3JSZW1vdmVkRmllbGRzID0gPEZpZWxkLCBNZW1iZXI+e307CiAgZmluYWwgTWFwPE1lbWJlciwgRmllbGQ+IF9yZW1vdmVkRmllbGRzID0gPE1lbWJlciwgRmllbGQ+e307CgogIEZpZWxkTW9ycGhlcih0aGlzLnNoYWtlcik7CgogIE1lbWJlciBfY3JlYXRlQWNjZXNzb3JGb3JSZW1vdmVkRmllbGQoRmllbGQgZmllbGQsIGJvb2wgaXNTZXR0ZXIpIHsKICAgIGFzc2VydHgoIWZpZWxkLmlzU3RhdGljKTsKICAgIGFzc2VydHgoIXNoYWtlci5yZXRhaW5GaWVsZChmaWVsZCkpOwogICAgUHJvY2VkdXJlIGFjY2Vzc29yOwogICAgaWYgKGlzU2V0dGVyKSB7CiAgICAgIGZpbmFsIGlzQWJzdHJhY3QgPSAhc2hha2VyLmlzRmllbGRTZXR0ZXJSZWFjaGFibGUoZmllbGQpOwogICAgICBmaW5hbCBwYXJhbWV0ZXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigndmFsdWUnLCB0eXBlOiBmaWVsZC50eXBlKQogICAgICAgIC4uaXNDb3ZhcmlhbnQgPSBmaWVsZC5pc0NvdmFyaWFudAogICAgICAgIC4uaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IGZpZWxkLmlzR2VuZXJpY0NvdmFyaWFudEltcGwKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZC5maWxlT2Zmc2V0OwogICAgICBhY2Nlc3NvciA9IG5ldyBQcm9jZWR1cmUoCiAgICAgICAgICBmaWVsZC5uYW1lLAogICAgICAgICAgUHJvY2VkdXJlS2luZC5TZXR0ZXIsCiAgICAgICAgICBuZXcgRnVuY3Rpb25Ob2RlKG51bGwsCiAgICAgICAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IFtwYXJhbWV0ZXJdLCByZXR1cm5UeXBlOiBjb25zdCBWb2lkVHlwZSgpKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWVsZC5maWxlT2Zmc2V0LAogICAgICAgICAgaXNBYnN0cmFjdDogaXNBYnN0cmFjdCwKICAgICAgICAgIGZpbGVVcmk6IGZpZWxkLmZpbGVVcmkpOwogICAgICBpZiAoIWlzQWJzdHJhY3QpIHsKICAgICAgICBfZXh0cmFNZW1iZXJzV2l0aFJlYWNoYWJsZUJvZHkuYWRkKGFjY2Vzc29yKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYWNjZXNzb3IgPSBuZXcgUHJvY2VkdXJlKGZpZWxkLm5hbWUsIFByb2NlZHVyZUtpbmQuR2V0dGVyLAogICAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShudWxsLCByZXR1cm5UeXBlOiBmaWVsZC50eXBlKSwKICAgICAgICAgIGlzQWJzdHJhY3Q6IHRydWUsIGZpbGVVcmk6IGZpZWxkLmZpbGVVcmkpOwogICAgfQogICAgYWNjZXNzb3IuZmlsZU9mZnNldCA9IGZpZWxkLmZpbGVPZmZzZXQ7CiAgICBmaWVsZC5lbmNsb3NpbmdDbGFzcy5hZGRNZW1iZXIoYWNjZXNzb3IpOwogICAgX3JlbW92ZWRGaWVsZHNbYWNjZXNzb3JdID0gZmllbGQ7CiAgICBzaGFrZXIuYWRkVXNlZE1lbWJlcihhY2Nlc3Nvcik7CiAgICByZXR1cm4gYWNjZXNzb3I7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwbGFjZW1lbnQgZm9yIGFuIGluc3RhbmNlIGNhbGwgdGFyZ2V0LgogIC8vLyBJZiBuZWNlc3NhcnksIGNyZWF0ZXMgYSBnZXR0ZXIgb3Igc2V0dGVyIGFzIGEgcmVwbGFjZW1lbnQgaWYgdGFyZ2V0IGlzIGEKICAvLy8gZmllbGQgd2hpY2ggaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCBieSB0aGUgdHJlZSBzaGFrZXIuCiAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZHVyaW5nIHRyZWUgc2hha2VyIHBhc3MgMS4KICBNZW1iZXIgYWRqdXN0SW5zdGFuY2VDYWxsVGFyZ2V0KE1lbWJlciB0YXJnZXQsIHtib29sIGlzU2V0dGVyID0gZmFsc2V9KSB7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkICYmICFzaGFrZXIucmV0YWluRmllbGQodGFyZ2V0KSkgewogICAgICBmaW5hbCB0YXJnZXRzID0KICAgICAgICAgIGlzU2V0dGVyID8gX3NldHRlcnNGb3JSZW1vdmVkRmllbGRzIDogX2dldHRlcnNGb3JSZW1vdmVkRmllbGRzOwogICAgICByZXR1cm4gdGFyZ2V0c1t0YXJnZXRdID8/PQogICAgICAgICAgX2NyZWF0ZUFjY2Vzc29yRm9yUmVtb3ZlZEZpZWxkKHRhcmdldCwgaXNTZXR0ZXIpOwogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIGJvb2wgaXNFeHRyYU1lbWJlcldpdGhSZWFjaGFibGVCb2R5KE1lbWJlciBtZW1iZXIpID0+CiAgICAgIF9leHRyYU1lbWJlcnNXaXRoUmVhY2hhYmxlQm9keS5jb250YWlucyhtZW1iZXIpOwoKICAvLy8gUmV0dXJuIGEgbWVtYmVyIHdoaWNoIHJlcGxhY2VkIFt0YXJnZXRdIGluIGluc3RhbmNlIGNhbGxzLgogIC8vLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBhZnRlciB0cmVlIHNoYWtpbmcgdG8gZGlzY292ZXIgcmVwbGFjZW1lbnQuCiAgTWVtYmVyIGdldE1vcnBoZWRNZW1iZXIoTWVtYmVyIHRhcmdldCwge2Jvb2wgaXNTZXR0ZXIgPSBmYWxzZX0pIHsKICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZpbmFsIHRhcmdldHMgPQogICAgICAgIGlzU2V0dGVyID8gX3NldHRlcnNGb3JSZW1vdmVkRmllbGRzIDogX2dldHRlcnNGb3JSZW1vdmVkRmllbGRzOwogICAgcmV0dXJuIHRhcmdldHNbdGFyZ2V0XSA/PyB0YXJnZXQ7CiAgfQoKICAvLy8gUmV0dXJuIG9yaWdpbmFsIG1lbWJlciB3aGljaCB3YXMgcmVwbGFjZWQgYnkgW3RhcmdldF0gaW4gaW5zdGFuY2UgY2FsbHMuCiAgLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGFmdGVyIHRyZWUgc2hha2luZy4KICBNZW1iZXIgZ2V0T3JpZ2luYWxNZW1iZXIoTWVtYmVyIHRhcmdldCkgewogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIF9yZW1vdmVkRmllbGRzW3RhcmdldF0gPz8gdGFyZ2V0OwogIH0KfQoKLy8vIFZpc2l0cyBEYXJ0IHR5cGVzIGFuZCBjb2xsZWN0cyBhbGwgY2xhc3NlcyBhbmQgdHlwZWRlZnMgdXNlZCBpbiB0eXBlcy4KLy8vIFRoaXMgdmlzaXRvciBpcyB1c2VkIGR1cmluZyBwYXNzIDEgb2YgdHJlZSBzaGFraW5nLiBJdCBpcyBhIHNlcGFyYXRlCi8vLyB2aXNpdG9yIGJlY2F1c2UgW1RyYW5zZm9ybWVyXSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIHRyYXZlcnNlIHR5cGVzLgpjbGFzcyBfVHJlZVNoYWtlclR5cGVWaXNpdG9yIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjxOdWxsPiB7CiAgZmluYWwgVHJlZVNoYWtlciBzaGFrZXI7CgogIF9UcmVlU2hha2VyVHlwZVZpc2l0b3IodGhpcy5zaGFrZXIpOwoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBzaGFrZXIuYWRkQ2xhc3NVc2VkSW5UeXBlKG5vZGUuY2xhc3NOb2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSB7CiAgICBzaGFrZXIuYWRkQ2xhc3NVc2VkSW5UeXBlKG5vZGUuY2xhc3NOb2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgc2hha2VyLmFkZFVzZWRUeXBlZGVmKG5vZGUudHlwZWRlZk5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGZpbmFsIHR5cGVkZWYgPSBub2RlLnR5cGVkZWY7CiAgICBpZiAodHlwZWRlZiAhPSBudWxsKSB7CiAgICAgIHNoYWtlci5hZGRVc2VkVHlwZWRlZih0eXBlZGVmKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgZmluYWwgcGFyZW50ID0gbm9kZS5wYXJhbWV0ZXIucGFyZW50OwogICAgaWYgKHBhcmVudCBpcyBDbGFzcykgewogICAgICBzaGFrZXIuYWRkQ2xhc3NVc2VkSW5UeXBlKHBhcmVudCk7CiAgICB9CiAgfQp9CgovLy8gVGhlIGZpcnN0IHBhc3Mgb2YgW1RyZWVTaGFrZXJdLgovLy8gVmlzaXRzIGFsbCBjbGFzc2VzLCBtZW1iZXJzIGFuZCBib2RpZXMgb2YgcmVhY2hhYmxlIG1lbWJlcnMuCi8vLyBDb2xsZWN0cyBhbGwgdXNlZCBjbGFzc2VzLCBtZW1iZXJzIGFuZCB0eXBlcywgYW5kCi8vLyB0cmFuc2Zvcm1zIHVucmVhY2hhYmxlIGNhbGxzIGludG8gJ3Rocm93JyBleHByZXNzaW9ucy4KY2xhc3MgX1RyZWVTaGFrZXJQYXNzMSBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBUcmVlU2hha2VyIHNoYWtlcjsKICBmaW5hbCBGaWVsZE1vcnBoZXIgZmllbGRNb3JwaGVyOwogIFByb2NlZHVyZSBfdW5zYWZlQ2FzdDsKCiAgX1RyZWVTaGFrZXJQYXNzMSh0aGlzLnNoYWtlcikgOiBmaWVsZE1vcnBoZXIgPSBzaGFrZXIuZmllbGRNb3JwaGVyOwoKICB2b2lkIHRyYW5zZm9ybShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wb25lbnQudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgfQoKICBib29sIF9pc1VucmVhY2hhYmxlKFRyZWVOb2RlIG5vZGUpIHsKICAgIGZpbmFsIGNhbGxTaXRlID0gc2hha2VyLnR5cGVGbG93QW5hbHlzaXMuY2FsbFNpdGUobm9kZSk7CiAgICByZXR1cm4gKGNhbGxTaXRlICE9IG51bGwpICYmICFjYWxsU2l0ZS5pc1JlYWNoYWJsZTsKICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gX2ZsYXR0ZW5Bcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge0V4cHJlc3Npb24gcmVjZWl2ZXJ9KSB7CiAgICBmaW5hbCBhcmdzID0gPEV4cHJlc3Npb24+W107CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICBhcmdzLmFkZChyZWNlaXZlcik7CiAgICB9CiAgICBhcmdzLmFkZEFsbChhcmd1bWVudHMucG9zaXRpb25hbCk7CiAgICBhcmdzLmFkZEFsbChhcmd1bWVudHMubmFtZWQubWFwKChhKSA9PiBhLnZhbHVlKSk7CiAgICByZXR1cm4gYXJnczsKICB9CgogIGJvb2wgX2lzVGhyb3dFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcikgewogICAgd2hpbGUgKGV4cHIgaXMgTGV0KSB7CiAgICAgIGV4cHIgPSAoZXhwciBhcyBMZXQpLmJvZHk7CiAgICB9CiAgICByZXR1cm4gZXhwciBpcyBUaHJvdzsKICB9CgogIFRyZWVOb2RlIF9tYWtlVW5yZWFjaGFibGVDYWxsKExpc3Q8RXhwcmVzc2lvbj4gYXJncykgewogICAgVHJlZU5vZGUgbm9kZTsKICAgIGZpbmFsIGludCBsYXN0ID0gYXJncy5pbmRleFdoZXJlKF9pc1Rocm93RXhwcmVzc2lvbik7CiAgICBpZiAobGFzdCA+PSAwKSB7CiAgICAgIC8vIE9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgVGhyb3cgZXhwcmVzc2lvbi4KICAgICAgLy8gSWdub3JlIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAgICAgIG5vZGUgPSBhcmdzW2xhc3RdOwogICAgICBhcmdzID0gYXJncy5zdWJsaXN0KDAsIGxhc3QpOwogICAgICBTdGF0aXN0aWNzLnRocm93RXhwcmVzc2lvbnNQcnVuZWQrKzsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUgPSBuZXcgVGhyb3cobmV3IFN0cmluZ0xpdGVyYWwoCiAgICAgICAgICAnQXR0ZW1wdCB0byBleGVjdXRlIGNvZGUgcmVtb3ZlZCBieSBEYXJ0IEFPVCBjb21waWxlciAoVEZBKScpKTsKICAgIH0KICAgIGZvciAodmFyIGFyZyBpbiBhcmdzLnJldmVyc2VkKSB7CiAgICAgIGlmIChtYXlIYXZlU2lkZUVmZmVjdHMoYXJnKSkgewogICAgICAgIG5vZGUgPSBuZXcgTGV0KG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIGluaXRpYWxpemVyOiBhcmcpLCBub2RlKTsKICAgICAgfQogICAgfQogICAgU3RhdGlzdGljcy5jYWxsc0Ryb3BwZWQrKzsKICAgIHJldHVybiBub2RlOwogIH0KCiAgVHJlZU5vZGUgX21ha2VVbnJlYWNoYWJsZUluaXRpYWxpemVyKExpc3Q8RXhwcmVzc2lvbj4gYXJncykgewogICAgcmV0dXJuIG5ldyBMb2NhbEluaXRpYWxpemVyKAogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIGluaXRpYWxpemVyOiBfbWFrZVVucmVhY2hhYmxlQ2FsbChhcmdzKSkpOwogIH0KCiAgVHJlZU5vZGUgX3Zpc2l0QXNzZXJ0Tm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAoa1JlbW92ZUFzc2VydHMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgewogICAgbm9kZS5hY2NlcHQoc2hha2VyLnR5cGVWaXNpdG9yKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3VwZXJ0eXBlIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSB7CiAgICBub2RlLmFjY2VwdChzaGFrZXIudHlwZVZpc2l0b3IpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICByZXR1cm4gbm9kZTsgLy8gRG8gbm90IGdvIGRlZXBlci4KICB9CgogIEBvdmVycmlkZQogIEV4dGVuc2lvbiB2aXNpdEV4dGVuc2lvbihFeHRlbnNpb24gbm9kZSkgewogICAgLy8gVGhlIGV4dGVuc2lvbiBjYW4gYmUgY29uc2lkZXJlZCBhIHdlYWsgbm9kZSwgd2UnbGwgb25seSByZXRhaW4gaXQgaWYKICAgIC8vIG5vcm1hbCBjb2RlIHJlZmVyZW5jZXMgYW55IG9mIGl0J3MgbWVtYmVycy4KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBpZiAoc2hha2VyLmlzQ2xhc3NBbGxvY2F0ZWQobm9kZSkgfHwKICAgICAgICBzaGFrZXIuaXNDbGFzc1JlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZShub2RlKSkgewogICAgICBzaGFrZXIuYWRkQ2xhc3NVc2VkSW5UeXBlKG5vZGUpOwogICAgfQogICAgdHJhbnNmb3JtTGlzdChub2RlLmNvbnN0cnVjdG9ycywgdGhpcywgbm9kZSk7CiAgICB0cmFuc2Zvcm1MaXN0KG5vZGUucHJvY2VkdXJlcywgdGhpcywgbm9kZSk7CiAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuZmllbGRzLCB0aGlzLCBub2RlKTsKICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMsIHRoaXMsIG5vZGUpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBpZiAoc2hha2VyLmlzTWVtYmVyQm9keVJlYWNoYWJsZShub2RlKSkgewogICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICB0cmFjZVByaW50KCJWaXNpdGluZyAkbm9kZSIpOwogICAgICB9CiAgICAgIHNoYWtlci5hZGRVc2VkTWVtYmVyKG5vZGUpOwogICAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgfSBlbHNlIGlmIChzaGFrZXIuaXNNZW1iZXJSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUobm9kZSkpIHsKICAgICAgLy8gUHJlc2VydmUgbWVtYmVycyByZWZlcmVuY2VkIGZyb20gbmF0aXZlIGNvZGUgdG8gc2F0aXNmeSBsb29rdXBzLCBldmVuCiAgICAgIC8vIGlmIHRoZXkgYXJlIG5vdCByZWFjaGFibGUuIEFuIGluc3RhbmNlIG1lbWJlciBjb3VsZCBiZSBhZGRlZCB2aWEKICAgICAgLy8gbmF0aXZlIGNvZGUgZW50cnkgcG9pbnQgYnV0IHN0aWxsIHVucmVhY2hhYmxlIGlmIG5vIGluc3RhbmNlcyBvZgogICAgICAvLyBpdHMgZW5jbG9zaW5nIGNsYXNzIGFyZSBhbGxvY2F0ZWQuCiAgICAgIHNoYWtlci5hZGRVc2VkTWVtYmVyKG5vZGUpOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIGlmIChzaGFrZXIucmV0YWluRmllbGQobm9kZSkpIHsKICAgICAgaWYgKGtQcmludFRyYWNlKSB7CiAgICAgICAgdHJhY2VQcmludCgiVmlzaXRpbmcgJG5vZGUiKTsKICAgICAgfQogICAgICBzaGFrZXIuYWRkVXNlZE1lbWJlcihub2RlKTsKICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIGlmIChzaGFrZXIuaXNGaWVsZEluaXRpYWxpemVyUmVhY2hhYmxlKG5vZGUpKSB7CiAgICAgICAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLmluaXRpYWxpemVyID0gX21ha2VVbnJlYWNoYWJsZUNhbGwoW10pLi5wYXJlbnQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChzaGFrZXIuaXNGaWVsZFNldHRlclJlYWNoYWJsZShub2RlKSAmJiAhbm9kZS5pc1N0YXRpYykgewogICAgICAvLyBNYWtlIHN1cmUgc2V0dGVyIGlzIGNyZWF0ZWQgdG8gcmVwbGFjZSB0aGUgZmllbGQgZXZlbiBpZiBmaWVsZCBpcyBub3QKICAgICAgLy8gdXNlZCBhcyBhbiBpbnN0YW5jZSBjYWxsIHRhcmdldC4KICAgICAgZmllbGRNb3JwaGVyLmFkanVzdEluc3RhbmNlQ2FsbFRhcmdldChub2RlLCBpc1NldHRlcjogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBpZiAoX2lzVW5yZWFjaGFibGUobm9kZSkpIHsKICAgICAgcmV0dXJuIF9tYWtlVW5yZWFjaGFibGVDYWxsKAogICAgICAgICAgX2ZsYXR0ZW5Bcmd1bWVudHMobm9kZS5hcmd1bWVudHMsIHJlY2VpdmVyOiBub2RlLnJlY2VpdmVyKSk7CiAgICB9IGVsc2UgewogICAgICBub2RlLmludGVyZmFjZVRhcmdldCA9CiAgICAgICAgICBmaWVsZE1vcnBoZXIuYWRqdXN0SW5zdGFuY2VDYWxsVGFyZ2V0KG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICBzaGFrZXIuYWRkVXNlZE1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBpZiAoX2lzVW5yZWFjaGFibGUobm9kZSkpIHsKICAgICAgcmV0dXJuIF9tYWtlVW5yZWFjaGFibGVDYWxsKFtub2RlLnJlY2VpdmVyXSk7CiAgICB9IGVsc2UgewogICAgICBub2RlLmludGVyZmFjZVRhcmdldCA9CiAgICAgICAgICBmaWVsZE1vcnBoZXIuYWRqdXN0SW5zdGFuY2VDYWxsVGFyZ2V0KG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICBzaGFrZXIuYWRkVXNlZE1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBpZiAoX2lzVW5yZWFjaGFibGUobm9kZSkpIHsKICAgICAgcmV0dXJuIF9tYWtlVW5yZWFjaGFibGVDYWxsKFtub2RlLnJlY2VpdmVyLCBub2RlLnZhbHVlXSk7CiAgICB9IGVsc2UgewogICAgICBub2RlLmludGVyZmFjZVRhcmdldCA9IGZpZWxkTW9ycGhlcgogICAgICAgICAgLmFkanVzdEluc3RhbmNlQ2FsbFRhcmdldChub2RlLmludGVyZmFjZVRhcmdldCwgaXNTZXR0ZXI6IHRydWUpOwogICAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICAgIHNoYWtlci5hZGRVc2VkTWVtYmVyKG5vZGUuaW50ZXJmYWNlVGFyZ2V0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgaWYgKF9pc1VucmVhY2hhYmxlKG5vZGUpKSB7CiAgICAgIHJldHVybiBfbWFrZVVucmVhY2hhYmxlQ2FsbChfZmxhdHRlbkFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cykpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQgPQogICAgICAgICAgZmllbGRNb3JwaGVyLmFkanVzdEluc3RhbmNlQ2FsbFRhcmdldChub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgICAgc2hha2VyLmFkZFVzZWRNZW1iZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoW10pOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQgPQogICAgICAgICAgZmllbGRNb3JwaGVyLmFkanVzdEluc3RhbmNlQ2FsbFRhcmdldChub2RlLmludGVyZmFjZVRhcmdldCk7CiAgICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgICAgc2hha2VyLmFkZFVzZWRNZW1iZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoW25vZGUudmFsdWVdKTsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gZmllbGRNb3JwaGVyCiAgICAgICAgICAuYWRqdXN0SW5zdGFuY2VDYWxsVGFyZ2V0KG5vZGUuaW50ZXJmYWNlVGFyZ2V0LCBpc1NldHRlcjogdHJ1ZSk7CiAgICAgIGlmIChub2RlLmludGVyZmFjZVRhcmdldCAhPSBudWxsKSB7CiAgICAgICAgc2hha2VyLmFkZFVzZWRNZW1iZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoX2ZsYXR0ZW5Bcmd1bWVudHMobm9kZS5hcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydHgoc2hha2VyLmlzTWVtYmVyQm9keVJlYWNoYWJsZShub2RlLnRhcmdldCksIGRldGFpbHM6IG5vZGUudGFyZ2V0KTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoW10pOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFzaGFrZXIuaXNNZW1iZXJCb2R5UmVhY2hhYmxlKG5vZGUudGFyZ2V0KSkgewogICAgICAgIC8vIEFubm90YXRpb25zIGNvdWxkIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBjb25zdGFudCBmaWVsZHMuCiAgICAgICAgYXNzZXJ0eCgobm9kZS50YXJnZXQgaXMgRmllbGQpICYmIChub2RlLnRhcmdldCBhcyBGaWVsZCkuaXNDb25zdCk7CiAgICAgICAgc2hha2VyLmFkZFVzZWRNZW1iZXIobm9kZS50YXJnZXQpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRDb25zdGFudChDb25zdGFudCBub2RlKSB7CiAgICBzaGFrZXIuY29uc3RhbnRWaXNpdG9yLmFuYWx5emVDb25zdGFudChub2RlKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBpZiAoX2lzVW5yZWFjaGFibGUobm9kZSkpIHsKICAgICAgcmV0dXJuIF9tYWtlVW5yZWFjaGFibGVDYWxsKFtub2RlLnZhbHVlXSk7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgICAgYXNzZXJ0eChzaGFrZXIuaXNNZW1iZXJCb2R5UmVhY2hhYmxlKHRhcmdldCksIGRldGFpbHM6IG5vZGUpOwogICAgICBpZiAodGFyZ2V0IGlzIEZpZWxkICYmICFzaGFrZXIucmV0YWluRmllbGQodGFyZ2V0KSkgewogICAgICAgIHJldHVybiBub2RlLnZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoCiAgICAgICAgICBfZmxhdHRlbkFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cywgcmVjZWl2ZXI6IG5vZGUucmVjZWl2ZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydHgoc2hha2VyLmlzTWVtYmVyQm9keVJlYWNoYWJsZShub2RlLnRhcmdldCksIGRldGFpbHM6IG5vZGUpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoW25vZGUucmVjZWl2ZXJdKTsKICAgIH0gZWxzZSB7CiAgICAgIGZpbmFsIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgICBhc3NlcnR4KHNoYWtlci5pc01lbWJlckJvZHlSZWFjaGFibGUodGFyZ2V0KSwgZGV0YWlsczogbm9kZSk7CiAgICAgIGFzc2VydHgodGFyZ2V0IGlzISBGaWVsZCB8fCBzaGFrZXIuaXNGaWVsZEdldHRlclJlYWNoYWJsZSh0YXJnZXQpLAogICAgICAgICAgZGV0YWlsczogbm9kZSk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgaWYgKF9pc1VucmVhY2hhYmxlKG5vZGUpKSB7CiAgICAgIHJldHVybiBfbWFrZVVucmVhY2hhYmxlQ2FsbChbbm9kZS5yZWNlaXZlciwgbm9kZS52YWx1ZV0pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0eChzaGFrZXIuaXNNZW1iZXJCb2R5UmVhY2hhYmxlKG5vZGUudGFyZ2V0KSwgZGV0YWlsczogbm9kZSk7CiAgICAgIG5vZGUudGFyZ2V0ID0KICAgICAgICAgIGZpZWxkTW9ycGhlci5hZGp1c3RJbnN0YW5jZUNhbGxUYXJnZXQobm9kZS50YXJnZXQsIGlzU2V0dGVyOiB0cnVlKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGlmIChfaXNVbnJlYWNoYWJsZShub2RlKSkgewogICAgICByZXR1cm4gX21ha2VVbnJlYWNoYWJsZUNhbGwoX2ZsYXR0ZW5Bcmd1bWVudHMobm9kZS5hcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghc2hha2VyLmlzTWVtYmVyQm9keVJlYWNoYWJsZShub2RlLnRhcmdldCkpIHsKICAgICAgICAvLyBBbm5vdGF0aW9ucyBjb3VsZCBjb250YWluIHJlZmVyZW5jZXMgdG8gY29uc3QgY29uc3RydWN0b3JzLgogICAgICAgIGFzc2VydHgobm9kZS5pc0NvbnN0KTsKICAgICAgICBzaGFrZXIuYWRkVXNlZE1lbWJlcihub2RlLnRhcmdldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgaWYgKF9pc1VucmVhY2hhYmxlKG5vZGUpKSB7CiAgICAgIHJldHVybiBfbWFrZVVucmVhY2hhYmxlSW5pdGlhbGl6ZXIoX2ZsYXR0ZW5Bcmd1bWVudHMobm9kZS5hcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydHgoc2hha2VyLmlzTWVtYmVyQm9keVJlYWNoYWJsZShub2RlLnRhcmdldCksIGRldGFpbHM6IG5vZGUudGFyZ2V0KTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgaWYgKF9pc1VucmVhY2hhYmxlKG5vZGUpKSB7CiAgICAgIHJldHVybiBfbWFrZVVucmVhY2hhYmxlSW5pdGlhbGl6ZXIoX2ZsYXR0ZW5Bcmd1bWVudHMobm9kZS5hcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIENhbid0IGFzc2VydCB0aGF0IG5vZGUudGFyZ2V0IGlzIHVzZWQgZHVlIHRvIHBhcnRpYWwgbWl4aW4gcmVzb2x1dGlvbi4KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgaWYgKF9pc1VucmVhY2hhYmxlKG5vZGUpKSB7CiAgICAgIHJldHVybiBfbWFrZVVucmVhY2hhYmxlSW5pdGlhbGl6ZXIoW25vZGUudmFsdWVdKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydHgoc2hha2VyLmlzTWVtYmVyQm9keVJlYWNoYWJsZShub2RlLmZpZWxkKSwgZGV0YWlsczogbm9kZS5maWVsZCk7CiAgICAgIGlmICghc2hha2VyLnJldGFpbkZpZWxkKG5vZGUuZmllbGQpKSB7CiAgICAgICAgaWYgKG1heUhhdmVTaWRlRWZmZWN0cyhub2RlLnZhbHVlKSkgewogICAgICAgICAgcmV0dXJuIExvY2FsSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsLCBpbml0aWFsaXplcjogbm9kZS52YWx1ZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIF92aXNpdEFzc2VydE5vZGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpIHsKICAgIHJldHVybiBfdmlzaXRBc3NlcnROb2RlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gX3Zpc2l0QXNzZXJ0Tm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgVHlwZUNoZWNrIGNoZWNrID0gc2hha2VyLnR5cGVGbG93QW5hbHlzaXMuZXhwbGljaXRDYXN0KG5vZGUpOwogICAgaWYgKGNoZWNrICE9IG51bGwgJiYgY2hlY2suY2FuQWx3YXlzU2tpcCkgewogICAgICByZXR1cm4gU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIHVuc2FmZUNhc3QsIEFyZ3VtZW50cyhbbm9kZS5vcGVyYW5kXSwgdHlwZXM6IFtub2RlLnR5cGVdKSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIFByb2NlZHVyZSBnZXQgdW5zYWZlQ2FzdCB7CiAgICBfdW5zYWZlQ2FzdCA/Pz0gc2hha2VyLnR5cGVGbG93QW5hbHlzaXMuZW52aXJvbm1lbnQuY29yZVR5cGVzLmluZGV4CiAgICAgICAgLmdldFRvcExldmVsTWVtYmVyKCdkYXJ0Ol9pbnRlcm5hbCcsICd1bnNhZmVDYXN0Jyk7CiAgICBhc3NlcnR4KF91bnNhZmVDYXN0ICE9IG51bGwpOwogICAgcmV0dXJuIF91bnNhZmVDYXN0OwogIH0KfQoKLy8vIFRoZSBzZWNvbmQgcGFzcyBvZiBbVHJlZVNoYWtlcl0uIEl0IGlzIGNhbGxlZCBhZnRlciBzZXQgb2YgdXNlZAovLy8gY2xhc3NlcywgbWVtYmVycyBhbmQgdHlwZWRlZnMgaXMgZGV0ZXJtaW5lZCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuCi8vLyBUaGlzIHBhc3MgdmlzaXRzIGNsYXNzZXMgYW5kIG1lbWJlcnMgYW5kIHJlbW92ZXMgdW51c2VkIGNsYXNzZXMgYW5kIG1lbWJlci4KLy8vIEJvZGllcyBvZiB1bnJlYWNoYWJsZSBidXQgdXNlZCBtZW1iZXJzIGFyZSByZXBsYWNlZCB3aXRoICd0aHJvdycKLy8vIGV4cHJlc3Npb25zLiBUaGlzIHBhc3MgZG9lcyBub3QgZGl2ZSBkZWVwZXIgdGhhbiBtZW1iZXIgbGV2ZWwuCmNsYXNzIF9UcmVlU2hha2VyUGFzczIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgVHJlZVNoYWtlciBzaGFrZXI7CgogIF9UcmVlU2hha2VyUGFzczIodGhpcy5zaGFrZXIpOwoKICB2b2lkIHRyYW5zZm9ybShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBjb21wb25lbnQudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgLy8gVGhlIHRyYW5zZm9ybWVyIEFQSSBkb2VzIG5vdCBpdGVyYXRlIG92ZXIgYExpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHNgLAogICAgLy8gc28gd2UgbWFudWFsbHkgZGVsZXRlIHRoZSByZWZlcmVuY2VzIHRvIHNoYWtlbiBub2Rlcy4KICAgIG5vZGUuYWRkaXRpb25hbEV4cG9ydHMucmVtb3ZlV2hlcmUoKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgICAgZmluYWwgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgICBpZiAobm9kZSBpcyBDbGFzcykgewogICAgICAgIHJldHVybiAhc2hha2VyLmlzQ2xhc3NVc2VkKG5vZGUpOwogICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgVHlwZWRlZikgewogICAgICAgIHJldHVybiAhc2hha2VyLmlzVHlwZWRlZlVzZWQobm9kZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBFeHRlbnNpb24pIHsKICAgICAgICByZXR1cm4gIXNoYWtlci5pc0V4dGVuc2lvblVzZWQobm9kZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICFzaGFrZXIuaXNNZW1iZXJVc2VkKG5vZGUgYXMgTWVtYmVyKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVkZWYgdmlzaXRUeXBlZGVmKFR5cGVkZWYgbm9kZSkgewogICAgcmV0dXJuIHNoYWtlci5pc1R5cGVkZWZVc2VkKG5vZGUpID8gbm9kZSA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzcyB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGlmICghc2hha2VyLmlzQ2xhc3NVc2VkKG5vZGUpKSB7CiAgICAgIGRlYnVnUHJpbnQoJ0Ryb3BwZWQgY2xhc3MgJHtub2RlLm5hbWV9Jyk7CiAgICAgIG5vZGUuY2Fub25pY2FsTmFtZT8udW5iaW5kKCk7CiAgICAgIFN0YXRpc3RpY3MuY2xhc3Nlc0Ryb3BwZWQrKzsKICAgICAgcmV0dXJuIG51bGw7IC8vIFJlbW92ZSB0aGUgY2xhc3MuCiAgICB9CgogICAgaWYgKCFzaGFrZXIuaXNDbGFzc1VzZWRJblR5cGUobm9kZSkpIHsKICAgICAgZGVidWdQcmludCgnRHJvcHBlZCBzdXBlcnMgZnJvbSBjbGFzcyAke25vZGUubmFtZX0nKTsKICAgICAgLy8gVGhlIGNsYXNzIGlzIG9ubHkgYSBuYW1lc3BhY2UgZm9yIHN0YXRpYyBtZW1iZXJzLiAgUmVtb3ZlIGl0cwogICAgICAvLyBoaWVyYXJjaHkgaW5mb3JtYXRpb24uICAgVGhpcyBpcyBtYW5kYXRvcnksIHNpbmNlIHRoZXNlIHJlZmVyZW5jZXMKICAgICAgLy8gbWlnaHQgb3RoZXJ3aXNlIGJlY29tZSBkYW5nbGluZy4KICAgICAgbm9kZS5zdXBlcnR5cGUgPSBzaGFrZXIKICAgICAgICAgIC50eXBlRmxvd0FuYWx5c2lzLmVudmlyb25tZW50LmNvcmVUeXBlcy5vYmplY3RDbGFzcy5hc1Jhd1N1cGVydHlwZTsKICAgICAgbm9kZS5pbXBsZW1lbnRlZFR5cGVzLmNsZWFyKCk7CiAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMuY2xlYXIoKTsKICAgICAgbm9kZS5pc0Fic3RyYWN0ID0gdHJ1ZTsKICAgICAgLy8gTWl4aW4gYXBwbGljYXRpb25zIGNhbm5vdCBoYXZlIHN0YXRpYyBtZW1iZXJzLgogICAgICBhc3NlcnR4KG5vZGUubWl4ZWRJblR5cGUgPT0gbnVsbCk7CiAgICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICAgIH0KCiAgICBpZiAoIXNoYWtlci5pc0NsYXNzQWxsb2NhdGVkKG5vZGUpKSB7CiAgICAgIGRlYnVnUHJpbnQoJ0NsYXNzICR7bm9kZS5uYW1lfSBjb252ZXJ0ZWQgdG8gYWJzdHJhY3QnKTsKICAgICAgbm9kZS5pc0Fic3RyYWN0ID0gdHJ1ZTsKICAgIH0KCiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwoKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8vIFByZXNlcnZlIGluc3RhbmNlIGZpZWxkcyBvZiBlbnVtcyBhcyBWTSByZWxpZXMgb24gdGhlaXIgZXhpc3RlbmNlLgogIGJvb2wgX3ByZXNlcnZlU3BlY2lhbE1lbWJlcihNZW1iZXIgbm9kZSkgPT4KICAgICAgbm9kZSBpcyBGaWVsZCAmJgogICAgICAhbm9kZS5pc1N0YXRpYyAmJgogICAgICBub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYKICAgICAgbm9kZS5lbmNsb3NpbmdDbGFzcy5pc0VudW07CgogIEBvdmVycmlkZQogIE1lbWJlciBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBpZiAoIXNoYWtlci5pc01lbWJlclVzZWQobm9kZSkgJiYgIV9wcmVzZXJ2ZVNwZWNpYWxNZW1iZXIobm9kZSkpIHsKICAgICAgbm9kZS5jYW5vbmljYWxOYW1lPy51bmJpbmQoKTsKICAgICAgU3RhdGlzdGljcy5tZW1iZXJzRHJvcHBlZCsrOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoIXNoYWtlci5pc01lbWJlckJvZHlSZWFjaGFibGUobm9kZSkpIHsKICAgICAgaWYgKG5vZGUgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgLy8gUmVtb3ZlIGJvZHkgb2YgdW51c2VkIG1lbWJlci4KICAgICAgICBpZiAoIW5vZGUuaXNTdGF0aWMgJiYgbm9kZS5lbmNsb3NpbmdDbGFzcy5pc0Fic3RyYWN0KSB7CiAgICAgICAgICBub2RlLmlzQWJzdHJhY3QgPSB0cnVlOwogICAgICAgICAgbm9kZS5mdW5jdGlvbi5ib2R5ID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSWYgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyBub3QgYWJzdHJhY3QsIHRoZSBtZXRob2Qgc2hvdWxkIHN0aWxsCiAgICAgICAgICAvLyBoYXZlIGEgYm9keSBldmVuIGlmIGl0IGNhbiBuZXZlciBiZSBjYWxsZWQuCiAgICAgICAgICBfbWFrZVVucmVhY2hhYmxlQm9keShub2RlLmZ1bmN0aW9uKTsKICAgICAgICB9CiAgICAgICAgbm9kZS5mdW5jdGlvbi5hc3luY01hcmtlciA9IEFzeW5jTWFya2VyLlN5bmM7CiAgICAgICAgbm9kZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlID0gbnVsbDsKICAgICAgICBub2RlLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlID0gbnVsbDsKICAgICAgICBTdGF0aXN0aWNzLm1ldGhvZEJvZGllc0Ryb3BwZWQrKzsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIEZpZWxkKSB7CiAgICAgICAgbm9kZS5pbml0aWFsaXplciA9IG51bGw7CiAgICAgICAgU3RhdGlzdGljcy5maWVsZEluaXRpYWxpemVyc0Ryb3BwZWQrKzsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgICAgX21ha2VVbnJlYWNoYWJsZUJvZHkobm9kZS5mdW5jdGlvbik7CiAgICAgICAgbm9kZS5pbml0aWFsaXplcnMgPSBjb25zdCA8SW5pdGlhbGl6ZXI+W107CiAgICAgICAgU3RhdGlzdGljcy5jb25zdHJ1Y3RvckJvZGllc0Ryb3BwZWQrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBtZW1iZXIgJHtub2RlLnJ1bnRpbWVUeXBlfTogJG5vZGUnOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHRlbnNpb24gdmlzaXRFeHRlbnNpb24oRXh0ZW5zaW9uIG5vZGUpIHsKICAgIGlmIChzaGFrZXIuaXNFeHRlbnNpb25Vc2VkKG5vZGUpKSB7CiAgICAgIGludCB3cml0ZUluZGV4ID0gMDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLm1lbWJlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBmaW5hbCBFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBub2RlLm1lbWJlcnNbaV07CgogICAgICAgIC8vIFRvIGF2b2lkIGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggbWVtYmVycyBhbmQgZXh0ZW5zaW9ucyBhcmUKICAgICAgICAvLyB2aXNpdGVkIGR1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24sIHdlIGhhbmRsZSBib3RoIGNhc2VzOiBlaXRoZXIgdGhlCiAgICAgICAgLy8gbWVtYmVyIHdhcyBhbHJlYWR5IHJlbW92ZWQgb3IgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyLgogICAgICAgIGZpbmFsIFJlZmVyZW5jZSBtZW1iZXJSZWZlcmVuY2UgPSBkZXNjcmlwdG9yLm1lbWJlcjsKICAgICAgICBmaW5hbCBib29sIGlzQm91bmQgPSBtZW1iZXJSZWZlcmVuY2Uubm9kZSAhPSBudWxsOwogICAgICAgIGlmIChpc0JvdW5kICYmIHNoYWtlci5pc01lbWJlclVzZWQobWVtYmVyUmVmZXJlbmNlLm5vZGUpKSB7CiAgICAgICAgICBub2RlLm1lbWJlcnNbd3JpdGVJbmRleCsrXSA9IGRlc2NyaXB0b3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUubWVtYmVycy5sZW5ndGggPSB3cml0ZUluZGV4OwoKICAgICAgLy8gV2Ugb25seSByZXRhaW4gdGhlIGV4dGVuc2lvbiBpZiBhdCBsZWFzdCBvbmUgbWVtYmVyIGlzIHJldGFpbmVkLgogICAgICBhc3NlcnR4KG5vZGUubWVtYmVycy5sZW5ndGggPiAwKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgX21ha2VVbnJlYWNoYWJsZUJvZHkoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBpZiAoZnVuY3Rpb24uYm9keSAhPSBudWxsKSB7CiAgICAgIGZ1bmN0aW9uLmJvZHkgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgVGhyb3cobmV3IFN0cmluZ0xpdGVyYWwoCiAgICAgICAgICAiQXR0ZW1wdCB0byBleGVjdXRlIG1ldGhvZCByZW1vdmVkIGJ5IERhcnQgQU9UIGNvbXBpbGVyIChURkEpIikpKQogICAgICAgIC4ucGFyZW50ID0gZnVuY3Rpb247CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGU7IC8vIERvIG5vdCB0cmF2ZXJzZSBpbnRvIG90aGVyIG5vZGVzLgogIH0KfQoKY2xhc3MgX1RyZWVTaGFrZXJDb25zdGFudFZpc2l0b3IgZXh0ZW5kcyBDb25zdGFudFZpc2l0b3I8TnVsbD4gewogIGZpbmFsIFRyZWVTaGFrZXIgc2hha2VyOwogIGZpbmFsIF9UcmVlU2hha2VyVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3I7CiAgZmluYWwgU2V0PENvbnN0YW50PiBjb25zdGFudHMgPSBuZXcgU2V0PENvbnN0YW50PigpOwogIGZpbmFsIFNldDxJbnN0YW5jZUNvbnN0YW50PiBpbnN0YW5jZUNvbnN0YW50cyA9IG5ldyBTZXQ8SW5zdGFuY2VDb25zdGFudD4oKTsKCiAgX1RyZWVTaGFrZXJDb25zdGFudFZpc2l0b3IodGhpcy5zaGFrZXIsIHRoaXMudHlwZVZpc2l0b3IpOwoKICBhbmFseXplQ29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChjb25zdGFudHMuYWRkKGNvbnN0YW50KSkgewogICAgICBjb25zdGFudC5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHRocm93ICdUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBjb25zdGFudCAiJGNvbnN0YW50IiBpbiBURkEgeWV0ISc7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgY29uc3RhbnQpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBjb25zdGFudCkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBjb25zdGFudCkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBjb25zdGFudCkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBjb25zdGFudCkge30KCiAgQG92ZXJyaWRlCiAgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBjb25zdGFudCkgewogICAgLy8gVGhlIFN5bWJvbCBjbGFzcyBhbmQgaXQncyBfbmFtZSBmaWVsZCBhcmUgYWx3YXlzIHJldGFpbmVkLgogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyAnVGhlIGtlcm5lbDJrZXJuZWwgY29uc3RhbnRzIHRyYW5zZm9ybWF0aW9uIGRlc3VnYXJzIGNvbnN0IG1hcHMhJzsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBjb25zdGFudCkgewogICAgZm9yIChmaW5hbCBDb25zdGFudCBlbnRyeSBpbiBjb25zdGFudC5lbnRyaWVzKSB7CiAgICAgIGFuYWx5emVDb25zdGFudChlbnRyeSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBjb25zdGFudCkgewogICAgaW5zdGFuY2VDb25zdGFudHMuYWRkKGNvbnN0YW50KTsKICAgIHNoYWtlci5hZGRDbGFzc1VzZWRJblR5cGUoY29uc3RhbnQuY2xhc3NOb2RlKTsKICAgIHZpc2l0TGlzdChjb25zdGFudC50eXBlQXJndW1lbnRzLCB0eXBlVmlzaXRvcik7CiAgICBjb25zdGFudC5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIENvbnN0YW50IHZhbHVlKSB7CiAgICAgIHNoYWtlci5hZGRVc2VkTWVtYmVyKGZpZWxkUmVmLmFzRmllbGQpOwogICAgICBhbmFseXplQ29uc3RhbnQodmFsdWUpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHNoYWtlci5hZGRVc2VkTWVtYmVyKGNvbnN0YW50LnByb2NlZHVyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBjb25zdGFudCkgewogICAgYW5hbHl6ZUNvbnN0YW50KGNvbnN0YW50LnRlYXJPZmZDb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBjb25zdGFudCkgewogICAgY29uc3RhbnQudHlwZS5hY2NlcHQodHlwZVZpc2l0b3IpOwogIH0KfQoKYm9vbCBtYXlIYXZlU2lkZUVmZmVjdHMoRXhwcmVzc2lvbiBub2RlKSB7CiAgaWYgKG5vZGUgaXMgQmFzaWNMaXRlcmFsIHx8CiAgICAgIG5vZGUgaXMgQ29uc3RhbnRFeHByZXNzaW9uIHx8CiAgICAgIG5vZGUgaXMgVGhpc0V4cHJlc3Npb24pIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKG5vZGUgaXMgVmFyaWFibGVHZXQgJiYgIW5vZGUudmFyaWFibGUuaXNMYXRlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmIChub2RlIGlzIFN0YXRpY0dldCkgewogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkICYmICF0YXJnZXQuaXNMYXRlKSB7CiAgICAgIGZpbmFsIGluaXRpYWxpemVyID0gdGFyZ2V0LmluaXRpYWxpemVyOwogICAgICBpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCB8fAogICAgICAgICAgaW5pdGlhbGl6ZXIgaXMgQmFzaWNMaXRlcmFsIHx8CiAgICAgICAgICBpbml0aWFsaXplciBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KhUEATk48ATEyAR4BLUM4Qj4vARgVFx4VFRk5KiwzKgEhSQE5Kh49KEk9OTs4SgEWNgFO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L2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJy4uL21ldGFkYXRhL29iZnVzY2F0aW9uX3Byb2hpYml0aW9ucy5kYXJ0JzsKaW1wb3J0ICdwcmFnbWEuZGFydCc7Cgp2b2lkIHRyYW5zZm9ybUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgZmluYWwgcmVwbyA9IG5ldyBPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhUmVwb3NpdG9yeSgpOwogIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkocmVwbyk7CiAgZmluYWwgdmlzaXRvciA9CiAgICAgIE9iZnVzY2F0aW9uUHJvaGliaXRpb25zVmlzaXRvcihDb25zdGFudFByYWdtYUFubm90YXRpb25QYXJzZXIoY29yZVR5cGVzKSk7CiAgdmlzaXRvci52aXNpdENvbXBvbmVudChjb21wb25lbnQpOwogIHJlcG8ubWFwcGluZ1tjb21wb25lbnRdID0gdmlzaXRvci5tZXRhZGF0YTsKfQoKY2xhc3MgT2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNWaXNpdG9yIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgUHJhZ21hQW5ub3RhdGlvblBhcnNlciBwYXJzZXI7CiAgZmluYWwgbWV0YWRhdGEgPSBPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhKCk7CgogIE9iZnVzY2F0aW9uUHJvaGliaXRpb25zVmlzaXRvcih0aGlzLnBhcnNlcik7CgogIHZvaWQgX2FkZElmRW50cnlQb2ludCgKICAgICAgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucywgU3RyaW5nIG5hbWUsIFRyZWVOb2RlIG5vZGUpIHsKICAgIGZvciAodmFyIGFubiBpbiBhbm5vdGF0aW9ucykgewogICAgICBQYXJzZWRQcmFnbWEgcHJhZ21hID0gcGFyc2VyLnBhcnNlUHJhZ21hKGFubik7CiAgICAgIGlmIChwcmFnbWEgaXMgUGFyc2VkRW50cnlQb2ludFByYWdtYSkgewogICAgICAgIG1ldGFkYXRhLnByb3RlY3RlZE5hbWVzLmFkZChuYW1lKTsKICAgICAgICBpZiAobm9kZSBpcyBGaWVsZCkgewogICAgICAgICAgbWV0YWRhdGEucHJvdGVjdGVkTmFtZXMuYWRkKG5hbWUgKyAiPSIpOwogICAgICAgIH0KICAgICAgICBmaW5hbCBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICAgICBpZiAocGFyZW50IGlzIENsYXNzKSB7CiAgICAgICAgICBtZXRhZGF0YS5wcm90ZWN0ZWROYW1lcy5hZGQocGFyZW50Lm5hbWUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDbGFzcyhDbGFzcyBrbGFzcykgewogICAgX2FkZElmRW50cnlQb2ludChrbGFzcy5hbm5vdGF0aW9ucywga2xhc3MubmFtZSwga2xhc3MpOwogICAga2xhc3MudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3IgY3RvcikgewogICAgX2FkZElmRW50cnlQb2ludChjdG9yLmFubm90YXRpb25zLCBjdG9yLm5hbWUubmFtZSwgY3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgcHJvYykgewogICAgX2FkZElmRW50cnlQb2ludChwcm9jLmFubm90YXRpb25zLCBwcm9jLm5hbWUubmFtZSwgcHJvYyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkKEZpZWxkIGZpZWxkKSB7CiAgICBfYWRkSWZFbnRyeVBvaW50KGZpZWxkLmFubm90YXRpb25zLCBmaWVsZC5uYW1lLm5hbWUsIGZpZWxkKTsKICB9Cn0KRABOTjwBPwEiOAE0FgFEQCkSUSUuAgFAJzYBLwEZQiM1LisdMwokHzQKDwgGBAEMHDwfBAEMJz4EAQwjPgQBDBxBBAIBQnBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL29iZnVzY2F0aW9uX3Byb2hpYml0aW9uc19hbm5vdGF0b3IuZGFydF9maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL2NhbGxfc2l0ZV9hbm5vdGF0b3IuZGFydI1XLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRoaXMgdHJhbnNmb3JtYXRpb24gYW5ub3RhdGVzIGNhbGwgc2l0ZXMgd2l0aCB0aGUgcmVjZWl2ZXIgdHlwZS4KLy8gVGhpcyBpcyBkb25lIHRvIGF2b2lkIHJlaW1wbGVtZW50aW5nIFtFeHByZXNzaW9uLmdldFN0YXRpY1R5cGVdIGluCi8vIEMrKy4KLy8gV2UgZG9uJ3QgYW5ub3RhdGUgYWxsIGNhbGwtc2l0ZXMsIGJ1dCBvbmx5IHRob3NlIHdoZXJlIFZNIGNvdWxkIGJlbmVmaXQgZnJvbQovLyBrbm93aW5nIHN0YXRpYyB0eXBlIG9mIHRoZSByZWNlaXZlci4KbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMuY2FsbF9zaXRlX2Fubm90YXRvcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBTdGF0aWNUeXBlQ29udGV4dCwgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICcuLi9tZXRhZGF0YS9jYWxsX3NpdGVfYXR0cmlidXRlcy5kYXJ0JzsKCkNhbGxTaXRlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeSBhZGRSZXBvc2l0b3J5VG8oQ29tcG9uZW50IGNvbXBvbmVudCkgewogIHJldHVybiBjb21wb25lbnQubWV0YWRhdGEucHV0SWZBYnNlbnQoCiAgICAgIENhbGxTaXRlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeS5yZXBvc2l0b3J5VGFnLAogICAgICAoKSA9PiBuZXcgQ2FsbFNpdGVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5KCkpOwp9Cgp2b2lkIHRyYW5zZm9ybUxpYnJhcmllcyhDb21wb25lbnQgY29tcG9uZW50LCBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogIGZpbmFsIHRyYW5zZm9ybWVyID0KICAgICAgbmV3IEFubm90YXRlV2l0aFN0YXRpY1R5cGVzKGNvbXBvbmVudCwgY29yZVR5cGVzLCBoaWVyYXJjaHkpOwogIGxpYnJhcmllcy5mb3JFYWNoKHRyYW5zZm9ybWVyLnZpc2l0TGlicmFyeSk7Cn0KCmNsYXNzIEFubm90YXRlV2l0aFN0YXRpY1R5cGVzIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjxOdWxsPiB7CiAgZmluYWwgQ2FsbFNpdGVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5IF9tZXRhZGF0YTsKICBmaW5hbCBUeXBlRW52aXJvbm1lbnQgZW52OwogIFN0YXRpY1R5cGVDb250ZXh0IF9zdGF0aWNUeXBlQ29udGV4dDsKCiAgQW5ub3RhdGVXaXRoU3RhdGljVHlwZXMoCiAgICAgIENvbXBvbmVudCBjb21wb25lbnQsIENvcmVUeXBlcyBjb3JlVHlwZXMsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkKICAgICAgOiBfbWV0YWRhdGEgPSBhZGRSZXBvc2l0b3J5VG8oY29tcG9uZW50KSwKICAgICAgICBlbnYgPSBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KTsKCiAgQG92ZXJyaWRlCiAgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgewogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbmV3IFN0YXRpY1R5cGVDb250ZXh0KG5vZGUsIGVudik7CiAgICBzdXBlci5kZWZhdWx0TWVtYmVyKG5vZGUpOwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbnVsbDsKICB9CgogIHZvaWQgYW5ub3RhdGVXaXRoVHlwZShUcmVlTm9kZSBub2RlLCBFeHByZXNzaW9uIHJlY2VpdmVyKSB7CiAgICBfbWV0YWRhdGEubWFwcGluZ1tub2RlXSA9IG5ldyBDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YSgKICAgICAgICByZWNlaXZlclR5cGU6IHJlY2VpdmVyLmdldFN0YXRpY1R5cGUoX3N0YXRpY1R5cGVDb250ZXh0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHN1cGVyLnZpc2l0UHJvcGVydHlTZXQobm9kZSk7CgogICAgaWYgKGhhc0dlbmVyaWNDb3ZhcmlhbnRQYXJhbWV0ZXJzKG5vZGUuaW50ZXJmYWNlVGFyZ2V0KSkgewogICAgICBhbm5vdGF0ZVdpdGhUeXBlKG5vZGUsIG5vZGUucmVjZWl2ZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgc3VwZXIudmlzaXRNZXRob2RJbnZvY2F0aW9uKG5vZGUpOwoKICAgIC8vIFRPRE8oMzQxNjIpOiBXZSBkb24ndCBuZWVkIHRvIHNhdmUgdGhlIHR5cGUgaGVyZSBmb3IgY2FsbHMsIGp1c3Qgd2hldGhlcgogICAgLy8gb3Igbm90IGl0J3MgYSBzdGF0aWNhbGx5LWNoZWNrZWQgY2FsbC4KICAgIGlmIChub2RlLm5hbWUubmFtZSA9PSAnY2FsbCcgfHwKICAgICAgICBoYXNHZW5lcmljQ292YXJpYW50UGFyYW1ldGVycyhub2RlLmludGVyZmFjZVRhcmdldCkpIHsKICAgICAgYW5ub3RhdGVXaXRoVHlwZShub2RlLCBub2RlLnJlY2VpdmVyKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm4gW3RydWVdIGlmIHRoZSBnaXZlbiBsaXN0IG9mIFtWYXJpYWJsZURlY2xhcmF0aW9uXSBjb250YWlucwogIC8vLyBhbnkgYW5ub3RhdGVkIHdpdGggZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbC4KICBzdGF0aWMgYm9vbCBjb250YWluc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZGVjbHMpID0+CiAgICAgIGRlY2xzLmFueSgocCkgPT4gcC5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKTsKCiAgLy8vIFJldHVybnMgW3RydWVdIGlmIHRoZSBnaXZlbiBbbWVtYmVyXSBoYXMgYW55IHBhcmFtZXRlcnMgYW5ub3RhdGVkIHdpdGgKICAvLy8gZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCBhdHRyaWJ1dGUuCiAgc3RhdGljIGJvb2wgaGFzR2VuZXJpY0NvdmFyaWFudFBhcmFtZXRlcnMoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgcmV0dXJuIGNvbnRhaW5zR2VuZXJpY0NvdmFyaWFudEltcGwoCiAgICAgICAgICAgICAgbWVtYmVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB8fAogICAgICAgICAgY29udGFpbnNHZW5lcmljQ292YXJpYW50SW1wbChtZW1iZXIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIHJldHVybiBtZW1iZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbDsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmAATk48AURGCFAoMAEiQjguLQEwAUwpOjkCAUY1FkQvAgE/OB0oARtKMDkBDB87Hx8EAT4+QwQBDCciAT8tBgQBDDEnAVAuJD8tBgQBSDFPMgFNKD0fKzdJIiwGARIEAgEzcGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvY2FsbF9zaXRlX2Fubm90YXRvci5kYXJ0aGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdW5yZWFjaGFibGVfY29kZV9lbGltaW5hdGlvbi5kYXJ0k4YvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgovLy8gU2ltcGxlIHVucmVhY2hhYmxlIGNvZGUgZWxpbWluYXRpb246IHJlbW92ZXMgYXNzZXJ0cyBhbmQgaWYgc3RhdGVtZW50cwovLy8gd2l0aCBjb25zdGFudCBjb25kaXRpb25zLiBEb2VzIGEgdmVyeSBsaW1pdGVkIGNvbnN0YW50IGZvbGRpbmcgb2YKLy8vIGxvZ2ljYWwgZXhwcmVzc2lvbnMuCkNvbXBvbmVudCB0cmFuc2Zvcm1Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgYm9vbCBlbmFibGVBc3NlcnRzKSB7CiAgbmV3IFNpbXBsZVVucmVhY2hhYmxlQ29kZUVsaW1pbmF0aW9uKGVuYWJsZUFzc2VydHMpLnZpc2l0Q29tcG9uZW50KGNvbXBvbmVudCk7CiAgcmV0dXJuIGNvbXBvbmVudDsKfQoKY2xhc3MgU2ltcGxlVW5yZWFjaGFibGVDb2RlRWxpbWluYXRpb24gZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgYm9vbCBlbmFibGVBc3NlcnRzOwoKICBTaW1wbGVVbnJlYWNoYWJsZUNvZGVFbGltaW5hdGlvbih0aGlzLmVuYWJsZUFzc2VydHMpOwoKICBib29sIF9pc0Jvb2xDb25zdGFudChFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIG5vZGUgaXMgQm9vbExpdGVyYWwgfHwKICAgICAgKG5vZGUgaXMgQ29uc3RhbnRFeHByZXNzaW9uICYmIG5vZGUuY29uc3RhbnQgaXMgQm9vbENvbnN0YW50KTsKCiAgYm9vbCBfZ2V0Qm9vbENvbnN0YW50VmFsdWUoRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBCb29sTGl0ZXJhbCkgewogICAgICByZXR1cm4gbm9kZS52YWx1ZTsKICAgIH0KICAgIGlmIChub2RlIGlzIENvbnN0YW50RXhwcmVzc2lvbikgewogICAgICBmaW5hbCBjb25zdGFudCA9IG5vZGUuY29uc3RhbnQ7CiAgICAgIGlmIChjb25zdGFudCBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgICByZXR1cm4gY29uc3RhbnQudmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHRocm93ICdFeHBlY3RlZCBib29sIGNvbnN0YW50OiAkbm9kZSc7CiAgfQoKICBFeHByZXNzaW9uIF9jcmVhdGVCb29sTGl0ZXJhbChib29sIHZhbHVlLCBpbnQgZmlsZU9mZnNldCkgPT4KICAgICAgbmV3IEJvb2xMaXRlcmFsKHZhbHVlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CgogIFN0YXRlbWVudCBfbWFrZUVtcHR5QmxvY2tJZk51bGwoU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIG5vZGUgPT0gbnVsbCA/IEJsb2NrKDxTdGF0ZW1lbnQ+W10pIDogbm9kZTsKCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgZmluYWwgY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb247CiAgICBpZiAoX2lzQm9vbENvbnN0YW50KGNvbmRpdGlvbikpIHsKICAgICAgZmluYWwgdmFsdWUgPSBfZ2V0Qm9vbENvbnN0YW50VmFsdWUoY29uZGl0aW9uKTsKICAgICAgcmV0dXJuIHZhbHVlID8gbm9kZS50aGVuIDogbm9kZS5vdGhlcndpc2U7CiAgICB9CiAgICBub2RlLnRoZW4gPSBfbWFrZUVtcHR5QmxvY2tJZk51bGwobm9kZS50aGVuKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBmaW5hbCBjb25kaXRpb24gPSBub2RlLmNvbmRpdGlvbjsKICAgIGlmIChfaXNCb29sQ29uc3RhbnQoY29uZGl0aW9uKSkgewogICAgICBmaW5hbCB2YWx1ZSA9IF9nZXRCb29sQ29uc3RhbnRWYWx1ZShjb25kaXRpb24pOwogICAgICByZXR1cm4gdmFsdWUgPyBub2RlLnRoZW4gOiBub2RlLm90aGVyd2lzZTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXROb3QoTm90IG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBmaW5hbCBvcGVyYW5kID0gbm9kZS5vcGVyYW5kOwogICAgaWYgKF9pc0Jvb2xDb25zdGFudChvcGVyYW5kKSkgewogICAgICByZXR1cm4gX2NyZWF0ZUJvb2xMaXRlcmFsKAogICAgICAgICAgIV9nZXRCb29sQ29uc3RhbnRWYWx1ZShvcGVyYW5kKSwgbm9kZS5maWxlT2Zmc2V0KTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgZmluYWwgbGVmdCA9IG5vZGUubGVmdDsKICAgIGZpbmFsIHJpZ2h0ID0gbm9kZS5yaWdodDsKICAgIGZpbmFsIG9wZXJhdG9yID0gbm9kZS5vcGVyYXRvcjsKICAgIGlmIChfaXNCb29sQ29uc3RhbnQobGVmdCkpIHsKICAgICAgZmluYWwgbGVmdFZhbHVlID0gX2dldEJvb2xDb25zdGFudFZhbHVlKGxlZnQpOwogICAgICBpZiAoX2lzQm9vbENvbnN0YW50KHJpZ2h0KSkgewogICAgICAgIGZpbmFsIHJpZ2h0VmFsdWUgPSBfZ2V0Qm9vbENvbnN0YW50VmFsdWUocmlnaHQpOwogICAgICAgIGlmIChvcGVyYXRvciA9PSAnfHwnKSB7CiAgICAgICAgICByZXR1cm4gX2NyZWF0ZUJvb2xMaXRlcmFsKGxlZnRWYWx1ZSB8fCByaWdodFZhbHVlLCBub2RlLmZpbGVPZmZzZXQpOwogICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT0gJyYmJykgewogICAgICAgICAgcmV0dXJuIF9jcmVhdGVCb29sTGl0ZXJhbChsZWZ0VmFsdWUgJiYgcmlnaHRWYWx1ZSwgbm9kZS5maWxlT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgTG9naWNhbEV4cHJlc3Npb24gb3BlcmF0b3IgJHtvcGVyYXRvcn06ICRub2RlJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGxlZnRWYWx1ZSAmJiBvcGVyYXRvciA9PSAnfHwnKSB7CiAgICAgICAgICByZXR1cm4gX2NyZWF0ZUJvb2xMaXRlcmFsKHRydWUsIG5vZGUuZmlsZU9mZnNldCk7CiAgICAgICAgfSBlbHNlIGlmICghbGVmdFZhbHVlICYmIG9wZXJhdG9yID09ICcmJicpIHsKICAgICAgICAgIHJldHVybiBfY3JlYXRlQm9vbExpdGVyYWwoZmFsc2UsIG5vZGUuZmlsZU9mZnNldCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBpZiAodGFyZ2V0IGlzIEZpZWxkICYmIHRhcmdldC5pc0NvbnN0KSB7CiAgICAgIHRocm93ICdTdGF0aWNHZXQgZnJvbSBjb25zdCBmaWVsZCAkdGFyZ2V0IHNob3VsZCBiZSBldmFsdWF0ZWQgYnkgZnJvbnQtZW5kOiAkbm9kZSc7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIWVuYWJsZUFzc2VydHMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRBc3NlcnRTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpIHsKICAgIGlmICghZW5hYmxlQXNzZXJ0cykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdEFzc2VydEJsb2NrKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICBpZiAoIWVuYWJsZUFzc2VydHMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRBc3NlcnRJbml0aWFsaXplcihub2RlKTsKICB9CgogIC8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZ2VuZXJhdGluZyBgbnVsbGAgYm9kaWVzLgogIC8vIFRyeS9jYXRjaCwgdHJ5L2ZpbmFsbHkgYW5kIHN3aXRjaC9jYXNlIHN0YXRlbWVudHMKICAvLyBhbHdheXMgaGF2ZSBhIEJsb2NrIGluIGEgYm9keSwgc28gdGhlcmUgaXMgbm8KICAvLyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgbnVsbC4KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwogICAgbm9kZS5ib2R5ID0gX21ha2VFbXB0eUJsb2NrSWZOdWxsKG5vZGUuYm9keSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIG5vZGUuYm9keSA9IF9tYWtlRW1wdHlCbG9ja0lmTnVsbChub2RlLmJvZHkpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIG5vZGUuYm9keSA9IF9tYWtlRW1wdHlCbG9ja0lmTnVsbChub2RlLmJvZHkpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIG5vZGUudHJhbnNmb3JtQ2hpbGRyZW4odGhpcyk7CiAgICBub2RlLmJvZHkgPSBfbWFrZUVtcHR5QmxvY2tJZk51bGwobm9kZS5ib2R5KTsKICAgIHJldHVybiBub2RlOwogIH0KfQqArQBOTjwBIgFLRhlIURQCAT0cATgBKx1FATAfGQYmJiYfCAYrBAE/NwE1MgEMMCImJjYxBjIRBAEMOyImJjYxBhEEAQwgIiIkIT0GEQQBDDwiHB4kITUkOSBPJ08RTAoPLTw1PQoIBhEEAQwjIiAtWgYRBAEMOBoTBi0EAQwwGhMGKQQBDDwaEwYvBAEzNzMhAQw2IjIRBAEMMCIyEQQBDDIiMhEEAQw2IjIRBAIBPHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3VucmVhY2hhYmxlX2NvZGVfZWxpbWluYXRpb24uZGFydFtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvYXJncy9saWIvc3JjL2FsbG93X2FueXRoaW5nX3BhcnNlci5kYXJ0iRcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdhcmdfcGFyc2VyLmRhcnQnOwppbXBvcnQgJ2FyZ19yZXN1bHRzLmRhcnQnOwppbXBvcnQgJ29wdGlvbi5kYXJ0JzsKaW1wb3J0ICdwYXJzZXIuZGFydCc7CgovLy8gQW4gQXJnUGFyc2VyIHRoYXQgdHJlYXRzICphbGwgaW5wdXQqIGFzIG5vbi1vcHRpb24gYXJndW1lbnRzLgpjbGFzcyBBbGxvd0FueXRoaW5nUGFyc2VyIGltcGxlbWVudHMgQXJnUGFyc2VyIHsKICBNYXA8U3RyaW5nLCBPcHRpb24+IGdldCBvcHRpb25zID0+IGNvbnN0IHt9OwogIE1hcDxTdHJpbmcsIEFyZ1BhcnNlcj4gZ2V0IGNvbW1hbmRzID0+IGNvbnN0IHt9OwogIGJvb2wgZ2V0IGFsbG93VHJhaWxpbmdPcHRpb25zID0+IGZhbHNlOwogIGJvb2wgZ2V0IGFsbG93c0FueXRoaW5nID0+IHRydWU7CiAgaW50IGdldCB1c2FnZUxpbmVMZW5ndGggPT4gbnVsbDsKCiAgQXJnUGFyc2VyIGFkZENvbW1hbmQoU3RyaW5nIG5hbWUsIFtBcmdQYXJzZXIgcGFyc2VyXSkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQXJnUGFyc2VyLmFsbG93QW55dGhpbmcoKS5hZGRDb21tYW5kcygpIGlzbid0IHN1cHBvcnRlZC4iKTsKICB9CgogIHZvaWQgYWRkRmxhZyhTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBhYmJyLAogICAgICBTdHJpbmcgaGVscCwKICAgICAgYm9vbCBkZWZhdWx0c1RvID0gZmFsc2UsCiAgICAgIGJvb2wgbmVnYXRhYmxlID0gdHJ1ZSwKICAgICAgdm9pZCBjYWxsYmFjayhib29sIHZhbHVlKSwKICAgICAgYm9vbCBoaWRlID0gZmFsc2V9KSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJBcmdQYXJzZXIuYWxsb3dBbnl0aGluZygpLmFkZEZsYWcoKSBpc24ndCBzdXBwb3J0ZWQuIik7CiAgfQoKICB2b2lkIGFkZE9wdGlvbihTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBhYmJyLAogICAgICBTdHJpbmcgaGVscCwKICAgICAgU3RyaW5nIHZhbHVlSGVscCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBhbGxvd2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwLAogICAgICBTdHJpbmcgZGVmYXVsdHNUbywKICAgICAgRnVuY3Rpb24gY2FsbGJhY2ssCiAgICAgIGJvb2wgYWxsb3dNdWx0aXBsZSA9IGZhbHNlLAogICAgICBib29sIHNwbGl0Q29tbWFzLAogICAgICBib29sIGhpZGUgPSBmYWxzZX0pIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkFyZ1BhcnNlci5hbGxvd0FueXRoaW5nKCkuYWRkT3B0aW9uKCkgaXNuJ3Qgc3VwcG9ydGVkLiIpOwogIH0KCiAgdm9pZCBhZGRNdWx0aU9wdGlvbihTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBhYmJyLAogICAgICBTdHJpbmcgaGVscCwKICAgICAgU3RyaW5nIHZhbHVlSGVscCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBhbGxvd2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IGRlZmF1bHRzVG8sCiAgICAgIHZvaWQgY2FsbGJhY2soTGlzdDxTdHJpbmc+IHZhbHVlcyksCiAgICAgIGJvb2wgc3BsaXRDb21tYXMgPSB0cnVlLAogICAgICBib29sIGhpZGUgPSBmYWxzZX0pIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkFyZ1BhcnNlci5hbGxvd0FueXRoaW5nKCkuYWRkTXVsdGlPcHRpb24oKSBpc24ndCBzdXBwb3J0ZWQuIik7CiAgfQoKICB2b2lkIGFkZFNlcGFyYXRvcihTdHJpbmcgdGV4dCkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQXJnUGFyc2VyLmFsbG93QW55dGhpbmcoKS5hZGRTZXBhcmF0b3IoKSBpc24ndCBzdXBwb3J0ZWQuIik7CiAgfQoKICBBcmdSZXN1bHRzIHBhcnNlKEl0ZXJhYmxlPFN0cmluZz4gYXJncykgPT4KICAgICAgUGFyc2VyKG51bGwsIHRoaXMsIGFyZ3MudG9MaXN0KCkpLnBhcnNlKCk7CgogIFN0cmluZyBnZXRVc2FnZSgpID0+IHVzYWdlOwoKICBTdHJpbmcgZ2V0IHVzYWdlID0+ICIiOwoKICBnZXREZWZhdWx0KFN0cmluZyBvcHRpb24pIHsKICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ05vIG9wdGlvbiBuYW1lZCAkb3B0aW9uJyk7CiAgfQoKICBPcHRpb24gZmluZEJ5QWJicmV2aWF0aW9uKFN0cmluZyBhYmJyKSA9PiBudWxsOwp9ClIATk48ARobFhYBQjEvMyojIwE6HEUEARwUEx8dIRwcQQQBHhQTGCAnGRkiGBwcQwQBIxQTGCAnIyofHBxIBAEjHEYEAS0xAR4BGgEeNAQBMgIBK3BhY2thZ2U6YXJncy9zcmMvYWxsb3dfYW55dGhpbmdfcGFyc2VyLmRhcnRMZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2FyZ3MvbGliL3NyYy9wYXJzZXIuZGFydKdWLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnYXJnX3BhcnNlci5kYXJ0JzsKaW1wb3J0ICdhcmdfcGFyc2VyX2V4Y2VwdGlvbi5kYXJ0JzsKaW1wb3J0ICdhcmdfcmVzdWx0cy5kYXJ0JzsKaW1wb3J0ICdvcHRpb24uZGFydCc7CgpmaW5hbCBfc29sb09wdCA9IFJlZ0V4cChyJ14tKFthLXpBLVowLTldKSQnKTsKZmluYWwgX2FiYnJPcHQgPSBSZWdFeHAocideLShbYS16QS1aMC05XSspKC4qKSQnKTsKZmluYWwgX2xvbmdPcHQgPSBSZWdFeHAocideLS0oW2EtekEtWlwtXzAtOV0rKSg9KC4qKSk/JCcpOwoKLy8vIFRoZSBhY3R1YWwgYXJndW1lbnQgcGFyc2luZyBjbGFzcy4KLy8vCi8vLyBVbmxpa2UgW0FyZ1BhcnNlcl0gd2hpY2ggaXMgcmVhbGx5IG1vcmUgYW4gImFyZyBncmFtbWFyIiwgdGhpcyBpcyB0aGUgY2xhc3MKLy8vIHRoYXQgZG9lcyB0aGUgcGFyc2luZyBhbmQgaG9sZHMgdGhlIG11dGFibGUgc3RhdGUgcmVxdWlyZWQgZHVyaW5nIGEgcGFyc2UuCmNsYXNzIFBhcnNlciB7CiAgLy8vIElmIHBhcnNlciBpcyBwYXJzaW5nIGEgY29tbWFuZCdzIG9wdGlvbnMsIHRoaXMgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUKICAvLy8gY29tbWFuZC4gRm9yIHRvcC1sZXZlbCByZXN1bHRzLCB0aGlzIHJldHVybnMgYG51bGxgLgogIGZpbmFsIFN0cmluZyBjb21tYW5kTmFtZTsKCiAgLy8vIFRoZSBwYXJzZXIgZm9yIHRoZSBzdXBlcmNvbW1hbmQgb2YgdGhpcyBjb21tYW5kIHBhcnNlciwgb3IgYG51bGxgIGlmIHRoaXMKICAvLy8gaXMgdGhlIHRvcC1sZXZlbCBwYXJzZXIuCiAgZmluYWwgUGFyc2VyIHBhcmVudDsKCiAgLy8vIFRoZSBncmFtbWFyIGJlaW5nIHBhcnNlZC4KICBmaW5hbCBBcmdQYXJzZXIgZ3JhbW1hcjsKCiAgLy8vIFRoZSBhcmd1bWVudHMgYmVpbmcgcGFyc2VkLgogIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmdzOwoKICAvLy8gVGhlIHJlbWFpbmluZyBub24tb3B0aW9uLCBub24tY29tbWFuZCBhcmd1bWVudHMuCiAgZmluYWwgcmVzdCA9IDxTdHJpbmc+W107CgogIC8vLyBUaGUgYWNjdW11bGF0ZWQgcGFyc2VkIG9wdGlvbnMuCiAgZmluYWwgTWFwPFN0cmluZywgZHluYW1pYz4gcmVzdWx0cyA9IDxTdHJpbmcsIGR5bmFtaWM+e307CgogIFBhcnNlcih0aGlzLmNvbW1hbmROYW1lLCB0aGlzLmdyYW1tYXIsIHRoaXMuYXJncywKICAgICAgW3RoaXMucGFyZW50LCBMaXN0PFN0cmluZz4gcmVzdF0pIHsKICAgIGlmIChyZXN0ICE9IG51bGwpIHRoaXMucmVzdC5hZGRBbGwocmVzdCk7CiAgfQoKICAvLy8gVGhlIGN1cnJlbnQgYXJndW1lbnQgYmVpbmcgcGFyc2VkLgogIFN0cmluZyBnZXQgY3VycmVudCA9PiBhcmdzWzBdOwoKICAvLy8gUGFyc2VzIHRoZSBhcmd1bWVudHMuIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuCiAgQXJnUmVzdWx0cyBwYXJzZSgpIHsKICAgIHZhciBhcmd1bWVudHMgPSBhcmdzLnRvTGlzdCgpOwogICAgaWYgKGdyYW1tYXIuYWxsb3dzQW55dGhpbmcpIHsKICAgICAgcmV0dXJuIG5ld0FyZ1Jlc3VsdHMoCiAgICAgICAgICBncmFtbWFyLCBjb25zdCB7fSwgY29tbWFuZE5hbWUsIG51bGwsIGFyZ3VtZW50cywgYXJndW1lbnRzKTsKICAgIH0KCiAgICBBcmdSZXN1bHRzIGNvbW1hbmRSZXN1bHRzOwoKICAgIC8vIFBhcnNlIHRoZSBhcmdzLgogICAgd2hpbGUgKGFyZ3MuaXNOb3RFbXB0eSkgewogICAgICBpZiAoY3VycmVudCA9PSAnLS0nKSB7CiAgICAgICAgLy8gUmVhY2hlZCB0aGUgYXJndW1lbnQgdGVybWluYXRvciwgc28gc3RvcCBoZXJlLgogICAgICAgIGFyZ3MucmVtb3ZlQXQoMCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgY3VycmVudCBhcmd1bWVudCBhcyBhIGNvbW1hbmQuIFRoaXMgaGFwcGVucyBiZWZvcmUKICAgICAgLy8gb3B0aW9ucyBzbyB0aGF0IGNvbW1hbmRzIGNhbiBoYXZlIG9wdGlvbi1saWtlIG5hbWVzLgogICAgICB2YXIgY29tbWFuZCA9IGdyYW1tYXIuY29tbWFuZHNbY3VycmVudF07CiAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKICAgICAgICB2YWxpZGF0ZShyZXN0LmlzRW1wdHksICdDYW5ub3Qgc3BlY2lmeSBhcmd1bWVudHMgYmVmb3JlIGEgY29tbWFuZC4nKTsKICAgICAgICB2YXIgY29tbWFuZE5hbWUgPSBhcmdzLnJlbW92ZUF0KDApOwogICAgICAgIHZhciBjb21tYW5kUGFyc2VyID0gUGFyc2VyKGNvbW1hbmROYW1lLCBjb21tYW5kLCBhcmdzLCB0aGlzLCByZXN0KTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbW1hbmRSZXN1bHRzID0gY29tbWFuZFBhcnNlci5wYXJzZSgpOwogICAgICAgIH0gb24gQXJnUGFyc2VyRXhjZXB0aW9uIGNhdGNoIChlcnJvcikgewogICAgICAgICAgaWYgKGNvbW1hbmROYW1lID09IG51bGwpIHJldGhyb3c7CiAgICAgICAgICB0aHJvdyBBcmdQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSwgW2NvbW1hbmROYW1lXS4uYWRkQWxsKGVycm9yLmNvbW1hbmRzKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZCB0byBjb21tYW5kIHNvIGNsZWFyIHRoZW0gaGVyZS4KICAgICAgICByZXN0LmNsZWFyKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgY3VycmVudCBhcmd1bWVudCBhcyBhbiBvcHRpb24uIE5vdGUgdGhhdCB0aGUgb3JkZXIKICAgICAgLy8gaGVyZSBtYXR0ZXJzLgogICAgICBpZiAocGFyc2VTb2xvT3B0aW9uKCkpIGNvbnRpbnVlOwogICAgICBpZiAocGFyc2VBYmJyZXZpYXRpb24odGhpcykpIGNvbnRpbnVlOwogICAgICBpZiAocGFyc2VMb25nT3B0aW9uKCkpIGNvbnRpbnVlOwoKICAgICAgLy8gVGhpcyBhcmd1bWVudCBpcyBuZWl0aGVyIG9wdGlvbiBub3IgY29tbWFuZCwgc28gc3RvcCBwYXJzaW5nIHVubGVzcwogICAgICAvLyB0aGUgW2FsbG93VHJhaWxpbmdPcHRpb25zXSBvcHRpb24gaXMgc2V0LgogICAgICBpZiAoIWdyYW1tYXIuYWxsb3dUcmFpbGluZ09wdGlvbnMpIGJyZWFrOwogICAgICByZXN0LmFkZChhcmdzLnJlbW92ZUF0KDApKTsKICAgIH0KCiAgICAvLyBJbnZva2UgdGhlIGNhbGxiYWNrcy4KICAgIGdyYW1tYXIub3B0aW9ucy5mb3JFYWNoKChuYW1lLCBvcHRpb24pIHsKICAgICAgaWYgKG9wdGlvbi5jYWxsYmFjayA9PSBudWxsKSByZXR1cm47CiAgICAgIG9wdGlvbi5jYWxsYmFjayhvcHRpb24uZ2V0T3JEZWZhdWx0KHJlc3VsdHNbbmFtZV0pKTsKICAgIH0pOwoKICAgIC8vIEFkZCBpbiB0aGUgbGVmdG92ZXIgYXJndW1lbnRzIHdlIGRpZG4ndCBwYXJzZSB0byB0aGUgaW5uZXJtb3N0IGNvbW1hbmQuCiAgICByZXN0LmFkZEFsbChhcmdzKTsKICAgIGFyZ3MuY2xlYXIoKTsKICAgIHJldHVybiBuZXdBcmdSZXN1bHRzKAogICAgICAgIGdyYW1tYXIsIHJlc3VsdHMsIGNvbW1hbmROYW1lLCBjb21tYW5kUmVzdWx0cywgcmVzdCwgYXJndW1lbnRzKTsKICB9CgogIC8vLyBQdWxscyB0aGUgdmFsdWUgZm9yIFtvcHRpb25dIGZyb20gdGhlIHNlY29uZCBhcmd1bWVudCBpbiBbYXJnc10uCiAgLy8vCiAgLy8vIFZhbGlkYXRlcyB0aGF0IHRoZXJlIGlzIGEgdmFsaWQgdmFsdWUgdGhlcmUuCiAgdm9pZCByZWFkTmV4dEFyZ0FzVmFsdWUoT3B0aW9uIG9wdGlvbikgewogICAgLy8gVGFrZSB0aGUgb3B0aW9uIGFyZ3VtZW50IGZyb20gdGhlIG5leHQgY29tbWFuZCBsaW5lIGFyZy4KICAgIHZhbGlkYXRlKGFyZ3MuaXNOb3RFbXB0eSwgJ01pc3NpbmcgYXJndW1lbnQgZm9yICIke29wdGlvbi5uYW1lfSIuJyk7CgogICAgc2V0T3B0aW9uKHJlc3VsdHMsIG9wdGlvbiwgY3VycmVudCk7CiAgICBhcmdzLnJlbW92ZUF0KDApOwogIH0KCiAgLy8vIFRyaWVzIHRvIHBhcnNlIHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIGEgInNvbG8iIG9wdGlvbiwgd2hpY2ggaXMgYSBzaW5nbGUKICAvLy8gaHlwaGVuIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIGxldHRlci4KICAvLy8KICAvLy8gV2UgdHJlYXQgdGhpcyBkaWZmZXJlbnRseSB0aGFuIGNvbGxhcHNlZCBhYmJyZXZpYXRpb25zIChsaWtlICItYWJjIikgdG8KICAvLy8gaGFuZGxlIHRoZSBwb3NzaWJsZSB2YWx1ZSB0aGF0IG1heSBmb2xsb3cgaXQuCiAgYm9vbCBwYXJzZVNvbG9PcHRpb24oKSB7CiAgICB2YXIgc29sb09wdCA9IF9zb2xvT3B0LmZpcnN0TWF0Y2goY3VycmVudCk7CiAgICBpZiAoc29sb09wdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CgogICAgdmFyIG9wdGlvbiA9IGdyYW1tYXIuZmluZEJ5QWJicmV2aWF0aW9uKHNvbG9PcHRbMV0pOwogICAgaWYgKG9wdGlvbiA9PSBudWxsKSB7CiAgICAgIC8vIFdhbGsgdXAgdG8gdGhlIHBhcmVudCBjb21tYW5kIGlmIHBvc3NpYmxlLgogICAgICB2YWxpZGF0ZSgKICAgICAgICAgIHBhcmVudCAhPSBudWxsLCAnQ291bGQgbm90IGZpbmQgYW4gb3B0aW9uIG9yIGZsYWcgIi0ke3NvbG9PcHRbMV19Ii4nKTsKICAgICAgcmV0dXJuIHBhcmVudC5wYXJzZVNvbG9PcHRpb24oKTsKICAgIH0KCiAgICBhcmdzLnJlbW92ZUF0KDApOwoKICAgIGlmIChvcHRpb24uaXNGbGFnKSB7CiAgICAgIHNldEZsYWcocmVzdWx0cywgb3B0aW9uLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlYWROZXh0QXJnQXNWYWx1ZShvcHRpb24pOwogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8vIFRyaWVzIHRvIHBhcnNlIHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIGEgc2VyaWVzIG9mIGNvbGxhcHNlZCBhYmJyZXZpYXRpb25zCiAgLy8vIChsaWtlICItYWJjIikgb3IgYSBzaW5nbGUgYWJicmV2aWF0aW9uIHdpdGggdGhlIHZhbHVlIGRpcmVjdGx5IGF0dGFjaGVkCiAgLy8vIHRvIGl0IChsaWtlICItbXJlbGVhc2UiKS4KICBib29sIHBhcnNlQWJicmV2aWF0aW9uKFBhcnNlciBpbm5lcm1vc3RDb21tYW5kKSB7CiAgICB2YXIgYWJick9wdCA9IF9hYmJyT3B0LmZpcnN0TWF0Y2goY3VycmVudCk7CiAgICBpZiAoYWJick9wdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CgogICAgLy8gSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyB0aGUgYWJicmV2aWF0aW9uIGZvciBhIG5vbi1mbGFnIG9wdGlvbiwgdGhlbgogICAgLy8gdGhlIHJlc3QgaXMgdGhlIHZhbHVlLgogICAgdmFyIGMgPSBhYmJyT3B0WzFdLnN1YnN0cmluZygwLCAxKTsKICAgIHZhciBmaXJzdCA9IGdyYW1tYXIuZmluZEJ5QWJicmV2aWF0aW9uKGMpOwogICAgaWYgKGZpcnN0ID09IG51bGwpIHsKICAgICAgLy8gV2FsayB1cCB0byB0aGUgcGFyZW50IGNvbW1hbmQgaWYgcG9zc2libGUuCiAgICAgIHZhbGlkYXRlKAogICAgICAgICAgcGFyZW50ICE9IG51bGwsICdDb3VsZCBub3QgZmluZCBhbiBvcHRpb24gd2l0aCBzaG9ydCBuYW1lICItJGMiLicpOwogICAgICByZXR1cm4gcGFyZW50LnBhcnNlQWJicmV2aWF0aW9uKGlubmVybW9zdENvbW1hbmQpOwogICAgfSBlbHNlIGlmICghZmlyc3QuaXNGbGFnKSB7CiAgICAgIC8vIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBub24tZmxhZyBvcHRpb24sIHNvIHRoZSByZXN0IG11c3QgYmUgdGhlCiAgICAgIC8vIHZhbHVlLgogICAgICB2YXIgdmFsdWUgPSAnJHthYmJyT3B0WzFdLnN1YnN0cmluZygxKX0ke2FiYnJPcHRbMl19JzsKICAgICAgc2V0T3B0aW9uKHJlc3VsdHMsIGZpcnN0LCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBJZiB3ZSBnb3Qgc29tZSBub24tZmxhZyBjaGFyYWN0ZXJzLCB0aGVuIGl0IG11c3QgYmUgYSB2YWx1ZSwgYnV0CiAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCBpdCdzIGEgZmxhZywgd2hpY2ggaXMgd3JvbmcuCiAgICAgIHZhbGlkYXRlKAogICAgICAgICAgYWJick9wdFsyXSA9PSAnJywKICAgICAgICAgICdPcHRpb24gIi0kYyIgaXMgYSBmbGFnIGFuZCBjYW5ub3QgaGFuZGxlIHZhbHVlICcKICAgICAgICAgICciJHthYmJyT3B0WzFdLnN1YnN0cmluZygxKX0ke2FiYnJPcHRbMl19Ii4nKTsKCiAgICAgIC8vIE5vdCBhbiBvcHRpb24sIHNvIGFsbCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBmbGFncy4KICAgICAgLy8gV2UgdXNlICJpbm5lcm1vc3RDb21tYW5kIiBoZXJlIHNvIHRoYXQgaWYgYSBwYXJlbnQgY29tbWFuZCBwYXJzZXMgdGhlCiAgICAgIC8vICpmaXJzdCogbGV0dGVyLCBzdWJjb21tYW5kcyBjYW4gc3RpbGwgYmUgZm91bmQgdG8gcGFyc2UgdGhlIG90aGVyCiAgICAgIC8vIGxldHRlcnMuCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWJick9wdFsxXS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjID0gYWJick9wdFsxXS5zdWJzdHJpbmcoaSwgaSArIDEpOwogICAgICAgIGlubmVybW9zdENvbW1hbmQucGFyc2VTaG9ydEZsYWcoYyk7CiAgICAgIH0KICAgIH0KCiAgICBhcmdzLnJlbW92ZUF0KDApOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIHBhcnNlU2hvcnRGbGFnKFN0cmluZyBjKSB7CiAgICB2YXIgb3B0aW9uID0gZ3JhbW1hci5maW5kQnlBYmJyZXZpYXRpb24oYyk7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHsKICAgICAgLy8gV2FsayB1cCB0byB0aGUgcGFyZW50IGNvbW1hbmQgaWYgcG9zc2libGUuCiAgICAgIHZhbGlkYXRlKAogICAgICAgICAgcGFyZW50ICE9IG51bGwsICdDb3VsZCBub3QgZmluZCBhbiBvcHRpb24gd2l0aCBzaG9ydCBuYW1lICItJGMiLicpOwogICAgICBwYXJlbnQucGFyc2VTaG9ydEZsYWcoYyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBJbiBhIGxpc3Qgb2Ygc2hvcnQgb3B0aW9ucywgb25seSB0aGUgZmlyc3QgY2FuIGJlIGEgbm9uLWZsYWcuIElmCiAgICAvLyB3ZSBnZXQgaGVyZSB3ZSd2ZSBjaGVja2VkIHRoYXQgYWxyZWFkeS4KICAgIHZhbGlkYXRlKAogICAgICAgIG9wdGlvbi5pc0ZsYWcsICdPcHRpb24gIi0kYyIgbXVzdCBiZSBhIGZsYWcgdG8gYmUgaW4gYSBjb2xsYXBzZWQgIi0iLicpOwoKICAgIHNldEZsYWcocmVzdWx0cywgb3B0aW9uLCB0cnVlKTsKICB9CgogIC8vLyBUcmllcyB0byBwYXJzZSB0aGUgY3VycmVudCBhcmd1bWVudCBhcyBhIGxvbmctZm9ybSBuYW1lZCBvcHRpb24sIHdoaWNoCiAgLy8vIG1heSBpbmNsdWRlIGEgdmFsdWUgbGlrZSAiLS1tb2RlPXJlbGVhc2UiIG9yICItLW1vZGUgcmVsZWFzZSIuCiAgYm9vbCBwYXJzZUxvbmdPcHRpb24oKSB7CiAgICB2YXIgbG9uZ09wdCA9IF9sb25nT3B0LmZpcnN0TWF0Y2goY3VycmVudCk7CiAgICBpZiAobG9uZ09wdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CgogICAgdmFyIG5hbWUgPSBsb25nT3B0WzFdOwogICAgdmFyIG9wdGlvbiA9IGdyYW1tYXIub3B0aW9uc1tuYW1lXTsKICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewogICAgICBhcmdzLnJlbW92ZUF0KDApOwogICAgICBpZiAob3B0aW9uLmlzRmxhZykgewogICAgICAgIHZhbGlkYXRlKGxvbmdPcHRbM10gPT0gbnVsbCwKICAgICAgICAgICAgJ0ZsYWcgb3B0aW9uICIkbmFtZSIgc2hvdWxkIG5vdCBiZSBnaXZlbiBhIHZhbHVlLicpOwoKICAgICAgICBzZXRGbGFnKHJlc3VsdHMsIG9wdGlvbiwgdHJ1ZSk7CiAgICAgIH0gZWxzZSBpZiAobG9uZ09wdFszXSAhPSBudWxsKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBhIHZhbHVlIGxpa2UgLS1mb289YmFyLgogICAgICAgIHNldE9wdGlvbihyZXN1bHRzLCBvcHRpb24sIGxvbmdPcHRbM10pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIE9wdGlvbiBsaWtlIC0tZm9vLCBzbyBsb29rIGZvciB0aGUgdmFsdWUgYXMgdGhlIG5leHQgYXJnLgogICAgICAgIHJlYWROZXh0QXJnQXNWYWx1ZShvcHRpb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgnbm8tJykpIHsKICAgICAgLy8gU2VlIGlmIGl0J3MgYSBuZWdhdGVkIGZsYWcuCiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygnbm8tJy5sZW5ndGgpOwogICAgICBvcHRpb24gPSBncmFtbWFyLm9wdGlvbnNbbmFtZV07CiAgICAgIGlmIChvcHRpb24gPT0gbnVsbCkgewogICAgICAgIC8vIFdhbGsgdXAgdG8gdGhlIHBhcmVudCBjb21tYW5kIGlmIHBvc3NpYmxlLgogICAgICAgIHZhbGlkYXRlKHBhcmVudCAhPSBudWxsLCAnQ291bGQgbm90IGZpbmQgYW4gb3B0aW9uIG5hbWVkICIkbmFtZSIuJyk7CiAgICAgICAgcmV0dXJuIHBhcmVudC5wYXJzZUxvbmdPcHRpb24oKTsKICAgICAgfQoKICAgICAgYXJncy5yZW1vdmVBdCgwKTsKICAgICAgdmFsaWRhdGUob3B0aW9uLmlzRmxhZywgJ0Nhbm5vdCBuZWdhdGUgbm9uLWZsYWcgb3B0aW9uICIkbmFtZSIuJyk7CiAgICAgIHZhbGlkYXRlKG9wdGlvbi5uZWdhdGFibGUsICdDYW5ub3QgbmVnYXRlIG9wdGlvbiAiJG5hbWUiLicpOwoKICAgICAgc2V0RmxhZyhyZXN1bHRzLCBvcHRpb24sIGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFdhbGsgdXAgdG8gdGhlIHBhcmVudCBjb21tYW5kIGlmIHBvc3NpYmxlLgogICAgICB2YWxpZGF0ZShwYXJlbnQgIT0gbnVsbCwgJ0NvdWxkIG5vdCBmaW5kIGFuIG9wdGlvbiBuYW1lZCAiJG5hbWUiLicpOwogICAgICByZXR1cm4gcGFyZW50LnBhcnNlTG9uZ09wdGlvbigpOwogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8vIENhbGxlZCBkdXJpbmcgcGFyc2luZyB0byB2YWxpZGF0ZSB0aGUgYXJndW1lbnRzLgogIC8vLwogIC8vLyBUaHJvd3MgYW4gW0FyZ1BhcnNlckV4Y2VwdGlvbl0gaWYgW2NvbmRpdGlvbl0gaXMgYGZhbHNlYC4KICB2b2lkIHZhbGlkYXRlKGJvb2wgY29uZGl0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewogICAgaWYgKCFjb25kaXRpb24pIHRocm93IEFyZ1BhcnNlckV4Y2VwdGlvbihtZXNzYWdlKTsKICB9CgogIC8vLyBWYWxpZGF0ZXMgYW5kIHN0b3JlcyBbdmFsdWVdIGFzIHRoZSB2YWx1ZSBmb3IgW29wdGlvbl0sIHdoaWNoIG11c3Qgbm90IGJlCiAgLy8vIGEgZmxhZy4KICB2b2lkIHNldE9wdGlvbihNYXAgcmVzdWx0cywgT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHZhbHVlKSB7CiAgICBhc3NlcnQoIW9wdGlvbi5pc0ZsYWcpOwoKICAgIGlmICghb3B0aW9uLmlzTXVsdGlwbGUpIHsKICAgICAgX3ZhbGlkYXRlQWxsb3dlZChvcHRpb24sIHZhbHVlKTsKICAgICAgcmVzdWx0c1tvcHRpb24ubmFtZV0gPSB2YWx1ZTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBsaXN0ID0gcmVzdWx0cy5wdXRJZkFic2VudChvcHRpb24ubmFtZSwgKCkgPT4gPFN0cmluZz5bXSk7CgogICAgaWYgKG9wdGlvbi5zcGxpdENvbW1hcykgewogICAgICBmb3IgKHZhciBlbGVtZW50IGluIHZhbHVlLnNwbGl0KCIsIikpIHsKICAgICAgICBfdmFsaWRhdGVBbGxvd2VkKG9wdGlvbiwgZWxlbWVudCk7CiAgICAgICAgbGlzdC5hZGQoZWxlbWVudCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF92YWxpZGF0ZUFsbG93ZWQob3B0aW9uLCB2YWx1ZSk7CiAgICAgIGxpc3QuYWRkKHZhbHVlKTsKICAgIH0KICB9CgogIC8vLyBWYWxpZGF0ZXMgYW5kIHN0b3JlcyBbdmFsdWVdIGFzIHRoZSB2YWx1ZSBmb3IgW29wdGlvbl0sIHdoaWNoIG11c3QgYmUgYQogIC8vLyBmbGFnLgogIHZvaWQgc2V0RmxhZyhNYXAgcmVzdWx0cywgT3B0aW9uIG9wdGlvbiwgYm9vbCB2YWx1ZSkgewogICAgYXNzZXJ0KG9wdGlvbi5pc0ZsYWcpOwogICAgcmVzdWx0c1tvcHRpb24ubmFtZV0gPSB2YWx1ZTsKICB9CgogIC8vLyBWYWxpZGF0ZXMgdGhhdCBbdmFsdWVdIGlzIGFsbG93ZWQgYXMgYSB2YWx1ZSBvZiBbb3B0aW9uXS4KICB2b2lkIF92YWxpZGF0ZUFsbG93ZWQoT3B0aW9uIG9wdGlvbiwgU3RyaW5nIHZhbHVlKSB7CiAgICBpZiAob3B0aW9uLmFsbG93ZWQgPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZhbGlkYXRlKG9wdGlvbi5hbGxvd2VkLmNvbnRhaW5zKHZhbHVlKSwKICAgICAgICAnIiR2YWx1ZSIgaXMgbm90IGFuIGFsbG93ZWQgdmFsdWUgZm9yIG9wdGlvbiAiJHtvcHRpb24ubmFtZX0iLicpOwogIH0KfQqBMABOTjwBGiQbFgEuMzsBJwRQTw9NOxwBUB8XASAbASIbATcbASY8ATQqLgQBKSEBOhcjIhxHBgEfARceHToaDwgBTT4vHU4sTAEOMjAsJEUKAU4WDwgBTRcnLScBTTMwIgYBHS0rOwgBTxcSGkkEAUcGMytASQEpFgQBUCoGTjQbMCcBORo0EFEnBgEWARkmDSIGAREEAVFOIDQwJwFOHigvGTQQTjkgSxA9KA1KNhAcPDkBO09LEjQwLAgGARYRBAEiMBo0EE4gDgYBSC8OUQEkBAFNRRswJwEbKBoYGyVBASgnKzAPRSQIKSUrJhw2TSkIARhJQwEnDTRLJwYBEQQBNwZAMjcEAVAOPRwBHickDgYBQwEeLisbCA0nFwYEAU4MORsiBAFANygBLUoEAgEccGFja2FnZTphcmdzL3NyYy9wYXJzZXIuZGFydEtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvYXJncy9saWIvc3JjL3VzYWdlLmRhcnShHy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKCmltcG9ydCAnLi4vYXJncy5kYXJ0JzsKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCi8vLyBUYWtlcyBhbiBbQXJnUGFyc2VyXSBhbmQgZ2VuZXJhdGVzIGEgc3RyaW5nIG9mIHVzYWdlIChpLmUuIGhlbHApIHRleHQgZm9yCi8vLyBpdHMgZGVmaW5lZCBvcHRpb25zLgovLy8KLy8vIEludGVybmFsbHksIGl0IHdvcmtzIGxpa2UgYSB0YWJ1bGFyIHByaW50ZXIuIFRoZSBvdXRwdXQgaXMgZGl2aWRlZCBpbnRvCi8vLyB0aHJlZSBob3Jpem9udGFsIGNvbHVtbnMsIGxpa2Ugc286Ci8vLwovLy8gICAgIC1oLCAtLWhlbHAgIFByaW50cyB0aGUgdXNhZ2UgaW5mb3JtYXRpb24KLy8vICAgICB8ICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLy8KLy8vIEl0IGJ1aWxkcyB0aGUgdXNhZ2UgdGV4dCB1cCBvbmUgY29sdW1uIGF0IGEgdGltZSBhbmQgaGFuZGxlcyBwYWRkaW5nIHdpdGgKLy8vIHNwYWNlcyBhbmQgd3JhcHBpbmcgdG8gdGhlIG5leHQgbGluZSB0byBrZWVwIHRoZSBjZWxscyBjb3JyZWN0bHkgbGluZWQgdXAuCmNsYXNzIFVzYWdlIHsKICAvLy8gQWJicmV2aWF0aW9uLCBsb25nIG5hbWUsIGhlbHAuCiAgc3RhdGljIGNvbnN0IF9jb2x1bW5Db3VudCA9IDM7CgogIC8vLyBBIGxpc3Qgb2YgdGhlIFtPcHRpb25dcyBpbnRlcm1pbmdsZWQgd2l0aCBbU3RyaW5nXSBzZXBhcmF0b3JzLgogIGZpbmFsIExpc3Qgb3B0aW9uc0FuZFNlcGFyYXRvcnM7CgogIC8vLyBUaGUgd29ya2luZyBidWZmZXIgZm9yIHRoZSBnZW5lcmF0ZWQgdXNhZ2UgdGV4dC4KICBTdHJpbmdCdWZmZXIgYnVmZmVyOwoKICAvLy8gVGhlIGNvbHVtbiB0aGF0IHRoZSAiY3Vyc29yIiBpcyBjdXJyZW50bHkgb24uCiAgLy8vCiAgLy8vIElmIHRoZSBuZXh0IGNhbGwgdG8gW3dyaXRlKCldIGlzIG5vdCBmb3IgdGhpcyBjb2x1bW4sIGl0IHdpbGwgY29ycmVjdGx5CiAgLy8vIGhhbmRsZSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgY29sdW1uIChhbmQgcG9zc2libHkgdGhlIG5leHQgcm93KS4KICBpbnQgY3VycmVudENvbHVtbiA9IDA7CgogIC8vLyBUaGUgd2lkdGggaW4gY2hhcmFjdGVycyBvZiBlYWNoIGNvbHVtbi4KICBMaXN0PGludD4gY29sdW1uV2lkdGhzOwoKICAvLy8gVGhlIG51bWJlciBvZiBzZXF1ZW50aWFsIGxpbmVzIG9mIHRleHQgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgbGFzdAogIC8vLyBjb2x1bW4gKHdoaWNoIHNob3dzIGhlbHAgaW5mbykuCiAgLy8vCiAgLy8vIFdlIHRyYWNrIHRoaXMgc28gdGhhdCBoZWxwIHRleHQgdGhhdCBzcGFucyBtdWx0aXBsZSBsaW5lcyBjYW4gYmUgcGFkZGVkCiAgLy8vIHdpdGggYSBibGFuayBsaW5lIGFmdGVyIGl0IGZvciBzZXBhcmF0aW9uLiBNZWFud2hpbGUsIHNlcXVlbnRpYWwgb3B0aW9ucwogIC8vLyB3aXRoIHNpbmdsZS1saW5lIGhlbHAgd2lsbCBiZSBjb21wYWN0ZWQgbmV4dCB0byBlYWNoIG90aGVyLgogIGludCBudW1IZWxwTGluZXMgPSAwOwoKICAvLy8gSG93IG1hbnkgbmV3bGluZXMgbmVlZCB0byBiZSByZW5kZXJlZCBiZWZvcmUgdGhlIG5leHQgYml0IG9mIHRleHQgY2FuIGJlCiAgLy8vIHdyaXR0ZW4uCiAgLy8vCiAgLy8vIFdlIGRvIHRoaXMgbGF6aWx5IHNvIHRoYXQgdGhlIGxhc3QgYml0IG9mIHVzYWdlIGRvZXNuJ3QgaGF2ZSBkYW5nbGluZwogIC8vLyBuZXdsaW5lcy4gV2Ugb25seSB3cml0ZSBuZXdsaW5lcyByaWdodCAqYmVmb3JlKiB3ZSB3cml0ZSBzb21lIHJlYWwKICAvLy8gY29udGVudC4KICBpbnQgbmV3bGluZXNOZWVkZWQgPSAwOwoKICAvLy8gVGhlIGhvcml6b250YWwgY2hhcmFjdGVyIHBvc2l0aW9uIGF0IHdoaWNoIGhlbHAgdGV4dCBpcyB3cmFwcGVkLiBIZWxwIHRoYXQKICAvLy8gZXh0ZW5kcyBwYXN0IHRoaXMgY29sdW1uIHdpbGwgYmUgd3JhcHBlZCBhdCB0aGUgbmVhcmVzdCB3aGl0ZXNwYWNlIChvcgogIC8vLyB0cnVuY2F0ZWQgaWYgdGhlcmUgaXMgbm8gYXZhaWxhYmxlIHdoaXRlc3BhY2UpLgogIGZpbmFsIGludCBsaW5lTGVuZ3RoOwoKICBVc2FnZSh0aGlzLm9wdGlvbnNBbmRTZXBhcmF0b3JzLCB7dGhpcy5saW5lTGVuZ3RofSk7CgogIC8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgZGlzcGxheWluZyB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRlZmluZWQgb3B0aW9ucy4KICAvLy8gVGhpcyBpcyBiYXNpY2FsbHkgdGhlIGhlbHAgdGV4dCBzaG93biBvbiB0aGUgY29tbWFuZCBsaW5lLgogIFN0cmluZyBnZW5lcmF0ZSgpIHsKICAgIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwoKICAgIGNhbGN1bGF0ZUNvbHVtbldpZHRocygpOwoKICAgIGZvciAodmFyIG9wdGlvbk9yU2VwYXJhdG9yIGluIG9wdGlvbnNBbmRTZXBhcmF0b3JzKSB7CiAgICAgIGlmIChvcHRpb25PclNlcGFyYXRvciBpcyBTdHJpbmcpIHsKICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIGFsd2F5cyBhIGJsYW5rIGxpbmUgYmVmb3JlIGEgc2VwYXJhdG9yLgogICAgICAgIGlmIChidWZmZXIuaXNOb3RFbXB0eSkgYnVmZmVyLndyaXRlKCJcblxuIik7CiAgICAgICAgYnVmZmVyLndyaXRlKG9wdGlvbk9yU2VwYXJhdG9yKTsKICAgICAgICBuZXdsaW5lc05lZWRlZCA9IDE7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHZhciBvcHRpb24gPSBvcHRpb25PclNlcGFyYXRvciBhcyBPcHRpb247CiAgICAgIGlmIChvcHRpb24uaGlkZSkgY29udGludWU7CgogICAgICB3cml0ZSgwLCBnZXRBYmJyZXZpYXRpb24ob3B0aW9uKSk7CiAgICAgIHdyaXRlKDEsIGdldExvbmdPcHRpb24ob3B0aW9uKSk7CgogICAgICBpZiAob3B0aW9uLmhlbHAgIT0gbnVsbCkgd3JpdGUoMiwgb3B0aW9uLmhlbHApOwoKICAgICAgaWYgKG9wdGlvbi5hbGxvd2VkSGVscCAhPSBudWxsKSB7CiAgICAgICAgdmFyIGFsbG93ZWROYW1lcyA9IG9wdGlvbi5hbGxvd2VkSGVscC5rZXlzLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICAgIGFsbG93ZWROYW1lcy5zb3J0KCk7CiAgICAgICAgbmV3bGluZSgpOwogICAgICAgIGZvciAodmFyIG5hbWUgaW4gYWxsb3dlZE5hbWVzKSB7CiAgICAgICAgICB3cml0ZSgxLCBnZXRBbGxvd2VkVGl0bGUob3B0aW9uLCBuYW1lKSk7CiAgICAgICAgICB3cml0ZSgyLCBvcHRpb24uYWxsb3dlZEhlbHBbbmFtZV0pOwogICAgICAgIH0KICAgICAgICBuZXdsaW5lKCk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmFsbG93ZWQgIT0gbnVsbCkgewogICAgICAgIHdyaXRlKDIsIGJ1aWxkQWxsb3dlZExpc3Qob3B0aW9uKSk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmlzRmxhZykgewogICAgICAgIGlmIChvcHRpb24uZGVmYXVsdHNUbyA9PSB0cnVlKSB7CiAgICAgICAgICB3cml0ZSgyLCAnKGRlZmF1bHRzIHRvIG9uKScpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvcHRpb24uaXNNdWx0aXBsZSkgewogICAgICAgIGlmIChvcHRpb24uZGVmYXVsdHNUbyAhPSBudWxsICYmIG9wdGlvbi5kZWZhdWx0c1RvLmlzTm90RW1wdHkpIHsKICAgICAgICAgIHdyaXRlKAogICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgJyhkZWZhdWx0cyB0byAnICsKICAgICAgICAgICAgICAgICAgb3B0aW9uLmRlZmF1bHRzVG8ubWFwKCh2YWx1ZSkgPT4gJyIkdmFsdWUiJykuam9pbignLCAnKSArCiAgICAgICAgICAgICAgICAgICcpJyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChvcHRpb24uZGVmYXVsdHNUbyAhPSBudWxsKSB7CiAgICAgICAgICB3cml0ZSgyLCAnKGRlZmF1bHRzIHRvICIke29wdGlvbi5kZWZhdWx0c1RvfSIpJyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJZiBhbnkgZ2l2ZW4gb3B0aW9uIGRpc3BsYXlzIG1vcmUgdGhhbiBvbmUgbGluZSBvZiB0ZXh0IG9uIHRoZSByaWdodAogICAgICAvLyBjb2x1bW4gKGkuZS4gaGVscCwgZGVmYXVsdCB2YWx1ZSwgYWxsb3dlZCBvcHRpb25zLCBldGMuKSB0aGVuIHB1dCBhCiAgICAgIC8vIGJsYW5rIGxpbmUgYWZ0ZXIgaXQuIFRoaXMgZ2l2ZXMgc3BhY2Ugd2hlcmUgaXQncyB1c2VmdWwgd2hpbGUgc3RpbGwKICAgICAgLy8ga2VlcGluZyBzaW1wbGUgb25lLWxpbmUgb3B0aW9ucyBjbHVtcGVkIHRvZ2V0aGVyLgogICAgICBpZiAobnVtSGVscExpbmVzID4gMSkgbmV3bGluZSgpOwogICAgfQoKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIFN0cmluZyBnZXRBYmJyZXZpYXRpb24oT3B0aW9uIG9wdGlvbikgPT4KICAgICAgb3B0aW9uLmFiYnIgPT0gbnVsbCA/ICcnIDogJy0ke29wdGlvbi5hYmJyfSwgJzsKCiAgU3RyaW5nIGdldExvbmdPcHRpb24oT3B0aW9uIG9wdGlvbikgewogICAgdmFyIHJlc3VsdDsKICAgIGlmIChvcHRpb24ubmVnYXRhYmxlKSB7CiAgICAgIHJlc3VsdCA9ICctLVtuby1dJHtvcHRpb24ubmFtZX0nOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gJy0tJHtvcHRpb24ubmFtZX0nOwogICAgfQoKICAgIGlmIChvcHRpb24udmFsdWVIZWxwICE9IG51bGwpIHJlc3VsdCArPSAiPTwke29wdGlvbi52YWx1ZUhlbHB9PiI7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyBnZXRBbGxvd2VkVGl0bGUoT3B0aW9uIG9wdGlvbiwgU3RyaW5nIGFsbG93ZWQpIHsKICAgIHZhciBpc0RlZmF1bHQgPSBvcHRpb24uZGVmYXVsdHNUbyBpcyBMaXN0CiAgICAgICAgPyBvcHRpb24uZGVmYXVsdHNUby5jb250YWlucyhhbGxvd2VkKQogICAgICAgIDogb3B0aW9uLmRlZmF1bHRzVG8gPT0gYWxsb3dlZDsKICAgIHJldHVybiAnICAgICAgWyRhbGxvd2VkXScgKyAoaXNEZWZhdWx0ID8gJyAoZGVmYXVsdCknIDogJycpOwogIH0KCiAgdm9pZCBjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKSB7CiAgICB2YXIgYWJiciA9IDA7CiAgICB2YXIgdGl0bGUgPSAwOwogICAgZm9yICh2YXIgb3B0aW9uIGluIG9wdGlvbnNBbmRTZXBhcmF0b3JzKSB7CiAgICAgIGlmIChvcHRpb24gaXMhIE9wdGlvbikgY29udGludWU7CiAgICAgIGlmIChvcHRpb24uaGlkZSkgY29udGludWU7CgogICAgICAvLyBNYWtlIHJvb20gaW4gdGhlIGZpcnN0IGNvbHVtbiBpZiB0aGVyZSBhcmUgYWJicmV2aWF0aW9ucy4KICAgICAgYWJiciA9IG1hdGgubWF4KGFiYnIsIGdldEFiYnJldmlhdGlvbihvcHRpb24pLmxlbmd0aCk7CgogICAgICAvLyBNYWtlIHJvb20gZm9yIHRoZSBvcHRpb24uCiAgICAgIHRpdGxlID0gbWF0aC5tYXgodGl0bGUsIGdldExvbmdPcHRpb24ob3B0aW9uKS5sZW5ndGgpOwoKICAgICAgLy8gTWFrZSByb29tIGZvciB0aGUgYWxsb3dlZCBoZWxwLgogICAgICBpZiAob3B0aW9uLmFsbG93ZWRIZWxwICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBhbGxvd2VkIGluIG9wdGlvbi5hbGxvd2VkSGVscC5rZXlzKSB7CiAgICAgICAgICB0aXRsZSA9IG1hdGgubWF4KHRpdGxlLCBnZXRBbGxvd2VkVGl0bGUob3B0aW9uLCBhbGxvd2VkKS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIExlYXZlIGEgZ3V0dGVyIGJldHdlZW4gdGhlIGNvbHVtbnMuCiAgICB0aXRsZSArPSA0OwogICAgY29sdW1uV2lkdGhzID0gW2FiYnIsIHRpdGxlXTsKICB9CgogIHZvaWQgbmV3bGluZSgpIHsKICAgIG5ld2xpbmVzTmVlZGVkKys7CiAgICBjdXJyZW50Q29sdW1uID0gMDsKICAgIG51bUhlbHBMaW5lcyA9IDA7CiAgfQoKICB2b2lkIHdyaXRlKGludCBjb2x1bW4sIFN0cmluZyB0ZXh0KSB7CiAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcbicpOwogICAgLy8gSWYgd2UgYXJlIHdyaXRpbmcgdGhlIGxhc3QgY29sdW1uLCB3b3JkIHdyYXAgaXQgdG8gZml0LgogICAgaWYgKGNvbHVtbiA9PSBjb2x1bW5XaWR0aHMubGVuZ3RoICYmIGxpbmVMZW5ndGggIT0gbnVsbCkgewogICAgICB2YXIgd3JhcHBlZExpbmVzID0gPFN0cmluZz5bXTsKICAgICAgdmFyIHN0YXJ0ID0gY29sdW1uV2lkdGhzCiAgICAgICAgICAuc3VibGlzdCgwLCBjb2x1bW4pCiAgICAgICAgICAucmVkdWNlKChzdGFydCwgd2lkdGgpID0+IHN0YXJ0ICs9IHdpZHRoKTsKCiAgICAgIGZvciAodmFyIGxpbmUgaW4gbGluZXMpIHsKICAgICAgICB3cmFwcGVkTGluZXMKICAgICAgICAgICAgLmFkZEFsbCh3cmFwVGV4dEFzTGluZXMobGluZSwgc3RhcnQ6IHN0YXJ0LCBsZW5ndGg6IGxpbmVMZW5ndGgpKTsKICAgICAgfQoKICAgICAgbGluZXMgPSB3cmFwcGVkTGluZXM7CiAgICB9CgogICAgLy8gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXMuCiAgICB3aGlsZSAobGluZXMuaXNOb3RFbXB0eSAmJiBsaW5lc1swXS50cmltKCkgPT0gJycpIHsKICAgICAgbGluZXMucmVtb3ZlUmFuZ2UoMCwgMSk7CiAgICB9CgogICAgd2hpbGUgKGxpbmVzLmlzTm90RW1wdHkgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0udHJpbSgpID09ICcnKSB7CiAgICAgIGxpbmVzLnJlbW92ZUxhc3QoKTsKICAgIH0KCiAgICBmb3IgKHZhciBsaW5lIGluIGxpbmVzKSB7CiAgICAgIHdyaXRlTGluZShjb2x1bW4sIGxpbmUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpbmUoaW50IGNvbHVtbiwgU3RyaW5nIHRleHQpIHsKICAgIC8vIFdyaXRlIGFueSBwZW5kaW5nIG5ld2xpbmVzLgogICAgd2hpbGUgKG5ld2xpbmVzTmVlZGVkID4gMCkgewogICAgICBidWZmZXIud3JpdGUoJ1xuJyk7CiAgICAgIG5ld2xpbmVzTmVlZGVkLS07CiAgICB9CgogICAgLy8gQWR2YW5jZSB1bnRpbCB3ZSBhcmUgYXQgdGhlIHJpZ2h0IGNvbHVtbiAod2hpY2ggbWF5IG1lYW4gd3JhcHBpbmcgYXJvdW5kCiAgICAvLyB0byB0aGUgbmV4dCBsaW5lLgogICAgd2hpbGUgKGN1cnJlbnRDb2x1bW4gIT0gY29sdW1uKSB7CiAgICAgIGlmIChjdXJyZW50Q29sdW1uIDwgX2NvbHVtbkNvdW50IC0gMSkgewogICAgICAgIGJ1ZmZlci53cml0ZSgnICcgKiBjb2x1bW5XaWR0aHNbY3VycmVudENvbHVtbl0pOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1ZmZlci53cml0ZSgnXG4nKTsKICAgICAgfQogICAgICBjdXJyZW50Q29sdW1uID0gKGN1cnJlbnRDb2x1bW4gKyAxKSAlIF9jb2x1bW5Db3VudDsKICAgIH0KCiAgICBpZiAoY29sdW1uIDwgY29sdW1uV2lkdGhzLmxlbmd0aCkgewogICAgICAvLyBGaXhlZC1zaXplIGNvbHVtbiwgc28gcGFkIGl0LgogICAgICBidWZmZXIud3JpdGUodGV4dC5wYWRSaWdodChjb2x1bW5XaWR0aHNbY29sdW1uXSkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIGxhc3QgY29sdW1uLCBzbyBqdXN0IHdyaXRlIGl0LgogICAgICBidWZmZXIud3JpdGUodGV4dCk7CiAgICB9CgogICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBjb2x1bW4uCiAgICBjdXJyZW50Q29sdW1uID0gKGN1cnJlbnRDb2x1bW4gKyAxKSAlIF9jb2x1bW5Db3VudDsKCiAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGNvbHVtbiwgd2UgbmVlZCB0byB3cmFwIHRvIHRoZSBuZXh0IGxpbmUuCiAgICBpZiAoY29sdW1uID09IF9jb2x1bW5Db3VudCAtIDEpIG5ld2xpbmVzTmVlZGVkKys7CgogICAgLy8gS2VlcCB0cmFjayBvZiBob3cgbWFueSBjb25zZWN1dGl2ZSBsaW5lcyB3ZSd2ZSB3cml0dGVuIGluIHRoZSBsYXN0CiAgICAvLyBjb2x1bW4uCiAgICBpZiAoY29sdW1uID09IF9jb2x1bW5Db3VudCAtIDEpIHsKICAgICAgbnVtSGVscExpbmVzKys7CiAgICB9IGVsc2UgewogICAgICBudW1IZWxwTGluZXMgPSAwOwogICAgfQogIH0KCiAgU3RyaW5nIGJ1aWxkQWxsb3dlZExpc3QoT3B0aW9uIG9wdGlvbikgewogICAgdmFyIGlzRGVmYXVsdCA9IG9wdGlvbi5kZWZhdWx0c1RvIGlzIExpc3QKICAgICAgICA/IG9wdGlvbi5kZWZhdWx0c1RvLmNvbnRhaW5zCiAgICAgICAgOiAodmFsdWUpID0+IHZhbHVlID09IG9wdGlvbi5kZWZhdWx0c1RvOwoKICAgIHZhciBhbGxvd2VkQnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBhbGxvd2VkQnVmZmVyLndyaXRlKCdbJyk7CiAgICB2YXIgZmlyc3QgPSB0cnVlOwogICAgZm9yICh2YXIgYWxsb3dlZCBpbiBvcHRpb24uYWxsb3dlZCkgewogICAgICBpZiAoIWZpcnN0KSBhbGxvd2VkQnVmZmVyLndyaXRlKCcsICcpOwogICAgICBhbGxvd2VkQnVmZmVyLndyaXRlKGFsbG93ZWQpOwogICAgICBpZiAoaXNEZWZhdWx0KGFsbG93ZWQpKSB7CiAgICAgICAgYWxsb3dlZEJ1ZmZlci53cml0ZSgnIChkZWZhdWx0KScpOwogICAgICB9CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICBhbGxvd2VkQnVmZmVyLndyaXRlKCddJyk7CiAgICByZXR1cm4gYWxsb3dlZEJ1ZmZlci50b1N0cmluZygpOwogIH0KfQqBEgBOTjwBHAEXFQFOGQRMJwQxOAROTw4lIQFFIwE3FwE0Bk5HGQEuGgFQJgZOT0IYAU8PBkxJDxoBUU02GAE3AU9BFh0BHQE6KUc1KRwSCAEwIQEpJwE2AShMHRMpMy4KEyssIikoCiZJEREgTBgKDyk8CggBTk1NOycGAR4EASs2ASgQHCgNIwYBRgETBAE6Li4oQQQBIRITLychAUM9ASM9ASkoN0wKCAYBKxAiBAETFhcWBAEoIj8/JR8eNQEgFU4IARwGAS84HwYBRxoGAR4fBgQBLCMhGhgGAVAZJi45DxwIOgYBKCc5DSwaBgEjOAFINgFKDyYWDRgGBAErLiUxASgeFiotJCArCBUGHiUEAgEbcGFja2FnZTphcmdzL3NyYy91c2FnZS5kYXJ0UmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb2xsZWN0aW9uL2xpYi9jb2xsZWN0aW9uLmRhcnSDOi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpleHBvcnQgInNyYy9hbGdvcml0aG1zLmRhcnQiOwpleHBvcnQgInNyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0IjsKZXhwb3J0ICJzcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfaXRlcmFibGUuZGFydCI7CmV4cG9ydCAic3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2xpc3QuZGFydCI7CmV4cG9ydCAic3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0IjsKZXhwb3J0ICJzcmMvY29tcGFyYXRvcnMuZGFydCI7CmV4cG9ydCAic3JjL2VxdWFsaXR5LmRhcnQiOwpleHBvcnQgInNyYy9lcXVhbGl0eV9tYXAuZGFydCI7CmV4cG9ydCAic3JjL2VxdWFsaXR5X3NldC5kYXJ0IjsKZXhwb3J0ICJzcmMvZnVuY3Rpb25zLmRhcnQiOwpleHBvcnQgInNyYy9pdGVyYWJsZV96aXAuZGFydCI7CmV4cG9ydCAic3JjL3ByaW9yaXR5X3F1ZXVlLmRhcnQiOwpleHBvcnQgInNyYy9xdWV1ZV9saXN0LmRhcnQiOwpleHBvcnQgInNyYy91bmlvbl9zZXQuZGFydCI7CmV4cG9ydCAic3JjL3VuaW9uX3NldF9jb250cm9sbGVyLmRhcnQiOwpleHBvcnQgInNyYy91bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydCI7CmV4cG9ydCAic3JjL3dyYXBwZXJzLmRhcnQiOwoXAE5OPAEeJTczMh8cICAdICIeHSgpHAEicGFja2FnZTpjb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydExmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29udmVydC9saWIvY29udmVydC5kYXJ0gbcvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0OwoKZXhwb3J0ICdzcmMvYWNjdW11bGF0b3Jfc2luay5kYXJ0JzsKZXhwb3J0ICdzcmMvYnl0ZV9hY2N1bXVsYXRvcl9zaW5rLmRhcnQnOwpleHBvcnQgJ3NyYy9oZXguZGFydCc7CmV4cG9ydCAnc3JjL2lkZW50aXR5X2NvZGVjLmRhcnQnOwpleHBvcnQgJ3NyYy9wZXJjZW50LmRhcnQnOwpleHBvcnQgJ3NyYy9zdHJpbmdfYWNjdW11bGF0b3Jfc2luay5kYXJ0JzsKDgBOTjwBEQEkKRciGysBHHBhY2thZ2U6Y29udmVydC9jb252ZXJ0LmRhcnRTZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NyeXB0by9saWIvc3JjL2RpZ2VzdF9zaW5rLmRhcnSC4i8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RpZ2VzdC5kYXJ0JzsKCi8vLyBBIHNpbmsgdXNlZCB0byBnZXQgYSBkaWdlc3QgdmFsdWUgb3V0IG9mIGBIYXNoLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb25gLgpjbGFzcyBEaWdlc3RTaW5rIGV4dGVuZHMgU2luazxEaWdlc3Q+IHsKICAvLy8gVGhlIHZhbHVlIGFkZGVkIHRvIHRoZSBzaW5rLCBpZiBhbnkuCiAgRGlnZXN0IGdldCB2YWx1ZSB7CiAgICBhc3NlcnQoX3ZhbHVlICE9IG51bGwpOwogICAgcmV0dXJuIF92YWx1ZTsKICB9CgogIERpZ2VzdCBfdmFsdWU7CgogIC8vLyBBZGRzIFt2YWx1ZV0gdG8gdGhlIHNpbmsuCiAgLy8vCiAgLy8vIFVubGlrZSBtb3N0IHNpbmtzLCB0aGlzIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLgogIEBvdmVycmlkZQogIHZvaWQgYWRkKERpZ2VzdCB2YWx1ZSkgewogICAgYXNzZXJ0KF92YWx1ZSA9PSBudWxsKTsKICAgIF92YWx1ZSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjbG9zZSgpIHsKICAgIGFzc2VydChfdmFsdWUgIT0gbnVsbCk7CiAgfQp9CiAATk48ARYBTCgrFRwTBAERASAGNwwbHBQEAQwRHAQCASNwYWNrYWdlOmNyeXB0by9zcmMvZGlnZXN0X3NpbmsuZGFydFFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY3J5cHRvL2xpYi9zcmMvaGFzaF9zaW5rLmRhcnSU9S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnQnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CgovLy8gQSBiYXNlIGNsYXNzIGZvciBbU2lua10gaW1wbGVtZW50YXRpb25zIGZvciBoYXNoIGFsZ29yaXRobXMuCi8vLwovLy8gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgW3VwZGF0ZUhhc2hdIGFuZCBbZGlnZXN0XS4KYWJzdHJhY3QgY2xhc3MgSGFzaFNpbmsgaW1wbGVtZW50cyBTaW5rPExpc3Q8aW50Pj4gewogIC8vLyBUaGUgaW5uZXIgc2luayB0aGF0IHRoaXMgc2hvdWxkIGZvcndhcmQgdG8uCiAgZmluYWwgU2luazxEaWdlc3Q+IF9zaW5rOwoKICAvLy8gV2hldGhlciB0aGUgaGFzaCBmdW5jdGlvbiBvcGVyYXRlcyBvbiBiaWctZW5kaWFuIHdvcmRzLgogIGZpbmFsIEVuZGlhbiBfZW5kaWFuOwoKICAvLy8gVGhlIHdvcmRzIGluIHRoZSBjdXJyZW50IGNodW5rLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlIHRvIGF2b2lkIHJlLWFsbG9jYXRpbmcsIGJ1dCBpdHMgZGF0YSBpc24ndAogIC8vLyB1c2VkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiBbX2l0ZXJhdGVdLgogIGZpbmFsIFVpbnQzMkxpc3QgX2N1cnJlbnRDaHVuazsKCiAgLy8vIE1lc3NhZ2VzIHdpdGggbW9yZSB0aGFuIDJeNTMtMSBiaXRzIGFyZSBub3Qgc3VwcG9ydGVkLiAoVGhpcyBpcyB0aGUKICAvLy8gbGFyZ2VzdCB2YWx1ZSB0aGF0IGlzIHJlcHJlc2VudGFibGUgb24gYm90aCBKUyBhbmQgdGhlIERhcnQgVk0uKQogIC8vLyBTbyB0aGUgbWF4aW11bSBsZW5ndGggaW4gYnl0ZXMgaXMgKDJeNTMtMSkvOC4KICBzdGF0aWMgY29uc3QgX21heE1lc3NhZ2VMZW5ndGhJbkJ5dGVzID0gMHgwMDAzZmZmZmZmZmZmZmZmOwoKICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YSBzbyBmYXIsIGluIGJ5dGVzLgogIGludCBfbGVuZ3RoSW5CeXRlcyA9IDA7CgogIC8vLyBEYXRhIHRoYXQgaGFzIHlldCB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGhhc2ggZnVuY3Rpb24uCiAgZmluYWwgX3BlbmRpbmdEYXRhID0gVWludDhCdWZmZXIoKTsKCiAgLy8vIFdoZXRoZXIgW2Nsb3NlXSBoYXMgYmVlbiBjYWxsZWQuCiAgYm9vbCBfaXNDbG9zZWQgPSBmYWxzZTsKCiAgLy8vIFRoZSB3b3JkcyBpbiB0aGUgY3VycmVudCBkaWdlc3QuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIGJlIHVwZGF0ZWQgZWFjaCB0aW1lIFt1cGRhdGVIYXNoXSBpcyBjYWxsZWQuCiAgVWludDMyTGlzdCBnZXQgZGlnZXN0OwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBoYXNoLgogIC8vLwogIC8vLyBbY2h1bmtTaXplSW5Xb3Jkc10gcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgY2h1bmtzIHByb2Nlc3NlZCBieQogIC8vLyB0aGUgYWxnb3JpdGhtLCBpbiB0ZXJtcyBvZiAzMi1iaXQgd29yZHMuCiAgSGFzaFNpbmsodGhpcy5fc2luaywgaW50IGNodW5rU2l6ZUluV29yZHMsIHtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ30pCiAgICAgIDogX2VuZGlhbiA9IGVuZGlhbiwKICAgICAgICBfY3VycmVudENodW5rID0gVWludDMyTGlzdChjaHVua1NpemVJbldvcmRzKTsKCiAgLy8vIFJ1bnMgYSBzaW5nbGUgaXRlcmF0aW9uIG9mIHRoZSBoYXNoIGNvbXB1dGF0aW9uLCB1cGRhdGluZyBbZGlnZXN0XSB3aXRoCiAgLy8vIHRoZSByZXN1bHQuCiAgLy8vCiAgLy8vIFtjaHVua10gaXMgdGhlIGN1cnJlbnQgY2h1bmssIHdob3NlIHNpemUgaXMgZ2l2ZW4gYnkgdGhlCiAgLy8vIGBjaHVua1NpemVJbldvcmRzYCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KICB2b2lkIHVwZGF0ZUhhc2goVWludDMyTGlzdCBjaHVuayk7CgogIEBvdmVycmlkZQogIHZvaWQgYWRkKExpc3Q8aW50PiBkYXRhKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB0aHJvdyBTdGF0ZUVycm9yKCdIYXNoLmFkZCgpIGNhbGxlZCBhZnRlciBjbG9zZSgpLicpOwogICAgX2xlbmd0aEluQnl0ZXMgKz0gZGF0YS5sZW5ndGg7CiAgICBfcGVuZGluZ0RhdGEuYWRkQWxsKGRhdGEpOwogICAgX2l0ZXJhdGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2xvc2UoKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSByZXR1cm47CiAgICBfaXNDbG9zZWQgPSB0cnVlOwoKICAgIF9maW5hbGl6ZURhdGEoKTsKICAgIF9pdGVyYXRlKCk7CiAgICBhc3NlcnQoX3BlbmRpbmdEYXRhLmlzRW1wdHkpOwogICAgX3NpbmsuYWRkKERpZ2VzdChfYnl0ZURpZ2VzdCgpKSk7CiAgICBfc2luay5jbG9zZSgpOwogIH0KCiAgVWludDhMaXN0IF9ieXRlRGlnZXN0KCkgewogICAgaWYgKF9lbmRpYW4gPT0gRW5kaWFuLmhvc3QpIHJldHVybiBkaWdlc3QuYnVmZmVyLmFzVWludDhMaXN0KCk7CgogICAgdmFyIGJ5dGVEaWdlc3QgPSBVaW50OExpc3QoZGlnZXN0Lmxlbmd0aEluQnl0ZXMpOwogICAgdmFyIGJ5dGVEYXRhID0gYnl0ZURpZ2VzdC5idWZmZXIuYXNCeXRlRGF0YSgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWdlc3QubGVuZ3RoOyBpKyspIHsKICAgICAgYnl0ZURhdGEuc2V0VWludDMyKGkgKiBieXRlc1BlcldvcmQsIGRpZ2VzdFtpXSk7CiAgICB9CiAgICByZXR1cm4gYnl0ZURpZ2VzdDsKICB9CgogIC8vLyBJdGVyYXRlcyB0aHJvdWdoIFtfcGVuZGluZ0RhdGFdLCB1cGRhdGluZyB0aGUgaGFzaCBjb21wdXRhdGlvbiBmb3IgZWFjaAogIC8vLyBjaHVuay4KICB2b2lkIF9pdGVyYXRlKCkgewogICAgdmFyIHBlbmRpbmdEYXRhQnl0ZXMgPSBfcGVuZGluZ0RhdGEuYnVmZmVyLmFzQnl0ZURhdGEoKTsKICAgIHZhciBwZW5kaW5nRGF0YUNodW5rcyA9IF9wZW5kaW5nRGF0YS5sZW5ndGggfi8gX2N1cnJlbnRDaHVuay5sZW5ndGhJbkJ5dGVzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwZW5kaW5nRGF0YUNodW5rczsgaSsrKSB7CiAgICAgIC8vIENvcHkgd29yZHMgZnJvbSB0aGUgcGVuZGluZyBkYXRhIGJ1ZmZlciBpbnRvIHRoZSBjdXJyZW50IGNodW5rIGJ1ZmZlci4KICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3VycmVudENodW5rLmxlbmd0aDsgaisrKSB7CiAgICAgICAgX2N1cnJlbnRDaHVua1tqXSA9IHBlbmRpbmdEYXRhQnl0ZXMuZ2V0VWludDMyKAogICAgICAgICAgICBpICogX2N1cnJlbnRDaHVuay5sZW5ndGhJbkJ5dGVzICsgaiAqIGJ5dGVzUGVyV29yZCwgX2VuZGlhbik7CiAgICAgIH0KCiAgICAgIC8vIFJ1biB0aGUgaGFzaCBmdW5jdGlvbiBvbiB0aGUgY3VycmVudCBjaHVuay4KICAgICAgdXBkYXRlSGFzaChfY3VycmVudENodW5rKTsKICAgIH0KCiAgICAvLyBSZW1vdmUgYWxsIHBlbmRpbmcgZGF0YSB1cCB0byB0aGUgbGFzdCBjbGVhbiBjaHVuayBicmVhay4KICAgIF9wZW5kaW5nRGF0YS5yZW1vdmVSYW5nZSgKICAgICAgICAwLCBwZW5kaW5nRGF0YUNodW5rcyAqIF9jdXJyZW50Q2h1bmsubGVuZ3RoSW5CeXRlcyk7CiAgfQoKICAvLy8gRmluYWxpemVzIFtfcGVuZGluZ0RhdGFdLgogIC8vLwogIC8vLyBUaGlzIGFkZHMgYSAxIGJpdCB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLCBhbmQgZXhwYW5kcyBpdCB3aXRoIDAgYml0cyB0bwogIC8vLyBwYWQgaXQgb3V0LgogIHZvaWQgX2ZpbmFsaXplRGF0YSgpIHsKICAgIC8vIFBhZCBvdXQgdGhlIGRhdGEgd2l0aCAweDgwLCBlaWdodCAwcywgYW5kIGFzIG1hbnkgbW9yZSAwcyBhcyB3ZSBuZWVkIHRvCiAgICAvLyBsYW5kIGNsZWFubHkgb24gYSBjaHVuayBib3VuZGFyeS4KICAgIF9wZW5kaW5nRGF0YS5hZGQoMHg4MCk7CiAgICB2YXIgY29udGVudHNMZW5ndGggPSBfbGVuZ3RoSW5CeXRlcyArIDk7CiAgICB2YXIgZmluYWxpemVkTGVuZ3RoID0gX3JvdW5kVXAoY29udGVudHNMZW5ndGgsIF9jdXJyZW50Q2h1bmsubGVuZ3RoSW5CeXRlcyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbmFsaXplZExlbmd0aCAtIGNvbnRlbnRzTGVuZ3RoOyBpKyspIHsKICAgICAgX3BlbmRpbmdEYXRhLmFkZCgwKTsKICAgIH0KCiAgICBpZiAoX2xlbmd0aEluQnl0ZXMgPiBfbWF4TWVzc2FnZUxlbmd0aEluQnl0ZXMpIHsKICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICdIYXNoaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBtZXNzYWdlcyB3aXRoIG1vcmUgdGhhbiAyXjUzIGJpdHMuJyk7CiAgICB9CgogICAgdmFyIGxlbmd0aEluQml0cyA9IF9sZW5ndGhJbkJ5dGVzICogYml0c1BlckJ5dGU7CgogICAgLy8gQWRkIHRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YSBhcyBhIDY0LWJpdCB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZQogICAgLy8gaGFzaC4KICAgIHZhciBvZmZzZXQgPSBfcGVuZGluZ0RhdGEubGVuZ3RoOwogICAgX3BlbmRpbmdEYXRhLmFkZEFsbChVaW50OExpc3QoOCkpOwogICAgdmFyIGJ5dGVEYXRhID0gX3BlbmRpbmdEYXRhLmJ1ZmZlci5hc0J5dGVEYXRhKCk7CgogICAgLy8gV2UncmUgZXNzZW50aWFsbHkgZG9pbmcgYnl0ZURhdGEuc2V0VWludDY0KG9mZnNldCwgbGVuZ3RoSW5CaXRzLCBfZW5kaWFuKQogICAgLy8gaGVyZSwgYnV0IHRoYXQgbWV0aG9kIGlzbid0IHN1cHBvcnRlZCBvbiBkYXJ0MmpzIHNvIHdlIGltcGxlbWVudCBpdAogICAgLy8gbWFudWFsbHkgaW5zdGVhZC4KICAgIHZhciBoaWdoQml0cyA9IGxlbmd0aEluQml0cyA+PiAzMjsKICAgIHZhciBsb3dCaXRzID0gbGVuZ3RoSW5CaXRzICYgbWFzazMyOwogICAgaWYgKF9lbmRpYW4gPT0gRW5kaWFuLmJpZykgewogICAgICBieXRlRGF0YS5zZXRVaW50MzIob2Zmc2V0LCBoaWdoQml0cywgX2VuZGlhbik7CiAgICAgIGJ5dGVEYXRhLnNldFVpbnQzMihvZmZzZXQgKyBieXRlc1BlcldvcmQsIGxvd0JpdHMsIF9lbmRpYW4pOwogICAgfSBlbHNlIHsKICAgICAgYnl0ZURhdGEuc2V0VWludDMyKG9mZnNldCwgbG93Qml0cywgX2VuZGlhbik7CiAgICAgIGJ5dGVEYXRhLnNldFVpbnQzMihvZmZzZXQgKyBieXRlc1BlcldvcmQsIGhpZ2hCaXRzLCBfZW5kaWFuKTsKICAgIH0KICB9CgogIC8vLyBSb3VuZHMgW3ZhbF0gdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgW25dLCBhcyBsb25nIGFzIFtuXSBpcyBhIHBvd2VyIG9mCiAgLy8vIHR3by4KICBpbnQgX3JvdW5kVXAoaW50IHZhbCwgaW50IG4pID0+ICh2YWwgKyBuIC0gMSkgJiAtbjsKfQqAoABOTjwBGgEtARYVAUEEOjUyHAE+GAEmBk4tIgFKRzQ+ATUaAT4mAScaAScGPxkBGgZOL0saNgFOEgY/PiUBDB1JIx8QBAEMERsWARUQIiYTBAEcRAE2My43BhcEAU4NFD1QMlA3N0oIATUhBgFBHj0EASAGURIZTykcLVFBGwYBNR5MBgE1AVENJic1AVFLGScpITVDDTREBgQBUAs2AgEhcGFja2FnZTpjcnlwdG8vc3JjL2hhc2hfc2luay5kYXJ0TWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jcnlwdG8vbGliL3NyYy91dGlscy5kYXJ0guwvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEEgYml0bWFzayB0aGF0IGxpbWl0cyBhbiBpbnRlZ2VyIHRvIDMyIGJpdHMuCmNvbnN0IG1hc2szMiA9IDB4RkZGRkZGRkY7CgovLy8gVGhlIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZS4KY29uc3QgYml0c1BlckJ5dGUgPSA4OwoKLy8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSAzMi1iaXQgd29yZC4KY29uc3QgYnl0ZXNQZXJXb3JkID0gNDsKCi8vLyBBZGRzIFt4XSBhbmQgW3ldIHdpdGggMzItYml0IG92ZXJmbG93IHNlbWFudGljcy4KaW50IGFkZDMyKGludCB4LCBpbnQgeSkgPT4gKHggKyB5KSAmIG1hc2szMjsKCi8vLyBCaXR3aXNlIHJvdGF0ZXMgW3ZhbF0gdG8gdGhlIGxlZnQgYnkgW3NoaWZ0XSwgb2JleWluZyAzMi1iaXQgb3ZlcmZsb3cKLy8vIHNlbWFudGljcy4KaW50IHJvdGwzMihpbnQgdmFsLCBpbnQgc2hpZnQpIHsKICB2YXIgbW9kU2hpZnQgPSBzaGlmdCAmIDMxOwogIHJldHVybiAoKHZhbCA8PCBtb2RTaGlmdCkgJiBtYXNrMzIpIHwgKCh2YWwgJiBtYXNrMzIpID4+ICgzMiAtIG1vZFNoaWZ0KSk7Cn0KGABOTjwBMRsBIhcBKhgBNS0BSg8hHU0CAR1wYWNrYWdlOmNyeXB0by9zcmMvdXRpbHMuZGFydFhmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY3J5cHRvL2xpYi9zcmMvc2hhNTEyX2Zhc3RzaW5rcy5kYXJ0mAEvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICdkaWdlc3QuZGFydCc7CmltcG9ydCAnaGFzaF9zaW5rLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgX1NoYTY0Qml0U2luayBleHRlbmRzIEhhc2hTaW5rIHsKICBpbnQgZ2V0IGRpZ2VzdEJ5dGVzOwoKICBAb3ZlcnJpZGUKICBVaW50MzJMaXN0IGdldCBkaWdlc3QgewogICAgdmFyIHVub3JkZXJlZCA9IF9kaWdlc3QuYnVmZmVyLmFzVWludDMyTGlzdCgpOwogICAgdmFyIG9yZGVyZWQgPSBVaW50MzJMaXN0KGRpZ2VzdEJ5dGVzKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0Qnl0ZXM7IGkrKykgewogICAgICBvcmRlcmVkW2ldID0gdW5vcmRlcmVkW2kgKyAoaS5pc0V2ZW4gPyAxIDogLTEpXTsKICAgIH0KICAgIHJldHVybiBvcmRlcmVkOwogIH0KCiAgLy8gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgaGFzaCBwYXJ0cy4gRmlyc3QgNjQgYml0cyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0cwogIC8vIG9mIHRoZSBzcXVhcmUgcm9vdHMgb2YgdGhlIG5pbnRoIHRocm91Z2ggc2l4dGVlbnRoIHByaW1lIG51bWJlcnMuCiAgZmluYWwgVWludDY0TGlzdCBfZGlnZXN0OwoKICAvLy8gVGhlIHNpeHRlZW4gd29yZHMgZnJvbSB0aGUgb3JpZ2luYWwgY2h1bmssIGV4dGVuZGVkIHRvIDY0IHdvcmRzLgogIC8vLwogIC8vLyBUaGlzIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlIHRvIGF2b2lkIHJlLWFsbG9jYXRpbmcsIGJ1dCBpdHMgZGF0YSBpc24ndAogIC8vLyB1c2VkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiBbdXBkYXRlSGFzaF0uCiAgZmluYWwgX2V4dGVuZGVkID0gVWludDY0TGlzdCg4MCk7CgogIF9TaGE2NEJpdFNpbmsoU2luazxEaWdlc3Q+IHNpbmssIHRoaXMuX2RpZ2VzdCkgOiBzdXBlcihzaW5rLCAzMik7CiAgLy8gVGhlIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb25zIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tCiAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjIzNC4KCiAgc3RhdGljIGludCBfcm90cjY0KGludCBuLCBpbnQgeCkgPT4gX3NocjY0KG4sIHgpIHwgKHggPDwgKDY0IC0gbikpOwogIHN0YXRpYyBpbnQgX3NocjY0KGludCBuLCBpbnQgeCkgPT4gKHggPj4gbikgJiB+KC0xIDw8ICg2NCAtIG4pKTsKCiAgc3RhdGljIGludCBfY2goaW50IHgsIGludCB5LCBpbnQgeikgPT4gKHggJiB5KSBeICh+eCAmIHopOwogIHN0YXRpYyBpbnQgX21haihpbnQgeCwgaW50IHksIGludCB6KSA9PiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7CiAgc3RhdGljIGludCBfYnNpZzAoaW50IHgpID0+IF9yb3RyNjQoMjgsIHgpIF4gX3JvdHI2NCgzNCwgeCkgXiBfcm90cjY0KDM5LCB4KTsKICBzdGF0aWMgaW50IF9ic2lnMShpbnQgeCkgPT4gX3JvdHI2NCgxNCwgeCkgXiBfcm90cjY0KDE4LCB4KSBeIF9yb3RyNjQoNDEsIHgpOwogIHN0YXRpYyBpbnQgX3NzaWcwKGludCB4KSA9PiBfcm90cjY0KDEsIHgpIF4gX3JvdHI2NCg4LCB4KSBeIF9zaHI2NCg3LCB4KTsKICBzdGF0aWMgaW50IF9zc2lnMShpbnQgeCkgPT4gX3JvdHI2NCgxOSwgeCkgXiBfcm90cjY0KDYxLCB4KSBeIF9zaHI2NCg2LCB4KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB1cGRhdGVIYXNoKFVpbnQzMkxpc3QgY2h1bmspIHsKICAgIGFzc2VydChjaHVuay5sZW5ndGggPT0gMzIpOwoKICAgIC8vIFByZXBhcmUgbWVzc2FnZSBzY2hlZHVsZS4KICAgIGZvciAodmFyIGkgPSAwLCB4ID0gMDsgaSA8IDMyOyBpICs9IDIsIHgrKykgewogICAgICBfZXh0ZW5kZWRbeF0gPSAoY2h1bmtbaV0gPDwgMzIpIHwgY2h1bmtbaSArIDFdOwogICAgfQoKICAgIGZvciAodmFyIHQgPSAxNjsgdCA8IDgwOyB0KyspIHsKICAgICAgX2V4dGVuZGVkW3RdID0gX3NzaWcxKF9leHRlbmRlZFt0IC0gMl0pICsKICAgICAgICAgIF9leHRlbmRlZFt0IC0gN10gKwogICAgICAgICAgX3NzaWcwKF9leHRlbmRlZFt0IC0gMTVdKSArCiAgICAgICAgICBfZXh0ZW5kZWRbdCAtIDE2XTsKICAgIH0KCiAgICAvLyBTaHVmZmxlIGFyb3VuZCB0aGUgYml0cy4KICAgIHZhciBhID0gX2RpZ2VzdFswXTsKICAgIHZhciBiID0gX2RpZ2VzdFsxXTsKICAgIHZhciBjID0gX2RpZ2VzdFsyXTsKICAgIHZhciBkID0gX2RpZ2VzdFszXTsKICAgIHZhciBlID0gX2RpZ2VzdFs0XTsKICAgIHZhciBmID0gX2RpZ2VzdFs1XTsKICAgIHZhciBnID0gX2RpZ2VzdFs2XTsKICAgIHZhciBoID0gX2RpZ2VzdFs3XTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpKyspIHsKICAgICAgdmFyIHRlbXAxID0gaCArIF9ic2lnMShlKSArIF9jaChlLCBmLCBnKSArIF9ub2lzZTY0W2ldICsgX2V4dGVuZGVkW2ldOwogICAgICB2YXIgdGVtcDIgPSBfYnNpZzAoYSkgKyBfbWFqKGEsIGIsIGMpOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBlID0gZCArIHRlbXAxOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhOwogICAgICBhID0gdGVtcDEgKyB0ZW1wMjsKICAgIH0KCiAgICAvLyBVcGRhdGUgaGFzaCB2YWx1ZXMgYWZ0ZXIgaXRlcmF0aW9uLgogICAgX2RpZ2VzdFswXSArPSBhOwogICAgX2RpZ2VzdFsxXSArPSBiOwogICAgX2RpZ2VzdFsyXSArPSBjOwogICAgX2RpZ2VzdFszXSArPSBkOwogICAgX2RpZ2VzdFs0XSArPSBlOwogICAgX2RpZ2VzdFs1XSArPSBmOwogICAgX2RpZ2VzdFs2XSArPSBnOwogICAgX2RpZ2VzdFs3XSArPSBoOwogIH0KfQoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbU2hhMzg0XS4KLy8vCi8vLyBUaGlzIGlzIHNlcGFyYXRlIHNvIHRoYXQgaXQgY2FuIGV4dGVuZCBbSGFzaFNpbmtdIHdpdGhvdXQgbGVha2luZyBhZGRpdGlvbmFsCi8vLyBwdWJsaWMgbWVtYmVycy4KY2xhc3MgU2hhMzg0U2luayBleHRlbmRzIF9TaGE2NEJpdFNpbmsgewogIEBvdmVycmlkZQogIGZpbmFsIGRpZ2VzdEJ5dGVzID0gMTI7CgogIFNoYTM4NFNpbmsoU2luazxEaWdlc3Q+IHNpbmspCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHNpbmssCiAgICAgICAgICAgIFVpbnQ2NExpc3QuZnJvbUxpc3QoWwogICAgICAgICAgICAgIDB4Y2JiYjlkNWRjMTA1OWVkOCwKICAgICAgICAgICAgICAweDYyOWEyOTJhMzY3Y2Q1MDcsCiAgICAgICAgICAgICAgMHg5MTU5MDE1YTMwNzBkZDE3LAogICAgICAgICAgICAgIDB4MTUyZmVjZDhmNzBlNTkzOSwKICAgICAgICAgICAgICAweDY3MzMyNjY3ZmZjMDBiMzEsCiAgICAgICAgICAgICAgMHg4ZWI0NGE4NzY4NTgxNTExLAogICAgICAgICAgICAgIDB4ZGIwYzJlMGQ2NGY5OGZhNywKICAgICAgICAgICAgICAweDQ3YjU0ODFkYmVmYTRmYTQsCiAgICAgICAgICAgIF0pKTsKfQoKLy8vIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbU2hhNTEyXS4KLy8vCi8vLyBUaGlzIGlzIHNlcGFyYXRlIHNvIHRoYXQgaXQgY2FuIGV4dGVuZCBbSGFzaFNpbmtdIHdpdGhvdXQgbGVha2luZyBhZGRpdGlvbmFsCi8vLyBwdWJsaWMgbWVtYmVycy4KY2xhc3MgU2hhNTEyU2luayBleHRlbmRzIF9TaGE2NEJpdFNpbmsgewogIEBvdmVycmlkZQogIGZpbmFsIGRpZ2VzdEJ5dGVzID0gMTY7CgogIFNoYTUxMlNpbmsoU2luazxEaWdlc3Q+IHNpbmspCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHNpbmssCiAgICAgICAgICAgIFVpbnQ2NExpc3QuZnJvbUxpc3QoWwogICAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWUgb2YgdGhlIGhhc2ggcGFydHMuIEZpcnN0IDY0IGJpdHMgb2YgdGhlIGZyYWN0aW9uYWwKICAgICAgICAgICAgICAvLyBwYXJ0cyBvZiB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBmaXJzdCBlaWdodCBwcmltZSBudW1iZXJzLgogICAgICAgICAgICAgIDB4NmEwOWU2NjdmM2JjYzkwOCwKICAgICAgICAgICAgICAweGJiNjdhZTg1ODRjYWE3M2IsCiAgICAgICAgICAgICAgMHgzYzZlZjM3MmZlOTRmODJiLAogICAgICAgICAgICAgIDB4YTU0ZmY1M2E1ZjFkMzZmMSwKICAgICAgICAgICAgICAweDUxMGU1MjdmYWRlNjgyZDEsCiAgICAgICAgICAgICAgMHg5YjA1Njg4YzJiM2U2YzFmLAogICAgICAgICAgICAgIDB4MWY4M2Q5YWJmYjQxYmQ2YiwKICAgICAgICAgICAgICAweDViZTBjZDE5MTM3ZTIxNzksCiAgICAgICAgICAgIF0pKTsKfQoKZmluYWwgX25vaXNlNjQgPSBVaW50NjRMaXN0LmZyb21MaXN0KFsKICAweDQyOGEyZjk4ZDcyOGFlMjIsCiAgMHg3MTM3NDQ5MTIzZWY2NWNkLAogIDB4YjVjMGZiY2ZlYzRkM2IyZiwKICAweGU5YjVkYmE1ODE4OWRiYmMsCiAgMHgzOTU2YzI1YmYzNDhiNTM4LAogIDB4NTlmMTExZjFiNjA1ZDAxOSwKICAweDkyM2Y4MmE0YWYxOTRmOWIsCiAgMHhhYjFjNWVkNWRhNmQ4MTE4LAogIDB4ZDgwN2FhOThhMzAzMDI0MiwKICAweDEyODM1YjAxNDU3MDZmYmUsCiAgMHgyNDMxODViZTRlZTRiMjhjLAogIDB4NTUwYzdkYzNkNWZmYjRlMiwKICAweDcyYmU1ZDc0ZjI3Yjg5NmYsCiAgMHg4MGRlYjFmZTNiMTY5NmIxLAogIDB4OWJkYzA2YTcyNWM3MTIzNSwKICAweGMxOWJmMTc0Y2Y2OTI2OTQsCiAgMHhlNDliNjljMTllZjE0YWQyLAogIDB4ZWZiZTQ3ODYzODRmMjVlMywKICAweDBmYzE5ZGM2OGI4Y2Q1YjUsCiAgMHgyNDBjYTFjYzc3YWM5YzY1LAogIDB4MmRlOTJjNmY1OTJiMDI3NSwKICAweDRhNzQ4NGFhNmVhNmU0ODMsCiAgMHg1Y2IwYTlkY2JkNDFmYmQ0LAogIDB4NzZmOTg4ZGE4MzExNTNiNSwKICAweDk4M2U1MTUyZWU2NmRmYWIsCiAgMHhhODMxYzY2ZDJkYjQzMjEwLAogIDB4YjAwMzI3Yzg5OGZiMjEzZiwKICAweGJmNTk3ZmM3YmVlZjBlZTQsCiAgMHhjNmUwMGJmMzNkYTg4ZmMyLAogIDB4ZDVhNzkxNDc5MzBhYTcyNSwKICAweDA2Y2E2MzUxZTAwMzgyNmYsCiAgMHgxNDI5Mjk2NzBhMGU2ZTcwLAogIDB4MjdiNzBhODU0NmQyMmZmYywKICAweDJlMWIyMTM4NWMyNmM5MjYsCiAgMHg0ZDJjNmRmYzVhYzQyYWVkLAogIDB4NTMzODBkMTM5ZDk1YjNkZiwKICAweDY1MGE3MzU0OGJhZjYzZGUsCiAgMHg3NjZhMGFiYjNjNzdiMmE4LAogIDB4ODFjMmM5MmU0N2VkYWVlNiwKICAweDkyNzIyYzg1MTQ4MjM1M2IsCiAgMHhhMmJmZThhMTRjZjEwMzY0LAogIDB4YTgxYTY2NGJiYzQyMzAwMSwKICAweGMyNGI4YjcwZDBmODk3OTEsCiAgMHhjNzZjNTFhMzA2NTRiZTMwLAogIDB4ZDE5MmU4MTlkNmVmNTIxOCwKICAweGQ2OTkwNjI0NTU2NWE5MTAsCiAgMHhmNDBlMzU4NTU3NzEyMDJhLAogIDB4MTA2YWEwNzAzMmJiZDFiOCwKICAweDE5YTRjMTE2YjhkMmQwYzgsCiAgMHgxZTM3NmMwODUxNDFhYjUzLAogIDB4Mjc0ODc3NGNkZjhlZWI5OSwKICAweDM0YjBiY2I1ZTE5YjQ4YTgsCiAgMHgzOTFjMGNiM2M1Yzk1YTYzLAogIDB4NGVkOGFhNGFlMzQxOGFjYiwKICAweDViOWNjYTRmNzc2M2UzNzMsCiAgMHg2ODJlNmZmM2Q2YjJiOGEzLAogIDB4NzQ4ZjgyZWU1ZGVmYjJmYywKICAweDc4YTU2MzZmNDMxNzJmNjAsCiAgMHg4NGM4NzgxNGExZjBhYjcyLAogIDB4OGNjNzAyMDgxYTY0MzllYywKICAweDkwYmVmZmZhMjM2MzFlMjgsCiAgMHhhNDUwNmNlYmRlODJiZGU5LAogIDB4YmVmOWEzZjdiMmM2NzkxNSwKICAweGM2NzE3OGYyZTM3MjUzMmIsCiAgMHhjYTI3M2VjZWVhMjY2MTljLAogIDB4ZDE4NmI4YzcyMWMwYzIwNywKICAweGVhZGE3ZGQ2Y2RlMGViMWUsCiAgMHhmNTdkNGY3ZmVlNmVkMTc4LAogIDB4MDZmMDY3YWE3MjE3NmZiYSwKICAweDBhNjM3ZGM1YTJjODk4YTYsCiAgMHgxMTNmOTgwNGJlZjkwZGFlLAogIDB4MWI3MTBiMzUxMzFjNDcxYiwKICAweDI4ZGI3N2Y1MjMwNDdkODQsCiAgMHgzMmNhYWI3YjQwYzcyNDkzLAogIDB4M2M5ZWJlMGExNWM5YmViYywKICAweDQzMWQ2N2M0OWMxMDBkNGMsCiAgMHg0Y2M1ZDRiZWNiM2U0MmI2LAogIDB4NTk3ZjI5OWNmYzY1N2UyYSwKICAweDVmY2I2ZmFiM2FkNmZhZWMsCiAgMHg2YzQ0MTk4YzRhNDc1ODE3LApdKTsKgOUATk48ARoBFhkBMBcBDBozKyw3BhQEAUxHHAFHBk4vJAFEPCkBRkMBPUdQUExOAQwmIAEhMjYGASQwHSYdBgEgGBgYGBgYGBgBI00tDQ0NFQ0NDRkGASsVFRUVFRUVFQQCAS0EURQpDBoBIA8SIiIiIiIiIiIiEQIBLQRRFCkMGgEgDxIiUk0iIiIiIiIiIhECAScWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgQBKHBhY2thZ2U6Y3J5cHRvL3NyYy9zaGE1MTJfZmFzdHNpbmtzLmRhcnRlZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Vuc3RhYmxlL2J1aWxkX2ludGVncmF0aW9uLmRhcnSBBS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpleHBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCc7CgcATk48ASwBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvYnVpbGRfaW50ZWdyYXRpb24uZGFydGxmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvbWVzc2FnZXMvZGlhZ25vc3RpY19tZXNzYWdlLmRhcnSKwC8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5kaWFnbm9zdGljX21lc3NhZ2U7CgppbXBvcnQgJ2NvZGVzLmRhcnQnIHNob3cgQ29kZSwgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiwgRm9ybWF0dGVkTWVzc2FnZTsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCi8vLyBUaGUgdHlwZSBvZiBhIGRpYWdub3N0aWMgbWVzc2FnZSBjYWxsYmFjay4gRm9yIGV4YW1wbGU6Ci8vLwovLy8gICAgdm9pZCBoYW5kbGVyKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKLy8vICAgICAgaWYgKGVuYWJsZVRlcm1pbmFsQ29sb3JzKSB7IC8vIFNlZSBbdGVybWluYWxfY29sb3Jfc3VwcG9ydC5kYXJ0XS4KLy8vICAgICAgICBtZXNzYWdlLmFuc2lGb3JtYXR0ZWQuZm9yRWFjaChzdGRlcnIud3JpdGVsbik7Ci8vLyAgICAgIH0gZWxzZSB7Ci8vLyAgICAgICAgbWVzc2FnZS5wbGFpblRleHRGb3JtYXR0ZWQuZm9yRWFjaChzdGRlcnIud3JpdGVsbik7Ci8vLyAgICAgIH0KLy8vICAgIH0KdHlwZWRlZiBEaWFnbm9zdGljTWVzc2FnZUhhbmRsZXIgPSB2b2lkIEZ1bmN0aW9uKERpYWdub3N0aWNNZXNzYWdlKTsKCi8vLyBSZXByZXNlbnRzIGEgZGlhZ25vc3RpYyBtZXNzYWdlIHRoYXQgY2FuIGJlIHJlcG9ydGVkIGZyb20gYSB0b29sLCBmb3IKLy8vIGV4YW1wbGUsIGEgY29tcGlsZXIuCi8vLwovLy8gVGhlIHdvcmQgKmRpYWdub3N0aWMqIGlzIHVzZWQgbG9vc2VseSBoZXJlLCBhcyBhIHRvb2wgbWF5IGFsc28gdXNlIHRoaXMgZm9yCi8vLyByZXBvcnRpbmcgYW55IGtpbmQgb2YgbWVzc2FnZSwgaW5jbHVkaW5nIG5vbi1kaWFnbm9zdGljIG1lc3NhZ2VzIHN1Y2ggYXMKLy8vIGxpY2Vuc2luZywgaW5mb3JtYWwsIG9yIGxvZ2dpbmcgaW5mb3JtYXRpb24uIFRoaXMgYWxsb3dzIGEgd2VsbC1iZWhhdmVkCi8vLyB0b29sIHRvIG5ldmVyIGRpcmVjdGx5IHdyaXRlIHRvIHN0ZG91dCBvciBzdGRlcnIuCmFic3RyYWN0IGNsYXNzIERpYWdub3N0aWNNZXNzYWdlIHsKICBEaWFnbm9zdGljTWVzc2FnZS5fKCk7IC8vIFByZXZlbnQgc3ViY2xhc3NpbmcuCgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IGFuc2lGb3JtYXR0ZWQ7CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBsYWluVGV4dEZvcm1hdHRlZDsKCiAgU2V2ZXJpdHkgZ2V0IHNldmVyaXR5Owp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuClVyaSBnZXRNZXNzYWdlVXJpKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlCiAgICAgID8gbWVzc2FnZS51cmkKICAgICAgOiBtZXNzYWdlIGlzIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24gPyBtZXNzYWdlLnVyaSA6IG51bGw7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KaW50IGdldE1lc3NhZ2VDaGFyT2Zmc2V0KERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5jaGFyT2Zmc2V0IDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgppbnQgZ2V0TWVzc2FnZUxlbmd0aChEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UubGVuZ3RoIDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgpDb2RlIGdldE1lc3NhZ2VDb2RlT2JqZWN0KERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gbWVzc2FnZSBpcyBGb3JtYXR0ZWRNZXNzYWdlID8gbWVzc2FnZS5jb2RlIDogbnVsbDsKfQoKLy8vIFRoaXMgbWV0aG9kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgpTdHJpbmcgZ2V0TWVzc2FnZUhlYWRlclRleHQoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UgPyBtZXNzYWdlLm1lc3NhZ2UgOiBudWxsOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCmludCBnZXRNZXNzYWdlQ29kZShEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UuY29kZS5pbmRleCA6IC0xOwp9CgovLy8gVGhpcyBtZXRob2QgaXMgc3ViamVjdCB0byBjaGFuZ2UuCk1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldE1lc3NhZ2VBcmd1bWVudHMoRGlhZ25vc3RpY01lc3NhZ2UgbWVzc2FnZSkgewogIHJldHVybiBtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UgPyBtZXNzYWdlLmFyZ3VtZW50cyA6IG51bGw7Cn0KCi8vLyBUaGlzIG1ldGhvZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KSXRlcmFibGU8RGlhZ25vc3RpY01lc3NhZ2U+IGdldE1lc3NhZ2VSZWxhdGVkSW5mb3JtYXRpb24oCiAgICBEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgcmV0dXJuIG1lc3NhZ2UgaXMgRm9ybWF0dGVkTWVzc2FnZSA/IG1lc3NhZ2UucmVsYXRlZEluZm9ybWF0aW9uIDogbnVsbDsKfQpSAE5OPAEmAUwBJgE8BDFLOhI/CwlFAUoZBFBNTDYjMQEmASsBGQIBJi8lFEMCASY2QgIBJjI+AgEmNzwCASY5PwIBJjBAAgEmRkECASY6IUoCAUBwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL2RpYWdub3N0aWNfbWVzc2FnZS5kYXJ0YmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0hMcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLm1lc3NhZ2VzLnNldmVyaXR5OwoKZW51bSBTZXZlcml0eSB7CiAgY29udGV4dCwKICBlcnJvciwKICBpZ25vcmVkLAogIGludGVybmFsUHJvYmxlbSwKICB3YXJuaW5nLAp9Cgpjb25zdCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNldmVyaXR5RW51bU5hbWVzID0gY29uc3QgPFN0cmluZywgU3RyaW5nPnsKICAnQ09OVEVYVCc6ICdjb250ZXh0JywKICAnRVJST1InOiAnZXJyb3InLAogICdJR05PUkVEJzogJ2lnbm9yZWQnLAogICdJTlRFUk5BTF9QUk9CTEVNJzogJ2ludGVybmFsUHJvYmxlbScsCiAgJ1dBUk5JTkcnOiAnd2FybmluZycsCn07Cgpjb25zdCBNYXA8U3RyaW5nLCBTZXZlcml0eT4gc2V2ZXJpdHlFbnVtVmFsdWVzID0gY29uc3QgPFN0cmluZywgU2V2ZXJpdHk+ewogICdDT05URVhUJzogU2V2ZXJpdHkuY29udGV4dCwKICAnRVJST1InOiBTZXZlcml0eS5lcnJvciwKICAnSUdOT1JFRCc6IFNldmVyaXR5Lmlnbm9yZWQsCiAgJ0lOVEVSTkFMX1BST0JMRU0nOiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0sCiAgJ1dBUk5JTkcnOiBTZXZlcml0eS53YXJuaW5nLAp9OwoKY29uc3QgTWFwPFNldmVyaXR5LCBTdHJpbmc+IHNldmVyaXR5UHJlZml4ZXMgPSBjb25zdCA8U2V2ZXJpdHksIFN0cmluZz57CiAgU2V2ZXJpdHkuZXJyb3I6ICJFcnJvciIsCiAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtOiAiSW50ZXJuYWwgcHJvYmxlbSIsCiAgU2V2ZXJpdHkud2FybmluZzogIldhcm5pbmciLAogIFNldmVyaXR5LmNvbnRleHQ6ICJDb250ZXh0IiwKfTsKCmNvbnN0IE1hcDxTZXZlcml0eSwgU3RyaW5nPiBzZXZlcml0eVRleHRzID0gY29uc3QgPFNldmVyaXR5LCBTdHJpbmc+ewogIFNldmVyaXR5LmVycm9yOiAiZXJyb3IiLAogIFNldmVyaXR5LmludGVybmFsUHJvYmxlbTogImludGVybmFsIHByb2JsZW0iLAogIFNldmVyaXR5Lndhcm5pbmc6ICJ3YXJuaW5nIiwKICBTZXZlcml0eS5jb250ZXh0OiAiY29udGV4dCIsCn07Ci0ATk48AS8BEAsJCxMLAgFGGBQYKRgDAUsfGx8wHwMBSRswHx8DAUYbMB8fAwE2cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0ZWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvY29tcGlsZXJfb3B0aW9ucy5kYXJ0sgEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmcm9udF9lbmQuY29tcGlsZXJfb3B0aW9uczsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9kaWFnbm9zdGljX21lc3NhZ2UuZGFydCcKICAgIHNob3cgRGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgYXMga2VybmVsIHNob3cgTGlicmFyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJ2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JwogICAgc2hvdwogICAgICAgIGRlZmF1bHRFeHBlcmltZW50YWxGbGFncywKICAgICAgICBFeHBlcmltZW50YWxGbGFnLAogICAgICAgIGV4cGlyZWRFeHBlcmltZW50YWxGbGFncywKICAgICAgICBwYXJzZUV4cGVyaW1lbnRhbEZsYWc7CgppbXBvcnQgJ2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgRmlsZVN5c3RlbTsKCmltcG9ydCAnc3RhbmRhcmRfZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBTdGFuZGFyZEZpbGVTeXN0ZW07CgpleHBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvZGlhZ25vc3RpY19tZXNzYWdlLmRhcnQnCiAgICBzaG93IERpYWdub3N0aWNNZXNzYWdlOwoKLy8vIEZyb250LWVuZCBvcHRpb25zIHJlbGV2YW50IHRvIGNvbXBpbGVyIGJhY2sgZW5kcy4KLy8vCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KY2xhc3MgQ29tcGlsZXJPcHRpb25zIHsKICAvLy8gVGhlIFVSSSBvZiB0aGUgcm9vdCBvZiB0aGUgRGFydCBTREsgKHR5cGljYWxseSBhICJmaWxlOiIgVVJJKS4KICAvLy8KICAvLy8gSWYgYG51bGxgLCB0aGUgU0RLIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHVzaW5nCiAgLy8vIFtQbGF0Zm9ybS5yZXNvbHZlZEV4ZWN1dGFibGVdIGFzIGEgc3RhcnRpbmcgcG9pbnQuCiAgVXJpIHNka1Jvb3Q7CgogIC8vLyBVcmkgdG8gYSBwbGF0Zm9ybSBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBmaWxlLgogIC8vLwogIC8vLyBBIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIGZpbGUgaXMgYSBKU09OIGZpbGUgdGhhdCBkZXNjcmliZXMgaG93IHRvIG1hcAogIC8vLyBgZGFydDoqYCBsaWJyYXJpZXMgdG8gVVJJcyBpbiB0aGUgdW5kZXJseWluZyBbZmlsZVN5c3RlbV0uICBTZWUKICAvLy8gYHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL2xpYnJhcmllc19zcGVjaWZpY2F0aW9uLmRhcnRgIGZvciBkZXRhaWxzIG9uCiAgLy8vIHRoZSBmb3JtYXQuCiAgLy8vCiAgLy8vIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgYGNvbXBpbGVTZGsgPSB0cnVlYCwgdGhlIGNvbXBpbGVyIHdpbGwKICAvLy8gaW5mZXIgYXQgYSBkZWZhdWx0IGxvY2F0aW9uIHVuZGVyIFtzZGtSb290XSwgdHlwaWNhbGx5IHVuZGVyCiAgLy8vIGBsaWIvbGlicmFyaWVzLmpzb25gLgogIFVyaSBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwoKICBEaWFnbm9zdGljTWVzc2FnZUhhbmRsZXIgb25EaWFnbm9zdGljOwoKICAvLy8gVVJJIG9mIHRoZSAiLnBhY2thZ2VzIiBmaWxlICh0eXBpY2FsbHkgYSAiZmlsZToiIFVSSSkuCiAgLy8vCiAgLy8vIElmIGBudWxsYCwgdGhlICIucGFja2FnZXMiIGZpbGUgd2lsbCBiZSBmb3VuZCB2aWEgdGhlIHN0YW5kYXJkCiAgLy8vIHBhY2thZ2VfY29uZmlnIHNlYXJjaCBhbGdvcml0aG0uCiAgLy8vCiAgLy8vIElmIHRoZSBVUkkncyBwYXRoIGNvbXBvbmVudCBpcyBlbXB0eSAoZS5nLiBgbmV3IFVyaSgpYCksIG5vIHBhY2thZ2VzIGZpbGUKICAvLy8gd2lsbCBiZSB1c2VkLgogIFVyaSBwYWNrYWdlc0ZpbGVVcmk7CgogIC8vLyBVUklzIG9mIGlucHV0IHN1bW1hcnkgZmlsZXMgKGV4Y2x1ZGluZyB0aGUgU0RLIHN1bW1hcnk7IHR5cGljYWxseSB0aGVzZQogIC8vLyB3aWxsIGJlICJmaWxlOiIgVVJJcykuCiAgLy8vCiAgLy8vIFRoZXNlIGZpbGVzIHNob3VsZCBiZSBzdW1tYXJ5IGZpbGVzIGdlbmVyYXRlZCBieSB0aGlzIHBhY2thZ2UgKGFuZCBub3QgdGhlCiAgLy8vIHNpbWlsYXJseSBuYW1lZCBzdW1tYXJ5IGZpbGVzIGZyb20gYHBhY2thZ2U6YW5hbHl6ZXJgLikKICAvLy8KICAvLy8gU3VtbWFyaWVzIG1heSBiZSBwcm92aWRlZCBpbiBhbnkgb3JkZXIsIGJ1dCB0aGV5IHNob3VsZCBiZSBhY3ljbGljIGFuZAogIC8vLyBjbG9zZWQ6IGFueSBsaWJyYXJpZXMgdGhhdCB0aGV5IHJlZmVyZW5jZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBlaXRoZXIgb25lCiAgLy8vIG9mIFtpbnB1dFN1bW1hcmllc10gb3IgW3Nka1N1bW1hcnldLgogIExpc3Q8VXJpPiBpbnB1dFN1bW1hcmllcyA9IFtdOwoKICAvLy8gVVJJcyBvZiBvdGhlciBrZXJuZWwgY29tcG9uZW50cyB0byBsaW5rLgogIC8vLwogIC8vLyBDb21tb25seSB1c2VkIHRvIGxpbmsgdGhlIGNvZGUgZm9yIHRoZSBTREsgbGlicmFyaWVzIHRoYXQgd2FzIGNvbXBpbGVkCiAgLy8vIHNlcGFyYXRlbHkuIEZvciBleGFtcGxlLCBkYXJ0MmpzIG5lZWRzIHRvIGxpbmsgdGhlIFNESyBzbyBpdCBjYW4KICAvLy8gb3B0aW1pemUgYW5kIHRyZWUtc2hha2UgdGhlIGNvZGUgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hlcmVhcyB0aGUgVk0KICAvLy8gYWx3YXlzIGVtYmVkcyB0aGUgU0RLIGludGVybmFsbHkgYW5kIGRvZXNuJ3QgbmVlZCBpdCBhcyBwYXJ0IG9mIHRoZQogIC8vLyBwcm9ncmFtLgogIC8vLwogIC8vLyBUaGUgY29tcG9uZW50cyBwcm92aWRlZCBoZXJlIHNob3VsZCBiZSBjbG9zZWQgYW5kIGFjeWNsaWM6IGFueSBsaWJyYXJpZXMKICAvLy8gdGhhdCB0aGV5IHJlZmVyZW5jZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBhIGNvbXBvbmVudCBpbgogIC8vLyBbbGlua2VkRGVwZW5kZW5jaWVzXSBvciBhbnkgb2YgdGhlIFtpbnB1dFN1bW1hcmllc10gb3IgW3Nka1N1bW1hcnldLgogIExpc3Q8VXJpPiBsaW5rZWREZXBlbmRlbmNpZXMgPSBbXTsKCiAgLy8vIFVSSSBvZiB0aGUgU0RLIHN1bW1hcnkgZmlsZSAodHlwaWNhbGx5IGEgImZpbGU6IiBVUkkpLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCBzaG91bGQgYmUgYSBzdW1tYXJ5IHByZXZpb3VzbHkgZ2VuZXJhdGVkIGJ5IHRoaXMgcGFja2FnZSAoYW5kCiAgLy8vIG5vdCB0aGUgc2ltaWxhcmx5IG5hbWVkIHN1bW1hcnkgZmlsZXMgZnJvbSBgcGFja2FnZTphbmFseXplcmAuKQogIC8vLwogIC8vLyBJZiBgbnVsbGAgYW5kIFtjb21waWxlU2RrXSBpcyBmYWxzZSwgdGhlIFNESyBzdW1tYXJ5IHdpbGwgYmUgc2VhcmNoZWQgZm9yCiAgLy8vIGF0IGEgZGVmYXVsdCBsb2NhdGlvbiB3aXRoaW4gW3Nka1Jvb3RdLgogIFVyaSBzZGtTdW1tYXJ5OwoKICAvLy8gVGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBmb3IgdXNlIGJ5IGNvbmZpZ3VyYWJsZSBpbXBvcnRzIGFuZCBjb25zdGFudAogIC8vLyBldmFsdWF0aW9uLgogIE1hcDxTdHJpbmcsIFN0cmluZz4gZGVjbGFyZWRWYXJpYWJsZXM7CgogIC8vLyBUaGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmcm9udCBlbmQgdG8gYWNjZXNzIGZpbGVzLgogIC8vLwogIC8vLyBBbGwgZmlsZSBzeXN0ZW0gYWNjZXNzIHBlcmZvcm1lZCBieSB0aGUgZnJvbnQgZW5kIGdvZXMgdGhyb3VnaCB0aGlzCiAgLy8vIG1lY2hhbmlzbSwgd2l0aCBvbmUgZXhjZXB0aW9uOiBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yCiAgLy8vIFtwYWNrYWdlc0ZpbGVVcmldLCB0aGUgcGFja2FnZXMgZmlsZSBpcyBsb2NhdGVkIHVzaW5nIHRoZSBhY3R1YWwgcGh5c2ljYWwKICAvLy8gZmlsZSBzeXN0ZW0uICBUT0RPKHBhdWxiZXJyeSk6IGZpeCB0aGlzLgogIEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSA9IFN0YW5kYXJkRmlsZVN5c3RlbS5pbnN0YW5jZTsKCiAgLy8vIFdoZXRoZXIgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIFNESy4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCB0aGUgZnJvbnQgZW5kIHJlc29sdmVzIGNvbXBvbmVudHMgdXNpbmcgYSBwcmVidWlsdCBTREsgc3VtbWFyeS4KICAvLy8gV2hlbiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIFtzZGtTdW1tYXJ5XSBtdXN0IGJlIG51bGwuCiAgYm9vbCBjb21waWxlU2RrID0gZmFsc2U7CgogIEBkZXByZWNhdGVkCiAgYm9vbCBjaGFzZURlcGVuZGVuY2llczsKCiAgLy8vIFBhdGNoIGZpbGVzIHRvIGFwcGx5IG9uIHRoZSBjb3JlIGxpYnJhcmllcyBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcGxhdGZvcm0uCiAgLy8vCiAgLy8vIEtleXMgaW4gdGhlIG1hcCBhcmUgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2l0aCBubyBgZGFydDpgIHByZWZpeCwgZm9yCiAgLy8vIGV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICAgeydjb3JlJzogWwogIC8vLyAgICAgICAgICdmaWxlOi8vL2xvY2F0aW9uL29mL2NvcmUvcGF0Y2hfZmlsZTEuZGFydCcsCiAgLy8vICAgICAgICAgJ2ZpbGU6Ly8vbG9jYXRpb24vb2YvY29yZS9wYXRjaF9maWxlMi5kYXJ0JywKICAvLy8gICAgICAgICBdfQogIC8vLwogIC8vLyBUaGUgdmFsdWVzIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJcy4gQWJzb2x1dGUgVVJJcyBhcmUgcmVhZAogIC8vLyBkaXJlY3RseSwgd2hpbGUgcmVsYXRpdmUgVVJJcyBhcmUgcmVzb2x2ZWQgZnJvbSB0aGUgW3Nka1Jvb3RdLgogIC8vIFRPRE8oc2lnbXVuZCk6IHByb3ZpZGUgYWxzbyBhIGZsYWcgdG8gbG9hZCB0aGlzIGRhdGEgZnJvbSBhIGZpbGUgKGxpa2UKICAvLyBsaWJyYXJpZXMuanNvbikKICBNYXA8U3RyaW5nLCBMaXN0PFVyaT4+IHRhcmdldFBhdGNoZXMgPSA8U3RyaW5nLCBMaXN0PFVyaT4+e307CgogIC8vLyBFbmFibGUgb3IgZGlzYWJsZSBleHBlcmltZW50YWwgZmVhdHVyZXMuIEZlYXR1cmVzIG1hcHBpbmcgdG8gYHRydWVgIGFyZQogIC8vLyBleHBsaWNpdGx5IGVuYWJsZWQuIEZlYXR1cmVzIG1hcHBpbmcgdG8gYGZhbHNlYCBhcmUgZXhwbGljaXRseSBkaXNhYmxlZC4KICAvLy8gRmVhdHVyZXMgbm90IG1lbnRpb25lZCBpbiB0aGUgbWFwIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlLgogIE1hcDxFeHBlcmltZW50YWxGbGFnLCBib29sPiBleHBlcmltZW50YWxGbGFncyA9IDxFeHBlcmltZW50YWxGbGFnLCBib29sPnt9OwoKICAvLy8gRW52aXJvbm1lbnQgbWFwIHVzZWQgd2hlbiBldmFsdWF0aW5nIGBib29sLmZyb21FbnZpcm9ubWVudGAsCiAgLy8vIGBpbnQuZnJvbUVudmlyb25tZW50YCBhbmQgYFN0cmluZy5mcm9tRW52aXJvbm1lbnRgIGR1cmluZyBjb25zdGFudAogIC8vLyBldmFsdWF0aW9uLiBJZiB0aGUgbWFwIGlzIGBudWxsYCwgYWxsIGVudmlyb25tZW50IGNvbnN0YW50cyB3aWxsIGJlIGxlZnQKICAvLy8gdW5ldmFsdWF0ZWQgYW5kIGNhbiBiZSBldmFsdWF0ZWQgYnkgYSBjb25zdGFudCBldmFsdWF0b3IgbGF0ZXIuCiAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMgPSBudWxsOwoKICAvLy8gUmVwb3J0IGFuIGVycm9yIGlmIGEgY29uc3RhbnQgY291bGQgbm90IGJlIGV2YWx1YXRlZCAoZWl0aGVyIGJlY2F1c2UgaXQKICAvLy8gaXMgYW4gZW52aXJvbm1lbnQgY29uc3RhbnQgYW5kIG5vIGVudmlyb25tZW50IHdhcyBzcGVjaWZpZWQsIG9yIGJlY2F1c2UKICAvLy8gaXQgcmVmZXJzIHRvIGEgY29uc3RydWN0b3Igb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIgdGhhdCBpcyBub3QgYXZhaWxhYmxlKS4KICBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50ID0gZmFsc2U7CgogIC8vLyBUaGUgdGFyZ2V0IHBsYXRmb3JtIHRoYXQgd2lsbCBjb25zdW1lIHRoZSBjb21waWxlZCBjb2RlLgogIC8vLwogIC8vLyBVc2VkIHRvIHByb3ZpZGUgcGxhdGZvcm0tc3BlY2lmaWMgZGV0YWlscyB0byB0aGUgY29tcGlsZXIgbGlrZToKICAvLy8gICAqIHRoZSBzZXQgb2YgbGlicmFyaWVzIGFyZSBwYXJ0IG9mIGEgcGxhdGZvcm0ncyBTREsgKGUuZy4gZGFydDpodG1sIGZvcgogIC8vLyAgICAgZGFydDJqcywgZGFydDp1aSBmb3IgZmx1dHRlcikuCiAgLy8vCiAgLy8vICAgKiB3aGF0IGtlcm5lbCB0cmFuc2Zvcm1hdGlvbnMgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudAogIC8vLyAgICAgKGFzeW5jL2F3YWl0LCBtaXhpbiBpbmxpbmluZywgZXRjKS4KICAvLy8KICAvLy8gICAqIGhvdyB0byBkZWFsIHdpdGggbm9uLXN0YW5kYXJkIGZlYXR1cmVzIGxpa2UgYG5hdGl2ZWAgZXh0ZW5zaW9ucy4KICAvLy8KICAvLy8gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdGFyZ2V0IGlzIHRoZSBWTS4KICBUYXJnZXQgdGFyZ2V0OwoKICAvLy8gRGVwcmVjYXRlZC4gSGFzIG5vIGFmZmVjdCBvbiBmcm9udC1lbmQuCiAgLy8gVE9ETyhkYXJ0YnVnLmNvbS8zNzUxNCkgUmVtb3ZlIHRoaXMgZmllbGQgb25jZSBEREsgcmVtb3ZlcyBpdHMgdXNlcyBvZiBpdC4KICBib29sIGVuYWJsZUFzc2VydHMgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gc2hvdyB2ZXJib3NlIG1lc3NhZ2VzIChtYWlubHkgZm9yIGRlYnVnZ2luZyBhbmQgcGVyZm9ybWFuY2UKICAvLy8gdHJhY2tpbmcpLgogIC8vLwogIC8vLyBNZXNzYWdlcyBhcmUgcHJpbnRlZCBvbiBzdGRvdXQuCiAgLy8gVE9ETyhzaWdtdW5kKTogaW1wcm92ZSB0aGUgZGlhZ25vc3RpY3MgQVBJIHRvIHByb3ZpZGUgbWVjaGFuaXNtIHRvCiAgLy8gaW50ZXJjZXB0IHZlcmJvc2UgZGF0YSAoSXNzdWUgIzMwMDU2KQogIGJvb2wgdmVyYm9zZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBydW4gZXh0cmEgdmVyaWZpY2F0aW9uIHN0ZXBzIHRvIHZhbGlkYXRlIHRoYXQgY29tcGlsZWQKICAvLy8gY29tcG9uZW50cyBhcmUgd2VsbCBmb3JtZWQuCiAgLy8vCiAgLy8vIEVycm9ycyBhcmUgcmVwb3J0ZWQgdmlhIHRoZSBbb25EaWFnbm9zdGljXSBjYWxsYmFjay4KICBib29sIHZlcmlmeSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBkdW1wIGdlbmVyYXRlZCBjb21wb25lbnRzIGluIGEgdGV4dCBmb3JtYXQgKGFsc28gbWFpbmx5IGZvcgogIC8vLyBkZWJ1Z2dpbmcpLgogIC8vLwogIC8vLyBEdW1wZWQgZGF0YSBpcyBwcmludGVkIGluIHN0ZG91dC4KICBib29sIGRlYnVnRHVtcCA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBvbWl0IHRoZSBwbGF0Zm9ybSB3aGVuIHNlcmlhbGl6aW5nIHRoZSByZXN1bHQgZnJvbSBhIGBmYXN0YQogIC8vLyBjb21waWxlYCBydW4uCiAgYm9vbCBvbWl0UGxhdGZvcm0gPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gc2V0IHRoZSBleGl0IGNvZGUgdG8gbm9uLXplcm8gaWYgYW55IHByb2JsZW0gKGluY2x1ZGluZwogIC8vLyB3YXJuaW5nLCBldGMuKSBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgY29tcGlsYXRpb24uCiAgYm9vbCBzZXRFeGl0Q29kZU9uUHJvYmxlbSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciB0byBlbWJlZCB0aGUgaW5wdXQgc291cmNlcyBpbiBnZW5lcmF0ZWQga2VybmVsIGNvbXBvbmVudHMuCiAgLy8vCiAgLy8vIFRoZSBrZXJuZWwgYENvbXBvbmVudGAgQVBJIGluY2x1ZGVzIGEgYHVyaVRvU291cmNlYCBtYXAgZmllbGQgdGhhdCBpcyB1c2VkCiAgLy8vIHRvIGVtYmVkIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBmaWxlcy4gVGhpcyBwYXJ0IG9mIHRoZSBrZXJuZWwKICAvLy8gQVBJIGlzIGluIGZsdXggYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHNvbWUgdG9vbHMuIFRvZGF5IGl0IGlzIHVzZWQKICAvLy8gZm9yIHRyYW5zbGF0aW5nIGVycm9yIGxvY2F0aW9ucyBhbmQgc3RhY2sgdHJhY2VzIGluIHRoZSBWTS4KICAvLyBUT0RPKHNpZ211bmQpOiBjaGFuZ2UgdGhlIGRlZmF1bHQuCiAgYm9vbCBlbWJlZFNvdXJjZVRleHQgPSB0cnVlOwoKICAvLy8gV2hldGhlciB0aGUgY29tcGlsZXIgc2hvdWxkIHRocm93IGFzIHNvb24gYXMgaXQgZW5jb3VudGVycyBhCiAgLy8vIGNvbXBpbGF0aW9uIGVycm9yLgogIC8vLwogIC8vLyBUeXBpY2FsbHkgdXNlZCBieSBkZXZlbG9wZXJzIHRvIGRlYnVnIGludGVybmFscyBvZiB0aGUgY29tcGlsZXIuCiAgYm9vbCB0aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nID0gZmFsc2U7CgogIC8vLyBXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgdGhyb3cgYXMgc29vbiBhcyBpdCBlbmNvdW50ZXJzIGEKICAvLy8gY29tcGlsYXRpb24gd2FybmluZy4KICAvLy8KICAvLy8gVHlwaWNhbGx5IHVzZWQgYnkgZGV2ZWxvcGVycyB0byBkZWJ1ZyBpbnRlcm5hbHMgb2YgdGhlIGNvbXBpbGVyLgogIGJvb2wgdGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nID0gZmFsc2U7CgogIC8vLyBGb3IgdGhlIFt0aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nXSBvciBbdGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nXQogIC8vLyBvcHRpb25zLCBza2lwIHRoaXMgbnVtYmVyIG9mIG90aGVyd2lzZSBmYXRhbCBkaWFnbm9zdGljcyB3aXRob3V0IHRocm93aW5nLgogIC8vLyBJLmUuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDAgbWVhbnMgdGhyb3cgb24gdGhlIGZpcnN0IGZhdGFsIGRpYWdub3N0aWMuCiAgLy8vCiAgLy8vIElmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwgcHJpbnQgYSBzdGFjayB0cmFjZSBmb3IgZXZlcnkgZmF0YWwKICAvLy8gZGlhZ25vc3RpYywgYnV0IGRvIG5vdCBzdG9wIHRoZSBjb21waWxhdGlvbi4KICBpbnQgc2tpcEZvckRlYnVnZ2luZyA9IDA7CgogIC8vLyBXaGV0aGVyIHRvIGdlbmVyYXRlIGJ5dGVjb2RlLgogIGJvb2wgYnl0ZWNvZGUgPSBmYWxzZTsKCiAgLy8vIFdoZXRoZXIgdG8gd3JpdGUgYSBmaWxlIChlLmcuIGEgZGlsbCBmaWxlKSB3aGVuIHJlcG9ydGluZyBhIGNyYXNoLgogIGJvb2wgd3JpdGVGaWxlT25DcmFzaFJlcG9ydCA9IHRydWU7CgogIC8vLyBXaGV0aGVyIG5uYmQgc3Ryb25nIG1vZGUgaXMgdXNlZCBpZiBleHBlcmltZW50ICdub24tbnVsbGFibGUnIGlzIGVuYWJsZWQuCiAgYm9vbCBubmJkU3Ryb25nTW9kZSA9IGZhbHNlOwoKICAvLy8gV2hldGhlciBubmJkIGNoZWNrcyBhcmUgcGVyZm9ybWVkIHdoZW4gZXhwZXJpbWVudCAnbm9uLW51bGxhYmxlJyBpcwogIC8vLyBlbmFibGVkLgogIGJvb2wgcGVyZm9ybU5uYmRDaGVja3MgPSBmYWxzZTsKCiAgLy8vIFRoZSBjdXJyZW50IHNkayB2ZXJzaW9uIHN0cmluZywgZS5nLiAiMi42LjAtZWRnZS5zaGExaGFzaCIuCiAgLy8vIEZvciBpbnN0YW5jZSB1c2VkIGZvciBsYW5ndWFnZSB2ZXJzaW9uaW5nIChzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtCiAgLy8vIHZlcnNpb24pLgogIFN0cmluZyBjdXJyZW50U2RrVmVyc2lvbiA9ICIke2tlcm5lbC5MaWJyYXJ5LmRlZmF1bHRMYW5ndWFnZVZlcnNpb25NYWpvcn0iCiAgICAgICIuIgogICAgICAiJHtrZXJuZWwuTGlicmFyeS5kZWZhdWx0TGFuZ3VhZ2VWZXJzaW9uTWlub3J9IjsKfQoKLy8vIFBhcnNlIGV4cGVyaW1lbnRhbCBmbGFnIGFyZ3VtZW50cyBvZiB0aGUgZm9ybSAnZmxhZycgb3IgJ25vLWZsYWcnIGludG8gYSBtYXAKLy8vIGZyb20gJ2ZsYWcnIHRvIGB0cnVlYCBvciBgZmFsc2VgLCByZXNwZWN0aXZlbHkuCk1hcDxTdHJpbmcsIGJvb2w+IHBhcnNlRXhwZXJpbWVudGFsQXJndW1lbnRzKExpc3Q8U3RyaW5nPiBhcmd1bWVudHMpIHsKICBNYXA8U3RyaW5nLCBib29sPiByZXN1bHQgPSB7fTsKICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgIGZvciAoU3RyaW5nIGFyZ3VtZW50IGluIGFyZ3VtZW50cykgewogICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIGluIGFyZ3VtZW50LnNwbGl0KCcsJykpIHsKICAgICAgICBpZiAoZmVhdHVyZS5zdGFydHNXaXRoKCduby0nKSkgewogICAgICAgICAgcmVzdWx0W2ZlYXR1cmUuc3Vic3RyaW5nKDMpXSA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRbZmVhdHVyZV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9CgovLy8gUGFyc2UgYSBtYXAgb2YgZXhwZXJpbWVudGFsIGZsYWdzIHRvIHZhbHVlcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8KLy8vIFtDb21waWxlck9wdGlvbnMuZXhwZXJpbWVudGFsRmxhZ3NdLgovLy8gVGhlIHJldHVybmVkIG1hcCBpcyBub3JtYWxpemVkIHRvIGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHVubWVudGlvbmVkCi8vLyBmbGFncy4KLy8vCi8vLyBJZiBhbiB1bmtub3duIGZsYWcgaXMgbWVudGlvbmVkLCBvciBhIGZsYWcgaXMgbWVudGlvbmVkIG1vcmUgdGhhbiBvbmNlLAovLy8gdGhlIHN1cHBsaWVkIGVycm9yIGhhbmRsZXIgaXMgY2FsbGVkIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KLy8vCi8vLyBJZiBhbiBleHBpcmVkIGZsYWcgaXMgc2V0IHRvIGl0cyBub24tZGVmYXVsdCB2YWx1ZSB0aGUgc3VwcGxpZWQgZXJyb3IKLy8vIGhhbmRsZXIgaXMgY2FsbGVkIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KLy8vCi8vLyBJZiBhbiBleHBpcmVkIGZsYWcgaXMgc2V0IHRvIGl0cyBkZWZhdWx0IHZhbHVlIHRoZSBzdXBwbGllZCB3YXJuaW5nCi8vLyBoYW5kbGVyIGlzIGNhbGxlZCB3aXRoIGEgd2FybmluZyBtZXNzYWdlLgpNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gcGFyc2VFeHBlcmltZW50YWxGbGFncygKICAgIE1hcDxTdHJpbmcsIGJvb2w+IGV4cGVyaW1lbnRzLAogICAge3ZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSksCiAgICB2b2lkIG9uV2FybmluZyhTdHJpbmcgbWVzc2FnZSl9KSB7CiAgTWFwPEV4cGVyaW1lbnRhbEZsYWcsIGJvb2w+IGZsYWdzID0gPEV4cGVyaW1lbnRhbEZsYWcsIGJvb2w+e307CiAgaWYgKGV4cGVyaW1lbnRzICE9IG51bGwpIHsKICAgIGZvciAoU3RyaW5nIGV4cGVyaW1lbnQgaW4gZXhwZXJpbWVudHMua2V5cykgewogICAgICBib29sIHZhbHVlID0gZXhwZXJpbWVudHNbZXhwZXJpbWVudF07CiAgICAgIEV4cGVyaW1lbnRhbEZsYWcgZmxhZyA9IHBhcnNlRXhwZXJpbWVudGFsRmxhZyhleHBlcmltZW50KTsKICAgICAgaWYgKGZsYWcgPT0gbnVsbCkgewogICAgICAgIG9uRXJyb3IoIlVua25vd24gZXhwZXJpbWVudDogIiArIGV4cGVyaW1lbnQpOwogICAgICB9IGVsc2UgaWYgKGZsYWdzLmNvbnRhaW5zS2V5KGZsYWcpKSB7CiAgICAgICAgaWYgKGZsYWdzW2ZsYWddICE9IHZhbHVlKSB7CiAgICAgICAgICBvbkVycm9yKAogICAgICAgICAgICAgICJFeHBlcmltZW50IHNwZWNpZmllZCB3aXRoIGNvbmZsaWN0aW5nIHZhbHVlczogIiArIGV4cGVyaW1lbnQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoZXhwaXJlZEV4cGVyaW1lbnRhbEZsYWdzW2ZsYWddKSB7CiAgICAgICAgICBpZiAodmFsdWUgIT0gZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzW2ZsYWddKSB7CiAgICAgICAgICAgIC8vLyBQcm9kdWNlIGFuIGVycm9yIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCB0aGUgZGVmYXVsdCB2YWx1ZS4KICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgb25FcnJvcigiRW5hYmxpbmcgZXhwZXJpbWVudCAiICsKICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudCArCiAgICAgICAgICAgICAgICAgICIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvbkVycm9yKCJEaXNhYmxpbmcgZXhwZXJpbWVudCAiICsKICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudCArCiAgICAgICAgICAgICAgICAgICIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRFeHBlcmltZW50YWxGbGFnc1tmbGFnXTsKICAgICAgICAgIH0gZWxzZSBpZiAob25XYXJuaW5nICE9IG51bGwpIHsKICAgICAgICAgICAgLy8vIFByb2R1Y2UgYSB3YXJuaW5nIHdoZW4gdGhlIHZhbHVlIGlzIHRoZSBkZWZhdWx0IHZhbHVlLgogICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICBvbldhcm5pbmcoIkV4cGVyaW1lbnQgIiArCiAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnQgKwogICAgICAgICAgICAgICAgICAiIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIgogICAgICAgICAgICAgICAgICAgICAgIlRoZSB1c2Ugb2YgdGhlIGZsYWcgaXMgZGVwcmVjYXRlZC4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvbldhcm5pbmcoIkV4cGVyaW1lbnQgIiArCiAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnQgKwogICAgICAgICAgICAgICAgICAiIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICIKICAgICAgICAgICAgICAgICAgICAgICJUaGUgdXNlIG9mIHRoZSBmbGFnIGlzIGRlcHJlY2F0ZWQuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZsYWdzW2ZsYWddID0gdmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZsYWdzW2ZsYWddID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGZvciAoRXhwZXJpbWVudGFsRmxhZyBmbGFnIGluIEV4cGVyaW1lbnRhbEZsYWcudmFsdWVzKSB7CiAgICBhc3NlcnQoZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzLmNvbnRhaW5zS2V5KGZsYWcpLAogICAgICAgICJObyBkZWZhdWx0IHZhbHVlIGZvciAkZmxhZy4iKTsKICAgIGZsYWdzW2ZsYWddID8/PSBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3NbZmxhZ107CiAgfQogIHJldHVybiBmbGFnczsKfQqBTQBOTjwBJAFKIwE5ATkBIQkiGiIfASsBPAFKHAE2BDsYRQY0OQ8BNgZORk8SBk1DHCEBKQE9BkUnBlAUFwFOHQZRPgZNUCshAS8GTUdLSg8GTz5LJQE9BlBGBlAuEgFKEikBTgZKQlAvNwEsBlE9GwEOGgFRBk4PBhY7OxEGUUVMFUABTk9HTgFDSU9GMQFOTlErAT8GRlApBkkuBksGNhEBLlAeAU0RBiZIKxgBSCIGOxcBTRIGKBoBTRQdAUk4JQFJBlFQTkIoHwFDGQZHKgFDGwZHLAFLUU0GRDMcASQZAUkmAVAfAUoPIgFCSBBNCjcCAVE0RyEbKTQpMBEiCggGBBECAUYpTQsETEAESi0ESC40IyMnQh0yLEEaNiwkE04KDy45ShkvHy8VMB8vDjQqRxkoHy09FSgfLj0ODB8RHwoIBgQ7Nyg0BBACATlwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9jb21waWxlcl9vcHRpb25zLmRhcnRnZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydIjmLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE5PVEU6IFRISVMgRklMRSBJUyBHRU5FUkFURUQuIERPIE5PVCBFRElULgovLwovLyBJbnN0ZWFkIG1vZGlmeSAndG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwnIGFuZCBydW4KLy8gJ3BrZy9mcm9udF9lbmQvdG9vbC9mYXN0YSBnZW5lcmF0ZS1leHBlcmltZW50YWwtZmxhZ3MnIHRvIHVwZGF0ZS4KCmVudW0gRXhwZXJpbWVudGFsRmxhZyB7CiAgY29uc3RhbnRVcGRhdGUyMDE4LAogIGNvbnRyb2xGbG93Q29sbGVjdGlvbnMsCiAgZXh0ZW5zaW9uTWV0aG9kcywKICBub25OdWxsYWJsZSwKICBub25mdW5jdGlvblR5cGVBbGlhc2VzLAogIHNldExpdGVyYWxzLAogIHNwcmVhZENvbGxlY3Rpb25zLAogIHRyaXBsZVNoaWZ0LAogIHZhcmlhbmNlLAp9CgpFeHBlcmltZW50YWxGbGFnIHBhcnNlRXhwZXJpbWVudGFsRmxhZyhTdHJpbmcgZmxhZykgewogIHN3aXRjaCAoZmxhZykgewogICAgY2FzZSAiY29uc3RhbnQtdXBkYXRlLTIwMTgiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTg7CiAgICBjYXNlICJjb250cm9sLWZsb3ctY29sbGVjdGlvbnMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5jb250cm9sRmxvd0NvbGxlY3Rpb25zOwogICAgY2FzZSAiZXh0ZW5zaW9uLW1ldGhvZHMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5leHRlbnNpb25NZXRob2RzOwogICAgY2FzZSAibm9uLW51bGxhYmxlIjoKICAgICAgcmV0dXJuIEV4cGVyaW1lbnRhbEZsYWcubm9uTnVsbGFibGU7CiAgICBjYXNlICJub25mdW5jdGlvbi10eXBlLWFsaWFzZXMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5ub25mdW5jdGlvblR5cGVBbGlhc2VzOwogICAgY2FzZSAic2V0LWxpdGVyYWxzIjoKICAgICAgcmV0dXJuIEV4cGVyaW1lbnRhbEZsYWcuc2V0TGl0ZXJhbHM7CiAgICBjYXNlICJzcHJlYWQtY29sbGVjdGlvbnMiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9uczsKICAgIGNhc2UgInRyaXBsZS1zaGlmdCI6CiAgICAgIHJldHVybiBFeHBlcmltZW50YWxGbGFnLnRyaXBsZVNoaWZ0OwogICAgY2FzZSAidmFyaWFuY2UiOgogICAgICByZXR1cm4gRXhwZXJpbWVudGFsRmxhZy52YXJpYW5jZTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmNvbnN0IE1hcDxFeHBlcmltZW50YWxGbGFnLCBib29sPiBkZWZhdWx0RXhwZXJpbWVudGFsRmxhZ3MgPSB7CiAgRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTg6IHRydWUsCiAgRXhwZXJpbWVudGFsRmxhZy5jb250cm9sRmxvd0NvbGxlY3Rpb25zOiB0cnVlLAogIEV4cGVyaW1lbnRhbEZsYWcuZXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSwKICBFeHBlcmltZW50YWxGbGFnLm5vbk51bGxhYmxlOiBmYWxzZSwKICBFeHBlcmltZW50YWxGbGFnLm5vbmZ1bmN0aW9uVHlwZUFsaWFzZXM6IGZhbHNlLAogIEV4cGVyaW1lbnRhbEZsYWcuc2V0TGl0ZXJhbHM6IHRydWUsCiAgRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9uczogdHJ1ZSwKICBFeHBlcmltZW50YWxGbGFnLnRyaXBsZVNoaWZ0OiBmYWxzZSwKICBFeHBlcmltZW50YWxGbGFnLnZhcmlhbmNlOiBmYWxzZSwKfTsKCmNvbnN0IE1hcDxFeHBlcmltZW50YWxGbGFnLCBib29sPiBleHBpcmVkRXhwZXJpbWVudGFsRmxhZ3MgPSB7CiAgRXhwZXJpbWVudGFsRmxhZy5jb25zdGFudFVwZGF0ZTIwMTg6IHRydWUsCiAgRXhwZXJpbWVudGFsRmxhZy5jb250cm9sRmxvd0NvbGxlY3Rpb25zOiB0cnVlLAogIEV4cGVyaW1lbnRhbEZsYWcuZXh0ZW5zaW9uTWV0aG9kczogZmFsc2UsCiAgRXhwZXJpbWVudGFsRmxhZy5ub25OdWxsYWJsZTogZmFsc2UsCiAgRXhwZXJpbWVudGFsRmxhZy5ub25mdW5jdGlvblR5cGVBbGlhc2VzOiBmYWxzZSwKICBFeHBlcmltZW50YWxGbGFnLnNldExpdGVyYWxzOiB0cnVlLAogIEV4cGVyaW1lbnRhbEZsYWcuc3ByZWFkQ29sbGVjdGlvbnM6IHRydWUsCiAgRXhwZXJpbWVudGFsRmxhZy50cmlwbGVTaGlmdDogZmFsc2UsCiAgRXhwZXJpbWVudGFsRmxhZy52YXJpYW5jZTogZmFsc2UsCn07CkYATk48AS4DPUUBGBYaFA8aDxUPDAIBNhIhMiU2HjAZKyU2GSsfMRkrFSgEDwIBPy0xKycyJiwnJAMBPy0xLCcyJiwnJAMBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0YGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydIpjLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLmZpbGVfc3lzdGVtOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCi8vLyBBYnN0cmFjdCBpbnRlcmZhY2UgdG8gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLy8vCi8vLyBBbGwgZnJvbnQgZW5kIGludGVyYWN0aW9uIHdpdGggdGhlIGZpbGUgc3lzdGVtIGdvZXMgdGhyb3VnaCB0aGlzIGludGVyZmFjZTsKLy8vIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIGNsaWVudHMgdG8gdXNlIHRoZSBmcm9udCBlbmQgaW4gYSB3YXkgdGhhdAovLy8gZG9lc24ndCByZXF1aXJlIGZpbGUgc3lzdGVtIGFjY2VzcyAoZS5nLiB0byBydW4gdW5pdCB0ZXN0cywgb3IgdG8gcnVuCi8vLyBpbnNpZGUgYSBicm93c2VyKS4KLy8vCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KYWJzdHJhY3QgY2xhc3MgRmlsZVN5c3RlbSB7CiAgLy8vIFJldHVybnMgYSBbRmlsZVN5c3RlbUVudGl0eV0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gW3VyaV0uCiAgLy8vCiAgLy8vIFVzZXMgb2YgYC4uYCBhbmQgYC5gIGluIHRoZSBVUkkgYXJlIG5vcm1hbGl6ZWQgYmVmb3JlIHJldHVybmluZy4KICAvLy8KICAvLy8gSWYgdGhlIFVSSSBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGZpbGUgc3lzdGVtLCBhbiBbRXJyb3JdIHdpbGwgYmUKICAvLy8gdGhyb3duLgogIC8vLwogIC8vLyBEb2VzIG5vdCBjaGVjayB3aGV0aGVyIGEgZmlsZSBvciBmb2xkZXIgZXhpc3RzIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKTsKfQoKLy8vIEFic3RyYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBzeXN0ZW0gZW50aXR5IHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3QuCi8vLwovLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaGF2ZSBzdWl0YWJsZSBpbXBsZW1lbnRhdGlvbnMgb2YgZXF1YWxpdHkgdGVzdHMgYW5kCi8vLyBoYXNoQ29kZS4KLy8vCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KYWJzdHJhY3QgY2xhc3MgRmlsZVN5c3RlbUVudGl0eSB7CiAgLy8vIFRoZSBhYnNvbHV0ZSBub3JtYWxpemVkIFVSSSByZXByZXNlbnRlZCBieSB0aGlzIGZpbGUgc3lzdGVtIGVudGl0eS4KICAvLy8KICAvLy8gTm90ZTogdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIFVSSSB0aGF0IHdhcyBwYXNzZWQgdG8KICAvLy8gW0ZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpXSwgc2luY2UgdGhlIFVSSSBtaWdodCBoYXZlIGJlZW4gbm9ybWFsaXplZC4KICBVcmkgZ2V0IHVyaTsKCiAgLy8vIFdoZXRoZXIgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkgZXhpc3RzLgogIEZ1dHVyZTxib29sPiBleGlzdHMoKTsKCiAgLy8vIEF0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIGZpbGUgc3lzdGVtIGVudGl0eSBhcyBhIGZpbGUgYW5kIHJlYWQgaXRzIGNvbnRlbnRzCiAgLy8vIGFzIHJhdyBieXRlcy4KICAvLy8KICAvLy8gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgZmlsZSAoZS5nLiBiZWNhdXNlIG5vIHN1Y2gKICAvLy8gZmlsZSBleGlzdHMsIG9yIHRoZSBlbnRpdHkgaXMgYSBkaXJlY3RvcnkpLCB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoCiAgLy8vIFtGaWxlU3lzdGVtRXhjZXB0aW9uXS4KICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpOwoKICAvLy8gQXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5IGFzIGEgZmlsZSBhbmQgcmVhZCBpdHMgY29udGVudHMKICAvLy8gYXMgYSBzdHJpbmcuCiAgLy8vCiAgLy8vIFRoZSBmaWxlIGlzIGFzc3VtZWQgdG8gYmUgVVRGLTggZW5jb2RlZC4KICAvLy8KICAvLy8gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgZmlsZSAoZS5nLiBiZWNhdXNlIG5vIHN1Y2gKICAvLy8gZmlsZSBleGlzdHMsIHRoZSBlbnRpdHkgaXMgYSBkaXJlY3RvcnksIG9yIHRoZSBmaWxlIGlzIG5vdCB2YWxpZCBVVEYtOCksCiAgLy8vIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggW0ZpbGVTeXN0ZW1FeGNlcHRpb25dLgogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpOwp9CgovKioKICogQmFzZSBjbGFzcyBmb3IgYWxsIGZpbGUgc3lzdGVtIGV4Y2VwdGlvbnMuCiAqLwpjbGFzcyBGaWxlU3lzdGVtRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICBmaW5hbCBVcmkgdXJpOwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBGaWxlU3lzdGVtRXhjZXB0aW9uKHRoaXMudXJpLCB0aGlzLm1lc3NhZ2UpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmk9JHVyaTsgbWVzc2FnZT0kbWVzc2FnZSknOwp9Ck0ATk48AR8BFQEyBFBKShcEOxxFBkcGUQ4GTCoCAU8EUA4EOyJKBktLDwEuGQFRFAZRTx0jAVETBi8GUU86IQIBBC4EMREYAS8BDEoCATRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0XmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvZnJvbnRfZW5kLmRhcnSCWy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVGhlIERhcnQgRnJvbnQgRW5kIGNvbnRhaW5zIGxvZ2ljIHRvIGJ1aWxkIHN1bW1hcmllcyBhbmQga2VybmVsIHByb2dyYW1zCi8vLyBmcm9tIERhcnQgc291cmNlcy4gVGhlIEFQSXMgZXhwb3NlZCBoZXJlIGFyZSBkZXNpZ25lZCBmb3IgdG9vbHMgaW4gdGhlIERhcnQKLy8vIGVjb3N5c3RlbSB0aGF0IG5lZWQgdG8gbG9hZCBzb3VyY2VzIGFuZCBjb252ZXJ0IHRoZW0gdG8gdGhlc2UgZm9ybWF0cy4KbGlicmFyeSBmcm9udF9lbmQuZnJvbnRfZW5kOwoKZXhwb3J0ICdjb21waWxlcl9vcHRpb25zLmRhcnQnOwpleHBvcnQgJ2tlcm5lbF9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAnc3VtbWFyeV9nZW5lcmF0b3IuZGFydCc7CmV4cG9ydCAnZmlsZV9zeXN0ZW0uZGFydCc7Cg8ATk48AU1QSx0BICAhGwEycGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvZnJvbnRfZW5kLmRhcnRxZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnSUIS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc3RyaW5nX3NjYW5uZXIuZGFydCcKICAgIHNob3cgU3RyaW5nU2Nhbm5lcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JwogICAgc2hvdyBDb21wb25lbnQsIFByb2NlZHVyZSwgRGFydFR5cGUsIFR5cGVQYXJhbWV0ZXI7CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICcuLi9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YS9pbmNyZW1lbnRhbF9jb21waWxlci5kYXJ0JyBzaG93IEluY3JlbWVudGFsQ29tcGlsZXI7CgppbXBvcnQgJy4uL2Zhc3RhL2luY3JlbWVudGFsX3NlcmlhbGl6ZXIuZGFydCcgc2hvdyBJbmNyZW1lbnRhbFNlcmlhbGl6ZXI7CgppbXBvcnQgJ2NvbXBpbGVyX29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CgpleHBvcnQgJy4uL2Zhc3RhL2luY3JlbWVudGFsX3NlcmlhbGl6ZXIuZGFydCcgc2hvdyBJbmNyZW1lbnRhbFNlcmlhbGl6ZXI7CgphYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvciB7CiAgZmFjdG9yeSBJbmNyZW1lbnRhbEtlcm5lbEdlbmVyYXRvcihDb21waWxlck9wdGlvbnMgb3B0aW9ucywgVXJpIGVudHJ5UG9pbnQsCiAgICAgIFtVcmkgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLAogICAgICBib29sIG91dGxpbmVPbmx5LAogICAgICBJbmNyZW1lbnRhbFNlcmlhbGl6ZXIgaW5jcmVtZW50YWxTZXJpYWxpemVyXSkgewogICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRhbENvbXBpbGVyKAogICAgICAgIG5ldyBDb21waWxlckNvbnRleHQoCiAgICAgICAgICAgIG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMsIGlucHV0czogW2VudHJ5UG9pbnRdKSksCiAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLAogICAgICAgIG91dGxpbmVPbmx5LAogICAgICAgIGluY3JlbWVudGFsU2VyaWFsaXplcik7CiAgfQoKICAvLy8gSW5pdGlhbGl6ZSB0aGUgaW5jcmVtZW50YWwgY29tcGlsZXIgZnJvbSBhIGNvbXBvbmVudC4KICAvLy8KICAvLy8gTm90aWNlIHRoYXQgdGhlIGNvbXBvbmVudCBoYXMgdG8gaW5jbHVkZSB0aGUgcGxhdGZvcm0sIGFuZCB0aGF0IG5vIG90aGVyCiAgLy8vIHBsYXRmb3JtIHdpbGwgYmUgbG9hZGVkLgogIGZhY3RvcnkgSW5jcmVtZW50YWxLZXJuZWxHZW5lcmF0b3IuZnJvbUNvbXBvbmVudCgKICAgICAgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsIFVyaSBlbnRyeVBvaW50LCBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBbYm9vbCBvdXRsaW5lT25seSwgSW5jcmVtZW50YWxTZXJpYWxpemVyIGluY3JlbWVudGFsU2VyaWFsaXplcl0pIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxDb21waWxlci5mcm9tQ29tcG9uZW50KAogICAgICAgIG5ldyBDb21waWxlckNvbnRleHQoCiAgICAgICAgICAgIG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMsIGlucHV0czogW2VudHJ5UG9pbnRdKSksCiAgICAgICAgY29tcG9uZW50LAogICAgICAgIG91dGxpbmVPbmx5LAogICAgICAgIGluY3JlbWVudGFsU2VyaWFsaXplcik7CiAgfQoKICAvLy8gUmV0dXJucyBhIGNvbXBvbmVudCB3aG9zZSBsaWJyYXJpZXMgYXJlIHRoZSByZWNvbXBpbGVkIGxpYnJhcmllcywKICAvLy8gb3IgLSBpbiB0aGUgY2FzZSBvZiBbZnVsbENvbXBvbmVudF0gLSBhIGZ1bGwgQ29tcG9uZW50LgogIEZ1dHVyZTxDb21wb25lbnQ+IGNvbXB1dGVEZWx0YSh7TGlzdDxVcmk+IGVudHJ5UG9pbnRzLCBib29sIGZ1bGxDb21wb25lbnR9KTsKCiAgLy8vIFJldHVybnMgW0NvcmVUeXBlc10gdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uCiAgLy8vIFZhbGlkIGFmdGVyIFtjb21wdXRlRGVsdGFdIGlzIGNhbGxlZC4KICBDb3JlVHlwZXMgZ2V0Q29yZVR5cGVzKCk7CgogIC8vLyBSZXR1cm5zIFtDbGFzc0hpZXJhcmNoeV0gdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uCiAgLy8vIFZhbGlkIGFmdGVyIFtjb21wdXRlRGVsdGFdIGlzIGNhbGxlZC4KICBDbGFzc0hpZXJhcmNoeSBnZXRDbGFzc0hpZXJhcmNoeSgpOwoKICAvLy8gUmVtb3ZlIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBbdXJpXSBmcm9tIHRoZSBzZXQgb2YKICAvLy8gdmFsaWQgZmlsZXMuICBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aG9zZSBmaWxlcyB3aWxsIGJlIHJlLXJlYWQgb24gdGhlCiAgLy8vIG5leHQgY2FsbCB0byBbY29tcHV0ZURlbHRhXSkuCiAgdm9pZCBpbnZhbGlkYXRlKFVyaSB1cmkpOwoKICAvLy8gSW52YWxpZGF0ZSBhbGwgbGlicmFyaWVzIHRoYXQgd2VyZSBidWlsZCBmcm9tIHNvdXJjZS4KICAvLy8KICAvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgbnVtYmVyIG9mIGNhbGxzIHRvIFtpbnZhbGlkYXRlXTogT25lIGZvciBlYWNoIFVSSQogIC8vLyB0aGF0IGhhcHBlbnMgdG8gaGF2ZSBiZWVuIHJlYWQgZnJvbSBzb3VyY2UuCiAgLy8vIFNhaWQgYW5vdGhlciB3YXksIHRoaXMgaW52YWxpZGF0ZXMgZXZlcnl0aGluZyBub3QgbG9hZGVkIGZyb20gZGlsbAogIC8vLyAoYXQgc3RhcnR1cCkgb3IgdmlhIFtzZXRNb2R1bGVzVG9Mb2FkT25OZXh0Q29tcHV0ZURlbHRhXS4KICB2b2lkIGludmFsaWRhdGVBbGxTb3VyY2VzKCk7CgogIC8vLyBTZXQgdGhlIGdpdmVuIFtjb21wb25lbnRzXSBhcyBjb21wb25lbnRzIHRvIGxvYWQgb24gdGhlIG5leHQgaXRlcmF0aW9uCiAgLy8vIG9mIFtjb21wdXRlRGVsdGFdLgogIC8vLwogIC8vLyBJZiBzcGVjaWZpZWQsIGFsbCBsaWJyYXJpZXMgbm90IGNvbXBpbGVkIGZyb20gc291cmNlIGFuZCBub3QgaW5jbHVkZWQgaW4KICAvLy8gdGhlc2UgY29tcG9uZW50cyB3aWxsIGJlIGludmFsaWRhdGVkIGFuZCB0aGUgbGlicmFyaWVzIGluc2lkZSB0aGVzZQogIC8vLyBjb21wb25lbnRzIHdpbGwgYmUgbG9hZGVkIGluc3RlYWQuCiAgLy8vCiAgLy8vIFVzZWZ1bCBmb3IsIGZvciBpbnN0YW5jZSwgbW9kdWxhciBjb21waWxhdGlvbiwgd2hlcmUgbW9kdWxlcwogIC8vLyAoY3JlYXRlZCBleHRlcm5hbGx5KSB2aWEgdGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhZGRlZCwgY2hhbmdlZCBvcgogIC8vLyByZW1vdmVkLgogIHZvaWQgc2V0TW9kdWxlc1RvTG9hZE9uTmV4dENvbXB1dGVEZWx0YShMaXN0PENvbXBvbmVudD4gY29tcG9uZW50cyk7CgogIC8vLyBDb21waWxlIFtleHByZXNzaW9uXSBhcyBhbiBbRXhwcmVzc2lvbl0uIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoYXQKICAvLy8gZXhwcmVzc2lvbiBpcyBjb21waWxlZC4KICAvLy8KICAvLy8gW2V4cHJlc3Npb25dIG1heSB1c2UgdGhlIHZhcmlhYmxlcyBzdXBwbGllZCBpbiBbZGVmaW5pdGlvbnNdIGFzIGZyZWUKICAvLy8gdmFyaWFibGVzIGFuZCBbdHlwZURlZmluaXRpb25zXSBhcyBmcmVlIHR5cGUgdmFyaWFibGVzLiBUaGVzZSB3aWxsIGJlY29tZQogIC8vLyByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIHRoZSBjb21waWxlZCBmdW5jdGlvbi4gQWxsIGVsZW1lbnRzIG9mCiAgLy8vIFtkZWZpbml0aW9uc10gYW5kIFt0eXBlRGVmaW5pdGlvbnNdIHdpbGwgYmVjb21lIHBhcmFtZXRlcnMvdHlwZQogIC8vLyBwYXJhbWV0ZXJzLCB3aGV0aGVyIG9yIG5vdCB0aGV5IGFwcGVhciBmcmVlIGluIFtleHByZXNzaW9uXS4gVGhlIHR5cGUKICAvLy8gcGFyYW1ldGVycyBzaG91bGQgaGF2ZSBhIG51bGwgcGFyZW50IHBvaW50ZXIuCiAgLy8vCiAgLy8vIFtsaWJyYXJ5VXJpXSBtdXN0IHJlZmVyIHRvIGVpdGhlciBhIHByZXZpb3VzbHkgY29tcGlsZWQgbGlicmFyeS4KICAvLy8gW2NsYXNzTmFtZV0gbWF5IG9wdGlvbmFsbHkgcmVmZXIgdG8gYSBjbGFzcyB3aXRoaW4gc3VjaCBsaWJyYXJ5IHRvIHVzZSBmb3IKICAvLy8gdGhlIHNjb3BlIG9mIHRoZSBleHByZXNzaW9uLiBJbiB0aGF0IGNhc2UsIFtpc1N0YXRpY10gaW5kaWNhdGVzIHdoZXRoZXIKICAvLy8gdGhlIHNjb3BlIGNhbiBhY2Nlc3MgW3RoaXNdLgogIC8vLwogIC8vLyBJdCBpcyBpbGxlZ2FsIHRvIHVzZSAiYXdhaXQiIGluIFtleHByZXNzaW9uXSBhbmQgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uCiAgLy8vIHdpbGwgYWx3YXlzIGJlIHN5bmNocm9ub3VzLgogIC8vLwogIC8vLyBbY29tcHV0ZURlbHRhXSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBwcmlvci4KICAvLy8KICAvLy8gW2NvbXBpbGVFeHByZXNzaW9uXSB3aWxsIHJldHVybiBbbnVsbF0gaWYgdGhlIGxpYnJhcnkgb3IgY2xhc3MgZm9yCiAgLy8vIFtlbmNsb3NpbmdOb2RlXSBjb3VsZCBub3QgYmUgZm91bmQuIE90aGVyd2lzZSwgZXJyb3JzIGFyZSByZXBvcnRlZCBpbiB0aGUKICAvLy8gbm9ybWFsIHdheS4KICBGdXR1cmU8UHJvY2VkdXJlPiBjb21waWxlRXhwcmVzc2lvbigKICAgICAgU3RyaW5nIGV4cHJlc3Npb24sCiAgICAgIE1hcDxTdHJpbmcsIERhcnRUeXBlPiBkZWZpbml0aW9ucywKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlRGVmaW5pdGlvbnMsCiAgICAgIFN0cmluZyBzeW50aGV0aWNQcm9jZWR1cmVOYW1lLAogICAgICBVcmkgbGlicmFyeVVyaSwKICAgICAgW1N0cmluZyBjbGFzc05hbWUsCiAgICAgIGJvb2wgaXNTdGF0aWMgPSBmYWxzZV0pOwp9Cgpib29sIGlzTGVnYWxJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CiAgcmV0dXJuIFN0cmluZ1NjYW5uZXIuaXNMZWdhbElkZW50aWZpZXIoaWRlbnRpZmllcik7Cn0KgIMATk48ASEBRRgBQgE4ASQ4AT8BPgFGAUoBNQFKASxOIhg2JB1LHxUgBAE8Bk8fNERJMh1LExUgBAFIPk8BMywcATgsJgFLTCQcATwGUDJJQB8BTRkGT0opBkNLD0cBSR4GS1BERkw0BkdRTiMGTSIGQAZJUBInGSkrJRYZHwIBLDYCAUVwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnRlZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9rZXJuZWxfZ2VuZXJhdG9yLmRhcnST9i8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVmaW5lcyB0aGUgZnJvbnQtZW5kIEFQSSBmb3IgY29udmVydGluZyBzb3VyY2UgY29kZSB0byBEYXJ0IEtlcm5lbCBvYmplY3RzLgpsaWJyYXJ5IGZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9yOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9jb2Rlcy5kYXJ0JwogICAgc2hvdyBtZXNzYWdlTWlzc2luZ01haW4sIG5vTGVuZ3RoOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IENvbXBvbmVudDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICcuLi9mYXN0YS9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9rZXJuZWxfZ2VuZXJhdG9yX2ltcGwuZGFydCcKICAgIHNob3cgZ2VuZXJhdGVLZXJuZWwsIGdlbmVyYXRlS2VybmVsSW50ZXJuYWw7CgppbXBvcnQgJ2NvbXBpbGVyX29wdGlvbnMuZGFydCcgc2hvdyBDb21waWxlck9wdGlvbnM7CgovLy8gR2VuZXJhdGVzIGEga2VybmVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9ncmFtIHdob3NlIG1haW4gbGlicmFyeSBpcyBpbgovLy8gdGhlIGdpdmVuIFtzb3VyY2VdLgovLy8KLy8vIEludGVuZGVkIGZvciB3aG9sZS1wcm9ncmFtIChub24tbW9kdWxhcikgY29tcGlsYXRpb24uCi8vLwovLy8gR2l2ZW4gdGhlIFVyaSBvZiBhIGZpbGUgY29udGFpbmluZyBhIHByb2dyYW0ncyBgbWFpbmAgbWV0aG9kLCB0aGlzIGZ1bmN0aW9uCi8vLyBmb2xsb3dzIGBpbXBvcnRgLCBgZXhwb3J0YCwgYW5kIGBwYXJ0YCBkZWNsYXJhdGlvbnMgdG8gZGlzY292ZXIgdGhlIHdob2xlCi8vLyBwcm9ncmFtLCBhbmQgY29udmVydHMgdGhlIHJlc3VsdCB0byBEYXJ0IEtlcm5lbCBmb3JtYXQuCi8vLwovLy8gSWYgYGNvbXBpbGVTZGtgIGluIFtvcHRpb25zXSBpcyB0cnVlLCB0aGUgZ2VuZXJhdGVkIFtDb21waWxlclJlc3VsdF0gd2lsbAovLy8gaW5jbHVkZSBjb2RlIGZvciB0aGUgU0RLLgovLy8KLy8vIElmIHN1bW1hcmllcyBhcmUgcHJvdmlkZWQgaW4gW29wdGlvbnNdLCB0aGUgY29tcGlsZXIgd2lsbCB1c2UgdGhlbSBpbnN0ZWFkCi8vLyBvZiBjb21waWxpbmcgdGhlIGxpYnJhcmllcyBjb250YWluZWQgaW4gdGhvc2Ugc3VtbWFyaWVzLiBUaGlzIGlzIHVzZWZ1bCwgZm9yCi8vLyBleGFtcGxlLCB3aGVuIGNvbXBpbGluZyBmb3IgcGxhdGZvcm1zIHRoYXQgYWxyZWFkeSBlbWJlZCB0aG9zZSBzb3VyY2VzIChsaWtlCi8vLyB0aGUgc2RrIGluIHRoZSBzdGFuZGFsb25lIFZNKS4KLy8vCi8vLyBUaGUgaW5wdXQgW3NvdXJjZV0gaXMgZXhwZWN0ZWQgdG8gYmUgYSBzY3JpcHQgd2l0aCBhIG1haW4gbWV0aG9kLCBvdGhlcndpc2UKLy8vIGFuIGVycm9yIGlzIHJlcG9ydGVkLgovLyBUT0RPKHNpZ211bmQpOiByZW5hbWUgdG8ga2VybmVsRm9yU2NyaXB0PwpGdXR1cmU8Q29tcGlsZXJSZXN1bHQ+IGtlcm5lbEZvclByb2dyYW0oCiAgICBVcmkgc291cmNlLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgYXN5bmMgewogIHJldHVybiAoYXdhaXQga2VybmVsRm9yUHJvZ3JhbUludGVybmFsKHNvdXJjZSwgb3B0aW9ucykpOwp9CgpGdXR1cmU8Q29tcGlsZXJSZXN1bHQ+IGtlcm5lbEZvclByb2dyYW1JbnRlcm5hbCgKICAgIFVyaSBzb3VyY2UsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAge2Jvb2wgcmV0YWluRGF0YUZvclRlc3Rpbmc6IGZhbHNlLCBib29sIHJlcXVpcmVNYWluOiB0cnVlfSkgYXN5bmMgewogIFByb2Nlc3NlZE9wdGlvbnMgcE9wdGlvbnMgPQogICAgICBuZXcgUHJvY2Vzc2VkT3B0aW9ucyhvcHRpb25zOiBvcHRpb25zLCBpbnB1dHM6IFtzb3VyY2VdKTsKICByZXR1cm4gYXdhaXQgQ29tcGlsZXJDb250ZXh0LnJ1bldpdGhPcHRpb25zKHBPcHRpb25zLCAoY29udGV4dCkgYXN5bmMgewogICAgQ29tcGlsZXJSZXN1bHQgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbCgKICAgICAgICBpbmNsdWRlSGllcmFyY2h5QW5kQ29yZVR5cGVzOiB0cnVlLAogICAgICAgIHJldGFpbkRhdGFGb3JUZXN0aW5nOiByZXRhaW5EYXRhRm9yVGVzdGluZyk7CiAgICBDb21wb25lbnQgY29tcG9uZW50ID0gcmVzdWx0Py5jb21wb25lbnQ7CiAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIGlmIChyZXF1aXJlTWFpbiAmJiBjb21wb25lbnQubWFpbk1ldGhvZCA9PSBudWxsKSB7CiAgICAgIGNvbnRleHQub3B0aW9ucy5yZXBvcnQoCiAgICAgICAgICBtZXNzYWdlTWlzc2luZ01haW4ud2l0aExvY2F0aW9uKHNvdXJjZSwgLTEsIG5vTGVuZ3RoKSwKICAgICAgICAgIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0pOwp9CgovLy8gR2VuZXJhdGVzIGEga2VybmVsIHJlcHJlc2VudGF0aW9uIGZvciBhIG1vZHVsZSBjb250YWluaW5nIFtzb3VyY2VzXS4KLy8vCi8vLyBBIG1vZHVsZSBpcyBhIGNvbGxlY3Rpb24gb2YgbGlicmFyaWVzIHRoYXQgYXJlIGNvbXBpbGVkIHRvZ2V0aGVyLiBMaWJyYXJpZXMKLy8vIGluIHRoZSBtb2R1bGUgbWF5IGRlcGVuZCBvbiBlYWNoIG90aGVyIGFuZCBtYXkgaGF2ZSBkZXBlbmRlbmNpZXMgdG8KLy8vIGxpYnJhcmllcyBpbiBvdGhlciBtb2R1bGVzLiBVbmxpa2UgbGlicmFyeSBkZXBlbmRlbmNpZXMsIG1vZHVsZSBkZXBlbmRlbmNpZXMKLy8vIG11c3QgYmUgYWN5Y2xpYy4KLy8vCi8vLyBUaGlzIEFQSSBpcyBpbnRlbmRlZCBmb3IgbW9kdWxhciBjb21waWxhdGlvbi4gRGVwZW5kZW5jaWVzIHRvIG90aGVyIG1vZHVsZXMKLy8vIGFyZSBzcGVjaWZpZWQgdXNpbmcgW0NvbXBpbGVyT3B0aW9ucy5pbnB1dFN1bW1hcmllc10uIEFueSBkZXBlbmRlbmN5Ci8vLyBvZiBbc291cmNlc10gdGhhdCBpcyBub3QgbGlzdGVkIGluIFtDb21waWxlck9wdGlvbnMuaW5wdXRTdW1tYXJpZXNdIGFuZAovLy8gW0NvbXBpbGVyT3B0aW9ucy5zZGtTdW1tYXJ5XSBpcyB0cmVhdGVkIGFzIGFuIGFkZGl0aW9uYWwgc291cmNlIGZpbGUgZm9yIHRoZQovLy8gbW9kdWxlLgovLy8KLy8vIEFueSBgcGFydGAgZGVjbGFyYXRpb25zIGZvdW5kIGluIFtzb3VyY2VzXSBtdXN0IHJlZmVyIHRvIHBhcnQgZmlsZXMgd2hpY2gKLy8vIGFyZSBhbHNvIGxpc3RlZCBpbiB0aGUgbW9kdWxlIHNvdXJjZXMsIG90aGVyd2lzZSBhbiBlcnJvciByZXN1bHRzLiAgKEl0Ci8vLyBpcyBub3QgcGVybWl0dGVkIHRvIHJlZmVyIHRvIGEgcGFydCBmaWxlIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlKS4KLy8vCi8vLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgW0NvbXBpbGVyUmVzdWx0XSBvYmplY3Qgd2l0aCBubyBtYWluIG1ldGhvZCBzZXQgaW4KLy8vIHRoZSBbQ29tcG9uZW50XSBvZiBpdHMgYGNvbXBvbmVudGAgcHJvcGVydHkuIFRoZSBbQ29tcG9uZW50XSBpbmNsdWRlcwovLy8gZXh0ZXJuYWwgbGlicmFyaWVzIGZvciB0aG9zZSBsaWJyYXJpZXMgbG9hZGVkIHRocm91Z2ggc3VtbWFyaWVzLgpGdXR1cmU8Q29tcGlsZXJSZXN1bHQ+IGtlcm5lbEZvck1vZHVsZSgKICAgIExpc3Q8VXJpPiBzb3VyY2VzLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucykgYXN5bmMgewogIHJldHVybiAoYXdhaXQgZ2VuZXJhdGVLZXJuZWwoCiAgICAgIG5ldyBQcm9jZXNzZWRPcHRpb25zKG9wdGlvbnM6IG9wdGlvbnMsIGlucHV0czogc291cmNlcyksCiAgICAgIGluY2x1ZGVIaWVyYXJjaHlBbmRDb3JlVHlwZXM6IHRydWUpKTsKfQoKLy8vIFJlc3VsdCBvYmplY3QgZm9yIFtrZXJuZWxGb3JQcm9ncmFtXSBhbmQgW2tlcm5lbEZvck1vZHVsZV0uCmFic3RyYWN0IGNsYXNzIENvbXBpbGVyUmVzdWx0IHsKICAvLy8gVGhlIGdlbmVyYXRlZCBzdW1tYXJ5IGJ5dGVzLCBpZiBpdCB3YXMgcmVxdWVzdGVkLgogIExpc3Q8aW50PiBnZXQgc3VtbWFyeTsKCiAgLy8vIFRoZSBnZW5lcmF0ZWQgY29tcG9uZW50LCBpZiBpdCB3YXMgcmVxdWVzdGVkLgogIENvbXBvbmVudCBnZXQgY29tcG9uZW50OwoKICBDb21wb25lbnQgZ2V0IHNka0NvbXBvbmVudDsKCiAgLy8vIFRoZSBjb21wb25lbnRzIGxvYWRlZCBmcm9tIGRpbGwgKGV4Y2x1ZGluZyB0aGUgc2RrKS4KICBMaXN0PENvbXBvbmVudD4gZ2V0IGxvYWRlZENvbXBvbmVudHM7CgogIC8vLyBEZXBlbmRlbmNpZXMgdHJhdmVyc2VkIGJ5IHRoZSBjb21waWxlci4gVXNlZCBvbmx5IGZvciBnZW5lcmF0aW5nCiAgLy8vIGRlcGVuZGVuY3kgLkdOIGZpbGVzIGluIHRoZSBkYXJ0LXNkayBidWlsZCBzeXN0ZW0uCiAgLy8vIE5vdGUgdGhpcyBtaWdodCBiZSByZW1vdmVkIHdoZW4gd2Ugc3dpdGNoIHRvIGNvbXB1dGUgZGVwZW5kZW5jaWVzIHdpdGhvdXQKICAvLy8gdXNpbmcgdGhlIGNvbXBpbGVyIGl0c2VsZi4KICBMaXN0PFVyaT4gZ2V0IGRlcHM7CgogIC8vLyBUaGUgW0NsYXNzSGllcmFyY2h5XSBmb3IgdGhlIGNvbXBpbGVkIFtjb21wb25lbnRdLCBpZiBpdCB3YXMgcmVxdWVzdGVkLgogIENsYXNzSGllcmFyY2h5IGdldCBjbGFzc0hpZXJhcmNoeTsKCiAgLy8vIFRoZSBbQ29yZVR5cGVzXSBvYmplY3QgZm9yIHRoZSBjb21waWxlZCBbY29tcG9uZW50XSwgaWYgaXQgd2FzIHJlcXVlc3RlZC4KICBDb3JlVHlwZXMgZ2V0IGNvcmVUeXBlczsKfQqAggBOTjwBUSQBIQE9JwFPATEBQgE4AT8BPgEnMQE1AU4YBDoEUE48BE4eBE9RUSMEUBotKTE8AgExKUgeQEo6LDUtKAE3HkEbEwYTBgIBSQRQSFEVBFBJTFEMBE5MSgRNSkUoOCA/LAIBQCA4GQE0GwEeATsoAUc5UCEWAU4lAVAbAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUva2VybmVsX2dlbmVyYXRvci5kYXJ0Z2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnSPli8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC5tZW1vcnlfZmlsZV9zeXN0ZW07CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAnZmlsZV9zeXN0ZW0uZGFydCc7CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1dIHdoaWNoIHBlcmZvcm1zIGl0cyBvcGVyYXRpb25zIG9uIGFuCi8vLyBpbi1tZW1vcnkgdmlydHVhbCBmaWxlIHN5c3RlbS4KLy8vCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgY2xpZW50cy4KY2xhc3MgTWVtb3J5RmlsZVN5c3RlbSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW0gewogIGZpbmFsIE1hcDxVcmksIFVpbnQ4TGlzdD4gX2ZpbGVzID0ge307CiAgZmluYWwgU2V0PFVyaT4gX2RpcmVjdG9yaWVzID0gbmV3IFNldDxVcmk+KCk7CgogIC8vLyBUaGUgImN1cnJlbnQgZGlyZWN0b3J5IiBpbiB0aGUgaW4tbWVtb3J5IHZpcnR1YWwgZmlsZSBzeXN0ZW0uCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IHJlbGF0aXZlIFVSSXMgdG8gYWJzb2x1dGUgVVJJcy4KICAvLy8KICAvLy8gQWx3YXlzIGVuZHMgaW4gYSB0cmFpbGluZyAnLycuCiAgVXJpIGN1cnJlbnREaXJlY3Rvcnk7CgogIE1lbW9yeUZpbGVTeXN0ZW0oVXJpIGN1cnJlbnREaXJlY3RvcnkpCiAgICAgIDogY3VycmVudERpcmVjdG9yeSA9IF9hZGRUcmFpbGluZ1NsYXNoKGN1cnJlbnREaXJlY3RvcnkpIHsKICAgIF9kaXJlY3Rvcmllcy5hZGQoY3VycmVudERpcmVjdG9yeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1vcnlGaWxlU3lzdGVtRW50aXR5IGVudGl0eUZvclVyaShVcmkgdXJpKSB7CiAgICByZXR1cm4gbmV3IE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkuXygKICAgICAgICB0aGlzLCBjdXJyZW50RGlyZWN0b3J5LnJlc29sdmVVcmkodXJpKS5ub3JtYWxpemVQYXRoKCkpOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z1N0cmluZyB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBfZmlsZXMuZm9yRWFjaCgodXJpLCBfKSA9PiBzYi53cml0ZSgiLSAkdXJpXG4iKSk7CiAgICBfZGlyZWN0b3JpZXMuZm9yRWFjaCgodXJpKSA9PiBzYi53cml0ZSgiLSAkdXJpXG4iKSk7CiAgICByZXR1cm4gJyRzYic7CiAgfQoKICBzdGF0aWMgVXJpIF9hZGRUcmFpbGluZ1NsYXNoKFVyaSB1cmkpIHsKICAgIGlmICghdXJpLnBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICB1cmkgPSB1cmkucmVwbGFjZShwYXRoOiB1cmkucGF0aCArICcvJyk7CiAgICB9CiAgICByZXR1cm4gdXJpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBmb3IgdXNlIGJ5Ci8vLyBbTWVtb3J5RmlsZVN5c3RlbV0uCmNsYXNzIE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBmaW5hbCBNZW1vcnlGaWxlU3lzdGVtIF9maWxlU3lzdGVtOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBNZW1vcnlGaWxlU3lzdGVtRW50aXR5Ll8odGhpcy5fZmlsZVN5c3RlbSwgdGhpcy51cmkpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHVyaS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIE1lbW9yeUZpbGVTeXN0ZW1FbnRpdHkgJiYKICAgICAgb3RoZXIudXJpID09IHVyaSAmJgogICAgICBpZGVudGljYWwob3RoZXIuX2ZpbGVTeXN0ZW0sIF9maWxlU3lzdGVtKTsKCiAgLy8vIENyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgdGhpcyBmaWxlIHN5c3RlbSBlbnRyeS4KICAvLy8KICAvLy8gSWYgdGhlIGVudHJ5IGlzIGFuIGV4aXN0aW5nIGZpbGUsIHRoaXMgaXMgYW4gZXJyb3IuCiAgdm9pZCBjcmVhdGVEaXJlY3RvcnkoKSB7CiAgICBpZiAoX2ZpbGVTeXN0ZW0uX2ZpbGVzW3VyaV0gIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksICdFbnRyeSAkdXJpIGlzIGEgZmlsZS4nKTsKICAgIH0KICAgIF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5hZGQodXJpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSBhc3luYyB7CiAgICByZXR1cm4gX2ZpbGVTeXN0ZW0uX2ZpbGVzW3VyaV0gIT0gbnVsbCB8fAogICAgICAgIF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5jb250YWlucyh1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICBVaW50OExpc3QgY29udGVudHMgPSBfZmlsZVN5c3RlbS5fZmlsZXNbdXJpXTsKICAgIGlmIChjb250ZW50cyA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0ZpbGUgJHVyaSBkb2VzIG5vdCBleGlzdC4nKTsKICAgIH0KICAgIHJldHVybiBjb250ZW50czsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IGF3YWl0IHJlYWRBc0J5dGVzKCk7CiAgICB0cnkgewogICAgICByZXR1cm4gdXRmOC5kZWNvZGUoYnl0ZXMpOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24odXJpLCBlLm1lc3NhZ2UpOwogICAgfQogIH0KCiAgLy8vIFdyaXRlcyB0aGUgZ2l2ZW4gcmF3IGJ5dGVzIHRvIHRoaXMgZmlsZSBzeXN0ZW0gZW50aXR5LgogIC8vLwogIC8vLyBJZiBubyBmaWxlIGV4aXN0cywgb25lIGlzIGNyZWF0ZWQuICBJZiBhIGZpbGUgZXhpc3RzIGFscmVhZHksIGl0IGlzCiAgLy8vIG92ZXJ3cml0dGVuLgogIHZvaWQgd3JpdGVBc0J5dGVzU3luYyhMaXN0PGludD4gYnl0ZXMpIHsKICAgIGlmIChieXRlcyBpcyBVaW50OExpc3QpIHsKICAgICAgX3VwZGF0ZSh1cmksIGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIF91cGRhdGUodXJpLCBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKSk7CiAgICB9CiAgfQoKICAvLy8gV3JpdGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgLy8vCiAgLy8vIFRoZSBzdHJpbmcgaXMgZW5jb2RlZCBhcyBVVEYtOC4KICAvLy8KICAvLy8gSWYgbm8gZmlsZSBleGlzdHMsIG9uZSBpcyBjcmVhdGVkLiAgSWYgYSBmaWxlIGV4aXN0cyBhbHJlYWR5LCBpdCBpcwogIC8vLyBvdmVyd3JpdHRlbi4KICB2b2lkIHdyaXRlQXNTdHJpbmdTeW5jKFN0cmluZyBzKSB7CiAgICAvLyBOb3RlOiB0aGUgcmV0dXJuIHR5cGUgb2YgdXRmOC5lbmNvZGUgaXMgTGlzdDxpbnQ+LCBidXQgaW4gcHJhY3RpY2UgaXQKICAgIC8vIGFsd2F5cyByZXR1cm5zIFVpbnQ4TGlzdC4gIFdlIHJlbHkgb24gdGhhdCBmb3IgZWZmaWNpZW5jeSwgc28gdGhhdCB3ZQogICAgLy8gZG9uJ3QgaGF2ZSB0byBtYWtlIGFuIGV4dHJhIGNvcHkuCiAgICBfdXBkYXRlKHVyaSwgdXRmOC5lbmNvZGUocykgYXMgVWludDhMaXN0KTsKICB9CgogIHZvaWQgX3VwZGF0ZShVcmkgdXJpLCBVaW50OExpc3QgZGF0YSkgewogICAgaWYgKF9maWxlU3lzdGVtLl9kaXJlY3Rvcmllcy5jb250YWlucyh1cmkpKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKHVyaSwgJ0VudHJ5ICR1cmkgaXMgYSBkaXJlY3RvcnkuJyk7CiAgICB9CiAgICBfZmlsZVN5c3RlbS5fZmlsZXNbdXJpXSA9IGRhdGE7CiAgfQp9CoCNAE5OPAEmARUXGgEbAVAjBDsvKTABRAY+BiUYASlBKAQBDDEpQQQBGyo2ORIEASojLwYQBAIBPRg7JgEMEQE4AQwkAQwkKRoxATUGOhsrQwYnBAEMIC4wBAEMKjIcRwYVBAEMKCsKISU1BgQBPQZKEyseGw0zBgQBOgYmBkoTJU1NKS8EASoySAYkBAIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL21lbW9yeV9maWxlX3N5c3RlbS5kYXJ0aWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvc3RhbmRhcmRfZmlsZV9zeXN0ZW0uZGFydI0XLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLnN0YW5kYXJkX2ZpbGVfc3lzdGVtOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAnZmlsZV9zeXN0ZW0uZGFydCc7CgppbXBvcnQgJy4uL2Zhc3RhL2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1dIGhhbmRsaW5nIHN0YW5kYXJkIFVSSSBzY2hlbWVzLgovLy8KLy8vIGZpbGU6IFVSSXMgYXJlIGhhbmRsZWQgdXNpbmcgZmlsZSBJL08uCi8vLyBkYXRhOiBVUklzIHJldHVybiB0aGVpciBkYXRhIGNvbnRlbnRzLgovLy8KLy8vIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgpjbGFzcyBTdGFuZGFyZEZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtIHsKICBzdGF0aWMgZmluYWwgU3RhbmRhcmRGaWxlU3lzdGVtIGluc3RhbmNlID0gbmV3IFN0YW5kYXJkRmlsZVN5c3RlbS5fKCk7CgogIFN0YW5kYXJkRmlsZVN5c3RlbS5fKCk7CgogIEBvdmVycmlkZQogIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5Rm9yVXJpKFVyaSB1cmkpIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICdmaWxlJyB8fCB1cmkuc2NoZW1lID09ICcnKSB7CiAgICAgIC8vIFRPRE8oYXNrZXNjKTogRW1wdHkgc2NoZW1lcyBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgZWxzZXdoZXJlLgogICAgICByZXR1cm4gbmV3IF9Jb0ZpbGVTeXN0ZW1FbnRpdHkoVXJpLmJhc2UucmVzb2x2ZVVyaSh1cmkpKTsKICAgIH0gZWxzZSBpZiAodXJpLnNjaGVtZSA9PSAnZGF0YScpIHsKICAgICAgcmV0dXJuIG5ldyBEYXRhRmlsZVN5c3RlbUVudGl0eShVcmkuYmFzZS5yZXNvbHZlVXJpKHVyaSkpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICB1cmksICdTdGFuZGFyZEZpbGVTeXN0ZW0gb25seSBzdXBwb3J0cyBmaWxlOiogYW5kIGRhdGE6KiBVUklzJyk7CiAgICB9CiAgfQp9CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVTeXN0ZW1FbnRpdHldIGZvciBmaWxlOiBVUklzLgpjbGFzcyBfSW9GaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKCiAgX0lvRmlsZVN5c3RlbUVudGl0eSh0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdXJpLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX0lvRmlsZVN5c3RlbUVudGl0eSAmJiBvdGhlci51cmkgPT0gdXJpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8Ym9vbD4gZXhpc3RzKCkgYXN5bmMgewogICAgaWYgKGF3YWl0IGlvLkZpbGVTeXN0ZW1FbnRpdHkuaXNEaXJlY3RvcnkodXJpLnRvRmlsZVBhdGgoKSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IGlvLkZpbGUuZnJvbVVyaSh1cmkpLmV4aXN0cygpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICB0cnkgewogICAgICBDb21waWxlckNvbnRleHQucmVjb3JkRGVwZW5kZW5jeSh1cmkpOwogICAgICByZXR1cm4gbmV3IGlvLkZpbGUuZnJvbVVyaSh1cmkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgfSBvbiBpby5GaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgdGhyb3cgX3RvRmlsZVN5c3RlbUV4Y2VwdGlvbihleGNlcHRpb24pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgQ29tcGlsZXJDb250ZXh0LnJlY29yZERlcGVuZGVuY3kodXJpKTsKICAgICAgcmV0dXJuIGF3YWl0IG5ldyBpby5GaWxlLmZyb21VcmkodXJpKS5yZWFkQXNTdHJpbmcoKTsKICAgIH0gb24gaW8uRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZXhjZXB0aW9uKSB7CiAgICAgIHRocm93IF90b0ZpbGVTeXN0ZW1FeGNlcHRpb24oZXhjZXB0aW9uKTsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybiB0aGUgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGZvciB0aGUgZ2l2ZW4gSS9PIGV4Y2VwdGlvbi4KICAgKi8KICBGaWxlU3lzdGVtRXhjZXB0aW9uIF90b0ZpbGVTeXN0ZW1FeGNlcHRpb24oaW8uRmlsZVN5c3RlbUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7CiAgICBTdHJpbmcgb3NNZXNzYWdlID0gZXhjZXB0aW9uLm9zRXJyb3I/Lm1lc3NhZ2U7CiAgICBpZiAob3NNZXNzYWdlICE9IG51bGwgJiYgb3NNZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgbWVzc2FnZSA9IG9zTWVzc2FnZTsKICAgIH0KICAgIHJldHVybiBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbih1cmksIG1lc3NhZ2UpOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtGaWxlU3lzdGVtRW50aXR5XSBmb3IgZGF0YTogVVJJcy4KY2xhc3MgRGF0YUZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBVcmkgdXJpOwoKICBEYXRhRmlsZVN5c3RlbUVudGl0eSh0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gdXJpLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgRGF0YUZpbGVTeXN0ZW1FbnRpdHkgJiYgb3RoZXIudXJpID09IHVyaTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpIGFzeW5jIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSBhc3luYyB7CiAgICByZXR1cm4gdXJpLmRhdGEuY29udGVudEFzQnl0ZXMoKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZygpIGFzeW5jIHsKICAgIHJldHVybiB1cmkuZGF0YS5jb250ZW50QXNTdHJpbmcoKTsKICB9Cn0KfQBOTjwBKAEVGAEbAT4BSwQrKwQ7MUkBGgEMKzRJQCdBDSVLBgQCAUI4DBEBIQEMJAEMJDgBDCBDEw0wBgQBDCoKLTk0LwYEAQwoCi08NC8GBAEGQwZRKDM1GwYyBAIBQjkMEQEiAQwkAQwkOQEMIBEEAQwqJgQBDCgnBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL3N0YW5kYXJkX2ZpbGVfc3lzdGVtLmRhcnRrZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS90ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnSNeC8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZyb250X2VuZC50ZXJtaW5hbF9jb2xvcl9zdXBwb3J0OwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cganNvbkVuY29kZTsKCmltcG9ydCAnZGFydDppbycgc2hvdyBQbGF0Zm9ybSwgUHJvY2VzcywgUHJvY2Vzc1Jlc3VsdCwgc3RkZXJyLCBzdGRvdXQ7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvZGlhZ25vc3RpY19tZXNzYWdlLmRhcnQnCiAgICBzaG93IERpYWdub3N0aWNNZXNzYWdlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvY29sb3JzLmRhcnQnCiAgICBzaG93IEFMTF9DT0RFUywgVEVSTUlOQUxfQ0FQQUJJTElUSUVTOwoKLy8vIFRydWUgaWYgd2Ugc2hvdWxkIGVuYWJsZSBjb2xvcnMgaW4gb3V0cHV0LgovLy8KLy8vIFdlIGVuYWJsZSBjb2xvcnMgb25seSB3aGVuIGJvdGggW3N0ZG91dF0gYW5kIFtzdGRlcnJdIHN1cHBvcnQgQU5TSSBlc2NhcGVzLgpmaW5hbCBib29sIGVuYWJsZVRlcm1pbmFsQ29sb3JzID0gX2NvbXB1dGVFbmFibGVDb2xvcnMoKTsKCnZvaWQgcHJpbnREaWFnbm9zdGljTWVzc2FnZSgKICAgIERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UsIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBwcmludGxuKSB7CiAgaWYgKGVuYWJsZVRlcm1pbmFsQ29sb3JzKSB7CiAgICBtZXNzYWdlLmFuc2lGb3JtYXR0ZWQuZm9yRWFjaChwcmludGxuKTsKICB9IGVsc2UgewogICAgbWVzc2FnZS5wbGFpblRleHRGb3JtYXR0ZWQuZm9yRWFjaChwcmludGxuKTsKICB9Cn0KCi8vLyBPbiBXaW5kb3dzLCBjb2xvcnMgYXJlIGVuYWJsZWQgaWYgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBzdXBwb3J0cyBBTlNJCi8vLyBlc2NhcGVzLiAgT24gb3RoZXIgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBleHRlcm5hbCBwcm9ncmFtcyBgdHR5YCBhbmQKLy8vIGB0cHV0YCB0byBjb21wdXRlIGlmIEFOU0kgY29sb3JzIGFyZSBzdXBwb3J0ZWQuCmJvb2wgX2NvbXB1dGVFbmFibGVDb2xvcnMoKSB7CiAgY29uc3QgYm9vbCBkZWJ1ZyA9CiAgICAgIGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJmcm9udF9lbmQuZGVidWdfY29tcHV0ZV9lbmFibGVfY29sb3JzIik7CgogIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgIGlmICghc3Rkb3V0LnN1cHBvcnRzQW5zaUVzY2FwZXMgfHwgIXN0ZGVyci5zdXBwb3J0c0Fuc2lFc2NhcGVzKSB7CiAgICAgIC8vIEluIHRoaXMgY2FzZSwgZWl0aGVyIFtzdGRvdXRdIG9yIFtzdGRlcnJdIGRpZCBub3Qgc3VwcG9ydCB0aGUgcHJvcGVydHkKICAgICAgLy8gYHN1cHBvcnRzQW5zaUVzY2FwZXNgLiBTaW5jZSB3ZSBkbyBub3QgaGF2ZSBhbm90aGVyIHdheSB0byBkZXRlcm1pbmUKICAgICAgLy8gc3VwcG9ydCBmb3IgY29sb3JzLCB3ZSBkaXNhYmxlIHRoZW0uCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIHByaW50KCJOb3QgZW5hYmxpbmcgY29sb3JzIGFzIEFOU0kgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLiIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSB0ZXJtaW5hbCBhY3R1YWxseSBzdXBwb3J0cyBjb2xvcnMuIEN1cnJlbnRseSwgdG8KICAvLyBhdm9pZCBsaW5raW5nIHRoZSBEYXJ0IFZNIHdpdGggbmN1cnNlcywgQU5TSSBlc2NhcGUgc3VwcG9ydCBpcyByZWR1Y2VkIHRvCiAgLy8gYFBsYXRmb3JtLmVudmlyb25tZW50WydURVJNJ10uY29udGFpbnMoInh0ZXJtIilgLgoKICAvLyBDaGVjayBpZiBzdGRpbiBpcyBhIHRlcm1pbmFsIChUVFkpLgogIFByb2Nlc3NSZXN1bHQgcmVzdWx0ID0KICAgICAgUHJvY2Vzcy5ydW5TeW5jKCIvYmluL3NoIiwgWyItYyIsICJ0dHkgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIl0pOwoKICBpZiAocmVzdWx0LmV4aXRDb2RlICE9IDApIHsKICAgIGlmIChkZWJ1ZykgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgc3RkaW4gaXNuJ3QgYSB0ZXJtaW5hbC4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIFRoZSBgLVNgIG9wdGlvbiBvZiBgdHB1dGAgYWxsb3dzIHVzIHRvIHF1ZXJ5IG11bHRpcGxlIGNhcGFiaWxpdGllcyBhdAogIC8vIG9uY2UuCiAgcmVzdWx0ID0gUHJvY2Vzcy5ydW5TeW5jKAogICAgICAiL2Jpbi9zaCIsIFsiLWMiLCAicHJpbnRmICclcycgJyRURVJNSU5BTF9DQVBBQklMSVRJRVMnIHwgdHB1dCAtUyJdKTsKCiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPSAwKSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIHJ1bm5pbmcgdHB1dCBmYWlsZWQuIik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBMaXN0PFN0cmluZz4gbGluZXMgPSByZXN1bHQuc3Rkb3V0LnNwbGl0KCJcbiIpOwoKICBpZiAobGluZXMubGVuZ3RoICE9IDIpIHsKICAgIGlmIChkZWJ1ZykgewogICAgICBwcmludCgiTm90IGVuYWJsaW5nIGNvbG9ycywgdW5leHBlY3RlZCBvdXRwdXQgZnJvbSB0cHV0OiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKHJlc3VsdC5zdGRvdXQpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBudW1iZXJPZkNvbG9ycyA9IGxpbmVzWzBdOwogIGlmICgoaW50LnRyeVBhcnNlKG51bWJlck9mQ29sb3JzKSA/PyAtMSkgPCA4KSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGxlc3MgdGhhbiA4IGNvbG9ycyBzdXBwb3J0ZWQ6ICIKICAgICAgICAgICIke2pzb25FbmNvZGUobnVtYmVyT2ZDb2xvcnMpfS4iKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBhbGxDb2RlcyA9IGxpbmVzWzFdLnRyaW0oKTsKICBpZiAoQUxMX0NPREVTICE9IGFsbENvZGVzKSB7CiAgICBpZiAoZGVidWcpIHsKICAgICAgcHJpbnQoIk5vdCBlbmFibGluZyBjb2xvcnMsIGNvbG9yIGNvZGVzIGRvbid0IG1hdGNoOiAiCiAgICAgICAgICAiJHtqc29uRW5jb2RlKEFMTF9DT0RFUyl9ICE9ICR7anNvbkVuY29kZShhbGxDb2Rlcyl9LiIpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKGRlYnVnKSB7CiAgICBwcmludCgiRW5hYmxpbmcgY29sb3JzLiIpOwogIH0KICByZXR1cm4gdHJ1ZTsKfQpzAE5OPAEqAScBSAFKHAE6KwEvBFA6AR1AHiwLMQQCAUtNNB4VSwEcRlBOLhNACBQGETIGEQQBTk83ASkZSgEeET0GEgQBSwscTAEeEToGEgQBMgEbEUEsBhIEASQyEUItBhIEASUfET1DBhIEAQ8fBA8CAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS90ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnRdZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0wABkAy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6aW8nIHNob3cgZXhpdENvZGU7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydCcgc2hvdyBCaW5hcnlCdWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBDYW5vbmljYWxOYW1lLCBDb21wb25lbnQsIExvY2F0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JwogICAgc2hvdyBOb25lVGFyZ2V0LCBUYXJnZXQsIFRhcmdldEZsYWdzOwoKaW1wb3J0ICdwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzLmRhcnQnIHNob3cgUGFja2FnZXM7CgppbXBvcnQgJ3BhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZXNfZmlsZS5kYXJ0JyBhcyBwYWNrYWdlX2NvbmZpZzsKCmltcG9ydCAncGFja2FnZTpwYWNrYWdlX2NvbmZpZy9zcmMvcGFja2FnZXNfaW1wbC5kYXJ0JyBzaG93IE1hcFBhY2thZ2VzOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2NvbXBpbGVyX29wdGlvbnMuZGFydCcKICAgIHNob3cgQ29tcGlsZXJPcHRpb25zLCBEaWFnbm9zdGljTWVzc2FnZTsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3MuZGFydCcKICAgIHNob3cgZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzLCBFeHBlcmltZW50YWxGbGFnLCBleHBpcmVkRXhwZXJpbWVudGFsRmxhZ3M7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcKICAgIHNob3cgRmlsZVN5c3RlbSwgRmlsZVN5c3RlbUVudGl0eSwgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS90ZXJtaW5hbF9jb2xvcl9zdXBwb3J0LmRhcnQnCiAgICBzaG93IHByaW50RGlhZ25vc3RpY01lc3NhZ2U7CgppbXBvcnQgJy4uL2Zhc3RhL2NvbW1hbmRfbGluZV9yZXBvcnRpbmcuZGFydCcgYXMgY29tbWFuZF9saW5lX3JlcG9ydGluZzsKCmltcG9ydCAnLi4vZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGEvZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYXR0ZWRNZXNzYWdlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHMsCiAgICAgICAgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmksCiAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5LAogICAgICAgIG1lc3NhZ2VNaXNzaW5nSW5wdXQsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZSwKICAgICAgICB0ZW1wbGF0ZURlYnVnVHJhY2UsCiAgICAgICAgdGVtcGxhdGVJbnB1dEZpbGVOb3RGb3VuZCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkLAogICAgICAgIHRlbXBsYXRlUGFja2FnZXNGaWxlRm9ybWF0LAogICAgICAgIHRlbXBsYXRlU2RrUm9vdE5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlU2RrU3VtbWFyeU5vdEZvdW5kOwoKaW1wb3J0ICcuLi9mYXN0YS9tZXNzYWdlcy5kYXJ0JyBzaG93IGdldExvY2F0aW9uOwoKaW1wb3J0ICcuLi9mYXN0YS9wcm9ibGVtcy5kYXJ0JyBzaG93IERlYnVnQWJvcnQsIHVuaW1wbGVtZW50ZWQ7CgppbXBvcnQgJy4uL2Zhc3RhL3RpY2tlci5kYXJ0JyBzaG93IFRpY2tlcjsKCmltcG9ydCAnLi4vZmFzdGEvdXJpX3RyYW5zbGF0b3IuZGFydCcgc2hvdyBVcmlUcmFuc2xhdG9yOwoKaW1wb3J0ICdsaWJyYXJpZXNfc3BlY2lmaWNhdGlvbi5kYXJ0JwogICAgc2hvdwogICAgICAgIExpYnJhcmllc1NwZWNpZmljYXRpb24sCiAgICAgICAgTGlicmFyaWVzU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbiwKICAgICAgICBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uOwoKLy8vIEFsbCBvcHRpb25zIG5lZWRlZCBmb3IgdGhlIGZyb250IGVuZCBpbXBsZW1lbnRhdGlvbi4KLy8vCi8vLyBUaGlzIGluY2x1ZGVzOiBhbGwgb2YgW0NvbXBpbGVyT3B0aW9uc10gaW4gYSBmb3JtIHVzZWZ1bCB0byB0aGUKLy8vIGltcGxlbWVudGF0aW9uLCBkZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9ucyB0aGF0IHdlcmUgbm90IHByb3ZpZGVkLAovLy8gYW5kIGluZm9ybWF0aW9uIGRlcml2ZWQgZnJvbSBob3cgdGhlIGNvbXBpbGVyIHdhcyBpbnZva2VkIChsaWtlIHRoZQovLy8gZW50cnktcG9pbnRzIGdpdmVuIHRvIHRoZSBjb21waWxlciBhbmQgd2hldGhlciBhIG1vZHVsYXIgb3Igd2hvbGUtcHJvZ3JhbQovLy8gQVBJIHdhcyB1c2VkKS4KLy8vCi8vLyBUaGUgaW50ZW50IGlzIHRoYXQgdGhlIGZyb250IGVuZCBzaG91bGQgaW1tZWRpYXRlbHkgd3JhcCBhbnkgaW5jb21pbmcKLy8vIFtDb21waWxlck9wdGlvbnNdIG9iamVjdCBpbiB0aGlzIGNsYXNzIGJlZm9yZSBkb2luZyBmdXJ0aGVyIHByb2Nlc3NpbmcsIGFuZAovLy8gc2hvdWxkIHRoZXJlYWZ0ZXIgYWNjZXNzIGFsbCBvcHRpb25zIHZpYSB0aGUgd3JhcHBlci4gIFRoaXMgZW5zdXJlcyB0aGF0Ci8vLyBvcHRpb25zIGFyZSBpbnRlcnByZXRlZCBpbiBhIGNvbnNpc3RlbnQgd2F5IGFuZCB0aGF0IGRhdGEgZGVyaXZlZCBmcm9tCi8vLyBvcHRpb25zIGlzIG5vdCB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0ZWQuCmNsYXNzIFByb2Nlc3NlZE9wdGlvbnMgewogIC8vLyBUaGUgcmF3IFtDb21waWxlck9wdGlvbnNdIHdoaWNoIHRoaXMgY2xhc3Mgd3JhcHMuCiAgZmluYWwgQ29tcGlsZXJPcHRpb25zIF9yYXc7CgogIC8vLyBUaGUgcGFja2FnZSBtYXAgZGVyaXZlZCBmcm9tIHRoZSBvcHRpb25zLCBvciBgbnVsbGAgaWYgdGhlIHBhY2thZ2UgbWFwIGhhcwogIC8vLyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuCiAgUGFja2FnZXMgX3BhY2thZ2VzOwoKICAvLy8gVGhlIHVyaSBmb3IgLnBhY2thZ2VzIGRlcml2ZWQgZnJvbSB0aGUgb3B0aW9ucywgb3IgYG51bGxgIGlmIHRoZSBwYWNrYWdlCiAgLy8vIG1hcCBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0IG9yIHRoZXJlIGlzIG5vIC5wYWNrYWdlcyBpbiBlZmZlY3QuCiAgVXJpIF9wYWNrYWdlc1VyaTsKICBVcmkgZ2V0IHBhY2thZ2VzVXJpID0+IF9wYWNrYWdlc1VyaTsKCiAgLy8vIFRoZSBvYmplY3QgdGhhdCBrbm93cyBob3cgdG8gcmVzb2x2ZSAicGFja2FnZToiIGFuZCAiZGFydDoiIFVSSXMsCiAgLy8vIG9yIGBudWxsYCBpZiBpdCBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0LgogIFVyaVRyYW5zbGF0b3IgX3VyaVRyYW5zbGF0b3I7CgogIC8vLyBUaGUgU0RLIHN1bW1hcnksIG9yIGBudWxsYCBpZiBpdCBoYXMgbm90IGJlZW4gcmVhZCB5ZXQuCiAgLy8vCiAgLy8vIEEgc3VtbWFyeSwgYWxzbyByZWZlcnJlZCB0byBhcyAib3V0bGluZSIgaW50ZXJuYWxseSwgaXMgYSBbQ29tcG9uZW50XQogIC8vLyB3aGVyZSBhbGwgbWV0aG9kIGJvZGllcyBhcmUgbGVmdCBvdXQuIEluIGVzc2VuY2UsIGl0IGNvbnRhaW5zIGp1c3QgQVBJCiAgLy8vIHNpZ25hdHVyZXMgYW5kIGNvbnN0YW50cy4gVGhlIHN1bW1hcnkgc2hvdWxkIGluY2x1ZGUgaW5mZXJyZWQgdG9wLWxldmVsCiAgLy8vIHR5cGVzIHVubGVzcyBsZWdhY3kgbW9kZSBpcyBlbmFibGVkLgogIENvbXBvbmVudCBfc2RrU3VtbWFyeUNvbXBvbmVudDsKCiAgLy8vIFRoZSBzdW1tYXJ5IGZvciBlYWNoIHVyaSBpbiBgb3B0aW9ucy5pbnB1dFN1bW1hcmllc2AuCiAgLy8vCiAgLy8vIEEgc3VtbWFyeSwgYWxzbyByZWZlcnJlZCB0byBhcyAib3V0bGluZSIgaW50ZXJuYWxseSwgaXMgYSBbQ29tcG9uZW50XQogIC8vLyB3aGVyZSBhbGwgbWV0aG9kIGJvZGllcyBhcmUgbGVmdCBvdXQuIEluIGVzc2VuY2UsIGl0IGNvbnRhaW5zIGp1c3QgQVBJCiAgLy8vIHNpZ25hdHVyZXMgYW5kIGNvbnN0YW50cy4gVGhlIHN1bW1hcmllcyBzaG91bGQgaW5jbHVkZSBpbmZlcnJlZCB0b3AtbGV2ZWwKICAvLy8gdHlwZXMgdW5sZXNzIGxlZ2FjeSBtb2RlIGlzIGVuYWJsZWQuCiAgTGlzdDxDb21wb25lbnQ+IF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHM7CgogIC8vLyBPdGhlciBjb21wb25lbnRzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGxpbmtlZCBhbmQgY29tcGlsZWQgd2l0aCB0aGUgaW5wdXQKICAvLy8gc291cmNlcy4KICBMaXN0PENvbXBvbmVudD4gX2xpbmtlZERlcGVuZGVuY2llczsKCiAgLy8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgU0RLLCBvciBgbnVsbGAgaWYgdGhlIGxvY2F0aW9uIGhhc24ndCBiZWVuIGRldGVybWluZWQKICAvLy8geWV0LgogIFVyaSBfc2RrUm9vdDsKICBVcmkgZ2V0IHNka1Jvb3QgewogICAgX2Vuc3VyZVNka0RlZmF1bHRzKCk7CiAgICByZXR1cm4gX3Nka1Jvb3Q7CiAgfQoKICBVcmkgX3Nka1N1bW1hcnk7CiAgVXJpIGdldCBzZGtTdW1tYXJ5IHsKICAgIF9lbnN1cmVTZGtEZWZhdWx0cygpOwogICAgcmV0dXJuIF9zZGtTdW1tYXJ5OwogIH0KCiAgTGlzdDxpbnQ+IF9zZGtTdW1tYXJ5Qnl0ZXM7CgogIC8vLyBHZXQgdGhlIGJ5dGVzIG9mIHRoZSBTREsgb3V0bGluZSwgaWYgYW55LgogIEZ1dHVyZTxMaXN0PGludD4+IGxvYWRTZGtTdW1tYXJ5Qnl0ZXMoKSBhc3luYyB7CiAgICBpZiAoX3Nka1N1bW1hcnlCeXRlcyA9PSBudWxsKSB7CiAgICAgIGlmIChzZGtTdW1tYXJ5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBGaWxlU3lzdGVtRW50aXR5IGVudHJ5ID0gZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoc2RrU3VtbWFyeSk7CiAgICAgIF9zZGtTdW1tYXJ5Qnl0ZXMgPSBhd2FpdCBfcmVhZEFzQnl0ZXMoZW50cnkpOwogICAgfQogICAgcmV0dXJuIF9zZGtTdW1tYXJ5Qnl0ZXM7CiAgfQoKICBVcmkgX2xpYnJhcmllc1NwZWNpZmljYXRpb25Vcmk7CiAgVXJpIGdldCBsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpIHsKICAgIF9lbnN1cmVTZGtEZWZhdWx0cygpOwogICAgcmV0dXJuIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogIH0KCiAgVGlja2VyIHRpY2tlcjsKCiAgVXJpIGdldCBwYWNrYWdlc1VyaVJhdyA9PiBfcmF3LnBhY2thZ2VzRmlsZVVyaTsKCiAgYm9vbCBnZXQgdmVyYm9zZSA9PiBfcmF3LnZlcmJvc2U7CgogIGJvb2wgZ2V0IHZlcmlmeSA9PiBfcmF3LnZlcmlmeTsKCiAgYm9vbCBnZXQgZGVidWdEdW1wID0+IF9yYXcuZGVidWdEdW1wOwoKICBib29sIGdldCBvbWl0UGxhdGZvcm0gPT4gX3Jhdy5vbWl0UGxhdGZvcm07CgogIGJvb2wgZ2V0IHNldEV4aXRDb2RlT25Qcm9ibGVtID0+IF9yYXcuc2V0RXhpdENvZGVPblByb2JsZW07CgogIGJvb2wgZ2V0IGVtYmVkU291cmNlVGV4dCA9PiBfcmF3LmVtYmVkU291cmNlVGV4dDsKCiAgYm9vbCBnZXQgdGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZyA9PiBfcmF3LnRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmc7CgogIGJvb2wgZ2V0IHRocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZyA9PiBfcmF3LnRocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZzsKCiAgYm9vbCBnZXQgcGVyZm9ybU5uYmRDaGVja3MgPT4gX3Jhdy5wZXJmb3JtTm5iZENoZWNrczsKCiAgYm9vbCBnZXQgbm5iZFN0cm9uZ01vZGUgPT4gX3Jhdy5ubmJkU3Ryb25nTW9kZTsKCiAgLy8vIFRoZSBlbnRyeS1wb2ludHMgcHJvdmlkZWQgdG8gdGhlIGNvbXBpbGVyLgogIGZpbmFsIExpc3Q8VXJpPiBpbnB1dHM7CgogIC8vLyBUaGUgVXJpIHdoZXJlIG91dHB1dCBpcyBnZW5lcmF0ZWQsIG1heSBiZSBudWxsLgogIGZpbmFsIFVyaSBvdXRwdXQ7CgogIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzOwoKICBib29sIGdldCBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCA9PiBfcmF3LmVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OwoKICAvLy8gVGhlIG51bWJlciBvZiBmYXRhbCBkaWFnbm9zdGljcyBlbmNvdW50ZXJlZCBzbyBmYXIuCiAgaW50IGZhdGFsRGlhZ25vc3RpY0NvdW50ID0gMDsKCiAgLy8vIEluaXRpYWxpemVzIGEgW1Byb2Nlc3NlZE9wdGlvbnNdIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gW3Jhd09wdGlvbnNdLgogIFByb2Nlc3NlZE9wdGlvbnMoe0NvbXBpbGVyT3B0aW9ucyBvcHRpb25zLCBMaXN0PFVyaT4gaW5wdXRzLCB0aGlzLm91dHB1dH0pCiAgICAgIDogdGhpcy5fcmF3ID0gb3B0aW9ucyA/PyBuZXcgQ29tcGlsZXJPcHRpb25zKCksCiAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHMgPz8gPFVyaT5bXSwKICAgICAgICAvLyBUT0RPKGFza2VzYyk6IENvcHkgdGhlIG1hcCB3aGVuIGtlcm5lbF9zZXJ2aWNlIHN1cHBvcnRzIHRoYXQuCiAgICAgICAgdGhpcy5lbnZpcm9ubWVudERlZmluZXMgPSBvcHRpb25zPy5lbnZpcm9ubWVudERlZmluZXMsCiAgICAgICAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBjcmVhdGUgdGlja2VyIGV2ZW4gZWFybGllciBvciBwYXNzIGluIGEgc3RvcHdhdGNoCiAgICAgICAgLy8gY29sbGVjdGluZyB0aW1lIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgVk0uCiAgICAgICAgdGhpcy50aWNrZXIgPSBuZXcgVGlja2VyKGlzVmVyYm9zZTogb3B0aW9ucz8udmVyYm9zZSA/PyBmYWxzZSk7CgogIEZvcm1hdHRlZE1lc3NhZ2UgZm9ybWF0KAogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCkgewogICAgaW50IG9mZnNldCA9IG1lc3NhZ2UuY2hhck9mZnNldDsKICAgIFVyaSB1cmkgPSBtZXNzYWdlLnVyaTsKICAgIExvY2F0aW9uIGxvY2F0aW9uID0gb2Zmc2V0ID09IC0xID8gbnVsbCA6IGdldExvY2F0aW9uKHVyaSwgb2Zmc2V0KTsKICAgIFN0cmluZyBmb3JtYXR0ZWQgPQogICAgICAgIGNvbW1hbmRfbGluZV9yZXBvcnRpbmcuZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5LCBsb2NhdGlvbjogbG9jYXRpb24pOwogICAgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiBmb3JtYXR0ZWRDb250ZXh0OwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmlzTm90RW1wdHkpIHsKICAgICAgZm9ybWF0dGVkQ29udGV4dCA9IG5ldyBMaXN0PEZvcm1hdHRlZE1lc3NhZ2U+KGNvbnRleHQubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZm9ybWF0dGVkQ29udGV4dFtpXSA9IGZvcm1hdChjb250ZXh0W2ldLCBTZXZlcml0eS5jb250ZXh0LCBudWxsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lc3NhZ2Uud2l0aEZvcm1hdHRpbmcoZm9ybWF0dGVkLCBsb2NhdGlvbj8ubGluZSA/PyAtMSwKICAgICAgICBsb2NhdGlvbj8uY29sdW1uID8/IC0xLCBzZXZlcml0eSwgZm9ybWF0dGVkQ29udGV4dCk7CiAgfQoKICB2b2lkIHJlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBpZiAoY29tbWFuZF9saW5lX3JlcG9ydGluZy5pc0hpZGRlbihzZXZlcml0eSkpIHJldHVybjsKICAgIGlmIChjb21tYW5kX2xpbmVfcmVwb3J0aW5nLmlzQ29tcGlsZVRpbWVFcnJvcihzZXZlcml0eSkpIHsKICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQubG9nRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHkpOwogICAgfQogICAgaWYgKENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuc2V0RXhpdENvZGVPblByb2JsZW0pIHsKICAgICAgZXhpdENvZGUgPSAxOwogICAgfQogICAgcmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UoZm9ybWF0KG1lc3NhZ2UsIHNldmVyaXR5LCBjb250ZXh0KSk7CiAgICBpZiAoY29tbWFuZF9saW5lX3JlcG9ydGluZy5zaG91bGRUaHJvd09uKHNldmVyaXR5KSkgewogICAgICBpZiAoZmF0YWxEaWFnbm9zdGljQ291bnQrKyA8IF9yYXcuc2tpcEZvckRlYnVnZ2luZykgewogICAgICAgIC8vIFNraXAgdGhpcyBvbmUuIFRoZSBpbnRlcmVzdGluZyBvbmUgY29tZXMgbGF0ZXIuCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChfcmF3LnNraXBGb3JEZWJ1Z2dpbmcgPCAwKSB7CiAgICAgICAgcHJpbnQodGVtcGxhdGVEZWJ1Z1RyYWNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKCIkc2V2ZXJpdHkiLCAiJHtTdGFja1RyYWNlLmN1cnJlbnR9IikKICAgICAgICAgICAgLm1lc3NhZ2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBEZWJ1Z0Fib3J0KAogICAgICAgICAgICBtZXNzYWdlLnVyaSwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBzZXZlcml0eSwgU3RhY2tUcmFjZS5jdXJyZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZXBvcnREaWFnbm9zdGljTWVzc2FnZShEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAoX3Jhdy5vbkRpYWdub3N0aWMgPz8gX2RlZmF1bHREaWFnbm9zdGljTWVzc2FnZUhhbmRsZXIpKG1lc3NhZ2UpOwogIH0KCiAgdm9pZCBfZGVmYXVsdERpYWdub3N0aWNNZXNzYWdlSGFuZGxlcihEaWFnbm9zdGljTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBwcmludERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UsIHByaW50KTsKICB9CgogIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIHRoaXMgYW5kIGRpcmVjdCBjYWxsZXJzIGRpcmVjdGx5IHRvIHJlcG9ydC4KICB2b2lkIHJlcG9ydFdpdGhvdXRMb2NhdGlvbihNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICByZXBvcnQobWVzc2FnZS53aXRob3V0TG9jYXRpb24oKSwgc2V2ZXJpdHkpOwogIH0KCiAgLy8vIFJ1bnMgdmFyaW91cyB2YWxpZGF0aW9ucyBjaGVja3Mgb24gdGhlIGlucHV0IG9wdGlvbnMuIEZvciBpbnN0YW5jZSwKICAvLy8gaWYgYW4gb3B0aW9uIGlzIGEgcGF0aCB0byBhIGZpbGUsIGl0IGNoZWNrcyB0aGF0IHRoZSBmaWxlIGV4aXN0cy4KICBGdXR1cmU8Ym9vbD4gdmFsaWRhdGVPcHRpb25zKHtib29sIGVycm9yT25NaXNzaW5nSW5wdXQ6IHRydWV9KSBhc3luYyB7CiAgICBpZiAodmVyYm9zZSkgcHJpbnQoZGVidWdTdHJpbmcoKSk7CgogICAgaWYgKGVycm9yT25NaXNzaW5nSW5wdXQgJiYgaW5wdXRzLmlzRW1wdHkpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKG1lc3NhZ2VNaXNzaW5nSW5wdXQsIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChfcmF3LnNka1Jvb3QgIT0gbnVsbCAmJgogICAgICAgICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShzZGtSb290KS5leGlzdHMoKSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZVNka1Jvb3ROb3RGb3VuZC53aXRoQXJndW1lbnRzKHNka1Jvb3QpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBVcmkgc3VtbWFyeSA9IHNka1N1bW1hcnk7CiAgICBpZiAoc3VtbWFyeSAhPSBudWxsICYmICFhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShzdW1tYXJ5KS5leGlzdHMoKSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZC53aXRoQXJndW1lbnRzKHN1bW1hcnkpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoY29tcGlsZVNkayAmJiBzdW1tYXJ5ICE9IG51bGwpIHsKICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5LAogICAgICAgICAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZvciAoVXJpIHNvdXJjZSBpbiBfcmF3LmxpbmtlZERlcGVuZGVuY2llcykgewogICAgICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIGNoZWNrLCB0aGUgY29tcGlsZXIgaXRzZWxmIHNob3VsZCBoYW5kbGUgYW5kCiAgICAgIC8vIHJlY292ZXIgZnJvbSB0aGlzLgogICAgICBpZiAoIWF3YWl0IGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHNvdXJjZSkuZXhpc3RzKCkpIHsKICAgICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICAgIHRlbXBsYXRlSW5wdXRGaWxlTm90Rm91bmQud2l0aEFyZ3VtZW50cyhzb3VyY2UpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgU0RLIHdoZW4gY29tcGlsaW5nIGEKICAvLy8gd2hvbGUtcHJvZ3JhbS4KICBib29sIGdldCBjb21waWxlU2RrID0+IF9yYXcuY29tcGlsZVNkazsKCiAgRmlsZVN5c3RlbSBfZmlsZVN5c3RlbTsKCiAgLy8vIEdldCB0aGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmcm9udCBlbmQgdG8gYWNjZXNzCiAgLy8vIGZpbGVzLgogIEZpbGVTeXN0ZW0gZ2V0IGZpbGVTeXN0ZW0gPT4gX2ZpbGVTeXN0ZW0gPz89IF9jcmVhdGVGaWxlU3lzdGVtKCk7CgogIC8vLyBDbGVhciB0aGUgZmlsZSBzeXN0ZW0gc28gYW55IENvbXBpbGVyT3B0aW9ucyBmaWxlU3lzdGVtIGNoYW5nZSB3aWxsIGhhdmUKICAvLy8gZWZmZWN0LgogIHZvaWQgY2xlYXJGaWxlU3lzdGVtQ2FjaGUoKSA9PiBfZmlsZVN5c3RlbSA9IG51bGw7CgogIC8vLyBXaGV0aGVyIHRvIGdlbmVyYXRlIGJ5dGVjb2RlLgogIGJvb2wgZ2V0IGJ5dGVjb2RlID0+IF9yYXcuYnl0ZWNvZGU7CgogIC8vLyBXaGV0aGVyIHRvIHdyaXRlIGEgZmlsZSAoZS5nLiBhIGRpbGwgZmlsZSkgd2hlbiByZXBvcnRpbmcgYSBjcmFzaC4KICBib29sIGdldCB3cml0ZUZpbGVPbkNyYXNoUmVwb3J0ID0+IF9yYXcud3JpdGVGaWxlT25DcmFzaFJlcG9ydDsKCiAgLy8vIFRoZSBjdXJyZW50IHNkayB2ZXJzaW9uIHN0cmluZywgZS5nLiAiMi42LjAtZWRnZS5zaGExaGFzaCIuCiAgLy8vIEZvciBpbnN0YW5jZSB1c2VkIGZvciBsYW5ndWFnZSB2ZXJzaW9uaW5nIChzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtCiAgLy8vIHZlcnNpb24pLgogIFN0cmluZyBnZXQgY3VycmVudFNka1ZlcnNpb24gPT4gX3Jhdy5jdXJyZW50U2RrVmVyc2lvbjsKCiAgVGFyZ2V0IF90YXJnZXQ7CiAgVGFyZ2V0IGdldCB0YXJnZXQgPT4KICAgICAgX3RhcmdldCA/Pz0gX3Jhdy50YXJnZXQgPz8gbmV3IE5vbmVUYXJnZXQobmV3IFRhcmdldEZsYWdzKCkpOwoKICBib29sIGlzRXhwZXJpbWVudEVuYWJsZWQoRXhwZXJpbWVudGFsRmxhZyBmbGFnKSB7CiAgICBhc3NlcnQoZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzLmNvbnRhaW5zS2V5KGZsYWcpLAogICAgICAgICJObyBkZWZhdWx0IHZhbHVlIGZvciAkZmxhZy4iKTsKICAgIGFzc2VydChleHBpcmVkRXhwZXJpbWVudGFsRmxhZ3MuY29udGFpbnNLZXkoZmxhZyksCiAgICAgICAgIk5vIGV4cGlyZWQgdmFsdWUgZm9yICRmbGFnLiIpOwogICAgaWYgKGV4cGlyZWRFeHBlcmltZW50YWxGbGFnc1tmbGFnXSkgewogICAgICByZXR1cm4gZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzW2ZsYWddOwogICAgfQogICAgcmV0dXJuIF9yYXcuZXhwZXJpbWVudGFsRmxhZ3NbZmxhZ10gPz8gZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzW2ZsYWddOwogIH0KCiAgLy8vIEdldCBhbiBvdXRsaW5lIGNvbXBvbmVudCB0aGF0IHN1bW1hcml6ZXMgdGhlIFNESywgaWYgYW55LgogIC8vIFRPRE8oc2lnbXVuZCk6IG1vdmUsIHRoaXMgZG9lc24ndCBmZWVsIGxpa2UgYW4gIm9wdGlvbiIuCiAgRnV0dXJlPENvbXBvbmVudD4gbG9hZFNka1N1bW1hcnkoQ2Fub25pY2FsTmFtZSBuYW1lUm9vdCkgYXN5bmMgewogICAgaWYgKF9zZGtTdW1tYXJ5Q29tcG9uZW50ID09IG51bGwpIHsKICAgICAgaWYgKHNka1N1bW1hcnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIExpc3Q8aW50PiBieXRlcyA9IGF3YWl0IGxvYWRTZGtTdW1tYXJ5Qnl0ZXMoKTsKICAgICAgaWYgKGJ5dGVzICE9IG51bGwgJiYgYnl0ZXMuaXNOb3RFbXB0eSkgewogICAgICAgIF9zZGtTdW1tYXJ5Q29tcG9uZW50ID0gbG9hZENvbXBvbmVudChieXRlcywgbmFtZVJvb3QpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3Nka1N1bW1hcnlDb21wb25lbnQ7CiAgfQoKICB2b2lkIHNldCBzZGtTdW1tYXJ5Q29tcG9uZW50KENvbXBvbmVudCBwbGF0Zm9ybSkgewogICAgaWYgKF9zZGtTdW1tYXJ5Q29tcG9uZW50ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoInNka1N1bW1hcnkgYWxyZWFkeSBsb2FkZWQuIik7CiAgICB9CiAgICBfc2RrU3VtbWFyeUNvbXBvbmVudCA9IHBsYXRmb3JtOwogIH0KCiAgLy8vIEdldCB0aGUgc3VtbWFyeSBwcm9ncmFtcyBmb3IgZWFjaCBvZiB0aGUgdW5kZXJseWluZyBgaW5wdXRTdW1tYXJpZXNgCiAgLy8vIHByb3ZpZGVkIHZpYSBbQ29tcGlsZXJPcHRpb25zXS4KICAvLyBUT0RPKHNpZ211bmQpOiBtb3ZlLCB0aGlzIGRvZXNuJ3QgZmVlbCBsaWtlIGFuICJvcHRpb24iLgogIEZ1dHVyZTxMaXN0PENvbXBvbmVudD4+IGxvYWRJbnB1dFN1bW1hcmllcyhDYW5vbmljYWxOYW1lIG5hbWVSb290KSBhc3luYyB7CiAgICBpZiAoX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50cyA9PSBudWxsKSB7CiAgICAgIExpc3Q8VXJpPiB1cmlzID0gX3Jhdy5pbnB1dFN1bW1hcmllczsKICAgICAgaWYgKHVyaXMgPT0gbnVsbCB8fCB1cmlzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8Q29tcG9uZW50PltdOwogICAgICAvLyBUT0RPKHNpZ211bmQpOiB0aHJvdHRsZSAjIG9mIGNvbmN1cnJlbnQgb3BlcmF0aW9ucy4KICAgICAgTGlzdDxMaXN0PGludD4+IGFsbEJ5dGVzID0gYXdhaXQgRnV0dXJlLndhaXQoCiAgICAgICAgICB1cmlzLm1hcCgodXJpKSA9PiBfcmVhZEFzQnl0ZXMoZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkodXJpKSkpKTsKICAgICAgX2lucHV0U3VtbWFyaWVzQ29tcG9uZW50cyA9CiAgICAgICAgICBhbGxCeXRlcy5tYXAoKGJ5dGVzKSA9PiBsb2FkQ29tcG9uZW50KGJ5dGVzLCBuYW1lUm9vdCkpLnRvTGlzdCgpOwogICAgfQogICAgcmV0dXJuIF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHM7CiAgfQoKICB2b2lkIHNldCBpbnB1dFN1bW1hcmllc0NvbXBvbmVudHMoTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMpIHsKICAgIGlmIChfaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoImlucHV0U3VtbWFyaWVzQ29tcG9uZW50cyBhbHJlYWR5IGxvYWRlZC4iKTsKICAgIH0KICAgIF9pbnB1dFN1bW1hcmllc0NvbXBvbmVudHMgPSBjb21wb25lbnRzOwogIH0KCiAgLy8vIExvYWQgZWFjaCBvZiB0aGUgW0NvbXBpbGVyT3B0aW9ucy5saW5rZWREZXBlbmRlbmNpZXNdIGNvbXBvbmVudHMuCiAgLy8gVE9ETyhzaWdtdW5kKTogbW92ZSwgdGhpcyBkb2Vzbid0IGZlZWwgbGlrZSBhbiAib3B0aW9uIi4KICBGdXR1cmU8TGlzdDxDb21wb25lbnQ+PiBsb2FkTGlua0RlcGVuZGVuY2llcyhDYW5vbmljYWxOYW1lIG5hbWVSb290KSBhc3luYyB7CiAgICBpZiAoX2xpbmtlZERlcGVuZGVuY2llcyA9PSBudWxsKSB7CiAgICAgIExpc3Q8VXJpPiB1cmlzID0gX3Jhdy5saW5rZWREZXBlbmRlbmNpZXM7CiAgICAgIGlmICh1cmlzID09IG51bGwgfHwgdXJpcy5pc0VtcHR5KSByZXR1cm4gY29uc3QgPENvbXBvbmVudD5bXTsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogdGhyb3R0bGUgIyBvZiBjb25jdXJyZW50IG9wZXJhdGlvbnMuCiAgICAgIExpc3Q8TGlzdDxpbnQ+PiBhbGxCeXRlcyA9IGF3YWl0IEZ1dHVyZS53YWl0KAogICAgICAgICAgdXJpcy5tYXAoKHVyaSkgPT4gX3JlYWRBc0J5dGVzKGZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHVyaSkpKSk7CiAgICAgIF9saW5rZWREZXBlbmRlbmNpZXMgPQogICAgICAgICAgYWxsQnl0ZXMubWFwKChieXRlcykgPT4gbG9hZENvbXBvbmVudChieXRlcywgbmFtZVJvb3QpKS50b0xpc3QoKTsKICAgIH0KICAgIHJldHVybiBfbGlua2VkRGVwZW5kZW5jaWVzOwogIH0KCiAgLy8vIEhlbHBlciB0byBsb2FkIGEgLmRpbGwgZmlsZSBmcm9tIFt1cmldIHVzaW5nIHRoZSBleGlzdGluZyBbbmFtZVJvb3RdLgogIENvbXBvbmVudCBsb2FkQ29tcG9uZW50KExpc3Q8aW50PiBieXRlcywgQ2Fub25pY2FsTmFtZSBuYW1lUm9vdCwKICAgICAge2Jvb2wgYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2Rlc30pIHsKICAgIENvbXBvbmVudCBjb21wb25lbnQgPQogICAgICAgIHRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudChuYW1lUm9vdDogbmFtZVJvb3QpKTsKICAgIC8vIFRPRE8oYWhlKTogUGFzcyBmaWxlIG5hbWUgdG8gQmluYXJ5QnVpbGRlci4KICAgIC8vIFRPRE8oYWhlKTogQ29udHJvbCBsYXp5IGxvYWRpbmcgdmlhIGFuIG9wdGlvbi4KICAgIG5ldyBCaW5hcnlCdWlsZGVyKGJ5dGVzLAogICAgICAgICAgICBmaWxlbmFtZTogbnVsbCwKICAgICAgICAgICAgZGlzYWJsZUxhenlSZWFkaW5nOiBmYWxzZSwKICAgICAgICAgICAgYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlczogYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykKICAgICAgICAucmVhZENvbXBvbmVudChjb21wb25lbnQpOwogICAgcmV0dXJuIGNvbXBvbmVudDsKICB9CgogIC8vLyBHZXQgdGhlIFtVcmlUcmFuc2xhdG9yXSB3aGljaCByZXNvbHZlcyAicGFja2FnZToiIGFuZCAiZGFydDoiIFVSSXMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBzaW5jZSBmaWxlIHN5c3RlbSBvcGVyYXRpb25zIG1heSBiZQogIC8vLyByZXF1aXJlZCB0byBsb2NhdGUvcmVhZCB0aGUgcGFja2FnZXMgZmlsZSBhcyB3ZWxsIGFzIFNESyBtZXRhZGF0YS4KICBGdXR1cmU8VXJpVHJhbnNsYXRvcj4gZ2V0VXJpVHJhbnNsYXRvcih7Ym9vbCBieXBhc3NDYWNoZTogZmFsc2V9KSBhc3luYyB7CiAgICBpZiAoYnlwYXNzQ2FjaGUpIHsKICAgICAgX3VyaVRyYW5zbGF0b3IgPSBudWxsOwogICAgICBfcGFja2FnZXMgPSBudWxsOwogICAgfQogICAgaWYgKF91cmlUcmFuc2xhdG9yID09IG51bGwpIHsKICAgICAgdGlja2VyLmxvZ01zKCJTdGFydGVkIGJ1aWxkaW5nIFVyaVRyYW5zbGF0b3IiKTsKICAgICAgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbiBsaWJyYXJpZXMgPQogICAgICAgICAgYXdhaXQgX2NvbXB1dGVMaWJyYXJ5U3BlY2lmaWNhdGlvbigpOwogICAgICB0aWNrZXIubG9nTXMoIlJlYWQgbGlicmFyaWVzIGZpbGUiKTsKICAgICAgUGFja2FnZXMgcGFja2FnZXMgPSBhd2FpdCBfZ2V0UGFja2FnZXMoKTsKICAgICAgdGlja2VyLmxvZ01zKCJSZWFkIHBhY2thZ2VzIGZpbGUiKTsKICAgICAgX3VyaVRyYW5zbGF0b3IgPSBuZXcgVXJpVHJhbnNsYXRvcihsaWJyYXJpZXMsIHBhY2thZ2VzKTsKICAgIH0KICAgIHJldHVybiBfdXJpVHJhbnNsYXRvcjsKICB9CgogIEZ1dHVyZTxUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPiBfY29tcHV0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uKCkgYXN5bmMgewogICAgU3RyaW5nIG5hbWUgPSB0YXJnZXQubmFtZTsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IEVlayEgV2Ugc2hvdWxkIGdldCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlcmUgaXMgbm8KICAgIC8vIGZhc3RhLXNwZWNpZmljIHRhcmdldHMgYW5kIHRoZSB0YXJnZXQgbmFtZXMgYXJlIG1lYW5pbmdmdWwuCiAgICBpZiAobmFtZS5lbmRzV2l0aCgnX2Zhc3RhJykpIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDYpOwoKICAgIGlmIChsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID09IG51bGwgfHwKICAgICAgICAhYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSkuZXhpc3RzKCkpIHsKICAgICAgaWYgKGNvbXBpbGVTZGspIHsKICAgICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICAgIHRlbXBsYXRlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpKSwKICAgICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbihuYW1lKTsKICAgIH0KCiAgICBTdHJpbmcganNvbiA9CiAgICAgICAgYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkobGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSkucmVhZEFzU3RyaW5nKCk7CiAgICB0cnkgewogICAgICBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIHNwZWMgPQogICAgICAgICAgYXdhaXQgTGlicmFyaWVzU3BlY2lmaWNhdGlvbi5wYXJzZShsaWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpLCBqc29uKTsKICAgICAgcmV0dXJuIHNwZWMuc3BlY2lmaWNhdGlvbkZvcihuYW1lKTsKICAgIH0gb24gTGlicmFyaWVzU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uLndpdGhBcmd1bWVudHMoJyR7ZS5lcnJvcn0nKSwKICAgICAgICAgIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIG5ldyBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKG5hbWUpOwogICAgfQogIH0KCiAgLy8vIEdldCB0aGUgcGFja2FnZSBtYXAgd2hpY2ggbWFwcyBwYWNrYWdlIG5hbWVzIHRvIFVSSXMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIGdldHRlciBzaW5jZSBmaWxlIHN5c3RlbSBvcGVyYXRpb25zIG1heSBiZQogIC8vLyByZXF1aXJlZCB0byBsb2NhdGUvcmVhZCB0aGUgcGFja2FnZXMgZmlsZS4KICBGdXR1cmU8UGFja2FnZXM+IF9nZXRQYWNrYWdlcygpIGFzeW5jIHsKICAgIGlmIChfcGFja2FnZXMgIT0gbnVsbCkgcmV0dXJuIF9wYWNrYWdlczsKICAgIF9wYWNrYWdlc1VyaSA9IG51bGw7CiAgICBpZiAoX3Jhdy5wYWNrYWdlc0ZpbGVVcmkgIT0gbnVsbCkgewogICAgICByZXR1cm4gX3BhY2thZ2VzID0gYXdhaXQgY3JlYXRlUGFja2FnZXNGcm9tRmlsZShfcmF3LnBhY2thZ2VzRmlsZVVyaSk7CiAgICB9CgogICAgaWYgKGlucHV0cy5sZW5ndGggPiAxKSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNvbnNpZGVyIG5vdCByZXBvcnRpbmcgYW4gZXJyb3IgaWYgd2Ugd291bGQgaW5mZXIKICAgICAgLy8gdGhlIHNhbWUgLnBhY2thZ2VzIGZpbGUgZnJvbSBhbGwgb2YgdGhlIGlucHV0cy4KICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHMsIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIF9wYWNrYWdlcyA9IFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgICB9CgogICAgVXJpIGlucHV0ID0gaW5wdXRzLmZpcnN0OwoKICAgIC8vIFdoZW4gY29tcGlsaW5nIHRoZSBTREsgdGhlIGlucHV0IGZpbGVzIGFyZSBub3JtYWxseSBgZGFydDpgIFVSSXMuCiAgICBpZiAoaW5wdXQuc2NoZW1lID09ICdkYXJ0JykgcmV0dXJuIF9wYWNrYWdlcyA9IFBhY2thZ2VzLm5vUGFja2FnZXM7CgogICAgaWYgKGlucHV0LnNjaGVtZSA9PSAncGFja2FnZXMnKSB7CiAgICAgIHJlcG9ydCgKICAgICAgICAgIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICBpbnB1dCwgLTEsIG5vTGVuZ3RoKSwKICAgICAgICAgIFNldmVyaXR5LmVycm9yKTsKICAgICAgcmV0dXJuIF9wYWNrYWdlcyA9IFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgICB9CgogICAgcmV0dXJuIF9wYWNrYWdlcyA9IGF3YWl0IF9maW5kUGFja2FnZXMoaW5wdXRzLmZpcnN0KTsKICB9CgogIC8vLyBDcmVhdGUgYSBbUGFja2FnZXNdIGdpdmVuIHRoZSBVcmkgdG8gYSBgLnBhY2thZ2VzYCBmaWxlLgogIEZ1dHVyZTxQYWNrYWdlcz4gY3JlYXRlUGFja2FnZXNGcm9tRmlsZShVcmkgZmlsZSkgYXN5bmMgewogICAgTGlzdDxpbnQ+IGNvbnRlbnRzOwogICAgdHJ5IHsKICAgICAgLy8gVE9ETyhhaGUpOiBXZSBuZWVkIHRvIGNvbXB1dGUgbGluZSBlbmRpbmdzIGZvciB0aGlzIGZpbGUuCiAgICAgIGNvbnRlbnRzID0gYXdhaXQgZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoZmlsZSkucmVhZEFzQnl0ZXMoKTsKICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICByZXBvcnRXaXRob3V0TG9jYXRpb24oCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZS53aXRoQXJndW1lbnRzKGZpbGUsIGUubWVzc2FnZSksIFNldmVyaXR5LmVycm9yKTsKICAgIH0KICAgIGlmIChjb250ZW50cyAhPSBudWxsKSB7CiAgICAgIF9wYWNrYWdlc1VyaSA9IGZpbGU7CiAgICAgIHRyeSB7CiAgICAgICAgTWFwPFN0cmluZywgVXJpPiBtYXAgPQogICAgICAgICAgICBwYWNrYWdlX2NvbmZpZy5wYXJzZShjb250ZW50cywgZmlsZSwgYWxsb3dEZWZhdWx0UGFja2FnZTogdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5ldyBNYXBQYWNrYWdlcyhtYXApOwogICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIHJlcG9ydCgKICAgICAgICAgICAgdGVtcGxhdGVQYWNrYWdlc0ZpbGVGb3JtYXQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGUubWVzc2FnZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZmlsZSwgZS5vZmZzZXQsIG5vTGVuZ3RoKSwKICAgICAgICAgICAgU2V2ZXJpdHkuZXJyb3IpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZS53aXRoQXJndW1lbnRzKGZpbGUsICIkZSIpLCBTZXZlcml0eS5lcnJvcik7CiAgICAgIH0KICAgIH0KICAgIF9wYWNrYWdlc1VyaSA9IG51bGw7CiAgICByZXR1cm4gUGFja2FnZXMubm9QYWNrYWdlczsKICB9CgogIC8vLyBGaW5kcyBhIHBhY2thZ2UgcmVzb2x1dGlvbiBzdHJhdGVneSB1c2luZyBhIFtGaWxlU3lzdGVtXS4KICAvLy8KICAvLy8gVGhlIFtzY3JpcHRVcmldIHBvaW50cyB0byBhIERhcnQgc2NyaXB0IHdpdGggYSB2YWxpZCBzY2hlbWUgYWNjZXB0ZWQgYnkKICAvLy8gdGhlIFtGaWxlU3lzdGVtXS4KICAvLy8KICAvLy8gVGhpcyBmdW5jdGlvbiBmaXJzdCB0cmllcyB0byBsb2NhdGUgYSBgLnBhY2thZ2VzYCBmaWxlIGluIHRoZSBgc2NyaXB0VXJpYAogIC8vLyBkaXJlY3RvcnkuIElmIHRoYXQgaXMgbm90IGZvdW5kLCBpdCBzdGFydHMgY2hlY2tpbmcgcGFyZW50IGRpcmVjdG9yaWVzIGZvcgogIC8vLyBhIGAucGFja2FnZXNgIGZpbGUsIGFuZCBzdG9wcyBpZiBpdCBmaW5kcyBpdC4gT3RoZXJ3aXNlIGl0IGdpdmVzIHVwIGFuZAogIC8vLyByZXR1cm5zIFtQYWNrYWdlcy5ub1BhY2thZ2VzXS4KICAvLy8KICAvLy8gTm90ZTogdGhpcyBpcyBhIGZvcmsgZnJvbSBgcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9kaXNjb3ZlcnkuZGFydGAgdG8gYWRhcHQKICAvLy8gaXQgdG8gdXNlIFtGaWxlU3lzdGVtXS4gVGhlIGxvZ2ljIGhlcmUgaXMgYSBtaXggb2YgdGhlIGxvZ2ljIGluIHRoZQogIC8vLyBgZmluZFBhY2thZ2VzRnJvbUZpbGVgIGFuZCBgZmluZFBhY2thZ2VzRnJvbU5vbkZpbGVgOgogIC8vLwogIC8vLyAgICAqIExpa2UgYGZpbmRQYWNrYWdlc0Zyb21GaWxlYCByZXNvbHV0aW9uIHNlYXJjaGVzIGZvciBwYXJlbnQKICAvLy8gICAgZGlyZWN0b3JpZXMKICAvLy8KICAvLy8gICAgKiBVbmxpa2UgcGFja2FnZTpwYWNrYWdlX2NvbmZpZywgaXQgZG9lcyBub3QgbG9vayBmb3IgYSBgcGFja2FnZXMvYAogIC8vLyAgICBkaXJlY3RvcnksIGFzIHRoYXQgd29uJ3QgYmUgc3VwcG9ydGVkIGluIERhcnQgMi4KICBGdXR1cmU8UGFja2FnZXM+IF9maW5kUGFja2FnZXMoVXJpIHNjcmlwdFVyaSkgYXN5bmMgewogICAgVXJpIGRpciA9IHNjcmlwdFVyaS5yZXNvbHZlKCcuJyk7CiAgICBpZiAoIWRpci5pc0Fic29sdXRlKSB7CiAgICAgIHJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygiRXhwZWN0ZWQgaW5wdXQgVXJpIHRvIGJlIGFic29sdXRlOiAkc2NyaXB0VXJpLiIpLAogICAgICAgICAgU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKICAgICAgcmV0dXJuIFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgICB9CgogICAgRnV0dXJlPFVyaT4gY2hlY2tJbkRpcihVcmkgZGlyKSBhc3luYyB7CiAgICAgIFVyaSBjYW5kaWRhdGUgPSBkaXIucmVzb2x2ZSgnLnBhY2thZ2VzJyk7CiAgICAgIGlmIChhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaShjYW5kaWRhdGUpLmV4aXN0cygpKSByZXR1cm4gY2FuZGlkYXRlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBDaGVjayBmb3IgJGN3ZC8ucGFja2FnZXMKICAgIFVyaSBjYW5kaWRhdGUgPSBhd2FpdCBjaGVja0luRGlyKGRpcik7CiAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpIHJldHVybiBjcmVhdGVQYWNrYWdlc0Zyb21GaWxlKGNhbmRpZGF0ZSk7CgogICAgLy8gQ2hlY2sgZm9yIGN3ZCgvLi4pKy8ucGFja2FnZXMKICAgIFVyaSBwYXJlbnREaXIgPSBkaXIucmVzb2x2ZSgnLi4nKTsKICAgIHdoaWxlIChwYXJlbnREaXIucGF0aCAhPSBkaXIucGF0aCkgewogICAgICBjYW5kaWRhdGUgPSBhd2FpdCBjaGVja0luRGlyKHBhcmVudERpcik7CiAgICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCkgYnJlYWs7CiAgICAgIGRpciA9IHBhcmVudERpcjsKICAgICAgcGFyZW50RGlyID0gZGlyLnJlc29sdmUoJy4uJyk7CiAgICB9CgogICAgaWYgKGNhbmRpZGF0ZSAhPSBudWxsKSByZXR1cm4gY3JlYXRlUGFja2FnZXNGcm9tRmlsZShjYW5kaWRhdGUpOwogICAgcmV0dXJuIFBhY2thZ2VzLm5vUGFja2FnZXM7CiAgfQoKICBib29sIF9jb21wdXRlZFNka0RlZmF1bHRzID0gZmFsc2U7CgogIC8vLyBFbnN1cmUgW19zZGtSb290XSwgW19zZGtTdW1tYXJ5XSBhbmQgW19saWJyYXJ5U3BlY1VyaV0gYXJlIGluaXRpYWxpemVkLgogIC8vLwogIC8vLyBJZiB0aGV5IGFyZSBub3Qgc2V0IGV4cGxpY2l0bHksIHRoZXkgYXJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBkZWZhdWx0CiAgLy8vIGJlaGF2aW9yIGRlc2NyaWJlZCBpbiBbQ29tcGlsZXJPcHRpb25zXS4KICB2b2lkIF9lbnN1cmVTZGtEZWZhdWx0cygpIHsKICAgIGlmIChfY29tcHV0ZWRTZGtEZWZhdWx0cykgcmV0dXJuOwogICAgX2NvbXB1dGVkU2RrRGVmYXVsdHMgPSB0cnVlOwogICAgVXJpIHJvb3QgPSBfcmF3LnNka1Jvb3Q7CiAgICBpZiAocm9vdCAhPSBudWxsKSB7CiAgICAgIC8vIE5vcm1hbGl6ZSB0byBhbHdheXMgZW5kIGluICcvJwogICAgICBpZiAoIXJvb3QucGF0aC5lbmRzV2l0aCgnLycpKSB7CiAgICAgICAgcm9vdCA9IHJvb3QucmVwbGFjZShwYXRoOiByb290LnBhdGggKyAnLycpOwogICAgICB9CiAgICAgIF9zZGtSb290ID0gcm9vdDsKICAgIH0gZWxzZSBpZiAoY29tcGlsZVNkaykgewogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGltcGxlbWVudCB0aGUgYWxnb3JpdGhtIGZvciBmaW5kaW5nIHRoZSBTREsKICAgICAgLy8gYXV0b21hZ2ljYWxseS4KICAgICAgdW5pbXBsZW1lbnRlZCgnaW5mZXIgdGhlIGRlZmF1bHQgc2RrIGxvY2F0aW9uJywgLTEsIG51bGwpOwogICAgfQoKICAgIGlmIChfcmF3LnNka1N1bW1hcnkgIT0gbnVsbCkgewogICAgICBfc2RrU3VtbWFyeSA9IF9yYXcuc2RrU3VtbWFyeTsKICAgIH0gZWxzZSBpZiAoIWNvbXBpbGVTZGspIHsKICAgICAgLy8gSW5mZXIgYmFzZWQgb24gdGhlIHNka1Jvb3QsIGJ1dCBvbmx5IHdoZW4gYGNvbXBpbGVTZGtgIGlzIGZhbHNlLAogICAgICAvLyBvdGhlcndpc2UgdGhlIGRlZmF1bHQgaW50ZW50IHdhcyB0byBjb21waWxlIHRoZSBzZGsgZnJvbSBzb3VyY2VzIGFuZAogICAgICAvLyBub3QgdG8gbG9hZCBhbiBzZGsgc3VtbWFyeSBmaWxlLgogICAgICBfc2RrU3VtbWFyeSA9IHJvb3Q/LnJlc29sdmUoInZtX3BsYXRmb3JtX3N0cm9uZy5kaWxsIik7CiAgICB9CgogICAgaWYgKF9yYXcubGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaSAhPSBudWxsKSB7CiAgICAgIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gX3Jhdy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpOwogICAgfSBlbHNlIGlmIChjb21waWxlU2RrKSB7CiAgICAgIF9saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpID0gc2RrUm9vdC5yZXNvbHZlKCdsaWIvbGlicmFyaWVzLmpzb24nKTsKICAgIH0KICB9CgogIC8vLyBDcmVhdGUgYSBbRmlsZVN5c3RlbV0gc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucy4KICBGaWxlU3lzdGVtIF9jcmVhdGVGaWxlU3lzdGVtKCkgewogICAgcmV0dXJuIF9yYXcuZmlsZVN5c3RlbTsKICB9CgogIFN0cmluZyBkZWJ1Z1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHdyaXRlTGlzdChTdHJpbmcgbmFtZSwgTGlzdCBlbGVtZW50cykgewogICAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSkgewogICAgICAgIHNiLndyaXRlbG4oJyRuYW1lOiA8ZW1wdHk+Jyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHNiLndyaXRlbG4oJyRuYW1lOicpOwogICAgICBlbGVtZW50cy5mb3JFYWNoKChzKSB7CiAgICAgICAgc2Iud3JpdGVsbignICAtICRzJyk7CiAgICAgIH0pOwogICAgfQoKICAgIHNiLndyaXRlbG4oJ0lucHV0czogJHtpbnB1dHN9Jyk7CiAgICBzYi53cml0ZWxuKCdPdXRwdXQ6ICR7b3V0cHV0fScpOwoKICAgIHNiLndyaXRlbG4oJ1dhcyBkaWFnbm9zdGljIG1lc3NhZ2UgaGFuZGxlciBwcm92aWRlZDogJwogICAgICAgICcke19yYXcub25EaWFnbm9zdGljID09IG51bGwgPyAibm8iIDogInllcyJ9Jyk7CgogICAgc2Iud3JpdGVsbignRmlsZVN5c3RlbTogJHtfZmlsZVN5c3RlbS5ydW50aW1lVHlwZX0gJwogICAgICAgICcocHJvdmlkZWQ6ICR7X3Jhdy5maWxlU3lzdGVtLnJ1bnRpbWVUeXBlfSknKTsKCiAgICB3cml0ZUxpc3QoJ0lucHV0IFN1bW1hcmllcycsIF9yYXcuaW5wdXRTdW1tYXJpZXMpOwogICAgd3JpdGVMaXN0KCdMaW5rZWQgRGVwZW5kZW5jaWVzJywgX3Jhdy5saW5rZWREZXBlbmRlbmNpZXMpOwoKICAgIHNiLndyaXRlbG4oJ1BhY2thZ2VzIHVyaTogJHtfcmF3LnBhY2thZ2VzRmlsZVVyaX0nKTsKICAgIHNiLndyaXRlbG4oJ1BhY2thZ2VzOiAke19wYWNrYWdlc30nKTsKCiAgICBzYi53cml0ZWxuKCdDb21waWxlIFNESzogJHtjb21waWxlU2RrfScpOwogICAgc2Iud3JpdGVsbignU0RLIHJvb3Q6ICR7X3Nka1Jvb3R9IChwcm92aWRlZDogJHtfcmF3LnNka1Jvb3R9KScpOwogICAgc2Iud3JpdGVsbignU0RLIHNwZWNpZmljYXRpb246ICR7X2xpYnJhcmllc1NwZWNpZmljYXRpb25Vcml9ICcKICAgICAgICAnKHByb3ZpZGVkOiAke19yYXcubGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaX0pJyk7CiAgICBzYi53cml0ZWxuKCdTREsgc3VtbWFyeTogJHtfc2RrU3VtbWFyeX0gKHByb3ZpZGVkOiAke19yYXcuc2RrU3VtbWFyeX0pJyk7CgogICAgc2Iud3JpdGVsbignVGFyZ2V0OiAke190YXJnZXQ/Lm5hbWV9IChwcm92aWRlZDogJHtfcmF3LnRhcmdldD8ubmFtZX0pJyk7CgogICAgc2Iud3JpdGVsbigndGhyb3dPbkVycm9yc0ZvckRlYnVnZ2luZzogJHt0aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nfScpOwogICAgc2Iud3JpdGVsbigndGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nOiAke3Rocm93T25XYXJuaW5nc0ZvckRlYnVnZ2luZ30nKTsKICAgIHNiLndyaXRlbG4oJ2V4aXQgb24gcHJvYmxlbTogJHtzZXRFeGl0Q29kZU9uUHJvYmxlbX0nKTsKICAgIHNiLndyaXRlbG4oJ0VtYmVkIHNvdXJjZXM6ICR7ZW1iZWRTb3VyY2VUZXh0fScpOwogICAgc2Iud3JpdGVsbignZGVidWdEdW1wOiAke2RlYnVnRHVtcH0nKTsKICAgIHNiLndyaXRlbG4oJ3ZlcmJvc2U6ICR7dmVyYm9zZX0nKTsKICAgIHNiLndyaXRlbG4oJ3ZlcmlmeTogJHt2ZXJpZnl9Jyk7CiAgICByZXR1cm4gJyRzYic7CiAgfQoKICBGdXR1cmU8TGlzdDxpbnQ+PiBfcmVhZEFzQnl0ZXMoRmlsZVN5c3RlbUVudGl0eSBmaWxlKSBhc3luYyB7CiAgICB0cnkgewogICAgICByZXR1cm4gYXdhaXQgZmlsZS5yZWFkQXNCeXRlcygpOwogICAgfSBvbiBGaWxlU3lzdGVtRXhjZXB0aW9uIGNhdGNoIChlcnJvcikgewogICAgICByZXBvcnQoCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRSZWFkRmlsZQogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGVycm9yLnVyaSwgZXJyb3IubWVzc2FnZSkKICAgICAgICAgICAgICAud2l0aG91dExvY2F0aW9uKCksCiAgICAgICAgICBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBuZXcgVWludDhMaXN0KDApOwogICAgfQogIH0KfQoKLy8vIEEgW0ZpbGVTeXN0ZW1dIHRoYXQgb25seSBhbGxvd3MgYWNjZXNzIHRvIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkKLy8vIHdoaXRlbGlzdGVkLgpjbGFzcyBIZXJtZXRpY0ZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtIHsKICBmaW5hbCBTZXQ8VXJpPiBpbmNsdWRlZEZpbGVzOwogIGZpbmFsIEZpbGVTeXN0ZW0gX3JlYWxGaWxlU3lzdGVtOwoKICBIZXJtZXRpY0ZpbGVTeXN0ZW0odGhpcy5pbmNsdWRlZEZpbGVzLCB0aGlzLl9yZWFsRmlsZVN5c3RlbSk7CgogIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5Rm9yVXJpKFVyaSB1cmkpIHsKICAgIGlmIChpbmNsdWRlZEZpbGVzLmNvbnRhaW5zKHVyaSkpIHJldHVybiBfcmVhbEZpbGVTeXN0ZW0uZW50aXR5Rm9yVXJpKHVyaSk7CiAgICB0aHJvdyBuZXcgSGVybWV0aWNBY2Nlc3NFeGNlcHRpb24odXJpKTsKICB9Cn0KCmNsYXNzIEhlcm1ldGljQWNjZXNzRXhjZXB0aW9uIGV4dGVuZHMgRmlsZVN5c3RlbUV4Y2VwdGlvbiB7CiAgSGVybWV0aWNBY2Nlc3NFeGNlcHRpb24oVXJpIHVyaSkKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAnSW52YWxpZCBhY2Nlc3MgdG8gJHVyaTogJwogICAgICAgICAgICAndGhlIGZpbGUgaXMgYWNjZXNzZWQgaW4gYSBtb2R1bGFyIGhlcm1ldGljIGJ1aWxkLCAnCiAgICAgICAgICAgICdidXQgaXQgd2FzIG5vdCBleHBsaWNpdGx5IGxpc3RlZCBhcyBhbiBpbnB1dC4nKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbWVzc2FnZTsKfQqCzQBOTjwBIAEhASkBTwFIAU0BLCoBPQFGAUkBMC0BMk8BKzwBNiEBSQE+ASMJGhgRMDBDHRIsHhwjLCQhKiQBMgFAASsBOgEmCSApJgE5BERHSE4TBEpQTUstGTgeAVEdFgFPSBQnAUgxIAE+BkxNTisiATwGTE1QKy0BTw8nAVALEBQaFQQBExcaGAQBHgEwMiQrRDQGHQQBIiYaJwQBEQEyASQBIgEoAS4BPgE0AUgBTAE4ATIBMRoBNhQBMAFKATogAU9NNilJP1E2SAEbUSUbSBdOLTFFMUoIBkM9BAE5KDs/OwZAFAZBOjw7EAgnIUEXDx5MCAYEATxGBAFFLAQBRkMxBAFKSEknATFCFAYBIDwdSxQGAR5PHU4UBgEpHUUlFAYBMk0cPR9OFggGEQQBRhUqARoBSw1EAU8ONQEkJgFJQgFCSBA6ARIXRAE0Nyg3KCotBksEAUA+QygrNS8/CAYhBAE1KDoGJQQBSyY+TS0sRD00SiJMBiYEAUItSAYsBAFIPk8nMEQ9NEocTAYgBAFMQyoaRjM2HRwnQiMWBAFKBklJTBcdGAYiNi8wKzAqPwYbBAFOH0hDTAEtThgfLTsdCDUGARJRCiRPKjUdShs1BgQBPAZJMSotGShNBgEdSjkdQy4GAR4BSUgBJg4/JBsuBgE6BAE/PBgKQ0QpHVAGHBsMH00lJxAnKjkdFB9NCAYZIAQBQAZOGAZQUU4lBlFKPAZGFQZNOjgmGx0tUCUiBgEsME8TBgEgK0UBJScpLyQXJQYBRSAEASUBTgZNLx4mIR0YKCY0CBcdRhhBBgEjJR5KTio+BgEyQx1KBgQBPSMcBAEZKiweJhAIHB0eCgYBJSUBOzgBOTcBNz8BOSoBLkVDOk4BTQFLTzw1KyclEgQBQAonLQ4fNyIbHwYEAgFOETEgJAFAAStPLAQCATwjDxEnQT4BDCACATFwYWNrYWdlOmZyb250X2VuZC9zcmMvYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0aWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2NvbXB1dGVfcGxhdGZvcm1fYmluYXJpZXNfbG9jYXRpb24uZGFydI09Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDppbyIgc2hvdyBGaWxlLCBQbGF0Zm9ybTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgU291cmNlOwoKaW1wb3J0ICdiYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnQnIHNob3cgUHJvY2Vzc2VkT3B0aW9uczsKCmltcG9ydCAnZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCi8vLyBDb21wdXRlcyB0aGUgbG9jYXRpb24gb2YgcGxhdGZvcm0gYmluYXJpZXMsIHRoYXQgaXMsIGNvbXBpbGVkIGAuZGlsbGAgZmlsZXMKLy8vIG9mIHRoZSBwbGF0Zm9ybSBsaWJyYXJpZXMgdGhhdCBhcmUgdXNlZCB0byBhdm9pZCByZWNvbXBpbGluZyB0aG9zZQovLy8gbGlicmFyaWVzLgpVcmkgY29tcHV0ZVBsYXRmb3JtQmluYXJpZXNMb2NhdGlvbih7Ym9vbCBmb3JjZUJ1aWxkRGlyOiBmYWxzZX0pIHsKICBTdHJpbmcgcmVzb2x2ZWRFeGVjdXRhYmxlID0gUGxhdGZvcm0uZW52aXJvbm1lbnRbJ3Jlc29sdmVkRXhlY3V0YWJsZSddOwogIC8vIFRoZSBkaXJlY3Rvcnkgb2YgdGhlIERhcnQgVk0gZXhlY3V0YWJsZS4KICBVcmkgdm1EaXJlY3RvcnkgPSBVcmkuYmFzZQogICAgICAucmVzb2x2ZVVyaSgKICAgICAgICAgIG5ldyBVcmkuZmlsZShyZXNvbHZlZEV4ZWN1dGFibGUgPz8gUGxhdGZvcm0ucmVzb2x2ZWRFeGVjdXRhYmxlKSkKICAgICAgLnJlc29sdmUoIi4iKTsKICBpZiAodm1EaXJlY3RvcnkucGF0aC5lbmRzV2l0aCgiL2Jpbi8iKSkgewogICAgLy8gTG9va3MgbGlrZSB0aGUgVk0gaXMgaW4gYSBgL2Jpbi9gIGRpcmVjdG9yeSwgc28gdGhpcyBpcyBydW5uaW5nIGZyb20gYQogICAgLy8gYnVpbHQgU0RLLgogICAgcmV0dXJuIHZtRGlyZWN0b3J5LnJlc29sdmUoZm9yY2VCdWlsZERpciA/ICIuLi8uLi8iIDogIi4uL2xpYi9faW50ZXJuYWwvIik7CiAgfSBlbHNlIHsKICAgIC8vIFdlIGFzc3VtZSB0aGlzIGlzIHJ1bm5pbmcgZnJvbSBhIGJ1aWxkIGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUsCiAgICAvLyBgb3V0L1JlbGVhc2VYNjRgIG9yIGB4Y29kZWJ1aWxkL1JlbGVhc2VYNjRgKS4KICAgIHJldHVybiB2bURpcmVjdG9yeTsKICB9Cn0KCi8vLyBUcmFuc2xhdGVzIGFuIFNESyBVUkkgKCJvcmctZGFydGxhbmctc2RrOi8vLy4uLiIpIHRvIGEgZmlsZSBVUkkuClVyaSB0cmFuc2xhdGVTZGsoVXJpIHVyaSkgewogIGlmIChDb21waWxlckNvbnRleHQuaXNBY3RpdmUpIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICJvcmctZGFydGxhbmctc2RrIikgewogICAgICBTdHJpbmcgcGF0aCA9IHVyaS5wYXRoOwogICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvc2RrLyIpKSB7CiAgICAgICAgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgPSBDb21waWxlckNvbnRleHQuY3VycmVudDsKICAgICAgICBVcmkgc2RrUm9vdCA9IGNvbnRleHQuY2FjaGVkU2RrUm9vdDsKICAgICAgICBpZiAoc2RrUm9vdCA9PSBudWxsKSB7CiAgICAgICAgICBQcm9jZXNzZWRPcHRpb25zIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7CiAgICAgICAgICBzZGtSb290ID0gb3B0aW9ucy5zZGtSb290OwogICAgICAgICAgaWYgKHNka1Jvb3QgPT0gbnVsbCkgewogICAgICAgICAgICBzZGtSb290ID0gb3B0aW9ucy5saWJyYXJpZXNTcGVjaWZpY2F0aW9uVXJpPy5yZXNvbHZlKCIuLi8iKTsKICAgICAgICAgICAgaWYgKHNka1Jvb3QgIT0gbnVsbCkgewogICAgICAgICAgICAgIGlmICghaXNFeGlzdGluZ0ZpbGUoc2RrUm9vdC5yZXNvbHZlKCJsaWIvbGlicmFyaWVzLmpzb24iKSkpIHsKICAgICAgICAgICAgICAgIHNka1Jvb3QgPSBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNka1Jvb3QgPT0gbnVsbCkgewogICAgICAgICAgICBzZGtSb290ID0gKG9wdGlvbnMuc2RrU3VtbWFyeSA/PyBjb21wdXRlUGxhdGZvcm1CaW5hcmllc0xvY2F0aW9uKCkpCiAgICAgICAgICAgICAgICAucmVzb2x2ZSgiLi4vLi4vIik7CiAgICAgICAgICAgIGlmIChzZGtSb290ICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAoIWlzRXhpc3RpbmdGaWxlKHNka1Jvb3QucmVzb2x2ZSgibGliL2xpYnJhcmllcy5qc29uIikpKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNFeGlzdGluZ0ZpbGUoc2RrUm9vdC5yZXNvbHZlKCJzZGsvbGliL2xpYnJhcmllcy5qc29uIikpKSB7CiAgICAgICAgICAgICAgICAgIHNka1Jvb3QgPSBzZGtSb290LnJlc29sdmUoInNkay8iKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNka1Jvb3QgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc2RrUm9vdCA/Pz0gVXJpLnBhcnNlKCJvcmctZGFydGxhbmctc2RrOi8vL3Nkay8iKTsKICAgICAgICAgIGNvbnRleHQuY2FjaGVkU2RrUm9vdCA9IHNka1Jvb3Q7CiAgICAgICAgfQogICAgICAgIFVyaSBjYW5kaWRhdGUgPSBzZGtSb290LnJlc29sdmUocGF0aC5zdWJzdHJpbmcoNSkpOwogICAgICAgIGlmIChpc0V4aXN0aW5nRmlsZShjYW5kaWRhdGUpKSB7CiAgICAgICAgICBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2U7CiAgICAgICAgICBTb3VyY2Ugc291cmNlID0gdXJpVG9Tb3VyY2VbdXJpXTsKICAgICAgICAgIGlmIChzb3VyY2Uuc291cmNlLmlzRW1wdHkpIHsKICAgICAgICAgICAgdXJpVG9Tb3VyY2VbdXJpXSA9IG5ldyBTb3VyY2UoCiAgICAgICAgICAgICAgICBzb3VyY2UubGluZVN0YXJ0cywKICAgICAgICAgICAgICAgIG5ldyBGaWxlLmZyb21VcmkoY2FuZGlkYXRlKS5yZWFkQXNCeXRlc1N5bmMoKSwKICAgICAgICAgICAgICAgIHNvdXJjZS5pbXBvcnRVcmksCiAgICAgICAgICAgICAgICBzb3VyY2UuZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYW5kaWRhdGU7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHVyaTsKfQoKYm9vbCBpc0V4aXN0aW5nRmlsZShVcmkgdXJpKSB7CiAgaWYgKHVyaS5zY2hlbWUgPT0gImZpbGUiKSB7CiAgICByZXR1cm4gbmV3IEZpbGUuZnJvbVVyaSh1cmkpLmV4aXN0c1N5bmMoKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpgAE5OPAEmAS4BPAE7AVBHD0NKLh0TSxUsThJQC0Y1GAQCAUUcIiweJjstHzYlIUkjTCAQDgwhUCQjTFE1GSISEA4MPSsKPClOLCcrIz8iIQwKGggGBA4CAR8eLwsSBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9jb21wdXRlX3BsYXRmb3JtX2JpbmFyaWVzX2xvY2F0aW9uLmRhcnRdZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0lF0vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jb21waWxlcl9jb250ZXh0OwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZSwgWm9uZSwgcnVuWm9uZWQ7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy91dGlsL2NvbG9ycy5kYXJ0JyBhcyBjb2xvcnM7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbl9pbXBsLmRhcnQnCiAgICBzaG93IFN0cmluZ1Rva2VuOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBTb3VyY2U7CgppbXBvcnQgJy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBGaWxlU3lzdGVtOwoKaW1wb3J0ICcuLi9iYXNlL3Byb2Nlc3NlZF9vcHRpb25zLmRhcnQnIHNob3cgUHJvY2Vzc2VkT3B0aW9uczsKCmltcG9ydCAnY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0JyBhcyBjb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZSwgbWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0OwoKZmluYWwgT2JqZWN0IGNvbXBpbGVyQ29udGV4dEtleSA9IG5ldyBPYmplY3QoKTsKCi8vLyBTaGFyZWQgY29udGV4dCB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBpbGVyLgovLy8KLy8vIFRoZSBjb21waWxlciB3b3JrcyB3aXRoIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIFRvIGF2b2lkCi8vLyBwYXNzaW5nIGl0IGFyb3VuZCBhcyBhbiBhcmd1bWVudCBldmVyeXdoZXJlLCBpdCBpcyBzdG9yZWQgYXMgYSB6b25lLXZhbHVlLgovLy8KLy8vIEZvciBjb252ZW5pZW5jZSB0aGUgc3RhdGljIGdldHRlciBbQ29tcGlsZXJDb250ZXh0LmN1cnJlbnRdIHJldHJpZXZlcyB0aGUKLy8vIGNvbnRleHQgc3RvcmVkIGluIHRoZSBjdXJyZW50IHpvbmUuCmNsYXNzIENvbXBpbGVyQ29udGV4dCB7CiAgLy8gVE9ETyhzaWdtdW5kKTogTW92ZSBoZXJlIGFueSBtZXRob2QgaW4gUHJvY2Vzc2VkT3B0aW9ucyB0aGF0IGRvZXNuJ3Qgc2VlbQogIC8vIGFwcHJvcHJpYXRlIGFzIGFuICJvcHRpb24iLCBvciBjb25zaWRlciBtZXJnaW5nIFByb2Nlc3NlZE9wdGlvbnMgZW50aXJlbHkKICAvLyB3aXRoaW4gdGhpcyBjbGFzcywgYW5kIGRlcGVuZCBvbmx5IG9uIHRoZSByYXcgb3B0aW9ucyBoZXJlLgogIGZpbmFsIFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9uczsKCiAgLy8vIFNvdXJjZXMgc2VlbiBieSB0aGUgY29tcGlsZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgcG9wdWxhdGVkIGFzIHRoZSBjb21waWxlciByZWFkcyBmaWxlcywgYW5kIGl0IGlzIHVzZWQgZm9yIGVycm9yCiAgLy8vIHJlcG9ydGluZyBhbmQgdG8gZ2VuZXJhdGUgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlZAogIC8vLyBwcm9ncmFtcy4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gPFVyaSwgU291cmNlPnt9OwoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzLgogIGZpbmFsIExpc3Q8T2JqZWN0PiBlcnJvcnMgPSA8T2JqZWN0PltdOwoKICBmaW5hbCBMaXN0PFVyaT4gZGVwZW5kZW5jaWVzID0gPFVyaT5bXTsKCiAgRmlsZVN5c3RlbSBnZXQgZmlsZVN5c3RlbSA9PiBvcHRpb25zLmZpbGVTeXN0ZW07CgogIFVyaSBjYWNoZWRTZGtSb290ID0gbnVsbDsKCiAgYm9vbCBjb21waWxpbmdQbGF0Zm9ybSA9IGZhbHNlOwoKICBDb21waWxlckNvbnRleHQodGhpcy5vcHRpb25zKSB7CiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7CiAgICAgIGNvbG9ycy5wcmludEVuYWJsZUNvbG9yc1JlYXNvbiA9IHByaW50OwogICAgfQogIH0KCiAgLy8vIFJlcG9ydCBbbWVzc2FnZV0sIGZvciBleGFtcGxlLCBieSBwcmludGluZyBpdC4KICB2b2lkIHJlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLCBTZXZlcml0eSBzZXZlcml0eSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBvcHRpb25zLnJlcG9ydChtZXNzYWdlLCBzZXZlcml0eSwgY29udGV4dDogY29udGV4dCk7CiAgfQoKICAvLy8gUmVwb3J0IFttZXNzYWdlXSwgZm9yIGV4YW1wbGUsIGJ5IHByaW50aW5nIGl0LgogIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIHRoaXMgYW5kIGRpcmVjdCBjYWxsZXJzIGRpcmVjdGx5IHRvIHJlcG9ydC4KICB2b2lkIHJlcG9ydFdpdGhvdXRMb2NhdGlvbihNZXNzYWdlIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICBvcHRpb25zLnJlcG9ydFdpdGhvdXRMb2NhdGlvbihtZXNzYWdlLCBzZXZlcml0eSk7CiAgfQoKICAvLy8gRm9ybWF0IFttZXNzYWdlXSBhcyBhIHRleHQgc3RyaW5nIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGdlbmVyYXRlZCBjb2RlLgogIFN0cmluZyBmb3JtYXQoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICAgIHJldHVybiBjb21tYW5kX2xpbmVfcmVwb3J0aW5nLmZvcm1hdChtZXNzYWdlLCBzZXZlcml0eSk7CiAgfQoKICAvLy8gRm9ybWF0IFttZXNzYWdlXSBhcyBhIHRleHQgc3RyaW5nIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGdlbmVyYXRlZCBjb2RlLgogIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIHRoaXMgYW5kIGRpcmVjdCBjYWxsZXJzIGRpcmVjdGx5IHRvIGZvcm1hdC4KICBTdHJpbmcgZm9ybWF0V2l0aG91dExvY2F0aW9uKE1lc3NhZ2UgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICAgIHJldHVybiBjb21tYW5kX2xpbmVfcmVwb3J0aW5nLmZvcm1hdChtZXNzYWdlLndpdGhvdXRMb2NhdGlvbigpLCBzZXZlcml0eSk7CiAgfQoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzLgogIHZvaWQgbG9nRXJyb3IoT2JqZWN0IG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICBlcnJvcnMuYWRkKG1lc3NhZ2UpOwogICAgZXJyb3JzLmFkZChzZXZlcml0eSk7CiAgfQoKICBzdGF0aWMgdm9pZCByZWNvcmREZXBlbmRlbmN5KFVyaSB1cmkpIHsKICAgIGlmICh1cmkuc2NoZW1lICE9ICJmaWxlIiAmJiB1cmkuc2NoZW1lICE9ICJodHRwIikgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRXhwZWN0ZWQgYSBmaWxlIG9yIGh0dHAgVVJJLCBidXQgZ290OiAnJHVyaScuIik7CiAgICB9CiAgICBDb21waWxlckNvbnRleHQgY29udGV4dCA9IFpvbmUuY3VycmVudFtjb21waWxlckNvbnRleHRLZXldOwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICBjb250ZXh0LmRlcGVuZGVuY2llcy5hZGQodXJpKTsKICAgIH0KICB9CgogIHN0YXRpYyBDb21waWxlckNvbnRleHQgZ2V0IGN1cnJlbnQgewogICAgQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgPSBab25lLmN1cnJlbnRbY29tcGlsZXJDb250ZXh0S2V5XTsKICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKICAgICAgLy8gTm90ZTogd2UgdGhyb3cgZGlyZWN0bHkgYW5kIGRvbid0IHVzZSBpbnRlcm5hbFByb2JsZW0sIGJlY2F1c2UKICAgICAgLy8gaW50ZXJuYWxQcm9ibGVtIGRlcGVuZHMgb24gaGF2aW5nIGEgY29tcGlsZXIgY29udGV4dCBhdmFpbGFibGUuCiAgICAgIFN0cmluZyBtZXNzYWdlID0gbWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0Lm1lc3NhZ2U7CiAgICAgIFN0cmluZyB0aXAgPSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQudGlwOwogICAgICB0aHJvdyAiSW50ZXJuYWwgcHJvYmxlbTogJG1lc3NhZ2VcblRpcDogJHRpcCI7CiAgICB9CiAgICByZXR1cm4gY29udGV4dDsKICB9CgogIHN0YXRpYyBib29sIGdldCBpc0FjdGl2ZSA9PiBab25lLmN1cnJlbnRbY29tcGlsZXJDb250ZXh0S2V5XSAhPSBudWxsOwoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBpbiBhIFtab25lXSB3aGVyZSBbdGhpc10gd2lsbCBiZSBhdmFpbGFibGUgYXMKICAvLy8gYENvbXBpbGVyQ29udGV4dC5jdXJyZW50YC4KICBGdXR1cmU8VD4gcnVuSW5Db250ZXh0PFQ+KEZ1dHVyZTxUPiBhY3Rpb24oQ29tcGlsZXJDb250ZXh0IGMpKSB7CiAgICByZXR1cm4gcnVuWm9uZWQoCiAgICAgICAgKCkgPT4gbmV3IEZ1dHVyZTxUPi5zeW5jKCgpID0+IGFjdGlvbih0aGlzKSkud2hlbkNvbXBsZXRlKGNsZWFyKSwKICAgICAgICB6b25lVmFsdWVzOiB7Y29tcGlsZXJDb250ZXh0S2V5OiB0aGlzfSk7CiAgfQoKICAvLy8gUGVyZm9ybSBbYWN0aW9uXSBpbiBhIFtab25lXSB3aGVyZSBbb3B0aW9uc10gd2lsbCBiZSBhdmFpbGFibGUgYXMKICAvLy8gYENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnNgLgogIHN0YXRpYyBGdXR1cmU8VD4gcnVuV2l0aE9wdGlvbnM8VD4oCiAgICAgIFByb2Nlc3NlZE9wdGlvbnMgb3B0aW9ucywgRnV0dXJlPFQ+IGFjdGlvbihDb21waWxlckNvbnRleHQgYyksCiAgICAgIHtib29sIGVycm9yT25NaXNzaW5nSW5wdXQ6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IENvbXBpbGVyQ29udGV4dChvcHRpb25zKQogICAgICAgIC5ydW5JbkNvbnRleHQ8VD4oKENvbXBpbGVyQ29udGV4dCBjKSBhc3luYyB7CiAgICAgIGF3YWl0IG9wdGlvbnMudmFsaWRhdGVPcHRpb25zKGVycm9yT25NaXNzaW5nSW5wdXQ6IGVycm9yT25NaXNzaW5nSW5wdXQpOwogICAgICByZXR1cm4gYWN0aW9uKGMpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFQ+IHJ1bldpdGhEZWZhdWx0T3B0aW9uczxUPigKICAgICAgRnV0dXJlPFQ+IGFjdGlvbihDb21waWxlckNvbnRleHQgYykpIHsKICAgIHJldHVybiBuZXcgQ29tcGlsZXJDb250ZXh0KG5ldyBQcm9jZXNzZWRPcHRpb25zKCkpLnJ1bkluQ29udGV4dDxUPihhY3Rpb24pOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIFN0cmluZ1Rva2VuLmNhbm9uaWNhbGl6ZXIuY2xlYXIoKTsKICAgIGVycm9ycy5jbGVhcigpOwogICAgZGVwZW5kZW5jaWVzLmNsZWFyKCk7CiAgfQp9CoCXAE5OPAEgATEBTwFFAUEWAS4BPAE/AUABGkgBMAExBEZPBE4oGE9PQSIBJAZOTBA4AR0qASoBMwEcASIBIhsuBgQBNTkoOQQBNUZDNgQBUD09BAFQRkVPBAEdNRkaBAEqOFAGQBslBgQBJ0AbSElFPTUGFAQBSAFFIUMVSjEEAUgpJkUqKDVPGAgEAS0tUAQBEScUGgQCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0WGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnSC5S8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvZGVzOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL2NvZGVzLmRhcnQnCiAgICBoaWRlIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBDb25zdGFudCwgRGFydFR5cGUsIGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWU7CgppbXBvcnQgJ2tlcm5lbC90eXBlX2xhYmVsZXIuZGFydCc7CgpleHBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvY29kZXMuZGFydCcKICAgIGhpZGUgZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZTsKCmV4cG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0JzsKCnBhcnQgJ2Zhc3RhX2NvZGVzX2NmZV9nZW5lcmF0ZWQuZGFydCc7ChgATk48ARUBPScBQQEhOwEjAT0nAUEBJwEscGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnRmZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZmFzdGFfY29kZXNfY2ZlX2dlbmVyYXRlZC5kYXJ0wAInfi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBOT1RFOiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBETyBOT1QgRURJVC4KLy8KLy8gSW5zdGVhZCBtb2RpZnkgJ3BrZy9mcm9udF9lbmQvbWVzc2FnZXMueWFtbCcgYW5kIHJ1bgovLyAncGtnL2Zyb250X2VuZC90b29sL2Zhc3RhIGdlbmVyYXRlLW1lc3NhZ2VzJyB0byB1cGRhdGUuCgovLyBpZ25vcmVfZm9yX2ZpbGU6IGxpbmVzX2xvbmdlcl90aGFuXzgwX2NoYXJzCgpwYXJ0IG9mIGZhc3RhLmNvZGVzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVBbWJpZ3VvdXNTdXBlcnR5cGVzID0KICAgIGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBjYW4ndCBpbXBsZW1lbnQgYm90aCAnI3R5cGUnIGFuZCAnI3R5cGUyJyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0FtYmlndW91c1N1cGVydHlwZXMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiBjb2RlQW1iaWd1b3VzU3VwZXJ0eXBlcyA9CiAgICBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkFtYmlndW91c1N1cGVydHlwZXMiLCB0ZW1wbGF0ZUFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFNQklHVU9VU19TVVBFUlRZUEVTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0FtYmlndW91c1N1cGVydHlwZXMoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQW1iaWd1b3VzU3VwZXJ0eXBlcywKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGNhbid0IGltcGxlbWVudCBib3RoICcke3R5cGV9JyBhbmQgJyR7dHlwZTJ9JyIiIiArCiAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgYXJndW1lbnQgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlIiwgdGVtcGxhdGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJBUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0FyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgYXJndW1lbnQgdHlwZSAnJHt0eXBlfScgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBlbGVtZW50ICcjY29uc3RhbnQnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50ID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50IiwgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFUVVBTF9FTEVNRU5UU19JTl9DT05TVF9TRVQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCgKICAgIENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBlbGVtZW50ICcke2NvbnN0YW50fScgY29uZmxpY3RzIHdpdGggYW5vdGhlciBleGlzdGluZyBlbGVtZW50IGluIHRoZSBzZXQuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnY29uc3RhbnQnOiBfY29uc3RhbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIGtleSAnI2NvbnN0YW50JyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGtleSBpbiB0aGUgbWFwLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUtleSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUNvbnN0RXZhbER1cGxpY2F0ZUtleSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiQ29uc3RFdmFsRHVwbGljYXRlS2V5IiwgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVLZXksCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVRVUFMX0tFWVNfSU5fQ09OU1RfTUFQIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUtleSgKICAgIENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRHVwbGljYXRlS2V5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGtleSAnJHtjb25zdGFudH0nIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3Rpbmcga2V5IGluIHRoZSBtYXAuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnY29uc3RhbnQnOiBfY29uc3RhbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBlbGVtZW50ICcjY29uc3RhbnQnIGRvZXMgbm90IGhhdmUgYSBwcmltaXRpdmUgb3BlcmF0b3IgJz09Jy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9TRVRfRUxFTUVOVF9UWVBFX0lNUExFTUVOVFNfRVFVQUxTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwoCiAgICBDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWwsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgZWxlbWVudCAnJHtjb25zdGFudH0nIGRvZXMgbm90IGhhdmUgYSBwcmltaXRpdmUgb3BlcmF0b3IgJz09Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgdHlwZSAnI3R5cGUnIGlzIG5vdCBhIGNvbnN0YW50IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHR5cGUgcGFyYW1ldGVyLCBvbmx5IGluc3RhbnRpYXRlZCB0eXBlcyBhcmUgYWxsb3dlZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIiLAogIHRlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIoCiAgICBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEZyZWVUeXBlUGFyYW1ldGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBhIGNvbnN0YW50IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHR5cGUgcGFyYW1ldGVyLCBvbmx5IGluc3RhbnRpYXRlZCB0eXBlcyBhcmUgYWxsb3dlZC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkJpbmFyeSBvcGVyYXRvciAnI3N0cmluZycgb24gJyNjb25zdGFudCcgcmVxdWlyZXMgb3BlcmFuZCBvZiB0eXBlICcjdHlwZScsIGJ1dCB3YXMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlIiwKICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUoCiAgICBTdHJpbmcgc3RyaW5nLAogICAgQ29uc3RhbnQgX2NvbnN0YW50LAogICAgRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJCaW5hcnkgb3BlcmF0b3IgJyR7c3RyaW5nfScgb24gJyR7Y29uc3RhbnR9JyByZXF1aXJlcyBvcGVyYW5kIG9mIHR5cGUgJyR7dHlwZX0nLCBidXQgd2FzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICdzdHJpbmcnOiBzdHJpbmcsCiAgICAgICAgJ2NvbnN0YW50JzogX2NvbnN0YW50LAogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICc9PScgcmVxdWlyZXMgcmVjZWl2ZXIgY29uc3RhbnQgJyNjb25zdGFudCcgb2YgdHlwZSAnTnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJywgYnV0IHdhcyBvZiB0eXBlICcjdHlwZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGUiLAogIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSgKICAgIENvbnN0YW50IF9jb25zdGFudCwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJpbmFyeSBvcGVyYXRvciAnPT0nIHJlcXVpcmVzIHJlY2VpdmVyIGNvbnN0YW50ICcke2NvbnN0YW50fScgb2YgdHlwZSAnTnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJywgYnV0IHdhcyBvZiB0eXBlICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudCwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LAogICAgICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIG1ldGhvZCAnI3N0cmluZycgY2FuJ3QgYmUgaW52b2tlZCBvbiAnI2NvbnN0YW50JyBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24gPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCwKICAgICAgICAgICAgICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX09QRVJBVE9SIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uKAogICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtzdHJpbmd9JyBjYW4ndCBiZSBpbnZva2VkIG9uICcke2NvbnN0YW50fScgaW4gYSBjb25zdGFudCBleHByZXNzaW9uLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ2NvbnN0YW50JzogX2NvbnN0YW50fSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LAogICAgICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIHByb3BlcnR5ICcjc3RyaW5nJyBjYW4ndCBiZSBhY2Nlc3NlZCBvbiAnI2NvbnN0YW50JyBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LAogICAgICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCIsIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9FVkFMX1RIUk9XU19FWENFUFRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0KAogICAgU3RyaW5nIHN0cmluZywgQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBwcm9wZXJ0eSAnJHtzdHJpbmd9JyBjYW4ndCBiZSBhY2Nlc3NlZCBvbiAnJHtjb25zdGFudH0nIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgY29uc3RhbnQgdmFsdWUgJyNjb25zdGFudCcgY2FuJ3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGEgc3RyaW5nIGludGVycG9sYXRpb24gaW4gYSBjb25zdGFudCBleHByZXNzaW9uLgpPbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kIiwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9UWVBFX0JPT0xfTlVNX1NUUklORyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQoCiAgICBDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IGNvbnN0YW50UGFydHMgPSBsYWJlbGVyLmxhYmVsQ29uc3RhbnQoX2NvbnN0YW50KTsKICBTdHJpbmcgY29uc3RhbnQgPSBjb25zdGFudFBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBjb25zdGFudCB2YWx1ZSAnJHtjb25zdGFudH0nIGNhbid0IGJlIHVzZWQgYXMgcGFydCBvZiBhIHN0cmluZyBpbnRlcnBvbGF0aW9uIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KT25seSB2YWx1ZXMgb2YgdHlwZSAnbnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJyBjYW4gYmUgdXNlZC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBzeW1ib2wgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcHVibGljIERhcnQgbWVtYmVyIG5hbWUsIHB1YmxpYyBjb25zdHJ1Y3RvciBuYW1lLCBvciBsaWJyYXJ5IG5hbWUsIG9wdGlvbmFsbHkgcXVhbGlmaWVkLCBidXQgd2FzICcjY29uc3RhbnQnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lIiwgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lKAogICAgQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzeW1ib2wgbmFtZSBtdXN0IGJlIGEgdmFsaWQgcHVibGljIERhcnQgbWVtYmVyIG5hbWUsIHB1YmxpYyBjb25zdHJ1Y3RvciBuYW1lLCBvciBsaWJyYXJ5IG5hbWUsIG9wdGlvbmFsbHkgcXVhbGlmaWVkLCBidXQgd2FzICcke2NvbnN0YW50fScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnY29uc3RhbnQnOiBfY29uc3RhbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIENvbnN0YW50IF9jb25zdGFudCwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRXhwZWN0ZWQgY29uc3RhbnQgJyNjb25zdGFudCcgdG8gYmUgb2YgdHlwZSAnI3R5cGUnLCBidXQgd2FzIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gY29kZUNvbnN0RXZhbEludmFsaWRUeXBlID0gY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJDb25zdEV2YWxJbnZhbGlkVHlwZSIsCiAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkVHlwZShDb25zdGFudCBfY29uc3RhbnQsIERhcnRUeXBlIF90eXBlLAogICAgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiBjb25zdGFudFBhcnRzID0gbGFiZWxlci5sYWJlbENvbnN0YW50KF9jb25zdGFudCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIGNvbnN0YW50ID0gY29uc3RhbnRQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZFR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJFeHBlY3RlZCBjb25zdGFudCAnJHtjb25zdGFudH0nIHRvIGJlIG9mIHR5cGUgJyR7dHlwZX0nLCBidXQgd2FzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudCwgJ3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihDb25zdGFudCBfY29uc3RhbnQsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBrZXkgJyNjb25zdGFudCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oQ29uc3RhbnQgX2NvbnN0YW50LCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsIiwgdGVtcGxhdGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWwsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bCiAgICAgICJDT05TVF9NQVBfS0VZX0VYUFJFU1NJT05fVFlQRV9JTVBMRU1FTlRTX0VRVUFMUyIKICAgIF0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCgKICAgIENvbnN0YW50IF9jb25zdGFudCwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gY29uc3RhbnRQYXJ0cyA9IGxhYmVsZXIubGFiZWxDb25zdGFudChfY29uc3RhbnQpOwogIFN0cmluZyBjb25zdGFudCA9IGNvbnN0YW50UGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGtleSAnJHtjb25zdGFudH0nIGRvZXMgbm90IGhhdmUgYSBwcmltaXRpdmUgb3BlcmF0b3IgJz09Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeydjb25zdGFudCc6IF9jb25zdGFudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHR5cGUgJyN0eXBlJyBpcyBkZWZlcnJlZCBsb2FkZWQgdmlhIHByZWZpeCAnI25hbWUnIGFuZCBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBhbm5vdGF0aW9uLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyNuYW1lJyBvciB1c2UgYSBzdXBlcnR5cGUgb2YgJyN0eXBlJyB0aGF0IGlzbid0IGRlZmVycmVkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRGVmZXJyZWRUeXBlQW5ub3RhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkRlZmVycmVkVHlwZUFubm90YXRpb24iLCB0ZW1wbGF0ZURlZmVycmVkVHlwZUFubm90YXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQU5OT1RBVElPTl9ERUZFUlJFRF9DTEFTUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEZWZlcnJlZFR5cGVBbm5vdGF0aW9uKAogICAgRGFydFR5cGUgX3R5cGUsIFN0cmluZyBuYW1lLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURlZmVycmVkVHlwZUFubm90YXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgdHlwZSAnJHt0eXBlfScgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJyR7bmFtZX0nIGFuZCBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBhbm5vdGF0aW9uLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyR7bmFtZX0nIG9yIHVzZSBhIHN1cGVydHlwZSBvZiAnJHt0eXBlfScgdGhhdCBpc24ndCBkZWZlcnJlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVGZmlEYXJ0VHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCAnI3R5cGUnIHRvIGJlIGEgc3VidHlwZSBvZiAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlEYXJ0VHlwZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVGZmlEYXJ0VHlwZU1pc21hdGNoID0gY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiRmZpRGFydFR5cGVNaXNtYXRjaCIsCiAgdGVtcGxhdGVGZmlEYXJ0VHlwZU1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaURhcnRUeXBlTWlzbWF0Y2goCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaURhcnRUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICcke3R5cGV9JyB0byBiZSBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUZmaUV4cGVjdGVkRXhjZXB0aW9uYWxSZXR1cm4gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiRXhwZWN0ZWQgYW4gZXhjZXB0aW9uYWwgcmV0dXJuIHZhbHVlIGZvciBhIG5hdGl2ZSBjYWxsYmFjayByZXR1cm5pbmcgJyN0eXBlJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlFeHBlY3RlZEV4Y2VwdGlvbmFsUmV0dXJuKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVGZmlFeHBlY3RlZEV4Y2VwdGlvbmFsUmV0dXJuID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgIkZmaUV4cGVjdGVkRXhjZXB0aW9uYWxSZXR1cm4iLAogIHRlbXBsYXRlRmZpRXhwZWN0ZWRFeGNlcHRpb25hbFJldHVybiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlFeHBlY3RlZEV4Y2VwdGlvbmFsUmV0dXJuKAogICAgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGZmlFeHBlY3RlZEV4Y2VwdGlvbmFsUmV0dXJuLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRXhwZWN0ZWQgYW4gZXhjZXB0aW9uYWwgcmV0dXJuIHZhbHVlIGZvciBhIG5hdGl2ZSBjYWxsYmFjayByZXR1cm5pbmcgJyR7dHlwZX0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm4gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiRXhjZXB0aW9uYWwgcmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBwcm92aWRlZCBmb3IgYSBuYXRpdmUgY2FsbGJhY2sgcmV0dXJuaW5nICcjdHlwZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpRXhwZWN0ZWROb0V4Y2VwdGlvbmFsUmV0dXJuKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiRmZpRXhwZWN0ZWROb0V4Y2VwdGlvbmFsUmV0dXJuIiwKICB0ZW1wbGF0ZUZmaUV4cGVjdGVkTm9FeGNlcHRpb25hbFJldHVybiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm4oCiAgICBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaUV4cGVjdGVkTm9FeGNlcHRpb25hbFJldHVybiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkV4Y2VwdGlvbmFsIHJldHVybiB2YWx1ZSBjYW5ub3QgYmUgcHJvdmlkZWQgZm9yIGEgbmF0aXZlIGNhbGxiYWNrIHJldHVybmluZyAnJHt0eXBlfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBib29sCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiB0ZW1wbGF0ZUZmaVR5cGVJbnZhbGlkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkV4cGVjdGVkIHR5cGUgJyN0eXBlJyB0byBiZSBhIHZhbGlkIGFuZCBpbnN0YW50aWF0ZWQgc3VidHlwZSBvZiAnTmF0aXZlVHlwZScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlUeXBlSW52YWxpZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlRmZpVHlwZUludmFsaWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiRmZpVHlwZUludmFsaWQiLAogIHRlbXBsYXRlRmZpVHlwZUludmFsaWQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpVHlwZUludmFsaWQoCiAgICBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVR5cGVJbnZhbGlkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRXhwZWN0ZWQgdHlwZSAnJHt0eXBlfScgdG8gYmUgYSB2YWxpZCBhbmQgaW5zdGFudGlhdGVkIHN1YnR5cGUgb2YgJ05hdGl2ZVR5cGUnLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIERhcnRUeXBlIF90eXBlMywKICAgICAgICBib29sCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiB0ZW1wbGF0ZUZmaVR5cGVNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzLAogICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRXhwZWN0ZWQgdHlwZSAnI3R5cGUnIHRvIGJlICcjdHlwZTInLCB3aGljaCBpcyB0aGUgRGFydCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gJyN0eXBlMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgRGFydFR5cGUgX3R5cGUzLAogICAgICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+IGNvZGVGZmlUeXBlTWlzbWF0Y2ggPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMsCiAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgIkZmaVR5cGVNaXNtYXRjaCIsCiAgdGVtcGxhdGVGZmlUeXBlTWlzbWF0Y2gsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpVHlwZU1pc21hdGNoKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICBEYXJ0VHlwZSBfdHlwZTMsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgTGlzdDxPYmplY3Q+IHR5cGUzUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTMpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTMgPSB0eXBlM1BhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVR5cGVNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkV4cGVjdGVkIHR5cGUgJyR7dHlwZX0nIHRvIGJlICcke3R5cGUyfScsIHdoaWNoIGlzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byAnJHt0eXBlM30nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyLCAndHlwZTMnOiBfdHlwZTN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRXJyb3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgaW5pdGlhbGl6ZSBmaWVsZCAnI25hbWUnIGJlY2F1c2UgaXRzIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGFsbG93IG51bGwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JFcnJvciA9IGNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckVycm9yIiwKICB0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JFcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRXJyb3IoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgaW5pdGlhbGl6ZSBmaWVsZCAnJHtuYW1lfScgYmVjYXVzZSBpdHMgdHlwZSAnJHt0eXBlfScgZG9lc24ndCBhbGxvdyBudWxsLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcldhcm5pbmcgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhpcyBjb25zdHJ1Y3RvciBkb2Vzbid0IGluaXRpYWxpemUgZmllbGQgJyNuYW1lJyBhbmQgaXRzIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGFsbG93IG51bGwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6CiAgICAgICAgICAgIF93aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcldhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcldhcm5pbmcgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcldhcm5pbmciLAogICAgICAgIHRlbXBsYXRlRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcldhcm5pbmcsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JXYXJuaW5nKAogICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JXYXJuaW5nLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhpcyBjb25zdHJ1Y3RvciBkb2Vzbid0IGluaXRpYWxpemUgZmllbGQgJyR7bmFtZX0nIGFuZCBpdHMgdHlwZSAnJHt0eXBlfScgZG9lc24ndCBhbGxvdyBudWxsLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkZpZWxkICcjbmFtZScgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlY2F1c2UgaXRzIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGFsbG93IG51bGwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUZpZWxkTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJFcnJvciA9IGNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAiRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yIiwKICB0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJFcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3IoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRmllbGQgJyR7bmFtZX0nIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWNhdXNlIGl0cyB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGFsbG93IG51bGwuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJGaWVsZCAnI25hbWUnIGlzbid0IGluaXRpYWxpemVkIGFuZCBpdHMgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgYWxsb3cgbnVsbC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyIsCiAgICAgICAgdGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJGaWVsZCAnJHtuYW1lfScgaXNuJ3QgaW5pdGlhbGl6ZWQgYW5kIGl0cyB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGFsbG93IG51bGwuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJBIHZhbHVlIG9mIHR5cGUgJyN0eXBlJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyN0eXBlMicuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlIiwKICAgICAgICB0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRk9SX0lOX09GX0lOVkFMSURfRUxFTUVOVF9UWVBFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQSB2YWx1ZSBvZiB0eXBlICcke3R5cGV9JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSB0eXBlICcjdHlwZScgdXNlZCBpbiB0aGUgJ2ZvcicgbG9vcCBtdXN0IGltcGxlbWVudCAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlIiwgdGVtcGxhdGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZPUl9JTl9PRl9JTlZBTElEX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGb3JJbkxvb3BUeXBlTm90SXRlcmFibGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgdHlwZSAnJHt0eXBlfScgdXNlZCBpbiB0aGUgJ2ZvcicgbG9vcCBtdXN0IGltcGxlbWVudCAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkdlbmVyaWMgZnVuY3Rpb24gdHlwZSAnI3R5cGUnIGluZmVycmVkIGFzIGEgdHlwZSBhcmd1bWVudC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcnkgcHJvdmlkaW5nIGEgbm9uLWdlbmVyaWMgZnVuY3Rpb24gdHlwZSBleHBsaWNpdGx5LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0dlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCIsCiAgICAgICAgdGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiR0VORVJJQ19GVU5DVElPTl9DQU5OT1RfQkVfVFlQRV9BUkdVTUVOVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudCgKICAgIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJHZW5lcmljIGZ1bmN0aW9uIHR5cGUgJyR7dHlwZX0nIGluZmVycmVkIGFzIGEgdHlwZSBhcmd1bWVudC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IHByb3ZpZGluZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUgZXhwbGljaXRseS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlSWxsZWdhbFJlY3Vyc2l2ZVR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiSWxsZWdhbCByZWN1cnNpdmUgdHlwZSAnI3R5cGUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0lsbGVnYWxSZWN1cnNpdmVUeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbGxlZ2FsUmVjdXJzaXZlVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJJbGxlZ2FsUmVjdXJzaXZlVHlwZSIsCiAgdGVtcGxhdGVJbGxlZ2FsUmVjdXJzaXZlVHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbGxlZ2FsUmVjdXJzaXZlVHlwZSgKICAgIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSWxsZWdhbFJlY3Vyc2l2ZVR5cGUsCiAgICAgIG1lc3NhZ2U6ICIiIklsbGVnYWwgcmVjdXJzaXZlIHR5cGUgJyR7dHlwZX0nLiIiIiArIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2Fubm90IGludm9rZSBhbiBpbnN0YW5jZSBvZiAnI3R5cGUnIGJlY2F1c2UgaXQgZGVjbGFyZXMgJ2NhbGwnIHRvIGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgbWV0aG9kLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRyeSBjaGFuZ2luZyAnY2FsbCcgdG8gYSBtZXRob2Qgb3IgZXhwbGljaXRseSBpbnZva2UgJ2NhbGwnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbXBsaWNpdENhbGxPZk5vbk1ldGhvZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbXBsaWNpdENhbGxPZk5vbk1ldGhvZCIsIHRlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklNUExJQ0lUX0NBTExfT0ZfTk9OX01FVEhPRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBsaWNpdENhbGxPZk5vbk1ldGhvZCgKICAgIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW1wbGljaXRDYWxsT2ZOb25NZXRob2QsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcke3R5cGV9JyBiZWNhdXNlIGl0IGRlY2xhcmVzICdjYWxsJyB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nICdjYWxsJyB0byBhIG1ldGhvZCBvciBleHBsaWNpdGx5IGludm9rZSAnY2FsbCcuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlICcjdHlwZScgaXNuJ3QgYSBzdWJ0eXBlIG9mICcjdHlwZTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUiLAogICAgICAgIHRlbXBsYXRlSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVESVJFQ1RfVE9fSU5WQUxJRF9UWVBFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAnJHt0eXBlfScgaXNuJ3QgYSBzdWJ0eXBlIG9mICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50ID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkluY29ycmVjdFR5cGVBcmd1bWVudCIsIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50KERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSBhcmd1bWVudCAnJHt0eXBlfScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJHt0eXBlMn0nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvbiAnJHtuYW1lMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgcmV0dXJuIHR5cGUuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUiLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlKERhcnRUeXBlIF90eXBlLAogICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSBhcmd1bWVudCAnJHt0eXBlfScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJHt0eXBlMn0nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvbiAnJHtuYW1lMn0nIGluIHRoZSByZXR1cm4gdHlwZS4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMywKICAgICAgICAgICAgU3RyaW5nIG5hbWU0LAogICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMywKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lNCwKICAgICAgICAgICAgICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyNuYW1lMicgaW4gdGhlIHN1cGVydHlwZSAnI25hbWUzJyBvZiBjbGFzcyAnI25hbWU0Jy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMywKICAgICAgICAgICAgU3RyaW5nIG5hbWU0LAogICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiBjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUgPQogICAgY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTMsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTQsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUiLCB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwKICAgIFN0cmluZyBuYW1lLAogICAgU3RyaW5nIG5hbWUyLAogICAgU3RyaW5nIG5hbWUzLAogICAgU3RyaW5nIG5hbWU0LAogICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICBpZiAobmFtZTQuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWU0ID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lNCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUeXBlIGFyZ3VtZW50ICcke3R5cGV9JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcke3R5cGUyfScgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIG9uICcke25hbWUyfScgaW4gdGhlIHN1cGVydHlwZSAnJHtuYW1lM30nIG9mIGNsYXNzICcke25hbWU0fScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAnbmFtZTInOiBuYW1lMiwKICAgICAgICAnbmFtZTMnOiBuYW1lMywKICAgICAgICAnbmFtZTQnOiBuYW1lNAogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICAgICAgU3RyaW5nIG5hbWUzLAogICAgICAgICAgICBTdHJpbmcgbmFtZTQsCiAgICAgICAgICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTMsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTQsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInIGluIHRoZSBzdXBlcnR5cGUgJyNuYW1lMycgb2YgY2xhc3MgJyNuYW1lNCcuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHJ5IHNwZWNpZnlpbmcgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLAogICAgICAgICAgICBTdHJpbmcgbmFtZTMsCiAgICAgICAgICAgIFN0cmluZyBuYW1lNCwKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTMsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTQsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCIsIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWQoCiAgICBEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwKICAgIFN0cmluZyBuYW1lLAogICAgU3RyaW5nIG5hbWUyLAogICAgU3RyaW5nIG5hbWUzLAogICAgU3RyaW5nIG5hbWU0LAogICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICBpZiAobmFtZTQuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWU0ID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lNCk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7bmFtZTJ9JyBpbiB0aGUgc3VwZXJ0eXBlICcke25hbWUzfScgb2YgY2xhc3MgJyR7bmFtZTR9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAnbmFtZTInOiBuYW1lMiwKICAgICAgICAnbmFtZTMnOiBuYW1lMywKICAgICAgICAnbmFtZTQnOiBuYW1lNAogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZCIsIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZChEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnJHt0eXBlfScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJHt0eXBlMn0nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvbiAnJHtuYW1lMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgc3BlY2lmeWluZyB0eXBlIGFyZ3VtZW50cyBleHBsaWNpdGx5IHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjdHlwZTMuI25hbWUyJy4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTMsIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUzLCBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWQiLAogICAgICAgIHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkKAogICAgRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICBTdHJpbmcgbmFtZSwKICAgIERhcnRUeXBlIF90eXBlMywKICAgIFN0cmluZyBuYW1lMiwKICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIExpc3Q8T2JqZWN0PiB0eXBlM1BhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUzKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMyA9IHR5cGUzUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSBhcmd1bWVudCAnJHt0eXBlfScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJHt0eXBlMn0nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvbiAnJHt0eXBlM30uJHtuYW1lMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2hhbmdpbmcgdHlwZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAndHlwZTMnOiBfdHlwZTMsCiAgICAgICAgJ25hbWUyJzogbmFtZTIKICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUzLCBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyN0eXBlMy4jbmFtZTInLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRyeSBzcGVjaWZ5aW5nIHR5cGUgYXJndW1lbnRzIGV4cGxpY2l0bHkgc28gdGhhdCB0aGV5IGNvbmZvcm0gdG8gdGhlIGJvdW5kcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMywgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWQiLCB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5mZXJyZWQoCiAgICBEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwKICAgIFN0cmluZyBuYW1lLAogICAgRGFydFR5cGUgX3R5cGUzLAogICAgU3RyaW5nIG5hbWUyLAogICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUzUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTMpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUzID0gdHlwZTNQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkluZmVycmVkIHR5cGUgYXJndW1lbnQgJyR7dHlwZX0nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyR7dHlwZTJ9JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgb24gJyR7dHlwZTN9LiR7bmFtZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IHNwZWNpZnlpbmcgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3R5cGUnOiBfdHlwZSwKICAgICAgICAndHlwZTInOiBfdHlwZTIsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICd0eXBlMyc6IF90eXBlMywKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgdHlwZSBvZiBwYXJhbWV0ZXIgJyNuYW1lJywgJyN0eXBlJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkJ3MgdHlwZSwgJyN0eXBlMicuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHBhcmFtZXRlciAnI25hbWUnIHRvIGEgc3VidHlwZSBvZiAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiBjb2RlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigiSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9QQVJBTUVURVJfREVDTEFSQVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoKAogICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB0eXBlIG9mIHBhcmFtZXRlciAnJHtuYW1lfScsICcke3R5cGV9JyBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkJ3MgdHlwZSwgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHBhcmFtZXRlciAnJHtuYW1lfScgdG8gYSBzdWJ0eXBlIG9mICcke3R5cGUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWROdWxsYWJpbGl0eSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlVuc3VwcG9ydGVkIG51bGxhYmlsaXR5IHZhbHVlICcjc3RyaW5nJyBvbiB0eXBlICcjdHlwZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWROdWxsYWJpbGl0eSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkTnVsbGFiaWxpdHkgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZE51bGxhYmlsaXR5IiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkTnVsbGFiaWxpdHksCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWROdWxsYWJpbGl0eSgKICAgIFN0cmluZyBzdHJpbmcsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZE51bGxhYmlsaXR5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgdmFsdWUgJyR7c3RyaW5nfScgb24gdHlwZSAnJHt0eXBlfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZUludmFsaWRBc3NpZ25tZW50RXJyb3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkEgdmFsdWUgb2YgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQXNzaWdubWVudEVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbnZhbGlkQXNzaWdubWVudEVycm9yID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbnZhbGlkQXNzaWdubWVudEVycm9yIiwgdGVtcGxhdGVJbnZhbGlkQXNzaWdubWVudEVycm9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0FTU0lHTk1FTlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZEFzc2lnbm1lbnRFcnJvcigKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZEFzc2lnbm1lbnRFcnJvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkEgdmFsdWUgb2YgdHlwZSAnJHt0eXBlfScgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnRXYXJuaW5nID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJBc3NpZ25pbmcgdmFsdWUgb2YgdHlwZSAnI3R5cGUnIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQXNzaWdubWVudFdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUludmFsaWRBc3NpZ25tZW50V2FybmluZyA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW52YWxpZEFzc2lnbm1lbnRXYXJuaW5nIiwgdGVtcGxhdGVJbnZhbGlkQXNzaWdubWVudFdhcm5pbmcsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50V2FybmluZygKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZEFzc2lnbm1lbnRXYXJuaW5nLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQXNzaWduaW5nIHZhbHVlIG9mIHR5cGUgJyR7dHlwZX0nIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlSW52YWxpZENhc3RGdW5jdGlvbkV4cHIgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkludmFsaWRDYXN0RnVuY3Rpb25FeHByIiwgdGVtcGxhdGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0ZVTkNUSU9OX0VYUFIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RGdW5jdGlvbkV4cHIoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0RnVuY3Rpb25FeHByLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gdHlwZSAnJHt0eXBlfScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIGJvb2wKICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+IHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTGlzdCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgIGJvb2wKICAgICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGxpc3QgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBsaXN0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbExpc3QpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUludmFsaWRDYXN0TGl0ZXJhbExpc3QgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkludmFsaWRDYXN0TGl0ZXJhbExpc3QiLCB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbExpc3QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9MSVRFUkFMX0xJU1QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTGlzdCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RMaXRlcmFsTGlzdCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBsaXN0IGxpdGVyYWwgdHlwZSAnJHt0eXBlfScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGxpc3QgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxNYXAgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBib29sCiAgICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtYXAgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtYXAgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTWFwKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbnZhbGlkQ2FzdExpdGVyYWxNYXAgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIkludmFsaWRDYXN0TGl0ZXJhbE1hcCIsIHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsTWFwLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NBU1RfTElURVJBTF9NQVAiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZENhc3RMaXRlcmFsTWFwKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ2FzdExpdGVyYWxNYXAsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbWFwIGxpdGVyYWwgdHlwZSAnJHt0eXBlfScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1hcCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlLCAndHlwZTInOiBfdHlwZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICBib29sCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbFNldCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgIGJvb2wKICAgICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHNldCBsaXRlcmFsIHR5cGUgJyN0eXBlJyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHNldCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxTZXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUludmFsaWRDYXN0TGl0ZXJhbFNldCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW52YWxpZENhc3RMaXRlcmFsU2V0IiwgdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxTZXQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9MSVRFUkFMX1NFVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxTZXQoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0TGl0ZXJhbFNldCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzZXQgbGl0ZXJhbCB0eXBlICcke3R5cGV9JyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgc2V0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgIGJvb2wKICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+IHRlbXBsYXRlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgYm9vbAogICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TG9jYWxGdW5jdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb24iLCB0ZW1wbGF0ZUludmFsaWRDYXN0TG9jYWxGdW5jdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0ZVTkNUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TG9jYWxGdW5jdGlvbigKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RMb2NhbEZ1bmN0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGxvY2FsIGZ1bmN0aW9uIGhhcyB0eXBlICcke3R5cGV9JyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBib29sCiAgICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGNvbnN0cnVjdGVkIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdE5ld0V4cHIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZUludmFsaWRDYXN0TmV3RXhwciA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW52YWxpZENhc3ROZXdFeHByIiwgdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FTVF9ORVdfRVhQUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdE5ld0V4cHIoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRDYXN0TmV3RXhwciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJyR7dHlwZX0nIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBjb25zdHJ1Y3RlZCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgc3RhdGljIG1ldGhvZCBoYXMgdHlwZSAnI3R5cGUnIHRoYXQgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0U3RhdGljTWV0aG9kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiSW52YWxpZENhc3RTdGF0aWNNZXRob2QiLCB0ZW1wbGF0ZUludmFsaWRDYXN0U3RhdGljTWV0aG9kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX0NBU1RfTUVUSE9EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0U3RhdGljTWV0aG9kKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzdGF0aWMgbWV0aG9kIGhhcyB0eXBlICcke3R5cGV9JyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSB0b3AgbGV2ZWwgZnVuY3Rpb24gaGFzIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb24iLCB0ZW1wbGF0ZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DQVNUX0ZVTkNUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbigKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZENhc3RUb3BMZXZlbEZ1bmN0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHRvcCBsZXZlbCBmdW5jdGlvbiBoYXMgdHlwZSAnJHt0eXBlfScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcke3R5cGUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMywKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMywKICAgICAgICAgICAgICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjdHlwZScgZG9lc24ndCBpbXBsZW1lbnQgJyN0eXBlMicgc28gaXQgY2FuJ3QgYmUgdXNlZCB3aXRoICcjdHlwZTMnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMywKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBEYXJ0VHlwZSBfdHlwZTMsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSIsCiAgICAgICAgdGVtcGxhdGVNaXhpbkFwcGxpY2F0aW9uSW5jb21wYXRpYmxlU3VwZXJ0eXBlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVhJTl9BUFBMSUNBVElPTl9OT1RfSU1QTEVNRU5URURfSU5URVJGQUNFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUoRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsIERhcnRUeXBlIF90eXBlMywgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBMaXN0PE9iamVjdD4gdHlwZTNQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMyk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMyA9IHR5cGUzUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke3R5cGV9JyBkb2Vzbid0IGltcGxlbWVudCAnJHt0eXBlMn0nIHNvIGl0IGNhbid0IGJlIHVzZWQgd2l0aCAnJHt0eXBlM30nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyLCAndHlwZTMnOiBfdHlwZTN9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MgPQogICAgY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUeXBlIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIGluZmVycmVkIGZvciB0aGUgbWl4aW4gJyNuYW1lJyBiZWNhdXNlICcjbmFtZTInIGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWl4aW4ncyBzdXBlcnR5cGUgY29uc3RyYWludCAnI3R5cGUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gY29kZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzID0KICAgIGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3MiLCB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVhJTl9JTkZFUkVOQ0VfTk9fUE9TU0lCTEVfU1VCU1RJVFVUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSBpbmZlcnJlZCBmb3IgdGhlIG1peGluICcke25hbWV9JyBiZWNhdXNlICcke25hbWUyfScgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtaXhpbidzIHN1cGVydHlwZSBjb25zdHJhaW50ICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTIsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVOb25OdWxsYWJsZUluTnVsbEF3YXJlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk9wZXJhbmQgb2YgbnVsbC1hd2FyZSBvcGVyYXRpb24gJyNuYW1lJyBoYXMgdHlwZSAnI3R5cGUnIHdoaWNoIGV4Y2x1ZGVzIG51bGwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm9uTnVsbGFibGVJbk51bGxBd2FyZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVOb25OdWxsYWJsZUluTnVsbEF3YXJlID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIk5vbk51bGxhYmxlSW5OdWxsQXdhcmUiLCB0ZW1wbGF0ZU5vbk51bGxhYmxlSW5OdWxsQXdhcmUsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vbk51bGxhYmxlSW5OdWxsQXdhcmUoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uTnVsbGFibGVJbk51bGxBd2FyZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk9wZXJhbmQgb2YgbnVsbC1hd2FyZSBvcGVyYXRpb24gJyR7bmFtZX0nIGhhcyB0eXBlICcke3R5cGV9JyB3aGljaCBleGNsdWRlcyBudWxsLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZU51bGxhYmxlRXhwcmVzc2lvbkNhbGxFcnJvciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCB1c2UgYW4gZXhwcmVzc2lvbiBvZiB0eXBlICcjdHlwZScgYXMgYSBmdW5jdGlvbiBiZWNhdXNlIGl0J3MgcG90ZW50aWFsbHkgbnVsbC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY2FsbGluZyB1c2luZyA/LmNhbGwgaW5zdGVhZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOdWxsYWJsZUV4cHJlc3Npb25DYWxsRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZU51bGxhYmxlRXhwcmVzc2lvbkNhbGxFcnJvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJOdWxsYWJsZUV4cHJlc3Npb25DYWxsRXJyb3IiLAogIHRlbXBsYXRlTnVsbGFibGVFeHByZXNzaW9uQ2FsbEVycm9yLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c051bGxhYmxlRXhwcmVzc2lvbkNhbGxFcnJvcigKICAgIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTnVsbGFibGVFeHByZXNzaW9uQ2FsbEVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdXNlIGFuIGV4cHJlc3Npb24gb2YgdHlwZSAnJHt0eXBlfScgYXMgYSBmdW5jdGlvbiBiZWNhdXNlIGl0J3MgcG90ZW50aWFsbHkgbnVsbC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNhbGxpbmcgdXNpbmcgPy5jYWxsIGluc3RlYWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZU51bGxhYmxlRXhwcmVzc2lvbkNhbGxXYXJuaW5nID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkV4cHJlc3Npb24gb2YgdHlwZSAnI3R5cGUnIGlzIHVzZWQgYXMgYSBmdW5jdGlvbiwgYnV0IGl0J3MgcG90ZW50aWFsbHkgbnVsbC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY2FsbGluZyB1c2luZyA/LmNhbGwgaW5zdGVhZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOdWxsYWJsZUV4cHJlc3Npb25DYWxsV2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlTnVsbGFibGVFeHByZXNzaW9uQ2FsbFdhcm5pbmcgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiTnVsbGFibGVFeHByZXNzaW9uQ2FsbFdhcm5pbmciLCB0ZW1wbGF0ZU51bGxhYmxlRXhwcmVzc2lvbkNhbGxXYXJuaW5nLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZUV4cHJlc3Npb25DYWxsV2FybmluZygKICAgIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTnVsbGFibGVFeHByZXNzaW9uQ2FsbFdhcm5pbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJFeHByZXNzaW9uIG9mIHR5cGUgJyR7dHlwZX0nIGlzIHVzZWQgYXMgYSBmdW5jdGlvbiwgYnV0IGl0J3MgcG90ZW50aWFsbHkgbnVsbC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGNhbGxpbmcgdXNpbmcgPy5jYWxsIGluc3RlYWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlTnVsbGFibGVNZXRob2RDYWxsRXJyb3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiTWV0aG9kICcjbmFtZScgY2Fubm90IGJlIGNhbGxlZCBvbiAnI3R5cGUnIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgbnVsbC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgY2FsbGluZyB1c2luZyA/LiBpbnN0ZWFkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c051bGxhYmxlTWV0aG9kQ2FsbEVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiBjb2RlTnVsbGFibGVNZXRob2RDYWxsRXJyb3IgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJOdWxsYWJsZU1ldGhvZENhbGxFcnJvciIsCiAgdGVtcGxhdGVOdWxsYWJsZU1ldGhvZENhbGxFcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZU1ldGhvZENhbGxFcnJvcigKICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOdWxsYWJsZU1ldGhvZENhbGxFcnJvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk1ldGhvZCAnJHtuYW1lfScgY2Fubm90IGJlIGNhbGxlZCBvbiAnJHt0eXBlfScgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBudWxsLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2FsbGluZyB1c2luZyA/LiBpbnN0ZWFkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlTnVsbGFibGVNZXRob2RDYWxsV2FybmluZyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJNZXRob2QgJyNuYW1lJyBpcyBjYWxsZWQgb24gJyN0eXBlJyB3aGljaCBpcyBwb3RlbnRpYWxseSBudWxsLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSBjYWxsaW5nIHVzaW5nID8uIGluc3RlYWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTnVsbGFibGVNZXRob2RDYWxsV2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVOdWxsYWJsZU1ldGhvZENhbGxXYXJuaW5nID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIk51bGxhYmxlTWV0aG9kQ2FsbFdhcm5pbmciLCB0ZW1wbGF0ZU51bGxhYmxlTWV0aG9kQ2FsbFdhcm5pbmcsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c051bGxhYmxlTWV0aG9kQ2FsbFdhcm5pbmcoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTnVsbGFibGVNZXRob2RDYWxsV2FybmluZywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk1ldGhvZCAnJHtuYW1lfScgaXMgY2FsbGVkIG9uICcke3R5cGV9JyB3aGljaCBpcyBwb3RlbnRpYWxseSBudWxsLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgdGlwOiAiIiJUcnkgY2FsbGluZyB1c2luZyA/LiBpbnN0ZWFkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJPcGVyYXRvciAnI25hbWUnIGNhbm5vdCBiZSBjYWxsZWQgb24gJyN0eXBlJyBiZWNhdXNlIGl0IGlzIHBvdGVudGlhbGx5IG51bGwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVOdWxsYWJsZU9wZXJhdG9yQ2FsbEVycm9yID0gY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJOdWxsYWJsZU9wZXJhdG9yQ2FsbEVycm9yIiwKICB0ZW1wbGF0ZU51bGxhYmxlT3BlcmF0b3JDYWxsRXJyb3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvcigKICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOdWxsYWJsZU9wZXJhdG9yQ2FsbEVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiT3BlcmF0b3IgJyR7bmFtZX0nIGNhbm5vdCBiZSBjYWxsZWQgb24gJyR7dHlwZX0nIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgbnVsbC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZU51bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJPcGVyYXRvciAnI25hbWUnIGlzIGNhbGxlZCBvbiAnI3R5cGUnIHdoaWNoIGlzIHBvdGVudGlhbGx5IG51bGwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTnVsbGFibGVPcGVyYXRvckNhbGxXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZU51bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZyA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJOdWxsYWJsZU9wZXJhdG9yQ2FsbFdhcm5pbmciLCB0ZW1wbGF0ZU51bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTnVsbGFibGVPcGVyYXRvckNhbGxXYXJuaW5nKAogICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU51bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk9wZXJhdG9yICcke25hbWV9JyBpcyBjYWxsZWQgb24gJyR7dHlwZX0nIHdoaWNoIGlzIHBvdGVudGlhbGx5IG51bGwuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzRXJyb3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiUHJvcGVydHkgJyNuYW1lJyBjYW5ub3QgYmUgYWNjZXNzZWQgb24gJyN0eXBlJyBiZWNhdXNlIGl0IGlzIHBvdGVudGlhbGx5IG51bGwuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFjY2Vzc2luZyB1c2luZyA/LiBpbnN0ZWFkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c051bGxhYmxlUHJvcGVydHlBY2Nlc3NFcnJvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzRXJyb3IgPSBjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgIk51bGxhYmxlUHJvcGVydHlBY2Nlc3NFcnJvciIsCiAgdGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzRXJyb3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc0Vycm9yKAogICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU51bGxhYmxlUHJvcGVydHlBY2Nlc3NFcnJvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlByb3BlcnR5ICcke25hbWV9JyBjYW5ub3QgYmUgYWNjZXNzZWQgb24gJyR7dHlwZX0nIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgbnVsbC4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDogIiIiVHJ5IGFjY2Vzc2luZyB1c2luZyA/LiBpbnN0ZWFkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc1dhcm5pbmcgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiUHJvcGVydHkgJyNuYW1lJyBpcyBhY2Nlc3NlZCBvbiAnI3R5cGUnIHdoaWNoIGlzIHBvdGVudGlhbGx5IG51bGwuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFjY2Vzc2luZyB1c2luZyA/LiBpbnN0ZWFkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c051bGxhYmxlUHJvcGVydHlBY2Nlc3NXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZU51bGxhYmxlUHJvcGVydHlBY2Nlc3NXYXJuaW5nID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIk51bGxhYmxlUHJvcGVydHlBY2Nlc3NXYXJuaW5nIiwgdGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzV2FybmluZywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc1dhcm5pbmcoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc1dhcm5pbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJQcm9wZXJ0eSAnJHtuYW1lfScgaXMgYWNjZXNzZWQgb24gJyR7dHlwZX0nIHdoaWNoIGlzIHBvdGVudGlhbGx5IG51bGwuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSBhY2Nlc3NpbmcgdXNpbmcgPy4gaW5zdGVhZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZU9wdGlvbmFsTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJFcnJvciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJPcHRpb25hbCBwYXJhbWV0ZXIgJyNuYW1lJyBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYmVjYXVzZSBpdHMgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgYWxsb3cgbnVsbC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yID0gY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3IiLAogIHRlbXBsYXRlT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c09wdGlvbmFsTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJFcnJvcigKICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJPcHRpb25hbCBwYXJhbWV0ZXIgJyR7bmFtZX0nIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBiZWNhdXNlIGl0cyB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGFsbG93IG51bGwuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJPcHRpb25hbCBwYXJhbWV0ZXIgJyNuYW1lJyBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGFuZCBpdHMgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgYWxsb3cgbnVsbC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZyIsCiAgICAgICAgdGVtcGxhdGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJPcHRpb25hbCBwYXJhbWV0ZXIgJyR7bmFtZX0nIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYW5kIGl0cyB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGFsbG93IG51bGwuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZTMsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMywgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIHBhcmFtZXRlciAnI25hbWUnIG9mIHRoZSBtZXRob2QgJyNuYW1lMicgaGFzIHR5cGUgJyN0eXBlJywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSwgJyN0eXBlMicsIGluIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyNuYW1lMycuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcjdHlwZTInLCBvciwgZm9yIGEgY292YXJpYW50IHBhcmFtZXRlciwgYSBzdWJ0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZTMsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIERhcnRUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZTMsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlciIsIHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfTUVUSE9EX09WRVJSSURFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyKAogICAgU3RyaW5nIG5hbWUsCiAgICBTdHJpbmcgbmFtZTIsCiAgICBEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwKICAgIFN0cmluZyBuYW1lMywKICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZTMuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUzID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMyk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgcGFyYW1ldGVyICcke25hbWV9JyBvZiB0aGUgbWV0aG9kICcke25hbWUyfScgaGFzIHR5cGUgJyR7dHlwZX0nLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnJHt0eXBlMn0nLCBpbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICcke25hbWUzfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0byBhIHN1cGVydHlwZSBvZiAnJHt0eXBlMn0nLCBvciwgZm9yIGEgY292YXJpYW50IHBhcmFtZXRlciwgYSBzdWJ0eXBlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICduYW1lMic6IG5hbWUyLAogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lMyc6IG5hbWUzCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoUmV0dXJuVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCAnI25hbWUnIGlzICcjdHlwZScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgJyN0eXBlMicsIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyNuYW1lMicuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiQ2hhbmdlIHRvIGEgc3VidHlwZSBvZiAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIk92ZXJyaWRlVHlwZU1pc21hdGNoUmV0dXJuVHlwZSIsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfTUVUSE9EX09WRVJSSURFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZU1pc21hdGNoUmV0dXJuVHlwZSgKICAgIFN0cmluZyBuYW1lLAogICAgRGFydFR5cGUgX3R5cGUsCiAgICBEYXJ0VHlwZSBfdHlwZTIsCiAgICBTdHJpbmcgbmFtZTIsCiAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgJyR7bmFtZX0nIGlzICcke3R5cGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnJHt0eXBlMn0nLCBvZiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICcke25hbWUyfScuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIkNoYW5nZSB0byBhIHN1YnR5cGUgb2YgJyR7dHlwZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAndHlwZSc6IF90eXBlLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZTInOiBuYW1lMgogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwKICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFNldHRlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLAogICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgZmllbGQgJyNuYW1lJyBoYXMgdHlwZSAnI3R5cGUnLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnI3R5cGUyJywgaW4gdGhlIG92ZXJyaWRkZW4gc2V0dGVyLCAnI25hbWUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVNaXNtYXRjaFNldHRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgIFN0cmluZyBuYW1lMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFNldHRlciA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJPdmVycmlkZVR5cGVNaXNtYXRjaFNldHRlciIsIHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hTZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfTUVUSE9EX09WRVJSSURFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZU1pc21hdGNoU2V0dGVyKFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwKICAgIERhcnRUeXBlIF90eXBlMiwgU3RyaW5nIG5hbWUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hTZXR0ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgZmllbGQgJyR7bmFtZX0nIGhhcyB0eXBlICcke3R5cGV9Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSwgJyR7dHlwZTJ9JywgaW4gdGhlIG92ZXJyaWRkZW4gc2V0dGVyLCAnJHtuYW1lMn0nLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ3R5cGUyJzogX3R5cGUyLAogICAgICAgICduYW1lMic6IG5hbWUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMywgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzQm91bmRNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUyLCBTdHJpbmcgbmFtZTMsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkRlY2xhcmVkIGJvdW5kICcjdHlwZScgb2YgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9mICcjbmFtZTInIGRvZXNuJ3QgbWF0Y2ggdGhlIGJvdW5kICcjdHlwZTInIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTMnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZVZhcmlhYmxlc0JvdW5kTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMywgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVPdmVycmlkZVR5cGVWYXJpYWJsZXNCb3VuZE1pc21hdGNoID0gY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZTIsIFN0cmluZyBuYW1lMywgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgIk92ZXJyaWRlVHlwZVZhcmlhYmxlc0JvdW5kTWlzbWF0Y2giLAogIHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzQm91bmRNaXNtYXRjaCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVWYXJpYWJsZXNCb3VuZE1pc21hdGNoKAogICAgRGFydFR5cGUgX3R5cGUsCiAgICBTdHJpbmcgbmFtZSwKICAgIFN0cmluZyBuYW1lMiwKICAgIERhcnRUeXBlIF90eXBlMiwKICAgIFN0cmluZyBuYW1lMywKICAgIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBpZiAobmFtZTMuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUzID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMyk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVUeXBlVmFyaWFibGVzQm91bmRNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkRlY2xhcmVkIGJvdW5kICcke3R5cGV9JyBvZiB0eXBlIHZhcmlhYmxlICcke25hbWV9JyBvZiAnJHtuYW1lMn0nIGRvZXNuJ3QgbWF0Y2ggdGhlIGJvdW5kICcke3R5cGUyfScgb24gb3ZlcnJpZGRlbiBtZXRob2QgJyR7bmFtZTN9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogewogICAgICAgICd0eXBlJzogX3R5cGUsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICduYW1lMic6IG5hbWUyLAogICAgICAgICd0eXBlMic6IF90eXBlMiwKICAgICAgICAnbmFtZTMnOiBuYW1lMwogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgZXh0ZW5kICcjdHlwZTInLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSB1c2luZyBhIGRpZmZlcmVudCB0eXBlIGFzIGFyZ3VtZW50LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c1JlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50ID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQiLAogICAgICAgIHRlbXBsYXRlUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50KAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnQsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlICcke3R5cGV9JyBkb2Vzbid0IGV4dGVuZCAnJHt0eXBlMn0nLiIiIiArCiAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICB0aXA6ICIiIlRyeSB1c2luZyBhIGRpZmZlcmVudCB0eXBlIGFzIGFyZ3VtZW50LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZSwgJ3R5cGUyJzogX3R5cGUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUnIHRvIGNvbGxlY3Rpb24gZWxlbWVudHMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoID0gY29uc3QgQ29kZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoIiwgdGVtcGxhdGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMSVNUX0VMRU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoKAogICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIExpc3Q8T2JqZWN0PiB0eXBlMlBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUyKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgU3RyaW5nIHR5cGUyID0gdHlwZTJQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbGVtZW50cyBvZiB0eXBlICcke3R5cGV9JyB0byBjb2xsZWN0aW9uIGVsZW1lbnRzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkga2V5cyBvZiB0eXBlICcjdHlwZScgdG8gbWFwIGVudHJ5IGtleXMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICAiU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUFQX0tFWV9UWVBFX05PVF9BU1NJR05BQkxFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbnRyeSBrZXlzIG9mIHR5cGUgJyR7dHlwZX0nIHRvIG1hcCBlbnRyeSBrZXlzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbnRyeSB2YWx1ZXMgb2YgdHlwZSAnI3R5cGUnIHRvIG1hcCBlbnRyeSB2YWx1ZXMgb2YgdHlwZSAnI3R5cGUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2ggPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIlNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNQVBfVkFMVUVfVFlQRV9OT1RfQVNTSUdOQUJMRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBMaXN0PE9iamVjdD4gdHlwZTJQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlMik7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIFN0cmluZyB0eXBlMiA9IHR5cGUyUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IHZhbHVlcyBvZiB0eXBlICcke3R5cGV9JyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyR7dHlwZTJ9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJVbmV4cGVjdGVkIHR5cGUgJyN0eXBlJyBvZiBhIG1hcCBzcHJlYWQgZW50cnkuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYSBNYXAuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgIlNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoIiwKICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoKAogICAgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlVuZXhwZWN0ZWQgdHlwZSAnJHt0eXBlfScgb2YgYSBtYXAgc3ByZWFkIGVudHJ5LiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGEgTWFwLiIiIiArCiAgICAgICAgICAgICAgbGFiZWxlci5vcmlnaW5NZXNzYWdlcywKICAgICAgYXJndW1lbnRzOiB7J3R5cGUnOiBfdHlwZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgRGFydFR5cGUgX3R5cGUsCiAgICAgICAgYm9vbAogICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4gdGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVW5leHBlY3RlZCB0eXBlICcjdHlwZScgb2YgYSBzcHJlYWQuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYW4gSXRlcmFibGUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTcHJlYWRUeXBlTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVNwcmVhZFR5cGVNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICJTcHJlYWRUeXBlTWlzbWF0Y2giLAogIHRlbXBsYXRlU3ByZWFkVHlwZU1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NwcmVhZFR5cGVNaXNtYXRjaCgKICAgIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3ByZWFkVHlwZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVW5leHBlY3RlZCB0eXBlICcke3R5cGV9JyBvZiBhIHNwcmVhZC4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhbiBJdGVyYWJsZS4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIHRlbXBsYXRlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlR5cGUgJyN0eXBlJyBvZiB0aGUgc3dpdGNoIGV4cHJlc3Npb24gaXNuJ3QgYXNzaWduYWJsZSB0byB0aGUgdHlwZSAnI3R5cGUyJyBvZiB0aGlzIGNhc2UgZXhwcmVzc2lvbi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIERhcnRUeXBlIF90eXBlLCBEYXJ0VHlwZSBfdHlwZTIsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICBjb2RlU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUgPSBjb25zdCBDb2RlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgRGFydFR5cGUgX3R5cGUsIERhcnRUeXBlIF90eXBlMiwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICAgICAgIlN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlIiwgdGVtcGxhdGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU1dJVENIX0VYUFJFU1NJT05fTk9UX0FTU0lHTkFCTEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3dpdGNoRXhwcmVzc2lvbk5vdEFzc2lnbmFibGUoCiAgICBEYXJ0VHlwZSBfdHlwZSwgRGFydFR5cGUgX3R5cGUyLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgTGlzdDxPYmplY3Q+IHR5cGUyUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZTIpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICBTdHJpbmcgdHlwZTIgPSB0eXBlMlBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHlwZSAnJHt0eXBlfScgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgJyR7dHlwZTJ9JyBvZiB0aGlzIGNhc2UgZXhwcmVzc2lvbi4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIGFyZ3VtZW50czogeyd0eXBlJzogX3R5cGUsICd0eXBlMic6IF90eXBlMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgdGVtcGxhdGVUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdEVycm9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IHRocm93IGEgdmFsdWUgb2YgJyN0eXBlJyBzaW5jZSBpdCBpcyBuZWl0aGVyIGR5bmFtaWMgbm9yIG5vbi1udWxsYWJsZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdEVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4KICAgIGNvZGVUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdEVycm9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgIlRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0RXJyb3IiLAogIHRlbXBsYXRlVGhyb3dpbmdOb3RBc3NpZ25hYmxlVG9PYmplY3RFcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdEVycm9yKAogICAgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIFR5cGVMYWJlbGVyIGxhYmVsZXIgPSBuZXcgVHlwZUxhYmVsZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgTGlzdDxPYmplY3Q+IHR5cGVQYXJ0cyA9IGxhYmVsZXIubGFiZWxUeXBlKF90eXBlKTsKICBTdHJpbmcgdHlwZSA9IHR5cGVQYXJ0cy5qb2luKCk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdEVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdGhyb3cgYSB2YWx1ZSBvZiAnJHt0eXBlfScgc2luY2UgaXQgaXMgbmVpdGhlciBkeW5hbWljIG5vciBub24tbnVsbGFibGUuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+CiAgICB0ZW1wbGF0ZVRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0V2FybmluZyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaHJvd2luZyBhIHZhbHVlIG9mICcjdHlwZScgdGhhdCBpcyBuZWl0aGVyIGR5bmFtaWMgbm9yIG5vbi1udWxsYWJsZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdFdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0V2FybmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdFdhcm5pbmciLAogICAgICAgIHRlbXBsYXRlVGhyb3dpbmdOb3RBc3NpZ25hYmxlVG9PYmplY3RXYXJuaW5nLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdFdhcm5pbmcoCiAgICBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgVHlwZUxhYmVsZXIgbGFiZWxlciA9IG5ldyBUeXBlTGFiZWxlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICBMaXN0PE9iamVjdD4gdHlwZVBhcnRzID0gbGFiZWxlci5sYWJlbFR5cGUoX3R5cGUpOwogIFN0cmluZyB0eXBlID0gdHlwZVBhcnRzLmpvaW4oKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0V2FybmluZywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRocm93aW5nIGEgdmFsdWUgb2YgJyR7dHlwZX0nIHRoYXQgaXMgbmVpdGhlciBkeW5hbWljIG5vciBub24tbnVsbGFibGUuIiIiICsKICAgICAgICAgICAgICBsYWJlbGVyLm9yaWdpbk1lc3NhZ2VzLAogICAgICBhcmd1bWVudHM6IHsndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBib29sCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiB0ZW1wbGF0ZVVuZGVmaW5lZEdldHRlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBnZXR0ZXIgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZ2V0dGVyLCBvciBkZWZpbmluZyBhIGdldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5kZWZpbmVkR2V0dGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVVuZGVmaW5lZEdldHRlciA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJVbmRlZmluZWRHZXR0ZXIiLCB0ZW1wbGF0ZVVuZGVmaW5lZEdldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX0dFVFRFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmRlZmluZWRHZXR0ZXIoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5kZWZpbmVkR2V0dGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGdldHRlciAnJHtuYW1lfScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGdldHRlciwgb3IgZGVmaW5pbmcgYSBnZXR0ZXIgb3IgZmllbGQgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBib29sCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiB0ZW1wbGF0ZVVuZGVmaW5lZE1ldGhvZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtZXRob2QgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWV0aG9kLCBvciBkZWZpbmluZyBhIG1ldGhvZCBuYW1lZCAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5kZWZpbmVkTWV0aG9kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVVuZGVmaW5lZE1ldGhvZCA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJVbmRlZmluZWRNZXRob2QiLCB0ZW1wbGF0ZVVuZGVmaW5lZE1ldGhvZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX01FVEhPRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmRlZmluZWRNZXRob2QoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5kZWZpbmVkTWV0aG9kLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtuYW1lfScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVzc2FnZXMsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1ldGhvZCwgb3IgZGVmaW5pbmcgYSBtZXRob2QgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndHlwZSc6IF90eXBlfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBEYXJ0VHlwZSBfdHlwZSwKICAgICAgICBib29sCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPiB0ZW1wbGF0ZVVuZGVmaW5lZFNldHRlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBuYW1lLCBEYXJ0VHlwZSBfdHlwZSwgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBzZXR0ZXIgJyNuYW1lJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJyN0eXBlJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3Rpbmcgc2V0dGVyLCBvciBkZWZpbmluZyBhIHNldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5kZWZpbmVkU2V0dGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIF90eXBlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpPgogICAgY29kZVVuZGVmaW5lZFNldHRlciA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk+KAogICAgICAgICJVbmRlZmluZWRTZXR0ZXIiLCB0ZW1wbGF0ZVVuZGVmaW5lZFNldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NFVFRFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmRlZmluZWRTZXR0ZXIoCiAgICBTdHJpbmcgbmFtZSwgRGFydFR5cGUgX3R5cGUsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBUeXBlTGFiZWxlciBsYWJlbGVyID0gbmV3IFR5cGVMYWJlbGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogIExpc3Q8T2JqZWN0PiB0eXBlUGFydHMgPSBsYWJlbGVyLmxhYmVsVHlwZShfdHlwZSk7CiAgU3RyaW5nIHR5cGUgPSB0eXBlUGFydHMuam9pbigpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5kZWZpbmVkU2V0dGVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHNldHRlciAnJHtuYW1lfScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcke3R5cGV9Jy4iIiIgKwogICAgICAgICAgICAgIGxhYmVsZXIub3JpZ2luTWVz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ZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEEgbWVtb3J5ICsgcGh5c2ljYWwgZmlsZSBzeXN0ZW0gdXNlZCB0byBtb2NrIGlucHV0IGZvciB0ZXN0cyBidXQgcHJvdmlkZQovLy8gc2RrIHNvdXJjZXMgZnJvbSBkaXNrLgpsaWJyYXJ5IGZyb250X2VuZC5zcmMuaHlicmlkX2ZpbGVfc3lzdGVtOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JzsKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL21lbW9yeV9maWxlX3N5c3RlbS5kYXJ0JzsKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL3N0YW5kYXJkX2ZpbGVfc3lzdGVtLmRhcnQnOwoKLy8vIEEgZmlsZSBzeXN0ZW0gdGhhdCBtaXhlcyBmaWxlcyBmcm9tIG1lbW9yeSBhbmQgYSBwaHlzaWNhbCBmaWxlIHN5c3RlbS4gQWxsCi8vLyBtZW1vcnkgZW50aXRpZXMgdGFrZSBwcmlvcml0eSBvdmVyIGZpbGUgc3lzdGVtIGVudGl0aWVzLgpjbGFzcyBIeWJyaWRGaWxlU3lzdGVtIGltcGxlbWVudHMgRmlsZVN5c3RlbSB7CiAgZmluYWwgTWVtb3J5RmlsZVN5c3RlbSBtZW1vcnk7CiAgZmluYWwgRmlsZVN5c3RlbSBwaHlzaWNhbDsKCiAgSHlicmlkRmlsZVN5c3RlbSh0aGlzLm1lbW9yeSwgW0ZpbGVTeXN0ZW0gX3BoeXNpY2FsXSkKICAgICAgOiBwaHlzaWNhbCA9IF9waHlzaWNhbCA/PyBTdGFuZGFyZEZpbGVTeXN0ZW0uaW5zdGFuY2U7CgogIEBvdmVycmlkZQogIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5Rm9yVXJpKFVyaSB1cmkpID0+CiAgICAgIG5ldyBIeWJyaWRGaWxlU3lzdGVtRW50aXR5KHVyaSwgdGhpcyk7Cn0KCi8vLyBFbnRpdHkgdGhhdCBkZWxlZ2F0ZXMgdG8gYW4gdW5kZXJseWluZyBtZW1vcnkgb3IgcGh5c2ljYWwgZmlsZSBzeXN0ZW0KLy8vIGVudGl0eS4KY2xhc3MgSHlicmlkRmlsZVN5c3RlbUVudGl0eSBpbXBsZW1lbnRzIEZpbGVTeXN0ZW1FbnRpdHkgewogIGZpbmFsIFVyaSB1cmk7CiAgRmlsZVN5c3RlbUVudGl0eSBfZGVsZWdhdGU7CiAgZmluYWwgSHlicmlkRmlsZVN5c3RlbSBfZnM7CgogIEh5YnJpZEZpbGVTeXN0ZW1FbnRpdHkodGhpcy51cmksIHRoaXMuX2ZzKTsKCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+IGdldCBkZWxlZ2F0ZSBhc3luYyB7CiAgICBpZiAoX2RlbGVnYXRlICE9IG51bGwpIHJldHVybiBfZGVsZWdhdGU7CiAgICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eSA9IF9mcy5tZW1vcnkuZW50aXR5Rm9yVXJpKHVyaSk7CiAgICBpZiAoKCh1cmkuc2NoZW1lICE9ICdmaWxlJyAmJiB1cmkuc2NoZW1lICE9ICdkYXRhJykgJiYKICAgICAgICAgICAgX2ZzLnBoeXNpY2FsIGlzIFN0YW5kYXJkRmlsZVN5c3RlbSkgfHwKICAgICAgICBhd2FpdCBlbnRpdHkuZXhpc3RzKCkpIHsKICAgICAgX2RlbGVnYXRlID0gZW50aXR5OwogICAgICByZXR1cm4gX2RlbGVnYXRlOwogICAgfQogICAgcmV0dXJuIF9kZWxlZ2F0ZSA9IF9mcy5waHlzaWNhbC5lbnRpdHlGb3JVcmkodXJpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBleGlzdHMoKSBhc3luYyA9PiAoYXdhaXQgZGVsZWdhdGUpLmV4aXN0cygpOwoKICBAb3ZlcnJpZGUKICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkQXNCeXRlcygpIGFzeW5jID0+IChhd2FpdCBkZWxlZ2F0ZSkucmVhZEFzQnl0ZXMoKTsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPFN0cmluZz4gcmVhZEFzU3RyaW5nKCkgYXN5bmMgPT4gKGF3YWl0IGRlbGVnYXRlKS5yZWFkQXNTdHJpbmcoKTsKfQo8AE5OPAFNGyoBFQEsMzUBTz0vIR0BOD0BDCwtAgFKDDsRHh4BLgEwLTw7MyEaGAY3BAEMPAEMSwEMSgIBM3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9oeWJyaWRfZmlsZV9zeXN0ZW0uZGFydGxmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnSYyy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnJlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50LAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBJbnZhbGlkRXhwcmVzc2lvbiwKICAgICAgICBMZXQsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE51bGxMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgU3RyaW5nTGl0ZXJhbCwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IEVuc3VyZUxvYWRlZDsKCi8vLyBOYW1lIHVzZWQgZm9yIGEgc3RhdGljIGZpZWxkIGhvbGRpbmcgcmVkaXJlY3RpbmcgZmFjdG9yeSBpbmZvcm1hdGlvbi4KY29uc3QgU3RyaW5nIHJlZGlyZWN0aW5nTmFtZSA9ICJfcmVkaXJlY3RpbmcjIjsKCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbbWVtYmVyXSBpcyBzeW50aGVzaXplZCBmaWVsZCBob2xkaW5nIHRoZSBuYW1lcyBvZgovLy8gcmVkaXJlY3RpbmcgZmFjdG9yaWVzIGRlY2xhcmVkIGluIHRoZSBzYW1lIGNsYXNzLgovLy8KLy8vIFRoaXMgZmllbGQgc2hvdWxkIGJlIHNwZWNpYWwtY2FzZWQgYnkgYmFja2VuZHMuCmJvb2wgaXNSZWRpcmVjdGluZ0ZhY3RvcnlGaWVsZChNZW1iZXIgbWVtYmVyKSB7CiAgcmV0dXJuIG1lbWJlciBpcyBGaWVsZCAmJgogICAgICBtZW1iZXIuaXNTdGF0aWMgJiYKICAgICAgbWVtYmVyLm5hbWUubmFtZSA9PSByZWRpcmVjdGluZ05hbWU7Cn0KCi8vLyBOYW1lIHVzZWQgZm9yIGEgc3ludGhlc2l6ZWQgbGV0IHZhcmlhYmxlIHVzZWQgdG8gZW5jb2RlIHJlZGlyZWN0aW5nIGZhY3RvcnkKLy8vIGluZm9ybWF0aW9uIGluIGEgZmFjdG9yeSBtZXRob2QgYm9keS4KY29uc3QgU3RyaW5nIGxldE5hbWUgPSAiI3JlZGlyZWN0aW5nX2ZhY3RvcnkiOwoKY2xhc3MgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBleHRlbmRzIEV4cHJlc3Npb25TdGF0ZW1lbnQgewogIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkuaW50ZXJuYWwoRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAgW0xpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHNdKQogICAgICA6IHN1cGVyKG5ldyBMZXQobmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obGV0TmFtZSwgaW5pdGlhbGl6ZXI6IHZhbHVlKSwKICAgICAgICAgICAgZW5jb2RlVHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSkpOwoKICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KE1lbWJlciB0YXJnZXQsIFtMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzXSkKICAgICAgOiB0aGlzLmludGVybmFsKG5ldyBTdGF0aWNHZXQodGFyZ2V0KSwgdHlwZUFyZ3VtZW50cyk7CgogIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkudW5yZXNvbHZlZChTdHJpbmcgbmFtZSkKICAgICAgOiB0aGlzLmludGVybmFsKG5ldyBTdHJpbmdMaXRlcmFsKG5hbWUpKTsKCiAgTWVtYmVyIGdldCB0YXJnZXQgewogICAgZHluYW1pYyB2YWx1ZSA9IGdldFZhbHVlKGV4cHJlc3Npb24pOwogICAgcmV0dXJuIHZhbHVlIGlzIFN0YXRpY0dldCA/IHZhbHVlLnRhcmdldCA6IG51bGw7CiAgfQoKICBTdHJpbmcgZ2V0IHVucmVzb2x2ZWROYW1lIHsKICAgIGR5bmFtaWMgdmFsdWUgPSBnZXRWYWx1ZShleHByZXNzaW9uKTsKICAgIHJldHVybiB2YWx1ZSBpcyBTdHJpbmdMaXRlcmFsID8gdmFsdWUudmFsdWUgOiBudWxsOwogIH0KCiAgYm9vbCBnZXQgaXNVbnJlc29sdmVkID0+IHVucmVzb2x2ZWROYW1lICE9IG51bGw7CgogIExpc3Q8RGFydFR5cGU+IGdldCB0eXBlQXJndW1lbnRzIHsKICAgIGlmIChleHByZXNzaW9uIGlzIExldCkgewogICAgICBMZXQgYm9keUV4cHJlc3Npb24gPSBleHByZXNzaW9uOwogICAgICBpZiAoYm9keUV4cHJlc3Npb24udmFyaWFibGUubmFtZSA9PSBsZXROYW1lKSB7CiAgICAgICAgcmV0dXJuIGRlY29kZVR5cGVBcmd1bWVudHMoYm9keUV4cHJlc3Npb24uYm9keSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgc3RhdGljIGdldFZhbHVlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgaWYgKGV4cHJlc3Npb24gaXMgTGV0KSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBleHByZXNzaW9uLnZhcmlhYmxlOwogICAgICBpZiAodmFyaWFibGUubmFtZSA9PSBsZXROYW1lKSB7CiAgICAgICAgcmV0dXJuIHZhcmlhYmxlLmluaXRpYWxpemVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyB2b2lkIHJlc3RvcmVGcm9tRGlsbChQcm9jZWR1cmUgZmFjdG9yeSkgewogICAgLy8gVGhpcyBpcyBhIGhhY2sgLyB3b3JrIGFyb3VuZCBmb3Igc3RvcmluZyByZWRpcmVjdGluZyBjb25zdHJ1Y3RvcnMgaW4KICAgIC8vIGRpbGwgZmlsZXMuIFNlZSBgQ2xhc3NCdWlsZGVyLmFkZFJlZGlyZWN0aW5nQ29uc3RydWN0b3JgIGluCiAgICAvLyBba2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydF0oa2VybmVsX2NsYXNzX2J1aWxkZXIuZGFydCkuCiAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBmYWN0b3J5LmZ1bmN0aW9uOwogICAgRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSBmdW5jdGlvbi5ib2R5OwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50czsKICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiBpcyBMZXQpIHsKICAgICAgTGV0IGV4cHJlc3Npb24gPSBzdGF0ZW1lbnQuZXhwcmVzc2lvbjsKICAgICAgdHlwZUFyZ3VtZW50cyA9IGRlY29kZVR5cGVBcmd1bWVudHMoZXhwcmVzc2lvbi5ib2R5KTsKICAgIH0KICAgIGZ1bmN0aW9uLmJvZHkgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS5pbnRlcm5hbCgKICAgICAgICBnZXRWYWx1ZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiksIHR5cGVBcmd1bWVudHMpCiAgICAgIC4ucGFyZW50ID0gZnVuY3Rpb247CiAgfQoKICBzdGF0aWMgRXhwcmVzc2lvbiBlbmNvZGVUeXBlQXJndW1lbnRzKExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIFN0cmluZyB2YXJOYW1lUHJlZml4ID0gIiN0eXBlQXJnIjsKICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IEludmFsaWRFeHByZXNzaW9uKG51bGwpOwogICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZm9yIChpbnQgaSA9IHR5cGVBcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgcmVzdWx0ID0gbmV3IExldCgKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCIkdmFyTmFtZVByZWZpeCRpIiwKICAgICAgICAgICAgICB0eXBlOiB0eXBlQXJndW1lbnRzW2ldLCBpbml0aWFsaXplcjogbmV3IE51bGxMaXRlcmFsKCkpLAogICAgICAgICAgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgTGlzdDxEYXJ0VHlwZT4gZGVjb2RlVHlwZUFyZ3VtZW50cyhFeHByZXNzaW9uIGVuY29kZWQpIHsKICAgIGlmIChlbmNvZGVkIGlzIEludmFsaWRFeHByZXNzaW9uKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0gPERhcnRUeXBlPltdOwogICAgd2hpbGUgKGVuY29kZWQgaXMgTGV0KSB7CiAgICAgIExldCBoZWFkID0gZW5jb2RlZDsKICAgICAgcmVzdWx0LmFkZChoZWFkLnZhcmlhYmxlLnR5cGUpOwogICAgICBlbmNvZGVkID0gaGVhZC5ib2R5OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmJvb2wgaXNSZWRpcmVjdGluZ0ZhY3RvcnkoTWVtYmVyIG1lbWJlciwge0Vuc3VyZUxvYWRlZCBoZWxwZXJ9KSB7CiAgYXNzZXJ0KGhlbHBlciA9PSBudWxsIHx8IGhlbHBlci5pc0xvYWRlZChtZW1iZXIpKTsKICByZXR1cm4gbWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuZnVuY3Rpb24uYm9keSBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5Owp9CgpSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoTWVtYmVyIG1lbWJlcikgewogIHJldHVybiBpc1JlZGlyZWN0aW5nRmFjdG9yeShtZW1iZXIpID8gbWVtYmVyLmZ1bmN0aW9uLmJvZHkgOiBudWxsOwp9CgpjbGFzcyBSZWRpcmVjdGlvblRhcmdldCB7CiAgZmluYWwgTWVtYmVyIHRhcmdldDsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICBSZWRpcmVjdGlvblRhcmdldCh0aGlzLnRhcmdldCwgdGhpcy50eXBlQXJndW1lbnRzKTsKfQoKUmVkaXJlY3Rpb25UYXJnZXQgZ2V0UmVkaXJlY3Rpb25UYXJnZXQoUHJvY2VkdXJlIG1lbWJlciwgRW5zdXJlTG9hZGVkIGhlbHBlcikgewogIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSA8RGFydFR5cGU+W10uLmxlbmd0aCA9CiAgICAgIG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICB0eXBlQXJndW1lbnRzW2ldID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLndpdGhEZWZhdWx0TnVsbGFiaWxpdHlGb3JMaWJyYXJ5KAogICAgICAgIG1lbWJlci5mdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXSwgbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnkpOwogIH0KCiAgLy8gV2UgdXNlIHRoZSBbdG9ydG9pc2UgYW5kIGhhcmUgYWxnb3JpdGhtXQogIC8vIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeWNsZV9kZXRlY3Rpb24jVG9ydG9pc2VfYW5kX2hhcmUpIHRvCiAgLy8gaGFuZGxlIGN5Y2xlcy4KICBNZW1iZXIgdG9ydG9pc2UgPSBtZW1iZXI7CiAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSB0b3J0b2lzZUJvZHkgPSBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRvcnRvaXNlKTsKICBNZW1iZXIgaGFyZSA9IHRvcnRvaXNlQm9keT8udGFyZ2V0OwogIGhlbHBlci5lbnN1cmVMb2FkZWQoaGFyZSk7CiAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBoYXJlQm9keSA9IGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoaGFyZSk7CiAgd2hpbGUgKHRvcnRvaXNlICE9IGhhcmUpIHsKICAgIGlmICh0b3J0b2lzZUJvZHk/LmlzVW5yZXNvbHZlZCA/PyB0cnVlKSB7CiAgICAgIHJldHVybiBuZXcgUmVkaXJlY3Rpb25UYXJnZXQodG9ydG9pc2UsIHR5cGVBcmd1bWVudHMpOwogICAgfQogICAgTWVtYmVyIG5leHRUb3J0b2lzZSA9IHRvcnRvaXNlQm9keS50YXJnZXQ7CiAgICBoZWxwZXIuZW5zdXJlTG9hZGVkKG5leHRUb3J0b2lzZSk7CiAgICBMaXN0PERhcnRUeXBlPiBuZXh0VHlwZUFyZ3VtZW50cyA9IHRvcnRvaXNlQm9keS50eXBlQXJndW1lbnRzOwogICAgaWYgKG5leHRUeXBlQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgbmV4dFR5cGVBcmd1bWVudHMgPSA8RGFydFR5cGU+W107CiAgICB9CgogICAgU3Vic3RpdHV0aW9uIHN1YiA9CiAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyh0b3J0b2lzZS5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CiAgICB0eXBlQXJndW1lbnRzID0gPERhcnRUeXBlPltdLi5sZW5ndGggPSBuZXh0VHlwZUFyZ3VtZW50cy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHN1Yi5zdWJzdGl0dXRlVHlwZShuZXh0VHlwZUFyZ3VtZW50c1tpXSk7CiAgICB9CgogICAgdG9ydG9pc2UgPSBuZXh0VG9ydG9pc2U7CiAgICB0b3J0b2lzZUJvZHkgPSBnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRvcnRvaXNlKTsKICAgIGhlbHBlci5lbnN1cmVMb2FkZWQoaGFyZUJvZHk/LnRhcmdldCk7CiAgICBoYXJlID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShoYXJlQm9keT8udGFyZ2V0KT8udGFyZ2V0OwogICAgaGVscGVyLmVuc3VyZUxvYWRlZChoYXJlKTsKICAgIGhhcmVCb2R5ID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShoYXJlKTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KgMIATk48ASgBIQkSFB0PFhsNEBUTExcbHQE9AS4BSjABSTYENDAcGSsCAVAqLwE7NCZMMgFIPQExMAEWKjUEAR4qOAQBMwElHSc1OQgGEQQBKx06JiUIBhEEATNMQz8uMyInLTwGOTcbBAFIJzUhFQY6GDZHEwYTBAFCKBMGKh0aJhsGEwQCAUI1UAIBQkUCARoXJgE2AgFQOC0zT0UEAS5KFBxNJh1FHS49Bi8nQyUoBgEXUUU1QwYBHTgrQB8wBA8CAUBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0WWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0kxUvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAnZGFydDppbycgc2hvdyBCeXRlc0J1aWxkZXIsIEZpbGUsIElPU2luazsKCmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xvbmUuZGFydCcgc2hvdyBDbG9uZVZpc2l0b3JXaXRoTWVtYmVyczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29tcG9uZW50LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIExpYnJhcnksCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0JyBzaG93IEJpbmFyeVByaW50ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2JpbmFyeS9saW1pdGVkX2FzdF90b19iaW5hcnkuZGFydCcKICAgIHNob3cgTGltaXRlZEJpbmFyeVByaW50ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydCcgc2hvdyBQcmludGVyOwoKLy8vIFByaW50IHRoZSBnaXZlbiBbY29tcG9uZW50XS4gIERvIG5vdGhpbmcgaWYgaXQgaXMgYG51bGxgLiAgSWYgdGhlCi8vLyBbbGlicmFyeUZpbHRlcl0gaXMgcHJvdmlkZWQsIHRoZW4gb25seSBsaWJyYXJpZXMgdGhhdCBzYXRpc2Z5IGl0IGFyZQovLy8gcHJpbnRlZC4Kdm9pZCBwcmludENvbXBvbmVudFRleHQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtib29sIGxpYnJhcnlGaWx0ZXIoTGlicmFyeSBsaWJyYXJ5KX0pIHsKICBpZiAoY29tcG9uZW50ID09IG51bGwpIHJldHVybjsKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoc2IpOwogIHByaW50ZXIud3JpdGVDb21wb25lbnRQcm9ibGVtcyhjb21wb25lbnQpOwogIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgIGlmIChsaWJyYXJ5RmlsdGVyICE9IG51bGwgJiYgIWxpYnJhcnlGaWx0ZXIobGlicmFyeSkpIGNvbnRpbnVlOwogICAgcHJpbnRlci53cml0ZUxpYnJhcnlGaWxlKGxpYnJhcnkpOwogIH0KICBwcmludGVyLndyaXRlQ29uc3RhbnRUYWJsZShjb21wb25lbnQpOwogIHByaW50KHNiKTsKfQoKLy8vIFdyaXRlIFtjb21wb25lbnRdIHRvIGZpbGUgb25seSBpbmNsdWRpbmcgbGlicmFyaWVzIHRoYXQgbWF0Y2ggW2ZpbHRlcl0uCkZ1dHVyZTxOdWxsPiB3cml0ZUNvbXBvbmVudFRvRmlsZShDb21wb25lbnQgY29tcG9uZW50LCBVcmkgdXJpLAogICAge2Jvb2wgZmlsdGVyKExpYnJhcnkgbGlicmFyeSl9KSBhc3luYyB7CiAgRmlsZSBvdXRwdXQgPSBuZXcgRmlsZS5mcm9tVXJpKHVyaSk7CiAgSU9TaW5rIHNpbmsgPSBvdXRwdXQub3BlbldyaXRlKCk7CiAgdHJ5IHsKICAgIEJpbmFyeVByaW50ZXIgcHJpbnRlciA9IGZpbHRlciA9PSBudWxsCiAgICAgICAgPyBuZXcgQmluYXJ5UHJpbnRlcihzaW5rKQogICAgICAgIDogbmV3IExpbWl0ZWRCaW5hcnlQcmludGVyKHNpbmssIGZpbHRlciA/PyAoXykgPT4gdHJ1ZSwgZmFsc2UpOwogICAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICB9IGZpbmFsbHkgewogICAgYXdhaXQgc2luay5jbG9zZSgpOwogIH0KfQoKLy8vIFNlcmlhbGl6ZSB0aGUgbGlicmFyaWVzIGluIFtjb21wb25lbnRdIHRoYXQgbWF0Y2ggW2ZpbHRlcl0uClVpbnQ4TGlzdCBzZXJpYWxpemVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtib29sIGZpbHRlcihMaWJyYXJ5IGxpYnJhcnkpLAogICAgYm9vbCBpbmNsdWRlU291cmNlczogdHJ1ZSwKICAgIGJvb2wgaW5jbHVkZU9mZnNldHM6IHRydWV9KSB7CiAgQnl0ZVNpbmsgYnl0ZVNpbmsgPSBuZXcgQnl0ZVNpbmsoKTsKICBCaW5hcnlQcmludGVyIHByaW50ZXIgPSBmaWx0ZXIgPT0gbnVsbAogICAgICA/IG5ldyBCaW5hcnlQcmludGVyKGJ5dGVTaW5rLAogICAgICAgICAgaW5jbHVkZVNvdXJjZXM6IGluY2x1ZGVTb3VyY2VzLCBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMpCiAgICAgIDogbmV3IExpbWl0ZWRCaW5hcnlQcmludGVyKGJ5dGVTaW5rLCBmaWx0ZXIsICFpbmNsdWRlU291cmNlcywKICAgICAgICAgIGluY2x1ZGVPZmZzZXRzOiBpbmNsdWRlT2Zmc2V0cyk7CiAgcHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGUoY29tcG9uZW50KTsKICByZXR1cm4gYnl0ZVNpbmsuYnVpbGRlci50YWtlQnl0ZXMoKTsKfQoKY29uc3QgU3RyaW5nIGtEZWJ1Z0NsYXNzTmFtZSA9ICIjRGVidWdDbGFzcyI7CgpDb21wb25lbnQgY3JlYXRlRXhwcmVzc2lvbkV2YWx1YXRpb25Db21wb25lbnQoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogIExpYnJhcnkgcmVhbExpYnJhcnkgPSBwcm9jZWR1cmUuZW5jbG9zaW5nTGlicmFyeTsKCiAgTGlicmFyeSBmYWtlTGlicmFyeSA9IG5ldyBMaWJyYXJ5KG5ldyBVcmkoc2NoZW1lOiAnZXZhbHVhdGUnLCBwYXRoOiAnc291cmNlJykpCiAgICAuLnNldExhbmd1YWdlVmVyc2lvbigKICAgICAgICByZWFsTGlicmFyeS5sYW5ndWFnZVZlcnNpb25NYWpvciwgcmVhbExpYnJhcnkubGFuZ3VhZ2VWZXJzaW9uTWlub3IpOwoKICBpZiAocHJvY2VkdXJlLnBhcmVudCBpcyBDbGFzcykgewogICAgQ2xhc3MgcmVhbENsYXNzID0gcHJvY2VkdXJlLnBhcmVudDsKCiAgICBDbGFzcyBmYWtlQ2xhc3MgPSBuZXcgQ2xhc3MobmFtZToga0RlYnVnQ2xhc3NOYW1lKS4ucGFyZW50ID0gZmFrZUxpYnJhcnk7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcyA9CiAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIFR5cGVQYXJhbWV0ZXI+e307CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHR5cGVTdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtIGluIHJlYWxDbGFzcy50eXBlUGFyYW1ldGVycykgewogICAgICBUeXBlUGFyYW1ldGVyIG5ld05vZGUgPSBuZXcgVHlwZVBhcmFtZXRlcih0eXBlUGFyYW0ubmFtZSkKICAgICAgICAuLnBhcmVudCA9IGZha2VDbGFzczsKICAgICAgdHlwZVBhcmFtc1t0eXBlUGFyYW1dID0gbmV3Tm9kZTsKICAgICAgdHlwZVN1YnN0aXR1dGlvblt0eXBlUGFyYW1dID0KICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKHR5cGVQYXJhbSwgbmV3Tm9kZSk7CiAgICB9CiAgICBDbG9uZVZpc2l0b3JXaXRoTWVtYmVycyBjbG9uZXIgPSBuZXcgQ2xvbmVWaXNpdG9yV2l0aE1lbWJlcnMoCiAgICAgICAgdHlwZVN1YnN0aXR1dGlvbjogdHlwZVN1YnN0aXR1dGlvbiwgdHlwZVBhcmFtczogdHlwZVBhcmFtcyk7CgogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSBpbiByZWFsQ2xhc3MudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgZmFrZUNsYXNzLnR5cGVQYXJhbWV0ZXJzLmFkZCh0eXBlUGFyYW0uYWNjZXB0PFRyZWVOb2RlPihjbG9uZXIpKTsKICAgIH0KCiAgICBpZiAocmVhbENsYXNzLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIC8vIHN1cGVydHlwZSBpcyBudWxsIGZvciBPYmplY3QuCiAgICAgIGZha2VDbGFzcy5zdXBlcnR5cGUgPSBuZXcgU3VwZXJ0eXBlLmJ5UmVmZXJlbmNlKAogICAgICAgICAgcmVhbENsYXNzLnN1cGVydHlwZS5jbGFzc05hbWUsCiAgICAgICAgICByZWFsQ2xhc3Muc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMubWFwKGNsb25lci52aXNpdFR5cGUpLnRvTGlzdCgpKTsKICAgIH0KCiAgICAvLyBSZWJpbmQgdGhlIHR5cGUgcGFyYW1ldGVycyBpbiB0aGUgcHJvY2VkdXJlLgogICAgcHJvY2VkdXJlID0gY2xvbmVyLmNsb25lUHJvY2VkdXJlKHByb2NlZHVyZSwgbnVsbCk7CiAgICBwcm9jZWR1cmUucGFyZW50ID0gZmFrZUNsYXNzOwogICAgZmFrZUNsYXNzLnByb2NlZHVyZXMuYWRkKHByb2NlZHVyZSk7CiAgICBmYWtlTGlicmFyeS5jbGFzc2VzLmFkZChmYWtlQ2xhc3MpOwogIH0gZWxzZSB7CiAgICBmYWtlTGlicmFyeS5wcm9jZWR1cmVzLmFkZChwcm9jZWR1cmUpOwogICAgcHJvY2VkdXJlLnBhcmVudCA9IGZha2VMaWJyYXJ5OwogIH0KCiAgLy8gVE9ETyh2ZWdvcm92KSBmaW5kIGEgd2F5IHRvIHByZXNlcnZlIG1ldGFkYXRhLgogIHJldHVybiBuZXcgQ29tcG9uZW50KGxpYnJhcmllczogW2Zha2VMaWJyYXJ5XSk7Cn0KCkxpc3Q8aW50PiBzZXJpYWxpemVQcm9jZWR1cmUoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogIHJldHVybiBzZXJpYWxpemVDb21wb25lbnQoY3JlYXRlRXhwcmVzc2lvbkV2YWx1YXRpb25Db21wb25lbnQocHJvY2VkdXJlKSk7Cn0KCi8vLyBBIFtTaW5rXSB0aGF0IGRpcmVjdGx5IHdyaXRlcyBkYXRhIGludG8gYSBieXRlIGJ1aWxkZXIuCmNsYXNzIEJ5dGVTaW5rIGltcGxlbWVudHMgU2luazxMaXN0PGludD4+IHsKICBmaW5hbCBCeXRlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoKTsKCiAgdm9pZCBhZGQoTGlzdDxpbnQ+IGRhdGEpIHsKICAgIGJ1aWxkZXIuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHt9Cn0KgJEATk48ASEBMgEpAUEBIQkPExIRExMSFxsBRgE6HwE8AUZJDS0tISglLTFEJwQpDQIBTEAsJyQIKyJIKw4YBAIBQDIjHyImKSRKRCspJwIBLgFFNAFRGk0BIygBTjMqUUBAHickRgZCRQFASAYBJyc3KU0GATQ4IikoCyskBAE0MgIBNE0CATwsMwEdFwQBEgIBLXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdXRpbHMuZGFydF5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9yZXNvbHZlX2lucHV0X3VyaS5kYXJ0hBIvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvcmVsYXRpdml6ZS5kYXJ0JzsKClVyaSByZXNvbHZlSW5wdXRVcmkoU3RyaW5nIHBhdGgpIHsKICBVcmkgdXJpOwogIGlmIChwYXRoLmluZGV4T2YoIjoiKSA9PSAtMSkgewogICAgdXJpID0gbmV3IFVyaS5maWxlKHBhdGgsIHdpbmRvd3M6IGlzV2luZG93cyk7CiAgfSBlbHNlIGlmICghaXNXaW5kb3dzKSB7CiAgICB1cmkgPSBwYXJzZVVyaShwYXRoKTsKICB9IGVsc2UgewogICAgdXJpID0gcmVzb2x2ZUFtYmlndW91c1dpbmRvd3NQYXRoKHBhdGgpOwogIH0KICByZXR1cm4gVXJpLmJhc2UucmVzb2x2ZVVyaSh1cmkpOwp9CgpVcmkgcGFyc2VVcmkoU3RyaW5nIHBhdGgpIHsKICBpZiAocGF0aC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CiAgICBpZiAoVXJpLmJhc2Uuc2NoZW1lID09ICJmaWxlIikgewogICAgICAvLyBUaGUgVXJpIGNsYXNzIGRvZXNuJ3QgaGFuZGxlIHJlbGF0aXZlIGZpbGUgVVJJcyBjb3JyZWN0bHksIHRoZQogICAgICAvLyBmb2xsb3dpbmcgd29ya3MgYXJvdW5kIHRoYXQgaXNzdWUuCiAgICAgIHJldHVybiBuZXcgVXJpKHBhdGg6IFVyaS5wYXJzZSgieC0kcGF0aCIpLnBhdGgpOwogICAgfQogIH0KICByZXR1cm4gVXJpLnBhcnNlKHBhdGgpOwp9CgpVcmkgcmVzb2x2ZUFtYmlndW91c1dpbmRvd3NQYXRoKFN0cmluZyBwYXRoKSB7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVXJpLmZpbGUocGF0aCwgd2luZG93czogaXNXaW5kb3dzKTsKICB9IG9uIEFyZ3VtZW50RXJyb3IgY2F0Y2ggKF8pIHsKICAgIHJldHVybiBwYXJzZVVyaShwYXRoKTsKICB9Cn0KJgBOTjwBPwEjCyEyGxoLLQQjAgEcIiVILDcGBBoCAS8IMyEbBAIBMnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9yZXNvbHZlX2lucHV0X3VyaS5kYXJ0UmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvc3JjL25uYmRfdG9wX21lcmdlLmRhcnSOBy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAnLi4vYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAnLi4vY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAnbWVyZ2VfdmlzaXRvci5kYXJ0JzsKCi8vLyBSZXR1cm5zIHRoZSBOTkJEX1RPUF9NRVJHRSBvZiBbYV0gYW5kIFtiXS4gSWYgW2FdIGFuZCBbYl0gaGF2ZSBubyBkZWZpbmVkCi8vLyBOTkJEX1RPUF9NRVJHRSBgbnVsbGAgaXMgcmV0dXJuZWQuClN1cGVydHlwZSBubmJkVG9wTWVyZ2VTdXBlcnR5cGUoQ29yZVR5cGVzIGNvcmVUeXBlcywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgYXNzZXJ0KGEuY2xhc3NOb2RlID09IGIuY2xhc3NOb2RlKTsKICBpZiAoYS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgIHJldHVybiBhOwogIH0KICBMaXN0PERhcnRUeXBlPiBuZXdUeXBlQXJndW1lbnRzID0gbmV3IExpc3Q8RGFydFR5cGU+KGEudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYS50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICBEYXJ0VHlwZSBuZXdUeXBlQXJndW1lbnQgPQogICAgICAgIG5uYmRUb3BNZXJnZShjb3JlVHlwZXMsIGEudHlwZUFyZ3VtZW50c1tpXSwgYi50eXBlQXJndW1lbnRzW2ldKTsKICAgIGlmIChuZXdUeXBlQXJndW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gbmV3VHlwZUFyZ3VtZW50OwogIH0KICByZXR1cm4gbmV3IFN1cGVydHlwZShhLmNsYXNzTm9kZSwgbmV3VHlwZUFyZ3VtZW50cyk7Cn0KCi8vLyBSZXR1cm5zIHRoZSBOTkJEX1RPUF9NRVJHRSBvZiBbYV0gYW5kIFtiXS4gSWYgW2FdIGFuZCBbYl0gaGF2ZSBubyBkZWZpbmVkCi8vLyBOTkJEX1RPUF9NRVJHRSBgbnVsbGAgaXMgcmV0dXJuZWQuCkRhcnRUeXBlIG5uYmRUb3BNZXJnZShDb3JlVHlwZXMgY29yZVR5cGVzLCBEYXJ0VHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgaWYgKGEgPT0gYikgcmV0dXJuIGE7CiAgcmV0dXJuIGEuYWNjZXB0MShuZXcgTm5iZFRvcE1lcmdlVmlzaXRvcihjb3JlVHlwZXMpLCBiKTsKfQoKY2xhc3MgTm5iZFRvcE1lcmdlVmlzaXRvciBleHRlbmRzIE1lcmdlVmlzaXRvciB7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgTm5iZFRvcE1lcmdlVmlzaXRvcih0aGlzLmNvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IG1lcmdlTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgYSwgTnVsbGFiaWxpdHkgYikgewogICAgaWYgKGEgPT0gYikgewogICAgICByZXR1cm4gYTsKICAgIH0gZWxzZSBpZiAoYSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgcmV0dXJuIGI7CiAgICB9IGVsc2UgaWYgKGIgPT0gTnVsbGFiaWxpdHkubGVnYWN5KSB7CiAgICAgIHJldHVybiBhOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICBpZiAoYSA9PSBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlKSB7CiAgICAgIGlmIChiIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgLy8gTk5CRF9UT1BfTUVSR0UoT2JqZWN0PywgZHluYW1pYykgPSBPYmplY3Q/CiAgICAgICAgcmV0dXJuIGNvcmVUeXBlcy5vYmplY3ROdWxsYWJsZVJhd1R5cGU7CiAgICAgIH0gZWxzZSBpZiAoYiBpcyBWb2lkVHlwZSkgewogICAgICAgIC8vIE5OQkRfVE9QX01FUkdFKE9iamVjdD8sIHZvaWQpID0gdm9pZAogICAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgICB9IGVsc2UgaWYgKGIgPT0gY29yZVR5cGVzLm9iamVjdE51bGxhYmxlUmF3VHlwZSkgewogICAgICAgIC8vIE5OQkRfVE9QX01FUkdFKE9iamVjdD8sIE9iamVjdD8pID0gT2JqZWN0PwogICAgICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGEgPT0gY29yZVR5cGVzLm51bGxUeXBlICYmCiAgICAgICAgYiBpcyBOZXZlclR5cGUgJiYKICAgICAgICBiLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgewogICAgICAvLyBOTkJEX1RPUF9NRVJHRShOdWxsLCBOZXZlciopID0gTnVsbAogICAgICByZXR1cm4gY29yZVR5cGVzLm51bGxUeXBlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0SW50ZXJmYWNlVHlwZShhLCBiKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgYSwgRGFydFR5cGUgYikgewogICAgaWYgKGIgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgLy8gTk5CRF9UT1BfTUVSR0Uodm9pZCwgZHluYW1pYykgPSB2b2lkCiAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgfSBlbHNlIGlmIChiIGlzIFZvaWRUeXBlKSB7CiAgICAgIC8vIE5OQkRfVE9QX01FUkdFKHZvaWQsIHZvaWQpID0gdm9pZAogICAgICByZXR1cm4gY29uc3QgVm9pZFR5cGUoKTsKICAgIH0gZWxzZSBpZiAoYiA9PSBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlKSB7CiAgICAgIC8vIE5OQkRfVE9QX01FUkdFKHZvaWQsIE9iamVjdD8pID0gdm9pZAogICAgICByZXR1cm4gY29uc3QgVm9pZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICBpZiAoYiBpcyBEeW5hbWljVHlwZSkgewogICAgICAvLyBOTkJEX1RPUF9NRVJHRShkeW5hbWljLCBkeW5hbWljKSA9IGR5bmFtaWMKICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgaWYgKGIgaXMgVm9pZFR5cGUpIHsKICAgICAgLy8gTk5CRF9UT1BfTUVSR0UoZHluYW1pYywgdm9pZCkgPSB2b2lkCiAgICAgIHJldHVybiBjb25zdCBWb2lkVHlwZSgpOwogICAgfSBlbHNlIGlmIChiID09IGNvcmVUeXBlcy5vYmplY3ROdWxsYWJsZVJhd1R5cGUpIHsKICAgICAgLy8gTk5CRF9UT1BfTUVSR0UoT2JqZWN0PywgZHluYW1pYykgPSBPYmplY3Q/CiAgICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgYSwgRGFydFR5cGUgYikgewogICAgaWYgKGEubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5ICYmIGIgPT0gY29yZVR5cGVzLm51bGxUeXBlKSB7CiAgICAgIC8vIE5OQkRfVE9QX01FUkdFKE5ldmVyKiwgTnVsbCkgPSBOdWxsCiAgICAgIHJldHVybiBjb3JlVHlwZXMubnVsbFR5cGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXROZXZlclR5cGUoYSwgYik7CiAgfQp9CnEATU4/ASQdAR0BTidRJiEOBFA1H0kuKwQ3AgFOJ0UYOwIBMR0BJwEMPxIQKhAqEAYRBAEMPTAeNjAiMCE5NjAIKhovLSEGKwQBDDMcLh8gKx83Lh8GEQQBDDkcNCIgLh83NC4GEQQBDDVKLSEGJwQCASZwYWNrYWdlOmtlcm5lbC9zcmMvbm5iZF90b3BfbWVyZ2UuZGFydExmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3R5cGVfYWxnZWJyYS5kYXJ0wACCji8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLnR5cGVfYWxnZWJyYTsKCmltcG9ydCAnYXN0LmRhcnQnOwoKLy8vIFJldHVybnMgYSB0eXBlIHdoZXJlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBwYXJhbWV0ZXJzIGhhdmUgYmVlbgovLy8gcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0eXBlcy4KLy8vCi8vLyBUaGlzIHdpbGwgY29weSBvbmx5IHRoZSBzdWJ0ZXJtcyBvZiBbdHlwZV0gdGhhdCBjb250YWluIHN1YnN0aXR1dGVkCi8vLyB2YXJpYWJsZXM7IGFsbCBvdGhlciBbRGFydFR5cGVdIG9iamVjdHMgd2lsbCBiZSByZXVzZWQuCi8vLwovLy8gSW4gcGFydGljdWxhciwgaWYgbm8gdmFyaWFibGVzIHdlcmUgc3Vic3RpdHV0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0bwovLy8gcmV0dXJuIHRoZSBbdHlwZV0gaW5zdGFuY2UgKG5vdCBhIGNvcHkpLCBzbyB0aGUgY2FsbGVyIG1heSB1c2UgW2lkZW50aWNhbF0KLy8vIHRvIGVmZmljaWVudGx5IGNoZWNrIGlmIGEgZGlzdGluY3QgdHlwZSB3YXMgY3JlYXRlZC4KRGFydFR5cGUgc3Vic3RpdHV0ZShEYXJ0VHlwZSB0eXBlLCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbikgewogIGlmIChzdWJzdGl0dXRpb24uaXNFbXB0eSkgcmV0dXJuIHR5cGU7CiAgcmV0dXJuIFN1YnN0aXR1dGlvbi5mcm9tTWFwKHN1YnN0aXR1dGlvbikuc3Vic3RpdHV0ZVR5cGUodHlwZSk7Cn0KCi8vLyBSZXR1cm5zIGEgbWFwcGluZyBmcm9tIHRoZSB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgb24gdGhlIGNsYXNzIG9mIFt0eXBlXQovLy8gdG8gdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCBpbiBbdHlwZV0uCi8vLwovLy8gVGhpcyBjYW4gYmUgcGFzc2VkIGFzIGFyZ3VtZW50IHRvIFtzdWJzdGl0dXRlXS4KTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBnZXRTdWJzdGl0dXRpb25NYXAoU3VwZXJ0eXBlIHR5cGUpIHsKICByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkKICAgICAgPyBjb25zdCA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e30KICAgICAgOiBuZXcgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPi5mcm9tSXRlcmFibGVzKAogICAgICAgICAgdHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMsIHR5cGUudHlwZUFyZ3VtZW50cyk7Cn0KCk1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZ2V0VXBwZXJCb3VuZFN1YnN0aXR1dGlvbk1hcChDbGFzcyBob3N0KSB7CiAgaWYgKGhvc3QudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICB2YXIgcmVzdWx0ID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogIGZvciAodmFyIHBhcmFtZXRlciBpbiBob3N0LnR5cGVQYXJhbWV0ZXJzKSB7CiAgICByZXN1bHRbcGFyYW1ldGVyXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQogIGZvciAodmFyIHBhcmFtZXRlciBpbiBob3N0LnR5cGVQYXJhbWV0ZXJzKSB7CiAgICByZXN1bHRbcGFyYW1ldGVyXSA9IHN1YnN0aXR1dGUocGFyYW1ldGVyLmJvdW5kLCByZXN1bHQpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CgovLy8gTGlrZSBbc3Vic3RpdHV0ZV0sIGV4Y2VwdCB3aGVuIGEgdHlwZSBpbiB0aGUgW3N1YnN0aXR1dGlvbl0gbWFwIHJlZmVyZW5jZXMKLy8vIGFub3RoZXIgc3Vic3RpdHV0ZWQgdHlwZSB2YXJpYWJsZSwgdGhlIG1hcHBpbmcgZm9yIHRoYXQgdHlwZSBpcyByZWN1cnNpdmVseQovLy8gaW5zZXJ0ZWQuCi8vLwovLy8gRm9yIGV4YW1wbGUgYFNldDxHPmAgc3Vic3RpdHV0ZWQgd2l0aCBge1QgLT4gU3RyaW5nLCBHIC0+IExpc3Q8VD59YCByZXN1bHRzCi8vLyBpbiBgU2V0PExpc3Q8U3RyaW5nPj5gLgovLy8KLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBzdWJzdGl0dXRpb24gbWFwIGNvbnRhaW5zIGEgY3ljbGUgcmVhY2hhYmxlIGZyb20gYQovLy8gdHlwZSB2YXJpYWJsZSBpbiBbdHlwZV0gKHRoZSByZXN1bHRpbmcgdHlwZSB3b3VsZCBiZSBpbmZpbml0ZSkuCi8vLwovLy8gVGhlIFtzdWJzdGl0dXRpb25dIG1hcCB3aWxsIGJlIG11dGF0ZWQgc28gdGhhdCB0aGUgcmlnaHQtaGFuZCBzaWRlcyBtYXkKLy8vIGJlIHJlbWFwcGVkIHRvIHRoZSBkZWVwbHkgc3Vic3RpdHV0ZWQgdHlwZSwgYnV0IG9ubHkgZm9yIHRoZSBrZXlzIHRoYXQgYXJlCi8vLyByZWFjaGFibGUgZnJvbSBbdHlwZV0uCi8vLwovLy8gQXMgd2l0aCBbc3Vic3RpdHV0ZV0sIHRoaXMgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UgaWYgbm8KLy8vIHN1YnN0aXR1dGlvbiB3YXMgcGVyZm9ybWVkLgpEYXJ0VHlwZSBzdWJzdGl0dXRlRGVlcCgKICAgIERhcnRUeXBlIHR5cGUsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uKSB7CiAgaWYgKHN1YnN0aXR1dGlvbi5pc0VtcHR5KSByZXR1cm4gdHlwZTsKICB2YXIgc3Vic3RpdHV0b3IgPSBuZXcgX0RlZXBUeXBlU3Vic3RpdHV0b3Ioc3Vic3RpdHV0aW9uKTsKICB2YXIgcmVzdWx0ID0gc3Vic3RpdHV0b3IudmlzaXQodHlwZSk7CiAgcmV0dXJuIHN1YnN0aXR1dG9yLmlzSW5maW5pdGUgPyBudWxsIDogcmVzdWx0Owp9CgovLy8gUmV0dXJucyB0cnVlIGlmIFt0eXBlXSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGdpdmVuIFt2YXJpYWJsZXNdLgovLy8KLy8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIGEgW3R5cGVdIHRoYXQgY29udGFpbnMgYSBbRnVuY3Rpb25UeXBlXQovLy8gdGhhdCBkZWNsYXJlcyBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaW4gW3ZhcmlhYmxlc10uCmJvb2wgY29udGFpbnNUeXBlVmFyaWFibGUoRGFydFR5cGUgdHlwZSwgU2V0PFR5cGVQYXJhbWV0ZXI+IHZhcmlhYmxlcykgewogIGlmICh2YXJpYWJsZXMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBuZXcgX09jY3VycmVuY2VWaXNpdG9yKHZhcmlhYmxlcykudmlzaXQodHlwZSk7Cn0KCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdHlwZV0gY29udGFpbnMgYW55IGZyZWUgdHlwZSB2YXJpYWJsZXMsIHRoYXQgaXMsIHR5cGUKLy8vIHZhcmlhYmxlIGZvciBmdW5jdGlvbiB0eXBlcyB3aG9zZSBmdW5jdGlvbiB0eXBlIGlzIHBhcnQgb2YgW3R5cGVdLgpib29sIGNvbnRhaW5zRnJlZUZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIG5ldyBfRnJlZUZ1bmN0aW9uVHlwZVZhcmlhYmxlVmlzaXRvcigpLnZpc2l0KHR5cGUpOwp9CgovLy8gR2l2ZW4gYSBzZXQgb2YgdHlwZSB2YXJpYWJsZXMsIGZpbmRzIGEgc3Vic3RpdHV0aW9uIG9mIHRob3NlIHZhcmlhYmxlcyBzdWNoCi8vLyB0aGF0IHRoZSB0d28gZ2l2ZW4gdHlwZXMgYmVjb21lcyBlcXVhbCwgb3IgcmV0dXJucyBgbnVsbGAgaWYgbm8gc3VjaAovLy8gc3Vic3RpdHV0aW9uIGV4aXN0cy4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgdW5pZnlpbmcgYExpc3Q8VD5gIHdpdGggYExpc3Q8U3RyaW5nPmAsIHdoZXJlIGBUYCBpcyBhCi8vLyBxdWFudGlmaWVkIHZhcmlhYmxlLCB5aWVsZHMgdGhlIHN1YnN0aXR1dGlvbiBgVCA9IFN0cmluZ2AuCi8vLwovLy8gSWYgc3VjY2Vzc2Z1bCwgdGhpcyBlcXVhdGlvbiBob2xkczoKLy8vCi8vLyAgICAgc3Vic3RpdHV0ZSh0eXBlMSwgc3Vic3RpdHV0aW9uKSA9PSBzdWJzdGl0dXRlKHR5cGUyLCBzdWJzdGl0dXRpb24pCi8vLwovLy8gVGhlIHVuaWZpY2F0aW9uIGNhbiBmYWlsIGZvciB0d28gcmVhc29uczoKLy8vIC0gaW5jb21wYXRpYmxlIHR5cGVzLCBlLmcuIGBMaXN0PFQ+YCBjYW5ub3QgYmUgdW5pZmllZCB3aXRoIGBTZXQ8VD5gLgovLy8gLSBpbmZpbml0ZSB0eXBlczogZS5nLiBgVGAgY2Fubm90IGJlIHVuaWZpZWQgd2l0aCBgTGlzdDxUPmAgYmVjYXVzZSBpdAovLy8gICB3b3VsZCBjcmVhdGUgdGhlIGluZmluaXRlIHR5cGUgYExpc3Q8TGlzdDxMaXN0PC4uLj4+PmAuCk1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdW5pZnlUeXBlcygKICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMiwgU2V0PFR5cGVQYXJhbWV0ZXI+IHF1YW50aWZpZWRWYXJpYWJsZXMpIHsKICB2YXIgdW5pZmllciA9IG5ldyBfVHlwZVVuaWZpY2F0aW9uKHR5cGUxLCB0eXBlMiwgcXVhbnRpZmllZFZhcmlhYmxlcyk7CiAgcmV0dXJuIHVuaWZpZXIuc3VjY2VzcyA/IHVuaWZpZXIuc3Vic3RpdHV0aW9uIDogbnVsbDsKfQoKLy8vIEdlbmVyYXRlcyBhIGZyZXNoIGNvcHkgb2YgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVycywgd2l0aCB0aGVpciBib3VuZHMKLy8vIHN1YnN0aXR1dGVkIHRvIHJlZmVyZW5jZSB0aGUgbmV3IHBhcmFtZXRlcnMuCi8vLwovLy8gVGhlIHJldHVybmVkIG9iamVjdCBjb250YWlucyB0aGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXIgbGlzdCBhcyB3ZWxsIGFzIGEKLy8vIG1hcHBpbmcgdG8gYmUgdXNlZCBmb3IgcmVwbGFjaW5nIG90aGVyIHR5cGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgcGFyYW1ldGVycy4KRnJlc2hUeXBlUGFyYW1ldGVycyBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICB2YXIgZnJlc2hQYXJhbWV0ZXJzID0gbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZ2VuZXJhdGUoCiAgICAgIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgKGkpID0+IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXJzW2ldLm5hbWUpLAogICAgICBncm93YWJsZTogdHJ1ZSk7CiAgdmFyIG1hcCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICBtYXBbdHlwZVBhcmFtZXRlcnNbaV1dID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcoCiAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0sIGZyZXNoUGFyYW1ldGVyc1tpXSk7CiAgfQogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXJzW2ldOwogICAgVHlwZVBhcmFtZXRlciBmcmVzaFR5cGVQYXJhbWV0ZXIgPSBmcmVzaFBhcmFtZXRlcnNbaV07CgogICAgZnJlc2hUeXBlUGFyYW1ldGVyLmJvdW5kID0gc3Vic3RpdHV0ZSh0eXBlUGFyYW1ldGVyLmJvdW5kLCBtYXApOwogICAgZnJlc2hUeXBlUGFyYW1ldGVyLmRlZmF1bHRUeXBlID0gdHlwZVBhcmFtZXRlci5kZWZhdWx0VHlwZSAhPSBudWxsCiAgICAgICAgPyBzdWJzdGl0dXRlKHR5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGUsIG1hcCkKICAgICAgICA6IG51bGw7CiAgICBmcmVzaFR5cGVQYXJhbWV0ZXIudmFyaWFuY2UgPQogICAgICAgIHR5cGVQYXJhbWV0ZXIuaXNMZWdhY3lDb3ZhcmlhbnQgPyBudWxsIDogdHlwZVBhcmFtZXRlci52YXJpYW5jZTsKICAgIC8vIEFubm90YXRpb25zIG9uIGEgdHlwZSBwYXJhbWV0ZXIgYXJlIHNwZWNpZmljIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUKICAgIC8vIHR5cGUgcGFyYW1ldGVyLCByYXRoZXIgdGhhbiB0aGUgdHlwZSBwYXJhbWV0ZXIgYXMgc3VjaCwgYW5kIHRoZXJlZm9yZQogICAgLy8gc2hvdWxkIG5vdCBiZSBjb3BpZWQgaGVyZS4KICB9CiAgcmV0dXJuIG5ldyBGcmVzaFR5cGVQYXJhbWV0ZXJzKGZyZXNoUGFyYW1ldGVycywgU3Vic3RpdHV0aW9uLmZyb21NYXAobWFwKSk7Cn0KCmNsYXNzIEZyZXNoVHlwZVBhcmFtZXRlcnMgewogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gZnJlc2hUeXBlUGFyYW1ldGVyczsKICBmaW5hbCBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwoKICBGcmVzaFR5cGVQYXJhbWV0ZXJzKHRoaXMuZnJlc2hUeXBlUGFyYW1ldGVycywgdGhpcy5zdWJzdGl0dXRpb24pOwoKICBGdW5jdGlvblR5cGUgYXBwbHlUb0Z1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgdHlwZSkgPT4gbmV3IEZ1bmN0aW9uVHlwZSgKICAgICAgdHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5tYXAoc3Vic3RpdHV0ZSkudG9MaXN0KCksCiAgICAgIHN1YnN0aXR1dGUodHlwZS5yZXR1cm5UeXBlKSwKICAgICAgdHlwZS5udWxsYWJpbGl0eSwKICAgICAgbmFtZWRQYXJhbWV0ZXJzOiB0eXBlLm5hbWVkUGFyYW1ldGVycy5tYXAoc3Vic3RpdHV0ZU5hbWVkKS50b0xpc3QoKSwKICAgICAgdHlwZVBhcmFtZXRlcnM6IGZyZXNoVHlwZVBhcmFtZXRlcnMsCiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgdHlwZWRlZlR5cGU6CiAgICAgICAgICB0eXBlLnR5cGVkZWZUeXBlID09IG51bGwgPyBudWxsIDogc3Vic3RpdHV0ZSh0eXBlLnR5cGVkZWZUeXBlKSk7CgogIERhcnRUeXBlIHN1YnN0aXR1dGUoRGFydFR5cGUgdHlwZSkgPT4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwoKICBOYW1lZFR5cGUgc3Vic3RpdHV0ZU5hbWVkKE5hbWVkVHlwZSB0eXBlKSA9PgogICAgICBuZXcgTmFtZWRUeXBlKHR5cGUubmFtZSwgc3Vic3RpdHV0ZSh0eXBlLnR5cGUpLAogICAgICAgICAgaXNSZXF1aXJlZDogdHlwZS5pc1JlcXVpcmVkKTsKCiAgU3VwZXJ0eXBlIHN1YnN0aXR1dGVTdXBlcihTdXBlcnR5cGUgdHlwZSkgewogICAgcmV0dXJuIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKHR5cGUpOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QTEVNRU5UQVRJT04KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphYnN0cmFjdCBjbGFzcyBTdWJzdGl0dXRpb24gewogIGNvbnN0IFN1YnN0aXR1dGlvbigpOwoKICBzdGF0aWMgY29uc3QgU3Vic3RpdHV0aW9uIGVtcHR5ID0gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CgogIC8vLyBTdWJzdGl0dXRlcyBlYWNoIHBhcmFtZXRlciB0byB0aGUgdHlwZSBpdCBtYXBzIHRvIGluIFttYXBdLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbU1hcChNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IG1hcCkgewogICAgaWYgKG1hcC5pc0VtcHR5KSByZXR1cm4gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CiAgICByZXR1cm4gbmV3IF9NYXBTdWJzdGl0dXRpb24obWFwLCBtYXApOwogIH0KCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBmaWx0ZXJlZChTdWJzdGl0dXRpb24gc3ViLCBUeXBlUGFyYW1ldGVyRmlsdGVyIGZpbHRlcikgewogICAgcmV0dXJuIG5ldyBfRmlsdGVyZWRTdWJzdGl0dXRpb24oc3ViLCBmaWx0ZXIpOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBwYXJhbWV0ZXJzIHdpdGggdGhlCiAgLy8vIGNvcnJlc3BvbmRpbmcgdXBwZXIgb3IgbG93ZXIgYm91bmQsIGRlcGVuZGluZyBvbiB0aGUgdmFyaWFuY2Ugb2YgdGhlCiAgLy8vIGNvbnRleHQgd2hlcmUgaXQgb2NjdXJzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSB0aGUgdHlwZSBgKFQpID0+IFRgIHdpdGggdGhlIGJvdW5kcyBgYm90dG9tIDw6IFQgPDogbnVtYAogIC8vLyBiZWNvbWVzIGAoYm90dG9tKSA9PiBudW1gIChpbiB0aGlzIGV4YW1wbGUsIGBudW1gIGlzIHRoZSB1cHBlciBib3VuZCwKICAvLy8gYW5kIGBib3R0b21gIGlzIHRoZSBsb3dlciBib3VuZCkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSB3YXkgdG8gb2J0YWluIGFuIHVwcGVyIGJvdW5kIGZvciBhIHR5cGUgd2hpbGUgZWxpbWluYXRpbmcgYWxsCiAgLy8vIHJlZmVyZW5jZXMgdG8gY2VydGFpbiB0eXBlIHZhcmlhYmxlcy4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZyb21VcHBlckFuZExvd2VyQm91bmRzKAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHVwcGVyLCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGxvd2VyKSB7CiAgICBpZiAodXBwZXIuaXNFbXB0eSAmJiBsb3dlci5pc0VtcHR5KSByZXR1cm4gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CiAgICByZXR1cm4gbmV3IF9NYXBTdWJzdGl0dXRpb24odXBwZXIsIGxvd2VyKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRoZSBjbGFzcyBvZiBbc3VwZXJ0eXBlXSB3aXRoIHRoZQogIC8vLyB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCBpbiBbc3VwZXJ0eXBlXS4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZyb21TdXBlcnR5cGUoU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogICAgaWYgKHN1cGVydHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBmcm9tTWFwKG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXMoCiAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycywgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMpKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRoZSBjbGFzcyBvZiBbdHlwZV0gd2l0aCB0aGUKICAvLy8gdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQgaW4gW3R5cGVdLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gZnJvbUludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBmcm9tTWFwKG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXMoCiAgICAgICAgdHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMsIHR5cGUudHlwZUFyZ3VtZW50cykpOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIHRoZSB0eXBlIHBhcmFtZXRlcnMgb24gdGhlIHR5cGVkZWYgb2YgW3R5cGVdIHdpdGggdGhlCiAgLy8vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkIGluIFt0eXBlXS4KICBzdGF0aWMgU3Vic3RpdHV0aW9uIGZyb21UeXBlZGVmVHlwZShUeXBlZGVmVHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybiBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZTsKICAgIHJldHVybiBmcm9tTWFwKG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXMoCiAgICAgICAgdHlwZS50eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVycywgdHlwZS50eXBlQXJndW1lbnRzKSk7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgdGhlIE50aCBwYXJhbWV0ZXIgaW4gW3BhcmFtZXRlcnNdIHdpdGggdGhlIE50aCB0eXBlIGluCiAgLy8vIFt0eXBlc10uCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBmcm9tUGFpcnMoCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycywgTGlzdDxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgIC8vIFRPRE8oYXNnZXJmKTogSW52ZXN0aWdhdGUgaWYgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gaW1wbGVtZW50CiAgICAvLyBzdWJzdGl0dXRpb24gYmFzZWQgb24gcGFyYWxsZWwgcGFpcndpc2UgbGlzdHMgaW5zdGVhZCBvZiBNYXBzLgogICAgYXNzZXJ0KHBhcmFtZXRlcnMubGVuZ3RoID09IHR5cGVzLmxlbmd0aCk7CiAgICBpZiAocGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CiAgICByZXR1cm4gZnJvbU1hcCgKICAgICAgICBuZXcgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPi5mcm9tSXRlcmFibGVzKHBhcmFtZXRlcnMsIHR5cGVzKSk7CiAgfQoKICAvLy8gU3Vic3RpdHV0ZXMgdGhlIHR5cGUgcGFyYW1ldGVycyBvbiB0aGUgY2xhc3Mgd2l0aCBib3R0b20gb3IgZHluYW1pYywKICAvLy8gZGVwZW5kaW5nIG9uIHRoZSBjb3ZhcmlhbmNlIG9mIGl0cyB1c2UuCiAgc3RhdGljIFN1YnN0aXR1dGlvbiBib3R0b21Gb3JDbGFzcyhDbGFzcyBjbGFzc18pIHsKICAgIGlmIChjbGFzc18udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlOwogICAgcmV0dXJuIG5ldyBfQ2xhc3NCb3R0b21TdWJzdGl0dXRpb24oY2xhc3NfKTsKICB9CgogIC8vLyBTdWJzdGl0dXRlcyBjb3ZhcmlhbnQgdXNlcyBvZiBbY2xhc3NfXSdzIHR5cGUgcGFyYW1ldGVycyB3aXRoIHRoZSB1cHBlcgogIC8vLyBib3VuZCBvZiB0aGF0IHR5cGUgcGFyYW1ldGVyLiAgUmVjdXJzaXZlIHJlZmVyZW5jZXMgaW4gdGhlIGJvdW5kIGhhdmUKICAvLy8gYmVlbiByZXBsYWNlZCBieSBkeW5hbWljLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gdXBwZXJCb3VuZEZvckNsYXNzKENsYXNzIGNsYXNzXykgewogICAgaWYgKGNsYXNzXy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2U7CiAgICB2YXIgdXBwZXIgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gY2xhc3NfLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHVwcGVyW3BhcmFtZXRlcl0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgZm9yICh2YXIgcGFyYW1ldGVyIGluIGNsYXNzXy50eXBlUGFyYW1ldGVycykgewogICAgICB1cHBlcltwYXJhbWV0ZXJdID0gc3Vic3RpdHV0ZShwYXJhbWV0ZXIuYm91bmQsIHVwcGVyKTsKICAgIH0KICAgIHJldHVybiBmcm9tVXBwZXJBbmRMb3dlckJvdW5kcyh1cHBlciwge30pOwogIH0KCiAgLy8vIFN1YnN0aXR1dGVzIGJvdGggdmFyaWFibGVzIGZyb20gW2ZpcnN0XSBhbmQgW3NlY29uZF0sIGZhdm9yaW5nIHRob3NlIGZyb20KICAvLy8gW2ZpcnN0XSBpZiB0aGV5IG92ZXJsYXAuCiAgLy8vCiAgLy8vIE5laXRoZXIgc3Vic3RpdHV0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIG90aGVyLCBzbyB0aGlzIGRvZXMKICAvLy8gKm5vdCogY29ycmVzcG9uZCB0byBhIHNlcXVlbmNlIG9mIHR3byBzdWJzdGl0dXRpb25zLiBGb3IgZXhhbXBsZSwKICAvLy8gY29tYmluaW5nIGB7VCAtPiBMaXN0PEc+fWAgd2l0aCBge0cgLT4gU3RyaW5nfWAgZG9lcyBub3QgY29ycmVzcG9uZCB0bwogIC8vLyBge1QgLT4gTGlzdDxTdHJpbmc+fWAgYmVjYXVzZSB0aGUgcmVzdWx0IGZyb20gc3Vic3RpdHV0aW5nIGBUYCBpcyBub3QKICAvLy8gc2VhcmNoZWQgZm9yIG9jY3VyZW5jZXMgb2YgYEdgLgogIHN0YXRpYyBTdWJzdGl0dXRpb24gY29tYmluZShTdWJzdGl0dXRpb24gZmlyc3QsIFN1YnN0aXR1dGlvbiBzZWNvbmQpIHsKICAgIGlmIChmaXJzdCA9PSBfTnVsbFN1YnN0aXR1dGlvbi5pbnN0YW5jZSkgcmV0dXJuIHNlY29uZDsKICAgIGlmIChzZWNvbmQgPT0gX051bGxTdWJzdGl0dXRpb24uaW5zdGFuY2UpIHJldHVybiBmaXJzdDsKICAgIHJldHVybiBuZXcgX0NvbWJpbmVkU3Vic3RpdHV0aW9uKGZpcnN0LCBzZWNvbmQpOwogIH0KCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKTsKCiAgRGFydFR5cGUgc3Vic3RpdHV0ZVR5cGUoRGFydFR5cGUgbm9kZSwge2Jvb2wgY29udHJhdmFyaWFudDogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IF9Ub3BTdWJzdGl0dXRvcih0aGlzLCBjb250cmF2YXJpYW50KS52aXNpdChub2RlKTsKICB9CgogIFN1cGVydHlwZSBzdWJzdGl0dXRlU3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSB7CiAgICByZXR1cm4gbmV3IF9Ub3BTdWJzdGl0dXRvcih0aGlzLCBmYWxzZSkudmlzaXRTdXBlcnR5cGUobm9kZSk7CiAgfQp9CgpjbGFzcyBfTnVsbFN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgc3RhdGljIGNvbnN0IF9OdWxsU3Vic3RpdHV0aW9uIGluc3RhbmNlID0gY29uc3QgX051bGxTdWJzdGl0dXRpb24oKTsKCiAgY29uc3QgX051bGxTdWJzdGl0dXRpb24oKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcocGFyYW1ldGVyLCBwYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgc3Vic3RpdHV0ZVR5cGUoRGFydFR5cGUgbm9kZSwge2Jvb2wgY29udHJhdmFyaWFudDogZmFsc2V9KSA9PiBub2RlOwoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgc3Vic3RpdHV0ZVN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgPT4gbm9kZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlN1YnN0aXR1dGlvbi5lbXB0eSI7Cn0KCmNsYXNzIF9NYXBTdWJzdGl0dXRpb24gZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXI7CiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBsb3dlcjsKCiAgX01hcFN1YnN0aXR1dGlvbih0aGlzLnVwcGVyLCB0aGlzLmxvd2VyKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gdXBwZXJCb3VuZCA/IHVwcGVyW3BhcmFtZXRlcl0gOiBsb3dlcltwYXJhbWV0ZXJdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIl9NYXBTdWJzdGl0dXRpb24oJHVwcGVyLCAkbG93ZXIpIjsKfQoKY2xhc3MgX1RvcFN1YnN0aXR1dG9yIGV4dGVuZHMgX1R5cGVTdWJzdGl0dXRvciB7CiAgZmluYWwgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKCiAgX1RvcFN1YnN0aXR1dG9yKHRoaXMuc3Vic3RpdHV0aW9uLCBib29sIGNvbnRyYXZhcmlhbnQpIDogc3VwZXIobnVsbCkgewogICAgaWYgKGNvbnRyYXZhcmlhbnQpIHsKICAgICAgaW52ZXJ0VmFyaWFuY2UoKTsKICAgIH0KICB9CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKTsKICB9CgogIFR5cGVQYXJhbWV0ZXIgZnJlc2hUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgdGhyb3cgJ0NyZWF0ZSBhIGZyZXNoIGVudmlyb25tZW50IGZpcnN0JzsKICB9Cn0KCmNsYXNzIF9DbGFzc0JvdHRvbVN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgQ2xhc3MgY2xhc3NfOwoKICBfQ2xhc3NCb3R0b21TdWJzdGl0dXRpb24odGhpcy5jbGFzc18pOwoKICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBib29sIHVwcGVyQm91bmQpIHsKICAgIGlmIChwYXJhbWV0ZXIucGFyZW50ID09IGNsYXNzXykgewogICAgICByZXR1cm4gdXBwZXJCb3VuZCA/IGNvbnN0IEJvdHRvbVR5cGUoKSA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIF9Db21iaW5lZFN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgZmluYWwgU3Vic3RpdHV0aW9uIGZpcnN0LCBzZWNvbmQ7CgogIF9Db21iaW5lZFN1YnN0aXR1dGlvbih0aGlzLmZpcnN0LCB0aGlzLnNlY29uZCk7CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgewogICAgcmV0dXJuIGZpcnN0LmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKSA/PwogICAgICAgIHNlY29uZC5nZXRTdWJzdGl0dXRlKHBhcmFtZXRlciwgdXBwZXJCb3VuZCk7CiAgfQp9Cgp0eXBlZGVmIGJvb2wgVHlwZVBhcmFtZXRlckZpbHRlcihUeXBlUGFyYW1ldGVyIFApOwoKY2xhc3MgX0ZpbHRlcmVkU3Vic3RpdHV0aW9uIGV4dGVuZHMgU3Vic3RpdHV0aW9uIHsKICBmaW5hbCBTdWJzdGl0dXRpb24gYmFzZTsKICBmaW5hbCBUeXBlUGFyYW1ldGVyRmlsdGVyIGZpbHRlckZuOwoKICBfRmlsdGVyZWRTdWJzdGl0dXRpb24odGhpcy5iYXNlLCB0aGlzLmZpbHRlckZuKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gZmlsdGVyRm4ocGFyYW1ldGVyKQogICAgICAgID8gYmFzZS5nZXRTdWJzdGl0dXRlKHBhcmFtZXRlciwgdXBwZXJCb3VuZCkKICAgICAgICA6IF9OdWxsU3Vic3RpdHV0aW9uLmluc3RhbmNlLmdldFN1YnN0aXR1dGUocGFyYW1ldGVyLCB1cHBlckJvdW5kKTsKICB9Cn0KCmNsYXNzIF9Jbm5lclR5cGVTdWJzdGl0dXRvciBleHRlbmRzIF9UeXBlU3Vic3RpdHV0b3IgewogIGZpbmFsIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwoKICBfSW5uZXJUeXBlU3Vic3RpdHV0b3IoX1R5cGVTdWJzdGl0dXRvciBvdXRlcikgOiBzdXBlcihvdXRlcik7CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uW3BhcmFtZXRlcl07CiAgfQoKICBUeXBlUGFyYW1ldGVyIGZyZXNoVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHZhciBmcmVzaCA9IG5ldyBUeXBlUGFyYW1ldGVyKG5vZGUubmFtZSk7CiAgICBzdWJzdGl0dXRpb25bbm9kZV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUuZm9yQWxwaGFSZW5hbWluZyhub2RlLCBmcmVzaCk7CiAgICBmcmVzaC5ib3VuZCA9IHZpc2l0KG5vZGUuYm91bmQpOwogICAgaWYgKG5vZGUuZGVmYXVsdFR5cGUgIT0gbnVsbCkgewogICAgICBmcmVzaC5kZWZhdWx0VHlwZSA9IHZpc2l0KG5vZGUuZGVmYXVsdFR5cGUpOwogICAgfQogICAgcmV0dXJuIGZyZXNoOwogIH0KfQoKLy8vIENvbWJpbmVzIG51bGxhYmlsaXRpZXMgb2YgdHlwZXMgZHVyaW5nIHR5cGUgc3Vic3RpdHV0aW9uLgovLy8KLy8vIEluIGEgdHlwZSBzdWJzdGl0dXRpb24sIGZvciBleGFtcGxlLCB3aGVuIGBpbnRgIGlzIHN1YnN0aXR1dGVkIGZvciBgVGAgaW4KLy8vIGBMaXN0PFQ/PmAsIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIgc2hvdWxkCi8vLyBiZSBjb21iaW5lZCB3aXRoIHRoZSBudWxsYWJpbGl0eSBvZiB0aGUgdHlwZSB0aGF0IGlzIGJlaW5nIHN1YnN0aXR1dGVkIGZvcgovLy8gdGhhdCB0eXBlIHBhcmFtZXRlci4gIEluIHRoZSBleGFtcGxlIGFib3ZlIGl0J3MgdGhlIG51bGxhYmlsaXR5IG9mIGBUP2AKLy8vIGFuZCBgaW50YC4gIFRoZSBmdW5jdGlvbiBjb21wdXRlcyB0aGUgbnVsbGFiaWxpdHkgZm9yIHRoZSByZXBsYWNlbWVudCBhcwovLy8gcGVyIHRoZSBmb2xsb3dpbmcgdGFibGU6Ci8vLwovLy8gfCBhcmcgXCB2YXIgfCAgISAgfCAgPyAgfCAgKiAgfCAgJSAgfAovLy8gfC0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfAovLy8gfCAgICAgISAgICAgfCAgISAgfCAgPyAgfCAgKiAgfCAgISAgfAovLy8gfCAgICAgPyAgICAgfCBOL0EgfCAgPyAgfCAgPyAgfCAgPyAgfAovLy8gfCAgICAgKiAgICAgfCAgKiAgfCAgPyAgfCAgKiAgfCAgKiAgfAovLy8gfCAgICAgJSAgICAgfCBOL0EgfCAgPyAgfCAgKiAgfCAgJSAgfAovLy8KLy8vIEhlcmUgYCFgIGRlbm90ZXMgYE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlYCwgYD9gIGRlbm90ZXMKLy8vIGBOdWxsYWJpbGl0eS5udWxsYWJsZWAsIGAqYCBkZW5vdGVzIGBOdWxsYWJpbGl0eS5sZWdhY3lgLCBhbmQgYCVgIGRlbm90ZXMKLy8vIGBOdWxsYWJpbGl0eS5uZWl0aGVyYC4gIFRoZSB0YWJsZSBlbGVtZW50cyBtYXJrZWQgd2l0aCBOL0EgZGVub3RlIHRoZQovLy8gY2FzZXMgdGhhdCBzaG91bGQgeWllbGQgYSB0eXBlIGVycm9yIGJlZm9yZSB0aGUgc3Vic3RpdHV0aW9uIGlzIHBlcmZvcm1lZC4KTnVsbGFiaWxpdHkgY29tYmluZU51bGxhYmlsaXRpZXNGb3JTdWJzdGl0dXRpb24oTnVsbGFiaWxpdHkgYSwgTnVsbGFiaWxpdHkgYikgewogIC8vIEluIHRoZSB0YWJsZSBhYm92ZSB3ZSBtYXkgZXh0ZW5kIHRoZSBmdW5jdGlvbiBnaXZlbiBieSBpdCwgcmVwbGFjaW5nIE4vQQogIC8vIHdpdGggd2hhdGV2ZXIgaXMgZWFzaWVyIHRvIGltcGxlbWVudC4gIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHdlIGV4dGVuZAogIC8vIHRoZSB0YWJsZSBmdW5jdGlvbiBhcyBmb2xsb3dzOgogIC8vCiAgLy8gfCBhcmcgXCB2YXIgfCAgISAgfCAgPyAgfCAgKiAgfCAgJSAgfAogIC8vIHwtLS0tLS0tLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwKICAvLyB8ICAgICAhICAgICB8ICAhICB8ICA/ICB8ICAqICB8ICAhICB8CiAgLy8gfCAgICAgPyAgICAgfCAgPyAgfCAgPyAgfCAgPyAgfCAgPyAgfAogIC8vIHwgICAgICogICAgIHwgICogIHwgID8gIHwgICogIHwgICogIHwKICAvLyB8ICAgICAlICAgICB8ICAlICB8ICA/ICB8ICAqICB8ICAlICB8CiAgLy8KCiAgaWYgKGEgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgfHwgYiA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgcmV0dXJuIE51bGxhYmlsaXR5Lm51bGxhYmxlOwogIH0KCiAgaWYgKGEgPT0gTnVsbGFiaWxpdHkubGVnYWN5IHx8IGIgPT0gTnVsbGFiaWxpdHkubGVnYWN5KSB7CiAgICByZXR1cm4gTnVsbGFiaWxpdHkubGVnYWN5OwogIH0KCiAgcmV0dXJuIGE7Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlU3Vic3RpdHV0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8RGFydFR5cGU+IHsKICBmaW5hbCBfVHlwZVN1YnN0aXR1dG9yIG91dGVyOwogIGJvb2wgY292YXJpYW50Q29udGV4dCA9IHRydWU7CgogIF9UeXBlU3Vic3RpdHV0b3IodGhpcy5vdXRlcikgewogICAgY292YXJpYW50Q29udGV4dCA9IG91dGVyID09IG51bGwgPyB0cnVlIDogb3V0ZXIuY292YXJpYW50Q29udGV4dDsKICB9CgogIERhcnRUeXBlIGxvb2t1cChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKTsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdGltZXMgYSB2YXJpYWJsZSBmcm9tIHRoaXMgZW52aXJvbm1lbnQgaGFzIGJlZW4gdXNlZCBpbgogIC8vLyBhIHN1YnN0aXR1dGlvbi4KICAvLy8KICAvLy8gVGhlcmUgaXMgYSBzdHJpY3QgcmVxdWlyZW1lbnQgdGhhdCB3ZSBtdXN0IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBmb3IKICAvLy8gdHlwZXMgdGhhdCB3ZXJlIG5vdCBhbHRlcmVkIGJ5IHRoZSBzdWJzdGl0dXRpb24uICBUaGlzIGNvdW50ZXIgbGV0cyB1cwogIC8vLyBjaGVjayBxdWlja2x5IGlmIGFueXRoaW5nIGhhcHBlbmVkIGluIGEgc3Vic3RpdHV0aW9uLgogIGludCB1c2VDb3VudGVyID0gMDsKCiAgX0lubmVyVHlwZVN1YnN0aXR1dG9yIG5ld0lubmVyRW52aXJvbm1lbnQoKSB7CiAgICByZXR1cm4gbmV3IF9Jbm5lclR5cGVTdWJzdGl0dXRvcih0aGlzKTsKICB9CgogIHZvaWQgaW52ZXJ0VmFyaWFuY2UoKSB7CiAgICBjb3ZhcmlhbnRDb250ZXh0ID0gIWNvdmFyaWFudENvbnRleHQ7CiAgfQoKICBTdXBlcnR5cGUgdmlzaXRTdXBlcnR5cGUoU3VwZXJ0eXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIG5vZGU7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdCkudG9MaXN0KCk7CiAgICBpZiAodXNlQ291bnRlciA9PSBiZWZvcmUpIHJldHVybiBub2RlOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUobm9kZS5jbGFzc05vZGUsIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgTmFtZWRUeXBlIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICBpbnQgYmVmb3JlID0gdXNlQ291bnRlcjsKICAgIHZhciB0eXBlID0gdmlzaXQobm9kZS50eXBlKTsKICAgIGlmICh1c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShub2RlLm5hbWUsIHR5cGUsIGlzUmVxdWlyZWQ6IG5vZGUuaXNSZXF1aXJlZCk7CiAgfQoKICBEYXJ0VHlwZSB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgRGFydFR5cGUgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSA9PiBub2RlOwogIERhcnRUeXBlIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gbm9kZTsKICBEYXJ0VHlwZSB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpID0+IG5vZGU7CiAgRGFydFR5cGUgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgPT4gbm9kZTsKICBEYXJ0VHlwZSB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgPT4gbm9kZTsKCiAgRGFydFR5cGUgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gbm9kZTsKICAgIGludCBiZWZvcmUgPSB1c2VDb3VudGVyOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSBub2RlLnR5cGVBcmd1bWVudHMubWFwKHZpc2l0KS50b0xpc3QoKTsKICAgIGlmICh1c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUobm9kZS5jbGFzc05vZGUsIG5vZGUubnVsbGFiaWxpdHksIHR5cGVBcmd1bWVudHMpOwogIH0KCiAgRGFydFR5cGUgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHJldHVybiBub2RlOwogICAgaW50IGJlZm9yZSA9IHVzZUNvdW50ZXI7CiAgICB2YXIgdHlwZUFyZ3VtZW50cyA9IG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodmlzaXQpLnRvTGlzdCgpOwogICAgaWYgKHVzZUNvdW50ZXIgPT0gYmVmb3JlKSByZXR1cm4gbm9kZTsKICAgIHJldHVybiBuZXcgVHlwZWRlZlR5cGUobm9kZS50eXBlZGVmTm9kZSwgbm9kZS5udWxsYWJpbGl0eSwgdHlwZUFyZ3VtZW50cyk7CiAgfQoKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGZyZXNoVHlwZVBhcmFtZXRlcnMoTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CiAgICBpZiAocGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gY29uc3QgPFR5cGVQYXJhbWV0ZXI+W107CiAgICByZXR1cm4gcGFyYW1ldGVycy5tYXAoZnJlc2hUeXBlUGFyYW1ldGVyKS50b0xpc3QoKTsKICB9CgogIFR5cGVQYXJhbWV0ZXIgZnJlc2hUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSk7CgogIERhcnRUeXBlIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICAvLyBUaGlzIGlzIGEgYml0IHRyaWNreSBiZWNhdXNlIHdlIGhhdmUgdG8gZ2VuZXJhdGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXJzCiAgICAvLyBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIGJvdW5kcy4gIEF0IHRoZSBzYW1lIHRpbWUsIGlmIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAvLyB3YXMgdW5hbHRlcmVkLCB3ZSBoYXZlIHRvIHJldHVybiB0aGUgW25vZGVdIG9iamVjdCAobm90IGEgY29weSEpLgogICAgLy8gU3Vic3RpdHV0aW5nIGEgdHlwZSBmb3IgYSBmcmVzaCB0eXBlIHZhcmlhYmxlIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aAogICAgLy8gYSAicmVhbCIgc3Vic3RpdHV0aW9uLgogICAgLy8KICAgIC8vIENyZWF0ZSBhbiBpbm5lciBlbnZpcm9ubWVudCB0byBnZW5lcmF0ZSBmcmVzaCB0eXBlIHBhcmFtZXRlcnMuICBUaGUgdXNlCiAgICAvLyBjb3VudGVyIG9uIHRoZSBpbm5lciBlbnZpcm9ubWVudCB0ZWxscyBpZiB0aGUgZnJlc2ggdHlwZSBwYXJhbWV0ZXJzIGhhdmUKICAgIC8vIGFueSB1c2VzLCBidXQgZG9lcyBub3QgdGVsbCBpZiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHR5cGUgaXMgZGlzdGluY3QuCiAgICAvLyBPdXIgb3duIHVzZSBjb3VudGVyIHdpbGwgZ2V0IGluY3JlbWVudGVkIGlmIHNvbWV0aGluZyBmcm9tIG91cgogICAgLy8gZW52aXJvbm1lbnQgaGFzIGJlZW4gdXNlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgogICAgYXNzZXJ0KAogICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMuZXZlcnkoKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyKSA9PgogICAgICAgICAgICBsb29rdXAocGFyYW1ldGVyLCB0cnVlKSA9PSBudWxsICYmCiAgICAgICAgICAgIGxvb2t1cChwYXJhbWV0ZXIsIGZhbHNlKSA9PSBudWxsKSwKICAgICAgICAiRnVuY3Rpb24gdHlwZSB2YXJpYWJsZXMgY2Fubm90IGJlIHN1YnN0aXR1dGVkIHdoaWxlIHN0aWxsIGF0dGFjaGVkICIKICAgICAgICAidG8gdGhlIGZ1bmN0aW9uLiBQZXJmb3JtIHN1YnN0aXR1dGlvbiBvbiAiCiAgICAgICAgImBGdW5jdGlvblR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzYCBpbnN0ZWFkLiIpOwogICAgdmFyIGlubmVyID0gbm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5ID8gdGhpcyA6IG5ld0lubmVyRW52aXJvbm1lbnQoKTsKICAgIGludCBiZWZvcmUgPSB0aGlzLnVzZUNvdW50ZXI7CiAgICAvLyBJbnZlcnQgdGhlIHZhcmlhbmNlIHdoZW4gdHJhbnNsYXRpbmcgcGFyYW1ldGVycy4KICAgIGlubmVyLmludmVydFZhcmlhbmNlKCk7CiAgICB2YXIgdHlwZVBhcmFtZXRlcnMgPSBpbm5lci5mcmVzaFR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgdmFyIHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5pc0VtcHR5CiAgICAgICAgPyBjb25zdCA8RGFydFR5cGU+W10KICAgICAgICA6IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubWFwKGlubmVyLnZpc2l0KS50b0xpc3QoKTsKICAgIHZhciBuYW1lZFBhcmFtZXRlcnMgPSBub2RlLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5CiAgICAgICAgPyBjb25zdCA8TmFtZWRUeXBlPltdCiAgICAgICAgOiBub2RlLm5hbWVkUGFyYW1ldGVycy5tYXAoaW5uZXIudmlzaXROYW1lZFR5cGUpLnRvTGlzdCgpOwogICAgaW5uZXIuaW52ZXJ0VmFyaWFuY2UoKTsKICAgIHZhciByZXR1cm5UeXBlID0gaW5uZXIudmlzaXQobm9kZS5yZXR1cm5UeXBlKTsKICAgIERhcnRUeXBlIHR5cGVkZWZUeXBlID0KICAgICAgICBub2RlLnR5cGVkZWZUeXBlID09IG51bGwgPyBudWxsIDogaW5uZXIudmlzaXQobm9kZS50eXBlZGVmVHlwZSk7CiAgICBpZiAodGhpcy51c2VDb3VudGVyID09IGJlZm9yZSkgcmV0dXJuIG5vZGU7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsUGFyYW1ldGVycywgcmV0dXJuVHlwZSwgbm9kZS5udWxsYWJpbGl0eSwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogbm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlZGVmVHlwZSk7CiAgfQoKICB2b2lkIGJ1bXBDb3VudGVyc1VudGlsKF9UeXBlU3Vic3RpdHV0b3IgdGFyZ2V0KSB7CiAgICB2YXIgbm9kZSA9IHRoaXM7CiAgICB3aGlsZSAobm9kZSAhPSB0YXJnZXQpIHsKICAgICAgKytub2RlLnVzZUNvdW50ZXI7CiAgICAgIG5vZGUgPSBub2RlLm91dGVyOwogICAgfQogICAgKyt0YXJnZXQudXNlQ291bnRlcjsKICB9CgogIERhcnRUeXBlIGdldFN1YnN0aXR1dGUoVHlwZVBhcmFtZXRlciB2YXJpYWJsZSkgewogICAgdmFyIGVudmlyb25tZW50ID0gdGhpczsKICAgIHdoaWxlIChlbnZpcm9ubWVudCAhPSBudWxsKSB7CiAgICAgIERhcnRUeXBlIHJlcGxhY2VtZW50ID0gZW52aXJvbm1lbnQubG9va3VwKHZhcmlhYmxlLCBjb3ZhcmlhbnRDb250ZXh0KTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICBidW1wQ291bnRlcnNVbnRpbChlbnZpcm9ubWVudCk7CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgICB9CiAgICAgIGVudmlyb25tZW50ID0gZW52aXJvbm1lbnQub3V0ZXI7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIERhcnRUeXBlIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgRGFydFR5cGUgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRlKG5vZGUucGFyYW1ldGVyKTsKICAgIGlmIChyZXBsYWNlbWVudCBpcyBJbnZhbGlkVHlwZSkgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50LndpdGhOdWxsYWJpbGl0eShjb21iaW5lTnVsbGFiaWxpdGllc0ZvclN1YnN0aXR1dGlvbigKICAgICAgICAgIHJlcGxhY2VtZW50Lm51bGxhYmlsaXR5LCBub2RlLm51bGxhYmlsaXR5KSk7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9Cn0KCmNsYXNzIF9EZWVwVHlwZVN1YnN0aXR1dG9yIGV4dGVuZHMgX0lubmVyVHlwZVN1YnN0aXR1dG9yIHsKICBpbnQgZGVwdGggPSAwOwogIGJvb2wgaXNJbmZpbml0ZSA9IGZhbHNlOwoKICBfRGVlcFR5cGVTdWJzdGl0dXRvcihNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiwKICAgICAgW19EZWVwVHlwZVN1YnN0aXR1dG9yIG91dGVyXSkKICAgICAgOiBzdXBlcihvdXRlcikgewogICAgdGhpcy5zdWJzdGl0dXRpb24uYWRkQWxsKHN1YnN0aXR1dGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICBfRGVlcFR5cGVTdWJzdGl0dXRvciBuZXdJbm5lckVudmlyb25tZW50KCkgewogICAgcmV0dXJuIG5ldyBfRGVlcFR5cGVTdWJzdGl0dXRvcig8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e30sIHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBEYXJ0VHlwZSByZXBsYWNlbWVudCA9IGdldFN1YnN0aXR1dGUobm9kZS5wYXJhbWV0ZXIpOwogICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHJldHVybiBub2RlOwogICAgaWYgKGlzSW5maW5pdGUpIHJldHVybiByZXBsYWNlbWVudDsKICAgICsrZGVwdGg7CiAgICBpZiAoZGVwdGggPiBzdWJzdGl0dXRpb24ubGVuZ3RoKSB7CiAgICAgIGlzSW5maW5pdGUgPSB0cnVlOwogICAgICAtLWRlcHRoOwogICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXBsYWNlbWVudCA9IHZpc2l0KHJlcGxhY2VtZW50KTsKICAgICAgLy8gVXBkYXRlIHR5cGUgdG8gdGhlIGZ1bGx5IGZsZXNoZWQtb3V0IHR5cGUuCiAgICAgIHN1YnN0aXR1dGlvbltub2RlLnBhcmFtZXRlcl0gPSByZXBsYWNlbWVudDsKICAgICAgLS1kZXB0aDsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfQogIH0KfQoKY2xhc3MgX1R5cGVVbmlmaWNhdGlvbiB7CiAgLy8gQWN5Y2xpYyBpbnZhcmlhbnQ6IFRoZXJlIGFyZSBubyBjeWNsZXMgaW4gdGhlIG1hcCwgdGhhdCBpcywgYWxsIHR5cGVzIGNhbgogIC8vICAgYmUgcmVzb2x2ZWQgdG8gZmluaXRlIHR5cGVzIGJ5IHN1YnN0aXR1dGluZyBhbGwgY29udGFpbmVkIHR5cGUgdmFyaWFibGVzLgogIC8vCiAgLy8gVGhlIGFjeWNsaWMgaW52YXJpYW50IGhvbGRzIGV2ZXJ5d2hlcmUgZXhjZXB0IGR1cmluZyBjeWNsZSBkZXRlY3Rpb24uCiAgLy8KICAvLyBJdCBpcyBub3QgY2hlY2tlZCB0aGF0IHRoZSBzdWJzdGl0dXRpb24gc2F0aXNmaWVzIHRoZSBib3VuZCBvbiB0aGUgdHlwZQogIC8vIHBhcmFtZXRlci4KICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKCiAgLy8vIFZhcmlhYmxlcyB0aGF0IG1heSBiZSBhc3NpZ25lZCBmcmVlbHkgaW4gb3JkZXIgdG8gb2J0YWluIHVuaWZpY2F0aW9uLgogIC8vLwogIC8vLyBUaGVzZSBhcmUgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGV4aXN0ZW50aWFsbHkgcXVhbnRpZmllZCB2YXJpYWJsZXMuCiAgZmluYWwgU2V0PFR5cGVQYXJhbWV0ZXI+IHF1YW50aWZpZWRWYXJpYWJsZXM7CgogIC8vLyBWYXJpYWJsZXMgdGhhdCBhcmUgYm91bmQgYnkgYSBmdW5jdGlvbiB0eXBlIGluc2lkZSBvbmUgb2YgdGhlIHR5cGVzLgogIC8vLyBUaGVzZSBtYXkgbm90IG9jY3VyIGluIGEgc3Vic3RpdHV0aW9uLCBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IGluCiAgLy8vIHNjb3BlIGF0IHRoZSBleGlzdGVudGlhbGx5IHF1YW50aWZpZWQgdmFyaWFibGVzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBhcmUgdHJ5aW5nIHRvIHNhdGlzZnkgdGhlIGVxdWF0aW9uOgogIC8vLwogIC8vLyAgICAg4oiDUy4gPEU+KEUsIFMpID0+IEUgID0gIDxFPihFLCBFKSA9PiBFCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHdlIG11c3QgY2hvb3NlIGBTYCBzdWNoIHRoYXQgdGhlIGdlbmVyaWMgZnVuY3Rpb24gdHlwZQogIC8vLyBgPEU+KEUsIFMpID0+IEVgIGJlY29tZXMgYDxFPihFLCBFKSA9PiBFYC4gIENob29zaW5nIGBTID0gRWAgaXMgbm90IGEKICAvLy8gdmFsaWQgc29sdXRpb24sIGJlY2F1c2UgYEVgIGlzIG5vdCBpbiBzY29wZSB3aGVyZSBgU2AgaXMgcXVhbnRpZmllZC4KICAvLy8gVGhlIHR3byBmdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgdW5pZmllZC4KICBmaW5hbCBTZXQ8VHlwZVBhcmFtZXRlcj4gX3VuaXZlcnNhbGx5UXVhbnRpZmllZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8VHlwZVBhcmFtZXRlcj4oKTsKCiAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKCiAgX1R5cGVVbmlmaWNhdGlvbihEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIHRoaXMucXVhbnRpZmllZFZhcmlhYmxlcykgewogICAgX3VuaWZ5KHR5cGUxLCB0eXBlMik7CiAgICBpZiAoc3VjY2VzcyAmJiBzdWJzdGl0dXRpb24ubGVuZ3RoID49IDIpIHsKICAgICAgZm9yICh2YXIga2V5IGluIHN1YnN0aXR1dGlvbi5rZXlzKSB7CiAgICAgICAgc3Vic3RpdHV0aW9uW2tleV0gPSBzdWJzdGl0dXRlRGVlcChzdWJzdGl0dXRpb25ba2V5XSwgc3Vic3RpdHV0aW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgRGFydFR5cGUgX3N1YnN0aXR1dGVIZWFkKFR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN1YnN0aXR1dGlvbi5sZW5ndGg7ICsraSkgewogICAgICBEYXJ0VHlwZSBuZXh0VHlwZSA9IHN1YnN0aXR1dGlvblt0eXBlLnBhcmFtZXRlcl07CiAgICAgIGlmIChuZXh0VHlwZSA9PSBudWxsKSByZXR1cm4gdHlwZTsKICAgICAgaWYgKG5leHRUeXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgdHlwZSA9IG5leHRUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXh0VHlwZTsKICAgICAgfQogICAgfQogICAgLy8gVGhlIGN5Y2xlIHNob3VsZCBoYXZlIGJlZW4gZm91bmQgYnkgX3RyeVN1YnN0aXR1dGlvbiB3aGVuIHRoZSBjeWNsZQogICAgLy8gd2FzIGNyZWF0ZWQuCiAgICB0aHJvdyAnVW5leHBlY3RlZCBjeWNsZSBmb3VuZCBkdXJpbmcgdW5pZmljYXRpb24nOwogIH0KCiAgYm9vbCBfdW5pZnkoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKSB7CiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBmYWxzZTsKICAgIHR5cGUxID0gdHlwZTEgaXMgVHlwZVBhcmFtZXRlclR5cGUgPyBfc3Vic3RpdHV0ZUhlYWQodHlwZTEpIDogdHlwZTE7CiAgICB0eXBlMiA9IHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlID8gX3N1YnN0aXR1dGVIZWFkKHR5cGUyKSA6IHR5cGUyOwogICAgaWYgKHR5cGUxIGlzIER5bmFtaWNUeXBlICYmIHR5cGUyIGlzIER5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0eXBlMSBpcyBWb2lkVHlwZSAmJiB0eXBlMiBpcyBWb2lkVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHlwZTEgaXMgSW52YWxpZFR5cGUgJiYgdHlwZTIgaXMgSW52YWxpZFR5cGUpIHJldHVybiB0cnVlOwogICAgaWYgKHR5cGUxIGlzIEJvdHRvbVR5cGUgJiYgdHlwZTIgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMiBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlMS5jbGFzc05vZGUgIT0gdHlwZTIuY2xhc3NOb2RlIHx8CiAgICAgICAgICB0eXBlMS5udWxsYWJpbGl0eSAhPSB0eXBlMi5udWxsYWJpbGl0eSkgewogICAgICAgIHJldHVybiBfZmFpbCgpOwogICAgICB9CiAgICAgIGFzc2VydCh0eXBlMS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PSB0eXBlMi50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZTEudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICghX3VuaWZ5KHR5cGUxLnR5cGVBcmd1bWVudHNbaV0sIHR5cGUyLnR5cGVBcmd1bWVudHNbaV0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHR5cGUxIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlMiBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKHR5cGUxLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSB0eXBlMi50eXBlUGFyYW1ldGVycy5sZW5ndGggfHwKICAgICAgICAgIHR5cGUxLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPQogICAgICAgICAgICAgIHR5cGUyLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCB8fAogICAgICAgICAgdHlwZTEubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAhPSB0eXBlMi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICB0eXBlMS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IHR5cGUyLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgfHwKICAgICAgICAgIHR5cGUxLm51bGxhYmlsaXR5ICE9IHR5cGUyLm51bGxhYmlsaXR5KSB7CiAgICAgICAgcmV0dXJuIF9mYWlsKCk7CiAgICAgIH0KICAgICAgLy8gV2hlbiB1bmlmeWluZyB0d28gZ2VuZXJpYyBmdW5jdGlvbnMsIHRyYW5zZm9ybSB0aGUgZXF1YXRpb24gbGlrZSB0aGlzOgogICAgICAvLwogICAgICAvLyAgICDiiINTLiA8RT4oZm4xKSA9IDxUPihmbjIpCiAgICAgIC8vICAgICAgPT0+CiAgICAgIC8vICAgIOKIg1MuIOKIgEcuIGZuMVtHL0VdID0gZm4yW0cvVF0KICAgICAgLy8KICAgICAgLy8gVGhhdCBpcywgYXNzdW1lIHNvbWUgZml4ZWQgaWRlbnRpY2FsIGNob2ljZSBvZiB0eXBlIHBhcmFtZXRlcnMgZm9yIGJvdGgKICAgICAgLy8gZnVuY3Rpb25zIGFuZCB0cnkgdG8gdW5pZnkgdGhlIGluc3RhbnRpYXRlZCBmdW5jdGlvbiB0eXBlcy4KICAgICAgYXNzZXJ0KCF0eXBlMS50eXBlUGFyYW1ldGVycy5hbnkocXVhbnRpZmllZFZhcmlhYmxlcy5jb250YWlucykpOwogICAgICBhc3NlcnQoIXR5cGUyLnR5cGVQYXJhbWV0ZXJzLmFueShxdWFudGlmaWVkVmFyaWFibGVzLmNvbnRhaW5zKSk7CiAgICAgIHZhciBsZWZ0SW5zdGFuY2UgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIHZhciByaWdodEluc3RhbmNlID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUxLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGluc3RhbnRpYXRvciA9IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGUxLnR5cGVQYXJhbWV0ZXJzW2ldLm5hbWUpOwogICAgICAgIHZhciBpbnN0YW50aWF0b3JUeXBlID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcoCiAgICAgICAgICAgIHR5cGUxLnR5cGVQYXJhbWV0ZXJzW2ldLCBpbnN0YW50aWF0b3IpOwogICAgICAgIGxlZnRJbnN0YW5jZVt0eXBlMS50eXBlUGFyYW1ldGVyc1tpXV0gPSBpbnN0YW50aWF0b3JUeXBlOwogICAgICAgIHJpZ2h0SW5zdGFuY2VbdHlwZTIudHlwZVBhcmFtZXRlcnNbaV1dID0gaW5zdGFudGlhdG9yVHlwZTsKICAgICAgICBfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzLmFkZChpbnN0YW50aWF0b3IpOwogICAgICB9CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZTEudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbGVmdCA9IHN1YnN0aXR1dGUodHlwZTEudHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIGxlZnRJbnN0YW5jZSk7CiAgICAgICAgdmFyIHJpZ2h0ID0gc3Vic3RpdHV0ZSh0eXBlMi50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCwgcmlnaHRJbnN0YW5jZSk7CiAgICAgICAgaWYgKCFfdW5pZnkobGVmdCwgcmlnaHQpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlMS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBsZWZ0ID0gc3Vic3RpdHV0ZSh0eXBlMS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwgbGVmdEluc3RhbmNlKTsKICAgICAgICB2YXIgcmlnaHQgPSBzdWJzdGl0dXRlKHR5cGUyLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLCByaWdodEluc3RhbmNlKTsKICAgICAgICBpZiAoIV91bmlmeShsZWZ0LCByaWdodCkpIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUxLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICh0eXBlMS5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSAhPSB0eXBlMi5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgbGVmdCA9IHN1YnN0aXR1dGUodHlwZTEubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUsIGxlZnRJbnN0YW5jZSk7CiAgICAgICAgdmFyIHJpZ2h0ID0gc3Vic3RpdHV0ZSh0eXBlMi5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZSwgcmlnaHRJbnN0YW5jZSk7CiAgICAgICAgaWYgKCFfdW5pZnkobGVmdCwgcmlnaHQpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGxlZnRSZXR1cm4gPSBzdWJzdGl0dXRlKHR5cGUxLnJldHVyblR5cGUsIGxlZnRJbnN0YW5jZSk7CiAgICAgIHZhciByaWdodFJldHVybiA9IHN1YnN0aXR1dGUodHlwZTIucmV0dXJuVHlwZSwgcmlnaHRJbnN0YW5jZSk7CiAgICAgIGlmICghX3VuaWZ5KGxlZnRSZXR1cm4sIHJpZ2h0UmV0dXJuKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgdHlwZTEucGFyYW1ldGVyID09IHR5cGUyLnBhcmFtZXRlciAmJgogICAgICAgIHR5cGUxLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPT0KICAgICAgICAgICAgdHlwZTIudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0eXBlMSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnModHlwZTEucGFyYW1ldGVyKSkgewogICAgICByZXR1cm4gX3RyeVN1YnN0aXR1dGlvbih0eXBlMS5wYXJhbWV0ZXIsIHR5cGUyKTsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHF1YW50aWZpZWRWYXJpYWJsZXMuY29udGFpbnModHlwZTIucGFyYW1ldGVyKSkgewogICAgICByZXR1cm4gX3RyeVN1YnN0aXR1dGlvbih0eXBlMi5wYXJhbWV0ZXIsIHR5cGUxKTsKICAgIH0KICAgIHJldHVybiBfZmFpbCgpOwogIH0KCiAgYm9vbCBfdHJ5U3Vic3RpdHV0aW9uKFR5cGVQYXJhbWV0ZXIgdmFyaWFibGUsIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZSh0eXBlLCBfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzKSkgewogICAgICByZXR1cm4gX2ZhaWwoKTsKICAgIH0KICAgIC8vIFNldCB0aGUgcGxhaW4gc3Vic3RpdHV0aW9uIGZpcnN0IGFuZCB0aGVuIGdlbmVyYXRlIHRoZSBkZWVwCiAgICAvLyBzdWJzdGl0dXRpb24gdG8gZGV0ZWN0IGN5Y2xlcy4KICAgIHN1YnN0aXR1dGlvblt2YXJpYWJsZV0gPSB0eXBlOwogICAgRGFydFR5cGUgZGVlcFN1YnN0aXR1dGUgPSBzdWJzdGl0dXRlRGVlcCh0eXBlLCBzdWJzdGl0dXRpb24pOwogICAgaWYgKGRlZXBTdWJzdGl0dXRlID09IG51bGwpIHJldHVybiBfZmFpbCgpOwogICAgc3Vic3RpdHV0aW9uW3ZhcmlhYmxlXSA9IGRlZXBTdWJzdGl0dXRlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIF9mYWlsKCkgewogICAgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTsKICB9Cn0KCmNsYXNzIF9PY2N1cnJlbmNlVmlzaXRvciBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgZmluYWwgU2V0PFR5cGVQYXJhbWV0ZXI+IHZhcmlhYmxlczsKCiAgX09jY3VycmVuY2VWaXNpdG9yKHRoaXMudmFyaWFibGVzKTsKCiAgYm9vbCB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgYm9vbCB2aXNpdE5hbWVkVHlwZShOYW1lZFR5cGUgbm9kZSkgewogICAgcmV0dXJuIHZpc2l0KG5vZGUudHlwZSk7CiAgfQoKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfS4iKTsKICB9CgogIGJvb2wgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgPT4gZmFsc2U7CgogIGJvb2wgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudHlwZUFyZ3VtZW50cy5hbnkodmlzaXQpOwogIH0KCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnR5cGVBcmd1bWVudHMuYW55KHZpc2l0KTsKICB9CgogIGJvb2wgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnR5cGVQYXJhbWV0ZXJzLmFueShoYW5kbGVUeXBlUGFyYW1ldGVyKSB8fAogICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuYW55KHZpc2l0KSB8fAogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmFueSh2aXNpdE5hbWVkVHlwZSkgfHwKICAgICAgICB2aXNpdChub2RlLnJldHVyblR5cGUpOwogIH0KCiAgYm9vbCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHJldHVybiB2YXJpYWJsZXMgPT0gbnVsbCB8fCB2YXJpYWJsZXMuY29udGFpbnMobm9kZS5wYXJhbWV0ZXIpOwogIH0KCiAgYm9vbCBoYW5kbGVUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgYXNzZXJ0KCF2YXJpYWJsZXMuY29udGFpbnMobm9kZSkpOwogICAgaWYgKG5vZGUuYm91bmQuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBub2RlLmRlZmF1bHRUeXBlLmFjY2VwdCh0aGlzKTsKICB9Cn0KCmNsYXNzIF9GcmVlRnVuY3Rpb25UeXBlVmFyaWFibGVWaXNpdG9yIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPGJvb2w+IHsKICBmaW5hbCBTZXQ8VHlwZVBhcmFtZXRlcj4gdmFyaWFibGVzID0gbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpOwoKICBfRnJlZUZ1bmN0aW9uVHlwZVZhcmlhYmxlVmlzaXRvcigpOwoKICBib29sIHZpc2l0KERhcnRUeXBlIG5vZGUpID0+IG5vZGUuYWNjZXB0KHRoaXMpOwoKICBib29sIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSAkbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfS4iKTsKICB9CgogIGJvb2wgdmlzaXROYW1lZFR5cGUoTmFtZWRUeXBlIG5vZGUpIHsKICAgIHJldHVybiB2aXNpdChub2RlLnR5cGUpOwogIH0KCiAgYm9vbCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSBub2RlKSA9PiBmYWxzZTsKICBib29sIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gZmFsc2U7CiAgYm9vbCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IGZhbHNlOwogIGJvb2wgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS50eXBlQXJndW1lbnRzLmFueSh2aXNpdCk7CiAgfQoKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudHlwZUFyZ3VtZW50cy5hbnkodmlzaXQpOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgdmFyaWFibGVzLmFkZEFsbChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIGJvb2wgcmVzdWx0ID0gbm9kZS50eXBlUGFyYW1ldGVycy5hbnkoaGFuZGxlVHlwZVBhcmFtZXRlcikgfHwKICAgICAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFueSh2aXNpdCkgfHwKICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5hbnkodmlzaXROYW1lZFR5cGUpIHx8CiAgICAgICAgdmlzaXQobm9kZS5yZXR1cm5UeXBlKTsKICAgIHZhcmlhYmxlcy5yZW1vdmVBbGwobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnBhcmFtZXRlci5wYXJlbnQgPT0gbnVsbCAmJiAhdmFyaWFibGVzLmNvbnRhaW5zKG5vZGUucGFyYW1ldGVyKTsKICB9CgogIGJvb2wgaGFuZGxlVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIGFzc2VydCh2YXJpYWJsZXMuY29udGFpbnMobm9kZSkpOwogICAgaWYgKG5vZGUuYm91bmQuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBub2RlLmRlZmF1bHRUeXBlLmFjY2VwdCh0aGlzKTsKICB9Cn0Kg3EATk48HQETAVArBEg8BEtPOVApQgIBTzUENEIkKjg+AgFITSwvLQQvPQQRAgFPUA4EUBwETUQETE8bBE8gGUApPCgxAgFRBE04SSc4AgFNRzg9AgFQSRkESD8EKARLBC5KSz4pTkk4AgFLMQRMUVE6TxcpNEUwBDQ1OwFFRzUQIklOTSIETgIBHDEjAUQBSzojGEsrOxNLAUsBLzYoAS4zBAIBTC9MAR4YAUABQkI4KwQBTzMEAUhLHwZLTCgGTiwvUEsvBAFLLjtMQ0cEAUYpPkdDPQQBSCk6R0M/BAFJDyE+RkYvPxRMBAFLLjVKMQQBTkwgOUotMy4GMz0GLwQBUB8GUEhNTCZJPDw1BAFEAUhBBAEyQgQCAS9HAR0BRUkEAQxPAQw5AQwtAgEuLCwBLAFFPQQBDDsCATEjAUkZGAYEAT4+BAE5LgQCATYWASkBRSZEBhEEAgEzJAEyAUU5NQQCATMBMxsmATMBRR80SwQCATdRAUABPiQEATkuTiUkMwYSBAIBPgROT09MTR0EKioqKioqBDxOSk9QTk4kBSsrKysrKwUBQCEEATwfBAEMAgFEICABIUYEAT0BTBYGTk08FgEwLAQBGioEAS0xHUArOQQBLR0hK0gEATYBNzcxNTMBNDEdQCtPBAEwMR1AK08EAUw8OAQBOAEyTk5JUR4HT1BPRjYMPy8vTjQ6TCI4HElBHT83HkMcMxtJMFAqKD0jBAE0FR0ZGQYZBAEzHCJNISgcCCcGEQQBPDo4H043BhEEAgE7ERsBQiQXLAQBDC9IBAEMPDoqKA0nGQ8aDSg0Mg8aBgQCARlPUQVLBU0QUQFMBk0wAUtQNwZCBjAGRkxLMD0gARcBTxovK00IBgQBNTU4KSsZDxkIBksUNwQBMCBJSUM9Q0E8MDQYCEg9RxgKCBMGOkgvM0pKNBgIUAkkEigJUUVHRzY3PkxHNEJDOwg+TE4wCERMTjAIP04YCkxOMAhDRToTBiYmLi4yEwYmOTcGJjk3BhQEAUFHFgZDJiNCMC0RBAERHAQCATwmASYBMgEoHQQBKFAEATIwNDQuATAqBAEsKgQBLjswNCAEAThEBAExJy4wKgQCAUpBASYBMgEoUAQBKB0EATIwNDQuATAqBAEsKgQBLitCMDQgLhMEAThRBAExJi4wKgQCASBwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydE1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3NyYy9mdXR1cmVfb3IuZGFydImoLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oZG1pdHJ5YXMpOiAgRGVsZXRlIHRoZSBmaWxlIHdoZW4gYSBzcGVjaWFsIHJlcHJlc2VudGF0aW9uIGZvciBGdXR1cmVPcgovLyBpcyBsYW5kZWQuCgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKCk51bGxhYmlsaXR5IHVuaXRlTnVsbGFiaWxpdGllcyhOdWxsYWJpbGl0eSBhLCBOdWxsYWJpbGl0eSBiKSB7CiAgaWYgKGEgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgfHwgYiA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgcmV0dXJuIE51bGxhYmlsaXR5Lm51bGxhYmxlOwogIH0KICBpZiAoYSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgfHwgYiA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgIHJldHVybiBOdWxsYWJpbGl0eS5sZWdhY3k7CiAgfQogIGlmIChhID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCB8fCBiID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCkgewogICAgcmV0dXJuIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDsKICB9CiAgcmV0dXJuIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOwp9CgpOdWxsYWJpbGl0eSBpbnRlcnNlY3ROdWxsYWJpbGl0aWVzKE51bGxhYmlsaXR5IGEsIE51bGxhYmlsaXR5IGIpIHsKICBpZiAoYSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSB8fCBiID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICByZXR1cm4gTnVsbGFiaWxpdHkubm9uTnVsbGFibGU7CiAgfQogIGlmIChhID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCB8fCBiID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCkgewogICAgcmV0dXJuIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDsKICB9CiAgaWYgKGEgPT0gTnVsbGFiaWxpdHkubGVnYWN5IHx8IGIgPT0gTnVsbGFiaWxpdHkubGVnYWN5KSB7CiAgICByZXR1cm4gTnVsbGFiaWxpdHkubGVnYWN5OwogIH0KICByZXR1cm4gTnVsbGFiaWxpdHkubnVsbGFibGU7Cn0KCk51bGxhYmlsaXR5IGNvbXB1dGVOdWxsYWJpbGl0eU9mRnV0dXJlT3IoCiAgICBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBDbGFzcyBmdXR1cmVPckNsYXNzKSB7CiAgYXNzZXJ0KGZ1dHVyZU9yLmNsYXNzTm9kZSA9PSBmdXR1cmVPckNsYXNzKTsKCiAgLy8gUGVyZm9ybWFuY2Ugbm90ZTogdGhlIGFsZ29yaXRobSBpcyBsaW5lYXIuCiAgRGFydFR5cGUgYXJndW1lbnQgPSBmdXR1cmVPci50eXBlQXJndW1lbnRzLnNpbmdsZTsKICBpZiAoYXJndW1lbnQgaXMgSW50ZXJmYWNlVHlwZSAmJiBhcmd1bWVudC5jbGFzc05vZGUgPT0gZnV0dXJlT3JDbGFzcykgewogICAgcmV0dXJuIHVuaXRlTnVsbGFiaWxpdGllcygKICAgICAgICBjb21wdXRlTnVsbGFiaWxpdHlPZkZ1dHVyZU9yKGFyZ3VtZW50LCBmdXR1cmVPckNsYXNzKSwKICAgICAgICBmdXR1cmVPci5udWxsYWJpbGl0eSk7CiAgfQogIGlmIChhcmd1bWVudCBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiBhcmd1bWVudC5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgIERhcnRUeXBlIHByb21vdGVkQm91bmQgPSBhcmd1bWVudC5wcm9tb3RlZEJvdW5kOwogICAgaWYgKHByb21vdGVkQm91bmQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHByb21vdGVkQm91bmQuY2xhc3NOYW1lID09IGZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgcmV0dXJuIHVuaXRlTnVsbGFiaWxpdGllcygKICAgICAgICAgIGludGVyc2VjdE51bGxhYmlsaXRpZXMoYXJndW1lbnQudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSwKICAgICAgICAgICAgICBjb21wdXRlTnVsbGFiaWxpdHlPZkZ1dHVyZU9yKHByb21vdGVkQm91bmQsIGZ1dHVyZU9yQ2xhc3MpKSwKICAgICAgICAgIGZ1dHVyZU9yLm51bGxhYmlsaXR5KTsKICAgIH0KICB9CiAgTnVsbGFiaWxpdHkgYXJndW1lbnROdWxsYWJpbGl0eSA9CiAgICAgIGFyZ3VtZW50IGlzIEludmFsaWRUeXBlID8gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkIDogYXJndW1lbnQubnVsbGFiaWxpdHk7CiAgcmV0dXJuIHVuaXRlTnVsbGFiaWxpdGllcyhhcmd1bWVudE51bGxhYmlsaXR5LCBmdXR1cmVPci5udWxsYWJpbGl0eSk7Cn0KCk51bGxhYmlsaXR5IGNvbXB1dGVOdWxsYWJpbGl0eShEYXJ0VHlwZSB0eXBlLCBDbGFzcyBmdXR1cmVPckNsYXNzKSB7CiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlLmNsYXNzTm9kZSA9PSBmdXR1cmVPckNsYXNzKSB7CiAgICByZXR1cm4gY29tcHV0ZU51bGxhYmlsaXR5T2ZGdXR1cmVPcih0eXBlLCBmdXR1cmVPckNsYXNzKTsKICB9CiAgcmV0dXJuIHR5cGUubnVsbGFiaWxpdHk7Cn0KRQBOTjwBTw4BFgE/QCEEPB8ESCUEIgIBQ0YkBEglBDwfBB8CASozLwEwNUofPx8ESTUqNCFISyEGBCRRSAIBRUI+BBsCASFwYWNrYWdlOmtlcm5lbC9zcmMvZnV0dXJlX29yLmRhcnRIZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi9zcmMvaGVhcC5kYXJ0hnEvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIEJhc2ljIGltcGxlbWVudGF0aW9uIG9mIGEgaGVhcCwgd2l0aCBPKGxvZyBuKSBpbnNlcnRpb24gYW5kIHJlbW92YWwuCmFic3RyYWN0IGNsYXNzIEhlYXA8VD4gewogIGZpbmFsIF9pdGVtcyA9IDxUPltdOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pdGVtcy5pc0VtcHR5OwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9pdGVtcy5pc05vdEVtcHR5OwoKICB2b2lkIGFkZChUIGl0ZW0pIHsKICAgIGludCBpbmRleCA9IF9pdGVtcy5sZW5ndGg7CiAgICBfaXRlbXMubGVuZ3RoICs9IDE7CiAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgIFQgcGFyZW50ID0gX2l0ZW1zW19wYXJlbnRJbmRleChpbmRleCldOwogICAgICBpZiAoc29ydHNCZWZvcmUocGFyZW50LCBpdGVtKSkgYnJlYWs7CiAgICAgIF9pdGVtc1tpbmRleF0gPSBwYXJlbnQ7CiAgICAgIGluZGV4ID0gX3BhcmVudEluZGV4KGluZGV4KTsKICAgIH0KICAgIF9pdGVtc1tpbmRleF0gPSBpdGVtOwogIH0KCiAgVCByZW1vdmUoKSB7CiAgICBUIHJlbW92ZWQgPSBfaXRlbXNbMF07CiAgICBUIG9ycGhhbiA9IF9pdGVtcy5yZW1vdmVMYXN0KCk7CiAgICBpZiAoX2l0ZW1zLmlzTm90RW1wdHkpIF9yZUluc2VydChvcnBoYW4pOwogICAgcmV0dXJuIHJlbW92ZWQ7CiAgfQoKICAvLy8gQ2xpZW50IHNob3VsZCB1c2UgYSBkZXJpdmVkIGNsYXNzIHRvIHNwZWNpZnkgdGhlIHNvcnQgb3JkZXIuCiAgYm9vbCBzb3J0c0JlZm9yZShUIGEsIFQgYik7CgogIGludCBfZmlyc3RDaGlsZEluZGV4KGludCBpbmRleCkgewogICAgcmV0dXJuIChpbmRleCA8PCAxKSArIDE7CiAgfQoKICBpbnQgX3BhcmVudEluZGV4KGludCBpbmRleCkgewogICAgcmV0dXJuIChpbmRleCAtIDEpID4+IDE7CiAgfQoKICB2b2lkIF9yZUluc2VydChUIGl0ZW0pIHsKICAgIGludCBpbmRleCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpbnQgY2hpbGRJbmRleCA9IF9maXJzdENoaWxkSW5kZXgoaW5kZXgpOwogICAgICBpZiAoY2hpbGRJbmRleCA+PSBfaXRlbXMubGVuZ3RoKSBicmVhazsKICAgICAgVCBjaGlsZCA9IF9pdGVtc1tjaGlsZEluZGV4XTsKICAgICAgaWYgKGNoaWxkSW5kZXggKyAxIDwgX2l0ZW1zLmxlbmd0aCkgewogICAgICAgIFQgbmV4dENoaWxkID0gX2l0ZW1zW2NoaWxkSW5kZXggKyAxXTsKICAgICAgICBpZiAoc29ydHNCZWZvcmUobmV4dENoaWxkLCBjaGlsZCkpIHsKICAgICAgICAgIGNoaWxkID0gbmV4dENoaWxkOwogICAgICAgICAgY2hpbGRJbmRleCsrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc29ydHNCZWZvcmUoaXRlbSwgY2hpbGQpKSBicmVhazsKICAgICAgX2l0ZW1zW2luZGV4XSA9IF9pdGVtc1tjaGlsZEluZGV4XTsKICAgICAgaW5kZXggPSBjaGlsZEluZGV4OwogICAgfQogICAgX2l0ZW1zW2luZGV4XSA9IGl0ZW07CiAgfQp9CkAATk48AUkZGAEmASwBFR8YGC4sHiMGGgQBDxskLhQEAUMeASQdBAEgHQQBGxMTMC4kLC4tHRgKCCsqGgYaBAIBHHBhY2thZ2U6a2VybmVsL3NyYy9oZWFwLmRhcnRSZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi9zcmMvbGVnYWN5X2VyYXN1cmUuZGFydImtLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICcuLi9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKaW1wb3J0ICcuLi9jb3JlX3R5cGVzLmRhcnQnOwoKaW1wb3J0ICdyZXBsYWNlbWVudF92aXNpdG9yLmRhcnQnOwoKLy8vIFJldHVybnMgbGVnYWN5IGVyYXN1cmUgb2YgW3R5cGVdLCB0aGF0IGlzLCB0aGUgdHlwZSBpbiB3aGljaCBhbGwgbm5iZAovLy8gbnVsbGFiaWxpdGllcyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBsZWdhY3kgbnVsbGFiaWxpdHksIGFuZCBhbGwgcmVxdWlyZWQKLy8vIG5hbWVkIHBhcmFtZXRlcnMgYXJlIG5vdCByZXF1aXJlZC4KRGFydFR5cGUgbGVnYWN5RXJhc3VyZShDb3JlVHlwZXMgY29yZVR5cGVzLCBEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUuYWNjZXB0KG5ldyBfTGVnYWN5RXJhc3VyZShjb3JlVHlwZXMpKSA/PyB0eXBlOwp9CgovLy8gUmV0dXJucyBsZWdhY3kgZXJhc3VyZSBvZiBbc3VwZXJ0eXBlXSwgdGhhdCBpcywgdGhlIHR5cGUgaW4gd2hpY2ggYWxsIG5uYmQKLy8vIG51bGxhYmlsaXRpZXMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggbGVnYWN5IG51bGxhYmlsaXR5LCBhbmQgYWxsIHJlcXVpcmVkCi8vLyBuYW1lZCBwYXJhbWV0ZXJzIGFyZSBub3QgcmVxdWlyZWQuClN1cGVydHlwZSBsZWdhY3lFcmFzdXJlU3VwZXJ0eXBlKENvcmVUeXBlcyBjb3JlVHlwZXMsIFN1cGVydHlwZSBzdXBlcnR5cGUpIHsKICBpZiAoc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgcmV0dXJuIHN1cGVydHlwZTsKICB9CiAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50czsKICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1tpXTsKICAgIERhcnRUeXBlIG5ld1R5cGVBcmd1bWVudCA9CiAgICAgICAgdHlwZUFyZ3VtZW50LmFjY2VwdChuZXcgX0xlZ2FjeUVyYXN1cmUoY29yZVR5cGVzKSk7CiAgICBpZiAobmV3VHlwZUFyZ3VtZW50ICE9IG51bGwpIHsKICAgICAgbmV3VHlwZUFyZ3VtZW50cyA/Pz0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG5ld1R5cGVBcmd1bWVudHNbaV0gPSBuZXdUeXBlQXJndW1lbnQ7CiAgICB9CiAgfQogIGlmIChuZXdUeXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKHN1cGVydHlwZS5jbGFzc05vZGUsIG5ld1R5cGVBcmd1bWVudHMpOwogIH0KICByZXR1cm4gc3VwZXJ0eXBlOwp9CgovLy8gVmlzaXRvciB0aGF0IHJlcGxhY2VzIGFsbCBubmJkIG51bGxhYmlsaXRpZXMgd2l0aCBsZWdhY3kgbnVsbGFiaWxpdGllcyBhbmQKLy8vIGFsbCByZXF1aXJlZCBuYW1lZCBwYXJhbWV0ZXJzIHdpdGggb3B0aW9uYWwgbmFtZWQgcGFyYW1ldGVycy4KLy8vCi8vLyBUaGUgdmlzaXRvciByZXR1cm5zIGBudWxsYCBpZiB0aGUgdHlwZSB3YXNuJ3QgY2hhbmdlZC4KY2xhc3MgX0xlZ2FjeUVyYXN1cmUgZXh0ZW5kcyBSZXBsYWNlbWVudFZpc2l0b3IgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIF9MZWdhY3lFcmFzdXJlKHRoaXMuY29yZVR5cGVzKTsKCiAgTnVsbGFiaWxpdHkgdmlzaXROdWxsYWJpbGl0eShEYXJ0VHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS5udWxsYWJpbGl0eSAhPSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgcmV0dXJuIE51bGxhYmlsaXR5LmxlZ2FjeTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZWRUeXBlIGNyZWF0ZU5hbWVkVHlwZShOYW1lZFR5cGUgbm9kZSwgRGFydFR5cGUgbmV3VHlwZSkgewogICAgaWYgKG5vZGUuaXNSZXF1aXJlZCB8fCBuZXdUeXBlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBOYW1lZFR5cGUobm9kZS5uYW1lLCBuZXdUeXBlID8/IG5vZGUudHlwZSwgaXNSZXF1aXJlZDogZmFsc2UpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLm51bGxDbGFzcykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc3VwZXIudmlzaXRJbnRlcmZhY2VUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXROZXZlclR5cGUoTmV2ZXJUeXBlIG5vZGUpID0+IGNvcmVUeXBlcy5udWxsVHlwZTsKfQpKAE1OPwEkHQEjAUpPJz09AgFPTydNKRYEIz04HzwjTC0GBCJBBBQCAU9CBDsyHQEiATAyIQYRBAEMQC5QBhEEAQw0PCsEAQxBAgEmcGFja2FnZTprZXJuZWwvc3JjL2xlZ2FjeV9lcmFzdXJlLmRhcnRIZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi9zcmMvbm9ybS5kYXJ0mg4vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJy4uL2FzdC5kYXJ0JyBoaWRlIE1hcEVudHJ5OwppbXBvcnQgJy4uL2NvcmVfdHlwZXMuZGFydCc7CgppbXBvcnQgJ2Z1dHVyZV9vci5kYXJ0JzsKaW1wb3J0ICdyZXBsYWNlbWVudF92aXNpdG9yLmRhcnQnOwoKLy8vIFJldHVybnMgbm9ybWFsaXphdGlvbiBvZiBbdHlwZV0uCkRhcnRUeXBlIG5vcm0oQ29yZVR5cGVzIGNvcmVUeXBlcywgRGFydFR5cGUgdHlwZSkgewogIHJldHVybiB0eXBlLmFjY2VwdChuZXcgX05vcm0oY29yZVR5cGVzKSkgPz8gdHlwZTsKfQoKU3VwZXJ0eXBlIG5vcm1TdXBlcnR5cGUoQ29yZVR5cGVzIGNvcmVUeXBlcywgU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogIGlmIChzdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gc3VwZXJ0eXBlOwogIF9Ob3JtIG5vcm1WaXNpdG9yID0gbmV3IF9Ob3JtKGNvcmVUeXBlcyk7CiAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IG51bGw7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnR5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgRGFydFR5cGUgdHlwZUFyZ3VtZW50ID0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbaV0uYWNjZXB0KG5vcm1WaXNpdG9yKTsKICAgIGlmICh0eXBlQXJndW1lbnQgIT0gbnVsbCkgewogICAgICB0eXBlQXJndW1lbnRzID8/PSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50cy50b0xpc3QoKTsKICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHR5cGVBcmd1bWVudDsKICAgIH0KICB9CiAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIHN1cGVydHlwZTsKICByZXR1cm4gbmV3IFN1cGVydHlwZShzdXBlcnR5cGUuY2xhc3NOb2RlLCB0eXBlQXJndW1lbnRzKTsKfQoKLy8vIFZpc2l0b3IgaW1wbGVtZW50aW5nIHRoZSBOT1JNIGFsZ29yaXRobS4KLy8vCi8vLyBWaXNpdG9yJ3MgbWV0aG9kcyByZXR1cm4gbnVsbCBpZiB0aGUgdHlwZSBpcyB1bmNoYW5nZWQgYnkgdGhlIE5PUk0KLy8vIGFsZ29yaXRobS4gIFRoZSBhbGdvcml0aG0gaXMgc3BlY2lmaWVkIGF0Ci8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2Jsb2IvbWFzdGVyL3Jlc291cmNlcy90eXBlLXN5c3RlbS9ub3JtYWxpemF0aW9uLm1kCmNsYXNzIF9Ob3JtIGV4dGVuZHMgUmVwbGFjZW1lbnRWaXNpdG9yIHsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICBfTm9ybSh0aGlzLmNvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykgewogICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSBub2RlLnR5cGVBcmd1bWVudHMuc2luZ2xlOwogICAgICB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnQuYWNjZXB0KHRoaXMpID8/IHR5cGVBcmd1bWVudDsKICAgICAgaWYgKGNvcmVUeXBlcy5pc1RvcCh0eXBlQXJndW1lbnQpKSB7CiAgICAgICAgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHlBc1Byb3BlcnR5ID0KICAgICAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5KHR5cGVBcmd1bWVudCwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpOwogICAgICAgIGFzc2VydChudWxsYWJpbGl0eUFzUHJvcGVydHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgfHwKICAgICAgICAgICAgbnVsbGFiaWxpdHlBc1Byb3BlcnR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSk7CiAgICAgICAgLy8gW3R5cGVBcmd1bWVudF0gaXMgbnVsbGFibGUgYmVjYXVzZSBpdCdzIGEgdG9wIHR5cGUuICBObyBuZWVkIHRvIHVuaXRlCiAgICAgICAgLy8gdGhlIG51bGxhYmlsaXRpZXMgb2YgW25vZGVdIGFuZCBbdHlwZUFyZ3VtZW50XS4KICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50LndpdGhOdWxsYWJpbGl0eShudWxsYWJpbGl0eUFzUHJvcGVydHkpOwogICAgICB9IGVsc2UgaWYgKHR5cGVBcmd1bWVudCBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICB0eXBlQXJndW1lbnQuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5vYmplY3RDbGFzcyAmJgogICAgICAgICAgdHlwZUFyZ3VtZW50Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgICAgYXNzZXJ0KCFjb3JlVHlwZXMuaXNUb3AodHlwZUFyZ3VtZW50KSk7CiAgICAgICAgLy8gW3R5cGVBcmd1bWVudF0gaXMgbm9uLW51bGxhYmxlLCBzbyB0aGUgdW5pb24gb2YgdGhhdCBhbmQgdGhlCiAgICAgICAgLy8gbnVsbGFiaWxpdHkgb2YgW25vZGVdIGlzIHRoZSBudWxsYWJpbGl0eSBvZiBbbm9kZV0uCiAgICAgICAgcmV0dXJuIHR5cGVBcmd1bWVudAogICAgICAgICAgICAud2l0aE51bGxhYmlsaXR5KGNvbXB1dGVOdWxsYWJpbGl0eShub2RlLCBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykpOwogICAgICB9IGVsc2UgaWYgKHR5cGVBcmd1bWVudCBpcyBOZXZlclR5cGUgJiYKICAgICAgICAgIHR5cGVBcmd1bWVudC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzVG9wKHR5cGVBcmd1bWVudCkpOwogICAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzT2JqZWN0KHR5cGVBcmd1bWVudCkpOwogICAgICAgIC8vIFt0eXBlQXJndW1lbnRdIGlzIG5vbi1udWxsYWJsZSwgc28gdGhlIHVuaW9uIG9mIHRoYXQgYW5kIHRoZQogICAgICAgIC8vIG51bGxhYmlsaXR5IG9mIFtub2RlXSBpcyB0aGUgbnVsbGFiaWxpdHkgb2YgW25vZGVdLgogICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgY29yZVR5cGVzLmZ1dHVyZUNsYXNzLAogICAgICAgICAgICBjb21wdXRlTnVsbGFiaWxpdHkobm9kZSwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpLAogICAgICAgICAgICA8RGFydFR5cGU+W3R5cGVBcmd1bWVudF0pOwogICAgICB9IGVsc2UgaWYgKGNvcmVUeXBlcy5pc051bGwodHlwZUFyZ3VtZW50KSkgewogICAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzVG9wKHR5cGVBcmd1bWVudCkpOwogICAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzT2JqZWN0KHR5cGVBcmd1bWVudCkpOwogICAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzQm90dG9tKHR5cGVBcmd1bWVudCkpOwogICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgY29yZVR5cGVzLmZ1dHVyZUNsYXNzLAogICAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZUFyZ3VtZW50Lm51bGxhYmlsaXR5LAogICAgICAgICAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5KG5vZGUsIGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKSksCiAgICAgICAgICAgIDxEYXJ0VHlwZT5bdHlwZUFyZ3VtZW50XSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KCFjb3JlVHlwZXMuaXNUb3AodHlwZUFyZ3VtZW50KSk7CiAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzT2JqZWN0KHR5cGVBcmd1bWVudCkpOwogICAgICBhc3NlcnQoIWNvcmVUeXBlcy5pc0JvdHRvbSh0eXBlQXJndW1lbnQpKTsKICAgICAgYXNzZXJ0KCFjb3JlVHlwZXMuaXNOdWxsKHR5cGVBcmd1bWVudCkpOwogICAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcywKICAgICAgICAgIGNvbXB1dGVOdWxsYWJpbGl0eShub2RlLCBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcyksCiAgICAgICAgICA8RGFydFR5cGU+W3R5cGVBcmd1bWVudF0pOwogICAgfQogICAgcmV0dXJuIHN1cGVyCiAgICAgICAgLnZpc2l0SW50ZXJmYWNlVHlwZShub2RlKQogICAgICAgID8ud2l0aE51bGxhYmlsaXR5KGNvbXB1dGVOdWxsYWJpbGl0eShub2RlLCBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS5wcm9tb3RlZEJvdW5kID09IG51bGwpIHsKICAgICAgRGFydFR5cGUgYm91bmQgPSBub2RlLnBhcmFtZXRlci5ib3VuZDsKICAgICAgaWYgKG5vcm1hbGl6ZXNUb05ldmVyKGJvdW5kKSkgewogICAgICAgIERhcnRUeXBlIHJlc3VsdCA9IG5ldyBOZXZlclR5cGUoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpCiAgICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkobm9kZS5udWxsYWJpbGl0eSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdC5hY2NlcHQodGhpcykgPz8gcmVzdWx0OwogICAgICB9CiAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzQm90dG9tKGJvdW5kKSk7CiAgICAgIC8vIElmIHRoZSBib3VuZCBpc24ndCBOZXZlciwgdGhlIHR5cGUgaXMgYWxyZWFkeSBub3JtYWxpemVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIERhcnRUeXBlIGJvdW5kID0gbm9kZS5wcm9tb3RlZEJvdW5kOwogICAgICBib3VuZCA9IGJvdW5kLmFjY2VwdCh0aGlzKSA/PyBib3VuZDsKICAgICAgaWYgKGJvdW5kIGlzIE5ldmVyVHlwZSAmJiBib3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICAgIHJldHVybiBib3VuZDsKICAgICAgfSBlbHNlIGlmIChjb3JlVHlwZXMuaXNUb3AoYm91bmQpKSB7CiAgICAgICAgYXNzZXJ0KCFjb3JlVHlwZXMuaXNCb3R0b20oYm91bmQpKTsKICAgICAgICBhc3NlcnQoYm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpOwogICAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICAgIG5vZGUucGFyYW1ldGVyLCBub2RlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkpOwogICAgICB9IGVsc2UgaWYgKGJvdW5kIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgICBib3VuZC5wYXJhbWV0ZXIgPT0gbm9kZS5wYXJhbWV0ZXIgJiYKICAgICAgICAgIGJvdW5kLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPT0KICAgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgJiYKICAgICAgICAgIGJvdW5kLnByb21vdGVkQm91bmQgPT0gbnVsbCkgewogICAgICAgIGFzc2VydCghY29yZVR5cGVzLmlzQm90dG9tKGJvdW5kKSk7CiAgICAgICAgYXNzZXJ0KCFjb3JlVHlwZXMuaXNUb3AoYm91bmQpKTsKICAgICAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKAogICAgICAgICAgICBub2RlLnBhcmFtZXRlciwgbm9kZS50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5KTsKICAgICAgfSBlbHNlIGlmIChib3VuZCA9PSBjb3JlVHlwZXMub2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlICYmCiAgICAgICAgICBub3JtKGNvcmVUeXBlcywgbm9kZS5wYXJhbWV0ZXIuYm91bmQpID09CiAgICAgICAgICAgICAgY29yZVR5cGVzLm9iamVjdE5vbk51bGxhYmxlUmF3VHlwZSkgewogICAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICAgIG5vZGUucGFyYW1ldGVyLCBub2RlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkpOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChib3VuZCwgbm9kZS5wcm9tb3RlZEJvdW5kKSkgewogICAgICAgIC8vIElmIFtib3VuZF0gaXMgaWRlbnRpY2FsIHRvIFtub2RlLnByb21vdGVkQm91bmRdLCB0aGVuIHRoZSBOT1JNCiAgICAgICAgLy8gYWxnb3JpdGhtcyBkaWRuJ3QgY2hhbmdlIHRoZSBwcm9tb3RlZCBib3VuZCwgc28gdGhlIFtub2RlXSBpcwogICAgICAgIC8vIHVuY2hhbmdlZCBhcyB3ZWxsLCBhbmQgd2UgcmV0dXJuIG51bGwgdG8gaW5kaWNhdGUgdGhhdC4KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKAogICAgICAgICAgbm9kZS5wYXJhbWV0ZXIsIG5vZGUudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSwgYm91bmQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXROZXZlclR5cGUoTmV2ZXJUeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSByZXR1cm4gY29yZVR5cGVzLm51bGxUeXBlOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIG5vcm1hbGl6ZXNUb05ldmVyKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIE5ldmVyVHlwZSAmJiB0eXBlLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGlmICh0eXBlLnByb21vdGVkQm91bmQgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBub3JtYWxpemVzVG9OZXZlcih0eXBlLnBhcmFtZXRlci5ib3VuZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZXNUb05ldmVyKHR5cGUucHJvbW90ZWRCb3VuZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KgKMATU4/ASQdARkjASU0NAIBRDksJz1MIDonBgQvPAIBLQRHLl0pHQEZAQw0NTlAKyxHQDpRO0QyPUEwSD8cUS5BMDNIPyIjPyczMDMzIiM5RCcILjExLyAjPSUGESJOBAEMPCYtJkEwLggqQxMNKytQFissOyZALy8wMyksKSZAQDM0JkA5SklDFQgkRQYEAQwsTREEASpMEywoOA82CAYSBAIBHHBhY2thZ2U6a2VybmVsL3NyYy9ub3JtLmRhcnRHZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi92aXNpdG9yLmRhcnTAAJO0Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuYXN0LnZpc2l0b3I7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICdhc3QuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uVmlzaXRvcjxSPiB7CiAgY29uc3QgRXhwcmVzc2lvblZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpID0+IG51bGw7CiAgUiBkZWZhdWx0QmFzaWNMaXRlcmFsKEJhc2ljTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKCiAgUiB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Tm90KE5vdCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TnVsbENoZWNrKE51bGxDaGVjayBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEZpbGVVcmlFeHByZXNzaW9uKEZpbGVVcmlFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRMZXQoTGV0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKfQoKYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50VmlzaXRvcjxSPiB7CiAgY29uc3QgU3RhdGVtZW50VmlzaXRvcigpOwoKICBSIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKfQoKYWJzdHJhY3QgY2xhc3MgTWVtYmVyVmlzaXRvcjxSPiB7CiAgY29uc3QgTWVtYmVyVmlzaXRvcigpOwoKICBSIGRlZmF1bHRNZW1iZXIoTWVtYmVyIG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSA9PiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIFIgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgSW5pdGlhbGl6ZXJWaXNpdG9yPFI+IHsKICBjb25zdCBJbml0aWFsaXplclZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgPT4KICAgICAgZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgPT4KICAgICAgZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRMb2NhbEluaXRpYWxpemVyKExvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7Cn0KCmNsYXNzIFRyZWVWaXNpdG9yPFI+CiAgICBpbXBsZW1lbnRzCiAgICAgICAgRXhwcmVzc2lvblZpc2l0b3I8Uj4sCiAgICAgICAgU3RhdGVtZW50VmlzaXRvcjxSPiwKICAgICAgICBNZW1iZXJWaXNpdG9yPFI+LAogICAgICAgIEluaXRpYWxpemVyVmlzaXRvcjxSPiB7CiAgY29uc3QgVHJlZVZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgPT4gbnVsbDsKCiAgLy8gRXhwcmVzc2lvbnMKICBSIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0Tm90KE5vdCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TnVsbENoZWNrKE51bGxDaGVjayBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdEZpbGVVcmlFeHByZXNzaW9uKEZpbGVVcmlFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICBSIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlKTsKICBSIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSk7CiAgUiB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSA9PiBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUpOwogIFIgdmlzaXRMZXQoTGV0IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSk7CiAgUiB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIFIgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKCiAgLy8gU3RhdGVtZW50cwogIFIgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlKTsKICBSIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlKTsKCiAgLy8gTWVtYmVycwogIFIgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSA9PiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIFIgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpID0+IGRlZmF1bHRNZW1iZXIobm9kZSk7CiAgUiB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0TWVtYmVyKG5vZGUpOwogIH0KCiAgLy8gQ2xhc3NlcwogIFIgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdEV4dGVuc2lvbihFeHRlbnNpb24gbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwoKICAvLyBJbml0aWFsaXplcnMKICBSIGRlZmF1bHRJbml0aWFsaXplcihJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgPT4KICAgICAgZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgPT4KICAgICAgZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRMb2NhbEluaXRpYWxpemVyKExvY2FsSW5pdGlhbGl6ZXIgbm9kZSkgPT4gZGVmYXVsdEluaXRpYWxpemVyKG5vZGUpOwogIFIgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSA9PiBkZWZhdWx0SW5pdGlhbGl6ZXIobm9kZSk7CgogIC8vIE90aGVyIHRyZWUgbm9kZXMKICBSIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0TGlicmFyeURlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRDb21iaW5hdG9yKENvbWJpbmF0b3Igbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdEZ1bmN0aW9uTm9kZShGdW5jdGlvbk5vZGUgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRBcmd1bWVudHMoQXJndW1lbnRzIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0TmFtZWRFeHByZXNzaW9uKE5hbWVkRXhwcmVzc2lvbiBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSA9PiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgUiB2aXNpdENhdGNoKENhdGNoIG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICBSIHZpc2l0TWFwRW50cnkoTWFwRW50cnkgbm9kZSkgPT4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIFIgdmlzaXRDb21wb25lbnQoQ29tcG9uZW50IG5vZGUpID0+IGRlZmF1bHRUcmVlTm9kZShub2RlKTsKfQoKY2xhc3MgRGFydFR5cGVWaXNpdG9yPFI+IHsKICBjb25zdCBEYXJ0VHlwZVZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7Cn0KCmNsYXNzIERhcnRUeXBlVmlzaXRvcjE8UiwgVD4gewogIFIgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUsIFQgYXJnKSA9PiBudWxsOwoKICBSIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlLCBhcmcpOwogIFIgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKICBSIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlLCBhcmcpOwogIFIgdmlzaXROZXZlclR5cGUoTmV2ZXJUeXBlIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSwgYXJnKTsKfQoKLy8vIFZpc2l0b3IgZm9yIFtDb25zdGFudF0gbm9kZXMuCi8vLwovLy8gTm90ZTogQ29uc3RhbnQgbm9kZXMgYXJlIF9ub3RfIHRyZWVzIGJ1dCBkaXJlY3RlZCBhY3ljbGljIGdyYXBocy4gVGhpcwovLy8gbWVhbnMgdGhhdCB2aXNpdGluZyBhIGNvbnN0YW50IG5vZGUgd2l0aG91dCB0cmFja2luZyB3aGljaCBzdWJub2RlcyB0aGF0Ci8vLyBoYXZlIGFscmVhZHkgYmVlbiB2aXNpdGVkIG1pZ2h0IGxlYWQgdG8gZXhwb25lbnRpYWwgcnVubmluZyB0aW1lcy4KLy8vCi8vLyBVc2UgW0NvbXB1dGVPbmNlQ29uc3RhbnRWaXNpdG9yXSBvciBbVmlzaXRPbmNlQ29uc3RhbnRWaXNpdG9yXSB0byB2aXNpdAovLy8gYSBjb25zdGFudCBub2RlIHdoaWxlIGVuc3VyaW5nIGVhY2ggc3Vibm9kZSBpcyBvbmx5IHZpc2l0ZWQgb25jZS4KY2xhc3MgQ29uc3RhbnRWaXNpdG9yPFI+IHsKICBjb25zdCBDb25zdGFudFZpc2l0b3IoKTsKCiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwp9CgphYnN0cmFjdCBjbGFzcyBfQ29uc3RhbnRDYWxsYmFjazxSPiB7CiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSk7CgogIFIgdmlzaXROdWxsQ29uc3RhbnQoTnVsbENvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKTsKICBSIHZpc2l0RG91YmxlQ29uc3RhbnQoRG91YmxlQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBub2RlKTsKICBSIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRJbnN0YW5jZUNvbnN0YW50KEluc3RhbmNlQ29uc3RhbnQgbm9kZSk7CiAgUiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKTsKICBSIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKTsKICBSIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudChUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSk7Cn0KCmNsYXNzIF9Db25zdGFudENhbGxiYWNrVmlzaXRvcjxSPiBpbXBsZW1lbnRzIENvbnN0YW50VmlzaXRvcjxSPiB7CiAgZmluYWwgX0NvbnN0YW50Q2FsbGJhY2sgX2NhbGxiYWNrOwoKICBfQ29uc3RhbnRDYWxsYmFja1Zpc2l0b3IodGhpcy5fY2FsbGJhY2spOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpID0+CiAgICAgIF9jYWxsYmFjay52aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0VHlwZUxpdGVyYWxDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0VGVhck9mZkNvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpID0+CiAgICAgIF9jYWxsYmFjay52aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRJbnN0YW5jZUNvbnN0YW50KEluc3RhbmNlQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0SW5zdGFuY2VDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpID0+IF9jYWxsYmFjay52aXNpdFNldENvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSA9PiBfY2FsbGJhY2sudmlzaXRMaXN0Q29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBfY2FsbGJhY2sudmlzaXRNYXBDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpID0+CiAgICAgIF9jYWxsYmFjay52aXNpdFN5bWJvbENvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgX2NhbGxiYWNrLnZpc2l0U3RyaW5nQ29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PgogICAgICBfY2FsbGJhY2sudmlzaXREb3VibGVDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpID0+IF9jYWxsYmFjay52aXNpdEludENvbnN0YW50KG5vZGUpOwoKICBAb3ZlcnJpZGUKICBSIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBub2RlKSA9PiBfY2FsbGJhY2sudmlzaXRCb29sQ29uc3RhbnQobm9kZSk7CgogIEBvdmVycmlkZQogIFIgdmlzaXROdWxsQ29uc3RhbnQoTnVsbENvbnN0YW50IG5vZGUpID0+IF9jYWxsYmFjay52aXNpdE51bGxDb25zdGFudChub2RlKTsKCiAgQG92ZXJyaWRlCiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gX2NhbGxiYWNrLmRlZmF1bHRDb25zdGFudChub2RlKTsKfQoKLy8vIFZpc2l0b3ItbGlrZSBjbGFzcyB1c2VkIGZvciB2aXNpdGluZyBhIFtDb25zdGFudF0gbm9kZSB3aGlsZSBjb21wdXRpbmcgYQovLy8gdmFsdWUgZm9yIGVhY2ggc3Vibm9kZS4gVGhlIHZpc2l0b3IgY2FjaGVzIHRoZSBjb21wdXRlZCB2YWx1ZXMgZW5zdXJpbmcgdGhhdAovLy8gZWFjaCBzdWJub2RlIGlzIG9ubHkgdmlzaXRlZCBvbmNlLgpjbGFzcyBDb21wdXRlT25jZUNvbnN0YW50VmlzaXRvcjxSPiBpbXBsZW1lbnRzIF9Db25zdGFudENhbGxiYWNrPFI+IHsKICBfQ29uc3RhbnRDYWxsYmFja1Zpc2l0b3I8Uj4gX3Zpc2l0b3I7CiAgTWFwPENvbnN0YW50LCBSPiBjYWNoZSA9IG5ldyBMaW5rZWRIYXNoTWFwLmlkZW50aXR5KCk7CgogIENvbXB1dGVPbmNlQ29uc3RhbnRWaXNpdG9yKCkgewogICAgX3Zpc2l0b3IgPSBuZXcgX0NvbnN0YW50Q2FsbGJhY2tWaXNpdG9yPFI+KHRoaXMpOwogIH0KCiAgLy8vIFZpc2l0cyBbbm9kZV0gaWYgbm90IGFscmVhZHkgdmlzaXRlZCB0byBjb21wdXRlIGEgdmFsdWUgZm9yIFtub2RlXS4KICAvLy8KICAvLy8gSWYgdGhlIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQgdGhlIGNhY2hlZCB2YWx1ZSBpcyByZXR1cm5lZCBpbW1lZGlhdGVseS4KICAvLy8KICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCB0byBjb21wdXRlIHZhbHVlcyBmb3Igc3Vibm9kZXMgcmVjdXJzaXZlbHksIHdoaWxlIG9ubHkKICAvLy8gdmlzaXRpbmcgZWFjaCBzdWJub2RlIG9uY2UuCiAgUiB2aXNpdENvbnN0YW50KENvbnN0YW50IG5vZGUpIHsKICAgIHJldHVybiBjYWNoZVtub2RlXSA/Pz0gbm9kZS5hY2NlcHQoX3Zpc2l0b3IpOwogIH0KCiAgUiBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKCiAgUiB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRCb29sQ29uc3RhbnQoQm9vbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW50Q29uc3RhbnQoSW50Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3ltYm9sQ29uc3RhbnQoU3ltYm9sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwp9CgovLy8gVmlzaXRvci1saWtlIGNsYXNzIHVzZWQgZm9yIHZpc2l0aW5nIGVhY2ggc3Vibm9kZSBvZiBhIFtDb25zdGFudF0gbm9kZSBvbmNlLgovLy8KLy8vIFRoZSB2aXNpdG9yIHJlY29yZHMgdGhlIHZpc2l0ZWQgbm9kZSB0byBlbnN1cmUgdGhhdCBlYWNoIHN1Ym5vZGUgaXMgb25seQovLy8gdmlzaXRlZCBvbmNlLgpjbGFzcyBWaXNpdE9uY2VDb25zdGFudFZpc2l0b3IgaW1wbGVtZW50cyBfQ29uc3RhbnRDYWxsYmFjazx2b2lkPiB7CiAgX0NvbnN0YW50Q2FsbGJhY2tWaXNpdG9yPHZvaWQ+IF92aXNpdG9yOwogIFNldDxDb25zdGFudD4gY2FjaGUgPSBuZXcgTGlua2VkSGFzaFNldC5pZGVudGl0eSgpOwoKICBWaXNpdE9uY2VDb25zdGFudFZpc2l0b3IoKSB7CiAgICBfdmlzaXRvciA9IG5ldyBfQ29uc3RhbnRDYWxsYmFja1Zpc2l0b3I8dm9pZD4odGhpcyk7CiAgfQoKICAvLy8gVmlzaXRzIFtub2RlXSBpZiBub3QgYWxyZWFkeSB2aXNpdGVkLgogIC8vLwogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIHRvIHZpc2l0IHN1Ym5vZGVzIHJlY3Vyc2l2ZWx5LCB3aGlsZSBvbmx5IHZpc2l0aW5nIGVhY2gKICAvLy8gc3Vibm9kZSBvbmNlLgogIHZvaWQgdmlzaXRDb25zdGFudChDb25zdGFudCBub2RlKSB7CiAgICBpZiAoY2FjaGUuYWRkKG5vZGUpKSB7CiAgICAgIG5vZGUuYWNjZXB0KF92aXNpdG9yKTsKICAgIH0KICB9CgogIHZvaWQgZGVmYXVsdENvbnN0YW50KENvbnN0YW50IG5vZGUpID0+IG51bGw7CgogIHZvaWQgdmlzaXROdWxsQ29uc3RhbnQoTnVsbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0RG91YmxlQ29uc3RhbnQoRG91YmxlQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRJbnN0YW5jZUNvbnN0YW50KEluc3RhbmNlQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIHZvaWQgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoVGVhck9mZkNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudChUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudChub2RlKTsKICB2b2lkIHZpc2l0VW5ldmFsdWF0ZWRDb25zdGFudChVbmV2YWx1YXRlZENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudChub2RlKTsKfQoKY2xhc3MgTWVtYmVyUmVmZXJlbmNlVmlzaXRvcjxSPiB7CiAgY29uc3QgTWVtYmVyUmVmZXJlbmNlVmlzaXRvcigpOwoKICBSIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpID0+IG51bGw7CgogIFIgdmlzaXRGaWVsZFJlZmVyZW5jZShGaWVsZCBub2RlKSA9PiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRDb25zdHJ1Y3RvclJlZmVyZW5jZShDb25zdHJ1Y3RvciBub2RlKSA9PiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRQcm9jZWR1cmVSZWZlcmVuY2UoUHJvY2VkdXJlIG5vZGUpID0+IGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICB9Cn0KCmNsYXNzIFZpc2l0b3I8Uj4gZXh0ZW5kcyBUcmVlVmlzaXRvcjxSPgogICAgaW1wbGVtZW50cwogICAgICAgIERhcnRUeXBlVmlzaXRvcjxSPiwKICAgICAgICBDb25zdGFudFZpc2l0b3I8Uj4sCiAgICAgICAgTWVtYmVyUmVmZXJlbmNlVmlzaXRvcjxSPiB7CiAgY29uc3QgVmlzaXRvcigpOwoKICAvLy8gVGhlIGNhdGNoLWFsbCBjYXNlLCBleGNlcHQgZm9yIHJlZmVyZW5jZXMuCiAgUiBkZWZhdWx0Tm9kZShOb2RlIG5vZGUpID0+IG51bGw7CiAgUiBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgPT4gZGVmYXVsdE5vZGUobm9kZSk7CgogIC8vIERhcnRUeXBlcwogIFIgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IGRlZmF1bHROb2RlKG5vZGUpOwogIFIgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpID0+IGRlZmF1bHREYXJ0VHlwZShub2RlKTsKICBSIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIFIgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSA9PiBkZWZhdWx0RGFydFR5cGUobm9kZSk7CiAgUiB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgPT4gZGVmYXVsdERhcnRUeXBlKG5vZGUpOwoKICAvLyBDb25zdGFudHMKICBSIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Tm9kZShub2RlKTsKICBSIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4gZGVmYXVsdENvbnN0YW50KG5vZGUpOwogIFIgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpID0+IGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudChub2RlKTsKICBSIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CiAgUiB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSA9PiBkZWZhdWx0Q29uc3RhbnQobm9kZSk7CgogIC8vIENsYXNzIHJlZmVyZW5jZXMKICBSIHZpc2l0Q2xhc3NSZWZlcmVuY2UoQ2xhc3Mgbm9kZSkgPT4gbnVsbDsKICBSIHZpc2l0VHlwZWRlZlJlZmVyZW5jZShUeXBlZGVmIG5vZGUpID0+IG51bGw7CgogIC8vIENvbnN0YW50IHJlZmVyZW5jZXMKICBSIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBub2RlKSA9PiBudWxsOwogIFIgdmlzaXROdWxsQ29uc3RhbnRSZWZlcmVuY2UoTnVsbENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0Qm9vbENvbnN0YW50UmVmZXJlbmNlKEJvb2xDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdEludENvbnN0YW50UmVmZXJlbmNlKEludENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0RG91YmxlQ29uc3RhbnRSZWZlcmVuY2UoRG91YmxlQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRTdHJpbmdDb25zdGFudFJlZmVyZW5jZShTdHJpbmdDb25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFN5bWJvbENvbnN0YW50UmVmZXJlbmNlKFN5bWJvbENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0TWFwQ29uc3RhbnRSZWZlcmVuY2UoTWFwQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRMaXN0Q29uc3RhbnRSZWZlcmVuY2UoTGlzdENvbnN0YW50IG5vZGUpID0+CiAgICAgIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0U2V0Q29uc3RhbnRSZWZlcmVuY2UoU2V0Q29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRJbnN0YW5jZUNvbnN0YW50UmVmZXJlbmNlKEluc3RhbmNlQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50UmVmZXJlbmNlKAogICAgICAgICAgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSA9PgogICAgICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgUiB2aXNpdFRlYXJPZmZDb25zdGFudFJlZmVyZW5jZShUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50UmVmZXJlbmNlKFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50UmVmZXJlbmNlKFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwoKICAvLyBNZW1iZXIgcmVmZXJlbmNlcwogIFIgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgPT4gbnVsbDsKICBSIHZpc2l0RmllbGRSZWZlcmVuY2UoRmllbGQgbm9kZSkgPT4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0Q29uc3RydWN0b3JSZWZlcmVuY2UoQ29uc3RydWN0b3Igbm9kZSkgPT4gZGVmYXVsdE1lbWJlclJlZmVyZW5jZShub2RlKTsKICBSIHZpc2l0UHJvY2VkdXJlUmVmZXJlbmNlKFByb2NlZHVyZSBub2RlKSA9PiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlKG5vZGUpOwogIFIgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2Uobm9kZSk7CiAgfQoKICBSIHZpc2l0TmFtZShOYW1lIG5vZGUpID0+IGRlZmF1bHROb2RlKG5vZGUpOwogIFIgdmlzaXRTdXBlcnR5cGUoU3VwZXJ0eXBlIG5vZGUpID0+IGRlZmF1bHROb2RlKG5vZGUpOwogIFIgdmlzaXROYW1lZFR5cGUoTmFtZWRUeXBlIG5vZGUpID0+IGRlZmF1bHROb2RlKG5vZGUpOwp9CgpjbGFzcyBSZWN1cnNpdmVWaXNpdG9yPFI+IGV4dGVuZHMgVmlzaXRvcjxSPiB7CiAgY29uc3QgUmVjdXJzaXZlVmlzaXRvcigpOwoKICBSIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLy8gVmlzaXRvciB0aGF0IHJlY3Vyc2l2ZWx5IHJld3JpdGVzIGVhY2ggbm9kZSBpbiB0cmVlLgovLy8KLy8vIFZpc2l0IG1ldGhvZHMgc2hvdWxkIHJldHVybiBhIG5ldyBub2RlLCBvciB0aGUgdmlzaXRlZCBub2RlIChwb3NzaWJseQovLy8gbXV0YXRlZCksIG9yIGFueSBub2RlIGZyb20gdGhlIHZpc2l0ZWQgbm9kZSdzIHN1YnRyZWUuCi8vLwovLy8gRWFjaCBzdWJjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgQVNUIHJlbWFpbnMgYSB0cmVlLgovLy8KLy8vIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWVyIHJlcGxhY2VzIGV2ZXJ5IG9jY3VycmVuY2Ugb2YKLy8vIGAhKHggJiYgeSlgIHdpdGggYCgheCB8fCAheSlgOgovLy8KLy8vICAgICBjbGFzcyBOZWdhdGlvblNpbmtlciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKLy8vICAgICAgIEBvdmVycmlkZQovLy8gICAgICAgTm9kZSB2aXNpdE5vdChOb3Qgbm9kZSkgewovLy8gICAgICAgICB2YXIgb3BlcmFuZCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7IC8vIFJlbWVtYmVyIHRvIHZpc2l0LgovLy8gICAgICAgICBpZiAob3BlcmFuZCBpcyBMb2dpY2FsRXhwcmVzc2lvbiAmJiBvcGVyYW5kLm9wZXJhdG9yID09ICcmJicpIHsKLy8vICAgICAgICAgICByZXR1cm4gbmV3IExvZ2ljYWxFeHByZXNzaW9uKAovLy8gICAgICAgICAgICAgbmV3IE5vdChvcGVyYW5kLmxlZnQpLAovLy8gICAgICAgICAgICAgJ3x8JywKLy8vICAgICAgICAgICAgIG5ldyBOb3Qob3BlcmFuZC5yaWdodCkpOwovLy8gICAgICAgICB9Ci8vLyAgICAgICAgIHJldHVybiBub2RlOwovLy8gICAgICAgfQovLy8gICAgIH0KLy8vCmNsYXNzIFRyYW5zZm9ybWVyIGV4dGVuZHMgVHJlZVZpc2l0b3I8VHJlZU5vZGU+IHsKICBjb25zdCBUcmFuc2Zvcm1lcigpOwoKICAvLy8gUmVwbGFjZXMgYSB1c2Ugb2YgYSB0eXBlLgogIC8vLwogIC8vLyBCeSBkZWZhdWx0LCByZWN1cnNpb24gc3RvcHMgYXQgdGhpcyBwb2ludC4KICBEYXJ0VHlwZSB2aXNpdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IG5vZGU7CgogIENvbnN0YW50IHZpc2l0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gbm9kZTsKCiAgU3VwZXJ0eXBlIHZpc2l0U3VwZXJ0eXBlKFN1cGVydHlwZSBub2RlKSA9PiBub2RlOwoKICBUcmVlTm9kZSBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIHJldHVybiBub2RlOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvblZpc2l0b3IxPFIsIFQ+IHsKICBjb25zdCBFeHByZXNzaW9uVmlzaXRvcjEoKTsKCiAgUiBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBudWxsOwogIFIgZGVmYXVsdEJhc2ljTGl0ZXJhbChCYXNpY0xpdGVyYWwgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Tm90KE5vdCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TnVsbENoZWNrKE51bGxDaGVjayBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZpbGVVcmlFeHByZXNzaW9uKEZpbGVVcmlFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRUaHJvdyhUaHJvdyBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKICBSIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRCYXNpY0xpdGVyYWwobm9kZSwgYXJnKTsKICBSIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0QmFzaWNMaXRlcmFsKG5vZGUsIGFyZyk7CiAgUiB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlLCBhcmcpOwogIFIgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlLCBhcmcpOwogIFIgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdEJhc2ljTGl0ZXJhbChub2RlLCBhcmcpOwogIFIgdmlzaXRMZXQoTGV0IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRFeHByZXNzaW9uKG5vZGUsIGFyZyk7CiAgUiB2aXNpdExvYWRMaWJyYXJ5KExvYWRMaWJyYXJ5IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0RXhwcmVzc2lvbihub2RlLCBhcmcpOwogIFIgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdEV4cHJlc3Npb24obm9kZSwgYXJnKTsKfQoKYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50VmlzaXRvcjE8UiwgVD4gewogIGNvbnN0IFN0YXRlbWVudFZpc2l0b3IxKCk7CgogIFIgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IG51bGw7CgogIFIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0QmxvY2soQmxvY2sgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKfQoKYWJzdHJhY3QgY2xhc3MgQm9keVZpc2l0b3IxPFIsIFQ+IGV4dGVuZHMgRXhwcmVzc2lvblZpc2l0b3IxPFIsIFQ+CiAgICBpbXBsZW1lbnRzIFN0YXRlbWVudFZpc2l0b3IxPFIsIFQ+IHsKICBjb25zdCBCb2R5VmlzaXRvcjEoKTsKCiAgUiBkZWZhdWx0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gbnVsbDsKICBSIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJsb2NrKEJsb2NrIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+IGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUsIFQgYXJnKSA9PiBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7CiAgUiB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlLCBUIGFyZykgPT4gZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlLCBUIGFyZykgPT4KICAgICAgZGVmYXVsdFN0YXRlbWVudChub2RlLCBhcmcpOwogIFIgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgVCBhcmcpID0+CiAgICAgIGRlZmF1bHRTdGF0ZW1lbnQobm9kZSwgYXJnKTsKICBSIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUsIFQgYXJnKSA9PgogICAgICBkZWZhdWx0U3RhdGVtZW50KG5vZGUsIGFyZyk7Cn0Kgy0ATk48HAEiGgETASYdATBHAU9DQ0NDT09NTT8/TUAfPh9NPh8zP08+HzofT01NTU9FRUdDSTs3Q0FBS1FRSUNJRUUzS0dDPB8CASUcAS4BOh42QkhKTEhIQkRISkIeQko8QEg6HjoeAgEiGQEoAT87M00gBAIBJx4BMgE4IE5OQCBOUAIBFQ8eHRogFwEsARFBR09DQ0NDT09NTT8/TUAfPh9NPh8zP08+HzofT01NTU9FRUdDSTs3Q0FBS1FRSUNJRUUzS0dDPB8BED86HjZCSEpMSEhCREhKQh5CSjxASDoeOh4BDTk/OzNNIAQBDTU9ARJDOCBOTkAgTlABFjlNP0E5RUM9ST81Oz0CARsbASwBQUE7P0VDTUE9AgEfMwFNTUdLUU89Ik1JAgEiBEtNRwRMRhsbASwBQ0NBR0dHQUNBS0wdSVFRAgEmJAEqKiguLi4oKigySjA4OAIBQiUBLAEMOjABDDowAQwyLAEMTDkBDDQtAQxMAQxPAQxMAQwwKwEMMCsBDDArAQxMAQxPAQxPAQxHAgFNUSdGKDkBITYEAUoGVwZOIiMyBAEsAUNDQUdHR0FDQUtMHUlRUQIBUQRNEkQrNgEfOQQBLAZPFCYbHQYEAS8BRkZESkpKREZETk8dTD0dPR0CASIiATEBRVFNMSwpBAIBKA8cHCQTATEkOQEPOUFBOz9FQ01BPQEPOUNDQUdHR0FDQUtMHUlRUQEWLTEBGTU1JjUmMyY5JjkmOSYzJjUmMyY9JjAwJjsmQyZDJgEXMUVRTTEsKQQBLzk5AgEvHAEdHhEEAgE5BEo7BEsESCMEMxQkS0wsJxYpDhkMCgQyFwEgBjExATEBNAEsIhEEAgEqHgE3NSQ9JE9PT089JD0kOyQ7JEtLOyRHJEUkOyRFJD9LPSRFJEEkPSQ7JDskOyQ9JFFRNSRPNyQ/JEdDT01NOSQ/JE81JjUmUVE/OSQ1JE9DJAIBKR0BNQFBI0JONyM5IzsjNyM3I05QNyM5I0kjTjkjSEw3I0EjQSMCAUMpGAE1QSNCTjcjOSM7IzcjNyNOUDcjOSNJI045I0hMNyNBI0EjAgEbcGFja2FnZTprZXJuZWwvdmlzaXRvci5kYXJ0TmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvY2Fub25pY2FsX25hbWUuZGFydJpeLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuY2Fub25pY2FsX25hbWU7CgppbXBvcnQgJ2FzdC5kYXJ0JzsKCi8vLyBBIHN0cmluZyBzZXF1ZW5jZSB0aGF0IGlkZW50aWZpZXMgYSBsaWJyYXJ5LCBjbGFzcywgb3IgbWVtYmVyLgovLy8KLy8vIENhbm9uaWNhbCBuYW1lcyBhcmUgb3JnYW5pemVkIGluIGEgcHJlZml4IHRyZWUuICBFYWNoIG5vZGUga25vd3MgaXRzCi8vLyBwYXJlbnQsIGNoaWxkcmVuLCBhbmQgdGhlIEFTVCBub2RlIGl0IGlzIGN1cnJlbnRseSBib3VuZCB0by4KLy8vCi8vLyBUaGUgZm9sbG93aW5nIHNjaGVtYSBzcGVjaWZpZXMgaG93IHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIGdpdmVuIG9iamVjdAovLy8gaXMgZGVmaW5lZDoKLy8vCi8vLyAgICAgIExpYnJhcnk6Ci8vLyAgICAgICAgIFVSSSBvZiBsaWJyYXJ5Ci8vLwovLy8gICAgICBDbGFzczoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGxpYnJhcnkKLy8vICAgICAgICAgTmFtZSBvZiBjbGFzcwovLy8KLy8vICAgICAgRXh0ZW5zaW9uOgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgbGlicmFyeQovLy8gICAgICAgICBOYW1lIG9mIGV4dGVuc2lvbgovLy8KLy8vICAgICAgQ29uc3RydWN0b3I6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAY29uc3RydWN0b3JzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgRmllbGQ6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAZmllbGRzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgVHlwZWRlZjoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGNsYXNzCi8vLyAgICAgICAgICJAdHlwZWRlZnMiCi8vLyAgICAgICAgIE5hbWUgdGV4dAovLy8KLy8vICAgICAgUHJvY2VkdXJlIHRoYXQgaXMgbm90IGFuIGFjY2Vzc29yIG9yIGZhY3Rvcnk6Ci8vLyAgICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIGVuY2xvc2luZyBjbGFzcyBvciBsaWJyYXJ5Ci8vLyAgICAgICAgICJAbWV0aG9kcyIKLy8vICAgICAgICAgUXVhbGlmaWVkIG5hbWUKLy8vCi8vLyAgICAgIFByb2NlZHVyZSB0aGF0IGlzIGEgZ2V0dGVyOgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3Mgb3IgbGlicmFyeQovLy8gICAgICAgICAiQGdldHRlcnMiCi8vLyAgICAgICAgIFF1YWxpZmllZCBuYW1lCi8vLwovLy8gICAgICBQcm9jZWR1cmUgdGhhdCBpcyBhIHNldHRlcjoKLy8vICAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgZW5jbG9zaW5nIGNsYXNzIG9yIGxpYnJhcnkKLy8vICAgICAgICAgIkBzZXR0ZXJzIgovLy8gICAgICAgICBRdWFsaWZpZWQgbmFtZQovLy8KLy8vICAgICAgUHJvY2VkdXJlIHRoYXQgaXMgYSBmYWN0b3J5OgovLy8gICAgICAgICBDYW5vbmljYWwgbmFtZSBvZiBlbmNsb3NpbmcgY2xhc3MKLy8vICAgICAgICAgIkBmYWN0b3JpZXMiCi8vLyAgICAgICAgIFF1YWxpZmllZCBuYW1lCi8vLwovLy8gICAgICBRdWFsaWZpZWQgbmFtZToKLy8vICAgICAgICAgaWYgcHJpdmF0ZTogVVJJIG9mIGxpYnJhcnkKLy8vICAgICAgICAgTmFtZSB0ZXh0Ci8vLwovLy8gVGhlICJxdWFsaWZpZWQgbmFtZSIgYWxsb3dzIGEgbWVtYmVyIHRvIGhhdmUgYSBuYW1lIHRoYXQgaXMgcHJpdmF0ZSB0bwovLy8gYSBsaWJyYXJ5IG90aGVyIHRoYW4gdGhlIG9uZSBjb250YWluaW5nIHRoYXQgbWVtYmVyLgpjbGFzcyBDYW5vbmljYWxOYW1lIHsKICBDYW5vbmljYWxOYW1lIF9wYXJlbnQ7CgogIENhbm9uaWNhbE5hbWUgZ2V0IHBhcmVudCA9PiBfcGFyZW50OwoKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBDYW5vbmljYWxOYW1lIF9ub25Sb290VG9wOwoKICBNYXA8U3RyaW5nLCBDYW5vbmljYWxOYW1lPiBfY2hpbGRyZW47CgogIC8vLyBUaGUgbGlicmFyeSwgY2xhc3MsIG9yIG1lbWJlciBib3VuZCB0byB0aGlzIG5hbWUuCiAgUmVmZXJlbmNlIHJlZmVyZW5jZTsKCiAgLy8vIFRlbXBvcmFyeSBpbmRleCB1c2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLgogIGludCBpbmRleCA9IC0xOwoKICBDYW5vbmljYWxOYW1lLl8odGhpcy5fcGFyZW50LCB0aGlzLm5hbWUpIHsKICAgIGFzc2VydChuYW1lICE9IG51bGwpOwogICAgYXNzZXJ0KHBhcmVudCAhPSBudWxsKTsKICAgIF9ub25Sb290VG9wID0gX3BhcmVudC5pc1Jvb3QgPyB0aGlzIDogX3BhcmVudC5fbm9uUm9vdFRvcDsKICB9CgogIENhbm9uaWNhbE5hbWUucm9vdCgpCiAgICAgIDogX3BhcmVudCA9IG51bGwsCiAgICAgICAgX25vblJvb3RUb3AgPSBudWxsLAogICAgICAgIG5hbWUgPSAnJzsKCiAgYm9vbCBnZXQgaXNSb290ID0+IF9wYXJlbnQgPT0gbnVsbDsKICBDYW5vbmljYWxOYW1lIGdldCBub25Sb290VG9wID0+IF9ub25Sb290VG9wOwoKICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBnZXQgY2hpbGRyZW4gPT4KICAgICAgX2NoaWxkcmVuPy52YWx1ZXMgPz8gY29uc3QgPENhbm9uaWNhbE5hbWU+W107CgogIEl0ZXJhYmxlPENhbm9uaWNhbE5hbWU+IGdldCBjaGlsZHJlbk9yTnVsbCA9PiBfY2hpbGRyZW4/LnZhbHVlczsKCiAgYm9vbCBoYXNDaGlsZChTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIF9jaGlsZHJlbiAhPSBudWxsICYmIF9jaGlsZHJlbi5jb250YWluc0tleShuYW1lKTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKICAgIHZhciBtYXAgPSBfY2hpbGRyZW4gPz89IDxTdHJpbmcsIENhbm9uaWNhbE5hbWU+e307CiAgICByZXR1cm4gbWFwW25hbWVdID8/PSBuZXcgQ2Fub25pY2FsTmFtZS5fKHRoaXMsIG5hbWUpOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXRDaGlsZEZyb21VcmkoVXJpIHVyaSkgewogICAgLy8gTm90ZSB0aGF0IHRoZSBVcmkgY2xhc3MgY2FjaGVzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGFuZCBhbGwgbGlicmFyeQogICAgLy8gVVJJcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGZvciBzZXJpYWxpemF0aW9uIGFueXdheSwgc28gdGhlcmUgaXMgbm8KICAgIC8vIHNpZ25pZmljYW50IGNvc3QgZm9yIGNvbnZlcnRpbmcgdGhlIFVyaSB0byBhIHN0cmluZyBoZXJlLgogICAgcmV0dXJuIGdldENoaWxkKCckdXJpJyk7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENoaWxkRnJvbVF1YWxpZmllZE5hbWUoTmFtZSBuYW1lKSB7CiAgICByZXR1cm4gbmFtZS5pc1ByaXZhdGUKICAgICAgICA/IGdldENoaWxkRnJvbVVyaShuYW1lLmxpYnJhcnkuaW1wb3J0VXJpKS5nZXRDaGlsZChuYW1lLm5hbWUpCiAgICAgICAgOiBnZXRDaGlsZChuYW1lLm5hbWUpOwogIH0KCiAgQ2Fub25pY2FsTmFtZSBnZXRDaGlsZEZyb21NZW1iZXIoTWVtYmVyIG1lbWJlcikgewogICAgcmV0dXJuIGdldENoaWxkKGdldE1lbWJlclF1YWxpZmllcihtZW1iZXIpKQogICAgICAgIC5nZXRDaGlsZEZyb21RdWFsaWZpZWROYW1lKG1lbWJlci5uYW1lKTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2hpbGRGcm9tRmllbGRXaXRoTmFtZShOYW1lIG5hbWUpIHsKICAgIHJldHVybiBnZXRDaGlsZCgnQGZpZWxkcycpLmdldENoaWxkRnJvbVF1YWxpZmllZE5hbWUobmFtZSk7CiAgfQoKICBDYW5vbmljYWxOYW1lIGdldENoaWxkRnJvbVR5cGVkZWYoVHlwZWRlZiB0eXBlZGVmXykgewogICAgcmV0dXJuIGdldENoaWxkKCdAdHlwZWRlZnMnKS5nZXRDaGlsZCh0eXBlZGVmXy5uYW1lKTsKICB9CgogIC8vLyBUYWtlIG93bmVyc2hpcCBvZiBhIGNoaWxkIGNhbm9uaWNhbCBuYW1lIGFuZCBpdHMgc3VidHJlZS4KICAvLy8KICAvLy8gVGhlIGNoaWxkIG5hbWUgaXMgcmVtb3ZlZCBhcyBhIGNoaWxkIG9mIGl0cyBjdXJyZW50IHBhcmVudCBhbmQgdGhpcyBuYW1lCiAgLy8vIGJlY29tZXMgdGhlIG5ldyBwYXJlbnQuICBOb3RlIHRoYXQgdGhpcyBtb3ZlcyB0aGUgZW50aXJlIHN1YnRyZWUgcm9vdGVkIGF0CiAgLy8vIHRoZSBjaGlsZC4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbW92ZSBzdWJ0cmVlcyB3aXRoaW4gYSBjYW5vbmljYWwgbmFtZSB0cmVlIG9yCiAgLy8vIGVsc2UgbW92ZSB0aGVtIGJldHdlZW4gdHJlZXMuICBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIGNoaWxkCiAgLy8vIG5hbWUgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoaXMgbmFtZS4KICAvLy8KICAvLy8gVGhlIHByZWNvbmRpdGlvbiBpcyB0aGF0IHRoaXMgbmFtZSBjYW5ub3QgaGF2ZSBhIChkaWZmZXJlbnQpIGNoaWxkIHdpdGgKICAvLy8gdGhlIHNhbWUgbmFtZS4KICB2b2lkIGFkb3B0Q2hpbGQoQ2Fub25pY2FsTmFtZSBjaGlsZCkgewogICAgaWYgKGNoaWxkLl9wYXJlbnQgPT0gdGhpcykgcmV0dXJuOwogICAgaWYgKF9jaGlsZHJlbiAhPSBudWxsICYmIF9jaGlsZHJlbi5jb250YWluc0tleShjaGlsZC5uYW1lKSkgewogICAgICB0aHJvdyAnQ2Fubm90IGFkZCBhIGNoaWxkIHRvICR0aGlzIGJlY2F1c2UgdGhpcyBuYW1lIGFscmVhZHkgaGFzIGEgJwogICAgICAgICAgJ2NoaWxkIG5hbWVkICR7Y2hpbGQubmFtZX0nOwogICAgfQogICAgY2hpbGQuX3BhcmVudC5yZW1vdmVDaGlsZChjaGlsZC5uYW1lKTsKICAgIGNoaWxkLl9wYXJlbnQgPSB0aGlzOwogICAgaWYgKF9jaGlsZHJlbiA9PSBudWxsKSBfY2hpbGRyZW4gPSA8U3RyaW5nLCBDYW5vbmljYWxOYW1lPnt9OwogICAgX2NoaWxkcmVuW2NoaWxkLm5hbWVdID0gY2hpbGQ7CiAgfQoKICB2b2lkIHJlbW92ZUNoaWxkKFN0cmluZyBuYW1lKSB7CiAgICBfY2hpbGRyZW4/LnJlbW92ZShuYW1lKTsKICB9CgogIHZvaWQgYmluZFRvKFJlZmVyZW5jZSB0YXJnZXQpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gdGFyZ2V0KSByZXR1cm47CiAgICBpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKICAgICAgdGhyb3cgJyR0aGlzIGlzIGFscmVhZHkgYm91bmQnOwogICAgfQogICAgaWYgKHRhcmdldC5jYW5vbmljYWxOYW1lICE9IG51bGwpIHsKICAgICAgdGhyb3cgJ0Nhbm5vdCBiaW5kICR0aGlzIHRvICR7dGFyZ2V0Lm5vZGV9LCB0YXJnZXQgaXMgYWxyZWFkeSBib3VuZCB0byAnCiAgICAgICAgICAnJHt0YXJnZXQuY2Fub25pY2FsTmFtZX0nOwogICAgfQogICAgdGFyZ2V0LmNhbm9uaWNhbE5hbWUgPSB0aGlzOwogICAgdGhpcy5yZWZlcmVuY2UgPSB0YXJnZXQ7CiAgfQoKICB2b2lkIHVuYmluZCgpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuOwogICAgYXNzZXJ0KHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lID09IHRoaXMpOwogICAgaWYgKHJlZmVyZW5jZS5ub2RlIGlzIENsYXNzKSB7CiAgICAgIC8vIFRPRE8oamVuc2opOiBHZXQgcmlkIG9mIHRoaXMuIFRoaXMgaXMgb25seSBuZWVkZWQgYmVjYXVzZSBwa2c6dm0gZG9lcwogICAgICAvLyB3ZWlyZCBzdHVmZiBpbiB0cmFuc2Zvcm1hdGlvbnMuIGB1bmJpbmRgIHNob3VsZCBwcm9iYWJseSBiZSBwcml2YXRlLgogICAgICBDbGFzcyBjID0gcmVmZXJlbmNlLm5vZGU7CiAgICAgIGMuZW5zdXJlTG9hZGVkKCk7CiAgICB9CiAgICByZWZlcmVuY2UuY2Fub25pY2FsTmFtZSA9IG51bGw7CiAgICByZWZlcmVuY2UgPSBudWxsOwogIH0KCiAgdm9pZCB1bmJpbmRBbGwoKSB7CiAgICB1bmJpbmQoKTsKICAgIEl0ZXJhYmxlPENhbm9uaWNhbE5hbWU+IGNoaWxkcmVuXyA9IGNoaWxkcmVuT3JOdWxsOwogICAgaWYgKGNoaWxkcmVuXyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ2Fub25pY2FsTmFtZSBjaGlsZCBpbiBjaGlsZHJlbl8pIHsKICAgICAgICBjaGlsZC51bmJpbmRBbGwoKTsKICAgICAgfQogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX3BhcmVudCA9PSBudWxsID8gJ3Jvb3QnIDogJyRwYXJlbnQ6OiRuYW1lJzsKCiAgUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKICAgIHJldHVybiByZWZlcmVuY2UgPz89IChuZXcgUmVmZXJlbmNlKCkuLmNhbm9uaWNhbE5hbWUgPSB0aGlzKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgZ2V0TWVtYmVyUXVhbGlmaWVyKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHJldHVybiAnQGdldHRlcnMnOwogICAgICBpZiAobWVtYmVyLmlzU2V0dGVyKSByZXR1cm4gJ0BzZXR0ZXJzJzsKICAgICAgaWYgKG1lbWJlci5pc0ZhY3RvcnkpIHJldHVybiAnQGZhY3Rvcmllcyc7CiAgICAgIHJldHVybiAnQG1ldGhvZHMnOwogICAgfQogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICByZXR1cm4gJ0BmaWVsZHMnOwogICAgfQogICAgaWYgKG1lbWJlciBpcyBDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gJ0Bjb25zdHJ1Y3RvcnMnOwogICAgfQogICAgaWYgKG1lbWJlciBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gJ0BmYWN0b3JpZXMnOwogICAgfQogICAgdGhyb3cgJ1VuZXhwZWN0ZWQgbWVtYmVyOiAkbWVtYmVyJzsKICB9Cn0KgOQATk48HwETAUMESUEETBAEEhsEEDAaBBQwHgQWORwbBBA5FhsEEi4YFgQ3ORcbBCU5FxsEJTkXGwQmLhkbBBknFgRLORYZAScBFR0BKAE4FwExEgEtGhw/BAEXGBwTASYvASo0AUMBHz0EASg3OgQBK1FJQR0EATcaRh8EATQwMQQBN0AEATg6BAFABk9REQZPUSwGThUpJ0JLJwYrGkIjBAEiHQQBIiUdJgYoTyUGIR0EARIjLSNPTiAYBiQWBAEVDjgdLxsIBgQBRAEdQgQBNB8uLjEZBhsYBiEeBjMbBigEAgEicGFja2FnZTprZXJuZWwvY2Fub25pY2FsX25hbWUuZGFydFVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0gvVsaWJyYXJ5IGtlcm5lbC50cmFuc2Zvcm1hdGlvbnMuZmxhZ3M7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKCi8vLyBGbGFncyBzdW1tYXJpemluZyB0aGUga2luZHMgb2YgQVNUIG5vZGVzIGNvbnRhaW5lZCBpbiBhIGdpdmVuIG1lbWJlciBvcgovLy8gY2xhc3MsIGZvciBzcGVlZGluZyB1cCB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBvbmx5IGFmZmVjdCBjZXJ0YWluIHR5cGVzIG9mCi8vLyBub2Rlcy4KLy8vCi8vLyBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBmcm9udGVuZCBhbmQgdGhlIGRlc2VyaWFsaXplci4KY2xhc3MgVHJhbnNmb3JtZXJGbGFnIHsKICAvLy8gVGhlIGNsYXNzIG9yIG1lbWJlciBjb250YWlucyAnc3VwZXInIGNhbGxzLCB0aGF0IGlzLCBvbmUgb2YgdGhlIEFTVCBub2RlcwogIC8vLyBbU3VwZXJQcm9wZXJ0eUdldF0sIFtTdXBlclByb3BlcnR5U2V0XSwgW1N1cGVyTWV0aG9kSW52b2NhdGlvbl0uCiAgc3RhdGljIGNvbnN0IGludCBzdXBlckNhbGxzID0gMSA8PCAwOwoKICAvLy8gVGVtcG9yYXJ5IGZsYWcgdXNlZCBieSB0aGUgdmVyaWZpZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gbWVtYmVyCiAgLy8vIGhhcyBiZWVuIHNlZW4uCiAgc3RhdGljIGNvbnN0IGludCBzZWVuQnlWZXJpZmllciA9IDEgPDwgMTsKCiAgLy8gVE9ETyhhc2dlcmYpOiAgV2UgY291bGQgYWxzbyBhZGQgYSBmbGFnIGZvciAnYXN5bmMnIGFuZCB3aWxsIHByb2JhYmx5IGhhdmUKICAvLyBvbmUgZm9yIGNsb3N1cmVzIGFzIHdlbGwuCn0KFwAmARYBTE0LBDgYUEcoAUwVLAFQHwIBKXBhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0UGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0wAER9S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmFzdF90b190ZXh0OwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAnZGFydDpjb3JlJyBhcyBjb3JlIHNob3cgTWFwRW50cnk7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uOwoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CmltcG9ydCAnLi4vaW1wb3J0X3RhYmxlLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgTmFtZXI8VD4gewogIGludCBpbmRleCA9IDA7CiAgZmluYWwgTWFwPFQsIFN0cmluZz4gbWFwID0gPFQsIFN0cmluZz57fTsKCiAgU3RyaW5nIGdldE5hbWUoVCBrZXkpID0+IG1hcC5wdXRJZkFic2VudChrZXksICgpID0+ICckcHJlZml4JHsrK2luZGV4fScpOwoKICBTdHJpbmcgZ2V0IHByZWZpeDsKfQoKY2xhc3MgTm9ybWFsTmFtZXI8VD4gZXh0ZW5kcyBOYW1lcjxUPiB7CiAgZmluYWwgU3RyaW5nIHByZWZpeDsKICBOb3JtYWxOYW1lcih0aGlzLnByZWZpeCk7Cn0KCmNsYXNzIENvbnN0YW50TmFtZXIgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPE51bGw+IHdpdGggTmFtZXI8Q29uc3RhbnQ+IHsKICBmaW5hbCBTdHJpbmcgcHJlZml4OwogIENvbnN0YW50TmFtZXIodGhpcy5wcmVmaXgpOwoKICBTdHJpbmcgZ2V0TmFtZShDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKCFtYXAuY29udGFpbnNLZXkoY29uc3RhbnQpKSB7CiAgICAgIC8vIFdoZW4gcHJpbnRpbmcgYSBub24tZnVsbHkgbGlua2VkIGtlcm5lbCBBU1QgKGkuZS4gc29tZSBbUmVmZXJlbmNlXXMKICAgICAgLy8gYXJlIG5vdCBib3VuZCkgdG8gdGV4dCwgd2UgbmVlZCB0byBhdm9pZCBkZXJlZmVyZW5jaW5nIGFueQogICAgICAvLyByZWZlcmVuY2VzLgogICAgICAvLwogICAgICAvLyBUaGUgbm9ybWFsIHZpc2l0b3IgQVBJIGNhdXNlcyByZWZlcmVuY2VzIHRvIGJlIGRlcmVmZXJlbmNlZCBpbiBvcmRlcgogICAgICAvLyB0byBjYWxsIHRoZSBgdmlzaXQ8bmFtZT4oPG5hbWU+KWAgLyBgdmlzaXQ8bmFtZT5SZWZlcmVuY2UoPG5hbWU+KWAuCiAgICAgIC8vCiAgICAgIC8vIFdlIHRoZXJlZm9yZSBoYW5kbGUgYW55IHN1YmNsYXNzIG9mIFtDb25zdGFudF0gd2hpY2ggaGFzIFtSZWZlcmVuY2VdcwogICAgICAvLyBzcGVjaWFsbHkgaGVyZS4KICAgICAgLy8KICAgICAgaWYgKGNvbnN0YW50IGlzIEluc3RhbmNlQ29uc3RhbnQpIHsKICAgICAgICAvLyBBdm9pZCB2aXNpdGluZyBgSW5zdGFuY2VDb25zdGFudC5jbGFzc1JlZmVyZW5jZWAuCiAgICAgICAgZm9yIChmaW5hbCB2YWx1ZSBpbiBjb25zdGFudC5maWVsZFZhbHVlcy52YWx1ZXMpIHsKICAgICAgICAgIC8vIE5hbWUgZXZlcnl0aGluZyBpbiBwb3N0LW9yZGVyIHZpc2l0IG9mIERBRy4KICAgICAgICAgIGdldE5hbWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBUZWFyT2ZmQ29uc3RhbnQpIHsKICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgbmFtaW5nIHRoZSBjb25zdGFudHMgdGhlbXNlbHZlcy4gW1RlYXJPZmZDb25zdGFudF0KICAgICAgICAvLyBoYXMgbm8gQ29uc3RhbnQgY2hpbGRyZW4uCiAgICAgICAgLy8gQXZvaWQgdmlzaXRpbmcgYFRlYXJPZmZDb25zdGFudC5wcm9jZWR1cmVSZWZlcmVuY2VgLgogICAgICB9IGVsc2UgewogICAgICAgIC8vIE5hbWUgZXZlcnl0aGluZyBpbiBwb3N0LW9yZGVyIHZpc2l0IG9mIERBRy4KICAgICAgICBjb25zdGFudC52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZShjb25zdGFudCk7CiAgfQoKICBkZWZhdWx0Q29uc3RhbnRSZWZlcmVuY2UoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGdldE5hbWUoY29uc3RhbnQpOwogIH0KCiAgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIC8vIE5vIG5lZWQgdG8gcmVjdXJzZSBpbnRvIGRhcnQgdHlwZXMsIHdlIG9ubHkgY2FyZSBhYm91dCBuYW1pbmcgdGhlCiAgICAvLyBjb25zdGFudHMgdGhlbXNlbHZlcy4KICB9Cn0KCmNsYXNzIERpc2FtYmlndWF0b3I8VCwgVT4gewogIGZpbmFsIE1hcDxULCBTdHJpbmc+IG5hbWVzVCA9IDxULCBTdHJpbmc+e307CiAgZmluYWwgTWFwPFUsIFN0cmluZz4gbmFtZXNVID0gPFUsIFN0cmluZz57fTsKICBmaW5hbCBTZXQ8U3RyaW5nPiB1c2VkTmFtZXMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgU3RyaW5nIGRpc2FtYmlndWF0ZShUIGtleTEsIFUga2V5MiwgU3RyaW5nIHByb3Bvc2VOYW1lKCkpIHsKICAgIGdldE5ld05hbWUoKSB7CiAgICAgIHZhciBwcm9wb3NlZE5hbWUgPSBwcm9wb3NlTmFtZSgpOwogICAgICBpZiAodXNlZE5hbWVzLmFkZChwcm9wb3NlZE5hbWUpKSByZXR1cm4gcHJvcG9zZWROYW1lOwogICAgICBpbnQgaSA9IDI7CiAgICAgIHdoaWxlICghdXNlZE5hbWVzLmFkZCgnJHByb3Bvc2VkTmFtZSRpJykpIHsKICAgICAgICArK2k7CiAgICAgIH0KICAgICAgcmV0dXJuICckcHJvcG9zZWROYW1lJGknOwogICAgfQoKICAgIGlmIChrZXkxICE9IG51bGwpIHsKICAgICAgU3RyaW5nIHJlc3VsdCA9IG5hbWVzVFtrZXkxXTsKICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgICByZXR1cm4gbmFtZXNUW2tleTFdID0gZ2V0TmV3TmFtZSgpOwogICAgfQogICAgaWYgKGtleTIgIT0gbnVsbCkgewogICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZXNVW2tleTJdOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICAgIHJldHVybiBuYW1lc1Vba2V5Ml0gPSBnZXROZXdOYW1lKCk7CiAgICB9CiAgICB0aHJvdyAiQ2Fubm90IGRpc2FtYmlndWF0ZSI7CiAgfQp9CgpOYW1lU3lzdGVtIGdsb2JhbERlYnVnZ2luZ05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKClN0cmluZyBkZWJ1Z0xpYnJhcnlOYW1lKExpYnJhcnkgbm9kZSkgewogIHJldHVybiBub2RlID09IG51bGwKICAgICAgPyAnbnVsbCcKICAgICAgOiBub2RlLm5hbWUgPz8gZ2xvYmFsRGVidWdnaW5nTmFtZXMubmFtZUxpYnJhcnkobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z0NsYXNzTmFtZShDbGFzcyBub2RlKSB7CiAgcmV0dXJuIG5vZGUgPT0gbnVsbAogICAgICA/ICdudWxsJwogICAgICA6IG5vZGUubmFtZSA/PyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcy5uYW1lQ2xhc3Mobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZShDbGFzcyBub2RlKSB7CiAgcmV0dXJuIGRlYnVnTGlicmFyeU5hbWUobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KSArICc6OicgKyBkZWJ1Z0NsYXNzTmFtZShub2RlKTsKfQoKU3RyaW5nIGRlYnVnTWVtYmVyTmFtZShNZW1iZXIgbm9kZSkgewogIHJldHVybiBub2RlLm5hbWU/Lm5hbWUgPz8gZ2xvYmFsRGVidWdnaW5nTmFtZXMubmFtZU1lbWJlcihub2RlKTsKfQoKU3RyaW5nIGRlYnVnUXVhbGlmaWVkTWVtYmVyTmFtZShNZW1iZXIgbm9kZSkgewogIGlmIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwpIHsKICAgIHJldHVybiBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZShub2RlLmVuY2xvc2luZ0NsYXNzKSArCiAgICAgICAgJzo6JyArCiAgICAgICAgZGVidWdNZW1iZXJOYW1lKG5vZGUpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZGVidWdMaWJyYXJ5TmFtZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpICsKICAgICAgICAnOjonICsKICAgICAgICBkZWJ1Z01lbWJlck5hbWUobm9kZSk7CiAgfQp9CgpTdHJpbmcgZGVidWdUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICByZXR1cm4gbm9kZS5uYW1lID8/IGdsb2JhbERlYnVnZ2luZ05hbWVzLm5hbWVUeXBlUGFyYW1ldGVyKG5vZGUpOwp9CgpTdHJpbmcgZGVidWdRdWFsaWZpZWRUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICBpZiAobm9kZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgIHJldHVybiBkZWJ1Z1F1YWxpZmllZENsYXNzTmFtZShub2RlLnBhcmVudCkgKwogICAgICAgICc6OicgKwogICAgICAgIGRlYnVnVHlwZVBhcmFtZXRlck5hbWUobm9kZSk7CiAgfQogIGlmIChub2RlLnBhcmVudCBpcyBNZW1iZXIpIHsKICAgIHJldHVybiBkZWJ1Z1F1YWxpZmllZE1lbWJlck5hbWUobm9kZS5wYXJlbnQpICsKICAgICAgICAnOjonICsKICAgICAgICBkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lKG5vZGUpOwogIH0KICByZXR1cm4gZGVidWdUeXBlUGFyYW1ldGVyTmFtZShub2RlKTsKfQoKU3RyaW5nIGRlYnVnVmFyaWFibGVEZWNsYXJhdGlvbk5hbWUoVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgcmV0dXJuIG5vZGUubmFtZSA/PyBnbG9iYWxEZWJ1Z2dpbmdOYW1lcy5uYW1lVmFyaWFibGUobm9kZSk7Cn0KClN0cmluZyBkZWJ1Z05vZGVUb1N0cmluZyhOb2RlIG5vZGUpIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBQcmludGVyKGJ1ZmZlciwgc3ludGhldGljTmFtZXM6IGdsb2JhbERlYnVnZ2luZ05hbWVzKS53cml0ZU5vZGUobm9kZSk7CiAgcmV0dXJuICckYnVmZmVyJzsKfQoKU3RyaW5nIGNvbXBvbmVudFRvU3RyaW5nKENvbXBvbmVudCBub2RlKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgUHJpbnRlcihidWZmZXIsIHN5bnRoZXRpY05hbWVzOiBuZXcgTmFtZVN5c3RlbSgpKQogICAgICAud3JpdGVDb21wb25lbnRGaWxlKG5vZGUpOwogIHJldHVybiAnJGJ1ZmZlcic7Cn0KCmNsYXNzIE5hbWVTeXN0ZW0gewogIGZpbmFsIE5hbWVyPFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgIG5ldyBOb3JtYWxOYW1lcjxWYXJpYWJsZURlY2xhcmF0aW9uPignI3QnKTsKICBmaW5hbCBOYW1lcjxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgTm9ybWFsTmFtZXI8TWVtYmVyPignI20nKTsKICBmaW5hbCBOYW1lcjxDbGFzcz4gY2xhc3NlcyA9IG5ldyBOb3JtYWxOYW1lcjxDbGFzcz4oJyNjbGFzcycpOwogIGZpbmFsIE5hbWVyPEV4dGVuc2lvbj4gZXh0ZW5zaW9ucyA9IG5ldyBOb3JtYWxOYW1lcjxFeHRlbnNpb24+KCcjZXh0ZW5zaW9uJyk7CiAgZmluYWwgTmFtZXI8TGlicmFyeT4gbGlicmFyaWVzID0gbmV3IE5vcm1hbE5hbWVyPExpYnJhcnk+KCcjbGliJyk7CiAgZmluYWwgTmFtZXI8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICBuZXcgTm9ybWFsTmFtZXI8VHlwZVBhcmFtZXRlcj4oJyNUJyk7CiAgZmluYWwgTmFtZXI8VHJlZU5vZGU+IGxhYmVscyA9IG5ldyBOb3JtYWxOYW1lcjxUcmVlTm9kZT4oJyNMJyk7CiAgZmluYWwgTmFtZXI8Q29uc3RhbnQ+IGNvbnN0YW50cyA9IG5ldyBDb25zdGFudE5hbWVyKCcjQycpOwogIGZpbmFsIERpc2FtYmlndWF0b3I8UmVmZXJlbmNlLCBDYW5vbmljYWxOYW1lPiBwcmVmaXhlcyA9CiAgICAgIG5ldyBEaXNhbWJpZ3VhdG9yPFJlZmVyZW5jZSwgQ2Fub25pY2FsTmFtZT4oKTsKCiAgbmFtZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgPT4gdmFyaWFibGVzLmdldE5hbWUobm9kZSk7CiAgbmFtZU1lbWJlcihNZW1iZXIgbm9kZSkgPT4gbWVtYmVycy5nZXROYW1lKG5vZGUpOwogIG5hbWVDbGFzcyhDbGFzcyBub2RlKSA9PiBjbGFzc2VzLmdldE5hbWUobm9kZSk7CiAgbmFtZUV4dGVuc2lvbihFeHRlbnNpb24gbm9kZSkgPT4gZXh0ZW5zaW9ucy5nZXROYW1lKG5vZGUpOwogIG5hbWVMaWJyYXJ5KExpYnJhcnkgbm9kZSkgPT4gbGlicmFyaWVzLmdldE5hbWUobm9kZSk7CiAgbmFtZVR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSA9PiB0eXBlUGFyYW1ldGVycy5nZXROYW1lKG5vZGUpOwogIG5hbWVTd2l0Y2hDYXNlKFN3aXRjaENhc2Ugbm9kZSkgPT4gbGFiZWxzLmdldE5hbWUobm9kZSk7CiAgbmFtZUxhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSA9PiBsYWJlbHMuZ2V0TmFtZShub2RlKTsKICBuYW1lQ29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgPT4gY29uc3RhbnRzLmdldE5hbWUobm9kZSk7CgogIGZpbmFsIFJlZ0V4cCBwYXRoU2VwYXJhdG9yID0gbmV3IFJlZ0V4cCgnW1xcL10nKTsKCiAgbmFtZUxpYnJhcnlQcmVmaXgoTGlicmFyeSBub2RlLCB7U3RyaW5nIHByb3Bvc2VkTmFtZX0pIHsKICAgIHJldHVybiBwcmVmaXhlcy5kaXNhbWJpZ3VhdGUobm9kZS5yZWZlcmVuY2UsIG5vZGUucmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUsCiAgICAgICAgKCkgewogICAgICBpZiAocHJvcG9zZWROYW1lICE9IG51bGwpIHJldHVybiBwcm9wb3NlZE5hbWU7CiAgICAgIGlmIChub2RlLm5hbWUgIT0gbnVsbCkgcmV0dXJuIGFiYnJldmlhdGVOYW1lKG5vZGUubmFtZSk7CiAgICAgIGlmIChub2RlLmltcG9ydFVyaSAhPSBudWxsKSB7CiAgICAgICAgdmFyIHBhdGggPSBub2RlLmltcG9ydFVyaS5oYXNFbXB0eVBhdGgKICAgICAgICAgICAgPyAnJHtub2RlLmltcG9ydFVyaX0nCiAgICAgICAgICAgIDogbm9kZS5pbXBvcnRVcmkucGF0aFNlZ21lbnRzLmxhc3Q7CiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoJy5kYXJ0JykpIHsKICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtICcuZGFydCcubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFiYnJldmlhdGVOYW1lKHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiAnTCc7CiAgICB9KTsKICB9CgogIG5hbWVDYW5vbmljYWxOYW1lQXNMaWJyYXJ5UHJlZml4KFJlZmVyZW5jZSBub2RlLCBDYW5vbmljYWxOYW1lIG5hbWUsCiAgICAgIHtTdHJpbmcgcHJvcG9zZWROYW1lfSkgewogICAgcmV0dXJuIHByZWZpeGVzLmRpc2FtYmlndWF0ZShub2RlLCBuYW1lLCAoKSB7CiAgICAgIGlmIChwcm9wb3NlZE5hbWUgIT0gbnVsbCkgcmV0dXJuIHByb3Bvc2VkTmFtZTsKICAgICAgQ2Fub25pY2FsTmFtZSBjYW5vbmljYWxOYW1lID0gbmFtZSA/PyBub2RlLmNhbm9uaWNhbE5hbWU7CiAgICAgIGlmIChjYW5vbmljYWxOYW1lPy5uYW1lICE9IG51bGwpIHsKICAgICAgICB2YXIgcGF0aCA9IGNhbm9uaWNhbE5hbWUubmFtZTsKICAgICAgICBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKHBhdGhTZXBhcmF0b3IpOwogICAgICAgIGlmIChzbGFzaCA+PSAwKSB7CiAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoc2xhc2ggKyAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoJy5kYXJ0JykpIHsKICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtICcuZGFydCcubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFiYnJldmlhdGVOYW1lKHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiAnTCc7CiAgICB9KTsKICB9CgogIGZpbmFsIFJlZ0V4cCBwdW5jdHVhdGlvbiA9IG5ldyBSZWdFeHAoJ1suOl0nKTsKCiAgU3RyaW5nIGFiYnJldmlhdGVOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBpbnQgZG90ID0gbmFtZS5sYXN0SW5kZXhPZihwdW5jdHVhdGlvbik7CiAgICBpZiAoZG90ICE9IC0xKSB7CiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhkb3QgKyAxKTsKICAgIH0KICAgIGlmIChuYW1lLmxlbmd0aCA+IDQpIHsKICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIDMpOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBBbm5vdGF0b3IgewogIFN0cmluZyBhbm5vdGF0ZVZhcmlhYmxlKFByaW50ZXIgcHJpbnRlciwgVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKTsKICBTdHJpbmcgYW5ub3RhdGVSZXR1cm4oUHJpbnRlciBwcmludGVyLCBGdW5jdGlvbk5vZGUgbm9kZSk7CiAgU3RyaW5nIGFubm90YXRlRmllbGQoUHJpbnRlciBwcmludGVyLCBGaWVsZCBub2RlKTsKfQoKLy8vIEEgcXVpY2sgYW5kIGRpcnR5IGFtYmlndW91cyB0ZXh0IHByaW50ZXIuCmNsYXNzIFByaW50ZXIgZXh0ZW5kcyBWaXNpdG9yPE51bGw+IHsKICBmaW5hbCBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzOwogIGZpbmFsIFN0cmluZ1Npbmsgc2luazsKICBmaW5hbCBBbm5vdGF0b3IgYW5ub3RhdG9yOwogIGZpbmFsIE1hcDxTdHJpbmcsIE1ldGFkYXRhUmVwb3NpdG9yeTxPYmplY3Q+PiBtZXRhZGF0YTsKICBJbXBvcnRUYWJsZSBpbXBvcnRUYWJsZTsKICBpbnQgaW5kZW50YXRpb24gPSAwOwogIGludCBjb2x1bW4gPSAwOwogIGJvb2wgc2hvd09mZnNldHM7CiAgYm9vbCBzaG93TWV0YWRhdGE7CgogIHN0YXRpYyBpbnQgU1BBQ0UgPSAwOwogIHN0YXRpYyBpbnQgV09SRCA9IDE7CiAgc3RhdGljIGludCBTWU1CT0wgPSAyOwogIGludCBzdGF0ZSA9IFNQQUNFOwoKICBQcmludGVyKHRoaXMuc2luaywKICAgICAge05hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMsCiAgICAgIHRoaXMuc2hvd09mZnNldHM6IGZhbHNlLAogICAgICB0aGlzLnNob3dNZXRhZGF0YTogZmFsc2UsCiAgICAgIHRoaXMuaW1wb3J0VGFibGUsCiAgICAgIHRoaXMuYW5ub3RhdG9yLAogICAgICB0aGlzLm1ldGFkYXRhfSkKICAgICAgOiB0aGlzLnN5bnRoZXRpY05hbWVzID0gc3ludGhldGljTmFtZXMgPz8gbmV3IE5hbWVTeXN0ZW0oKTsKCiAgUHJpbnRlciBjcmVhdGVJbm5lcihJbXBvcnRUYWJsZSBpbXBvcnRUYWJsZSwKICAgICAgTWFwPFN0cmluZywgTWV0YWRhdGFSZXBvc2l0b3J5PE9iamVjdD4+IG1ldGFkYXRhKSB7CiAgICByZXR1cm4gbmV3IFByaW50ZXIoc2luaywKICAgICAgICBpbXBvcnRUYWJsZTogaW1wb3J0VGFibGUsCiAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLAogICAgICAgIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcywKICAgICAgICBhbm5vdGF0b3I6IGFubm90YXRvciwKICAgICAgICBzaG93T2Zmc2V0czogc2hvd09mZnNldHMsCiAgICAgICAgc2hvd01ldGFkYXRhOiBzaG93TWV0YWRhdGEpOwogIH0KCiAgYm9vbCBzaG91bGRIaWdobGlnaHQoTm9kZSBub2RlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHN0YXJ0SGlnaGxpZ2h0KE5vZGUgbm9kZSkge30KICB2b2lkIGVuZEhpZ2hsaWdodChOb2RlIG5vZGUpIHt9CgogIFN0cmluZyBnZXRMaWJyYXJ5TmFtZShMaWJyYXJ5IG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnkobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0TGlicmFyeVJlZmVyZW5jZShMaWJyYXJ5IG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIExpYnJhcnk+JzsKICAgIGlmIChpbXBvcnRUYWJsZSAhPSBudWxsICYmIGltcG9ydFRhYmxlLmdldEltcG9ydEluZGV4KG5vZGUpICE9IC0xKSB7CiAgICAgIHJldHVybiBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlKTsKICAgIH0KICAgIHJldHVybiBnZXRMaWJyYXJ5TmFtZShub2RlKTsKICB9CgogIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3Mgbm9kZSkgewogICAgcmV0dXJuIG5vZGUubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lQ2xhc3Mobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0RXh0ZW5zaW9uTmFtZShFeHRlbnNpb24gbm9kZSkgewogICAgcmV0dXJuIG5vZGUubmFtZSA/PyBzeW50aGV0aWNOYW1lcy5uYW1lRXh0ZW5zaW9uKG5vZGUpOwogIH0KCiAgU3RyaW5nIGdldENsYXNzUmVmZXJlbmNlKENsYXNzIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIENsYXNzPic7CiAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShub2RlKTsKICAgIFN0cmluZyBsaWJyYXJ5ID0gZ2V0TGlicmFyeVJlZmVyZW5jZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgcmV0dXJuICckbGlicmFyeTo6JG5hbWUnOwogIH0KCiAgU3RyaW5nIGdldFR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gJzxObyBUeXBlZGVmPic7CiAgICBTdHJpbmcgbGlicmFyeSA9IGdldExpYnJhcnlSZWZlcmVuY2Uobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgIHJldHVybiAnJGxpYnJhcnk6OiR7bm9kZS5uYW1lfSc7CiAgfQoKICBzdGF0aWMgZmluYWwgU3RyaW5nIGVtcHR5TmFtZVN0cmluZyA9ICfigKInOwogIHN0YXRpYyBmaW5hbCBOYW1lIGVtcHR5TmFtZSA9IG5ldyBOYW1lKGVtcHR5TmFtZVN0cmluZyk7CgogIE5hbWUgZ2V0TWVtYmVyTmFtZShNZW1iZXIgbm9kZSkgewogICAgaWYgKG5vZGUubmFtZT8ubmFtZSA9PSAnJykgcmV0dXJuIGVtcHR5TmFtZTsKICAgIGlmIChub2RlLm5hbWUgIT0gbnVsbCkgcmV0dXJuIG5vZGUubmFtZTsKICAgIHJldHVybiBuZXcgTmFtZShzeW50aGV0aWNOYW1lcy5uYW1lTWVtYmVyKG5vZGUpKTsKICB9CgogIFN0cmluZyBnZXRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIE1lbWJlcj4nOwogICAgU3RyaW5nIG5hbWUgPSBnZXRNZW1iZXJOYW1lKG5vZGUpLm5hbWU7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzUmVmZXJlbmNlKG5vZGUucGFyZW50KTsKICAgICAgcmV0dXJuICckY2xhc3NOYW1lOjokbmFtZSc7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgbGlicmFyeSA9IGdldExpYnJhcnlSZWZlcmVuY2Uobm9kZS5lbmNsb3NpbmdMaWJyYXJ5KTsKICAgICAgcmV0dXJuICckbGlicmFyeTo6JG5hbWUnOwogICAgfQogIH0KCiAgU3RyaW5nIGdldFZhcmlhYmxlTmFtZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZVZhcmlhYmxlKG5vZGUpOwogIH0KCiAgU3RyaW5nIGdldFZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuICc8Tm8gVmFyaWFibGVEZWNsYXJhdGlvbj4nOwogICAgcmV0dXJuIGdldFZhcmlhYmxlTmFtZShub2RlKTsKICB9CgogIFN0cmluZyBnZXRUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZVR5cGVQYXJhbWV0ZXIobm9kZSk7CiAgfQoKICBTdHJpbmcgZ2V0VHlwZVBhcmFtZXRlclJlZmVyZW5jZShUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAnPE5vIFR5cGVQYXJhbWV0ZXI+JzsKICAgIFN0cmluZyBuYW1lID0gZ2V0VHlwZVBhcmFtZXRlck5hbWUobm9kZSk7CiAgICBpZiAobm9kZS5wYXJlbnQgaXMgRnVuY3Rpb25Ob2RlICYmIG5vZGUucGFyZW50LnBhcmVudCBpcyBNZW1iZXIpIHsKICAgICAgU3RyaW5nIG1lbWJlciA9IGdldE1lbWJlclJlZmVyZW5jZShub2RlLnBhcmVudC5wYXJlbnQpOwogICAgICByZXR1cm4gJyRtZW1iZXI6OiRuYW1lJzsKICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzUmVmZXJlbmNlKG5vZGUucGFyZW50KTsKICAgICAgcmV0dXJuICckY2xhc3NOYW1lOjokbmFtZSc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmFtZTsgLy8gQm91bmQgaW5zaWRlIGEgZnVuY3Rpb24gdHlwZS4KICAgIH0KICB9CgogIHZvaWQgd3JpdGVDb21wb25lbnRQcm9ibGVtcyhDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICB3cml0ZVByb2JsZW1zQXNKc29uKCJQcm9ibGVtcyBpbiBjb21wb25lbnQiLCBjb21wb25lbnQucHJvYmxlbXNBc0pzb24pOwogIH0KCiAgdm9pZCB3cml0ZVByb2JsZW1zQXNKc29uKFN0cmluZyBoZWFkZXIsIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbikgewogICAgaWYgKHByb2JsZW1zQXNKc29uPy5pc0VtcHR5ID09IGZhbHNlKSB7CiAgICAgIGVuZExpbmUoIi8vIik7CiAgICAgIHdyaXRlKCIvLyAiKTsKICAgICAgd3JpdGUoaGVhZGVyKTsKICAgICAgZW5kTGluZSgiOiIpOwogICAgICBlbmRMaW5lKCIvLyIpOwogICAgICBmb3IgKFN0cmluZyBzIGluIHByb2JsZW1zQXNKc29uKSB7CiAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkZWNvZGVkID0ganNvbi5kZWNvZGUocyk7CiAgICAgICAgTGlzdDxPYmplY3Q+IHBsYWluVGV4dEZvcm1hdHRlZCA9IGRlY29kZWRbInBsYWluVGV4dEZvcm1hdHRlZCJdOwogICAgICAgIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHBsYWluVGV4dEZvcm1hdHRlZC5qb2luKCJcbiIpLnNwbGl0KCJcbiIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdyaXRlKCIvLyIpOwogICAgICAgICAgU3RyaW5nIHRyaW1tZWQgPSBsaW5lc1tpXS50cmltUmlnaHQoKTsKICAgICAgICAgIGlmICh0cmltbWVkLmlzTm90RW1wdHkpIHdyaXRlKCIgIik7CiAgICAgICAgICBlbmRMaW5lKHRyaW1tZWQpOwogICAgICAgIH0KICAgICAgICBpZiAobGluZXMuaXNOb3RFbXB0eSkgZW5kTGluZSgiLy8iKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCB3cml0ZUxpYnJhcnlGaWxlKExpYnJhcnkgbGlicmFyeSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChsaWJyYXJ5LmFubm90YXRpb25zKTsKICAgIHdyaXRlV29yZCgnbGlicmFyeScpOwogICAgaWYgKGxpYnJhcnkubmFtZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZChsaWJyYXJ5Lm5hbWUpOwogICAgfQogICAgaWYgKGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICB3cml0ZVdvcmQoIi8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovIik7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CgogICAgTGlicmFyeUltcG9ydFRhYmxlIGltcG9ydHMgPSBuZXcgTGlicmFyeUltcG9ydFRhYmxlKGxpYnJhcnkpOwogICAgUHJpbnRlciBpbm5lciA9IGNyZWF0ZUlubmVyKGltcG9ydHMsIGxpYnJhcnkuZW5jbG9zaW5nQ29tcG9uZW50Py5tZXRhZGF0YSk7CiAgICBpbm5lci53cml0ZVN0YW5kYXJkTGlicmFyeUNvbnRlbnQobGlicmFyeSwKICAgICAgICBvdXRlclByaW50ZXI6IHRoaXMsIGltcG9ydHNUb1ByaW50OiBpbXBvcnRzKTsKICB9CgogIHZvaWQgcHJpbnRMaWJyYXJ5SW1wb3J0VGFibGUoTGlicmFyeUltcG9ydFRhYmxlIGltcG9ydHMpIHsKICAgIGZvciAodmFyIGxpYnJhcnkgaW4gaW1wb3J0cy5pbXBvcnRlZExpYnJhcmllcykgewogICAgICB2YXIgaW1wb3J0UGF0aCA9IGltcG9ydHMuZ2V0SW1wb3J0UGF0aChsaWJyYXJ5KTsKICAgICAgaWYgKGltcG9ydFBhdGggPT0gIiIpIHsKICAgICAgICB2YXIgcHJlZml4ID0KICAgICAgICAgICAgc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobGlicmFyeSwgcHJvcG9zZWROYW1lOiAnc2VsZicpOwogICAgICAgIGVuZExpbmUoJ2ltcG9ydCBzZWxmIGFzICRwcmVmaXg7Jyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KGxpYnJhcnkpOwogICAgICAgIGVuZExpbmUoJ2ltcG9ydCAiJGltcG9ydFBhdGgiIGFzICRwcmVmaXg7Jyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgd3JpdGVTdGFuZGFyZExpYnJhcnlDb250ZW50KExpYnJhcnkgbGlicmFyeSwKICAgICAge1ByaW50ZXIgb3V0ZXJQcmludGVyLCBMaWJyYXJ5SW1wb3J0VGFibGUgaW1wb3J0c1RvUHJpbnR9KSB7CiAgICBvdXRlclByaW50ZXIgPz89IHRoaXM7CiAgICBvdXRlclByaW50ZXIud3JpdGVQcm9ibGVtc0FzSnNvbigKICAgICAgICAiUHJvYmxlbXMgaW4gbGlicmFyeSIsIGxpYnJhcnkucHJvYmxlbXNBc0pzb24pOwoKICAgIGlmIChpbXBvcnRzVG9QcmludCAhPSBudWxsKSB7CiAgICAgIG91dGVyUHJpbnRlci5wcmludExpYnJhcnlJbXBvcnRUYWJsZShpbXBvcnRzVG9QcmludCk7CiAgICB9CgogICAgd3JpdGVBZGRpdGlvbmFsRXhwb3J0cyhsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzKTsKICAgIGVuZExpbmUoKTsKICAgIGxpYnJhcnkuZGVwZW5kZW5jaWVzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGlmIChsaWJyYXJ5LmRlcGVuZGVuY2llcy5pc05vdEVtcHR5KSBlbmRMaW5lKCk7CiAgICBsaWJyYXJ5LnBhcnRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGxpYnJhcnkudHlwZWRlZnMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbGlicmFyeS5jbGFzc2VzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIGxpYnJhcnkuZXh0ZW5zaW9ucy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBsaWJyYXJ5LmZpZWxkcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICBsaWJyYXJ5LnByb2NlZHVyZXMuZm9yRWFjaCh3cml0ZU5vZGUpOwogIH0KCiAgdm9pZCB3cml0ZUFkZGl0aW9uYWxFeHBvcnRzKExpc3Q8UmVmZXJlbmNlPiBhZGRpdGlvbmFsRXhwb3J0cykgewogICAgaWYgKGFkZGl0aW9uYWxFeHBvcnRzLmlzRW1wdHkpIHJldHVybjsKICAgIHdyaXRlKCdhZGRpdGlvbmFsRXhwb3J0cyA9ICgnKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbEV4cG9ydHMubGVuZ3RoOyBpKyspIHsKICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGFkZGl0aW9uYWxFeHBvcnRzW2ldOwogICAgICB2YXIgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgICBpZiAobm9kZSBpcyBDbGFzcykgewogICAgICAgIExpYnJhcnkgbm9kZUxpYnJhcnkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnk7CiAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KG5vZGVMaWJyYXJ5KTsKICAgICAgICB3cml0ZShwcmVmaXggKyAnOjonICsgbm9kZS5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIEV4dGVuc2lvbikgewogICAgICAgIExpYnJhcnkgbm9kZUxpYnJhcnkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnk7CiAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KG5vZGVMaWJyYXJ5KTsKICAgICAgICB3cml0ZShwcmVmaXggKyAnOjonICsgbm9kZS5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIEZpZWxkKSB7CiAgICAgICAgTGlicmFyeSBub2RlTGlicmFyeSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeTsKICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3ludGhldGljTmFtZXMubmFtZUxpYnJhcnlQcmVmaXgobm9kZUxpYnJhcnkpOwogICAgICAgIHdyaXRlKHByZWZpeCArICc6OicgKyBub2RlLm5hbWUubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBMaWJyYXJ5IG5vZGVMaWJyYXJ5ID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5OwogICAgICAgIFN0cmluZyBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlTGlicmFyeSk7CiAgICAgICAgd3JpdGUocHJlZml4ICsgJzo6JyArIG5vZGUubmFtZS5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChub2RlIGlzIFR5cGVkZWYpIHsKICAgICAgICBMaWJyYXJ5IG5vZGVMaWJyYXJ5ID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5OwogICAgICAgIFN0cmluZyBwcmVmaXggPSBzeW50aGV0aWNOYW1lcy5uYW1lTGlicmFyeVByZWZpeChub2RlTGlicmFyeSk7CiAgICAgICAgd3JpdGUocHJlZml4ICsgJzo6JyArIG5vZGUubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgIT0gbnVsbCkgewogICAgICAgIHdyaXRlKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lLnRvU3RyaW5nKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoJyR7bm9kZS5ydW50aW1lVHlwZX0nKTsKICAgICAgfQoKICAgICAgaWYgKGkgKyAxID09IGFkZGl0aW9uYWxFeHBvcnRzLmxlbmd0aCkgewogICAgICAgIGVuZExpbmUoIikiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbmRMaW5lKCIsIik7CiAgICAgICAgd3JpdGUoIiAgIik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgd3JpdGVDb21wb25lbnRGaWxlKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIEltcG9ydFRhYmxlIGltcG9ydHMgPSBuZXcgQ29tcG9uZW50SW1wb3J0VGFibGUoY29tcG9uZW50KTsKICAgIHZhciBpbm5lciA9IGNyZWF0ZUlubmVyKGltcG9ydHMsIGNvbXBvbmVudC5tZXRhZGF0YSk7CiAgICB3cml0ZVdvcmQoJ21haW4nKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICBpbm5lci53cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2UoY29tcG9uZW50Lm1haW5NZXRob2ROYW1lKTsKICAgIGVuZExpbmUoJzsnKTsKICAgIGlmIChzaG93TWV0YWRhdGEpIHsKICAgICAgaW5uZXIud3JpdGVNZXRhZGF0YShjb21wb25lbnQpOwogICAgfQogICAgd3JpdGVDb21wb25lbnRQcm9ibGVtcyhjb21wb25lbnQpOwogICAgZm9yICh2YXIgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIGlmIChzaG93TWV0YWRhdGEpIHsKICAgICAgICBpbm5lci53cml0ZU1ldGFkYXRhKGxpYnJhcnkpOwogICAgICB9CiAgICAgIHdyaXRlQW5ub3RhdGlvbkxpc3QobGlicmFyeS5hbm5vdGF0aW9ucyk7CiAgICAgIHdyaXRlV29yZCgnbGlicmFyeScpOwogICAgICBpZiAobGlicmFyeS5uYW1lICE9IG51bGwpIHsKICAgICAgICB3cml0ZVdvcmQobGlicmFyeS5uYW1lKTsKICAgICAgfQogICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkgIT0gbnVsbCkgewogICAgICAgIHdyaXRlU3BhY2VkKCdmcm9tJyk7CiAgICAgICAgd3JpdGVXb3JkKCciJHtsaWJyYXJ5LmltcG9ydFVyaX0iJyk7CiAgICAgIH0KICAgICAgdmFyIHByZWZpeCA9IHN5bnRoZXRpY05hbWVzLm5hbWVMaWJyYXJ5UHJlZml4KGxpYnJhcnkpOwogICAgICB3cml0ZVNwYWNlZCgnYXMnKTsKICAgICAgd3JpdGVXb3JkKHByZWZpeCk7CiAgICAgIGVuZExpbmUoJyB7Jyk7CiAgICAgICsraW5uZXIuaW5kZW50YXRpb247CgogICAgICBpbm5lci53cml0ZVN0YW5kYXJkTGlicmFyeUNvbnRlbnQobGlicmFyeSk7CiAgICAgIC0taW5uZXIuaW5kZW50YXRpb247CiAgICAgIGVuZExpbmUoJ30nKTsKICAgIH0KICAgIHdyaXRlQ29uc3RhbnRUYWJsZShjb21wb25lbnQpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnN0YW50VGFibGUoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgaWYgKHN5bnRoZXRpY05hbWVzLmNvbnN0YW50cy5tYXAuaXNFbXB0eSkgcmV0dXJuOwogICAgSW1wb3J0VGFibGUgaW1wb3J0cyA9IG5ldyBDb21wb25lbnRJbXBvcnRUYWJsZShjb21wb25lbnQpOwogICAgdmFyIGlubmVyID0gY3JlYXRlSW5uZXIoaW1wb3J0cywgY29tcG9uZW50Lm1ldGFkYXRhKTsKICAgIHdyaXRlV29yZCgnY29uc3RhbnRzICcpOwogICAgZW5kTGluZSgnIHsnKTsKICAgICsraW5uZXIuaW5kZW50YXRpb247CiAgICBmb3IgKGZpbmFsIENvbnN0YW50IGNvbnN0YW50CiAgICAgICAgaW4gc3ludGhldGljTmFtZXMuY29uc3RhbnRzLm1hcC5rZXlzLnRvTGlzdCgpKSB7CiAgICAgIGlubmVyLndyaXRlTm9kZShjb25zdGFudCk7CiAgICB9CiAgICAtLWlubmVyLmluZGVudGF0aW9uOwogICAgZW5kTGluZSgnfScpOwogIH0KCiAgaW50IGdldFByZWNlZGVuY2UoVHJlZU5vZGUgbm9kZSkgewogICAgcmV0dXJuIFByZWNlZGVuY2Uub2Yobm9kZSk7CiAgfQoKICB2b2lkIHdyaXRlKFN0cmluZyBzdHJpbmcpIHsKICAgIHNpbmsud3JpdGUoc3RyaW5nKTsKICAgIGNvbHVtbiArPSBzdHJpbmcubGVuZ3RoOwogIH0KCiAgdm9pZCB3cml0ZVNwYWNlKFtTdHJpbmcgc3RyaW5nID0gJyAnXSkgewogICAgd3JpdGUoc3RyaW5nKTsKICAgIHN0YXRlID0gU1BBQ0U7CiAgfQoKICB2b2lkIGVuc3VyZVNwYWNlKCkgewogICAgaWYgKHN0YXRlICE9IFNQQUNFKSB3cml0ZVNwYWNlKCk7CiAgfQoKICB2b2lkIHdyaXRlU3ltYm9sKFN0cmluZyBzdHJpbmcpIHsKICAgIHdyaXRlKHN0cmluZyk7CiAgICBzdGF0ZSA9IFNZTUJPTDsKICB9CgogIHZvaWQgd3JpdGVTcGFjZWQoU3RyaW5nIHN0cmluZykgewogICAgZW5zdXJlU3BhY2UoKTsKICAgIHdyaXRlKHN0cmluZyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgfQoKICB2b2lkIHdyaXRlQ29tbWEoW1N0cmluZyBzdHJpbmcgPSAnLCddKSB7CiAgICB3cml0ZShzdHJpbmcpOwogICAgd3JpdGVTcGFjZSgpOwogIH0KCiAgdm9pZCB3cml0ZVdvcmQoU3RyaW5nIHN0cmluZykgewogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm47CiAgICBlbnN1cmVXb3JkQm91bmRhcnkoKTsKICAgIHdyaXRlKHN0cmluZyk7CiAgICBzdGF0ZSA9IFdPUkQ7CiAgfQoKICB2b2lkIGVuc3VyZVdvcmRCb3VuZGFyeSgpIHsKICAgIGlmIChzdGF0ZSA9PSBXT1JEKSB7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVJbmRlbnRhdGlvbigpIHsKICAgIHdyaXRlU3BhY2UoJyAgJyAqIGluZGVudGF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgiPE51bGw+Iik7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBoaWdobGlnaHQgPSBzaG91bGRIaWdobGlnaHQobm9kZSk7CiAgICAgIGlmIChoaWdobGlnaHQpIHsKICAgICAgICBzdGFydEhpZ2hsaWdodChub2RlKTsKICAgICAgfQoKICAgICAgaWYgKHNob3dPZmZzZXRzICYmIG5vZGUgaXMgVHJlZU5vZGUpIHsKICAgICAgICB3cml0ZVdvcmQoIlske25vZGUuZmlsZU9mZnNldH1dIik7CiAgICAgIH0KICAgICAgaWYgKHNob3dNZXRhZGF0YSAmJiBub2RlIGlzIFRyZWVOb2RlKSB7CiAgICAgICAgd3JpdGVNZXRhZGF0YShub2RlKTsKICAgICAgfQoKICAgICAgbm9kZS5hY2NlcHQodGhpcyk7CgogICAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgICAgZW5kSGlnaGxpZ2h0KG5vZGUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxOb2RlKE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVNZXRhZGF0YShUcmVlTm9kZSBub2RlKSB7CiAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBtZCBpbiBtZXRhZGF0YS52YWx1ZXMpIHsKICAgICAgICBmaW5hbCBub2RlTWV0YWRhdGEgPSBtZC5tYXBwaW5nW25vZGVdOwogICAgICAgIGlmIChub2RlTWV0YWRhdGEgIT0gbnVsbCkgewogICAgICAgICAgd3JpdGVXb3JkKCJbQCR7bWQudGFnfT0ke25vZGVNZXRhZGF0YX1dIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQW5ub3RhdGVkVHlwZShEYXJ0VHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbikgewogICAgd3JpdGVUeXBlKHR5cGUpOwogICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewogICAgICB3cml0ZSgnLycpOwogICAgICB3cml0ZShhbm5vdGF0aW9uKTsKICAgICAgc3RhdGUgPSBXT1JEOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICB3cml0ZSgnPE5vIERhcnRUeXBlPicpOwogICAgfSBlbHNlIHsKICAgICAgdHlwZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlT3B0aW9uYWxUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgdHlwZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2aXNpdFN1cGVydHlwZShTdXBlcnR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICB3cml0ZSgnPE5vIFN1cGVydHlwZT4nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQ2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHR5cGUuY2xhc3NOYW1lKTsKICAgICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgICB3cml0ZUxpc3QodHlwZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgdHlwZSkgewogICAgd3JpdGVUeXBlZGVmUmVmZXJlbmNlKHR5cGUudHlwZWRlZk5vZGUpOwogICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlTGlzdCh0eXBlLnR5cGVBcmd1bWVudHMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlTW9kaWZpZXIoYm9vbCBpc1RoZXJlLCBTdHJpbmcgbmFtZSkgewogICAgaWYgKGlzVGhlcmUpIHsKICAgICAgd3JpdGVXb3JkKG5hbWUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZU5hbWUoTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZT8ubmFtZSA9PSAnJykgewogICAgICB3cml0ZVdvcmQoZW1wdHlOYW1lU3RyaW5nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlV29yZChuYW1lPy5uYW1lID8/ICc8YW5vbnltb3VzPicpOyAvLyBUT0RPOiB3cml0ZSBsaWJyYXJ5IG5hbWUKICAgIH0KICB9CgogIHZvaWQgZW5kTGluZShbU3RyaW5nIHN0cmluZ10pIHsKICAgIGlmIChzdHJpbmcgIT0gbnVsbCkgewogICAgICB3cml0ZShzdHJpbmcpOwogICAgfQogICAgd3JpdGUoJ1xuJyk7CiAgICBzdGF0ZSA9IFNQQUNFOwogICAgY29sdW1uID0gMDsKICB9CgogIHZvaWQgd3JpdGVGdW5jdGlvbihGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIHtuYW1lLCBMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMsIGJvb2wgdGVybWluYXRlTGluZTogdHJ1ZX0pIHsKICAgIGlmIChuYW1lIGlzIFN0cmluZykgewogICAgICB3cml0ZVdvcmQobmFtZSk7CiAgICB9IGVsc2UgaWYgKG5hbWUgaXMgTmFtZSkgewogICAgICB3cml0ZU5hbWUobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobmFtZSA9PSBudWxsKTsKICAgIH0KICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3QoZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMpOwogICAgd3JpdGVQYXJhbWV0ZXJMaXN0KGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICB3cml0ZVJldHVyblR5cGUoCiAgICAgICAgZnVuY3Rpb24ucmV0dXJuVHlwZSwgYW5ub3RhdG9yPy5hbm5vdGF0ZVJldHVybih0aGlzLCBmdW5jdGlvbikpOwogICAgaWYgKGluaXRpYWxpemVycyAhPSBudWxsICYmIGluaXRpYWxpemVycy5pc05vdEVtcHR5KSB7CiAgICAgIGVuZExpbmUoKTsKICAgICAgKytpbmRlbnRhdGlvbjsKICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgICB3cml0ZUNvbW1hKCc6Jyk7CiAgICAgIHdyaXRlTGlzdChpbml0aWFsaXplcnMsIHdyaXRlTm9kZSk7CiAgICAgIC0taW5kZW50YXRpb247CiAgICB9CiAgICBpZiAoZnVuY3Rpb24uYXN5bmNNYXJrZXIgIT0gQXN5bmNNYXJrZXIuU3luYykgewogICAgICB3cml0ZVNwYWNlZChnZXRBc3luY01hcmtlcktleXdvcmQoZnVuY3Rpb24uYXN5bmNNYXJrZXIpKTsKICAgIH0KICAgIGlmIChmdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgIT0gQXN5bmNNYXJrZXIuU3luYyAmJgogICAgICAgIGZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciAhPSBmdW5jdGlvbi5hc3luY01hcmtlcikgewogICAgICB3cml0ZVNwYWNlZCgiLyogb3JpZ2luYWxseSIpOwogICAgICB3cml0ZVNwYWNlZChnZXRBc3luY01hcmtlcktleXdvcmQoZnVuY3Rpb24uZGFydEFzeW5jTWFya2VyKSk7CiAgICAgIHdyaXRlU3BhY2VkKCIqLyIpOwogICAgfQogICAgaWYgKGZ1bmN0aW9uLmJvZHkgIT0gbnVsbCkgewogICAgICB3cml0ZUZ1bmN0aW9uQm9keShmdW5jdGlvbi5ib2R5LCB0ZXJtaW5hdGVMaW5lOiB0ZXJtaW5hdGVMaW5lKTsKICAgIH0gZWxzZSBpZiAodGVybWluYXRlTGluZSkgewogICAgICBlbmRMaW5lKCc7Jyk7CiAgICB9CiAgfQoKICBTdHJpbmcgZ2V0QXN5bmNNYXJrZXJLZXl3b3JkKEFzeW5jTWFya2VyIG1hcmtlcikgewogICAgc3dpdGNoIChtYXJrZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jOgogICAgICAgIHJldHVybiAnc3luYyc7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgcmV0dXJuICdzeW5jKic7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmM6CiAgICAgICAgcmV0dXJuICdhc3luYyc7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgIHJldHVybiAnYXN5bmMqJzsKICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jWWllbGRpbmc6CiAgICAgICAgcmV0dXJuICd5aWVsZGluZyc7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICc8SW52YWxpZCBhc3luYyBtYXJrZXI6ICRtYXJrZXI+JzsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVGdW5jdGlvbkJvZHkoU3RhdGVtZW50IGJvZHksIHtib29sIHRlcm1pbmF0ZUxpbmU6IHRydWV9KSB7CiAgICBpZiAoYm9keSBpcyBCbG9jayAmJiBib2R5LnN0YXRlbWVudHMuaXNFbXB0eSkgewogICAgICBlbnN1cmVTcGFjZSgpOwogICAgICB3cml0ZVN5bWJvbCgne30nKTsKICAgICAgc3RhdGUgPSBXT1JEOwogICAgICBpZiAodGVybWluYXRlTGluZSkgewogICAgICAgIGVuZExpbmUoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChib2R5IGlzIEJsb2NrKSB7CiAgICAgIGVuc3VyZVNwYWNlKCk7CiAgICAgIGVuZExpbmUoJ3snKTsKICAgICAgKytpbmRlbnRhdGlvbjsKICAgICAgYm9keS5zdGF0ZW1lbnRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgICAgLS1pbmRlbnRhdGlvbjsKICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgICBzdGF0ZSA9IFdPUkQ7CiAgICAgIGlmICh0ZXJtaW5hdGVMaW5lKSB7CiAgICAgICAgZW5kTGluZSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGJvZHkgaXMgUmV0dXJuU3RhdGVtZW50ICYmICF0ZXJtaW5hdGVMaW5lKSB7CiAgICAgIHdyaXRlU3BhY2VkKCc9PicpOwogICAgICB3cml0ZUV4cHJlc3Npb24oYm9keS5leHByZXNzaW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlQm9keShib2R5KTsKICAgIH0KICB9CgogIHdyaXRlRnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlLAogICAgICB7TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB0eXBlZGVmUG9zaXRpb25hbCwKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB0eXBlZGVmTmFtZWR9KSB7CiAgICBpZiAoc3RhdGUgPT0gV09SRCkgewogICAgICBlbnN1cmVTcGFjZSgpOwogICAgfQogICAgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICBMaXN0PERhcnRUeXBlPiBwb3NpdGlvbmFsID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVyczsKCiAgICBib29sIHBhcmFtZXRlcnNBbm5vdGF0ZWQgPSBmYWxzZTsKICAgIGlmICh0eXBlZGVmUG9zaXRpb25hbCAhPSBudWxsKSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwgaW4gdHlwZWRlZlBvc2l0aW9uYWwpIHsKICAgICAgICBwYXJhbWV0ZXJzQW5ub3RhdGVkID0KICAgICAgICAgICAgcGFyYW1ldGVyc0Fubm90YXRlZCB8fCBmb3JtYWwuYW5ub3RhdGlvbnMubGVuZ3RoID4gMDsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVkZWZOYW1lZCAhPSBudWxsKSB7CiAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwgaW4gdHlwZWRlZk5hbWVkKSB7CiAgICAgICAgcGFyYW1ldGVyc0Fubm90YXRlZCA9CiAgICAgICAgICAgIHBhcmFtZXRlcnNBbm5vdGF0ZWQgfHwgZm9ybWFsLmFubm90YXRpb25zLmxlbmd0aCA+IDA7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocGFyYW1ldGVyc0Fubm90YXRlZCAmJiB0eXBlZGVmUG9zaXRpb25hbCAhPSBudWxsKSB7CiAgICAgIHdyaXRlTGlzdCh0eXBlZGVmUG9zaXRpb25hbC50YWtlKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksCiAgICAgICAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVMaXN0KHBvc2l0aW9uYWwudGFrZShub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpLCB3cml0ZVR5cGUpOwogICAgfQoKICAgIGlmIChub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPCBwb3NpdGlvbmFsLmxlbmd0aCkgewogICAgICBpZiAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gMCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZVN5bWJvbCgnWycpOwogICAgICBpZiAocGFyYW1ldGVyc0Fubm90YXRlZCAmJiB0eXBlZGVmUG9zaXRpb25hbCAhPSBudWxsKSB7CiAgICAgICAgd3JpdGVMaXN0KHR5cGVkZWZQb3NpdGlvbmFsLnNraXAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSwKICAgICAgICAgICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZUxpc3QocG9zaXRpb25hbC5za2lwKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksIHdyaXRlVHlwZSk7CiAgICAgIH0KICAgICAgd3JpdGVTeW1ib2woJ10nKTsKICAgIH0KICAgIGlmIChub2RlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIH0KICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgaWYgKHBhcmFtZXRlcnNBbm5vdGF0ZWQgJiYgdHlwZWRlZk5hbWVkICE9IG51bGwpIHsKICAgICAgICB3cml0ZUxpc3QodHlwZWRlZk5hbWVkLCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHdyaXRlTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycywgdmlzaXROYW1lZFR5cGUpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgZW5zdXJlU3BhY2UoKTsKICAgIHdyaXRlKCfihpInKTsKICAgIHdyaXRlTnVsbGFiaWxpdHkobm9kZS5udWxsYWJpbGl0eSk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZVR5cGUobm9kZS5yZXR1cm5UeXBlKTsKICB9CgogIHZvaWQgd3JpdGVCb2R5KFN0YXRlbWVudCBib2R5KSB7CiAgICBpZiAoYm9keSBpcyBCbG9jaykgewogICAgICBlbmRMaW5lKCcgeycpOwogICAgICArK2luZGVudGF0aW9uOwogICAgICBib2R5LnN0YXRlbWVudHMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgICAtLWluZGVudGF0aW9uOwogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICAgIGVuZExpbmUoJ30nKTsKICAgIH0gZWxzZSB7CiAgICAgIGVuZExpbmUoKTsKICAgICAgKytpbmRlbnRhdGlvbjsKICAgICAgd3JpdGVOb2RlKGJvZHkpOwogICAgICAtLWluZGVudGF0aW9uOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVJldHVyblR5cGUoRGFydFR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb24pIHsKICAgIGlmICh0eXBlID09IG51bGwpIHJldHVybjsKICAgIHdyaXRlU3BhY2VkKCfihpInKTsKICAgIHdyaXRlQW5ub3RhdGVkVHlwZSh0eXBlLCBhbm5vdGF0aW9uKTsKICB9CgogIHZvaWQgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuOwogICAgd3JpdGVTeW1ib2woJzwnKTsKICAgIHdyaXRlTGlzdCh0eXBlUGFyYW1ldGVycywgd3JpdGVOb2RlKTsKICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICBzdGF0ZSA9IFdPUkQ7IC8vIEVuc3VyZSBzcGFjZSBpZiBub3QgZm9sbG93ZWQgYnkgYW5vdGhlciBzeW1ib2wuCiAgfQoKICB2b2lkIHdyaXRlUGFyYW1ldGVyTGlzdChMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWwsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWQsIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVMaXN0KAogICAgICAgIHBvc2l0aW9uYWwudGFrZShyZXF1aXJlZFBhcmFtZXRlckNvdW50KSwgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIGlmIChyZXF1aXJlZFBhcmFtZXRlckNvdW50IDwgcG9zaXRpb25hbC5sZW5ndGgpIHsKICAgICAgaWYgKHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiAwKSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICB9CiAgICAgIHdyaXRlU3ltYm9sKCdbJyk7CiAgICAgIHdyaXRlTGlzdCgKICAgICAgICAgIHBvc2l0aW9uYWwuc2tpcChyZXF1aXJlZFBhcmFtZXRlckNvdW50KSwgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgICAgd3JpdGVTeW1ib2woJ10nKTsKICAgIH0KICAgIGlmIChuYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChwb3NpdGlvbmFsLmlzTm90RW1wdHkpIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIH0KICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgd3JpdGVMaXN0KG5hbWVkLCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgICB3cml0ZVN5bWJvbCgnfScpOwogICAgfQogICAgd3JpdGVTeW1ib2woJyknKTsKICB9CgogIHZvaWQgd3JpdGVMaXN0PFQ+KEl0ZXJhYmxlPFQ+IG5vZGVzLCB2b2lkIGNhbGxiYWNrKFQgeCksCiAgICAgIHtTdHJpbmcgc2VwYXJhdG9yOiAnLCd9KSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAodmFyIG5vZGUgaW4gbm9kZXMpIHsKICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZUNvbW1hKHNlcGFyYXRvcik7CiAgICAgIH0KICAgICAgY2FsbGJhY2sobm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQ2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIHdyaXRlV29yZChnZXRDbGFzc1JlZmVyZW5jZUZyb21SZWZlcmVuY2UocmVmZXJlbmNlKSk7CiAgfQoKICBTdHJpbmcgZ2V0Q2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgcmV0dXJuICc8Tm8gQ2xhc3M+JzsKICAgIGlmIChyZWZlcmVuY2Uubm9kZSAhPSBudWxsKSByZXR1cm4gZ2V0Q2xhc3NSZWZlcmVuY2UocmVmZXJlbmNlLmFzQ2xhc3MpOwogICAgaWYgKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lICE9IG51bGwpCiAgICAgIHJldHVybiBnZXRDYW5vbmljYWxOYW1lU3RyaW5nKHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lKTsKICAgIHRocm93ICJOZWl0aGVyIG5vZGUgbm9yIGNhbm9uaWNhbCBuYW1lIGZvdW5kIjsKICB9CgogIHZvaWQgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKICAgIHdyaXRlV29yZChnZXRNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHJlZmVyZW5jZSkpOwogIH0KCiAgU3RyaW5nIGdldE1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2UoUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKSByZXR1cm4gJzxObyBNZW1iZXI+JzsKICAgIGlmIChyZWZlcmVuY2Uubm9kZSAhPSBudWxsKSByZXR1cm4gZ2V0TWVtYmVyUmVmZXJlbmNlKHJlZmVyZW5jZS5hc01lbWJlcik7CiAgICBpZiAocmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUgIT0gbnVsbCkKICAgICAgcmV0dXJuIGdldENhbm9uaWNhbE5hbWVTdHJpbmcocmVmZXJlbmNlLmNhbm9uaWNhbE5hbWUpOwogICAgdGhyb3cgIk5laXRoZXIgbm9kZSBub3IgY2Fub25pY2FsIG5hbWUgZm91bmQiOwogIH0KCiAgU3RyaW5nIGdldENhbm9uaWNhbE5hbWVTdHJpbmcoQ2Fub25pY2FsTmFtZSBuYW1lKSB7CiAgICBpZiAobmFtZS5pc1Jvb3QpIHRocm93ICd1bmV4cGVjdGVkIHJvb3QnOwogICAgaWYgKG5hbWUubmFtZS5zdGFydHNXaXRoKCdAJykpIHRocm93ICd1bmV4cGVjdGVkIEAnOwoKICAgIGxpYnJhcnlTdHJpbmcoQ2Fub25pY2FsTmFtZSBsaWIpIHsKICAgICAgaWYgKGxpYi5yZWZlcmVuY2U/Lm5vZGUgIT0gbnVsbCkKICAgICAgICByZXR1cm4gZ2V0TGlicmFyeVJlZmVyZW5jZShsaWIucmVmZXJlbmNlLmFzTGlicmFyeSk7CiAgICAgIHJldHVybiBzeW50aGV0aWNOYW1lcy5uYW1lQ2Fub25pY2FsTmFtZUFzTGlicmFyeVByZWZpeCgKICAgICAgICAgIGxpYi5yZWZlcmVuY2UsIGxpYik7CiAgICB9CgogICAgY2xhc3NTdHJpbmcoQ2Fub25pY2FsTmFtZSBjbHMpID0+CiAgICAgICAgbGlicmFyeVN0cmluZyhjbHMucGFyZW50KSArICc6OicgKyBjbHMubmFtZTsKCiAgICBpZiAobmFtZS5wYXJlbnQuaXNSb290KSByZXR1cm4gbGlicmFyeVN0cmluZyhuYW1lKTsKICAgIGlmIChuYW1lLnBhcmVudC5wYXJlbnQuaXNSb290KSByZXR1cm4gY2xhc3NTdHJpbmcobmFtZSk7CgogICAgQ2Fub25pY2FsTmFtZSBhdE5vZGUgPSBuYW1lLnBhcmVudDsKICAgIHdoaWxlICghYXROb2RlLm5hbWUuc3RhcnRzV2l0aCgnQCcpKSBhdE5vZGUgPSBhdE5vZGUucGFyZW50OwoKICAgIFN0cmluZyBwYXJlbnQgPSAiIjsKICAgIGlmIChhdE5vZGUucGFyZW50LnBhcmVudC5pc1Jvb3QpIHsKICAgICAgcGFyZW50ID0gbGlicmFyeVN0cmluZyhhdE5vZGUucGFyZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcmVudCA9IGNsYXNzU3RyaW5nKGF0Tm9kZS5wYXJlbnQpOwogICAgfQoKICAgIGlmIChuYW1lLm5hbWUgPT0gJycpIHJldHVybiAiJHBhcmVudDo6JGVtcHR5TmFtZVN0cmluZyI7CiAgICByZXR1cm4gIiRwYXJlbnQ6OiR7bmFtZS5uYW1lfSI7CiAgfQoKICB2b2lkIHdyaXRlVHlwZWRlZlJlZmVyZW5jZShUeXBlZGVmIHR5cGVkZWZOb2RlKSB7CiAgICB3cml0ZVdvcmQoZ2V0VHlwZWRlZlJlZmVyZW5jZSh0eXBlZGVmTm9kZSkpOwogIH0KCiAgdm9pZCB3cml0ZVZhcmlhYmxlUmVmZXJlbmNlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGZpbmFsIGhpZ2hsaWdodCA9IHNob3VsZEhpZ2hsaWdodCh2YXJpYWJsZSk7CiAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgIHN0YXJ0SGlnaGxpZ2h0KHZhcmlhYmxlKTsKICAgIH0KICAgIHdyaXRlV29yZChnZXRWYXJpYWJsZVJlZmVyZW5jZSh2YXJpYWJsZSkpOwogICAgaWYgKGhpZ2hsaWdodCkgewogICAgICBlbmRIaWdobGlnaHQodmFyaWFibGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVR5cGVQYXJhbWV0ZXJSZWZlcmVuY2UoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICB3cml0ZVdvcmQoZ2V0VHlwZVBhcmFtZXRlclJlZmVyZW5jZShub2RlKSk7CiAgfQoKICB2b2lkIHdyaXRlRXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUsIFtpbnQgbWluaW11bVByZWNlZGVuY2VdKSB7CiAgICBmaW5hbCBoaWdobGlnaHQgPSBzaG91bGRIaWdobGlnaHQobm9kZSk7CiAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgIHN0YXJ0SGlnaGxpZ2h0KG5vZGUpOwogICAgfQogICAgaWYgKHNob3dPZmZzZXRzKSB3cml0ZVdvcmQoIlske25vZGUuZmlsZU9mZnNldH1dIik7CiAgICBib29sIG5lZWRzUGFyZW50ZXNlcyA9IGZhbHNlOwogICAgaWYgKG1pbmltdW1QcmVjZWRlbmNlICE9IG51bGwgJiYgZ2V0UHJlY2VkZW5jZShub2RlKSA8IG1pbmltdW1QcmVjZWRlbmNlKSB7CiAgICAgIG5lZWRzUGFyZW50ZXNlcyA9IHRydWU7CiAgICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB9CiAgICB3cml0ZU5vZGUobm9kZSk7CiAgICBpZiAobmVlZHNQYXJlbnRlc2VzKSB7CiAgICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB9CiAgICBpZiAoaGlnaGxpZ2h0KSB7CiAgICAgIGVuZEhpZ2hsaWdodChub2RlKTsKICAgIH0KICB9CgogIHZvaWQgd3JpdGVBbm5vdGF0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVTeW1ib2woJ0AnKTsKICAgIGlmIChub2RlIGlzIENvbnN0cnVjdG9ySW52b2NhdGlvbikgewogICAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgICB2aXNpdEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQW5ub3RhdGlvbkxpc3QoTGlzdDxFeHByZXNzaW9uPiBub2Rlcywge2Jvb2wgc2VwYXJhdGVMaW5lczogdHJ1ZX0pIHsKICAgIGZvciAoRXhwcmVzc2lvbiBub2RlIGluIG5vZGVzKSB7CiAgICAgIGlmIChzZXBhcmF0ZUxpbmVzKSB7CiAgICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIHdyaXRlQW5ub3RhdGlvbihub2RlKTsKICAgICAgaWYgKHNlcGFyYXRlTGluZXMpIHsKICAgICAgICBlbmRMaW5lKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVTcGFjZSgpOwogICAgICB9CiAgICB9CiAgfQoKICB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7fQoKICB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNMYXRlLCAnbGF0ZScpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzU3RhdGljLCAnc3RhdGljJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNDb3ZhcmlhbnQsICdjb3ZhcmlhbnQnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsLCAnZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRmluYWwsICdmaW5hbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ29uc3QsICdjb25zdCcpOwogICAgLy8gT25seSBzaG93IGltcGxpY2l0IGdldHRlci9zZXR0ZXIgbW9kaWZpZXJzIGluIGNhc2VzIHdoZXJlIHRoZXkgYXJlCiAgICAvLyBvdXQgb2YgdGhlIG9yZGluYXJ5LgogICAgaWYgKG5vZGUuaXNTdGF0aWMpIHsKICAgICAgd3JpdGVNb2RpZmllcihub2RlLmhhc0ltcGxpY2l0R2V0dGVyLCAnW2dldHRlcl0nKTsKICAgICAgd3JpdGVNb2RpZmllcihub2RlLmhhc0ltcGxpY2l0U2V0dGVyLCAnW3NldHRlcl0nKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTW9kaWZpZXIoIW5vZGUuaGFzSW1wbGljaXRHZXR0ZXIsICdbbm8tZ2V0dGVyXScpOwogICAgICBpZiAobm9kZS5pc0ZpbmFsKSB7CiAgICAgICAgd3JpdGVNb2RpZmllcihub2RlLmhhc0ltcGxpY2l0U2V0dGVyLCAnW3NldHRlcl0nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZU1vZGlmaWVyKCFub2RlLmhhc0ltcGxpY2l0U2V0dGVyLCAnW25vLXNldHRlcl0nKTsKICAgICAgfQogICAgfQogICAgd3JpdGVXb3JkKCdmaWVsZCcpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVBbm5vdGF0ZWRUeXBlKG5vZGUudHlwZSwgYW5ub3RhdG9yPy5hbm5vdGF0ZUZpZWxkKHRoaXMsIG5vZGUpKTsKICAgIHdyaXRlTmFtZShnZXRNZW1iZXJOYW1lKG5vZGUpKTsKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgfQogICAgTGlzdDxTdHJpbmc+IGZlYXR1cmVzID0gPFN0cmluZz5bXTsKICAgIGlmIChub2RlLmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAhPQogICAgICAgIG5vZGUuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBpZiAobm9kZS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgICAgZmVhdHVyZXMuYWRkKCJpc05vbk51bGxhYmxlQnlEZWZhdWx0Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmVhdHVyZXMuYWRkKCJpc051bGxhYmxlQnlEZWZhdWx0Iik7CiAgICAgIH0KICAgIH0KICAgIGlmICgobm9kZS5lbmNsb3NpbmdDbGFzcyA9PSBudWxsICYmCiAgICAgICAgICAgIG5vZGUuZW5jbG9zaW5nTGlicmFyeS5maWxlVXJpICE9IG5vZGUuZmlsZVVyaSkgfHwKICAgICAgICAobm9kZS5lbmNsb3NpbmdDbGFzcyAhPSBudWxsICYmCiAgICAgICAgICAgIG5vZGUuZW5jbG9zaW5nQ2xhc3MuZmlsZVVyaSAhPSBub2RlLmZpbGVVcmkpKSB7CiAgICAgIGZlYXR1cmVzLmFkZCgiIGZyb20gJHtub2RlLmZpbGVVcml9ICIpOwogICAgfQogICAgaWYgKGZlYXR1cmVzLmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVXb3JkKCIvKiR7ZmVhdHVyZXMuam9pbignLCcpfSovIik7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0V4dGVybmFsLCAnZXh0ZXJuYWwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc1N0YXRpYywgJ3N0YXRpYycpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQWJzdHJhY3QsICdhYnN0cmFjdCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRm9yd2FyZGluZ1N0dWIsICdmb3J3YXJkaW5nLXN0dWInKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0ZvcndhcmRpbmdTZW1pU3R1YiwgJ2ZvcndhcmRpbmctc2VtaS1zdHViJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNNZW1iZXJTaWduYXR1cmUsICdtZW1iZXItc2lnbmF0dXJlJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIsICduby1zdWNoLW1ldGhvZC1mb3J3YXJkZXInKTsKICAgIHdyaXRlV29yZChwcm9jZWR1cmVLaW5kVG9TdHJpbmcobm9kZS5raW5kKSk7CiAgICBMaXN0PFN0cmluZz4gZmVhdHVyZXMgPSA8U3RyaW5nPltdOwogICAgaWYgKG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICE9CiAgICAgICAgbm9kZS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIGlmIChub2RlLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgICBmZWF0dXJlcy5hZGQoImlzTm9uTnVsbGFibGVCeURlZmF1bHQiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZWF0dXJlcy5hZGQoImlzTnVsbGFibGVCeURlZmF1bHQiKTsKICAgICAgfQogICAgfQogICAgaWYgKChub2RlLmVuY2xvc2luZ0NsYXNzID09IG51bGwgJiYKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmZpbGVVcmkgIT0gbm9kZS5maWxlVXJpKSB8fAogICAgICAgIChub2RlLmVuY2xvc2luZ0NsYXNzICE9IG51bGwgJiYKICAgICAgICAgICAgbm9kZS5lbmNsb3NpbmdDbGFzcy5maWxlVXJpICE9IG5vZGUuZmlsZVVyaSkpIHsKICAgICAgZmVhdHVyZXMuYWRkKCIgZnJvbSAke25vZGUuZmlsZVVyaX0gIik7CiAgICB9CiAgICBpZiAoZmVhdHVyZXMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVdvcmQoIi8qJHtmZWF0dXJlcy5qb2luKCcsJyl9Ki8iKTsKICAgIH0KICAgIHdyaXRlRnVuY3Rpb24obm9kZS5mdW5jdGlvbiwgbmFtZTogZ2V0TWVtYmVyTmFtZShub2RlKSk7CiAgfQoKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNFeHRlcm5hbCwgJ2V4dGVybmFsJyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNDb25zdCwgJ2NvbnN0Jyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNTeW50aGV0aWMsICdzeW50aGV0aWMnKTsKICAgIHdyaXRlV29yZCgnY29uc3RydWN0b3InKTsKICAgIExpc3Q8U3RyaW5nPiBmZWF0dXJlcyA9IDxTdHJpbmc+W107CiAgICBpZiAobm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgIT0KICAgICAgICBub2RlLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgaWYgKG5vZGUuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgIGZlYXR1cmVzLmFkZCgiaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCIpOwogICAgICB9IGVsc2UgewogICAgICAgIGZlYXR1cmVzLmFkZCgiaXNOdWxsYWJsZUJ5RGVmYXVsdCIpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmVhdHVyZXMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVdvcmQoIi8qJHtmZWF0dXJlcy5qb2luKCcsJyl9Ki8iKTsKICAgIH0KICAgIHdyaXRlRnVuY3Rpb24obm9kZS5mdW5jdGlvbiwKICAgICAgICBuYW1lOiBub2RlLm5hbWUsIGluaXRpYWxpemVyczogbm9kZS5pbml0aWFsaXplcnMpOwogIH0KCiAgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcihSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzRXh0ZXJuYWwsICdleHRlcm5hbCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ29uc3QsICdjb25zdCcpOwogICAgd3JpdGVXb3JkKCdyZWRpcmVjdGluZ19mYWN0b3J5Jyk7CgogICAgaWYgKG5vZGUubmFtZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlTmFtZShub2RlLm5hbWUpOwogICAgfQogICAgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHdyaXRlUGFyYW1ldGVyTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCBub2RlLm5hbWVkUGFyYW1ldGVycywKICAgICAgICBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgd3JpdGVMaXN0KG5vZGUudHlwZUFyZ3VtZW50cywgd3JpdGVUeXBlKTsKICAgICAgd3JpdGVTeW1ib2woJz4nKTsKICAgIH0KICAgIExpc3Q8U3RyaW5nPiBmZWF0dXJlcyA9IDxTdHJpbmc+W107CiAgICBpZiAobm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgIT0KICAgICAgICBub2RlLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgaWYgKG5vZGUuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgIGZlYXR1cmVzLmFkZCgiaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCIpOwogICAgICB9IGVsc2UgewogICAgICAgIGZlYXR1cmVzLmFkZCgiaXNOdWxsYWJsZUJ5RGVmYXVsdCIpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmVhdHVyZXMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVdvcmQoIi8qJHtmZWF0dXJlcy5qb2luKCcsJyl9Ki8iKTsKICAgIH0KICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zKTsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0Fic3RyYWN0LCAnYWJzdHJhY3QnKTsKICAgIHdyaXRlV29yZCgnY2xhc3MnKTsKICAgIHdyaXRlV29yZChnZXRDbGFzc05hbWUobm9kZSkpOwogICAgd3JpdGVUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIGlmIChub2RlLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgICB2aXNpdFN1cGVydHlwZShub2RlLnN1cGVydHlwZSk7CiAgICAgIHdyaXRlU3BhY2VkKCd3aXRoJyk7CiAgICAgIHZpc2l0U3VwZXJ0eXBlKG5vZGUubWl4ZWRJblR5cGUpOwogICAgfSBlbHNlIGlmIChub2RlLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3BhY2VkKCdleHRlbmRzJyk7CiAgICAgIHZpc2l0U3VwZXJ0eXBlKG5vZGUuc3VwZXJ0eXBlKTsKICAgIH0KICAgIGlmIChub2RlLmltcGxlbWVudGVkVHlwZXMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVNwYWNlZCgnaW1wbGVtZW50cycpOwogICAgICB3cml0ZUxpc3Qobm9kZS5pbXBsZW1lbnRlZFR5cGVzLCB2aXNpdFN1cGVydHlwZSk7CiAgICB9CiAgICBMaXN0PFN0cmluZz4gZmVhdHVyZXMgPSA8U3RyaW5nPltdOwogICAgaWYgKG5vZGUuaXNFbnVtKSB7CiAgICAgIGZlYXR1cmVzLmFkZCgnaXNFbnVtJyk7CiAgICB9CiAgICBpZiAobm9kZS5pc0Fub255bW91c01peGluKSB7CiAgICAgIGZlYXR1cmVzLmFkZCgnaXNBbm9ueW1vdXNNaXhpbicpOwogICAgfQogICAgaWYgKG5vZGUuaXNFbGltaW5hdGVkTWl4aW4pIHsKICAgICAgZmVhdHVyZXMuYWRkKCdpc0VsaW1pbmF0ZWRNaXhpbicpOwogICAgfQogICAgaWYgKG5vZGUuaXNNaXhpbkRlY2xhcmF0aW9uKSB7CiAgICAgIGZlYXR1cmVzLmFkZCgnaXNNaXhpbkRlY2xhcmF0aW9uJyk7CiAgICB9CiAgICBpZiAobm9kZS5oYXNDb25zdENvbnN0cnVjdG9yKSB7CiAgICAgIGZlYXR1cmVzLmFkZCgnaGFzQ29uc3RDb25zdHJ1Y3RvcicpOwogICAgfQogICAgaWYgKGZlYXR1cmVzLmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVTcGFjZWQoJy8qJHtmZWF0dXJlcy5qb2luKCcsJyl9Ki8nKTsKICAgIH0KICAgIHZhciBlbmRMaW5lU3RyaW5nID0gJyB7JzsKICAgIGlmIChub2RlLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaSAhPSBub2RlLmZpbGVVcmkpIHsKICAgICAgZW5kTGluZVN0cmluZyArPSAnIC8vIGZyb20gJHtub2RlLmZpbGVVcml9JzsKICAgIH0KICAgIGVuZExpbmUoZW5kTGluZVN0cmluZyk7CiAgICArK2luZGVudGF0aW9uOwogICAgbm9kZS5maWVsZHMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbm9kZS5jb25zdHJ1Y3RvcnMuZm9yRWFjaCh3cml0ZU5vZGUpOwogICAgbm9kZS5wcm9jZWR1cmVzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIG5vZGUucmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIC0taW5kZW50YXRpb247CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCd9Jyk7CiAgfQoKICB2aXNpdEV4dGVuc2lvbihFeHRlbnNpb24gbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdleHRlbnNpb24nKTsKICAgIHdyaXRlV29yZChnZXRFeHRlbnNpb25OYW1lKG5vZGUpKTsKICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVNwYWNlZCgnb24nKTsKICAgIHdyaXRlVHlwZShub2RlLm9uVHlwZSk7CiAgICB2YXIgZW5kTGluZVN0cmluZyA9ICcgeyc7CiAgICBpZiAobm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmZpbGVVcmkgIT0gbm9kZS5maWxlVXJpKSB7CiAgICAgIGVuZExpbmVTdHJpbmcgKz0gJyAvLyBmcm9tICR7bm9kZS5maWxlVXJpfSc7CiAgICB9CiAgICBlbmRMaW5lKGVuZExpbmVTdHJpbmcpOwogICAgKytpbmRlbnRhdGlvbjsKICAgIG5vZGUubWVtYmVycy5mb3JFYWNoKChFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKICAgICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgICB3cml0ZU1vZGlmaWVyKGRlc2NyaXB0b3IuaXNTdGF0aWMsICdzdGF0aWMnKTsKICAgICAgc3dpdGNoIChkZXNjcmlwdG9yLmtpbmQpIHsKICAgICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuTWV0aG9kOgogICAgICAgICAgd3JpdGVXb3JkKCdtZXRob2QnKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5HZXR0ZXI6CiAgICAgICAgICB3cml0ZVdvcmQoJ2dldCcpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFeHRlbnNpb25NZW1iZXJLaW5kLlNldHRlcjoKICAgICAgICAgIHdyaXRlV29yZCgnc2V0Jyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuT3BlcmF0b3I6CiAgICAgICAgICB3cml0ZVdvcmQoJ29wZXJhdG9yJyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuRmllbGQ6CiAgICAgICAgICB3cml0ZVdvcmQoJ2ZpZWxkJyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuVGVhck9mZjoKICAgICAgICAgIHdyaXRlV29yZCgndGVhcm9mZicpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgd3JpdGVOYW1lKGRlc2NyaXB0b3IubmFtZSk7CiAgICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICAgIE1lbWJlciBtZW1iZXIgPSBkZXNjcmlwdG9yLm1lbWJlci5hc01lbWJlcjsKICAgICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICBpZiAobWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgICAgICB3cml0ZVdvcmQoJ2dldCcpOwogICAgICAgIH0gZWxzZSBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgICAgICB3cml0ZVdvcmQoJ3NldCcpOwogICAgICAgIH0KICAgICAgfQogICAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2UoZGVzY3JpcHRvci5tZW1iZXIpOwogICAgICBlbmRMaW5lKCc7Jyk7CiAgICB9KTsKICAgIC0taW5kZW50YXRpb247CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCd9Jyk7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCd0eXBlZGVmJyk7CiAgICB3cml0ZVdvcmQobm9kZS5uYW1lKTsKICAgIHdyaXRlVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgaWYgKG5vZGUudHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgd3JpdGVGdW5jdGlvblR5cGUobm9kZS50eXBlLAogICAgICAgICAgdHlwZWRlZlBvc2l0aW9uYWw6IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICB0eXBlZGVmTmFtZWQ6IG5vZGUubmFtZWRQYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTm9kZShub2RlLnR5cGUpOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ2ludmFsaWQtZXhwcmVzc2lvbicpOwogICAgaWYgKG5vZGUubWVzc2FnZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgnIiR7ZXNjYXBlU3RyaW5nKG5vZGUubWVzc2FnZSl9IicpOwogICAgfQogIH0KCiAgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmVjZWl2ZXIsIFByZWNlZGVuY2UuUFJJTUFSWSk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmVjZWl2ZXIsIFByZWNlZGVuY2UuUFJJTUFSWSk7CiAgICB3cml0ZVN5bWJvbCgnLns9Jyk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVTeW1ib2woJ30nKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgd3JpdGVXb3JkKCdzdXBlcicpOwogICAgd3JpdGVTeW1ib2woJy4nKTsKICAgIHdyaXRlSW50ZXJmYWNlVGFyZ2V0KG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvbnN0LCAnY29uc3QnKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZChub2RlLmlzQ29uc3QgPyAnY29uc3QnIDogJ25ldycpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlTm9kZShub2RlLmFyZ3VtZW50cyk7CiAgfQoKICB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgd3JpdGVTeW1ib2woJyEnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLm9wZXJhbmQsIFByZWNlZGVuY2UuUFJFRklYKTsKICB9CgogIHZpc2l0TnVsbENoZWNrKE51bGxDaGVjayBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5vcGVyYW5kLCBQcmVjZWRlbmNlLlBPU1RGSVgpOwogICAgd3JpdGVTeW1ib2woJyEnKTsKICB9CgogIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgaW50IHByZWNlZGVuY2UgPSBQcmVjZWRlbmNlLmJpbmFyeVByZWNlZGVuY2Vbbm9kZS5vcGVyYXRvcl07CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5sZWZ0LCBwcmVjZWRlbmNlKTsKICAgIHdyaXRlU3BhY2VkKG5vZGUub3BlcmF0b3IpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmlnaHQsIHByZWNlZGVuY2UgKyAxKTsKICB9CgogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24sIFByZWNlZGVuY2UuTE9HSUNBTF9PUik7CiAgICBlbnN1cmVTcGFjZSgpOwogICAgd3JpdGUoJz8nKTsKICAgIHdyaXRlU3RhdGljVHlwZShub2RlLnN0YXRpY1R5cGUpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudGhlbik7CiAgICB3cml0ZVNwYWNlZCgnOicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUub3RoZXJ3aXNlKTsKICB9CgogIFN0cmluZyBnZXRFc2NhcGVkQ2hhcmFjdGVyKGludCBjb2RlVW5pdCkgewogICAgc3dpdGNoIChjb2RlVW5pdCkgewogICAgICBjYXNlIDk6CiAgICAgICAgcmV0dXJuIHInXHQnOwogICAgICBjYXNlIDEwOgogICAgICAgIHJldHVybiByJ1xuJzsKICAgICAgY2FzZSAxMToKICAgICAgICByZXR1cm4gcidcdic7CiAgICAgIGNhc2UgMTI6CiAgICAgICAgcmV0dXJuIHInXGYnOwogICAgICBjYXNlIDEzOgogICAgICAgIHJldHVybiByJ1xyJzsKICAgICAgY2FzZSAzNDoKICAgICAgICByZXR1cm4gcidcIic7CiAgICAgIGNhc2UgMzY6CiAgICAgICAgcmV0dXJuIHInXCQnOwogICAgICBjYXNlIDkyOgogICAgICAgIHJldHVybiByJ1xcJzsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoY29kZVVuaXQgPCAzMiB8fCBjb2RlVW5pdCA+IDEyNikgewogICAgICAgICAgcmV0dXJuIHInXHUnICsgJyRjb2RlVW5pdCcucGFkTGVmdCg0LCAnMCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgfQoKICBTdHJpbmcgZXNjYXBlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkgewogICAgICBTdHJpbmcgY2hhcmFjdGVyID0gZ2V0RXNjYXBlZENoYXJhY3RlcihzdHJpbmcuY29kZVVuaXRBdChpKSk7CiAgICAgIGlmIChjaGFyYWN0ZXIgIT0gbnVsbCkgewogICAgICAgIGJ1ZmZlciA/Pz0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcuc3Vic3RyaW5nKDAsIGkpKTsKICAgICAgICBidWZmZXIud3JpdGUoY2hhcmFjdGVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXI/LndyaXRlKHN0cmluZ1tpXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWZmZXIgPT0gbnVsbCA/IHN0cmluZyA6IGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gbm9kZSkgewogICAgaWYgKHN0YXRlID09IFdPUkQpIHsKICAgICAgd3JpdGVTcGFjZSgpOwogICAgfQogICAgd3JpdGUoJyInKTsKICAgIGZvciAodmFyIHBhcnQgaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBpZiAocGFydCBpcyBTdHJpbmdMaXRlcmFsKSB7CiAgICAgICAgd3JpdGVTeW1ib2woZXNjYXBlU3RyaW5nKHBhcnQudmFsdWUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZVN5bWJvbChyJyR7Jyk7CiAgICAgICAgd3JpdGVFeHByZXNzaW9uKHBhcnQpOwogICAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICAgIH0KICAgIH0KICAgIHdyaXRlKCciJyk7CiAgICBzdGF0ZSA9IFdPUkQ7CiAgfQoKICB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChFeHByZXNzaW9uIHBhcnQgaW4gbm9kZS5saXN0cykgewogICAgICBpZiAoIWZpcnN0KSB3cml0ZVNwYWNlZCgnKycpOwogICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgfQoKICB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoRXhwcmVzc2lvbiBwYXJ0IGluIG5vZGUuc2V0cykgewogICAgICBpZiAoIWZpcnN0KSB3cml0ZVNwYWNlZCgnKycpOwogICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgfQoKICB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoRXhwcmVzc2lvbiBwYXJ0IGluIG5vZGUubWFwcykgewogICAgICBpZiAoIWZpcnN0KSB3cml0ZVNwYWNlZCgnKycpOwogICAgICB3cml0ZUV4cHJlc3Npb24ocGFydCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgfQoKICB2aXNpdEluc3RhbmNlQ3JlYXRpb24oSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CiAgICB3cml0ZUNsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLmNsYXNzUmVmZXJlbmNlKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgd3JpdGVTeW1ib2woJ3snKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZVdvcmQoJyR7ZmllbGRSZWYuYXNGaWVsZC5uYW1lLm5hbWV9Jyk7CiAgICAgIHdyaXRlU3ltYm9sKCc6Jyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbih2YWx1ZSk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9KTsKICAgIGZvciAoQXNzZXJ0U3RhdGVtZW50IGFzc2VydF8gaW4gbm9kZS5hc3NlcnRzKSB7CiAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICB3cml0ZUNvbW1hKCk7CiAgICAgIH0KICAgICAgd3JpdGUoJ2Fzc2VydCgnKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKGFzc2VydF8uY29uZGl0aW9uKTsKICAgICAgaWYgKGFzc2VydF8ubWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgd3JpdGVDb21tYSgpOwogICAgICAgIHdyaXRlRXhwcmVzc2lvbihhc3NlcnRfLm1lc3NhZ2UpOwogICAgICB9CiAgICAgIHdyaXRlKCcpJyk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICBmb3IgKEV4cHJlc3Npb24gdW51c2VkQXJndW1lbnQgaW4gbm9kZS51bnVzZWRBcmd1bWVudHMpIHsKICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgfQogICAgICB3cml0ZUV4cHJlc3Npb24odW51c2VkQXJndW1lbnQpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgd3JpdGVTeW1ib2woJ30nKTsKICB9CgogIHZpc2l0RmlsZVVyaUV4cHJlc3Npb24oRmlsZVVyaUV4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbik7CiAgfQoKICB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUub3BlcmFuZCwgUHJlY2VkZW5jZS5CSVRXSVNFX09SKTsKICAgIHdyaXRlU3BhY2VkKAogICAgICAgIG5vZGUuaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA/ICdpc3tGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0nIDogJ2lzJyk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5vcGVyYW5kLCBQcmVjZWRlbmNlLkJJVFdJU0VfT1IpOwogICAgTGlzdDxTdHJpbmc+IGZsYWdzID0gPFN0cmluZz5bXTsKICAgIGlmIChub2RlLmlzVHlwZUVycm9yKSB7CiAgICAgIGZsYWdzLmFkZCgnVHlwZUVycm9yJyk7CiAgICB9CiAgICBpZiAobm9kZS5pc0NvdmFyaWFuY2VDaGVjaykgewogICAgICBmbGFncy5hZGQoJ0NvdmFyaWFuY2VDaGVjaycpOwogICAgfQogICAgaWYgKG5vZGUuaXNGb3JEeW5hbWljKSB7CiAgICAgIGZsYWdzLmFkZCgnRm9yRHluYW1pYycpOwogICAgfQogICAgaWYgKG5vZGUuaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBmbGFncy5hZGQoJ0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0Jyk7CiAgICB9CiAgICB3cml0ZVNwYWNlZChmbGFncy5pc05vdEVtcHR5ID8gJ2FzeyR7ZmxhZ3Muam9pbignLCcpfX0nIDogJ2FzJyk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlU3ltYm9sKCcjJyk7CiAgICB3cml0ZVdvcmQobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlVHlwZShub2RlLnR5cGUpOwogIH0KCiAgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3RoaXMnKTsKICB9CgogIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpIHsKICAgIHdyaXRlV29yZCgncmV0aHJvdycpOwogIH0KCiAgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ3Rocm93Jyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICB9CgogIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB3cml0ZVdvcmQoJ2NvbnN0Jyk7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLnR5cGVBcmd1bWVudCAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlVHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnWycpOwogICAgd3JpdGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnXScpOwogIH0KCiAgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB3cml0ZVdvcmQoJ2NvbnN0Jyk7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLnR5cGVBcmd1bWVudCAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlVHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgneycpOwogICAgd3JpdGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogIH0KCiAgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICB3cml0ZVdvcmQoJ2NvbnN0Jyk7CiAgICAgIHdyaXRlU3BhY2UoKTsKICAgIH0KICAgIGlmIChub2RlLmtleVR5cGUgIT0gbnVsbCkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3QoW25vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGVdLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgfQogICAgd3JpdGVTeW1ib2woJ3snKTsKICAgIHdyaXRlTGlzdChub2RlLmVudHJpZXMsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnfScpOwogIH0KCiAgdmlzaXRNYXBFbnRyeShNYXBFbnRyeSBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5rZXkpOwogICAgd3JpdGVDb21tYSgnOicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnYXdhaXQnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLm9wZXJhbmQpOwogIH0KCiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlRnVuY3Rpb24obm9kZS5mdW5jdGlvbiwgdGVybWluYXRlTGluZTogZmFsc2UpOwogIH0KCiAgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCciJHtlc2NhcGVTdHJpbmcobm9kZS52YWx1ZSl9IicpOwogIH0KCiAgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCcke25vZGUudmFsdWV9Jyk7CiAgfQoKICB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICB3cml0ZVdvcmQoJyR7bm9kZS52YWx1ZX0nKTsKICB9CgogIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgd3JpdGVXb3JkKCcke25vZGUudmFsdWV9Jyk7CiAgfQoKICB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnbnVsbCcpOwogIH0KCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnbGV0Jyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSk7CiAgICB3cml0ZVNwYWNlZCgnaW4nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmJvZHkpOwogIH0KCiAgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlU3BhY2VkKCdibG9jaycpOwogICAgd3JpdGVCbG9ja0JvZHkobm9kZS5ib2R5LnN0YXRlbWVudHMsIGFzRXhwcmVzc2lvbjogdHJ1ZSk7CiAgICB3cml0ZVN5bWJvbCgnID0+Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgd3JpdGVTeW1ib2woJz4nKTsKICB9CgogIHZpc2l0TG9hZExpYnJhcnkoTG9hZExpYnJhcnkgbm9kZSkgewogICAgd3JpdGVXb3JkKCdMb2FkTGlicmFyeScpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlV29yZChub2RlLmltcG9ydC5uYW1lKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICBzdGF0ZSA9IFdPUkQ7CiAgfQoKICB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnQ2hlY2tMaWJyYXJ5SXNMb2FkZWQnKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZVdvcmQobm9kZS5pbXBvcnQubmFtZSk7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgc3RhdGUgPSBXT1JEOwogIH0KCiAgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICB3cml0ZUFubm90YXRpb25MaXN0KG5vZGUuYW5ub3RhdGlvbnMpOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdwYXJ0Jyk7CiAgICB3cml0ZVdvcmQobm9kZS5wYXJ0VXJpKTsKICAgIGVuZExpbmUoIjsiKTsKICB9CgogIHZpc2l0TGlicmFyeURlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKG5vZGUuaXNJbXBvcnQgPyAnaW1wb3J0JyA6ICdleHBvcnQnKTsKICAgIHZhciB1cmlTdHJpbmc7CiAgICBpZiAobm9kZS5pbXBvcnRlZExpYnJhcnlSZWZlcmVuY2U/Lm5vZGUgIT0gbnVsbCkgewogICAgICB1cmlTdHJpbmcgPSAnJHtub2RlLnRhcmdldExpYnJhcnkuaW1wb3J0VXJpfSc7CiAgICB9IGVsc2UgewogICAgICB1cmlTdHJpbmcgPSAnJHtub2RlLmltcG9ydGVkTGlicmFyeVJlZmVyZW5jZT8uY2Fub25pY2FsTmFtZT8ubmFtZX0nOwogICAgfQogICAgd3JpdGVXb3JkKCciJHVyaVN0cmluZyInKTsKICAgIGlmIChub2RlLmlzRGVmZXJyZWQpIHsKICAgICAgd3JpdGVXb3JkKCdkZWZlcnJlZCcpOwogICAgfQogICAgaWYgKG5vZGUubmFtZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgnYXMnKTsKICAgICAgd3JpdGVXb3JkKG5vZGUubmFtZSk7CiAgICB9CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICBkZWZhdWx0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnJHtub2RlLnJ1bnRpbWVUeXBlfScpOwogIH0KCiAgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICB3cml0ZVZhcmlhYmxlUmVmZXJlbmNlKG5vZGUudmFyaWFibGUpOwogICAgaWYgKG5vZGUucHJvbW90ZWRUeXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgd3JpdGVOb2RlKG5vZGUucHJvbW90ZWRUeXBlKTsKICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgICAgc3RhdGUgPSBXT1JEOwogICAgfQogIH0KCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICB3cml0ZVZhcmlhYmxlUmVmZXJlbmNlKG5vZGUudmFyaWFibGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZvaWQgd3JpdGVJbnRlcmZhY2VUYXJnZXQoTmFtZSBuYW1lLCBSZWZlcmVuY2UgdGFyZ2V0KSB7CiAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKICAgICAgd3JpdGVTeW1ib2woJ3snKTsKICAgICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKHRhcmdldCk7CiAgICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZU5hbWUobmFtZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlU3RhdGljVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlU3ltYm9sKCd7Jyk7CiAgICAgIHdyaXRlVHlwZSh0eXBlKTsKICAgICAgd3JpdGVTeW1ib2woJ30nKTsKICAgIH0KICB9CgogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUucmVjZWl2ZXIsIFByZWNlZGVuY2UuUFJJTUFSWSk7CiAgICB3cml0ZVN5bWJvbCgnLicpOwogICAgd3JpdGVJbnRlcmZhY2VUYXJnZXQobm9kZS5uYW1lLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy4nKTsKICAgIHdyaXRlSW50ZXJmYWNlVGFyZ2V0KG5vZGUubmFtZSwgbm9kZS5pbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnc3VwZXInKTsKICAgIHdyaXRlU3ltYm9sKCcuJyk7CiAgICB3cml0ZUludGVyZmFjZVRhcmdldChub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlV29yZCgnc3VwZXInKTsKICAgIHdyaXRlU3ltYm9sKCcuJyk7CiAgICB3cml0ZUludGVyZmFjZVRhcmdldChub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy57PScpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgfQoKICB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBQcmVjZWRlbmNlLlBSSU1BUlkpOwogICAgd3JpdGVTeW1ib2woJy57PScpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3ltYm9sKCd9Jyk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpIHsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZvaWQgd3JpdGVCbG9ja0JvZHkoTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMsIHtib29sIGFzRXhwcmVzc2lvbiA9IGZhbHNlfSkgewogICAgaWYgKHN0YXRlbWVudHMuaXNFbXB0eSkgewogICAgICBhc0V4cHJlc3Npb24gPyB3cml0ZVN5bWJvbCgne30nKSA6IGVuZExpbmUoJ3t9Jyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGVuZExpbmUoJ3snKTsKICAgICsraW5kZW50YXRpb247CiAgICBzdGF0ZW1lbnRzLmZvckVhY2god3JpdGVOb2RlKTsKICAgIC0taW5kZW50YXRpb247CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBhc0V4cHJlc3Npb24gPyB3cml0ZVN5bWJvbCgnfScpIDogZW5kTGluZSgnfScpOwogIH0KCiAgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUJsb2NrQm9keShub2RlLnN0YXRlbWVudHMpOwogIH0KCiAgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVNwYWNlZCgnYXNzZXJ0Jyk7CiAgICB3cml0ZUJsb2NrQm9keShub2RlLnN0YXRlbWVudHMpOwogIH0KCiAgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBlbmRMaW5lKCc7Jyk7CiAgfQoKICB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSwge2Jvb2wgYXNFeHByZXNzaW9uID0gZmFsc2V9KSB7CiAgICBpZiAoIWFzRXhwcmVzc2lvbikgewogICAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB9CiAgICB3cml0ZVdvcmQoJ2Fzc2VydCcpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbik7CiAgICBpZiAobm9kZS5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgd3JpdGVDb21tYSgpOwogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5tZXNzYWdlKTsKICAgIH0KICAgIGlmICghYXNFeHByZXNzaW9uKSB7CiAgICAgIGVuZExpbmUoJyk7Jyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgfQogIH0KCiAgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKHN5bnRoZXRpY05hbWVzLm5hbWVMYWJlbGVkU3RhdGVtZW50KG5vZGUpKTsKICAgIGVuZExpbmUoJzonKTsKICAgIHdyaXRlTm9kZShub2RlLmJvZHkpOwogIH0KCiAgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2JyZWFrJyk7CiAgICB3cml0ZVdvcmQoc3ludGhldGljTmFtZXMubmFtZUxhYmVsZWRTdGF0ZW1lbnQobm9kZS50YXJnZXQpKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVTcGFjZWQoJ3doaWxlJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdkbycpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVNwYWNlZCgnd2hpbGUnKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pOwogICAgZW5kTGluZSgnKScpOwogIH0KCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlU3BhY2VkKCdmb3InKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZUxpc3Qobm9kZS52YXJpYWJsZXMsIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICB3cml0ZUNvbW1hKCc7Jyk7CiAgICBpZiAobm9kZS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5jb25kaXRpb24pOwogICAgfQogICAgd3JpdGVDb21tYSgnOycpOwogICAgd3JpdGVMaXN0KG5vZGUudXBkYXRlcywgd3JpdGVFeHByZXNzaW9uKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgaWYgKG5vZGUuaXNBc3luYykgewogICAgICB3cml0ZVNwYWNlZCgnYXdhaXQnKTsKICAgIH0KICAgIHdyaXRlU3BhY2VkKCdmb3InKTsKICAgIHdyaXRlU3ltYm9sKCcoJyk7CiAgICB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS52YXJpYWJsZSwgdXNlVmFyS2V5d29yZDogdHJ1ZSk7CiAgICB3cml0ZVNwYWNlZCgnaW4nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLml0ZXJhYmxlKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS5ib2R5KTsKICB9CgogIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3N3aXRjaCcpOwogICAgd3JpdGVTeW1ib2woJygnKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgZW5kTGluZSgnKSB7Jyk7CiAgICArK2luZGVudGF0aW9uOwogICAgbm9kZS5jYXNlcy5mb3JFYWNoKHdyaXRlTm9kZSk7CiAgICAtLWluZGVudGF0aW9uOwogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnfScpOwogIH0KCiAgdmlzaXRTd2l0Y2hDYXNlKFN3aXRjaENhc2Ugbm9kZSkgewogICAgU3RyaW5nIGxhYmVsID0gc3ludGhldGljTmFtZXMubmFtZVN3aXRjaENhc2Uobm9kZSk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQobGFiZWwpOwogICAgZW5kTGluZSgnOicpOwogICAgZm9yICh2YXIgZXhwcmVzc2lvbiBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVXb3JkKCdjYXNlJyk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihleHByZXNzaW9uKTsKICAgICAgZW5kTGluZSgnOicpOwogICAgfQogICAgaWYgKG5vZGUuaXNEZWZhdWx0KSB7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVXb3JkKCdkZWZhdWx0Jyk7CiAgICAgIGVuZExpbmUoJzonKTsKICAgIH0KICAgICsraW5kZW50YXRpb247CiAgICB3cml0ZU5vZGUobm9kZS5ib2R5KTsKICAgIC0taW5kZW50YXRpb247CiAgfQoKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlV29yZCgnY29udGludWUnKTsKICAgIHdyaXRlV29yZChzeW50aGV0aWNOYW1lcy5uYW1lU3dpdGNoQ2FzZShub2RlLnRhcmdldCkpOwogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2lmJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuY29uZGl0aW9uKTsKICAgIHdyaXRlU3ltYm9sKCcpJyk7CiAgICB3cml0ZUJvZHkobm9kZS50aGVuKTsKICAgIGlmIChub2RlLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgICAgd3JpdGVXb3JkKCdlbHNlJyk7CiAgICAgIHdyaXRlQm9keShub2RlLm90aGVyd2lzZSk7CiAgICB9CiAgfQoKICB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVXb3JkKCdyZXR1cm4nKTsKICAgIGlmIChub2RlLmV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICB3cml0ZVNwYWNlKCk7CiAgICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogICAgfQogICAgZW5kTGluZSgnOycpOwogIH0KCiAgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3RyeScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgICBub2RlLmNhdGNoZXMuZm9yRWFjaCh3cml0ZU5vZGUpOwogIH0KCiAgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICBpZiAobm9kZS5ndWFyZCAhPSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgnb24nKTsKICAgICAgd3JpdGVUeXBlKG5vZGUuZ3VhcmQpOwogICAgICB3cml0ZVNwYWNlKCk7CiAgICB9CiAgICB3cml0ZVdvcmQoJ2NhdGNoJyk7CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgaWYgKG5vZGUuZXhjZXB0aW9uICE9IG51bGwpIHsKICAgICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUuZXhjZXB0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlV29yZCgnbm8tZXhjZXB0aW9uLXZhcicpOwogICAgfQogICAgaWYgKG5vZGUuc3RhY2tUcmFjZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlQ29tbWEoKTsKICAgICAgd3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUuc3RhY2tUcmFjZSk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnKScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgfQoKICB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ3RyeScpOwogICAgd3JpdGVCb2R5KG5vZGUuYm9keSk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2ZpbmFsbHknKTsKICAgIHdyaXRlQm9keShub2RlLmZpbmFsaXplcik7CiAgfQoKICB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIGlmIChub2RlLmlzWWllbGRTdGFyKSB7CiAgICAgIHdyaXRlV29yZCgneWllbGQqJyk7CiAgICB9IGVsc2UgaWYgKG5vZGUuaXNOYXRpdmUpIHsKICAgICAgd3JpdGVXb3JkKCdbeWllbGRdJyk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZVdvcmQoJ3lpZWxkJyk7CiAgICB9CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCB1c2VWYXJLZXl3b3JkOiB0cnVlKTsKICAgIGVuZExpbmUoJzsnKTsKICB9CgogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS52YXJpYWJsZS5hbm5vdGF0aW9ucyk7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZVdvcmQoJ2Z1bmN0aW9uJyk7CiAgICBpZiAobm9kZS5mdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIHdyaXRlRnVuY3Rpb24obm9kZS5mdW5jdGlvbiwgbmFtZTogZ2V0VmFyaWFibGVOYW1lKG5vZGUudmFyaWFibGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlV29yZChnZXRWYXJpYWJsZU5hbWUobm9kZS52YXJpYWJsZSkpOwogICAgICBlbmRMaW5lKCcuLi47Jyk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsCiAgICAgIHtib29sIHVzZVZhcktleXdvcmQ6IGZhbHNlfSkgewogICAgaWYgKHNob3dPZmZzZXRzKSB3cml0ZVdvcmQoIlske25vZGUuZmlsZU9mZnNldH1dIik7CiAgICBpZiAoc2hvd01ldGFkYXRhKSB3cml0ZU1ldGFkYXRhKG5vZGUpOwogICAgd3JpdGVBbm5vdGF0aW9uTGlzdChub2RlLmFubm90YXRpb25zLCBzZXBhcmF0ZUxpbmVzOiBmYWxzZSk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNMYXRlLCAnbGF0ZScpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzUmVxdWlyZWQsICdyZXF1aXJlZCcpOwogICAgd3JpdGVNb2RpZmllcihub2RlLmlzQ292YXJpYW50LCAnY292YXJpYW50Jyk7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNHZW5lcmljQ292YXJpYW50SW1wbCwgJ2dlbmVyaWMtY292YXJpYW50LWltcGwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0ZpbmFsLCAnZmluYWwnKTsKICAgIHdyaXRlTW9kaWZpZXIobm9kZS5pc0NvbnN0LCAnY29uc3QnKTsKICAgIGlmIChub2RlLnR5cGUgIT0gbnVsbCkgewogICAgICB3cml0ZUFubm90YXRlZFR5cGUobm9kZS50eXBlLCBhbm5vdGF0b3I/LmFubm90YXRlVmFyaWFibGUodGhpcywgbm9kZSkpOwogICAgfQogICAgaWYgKHVzZVZhcktleXdvcmQgJiYgIW5vZGUuaXNGaW5hbCAmJiAhbm9kZS5pc0NvbnN0ICYmIG5vZGUudHlwZSA9PSBudWxsKSB7CiAgICAgIHdyaXRlV29yZCgndmFyJyk7CiAgICB9CiAgICB3cml0ZVdvcmQoZ2V0VmFyaWFibGVOYW1lKG5vZGUpKTsKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVFeHByZXNzaW9uKG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgfQogIH0KCiAgdmlzaXRBcmd1bWVudHMoQXJndW1lbnRzIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVzLmlzTm90RW1wdHkpIHsKICAgICAgd3JpdGVTeW1ib2woJzwnKTsKICAgICAgd3JpdGVMaXN0KG5vZGUudHlwZXMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CiAgICB3cml0ZVN5bWJvbCgnKCcpOwogICAgdmFyIGFsbEFyZ3MgPQogICAgICAgIDxMaXN0PFRyZWVOb2RlPj5bbm9kZS5wb3NpdGlvbmFsLCBub2RlLm5hbWVkXS5leHBhbmQoKHgpID0+IHgpOwogICAgd3JpdGVMaXN0KGFsbEFyZ3MsIHdyaXRlTm9kZSk7CiAgICB3cml0ZVN5bWJvbCgnKScpOwogIH0KCiAgdmlzaXROYW1lZEV4cHJlc3Npb24oTmFtZWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlV29yZChub2RlLm5hbWUpOwogICAgd3JpdGVDb21tYSgnOicpOwogICAgd3JpdGVFeHByZXNzaW9uKG5vZGUudmFsdWUpOwogIH0KCiAgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnJHtub2RlLnJ1bnRpbWVUeXBlfScpOwogIH0KCiAgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW52YWxpZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnaW52YWxpZC1pbml0aWFsaXplcicpOwogIH0KCiAgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUuZmllbGRSZWZlcmVuY2UpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlRXhwcmVzc2lvbihub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlV29yZCgnc3VwZXInKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnRhcmdldFJlZmVyZW5jZSk7CiAgICB3cml0ZU5vZGUobm9kZS5hcmd1bWVudHMpOwogIH0KCiAgdmlzaXRSZWRpcmVjdGluZ0luaXRpYWxpemVyKFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVXb3JkKCd0aGlzJyk7CiAgICB3cml0ZU1lbWJlclJlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogICAgd3JpdGVOb2RlKG5vZGUuYXJndW1lbnRzKTsKICB9CgogIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLnZhcmlhYmxlKTsKICB9CgogIHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXIoQXNzZXJ0SW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdmlzaXRBc3NlcnRTdGF0ZW1lbnQobm9kZS5zdGF0ZW1lbnQsIGFzRXhwcmVzc2lvbjogdHJ1ZSk7CiAgfQoKICBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgZW5kTGluZSgnOiAke25vZGUucnVudGltZVR5cGV9Jyk7CiAgfQoKICB2b2lkIHdyaXRlTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHksIHtib29sIGluQ29tbWVudCA9IGZhbHNlfSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICB3cml0ZVN5bWJvbCgnKicpOwogICAgICAgIGlmICghaW5Db21tZW50KSB7CiAgICAgICAgICBzdGF0ZSA9IFdPUkQ7IC8vIERpc2FsbG93IGEgd29yZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJyonLgogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICB3cml0ZVN5bWJvbCgnPycpOwogICAgICAgIGlmICghaW5Db21tZW50KSB7CiAgICAgICAgICBzdGF0ZSA9IFdPUkQ7IC8vIERpc2FsbG93IGEgd29yZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJz8nLgogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ6CiAgICAgICAgd3JpdGVTeW1ib2woJyUnKTsKICAgICAgICBpZiAoIWluQ29tbWVudCkgewogICAgICAgICAgc3RhdGUgPSBXT1JEOyAvLyBEaXNhbGxvdyBhIHdvcmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICclJy4KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgICAgaWYgKGluQ29tbWVudCkgewogICAgICAgICAgd3JpdGVTeW1ib2woIiEiKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlRGFydFR5cGVOdWxsYWJpbGl0eShEYXJ0VHlwZSB0eXBlLCB7Ym9vbCBpbkNvbW1lbnQgPSBmYWxzZX0pIHsKICAgIGlmICh0eXBlIGlzIEludmFsaWRUeXBlKSB7CiAgICAgIHdyaXRlTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkKTsKICAgIH0gZWxzZSB7CiAgICAgIHdyaXRlTnVsbGFiaWxpdHkodHlwZS5udWxsYWJpbGl0eSwgaW5Db21tZW50OiBpbkNvbW1lbnQpOwogICAgfQogIH0KCiAgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ2ludmFsaWQtdHlwZScpOwogIH0KCiAgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSB7CiAgICB3cml0ZVdvcmQoJ2R5bmFtaWMnKTsKICB9CgogIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgewogICAgd3JpdGVXb3JkKCd2b2lkJyk7CiAgfQoKICB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgewogICAgd3JpdGVXb3JkKCdOZXZlcicpOwogICAgd3JpdGVOdWxsYWJpbGl0eShub2RlLm51bGxhYmlsaXR5KTsKICB9CgogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIHdyaXRlQ2xhc3NSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUuY2xhc3NOYW1lKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgICB3cml0ZUxpc3Qobm9kZS50eXBlQXJndW1lbnRzLCB3cml0ZVR5cGUpOwogICAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgICBzdGF0ZSA9IFdPUkQ7IC8vIERpc2FsbG93IGEgd29yZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJz4nLgogICAgfQogICAgd3JpdGVOdWxsYWJpbGl0eShub2RlLm51bGxhYmlsaXR5KTsKICB9CgogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICB3cml0ZUZ1bmN0aW9uVHlwZShub2RlKTsKICB9CgogIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNSZXF1aXJlZCwgJ3JlcXVpcmVkJyk7CiAgICB3cml0ZVdvcmQobm9kZS5uYW1lKTsKICAgIHdyaXRlU3ltYm9sKCc6Jyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlKTsKICB9CgogIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgd3JpdGVUeXBlUGFyYW1ldGVyUmVmZXJlbmNlKG5vZGUucGFyYW1ldGVyKTsKICAgIHdyaXRlTnVsbGFiaWxpdHkobm9kZS50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5KTsKICAgIGlmIChub2RlLnByb21vdGVkQm91bmQgIT0gbnVsbCkgewogICAgICB3cml0ZVNwYWNlZCgnJicpOwogICAgICB3cml0ZVR5cGUobm9kZS5wcm9tb3RlZEJvdW5kKTsKCiAgICAgIHdyaXRlV29yZCgiLyogJyIpOwogICAgICB3cml0ZU51bGxhYmlsaXR5KG5vZGUudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSwgaW5Db21tZW50OiB0cnVlKTsKICAgICAgd3JpdGVXb3JkKCInICYgJyIpOwogICAgICB3cml0ZURhcnRUeXBlTnVsbGFiaWxpdHkobm9kZS5wcm9tb3RlZEJvdW5kLCBpbkNvbW1lbnQ6IHRydWUpOwogICAgICB3cml0ZVdvcmQoIicgPSAnIik7CiAgICAgIHdyaXRlTnVsbGFiaWxpdHkobm9kZS5udWxsYWJpbGl0eSwgaW5Db21tZW50OiB0cnVlKTsKICAgICAgd3JpdGVXb3JkKCInICovIik7CiAgICB9CiAgfQoKICB2aXNpdFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICB3cml0ZU1vZGlmaWVyKG5vZGUuaXNHZW5lcmljQ292YXJpYW50SW1wbCwgJ2dlbmVyaWMtY292YXJpYW50LWltcGwnKTsKICAgIHdyaXRlQW5ub3RhdGlvbkxpc3Qobm9kZS5hbm5vdGF0aW9ucywgc2VwYXJhdGVMaW5lczogZmFsc2UpOwogICAgaWYgKG5vZGUudmFyaWFuY2UgIT0gVmFyaWFuY2UuY292YXJpYW50KSB7CiAgICAgIHdyaXRlV29yZChjb25zdCA8U3RyaW5nPlsKICAgICAgICAidW5yZWxhdGVkIiwKICAgICAgICAiY292YXJpYW50IiwKICAgICAgICAiY29udHJhdmFyaWFudCIsCiAgICAgICAgImludmFyaWFudCIKICAgICAgXVtub2RlLnZhcmlhbmNlXSk7CiAgICB9CiAgICB3cml0ZVdvcmQoZ2V0VHlwZVBhcmFtZXRlck5hbWUobm9kZSkpOwogICAgd3JpdGVTcGFjZWQoJ2V4dGVuZHMnKTsKICAgIHdyaXRlVHlwZShub2RlLmJvdW5kKTsKICAgIGlmIChub2RlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgICAgd3JpdGVUeXBlKG5vZGUuZGVmYXVsdFR5cGUpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKENvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlV29yZChzeW50aGV0aWNOYW1lcy5uYW1lQ29uc3RhbnQobm9kZSkpOwogIH0KCiAgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZS5jb25zdGFudCk7CiAgfQoKICBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICBlbmRMaW5lKCckbm9kZScpOwogIH0KCiAgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVTeW1ib2woJzwnKTsKICAgIHdyaXRlVHlwZShub2RlLnR5cGVBcmd1bWVudCk7CiAgICB3cml0ZVN5bWJvbCgnPlsnKTsKICAgIHdyaXRlTGlzdChub2RlLmVudHJpZXMsIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UpOwogICAgZW5kTGluZSgnXScpOwogIH0KCiAgdmlzaXRTZXRDb25zdGFudChTZXRDb25zdGFudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICB3cml0ZVR5cGUobm9kZS50eXBlQXJndW1lbnQpOwogICAgd3JpdGVTeW1ib2woJz57Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS5lbnRyaWVzLCB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKTsKICAgIGVuZExpbmUoJ30nKTsKICB9CgogIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgd3JpdGVMaXN0KFtub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlXSwgd3JpdGVUeXBlKTsKICAgIHdyaXRlU3ltYm9sKCc+eycpOwogICAgd3JpdGVMaXN0KG5vZGUuZW50cmllcywgKGVudHJ5KSB7CiAgICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2UoZW50cnkua2V5KTsKICAgICAgd3JpdGVTeW1ib2woJzonKTsKICAgICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShlbnRyeS52YWx1ZSk7CiAgICB9KTsKICAgIGVuZExpbmUoJyknKTsKICB9CgogIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHdyaXRlSW5kZW50YXRpb24oKTsKICAgIHdyaXRlQ29uc3RhbnRSZWZlcmVuY2Uobm9kZSk7CiAgICB3cml0ZVNwYWNlZCgnPScpOwogICAgd3JpdGVDbGFzc1JlZmVyZW5jZUZyb21SZWZlcmVuY2Uobm9kZS5jbGFzc1JlZmVyZW5jZSk7CiAgICBpZiAoIW5vZGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHdyaXRlU3ltYm9sKCc8Jyk7CiAgICAgIHdyaXRlTGlzdChub2RlLnR5cGVBcmd1bWVudHMsIHdyaXRlVHlwZSk7CiAgICAgIHdyaXRlU3ltYm9sKCc+Jyk7CiAgICB9CgogICAgd3JpdGVTeW1ib2woJyB7Jyk7CiAgICB3cml0ZUxpc3Qobm9kZS5maWVsZFZhbHVlcy5lbnRyaWVzLAogICAgICAgIChjb3JlLk1hcEVudHJ5PFJlZmVyZW5jZSwgQ29uc3RhbnQ+IGVudHJ5KSB7CiAgICAgIGlmIChlbnRyeS5rZXkubm9kZSAhPSBudWxsKSB7CiAgICAgICAgd3JpdGVXb3JkKCcke2VudHJ5LmtleS5hc0ZpZWxkLm5hbWUubmFtZX0nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cml0ZVdvcmQoJyR7ZW50cnkua2V5LmNhbm9uaWNhbE5hbWUubmFtZX0nKTsKICAgICAgfQogICAgICB3cml0ZVN5bWJvbCgnOicpOwogICAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKGVudHJ5LnZhbHVlKTsKICAgIH0pOwogICAgZW5kTGluZSgnfScpOwogIH0KCiAgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZVdvcmQoJ3BhcnRpYWwtaW5zdGFudGlhdGlvbicpOwogICAgd3JpdGVTcGFjZSgpOwogICAgd3JpdGVNZW1iZXJSZWZlcmVuY2VGcm9tUmVmZXJlbmNlKG5vZGUudGVhck9mZkNvbnN0YW50LnByb2NlZHVyZVJlZmVyZW5jZSk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZVN5bWJvbCgnPCcpOwogICAgd3JpdGVMaXN0KG5vZGUudHlwZXMsIHdyaXRlVHlwZSk7CiAgICB3cml0ZVN5bWJvbCgnPicpOwogICAgZW5kTGluZSgpOwogIH0KCiAgdmlzaXRTdHJpbmdDb25zdGFudChTdHJpbmdDb25zdGFudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIGVuZExpbmUoJyIke2VzY2FwZVN0cmluZyhub2RlLnZhbHVlKX0iJyk7CiAgfQoKICB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgewogICAgd3JpdGVJbmRlbnRhdGlvbigpOwogICAgd3JpdGVDb25zdGFudFJlZmVyZW5jZShub2RlKTsKICAgIHdyaXRlU3BhY2VkKCc9Jyk7CiAgICB3cml0ZVdvcmQoJ3RlYXJvZmYnKTsKICAgIHdyaXRlU3BhY2UoKTsKICAgIHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZShub2RlLnByb2NlZHVyZVJlZmVyZW5jZSk7CiAgICBlbmRMaW5lKCk7CiAgfQoKICB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSB7CiAgICB3cml0ZUluZGVudGF0aW9uKCk7CiAgICB3cml0ZUNvbnN0YW50UmVmZXJlbmNlKG5vZGUpOwogICAgd3JpdGVTcGFjZWQoJz0nKTsKICAgIHdyaXRlU3ltYm9sKCdldmFsJyk7CiAgICB3cml0ZVNwYWNlKCk7CiAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgIGVuZExpbmUoKTsKICB9CgogIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgd3JpdGUoJzwke25vZGUucnVudGltZVR5cGV9PicpOwogIH0KfQoKY2xhc3MgUHJlY2VkZW5jZSBleHRlbmRzIEV4cHJlc3Npb25WaXNpdG9yPGludD4gewogIHN0YXRpYyBmaW5hbCBQcmVjZWRlbmNlIGluc3RhbmNlID0gbmV3IFByZWNlZGVuY2UoKTsKCiAgc3RhdGljIGludCBvZihFeHByZXNzaW9uIG5vZGUpID0+IG5vZGUuYWNjZXB0KGluc3RhbmNlKTsKCiAgc3RhdGljIGNvbnN0IGludCBFWFBSRVNTSU9OID0gMTsKICBzdGF0aWMgY29uc3QgaW50IENPTkRJVElPTkFMID0gMjsKICBzdGF0aWMgY29uc3QgaW50IExPR0lDQUxfTlVMTF9BV0FSRSA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBMT0dJQ0FMX09SID0gNDsKICBzdGF0aWMgY29uc3QgaW50IExPR0lDQUxfQU5EID0gNTsKICBzdGF0aWMgY29uc3QgaW50IEVRVUFMSVRZID0gNjsKICBzdGF0aWMgY29uc3QgaW50IFJFTEFUSU9OQUwgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgQklUV0lTRV9PUiA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBCSVRXSVNFX1hPUiA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBCSVRXSVNFX0FORCA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgU0hJRlQgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IEFERElUSVZFID0gMTI7CiAgc3RhdGljIGNvbnN0IGludCBNVUxUSVBMSUNBVElWRSA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgUFJFRklYID0gMTQ7CiAgc3RhdGljIGNvbnN0IGludCBQT1NURklYID0gMTU7CiAgc3RhdGljIGNvbnN0IGludCBUWVBFX0xJVEVSQUwgPSAxOTsKICBzdGF0aWMgY29uc3QgaW50IFBSSU1BUlkgPSAyMDsKICBzdGF0aWMgY29uc3QgaW50IENBTExFRSA9IDIxOwoKICBzdGF0aWMgY29uc3QgTWFwPFN0cmluZywgaW50PiBiaW5hcnlQcmVjZWRlbmNlID0gY29uc3QgewogICAgJyYmJzogTE9HSUNBTF9BTkQsCiAgICAnfHwnOiBMT0dJQ0FMX09SLAogICAgJz8/JzogTE9HSUNBTF9OVUxMX0FXQVJFLAogICAgJz09JzogRVFVQUxJVFksCiAgICAnIT0nOiBFUVVBTElUWSwKICAgICc+JzogUkVMQVRJT05BTCwKICAgICc+PSc6IFJFTEFUSU9OQUwsCiAgICAnPCc6IFJFTEFUSU9OQUwsCiAgICAnPD0nOiBSRUxBVElPTkFMLAogICAgJ3wnOiBCSVRXSVNFX09SLAogICAgJ14nOiBCSVRXSVNFX1hPUiwKICAgICcmJzogQklUV0lTRV9BTkQsCiAgICAnPj4nOiBTSElGVCwKICAgICc8PCc6IFNISUZULAogICAgJysnOiBBRERJVElWRSwKICAgICctJzogQURESVRJVkUsCiAgICAnKic6IE1VTFRJUExJQ0FUSVZFLAogICAgJyUnOiBNVUxUSVBMSUNBVElWRSwKICAgICcvJzogTVVMVElQTElDQVRJVkUsCiAgICAnfi8nOiBNVUxUSVBMSUNBVElWRSwKICAgIG51bGw6IEVYUFJFU1NJT04sCiAgfTsKCiAgc3RhdGljIGJvb2wgaXNBc3NvY2lhdGl2ZUJpbmFyeU9wZXJhdG9yKGludCBwcmVjZWRlbmNlKSB7CiAgICByZXR1cm4gcHJlY2VkZW5jZSAhPSBFUVVBTElUWSAmJiBwcmVjZWRlbmNlICE9IFJFTEFUSU9OQUw7CiAgfQoKICBpbnQgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXROb3QoTm90IG5vZGUpID0+IFBSRUZJWDsKICBpbnQgdmlzaXROdWxsQ2hlY2soTnVsbENoZWNrIG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgPT4KICAgICAgYmluYXJ5UHJlY2VkZW5jZVtub2RlLm9wZXJhdG9yXTsKICBpbnQgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpID0+IENPTkRJVElPTkFMOwogIGludCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgPT4gUkVMQVRJT05BTDsKICBpbnQgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpID0+IFJFTEFUSU9OQUw7CiAgaW50IHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0VHlwZUxpdGVyYWwoVHlwZUxpdGVyYWwgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgPT4gRVhQUkVTU0lPTjsKICBpbnQgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgPT4gUFJFRklYOwogIGludCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgPT4gRVhQUkVTU0lPTjsKICBpbnQgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpID0+IENBTExFRTsKICBpbnQgdmlzaXRCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBub2RlKSA9PiBDQUxMRUU7CiAgaW50IHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSkgPT4gQ0FMTEVFOwogIGludCB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgPT4gRVhQUkVTU0lPTjsKICBpbnQgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlKSA9PiBQUklNQVJZOwogIGludCB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpID0+IFBSSU1BUlk7CiAgaW50IHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSA9PiBFWFBSRVNTSU9OOwogIGludCB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgPT4gUFJJTUFSWTsKICBpbnQgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpID0+IEVYUFJFU1NJT047CiAgaW50IHZpc2l0TGV0KExldCBub2RlKSA9PiBFWFBSRVNTSU9OOwp9CgpTdHJpbmcgcHJvY2VkdXJlS2luZFRvU3RyaW5nKFByb2NlZHVyZUtpbmQga2luZCkgewogIHN3aXRjaCAoa2luZCkgewogICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgcmV0dXJuICdtZXRob2QnOwogICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgcmV0dXJuICdnZXQnOwogICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgcmV0dXJuICdzZXQnOwogICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICByZXR1cm4gJ2ZhY3RvcnknOwogIH0KICB0aHJvdyAnaWxsZWdhbCBQcm9jZWR1cmVLaW5kOiAka2luZCc7Cn0Kia8ATk48HAEiKgEhARYfARoRLAFMARUCASgXHAIBShceASYmTUQVCU5NCU8ZCSo9OzkaCjBRJUAPNyYIBiQEATAXBAEjSR0EAgEcLy8zAT4TKDwRMg0IIAYBGCQpKgYYJCkqBiEEAgE0ASgWDz0CASQWDzsCAS1QAgEmQwIBLyU6Dx8LNQ8fBAIBNEQCAT0eMg8mBB8zDyYEJwIBQD8CASYsTRQCASssOCEUAgET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cG9ydCAnY2xhc3NfaGllcmFyY2h5LmRhcnQnOwppbXBvcnQgJ2NvcmVfdHlwZXMuZGFydCc7CmltcG9ydCAndHlwZV9hbGdlYnJhLmRhcnQnOwoKaW1wb3J0ICdzcmMvZnV0dXJlX29yLmRhcnQnOwppbXBvcnQgJ3NyYy9oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBIaWVyYXJjaHlCYXNlZFR5cGVFbnZpcm9ubWVudDsKCnR5cGVkZWYgdm9pZCBFcnJvckhhbmRsZXIoVHJlZU5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpOwoKYWJzdHJhY3QgY2xhc3MgVHlwZUVudmlyb25tZW50IGV4dGVuZHMgU3VidHlwZVRlc3RlciB7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgLy8vIEFuIGVycm9yIGhhbmRsZXIgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcsIG9yIGBudWxsYCBpZiB0eXBlIGVycm9ycyBzaG91bGQgbm90CiAgLy8vIGJlIHRvbGVyYXRlZC4gIFNlZSBbdHlwZUVycm9yXS4KICBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOwoKICBUeXBlRW52aXJvbm1lbnQuZnJvbVN1YmNsYXNzKHRoaXMuY29yZVR5cGVzKTsKCiAgZmFjdG9yeSBUeXBlRW52aXJvbm1lbnQoQ29yZVR5cGVzIGNvcmVUeXBlcywgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICByZXR1cm4gbmV3IEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KTsKICB9CgogIENsYXNzIGdldCBpbnRDbGFzcyA9PiBjb3JlVHlwZXMuaW50Q2xhc3M7CiAgQ2xhc3MgZ2V0IG51bUNsYXNzID0+IGNvcmVUeXBlcy5udW1DbGFzczsKICBDbGFzcyBnZXQgZnVuY3Rpb25DbGFzcyA9PiBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzczsKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzczsKICBDbGFzcyBnZXQgb2JqZWN0Q2xhc3MgPT4gY29yZVR5cGVzLm9iamVjdENsYXNzOwoKICBJbnRlcmZhY2VUeXBlIGdldCBvYmplY3RMZWdhY3lSYXdUeXBlID0+IGNvcmVUeXBlcy5vYmplY3RMZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdE51bGxhYmxlUmF3VHlwZSA9PiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlID0+IGNvcmVUeXBlcy5udWxsVHlwZTsKICBJbnRlcmZhY2VUeXBlIGdldCBmdW5jdGlvbkxlZ2FjeVJhd1R5cGUgPT4gY29yZVR5cGVzLmZ1bmN0aW9uTGVnYWN5UmF3VHlwZTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgYExpc3Q8RT5gIHdpdGggdGhlIGdpdmVuIFtudWxsYWJpbGl0eV0gYW5kIFtlbGVtZW50VHlwZV0KICAvLy8gYXMgYEVgLgogIEludGVyZmFjZVR5cGUgbGlzdFR5cGUoRGFydFR5cGUgZWxlbWVudFR5cGUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgY29yZVR5cGVzLmxpc3RDbGFzcywgbnVsbGFiaWxpdHksIDxEYXJ0VHlwZT5bZWxlbWVudFR5cGVdKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIGBTZXQ8RT5gIHdpdGggdGhlIGdpdmVuIFtudWxsYWJpbGl0eV0gYW5kIFtlbGVtZW50VHlwZV0KICAvLy8gYXMgYEVgLgogIEludGVyZmFjZVR5cGUgc2V0VHlwZShEYXJ0VHlwZSBlbGVtZW50VHlwZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuc2V0Q2xhc3MsIG51bGxhYmlsaXR5LCA8RGFydFR5cGU+W2VsZW1lbnRUeXBlXSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBgTWFwPEssVj5gIHdpdGggdGhlIGdpdmVuIFtudWxsYWJpbGl0eV0sIFtrZXldIGFzIGBLYAogIC8vLyBhbmQgW3ZhbHVlXSBpcyBgVmAuCiAgSW50ZXJmYWNlVHlwZSBtYXBUeXBlKERhcnRUeXBlIGtleSwgRGFydFR5cGUgdmFsdWUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgY29yZVR5cGVzLm1hcENsYXNzLCBudWxsYWJpbGl0eSwgPERhcnRUeXBlPltrZXksIHZhbHVlXSk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBgSXRlcmFibGU8RT5gIHdpdGggdGhlIGdpdmVuIFtudWxsYWJpbGl0eV0gYW5kIFt0eXBlXQogIC8vLyBhcyBgRWAuCiAgSW50ZXJmYWNlVHlwZSBpdGVyYWJsZVR5cGUoRGFydFR5cGUgdHlwZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuaXRlcmFibGVDbGFzcywgbnVsbGFiaWxpdHksIDxEYXJ0VHlwZT5bdHlwZV0pOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgYFN0cmVhbTxFPmAgd2l0aCB0aGUgZ2l2ZW4gW251bGxhYmlsaXR5XSBhbmQgW3R5cGVdCiAgLy8vIGFzIGBFYC4KICBJbnRlcmZhY2VUeXBlIHN0cmVhbVR5cGUoRGFydFR5cGUgdHlwZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuc3RyZWFtQ2xhc3MsIG51bGxhYmlsaXR5LCA8RGFydFR5cGU+W3R5cGVdKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIGBGdXR1cmU8RT5gIHdpdGggdGhlIGdpdmVuIFtudWxsYWJpbGl0eV0gYW5kIFt0eXBlXQogIC8vLyBhcyBgRWAuCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgY29yZVR5cGVzLmZ1dHVyZUNsYXNzLCBudWxsYWJpbGl0eSwgPERhcnRUeXBlPlt0eXBlXSk7CiAgfQoKICAvLy8gUmVtb3ZlcyBhIGxldmVsIG9mIGBGdXR1cmU8PmAgdHlwZXMgd3JhcHBpbmcgYSB0eXBlLgogIC8vLwogIC8vLyBUaGlzIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uIGBmbGF0dGVuYCBmcm9tIHRoZSBzcGVjLCB3aGljaCB1bndyYXBzIGEKICAvLy8gbGF5ZXIgb2YgRnV0dXJlIG9yIEZ1dHVyZU9yIGZyb20gYSB0eXBlLgogIERhcnRUeXBlIHVuZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcyB8fAogICAgICAgICAgdHlwZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzKSB7CiAgICAgICAgcmV0dXJuIHR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgfQogICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byBpbXBsZW1lbnQsIGV4dGVuZCwgb3IgbWl4aW4gRnV0dXJlT3Igc28KICAgICAgLy8gd2UgYXJlbid0IGNvbmNlcm5lZCB3aXRoIGl0LiAgSWYgYSBjbGFzcyBpbXBsZW1lbnRzIG11bHRpcGxlCiAgICAgIC8vIGluc3RhbnRpYXRpb25zIG9mIEZ1dHVyZSwgZ2V0VHlwZUFzSW5zdGFuY2VPZiBpcyByZXNwb25zaWJsZSBmb3IKICAgICAgLy8gcGlja2luZyB0aGUgbGVhc3Qgb25lIGluIHRoZSBzZW5zZSByZXF1aXJlZCBieSB0aGUgc3BlYy4KICAgICAgTGlzdDxEYXJ0VHlwZT4gZnV0dXJlQXJndW1lbnRzID0KICAgICAgICAgIGdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodHlwZSwgY29yZVR5cGVzLmZ1dHVyZUNsYXNzKTsKICAgICAgaWYgKGZ1dHVyZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGZ1dHVyZUFyZ3VtZW50c1swXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZm9yLWluIHN0YXRlbWVudCBbbm9kZV0gd2l0aAogIC8vLyBbaXRlcmFibGVUeXBlXSBhcyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGl0ZXJhYmxlIGV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIFRoZSBbaXRlcmFibGVUeXBlXSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgYFN0cmVhbWAgb3IgYEl0ZXJhYmxlYCBkZXBlbmRpbmcKICAvLy8gb24gd2hldGhlciBgbm9kZS5pc0FzeW5jYCBpcyBgdHJ1ZWAgb3Igbm90LgogIERhcnRUeXBlIGZvckluRWxlbWVudFR5cGUoRm9ySW5TdGF0ZW1lbnQgbm9kZSwgRGFydFR5cGUgaXRlcmFibGVUeXBlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVcGRhdGUgdGhpcyB0byB1c2UgdGhlIHR5cGUgb2YKICAgIC8vICBgaXRlcmFibGUuaXRlcmF0b3IuY3VycmVudGAgaWYgaW5mZXJlbmNlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCiAgICB3aGlsZSAoaXRlcmFibGVUeXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHR5cGVQYXJhbWV0ZXJUeXBlID0gaXRlcmFibGVUeXBlOwogICAgICBpdGVyYWJsZVR5cGUgPQogICAgICAgICAgdHlwZVBhcmFtZXRlclR5cGUucHJvbW90ZWRCb3VuZCA/PyB0eXBlUGFyYW1ldGVyVHlwZS5wYXJhbWV0ZXIuYm91bmQ7CiAgICB9CiAgICBpZiAobm9kZS5pc0FzeW5jKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZihpdGVyYWJsZVR5cGUsIGNvcmVUeXBlcy5zdHJlYW1DbGFzcyk7CiAgICAgIHJldHVybiB0eXBlQXJndW1lbnRzLnNpbmdsZTsKICAgIH0gZWxzZSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZihpdGVyYWJsZVR5cGUsIGNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgcmV0dXJuIHR5cGVBcmd1bWVudHMuc2luZ2xlOwogICAgfQogIH0KCiAgLy8vIENhbGxlZCBpZiB0aGUgY29tcHV0YXRpb24gb2YgYSBzdGF0aWMgdHlwZSBmYWlsZWQgZHVlIHRvIGEgdHlwZSBlcnJvci4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByb2R1Y3Rpb24uICBUaGUgZnJvbnRlbmQgc2hvdWxkIHJlcG9ydCB0eXBlCiAgLy8vIGVycm9ycywgYW5kIGVpdGhlciByZWNvdmVyIGZyb20gdGhlIGVycm9yIGR1cmluZyB0cmFuc2xhdGlvbiBvciBhYm9ydAogIC8vLyBjb21waWxhdGlvbiBpZiB1bmFibGUgdG8gcmVjb3Zlci4KICAvLy8KICAvLy8gQnkgZGVmYXVsdCwgdGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uLCBzaW5jZSBwcm9ncmFtcyBpbiBrZXJuZWwgYXJlIGFzc3VtZWQKICAvLy8gdG8gYmUgY29ycmVjdGx5IHR5cGVkLgogIC8vLwogIC8vLyBBbiBbZXJyb3JIYW5kbGVyXSBtYXkgYmUgcHJvdmlkZWQgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKICAvLy8gYmVoYXZpb3IgYW5kIHRvbGVyYXRlIHRoZSBwcmVzZW5jZSBvZiB0eXBlIGVycm9ycy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IKICAvLy8gZGVidWdnaW5nIElSIHByb2R1Y2VycyB3aGljaCBhcmUgcmVxdWlyZWQgdG8gcHJvZHVjZSBhIHN0cm9uZ2x5IHR5cGVkIElSLgogIHZvaWQgdHlwZUVycm9yKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBtZXNzYWdlKSB7CiAgICBpZiAoZXJyb3JIYW5kbGVyICE9IG51bGwpIHsKICAgICAgZXJyb3JIYW5kbGVyKG5vZGUsIG1lc3NhZ2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJyRtZXNzYWdlIGluICRub2RlJzsKICAgIH0KICB9CgogIC8vLyBUcnVlIGlmIFttZW1iZXJdIGlzIGEgYmluYXJ5IG9wZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBgaW50YCBpZiBib3RoCiAgLy8vIG9wZXJhbmRzIGFyZSBgaW50YCwgYW5kIG90aGVyd2lzZSByZXR1cm5zIGBkb3VibGVgLgogIC8vLwogIC8vLyBUaGlzIGlzIGEgY2FzZSBvZiB0eXBlLWJhc2VkIG92ZXJsb2FkaW5nLCB3aGljaCBpbiBEYXJ0IGlzIG9ubHkgc3VwcG9ydGVkCiAgLy8vIGJ5IGdpdmluZyBzcGVjaWFsIHRyZWF0bWVudCB0byBjZXJ0YWluIGFyaXRobWV0aWMgb3BlcmF0b3JzLgogIGJvb2wgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKFByb2NlZHVyZSBtZW1iZXIpIHsKICAgIENsYXNzIGNsYXNzXyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChjbGFzc18gPT0gY29yZVR5cGVzLmludENsYXNzIHx8IGNsYXNzXyA9PSBjb3JlVHlwZXMubnVtQ2xhc3MpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBtZW1iZXIubmFtZS5uYW1lOwogICAgICByZXR1cm4gbmFtZSA9PSAnKycgfHwKICAgICAgICAgIG5hbWUgPT0gJy0nIHx8CiAgICAgICAgICBuYW1lID09ICcqJyB8fAogICAgICAgICAgbmFtZSA9PSAncmVtYWluZGVyJyB8fAogICAgICAgICAgbmFtZSA9PSAnJSc7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgc3RhdGljIHJldHVybiB0eXBlIG9mIGFuIG92ZXJsb2FkZWQgYXJpdGhtZXRpYyBvcGVyYXRvcgogIC8vLyAoc2VlIFtpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JdKSBnaXZlbiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlCiAgLy8vIG9wZXJhbmRzLgogIC8vLwogIC8vLyBJZiBib3RoIHR5cGVzIGFyZSBgaW50YCwgdGhlIHJldHVybmVkIHR5cGUgaXMgYGludGAuCiAgLy8vIElmIGVpdGhlciB0eXBlIGlzIGBkb3VibGVgLCB0aGUgcmV0dXJuZWQgdHlwZSBpcyBgZG91YmxlYC4KICAvLy8gSWYgYm90aCB0eXBlcyByZWZlciB0byB0aGUgc2FtZSB0eXBlIHZhcmlhYmxlICh0eXBpY2FsbHkgd2l0aCBgbnVtYCBhcwogIC8vLyB0aGUgdXBwZXIgYm91bmQpLCB0aGVuIHRoYXQgdHlwZSB2YXJpYWJsZSBpcyByZXR1cm5lZC4KICAvLy8gT3RoZXJ3aXNlIGBudW1gIGlzIHJldHVybmVkLgogIERhcnRUeXBlIGdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMikgewogICAgaWYgKHR5cGUxID09IHR5cGUyKSByZXR1cm4gdHlwZTE7CgogICAgaWYgKHR5cGUxIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZTIgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAodHlwZTEuY2xhc3NOb2RlID09IHR5cGUyLmNsYXNzTm9kZSkgewogICAgICAgIHJldHVybiB0eXBlMTsKICAgICAgfQogICAgICBpZiAodHlwZTEuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5kb3VibGVDbGFzcyB8fAogICAgICAgICAgdHlwZTIuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5kb3VibGVDbGFzcykgewogICAgICAgIHJldHVybiBjb3JlVHlwZXMuZG91YmxlUmF3VHlwZSh0eXBlMS5udWxsYWJpbGl0eSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY29yZVR5cGVzLm51bVJhd1R5cGUodHlwZTEubnVsbGFiaWxpdHkpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHBvc3NpYmx5IGFic3RyYWN0IGludGVyZmFjZSBtZW1iZXIgb2YgW2NsYXNzX10gd2l0aCB0aGUgZ2l2ZW4KICAvLy8gW25hbWVdLgogIC8vLwogIC8vLyBJZiBbc2V0dGVyXSBpcyBgZmFsc2VgLCBvbmx5IGZpZWxkcywgbWV0aG9kcywgYW5kIGdldHRlcnMgd2l0aCB0aGF0IG5hbWUKICAvLy8gd2lsbCBiZSBmb3VuZC4gIElmIFtzZXR0ZXJdIGlzIGB0cnVlYCwgb25seSBub24tZmluYWwgZmllbGRzIGFuZCBzZXR0ZXJzCiAgLy8vIHdpbGwgYmUgZm91bmQuCiAgLy8vCiAgLy8vIElmIG11bHRpcGxlIG1lbWJlcnMgd2l0aCB0aGF0IG5hbWUgYXJlIGluaGVyaXRlZCBhbmQgbm90IG92ZXJyaWRkZW4sIHRoZQogIC8vLyBtZW1iZXIgZnJvbSB0aGUgZmlyc3QgZGVjbGFyZWQgc3VwZXJ0eXBlIGlzIHJldHVybmVkLgogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xzLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KTsKfQoKLy8vIFRyaS1zdGF0ZSBsb2dpY2FsIHJlc3VsdCBvZiBhIG51bGxhYmlsaXR5LWF3YXJlIHN1YnR5cGUgY2hlY2suCmNsYXNzIElzU3VidHlwZU9mIHsKICAvLy8gSW50ZXJuYWwgdmFsdWUgY29uc3RydWN0ZWQgdmlhIFtJc1N1YnR5cGVPZi5uZXZlcl0uCiAgLy8vCiAgLy8vIFRoZSBpbnRlZ2VyIHZhbHVlcyBvZiBbX3ZhbHVlTmV2ZXJdLCBbX3ZhbHVlT25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzXSwKICAvLy8gYW5kIFtfdmFsdWVBbHdheXNdIGFyZSBpbXBvcnRhbnQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgW19hbmRWYWx1ZXNdLAogIC8vLyBbX2FsbF0sIGFuZCBbYW5kXS4gIFRoZXkgc2hvdWxkIGJlIGtlcHQgaW4gc3luYy4KICBzdGF0aWMgY29uc3QgaW50IF92YWx1ZU5ldmVyID0gMDsKCiAgLy8vIEludGVybmFsIHZhbHVlIGNvbnN0cnVjdGVkIHZpYSBbSXNTdWJ0eXBlT2Yub25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzXS4KICBzdGF0aWMgY29uc3QgaW50IF92YWx1ZU9ubHlJZklnbm9yaW5nTnVsbGFiaWxpdGllcyA9IDE7CgogIC8vLyBJbnRlcm5hbCB2YWx1ZSBjb25zdHJ1Y3RlZCB2aWEgW0lzU3VidHlwZU9mLmFsd2F5c10uCiAgc3RhdGljIGNvbnN0IGludCBfdmFsdWVBbHdheXMgPSAzOwoKICBzdGF0aWMgY29uc3QgTGlzdDxJc1N1YnR5cGVPZj4gX2FsbCA9IGNvbnN0IDxJc1N1YnR5cGVPZj5bCiAgICBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpLAogICAgY29uc3QgSXNTdWJ0eXBlT2Yub25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzKCksCiAgICBudWxsLCAvLyBEZWxpYmVyYXRlbHkgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZXJlJ3Mgbm8gaW5kZXggdmFsdWUgZm9yIHRoYXQuCiAgICBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKQogIF07CgogIC8vLyBDb21iaW5lcyByZXN1bHRzIG9mIHN1YnR5cGUgY2hlY2tzIG9uIHBhcnRzIGludG8gdGhlIG92ZXJhbGwgcmVzdWx0LgogIC8vLwogIC8vLyBJdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBmb3IgW2FuZF0uICBTZWUgdGhlIGNvbW1lbnQgb24gW2FuZF0gZm9yCiAgLy8vIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMuICBCb3RoIFt2YWx1ZTFdIGFuZCBbdmFsdWUyXSBzaG91bGQgYmUgY2hvc2VuCiAgLy8vIGZyb20gW192YWx1ZU5ldmVyXSwgW192YWx1ZU9ubHlJZklnbm9yaW5nTnVsbGFiaWxpdGllc10sIGFuZAogIC8vLyBbX3ZhbHVlQWx3YXlzXS4gIFRoZSBtZXRob2QgcHJvZHVjZXMgdGhlIHJlc3VsdCB3aGljaCBpcyBvbmUgb2YKICAvLy8gW192YWx1ZU5ldmVyXSwgW192YWx1ZU9ubHlJZklnbm9yaW5nTnVsbGFiaWxpdGllc10sIGFuZCBbX3ZhbHVlQWx3YXlzXS4KICBzdGF0aWMgaW50IF9hbmRWYWx1ZXMoaW50IHZhbHVlMSwgaW50IHZhbHVlMikgPT4gdmFsdWUxICYgdmFsdWUyOwoKICAvLy8gQ29tYmluZXMgcmVzdWx0cyBvZiB0aGUgY2hlY2tzIG9uIGFsdGVybmF0aXZlcyBpbnRvIHRoZSBvdmVyYWxsIHJlc3VsdC4KICAvLy8KICAvLy8gSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgZm9yIFtvcl0uICBTZWUgdGhlIGNvbW1lbnQgb24gW29yXSBmb3IgbW9yZQogIC8vLyBkZXRhaWxzIGFuZCBleGFtcGxlcy4gIEJvdGggW3ZhbHVlMV0gYW5kIFt2YWx1ZTJdIHNob3VsZCBiZSBjaG9zZW4gZnJvbQogIC8vLyBbX3ZhbHVlTmV2ZXJdLCBbX3ZhbHVlT25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzXSwgYW5kIFtfdmFsdWVBbHdheXNdLgogIC8vLyBUaGUgbWV0aG9kIHByb2R1Y2VzIHRoZSByZXN1bHQgd2hpY2ggaXMgb25lIG9mIFtfdmFsdWVOZXZlcl0sCiAgLy8vIFtfdmFsdWVPbmx5SWZJZ25vcmluZ051bGxhYmlsaXRpZXNdLCBhbmQgW192YWx1ZUFsd2F5c10uCiAgc3RhdGljIGludCBfb3JWYWx1ZXMoaW50IHZhbHVlMSwgaW50IHZhbHVlMikgPT4gdmFsdWUxIHwgdmFsdWUyOwoKICAvLy8gVGhlIG9ubHkgc3RhdGUgb2YgYW4gW0lzU3VidHlwZU9mXSBvYmplY3QuCiAgZmluYWwgaW50IF92YWx1ZTsKCiAgY29uc3QgSXNTdWJ0eXBlT2YuX2ludGVybmFsKGludCB2YWx1ZSkgOiBfdmFsdWUgPSB2YWx1ZTsKCiAgLy8vIFN1YnR5cGUgY2hlY2sgc3VjY2VlZHMgaW4gYm90aCBtb2Rlcy4KICBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKSA6IHRoaXMuX2ludGVybmFsKF92YWx1ZUFsd2F5cyk7CgogIC8vLyBTdWJ0eXBlIGNoZWNrIHN1Y2NlZWRzIG9ubHkgaWYgdGhlIG51bGxhYmlsaXR5IG1hcmtlcnMgYXJlIGlnbm9yZWQuCiAgLy8vCiAgLy8vIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiBhIHN1YnR5cGUgY2hlY2sgc3VjY2VlZHMgZm9yIHR3byB0eXBlcyBpbiBmdWxsLU5OQkQKICAvLy8gbW9kZSwgaXQgYWxzbyBzdWNjZWVkcyBmb3IgdGhvc2UgdHdvIHR5cGVzIGlmIHRoZSBudWxsYWJpbGl0eSBtYXJrZXJzIG9uCiAgLy8vIHRoZSB0eXBlcyBhbmQgYWxsIG9mIHRoZWlyIHN1Yi10ZXJtcyBhcmUgaWdub3JlZCAodGhhdCBpcywgaW4gdGhlIHByZS1OTkJECiAgLy8vIG1vZGUpLiAgQnkgY29udHJhcG9zaXRpb24sIGlmIGEgc3VidHlwZSBjaGVjayBmYWlscyBmb3IgdHdvIHR5cGVzIHdoZW4gdGhlCiAgLy8vIG51bGxhYmlsaXR5IG1hcmtlcnMgYXJlIGlnbm9yZWQsIGl0IHNob3VsZCBhbHNvIGZhaWwgZm9yIHRob3NlIHR5cGVzIGluCiAgLy8vIGZ1bGwtTk5CRCBtb2RlLgogIGNvbnN0IElzU3VidHlwZU9mLm9ubHlJZklnbm9yaW5nTnVsbGFiaWxpdGllcygpCiAgICAgIDogdGhpcy5faW50ZXJuYWwoX3ZhbHVlT25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKCiAgLy8vIFN1YnR5cGUgY2hlY2sgZmFpbHMgaW4gYm90aCBtb2Rlcy4KICBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpIDogdGhpcy5faW50ZXJuYWwoX3ZhbHVlTmV2ZXIpOwoKICAvLy8gQ2hlY2tzIGlmIHR3byB0eXBlcyBhcmUgaW4gcmVsYXRpb24gYmFzZWQgc29sZWx5IG9uIHRoZWlyIG51bGxhYmlsaXRpZXMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZnVsIG9uIGl0cyBvd24gaWYgdGhlIHR5cGVzIGFyZSBrbm93biB0byBiZSB0aGUgc2FtZSBtb2R1bG8gdGhlCiAgLy8vIG51bGxhYmlsaXR5IGF0dHJpYnV0ZSwgYnV0IG1vc3RseSBpdCdzIHVzZWZ1bCB0byBjb21iaW5lIHRoZSByZXN1bHQgZnJvbQogIC8vLyBbSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXNdIHZpYSBbYW5kXSB3aXRoIHRoZSBwYXJ0aWFsCiAgLy8vIHJlc3VsdHMgb2J0YWluZWQgZnJvbSBvdGhlciB0eXBlIHBhcnRzLiBGb3IgZXhhbXBsZSwgdGhlIG92ZXJhbGwgcmVzdWx0CiAgLy8vIGZvciBgTGlzdDxpbnQ+PyA8OiBMaXN0PG51bT4qYCBjYW4gYmUgY29tcHV0ZWQgYXMgYFJhLmpvaW4oUm4pYCB3aGVyZSBgUmFgCiAgLy8vIGlzIHRoZSByZXN1bHQgb2YgYSBzdWJ0eXBlIGNoZWNrIG9uIHRoZSBhcmd1bWVudHMgYGludGAgYW5kIGBudW1gLCBhbmQKICAvLy8gYFJuYCBpcyB0aGUgcmVzdWx0IG9mIFtJc1N1YnR5cGVPZi5iYXNlZFNvbGVseU9uTnVsbGFiaWxpdGllc10gb24gdGhlCiAgLy8vIHR5cGVzIGBMaXN0PGludD4/YCBhbmQgYExpc3Q8bnVtPipgLgogIGZhY3RvcnkgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMoCiAgICAgIERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgaWYgKHN1YnR5cGUgaXMgSW52YWxpZFR5cGUpIHsKICAgICAgaWYgKHN1cGVydHlwZSBpcyBJbnZhbGlkVHlwZSkgewogICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgICAgfQogICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2Yub25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzKCk7CiAgICB9CiAgICBpZiAoc3VwZXJ0eXBlIGlzIEludmFsaWRUeXBlKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5vbmx5SWZJZ25vcmluZ051bGxhYmlsaXRpZXMoKTsKICAgIH0KCiAgICBpZiAoc3VidHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUgJiYgc3VwZXJ0eXBlLmlzUG90ZW50aWFsbHlOb25OdWxsYWJsZSkgewogICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2Yub25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzKCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgfQoKICAvLy8gQ29tYmluZXMgcmVzdWx0cyBmb3IgdGhlIHR5cGUgcGFydHMgaW50byB0aGUgb3ZlcmFsbCByZXN1bHQgZm9yIHRoZSB0eXBlLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgdGhlIHJlc3VsdCBvZiBgQTxCMSwgQzE+IDw6IEE8QjIsIEMyPmAgY2FuIGJlIGNvbXB1dGVkIGZyb20KICAvLy8gdGhlIHJlc3VsdHMgb2YgdGhlIGNoZWNrcyBgQjEgPDogQjJgIGFuZCBgQzEgPDogQzJgLiAgVXNpbmcgdGhlIGJpbmFyeQogIC8vLyBvdXRjb21lIG9mIHRoZSBjaGVja3MsIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgY2hlY2sgcmVzdWx0cyBvbiBwYXJ0cyBpcwogIC8vLyBzaW1wbHkgZG9uZSB2aWEgYCYmYCwgYW5kIFthbmRdIGlzIHRoZSBhbmFsb2cgdG8gYCYmYCBmb3IgdGhlIHRlcm5hcnkKICAvLy8gb3V0Y29tZS4gIFNvLCBpbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgb3ZlcmFsbCByZXN1bHQgaXMgY29tcHV0ZWQgYXMKICAvLy8gYFJiLmFuZChSYylgIHdoZXJlIGBSYmAgaXMgdGhlIHJlc3VsdCBvZiBgQjEgPDogQjJgLCBgUmNgIGlzIHRoZSByZXN1bHQKICAvLy8gb2YgYEMxIDw6IEMyYC4KICBJc1N1YnR5cGVPZiBhbmQoSXNTdWJ0eXBlT2Ygb3RoZXIpIHsKICAgIHJldHVybiBfYWxsW19hbmRWYWx1ZXMoX3ZhbHVlLCBvdGhlci5fdmFsdWUpXTsKICB9CgogIC8vLyBTaG9ydHMgdGhlIGNvbXB1dGF0aW9uIG9mIFthbmRdIGlmIGB0aGlzYCBpcyBbSXNTdWJ0eXBlT2YubmV2ZXJdLgogIC8vLwogIC8vLyBVc2UgdGhpcyBpbnN0ZWFkIG9mIFthbmRdIGZvciBvcHRpbWl6YXRpb24gaW4gY2FzZSB0aGUgYXJndW1lbnQgdG8gW2FuZF0KICAvLy8gaXMsIGZvciBleGFtcGxlLCBhIHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBzdWJ0eXBlIGNoZWNrLiAgVW5saWtlIFthbmRdLAogIC8vLyBbYW5kU3VidHlwZUNoZWNrRm9yXSB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBpZiBgdGhpc2Agd2FzIGNvbnN0cnVjdGVkIGFzCiAgLy8vIFtJc1N1YnR5cGVPZi5uZXZlcl0gYmVjYXVzZSB0aGUgcmlnaHQtaGFuZCBzaWRlIHdpbGwgbm90IGNoYW5nZSB0aGUKICAvLy8gb3ZlcmFsbCByZXN1bHQgYW55d2F5LgogIElzU3VidHlwZU9mIGFuZFN1YnR5cGVDaGVja0ZvcigKICAgICAgRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlLCBTdWJ0eXBlVGVzdGVyIHRlc3RlcikgewogICAgaWYgKF92YWx1ZSA9PSBfdmFsdWVOZXZlcikgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gdGhpcwogICAgICAgIC5hbmQodGVzdGVyLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHN1YnR5cGUsIHN1cGVydHlwZSkpOwogIH0KCiAgLy8vIENvbWJpbmVzIHJlc3VsdHMgb2YgdGhlIGNoZWNrcyBvbiBhbHRlcm5hdGl2ZXMgaW50byB0aGUgb3ZlcmFsbCByZXN1bHQuCiAgLy8vCiAgLy8vIEZvciBleGFtcGxlLCB0aGUgcmVzdWx0IG9mIGBUIDw6IEZ1dHVyZU9yPFM+YCBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUKICAvLy8gcmVzdWx0cyBvZiB0aGUgY2hlY2tzIGBUIDw6IFNgIGFuZCBgVCA8OiBGdXR1cmU8Uz5gLiAgVXNpbmcgdGhlIGJpbmFyeQogIC8vLyBvdXRjb21lIG9mIHRoZSBjaGVja3MsIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgY2hlY2sgcmVzdWx0cyBvbiBwYXJ0cyBpcwogIC8vLyBzaW1wbHkgZG9uZSB2aWEgbG9naWNhbCAib3IiLCBhbmQgW29yXSBpcyB0aGUgYW5hbG9nIHRvICJvciIgZm9yIHRoZQogIC8vLyB0ZXJuYXJ5IG91dGNvbWUuICBTbywgaW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIG92ZXJhbGwgcmVzdWx0IGlzIGNvbXB1dGVkCiAgLy8vIGFzIGBScy5vcihSZilgIHdoZXJlIGBSc2AgaXMgdGhlIHJlc3VsdCBvZiBgVCA8OiBTYCwgYFJmYCBpcyB0aGUgcmVzdWx0IG9mCiAgLy8vIGBUIDw6IEZ1dHVyZTxTPmAuCiAgSXNTdWJ0eXBlT2Ygb3IoSXNTdWJ0eXBlT2Ygb3RoZXIpIHsKICAgIHJldHVybiBfYWxsW19vclZhbHVlcyhfdmFsdWUsIG90aGVyLl92YWx1ZSldOwogIH0KCiAgLy8vIFNob3J0cyB0aGUgY29tcHV0YXRpb24gb2YgW29yXSBpZiBgdGhpc2AgaXMgW0lzU3VidHlwZU9mLmFsd2F5c10uCiAgLy8vCiAgLy8vIFVzZSB0aGlzIGluc3RlYWQgb2YgW29yXSBmb3Igb3B0aW1pemF0aW9uIGluIGNhc2UgdGhlIGFyZ3VtZW50IHRvIFtvcl0gaXMsCiAgLy8vIGZvciBleGFtcGxlLCBhIHBvdGVudGlhbGx5IGV4cGVuc2l2ZSBzdWJ0eXBlIGNoZWNrLiAgVW5saWtlIFtvcl0sCiAgLy8vIFtvclN1YnR5cGVDaGVja0Zvcl0gd2lsbCBpbW1lZGlhdGVseSByZXR1cm4gaWYgYHRoaXNgIHdhcyBjb25zdHJ1Y3RlZAogIC8vLyBhcyBbSXNTdWJ0eXBlT2YuYWx3YXlzXSBiZWNhdXNlIHRoZSByaWdodC1oYW5kIHNpZGUgd2lsbCBub3QgY2hhbmdlIHRoZQogIC8vLyBvdmVyYWxsIHJlc3VsdCBhbnl3YXkuCiAgSXNTdWJ0eXBlT2Ygb3JTdWJ0eXBlQ2hlY2tGb3IoCiAgICAgIERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSwgU3VidHlwZVRlc3RlciB0ZXN0ZXIpIHsKICAgIGlmIChfdmFsdWUgPT0gX3ZhbHVlQWx3YXlzKSByZXR1cm4gdGhpczsKICAgIHJldHVybiB0aGlzCiAgICAgICAgLm9yKHRlc3Rlci5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzdWJ0eXBlLCBzdXBlcnR5cGUpKTsKICB9CgogIGJvb2wgaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpIHsKICAgIHJldHVybiBfdmFsdWUgIT0gX3ZhbHVlTmV2ZXI7CiAgfQoKICBib29sIGlzU3VidHlwZVdoZW5Vc2luZ051bGxhYmlsaXRpZXMoKSB7CiAgICByZXR1cm4gX3ZhbHVlID09IF92YWx1ZUFsd2F5czsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHN3aXRjaCAoX3ZhbHVlKSB7CiAgICAgIGNhc2UgX3ZhbHVlQWx3YXlzOgogICAgICAgIHJldHVybiAiSXNTdWJ0eXBlT2YuYWx3YXlzIjsKICAgICAgY2FzZSBfdmFsdWVOZXZlcjoKICAgICAgICByZXR1cm4gIklzU3VidHlwZU9mLm5ldmVyIjsKICAgICAgY2FzZSBfdmFsdWVPbmx5SWZJZ25vcmluZ051bGxhYmlsaXRpZXM6CiAgICAgICAgcmV0dXJuICJJc1N1YnR5cGVPZi5vbmx5SWZJZ25vcmluZ051bGxhYmlsaXRpZXMiOwogICAgfQogICAgcmV0dXJuICJJc1N1YnR5cGVPZi48dW5rbm93biB2YWx1ZSAnJHtfdmFsdWV9Jz4iOwogIH0KfQoKZW51bSBTdWJ0eXBlQ2hlY2tNb2RlIHsKICB3aXRoTnVsbGFiaWxpdGllcywKICBpZ25vcmluZ051bGxhYmlsaXRpZXMsCn0KCi8vLyBUaGUgcGFydCBvZiBbVHlwZUVudmlyb25tZW50XSB0aGF0IGRlYWxzIHdpdGggc3VidHlwZSB0ZXN0cy4KLy8vCi8vLyBUaGlzIGxpdmVzIGluIGEgc2VwYXJhdGUgY2xhc3Mgc28gaXQgY2FuIGJlIHRlc3RlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBTREsuCmFic3RyYWN0IGNsYXNzIFN1YnR5cGVUZXN0ZXIgewogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdExlZ2FjeVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBnZXQgb2JqZWN0TnVsbGFibGVSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxUeXBlOwogIEludGVyZmFjZVR5cGUgZ2V0IGZ1bmN0aW9uTGVnYWN5UmF3VHlwZTsKICBDbGFzcyBnZXQgb2JqZWN0Q2xhc3M7CiAgQ2xhc3MgZ2V0IGZ1bmN0aW9uQ2xhc3M7CiAgQ2xhc3MgZ2V0IGZ1dHVyZU9yQ2xhc3M7CiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KTsKCiAgc3RhdGljIExpc3Q8T2JqZWN0PiB0eXBlQ2hlY2tzOwoKICBJbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzLAogICAgICBMaWJyYXJ5IGNsaWVudExpYnJhcnksIENvcmVUeXBlcyBjb3JlVHlwZXMpOwoKICBMaXN0PERhcnRUeXBlPiBnZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0eXBlIGhpZXJhcmNoeS4gIE1heSBiZQogIC8vLyBvdmVycmlkZGVuIGluIHN1YmNsYXNzZXMuCiAgYm9vbCBpc1RvcChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSBpcyBEeW5hbWljVHlwZSB8fAogICAgICAgIHR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgICB0eXBlID09IG9iamVjdExlZ2FjeVJhd1R5cGUgfHwKICAgICAgICB0eXBlID09IG9iamVjdE51bGxhYmxlUmF3VHlwZTsKICB9CgogIC8vLyBDYW4gYmUgdXNlIHRvIGNvbGxlY3QgdHlwZSBjaGVja3MuIFRvIHVzZToKICAvLy8gMS4gUmVuYW1lIGBpc1N1YnR5cGVPZmAgdG8gYF9pc1N1YnR5cGVPZmAuCiAgLy8vIDIuIFJlbmFtZSBgX2NvbGxlY3RfaXNTdWJ0eXBlT2ZgIHRvIGBpc1N1YnR5cGVPZmAuCiAgLy8vIDMuIENvbW1lbnQgb3V0IHRoZSBjYWxsIHRvIGBfaXNTdWJ0eXBlT2ZgIGJlbG93LgogIC8vIGlnbm9yZTp1bnVzZWRfZWxlbWVudAogIGJvb2wgX2NvbGxlY3RfaXNTdWJ0eXBlT2YoCiAgICAgIERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSwgU3VidHlwZUNoZWNrTW9kZSBtb2RlKSB7CiAgICBib29sIHJlc3VsdCA9IHRydWU7CiAgICAvL3Jlc3VsdCA9IF9pc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGUsIG1vZGUpOwogICAgdHlwZUNoZWNrcyA/Pz0gPE9iamVjdD5bXTsKICAgIHR5cGVDaGVja3MuYWRkKFtzdWJ0eXBlLCBzdXBlcnR5cGUsIHJlc3VsdF0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW3N1YnR5cGVdIGlzIGEgc3VidHlwZSBvZiBbc3VwZXJ0eXBlXS4KICBib29sIGlzU3VidHlwZU9mKAogICAgICBEYXJ0VHlwZSBzdWJ0eXBlLCBEYXJ0VHlwZSBzdXBlcnR5cGUsIFN1YnR5cGVDaGVja01vZGUgbW9kZSkgewogICAgSXNTdWJ0eXBlT2YgcmVzdWx0ID0KICAgICAgICBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzdWJ0eXBlLCBzdXBlcnR5cGUpOwogICAgc3dpdGNoIChtb2RlKSB7CiAgICAgIGNhc2UgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXM6CiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCk7CiAgICAgIGNhc2UgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllczoKICAgICAgICByZXR1cm4gcmVzdWx0LmlzU3VidHlwZVdoZW5Vc2luZ051bGxhYmlsaXRpZXMoKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVW5oYW5kbGVkIHN1YnR5cGUgY2hlY2tpbmcgbW9kZSAnJG1vZGUnIik7CiAgICB9CiAgfQoKICAvLy8gUGVyZm9ybXMgYSBudWxsYWJpbGl0eS1hd2FyZSBzdWJ0eXBlIGNoZWNrLgogIC8vLwogIC8vLyBUaGUgb3V0Y29tZSBpcyBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnRzIHRvIFtJc1N1YnR5cGVPZl0uCiAgSXNTdWJ0eXBlT2YgcGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgIERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgc3VidHlwZSA9IHN1YnR5cGUudW5hbGlhczsKICAgIHN1cGVydHlwZSA9IHN1cGVydHlwZS51bmFsaWFzOwogICAgaWYgKGlkZW50aWNhbChzdWJ0eXBlLCBzdXBlcnR5cGUpKSByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICBpZiAoc3VidHlwZSBpcyBCb3R0b21UeXBlKSByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICBpZiAoc3VidHlwZSBpcyBOZXZlclR5cGUpIHsKICAgICAgcmV0dXJuIHN1cGVydHlwZSBpcyBCb3R0b21UeXBlCiAgICAgICAgICA/IGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCkKICAgICAgICAgIDogbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VidHlwZSA9PSBudWxsVHlwZSkgewogICAgICAvLyBUT0RPKGRtaXRyeWFzKTogUmVtb3ZlIEludmFsaWRUeXBlIGZyb20gc3VidHlwZSByZWxhdGlvbi4KICAgICAgaWYgKHN1cGVydHlwZSBpcyBJbnZhbGlkVHlwZSkgewogICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgc3VwcG9zZWQgdG8ga2VlcCB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICAgIH0KCiAgICAgIE51bGxhYmlsaXR5IHN1cGVydHlwZU51bGxhYmlsaXR5ID0KICAgICAgICAgIGNvbXB1dGVOdWxsYWJpbGl0eShzdXBlcnR5cGUsIGZ1dHVyZU9yQ2xhc3MpOwogICAgICBpZiAoc3VwZXJ0eXBlTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgfHwKICAgICAgICAgIHN1cGVydHlwZU51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgewogICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgICAgfQogICAgICAvLyBTZWUgcnVsZSA0IG9mIHRoZSBzdWJ0eXBlIHJ1bGVzIGZyb20gdGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbi4KICAgICAgcmV0dXJuIHN1cGVydHlwZSBpcyBCb3R0b21UeXBlIHx8IHN1cGVydHlwZSBpcyBOZXZlclR5cGUKICAgICAgICAgID8gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKQogICAgICAgICAgOiBjb25zdCBJc1N1YnR5cGVPZi5vbmx5SWZJZ25vcmluZ051bGxhYmlsaXRpZXMoKTsKICAgIH0KICAgIGlmIChpc1RvcChzdXBlcnR5cGUpKSByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CgogICAgLy8gSGFuZGxlIEZ1dHVyZU9yPFQ+IHVuaW9uIHR5cGUuCiAgICBpZiAoc3VidHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1YnR5cGUuY2xhc3NOb2RlLCBmdXR1cmVPckNsYXNzKSkgewogICAgICB2YXIgc3VidHlwZUFyZyA9IHN1YnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICBpZGVudGljYWwoc3VwZXJ0eXBlLmNsYXNzTm9kZSwgZnV0dXJlT3JDbGFzcykpIHsKICAgICAgICB2YXIgc3VwZXJ0eXBlQXJnID0gc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbMF07CiAgICAgICAgLy8gRnV0dXJlT3I8QT4gPDogRnV0dXJlT3I8Qj4gaWZmIEEgPDogQgogICAgICAgIHJldHVybiBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzdWJ0eXBlQXJnLCBzdXBlcnR5cGVBcmcpOwogICAgICB9CgogICAgICAvLyBnaXZlbiB0MSBpcyBGdXR1cmU8QT4gfCBBLCB0aGVuOgogICAgICAvLyAoRnV0dXJlPEE+IHwgQSkgPDogdDIgaWZmIEZ1dHVyZTxBPiA8OiB0MiBhbmQgQSA8OiB0Mi4KICAgICAgcmV0dXJuIHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHN1YnR5cGVBcmcsIHN1cGVydHlwZSkKICAgICAgICAgIC5hbmRTdWJ0eXBlQ2hlY2tGb3IoCiAgICAgICAgICAgICAgZnV0dXJlVHlwZShzdWJ0eXBlQXJnLCBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSksIHN1cGVydHlwZSwgdGhpcykKICAgICAgICAgIC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHN1YnR5cGUsIHN1cGVydHlwZSkpOwogICAgfQoKICAgIGlmIChzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBzdXBlcnR5cGUuY2xhc3NOb2RlID09IG9iamVjdENsYXNzKSB7CiAgICAgIGFzc2VydChzdXBlcnR5cGUubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICByZXR1cm4gbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgICB9CgogICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgIC8vIGdpdmVuIHQyIGlzIEZ1dHVyZTxBPiB8IEEsIHRoZW46CiAgICAgIC8vIHQxIDw6IChGdXR1cmU8QT4gfCBBKSBpZmYgdDEgPDogRnV0dXJlPEE+IG9yIHQxIDw6IEEKICAgICAgTnVsbGFiaWxpdHkgdW5pdGVkTnVsbGFiaWxpdHkgPQogICAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5T2ZGdXR1cmVPcihzdXBlcnR5cGUsIGZ1dHVyZU9yQ2xhc3MpOwogICAgICBEYXJ0VHlwZSBzdXBlcnR5cGVBcmcgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXTsKICAgICAgRGFydFR5cGUgc3VwZXJ0eXBlRnV0dXJlID0gZnV0dXJlVHlwZShzdXBlcnR5cGVBcmcsIHVuaXRlZE51bGxhYmlsaXR5KTsKICAgICAgcmV0dXJuIHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHN1YnR5cGUsIHN1cGVydHlwZUZ1dHVyZSkKICAgICAgICAgIC5vclN1YnR5cGVDaGVja0ZvcigKICAgICAgICAgICAgICBzdWJ0eXBlLCBzdXBlcnR5cGVBcmcud2l0aE51bGxhYmlsaXR5KHVuaXRlZE51bGxhYmlsaXR5KSwgdGhpcyk7CiAgICB9CgogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBDbGFzcyBzdXBlcnR5cGVDbGFzcyA9IHN1cGVydHlwZS5jbGFzc05vZGU7CiAgICAgIExpc3Q8RGFydFR5cGU+IHVwY2FzdFR5cGVBcmd1bWVudHMgPQogICAgICAgICAgZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZihzdWJ0eXBlLCBzdXBlcnR5cGVDbGFzcyk7CiAgICAgIGlmICh1cGNhc3RUeXBlQXJndW1lbnRzID09IG51bGwpIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICBJc1N1YnR5cGVPZiByZXN1bHQgPSBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cGNhc3RUeXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgLy8gVGVybWluYXRpb246IHRoZSAnc3VwZXJ0eXBlJyBwYXJhbWV0ZXIgZGVjcmVhc2VzIGluIHNpemUuCiAgICAgICAgaW50IHZhcmlhbmNlID0gc3VwZXJ0eXBlQ2xhc3MudHlwZVBhcmFtZXRlcnNbaV0udmFyaWFuY2U7CiAgICAgICAgRGFydFR5cGUgbGVmdFR5cGUgPSB1cGNhc3RUeXBlQXJndW1lbnRzW2ldOwogICAgICAgIERhcnRUeXBlIHJpZ2h0VHlwZSA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzW2ldOwogICAgICAgIGlmICh2YXJpYW5jZSA9PSBWYXJpYW5jZS5jb250cmF2YXJpYW50KSB7CiAgICAgICAgICByZXN1bHQgPSByZXN1bHQKICAgICAgICAgICAgICAuYW5kKHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHJpZ2h0VHlwZSwgbGVmdFR5cGUpKTsKICAgICAgICAgIGlmICghcmVzdWx0LmlzU3VidHlwZVdoZW5JZ25vcmluZ051bGxhYmlsaXRpZXMoKSkgewogICAgICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHZhcmlhbmNlID09IFZhcmlhbmNlLmludmFyaWFudCkgewogICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZCgKICAgICAgICAgICAgICBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZU11dHVhbFN1YnR5cGVzQ2hlY2sobGVmdFR5cGUsIHJpZ2h0VHlwZSkpOwogICAgICAgICAgaWYgKCFyZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgPSByZXN1bHQKICAgICAgICAgICAgICAuYW5kKHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKGxlZnRUeXBlLCByaWdodFR5cGUpKTsKICAgICAgICAgIGlmICghcmVzdWx0LmlzU3VidHlwZVdoZW5JZ25vcmluZ051bGxhYmlsaXRpZXMoKSkgewogICAgICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgICAgLmFuZChuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMoc3VidHlwZSwgc3VwZXJ0eXBlKSk7CiAgICB9CiAgICBpZiAoc3VidHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICBpZiAoc3VwZXJ0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgSXNTdWJ0eXBlT2YgcmVzdWx0ID0gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICAgICAgaWYgKHN1YnR5cGUucGFyYW1ldGVyID09IHN1cGVydHlwZS5wYXJhbWV0ZXIpIHsKICAgICAgICAgIGlmIChzdXBlcnR5cGUucHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjaygKICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLAogICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZShzdXBlcnR5cGUucGFyYW1ldGVyLAogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnR5cGUudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSkpCiAgICAgICAgICAgICAgICAuYW5kU3VidHlwZUNoZWNrRm9yKHN1YnR5cGUsIHN1cGVydHlwZS5ib3VuZCwgdGhpcyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBQcm9tb3RlZCBib3VuZCBzaG91bGQgYWx3YXlzIGJlIGEgc3VidHlwZSBvZiB0aGUgZGVjbGFyZWQgYm91bmQuCiAgICAgICAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBVc2UgdGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2hlbiB0eXBlIHByb21vdGlvbgogICAgICAgICAgICAvLyBpcyB1cGRhdGVkLgogICAgICAgICAgICAvLyBhc3NlcnQoc3VidHlwZS5wcm9tb3RlZEJvdW5kID09IG51bGwgfHwKICAgICAgICAgICAgLy8gICAgIHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKAogICAgICAgICAgICAvLyAgICAgICAgIHN1YnR5cGUuYm91bmQsIHN1cGVydHlwZS5ib3VuZCkKICAgICAgICAgICAgLy8gICAgICAgICAuaXNTdWJ0eXBlV2hlblVzaW5nTnVsbGFiaWxpdGllcygpKTsKICAgICAgICAgICAgYXNzZXJ0KHN1YnR5cGUucHJvbW90ZWRCb3VuZCA9PSBudWxsIHx8CiAgICAgICAgICAgICAgICBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5ib3VuZCwgc3VwZXJ0eXBlLmJvdW5kKQogICAgICAgICAgICAgICAgICAgIC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpOwogICAgICAgICAgICByZXN1bHQgPSBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgICBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzdWJ0eXBlLmJvdW5kLCBzdXBlcnR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAoc3VidHlwZS5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQgJiYKICAgICAgICAgICAgc3VwZXJ0eXBlLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCkgewogICAgICAgICAgLy8gVGhlIHR3byBudWxsYWJpbGl0aWVzIGFyZSB1bmRldGVybWluZWQsIGJ1dCBhcmUgY29ubmVjdGVkIHZpYQogICAgICAgICAgLy8gYWRkaXRpb25hbCBjb25zdHJhaW50LCBuYW1lbHkgdGhhdCB0aGV5IHdpbGwgYmUgZXF1YWwgYXQgcnVuIHRpbWUuCiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0LmFuZCgKICAgICAgICAgICAgbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHN1YnR5cGUsIHN1cGVydHlwZSkpOwogICAgICB9CiAgICAgIC8vIFRlcm1pbmF0aW9uOiBpZiB0aGVyZSBhcmUgbm8gY3ljbGljYWxseSBib3VuZCB0eXBlIHBhcmFtZXRlcnMsIHRoaXMKICAgICAgLy8gcmVjdXJzaXZlIGNhbGwgY2FuIG9ubHkgb2NjdXIgYSBmaW5pdGUgbnVtYmVyIG9mIHRpbWVzLCBiZWZvcmUgcmVhY2hpbmcKICAgICAgLy8gYSBzaHJpbmtpbmcgcmVjdXJzaXZlIGNhbGwgKG9yIHRlcm1pbmF0aW5nKS4KICAgICAgcmV0dXJuIHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHN1YnR5cGUuYm91bmQsIHN1cGVydHlwZSkKICAgICAgICAgIC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHN1YnR5cGUsIHN1cGVydHlwZSkpOwogICAgfQogICAgaWYgKHN1YnR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBzdXBlcnR5cGUuY2xhc3NOb2RlID09IGZ1bmN0aW9uQ2xhc3MpIHsKICAgICAgICByZXR1cm4gbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHN1cGVydHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gX3BlcmZvcm1OdWxsYWJpbGl0eUF3YXJlRnVuY3Rpb25TdWJ0eXBlQ2hlY2soc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBJc1N1YnR5cGVPZiBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZU11dHVhbFN1YnR5cGVzQ2hlY2soCiAgICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMikgewogICAgLy8gVE9ETyhkbWl0cnlhcyk6IFJlcGxhY2UgaXQgd2l0aCBvbmUgcmVjdXJzaXZlIGRlc2NlbnQgaW5zdGVhZCBvZiB0d28uCiAgICByZXR1cm4gcGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2sodHlwZTEsIHR5cGUyKQogICAgICAgIC5hbmRTdWJ0eXBlQ2hlY2tGb3IodHlwZTIsIHR5cGUxLCB0aGlzKTsKICB9CgogIElzU3VidHlwZU9mIF9wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZUZ1bmN0aW9uU3VidHlwZUNoZWNrKAogICAgICBGdW5jdGlvblR5cGUgc3VidHlwZSwgRnVuY3Rpb25UeXBlIHN1cGVydHlwZSkgewogICAgaWYgKHN1YnR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IHN1cGVydHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgfQogICAgaWYgKHN1YnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgfQogICAgaWYgKHN1YnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHN1cGVydHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICB9CgogICAgSXNTdWJ0eXBlT2YgcmVzdWx0ID0gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICBpZiAoc3VidHlwZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHZhciBzdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBzdWJQYXJhbWV0ZXIgPSBzdWJ0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIHZhciBzdXBlclBhcmFtZXRlciA9IHN1cGVydHlwZS50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBzdWJzdGl0dXRpb25bc3ViUGFyYW1ldGVyXSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICBzdWJQYXJhbWV0ZXIsIHN1cGVyUGFyYW1ldGVyKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgc3ViUGFyYW1ldGVyID0gc3VidHlwZS50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICB2YXIgc3VwZXJQYXJhbWV0ZXIgPSBzdXBlcnR5cGUudHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgdmFyIHN1YkJvdW5kID0gc3Vic3RpdHV0ZShzdWJQYXJhbWV0ZXIuYm91bmQsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgLy8gVGVybWluYXRpb246IGlmIHRoZXJlIGFyZSBubyBjeWNsaWNhbGx5IGJvdW5kIHR5cGUgcGFyYW1ldGVycywgdGhpcwogICAgICAgIC8vIHJlY3Vyc2l2ZSBjYWxsIGNhbiBvbmx5IG9jY3VyIGEgZmluaXRlIG51bWJlciBvZiB0aW1lcyBiZWZvcmUKICAgICAgICAvLyByZWFjaGluZyBhIHNocmlua2luZyByZWN1cnNpdmUgY2FsbCAob3IgdGVybWluYXRpbmcpLgogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hbmQocGVyZm9ybU51bGxhYmlsaXR5QXdhcmVNdXR1YWxTdWJ0eXBlc0NoZWNrKAogICAgICAgICAgICBzdXBlclBhcmFtZXRlci5ib3VuZCwgc3ViQm91bmQpKTsKICAgICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJ0eXBlID0gc3Vic3RpdHV0ZShzdWJ0eXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycywgc3Vic3RpdHV0aW9uKTsKICAgIH0KICAgIHJlc3VsdCA9IHJlc3VsdC5hbmQocGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgc3VidHlwZS5yZXR1cm5UeXBlLCBzdXBlcnR5cGUucmV0dXJuVHlwZSkpOwogICAgaWYgKCFyZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHN1cGVydHlwZVBhcmFtZXRlciA9IHN1cGVydHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgdmFyIHN1YnR5cGVQYXJhbWV0ZXIgPSBzdWJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAvLyBUZXJtaW5hdGlvbjogQm90aCB0eXBlcyBzaHJpbmsgaW4gc2l6ZS4KICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZChwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjaygKICAgICAgICAgIHN1cGVydHlwZVBhcmFtZXRlciwgc3VidHlwZVBhcmFtZXRlcikpOwogICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICAgICAgfQogICAgfQogICAgaW50IHN1YnR5cGVOYW1lSW5kZXggPSAwOwogICAgZm9yIChOYW1lZFR5cGUgc3VwZXJ0eXBlUGFyYW1ldGVyIGluIHN1cGVydHlwZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgd2hpbGUgKHN1YnR5cGVOYW1lSW5kZXggPCBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggJiYKICAgICAgICAgIHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzW3N1YnR5cGVOYW1lSW5kZXhdLm5hbWUgIT0KICAgICAgICAgICAgICBzdXBlcnR5cGVQYXJhbWV0ZXIubmFtZSkgewogICAgICAgICsrc3VidHlwZU5hbWVJbmRleDsKICAgICAgfQogICAgICBpZiAoc3VidHlwZU5hbWVJbmRleCA9PSBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICAgICAgfQogICAgICBOYW1lZFR5cGUgc3VidHlwZVBhcmFtZXRlciA9IHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzW3N1YnR5cGVOYW1lSW5kZXhdOwogICAgICAvLyBUZXJtaW5hdGlvbjogQm90aCB0eXBlcyBzaHJpbmsgaW4gc2l6ZS4KICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZChwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjaygKICAgICAgICAgIHN1cGVydHlwZVBhcmFtZXRlci50eXBlLCBzdWJ0eXBlUGFyYW1ldGVyLnR5cGUpKTsKICAgICAgaWYgKCFyZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQKICAgICAgICAuYW5kKG5ldyBJc1N1YnR5cGVPZi5iYXNlZFNvbGVseU9uTnVsbGFiaWxpdGllcyhzdWJ0eXBlLCBzdXBlcnR5cGUpKTsKICB9Cn0KCi8vLyBDb250ZXh0IG9iamVjdCBuZWVkZWQgZm9yIGNvbXB1dGluZyBgRXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBlYC4KLy8vCi8vLyBUaGUgW1N0YXRpY1R5cGVDb250ZXh0XSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFtUeXBlRW52aXJvbm1lbnRdIGFuZCB0aGUKLy8vIGN1cnJlbnQgJ3RoaXMgdHlwZScgYXMgd2VsbCBhcyBkZXRlcm1pbmluZyB0aGUgbnVsbGFiaWxpdHkgc3RhdGUgb2YgdGhlCi8vLyBlbmNsb3NpbmcgbGlicmFyeS4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3VwcG9ydCBzdGF0aWMgdHlwZSBjYWNoaW5nIHRocm91Z2ggW1N0YXRpY1R5cGVDb250ZXh0XS4KY2xhc3MgU3RhdGljVHlwZUNvbnRleHQgewogIC8vLyBUaGUgW1R5cGVFbnZpcm9ubWVudF0gdXNlZCBmb3IgdGhlIHN0YXRpYyB0eXBlIGNvbXB1dGF0aW9uLgogIC8vLwogIC8vLyBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29yZSB0eXBlcyBhbmQgdGhlIGNsYXNzIGhpZXJhcmNoeS4KICBmaW5hbCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50OwoKICAvLy8gVGhlIGxpYnJhcnkgaW4gd2hpY2ggdGhlIHN0YXRpYyB0eXBlIGlzIGNvbXB1dGVkLgogIC8vLwogIC8vLyBUaGUgYGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdGAgcHJvcGVydHkgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlCiAgLy8vIG51bGxhYmlsaXRpZXMgb2YgdGhlIHN0YXRpYyB0eXBlcy4KICBmaW5hbCBMaWJyYXJ5IF9saWJyYXJ5OwoKICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIGEgYHRoaXNgIGV4cHJlc3Npb24uCiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZTsKCiAgLy8vIENyZWF0ZXMgYSBzdGF0aWMgdHlwZSBjb250ZXh0IGZvciBjb21wdXRpbmcgc3RhdGljIHR5cGVzIGluIHRoZSBib2R5CiAgLy8vIG9mIFttZW1iZXJdLgogIFN0YXRpY1R5cGVDb250ZXh0KE1lbWJlciBtZW1iZXIsIHRoaXMudHlwZUVudmlyb25tZW50KQogICAgICA6IF9saWJyYXJ5ID0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnksCiAgICAgICAgdGhpc1R5cGUgPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3M/LmdldFRoaXNUeXBlKAogICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLCBtZW1iZXIuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSk7CgogIC8vLyBDcmVhdGVzIGEgc3RhdGljIHR5cGUgY29udGV4dCBmb3IgY29tcHV0aW5nIHN0YXRpYyB0eXBlcyBvZiBhbm5vdGF0aW9ucwogIC8vLyBpbiBbbGlicmFyeV0uCiAgU3RhdGljVHlwZUNvbnRleHQuZm9yQW5ub3RhdGlvbnModGhpcy5fbGlicmFyeSwgdGhpcy50eXBlRW52aXJvbm1lbnQpCiAgICAgIDogdGhpc1R5cGUgPSBudWxsOwoKICAvLy8gVGhlIFtOdWxsYWJpbGl0eV0gdXNlZCBmb3Igbm9uLW51bGxhYmxlIHR5cGVzLgogIC8vLwogIC8vLyBGb3Igb3B0IG91dCBsaWJyYXJpZXMgdGhpcyBpcyBbTnVsbGFiaWxpdHkubGVnYWN5XS4KICBOdWxsYWJpbGl0eSBnZXQgbm9uTnVsbGFibGUgPT4gX2xpYnJhcnkubm9uTnVsbGFibGU7CgogIC8vLyBUaGUgW051bGxhYmlsaXR5XSB1c2VkIGZvciBudWxsYWJsZSB0eXBlcy4KICAvLy8KICAvLy8gRm9yIG9wdCBvdXQgbGlicmFyaWVzIHRoaXMgaXMgW051bGxhYmlsaXR5LmxlZ2FjeV0uCiAgTnVsbGFiaWxpdHkgZ2V0IG51bGxhYmxlID0+IF9saWJyYXJ5Lm51bGxhYmxlOwoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgY3VycmVudCBsaWJyYXJ5IGlzIG9wdGVkIGluIHRvIG5vbi1udWxsYWJsZSBieQogIC8vLyBkZWZhdWx0LgogIGJvb2wgZ2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPT4gX2xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtTdGF0aWNUeXBlQ29udGV4dF0gdGhhdCB1cGRhdGUgaXRzIHN0YXRlIHdoZW4gZW50ZXJpbmcKLy8vIGFuZCBsZWF2aW5nIGxpYnJhcmllcyBhbmQgbWVtYmVycy4KYWJzdHJhY3QgY2xhc3MgU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dCBpbXBsZW1lbnRzIFN0YXRpY1R5cGVDb250ZXh0IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50OwoKICAvLy8gQ3JlYXRlcyBhIFtTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0XSB0aGF0IHN1cHBvcnRzIGVudGVyaW5nIG11bHRpcGxlCiAgLy8vIGxpYnJhcmllcyBhbmQvb3IgbWVtYmVycyBzdWNjZXNzaXZlbHkuCiAgZmFjdG9yeSBTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0LnN0YWNrZWQoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgPQogICAgICBfU3RhY2tlZFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQ7CgogIC8vLyBDcmVhdGVzIGEgW1N0YXRlZnVsU3RhdGljVHlwZUNvbnRleHRdIHRoYXQgb25seSBzdXBwb3J0cyBlbnRlcmluZyBvbmUKICAvLy8gbGlicmFyeSBhbmQvb3IgbWVtYmVyIGF0IGEgdGltZS4KICBmYWN0b3J5IFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQuZmxhdChUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSA9CiAgICAgIF9GbGF0U3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dDsKCiAgU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dC5faW50ZXJuYWwodGhpcy50eXBlRW52aXJvbm1lbnQpOwoKICAvLy8gVXBkYXRlcyB0aGUgW25vbk51bGxhYmxlXSBhbmQgW3RoaXNUeXBlXSB0byBtYXRjaCBzdGF0aWMgdHlwZSBjb250ZXh0IGZvcgogIC8vLyB0aGUgbWVtYmVyIFtub2RlXS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRpbmcgc3RhdGljIHR5cGVzIG9uIHRoZSBib2R5IG9mIG1lbWJlcgogIC8vLyBbbm9kZV0uCiAgdm9pZCBlbnRlck1lbWJlcihNZW1iZXIgbm9kZSk7CgogIC8vLyBSZXZlcnRzIHRoZSBbbm9uTnVsbGFibGVdIGFuZCBbdGhpc1R5cGVdIHZhbHVlcyB0byB0aGUgcHJldmlvdXMgc3RhdGUuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjb21wdXRpbmcgc3RhdGljIHR5cGVzIG9uIHRoZSBib2R5IG9mIG1lbWJlcgogIC8vLyBbbm9kZV0uCiAgdm9pZCBsZWF2ZU1lbWJlcihNZW1iZXIgbm9kZSk7CgogIC8vLyBVcGRhdGVzIHRoZSBbbm9uTnVsbGFibGVdIGFuZCBbdGhpc1R5cGVdIHRvIG1hdGNoIHN0YXRpYyB0eXBlIGNvbnRleHQgZm9yCiAgLy8vIHRoZSBsaWJyYXJ5IFtub2RlXS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRpbmcgc3RhdGljIHR5cGVzIG9uIGFubm90YXRpb25zIGluIHRoZQogIC8vLyBsaWJyYXJ5IFtub2RlXS4KICB2b2lkIGVudGVyTGlicmFyeShMaWJyYXJ5IG5vZGUpOwoKICAvLy8gUmV2ZXJ0cyB0aGUgW25vbk51bGxhYmxlXSBhbmQgW3RoaXNUeXBlXSB2YWx1ZXMgdG8gdGhlIHByZXZpb3VzIHN0YXRlLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgY29tcHV0aW5nIHN0YXRpYyB0eXBlcyBvbiBhbm5vdGF0aW9ucyBpbiB0aGUKICAvLy8gbGlicmFyeSBbbm9kZV0uCiAgdm9pZCBsZWF2ZUxpYnJhcnkoTGlicmFyeSBub2RlKTsKfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0XSB0aGF0IG9ubHkgc3VwcG9ydHMgZW50ZXJpbmcKLy8vIG9uZSBsaWJyYXJ5IGFuZC9vciBhdCBhIHRpbWUuCmNsYXNzIF9GbGF0U3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dCBleHRlbmRzIFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQgewogIExpYnJhcnkgX2N1cnJlbnRMaWJyYXJ5OwogIE1lbWJlciBfY3VycmVudE1lbWJlcjsKCiAgX0ZsYXRTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0KFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKHR5cGVFbnZpcm9ubWVudCk7CgogIEBvdmVycmlkZQogIExpYnJhcnkgZ2V0IF9saWJyYXJ5IHsKICAgIExpYnJhcnkgbGlicmFyeSA9IF9jdXJyZW50TGlicmFyeSA/PyBfY3VycmVudE1lbWJlcj8uZW5jbG9zaW5nTGlicmFyeTsKICAgIGFzc2VydChsaWJyYXJ5ICE9IG51bGwsCiAgICAgICAgIk5vIGxpYnJhcnkgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBTdGF0aWNUeXBlQ29udGV4dC4iKTsKICAgIHJldHVybiBsaWJyYXJ5OwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgdGhpc1R5cGUgewogICAgYXNzZXJ0KF9jdXJyZW50TWVtYmVyICE9IG51bGwsCiAgICAgICAgIk5vIG1lbWJlciBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIFN0YXRpY1R5cGVDb250ZXh0LiIpOwogICAgcmV0dXJuIF9jdXJyZW50TWVtYmVyPy5lbmNsb3NpbmdDbGFzcz8uZ2V0VGhpc1R5cGUoCiAgICAgICAgdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcywgX2N1cnJlbnRNZW1iZXIuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbm9uTnVsbGFibGUgPT4gX2xpYnJhcnk/Lm5vbk51bGxhYmxlOwoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFibGUgPT4gX2xpYnJhcnk/Lm51bGxhYmxlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+IF9saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CgogIC8vLyBVcGRhdGVzIHRoZSBbbm9uTnVsbGFibGVdIGFuZCBbdGhpc1R5cGVdIHRvIG1hdGNoIHN0YXRpYyB0eXBlIGNvbnRleHQgZm9yCiAgLy8vIHRoZSBtZW1iZXIgW25vZGVdLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGluZyBzdGF0aWMgdHlwZXMgb24gdGhlIGJvZHkgb2YgbWVtYmVyCiAgLy8vIFtub2RlXS4KICAvLy8KICAvLy8gT25seSBvbmUgbWVtYmVyIGNhbiBiZSBlbnRlcmVkIGF0IGEgdGltZS4KICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyTWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRNZW1iZXIgPT0gbnVsbCwgIkFscmVhZHkgaW4gY29udGV4dCBvZiAkX2N1cnJlbnRNZW1iZXIiKTsKICAgIF9jdXJyZW50TWVtYmVyID0gbm9kZTsKICB9CgogIC8vLyBSZXZlcnRzIHRoZSBbbm9uTnVsbGFibGVdIGFuZCBbdGhpc1R5cGVdIHZhbHVlcyB0byB0aGUgcHJldmlvdXMgc3RhdGUuCiAgLy8vCiAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjb21wdXRpbmcgc3RhdGljIHR5cGVzIG9uIHRoZSBib2R5IG9mIG1lbWJlcgogIC8vLyBbbm9kZV0uCiAgQG92ZXJyaWRlCiAgdm9pZCBsZWF2ZU1lbWJlcihNZW1iZXIgbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgIF9jdXJyZW50TWVtYmVyID09IG5vZGUsCiAgICAgICAgIkluY29uc2lzdGVudCBzdGF0aWMgdHlwZSBjb250ZXh0IHN0YWNrOiAiCiAgICAgICAgIlRyeWluZyB0byBsZWF2ZSAkbm9kZSBidXQgY3VycmVudCBpcyAke19jdXJyZW50TWVtYmVyfS4iKTsKICAgIF9jdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIC8vLyBVcGRhdGVzIHRoZSBbbm9uTnVsbGFibGVdIGFuZCBbdGhpc1R5cGVdIHRvIG1hdGNoIHN0YXRpYyB0eXBlIGNvbnRleHQgZm9yCiAgLy8vIHRoZSBsaWJyYXJ5IFtub2RlXS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRpbmcgc3RhdGljIHR5cGVzIG9uIGFubm90YXRpb25zIGluIHRoZQogIC8vLyBsaWJyYXJ5IFtub2RlXS4KICAvLy8KICAvLy8gT25seSBvbmUgbGlicmFyeSBjYW4gYmUgZW50ZXJlZCBhdCBhIHRpbWUsIGFuZCBub3Qgd2hpbGUgYSBtZW1iZXIgaXMKICAvLy8gZW50ZXJlZCB0aHJvdWdoIFtlbnRlck1lbWJlcl0uCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckxpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRMaWJyYXJ5ID09IG51bGwsICJBbHJlYWR5IGluIGNvbnRleHQgb2YgJF9jdXJyZW50TGlicmFyeSIpOwogICAgYXNzZXJ0KF9jdXJyZW50TWVtYmVyID09IG51bGwsICJBbHJlYWR5IGluIGNvbnRleHQgb2YgJF9jdXJyZW50TWVtYmVyIik7CiAgICBfY3VycmVudExpYnJhcnkgPSBub2RlOwogIH0KCiAgLy8vIFJldmVydHMgdGhlIFtub25OdWxsYWJsZV0gYW5kIFt0aGlzVHlwZV0gdmFsdWVzIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNvbXB1dGluZyBzdGF0aWMgdHlwZXMgb24gYW5ub3RhdGlvbnMgaW4gdGhlCiAgLy8vIGxpYnJhcnkgW25vZGVdLgogIEBvdmVycmlkZQogIHZvaWQgbGVhdmVMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgYXNzZXJ0KAogICAgICAgIF9jdXJyZW50TGlicmFyeSA9PSBub2RlLAogICAgICAgICJJbmNvbnNpc3RlbnQgc3RhdGljIHR5cGUgY29udGV4dCBzdGFjazogIgogICAgICAgICJUcnlpbmcgdG8gbGVhdmUgJG5vZGUgYnV0IGN1cnJlbnQgaXMgJHtfY3VycmVudExpYnJhcnl9LiIpOwogICAgX2N1cnJlbnRMaWJyYXJ5ID0gbnVsbDsKICB9Cn0KCi8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dF0gdGhhdCB1c2UgYSBzdGFjayB0byBjaGFuZ2Ugc3RhdGUKLy8vIHdoZW4gZW50ZXJpbmcgYW5kIGxlYXZpbmcgbGlicmFyaWVzIGFuZCBtZW1iZXJzLgpjbGFzcyBfU3RhY2tlZFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQgZXh0ZW5kcyBTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0IHsKICBmaW5hbCBMaXN0PF9TdGF0aWNUeXBlQ29udGV4dFN0YXRlPiBfY29udGV4dFN0YWNrID0KICAgICAgPF9TdGF0aWNUeXBlQ29udGV4dFN0YXRlPltdOwoKICBfU3RhY2tlZFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkKICAgICAgOiBzdXBlci5faW50ZXJuYWwodHlwZUVudmlyb25tZW50KTsKCiAgQG92ZXJyaWRlCiAgTGlicmFyeSBnZXQgX2xpYnJhcnkgewogICAgYXNzZXJ0KF9jb250ZXh0U3RhY2suaXNOb3RFbXB0eSwKICAgICAgICAiTm8gbGlicmFyeSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIFN0YXRpY1R5cGVDb250ZXh0LiIpOwogICAgcmV0dXJuIF9jb250ZXh0U3RhY2subGFzdC5fbGlicmFyeTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IHRoaXNUeXBlIHsKICAgIGFzc2VydChfY29udGV4dFN0YWNrLmlzTm90RW1wdHksCiAgICAgICAgIk5vIHRoaXMgdHlwZSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIFN0YXRpY1R5cGVDb250ZXh0LiIpOwogICAgcmV0dXJuIF9jb250ZXh0U3RhY2subGFzdC5fdGhpc1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbm9uTnVsbGFibGUgPT4gX2xpYnJhcnk/Lm5vbk51bGxhYmxlOwoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFibGUgPT4gX2xpYnJhcnk/Lm51bGxhYmxlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+IF9saWJyYXJ5Py5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwoKICAvLy8gVXBkYXRlcyB0aGUgW2xpYnJhcnldIGFuZCBbdGhpc1R5cGVdIHRvIG1hdGNoIHN0YXRpYyB0eXBlIGNvbnRleHQgZm9yCiAgLy8vIHRoZSBtZW1iZXIgW25vZGVdLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGluZyBzdGF0aWMgdHlwZXMgb24gdGhlIGJvZHkgb2YgbWVtYmVyCiAgLy8vIFtub2RlXS4KICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyTWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBfY29udGV4dFN0YWNrLmFkZChuZXcgX1N0YXRpY1R5cGVDb250ZXh0U3RhdGUoCiAgICAgICAgbm9kZSwKICAgICAgICBub2RlLmVuY2xvc2luZ0xpYnJhcnksCiAgICAgICAgbm9kZS5lbmNsb3NpbmdDbGFzcz8uZ2V0VGhpc1R5cGUoCiAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMsIG5vZGUuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSkpKTsKICB9CgogIC8vLyBSZXZlcnRzIHRoZSBbbGlicmFyeV0gYW5kIFt0aGlzVHlwZV0gdmFsdWVzIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNvbXB1dGluZyBzdGF0aWMgdHlwZXMgb24gdGhlIGJvZHkgb2YgbWVtYmVyCiAgLy8vIFtub2RlXS4KICBAb3ZlcnJpZGUKICB2b2lkIGxlYXZlTWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBfU3RhdGljVHlwZUNvbnRleHRTdGF0ZSBzdGF0ZSA9IF9jb250ZXh0U3RhY2sucmVtb3ZlTGFzdCgpOwogICAgYXNzZXJ0KAogICAgICAgIHN0YXRlLl9ub2RlID09IG5vZGUsCiAgICAgICAgIkluY29uc2lzdGVudCBzdGF0aWMgdHlwZSBjb250ZXh0IHN0YWNrOiAiCiAgICAgICAgIlRyeWluZyB0byBsZWF2ZSAkbm9kZSBidXQgY3VycmVudCBpcyAke3N0YXRlLl9ub2RlfS4iKTsKICB9CgogIC8vLyBVcGRhdGVzIHRoZSBbbGlicmFyeV0gYW5kIFt0aGlzVHlwZV0gdG8gbWF0Y2ggc3RhdGljIHR5cGUgY29udGV4dCBmb3IKICAvLy8gdGhlIGxpYnJhcnkgW25vZGVdLgogIC8vLwogIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGluZyBzdGF0aWMgdHlwZXMgb24gYW5ub3RhdGlvbnMgaW4gdGhlCiAgLy8vIGxpYnJhcnkgW25vZGVdLgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgX2NvbnRleHRTdGFjay5hZGQobmV3IF9TdGF0aWNUeXBlQ29udGV4dFN0YXRlKG5vZGUsIG5vZGUsIG51bGwpKTsKICB9CgogIC8vLyBSZXZlcnRzIHRoZSBbbGlicmFyeV0gYW5kIFt0aGlzVHlwZV0gdmFsdWVzIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgYmUgY2Fs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b3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CgovLy8gUGFpcnMgb2YgW1R5cGVQYXJhbWV0ZXJdcyB0aGF0IGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBiZQovLy8gZXF1aXZhbGVudC4KLy8vCi8vLyBUaGlzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gb24gdHlwZXMgY29pbmR1Y3RpdmVseS4KY2xhc3MgQXNzdW1wdGlvbnMgewogIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPiBfYXNzdW1wdGlvbk1hcCA9CiAgICAgIG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4uaWRlbnRpdHkoKTsKCiAgdm9pZCBfYWRkQXNzdW1wdGlvbihUeXBlUGFyYW1ldGVyIGEsIFR5cGVQYXJhbWV0ZXIgYikgewogICAgYXNzZXJ0KCFfYXNzdW1wdGlvbk1hcC5jb250YWluc0tleShhKSk7CiAgICBfYXNzdW1wdGlvbk1hcFthXSA9IGI7CiAgfQoKICAvLy8gQXNzdW1lIHRoYXQgW2FdIGFuZCBbYl0gYXJlIGVxdWl2YWxlbnQuCiAgdm9pZCBhc3N1bWUoVHlwZVBhcmFtZXRlciBhLCBUeXBlUGFyYW1ldGVyIGIpIHsKICAgIF9hZGRBc3N1bXB0aW9uKGEsIGIpOwogIH0KCiAgdm9pZCBfcmVtb3ZlQXNzdW1wdGlvbihUeXBlUGFyYW1ldGVyIGEsIFR5cGVQYXJhbWV0ZXIgYikgewogICAgVHlwZVBhcmFtZXRlciBhc3N1bXB0aW9uID0gX2Fzc3VtcHRpb25NYXAucmVtb3ZlKGEpOwogICAgYXNzZXJ0KGlkZW50aWNhbChhc3N1bXB0aW9uLCBiKSk7CiAgfQoKICAvLy8gUmVtb3ZlIHRoZSBhc3N1bXB0aW9uIHRoYXQgW2FdIGFuZCBbYl0gYXJlIGVxdWl2YWxlbnQuCiAgdm9pZCBmb3JnZXQoVHlwZVBhcmFtZXRlciBhLCBUeXBlUGFyYW1ldGVyIGIpIHsKICAgIF9yZW1vdmVBc3N1bXB0aW9uKGEsIGIpOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFthXSBhbmQgW2JdIGFyZSBhc3N1bWVkIHRvIGJlIGVxdWl2YWxlbnQuCiAgYm9vbCBpc0Fzc3VtZWQoVHlwZVBhcmFtZXRlciBhLCBUeXBlUGFyYW1ldGVyIGIpIHsKICAgIHJldHVybiBpZGVudGljYWwoX2Fzc3VtcHRpb25NYXBbYV0sIGIpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0Fzc3VtcHRpb25zKCcpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICBfYXNzdW1wdGlvbk1hcC5mb3JFYWNoKChUeXBlUGFyYW1ldGVyIGEsIFR5cGVQYXJhbWV0ZXIgYikgewogICAgICBzYi53cml0ZSgnJGNvbW1hJGEgKCR7aWRlbnRpdHlIYXNoQ29kZShhKX0pLT4nCiAgICAgICAgICAnJGIgKCR7aWRlbnRpdHlIYXNoQ29kZShiKX0pJyk7CiAgICAgIGNvbW1hID0gJywnOwogICAgfSk7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CjcATk48ARYBPxAETRQ1OAE6LBsEAS4yGgQBPTkmBAE9Mh0EAUI1LAQBDBYqHhdANSoTCBMaBAIBI3BhY2thZ2U6a2VybmVsL3NyYy9hc3N1bXB0aW9ucy5kYXJ0SmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvYmluYXJ5L3RhZy5kYXJ0mQIvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IGtlcm5lbC5iaW5hcnkudGFnOwoKY2xhc3MgVGFnIHsKICBzdGF0aWMgY29uc3QgaW50IE5vdGhpbmcgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgU29tZXRoaW5nID0gMTsKCiAgc3RhdGljIGNvbnN0IGludCBDbGFzcyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBFeHRlbnNpb24gPSAxMTU7CgogIHN0YXRpYyBjb25zdCBpbnQgRnVuY3Rpb25Ob2RlID0gMzsKCiAgLy8gTWVtYmVycwogIHN0YXRpYyBjb25zdCBpbnQgRmllbGQgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgQ29uc3RydWN0b3IgPSA1OwogIHN0YXRpYyBjb25zdCBpbnQgUHJvY2VkdXJlID0gNjsKICBzdGF0aWMgY29uc3QgaW50IFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yID0gMTA4OwoKICAvLyBJbml0aWFsaXplcnMKICBzdGF0aWMgY29uc3QgaW50IEludmFsaWRJbml0aWFsaXplciA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBGaWVsZEluaXRpYWxpemVyID0gODsKICBzdGF0aWMgY29uc3QgaW50IFN1cGVySW5pdGlhbGl6ZXIgPSA5OwogIHN0YXRpYyBjb25zdCBpbnQgUmVkaXJlY3RpbmdJbml0aWFsaXplciA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgTG9jYWxJbml0aWFsaXplciA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgQXNzZXJ0SW5pdGlhbGl6ZXIgPSAxMjsKCiAgLy8gRXhwcmVzc2lvbnMKICBzdGF0aWMgY29uc3QgaW50IENoZWNrTGlicmFyeUlzTG9hZGVkID0gMTM7CiAgc3RhdGljIGNvbnN0IGludCBMb2FkTGlicmFyeSA9IDE0OwogIHN0YXRpYyBjb25zdCBpbnQgRGlyZWN0UHJvcGVydHlHZXQgPSAxNTsKICBzdGF0aWMgY29uc3QgaW50IERpcmVjdFByb3BlcnR5U2V0ID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBEaXJlY3RNZXRob2RJbnZvY2F0aW9uID0gMTc7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdFN0YXRpY0ludm9jYXRpb24gPSAxODsKICBzdGF0aWMgY29uc3QgaW50IEludmFsaWRFeHByZXNzaW9uID0gMTk7CiAgc3RhdGljIGNvbnN0IGludCBWYXJpYWJsZUdldCA9IDIwOwogIHN0YXRpYyBjb25zdCBpbnQgVmFyaWFibGVTZXQgPSAyMTsKICBzdGF0aWMgY29uc3QgaW50IFByb3BlcnR5R2V0ID0gMjI7CiAgc3RhdGljIGNvbnN0IGludCBQcm9wZXJ0eVNldCA9IDIzOwogIHN0YXRpYyBjb25zdCBpbnQgU3VwZXJQcm9wZXJ0eUdldCA9IDI0OwogIHN0YXRpYyBjb25zdCBpbnQgU3VwZXJQcm9wZXJ0eVNldCA9IDI1OwogIHN0YXRpYyBjb25zdCBpbnQgU3RhdGljR2V0ID0gMjY7CiAgc3RhdGljIGNvbnN0IGludCBTdGF0aWNTZXQgPSAyNzsKICBzdGF0aWMgY29uc3QgaW50IE1ldGhvZEludm9jYXRpb24gPSAyODsKICBzdGF0aWMgY29uc3QgaW50IFN1cGVyTWV0aG9kSW52b2NhdGlvbiA9IDI5OwogIHN0YXRpYyBjb25zdCBpbnQgU3RhdGljSW52b2NhdGlvbiA9IDMwOwogIHN0YXRpYyBjb25zdCBpbnQgQ29uc3RydWN0b3JJbnZvY2F0aW9uID0gMzE7CiAgc3RhdGljIGNvbnN0IGludCBDb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbiA9IDMyOwogIHN0YXRpYyBjb25zdCBpbnQgTm90ID0gMzM7CiAgc3RhdGljIGNvbnN0IGludCBOdWxsQ2hlY2sgPSAxMTc7CiAgc3RhdGljIGNvbnN0IGludCBMb2dpY2FsRXhwcmVzc2lvbiA9IDM0OwogIHN0YXRpYyBjb25zdCBpbnQgQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gMzU7CiAgc3RhdGljIGNvbnN0IGludCBTdHJpbmdDb25jYXRlbmF0aW9uID0gMzY7CiAgc3RhdGljIGNvbnN0IGludCBMaXN0Q29uY2F0ZW5hdGlvbiA9IDExMTsKICBzdGF0aWMgY29uc3QgaW50IFNldENvbmNhdGVuYXRpb24gPSAxMTI7CiAgc3RhdGljIGNvbnN0IGludCBNYXBDb25jYXRlbmF0aW9uID0gMTEzOwogIHN0YXRpYyBjb25zdCBpbnQgSW5zdGFuY2VDcmVhdGlvbiA9IDExNDsKICBzdGF0aWMgY29uc3QgaW50IElzRXhwcmVzc2lvbiA9IDM3OwogIHN0YXRpYyBjb25zdCBpbnQgQXNFeHByZXNzaW9uID0gMzg7CiAgc3RhdGljIGNvbnN0IGludCBTdHJpbmdMaXRlcmFsID0gMzk7CiAgc3RhdGljIGNvbnN0IGludCBEb3VibGVMaXRlcmFsID0gNDA7CiAgc3RhdGljIGNvbnN0IGludCBUcnVlTGl0ZXJhbCA9IDQxOwogIHN0YXRpYyBjb25zdCBpbnQgRmFsc2VMaXRlcmFsID0gNDI7CiAgc3RhdGljIGNvbnN0IGludCBOdWxsTGl0ZXJhbCA9IDQzOwogIHN0YXRpYyBjb25zdCBpbnQgU3ltYm9sTGl0ZXJhbCA9IDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgVHlwZUxpdGVyYWwgPSA0NTsKICBzdGF0aWMgY29uc3QgaW50IFRoaXNFeHByZXNzaW9uID0gNDY7CiAgc3RhdGljIGNvbnN0IGludCBSZXRocm93ID0gNDc7CiAgc3RhdGljIGNvbnN0IGludCBUaHJvdyA9IDQ4OwogIHN0YXRpYyBjb25zdCBpbnQgTGlzdExpdGVyYWwgPSA0OTsKICBzdGF0aWMgY29uc3QgaW50IE1hcExpdGVyYWwgPSA1MDsKICBzdGF0aWMgY29uc3QgaW50IEF3YWl0RXhwcmVzc2lvbiA9IDUxOwogIHN0YXRpYyBjb25zdCBpbnQgRnVuY3Rpb25FeHByZXNzaW9uID0gNTI7CiAgc3RhdGljIGNvbnN0IGludCBMZXQgPSA1MzsKICBzdGF0aWMgY29uc3QgaW50IEJsb2NrRXhwcmVzc2lvbiA9IDgyOwogIHN0YXRpYyBjb25zdCBpbnQgSW5zdGFudGlhdGlvbiA9IDU0OwogIHN0YXRpYyBjb25zdCBpbnQgUG9zaXRpdmVJbnRMaXRlcmFsID0gNTU7CiAgc3RhdGljIGNvbnN0IGludCBOZWdhdGl2ZUludExpdGVyYWwgPSA1NjsKICBzdGF0aWMgY29uc3QgaW50IEJpZ0ludExpdGVyYWwgPSA1NzsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0TGlzdExpdGVyYWwgPSA1ODsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0TWFwTGl0ZXJhbCA9IDU5OwogIHN0YXRpYyBjb25zdCBpbnQgU2V0TGl0ZXJhbCA9IDEwOTsKICBzdGF0aWMgY29uc3QgaW50IENvbnN0U2V0TGl0ZXJhbCA9IDExMDsKICBzdGF0aWMgY29uc3QgaW50IEZpbGVVcmlFeHByZXNzaW9uID0gMTE2OwoKICAvLyBTdGF0ZW1lbnRzCiAgc3RhdGljIGNvbnN0IGludCBFeHByZXNzaW9uU3RhdGVtZW50ID0gNjE7CiAgc3RhdGljIGNvbnN0IGludCBCbG9jayA9IDYyOwogIHN0YXRpYyBjb25zdCBpbnQgRW1wdHlTdGF0ZW1lbnQgPSA2MzsKICBzdGF0aWMgY29uc3QgaW50IEFzc2VydFN0YXRlbWVudCA9IDY0OwogIHN0YXRpYyBjb25zdCBpbnQgTGFiZWxlZFN0YXRlbWVudCA9IDY1OwogIHN0YXRpYyBjb25zdCBpbnQgQnJlYWtTdGF0ZW1lbnQgPSA2NjsKICBzdGF0aWMgY29uc3QgaW50IFdoaWxlU3RhdGVtZW50ID0gNjc7CiAgc3RhdGljIGNvbnN0IGludCBEb1N0YXRlbWVudCA9IDY4OwogIHN0YXRpYyBjb25zdCBpbnQgRm9yU3RhdGVtZW50ID0gNjk7CiAgc3RhdGljIGNvbnN0IGludCBGb3JJblN0YXRlbWVudCA9IDcwOwogIHN0YXRpYyBjb25zdCBpbnQgU3dpdGNoU3RhdGVtZW50ID0gNzE7CiAgc3RhdGljIGNvbnN0IGludCBDb250aW51ZVN3aXRjaFN0YXRlbWVudCA9IDcyOwogIHN0YXRpYyBjb25zdCBpbnQgSWZTdGF0ZW1lbnQgPSA3MzsKICBzdGF0aWMgY29uc3QgaW50IFJldHVyblN0YXRlbWVudCA9IDc0OwogIHN0YXRpYyBjb25zdCBpbnQgVHJ5Q2F0Y2ggPSA3NTsKICBzdGF0aWMgY29uc3QgaW50IFRyeUZpbmFsbHkgPSA3NjsKICBzdGF0aWMgY29uc3QgaW50IFlpZWxkU3RhdGVtZW50ID0gNzc7CiAgc3RhdGljIGNvbnN0IGludCBWYXJpYWJsZURlY2xhcmF0aW9uID0gNzg7CiAgc3RhdGljIGNvbnN0IGludCBGdW5jdGlvbkRlY2xhcmF0aW9uID0gNzk7CiAgc3RhdGljIGNvbnN0IGludCBBc3luY0ZvckluU3RhdGVtZW50ID0gODA7CiAgc3RhdGljIGNvbnN0IGludCBBc3NlcnRCbG9jayA9IDgxOwogIC8vIDgyIGlzIG9jY3VwaWVkIGJ5IFtCbG9ja0V4cHJlc3Npb25dIChleHByZXNzaW9uKS4KCiAgLy8gVHlwZXMKICBzdGF0aWMgY29uc3QgaW50IFR5cGVkZWZUeXBlID0gODc7CiAgc3RhdGljIGNvbnN0IGludCBCb3R0b21UeXBlID0gODk7CiAgc3RhdGljIGNvbnN0IGludCBJbnZhbGlkVHlwZSA9IDkwOwogIHN0YXRpYyBjb25zdCBpbnQgRHluYW1pY1R5cGUgPSA5MTsKICBzdGF0aWMgY29uc3QgaW50IFZvaWRUeXBlID0gOTI7CiAgc3RhdGljIGNvbnN0IGludCBJbnRlcmZhY2VUeXBlID0gOTM7CiAgc3RhdGljIGNvbnN0IGludCBGdW5jdGlvblR5cGUgPSA5NDsKICBzdGF0aWMgY29uc3QgaW50IFR5cGVQYXJhbWV0ZXJUeXBlID0gOTU7CiAgc3RhdGljIGNvbnN0IGludCBTaW1wbGVJbnRlcmZhY2VUeXBlID0gOTY7CiAgc3RhdGljIGNvbnN0IGludCBTaW1wbGVGdW5jdGlvblR5cGUgPSA5NzsKICBzdGF0aWMgY29uc3QgaW50IE5ldmVyVHlwZSA9IDk4OwoKICBzdGF0aWMgY29uc3QgaW50IENvbnN0YW50RXhwcmVzc2lvbiA9IDEwNjsKCiAgLy8vIDEwOCBpcyBvY2N1cGllZCBieSBbUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JdIChtZW1iZXIpLgogIC8vLyAxMDkgaXMgb2NjdXBpZWQgYnkgW1NldExpdGVyYWxdIChleHByZXNzaW9uKS4KICAvLy8gMTEwIGlzIG9jY3VwaWVkIGJ5IFtDb25zdFNldExpdGVyYWxdIChleHByZXNzaW9uKS4KICAvLy8gMTExIGlzIG9jY3VwaWVkIGJ5IFtMaXN0Q29uY2F0ZW5hdGlvbl0gKGV4cHJlc3Npb24pLgogIC8vLyAxMTIgaXMgb2NjdXBpZWQgYnkgW1NldENvbmNhdGVuYXRpb25dIChleHByZXNzaW9uKS4KICAvLy8gMTEzIGlzIG9jY3VwaWVkIGJ5IFtNYXBDb25jYXRlbmF0aW9uXSAoZXhwcmVzc2lvbikuCiAgLy8vIDExNCBpcyBvY2N1cGllZCBieSBbSW5zdGFuY2VDcmVhdGlvbl0gKGV4cHJlc3Npb24pLgogIC8vLyAxMTUgaXMgb2NjdXBpZWQgYnkgW0V4dGVuc2lvbl0uCiAgLy8vIDExNiBpcyBvY2N1cGllZCBieSBbRmlsZVVyaUV4cHJlc3Npb25dIChleHByZXNzaW9uKS4KICAvLy8gMTE3IGlzIG9jY3VwaWVkIGJ5IFtOdWxsQ2hlY2tdIChleHByZXNzaW9uKS4KCiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZFRhZ0hpZ2hCaXQgPSAweDgwOyAvLyAxMDAwMDAwMAogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRUYWdNYXNrID0gMHhGODsgLy8gMTExMTEwMDAKICBzdGF0aWMgY29uc3QgaW50IFNwZWNpYWxpemVkUGF5bG9hZE1hc2sgPSAweDc7IC8vIDAwMDAwMTExCgogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRWYXJpYWJsZUdldCA9IDEyODsKICBzdGF0aWMgY29uc3QgaW50IFNwZWNpYWxpemVkVmFyaWFibGVTZXQgPSAxMzY7CiAgc3RhdGljIGNvbnN0IGludCBTcGVjaWFsaXplZEludExpdGVyYWwgPSAxNDQ7CgogIHN0YXRpYyBjb25zdCBpbnQgU3BlY2lhbGl6ZWRJbnRMaXRlcmFsQmlhcyA9IDM7CgogIHN0YXRpYyBjb25zdCBpbnQgQ29tcG9uZW50RmlsZSA9IDB4OTBBQkNERUY7CgogIC8vLyBJbnRlcm5hbCB2ZXJzaW9uIG9mIGtlcm5lbCBiaW5hcnkgZm9ybWF0LgogIC8vLyBCdW1wIGl0IHdoZW4gbWFraW5nIGluY29tcGF0aWJsZSBjaGFuZ2VzIGluIGtlcm5lbCBiaW5hcmllcy4KICAvLy8gS2VlcCBpbiBzeW5jIHdpdGggcnVudGltZS92bS9rZXJuZWxfYmluYXJ5LmgsIHBrZy9rZXJuZWwvYmluYXJ5Lm1kLgogIHN0YXRpYyBjb25zdCBpbnQgQmluYXJ5Rm9ybWF0VmVyc2lvbiA9IDM5Owp9CgphYnN0cmFjdCBjbGFzcyBDb25zdGFudFRhZyB7CiAgc3RhdGljIGNvbnN0IGludCBOdWxsQ29uc3RhbnQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgQm9vbENvbnN0YW50ID0gMTsKICBzdGF0aWMgY29uc3QgaW50IEludENvbnN0YW50ID0gMjsKICBzdGF0aWMgY29uc3QgaW50IERvdWJsZUNvbnN0YW50ID0gMzsKICBzdGF0aWMgY29uc3QgaW50IFN0cmluZ0NvbnN0YW50ID0gNDsKICBzdGF0aWMgY29uc3QgaW50IFN5bWJvbENvbnN0YW50ID0gNTsKICBzdGF0aWMgY29uc3QgaW50IE1hcENvbnN0YW50ID0gNjsKICBzdGF0aWMgY29uc3QgaW50IExpc3RDb25zdGFudCA9IDc7CiAgc3RhdGljIGNvbnN0IGludCBTZXRDb25zdGFudCA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgSW5zdGFuY2VDb25zdGFudCA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50ID0gOTsKICBzdGF0aWMgY29uc3QgaW50IFRlYXJPZmZDb25zdGFudCA9IDEwOwogIHN0YXRpYyBjb25zdCBpbnQgVHlwZUxpdGVyYWxDb25zdGFudCA9IDExOwogIHN0YXRpYyBjb25zdCBpbnQgVW5ldmFsdWF0ZWRDb25zdGFudCA9IDEyOwogIC8vIDEzIGlzIG9jY3VwaWVkIGJ5IFtTZXRDb25zdGFudF0KfQqArQBOTjwbAQwgIgEeJAElAQ0eJCI4ARIrKSkwKisBES4lKyswLyslJSUlKiojIyovKi80HSQrLy0sKysrJiYnJyUmJSclKCEfJSQpLB0pJywsJyopJSosARAtHygpKigoJSYoKTElKSIkKC0tLSU3AQslJCUlIicmKy0sIwEtAUM0OTs6OjomOzMBPTo9ATExMAEyAS8BMENKLQIBHSUlJCcnJyQlJSk1KS0tJQIBHnBhY2thZ2U6a2VybmVsL2JpbmFyeS90YWcuZGFydE1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL2xpYnJhcnlfaW5kZXguZGFydJ+WLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwubGlicmFyeV9pbmRleDsKCmltcG9ydCAnYXN0LmRhcnQnOwoKLy8vIFByb3ZpZGVzIG5hbWUtYmFzZWQgYWNjZXNzIHRvIGxpYnJhcnksIGNsYXNzLCBhbmQgbWVtYmVyIEFTVCBub2Rlcy4KLy8vCi8vLyBXaGVuIGNvbnN0cnVjdGVkLCBhIGdpdmVuIHNldCBvZiBsaWJyYXJpZXMgYXJlIGluZGV4ZWQgaW1tZWRpYXRlbHksIGFuZAovLy8gd2lsbCBub3QgYmUgdXAtdG8tZGF0ZSB3aXRoIGNoYW5nZXMgbWFkZSBhZnRlciBpdCB3YXMgY3JlYXRlZC4KY2xhc3MgTGlicmFyeUluZGV4IHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIGdldHRlclByZWZpeCA9ICdnZXQ6JzsKICBzdGF0aWMgY29uc3QgU3RyaW5nIHNldHRlclByZWZpeCA9ICdzZXQ6JzsKCiAgLy8vIEEgc3BlY2lhbCBjbGFzcyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSB0b3AtbGV2ZWwgbWVtYmVycwogIC8vLyBvZiBhIGxpYnJhcnkuCiAgc3RhdGljIGNvbnN0IFN0cmluZyB0b3BMZXZlbCA9ICc6Oic7CgogIGZpbmFsIE1hcDxTdHJpbmcsIF9DbGFzc1RhYmxlPiBfbGlicmFyaWVzID0gPFN0cmluZywgX0NsYXNzVGFibGU+e307CgogIC8vLyBJbmRleGVzIHRoZSBsaWJyYXJpZXMgd2l0aCB0aGUgVVJJcyBnaXZlbiBpbiBbbGlicmFyeVVyaXNdLgogIExpYnJhcnlJbmRleChDb21wb25lbnQgY29tcG9uZW50LCBJdGVyYWJsZTxTdHJpbmc+IGxpYnJhcnlVcmlzKSB7CiAgICB2YXIgbGlicmFyeVVyaVNldCA9IGxpYnJhcnlVcmlzLnRvU2V0KCk7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgdmFyIHVyaSA9ICcke2xpYnJhcnkuaW1wb3J0VXJpfSc7CiAgICAgIGlmIChsaWJyYXJ5VXJpU2V0LmNvbnRhaW5zKHVyaSkpIHsKICAgICAgICBfbGlicmFyaWVzW3VyaV0gPSBuZXcgX0NsYXNzVGFibGUobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbmRleGVzIHRoZSBsaWJyYXJpZXMgd2l0aCB0aGUgVVJJcyBnaXZlbiBpbiBbbGlicmFyeVVyaXNdLgogIExpYnJhcnlJbmRleC5ieVVyaShDb21wb25lbnQgY29tcG9uZW50LCBJdGVyYWJsZTxVcmk+IGxpYnJhcnlVcmlzKQogICAgICA6IHRoaXMoY29tcG9uZW50LCBsaWJyYXJ5VXJpcy5tYXAoKHVyaSkgPT4gJyR1cmknKSk7CgogIC8vLyBJbmRleGVzIGBkYXJ0OmAgbGlicmFyaWVzLgogIExpYnJhcnlJbmRleC5jb3JlTGlicmFyaWVzKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGZvciAodmFyIGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JykgewogICAgICAgIF9saWJyYXJpZXNbJyR7bGlicmFyeS5pbXBvcnRVcml9J10gPSBuZXcgX0NsYXNzVGFibGUobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBJbmRleGVzIHRoZSBlbnRpcmUgY29tcG9uZW50LgogIC8vLwogIC8vLyBDb25zaWRlciB1c2luZyBhbm90aGVyIGNvbnN0cnVjdG9yIHRvIG9ubHkgaW5kZXggdGhlIGxpYnJhcmllcyB0aGF0CiAgLy8vIGFyZSBuZWVkZWQuCiAgTGlicmFyeUluZGV4LmFsbChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgX2xpYnJhcmllc1snJHtsaWJyYXJ5LmltcG9ydFVyaX0nXSA9IG5ldyBfQ2xhc3NUYWJsZShsaWJyYXJ5KTsKICAgIH0KICB9CgogIF9DbGFzc1RhYmxlIF9nZXRMaWJyYXJ5SW5kZXgoU3RyaW5nIHVyaSkgewogICAgX0NsYXNzVGFibGUgbGlicmFyeUluZGV4ID0gX2xpYnJhcmllc1t1cmldOwogICAgaWYgKGxpYnJhcnlJbmRleCA9PSBudWxsKSB7CiAgICAgIHRocm93ICJUaGUgbGlicmFyeSAnJHVyaScgaGFzIG5vdCBiZWVuIGluZGV4ZWQiOwogICAgfQogICAgcmV0dXJuIGxpYnJhcnlJbmRleDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIFVSSS4KICAvLy8KICAvLy8gVGhyb3dzIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGV4aXN0LgogIExpYnJhcnkgZ2V0TGlicmFyeShTdHJpbmcgdXJpKSA9PiBfZ2V0TGlicmFyeUluZGV4KHVyaSkubGlicmFyeTsKCiAgLy8vIExpa2UgW2dldExpYnJhcnldIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBub3QgZm91bmQuCiAgTGlicmFyeSB0cnlHZXRMaWJyYXJ5KFN0cmluZyB1cmkpID0+IF9saWJyYXJpZXNbdXJpXT8ubGlicmFyeTsKCiAgLy8vIFRydWUgaWYgdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gVVJJIGV4aXN0cyBhbmQgd2FzIGluZGV4ZWQuCiAgYm9vbCBjb250YWluc0xpYnJhcnkoU3RyaW5nIHVyaSkgPT4gX2xpYnJhcmllcy5jb250YWluc0tleSh1cmkpOwoKICAvLy8gUmV0dXJucyB0aGUgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gbGlicmFyeS4KICAvLy8KICAvLy8gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQuCiAgQ2xhc3MgZ2V0Q2xhc3MoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUpIHsKICAgIHJldHVybiBfZ2V0TGlicmFyeUluZGV4KGxpYnJhcnkpLmdldENsYXNzKGNsYXNzTmFtZSk7CiAgfQoKICAvLy8gTGlrZSBbZ2V0Q2xhc3NdIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBub3QgZm91bmQuCiAgQ2xhc3MgdHJ5R2V0Q2xhc3MoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUpIHsKICAgIHJldHVybiBfbGlicmFyaWVzW2xpYnJhcnldPy50cnlHZXRDbGFzcyhjbGFzc05hbWUpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG1lbWJlciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBpbiB0aGUgZ2l2ZW4gY2xhc3MsIGluIHRoZQogIC8vLyBnaXZlbiBsaWJyYXJ5LgogIC8vLwogIC8vLyBJZiBhIGdldHRlciBvciBzZXR0ZXIgaXMgd2FudGVkLCB0aGUgYGdldDpgIG9yIGBzZXQ6YCBwcmVmaXggbXVzdCBiZQogIC8vLyBhZGRlZCBpbiBmcm9udCBvZiB0aGUgbWVtYmVyIG5hbWUuCiAgLy8vCiAgLy8vIFRoZSBzcGVjaWFsIGNsYXNzIG5hbWUgYDo6YCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdG9wLWxldmVsIG1lbWJlcnMuCiAgLy8vCiAgLy8vIElmIHRoZSBtZW1iZXIgbmFtZSBpcyBwcml2YXRlIGl0IGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byBbbGlicmFyeV0uCiAgLy8vIEl0IGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoaXMgY2xhc3MgdG8gbG9va3VwIG1lbWJlcnMgd2hvc2UgbmFtZSBpcyBwcml2YXRlCiAgLy8vIHRvIGEgbGlicmFyeSBvdGhlciB0aGFuIHRoZSBvbmUgY29udGFpbmluZyBpdC4KICAvLy8KICAvLy8gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kLgogIE1lbWJlciBnZXRNZW1iZXIoU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gX2dldExpYnJhcnlJbmRleChsaWJyYXJ5KS5nZXRNZW1iZXIoY2xhc3NOYW1lLCBtZW1iZXJOYW1lKTsKICB9CgogIC8vLyBMaWtlIFtnZXRNZW1iZXJdIGJ1dCByZXR1cm5zIGBudWxsYCBpZiBub3QgZm91bmQuCiAgTWVtYmVyIHRyeUdldE1lbWJlcihTdHJpbmcgbGlicmFyeSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiBfbGlicmFyaWVzW2xpYnJhcnldPy50cnlHZXRNZW1iZXIoY2xhc3NOYW1lLCBtZW1iZXJOYW1lKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgbWVtYmVyIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIHRoZSBnaXZlbiBsaWJyYXJ5LgogIC8vLwogIC8vLyBJZiBhIGdldHRlciBvciBzZXR0ZXIgaXMgd2FudGVkLCB0aGUgYGdldDpgIG9yIGBzZXQ6YCBwcmVmaXggbXVzdCBiZQogIC8vLyBhZGRlZCBpbiBmcm9udCBvZiB0aGUgbWVtYmVyIG5hbWUuCiAgLy8vCiAgLy8vIElmIHRoZSBtZW1iZXIgbmFtZSBpcyBwcml2YXRlIGl0IGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byBbbGlicmFyeV0uCiAgLy8vIEl0IGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoaXMgY2xhc3MgdG8gbG9va3VwIG1lbWJlcnMgd2hvc2UgbmFtZSBpcyBwcml2YXRlCiAgLy8vIHRvIGEgbGlicmFyeSBvdGhlciB0aGFuIHRoZSBvbmUgY29udGFpbmluZyBpdC4KICAvLy8KICAvLy8gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kLgogIE1lbWJlciBnZXRUb3BMZXZlbE1lbWJlcihTdHJpbmcgbGlicmFyeSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKICAgIHJldHVybiBnZXRNZW1iZXIobGlicmFyeSwgdG9wTGV2ZWwsIG1lbWJlck5hbWUpOwogIH0KCiAgLy8vIExpa2UgW2dldFRvcExldmVsTWVtYmVyXSBidXQgcmV0dXJucyBgbnVsbGAgaWYgbm90IGZvdW5kLgogIE1lbWJlciB0cnlHZXRUb3BMZXZlbE1lbWJlcigKICAgICAgU3RyaW5nIGxpYnJhcnksIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gdHJ5R2V0TWVtYmVyKGxpYnJhcnksIHRvcExldmVsLCBtZW1iZXJOYW1lKTsKICB9Cn0KCmNsYXNzIF9DbGFzc1RhYmxlIHsKICBmaW5hbCBMaWJyYXJ5IGxpYnJhcnk7CgogIE1hcDxTdHJpbmcsIF9NZW1iZXJUYWJsZT4gX2NsYXNzZXM7CgogIF9DbGFzc1RhYmxlKHRoaXMubGlicmFyeSk7CgogIE1hcDxTdHJpbmcsIF9NZW1iZXJUYWJsZT4gZ2V0IGNsYXNzZXMgewogICAgaWYgKF9jbGFzc2VzID09IG51bGwpIHsKICAgICAgX2NsYXNzZXMgPSA8U3RyaW5nLCBfTWVtYmVyVGFibGU+e307CiAgICAgIF9jbGFzc2VzW0xpYnJhcnlJbmRleC50b3BMZXZlbF0gPSBuZXcgX01lbWJlclRhYmxlLnRvcExldmVsKHRoaXMpOwogICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgX2NsYXNzZXNbY2xhc3NfLm5hbWVdID0gbmV3IF9NZW1iZXJUYWJsZSh0aGlzLCBjbGFzc18pOwogICAgICB9CiAgICAgIGZvciAoUmVmZXJlbmNlIHJlZmVyZW5jZSBpbiBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICAgICAgTmFtZWROb2RlIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgICAgICBpZiAobm9kZSBpcyBDbGFzcykgewogICAgICAgICAgX2NsYXNzZXNbbm9kZS5uYW1lXSA9IG5ldyBfTWVtYmVyVGFibGUodGhpcywgbm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX2NsYXNzZXM7CiAgfQoKICBTdHJpbmcgZ2V0IGNvbnRhaW5lck5hbWUgewogICAgcmV0dXJuICJsaWJyYXJ5ICcke2xpYnJhcnkuaW1wb3J0VXJpfSciOwogIH0KCiAgX01lbWJlclRhYmxlIF9nZXRDbGFzc0luZGV4KFN0cmluZyBuYW1lKSB7CiAgICB2YXIgaW5kZXhlciA9IGNsYXNzZXNbbmFtZV07CiAgICBpZiAoaW5kZXhlciA9PSBudWxsKSB7CiAgICAgIHRocm93ICJDbGFzcyAnJG5hbWUnIG5vdCBmb3VuZCBpbiAkY29udGFpbmVyTmFtZSI7CiAgICB9CiAgICByZXR1cm4gaW5kZXhlcjsKICB9CgogIENsYXNzIGdldENsYXNzKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gX2dldENsYXNzSW5kZXgobmFtZSkuY2xhc3NfOwogIH0KCiAgQ2xhc3MgdHJ5R2V0Q2xhc3MoU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBjbGFzc2VzW25hbWVdPy5jbGFzc187CiAgfQoKICBNZW1iZXIgZ2V0TWVtYmVyKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gX2dldENsYXNzSW5kZXgoY2xhc3NOYW1lKS5nZXRNZW1iZXIobWVtYmVyTmFtZSk7CiAgfQoKICBNZW1iZXIgdHJ5R2V0TWVtYmVyKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7CiAgICByZXR1cm4gY2xhc3Nlc1tjbGFzc05hbWVdPy50cnlHZXRNZW1iZXIobWVtYmVyTmFtZSk7CiAgfQp9CgpjbGFzcyBfTWVtYmVyVGFibGUgewogIGZpbmFsIF9DbGFzc1RhYmxlIHBhcmVudDsKICBmaW5hbCBDbGFzcyBjbGFzc187IC8vIE51bGwgZm9yIHRvcC1sZXZlbC4KICBNYXA8U3RyaW5nLCBNZW1iZXI+IF9tZW1iZXJzOwoKICBMaWJyYXJ5IGdldCBsaWJyYXJ5ID0+IHBhcmVudC5saWJyYXJ5OwoKICBfTWVtYmVyVGFibGUodGhpcy5wYXJlbnQsIHRoaXMuY2xhc3NfKTsKCiAgX01lbWJlclRhYmxlLnRvcExldmVsKHRoaXMucGFyZW50KSA6IGNsYXNzXyA9IG51bGw7CgogIE1hcDxTdHJpbmcsIE1lbWJlcj4gZ2V0IG1lbWJlcnMgewogICAgaWYgKF9tZW1iZXJzID09IG51bGwpIHsKICAgICAgX21lbWJlcnMgPSA8U3RyaW5nLCBNZW1iZXI+e307CiAgICAgIGlmIChjbGFzc18gIT0gbnVsbCkgewogICAgICAgIGNsYXNzXy5wcm9jZWR1cmVzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgICBjbGFzc18uZmllbGRzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgICBjbGFzc18uY29uc3RydWN0b3JzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsaWJyYXJ5LnByb2NlZHVyZXMuZm9yRWFjaChhZGRNZW1iZXIpOwogICAgICAgIGxpYnJhcnkuZmllbGRzLmZvckVhY2goYWRkTWVtYmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9tZW1iZXJzOwogIH0KCiAgU3RyaW5nIGdldERpc2FtYmlndWF0ZWROYW1lKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIGlmIChtZW1iZXIuaXNHZXR0ZXIpIHJldHVybiBMaWJyYXJ5SW5kZXguZ2V0dGVyUHJlZml4ICsgbWVtYmVyLm5hbWUubmFtZTsKICAgICAgaWYgKG1lbWJlci5pc1NldHRlcikgcmV0dXJuIExpYnJhcnlJbmRleC5zZXR0ZXJQcmVmaXggKyBtZW1iZXIubmFtZS5uYW1lOwogICAgfQogICAgcmV0dXJuIG1lbWJlci5uYW1lLm5hbWU7CiAgfQoKICB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLm5hbWUuaXNQcml2YXRlICYmIG1lbWJlci5uYW1lLmxpYnJhcnkgIT0gbGlicmFyeSkgewogICAgICAvLyBNZW1iZXJzIHdob3NlIG5hbWUgaXMgcHJpdmF0ZSB0byBvdGhlciBsaWJyYXJpZXMgY2Fubm90IGN1cnJlbnRseQogICAgICAvLyBiZSBmb3VuZCB3aXRoIHRoZSBMaWJyYXJ5SW5kZXggY2xhc3MuCiAgICAgIHJldHVybjsKICAgIH0KICAgIF9tZW1iZXJzW2dldERpc2FtYmlndWF0ZWROYW1lKG1lbWJlcildID0gbWVtYmVyOwogIH0KCiAgU3RyaW5nIGdldCBjb250YWluZXJOYW1lIHsKICAgIGlmIChjbGFzc18gPT0gbnVsbCkgewogICAgICByZXR1cm4gInRvcC1sZXZlbCBvZiAke3BhcmVudC5jb250YWluZXJOYW1lfSI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gImNsYXNzICcke2NsYXNzXy5uYW1lfScgaW4gJHtwYXJlbnQuY29udGFpbmVyTmFtZX0iOwogICAgfQogIH0KCiAgTWVtYmVyIGdldE1lbWJlcihTdHJpbmcgbmFtZSkgewogICAgdmFyIG1lbWJlciA9IG1lbWJlcnNbbmFtZV07CiAgICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQSBtZW1iZXIgd2l0aCBkaXNhbWJpZ3VhdGVkIG5hbWUgJyRuYW1lJyB3YXMgbm90IGZvdW5kICIKICAgICAgICAgICJpbiAkY29udGFpbmVyTmFtZSI7CiAgICAgIHZhciBnZXR0ZXIgPSBMaWJyYXJ5SW5kZXguZ2V0dGVyUHJlZml4ICsgbmFtZTsKICAgICAgdmFyIHNldHRlciA9IExpYnJhcnlJbmRleC5zZXR0ZXJQcmVmaXggKyBuYW1lOwogICAgICBpZiAobWVtYmVyc1tnZXR0ZXJdICE9IG51bGwgfHwgbWVtYmVyc1tzZXR0ZXJdICE9IG51bGwpIHsKICAgICAgICB0aHJvdyAiJG1lc3NhZ2UuIERpZCB5b3UgbWVhbiAnJGdldHRlcicgb3IgJyRzZXR0ZXInPyI7CiAgICAgIH0KICAgICAgdGhyb3cgbWVzc2FnZTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBNZW1iZXIgdHJ5R2V0TWVtYmVyKFN0cmluZyBuYW1lKSA9PiBtZW1iZXJzW25hbWVdOwp9CoD8AE5OPB4BEwFIBExDFS0tAUwUJwFHAUJELS8oKTQIBgQBQkU7ASE0LzBHCAYEASQGShIqL0UGBAEtMCA3BhkEAS4GLEMBOUEBRUMBQgY0NToEATc4OAQBSRUGSykGSwZLUTUGNUpHBAE4TUUEAU4GSykGS1E1BjVANQQBQB89OAQCARQZASYBHQEqHCtJLEAIPykdPgoIBhUEAR0tBAEtIRs5BhQEASAoBAEjIgQBOjwEAT05BAIBFRwtIAEpASoBNgEkHCUcLiowDy8rCAYVBAEvH1BQBh0EASJDSy8OBjUEAR0aNQ1CBgQBIiAaUR81NUBACBUGEwQBNQIBIXBhY2thZ2U6a2VybmVsL2xpYnJhcnlfaW5kZXguZGFydFRmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3JlZmVyZW5jZV9mcm9tX2luZGV4LmRhcnSP+C8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImFzdC5kYXJ0IgogICAgc2hvdyBDbGFzcywgQ29uc3RydWN0b3IsIEV4dGVuc2lvbiwgRmllbGQsIExpYnJhcnksIFByb2NlZHVyZSwgVHlwZWRlZjsKCmNsYXNzIFJlZmVyZW5jZUZyb21JbmRleCB7CiAgTWFwPExpYnJhcnksIEluZGV4ZWRMaWJyYXJ5PiBfaW5kZXhlZExpYnJhcmllcyA9CiAgICAgIG5ldyBNYXA8TGlicmFyeSwgSW5kZXhlZExpYnJhcnk+LmlkZW50aXR5KCk7CgogIC8vLyBBZGQgYW4gZW50cnkgbWFwcGluZyBmcm9tICpuZXcqIFtsaWJyYXJ5XSB0byBhbiBpbmRleCBvZiB0aGUgb2xkIGxpYnJhcnkuCiAgdm9pZCBhZGRJbmRleGVkTGlicmFyeShMaWJyYXJ5IGxpYnJhcnksIEluZGV4ZWRMaWJyYXJ5IGluZGV4ZWRMaWJyYXJ5KSB7CiAgICBhc3NlcnQoIV9pbmRleGVkTGlicmFyaWVzLmNvbnRhaW5zS2V5KGxpYnJhcnkpKTsKICAgIF9pbmRleGVkTGlicmFyaWVzW2xpYnJhcnldID0gaW5kZXhlZExpYnJhcnk7CiAgfQoKICAvLy8gTG9va3VwIHRoZSBuZXcgbGlicmFyeSBhbmQgZ2V0IGFuIGluZGV4IG9mIHRoZSBvbGQgbGlicmFyeS4KICBJbmRleGVkTGlicmFyeSBsb29rdXBMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgPT4gX2luZGV4ZWRMaWJyYXJpZXNbbGlicmFyeV07Cn0KCmNsYXNzIEluZGV4ZWRMaWJyYXJ5IHsKICBmaW5hbCBNYXA8U3RyaW5nLCBUeXBlZGVmPiBfdHlwZWRlZnMgPSBuZXcgTWFwPFN0cmluZywgVHlwZWRlZj4oKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gX2NsYXNzZXMgPSBuZXcgTWFwPFN0cmluZywgQ2xhc3M+KCk7CiAgZmluYWwgTWFwPFN0cmluZywgSW5kZXhlZENsYXNzPiBfaW5kZXhlZENsYXNzZXMgPQogICAgICBuZXcgTWFwPFN0cmluZywgSW5kZXhlZENsYXNzPigpOwogIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVuc2lvbj4gX2V4dGVuc2lvbnMgPSBuZXcgTWFwPFN0cmluZywgRXh0ZW5zaW9uPigpOwogIGZpbmFsIE1hcDxTdHJpbmcsIFByb2NlZHVyZT4gX3Byb2NlZHVyZXNOb3RTZXR0ZXJzID0KICAgICAgbmV3IE1hcDxTdHJpbmcsIFByb2NlZHVyZT4oKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBQcm9jZWR1cmU+IF9wcm9jZWR1cmVzU2V0dGVycyA9CiAgICAgIG5ldyBNYXA8U3RyaW5nLCBQcm9jZWR1cmU+KCk7CiAgZmluYWwgTWFwPFN0cmluZywgRmllbGQ+IF9maWVsZHMgPSBuZXcgTWFwPFN0cmluZywgRmllbGQ+KCk7CgogIEluZGV4ZWRMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJ5LnR5cGVkZWZzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IGxpYnJhcnkudHlwZWRlZnNbaV07CiAgICAgIF90eXBlZGVmc1t0eXBlZGVmLm5hbWVdID0gdHlwZWRlZjsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeS5jbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzIGMgPSBsaWJyYXJ5LmNsYXNzZXNbaV07CiAgICAgIF9jbGFzc2VzW2MubmFtZV0gPSBjOwogICAgICBfaW5kZXhlZENsYXNzZXNbYy5uYW1lXSA9IG5ldyBJbmRleGVkQ2xhc3MuXyhjKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeS5leHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSBsaWJyYXJ5LmV4dGVuc2lvbnNbaV07CiAgICAgIF9leHRlbnNpb25zW2V4dGVuc2lvbi5uYW1lXSA9IGV4dGVuc2lvbjsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeS5wcm9jZWR1cmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFByb2NlZHVyZSBwcm9jZWR1cmUgPSBsaWJyYXJ5LnByb2NlZHVyZXNbaV07CiAgICAgIGlmIChwcm9jZWR1cmUuaXNTZXR0ZXIpIHsKICAgICAgICBfcHJvY2VkdXJlc1NldHRlcnNbcHJvY2VkdXJlLm5hbWUubmFtZV0gPSBwcm9jZWR1cmU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3Byb2NlZHVyZXNOb3RTZXR0ZXJzW3Byb2NlZHVyZS5uYW1lLm5hbWVdID0gcHJvY2VkdXJlOwogICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpYnJhcnkuZmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIEZpZWxkIGZpZWxkID0gbGlicmFyeS5maWVsZHNbaV07CiAgICAgIF9maWVsZHNbZmllbGQubmFtZS5uYW1lXSA9IGZpZWxkOwogICAgfQogIH0KCiAgVHlwZWRlZiBsb29rdXBUeXBlZGVmKFN0cmluZyBuYW1lKSA9PiBfdHlwZWRlZnNbbmFtZV07CiAgQ2xhc3MgbG9va3VwQ2xhc3MoU3RyaW5nIG5hbWUpID0+IF9jbGFzc2VzW25hbWVdOwogIEluZGV4ZWRDbGFzcyBsb29rdXBJbmRleGVkQ2xhc3MoU3RyaW5nIG5hbWUpID0+IF9pbmRleGVkQ2xhc3Nlc1tuYW1lXTsKICBFeHRlbnNpb24gbG9va3VwRXh0ZW5zaW9uKFN0cmluZyBuYW1lKSA9PiBfZXh0ZW5zaW9uc1tuYW1lXTsKICBQcm9jZWR1cmUgbG9va3VwUHJvY2VkdXJlTm90U2V0dGVyKFN0cmluZyBuYW1lKSA9PgogICAgICBfcHJvY2VkdXJlc05vdFNldHRlcnNbbmFtZV07CiAgUHJvY2VkdXJlIGxvb2t1cFByb2NlZHVyZVNldHRlcihTdHJpbmcgbmFtZSkgPT4gX3Byb2NlZHVyZXNTZXR0ZXJzW25hbWVdOwogIEZpZWxkIGxvb2t1cEZpZWxkKFN0cmluZyBuYW1lKSA9PiBfZmllbGRzW25hbWVdOwp9CgpjbGFzcyBJbmRleGVkQ2xhc3MgewogIGZpbmFsIE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPiBfY29uc3RydWN0b3JzID0gbmV3IE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPigpOwogIGZpbmFsIE1hcDxTdHJpbmcsIFByb2NlZHVyZT4gX3Byb2NlZHVyZXNOb3RTZXR0ZXJzID0KICAgICAgbmV3IE1hcDxTdHJpbmcsIFByb2NlZHVyZT4oKTsKICBmaW5hbCBNYXA8U3RyaW5nLCBQcm9jZWR1cmU+IF9wcm9jZWR1cmVzU2V0dGVycyA9CiAgICAgIG5ldyBNYXA8U3RyaW5nLCBQcm9jZWR1cmU+KCk7CiAgZmluYWwgTWFwPFN0cmluZywgRmllbGQ+IF9maWVsZHMgPSBuZXcgTWFwPFN0cmluZywgRmllbGQ+KCk7CgogIEluZGV4ZWRDbGFzcy5fKENsYXNzIGMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYy5jb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjLmNvbnN0cnVjdG9yc1tpXTsKICAgICAgX2NvbnN0cnVjdG9yc1tjb25zdHJ1Y3Rvci5uYW1lLm5hbWVdID0gY29uc3RydWN0b3I7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGMucHJvY2VkdXJlcy5sZW5ndGg7IGkrKykgewogICAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gYy5wcm9jZWR1cmVzW2ldOwogICAgICBpZiAocHJvY2VkdXJlLmlzU2V0dGVyKSB7CiAgICAgICAgX3Byb2NlZHVyZXNTZXR0ZXJzW3Byb2NlZHVyZS5uYW1lLm5hbWVdID0gcHJvY2VkdXJlOwogICAgICB9IGVsc2UgewogICAgICAgIF9wcm9jZWR1cmVzTm90U2V0dGVyc1twcm9jZWR1cmUubmFtZS5uYW1lXSA9IHByb2NlZHVyZTsKICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjLmZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICBGaWVsZCBmaWVsZCA9IGMuZmllbGRzW2ldOwogICAgICBfZmllbGRzW2ZpZWxkLm5hbWUubmFtZV0gPSBmaWVsZDsKICAgIH0KICB9CgogIENvbnN0cnVjdG9yIGxvb2t1cENvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSA9PiBfY29uc3RydWN0b3JzW25hbWVdOwogIFByb2NlZHVyZSBsb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIoU3RyaW5nIG5hbWUpID0+CiAgICAgIF9wcm9jZWR1cmVzTm90U2V0dGVyc1tuYW1lXTsKICBQcm9jZWR1cmUgbG9va3VwUHJvY2VkdXJlU2V0dGVyKFN0cmluZyBuYW1lKSA9PiBfcHJvY2VkdXJlc1NldHRlcnNbbmFtZV07CiAgRmllbGQgbG9va3VwRmllbGQoU3RyaW5nIG5hbWUpID0+IF9maWVsZHNbbmFtZV07Cn0KagBOTjwBEkwBGzMzAVBLNTEEAUJPAgEXRUA0J0s3JDQkPwEkOC0pBjckHDcGOjMvBjozID0PQAgGNicoBgQBOTRJPzUjTDMCARVRNyQ0JD8BHDYzOgY0LSA9D0AIBjAhKAYEAUU1I0wzAgEocGFja2FnZTprZXJuZWwvcmVmZXJlbmNlX2Zyb21faW5kZXguZGFydGFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3RhcmdldC9jaGFuZ2VkX3N0cnVjdHVyZV9ub3RpZmllci5kYXJ0giMvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBDbGFzczsKCi8vLyBNZWFudCBmb3Igbm90aWZ5aW5nIHRoZSBiYWNrZW5kICh0aGUgY29tcGlsZXIpIHRoYXQgdGhlIHN0cnVjdHVyZSBoYXMKLy8vIGNoYW5nZWQsIGluIHR1cm4gYWxsb3dpbmcgaXQgdG8gdXBkYXRlIGl0cyBpbnRlcm5hbCBtb2RlbC4KYWJzdHJhY3QgY2xhc3MgQ2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyIHsKICAvLy8gTWFyayB0aGUgY2xhc3MgW2NdIGFzIGhhdmluZyBjaGFuZ2VkIGluIHRoYXQgaXRzIG1lbWJlcnMgaGF2ZSBjaGFuZ2VkLgogIHZvaWQgZm9yQ2xhc3MoQ2xhc3MgYyk7Cn0KDgBOTjwBLQFKPypNGgIBNXBhY2thZ2U6a2VybmVsL3RhcmdldC9jaGFuZ2VkX3N0cnVjdHVyZV9ub3RpZmllci5kYXJ0TWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvZXh0ZXJuYWxfbmFtZS5kYXJ0hzgvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBrZXJuZWwuZXh0ZXJuYWxfbmFtZTsKCmltcG9ydCAnYXN0LmRhcnQnOwoKLy8vIFJldHVybnMgZXh0ZXJuYWwgKG5hdGl2ZSkgbmFtZSBvZiBnaXZlbiBbTWVtYmVyXS4KU3RyaW5nIGdldEV4dGVybmFsTmFtZShNZW1iZXIgcHJvY2VkdXJlKSB7CiAgLy8gTmF0aXZlIHByb2NlZHVyZXMgYXJlIG1hcmtlZCBhcyBleHRlcm5hbCBhbmQgaGF2ZSBhbiBhbm5vdGF0aW9uLAogIC8vIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKICAvLwogIC8vICAgIGltcG9ydCAnZGFydDpfaW50ZXJuYWwnIGFzIGludGVybmFsOwogIC8vCiAgLy8gICAgQGludGVybmFsLkV4dGVybmFsTmFtZSgiPG5hbWUtb2YtbmF0aXZlPiIpCiAgLy8gICAgZXh0ZXJuYWwgT2JqZWN0IGZvbyhhcmcwLCAuLi4pOwogIC8vCiAgaWYgKCFwcm9jZWR1cmUuaXNFeHRlcm5hbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGZvciAoZmluYWwgRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIHByb2NlZHVyZS5hbm5vdGF0aW9ucykgewogICAgZmluYWwgdmFsdWUgPSBfZ2V0RXh0ZXJuYWxOYW1lVmFsdWUoYW5ub3RhdGlvbik7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9CgovLy8gUmV0dXJucyBuYXRpdmUgZXh0ZW5zaW9uIFVSSXMgZm9yIGdpdmVuIFtsaWJyYXJ5XS4KTGlzdDxTdHJpbmc+IGdldE5hdGl2ZUV4dGVuc2lvblVyaXMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgZmluYWwgdXJpcyA9IDxTdHJpbmc+W107CiAgZm9yICh2YXIgYW5ub3RhdGlvbiBpbiBsaWJyYXJ5LmFubm90YXRpb25zKSB7CiAgICBmaW5hbCB2YWx1ZSA9IF9nZXRFeHRlcm5hbE5hbWVWYWx1ZShhbm5vdGF0aW9uKTsKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHVyaXMuYWRkKHZhbHVlKTsKICAgIH0KICB9CiAgcmV0dXJuIHVyaXM7Cn0KClN0cmluZyBfZ2V0RXh0ZXJuYWxOYW1lVmFsdWUoRXhwcmVzc2lvbiBhbm5vdGF0aW9uKSB7CiAgaWYgKGFubm90YXRpb24gaXMgQ29uc3RydWN0b3JJbnZvY2F0aW9uKSB7CiAgICBpZiAoX2lzRXh0ZXJuYWxOYW1lKGFubm90YXRpb24udGFyZ2V0LmVuY2xvc2luZ0NsYXNzKSkgewogICAgICByZXR1cm4gKGFubm90YXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlIGFzIFN0cmluZ0xpdGVyYWwpLnZhbHVlOwogICAgfQogIH0gZWxzZSBpZiAoYW5ub3RhdGlvbiBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgIGZpbmFsIGNvbnN0YW50ID0gYW5ub3RhdGlvbi5jb25zdGFudDsKICAgIGlmIChjb25zdGFudCBpcyBJbnN0YW5jZUNvbnN0YW50KSB7CiAgICAgIGlmIChfaXNFeHRlcm5hbE5hbWUoY29uc3RhbnQuY2xhc3NOb2RlKSkgewogICAgICAgIHJldHVybiAoY29uc3RhbnQuZmllbGRWYWx1ZXMudmFsdWVzLnNpbmdsZSBhcyBTdHJpbmdDb25zdGFudCkudmFsdWU7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCmJvb2wgX2lzRXh0ZXJuYWxOYW1lKENsYXNzIGtsYXNzKSA9PgogICAga2xhc3MubmFtZSA9PSAnRXh0ZXJuYWxOYW1lJyAmJgogICAga2xhc3MuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkudG9TdHJpbmcoKSA9PSAnZGFydDpfaW50ZXJuYWwnOwo/AE5OPAEeARMBNitGHAUtBTMoBR8RBD81GRQGBA8CATc3GzA1GRcGBA8CATYtPU4GMSooMU0IBgQPAgElJEUBIXBhY2thZ2U6a2VybmVsL2V4dGVybmFsX25hbWUuZGFydE5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvYXNzZW1ibGVyLmRhcnTAAE0tLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0uYnl0ZWNvZGUuYXNzZW1ibGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBUcmVlTm9kZTsKaW1wb3J0ICdwYWNrYWdlOnZtL2J5dGVjb2RlL29wdGlvbnMuZGFydCc7CgppbXBvcnQgJ2RiYy5kYXJ0JzsKaW1wb3J0ICdleGNlcHRpb25zLmRhcnQnIHNob3cgRXhjZXB0aW9uc1RhYmxlOwppbXBvcnQgJ2xvY2FsX3ZhcmlhYmxlX3RhYmxlLmRhcnQnIHNob3cgTG9jYWxWYXJpYWJsZVRhYmxlOwppbXBvcnQgJ3NvdXJjZV9wb3NpdGlvbnMuZGFydCcgc2hvdyBTb3VyY2VQb3NpdGlvbnM7CgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CgpjbGFzcyBMYWJlbCB7CiAgZmluYWwgYm9vbCBhbGxvd3NCYWNrd2FyZEp1bXBzOwogIExpc3Q8aW50PiBfanVtcHMgPSA8aW50PltdOwogIGludCBvZmZzZXQgPSAtMTsKCiAgTGFiZWwoe3RoaXMuYWxsb3dzQmFja3dhcmRKdW1wczogZmFsc2V9KTsKCiAgYm9vbCBnZXQgaXNCb3VuZCA9PiBvZmZzZXQgPj0gMDsKCiAgaW50IGp1bXBPcGVyYW5kKGludCBqdW1wT2Zmc2V0KSB7CiAgICBpZiAoaXNCb3VuZCkgewogICAgICBpZiAob2Zmc2V0IDw9IGp1bXBPZmZzZXQgJiYgIWFsbG93c0JhY2t3YXJkSnVtcHMpIHsKICAgICAgICB0aHJvdyAnQmFja3dhcmQganVtcCB0byB0aGlzIGxhYmVsIGlzIG5vdCBhbGxvd2VkJzsKICAgICAgfQogICAgICAvLyBKdW1wIGluc3RydWN0aW9uIHRha2VzIGEgcmVsYXRpdmUgb2Zmc2V0LgogICAgICByZXR1cm4gb2Zmc2V0IC0ganVtcE9mZnNldDsKICAgIH0KICAgIF9qdW1wcy5hZGQoanVtcE9mZnNldCk7CiAgICByZXR1cm4gMDsKICB9CgogIExpc3Q8aW50PiBiaW5kKGludCBvZmZzZXQpIHsKICAgIGFzc2VydCghaXNCb3VuZCk7CiAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKICAgIGZpbmFsIGp1bXBzID0gX2p1bXBzOwogICAgX2p1bXBzID0gbnVsbDsKICAgIHJldHVybiBqdW1wczsKICB9Cn0KCmNsYXNzIEJ5dGVjb2RlQXNzZW1ibGVyIHsKICBzdGF0aWMgY29uc3QgaW50IGtCeXRlTWFzayA9IDB4RkY7CiAgc3RhdGljIGNvbnN0IGludCBrVWludDMyTWFzayA9IDB4RkZGRkZGRkY7CiAgc3RhdGljIGNvbnN0IGludCBrTWluSW50OCA9IC0weDgwOwogIHN0YXRpYyBjb25zdCBpbnQga01heEludDggPSAweDdGOwogIHN0YXRpYyBjb25zdCBpbnQga01pbkludDI0ID0gLTB4ODAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQga01heEludDI0ID0gMHg3RkZGRkY7CiAgc3RhdGljIGNvbnN0IGludCBrTWluSW50MzIgPSAtMHg4MDAwMDAwMDsKICBzdGF0aWMgY29uc3QgaW50IGtNYXhJbnQzMiA9IDB4N0ZGRkZGRkY7CgogIHN0YXRpYyBjb25zdCBpbnQga0luaXRpYWxDYXBhY2l0eSA9IDMyOwoKICBpbnQgX2xlbmd0aCA9IDA7CiAgVWludDhMaXN0IF9idWZmZXIgPSBuZXcgVWludDhMaXN0KGtJbml0aWFsQ2FwYWNpdHkpOwoKICBmaW5hbCBFeGNlcHRpb25zVGFibGUgZXhjZXB0aW9uc1RhYmxlID0gbmV3IEV4Y2VwdGlvbnNUYWJsZSgpOwogIGZpbmFsIExvY2FsVmFyaWFibGVUYWJsZSBsb2NhbFZhcmlhYmxlVGFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZVRhYmxlKCk7CiAgZmluYWwgU291cmNlUG9zaXRpb25zIHNvdXJjZVBvc2l0aW9ucyA9IG5ldyBTb3VyY2VQb3NpdGlvbnMoKTsKICBmaW5hbCBib29sIF9lbWl0U291cmNlUG9zaXRpb25zOwogIGJvb2wgaXNVbnJlYWNoYWJsZSA9IGZhbHNlOwogIGludCBjdXJyZW50U291cmNlUG9zaXRpb24gPSBUcmVlTm9kZS5ub09mZnNldDsKCiAgQnl0ZWNvZGVBc3NlbWJsZXIoQnl0ZWNvZGVPcHRpb25zIG9wdGlvbnMpCiAgICAgIDogX2VtaXRTb3VyY2VQb3NpdGlvbnMgPSBvcHRpb25zLmVtaXRTb3VyY2VQb3NpdGlvbnM7CgogIGludCBnZXQgb2Zmc2V0ID0+IF9sZW5ndGg7CgogIFVpbnQ4TGlzdCBnZXQgYnl0ZWNvZGUgPT4gbmV3IFVpbnQ4TGlzdC52aWV3KF9idWZmZXIuYnVmZmVyLCAwLCBfbGVuZ3RoKTsKCiAgdm9pZCBiaW5kKExhYmVsIGxhYmVsKSB7CiAgICBmaW5hbCBMaXN0PGludD4ganVtcHMgPSBsYWJlbC5iaW5kKG9mZnNldCk7CiAgICBmb3IgKGludCBqdW1wT2Zmc2V0IGluIGp1bXBzKSB7CiAgICAgIF9wYXRjaEp1bXAoanVtcE9mZnNldCwgbGFiZWwuanVtcE9wZXJhbmQoanVtcE9mZnNldCkpOwogICAgfQogICAgaWYgKGp1bXBzLmlzTm90RW1wdHkgfHwgbGFiZWwuYWxsb3dzQmFja3dhcmRKdW1wcykgewogICAgICBpc1VucmVhY2hhYmxlID0gZmFsc2U7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRTb3VyY2VQb3NpdGlvbigpIHsKICAgIGlmIChfZW1pdFNvdXJjZVBvc2l0aW9ucyAmJgogICAgICAgICFpc1VucmVhY2hhYmxlICYmCiAgICAgICAgY3VycmVudFNvdXJjZVBvc2l0aW9uICE9IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgIHNvdXJjZVBvc2l0aW9ucy5hZGQob2Zmc2V0LCBjdXJyZW50U291cmNlUG9zaXRpb24pOwogICAgfQogIH0KCiAgLy8gVHJlZU5vZGUubm9PZmZzZXQgKC0xKSBzb3VyY2UgcG9zaXRpb24gb24gY2FsbHMgaXMgdXNlZCB0byBtYXJrIHN5bnRoZXRpYwogIC8vIGNhbGxzIHdpdGhvdXQgY29ycmVzcG9uZGluZyBzb3VyY2UgcG9zaXRpb24uIERlYnVnZ2VyIHVzZXMgdGhlIGFic2VuY2Ugb2YKICAvLyBzb3VyY2UgcG9zaXRpb24gdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FsbHMgYW5kIGF2b2lkIHN0b3BwaW5nIGF0IHRoZW0KICAvLyB3aGlsZSBzaW5nbGUgc3RlcHBpbmcuCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0U291cmNlUG9zaXRpb25Gb3JDYWxsKCkgewogICAgaWYgKF9lbWl0U291cmNlUG9zaXRpb25zICYmICFpc1VucmVhY2hhYmxlKSB7CiAgICAgIHNvdXJjZVBvc2l0aW9ucy5hZGQoCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBjdXJyZW50U291cmNlUG9zaXRpb24gPT0gVHJlZU5vZGUubm9PZmZzZXQKICAgICAgICAgICAgICA/IFNvdXJjZVBvc2l0aW9ucy5zeW50aGV0aWNDb2RlTWFya2VyCiAgICAgICAgICAgICAgOiBjdXJyZW50U291cmNlUG9zaXRpb24pOwogICAgfQogIH0KCiAgdm9pZCBlbWl0WWllbGRQb2ludFNvdXJjZVBvc2l0aW9uKGludCB5aWVsZFNvdXJjZVBvc2l0aW9uKSB7CiAgICBpZiAoIWlzVW5yZWFjaGFibGUpIHsKICAgICAgc291cmNlUG9zaXRpb25zLmFkZFlpZWxkUG9pbnQob2Zmc2V0LCB5aWVsZFNvdXJjZVBvc2l0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgX2dyb3coKSB7CiAgICBmaW5hbCBuZXdTaXplID0gX2J1ZmZlci5sZW5ndGggPDwgMTsKICAgIGZpbmFsIG5ld0J1ZmZlciA9IG5ldyBVaW50OExpc3QobmV3U2l6ZSk7CiAgICBuZXdCdWZmZXIuc2V0UmFuZ2UoMCwgX2J1ZmZlci5sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIHZvaWQgX2dyb3dBbmRFbWl0Qnl0ZXMoaW50IGIwLCBbaW50IGIxLCBpbnQgYjIsIGludCBiMywgaW50IGI0LCBpbnQgYjVdKSB7CiAgICBfZ3JvdygpOwogICAgYXNzZXJ0KF9sZW5ndGggKyA2IDwgX2J1ZmZlci5sZW5ndGgpOwogICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGIwOwogICAgKytfbGVuZ3RoOwogICAgaWYgKGIxICE9IG51bGwpIHsKICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGIxOwogICAgICArK19sZW5ndGg7CiAgICAgIGlmIChiMiAhPSBudWxsKSB7CiAgICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGIyOwogICAgICAgICsrX2xlbmd0aDsKICAgICAgICBpZiAoYjMgIT0gbnVsbCkgewogICAgICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGIzOwogICAgICAgICAgKytfbGVuZ3RoOwogICAgICAgICAgaWYgKGI0ICE9IG51bGwpIHsKICAgICAgICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGI0OwogICAgICAgICAgICArK19sZW5ndGg7CiAgICAgICAgICAgIGlmIChiNSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGI1OwogICAgICAgICAgICAgICsrX2xlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBfZW1pdEJ5dGUoaW50IGFieXRlKSB7CiAgICBhc3NlcnQoX2lzVWludDgoYWJ5dGUpKTsKICAgIGlmIChfbGVuZ3RoIDwgX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGFieXRlOwogICAgICArK19sZW5ndGg7CiAgICB9IGVsc2UgewogICAgICBfZ3Jvd0FuZEVtaXRCeXRlcyhhYnl0ZSk7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIF9lbWl0Qnl0ZXMyKGludCBiMCwgaW50IGIxKSB7CiAgICBhc3NlcnQoX2lzVWludDgoYjApICYmIF9pc1VpbnQ4KGIxKSk7CiAgICBpZiAoX2xlbmd0aCArIDEgPCBfYnVmZmVyLmxlbmd0aCkgewogICAgICBfYnVmZmVyW19sZW5ndGhdID0gYjA7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDFdID0gYjE7CiAgICAgIF9sZW5ndGggKz0gMjsKICAgIH0gZWxzZSB7CiAgICAgIF9ncm93QW5kRW1pdEJ5dGVzKGIwLCBiMSk7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIF9lbWl0Qnl0ZXMzKGludCBiMCwgaW50IGIxLCBpbnQgYjIpIHsKICAgIGFzc2VydChfaXNVaW50OChiMCkgJiYgX2lzVWludDgoYjEpICYmIF9pc1VpbnQ4KGIyKSk7CiAgICBpZiAoX2xlbmd0aCArIDIgPCBfYnVmZmVyLmxlbmd0aCkgewogICAgICBfYnVmZmVyW19sZW5ndGhdID0gYjA7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDFdID0gYjE7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDJdID0gYjI7CiAgICAgIF9sZW5ndGggKz0gMzsKICAgIH0gZWxzZSB7CiAgICAgIF9ncm93QW5kRW1pdEJ5dGVzKGIwLCBiMSwgYjIpOwogICAgfQogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBfZW1pdEJ5dGVzNChpbnQgYjAsIGludCBiMSwgaW50IGIyLCBpbnQgYjMpIHsKICAgIGFzc2VydChfaXNVaW50OChiMCkgJiYgX2lzVWludDgoYjEpICYmIF9pc1VpbnQ4KGIyKSAmJiBfaXNVaW50OChiMykpOwogICAgaWYgKF9sZW5ndGggKyAzIDwgX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgX2J1ZmZlcltfbGVuZ3RoXSA9IGIwOwogICAgICBfYnVmZmVyW19sZW5ndGggKyAxXSA9IGIxOwogICAgICBfYnVmZmVyW19sZW5ndGggKyAyXSA9IGIyOwogICAgICBfYnVmZmVyW19sZW5ndGggKyAzXSA9IGIzOwogICAgICBfbGVuZ3RoICs9IDQ7CiAgICB9IGVsc2UgewogICAgICBfZ3Jvd0FuZEVtaXRCeXRlcyhiMCwgYjEsIGIyLCBiMyk7CiAgICB9CiAgfQoKICB2b2lkIF9lbWl0Qnl0ZXM1KGludCBiMCwgaW50IGIxLCBpbnQgYjIsIGludCBiMywgaW50IGI0KSB7CiAgICBhc3NlcnQoX2lzVWludDgoYjApICYmCiAgICAgICAgX2lzVWludDgoYjEpICYmCiAgICAgICAgX2lzVWludDgoYjIpICYmCiAgICAgICAgX2lzVWludDgoYjMpICYmCiAgICAgICAgX2lzVWludDgoYjQpKTsKICAgIGlmIChfbGVuZ3RoICsgNCA8IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgIF9idWZmZXJbX2xlbmd0aF0gPSBiMDsKICAgICAgX2J1ZmZlcltfbGVuZ3RoICsgMV0gPSBiMTsKICAgICAgX2J1ZmZlcltfbGVuZ3RoICsgMl0gPSBiMjsKICAgICAgX2J1ZmZlcltfbGVuZ3RoICsgM10gPSBiMzsKICAgICAgX2J1ZmZlcltfbGVuZ3RoICsgNF0gPSBiNDsKICAgICAgX2xlbmd0aCArPSA1OwogICAgfSBlbHNlIHsKICAgICAgX2dyb3dBbmRFbWl0Qnl0ZXMoYjAsIGIxLCBiMiwgYjMsIGI0KTsKICAgIH0KICB9CgogIHZvaWQgX2VtaXRCeXRlczYoaW50IGIwLCBpbnQgYjEsIGludCBiMiwgaW50IGIzLCBpbnQgYjQsIGludCBiNSkgewogICAgYXNzZXJ0KF9pc1VpbnQ4KGIwKSAmJgogICAgICAgIF9pc1VpbnQ4KGIxKSAmJgogICAgICAgIF9pc1VpbnQ4KGIyKSAmJgogICAgICAgIF9pc1VpbnQ4KGIzKSAmJgogICAgICAgIF9pc1VpbnQ4KGI0KSAmJgogICAgICAgIF9pc1VpbnQ4KGI1KSk7CiAgICBpZiAoX2xlbmd0aCArIDUgPCBfYnVmZmVyLmxlbmd0aCkgewogICAgICBfYnVmZmVyW19sZW5ndGhdID0gYjA7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDFdID0gYjE7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDJdID0gYjI7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDNdID0gYjM7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDRdID0gYjQ7CiAgICAgIF9idWZmZXJbX2xlbmd0aCArIDVdID0gYjU7CiAgICAgIF9sZW5ndGggKz0gNjsKICAgIH0gZWxzZSB7CiAgICAgIF9ncm93QW5kRW1pdEJ5dGVzKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUpOwogICAgfQogIH0KCiAgaW50IF9ieXRlQXQoaW50IHBvcykgewogICAgcmV0dXJuIF9idWZmZXJbcG9zXTsKICB9CgogIHZvaWQgX3NldEJ5dGVBdChpbnQgcG9zLCBpbnQgdmFsdWUpIHsKICAgIGFzc2VydChfaXNVaW50OCh2YWx1ZSkpOwogICAgX2J1ZmZlcltwb3NdID0gdmFsdWU7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICBpbnQgX2J5dGUwKGludCB2KSA9PiB2ICYga0J5dGVNYXNrOwoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICBpbnQgX2J5dGUxKGludCB2KSA9PiAodiA+PiA4KSAmIGtCeXRlTWFzazsKCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgaW50IF9ieXRlMihpbnQgdikgPT4gKHYgPj4gMTYpICYga0J5dGVNYXNrOwoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICBpbnQgX2J5dGUzKGludCB2KSA9PiAodiA+PiAyNCkgJiBrQnl0ZU1hc2s7CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIGJvb2wgX2lzSW50OChpbnQgdikgPT4gKGtNaW5JbnQ4IDw9IHYpICYmICh2IDw9IGtNYXhJbnQ4KTsKCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgYm9vbCBfaXNJbnQyNChpbnQgdikgPT4gKGtNaW5JbnQyNCA8PSB2KSAmJiAodiA8PSBrTWF4SW50MjQpOwoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICBib29sIF9pc0ludDMyKGludCB2KSA9PiAoa01pbkludDMyIDw9IHYpICYmICh2IDw9IGtNYXhJbnQzMik7CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIGJvb2wgX2lzVWludDgoaW50IHYpID0+ICh2ICYga0J5dGVNYXNrKSA9PSB2OwoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICBib29sIF9pc1VpbnQzMihpbnQgdikgPT4gKHYgJiBrVWludDMyTWFzaykgPT0gdjsKCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUgb3Bjb2RlKSB7CiAgICBpZiAoaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBfZW1pdEJ5dGUob3Bjb2RlLmluZGV4KTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgX2VtaXRJbnN0cnVjdGlvbkEoT3Bjb2RlIG9wY29kZSwgaW50IHJhKSB7CiAgICBpZiAoaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBfZW1pdEJ5dGVzMihvcGNvZGUuaW5kZXgsIHJhKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgX2VtaXRJbnN0cnVjdGlvbkQoT3Bjb2RlIG9wY29kZSwgaW50IHJkKSB7CiAgICBpZiAoaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX2lzVWludDgocmQpKSB7CiAgICAgIF9lbWl0Qnl0ZXMyKG9wY29kZS5pbmRleCwgcmQpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9pc1VpbnQzMihyZCkpOwogICAgICBfZW1pdEJ5dGVzNShvcGNvZGUuaW5kZXggKyBrV2lkZU1vZGlmaWVyLCBfYnl0ZTAocmQpLCBfYnl0ZTEocmQpLAogICAgICAgICAgX2J5dGUyKHJkKSwgX2J5dGUzKHJkKSk7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIF9lbWl0SW5zdHJ1Y3Rpb25YKE9wY29kZSBvcGNvZGUsIGludCByeCkgewogICAgaWYgKGlzVW5yZWFjaGFibGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9pc0ludDgocngpKSB7CiAgICAgIF9lbWl0Qnl0ZXMyKG9wY29kZS5pbmRleCwgcnggJiBrQnl0ZU1hc2spOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9pc0ludDMyKHJ4KSk7CiAgICAgIF9lbWl0Qnl0ZXM1KG9wY29kZS5pbmRleCArIGtXaWRlTW9kaWZpZXIsIF9ieXRlMChyeCksIF9ieXRlMShyeCksCiAgICAgICAgICBfYnl0ZTIocngpLCBfYnl0ZTMocngpKTsKICAgIH0KICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgX2VtaXRJbnN0cnVjdGlvbkFFKE9wY29kZSBvcGNvZGUsIGludCByYSwgaW50IHJlKSB7CiAgICBpZiAoaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX2lzVWludDgocmUpKSB7CiAgICAgIF9lbWl0Qnl0ZXMzKG9wY29kZS5pbmRleCwgcmEsIHJlKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfaXNVaW50MzIocmUpKTsKICAgICAgX2VtaXRCeXRlczYob3Bjb2RlLmluZGV4ICsga1dpZGVNb2RpZmllciwgcmEsIF9ieXRlMChyZSksIF9ieXRlMShyZSksCiAgICAgICAgICBfYnl0ZTIocmUpLCBfYnl0ZTMocmUpKTsKICAgIH0KICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgX2VtaXRJbnN0cnVjdGlvbkFZKE9wY29kZSBvcGNvZGUsIGludCByYSwgaW50IHJ5KSB7CiAgICBpZiAoaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX2lzSW50OChyeSkpIHsKICAgICAgX2VtaXRCeXRlczMob3Bjb2RlLmluZGV4LCByYSwgcnkgJiBrQnl0ZU1hc2spOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9pc0ludDMyKHJ5KSk7CiAgICAgIF9lbWl0Qnl0ZXM2KG9wY29kZS5pbmRleCArIGtXaWRlTW9kaWZpZXIsIHJhLCBfYnl0ZTAocnkpLCBfYnl0ZTEocnkpLAogICAgICAgICAgX2J5dGUyKHJ5KSwgX2J5dGUzKHJ5KSk7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIF9lbWl0SW5zdHJ1Y3Rpb25ERihPcGNvZGUgb3Bjb2RlLCBpbnQgcmQsIGludCByZikgewogICAgaWYgKGlzVW5yZWFjaGFibGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKF9pc1VpbnQ4KHJkKSkgewogICAgICBfZW1pdEJ5dGVzMyhvcGNvZGUuaW5kZXgsIHJkLCByZik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoX2lzVWludDMyKHJkKSk7CiAgICAgIF9lbWl0Qnl0ZXM2KG9wY29kZS5pbmRleCArIGtXaWRlTW9kaWZpZXIsIF9ieXRlMChyZCksIF9ieXRlMShyZCksCiAgICAgICAgICBfYnl0ZTIocmQpLCBfYnl0ZTMocmQpLCByZik7CiAgICB9CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIF9lbWl0SW5zdHJ1Y3Rpb25BQkMoT3Bjb2RlIG9wY29kZSwgaW50IHJhLCBpbnQgcmIsIGludCByYykgewogICAgaWYgKGlzVW5yZWFjaGFibGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2VtaXRCeXRlczQob3Bjb2RlLmluZGV4LCByYSwgcmIsIHJjKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdFNwZWNpYWxpemVkQnl0ZWNvZGUoT3Bjb2RlIG9wY29kZSkgewogICAgYXNzZXJ0KEJ5dGVjb2RlRm9ybWF0c1tvcGNvZGVdLmVuY29kaW5nID09IEVuY29kaW5nLmswKTsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbjAob3Bjb2RlKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgX2VtaXRKdW1wSW5zdHJ1Y3Rpb24oT3Bjb2RlIG9wY29kZSwgTGFiZWwgbGFiZWwpIHsKICAgIGFzc2VydChpc0p1bXAob3Bjb2RlKSk7CiAgICBpZiAoaXNVbnJlYWNoYWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmaW5hbCBpbnQgdGFyZ2V0ID0gbGFiZWwuanVtcE9wZXJhbmQob2Zmc2V0KTsKICAgIC8vIFVzZSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIG9ubHkgZm9yIGJhY2t3YXJkcyBqdW1wcy4KICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGdlbmVyYXRlIGNvbXBhY3QgZm9yd2FyZCBqdW1wcyBhcyB3ZWxsLgogICAgaWYgKGxhYmVsLmlzQm91bmQgJiYgX2lzSW50OCh0YXJnZXQpKSB7CiAgICAgIF9lbWl0Qnl0ZXMyKG9wY29kZS5pbmRleCwgdGFyZ2V0ICYga0J5dGVNYXNrKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfaXNJbnQyNCh0YXJnZXQpKTsKICAgICAgX2VtaXRCeXRlczQob3Bjb2RlLmluZGV4ICsga1dpZGVNb2RpZmllciwgX2J5dGUwKHRhcmdldCksIF9ieXRlMSh0YXJnZXQpLAogICAgICAgICAgX2J5dGUyKHRhcmdldCkpOwogICAgfQogIH0KCiAgdm9pZCBfcGF0Y2hKdW1wKGludCBwb3MsIGludCBydCkgewogICAgZmluYWwgT3Bjb2RlIG9wY29kZSA9IE9wY29kZS52YWx1ZXNbX2J5dGVBdChwb3MpIC0ga1dpZGVNb2RpZmllcl07CiAgICBhc3NlcnQoaGFzV2lkZVZhcmlhbnQob3Bjb2RlKSk7CiAgICBhc3NlcnQoaXNKdW1wKG9wY29kZSkpOwogICAgYXNzZXJ0KF9pc0ludDI0KHJ0KSk7CiAgICBfc2V0Qnl0ZUF0KHBvcyArIDEsIF9ieXRlMChydCkpOwogICAgX3NldEJ5dGVBdChwb3MgKyAyLCBfYnl0ZTEocnQpKTsKICAgIF9zZXRCeXRlQXQocG9zICsgMywgX2J5dGUyKHJ0KSk7CiAgfQoKICB2b2lkIGVtaXRUcmFwKCkgewogICAgX2VtaXRJbnN0cnVjdGlvbjAoT3Bjb2RlLmtUcmFwKTsKICAgIGlzVW5yZWFjaGFibGUgPSB0cnVlOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0RHJvcDEoKSB7CiAgICBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUua0Ryb3AxKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEp1bXAoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcCwgbGFiZWwpOwogICAgaXNVbnJlYWNoYWJsZSA9IHRydWU7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRKdW1wSWZOb0Fzc2VydHMoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmTm9Bc3NlcnRzLCBsYWJlbCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRKdW1wSWZOb3RaZXJvVHlwZUFyZ3MoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmTm90WmVyb1R5cGVBcmdzLCBsYWJlbCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRKdW1wSWZFcVN0cmljdChMYWJlbCBsYWJlbCkgewogICAgX2VtaXRKdW1wSW5zdHJ1Y3Rpb24oT3Bjb2RlLmtKdW1wSWZFcVN0cmljdCwgbGFiZWwpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0SnVtcElmTmVTdHJpY3QoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmTmVTdHJpY3QsIGxhYmVsKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEp1bXBJZlRydWUoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmVHJ1ZSwgbGFiZWwpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0SnVtcElmRmFsc2UoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmRmFsc2UsIGxhYmVsKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEp1bXBJZk51bGwoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmTnVsbCwgbGFiZWwpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0SnVtcElmTm90TnVsbChMYWJlbCBsYWJlbCkgewogICAgX2VtaXRKdW1wSW5zdHJ1Y3Rpb24oT3Bjb2RlLmtKdW1wSWZOb3ROdWxsLCBsYWJlbCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRKdW1wSWZVbmNoZWNrZWQoTGFiZWwgbGFiZWwpIHsKICAgIF9lbWl0SnVtcEluc3RydWN0aW9uKE9wY29kZS5rSnVtcElmVW5jaGVja2VkLCBsYWJlbCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRSZXR1cm5UT1MoKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb24oKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb24wKE9wY29kZS5rUmV0dXJuVE9TKTsKICAgIGlzVW5yZWFjaGFibGUgPSB0cnVlOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0UHVzaChpbnQgcngpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25YKE9wY29kZS5rUHVzaCwgcngpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0TG9hZENvbnN0YW50KGludCByYSwgaW50IHJlKSB7CiAgICBfZW1pdEluc3RydWN0aW9uQUUoT3Bjb2RlLmtMb2FkQ29uc3RhbnQsIHJhLCByZSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRQdXNoQ29uc3RhbnQoaW50IHJkKSB7CiAgICBfZW1pdEluc3RydWN0aW9uRChPcGNvZGUua1B1c2hDb25zdGFudCwgcmQpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0UHVzaE51bGwoKSB7CiAgICBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUua1B1c2hOdWxsKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdFB1c2hUcnVlKCkgewogICAgX2VtaXRJbnN0cnVjdGlvbjAoT3Bjb2RlLmtQdXNoVHJ1ZSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRQdXNoRmFsc2UoKSB7CiAgICBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUua1B1c2hGYWxzZSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRQdXNoSW50KGludCByeCkgewogICAgX2VtaXRJbnN0cnVjdGlvblgoT3Bjb2RlLmtQdXNoSW50LCByeCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRTdG9yZUxvY2FsKGludCByeCkgewogICAgX2VtaXRJbnN0cnVjdGlvblgoT3Bjb2RlLmtTdG9yZUxvY2FsLCByeCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRQb3BMb2NhbChpbnQgcngpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25YKE9wY29kZS5rUG9wTG9jYWwsIHJ4KTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdERpcmVjdENhbGwoaW50IHJkLCBpbnQgcmYpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbkZvckNhbGwoKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25ERihPcGNvZGUua0RpcmVjdENhbGwsIHJkLCByZik7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRVbmNoZWNrZWREaXJlY3RDYWxsKGludCByZCwgaW50IHJmKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb25Gb3JDYWxsKCk7CiAgICBfZW1pdEluc3RydWN0aW9uREYoT3Bjb2RlLmtVbmNoZWNrZWREaXJlY3RDYWxsLCByZCwgcmYpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0SW50ZXJmYWNlQ2FsbChpbnQgcmQsIGludCByZikgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uRm9yQ2FsbCgpOwogICAgX2VtaXRJbnN0cnVjdGlvbkRGKE9wY29kZS5rSW50ZXJmYWNlQ2FsbCwgcmQsIHJmKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwoaW50IHJkLCBpbnQgcmYpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbkZvckNhbGwoKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25ERihPcGNvZGUua0luc3RhbnRpYXRlZEludGVyZmFjZUNhbGwsIHJkLCByZik7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRVbmNoZWNrZWRDbG9zdXJlQ2FsbChpbnQgcmQsIGludCByZikgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uRm9yQ2FsbCgpOwogICAgX2VtaXRJbnN0cnVjdGlvbkRGKE9wY29kZS5rVW5jaGVja2VkQ2xvc3VyZUNhbGwsIHJkLCByZik7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRVbmNoZWNrZWRJbnRlcmZhY2VDYWxsKGludCByZCwgaW50IHJmKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb25Gb3JDYWxsKCk7CiAgICBfZW1pdEluc3RydWN0aW9uREYoT3Bjb2RlLmtVbmNoZWNrZWRJbnRlcmZhY2VDYWxsLCByZCwgcmYpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0RHluYW1pY0NhbGwoaW50IHJkLCBpbnQgcmYpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbkZvckNhbGwoKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25ERihPcGNvZGUua0R5bmFtaWNDYWxsLCByZCwgcmYpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0TmF0aXZlQ2FsbChpbnQgcmQpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25EKE9wY29kZS5rTmF0aXZlQ2FsbCwgcmQpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0TG9hZFN0YXRpYyhpbnQgcmQpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25EKE9wY29kZS5rTG9hZFN0YXRpYywgcmQpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0U3RvcmVTdGF0aWNUT1MoaW50IHJkKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb24oKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25EKE9wY29kZS5rU3RvcmVTdGF0aWNUT1MsIHJkKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdENyZWF0ZUFycmF5VE9TKCkgewogICAgX2VtaXRJbnN0cnVjdGlvbjAoT3Bjb2RlLmtDcmVhdGVBcnJheVRPUyk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRBbGxvY2F0ZShpbnQgcmQpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbkQoT3Bjb2RlLmtBbGxvY2F0ZSwgcmQpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0QWxsb2NhdGVUKCkgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uKCk7CiAgICBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUua0FsbG9jYXRlVCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRTdG9yZUluZGV4ZWRUT1MoKSB7CiAgICBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUua1N0b3JlSW5kZXhlZFRPUyk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRTdG9yZUZpZWxkVE9TKGludCByZCkgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uKCk7CiAgICBfZW1pdEluc3RydWN0aW9uRChPcGNvZGUua1N0b3JlRmllbGRUT1MsIHJkKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdFN0b3JlQ29udGV4dFBhcmVudCgpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb24wKE9wY29kZS5rU3RvcmVDb250ZXh0UGFyZW50KTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdFN0b3JlQ29udGV4dFZhcihpbnQgcmEsIGludCByZSkgewogICAgX2VtaXRJbnN0cnVjdGlvbkFFKE9wY29kZS5rU3RvcmVDb250ZXh0VmFyLCByYSwgcmUpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0TG9hZEZpZWxkVE9TKGludCByZCkgewogICAgX2VtaXRJbnN0cnVjdGlvbkQoT3Bjb2RlLmtMb2FkRmllbGRUT1MsIHJkKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdExvYWRUeXBlQXJndW1lbnRzRmllbGQoaW50IHJkKSB7CiAgICBfZW1pdEluc3RydWN0aW9uRChPcGNvZGUua0xvYWRUeXBlQXJndW1lbnRzRmllbGQsIHJkKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdExvYWRDb250ZXh0UGFyZW50KCkgewogICAgX2VtaXRJbnN0cnVjdGlvbjAoT3Bjb2RlLmtMb2FkQ29udGV4dFBhcmVudCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRMb2FkQ29udGV4dFZhcihpbnQgcmEsIGludCByZSkgewogICAgX2VtaXRJbnN0cnVjdGlvbkFFKE9wY29kZS5rTG9hZENvbnRleHRWYXIsIHJhLCByZSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRCb29sZWFuTmVnYXRlVE9TKCkgewogICAgX2VtaXRJbnN0cnVjdGlvbjAoT3Bjb2RlLmtCb29sZWFuTmVnYXRlVE9TKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdFRocm93KGludCByYSkgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uKCk7CiAgICBfZW1pdEluc3RydWN0aW9uQShPcGNvZGUua1Rocm93LCByYSk7CiAgICBpc1VucmVhY2hhYmxlID0gdHJ1ZTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEVudHJ5KGludCByZCkgewogICAgX2VtaXRJbnN0cnVjdGlvbkQoT3Bjb2RlLmtFbnRyeSwgcmQpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0RnJhbWUoaW50IHJkKSB7CiAgICBfZW1pdEluc3RydWN0aW9uRChPcGNvZGUua0ZyYW1lLCByZCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRTZXRGcmFtZShpbnQgcmEpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25BKE9wY29kZS5rU2V0RnJhbWUsIHJhKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEFsbG9jYXRlQ29udGV4dChpbnQgcmEsIGludCByZSkgewogICAgX2VtaXRJbnN0cnVjdGlvbkFFKE9wY29kZS5rQWxsb2NhdGVDb250ZXh0LCByYSwgcmUpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0Q2xvbmVDb250ZXh0KGludCByYSwgaW50IHJlKSB7CiAgICBfZW1pdEluc3RydWN0aW9uQUUoT3Bjb2RlLmtDbG9uZUNvbnRleHQsIHJhLCByZSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRNb3ZlU3BlY2lhbChTcGVjaWFsSW5kZXggcmEsIGludCByeSkgewogICAgX2VtaXRJbnN0cnVjdGlvbkFZKE9wY29kZS5rTW92ZVNwZWNpYWwsIHJhLmluZGV4LCByeSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRJbnN0YW50aWF0ZVR5cGUoaW50IHJkKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb24oKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25EKE9wY29kZS5rSW5zdGFudGlhdGVUeXBlLCByZCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRJbnN0YW50aWF0ZVR5cGVBcmd1bWVudHNUT1MoaW50IHJhLCBpbnQgcmUpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbkFFKE9wY29kZS5rSW5zdGFudGlhdGVUeXBlQXJndW1lbnRzVE9TLCByYSwgcmUpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0QXNzZXJ0QXNzaWduYWJsZShpbnQgcmEsIGludCByZSkgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uKCk7CiAgICBfZW1pdEluc3RydWN0aW9uQUUoT3Bjb2RlLmtBc3NlcnRBc3NpZ25hYmxlLCByYSwgcmUpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0QXNzZXJ0U3VidHlwZSgpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbjAoT3Bjb2RlLmtBc3NlcnRTdWJ0eXBlKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEFzc2VydEJvb2xlYW4oaW50IHJhKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb24oKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25BKE9wY29kZS5rQXNzZXJ0Qm9vbGVhbiwgcmEpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0Q2hlY2tTdGFjayhpbnQgcmEpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbkEoT3Bjb2RlLmtDaGVja1N0YWNrLCByYSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXREZWJ1Z0NoZWNrKCkgewogICAgZW1pdFNvdXJjZVBvc2l0aW9uKCk7CiAgICBfZW1pdEluc3RydWN0aW9uMChPcGNvZGUua0RlYnVnQ2hlY2spOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0Q2hlY2tGdW5jdGlvblR5cGVBcmdzKGludCByYSwgaW50IHJlKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb24oKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25BRShPcGNvZGUua0NoZWNrRnVuY3Rpb25UeXBlQXJncywgcmEsIHJlKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEVudHJ5Rml4ZWQoaW50IHJhLCBpbnQgcmUpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25BRShPcGNvZGUua0VudHJ5Rml4ZWQsIHJhLCByZSk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRFbnRyeU9wdGlvbmFsKGludCByYSwgaW50IHJiLCBpbnQgcmMpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25BQkMoT3Bjb2RlLmtFbnRyeU9wdGlvbmFsLCByYSwgcmIsIHJjKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEFsbG9jYXRlQ2xvc3VyZShpbnQgcmQpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbkQoT3Bjb2RlLmtBbGxvY2F0ZUNsb3N1cmUsIHJkKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdE51bGxDaGVjayhpbnQgcmQpIHsKICAgIGVtaXRTb3VyY2VQb3NpdGlvbigpOwogICAgX2VtaXRJbnN0cnVjdGlvbkQoT3Bjb2RlLmtOdWxsQ2hlY2ssIHJkKTsKICB9CgogIEBwcmFnbWEoJ3ZtOnByZWZlci1pbmxpbmUnKQogIHZvaWQgZW1pdEluaXRMYXRlRmllbGQoaW50IHJkKSB7CiAgICBlbWl0U291cmNlUG9zaXRpb24oKTsKICAgIF9lbWl0SW5zdHJ1Y3Rpb25EKE9wY29kZS5rSW5pdExhdGVGaWVsZCwgcmQpOwogIH0KCiAgQHByYWdtYSgndm06cHJlZmVyLWlubGluZScpCiAgdm9pZCBlbWl0UHVzaFVuaW5pdGlhbGl6ZWRTZW50aW5lbCgpIHsKICAgIF9lbWl0SW5zdHJ1Y3Rpb24wKE9wY29kZS5rUHVzaFVuaW5pdGlhbGl6ZWRTZW50aW5lbCk7CiAgfQoKICBAcHJhZ21hKCd2bTpwcmVmZXItaW5saW5lJykKICB2b2lkIGVtaXRKdW1wSWZJbml0aWFsaXplZChMYWJlbCBsYWJlbCkgewogICAgX2VtaXRKdW1wSW5zdHJ1Y3Rpb24oT3Bjb2RlLmtKdW1wSWZJbml0aWFsaXplZCwgbGFiZWwpOwogIH0KfQqC+QBOTjwBHwEwKwETLzw1ASkBDiIeEwEsASMBJBM6PAgzIgYcDgQBHxYaGhMSBAIBGiUtJSQqKSwrASoBEzcBQUpBIx4xAS08AR0BTAEbMCQ9BjkdBgQBHh4gGjY6BgQBT09LHB4lMhsSNTQoBgQBPxpCBgQBESkuNBkEAU0NKhsPFh0RGB8TGiEVHCMXHiUZDgwKCAYEAR4eHSQgEQ0gBgQBHiUqKB0hFA0hBgQBHi06KB0hIRQNJQYEAR41SigdISEhFA0pBgQBPRsYGBgXKB0hISEhFA0tBgQBRRsYGBgYFygdISEhISEUDTEGBAEZGQQBKB0aBAEeJgEeLQEeLgEeLgEePQEeQAEeQAEeMAEeMwEeKhkOBh0EAR4yGQ4GIwQBHjIZDgYYJQ0dSCMGBAEeMhkOBhcxDRxIIwYEAR47GQ4GGCkNHUwjBgQBHjsZDgYXNQ0cTCMGBAEeOxkOBhgpDR1IJwYEAR5EGQ4GKwQBHjA9Gh8EAR46HBkOBjI8QSw1DSBQGwYEASVHJBwaJSUlBAEUJRoEAR4VJgQBHh8vGgQBHio6BAEeMEAEAR4pOQQBHik5BAEeJTUEAR4mNgQBHiU1BAEeKDgEAR4qOgQBHhkaKhoEAR4aKQQBHio2BAEeIjEEAR4YKQQBHhgpBAEeGSoEAR4dLAQBHiAvBAEeHi0EAR4oITQEAR4xIT0EAR4rITcEAR43IUMEAR4yIT4EAR40IUAEAR4pITUEAR4gLwQBHiAvBAEeJBozBAEeHi8EAR4eGi0EAR4ZGioEAR4fMAQBHiMaMgQBHiIzBAEeLTkEAR4iMQQBHiw7BAEeITIEAR4sOAQBHiAxBAEeGxoqGgQBHhsqBAEeGyoEAR4eLQQBHi05BAEeKjYEAR4yOwQBHiUaNAQBHjkaRQQBHi4aOgQBHh0aLgQBHiMaMgQBHiAaLwQBHhoaKwQBHjMaPwQBHig0BAEeMzwEAR4lGjQEAR4fGi4EAR4jGjIEAR4pOgQBHiw8BAIBInBhY2thZ2U6dm0vYnl0ZWNvZGUvYXNzZW1ibGVyLmRhcnRSZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL2J5dGVjb2RlL2NvbnN0YW50X3Bvb2wuZGFydMAAYg4vLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5ieXRlY29kZS5jb25zdGFudF9wb29sOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAnZGJjLmRhcnQnIHNob3cgY29uc3RhbnRQb29sSW5kZXhMaW1pdCwgQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uOwppbXBvcnQgJ2J5dGVjb2RlX3NlcmlhbGl6YXRpb24uZGFydCcKICAgIHNob3cKICAgICAgICBCdWZmZXJlZFdyaXRlciwKICAgICAgICBCdWZmZXJlZFJlYWRlciwKICAgICAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLAogICAgICAgIE5hbWVkRW50cnlTdGF0aXN0aWNzLAogICAgICAgIFN0cmluZ1RhYmxlOwppbXBvcnQgJ29iamVjdF90YWJsZS5kYXJ0JyBzaG93IE9iamVjdEhhbmRsZSwgT2JqZWN0VGFibGU7CgovKgoKSW4ga2VybmVsIGJpbmFyeSwgY29uc3RhbnQgcG9vbCBpcyBlbmNvZGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5Cih1c2luZyBub3RhdGlvbiBmcm9tIHBrZy9rZXJuZWwvYmluYXJ5Lm1kKToKCnR5cGUgQ29uc3RhbnRQb29sIHsKICBMaXN0PENvbnN0YW50UG9vbEVudHJ5Pgp9Cgp0eXBlIENvbnN0YW50SW5kZXggPSBVSW50OwoKYWJzdHJhY3QgdHlwZSBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWc7Cn0KCnR5cGUgQ29uc3RhbnRTdGF0aWNGaWVsZCBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBCeXRlIHRhZyA9IDk7CiAgUGFja2VkT2JqZWN0IGZpZWxkOwp9CgovLyBPY2N1cGllcyAyIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wuCnR5cGUgQ29uc3RhbnRJbnN0YW5jZUZpZWxkIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIEJ5dGUgdGFnID0gMTA7CiAgUGFja2VkT2JqZWN0IGZpZWxkOwp9Cgp0eXBlIENvbnN0YW50Q2xhc3MgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWcgPSAxMTsKICBQYWNrZWRPYmplY3QgY2xhc3M7Cn0KCnR5cGUgQ29uc3RhbnRUeXBlQXJndW1lbnRzRmllbGQgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWcgPSAxMjsKICBQYWNrZWRPYmplY3QgY2xhc3M7Cn0KCnR5cGUgQ29uc3RhbnRUeXBlIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIEJ5dGUgdGFnID0gMTQ7CiAgUGFja2VkT2JqZWN0IHR5cGU7Cn0KCnR5cGUgQ29uc3RhbnRDbG9zdXJlRnVuY3Rpb24gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWcgPSAxOTsKICBVSW50IGNsb3N1cmVJbmRleDsKfQoKdHlwZSBDb25zdGFudEVuZENsb3N1cmVGdW5jdGlvblNjb3BlIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIEJ5dGUgdGFnID0gMjA7Cn0KCnR5cGUgQ29uc3RhbnROYXRpdmVFbnRyeSBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBCeXRlIHRhZyA9IDIxOwogIFBhY2tlZFN0cmluZyBuYXRpdmVOYW1lOwp9Cgp0eXBlIENvbnN0YW50U3VidHlwZVRlc3RDYWNoZSBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBCeXRlIHRhZyA9IDIyOwp9Cgp0eXBlIENvbnN0YW50RW1wdHlUeXBlQXJndW1lbnRzIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIEJ5dGUgdGFnID0gMjQ7Cn0KCnR5cGUgQ29uc3RhbnRPYmplY3RSZWYgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWcgPSAyNzsKICBQYWNrZWRPYmplY3Qgb2JqZWN0Owp9CgovLyBPY2N1cGllcyAyIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wuCnR5cGUgQ29uc3RhbnREaXJlY3RDYWxsIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIEJ5dGUgdGFnID0gMjg7CiAgUGFja2VkT2JqZWN0IHRhcmdldDsKICBQYWNrZWRPYmplY3QgYXJnRGVzYzsKfQoKLy8gT2NjdXBpZXMgMiBlbnRyaWVzIGluIHRoZSBjb25zdGFudCBwb29sLgp0eXBlIENvbnN0YW50SW50ZXJmYWNlQ2FsbCBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBCeXRlIHRhZyA9IDI5OwogIFBhY2tlZE9iamVjdCB0YXJnZXQ7CiAgUGFja2VkT2JqZWN0IGFyZ0Rlc2M7Cn0KCi8vIE9jY3VwaWVzIDMgZW50cmllcyBpbiB0aGUgY29uc3RhbnQgcG9vbC4KdHlwZSBDb25zdGFudEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWcgPSAzMDsKICBQYWNrZWRPYmplY3QgdGFyZ2V0OwogIFBhY2tlZE9iamVjdCBhcmdEZXNjOwogIFBhY2tlZE9iamVjdCBzdGF0aWNSZWNlaXZlclR5cGU7Cn0KCi8vIE9jY3VwaWVzIDIgZW50cmllcyBpbiB0aGUgY29uc3RhbnQgcG9vbAp0eXBlIENvbnN0YW50RHluYW1pY0NhbGwgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgQnl0ZSB0YWcgPSAzMTsKICBQYWNrZWRPYmplY3Qgc2VsZWN0b3JOYW1lOwogIFBhY2tlZE9iamVjdCBhcmdEZXNjOwp9CgovLyBPY2N1cGllcyAyIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wuCnR5cGUgQ29uc3RhbnREaXJlY3RDYWxsVmlhRHluYW1pY0ZvcndhcmRlciBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBCeXRlIHRhZyA9IDMyOwogIFBhY2tlZE9iamVjdCB0YXJnZXQ7CiAgUGFja2VkT2JqZWN0IGFyZ0Rlc2M7Cn0KCiovCgplbnVtIENvbnN0YW50VGFnIHsKICBrSW52YWxpZCwKICBrVW51c2VkMSwKICBrVW51c2VkMiwKICBrVW51c2VkMywKICBrVW51c2VkNCwKICBrVW51c2VkNSwKICBrVW51c2VkNiwKICBrVW51c2VkNmEsCiAga1VudXNlZDcsCiAga1N0YXRpY0ZpZWxkLAogIGtJbnN0YW5jZUZpZWxkLAogIGtDbGFzcywKICBrVHlwZUFyZ3VtZW50c0ZpZWxkLAogIGtVbnVzZWQ4LAogIGtUeXBlLAogIGtVbnVzZWQ5LAogIGtVbnVzZWQxMCwKICBrVW51c2VkMTEsCiAga1VudXNlZDEyLAogIGtDbG9zdXJlRnVuY3Rpb24sCiAga0VuZENsb3N1cmVGdW5jdGlvblNjb3BlLAogIGtOYXRpdmVFbnRyeSwKICBrU3VidHlwZVRlc3RDYWNoZSwKICBrVW51c2VkMTMsCiAga0VtcHR5VHlwZUFyZ3VtZW50cywKICBrVW51c2VkMTQsCiAga1VudXNlZDE1LAogIGtPYmplY3RSZWYsCiAga0RpcmVjdENhbGwsCiAga0ludGVyZmFjZUNhbGwsCiAga0luc3RhbnRpYXRlZEludGVyZmFjZUNhbGwsCiAga0R5bmFtaWNDYWxsLAogIGtEaXJlY3RDYWxsVmlhRHluYW1pY0ZvcndhcmRlciwKfQoKU3RyaW5nIGNvbnN0YW50VGFnVG9TdHJpbmcoQ29uc3RhbnRUYWcgdGFnKSA9PgogICAgdGFnLnRvU3RyaW5nKCkuc3Vic3RyaW5nKCdDb25zdGFudFRhZy5rJy5sZW5ndGgpOwoKYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRQb29sRW50cnkgewogIGNvbnN0IENvbnN0YW50UG9vbEVudHJ5KCk7CgogIENvbnN0YW50VGFnIGdldCB0YWc7CgogIC8vIFJldHVybnMgbnVtYmVyIG9mIGV4dHJhIHJlc2VydmVkIGNvbnN0YW50IHBvb2wgZW50cmllcwogIC8vIGZvbGxvd2luZyB0aGlzIGVudHJ5LgogIGludCBnZXQgbnVtUmVzZXJ2ZWRFbnRyaWVzID0+IDA7CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVCeXRlKHRhZy5pbmRleCk7CiAgICB3cml0ZVZhbHVlKHdyaXRlcik7CiAgfQoKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKTsKCiAgZmFjdG9yeSBDb25zdGFudFBvb2xFbnRyeS5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgQ29uc3RhbnRUYWcgdGFnID0gQ29uc3RhbnRUYWcudmFsdWVzW3JlYWRlci5yZWFkQnl0ZSgpXTsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua0ludmFsaWQ6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1N0YXRpY0ZpZWxkOgogICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRTdGF0aWNGaWVsZC5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua0luc3RhbmNlRmllbGQ6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEluc3RhbmNlRmllbGQucmVhZChyZWFkZXIpOwogICAgICBjYXNlIENvbnN0YW50VGFnLmtDbGFzczoKICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50Q2xhc3MucmVhZChyZWFkZXIpOwogICAgICBjYXNlIENvbnN0YW50VGFnLmtUeXBlQXJndW1lbnRzRmllbGQ6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudFR5cGVBcmd1bWVudHNGaWVsZC5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1R5cGU6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudFR5cGUucmVhZChyZWFkZXIpOwogICAgICBjYXNlIENvbnN0YW50VGFnLmtDbG9zdXJlRnVuY3Rpb246CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudENsb3N1cmVGdW5jdGlvbi5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua0VuZENsb3N1cmVGdW5jdGlvblNjb3BlOgogICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRFbmRDbG9zdXJlRnVuY3Rpb25TY29wZS5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua05hdGl2ZUVudHJ5OgogICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnROYXRpdmVFbnRyeS5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1N1YnR5cGVUZXN0Q2FjaGU6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudFN1YnR5cGVUZXN0Q2FjaGUucmVhZChyZWFkZXIpOwogICAgICBjYXNlIENvbnN0YW50VGFnLmtFbXB0eVR5cGVBcmd1bWVudHM6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEVtcHR5VHlwZUFyZ3VtZW50cy5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua09iamVjdFJlZjoKICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50T2JqZWN0UmVmLnJlYWQocmVhZGVyKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5rRGlyZWN0Q2FsbDoKICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50RGlyZWN0Q2FsbC5yZWFkKHJlYWRlcik7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua0ludGVyZmFjZUNhbGw6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEludGVyZmFjZUNhbGwucmVhZChyZWFkZXIpOwogICAgICBjYXNlIENvbnN0YW50VGFnLmtJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsOgogICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsLnJlYWQocmVhZGVyKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5rRHluYW1pY0NhbGw6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudER5bmFtaWNDYWxsLnJlYWQocmVhZGVyKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5rRGlyZWN0Q2FsbFZpYUR5bmFtaWNGb3J3YXJkZXI6CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudERpcmVjdENhbGxWaWFEeW5hbWljRm9yd2FyZGVyLnJlYWQocmVhZGVyKTsKICAgICAgLy8gTWFrZSBhbmFseXplciBoYXBweS4KICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkMToKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkMjoKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkMzoKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkNDoKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkNToKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkNjoKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkNmE6CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1VudXNlZDc6CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1VudXNlZDg6CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1VudXNlZDk6CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1VudXNlZDEwOgogICAgICBjYXNlIENvbnN0YW50VGFnLmtVbnVzZWQxMToKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkMTI6CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcua1VudXNlZDEzOgogICAgICBjYXNlIENvbnN0YW50VGFnLmtVbnVzZWQxNDoKICAgICAgY2FzZSBDb25zdGFudFRhZy5rVW51c2VkMTU6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICB0aHJvdyAnVW5leHBlY3RlZCBjb25zdGFudCB0YWcgJHRhZyc7CiAgfQp9CgplbnVtIEludm9jYXRpb25LaW5kIHsKICBtZXRob2QsIC8vIHguZm9vKC4uLikgb3IgZm9vKC4uLikKICBnZXR0ZXIsIC8vIHguZm9vCiAgc2V0dGVyIC8vIHguZm9vID0gLi4uCn0KCmNsYXNzIENvbnN0YW50U3RhdGljRmllbGQgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIGZpZWxkOwoKICBDb25zdGFudFN0YXRpY0ZpZWxkKHRoaXMuZmllbGQpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFRhZyBnZXQgdGFnID0+IENvbnN0YW50VGFnLmtTdGF0aWNGaWVsZDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVZhbHVlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KGZpZWxkKTsKICB9CgogIENvbnN0YW50U3RhdGljRmllbGQucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpCiAgICAgIDogZmllbGQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnU3RhdGljRmllbGQgJGZpZWxkJzsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBmaWVsZC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgQ29uc3RhbnRTdGF0aWNGaWVsZCAmJiB0aGlzLmZpZWxkID09IG90aGVyLmZpZWxkOwp9CgpjbGFzcyBDb25zdGFudEluc3RhbmNlRmllbGQgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIGZpZWxkOwoKICBpbnQgZ2V0IG51bVJlc2VydmVkRW50cmllcyA9PiAxOwoKICBDb25zdGFudEluc3RhbmNlRmllbGQodGhpcy5maWVsZCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua0luc3RhbmNlRmllbGQ7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVWYWx1ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChmaWVsZCk7CiAgfQoKICBDb25zdGFudEluc3RhbmNlRmllbGQucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpCiAgICAgIDogZmllbGQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSW5zdGFuY2VGaWVsZCAkZmllbGQnOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGZpZWxkLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBDb25zdGFudEluc3RhbmNlRmllbGQgJiYgdGhpcy5maWVsZCA9PSBvdGhlci5maWVsZDsKfQoKY2xhc3MgQ29uc3RhbnRDbGFzcyBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBmaW5hbCBPYmplY3RIYW5kbGUgY2xhc3NIYW5kbGU7CgogIENvbnN0YW50Q2xhc3ModGhpcy5jbGFzc0hhbmRsZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua0NsYXNzOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QoY2xhc3NIYW5kbGUpOwogIH0KCiAgQ29uc3RhbnRDbGFzcy5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiBjbGFzc0hhbmRsZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdDbGFzcyAkY2xhc3NIYW5kbGUnOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGNsYXNzSGFuZGxlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBDb25zdGFudENsYXNzICYmIHRoaXMuY2xhc3NIYW5kbGUgPT0gb3RoZXIuY2xhc3NIYW5kbGU7Cn0KCmNsYXNzIENvbnN0YW50VHlwZUFyZ3VtZW50c0ZpZWxkIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIGZpbmFsIE9iamVjdEhhbmRsZSBjbGFzc0hhbmRsZTsKCiAgQ29uc3RhbnRUeXBlQXJndW1lbnRzRmllbGQodGhpcy5jbGFzc0hhbmRsZSk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua1R5cGVBcmd1bWVudHNGaWVsZDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVZhbHVlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KGNsYXNzSGFuZGxlKTsKICB9CgogIENvbnN0YW50VHlwZUFyZ3VtZW50c0ZpZWxkLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKQogICAgICA6IGNsYXNzSGFuZGxlID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1R5cGVBcmd1bWVudHNGaWVsZCAkY2xhc3NIYW5kbGUnOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGNsYXNzSGFuZGxlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBDb25zdGFudFR5cGVBcmd1bWVudHNGaWVsZCAmJgogICAgICB0aGlzLmNsYXNzSGFuZGxlID09IG90aGVyLmNsYXNzSGFuZGxlOwp9CgpjbGFzcyBDb25zdGFudFR5cGUgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHR5cGU7CgogIENvbnN0YW50VHlwZSh0aGlzLnR5cGUpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFRhZyBnZXQgdGFnID0+IENvbnN0YW50VGFnLmtUeXBlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodHlwZSk7CiAgfQoKICBDb25zdGFudFR5cGUucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIDogdHlwZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdUeXBlICR0eXBlJzsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB0eXBlLmhhc2hDb2RlOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBvdGhlciBpcyBDb25zdGFudFR5cGUgJiYgdGhpcy50eXBlID09IG90aGVyLnR5cGU7Cn0KCmNsYXNzIENvbnN0YW50Q2xvc3VyZUZ1bmN0aW9uIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIGZpbmFsIGludCBjbG9zdXJlSW5kZXg7CgogIENvbnN0YW50Q2xvc3VyZUZ1bmN0aW9uKHRoaXMuY2xvc3VyZUluZGV4KTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRUYWcgZ2V0IHRhZyA9PiBDb25zdGFudFRhZy5rQ2xvc3VyZUZ1bmN0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoY2xvc3VyZUluZGV4KTsKICB9CgogIENvbnN0YW50Q2xvc3VyZUZ1bmN0aW9uLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKQogICAgICA6IGNsb3N1cmVJbmRleCA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAnQ2xvc3VyZUZ1bmN0aW9uICRjbG9zdXJlSW5kZXgnOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBjbG9zdXJlSW5kZXg7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIENvbnN0YW50Q2xvc3VyZUZ1bmN0aW9uICYmCiAgICAgIHRoaXMuY2xvc3VyZUluZGV4ID09IG90aGVyLmNsb3N1cmVJbmRleDsKfQoKY2xhc3MgQ29uc3RhbnRFbmRDbG9zdXJlRnVuY3Rpb25TY29wZSBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBDb25zdGFudEVuZENsb3N1cmVGdW5jdGlvblNjb3BlKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua0VuZENsb3N1cmVGdW5jdGlvblNjb3BlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7fQoKICBDb25zdGFudEVuZENsb3N1cmVGdW5jdGlvblNjb3BlLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7fQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRW5kQ2xvc3VyZUZ1bmN0aW9uU2NvcGUnOwoKICAvLyBDb25zdGFudEVuZENsb3N1cmVGdW5jdGlvblNjb3BlIGVudHJpZXMgYXJlIGNyZWF0ZWQgcGVyIGNsb3N1cmUgYW5kIHNob3VsZAogIC8vIG5vdCBiZSBtZXJnZWQsIHNvIENvbnN0YW50RW5kQ2xvc3VyZUZ1bmN0aW9uU2NvcGUgY2xhc3MgdXNlcyBpZGVudGl0eQogIC8vIFtoYXNoQ29kZV0gYW5kIFtvcGVyYXRvciA9PV0uCn0KCmNsYXNzIENvbnN0YW50TmF0aXZlRW50cnkgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgU3RyaW5nIG5hdGl2ZU5hbWU7CgogIENvbnN0YW50TmF0aXZlRW50cnkodGhpcy5uYXRpdmVOYW1lKTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRUYWcgZ2V0IHRhZyA9PiBDb25zdGFudFRhZy5rTmF0aXZlRW50cnk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVWYWx1ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZFN0cmluZ1JlZmVyZW5jZShuYXRpdmVOYW1lKTsKICB9CgogIENvbnN0YW50TmF0aXZlRW50cnkucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpCiAgICAgIDogbmF0aXZlTmFtZSA9IHJlYWRlci5yZWFkUGFja2VkU3RyaW5nUmVmZXJlbmNlKCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdOYXRpdmVFbnRyeSAkbmF0aXZlTmFtZSc7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gbmF0aXZlTmFtZS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgQ29uc3RhbnROYXRpdmVFbnRyeSAmJiB0aGlzLm5hdGl2ZU5hbWUgPT0gb3RoZXIubmF0aXZlTmFtZTsKfQoKY2xhc3MgQ29uc3RhbnRTdWJ0eXBlVGVzdENhY2hlIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIENvbnN0YW50U3VidHlwZVRlc3RDYWNoZSgpOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFRhZyBnZXQgdGFnID0+IENvbnN0YW50VGFnLmtTdWJ0eXBlVGVzdENhY2hlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7fQoKICBDb25zdGFudFN1YnR5cGVUZXN0Q2FjaGUucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnU3VidHlwZVRlc3RDYWNoZSc7CgogIC8vIENvbnN0YW50U3VidHlwZVRlc3RDYWNoZSBlbnRyaWVzIGFyZSBjcmVhdGVkIHBlciBzdWJ0eXBlIHRlc3Qgc2l0ZSBhbmQKICAvLyBzaG91bGQgbm90IGJlIG1lcmdlZCwgc28gQ29uc3RhbnRTdWJ0eXBlVGVzdENhY2hlIGNsYXNzIHVzZXMgaWRlbnRpdHkKICAvLyBbaGFzaENvZGVdIGFuZCBbb3BlcmF0b3IgPT1dLgoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGlkZW50aXR5SGFzaENvZGUodGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IGlkZW50aWNhbCh0aGlzLCBvdGhlcik7Cn0KCmNsYXNzIENvbnN0YW50RW1wdHlUeXBlQXJndW1lbnRzIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIGNvbnN0IENvbnN0YW50RW1wdHlUeXBlQXJndW1lbnRzKCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua0VtcHR5VHlwZUFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVZhbHVlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikge30KCiAgQ29uc3RhbnRFbXB0eVR5cGVBcmd1bWVudHMucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRW1wdHlUeXBlQXJndW1lbnRzJzsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiA5OTc7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IG90aGVyIGlzIENvbnN0YW50RW1wdHlUeXBlQXJndW1lbnRzOwp9CgpjbGFzcyBDb25zdGFudE9iamVjdFJlZiBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKICBmaW5hbCBPYmplY3RIYW5kbGUgb2JqZWN0OwoKICBDb25zdGFudE9iamVjdFJlZih0aGlzLm9iamVjdCk7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua09iamVjdFJlZjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVZhbHVlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KG9iamVjdCk7CiAgfQoKICBDb25zdGFudE9iamVjdFJlZi5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiBvYmplY3QgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnT2JqZWN0UmVmICRvYmplY3QnOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG9iamVjdC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgQ29uc3RhbnRPYmplY3RSZWYgJiYgdGhpcy5vYmplY3QgPT0gb3RoZXIub2JqZWN0Owp9CgpjbGFzcyBDb25zdGFudERpcmVjdENhbGwgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHRhcmdldDsKICBmaW5hbCBPYmplY3RIYW5kbGUgYXJnRGVzYzsKCiAgQ29uc3RhbnREaXJlY3RDYWxsKHRoaXMudGFyZ2V0LCB0aGlzLmFyZ0Rlc2MpOwoKICAvLyBSZXNlcnZlIDEgZXh0cmEgc2xvdCBmb3IgYXJndW1lbnRzIGRlc2NyaXB0b3IsIGZvbGxvd2luZyB0YXJnZXQgc2xvdC4KICBpbnQgZ2V0IG51bVJlc2VydmVkRW50cmllcyA9PiAxOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFRhZyBnZXQgdGFnID0+IENvbnN0YW50VGFnLmtEaXJlY3RDYWxsOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodGFyZ2V0KTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChhcmdEZXNjKTsKICB9CgogIENvbnN0YW50RGlyZWN0Q2FsbC5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiB0YXJnZXQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpLAogICAgICAgIGFyZ0Rlc2MgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRGlyZWN0Q2FsbCAnJHRhcmdldCcsICRhcmdEZXNjIjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29tYmluZUhhc2hlcyh0YXJnZXQuaGFzaENvZGUsIGFyZ0Rlc2MuaGFzaENvZGUpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBDb25zdGFudERpcmVjdENhbGwgJiYKICAgICAgdGhpcy50YXJnZXQgPT0gb3RoZXIudGFyZ2V0ICYmCiAgICAgIHRoaXMuYXJnRGVzYyA9PSBvdGhlci5hcmdEZXNjOwp9CgpjbGFzcyBDb25zdGFudERpcmVjdENhbGxWaWFEeW5hbWljRm9yd2FyZGVyIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIGZpbmFsIE9iamVjdEhhbmRsZSB0YXJnZXQ7CiAgZmluYWwgT2JqZWN0SGFuZGxlIGFyZ0Rlc2M7CgogIENvbnN0YW50RGlyZWN0Q2FsbFZpYUR5bmFtaWNGb3J3YXJkZXIodGhpcy50YXJnZXQsIHRoaXMuYXJnRGVzYyk7CgogIC8vIFJlc2VydmUgMSBleHRyYSBzbG90IGZvciBhcmd1bWVudHMgZGVzY3JpcHRvciwgZm9sbG93aW5nIHRhcmdldCBzbG90LgogIGludCBnZXQgbnVtUmVzZXJ2ZWRFbnRyaWVzID0+IDE7CgogIEBvdmVycmlkZQogIENvbnN0YW50VGFnIGdldCB0YWcgPT4gQ29uc3RhbnRUYWcua0RpcmVjdENhbGxWaWFEeW5hbWljRm9yd2FyZGVyOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodGFyZ2V0KTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChhcmdEZXNjKTsKICB9CgogIENvbnN0YW50RGlyZWN0Q2FsbFZpYUR5bmFtaWNGb3J3YXJkZXIucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpCiAgICAgIDogdGFyZ2V0ID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKSwKICAgICAgICBhcmdEZXNjID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkRpcmVjdENhbGxWaWFEeW5hbWljRm9yd2FyZGVyICckdGFyZ2V0JywgJGFyZ0Rlc2MiOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9jb21iaW5lSGFzaGVzKHRhcmdldC5oYXNoQ29kZSwgYXJnRGVzYy5oYXNoQ29kZSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIENvbnN0YW50RGlyZWN0Q2FsbFZpYUR5bmFtaWNGb3J3YXJkZXIgJiYKICAgICAgdGhpcy50YXJnZXQgPT0gb3RoZXIudGFyZ2V0ICYmCiAgICAgIHRoaXMuYXJnRGVzYyA9PSBvdGhlci5hcmdEZXNjOwp9CgpjbGFzcyBDb25zdGFudEludGVyZmFjZUNhbGwgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHRhcmdldDsKICBmaW5hbCBPYmplY3RIYW5kbGUgYXJnRGVzYzsKCiAgQ29uc3RhbnRJbnRlcmZhY2VDYWxsKHRoaXMudGFyZ2V0LCB0aGlzLmFyZ0Rlc2MpOwoKICAvLyBSZXNlcnZlIDEgZXh0cmEgc2xvdCBmb3IgYXJndW1lbnRzIGRlc2NyaXB0b3IsIGZvbGxvd2luZyB0YXJnZXQgc2xvdC4KICBpbnQgZ2V0IG51bVJlc2VydmVkRW50cmllcyA9PiAxOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFRhZyBnZXQgdGFnID0+IENvbnN0YW50VGFnLmtJbnRlcmZhY2VDYWxsOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodGFyZ2V0KTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChhcmdEZXNjKTsKICB9CgogIENvbnN0YW50SW50ZXJmYWNlQ2FsbC5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiB0YXJnZXQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpLAogICAgICAgIGFyZ0Rlc2MgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSW50ZXJmYWNlQ2FsbCAnJHRhcmdldCcsICRhcmdEZXNjIjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29tYmluZUhhc2hlcyh0YXJnZXQuaGFzaENvZGUsIGFyZ0Rlc2MuaGFzaENvZGUpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBDb25zdGFudEludGVyZmFjZUNhbGwgJiYKICAgICAgdGhpcy50YXJnZXQgPT0gb3RoZXIudGFyZ2V0ICYmCiAgICAgIHRoaXMuYXJnRGVzYyA9PSBvdGhlci5hcmdEZXNjOwp9CgpjbGFzcyBDb25zdGFudEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHRhcmdldDsKICBmaW5hbCBPYmplY3RIYW5kbGUgYXJnRGVzYzsKICBmaW5hbCBPYmplY3RIYW5kbGUgc3RhdGljUmVjZWl2ZXJUeXBlOwoKICBDb25zdGFudEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwoCiAgICAgIHRoaXMudGFyZ2V0LCB0aGlzLmFyZ0Rlc2MsIHRoaXMuc3RhdGljUmVjZWl2ZXJUeXBlKTsKCiAgLy8gUmVzZXJ2ZSAyIGV4dHJhIHNsb3RzICgzIHNsb3RzIHRvdGFsKS4KICBpbnQgZ2V0IG51bVJlc2VydmVkRW50cmllcyA9PiAyOwoKICBAb3ZlcnJpZGUKICBDb25zdGFudFRhZyBnZXQgdGFnID0+IENvbnN0YW50VGFnLmtJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodGFyZ2V0KTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChhcmdEZXNjKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChzdGF0aWNSZWNlaXZlclR5cGUpOwogIH0KCiAgQ29uc3RhbnRJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKQogICAgICA6IHRhcmdldCA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCksCiAgICAgICAgYXJnRGVzYyA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCksCiAgICAgICAgc3RhdGljUmVjZWl2ZXJUeXBlID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgIkluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwgJyR0YXJnZXQnLCAkYXJnRGVzYywgcmVjZWl2ZXIgJHN0YXRpY1JlY2VpdmVyVHlwZSI7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2NvbWJpbmVIYXNoZXMoCiAgICAgIF9jb21iaW5lSGFzaGVzKHRhcmdldC5oYXNoQ29kZSwgYXJnRGVzYy5oYXNoQ29kZSksCiAgICAgIHN0YXRpY1JlY2VpdmVyVHlwZS5oYXNoQ29kZSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIENvbnN0YW50SW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbCAmJgogICAgICB0aGlzLnRhcmdldCA9PSBvdGhlci50YXJnZXQgJiYKICAgICAgdGhpcy5hcmdEZXNjID09IG90aGVyLmFyZ0Rlc2MgJiYKICAgICAgdGhpcy5zdGF0aWNSZWNlaXZlclR5cGUgPT0gb3RoZXIuc3RhdGljUmVjZWl2ZXJUeXBlOwp9CgpjbGFzcyBDb25zdGFudER5bmFtaWNDYWxsIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgewogIGZpbmFsIE9iamVjdEhhbmRsZSBzZWxlY3Rvck5hbWU7CiAgZmluYWwgT2JqZWN0SGFuZGxlIGFyZ0Rlc2M7CgogIENvbnN0YW50RHluYW1pY0NhbGwodGhpcy5zZWxlY3Rvck5hbWUsIHRoaXMuYXJnRGVzYyk7CgogIC8vIFJlc2VydmUgMSBleHRyYSBzbG90IGZvciBhcmd1bWVudHMgZGVzY3JpcHRvciwgZm9sbG93aW5nIHNlbGVjdG9yIHNsb3QuCiAgaW50IGdldCBudW1SZXNlcnZlZEVudHJpZXMgPT4gMTsKCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnRUYWcgZ2V0IHRhZyA9PiBDb25zdGFudFRhZy5rRHluYW1pY0NhbGw7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVWYWx1ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChzZWxlY3Rvck5hbWUpOwogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KGFyZ0Rlc2MpOwogIH0KCiAgQ29uc3RhbnREeW5hbWljQ2FsbC5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiBzZWxlY3Rvck5hbWUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpLAogICAgICAgIGFyZ0Rlc2MgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRHluYW1pY0NhbGwgJHNlbGVjdG9yTmFtZSwgJGFyZ0Rlc2MnOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9jb21iaW5lSGFzaGVzKHNlbGVjdG9yTmFtZS5oYXNoQ29kZSwgYXJnRGVzYy5oYXNoQ29kZSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIENvbnN0YW50RHluYW1pY0NhbGwgJiYKICAgICAgdGhpcy5zZWxlY3Rvck5hbWUgPT0gb3RoZXIuc2VsZWN0b3JOYW1lICYmCiAgICAgIHRoaXMuYXJnRGVzYyA9PSBvdGhlci5hcmdEZXNjOwp9CgovLy8gUmVzZXJ2ZWQgY29uc3RhbnQgcG9vbCBlbnRyeS4KY2xhc3MgX1Jlc2VydmVkQ29uc3RhbnRQb29sRW50cnkgZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CiAgY29uc3QgX1Jlc2VydmVkQ29uc3RhbnRQb29sRW50cnkoKTsKCiAgQ29uc3RhbnRUYWcgZ2V0IHRhZyA9PiB0aHJvdyAnVGhpcyBjb25zdGFudCBwb29sIGVudHJ5IGlzIHJlc2VydmVkJzsKICB2b2lkIHdyaXRlVmFsdWUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSA9PgogICAgICB0aHJvdyAnVGhpcyBjb25zdGFudCBwb29sIGVudHJ5IGlzIHJlc2VydmVkJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1Jlc2VydmVkJzsKfQoKY2xhc3MgQ29uc3RhbnRQb29sIHsKICBmaW5hbCBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZTsKICBmaW5hbCBPYmplY3RUYWJsZSBvYmplY3RUYWJsZTsKICBmaW5hbCBMaXN0PENvbnN0YW50UG9vbEVudHJ5PiBlbnRyaWVzID0gPENvbnN0YW50UG9vbEVudHJ5PltdOwogIGZpbmFsIE1hcDxDb25zdGFudFBvb2xFbnRyeSwgaW50PiBfY2Fub25pY2FsaXphdGlvbkNhY2hlID0KICAgICAgPENvbnN0YW50UG9vbEVudHJ5LCBpbnQ+e307CgogIENvbnN0YW50UG9vbCh0aGlzLnN0cmluZ1RhYmxlLCB0aGlzLm9iamVjdFRhYmxlKTsKCiAgaW50IGFkZFN0cmluZyhTdHJpbmcgdmFsdWUpID0+IGFkZE9iamVjdFJlZihuZXcgU3RyaW5nQ29uc3RhbnQodmFsdWUpKTsKCiAgaW50IGFkZE5hbWUoU3RyaW5nIG5hbWUpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50T2JqZWN0UmVmKG9iamVjdFRhYmxlLmdldFB1YmxpY05hbWVIYW5kbGUobmFtZSkpKTsKCiAgaW50IGFkZEFyZ0Rlc2MoaW50IG51bUFyZ3VtZW50cywKICAgICAgICAgIHtpbnQgbnVtVHlwZUFyZ3MgPSAwLCBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBjb25zdCA8U3RyaW5nPltdfSkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnRPYmplY3RSZWYoCiAgICAgICAgICBvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlKG51bUFyZ3VtZW50cywgbnVtVHlwZUFyZ3MsIGFyZ05hbWVzKSkpOwoKICBpbnQgYWRkQXJnRGVzY0J5QXJndW1lbnRzKEFyZ3VtZW50cyBhcmdzLAogICAgICAgICAge2Jvb2wgaGFzUmVjZWl2ZXI6IGZhbHNlLCBib29sIGlzRmFjdG9yeTogZmFsc2V9KSA9PgogICAgICBfYWRkKG5ldyBDb25zdGFudE9iamVjdFJlZihvYmplY3RUYWJsZS5nZXRBcmdEZXNjSGFuZGxlQnlBcmd1bWVudHMoYXJncywKICAgICAgICAgIGhhc1JlY2VpdmVyOiBoYXNSZWNlaXZlciwgaXNGYWN0b3J5OiBpc0ZhY3RvcnkpKSk7CgogIGludCBhZGREaXJlY3RDYWxsKAogICAgICBJbnZvY2F0aW9uS2luZCBpbnZvY2F0aW9uS2luZCwgTWVtYmVyIHRhcmdldCwgT2JqZWN0SGFuZGxlIGFyZ0Rlc2MsCiAgICAgIFtib29sIGlzRHluYW1pY0ZvcndhcmRlciA9IGZhbHNlXSkgewogICAgZmluYWwgdGFyZ2V0SGFuZGxlID0gb2JqZWN0VGFibGUuZ2V0TWVtYmVySGFuZGxlKHRhcmdldCwKICAgICAgICBpc0dldHRlcjogaW52b2NhdGlvbktpbmQgPT0gSW52b2NhdGlvbktpbmQuZ2V0dGVyLAogICAgICAgIGlzU2V0dGVyOiBpbnZvY2F0aW9uS2luZCA9PSBJbnZvY2F0aW9uS2luZC5zZXR0ZXIpOwogICAgcmV0dXJuIF9hZGQoaXNEeW5hbWljRm9yd2FyZGVyCiAgICAgICAgPyBuZXcgQ29uc3RhbnREaXJlY3RDYWxsVmlhRHluYW1pY0ZvcndhcmRlcih0YXJnZXRIYW5kbGUsIGFyZ0Rlc2MpCiAgICAgICAgOiBuZXcgQ29uc3RhbnREaXJlY3RDYWxsKHRhcmdldEhhbmRsZSwgYXJnRGVzYykpOwogIH0KCiAgaW50IGFkZEludGVyZmFjZUNhbGwoCiAgICAgICAgICBJbnZvY2F0aW9uS2luZCBpbnZvY2F0aW9uS2luZCwgTWVtYmVyIHRhcmdldCwgT2JqZWN0SGFuZGxlIGFyZ0Rlc2MpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50SW50ZXJmYWNlQ2FsbCgKICAgICAgICAgIG9iamVjdFRhYmxlLmdldE1lbWJlckhhbmRsZSh0YXJnZXQsCiAgICAgICAgICAgICAgaXNHZXR0ZXI6IGludm9jYXRpb25LaW5kID09IEludm9jYXRpb25LaW5kLmdldHRlciwKICAgICAgICAgICAgICBpc1NldHRlcjogaW52b2NhdGlvbktpbmQgPT0gSW52b2NhdGlvbktpbmQuc2V0dGVyKSwKICAgICAgICAgIGFyZ0Rlc2MpKTsKCiAgaW50IGFkZEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwoSW52b2NhdGlvbktpbmQgaW52b2NhdGlvbktpbmQsIE1lbWJlciB0YXJnZXQsCiAgICAgICAgICBPYmplY3RIYW5kbGUgYXJnRGVzYywgRGFydFR5cGUgc3RhdGljUmVjZWl2ZXJUeXBlKSA9PgogICAgICBfYWRkKG5ldyBDb25zdGFudEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGwoCiAgICAgICAgICBvYmplY3RUYWJsZS5nZXRNZW1iZXJIYW5kbGUodGFyZ2V0LAogICAgICAgICAgICAgIGlzR2V0dGVyOiBpbnZvY2F0aW9uS2luZCA9PSBJbnZvY2F0aW9uS2luZC5nZXR0ZXIsCiAgICAgICAgICAgICAgaXNTZXR0ZXI6IGludm9jYXRpb25LaW5kID09IEludm9jYXRpb25LaW5kLnNldHRlciksCiAgICAgICAgICBhcmdEZXNjLAogICAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKHN0YXRpY1JlY2VpdmVyVHlwZSkpKTsKCiAgaW50IGFkZER5bmFtaWNDYWxsKAogICAgICAgICAgSW52b2NhdGlvbktpbmQgaW52b2NhdGlvbktpbmQsIE5hbWUgc2VsZWN0b3IsIE9iamVjdEhhbmRsZSBhcmdEZXNjKSA9PgogICAgICBfYWRkKG5ldyBDb25zdGFudER5bmFtaWNDYWxsKAogICAgICAgICAgb2JqZWN0VGFibGUuZ2V0U2VsZWN0b3JOYW1lSGFuZGxlKHNlbGVjdG9yLAogICAgICAgICAgICAgIGlzR2V0dGVyOiBpbnZvY2F0aW9uS2luZCA9PSBJbnZvY2F0aW9uS2luZC5nZXR0ZXIsCiAgICAgICAgICAgICAgaXNTZXR0ZXI6IGludm9jYXRpb25LaW5kID09IEludm9jYXRpb25LaW5kLnNldHRlciksCiAgICAgICAgICBhcmdEZXNjKSk7CgogIGludCBhZGRJbnN0YW5jZUNhbGwoSW52b2NhdGlvbktpbmQgaW52b2NhdGlvbktpbmQsIE1lbWJlciB0YXJnZXQsCiAgICAgICAgICBOYW1lIHRhcmdldE5hbWUsIE9iamVjdEhhbmRsZSBhcmdEZXNjKSA9PgogICAgICAodGFyZ2V0ID09IG51bGwpCiAgICAgICAgICA/IGFkZER5bmFtaWNDYWxsKGludm9jYXRpb25LaW5kLCB0YXJnZXROYW1lLCBhcmdEZXNjKQogICAgICAgICAgOiBhZGRJbnRlcmZhY2VDYWxsKGludm9jYXRpb25LaW5kLCB0YXJnZXQsIGFyZ0Rlc2MpOwoKICBpbnQgYWRkU3RhdGljRmllbGQoRmllbGQgZmllbGQpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50U3RhdGljRmllbGQob2JqZWN0VGFibGUuZ2V0SGFuZGxlKGZpZWxkKSkpOwoKICBpbnQgYWRkSW5zdGFuY2VGaWVsZChGaWVsZCBmaWVsZCkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnRJbnN0YW5jZUZpZWxkKG9iamVjdFRhYmxlLmdldEhhbmRsZShmaWVsZCkpKTsKCiAgaW50IGFkZENsYXNzKENsYXNzIG5vZGUpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50Q2xhc3Mob2JqZWN0VGFibGUuZ2V0SGFuZGxlKG5vZGUpKSk7CgogIGludCBhZGRUeXBlQXJndW1lbnRzRmllbGQoQ2xhc3Mgbm9kZSkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnRUeXBlQXJndW1lbnRzRmllbGQob2JqZWN0VGFibGUuZ2V0SGFuZGxlKG5vZGUpKSk7CgogIGludCBhZGRUeXBlKERhcnRUeXBlIHR5cGUpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50VHlwZShvYmplY3RUYWJsZS5nZXRIYW5kbGUodHlwZSkpKTsKCiAgaW50IGFkZFR5cGVBcmd1bWVudHMoTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3MpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50T2JqZWN0UmVmKG9iamVjdFRhYmxlLmdldFR5cGVBcmd1bWVudHNIYW5kbGUodHlwZUFyZ3MpKSk7CgogIGludCBhZGRDbG9zdXJlRnVuY3Rpb24oaW50IGNsb3N1cmVJbmRleCkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnRDbG9zdXJlRnVuY3Rpb24oY2xvc3VyZUluZGV4KSk7CgogIGludCBhZGRFbmRDbG9zdXJlRnVuY3Rpb25TY29wZSgpID0+CiAgICAgIF9hZGQobmV3IENvbnN0YW50RW5kQ2xvc3VyZUZ1bmN0aW9uU2NvcGUoKSk7CgogIGludCBhZGROYXRpdmVFbnRyeShTdHJpbmcgbmF0aXZlTmFtZSkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnROYXRpdmVFbnRyeShfaW5kZXhTdHJpbmcobmF0aXZlTmFtZSkpKTsKCiAgaW50IGFkZFN1YnR5cGVUZXN0Q2FjaGUoKSA9PiBfYWRkKG5ldyBDb25zdGFudFN1YnR5cGVUZXN0Q2FjaGUoKSk7CgogIGludCBhZGRFbXB0eVR5cGVBcmd1bWVudHMoKSA9PiBfYWRkKGNvbnN0IENvbnN0YW50RW1wdHlUeXBlQXJndW1lbnRzKCkpOwoKICBpbnQgYWRkT2JqZWN0UmVmKE5vZGUgbm9kZSkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnRPYmplY3RSZWYob2JqZWN0VGFibGUuZ2V0SGFuZGxlKG5vZGUpKSk7CgogIGludCBhZGRTZWxlY3Rvck5hbWUoTmFtZSBuYW1lLCBJbnZvY2F0aW9uS2luZCBpbnZvY2F0aW9uS2luZCkgPT4KICAgICAgX2FkZChuZXcgQ29uc3RhbnRPYmplY3RSZWYob2JqZWN0VGFibGUuZ2V0U2VsZWN0b3JOYW1lSGFuZGxlKG5hbWUsCiAgICAgICAgICBpc0dldHRlcjogaW52b2NhdGlvbktpbmQgPT0gSW52b2NhdGlvbktpbmQuZ2V0dGVyLAogICAgICAgICAgaXNTZXR0ZXI6IGludm9jYXRpb25LaW5kID09IEludm9jYXRpb25LaW5kLnNldHRlcikpKTsKCiAgaW50IF9hZGQoQ29uc3RhbnRQb29sRW50cnkgZW50cnkpIHsKICAgIGludCBpbmRleCA9IF9jYW5vbmljYWxpemF0aW9uQ2FjaGVbZW50cnldOwogICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgaW5kZXggPSBlbnRyaWVzLmxlbmd0aDsKICAgICAgaWYgKGluZGV4ID49IGNvbnN0YW50UG9vbEluZGV4TGltaXQpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uc3RhbnRQb29sSW5kZXhPdmVyZmxvd0V4Y2VwdGlvbigpOwogICAgICB9CiAgICAgIF9hZGRFbnRyeShlbnRyeSk7CiAgICAgIF9jYW5vbmljYWxpemF0aW9uQ2FjaGVbZW50cnldID0gaW5kZXg7CiAgICB9CiAgICByZXR1cm4gaW5kZXg7CiAgfQoKICB2b2lkIF9hZGRFbnRyeShDb25zdGFudFBvb2xFbnRyeSBlbnRyeSkgewogICAgZW50cmllcy5hZGQoZW50cnkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeS5udW1SZXNlcnZlZEVudHJpZXM7ICsraSkgewogICAgICBlbnRyaWVzLmFkZChjb25zdCBfUmVzZXJ2ZWRDb25zdGFudFBvb2xFbnRyeSgpKTsKICAgIH0KICB9CgogIC8vIEN1cnJlbnRseSwgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gYXMgYSBwYXJ0IG9mIENvbXBvbmVudCdzIG1ldGFkYXRhCiAgLy8gKmJlZm9yZSogY29uc3RhbnQgcG9vbHMgYXJlIHdyaXR0ZW4uCiAgLy8gU28gd2UgbmVlZCB0byBpbmRleCBhbGwgc3RyaW5ncyB3aGVuIGZpbGxpbmcgdXAgY29uc3RhbnQgcG9vbHMuCiAgU3RyaW5nIF9pbmRleFN0cmluZyhTdHJpbmcgc3RyKSB7CiAgICBzdHJpbmdUYWJsZS5wdXQoc3RyKTsKICAgIHJldHVybiBzdHI7CiAgfQoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgZmluYWwgc3RhcnQgPSB3cml0ZXIub2Zmc2V0OwogICAgaWYgKEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3MuY29uc3RhbnRQb29sU3RhdHMuaXNFbXB0eSkgewogICAgICBmb3IgKHZhciB0YWcgaW4gQ29uc3RhbnRUYWcudmFsdWVzKSB7CiAgICAgICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5jb25zdGFudFBvb2xTdGF0cwogICAgICAgICAgICAuYWRkKG5ldyBOYW1lZEVudHJ5U3RhdGlzdGljcyhjb25zdGFudFRhZ1RvU3RyaW5nKHRhZykpKTsKICAgICAgfQogICAgfQogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGVudHJpZXMubGVuZ3RoKTsKICAgIGVudHJpZXMuZm9yRWFjaCgoZSkgewogICAgICBpZiAoZSBpcyBfUmVzZXJ2ZWRDb25zdGFudFBvb2xFbnRyeSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZmluYWwgZW50cnlTdGFydCA9IHdyaXRlci5vZmZzZXQ7CgogICAgICBlLndyaXRlKHdyaXRlcik7CgogICAgICBmaW5hbCBlbnRyeVN0YXQgPSBCeXRlY29kZVNpemVTdGF0aXN0aWNzLmNvbnN0YW50UG9vbFN0YXRzW2UudGFnLmluZGV4XTsKICAgICAgZW50cnlTdGF0LnNpemUgKz0gKHdyaXRlci5vZmZzZXQgLSBlbnRyeVN0YXJ0KTsKICAgICAgKytlbnRyeVN0YXQuY291bnQ7CiAgICB9KTsKICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3MuY29uc3RhbnRQb29sU2l6ZSArPSAod3JpdGVyLm9mZnNldCAtIHN0YXJ0KTsKICB9CgogIENvbnN0YW50UG9vbC5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiBzdHJpbmdUYWJsZSA9IHJlYWRlci5zdHJpbmdSZWFkZXIsCiAgICAgICAgb2JqZWN0VGFibGUgPSByZWFkZXIub2JqZWN0UmVhZGVyIHsKICAgIGludCBsZW4gPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmaW5hbCBlID0gbmV3IENvbnN0YW50UG9vbEVudHJ5LnJlYWQocmVhZGVyKTsKICAgICAgX2FkZEVudHJ5KGUpOwogICAgICBpICs9IGUubnVtUmVzZXJ2ZWRFbnRyaWVzOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGVsbignQ29uc3RhbnRQb29sIHsnKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewogICAgICBzYi53cml0ZWxuKCcgIFskaV0gPSAk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IG5ldwovLy8gdmVyc2lvbiBvZiBieXRlY29kZS4KY29uc3QgaW50IGN1cnJlbnRCeXRlY29kZUZvcm1hdFZlcnNpb24gPSAyODsKCmVudW0gT3Bjb2RlIHsKICBrVW51c2VkT3Bjb2RlMDAwLAogIGtVbnVzZWRPcGNvZGUwMDEsCiAga1VudXNlZE9wY29kZTAwMiwKICBrVW51c2VkT3Bjb2RlMDAzLAogIGtVbnVzZWRPcGNvZGUwMDQsCiAga1VudXNlZE9wY29kZTAwNSwKICBrVW51c2VkT3Bjb2RlMDA2LAogIGtVbnVzZWRPcGNvZGUwMDcsCiAga1VudXNlZE9wY29kZTAwOCwKICBrVW51c2VkT3Bjb2RlMDA5LAogIGtVbnVzZWRPcGNvZGUwMTAsCiAga1VudXNlZE9wY29kZTAxMSwKICBrVW51c2VkT3Bjb2RlMDEyLAogIGtVbnVzZWRPcGNvZGUwMTMsCiAga1VudXNlZE9wY29kZTAxNCwKICBrVW51c2VkT3Bjb2RlMDE1LAogIGtVbnVzZWRPcGNvZGUwMTYsCiAga1VudXNlZE9wY29kZTAxNywKICBrVW51c2VkT3Bjb2RlMDE4LAogIGtVbnVzZWRPcGNvZGUwMTksCiAga1VudXNlZE9wY29kZTAyMCwKICBrVW51c2VkT3Bjb2RlMDIxLAogIGtVbnVzZWRPcGNvZGUwMjIsCiAga1VudXNlZE9wY29kZTAyMywKICBrVW51c2VkT3Bjb2RlMDI0LAogIGtVbnVzZWRPcGNvZGUwMjUsCiAga1VudXNlZE9wY29kZTAyNiwKICBrVW51c2VkT3Bjb2RlMDI3LAogIGtVbnVzZWRPcGNvZGUwMjgsCiAga1VudXNlZE9wY29kZTAyOSwKICBrVW51c2VkT3Bjb2RlMDMwLAogIGtVbnVzZWRPcGNvZGUwMzEsCiAga1VudXNlZE9wY29kZTAzMiwKICBrVW51c2VkT3Bjb2RlMDMzLAogIGtVbnVzZWRPcGNvZGUwMzQsCiAga1VudXNlZE9wY29kZTAzNSwKICBrVW51c2VkT3Bjb2RlMDM2LAogIGtVbnVzZWRPcGNvZGUwMzcsCiAga1VudXNlZE9wY29kZTAzOCwKICBrVW51c2VkT3Bjb2RlMDM5LAogIGtVbnVzZWRPcGNvZGUwNDAsCiAga1VudXNlZE9wY29kZTA0MSwKICBrVW51c2VkT3Bjb2RlMDQyLAogIGtVbnVzZWRPcGNvZGUwNDMsCiAga1VudXNlZE9wY29kZTA0NCwKICBrVW51c2VkT3Bjb2RlMDQ1LAogIGtVbnVzZWRPcGNvZGUwNDYsCiAga1VudXNlZE9wY29kZTA0NywKICBrVW51c2VkT3Bjb2RlMDQ4LAogIGtVbnVzZWRPcGNvZGUwNDksCiAga1VudXNlZE9wY29kZTA1MCwKICBrVW51c2VkT3Bjb2RlMDUxLAogIGtVbnVzZWRPcGNvZGUwNTIsCiAga1VudXNlZE9wY29kZTA1MywKICBrVW51c2VkT3Bjb2RlMDU0LAogIGtVbnVzZWRPcGNvZGUwNTUsCiAga1VudXNlZE9wY29kZTA1NiwKICBrVW51c2VkT3Bjb2RlMDU3LAogIGtVbnVzZWRPcGNvZGUwNTgsCiAga1VudXNlZE9wY29kZTA1OSwKICBrVW51c2VkT3Bjb2RlMDYwLAogIGtVbnVzZWRPcGNvZGUwNjEsCiAga1VudXNlZE9wY29kZTA2MiwKICBrVW51c2VkT3Bjb2RlMDYzLAogIGtVbnVzZWRPcGNvZGUwNjQsCiAga1VudXNlZE9wY29kZTA2NSwKICBrVW51c2VkT3Bjb2RlMDY2LAogIGtVbnVzZWRPcGNvZGUwNjcsCiAga1VudXNlZE9wY29kZTA2OCwKICBrVW51c2VkT3Bjb2RlMDY5LAogIGtVbnVzZWRPcGNvZGUwNzAsCiAga1VudXNlZE9wY29kZTA3MSwKICBrVW51c2VkT3Bjb2RlMDcyLAogIGtVbnVzZWRPcGNvZGUwNzMsCiAga1VudXNlZE9wY29kZTA3NCwKICBrVW51c2VkT3Bjb2RlMDc1LAogIGtVbnVzZWRPcGNvZGUwNzYsCiAga1VudXNlZE9wY29kZTA3NywKICBrVW51c2VkT3Bjb2RlMDc4LAogIGtVbnVzZWRPcGNvZGUwNzksCiAga1VudXNlZE9wY29kZTA4MCwKICBrVW51c2VkT3Bjb2RlMDgxLAoKICAvLyBMYXRlIHZhcmlhYmxlcy4KICBrSnVtcElmSW5pdGlhbGl6ZWQsCiAga0p1bXBJZkluaXRpYWxpemVkX1dpZGUsCiAga1B1c2hVbmluaXRpYWxpemVkU2VudGluZWwsCgogIGtUcmFwLAoKICAvLyBQcm9sb2d1ZSBhbmQgc3RhY2sgbWFuYWdlbWVudC4KICBrRW50cnksCiAga0VudHJ5X1dpZGUsCiAga0VudHJ5Rml4ZWQsCiAga0VudHJ5Rml4ZWRfV2lkZSwKICBrRW50cnlPcHRpb25hbCwKICBrVW51c2VkMDAsIC8vIFJlc2VydmVkIGZvciBFbnRyeU5vTG9jYWxzLgogIGtMb2FkQ29uc3RhbnQsCiAga0xvYWRDb25zdGFudF9XaWRlLAogIGtGcmFtZSwKICBrRnJhbWVfV2lkZSwKICBrQ2hlY2tGdW5jdGlvblR5cGVBcmdzLAogIGtDaGVja0Z1bmN0aW9uVHlwZUFyZ3NfV2lkZSwKICBrQ2hlY2tTdGFjaywKICBrRGVidWdDaGVjaywKICBrSnVtcElmVW5jaGVja2VkLAogIGtKdW1wSWZVbmNoZWNrZWRfV2lkZSwKCiAgLy8gT2JqZWN0IGFsbG9jYXRpb24uCiAga0FsbG9jYXRlLAogIGtBbGxvY2F0ZV9XaWRlLAogIGtBbGxvY2F0ZVQsCiAga0NyZWF0ZUFycmF5VE9TLAogIGtBbGxvY2F0ZUNsb3N1cmUsCiAga0FsbG9jYXRlQ2xvc3VyZV9XaWRlLAoKICAvLyBDb250ZXh0IGFsbG9jYXRpb24gYW5kIGFjY2Vzcy4KICBrQWxsb2NhdGVDb250ZXh0LAogIGtBbGxvY2F0ZUNvbnRleHRfV2lkZSwKICBrQ2xvbmVDb250ZXh0LAogIGtDbG9uZUNvbnRleHRfV2lkZSwKICBrTG9hZENvbnRleHRQYXJlbnQsCiAga1N0b3JlQ29udGV4dFBhcmVudCwKICBrTG9hZENvbnRleHRWYXIsCiAga0xvYWRDb250ZXh0VmFyX1dpZGUsCiAga1VudXNlZDA0LCAvLyBSZXNlcnZlZCBmb3IgTG9hZENvbnRleHRWYXIwCiAga1VudXNlZDA1LAogIGtTdG9yZUNvbnRleHRWYXIsCiAga1N0b3JlQ29udGV4dFZhcl9XaWRlLAoKICAvLyBDb25zdGFudHMuCiAga1B1c2hDb25zdGFudCwKICBrUHVzaENvbnN0YW50X1dpZGUsCiAga1VudXNlZDA2LCAvLyBSZXNlcnZlZCBmb3IgUHVzaENvbnN0YW50MAogIGtVbnVzZWQwNywKICBrUHVzaFRydWUsCiAga1B1c2hGYWxzZSwKICBrUHVzaEludCwKICBrUHVzaEludF9XaWRlLAogIGtVbnVzZWQwOCwgLy8gUmVzZXJ2ZWQgZm9yIFB1c2hJbnQwCiAga1VudXNlZDA5LCAvLyBSZXNlcnZlZCBmb3IgUHVzaEludDEKICBrVW51c2VkMTAsIC8vIFJlc2VydmVkIGZvciBQdXNoSW50MgogIGtVbnVzZWQxMSwKICBrUHVzaE51bGwsCgogIC8vIExvY2FscyBhbmQgZXhwcmVzc2lvbiBzdGFjay4KICBrRHJvcDEsCiAga1B1c2gsCiAga1B1c2hfV2lkZSwKICBrVW51c2VkMTIsIC8vIFJlc2VydmVkIGZvciBQdXNoTG9jYWwwCiAga1VudXNlZDEzLCAvLyBSZXNlcnZlZCBmb3IgUHVzaExvY2FsMQogIGtVbnVzZWQxNCwgLy8gUmVzZXJ2ZWQgZm9yIFB1c2hMb2NhbDIKICBrVW51c2VkMTUsIC8vIFJlc2VydmVkIGZvciBQdXNoTG9jYWwzCiAga1VudXNlZDE2LCAvLyBSZXNlcnZlZCBmb3IgUHVzaFBhcmFtTGFzdDAKICBrVW51c2VkMTcsIC8vIFJlc2VydmVkIGZvciBQdXNoUGFyYW1MYXN0MQogIGtQb3BMb2NhbCwKICBrUG9wTG9jYWxfV2lkZSwKICBrTG9hZFN0YXRpYywKICBrTG9hZFN0YXRpY19XaWRlLAogIGtTdG9yZUxvY2FsLAogIGtTdG9yZUxvY2FsX1dpZGUsCgogIC8vIEluc3RhbmNlIGZpZWxkcyBhbmQgYXJyYXlzLgogIGtMb2FkRmllbGRUT1MsCiAga0xvYWRGaWVsZFRPU19XaWRlLAogIGtTdG9yZUZpZWxkVE9TLAogIGtTdG9yZUZpZWxkVE9TX1dpZGUsCiAga1N0b3JlSW5kZXhlZFRPUywKICBrVW51c2VkMjAsCgogIC8vIExhdGUgZmllbGRzLgogIGtJbml0TGF0ZUZpZWxkLAogIGtJbml0TGF0ZUZpZWxkX1dpZGUsCgogIC8vIFN0YXRpYyBmaWVsZHMuCiAga1N0b3JlU3RhdGljVE9TLAogIGtTdG9yZVN0YXRpY1RPU19XaWRlLAoKICAvLyBKdW1wcy4KICBrSnVtcCwKICBrSnVtcF9XaWRlLAogIGtKdW1wSWZOb0Fzc2VydHMsCiAga0p1bXBJZk5vQXNzZXJ0c19XaWRlLAogIGtKdW1wSWZOb3RaZXJvVHlwZUFyZ3MsCiAga0p1bXBJZk5vdFplcm9UeXBlQXJnc19XaWRlLAogIGtKdW1wSWZFcVN0cmljdCwKICBrSnVtcElmRXFTdHJpY3RfV2lkZSwKICBrSnVtcElmTmVTdHJpY3QsCiAga0p1bXBJZk5lU3RyaWN0X1dpZGUsCiAga0p1bXBJZlRydWUsCiAga0p1bXBJZlRydWVfV2lkZSwKICBrSnVtcElmRmFsc2UsCiAga0p1bXBJZkZhbHNlX1dpZGUsCiAga0p1bXBJZk51bGwsCiAga0p1bXBJZk51bGxfV2lkZSwKICBrSnVtcElmTm90TnVsbCwKICBrSnVtcElmTm90TnVsbF9XaWRlLAoKICAvLyBDYWxscy4KICBrRGlyZWN0Q2FsbCwKICBrRGlyZWN0Q2FsbF9XaWRlLAogIGtVbmNoZWNrZWREaXJlY3RDYWxsLAogIGtVbmNoZWNrZWREaXJlY3RDYWxsX1dpZGUsCiAga0ludGVyZmFjZUNhbGwsCiAga0ludGVyZmFjZUNhbGxfV2lkZSwKICBrVW51c2VkMjMsIC8vIFJlc2VydmVkIGZvciBJbnRlcmZhY2VDYWxsMQogIGtVbnVzZWQyNCwgLy8gUmVzZXJ2ZWQgZm9yIEludGVyZmFjZUNhbGwxX1dpZGUKICBrSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbCwKICBrSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbF9XaWRlLAogIGtVbmNoZWNrZWRDbG9zdXJlQ2FsbCwKICBrVW5jaGVja2VkQ2xvc3VyZUNhbGxfV2lkZSwKICBrVW5jaGVja2VkSW50ZXJmYWNlQ2FsbCwKICBrVW5jaGVja2VkSW50ZXJmYWNlQ2FsbF9XaWRlLAogIGtEeW5hbWljQ2FsbCwKICBrRHluYW1pY0NhbGxfV2lkZSwKICBrTmF0aXZlQ2FsbCwKICBrTmF0aXZlQ2FsbF9XaWRlLAogIGtSZXR1cm5UT1MsCiAga1VudXNlZDI5LAoKICAvLyBUeXBlcyBhbmQgdHlwZSBjaGVja3MuCiAga0Fzc2VydEFzc2lnbmFibGUsCiAga0Fzc2VydEFzc2lnbmFibGVfV2lkZSwKICBrVW51c2VkMzAsIC8vIFJlc2VydmVkIGZvciBBc1NpbXBsZVR5cGUKICBrVW51c2VkMzEsIC8vIFJlc2VydmVkIGZvciBBc1NpbXBsZVR5cGVfV2lkZQogIGtBc3NlcnRCb29sZWFuLAogIGtBc3NlcnRTdWJ0eXBlLAogIGtMb2FkVHlwZUFyZ3VtZW50c0ZpZWxkLAogIGtMb2FkVHlwZUFyZ3VtZW50c0ZpZWxkX1dpZGUsCiAga0luc3RhbnRpYXRlVHlwZSwKICBrSW5zdGFudGlhdGVUeXBlX1dpZGUsCiAga0luc3RhbnRpYXRlVHlwZUFyZ3VtZW50c1RPUywKICBrSW5zdGFudGlhdGVUeXBlQXJndW1lbnRzVE9TX1dpZGUsCiAga1VudXNlZDMyLCAvLyBSZXNlcnZlZCBmb3IgSXNUeXBlCiAga1VudXNlZDMzLCAvLyBSZXNlcnZlZCBmb3IgSXNUeXBlX1dpZGUKICBrVW51c2VkMzQsIC8vIFJlc2VydmVkIGZvciBJc1NpbXBsZVR5cGUKICBrVW51c2VkMzUsIC8vIFJlc2VydmVkIGZvciBJc1NpbXBsZVR5cGVfV2lkZQoKICAvLyBFeGNlcHRpb24gaGFuZGxpbmcuCiAga1Rocm93LAogIGtTZXRGcmFtZSwKICBrTW92ZVNwZWNpYWwsCiAga01vdmVTcGVjaWFsX1dpZGUsCgogIC8vIEJvb2wgb3BlcmF0aW9ucy4KICBrQm9vbGVhbk5lZ2F0ZVRPUywKCiAgLy8gTnVsbCBvcGVyYXRpb25zLgogIGtFcXVhbHNOdWxsLAogIGtOdWxsQ2hlY2ssCiAga051bGxDaGVja19XaWRlLAoKICAvLyBJbnQgb3BlcmF0aW9ucy4KICBrTmVnYXRlSW50LAogIGtBZGRJbnQsCiAga1N1YkludCwKICBrTXVsSW50LAogIGtUcnVuY0RpdkludCwKICBrTW9kSW50LAogIGtCaXRBbmRJbnQsCiAga0JpdE9ySW50LAogIGtCaXRYb3JJbnQsCiAga1NobEludCwKICBrU2hySW50LAogIGtDb21wYXJlSW50RXEsCiAga0NvbXBhcmVJbnRHdCwKICBrQ29tcGFyZUludEx0LAogIGtDb21wYXJlSW50R2UsCiAga0NvbXBhcmVJbnRMZSwKCiAgLy8gRG91YmxlIG9wZXJhdGlvbnMuCiAga05lZ2F0ZURvdWJsZSwKICBrQWRkRG91YmxlLAogIGtTdWJEb3VibGUsCiAga011bERvdWJsZSwKICBrRGl2RG91YmxlLAogIGtDb21wYXJlRG91YmxlRXEsCiAga0NvbXBhcmVEb3VibGVHdCwKICBrQ29tcGFyZURvdWJsZUx0LAogIGtDb21wYXJlRG91YmxlR2UsCiAga0NvbXBhcmVEb3VibGVMZSwKfQoKLy8vIENvbXBhY3QgdmFyaWFudHMgb2Ygb3Bjb2RlcyBhcmUgYWx3YXlzIGV2ZW4uCi8vLyBXaWRlIHZhcmlhbnQgPSBvcGNvZGUgKyBrV2lkZU1vZGlmaWVyLgpjb25zdCBpbnQga1dpZGVNb2RpZmllciA9IDE7CgovLy8gT3Bjb2RlIHNob3VsZCBmaXQgaW50byAxIGJ5dGUuCmNvbnN0IGludCBrTWF4T3Bjb2RlcyA9IDI1NjsKCmVudW0gRW5jb2RpbmcgewogIGswLCAvLyBObyBvcGVyYW5kcy4KICBrQSwgLy8gMSBvcGVyYW5kOiBBID0gOC1iaXQgdW5zaWduZWQuCiAga0QsIC8vIDEgb3BlcmFuZDogRCA9IDgvMzItYml0IHVuc2lnbmVkLgogIGtYLCAvLyAxIG9wZXJhbmQ6IFggPSA4LzMyLWJpdCBzaWduZWQuCiAga1QsIC8vIDEgb3BlcmFuZDogVCA9IDgvMjQtYml0IHNpZ25lZC4KICBrQUUsIC8vIDIgb3BlcmFuZHM6IEEgPSA4LWJpdCB1bnNpZ25lZCwgRSA9IDgvMzItYml0IHVuc2lnbmVkCiAga0FZLCAvLyAyIG9wZXJhbmRzOiBBID0gOC1iaXQgdW5zaWduZWQsIFkgPSA4LzMyLWJpdCBzaWduZWQKICBrREYsIC8vIDIgb3BlcmFuZHM6IEQgPSA4LzMyLWJpdCB1bnNpZ25lZCwgRiA9IDgtYml0IHVuc2lnbmVkCiAga0FCQywgLy8gMyBvcGVyYW5kczogQSwgQiwgQyAtIDgtYml0IHVuc2lnbmVkLgp9CgppbnQgaW5zdHJ1Y3Rpb25TaXplKEVuY29kaW5nIGVuY29kaW5nLCBib29sIGlzV2lkZSkgewogIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgIGNhc2UgRW5jb2RpbmcuazA6CiAgICAgIHJldHVybiAxOwogICAgY2FzZSBFbmNvZGluZy5rQToKICAgICAgcmV0dXJuIDI7CiAgICBjYXNlIEVuY29kaW5nLmtEOgogICAgICByZXR1cm4gaXNXaWRlID8gNSA6IDI7CiAgICBjYXNlIEVuY29kaW5nLmtYOgogICAgICByZXR1cm4gaXNXaWRlID8gNSA6IDI7CiAgICBjYXNlIEVuY29kaW5nLmtUOgogICAgICByZXR1cm4gaXNXaWRlID8gNCA6IDI7CiAgICBjYXNlIEVuY29kaW5nLmtBRToKICAgICAgcmV0dXJuIGlzV2lkZSA/IDYgOiAzOwogICAgY2FzZSBFbmNvZGluZy5rQVk6CiAgICAgIHJldHVybiBpc1dpZGUgPyA2IDogMzsKICAgIGNhc2UgRW5jb2Rpbmcua0RGOgogICAgICByZXR1cm4gaXNXaWRlID8gNiA6IDM7CiAgICBjYXNlIEVuY29kaW5nLmtBQkM6CiAgICAgIHJldHVybiA0OwogIH0KICB0aHJvdyAnVW5leHBlY3RlZCBpbnN0cnVjdGlvbiBlbmNvZGluZyAkZW5jb2RpbmcnOwp9CgplbnVtIE9wZXJhbmQgewogIG5vbmUsIC8vIGlnbm9yZWQgLyBub24tZXhpc3RlbnQgb3BlcmFuZAogIGltbSwgLy8gaW1tZWRpYXRlIG9wZXJhbmQKICBsaXQsIC8vIGNvbnN0YW50IGxpdGVyYWwgZnJvbSBvYmplY3QgcG9vbAogIHJlZywgLy8gcmVnaXN0ZXIgKHVuc2lnbmVkIEZQIHJlbGF0aXZlIGxvY2FsKQogIHhlZywgLy8geC1yZWdpc3RlciAoc2lnbmVkIEZQIHJlbGF0aXZlIGxvY2FsKQogIHRndCwgLy8ganVtcCB0YXJnZXQgcmVsYXRpdmUgdG8gdGhlIFBDIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uCiAgc3BlLCAvLyBTcGVjaWFsSW5kZXgKfQoKY2xhc3MgRm9ybWF0IHsKICBmaW5hbCBFbmNvZGluZyBlbmNvZGluZzsKICBmaW5hbCBMaXN0PE9wZXJhbmQ+IG9wZXJhbmRzOwogIGNvbnN0IEZvcm1hdCh0aGlzLmVuY29kaW5nLCB0aGlzLm9wZXJhbmRzKTsKfQoKY29uc3QgTWFwPE9wY29kZSwgRm9ybWF0PiBCeXRlY29kZUZvcm1hdHMgPSBjb25zdCB7CiAgT3Bjb2RlLmtUcmFwOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmswLCBjb25zdCBbT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rRW50cnk6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0QsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0VudHJ5Rml4ZWQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0FFLCBjb25zdCBbT3BlcmFuZC5pbW0sIE9wZXJhbmQuaW1tLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0VudHJ5T3B0aW9uYWw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0FCQywgY29uc3QgW09wZXJhbmQuaW1tLCBPcGVyYW5kLmltbSwgT3BlcmFuZC5pbW1dKSwKICBPcGNvZGUua0xvYWRDb25zdGFudDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rQUUsIGNvbnN0IFtPcGVyYW5kLnJlZywgT3BlcmFuZC5saXQsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rRnJhbWU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0QsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0NoZWNrRnVuY3Rpb25UeXBlQXJnczogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rQUUsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5yZWcsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rQ2hlY2tTdGFjazogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rQSwgY29uc3QgW09wZXJhbmQuaW1tLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rRGVidWdDaGVjazogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0FsbG9jYXRlOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtELCBjb25zdCBbT3BlcmFuZC5saXQsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtBbGxvY2F0ZVQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDcmVhdGVBcnJheVRPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0FsbG9jYXRlQ29udGV4dDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rQUUsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5pbW0sIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rQ2xvbmVDb250ZXh0OiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtBRSwgY29uc3QgW09wZXJhbmQuaW1tLCBPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtMb2FkQ29udGV4dFBhcmVudDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1N0b3JlQ29udGV4dFBhcmVudDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0xvYWRDb250ZXh0VmFyOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtBRSwgY29uc3QgW09wZXJhbmQuaW1tLCBPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtTdG9yZUNvbnRleHRWYXI6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0FFLCBjb25zdCBbT3BlcmFuZC5pbW0sIE9wZXJhbmQuaW1tLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1B1c2hDb25zdGFudDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rRCwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rUHVzaE51bGw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtQdXNoVHJ1ZTogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1B1c2hGYWxzZTogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1B1c2hJbnQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1gsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0Ryb3AxOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmswLCBjb25zdCBbT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rUHVzaDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rWCwgY29uc3QgW09wZXJhbmQueGVnLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rUG9wTG9jYWw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1gsIGNvbnN0IFtPcGVyYW5kLnhlZywgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1N0b3JlTG9jYWw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1gsIGNvbnN0IFtPcGVyYW5kLnhlZywgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0xvYWRGaWVsZFRPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rRCwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rU3RvcmVGaWVsZFRPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rRCwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rU3RvcmVJbmRleGVkVE9TOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmswLCBjb25zdCBbT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSW5pdExhdGVGaWVsZDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rRCwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rUHVzaFVuaW5pdGlhbGl6ZWRTZW50aW5lbDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0p1bXBJZkluaXRpYWxpemVkOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtULCBjb25zdCBbT3BlcmFuZC50Z3QsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtMb2FkU3RhdGljOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtELCBjb25zdCBbT3BlcmFuZC5saXQsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtTdG9yZVN0YXRpY1RPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rRCwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSnVtcDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rVCwgY29uc3QgW09wZXJhbmQudGd0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSnVtcElmTm9Bc3NlcnRzOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtULCBjb25zdCBbT3BlcmFuZC50Z3QsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtKdW1wSWZOb3RaZXJvVHlwZUFyZ3M6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1QsIGNvbnN0IFtPcGVyYW5kLnRndCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0p1bXBJZkVxU3RyaWN0OiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtULCBjb25zdCBbT3BlcmFuZC50Z3QsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtKdW1wSWZOZVN0cmljdDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rVCwgY29uc3QgW09wZXJhbmQudGd0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSnVtcElmVHJ1ZTogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rVCwgY29uc3QgW09wZXJhbmQudGd0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSnVtcElmRmFsc2U6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1QsIGNvbnN0IFtPcGVyYW5kLnRndCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0p1bXBJZk51bGw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1QsIGNvbnN0IFtPcGVyYW5kLnRndCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0p1bXBJZk5vdE51bGw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua1QsIGNvbnN0IFtPcGVyYW5kLnRndCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0p1bXBJZlVuY2hlY2tlZDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rVCwgY29uc3QgW09wZXJhbmQudGd0LCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSW50ZXJmYWNlQ2FsbDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rREYsIGNvbnN0IFtPcGVyYW5kLmxpdCwgT3BlcmFuZC5pbW0sIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rREYsIGNvbnN0IFtPcGVyYW5kLmxpdCwgT3BlcmFuZC5pbW0sIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rRHluYW1pY0NhbGw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0RGLCBjb25zdCBbT3BlcmFuZC5saXQsIE9wZXJhbmQuaW1tLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua05hdGl2ZUNhbGw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0QsIGNvbnN0IFtPcGVyYW5kLmxpdCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1JldHVyblRPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0Fzc2VydEFzc2lnbmFibGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0FFLCBjb25zdCBbT3BlcmFuZC5pbW0sIE9wZXJhbmQubGl0LCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0Fzc2VydEJvb2xlYW46IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0EsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0Fzc2VydFN1YnR5cGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtMb2FkVHlwZUFyZ3VtZW50c0ZpZWxkOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtELCBjb25zdCBbT3BlcmFuZC5saXQsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtJbnN0YW50aWF0ZVR5cGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0QsIGNvbnN0IFtPcGVyYW5kLmxpdCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0luc3RhbnRpYXRlVHlwZUFyZ3VtZW50c1RPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rQUUsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5saXQsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rVGhyb3c6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0EsIGNvbnN0IFtPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua01vdmVTcGVjaWFsOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtBWSwgY29uc3QgW09wZXJhbmQuc3BlLCBPcGVyYW5kLnhlZywgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtTZXRGcmFtZTogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rQSwgY29uc3QgW09wZXJhbmQuaW1tLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rQm9vbGVhbk5lZ2F0ZVRPUzogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0VxdWFsc051bGw6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtOdWxsQ2hlY2s6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0QsIGNvbnN0IFtPcGVyYW5kLmxpdCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua05lZ2F0ZUludDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua0FkZEludDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1N1YkludDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua011bEludDogY29uc3QgRm9ybWF0KAogICAgICBFbmNvZGluZy5rMCwgY29uc3QgW09wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1RydW5jRGl2SW50OiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmswLCBjb25zdCBbT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rTW9kSW50OiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmswLCBjb25zdCBbT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rQml0QW5kSW50OiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmswLCBjb25zdCBbT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZV0pLAogIE9wY29kZS5rQml0T3JJbnQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtCaXRYb3JJbnQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtTaGxJbnQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtTaHJJbnQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlSW50RXE6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlSW50R3Q6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlSW50THQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlSW50R2U6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlSW50TGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtEaXJlY3RDYWxsOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtERiwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtVbmNoZWNrZWREaXJlY3RDYWxsOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtERiwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtBbGxvY2F0ZUNsb3N1cmU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2Rpbmcua0QsIGNvbnN0IFtPcGVyYW5kLmxpdCwgT3BlcmFuZC5ub25lLCBPcGVyYW5kLm5vbmVdKSwKICBPcGNvZGUua1VuY2hlY2tlZENsb3N1cmVDYWxsOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtERiwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtVbmNoZWNrZWRJbnRlcmZhY2VDYWxsOiBjb25zdCBGb3JtYXQoCiAgICAgIEVuY29kaW5nLmtERiwgY29uc3QgW09wZXJhbmQubGl0LCBPcGVyYW5kLmltbSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtOZWdhdGVEb3VibGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtBZGREb3VibGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtTdWJEb3VibGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtNdWxEb3VibGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtEaXZEb3VibGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlRG91YmxlRXE6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlRG91YmxlR3Q6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlRG91YmxlTHQ6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlRG91YmxlR2U6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCiAgT3Bjb2RlLmtDb21wYXJlRG91YmxlTGU6IGNvbnN0IEZvcm1hdCgKICAgICAgRW5jb2RpbmcuazAsIGNvbnN0IFtPcGVyYW5kLm5vbmUsIE9wZXJhbmQubm9uZSwgT3BlcmFuZC5ub25lXSksCn07CgovLyBTaG91bGQgbWF0Y2ggY29uc3RhbnQgaW4gcnVudGltZS92bS9zdGFja19mcmFtZV9rYmMuaC4KY29uc3QgaW50IGtQYXJhbUVuZFNsb3RGcm9tRnAgPSA0OwoKZW51bSBTcGVjaWFsSW5kZXggewogIGV4Y2VwdGlvbiwKICBzdGFja1RyYWNlLAp9CgovLy8gUmV0dXJucyBbdHJ1ZV0gaWYgdGhlcmUgaXMgYSB3aWRlIHZhcmlhbnQgZm9yIHRoZSBnaXZlbiBvcGNvZGUuCmJvb2wgaGFzV2lkZVZhcmlhbnQoT3Bjb2RlIG9wY29kZSkgewogIGZpbmFsIGVuY29kaW5nID0gQnl0ZWNvZGVGb3JtYXRzW29wY29kZV0uZW5jb2Rpbmc7CiAgc3dpdGNoIChlbmNvZGluZykgewogICAgY2FzZSBFbmNvZGluZy5rMDoKICAgIGNhc2UgRW5jb2Rpbmcua0E6CiAgICBjYXNlIEVuY29kaW5nLmtBQkM6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIGNhc2UgRW5jb2Rpbmcua0Q6CiAgICBjYXNlIEVuY29kaW5nLmtYOgogICAgY2FzZSBFbmNvZGluZy5rVDoKICAgIGNhc2UgRW5jb2Rpbmcua0FFOgogICAgY2FzZSBFbmNvZGluZy5rQVk6CiAgICBjYXNlIEVuY29kaW5nLmtERjoKICAgICAgcmV0dXJuIHRydWU7CiAgfQogIHRocm93ICdVbmV4cGVjdGVkIGluc3RydWN0aW9uIGVuY29kaW5nICRlbmNvZGluZyc7Cn0KCmJvb2wgaXNXaWRlT3Bjb2RlKE9wY29kZSBvcGNvZGUpIHsKICByZXR1cm4gKEJ5dGVjb2RlRm9ybWF0c1tvcGNvZGVdID09IG51bGwpICYmCiAgICAgIGhhc1dpZGVWYXJpYW50KE9wY29kZS52YWx1ZXNbb3Bjb2RlLmluZGV4IC0ga1dpZGVNb2RpZmllcl0pOwp9CgpPcGNvZGUgZnJvbVdpZGVPcGNvZGUoT3Bjb2RlIG9wY29kZSkgewogIGFzc2VydChpc1dpZGVPcGNvZGUob3Bjb2RlKSk7CiAgcmV0dXJuIE9wY29kZS52YWx1ZXNbb3Bjb2RlLmluZGV4IC0ga1dpZGVNb2RpZmllcl07Cn0KCnZvaWQgdmVyaWZ5Qnl0ZWNvZGVJbnN0cnVjdGlvbkRlY2xhcmF0aW9ucygpIHsKICBjb25zdCBTdHJpbmcga1dpZGVTdWZmaXggPSAnX1dpZGUnOwogIGZvciAoT3Bjb2RlIG9wY29kZSBpbiBPcGNvZGUudmFsdWVzKSB7CiAgICBmaW5hbCBmb3JtYXQgPSBCeXRlY29kZUZvcm1hdHNbb3Bjb2RlXTsKICAgIGlmIChvcGNvZGUudG9TdHJpbmcoKS5lbmRzV2l0aChrV2lkZVN1ZmZpeCkpIHsKICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgJ0J5dGVjb2RlIGZvcm1hdCBzaG91bGQgbm90IGJlIGRlZmluZWQgZm9yIHdpZGUgb3Bjb2RlICRvcGNvZGUuJzsKICAgICAgfQogICAgICBmaW5hbCBPcGNvZGUgY29tcGFjdCA9IE9wY29kZS52YWx1ZXNbb3Bjb2RlLmluZGV4IC0ga1dpZGVNb2RpZmllcl07CiAgICAgIGlmIChjb21wYWN0LnRvU3RyaW5nKCkgKyBrV2lkZVN1ZmZpeCAhPSBvcGNvZGUudG9TdHJpbmcoKSkgewogICAgICAgIHRocm93ICdXaWRlIG9wY29kZSAkb3Bjb2RlIHNob3VsZCBpbW1lZGlhdGVseSBmb2xsb3cgaXRzIGNvbXBhY3Qgb3Bjb2RlIChwcmV2aW91cyBvcGNvZGUgaXMgJGNvbXBhY3QpLic7CiAgICAgIH0KICAgICAgaWYgKCFoYXNXaWRlVmFyaWFudChjb21wYWN0KSkgewogICAgICAgIHRocm93ICdXaWRlIG9wY29kZSAkb3Bjb2RlIHNob3VsZCBub3QgYmUgZGVmaW5lZCBmb3Igb3Bjb2RlICRjb21wYWN0IHdpdGggZW5jb2RpbmcgJHtCeXRlY29kZUZvcm1hdHNbY29tcGFjdF0uZW5jb2Rpbmd9Lic7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChoYXNXaWRlVmFyaWFudChvcGNvZGUpKSB7CiAgICAgIGlmIChPcGNvZGUudmFsdWVzW29wY29kZS5pbmRleCArIGtXaWRlTW9kaWZpZXJdLnRvU3RyaW5nKCkgIT0KICAgICAgICAgIG9wY29kZS50b1N0cmluZygpICsga1dpZGVTdWZmaXgpIHsKICAgICAgICB0aHJvdyAnT3Bjb2RlICRvcGNvZGUka1dpZGVTdWZmaXggc2hvdWxkIGltbWVkaWFseSBmb2xsb3cgJG9wY29kZS4nOwogICAgICB9CiAgICAgIGlmIChvcGNvZGUuaW5kZXguaXNPZGQpIHsKICAgICAgICB0aHJvdyAnT3Bjb2RlICRvcGNvZGUgKCR7Zm9ybWF0LmVuY29kaW5nfSkgaGFzIGEgd2lkZSB2YXJpYW50IGFuZCBzaG91bGQgYmUgZXZlbic7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKE9wY29kZS52YWx1ZXMubGVuZ3RoID4ga01heE9wY29kZXMpIHsKICAgIHRocm93ICdUb28gbWFueSBvcGNvZGVzJzsKICB9Cn0KCmJvb2wgaXNKdW1wKE9wY29kZSBvcGNvZGUpID0+IEJ5dGVjb2RlRm9ybWF0c1tvcGNvZGVdLmVuY29kaW5nID09IEVuY29kaW5nLmtUOwoKYm9vbCBpc1Rocm93KE9wY29kZSBvcGNvZGUpID0+IG9wY29kZSA9PSBPcGNvZGUua1Rocm93OwoKYm9vbCBpc0NhbGwoT3Bjb2RlIG9wY29kZSkgewogIHN3aXRjaCAob3Bjb2RlKSB7CiAgICBjYXNlIE9wY29kZS5rRGlyZWN0Q2FsbDoKICAgIGNhc2UgT3Bjb2RlLmtVbmNoZWNrZWREaXJlY3RDYWxsOgogICAgY2FzZSBPcGNvZGUua0ludGVyZmFjZUNhbGw6CiAgICBjYXNlIE9wY29kZS5rSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbDoKICAgIGNhc2UgT3Bjb2RlLmtVbmNoZWNrZWRDbG9zdXJlQ2FsbDoKICAgIGNhc2UgT3Bjb2RlLmtVbmNoZWNrZWRJbnRlcmZhY2VDYWxsOgogICAgY2FzZSBPcGNvZGUua0R5bmFtaWNDYWxsOgogICAgY2FzZSBPcGNvZGUua05hdGl2ZUNhbGw6CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKYm9vbCBpc1JldHVybihPcGNvZGUgb3Bjb2RlKSA9PiBvcGNvZGUgPT0gT3Bjb2RlLmtSZXR1cm5UT1M7Cgpib29sIGlzQ29udHJvbEZsb3coT3Bjb2RlIG9wY29kZSkgPT4KICAgIGlzSnVtcChvcGNvZGUpIHx8IGlzVGhyb3cob3Bjb2RlKSB8fCBpc0NhbGwob3Bjb2RlKSB8fCBpc1JldHVybihvcGNvZGUpOwoKYm9vbCBpc1B1c2goT3Bjb2RlIG9wY29kZSkgewogIHN3aXRjaCAob3Bjb2RlKSB7CiAgICBjYXNlIE9wY29kZS5rUHVzaDoKICAgIGNhc2UgT3Bjb2RlLmtQdXNoQ29uc3RhbnQ6CiAgICBjYXNlIE9wY29kZS5rUHVzaE51bGw6CiAgICBjYXNlIE9wY29kZS5rUHVzaFRydWU6CiAgICBjYXNlIE9wY29kZS5rUHVzaEZhbHNlOgogICAgY2FzZSBPcGNvZGUua1B1c2hJbnQ6CiAgICBjYXNlIE9wY29kZS5rUHVzaFVuaW5pdGlhbGl6ZWRTZW50aW5lbDoKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLyBCeXRlY29kZSBpbnN0cnVjdGlvbnMgcmVmZXJlbmNlIGNvbnN0YW50IHBvb2wgaW5kaWNlcyB1c2luZwovLyB1bnNpZ25lZCAzMi1iaXQgb3BlcmFuZHMuCmNvbnN0IGludCBjb25zdGFudFBvb2xJbmRleExpbWl0ID0gMSA8PCAzMjsKCi8vIExvY2FsIHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCB1c2luZyAzMi1iaXQgc2lnbmVkIG9wZXJhbmRzLgpjb25zdCBpbnQgbG9jYWxWYXJpYWJsZUluZGV4TGltaXQgPSAxIDw8IDMxOwoKLy8gQ2FwdHVyZWQgdmFyaWFibGVzIGFyZSByZWZlcmVuY2VkIHVzaW5nIDMyLWJpdCB1bnNpZ25lZCBvcGVyYW5kcy4KY29uc3QgaW50IGNhcHR1cmVkVmFyaWFibGVJbmRleExpbWl0ID0gMSA8PCAzMjsKCi8vIENvbnRleHQgSURzIGFyZSByZWZlcmVuY2VkIHVzaW5nIDgtYml0IHVuc2lnbmVkIG9wZXJhbmRzLgpjb25zdCBpbnQgY29udGV4dElkTGltaXQgPSAxIDw8IDg7CgovLyBOdW1iZXIgb2YgYXJndW1lbnRzIGlzIGVuY29kZWQgYXMgOC1iaXQgdW5zaWduZWQgb3BlcmFuZC4KY29uc3QgaW50IGFyZ3VtZW50c0xpbWl0ID0gMSA8PCA4OwoKLy8gQmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucyB0aHJvd24gd2hlbiBjZXJ0YWluIGxpbWl0IG9mIGJ5dGVjb2RlCi8vIGZvcm1hdCBpcyBleGNlZWRlZC4KYWJzdHJhY3QgY2xhc3MgQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uIHt9CgovLyBDb25zdGFudHMgc3BlY2lmeWluZyB0aGUgTk5CRCBtb2RlIG9mIGxpYnJhcmllcy4KLy8gTXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBlbnVtIGNsYXNzIE5OQkRNb2RlIGluIHRoZSBWTS4KY29uc3QgaW50IGtMZWdhY3kgPSAwOwpjb25zdCBpbnQga09wdGVkSW4gPSAxOwqCqwBOTjwBUQEZATVDQRktAQ4UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUARUWGx4BCQEkCg8PFBIsERYKDxofDw8UGQEYDRIOExQZASQUGREWFhcTGC0NFBkBEBEWKw0NDgwRJiYmDQ0BIgoJDigoKCgsLA0SDxQPFAEhERYSFxQNARISFwEUExgBDAkOFBkaHxMYExgPFBAVDxQSFwEMDxQYHRIXLDEeIxkeGyAQFQ8UDg0BHBUaKi8SEhsgFBkgJSQpKi8BGQoNEBUBFhUBFg8OEwEVDgsLCxALDg0OCwsREREREQEYEQ4ODg4UFBQUFAIBMSsdASMdARAWKCspKUA+QDECATYWFhAWEBYdFh0WHRcdFx0XHRgQBDUCAQ8qHCwwMEQXAgEPGyAuAgE0HkYfRSRFJ0UmRR9FL0UkRSRGIkUjRihGKUUmRStGLEYoRSlFJkUiRiJGI0YhRR9GHkUiRSRFJkUnRSlGJ0UzRitFJEUoRR5FKUUvRShFKEUkRSVFJEUnRSlFJ0UzRSVFJEUjRipFJ0UnRjBFKUU1RR9FJUUiRSpGJEYjRSNGIEYgRiBGJUYgRiNGIkYjRiBGIEYmRiZGJkYmRiZGJEUtRSlFLkUwRSZGI0YjRiNGI0YpRilGKUYpRilGAwE6IwEUDQ4CAUQlNRYWFhgUFhYWFxcXEwQ1AgEjLkMCAScgNgIBLyYpLDMcUAhKQ3EIJoCDCAYaEAYiRC1NCCBbCAYELB4EAgFPATgBHRQdJiAsJykeHRMNFAQCAT0BJU0BHRQXHxsbHBosEw0UBAIBPx0sAUAtAUUwAT0jAT0jAUMXMQE0PBcYARxwYWNrYWdlOnZtL2J5dGVjb2RlL2RiYy5kYXJ0UWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9ieXRlY29kZS9kZWNsYXJhdGlvbnMuZGFydMAAzDwvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5ieXRlY29kZS5kZWNsYXJhdGlvbnM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IFRyZWVOb2RlLCBsaXN0SGFzaENvZGUsIGxpc3RFcXVhbHM7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKaW1wb3J0ICdieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgQnVmZmVyZWRXcml0ZXIsCiAgICAgICAgQnVmZmVyZWRSZWFkZXIsCiAgICAgICAgQnl0ZWNvZGVEZWNsYXJhdGlvbiwKICAgICAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLAogICAgICAgIFN0cmluZ1RhYmxlOwppbXBvcnQgJ2NvbnN0YW50X3Bvb2wuZGFydCcgc2hvdyBDb25zdGFudFBvb2w7CmltcG9ydCAnZGJjLmRhcnQnIHNob3cgY3VycmVudEJ5dGVjb2RlRm9ybWF0VmVyc2lvbjsKaW1wb3J0ICdkaXNhc3NlbWJsZXIuZGFydCcgc2hvdyBCeXRlY29kZURpc2Fzc2VtYmxlcjsKaW1wb3J0ICdleGNlcHRpb25zLmRhcnQnIHNob3cgRXhjZXB0aW9uc1RhYmxlOwppbXBvcnQgJ2xvY2FsX3ZhcmlhYmxlX3RhYmxlLmRhcnQnIHNob3cgTG9jYWxWYXJpYWJsZVRhYmxlOwppbXBvcnQgJ29iamVjdF90YWJsZS5kYXJ0JyBzaG93IE9iamVjdFRhYmxlLCBPYmplY3RIYW5kbGUsIE5hbWVBbmRUeXBlOwppbXBvcnQgJ3NvdXJjZV9wb3NpdGlvbnMuZGFydCcgc2hvdyBMaW5lU3RhcnRzLCBTb3VyY2VQb3NpdGlvbnM7CgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CgpjbGFzcyBMaWJyYXJ5RGVjbGFyYXRpb24gZXh0ZW5kcyBCeXRlY29kZURlY2xhcmF0aW9uIHsKICBzdGF0aWMgY29uc3QgdXNlc0RhcnRNaXJyb3JzRmxhZyA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgdXNlc0RhcnRGZmlGbGFnID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBoYXNFeHRlbnNpb25zRmxhZyA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdEZsYWcgPSAxIDw8IDM7CgogIE9iamVjdEhhbmRsZSBpbXBvcnRVcmk7CiAgZmluYWwgaW50IGZsYWdzOwogIGZpbmFsIE9iamVjdEhhbmRsZSBuYW1lOwogIGZpbmFsIE9iamVjdEhhbmRsZSBzY3JpcHQ7CiAgZmluYWwgTGlzdDxPYmplY3RIYW5kbGU+IGV4dGVuc2lvblVyaXM7CiAgZmluYWwgTGlzdDxDbGFzc0RlY2xhcmF0aW9uPiBjbGFzc2VzOwoKICBMaWJyYXJ5RGVjbGFyYXRpb24odGhpcy5pbXBvcnRVcmksIHRoaXMuZmxhZ3MsIHRoaXMubmFtZSwgdGhpcy5zY3JpcHQsCiAgICAgIHRoaXMuZXh0ZW5zaW9uVXJpcywgdGhpcy5jbGFzc2VzKTsKCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIGZpbmFsIHN0YXJ0ID0gd3JpdGVyLm9mZnNldDsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmbGFncyk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QobmFtZSk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3Qoc2NyaXB0KTsKICAgIGlmICgoZmxhZ3MgJiBoYXNFeHRlbnNpb25zRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRMaXN0KGV4dGVuc2lvblVyaXMpOwogICAgfQogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGNsYXNzZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGNscyBpbiBjbGFzc2VzKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChjbHMubmFtZSk7CiAgICAgIHdyaXRlci53cml0ZUxpbmtPZmZzZXQoY2xzKTsKICAgIH0KICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3MubGlicmFyaWVzU2l6ZSArPSAod3JpdGVyLm9mZnNldCAtIHN0YXJ0KTsKICB9CgogIGZhY3RvcnkgTGlicmFyeURlY2xhcmF0aW9uLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBmaW5hbCBmbGFncyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBmaW5hbCBuYW1lID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgIGZpbmFsIHNjcmlwdCA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBmaW5hbCBjbGFzc2VzID0KICAgICAgICBMaXN0PENsYXNzRGVjbGFyYXRpb24+LmdlbmVyYXRlKHJlYWRlci5yZWFkUGFja2VkVUludDMwKCksIChfKSB7CiAgICAgIGZpbmFsIGNsYXNzTmFtZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICAgIHJldHVybiByZWFkZXIucmVhZExpbmtPZmZzZXQ8Q2xhc3NEZWNsYXJhdGlvbj4oKS4ubmFtZSA9IGNsYXNzTmFtZTsKICAgIH0pOwogICAgZmluYWwgZXh0ZW5zaW9uVXJpcyA9ICgoZmxhZ3MgJiBoYXNFeHRlbnNpb25zRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkUGFja2VkTGlzdDxPYmplY3RIYW5kbGU+KCkKICAgICAgICA6IGNvbnN0IDxPYmplY3RIYW5kbGU+W107CiAgICByZXR1cm4gbmV3IExpYnJhcnlEZWNsYXJhdGlvbigKICAgICAgICBudWxsLCBmbGFncywgbmFtZSwgc2NyaXB0LCBleHRlbnNpb25VcmlzLCBjbGFzc2VzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlbG4oJ0xpYnJhcnkgJGltcG9ydFVyaScpOwogICAgc2Iud3JpdGVsbignICAgIG5hbWUgJG5hbWUnKTsKICAgIHNiLndyaXRlbG4oJyAgICBzY3JpcHQgJHNjcmlwdCcpOwogICAgaWYgKChmbGFncyAmIHVzZXNEYXJ0TWlycm9yc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGVsbignICAgIHVzZXMgZGFydDptaXJyb3JzJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgdXNlc0RhcnRGZmlGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlbG4oJyAgICB1c2VzIGRhcnQ6ZmZpJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzRXh0ZW5zaW9uc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGVsbignICAgIGV4dGVuc2lvbnM6ICRleHRlbnNpb25VcmlzJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdEZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGVsbignICAgIGlzIG5uYmQnKTsKICAgIH0KICAgIHNiLndyaXRlbG4oKTsKICAgIGZvciAodmFyIGNscyBpbiBjbGFzc2VzKSB7CiAgICAgIHNiLndyaXRlKGNscyk7CiAgICB9CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9Cn0KCmNsYXNzIENsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBCeXRlY29kZURlY2xhcmF0aW9uIHsKICBzdGF0aWMgY29uc3QgaXNBYnN0cmFjdEZsYWcgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGlzRW51bUZsYWcgPSAxIDw8IDE7CiAgc3RhdGljIGNvbnN0IGhhc1R5cGVQYXJhbXNGbGFnID0gMSA8PCAyOwogIHN0YXRpYyBjb25zdCBoYXNUeXBlQXJndW1lbnRzRmxhZyA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaXNUcmFuc2Zvcm1lZE1peGluQXBwbGljYXRpb25GbGFnID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBoYXNBbm5vdGF0aW9uc0ZsYWcgPSAxIDw8IDY7CiAgc3RhdGljIGNvbnN0IGhhc1ByYWdtYUZsYWcgPSAxIDw8IDc7CgogIE9iamVjdEhhbmRsZSBuYW1lOwogIGZpbmFsIGludCBmbGFnczsKICBmaW5hbCBPYmplY3RIYW5kbGUgc2NyaXB0OwogIGZpbmFsIGludCBwb3NpdGlvbjsKICBmaW5hbCBpbnQgZW5kUG9zaXRpb247CiAgZmluYWwgVHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyczsKICBmaW5hbCBpbnQgbnVtVHlwZUFyZ3VtZW50czsKICBmaW5hbCBPYmplY3RIYW5kbGUgc3VwZXJUeXBlOwogIGZpbmFsIExpc3Q8T2JqZWN0SGFuZGxlPiBpbnRlcmZhY2VzOwogIGZpbmFsIE1lbWJlcnMgbWVtYmVyczsKICBmaW5hbCBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uIGFubm90YXRpb25zOwoKICBDbGFzc0RlY2xhcmF0aW9uKAogICAgICB0aGlzLm5hbWUsCiAgICAgIHRoaXMuZmxhZ3MsCiAgICAgIHRoaXMuc2NyaXB0LAogICAgICB0aGlzLnBvc2l0aW9uLAogICAgICB0aGlzLmVuZFBvc2l0aW9uLAogICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzLAogICAgICB0aGlzLm51bVR5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMuc3VwZXJUeXBlLAogICAgICB0aGlzLmludGVyZmFjZXMsCiAgICAgIHRoaXMubWVtYmVycywKICAgICAgdGhpcy5hbm5vdGF0aW9ucyk7CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICBmaW5hbCBzdGFydCA9IHdyaXRlci5vZmZzZXQ7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoZmxhZ3MpOwogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHNjcmlwdCk7CgogICAgaWYgKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHBvc2l0aW9uICsgMSk7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChlbmRQb3NpdGlvbiArIDEpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc1R5cGVBcmd1bWVudHNGbGFnKSAhPSAwKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChudW1UeXBlQXJndW1lbnRzKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNUeXBlUGFyYW1zRmxhZykgIT0gMCkgewogICAgICB0eXBlUGFyYW1ldGVycy53cml0ZSh3cml0ZXIpOwogICAgfQogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHN1cGVyVHlwZSk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRMaXN0KGludGVyZmFjZXMpOwogICAgaWYgKChmbGFncyAmIGhhc0Fubm90YXRpb25zRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KGFubm90YXRpb25zKTsKICAgIH0KICAgIHdyaXRlci53cml0ZUxpbmtPZmZzZXQobWVtYmVycyk7CiAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLmNsYXNzZXNTaXplICs9ICh3cml0ZXIub2Zmc2V0IC0gc3RhcnQpOwogIH0KCiAgZmFjdG9yeSBDbGFzc0RlY2xhcmF0aW9uLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBmaW5hbCBmbGFncyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBmaW5hbCBzY3JpcHQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgZmluYWwgcG9zaXRpb24gPSAoKGZsYWdzICYgaGFzU291cmNlUG9zaXRpb25zRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxCiAgICAgICAgOiBUcmVlTm9kZS5ub09mZnNldDsKICAgIGZpbmFsIGVuZFBvc2l0aW9uID0gKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApCiAgICAgICAgPyByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpIC0gMQogICAgICAgIDogVHJlZU5vZGUubm9PZmZzZXQ7CiAgICBmaW5hbCBudW1UeXBlQXJndW1lbnRzID0KICAgICAgICAoKGZsYWdzICYgaGFzVHlwZUFyZ3VtZW50c0ZsYWcpICE9IDApID8gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSA6IDA7CiAgICBmaW5hbCB0eXBlUGFyYW1ldGVycyA9ICgoZmxhZ3MgJiBoYXNUeXBlUGFyYW1zRmxhZykgIT0gMCkKICAgICAgICA/IG5ldyBUeXBlUGFyYW1ldGVyc0RlY2xhcmF0aW9uLnJlYWQocmVhZGVyKQogICAgICAgIDogbnVsbDsKICAgIGZpbmFsIHN1cGVyVHlwZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBmaW5hbCBpbnRlcmZhY2VzID0gcmVhZGVyLnJlYWRQYWNrZWRMaXN0PE9iamVjdEhhbmRsZT4oKTsKICAgIGZpbmFsIGFubm90YXRpb25zID0gKChmbGFncyAmIGhhc0Fubm90YXRpb25zRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkTGlua09mZnNldDxBbm5vdGF0aW9uc0RlY2xhcmF0aW9uPigpCiAgICAgICAgOiBudWxsOwogICAgZmluYWwgbWVtYmVycyA9IHJlYWRlci5yZWFkTGlua09mZnNldDxNZW1iZXJzPigpOwogICAgcmV0dXJuIG5ldyBDbGFzc0RlY2xhcmF0aW9uKAogICAgICAgIG51bGwsCiAgICAgICAgZmxhZ3MsCiAgICAgICAgc2NyaXB0LAogICAgICAgIHBvc2l0aW9uLAogICAgICAgIGVuZFBvc2l0aW9uLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIG51bVR5cGVBcmd1bWVudHMsCiAgICAgICAgc3VwZXJUeXBlLAogICAgICAgIGludGVyZmFjZXMsCiAgICAgICAgbWVtYmVycywKICAgICAgICBhbm5vdGF0aW9ucyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnQ2xhc3MgJG5hbWUsIHNjcmlwdCA9ICRzY3JpcHQnKTsKICAgIGlmICgoZmxhZ3MgJiBpc0Fic3RyYWN0RmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBhYnN0cmFjdCcpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzRW51bUZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgZW51bScpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzVHJhbnNmb3JtZWRNaXhpbkFwcGxpY2F0aW9uRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBtaXhpbi1hcHBsaWNhdGlvbicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc1ByYWdtYUZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgaGFzLXByYWdtYScpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgcG9zID0gJHBvc2l0aW9uLCBlbmQtcG9zID0gJGVuZFBvc2l0aW9uJyk7CiAgICB9CiAgICBzYi53cml0ZWxuKCk7CiAgICBpZiAoKGZsYWdzICYgaGFzVHlwZVBhcmFtc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJyAgICB0eXBlLXBhcmFtcyAkdHlwZVBhcmFtZXRlcnMgKGFyZ3M6ICRudW1UeXBlQXJndW1lbnRzKVxuJyk7CiAgICB9CiAgICBpZiAoc3VwZXJUeXBlICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyAgICBleHRlbmRzICRzdXBlclR5cGVcbicpOwogICAgfQogICAgaWYgKGludGVyZmFjZXMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnICAgIGltcGxlbWVudHMgJGludGVyZmFjZXNcbicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc0Fubm90YXRpb25zRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnICAgIGFubm90YXRpb25zICRhbm5vdGF0aW9uc1xuJyk7CiAgICB9CiAgICBzYi53cml0ZWxuKCk7CiAgICBzYi53cml0ZShtZW1iZXJzLnRvU3RyaW5nKCkpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBTb3VyY2VGaWxlIGV4dGVuZHMgQnl0ZWNvZGVEZWNsYXJhdGlvbiB7CiAgc3RhdGljIGNvbnN0IGhhc0xpbmVTdGFydHNGbGFnID0gMSA8PCAwOwogIHN0YXRpYyBjb25zdCBoYXNTb3VyY2VGbGFnID0gMSA8PCAxOwoKICBmaW5hbCBPYmplY3RIYW5kbGUgaW1wb3J0VXJpOwogIExpbmVTdGFydHMgbGluZVN0YXJ0czsKICBTdHJpbmcgc291cmNlOwoKICBTb3VyY2VGaWxlKHRoaXMuaW1wb3J0VXJpLCBbdGhpcy5saW5lU3RhcnRzLCB0aGlzLnNvdXJjZV0pOwoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgaW50IGZsYWdzID0gMDsKICAgIGlmIChsaW5lU3RhcnRzICE9IG51bGwpIHsKICAgICAgZmxhZ3MgfD0gaGFzTGluZVN0YXJ0c0ZsYWc7CiAgICB9CiAgICBpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlICE9ICcnKSB7CiAgICAgIGZsYWdzIHw9IGhhc1NvdXJjZUZsYWc7CiAgICB9CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoZmxhZ3MpOwogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KGltcG9ydFVyaSk7CiAgICBpZiAoKGZsYWdzICYgaGFzTGluZVN0YXJ0c0ZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlTGlua09mZnNldChsaW5lU3RhcnRzKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNTb3VyY2VGbGFnKSAhPSAwKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFN0cmluZ1JlZmVyZW5jZShzb3VyY2UpOwogICAgfQogIH0KCiAgZmFjdG9yeSBTb3VyY2VGaWxlLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBmaW5hbCBmbGFncyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBmaW5hbCBpbXBvcnRVcmkgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgZmluYWwgbGluZVN0YXJ0cyA9ICgoZmxhZ3MgJiBoYXNMaW5lU3RhcnRzRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkTGlua09mZnNldDxMaW5lU3RhcnRzPigpCiAgICAgICAgOiBudWxsOwogICAgZmluYWwgc291cmNlID0gKChmbGFncyAmIGhhc1NvdXJjZUZsYWcpICE9IDApCiAgICAgICAgPyByZWFkZXIucmVhZFBhY2tlZFN0cmluZ1JlZmVyZW5jZSgpCiAgICAgICAgOiBudWxsOwogICAgcmV0dXJuIG5ldyBTb3VyY2VGaWxlKGltcG9ydFVyaSwgbGluZVN0YXJ0cywgc291cmNlKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdzb3VyY2U6IGltcG9ydC11cmkgJGltcG9ydFVyaScpOwogICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZSAhPSAnJykgewogICAgICBzYi53cml0ZSgnLCAke3NvdXJjZS5sZW5ndGh9IHRleHQgY2hhcnMnKTsKICAgIH0KICAgIGlmIChsaW5lU3RhcnRzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJywgJHtsaW5lU3RhcnRzLmxpbmVTdGFydHMubGVuZ3RofSBsaW5lIHN0YXJ0cycpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBNZW1iZXJzIGV4dGVuZHMgQnl0ZWNvZGVEZWNsYXJhdGlvbiB7CiAgZmluYWwgTGlzdDxGaWVsZERlY2xhcmF0aW9uPiBmaWVsZHM7CiAgZmluYWwgTGlzdDxGdW5jdGlvbkRlY2xhcmF0aW9uPiBmdW5jdGlvbnM7CgogIE1lbWJlcnModGhpcy5maWVsZHMsIHRoaXMuZnVuY3Rpb25zKTsKCiAgaW50IGNvdW50RnVuY3Rpb25zKCkgewogICAgaW50IGNvdW50ID0gZnVuY3Rpb25zLmxlbmd0aDsKICAgIGZvciAodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICBpZiAoKGZpZWxkLmZsYWdzICYgRmllbGREZWNsYXJhdGlvbi5oYXNHZXR0ZXJGbGFnKSAhPSAwKSB7CiAgICAgICAgKytjb3VudDsKICAgICAgfQogICAgICBpZiAoKGZpZWxkLmZsYWdzICYgRmllbGREZWNsYXJhdGlvbi5oYXNTZXR0ZXJGbGFnKSAhPSAwKSB7CiAgICAgICAgKytjb3VudDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIGZpbmFsIHN0YXJ0ID0gd3JpdGVyLm9mZnNldDsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChjb3VudEZ1bmN0aW9ucygpKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmaWVsZHMubGVuZ3RoKTsKICAgIGZvciAodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICBmaWVsZC53cml0ZSh3cml0ZXIpOwogICAgfQogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGZ1bmN0aW9ucy5sZW5ndGgpOwogICAgZm9yICh2YXIgZnVuYyBpbiBmdW5jdGlvbnMpIHsKICAgICAgZnVuYy53cml0ZSh3cml0ZXIpOwogICAgfQogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5tZW1iZXJzU2l6ZSArPSAod3JpdGVyLm9mZnNldCAtIHN0YXJ0KTsKICB9CgogIGZhY3RvcnkgTWVtYmVycy5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsgLy8gbnVtRnVuY3Rpb25zCiAgICBmaW5hbCBmaWVsZHMgPSBuZXcgTGlzdDxGaWVsZERlY2xhcmF0aW9uPi5nZW5lcmF0ZSgKICAgICAgICByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpLCAoXykgPT4gbmV3IEZpZWxkRGVjbGFyYXRpb24ucmVhZChyZWFkZXIpKTsKICAgIGZpbmFsIGZ1bmN0aW9ucyA9IG5ldyBMaXN0PEZ1bmN0aW9uRGVjbGFyYXRpb24+LmdlbmVyYXRlKAogICAgICAgIHJlYWRlci5yZWFkUGFja2VkVUludDMwKCksIChfKSA9PiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbi5yZWFkKHJlYWRlcikpOwogICAgcmV0dXJuIG5ldyBNZW1iZXJzKGZpZWxkcywgZnVuY3Rpb25zKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICIke2ZpZWxkcy5qb2luKCdcbicpfVxuIgogICAgICAiJHtmdW5jdGlvbnMuam9pbignXG4nKX0iOwp9CgpjbGFzcyBGaWVsZERlY2xhcmF0aW9uIHsKICBzdGF0aWMgY29uc3QgaGFzTm9udHJpdmlhbEluaXRpYWxpemVyRmxhZyA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaGFzR2V0dGVyRmxhZyA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaGFzU2V0dGVyRmxhZyA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaXNSZWZsZWN0YWJsZUZsYWcgPSAxIDw8IDM7CiAgc3RhdGljIGNvbnN0IGlzU3RhdGljRmxhZyA9IDEgPDwgNDsKICBzdGF0aWMgY29uc3QgaXNDb25zdEZsYWcgPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGlzRmluYWxGbGFnID0gMSA8PCA2OwogIHN0YXRpYyBjb25zdCBpc0NvdmFyaWFudEZsYWcgPSAxIDw8IDc7CiAgc3RhdGljIGNvbnN0IGlzR2VuZXJpY0NvdmFyaWFudEltcGxGbGFnID0gMSA8PCA4OwogIHN0YXRpYyBjb25zdCBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnID0gMSA8PCA5OwogIHN0YXRpYyBjb25zdCBoYXNBbm5vdGF0aW9uc0ZsYWcgPSAxIDw8IDEwOwogIHN0YXRpYyBjb25zdCBoYXNQcmFnbWFGbGFnID0gMSA8PCAxMTsKICBzdGF0aWMgY29uc3QgaGFzQ3VzdG9tU2NyaXB0RmxhZyA9IDEgPDwgMTI7CiAgc3RhdGljIGNvbnN0IGhhc0luaXRpYWxpemVyQ29kZUZsYWcgPSAxIDw8IDEzOwogIHN0YXRpYyBjb25zdCBoYXNBdHRyaWJ1dGVzRmxhZyA9IDEgPDwgMTQ7CiAgc3RhdGljIGNvbnN0IGlzTGF0ZUZsYWcgPSAxIDw8IDE1OwogIHN0YXRpYyBjb25zdCBpc0V4dGVuc2lvbk1lbWJlckZsYWcgPSAxIDw8IDE2OwogIHN0YXRpYyBjb25zdCBoYXNJbml0aWFsaXplckZsYWcgPSAxIDw8IDE3OwoKICBmaW5hbCBpbnQgZmxhZ3M7CiAgZmluYWwgT2JqZWN0SGFuZGxlIG5hbWU7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHR5cGU7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHZhbHVlOwogIGZpbmFsIE9iamVjdEhhbmRsZSBzY3JpcHQ7CiAgZmluYWwgaW50IHBvc2l0aW9uOwogIGZpbmFsIGludCBlbmRQb3NpdGlvbjsKICBmaW5hbCBPYmplY3RIYW5kbGUgZ2V0dGVyTmFtZTsKICBmaW5hbCBPYmplY3RIYW5kbGUgc2V0dGVyTmFtZTsKICBmaW5hbCBDb2RlIGluaXRpYWxpemVyQ29kZTsKICBmaW5hbCBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uIGFubm90YXRpb25zOwogIGZpbmFsIE9iamVjdEhhbmRsZSBhdHRyaWJ1dGVzOwoKICBGaWVsZERlY2xhcmF0aW9uKAogICAgICB0aGlzLmZsYWdzLAogICAgICB0aGlzLm5hbWUsCiAgICAgIHRoaXMudHlwZSwKICAgICAgdGhpcy52YWx1ZSwKICAgICAgdGhpcy5zY3JpcHQsCiAgICAgIHRoaXMucG9zaXRpb24sCiAgICAgIHRoaXMuZW5kUG9zaXRpb24sCiAgICAgIHRoaXMuZ2V0dGVyTmFtZSwKICAgICAgdGhpcy5zZXR0ZXJOYW1lLAogICAgICB0aGlzLmluaXRpYWxpemVyQ29kZSwKICAgICAgdGhpcy5hbm5vdGF0aW9ucywKICAgICAgdGhpcy5hdHRyaWJ1dGVzKTsKCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmbGFncyk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QobmFtZSk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodHlwZSk7CgogICAgaWYgKChmbGFncyAmIGhhc0N1c3RvbVNjcmlwdEZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHNjcmlwdCk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzU291cmNlUG9zaXRpb25zRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAocG9zaXRpb24gKyAxKTsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGVuZFBvc2l0aW9uICsgMSk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzSW5pdGlhbGl6ZXJDb2RlRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KGluaXRpYWxpemVyQ29kZSk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzTm9udHJpdmlhbEluaXRpYWxpemVyRmxhZykgPT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodmFsdWUpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc0dldHRlckZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KGdldHRlck5hbWUpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc1NldHRlckZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHNldHRlck5hbWUpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc0Fubm90YXRpb25zRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KGFubm90YXRpb25zKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNBdHRyaWJ1dGVzRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QoYXR0cmlidXRlcyk7CiAgICB9CiAgfQoKICBmYWN0b3J5IEZpZWxkRGVjbGFyYXRpb24ucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIGZsYWdzID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIGZpbmFsIG5hbWUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgZmluYWwgdHlwZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBmaW5hbCBzY3JpcHQgPQogICAgICAgICgoZmxhZ3MgJiBoYXNDdXN0b21TY3JpcHRGbGFnKSAhPSAwKSA/IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkgOiBudWxsOwogICAgZmluYWwgcG9zaXRpb24gPSAoKGZsYWdzICYgaGFzU291cmNlUG9zaXRpb25zRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxCiAgICAgICAgOiBUcmVlTm9kZS5ub09mZnNldDsKICAgIGZpbmFsIGVuZFBvc2l0aW9uID0gKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApCiAgICAgICAgPyByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpIC0gMQogICAgICAgIDogVHJlZU5vZGUubm9PZmZzZXQ7CiAgICBmaW5hbCBpbml0aWFsaXplckNvZGUgPSAoKGZsYWdzICYgaGFzSW5pdGlhbGl6ZXJDb2RlRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkTGlua09mZnNldDxDb2RlPigpCiAgICAgICAgOiBudWxsOwogICAgZmluYWwgdmFsdWUgPSAoKGZsYWdzICYgaGFzTm9udHJpdmlhbEluaXRpYWxpemVyRmxhZykgPT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkKICAgICAgICA6IG51bGw7CiAgICBmaW5hbCBnZXR0ZXJOYW1lID0KICAgICAgICAoKGZsYWdzICYgaGFzR2V0dGVyRmxhZykgIT0gMCkgPyByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpIDogbnVsbDsKICAgIGZpbmFsIHNldHRlck5hbWUgPQogICAgICAgICgoZmxhZ3MgJiBoYXNTZXR0ZXJGbGFnKSAhPSAwKSA/IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkgOiBudWxsOwogICAgZmluYWwgYW5ub3RhdGlvbnMgPSAoKGZsYWdzICYgaGFzQW5ub3RhdGlvbnNGbGFnKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRMaW5rT2Zmc2V0PEFubm90YXRpb25zRGVjbGFyYXRpb24+KCkKICAgICAgICA6IG51bGw7CiAgICBmaW5hbCBhdHRyaWJ1dGVzID0KICAgICAgICAoKGZsYWdzICYgaGFzQXR0cmlidXRlc0ZsYWcpICE9IDApID8gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKSA6IG51bGw7CiAgICByZXR1cm4gbmV3IEZpZWxkRGVjbGFyYXRpb24oCiAgICAgICAgZmxhZ3MsCiAgICAgICAgbmFtZSwKICAgICAgICB0eXBlLAogICAgICAgIHZhbHVlLAogICAgICAgIHNjcmlwdCwKICAgICAgICBwb3NpdGlvbiwKICAgICAgICBlbmRQb3NpdGlvbiwKICAgICAgICBnZXR0ZXJOYW1lLAogICAgICAgIHNldHRlck5hbWUsCiAgICAgICAgaW5pdGlhbGl6ZXJDb2RlLAogICAgICAgIGFubm90YXRpb25zLAogICAgICAgIGF0dHJpYnV0ZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0ZpZWxkICRuYW1lLCB0eXBlID0gJHR5cGUnKTsKICAgIGlmICgoZmxhZ3MgJiBoYXNHZXR0ZXJGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIGdldHRlciA9ICRnZXR0ZXJOYW1lJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzU2V0dGVyRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBzZXR0ZXIgPSAkc2V0dGVyTmFtZScpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzUmVmbGVjdGFibGVGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHJlZmxlY3RhYmxlJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNTdGF0aWNGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHN0YXRpYycpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzQ29uc3RGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIGNvbnN0Jyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNGaW5hbEZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgZmluYWwnKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0xhdGVGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIGlzLWxhdGUnKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0V4dGVuc2lvbk1lbWJlckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgZXh0ZW5zaW9uLW1lbWJlcicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc1ByYWdtYUZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgaGFzLXByYWdtYScpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc0N1c3RvbVNjcmlwdEZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgY3VzdG9tLXNjcmlwdCA9ICRzY3JpcHQnKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHBvcyA9ICRwb3NpdGlvbiwgZW5kLXBvcyA9ICRlbmRQb3NpdGlvbicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc0luaXRpYWxpemVyRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBoYXMtaW5pdGlhbGl6ZXInKTsKICAgIH0KICAgIHNiLndyaXRlbG4oKTsKICAgIGlmICgoZmxhZ3MgJiBoYXNJbml0aWFsaXplckNvZGVGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcgICAgaW5pdGlhbGl6ZXJcbiRpbml0aWFsaXplckNvZGVcbicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc05vbnRyaXZpYWxJbml0aWFsaXplckZsYWcpID09IDApIHsKICAgICAgc2Iud3JpdGUoJyAgICB2YWx1ZSA9ICR2YWx1ZVxuJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzQW5ub3RhdGlvbnNGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcgICAgYW5ub3RhdGlvbnMgJGFubm90YXRpb25zXG4nKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNBdHRyaWJ1dGVzRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnICAgIGF0dHJpYnV0ZXMgJGF0dHJpYnV0ZXNcbicpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBGdW5jdGlvbkRlY2xhcmF0aW9uIHsKICBzdGF0aWMgY29uc3QgaXNDb25zdHJ1Y3RvckZsYWcgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGlzR2V0dGVyRmxhZyA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaXNTZXR0ZXJGbGFnID0gMSA8PCAyOwogIHN0YXRpYyBjb25zdCBpc0ZhY3RvcnlGbGFnID0gMSA8PCAzOwogIHN0YXRpYyBjb25zdCBpc1N0YXRpY0ZsYWcgPSAxIDw8IDQ7CiAgc3RhdGljIGNvbnN0IGlzQWJzdHJhY3RGbGFnID0gMSA8PCA1OwogIHN0YXRpYyBjb25zdCBpc0NvbnN0RmxhZyA9IDEgPDwgNjsKICBzdGF0aWMgY29uc3QgaGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zRmxhZyA9IDEgPDwgNzsKICBzdGF0aWMgY29uc3QgaGFzT3B0aW9uYWxOYW1lZFBhcmFtc0ZsYWcgPSAxIDw8IDg7CiAgc3RhdGljIGNvbnN0IGhhc1R5cGVQYXJhbXNGbGFnID0gMSA8PCA5OwogIHN0YXRpYyBjb25zdCBpc1JlZmxlY3RhYmxlRmxhZyA9IDEgPDwgMTA7CiAgc3RhdGljIGNvbnN0IGlzRGVidWdnYWJsZUZsYWcgPSAxIDw8IDExOwogIHN0YXRpYyBjb25zdCBpc0FzeW5jRmxhZyA9IDEgPDwgMTI7CiAgc3RhdGljIGNvbnN0IGlzQXN5bmNTdGFyRmxhZyA9IDEgPDwgMTM7CiAgc3RhdGljIGNvbnN0IGlzU3luY1N0YXJGbGFnID0gMSA8PCAxNDsKICBzdGF0aWMgY29uc3QgaXNGb3J3YXJkaW5nU3R1YkZsYWcgPSAxIDw8IDE1OwogIHN0YXRpYyBjb25zdCBpc05vU3VjaE1ldGhvZEZvcndhcmRlckZsYWcgPSAxIDw8IDE2OwogIHN0YXRpYyBjb25zdCBpc05hdGl2ZUZsYWcgPSAxIDw8IDE3OwogIHN0YXRpYyBjb25zdCBpc0V4dGVybmFsRmxhZyA9IDEgPDwgMTg7CiAgc3RhdGljIGNvbnN0IGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcgPSAxIDw8IDE5OwogIHN0YXRpYyBjb25zdCBoYXNBbm5vdGF0aW9uc0ZsYWcgPSAxIDw8IDIwOwogIHN0YXRpYyBjb25zdCBoYXNQcmFnbWFGbGFnID0gMSA8PCAyMTsKICBzdGF0aWMgY29uc3QgaGFzQ3VzdG9tU2NyaXB0RmxhZyA9IDEgPDwgMjI7CiAgc3RhdGljIGNvbnN0IGhhc0F0dHJpYnV0ZXNGbGFnID0gMSA8PCAyMzsKICBzdGF0aWMgY29uc3QgaXNFeHRlbnNpb25NZW1iZXJGbGFnID0gMSA8PCAyNDsKCiAgZmluYWwgaW50IGZsYWdzOwogIGZpbmFsIE9iamVjdEhhbmRsZSBuYW1lOwogIGZpbmFsIE9iamVjdEhhbmRsZSBzY3JpcHQ7CiAgZmluYWwgaW50IHBvc2l0aW9uOwogIGZpbmFsIGludCBlbmRQb3NpdGlvbjsKICBmaW5hbCBUeXBlUGFyYW1ldGVyc0RlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJzOwogIGZpbmFsIGludCBudW1SZXF1aXJlZFBhcmFtZXRlcnM7CiAgZmluYWwgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVyczsKICBmaW5hbCBPYmplY3RIYW5kbGUgcmV0dXJuVHlwZTsKICBmaW5hbCBPYmplY3RIYW5kbGUgbmF0aXZlTmFtZTsKICBmaW5hbCBDb2RlIGNvZGU7CiAgZmluYWwgQW5ub3RhdGlvbnNEZWNsYXJhdGlvbiBhbm5vdGF0aW9uczsKICBmaW5hbCBPYmplY3RIYW5kbGUgYXR0cmlidXRlczsKCiAgRnVuY3Rpb25EZWNsYXJhdGlvbigKICAgICAgdGhpcy5mbGFncywKICAgICAgdGhpcy5uYW1lLAogICAgICB0aGlzLnNjcmlwdCwKICAgICAgdGhpcy5wb3NpdGlvbiwKICAgICAgdGhpcy5lbmRQb3NpdGlvbiwKICAgICAgdGhpcy50eXBlUGFyYW1ldGVycywKICAgICAgdGhpcy5udW1SZXF1aXJlZFBhcmFtZXRlcnMsCiAgICAgIHRoaXMucGFyYW1ldGVycywKICAgICAgdGhpcy5yZXR1cm5UeXBlLAogICAgICB0aGlzLm5hdGl2ZU5hbWUsCiAgICAgIHRoaXMuY29kZSwKICAgICAgdGhpcy5hbm5vdGF0aW9ucywKICAgICAgdGhpcy5hdHRyaWJ1dGVzKTsKCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmbGFncyk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QobmFtZSk7CiAgICBpZiAoKGZsYWdzICYgaGFzQ3VzdG9tU2NyaXB0RmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3Qoc2NyaXB0KTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnKSAhPSAwKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChwb3NpdGlvbiArIDEpOwogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoZW5kUG9zaXRpb24gKyAxKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNUeXBlUGFyYW1zRmxhZykgIT0gMCkgewogICAgICB0eXBlUGFyYW1ldGVycy53cml0ZSh3cml0ZXIpOwogICAgfQogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGlmICgoZmxhZ3MgJiBoYXNPcHRpb25hbFBvc2l0aW9uYWxQYXJhbXNGbGFnKSAhPSAwIHx8CiAgICAgICAgKGZsYWdzICYgaGFzT3B0aW9uYWxOYW1lZFBhcmFtc0ZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKG51bVJlcXVpcmVkUGFyYW1ldGVycyk7CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbSBpbiBwYXJhbWV0ZXJzKSB7CiAgICAgIHBhcmFtLndyaXRlKHdyaXRlcik7CiAgICB9CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QocmV0dXJuVHlwZSk7CiAgICBpZiAoKGZsYWdzICYgaXNOYXRpdmVGbGFnKSAhPSAwKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChuYXRpdmVOYW1lKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0Fic3RyYWN0RmxhZykgPT0gMCkgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KGNvZGUpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc0Fubm90YXRpb25zRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KGFubm90YXRpb25zKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNBdHRyaWJ1dGVzRmxhZykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QoYXR0cmlidXRlcyk7CiAgICB9CiAgfQoKICBmYWN0b3J5IEZ1bmN0aW9uRGVjbGFyYXRpb24ucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIGZsYWdzID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIGZpbmFsIG5hbWUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwoKICAgIGZpbmFsIHNjcmlwdCA9CiAgICAgICAgKChmbGFncyAmIGhhc0N1c3RvbVNjcmlwdEZsYWcpICE9IDApID8gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKSA6IG51bGw7CiAgICBmaW5hbCBwb3NpdGlvbiA9ICgoZmxhZ3MgJiBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSAtIDEKICAgICAgICA6IFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgZmluYWwgZW5kUG9zaXRpb24gPSAoKGZsYWdzICYgaGFzU291cmNlUG9zaXRpb25zRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxCiAgICAgICAgOiBUcmVlTm9kZS5ub09mZnNldDsKICAgIGZpbmFsIHR5cGVQYXJhbWV0ZXJzID0gKChmbGFncyAmIGhhc1R5cGVQYXJhbXNGbGFnKSAhPSAwKQogICAgICAgID8gbmV3IFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24ucmVhZChyZWFkZXIpCiAgICAgICAgOiBudWxsOwoKICAgIGZpbmFsIG51bVBhcmFtZXRlcnMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgZmluYWwgbnVtUmVxdWlyZWRQYXJhbWV0ZXJzID0KICAgICAgICAoKGZsYWdzICYgaGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zRmxhZykgIT0gMCB8fAogICAgICAgICAgICAgICAgKGZsYWdzICYgaGFzT3B0aW9uYWxOYW1lZFBhcmFtc0ZsYWcpICE9IDApCiAgICAgICAgICAgID8gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKQogICAgICAgICAgICA6IG51bVBhcmFtZXRlcnM7CgogICAgZmluYWwgcGFyYW1ldGVycyA9IG5ldyBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPi5nZW5lcmF0ZSgKICAgICAgICBudW1QYXJhbWV0ZXJzLCAoXykgPT4gbmV3IFBhcmFtZXRlckRlY2xhcmF0aW9uLnJlYWQocmVhZGVyKSk7CiAgICBmaW5hbCByZXR1cm5UeXBlID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgIGZpbmFsIG5hdGl2ZU5hbWUgPQogICAgICAgICgoZmxhZ3MgJiBpc05hdGl2ZUZsYWcpICE9IDApID8gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKSA6IG51bGw7CiAgICBmaW5hbCBjb2RlID0KICAgICAgICAoKGZsYWdzICYgaXNBYnN0cmFjdEZsYWcpID09IDApID8gcmVhZGVyLnJlYWRMaW5rT2Zmc2V0PENvZGU+KCkgOiBudWxsOwogICAgZmluYWwgYW5ub3RhdGlvbnMgPSAoKGZsYWdzICYgaGFzQW5ub3RhdGlvbnNGbGFnKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRMaW5rT2Zmc2V0PEFubm90YXRpb25zRGVjbGFyYXRpb24+KCkKICAgICAgICA6IG51bGw7CiAgICBmaW5hbCBhdHRyaWJ1dGVzID0KICAgICAgICAoKGZsYWdzICYgaGFzQXR0cmlidXRlc0ZsYWcpICE9IDApID8gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKSA6IG51bGw7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24oCiAgICAgICAgZmxhZ3MsCiAgICAgICAgbmFtZSwKICAgICAgICBzY3JpcHQsCiAgICAgICAgcG9zaXRpb24sCiAgICAgICAgZW5kUG9zaXRpb24sCiAgICAgICAgdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgbnVtUmVxdWlyZWRQYXJhbWV0ZXJzLAogICAgICAgIHBhcmFtZXRlcnMsCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBuYXRpdmVOYW1lLAogICAgICAgIGNvZGUsCiAgICAgICAgYW5ub3RhdGlvbnMsCiAgICAgICAgYXR0cmlidXRlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnRnVuY3Rpb24gJG5hbWUnKTsKICAgIGlmICgoZmxhZ3MgJiBpc0NvbnN0cnVjdG9yRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBjb25zdHJ1Y3RvcicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzR2V0dGVyRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBnZXR0ZXInKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc1NldHRlckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgc2V0dGVyJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNGYWN0b3J5RmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBmYWN0b3J5Jyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNTdGF0aWNGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHN0YXRpYycpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzQWJzdHJhY3RGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIGFic3RyYWN0Jyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNDb25zdEZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgY29uc3QnKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0V4dGVuc2lvbk1lbWJlckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgZXh0ZW5zaW9uLW1lbWJlcicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgaGFzLW9wdGlvbmFsLXBvc2l0aW9uYWwtcGFyYW1zJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzT3B0aW9uYWxOYW1lZFBhcmFtc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgaGFzLW9wdGlvbmFsLW5hbWVkLXBhcmFtcycpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzUmVmbGVjdGFibGVGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIHJlZmxlY3RhYmxlJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNEZWJ1Z2dhYmxlRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBkZWJ1Z2dhYmxlJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNBc3luY0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgYXN5bmMnKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0FzeW5jU3RhckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgYXN5bmMqJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNTeW5jU3RhckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgc3luYyonKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0ZvcndhcmRpbmdTdHViRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBmb3J3YXJkaW5nLXN0dWInKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc05vU3VjaE1ldGhvZEZvcndhcmRlckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgbm8tc3VjaC1tZXRob2QtZm9yd2FyZGVyJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaXNOYXRpdmVGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIG5hdGl2ZSAkbmF0aXZlTmFtZScpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzRXh0ZXJuYWxGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcsIGV4dGVybmFsJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzUHJhZ21hRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBoYXMtcHJhZ21hJyk7CiAgICB9CiAgICBpZiAoKGZsYWdzICYgaGFzQ3VzdG9tU2NyaXB0RmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnLCBjdXN0b20tc2NyaXB0ID0gJHNjcmlwdCcpOwogICAgfQogICAgaWYgKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJywgcG9zID0gJHBvc2l0aW9uLCBlbmQtcG9zID0gJGVuZFBvc2l0aW9uJyk7CiAgICB9CiAgICBzYi53cml0ZWxuKCk7CiAgICBpZiAoKGZsYWdzICYgaGFzVHlwZVBhcmFtc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJyAgICB0eXBlLXBhcmFtcyAkdHlwZVBhcmFtZXRlcnNcbicpOwogICAgfQogICAgc2Iud3JpdGUoJyAgICBwYXJhbWV0ZXJzICRwYXJhbWV0ZXJzIChyZXF1aXJlZDogJG51bVJlcXVpcmVkUGFyYW1ldGVycylcbicpOwogICAgc2Iud3JpdGUoJyAgICByZXR1cm4tdHlwZSAkcmV0dXJuVHlwZVxuJyk7CiAgICBpZiAoKGZsYWdzICYgaGFzQW5ub3RhdGlvbnNGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcgICAgYW5ub3RhdGlvbnMgJGFubm90YXRpb25zXG4nKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBoYXNBdHRyaWJ1dGVzRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnICAgIGF0dHJpYnV0ZXMgJGF0dHJpYnV0ZXNcbicpOwogICAgfQogICAgaWYgKChmbGFncyAmIGlzQWJzdHJhY3RGbGFnKSA9PSAwICYmIChmbGFncyAmIGlzRXh0ZXJuYWxGbGFnKSA9PSAwKSB7CiAgICAgIHNiLndyaXRlKCdcbiRjb2RlXG4nKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgVHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbiB7CiAgZmluYWwgTGlzdDxOYW1lQW5kVHlwZT4gdHlwZVBhcmFtczsKCiAgVHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbih0aGlzLnR5cGVQYXJhbXMpOwoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHR5cGVQYXJhbXMubGVuZ3RoKTsKICAgIGZvciAodmFyIHRwIGluIHR5cGVQYXJhbXMpIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHRwLm5hbWUpOwogICAgfQogICAgZm9yICh2YXIgdHAgaW4gdHlwZVBhcmFtcykgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodHAudHlwZSk7CiAgICB9CiAgfQoKICBmYWN0b3J5IFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24ucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIGludCBudW1UeXBlUGFyYW1zID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIExpc3Q8T2JqZWN0SGFuZGxlPiBuYW1lcyA9IG5ldyBMaXN0PE9iamVjdEhhbmRsZT4uZ2VuZXJhdGUoCiAgICAgICAgbnVtVHlwZVBhcmFtcywgKF8pID0+IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkpOwogICAgTGlzdDxPYmplY3RIYW5kbGU+IGJvdW5kcyA9IG5ldyBMaXN0PE9iamVjdEhhbmRsZT4uZ2VuZXJhdGUoCiAgICAgICAgbnVtVHlwZVBhcmFtcywgKF8pID0+IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkpOwogICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyc0RlY2xhcmF0aW9uKG5ldyBMaXN0PE5hbWVBbmRUeXBlPi5nZW5lcmF0ZSgKICAgICAgICBudW1UeXBlUGFyYW1zLCAoaW50IGkpID0+IG5ldyBOYW1lQW5kVHlwZShuYW1lc1tpXSwgYm91bmRzW2ldKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBsaXN0SGFzaENvZGUodHlwZVBhcmFtcyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24gJiYKICAgICAgbGlzdEVxdWFscyh0aGlzLnR5cGVQYXJhbXMsIG90aGVyLnR5cGVQYXJhbXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnPCR7dHlwZVBhcmFtcy5qb2luKCcsICcpfT4nOwp9CgpjbGFzcyBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7CiAgLy8gUGFyYW1ldGVyIGZsYWdzIGFyZSB3cml0dGVuIHNlcGFyYXRlbHkgKGluIENvZGUpLgogIHN0YXRpYyBjb25zdCBpc0NvdmFyaWFudEZsYWcgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGlzR2VuZXJpY0NvdmFyaWFudEltcGxGbGFnID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBpc0ZpbmFsRmxhZyA9IDEgPDwgMjsKCiAgZmluYWwgT2JqZWN0SGFuZGxlIG5hbWU7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHR5cGU7CgogIFBhcmFtZXRlckRlY2xhcmF0aW9uKHRoaXMubmFtZSwgdGhpcy50eXBlKTsKCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChuYW1lKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdCh0eXBlKTsKICB9CgogIGZhY3RvcnkgUGFyYW1ldGVyRGVjbGFyYXRpb24ucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIG5hbWUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgZmluYWwgdHlwZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICByZXR1cm4gbmV3IFBhcmFtZXRlckRlY2xhcmF0aW9uKG5hbWUsIHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR0eXBlICRuYW1lJzsKfQoKY2xhc3MgQ29kZSBleHRlbmRzIEJ5dGVjb2RlRGVjbGFyYXRpb24gewogIHN0YXRpYyBjb25zdCBoYXNFeGNlcHRpb25zVGFibGVGbGFnID0gMSA8PCAwOwogIHN0YXRpYyBjb25zdCBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBoYXNOdWxsYWJsZUZpZWxkc0ZsYWcgPSAxIDw8IDI7CiAgc3RhdGljIGNvbnN0IGhhc0Nsb3N1cmVzRmxhZyA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaGFzUGFyYW1ldGVyRmxhZ3NGbGFnID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBoYXNGb3J3YXJkaW5nU3R1YlRhcmdldEZsYWcgPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGhhc0RlZmF1bHRGdW5jdGlvblR5cGVBcmdzRmxhZyA9IDEgPDwgNjsKICBzdGF0aWMgY29uc3QgaGFzTG9jYWxWYXJpYWJsZXNGbGFnID0gMSA8PCA3OwoKICBmaW5hbCBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sOwogIGZpbmFsIFVpbnQ4TGlzdCBieXRlY29kZXM7CiAgZmluYWwgRXhjZXB0aW9uc1RhYmxlIGV4Y2VwdGlvbnNUYWJsZTsKICBmaW5hbCBTb3VyY2VQb3NpdGlvbnMgc291cmNlUG9zaXRpb25zOwogIGZpbmFsIExvY2FsVmFyaWFibGVUYWJsZSBsb2NhbFZhcmlhYmxlczsKICBmaW5hbCBMaXN0PE9iamVjdEhhbmRsZT4gbnVsbGFibGVGaWVsZHM7CiAgZmluYWwgTGlzdDxDbG9zdXJlRGVjbGFyYXRpb24+IGNsb3N1cmVzOwogIGZpbmFsIExpc3Q8aW50PiBwYXJhbWV0ZXJGbGFnczsKICBmaW5hbCBpbnQgZm9yd2FyZGluZ1N0dWJUYXJnZXRDcEluZGV4OwogIGZpbmFsIGludCBkZWZhdWx0RnVuY3Rpb25UeXBlQXJnc0NwSW5kZXg7CgogIGJvb2wgZ2V0IGhhc0V4Y2VwdGlvbnNUYWJsZSA9PiBleGNlcHRpb25zVGFibGUuYmxvY2tzLmlzTm90RW1wdHk7CiAgYm9vbCBnZXQgaGFzU291cmNlUG9zaXRpb25zID0+CiAgICAgIHNvdXJjZVBvc2l0aW9ucyAhPSBudWxsICYmIHNvdXJjZVBvc2l0aW9ucy5pc05vdEVtcHR5OwogIGJvb2wgZ2V0IGhhc0xvY2FsVmFyaWFibGVzID0+CiAgICAgIGxvY2FsVmFyaWFibGVzICE9IG51bGwgJiYgbG9jYWxWYXJpYWJsZXMuaXNOb3RFbXB0eTsKICBib29sIGdldCBoYXNOdWxsYWJsZUZpZWxkcyA9PiBudWxsYWJsZUZpZWxkcy5pc05vdEVtcHR5OwogIGJvb2wgZ2V0IGhhc0Nsb3N1cmVzID0+IGNsb3N1cmVzLmlzTm90RW1wdHk7CgogIGludCBnZXQgZmxhZ3MgPT4KICAgICAgKGhhc0V4Y2VwdGlvbnNUYWJsZSA/IGhhc0V4Y2VwdGlvbnNUYWJsZUZsYWcgOiAwKSB8CiAgICAgIChoYXNTb3VyY2VQb3NpdGlvbnMgPyBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnIDogMCkgfAogICAgICAoaGFzTnVsbGFibGVGaWVsZHMgPyBoYXNOdWxsYWJsZUZpZWxkc0ZsYWcgOiAwKSB8CiAgICAgIChoYXNDbG9zdXJlcyA/IGhhc0Nsb3N1cmVzRmxhZyA6IDApIHwKICAgICAgKHBhcmFtZXRlckZsYWdzICE9IG51bGwgPyBoYXNQYXJhbWV0ZXJGbGFnc0ZsYWcgOiAwKSB8CiAgICAgIChmb3J3YXJkaW5nU3R1YlRhcmdldENwSW5kZXggIT0gbnVsbCA/IGhhc0ZvcndhcmRpbmdTdHViVGFyZ2V0RmxhZyA6IDApIHwKICAgICAgKGRlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleCAhPSBudWxsCiAgICAgICAgICA/IGhhc0RlZmF1bHRGdW5jdGlvblR5cGVBcmdzRmxhZwogICAgICAgICAgOiAwKSB8CiAgICAgIChoYXNMb2NhbFZhcmlhYmxlcyA/IGhhc0xvY2FsVmFyaWFibGVzRmxhZyA6IDApOwoKICBDb2RlKAogICAgICB0aGlzLmNvbnN0YW50UG9vbCwKICAgICAgdGhpcy5ieXRlY29kZXMsCiAgICAgIHRoaXMuZXhjZXB0aW9uc1RhYmxlLAogICAgICB0aGlzLnNvdXJjZVBvc2l0aW9ucywKICAgICAgdGhpcy5sb2NhbFZhcmlhYmxlcywKICAgICAgdGhpcy5udWxsYWJsZUZpZWxkcywKICAgICAgdGhpcy5jbG9zdXJlcywKICAgICAgdGhpcy5wYXJhbWV0ZXJGbGFncywKICAgICAgdGhpcy5mb3J3YXJkaW5nU3R1YlRhcmdldENwSW5kZXgsCiAgICAgIHRoaXMuZGVmYXVsdEZ1bmN0aW9uVHlwZUFyZ3NDcEluZGV4KTsKCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIGZpbmFsIHN0YXJ0ID0gd3JpdGVyLm9mZnNldDsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmbGFncyk7CiAgICBpZiAocGFyYW1ldGVyRmxhZ3MgIT0gbnVsbCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAocGFyYW1ldGVyRmxhZ3MubGVuZ3RoKTsKICAgICAgcGFyYW1ldGVyRmxhZ3MuZm9yRWFjaCgoZmxhZ3MpID0+IHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmbGFncykpOwogICAgfQogICAgaWYgKGZvcndhcmRpbmdTdHViVGFyZ2V0Q3BJbmRleCAhPSBudWxsKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChmb3J3YXJkaW5nU3R1YlRhcmdldENwSW5kZXgpOwogICAgfQogICAgaWYgKGRlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleCAhPSBudWxsKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChkZWZhdWx0RnVuY3Rpb25UeXBlQXJnc0NwSW5kZXgpOwogICAgfQogICAgaWYgKGhhc0Nsb3N1cmVzKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChjbG9zdXJlcy5sZW5ndGgpOwogICAgICBjbG9zdXJlcy5mb3JFYWNoKChjKSA9PiBjLndyaXRlKHdyaXRlcikpOwogICAgfQogICAgY29uc3RhbnRQb29sLndyaXRlKHdyaXRlcik7CiAgICBfd3JpdGVCeXRlY29kZUluc3RydWN0aW9ucyh3cml0ZXIsIGJ5dGVjb2Rlcyk7CiAgICBpZiAoaGFzRXhjZXB0aW9uc1RhYmxlKSB7CiAgICAgIGV4Y2VwdGlvbnNUYWJsZS53cml0ZSh3cml0ZXIpOwogICAgfQogICAgaWYgKGhhc1NvdXJjZVBvc2l0aW9ucykgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KHNvdXJjZVBvc2l0aW9ucyk7CiAgICB9CiAgICBpZiAoaGFzTG9jYWxWYXJpYWJsZXMpIHsKICAgICAgd3JpdGVyLndyaXRlTGlua09mZnNldChsb2NhbFZhcmlhYmxlcyk7CiAgICB9CiAgICBpZiAoaGFzTnVsbGFibGVGaWVsZHMpIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkTGlzdChudWxsYWJsZUZpZWxkcyk7CiAgICB9CiAgICBpZiAoaGFzQ2xvc3VyZXMpIHsKICAgICAgY2xvc3VyZXMuZm9yRWFjaCgoYykgPT4gYy5jb2RlLndyaXRlKHdyaXRlcikpOwogICAgfQogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5jb2RlU2l6ZSArPSAod3JpdGVyLm9mZnNldCAtIHN0YXJ0KTsKICB9CgogIGZhY3RvcnkgQ29kZS5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgaW50IGZsYWdzID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIGZpbmFsIHBhcmFtZXRlckZsYWdzID0gKChmbGFncyAmIGhhc1BhcmFtZXRlckZsYWdzRmxhZykgIT0gMCkKICAgICAgICA/IG5ldyBMaXN0PGludD4uZ2VuZXJhdGUoCiAgICAgICAgICAgIHJlYWRlci5yZWFkUGFja2VkVUludDMwKCksIChfKSA9PiByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpKQogICAgICAgIDogbnVsbDsKICAgIGZpbmFsIGZvcndhcmRpbmdTdHViVGFyZ2V0Q3BJbmRleCA9CiAgICAgICAgKChmbGFncyAmIGhhc0ZvcndhcmRpbmdTdHViVGFyZ2V0RmxhZykgIT0gMCkKICAgICAgICAgICAgPyByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpCiAgICAgICAgICAgIDogbnVsbDsKICAgIGZpbmFsIGRlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleCA9CiAgICAgICAgKChmbGFncyAmIGhhc0RlZmF1bHRGdW5jdGlvblR5cGVBcmdzRmxhZykgIT0gMCkKICAgICAgICAgICAgPyByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpCiAgICAgICAgICAgIDogbnVsbDsKICAgIGZpbmFsIExpc3Q8Q2xvc3VyZURlY2xhcmF0aW9uPiBjbG9zdXJlcyA9ICgoZmxhZ3MgJiBoYXNDbG9zdXJlc0ZsYWcpICE9IDApCiAgICAgICAgPyBuZXcgTGlzdDxDbG9zdXJlRGVjbGFyYXRpb24+LmdlbmVyYXRlKHJlYWRlci5yZWFkUGFja2VkVUludDMwKCksCiAgICAgICAgICAgIChfKSA9PiBuZXcgQ2xvc3VyZURlY2xhcmF0aW9uLnJlYWQocmVhZGVyKSkKICAgICAgICA6IGNvbnN0IDxDbG9zdXJlRGVjbGFyYXRpb24+W107CiAgICBmaW5hbCBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sID0gbmV3IENvbnN0YW50UG9vbC5yZWFkKHJlYWRlcik7CiAgICBmaW5hbCBVaW50OExpc3QgYnl0ZWNvZGVzID0gX3JlYWRCeXRlY29kZUluc3RydWN0aW9ucyhyZWFkZXIpOwogICAgZmluYWwgZXhjZXB0aW9uc1RhYmxlID0gKChmbGFncyAmIGhhc0V4Y2VwdGlvbnNUYWJsZUZsYWcpICE9IDApCiAgICAgICAgPyBuZXcgRXhjZXB0aW9uc1RhYmxlLnJlYWQocmVhZGVyKQogICAgICAgIDogbmV3IEV4Y2VwdGlvbnNUYWJsZSgpOwogICAgZmluYWwgc291cmNlUG9zaXRpb25zID0gKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApCiAgICAgICAgPyByZWFkZXIucmVhZExpbmtPZmZzZXQ8U291cmNlUG9zaXRpb25zPigpCiAgICAgICAgOiBudWxsOwogICAgZmluYWwgbG9jYWxWYXJpYWJsZXMgPSAoKGZsYWdzICYgaGFzTG9jYWxWYXJpYWJsZXNGbGFnKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRMaW5rT2Zmc2V0PExvY2FsVmFyaWFibGVUYWJsZT4oKQogICAgICAgIDogbnVsbDsKICAgIGZpbmFsIExpc3Q8T2JqZWN0SGFuZGxlPiBudWxsYWJsZUZpZWxkcyA9CiAgICAgICAgKChmbGFncyAmIGhhc051bGxhYmxlRmllbGRzRmxhZykgIT0gMCkKICAgICAgICAgICAgPyByZWFkZXIucmVhZFBhY2tlZExpc3Q8T2JqZWN0SGFuZGxlPigpCiAgICAgICAgICAgIDogY29uc3QgPE9iamVjdEhhbmRsZT5bXTsKICAgIGZvciAodmFyIGMgaW4gY2xvc3VyZXMpIHsKICAgICAgYy5jb2RlID0gbmV3IENsb3N1cmVDb2RlLnJlYWQocmVhZGVyKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ29kZSgKICAgICAgICBjb25zdGFudFBvb2wsCiAgICAgICAgYnl0ZWNvZGVzLAogICAgICAgIGV4Y2VwdGlvbnNUYWJsZSwKICAgICAgICBzb3VyY2VQb3NpdGlvbnMsCiAgICAgICAgbG9jYWxWYXJpYWJsZXMsCiAgICAgICAgbnVsbGFibGVGaWVsZHMsCiAgICAgICAgY2xvc3VyZXMsCiAgICAgICAgcGFyYW1ldGVyRmxhZ3MsCiAgICAgICAgZm9yd2FyZGluZ1N0dWJUYXJnZXRDcEluZGV4LAogICAgICAgIGRlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleCk7CiAgfQoKICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBDb25zaWRlciBwcmludGluZyBjb25zdGFudCBwb29sIGJlZm9yZSBieXRlY29kZS4KICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiQnl0ZWNvZGUge1xuIgogICAgICAiJHtuZXcgQnl0ZWNvZGVEaXNhc3NlbWJsZXIoKS5kaXNhc3NlbWJsZShieXRlY29kZXMsIGV4Y2VwdGlvbnNUYWJsZSwgYW5ub3RhdGlvbnM6IFsKICAgICAgICBoYXNTb3VyY2VQb3NpdGlvbnMKICAgICAgICAgICAgPyBzb3VyY2VQb3NpdGlvbnMuZ2V0Qnl0ZWNvZGVBbm5vdGF0aW9ucygpCiAgICAgICAgICAgIDogY29uc3QgPGludCwgU3RyaW5nPnt9LAogICAgICAgIGhhc0xvY2FsVmFyaWFibGVzCiAgICAgICAgICAgID8gbG9jYWxWYXJpYWJsZXMuZ2V0Qnl0ZWNvZGVBbm5vdGF0aW9ucygpCiAgICAgICAgICAgIDogY29uc3QgPGludCwgU3RyaW5nPnt9CiAgICAgIF0pfX1cbiIKICAgICAgIiRleGNlcHRpb25zVGFibGUiCiAgICAgICIke251bGxhYmxlRmllbGRzLmlzRW1wdHkgPyAnJyA6ICdOdWxsYWJsZSBmaWVsZHM6ICRudWxsYWJsZUZpZWxkc1xuJ30iCiAgICAgICIke3BhcmFtZXRlckZsYWdzID09IG51bGwgPyAnJyA6ICdQYXJhbWV0ZXIgZmxhZ3M6ICRwYXJhbWV0ZXJGbGFnc1xuJ30iCiAgICAgICIke2ZvcndhcmRpbmdTdHViVGFyZ2V0Q3BJbmRleCA9PSBudWxsID8gJycgOiAnRm9yd2FyZGluZyBzdHViIHRhcmdldDogQ1AjJGZvcndhcmRpbmdTdHViVGFyZ2V0Q3BJbmRleFxuJ30iCiAgICAgICIke2RlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleCA9PSBudWxsID8gJycgOiAnRGVmYXVsdCBmdW5jdGlvbiB0eXBlIGFyZ3VtZW50czogQ1AjJGRlZmF1bHRGdW5jdGlvblR5cGVBcmdzQ3BJbmRleFxuJ30iCiAgICAgICIkY29uc3RhbnRQb29sIgogICAgICAiJHtjbG9zdXJlcy5qb2luKCdcbicpfSI7Cn0KCmNsYXNzIENsb3N1cmVEZWNsYXJhdGlvbiB7CiAgc3RhdGljIGNvbnN0IGhhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtc0ZsYWcgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGhhc09wdGlvbmFsTmFtZWRQYXJhbXNGbGFnID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBoYXNUeXBlUGFyYW1zRmxhZyA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaGFzU291cmNlUG9zaXRpb25zRmxhZyA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaXNBc3luY0ZsYWcgPSAxIDw8IDQ7CiAgc3RhdGljIGNvbnN0IGlzQXN5bmNTdGFyRmxhZyA9IDEgPDwgNTsKICBzdGF0aWMgY29uc3QgaXNTeW5jU3RhckZsYWcgPSAxIDw8IDY7CiAgc3RhdGljIGNvbnN0IGlzRGVidWdnYWJsZUZsYWcgPSAxIDw8IDc7CiAgc3RhdGljIGNvbnN0IGhhc0F0dHJpYnV0ZXNGbGFnID0gMSA8PCA4OwoKICBpbnQgZmxhZ3M7CiAgZmluYWwgT2JqZWN0SGFuZGxlIHBhcmVudDsKICBmaW5hbCBPYmplY3RIYW5kbGUgbmFtZTsKICBmaW5hbCBpbnQgcG9zaXRpb247CiAgZmluYWwgaW50IGVuZFBvc2l0aW9uOwogIGZpbmFsIExpc3Q8TmFtZUFuZFR5cGU+IHR5cGVQYXJhbXM7CiAgZmluYWwgaW50IG51bVJlcXVpcmVkUGFyYW1zOwogIGZpbmFsIGludCBudW1OYW1lZFBhcmFtczsKICBmaW5hbCBMaXN0PE5hbWVBbmRUeXBlPiBwYXJhbWV0ZXJzOwogIGZpbmFsIE9iamVjdEhhbmRsZSByZXR1cm5UeXBlOwogIE9iamVjdEhhbmRsZSBhdHRyaWJ1dGVzOwogIENsb3N1cmVDb2RlIGNvZGU7CgogIENsb3N1cmVEZWNsYXJhdGlvbigKICAgICAgdGhpcy5mbGFncywKICAgICAgdGhpcy5wYXJlbnQsCiAgICAgIHRoaXMubmFtZSwKICAgICAgdGhpcy5wb3NpdGlvbiwKICAgICAgdGhpcy5lbmRQb3NpdGlvbiwKICAgICAgdGhpcy50eXBlUGFyYW1zLAogICAgICB0aGlzLm51bVJlcXVpcmVkUGFyYW1zLAogICAgICB0aGlzLm51bU5hbWVkUGFyYW1zLAogICAgICB0aGlzLnBhcmFtZXRlcnMsCiAgICAgIHRoaXMucmV0dXJuVHlwZSwKICAgICAgW3RoaXMuYXR0cmlidXRlc10pOwoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGZsYWdzKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChwYXJlbnQpOwogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KG5hbWUpOwoKICAgIGlmIChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAocG9zaXRpb24gKyAxKTsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGVuZFBvc2l0aW9uICsgMSk7CiAgICB9CgogICAgaWYgKGZsYWdzICYgaGFzVHlwZVBhcmFtc0ZsYWcgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAodHlwZVBhcmFtcy5sZW5ndGgpOwogICAgICBmb3IgKHZhciB0cCBpbiB0eXBlUGFyYW1zKSB7CiAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHRwLm5hbWUpOwogICAgICB9CiAgICAgIGZvciAodmFyIHRwIGluIHR5cGVQYXJhbXMpIHsKICAgICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodHAudHlwZSk7CiAgICAgIH0KICAgIH0KICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChwYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBpZiAoZmxhZ3MgJgogICAgICAgICAgICAoaGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zRmxhZyB8IGhhc09wdGlvbmFsTmFtZWRQYXJhbXNGbGFnKSAhPQogICAgICAgIDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKG51bVJlcXVpcmVkUGFyYW1zKTsKICAgIH0KICAgIGZvciAodmFyIHBhcmFtIGluIHBhcmFtZXRlcnMpIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHBhcmFtLm5hbWUpOwogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QocGFyYW0udHlwZSk7CiAgICB9CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QocmV0dXJuVHlwZSk7CiAgICBpZiAoKGZsYWdzICYgaGFzQXR0cmlidXRlc0ZsYWcpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KGF0dHJpYnV0ZXMpOwogICAgfQogIH0KCiAgZmFjdG9yeSBDbG9zdXJlRGVjbGFyYXRpb24ucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIGludCBmbGFncyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBmaW5hbCBwYXJlbnQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgZmluYWwgbmFtZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBmaW5hbCBwb3NpdGlvbiA9ICgoZmxhZ3MgJiBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSAtIDEKICAgICAgICA6IFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgZmluYWwgZW5kUG9zaXRpb24gPSAoKGZsYWdzICYgaGFzU291cmNlUG9zaXRpb25zRmxhZykgIT0gMCkKICAgICAgICA/IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxCiAgICAgICAgOiBUcmVlTm9kZS5ub09mZnNldDsKICAgIExpc3Q8TmFtZUFuZFR5cGU+IHR5cGVQYXJhbXM7CiAgICBpZiAoKGZsYWdzICYgaGFzVHlwZVBhcmFtc0ZsYWcpICE9IDApIHsKICAgICAgZmluYWwgaW50IG51bVR5cGVQYXJhbXMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgICBMaXN0PE9iamVjdEhhbmRsZT4gbmFtZXMgPSBuZXcgTGlzdDxPYmplY3RIYW5kbGU+LmdlbmVyYXRlKAogICAgICAgICAgbnVtVHlwZVBhcmFtcywgKF8pID0+IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkpOwogICAgICBMaXN0PE9iamVjdEhhbmRsZT4gYm91bmRzID0gbmV3IExpc3Q8T2JqZWN0SGFuZGxlPi5nZW5lcmF0ZSgKICAgICAgICAgIG51bVR5cGVQYXJhbXMsIChfKSA9PiByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpKTsKICAgICAgdHlwZVBhcmFtcyA9IG5ldyBMaXN0PE5hbWVBbmRUeXBlPi5nZW5lcmF0ZSgKICAgICAgICAgIG51bVR5cGVQYXJhbXMsIChpbnQgaSkgPT4gbmV3IE5hbWVBbmRUeXBlKG5hbWVzW2ldLCBib3VuZHNbaV0pKTsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGVQYXJhbXMgPSBjb25zdCA8TmFtZUFuZFR5cGU+W107CiAgICB9CiAgICBmaW5hbCBudW1QYXJhbXMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgZmluYWwgbnVtUmVxdWlyZWRQYXJhbXMgPSAoZmxhZ3MgJgogICAgICAgICAgICAgICAgKGhhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtc0ZsYWcgfAogICAgICAgICAgICAgICAgICAgIGhhc09wdGlvbmFsTmFtZWRQYXJhbXNGbGFnKSAhPQogICAgICAgICAgICAwKQogICAgICAgID8gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKQogICAgICAgIDogbnVtUGFyYW1zOwogICAgZmluYWwgbnVtTmFtZWRQYXJhbXMgPSAoZmxhZ3MgJiBoYXNPcHRpb25hbE5hbWVkUGFyYW1zRmxhZyAhPSAwKQogICAgICAgID8gKG51bVBhcmFtcyAtIG51bVJlcXVpcmVkUGFyYW1zKQogICAgICAgIDogMDsKICAgIGZpbmFsIExpc3Q8TmFtZUFuZFR5cGU+IHBhcmFtZXRlcnMgPSBuZXcgTGlzdDxOYW1lQW5kVHlwZT4uZ2VuZXJhdGUoCiAgICAgICAgbnVtUGFyYW1zLAogICAgICAgIChfKSA9PiBuZXcgTmFtZUFuZFR5cGUoCiAgICAgICAgICAgIHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCksIHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkpKTsKICAgIGZpbmFsIHJldHVyblR5cGUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgZmluYWwgYXR0cmlidXRlcyA9CiAgICAgICAgKChmbGFncyAmIGhhc0F0dHJpYnV0ZXNGbGFnKSAhPSAwKSA/IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkgOiBudWxsOwogICAgcmV0dXJuIG5ldyBDbG9zdXJlRGVjbGFyYXRpb24oCiAgICAgICAgZmxhZ3MsCiAgICAgICAgcGFyZW50LAogICAgICAgIG5hbWUsCiAgICAgICAgcG9zaXRpb24sCiAgICAgICAgZW5kUG9zaXRpb24sCiAgICAgICAgdHlwZVBhcmFtcywKICAgICAgICBudW1SZXF1aXJlZFBhcmFtcywKICAgICAgICBudW1OYW1lZFBhcmFtcywKICAgICAgICBwYXJhbWV0ZXJzLAogICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgYXR0cmlidXRlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgnQ2xvc3VyZSAkcGFyZW50OjokbmFtZScpOwogICAgaWYgKChmbGFncyAmIGlzQXN5bmNGbGFnKSAhPSAwKSB7CiAgICAgIHNiLndyaXRlKCcgYXN5bmMnKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc0FzeW5jU3RhckZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJyBhc3luYyonKTsKICAgIH0KICAgIGlmICgoZmxhZ3MgJiBpc1N5bmNTdGFyRmxhZykgIT0gMCkgewogICAgICBzYi53cml0ZSgnIHN5bmMqJyk7CiAgICB9CiAgICBpZiAocG9zaXRpb24gIT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgc2Iud3JpdGUoJyBwb3MgPSAkcG9zaXRpb24sIGVuZC1wb3MgPSAkZW5kUG9zaXRpb24nKTsKICAgIH0KICAgIGlmICh0eXBlUGFyYW1zLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJyA8JHt0eXBlUGFyYW1zLmpvaW4oJywgJyl9PicpOwogICAgfQogICAgc2Iud3JpdGUoJyAoJyk7CiAgICBzYi53cml0ZShwYXJhbWV0ZXJzLnN1Ymxpc3QoMCwgbnVtUmVxdWlyZWRQYXJhbXMpLmpvaW4oJywgJykpOwogICAgaWYgKG51bVJlcXVpcmVkUGFyYW1zICE9IHBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIGlmIChudW1SZXF1aXJlZFBhcmFtcyA+IDApIHsKICAgICAgICBzYi53cml0ZSgnLCAnKTsKICAgICAgfQogICAgICBpZiAobnVtTmFtZWRQYXJhbXMgPiAwKSB7CiAgICAgICAgc2Iud3JpdGUoJ3sgJHtwYXJhbWV0ZXJzLnN1Ymxpc3QobnVtUmVxdWlyZWRQYXJhbXMpLmpvaW4oJywgJyl9IH0nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzYi53cml0ZSgnWyAke3BhcmFtZXRlcnMuc3VibGlzdChudW1SZXF1aXJlZFBhcmFtcykuam9pbignLCAnKX0gXScpOwogICAgICB9CiAgICB9CiAgICBzYi53cml0ZSgnKSAtPiAnKTsKICAgIHNiLndyaXRlbG4ocmV0dXJuVHlwZSk7CiAgICBpZiAoKGZsYWdzICYgaGFzQXR0cmlidXRlc0ZsYWcpICE9IDApIHsKICAgICAgc2Iud3JpdGUoJyAgICBhdHRyaWJ1dGVzICRhdHRyaWJ1dGVzXG4nKTsKICAgIH0KICAgIGlmIChjb2RlICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoY29kZS50b1N0cmluZygpKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8vIEJ5dGVjb2RlIG9mIGEgbmVzdGVkIGZ1bmN0aW9uIChjbG9zdXJlKS4KLy8vIENsb3N1cmVzIHNoYXJlIHRoZSBjb25zdGFudCBwb29sIG9mIGEgdG9wLWxldmVsIG1lbWJlci4KY2xhc3MgQ2xvc3VyZUNvZGUgewogIHN0YXRpYyBjb25zdCBoYXNFeGNlcHRpb25zVGFibGVGbGFnID0gMSA8PCAwOwogIHN0YXRpYyBjb25zdCBoYXNTb3VyY2VQb3NpdGlvbnNGbGFnID0gMSA8PCAxOwogIHN0YXRpYyBjb25zdCBoYXNMb2NhbFZhcmlhYmxlc0ZsYWcgPSAxIDw8IDI7CgogIGZpbmFsIFVpbnQ4TGlzdCBieXRlY29kZXM7CiAgZmluYWwgRXhjZXB0aW9uc1RhYmxlIGV4Y2VwdGlvbnNUYWJsZTsKICBmaW5hbCBTb3VyY2VQb3NpdGlvbnMgc291cmNlUG9zaXRpb25zOwogIGZpbmFsIExvY2FsVmFyaWFibGVUYWJsZSBsb2NhbFZhcmlhYmxlczsKCiAgYm9vbCBnZXQgaGFzRXhjZXB0aW9uc1RhYmxlID0+IGV4Y2VwdGlvbnNUYWJsZS5ibG9ja3MuaXNOb3RFbXB0eTsKICBib29sIGdldCBoYXNTb3VyY2VQb3NpdGlvbnMgPT4KICAgICAgc291cmNlUG9zaXRpb25zICE9IG51bGwgJiYgc291cmNlUG9zaXRpb25zLmlzTm90RW1wdHk7CiAgYm9vbCBnZXQgaGFzTG9jYWxWYXJpYWJsZXMgPT4KICAgICAgbG9jYWxWYXJpYWJsZXMgIT0gbnVsbCAmJiBsb2NhbFZhcmlhYmxlcy5pc05vdEVtcHR5OwoKICBpbnQgZ2V0IGZsYWdzID0+CiAgICAgIChoYXNFeGNlcHRpb25zVGFibGUgPyBoYXNFeGNlcHRpb25zVGFibGVGbGFnIDogMCkgfAogICAgICAoaGFzU291cmNlUG9zaXRpb25zID8gaGFzU291cmNlUG9zaXRpb25zRmxhZyA6IDApIHwKICAgICAgKGhhc0xvY2FsVmFyaWFibGVzID8gaGFzTG9jYWxWYXJpYWJsZXNGbGFnIDogMCk7CgogIENsb3N1cmVDb2RlKHRoaXMuYnl0ZWNvZGVzLCB0aGlzLmV4Y2VwdGlvbnNUYWJsZSwgdGhpcy5zb3VyY2VQb3NpdGlvbnMsCiAgICAgIHRoaXMubG9jYWxWYXJpYWJsZXMpOwoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGZsYWdzKTsKICAgIF93cml0ZUJ5dGVjb2RlSW5zdHJ1Y3Rpb25zKHdyaXRlciwgYnl0ZWNvZGVzKTsKICAgIGlmIChoYXNFeGNlcHRpb25zVGFibGUpIHsKICAgICAgZXhjZXB0aW9uc1RhYmxlLndyaXRlKHdyaXRlcik7CiAgICB9CiAgICBpZiAoaGFzU291cmNlUG9zaXRpb25zKSB7CiAgICAgIHdyaXRlci53cml0ZUxpbmtPZmZzZXQoc291cmNlUG9zaXRpb25zKTsKICAgIH0KICAgIGlmIChoYXNMb2NhbFZhcmlhYmxlcykgewogICAgICB3cml0ZXIud3JpdGVMaW5rT2Zmc2V0KGxvY2FsVmFyaWFibGVzKTsKICAgIH0KICB9CgogIGZhY3RvcnkgQ2xvc3VyZUNvZGUucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZpbmFsIGludCBmbGFncyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBmaW5hbCBVaW50OExpc3QgYnl0ZWNvZGVzID0gX3JlYWRCeXRlY29kZUluc3RydWN0aW9ucyhyZWFkZXIpOwogICAgZmluYWwgZXhjZXB0aW9uc1RhYmxlID0gKChmbGFncyAmIGhhc0V4Y2VwdGlvbnNUYWJsZUZsYWcpICE9IDApCiAgICAgICAgPyBuZXcgRXhjZXB0aW9uc1RhYmxlLnJlYWQocmVhZGVyKQogICAgICAgIDogbmV3IEV4Y2VwdGlvbnNUYWJsZSgpOwogICAgZmluYWwgc291cmNlUG9zaXRpb25zID0gKChmbGFncyAmIGhhc1NvdXJjZVBvc2l0aW9uc0ZsYWcpICE9IDApCiAgICAgICAgPyByZWFkZXIucmVhZExpbmtPZmZzZXQ8U291cmNlUG9zaXRpb25zPigpCiAgICAgICAgOiBudWxsOwogICAgZmluYWwgbG9jYWxWYXJpYWJsZXMgPSAoKGZsYWdzICYgaGFzTG9jYWxWYXJpYWJsZXNGbGFnKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRMaW5rT2Zmc2V0PExvY2FsVmFyaWFibGVUYWJsZT4oKQogICAgICAgIDogbnVsbDsKICAgIHJldHVybiBuZXcgQ2xvc3VyZUNvZGUoCiAgICAgICAgYnl0ZWNvZGVzLCBleGNlcHRpb25zVGFibGUsIHNvdXJjZVBvc2l0aW9ucywgbG9jYWxWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGVsbignQ2xvc3VyZUNvZGUgeycpOwogICAgc2Iud3JpdGUobmV3IEJ5dGVjb2RlRGlzYXNzZW1ibGVyKCkKICAgICAgICAuZGlzYXNzZW1ibGUoYnl0ZWNvZGVzLCBleGNlcHRpb25zVGFibGUsIGFubm90YXRpb25zOiBbCiAgICAgIGhhc1NvdXJjZVBvc2l0aW9ucwogICAgICAgICAgPyBzb3VyY2VQb3NpdGlvbnMuZ2V0Qnl0ZWNvZGVBbm5vdGF0aW9ucygpCiAgICAgICAgICA6IGNvbnN0IDxpbnQsIFN0cmluZz57fSwKICAgICAgaGFzTG9jYWxWYXJpYWJsZXMKICAgICAgICAgID8gbG9jYWxWYXJpYWJsZXMuZ2V0Qnl0ZWNvZGVBbm5vdGF0aW9ucygpCiAgICAgICAgICA6IGNvbnN0IDxpbnQsIFN0cmluZz57fQogICAgXSkpOwogICAgc2Iud3JpdGVsbignfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uIGV4dGVuZHMgQnl0ZWNvZGVEZWNsYXJhdGlvbiB7CiAgZmluYWwgT2JqZWN0SGFuZGxlIG9iamVjdDsKCiAgQW5ub3RhdGlvbnNEZWNsYXJhdGlvbih0aGlzLm9iamVjdCk7CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3Qob2JqZWN0KTsKICB9CgogIGZhY3RvcnkgQW5ub3RhdGlvbnNEZWNsYXJhdGlvbi5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uc0RlY2xhcmF0aW9uKHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gb2JqZWN0LnRvU3RyaW5nKCk7Cn0KCmNsYXNzIF9TZWN0aW9uIHsKICBpbnQgbnVtSXRlbXM7CiAgaW50IG9mZnNldDsKICBCdWZmZXJlZFdyaXRlciB3cml0ZXI7CgogIF9TZWN0aW9uKHRoaXMubnVtSXRlbXMsIHRoaXMud3JpdGVyKTsKCiAgaW50IGdldCBzaXplID0+IHdyaXRlci5vZmZzZXQ7Cn0KCmNsYXNzIENvbXBvbmVudCB7CiAgc3RhdGljIGNvbnN0IGludCBtYWdpY1ZhbHVlID0gMHg0NDQyNDMzMjsgLy8gJ0RCQzInCiAgc3RhdGljIGNvbnN0IGludCBudW1TZWN0aW9ucyA9IDE0OwogIHN0YXRpYyBjb25zdCBpbnQgc2VjdGlvbkFsaWdubWVudCA9IDQ7CgogIC8vICBVSW50MzIgbWFnaWMsIHZlcnNpb24sIG51bVNlY3Rpb25zIHggKG51bUl0ZW1zLCBvZmZzZXQpCiAgc3RhdGljIGNvbnN0IGludCBoZWFkZXJTaXplID0gKDIgKyBudW1TZWN0aW9ucyAqIDIpICogNDsKCiAgaW50IHZlcnNpb247CiAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGU7CiAgT2JqZWN0VGFibGUgb2JqZWN0VGFibGU7CiAgZmluYWwgTGlzdDxMaWJyYXJ5RGVjbGFyYXRpb24+IGxpYnJhcmllcyA9IDxMaWJyYXJ5RGVjbGFyYXRpb24+W107CiAgZmluYWwgTGlzdDxDbGFzc0RlY2xhcmF0aW9uPiBjbGFzc2VzID0gPENsYXNzRGVjbGFyYXRpb24+W107CiAgZmluYWwgTGlzdDxNZW1iZXJzPiBtZW1iZXJzID0gPE1lbWJlcnM+W107CiAgZmluYWwgTGlzdDxDb2RlPiBjb2RlcyA9IDxDb2RlPltdOwogIGZpbmFsIExpc3Q8U291cmNlUG9zaXRpb25zPiBzb3VyY2VQb3NpdGlvbnMgPSA8U291cmNlUG9zaXRpb25zPltdOwogIGZpbmFsIExpc3Q8TGluZVN0YXJ0cz4gbGluZVN0YXJ0cyA9IDxMaW5lU3RhcnRzPltdOwogIGZpbmFsIExpc3Q8U291cmNlRmlsZT4gc291cmNlRmlsZXMgPSA8U291cmNlRmlsZT5bXTsKICBmaW5hbCBNYXA8VXJpLCBTb3VyY2VGaWxlPiB1cmlUb1NvdXJjZSA9IDxVcmksIFNvdXJjZUZpbGU+e307CiAgZmluYWwgTGlzdDxMb2NhbFZhcmlhYmxlVGFibGU+IGxvY2FsVmFyaWFibGVzID0gPExvY2FsVmFyaWFibGVUYWJsZT5bXTsKICBmaW5hbCBMaXN0PEFubm90YXRpb25zRGVjbGFyYXRpb24+IGFubm90YXRpb25zID0gPEFubm90YXRpb25zRGVjbGFyYXRpb24+W107CiAgU2V0PFN0cmluZz4gcHJvdGVjdGVkTmFtZXM7CiAgT2JqZWN0SGFuZGxlIG1haW5MaWJyYXJ5OwoKICBDb21wb25lbnQodGhpcy52ZXJzaW9uLCBDb3JlVHlwZXMgY29yZVR5cGVzKQogICAgICA6IHN0cmluZ1RhYmxlID0gbmV3IFN0cmluZ1RhYmxlKCksCiAgICAgICAgb2JqZWN0VGFibGUgPSBuZXcgT2JqZWN0VGFibGUoY29yZVR5cGVzKTsKCiAgdm9pZCB3cml0ZShCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIG9iamVjdFRhYmxlLmFsbG9jYXRlSW5kZXhUYWJsZSgpOwoKICAgIC8vIFdyaXRlIHNlY3Rpb25zIHRvIHRoZWlyIG93biBidWZmZXJzIGluIHJldmVyc2Ugb3JkZXIgYXMgc2VjdGlvbiBtYXkKICAgIC8vIHJlZmVyZW5jZSBkYXRhIHN0cnVjdHVyZXMgZnJvbSBzdWNjZXNzb3Igc2VjdGlvbnMgYnkgb2Zmc2V0cy4KCiAgICBmaW5hbCBwcm90ZWN0ZWROYW1lc1dyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlci5mcm9tV3JpdGVyKHdyaXRlcik7CiAgICBpZiAocHJvdGVjdGVkTmFtZXMgIT0gbnVsbCAmJiBwcm90ZWN0ZWROYW1lcy5pc05vdEVtcHR5KSB7CiAgICAgIGZvciAodmFyIG5hbWUgaW4gcHJvdGVjdGVkTmFtZXMpIHsKICAgICAgICBwcm90ZWN0ZWROYW1lc1dyaXRlci53cml0ZVBhY2tlZFN0cmluZ1JlZmVyZW5jZShuYW1lKTsKICAgICAgfQogICAgfQoKICAgIGZpbmFsIGFubm90YXRpb25zV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyLmZyb21Xcml0ZXIod3JpdGVyKTsKICAgIGZvciAodmFyIGFubm90IGluIGFubm90YXRpb25zKSB7CiAgICAgIHdyaXRlci5saW5rV3JpdGVyLnB1dChhbm5vdCwgYW5ub3RhdGlvbnNXcml0ZXIub2Zmc2V0KTsKICAgICAgYW5ub3Qud3JpdGUoYW5ub3RhdGlvbnNXcml0ZXIpOwogICAgfQogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5hbm5vdGF0aW9uc1NpemUgKz0gYW5ub3RhdGlvbnNXcml0ZXIub2Zmc2V0OwoKICAgIGZpbmFsIGxvY2FsVmFyaWFibGVzV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyLmZyb21Xcml0ZXIod3JpdGVyKTsKICAgIGZvciAodmFyIGx2IGluIGxvY2FsVmFyaWFibGVzKSB7CiAgICAgIHdyaXRlci5saW5rV3JpdGVyLnB1dChsdiwgbG9jYWxWYXJpYWJsZXNXcml0ZXIub2Zmc2V0KTsKICAgICAgbHYud3JpdGUobG9jYWxWYXJpYWJsZXNXcml0ZXIpOwogICAgfQogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5sb2NhbFZhcmlhYmxlc1NpemUgKz0gbG9jYWxWYXJpYWJsZXNXcml0ZXIub2Zmc2V0OwoKICAgIGZpbmFsIGxpbmVTdGFydHNXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIuZnJvbVdyaXRlcih3cml0ZXIpOwogICAgZm9yICh2YXIgbHMgaW4gbGluZVN0YXJ0cykgewogICAgICB3cml0ZXIubGlua1dyaXRlci5wdXQobHMsIGxpbmVTdGFydHNXcml0ZXIub2Zmc2V0KTsKICAgICAgbHMud3JpdGUobGluZVN0YXJ0c1dyaXRlcik7CiAgICB9CiAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLmxpbmVTdGFydHNTaXplICs9IGxpbmVTdGFydHNXcml0ZXIub2Zmc2V0OwoKICAgIGZpbmFsIHNvdXJjZUZpbGVzV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyLmZyb21Xcml0ZXIod3JpdGVyKTsKICAgIGZvciAodmFyIHNmIGluIHNvdXJjZUZpbGVzKSB7CiAgICAgIHdyaXRlci5saW5rV3JpdGVyLnB1dChzZiwgc291cmNlRmlsZXNXcml0ZXIub2Zmc2V0KTsKICAgICAgc2Yud3JpdGUoc291cmNlRmlsZXNXcml0ZXIpOwogICAgfQogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5zb3VyY2VGaWxlc1NpemUgKz0gc291cmNlRmlsZXNXcml0ZXIub2Zmc2V0OwoKICAgIGZpbmFsIHNvdXJjZVBvc2l0aW9uc1dyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlci5mcm9tV3JpdGVyKHdyaXRlcik7CiAgICBmb3IgKHZhciBzcCBpbiBzb3VyY2VQb3NpdGlvbnMpIHsKICAgICAgd3JpdGVyLmxpbmtXcml0ZXIucHV0KHNwLCBzb3VyY2VQb3NpdGlvbnNXcml0ZXIub2Zmc2V0KTsKICAgICAgc3Aud3JpdGUoc291cmNlUG9zaXRpb25zV3JpdGVyKTsKICAgIH0KICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3Muc291cmNlUG9zaXRpb25zU2l6ZSArPSBzb3VyY2VQb3NpdGlvbnNXcml0ZXIub2Zmc2V0OwoKICAgIGZpbmFsIGNvZGVzV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyLmZyb21Xcml0ZXIod3JpdGVyKTsKICAgIGZvciAodmFyIGNvZGUgaW4gY29kZXMpIHsKICAgICAgd3JpdGVyLmxpbmtXcml0ZXIucHV0KGNvZGUsIGNvZGVzV3JpdGVyLm9mZnNldCk7CiAgICAgIGNvZGUud3JpdGUoY29kZXNXcml0ZXIpOwogICAgfQoKICAgIGZpbmFsIG1lbWJlcnNXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIuZnJvbVdyaXRlcih3cml0ZXIpOwogICAgZm9yICh2YXIgbSBpbiBtZW1iZXJzKSB7CiAgICAgIHdyaXRlci5saW5rV3JpdGVyLnB1dChtLCBtZW1iZXJzV3JpdGVyLm9mZnNldCk7CiAgICAgIG0ud3JpdGUobWVtYmVyc1dyaXRlcik7CiAgICB9CgogICAgZmluYWwgY2xhc3Nlc1dyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlci5mcm9tV3JpdGVyKHdyaXRlcik7CiAgICBmb3IgKHZhciBjbHMgaW4gY2xhc3NlcykgewogICAgICB3cml0ZXIubGlua1dyaXRlci5wdXQoY2xzLCBjbGFzc2VzV3JpdGVyLm9mZnNldCk7CiAgICAgIGNscy53cml0ZShjbGFzc2VzV3JpdGVyKTsKICAgIH0KCiAgICBmaW5hbCBsaWJyYXJpZXNXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIuZnJvbVdyaXRlcih3cml0ZXIpOwogICAgZm9yICh2YXIgbGlicmFyeSBpbiBsaWJyYXJpZXMpIHsKICAgICAgd3JpdGVyLmxpbmtXcml0ZXIucHV0KGxpYnJhcnksIGxpYnJhcmllc1dyaXRlci5vZmZzZXQpOwogICAgICBsaWJyYXJ5LndyaXRlKGxpYnJhcmllc1dyaXRlcik7CiAgICB9CgogICAgZmluYWwgbGlicmFyeUluZGV4V3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyLmZyb21Xcml0ZXIod3JpdGVyKTsKICAgIGZvciAodmFyIGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGxpYnJhcnlJbmRleFdyaXRlci53cml0ZVBhY2tlZE9iamVjdChsaWJyYXJ5LmltcG9ydFVyaSk7CiAgICAgIGxpYnJhcnlJbmRleFdyaXRlci53cml0ZUxpbmtPZmZzZXQobGlicmFyeSk7CiAgICB9CiAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLmxpYnJhcmllc1NpemUgKz0gbGlicmFyeUluZGV4V3JpdGVyLm9mZnNldDsKCiAgICBCdWZmZXJlZFdyaXRlciBtYWluV3JpdGVyOwogICAgaWYgKG1haW5MaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgbWFpbldyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlci5mcm9tV3JpdGVyKHdyaXRlcik7CiAgICAgIG1haW5Xcml0ZXIud3JpdGVQYWNrZWRPYmplY3QobWFpbkxpYnJhcnkpOwogICAgfQoKICAgIGZpbmFsIG9iamVjdHNXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIuZnJvbVdyaXRlcih3cml0ZXIpOwogICAgb2JqZWN0VGFibGUud3JpdGUob2JqZWN0c1dyaXRlcik7CgogICAgZmluYWwgc3RyaW5nc1dyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlci5mcm9tV3JpdGVyKHdyaXRlcik7CiAgICBzdHJpbmdUYWJsZS53cml0ZShzdHJpbmdzV3JpdGVyKTsKCiAgICBMaXN0PF9TZWN0aW9uPiBzZWN0aW9ucyA9IFsKICAgICAgbmV3IF9TZWN0aW9uKDAsIHN0cmluZ3NXcml0ZXIpLAogICAgICBuZXcgX1NlY3Rpb24oMCwgb2JqZWN0c1dyaXRlciksCiAgICAgIG5ldyBfU2VjdGlvbigwLCBtYWluV3JpdGVyKSwKICAgICAgbmV3IF9TZWN0aW9uKGxpYnJhcmllcy5sZW5ndGgsIGxpYnJhcnlJbmRleFdyaXRlciksCiAgICAgIG5ldyBfU2VjdGlvbihsaWJyYXJpZXMubGVuZ3RoLCBsaWJyYXJpZXNXcml0ZXIpLAogICAgICBuZXcgX1NlY3Rpb24oY2xhc3Nlcy5sZW5ndGgsIGNsYXNzZXNXcml0ZXIpLAogICAgICBuZXcgX1NlY3Rpb24obWVtYmVycy5sZW5ndGgsIG1lbWJlcnNXcml0ZXIpLAogICAgICBuZXcgX1NlY3Rpb24oY29kZXMubGVuZ3RoLCBjb2Rlc1dyaXRlciksCiAgICAgIG5ldyBfU2VjdGlvbihzb3VyY2VQb3NpdGlvbnMubGVuZ3RoLCBzb3VyY2VQb3NpdGlvbnNXcml0ZXIpLAogICAgICBuZXcgX1NlY3Rpb24oc291cmNlRmlsZXMubGVuZ3RoLCBzb3VyY2VGaWxlc1dyaXRlciksCiAgICAgIG5ldyBfU2VjdGlvbihsaW5lU3RhcnRzLmxlbmd0aCwgbGluZVN0YXJ0c1dyaXRlciksCiAgICAgIG5ldyBfU2VjdGlvbihsb2NhbFZhcmlhYmxlcy5sZW5ndGgsIGxvY2FsVmFyaWFibGVzV3JpdGVyKSwKICAgICAgbmV3IF9TZWN0aW9uKGFubm90YXRpb25zLmxlbmd0aCwgYW5ub3RhdGlvbnNXcml0ZXIpLAogICAgICBuZXcgX1NlY3Rpb24ocHJvdGVjdGVkTmFtZXMgIT0gbnVsbCA/IHByb3RlY3RlZE5hbWVzLmxlbmd0aCA6IDAsCiAgICAgICAgICBwcm90ZWN0ZWROYW1lc1dyaXRlciksCiAgICBdOwogICAgYXNzZXJ0KHNlY3Rpb25zLmxlbmd0aCA9PSBudW1TZWN0aW9ucyk7CgogICAgaW50IG9mZnNldCA9IGhlYWRlclNpemU7CiAgICBmb3IgKHZhciBzZWN0aW9uIGluIHNlY3Rpb25zKSB7CiAgICAgIGlmIChzZWN0aW9uLndyaXRlciAhPSBudWxsKSB7CiAgICAgICAgc2VjdGlvbi5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgb2Zmc2V0ICs9IHNlY3Rpb24uc2l6ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZWN0aW9uLm9mZnNldCA9IDA7CiAgICAgIH0KICAgIH0KCiAgICBmaW5hbCBzdGFydCA9IHdyaXRlci5vZmZzZXQ7CgogICAgd3JpdGVyLndyaXRlVUludDMyKG1hZ2ljVmFsdWUpOwogICAgd3JpdGVyLndyaXRlVUludDMyKHZlcnNpb24pOwogICAgZm9yICh2YXIgc2VjdGlvbiBpbiBzZWN0aW9ucykgewogICAgICB3cml0ZXIud3JpdGVVSW50MzIoc2VjdGlvbi5udW1JdGVtcyk7CiAgICAgIHdyaXRlci53cml0ZVVJbnQzMihzZWN0aW9uLm9mZnNldCk7CiAgICB9CiAgICBhc3NlcnQod3JpdGVyLm9mZnNldCAtIHN0YXJ0ID09IGhlYWRlclNpemUpOwogICAgZm9yICh2YXIgc2VjdGlvbiBpbiBzZWN0aW9ucykgewogICAgICBpZiAoc2VjdGlvbi53cml0ZXIgIT0gbnVsbCkgewogICAgICAgIGFzc2VydCh3cml0ZXIub2Zmc2V0IC0gc3RhcnQgPT0gc2VjdGlvbi5vZmZzZXQpOwogICAgICAgIHdyaXRlci5hcHBlbmRXcml0ZXIoc2VjdGlvbi53cml0ZXIpOwogICAgICB9CiAgICB9CgogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5jb21wb25lbnRTaXplICs9ICh3cml0ZXIub2Zmc2V0IC0gc3RhcnQpOwogIH0KCiAgQ29tcG9uZW50LnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBmaW5hbCBpbnQgc3RhcnQgPSByZWFkZXIub2Zmc2V0OwoKICAgIGZpbmFsIGludCBtYWdpYyA9IHJlYWRlci5yZWFkVUludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gbWFnaWNWYWx1ZSkgewogICAgICB0aHJvdyAnRXJyb3I6IHVuZXhwZWN0ZWQgYnl0ZWNvZGUgbWFnaWMgJG1hZ2ljJzsKICAgIH0KCiAgICB2ZXJzaW9uID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIGlmICh2ZXJzaW9uICE9IGN1cnJlbnRCeXRlY29kZUZvcm1hdFZlcnNpb24pIHsKICAgICAgdGhyb3cgJ0Vycm9yOiB1bmV4cGVjdGVkIGJ5dGVjb2RlIGZvcm1hdCB2ZXJzaW9uICR2ZXJzaW9uJzsKICAgIH0KCiAgICByZWFkZXIuZm9ybWF0VmVyc2lvbiA9IHZlcnNpb247CgogICAgcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIGZpbmFsIHN0cmluZ1RhYmxlT2Zmc2V0ID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKCiAgICByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgb2JqZWN0VGFibGVPZmZzZXQgPSByZWFkZXIucmVhZFVJbnQzMigpOwoKICAgIHJlYWRlci5yZWFkVUludDMyKCk7CiAgICBmaW5hbCBtYWluT2Zmc2V0ID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKCiAgICBmaW5hbCBsaWJyYXJpZXNOdW0gPSByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgbGlicmFyeUluZGV4T2Zmc2V0ID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKCiAgICByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgbGlicmFyaWVzT2Zmc2V0ID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKCiAgICBmaW5hbCBjbGFzc2VzTnVtID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIGZpbmFsIGNsYXNzZXNPZmZzZXQgPSByZWFkZXIucmVhZFVJbnQzMigpOwoKICAgIGZpbmFsIG1lbWJlcnNOdW0gPSByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgbWVtYmVyc09mZnNldCA9IHJlYWRlci5yZWFkVUludDMyKCk7CgogICAgZmluYWwgY29kZXNOdW0gPSByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgY29kZXNPZmZzZXQgPSByZWFkZXIucmVhZFVJbnQzMigpOwoKICAgIGZpbmFsIHNvdXJjZVBvc2l0aW9uc051bSA9IHJlYWRlci5yZWFkVUludDMyKCk7CiAgICBmaW5hbCBzb3VyY2VQb3NpdGlvbnNPZmZzZXQgPSByZWFkZXIucmVhZFVJbnQzMigpOwoKICAgIGZpbmFsIHNvdXJjZUZpbGVzTnVtID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIGZpbmFsIHNvdXJjZUZpbGVzT2Zmc2V0ID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKCiAgICBmaW5hbCBsaW5lU3RhcnRzTnVtID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIGZpbmFsIGxpbmVTdGFydHNPZmZzZXQgPSByZWFkZXIucmVhZFVJbnQzMigpOwoKICAgIGZpbmFsIGxvY2FsVmFyaWFibGVzTnVtID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKICAgIGZpbmFsIGxvY2FsVmFyaWFibGVzT2Zmc2V0ID0gcmVhZGVyLnJlYWRVSW50MzIoKTsKCiAgICBmaW5hbCBhbm5vdGF0aW9uc051bSA9IHJlYWRlci5yZWFkVUludDMyKCk7CiAgICBmaW5hbCBhbm5vdGF0aW9uc09mZnNldCA9IHJlYWRlci5yZWFkVUludDMyKCk7CgogICAgZmluYWwgcHJvdGVjdGVkTmFtZXNOdW0gPSByZWFkZXIucmVhZFVJbnQzMigpOwogICAgZmluYWwgcHJvdGVjdGVkTmFtZXNPZmZzZXQgPSByZWFkZXIucmVhZFVJbnQzMigpOwoKICAgIHJlYWRlci5vZmZzZXQgPSBzdGFydCArIHN0cmluZ1RhYmxlT2Zmc2V0OwogICAgc3RyaW5nVGFibGUgPSBuZXcgU3RyaW5nVGFibGUucmVhZChyZWFkZXIpOwogICAgcmVhZGVyLnN0cmluZ1JlYWRlciA9IHN0cmluZ1RhYmxlOwoKICAgIHJlYWRlci5vZmZzZXQgPSBzdGFydCArIG9iamVjdFRhYmxlT2Zmc2V0OwogICAgb2JqZWN0VGFibGUgPSBuZXcgT2JqZWN0VGFibGUucmVhZChyZWFkZXIpOwogICAgcmVhZGVyLm9iamVjdFJlYWRlciA9IG9iamVjdFRhYmxlOwoKICAgIC8vIFJlYWQgc2VjdGlvbnMgaW4gdGhlIHJldmVyc2Ugb3JkZXIgYXMgc2VjdGlvbiBtYXkgcmVmZXJlbmNlCiAgICAvLyBzdWNjZXNzb3Igc2VjdGlvbnMgYnkgb2Zmc2V0cy4KCiAgICBpZiAocHJvdGVjdGVkTmFtZXNOdW0gIT0gMCkgewogICAgICBwcm90ZWN0ZWROYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwogICAgICByZWFkZXIub2Zmc2V0ID0gc3RhcnQgKyBwcm90ZWN0ZWROYW1lc09mZnNldDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90ZWN0ZWROYW1lc051bTsgKytpKSB7CiAgICAgICAgcHJvdGVjdGVkTmFtZXMuYWRkKHJlYWRlci5yZWFkUGFja2VkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICB9CiAgICB9CgogICAgZmluYWwgYW5ub3RhdGlvbnNTdGFydCA9IHN0YXJ0ICsgYW5ub3RhdGlvbnNPZmZzZXQ7CiAgICByZWFkZXIub2Zmc2V0ID0gYW5ub3RhdGlvbnNTdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNOdW07ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcmVhZGVyLm9mZnNldCAtIGFubm90YXRpb25zU3RhcnQ7CiAgICAgIEFubm90YXRpb25zRGVjbGFyYXRpb24gYW5ub3QgPSBuZXcgQW5ub3RhdGlvbnNEZWNsYXJhdGlvbi5yZWFkKHJlYWRlcik7CiAgICAgIHJlYWRlci5saW5rUmVhZGVyLnNldE9mZnNldChhbm5vdCwgb2Zmc2V0KTsKICAgICAgYW5ub3RhdGlvbnMuYWRkKGFubm90KTsKICAgIH0KCiAgICBmaW5hbCBsaW5lU3RhcnRzU3RhcnQgPSBzdGFydCArIGxpbmVTdGFydHNPZmZzZXQ7CiAgICByZWFkZXIub2Zmc2V0ID0gbGluZVN0YXJ0c1N0YXJ0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lU3RhcnRzTnVtOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHJlYWRlci5vZmZzZXQgLSBsaW5lU3RhcnRzU3RhcnQ7CiAgICAgIExpbmVTdGFydHMgbHMgPSBuZXcgTGluZVN0YXJ0cy5yZWFkKHJlYWRlcik7CiAgICAgIHJlYWRlci5saW5rUmVhZGVyLnNldE9mZnNldChscywgb2Zmc2V0KTsKICAgICAgbGluZVN0YXJ0cy5hZGQobHMpOwogICAgfQoKICAgIGZpbmFsIHNvdXJjZUZpbGVzU3RhcnQgPSBzdGFydCArIHNvdXJjZUZpbGVzT2Zmc2V0OwogICAgcmVhZGVyLm9mZnNldCA9IHNvdXJjZUZpbGVzU3RhcnQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzTnVtOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHJlYWRlci5vZmZzZXQgLSBzb3VyY2VGaWxlc1N0YXJ0OwogICAgICBTb3VyY2VGaWxlIHNmID0gbmV3IFNvdXJjZUZpbGUucmVhZChyZWFkZXIpOwogICAgICByZWFkZXIubGlua1JlYWRlci5zZXRPZmZzZXQoc2YsIG9mZnNldCk7CiAgICAgIHNvdXJjZUZpbGVzLmFkZChzZik7CiAgICB9CgogICAgZmluYWwgc291cmNlUG9zaXRpb25zU3RhcnQgPSBzdGFydCArIHNvdXJjZVBvc2l0aW9uc09mZnNldDsKICAgIHJlYWRlci5vZmZzZXQgPSBzb3VyY2VQb3NpdGlvbnNTdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUG9zaXRpb25zTnVtOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHJlYWRlci5vZmZzZXQgLSBzb3VyY2VQb3NpdGlvbnNTdGFydDsKICAgICAgU291cmNlUG9zaXRpb25zIHNwID0gbmV3IFNvdXJjZVBvc2l0aW9ucy5yZWFkKHJlYWRlcik7CiAgICAgIHJlYWRlci5saW5rUmVhZGVyLnNldE9mZnNldChzcCwgb2Zmc2V0KTsKICAgICAgc291cmNlUG9zaXRpb25zLmFkZChzcCk7CiAgICB9CgogICAgZmluYWwgbG9jYWxWYXJpYWJsZXNTdGFydCA9IHN0YXJ0ICsgbG9jYWxWYXJpYWJsZXNPZmZzZXQ7CiAgICByZWFkZXIub2Zmc2V0ID0gbG9jYWxWYXJpYWJsZXNTdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxWYXJpYWJsZXNOdW07ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcmVhZGVyLm9mZnNldCAtIGxvY2FsVmFyaWFibGVzU3RhcnQ7CiAgICAgIExvY2FsVmFyaWFibGVUYWJsZSBsdiA9IG5ldyBMb2NhbFZhcmlhYmxlVGFibGUucmVhZChyZWFkZXIpOwogICAgICByZWFkZXIubGlua1JlYWRlci5zZXRPZmZzZXQobHYsIG9mZnNldCk7CiAgICAgIGxvY2FsVmFyaWFibGVzLmFkZChsdik7CiAgICB9CgogICAgZmluYWwgY29kZXNTdGFydCA9IHN0YXJ0ICsgY29kZXNPZmZzZXQ7CiAgICByZWFkZXIub2Zmc2V0ID0gY29kZXNTdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29kZXNOdW07ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcmVhZGVyLm9mZnNldCAtIGNvZGVzU3RhcnQ7CiAgICAgIENvZGUgY29kZSA9IG5ldyBDb2RlLnJlYWQocmVhZGVyKTsKICAgICAgcmVhZGVyLmxpbmtSZWFkZXIuc2V0T2Zmc2V0KGNvZGUsIG9mZnNldCk7CiAgICAgIGNvZGVzLmFkZChjb2RlKTsKICAgIH0KCiAgICBmaW5hbCBtZW1iZXJzU3RhcnQgPSBzdGFydCArIG1lbWJlcnNPZmZzZXQ7CiAgICByZWFkZXIub2Zmc2V0ID0gbWVtYmVyc1N0YXJ0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzTnVtOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHJlYWRlci5vZmZzZXQgLSBtZW1iZXJzU3RhcnQ7CiAgICAgIE1lbWJlcnMgbSA9IG5ldyBNZW1iZXJzLnJlYWQocmVhZGVyKTsKICAgICAgcmVhZGVyLmxpbmtSZWFkZXIuc2V0T2Zmc2V0KG0sIG9mZnNldCk7CiAgICAgIG1lbWJlcnMuYWRkKG0pOwogICAgfQoKICAgIGZpbmFsIGNsYXNzZXNTdGFydCA9IHN0YXJ0ICsgY2xhc3Nlc09mZnNldDsKICAgIHJlYWRlci5vZmZzZXQgPSBjbGFzc2VzU3RhcnQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXNOdW07ICsraSkgewogICAgICBpbnQgb2Zmc2V0ID0gcmVhZGVyLm9mZnNldCAtIGNsYXNzZXNTdGFydDsKICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbHMgPSBuZXcgQ2xhc3NEZWNsYXJhdGlvbi5yZWFkKHJlYWRlcik7CiAgICAgIHJlYWRlci5saW5rUmVhZGVyLnNldE9mZnNldChjbHMsIG9mZnNldCk7CiAgICAgIGNsYXNzZXMuYWRkKGNscyk7CiAgICB9CgogICAgZmluYWwgbGlicmFyaWVzU3RhcnQgPSBzdGFydCArIGxpYnJhcmllc09mZnNldDsKICAgIHJlYWRlci5vZmZzZXQgPSBsaWJyYXJpZXNTdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzTnVtOyArK2kpIHsKICAgICAgaW50IG9mZnNldCA9IHJlYWRlci5vZmZzZXQgLSBsaWJyYXJpZXNTdGFydDsKICAgICAgTGlicmFyeURlY2xhcmF0aW9uIGxpYnJhcnkgPSBuZXcgTGlicmFyeURlY2xhcmF0aW9uLnJlYWQocmVhZGVyKTsKICAgICAgcmVhZGVyLmxpbmtSZWFkZXIuc2V0T2Zmc2V0KGxpYnJhcnksIG9mZnNldCk7CiAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeSk7CiAgICB9CgogICAgZmluYWwgbGlicmFyeUluZGV4U3RhcnQgPSBzdGFydCArIGxpYnJhcnlJbmRleE9mZnNldDsKICAgIHJlYWRlci5vZmZzZXQgPSBsaWJyYXJ5SW5kZXhTdGFydDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzTnVtOyArK2kpIHsKICAgICAgZmluYWwgaW1wb3J0VXJpID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgICAgZmluYWwgbGlicmFyeSA9IHJlYWRlci5yZWFkTGlua09mZnNldDxMaWJyYXJ5RGVjbGFyYXRpb24+KCk7CiAgICAgIGxpYnJhcnkuaW1wb3J0VXJpID0gaW1wb3J0VXJpOwogICAgfQoKICAgIGlmIChtYWluT2Zmc2V0ICE9IDApIHsKICAgICAgcmVhZGVyLm9mZnNldCA9IHN0YXJ0ICsgbWFpbk9mZnNldDsKICAgICAgbWFpbkxpYnJhcnkgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoIkJ5dGVjb2RlICh2ZXJzaW9uOiAiKTsKICAgIGlmICh2ZXJzaW9uID09IGN1cnJlbnRCeXRlY29kZUZvcm1hdFZlcnNpb24pIHsKICAgICAgc2Iud3JpdGUoInN0YWJsZSIpOwogICAgfSBlbHNlIHsKICAgICAgc2Iud3JpdGUoInYkdmVyc2lvbiIpOwogICAgfQogICAgc2Iud3JpdGVsbigiKSIpOwogICAgaWYgKG1haW5MaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGVsbigiTWFpbiBsaWJyYXJ5OiAkbWFpbkxpYnJhcnkiKTsKICAgIH0KICAgIGZvciAodmFyIGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIHNiLndyaXRlKGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9Cgp2b2lkIF93cml0ZUJ5dGVjb2RlSW5zdHJ1Y3Rpb25zKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciwgVWludDhMaXN0IGJ5dGVjb2RlcykgewogIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChieXRlY29kZXMubGVuZ3RoKTsKICB3cml0ZXIuYXBwZW5kVWludDhMaXN0KGJ5dGVjb2Rlcyk7CiAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5pbnN0cnVjdGlvbnNTaXplICs9IGJ5dGVjb2Rlcy5sZW5ndGg7Cn0KClVpbnQ4TGlzdCBfcmVhZEJ5dGVjb2RlSW5zdHJ1Y3Rpb25zKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogIGludCBsZW4gPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogIHJldHVybiByZWFkZXIucmVhZEJ5dGVzQXNVaW50OExpc3QobGVuKTsKfQqGQgBOTjwBIgFKOCUJGBgdIBUvNTYvPEhBASkBNy0pKzQBGhMbHSooAUkpASYhJSQmLC0GLh8qIwZFBAE7LSwuFEkzSgg9MCIjPAQBDBYwJiImLisGKicGLDQGNSEGEh8VBhoEAgE1KCQrLjswLCcBFRMdFhkyHiAnGSwBFBESExUYGx0WFxQZASYhJSYBMS4xBi8yBiwkBikoLSsGJUME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ZS5leGNlcHRpb25zOwoKaW1wb3J0ICdieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnQnIHNob3cgQnVmZmVyZWRXcml0ZXIsIEJ1ZmZlcmVkUmVhZGVyOwoKLyoKCkluIGtlcm5lbCBiaW5hcnksIHRyeSBibG9ja3MgYXJlIGVuY29kZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkKKHVzaW5nIG5vdGF0aW9uIGZyb20gcGtnL2tlcm5lbC9iaW5hcnkubWQpOgoKLy8gT2Zmc2V0IG9mIGEgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCnR5cGUgQnl0ZWNvZGVPZmZzZXQgPSBVSW50OwoKdHlwZSBUcnlCbG9jayB7CiAgVUludCBvdXRlclRyeUluZGV4UGx1czE7CiAgQnl0ZWNvZGVPZmZzZXQgc3RhcnRQQzsgLy8gSW5jbHVzaXZlLgogIEJ5dGVjb2RlT2Zmc2V0IGVuZFBDOyAvLyBFeGNsdXNpdmUuCiAgQnl0ZWNvZGVPZmZzZXQgaGFuZGxlclBDOwogIEJ5dGUgZmxhZ3MgKG5lZWRzU3RhY2tUcmFjZSwgaXNTeW50aGV0aWMpOwogIExpc3Q8Q29uc3RhbnRJbmRleD4gdHlwZXM7Cn0KCnR5cGUgRXhjZXB0aW9uc1RhYmxlIHsKICAvLyBPcmRlcmVkIGJ5IHN0YXJ0UEMsIHRoZW4gYnkgbmVzdGluZyAob3V0ZXIgcHJlY2VkZXMgaW5uZXIpLgogIC8vIFRyeSBibG9ja3MgYXJlIHByb3Blcmx5IG5lc3RlZC4gSXQgbWVhbnMgdGhlcmUgYXJlIG5vIHBhcnRpYWxseQogIC8vIG92ZXJsYXBwaW5nIHRyeSBibG9ja3MgLSBlYWNoIHBhaXIgb2YgdHJ5IGJsb2NrIHJlZ2lvbnMgZWl0aGVyCiAgLy8gaGFzIG5vIGludGVyc2VjdGlvbiBvciBvbmUgdHJ5IGJsb2NrIHJlZ2lvbiBlbmNsb3NlcyBhbm90aGVyLgogIExpc3Q8VHJ5QmxvY2s+IHRyeUJsb2NrczsKfQoKKi8KCmNsYXNzIFRyeUJsb2NrIHsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdOZWVkc1N0YWNrVHJhY2UgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnSXNTeW50aGV0aWMgPSAxIDw8IDE7CgogIGZpbmFsIGludCB0cnlJbmRleDsKICBmaW5hbCBpbnQgb3V0ZXJUcnlJbmRleDsKICBmaW5hbCBpbnQgc3RhcnRQQzsKICBpbnQgZW5kUEM7CiAgaW50IGhhbmRsZXJQQzsKICBpbnQgZmxhZ3MgPSAwOwogIExpc3Q8aW50PiB0eXBlcyA9IDxpbnQ+W107CgogIFRyeUJsb2NrLl8odGhpcy50cnlJbmRleCwgdGhpcy5vdXRlclRyeUluZGV4LCB0aGlzLnN0YXJ0UEMpOwoKICBib29sIGdldCBuZWVkc1N0YWNrVHJhY2UgPT4gKGZsYWdzICYgZmxhZ05lZWRzU3RhY2tUcmFjZSkgIT0gMDsKCiAgdm9pZCBzZXQgbmVlZHNTdGFja1RyYWNlKGJvb2wgdmFsdWUpIHsKICAgIGZsYWdzID0gKGZsYWdzICYgfmZsYWdOZWVkc1N0YWNrVHJhY2UpIHwgKHZhbHVlID8gZmxhZ05lZWRzU3RhY2tUcmFjZSA6IDApOwogIH0KCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gKGZsYWdzICYgZmxhZ0lzU3ludGhldGljKSAhPSAwOwoKICB2b2lkIHNldCBpc1N5bnRoZXRpYyhib29sIHZhbHVlKSB7CiAgICBmbGFncyA9IChmbGFncyAmIH5mbGFnSXNTeW50aGV0aWMpIHwgKHZhbHVlID8gZmxhZ0lzU3ludGhldGljIDogMCk7CiAgfQoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKG91dGVyVHJ5SW5kZXggKyAxKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChzdGFydFBDKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChlbmRQQyk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoaGFuZGxlclBDKTsKICAgIHdyaXRlci53cml0ZUJ5dGUoZmxhZ3MpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHR5cGVzLmxlbmd0aCk7CiAgICB0eXBlcy5mb3JFYWNoKHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMCk7CiAgfQoKICBmYWN0b3J5IFRyeUJsb2NrLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyLCBpbnQgdHJ5SW5kZXgpIHsKICAgIGZpbmFsIG91dGVyVHJ5SW5kZXggPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpIC0gMTsKICAgIGZpbmFsIHN0YXJ0UEMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgZmluYWwgdHJ5QmxvY2sgPSBuZXcgVHJ5QmxvY2suXyh0cnlJbmRleCwgb3V0ZXJUcnlJbmRleCwgc3RhcnRQQyk7CgogICAgdHJ5QmxvY2suZW5kUEMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgdHJ5QmxvY2suaGFuZGxlclBDID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIHRyeUJsb2NrLmZsYWdzID0gcmVhZGVyLnJlYWRCeXRlKCk7CiAgICB0cnlCbG9jay50eXBlcyA9IG5ldyBMaXN0PGludD4uZ2VuZXJhdGUoCiAgICAgICAgcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSwgKF8pID0+IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkpOwoKICAgIHJldHVybiB0cnlCbG9jazsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICd0cnktaW5kZXggJHRyeUluZGV4LCBvdXRlciAkb3V0ZXJUcnlJbmRleCwgJwogICAgICAnc3RhcnQgJHN0YXJ0UEMsIGVuZCAkZW5kUEMsIGhhbmRsZXIgJGhhbmRsZXJQQywgJwogICAgICAnJHtuZWVkc1N0YWNrVHJhY2UgPyAnbmVlZHMtc3RhY2stdHJhY2UsICcgOiAnJ30nCiAgICAgICcke2lzU3ludGhldGljID8gJ3N5bnRoZXRpYywgJyA6ICcnfScKICAgICAgJ3R5cGVzICR7dHlwZXMubWFwKCh0KSA9PiAnQ1AjJHQnKS50b0xpc3QoKX0nOwp9CgpjbGFzcyBFeGNlcHRpb25zVGFibGUgewogIExpc3Q8VHJ5QmxvY2s+IGJsb2NrcyA9IDxUcnlCbG9jaz5bXTsKCiAgRXhjZXB0aW9uc1RhYmxlKCk7CgogIFRyeUJsb2NrIGVudGVyVHJ5QmxvY2soaW50IHN0YXJ0UEMpIHsKICAgIGFzc2VydChibG9ja3MuaXNFbXB0eSB8fCBibG9ja3MubGFzdC5zdGFydFBDIDw9IHN0YXJ0UEMpOwogICAgZmluYWwgdHJ5QmxvY2sgPQogICAgICAgIG5ldyBUcnlCbG9jay5fKGJsb2Nrcy5sZW5ndGgsIF9vdXRlclRyeUJsb2NrSW5kZXgoc3RhcnRQQyksIHN0YXJ0UEMpOwogICAgYmxvY2tzLmFkZCh0cnlCbG9jayk7CiAgICByZXR1cm4gdHJ5QmxvY2s7CiAgfQoKICBpbnQgX291dGVyVHJ5QmxvY2tJbmRleChpbnQgc3RhcnRQQykgewogICAgZm9yIChpbnQgaSA9IGJsb2Nrcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICBmaW5hbCB0cnlCbG9jayA9IGJsb2Nrc1tpXTsKICAgICAgaWYgKHRyeUJsb2NrLmVuZFBDID09IG51bGwgfHwgdHJ5QmxvY2suZW5kUEMgPiBzdGFydFBDKSB7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoYmxvY2tzLmxlbmd0aCk7CiAgICBibG9ja3MuZm9yRWFjaCgoYikgPT4gYi53cml0ZSh3cml0ZXIpKTsKICB9CgogIEV4Y2VwdGlvbnNUYWJsZS5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikKICAgICAgOiBibG9ja3MgPSBuZXcgTGlzdDxUcnlCbG9jaz4uZ2VuZXJhdGUocmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSwKICAgICAgICAgICAgKGludCBpbmRleCkgPT4gbmV3IFRyeUJsb2NrLnJlYWQocmVhZGVyLCBpbmRleCkpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAoYmxvY2tzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGVsbignRXhjZXB0aW9uc1RhYmxlIHsnKTsKICAgIGZvciAodmFyIHRyeUJsb2NrIGluIGJsb2NrcykgewogICAgICBzYi53cml0ZWxuKCcgICR0cnlCbG9jaycpOwogICAgfQogICAgc2Iud3JpdGVsbignfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CoCNAE5OPAEgAUoBAwE+LAElHAEQGygmHC0dAgEXQUVEQxwCAQMBETEtARYbFQ0RER0BPwFCASlQBAE6ASVIBAEmMSclKR0sLQQBPzkvRwEwNCgtRgEVBAEMRTk4LDUCARgoARUBKD4VThoVBAEpMyJAEggGDwQBJi0sBAEuSD4BDBYaEQYqJSMhBhUaBAIBI3BhY2thZ2U6dm0vYnl0ZWNvZGUvZXhjZXB0aW9ucy5kYXJ0TWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9ieXRlY29kZS9nZW5lcmljcy5kYXJ0pdwvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5ieXRlY29kZS5nZW5lcmljczsKCmltcG9ydCAnZGFydDptYXRoJyBzaG93IG1pbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFN0YXRpY1R5cGVDb250ZXh0OwoKaW1wb3J0ICdvcHRpb25zLmRhcnQnIHNob3cgQnl0ZWNvZGVPcHRpb25zOwoKYm9vbCBoYXNJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKENsYXNzIGMpIHsKICBmb3IgKDsgYyAhPSBudWxsOyBjID0gYy5zdXBlcmNsYXNzKSB7CiAgICBpZiAoYy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCkxpc3Q8RGFydFR5cGU+IGdldFR5cGVQYXJhbWV0ZXJUeXBlcyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CiAgfQogIGZpbmFsIHR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgdHlwZXNbaV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlcnNbaV0sIE51bGxhYmlsaXR5LmxlZ2FjeSk7CiAgfQogIHJldHVybiB0eXBlczsKfQoKYm9vbCBfY2FuUmV1c2VTdXBlcmNsYXNzVHlwZUFyZ3VtZW50cyhMaXN0PERhcnRUeXBlPiBzdXBlclR5cGVBcmdzLAogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgaW50IG92ZXJsYXApIHsKICBmb3IgKGludCBpID0gMDsgaSA8IG92ZXJsYXA7ICsraSkgewogICAgZmluYWwgc3VwZXJUeXBlQXJnID0gc3VwZXJUeXBlQXJnc1tzdXBlclR5cGVBcmdzLmxlbmd0aCAtIG92ZXJsYXAgKyBpXTsKICAgIGlmICghKHN1cGVyVHlwZUFyZyBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHN1cGVyVHlwZUFyZy5wYXJhbWV0ZXIgPT0gdHlwZVBhcmFtZXRlcnNbaV0pKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCkxpc3Q8RGFydFR5cGU+IGZsYXR0ZW5JbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKAogICAgQ2xhc3MgaW5zdGFudGlhdGVkQ2xhc3MsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmdzKSB7CiAgZmluYWwgdHlwZVBhcmFtZXRlcnMgPSBpbnN0YW50aWF0ZWRDbGFzcy50eXBlUGFyYW1ldGVyczsKICBhc3NlcnQodHlwZUFyZ3MubGVuZ3RoID09IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CgogIGZpbmFsIHN1cGVydHlwZSA9IGluc3RhbnRpYXRlZENsYXNzLnN1cGVydHlwZTsKICBpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKICAgIHJldHVybiB0eXBlQXJnczsKICB9CgogIGZpbmFsIHN1cGVyVHlwZUFyZ3MgPSBmbGF0dGVuSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cygKICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZSwgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMpOwoKICAvLyBTaHJpbmsgdHlwZSBhcmd1bWVudHMgYnkgcmV1c2luZyBwb3J0aW9uIG9mIHN1cGVyY2xhc3MgdHlwZSBhcmd1bWVudHMKICAvLyBpZiB0aGVyZSBpcyBhbiBvdmVybGFwcGluZy4gVGhpcyBvcHRpbWl6YXRpb24gc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aAogIC8vIFZNIGluIG9yZGVyIHRvIGNvcnJlY3RseSByZXVzZSBpbnN0YW50aWF0b3IgdHlwZSBhcmd1bWVudHMuCiAgaW50IG92ZXJsYXAgPSBtaW4oc3VwZXJUeXBlQXJncy5sZW5ndGgsIHR5cGVBcmdzLmxlbmd0aCk7CiAgZm9yICg7IG92ZXJsYXAgPiAwOyAtLW92ZXJsYXApIHsKICAgIGlmIChfY2FuUmV1c2VTdXBlcmNsYXNzVHlwZUFyZ3VtZW50cygKICAgICAgICBzdXBlclR5cGVBcmdzLCB0eXBlUGFyYW1ldGVycywgb3ZlcmxhcCkpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBmaW5hbCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJncyk7CgogIExpc3Q8RGFydFR5cGU+IGZsYXRUeXBlQXJncyA9IDxEYXJ0VHlwZT5bXTsKICBmb3IgKHZhciB0eXBlIGluIHN1cGVyVHlwZUFyZ3MpIHsKICAgIGZsYXRUeXBlQXJncy5hZGQoc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHR5cGUpKTsKICB9CiAgZmxhdFR5cGVBcmdzLmFkZEFsbCh0eXBlQXJncy5nZXRSYW5nZShvdmVybGFwLCB0eXBlQXJncy5sZW5ndGgpKTsKCiAgcmV0dXJuIGZsYXRUeXBlQXJnczsKfQoKTGlzdDxEYXJ0VHlwZT4gZ2V0SW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cygKICAgIENsYXNzIGluc3RhbnRpYXRlZENsYXNzLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJncykgewogIGZpbmFsIGZsYXRUeXBlQXJncyA9CiAgICAgIGZsYXR0ZW5JbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKGluc3RhbnRpYXRlZENsYXNzLCB0eXBlQXJncyk7CiAgaWYgKGlzQWxsRHluYW1pYyhmbGF0VHlwZUFyZ3MpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIGZsYXRUeXBlQXJnczsKfQoKTGlzdDxEYXJ0VHlwZT4gZ2V0RGVmYXVsdEZ1bmN0aW9uVHlwZUFyZ3VtZW50cyhGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICBmaW5hbCB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogIGlmICh0eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgYm9vbCBkeW5hbWljT25seSA9IHRydWU7CiAgZm9yICh2YXIgdHAgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgIGlmICh0cC5kZWZhdWx0VHlwZSAhPSBudWxsICYmIHRwLmRlZmF1bHRUeXBlICE9IGNvbnN0IER5bmFtaWNUeXBlKCkpIHsKICAgICAgZHluYW1pY09ubHkgPSBmYWxzZTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChkeW5hbWljT25seSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIExpc3Q8RGFydFR5cGU+IGRlZmF1bHRUeXBlcyA9IDxEYXJ0VHlwZT5bXTsKICBmb3IgKHZhciB0cCBpbiB0eXBlUGFyYW1ldGVycykgewogICAgZGVmYXVsdFR5cGVzLmFkZCh0cC5kZWZhdWx0VHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpKTsKICB9CiAgcmV0dXJuIGRlZmF1bHRUeXBlczsKfQoKYm9vbCBpc0FsbER5bmFtaWMoTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3MpIHsKICBmb3IgKHZhciB0IGluIHR5cGVBcmdzKSB7CiAgICBpZiAodCAhPSBjb25zdCBEeW5hbWljVHlwZSgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgaXNJbnN0YW50aWF0ZWRHZW5lcmljVHlwZShEYXJ0VHlwZSB0eXBlKSA9PgogICAgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgJiYKICAgIHR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5ICYmCiAgICAhaGFzRnJlZVR5cGVQYXJhbWV0ZXJzKHR5cGUudHlwZUFyZ3VtZW50cyk7Cgpib29sIGhhc0ZyZWVUeXBlUGFyYW1ldGVycyhMaXN0PERhcnRUeXBlPiB0eXBlQXJncykgewogIGZpbmFsIGZpbmRUeXBlUGFyYW1zID0gbmV3IEZpbmRGcmVlVHlwZVBhcmFtZXRlcnNWaXNpdG9yKCk7CiAgcmV0dXJuIHR5cGVBcmdzLmFueSgodCkgPT4gdC5hY2NlcHQoZmluZFR5cGVQYXJhbXMpKTsKfQoKY2xhc3MgRmluZEZyZWVUeXBlUGFyYW1ldGVyc1Zpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8Ym9vbD4gewogIFNldDxUeXBlUGFyYW1ldGVyPiBfZGVjbGFyZWRUeXBlUGFyYW1ldGVyczsKCiAgYm9vbCB2aXNpdChEYXJ0VHlwZSB0eXBlKSA9PiB0eXBlLmFjY2VwdCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgPT4KICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgdHlwZSAke25vZGUucnVudGltZVR5cGV9ICRub2RlJzsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSA9PgogICAgICBfZGVjbGFyZWRUeXBlUGFyYW1ldGVycyA9PSBudWxsIHx8CiAgICAgICFfZGVjbGFyZWRUeXBlUGFyYW1ldGVycy5jb250YWlucyhub2RlLnBhcmFtZXRlcik7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgPT4KICAgICAgbm9kZS50eXBlQXJndW1lbnRzLmFueSgodCkgPT4gdC5hY2NlcHQodGhpcykpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgPT4KICAgICAgbm9kZS50eXBlQXJndW1lbnRzLmFueSgodCkgPT4gdC5hY2NlcHQodGhpcykpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIF9kZWNsYXJlZFR5cGVQYXJhbWV0ZXJzID8/PSBuZXcgU2V0PFR5cGVQYXJhbWV0ZXI+KCk7CiAgICAgIF9kZWNsYXJlZFR5cGVQYXJhbWV0ZXJzLmFkZEFsbChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIH0KCiAgICBmaW5hbCBib29sIHJlc3VsdCA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuYW55KCh0KSA9PiB0LmFjY2VwdCh0aGlzKSkgfHwKICAgICAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5hbnkoKHApID0+IHAudHlwZS5hY2NlcHQodGhpcykpIHx8CiAgICAgICAgbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKCiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIF9kZWNsYXJlZFR5cGVQYXJhbWV0ZXJzLnJlbW92ZUFsbChub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLy8vIFJldHVybnMgc3RhdGljIHR5cGUgb2YgW2V4cHJdLgpEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKEV4cHJlc3Npb24gZXhwciwgU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQpID0+CiAgICBleHByLmdldFN0YXRpY1R5cGUoc3RhdGljVHlwZUNvbnRleHQpOwoKLy8vIFJldHVybnMgYHRydWVgIGlmIFt0eXBlXSBjYW5ub3QgYmUgZXh0ZW5kZWQgaW4gdXNlciBjb2RlLgpib29sIGlzU2VhbGVkVHlwZShEYXJ0VHlwZSB0eXBlLCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgZmluYWwgY2xzID0gdHlwZS5jbGFzc05vZGU7CiAgICByZXR1cm4gY2xzID09IGNvcmVUeXBlcy5pbnRDbGFzcyB8fAogICAgICAgIGNscyA9PSBjb3JlVHlwZXMuZG91YmxlQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gY29yZVR5cGVzLmJvb2xDbGFzcyB8fAogICAgICAgIGNscyA9PSBjb3JlVHlwZXMuc3RyaW5nQ2xhc3MgfHwKICAgICAgICBjbHMgPT0gY29yZVR5cGVzLm51bGxDbGFzczsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gUmV0dXJucyB0cnVlIGlmIGFuIGluc3RhbmNlIGNhbGwgdG8gW2ludGVyZmFjZVRhcmdldF0gd2l0aCBnaXZlbgovLy8gW3JlY2VpdmVyXSBjYW4gb21pdCBhcmd1bWVudCB0eXBlIGNoZWNrcyBuZWVkZWQgZHVlIHRvIGdlbmVyaWMtY292YXJpYW50Ci8vLyBwYXJhbWV0ZXJzLgpib29sIGlzVW5jaGVja2VkQ2FsbChNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQpIHsKICBpZiAoaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwpIHsKICAgIC8vIER5bmFtaWMgY2FsbCBjYW5ub3QgYmUgdW5jaGVja2VkLgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKCFfaGFzR2VuZXJpY0NvdmFyaWFudFBhcmFtZXRlcnMoaW50ZXJmYWNlVGFyZ2V0KSkgewogICAgLy8gVW5jaGVja2VkIGNhbGwgbWFrZXMgc2Vuc2Ugb25seSBpZiB0aGVyZSBhcmUgZ2VuZXJpYy1jb3ZhcmlhbnQgcGFyYW1ldGVycy4KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIENhbGxzIHZpYSBbdGhpc10gZG8gbm90IHJlcXVpcmUgY2hlY2tzLgogIGlmIChyZWNlaXZlciBpcyBUaGlzRXhwcmVzc2lvbikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICBEYXJ0VHlwZSByZWNlaXZlclN0YXRpY1R5cGUgPSBnZXRTdGF0aWNUeXBlKHJlY2VpdmVyLCBzdGF0aWNUeXBlQ29udGV4dCk7CiAgaWYgKHJlY2VpdmVyU3RhdGljVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICBmaW5hbCB0eXBlQXJndW1lbnRzID0gcmVjZWl2ZXJTdGF0aWNUeXBlLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZpbmFsIHR5cGVQYXJhbWV0ZXJzID0gcmVjZWl2ZXJTdGF0aWNUeXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVyczsKICAgIGFzc2VydCh0eXBlQXJndW1lbnRzLmxlbmd0aCA9PSB0eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIHN3aXRjaCAodHlwZVBhcmFtZXRlcnNbaV0udmFyaWFuY2UpIHsKICAgICAgICBjYXNlIFZhcmlhbmNlLmNvdmFyaWFudDoKICAgICAgICAgIGlmICghaXNTZWFsZWRUeXBlKAogICAgICAgICAgICAgIHR5cGVBcmd1bWVudHNbaV0sIHN0YXRpY1R5cGVDb250ZXh0LnR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVmFyaWFuY2UuaW52YXJpYW50OgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBWYXJpYW5jZS5jb250cmF2YXJpYW50OgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCB2YXJpYW5jZSAke3R5cGVQYXJhbWV0ZXJzW2ldLnZhcmlhbmNlfSBvZiAnCiAgICAgICAgICAgICAgJyR7dHlwZVBhcmFtZXRlcnNbaV19IGluICR7cmVjZWl2ZXJTdGF0aWNUeXBlLmNsYXNzTm9kZX0nOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gSWYgcmVjZWl2ZXIgdHlwZSBhdCBydW4gdGltZSBtYXRjaGVzIHN0YXRpYyB0eXBlIHdlIGNhbiBvbWl0IGFyZ3VtZW50IHR5cGUKLy8vIGNoZWNrcy4gVGhpcyBjb25kaXRpb24gY2FuIGJlIGVmZmljaWVudGx5IHRlc3RlZCBpZiBzdGF0aWMgcmVjZWl2ZXIgdHlwZSBpcwovLy8gZnVsbHkgaW5zdGFudGlhdGVkIChlLmcuIGRvZXNuJ3QgaGF2ZSB0eXBlIHBhcmFtZXRlcnMpLgovLy8gW2lzSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbF0gdGVzdHMgaWYgYW4gaW5zdGFuY2UgY2FsbCB0bwovLy8gW2ludGVyZmFjZVRhcmdldF0gd2l0aCBnaXZlbiBbc3RhdGljUmVjZWl2ZXJUeXBlXSBtYXkgYmVuZWZpdCBmcm9tCi8vLyB0aGlzIG9wdGltaXphdGlvbi4KYm9vbCBpc0luc3RhbnRpYXRlZEludGVyZmFjZUNhbGwoCiAgICBNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0LCBEYXJ0VHlwZSBzdGF0aWNSZWNlaXZlclR5cGUpIHsKICAvLyBQcm92aWRpbmcgaW5zdGFudGlhdGVkIHJlY2VpdmVyIHR5cGUgd291bGRuJ3QgaGVscCBpbiBjYXNlIG9mIGEKICAvLyBkeW5hbWljIGNhbGwgb3IgY2FsbCB3aXRob3V0IGFueSBwYXJhbWV0ZXIgdHlwZSBjaGVja3MuCiAgaWYgKGludGVyZmFjZVRhcmdldCA9PSBudWxsIHx8CiAgICAgICFfaGFzR2VuZXJpY0NvdmFyaWFudFBhcmFtZXRlcnMoaW50ZXJmYWNlVGFyZ2V0KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gaXNJbnN0YW50aWF0ZWRHZW5lcmljVHlwZShzdGF0aWNSZWNlaXZlclR5cGUpOwp9Cgpib29sIF9oYXNHZW5lcmljQ292YXJpYW50UGFyYW1ldGVycyhNZW1iZXIgdGFyZ2V0KSB7CiAgaWYgKHRhcmdldCBpcyBGaWVsZCkgewogICAgcmV0dXJuIHRhcmdldC5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogIH0gZWxzZSBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgZm9yICh2YXIgcGFyYW0gaW4gdGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwYXJhbS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIHBhcmFtIGluIHRhcmdldC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHBhcmFtLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0gZWxzZSB7CiAgICB0aHJvdyAnVW5leHBlY3RlZCBpbnN0YW5jZSBjYWxsIHRhcmdldCAke3RhcmdldC5ydW50aW1lVHlwZX0gJHRhcmdldCc7CiAgfQp9CgovLy8gUmV0dXJucyB0cnVlIGlmIGludm9jYXRpb24gW25vZGVdIGlzIGEgY2xvc3VyZSBjYWxsIHdpdGggc3RhdGljYWxseSBrbm93bgovLy8gZnVuY3Rpb24gdHlwZS4gU3VjaCBpbnZvY2F0aW9ucyBjYW4gb21pdCBhcmd1bWVudCB0eXBlIGNoZWNrcy4KYm9vbCBpc1VuY2hlY2tlZENsb3N1cmVDYWxsKE1ldGhvZEludm9jYXRpb24gbm9kZSwKICAgICAgICBTdGF0aWNUeXBlQ29udGV4dCBzdGF0aWNUeXBlQ29udGV4dCwgQnl0ZWNvZGVPcHRpb25zIG9wdGlvbnMpID0+CiAgICBub2RlLm5hbWUubmFtZSA9PSAnY2FsbCcgJiYKICAgIGdldFN0YXRpY1R5cGUobm9kZS5yZWNlaXZlciwgc3RhdGljVHlwZUNvbnRleHQpIGlzIEZ1bmN0aW9uVHlwZSAmJgogICAgIW9wdGlvbnMuYXZvaWRDbG9zdXJlQ2FsbEluc3RydWN0aW9uczsKCi8vLyBSZXR1cm5zIHRydWUgaWYgW01ldGhvZEludm9jYXRpb25dIG5vZGUgd2l0aCBnaXZlbiBbaW50ZXJmYWNlVGFyZ2V0XSBpcwovLy8gYSBjYWxsIHRocm91Z2ggZmllbGQgb3IgZ2V0dGVyLgpib29sIGlzQ2FsbFRocm91Z2hHZXR0ZXIoTWVtYmVyIGludGVyZmFjZVRhcmdldCkgPT4KICAgIGludGVyZmFjZVRhcmdldCBpcyBGaWVsZCB8fAogICAgaW50ZXJmYWNlVGFyZ2V0IGlzIFByb2NlZHVyZSAmJiBpbnRlcmZhY2VUYXJnZXQuaXNHZXR0ZXI7CoE1AE5OPAEeAR0BMDg9RgEsAS0oJxMGBBACAUsgHwQ7NE0EEAIBRDcmTC84FAYEDwIBMTg7NAExGxUEATo1AUtNQTwjKjMNBgQBSQEuJDkERAEXAgEtOBdFJBEEFwIBSDIgEQQbI0sbDQYEFREELiM9BBcCAS0cJBQGBA8CATEfJTABNj44AgFELgEyAQwpOQEMNAEMNAEMLgEMMgEMMAEMOSk5AQwxNQEMLTUBDC4qPDsGAVBAJgEqPgYBEwQCASNQKwE+OB8gKCgmKCQEEAIBRU0QQishKRIEATpSEgQBLSQRBAFMLTwhEwYBSDs1LCEdUBoMESERJRgRSEkIBhEEEAIBT1A8P0cXIjtFPSE6EgQ4AgE1GSokPioVCAY5KhUIBhILSwQCAU5DM0kgRysBTCQ0ID4BIXBhY2thZ2U6dm0vYnl0ZWNvZGUvZ2VuZXJpY3MuZGFydFlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvbG9jYWxfdmFyaWFibGVfdGFibGUuZGFydJv1Ly8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0uYnl0ZWNvZGUubG9jYWxfdmFyaWFibGVfdGFibGU7CgppbXBvcnQgJ2J5dGVjb2RlX3NlcmlhbGl6YXRpb24uZGFydCc7CgplbnVtIExvY2FsVmFyaWFibGVFbnRyeUtpbmQgewogIGludmFsaWQsCiAgc2NvcGUsCiAgdmFyaWFibGVEZWNsYXJhdGlvbiwKICBjb250ZXh0VmFyaWFibGUsCn0KCmFic3RyYWN0IGNsYXNzIExvY2FsVmFyaWFibGVFbnRyeSB7CiAgc3RhdGljIGNvbnN0IEtpbmRNYXNrID0gMHgwRjsKICBzdGF0aWMgY29uc3QgSXNDYXB0dXJlZEZsYWcgPSAxIDw8IDQ7CgogIExvY2FsVmFyaWFibGVFbnRyeUtpbmQgZ2V0IGtpbmQ7CiAgaW50IGdldCBmbGFncyA9PiAwOwogIGZpbmFsIGludCBzdGFydFBDOwogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpOwoKICBMb2NhbFZhcmlhYmxlRW50cnkodGhpcy5zdGFydFBDKTsKfQoKY2xhc3MgU2NvcGUgZXh0ZW5kcyBMb2NhbFZhcmlhYmxlRW50cnkgewogIGludCBlbmRQQzsKICBpbnQgY29udGV4dExldmVsOwogIGludCBwb3NpdGlvbjsKICBpbnQgZW5kUG9zaXRpb247CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKCiAgU2NvcGUoaW50IHN0YXJ0UEMsIHRoaXMuZW5kUEMsIHRoaXMuY29udGV4dExldmVsLCB0aGlzLnBvc2l0aW9uLAogICAgICB0aGlzLmVuZFBvc2l0aW9uKQogICAgICA6IHN1cGVyKHN0YXJ0UEMpOwoKICBAb3ZlcnJpZGUKICBMb2NhbFZhcmlhYmxlRW50cnlLaW5kIGdldCBraW5kID0+IExvY2FsVmFyaWFibGVFbnRyeUtpbmQuc2NvcGU7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIGlmIChlbmRQQyA9PSBudWxsKSB7CiAgICAgIHRocm93ICckdGhpcyBpcyBub3QgY2xvc2VkJzsKICAgIH0KICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChlbmRQQyAtIHN0YXJ0UEMpOwogICAgd3JpdGVyLndyaXRlU0xFQjEyOChjb250ZXh0TGV2ZWwpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHBvc2l0aW9uICsgMSk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoZW5kUG9zaXRpb24gKyAxKTsKICB9CgogIFNjb3BlLnJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIsIGludCBzdGFydFBDKSA6IHN1cGVyKHN0YXJ0UEMpIHsKICAgIGVuZFBDID0gc3RhcnRQQyArIHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBjb250ZXh0TGV2ZWwgPSByZWFkZXIucmVhZFNMRUIxMjgoKTsKICAgIHBvc2l0aW9uID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSAtIDE7CiAgICBlbmRQb3NpdGlvbiA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ3Njb3BlIChwYyAkc3RhcnRQQy0kZW5kUEMgcG9zICRwb3NpdGlvbi0kZW5kUG9zaXRpb24gY29udGV4dC1sZXZlbCAkY29udGV4dExldmVsKSc7Cn0KCmNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMb2NhbFZhcmlhYmxlRW50cnkgewogIGJvb2wgaXNDYXB0dXJlZDsKICBpbnQgaW5kZXg7CiAgaW50IG5hbWU7CiAgaW50IHR5cGU7CiAgaW50IHBvc2l0aW9uOwogIGludCBpbml0aWFsaXplZFBvc2l0aW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uKGludCBzdGFydFBDLCB0aGlzLmlzQ2FwdHVyZWQsIHRoaXMuaW5kZXgsIHRoaXMubmFtZSwKICAgICAgdGhpcy50eXBlLCB0aGlzLnBvc2l0aW9uLCB0aGlzLmluaXRpYWxpemVkUG9zaXRpb24pCiAgICAgIDogc3VwZXIoc3RhcnRQQyk7CgogIEBvdmVycmlkZQogIExvY2FsVmFyaWFibGVFbnRyeUtpbmQgZ2V0IGtpbmQgPT4gTG9jYWxWYXJpYWJsZUVudHJ5S2luZC52YXJpYWJsZURlY2xhcmF0aW9uOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGZsYWdzID0+IChpc0NhcHR1cmVkID8gTG9jYWxWYXJpYWJsZUVudHJ5LklzQ2FwdHVyZWRGbGFnIDogMCk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVNMRUIxMjgoaW5kZXgpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKG5hbWUpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHR5cGUpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHBvc2l0aW9uICsgMSk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoaW5pdGlhbGl6ZWRQb3NpdGlvbiArIDEpOwogIH0KCiAgVmFyaWFibGVEZWNsYXJhdGlvbi5yZWFkQ29udGVudHMoCiAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciwgaW50IHN0YXJ0UEMsIGludCBmbGFncykKICAgICAgOiBzdXBlcihzdGFydFBDKSB7CiAgICBpc0NhcHR1cmVkID0gKGZsYWdzICYgTG9jYWxWYXJpYWJsZUVudHJ5LklzQ2FwdHVyZWRGbGFnKSAhPSAwOwogICAgaW5kZXggPSByZWFkZXIucmVhZFNMRUIxMjgoKTsKICAgIG5hbWUgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgdHlwZSA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBwb3NpdGlvbiA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxOwogICAgaW5pdGlhbGl6ZWRQb3NpdGlvbiA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCkgLSAxOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ3ZhcmlhYmxlICRpbmRleCR7aXNDYXB0dXJlZCA/ICcgKGNhcHR1cmVkKScgOiAnJ30gcGMgJHN0YXJ0UEMsIG5hbWUgQ1AjJG5hbWUsIHR5cGUgQ1AjJHR5cGUsIHBvcyAkcG9zaXRpb24sIGluaXQtcG9zICRpbml0aWFsaXplZFBvc2l0aW9uJzsKfQoKY2xhc3MgQ29udGV4dFZhcmlhYmxlIGV4dGVuZHMgTG9jYWxWYXJpYWJsZUVudHJ5IHsKICBpbnQgaW5kZXg7CgogIENvbnRleHRWYXJpYWJsZShpbnQgc3RhcnRQQywgdGhpcy5pbmRleCkgOiBzdXBlcihzdGFydFBDKTsKCiAgQG92ZXJyaWRlCiAgTG9jYWxWYXJpYWJsZUVudHJ5S2luZCBnZXQga2luZCA9PiBMb2NhbFZhcmlhYmxlRW50cnlLaW5kLmNvbnRleHRWYXJpYWJsZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlU0xFQjEyOChpbmRleCk7CiAgfQoKICBDb250ZXh0VmFyaWFibGUucmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciwgaW50IHN0YXJ0UEMpCiAgICAgIDogc3VwZXIoc3RhcnRQQykgewogICAgaW5kZXggPSByZWFkZXIucmVhZFNMRUIxMjgoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdjb250ZXh0IHZhcmlhYmxlICRpbmRleCc7Cn0KCi8vLyBLZWVwcyBpbmZvcm1hdGlvbiBhYm91dCBkZWNsYXJlZCBsb2NhbCB2YXJpYWJsZXMuCmNsYXNzIExvY2FsVmFyaWFibGVUYWJsZSBleHRlbmRzIEJ5dGVjb2RlRGVjbGFyYXRpb24gewogIGZpbmFsIHNjb3BlcyA9IDxTY29wZT5bXTsKICBmaW5hbCBhY3RpdmVTY29wZXMgPSA8U2NvcGU+W107CiAgQ29udGV4dFZhcmlhYmxlIGNvbnRleHRWYXJpYWJsZTsKCiAgTG9jYWxWYXJpYWJsZVRhYmxlKCk7CgogIHZvaWQgZW50ZXJTY29wZShpbnQgcGMsIGludCBjb250ZXh0TGV2ZWwsIGludCBwb3NpdGlvbikgewogICAgZmluYWwgc2NvcGUgPSBuZXcgU2NvcGUocGMsIG51bGwsIGNvbnRleHRMZXZlbCwgcG9zaXRpb24sIG51bGwpOwogICAgYWN0aXZlU2NvcGVzLmFkZChzY29wZSk7CiAgICBzY29wZXMuYWRkKHNjb3BlKTsKICB9CgogIHZvaWQgZGVjbGFyZVZhcmlhYmxlKGludCBwYywgYm9vbCBpc0NhcHR1cmVkLCBpbnQgaW5kZXgsIGludCBuYW1lQ3BJbmRleCwKICAgICAgaW50IHR5cGVDcEluZGV4LCBpbnQgcG9zaXRpb24sIGludCBpbml0aWFsaXplZFBvc2l0aW9uKSB7CiAgICBmaW5hbCB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKHBjLCBpc0NhcHR1cmVkLCBpbmRleCwgbmFtZUNwSW5kZXgsCiAgICAgICAgdHlwZUNwSW5kZXgsIHBvc2l0aW9uLCBpbml0aWFsaXplZFBvc2l0aW9uKTsKICAgIGFjdGl2ZVNjb3Blcy5sYXN0LnZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogIH0KCiAgdm9pZCBsZWF2ZVNjb3BlKGludCBwYywgaW50IGVuZFBvc2l0aW9uKSB7CiAgICBmaW5hbCBzY29wZSA9IGFjdGl2ZVNjb3Blcy5yZW1vdmVMYXN0KCk7CiAgICBzY29wZS5lbmRQQyA9IHBjOwogICAgc2NvcGUuZW5kUG9zaXRpb24gPSBlbmRQb3NpdGlvbjsKICAgIGlmIChzY29wZS52YXJpYWJsZXMuaXNFbXB0eSAmJgogICAgICAgIGFjdGl2ZVNjb3Blcy5pc05vdEVtcHR5ICYmCiAgICAgICAgc2NvcGUuY29udGV4dExldmVsID09IGFjdGl2ZVNjb3Blcy5sYXN0LmNvbnRleHRMZXZlbCkgewogICAgICBzY29wZXMucmVtb3ZlKHNjb3BlKTsKICAgIH0KICB9CgogIHZvaWQgbGVhdmVBbGxTY29wZXMoaW50IHBjLCBpbnQgZW5kUG9zaXRpb24pIHsKICAgIHdoaWxlIChhY3RpdmVTY29wZXMuaXNOb3RFbXB0eSkgewogICAgICBsZWF2ZVNjb3BlKHBjLCBlbmRQb3NpdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIHJlY29yZENvbnRleHRWYXJpYWJsZShpbnQgcGMsIGludCBpbmRleCkgewogICAgYXNzZXJ0KGNvbnRleHRWYXJpYWJsZSA9PSBudWxsKTsKICAgIGNvbnRleHRWYXJpYWJsZSA9IG5ldyBDb250ZXh0VmFyaWFibGUocGMsIGluZGV4KTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gc2NvcGVzLmlzRW1wdHkgJiYgY29udGV4dFZhcmlhYmxlID09IG51bGw7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIGJvb2wgZ2V0IGhhc0FjdGl2ZVNjb3BlcyA9PiBhY3RpdmVTY29wZXMuaXNOb3RFbXB0eTsKCiAgTGlzdDxMb2NhbFZhcmlhYmxlRW50cnk+IGdldEVudHJpZXMoKSB7CiAgICBmaW5hbCBlbnRyaWVzID0gPExvY2FsVmFyaWFibGVFbnRyeT5bXTsKICAgIGlmIChjb250ZXh0VmFyaWFibGUgIT0gbnVsbCkgewogICAgICBlbnRyaWVzLmFkZChjb250ZXh0VmFyaWFibGUpOwogICAgfQogICAgZm9yIChTY29wZSBzY29wZSBpbiBzY29wZXMpIHsKICAgICAgZW50cmllcy5hZGQoc2NvcGUpOwogICAgICBlbnRyaWVzLmFkZEFsbChzY29wZS52YXJpYWJsZXMpOwogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgZmluYWwgZW50cmllcyA9IGdldEVudHJpZXMoKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChlbnRyaWVzLmxlbmd0aCk7CiAgICBmaW5hbCBlbmNvZGVTdGFydFBDID0gbmV3IFNMRUIxMjhEZWx0YUVuY29kZXIoKTsKICAgIGZvciAodmFyIGVudHJ5IGluIGVudHJpZXMpIHsKICAgICAgd3JpdGVyLndyaXRlQnl0ZShlbnRyeS5raW5kLmluZGV4IHwgZW50cnkuZmxhZ3MpOwogICAgICBlbmNvZGVTdGFydFBDLndyaXRlKHdyaXRlciwgZW50cnkuc3RhcnRQQyk7CiAgICAgIGVudHJ5LndyaXRlQ29udGVudHMod3JpdGVyKTsKICAgIH0KICB9CgogIExvY2FsVmFyaWFibGVUYWJsZS5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgZmluYWwgaW50IG51bUVudHJpZXMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgZmluYWwgZGVjb2RlU3RhcnRQQyA9IG5ldyBTTEVCMTI4RGVsdGFEZWNvZGVyKCk7CiAgICBTY29wZSBzY29wZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgKytpKSB7CiAgICAgIGZpbmFsIGludCBraW5kQW5kRmxhZ3MgPSByZWFkZXIucmVhZEJ5dGUoKTsKICAgICAgZmluYWwgTG9jYWxWYXJpYWJsZUVudHJ5S2luZCBraW5kID0gTG9jYWxWYXJpYWJsZUVudHJ5S2luZAogICAgICAgICAgLnZhbHVlc1traW5kQW5kRmxhZ3MgJiBMb2NhbFZhcmlhYmxlRW50cnkuS2luZE1hc2tdOwogICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBraW5kQW5kRmxhZ3MgJiB+TG9jYWxWYXJpYWJsZUVudHJ5LktpbmRNYXNrOwogICAgICBmaW5hbCBpbnQgc3RhcnRQQyA9IGRlY29kZVN0YXJ0UEMucmVhZChyZWFkZXIpOwogICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICBjYXNlIExvY2FsVmFyaWFibGVFbnRyeUtpbmQuc2NvcGU6CiAgICAgICAgICBzY29wZSA9IG5ldyBTY29wZS5yZWFkQ29udGVudHMocmVhZGVyLCBzdGFydFBDKTsKICAgICAgICAgIHNjb3Blcy5hZGQoc2NvcGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMb2NhbFZhcmlhYmxlRW50cnlLaW5kLnZhcmlhYmxlRGVjbGFyYXRpb246CiAgICAgICAgICBzY29wZS52YXJpYWJsZXMuYWRkKAogICAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLnJlYWRDb250ZW50cyhyZWFkZXIsIHN0YXJ0UEMsIGZsYWdzKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIExvY2FsVmFyaWFibGVFbnRyeUtpbmQuY29udGV4dFZhcmlhYmxlOgogICAgICAgICAgY29udGV4dFZhcmlhYmxlID0gbmV3IENvbnRleHRWYXJpYWJsZS5yZWFkQ29udGVudHMocmVhZGVyLCBzdGFydFBDKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBlbnRyeSBraW5kICR7a2luZH0nOwogICAgICB9CiAgICB9CiAgfQoKICBNYXA8aW50LCBTdHJpbmc+IGdldEJ5dGVjb2RlQW5ub3RhdGlvbnMoKSB7CiAgICBmaW5hbCBtYXAgPSA8aW50LCBTdHJpbmc+e307CiAgICBmb3IgKHZhciBlbnRyeSBpbiBnZXRFbnRyaWVzKCkpIHsKICAgICAgZmluYWwgcGMgPSBlbnRyeS5zdGFydFBDOwogICAgICBpZiAobWFwW3BjXSA9PSBudWxsKSB7CiAgICAgICAgbWFwW3BjXSA9IGVudHJ5LnRvU3RyaW5nKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWFwW3BjXSA9ICIke21hcFtwY119OyAkZW50cnkiOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KfQqA9ABOTjwBKgEmAR4LCRcTAgEkICgBIxYVLQEkAgEpDRQQE0cBQxgYAQxDAQwuGSMGLycsLwQBTDEpLjEEAQwXWwIBNxMNDAwQGwFLOhgBDFEBDEkBDC4gJCQsNwQBJDUZQyImJi45BAEMF4CTAgEzDQE9AQxNAQwuIAQBQxkiBAEMMgIBNjccIiMBGAE8RR0XBAFMQFE1LwQBLS0WJSMjQBwGBAExJiMGBAEyJTYEAUEBIwE3ASosIyQGIhonBhQEASYiLjUhODIjBgQBMzY1ESsyQT9FNhYrOx0ROR9NETVPERExCAYEAS4hJiAdJA8oCAYQBAIBLXBhY2thZ2U6dm0vYnl0ZWNvZGUvbG9jYWxfdmFyaWFibGVfdGFibGUuZGFydE9maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvbG9jYWxfdmFycy5kYXJ0wACnvS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLmJ5dGVjb2RlLmxvY2FsX3ZhcnM7CgppbXBvcnQgJ2RhcnQ6bWF0aCcgc2hvdyBtaW4sIG1heDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9jb250aW51YXRpb24uZGFydCcKICAgIHNob3cgQ29udGludWF0aW9uVmFyaWFibGVzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAncGFja2FnZTp2bS9ieXRlY29kZS9nZW5lcmljcy5kYXJ0JzsKCmltcG9ydCAnZGJjLmRhcnQnOwppbXBvcnQgJ29wdGlvbnMuZGFydCcgc2hvdyBCeXRlY29kZU9wdGlvbnM7CmltcG9ydCAnLi4vbWV0YWRhdGEvZGlyZWN0X2NhbGwuZGFydCcgc2hvdyBEaXJlY3RDYWxsTWV0YWRhdGE7CgovLyBLZWVwIGluIHN5bmMgd2l0aCBydW50aW1lL3ZtL29iamVjdC5oOkNvbnRleHQ6OmtBd2FpdEp1bXBWYXJJbmRleC4KY29uc3QgaW50IGF3YWl0SnVtcFZhckNvbnRleHRJbmRleCA9IDA7CmNvbnN0IGludCBhc3luY0NvbXBsZXRlckNvbnRleHRJbmRleCA9IDE7CmNvbnN0IGludCBjb250cm9sbGVyQ29udGV4dEluZGV4ID0gMTsKCmNsYXNzIExvY2FsVmFyaWFibGVzIHsKICBmaW5hbCBfc2NvcGVzID0gbmV3IE1hcDxUcmVlTm9kZSwgU2NvcGU+KCk7CiAgZmluYWwgX3ZhcnMgPSBuZXcgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIFZhckRlc2M+KCk7CiAgTWFwPFRyZWVOb2RlLCBMaXN0PGludD4+IF90ZW1wczsKICBNYXA8VHJlZU5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb24+IF9jYXB0dXJlZFNhdmVkQ29udGV4dFZhcnM7CiAgTWFwPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPiBfY2FwdHVyZWRFeGNlcHRpb25WYXJzOwogIE1hcDxUcmVlTm9kZSwgVmFyaWFibGVEZWNsYXJhdGlvbj4gX2NhcHR1cmVkU3RhY2tUcmFjZVZhcnM7CiAgTWFwPEZvckluU3RhdGVtZW50LCBWYXJpYWJsZURlY2xhcmF0aW9uPiBfY2FwdHVyZWRJdGVyYXRvclZhcnM7CiAgZmluYWwgQnl0ZWNvZGVPcHRpb25zIG9wdGlvbnM7CiAgZmluYWwgU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQ7CiAgZmluYWwgTWFwPFRyZWVOb2RlLCBEaXJlY3RDYWxsTWV0YWRhdGE+IGRpcmVjdENhbGxNZXRhZGF0YTsKCiAgU2NvcGUgX2N1cnJlbnRTY29wZTsKICBGcmFtZSBfY3VycmVudEZyYW1lOwoKICBWYXJEZXNjIF9nZXRWYXJEZXNjKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpID0+CiAgICAgIF92YXJzW3ZhcmlhYmxlXSA/PwogICAgICAodGhyb3cgJ1ZhcmlhYmxlIGRlc2NyaXB0b3IgaXMgbm90IGNyZWF0ZWQgZm9yICR2YXJpYWJsZScpOwoKICBpbnQgX2dldFZhckluZGV4KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGJvb2wgaXNDYXB0dXJlZCkgewogICAgZmluYWwgdiA9IF9nZXRWYXJEZXNjKHZhcmlhYmxlKTsKICAgIGlmICh2LmlzQ2FwdHVyZWQgIT0gaXNDYXB0dXJlZCkgewogICAgICB0aHJvdyAnTWlzbWF0Y2ggaW4gY2FwdHVyZWQgc3RhdGUgb2YgJHZhcmlhYmxlJzsKICAgIH0KICAgIHJldHVybiB2LmluZGV4ID8/ICh0aHJvdyAnVmFyaWFibGUgJHZhcmlhYmxlIGlzIG5vdCBhbGxvY2F0ZWQnKTsKICB9CgogIGJvb2wgaXNDYXB0dXJlZChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSA9PgogICAgICBfZ2V0VmFyRGVzYyh2YXJpYWJsZSkuaXNDYXB0dXJlZDsKCiAgaW50IGdldFZhckluZGV4SW5GcmFtZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSA9PgogICAgICBfZ2V0VmFySW5kZXgodmFyaWFibGUsIGZhbHNlKTsKCiAgaW50IGdldFZhckluZGV4SW5Db250ZXh0KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpID0+CiAgICAgIF9nZXRWYXJJbmRleCh2YXJpYWJsZSwgdHJ1ZSk7CgogIGludCBnZXRPcmlnaW5hbFBhcmFtU2xvdEluZGV4KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpID0+CiAgICAgIF9nZXRWYXJEZXNjKHZhcmlhYmxlKS5vcmlnaW5hbFBhcmFtU2xvdEluZGV4ID8/CiAgICAgICh0aHJvdyAnVmFyaWFibGUgJHZhcmlhYmxlIGRvZXMgbm90IGhhdmUgb3JpZ2luYWxQYXJhbVNsb3RJbmRleCcpOwoKICBpbnQgdGVtcEluZGV4SW5GcmFtZShUcmVlTm9kZSBub2RlLCB7aW50IHRlbXBJbmRleDogMH0pIHsKICAgIGZpbmFsIHRlbXBzID0gX3RlbXBzW25vZGVdOwogICAgaWYgKHRlbXBzID09IG51bGwpIHsKICAgICAgdGhyb3cgJ1RlbXAgaXMgbm90IGFsbG9jYXRlZCBmb3Igbm9kZSAke25vZGUucnVudGltZVR5cGV9ICRub2RlJzsKICAgIH0KICAgIHJldHVybiB0ZW1wc1t0ZW1wSW5kZXhdOwogIH0KCiAgaW50IGdldCBjdXJyZW50Q29udGV4dFNpemUgPT4gX2N1cnJlbnRTY29wZS5jb250ZXh0U2l6ZTsKICBpbnQgZ2V0IGN1cnJlbnRDb250ZXh0TGV2ZWwgPT4gX2N1cnJlbnRTY29wZS5jb250ZXh0TGV2ZWw7CiAgaW50IGdldCBjdXJyZW50Q29udGV4dElkID0+IF9jdXJyZW50U2NvcGUuY29udGV4dElkOwoKICBpbnQgZ2V0IGNvbnRleHRMZXZlbEF0RW50cnkgPT4KICAgICAgX2N1cnJlbnRGcmFtZS5jb250ZXh0TGV2ZWxBdEVudHJ5ID8/CiAgICAgICh0aHJvdyAiQ3VycmVudCBmcmFtZSBpcyB0b3AgbGV2ZWwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBhIGNvbnRleHQgYXQgZW50cnkiKTsKCiAgaW50IGdldENvbnRleHRMZXZlbE9mVmFyKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGZpbmFsIHYgPSBfZ2V0VmFyRGVzYyh2YXJpYWJsZSk7CiAgICBhc3NlcnQodi5pc0NhcHR1cmVkKTsKICAgIHJldHVybiB2LnNjb3BlLmNvbnRleHRMZXZlbDsKICB9CgogIGludCBnZXRWYXJDb250ZXh0SWQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgZmluYWwgdiA9IF9nZXRWYXJEZXNjKHZhcmlhYmxlKTsKICAgIGFzc2VydCh2LmlzQ2FwdHVyZWQpOwogICAgcmV0dXJuIHYuc2NvcGUuY29udGV4dElkOwogIH0KCiAgaW50IGdldCBjbG9zdXJlVmFySW5kZXhJbkZyYW1lID0+IGdldFZhckluZGV4SW5GcmFtZShfY3VycmVudEZyYW1lCiAgICAgICAgICAuY2xvc3VyZVZhciA/PwogICAgICAodGhyb3cgJ0Nsb3N1cmUgdmFyaWFibGUgaXMgbm90IGRlY2xhcmVkIGluICR7X2N1cnJlbnRGcmFtZS5mdW5jdGlvbn0nKSk7CgogIGludCBnZXQgY29udGV4dFZhckluZGV4SW5GcmFtZSA9PiBnZXRWYXJJbmRleEluRnJhbWUoX2N1cnJlbnRGcmFtZQogICAgICAgICAgLmNvbnRleHRWYXIgPz8KICAgICAgKHRocm93ICdDb250ZXh0IHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiAke19jdXJyZW50RnJhbWUuZnVuY3Rpb259JykpOwoKICBib29sIGdldCBoYXNDb250ZXh0VmFyID0+IF9jdXJyZW50RnJhbWUuY29udGV4dFZhciAhPSBudWxsOwoKICBpbnQgZ2V0IHNjcmF0Y2hWYXJJbmRleEluRnJhbWUgPT4gZ2V0VmFySW5kZXhJbkZyYW1lKF9jdXJyZW50RnJhbWUKICAgICAgICAgIC5zY3JhdGNoVmFyID8/CiAgICAgICh0aHJvdyAnU2NyYXRjaCB2YXJpYWJsZSBpcyBub3QgZGVjbGFyZWQgaW4gJHtfY3VycmVudEZyYW1lLmZ1bmN0aW9ufScpKTsKCiAgaW50IGdldCByZXR1cm5WYXJJbmRleEluRnJhbWUgPT4gZ2V0VmFySW5kZXhJbkZyYW1lKF9jdXJyZW50RnJhbWUucmV0dXJuVmFyID8/CiAgICAgICh0aHJvdyAnUmV0dXJuIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiAke19jdXJyZW50RnJhbWUuZnVuY3Rpb259JykpOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldCBmdW5jdGlvblR5cGVBcmdzVmFyID0+CiAgICAgIF9jdXJyZW50RnJhbWUuZnVuY3Rpb25UeXBlQXJnc1ZhciA/PwogICAgICAodGhyb3cgJ0Z1bmN0aW9uVHlwZUFyZ3MgdmFyaWFibGUgaXMgbm90IGRlY2xhcmVkIGluICR7X2N1cnJlbnRGcmFtZS5mdW5jdGlvbn0nKTsKCiAgaW50IGdldCBmdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1lID0+CiAgICAgIGdldFZhckluZGV4SW5GcmFtZShmdW5jdGlvblR5cGVBcmdzVmFyKTsKCiAgYm9vbCBnZXQgaGFzRnVuY3Rpb25UeXBlQXJnc1ZhciA9PiBfY3VycmVudEZyYW1lLmZ1bmN0aW9uVHlwZUFyZ3NWYXIgIT0gbnVsbDsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXQgZmFjdG9yeVR5cGVBcmdzVmFyID0+CiAgICAgIF9jdXJyZW50RnJhbWUuZmFjdG9yeVR5cGVBcmdzVmFyID8/CiAgICAgICh0aHJvdyAnRmFjdG9yeVR5cGVBcmdzIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiAke19jdXJyZW50RnJhbWUuZnVuY3Rpb259Jyk7CgogIGJvb2wgZ2V0IGhhc0ZhY3RvcnlUeXBlQXJnc1ZhciA9PiBfY3VycmVudEZyYW1lLmZhY3RvcnlUeXBlQXJnc1ZhciAhPSBudWxsOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldCByZWNlaXZlclZhciA9PgogICAgICBfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyID8/CiAgICAgICh0aHJvdyAnUmVjZWl2ZXIgdmFyaWFibGUgaXMgbm90IGRlY2xhcmVkIGluICR7X2N1cnJlbnRGcmFtZS5mdW5jdGlvbn0nKTsKCiAgYm9vbCBnZXQgaGFzQ2FwdHVyZWRSZWNlaXZlclZhciA9PiBfY3VycmVudEZyYW1lLmNhcHR1cmVkUmVjZWl2ZXJWYXIgIT0gbnVsbDsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXQgY2FwdHVyZWRSZWNlaXZlclZhciA9PgogICAgICBfY3VycmVudEZyYW1lLmNhcHR1cmVkUmVjZWl2ZXJWYXIgPz8KICAgICAgKHRocm93ICdDYXB0dXJlZCByZWNlaXZlciB2YXJpYWJsZSBpcyBub3QgZGVjbGFyZWQgaW4gJHtfY3VycmVudEZyYW1lLmZ1bmN0aW9ufScpOwoKICBib29sIGdldCBoYXNSZWNlaXZlciA9PiBfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyICE9IG51bGw7CgogIGJvb2wgZ2V0IGlzU3luY1lpZWxkaW5nRnJhbWUgPT4gX2N1cnJlbnRGcmFtZS5pc1N5bmNZaWVsZGluZzsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXQgYXdhaXRKdW1wVmFyIHsKICAgIGFzc2VydChfY3VycmVudEZyYW1lLmlzU3luY1lpZWxkaW5nKTsKICAgIHJldHVybiBfY3VycmVudEZyYW1lLnBhcmVudAogICAgICAgIC5nZXRTeW50aGV0aWNWYXIoQ29udGludWF0aW9uVmFyaWFibGVzLmF3YWl0SnVtcFZhcik7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldCBhd2FpdENvbnRleHRWYXIgewogICAgYXNzZXJ0KF9jdXJyZW50RnJhbWUuaXNTeW5jWWllbGRpbmcpOwogICAgcmV0dXJuIF9jdXJyZW50RnJhbWUucGFyZW50CiAgICAgICAgLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuYXdhaXRDb250ZXh0VmFyKTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0IGFzeW5jU3RhY2tUcmFjZVZhciB7CiAgICBhc3NlcnQob3B0aW9ucy5jYXVzYWxBc3luY1N0YWNrcyk7CiAgICBhc3NlcnQoX2N1cnJlbnRGcmFtZS5pc1N5bmNZaWVsZGluZyk7CiAgICByZXR1cm4gX2N1cnJlbnRGcmFtZS5wYXJlbnQKICAgICAgICAuZ2V0U3ludGhldGljVmFyKENvbnRpbnVhdGlvblZhcmlhYmxlcy5hc3luY1N0YWNrVHJhY2VWYXIpOwogIH0KCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBjYXB0dXJlZFNhdmVkQ29udGV4dFZhcihUcmVlTm9kZSBub2RlKSA9PgogICAgICBfY2FwdHVyZWRTYXZlZENvbnRleHRWYXJzICE9IG51bGwKICAgICAgICAgID8gX2NhcHR1cmVkU2F2ZWRDb250ZXh0VmFyc1tub2RlXQogICAgICAgICAgOiBudWxsOwogIFZhcmlhYmxlRGVjbGFyYXRpb24gY2FwdHVyZWRFeGNlcHRpb25WYXIoVHJlZU5vZGUgbm9kZSkgPT4KICAgICAgX2NhcHR1cmVkRXhjZXB0aW9uVmFycyAhPSBudWxsID8gX2NhcHR1cmVkRXhjZXB0aW9uVmFyc1tub2RlXSA6IG51bGw7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiBjYXB0dXJlZFN0YWNrVHJhY2VWYXIoVHJlZU5vZGUgbm9kZSkgPT4KICAgICAgX2NhcHR1cmVkU3RhY2tUcmFjZVZhcnMgIT0gbnVsbCA/IF9jYXB0dXJlZFN0YWNrVHJhY2VWYXJzW25vZGVdIDogbnVsbDsKICBWYXJpYWJsZURlY2xhcmF0aW9uIGNhcHR1cmVkSXRlcmF0b3JWYXIoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgPT4KICAgICAgX2NhcHR1cmVkSXRlcmF0b3JWYXJzICE9IG51bGwgPyBfY2FwdHVyZWRJdGVyYXRvclZhcnNbbm9kZV0gOiBudWxsOwoKICBpbnQgZ2V0IGFzeW5jRXhjZXB0aW9uUGFyYW1JbmRleEluRnJhbWUgewogICAgYXNzZXJ0KF9jdXJyZW50RnJhbWUuaXNTeW5jWWllbGRpbmcpOwogICAgZmluYWwgZnVuY3Rpb24gPSAoX2N1cnJlbnRGcmFtZS5mdW5jdGlvbiBhcyBGdW5jdGlvbkRlY2xhcmF0aW9uKS5mdW5jdGlvbjsKICAgIGZpbmFsIHBhcmFtID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMKICAgICAgICAuZmlyc3RXaGVyZSgocCkgPT4gcC5uYW1lID09IENvbnRpbnVhdGlvblZhcmlhYmxlcy5leGNlcHRpb25QYXJhbSk7CiAgICByZXR1cm4gZ2V0VmFySW5kZXhJbkZyYW1lKHBhcmFtKTsKICB9CgogIGludCBnZXQgYXN5bmNTdGFja1RyYWNlUGFyYW1JbmRleEluRnJhbWUgewogICAgYXNzZXJ0KF9jdXJyZW50RnJhbWUuaXNTeW5jWWllbGRpbmcpOwogICAgZmluYWwgZnVuY3Rpb24gPSAoX2N1cnJlbnRGcmFtZS5mdW5jdGlvbiBhcyBGdW5jdGlvbkRlY2xhcmF0aW9uKS5mdW5jdGlvbjsKICAgIGZpbmFsIHBhcmFtID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMKICAgICAgICAuZmlyc3RXaGVyZSgocCkgPT4gcC5uYW1lID09IENvbnRpbnVhdGlvblZhcmlhYmxlcy5zdGFja1RyYWNlUGFyYW0pOwogICAgcmV0dXJuIGdldFZhckluZGV4SW5GcmFtZShwYXJhbSk7CiAgfQoKICBpbnQgZ2V0IGZyYW1lU2l6ZSA9PiBfY3VycmVudEZyYW1lLmZyYW1lU2l6ZTsKCiAgaW50IGdldCBudW1QYXJhbWV0ZXJzID0+IF9jdXJyZW50RnJhbWUubnVtUGFyYW1ldGVyczsKCiAgaW50IGdldCBudW1QYXJlbnRUeXBlQXJndW1lbnRzID0+IF9jdXJyZW50RnJhbWUucGFyZW50Py5udW1UeXBlQXJndW1lbnRzID8/IDA7CgogIGJvb2wgZ2V0IGhhc09wdGlvbmFsUGFyYW1ldGVycyA9PiBfY3VycmVudEZyYW1lLmhhc09wdGlvbmFsUGFyYW1ldGVyczsKICBib29sIGdldCBoYXNDYXB0dXJlZFBhcmFtZXRlcnMgPT4gX2N1cnJlbnRGcmFtZS5oYXNDYXB0dXJlZFBhcmFtZXRlcnM7CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0IG9yaWdpbmFsTmFtZWRQYXJhbWV0ZXJzID0+CiAgICAgIF9jdXJyZW50RnJhbWUub3JpZ2luYWxOYW1lZFBhcmFtZXRlcnM7CiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBnZXQgc29ydGVkTmFtZWRQYXJhbWV0ZXJzID0+CiAgICAgIF9jdXJyZW50RnJhbWUuc29ydGVkTmFtZWRQYXJhbWV0ZXJzOwoKICBMb2NhbFZhcmlhYmxlcyhNZW1iZXIgbm9kZSwgdGhpcy5vcHRpb25zLCB0aGlzLnN0YXRpY1R5cGVDb250ZXh0LAogICAgICB0aGlzLmRpcmVjdENhbGxNZXRhZGF0YSkgewogICAgZmluYWwgc2NvcGVCdWlsZGVyID0gbmV3IF9TY29wZUJ1aWxkZXIodGhpcyk7CiAgICBub2RlLmFjY2VwdChzY29wZUJ1aWxkZXIpOwoKICAgIGZpbmFsIGFsbG9jYXRvciA9IG5ldyBfQWxsb2NhdG9yKHRoaXMpOwogICAgbm9kZS5hY2NlcHQoYWxsb2NhdG9yKTsKICB9CgogIHZvaWQgZW50ZXJTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBfY3VycmVudFNjb3BlID0gX3Njb3Blc1tub2RlXTsKICAgIF9jdXJyZW50RnJhbWUgPSBfY3VycmVudFNjb3BlLmZyYW1lOwogIH0KCiAgdm9pZCBsZWF2ZVNjb3BlKCkgewogICAgX2N1cnJlbnRTY29wZSA9IF9jdXJyZW50U2NvcGUucGFyZW50OwogICAgX2N1cnJlbnRGcmFtZSA9IF9jdXJyZW50U2NvcGU/LmZyYW1lOwogIH0KCiAgdm9pZCB3aXRoVGVtcChUcmVlTm9kZSBub2RlLCBpbnQgdGVtcCwgdm9pZCBhY3Rpb24oKSkgewogICAgZmluYWwgb2xkID0gX3RlbXBzW25vZGVdOwogICAgYXNzZXJ0KG9sZCA9PSBudWxsIHx8IG9sZC5sZW5ndGggPT0gMSk7CiAgICBfdGVtcHNbbm9kZV0gPSBbdGVtcF07CiAgICBhY3Rpb24oKTsKICAgIF90ZW1wc1tub2RlXSA9IG9sZDsKICB9Cn0KCmNsYXNzIFZhckRlc2MgewogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb247CiAgU2NvcGUgc2NvcGU7CiAgYm9vbCBpc0NhcHR1cmVkID0gZmFsc2U7CiAgaW50IGluZGV4OwogIGludCBvcmlnaW5hbFBhcmFtU2xvdEluZGV4OwoKICBWYXJEZXNjKHRoaXMuZGVjbGFyYXRpb24sIHRoaXMuc2NvcGUpIHsKICAgIHNjb3BlLnZhcnMuYWRkKHRoaXMpOwogIH0KCiAgRnJhbWUgZ2V0IGZyYW1lID0+IHNjb3BlLmZyYW1lOwoKICBib29sIGdldCBpc0FsbG9jYXRlZCA9PiBpbmRleCAhPSBudWxsOwoKICB2b2lkIGNhcHR1cmUoKSB7CiAgICBhc3NlcnQoIWlzQWxsb2NhdGVkKTsKICAgIGlzQ2FwdHVyZWQgPSB0cnVlOwogIH0KCiAgdm9pZCBtb3ZlVG9TY29wZShTY29wZSBuZXdTY29wZSkgewogICAgYXNzZXJ0KGluZGV4ID09IG51bGwpOwogICAgc2NvcGUudmFycy5yZW1vdmUodGhpcyk7CiAgICBuZXdTY29wZS52YXJzLmFkZCh0aGlzKTsKICAgIHNjb3BlID0gbmV3U2NvcGU7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAndmFyICR7ZGVjbGFyYXRpb24ubmFtZX0nOwp9CgpjbGFzcyBGcmFtZSB7CiAgZmluYWwgVHJlZU5vZGUgZnVuY3Rpb247CiAgZmluYWwgRnJhbWUgcGFyZW50OwogIFNjb3BlIHRvcFNjb3BlOwoKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG9yaWdpbmFsTmFtZWRQYXJhbWV0ZXJzOwogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gc29ydGVkTmFtZWRQYXJhbWV0ZXJzOwogIGludCBudW1QYXJhbWV0ZXJzID0gMDsKICBpbnQgbnVtVHlwZUFyZ3VtZW50cyA9IDA7CiAgYm9vbCBoYXNPcHRpb25hbFBhcmFtZXRlcnMgPSBmYWxzZTsKICBib29sIGhhc0NhcHR1cmVkUGFyYW1ldGVycyA9IGZhbHNlOwogIGJvb2wgaGFzQ2xvc3VyZXMgPSBmYWxzZTsKICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci5TeW5jOwogIGJvb2wgaXNTeW5jWWllbGRpbmcgPSBmYWxzZTsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyOwogIFZhcmlhYmxlRGVjbGFyYXRpb24gY2FwdHVyZWRSZWNlaXZlclZhcjsKICBWYXJpYWJsZURlY2xhcmF0aW9uIGZ1bmN0aW9uVHlwZUFyZ3NWYXI7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiBmYWN0b3J5VHlwZUFyZ3NWYXI7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiBjbG9zdXJlVmFyOwogIFZhcmlhYmxlRGVjbGFyYXRpb24gY29udGV4dFZhcjsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHNjcmF0Y2hWYXI7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5WYXI7CiAgTWFwPFN0cmluZywgVmFyaWFibGVEZWNsYXJhdGlvbj4gc3ludGhldGljVmFyczsKICBpbnQgZnJhbWVTaXplID0gMDsKICBMaXN0PGludD4gdGVtcG9yYXJpZXMgPSA8aW50PltdOwogIGludCBjb250ZXh0TGV2ZWxBdEVudHJ5OwoKICBGcmFtZSh0aGlzLmZ1bmN0aW9uLCB0aGlzLnBhcmVudCk7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0U3ludGhldGljVmFyKFN0cmluZyBuYW1lKSA9PgogICAgICBzeW50aGV0aWNWYXJzW25hbWVdID8/CiAgICAgICh0aHJvdyAnJHtuYW1lfSB2YXJpYWJsZSBpcyBub3QgZGVjbGFyZWQgaW4gJHtmdW5jdGlvbn0nKTsKfQoKY2xhc3MgU2NvcGUgewogIGZpbmFsIFNjb3BlIHBhcmVudDsKICBmaW5hbCBGcmFtZSBmcmFtZTsKICBmaW5hbCBpbnQgbG9vcERlcHRoOwogIGZpbmFsIExpc3Q8VmFyRGVzYz4gdmFycyA9IDxWYXJEZXNjPltdOwoKICBpbnQgbG9jYWxzVXNlZDsKICBpbnQgdGVtcHNVc2VkOwoKICBTY29wZSBjb250ZXh0T3duZXI7CiAgaW50IGNvbnRleHRVc2VkID0gMDsKICBpbnQgY29udGV4dFNpemUgPSAwOwogIGludCBjb250ZXh0TGV2ZWw7CiAgaW50IGNvbnRleHRJZDsKCiAgU2NvcGUodGhpcy5wYXJlbnQsIHRoaXMuZnJhbWUsIHRoaXMubG9vcERlcHRoKTsKCiAgYm9vbCBnZXQgaGFzQ29udGV4dCA9PiBjb250ZXh0U2l6ZSA+IDA7Cn0KCmJvb2wgX2hhc1JlY2VpdmVyUGFyYW1ldGVyKFRyZWVOb2RlIG5vZGUpIHsKICByZXR1cm4gbm9kZSBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAobm9kZSBpcyBQcm9jZWR1cmUgJiYgIW5vZGUuaXNTdGF0aWMpIHx8CiAgICAgIChub2RlIGlzIEZpZWxkICYmICFub2RlLmlzU3RhdGljKTsKfQoKY2xhc3MgX1Njb3BlQnVpbGRlciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3I8TnVsbD4gewogIGZpbmFsIExvY2FsVmFyaWFibGVzIGxvY2FsczsKCiAgU2NvcGUgX2N1cnJlbnRTY29wZTsKICBGcmFtZSBfY3VycmVudEZyYW1lOwogIExpc3Q8VHJlZU5vZGU+IF9lbmNsb3NpbmdUcnlCbG9ja3M7CiAgTGlzdDxUcmVlTm9kZT4gX2VuY2xvc2luZ1RyeUNhdGNoZXM7CiAgaW50IF9sb29wRGVwdGg7CgogIF9TY29wZUJ1aWxkZXIodGhpcy5sb2NhbHMpOwoKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IF9zb3J0TmFtZWRQYXJhbWV0ZXJzKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgZmluYWwgcGFyYW1zID0gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLnRvTGlzdCgpOwogICAgcGFyYW1zLnNvcnQoKFZhcmlhYmxlRGVjbGFyYXRpb24gYSwgVmFyaWFibGVEZWNsYXJhdGlvbiBiKSA9PgogICAgICAgIGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKSk7CiAgICByZXR1cm4gcGFyYW1zOwogIH0KCiAgdm9pZCBfdmlzaXRGdW5jdGlvbihUcmVlTm9kZSBub2RlKSB7CiAgICBmaW5hbCBzYXZlZEVuY2xvc2luZ1RyeUJsb2NrcyA9IF9lbmNsb3NpbmdUcnlCbG9ja3M7CiAgICBfZW5jbG9zaW5nVHJ5QmxvY2tzID0gPFRyZWVOb2RlPltdOwogICAgZmluYWwgc2F2ZWRFbmNsb3NpbmdUcnlDYXRjaGVzID0gX2VuY2xvc2luZ1RyeUNhdGNoZXM7CiAgICBfZW5jbG9zaW5nVHJ5Q2F0Y2hlcyA9IDxUcmVlTm9kZT5bXTsKICAgIGZpbmFsIHNhdmVMb29wRGVwdGggPSBfbG9vcERlcHRoOwogICAgX2xvb3BEZXB0aCA9IDA7CgogICAgX2VudGVyRnJhbWUobm9kZSk7CgogICAgaWYgKG5vZGUgaXMgRmllbGQpIHsKICAgICAgaWYgKF9oYXNSZWNlaXZlclBhcmFtZXRlcihub2RlKSkgewogICAgICAgIF9jdXJyZW50RnJhbWUucmVjZWl2ZXJWYXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigndGhpcycpOwogICAgICAgIF9kZWNsYXJlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5yZWNlaXZlclZhcik7CiAgICAgIH0KICAgICAgbm9kZS5pbml0aWFsaXplcj8uYWNjZXB0KHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG5vZGUgaXMgUHJvY2VkdXJlIHx8CiAgICAgICAgICBub2RlIGlzIENvbnN0cnVjdG9yIHx8CiAgICAgICAgICBub2RlIGlzIEZ1bmN0aW9uRGVjbGFyYXRpb24gfHwKICAgICAgICAgIG5vZGUgaXMgRnVuY3Rpb25FeHByZXNzaW9uKTsKCiAgICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IChub2RlIGFzIGR5bmFtaWMpLmZ1bmN0aW9uOwogICAgICBhc3NlcnQoZnVuY3Rpb24gIT0gbnVsbCk7CgogICAgICBfY3VycmVudEZyYW1lLmRhcnRBc3luY01hcmtlciA9IGZ1bmN0aW9uLmRhcnRBc3luY01hcmtlcjsKCiAgICAgIF9jdXJyZW50RnJhbWUuaXNTeW5jWWllbGRpbmcgPQogICAgICAgICAgZnVuY3Rpb24uYXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nOwoKICAgICAgaWYgKG5vZGUgaXMgUHJvY2VkdXJlICYmIG5vZGUuaXNGYWN0b3J5KSB7CiAgICAgICAgYXNzZXJ0KF9jdXJyZW50RnJhbWUucGFyZW50ID09IG51bGwpOwogICAgICAgIF9jdXJyZW50RnJhbWUubnVtVHlwZUFyZ3VtZW50cyA9IDA7CiAgICAgICAgX2N1cnJlbnRGcmFtZS5mYWN0b3J5VHlwZUFyZ3NWYXIgPQogICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignOnR5cGVfYXJndW1lbnRzJyk7CiAgICAgICAgX2RlY2xhcmVWYXJpYWJsZShfY3VycmVudEZyYW1lLmZhY3RvcnlUeXBlQXJnc1Zhcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2N1cnJlbnRGcmFtZS5udW1UeXBlQXJndW1lbnRzID0KICAgICAgICAgICAgKF9jdXJyZW50RnJhbWUucGFyZW50Py5udW1UeXBlQXJndW1lbnRzID8/IDApICsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKCiAgICAgICAgaWYgKF9jdXJyZW50RnJhbWUubnVtVHlwZUFyZ3VtZW50cyA+IDApIHsKICAgICAgICAgIF9jdXJyZW50RnJhbWUuZnVuY3Rpb25UeXBlQXJnc1ZhciA9CiAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oJzpmdW5jdGlvbl90eXBlX2FyZ3VtZW50c192YXInKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZnVuY3Rpb24uZmlsZU9mZnNldDsKICAgICAgICAgIF9kZWNsYXJlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5mdW5jdGlvblR5cGVBcmdzVmFyKTsKICAgICAgICB9CgogICAgICAgIGlmIChfY3VycmVudEZyYW1lLnBhcmVudD8uZmFjdG9yeVR5cGVBcmdzVmFyICE9IG51bGwpIHsKICAgICAgICAgIF9jdXJyZW50RnJhbWUuZmFjdG9yeVR5cGVBcmdzVmFyID0KICAgICAgICAgICAgICBfY3VycmVudEZyYW1lLnBhcmVudC5mYWN0b3J5VHlwZUFyZ3NWYXI7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoX2hhc1JlY2VpdmVyUGFyYW1ldGVyKG5vZGUpKSB7CiAgICAgICAgX2N1cnJlbnRGcmFtZS5yZWNlaXZlclZhciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCd0aGlzJyk7CiAgICAgICAgX2RlY2xhcmVWYXJpYWJsZShfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyKTsKICAgICAgfSBlbHNlIGlmIChfY3VycmVudEZyYW1lLnBhcmVudD8ucmVjZWl2ZXJWYXIgIT0gbnVsbCkgewogICAgICAgIF9jdXJyZW50RnJhbWUucmVjZWl2ZXJWYXIgPSBfY3VycmVudEZyYW1lLnBhcmVudC5yZWNlaXZlclZhcjsKICAgICAgfQogICAgICBpZiAobm9kZSBpcyBGdW5jdGlvbkRlY2xhcmF0aW9uIHx8IG5vZGUgaXMgRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgX2N1cnJlbnRGcmFtZS5jbG9zdXJlVmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oJzpjbG9zdXJlJyk7CiAgICAgICAgX2RlY2xhcmVWYXJpYWJsZShfY3VycmVudEZyYW1lLmNsb3N1cmVWYXIpOwogICAgICB9CgogICAgICBfY3VycmVudEZyYW1lLm9yaWdpbmFsTmFtZWRQYXJhbWV0ZXJzID0gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzOwogICAgICBfY3VycmVudEZyYW1lLnNvcnRlZE5hbWVkUGFyYW1ldGVycyA9IF9zb3J0TmFtZWRQYXJhbWV0ZXJzKGZ1bmN0aW9uKTsKCiAgICAgIHZpc2l0TGlzdChmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcyk7CiAgICAgIHZpc2l0TGlzdChfY3VycmVudEZyYW1lLnNvcnRlZE5hbWVkUGFyYW1ldGVycywgdGhpcyk7CgogICAgICBpZiAoX2N1cnJlbnRGcmFtZS5pc1N5bmNZaWVsZGluZykgewogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGZyb20gcGFyZW50IGZyYW1lIGFyZSB1c2VkIGltcGxpY2l0bHkgYW5kIG5lZWQKICAgICAgICAvLyB0byBiZSBjYXB0dXJlZCB0byBwcmVzZXJ2ZSBzdGF0ZSBhY3Jvc3MgY2xvc3VyZSBpbnZvY2F0aW9ucy4KICAgICAgICBfdXNlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5wYXJlbnQKICAgICAgICAgICAgLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuYXdhaXRKdW1wVmFyKSk7CiAgICAgICAgX3VzZVZhcmlhYmxlKF9jdXJyZW50RnJhbWUucGFyZW50CiAgICAgICAgICAgIC5nZXRTeW50aGV0aWNWYXIoQ29udGludWF0aW9uVmFyaWFibGVzLmF3YWl0Q29udGV4dFZhcikpOwoKICAgICAgICAvLyBEZWJ1Z2dlciBsb29rcyBmb3IgOmNvbnRyb2xsZXJfc3RyZWFtIHZhcmlhYmxlIGFtb25nIGNhcHR1cmVkCiAgICAgICAgLy8gdmFyaWFibGVzIGluIGEgY29udGV4dCwgc28gbWFrZSBzdXJlIHRvIGNhcHR1cmUgaXQuCiAgICAgICAgaWYgKF9jdXJyZW50RnJhbWUucGFyZW50LmRhcnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luY1N0YXIpIHsKICAgICAgICAgIF91c2VWYXJpYWJsZShfY3VycmVudEZyYW1lLnBhcmVudAogICAgICAgICAgICAgIC5nZXRTeW50aGV0aWNWYXIoQ29udGludWF0aW9uVmFyaWFibGVzLmNvbnRyb2xsZXJTdHJlYW1WYXIpKTsKICAgICAgICB9CgogICAgICAgIGlmIChsb2NhbHMub3B0aW9ucy5jYXVzYWxBc3luY1N0YWNrcyAmJgogICAgICAgICAgICAoX2N1cnJlbnRGcmFtZS5wYXJlbnQuZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jIHx8CiAgICAgICAgICAgICAgICBfY3VycmVudEZyYW1lLnBhcmVudC5kYXJ0QXN5bmNNYXJrZXIgPT0KICAgICAgICAgICAgICAgICAgICBBc3luY01hcmtlci5Bc3luY1N0YXIpKSB7CiAgICAgICAgICBfdXNlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5wYXJlbnQKICAgICAgICAgICAgICAuZ2V0U3ludGhldGljVmFyKENvbnRpbnVhdGlvblZhcmlhYmxlcy5hc3luY1N0YWNrVHJhY2VWYXIpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChub2RlIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gbm9kZS5lbmNsb3NpbmdDbGFzcy5maWVsZHMpIHsKICAgICAgICAgIGlmICghZmllbGQuaXNTdGF0aWMgJiYgZmllbGQuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBmaWVsZC5pbml0aWFsaXplci5hY2NlcHQodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZpc2l0TGlzdChub2RlLmluaXRpYWxpemVycywgdGhpcyk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uLmJvZHk/LmFjY2VwdCh0aGlzKTsKCiAgICAgIGlmIChfY3VycmVudEZyYW1lLmRhcnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luYyB8fAogICAgICAgICAgX2N1cnJlbnRGcmFtZS5kYXJ0QXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuU3luY1N0YXIgfHwKICAgICAgICAgIF9jdXJyZW50RnJhbWUuZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcikgewogICAgICAgIGxvY2FscwogICAgICAgICAgICAuX2dldFZhckRlc2MoX2N1cnJlbnRGcmFtZQogICAgICAgICAgICAgICAgLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuYXdhaXRKdW1wVmFyKSkKICAgICAgICAgICAgLm1vdmVUb1Njb3BlKF9jdXJyZW50U2NvcGUpOwogICAgICAgIGlmIChfY3VycmVudEZyYW1lLmRhcnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luYykgewogICAgICAgICAgbG9jYWxzCiAgICAgICAgICAgICAgLl9nZXRWYXJEZXNjKF9jdXJyZW50RnJhbWUKICAgICAgICAgICAgICAgICAgLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuYXN5bmNDb21wbGV0ZXIpKQogICAgICAgICAgICAgIC5tb3ZlVG9TY29wZShfY3VycmVudFNjb3BlKTsKICAgICAgICB9IGVsc2UgaWYgKF9jdXJyZW50RnJhbWUuZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcikgewogICAgICAgICAgbG9jYWxzCiAgICAgICAgICAgICAgLl9nZXRWYXJEZXNjKF9jdXJyZW50RnJhbWUKICAgICAgICAgICAgICAgICAgLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuY29udHJvbGxlcikpCiAgICAgICAgICAgICAgLm1vdmVUb1Njb3BlKF9jdXJyZW50U2NvcGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChub2RlIGlzIEZ1bmN0aW9uRGVjbGFyYXRpb24gfHwKICAgICAgICBub2RlIGlzIEZ1bmN0aW9uRXhwcmVzc2lvbiB8fAogICAgICAgIF9jdXJyZW50RnJhbWUuaGFzQ2xvc3VyZXMpIHsKICAgICAgX2N1cnJlbnRGcmFtZS5jb250ZXh0VmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oJzpjb250ZXh0Jyk7CiAgICAgIF9kZWNsYXJlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5jb250ZXh0VmFyKTsKICAgICAgX2N1cnJlbnRGcmFtZS5zY3JhdGNoVmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oJzpzY3JhdGNoJyk7CiAgICAgIF9kZWNsYXJlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5zY3JhdGNoVmFyKTsKICAgIH0KCiAgICBpZiAoX2hhc1JlY2VpdmVyUGFyYW1ldGVyKG5vZGUpKSB7CiAgICAgIGlmIChsb2NhbHMuaXNDYXB0dXJlZChfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyKSkgewogICAgICAgIC8vIER1cGxpY2F0ZSByZWNlaXZlciB2YXJpYWJsZSBmb3IgbG9jYWwgdXNlLgogICAgICAgIF9jdXJyZW50RnJhbWUuY2FwdHVyZWRSZWNlaXZlclZhciA9IF9jdXJyZW50RnJhbWUucmVjZWl2ZXJWYXI7CiAgICAgICAgX2N1cnJlbnRGcmFtZS5yZWNlaXZlclZhciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCd0aGlzJyk7CiAgICAgICAgX2RlY2xhcmVWYXJpYWJsZShfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyKTsKICAgICAgfQogICAgfQoKICAgIF9sZWF2ZUZyYW1lKCk7CgogICAgX2VuY2xvc2luZ1RyeUJsb2NrcyA9IHNhdmVkRW5jbG9zaW5nVHJ5QmxvY2tzOwogICAgX2VuY2xvc2luZ1RyeUNhdGNoZXMgPSBzYXZlZEVuY2xvc2luZ1RyeUNhdGNoZXM7CiAgICBfbG9vcERlcHRoID0gc2F2ZUxvb3BEZXB0aDsKICB9CgogIF9lbnRlckZyYW1lKFRyZWVOb2RlIG5vZGUpIHsKICAgIF9jdXJyZW50RnJhbWUgPSBuZXcgRnJhbWUobm9kZSwgX2N1cnJlbnRGcmFtZSk7CiAgICBfZW50ZXJTY29wZShub2RlKTsKICAgIF9jdXJyZW50RnJhbWUudG9wU2NvcGUgPSBfY3VycmVudFNjb3BlOwogIH0KCiAgX2xlYXZlRnJhbWUoKSB7CiAgICBfbGVhdmVTY29wZSgpOwogICAgX2N1cnJlbnRGcmFtZSA9IF9jdXJyZW50RnJhbWUucGFyZW50OwogIH0KCiAgdm9pZCBfZW50ZXJTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBfY3VycmVudFNjb3BlID0gbmV3IFNjb3BlKF9jdXJyZW50U2NvcGUsIF9jdXJyZW50RnJhbWUsIF9sb29wRGVwdGgpOwogICAgYXNzZXJ0KGxvY2Fscy5fc2NvcGVzW25vZGVdID09IG51bGwpOwogICAgbG9jYWxzLl9zY29wZXNbbm9kZV0gPSBfY3VycmVudFNjb3BlOwogIH0KCiAgdm9pZCBfbGVhdmVTY29wZSgpIHsKICAgIF9jdXJyZW50U2NvcGUgPSBfY3VycmVudFNjb3BlLnBhcmVudDsKICB9CgogIHZvaWQgX2RlY2xhcmVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBbU2NvcGUgc2NvcGVdKSB7CiAgICBpZiAoc2NvcGUgPT0gbnVsbCkgewogICAgICBzY29wZSA9IF9jdXJyZW50U2NvcGU7CiAgICB9CiAgICBmaW5hbCBWYXJEZXNjIHYgPSBuZXcgVmFyRGVzYyh2YXJpYWJsZSwgc2NvcGUpOwogICAgYXNzZXJ0KGxvY2Fscy5fdmFyc1t2YXJpYWJsZV0gPT0gbnVsbCk7CiAgICBsb2NhbHMuX3ZhcnNbdmFyaWFibGVdID0gdjsKICB9CgogIHZvaWQgX3VzZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGFzc2VydCh2YXJpYWJsZSAhPSBudWxsKTsKICAgIGZpbmFsIFZhckRlc2MgdiA9IGxvY2Fscy5fdmFyc1t2YXJpYWJsZV07CiAgICBpZiAodiA9PSBudWxsKSB7CiAgICAgIHRocm93ICdWYXJpYWJsZSAkdmFyaWFibGUgaXMgdXNlZCBiZWZvcmUgZGVjbGFyZWQnOwogICAgfQogICAgaWYgKHYuZnJhbWUgIT0gX2N1cnJlbnRGcmFtZSkgewogICAgICB2LmNhcHR1cmUoKTsKICAgIH0KICB9CgogIHZvaWQgX3VzZVRoaXMoKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRGcmFtZS5yZWNlaXZlclZhciAhPSBudWxsKTsKICAgIF91c2VWYXJpYWJsZShfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyKTsKICB9CgogIHZvaWQgX2NhcHR1cmVBbGxWaXNpYmxlVmFyaWFibGVzSW5DdXJyZW50RnJhbWUoKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRGcmFtZS5pc1N5bmNZaWVsZGluZyk7CiAgICBmaW5hbCB0cmFuc2llbnQgPSBuZXcgU2V0PFZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICB0cmFuc2llbnQKICAgICAgLi5hZGRBbGwoWwogICAgICAgIF9jdXJyZW50RnJhbWUuZnVuY3Rpb25UeXBlQXJnc1ZhciwKICAgICAgICBfY3VycmVudEZyYW1lLmNsb3N1cmVWYXIsCiAgICAgICAgX2N1cnJlbnRGcmFtZS5jb250ZXh0VmFyLAogICAgICAgIF9jdXJyZW50RnJhbWUuc2NyYXRjaFZhciwKICAgICAgICBfY3VycmVudEZyYW1lLnJldHVyblZhciwKICAgICAgXSk7CiAgICB0cmFuc2llbnQuYWRkQWxsKChfY3VycmVudEZyYW1lLmZ1bmN0aW9uIGFzIEZ1bmN0aW9uRGVjbGFyYXRpb24pCiAgICAgICAgLmZ1bmN0aW9uCiAgICAgICAgLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKTsKICAgIGZvciAoU2NvcGUgc2NvcGUgPSBfY3VycmVudFNjb3BlOwogICAgICAgIHNjb3BlICE9IG51bGwgJiYgc2NvcGUuZnJhbWUgPT0gX2N1cnJlbnRGcmFtZTsKICAgICAgICBzY29wZSA9IHNjb3BlLnBhcmVudCkgewogICAgICBmb3IgKFZhckRlc2MgdiBpbiBzY29wZS52YXJzKSB7CiAgICAgICAgaWYgKCF0cmFuc2llbnQuY29udGFpbnModi5kZWNsYXJhdGlvbikpIHsKICAgICAgICAgIHYuY2FwdHVyZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8gQ2FwdHVyZSBzeW50aGV0aWMgdmFyaWFibGVzIGZvciBjb250cm9sIGZsb3cgc3RhdGVtZW50cy4KICB2b2lkIF9jYXB0dXJlU3ludGhldGljVmFyaWFibGVzKCkgewogICAgaW50IGRlcHRoID0gMDsKICAgIGZvciAoVHJlZU5vZGUgdHJ5QmxvY2sgaW4gX2VuY2xvc2luZ1RyeUJsb2NrcykgewogICAgICBsb2NhbHMuX2NhcHR1cmVkU2F2ZWRDb250ZXh0VmFycyA/Pz0KICAgICAgICAgIG5ldyBNYXA8VHJlZU5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICAgIF9jYXB0dXJlU3ludGhldGljVmFyaWFibGUoQ29udGludWF0aW9uVmFyaWFibGVzLnNhdmVkVHJ5Q29udGV4dFZhcihkZXB0aCksCiAgICAgICAgICB0cnlCbG9jaywgbG9jYWxzLl9jYXB0dXJlZFNhdmVkQ29udGV4dFZhcnMpOwogICAgICArK2RlcHRoOwogICAgfQogICAgZGVwdGggPSAwOwogICAgZm9yIChUcmVlTm9kZSB0cnlCbG9jayBpbiBfZW5jbG9zaW5nVHJ5Q2F0Y2hlcykgewogICAgICBsb2NhbHMuX2NhcHR1cmVkRXhjZXB0aW9uVmFycyA/Pz0KICAgICAgICAgIG5ldyBNYXA8VHJlZU5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICAgIGxvY2Fscy5fY2FwdHVyZWRTdGFja1RyYWNlVmFycyA/Pz0KICAgICAgICAgIG5ldyBNYXA8VHJlZU5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb24+KCk7CiAgICAgIF9jYXB0dXJlU3ludGhldGljVmFyaWFibGUoQ29udGludWF0aW9uVmFyaWFibGVzLmV4Y2VwdGlvblZhcihkZXB0aCksCiAgICAgICAgICB0cnlCbG9jaywgbG9jYWxzLl9jYXB0dXJlZEV4Y2VwdGlvblZhcnMpOwogICAgICBfY2FwdHVyZVN5bnRoZXRpY1ZhcmlhYmxlKENvbnRpbnVhdGlvblZhcmlhYmxlcy5zdGFja1RyYWNlVmFyKGRlcHRoKSwKICAgICAgICAgIHRyeUJsb2NrLCBsb2NhbHMuX2NhcHR1cmVkU3RhY2tUcmFjZVZhcnMpOwogICAgICArK2RlcHRoOwogICAgfQogIH0KCiAgdm9pZCBfY2FwdHVyZVN5bnRoZXRpY1ZhcmlhYmxlKAogICAgICBTdHJpbmcgbmFtZSwgVHJlZU5vZGUgbm9kZSwgTWFwPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPiBtYXApIHsKICAgIGZpbmFsIHZhcmlhYmxlID0gX2N1cnJlbnRGcmFtZS5wYXJlbnQuZ2V0U3ludGhldGljVmFyKG5hbWUpOwogICAgX3VzZVZhcmlhYmxlKHZhcmlhYmxlKTsKICAgIGFzc2VydChtYXBbbm9kZV0gPT0gbnVsbCB8fCBtYXBbbm9kZV0gPT0gdmFyaWFibGUpOwogICAgbWFwW25vZGVdID0gdmFyaWFibGU7CiAgfQoKICB2b2lkIF92aXNpdFdpdGhTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBfZW50ZXJTY29wZShub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIF9sZWF2ZVNjb3BlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBfdmlzaXRGdW5jdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9jdXJyZW50RnJhbWUuaGFzQ2xvc3VyZXMgPSB0cnVlOwogICAgaWYgKF9jdXJyZW50RnJhbWUucmVjZWl2ZXJWYXIgIT0gbnVsbCkgewogICAgICAvLyBDbG9zdXJlIGNyZWF0aW9uIG1heSBsb2FkIHJlY2VpdmVyIHRvIGdldCBpbnN0YW50aWF0b3IgdHlwZSBhcmd1bWVudHMuCiAgICAgIF91c2VUaGlzKCk7CiAgICB9CiAgICBub2RlLnZhcmlhYmxlLmFjY2VwdCh0aGlzKTsKICAgIF92aXNpdEZ1bmN0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIF9jdXJyZW50RnJhbWUuaGFzQ2xvc3VyZXMgPSB0cnVlOwogICAgaWYgKF9jdXJyZW50RnJhbWUucmVjZWl2ZXJWYXIgIT0gbnVsbCkgewogICAgICAvLyBDbG9zdXJlIGNyZWF0aW9uIG1heSBsb2FkIHJlY2VpdmVyIHRvIGdldCBpbnN0YW50aWF0b3IgdHlwZSBhcmd1bWVudHMuCiAgICAgIF91c2VUaGlzKCk7CiAgICB9CiAgICBfdmlzaXRGdW5jdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9kZWNsYXJlVmFyaWFibGUobm9kZSk7CgogICAgaWYgKF9jdXJyZW50RnJhbWUuZGFydEFzeW5jTWFya2VyICE9IEFzeW5jTWFya2VyLlN5bmMgJiYKICAgICAgICBub2RlLm5hbWVbMF0gPT0gJzonKSB7CiAgICAgIF9jdXJyZW50RnJhbWUuc3ludGhldGljVmFycyA/Pz0gPFN0cmluZywgVmFyaWFibGVEZWNsYXJhdGlvbj57fTsKICAgICAgYXNzZXJ0KF9jdXJyZW50RnJhbWUuc3ludGhldGljVmFyc1tub2RlLm5hbWVdID09IG51bGwpOwogICAgICBfY3VycmVudEZyYW1lLnN5bnRoZXRpY1ZhcnNbbm9kZS5uYW1lXSA9IG5vZGU7CiAgICB9CgogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICBfdXNlVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICBpZiAobm9kZS52YXJpYWJsZS5pc0xhdGUgJiYgbm9kZS52YXJpYWJsZS5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICBfdXNlVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIF91c2VUaGlzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgX3VzZVRoaXMoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIF91c2VUaGlzKCk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBfdXNlVGhpcygpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJhbWV0ZXIucGFyZW50OwogICAgaWYgKHBhcmVudCBpcyBDbGFzcykgewogICAgICBfdXNlVGhpcygpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgRnVuY3Rpb25Ob2RlKSB7CiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgIGlmIChwYXJlbnQgaXMgUHJvY2VkdXJlICYmIHBhcmVudC5pc0ZhY3RvcnkpIHsKICAgICAgICBhc3NlcnQoX2N1cnJlbnRGcmFtZS5mYWN0b3J5VHlwZUFyZ3NWYXIgIT0gbnVsbCk7CiAgICAgICAgX3VzZVZhcmlhYmxlKF9jdXJyZW50RnJhbWUuZmFjdG9yeVR5cGVBcmdzVmFyKTsKICAgICAgfQogICAgfQoKICAgIC8vIEVyYXNlIHByb21vdGVkIGJvdW5kIGluIHR5cGUgcGFyYW1ldGVyIHR5cGVzIGFzIGl0IG1ha2VzIG5vCiAgICAvLyBkaWZmZXJlbmNlIGF0IHJ1biB0aW1lLCBidXQgdHlwZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBvbmx5IGluCiAgICAvLyBwcm9tb3RlZCBib3VuZHMgYXJlIG5vdCBlcXVhbCB3aGVuIGNvbXBhcmVkIHVzaW5nIERhcnRUeXBlLm9wZXJhdG9yPT0sCiAgICAvLyB3aGljaCBwcmV2ZW50cyByZXVzaW5nIG9mIHR5cGUgYXJndW1lbnRzLgogICAgLy8gU2VlIGRhcnRidWcuY29tLzM5MjQwIGZvciBjb250ZXh0LgogICAgbm9kZS5wcm9tb3RlZEJvdW5kID0gbnVsbDsKCiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIF92aXNpdFdpdGhTY29wZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICAvLyBOb3QgdXNpbmcgX3Zpc2l0V2l0aFNjb3BlIGFzIEJsb2NrIGluc2lkZSBCbG9ja0V4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQogICAgLy8gYSBzY29wZS4KICAgIF9lbnRlclNjb3BlKG5vZGUpOwogICAgdmlzaXRMaXN0KG5vZGUuYm9keS5zdGF0ZW1lbnRzLCB0aGlzKTsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgX2xlYXZlU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIWxvY2Fscy5vcHRpb25zLmVuYWJsZUFzc2VydHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3VwZXIudmlzaXRBc3NlcnRTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpIHsKICAgIGlmICghbG9jYWxzLm9wdGlvbnMuZW5hYmxlQXNzZXJ0cykgewogICAgICByZXR1cm47CiAgICB9CiAgICBfdmlzaXRXaXRoU2NvcGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgKytfbG9vcERlcHRoOwogICAgX3Zpc2l0V2l0aFNjb3BlKG5vZGUpOwogICAgLS1fbG9vcERlcHRoOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSB7CiAgICBub2RlLml0ZXJhYmxlLmFjY2VwdCh0aGlzKTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGl0ZXJhdG9yVmFyOwogICAgaWYgKF9jdXJyZW50RnJhbWUuaXNTeW5jWWllbGRpbmcpIHsKICAgICAgLy8gRGVjbGFyZSBhIHZhcmlhYmxlIHRvIGhvbGQgJ2l0ZXJhdG9yJyBzbyBpdCBjb3VsZCBiZSBjYXB0dXJlZC4KICAgICAgaXRlcmF0b3JWYXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignOml0ZXJhdG9yJyk7CiAgICAgIF9kZWNsYXJlVmFyaWFibGUoaXRlcmF0b3JWYXIpOwogICAgICBsb2NhbHMuX2NhcHR1cmVkSXRlcmF0b3JWYXJzID8/PQogICAgICAgICAgbmV3IE1hcDxGb3JJblN0YXRlbWVudCwgVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKICAgICAgbG9jYWxzLl9jYXB0dXJlZEl0ZXJhdG9yVmFyc1tub2RlXSA9IGl0ZXJhdG9yVmFyOwogICAgfQoKICAgICsrX2xvb3BEZXB0aDsKICAgIF9lbnRlclNjb3BlKG5vZGUpOwogICAgbm9kZS52YXJpYWJsZS5hY2NlcHQodGhpcyk7CiAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgX2xlYXZlU2NvcGUoKTsKICAgIC0tX2xvb3BEZXB0aDsKCiAgICBpZiAoX2N1cnJlbnRGcmFtZS5pc1N5bmNZaWVsZGluZyAmJiAhbG9jYWxzLmlzQ2FwdHVyZWQoaXRlcmF0b3JWYXIpKSB7CiAgICAgIC8vIEl0ZXJhdG9yIHZhcmlhYmxlIHdhcyBub3QgY2FwdHVyZWQsIGFzIHRoZXJlIGFyZSBubyB5aWVsZCBwb2ludHMKICAgICAgLy8gaW5zaWRlIGZvci1pbiBzdGF0ZW1lbnQgYm9keS4gVGhlIHZhcmlhYmxlIGlzIG5lZWRlZCBvbmx5IGlmIGNhcHR1cmVkLAogICAgICAvLyBzbyB1bmRlY2xhcmUgaXQuCiAgICAgIGFzc2VydChfY3VycmVudFNjb3BlLnZhcnMubGFzdCA9PSBsb2NhbHMuX3ZhcnNbaXRlcmF0b3JWYXJdKTsKICAgICAgX2N1cnJlbnRTY29wZS52YXJzLnJlbW92ZUxhc3QoKTsKICAgICAgbG9jYWxzLl92YXJzLnJlbW92ZShpdGVyYXRvclZhcik7CiAgICAgIGxvY2Fscy5fY2FwdHVyZWRJdGVyYXRvclZhcnMucmVtb3ZlKG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICBfdmlzaXRXaXRoU2NvcGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExldChMZXQgbm9kZSkgewogICAgX3Zpc2l0V2l0aFNjb3BlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRGcmFtZS5pc1N5bmNZaWVsZGluZyk7CiAgICBfY2FwdHVyZUFsbFZpc2libGVWYXJpYWJsZXNJbkN1cnJlbnRGcmFtZSgpOwogICAgX2NhcHR1cmVTeW50aGV0aWNWYXJpYWJsZXMoKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgewogICAgX2VuY2xvc2luZ1RyeUJsb2Nrcy5hZGQobm9kZSk7CiAgICBub2RlLmJvZHk/LmFjY2VwdCh0aGlzKTsKICAgIF9lbmNsb3NpbmdUcnlCbG9ja3MucmVtb3ZlTGFzdCgpOwoKICAgIF9lbmNsb3NpbmdUcnlDYXRjaGVzLmFkZChub2RlKTsKICAgIHZpc2l0TGlzdChub2RlLmNhdGNoZXMsIHRoaXMpOwogICAgX2VuY2xvc2luZ1RyeUNhdGNoZXMucmVtb3ZlTGFzdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSkgewogICAgX2VuY2xvc2luZ1RyeUJsb2Nrcy5hZGQobm9kZSk7CiAgICBub2RlLmJvZHk/LmFjY2VwdCh0aGlzKTsKICAgIF9lbmNsb3NpbmdUcnlCbG9ja3MucmVtb3ZlTGFzdCgpOwoKICAgIF9lbmNsb3NpbmdUcnlDYXRjaGVzLmFkZChub2RlKTsKICAgIG5vZGUuZmluYWxpemVyPy5hY2NlcHQodGhpcyk7CiAgICBfZW5jbG9zaW5nVHJ5Q2F0Y2hlcy5yZW1vdmVMYXN0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gSWYgcmV0dXJuaW5nIGZyb20gd2l0aGluIGEgdHJ5LWZpbmFsbHkgYmxvY2ssIG5lZWQgdG8gYWxsb2NhdGUKICAgIC8vIGFuIGV4dHJhIHZhcmlhYmxlIHRvIGhvbGQgYSByZXR1cm4gdmFsdWUuCiAgICAvLyBSZXR1cm4gdmFsdWUgY2FuJ3QgYmUga2VwdCBvbiB0aGUgc3RhY2sgYXMgdHJ5LWNhdGNoIHN0YXRlbWVudHMKICAgIC8vIGluc2lkZSBmaW5hbGx5IGNhbiB6YXAgZXhwcmVzc2lvbiBzdGFjay4KICAgIC8vIExpdGVyYWxzIChpbmNsdWRpbmcgaW1wbGljaXQgJ251bGwnIGluICdyZXR1cm47JykgZG8gbm90IHJlcXVpcmUKICAgIC8vIGFuIGV4dHJhIHZhcmlhYmxlIGFzIHRoZXkgY2FuIGJlIGdlbmVyYXRlZCBhZnRlciBhbGwgZmluYWxseSBibG9ja3MuCiAgICBpZiAoX2VuY2xvc2luZ1RyeUJsb2Nrcy5pc05vdEVtcHR5ICYmCiAgICAgICAgKG5vZGUuZXhwcmVzc2lvbiAhPSBudWxsICYmIG5vZGUuZXhwcmVzc2lvbiBpcyEgQmFzaWNMaXRlcmFsKSkgewogICAgICBfY3VycmVudEZyYW1lLnJldHVyblZhciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCc6cmV0dXJuJyk7CiAgICAgIF9kZWNsYXJlVmFyaWFibGUoX2N1cnJlbnRGcmFtZS5yZXR1cm5WYXIsIF9jdXJyZW50RnJhbWUudG9wU2NvcGUpOwogICAgfQogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICArK19sb29wRGVwdGg7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICAtLV9sb29wRGVwdGg7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgICsrX2xvb3BEZXB0aDsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIC0tX2xvb3BEZXB0aDsKICB9Cn0KCmNsYXNzIF9BbGxvY2F0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPE51bGw+IHsKICBmaW5hbCBMb2NhbFZhcmlhYmxlcyBsb2NhbHM7CgogIFNjb3BlIF9jdXJyZW50U2NvcGU7CiAgRnJhbWUgX2N1cnJlbnRGcmFtZTsKICBpbnQgX2NvbnRleHRJZENvdW50ZXIgPSAwOwoKICBfQWxsb2NhdG9yKHRoaXMubG9jYWxzKTsKCiAgdm9pZCBfZW50ZXJTY29wZShUcmVlTm9kZSBub2RlKSB7CiAgICBmaW5hbCBzY29wZSA9IGxvY2Fscy5fc2NvcGVzW25vZGVdOwogICAgYXNzZXJ0KHNjb3BlICE9IG51bGwpOwogICAgYXNzZXJ0KHNjb3BlLnBhcmVudCA9PSBfY3VycmVudFNjb3BlKTsKICAgIF9jdXJyZW50U2NvcGUgPSBzY29wZTsKCiAgICBpZiAoX2N1cnJlbnRTY29wZS5mcmFtZSAhPSBfY3VycmVudEZyYW1lKSB7CiAgICAgIF9jdXJyZW50RnJhbWUgPSBfY3VycmVudFNjb3BlLmZyYW1lOwoKICAgICAgaWYgKF9jdXJyZW50U2NvcGUucGFyZW50ICE9IG51bGwpIHsKICAgICAgICBfY3VycmVudEZyYW1lLmNvbnRleHRMZXZlbEF0RW50cnkgPSBfY3VycmVudFNjb3BlLnBhcmVudC5jb250ZXh0TGV2ZWw7CgogICAgICAgIGlmIChfY3VycmVudEZyYW1lLmlzU3luY1lpZWxkaW5nKSB7CiAgICAgICAgICAvLyBfQ2xvc3VyZS5fY2xvbmUoKSwgd2hpY2ggaXMgdXNlZCB0byBjbG9uZSBzeW5jLXlpZWxkaW5nIGNsb3N1cmVzCiAgICAgICAgICAvLyBvbmx5IGNsb25lcyAxIGxldmVsIG9mIGEgY29udGV4dC4gU28gcGFyZW50IGZyYW1lIG9mIGEKICAgICAgICAgIC8vIHN5bmMteWllbGRpbmcgY2xvc3VyZSBzaG91bGQgaGF2ZSBleGFjdGx5IDEgY29udGV4dCBsZXZlbC4KICAgICAgICAgIGZpbmFsIHBhcmVudEZyYW1lID0gX2N1cnJlbnRGcmFtZS5wYXJlbnQ7CiAgICAgICAgICBmaW5hbCBjdXJyZW50TGV2ZWwgPSBfY3VycmVudEZyYW1lLmNvbnRleHRMZXZlbEF0RW50cnk7CiAgICAgICAgICBmaW5hbCBwYXJlbnRMZXZlbCA9IHBhcmVudEZyYW1lLmNvbnRleHRMZXZlbEF0RW50cnkgPz8gLTE7CiAgICAgICAgICBpZiAoY3VycmVudExldmVsICE9IHBhcmVudExldmVsICsgMSkgewogICAgICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBjb250ZXh0IGFsbG9jYXRpb24gaW4gJHtwYXJlbnRGcmFtZS5mdW5jdGlvbn1cbicKICAgICAgICAgICAgICAgICcgLSBjb250ZXh0IGxldmVsIGF0IHBhcmVudCBlbnRyeTogJHtwYXJlbnRMZXZlbH1cbicKICAgICAgICAgICAgICAgICcgLSBjb250ZXh0IGxldmVsIGF0IHN5bnRoZXRpYyBjbG9zdXJlIGVudHJ5OiAke2N1cnJlbnRMZXZlbH1cbic7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfY3VycmVudFNjb3BlLmxvY2Fsc1VzZWQgPSAwOwogICAgICBfY3VycmVudFNjb3BlLnRlbXBzVXNlZCA9IDA7CiAgICB9IGVsc2UgewogICAgICBfY3VycmVudFNjb3BlLmxvY2Fsc1VzZWQgPSBfY3VycmVudFNjb3BlLnBhcmVudC5sb2NhbHNVc2VkOwogICAgICBfY3VycmVudFNjb3BlLnRlbXBzVXNlZCA9IF9jdXJyZW50U2NvcGUucGFyZW50LnRlbXBzVXNlZDsKICAgIH0KCiAgICBhc3NlcnQoX2N1cnJlbnRTY29wZS5jb250ZXh0T3duZXIgPT0gbnVsbCk7CiAgICBhc3NlcnQoX2N1cnJlbnRTY29wZS5jb250ZXh0TGV2ZWwgPT0gbnVsbCk7CiAgICBhc3NlcnQoX2N1cnJlbnRTY29wZS5jb250ZXh0SWQgPT0gbnVsbCk7CgogICAgZmluYWwgaW50IHBhcmVudENvbnRleHRMZXZlbCA9CiAgICAgICAgX2N1cnJlbnRTY29wZS5wYXJlbnQgIT0gbnVsbCA/IF9jdXJyZW50U2NvcGUucGFyZW50LmNvbnRleHRMZXZlbCA6IC0xOwoKICAgIGZpbmFsIGludCBudW1DYXB0dXJlZCA9CiAgICAgICAgX2N1cnJlbnRTY29wZS52YXJzLndoZXJlKCh2KSA9PiB2LmlzQ2FwdHVyZWQpLmxlbmd0aDsKICAgIGlmIChudW1DYXB0dXJlZCA+IDApIHsKICAgICAgLy8gU2hhcmUgY29udGV4dHMgYmV0d2VlbiBzY29wZXMgd2hpY2ggYmVsb25nIHRvIHRoZSBzYW1lIGZyYW1lIGFuZAogICAgICAvLyBoYXZlIHRoZSBzYW1lIGxvb3AgZGVwdGguCiAgICAgIF9jdXJyZW50U2NvcGUuY29udGV4dE93bmVyID0gX2N1cnJlbnRTY29wZTsKICAgICAgZm9yIChTY29wZSBjb250ZXh0T3duZXIgPSBfY3VycmVudFNjb3BlOwogICAgICAgICAgY29udGV4dE93bmVyICE9IG51bGwgJiYKICAgICAgICAgICAgICBjb250ZXh0T3duZXIuZnJhbWUgPT0gX2N1cnJlbnRTY29wZS5mcmFtZSAmJgogICAgICAgICAgICAgIGNvbnRleHRPd25lci5sb29wRGVwdGggPT0gX2N1cnJlbnRTY29wZS5sb29wRGVwdGg7CiAgICAgICAgICBjb250ZXh0T3duZXIgPSBjb250ZXh0T3duZXIucGFyZW50KSB7CiAgICAgICAgaWYgKGNvbnRleHRPd25lci5oYXNDb250ZXh0KSB7CiAgICAgICAgICBfY3VycmVudFNjb3BlLmNvbnRleHRPd25lciA9IGNvbnRleHRPd25lcjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2N1cnJlbnRTY29wZS5jb250ZXh0T3duZXIuY29udGV4dFNpemUgKz0gbnVtQ2FwdHVyZWQ7CgogICAgICBpZiAoX2N1cnJlbnRTY29wZS5jb250ZXh0T3duZXIgPT0gX2N1cnJlbnRTY29wZSkgewogICAgICAgIF9jdXJyZW50U2NvcGUuY29udGV4dExldmVsID0gcGFyZW50Q29udGV4dExldmVsICsgMTsKICAgICAgICBpbnQgc2F0dXJhdGVkQ29udGV4dElkID0gbWluKF9jb250ZXh0SWRDb3VudGVyKyssIGNvbnRleHRJZExpbWl0IC0gMSk7CiAgICAgICAgX2N1cnJlbnRTY29wZS5jb250ZXh0SWQgPSBzYXR1cmF0ZWRDb250ZXh0SWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2N1cnJlbnRTY29wZS5jb250ZXh0TGV2ZWwgPSBfY3VycmVudFNjb3BlLmNvbnRleHRPd25lci5jb250ZXh0TGV2ZWw7CiAgICAgICAgX2N1cnJlbnRTY29wZS5jb250ZXh0SWQgPSBfY3VycmVudFNjb3BlLmNvbnRleHRPd25lci5jb250ZXh0SWQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIF9jdXJyZW50U2NvcGUuY29udGV4dExldmVsID0gcGFyZW50Q29udGV4dExldmVsOwogICAgfQogIH0KCiAgdm9pZCBfbGVhdmVTY29wZSgpIHsKICAgIGFzc2VydChfY3VycmVudFNjb3BlLmNvbnRleHRVc2VkID09IF9jdXJyZW50U2NvcGUuY29udGV4dFNpemUpOwoKICAgIF9jdXJyZW50U2NvcGUgPSBfY3VycmVudFNjb3BlLnBhcmVudDsKICAgIF9jdXJyZW50RnJhbWUgPSBfY3VycmVudFNjb3BlPy5mcmFtZTsKCiAgICAvLyBSZW1vdmUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB3aGljaCBhcmUgb3V0IG9mIHNjb3BlLgogICAgaWYgKF9jdXJyZW50U2NvcGUgIT0gbnVsbCkgewogICAgICBpbnQgdGVtcHNUb1JldGFpbiA9IF9jdXJyZW50RnJhbWUudGVtcG9yYXJpZXMubGVuZ3RoOwogICAgICB3aGlsZSAodGVtcHNUb1JldGFpbiA+IDAgJiYKICAgICAgICAgIF9jdXJyZW50RnJhbWUudGVtcG9yYXJpZXNbdGVtcHNUb1JldGFpbiAtIDFdID49CiAgICAgICAgICAgICAgX2N1cnJlbnRTY29wZS5sb2NhbHNVc2VkKSB7CiAgICAgICAgLS10ZW1wc1RvUmV0YWluOwogICAgICB9CiAgICAgIGFzc2VydCh0ZW1wc1RvUmV0YWluID49IF9jdXJyZW50U2NvcGUudGVtcHNVc2VkKTsKICAgICAgX2N1cnJlbnRGcmFtZS50ZW1wb3Jhcmllcy5sZW5ndGggPSB0ZW1wc1RvUmV0YWluOwogICAgICBhc3NlcnQoX2N1cnJlbnRGcmFtZS50ZW1wb3JhcmllcwogICAgICAgICAgLmV2ZXJ5KChpbmRleCkgPT4gaW5kZXggPCBfY3VycmVudFNjb3BlLmxvY2Fsc1VzZWQpKTsKICAgIH0KICB9CgogIHZvaWQgX3VwZGF0ZUZyYW1lU2l6ZSgpIHsKICAgIF9jdXJyZW50RnJhbWUuZnJhbWVTaXplID0KICAgICAgICBtYXgoX2N1cnJlbnRGcmFtZS5mcmFtZVNpemUsIF9jdXJyZW50U2NvcGUubG9jYWxzVXNlZCk7CiAgfQoKICB2b2lkIF9hbGxvY2F0ZVRlbXAoVHJlZU5vZGUgbm9kZSwge2ludCBjb3VudDogMX0pIHsKICAgIGxvY2Fscy5fdGVtcHMgPz89IG5ldyBNYXA8VHJlZU5vZGUsIExpc3Q8aW50Pj4oKTsKICAgIGFzc2VydChsb2NhbHMuX3RlbXBzW25vZGVdID09IG51bGwpOwogICAgaWYgKF9jdXJyZW50U2NvcGUudGVtcHNVc2VkICsgY291bnQgPiBfY3VycmVudEZyYW1lLnRlbXBvcmFyaWVzLmxlbmd0aCkgewogICAgICAvLyBBbGxvY2F0ZSBuZXcgbG9jYWwgc2xvdHMgZm9yIHRlbXBvcmFyeSB2YXJpYWJsZXMuCiAgICAgIGZpbmFsIGludCBuZXdTbG90cyA9CiAgICAgICAgICAoX2N1cnJlbnRTY29wZS50ZW1wc1VzZWQgKyBjb3VudCkgLSBfY3VycmVudEZyYW1lLnRlbXBvcmFyaWVzLmxlbmd0aDsKICAgICAgaW50IGxvY2FsID0gX2N1cnJlbnRTY29wZS5sb2NhbHNVc2VkOwogICAgICBfY3VycmVudFNjb3BlLmxvY2Fsc1VzZWQgKz0gbmV3U2xvdHM7CiAgICAgIGlmIChfY3VycmVudFNjb3BlLmxvY2Fsc1VzZWQgPiBsb2NhbFZhcmlhYmxlSW5kZXhMaW1pdCkgewogICAgICAgIHRocm93IG5ldyBMb2NhbFZhcmlhYmxlSW5kZXhPdmVyZmxvd0V4Y2VwdGlvbigpOwogICAgICB9CiAgICAgIF91cGRhdGVGcmFtZVNpemUoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTbG90czsgaSsrKSB7CiAgICAgICAgX2N1cnJlbnRGcmFtZS50ZW1wb3Jhcmllcy5hZGQobG9jYWwgKyBpKTsKICAgICAgfQogICAgfQogICAgbG9jYWxzLl90ZW1wc1tub2RlXSA9IF9jdXJyZW50RnJhbWUudGVtcG9yYXJpZXMKICAgICAgICAuc3VibGlzdChfY3VycmVudFNjb3BlLnRlbXBzVXNlZCwgX2N1cnJlbnRTY29wZS50ZW1wc1VzZWQgKyBjb3VudCk7CiAgICBfY3VycmVudFNjb3BlLnRlbXBzVXNlZCArPSBjb3VudDsKICB9CgogIHZvaWQgX2ZyZWVUZW1wKFRyZWVOb2RlIG5vZGUsIHtpbnQgY291bnQ6IDF9KSB7CiAgICBhc3NlcnQoX2N1cnJlbnRTY29wZS50ZW1wc1VzZWQgPj0gY291bnQpOwogICAgX2N1cnJlbnRTY29wZS50ZW1wc1VzZWQgLT0gY291bnQ7CiAgICBhc3NlcnQobGlzdEVxdWFscygKICAgICAgICBsb2NhbHMuX3RlbXBzW25vZGVdLAogICAgICAgIF9jdXJyZW50RnJhbWUudGVtcG9yYXJpZXMuc3VibGlzdCgKICAgICAgICAgICAgX2N1cnJlbnRTY29wZS50ZW1wc1VzZWQsIF9jdXJyZW50U2NvcGUudGVtcHNVc2VkICsgY291bnQpKSk7CiAgfQoKICB2b2lkIF9hbGxvY2F0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIHtpbnQgcGFyYW1TbG90SW5kZXh9KSB7CiAgICBmaW5hbCBWYXJEZXNjIHYgPSBsb2NhbHMuX2dldFZhckRlc2ModmFyaWFibGUpOwoKICAgIGFzc2VydCghdi5pc0FsbG9jYXRlZCk7CiAgICBhc3NlcnQodi5zY29wZSA9PSBfY3VycmVudFNjb3BlKTsKCiAgICBpZiAodi5pc0NhcHR1cmVkKSB7CiAgICAgIHYuaW5kZXggPSBfY3VycmVudFNjb3BlLmNvbnRleHRPd25lci5jb250ZXh0VXNlZCsrOwogICAgICBpZiAodi5pbmRleCA+PSBjYXB0dXJlZFZhcmlhYmxlSW5kZXhMaW1pdCkgewogICAgICAgIHRocm93IG5ldyBMb2NhbFZhcmlhYmxlSW5kZXhPdmVyZmxvd0V4Y2VwdGlvbigpOwogICAgICB9CiAgICAgIHYub3JpZ2luYWxQYXJhbVNsb3RJbmRleCA9IHBhcmFtU2xvdEluZGV4OwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHBhcmFtU2xvdEluZGV4ICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KHBhcmFtU2xvdEluZGV4IDwgMCB8fAogICAgICAgICAgKF9jdXJyZW50RnJhbWUuaGFzT3B0aW9uYWxQYXJhbWV0ZXJzICYmCiAgICAgICAgICAgICAgcGFyYW1TbG90SW5kZXggPCBfY3VycmVudEZyYW1lLm51bVBhcmFtZXRlcnMpKTsKICAgICAgdi5pbmRleCA9IHBhcmFtU2xvdEluZGV4OwogICAgfSBlbHNlIHsKICAgICAgdi5pbmRleCA9IF9jdXJyZW50U2NvcGUubG9jYWxzVXNlZCsrOwogICAgICBpZiAodi5pbmRleCA+PSBsb2NhbFZhcmlhYmxlSW5kZXhMaW1pdCkgewogICAgICAgIHRocm93IG5ldyBMb2NhbFZhcmlhYmxlSW5kZXhPdmVyZmxvd0V4Y2VwdGlvbigpOwogICAgICB9CiAgICB9CiAgICBfdXBkYXRlRnJhbWVTaXplKCk7CiAgfQoKICB2b2lkIF9lbnN1cmVWYXJpYWJsZUFsbG9jYXRlZChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICBmaW5hbCBWYXJEZXNjIHYgPSBsb2NhbHMuX2dldFZhckRlc2ModmFyaWFibGUpOwogICAgICBpZiAoIXYuaXNBbGxvY2F0ZWQpIHsKICAgICAgICBfYWxsb2NhdGVWYXJpYWJsZSh2YXJpYWJsZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2FsbG9jYXRlUGFyYW1ldGVyKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgaW50IGkpIHsKICAgIGZpbmFsIG51bVBhcmFtZXRlcnMgPSBfY3VycmVudEZyYW1lLm51bVBhcmFtZXRlcnM7CiAgICBhc3NlcnQoMCA8PSBpICYmIGkgPCBudW1QYXJhbWV0ZXJzKTsKICAgIGludCBwYXJhbVNsb3RJbmRleCA9IF9jdXJyZW50RnJhbWUuaGFzT3B0aW9uYWxQYXJhbWV0ZXJzCiAgICAgICAgPyBpCiAgICAgICAgOiAta1BhcmFtRW5kU2xvdEZyb21GcCAtIG51bVBhcmFtZXRlcnMgKyBpOwogICAgX2FsbG9jYXRlVmFyaWFibGUobm9kZSwgcGFyYW1TbG90SW5kZXg6IHBhcmFtU2xvdEluZGV4KTsKICB9CgogIHZvaWQgX2FsbG9jYXRlUGFyYW1ldGVycyhUcmVlTm9kZSBub2RlLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIGZpbmFsIGJvb2wgaXNGYWN0b3J5ID0gbm9kZSBpcyBQcm9jZWR1cmUgJiYgbm9kZS5pc0ZhY3Rvcnk7CiAgICBmaW5hbCBib29sIGhhc1JlY2VpdmVyID0gX2hhc1JlY2VpdmVyUGFyYW1ldGVyKG5vZGUpOwogICAgZmluYWwgYm9vbCBoYXNDbG9zdXJlQXJnID0KICAgICAgICBub2RlIGlzIEZ1bmN0aW9uRGVjbGFyYXRpb24gfHwgbm9kZSBpcyBGdW5jdGlvbkV4cHJlc3Npb247CgogICAgX2N1cnJlbnRGcmFtZS5udW1QYXJhbWV0ZXJzID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsKICAgICAgICBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoICsKICAgICAgICAoaXNGYWN0b3J5ID8gMSA6IDApICsKICAgICAgICAoaGFzUmVjZWl2ZXIgPyAxIDogMCkgKwogICAgICAgIChoYXNDbG9zdXJlQXJnID8gMSA6IDApOwoKICAgIF9jdXJyZW50RnJhbWUuaGFzT3B0aW9uYWxQYXJhbWV0ZXJzID0gZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8CiAgICAgICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCB8fAogICAgICAgIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5OwoKICAgIF9jdXJyZW50RnJhbWUuaGFzQ2FwdHVyZWRQYXJhbWV0ZXJzID0KICAgICAgICAoaXNGYWN0b3J5ICYmIGxvY2Fscy5pc0NhcHR1cmVkKF9jdXJyZW50RnJhbWUuZmFjdG9yeVR5cGVBcmdzVmFyKSkgfHwKICAgICAgICAgICAgKGhhc1JlY2VpdmVyICYmIF9jdXJyZW50RnJhbWUuY2FwdHVyZWRSZWNlaXZlclZhciAhPSBudWxsKSB8fAogICAgICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5hbnkobG9jYWxzLmlzQ2FwdHVyZWQpIHx8CiAgICAgICAgICAgIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5hbnkobG9jYWxzLmlzQ2FwdHVyZWQpOwoKICAgIGludCBjb3VudCA9IDA7CiAgICBpZiAoaXNGYWN0b3J5KSB7CiAgICAgIF9hbGxvY2F0ZVBhcmFtZXRlcihfY3VycmVudEZyYW1lLmZhY3RvcnlUeXBlQXJnc1ZhciwgY291bnQrKyk7CiAgICB9CiAgICBpZiAoaGFzUmVjZWl2ZXIpIHsKICAgICAgYXNzZXJ0KCFsb2NhbHMuaXNDYXB0dXJlZChfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyKSk7CiAgICAgIF9hbGxvY2F0ZVBhcmFtZXRlcihfY3VycmVudEZyYW1lLnJlY2VpdmVyVmFyLCBjb3VudCsrKTsKCiAgICAgIGlmIChfY3VycmVudEZyYW1lLmNhcHR1cmVkUmVjZWl2ZXJWYXIgIT0gbnVsbCkgewogICAgICAgIF9hbGxvY2F0ZVZhcmlhYmxlKF9jdXJyZW50RnJhbWUuY2FwdHVyZWRSZWNlaXZlclZhcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChoYXNDbG9zdXJlQXJnKSB7CiAgICAgIGFzc2VydCghbG9jYWxzLmlzQ2FwdHVyZWQoX2N1cnJlbnRGcmFtZS5jbG9zdXJlVmFyKSk7CiAgICAgIF9hbGxvY2F0ZVBhcmFtZXRlcihfY3VycmVudEZyYW1lLmNsb3N1cmVWYXIsIGNvdW50KyspOwogICAgfQogICAgZm9yICh2YXIgcGFyYW0gaW4gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgX2FsbG9jYXRlUGFyYW1ldGVyKHBhcmFtLCBjb3VudCsrKTsKICAgIH0KICAgIGZvciAodmFyIHBhcmFtIGluIF9jdXJyZW50RnJhbWUuc29ydGVkTmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIF9hbGxvY2F0ZVBhcmFtZXRlcihwYXJhbSwgY291bnQrKyk7CiAgICB9CiAgICBhc3NlcnQoY291bnQgPT0gX2N1cnJlbnRGcmFtZS5udW1QYXJhbWV0ZXJzKTsKCiAgICBpZiAoX2N1cnJlbnRGcmFtZS5oYXNPcHRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgX2N1cnJlbnRTY29wZS5sb2NhbHNVc2VkID0gX2N1cnJlbnRGcmFtZS5udW1QYXJhbWV0ZXJzOwogICAgICBfdXBkYXRlRnJhbWVTaXplKCk7CiAgICB9CiAgfQoKICB2b2lkIF9hbGxvY2F0ZVNwZWNpYWxWYXJpYWJsZXMoKSB7CiAgICBfZW5zdXJlVmFyaWFibGVBbGxvY2F0ZWQoX2N1cnJlbnRGcmFtZS5mdW5jdGlvblR5cGVBcmdzVmFyKTsKICAgIF9lbnN1cmVWYXJpYWJsZUFsbG9jYXRlZChfY3VycmVudEZyYW1lLmNvbnRleHRWYXIpOwogICAgX2Vuc3VyZVZhcmlhYmxlQWxsb2NhdGVkKF9jdXJyZW50RnJhbWUuc2NyYXRjaFZhcik7CiAgICBfZW5zdXJlVmFyaWFibGVBbGxvY2F0ZWQoX2N1cnJlbnRGcmFtZS5yZXR1cm5WYXIpOwogIH0KCiAgdm9pZCBfdmlzaXRGdW5jdGlvbihUcmVlTm9kZSBub2RlKSB7CiAgICBfZW50ZXJTY29wZShub2RlKTsKCiAgICBpZiAobm9kZSBpcyBGaWVsZCkgewogICAgICBpZiAoX2hhc1JlY2VpdmVyUGFyYW1ldGVyKG5vZGUpKSB7CiAgICAgICAgX2N1cnJlbnRGcmFtZS5udW1QYXJhbWV0ZXJzID0gMTsKICAgICAgICBfYWxsb2NhdGVQYXJhbWV0ZXIoX2N1cnJlbnRGcmFtZS5yZWNlaXZlclZhciwgMCk7CiAgICAgICAgaWYgKF9jdXJyZW50RnJhbWUuY2FwdHVyZWRSZWNlaXZlclZhciAhPSBudWxsKSB7CiAgICAgICAgICBfYWxsb2NhdGVWYXJpYWJsZShfY3VycmVudEZyYW1lLmNhcHR1cmVkUmVjZWl2ZXJWYXIpOwogICAgICAgIH0KICAgICAgfQogICAgICBfYWxsb2NhdGVTcGVjaWFsVmFyaWFibGVzKCk7CiAgICAgIG5vZGUuaW5pdGlhbGl6ZXI/LmFjY2VwdCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChub2RlIGlzIFByb2NlZHVyZSB8fAogICAgICAgICAgbm9kZSBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAgICAgbm9kZSBpcyBGdW5jdGlvbkRlY2xhcmF0aW9uIHx8CiAgICAgICAgICBub2RlIGlzIEZ1bmN0aW9uRXhwcmVzc2lvbik7CgogICAgICBmaW5hbCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSAobm9kZSBhcyBkeW5hbWljKS5mdW5jdGlvbjsKICAgICAgYXNzZXJ0KGZ1bmN0aW9uICE9IG51bGwpOwoKICAgICAgaWYgKF9jdXJyZW50RnJhbWUuZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jIHx8CiAgICAgICAgICBfY3VycmVudEZyYW1lLmRhcnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5TeW5jU3RhciB8fAogICAgICAgICAgX2N1cnJlbnRGcmFtZS5kYXJ0QXN5bmNNYXJrZXIgPT0gQXN5bmNNYXJrZXIuQXN5bmNTdGFyKSB7CiAgICAgICAgZmluYWwgYXdhaXRKdW1wVmFyID0KICAgICAgICAgICAgX2N1cnJlbnRGcmFtZS5nZXRTeW50aGV0aWNWYXIoQ29udGludWF0aW9uVmFyaWFibGVzLmF3YWl0SnVtcFZhcik7CiAgICAgICAgX2FsbG9jYXRlVmFyaWFibGUoYXdhaXRKdW1wVmFyKTsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIGxvY2Fscy5fZ2V0VmFyRGVzYyhhd2FpdEp1bXBWYXIpLmluZGV4ID09IGF3YWl0SnVtcFZhckNvbnRleHRJbmRleCk7CiAgICAgIH0KICAgICAgaWYgKF9jdXJyZW50RnJhbWUuZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jKSB7CiAgICAgICAgZmluYWwgYXN5bmNDb21wbGV0ZXIgPQogICAgICAgICAgICBfY3VycmVudEZyYW1lLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuYXN5bmNDb21wbGV0ZXIpOwogICAgICAgIF9hbGxvY2F0ZVZhcmlhYmxlKGFzeW5jQ29tcGxldGVyKTsKICAgICAgICBhc3NlcnQobG9jYWxzLl9nZXRWYXJEZXNjKGFzeW5jQ29tcGxldGVyKS5pbmRleCA9PQogICAgICAgICAgICBhc3luY0NvbXBsZXRlckNvbnRleHRJbmRleCk7CiAgICAgIH0KICAgICAgaWYgKF9jdXJyZW50RnJhbWUuZGFydEFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcikgewogICAgICAgIGZpbmFsIGNvbnRyb2xsZXIgPQogICAgICAgICAgICBfY3VycmVudEZyYW1lLmdldFN5bnRoZXRpY1ZhcihDb250aW51YXRpb25WYXJpYWJsZXMuY29udHJvbGxlcik7CiAgICAgICAgX2FsbG9jYXRlVmFyaWFibGUoY29udHJvbGxlcik7CiAgICAgICAgYXNzZXJ0KGxvY2Fscy5fZ2V0VmFyRGVzYyhjb250cm9sbGVyKS5pbmRleCA9PSBjb250cm9sbGVyQ29udGV4dEluZGV4KTsKICAgICAgfQogICAgICBfYWxsb2NhdGVQYXJhbWV0ZXJzKG5vZGUsIGZ1bmN0aW9uKTsKICAgICAgX2FsbG9jYXRlU3BlY2lhbFZhcmlhYmxlcygpOwoKICAgICAgaWYgKG5vZGUgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgICBmb3IgKHZhciBmaWVsZCBpbiBub2RlLmVuY2xvc2luZ0NsYXNzLmZpZWxkcykgewogICAgICAgICAgaWYgKCFmaWVsZC5pc1N0YXRpYyAmJiBmaWVsZC5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAgIGZpZWxkLmluaXRpYWxpemVyLmFjY2VwdCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmlzaXRMaXN0KG5vZGUuaW5pdGlhbGl6ZXJzLCB0aGlzKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24uYm9keT8uYWNjZXB0KHRoaXMpOwogICAgfQoKICAgIF9sZWF2ZVNjb3BlKCk7CiAgfQoKICB2b2lkIF92aXNpdChUcmVlTm9kZSBub2RlLCB7Ym9vbCBzY29wZTogZmFsc2UsIGludCB0ZW1wczogMH0pIHsKICAgIGlmIChzY29wZSkgewogICAgICBfZW50ZXJTY29wZShub2RlKTsKICAgIH0KICAgIGlmICh0ZW1wcyA+IDApIHsKICAgICAgX2FsbG9jYXRlVGVtcChub2RlLCBjb3VudDogdGVtcHMpOwogICAgfQoKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKCiAgICBpZiAodGVtcHMgPiAwKSB7CiAgICAgIF9mcmVlVGVtcChub2RlLCBjb3VudDogdGVtcHMpOwogICAgfQogICAgaWYgKHNjb3BlKSB7CiAgICAgIF9sZWF2ZVNjb3BlKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSB7CiAgICBfdmlzaXRGdW5jdGlvbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIF9hbGxvY2F0ZVZhcmlhYmxlKG5vZGUudmFyaWFibGUpOwogICAgX2FsbG9jYXRlVGVtcChub2RlKTsKICAgIF92aXNpdEZ1bmN0aW9uKG5vZGUpOwogICAgX2ZyZWVUZW1wKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIF9hbGxvY2F0ZVRlbXAobm9kZSk7CiAgICBfdmlzaXRGdW5jdGlvbihub2RlKTsKICAgIF9mcmVlVGVtcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLm5hbWUgPT0gQ29udGludWF0aW9uVmFyaWFibGVzLmF3YWl0SnVtcFZhcikgewogICAgICBhc3NlcnQobG9jYWxzLl9nZXRWYXJEZXNjKG5vZGUpLmluZGV4ID09IGF3YWl0SnVtcFZhckNvbnRleHRJbmRleCk7CiAgICB9IGVsc2UgaWYgKG5vZGUubmFtZSA9PSBDb250aW51YXRpb25WYXJpYWJsZXMuYXN5bmNDb21wbGV0ZXIpIHsKICAgICAgYXNzZXJ0KGxvY2Fscy5fZ2V0VmFyRGVzYyhub2RlKS5pbmRleCA9PSBhc3luY0NvbXBsZXRlckNvbnRleHRJbmRleCk7CiAgICB9IGVsc2UgaWYgKG5vZGUubmFtZSA9PSBDb250aW51YXRpb25WYXJpYWJsZXMuY29udHJvbGxlcikgewogICAgICBhc3NlcnQobG9jYWxzLl9nZXRWYXJEZXNjKG5vZGUpLmluZGV4ID09IGNvbnRyb2xsZXJDb250ZXh0SW5kZXgpOwogICAgfSBlbHNlIHsKICAgICAgX2FsbG9jYXRlVmFyaWFibGUobm9kZSk7CiAgICB9CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIF92aXNpdChub2RlLCBzY29wZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrRXhwcmVzc2lvbihCbG9ja0V4cHJlc3Npb24gbm9kZSkgewogICAgLy8gTm90IHVzaW5nIF92aXNpdCBhcyBCbG9jayBpbnNpZGUgQmxvY2tFeHByZXNzaW9uIGRvZXMgbm90IGhhdmUgYSBzY29wZS4KICAgIF9lbnRlclNjb3BlKG5vZGUpOwogICAgdmlzaXRMaXN0KG5vZGUuYm9keS5zdGF0ZW1lbnRzLCB0aGlzKTsKICAgIG5vZGUudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgX2xlYXZlU2NvcGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAoIWxvY2Fscy5vcHRpb25zLmVuYWJsZUFzc2VydHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3VwZXIudmlzaXRBc3NlcnRTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzc2VydEJsb2NrKEFzc2VydEJsb2NrIG5vZGUpIHsKICAgIGlmICghbG9jYWxzLm9wdGlvbnMuZW5hYmxlQXNzZXJ0cykgewogICAgICByZXR1cm47CiAgICB9CiAgICBfdmlzaXQobm9kZSwgc2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIF92aXNpdChub2RlLCBzY29wZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIF9hbGxvY2F0ZVRlbXAobm9kZSk7CiAgICBpZiAobG9jYWxzLl9jYXB0dXJlZEl0ZXJhdG9yVmFycyAhPSBudWxsKSB7CiAgICAgIF9lbnN1cmVWYXJpYWJsZUFsbG9jYXRlZChsb2NhbHMuX2NhcHR1cmVkSXRlcmF0b3JWYXJzW25vZGVdKTsKICAgIH0KCiAgICBub2RlLml0ZXJhYmxlLmFjY2VwdCh0aGlzKTsKCiAgICBfZW50ZXJTY29wZShub2RlKTsKICAgIG5vZGUudmFyaWFibGUuYWNjZXB0KHRoaXMpOwogICAgbm9kZS5ib2R5LmFjY2VwdCh0aGlzKTsKICAgIF9sZWF2ZVNjb3BlKCk7CgogICAgX2ZyZWVUZW1wKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICBfdmlzaXQobm9kZSwgc2NvcGU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIF92aXNpdChub2RlLCBzY29wZTogdHJ1ZSk7CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLSBBbGxvY2F0aW9uIG9mIHRlbXBvcmFyaWVzIC0tLS0tLS0tLS0tLS0tCgogIEBvdmVycmlkZQogIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF92aXNpdChub2RlLCB0ZW1wczogMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAxKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAxKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIF92aXNpdChub2RlLCB0ZW1wczogMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAxKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TG9naWNhbEV4cHJlc3Npb24oTG9naWNhbEV4cHJlc3Npb24gbm9kZSkgewogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAxKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGludCBudW1UZW1wcyA9IDA7CiAgICBpZiAoaXNVbmNoZWNrZWRDbG9zdXJlQ2FsbCgKICAgICAgICBub2RlLCBsb2NhbHMuc3RhdGljVHlwZUNvbnRleHQsIGxvY2Fscy5vcHRpb25zKSkgewogICAgICBudW1UZW1wcyA9IDE7CiAgICB9IGVsc2UgaWYgKGlzQ2FsbFRocm91Z2hHZXR0ZXIobm9kZS5pbnRlcmZhY2VUYXJnZXQpKSB7CiAgICAgIGZpbmFsIGFyZ3MgPSBub2RlLmFyZ3VtZW50czsKICAgICAgbnVtVGVtcHMgPSAxICsgYXJncy5wb3NpdGlvbmFsLmxlbmd0aCArIGFyZ3MubmFtZWQubGVuZ3RoOwogICAgfSBlbHNlIGlmIChsb2NhbHMuZGlyZWN0Q2FsbE1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgZmluYWwgZGlyZWN0Q2FsbCA9IGxvY2Fscy5kaXJlY3RDYWxsTWV0YWRhdGFbbm9kZV07CiAgICAgIGlmIChkaXJlY3RDYWxsICE9IG51bGwgJiYgZGlyZWN0Q2FsbC5jaGVja1JlY2VpdmVyRm9yTnVsbCkgewogICAgICAgIG51bVRlbXBzID0gMTsKICAgICAgfQogICAgfQogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiBudW1UZW1wcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIF92aXNpdChub2RlLCB0ZW1wczogMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGludCBudW1UZW1wcyA9IDA7CiAgICBpZiAobG9jYWxzLmRpcmVjdENhbGxNZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIGRpcmVjdENhbGwgPSBsb2NhbHMuZGlyZWN0Q2FsbE1ldGFkYXRhW25vZGVdOwogICAgICBpZiAoZGlyZWN0Q2FsbCAhPSBudWxsICYmIGRpcmVjdENhbGwuY2hlY2tSZWNlaXZlckZvck51bGwpIHsKICAgICAgICBudW1UZW1wcyA9IDE7CiAgICAgIH0KICAgIH0KICAgIF92aXNpdChub2RlLCB0ZW1wczogbnVtVGVtcHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBfdmlzaXQobm9kZSwgdGVtcHM6IDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIF92aXNpdChub2RlLCB0ZW1wczogMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBfdmlzaXQobm9kZSwgdGVtcHM6IDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgbm9kZSkgewogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAxKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBfdmlzaXQobm9kZSwgdGVtcHM6IDEpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICBfdmlzaXQobm9kZSwgdGVtcHM6IG5vZGUudmFyaWFibGUuaXNMYXRlID8gMSA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICBmaW5hbCB2ID0gbm9kZS52YXJpYWJsZTsKICAgIGZpbmFsIGJvb2wgbmVlZHNUZW1wID0gbG9jYWxzLmlzQ2FwdHVyZWQodikgfHwgdi5pc0xhdGUgJiYgdi5pc0ZpbmFsOwogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiBuZWVkc1RlbXAgPyAxIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAxKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgewogICAgX3Zpc2l0KG5vZGUsIHRlbXBzOiAyKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpIHsKICAgIF92aXNpdChub2RlLCB0ZW1wczogMik7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICBfdmlzaXQobm9kZSwgdGVtcHM6IDMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXROdWxsQ2hlY2soTnVsbENoZWNrIG5vZGUpIHsKICAgIF92aXNpdChub2RlLCB0ZW1wczogMSk7CiAgfQp9CgpjbGFzcyBMb2NhbFZhcmlhYmxlSW5kZXhPdmVyZmxvd0V4Y2VwdGlvbgogICAgZXh0ZW5kcyBCeXRlY29kZUxpbWl0RXhjZWVkZWRFeGNlcHRpb24ge30KhXcATk48ASABIgEiOiAvLAETLD8BRigqJgEXLjkjQD0+QiEtPgEXFwE3GUIBRCUmNwZFBAEzKAE6JQE8JAFBNkkBPCAZSAYdBAE7PTcBIStTATslGiEEATYlGh4EAUUZUAFFGVAB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YXNzIE51bGxhYmlsaXR5RGV0ZWN0b3IgewogIGZpbmFsIF9Jc051bGxhYmxlVmlzaXRvciBfaXNOdWxsYWJsZVZpc2l0b3I7CgogIE51bGxhYmlsaXR5RGV0ZWN0b3IoUmVjb2duaXplZE1ldGhvZHMgcmVjb2duaXplZE1ldGhvZHMpCiAgICAgIDogX2lzTnVsbGFibGVWaXNpdG9yID0gbmV3IF9Jc051bGxhYmxlVmlzaXRvcihyZWNvZ25pemVkTWV0aG9kcyk7CgogIGJvb2wgaXNOdWxsYWJsZShFeHByZXNzaW9uIGV4cHIpID0+IGV4cHIuYWNjZXB0KF9pc051bGxhYmxlVmlzaXRvcik7Cn0KCmNsYXNzIF9Jc051bGxhYmxlVmlzaXRvciBleHRlbmRzIEV4cHJlc3Npb25WaXNpdG9yPGJvb2w+IHsKICBmaW5hbCBSZWNvZ25pemVkTWV0aG9kcyByZWNvZ25pemVkTWV0aG9kczsKCiAgX0lzTnVsbGFibGVWaXNpdG9yKHRoaXMucmVjb2duaXplZE1ldGhvZHMpOwoKICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpID0+IHRydWU7CgogIC8vIEFsbCBiYXNpYyBsaXRlcmFscyBleGNlcHQgTnVsbExpdGVyYWwgYXJlIG5vbi1udWxsYWJsZS4KICBAb3ZlcnJpZGUKICBib29sIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgZmluYWwgdiA9IG5vZGUudmFyaWFibGU7CiAgICBpZiAoKHYuaXNDb25zdCB8fCB2LmlzRmluYWwpICYmIHYuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICByZXR1cm4gdi5pbml0aWFsaXplci5hY2NlcHQodGhpcyk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSA9PiBub2RlLnZhbHVlLmFjY2VwdCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBPcGNvZGUgb3Bjb2RlID0gcmVjb2duaXplZE1ldGhvZHMuc3BlY2lhbGl6ZWRCeXRlY29kZUZvcihub2RlKTsKICAgIGlmIChvcGNvZGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gIV9ub25OdWxsYWJsZUJ5dGVjb2RlSW5zdHJ1Y3Rpb25zLmNvbnRhaW5zKG9wY29kZSk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Tm90KE5vdCBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSA9PgogICAgICBub2RlLnRoZW4uYWNjZXB0KHRoaXMpIHx8IG5vZGUub3RoZXJ3aXNlLmFjY2VwdCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpID0+IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIG5vZGUuY29uc3RhbnQgaXMgTnVsbENvbnN0YW50OwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0TGV0KExldCBub2RlKSA9PiBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUpID0+IGZhbHNlOwp9CgpmaW5hbCBfbm9uTnVsbGFibGVCeXRlY29kZUluc3RydWN0aW9ucyA9IG5ldyBTZXQ8T3Bjb2RlPi5mcm9tKFsKICBPcGNvZGUua0Jvb2xlYW5OZWdhdGVUT1MsCiAgT3Bjb2RlLmtFcXVhbHNOdWxsLAogIE9wY29kZS5rTmVnYXRlSW50LAogIE9wY29kZS5rQWRkSW50LAogIE9wY29kZS5rU3ViSW50LAogIE9wY29kZS5rTXVsSW50LAogIE9wY29kZS5rVHJ1bmNEaXZJbnQsCiAgT3Bjb2RlLmtNb2RJbnQsCiAgT3Bjb2RlLmtCaXRBbmRJbnQsCiAgT3Bjb2RlLmtCaXRPckludCwKICBPcGNvZGUua0JpdFhvckludCwKICBPcGNvZGUua1NobEludCwKICBPcGNvZGUua1NockludCwKICBPcGNvZGUua0NvbXBhcmVJbnRFcSwKICBPcGNvZGUua0NvbXBhcmVJbnRHdCwKICBPcGNvZGUua0NvbXBhcmVJbnRMdCwKICBPcGNvZGUua0NvbXBhcmVJbnRHZSwKICBPcGNvZGUua0NvbXBhcmVJbnRMZSwKICBPcGNvZGUua05lZ2F0ZURvdWJsZSwKICBPcGNvZGUua0FkZERvdWJsZSwKICBPcGNvZGUua1N1YkRvdWJsZSwKICBPcGNvZGUua011bERvdWJsZSwKICBPcGNvZGUua0RpdkRvdWJsZSwKICBPcGNvZGUua0NvbXBhcmVEb3VibGVFcSwKICBPcGNvZGUua0NvbXBhcmVEb3VibGVHdCwKICBPcGNvZGUua0NvbXBhcmVEb3VibGVMdCwKICBPcGNvZGUua0NvbXBhcmVEb3VibGVHZSwKICBPcGNvZGUua0NvbXBhcmVEb3VibGVMZSwKXSk7CoCQAE5OPAEqASITOQEcLwE7SAFHAgE7LQEuAQwzAQwzAT0MOAEMLB09KQYRBAEMRgEMNkoaQQYRBAEMSAEMJAEMQAEMQT0BDEQBDDYBDEoBDDgBDDQBDDoBDCwBDCgBDDQBDDIBDEIBDDslAQw1AQw4AgFAHBYVEhISFxIVFBUSEhgYGBgYGBUVFRUbGxsbGwQBLXBhY2thZ2U6dm0vYnl0ZWNvZGUvbnVsbGFiaWxpdHlfZGV0ZWN0b3IuZGFydFFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvb2JqZWN0X3RhYmxlLmRhcnTAAP+RLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0uYnl0ZWNvZGUub2JqZWN0X3RhYmxlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgQnVmZmVyZWRXcml0ZXIsCiAgICAgICAgQnVmZmVyZWRSZWFkZXIsCiAgICAgICAgQnl0ZWNvZGVPYmplY3QsCiAgICAgICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcywKICAgICAgICBGb3J3YXJkUmVmZXJlbmNlLAogICAgICAgIE5hbWVkRW50cnlTdGF0aXN0aWNzLAogICAgICAgIGRvdWJsZVRvSW50Qml0cywKICAgICAgICBpbnRCaXRzVG9Eb3VibGUsCiAgICAgICAgT2JqZWN0UmVhZGVyLAogICAgICAgIE9iamVjdFdyaXRlciwKICAgICAgICBTdHJpbmdXcml0ZXI7CmltcG9ydCAnZ2VuZXJpY3MuZGFydCcKICAgIHNob3cgZ2V0SW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgaGFzSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50czsKaW1wb3J0ICdkZWNsYXJhdGlvbnMuZGFydCcgc2hvdyBTb3VyY2VGaWxlLCBUeXBlUGFyYW1ldGVyc0RlY2xhcmF0aW9uOwppbXBvcnQgJ3JlY3Vyc2l2ZV90eXBlc192YWxpZGF0b3IuZGFydCcgc2hvdyBSZWN1cnNpdmVUeXBlc1ZhbGlkYXRvcjsKCi8qCgpCeXRlY29kZSBvYmplY3QgdGFibGUgaXMgZW5jb2RlZCBpbiB0aGUgZm9sbG93aW5nIHdheQoodXNpbmcgbm90YXRpb24gZnJvbSBwa2cva2VybmVsL2JpbmFyeS5tZCk6Cgp0eXBlIE9iamVjdFRhYmxlIHsKICBVSW50IG51bUVudHJpZXMKCiAgLy8gVG90YWwgc2l6ZSBvZiDigJhvYmplY3Rz4oCZIGluIGJ5dGVzLgogIFVJbnQgb2JqZWN0c1NpemUKCiAgT2JqZWN0Q29udGVudHNbbnVtRW50cmllc10gb2JqZWN0cwoKICAvLyBPZmZzZXRzIHJlbGF0aXZlIHRvIOKAmG9iamVjdHPigJkuCiAgVUludFtudW1FbnRyaWVzXSBvYmplY3RPZmZzZXRzCn0KCgovLyBFaXRoZXIgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpbiBvYmplY3QgdGFibGUsIG9yIG9iamVjdCBjb250ZW50cwovLyB3cml0dGVuIGlubGluZSAoZGV0ZXJtaW5lZCBieSBiaXQgMCkuClBhY2tlZE9iamVjdCA9IE9iamVjdFJlZmVyZW5jZSB8IE9iamVjdENvbnRlbnRzCgp0eXBlIE9iamVjdFJlZmVyZW5jZSB7CiAgLy8gQml0IDAgKHJlZmVyZW5jZSBiaXQpOiAxCiAgLy8gQml0cyAxKzogaW5kZXggaW4gb2JqZWN0IHRhYmxlCiAgVUludCByZWZlcmVuY2UKfQoKdHlwZSBPYmplY3RDb250ZW50cyB7CiAgLy8gQml0IDAgKHJlZmVyZW5jZSBiaXQpOiAwCiAgLy8gQml0cyAxLTQ6IG9iamVjdCBraW5kCiAgLy8gQml0cyA1KyBvYmplY3QgZmxhZ3MKICBVSW50IGhlYWRlcgp9CgovLyBJbnZhbGlkL251bGwgb2JqZWN0IChhbHdheXMgcHJlc2VudCBhdCBpbmRleCAwKS4KdHlwZSBJbnZhbGlkT2JqZWN0IGV4dGVuZHMgT2JqZWN0Q29udGVudHMgewogIGtpbmQgPSAwOwp9Cgp0eXBlIExpYnJhcnkgZXh0ZW5kcyBPYmplY3RDb250ZW50cyB7CiAga2luZCA9IDE7CiAgUGFja2VkT2JqZWN0IGltcG9ydFVyaTsKfQoKdHlwZSBDbGFzcyBleHRlbmRzIE9iamVjdENvbnRlbnRzIHsKICBraW5kID0gMjsKICBQYWNrZWRPYmplY3QgbGlicmFyeTsKICAvLyBFbXB0eSBuYW1lIGlzIHVzZWQgZm9yIGFydGlmaWNpYWwgY2xhc3MgY29udGFpbmluZyB0b3AtbGV2ZWwKICAvLyBtZW1iZXJzIG9mIGEgbGlicmFyeS4KICBQYWNrZWRPYmplY3QgbmFtZTsKfQoKdHlwZSBNZW1iZXIgZXh0ZW5kcyBPYmplY3RDb250ZW50cyB7CiAga2luZCA9IDM7CiAgZmxhZ3MgPSAoaXNGaWVsZCwgaXNDb25zdHJ1Y3Rvcik7CiAgUGFja2VkT2JqZWN0IGNsYXNzOwogIFBhY2tlZE9iamVjdCBuYW1lOwp9Cgp0eXBlIENsb3N1cmUgZXh0ZW5kcyBPYmplY3RDb250ZW50cyB7CiAga2luZCA9IDQ7CiAgUGFja2VkT2JqZWN0IGVuY2xvc2luZ01lbWJlcjsKICBVSW50IGNsb3N1cmVJbmRleDsKfQoKdHlwZSBOYW1lIGV4dGVuZHMgT2JqZWN0Q29udGVudHMgewogIGtpbmQgPSA5OwoKICAvLyBJbnZhbGlkIGZvciBwdWJsaWMgbmFtZXMKICBQYWNrZWRPYmplY3QgbGlicmFyeTsKCiAgLy8gR2V0dGVycyBhcmUgcHJlZml4ZWQgd2l0aCAnZ2V0OicuCiAgLy8gU2V0dGVycyBhcmUgcHJlZml4ZWQgd2l0aCAnc2V0OicuCiAgUGFja2VkU3RyaW5nIHN0cmluZzsKfQoKLy8gVHlwZSBhcmd1bWVudHMgdmVjdG9yLgp0eXBlIFR5cGVBcmd1bWVudHMgZXh0ZW5kcyBPYmplY3RDb250ZW50cyB7CiAga2luZCA9IDEwOwogIExpc3Q8UGFja2VkT2JqZWN0PiBhcmdzOwp9CgphYnN0cmFjdCB0eXBlIENvbnN0T2JqZWN0IGV4dGVuZHMgT2JqZWN0Q29udGVudHMgewogIGtpbmQgPSAxMjsKICBmbGFncyA9IGNvbnN0YW50VGFnICg0IGJpdHMpCn0KCnR5cGUgQ29uc3RJbnN0YW5jZSBleHRlbmRzIENvbnN0T2JqZWN0IHsKICBraW5kID0gMTIKICBjb25zdGFudFRhZyAoZmxhZ3MpID0gMQogIFBhY2tlZE9iamVjdCB0eXBlOwogIExpc3Q8UGFpcjxQYWNrZWRPYmplY3QsIFBhY2tlZE9iamVjdD4+IGZpZWxkVmFsdWVzOwp9Cgp0eXBlIENvbnN0SW50IGV4dGVuZHMgQ29uc3RWYWx1ZSB7CiAga2luZCA9IDEyCiAgY29uc3RhbnRUYWcgKGZsYWdzKSA9IDIKICBTTEVCMTI4IHZhbHVlOwp9Cgp0eXBlIENvbnN0RG91YmxlIGV4dGVuZHMgQ29uc3RWYWx1ZSB7CiAga2luZCA9IDEyCiAgY29uc3RhbnRUYWcgKGZsYWdzKSA9IDMKICAvLyBkb3VibGUgYml0cyBhcmUgcmVpbnRlcnByZXRlZCBhcyA2NC1iaXQgaW50CiAgU0xFQjEyOCB2YWx1ZTsKfQoKdHlwZSBDb25zdExpc3QgZXh0ZW5kcyBDb25zdE9iamVjdCB7CiAga2luZCA9IDEyCiAgY29uc3RhbnRUYWcgKGZsYWdzKSA9IDQKICBQYWNrZWRPYmplY3QgZWxlbVR5cGU7CiAgTGlzdDxQYWNrZWRPYmplY3Q+IGVudHJpZXM7Cn0KCnR5cGUgQ29uc3RUZWFyT2ZmIGV4dGVuZHMgQ29uc3RPYmplY3QgewogIGtpbmQgPSAxMgogIGNvbnN0YW50VGFnIChmbGFncykgPSA1CiAgUGFja2VkT2JqZWN0IHRhcmdldDsKfQoKdHlwZSBDb25zdEJvb2wgZXh0ZW5kcyBDb25zdFZhbHVlIHsKICBraW5kID0gMTIKICBjb25zdGFudFRhZyA9IDYKICBCeXRlIGlzVHJ1ZTsKfQoKdHlwZSBDb25zdFN5bWJvbCBleHRlbmRzIENvbnN0T2JqZWN0IHsKICBraW5kID0gMTIKICBjb25zdGFudFRhZyAoZmxhZ3MpID0gNwogIFBhY2tlZE9iamVjdCBuYW1lOwp9Cgp0eXBlIENvbnN0VGVhck9mZkluc3RhbnRpYXRpb24gZXh0ZW5kcyBDb25zdE9iamVjdCB7CiAga2luZCA9IDEyCiAgY29uc3RhbnRUYWcgKGZsYWdzKSA9IDgKICBQYWNrZWRPYmplY3QgdGVhck9mZjsKICBQYWNrZWRPYmplY3QgdHlwZUFyZ3VtZW50czsKfQoKdHlwZSBBcmdEZXNjIGV4dGVuZHMgT2JqZWN0Q29udGVudHMgewogIGtpbmQgPSAxMzsKICBmbGFncyA9IChoYXNOYW1lZEFyZ3MsIGhhc1R5cGVBcmdzKQoKICBVSW50IG51bUFyZ3VtZW50cwoKIGlmIGhhc1R5cGVBcmdzCiAgIFVJbnQgbnVtVHlwZUFyZ3VtZW50cwoKIGlmIGhhc05hbWVkQXJncwogICBMaXN0PFBhY2tlZE9iamVjdD4gYXJnTmFtZXM7Cn0KCnR5cGUgU2NyaXB0IGV4dGVuZHMgT2JqZWN0Q29udGVudHMgewogIGtpbmQgPSAxNAogIGZsYWdzID0gKGhhc1NvdXJjZUZpbGUpCiAgUGFja2VkT2JqZWN0IHVyaQogIGlmIGhhc1NvdXJjZUZpbGUKICAgIFVJbnQgc291cmNlRmlsZU9mZnNldAp9CgphYnN0cmFjdCB0eXBlIFR5cGUgZXh0ZW5kcyBPYmplY3RDb250ZW50cyB7CiAga2luZCA9IDE1CiAgZmxhZ3MgPSB0eXBlVGFnICg0IGJpdHMpCn0KCnR5cGUgRHluYW1pY1R5cGUgZXh0ZW5kcyBUeXBlIHsKICBraW5kID0gMTUKICB0eXBlVGFnIChmbGFncykgPSAxCn0KCnR5cGUgVm9pZFR5cGUgZXh0ZW5kcyBUeXBlIHsKICBraW5kID0gMTUKICB0eXBlVGFnIChmbGFncykgPSAyCn0KCnR5cGUgTmV2ZXJUeXBlIGV4dGVuZHMgVHlwZSB7CiAga2luZCA9IDE1CiAgdHlwZVRhZyAoZmxhZ3MpID0gOQp9CgovLyBTaW1wbGVUeXBlIGNhbiBiZSB1c2VkIG9ubHkgZm9yIHR5cGVzIHdpdGhvdXQgaW5zdGFudGlhdG9yIHR5cGUgYXJndW1lbnRzLgp0eXBlIFNpbXBsZVR5cGUgZXh0ZW5kcyBUeXBlIHsKICBraW5kID0gMTUKICB0eXBlVGFnIChmbGFncykgPSAzCiAgUGFja2VkT2JqZWN0IGNsYXNzCn0KCnR5cGUgVHlwZVBhcmFtZXRlciBleHRlbmRzIFR5cGUgewogIGtpbmQgPSAxNQogIHR5cGVUYWcgKGZsYWdzKSA9IDQKICAvLyBDbGFzcywgTWVtYmVyIG9yIENsb3N1cmUgZGVjbGFyaW5nIHRoaXMgdHlwZSBwYXJhbWV0ZXIuCiAgLy8gTnVsbCAoSW52YWxpZCkgaWYgZGVjbGFyZWQgYnkgZnVuY3Rpb24gdHlwZS4KICBQYWNrZWRPYmplY3QgcGFyZW50CiAgVUludCBpbmRleEluUGFyZW50Cn0KCi8vIE5vbi1yZWN1cnNpdmUgZmluYWxpemVkIGdlbmVyaWMgdHlwZS4KdHlwZSBHZW5lcmljVHlwZSBleHRlbmRzIFR5cGUgewogIGtpbmQgPSAxNQogIHR5cGVUYWcgKGZsYWdzKSA9IDUKICBQYWNrZWRPYmplY3QgY2xhc3MKICAvLyBGbGF0dGVuZWQgdHlwZSBhcmd1bWVudHMgdmVjdG9yLgogIFBhY2tlZE9iamVjdCB0eXBlQXJncwp9CgovLyBSZWN1cnNpdmUgZmluYWxpemVkIGdlbmVyaWMgdHlwZS4KdHlwZSBSZWN1cnNpdmVHZW5lcmljVHlwZSBleHRlbmRzIFR5cGUgewogIGtpbmQgPSAxNQogIHR5cGVUYWcgKGZsYWdzKSA9IDYKICAvLyBUaGlzIGlkIGlzIHVzZWQgdG8gcmVmZXJlbmNlIHJlY3Vyc2l2ZSB0eXBlcyB1c2luZyBSZWN1cnNpdmVUeXBlUmVmLgogIC8vIFR5cGUgc2hvdWxkIGJlIGRlY2xhcmVkIHVzaW5nIFJlY3Vyc2l2ZUdlbmVyaWNUeXBlIGJlZm9yZSBpdCBjYW4gYmUgcmVmZXJlbmNlZC4KICAvLyBUaGUgcm9vdCB0eXBlIHNob3VsZCBoYXZlIHplcm8gcmVjdXJzaXZlSWQuCiAgVUludCByZWN1cnNpdmVJZAogIFBhY2tlZE9iamVjdCBjbGFzcwogIC8vIEZsYXR0ZW5lZCB0eXBlIGFyZ3VtZW50cyB2ZWN0b3IuCiAgUGFja2VkT2JqZWN0IHR5cGVBcmdzCn0KCnR5cGUgUmVjdXJzaXZlVHlwZVJlZiBleHRlbmRzIFR5cGUgewogIGtpbmQgPSAxNQogIHR5cGVUYWcgKGZsYWdzKSA9IDcKICBVSW50IHJlY3Vyc2l2ZUlkCn0KCnR5cGUgRnVuY3Rpb25UeXBlIGV4dGVuZHMgVHlwZSB7CiAga2luZCA9IDE1CiAgdHlwZVRhZyAoZmxhZ3MpID0gOAoKICBVSW50IGZ1bmN0aW9uVHlwZUZsYWdzKGhhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wdGlvbmFsTmFtZWRQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUeXBlUGFyYW1zKQoKICBpZiBoYXNUeXBlUGFyYW1zCiAgICBUeXBlUGFyYW1ldGVyc0RlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJzCgogIFVJbnQgbnVtUGFyYW1ldGVycwoKICBpZiBoYXNPcHRpb25hbFBvc2l0aW9uYWxQYXJhbXMgfHwgaGFzT3B0aW9uYWxOYW1lZFBhcmFtcwogICAgVUludCBudW1SZXF1aXJlZFBhcmFtZXRlcnMKCiAgVHlwZVtdIHBvc2l0aW9uYWxQYXJhbWV0ZXJzCiAgTmFtZUFuZFR5cGVbXSBuYW1lZFBhcmFtZXRlcnMKICBQYWNrZWRPYmplY3QgcmV0dXJuVHlwZQp9Cgp0eXBlIFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24gewogICBVSW50IG51bVR5cGVQYXJhbWV0ZXJzCiAgIFBhY2tlZE9iamVjdFtudW1UeXBlUGFyYW1ldGVyc10gdHlwZVBhcmFtZXRlck5hbWVzCiAgIFBhY2tlZE9iamVjdFtudW1UeXBlUGFyYW1ldGVyc10gdHlwZVBhcmFtZXRlckJvdW5kcwp9Cgp0eXBlIE5hbWVBbmRUeXBlIHsKICBQYWNrZWRPYmplY3QgbmFtZTsKICBQYWNrZWRPYmplY3QgdHlwZTsKfQoKKi8KCmVudW0gT2JqZWN0S2luZCB7CiAga0ludmFsaWQsCiAga0xpYnJhcnksCiAga0NsYXNzLAogIGtNZW1iZXIsCiAga0Nsb3N1cmUsCiAga1VudXNlZDEsCiAga1VudXNlZDIsCiAga1VudXNlZDMsCiAga1VudXNlZDQsCiAga05hbWUsCiAga1R5cGVBcmd1bWVudHMsCiAga1VudXNlZDUsCiAga0NvbnN0T2JqZWN0LAogIGtBcmdEZXNjLAogIGtTY3JpcHQsCiAga1R5cGUsCn0KCmVudW0gQ29uc3RUYWcgewogIGtJbnZhbGlkLAogIGtJbnN0YW5jZSwKICBrSW50LAogIGtEb3VibGUsCiAga0xpc3QsCiAga1RlYXJPZmYsCiAga0Jvb2wsCiAga1N5bWJvbCwKICBrVGVhck9mZkluc3RhbnRpYXRpb24sCiAga1N0cmluZywKfQoKZW51bSBUeXBlVGFnIHsKICBrSW52YWxpZCwKICBrRHluYW1pYywKICBrVm9pZCwKICBrU2ltcGxlVHlwZSwKICBrVHlwZVBhcmFtZXRlciwKICBrR2VuZXJpY1R5cGUsCiAga1JlY3Vyc2l2ZUdlbmVyaWNUeXBlLAogIGtSZWN1cnNpdmVUeXBlUmVmLAogIGtGdW5jdGlvblR5cGUsCiAga05ldmVyLAp9CgovLy8gTmFtZSBvZiBhcnRpZmljaWFsIGNsYXNzIGNvbnRhaW5pbmcgdG9wLWxldmVsIG1lbWJlcnMgb2YgYSBsaWJyYXJ5Lgpjb25zdCBTdHJpbmcgdG9wTGV2ZWxDbGFzc05hbWUgPSAnJzsKClN0cmluZyBvYmplY3RLaW5kVG9TdHJpbmcoT2JqZWN0S2luZCBraW5kKSA9PgogICAga2luZC50b1N0cmluZygpLnN1YnN0cmluZygnT2JqZWN0S2luZC5rJy5sZW5ndGgpOwoKLy8vIFJlcHJlc2VudHMgb2JqZWN0IChsaWJyYXJ5LCBjbGFzcywgbWVtYmVyLCBjbG9zdXJlLCB0eXBlIG9yIG5hbWUpIGluIHRoZQovLy8gb2JqZWN0IHRhYmxlLgphYnN0cmFjdCBjbGFzcyBPYmplY3RIYW5kbGUgZXh0ZW5kcyBCeXRlY29kZU9iamVjdCB7CiAgc3RhdGljIGNvbnN0IGludCByZWZlcmVuY2VCaXQgPSAxIDw8IDA7CiAgc3RhdGljIGNvbnN0IGludCBpbmRleFNoaWZ0ID0gMTsKICBzdGF0aWMgY29uc3QgaW50IGlubGluZU9iamVjdCA9IC0xOwoKICBzdGF0aWMgY29uc3QgaW50IGtpbmRTaGlmdCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBraW5kTWFzayA9IDB4MEY7CgogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ0JpdDAgPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnQml0MSA9IDEgPDwgNjsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdCaXQyID0gMSA8PCA3OwogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ0JpdDMgPSAxIDw8IDg7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnQml0NCA9IDEgPDwgOTsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdCaXQ1ID0gMSA8PCAxMDsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdzTWFzayA9CiAgICAgIGZsYWdCaXQwIHwgZmxhZ0JpdDEgfCBmbGFnQml0MiB8IGZsYWdCaXQzIHwgZmxhZ0JpdDQgfCBmbGFnQml0NTsKCiAgc3RhdGljIGludCBfbWFrZVJlZmVyZW5jZShpbnQgaW5kZXgpID0+IChpbmRleCA8PCBpbmRleFNoaWZ0KSB8IHJlZmVyZW5jZUJpdDsKCiAgc3RhdGljIGludCBfZ2V0SW5kZXhGcm9tUmVmZXJlbmNlKGludCByZWZlcmVuY2UpIHsKICAgIGFzc2VydCgocmVmZXJlbmNlICYgcmVmZXJlbmNlQml0KSAhPSAwKTsKICAgIHJldHVybiByZWZlcmVuY2UgPj4gaW5kZXhTaGlmdDsKICB9CgogIHN0YXRpYyBpbnQgX21ha2VIZWFkZXIoT2JqZWN0S2luZCBraW5kLCBpbnQgZmxhZ3MpIHsKICAgIGFzc2VydCgoa2luZC5pbmRleCAmIGtpbmRNYXNrKSA9PSBraW5kLmluZGV4KTsKICAgIGFzc2VydCgoZmxhZ3MgJiBmbGFnc01hc2spID09IGZsYWdzKTsKICAgIHJldHVybiAoa2luZC5pbmRleCA8PCBraW5kU2hpZnQpIHwgZmxhZ3M7CiAgfQoKICBzdGF0aWMgT2JqZWN0S2luZCBfZ2V0S2luZEZyb21IZWFkZXIoaW50IGhlYWRlcikgewogICAgYXNzZXJ0KChoZWFkZXIgJiByZWZlcmVuY2VCaXQpID09IDApOwogICAgcmV0dXJuIE9iamVjdEtpbmQudmFsdWVzWyhoZWFkZXIgPj4ga2luZFNoaWZ0KSAmIGtpbmRNYXNrXTsKICB9CgogIHN0YXRpYyBpbnQgX2dldEZsYWdzRnJvbUhlYWRlcihpbnQgaGVhZGVyKSB7CiAgICBhc3NlcnQoKGhlYWRlciAmIHJlZmVyZW5jZUJpdCkgPT0gMCk7CiAgICByZXR1cm4gaGVhZGVyICYgZmxhZ3NNYXNrOwogIH0KCiAgaW50IF91c2VDb3VudCA9IDA7CiAgaW50IF9yZWZlcmVuY2U7CgogIE9iamVjdEhhbmRsZSgpOwoKICBPYmplY3RLaW5kIGdldCBraW5kOwoKICBpbnQgZ2V0IGZsYWdzID0+IDA7CiAgc2V0IGZsYWdzKGludCB2YWx1ZSkge30KCiAgYm9vbCBnZXQgaXNDYWNoZWFibGUgPT4gdHJ1ZTsKICBib29sIGdldCBzaG91bGRCZUluY2x1ZGVkSW50b0luZGV4VGFibGUgPT4KICAgICAgX3VzZUNvdW50ID49IE9iamVjdFRhYmxlLmluZGV4VGFibGVVc2VDb3VudFRocmVzaG9sZCAmJiBpc0NhY2hlYWJsZTsKCiAgZmFjdG9yeSBPYmplY3RIYW5kbGUuX2VtcHR5KE9iamVjdEtpbmQga2luZCwgaW50IGZsYWdzKSB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBPYmplY3RLaW5kLmtJbnZhbGlkOgogICAgICAgIHJldHVybiBuZXcgX0ludmFsaWRIYW5kbGUoKTsKICAgICAgY2FzZSBPYmplY3RLaW5kLmtMaWJyYXJ5OgogICAgICAgIHJldHVybiBuZXcgX0xpYnJhcnlIYW5kbGUuX2VtcHR5KCk7CiAgICAgIGNhc2UgT2JqZWN0S2luZC5rQ2xhc3M6CiAgICAgICAgcmV0dXJuIG5ldyBfQ2xhc3NIYW5kbGUuX2VtcHR5KCk7CiAgICAgIGNhc2UgT2JqZWN0S2luZC5rTWVtYmVyOgogICAgICAgIHJldHVybiBuZXcgX01lbWJlckhhbmRsZS5fZW1wdHkoKTsKICAgICAgY2FzZSBPYmplY3RLaW5kLmtDbG9zdXJlOgogICAgICAgIHJldHVybiBuZXcgX0Nsb3N1cmVIYW5kbGUuX2VtcHR5KCk7CiAgICAgIGNhc2UgT2JqZWN0S2luZC5rTmFtZToKICAgICAgICByZXR1cm4gKChmbGFncyAmIF9OYW1lSGFuZGxlLmZsYWdJc1B1YmxpYykgIT0gMCkKICAgICAgICAgICAgPyBuZXcgX1B1YmxpY05hbWVIYW5kbGUuX2VtcHR5KCkKICAgICAgICAgICAgOiBfUHJpdmF0ZU5hbWVIYW5kbGUuX2VtcHR5KCk7CiAgICAgIGNhc2UgT2JqZWN0S2luZC5rVHlwZUFyZ3VtZW50czoKICAgICAgICByZXR1cm4gbmV3IF9UeXBlQXJndW1lbnRzSGFuZGxlLl9lbXB0eSgpOwogICAgICBjYXNlIE9iamVjdEtpbmQua0NvbnN0T2JqZWN0OgogICAgICAgIHJldHVybiBuZXcgX0NvbnN0T2JqZWN0SGFuZGxlLl9lbXB0eSgpOwogICAgICBjYXNlIE9iamVjdEtpbmQua0FyZ0Rlc2M6CiAgICAgICAgcmV0dXJuIG5ldyBfQXJnRGVzY0hhbmRsZS5fZW1wdHkoKTsKICAgICAgY2FzZSBPYmplY3RLaW5kLmtTY3JpcHQ6CiAgICAgICAgcmV0dXJuIG5ldyBfU2NyaXB0SGFuZGxlLl9lbXB0eSgpOwogICAgICBjYXNlIE9iamVjdEtpbmQua1R5cGU6CiAgICAgICAgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkgPSBOdWxsYWJpbGl0eQogICAgICAgICAgICAudmFsdWVzWyhmbGFncyAmIF9UeXBlSGFuZGxlLm51bGxhYmlsaXR5TWFzaykgfi8gZmxhZ0JpdDRdOwogICAgICAgIHN3aXRjaCAoVHlwZVRhZy52YWx1ZXNbKGZsYWdzICYgX1R5cGVIYW5kbGUudGFnTWFzaykgfi8gZmxhZ0JpdDBdKSB7CiAgICAgICAgICBjYXNlIFR5cGVUYWcua0ludmFsaWQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBUeXBlVGFnLmtEeW5hbWljOgogICAgICAgICAgICByZXR1cm4gbmV3IF9EeW5hbWljVHlwZUhhbmRsZSgpOwogICAgICAgICAgY2FzZSBUeXBlVGFnLmtWb2lkOgogICAgICAgICAgICByZXR1cm4gbmV3IF9Wb2lkVHlwZUhhbmRsZSgpOwogICAgICAgICAgY2FzZSBUeXBlVGFnLmtOZXZlcjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBfTmV2ZXJUeXBlSGFuZGxlKG51bGxhYmlsaXR5KTsKICAgICAgICAgIGNhc2UgVHlwZVRhZy5rU2ltcGxlVHlwZToKICAgICAgICAgICAgcmV0dXJuIG5ldyBfU2ltcGxlVHlwZUhhbmRsZS5fZW1wdHkobnVsbGFiaWxpdHkpOwogICAgICAgICAgY2FzZSBUeXBlVGFnLmtUeXBlUGFyYW1ldGVyOgogICAgICAgICAgICByZXR1cm4gbmV3IF9UeXBlUGFyYW1ldGVySGFuZGxlLl9lbXB0eShudWxsYWJpbGl0eSk7CiAgICAgICAgICBjYXNlIFR5cGVUYWcua0dlbmVyaWNUeXBlOgogICAgICAgICAgICByZXR1cm4gbmV3IF9HZW5lcmljVHlwZUhhbmRsZS5fZW1wdHkobnVsbGFiaWxpdHkpOwogICAgICAgICAgY2FzZSBUeXBlVGFnLmtSZWN1cnNpdmVHZW5lcmljVHlwZToKICAgICAgICAgICAgcmV0dXJuIG5ldyBfUmVjdXJzaXZlR2VuZXJpY1R5cGVIYW5kbGUuX2VtcHR5KG51bGxhYmlsaXR5KTsKICAgICAgICAgIGNhc2UgVHlwZVRhZy5rUmVjdXJzaXZlVHlwZVJlZjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBfUmVjdXJzaXZlVHlwZVJlZkhhbmRsZS5fZW1wdHkobnVsbGFiaWxpdHkpOwogICAgICAgICAgY2FzZSBUeXBlVGFnLmtGdW5jdGlvblR5cGU6CiAgICAgICAgICAgIHJldHVybiBuZXcgX0Z1bmN0aW9uVHlwZUhhbmRsZS5fZW1wdHkobnVsbGFiaWxpdHkpOwogICAgICAgIH0KICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCB0eXBlIHRhZyAkZmxhZ3MnOwogICAgICBjYXNlIE9iamVjdEtpbmQua1VudXNlZDE6CiAgICAgIGNhc2UgT2JqZWN0S2luZC5rVW51c2VkMjoKICAgICAgY2FzZSBPYmplY3RLaW5kLmtVbnVzZWQzOgogICAgICBjYXNlIE9iamVjdEtpbmQua1VudXNlZDQ6CiAgICAgIGNhc2UgT2JqZWN0S2luZC5rVW51c2VkNToKICAgICAgICBicmVhazsKICAgIH0KICAgIHRocm93ICdVbmV4cGVjdGVkIG9iamVjdCBraW5kICRraW5kJzsKICB9CgogIHZvaWQgX3dyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgaW50IGhlYWRlciA9IF9tYWtlSGVhZGVyKGtpbmQsIGZsYWdzKTsKICAgIGFzc2VydCgoaGVhZGVyICYgcmVmZXJlbmNlQml0KSA9PSAwKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChoZWFkZXIpOwogICAgd3JpdGVDb250ZW50cyh3cml0ZXIpOwogIH0KCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcik7CgogIGZhY3RvcnkgT2JqZWN0SGFuZGxlLl9yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciwgaW50IGhlYWRlcikgewogICAgYXNzZXJ0KChoZWFkZXIgJiByZWZlcmVuY2VCaXQpID09IDApOwogICAgZmluYWwgT2JqZWN0S2luZCBraW5kID0gX2dldEtpbmRGcm9tSGVhZGVyKGhlYWRlcik7CiAgICBmaW5hbCBpbnQgZmxhZ3MgPSBfZ2V0RmxhZ3NGcm9tSGVhZGVyKGhlYWRlcik7CiAgICBmaW5hbCBvYmogPSBuZXcgT2JqZWN0SGFuZGxlLl9lbXB0eShraW5kLCBmbGFncyk7CiAgICBvYmouZmxhZ3MgPSBmbGFnczsKICAgIG9iai5yZWFkQ29udGVudHMocmVhZGVyKTsKICAgIHJldHVybiBvYmo7CiAgfQoKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpOwoKICB2b2lkIGFjY291bnRVc2VzRm9yT2JqZWN0Q29waWVzKGludCBudW1Db3BpZXMpIHt9CgogIHZvaWQgaW5kZXhTdHJpbmdzKFN0cmluZ1dyaXRlciBzdHJpbmdzKSB7fQp9CgpjbGFzcyBfSW52YWxpZEhhbmRsZSBleHRlbmRzIE9iamVjdEhhbmRsZSB7CiAgX0ludmFsaWRIYW5kbGUoKTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0S2luZCBnZXQga2luZCA9PiBPYmplY3RLaW5kLmtJbnZhbGlkOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29udGVudHMoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHt9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdJbnZhbGlkJzsKfQoKY2xhc3MgX0xpYnJhcnlIYW5kbGUgZXh0ZW5kcyBPYmplY3RIYW5kbGUgewogIF9Db25zdE9iamVjdEhhbmRsZSB1cmk7CgogIF9MaWJyYXJ5SGFuZGxlLl9lbXB0eSgpOwoKICBfTGlicmFyeUhhbmRsZSh0aGlzLnVyaSk7CgogIEBvdmVycmlkZQogIE9iamVjdEtpbmQgZ2V0IGtpbmQgPT4gT2JqZWN0S2luZC5rTGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIHVyaSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY291bnRVc2VzRm9yT2JqZWN0Q29waWVzKGludCBudW1Db3BpZXMpIHsKICAgIHVyaS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiB1cmkuaGFzaENvZGUgKyAxMTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gb3RoZXIgaXMgX0xpYnJhcnlIYW5kbGUgJiYgdGhpcy51cmkgPT0gb3RoZXIudXJpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB1cmkudmFsdWU7Cn0KCmNsYXNzIF9DbGFzc0hhbmRsZSBleHRlbmRzIE9iamVjdEhhbmRsZSB7CiAgX0xpYnJhcnlIYW5kbGUgbGlicmFyeTsKICBfTmFtZUhhbmRsZSBuYW1lOwoKICBfQ2xhc3NIYW5kbGUuX2VtcHR5KCk7CgogIF9DbGFzc0hhbmRsZSh0aGlzLmxpYnJhcnksIHRoaXMubmFtZSk7CgogIEBvdmVycmlkZQogIE9iamVjdEtpbmQgZ2V0IGtpbmQgPT4gT2JqZWN0S2luZC5rQ2xhc3M7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChsaWJyYXJ5KTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgbGlicmFyeSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBuYW1lID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjb3VudFVzZXNGb3JPYmplY3RDb3BpZXMoaW50IG51bUNvcGllcykgewogICAgbGlicmFyeS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgbmFtZS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29tYmluZUhhc2hlcyhsaWJyYXJ5Lmhhc2hDb2RlLCBuYW1lLmhhc2hDb2RlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX0NsYXNzSGFuZGxlICYmCiAgICAgIHRoaXMubGlicmFyeSA9PSBvdGhlci5saWJyYXJ5ICYmCiAgICAgIHRoaXMubmFtZSA9PSBvdGhlci5uYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICBuYW1lLm5hbWUgPT0gdG9wTGV2ZWxDbGFzc05hbWUgPyAnJGxpYnJhcnknIDogJyRsaWJyYXJ5Ojoke25hbWUubmFtZX0nOwp9CgpjbGFzcyBfTWVtYmVySGFuZGxlIGV4dGVuZHMgT2JqZWN0SGFuZGxlIHsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdJc0ZpZWxkID0gT2JqZWN0SGFuZGxlLmZsYWdCaXQwOwogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ0lzQ29uc3RydWN0b3IgPSBPYmplY3RIYW5kbGUuZmxhZ0JpdDE7CgogIGludCBfZmxhZ3MgPSAwOwogIF9DbGFzc0hhbmRsZSBwYXJlbnQ7CiAgX05hbWVIYW5kbGUgbmFtZTsKCiAgX01lbWJlckhhbmRsZS5fZW1wdHkoKTsKICBfTWVtYmVySGFuZGxlKHRoaXMucGFyZW50LCB0aGlzLm5hbWUsIGJvb2wgaXNGaWVsZCwgYm9vbCBpc0NvbnN0cnVjdG9yKSB7CiAgICBpZiAoaXNGaWVsZCkgewogICAgICBfZmxhZ3MgfD0gZmxhZ0lzRmllbGQ7CiAgICB9CiAgICBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICBfZmxhZ3MgfD0gZmxhZ0lzQ29uc3RydWN0b3I7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBPYmplY3RLaW5kIGdldCBraW5kID0+IE9iamVjdEtpbmQua01lbWJlcjsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBmbGFncyA9PiBfZmxhZ3M7CgogIEBvdmVycmlkZQogIHNldCBmbGFncyhpbnQgdmFsdWUpIHsKICAgIF9mbGFncyA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHBhcmVudCk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIHBhcmVudCA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBuYW1lID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjb3VudFVzZXNGb3JPYmplY3RDb3BpZXMoaW50IG51bUNvcGllcykgewogICAgcGFyZW50Ll91c2VDb3VudCArPSBudW1Db3BpZXM7CiAgICBuYW1lLl91c2VDb3VudCArPSBudW1Db3BpZXM7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9jb21iaW5lSGFzaGVzKHBhcmVudC5oYXNoQ29kZSwgbmFtZS5oYXNoQ29kZSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9NZW1iZXJIYW5kbGUgJiYKICAgICAgdGhpcy5wYXJlbnQgPT0gb3RoZXIucGFyZW50ICYmCiAgICAgIHRoaXMubmFtZSA9PSBvdGhlci5uYW1lICYmCiAgICAgIHRoaXMuZmxhZ3MgPT0gb3RoZXIuZmxhZ3M7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICckcGFyZW50Ojoke25hbWUubmFtZX0nICsKICAgICAgKGZsYWdzICYgZmxhZ0lzRmllbGQgIT0gMCA/ICcgKGZpZWxkKScgOiAnJykgKwogICAgICAoZmxhZ3MgJiBmbGFnSXNDb25zdHJ1Y3RvciAhPSAwID8gJyAoY29uc3RydWN0b3IpJyA6ICcnKTsKfQoKY2xhc3MgX0Nsb3N1cmVIYW5kbGUgZXh0ZW5kcyBPYmplY3RIYW5kbGUgewogIF9NZW1iZXJIYW5kbGUgZW5jbG9zaW5nTWVtYmVyOwogIGludCBjbG9zdXJlSW5kZXg7CgogIF9DbG9zdXJlSGFuZGxlLl9lbXB0eSgpOwoKICBfQ2xvc3VyZUhhbmRsZSh0aGlzLmVuY2xvc2luZ01lbWJlciwgdGhpcy5jbG9zdXJlSW5kZXgpIHsKICAgIGFzc2VydChjbG9zdXJlSW5kZXggPj0gMCk7CiAgfQoKICBAb3ZlcnJpZGUKICBPYmplY3RLaW5kIGdldCBraW5kID0+IE9iamVjdEtpbmQua0Nsb3N1cmU7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChlbmNsb3NpbmdNZW1iZXIpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGNsb3N1cmVJbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGVuY2xvc2luZ01lbWJlciA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICBjbG9zdXJlSW5kZXggPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NvdW50VXNlc0Zvck9iamVjdENvcGllcyhpbnQgbnVtQ29waWVzKSB7CiAgICBlbmNsb3NpbmdNZW1iZXIuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2NvbWJpbmVIYXNoZXMoZW5jbG9zaW5nTWVtYmVyLmhhc2hDb2RlLCBjbG9zdXJlSW5kZXgpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBfQ2xvc3VyZUhhbmRsZSAmJgogICAgICB0aGlzLmVuY2xvc2luZ01lbWJlciA9PSBvdGhlci5lbmNsb3NpbmdNZW1iZXIgJiYKICAgICAgdGhpcy5jbG9zdXJlSW5kZXggPT0gb3RoZXIuY2xvc3VyZUluZGV4OwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGVuY2xvc2luZ01lbWJlcjo6Q2xvc3VyZS8kY2xvc3VyZUluZGV4JzsKfQoKYWJzdHJhY3QgY2xhc3MgX1R5cGVIYW5kbGUgZXh0ZW5kcyBPYmplY3RIYW5kbGUgewogIHN0YXRpYyBjb25zdCBpbnQgdGFnTWFzayA9IE9iamVjdEhhbmRsZS5mbGFnQml0MCB8CiAgICAgIE9iamVjdEhhbmRsZS5mbGFnQml0MSB8CiAgICAgIE9iamVjdEhhbmRsZS5mbGFnQml0MiB8CiAgICAgIE9iamVjdEhhbmRsZS5mbGFnQml0MzsKICBzdGF0aWMgY29uc3QgaW50IG51bGxhYmlsaXR5TWFzayA9CiAgICAgIE9iamVjdEhhbmRsZS5mbGFnQml0NCB8IE9iamVjdEhhbmRsZS5mbGFnQml0NTsKCiAgZmluYWwgVHlwZVRhZyB0YWc7CiAgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHk7CgogIF9UeXBlSGFuZGxlKHRoaXMudGFnLCB0aGlzLm51bGxhYmlsaXR5KTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0S2luZCBnZXQga2luZCA9PiBPYmplY3RLaW5kLmtUeXBlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGZsYWdzID0+CiAgICAgICh0YWcuaW5kZXggKiBPYmplY3RIYW5kbGUuZmxhZ0JpdDApIHwKICAgICAgKG51bGxhYmlsaXR5LmluZGV4ICogT2JqZWN0SGFuZGxlLmZsYWdCaXQ0KTsKCiAgQG92ZXJyaWRlCiAgc2V0IGZsYWdzKGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9IGZsYWdzKSB7CiAgICAgIHRocm93ICdVbmFibGUgdG8gc2V0IGZsYWdzIGZvciBfVHlwZUhhbmRsZSAodGhleSBhcmUgb2NjdXBpZWQgYnkgdHlwZSB0YWcgYW5kIG5uYmQpJzsKICAgIH0KICB9Cn0KCmNsYXNzIF9EeW5hbWljVHlwZUhhbmRsZSBleHRlbmRzIF9UeXBlSGFuZGxlIHsKICBfRHluYW1pY1R5cGVIYW5kbGUoKSA6IHN1cGVyKFR5cGVUYWcua0R5bmFtaWMsIE51bGxhYmlsaXR5Lm51bGxhYmxlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikge30KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWFkQ29udGVudHMoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7fQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDIwMjk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IG90aGVyIGlzIF9EeW5hbWljVHlwZUhhbmRsZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2R5bmFtaWMnOwp9CgpjbGFzcyBfVm9pZFR5cGVIYW5kbGUgZXh0ZW5kcyBfVHlwZUhhbmRsZSB7CiAgX1ZvaWRUeXBlSGFuZGxlKCkgOiBzdXBlcihUeXBlVGFnLmtWb2lkLCBOdWxsYWJpbGl0eS5udWxsYWJsZSk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikge30KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiAyMDM5OwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBvdGhlciBpcyBfVm9pZFR5cGVIYW5kbGU7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICd2b2lkJzsKfQoKY2xhc3MgX05ldmVyVHlwZUhhbmRsZSBleHRlbmRzIF9UeXBlSGFuZGxlIHsKICBfTmV2ZXJUeXBlSGFuZGxlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KQogICAgICA6IHN1cGVyKFR5cGVUYWcua05ldmVyLCBudWxsYWJpbGl0eSk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikge30KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29tYmluZUhhc2hlcygyMDQ5LCBudWxsYWJpbGl0eS5pbmRleCk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9OZXZlclR5cGVIYW5kbGUgJiYgdGhpcy5udWxsYWJpbGl0eSA9PSBvdGhlci5udWxsYWJpbGl0eTsKCiAgQG92ZXJyaWRlCiAgLy8gVE9ETyhyZWdpcyk6IFByaW50IG51bGxhYmlsaXR5LCBvbmx5IGlmIG5uYmQgZXhwZXJpbWVudCBpcyBlbmFibGVkPwogIFN0cmluZyB0b1N0cmluZygpID0+ICdOZXZlcic7Cn0KCmNsYXNzIF9TaW1wbGVUeXBlSGFuZGxlIGV4dGVuZHMgX1R5cGVIYW5kbGUgewogIF9DbGFzc0hhbmRsZSBjbGFzc187CgogIF9TaW1wbGVUeXBlSGFuZGxlLl9lbXB0eShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkKICAgICAgOiBzdXBlcihUeXBlVGFnLmtTaW1wbGVUeXBlLCBudWxsYWJpbGl0eSk7CgogIF9TaW1wbGVUeXBlSGFuZGxlKHRoaXMuY2xhc3NfLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkKICAgICAgOiBzdXBlcihUeXBlVGFnLmtTaW1wbGVUeXBlLCBudWxsYWJpbGl0eSk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChjbGFzc18pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWFkQ29udGVudHMoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBjbGFzc18gPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NvdW50VXNlc0Zvck9iamVjdENvcGllcyhpbnQgbnVtQ29waWVzKSB7CiAgICBpZiAoY2xhc3NfICE9IG51bGwpIHsKICAgICAgY2xhc3NfLl91c2VDb3VudCArPSBudW1Db3BpZXM7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9jb21iaW5lSGFzaGVzKGNsYXNzXy5oYXNoQ29kZSwgbnVsbGFiaWxpdHkuaW5kZXgpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBvdGhlciBpcyBfU2ltcGxlVHlwZUhhbmRsZSAmJgogICAgICB0aGlzLmNsYXNzXyA9PSBvdGhlci5jbGFzc18gJiYKICAgICAgdGhpcy5udWxsYWJpbGl0eSA9PSBvdGhlci5udWxsYWJpbGl0eTsKCiAgQG92ZXJyaWRlCiAgLy8gVE9ETyhyZWdpcyk6IFByaW50IG51bGxhYmlsaXR5LCBvbmx5IGlmIG5uYmQgZXhwZXJpbWVudCBpcyBlbmFibGVkPwogIFN0cmluZyB0b1N0cmluZygpID0+ICckY2xhc3NfJzsKfQoKY2xhc3MgX1R5cGVQYXJhbWV0ZXJIYW5kbGUgZXh0ZW5kcyBfVHlwZUhhbmRsZSB7CiAgT2JqZWN0SGFuZGxlIHBhcmVudDsKICBpbnQgaW5kZXhJblBhcmVudDsKCiAgX1R5cGVQYXJhbWV0ZXJIYW5kbGUuX2VtcHR5KE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KQogICAgICA6IHN1cGVyKFR5cGVUYWcua1R5cGVQYXJhbWV0ZXIsIG51bGxhYmlsaXR5KTsKCiAgX1R5cGVQYXJhbWV0ZXJIYW5kbGUodGhpcy5wYXJlbnQsIHRoaXMuaW5kZXhJblBhcmVudCwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpCiAgICAgIDogc3VwZXIoVHlwZVRhZy5rVHlwZVBhcmFtZXRlciwgbnVsbGFiaWxpdHkpIHsKICAgIGFzc2VydChwYXJlbnQgaXMgX0NsYXNzSGFuZGxlIHx8CiAgICAgICAgcGFyZW50IGlzIF9NZW1iZXJIYW5kbGUgfHwKICAgICAgICBwYXJlbnQgaXMgX0Nsb3N1cmVIYW5kbGUgfHwKICAgICAgICBwYXJlbnQgPT0gbnVsbCk7CiAgICBhc3NlcnQoaW5kZXhJblBhcmVudCA+PSAwKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2FjaGVhYmxlID0+IChwYXJlbnQgIT0gbnVsbCk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChwYXJlbnQpOwogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGluZGV4SW5QYXJlbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWFkQ29udGVudHMoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBwYXJlbnQgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgaW5kZXhJblBhcmVudCA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY291bnRVc2VzRm9yT2JqZWN0Q29waWVzKGludCBudW1Db3BpZXMpIHsKICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICBwYXJlbnQuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2NvbWJpbmVIYXNoZXMoCiAgICAgIHBhcmVudC5oYXNoQ29kZSwgX2NvbWJpbmVIYXNoZXMoaW5kZXhJblBhcmVudCwgbnVsbGFiaWxpdHkuaW5kZXgpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX1R5cGVQYXJhbWV0ZXJIYW5kbGUgJiYKICAgICAgdGhpcy5wYXJlbnQgPT0gb3RoZXIucGFyZW50ICYmCiAgICAgIHRoaXMuaW5kZXhJblBhcmVudCA9PSBvdGhlci5pbmRleEluUGFyZW50ICYmCiAgICAgIHRoaXMubnVsbGFiaWxpdHkgPT0gb3RoZXIubnVsbGFiaWxpdHk7CgogIEBvdmVycmlkZQogIC8vIFRPRE8ocmVnaXMpOiBQcmludCBudWxsYWJpbGl0eSwgb25seSBpZiBubmJkIGV4cGVyaW1lbnQgaXMgZW5hYmxlZD8KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJHBhcmVudDo6VHlwZVBhcmFtLyRpbmRleEluUGFyZW50JzsKfQoKY2xhc3MgX0dlbmVyaWNUeXBlSGFuZGxlIGV4dGVuZHMgX1R5cGVIYW5kbGUgewogIF9DbGFzc0hhbmRsZSBjbGFzc187CiAgX1R5cGVBcmd1bWVudHNIYW5kbGUgdHlwZUFyZ3M7CgogIF9HZW5lcmljVHlwZUhhbmRsZS5fZW1wdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpCiAgICAgIDogc3VwZXIoVHlwZVRhZy5rR2VuZXJpY1R5cGUsIG51bGxhYmlsaXR5KTsKCiAgX0dlbmVyaWNUeXBlSGFuZGxlKHRoaXMuY2xhc3NfLCB0aGlzLnR5cGVBcmdzLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkKICAgICAgOiBzdXBlcihUeXBlVGFnLmtHZW5lcmljVHlwZSwgbnVsbGFiaWxpdHkpOwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29udGVudHMoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QoY2xhc3NfKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdCh0eXBlQXJncyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGNsYXNzXyA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICB0eXBlQXJncyA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY291bnRVc2VzRm9yT2JqZWN0Q29waWVzKGludCBudW1Db3BpZXMpIHsKICAgIGNsYXNzXy5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgaWYgKHR5cGVBcmdzICE9IG51bGwpIHsKICAgICAgdHlwZUFyZ3MuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2NvbWJpbmVIYXNoZXMoCiAgICAgIGNsYXNzXy5oYXNoQ29kZSwgX2NvbWJpbmVIYXNoZXModHlwZUFyZ3MuaGFzaENvZGUsIG51bGxhYmlsaXR5LmluZGV4KSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9HZW5lcmljVHlwZUhhbmRsZSAmJgogICAgICB0aGlzLmNsYXNzXyA9PSBvdGhlci5jbGFzc18gJiYKICAgICAgdGhpcy50eXBlQXJncyA9PSBvdGhlci50eXBlQXJncyAmJgogICAgICB0aGlzLm51bGxhYmlsaXR5ID09IG90aGVyLm51bGxhYmlsaXR5OwoKICBAb3ZlcnJpZGUKICAvLyBUT0RPKHJlZ2lzKTogUHJpbnQgbnVsbGFiaWxpdHksIG9ubHkgaWYgbm5iZCBleHBlcmltZW50IGlzIGVuYWJsZWQ/CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRjbGFzc18gJHR5cGVBcmdzJzsKfQoKY2xhc3MgX1JlY3Vyc2l2ZUdlbmVyaWNUeXBlSGFuZGxlIGV4dGVuZHMgX1R5cGVIYW5kbGUgewogIGludCBpZDsKICBfQ2xhc3NIYW5kbGUgY2xhc3NfOwogIF9UeXBlQXJndW1lbnRzSGFuZGxlIHR5cGVBcmdzOwoKICBfUmVjdXJzaXZlR2VuZXJpY1R5cGVIYW5kbGUuX2VtcHR5KE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KQogICAgICA6IHN1cGVyKFR5cGVUYWcua1JlY3Vyc2l2ZUdlbmVyaWNUeXBlLCBudWxsYWJpbGl0eSk7CgogIF9SZWN1cnNpdmVHZW5lcmljVHlwZUhhbmRsZSgKICAgICAgdGhpcy5pZCwgdGhpcy5jbGFzc18sIHRoaXMudHlwZUFyZ3MsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KQogICAgICA6IHN1cGVyKFR5cGVUYWcua1JlY3Vyc2l2ZUdlbmVyaWNUeXBlLCBudWxsYWJpbGl0eSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2FjaGVhYmxlID0+IChpZCA9PSAwKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGlkKTsKICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdChjbGFzc18pOwogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHR5cGVBcmdzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgaWQgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgY2xhc3NfID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgIHR5cGVBcmdzID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjb3VudFVzZXNGb3JPYmplY3RDb3BpZXMoaW50IG51bUNvcGllcykgewogICAgY2xhc3NfLl91c2VDb3VudCArPSBudW1Db3BpZXM7CiAgICBpZiAodHlwZUFyZ3MgIT0gbnVsbCkgewogICAgICB0eXBlQXJncy5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29tYmluZUhhc2hlcygKICAgICAgY2xhc3NfLmhhc2hDb2RlLCBfY29tYmluZUhhc2hlcyh0eXBlQXJncy5oYXNoQ29kZSwgbnVsbGFiaWxpdHkuaW5kZXgpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX1JlY3Vyc2l2ZUdlbmVyaWNUeXBlSGFuZGxlICYmCiAgICAgIHRoaXMuY2xhc3NfID09IG90aGVyLmNsYXNzXyAmJgogICAgICB0aGlzLnR5cGVBcmdzID09IG90aGVyLnR5cGVBcmdzICYmCiAgICAgIHRoaXMubnVsbGFiaWxpdHkgPT0gb3RoZXIubnVsbGFiaWxpdHk7CgogIEBvdmVycmlkZQogIC8vIFRPRE8ocmVnaXMpOiBQcmludCBudWxsYWJpbGl0eSwgb25seSBpZiBubmJkIGV4cGVyaW1lbnQgaXMgZW5hYmxlZD8KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnKHJlY3Vyc2l2ZSAjJGlkKSAkY2xhc3NfICR0eXBlQXJncyc7Cn0KCmNsYXNzIF9SZWN1cnNpdmVUeXBlUmVmSGFuZGxlIGV4dGVuZHMgX1R5cGVIYW5kbGUgewogIGludCBpZDsKCiAgX1JlY3Vyc2l2ZVR5cGVSZWZIYW5kbGUuX2VtcHR5KE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KQogICAgICA6IHN1cGVyKFR5cGVUYWcua1JlY3Vyc2l2ZVR5cGVSZWYsIG51bGxhYmlsaXR5KTsKCiAgX1JlY3Vyc2l2ZVR5cGVSZWZIYW5kbGUodGhpcy5pZCkKICAgICAgOiBzdXBlcihUeXBlVGFnLmtSZWN1cnNpdmVUeXBlUmVmLCBOdWxsYWJpbGl0eS5sZWdhY3kpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NhY2hlYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGlkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgaWQgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBpZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX1JlY3Vyc2l2ZVR5cGVSZWZIYW5kbGUgJiYgdGhpcy5pZCA9PSBvdGhlci5pZDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ3JlY3Vyc2l2ZS1yZWYgIyRpZCc7Cn0KCmNsYXNzIE5hbWVBbmRUeXBlIHsKICBfTmFtZUhhbmRsZSBuYW1lOwogIF9UeXBlSGFuZGxlIHR5cGU7CgogIE5hbWVBbmRUeXBlKHRoaXMubmFtZSwgdGhpcy50eXBlKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29tYmluZUhhc2hlcyhuYW1lLmhhc2hDb2RlLCB0eXBlLmhhc2hDb2RlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgTmFtZUFuZFR5cGUgJiYKICAgICAgdGhpcy5uYW1lID09IG90aGVyLm5hbWUgJiYKICAgICAgdGhpcy50eXBlID09IG90aGVyLnR5cGU7CgogIEBvdmVycmlkZQogIC8vIFRPRE8ocmVnaXMpOiBQcmludCBudWxsYWJpbGl0eSwgYWx3YXlzIG9yIG9ubHkgaWYgbm5iZCBleHBlcmltZW50IGlzIGVuYWJsZWQ/CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR0eXBlICR7bmFtZS5uYW1lfSc7Cn0KCmNsYXNzIF9GdW5jdGlvblR5cGVIYW5kbGUgZXh0ZW5kcyBfVHlwZUhhbmRsZSB7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnSGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zID0gMSA8PCAwOwogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ0hhc09wdGlvbmFsTmFtZWRQYXJhbXMgPSAxIDw8IDE7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnSGFzVHlwZVBhcmFtcyA9IDEgPDwgMjsKCiAgaW50IGZ1bmN0aW9uVHlwZUZsYWdzID0gMDsKICBMaXN0PE5hbWVBbmRUeXBlPiB0eXBlUGFyYW1zOwogIGludCBudW1SZXF1aXJlZFBhcmFtczsKICBMaXN0PF9UeXBlSGFuZGxlPiBwb3NpdGlvbmFsUGFyYW1zOwogIExpc3Q8TmFtZUFuZFR5cGU+IG5hbWVkUGFyYW1zOwogIF9UeXBlSGFuZGxlIHJldHVyblR5cGU7CgogIF9GdW5jdGlvblR5cGVIYW5kbGUuX2VtcHR5KE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KQogICAgICA6IHN1cGVyKFR5cGVUYWcua0Z1bmN0aW9uVHlwZSwgbnVsbGFiaWxpdHkpOwoKICBfRnVuY3Rpb25UeXBlSGFuZGxlKAogICAgICB0aGlzLnR5cGVQYXJhbXMsCiAgICAgIHRoaXMubnVtUmVxdWlyZWRQYXJhbXMsCiAgICAgIHRoaXMucG9zaXRpb25hbFBhcmFtcywKICAgICAgdGhpcy5uYW1lZFBhcmFtcywKICAgICAgdGhpcy5yZXR1cm5UeXBlLAogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkKICAgICAgOiBzdXBlcihUeXBlVGFnLmtGdW5jdGlvblR5cGUsIG51bGxhYmlsaXR5KSB7CiAgICBhc3NlcnQobnVtUmVxdWlyZWRQYXJhbXMgPD0gcG9zaXRpb25hbFBhcmFtcy5sZW5ndGggKyBuYW1lZFBhcmFtcy5sZW5ndGgpOwogICAgaWYgKG51bVJlcXVpcmVkUGFyYW1zIDwgcG9zaXRpb25hbFBhcmFtcy5sZW5ndGgpIHsKICAgICAgYXNzZXJ0KG5hbWVkUGFyYW1zLmlzRW1wdHkpOwogICAgICBmdW5jdGlvblR5cGVGbGFncyB8PSBmbGFnSGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zOwogICAgfQogICAgaWYgKG5hbWVkUGFyYW1zLmlzTm90RW1wdHkpIHsKICAgICAgYXNzZXJ0KG51bVJlcXVpcmVkUGFyYW1zID09IHBvc2l0aW9uYWxQYXJhbXMubGVuZ3RoKTsKICAgICAgZnVuY3Rpb25UeXBlRmxhZ3MgfD0gZmxhZ0hhc09wdGlvbmFsTmFtZWRQYXJhbXM7CiAgICB9CiAgICBpZiAodHlwZVBhcmFtcy5pc05vdEVtcHR5KSB7CiAgICAgIGZ1bmN0aW9uVHlwZUZsYWdzIHw9IGZsYWdIYXNUeXBlUGFyYW1zOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGZ1bmN0aW9uVHlwZUZsYWdzKTsKICAgIGlmICgoZnVuY3Rpb25UeXBlRmxhZ3MgJiBmbGFnSGFzVHlwZVBhcmFtcykgIT0gMCkgewogICAgICBuZXcgVHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbih0eXBlUGFyYW1zKS53cml0ZSh3cml0ZXIpOwogICAgfQogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKHBvc2l0aW9uYWxQYXJhbXMubGVuZ3RoICsgbmFtZWRQYXJhbXMubGVuZ3RoKTsKICAgIGlmIChmdW5jdGlvblR5cGVGbGFncyAmCiAgICAgICAgICAgIChmbGFnSGFzT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1zIHwgZmxhZ0hhc09wdGlvbmFsTmFtZWRQYXJhbXMpICE9CiAgICAgICAgMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAobnVtUmVxdWlyZWRQYXJhbXMpOwogICAgfQogICAgZm9yICh2YXIgcGFyYW0gaW4gcG9zaXRpb25hbFBhcmFtcykgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QocGFyYW0pOwogICAgfQogICAgZm9yICh2YXIgcGFyYW0gaW4gbmFtZWRQYXJhbXMpIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHBhcmFtLm5hbWUpOwogICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QocGFyYW0udHlwZSk7CiAgICB9CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QocmV0dXJuVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGZ1bmN0aW9uVHlwZUZsYWdzID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIGlmICgoZnVuY3Rpb25UeXBlRmxhZ3MgJiBmbGFnSGFzVHlwZVBhcmFtcykgIT0gMCkgewogICAgICB0eXBlUGFyYW1zID0gbmV3IFR5cGVQYXJhbWV0ZXJzRGVjbGFyYXRpb24ucmVhZChyZWFkZXIpLnR5cGVQYXJhbXM7CiAgICB9IGVsc2UgewogICAgICB0eXBlUGFyYW1zID0gY29uc3QgPE5hbWVBbmRUeXBlPltdOwogICAgfQogICAgZmluYWwgaW50IG51bVBhcmFtcyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBudW1SZXF1aXJlZFBhcmFtcyA9IG51bVBhcmFtczsKICAgIGlmICgoZnVuY3Rpb25UeXBlRmxhZ3MgJgogICAgICAgICAgICAoZmxhZ0hhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtcyB8IGZsYWdIYXNPcHRpb25hbE5hbWVkUGFyYW1zKSkgIT0KICAgICAgICAwKSB7CiAgICAgIG51bVJlcXVpcmVkUGFyYW1zID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIH0KICAgIGZpbmFsIGJvb2wgaGFzTmFtZWRQYXJhbXMgPQogICAgICAgIChmdW5jdGlvblR5cGVGbGFncyAmIGZsYWdIYXNPcHRpb25hbE5hbWVkUGFyYW1zKSAhPSAwOwogICAgcG9zaXRpb25hbFBhcmFtcyA9IG5ldyBMaXN0PF9UeXBlSGFuZGxlPi5nZW5lcmF0ZSgKICAgICAgICBoYXNOYW1lZFBhcmFtcyA/IG51bVJlcXVpcmVkUGFyYW1zIDogbnVtUGFyYW1zLAogICAgICAgIChfKSA9PiByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpKTsKICAgIGlmIChoYXNOYW1lZFBhcmFtcykgewogICAgICBuYW1lZFBhcmFtcyA9IG5ldyBMaXN0PE5hbWVBbmRUeXBlPi5nZW5lcmF0ZSgKICAgICAgICAgIG51bVBhcmFtcyAtIG51bVJlcXVpcmVkUGFyYW1zLAogICAgICAgICAgKF8pID0+IG5ldyBOYW1lQW5kVHlwZSgKICAgICAgICAgICAgICByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpLCByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpKSk7CiAgICB9IGVsc2UgewogICAgICBuYW1lZFBhcmFtcyA9IGNvbnN0IDxOYW1lQW5kVHlwZT5bXTsKICAgIH0KICAgIHJldHVyblR5cGUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NvdW50VXNlc0Zvck9iamVjdENvcGllcyhpbnQgbnVtQ29waWVzKSB7CiAgICBwb3NpdGlvbmFsUGFyYW1zLmZvckVhY2goKHApIHsKICAgICAgcC5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgfSk7CiAgICBuYW1lZFBhcmFtcy5mb3JFYWNoKChwKSB7CiAgICAgIHAubmFtZS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICBwLnR5cGUuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDYWNoZWFibGUgewogICAgZm9yICh2YXIgcGFyYW0gaW4gcG9zaXRpb25hbFBhcmFtcykgewogICAgICBpZiAoIXBhcmFtLmlzQ2FjaGVhYmxlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBwYXJhbSBpbiBuYW1lZFBhcmFtcykgewogICAgICBpZiAoIXBhcmFtLnR5cGUuaXNDYWNoZWFibGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmV0dXJuVHlwZS5pc0NhY2hlYWJsZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSBsaXN0SGFzaENvZGUodHlwZVBhcmFtcyk7CiAgICBoYXNoID0gX2NvbWJpbmVIYXNoZXMoaGFzaCwgbnVtUmVxdWlyZWRQYXJhbXMpOwogICAgaGFzaCA9IF9jb21iaW5lSGFzaGVzKGhhc2gsIGxpc3RIYXNoQ29kZShwb3NpdGlvbmFsUGFyYW1zKSk7CiAgICBoYXNoID0gX2NvbWJpbmVIYXNoZXMoaGFzaCwgbGlzdEhhc2hDb2RlKG5hbWVkUGFyYW1zKSk7CiAgICBoYXNoID0gX2NvbWJpbmVIYXNoZXMoaGFzaCwgcmV0dXJuVHlwZS5oYXNoQ29kZSk7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9GdW5jdGlvblR5cGVIYW5kbGUgJiYKICAgICAgbGlzdEVxdWFscyh0aGlzLnR5cGVQYXJhbXMsIG90aGVyLnR5cGVQYXJhbXMpICYmCiAgICAgIHRoaXMubnVtUmVxdWlyZWRQYXJhbXMgPT0gb3RoZXIubnVtUmVxdWlyZWRQYXJhbXMgJiYKICAgICAgbGlzdEVxdWFscyh0aGlzLnBvc2l0aW9uYWxQYXJhbXMsIG90aGVyLnBvc2l0aW9uYWxQYXJhbXMpICYmCiAgICAgIGxpc3RFcXVhbHModGhpcy5uYW1lZFBhcmFtcywgb3RoZXIubmFtZWRQYXJhbXMpICYmCiAgICAgIHRoaXMucmV0dXJuVHlwZSA9PSBvdGhlci5yZXR1cm5UeXBlOwoKICBAb3ZlcnJpZGUKICAvLyBUT0RPKHJlZ2lzKTogUHJpbnQgbnVsbGFiaWxpdHksIG9ubHkgaWYgbm5iZCBleHBlcmltZW50IGlzIGVuYWJsZWQ/CiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoJ0Z1bmN0aW9uVHlwZScpOwogICAgaWYgKHR5cGVQYXJhbXMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnIDwke3R5cGVQYXJhbXMuam9pbignLCAnKX0+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnICgnKTsKICAgIHNiLndyaXRlKHBvc2l0aW9uYWxQYXJhbXMuc3VibGlzdCgwLCBudW1SZXF1aXJlZFBhcmFtcykuam9pbignLCAnKSk7CiAgICBpZiAobnVtUmVxdWlyZWRQYXJhbXMgIT0gcG9zaXRpb25hbFBhcmFtcy5sZW5ndGgpIHsKICAgICAgaWYgKG51bVJlcXVpcmVkUGFyYW1zID4gMCkgewogICAgICAgIHNiLndyaXRlKCcsICcpOwogICAgICB9CiAgICAgIHNiLndyaXRlKCdbICR7cG9zaXRpb25hbFBhcmFtcy5zdWJsaXN0KG51bVJlcXVpcmVkUGFyYW1zKS5qb2luKCcsICcpfSBdJyk7CiAgICB9CiAgICBpZiAobmFtZWRQYXJhbXMuaXNOb3RFbXB0eSkgewogICAgICBpZiAobnVtUmVxdWlyZWRQYXJhbXMgPiAwKSB7CiAgICAgICAgc2Iud3JpdGUoJywgJyk7CiAgICAgIH0KICAgICAgc2Iud3JpdGUoJ3sgJHtuYW1lZFBhcmFtcy5qb2luKCcsICcpfSB9Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnKSAtPiAnKTsKICAgIHNiLndyaXRlKHJldHVyblR5cGUpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfTmFtZUhhbmRsZSBleHRlbmRzIE9iamVjdEhhbmRsZSB7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnSXNQdWJsaWMgPSBPYmplY3RIYW5kbGUuZmxhZ0JpdDA7CgogIFN0cmluZyBnZXQgbmFtZTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0S2luZCBnZXQga2luZCA9PiBPYmplY3RLaW5kLmtOYW1lOwoKICBAb3ZlcnJpZGUKICB2b2lkIGluZGV4U3RyaW5ncyhTdHJpbmdXcml0ZXIgc3RyaW5ncykgewogICAgc3RyaW5ncy5wdXQobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJyRuYW1lJyI7Cn0KCmNsYXNzIF9QdWJsaWNOYW1lSGFuZGxlIGV4dGVuZHMgX05hbWVIYW5kbGUgewogIFN0cmluZyBuYW1lOwoKICBfUHVibGljTmFtZUhhbmRsZS5fZW1wdHkoKTsKCiAgX1B1YmxpY05hbWVIYW5kbGUodGhpcy5uYW1lKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBmbGFncyA9PiBfTmFtZUhhbmRsZS5mbGFnSXNQdWJsaWM7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHdyaXRlci53cml0ZVBhY2tlZFN0cmluZ1JlZmVyZW5jZShuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgbmFtZSA9IHJlYWRlci5yZWFkUGFja2VkU3RyaW5nUmVmZXJlbmNlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG5hbWUuaGFzaENvZGU7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9QdWJsaWNOYW1lSGFuZGxlICYmIHRoaXMubmFtZSA9PSBvdGhlci5uYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJyRuYW1lJyI7Cn0KCmNsYXNzIF9Qcml2YXRlTmFtZUhhbmRsZSBleHRlbmRzIF9OYW1lSGFuZGxlIHsKICBfTGlicmFyeUhhbmRsZSBsaWJyYXJ5OwogIFN0cmluZyBuYW1lOwoKICBfUHJpdmF0ZU5hbWVIYW5kbGUuX2VtcHR5KCk7CgogIF9Qcml2YXRlTmFtZUhhbmRsZSh0aGlzLmxpYnJhcnksIHRoaXMubmFtZSkgewogICAgYXNzZXJ0KGxpYnJhcnkgIT0gbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlQ29udGVudHMoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QobGlicmFyeSk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRTdHJpbmdSZWZlcmVuY2UobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIGxpYnJhcnkgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgbmFtZSA9IHJlYWRlci5yZWFkUGFja2VkU3RyaW5nUmVmZXJlbmNlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY291bnRVc2VzRm9yT2JqZWN0Q29waWVzKGludCBudW1Db3BpZXMpIHsKICAgIGxpYnJhcnkuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2NvbWJpbmVIYXNoZXMobmFtZS5oYXNoQ29kZSwgbGlicmFyeS5oYXNoQ29kZSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9Qcml2YXRlTmFtZUhhbmRsZSAmJgogICAgICB0aGlzLm5hbWUgPT0gb3RoZXIubmFtZSAmJgogICAgICB0aGlzLmxpYnJhcnkgPT0gb3RoZXIubGlicmFyeTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIickbmFtZSciOwp9CgpjbGFzcyBfVHlwZUFyZ3VtZW50c0hhbmRsZSBleHRlbmRzIE9iamVjdEhhbmRsZSB7CiAgTGlzdDxfVHlwZUhhbmRsZT4gYXJnczsKCiAgX1R5cGVBcmd1bWVudHNIYW5kbGUuX2VtcHR5KCk7CgogIF9UeXBlQXJndW1lbnRzSGFuZGxlKHRoaXMuYXJncyk7CgogIEBvdmVycmlkZQogIE9iamVjdEtpbmQgZ2V0IGtpbmQgPT4gT2JqZWN0S2luZC5rVHlwZUFyZ3VtZW50czsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDYWNoZWFibGUgewogICAgZm9yICh2YXIgYXJnIGluIGFyZ3MpIHsKICAgICAgaWYgKCFhcmcuaXNDYWNoZWFibGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkTGlzdChhcmdzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgYXJncyA9IHJlYWRlci5yZWFkUGFja2VkTGlzdDxfVHlwZUhhbmRsZT4oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjb3VudFVzZXNGb3JPYmplY3RDb3BpZXMoaW50IG51bUNvcGllcykgewogICAgYXJncy5mb3JFYWNoKCh0KSB7CiAgICAgIHQuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBsaXN0SGFzaENvZGUoYXJncyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9UeXBlQXJndW1lbnRzSGFuZGxlICYmIGxpc3RFcXVhbHModGhpcy5hcmdzLCBvdGhlci5hcmdzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJzwgJHthcmdzLmpvaW4oJywgJyl9ID4nOwp9CgpjbGFzcyBfQ29uc3RPYmplY3RIYW5kbGUgZXh0ZW5kcyBPYmplY3RIYW5kbGUgewogIENvbnN0VGFnIHRhZzsKICBkeW5hbWljIHZhbHVlOwogIE9iamVjdEhhbmRsZSB0eXBlOwogIGludCBfaGFzaENvZGUgPSAwOwoKICBfQ29uc3RPYmplY3RIYW5kbGUuX2VtcHR5KCk7CgogIF9Db25zdE9iamVjdEhhbmRsZSh0aGlzLnRhZywgdGhpcy52YWx1ZSwgW3RoaXMudHlwZV0pOwoKICBAb3ZlcnJpZGUKICBPYmplY3RLaW5kIGdldCBraW5kID0+IE9iamVjdEtpbmQua0NvbnN0T2JqZWN0OwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGZsYWdzID0+IHRhZy5pbmRleCAqIE9iamVjdEhhbmRsZS5mbGFnQml0MDsKCiAgQG92ZXJyaWRlCiAgc2V0IGZsYWdzKGludCB2YWx1ZSkgewogICAgdGFnID0gQ29uc3RUYWcudmFsdWVzW3ZhbHVlIH4vIE9iamVjdEhhbmRsZS5mbGFnQml0MF07CiAgICBhc3NlcnQodGFnICE9IENvbnN0VGFnLmtJbnZhbGlkKTsKICB9CgogIGJvb2wgZ2V0IGlzQ2FjaGVhYmxlID0+ICh0YWcgIT0gQ29uc3RUYWcua0ludCkgJiYgKHRhZyAhPSBDb25zdFRhZy5rQm9vbCk7CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVDb250ZW50cyhCdWZmZXJlZFdyaXRlciB3cml0ZXIpIHsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgQ29uc3RUYWcua0ludDoKICAgICAgICB3cml0ZXIud3JpdGVTTEVCMTI4KHZhbHVlIGFzIGludCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RUYWcua0RvdWJsZToKICAgICAgICB3cml0ZXIud3JpdGVTTEVCMTI4KGRvdWJsZVRvSW50Qml0cyh2YWx1ZSBhcyBkb3VibGUpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rQm9vbDoKICAgICAgICB3cml0ZXIud3JpdGVCeXRlKCh2YWx1ZSBhcyBib29sKSA/IDEgOiAwKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rSW5zdGFuY2U6CiAgICAgICAgewogICAgICAgICAgZmluYWwgZmllbGRWYWx1ZXMgPSB2YWx1ZSBhcyBNYXA8T2JqZWN0SGFuZGxlLCBPYmplY3RIYW5kbGU+OwogICAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHR5cGUpOwogICAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKGZpZWxkVmFsdWVzLmxlbmd0aCk7CiAgICAgICAgICBmaWVsZFZhbHVlcy5mb3JFYWNoKChPYmplY3RIYW5kbGUgZmllbGQsIE9iamVjdEhhbmRsZSB2YWx1ZSkgewogICAgICAgICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QoZmllbGQpOwogICAgICAgICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QodmFsdWUpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtMaXN0OgogICAgICAgIHsKICAgICAgICAgIGZpbmFsIGVsZW1zID0gdmFsdWUgYXMgTGlzdDxPYmplY3RIYW5kbGU+OwogICAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHR5cGUpOwogICAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkTGlzdChlbGVtcyk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtUZWFyT2ZmOgogICAgICAgIHsKICAgICAgICAgIGZpbmFsIHRhcmdldCA9IHZhbHVlIGFzIE9iamVjdEhhbmRsZTsKICAgICAgICAgIHdyaXRlci53cml0ZVBhY2tlZE9iamVjdCh0YXJnZXQpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rU3ltYm9sOgogICAgICAgIHsKICAgICAgICAgIGZpbmFsIG5hbWUgPSB2YWx1ZSBhcyBPYmplY3RIYW5kbGU7CiAgICAgICAgICB3cml0ZXIud3JpdGVQYWNrZWRPYmplY3QobmFtZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtUZWFyT2ZmSW5zdGFudGlhdGlvbjoKICAgICAgICB7CiAgICAgICAgICBmaW5hbCB0ZWFyT2ZmID0gdmFsdWUgYXMgT2JqZWN0SGFuZGxlOwogICAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHRlYXJPZmYpOwogICAgICAgICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHR5cGUgYXMgX1R5cGVBcmd1bWVudHNIYW5kbGUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rU3RyaW5nOgogICAgICAgIHdyaXRlci53cml0ZVBhY2tlZFN0cmluZ1JlZmVyZW5jZSh2YWx1ZSBhcyBTdHJpbmcpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93ICdVbmV4cGVjdGVkIGNvbnN0YW50IHRhZzogJHRhZyc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgQ29uc3RUYWcua0ludDoKICAgICAgICB2YWx1ZSA9IHJlYWRlci5yZWFkU0xFQjEyOCgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtEb3VibGU6CiAgICAgICAgdmFsdWUgPSBpbnRCaXRzVG9Eb3VibGUocmVhZGVyLnJlYWRTTEVCMTI4KCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtCb29sOgogICAgICAgIHZhbHVlID0gcmVhZGVyLnJlYWRCeXRlKCkgIT0gMDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rSW5zdGFuY2U6CiAgICAgICAgdHlwZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICAgICAgdmFsdWUgPSBNYXA8T2JqZWN0SGFuZGxlLCBPYmplY3RIYW5kbGU+LmZyb21FbnRyaWVzKAogICAgICAgICAgICBuZXcgTGlzdDxNYXBFbnRyeTxPYmplY3RIYW5kbGUsIE9iamVjdEhhbmRsZT4+LmdlbmVyYXRlKAogICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSwKICAgICAgICAgICAgICAgIChfKSA9PiBuZXcgTWFwRW50cnk8T2JqZWN0SGFuZGxlLCBPYmplY3RIYW5kbGU+KAogICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCksIHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCkpKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RUYWcua0xpc3Q6CiAgICAgICAgdHlwZSA9IHJlYWRlci5yZWFkUGFja2VkT2JqZWN0KCk7CiAgICAgICAgdmFsdWUgPSByZWFkZXIucmVhZFBhY2tlZExpc3Q8T2JqZWN0SGFuZGxlPigpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtUZWFyT2ZmOgogICAgICAgIHZhbHVlID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rU3ltYm9sOgogICAgICAgIHZhbHVlID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rVGVhck9mZkluc3RhbnRpYXRpb246CiAgICAgICAgdmFsdWUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgICAgIHR5cGUgPSByZWFkZXIucmVhZFBhY2tlZE9iamVjdCgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtTdHJpbmc6CiAgICAgICAgdmFsdWUgPSByZWFkZXIucmVhZFBhY2tlZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93ICdVbmV4cGVjdGVkIGNvbnN0YW50IHRhZzogJHRhZyc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY291bnRVc2VzRm9yT2JqZWN0Q29waWVzKGludCBudW1Db3BpZXMpIHsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgQ29uc3RUYWcua0ludDoKICAgICAgY2FzZSBDb25zdFRhZy5rRG91YmxlOgogICAgICBjYXNlIENvbnN0VGFnLmtCb29sOgogICAgICBjYXNlIENvbnN0VGFnLmtTdHJpbmc6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RUYWcua0luc3RhbmNlOgogICAgICAgIHsKICAgICAgICAgIHR5cGUuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgICAgICAgIGZpbmFsIGZpZWxkVmFsdWVzID0gdmFsdWUgYXMgTWFwPE9iamVjdEhhbmRsZSwgT2JqZWN0SGFuZGxlPjsKICAgICAgICAgIGZpZWxkVmFsdWVzLmZvckVhY2goKE9iamVjdEhhbmRsZSBmaWVsZCwgT2JqZWN0SGFuZGxlIHZhbHVlKSB7CiAgICAgICAgICAgIGZpZWxkLl91c2VDb3VudCArPSBudW1Db3BpZXM7CiAgICAgICAgICAgIHZhbHVlPy5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtMaXN0OgogICAgICAgIHsKICAgICAgICAgIGZpbmFsIGVsZW1zID0gdmFsdWUgYXMgTGlzdDxPYmplY3RIYW5kbGU+OwogICAgICAgICAgZm9yICh2YXIgZWxlbSBpbiBlbGVtcykgewogICAgICAgICAgICBlbGVtPy5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICAgICAgfQogICAgICAgICAgdHlwZS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rVGVhck9mZjoKICAgICAgICB7CiAgICAgICAgICBmaW5hbCB0YXJnZXQgPSB2YWx1ZSBhcyBPYmplY3RIYW5kbGU7CiAgICAgICAgICB0YXJnZXQuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ29uc3RUYWcua1N5bWJvbDoKICAgICAgICB7CiAgICAgICAgICBmaW5hbCBuYW1lID0gdmFsdWUgYXMgT2JqZWN0SGFuZGxlOwogICAgICAgICAgbmFtZS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rVGVhck9mZkluc3RhbnRpYXRpb246CiAgICAgICAgewogICAgICAgICAgZmluYWwgdGVhck9mZiA9IHZhbHVlIGFzIE9iamVjdEhhbmRsZTsKICAgICAgICAgIHRlYXJPZmYuX3VzZUNvdW50ICs9IG51bUNvcGllczsKICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgICAgICAgdHlwZS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBjb25zdGFudCB0YWc6ICR0YWcnOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBpZiAoX2hhc2hDb2RlICE9IDApIHsKICAgICAgcmV0dXJuIF9oYXNoQ29kZTsKICAgIH0KICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgQ29uc3RUYWcua0ludDoKICAgICAgY2FzZSBDb25zdFRhZy5rRG91YmxlOgogICAgICBjYXNlIENvbnN0VGFnLmtCb29sOgogICAgICBjYXNlIENvbnN0VGFnLmtUZWFyT2ZmOgogICAgICBjYXNlIENvbnN0VGFnLmtTeW1ib2w6CiAgICAgIGNhc2UgQ29uc3RUYWcua1N0cmluZzoKICAgICAgICByZXR1cm4gX2hhc2hDb2RlID0gdmFsdWUuaGFzaENvZGU7CiAgICAgIGNhc2UgQ29uc3RUYWcua0luc3RhbmNlOgogICAgICAgIHsKICAgICAgICAgIGZpbmFsIGZpZWxkVmFsdWVzID0gdmFsdWUgYXMgTWFwPE9iamVjdEhhbmRsZSwgT2JqZWN0SGFuZGxlPjsKICAgICAgICAgIHJldHVybiBfaGFzaENvZGUgPQogICAgICAgICAgICAgIF9jb21iaW5lSGFzaGVzKHR5cGUuaGFzaENvZGUsIG1hcEhhc2hDb2RlKGZpZWxkVmFsdWVzKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0VGFnLmtMaXN0OgogICAgICAgIHsKICAgICAgICAgIGZpbmFsIGVsZW1zID0gdmFsdWUgYXMgTGlzdDxPYmplY3RIYW5kbGU+OwogICAgICAgICAgcmV0dXJuIF9oYXNoQ29kZSA9IF9jb21iaW5lSGFzaGVzKHR5cGUuaGFzaENvZGUsIGxpc3RIYXNoQ29kZShlbGVtcykpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdFRhZy5rVGVhck9mZkluc3RhbnRpYXRpb246CiAgICAgICAgcmV0dXJuIF9oYXNoQ29kZSA9IF9jb21iaW5lSGFzaGVzKHZhbHVlLmhhc2hDb2RlLCB0eXBlLmhhc2hDb2RlKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBjb25zdGFudCB0YWc6ICR0YWcnOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgX0NvbnN0T2JqZWN0SGFuZGxlICYmIHRoaXMudGFnID09IG90aGVyLnRhZykgewogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgQ29uc3RUYWcua0ludDoKICAgICAgICBjYXNlIENvbnN0VGFnLmtCb29sOgogICAgICAgIGNhc2UgQ29uc3RUYWcua1RlYXJPZmY6CiAgICAgICAgY2FzZSBDb25zdFRhZy5rU3ltYm9sOgogICAgICAgIGNhc2UgQ29uc3RUYWcua1N0cmluZzoKICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlOwogICAgICAgIGNhc2UgQ29uc3RUYWcua0RvdWJsZToKICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmNvbXBhcmVUbyhvdGhlci52YWx1ZSkgPT0gMDsKICAgICAgICBjYXNlIENvbnN0VGFnLmtJbnN0YW5jZToKICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gb3RoZXIudHlwZSAmJiBtYXBFcXVhbHModGhpcy52YWx1ZSwgb3RoZXIudmFsdWUpOwogICAgICAgIGNhc2UgQ29uc3RUYWcua0xpc3Q6CiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IG90aGVyLnR5cGUgJiYgbGlzdEVxdWFscyh0aGlzLnZhbHVlLCBvdGhlci52YWx1ZSk7CiAgICAgICAgY2FzZSBDb25zdFRhZy5rVGVhck9mZkluc3RhbnRpYXRpb246CiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IG90aGVyLnR5cGUgJiYgdGhpcy52YWx1ZSA9PSBvdGhlci52YWx1ZTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgY29uc3RhbnQgdGFnOiAkdGFnJzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBDb25zdFRhZy5rSW50OgogICAgICBjYXNlIENvbnN0VGFnLmtEb3VibGU6CiAgICAgIGNhc2UgQ29uc3RUYWcua0Jvb2w6CiAgICAgIGNhc2UgQ29uc3RUYWcua1N5bWJvbDoKICAgICAgICByZXR1cm4gJ2NvbnN0ICR2YWx1ZSc7CiAgICAgIGNhc2UgQ29uc3RUYWcua0luc3RhbmNlOgogICAgICAgIHJldHVybiAnY29uc3QgJHR5cGUgJHZhbHVlJzsKICAgICAgY2FzZSBDb25zdFRhZy5rTGlzdDoKICAgICAgICByZXR1cm4gJ2NvbnN0IDwkdHlwZT4gJHZhbHVlJzsKICAgICAgY2FzZSBDb25zdFRhZy5rVGVhck9mZjoKICAgICAgICByZXR1cm4gJ2NvbnN0IHRlYXItb2ZmICR2YWx1ZSc7CiAgICAgIGNhc2UgQ29uc3RUYWcua1RlYXJPZmZJbnN0YW50aWF0aW9uOgogICAgICAgIHJldHVybiAnY29uc3QgJHR5cGUgJHZhbHVlJzsKICAgICAgY2FzZSBDb25zdFRhZy5rU3RyaW5nOgogICAgICAgIHJldHVybiAiJyR2YWx1ZSciOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93ICdVbmV4cGVjdGVkIGNvbnN0YW50IHRhZzogJHRhZyc7CiAgICB9CiAgfQp9CgpjbGFzcyBfQXJnRGVzY0hhbmRsZSBleHRlbmRzIE9iamVjdEhhbmRsZSB7CiAgc3RhdGljIGNvbnN0IGludCBmbGFnSGFzTmFtZWRBcmdzID0gT2JqZWN0SGFuZGxlLmZsYWdCaXQwOwogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ0hhc1R5cGVBcmdzID0gT2JqZWN0SGFuZGxlLmZsYWdCaXQxOwoKICBpbnQgX2ZsYWdzID0gMDsKICBpbnQgbnVtQXJndW1lbnRzOwogIGludCBudW1UeXBlQXJndW1lbnRzOwogIExpc3Q8X1B1YmxpY05hbWVIYW5kbGU+IGFyZ05hbWVzOwoKICBfQXJnRGVzY0hhbmRsZS5fZW1wdHkoKTsKCiAgX0FyZ0Rlc2NIYW5kbGUodGhpcy5udW1Bcmd1bWVudHMsIHRoaXMubnVtVHlwZUFyZ3VtZW50cywgdGhpcy5hcmdOYW1lcykgewogICAgaWYgKGFyZ05hbWVzLmlzTm90RW1wdHkpIHsKICAgICAgX2ZsYWdzIHw9IGZsYWdIYXNOYW1lZEFyZ3M7CiAgICB9CiAgICBpZiAobnVtVHlwZUFyZ3VtZW50cyA+IDApIHsKICAgICAgX2ZsYWdzIHw9IGZsYWdIYXNUeXBlQXJnczsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIE9iamVjdEtpbmQgZ2V0IGtpbmQgPT4gT2JqZWN0S2luZC5rQXJnRGVzYzsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBmbGFncyA9PiBfZmxhZ3M7CgogIEBvdmVycmlkZQogIHNldCBmbGFncyhpbnQgdmFsdWUpIHsKICAgIF9mbGFncyA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKG51bUFyZ3VtZW50cyk7CiAgICBpZiAoKF9mbGFncyAmIGZsYWdIYXNUeXBlQXJncykgIT0gMCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAobnVtVHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICBpZiAoKF9mbGFncyAmIGZsYWdIYXNOYW1lZEFyZ3MpICE9IDApIHsKICAgICAgd3JpdGVyLndyaXRlUGFja2VkTGlzdChhcmdOYW1lcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRDb250ZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIG51bUFyZ3VtZW50cyA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBudW1UeXBlQXJndW1lbnRzID0KICAgICAgICAoKF9mbGFncyAmIGZsYWdIYXNUeXBlQXJncykgIT0gMCkgPyByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpIDogMDsKICAgIGFyZ05hbWVzID0gKChfZmxhZ3MgJiBmbGFnSGFzTmFtZWRBcmdzKSAhPSAwKQogICAgICAgID8gcmVhZGVyLnJlYWRQYWNrZWRMaXN0PF9QdWJsaWNOYW1lSGFuZGxlPigpCiAgICAgICAgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NvdW50VXNlc0Zvck9iamVjdENvcGllcyhpbnQgbnVtQ29waWVzKSB7CiAgICBpZiAoYXJnTmFtZXMgIT0gbnVsbCkgewogICAgICBmb3IgKHZhciBuYW1lIGluIGFyZ05hbWVzKSB7CiAgICAgICAgbmFtZS5fdXNlQ291bnQgKz0gbnVtQ29waWVzOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9jb21iaW5lSGFzaGVzKAogICAgICBudW1Bcmd1bWVudHMsIF9jb21iaW5lSGFzaGVzKG51bVR5cGVBcmd1bWVudHMsIGxpc3RIYXNoQ29kZShhcmdOYW1lcykpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgb3RoZXIgaXMgX0FyZ0Rlc2NIYW5kbGUgJiYKICAgICAgdGhpcy5udW1Bcmd1bWVudHMgPT0gb3RoZXIubnVtQXJndW1lbnRzICYmCiAgICAgIHRoaXMubnVtVHlwZUFyZ3VtZW50cyA9PSBvdGhlci5udW1UeXBlQXJndW1lbnRzICYmCiAgICAgIGxpc3RFcXVhbHModGhpcy5hcmdOYW1lcywgb3RoZXIuYXJnTmFtZXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnQXJnRGVzYyBudW0tYXJncyAkbnVtQXJndW1lbnRzLCBudW0tdHlwZS1hcmdzICRudW1UeXBlQXJndW1lbnRzLCBuYW1lcyAkYXJnTmFtZXMnOwp9CgpjbGFzcyBfU2NyaXB0SGFuZGxlIGV4dGVuZHMgT2JqZWN0SGFuZGxlIHsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdIYXNTb3VyY2VGaWxlID0gT2JqZWN0SGFuZGxlLmZsYWdCaXQwOwoKICBpbnQgX2ZsYWdzID0gMDsKICBPYmplY3RIYW5kbGUgdXJpOwogIFNvdXJjZUZpbGUgX3NvdXJjZTsKICBGb3J3YXJkUmVmZXJlbmNlPFNvdXJjZUZpbGU+IF9zb3VyY2VGb3J3YXJkUmVmZXJlbmNlOwoKICBfU2NyaXB0SGFuZGxlLl9lbXB0eSgpOwoKICBfU2NyaXB0SGFuZGxlKHRoaXMudXJpLCB0aGlzLl9zb3VyY2UpIHsKICAgIGlmIChfc291cmNlICE9IG51bGwpIHsKICAgICAgX2ZsYWdzIHw9IGZsYWdIYXNTb3VyY2VGaWxlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgT2JqZWN0S2luZCBnZXQga2luZCA9PiBPYmplY3RLaW5kLmtTY3JpcHQ7CgogIC8vIEluY2x1ZGUgc2NyaXB0cyBpbnRvIGluZGV4IHRhYmxlIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMSByZWZlcmVuY2UKICAvLyBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZWQgc2NyaXB0IG9iamVjdHMgd2l0aGluIHRoZQogIC8vIHNhbWUgYnl0ZWNvZGUgY29tcG9uZW50LgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IHNob3VsZEJlSW5jbHVkZWRJbnRvSW5kZXhUYWJsZSA9PiBfdXNlQ291bnQgPiAxOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGZsYWdzID0+IF9mbGFnczsKCiAgQG92ZXJyaWRlCiAgc2V0IGZsYWdzKGludCB2YWx1ZSkgewogICAgX2ZsYWdzID0gdmFsdWU7CiAgfQoKICBTb3VyY2VGaWxlIGdldCBzb3VyY2UgewogICAgLy8gVW53cmFwIGZvcndhcmQgcmVmZXJlbmNlIG9uIHRoZSBmaXJzdCBhY2Nlc3MuCiAgICBpZiAoX3NvdXJjZUZvcndhcmRSZWZlcmVuY2UgIT0gbnVsbCkgewogICAgICBfc291cmNlID0gX3NvdXJjZUZvcndhcmRSZWZlcmVuY2UuZ2V0KCk7CiAgICAgIF9zb3VyY2VGb3J3YXJkUmVmZXJlbmNlID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBfc291cmNlOwogIH0KCiAgc2V0IHNvdXJjZShTb3VyY2VGaWxlIHNvdXJjZUZpbGUpIHsKICAgIF9zb3VyY2UgPSBzb3VyY2VGaWxlOwogICAgaWYgKF9zb3VyY2UgIT0gbnVsbCkgewogICAgICBfZmxhZ3MgfD0gZmxhZ0hhc1NvdXJjZUZpbGU7CiAgICB9IGVsc2UgewogICAgICBfZmxhZ3MgJj0gfmZsYWdIYXNTb3VyY2VGaWxlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZUNvbnRlbnRzKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgd3JpdGVyLndyaXRlUGFja2VkT2JqZWN0KHVyaSk7CiAgICBpZiAoKF9mbGFncyAmIGZsYWdIYXNTb3VyY2VGaWxlKSAhPSAwKSB7CiAgICAgIHdyaXRlci53cml0ZUxpbmtPZmZzZXQoc291cmNlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZENvbnRlbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgdXJpID0gcmVhZGVyLnJlYWRQYWNrZWRPYmplY3QoKTsKICAgIGlmICgoX2ZsYWdzICYgZmxhZ0hhc1NvdXJjZUZpbGUpICE9IDApIHsKICAgICAgLy8gU2NyaXB0IGhhbmRsZXMgaW4gdGhlIG9iamVjdCB0YWJsZSBtYXkgYmUgcmVhZCBiZWZvcmUgc291cmNlIGZpbGVzLAogICAgICAvLyBzbyB1c2UgZm9yd2FyZGluZyByZWZlcmVuY2UgaGVyZS4KICAgICAgX3NvdXJjZUZvcndhcmRSZWZlcmVuY2UgPQogICAgICAgICAgcmVhZGVyLnJlYWRMaW5rT2Zmc2V0QXNGb3J3YXJkUmVmZXJlbmNlPFNvdXJjZUZpbGU+KCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHVyaS5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gb3RoZXIgaXMgX1NjcmlwdEhhbmRsZSAmJiB0aGlzLnVyaSA9PSBvdGhlci51cmk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICIkdXJpJHtzb3VyY2UgIT0gbnVsbCA/ICcoJHNvdXJjZSknIDogJyd9IjsKfQoKY2xhc3MgT2JqZWN0VGFibGUgaW1wbGVtZW50cyBPYmplY3RXcml0ZXIsIE9iamVjdFJlYWRlciB7CiAgLy8vIE9iamVjdCBpcyBhZGRlZCB0byBhbiBpbmRleCB0YWJsZSBpZiBpdCBpcyB1c2VkIG1vcmUgdGhhbiB0aGlzCiAgLy8vIG51bWJlciBvZiB0aW1lcy4KICBzdGF0aWMgY29uc3QgaW50IGluZGV4VGFibGVVc2VDb3VudFRocmVzaG9sZCA9IDM7CgogIGZpbmFsIExpc3Q8T2JqZWN0SGFuZGxlPiBfb2JqZWN0cyA9IG5ldyBMaXN0PE9iamVjdEhhbmRsZT4oKTsKICBmaW5hbCBNYXA8T2JqZWN0SGFuZGxlLCBPYmplY3RIYW5kbGU+IF9jYW5vbmljYWxpemF0aW9uQ2FjaGUgPQogICAgICA8T2JqZWN0SGFuZGxlLCBPYmplY3RIYW5kbGU+e307CiAgZmluYWwgTWFwPE5vZGUsIE9iamVjdEhhbmRsZT4gX25vZGVDYWNoZSA9IDxOb2RlLCBPYmplY3RIYW5kbGU+e307CiAgZmluYWwgTWFwPFN0cmluZywgX1B1YmxpY05hbWVIYW5kbGU+IF9wdWJsaWNOYW1lcyA9CiAgICAgIDxTdHJpbmcsIF9QdWJsaWNOYW1lSGFuZGxlPnt9OwogIExpc3Q8T2JqZWN0SGFuZGxlPiBfaW5kZXhUYWJsZTsKICBfVHlwZUhhbmRsZSBfZHluYW1pY1R5cGU7CiAgX1R5cGVIYW5kbGUgX3ZvaWRUeXBlOwogIF9Ob2RlVmlzaXRvciBfbm9kZVZpc2l0b3I7CgogIE9iamVjdFRhYmxlKENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIF9keW5hbWljVHlwZSA9IGdldE9yQWRkT2JqZWN0KG5ldyBfRHluYW1pY1R5cGVIYW5kbGUoKSk7CiAgICBfdm9pZFR5cGUgPSBnZXRPckFkZE9iamVjdChuZXcgX1ZvaWRUeXBlSGFuZGxlKCkpOwogICAgX25vZGVWaXNpdG9yID0gbmV3IF9Ob2RlVmlzaXRvcih0aGlzLCBjb3JlVHlwZXMpOwogIH0KCiAgT2JqZWN0SGFuZGxlIGdldEhhbmRsZShOb2RlIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBPYmplY3RIYW5kbGUgaGFuZGxlID0gX25vZGVDYWNoZVtub2RlXTsKICAgIGlmIChoYW5kbGUgPT0gbnVsbCkgewogICAgICBoYW5kbGUgPSBub2RlLmFjY2VwdChfbm9kZVZpc2l0b3IpOwogICAgICBpZiAoaGFuZGxlICE9IG51bGwgJiYgaGFuZGxlLmlzQ2FjaGVhYmxlKSB7CiAgICAgICAgX25vZGVDYWNoZVtub2RlXSA9IGhhbmRsZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKytoYW5kbGUuX3VzZUNvdW50OwogICAgfQogICAgcmV0dXJuIGhhbmRsZTsKICB9CgogIExpc3Q8T2JqZWN0SGFuZGxlPiBnZXRIYW5kbGVzKExpc3Q8Tm9kZT4gbm9kZXMpIHsKICAgIGZpbmFsIGhhbmRsZXMgPSBuZXcgTGlzdDxPYmplY3RIYW5kbGU+KG5vZGVzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhbmRsZXNbaV0gPSBnZXRIYW5kbGUobm9kZXNbaV0pOwogICAgfQogICAgcmV0dXJuIGhhbmRsZXM7CiAgfQoKICBTdHJpbmcgbWFuZ2xlR2V0dGVyTmFtZShTdHJpbmcgbmFtZSkgPT4gJ2dldDokbmFtZSc7CgogIFN0cmluZyBtYW5nbGVTZXR0ZXJOYW1lKFN0cmluZyBuYW1lKSA9PiAnc2V0OiRuYW1lJzsKCiAgU3RyaW5nIG1hbmdsZVNlbGVjdG9yTmFtZShTdHJpbmcgbmFtZSwgYm9vbCBpc0dldHRlciwgYm9vbCBpc1NldHRlcikgewogICAgaWYgKGlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBtYW5nbGVHZXR0ZXJOYW1lKG5hbWUpOwogICAgfSBlbHNlIGlmIChpc1NldHRlcikgewogICAgICByZXR1cm4gbWFuZ2xlU2V0dGVyTmFtZShuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuYW1lOwogICAgfQogIH0KCiAgU3RyaW5nIG1hbmdsZU1lbWJlck5hbWUoTWVtYmVyIG1lbWJlciwgYm9vbCBpc0dldHRlciwgYm9vbCBpc1NldHRlcikgewogICAgZmluYWwgbmFtZSA9IG1lbWJlci5uYW1lLm5hbWU7CiAgICBpZiAoaXNHZXR0ZXIgfHwgKG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmlzR2V0dGVyKSkgewogICAgICByZXR1cm4gbWFuZ2xlR2V0dGVyTmFtZShuYW1lKTsKICAgIH0KICAgIGlmIChpc1NldHRlciB8fCAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNTZXR0ZXIpKSB7CiAgICAgIHJldHVybiBtYW5nbGVTZXR0ZXJOYW1lKG5hbWUpOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0UHVibGljTmFtZUhhbmRsZShTdHJpbmcgbmFtZSkgewogICAgYXNzZXJ0KG5hbWUgIT0gbnVsbCk7CiAgICBfUHVibGljTmFtZUhhbmRsZSBoYW5kbGUgPSBfcHVibGljTmFtZXNbbmFtZV07CiAgICBpZiAoaGFuZGxlID09IG51bGwpIHsKICAgICAgaGFuZGxlID0gZ2V0T3JBZGRPYmplY3QobmV3IF9QdWJsaWNOYW1lSGFuZGxlKG5hbWUpKTsKICAgICAgX3B1YmxpY05hbWVzW25hbWVdID0gaGFuZGxlOwogICAgfQogICAgcmV0dXJuIGhhbmRsZTsKICB9CgogIE9iamVjdEhhbmRsZSBnZXROYW1lSGFuZGxlKExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpIHsKICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKICAgICAgcmV0dXJuIGdldFB1YmxpY05hbWVIYW5kbGUobmFtZSk7CiAgICB9CiAgICBhc3NlcnQobmFtZSAhPSBudWxsKTsKICAgIGZpbmFsIGxpYnJhcnlIYW5kbGUgPSBsaWJyYXJ5ICE9IG51bGwgPyBnZXRIYW5kbGUobGlicmFyeSkgOiBudWxsOwogICAgcmV0dXJuIGdldE9yQWRkT2JqZWN0KG5ldyBfUHJpdmF0ZU5hbWVIYW5kbGUobGlicmFyeUhhbmRsZSwgbmFtZSkpOwogIH0KCiAgTGlzdDxfUHVibGljTmFtZUhhbmRsZT4gZ2V0UHVibGljTmFtZUhhbmRsZXMoTGlzdDxTdHJpbmc+IG5hbWVzKSB7CiAgICBpZiAobmFtZXMuaXNFbXB0eSkgewogICAgICByZXR1cm4gY29uc3QgPF9QdWJsaWNOYW1lSGFuZGxlPltdOwogICAgfQogICAgZmluYWwgaGFuZGxlcyA9IG5ldyBMaXN0PF9QdWJsaWNOYW1lSGFuZGxlPihuYW1lcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkgewogICAgICBoYW5kbGVzW2ldID0gZ2V0UHVibGljTmFtZUhhbmRsZShuYW1lc1tpXSk7CiAgICB9CiAgICByZXR1cm4gaGFuZGxlczsKICB9CgogIE9iamVjdEhhbmRsZSBnZXRDb25zdFN0cmluZ0hhbmRsZShTdHJpbmcgdmFsdWUpID0+CiAgICAgIGdldE9yQWRkT2JqZWN0KG5ldyBfQ29uc3RPYmplY3RIYW5kbGUoQ29uc3RUYWcua1N0cmluZywgdmFsdWUpKTsKCiAgTGlzdDxPYmplY3RIYW5kbGU+IGdldENvbnN0U3RyaW5nSGFuZGxlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7CiAgICBpZiAodmFsdWVzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIGNvbnN0IDxPYmplY3RIYW5kbGU+W107CiAgICB9CiAgICBmaW5hbCBoYW5kbGVzID0gbmV3IExpc3Q8T2JqZWN0SGFuZGxlPih2YWx1ZXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhbmRsZXNbaV0gPSBnZXRDb25zdFN0cmluZ0hhbmRsZSh2YWx1ZXNbaV0pOwogICAgfQogICAgcmV0dXJuIGhhbmRsZXM7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0U2VsZWN0b3JOYW1lSGFuZGxlKE5hbWUgbmFtZSwKICAgICAge2Jvb2wgaXNHZXR0ZXI6IGZhbHNlLCBib29sIGlzU2V0dGVyOiBmYWxzZX0pIHsKICAgIHJldHVybiBnZXROYW1lSGFuZGxlKAogICAgICAgIG5hbWUubGlicmFyeSwgbWFuZ2xlU2VsZWN0b3JOYW1lKG5hbWUubmFtZSwgaXNHZXR0ZXIsIGlzU2V0dGVyKSk7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0VG9wTGV2ZWxDbGFzc0hhbmRsZShMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGZpbmFsIGxpYnJhcnlIYW5kbGUgPSBnZXRIYW5kbGUobGlicmFyeSk7CiAgICBmaW5hbCBuYW1lID0gZ2V0UHVibGljTmFtZUhhbmRsZSh0b3BMZXZlbENsYXNzTmFtZSk7CiAgICByZXR1cm4gZ2V0T3JBZGRPYmplY3QobmV3IF9DbGFzc0hhbmRsZShsaWJyYXJ5SGFuZGxlLCBuYW1lKSk7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0TWVtYmVySGFuZGxlKE1lbWJlciBtZW1iZXIsCiAgICAgIHtib29sIGlzR2V0dGVyOiBmYWxzZSwgYm9vbCBpc1NldHRlcjogZmFsc2V9KSB7CiAgICBmaW5hbCBwYXJlbnQgPSBtZW1iZXIucGFyZW50OwogICAgT2JqZWN0SGFuZGxlIGNsYXNzSGFuZGxlOwogICAgaWYgKHBhcmVudCBpcyBDbGFzcykgewogICAgICBjbGFzc0hhbmRsZSA9IGdldEhhbmRsZShwYXJlbnQpOwogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgTGlicmFyeSkgewogICAgICBjbGFzc0hhbmRsZSA9IGdldFRvcExldmVsQ2xhc3NIYW5kbGUocGFyZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJVbmV4cGVjdGVkIE1lbWJlcidzIHBhcmVudCAke3BhcmVudC5ydW50aW1lVHlwZX0gJHBhcmVudCI7CiAgICB9CiAgICBmaW5hbCBuYW1lSGFuZGxlID0gZ2V0TmFtZUhhbmRsZSgKICAgICAgICBtZW1iZXIubmFtZS5saWJyYXJ5LCBtYW5nbGVNZW1iZXJOYW1lKG1lbWJlciwgaXNHZXR0ZXIsIGlzU2V0dGVyKSk7CiAgICBib29sIGlzRmllbGQgPSBtZW1iZXIgaXMgRmllbGQgJiYgIWlzR2V0dGVyICYmICFpc1NldHRlcjsKICAgIGJvb2wgaXNDb25zdHJ1Y3RvciA9CiAgICAgICAgbWVtYmVyIGlzIENvbnN0cnVjdG9yIHx8IChtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5pc0ZhY3RvcnkpOwogICAgcmV0dXJuIGdldE9yQWRkT2JqZWN0KAogICAgICAgIG5ldyBfTWVtYmVySGFuZGxlKGNsYXNzSGFuZGxlLCBuYW1lSGFuZGxlLCBpc0ZpZWxkLCBpc0NvbnN0cnVjdG9yKSk7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0VHlwZUFyZ3VtZW50c0hhbmRsZShMaXN0PERhcnRUeXBlPiB0eXBlQXJncykgewogICAgaWYgKHR5cGVBcmdzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmaW5hbCBoYW5kbGVzID0gbmV3IExpc3Q8X1R5cGVIYW5kbGU+KHR5cGVBcmdzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGhhbmRsZXNbaV0gPSBnZXRIYW5kbGUodHlwZUFyZ3NbaV0pIGFzIF9UeXBlSGFuZGxlOwogICAgfQogICAgcmV0dXJuIGdldE9yQWRkT2JqZWN0KG5ldyBfVHlwZUFyZ3VtZW50c0hhbmRsZShoYW5kbGVzKSk7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0QXJnRGVzY0hhbmRsZShpbnQgbnVtQXJndW1lbnRzLAogICAgICBbaW50IG51bVR5cGVBcmd1bWVudHMgPSAwLCBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBjb25zdCA8U3RyaW5nPltdXSkgewogICAgcmV0dXJuIGdldE9yQWRkT2JqZWN0KG5ldyBfQXJnRGVzY0hhbmRsZSgKICAgICAgICBudW1Bcmd1bWVudHMsIG51bVR5cGVBcmd1bWVudHMsIGdldFB1YmxpY05hbWVIYW5kbGVzKGFyZ05hbWVzKSkpOwogIH0KCiAgT2JqZWN0SGFuZGxlIGdldEFyZ0Rlc2NIYW5kbGVCeUFyZ3VtZW50cyhBcmd1bWVudHMgYXJncywKICAgICAge2Jvb2wgaGFzUmVjZWl2ZXI6IGZhbHNlLCBib29sIGlzRmFjdG9yeTogZmFsc2V9KSB7CiAgICBMaXN0PF9QdWJsaWNOYW1lSGFuZGxlPiBhcmdOYW1lcyA9IGNvbnN0IDxfUHVibGljTmFtZUhhbmRsZT5bXTsKICAgIGZpbmFsIG5hbWVkQXJndW1lbnRzID0gYXJncy5uYW1lZDsKICAgIGlmIChuYW1lZEFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGFyZ05hbWVzID0gbmV3IExpc3Q8X1B1YmxpY05hbWVIYW5kbGU+KG5hbWVkQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICBhcmdOYW1lc1tpXSA9IGdldFB1YmxpY05hbWVIYW5kbGUobmFtZWRBcmd1bWVudHNbaV0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGZpbmFsIGludCBudW1Bcmd1bWVudHMgPSBhcmdzLnBvc2l0aW9uYWwubGVuZ3RoICsKICAgICAgICBhcmdzLm5hbWVkLmxlbmd0aCArCiAgICAgICAgKGhhc1JlY2VpdmVyID8gMSA6IDApICsKICAgICAgICAvLyBWTSBleHBlY3RzIHRoYXQgdHlwZSBhcmd1bWVudHMgdmVjdG9yIHBhc3NlZCB0byBhIGZhY3RvcnkKICAgICAgICAvLyBjb25zdHJ1Y3RvciBpcyBjb3VudGVkIGluIG51bUFyZ3VtZW50cywgYW5kIG5vdCBjb3VudGVkIGluCiAgICAgICAgLy8gbnVtVHlwZUFyZ3MuCiAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogQ2xlYW4gdGhpcyB1cC4KICAgICAgICAoaXNGYWN0b3J5ID8gMSA6IDApOwogICAgZmluYWwgaW50IG51bVR5cGVBcmd1bWVudHMgPSBpc0ZhY3RvcnkgPyAwIDogYXJncy50eXBlcy5sZW5ndGg7CiAgICByZXR1cm4gZ2V0T3JBZGRPYmplY3QoCiAgICAgICAgbmV3IF9BcmdEZXNjSGFuZGxlKG51bUFyZ3VtZW50cywgbnVtVHlwZUFyZ3VtZW50cywgYXJnTmFtZXMpKTsKICB9CgogIE9iamVjdEhhbmRsZSBnZXRTY3JpcHRIYW5kbGUoVXJpIHVyaSwgU291cmNlRmlsZSBzb3VyY2UpIHsKICAgIE9iamVjdEhhbmRsZSB1cmlIYW5kbGUgPSBnZXRQdWJsaWNOYW1lSGFuZGxlKHVyaS50b1N0cmluZygpKTsKICAgIF9TY3JpcHRIYW5kbGUgaGFuZGxlID0gZ2V0T3JBZGRPYmplY3QobmV3IF9TY3JpcHRIYW5kbGUodXJpSGFuZGxlLCBzb3VyY2UpKTsKICAgIGlmIChoYW5kbGUuc291cmNlID09IG51bGwgJiYgc291cmNlICE9IG51bGwpIHsKICAgICAgaGFuZGxlLnNvdXJjZSA9IHNvdXJjZTsKICAgIH0KICAgIHJldHVybiBoYW5kbGU7CiAgfQoKICBMaXN0PE5hbWVBbmRUeXBlPiBnZXRUeXBlUGFyYW1ldGVySGFuZGxlcyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbXMpIHsKICAgIGlmICh0eXBlUGFyYW1zLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIGNvbnN0IDxOYW1lQW5kVHlwZT5bXTsKICAgIH0KICAgIGZpbmFsIG5hbWVzQW5kQm91bmRzID0gbmV3IExpc3Q8TmFtZUFuZFR5cGU+KCk7CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHAgaW4gdHlwZVBhcmFtcykgewogICAgICBuYW1lc0FuZEJvdW5kcy5hZGQoCiAgICAgICAgICBuZXcgTmFtZUFuZFR5cGUoZ2V0UHVibGljTmFtZUhhbmRsZSh0cC5uYW1lKSwgZ2V0SGFuZGxlKHRwLmJvdW5kKSkpOwogICAgfQogICAgcmV0dXJuIG5hbWVzQW5kQm91bmRzOwogIH0KCiAgdm9pZCBkZWNsYXJlQ2xvc3VyZSgKICAgICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBNZW1iZXIgZW5jbG9zaW5nTWVtYmVyLCBpbnQgY2xvc3VyZUluZGV4KSB7CiAgICBmaW5hbCBoYW5kbGUgPSBnZXRPckFkZE9iamVjdCgKICAgICAgICBuZXcgX0Nsb3N1cmVIYW5kbGUoZ2V0SGFuZGxlKGVuY2xvc2luZ01lbWJlciksIGNsb3N1cmVJbmRleCkpOwogICAgX25vZGVDYWNoZVtmdW5jdGlvbl0gPSBoYW5kbGU7CiAgfQoKICBPYmplY3RIYW5kbGUgZ2V0T3JBZGRPYmplY3QoT2JqZWN0SGFuZGxlIG9iaikgewogICAgYXNzZXJ0KG9iai5fdXNlQ291bnQgPT0gMCk7CiAgICBPYmplY3RIYW5kbGUgY2Fub25pY2FsID0gX2Nhbm9uaWNhbGl6YXRpb25DYWNoZVtvYmpdOwogICAgaWYgKGNhbm9uaWNhbCA9PSBudWxsKSB7CiAgICAgIGFzc2VydChfaW5kZXhUYWJsZSA9PSBudWxsKTsKICAgICAgX29iamVjdHMuYWRkKG9iaik7CiAgICAgIF9jYW5vbmljYWxpemF0aW9uQ2FjaGVbb2JqXSA9IG9iajsKICAgICAgY2Fub25pY2FsID0gb2JqOwogICAgfQogICAgKytjYW5vbmljYWwuX3VzZUNvdW50OwogICAgcmV0dXJuIGNhbm9uaWNhbDsKICB9CgogIHZvaWQgYWxsb2NhdGVJbmRleFRhYmxlKCkgewogICAgaW50IHRhYmxlU2l6ZSA9IDE7IC8vIFJlc2VydmUgaW52YWxpZCBlbnRyeS4KICAgIGZvciAodmFyIG9iaiBpbiBfb2JqZWN0cy5yZXZlcnNlZCkgewogICAgICBhc3NlcnQob2JqLl9yZWZlcmVuY2UgPT0gbnVsbCk7CiAgICAgIGlmIChvYmouc2hvdWxkQmVJbmNsdWRlZEludG9JbmRleFRhYmxlKSB7CiAgICAgICAgLy8gVGhpcyBvYmplY3Qgd2lsbCBiZSBpbmNsdWRlZCBpbnRvIGluZGV4IHRhYmxlLgogICAgICAgICsrdGFibGVTaXplOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgY29waWVkIGFuZCB3cml0dGVuIGlubGluZS4gQnVtcCB1c2UgY291bnQgZm9yCiAgICAgICAgLy8gb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gdGhpcyBvbmUgZm9yIGVhY2ggY29weSBhZnRlciB0aGUgZmlyc3QuCiAgICAgICAgb2JqLl9yZWZlcmVuY2UgPSBPYmplY3RIYW5kbGUuaW5saW5lT2JqZWN0OwogICAgICAgIG9iai5hY2NvdW50VXNlc0Zvck9iamVjdENvcGllcyhvYmouX3VzZUNvdW50IC0gMSk7CiAgICAgIH0KICAgIH0KICAgIF9pbmRleFRhYmxlID0gbmV3IExpc3Q8T2JqZWN0SGFuZGxlPih0YWJsZVNpemUpOwogICAgaW50IGNvdW50ID0gMDsKICAgIF9pbmRleFRhYmxlW2NvdW50KytdID0gbmV3IF9JbnZhbGlkSGFuZGxlKCkKICAgICAgLi5fcmVmZXJlbmNlID0gT2JqZWN0SGFuZGxlLl9tYWtlUmVmZXJlbmNlKDApOwogICAgZm9yICh2YXIgb2JqIGluIF9vYmplY3RzKSB7CiAgICAgIGlmIChvYmouX3JlZmVyZW5jZSA9PSBudWxsKSB7CiAgICAgICAgb2JqLl9yZWZlcmVuY2UgPSBPYmplY3RIYW5kbGUuX21ha2VSZWZlcmVuY2UoY291bnQpOwogICAgICAgIF9pbmRleFRhYmxlW2NvdW50KytdID0gb2JqOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChvYmouX3JlZmVyZW5jZSA9PSBPYmplY3RIYW5kbGUuaW5saW5lT2JqZWN0KTsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGNvdW50ID09IHRhYmxlU2l6ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlT2JqZWN0KEJ5dGVjb2RlT2JqZWN0IG9iamVjdCwgQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICBPYmplY3RIYW5kbGUgaGFuZGxlID0gb2JqZWN0IGFzIE9iamVjdEhhbmRsZTsKICAgIGlmIChoYW5kbGUgPT0gbnVsbCkgewogICAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoT2JqZWN0SGFuZGxlLl9tYWtlUmVmZXJlbmNlKDApKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGhhbmRsZS5fcmVmZXJlbmNlID09IE9iamVjdEhhbmRsZS5pbmxpbmVPYmplY3QpIHsKICAgICAgaGFuZGxlLl93cml0ZSh3cml0ZXIpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGhhbmRsZS5fcmVmZXJlbmNlID49IDApOwogICAgICBhc3NlcnQoKGhhbmRsZS5fcmVmZXJlbmNlICYgT2JqZWN0SGFuZGxlLnJlZmVyZW5jZUJpdCkgIT0gMCk7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChoYW5kbGUuX3JlZmVyZW5jZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBCeXRlY29kZU9iamVjdCByZWFkT2JqZWN0KEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgZmluYWwgaW50IGhlYWRlciA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICBpZiAoKGhlYWRlciAmIE9iamVjdEhhbmRsZS5yZWZlcmVuY2VCaXQpID09IDApIHsKICAgICAgcmV0dXJuIG5ldyBPYmplY3RIYW5kbGUuX3JlYWQocmVhZGVyLCBoZWFkZXIpOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IGluZGV4ID0gT2JqZWN0SGFuZGxlLl9nZXRJbmRleEZyb21SZWZlcmVuY2UoaGVhZGVyKTsKICAgICAgcmV0dXJuIChpbmRleCA9PSAwKSA/IG51bGwgOiBfaW5kZXhUYWJsZVtpbmRleF07CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgYXNzZXJ0KHdyaXRlci5vYmplY3RXcml0ZXIgPT0gdGhpcyk7CiAgICBhc3NlcnQoX2luZGV4VGFibGUgIT0gbnVsbCk7CiAgICBmaW5hbCBzdGFydCA9IHdyaXRlci5vZmZzZXQ7CiAgICBpZiAoQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5vYmplY3RUYWJsZVN0YXRzLmlzRW1wdHkpIHsKICAgICAgZm9yICh2YXIga2luZCBpbiBPYmplY3RLaW5kLnZhbHVlcykgewogICAgICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3Mub2JqZWN0VGFibGVTdGF0cwogICAgICAgICAgICAuYWRkKG5ldyBOYW1lZEVudHJ5U3RhdGlzdGljcyhvYmplY3RLaW5kVG9TdHJpbmcoa2luZCkpKTsKICAgICAgfQogICAgfQoKICAgIEJ1ZmZlcmVkV3JpdGVyIGNvbnRlbnRzV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyLmZyb21Xcml0ZXIod3JpdGVyKTsKICAgIExpc3Q8aW50PiBvZmZzZXRzID0gbmV3IExpc3Q8aW50PihfaW5kZXhUYWJsZS5sZW5ndGgpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2luZGV4VGFibGUubGVuZ3RoOyArK2kpIHsKICAgICAgb2Zmc2V0c1tpXSA9IGNvbnRlbnRzV3JpdGVyLm9mZnNldDsKICAgICAgX2luZGV4VGFibGVbaV0uX3dyaXRlKGNvbnRlbnRzV3JpdGVyKTsKCiAgICAgIGZpbmFsIGVudHJ5U3RhdCA9CiAgICAgICAgICBCeXRlY29kZVNpemVTdGF0aXN0aWNzLm9iamVjdFRhYmxlU3RhdHNbX2luZGV4VGFibGVbaV0ua2luZC5pbmRleF07CiAgICAgIGVudHJ5U3RhdC5zaXplICs9IChjb250ZW50c1dyaXRlci5vZmZzZXQgLSBvZmZzZXRzW2ldKTsKICAgICAgKytlbnRyeVN0YXQuY291bnQ7CiAgICB9CgogICAgd3JpdGVyLndyaXRlUGFja2VkVUludDMwKF9pbmRleFRhYmxlLmxlbmd0aCk7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoY29udGVudHNXcml0ZXIub2Zmc2V0KTsKICAgIHdyaXRlci5hcHBlbmRXcml0ZXIoY29udGVudHNXcml0ZXIpOwogICAgZm9yICh2YXIgb2ZmcyBpbiBvZmZzZXRzKSB7CiAgICAgIHdyaXRlci53cml0ZVBhY2tlZFVJbnQzMChvZmZzKTsKICAgIH0KCiAgICAvLyBJbmRleCBzdHJpbmdzIGluIG9iamVjdHMgd2hpY2ggd2lsbCBiZSB3cml0dGVuIGlubGluZQogICAgLy8gaW4gY29uc3RhbnQgcG9vbCBlbnRyaWVzLgogICAgZm9yICh2YXIgb2JqIGluIF9vYmplY3RzKSB7CiAgICAgIGlmIChvYmouX3JlZmVyZW5jZSA9PSBPYmplY3RIYW5kbGUuaW5saW5lT2JqZWN0KSB7CiAgICAgICAgb2JqLmluZGV4U3RyaW5ncyh3cml0ZXIuc3RyaW5nV3JpdGVyKTsKICAgICAgfQogICAgfQoKICAgIEJ5dGVjb2RlU2l6ZVN0YXRpc3RpY3Mub2JqZWN0VGFibGVTaXplICs9ICh3cml0ZXIub2Zmc2V0IC0gc3RhcnQpOwogICAgQnl0ZWNvZGVTaXplU3RhdGlzdGljcy5vYmplY3RUYWJsZUVudHJpZXNDb3VudCArPSBfaW5kZXhUYWJsZS5sZW5ndGg7CiAgfQoKICBPYmplY3RUYWJsZS5yZWFkKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgewogICAgcmVhZGVyLm9iamVjdFJlYWRlciA9IHRoaXM7CgogICAgZmluYWwgaW50IG51bUVudHJpZXMgPSByZWFkZXIucmVhZFBhY2tlZFVJbnQzMCgpOwogICAgcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsgLy8gQ29udGVudHMgbGVuZ3RoCgogICAgX2luZGV4VGFibGUgPSBuZXcgTGlzdDxPYmplY3RIYW5kbGU+KG51bUVudHJpZXMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyArK2kpIHsKICAgICAgZmluYWwgaW50IGhlYWRlciA9IHJlYWRlci5yZWFkUGFja2VkVUludDMwKCk7CiAgICAgIF9pbmRleFRhYmxlW2ldID0gbmV3IE9iamVjdEhhbmRsZS5fcmVhZChyZWFkZXIsIGhlYWRlcikKICAgICAgICAuLl9yZWZlcmVuY2UgPSBPYmplY3RIYW5kbGUuX21ha2VSZWZlcmVuY2UoaSk7CiAgICB9CiAgICAvLyBTa2lwIGluZGV4IHRhYmxlLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyArK2kpIHsKICAgICAgcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlbG4oJ09iamVjdFRhYmxlIHsnKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2luZGV4VGFibGUubGVuZ3RoOyArK2kpIHsKICAgICAgZmluYWwgb2JqID0gX2luZGV4VGFibGVbaV07CiAgICAgIHNiLndyaXRlbG4oJyAgWyRpXSA9ICR7b2JqZWN0S2luZFRvU3RyaW5nKG9iai5raW5kKX0gJG9iaicpOwogICAgfQogICAgc2Iud3JpdGVsbignfScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBfTm9kZVZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yPE9iamVjdEhhbmRsZT4gewogIGZpbmFsIE9iamVjdFRhYmxlIG9iamVjdFRhYmxlOwogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgX3R5cGVQYXJhbWV0ZXJzID0gPFR5cGVQYXJhbWV0ZXIsIE9iamVjdEhhbmRsZT57fTsKICBmaW5hbCBNYXA8RGFydFR5cGUsIGludD4gX3JlY3Vyc2l2ZVR5cGVJZHMgPSA8RGFydFR5cGUsIGludD57fTsKICBmaW5hbCByZWN1cnNpdmVUeXBlc1ZhbGlkYXRvcjsKCiAgX05vZGVWaXNpdG9yKHRoaXMub2JqZWN0VGFibGUsIHRoaXMuY29yZVR5cGVzKQogICAgICA6IHJlY3Vyc2l2ZVR5cGVzVmFsaWRhdG9yID0gbmV3IFJlY3Vyc2l2ZVR5cGVzVmFsaWRhdG9yKGNvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSBkZWZhdWx0Tm9kZShOb2RlIG5vZGUpID0+CiAgICAgIHRocm93ICdVbmV4cGVjdGVkIG5vZGUgJHtub2RlLnJ1bnRpbWVUeXBlfSAkbm9kZSc7CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICBmaW5hbCB1cmkgPSBvYmplY3RUYWJsZS5nZXRDb25zdFN0cmluZ0hhbmRsZShub2RlLmltcG9ydFVyaS50b1N0cmluZygpKTsKICAgIHJldHVybiBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChuZXcgX0xpYnJhcnlIYW5kbGUodXJpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBPYmplY3RIYW5kbGUgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBmaW5hbCBPYmplY3RIYW5kbGUgbGlicmFyeSA9IG9iamVjdFRhYmxlLmdldEhhbmRsZShub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgZmluYWwgbmFtZSA9IG5vZGUubmFtZS5zdGFydHNXaXRoKCdfJykKICAgICAgICA/IG9iamVjdFRhYmxlLmdldE9yQWRkT2JqZWN0KG5ldyBfUHJpdmF0ZU5hbWVIYW5kbGUobGlicmFyeSwgbm9kZS5uYW1lKSkKICAgICAgICA6IG9iamVjdFRhYmxlLmdldFB1YmxpY05hbWVIYW5kbGUobm9kZS5uYW1lKTsKICAgIHJldHVybiBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChuZXcgX0NsYXNzSGFuZGxlKGxpYnJhcnksIG5hbWUpKTsKICB9CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSBkZWZhdWx0TWVtYmVyKE1lbWJlciBub2RlKSA9PiBvYmplY3RUYWJsZS5nZXRNZW1iZXJIYW5kbGUobm9kZSk7CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpID0+IG9iamVjdFRhYmxlLl9keW5hbWljVHlwZTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgPT4gb2JqZWN0VGFibGUuX3ZvaWRUeXBlOwoKICBAb3ZlcnJpZGUKICBPYmplY3RIYW5kbGUgdmlzaXROZXZlclR5cGUoTmV2ZXJUeXBlIG5vZGUpID0+CiAgICAgIG9iamVjdFRhYmxlLmdldE9yQWRkT2JqZWN0KG5ldyBfTmV2ZXJUeXBlSGFuZGxlKG5vZGUubnVsbGFiaWxpdHkpKTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+CiAgICAgIC8vIE1hcCBCb3R0b20gdHlwZSB0byBOdWxsIHR5cGUgdW50aWwgbm90IGVtaXR0ZWQgYnkgQ0ZFIGFueW1vcmUuCiAgICAgIG9iamVjdFRhYmxlLmdldEhhbmRsZShjb3JlVHlwZXMubnVsbFR5cGUpOwoKICBAb3ZlcnJpZGUKICBPYmplY3RIYW5kbGUgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgZmluYWwgY2xhc3NIYW5kbGUgPSBvYmplY3RUYWJsZS5nZXRIYW5kbGUobm9kZS5jbGFzc05vZGUpOwogICAgaWYgKCFoYXNJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKG5vZGUuY2xhc3NOb2RlKSkgewogICAgICByZXR1cm4gb2JqZWN0VGFibGUKICAgICAgICAgIC5nZXRPckFkZE9iamVjdChuZXcgX1NpbXBsZVR5cGVIYW5kbGUoY2xhc3NIYW5kbGUsIG5vZGUubnVsbGFiaWxpdHkpKTsKICAgIH0KCiAgICAvLyBOb24tZmluYWxpemVkIHR5cGVzIGFyZSBub3QgcmVjdXJzaXZlLCBidXQgZmluYWxpemF0aW9uIG9mCiAgICAvLyBnZW5lcmljIHR5cGVzIGluY2x1ZGVzIGZsYXR0ZW5pbmcgb2YgdHlwZSBhcmd1bWVudHMgYW5kIHR5cGVzIGNvdWxkCiAgICAvLyBiZWNvbWUgcmVjdXJzaXZlLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CiAgICAvLwogICAgLy8gIGNsYXNzIEJhc2U8VD4ge30KICAgIC8vICBjbGFzcyBGb288VD4gZXh0ZW5kcyBCYXNlPEZvbzxUPj4ge30KICAgIC8vCiAgICAvLyAgRm9vPGludD4gaXMgbm90IHJlY3Vyc2l2ZSwgYnV0IGZpbmFsaXplZCB0eXBlIGlzIHJlY3Vyc2l2ZToKICAgIC8vICBGb288aW50PiogPSBGb28gWyBCYXNlIFsgRm9vPGludD4qIF0sIGludCBdCiAgICAvLwogICAgLy8gT2JqZWN0IHRhYmxlIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNhbm5vdCBoYW5kbGUgY3ljbGVzIGJldHdlZW4KICAgIC8vIG9iamVjdHMsIHNvIHJlY3Vyc2l2ZSB0eXBlcyByZXF1aXJlIGV4dHJhIGNhcmUgd2hlbiBzZXJpYWxpemluZy4KICAgIC8vIEJhY2sgcmVmZXJlbmNlcyB0byB0aGUgYWxyZWFkeSBzZXJpYWxpemVkIHR5cGVzIGFyZSByZXByZXNlbnRlZCBhcwogICAgLy8gX1JlY3Vyc2l2ZVR5cGVSZWZIYW5kbGUgb2JqZWN0cywgd2hpY2ggYXJlIG9ubHkgdmFsaWQgaW4gdGhlIGNvbnRleHQKICAgIC8vIG9mIGVuY2xvc2luZyB0b3AtbGV2ZWwgX1JlY3Vyc2l2ZUdlbmVyaWNUeXBlLgogICAgLy8KICAgIGludCByZWN1cnNpdmVJZCA9IF9yZWN1cnNpdmVUeXBlSWRzW25vZGVdOwogICAgaWYgKHJlY3Vyc2l2ZUlkICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG9iamVjdFRhYmxlCiAgICAgICAgICAuZ2V0T3JBZGRPYmplY3QobmV3IF9SZWN1cnNpdmVUeXBlUmVmSGFuZGxlKHJlY3Vyc2l2ZUlkKSk7CiAgICB9CgogICAgcmVjdXJzaXZlVHlwZXNWYWxpZGF0b3IudmFsaWRhdGVUeXBlKG5vZGUpOwoKICAgIGZpbmFsIGlzUmVjdXJzaXZlID0gcmVjdXJzaXZlVHlwZXNWYWxpZGF0b3IuaXNSZWN1cnNpdmUobm9kZSk7CiAgICBpZiAoaXNSZWN1cnNpdmUpIHsKICAgICAgcmVjdXJzaXZlSWQgPSBfcmVjdXJzaXZlVHlwZUlkcy5sZW5ndGg7CiAgICAgIF9yZWN1cnNpdmVUeXBlSWRzW25vZGVdID0gcmVjdXJzaXZlSWQ7CiAgICB9CgogICAgTGlzdDxEYXJ0VHlwZT4gaW5zdGFudGlhdG9yQXJncyA9CiAgICAgICAgZ2V0SW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cyhub2RlLmNsYXNzTm9kZSwgbm9kZS50eXBlQXJndW1lbnRzKTsKICAgIE9iamVjdEhhbmRsZSB0eXBlQXJnc0hhbmRsZSA9CiAgICAgICAgb2JqZWN0VGFibGUuZ2V0VHlwZUFyZ3VtZW50c0hhbmRsZShpbnN0YW50aWF0b3JBcmdzKTsKCiAgICBmaW5hbCByZXN1bHQgPSBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChpc1JlY3Vyc2l2ZQogICAgICAgID8gbmV3IF9SZWN1cnNpdmVHZW5lcmljVHlwZUhhbmRsZSgKICAgICAgICAgICAgcmVjdXJzaXZlSWQsIGNsYXNzSGFuZGxlLCB0eXBlQXJnc0hhbmRsZSwgbm9kZS5udWxsYWJpbGl0eSkKICAgICAgICA6IG5ldyBfR2VuZXJpY1R5cGVIYW5kbGUoCiAgICAgICAgICAgIGNsYXNzSGFuZGxlLCB0eXBlQXJnc0hhbmRsZSwgbm9kZS5udWxsYWJpbGl0eSkpOwoKICAgIGlmIChpc1JlY3Vyc2l2ZSkgewogICAgICBfcmVjdXJzaXZlVHlwZUlkcy5yZW1vdmUobm9kZSk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIGZpbmFsIHBhcmFtID0gbm9kZS5wYXJhbWV0ZXI7CiAgICBmaW5hbCBoYW5kbGUgPSBfdHlwZVBhcmFtZXRlcnNbcGFyYW1dOwogICAgaWYgKGhhbmRsZSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIHR5cGVQYXJhbWV0ZXJIYW5kbGUgPSBoYW5kbGUgYXMgX1R5cGVQYXJhbWV0ZXJIYW5kbGU7CiAgICAgIGlmICh0eXBlUGFyYW1ldGVySGFuZGxlLm51bGxhYmlsaXR5ID09IG5vZGUubnVsbGFiaWxpdHkpIHsKICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgICB9CiAgICAgIHJldHVybiBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChuZXcgX1R5cGVQYXJhbWV0ZXJIYW5kbGUoCiAgICAgICAgICB0eXBlUGFyYW1ldGVySGFuZGxlLnBhcmVudCwKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJIYW5kbGUuaW5kZXhJblBhcmVudCwKICAgICAgICAgIG5vZGUubnVsbGFiaWxpdHkpKTsKICAgIH0KCiAgICBmaW5hbCBwYXJlbnQgPSBwYXJhbS5wYXJlbnQ7CiAgICBpZiAocGFyZW50ID09IG51bGwpIHsKICAgICAgdGhyb3cgJ1R5cGUgcGFyYW1ldGVyICRwYXJhbSB3aXRob3V0IHBhcmVudCwgYnV0IG5vdCBkZWNsYXJlZCBieSBmdW5jdGlvbiB0eXBlJzsKICAgIH0KCiAgICBPYmplY3RIYW5kbGUgcGFyZW50SGFuZGxlOwogICAgaW50IGluZGV4SW5QYXJlbnQ7CiAgICBpZiAocGFyZW50IGlzIENsYXNzKSB7CiAgICAgIHBhcmVudEhhbmRsZSA9IG9iamVjdFRhYmxlLmdldEhhbmRsZShwYXJlbnQpOwogICAgICBpbmRleEluUGFyZW50ID0gcGFyZW50LnR5cGVQYXJhbWV0ZXJzLmluZGV4T2YocGFyYW0pOwogICAgICBpZiAoaW5kZXhJblBhcmVudCA8IDApIHsKICAgICAgICB0aHJvdyAnVHlwZSBwYXJhbWV0ZXIgJHBhcmFtIGlzIG5vdCBmb3VuZCBpbiBpdHMgcGFyZW50IGNsYXNzICRwYXJlbnQnOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBGdW5jdGlvbk5vZGUpIHsKICAgICAgZmluYWwgZnVuY1BhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgIGlmIChmdW5jUGFyZW50IGlzIE1lbWJlcikgewogICAgICAgIHBhcmVudEhhbmRsZSA9IG9iamVjdFRhYmxlLmdldEhhbmRsZShmdW5jUGFyZW50KTsKICAgICAgfSBlbHNlIGlmIChmdW5jUGFyZW50IGlzIEZ1bmN0aW9uRXhwcmVzc2lvbiB8fAogICAgICAgICAgZnVuY1BhcmVudCBpcyBGdW5jdGlvbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgcGFyZW50SGFuZGxlID0gb2JqZWN0VGFibGUuZ2V0SGFuZGxlKHBhcmVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgcGFyZW50IG9mIEZ1bmN0aW9uTm9kZTogJHtmdW5jUGFyZW50LnJ1bnRpbWVUeXBlfSAkZnVuY1BhcmVudCc7CiAgICAgIH0KICAgICAgaW5kZXhJblBhcmVudCA9IHBhcmVudC50eXBlUGFyYW1ldGVycy5pbmRleE9mKG5vZGUucGFyYW1ldGVyKTsKICAgICAgaWYgKGluZGV4SW5QYXJlbnQgPCAwKSB7CiAgICAgICAgdGhyb3cgJ1R5cGUgcGFyYW1ldGVyICRwYXJhbSBpcyBub3QgZm91bmQgaW4gaXRzIHBhcmVudCBmdW5jdGlvbiAkcGFyZW50JzsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgcGFyZW50IG9mIFR5cGVQYXJhbWV0ZXI6ICR7cGFyZW50LnJ1bnRpbWVUeXBlfSAkcGFyZW50JzsKICAgIH0KICAgIHJldHVybiBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChuZXcgX1R5cGVQYXJhbWV0ZXJIYW5kbGUoCiAgICAgICAgcGFyZW50SGFuZGxlLCBpbmRleEluUGFyZW50LCBub2RlLm51bGxhYmlsaXR5KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBPYmplY3RIYW5kbGUgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGZpbmFsIGludCBudW1FbmNsb3NpbmdUeXBlUGFyYW1ldGVycyA9IF90eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgX3R5cGVQYXJhbWV0ZXJzW25vZGUudHlwZVBhcmFtZXRlcnNbaV1dID0gb2JqZWN0VGFibGUuZ2V0T3JBZGRPYmplY3QoCiAgICAgICAgICBuZXcgX1R5cGVQYXJhbWV0ZXJIYW5kbGUoCiAgICAgICAgICAgICAgbnVsbCwgbnVtRW5jbG9zaW5nVHlwZVBhcmFtZXRlcnMgKyBpLCBOdWxsYWJpbGl0eS5sZWdhY3kpKTsKICAgICAgLy8gTnVsbGFiaWxpdHkubGVnYWN5IGlzIGEgZHVtbXkgdmFsdWUsIHNpbmNlIFR5cGVQYXJhbWV0ZXIgZG9lcyBub3QKICAgICAgLy8gc3BlY2lmeSBudWxsYWJpbGl0eSwgb25seSB0aGUgcmVmZXJlbmNlIHRvIGEgVHlwZVBhcmFtZXRlciBkb2VzLCBpLmUuCiAgICAgIC8vIFR5cGVQYXJhbWV0ZXJUeXBlLgogICAgfQoKICAgIGZpbmFsIHBvc2l0aW9uYWxQYXJhbXMgPSBuZXcgTGlzdDxfVHlwZUhhbmRsZT4oKTsKICAgIGZvciAodmFyIHBhcmFtIGluIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgcG9zaXRpb25hbFBhcmFtcy5hZGQob2JqZWN0VGFibGUuZ2V0SGFuZGxlKHBhcmFtKSk7CiAgICB9CiAgICBmaW5hbCBuYW1lZFBhcmFtcyA9IG5ldyBMaXN0PE5hbWVBbmRUeXBlPigpOwogICAgZm9yICh2YXIgcGFyYW0gaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgbmFtZWRQYXJhbXMuYWRkKG5ldyBOYW1lQW5kVHlwZSgKICAgICAgICAgIG9iamVjdFRhYmxlLmdldFB1YmxpY05hbWVIYW5kbGUocGFyYW0ubmFtZSksCiAgICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUocGFyYW0udHlwZSkpKTsKICAgIH0KICAgIGZpbmFsIHJldHVyblR5cGUgPSBvYmplY3RUYWJsZS5nZXRIYW5kbGUobm9kZS5yZXR1cm5UeXBlKTsKCiAgICBmaW5hbCByZXN1bHQgPSBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChuZXcgX0Z1bmN0aW9uVHlwZUhhbmRsZSgKICAgICAgICBvYmplY3RUYWJsZS5nZXRUeXBlUGFyYW1ldGVySGFuZGxlcyhub2RlLnR5cGVQYXJhbWV0ZXJzKSwKICAgICAgICBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtcywKICAgICAgICBuYW1lZFBhcmFtcywKICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIG5vZGUubnVsbGFiaWxpdHkpKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgX3R5cGVQYXJhbWV0ZXJzLnJlbW92ZShub2RlLnR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgPT4KICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKG5vZGUudW5hbGlhcyk7CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBub2RlKSA9PiBvYmplY3RUYWJsZQogICAgICAuZ2V0T3JBZGRPYmplY3QobmV3IF9Db25zdE9iamVjdEhhbmRsZShDb25zdFRhZy5rQm9vbCwgbm9kZS52YWx1ZSkpOwoKICBAb3ZlcnJpZGUKICBPYmplY3RIYW5kbGUgdmlzaXRJbnRDb25zdGFudChJbnRDb25zdGFudCBub2RlKSA9PiBvYmplY3RUYWJsZQogICAgICAuZ2V0T3JBZGRPYmplY3QobmV3IF9Db25zdE9iamVjdEhhbmRsZShDb25zdFRhZy5rSW50LCBub2RlLnZhbHVlKSk7CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSB2aXNpdERvdWJsZUNvbnN0YW50KERvdWJsZUNvbnN0YW50IG5vZGUpID0+IG9iamVjdFRhYmxlCiAgICAgIC5nZXRPckFkZE9iamVjdChuZXcgX0NvbnN0T2JqZWN0SGFuZGxlKENvbnN0VGFnLmtEb3VibGUsIG5vZGUudmFsdWUpKTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgPT4KICAgICAgb2JqZWN0VGFibGUuZ2V0Q29uc3RTdHJpbmdIYW5kbGUobm9kZS52YWx1ZSk7CgogIEBvdmVycmlkZQogIE9iamVjdEhhbmRsZSB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpID0+CiAgICAgIG9iamVjdFRhYmxlLmdldE9yQWRkT2JqZWN0KG5ldyBfQ29uc3RPYmplY3RIYW5kbGUoCiAgICAgICAgICBDb25zdFRhZy5rU3ltYm9sLAogICAgICAgICAgb2JqZWN0VGFibGUuZ2V0TmFtZUhhbmRsZSgKICAgICAgICAgICAgICBub2RlLmxpYnJhcnlSZWZlcmVuY2U/LmFzTGlicmFyeSwgbm9kZS5uYW1lKSkpOwoKICBAb3ZlcnJpZGUKICBPYmplY3RIYW5kbGUgdmlzaXRMaXN0Q29uc3RhbnQoTGlzdENvbnN0YW50IG5vZGUpID0+CiAgICAgIG9iamVjdFRhYmxlLmdldE9yQWRkT2JqZWN0KG5ldyBfQ29uc3RPYmplY3RIYW5kbGUoCiAgICAgICAgICBDb25zdFRhZy5rTGlzdCwKICAgICAgICAgIG9iamVjdFRhYmxlLmdldEhhbmRsZXMobm9kZS5lbnRyaWVzKSwKICAgICAgICAgIG9iamVjdFRhYmxlLmdldEhhbmRsZShub2RlLnR5cGVBcmd1bWVudCkpKTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpID0+CiAgICAgIG9iamVjdFRhYmxlLmdldE9yQWRkT2JqZWN0KG5ldyBfQ29uc3RPYmplY3RIYW5kbGUoCiAgICAgICAgICBDb25zdFRhZy5rSW5zdGFuY2UsCiAgICAgICAgICBub2RlLmZpZWxkVmFsdWVzLm1hcDxPYmplY3RIYW5kbGUsIE9iamVjdEhhbmRsZT4oCiAgICAgICAgICAgICAgKFJlZmVyZW5jZSBmaWVsZFJlZiwgQ29uc3RhbnQgdmFsdWUpID0+IG5ldyBNYXBFbnRyeSgKICAgICAgICAgICAgICAgICAgb2JqZWN0VGFibGUuZ2V0SGFuZGxlKGZpZWxkUmVmLmFzRmllbGQpLAogICAgICAgICAgICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUodmFsdWUpKSksCiAgICAgICAgICBvYmplY3RUYWJsZS5nZXRIYW5kbGUobmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgICAgbm9kZS5jbGFzc05vZGUsIE51bGxhYmlsaXR5LmxlZ2FjeSwgbm9kZS50eXBlQXJndW1lbnRzKSkpKTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0SGFuZGxlIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSA9PgogICAgICBvYmplY3RUYWJsZS5nZXRPckFkZE9iamVjdChuZXcgX0NvbnN0T2JqZWN0SGFuZGxlKAogICAgICAgICAgQ29uc3RUYWcua1Rl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ATFKAQwpOQEMLE1ABAEMKE8rUTZIBAEMUAEMTwEMRgEMMUoBDDNIMQEMOD85GVEGAUJLOQcZLQdENAdPSEpMNQcvHxlFBgEwAUMXLi0GASZKIj4BOitIIj0BFyYGARMEAQxAIisaQkEXCEImLR4GASEaVwYBHxcbNDwfUAgpKCI6NS82D1oIRR9TCA1RBkA5BAEMNkM7TCRKS08cBgE2MzoGMS4nNy8GPwFHQiUaFRQcATs2BgETBAEMNSsBDD0BDENLAQxBSgEMR00BDDs0AQw7ORwlPgEMNzkaMDYBDD85HjxEOzIzSgEMPTlGAQxFKAEMMjA5Kjc8AgEsOAElcGFja2FnZTp2bS9ieXRlY29kZS9vYmplY3RfdGFibGUuZGFydFdmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvcmVjb2duaXplZF9tZXRob2RzLmRhcnSLqS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLmJ5dGVjb2RlLnJlY29nbml6ZWRfbWV0aG9kczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBTdGF0aWNUeXBlQ29udGV4dDsKCmltcG9ydCAnZGJjLmRhcnQnOwppbXBvcnQgJ2dlbmVyaWNzLmRhcnQnIHNob3cgZ2V0U3RhdGljVHlwZTsKCmNsYXNzIFJlY29nbml6ZWRNZXRob2RzIHsKICBzdGF0aWMgY29uc3QgYmluYXJ5SW50T3BzID0gPFN0cmluZywgT3Bjb2RlPnsKICAgICcrJzogT3Bjb2RlLmtBZGRJbnQsCiAgICAnLSc6IE9wY29kZS5rU3ViSW50LAogICAgJyonOiBPcGNvZGUua011bEludCwKICAgICd+Lyc6IE9wY29kZS5rVHJ1bmNEaXZJbnQsCiAgICAnJSc6IE9wY29kZS5rTW9kSW50LAogICAgJyYnOiBPcGNvZGUua0JpdEFuZEludCwKICAgICd8JzogT3Bjb2RlLmtCaXRPckludCwKICAgICdeJzogT3Bjb2RlLmtCaXRYb3JJbnQsCiAgICAnPDwnOiBPcGNvZGUua1NobEludCwKICAgICc+Pic6IE9wY29kZS5rU2hySW50LAogICAgJz09JzogT3Bjb2RlLmtDb21wYXJlSW50RXEsCiAgICAnPic6IE9wY29kZS5rQ29tcGFyZUludEd0LAogICAgJzwnOiBPcGNvZGUua0NvbXBhcmVJbnRMdCwKICAgICc+PSc6IE9wY29kZS5rQ29tcGFyZUludEdlLAogICAgJzw9JzogT3Bjb2RlLmtDb21wYXJlSW50TGUsCiAgfTsKCiAgc3RhdGljIGNvbnN0IGJpbmFyeURvdWJsZU9wcyA9IDxTdHJpbmcsIE9wY29kZT57CiAgICAnKyc6IE9wY29kZS5rQWRkRG91YmxlLAogICAgJy0nOiBPcGNvZGUua1N1YkRvdWJsZSwKICAgICcqJzogT3Bjb2RlLmtNdWxEb3VibGUsCiAgICAnLyc6IE9wY29kZS5rRGl2RG91YmxlLAogICAgJz09JzogT3Bjb2RlLmtDb21wYXJlRG91YmxlRXEsCiAgICAnPic6IE9wY29kZS5rQ29tcGFyZURvdWJsZUd0LAogICAgJzwnOiBPcGNvZGUua0NvbXBhcmVEb3VibGVMdCwKICAgICc+PSc6IE9wY29kZS5rQ29tcGFyZURvdWJsZUdlLAogICAgJzw9JzogT3Bjb2RlLmtDb21wYXJlRG91YmxlTGUsCiAgfTsKCiAgZmluYWwgU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQ7CgogIFJlY29nbml6ZWRNZXRob2RzKHRoaXMuc3RhdGljVHlwZUNvbnRleHQpOwoKICBEYXJ0VHlwZSBzdGF0aWNUeXBlKEV4cHJlc3Npb24gZXhwcikgPT4KICAgICAgZ2V0U3RhdGljVHlwZShleHByLCBzdGF0aWNUeXBlQ29udGV4dCk7CgogIGJvb2wgaXNJbnQoRGFydFR5cGUgdHlwZSkgPT4KICAgICAgdHlwZSA9PSBzdGF0aWNUeXBlQ29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmludExlZ2FjeVJhd1R5cGU7CgogIGJvb2wgaXNEb3VibGUoRGFydFR5cGUgdHlwZSkgPT4KICAgICAgdHlwZSA9PSBzdGF0aWNUeXBlQ29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmRvdWJsZUxlZ2FjeVJhd1R5cGU7CgogIE9wY29kZSBzcGVjaWFsaXplZEJ5dGVjb2RlRm9yKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgZmluYWwgYXJncyA9IG5vZGUuYXJndW1lbnRzOwogICAgaWYgKCFhcmdzLm5hbWVkLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlciA9IG5vZGUucmVjZWl2ZXI7CiAgICBmaW5hbCBTdHJpbmcgc2VsZWN0b3IgPSBub2RlLm5hbWUubmFtZTsKCiAgICBzd2l0Y2ggKGFyZ3MucG9zaXRpb25hbC5sZW5ndGgpIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiBzcGVjaWFsaXplZEJ5dGVjb2RlRm9yVW5hcnlPcChzZWxlY3RvciwgcmVjZWl2ZXIpOwogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuIHNwZWNpYWxpemVkQnl0ZWNvZGVGb3JCaW5hcnlPcCgKICAgICAgICAgICAgc2VsZWN0b3IsIHJlY2VpdmVyLCBhcmdzLnBvc2l0aW9uYWwuc2luZ2xlKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIE9wY29kZSBzcGVjaWFsaXplZEJ5dGVjb2RlRm9yVW5hcnlPcChTdHJpbmcgc2VsZWN0b3IsIEV4cHJlc3Npb24gYXJnKSB7CiAgICBpZiAoc2VsZWN0b3IgPT0gJ3VuYXJ5LScpIHsKICAgICAgZmluYWwgYXJnVHlwZSA9IHN0YXRpY1R5cGUoYXJnKTsKICAgICAgaWYgKGlzSW50KGFyZ1R5cGUpKSB7CiAgICAgICAgcmV0dXJuIE9wY29kZS5rTmVnYXRlSW50OwogICAgICB9IGVsc2UgaWYgKGlzRG91YmxlKGFyZ1R5cGUpKSB7CiAgICAgICAgcmV0dXJuIE9wY29kZS5rTmVnYXRlRG91YmxlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBPcGNvZGUgc3BlY2lhbGl6ZWRCeXRlY29kZUZvckJpbmFyeU9wKAogICAgICBTdHJpbmcgc2VsZWN0b3IsIEV4cHJlc3Npb24gYSwgRXhwcmVzc2lvbiBiKSB7CiAgICBpZiAoc2VsZWN0b3IgPT0gJz09JyAmJiAoYSBpcyBOdWxsTGl0ZXJhbCB8fCBiIGlzIE51bGxMaXRlcmFsKSkgewogICAgICByZXR1cm4gT3Bjb2RlLmtFcXVhbHNOdWxsOwogICAgfQoKICAgIGZpbmFsIGFUeXBlID0gc3RhdGljVHlwZShhKTsKICAgIGZpbmFsIGJUeXBlID0gc3RhdGljVHlwZShiKTsKCiAgICBpZiAoaXNJbnQoYVR5cGUpICYmIGlzSW50KGJUeXBlKSkgewogICAgICByZXR1cm4gYmluYXJ5SW50T3BzW3NlbGVjdG9yXTsKICAgIH0KICAgIGlmIChpc0RvdWJsZShhVHlwZSkgJiYgaXNEb3VibGUoYlR5cGUpKSB7CiAgICAgIHJldHVybiBiaW5hcnlEb3VibGVPcHNbc2VsZWN0b3JdOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9Cm0ATk48ASgBIkYBEysBGjAZGRkfGRwbHBoaIB8fICAFATMcHBwcIyIiIyMFAS0BLQEqLgEfTAEiTwE5IR8TBgEvLAEmDkIOLzkPFQYEAUogJxwiJiUIBgERBAEpNUYhBgEhIQEoJQYuKAYRBAIBK3BhY2thZ2U6dm0vYnl0ZWNvZGUvcmVjb2duaXplZF9tZXRob2RzLmRhcnReZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL2J5dGVjb2RlL3JlY3Vyc2l2ZV90eXBlc192YWxpZGF0b3IuZGFydJP+Ly8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0uYnl0ZWNvZGUucmVjdXJzaXZlX3R5cGVzX3ZhbGlkYXRvcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ2dlbmVyaWNzLmRhcnQnCiAgICBzaG93IGZsYXR0ZW5JbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLCBoYXNGcmVlVHlwZVBhcmFtZXRlcnM7CgovLy8gRGV0ZWN0IHJlY3Vyc2l2ZSB0eXBlcyBhbmQgdmFsaWRhdGVzIHRoYXQgZmluYWxpemVkIChmbGF0dGVuZWQpCi8vLyByZXByZXNlbnRhdGlvbiBvZiBnZW5lcmljIHR5cGVzIGlzIHZhbGlkIChmaW5pdGUpLgpjbGFzcyBSZWN1cnNpdmVUeXBlc1ZhbGlkYXRvciB7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKICBmaW5hbCBTZXQ8RGFydFR5cGU+IF92YWxpZGF0ZWRUeXBlcyA9IDxEYXJ0VHlwZT57fTsKICBmaW5hbCBTZXQ8RGFydFR5cGU+IF9yZWN1cnNpdmVUeXBlcyA9IDxEYXJ0VHlwZT57fTsKICBmaW5hbCBTZXQ8Q2xhc3M+IF92YWxpZGF0ZWRDbGFzZXMgPSA8Q2xhc3M+e307CgogIFJlY3Vyc2l2ZVR5cGVzVmFsaWRhdG9yKHRoaXMuY29yZVR5cGVzKTsKCiAgLy8vIFZhbGlkYXRlcyBbdHlwZV0uCiAgdm9pZCB2YWxpZGF0ZVR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKCFpc1ZhbGlkYXRlZCh0eXBlKSkgewogICAgICBmaW5hbCB2aXNpdG9yID0gbmV3IF9SZWN1cnNpdmVUeXBlc1Zpc2l0b3IodGhpcyk7CiAgICAgIHZpc2l0b3IudmlzaXQodHlwZSk7CiAgICAgIF92YWxpZGF0ZWRUeXBlcy5hZGRBbGwodmlzaXRvci52YWxpZGF0ZWQpOwogICAgICBfcmVjdXJzaXZlVHlwZXMuYWRkQWxsKHZpc2l0b3IucmVjdXJzaXZlKTsKICAgIH0KICB9CgogIGJvb2wgaXNWYWxpZGF0ZWQoRGFydFR5cGUgdHlwZSkgPT4gX3ZhbGlkYXRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFt0eXBlXSBpcyByZWN1cnNpdmUuCiAgLy8vIFNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciB2YWxpZGF0aW5nIFt0eXBlXS4KICBib29sIGlzUmVjdXJzaXZlKERhcnRUeXBlIHR5cGUpIHsKICAgIGFzc2VydChpc1ZhbGlkYXRlZCh0eXBlKSk7CiAgICByZXR1cm4gX3JlY3Vyc2l2ZVR5cGVzLmNvbnRhaW5zKHR5cGUpOwogIH0KCiAgdm9pZCB2YWxpZGF0ZUNsYXNzKENsYXNzIGNscykgewogICAgaWYgKF92YWxpZGF0ZWRDbGFzZXMuYWRkKGNscykpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YWxpZGF0ZVR5cGUoCiAgICAgICAgICAgIGNscy5nZXRUaGlzVHlwZShjb3JlVHlwZXMsIGNscy5lbmNsb3NpbmdMaWJyYXJ5Lm5vbk51bGxhYmxlKSk7CiAgICAgIH0gb24gSWxsZWdhbFJlY3Vyc2l2ZVR5cGVFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgICBfdmFsaWRhdGVkQ2xhc2VzLnJlbW92ZShjbHMpOwogICAgICAgIHRocm93IGU7CiAgICAgIH0KICAgIH0KICB9Cn0KCmNsYXNzIElsbGVnYWxSZWN1cnNpdmVUeXBlRXhjZXB0aW9uIHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIElsbGVnYWxSZWN1cnNpdmVUeXBlRXhjZXB0aW9uKHRoaXMudHlwZSk7Cn0KCmNsYXNzIF9SZWN1cnNpdmVUeXBlc1Zpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8dm9pZD4gewogIGZpbmFsIFJlY3Vyc2l2ZVR5cGVzVmFsaWRhdG9yIHZhbGlkYXRvcjsKICBmaW5hbCBTZXQ8RGFydFR5cGU+IHZhbGlkYXRlZCA9IDxEYXJ0VHlwZT57fTsKICBmaW5hbCBTZXQ8RGFydFR5cGU+IHJlY3Vyc2l2ZSA9IDxEYXJ0VHlwZT57fTsKICBmaW5hbCBTZXQ8RGFydFR5cGU+IF92aXNpdGVkID0gbmV3IFNldDxEYXJ0VHlwZT4oKTsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBfc3RhY2sgPSA8RGFydFR5cGU+W107CgogIF9SZWN1cnNpdmVUeXBlc1Zpc2l0b3IodGhpcy52YWxpZGF0b3IpOwoKICB2b2lkIHZpc2l0KERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh2YWxpZGF0b3IuaXNWYWxpZGF0ZWQodHlwZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghX3Zpc2l0ZWQuYWRkKHR5cGUpKSB7CiAgICAgIGZpbmFsIGludCBzdGFydCA9IF9zdGFjay5sYXN0SW5kZXhPZih0eXBlKTsKICAgICAgX3ZlcmlmeVJlY3Vyc2l2ZVR5cGUoc3RhcnQsIHR5cGUpOwogICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBfc3RhY2subGVuZ3RoOyArK2kpIHsKICAgICAgICByZWN1cnNpdmUuYWRkKF9zdGFja1tpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIF9zdGFjay5hZGQodHlwZSk7CgogICAgdHlwZS5hY2NlcHQodGhpcyk7CgogICAgX3N0YWNrLnJlbW92ZUxhc3QoKTsKICAgIF92aXNpdGVkLnJlbW92ZSh0eXBlKTsKCiAgICB2YWxpZGF0ZWQuYWRkKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgPT4KICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgdHlwZSAke25vZGUucnVudGltZVR5cGV9ICRub2RlJzsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICAvLyBWYWxpZGF0ZSBjbGFzcyBkZWNsYXJhdGlvbiB0eXBlIHNlcGFyYXRlbHkKICAgIC8vIHRvIGF2b2lkIGZhaWx1cmVzIGR1ZSB0byB0eXBlcyBpbiB0aGUgY3VycmVudCBfc3RhY2suCiAgICB2YWxpZGF0b3IudmFsaWRhdGVDbGFzcyhub2RlLmNsYXNzTm9kZSk7CgogICAgZm9yICh2YXIgdHlwZUFyZyBpbiBub2RlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgdmlzaXQodHlwZUFyZyk7CiAgICB9CiAgICBmaW5hbCBmbGF0VHlwZUFyZ3MgPQogICAgICAgIGZsYXR0ZW5JbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzKG5vZGUuY2xhc3NOb2RlLCBub2RlLnR5cGVBcmd1bWVudHMpOwogICAgZm9yICh2YXIgdHlwZUFyZyBpbiBmbGF0VHlwZUFyZ3MuZ2V0UmFuZ2UoCiAgICAgICAgMCwgZmxhdFR5cGVBcmdzLmxlbmd0aCAtIG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpKSB7CiAgICAgIHZpc2l0KHR5cGVBcmcpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpID0+IHZpc2l0KG5vZGUudW5hbGlhcyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGZvciAodmFyIHAgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICB2aXNpdChwKTsKICAgIH0KICAgIGZvciAodmFyIHAgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgdmlzaXQocC50eXBlKTsKICAgIH0KICAgIHZpc2l0KG5vZGUucmV0dXJuVHlwZSk7CiAgfQoKICB2b2lkIF92ZXJpZnlSZWN1cnNpdmVUeXBlKGludCBzdGFydCwgRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAoIWhhc0ZyZWVUeXBlUGFyYW1ldGVycyh0eXBlLnR5cGVBcmd1bWVudHMpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgX3N0YWNrLmxlbmd0aDsgKytpKSB7CiAgICAgICAgZmluYWwgb3RoZXIgPSBfc3RhY2tbaV07CiAgICAgICAgaWYgKG90aGVyIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgICAgb3RoZXIuY2xhc3NOb2RlID09IHR5cGUuY2xhc3NOb2RlICYmCiAgICAgICAgICAgIGhhc0ZyZWVUeXBlUGFyYW1ldGVycyhvdGhlci50eXBlQXJndW1lbnRzKSkgewogICAgICAgICAgaWYgKCFsaXN0RXF1YWxzKF9lcmFzZVR5cGVQYXJhbWV0ZXJzKHR5cGUudHlwZUFyZ3VtZW50cyksCiAgICAgICAgICAgICAgX2VyYXNlVHlwZVBhcmFtZXRlcnMob3RoZXIudHlwZUFyZ3VtZW50cykpKSB7CiAgICAgICAgICAgIHRocm93IElsbGVnYWxSZWN1cnNpdmVUeXBlRXhjZXB0aW9uKHR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgcmVjdXJzaXZlIHR5cGUgJHt0eXBlLnJ1bnRpbWVUeXBlfSAkdHlwZSc7CiAgICB9CiAgfQoKICBMaXN0PERhcnRUeXBlPiBfZXJhc2VUeXBlUGFyYW1ldGVycyhMaXN0PERhcnRUeXBlPiB0eXBlQXJncykgewogICAgcmV0dXJuIHR5cGVBcmdzCiAgICAgICAgLm1hcCgoRGFydFR5cGUgdCkgPT4KICAgICAgICAgICAgY29uc3QgX0VyYXNlVHlwZVBhcmFtZXRlcnNUb0R5bmFtaWMoKS5zdWJzdGl0dXRlVHlwZSh0KSkKICAgICAgICAudG9MaXN0KCk7CiAgfQp9CgpjbGFzcyBfRXJhc2VUeXBlUGFyYW1ldGVyc1RvRHluYW1pYyBleHRlbmRzIFN1YnN0aXR1dGlvbiB7CiAgY29uc3QgX0VyYXNlVHlwZVBhcmFtZXRlcnNUb0R5bmFtaWMoKTsKCiAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7CiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9Cn0KgLkATk48AS8BMDg9ARdCAUQ3IB02NjEBKwEYJR44GzExBgQBRQErNSQfKwQBIiUMFks1JhEIBgQCASYXLAIBPSswMDYuASoBHicOBgEfMik0IggOBgEWARcBGRsBGQQBDCk5AQwtAQwtAQwnAQwrAQwpAQw5AQwwMj0tAS4WBhlOLz8WBgQBDEIBDC4vEAYqFQYcBAE4ITgQCAE4ISYxOkQ8NwwKCA1DBgQBQRQdRRMEAgE7KQFFIAQCATJwYWNrYWdlOnZtL2J5dGVjb2RlL3JlY3Vyc2l2ZV90eXBlc192YWxpZGF0b3IuZGFydFVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvc291cmNlX3Bvc2l0aW9ucy5kYXJ0jxEvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5ieXRlY29kZS5zb3VyY2VfcG9zaXRpb25zOwoKaW1wb3J0ICdieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgQnVmZmVyZWRXcml0ZXIsCiAgICAgICAgQnVmZmVyZWRSZWFkZXIsCiAgICAgICAgQnl0ZWNvZGVEZWNsYXJhdGlvbiwKICAgICAgICBQYWNrZWRVSW50MzBEZWx0YUVuY29kZXIsCiAgICAgICAgUGFja2VkVUludDMwRGVsdGFEZWNvZGVyLAogICAgICAgIFNMRUIxMjhEZWx0YUVuY29kZXIsCiAgICAgICAgU0xFQjEyOERlbHRhRGVjb2RlcjsKCi8vLyBNYWludGFpbnMgbWFwcGluZyBiZXR3ZWVuIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBhbmQgc291cmNlIHBvc2l0aW9ucy4KY2xhc3MgU291cmNlUG9zaXRpb25zIGV4dGVuZHMgQnl0ZWNvZGVEZWNsYXJhdGlvbiB7CiAgLy8gU3BlY2lhbCB2YWx1ZSBvZiBmaWxlT2Zmc2V0IHdoaWNoIG1hcmtzIHN5bnRoZXRpYyBjb2RlIHdpdGhvdXQgc291cmNlCiAgLy8gcG9zaXRpb24uCiAgc3RhdGljIGNvbnN0IHN5bnRoZXRpY0NvZGVNYXJrZXIgPSAtMTsKICAvLyBTcGVjaWFsIHZhbHVlIG9mIGZpbGVPZmZzZXQgd2hpY2ggbWFya3MgeWllbGQgcG9pbnQuCiAgc3RhdGljIGNvbnN0IHlpZWxkUG9pbnRNYXJrZXIgPSAtMjsKCiAgZmluYWwgTGlzdDxpbnQ+IF9wb3NpdGlvbnMgPSA8aW50PltdOyAvLyBQYWlycyAoUEMsIGZpbGVPZmZzZXQpLgogIGludCBfbGFzdFBjID0gMDsKICBpbnQgX2xhc3RPZmZzZXQgPSAwOwoKICBTb3VyY2VQb3NpdGlvbnMoKTsKCiAgdm9pZCBhZGQoaW50IHBjLCBpbnQgZmlsZU9mZnNldCkgewogICAgYXNzZXJ0KHBjID4gX2xhc3RQYyk7CiAgICBhc3NlcnQoKGZpbGVPZmZzZXQgPj0gMCkgfHwgKGZpbGVPZmZzZXQgPT0gc3ludGhldGljQ29kZU1hcmtlcikpOwogICAgaWYgKGZpbGVPZmZzZXQgIT0gX2xhc3RPZmZzZXQpIHsKICAgICAgX3Bvc2l0aW9ucy5hZGQocGMpOwogICAgICBfcG9zaXRpb25zLmFkZChmaWxlT2Zmc2V0KTsKICAgICAgX2xhc3RQYyA9IHBjOwogICAgICBfbGFzdE9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgfQoKICB2b2lkIGFkZFlpZWxkUG9pbnQoaW50IHBjLCBpbnQgZmlsZU9mZnNldCkgewogICAgYXNzZXJ0KHBjID4gX2xhc3RQYyk7CiAgICBhc3NlcnQoKGZpbGVPZmZzZXQgPj0gMCkgfHwgKGZpbGVPZmZzZXQgPT0gc3ludGhldGljQ29kZU1hcmtlcikpOwogICAgX3Bvc2l0aW9ucy5hZGQocGMpOwogICAgX3Bvc2l0aW9ucy5hZGQoeWllbGRQb2ludE1hcmtlcik7CiAgICBfcG9zaXRpb25zLmFkZChwYyk7CiAgICBfcG9zaXRpb25zLmFkZChmaWxlT2Zmc2V0KTsKICAgIF9sYXN0UGMgPSBwYzsKICAgIF9sYXN0T2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3Bvc2l0aW9ucy5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAoX3Bvc2l0aW9ucy5sZW5ndGggfi8gMik7CiAgICBmaW5hbCBlbmNvZGVQQyA9IG5ldyBQYWNrZWRVSW50MzBEZWx0YUVuY29kZXIoKTsKICAgIGZpbmFsIGVuY29kZU9mZnNldCA9IG5ldyBTTEVCMTI4RGVsdGFFbmNvZGVyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9wb3NpdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgZmluYWwgaW50IHBjID0gX3Bvc2l0aW9uc1tpXTsKICAgICAgZmluYWwgaW50IGZpbGVPZmZzZXQgPSBfcG9zaXRpb25zW2kgKyAxXTsKICAgICAgZW5jb2RlUEMud3JpdGUod3JpdGVyLCBwYyk7CiAgICAgIGVuY29kZU9mZnNldC53cml0ZSh3cml0ZXIsIGZpbGVPZmZzZXQpOwogICAgfQogIH0KCiAgU291cmNlUG9zaXRpb25zLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKTsKICAgIGZpbmFsIGRlY29kZVBDID0gbmV3IFBhY2tlZFVJbnQzMERlbHRhRGVjb2RlcigpOwogICAgZmluYWwgZGVjb2RlT2Zmc2V0ID0gbmV3IFNMRUIxMjhEZWx0YURlY29kZXIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgaW50IHBjID0gZGVjb2RlUEMucmVhZChyZWFkZXIpOwogICAgICBpbnQgZmlsZU9mZnNldCA9IGRlY29kZU9mZnNldC5yZWFkKHJlYWRlcik7CiAgICAgIF9wb3NpdGlvbnMuYWRkKHBjKTsKICAgICAgX3Bvc2l0aW9ucy5hZGQoZmlsZU9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfcG9zaXRpb25zLnRvU3RyaW5nKCk7CgogIE1hcDxpbnQsIFN0cmluZz4gZ2V0Qnl0ZWNvZGVBbm5vdGF0aW9ucygpIHsKICAgIGZpbmFsIG1hcCA9IDxpbnQsIFN0cmluZz57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3Bvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMikgewogICAgICBmaW5hbCBpbnQgcGMgPSBfcG9zaXRpb25zW2ldOwogICAgICBmaW5hbCBpbnQgZmlsZU9mZnNldCA9IF9wb3NpdGlvbnNbaSArIDFdOwogICAgICBmaW5hbCBlbnRyeSA9IChmaWxlT2Zmc2V0ID09IHlpZWxkUG9pbnRNYXJrZXIpCiAgICAgICAgICA/ICd5aWVsZCBwb2ludCcKICAgICAgICAgIDogJ3NvdXJjZSBwb3NpdGlvbiAkZmlsZU9mZnNldCc7CiAgICAgIGlmIChtYXBbcGNdID09IG51bGwpIHsKICAgICAgICBtYXBbcGNdID0gZW50cnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWFwW3BjXSA9ICIke21hcFtwY119OyAkZW50cnkiOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KfQoKLy8vIEtlZXBzIGZpbGUgb2Zmc2V0cyBvZiBsaW5lIHN0YXJ0cy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvCi8vLyBkZWNvZGUgc291cmNlIHBvc2l0aW9ucyB0byBsaW5lL2NvbHVtbi4KY2xhc3MgTGluZVN0YXJ0cyBleHRlbmRzIEJ5dGVjb2RlRGVjbGFyYXRpb24gewogIGZpbmFsIExpc3Q8aW50PiBsaW5lU3RhcnRzOwoKICBMaW5lU3RhcnRzKHRoaXMubGluZVN0YXJ0cyk7CgogIHZvaWQgd3JpdGUoQnVmZmVyZWRXcml0ZXIgd3JpdGVyKSB7CiAgICB3cml0ZXIud3JpdGVQYWNrZWRVSW50MzAobGluZVN0YXJ0cy5sZW5ndGgpOwogICAgZmluYWwgZW5jb2RlTGluZVN0YXJ0cyA9IG5ldyBQYWNrZWRVSW50MzBEZWx0YUVuY29kZXIoKTsKICAgIGZvciAoaW50IGxpbmVTdGFydCBpbiBsaW5lU3RhcnRzKSB7CiAgICAgIGVuY29kZUxpbmVTdGFydHMud3JpdGUod3JpdGVyLCBsaW5lU3RhcnQpOwogICAgfQogIH0KCiAgZmFjdG9yeSBMaW5lU3RhcnRzLnJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB7CiAgICBmaW5hbCBkZWNvZGVMaW5lU3RhcnRzID0gbmV3IFBhY2tlZFVJbnQzMERlbHRhRGVjb2RlcigpOwogICAgZmluYWwgbGluZVN0YXJ0cyA9IG5ldyBMaXN0PGludD4uZ2VuZXJhdGUoCiAgICAgICAgcmVhZGVyLnJlYWRQYWNrZWRVSW50MzAoKSwgKF8pID0+IGRlY29kZUxpbmVTdGFydHMucmVhZChyZWFkZXIpKTsKICAgIHJldHVybiBuZXcgTGluZVN0YXJ0cyhsaW5lU3RhcnRzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdMaW5lIHN0YXJ0czogJGxpbmVTdGFydHMnOwp9Cn8ATk48ASYBJQkYGB0iIh0dAUo0Sw8pOiYBQxMXARUBJRpGJRoiFCAGBAEvGkYYJhggEh4EASojASY2NTQ1JDAiLgYEATAyNTQnJjIaIgYEAQwuAS4hNSQwNRorHRkPKAgGEAQCAUMsLx4BHwEmMT0oMQYEATM9L0onBAEMMwIBKXBhY2thZ2U6dm0vYnl0ZWNvZGUvc291cmNlX3Bvc2l0aW9ucy5kYXJ0TWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9tZXRhZGF0YS9ieXRlY29kZS5kYXJ0iFUvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5tZXRhZGF0YS5ieXRlY29kZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IEJpbmFyeVNpbmssIEJpbmFyeVNvdXJjZSwgTWV0YWRhdGFSZXBvc2l0b3J5LCBOb2RlLCBUcmVlTm9kZTsKaW1wb3J0ICcuLi9ieXRlY29kZS9ieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnQnCiAgICBzaG93IEJ1ZmZlcmVkV3JpdGVyLCBCdWZmZXJlZFJlYWRlciwgTGlua1dyaXRlciwgTGlua1JlYWRlcjsKaW1wb3J0ICcuLi9ieXRlY29kZS9kZWNsYXJhdGlvbnMuZGFydCcgc2hvdyBDb21wb25lbnQ7CgppbXBvcnQgJ2RhcnQ6ZGV2ZWxvcGVyJzsKCmNsYXNzIEJ5dGVjb2RlTWV0YWRhdGEgewogIGZpbmFsIENvbXBvbmVudCBjb21wb25lbnQ7CgogIEJ5dGVjb2RlTWV0YWRhdGEodGhpcy5jb21wb25lbnQpOwoKICB2b2lkIHdyaXRlKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcikgewogICAgVGltZWxpbmUudGltZVN5bmMoIkJ5dGVjb2RlTWV0YWRhdGEud3JpdGUiLCAoKSB7CiAgICAgIGNvbXBvbmVudC53cml0ZSh3cml0ZXIpOwogICAgfSk7CiAgfQoKICBmYWN0b3J5IEJ5dGVjb2RlTWV0YWRhdGEucmVhZChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHsKICAgIHJldHVybiBUaW1lbGluZS50aW1lU3luYygiQnl0ZWNvZGVNZXRhZGF0YS5yZWFkIiwgKCkgewogICAgICByZXR1cm4gbmV3IEJ5dGVjb2RlTWV0YWRhdGEobmV3IENvbXBvbmVudC5yZWFkKHJlYWRlcikpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiXG4iCiAgICAgICJCeXRlY29kZU1ldGFkYXRhIHtcbiIKICAgICAgIiRjb21wb25lbnRcbiIKICAgICAgIn1cbiI7Cn0KCi8vLyBSZXBvc2l0b3J5IGZvciBbQnl0ZWNvZGVNZXRhZGF0YV0uCmNsYXNzIEJ5dGVjb2RlTWV0YWRhdGFSZXBvc2l0b3J5IGV4dGVuZHMgTWV0YWRhdGFSZXBvc2l0b3J5PEJ5dGVjb2RlTWV0YWRhdGE+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgdGFnID0gJ3ZtLmJ5dGVjb2RlJzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPFRyZWVOb2RlLCBCeXRlY29kZU1ldGFkYXRhPiBtYXBwaW5nID0KICAgICAgPFRyZWVOb2RlLCBCeXRlY29kZU1ldGFkYXRhPnt9OwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9CaW5hcnkoQnl0ZWNvZGVNZXRhZGF0YSBtZXRhZGF0YSwgTm9kZSBub2RlLCBCaW5hcnlTaW5rIHNpbmspIHsKICAgIGZpbmFsIGJ5dGVjb2RlQ29tcG9uZW50ID0gbWV0YWRhdGEuY29tcG9uZW50OwogICAgZmluYWwgbGlua1dyaXRlciA9IG5ldyBMaW5rV3JpdGVyKCk7CiAgICBmaW5hbCB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIoCiAgICAgICAgYnl0ZWNvZGVDb21wb25lbnQudmVyc2lvbiwKICAgICAgICBieXRlY29kZUNvbXBvbmVudC5zdHJpbmdUYWJsZSwKICAgICAgICBieXRlY29kZUNvbXBvbmVudC5vYmplY3RUYWJsZSwKICAgICAgICBsaW5rV3JpdGVyKTsKICAgIG1ldGFkYXRhLndyaXRlKHdyaXRlcik7CiAgICB3cml0ZXIud3JpdGVDb250ZW50c1RvQmluYXJ5U2luayhzaW5rKTsKICB9CgogIEBvdmVycmlkZQogIEJ5dGVjb2RlTWV0YWRhdGEgcmVhZEZyb21CaW5hcnkoTm9kZSBub2RlLCBCaW5hcnlTb3VyY2Ugc291cmNlKSB7CiAgICBmaW5hbCBsaW5rUmVhZGVyID0gbmV3IExpbmtSZWFkZXIoKTsKICAgIGZpbmFsIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigtMSwgbnVsbCwgbnVsbCwgbGlua1JlYWRlciwgc291cmNlLmJ5dGVzLAogICAgICAgIGJhc2VPZmZzZXQ6IHNvdXJjZS5jdXJyZW50T2Zmc2V0KTsKICAgIGZpbmFsIGJ5dGVjb2RlQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudC5yZWFkKHJlYWRlcik7CiAgICByZXR1cm4gbmV3IEJ5dGVjb2RlTWV0YWRhdGEoYnl0ZWNvZGVDb21wb25lbnQpOwogIH0KfQpHAE5OPAEeASFHMUE3ARkBGR0BJAEmNR8IBAE5Oz8IBAEMHB0VDQIBJ1AMJAEMMiYBDE4yKScjJycVHCwEAQxEKVArOjQEAgEhcGFja2FnZTp2bS9tZXRhZGF0YS9ieXRlY29kZS5kYXJ0UGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9tZXRhZGF0YS9kaXJlY3RfY2FsbC5kYXJ0hz4vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5tZXRhZGF0YS5kaXJlY3RfY2FsbDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKLy8vIE1ldGFkYXRhIGZvciBhbm5vdGF0aW5nIG1ldGhvZCBpbnZvY2F0aW9ucyBjb252ZXJ0ZWQgdG8gZGlyZWN0IGNhbGxzLgpjbGFzcyBEaXJlY3RDYWxsTWV0YWRhdGEgewogIGZpbmFsIFJlZmVyZW5jZSBfdGFyZ2V0UmVmZXJlbmNlOwogIGZpbmFsIGJvb2wgY2hlY2tSZWNlaXZlckZvck51bGw7CgogIERpcmVjdENhbGxNZXRhZGF0YShNZW1iZXIgdGFyZ2V0LCBib29sIGNoZWNrUmVjZWl2ZXJGb3JOdWxsKQogICAgICA6IHRoaXMuYnlSZWZlcmVuY2UoZ2V0TWVtYmVyUmVmZXJlbmNlKHRhcmdldCksIGNoZWNrUmVjZWl2ZXJGb3JOdWxsKTsKCiAgRGlyZWN0Q2FsbE1ldGFkYXRhLmJ5UmVmZXJlbmNlKAogICAgICB0aGlzLl90YXJnZXRSZWZlcmVuY2UsIHRoaXMuY2hlY2tSZWNlaXZlckZvck51bGwpOwoKICBNZW1iZXIgZ2V0IHRhcmdldCA9PiBfdGFyZ2V0UmVmZXJlbmNlLmFzTWVtYmVyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJHt0YXJnZXR9JHtjaGVja1JlY2VpdmVyRm9yTnVsbCA/ICc/PycgOiAnJ30iOwp9CgovLy8gUmVwb3NpdG9yeSBmb3IgW0RpcmVjdENhbGxNZXRhZGF0YV0uCmNsYXNzIERpcmVjdENhbGxNZXRhZGF0YVJlcG9zaXRvcnkKICAgIGV4dGVuZHMgTWV0YWRhdGFSZXBvc2l0b3J5PERpcmVjdENhbGxNZXRhZGF0YT4gewogIHN0YXRpYyBjb25zdCByZXBvc2l0b3J5VGFnID0gJ3ZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhJzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCB0YWcgPT4gcmVwb3NpdG9yeVRhZzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPFRyZWVOb2RlLCBEaXJlY3RDYWxsTWV0YWRhdGE+IG1hcHBpbmcgPQogICAgICA8VHJlZU5vZGUsIERpcmVjdENhbGxNZXRhZGF0YT57fTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvQmluYXJ5KERpcmVjdENhbGxNZXRhZGF0YSBtZXRhZGF0YSwgTm9kZSBub2RlLCBCaW5hcnlTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoCiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZU9mTWVtYmVyKG1ldGFkYXRhLnRhcmdldCkpOwogICAgc2luay53cml0ZUJ5dGUobWV0YWRhdGEuY2hlY2tSZWNlaXZlckZvck51bGwgPyAxIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEaXJlY3RDYWxsTWV0YWRhdGEgcmVhZEZyb21CaW5hcnkoTm9kZSBub2RlLCBCaW5hcnlTb3VyY2Ugc291cmNlKSB7CiAgICBmaW5hbCB0YXJnZXRSZWZlcmVuY2UgPSBzb3VyY2UucmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKT8uZ2V0UmVmZXJlbmNlKCk7CiAgICBpZiAodGFyZ2V0UmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgdGhyb3cgJ0RpcmVjdENhbGxNZXRhZGF0YSBzaG91bGQgaGF2ZSBhIG5vbi1udWxsIHRhcmdldCc7CiAgICB9CiAgICBmaW5hbCBjaGVja1JlY2VpdmVyRm9yTnVsbCA9IChzb3VyY2UucmVhZEJ5dGUoKSAhPSAwKTsKICAgIHJldHVybiBuZXcgRGlyZWN0Q2FsbE1ldGFkYXRhLmJ5UmVmZXJlbmNlKAogICAgICAgIHRhcmdldFJlZmVyZW5jZSwgY2hlY2tSZWNlaXZlckZvck51bGwpOwogIH0KfQo5AE5OPAEhASIBShskIwE/TAEiOQEyAQxHAgEpIzU6AQwjAQw0KAEMUDE0OwQBDEZRI0AGOy8wBAIBJHBhY2thZ2U6dm0vbWV0YWRhdGEvZGlyZWN0X2NhbGwuZGFydFJmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvbWV0YWRhdGEvaW5mZXJyZWRfdHlwZS5kYXJ0kVkvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5tZXRhZGF0YS5pbmZlcnJlZF90eXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgovLy8gTWV0YWRhdGEgZm9yIGFubm90YXRpbmcgbm9kZXMgd2l0aCBhbiBpbmZlcnJlZCB0eXBlIGluZm9ybWF0aW9uLgpjbGFzcyBJbmZlcnJlZFR5cGUgewogIGZpbmFsIFJlZmVyZW5jZSBfY29uY3JldGVDbGFzc1JlZmVyZW5jZTsKICBmaW5hbCBDb25zdGFudCBfY29uc3RhbnRWYWx1ZTsKICBmaW5hbCBpbnQgX2ZsYWdzOwoKICBzdGF0aWMgY29uc3QgaW50IGZsYWdOdWxsYWJsZSA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IGZsYWdJbnQgPSAxIDw8IDE7CgogIC8vIEZvciBpbnZvY2F0aW9uczogd2hldGhlciB0byB1c2UgdGhlIHVuY2hlY2tlZCBlbnRyeS1wb2ludC4KICBzdGF0aWMgY29uc3QgaW50IGZsYWdTa2lwQ2hlY2sgPSAxIDw8IDI7CgogIHN0YXRpYyBjb25zdCBpbnQgZmxhZ0NvbnN0YW50ID0gMSA8PCAzOwoKICBzdGF0aWMgY29uc3QgaW50IGZsYWdSZWNlaXZlck5vdEludCA9IDEgPDwgNDsKCiAgLy8gRW50aXJlIGxpc3QgbWF5IGJlIG51bGwgaWYgbm8gdHlwZSBhcmd1bWVudHMgd2VyZSBpbmZlcnJlZC4KICAvLyBXaWxsIGFsd2F5cyBiZSBudWxsIGlmIGBjb25jcmV0ZUNsYXNzYCBpcyBudWxsLgogIC8vCiAgLy8gRWFjaCBjb21wb25lbnQgbWF5IGJlIG51bGwgaWYgdGhhdCBwYXJ0aWN1bGFyIHR5cGUgYXJndW1lbnQgd2FzIG5vdAogIC8vIGluZmVycmVkLgogIC8vCiAgLy8gT3RoZXJ3aXNlLCBhIG5vbi1udWxsIHR5cGUgYXJndW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhhdCBwYXJ0aWN1bGFyIHR5cGUKICAvLyBhcmd1bWVudCAoaW4gdGhlIHJ1bnRpbWUgdHlwZSkgaXMgYWx3YXlzIGV4YWN0bHkgYSBwYXJ0aWN1bGFyIGBEYXJ0VHlwZWAuCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gZXhhY3RUeXBlQXJndW1lbnRzOwoKICBJbmZlcnJlZFR5cGUoCiAgICAgIENsYXNzIGNvbmNyZXRlQ2xhc3MsIGJvb2wgbnVsbGFibGUsIGJvb2wgaXNJbnQsIENvbnN0YW50IGNvbnN0YW50VmFsdWUsCiAgICAgIHtMaXN0PERhcnRUeXBlPiBleGFjdFR5cGVBcmd1bWVudHMsCiAgICAgIGJvb2wgc2tpcENoZWNrOiBmYWxzZSwKICAgICAgYm9vbCByZWNlaXZlck5vdEludDogZmFsc2V9KQogICAgICA6IHRoaXMuX2J5UmVmZXJlbmNlKAogICAgICAgICAgICBnZXRDbGFzc1JlZmVyZW5jZShjb25jcmV0ZUNsYXNzKSwKICAgICAgICAgICAgY29uc3RhbnRWYWx1ZSwKICAgICAgICAgICAgKG51bGxhYmxlID8gZmxhZ051bGxhYmxlIDogMCkgfAogICAgICAgICAgICAgICAgKGlzSW50ID8gZmxhZ0ludCA6IDApIHwKICAgICAgICAgICAgICAgIChza2lwQ2hlY2sgPyBmbGFnU2tpcENoZWNrIDogMCkgfAogICAgICAgICAgICAgICAgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCA/IGZsYWdDb25zdGFudCA6IDApIHwKICAgICAgICAgICAgICAgIChyZWNlaXZlck5vdEludCA/IGZsYWdSZWNlaXZlck5vdEludCA6IDApLAogICAgICAgICAgICBleGFjdFR5cGVBcmd1bWVudHMpOwoKICBJbmZlcnJlZFR5cGUuX2J5UmVmZXJlbmNlKHRoaXMuX2NvbmNyZXRlQ2xhc3NSZWZlcmVuY2UsIHRoaXMuX2NvbnN0YW50VmFsdWUsCiAgICAgIHRoaXMuX2ZsYWdzLCB0aGlzLmV4YWN0VHlwZUFyZ3VtZW50cykgewogICAgYXNzZXJ0KGV4YWN0VHlwZUFyZ3VtZW50cyA9PSBudWxsIHx8IF9jb25jcmV0ZUNsYXNzUmVmZXJlbmNlICE9IG51bGwpOwogICAgYXNzZXJ0KF9jb25zdGFudFZhbHVlID09IG51bGwgfHwgX2NvbmNyZXRlQ2xhc3NSZWZlcmVuY2UgIT0gbnVsbCk7CiAgfQoKICBDbGFzcyBnZXQgY29uY3JldGVDbGFzcyA9PiBfY29uY3JldGVDbGFzc1JlZmVyZW5jZT8uYXNDbGFzczsKCiAgQ29uc3RhbnQgZ2V0IGNvbnN0YW50VmFsdWUgPT4gX2NvbnN0YW50VmFsdWU7CgogIGJvb2wgZ2V0IG51bGxhYmxlID0+IChfZmxhZ3MgJiBmbGFnTnVsbGFibGUpICE9IDA7CiAgYm9vbCBnZXQgaXNJbnQgPT4gKF9mbGFncyAmIGZsYWdJbnQpICE9IDA7CiAgYm9vbCBnZXQgc2tpcENoZWNrID0+IChfZmxhZ3MgJiBmbGFnU2tpcENoZWNrKSAhPSAwOwogIGJvb2wgZ2V0IHJlY2VpdmVyTm90SW50ID0+IChfZmxhZ3MgJiBmbGFnUmVjZWl2ZXJOb3RJbnQpICE9IDA7CgogIGludCBnZXQgZmxhZ3MgPT4gX2ZsYWdzOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaWYgKGNvbmNyZXRlQ2xhc3MgIT0gbnVsbCkgewogICAgICBidWYud3JpdGUoY29uY3JldGVDbGFzcyk7CiAgICB9IGVsc2UgaWYgKGlzSW50KSB7CiAgICAgIGJ1Zi53cml0ZSgnaW50Jyk7CiAgICB9IGVsc2UgewogICAgICBidWYud3JpdGUoJyEnKTsKICAgIH0KICAgIGlmIChudWxsYWJsZSkgewogICAgICBidWYud3JpdGUoJz8nKTsKICAgIH0KICAgIGlmIChleGFjdFR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBidWYud3JpdGUoJzwnKTsKICAgICAgYnVmLndyaXRlKAogICAgICAgICAgZXhhY3RUeXBlQXJndW1lbnRzLm1hcCgodCkgPT4gdCAhPSBudWxsID8gIiR0IiA6ICI/Iikuam9pbigiLCAiKSk7CiAgICAgIGJ1Zi53cml0ZSgnPicpOwogICAgfQogICAgaWYgKHNraXBDaGVjaykgewogICAgICBidWYud3JpdGUoJyAoc2tpcCBjaGVjayknKTsKICAgIH0KICAgIGlmIChfY29uc3RhbnRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIGJ1Zi53cml0ZSgnICh2YWx1ZTogJF9jb25zdGFudFZhbHVlKScpOwogICAgfQogICAgaWYgKHJlY2VpdmVyTm90SW50KSB7CiAgICAgIGJ1Zi53cml0ZSgnIChyZWNlaXZlciBub3QgaW50KScpOwogICAgfQogICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogIH0KfQoKLy8vIFJlcG9zaXRvcnkgZm9yIFtJbmZlcnJlZFR5cGVdLgpjbGFzcyBJbmZlcnJlZFR5cGVNZXRhZGF0YVJlcG9zaXRvcnkgZXh0ZW5kcyBNZXRhZGF0YVJlcG9zaXRvcnk8SW5mZXJyZWRUeXBlPiB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyByZXBvc2l0b3J5VGFnID0gJ3ZtLmluZmVycmVkLXR5cGUubWV0YWRhdGEnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHRhZyA9PiByZXBvc2l0b3J5VGFnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNYXA8VHJlZU5vZGUsIEluZmVycmVkVHlwZT4gbWFwcGluZyA9IDxUcmVlTm9kZSwgSW5mZXJyZWRUeXBlPnt9OwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9CaW5hcnkoSW5mZXJyZWRUeXBlIG1ldGFkYXRhLCBOb2RlIG5vZGUsIEJpbmFyeVNpbmsgc2luaykgewogICAgLy8gVE9ETyhzamluZGVsL3RmYSk6IEltcGxlbWVudCBzZXJpYWxpemF0aW9uIG9mIHR5cGUgYXJndW1lbnRzIHdoZW4gY2FuIHVzZQogICAgLy8gdGhlbSBmb3Igb3B0aW1pemF0aW9ucy4KICAgIHNpbmsud3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoCiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZU9mQ2xhc3MobWV0YWRhdGEuY29uY3JldGVDbGFzcykpOwogICAgc2luay53cml0ZUJ5dGUobWV0YWRhdGEuX2ZsYWdzKTsKICAgIGlmIChtZXRhZGF0YS5jb25zdGFudFZhbHVlICE9IG51bGwpIHsKICAgICAgc2luay53cml0ZUNvbnN0YW50UmVmZXJlbmNlKG1ldGFkYXRhLmNvbnN0YW50VmFsdWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgSW5mZXJyZWRUeXBlIHJlYWRGcm9tQmluYXJ5KE5vZGUgbm9kZSwgQmluYXJ5U291cmNlIHNvdXJjZSkgewogICAgLy8gVE9ETyhzamluZGVsL3RmYSk6IEltcGxlbWVudCBzZXJpYWxpemF0aW9uIG9mIHR5cGUgYXJndW1lbnRzIHdoZW4gY2FuIHVzZQogICAgLy8gdGhlbSBmb3Igb3B0aW1pemF0aW9ucy4KICAgIGZpbmFsIGNvbmNyZXRlQ2xhc3NSZWZlcmVuY2UgPQogICAgICAgIHNvdXJjZS5yZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpPy5nZXRSZWZlcmVuY2UoKTsKICAgIGZpbmFsIGZsYWdzID0gc291cmNlLnJlYWRCeXRlKCk7CiAgICBmaW5hbCBjb25zdGFudFZhbHVlID0gKGZsYWdzICYgSW5mZXJyZWRUeXBlLmZsYWdDb25zdGFudCkgIT0gMAogICAgICAgID8gc291cmNlLnJlYWRDb25zdGFudFJlZmVyZW5jZSgpCiAgICAgICAgOiBudWxsOwogICAgcmV0dXJuIG5ldyBJbmZlcnJlZFR5cGUuX2J5UmVmZXJlbmNlKAogICAgICAgIGNvbmNyZXRlQ2xhc3NSZWZlcmVuY2UsIGNvbnN0YW50VmFsdWUsIGZsYWdzLCBudWxsKTsKICB9Cn0KgIgATk48ASMBIgFFFSshFAEqJQFAKwEqATABQTUFSQ8FTU8rARBOKh0jGy4bLCgyPTshAU8uS0cEAT8BMAE1LTdBARsBDBYxISAYGA0WBhQWBiYWEU0WBhUiBiIuBhooBhsEAgEjUEMBDCMBDEoBDEpRHzE6JSo7BgQBDEBRHyM9JUMpECo9BAIBJnBhY2thZ2U6dm0vbWV0YWRhdGEvaW5mZXJyZWRfdHlwZS5kYXJ0XWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9tZXRhZGF0YS9vYmZ1c2NhdGlvbl9wcm9oaWJpdGlvbnMuZGFydIXrLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0ubWV0YWRhdGEub2JmdXNjYXRpb25fcHJvaGliaXRpb25zOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgpjbGFzcyBPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhIHsKICBmaW5hbCBTZXQ8U3RyaW5nPiBwcm90ZWN0ZWROYW1lcyA9IFNldDxTdHJpbmc+KCk7CgogIE9iZnVzY2F0aW9uUHJvaGliaXRpb25zTWV0YWRhdGEoKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gcHJvdGVjdGVkTmFtZXMudG9TdHJpbmcoKTsKfQoKLy8vIFJlcG9zaXRvcnkgZm9yIFtPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhXS4KY2xhc3MgT2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNNZXRhZGF0YVJlcG9zaXRvcnkKICAgIGV4dGVuZHMgTWV0YWRhdGFSZXBvc2l0b3J5PE9iZnVzY2F0aW9uUHJvaGliaXRpb25zTWV0YWRhdGE+IHsKICBzdGF0aWMgZmluYWwgcmVwb3NpdG9yeVRhZyA9ICd2bS5vYmZ1c2NhdGlvbi1wcm9oaWJpdGlvbnMubWV0YWRhdGEnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgdGFnID0gcmVwb3NpdG9yeVRhZzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPFRyZWVOb2RlLCBPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhPiBtYXBwaW5nID0KICAgICAgPFRyZWVOb2RlLCBPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhPnt9OwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9CaW5hcnkoCiAgICAgIE9iZnVzY2F0aW9uUHJvaGliaXRpb25zTWV0YWRhdGEgbWV0YWRhdGEsIE5vZGUgbm9kZSwgQmluYXJ5U2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlVUludDMyKG1ldGFkYXRhLnByb3RlY3RlZE5hbWVzLmxlbmd0aCk7CiAgICBmb3IgKFN0cmluZyBuYW1lIGluIG1ldGFkYXRhLnByb3RlY3RlZE5hbWVzKSB7CiAgICAgIHNpbmsud3JpdGVTdHJpbmdSZWZlcmVuY2UobmFtZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhIHJlYWRGcm9tQmluYXJ5KAogICAgICBOb2RlIG5vZGUsIEJpbmFyeVNvdXJjZSBzb3VyY2UpIHsKICAgIGZpbmFsIG1ldGFkYXRhID0gT2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNNZXRhZGF0YSgpOwogICAgaW50IGxlbmd0aCA9IHNvdXJjZS5yZWFkVWludDMyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIG1ldGFkYXRhLnByb3RlY3RlZE5hbWVzLmFkZChzb3VyY2UucmVhZFN0cmluZ1JlZmVyZW5jZSgpKTsKICAgIH0KICAgIHJldHVybiBtZXRhZGF0YTsKICB9Cn0KMwBOTjwBLgEiASg0ASUBDDICATYwQkcBDCQBDEE1AQwWTjYzJwYEAQwyKDgmJ0EGFQQCATFwYWNrYWdlOnZtL21ldGFkYXRhL29iZnVzY2F0aW9uX3Byb2hpYml0aW9ucy5kYXJ0WWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9tZXRhZGF0YS9wcm9jZWR1cmVfYXR0cmlidXRlcy5kYXJ0kjsvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5tZXRhZGF0YS5wcm9jZWR1cmVfYXR0cmlidXRlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKLy8vIE1ldGFkYXRhIGZvciBhbm5vdGF0aW5nIHByb2NlZHVyZXMgd2l0aCB2YXJpb3VzIGF0dHJpYnV0ZXMuCmNsYXNzIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSB7CiAgc3RhdGljIGNvbnN0IGludCBrSW52YWxpZFNlbGVjdG9ySWQgPSAwOwoKICBmaW5hbCBib29sIG1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk7CiAgZmluYWwgYm9vbCBnZXR0ZXJDYWxsZWREeW5hbWljYWxseTsKICBmaW5hbCBib29sIGhhc1RoaXNVc2VzOwogIGZpbmFsIGJvb2wgaGFzTm9uVGhpc1VzZXM7CiAgZmluYWwgYm9vbCBoYXNUZWFyT2ZmVXNlczsKICBmaW5hbCBpbnQgbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOwogIGZpbmFsIGludCBnZXR0ZXJTZWxlY3RvcklkOwoKICBjb25zdCBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEoCiAgICAgIHt0aGlzLm1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6IHRydWUsCiAgICAgIHRoaXMuZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6IHRydWUsCiAgICAgIHRoaXMuaGFzVGhpc1VzZXM6IHRydWUsCiAgICAgIHRoaXMuaGFzTm9uVGhpc1VzZXM6IHRydWUsCiAgICAgIHRoaXMuaGFzVGVhck9mZlVzZXM6IHRydWUsCiAgICAgIHRoaXMubWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOiBrSW52YWxpZFNlbGVjdG9ySWQsCiAgICAgIHRoaXMuZ2V0dGVyU2VsZWN0b3JJZDoga0ludmFsaWRTZWxlY3RvcklkfSk7CgogIGNvbnN0IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YS5ub0R5bmFtaWNVc2VzKCkKICAgICAgOiB0aGlzKAogICAgICAgICAgICBtZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OiBmYWxzZSwKICAgICAgICAgICAgZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6IGZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgZmluYWwgYXR0cnMgPSA8U3RyaW5nPltdOwogICAgaWYgKCFtZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5KSB7CiAgICAgIGF0dHJzLmFkZCgnbWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZScpOwogICAgfQogICAgaWYgKCFnZXR0ZXJDYWxsZWREeW5hbWljYWxseSkgYXR0cnMuYWRkKCdnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZScpOwogICAgaWYgKCFoYXNUaGlzVXNlcykgYXR0cnMuYWRkKCdoYXNUaGlzVXNlczpmYWxzZScpOwogICAgaWYgKCFoYXNOb25UaGlzVXNlcykgYXR0cnMuYWRkKCdoYXNOb25UaGlzVXNlczpmYWxzZScpOwogICAgaWYgKCFoYXNUZWFyT2ZmVXNlcykgYXR0cnMuYWRkKCdoYXNUZWFyT2ZmVXNlczpmYWxzZScpOwogICAgaWYgKG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZCAhPSBrSW52YWxpZFNlbGVjdG9ySWQpIHsKICAgICAgYXR0cnMuYWRkKCdtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6JG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZCcpOwogICAgfQogICAgaWYgKGdldHRlclNlbGVjdG9ySWQgIT0ga0ludmFsaWRTZWxlY3RvcklkKSB7CiAgICAgIGF0dHJzLmFkZCgnZ2V0dGVyU2VsZWN0b3JJZDokZ2V0dGVyU2VsZWN0b3JJZCcpOwogICAgfQogICAgcmV0dXJuIGF0dHJzLmpvaW4oJywnKTsKICB9Cn0KCi8vLyBSZXBvc2l0b3J5IGZvciBbUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhXS4KY2xhc3MgUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeQogICAgZXh0ZW5kcyBNZXRhZGF0YVJlcG9zaXRvcnk8UHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhPiB7CiAgc3RhdGljIGNvbnN0IGludCBrTWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseUJpdCA9IDEgPDwgMDsKICBzdGF0aWMgY29uc3QgaW50IGtOb25UaGlzVXNlc0JpdCA9IDEgPDwgMTsKICBzdGF0aWMgY29uc3QgaW50IGtUZWFyT2ZmVXNlc0JpdCA9IDEgPDwgMjsKICBzdGF0aWMgY29uc3QgaW50IGtUaGlzVXNlc0JpdCA9IDEgPDwgMzsKICBzdGF0aWMgY29uc3QgaW50IGtHZXR0ZXJDYWxsZWREeW5hbWljYWxseUJpdCA9IDEgPDwgNDsKCiAgc3RhdGljIGNvbnN0IHJlcG9zaXRvcnlUYWcgPSAndm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGEnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgdGFnID0gcmVwb3NpdG9yeVRhZzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWFwPFRyZWVOb2RlLCBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGE+IG1hcHBpbmcgPQogICAgICA8VHJlZU5vZGUsIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YT57fTsKCiAgaW50IF9nZXRGbGFncyhQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgbWV0YWRhdGEpIHsKICAgIGludCBmbGFncyA9IDA7CiAgICBpZiAobWV0YWRhdGEubWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseSkgewogICAgICBmbGFncyB8PSBrTWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseUJpdDsKICAgIH0KICAgIGlmIChtZXRhZGF0YS5nZXR0ZXJDYWxsZWREeW5hbWljYWxseSkgewogICAgICBmbGFncyB8PSBrR2V0dGVyQ2FsbGVkRHluYW1pY2FsbHlCaXQ7CiAgICB9CiAgICBpZiAobWV0YWRhdGEuaGFzVGhpc1VzZXMpIHsKICAgICAgZmxhZ3MgfD0ga1RoaXNVc2VzQml0OwogICAgfQogICAgaWYgKG1ldGFkYXRhLmhhc05vblRoaXNVc2VzKSB7CiAgICAgIGZsYWdzIHw9IGtOb25UaGlzVXNlc0JpdDsKICAgIH0KICAgIGlmIChtZXRhZGF0YS5oYXNUZWFyT2ZmVXNlcykgewogICAgICBmbGFncyB8PSBrVGVhck9mZlVzZXNCaXQ7CiAgICB9CiAgICByZXR1cm4gZmxhZ3M7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9CaW5hcnkoCiAgICAgIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSBtZXRhZGF0YSwgTm9kZSBub2RlLCBCaW5hcnlTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVCeXRlKF9nZXRGbGFncyhtZXRhZGF0YSkpOwogICAgc2luay53cml0ZVVJbnQzMChtZXRhZGF0YS5tZXRob2RPclNldHRlclNlbGVjdG9ySWQpOwogICAgc2luay53cml0ZVVJbnQzMChtZXRhZGF0YS5nZXR0ZXJTZWxlY3RvcklkKTsKICB9CgogIEBvdmVycmlkZQogIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSByZWFkRnJvbUJpbmFyeShOb2RlIG5vZGUsIEJpbmFyeVNvdXJjZSBzb3VyY2UpIHsKICAgIGZpbmFsIGludCBmbGFncyA9IHNvdXJjZS5yZWFkQnl0ZSgpOwoKICAgIGZpbmFsIGJvb2wgbWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseSA9CiAgICAgICAgKGZsYWdzICYga01ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHlCaXQpICE9IDA7CiAgICBmaW5hbCBib29sIGdldHRlckNhbGxlZER5bmFtaWNhbGx5ID0KICAgICAgICAoZmxhZ3MgJiBrR2V0dGVyQ2FsbGVkRHluYW1pY2FsbHlCaXQpICE9IDA7CiAgICBmaW5hbCBib29sIGhhc1RoaXNVc2VzID0gKGZsYWdzICYga1RoaXNVc2VzQml0KSAhPSAwOwogICAgZmluYWwgYm9vbCBoYXNOb25UaGlzVXNlcyA9IChmbGFncyAmIGtOb25UaGlzVXNlc0JpdCkgIT0gMDsKICAgIGZpbmFsIGJvb2wgaGFzVGVhck9mZlVzZXMgPSAoZmxhZ3MgJiBrVGVhck9mZlVzZXNCaXQpICE9IDA7CgogICAgZmluYWwgaW50IG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZCA9IHNvdXJjZS5yZWFkVUludCgpOwogICAgZmluYWwgaW50IGdldHRlclNlbGVjdG9ySWQgPSBzb3VyY2UucmVhZFVJbnQoKTsKCiAgICByZXR1cm4gbmV3IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YSgKICAgICAgICBtZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OiBtZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5LAogICAgICAgIGdldHRlckNhbGxlZER5bmFtaWNhbGx5OiBnZXR0ZXJDYWxsZWREeW5hbWljYWxseSwKICAgICAgICBoYXNUaGlzVXNlczogaGFzVGhpc1VzZXMsCiAgICAgICAgaGFzTm9uVGhpc1VzZXM6IGhhc05vblRoaXNVc2VzLAogICAgICAgIGhhc1RlYXJPZmZVc2VzOiBoYXNUZWFyT2ZmVXNlcywKICAgICAgICBtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6IG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZCwKICAgICAgICBnZXR0ZXJTZWxlY3RvcklkOiBnZXR0ZXJTZWxlY3RvcklkKTsKICB9CgogIC8vLyBDb252ZXJ0cyBbbWV0YWRhdGFdIGludG8gYSBieXRlY29kZSBhdHRyaWJ1dGUuCiAgQ29uc3RhbnQgZ2V0Qnl0ZWNvZGVBdHRyaWJ1dGUoUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICByZXR1cm4gTGlzdENvbnN0YW50KGNvbnN0IER5bmFtaWNUeXBlKCksIFsKICAgICAgSW50Q29uc3RhbnQoX2dldEZsYWdzKG1ldGFkYXRhKSksCiAgICAgIEludENvbnN0YW50KG1ldGFkYXRhLm1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZCksCiAgICAgIEludENvbnN0YW50KG1ldGFkYXRhLmdldHRlclNlbGVjdG9ySWQpLAogICAgXSk7CiAgfQp9CoCIAE5OPAEqASIBQCQrAS4mGh0dJh4BJTMqHiEhOTMBNA40LQEMFh4sOgZONjw8OkcGMjcGHAQCATIsPkEtLSo5AUMBDCQBDD0xATgTNDQGLCwGIB0GIyAGIyAGEgQBDBZKKTkxBAEMTykBMTwpNDpAQAE8NAEsSjoiKCg8LQQBNUgvKDYuCAQCAS1wYWNrYWdlOnZtL21ldGFkYXRhL3Byb2NlZHVyZV9hdHRyaWJ1dGVzLmRhcnROZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL3RhcmdldC9kYXJ0X3J1bm5lci5kYXJ0hWUvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IHZtLnRhcmdldC5kYXJ0X3J1bm5lcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CmltcG9ydCAncGFja2FnZTp2bS90YXJnZXQvdm0uZGFydCcgc2hvdyBWbVRhcmdldDsKCmNsYXNzIERhcnRSdW5uZXJUYXJnZXQgZXh0ZW5kcyBWbVRhcmdldCB7CiAgRGFydFJ1bm5lclRhcmdldChUYXJnZXRGbGFncyBmbGFncykgOiBzdXBlcihmbGFncyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAnZGFydF9ydW5uZXInOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBlbmFibGVTdXBlck1peGlucyA9PiB0cnVlOwoKICAvLyBUaGlzIGlzIHRoZSBvcmRlciB0aGF0IGJvb3RzdHJhcCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhY2NvcmRpbmcgdG8KICAvLyBgcnVudGltZS92bS9vYmplY3Rfc3RvcmUuaGAuCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IGdldCBleHRyYVJlcXVpcmVkTGlicmFyaWVzID0+IGNvbnN0IDxTdHJpbmc+WwogICAgICAgICdkYXJ0OmFzeW5jJywKICAgICAgICAnZGFydDpjb2xsZWN0aW9uJywKICAgICAgICAnZGFydDpjb252ZXJ0JywKICAgICAgICAnZGFydDpkZXZlbG9wZXInLAogICAgICAgICdkYXJ0OmZmaScsCiAgICAgICAgJ2RhcnQ6X2ludGVybmFsJywKICAgICAgICAnZGFydDppc29sYXRlJywKICAgICAgICAnZGFydDptYXRoJywKCiAgICAgICAgLy8gVGhlIGxpYnJhcnkgZGFydDptaXJyb3JzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBWTSwgZS5nLiB3aGVuIGJ1aWx0IGluCiAgICAgICAgLy8gUFJPRFVDVCBtb2RlLgogICAgICAgICdkYXJ0Om1pcnJvcnMnLAoKICAgICAgICAnZGFydDp0eXBlZF9kYXRhJywKICAgICAgICAnZGFydDpuYXRpdmV3cmFwcGVycycsCiAgICAgICAgJ2RhcnQ6aW8nLAogICAgICAgICdkYXJ0Ondhc20nLAoKICAgICAgICAvLyBSZXF1aXJlZCBmb3IgZGFydF9ydW5uZXIuCiAgICAgICAgJ2RhcnQ6ZnVjaHNpYS5idWlsdGluJywKICAgICAgICAnZGFydDp6aXJjb24nLAogICAgICAgICdkYXJ0OmZ1Y2hzaWEnLAogICAgICAgICdkYXJ0OnZtc2VydmljZV9pbycsCiAgICAgIF07CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllc1BsYXRmb3JtID0+IGNvbnN0IDxTdHJpbmc+W107Cn0KMwBOTjwfAS0yASo2AQwkAQwmAUgiDD0WGxgaFBoYFQFRGRgBGx8TFQElIBcYHQkBDEcCASJwYWNrYWdlOnZtL3RhcmdldC9kYXJ0X3J1bm5lci5kYXJ0SmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90YXJnZXQvZmx1dHRlci5kYXJ0iLAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpsaWJyYXJ5IHZtLnRhcmdldC5mbHV0dGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBDb21wb25lbnQsIExpYnJhcnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvY2hhbmdlZF9zdHJ1Y3R1cmVfbm90aWZpZXIuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL3RyYWNrX3dpZGdldF9jb25zdHJ1Y3Rvcl9sb2NhdGlvbnMuZGFydCc7CmltcG9ydCAncGFja2FnZTp2bS90YXJnZXQvdm0uZGFydCcgc2hvdyBWbVRhcmdldDsKCmNsYXNzIEZsdXR0ZXJUYXJnZXQgZXh0ZW5kcyBWbVRhcmdldCB7CiAgRmx1dHRlclRhcmdldChUYXJnZXRGbGFncyBmbGFncykgOiBzdXBlcihmbGFncyk7CgogIFdpZGdldENyZWF0b3JUcmFja2VyIF93aWRnZXRUcmFja2VyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ2ZsdXR0ZXInOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBlbmFibGVTdXBlck1peGlucyA9PiB0cnVlOwoKICAvLyBUaGlzIGlzIHRoZSBvcmRlciB0aGF0IGJvb3RzdHJhcCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhY2NvcmRpbmcgdG8KICAvLyBgcnVudGltZS92bS9vYmplY3Rfc3RvcmUuaGAuCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IGdldCBleHRyYVJlcXVpcmVkTGlicmFyaWVzID0+IGNvbnN0IDxTdHJpbmc+WwogICAgICAgICdkYXJ0OmFzeW5jJywKICAgICAgICAnZGFydDpjb2xsZWN0aW9uJywKICAgICAgICAnZGFydDpjb252ZXJ0JywKICAgICAgICAnZGFydDpkZXZlbG9wZXInLAogICAgICAgICdkYXJ0OmZmaScsCiAgICAgICAgJ2RhcnQ6X2ludGVybmFsJywKICAgICAgICAnZGFydDppc29sYXRlJywKICAgICAgICAnZGFydDptYXRoJywKCiAgICAgICAgLy8gVGhlIGxpYnJhcnkgZGFydDptaXJyb3JzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBWTSwgZS5nLiB3aGVuIGJ1aWx0IGluCiAgICAgICAgLy8gUFJPRFVDVCBtb2RlLgogICAgICAgICdkYXJ0Om1pcnJvcnMnLAoKICAgICAgICAnZGFydDp0eXBlZF9kYXRhJywKICAgICAgICAnZGFydDpuYXRpdmV3cmFwcGVycycsCiAgICAgICAgJ2RhcnQ6aW8nLAogICAgICAgICdkYXJ0Ondhc20nLAoKICAgICAgICAvLyBSZXF1aXJlZCBmb3IgZmx1dHRlci4KICAgICAgICAnZGFydDp1aScsCiAgICAgICAgJ2RhcnQ6dm1zZXJ2aWNlX2lvJywKICAgICAgXTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IGdldCBleHRyYVJlcXVpcmVkTGlicmFyaWVzUGxhdGZvcm0gPT4gY29uc3QgPFN0cmluZz5bXTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwZXJmb3JtUHJlQ29uc3RhbnRFdmFsdWF0aW9uVHJhbnNmb3JtYXRpb25zKAogICAgICBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpLAogICAgICBDaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyfSkgewogICAgc3VwZXIucGVyZm9ybVByZUNvbnN0YW50RXZhbHVhdGlvblRyYW5zZm9ybWF0aW9ucygKICAgICAgICBjb21wb25lbnQsIGNvcmVUeXBlcywgbGlicmFyaWVzLCBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgICAgbG9nZ2VyOiBsb2dnZXIpOwogICAgaWYgKGZsYWdzLnRyYWNrV2lkZ2V0Q3JlYXRpb24pIHsKICAgICAgaWYgKF93aWRnZXRUcmFja2VyID09IG51bGwpIHsKICAgICAgICBfd2lkZ2V0VHJhY2tlciA9IFdpZGdldENyZWF0b3JUcmFja2VyKCk7CiAgICAgIH0KICAgICAgX3dpZGdldFRyYWNrZXIudHJhbnNmb3JtKGNvbXBvbmVudCwgbGlicmFyaWVzKTsKICAgIH0KICB9Cn0KSgBOTjwbATo4QC1RMgEnMwEnAQwgAQwmAUgiDD0WGxgaFBoYFQFRGRgBGx8TFQEhEx0JAQxHAQw0GxsfLSA8Nz0ZJSQxCDYGBAIBHnBhY2thZ2U6dm0vdGFyZ2V0L2ZsdXR0ZXIuZGFydFFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdGFyZ2V0L2ZsdXR0ZXJfcnVubmVyLmRhcnSFhy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkgdm0udGFyZ2V0LmZsdXR0ZXJfcnVubmVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnZtL3RhcmdldC92bS5kYXJ0JyBzaG93IFZtVGFyZ2V0OwoKY2xhc3MgRmx1dHRlclJ1bm5lclRhcmdldCBleHRlbmRzIFZtVGFyZ2V0IHsKICBGbHV0dGVyUnVubmVyVGFyZ2V0KFRhcmdldEZsYWdzIGZsYWdzKSA6IHN1cGVyKGZsYWdzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+ICdmbHV0dGVyX3J1bm5lcic7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZVN1cGVyTWl4aW5zID0+IHRydWU7CgogIC8vIFRoaXMgaXMgdGhlIG9yZGVyIHRoYXQgYm9vdHN0cmFwIGxpYnJhcmllcyBhcmUgbG9hZGVkIGFjY29yZGluZyB0bwogIC8vIGBydW50aW1lL3ZtL29iamVjdF9zdG9yZS5oYC4KICBAb3ZlcnJpZGUKICBMaXN0PFN0cmluZz4gZ2V0IGV4dHJhUmVxdWlyZWRMaWJyYXJpZXMgPT4gY29uc3QgPFN0cmluZz5bCiAgICAgICAgJ2RhcnQ6YXN5bmMnLAogICAgICAgICdkYXJ0OmNvbGxlY3Rpb24nLAogICAgICAgICdkYXJ0OmNvbnZlcnQnLAogICAgICAgICdkYXJ0OmRldmVsb3BlcicsCiAgICAgICAgJ2RhcnQ6ZmZpJywKICAgICAgICAnZGFydDpfaW50ZXJuYWwnLAogICAgICAgICdkYXJ0Omlzb2xhdGUnLAogICAgICAgICdkYXJ0Om1hdGgnLAoKICAgICAgICAvLyBUaGUgbGlicmFyeSBkYXJ0Om1pcnJvcnMgbWF5IGJlIGlnbm9yZWQgYnkgdGhlIFZNLCBlLmcuIHdoZW4gYnVpbHQgaW4KICAgICAgICAvLyBQUk9EVUNUIG1vZGUuCiAgICAgICAgJ2RhcnQ6bWlycm9ycycsCgogICAgICAgICdkYXJ0OnR5cGVkX2RhdGEnLAogICAgICAgICdkYXJ0Om5hdGl2ZXdyYXBwZXJzJywKICAgICAgICAnZGFydDppbycsCiAgICAgICAgJ2RhcnQ6d2FzbScsCgogICAgICAgIC8vIFJlcXVpcmVkIGZvciBmbHV0dGVyX3J1bm5lci4KICAgICAgICAnZGFydDpmdWNoc2lhLmJ1aWx0aW4nLAogICAgICAgICdkYXJ0OnppcmNvbicsCiAgICAgICAgJ2RhcnQ6ZnVjaHNpYScsCiAgICAgICAgJ2RhcnQ6dm1zZXJ2aWNlX2lvJywKICAgICAgICAnZGFydDp1aScsCiAgICAgIF07CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllc1BsYXRmb3JtID0+IGNvbnN0IDxTdHJpbmc+W107Cn0KNABOTjwiAS0yAS05AQwnAQwmAUgiDD0WGxgaFBoYFQFRGRgBGx8TFQEoIBcYHRMJAQxHAgElcGFja2FnZTp2bS90YXJnZXQvZmx1dHRlcl9ydW5uZXIuZGFydEVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdGFyZ2V0L3ZtLmRhcnS+My8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkgdm0udGFyZ2V0LnZtOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9yZWZlcmVuY2VfZnJvbV9pbmRleC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvY2hhbmdlZF9zdHJ1Y3R1cmVfbm90aWZpZXIuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL21peGluX2Z1bGxfcmVzb2x1dGlvbi5kYXJ0JwogICAgYXMgdHJhbnNmb3JtTWl4aW5zIHNob3cgdHJhbnNmb3JtTGlicmFyaWVzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9jb250aW51YXRpb24uZGFydCcgYXMgdHJhbnNmb3JtQXN5bmMKICAgIHNob3cgdHJhbnNmb3JtTGlicmFyaWVzLCB0cmFuc2Zvcm1Qcm9jZWR1cmU7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92bS9jb25zdGFudHNfbmF0aXZlX2VmZmVjdHMuZGFydCcKICAgIHNob3cgVm1Db25zdGFudHNCYWNrZW5kOwoKaW1wb3J0ICcuLi9tZXRhZGF0YS9iaW5hcnlfY2FjaGUuZGFydCcgc2hvdyBCaW5hcnlDYWNoZU1ldGFkYXRhUmVwb3NpdG9yeTsKaW1wb3J0ICcuLi90cmFuc2Zvcm1hdGlvbnMvY2FsbF9zaXRlX2Fubm90YXRvci5kYXJ0JyBhcyBjYWxsU2l0ZUFubm90YXRvcjsKaW1wb3J0ICcuLi90cmFuc2Zvcm1hdGlvbnMvbGF0ZV92YXJfaW5pdF90cmFuc2Zvcm1lci5kYXJ0JwogICAgYXMgbGF0ZVZhckluaXRUcmFuc2Zvcm1lcjsKaW1wb3J0ICcuLi90cmFuc2Zvcm1hdGlvbnMvbGlzdF9mYWN0b3J5X3NwZWNpYWxpemVyLmRhcnQnCiAgICBhcyBsaXN0RmFjdG9yeVNwZWNpYWxpemVyOwppbXBvcnQgJy4uL3RyYW5zZm9ybWF0aW9ucy9mZmkuZGFydCcgYXMgdHJhbnNmb3JtRmZpIHNob3cgUmVwbGFjZWRNZW1iZXJzOwppbXBvcnQgJy4uL3RyYW5zZm9ybWF0aW9ucy9mZmlfZGVmaW5pdGlvbnMuZGFydCcgYXMgdHJhbnNmb3JtRmZpRGVmaW5pdGlvbnMKICAgIHNob3cgdHJhbnNmb3JtTGlicmFyaWVzOwppbXBvcnQgJy4uL3RyYW5zZm9ybWF0aW9ucy9mZmlfdXNlX3NpdGVzLmRhcnQnIGFzIHRyYW5zZm9ybUZmaVVzZVNpdGVzCiAgICBzaG93IHRyYW5zZm9ybUxpYnJhcmllczsKCi8vLyBTcGVjaWFsaXplcyB0aGUga2VybmVsIElSIHRvIHRoZSBEYXJ0IFZNLgpjbGFzcyBWbVRhcmdldCBleHRlbmRzIFRhcmdldCB7CiAgZmluYWwgVGFyZ2V0RmxhZ3MgZmxhZ3M7CgogIENsYXNzIF9ncm93YWJsZUxpc3Q7CiAgQ2xhc3MgX2ltbXV0YWJsZUxpc3Q7CiAgQ2xhc3MgX2ludGVybmFsTGlua2VkSGFzaE1hcDsKICBDbGFzcyBfaW1tdXRhYmxlTWFwOwogIENsYXNzIF9vbmVCeXRlU3RyaW5nOwogIENsYXNzIF90d29CeXRlU3RyaW5nOwogIENsYXNzIF9zbWk7CiAgQ2xhc3MgX2RvdWJsZTsgLy8gX0RvdWJsZSwgbm90IGRvdWJsZS4KCiAgVm1UYXJnZXQodGhpcy5mbGFncyk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGVuYWJsZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgc3VwcG9ydHNTZXRMaXRlcmFscyA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgc3VwcG9ydHNMYXRlRmllbGRzID0+ICFmbGFncy5mb3JjZUxhdGVMb3dlcmluZ0ZvclRlc3Rpbmc7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiAndm0nOwoKICAvLyBUaGlzIGlzIHRoZSBvcmRlciB0aGF0IGJvb3RzdHJhcCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhY2NvcmRpbmcgdG8KICAvLyBgcnVudGltZS92bS9vYmplY3Rfc3RvcmUuaGAuCiAgQG92ZXJyaWRlCiAgTGlzdDxTdHJpbmc+IGdldCBleHRyYVJlcXVpcmVkTGlicmFyaWVzID0+IGNvbnN0IDxTdHJpbmc+WwogICAgICAgICdkYXJ0OmFzeW5jJywKICAgICAgICAnZGFydDpjb2xsZWN0aW9uJywKICAgICAgICAnZGFydDpjb252ZXJ0JywKICAgICAgICAnZGFydDpkZXZlbG9wZXInLAogICAgICAgICdkYXJ0OmZmaScsCiAgICAgICAgJ2RhcnQ6X2ludGVybmFsJywKICAgICAgICAnZGFydDppc29sYXRlJywKICAgICAgICAnZGFydDptYXRoJywKCiAgICAgICAgLy8gVGhlIGxpYnJhcnkgZGFydDptaXJyb3JzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBWTSwgZS5nLiB3aGVuIGJ1aWx0IGluCiAgICAgICAgLy8gUFJPRFVDVCBtb2RlLgogICAgICAgICdkYXJ0Om1pcnJvcnMnLAoKICAgICAgICAnZGFydDp0eXBlZF9kYXRhJywKICAgICAgICAnZGFydDp2bXNlcnZpY2VfaW8nLAogICAgICAgICdkYXJ0Ol92bXNlcnZpY2UnLAogICAgICAgICdkYXJ0Ol9idWlsdGluJywKICAgICAgICAnZGFydDpuYXRpdmV3cmFwcGVycycsCiAgICAgICAgJ2RhcnQ6aW8nLAogICAgICAgICdkYXJ0OmNsaScsCiAgICAgICAgJ2RhcnQ6d2FzbScsCiAgICAgIF07CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFSZXF1aXJlZExpYnJhcmllc1BsYXRmb3JtID0+IGNvbnN0IDxTdHJpbmc+W107CgogIHZvaWQgX3BhdGNoVm1Db25zdGFudHMoQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgLy8gRml4IEVuZGlhbi5ob3N0IHRvIGJlIGEgY29uc3QgZmllbGQgZXF1YWwgdG8gRW5kaWFuLmxpdHRsZSBpbnN0ZWFkIG9mCiAgICAvLyBhIGZpbmFsIGZpZWxkLiBWTSBkb2VzIG5vdCBzdXBwb3J0IGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcyBhdCB0aGUKICAgIC8vIG1vbWVudC4KICAgIC8vIENhbid0IHVzZSBub3JtYWwgcGF0Y2hpbmcgcHJvY2VzcyBmb3IgdGhpcyBiZWNhdXNlIENGRSBkb2VzIG5vdAogICAgLy8gc3VwcG9ydCBwYXRjaGluZyBmaWVsZHMuCiAgICAvLyBTZWUgaHR0cDovL2RhcnRidWcuY29tLzMyODM2IGZvciB0aGUgYmFja2dyb3VuZC4KICAgIGZpbmFsIEZpZWxkIGhvc3QgPQogICAgICAgIGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6dHlwZWRfZGF0YScsICdFbmRpYW4nLCAnaG9zdCcpOwogICAgZmluYWwgRmllbGQgbGl0dGxlID0KICAgICAgICBjb3JlVHlwZXMuaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OnR5cGVkX2RhdGEnLCAnRW5kaWFuJywgJ2xpdHRsZScpOwogICAgaG9zdC5pc0NvbnN0ID0gdHJ1ZTsKICAgIGhvc3QuaW5pdGlhbGl6ZXIgPSBuZXcgQ2xvbmVWaXNpdG9yTm90TWVtYmVycygpLmNsb25lKGxpdHRsZS5pbml0aWFsaXplcikKICAgICAgLi5wYXJlbnQgPSBob3N0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwZXJmb3JtUHJlQ29uc3RhbnRFdmFsdWF0aW9uVHJhbnNmb3JtYXRpb25zKAogICAgICBDb21wb25lbnQgY29tcG9uZW50LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAge3ZvaWQgbG9nZ2VyKFN0cmluZyBtc2cpLAogICAgICBDaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyfSkgewogICAgc3VwZXIucGVyZm9ybVByZUNvbnN0YW50RXZhbHVhdGlvblRyYW5zZm9ybWF0aW9ucygKICAgICAgICBjb21wb25lbnQsIGNvcmVUeXBlcywgbGlicmFyaWVzLCBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgICAgbG9nZ2VyOiBsb2dnZXIpOwogICAgX3BhdGNoVm1Db25zdGFudHMoY29yZVR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8U3RyaW5nPiBnZXQgZXh0cmFJbmRleGVkTGlicmFyaWVzID0+IGNvbnN0IDxTdHJpbmc+WwogICAgICAgIC8vIFRPRE8oYXNrZXNjKTogV2hlbiB0aGUgVk0gc3VwcG9ydHMgc2V0IGxpdGVyYWxzLCB3ZSBubyBsb25nZXIKICAgICAgICAvLyBuZWVkIHRvIGluZGV4IGRhcnQ6Y29sbGVjdGlvbiwgYXMgaXQgaXMgb25seSBuZWVkZWQgZm9yIGRlc3VnYXJpbmcgb2YKICAgICAgICAvLyBjb25zdCBzZXRzLiBXZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IGF0IHRoYXQgdGltZS4KICAgICAgICAiZGFydDpjb2xsZWN0aW9uIiwKICAgICAgICAvLyBUaGUgYnl0ZWNvZGUgcGlwZWxpbmUgdXNlcyB0aGUgaW5kZXggdG8gY2hlY2sgaWYgZGFydDpmZmkgaXMgdXNlZC4KICAgICAgICAiZGFydDpmZmkiLAogICAgICAgIC8vIFRPRE8oYXNrZXNjKTogVGhpcyBpcyBmb3IgdGhlIFZNIGhvc3QgZW5kaWFuIG9wdGltaXphdGlvbiwgd2hpY2gKICAgICAgICAvLyBjb3VsZCBwb3NzaWJseSBiZSBkb25lIG1vcmUgY2xlYW5seSBhZnRlciB0aGUgVk0gbm8gbG9uZ2VyIHN1cHBvcnRzCiAgICAgICAgLy8gZG9pbmcgY29uc3RhbnQgZXZhbHVhdGlvbiBvbiBpdHMgb3duLiBTZWUgaHR0cDovL2RhcnRidWcuY29tLzMyODM2CiAgICAgICAgImRhcnQ6dHlwZWRfZGF0YSIsCiAgICAgIF07CgogIEBvdmVycmlkZQogIHZvaWQgcGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllcygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXMsCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgIFJlZmVyZW5jZUZyb21JbmRleCByZWZlcmVuY2VGcm9tSW5kZXgsCiAgICAgIHt2b2lkIGxvZ2dlcihTdHJpbmcgbXNnKSwKICAgICAgQ2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyIGNoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllcn0pIHsKICAgIHRyYW5zZm9ybU1peGlucy50cmFuc2Zvcm1MaWJyYXJpZXMoCiAgICAgICAgdGhpcywgY29yZVR5cGVzLCBoaWVyYXJjaHksIGxpYnJhcmllcywgcmVmZXJlbmNlRnJvbUluZGV4LAogICAgICAgIGRvU3VwZXJSZXNvbHV0aW9uOiBmYWxzZSAvKiByZXNvbHV0aW9uIGlzIGRvbmUgaW4gRGFydCBWTSAqLyk7CiAgICBsb2dnZXI/LmNhbGwoIlRyYW5zZm9ybWVkIG1peGluIGFwcGxpY2F0aW9ucyIpOwoKICAgIHRyYW5zZm9ybUZmaS5SZXBsYWNlZE1lbWJlcnMgcmVwbGFjZWRGaWVsZHMgPQogICAgICAgIHRyYW5zZm9ybUZmaURlZmluaXRpb25zLnRyYW5zZm9ybUxpYnJhcmllcygKICAgICAgICAgICAgY29tcG9uZW50LAogICAgICAgICAgICBjb3JlVHlwZXMsCiAgICAgICAgICAgIGhpZXJhcmNoeSwKICAgICAgICAgICAgbGlicmFyaWVzLAogICAgICAgICAgICBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgICAgICAgIHJlZmVyZW5jZUZyb21JbmRleCwKICAgICAgICAgICAgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyKTsKICAgIHRyYW5zZm9ybUZmaVVzZVNpdGVzLnRyYW5zZm9ybUxpYnJhcmllcyhjb21wb25lbnQsIGNvcmVUeXBlcywgaGllcmFyY2h5LAogICAgICAgIGxpYnJhcmllcywgZGlhZ25vc3RpY1JlcG9ydGVyLCByZXBsYWNlZEZpZWxkcywgcmVmZXJlbmNlRnJvbUluZGV4KTsKICAgIGxvZ2dlcj8uY2FsbCgiVHJhbnNmb3JtZWQgZmZpIGFubm90YXRpb25zIik7CgogICAgLy8gVE9ETyhrbWlsbGlraW4pOiBNYWtlIHRoaXMgcnVuIG9uIGEgcGVyLW1ldGhvZCBiYXNpcy4KICAgIGJvb2wgcHJvZHVjdE1vZGUgPSBlbnZpcm9ubWVudERlZmluZXNbImRhcnQudm0ucHJvZHVjdCJdID09ICJ0cnVlIjsKICAgIHRyYW5zZm9ybUFzeW5jLnRyYW5zZm9ybUxpYnJhcmllcygKICAgICAgICBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KSwgbGlicmFyaWVzLAogICAgICAgIHByb2R1Y3RNb2RlOiBwcm9kdWN0TW9kZSk7CiAgICBsb2dnZXI/LmNhbGwoIlRyYW5zZm9ybWVkIGFzeW5jIG1ldGhvZHMiKTsKCiAgICBsaXN0RmFjdG9yeVNwZWNpYWxpemVyLnRyYW5zZm9ybUxpYnJhcmllcyhsaWJyYXJpZXMsIGNvcmVUeXBlcyk7CiAgICBsb2dnZXI/LmNhbGwoIlNwZWNpYWxpemVkIGxpc3QgZmFjdG9yaWVzIik7CgogICAgbGF0ZVZhckluaXRUcmFuc2Zvcm1lci50cmFuc2Zvcm1MaWJyYXJpZXMobGlicmFyaWVzKTsKICAgIGxvZ2dlcj8uY2FsbCgiVHJhbnNmb3JtZWQgbGF0ZSB2YXJpYWJsZSBpbml0aWFsaXplcnMiKTsKCiAgICBjYWxsU2l0ZUFubm90YXRvci50cmFuc2Zvcm1MaWJyYXJpZXMoCiAgICAgICAgY29tcG9uZW50LCBsaWJyYXJpZXMsIGNvcmVUeXBlcywgaGllcmFyY2h5KTsKICAgIGxvZ2dlcj8uY2FsbCgiQW5ub3RhdGVkIGNhbGwgc2l0ZXMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcGVyZm9ybVRyYW5zZm9ybWF0aW9uc09uUHJvY2VkdXJlKAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIFByb2NlZHVyZSBwcm9jZWR1cmUsCiAgICAgIHt2b2lkIGxvZ2dlcihTdHJpbmcgbXNnKX0pIHsKICAgIHRyYW5zZm9ybUFzeW5jLnRyYW5zZm9ybVByb2NlZHVyZSgKICAgICAgICBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KSwgcHJvY2VkdXJlKTsKICAgIGxvZ2dlcj8uY2FsbCgiVHJhbnNmb3JtZWQgYXN5bmMgZnVuY3Rpb25zIik7CiAgfQoKICBFeHByZXNzaW9uIF9pbnN0YW50aWF0ZUludm9jYXRpb25NaXJyb3JXaXRoVHlwZSgKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIGludCBvZmZzZXQsCiAgICAgIGludCB0eXBlKSB7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICBjb3JlVHlwZXMuaW52b2NhdGlvbk1pcnJvcldpdGhUeXBlQ29uc3RydWN0b3IsCiAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICBuZXcgU3ltYm9sTGl0ZXJhbChuYW1lKS4uZmlsZU9mZnNldCA9IG9mZnNldCwKICAgICAgICAgIG5ldyBJbnRMaXRlcmFsKHR5cGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0LAogICAgICAgICAgX2ZpeGVkTGVuZ3RoTGlzdCgKICAgICAgICAgICAgICBjb3JlVHlwZXMsCiAgICAgICAgICAgICAgY29yZVR5cGVzLnR5cGVMZWdhY3lSYXdUeXBlLAogICAgICAgICAgICAgIGFyZ3VtZW50cy50eXBlcy5tYXAoKHQpID0+IG5ldyBUeXBlTGl0ZXJhbCh0KSkudG9MaXN0KCksCiAgICAgICAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQpLAogICAgICAgICAgX2ZpeGVkTGVuZ3RoTGlzdChjb3JlVHlwZXMsIGNvbnN0IER5bmFtaWNUeXBlKCksIGFyZ3VtZW50cy5wb3NpdGlvbmFsLAogICAgICAgICAgICAgIGFyZ3VtZW50cy5maWxlT2Zmc2V0KSwKICAgICAgICAgIG5ldyBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICAgIGNvcmVUeXBlcy5tYXBVbm1vZGlmaWFibGUsCiAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyhbCiAgICAgICAgICAgICAgICBuZXcgTWFwTGl0ZXJhbChuZXcgTGlzdDxNYXBFbnRyeT4uZnJvbSgKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMubmFtZWQubWFwKChOYW1lZEV4cHJlc3Npb24gYXJnKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWFwRW50cnkoCiAgICAgICAgICAgICAgICAgICAgICBuZXcgU3ltYm9sTGl0ZXJhbChhcmcubmFtZSkuLmZpbGVPZmZzZXQgPSBhcmcuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIGFyZy52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBhcmcuZmlsZU9mZnNldDsKICAgICAgICAgICAgICAgIH0pKSwga2V5VHlwZTogY29yZVR5cGVzLnN5bWJvbExlZ2FjeVJhd1R5cGUpCiAgICAgICAgICAgICAgICAgIC4uaXNDb25zdCA9IChhcmd1bWVudHMubmFtZWQubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFyZ3VtZW50cy5maWxlT2Zmc2V0CiAgICAgICAgICAgICAgXSwgdHlwZXM6IFsKICAgICAgICAgICAgICAgIGNvcmVUeXBlcy5zeW1ib2xMZWdhY3lSYXdUeXBlLAogICAgICAgICAgICAgICAgbmV3IER5bmFtaWNUeXBlKCkKICAgICAgICAgICAgICBdKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgXSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbnN0YW50aWF0ZUludm9jYXRpb24oQ29yZVR5cGVzIGNvcmVUeXBlcywgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsIGJvb2wgaXNTdXBlcikgewogICAgYm9vbCBpc0dldHRlciA9IGZhbHNlLCBpc1NldHRlciA9IGZhbHNlLCBpc01ldGhvZCA9IGZhbHNlOwogICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgic2V0OiIpKSB7CiAgICAgIGlzU2V0dGVyID0gdHJ1ZTsKICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDQpICsgIj0iOwogICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoImdldDoiKSkgewogICAgICBpc0dldHRlciA9IHRydWU7CiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyg0KTsKICAgIH0gZWxzZSB7CiAgICAgIGlzTWV0aG9kID0gdHJ1ZTsKICAgIH0KCiAgICBpbnQgdHlwZSA9IF9pbnZvY2F0aW9uVHlwZSgKICAgICAgICBpc0dldHRlcjogaXNHZXR0ZXIsCiAgICAgICAgaXNTZXR0ZXI6IGlzU2V0dGVyLAogICAgICAgIGlzTWV0aG9kOiBpc01ldGhvZCwKICAgICAgICBpc1N1cGVyOiBpc1N1cGVyKTsKCiAgICByZXR1cm4gX2luc3RhbnRpYXRlSW52b2NhdGlvbk1pcnJvcldpdGhUeXBlKAogICAgICAgIGNvcmVUeXBlcywgcmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0LCB0eXBlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcihDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaXNNZXRob2Q6IGZhbHNlLAogICAgICBib29sIGlzR2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1NldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNGaWVsZDogZmFsc2UsCiAgICAgIGJvb2wgaXNMb2NhbFZhcmlhYmxlOiBmYWxzZSwKICAgICAgYm9vbCBpc0R5bmFtaWM6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIGlzU3RhdGljOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0cnVjdG9yOiBmYWxzZSwKICAgICAgYm9vbCBpc1RvcExldmVsOiBmYWxzZX0pIHsKICAgIGludCB0eXBlID0gX2ludm9jYXRpb25UeXBlKAogICAgICAgIGlzTWV0aG9kOiBpc01ldGhvZCwKICAgICAgICBpc0dldHRlcjogaXNHZXR0ZXIsCiAgICAgICAgaXNTZXR0ZXI6IGlzU2V0dGVyLAogICAgICAgIGlzRmllbGQ6IGlzRmllbGQsCiAgICAgICAgaXNMb2NhbFZhcmlhYmxlOiBpc0xvY2FsVmFyaWFibGUsCiAgICAgICAgaXNEeW5hbWljOiBpc0R5bmFtaWMsCiAgICAgICAgaXNTdXBlcjogaXNTdXBlciwKICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMsCiAgICAgICAgaXNDb25zdHJ1Y3RvcjogaXNDb25zdHJ1Y3RvciwKICAgICAgICBpc1RvcExldmVsOiBpc1RvcExldmVsKTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgIGNvcmVUeXBlcy5ub1N1Y2hNZXRob2RFcnJvckRlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgIHJlY2VpdmVyLAogICAgICAgICAgX2luc3RhbnRpYXRlSW52b2NhdGlvbk1pcnJvcldpdGhUeXBlKAogICAgICAgICAgICAgIGNvcmVUeXBlcywgcmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0LCB0eXBlKQogICAgICAgIF0pKTsKICB9CgogIGludCBfaW52b2NhdGlvblR5cGUoCiAgICAgIHtib29sIGlzTWV0aG9kOiBmYWxzZSwKICAgICAgYm9vbCBpc0dldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzRmllbGQ6IGZhbHNlLAogICAgICBib29sIGlzTG9jYWxWYXJpYWJsZTogZmFsc2UsCiAgICAgIGJvb2wgaXNEeW5hbWljOiBmYWxzZSwKICAgICAgYm9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdHJ1Y3RvcjogZmFsc2UsCiAgICAgIGJvb2wgaXNUb3BMZXZlbDogZmFsc2V9KSB7CiAgICAvLyBUaGlzIGlzIGNvcGllZCBmcm9tIFtfSW52b2NhdGlvbk1pcnJvcl0oCiAgICAvLyAuLi8uLi8uLi8uLi8uLi8uLi9ydW50aW1lL2xpYi9pbnZvY2F0aW9uX21pcnJvcl9wYXRjaC5kYXJ0KS4KCiAgICAvLyBDb25zdGFudHMgZGVzY3JpYmluZyB0aGUgaW52b2NhdGlvbiB0eXBlLgogICAgLy8gX0ZJRUxEIGNhbm5vdCBiZSBnZW5lcmF0ZWQgYnkgcmVndWxhciBpbnZvY2F0aW9uIG1pcnJvcnMuCiAgICBjb25zdCBpbnQgX01FVEhPRCA9IDA7CiAgICBjb25zdCBpbnQgX0dFVFRFUiA9IDE7CiAgICBjb25zdCBpbnQgX1NFVFRFUiA9IDI7CiAgICBjb25zdCBpbnQgX0ZJRUxEID0gMzsKICAgIGNvbnN0IGludCBfTE9DQUxfVkFSID0gNDsKICAgIC8vIGlnbm9yZTogVU5VU0VEX0xPQ0FMX1ZBUklBQkxFCiAgICBjb25zdCBpbnQgX0tJTkRfU0hJRlQgPSAwOwogICAgY29uc3QgaW50IF9LSU5EX0JJVFMgPSAzOwogICAgLy8gaWdub3JlOiBVTlVTRURfTE9DQUxfVkFSSUFCTEUKICAgIGNvbnN0IGludCBfS0lORF9NQVNLID0gKDEgPDwgX0tJTkRfQklUUykgLSAxOwoKICAgIC8vIFRoZXNlIHZhbHVlcywgZXhjZXB0IF9EWU5BTUlDIGFuZCBfU1VQRVIsIGFyZSBvbmx5IHVzZWQgd2hlbiB0aHJvd2luZwogICAgLy8gTm9TdWNoTWV0aG9kRXJyb3IgZm9yIGNvbXBpbGUtdGltZSByZXNvbHV0aW9uIGZhaWx1cmVzLgogICAgY29uc3QgaW50IF9EWU5BTUlDID0gMDsKICAgIGNvbnN0IGludCBfU1VQRVIgPSAxOwogICAgY29uc3QgaW50IF9TVEFUSUMgPSAyOwogICAgY29uc3QgaW50IF9DT05TVFJVQ1RPUiA9IDM7CiAgICBjb25zdCBpbnQgX1RPUF9MRVZFTCA9IDQ7CiAgICBjb25zdCBpbnQgX0xFVkVMX1NISUZUID0gX0tJTkRfQklUUzsKICAgIGNvbnN0IGludCBfTEVWRUxfQklUUyA9IDM7CiAgICAvLyBpZ25vcmU6IFVOVVNFRF9MT0NBTF9WQVJJQUJMRQogICAgY29uc3QgaW50IF9MRVZFTF9NQVNLID0gKDEgPDwgX0xFVkVMX0JJVFMpIC0gMTsKCiAgICBpbnQgdHlwZSA9IC0xOwogICAgLy8gRm9yIGNvbnZlbmllbmNlLCBbaXNHZXR0ZXJdIGFuZCBbaXNTZXR0ZXJdIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgogICAgLy8gW2lzTWV0aG9kXS4KICAgIGlmIChpc0dldHRlcikgewogICAgICB0eXBlID0gX0dFVFRFUjsKICAgIH0gZWxzZSBpZiAoaXNTZXR0ZXIpIHsKICAgICAgdHlwZSA9IF9TRVRURVI7CiAgICB9IGVsc2UgaWYgKGlzTWV0aG9kKSB7CiAgICAgIHR5cGUgPSBfTUVUSE9EOwogICAgfSBlbHNlIGlmIChpc0ZpZWxkKSB7CiAgICAgIHR5cGUgPSBfRklFTEQ7CiAgICB9IGVsc2UgaWYgKGlzTG9jYWxWYXJpYWJsZSkgewogICAgICB0eXBlID0gX0xPQ0FMX1ZBUjsKICAgIH0KCiAgICBpZiAoaXNEeW5hbWljKSB7CiAgICAgIHR5cGUgfD0gKF9EWU5BTUlDIDw8IF9MRVZFTF9TSElGVCk7CiAgICB9IGVsc2UgaWYgKGlzU3VwZXIpIHsKICAgICAgdHlwZSB8PSAoX1NVUEVSIDw8IF9MRVZFTF9TSElGVCk7CiAgICB9IGVsc2UgaWYgKGlzU3RhdGljKSB7CiAgICAgIHR5cGUgfD0gKF9TVEFUSUMgPDwgX0xFVkVMX1NISUZUKTsKICAgIH0gZWxzZSBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICB0eXBlIHw9IChfQ09OU1RSVUNUT1IgPDwgX0xFVkVMX1NISUZUKTsKICAgIH0gZWxzZSBpZiAoaXNUb3BMZXZlbCkgewogICAgICB0eXBlIHw9IChfVE9QX0xFVkVMIDw8IF9MRVZFTF9TSElGVCk7CiAgICB9CgogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBFeHByZXNzaW9uIF9maXhlZExlbmd0aExpc3QoQ29yZVR5cGVzIGNvcmVUeXBlcywgRGFydFR5cGUgdHlwZUFyZ3VtZW50LAogICAgICBMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzLCBpbnQgb2Zmc2V0KSB7CiAgICAvLyBUT0RPKGFoZSk6IEl0J3MgcG9zc2libGUgdGhhdCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gY3JlYXRlIGEgZml4ZWQtbGVuZ3RoCiAgICAvLyBsaXN0IGZpcnN0LCBhbmQgdGhlbiBwb3B1bGF0ZSBpdC4gVGhhdCB3b3VsZCBjcmVhdGUgZmV3ZXIgb2JqZWN0cy4gQnV0IGFzCiAgICAvLyB0aGlzIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgaW4gKHN0YXRpY2FsbHkgcmVzb2x2ZWQpIG5vLXN1Y2gtbWV0aG9kCiAgICAvLyBoYW5kbGluZywgdGhlIGN1cnJlbnQgYXBwcm9hY2ggc2VlbXMgc3VmZmljaWVudC4KCiAgICAvLyBUaGUgMC1lbGVtZW50IGxpc3QgbXVzdCBiZSBleGFjdGx5ICdjb25zdFtdJy4KICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gbmV3IExpc3RMaXRlcmFsKFtdLCB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCkuLmlzQ29uc3QgPSB0cnVlOwogICAgfQoKICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb3JlVHlwZXMubGlzdFVubW9kaWZpYWJsZUNvbnN0cnVjdG9yLAogICAgICAgIG5ldyBBcmd1bWVudHMoWwogICAgICAgICAgbmV3IExpc3RMaXRlcmFsKGVsZW1lbnRzLCB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgXSwgdHlwZXM6IFsKICAgICAgICAgIHR5cGVBcmd1bWVudCwKICAgICAgICBdKSk7CiAgfQoKICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgd2UgYWxsb3cgVk0gdGVzdHMgdG8gaW1wb3J0CiAgLy8gcHJpdmF0ZSBwbGF0Zm9ybSBsaWJyYXJpZXMgLSBzdWNoIGFzIGBkYXJ0Ol9pbnRlcm5hbGAgLSBmb3IgdGVzdGluZwogIC8vIHB1cnBvc2VzLgogIGJvb2wgYWxsb3dQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzKFVyaSBpbXBvcnRlciwgVXJpIGltcG9ydGVkKSA9PgogICAgICBzdXBlci5hbGxvd1BsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MoaW1wb3J0ZXIsIGltcG9ydGVkKSB8fAogICAgICBpbXBvcnRlci5wYXRoLmNvbnRhaW5zKCdydW50aW1lL3Rlc3RzL3ZtL2RhcnQnKTsKCiAgLy8gVE9ETyhzaWdtdW5kLGFoZSk6IGxpbWl0IHRoaXMgdG8gYGRhcnQtZXh0YCBsaWJyYXJpZXMgb25seSAoc2VlCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI5NzYzKS4KICBAb3ZlcnJpZGUKICBib29sIGVuYWJsZU5hdGl2ZShVcmkgdXJpKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBuYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nID0+IHRydWU7CgogIEBvdmVycmlkZQogIENvbXBvbmVudCBjb25maWd1cmVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgY2FsbFNpdGVBbm5vdGF0b3IuYWRkUmVwb3NpdG9yeVRvKGNvbXBvbmVudCk7CiAgICBjb21wb25lbnQuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KG5ldyBCaW5hcnlDYWNoZU1ldGFkYXRhUmVwb3NpdG9yeSgpKTsKICAgIHJldHVybiBzdXBlci5jb25maWd1cmVDb21wb25lbnQoY29tcG9uZW50KTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGNvbmNyZXRlTGlzdExpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICByZXR1cm4gX2dyb3dhYmxlTGlzdCA/Pz0KICAgICAgICBjb3JlVHlwZXMuaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdfR3Jvd2FibGVMaXN0Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzcyBjb25jcmV0ZUNvbnN0TGlzdExpdGVyYWxDbGFzcyhDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICByZXR1cm4gX2ltbXV0YWJsZUxpc3QgPz89CiAgICAgICAgY29yZVR5cGVzLmluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnX0ltbXV0YWJsZUxpc3QnKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGNvbmNyZXRlTWFwTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIHJldHVybiBfaW50ZXJuYWxMaW5rZWRIYXNoTWFwID8/PQogICAgICAgIGNvcmVUeXBlcy5pbmRleC5nZXRDbGFzcygnZGFydDpjb2xsZWN0aW9uJywgJ19JbnRlcm5hbExpbmtlZEhhc2hNYXAnKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGNvbmNyZXRlQ29uc3RNYXBMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgcmV0dXJuIF9pbW11dGFibGVNYXAgPz89CiAgICAgICAgY29yZVR5cGVzLmluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnX0ltbXV0YWJsZU1hcCcpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3MgY29uY3JldGVJbnRMaXRlcmFsQ2xhc3MoQ29yZVR5cGVzIGNvcmVUeXBlcywgaW50IHZhbHVlKSB7CiAgICBjb25zdCBpbnQgYml0c1BlckludDMyID0gMzI7CiAgICBjb25zdCBpbnQgc21pQml0czMyID0gYml0c1BlckludDMyIC0gMjsKICAgIGNvbnN0IGludCBzbWlNaW4zMiA9IC0oMSA8PCBzbWlCaXRzMzIpOwogICAgY29uc3QgaW50IHNtaU1heDMyID0gKDEgPDwgc21pQml0czMyKSAtIDE7CiAgICBpZiAoKHNtaU1pbjMyIDw9IHZhbHVlKSAmJiAodmFsdWUgPD0gc21pTWF4MzIpKSB7CiAgICAgIC8vIFZhbHVlIGZpdHMgaW50byBTbWkgb24gYWxsIHBsYXRmb3Jtcy4KICAgICAgcmV0dXJuIF9zbWkgPz89IGNvcmVUeXBlcy5pbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ19TbWknKTsKICAgIH0KICAgIC8vIE90aGVyd2lzZSwgY2xhc3MgY291bGQgYmUgZWl0aGVyIF9TbWkgb3IgX01pbnQgZGVwZW5kaW5nIG9uIGEgcGxhdGZvcm0uCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGNvbmNyZXRlRG91YmxlTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMsIGRvdWJsZSB2YWx1ZSkgewogICAgcmV0dXJuIF9kb3VibGUgPz89IGNvcmVUeXBlcy5pbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ19Eb3VibGUnKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGNvbmNyZXRlU3RyaW5nTGl0ZXJhbENsYXNzKENvcmVUeXBlcyBjb3JlVHlwZXMsIFN0cmluZyB2YWx1ZSkgewogICAgY29uc3QgaW50IG1heExhdGluMSA9IDB4ZmY7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmICh2YWx1ZS5jb2RlVW5pdEF0KGkpID4gbWF4TGF0aW4xKSB7CiAgICAgICAgcmV0dXJuIF90d29CeXRlU3RyaW5nID8/PQogICAgICAgICAgICBjb3JlVHlwZXMuaW5kZXguZ2V0Q2xhc3MoJ2RhcnQ6Y29yZScsICdfVHdvQnl0ZVN0cmluZycpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX29uZUJ5dGVTdHJpbmcgPz89CiAgICAgICAgY29yZVR5cGVzLmluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnX09uZUJ5dGVTdHJpbmcnKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50c0JhY2tlbmQgY29uc3RhbnRzQmFja2VuZChDb3JlVHlwZXMgY29yZVR5cGVzKSA9PgogICAgICBuZXcgVm1Db25zdGFudHNCYWNrZW5kKGNvcmVUeXBlcyk7Cn0Kgc4ATk48FgEiASIkLikzQC1DMEwxLzkdAUtLOx86H0tMHUcdAS4gGwEXGCAXGBgOKQEYAQwxAQwpAQxFAQwbAUgiDD0WGxgaFBoYFQFRGRgBGx0bGR8TFBUJAQxHATBNSg9HIDgXSBlKGU4XBAEMNBsbHy0gPDc9GSIEAQw8SVFFG04UTE9OGwkBDDEbGyAfLi0tIDwoQ0c0ATI0FxcXFyAgJ01MMQE9SCc+Iy8BRTABOjwBKjUqBAEMKkojJz8xBAEzGxsTGxISJjckODUcGStHJVElICkeOEAnUCEzPTw2Gi8iEiINBAEMTUQ/IxcmKhcgDRcGASAcHBwbATE9BAEMP0kdHBwbIx0bHCEhIBwcHBoqHhocJiEmNyQUMEINBAEXHRwcGyMdGxwhITBEATFBGxsbGh4lHx4lMgFNPxwaGyAeKR8lNAETSBMUFhsWGxYaFSIZBgEVKhooGykgLh0sBgERBAFKL1FRSzgBNSBOBgEhLxhAIhQYDQQBTEkPSEU3AUU1DCYBDDEBDDYySjAEAQw4HUAEAQw9HkEEAQw3Jk8EAQw8HUAEAQxCISwsLzYvRQZPEQQBDEhJBAEMSCAtLSJFCAYeQQQBDDwpAgEZcGFja2FnZTp2bS90YXJnZXQvdm0uZGFydEZmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL2tlcm5lbC5kYXJ0ieAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIENvbnZlbnRpb25zIGZvciBwYXRoczoKLy8vCi8vLyAtIFVzZSB0aGUgW1VyaV0gY2xhc3MgZm9yIHBhdGhzIHRoYXQgbWF5IGhhdmUgdGhlIGBmaWxlYCwgYGRhcnRgIG9yCi8vLyAgIGBwYWNrYWdlYCBzY2hlbWUuICBOZXZlciB1c2UgW1VyaV0gZm9yIHJlbGF0aXZlIHBhdGhzLgovLy8gLSBVc2UgW1N0cmluZ11zIGZvciBhbGwgZmlsZW5hbWVzIGFuZCBwYXRocyB0aGF0IGhhdmUgbm8gc2NoZW1lIHByZWZpeC4KLy8vIC0gTmV2ZXIgdHJhbnNsYXRlIGEgYGRhcnQ6YCBvciBgcGFja2FnZTpgIFVSSSBpbnRvIGEgYGZpbGU6YCBVUkksIGluc3RlYWQKLy8vICAgdHJhbnNsYXRlIGl0IHRvIGEgW1N0cmluZ10gaWYgdGhlIGZpbGUgc3lzdGVtIHBhdGggaXMgbmVlZGVkLgovLy8gLSBPbmx5IHVzZSBbRmlsZV0gZnJvbSBkYXJ0OmlvIGF0IHRoZSBsYXN0IG1vbWVudCB3aGVuIGl0IGlzIG5lZWRlZC4KLy8vCmxpYnJhcnkga2VybmVsOwoKaW1wb3J0ICdhc3QuZGFydCc7CmltcG9ydCAnYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydCc7CmltcG9ydCAnYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0JzsKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJzsKaW1wb3J0ICd0ZXh0L2FzdF90b190ZXh0LmRhcnQnOwoKZXhwb3J0ICdhc3QuZGFydCc7CgpDb21wb25lbnQgbG9hZENvbXBvbmVudEZyb21CaW5hcnkoU3RyaW5nIHBhdGgsIFtDb21wb25lbnQgY29tcG9uZW50XSkgewogIExpc3Q8aW50PiBieXRlcyA9IG5ldyBGaWxlKHBhdGgpLnJlYWRBc0J5dGVzU3luYygpOwogIHJldHVybiBsb2FkQ29tcG9uZW50RnJvbUJ5dGVzKGJ5dGVzLCBjb21wb25lbnQpOwp9CgpDb21wb25lbnQgbG9hZENvbXBvbmVudEZyb21CeXRlcyhMaXN0PGludD4gYnl0ZXMsIFtDb21wb25lbnQgY29tcG9uZW50XSkgewogIGNvbXBvbmVudCA/Pz0gbmV3IENvbXBvbmVudCgpOwogIG5ldyBCaW5hcnlCdWlsZGVyKGJ5dGVzKS5yZWFkQ29tcG9uZW50KGNvbXBvbmVudCk7CiAgcmV0dXJuIGNvbXBvbmVudDsKfQoKQ29tcG9uZW50IGxvYWRDb21wb25lbnRTb3VyY2VGcm9tQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLCBbQ29tcG9uZW50IGNvbXBvbmVudF0pIHsKICBjb21wb25lbnQgPz89IG5ldyBDb21wb25lbnQoKTsKICBuZXcgQmluYXJ5QnVpbGRlcihieXRlcykucmVhZENvbXBvbmVudFNvdXJjZShjb21wb25lbnQpOwogIHJldHVybiBjb21wb25lbnQ7Cn0KCkZ1dHVyZSB3cml0ZUNvbXBvbmVudFRvQmluYXJ5KENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBwYXRoKSB7CiAgdmFyIHNpbms7CiAgaWYgKHBhdGggPT0gJ251bGwnIHx8IHBhdGggPT0gJ3N0ZG91dCcpIHsKICAgIHNpbmsgPSBzdGRvdXQubm9uQmxvY2tpbmc7CiAgfSBlbHNlIHsKICAgIHNpbmsgPSBuZXcgRmlsZShwYXRoKS5vcGVuV3JpdGUoKTsKICB9CgogIHZhciBmdXR1cmU7CiAgdHJ5IHsKICAgIG5ldyBCaW5hcnlQcmludGVyKHNpbmspLndyaXRlQ29tcG9uZW50RmlsZShjb21wb25lbnQpOwogIH0gZmluYWxseSB7CiAgICBpZiAoc2luayA9PSBzdGRvdXQubm9uQmxvY2tpbmcpIHsKICAgICAgZnV0dXJlID0gc2luay5mbHVzaCgpOwogICAgfSBlbHNlIHsKICAgICAgZnV0dXJlID0gc2luay5jbG9zZSgpOwogICAgfQogIH0KCiAgcmV0dXJuIGZ1dHVyZTsKfQoKdm9pZCB3cml0ZUxpYnJhcnlUb1RleHQoTGlicmFyeSBsaWJyYXJ5LCB7U3RyaW5nIHBhdGh9KSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgUHJpbnRlcihidWZmZXIpLndyaXRlTGlicmFyeUZpbGUobGlicmFyeSk7CiAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgcHJpbnQoYnVmZmVyKTsKICB9IGVsc2UgewogICAgbmV3IEZpbGUocGF0aCkud3JpdGVBc1N0cmluZ1N5bmMoJyRidWZmZXInKTsKICB9Cn0KCnZvaWQgd3JpdGVDb21wb25lbnRUb1RleHQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtTdHJpbmcgcGF0aCwgYm9vbCBzaG93T2Zmc2V0czogZmFsc2UsIGJvb2wgc2hvd01ldGFkYXRhOiBmYWxzZX0pIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBQcmludGVyKGJ1ZmZlciwgc2hvd09mZnNldHM6IHNob3dPZmZzZXRzLCBzaG93TWV0YWRhdGE6IHNob3dNZXRhZGF0YSkKICAgICAgLndyaXRlQ29tcG9uZW50RmlsZShjb21wb25lbnQpOwogIGlmIChwYXRoID09IG51bGwpIHsKICAgIHByaW50KGJ1ZmZlcik7CiAgfSBlbHNlIHsKICAgIG5ldyBGaWxlKHBhdGgpLndyaXRlQXNTdHJpbmdTeW5jKCckYnVmZmVyJyk7CiAgfQp9ClYATk48ARsESD1MTkRJBBABEyQmFRIgARMBSDYzAgFLITUUAgFRITsUAgFCDCwfCycEAQ4IOw4mHQ0dBgQBEQIBOiwxFhMLMQQCAS9ILEwmFhMLMQQCARpwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydEZmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvbWV0YS9saWIvbWV0YS5kYXJ0tEkvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIENvbnN0YW50cyBmb3IgdXNlIGluIG1ldGFkYXRhIGFubm90YXRpb25zLgovLy8KLy8vIFNlZSBhbHNvIGBAZGVwcmVjYXRlZGAgYW5kIGBAb3ZlcnJpZGVgIGluIHRoZSBgZGFydDpjb3JlYCBsaWJyYXJ5LgovLy8KLy8vIEFubm90YXRpb25zIHByb3ZpZGUgc2VtYW50aWMgaW5mb3JtYXRpb24gdGhhdCB0b29scyBjYW4gdXNlIHRvIHByb3ZpZGUgYQovLy8gYmV0dGVyIHVzZXIgZXhwZXJpZW5jZS4gRm9yIGV4YW1wbGUsIGFuIElERSBtaWdodCBub3QgYXV0b2NvbXBsZXRlIHRoZSBuYW1lCi8vLyBvZiBhIGZ1bmN0aW9uIHRoYXQncyBiZWVuIG1hcmtlZCBgQGRlcHJlY2F0ZWRgLCBvciBpdCBtaWdodCBkaXNwbGF5IHRoZQovLy8gZnVuY3Rpb24ncyBuYW1lIGRpZmZlcmVudGx5LgovLy8KLy8vIEZvciBpbmZvcm1hdGlvbiBvbiBpbnN0YWxsaW5nIGFuZCBpbXBvcnRpbmcgdGhpcyBsaWJyYXJ5LCBzZWUgdGhlIFttZXRhCi8vLyBwYWNrYWdlIG9uIHB1Yi5kZXZdKGh0dHBzOi8vcHViLmRldi9wYWNrYWdlcy9tZXRhKS4gIEZvciBleGFtcGxlcyBvZiB1c2luZwovLy8gYW5ub3RhdGlvbnMsIHNlZQovLy8gW01ldGFkYXRhXShodHRwczovL2RhcnQuZGV2L2d1aWRlcy9sYW5ndWFnZS9sYW5ndWFnZS10b3VyI21ldGFkYXRhKSBpbiB0aGUKLy8vIGxhbmd1YWdlIHRvdXIuCmxpYnJhcnkgbWV0YTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGEgZnVuY3Rpb24gYGZgLiBJbmRpY2F0ZXMgdGhhdCBgZmAgYWx3YXlzIHRocm93cyBhbgovLy8gZXhjZXB0aW9uLiBBbnkgZnVuY3Rpb25zIHRoYXQgb3ZlcnJpZGUgYGZgLCBpbiBjbGFzcyBpbmhlcml0ZW5jZSwgYXJlIGFsc28KLy8vIGV4cGVjdGVkIHRvIGNvbmZvcm0gdG8gdGhpcyBjb250cmFjdC4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiB1c2UgdGhpcyB0byB1bmRlcnN0YW5kIHdoZXRoZXIgYSBibG9jayBvZgovLy8gY29kZSAiZXhpdHMiLiBGb3IgZXhhbXBsZToKLy8vCi8vLyBgYGBkYXJ0Ci8vLyBAYWx3YXlzVGhyb3dzIHRvc3MoKSB7IHRocm93ICdUaHJvd24nOyB9Ci8vLwovLy8gaW50IGZuKGJvb2wgYikgewovLy8gICBpZiAoYikgewovLy8gICAgIHJldHVybiAwOwovLy8gICB9IGVsc2UgewovLy8gICAgIHRvc3MoKTsKLy8vICAgICBwcmludCgiSGVsbG8uIik7Ci8vLyAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFdpdGhvdXQgdGhlIGFubm90YXRpb24gb24gYHRvc3NgLCBpdCB3b3VsZCBsb29rIGFzIHRob3VnaCBgZm5gIGRvZXNuJ3QKLy8vIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4gVGhlIGFubm90YXRpb24gc2hvd3MgdGhhdCBgZm5gIGRvZXMgYWx3YXlzIGV4aXQuIEluCi8vLyBhZGRpdGlvbiwgdGhlIGFubm90YXRpb24gcmV2ZWFscyB0aGF0IGFueSBzdGF0ZW1lbnRzIGZvbGxvd2luZyBhIGNhbGwgdG8KLy8vIGB0b3NzYCAobGlrZSB0aGUgYHByaW50YCBjYWxsKSBhcmUgZGVhZCBjb2RlLgovLy8KLy8vIFRvb2xzLCBzdWNoIGFzIHRoZSBhbmFseXplciwgY2FuIGFsc28gZXhwZWN0IHRoaXMgY29udHJhY3QgdG8gYmUgZW5mb3JjZWQ7Ci8vLyB0aGF0IGlzLCB0b29scyBtYXkgZW1pdCB3YXJuaW5ncyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhpcyBhbm5vdGF0aW9uCi8vLyBfZG9lc24ndF8gYWx3YXlzIHRocm93Lgpjb25zdCBfQWx3YXlzVGhyb3dzIGFsd2F5c1Rocm93cyA9IGNvbnN0IF9BbHdheXNUaHJvd3MoKTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGEgcGFyYW1ldGVyIG9mIGFuIGluc3RhbmNlIG1ldGhvZCB0aGF0IG92ZXJyaWRlcyBhbm90aGVyCi8vLyBtZXRob2QuCi8vLwovLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyBwYXJhbWV0ZXIgbWF5IGhhdmUgYSB0aWdodGVyIHR5cGUgdGhhbiB0aGUgcGFyYW1ldGVyIG9uCi8vLyBpdHMgc3VwZXJjbGFzcy4gVGhlIGFjdHVhbCBhcmd1bWVudCB3aWxsIGJlIGNoZWNrZWQgYXQgcnVudGltZSB0byBlbnN1cmUgaXQKLy8vIGlzIGEgc3VidHlwZSBvZiB0aGUgb3ZlcnJpZGRlbiBwYXJhbWV0ZXIgdHlwZS4KLy8vCi8vLyBERVBSRUNBVEVEOiBVc2UgdGhlIGBjb3ZhcmlhbnRgIG1vZGlmaWVyIGluc3RlYWQuCkBkZXByZWNhdGVkCmNvbnN0IF9DaGVja2VkIGNoZWNrZWQgPSBjb25zdCBfQ2hlY2tlZCgpOwoKLy8vIFVzZWQgdG8gYW5ub3RhdGUgYSBsaWJyYXJ5LCBvciBhbnkgZGVjbGFyYXRpb24gdGhhdCBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMKLy8vIGludGVyZmFjZSBvZiBhIGxpYnJhcnkgKHN1Y2ggYXMgdG9wLWxldmVsIG1lbWJlcnMsIGNsYXNzIG1lbWJlcnMsIGFuZAovLy8gZnVuY3Rpb24gcGFyYW1ldGVycykgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYW5ub3RhdGVkIEFQSSBpcyBleHBlcmltZW50YWwgYW5kCi8vLyBtYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGF0IGFueS10aW1lIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlCi8vLyBjb250YWluaW5nIHBhY2thZ2UsIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBpdCB3b3VsZCBvdGhlcndpc2UgYmUgYSBicmVha2luZwovLy8gY2hhbmdlLgovLy8KLy8vIElmIHRoZSBhbm5vdGF0aW9uIGlzIGFwcGxpZWQgdG8gYSBsaWJyYXJ5IHRoZW4gaXQgaXMgZXF1aXZhbGVudCB0byBhcHBseWluZwovLy8gdGhlIGFubm90YXRpb24gdG8gYWxsIG9mIHRoZSB0b3AtbGV2ZWwgbWVtYmVycyBvZiB0aGUgbGlicmFyeS4gQXBwbHlpbmcgdGhlCi8vLyBhbm5vdGF0aW9uIHRvIGEgY2xhc3MgZG9lcyAqbm90KiBhcHBseSB0aGUgYW5ub3RhdGlvbiB0byBzdWJjbGFzc2VzLCBidXQKLy8vIGRvZXMgYXBwbHkgdGhlIGFubm90YXRpb24gdG8gbWVtYmVycyBvZiB0aGUgY2xhc3MuCi8vLwovLy8gVG9vbHMsIHN1Y2ggYXMgdGhlIGFuYWx5emVyLCBjYW4gcHJvdmlkZSBmZWVkYmFjayBpZgovLy8KLy8vICogdGhlIGFubm90YXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgZGVjbGFyYXRpb24gdGhhdCBpcyBub3QgcGFydCBvZiB0aGUKLy8vICAgcHVibGljIGludGVyZmFjZSBvZiBhIGxpYnJhcnkgKHN1Y2ggYXMgYSBsb2NhbCB2YXJpYWJsZSBvciBhIGRlY2xhcmF0aW9uCi8vLyAgIHRoYXQgaXMgcHJpdmF0ZSkgb3IgYSBkaXJlY3RpdmUgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZQovLy8gICBsaWJyYXJ5LCBvcgovLy8gKiB0aGUgZGVjbGFyYXRpb24gaXMgcmVmZXJlbmNlZCBieSBhIHBhY2thZ2UgdGhhdCBoYXMgbm90IGV4cGxpY2l0bHkKLy8vICAgaW5kaWNhdGVkIGl0cyBpbnRlbnRpb24gdG8gdXNlIGV4cGVyaW1lbnRhbCBBUElzIChkZXRhaWxzIFRCRCkuCmNvbnN0IF9FeHBlcmltZW50YWwgZXhwZXJpbWVudGFsID0gY29uc3QgX0V4cGVyaW1lbnRhbCgpOwoKLy8vIFVzZWQgdG8gYW5ub3RhdGUgYW4gaW5zdGFuY2Ugb3Igc3RhdGljIG1ldGhvZCBgbWAuIEluZGljYXRlcyB0aGF0IGBtYCBtdXN0Ci8vLyBlaXRoZXIgYmUgYWJzdHJhY3Qgb3IgbXVzdCByZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0IG9yIGBudWxsYC4gSW4KLy8vIGFkZGl0aW9uLCBldmVyeSBtZXRob2QgdGhhdCBlaXRoZXIgaW1wbGVtZW50cyBvciBvdmVycmlkZXMgYG1gIGlzIGltcGxpY2l0bHkKLy8vIGFubm90YXRlZCB3aXRoIHRoaXMgc2FtZSBhbm5vdGF0aW9uLgovLy8KLy8vIFRvb2xzLCBzdWNoIGFzIHRoZSBhbmFseXplciwgY2FuIHByb3ZpZGUgZmVlZGJhY2sgaWYKLy8vCi8vLyAqIHRoZSBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGEgbWV0aG9kLCBvcgovLy8gKiBhIG1ldGhvZCB0aGF0IGhhcyB0aGlzIGFubm90YXRpb24gY2FuIHJldHVybiBhbnl0aGluZyBvdGhlciB0aGFuIGEgbmV3bHkKLy8vICAgYWxsb2NhdGVkIG9iamVjdCBvciBgbnVsbGAuCmNvbnN0IF9GYWN0b3J5IGZhY3RvcnkgPSBjb25zdCBfRmFjdG9yeSgpOwoKLy8vIFVzZWQgdG8gYW5ub3RhdGUgYSBjbGFzcyBgQ2AuIEluZGljYXRlcyB0aGF0IGBDYCBhbmQgYWxsIHN1YnR5cGVzIG9mIGBDYAovLy8gbXVzdCBiZSBpbW11dGFibGUuCi8vLwovLy8gQSBjbGFzcyBpcyBpbW11dGFibGUgaWYgYWxsIG9mIHRoZSBpbnN0YW5jZSBmaWVsZHMgb2YgdGhlIGNsYXNzLCB3aGV0aGVyCi8vLyBkZWZpbmVkIGRpcmVjdGx5IG9yIGluaGVyaXRlZCwgYXJlIGBmaW5hbGAuCi8vLwovLy8gVG9vbHMsIHN1Y2ggYXMgdGhlIGFuYWx5emVyLCBjYW4gcHJvdmlkZSBmZWVkYmFjayBpZgovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW55dGhpbmcgb3RoZXIgdGhhbiBhIGNsYXNzLCBvcgovLy8gKiBhIGNsYXNzIHRoYXQgaGFzIHRoaXMgYW5ub3RhdGlvbiBvciBleHRlbmRzLCBpbXBsZW1lbnRzIG9yIG1peGVzIGluIGEKLy8vICAgY2xhc3MgdGhhdCBoYXMgdGhpcyBhbm5vdGF0aW9uIGlzIG5vdCBpbW11dGFibGUuCmNvbnN0IEltbXV0YWJsZSBpbW11dGFibGUgPSBjb25zdCBJbW11dGFibGUoKTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGEgdGVzdCBmcmFtZXdvcmsgZnVuY3Rpb24gdGhhdCBydW5zIGEgc2luZ2xlIHRlc3QuCi8vLwovLy8gVG9vbHMsIHN1Y2ggYXMgSURFcywgY2FuIHNob3cgaW52b2NhdGlvbnMgb2Ygc3VjaCBmdW5jdGlvbiBpbiBhIGZpbGUKLy8vIHN0cnVjdHVyZSB2aWV3IHRvIGhlbHAgdGhlIHVzZXIgbmF2aWdhdGluZyBpbiBsYXJnZSB0ZXN0IGZpbGVzLgovLy8KLy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0Lgpjb25zdCBfSXNUZXN0IGlzVGVzdCA9IGNvbnN0IF9Jc1Rlc3QoKTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGEgdGVzdCBmcmFtZXdvcmsgZnVuY3Rpb24gdGhhdCBydW5zIGEgZ3JvdXAgb2YgdGVzdHMuCi8vLwovLy8gVG9vbHMsIHN1Y2ggYXMgSURFcywgY2FuIHNob3cgaW52b2NhdGlvbnMgb2Ygc3VjaCBmdW5jdGlvbiBpbiBhIGZpbGUKLy8vIHN0cnVjdHVyZSB2aWV3IHRvIGhlbHAgdGhlIHVzZXIgbmF2aWdhdGluZyBpbiBsYXJnZSB0ZXN0IGZpbGVzLgovLy8KLy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cC4KY29uc3QgX0lzVGVzdEdyb3VwIGlzVGVzdEdyb3VwID0gY29uc3QgX0lzVGVzdEdyb3VwKCk7CgovLy8gVXNlZCB0byBhbm5vdGF0ZSBhIGNvbnN0IGNvbnN0cnVjdG9yIGBjYC4gSW5kaWNhdGVzIHRoYXQgYW55IGludm9jYXRpb24gb2YKLy8vIHRoZSBjb25zdHJ1Y3RvciBtdXN0IHVzZSB0aGUga2V5d29yZCBgY29uc3RgIHVubGVzcyBvbmUgb3IgbW9yZSBvZiB0aGUKLy8vIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgovLy8KLy8vIFRvb2xzLCBzdWNoIGFzIHRoZSBhbmFseXplciwgY2FuIHByb3ZpZGUgZmVlZGJhY2sgaWYKLy8vCi8vLyAqIHRoZSBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGEgY29uc3QgY29uc3RydWN0b3IsCi8vLyAgIG9yCi8vLyAqIGFuIGludm9jYXRpb24gb2YgYSBjb25zdHJ1Y3RvciB0aGF0IGhhcyB0aGlzIGFubm90YXRpb24gaXMgbm90IGludm9rZWQKLy8vICAgdXNpbmcgdGhlIGBjb25zdGAga2V5d29yZCB1bmxlc3Mgb25lIG9yIG1vcmUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUKLy8vICAgY29uc3RydWN0b3IgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50Lgpjb25zdCBfTGl0ZXJhbCBsaXRlcmFsID0gY29uc3QgX0xpdGVyYWwoKTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGFuIGluc3RhbmNlIG1ldGhvZCBgbWAuIEluZGljYXRlcyB0aGF0IGV2ZXJ5IGludm9jYXRpb24gb2YKLy8vIGEgbWV0aG9kIHRoYXQgb3ZlcnJpZGVzIGBtYCBtdXN0IGFsc28gaW52b2tlIGBtYC4gSW4gYWRkaXRpb24sIGV2ZXJ5IG1ldGhvZAovLy8gdGhhdCBvdmVycmlkZXMgYG1gIGlzIGltcGxpY2l0bHkgYW5ub3RhdGVkIHdpdGggdGhpcyBzYW1lIGFubm90YXRpb24uCi8vLwovLy8gTm90ZSB0aGF0IHByaXZhdGUgbWV0aG9kcyB3aXRoIHRoaXMgYW5ub3RhdGlvbiBjYW5ub3QgYmUgdmFsaWRseSBvdmVycmlkZGVuCi8vLyBvdXRzaWRlIG9mIHRoZSBsaWJyYXJ5IHRoYXQgZGVmaW5lcyB0aGUgYW5ub3RhdGVkIG1ldGhvZC4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiBwcm92aWRlIGZlZWRiYWNrIGlmCi8vLwovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBpbnN0YW5jZSBtZXRob2QsCi8vLyAgIG9yCi8vLyAqIGEgbWV0aG9kIHRoYXQgb3ZlcnJpZGVzIGEgbWV0aG9kIHRoYXQgaGFzIHRoaXMgYW5ub3RhdGlvbiBjYW4gcmV0dXJuCi8vLyAgIHdpdGhvdXQgaW52b2tpbmcgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLgpjb25zdCBfTXVzdENhbGxTdXBlciBtdXN0Q2FsbFN1cGVyID0gY29uc3QgX011c3RDYWxsU3VwZXIoKTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGFuIGluc3RhbmNlIG1lbWJlciAobWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgb3BlcmF0b3IsIG9yCi8vLyBmaWVsZCkgYG1gIGluIGEgY2xhc3MgYENgIG9yIG1peGluIGBNYC4gSW5kaWNhdGVzIHRoYXQgYG1gIHNob3VsZCBub3QgYmUKLy8vIG92ZXJyaWRkZW4gaW4gYW55IGNsYXNzZXMgdGhhdCBleHRlbmQgb3IgbWl4aW4gYENgIG9yIGBNYC4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiBwcm92aWRlIGZlZWRiYWNrIGlmCi8vLwovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBpbnN0YW5jZSBtZW1iZXIsCi8vLyAqIHRoZSBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhYnN0cmFjdCBtZW1iZXIgKGJlY2F1c2Ugc3ViY2xhc3NlcwovLy8gICBhcmUgcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhlIG1lbWJlciksCi8vLyAqIHRoZSBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBleHRlbnNpb24gbWV0aG9kLAovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBtZW1iZXIgYG1gIGluIGNsYXNzIGBDYCwgYW5kIHRoZXJlIGlzCi8vLyAgIGEgY2xhc3MgYERgIG9yIG1peGluIGBNYCwgdGhhdCBleHRlbmRzIG9yIG1peGVzIGluIGBDYCwgdGhhdCBkZWNsYXJlcyBhbgovLy8gICBvdmVycmlkaW5nIG1lbWJlciBgbWAuCmNvbnN0IF9Ob25WaXJ0dWFsIG5vblZpcnR1YWwgPSBjb25zdCBfTm9uVmlydHVhbCgpOwoKLy8vIFVzZWQgdG8gYW5ub3RhdGUgYSBjbGFzcywgbWl4aW4sIG9yIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiBgQ2AuIEluZGljYXRlcwovLy8gdGhhdCBhbnkgdHlwZSBhcmd1bWVudHMgZGVjbGFyZWQgb24gYENgIGFyZSB0byBiZSB0cmVhdGVkIGFzIG9wdGlvbmFsLgovLy8gVG9vbHMgc3VjaCBhcyB0aGUgYW5hbHl6ZXIgYW5kIGxpbnRlciBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gc3VwcHJlc3MKLy8vIHdhcm5pbmdzIHRoYXQgd291bGQgb3RoZXJ3aXNlIHJlcXVpcmUgdHlwZSBhcmd1bWVudHMgb24gYENgIHRvIGJlIHByb3ZpZGVkLgpjb25zdCBfT3B0aW9uYWxUeXBlQXJncyBvcHRpb25hbFR5cGVBcmdzID0gY29uc3QgX09wdGlvbmFsVHlwZUFyZ3MoKTsKCi8vLyBVc2VkIHRvIGFubm90YXRlIGFuIGluc3RhbmNlIG1lbWJlciAobWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgb3BlcmF0b3IsIG9yCi8vLyBmaWVsZCkgYG1gIGluIGEgY2xhc3MgYENgLiBJZiB0aGUgYW5ub3RhdGlvbiBpcyBvbiBhIGZpZWxkIGl0IGFwcGxpZXMgdG8gdGhlCi8vLyBnZXR0ZXIsIGFuZCBzZXR0ZXIgaWYgYXBwcm9wcmlhdGUsIHRoYXQgYXJlIGluZHVjZWQgYnkgdGhlIGZpZWxkLiBJbmRpY2F0ZXMKLy8vIHRoYXQgYG1gIHNob3VsZCBvbmx5IGJlIGludm9rZWQgZnJvbSBpbnN0YW5jZSBtZXRob2RzIG9mIGBDYCBvciBjbGFzc2VzIHRoYXQKLy8vIGV4dGVuZCwgaW1wbGVtZW50IG9yIG1peCBpbiBgQ2AsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBBZGRpdGlvbmFsbHkKLy8vIGluZGljYXRlcyB0aGF0IGBtYCBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uIGB0aGlzYCwgd2hldGhlciBleHBsaWNpdGx5IG9yCi8vLyBpbXBsaWNpdGx5LgovLy8KLy8vIFRvb2xzLCBzdWNoIGFzIHRoZSBhbmFseXplciwgY2FuIHByb3ZpZGUgZmVlZGJhY2sgaWYKLy8vCi8vLyAqIHRoZSBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGluc3RhbmNlIG1lbWJlciwKLy8vICAgb3IKLy8vICogYW4gaW52b2NhdGlvbiBvZiBhIG1lbWJlciB0aGF0IGhhcyB0aGlzIGFubm90YXRpb24gaXMgdXNlZCBvdXRzaWRlIG9mIGFuCi8vLyAgIGluc3RhbmNlIG1lbWJlciBkZWZpbmVkIG9uIGEgY2xhc3MgdGhhdCBleHRlbmRzIG9yIG1peGVzIGluIChvciBhIG1peGluCi8vLyAgIGNvbnN0cmFpbmVkIHRvKSB0aGUgY2xhc3MgaW4gd2hpY2ggdGhlIHByb3RlY3RlZCBtZW1iZXIgaXMgZGVmaW5lZC4KLy8vICogYW4gaW52b2NhdGlvbiBvZiBhIG1lbWJlciB0aGF0IGhhcyB0aGlzIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYW4KLy8vICAgaW5zdGFuY2UgbWV0aG9kLCBidXQgdGhlIHJlY2VpdmVyIGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIGB0aGlzYC4KY29uc3QgX1Byb3RlY3RlZCBwcm90ZWN0ZWQgPSBjb25zdCBfUHJvdGVjdGVkKCk7CgovLy8gVXNlZCB0byBhbm5vdGF0ZSBhIG5hbWVkIHBhcmFtZXRlciBgcGAgaW4gYSBtZXRob2Qgb3IgZnVuY3Rpb24gYGZgLgovLy8gSW5kaWNhdGVzIHRoYXQgZXZlcnkgaW52b2NhdGlvbiBvZiBgZmAgbXVzdCBpbmNsdWRlIGFuIGFyZ3VtZW50Ci8vLyBjb3JyZXNwb25kaW5nIHRvIGBwYCwgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGBwYCB3b3VsZCBvdGhlcndpc2UgYmUgYW4KLy8vIG9wdGlvbmFsIHBhcmFtZXRlci4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiBwcm92aWRlIGZlZWRiYWNrIGlmCi8vLwovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW55dGhpbmcgb3RoZXIgdGhhbiBhIG5hbWVkIHBhcmFtZXRlciwKLy8vICogdGhlIGFubm90YXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcGFyYW1ldGVyIGluIGEgbWV0aG9kIGBtMWAgdGhhdAovLy8gICBvdmVycmlkZXMgYSBtZXRob2QgYG0wYCBhbmQgYG0wYCBkZWZpbmVzIGEgbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUKLy8vICAgbmFtZSB0aGF0IGRvZXMgbm90IGhhdmUgdGhpcyBhbm5vdGF0aW9uLCBvcgovLy8gKiBhbiBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kIG9yIGZ1bmN0aW9uIGRvZXMgbm90IGluY2x1ZGUgYW4gYXJndW1lbnQKLy8vICAgY29ycmVzcG9uZGluZyB0byBhIG5hbWVkIHBhcmFtZXRlciB0aGF0IGhhcyB0aGlzIGFubm90YXRpb24uCmNvbnN0IFJlcXVpcmVkIHJlcXVpcmVkID0gY29uc3QgUmVxdWlyZWQoKTsKCi8vLyBBbm5vdGF0aW9uIG1hcmtpbmcgYSBjbGFzcyBhcyBub3QgYWxsb3dlZCBhcyBhIHN1cGVyLXR5cGUuCi8vLwovLy8gQ2xhc3NlcyBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSBtYXJrZWQgY2xhc3MgbWF5IGV4dGVuZCwgaW1wbGVtZW50IG9yCi8vLyBtaXgtaW4gdGhlIGFubm90YXRlZCBjbGFzcy4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiBwcm92aWRlIGZlZWRiYWNrIGlmCi8vLwovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW55dGhpbmcgb3RoZXIgdGhhbiBhIGNsYXNzLAovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcyBgQ2AsIGFuZCB0aGVyZSBpcyBhIGNsYXNzIG9yCi8vLyAgIG1peGluIGBEYCwgd2hpY2ggZXh0ZW5kcywgaW1wbGVtZW50cywgbWl4ZXMgaW4sIG9yIGNvbnN0cmFpbnMgdG8gYENgLCBhbmQKLy8vICAgYENgIGFuZCBgRGAgYXJlIGRlY2xhcmVkIGluIGRpZmZlcmVudCBwYWNrYWdlcy4KY29uc3QgX1NlYWxlZCBzZWFsZWQgPSBjb25zdCBfU2VhbGVkKCk7CgovLy8gVXNlZCB0byBhbm5vdGF0ZSBhIGZpZWxkIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBvdmVycmlkZGVuIGluIFN0cm9uZyBNb2RlLgovLy8KLy8vIERlcHJlY2F0ZWQ6IE1vc3Qgb2Ygc3Ryb25nIG1vZGUgaXMgbm93IHRoZSBkZWZhdWx0IGluIDIuMCwgYnV0IHRoZSBub3Rpb24gb2YKLy8vIHZpcnR1YWwgZmllbGRzIHdhcyBkcm9wcGVkLCBzbyB0aGlzIGFubm90YXRpb24gbm8gbG9uZ2VyIGhhcyBhbnkgbWVhbmluZy4KLy8vIFVzZXMgb2YgdGhlIGFubm90YXRpb24gc2hvdWxkIGJlIHJlbW92ZWQuCkBkZXByZWNhdGVkCmNvbnN0IF9WaXJ0dWFsIHZpcnR1YWwgPSBjb25zdCBfVmlydHVhbCgpOwoKLy8vIFVzZWQgdG8gYW5ub3RhdGUgYW4gaW5zdGFuY2UgbWVtYmVyIHRoYXQgd2FzIG1hZGUgcHVibGljIHNvIHRoYXQgaXQgY291bGQgYmUKLy8vIG92ZXJyaWRkZW4gYnV0IHRoYXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlIHRoZQovLy8gZGVmaW5pbmcgbGlicmFyeS4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiBwcm92aWRlIGZlZWRiYWNrIGlmCi8vLwovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBkZWNsYXJhdGlvbiBvdGhlciB0aGFuIGEgcHVibGljCi8vLyAgIGluc3RhbmNlIG1lbWJlciBpbiBhIGNsYXNzIG9yIG1peGluLCBvcgovLy8gKiB0aGUgbWVtYmVyIGlzIHJlZmVyZW5jZWQgb3V0c2lkZSBvZiB0aGUgZGVmaW5pbmcgbGlicmFyeS4KY29uc3QgX1Zpc2libGVGb3JPdmVycmlkaW5nIHZpc2libGVGb3JPdmVycmlkaW5nID0KICAgIGNvbnN0IF9WaXNpYmxlRm9yT3ZlcnJpZGluZygpOwoKLy8vIFVzZWQgdG8gYW5ub3RhdGUgYSBkZWNsYXJhdGlvbiB3YXMgbWFkZSBwdWJsaWMsIHNvIHRoYXQgaXQgaXMgbW9yZSB2aXNpYmxlCi8vLyB0aGFuIG90aGVyd2lzZSBuZWNlc3NhcnksIHRvIG1ha2UgY29kZSB0ZXN0YWJsZS4KLy8vCi8vLyBUb29scywgc3VjaCBhcyB0aGUgYW5hbHl6ZXIsIGNhbiBwcm92aWRlIGZlZWRiYWNrIGlmCi8vLwovLy8gKiB0aGUgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBkZWNsYXJhdGlvbiBub3QgaW4gdGhlIGBsaWJgIGZvbGRlcgovLy8gICBvZiBhIHBhY2thZ2UsIG9yIGEgcHJpdmF0ZSBkZWNsYXJhdGlvbiwgb3IgYSBkZWNsYXJhdGlvbiBpbiBhbiB1bm5hbWVkCi8vLyAgIHN0YXRpYyBleHRlbnNpb24sIG9yCi8vLyAqIHRoZSBkZWNsYXJhdGlvbiBpcyByZWZlcmVuY2VkIG91dHNpZGUgb2YgaXRzIHRoZSBkZWZpbmluZyBsaWJyYXJ5IG9yIGEKLy8vICAgbGlicmFyeSB3aGljaCBpcyBpbiB0aGUgYHRlc3RgIGZvbGRlciBvZiB0aGUgZGVmaW5pbmcgcGFja2FnZS4KY29uc3QgX1Zpc2libGVGb3JUZXN0aW5nIHZpc2libGVGb3JUZXN0aW5nID0gY29uc3QgX1Zpc2libGVGb3JUZXN0aW5nKCk7CgovLy8gVXNlZCB0byBhbm5vdGF0ZSBhIGNsYXNzLgovLy8KLy8vIFNlZSBbaW1tdXRhYmxlXSBmb3IgbW9yZSBkZXRhaWxzLgpjbGFzcyBJbW11dGFibGUgewogIC8vLyBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSByZWFzb24gd2h5IHRoZSBjbGFzcyBpcyBpbW11dGFibGUuCiAgZmluYWwgU3RyaW5nIHJlYXNvbjsKCiAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIHRvIGhhdmUgdGhlIGdpdmVuIFtyZWFzb25dLgogIGNvbnN0IEltbXV0YWJsZShbdGhpcy5yZWFzb24gPSAnJ10pOwp9CgovLy8gVXNlZCB0byBhbm5vdGF0ZSBhIG5hbWVkIHBhcmFtZXRlciBgcGAgaW4gYSBtZXRob2Qgb3IgZnVuY3Rpb24gYGZgLgovLy8KLy8vIFNlZSBbcmVxdWlyZWRdIGZvciBtb3JlIGRldGFpbHMuCmNsYXNzIFJlcXVpcmVkIHsKICAvLy8gQSBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBvZiB0aGUgcmVhc29uIHdoeSB0aGUgYW5ub3RhdGVkIHBhcmFtZXRlciBpcwogIC8vLyByZXF1aXJlZC4gRm9yIGV4YW1wbGUsIHRoZSBhbm5vdGF0aW9uIG1pZ2h0IGxvb2sgbGlrZToKICAvLy8KICAvLy8gICAgIEJ1dHRvbldpZGdldCh7CiAgLy8vICAgICAgICAgRnVuY3Rpb24gb25Ib3ZlciwKICAvLy8gICAgICAgICBAUmVxdWlyZWQoJ0J1dHRvbnMgbXVzdCBkbyBzb21ldGhpbmcgd2hlbiBwcmVzc2VkJykKICAvLy8gICAgICAgICBGdW5jdGlvbiBvblByZXNzZWQsCiAgLy8vICAgICAgICAgLi4uCiAgLy8vICAgICB9KSAuLi4KICBmaW5hbCBTdHJpbmcgcmVhc29uOwoKICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2UgdG8gaGF2ZSB0aGUgZ2l2ZW4gW3JlYXNvbl0uCiAgY29uc3QgUmVxdWlyZWQoW3RoaXMucmVhc29uID0gJyddKTsKfQoKY2xhc3MgX0Fsd2F5c1Rocm93cyB7CiAgY29uc3QgX0Fsd2F5c1Rocm93cygpOwp9CgpjbGFzcyBfQ2hlY2tlZCB7CiAgY29uc3QgX0NoZWNrZWQoKTsKfQoKY2xhc3MgX0V4cGVyaW1lbnRhbCB7CiAgY29uc3QgX0V4cGVyaW1lbnRhbCgpOwp9CgpjbGFzcyBfRmFjdG9yeSB7CiAgY29uc3QgX0ZhY3RvcnkoKTsKfQoKY2xhc3MgX0lzVGVzdCB7CiAgY29uc3QgX0lzVGVzdCgpOwp9CgpjbGFzcyBfSXNUZXN0R3JvdXAgewogIGNvbnN0IF9Jc1Rlc3RHcm91cCgpOwp9CgpjbGFzcyBfTGl0ZXJhbCB7CiAgY29uc3QgX0xpdGVyYWwoKTsKfQoKY2xhc3MgX011c3RDYWxsU3VwZXIgewogIGNvbnN0IF9NdXN0Q2FsbFN1cGVyKCk7Cn0KCmNsYXNzIF9Ob25WaXJ0dWFsIHsKICBjb25zdCBfTm9uVmlydHVhbCgpOwp9CgpjbGFzcyBfT3B0aW9uYWxUeXBlQXJncyB7CiAgY29uc3QgX09wdGlvbmFsVHlwZUFyZ3MoKTsKfQoKY2xhc3MgX1Byb3RlY3RlZCB7CiAgY29uc3QgX1Byb3RlY3RlZCgpOwp9CgpjbGFzcyBfU2VhbGVkIHsKICBjb25zdCBfU2VhbGVkKCk7Cn0KCkBkZXByZWNhdGVkCmNsYXNzIF9WaXJ0dWFsIHsKICBjb25zdCBfVmlydHVhbCgpOwp9CgpjbGFzcyBfVmlzaWJsZUZvck92ZXJyaWRpbmcgewogIGNvbnN0IF9WaXNpYmxlRm9yT3ZlcnJpZGluZygpOwp9CgpjbGFzcyBfVmlzaWJsZUZvclRlc3RpbmcgewogIGNvbnN0IF9WaXNpYmxlRm9yVGVzdGluZygpOwp9CoFXAE5OPAEvBEcETVBMIQRMTxVPEw4BSU8qBE8fBAwtBBUPEg8QGQgGCARLT00yBE9IHDoBTgwEUFAzBDYMKwFOSlBOTwwEUFBNNwQ5BE5PTBJJRjoBT01RKQQ5BElPIisBTRcETTAEOUhMNy8BSARJRARNKAFLBElEBE43AU9LQQQ5BFEJTUsyKwFQUEoEUD4EOQRQCUsuPQFOTT8EOQRQTyw9UE8dNAFNS09QRgFOUVBRUU8QBDkEUAlPTkpLSDEBSERKGAQ5BE9QTzJJQywBPwRNIAQ5BEVNUDYoAU4EUU4uDCsBUUoWBDkESi5AMyMBTzUEOQROTRtNRUkBHgQmEk0XAUYnAgFIBCURUD0GGSBCIhIRFwFGJgIBFhkCAREUAgEWGQIBERQCARATAgEVGAIBERQCARcaAgEUFwIBGh0CARMWAgEQEwIBDBEUAgEeIQIBGx4CARZwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0XmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L2FuYWx5c2lzLmRhcnTAAMnmLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBHbG9iYWwgdHlwZSBmbG93IGFuYWx5c2lzLgpsaWJyYXJ5IGtlcm5lbC50cmFuc2Zvcm1hdGlvbnMuYW5hbHlzaXM7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIFR5cGU7CmltcG9ydCAnZGFydDptYXRoJyBzaG93IG1heDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCcgc2hvdyBUYXJnZXQ7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgU3RhdGVtZW50LCBTdGF0ZW1lbnRWaXNpdG9yOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvbGlicmFyeV9pbmRleC5kYXJ0JyBzaG93IExpYnJhcnlJbmRleDsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CgppbXBvcnQgJ2NhbGxzLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9jb2RlLmRhcnQnOwppbXBvcnQgJ3N1bW1hcnkuZGFydCc7CmltcG9ydCAnc3VtbWFyeV9jb2xsZWN0b3IuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CmltcG9ydCAnLi4vcHJhZ21hLmRhcnQnOwoKLy8gVE9ETyhhbGV4bWFya292KQovLyBVbm9yZGVyZWQgbGlzdCBvZiB2YXJpb3VzIGltcHJvdmVtZW50cyBpbiB0eXBlIGZsb3cgYW5hbHlzaXMsCi8vIG9yZ2FuaXplZCBpbiBzZXZlcmFsIGNhdGVnb3JpZXM6Ci8vCi8vID09PSBDb3JyZWN0bmVzcyA9PT0KLy8gKiBWZXJpZnkgaW5jcmVtZW50YWwgcmUtY2FsY3VsYXRpb24gYnkgZnJlc2ggYW5hbHlzaXMgc3RhcnRpbmcgd2l0aCBrbm93bgovLyAgIGFsbG9jYXRlZCBjbGFzc2VzLgovLwovLyA9PT0gUHJlY2lzaW9uID09PQovLyAqIEhhbmRsZSAnPT0nIHdpdGggbnVsbC4KLy8gKiBTcGVjaWFsIHR5cGUgaW5mZXJlbmNlIHJ1bGVzIGZvciBiaW5hcnkgaW50IG9wZXJhdG9ycy4KLy8gKiBTdXBwb3J0IGZ1bmN0aW9uIHR5cGVzLCBiZXR0ZXIgaGFuZGxlIGNsb3N1cmVzLgovLyAqIFN1cHBvcnQgZ2VuZXJpYyB0eXBlczogc3Vic3RpdHV0aW9uLCBwYXNzaW5nIHR5cGUgYXJndW1lbnRzLiBGaWd1cmUgb3V0Ci8vICAgd2hlbiBnZW5lcmljIHR5cGUgc2hvdWxkIGJlIGFwcHJveGltYXRlZC4KLy8KLy8gPT09IEVmZmljaWVuY3kgb2YgdGhlIGFuYWx5c2lzID09PQovLyAqIEFkZCBiZW5jaG1hcmsgdG8gbWVhc3VyZSBhbmFseXNpcyB0aW1lIGNvbnRpbnVvdXNseS4KLy8gKiBGaWd1cmUgb3V0IGJldHRlciBzdHJhdGVneSBvZiBwcm9jZXNzaW5nIGFuIGludm9jYXRpb24gaWYgaXRzIHJlc3VsdCBpcwovLyAgIG5vdCB1c2VkLiBDb25zaWRlciBjcmVhdGluZyBzdW1tYXJpZXMgZWFnZXJseSAodG8gZGlzY292ZXIgYWxsb2NhdGVkCi8vICAgY2xhc3NlcyBlYXJseSkgYnV0IGFuYWx5emluZyB0aGVtIGxhemlseS4KLy8KCi8vLyBNYWludGFpbnMgc2V0IG9mIGRlcGVuZGVudCBpbnZvY2F0aW9ucy4KY2xhc3MgX0RlcGVuZGVuY3lUcmFja2VyIHsKICBTZXQ8X0ludm9jYXRpb24+IF9kZXBlbmRlbnRJbnZvY2F0aW9uczsKCiAgdm9pZCBhZGREZXBlbmRlbnRJbnZvY2F0aW9uKF9JbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIGlmICghaWRlbnRpY2FsKGludm9jYXRpb24sIHRoaXMpKSB7CiAgICAgIF9kZXBlbmRlbnRJbnZvY2F0aW9ucyA/Pz0gbmV3IFNldDxfSW52b2NhdGlvbj4oKTsKICAgICAgX2RlcGVuZGVudEludm9jYXRpb25zLmFkZChpbnZvY2F0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgaW52YWxpZGF0ZURlcGVuZGVudEludm9jYXRpb25zKF9Xb3JrTGlzdCB3b3JrTGlzdCkgewogICAgaWYgKF9kZXBlbmRlbnRJbnZvY2F0aW9ucyAhPSBudWxsKSB7CiAgICAgIGlmIChrUHJpbnRUcmFjZSkgewogICAgICAgIHRyYWNlUHJpbnQoJyAgIC0gQ0hBTkdFRDogJHRoaXMnKTsKICAgICAgICBmb3IgKHZhciBkaSBpbiBfZGVwZW5kZW50SW52b2NhdGlvbnMpIHsKICAgICAgICAgIHRyYWNlUHJpbnQoJyAgICAgLSBpbnZhbGlkYXRpbmcgJGRpJyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9kZXBlbmRlbnRJbnZvY2F0aW9ucy5mb3JFYWNoKHdvcmtMaXN0LmludmFsaWRhdGVJbnZvY2F0aW9uKTsKICAgIH0KICB9Cn0KCi8vLyBfSW52b2NhdGlvbiBjbGFzcyByZXByZXNlbnRzIHRoZSBpbi1mbGlnaHQgaW52b2NhdGlvbiBkZXRhY2hlZCBmcm9tIGEKLy8vIHBhcnRpY3VsYXIgY2FsbCBzaXRlLCBlLmcuIGl0IGlzIGEgc2VsZWN0b3IgYW5kIGFyZ3VtZW50cy4KLy8vIFRoaXMgaXMgdGhlIGJhc2ljIHVuaXQgb2YgcHJvY2Vzc2luZyBpbiB0eXBlIGZsb3cgYW5hbHlzaXMuCi8vLyBDYWxsIHNpdGVzIGNhbGxpbmcgdGhlIHNhbWUgbWV0aG9kIHdpdGggdGhlIHNhbWUgYXJndW1lbnQgdHlwZXMKLy8vIG1heSByZXVzZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcyB0aHJvdWdoIHRoZSBzYW1lIF9JbnZvY2F0aW9uIGluc3RhbmNlLgphYnN0cmFjdCBjbGFzcyBfSW52b2NhdGlvbiBleHRlbmRzIF9EZXBlbmRlbmN5VHJhY2tlcgogICAgd2l0aCBMaW5rZWRMaXN0RW50cnk8X0ludm9jYXRpb24+IHsKICBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKICBmaW5hbCBBcmdzPFR5cGU+IGFyZ3M7CgogIFR5cGUgcmVzdWx0OwoKICAvLy8gUmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGNhbGN1bGF0ZWQgYmVmb3JlIGludm9jYXRpb24gd2FzIGludmFsaWRhdGVkLgogIC8vLyBVc2VkIHRvIGNoZWNrIGlmIHRoZSByZS1hbmFseXNpcyBvZiB0aGUgaW52b2NhdGlvbiB5aWVsZHMgdGhlIHNhbWUKICAvLy8gcmVzdWx0IG9yIG5vdCAodG8gYXZvaWQgaW52YWxpZGF0aW9uIG9mIGNhbGxlcnMgaWYgcmVzdWx0IGhhc24ndCBjaGFuZ2VkKS4KICBUeXBlIGludmFsaWRhdGVkUmVzdWx0OwoKICAvLy8gTnVtYmVyIG9mIHRpbWVzIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gd2FzIGludmFsaWRhdGVkLgogIGludCBpbnZhbGlkYXRpb25Db3VudGVyID0gMDsKCiAgLy8vIFdoZXRoZXIgYSBjYWxsLXNpdGUgZGlyZWN0ZWQgdG8gdGhpcyBpbnZvY2F0aW9uIGNhbiBjYWxsIHRocm91Z2ggdGhlCiAgLy8vIHVuY2hlY2tlZCBlbnRyeS1wb2ludC4KICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSBmYWxzZTsKCiAgLy8vIElmIGFuIGludm9jYXRpb24gaXMgaW52YWxpZGF0ZWQgbW9yZSB0aGFuIFtpbnZhbGlkYXRpb25MaW1pdF0gdGltZXMsCiAgLy8vIGl0cyByZXN1bHQgaXMgc2F0dXJhdGVkIGluIG9yZGVyIHRvIGd1YXJhbnRlZSBjb252ZXJnZW5jZS4KICBzdGF0aWMgY29uc3QgaW50IGludmFsaWRhdGlvbkxpbWl0ID0gMTAwMDsKCiAgX0ludm9jYXRpb24odGhpcy5zZWxlY3RvciwgdGhpcy5hcmdzKTsKCiAgVHlwZSBwcm9jZXNzKFR5cGVGbG93QW5hbHlzaXMgdHlwZUZsb3dBbmFseXNpcyk7CgogIC8vLyBSZXR1cm5zIHJlc3VsdCBvZiB0aGlzIGludm9jYXRpb24gaWYgaXRzIGF2YWlsYWJsZSB3aXRob3V0CiAgLy8vIGZ1cnRoZXIgYW5hbHlzaXMsIG9yIGBudWxsYCBpZiBpdCdzIG5vdCBhdmFpbGFibGUuCiAgLy8vIFVzZWQgZm9yIHJlY3Vyc2l2ZSBjYWxscyB3aGlsZSB0aGlzIGludm9jYXRpb24gaXMgYmVpbmcgcHJvY2Vzc2VkLgogIFR5cGUgZ2V0IHJlc3VsdEZvclJlY3Vyc2l2ZUludm9jYXRpb24gPT4gcmVzdWx0OwoKICAvLyBPbmx5IHRha2Ugc2VsZWN0b3IgYW5kIGFyZ3MgaW50byBhY2NvdW50IGFzIF9JbnZvY2F0aW9uIG9iamVjdHMKICAvLyBhcmUgY2FjaGVkIGluIF9JbnZvY2F0aW9uc0NhY2hlIHVzaW5nIHNlbGVjdG9yIGFuZCBhcmdzIGFzIGEga2V5LgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgKG90aGVyIGlzIF9JbnZvY2F0aW9uKSAmJgogICAgICAgICAgKHRoaXMuc2VsZWN0b3IgPT0gb3RoZXIuc2VsZWN0b3IpICYmCiAgICAgICAgICAodGhpcy5hcmdzID09IG90aGVyLmFyZ3MpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IChzZWxlY3Rvci5oYXNoQ29kZSBeIGFyZ3MuaGFzaENvZGUgKyAzMSkgJiBrSGFzaE1hc2s7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJfSW52b2NhdGlvbiAkc2VsZWN0b3IgJGFyZ3MiOwoKICAvLy8gUHJvY2Vzc2VzIG5vU3VjaE1ldGhvZCgpIGludm9jYXRpb24gYW5kIHJldHVybnMgaXRzIHJlc3VsdC4KICAvLy8gVXNlZCBpZiB0YXJnZXQgaXMgbm90IGZvdW5kIG9yIG51bWJlciBvZiBhcmd1bWVudHMgaXMgaW5jb3JyZWN0LgogIFR5cGUgX3Byb2Nlc3NOb1N1Y2hNZXRob2QoVHlwZSByZWNlaXZlciwgVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzKSB7CiAgICB0cmFjZVByaW50KCJQcm9jZXNzaW5nIG5vU3VjaE1ldGhvZCBmb3IgcmVjZWl2ZXIgJHJlY2VpdmVyIik7CgogICAgZmluYWwgbnNtU2VsZWN0b3IgPSBuZXcgSW50ZXJmYWNlU2VsZWN0b3IoCiAgICAgICAgdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZS5vYmplY3ROb1N1Y2hNZXRob2QsCiAgICAgICAgY2FsbEtpbmQ6IENhbGxLaW5kLk1ldGhvZCk7CgogICAgZmluYWwgbnNtQXJncyA9IG5ldyBBcmdzPFR5cGU+KFsKICAgICAgcmVjZWl2ZXIsCiAgICAgIHR5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUuZnJvbVN0YXRpY1R5cGUoCiAgICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLmVudmlyb25tZW50LmNvcmVUeXBlcy5pbnZvY2F0aW9uTGVnYWN5UmF3VHlwZSwgZmFsc2UpCiAgICBdKTsKCiAgICBmaW5hbCBuc21JbnZvY2F0aW9uID0KICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLl9pbnZvY2F0aW9uc0NhY2hlLmdldEludm9jYXRpb24obnNtU2VsZWN0b3IsIG5zbUFyZ3MpOwoKICAgIGZpbmFsIFR5cGUgdHlwZSA9CiAgICAgICAgdHlwZUZsb3dBbmFseXNpcy53b3JrTGlzdC5wcm9jZXNzSW52b2NhdGlvbihuc21JbnZvY2F0aW9uKTsKCiAgICAvLyBSZXN1bHQgb2YgdGhpcyBpbnZvY2F0aW9uIGRlcGVuZHMgb24gdGhlIHJlc3VsdCBvZiBub1N1Y2hNZXRob2QKICAgIC8vIGludm9jYXRpb24uCiAgICBuc21JbnZvY2F0aW9uLmFkZERlcGVuZGVudEludm9jYXRpb24odGhpcyk7CgogICAgcmV0dXJuIHR5cGU7CiAgfQp9CgpjbGFzcyBfRGlyZWN0SW52b2NhdGlvbiBleHRlbmRzIF9JbnZvY2F0aW9uIHsKICBfRGlyZWN0SW52b2NhdGlvbihEaXJlY3RTZWxlY3RvciBzZWxlY3RvciwgQXJnczxUeXBlPiBhcmdzKQogICAgICA6IHN1cGVyKHNlbGVjdG9yLCBhcmdzKSB7CiAgICAvLyBXZSBkb24ndCBlbWl0IFtUeXBlQ2hlY2tdIHN0YXRlbWVudHMgZm9yIGJvdW5kcyBjaGVja3Mgb2YgdHlwZQogICAgLy8gcGFyYW1ldGVycywgc28gaWYgdGhlcmUgYXJlIGFueSB0eXBlIHBhcmFtZXRlcnMsIHdlIG11c3QgYXNzdW1lCiAgICAvLyB0aGV5IGNvdWxkIGZhaWwgYm91bmRzIGNoZWNrcy4KICAgIC8vCiAgICAvLyBUT0RPKHNqaW5kZWwpOiBVc2UgW1R5cGVDaGVja10gdG8gYXZvaWQgYm91bmRzIGNoZWNrcy4KICAgIGlmIChzZWxlY3Rvci5tZW1iZXIuZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICB0eXBlQ2hlY2tzTmVlZGVkID0gc2VsZWN0b3IubWVtYmVyLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAuYW55KCh0KSA9PiB0LmlzR2VuZXJpY0NvdmFyaWFudEltcGwpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBwcm9jZXNzKFR5cGVGbG93QW5hbHlzaXMgdHlwZUZsb3dBbmFseXNpcykgewogICAgYXNzZXJ0eCh0eXBlRmxvd0FuYWx5c2lzLmN1cnJlbnRJbnZvY2F0aW9uID09IHRoaXMpOwoKICAgIGlmIChzZWxlY3Rvci5tZW1iZXIgaXMgRmllbGQpIHsKICAgICAgcmV0dXJuIF9wcm9jZXNzRmllbGQodHlwZUZsb3dBbmFseXNpcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX3Byb2Nlc3NGdW5jdGlvbih0eXBlRmxvd0FuYWx5c2lzKTsKICAgIH0KICB9CgogIFR5cGUgX3Byb2Nlc3NGaWVsZChUeXBlRmxvd0FuYWx5c2lzIHR5cGVGbG93QW5hbHlzaXMpIHsKICAgIGZpbmFsIEZpZWxkIGZpZWxkID0gc2VsZWN0b3IubWVtYmVyIGFzIEZpZWxkOwogICAgZmluYWwgaW50IGZpcnN0UGFyYW1JbmRleCA9IGZpZWxkLmlzU3RhdGljID8gMCA6IDE7CiAgICBmaW5hbCBfRmllbGRWYWx1ZSBmaWVsZFZhbHVlID0gdHlwZUZsb3dBbmFseXNpcy5nZXRGaWVsZFZhbHVlKGZpZWxkKTsKCiAgICBzd2l0Y2ggKHNlbGVjdG9yLmNhbGxLaW5kKSB7CiAgICAgIGNhc2UgQ2FsbEtpbmQuUHJvcGVydHlHZXQ6CiAgICAgICAgYXNzZXJ0eChhcmdzLnZhbHVlcy5sZW5ndGggPT0gZmlyc3RQYXJhbUluZGV4KTsKICAgICAgICBhc3NlcnR4KGFyZ3MubmFtZXMuaXNFbXB0eSk7CiAgICAgICAgZmllbGRWYWx1ZS5pc0dldHRlclVzZWQgPSB0cnVlOwogICAgICAgIHJldHVybiBmaWVsZFZhbHVlLmdldFZhbHVlKAogICAgICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLCBmaWVsZC5pc1N0YXRpYyA/IG51bGwgOiBhcmdzLnZhbHVlc1swXSk7CgogICAgICBjYXNlIENhbGxLaW5kLlByb3BlcnR5U2V0OgogICAgICBjYXNlIENhbGxLaW5kLlNldEZpZWxkSW5Db25zdHJ1Y3RvcjoKICAgICAgICBhc3NlcnR4KGFyZ3MudmFsdWVzLmxlbmd0aCA9PSBmaXJzdFBhcmFtSW5kZXggKyAxKTsKICAgICAgICBhc3NlcnR4KGFyZ3MubmFtZXMuaXNFbXB0eSk7CiAgICAgICAgaWYgKHNlbGVjdG9yLmNhbGxLaW5kID09IENhbGxLaW5kLlByb3BlcnR5U2V0KSB7CiAgICAgICAgICBmaWVsZFZhbHVlLmlzU2V0dGVyVXNlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZpbmFsIFR5cGUgc2V0dGVyQXJnID0gYXJncy52YWx1ZXNbZmlyc3RQYXJhbUluZGV4XTsKICAgICAgICBmaWVsZFZhbHVlLnNldFZhbHVlKAogICAgICAgICAgICBzZXR0ZXJBcmcsIHR5cGVGbG93QW5hbHlzaXMsIGZpZWxkLmlzU3RhdGljID8gbnVsbCA6IGFyZ3MucmVjZWl2ZXIpOwogICAgICAgIHJldHVybiBjb25zdCBFbXB0eVR5cGUoKTsKCiAgICAgIGNhc2UgQ2FsbEtpbmQuTWV0aG9kOgogICAgICAgIC8vIENhbGwgdmlhIGZpZWxkLgogICAgICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IHN1cHBvcnQgZnVuY3Rpb24gdHlwZXMgYW5kIHVzZSBpbmZlcnJlZCB0eXBlCiAgICAgICAgLy8gdG8gZ2V0IG1vcmUgcHJlY2lzZSByZXR1cm4gdHlwZS4KICAgICAgICBmaWVsZFZhbHVlLmlzR2V0dGVyVXNlZCA9IHRydWU7CiAgICAgICAgZmluYWwgcmVjZWl2ZXIgPSBmaWVsZFZhbHVlLmdldFZhbHVlKAogICAgICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLCBmaWVsZC5pc1N0YXRpYyA/IG51bGwgOiBhcmdzLnZhbHVlc1swXSk7CiAgICAgICAgaWYgKHJlY2VpdmVyICE9IGNvbnN0IEVtcHR5VHlwZSgpKSB7CiAgICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLmFwcGx5Q2FsbCgvKiBjYWxsU2l0ZSA9ICovIG51bGwsCiAgICAgICAgICAgICAgRHluYW1pY1NlbGVjdG9yLmtDYWxsLCBuZXcgQXJncy53aXRoUmVjZWl2ZXIoYXJncywgcmVjZWl2ZXIpLAogICAgICAgICAgICAgIGlzUmVzdWx0VXNlZDogZmFsc2UsIHByb2Nlc3NJbW1lZGlhdGVseTogZmFsc2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFR5cGUubnVsbGFibGVBbnkoKTsKCiAgICAgIGNhc2UgQ2FsbEtpbmQuRmllbGRJbml0aWFsaXplcjoKICAgICAgICBhc3NlcnR4KGFyZ3MudmFsdWVzLmxlbmd0aCA9PSBmaXJzdFBhcmFtSW5kZXgpOwogICAgICAgIGFzc2VydHgoYXJncy5uYW1lcy5pc0VtcHR5KTsKICAgICAgICBUeXBlIGluaXRpYWxpemVyUmVzdWx0ID0gdHlwZUZsb3dBbmFseXNpcwogICAgICAgICAgICAuZ2V0U3VtbWFyeShmaWVsZCkKICAgICAgICAgICAgLmFwcGx5KGFyZ3MsIHR5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUsIHR5cGVGbG93QW5hbHlzaXMpOwogICAgICAgIGlmIChmaWVsZC5pc1N0YXRpYyAmJgogICAgICAgICAgICAhZmllbGQuaXNDb25zdCAmJgogICAgICAgICAgICBpbml0aWFsaXplclJlc3VsdCBpcyEgTnVsbGFibGVUeXBlKSB7CiAgICAgICAgICAvLyBJZiBpbml0aWFsaXplciBvZiBhIHN0YXRpYyBmaWVsZCB0aHJvd3MgYW4gZXhjZXB0aW9uLAogICAgICAgICAgLy8gdGhlbiBmaWVsZCBpcyBpbml0aWFsaXplZCB3aXRoIG51bGwgdmFsdWUuCiAgICAgICAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBUcnkgdG8gcHJvdmUgdGhhdCBzdGF0aWMgZmllbGQgaW5pdGlhbGl6ZXIKICAgICAgICAgIC8vIGRvZXMgbm90IHRocm93IGV4Y2VwdGlvbi4KICAgICAgICAgIGluaXRpYWxpemVyUmVzdWx0ID0gbmV3IFR5cGUubnVsbGFibGUoaW5pdGlhbGl6ZXJSZXN1bHQpOwogICAgICAgIH0KICAgICAgICBmaWVsZFZhbHVlLnNldFZhbHVlKGluaXRpYWxpemVyUmVzdWx0LCB0eXBlRmxvd0FuYWx5c2lzLAogICAgICAgICAgICBmaWVsZC5pc1N0YXRpYyA/IG51bGwgOiBhcmdzLnJlY2VpdmVyKTsKICAgICAgICBmaWVsZFZhbHVlLmlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIHJldHVybiBjb25zdCBFbXB0eVR5cGUoKTsKICAgIH0KCiAgICAvLyBNYWtlIGRhcnRhbmFseXplciBoYXBweS4KICAgIHRocm93ICdVbmV4cGVjdGVkIGNhbGwga2luZCAke3NlbGVjdG9yLmNhbGxLaW5kfSc7CiAgfQoKICBUeXBlIF9wcm9jZXNzRnVuY3Rpb24oVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzKSB7CiAgICBmaW5hbCBNZW1iZXIgbWVtYmVyID0gc2VsZWN0b3IubWVtYmVyOwogICAgaWYgKHNlbGVjdG9yLm1lbWJlckFncmVlc1RvQ2FsbEtpbmQobWVtYmVyKSkgewogICAgICBpZiAoX2FyZ3VtZW50c1ZhbGlkKCkpIHsKICAgICAgICBmaW5hbCBzdW1tYXJ5ID0gdHlwZUZsb3dBbmFseXNpcy5nZXRTdW1tYXJ5KG1lbWJlcik7CiAgICAgICAgLy8gSWYgcmVzdWx0IHR5cGUgaXMga25vd24gdXBmcm9udCAoZG9lc24ndCBkZXBlbmQgb24gdGhlIGZsb3cpLAogICAgICAgIC8vIHNldCBpdCBlYWdlcmx5IHNvIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucyBhcmUgYWJsZSB0byB1c2UgaXQuCiAgICAgICAgZmluYWwgc3VtbWFyeVJlc3VsdCA9IHN1bW1hcnkucmVzdWx0OwogICAgICAgIGlmIChzdW1tYXJ5UmVzdWx0IGlzIFR5cGUgJiYKICAgICAgICAgICAgIXR5cGVGbG93QW5hbHlzaXMud29ya0xpc3QuX2lzUGVuZGluZyh0aGlzKSkgewogICAgICAgICAgYXNzZXJ0eChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQgPT0gc3VtbWFyeVJlc3VsdCk7CiAgICAgICAgICByZXN1bHQgPSBzdW1tYXJ5UmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VtbWFyeS5hcHBseSgKICAgICAgICAgICAgYXJncywgdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZSwgdHlwZUZsb3dBbmFseXNpcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0eChzZWxlY3Rvci5jYWxsS2luZCA9PSBDYWxsS2luZC5NZXRob2QpOwogICAgICAgIHJldHVybiBfcHJvY2Vzc05vU3VjaE1ldGhvZChhcmdzLnJlY2VpdmVyLCB0eXBlRmxvd0FuYWx5c2lzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHNlbGVjdG9yLmNhbGxLaW5kID09IENhbGxLaW5kLlByb3BlcnR5R2V0KSB7CiAgICAgICAgLy8gVGVhci1vZmYuCiAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogY2FwdHVyZSByZWNlaXZlciB0eXBlCiAgICAgICAgYXNzZXJ0eCgobWVtYmVyIGlzIFByb2NlZHVyZSkgJiYgIW1lbWJlci5pc0dldHRlciAmJiAhbWVtYmVyLmlzU2V0dGVyKTsKICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLmFkZFJhd0NhbGwobmV3IERpcmVjdFNlbGVjdG9yKG1lbWJlcikpOwogICAgICAgIHR5cGVGbG93QW5hbHlzaXMuX3RlYXJPZmZUYWtlbi5hZGQobWVtYmVyKTsKICAgICAgICByZXR1cm4gbmV3IFR5cGUubnVsbGFibGVBbnkoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBDYWxsIHZpYSBnZXR0ZXIuCiAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogY2FwdHVyZSByZWNlaXZlciB0eXBlCiAgICAgICAgYXNzZXJ0eCgoc2VsZWN0b3IuY2FsbEtpbmQgPT0gQ2FsbEtpbmQuTWV0aG9kKSAmJgogICAgICAgICAgICAobWVtYmVyIGlzIFByb2NlZHVyZSkgJiYKICAgICAgICAgICAgbWVtYmVyLmlzR2V0dGVyKTsKICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLmFkZFJhd0NhbGwoCiAgICAgICAgICAgIG5ldyBEaXJlY3RTZWxlY3RvcihtZW1iZXIsIGNhbGxLaW5kOiBDYWxsS2luZC5Qcm9wZXJ0eUdldCkpOwogICAgICAgIHR5cGVGbG93QW5hbHlzaXMuYXBwbHlDYWxsKC8qIGNhbGxTaXRlID0gKi8gbnVsbCwgRHluYW1pY1NlbGVjdG9yLmtDYWxsLAogICAgICAgICAgICBuZXcgQXJncy53aXRoUmVjZWl2ZXIoYXJncywgbmV3IFR5cGUubnVsbGFibGVBbnkoKSksCiAgICAgICAgICAgIGlzUmVzdWx0VXNlZDogZmFsc2UsIHByb2Nlc3NJbW1lZGlhdGVseTogZmFsc2UpOwogICAgICAgIHJldHVybiBuZXcgVHlwZS5udWxsYWJsZUFueSgpOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIF9hcmd1bWVudHNWYWxpZCgpIHsKICAgIGZpbmFsIGZ1bmN0aW9uID0gc2VsZWN0b3IubWVtYmVyLmZ1bmN0aW9uOwogICAgYXNzZXJ0eChmdW5jdGlvbiAhPSBudWxsKTsKCiAgICBmaW5hbCBpbnQgcG9zaXRpb25hbEFyZ3VtZW50cyA9IGFyZ3MucG9zaXRpb25hbENvdW50OwoKICAgIGZpbmFsIGludCBmaXJzdFBhcmFtSW5kZXggPSBudW1UeXBlUGFyYW1zKHNlbGVjdG9yLm1lbWJlcikgKwogICAgICAgIChoYXNSZWNlaXZlckFyZyhzZWxlY3Rvci5tZW1iZXIpID8gMSA6IDApOwogICAgZmluYWwgaW50IHJlcXVpcmVkUGFyYW1ldGVycyA9CiAgICAgICAgZmlyc3RQYXJhbUluZGV4ICsgZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRzIDwgcmVxdWlyZWRQYXJhbWV0ZXJzKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBmaW5hbCBpbnQgcG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgIGZpcnN0UGFyYW1JbmRleCArIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGlmIChwb3NpdGlvbmFsQXJndW1lbnRzID4gcG9zaXRpb25hbFBhcmFtZXRlcnMpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChhcmdzLm5hbWVzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gVE9ETyhkYXJ0YnVnLmNvbS8zMjI5Mik6IG1ha2Ugc3VyZSBwYXJhbWV0ZXJzIGFyZSBzb3J0ZWQgaW4ga2VybmVsIEFTVAogICAgICAvLyBhbmQgaXRlcmF0ZSBwYXJhbWV0ZXJzIGluIHBhcmFsbGVsLCB3aXRob3V0IGxvb2t1cC4KICAgICAgZm9yICh2YXIgbmFtZSBpbiBhcmdzLm5hbWVzKSB7CiAgICAgICAgaWYgKGZpbmROYW1lZFBhcmFtZXRlcihmdW5jdGlvbiwgbmFtZSkgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgX0Rpc3BhdGNoYWJsZUludm9jYXRpb24gZXh0ZW5kcyBfSW52b2NhdGlvbiB7CiAgYm9vbCBfaXNQb2x5bW9ycGhpYyA9IGZhbHNlOwogIFNldDxDYWxsPiBfY2FsbFNpdGVzOyAvLyBQb3B1bGF0ZWQgb25seSBpZiBub3QgcG9seW1vcnBoaWMuCiAgTWVtYmVyIF9tb25vbW9ycGhpY1RhcmdldDsKICBfRGlyZWN0SW52b2NhdGlvbiBfbW9ub21vcnBoaWNEaXJlY3RJbnZvY2F0aW9uOwoKICBAb3ZlcnJpZGUKICBzZXQgdHlwZUNoZWNrc05lZWRlZChib29sIHZhbHVlKSB7CiAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgcmV0dXJuOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIHN1cGVyLnR5cGVDaGVja3NOZWVkZWQgPSB0cnVlOwogICAgICBfbm90aWZ5Q2FsbFNpdGVzKCk7CiAgICB9CiAgfQoKICAvLy8gTWFya2VyIGZvciBub1N1Y2hNZXRob2QoKSBpbnZvY2F0aW9uIGluIHRoZSBtYXAgb2YgaW52b2NhdGlvbiB0YXJnZXRzLgogIHN0YXRpYyBmaW5hbCBNZW1iZXIga05vU3VjaE1ldGhvZE1hcmtlciA9CiAgICAgIG5ldyBQcm9jZWR1cmUobmV3IE5hbWUoJ25vU3VjaE1ldGhvZCYmJyksIFByb2NlZHVyZUtpbmQuTWV0aG9kLCBudWxsKTsKCiAgX0Rpc3BhdGNoYWJsZUludm9jYXRpb24oU2VsZWN0b3Igc2VsZWN0b3IsIEFyZ3M8VHlwZT4gYXJncykKICAgICAgOiBzdXBlcihzZWxlY3RvciwgYXJncykgewogICAgYXNzZXJ0eChzZWxlY3RvciBpcyEgRGlyZWN0U2VsZWN0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBwcm9jZXNzKFR5cGVGbG93QW5hbHlzaXMgdHlwZUZsb3dBbmFseXNpcykgewogICAgYXNzZXJ0eCh0eXBlRmxvd0FuYWx5c2lzLmN1cnJlbnRJbnZvY2F0aW9uID09IHRoaXMpOwoKICAgIC8vIENvbGxlY3QgYWxsIHBvc3NpYmxlIHRhcmdldHMgZm9yIHRoaXMgaW52b2NhdGlvbiwKICAgIC8vIGFsb25nIHdpdGggbW9yZSBhY2N1cmF0ZSByZWNlaXZlciB0eXBlcyBmb3IgZWFjaCB0YXJnZXQuCiAgICBmaW5hbCB0YXJnZXRzID0gPE1lbWJlciwgX1JlY2VpdmVyVHlwZUJ1aWxkZXI+e307CiAgICBfY29sbGVjdFRhcmdldHNGb3JSZWNlaXZlclR5cGUoYXJncy5yZWNlaXZlciwgdGFyZ2V0cywgdHlwZUZsb3dBbmFseXNpcyk7CgogICAgLy8gQ2FsY3VsYXRlIHJlc3VsdCBhcyBhIHVuaW9uIG9mIHJlc3VsdHMgb2YgZGlyZWN0IGludm9jYXRpb25zCiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggdGFyZ2V0LgogICAgVHlwZSByZXN1bHQgPSBjb25zdCBFbXB0eVR5cGUoKTsKCiAgICBpZiAodGFyZ2V0cy5pc0VtcHR5KSB7CiAgICAgIHRyYWNlUHJpbnQoIk5vIHRhcmdldHMuLi4iKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmluYWwgdGFyZ2V0ID0gdGFyZ2V0cy5rZXlzLnNpbmdsZTsKICAgICAgICBpZiAodGFyZ2V0ICE9IGtOb1N1Y2hNZXRob2RNYXJrZXIpIHsKICAgICAgICAgIF9zZXRNb25vbW9ycGhpY1RhcmdldCh0YXJnZXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfc2V0UG9seW1vcnBoaWMoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3NldFBvbHltb3JwaGljKCk7CiAgICAgIH0KCiAgICAgIHRhcmdldHMKICAgICAgICAgIC5mb3JFYWNoKChNZW1iZXIgdGFyZ2V0LCBfUmVjZWl2ZXJUeXBlQnVpbGRlciByZWNlaXZlclR5cGVCdWlsZGVyKSB7CiAgICAgICAgVHlwZSByZWNlaXZlciA9IHJlY2VpdmVyVHlwZUJ1aWxkZXIudG9UeXBlKCk7CiAgICAgICAgVHlwZSB0eXBlOwoKICAgICAgICBpZiAodGFyZ2V0ID09IGtOb1N1Y2hNZXRob2RNYXJrZXIpIHsKICAgICAgICAgIC8vIE5vbi1keW5hbWljIGNhbGwtc2l0ZXMgbXVzdCBoaXQgTlNNLWZvcndhcmRlcnMgaW4gRGFydCAyLgogICAgICAgICAgYXNzZXJ0eChzZWxlY3RvciBpcyBEeW5hbWljU2VsZWN0b3IpOwogICAgICAgICAgdHlwZSA9IF9wcm9jZXNzTm9TdWNoTWV0aG9kKHJlY2VpdmVyLCB0eXBlRmxvd0FuYWx5c2lzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmluYWwgZGlyZWN0U2VsZWN0b3IgPQogICAgICAgICAgICAgIG5ldyBEaXJlY3RTZWxlY3Rvcih0YXJnZXQsIGNhbGxLaW5kOiBzZWxlY3Rvci5jYWxsS2luZCk7CgogICAgICAgICAgQXJnczxUeXBlPiBkaXJlY3RBcmdzID0gYXJnczsKICAgICAgICAgIGlmIChhcmdzLnJlY2VpdmVyICE9IHJlY2VpdmVyKSB7CiAgICAgICAgICAgIGRpcmVjdEFyZ3MgPSBuZXcgQXJnczxUeXBlPi53aXRoUmVjZWl2ZXIoYXJncywgcmVjZWl2ZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIGZpbmFsIGRpcmVjdEludm9jYXRpb24gPSB0eXBlRmxvd0FuYWx5c2lzLl9pbnZvY2F0aW9uc0NhY2hlCiAgICAgICAgICAgICAgLmdldEludm9jYXRpb24oZGlyZWN0U2VsZWN0b3IsIGRpcmVjdEFyZ3MpOwoKICAgICAgICAgIGlmICghX2lzUG9seW1vcnBoaWMpIHsKICAgICAgICAgICAgYXNzZXJ0eCh0YXJnZXQgPT0gX21vbm9tb3JwaGljVGFyZ2V0KTsKICAgICAgICAgICAgX21vbm9tb3JwaGljRGlyZWN0SW52b2NhdGlvbiA9IGRpcmVjdEludm9jYXRpb247CiAgICAgICAgICB9CgogICAgICAgICAgdHlwZSA9IHR5cGVGbG93QW5hbHlzaXMud29ya0xpc3QucHJvY2Vzc0ludm9jYXRpb24oZGlyZWN0SW52b2NhdGlvbik7CiAgICAgICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICAgICAgdHJhY2VQcmludCgnRGlzcGF0Y2g6ICRkaXJlY3RJbnZvY2F0aW9uLCByZXN1bHQ6ICR0eXBlJyk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gUmVzdWx0IG9mIHRoaXMgaW52b2NhdGlvbiBkZXBlbmRzIG9uIHRoZSByZXN1bHRzIG9mIGRpcmVjdAogICAgICAgICAgLy8gaW52b2NhdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIHRhcmdldC4KICAgICAgICAgIGRpcmVjdEludm9jYXRpb24uYWRkRGVwZW5kZW50SW52b2NhdGlvbih0aGlzKTsKCiAgICAgICAgICBpZiAoc2VsZWN0b3IuY2FsbEtpbmQgIT0gQ2FsbEtpbmQuUHJvcGVydHlHZXQpIHsKICAgICAgICAgICAgaWYgKHNlbGVjdG9yIGlzIER5bmFtaWNTZWxlY3RvcikgewogICAgICAgICAgICAgIHR5cGVGbG93QW5hbHlzaXMuX21ldGhvZHNBbmRTZXR0ZXJzQ2FsbGVkRHluYW1pY2FsbHkuYWRkKHRhcmdldCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgaXMgVmlydHVhbFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgdHlwZUZsb3dBbmFseXNpcy5fY2FsbGVkVmlhVGhpcy5hZGQodGFyZ2V0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0eXBlRmxvd0FuYWx5c2lzLl9jYWxsZWRWaWFJbnRlcmZhY2VTZWxlY3Rvci5hZGQodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHNlbGVjdG9yIGlzIER5bmFtaWNTZWxlY3RvcikgewogICAgICAgICAgICAgIHR5cGVGbG93QW5hbHlzaXMuX2dldHRlcnNDYWxsZWREeW5hbWljYWxseS5hZGQodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChkaXJlY3RJbnZvY2F0aW9uLnR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXN1bHQgPSByZXN1bHQudW5pb24odHlwZSwgdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZSk7CiAgICAgIH0pOwogICAgfQoKICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGhhbmRsZSBjbG9zdXJlcyBtb3JlIHByZWNpc2VseQogICAgaWYgKChzZWxlY3RvciBpcyBEeW5hbWljU2VsZWN0b3IpICYmIChzZWxlY3Rvci5uYW1lLm5hbWUgPT0gImNhbGwiKSkgewogICAgICB0cmFjZVByaW50KCJQb3NzaWJsZSBjbG9zdXJlIGNhbGwsIHJlc3VsdCBpcyBkeW5hbWljIik7CiAgICAgIHJlc3VsdCA9IG5ldyBUeXBlLm51bGxhYmxlQW55KCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX2NvbGxlY3RUYXJnZXRzRm9yUmVjZWl2ZXJUeXBlKAogICAgICBUeXBlIHJlY2VpdmVyLAogICAgICBNYXA8TWVtYmVyLCBfUmVjZWl2ZXJUeXBlQnVpbGRlcj4gdGFyZ2V0cywKICAgICAgVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzKSB7CiAgICBhc3NlcnR4KHJlY2VpdmVyICE9IGNvbnN0IEVtcHR5VHlwZSgpKTsgLy8gc2hvdWxkIGJlIGZpbHRlcmVkIGVhcmxpZXIKCiAgICBmaW5hbCBib29sIGlzTnVsbGFibGVSZWNlaXZlciA9IHJlY2VpdmVyIGlzIE51bGxhYmxlVHlwZTsKICAgIGlmIChpc051bGxhYmxlUmVjZWl2ZXIpIHsKICAgICAgcmVjZWl2ZXIgPSAocmVjZWl2ZXIgYXMgTnVsbGFibGVUeXBlKS5iYXNlVHlwZTsKICAgICAgYXNzZXJ0eChyZWNlaXZlciBpcyEgTnVsbGFibGVUeXBlKTsKICAgIH0KCiAgICBpZiAoc2VsZWN0b3IgaXMgSW50ZXJmYWNlU2VsZWN0b3IpIHsKICAgICAgZmluYWwgc3RhdGljUmVjZWl2ZXJUeXBlID0gbmV3IENvbmVUeXBlKHR5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUKICAgICAgICAgIC5nZXRURkNsYXNzKHNlbGVjdG9yLm1lbWJlci5lbmNsb3NpbmdDbGFzcykpOwogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmludGVyc2VjdGlvbigKICAgICAgICAgIHN0YXRpY1JlY2VpdmVyVHlwZSwgdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZSk7CiAgICAgIGFzc2VydHgocmVjZWl2ZXIgaXMhIE51bGxhYmxlVHlwZSk7CgogICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICB0cmFjZVByaW50KCJOYXJyb3dlZCBkb3duIHJlY2VpdmVyIHR5cGU6ICRyZWNlaXZlciIpOwogICAgICB9CiAgICB9CgogICAgaWYgKHJlY2VpdmVyIGlzIENvbmVUeXBlKSB7CiAgICAgIC8vIFNwZWNpYWxpemF0aW9uIG9mIHR5cGUgY29uZSB3aWxsIGFkZCBkZXBlbmRlbmN5IG9mIHRoZSBjdXJyZW50CiAgICAgIC8vIGludm9jYXRpb24gdG8gdGhlIHJlY2VpdmVyIGNsYXNzLiBBIG5ldyBhbGxvY2F0ZWQgY2xhc3MgZGlzY292ZXJlZAogICAgICAvLyBpbiB0aGUgcmVjZWl2ZXIgY29uZSB3aWxsIGludmFsaWRhdGUgdGhpcyBpbnZvY2F0aW9uLgogICAgICByZWNlaXZlciA9IHR5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUKICAgICAgICAgIC5zcGVjaWFsaXplVHlwZUNvbmUoKHJlY2VpdmVyIGFzIENvbmVUeXBlKS5jbHMpOwogICAgfQoKICAgIGFzc2VydHgodGFyZ2V0cy5pc0VtcHR5KTsKCiAgICBpZiAocmVjZWl2ZXIgaXMgQ29uY3JldGVUeXBlKSB7CiAgICAgIF9jb2xsZWN0VGFyZ2V0c0ZvckNvbmNyZXRlVHlwZShyZWNlaXZlciwgdGFyZ2V0cywgdHlwZUZsb3dBbmFseXNpcyk7CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIFNldFR5cGUpIHsKICAgICAgZm9yICh2YXIgdHlwZSBpbiByZWNlaXZlci50eXBlcykgewogICAgICAgIF9jb2xsZWN0VGFyZ2V0c0ZvckNvbmNyZXRlVHlwZSh0eXBlLCB0YXJnZXRzLCB0eXBlRmxvd0FuYWx5c2lzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChyZWNlaXZlciBpcyBBbnlUeXBlKSB7CiAgICAgIF9jb2xsZWN0VGFyZ2V0c0ZvclNlbGVjdG9yKHRhcmdldHMsIHR5cGVGbG93QW5hbHlzaXMpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0eChyZWNlaXZlciBpcyBFbXB0eVR5cGUpOwogICAgfQoKICAgIGlmIChpc051bGxhYmxlUmVjZWl2ZXIpIHsKICAgICAgX2NvbGxlY3RUYXJnZXRzRm9yTnVsbCh0YXJnZXRzLCB0eXBlRmxvd0FuYWx5c2lzKTsKICAgIH0KICB9CgogIC8vIFRPRE8oYWxleG1hcmtvdik6IENvbnNpZGVyIGNhY2hpbmcgdGFyZ2V0cyBmb3IgTnVsbCB0eXBlLgogIHZvaWQgX2NvbGxlY3RUYXJnZXRzRm9yTnVsbChNYXA8TWVtYmVyLCBfUmVjZWl2ZXJUeXBlQnVpbGRlcj4gdGFyZ2V0cywKICAgICAgVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzKSB7CiAgICBDbGFzcyBudWxsQ2xhc3MgPSB0eXBlRmxvd0FuYWx5c2lzLmVudmlyb25tZW50LmNvcmVUeXBlcy5udWxsQ2xhc3M7CgogICAgTWVtYmVyIHRhcmdldCA9IHR5cGVGbG93QW5hbHlzaXMuaGllcmFyY2h5Q2FjaGUuaGllcmFyY2h5CiAgICAgICAgLmdldERpc3BhdGNoVGFyZ2V0KG51bGxDbGFzcywgc2VsZWN0b3IubmFtZSwgc2V0dGVyOiBzZWxlY3Rvci5pc1NldHRlcik7CgogICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CiAgICAgIGlmIChrUHJpbnRUcmFjZSkgewogICAgICAgIHRyYWNlUHJpbnQoIkZvdW5kICR0YXJnZXQgZm9yIG51bGwgcmVjZWl2ZXIiKTsKICAgICAgfQogICAgICBfZ2V0UmVjZWl2ZXJUeXBlQnVpbGRlcih0YXJnZXRzLCB0YXJnZXQpLmFkZE51bGwoKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbGxlY3RUYXJnZXRzRm9yQ29uY3JldGVUeXBlKAogICAgICBDb25jcmV0ZVR5cGUgcmVjZWl2ZXIsCiAgICAgIE1hcDxNZW1iZXIsIF9SZWNlaXZlclR5cGVCdWlsZGVyPiB0YXJnZXRzLAogICAgICBUeXBlRmxvd0FuYWx5c2lzIHR5cGVGbG93QW5hbHlzaXMpIHsKICAgIGZpbmFsIFRGQ2xhc3MgY2xzID0gcmVjZWl2ZXIuY2xzOwoKICAgIE1lbWJlciB0YXJnZXQgPSB0eXBlRmxvd0FuYWx5c2lzLmhpZXJhcmNoeUNhY2hlLmhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldCgKICAgICAgICBjbHMuY2xhc3NOb2RlLCBzZWxlY3Rvci5uYW1lLAogICAgICAgIHNldHRlcjogc2VsZWN0b3IuaXNTZXR0ZXIpOwoKICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICB0cmFjZVByaW50KCJGb3VuZCAkdGFyZ2V0IGZvciBjb25jcmV0ZSByZWNlaXZlciAkcmVjZWl2ZXIiKTsKICAgICAgfQogICAgICBfZ2V0UmVjZWl2ZXJUeXBlQnVpbGRlcih0YXJnZXRzLCB0YXJnZXQpLmFkZENvbmNyZXRlVHlwZShyZWNlaXZlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAodHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZS5oYXNOb25Ucml2aWFsTm9TdWNoTWV0aG9kKGNscykpIHsKICAgICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICAgIHRyYWNlUHJpbnQoIkZvdW5kIG5vbi10cml2aWFsIG5vU3VjaE1ldGhvZCBmb3IgcmVjZWl2ZXIgJHJlY2VpdmVyIik7CiAgICAgICAgfQogICAgICAgIF9nZXRSZWNlaXZlclR5cGVCdWlsZGVyKHRhcmdldHMsIGtOb1N1Y2hNZXRob2RNYXJrZXIpCiAgICAgICAgICAgIC5hZGRDb25jcmV0ZVR5cGUocmVjZWl2ZXIpOwogICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yIGlzIER5bmFtaWNTZWxlY3RvcikgewogICAgICAgIGlmIChrUHJpbnRUcmFjZSkgewogICAgICAgICAgdHJhY2VQcmludCgKICAgICAgICAgICAgICAiRHluYW1pYyBzZWxlY3RvciAtIGFkZGluZyBub1N1Y2hNZXRob2QgZm9yIHJlY2VpdmVyICRyZWNlaXZlciIpOwogICAgICAgIH0KICAgICAgICBfZ2V0UmVjZWl2ZXJUeXBlQnVpbGRlcih0YXJnZXRzLCBrTm9TdWNoTWV0aG9kTWFya2VyKQogICAgICAgICAgICAuYWRkQ29uY3JldGVUeXBlKHJlY2VpdmVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICAgIHRyYWNlUHJpbnQoIlRhcmdldCBpcyBub3QgZm91bmQgZm9yIHJlY2VpdmVyICRyZWNlaXZlciIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfY29sbGVjdFRhcmdldHNGb3JTZWxlY3RvcihNYXA8TWVtYmVyLCBfUmVjZWl2ZXJUeXBlQnVpbGRlcj4gdGFyZ2V0cywKICAgICAgVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzKSB7CiAgICBTZWxlY3RvciBzZWxlY3RvciA9IHRoaXMuc2VsZWN0b3I7CiAgICBpZiAoc2VsZWN0b3IgaXMgSW50ZXJmYWNlU2VsZWN0b3IpIHsKICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogc3VwcG9ydCBnZW5lcmljIHR5cGVzIGFuZCBtYWtlIHN1cmUgaW5mZXJyZWQgdHlwZXMKICAgICAgLy8gYXJlIGFsd2F5cyBzYW1lIG9yIGJldHRlciB0aGFuIHN0YXRpYyB0eXBlcy4KLy8gICAgICBhc3NlcnR4KHNlbGVjdG9yLm1lbWJlci5lbmNsb3NpbmdDbGFzcyA9PQovLyAgICAgICAgICBfdHlwZUZsb3dBbmFseXNpcy5lbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3MsIGRldGFpbHM6IHNlbGVjdG9yKTsKICAgICAgc2VsZWN0b3IgPSBuZXcgRHluYW1pY1NlbGVjdG9yKHNlbGVjdG9yLmNhbGxLaW5kLCBzZWxlY3Rvci5uYW1lKTsKICAgIH0KCiAgICBmaW5hbCByZWNlaXZlciA9IGFyZ3MucmVjZWl2ZXI7CiAgICBmaW5hbCBfRHluYW1pY1RhcmdldFNldCBkeW5hbWljVGFyZ2V0U2V0ID0gdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZQogICAgICAgIC5nZXREeW5hbWljVGFyZ2V0U2V0KHNlbGVjdG9yIGFzIER5bmFtaWNTZWxlY3Rvcik7CgogICAgZHluYW1pY1RhcmdldFNldC5hZGREZXBlbmRlbnRJbnZvY2F0aW9uKHRoaXMpOwoKICAgIGFzc2VydHgodGFyZ2V0cy5pc0VtcHR5KTsKICAgIGZvciAoTWVtYmVyIHRhcmdldCBpbiBkeW5hbWljVGFyZ2V0U2V0LnRhcmdldHMpIHsKICAgICAgX2dldFJlY2VpdmVyVHlwZUJ1aWxkZXIodGFyZ2V0cywgdGFyZ2V0KS5hZGRUeXBlKHJlY2VpdmVyKTsKICAgIH0KCiAgICAvLyBDb25zZXJ2YXRpdmVseSBpbmNsdWRlIG5vU3VjaE1ldGhvZCBpZiBzZWxlY3RvciBpcyBub3QgZnJvbSBPYmplY3QsCiAgICAvLyBhcyBjbGFzcyBtaWdodCBtaXNzIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgIGlmICghZHluYW1pY1RhcmdldFNldC5pc09iamVjdE1lbWJlcikgewogICAgICBfZ2V0UmVjZWl2ZXJUeXBlQnVpbGRlcih0YXJnZXRzLCBrTm9TdWNoTWV0aG9kTWFya2VyKS5hZGRUeXBlKHJlY2VpdmVyKTsKICAgIH0KICB9CgogIF9SZWNlaXZlclR5cGVCdWlsZGVyIF9nZXRSZWNlaXZlclR5cGVCdWlsZGVyKAogICAgICAgICAgTWFwPE1lbWJlciwgX1JlY2VpdmVyVHlwZUJ1aWxkZXI+IHRhcmdldHMsIE1lbWJlciBtZW1iZXIpID0+CiAgICAgIHRhcmdldHNbbWVtYmVyXSA/Pz0gbmV3IF9SZWNlaXZlclR5cGVCdWlsZGVyKCk7CgogIHZvaWQgX3NldFBvbHltb3JwaGljKCkgewogICAgaWYgKCFfaXNQb2x5bW9ycGhpYykgewogICAgICBfaXNQb2x5bW9ycGhpYyA9IHRydWU7CiAgICAgIF9tb25vbW9ycGhpY1RhcmdldCA9IG51bGw7CiAgICAgIHR5cGVDaGVja3NOZWVkZWQgPSB0cnVlOwoKICAgICAgX25vdGlmeUNhbGxTaXRlcygpOwogICAgICBfY2FsbFNpdGVzID0gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgX3NldE1vbm9tb3JwaGljVGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIGFzc2VydHgoIV9pc1BvbHltb3JwaGljKTsKICAgIGFzc2VydHgoKF9tb25vbW9ycGhpY1RhcmdldCA9PSBudWxsKSB8fCAoX21vbm9tb3JwaGljVGFyZ2V0ID09IHRhcmdldCkpOwogICAgX21vbm9tb3JwaGljVGFyZ2V0ID0gdGFyZ2V0OwoKICAgIF9ub3RpZnlDYWxsU2l0ZXMoKTsKICB9CgogIHZvaWQgYWRkQ2FsbFNpdGUoQ2FsbCBjYWxsU2l0ZSkgewogICAgX25vdGlmeUNhbGxTaXRlKGNhbGxTaXRlKTsKICAgIGlmICghY2FsbFNpdGUuaXNQb2x5bW9ycGhpYykgewogICAgICAoX2NhbGxTaXRlcyA/Pz0gbmV3IFNldDxDYWxsPigpKS5hZGQoY2FsbFNpdGUpOwogICAgfQogIH0KCiAgLy8vIE5vdGlmeSBjYWxsIHNpdGUgYWJvdXQgY2hhbmdlcyBpbiBwb2x5bW9ycGhpc20gb3IgY2hlY2tlZG5lc3Mgb2YgdGhpcwogIC8vLyBpbnZvY2F0aW9uLgogIHZvaWQgX25vdGlmeUNhbGxTaXRlKENhbGwgY2FsbFNpdGUpIHsKICAgIGlmIChfaXNQb2x5bW9ycGhpYykgewogICAgICBjYWxsU2l0ZS5zZXRQb2x5bW9ycGhpYygpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9tb25vbW9ycGhpY1RhcmdldCAhPSBudWxsKSB7CiAgICAgICAgY2FsbFNpdGUuYWRkVGFyZ2V0KF9tb25vbW9ycGhpY1RhcmdldCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICBjYWxsU2l0ZS5zZXRVc2VDaGVja2VkRW50cnkoKTsKICAgIH0KICB9CgogIC8vLyBOb3RpZnkgY2FsbCBzaXRlcyBtb25pdG9yaW5nIHRoaXMgaW52b2NhdGlvbiBhYm91dCBjaGFuZ2VzIGluCiAgLy8vIHBvbHltb3JwaGlzbSBvZiB0aGlzIGludm9jYXRpb24uCiAgdm9pZCBfbm90aWZ5Q2FsbFNpdGVzKCkgewogICAgaWYgKF9jYWxsU2l0ZXMgIT0gbnVsbCkgewogICAgICBfY2FsbFNpdGVzLmZvckVhY2goX25vdGlmeUNhbGxTaXRlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGUgZ2V0IHJlc3VsdEZvclJlY3Vyc2l2ZUludm9jYXRpb24gewogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoX21vbm9tb3JwaGljRGlyZWN0SW52b2NhdGlvbiAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfbW9ub21vcnBoaWNEaXJlY3RJbnZvY2F0aW9uLnJlc3VsdEZvclJlY3Vyc2l2ZUludm9jYXRpb247CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBFZmZpY2llbnQgYnVpbGRlciBvZiByZWNlaXZlciB0eXBlLgovLy8KLy8vIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczoKLy8vIDEpIEFkZCAxLi5OIGNvbmNyZXRlIHR5cGVzIG9yZGVyZWQgYnkgY2xhc3NJZCBPUiBhZGQgMSBhcmJpdHJhcnkgdHlwZS4KLy8vIDIpIE1ha2UgdHlwZSBudWxsYWJsZS4KY2xhc3MgX1JlY2VpdmVyVHlwZUJ1aWxkZXIgewogIFR5cGUgX3R5cGU7CiAgTGlzdDxDb25jcmV0ZVR5cGU+IF9saXN0OwogIGJvb2wgX251bGxhYmxlID0gZmFsc2U7CgogIC8vLyBBcHBlbmRzIGEgQ29uY3JldGVUeXBlLiBNYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgogIC8vLyBTaG91bGQgbm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbYWRkVHlwZV0uCiAgdm9pZCBhZGRDb25jcmV0ZVR5cGUoQ29uY3JldGVUeXBlIHR5cGUpIHsKICAgIGlmIChfbGlzdCA9PSBudWxsKSB7CiAgICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CiAgICAgICAgX3R5cGUgPSB0eXBlOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgYXNzZXJ0eChfdHlwZSBpcyBDb25jcmV0ZVR5cGUpOwogICAgICBhc3NlcnR4KF90eXBlICE9IHR5cGUpOwoKICAgICAgX2xpc3QgPSBuZXcgTGlzdDxDb25jcmV0ZVR5cGU+KCk7CiAgICAgIF9saXN0LmFkZChfdHlwZSk7CgogICAgICBfdHlwZSA9IG51bGw7CiAgICB9CgogICAgYXNzZXJ0eChfbGlzdC5sYXN0LmNscy5pZCA8IHR5cGUuY2xzLmlkKTsKICAgIF9saXN0LmFkZCh0eXBlKTsKICB9CgogIC8vLyBBcHBlbmRzIGFuIGFyYml0cmFyeSBUeXBlLiBNYXkgYmUgY2FsbGVkIG9ubHkgb25jZS4KICAvLy8gU2hvdWxkIG5vdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggW2FkZENvbmNyZXRlVHlwZV0uCiAgdm9pZCBhZGRUeXBlKFR5cGUgdHlwZSkgewogICAgYXNzZXJ0eChfdHlwZSA9PSBudWxsICYmIF9saXN0ID09IG51bGwpOwogICAgX3R5cGUgPSB0eXBlOwogIH0KCiAgLy8vIE1ha2VzIHRoZSByZXN1bHRpbmcgdHlwZSBudWxsYWJsZS4KICB2b2lkIGFkZE51bGwoKSB7CiAgICBfbnVsbGFibGUgPSB0cnVlOwogIH0KCiAgLy8vIFJldHVybnMgdW5pb24gb2YgYWRkZWQgdHlwZXMuCiAgVHlwZSB0b1R5cGUoKSB7CiAgICBUeXBlIHQgPSBfdHlwZTsKICAgIGlmICh0ID09IG51bGwpIHsKICAgICAgaWYgKF9saXN0ID09IG51bGwpIHsKICAgICAgICB0ID0gY29uc3QgRW1wdHlUeXBlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdCA9IG5ldyBTZXRUeXBlKF9saXN0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0eChfbGlzdCA9PSBudWxsKTsKICAgIH0KCiAgICBpZiAoX251bGxhYmxlKSB7CiAgICAgIGlmICh0IGlzISBOdWxsYWJsZVR5cGUpIHsKICAgICAgICB0ID0gbmV3IE51bGxhYmxlVHlwZSh0KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0OwogIH0KfQoKLy8vIEtlZXBzIHRyYWNrIG9mIG51bWJlciBvZiBjYWNoZWQgW19JbnZvY2F0aW9uXSBvYmplY3RzIHdpdGgKLy8vIGEgcGFydGljdWxhciBzZWxlY3RvciBhbmQgcHJvdmlkZXMgYXBwcm94aW1hdGlvbiBpZiBuZWVkZWQuCmNsYXNzIF9TZWxlY3RvckFwcHJveGltYXRpb24gewogIC8vLyBBcHByb3hpbWF0aW9uIFtfSW52b2NhdGlvbl0gd2l0aCByYXcgYXJndW1lbnRzIGlzIGNyZWF0ZWQgYW5kIHVzZWQKICAvLy8gYWZ0ZXIgbnVtYmVyIG9mIFtfSW52b2NhdGlvbl0gb2JqZWN0cyB3aXRoIHNhbWUgc2VsZWN0b3IgYnV0CiAgLy8vIGRpZmZlcmVudCBhcmd1bWVudHMgcmVhY2hlcyB0aGlzIGxpbWl0LgogIHN0YXRpYyBjb25zdCBpbnQgbWF4SW52b2NhdGlvbnNQZXJTZWxlY3RvciA9IDUwMDA7CgogIGludCBjb3VudCA9IDA7CiAgX0ludm9jYXRpb24gYXBwcm94aW1hdGlvbjsKfQoKLy8vIE1haW50YWlucyAoW1NlbGVjdG9yXSwgW0FyZ3NdKSA9PiBbX0ludm9jYXRpb25dIGNhY2hlLgovLy8gSW52b2NhdGlvbnMgYXJlIGNhY2hlZCBpbiBvcmRlciB0byByZXVzZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgcmVzdWx0LgpjbGFzcyBfSW52b2NhdGlvbnNDYWNoZSB7CiAgZmluYWwgVHlwZUZsb3dBbmFseXNpcyBfdHlwZUZsb3dBbmFseXNpczsKICBmaW5hbCBTZXQ8X0ludm9jYXRpb24+IF9pbnZvY2F0aW9ucyA9IG5ldyBTZXQ8X0ludm9jYXRpb24+KCk7CiAgZmluYWwgTWFwPFNlbGVjdG9yLCBfU2VsZWN0b3JBcHByb3hpbWF0aW9uPiBfYXBwcm94aW1hdGlvbnMgPQogICAgICA8U2VsZWN0b3IsIF9TZWxlY3RvckFwcHJveGltYXRpb24+e307CgogIF9JbnZvY2F0aW9uc0NhY2hlKHRoaXMuX3R5cGVGbG93QW5hbHlzaXMpOwoKICBfSW52b2NhdGlvbiBnZXRJbnZvY2F0aW9uKFNlbGVjdG9yIHNlbGVjdG9yLCBBcmdzPFR5cGU+IGFyZ3MpIHsKICAgICsrU3RhdGlzdGljcy5pbnZvY2F0aW9uc1F1ZXJpZWRJbkNhY2hlOwogICAgX0ludm9jYXRpb24gaW52b2NhdGlvbiA9IChzZWxlY3RvciBpcyBEaXJlY3RTZWxlY3RvcikKICAgICAgICA/IG5ldyBfRGlyZWN0SW52b2NhdGlvbihzZWxlY3RvciwgYXJncykKICAgICAgICA6IG5ldyBfRGlzcGF0Y2hhYmxlSW52b2NhdGlvbihzZWxlY3RvciwgYXJncyk7CiAgICBfSW52b2NhdGlvbiByZXN1bHQgPSBfaW52b2NhdGlvbnMubG9va3VwKGludm9jYXRpb24pOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKHNlbGVjdG9yIGlzIEludGVyZmFjZVNlbGVjdG9yKSB7CiAgICAgIC8vIERldGVjdCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgaW52b2NhdGlvbnMgcGVyIHNlbGVjdG9yLiBJbiBzdWNoIGNhc2UsCiAgICAgIC8vIGFwcHJveGltYXRlIGV4dHJhIGludm9jYXRpb25zIHdpdGggYSBzaW5nbGUgaW52b2NhdGlvbiB3aXRoIHJhdwogICAgICAvLyBhcmd1bWVudHMuCgogICAgICBmaW5hbCBzYSA9IChfYXBwcm94aW1hdGlvbnNbc2VsZWN0b3JdID8/PSBuZXcgX1NlbGVjdG9yQXBwcm94aW1hdGlvbigpKTsKCiAgICAgIGlmIChzYS5jb3VudCA+PSBfU2VsZWN0b3JBcHByb3hpbWF0aW9uLm1heEludm9jYXRpb25zUGVyU2VsZWN0b3IpIHsKICAgICAgICBpZiAoc2EuYXBwcm94aW1hdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICBmaW5hbCByYXdBcmdzID0KICAgICAgICAgICAgICBfdHlwZUZsb3dBbmFseXNpcy5zdW1tYXJ5Q29sbGVjdG9yLnJhd0FyZ3VtZW50cyhzZWxlY3Rvcik7CiAgICAgICAgICBzYS5hcHByb3hpbWF0aW9uID0gbmV3IF9EaXNwYXRjaGFibGVJbnZvY2F0aW9uKHNlbGVjdG9yLCByYXdBcmdzKTsKICAgICAgICAgIFN0YXRpc3RpY3MuYXBwcm94aW1hdGVJbnZvY2F0aW9uc0NyZWF0ZWQrKzsKICAgICAgICB9CiAgICAgICAgU3RhdGlzdGljcy5hcHByb3hpbWF0ZUludm9jYXRpb25zVXNlZCsrOwogICAgICAgIHJldHVybiBzYS5hcHByb3hpbWF0aW9uOwogICAgICB9CgogICAgICArK3NhLmNvdW50OwogICAgICBTdGF0aXN0aWNzLm1heEludm9jYXRpb25zQ2FjaGVkUGVyU2VsZWN0b3IgPQogICAgICAgICAgbWF4KFN0YXRpc3RpY3MubWF4SW52b2NhdGlvbnNDYWNoZWRQZXJTZWxlY3Rvciwgc2EuY291bnQpOwogICAgfQoKICAgIGJvb2wgYWRkZWQgPSBfaW52b2NhdGlvbnMuYWRkKGludm9jYXRpb24pOwogICAgYXNzZXJ0eChhZGRlZCk7CiAgICArK1N0YXRpc3RpY3MuaW52b2NhdGlvbnNBZGRlZFRvQ2FjaGU7CiAgICByZXR1cm4gaW52b2NhdGlvbjsKICB9Cn0KCmNsYXNzIF9GaWVsZFZhbHVlIGV4dGVuZHMgX0RlcGVuZGVuY3lUcmFja2VyIHsKICBmaW5hbCBGaWVsZCBmaWVsZDsKICBmaW5hbCBUeXBlIHN0YXRpY1R5cGU7CiAgZmluYWwgU3VtbWFyeSB0eXBlR3VhcmRTdW1tYXJ5OwogIFR5cGUgdmFsdWU7CgogIC8vLyBGbGFnIGluZGljYXRpbmcgaWYgZmllbGQgaW5pdGlhbGl6ZXIgd2FzIGV4ZWN1dGVkLgogIGJvb2wgaXNJbml0aWFsaXplZCA9IGZhbHNlOwoKICAvLy8gRmxhZyBpbmRpY2F0aW5nIGlmIGZpZWxkIGdldHRlciB3YXMgZXhlY3V0ZWQuCiAgYm9vbCBpc0dldHRlclVzZWQgPSBmYWxzZTsKCiAgLy8vIEZsYWcgaW5kaWNhdGluZyBpZiBmaWVsZCBzZXR0ZXIgd2FzIGV4ZWN1dGVkLgogIGJvb2wgaXNTZXR0ZXJVc2VkID0gZmFsc2U7CgogIF9GaWVsZFZhbHVlKHRoaXMuZmllbGQsIHRoaXMudHlwZUd1YXJkU3VtbWFyeSwgVHlwZXNCdWlsZGVyIHR5cGVzQnVpbGRlcikKICAgICAgOiBzdGF0aWNUeXBlID0gdHlwZXNCdWlsZGVyLmZyb21TdGF0aWNUeXBlKGZpZWxkLnR5cGUsIHRydWUpIHsKICAgIGlmIChmaWVsZC5pbml0aWFsaXplciA9PSBudWxsICYmIF9pc0RlZmF1bHRWYWx1ZU9mRmllbGRPYnNlcnZhYmxlKCkpIHsKICAgICAgdmFsdWUgPSBuZXcgVHlwZS5udWxsYWJsZShjb25zdCBFbXB0eVR5cGUoKSk7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IGNvbnN0IEVtcHR5VHlwZSgpOwogICAgfQogIH0KCiAgYm9vbCBfaXNEZWZhdWx0VmFsdWVPZkZpZWxkT2JzZXJ2YWJsZSgpIHsKICAgIGlmIChmaWVsZC5pc1N0YXRpYykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmaW5hbCBlbmNsb3NpbmdDbGFzcyA9IGZpZWxkLmVuY2xvc2luZ0NsYXNzOwogICAgYXNzZXJ0eChlbmNsb3NpbmdDbGFzcyAhPSBudWxsKTsKCiAgICAvLyBEZWZhdWx0IHZhbHVlIGlzIG5vdCBvYnNlcnZhYmxlIGlmIGV2ZXJ5IGdlbmVyYXRpdmUgY29uc3RydWN0b3IKICAgIC8vIGlzIHJlZGlyZWN0aW5nIG9yIGluaXRpYWxpemVzIHRoZSBmaWVsZC4KICAgIHJldHVybiAhZW5jbG9zaW5nQ2xhc3MuY29uc3RydWN0b3JzLmV2ZXJ5KChDb25zdHJ1Y3RvciBjb25zdHIpIHsKICAgICAgZm9yICh2YXIgaW5pdGlhbGl6ZXIgaW4gY29uc3RyLmluaXRpYWxpemVycykgewogICAgICAgIGlmICgoaW5pdGlhbGl6ZXIgaXMgUmVkaXJlY3RpbmdJbml0aWFsaXplcikgfHwKICAgICAgICAgICAgKChpbml0aWFsaXplciBpcyBGaWVsZEluaXRpYWxpemVyKSAmJgogICAgICAgICAgICAgICAgKGluaXRpYWxpemVyLmZpZWxkID09IGZpZWxkKSkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICB9CgogIHZvaWQgZW5zdXJlSW5pdGlhbGl6ZWQoVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzLCBUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgaWYgKGZpZWxkLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgYXNzZXJ0eChmaWVsZC5pc1N0YXRpYyA9PSAocmVjZWl2ZXJUeXBlID09IG51bGwpKTsKICAgICAgZmluYWwgYXJncyA9ICFmaWVsZC5pc1N0YXRpYyA/IDxUeXBlPltyZWNlaXZlclR5cGVdIDogY29uc3QgPFR5cGU+W107CiAgICAgIGZpbmFsIGluaXRpYWxpemVySW52b2NhdGlvbiA9IHR5cGVGbG93QW5hbHlzaXMuX2ludm9jYXRpb25zQ2FjaGUKICAgICAgICAgIC5nZXRJbnZvY2F0aW9uKAogICAgICAgICAgICAgIG5ldyBEaXJlY3RTZWxlY3RvcihmaWVsZCwgY2FsbEtpbmQ6IENhbGxLaW5kLkZpZWxkSW5pdGlhbGl6ZXIpLAogICAgICAgICAgICAgIG5ldyBBcmdzPFR5cGU+KGFyZ3MpKTsKCiAgICAgIC8vIEl0IG1heSB1cGRhdGUgdGhlIGZpZWxkIHZhbHVlLgogICAgICB0eXBlRmxvd0FuYWx5c2lzLndvcmtMaXN0LnByb2Nlc3NJbnZvY2F0aW9uKGluaXRpYWxpemVySW52b2NhdGlvbik7CiAgICB9CiAgfQoKICBUeXBlIGdldFZhbHVlKFR5cGVGbG93QW5hbHlzaXMgdHlwZUZsb3dBbmFseXNpcywgVHlwZSByZWNlaXZlclR5cGUpIHsKICAgIGVuc3VyZUluaXRpYWxpemVkKHR5cGVGbG93QW5hbHlzaXMsIHJlY2VpdmVyVHlwZSk7CiAgICBhZGREZXBlbmRlbnRJbnZvY2F0aW9uKHR5cGVGbG93QW5hbHlzaXMuY3VycmVudEludm9jYXRpb24pOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgdm9pZCBzZXRWYWx1ZSgKICAgICAgVHlwZSBuZXdWYWx1ZSwgVHlwZUZsb3dBbmFseXNpcyB0eXBlRmxvd0FuYWx5c2lzLCBUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgLy8gTWFrZSBzdXJlIHR5cGUgY29uZXMgYXJlIHNwZWNpYWxpemVkIGJlZm9yZSBwdXR0aW5nIHRoZW0gaW50byBmaWVsZAogICAgLy8gdmFsdWUsIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY3kgaXMgZXN0YWJsaXNoZWQgYmV0d2VlbgogICAgLy8gY29uZSdzIGJhc2UgdHlwZSBhbmQgY29ycmVzcG9uZGluZyBmaWVsZCBzZXR0ZXIuCiAgICAvLwogICAgLy8gVGhpcyBlbnN1cmVzIGNvcnJlY3QgaW52YWxpZGF0aW9uIGluIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CiAgICAvLwogICAgLy8gMSkgc2V0VmFsdWUoQ29uZShYKSkuCiAgICAvLyAgICBJdCBzZXRzIGZpZWxkIHZhbHVlIHRvIENvbmUoWCkuCiAgICAvLwogICAgLy8gMikgc2V0VmFsdWUoWSkuCiAgICAvLyAgICBJdCBjYWxjdWxhdGVzIENvbmUoWCkgVSBZLCBzcGVjaWFsaXppbmcgQ29uZShYKS4KICAgIC8vICAgIFRoaXMgZXN0YWJsaXNoZXMgY2xhc3MgWCAtLT4gc2V0dGVyKFkpICBkZXBlbmRlbmN5LgogICAgLy8gICAgSWYgWCBkb2VzIG5vdCBoYXZlIGFsbG9jYXRlZCBzdWJjbGFzc2VzLCB0aGVuIENvbmUoWCkgaXMgc3BlY2lhbGl6ZWQKICAgIC8vICAgIHRvIEVtcHR5IGFuZCB0aGUgbmV3IGZpZWxkIHZhbHVlIGlzIFkuCiAgICAvLwogICAgLy8gMykgQSBuZXcgYWxsb2NhdGVkIHN1YnR5cGUgaXMgYWRkZWQgdG8gWC4KICAgIC8vICAgIFRoaXMgaW52YWxpZGF0ZXMgc2V0dGVyKFkpLiBIb3dldmVyLCByZWNhbGN1bGF0aW9uIG9mIHNldHRlcihZKQogICAgLy8gICAgZG9lcyBub3QgeWllbGQgY29ycmVjdCBmaWVsZCB2YWx1ZSwgYXMgdmFsdWUgY2FsY3VsYXRlZCBvbiBzdGVwIDEgaXMKICAgIC8vICAgIGFscmVhZHkgbG9zdCwgYW5kIHJlcGVhdGluZyBzZXRWYWx1ZShZKSB3aWxsIG5vdCBjaGFuZ2UgZmllbGQgdmFsdWUuCiAgICAvLwogICAgLy8gVGhlIGVhZ2VyIHNwZWNpYWxpemF0aW9uIG9mIGZpZWxkIHZhbHVlIGVuc3VyZXMgdGhhdCBzcGVjaWFsaXphdGlvbgogICAgLy8gd2lsbCBoYXBwZW4gb24gc3RlcCAxIGFuZCBkZXBlbmRlbmN5IGNsYXNzIFggLS0+IHNldHRlcihDb25lKFgpKQogICAgLy8gaXMgZXN0YWJsaXNoZWQuCiAgICAvLwogICAgZmluYWwgaGllcmFyY2h5ID0gdHlwZUZsb3dBbmFseXNpcy5oaWVyYXJjaHlDYWNoZTsKICAgIC8vIFRPRE8oc2ppbmRlbC90ZmEpOiBQZXJmb3JtIG5hcnJvd2luZyBpbnNpZGUgJ1R5cGVDaGVjaycuCiAgICBmaW5hbCBuYXJyb3dlZE5ld1ZhbHVlID0gdHlwZUd1YXJkU3VtbWFyeSAhPSBudWxsCiAgICAgICAgPyB0eXBlR3VhcmRTdW1tYXJ5CiAgICAgICAgICAgIC5hcHBseSgKICAgICAgICAgICAgICAgIG5ldyBBcmdzKFtyZWNlaXZlclR5cGUsIG5ld1ZhbHVlXSksIGhpZXJhcmNoeSwgdHlwZUZsb3dBbmFseXNpcykKICAgICAgICAgICAgLmludGVyc2VjdGlvbihzdGF0aWNUeXBlLCBoaWVyYXJjaHkpCiAgICAgICAgOiBuZXdWYWx1ZS5zcGVjaWFsaXplKGhpZXJhcmNoeSkuaW50ZXJzZWN0aW9uKHN0YXRpY1R5cGUsIGhpZXJhcmNoeSk7CiAgICBUeXBlIG5ld1R5cGUgPQogICAgICAgIHZhbHVlLnVuaW9uKG5hcnJvd2VkTmV3VmFsdWUsIGhpZXJhcmNoeSkuc3BlY2lhbGl6ZShoaWVyYXJjaHkpOwogICAgYXNzZXJ0eChuZXdUeXBlLmlzU3BlY2lhbGl6ZWQpOwoKICAgIGlmIChuZXdUeXBlICE9IHZhbHVlKSB7CiAgICAgIGlmIChrUHJpbnRUcmFjZSkgewogICAgICAgIHRyYWNlUHJpbnQoIlNldCBmaWVsZCAkZmllbGQgdmFsdWUgJG5ld1R5cGUiKTsKICAgICAgfQogICAgICBpbnZhbGlkYXRlRGVwZW5kZW50SW52b2NhdGlvbnModHlwZUZsb3dBbmFseXNpcy53b3JrTGlzdCk7CiAgICAgIHZhbHVlID0gbmV3VHlwZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJfRmllbGRWYWx1ZSAkZmllbGQgPT4gJHZhbHVlIjsKfQoKY2xhc3MgX0R5bmFtaWNUYXJnZXRTZXQgZXh0ZW5kcyBfRGVwZW5kZW5jeVRyYWNrZXIgewogIGZpbmFsIER5bmFtaWNTZWxlY3RvciBzZWxlY3RvcjsKICBmaW5hbCBTZXQ8TWVtYmVyPiB0YXJnZXRzID0gbmV3IFNldDxNZW1iZXI+KCk7CiAgZmluYWwgYm9vbCBpc09iamVjdE1lbWJlcjsKCiAgX0R5bmFtaWNUYXJnZXRTZXQodGhpcy5zZWxlY3RvciwgdGhpcy5pc09iamVjdE1lbWJlcik7Cn0KCmNsYXNzIF9URkNsYXNzSW1wbCBleHRlbmRzIFRGQ2xhc3MgewogIGZpbmFsIFNldDxfVEZDbGFzc0ltcGw+IHN1cGVydHlwZXM7IC8vIExpc3Qgb2Ygc3VwZXItdHlwZXMgaW5jbHVkaW5nIHRoaXMuCiAgZmluYWwgU2V0PF9URkNsYXNzSW1wbD4gX2FsbG9jYXRlZFN1YnR5cGVzID0gbmV3IFNldDxfVEZDbGFzc0ltcGw+KCk7CiAgZmluYWwgX0RlcGVuZGVuY3lUcmFja2VyIGRlcGVuZGVuY3lUcmFja2VyID0gbmV3IF9EZXBlbmRlbmN5VHJhY2tlcigpOwoKICAvLy8gRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgY2xhc3MgaGFzIGEgbm9TdWNoTWV0aG9kKCkgbWV0aG9kIG5vdCBpbmhlcml0ZWQKICAvLy8gZnJvbSBPYmplY3QuCiAgLy8vIExhenkgaW5pdGlhbGl6ZWQgYnkgQ2xhc3NIaWVyYXJjaHlDYWNoZS5oYXNOb25Ucml2aWFsTm9TdWNoTWV0aG9kKCkuCiAgYm9vbCBoYXNOb25Ucml2aWFsTm9TdWNoTWV0aG9kOwoKICBfVEZDbGFzc0ltcGwoaW50IGlkLCBDbGFzcyBjbGFzc05vZGUsIHRoaXMuc3VwZXJ0eXBlcykKICAgICAgOiBzdXBlcihpZCwgY2xhc3NOb2RlKSB7CiAgICBzdXBlcnR5cGVzLmFkZCh0aGlzKTsKICB9CgogIENvbmNyZXRlVHlwZSBfY29uY3JldGVUeXBlOwogIENvbmNyZXRlVHlwZSBnZXQgY29uY3JldGVUeXBlID0+CiAgICAgIF9jb25jcmV0ZVR5cGUgPz89IG5ldyBDb25jcmV0ZVR5cGUodGhpcywgbnVsbCk7CgogIFR5cGUgX3NwZWNpYWxpemVkQ29uZVR5cGU7CiAgVHlwZSBnZXQgc3BlY2lhbGl6ZWRDb25lVHlwZSA9PgogICAgICBfc3BlY2lhbGl6ZWRDb25lVHlwZSA/Pz0gX2NhbGN1bGF0ZUNvbmVUeXBlU3BlY2lhbGl6YXRpb24oKTsKCiAgVHlwZSBfY2FsY3VsYXRlQ29uZVR5cGVTcGVjaWFsaXphdGlvbigpIHsKICAgIGZpbmFsIGludCBudW1TdWJUeXBlcyA9IF9hbGxvY2F0ZWRTdWJ0eXBlcy5sZW5ndGg7CiAgICBpZiAobnVtU3ViVHlwZXMgPT0gMCkgewogICAgICByZXR1cm4gY29uc3QgRW1wdHlUeXBlKCk7CiAgICB9IGVsc2UgaWYgKG51bVN1YlR5cGVzID09IDEpIHsKICAgICAgcmV0dXJuIF9hbGxvY2F0ZWRTdWJ0eXBlcy5zaW5nbGUuY29uY3JldGVUeXBlOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxDb25jcmV0ZVR5cGU+IHR5cGVzID0gbmV3IExpc3Q8Q29uY3JldGVUeXBlPigpOwogICAgICBmb3IgKHZhciBzdWIgaW4gX2FsbG9jYXRlZFN1YnR5cGVzKSB7CiAgICAgICAgdHlwZXMuYWRkKHN1Yi5jb25jcmV0ZVR5cGUpOwogICAgICB9CiAgICAgIC8vIFNldFR5cGUgY29uc3RydWN0b3IgZXhwZWN0cyBhIGxpc3Qgb2YgQ29uY3JldGVUeXBlcyBzb3J0ZWQgYnkgY2xhc3NJZAogICAgICAvLyAoZm9yIGZhc3RlciBpbnRlcnNlY3Rpb25zIGFuZCB1bmlvbnMpLgogICAgICB0eXBlcy5zb3J0KCk7CiAgICAgIHJldHVybiBuZXcgU2V0VHlwZSh0eXBlcyk7CiAgICB9CiAgfQoKICB2b2lkIGFkZEFsbG9jYXRlZFN1YnR5cGUoX1RGQ2xhc3NJbXBsIHN1YlR5cGUpIHsKICAgIF9hbGxvY2F0ZWRTdWJ0eXBlcy5hZGQoc3ViVHlwZSk7CiAgICBfc3BlY2lhbGl6ZWRDb25lVHlwZSA9IG51bGw7IC8vIFJlc2V0IGNhY2hlZCBzcGVjaWFsaXphdGlvbi4KICB9CgogIFN0cmluZyBkdW1wKCkgPT4gIiR0aGlzIHtzdXBlcnM6ICRzdXBlcnR5cGVzfSI7Cn0KCmNsYXNzIEdlbmVyaWNJbnRlcmZhY2VzSW5mb0ltcGwgaW1wbGVtZW50cyBHZW5lcmljSW50ZXJmYWNlc0luZm8gewogIGZpbmFsIENsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwoKICBmaW5hbCBzdXBlcnR5cGVPZmZzZXRzQ2FjaGUgPSA8U3VidHlwZVBhaXIsIGludD57fTsKICBmaW5hbCBjYWNoZWRGbGF0dGVuZWRUeXBlQXJncyA9IDxDbGFzcywgTGlzdDxEYXJ0VHlwZT4+e307CiAgZmluYWwgY2FjaGVkRmxhdHRlbmVkVHlwZUFyZ3NGb3JOb25HZW5lcmljID0gPENsYXNzLCBMaXN0PFR5cGU+Pnt9OwoKICBSdW50aW1lVHlwZVRyYW5zbGF0b3JJbXBsIGNsb3NlZFR5cGVUcmFuc2xhdG9yOwoKICBHZW5lcmljSW50ZXJmYWNlc0luZm9JbXBsKHRoaXMuaGllcmFyY2h5KSB7CiAgICBjbG9zZWRUeXBlVHJhbnNsYXRvciA9IFJ1bnRpbWVUeXBlVHJhbnNsYXRvckltcGwuZm9yQ2xvc2VkVHlwZXModGhpcyk7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBmbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yKENsYXNzIGtsYXNzLCB7Ym9vbCB1c2VDYWNoZTogdHJ1ZX0pIHsKICAgIGZpbmFsIGNhY2hlZCA9IHVzZUNhY2hlID8gY2FjaGVkRmxhdHRlbmVkVHlwZUFyZ3Nba2xhc3NdIDogbnVsbDsKICAgIGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIGNhY2hlZDsKCiAgICBmaW5hbCBmbGF0dGVuZWRUeXBlQXJndW1lbnRzID0gTGlzdDxEYXJ0VHlwZT4uZnJvbShrbGFzcy50eXBlUGFyYW1ldGVycwogICAgICAgIC5tYXAoKHQpID0+IG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0LCBOdWxsYWJpbGl0eS5sZWdhY3kpKSk7CgogICAgZm9yIChmaW5hbCBTdXBlcnR5cGUgaW50ZiBpbiBoaWVyYXJjaHkuZ2VuZXJpY1N1cGVydHlwZXNPZihrbGFzcykpIHsKICAgICAgaW50IG9mZnNldCA9IGZpbmRPdmVybGFwKGZsYXR0ZW5lZFR5cGVBcmd1bWVudHMsIGludGYudHlwZUFyZ3VtZW50cyk7CiAgICAgIGZsYXR0ZW5lZFR5cGVBcmd1bWVudHMuYWRkQWxsKAogICAgICAgICAgaW50Zi50eXBlQXJndW1lbnRzLnNraXAoZmxhdHRlbmVkVHlwZUFyZ3VtZW50cy5sZW5ndGggLSBvZmZzZXQpKTsKICAgICAgc3VwZXJ0eXBlT2Zmc2V0c0NhY2hlW1N1YnR5cGVQYWlyKGtsYXNzLCBpbnRmLmNsYXNzTm9kZSldID0gb2Zmc2V0OwogICAgfQoKICAgIHJldHVybiBmbGF0dGVuZWRUeXBlQXJndW1lbnRzOwogIH0KCiAgaW50IGdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3IoQ2xhc3Mga2xhc3MsIENsYXNzIGlmYWNlKSB7CiAgICBpZiAoa2xhc3MgPT0gaWZhY2UpIHJldHVybiAwOwoKICAgIGZpbmFsIHBhaXIgPSBuZXcgU3VidHlwZVBhaXIoa2xhc3MsIGlmYWNlKTsKICAgIGludCBvZmZzZXQgPSBzdXBlcnR5cGVPZmZzZXRzQ2FjaGVbcGFpcl07CgogICAgaWYgKG9mZnNldCAhPSBudWxsKSByZXR1cm4gb2Zmc2V0OwoKICAgIGZsYXR0ZW5lZFR5cGVBcmd1bWVudHNGb3Ioa2xhc3MpOwogICAgb2Zmc2V0ID0gc3VwZXJ0eXBlT2Zmc2V0c0NhY2hlW3BhaXJdOwoKICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgewogICAgICB0aHJvdyAiSW52YWxpZCBjYWxsIHRvIGdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3IuIjsKICAgIH0KCiAgICByZXR1cm4gb2Zmc2V0OwogIH0KCiAgTGlzdDxUeXBlPiBmbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yTm9uR2VuZXJpYyhDbGFzcyBrbGFzcykgewogICAgTGlzdDxUeXBlPiByZXN1bHQgPSBjYWNoZWRGbGF0dGVuZWRUeXBlQXJnc0Zvck5vbkdlbmVyaWNba2xhc3NdOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwoKICAgIExpc3Q8RGFydFR5cGU+IGZsYXR0ZW5lZFR5cGVBcmdzID0KICAgICAgICBmbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yKGtsYXNzLCB1c2VDYWNoZTogZmFsc2UpOwogICAgcmVzdWx0ID0gbmV3IExpc3Q8VHlwZT4oZmxhdHRlbmVkVHlwZUFyZ3MubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmxhdHRlbmVkVHlwZUFyZ3MubGVuZ3RoOyArK2kpIHsKICAgICAgZmluYWwgdHJhbnNsYXRlZCA9IGNsb3NlZFR5cGVUcmFuc2xhdG9yLnRyYW5zbGF0ZShmbGF0dGVuZWRUeXBlQXJnc1tpXSk7CiAgICAgIGFzc2VydHgodHJhbnNsYXRlZCBpcyBSdW50aW1lVHlwZSB8fCB0cmFuc2xhdGVkIGlzIEFueVR5cGUpOwogICAgICByZXN1bHRbaV0gPSB0cmFuc2xhdGVkOwogICAgfQogICAgY2FjaGVkRmxhdHRlbmVkVHlwZUFyZ3NGb3JOb25HZW5lcmljW2tsYXNzXSA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLyBUT0RPKGFsZXhtYXJrb3YpOiBSZW5hbWUgdG8gX1R5cGVIaWVyYXJjaHlJbXBsLgpjbGFzcyBfQ2xhc3NIaWVyYXJjaHlDYWNoZSBleHRlbmRzIFR5cGVIaWVyYXJjaHkgewogIGZpbmFsIFR5cGVGbG93QW5hbHlzaXMgX3R5cGVGbG93QW5hbHlzaXM7CiAgZmluYWwgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IGVudmlyb25tZW50OwogIGZpbmFsIFNldDxDbGFzcz4gYWxsb2NhdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgZmluYWwgTWFwPENsYXNzLCBfVEZDbGFzc0ltcGw+IGNsYXNzZXMgPSA8Q2xhc3MsIF9URkNsYXNzSW1wbD57fTsKICBmaW5hbCBHZW5lcmljSW50ZXJmYWNlc0luZm8gZ2VuZXJpY0ludGVyZmFjZXNJbmZvOwoKICAvLy8gT2JqZWN0Lm5vU3VjaE1ldGhvZCgpLgogIGZpbmFsIE1lbWJlciBvYmplY3ROb1N1Y2hNZXRob2Q7CgogIHN0YXRpYyBmaW5hbCBOYW1lIG5vU3VjaE1ldGhvZE5hbWUgPSBuZXcgTmFtZSgibm9TdWNoTWV0aG9kIik7CgogIC8vLyBDbGFzcyBoaWVyYXJjaHkgaXMgc2VhbGVkIGFmdGVyIGFuYWx5c2lzIGlzIGZpbmlzaGVkLgogIC8vLyBPbmNlIGl0IGlzIHNlYWxlZCwgbm8gbmV3IGFsbG9jYXRlZCBjbGFzc2VzIG1heSBiZSBhZGRlZCBhbmQgbm8gbmV3CiAgLy8vIHRhcmdldHMgb2YgaW52b2NhdGlvbnMgbWF5IGFwcGVhci4KICAvLy8gSXQgYWxzbyBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gYWRkIGRlcGVuZGVuY2llcyBvbiBjbGFzc2VzLgogIGJvb2wgX3NlYWxlZCA9IGZhbHNlOwoKICBpbnQgX2NsYXNzSWRDb3VudGVyID0gMDsKCiAgZmluYWwgTWFwPER5bmFtaWNTZWxlY3RvciwgX0R5bmFtaWNUYXJnZXRTZXQ+IF9keW5hbWljVGFyZ2V0cyA9CiAgICAgIDxEeW5hbWljU2VsZWN0b3IsIF9EeW5hbWljVGFyZ2V0U2V0Pnt9OwoKICBfQ2xhc3NIaWVyYXJjaHlDYWNoZSh0aGlzLl90eXBlRmxvd0FuYWx5c2lzLCB0aGlzLmhpZXJhcmNoeSwKICAgICAgdGhpcy5nZW5lcmljSW50ZXJmYWNlc0luZm8sIHRoaXMuZW52aXJvbm1lbnQpCiAgICAgIDogb2JqZWN0Tm9TdWNoTWV0aG9kID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KAogICAgICAgICAgICBlbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3MsIG5vU3VjaE1ldGhvZE5hbWUpLAogICAgICAgIHN1cGVyKGVudmlyb25tZW50LmNvcmVUeXBlcykgewogICAgYXNzZXJ0eChvYmplY3ROb1N1Y2hNZXRob2QgIT0gbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBfVEZDbGFzc0ltcGwgZ2V0VEZDbGFzcyhDbGFzcyBjKSB7CiAgICByZXR1cm4gY2xhc3Nlc1tjXSA/Pz0gX2NyZWF0ZVRGQ2xhc3MoYyk7CiAgfQoKICBfVEZDbGFzc0ltcGwgX2NyZWF0ZVRGQ2xhc3MoQ2xhc3MgYykgewogICAgZmluYWwgc3VwZXJ0eXBlcyA9IG5ldyBTZXQ8X1RGQ2xhc3NJbXBsPigpOwogICAgZm9yICh2YXIgc3VwIGluIGMuc3VwZXJzKSB7CiAgICAgIHN1cGVydHlwZXMuYWRkQWxsKGdldFRGQ2xhc3Moc3VwLmNsYXNzTm9kZSkuc3VwZXJ0eXBlcyk7CiAgICB9CiAgICByZXR1cm4gbmV3IF9URkNsYXNzSW1wbCgrK19jbGFzc0lkQ291bnRlciwgYywgc3VwZXJ0eXBlcyk7CiAgfQoKICBDb25jcmV0ZVR5cGUgYWRkQWxsb2NhdGVkQ2xhc3MoQ2xhc3MgY2wpIHsKICAgIGFzc2VydHgoIWNsLmlzQWJzdHJhY3QpOwogICAgYXNzZXJ0eCghX3NlYWxlZCk7CgogICAgZmluYWwgX1RGQ2xhc3NJbXBsIGNsYXNzSW1wbCA9IGdldFRGQ2xhc3MoY2wpOwoKICAgIGlmIChhbGxvY2F0ZWRDbGFzc2VzLmFkZChjbCkpIHsKICAgICAgY2xhc3NJbXBsLmFkZEFsbG9jYXRlZFN1YnR5cGUoY2xhc3NJbXBsKTsKICAgICAgY2xhc3NJbXBsLmRlcGVuZGVuY3lUcmFja2VyCiAgICAgICAgICAuaW52YWxpZGF0ZURlcGVuZGVudEludm9jYXRpb25zKF90eXBlRmxvd0FuYWx5c2lzLndvcmtMaXN0KTsKCiAgICAgIGZvciAodmFyIHN1cGVydHlwZSBpbiBjbGFzc0ltcGwuc3VwZXJ0eXBlcykgewogICAgICAgIHN1cGVydHlwZS5hZGRBbGxvY2F0ZWRTdWJ0eXBlKGNsYXNzSW1wbCk7CiAgICAgICAgc3VwZXJ0eXBlLmRlcGVuZGVuY3lUcmFja2VyCiAgICAgICAgICAgIC5pbnZhbGlkYXRlRGVwZW5kZW50SW52b2NhdGlvbnMoX3R5cGVGbG93QW5hbHlzaXMud29ya0xpc3QpOwogICAgICB9CgogICAgICBmb3IgKHZhciB0YXJnZXRTZXQgaW4gX2R5bmFtaWNUYXJnZXRzLnZhbHVlcykgewogICAgICAgIF9hZGREeW5hbWljVGFyZ2V0KGNsLCB0YXJnZXRTZXQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNsYXNzSW1wbC5jb25jcmV0ZVR5cGU7CiAgfQoKICB2b2lkIHNlYWwoKSB7CiAgICBfc2VhbGVkID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJ0eXBlKENsYXNzIHN1YiwgQ2xhc3Mgc3VwKSB7CiAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgdHJhY2VQcmludCgiaXNTdWJ0eXBlIGZvciBzdWIgPSAkc3ViLCBzdXAgPSAkc3VwIik7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKHN1Yiwgc3VwKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBoYW5kbGUgRnV0dXJlT3IgbW9yZSBwcmVjaXNlbHkuCiAgICBpZiAoc3VwID09IGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9URkNsYXNzSW1wbCBzdWJDbGFzc0RhdGEgPSBnZXRURkNsYXNzKHN1Yik7CiAgICBfVEZDbGFzc0ltcGwgc3VwZXJDbGFzc0RhdGEgPSBnZXRURkNsYXNzKHN1cCk7CgogICAgcmV0dXJuIHN1YkNsYXNzRGF0YS5zdXBlcnR5cGVzLmNvbnRhaW5zKHN1cGVyQ2xhc3NEYXRhKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgc3BlY2lhbGl6ZVR5cGVDb25lKFRGQ2xhc3MgYmFzZUNsYXNzKSB7CiAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgdHJhY2VQcmludCgic3BlY2lhbGl6ZVR5cGVDb25lIGZvciAkYmFzZUNsYXNzIik7CiAgICB9CiAgICBTdGF0aXN0aWNzLnR5cGVDb25lU3BlY2lhbGl6YXRpb25zKys7CgogICAgLy8gVE9ETyhhbGV4bWFya292KTogY29uc2lkZXIgYXBwcm94aW1hdGluZyB0eXBlIGlmIG51bWJlciBvZiBhbGxvY2F0ZWQKICAgIC8vIHN1YnR5cGVzIGlzIHRvbyBsYXJnZQoKICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGhhbmRsZSBGdXR1cmVPciBtb3JlIHByZWNpc2VseS4KCiAgICBpZiAoYmFzZUNsYXNzLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMub2JqZWN0Q2xhc3MgfHwKICAgICAgICBiYXNlQ2xhc3MuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKSB7CiAgICAgIHJldHVybiBjb25zdCBBbnlUeXBlKCk7CiAgICB9CgogICAgZmluYWwgX1RGQ2xhc3NJbXBsIGNscyA9IGJhc2VDbGFzcyBhcyBfVEZDbGFzc0ltcGw7CgogICAgaWYgKCFfc2VhbGVkKSB7CiAgICAgIGNscy5kZXBlbmRlbmN5VHJhY2tlcgogICAgICAgICAgLmFkZERlcGVuZGVudEludm9jYXRpb24oX3R5cGVGbG93QW5hbHlzaXMuY3VycmVudEludm9jYXRpb24pOwogICAgfQoKICAgIHJldHVybiBjbHMuc3BlY2lhbGl6ZWRDb25lVHlwZTsKICB9CgogIGJvb2wgaGFzTm9uVHJpdmlhbE5vU3VjaE1ldGhvZChURkNsYXNzIGMpIHsKICAgIGZpbmFsIGNsYXNzSW1wbCA9IGMgYXMgX1RGQ2xhc3NJbXBsOwogICAgY2xhc3NJbXBsLmhhc05vblRyaXZpYWxOb1N1Y2hNZXRob2QgPz89CiAgICAgICAgKGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldChjLmNsYXNzTm9kZSwgbm9TdWNoTWV0aG9kTmFtZSkgIT0KICAgICAgICAgICAgb2JqZWN0Tm9TdWNoTWV0aG9kKTsKICAgIHJldHVybiBjbGFzc0ltcGwuaGFzTm9uVHJpdmlhbE5vU3VjaE1ldGhvZDsKICB9CgogIF9EeW5hbWljVGFyZ2V0U2V0IGdldER5bmFtaWNUYXJnZXRTZXQoRHluYW1pY1NlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICByZXR1cm4gKF9keW5hbWljVGFyZ2V0c1tzZWxlY3Rvcl0gPz89IF9jcmVhdGVEeW5hbWljVGFyZ2V0U2V0KHNlbGVjdG9yKSk7CiAgfQoKICBfRHluYW1pY1RhcmdldFNldCBfY3JlYXRlRHluYW1pY1RhcmdldFNldChEeW5hbWljU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IGNvbnNpZGVyIGNhY2hpbmcgdGhlIHNldCBvZiBPYmplY3Qgc2VsZWN0b3JzLgogICAgZmluYWwgaXNPYmplY3RNZXRob2QgPSAoaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KAogICAgICAgICAgICBfdHlwZUZsb3dBbmFseXNpcy5lbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3MsIHNlbGVjdG9yLm5hbWUsCiAgICAgICAgICAgIHNldHRlcjogc2VsZWN0b3IuaXNTZXR0ZXIpICE9CiAgICAgICAgbnVsbCk7CgogICAgZmluYWwgdGFyZ2V0U2V0ID0gbmV3IF9EeW5hbWljVGFyZ2V0U2V0KHNlbGVjdG9yLCBpc09iamVjdE1ldGhvZCk7CiAgICBmb3IgKENsYXNzIGMgaW4gYWxsb2NhdGVkQ2xhc3NlcykgewogICAgICBfYWRkRHluYW1pY1RhcmdldChjLCB0YXJnZXRTZXQpOwogICAgfQogICAgcmV0dXJuIHRhcmdldFNldDsKICB9CgogIHZvaWQgX2FkZER5bmFtaWNUYXJnZXQoQ2xhc3MgYywgX0R5bmFtaWNUYXJnZXRTZXQgdGFyZ2V0U2V0KSB7CiAgICBhc3NlcnR4KCFfc2VhbGVkKTsKICAgIGZpbmFsIHNlbGVjdG9yID0gdGFyZ2V0U2V0LnNlbGVjdG9yOwogICAgZmluYWwgbWVtYmVyID0gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGMsIHNlbGVjdG9yLm5hbWUsCiAgICAgICAgc2V0dGVyOiBzZWxlY3Rvci5pc1NldHRlcik7CiAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKICAgICAgaWYgKHRhcmdldFNldC50YXJnZXRzLmFkZChtZW1iZXIpKSB7CiAgICAgICAgdGFyZ2V0U2V0LmludmFsaWRhdGVEZXBlbmRlbnRJbnZvY2F0aW9ucyhfdHlwZUZsb3dBbmFseXNpcy53b3JrTGlzdCk7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGZsYXR0ZW5lZFR5cGVBcmd1bWVudHNGb3IoQ2xhc3Mga2xhc3MpID0+CiAgICAgIGdlbmVyaWNJbnRlcmZhY2VzSW5mby5mbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yKGtsYXNzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3IoQ2xhc3Mga2xhc3MsIENsYXNzIGlmYWNlKSA9PgogICAgICBnZW5lcmljSW50ZXJmYWNlc0luZm8uZ2VuZXJpY0ludGVyZmFjZU9mZnNldEZvcihrbGFzcywgaWZhY2UpOwoKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGU+IGZsYXR0ZW5lZFR5cGVBcmd1bWVudHNGb3JOb25HZW5lcmljKENsYXNzIGtsYXNzKSA9PgogICAgICBnZW5lcmljSW50ZXJmYWNlc0luZm8uZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0Zvck5vbkdlbmVyaWMoa2xhc3MpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgYnVmLndyaXRlKCJDbGFzc0hpZXJhcmNoeUNhY2hlIHtcbiIpOwogICAgYnVmLndyaXRlKCIgIGFsbG9jYXRlZCBjbGFzc2VzOlxuIik7CiAgICBhbGxvY2F0ZWRDbGFzc2VzLmZvckVhY2goKGMpIHsKICAgICAgYnVmLndyaXRlKCIgICAgJGNcbiIpOwogICAgfSk7CiAgICBidWYud3JpdGUoIiAgY2xhc3NlczpcbiIpOwogICAgY2xhc3Nlcy52YWx1ZXMuZm9yRWFjaCgoYykgewogICAgICBidWYud3JpdGUoIiAgICAke2MuZHVtcCgpfVxuIik7CiAgICB9KTsKICAgIGJ1Zi53cml0ZSgifVxuIik7CiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBfV29ya0xpc3QgewogIGZpbmFsIFR5cGVGbG93QW5hbHlzaXMgX3R5cGVGbG93QW5hbHlzaXM7CiAgZmluYWwgTGlua2VkTGlzdDxfSW52b2NhdGlvbj4gcGVuZGluZyA9IG5ldyBMaW5rZWRMaXN0PF9JbnZvY2F0aW9uPigpOwogIGZpbmFsIFNldDxfSW52b2NhdGlvbj4gcHJvY2Vzc2luZyA9IG5ldyBTZXQ8X0ludm9jYXRpb24+KCk7CiAgZmluYWwgTGlzdDxfSW52b2NhdGlvbj4gY2FsbFN0YWNrID0gPF9JbnZvY2F0aW9uPltdOwoKICBfV29ya0xpc3QodGhpcy5fdHlwZUZsb3dBbmFseXNpcyk7CgogIGJvb2wgX2lzUGVuZGluZyhfSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBpbnZvY2F0aW9uLmxpc3QgIT0gbnVsbDsKCiAgdm9pZCBlbnF1ZXVlSW52b2NhdGlvbihfSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBhc3NlcnR4KGludm9jYXRpb24ucmVzdWx0ID09IG51bGwpOwogICAgaWYgKF9pc1BlbmRpbmcoaW52b2NhdGlvbikpIHsKICAgICAgLy8gUmUtYWRkIHRoZSBpbnZvY2F0aW9uIHRvIHRoZSB0YWlsIG9mIHRoZSBwZW5kaW5nIHF1ZXVlLgogICAgICBwZW5kaW5nLnJlbW92ZShpbnZvY2F0aW9uKTsKICAgICAgYXNzZXJ0eCghX2lzUGVuZGluZyhpbnZvY2F0aW9uKSk7CiAgICB9CiAgICBwZW5kaW5nLmFkZChpbnZvY2F0aW9uKTsKICB9CgogIHZvaWQgaW52YWxpZGF0ZUludm9jYXRpb24oX0ludm9jYXRpb24gaW52b2NhdGlvbikgewogICAgU3RhdGlzdGljcy5pbnZvY2F0aW9uc0ludmFsaWRhdGVkKys7CiAgICBpZiAoaW52b2NhdGlvbi5yZXN1bHQgIT0gbnVsbCkgewogICAgICBpbnZvY2F0aW9uLmludmFsaWRhdGVkUmVzdWx0ID0gaW52b2NhdGlvbi5yZXN1bHQ7CiAgICAgIGludm9jYXRpb24ucmVzdWx0ID0gbnVsbDsKICAgIH0KICAgIGVucXVldWVJbnZvY2F0aW9uKGludm9jYXRpb24pOwogIH0KCiAgdm9pZCBwcm9jZXNzKCkgewogICAgd2hpbGUgKHBlbmRpbmcuaXNOb3RFbXB0eSkgewogICAgICBhc3NlcnR4KGNhbGxTdGFjay5pc0VtcHR5ICYmIHByb2Nlc3NpbmcuaXNFbXB0eSk7CiAgICAgIFN0YXRpc3RpY3MuaXRlcmF0aW9uc092ZXJJbnZvY2F0aW9uc1dvcmtMaXN0Kys7CiAgICAgIHByb2Nlc3NJbnZvY2F0aW9uKHBlbmRpbmcuZmlyc3QpOwogICAgfQogIH0KCiAgVHlwZSBwcm9jZXNzSW52b2NhdGlvbihfSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICBpZiAoaW52b2NhdGlvbi5yZXN1bHQgIT0gbnVsbCkgewogICAgICAvLyBBbHJlYWR5IHByb2Nlc3NlZC4KICAgICAgU3RhdGlzdGljcy51c2VkQ2FjaGVkUmVzdWx0c09mSW52b2NhdGlvbnMrKzsKICAgICAgcmV0dXJuIGludm9jYXRpb24ucmVzdWx0OwogICAgfQoKICAgIC8vIFRlc3QgaWYgdHJhY2luZyBpcyBlbmFibGVkIHRvIGF2b2lkIGV4cGVuc2l2ZSBtZXNzYWdlIGZvcm1hdHRpbmcuCiAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgdHJhY2VQcmludCgnUFJPQ0VTU0lORyAkaW52b2NhdGlvbicsIDEpOwogICAgfQoKICAgIGlmIChwcm9jZXNzaW5nLmFkZChpbnZvY2F0aW9uKSkgewogICAgICBjYWxsU3RhY2suYWRkKGludm9jYXRpb24pOwogICAgICBwZW5kaW5nLnJlbW92ZShpbnZvY2F0aW9uKTsKCiAgICAgIFR5cGUgcmVzdWx0ID0gaW52b2NhdGlvbi5wcm9jZXNzKF90eXBlRmxvd0FuYWx5c2lzKTsKCiAgICAgIGFzc2VydHgocmVzdWx0ICE9IG51bGwpOwogICAgICBpbnZvY2F0aW9uLnJlc3VsdCA9IHJlc3VsdDsKCiAgICAgIGlmIChpbnZvY2F0aW9uLmludmFsaWRhdGVkUmVzdWx0ICE9IG51bGwpIHsKICAgICAgICBpZiAoaW52b2NhdGlvbi5pbnZhbGlkYXRlZFJlc3VsdCAhPSByZXN1bHQpIHsKICAgICAgICAgIGludm9jYXRpb24uaW52YWxpZGF0ZURlcGVuZGVudEludm9jYXRpb25zKHRoaXMpOwoKICAgICAgICAgIGludm9jYXRpb24uaW52YWxpZGF0aW9uQ291bnRlcisrOwogICAgICAgICAgU3RhdGlzdGljcy5tYXhJbnZhbGlkYXRpb25zUGVySW52b2NhdGlvbiA9IG1heCgKICAgICAgICAgICAgICBTdGF0aXN0aWNzLm1heEludmFsaWRhdGlvbnNQZXJJbnZvY2F0aW9uLAogICAgICAgICAgICAgIGludm9jYXRpb24uaW52YWxpZGF0aW9uQ291bnRlcik7CiAgICAgICAgICAvLyBJbiByYXJlIGNhc2VzLCBsb29wcyBpbiBkZXBlbmRlbmNpZXMgYW5kIGFwcHJveGltYXRpb24gb2YKICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucyBtYXkgY2F1c2UgaW5maW5pdGUgYm91bmNpbmcgb2YgcmVzdWx0CiAgICAgICAgICAvLyB0eXBlcy4gVG8gcHJldmVudCBpbmZpbml0ZSBsb29waW5nIGFuZCBndWFyYW50ZWUgY29udmVyZ2VuY2Ugb2YKICAgICAgICAgIC8vIHRoZSBhbmFseXNpcywgcmVzdWx0IGlzIHNhdHVyYXRlZCBhZnRlciBpbnZvY2F0aW9uIGlzIGludmFsaWRhdGVkCiAgICAgICAgICAvLyBhdCBsZWFzdCBbX0ludm9jYXRpb24uaW52YWxpZGF0aW9uTGltaXRdIHRpbWVzLgogICAgICAgICAgaWYgKGludm9jYXRpb24uaW52YWxpZGF0aW9uQ291bnRlciA+IF9JbnZvY2F0aW9uLmludmFsaWRhdGlvbkxpbWl0KSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC51bmlvbigKICAgICAgICAgICAgICAgIGludm9jYXRpb24uaW52YWxpZGF0ZWRSZXN1bHQsIF90eXBlRmxvd0FuYWx5c2lzLmhpZXJhcmNoeUNhY2hlKTsKICAgICAgICAgICAgaW52b2NhdGlvbi5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGludm9jYXRpb24uaW52YWxpZGF0ZWRSZXN1bHQgPSBudWxsOwogICAgICB9CgogICAgICAvLyBJbnZvY2F0aW9uIGlzIHN0aWxsIHBlbmRpbmcgLSBpdCB3YXMgaW52YWxpZGF0ZWQgd2hpbGUgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAvLyBNb3ZlIHJlc3VsdCB0byBpbnZhbGlkYXRlZFJlc3VsdC4KICAgICAgaWYgKF9pc1BlbmRpbmcoaW52b2NhdGlvbikpIHsKICAgICAgICBTdGF0aXN0aWNzLmludm9jYXRpb25zSW52YWxpZGF0ZWREdXJpbmdQcm9jZXNzaW5nKys7CiAgICAgICAgaW52b2NhdGlvbi5pbnZhbGlkYXRlZFJlc3VsdCA9IHJlc3VsdDsKICAgICAgICBpbnZvY2F0aW9uLnJlc3VsdCA9IG51bGw7CiAgICAgIH0KCiAgICAgIGZpbmFsIGxhc3QgPSBjYWxsU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICBhc3NlcnR4KGlkZW50aWNhbChsYXN0LCBpbnZvY2F0aW9uKSk7CgogICAgICBwcm9jZXNzaW5nLnJlbW92ZShpbnZvY2F0aW9uKTsKCiAgICAgIFN0YXRpc3RpY3MuaW52b2NhdGlvbnNQcm9jZXNzZWQrKzsKICAgICAgaWYgKGtQcmludFRyYWNlKSB7CiAgICAgICAgdHJhY2VQcmludCgnRU5EIFBST0NFU1NJTkcgJGludm9jYXRpb24sIFJFU1VMVCAkcmVzdWx0JywgLTEpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICAvLyBSZWN1cnNpdmUgaW52b2NhdGlvbi4KICAgICAgZmluYWwgcmVzdWx0ID0gaW52b2NhdGlvbi5yZXN1bHRGb3JSZWN1cnNpdmVJbnZvY2F0aW9uOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICAgIHRyYWNlUHJpbnQoIkFscmVhZHkga25vd24gdHlwZSBmb3IgcmVjdXJzaXZlIGludm9jYXRpb246ICRyZXN1bHQiKTsKICAgICAgICAgIHRyYWNlUHJpbnQoJ0VORCBQUk9DRVNTSU5HICRpbnZvY2F0aW9uLCBSRVNVTFQgJHJlc3VsdCcsIC0xKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICAvLyBGYWxsIGJhY2sgdG8gc3RhdGljIHR5cGUuCiAgICAgIFN0YXRpc3RpY3MucmVjdXJzaXZlSW52b2NhdGlvbnNBcHByb3hpbWF0ZWQrKzsKICAgICAgZmluYWwgc3RhdGljVHlwZSA9IF90eXBlRmxvd0FuYWx5c2lzLmhpZXJhcmNoeUNhY2hlCiAgICAgICAgICAuZnJvbVN0YXRpY1R5cGUoaW52b2NhdGlvbi5zZWxlY3Rvci5zdGF0aWNSZXR1cm5UeXBlLCB0cnVlKTsKICAgICAgaWYgKGtQcmludFRyYWNlKSB7CiAgICAgICAgdHJhY2VQcmludCgKICAgICAgICAgICAgIkFwcHJveGltYXRlZCByZWN1cnNpdmUgaW52b2NhdGlvbiB3aXRoIHN0YXRpYyB0eXBlICRzdGF0aWNUeXBlIik7CiAgICAgICAgdHJhY2VQcmludCgnRU5EIFBST0NFU1NJTkcgJGludm9jYXRpb24sIFJFU1VMVCAkc3RhdGljVHlwZScsIC0xKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGljVHlwZTsKICAgIH0KICB9Cn0KCmNsYXNzIFR5cGVGbG93QW5hbHlzaXMgaW1wbGVtZW50cyBFbnRyeVBvaW50c0xpc3RlbmVyLCBDYWxsSGFuZGxlciB7CiAgZmluYWwgVGFyZ2V0IHRhcmdldDsKICBmaW5hbCBUeXBlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7CiAgZmluYWwgTGlicmFyeUluZGV4IGxpYnJhcnlJbmRleDsKICBmaW5hbCBQcmFnbWFBbm5vdGF0aW9uUGFyc2VyIGFubm90YXRpb25NYXRjaGVyOwogIE5hdGl2ZUNvZGVPcmFjbGUgbmF0aXZlQ29kZU9yYWNsZTsKICBfQ2xhc3NIaWVyYXJjaHlDYWNoZSBoaWVyYXJjaHlDYWNoZTsKICBTdW1tYXJ5Q29sbGVjdG9yIHN1bW1hcnlDb2xsZWN0b3I7CiAgX0ludm9jYXRpb25zQ2FjaGUgX2ludm9jYXRpb25zQ2FjaGU7CiAgX1dvcmtMaXN0IHdvcmtMaXN0OwogIEdlbmVyaWNJbnRlcmZhY2VzSW5mbyBfZ2VuZXJpY0ludGVyZmFjZXNJbmZvOwoKICBmaW5hbCBNYXA8TWVtYmVyLCBTdW1tYXJ5PiBfc3VtbWFyaWVzID0gPE1lbWJlciwgU3VtbWFyeT57fTsKICBmaW5hbCBNYXA8RmllbGQsIF9GaWVsZFZhbHVlPiBfZmllbGRWYWx1ZXMgPSA8RmllbGQsIF9GaWVsZFZhbHVlPnt9OwogIGZpbmFsIFNldDxNZW1iZXI+IF90ZWFyT2ZmVGFrZW4gPSBuZXcgU2V0PE1lbWJlcj4oKTsKICBmaW5hbCBTZXQ8TWVtYmVyPiBfbWV0aG9kc0FuZFNldHRlcnNDYWxsZWREeW5hbWljYWxseSA9IG5ldyBTZXQ8TWVtYmVyPigpOwogIGZpbmFsIFNldDxNZW1iZXI+IF9nZXR0ZXJzQ2FsbGVkRHluYW1pY2FsbHkgPSBuZXcgU2V0PE1lbWJlcj4oKTsKICBmaW5hbCBTZXQ8TWVtYmVyPiBfY2FsbGVkVmlhSW50ZXJmYWNlU2VsZWN0b3IgPSBuZXcgU2V0PE1lbWJlcj4oKTsKICBmaW5hbCBTZXQ8TWVtYmVyPiBfY2FsbGVkVmlhVGhpcyA9IG5ldyBTZXQ8TWVtYmVyPigpOwoKICBUeXBlRmxvd0FuYWx5c2lzKAogICAgICB0aGlzLnRhcmdldCwKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgICAgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIHRoaXMuX2dlbmVyaWNJbnRlcmZhY2VzSW5mbywKICAgICAgdGhpcy5lbnZpcm9ubWVudCwKICAgICAgdGhpcy5saWJyYXJ5SW5kZXgsCiAgICAgIHtQcmFnbWFBbm5vdGF0aW9uUGFyc2VyIG1hdGNoZXJ9KQogICAgICA6IGFubm90YXRpb25NYXRjaGVyID0KICAgICAgICAgICAgbWF0Y2hlciA/PyBuZXcgQ29uc3RhbnRQcmFnbWFBbm5vdGF0aW9uUGFyc2VyKGNvcmVUeXBlcykgewogICAgbmF0aXZlQ29kZU9yYWNsZSA9IG5ldyBOYXRpdmVDb2RlT3JhY2xlKGxpYnJhcnlJbmRleCwgYW5ub3RhdGlvbk1hdGNoZXIpOwogICAgaGllcmFyY2h5Q2FjaGUgPSBuZXcgX0NsYXNzSGllcmFyY2h5Q2FjaGUoCiAgICAgICAgdGhpcywgaGllcmFyY2h5LCBfZ2VuZXJpY0ludGVyZmFjZXNJbmZvLCBlbnZpcm9ubWVudCk7CiAgICBzdW1tYXJ5Q29sbGVjdG9yID0gbmV3IFN1bW1hcnlDb2xsZWN0b3IodGFyZ2V0LCBlbnZpcm9ubWVudCwgaGllcmFyY2h5LAogICAgICAgIHRoaXMsIGhpZXJhcmNoeUNhY2hlLCBuYXRpdmVDb2RlT3JhY2xlLCBoaWVyYXJjaHlDYWNoZSk7CiAgICBfaW52b2NhdGlvbnNDYWNoZSA9IG5ldyBfSW52b2NhdGlvbnNDYWNoZSh0aGlzKTsKICAgIHdvcmtMaXN0ID0gbmV3IF9Xb3JrTGlzdCh0aGlzKTsKCiAgICBjb21wb25lbnQuYWNjZXB0KG5ldyBQcmFnbWFFbnRyeVBvaW50c1Zpc2l0b3IoCiAgICAgICAgdGhpcywgbmF0aXZlQ29kZU9yYWNsZSwgYW5ub3RhdGlvbk1hdGNoZXIpKTsKICB9CgogIF9JbnZvY2F0aW9uIGdldCBjdXJyZW50SW52b2NhdGlvbiA9PiB3b3JrTGlzdC5jYWxsU3RhY2subGFzdDsKCiAgU3VtbWFyeSBnZXRTdW1tYXJ5KE1lbWJlciBtZW1iZXIpIHsKICAgIHJldHVybiBfc3VtbWFyaWVzW21lbWJlcl0gPz89IHN1bW1hcnlDb2xsZWN0b3IuY3JlYXRlU3VtbWFyeShtZW1iZXIpOwogIH0KCiAgX0ZpZWxkVmFsdWUgZ2V0RmllbGRWYWx1ZShGaWVsZCBmaWVsZCkgewogICAgU3VtbWFyeSBzZXR0ZXJTdW1tYXJ5ID0gbnVsbDsKICAgIGlmIChmaWVsZC5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgIHNldHRlclN1bW1hcnkgPSBzdW1tYXJ5Q29sbGVjdG9yLmNyZWF0ZVN1bW1hcnkoZmllbGQsCiAgICAgICAgICBmaWVsZFN1bW1hcnlUeXBlOiBGaWVsZFN1bW1hcnlUeXBlLmtGaWVsZEd1YXJkKTsKICAgIH0KICAgIHJldHVybiBfZmllbGRWYWx1ZXNbZmllbGRdID8/PQogICAgICAgIG5ldyBfRmllbGRWYWx1ZShmaWVsZCwgc2V0dGVyU3VtbWFyeSwgaGllcmFyY2h5Q2FjaGUpOwogIH0KCiAgdm9pZCBwcm9jZXNzKCkgewogICAgd29ya0xpc3QucHJvY2VzcygpOwogICAgaGllcmFyY2h5Q2FjaGUuc2VhbCgpOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbmFseXNpcyBmb3VuZCB0aGF0IGdpdmVuIG1lbWJlcgogIC8vLyBjb3VsZCBiZSBleGVjdXRlZCAvIGZpZWxkIGNvdWxkIGJlIGFjY2Vzc2VkLgogIGJvb2wgaXNNZW1iZXJVc2VkKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgcmV0dXJuIF9maWVsZFZhbHVlcy5jb250YWluc0tleShtZW1iZXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9zdW1tYXJpZXMuY29udGFpbnNLZXkobWVtYmVyKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5hbHlzaXMgZm91bmQgdGhhdCBpbml0aWFsaXplciBvZiB0aGUgZ2l2ZW4gW2ZpZWxkXQogIC8vLyBjb3VsZCBiZSBleGVjdXRlZC4KICBib29sIGlzRmllbGRJbml0aWFsaXplclVzZWQoRmllbGQgZmllbGQpIHsKICAgIGZpbmFsIGZpZWxkVmFsdWUgPSBfZmllbGRWYWx1ZXNbZmllbGRdOwogICAgaWYgKGZpZWxkVmFsdWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gZmllbGRWYWx1ZS5pc0luaXRpYWxpemVkOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbmFseXNpcyBmb3VuZCB0aGF0IGdldHRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgogIC8vLyBbZmllbGRdIGNvdWxkIGJlIGV4ZWN1dGVkLgogIGJvb2wgaXNGaWVsZEdldHRlclVzZWQoRmllbGQgZmllbGQpIHsKICAgIGZpbmFsIGZpZWxkVmFsdWUgPSBfZmllbGRWYWx1ZXNbZmllbGRdOwogICAgaWYgKGZpZWxkVmFsdWUgIT0gbnVsbCkgewogICAgICByZXR1cm4gZmllbGRWYWx1ZS5pc0dldHRlclVzZWQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuYWx5c2lzIGZvdW5kIHRoYXQgc2V0dGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCiAgLy8vIFtmaWVsZF0gY291bGQgYmUgZXhlY3V0ZWQuCiAgYm9vbCBpc0ZpZWxkU2V0dGVyVXNlZChGaWVsZCBmaWVsZCkgewogICAgZmluYWwgZmllbGRWYWx1ZSA9IF9maWVsZFZhbHVlc1tmaWVsZF07CiAgICBpZiAoZmllbGRWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBmaWVsZFZhbHVlLmlzU2V0dGVyVXNlZDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgaXNDbGFzc0FsbG9jYXRlZChDbGFzcyBjKSA9PiBoaWVyYXJjaHlDYWNoZS5hbGxvY2F0ZWRDbGFzc2VzLmNvbnRhaW5zKGMpOwoKICBDYWxsIGNhbGxTaXRlKFRyZWVOb2RlIG5vZGUpID0+IHN1bW1hcnlDb2xsZWN0b3IuY2FsbFNpdGVzW25vZGVdOwoKICBUeXBlQ2hlY2sgZXhwbGljaXRDYXN0KEFzRXhwcmVzc2lvbiBjYXN0KSA9PgogICAgICBzdW1tYXJ5Q29sbGVjdG9yLmV4cGxpY2l0Q2FzdHNbY2FzdF07CgogIFR5cGUgZmllbGRUeXBlKEZpZWxkIGZpZWxkKSA9PiBfZmllbGRWYWx1ZXNbZmllbGRdPy52YWx1ZTsKCiAgQXJnczxUeXBlPiBhcmd1bWVudFR5cGVzKE1lbWJlciBtZW1iZXIpID0+IF9zdW1tYXJpZXNbbWVtYmVyXT8uYXJndW1lbnRUeXBlczsKCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB1bmNoZWNrZWRQYXJhbWV0ZXJzKE1lbWJlciBtZW1iZXIpID0+CiAgICAgIF9zdW1tYXJpZXNbbWVtYmVyXT8udW5jaGVja2VkUGFyYW1ldGVyczsKCiAgYm9vbCBpc1RlYXJPZmZUYWtlbihNZW1iZXIgbWVtYmVyKSA9PiBfdGVhck9mZlRha2VuLmNvbnRhaW5zKG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZW1iZXIgaXMgY2FsbGVkIG9uIGEgcmVjZWl2ZXIgd2l0aCBzdGF0aWMgdHlwZQogIC8vLyBkeW5hbWljLiBHZXR0ZXJzIGFyZSBub3QgdHJhY2tlZC4gRm9yIGZpZWxkcywgb25seSBzZXR0ZXIgaXMgdHJhY2tlZC4KICBib29sIGlzQ2FsbGVkRHluYW1pY2FsbHkoTWVtYmVyIG1lbWJlcikgPT4KICAgICAgX21ldGhvZHNBbmRTZXR0ZXJzQ2FsbGVkRHluYW1pY2FsbHkuY29udGFpbnMobWVtYmVyKTsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGdldHRlciAob3IgaW1wbGljaXQgZ2V0dGVyIGZvciBmaWVsZCkgaXMgY2FsbGVkCiAgLy8vIG9uIGEgcmVjZWl2ZXIgd2l0aCBzdGF0aWMgdHlwZSBkeW5hbWljLgogIGJvb2wgaXNHZXR0ZXJDYWxsZWREeW5hbWljYWxseShNZW1iZXIgbWVtYmVyKSA9PgogICAgICBfZ2V0dGVyc0NhbGxlZER5bmFtaWNhbGx5LmNvbnRhaW5zKG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZW1iZXIgaXMgY2FsbGVkIHZpYSB0aGlzIGNhbGwuCiAgLy8vIEdldHRlcnMgYXJlIG5vdCB0cmFja2VkLiBGb3IgZmllbGRzLCBvbmx5IHNldHRlciBpcyB0cmFja2VkLgogIGJvb2wgaXNDYWxsZWRWaWFUaGlzKE1lbWJlciBtZW1iZXIpID0+IF9jYWxsZWRWaWFUaGlzLmNvbnRhaW5zKG1lbWJlcik7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZW1iZXIgaXMgY2FsbGVkIHZpYSBub24tdGhpcyBjYWxsLgogIC8vLyBHZXR0ZXJzIGFyZSBub3QgdHJhY2tlZC4gRm9yIGZpZWxkcywgb25seSBzZXR0ZXIgaXMgdHJhY2tlZC4KICBib29sIGlzQ2FsbGVkTm90VmlhVGhpcyhNZW1iZXIgbWVtYmVyKSA9PgogICAgICBfbWV0aG9kc0FuZFNldHRlcnNDYWxsZWREeW5hbWljYWxseS5jb250YWlucyhtZW1iZXIpIHx8CiAgICAgIF9jYWxsZWRWaWFJbnRlcmZhY2VTZWxlY3Rvci5jb250YWlucyhtZW1iZXIpOwoKICAvLy8gLS0tLSBJbXBsZW1lbnRhdGlvbiBvZiBbQ2FsbEhhbmRsZXJdIGludGVyZmFjZS4gLS0tLQoKICBAb3ZlcnJpZGUKICBUeXBlIGFwcGx5Q2FsbChDYWxsIGNhbGxTaXRlLCBTZWxlY3RvciBzZWxlY3RvciwgQXJnczxUeXBlPiBhcmdzLAogICAgICB7Ym9vbCBpc1Jlc3VsdFVzZWQ6IHRydWUsIGJvb2wgcHJvY2Vzc0ltbWVkaWF0ZWx5OiB0cnVlfSkgewogICAgX0ludm9jYXRpb24gaW52b2NhdGlvbiA9IF9pbnZvY2F0aW9uc0NhY2hlLmdldEludm9jYXRpb24oc2VsZWN0b3IsIGFyZ3MpOwoKICAgIC8vIFRlc3QgaWYgdHJhY2luZyBpcyBlbmFibGVkIHRvIGF2b2lkIGV4cGVuc2l2ZSBtZXNzYWdlIGZvcm1hdHRpbmcuCiAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgdHJhY2VQcmludCgiQVBQTFkgJGludm9jYXRpb24iKTsKICAgIH0KCiAgICBpZiAoKGNhbGxTaXRlICE9IG51bGwpICYmIChpbnZvY2F0aW9uIGlzIF9EaXNwYXRjaGFibGVJbnZvY2F0aW9uKSkgewogICAgICBpbnZvY2F0aW9uLmFkZENhbGxTaXRlKGNhbGxTaXRlKTsKICAgIH0KCiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBGaWd1cmUgb3V0IGJldHRlciBzdHJhdGVneSBvZiBwcm9jZXNzaW5nCiAgICAvLyBhbiBpbnZvY2F0aW9uIGlmIGl0cyByZXN1bHQgaXMgbm90IHVzZWQuCiAgICAvLyBFbnF1ZXVlaW5nIHN1Y2ggaW52b2NhdGlvbnMgcmVncmVzc2VzIHRoZSBhbmFseXNpcyB0aW1lIGNvbnNpZGVyYWJseS4KCiAgICBpZiAocHJvY2Vzc0ltbWVkaWF0ZWx5KSB7CiAgICAgIGlmIChpc1Jlc3VsdFVzZWQpIHsKICAgICAgICBpbnZvY2F0aW9uLmFkZERlcGVuZGVudEludm9jYXRpb24oY3VycmVudEludm9jYXRpb24pOwogICAgICB9CgogICAgICByZXR1cm4gd29ya0xpc3QucHJvY2Vzc0ludm9jYXRpb24oaW52b2NhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnR4KCFpc1Jlc3VsdFVzZWQpOwoKICAgICAgaWYgKGludm9jYXRpb24ucmVzdWx0ID09IG51bGwpIHsKICAgICAgICB3b3JrTGlzdC5lbnF1ZXVlSW52b2NhdGlvbihpbnZvY2F0aW9uKTsKICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHR5cGVDaGVja1RyaWdnZXJlZCgpIHsKICAgIGN1cnJlbnRJbnZvY2F0aW9uLnR5cGVDaGVja3NOZWVkZWQgPSB0cnVlOwogIH0KCiAgLy8vIC0tLS0gSW1wbGVtZW50YXRpb24gb2YgW0VudHJ5UG9pbnRzTGlzdGVuZXJdIGludGVyZmFjZS4gLS0tLQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZERpcmVjdEZpZWxkQWNjZXNzKEZpZWxkIGZpZWxkLCBUeXBlIHZhbHVlKSB7CiAgICBmaW5hbCBmaWVsZFZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7CiAgICBpZiAoZmllbGQuaXNTdGF0aWMpIHsKICAgICAgZmllbGRWYWx1ZS5zZXRWYWx1ZSh2YWx1ZSwgdGhpcywgLypyZWNlaXZlcl90eXBlPSovIG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgcmVjZWl2ZXIgPSBuZXcgQ29uZVR5cGUoaGllcmFyY2h5Q2FjaGUuZ2V0VEZDbGFzcyhmaWVsZC5wYXJlbnQpKTsKICAgICAgZmllbGRWYWx1ZS5zZXRWYWx1ZSh2YWx1ZSwgdGhpcywgcmVjZWl2ZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRSYXdDYWxsKFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICBpZiAoa1ByaW50RGVidWcpIHsKICAgICAgZGVidWdQcmludCgiQUREIFJBVyBDQUxMOiAkc2VsZWN0b3IiKTsKICAgIH0KICAgIGFzc2VydHgoc2VsZWN0b3IgaXMhIER5bmFtaWNTZWxlY3Rvcik7IC8vIFRPRE8oYWxleG1hcmtvdikKCiAgICBhcHBseUNhbGwobnVsbCwgc2VsZWN0b3IsIHN1bW1hcnlDb2xsZWN0b3IucmF3QXJndW1lbnRzKHNlbGVjdG9yKSwKICAgICAgICBpc1Jlc3VsdFVzZWQ6IGZhbHNlLCBwcm9jZXNzSW1tZWRpYXRlbHk6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIENvbmNyZXRlVHlwZSBhZGRBbGxvY2F0ZWRDbGFzcyhDbGFzcyBj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LjMyATtDSgE/Qyw+NAE7AQxEQk4BSRcnBgFJKAYBQjBNAR4aPggBNQ0eAScwCAETBgQBDB4vBAFDAQw3LRpBDU4yBgQBDCcXLQY/AUc5BAEMLBctBjAEAQw/LQQBDDIgBAIBMnBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9hbmFseXNpcy5kYXJ0N29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2xpbmtlZF9saXN0LmRhcnQAACBkYXJ0OmNvbGxlY3Rpb24vbGlua2VkX2xpc3QuZGFydFtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9jYWxscy5kYXJ0mzIvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIERlY2xhcmVzIGNsYXNzZXMgd2hpY2ggZGVzY3JpYmUgYSBjYWxsOiBzZWxlY3RvcnMgYW5kIGFyZ3VtZW50cy4KbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMudHlwZV9mbG93LmNhbGxzOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKaW1wb3J0ICd0eXBlcy5kYXJ0JzsKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCmVudW0gQ2FsbEtpbmQgewogIE1ldGhvZCwgLy8geC5mb28oLi4pIG9yIGZvbygpCiAgUHJvcGVydHlHZXQsIC8vIC4uLiB4LmZvbyAuLi4KICBQcm9wZXJ0eVNldCwgLy8geC5mb28gPSAuLi4KICBGaWVsZEluaXRpYWxpemVyLCAvLyBydW4gaW5pdGlhbGl6ZXIgb2YgYSBmaWVsZAogIFNldEZpZWxkSW5Db25zdHJ1Y3RvciwgLy8gZm9vID0gLi4uIGluIGluaXRpYWxpemVyIGxpc3QgaW4gYSBjb25zdHJ1Y3Rvcgp9CgovLy8gW1NlbGVjdG9yXSBlbmNhcHN1bGF0ZXMgdGhlIHdheSBvZiBjYWxsaW5nIChhdCB0aGUgY2FsbCBzaXRlKS4KYWJzdHJhY3QgY2xhc3MgU2VsZWN0b3IgewogIC8vLyBDYWxsIGtpbmQ6IGhvdyBjYWxsIGlzIHBlcmZvcm1lZD8KICBmaW5hbCBDYWxsS2luZCBjYWxsS2luZDsKCiAgU2VsZWN0b3IodGhpcy5jYWxsS2luZCk7CgogIC8vLyBJbnRlcmZhY2Ugb3IgY29uY3JldGUgdGFyZ2V0LCBtYXkgYmUgbnVsbC4KICBNZW1iZXIgZ2V0IG1lbWJlcjsKCiAgLy8vIFNlbGVjdG9yIG5hbWUuCiAgTmFtZSBnZXQgbmFtZSA9PiBtZW1iZXIubmFtZTsKCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gKGNhbGxLaW5kID09IENhbGxLaW5kLlByb3BlcnR5U2V0KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBjYWxsS2luZC5oYXNoQ29kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fCBvdGhlciBpcyBTZWxlY3RvciAmJiBvdGhlci5jYWxsS2luZCA9PSBjYWxsS2luZDsKCiAgLy8vIFN0YXRpYyBhcHByb3hpbWF0aW9uIG9mIERhcnQgcmV0dXJuIHR5cGUuCiAgRGFydFR5cGUgZ2V0IHN0YXRpY1JldHVyblR5cGUgewogICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgc3dpdGNoIChjYWxsS2luZCkgewogICAgICBjYXNlIENhbGxLaW5kLk1ldGhvZDoKICAgICAgICByZXR1cm4gKG1lbWJlciBpcyBQcm9jZWR1cmUpCiAgICAgICAgICAgID8gbWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGUKICAgICAgICAgICAgOiBjb25zdCBCb3R0b21UeXBlKCk7CiAgICAgIGNhc2UgQ2FsbEtpbmQuUHJvcGVydHlHZXQ6CiAgICAgICAgcmV0dXJuIG1lbWJlci5nZXR0ZXJUeXBlOwogICAgICBjYXNlIENhbGxLaW5kLlByb3BlcnR5U2V0OgogICAgICBjYXNlIENhbGxLaW5kLkZpZWxkSW5pdGlhbGl6ZXI6CiAgICAgIGNhc2UgQ2FsbEtpbmQuU2V0RmllbGRJbkNvbnN0cnVjdG9yOgogICAgICAgIHJldHVybiBjb25zdCBCb3R0b21UeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGJvb2wgbWVtYmVyQWdyZWVzVG9DYWxsS2luZChNZW1iZXIgbWVtYmVyKSB7CiAgICBzd2l0Y2ggKGNhbGxLaW5kKSB7CiAgICAgIGNhc2UgQ2FsbEtpbmQuTWV0aG9kOgogICAgICAgIHJldHVybiAoKG1lbWJlciBpcyBQcm9jZWR1cmUpICYmCiAgICAgICAgICAgICAgICAhbWVtYmVyLmlzR2V0dGVyICYmCiAgICAgICAgICAgICAgICAhbWVtYmVyLmlzU2V0dGVyKSB8fAogICAgICAgICAgICAobWVtYmVyIGlzIENvbnN0cnVjdG9yKTsKICAgICAgY2FzZSBDYWxsS2luZC5Qcm9wZXJ0eUdldDoKICAgICAgICByZXR1cm4gKG1lbWJlciBpcyBGaWVsZCkgfHwgKChtZW1iZXIgaXMgUHJvY2VkdXJlKSAmJiBtZW1iZXIuaXNHZXR0ZXIpOwogICAgICBjYXNlIENhbGxLaW5kLlByb3BlcnR5U2V0OgogICAgICAgIHJldHVybiAobWVtYmVyIGlzIEZpZWxkKSB8fCAoKG1lbWJlciBpcyBQcm9jZWR1cmUpICYmIG1lbWJlci5pc1NldHRlcik7CiAgICAgIGNhc2UgQ2FsbEtpbmQuRmllbGRJbml0aWFsaXplcjoKICAgICAgY2FzZSBDYWxsS2luZC5TZXRGaWVsZEluQ29uc3RydWN0b3I6CiAgICAgICAgcmV0dXJuIG1lbWJlciBpcyBGaWVsZDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBnZXQgX2NhbGxLaW5kUHJlZml4IHsKICAgIHN3aXRjaCAoY2FsbEtpbmQpIHsKICAgICAgY2FzZSBDYWxsS2luZC5NZXRob2Q6CiAgICAgICAgcmV0dXJuICcnOwogICAgICBjYXNlIENhbGxLaW5kLlByb3BlcnR5R2V0OgogICAgICAgIHJldHVybiAnZ2V0ICc7CiAgICAgIGNhc2UgQ2FsbEtpbmQuUHJvcGVydHlTZXQ6CiAgICAgIGNhc2UgQ2FsbEtpbmQuU2V0RmllbGRJbkNvbnN0cnVjdG9yOgogICAgICAgIHJldHVybiAnc2V0ICc7CiAgICAgIGNhc2UgQ2FsbEtpbmQuRmllbGRJbml0aWFsaXplcjoKICAgICAgICByZXR1cm4gJ2luaXQgJzsKICAgIH0KICAgIHJldHVybiAnJzsKICB9Cn0KCi8vLyBEaXJlY3QgY2FsbCB0byBbbWVtYmVyXS4KY2xhc3MgRGlyZWN0U2VsZWN0b3IgZXh0ZW5kcyBTZWxlY3RvciB7CiAgZmluYWwgTWVtYmVyIG1lbWJlcjsKCiAgRGlyZWN0U2VsZWN0b3IodGhpcy5tZW1iZXIsIHtDYWxsS2luZCBjYWxsS2luZCA9IENhbGxLaW5kLk1ldGhvZH0pCiAgICAgIDogc3VwZXIoY2FsbEtpbmQpIHsKICAgIGFzc2VydHgoKGNhbGxLaW5kID09IENhbGxLaW5kLk1ldGhvZCkgfHwKICAgICAgICAoY2FsbEtpbmQgPT0gQ2FsbEtpbmQuUHJvcGVydHlHZXQpIHx8CiAgICAgICAgbWVtYmVyQWdyZWVzVG9DYWxsS2luZChtZW1iZXIpKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gKHN1cGVyLmhhc2hDb2RlIF4gbWVtYmVyLmhhc2hDb2RlKSAmIGtIYXNoTWFzazsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICBvdGhlciBpcyBEaXJlY3RTZWxlY3RvciAmJiBzdXBlciA9PSAob3RoZXIpICYmIG90aGVyLm1lbWJlciA9PSBtZW1iZXI7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdkaXJlY3QgJHtfY2FsbEtpbmRQcmVmaXh9WyRtZW1iZXJdJzsKfQoKLy8vIEludGVyZmFjZSBjYWxsIHZpYSBrbm93biBpbnRlcmZhY2UgdGFyZ2V0IFttZW1iZXJdLgpjbGFzcyBJbnRlcmZhY2VTZWxlY3RvciBleHRlbmRzIFNlbGVjdG9yIHsKICBmaW5hbCBNZW1iZXIgbWVtYmVyOwoKICBJbnRlcmZhY2VTZWxlY3Rvcih0aGlzLm1lbWJlciwge0NhbGxLaW5kIGNhbGxLaW5kID0gQ2FsbEtpbmQuTWV0aG9kfSkKICAgICAgOiBzdXBlcihjYWxsS2luZCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gKHN1cGVyLmhhc2hDb2RlIF4gbWVtYmVyLmhhc2hDb2RlICsgMzEpICYga0hhc2hNYXNrOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PgogICAgICBpZGVudGljYWwodGhpcywgb3RoZXIpIHx8CiAgICAgIG90aGVyIGlzIEludGVyZmFjZVNlbGVjdG9yICYmIHN1cGVyID09IChvdGhlcikgJiYgb3RoZXIubWVtYmVyID09IG1lbWJlcjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR7X2NhbGxLaW5kUHJlZml4fVskbWVtYmVyXSc7Cn0KCi8vLyBWaXJ0dWFsIGNhbGwgKHVzaW5nICd0aGlzJyBhcyBhIHJlY2VpdmVyKS4KY2xhc3MgVmlydHVhbFNlbGVjdG9yIGV4dGVuZHMgSW50ZXJmYWNlU2VsZWN0b3IgewogIFZpcnR1YWxTZWxlY3RvcihNZW1iZXIgbWVtYmVyLCB7Q2FsbEtpbmQgY2FsbEtpbmQgPSBDYWxsS2luZC5NZXRob2R9KQogICAgICA6IHN1cGVyKG1lbWJlciwgY2FsbEtpbmQ6IGNhbGxLaW5kKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiAoc3VwZXIuaGFzaENvZGUgKyAzNykgJiBrSGFzaE1hc2s7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwgb3RoZXIgaXMgVmlydHVhbFNlbGVjdG9yICYmIHN1cGVyID09IChvdGhlcik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICd2aXJ0dWFsICR7X2NhbGxLaW5kUHJlZml4fVskbWVtYmVyXSc7Cn0KCi8vLyBEeW5hbWljIGNhbGwuCmNsYXNzIER5bmFtaWNTZWxlY3RvciBleHRlbmRzIFNlbGVjdG9yIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBOYW1lIG5hbWU7CgogIHN0YXRpYyBmaW5hbCBrQ2FsbCA9IG5ldyBEeW5hbWljU2VsZWN0b3IoQ2FsbEtpbmQuTWV0aG9kLCBuZXcgTmFtZSgnY2FsbCcpKTsKCiAgRHluYW1pY1NlbGVjdG9yKENhbGxLaW5kIGNhbGxLaW5kLCB0aGlzLm5hbWUpIDogc3VwZXIoY2FsbEtpbmQpOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IG1lbWJlciA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IChzdXBlci5oYXNoQ29kZSBeIG5hbWUuaGFzaENvZGUgKyAzNykgJiBrSGFzaE1hc2s7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+CiAgICAgIGlkZW50aWNhbCh0aGlzLCBvdGhlcikgfHwKICAgICAgb3RoZXIgaXMgRHluYW1pY1NlbGVjdG9yICYmIHN1cGVyID09IChvdGhlcikgJiYgb3RoZXIubmFtZSA9PSBuYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnZHluYW1pYyAke19jYWxsS2luZFByZWZpeH1bJG5hbWVdJzsKfQoKLy8vIEFyZ3VtZW50cyBwYXNzZWQgdG8gYSBjYWxsLCBpbmNsdWRpbmcgaW1wbGljaXQgcmVjZWl2ZXIgYXJndW1lbnQuCi8vIFRPRE8oYWxleG1hcmtvdik6IHRha2UgdHlwZSBhcmd1bWVudHMgaW50byBhY2NvdW50CmNsYXNzIEFyZ3M8VCBleHRlbmRzIFR5cGVFeHByPiB7CiAgZmluYWwgTGlzdDxUPiB2YWx1ZXM7CiAgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzOwogIGludCBfaGFzaENvZGU7CgogIEFyZ3ModGhpcy52YWx1ZXMsIHt0aGlzLm5hbWVzID0gY29uc3QgPFN0cmluZz5bXX0pIHsKICAgIGFzc2VydHgoaXNTb3J0ZWQobmFtZXMpKTsKICB9CgogIEFyZ3Mud2l0aFJlY2VpdmVyKEFyZ3M8VD4gYXJncywgVCByZWNlaXZlcikKICAgICAgOiB2YWx1ZXMgPSBuZXcgTGlzdC5mcm9tKGFyZ3MudmFsdWVzKSwKICAgICAgICBuYW1lcyA9IGFyZ3MubmFtZXMgewogICAgdmFsdWVzWzBdID0gcmVjZWl2ZXI7CiAgfQoKICBpbnQgZ2V0IHBvc2l0aW9uYWxDb3VudCA9PiB2YWx1ZXMubGVuZ3RoIC0gbmFtZXMubGVuZ3RoOwogIGludCBnZXQgbmFtZWRDb3VudCA9PiBuYW1lcy5sZW5ndGg7CgogIFQgZ2V0IHJlY2VpdmVyID0+IHZhbHVlc1swXTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfaGFzaENvZGUgPz89IF9jb21wdXRlSGFzaENvZGUoKTsKCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICBpbnQgaGFzaCA9IDEyMzE7CiAgICBmb3IgKHZhciB2IGluIHZhbHVlcykgewogICAgICBoYXNoID0gKCgoaGFzaCAqIDMxKSAmIGtIYXNoTWFzaykgKyB2Lmhhc2hDb2RlKSAmIGtIYXNoTWFzazsKICAgIH0KICAgIGZvciAodmFyIG4gaW4gbmFtZXMpIHsKICAgICAgaGFzaCA9ICgoKGhhc2ggKiAzMSkgJiBrSGFzaE1hc2spICsgbi5oYXNoQ29kZSkgJiBrSGFzaE1hc2s7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyBBcmdzPFQ+ICYmCiAgICAgICAgKHRoaXMudmFsdWVzLmxlbmd0aCA9PSBvdGhlci52YWx1ZXMubGVuZ3RoKSAmJgogICAgICAgICh0aGlzLm5hbWVzLmxlbmd0aCA9PSBvdGhlci5uYW1lcy5sZW5ndGgpKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHZhbHVlc1tpXSAhPSBvdGhlci52YWx1ZXNbaV0pIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChuYW1lc1tpXSAhPSBvdGhlci5uYW1lc1tpXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWYud3JpdGUoIigiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25hbENvdW50OyBpKyspIHsKICAgICAgaWYgKGkgIT0gMCkgewogICAgICAgIGJ1Zi53cml0ZSgiLCAiKTsKICAgICAgfQogICAgICBidWYud3JpdGUodmFsdWVzW2ldKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHBvc2l0aW9uYWxDb3VudCArIGkgIT0gMCkgewogICAgICAgIGJ1Zi53cml0ZSgiLCAiKTsKICAgICAgfQogICAgICBidWYud3JpdGUobmFtZXNbaV0pOwogICAgICBidWYud3JpdGUoJzogJyk7CiAgICAgIGJ1Zi53cml0ZSh2YWx1ZXNbcG9zaXRpb25hbENvdW50ICsgaV0pOwogICAgfQogICAgYnVmLndyaXRlKCIpIik7CiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgfQp9CoEFAE5OPAFFLAEeASIBFRUBECAgHjJLAgFDGigbARsBMRUBFSABOwEMKQEMHVEBMCIaIgYYHCUpIiEiISYrIwYRBAEvGBwpJCUlIVAhUCYrIAYSBAEfGBwTIRchKxcmGAYPBAIBHSgXAUUaLS4pBAEMRgEMHSBNAQw9AgE4KxcBSBkBDEsBDB0gUAEMNgIBLzJIKwEMOQEMHU4BDD4CARIpDBMBTwFDAQwdAQxJAQwdIEoBDDwCAUY2IRgcEQE3HgQBLi0dGgQBOyYBHwEMOAEbFRxDBhtDBhEEAQwcLRw3NTAsGAoILyoYCggTBhIEAQwWKxQwFBkIHAYtJhkIGxcuBhQbBAIBL3BhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9jYWxscy5kYXJ0XWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3N1bW1hcnkuZGFydMAATyEvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFR5cGUgZmxvdyBzdW1tYXJ5IG9mIGEgbWVtYmVyLCBmdW5jdGlvbiBvciBpbml0aWFsaXplci4KbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMudHlwZV9mbG93LnN1bW1hcnk7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBTdGF0ZW1lbnQsIFN0YXRlbWVudFZpc2l0b3I7CgppbXBvcnQgJ2NhbGxzLmRhcnQnOwppbXBvcnQgJ3R5cGVzLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgQ2FsbEhhbmRsZXIgewogIFR5cGUgYXBwbHlDYWxsKENhbGwgY2FsbFNpdGUsIFNlbGVjdG9yIHNlbGVjdG9yLCBBcmdzPFR5cGU+IGFyZ3MsCiAgICAgIHtib29sIGlzUmVzdWx0VXNlZH0pOwogIHZvaWQgdHlwZUNoZWNrVHJpZ2dlcmVkKCk7Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBhbGwgc3RhdGVtZW50cyBpbiBhIHN1bW1hcnkuCmFic3RyYWN0IGNsYXNzIFN0YXRlbWVudCBleHRlbmRzIFR5cGVFeHByIHsKICAvLy8gSW5kZXggb2YgdGhpcyBzdGF0ZW1lbnQgaW4gdGhlIFtTdW1tYXJ5XS4KICBpbnQgaW5kZXggPSAtMTsKCiAgQG92ZXJyaWRlCiAgVHlwZSBnZXRDb21wdXRlZFR5cGUoTGlzdDxUeXBlPiB0eXBlcykgewogICAgZmluYWwgdHlwZSA9IHR5cGVzW2luZGV4XTsKICAgIGFzc2VydHgodHlwZSAhPSBudWxsKTsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgU3RyaW5nIGdldCBsYWJlbCA9PiAidCRpbmRleCI7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGxhYmVsOwoKICAvLy8gUHJpbnRzIGJvZHkgb2YgdGhpcyBzdGF0ZW1lbnQuCiAgU3RyaW5nIGR1bXAoKTsKCiAgLy8vIFZpc2l0IHRoaXMgc3RhdGVtZW50IGJ5IGNhbGxpbmcgYSBjb3JyZXNwb25kaW5nIFt2aXNpdG9yXSBtZXRob2QuCiAgdm9pZCBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2aXNpdG9yKTsKCiAgLy8vIEV4ZWN1dGUgdGhpcyBzdGF0ZW1lbnQgYW5kIGNvbXB1dGUgaXRzIHJlc3VsdGluZyB0eXBlLgogIFR5cGUgYXBwbHkoTGlzdDxUeXBlPiBjb21wdXRlZFR5cGVzLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHksCiAgICAgIENhbGxIYW5kbGVyIGNhbGxIYW5kbGVyKTsKfQoKLy8vIFN0YXRlbWVudCB2aXNpdG9yLgpjbGFzcyBTdGF0ZW1lbnRWaXNpdG9yIHsKICB2b2lkIHZpc2l0RGVmYXVsdChUeXBlRXhwciBleHByKSB7fQoKICB2b2lkIHZpc2l0UGFyYW1ldGVyKFBhcmFtZXRlciBleHByKSA9PiB2aXNpdERlZmF1bHQoZXhwcik7CiAgdm9pZCB2aXNpdE5hcnJvdyhOYXJyb3cgZXhwcikgPT4gdmlzaXREZWZhdWx0KGV4cHIpOwogIHZvaWQgdmlzaXRKb2luKEpvaW4gZXhwcikgPT4gdmlzaXREZWZhdWx0KGV4cHIpOwogIHZvaWQgdmlzaXRVc2UoVXNlIGV4cHIpID0+IHZpc2l0RGVmYXVsdChleHByKTsKICB2b2lkIHZpc2l0Q2FsbChDYWxsIGV4cHIpID0+IHZpc2l0RGVmYXVsdChleHByKTsKICB2b2lkIHZpc2l0RXh0cmFjdChFeHRyYWN0IGV4cHIpID0+IHZpc2l0RGVmYXVsdChleHByKTsKICB2b2lkIHZpc2l0Q3JlYXRlQ29uY3JldGVUeXBlKENyZWF0ZUNvbmNyZXRlVHlwZSBleHByKSA9PiB2aXNpdERlZmF1bHQoZXhwcik7CiAgdm9pZCB2aXNpdENyZWF0ZVJ1bnRpbWVUeXBlKENyZWF0ZVJ1bnRpbWVUeXBlIGV4cHIpID0+IHZpc2l0RGVmYXVsdChleHByKTsKICB2b2lkIHZpc2l0VHlwZUNoZWNrKFR5cGVDaGVjayBleHByKSA9PiB2aXNpdERlZmF1bHQoZXhwcik7Cn0KCi8vLyBJbnB1dCBwYXJhbWV0ZXIgb2YgdGhlIHN1bW1hcnkuCmNsYXNzIFBhcmFtZXRlciBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vIFtzdGF0aWNUeXBlXSBpcyBudWxsIGlmIG5vIG5hcnJvd2luZyBzaG91bGQgYmUgcGVyZm9ybWVkLiBUaGlzIGhhcHBlbnMgZm9yCiAgLy8gdHlwZSBwYXJhbWV0ZXJzIGFuZCBmb3IgcGFyYW1ldGVycyB3aG9zZSB0eXBlIGlzIG5hcnJvd2VkIGJ5IGEgW1R5cGVDaGVja10KICAvLyBzdGF0ZW1lbnQuCiAgZmluYWwgVHlwZSBzdGF0aWNUeXBlRm9yTmFycm93aW5nOwoKICBUeXBlIGRlZmF1bHRWYWx1ZTsKICBUeXBlIF9hcmd1bWVudFR5cGUgPSBjb25zdCBFbXB0eVR5cGUoKTsKCiAgUGFyYW1ldGVyKHRoaXMubmFtZSwgdGhpcy5zdGF0aWNUeXBlRm9yTmFycm93aW5nKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBsYWJlbCA9PiAiJSRuYW1lIjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0UGFyYW1ldGVyKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZHVtcCgpIHsKICAgIFN0cmluZyB0ZXh0ID0gIiRsYWJlbCA9IF9QYXJhbWV0ZXIgIyRpbmRleCI7CiAgICBpZiAoc3RhdGljVHlwZUZvck5hcnJvd2luZyAhPSBudWxsKSB7CiAgICAgIHRleHQgKz0gIiBbJHN0YXRpY1R5cGVGb3JOYXJyb3dpbmddIjsKICAgIH0KICAgIHJldHVybiB0ZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBhcHBseShMaXN0PFR5cGU+IGNvbXB1dGVkVHlwZXMsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwKICAgICAgICAgIENhbGxIYW5kbGVyIGNhbGxIYW5kbGVyKSA9PgogICAgICB0aHJvdyAnVW5hYmxlIHRvIGFwcGx5IF9QYXJhbWV0ZXInOwoKICBUeXBlIGdldCBhcmd1bWVudFR5cGUgPT4gX2FyZ3VtZW50VHlwZTsKCiAgdm9pZCBfb2JzZXJ2ZUFyZ3VtZW50VHlwZShUeXBlIGFyZ1R5cGUsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgewogICAgYXNzZXJ0eChhcmdUeXBlLmlzU3BlY2lhbGl6ZWQpOwogICAgX2FyZ3VtZW50VHlwZSA9IF9hcmd1bWVudFR5cGUudW5pb24oYXJnVHlwZSwgdHlwZUhpZXJhcmNoeSk7CiAgICBhc3NlcnR4KF9hcmd1bWVudFR5cGUuaXNTcGVjaWFsaXplZCk7CiAgfQp9CgovLy8gTmFycm93cyBkb3duIFthcmddIHRvIFt0eXBlXS4KY2xhc3MgTmFycm93IGV4dGVuZHMgU3RhdGVtZW50IHsKICBUeXBlRXhwciBhcmc7CiAgVHlwZSB0eXBlOwoKICBOYXJyb3codGhpcy5hcmcsIHRoaXMudHlwZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdE5hcnJvdyh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGR1bXAoKSA9PiAiJGxhYmVsID0gX05hcnJvdyAoJGFyZyB0byAkdHlwZSkiOwoKICBAb3ZlcnJpZGUKICBUeXBlIGFwcGx5KExpc3Q8VHlwZT4gY29tcHV0ZWRUeXBlcywgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LAogICAgICAgICAgQ2FsbEhhbmRsZXIgY2FsbEhhbmRsZXIpID0+CiAgICAgIGFyZy5nZXRDb21wdXRlZFR5cGUoY29tcHV0ZWRUeXBlcykuaW50ZXJzZWN0aW9uKHR5cGUsIHR5cGVIaWVyYXJjaHkpOwp9CgovLy8gSm9pbnMgdmFsdWVzIGZyb20gbXVsdGlwbGUgc291cmNlcy4gSXRzIHR5cGUgaXMgYSB1bmlvbiBvZiBbdmFsdWVzXS4KY2xhc3MgSm9pbiBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgU3RyaW5nIF9uYW1lOwogIGZpbmFsIERhcnRUeXBlIHN0YXRpY1R5cGU7CiAgZmluYWwgTGlzdDxUeXBlRXhwcj4gdmFsdWVzID0gPFR5cGVFeHByPltdOyAvLyBUT0RPKGFsZXhtYXJrb3YpOiBTZXQKCiAgSm9pbih0aGlzLl9uYW1lLCB0aGlzLnN0YXRpY1R5cGUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGxhYmVsID0+IF9uYW1lID8/IHN1cGVyLmxhYmVsOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRKb2luKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZHVtcCgpID0+ICIkbGFiZWwgPSBfSm9pbiBbJHN0YXRpY1R5cGVdICgke3ZhbHVlcy5qb2luKCIsICIpfSkiOwoKICBAb3ZlcnJpZGUKICBUeXBlIGFwcGx5KExpc3Q8VHlwZT4gY29tcHV0ZWRUeXBlcywgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LAogICAgICBDYWxsSGFuZGxlciBjYWxsSGFuZGxlcikgewogICAgVHlwZSB0eXBlID0gbnVsbDsKICAgIGFzc2VydHgodmFsdWVzLmlzTm90RW1wdHkpOwogICAgZm9yICh2YXIgdmFsdWUgaW4gdmFsdWVzKSB7CiAgICAgIGZpbmFsIHZhbHVlVHlwZSA9IHZhbHVlLmdldENvbXB1dGVkVHlwZShjb21wdXRlZFR5cGVzKTsKICAgICAgdHlwZSA9IHR5cGUgIT0gbnVsbCA/IHR5cGUudW5pb24odmFsdWVUeXBlLCB0eXBlSGllcmFyY2h5KSA6IHZhbHVlVHlwZTsKICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KfQoKLy8vIEFydGlmaWNpYWwgdXNlIG9mIFthcmddLiBSZW1vdmVkIGR1cmluZyBzdW1tYXJ5IG5vcm1hbGl6YXRpb24uCmNsYXNzIFVzZSBleHRlbmRzIFN0YXRlbWVudCB7CiAgVHlwZUV4cHIgYXJnOwoKICBVc2UodGhpcy5hcmcpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRVc2UodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBkdW1wKCkgPT4gIiRsYWJlbCA9IF9Vc2UgKCRhcmcpIjsKCiAgQG92ZXJyaWRlCiAgVHlwZSBhcHBseShMaXN0PFR5cGU+IGNvbXB1dGVkVHlwZXMsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwKICAgICAgICAgIENhbGxIYW5kbGVyIGNhbGxIYW5kbGVyKSA9PgogICAgICB0aHJvdyAnVXNlIHN0YXRlbWVudHMgc2hvdWxkIGJlIHJlbW92ZWQgZHVyaW5nIHN1bW1hcnkgbm9ybWFsaXphdGlvbic7Cn0KCi8vLyBDYWxsIHNpdGUuCmNsYXNzIENhbGwgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOwogIGZpbmFsIEFyZ3M8VHlwZUV4cHI+IGFyZ3M7CiAgZmluYWwgVHlwZSBzdGF0aWNSZXN1bHRUeXBlOwoKICBDYWxsKHRoaXMuc2VsZWN0b3IsIHRoaXMuYXJncywgdGhpcy5zdGF0aWNSZXN1bHRUeXBlKSB7CiAgICAvLyBUT0RPKHNqaW5kZWwvdGZhKTogU3VwcG9ydCBpbmZlcnJpbmcgdW5jaGVja2VkIGVudHJ5LXBvaW50cyBmb3IgZHluYW1pYwogICAgLy8gYW5kIGRpcmVjdCBjYWxscyBhcyB3ZWxsLgogICAgaWYgKHNlbGVjdG9yIGlzIER5bmFtaWNTZWxlY3RvciB8fCBzZWxlY3RvciBpcyBEaXJlY3RTZWxlY3RvcikgewogICAgICBzZXRVc2VDaGVja2VkRW50cnkoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENhbGwodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBkdW1wKCkgPT4gIiRsYWJlbCR7aXNSZXN1bHRVc2VkID8gJyonIDogJyd9ID0gX0NhbGwgJHNlbGVjdG9yICRhcmdzIjsKCiAgQG92ZXJyaWRlCiAgVHlwZSBhcHBseShMaXN0PFR5cGU+IGNvbXB1dGVkVHlwZXMsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwKICAgICAgQ2FsbEhhbmRsZXIgY2FsbEhhbmRsZXIpIHsKICAgIGZpbmFsIExpc3Q8VHlwZT4gYXJnVHlwZXMgPSBuZXcgTGlzdDxUeXBlPihhcmdzLnZhbHVlcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBUeXBlIHR5cGUgPSBhcmdzLnZhbHVlc1tpXS5nZXRDb21wdXRlZFR5cGUoY29tcHV0ZWRUeXBlcyk7CiAgICAgIGlmICh0eXBlID09IGNvbnN0IEVtcHR5VHlwZSgpKSB7CiAgICAgICAgZGVidWdQcmludCgiT3B0aW1pemVkIGNhbGwgd2l0aCBlbXB0eSBhcmciKTsKICAgICAgICByZXR1cm4gY29uc3QgRW1wdHlUeXBlKCk7CiAgICAgIH0KICAgICAgYXJnVHlwZXNbaV0gPSB0eXBlOwogICAgfQogICAgc2V0UmVhY2hhYmxlKCk7CiAgICBpZiAoc2VsZWN0b3IgaXMhIERpcmVjdFNlbGVjdG9yKSB7CiAgICAgIF9vYnNlcnZlUmVjZWl2ZXJUeXBlKGFyZ1R5cGVzWzBdLCB0eXBlSGllcmFyY2h5KTsKICAgIH0KICAgIFR5cGUgcmVzdWx0ID0gY2FsbEhhbmRsZXIuYXBwbHlDYWxsKAogICAgICAgIHRoaXMsIHNlbGVjdG9yLCBuZXcgQXJnczxUeXBlPihhcmdUeXBlcywgbmFtZXM6IGFyZ3MubmFtZXMpLAogICAgICAgIGlzUmVzdWx0VXNlZDogaXNSZXN1bHRVc2VkKTsKICAgIGlmIChpc1Jlc3VsdFVzZWQpIHsKICAgICAgaWYgKHN0YXRpY1Jlc3VsdFR5cGUgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5pbnRlcnNlY3Rpb24oc3RhdGljUmVzdWx0VHlwZSwgdHlwZUhpZXJhcmNoeSk7CiAgICAgIH0KICAgICAgcmVzdWx0ID0gcmVzdWx0LnNwZWNpYWxpemUodHlwZUhpZXJhcmNoeSk7CiAgICAgIF9vYnNlcnZlUmVzdWx0VHlwZShyZXN1bHQsIHR5cGVIaWVyYXJjaHkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIC0tLSBJbmZlcnJlZCBjYWxsIHNpdGUgaW5mb3JtYXRpb24uIC0tLQoKICBpbnQgX2ZsYWdzID0gMDsKICBUeXBlIF9yZXN1bHRUeXBlID0gY29uc3QgRW1wdHlUeXBlKCk7CgogIHN0YXRpYyBjb25zdCBpbnQga01vbm9tb3JwaGljID0gKDEgPDwgMCk7CiAgc3RhdGljIGNvbnN0IGludCBrUG9seW1vcnBoaWMgPSAoMSA8PCAxKTsKICBzdGF0aWMgY29uc3QgaW50IGtOdWxsYWJsZVJlY2VpdmVyID0gKDEgPDwgMik7CiAgc3RhdGljIGNvbnN0IGludCBrUmVzdWx0VXNlZCA9ICgxIDw8IDMpOwogIHN0YXRpYyBjb25zdCBpbnQga1JlYWNoYWJsZSA9ICgxIDw8IDQpOwogIHN0YXRpYyBjb25zdCBpbnQga1VzZUNoZWNrZWRFbnRyeSA9ICgxIDw8IDUpOwogIHN0YXRpYyBjb25zdCBpbnQga1JlY2VpdmVyTWF5QmVJbnQgPSAoMSA8PCA2KTsKCiAgTWVtYmVyIF9tb25vbW9ycGhpY1RhcmdldDsKCiAgTWVtYmVyIGdldCBtb25vbW9ycGhpY1RhcmdldCA9PiBfbW9ub21vcnBoaWNUYXJnZXQ7CgogIGJvb2wgZ2V0IGlzTW9ub21vcnBoaWMgPT4gKF9mbGFncyAmIGtNb25vbW9ycGhpYykgIT0gMDsKCiAgYm9vbCBnZXQgaXNQb2x5bW9ycGhpYyA9PiAoX2ZsYWdzICYga1BvbHltb3JwaGljKSAhPSAwOwoKICBib29sIGdldCBpc051bGxhYmxlUmVjZWl2ZXIgPT4gKF9mbGFncyAmIGtOdWxsYWJsZVJlY2VpdmVyKSAhPSAwOwoKICBib29sIGdldCBpc1Jlc3VsdFVzZWQgPT4gKF9mbGFncyAmIGtSZXN1bHRVc2VkKSAhPSAwOwoKICBib29sIGdldCBpc1JlYWNoYWJsZSA9PiAoX2ZsYWdzICYga1JlYWNoYWJsZSkgIT0gMDsKCiAgYm9vbCBnZXQgcmVjZWl2ZXJNYXlCZUludCA9PiAoX2ZsYWdzICYga1JlY2VpdmVyTWF5QmVJbnQpICE9IDA7CgogIGJvb2wgZ2V0IHVzZUNoZWNrZWRFbnRyeSA9PiAoX2ZsYWdzICYga1VzZUNoZWNrZWRFbnRyeSkgIT0gMDsKCiAgVHlwZSBnZXQgcmVzdWx0VHlwZSA9PiBfcmVzdWx0VHlwZTsKCiAgdm9pZCBzZXRVc2VDaGVja2VkRW50cnkoKSB7CiAgICBfZmxhZ3MgfD0ga1VzZUNoZWNrZWRFbnRyeTsKICB9CgogIHZvaWQgc2V0UmVzdWx0VXNlZCgpIHsKICAgIF9mbGFncyB8PSBrUmVzdWx0VXNlZDsKICB9CgogIHZvaWQgc2V0UmVhY2hhYmxlKCkgewogICAgX2ZsYWdzIHw9IGtSZWFjaGFibGU7CiAgfQoKICB2b2lkIHNldFBvbHltb3JwaGljKCkgewogICAgX2ZsYWdzID0gKF9mbGFncyAmIH5rTW9ub21vcnBoaWMpIHwga1BvbHltb3JwaGljOwogICAgX21vbm9tb3JwaGljVGFyZ2V0ID0gbnVsbDsKICB9CgogIHZvaWQgYWRkVGFyZ2V0KE1lbWJlciB0YXJnZXQpIHsKICAgIGlmICghaXNQb2x5bW9ycGhpYykgewogICAgICBpZiAoaXNNb25vbW9ycGhpYykgewogICAgICAgIGlmIChfbW9ub21vcnBoaWNUYXJnZXQgIT0gdGFyZ2V0KSB7CiAgICAgICAgICBzZXRQb2x5bW9ycGhpYygpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfZmxhZ3MgfD0ga01vbm9tb3JwaGljOwogICAgICAgIF9tb25vbW9ycGhpY1RhcmdldCA9IHRhcmdldDsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfb2JzZXJ2ZVJlY2VpdmVyVHlwZShUeXBlIHJlY2VpdmVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpIHsKICAgIGlmIChyZWNlaXZlciBpcyBOdWxsYWJsZVR5cGUpIHsKICAgICAgX2ZsYWdzIHw9IGtOdWxsYWJsZVJlY2VpdmVyOwogICAgfQogICAgZmluYWwgcmVjZWl2ZXJJbnRJbnRlcnNlY3QgPQogICAgICAgIHJlY2VpdmVyLmludGVyc2VjdGlvbih0eXBlSGllcmFyY2h5LmludFR5cGUsIHR5cGVIaWVyYXJjaHkpOwogICAgaWYgKHJlY2VpdmVySW50SW50ZXJzZWN0ICE9IEVtcHR5VHlwZSgpICYmCiAgICAgICAgcmVjZWl2ZXJJbnRJbnRlcnNlY3QgIT0gTnVsbGFibGVUeXBlKEVtcHR5VHlwZSgpKSkgewogICAgICBfZmxhZ3MgfD0ga1JlY2VpdmVyTWF5QmVJbnQ7CiAgICB9CiAgfQoKICB2b2lkIF9vYnNlcnZlUmVzdWx0VHlwZShUeXBlIHJlc3VsdCwgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSB7CiAgICBhc3NlcnR4KHJlc3VsdC5pc1NwZWNpYWxpemVkKTsKICAgIF9yZXN1bHRUeXBlID0gX3Jlc3VsdFR5cGUudW5pb24ocmVzdWx0LCB0eXBlSGllcmFyY2h5KTsKICAgIGFzc2VydHgoX3Jlc3VsdFR5cGUuaXNTcGVjaWFsaXplZCk7CiAgfQp9CgovLyBFeHRyYWN0IGEgdHlwZSBhcmd1bWVudCBmcm9tIGEgQ29uY3JldGVUeXBlICh1c2VkIHRvIGV4dHJhY3QgdHlwZSBhcmd1bWVudHMKLy8gZnJvbSByZWNlaXZlcnMgb2YgbWV0aG9kcykuCmNsYXNzIEV4dHJhY3QgZXh0ZW5kcyBTdGF0ZW1lbnQgewogIFR5cGVFeHByIGFyZzsKCiAgZmluYWwgQ2xhc3MgcmVmZXJlbmNlQ2xhc3M7CiAgZmluYWwgaW50IHBhcmFtSW5kZXg7CgogIEV4dHJhY3QodGhpcy5hcmcsIHRoaXMucmVmZXJlbmNlQ2xhc3MsIHRoaXMucGFyYW1JbmRleCk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEV4dHJhY3QodGhpcyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBkdW1wKCkgPT4gIiRsYWJlbCA9IF9FeHRyYWN0ICgkYXJnWyRyZWZlcmVuY2VDbGFzcy8kcGFyYW1JbmRleF0pIjsKCiAgQG92ZXJyaWRlCiAgVHlwZSBhcHBseShMaXN0PFR5cGU+IGNvbXB1dGVkVHlwZXMsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwKICAgICAgQ2FsbEhhbmRsZXIgY2FsbEhhbmRsZXIpIHsKICAgIFR5cGUgYXJnVHlwZSA9IGFyZy5nZXRDb21wdXRlZFR5cGUoY29tcHV0ZWRUeXBlcyk7CiAgICBUeXBlIGV4dHJhY3RlZFR5cGU7CgogICAgdm9pZCBleHRyYWN0VHlwZShDb25jcmV0ZVR5cGUgYykgewogICAgICBpZiAoYy50eXBlQXJncyA9PSBudWxsKSB7CiAgICAgICAgZXh0cmFjdGVkVHlwZSA9IGNvbnN0IEFueVR5cGUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaW5hbCBpbnRlcmZhY2VPZmZzZXQgPSB0eXBlSGllcmFyY2h5LmdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3IoCiAgICAgICAgICAgIGMuY2xzLmNsYXNzTm9kZSwgcmVmZXJlbmNlQ2xhc3MpOwogICAgICAgIGZpbmFsIGV4dHJhY3QgPSBjLnR5cGVBcmdzW2ludGVyZmFjZU9mZnNldCArIHBhcmFtSW5kZXhdOwogICAgICAgIGFzc2VydHgoZXh0cmFjdCBpcyBBbnlUeXBlIHx8IGV4dHJhY3QgaXMgUnVudGltZVR5cGUpOwogICAgICAgIGlmIChleHRyYWN0ZWRUeXBlID09IG51bGwgfHwgZXh0cmFjdCA9PSBleHRyYWN0ZWRUeXBlKSB7CiAgICAgICAgICBleHRyYWN0ZWRUeXBlID0gZXh0cmFjdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXh0cmFjdGVkVHlwZSA9IGNvbnN0IEFueVR5cGUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKHNqaW5kZWwvdGZhKTogU3VwcG9ydCBtb3JlIHR5cGVzIGhlcmUgaWYgcG9zc2libGUuCiAgICBpZiAoYXJnVHlwZSBpcyBDb25jcmV0ZVR5cGUpIHsKICAgICAgZXh0cmFjdFR5cGUoYXJnVHlwZSk7CiAgICB9IGVsc2UgaWYgKGFyZ1R5cGUgaXMgU2V0VHlwZSkgewogICAgICBhcmdUeXBlLnR5cGVzLmZvckVhY2goZXh0cmFjdFR5cGUpOwogICAgfQoKICAgIHJldHVybiBleHRyYWN0ZWRUeXBlID8/IGNvbnN0IEFueVR5cGUoKTsKICB9Cn0KCi8vIEluc3RhbnRpYXRlIGEgY29uY3JldGUgdHlwZSB3aXRoIHR5cGUgYXJndW1lbnRzLiBGb3IgZXhhbXBsZSwgdXNlZCB0byBmaWxsIGluCi8vICJUID0gaW50IiBpbiAiQzxUPiIgdG8gY3JlYXRlICJDPGludD4iLgovLwovLyBUaGUgdHlwZSBhcmd1bWVudHMgYXJlIGZhY3RvcmVkIGFnYWluc3QgdGhlIGdlbmVyaWMgaW50ZXJmYWNlczsgZm9yIG1vcmUKLy8gZGV0YWlscyBzZWUgJ0NsYXNzSGllcmFyY2h5Q2FjaGUuZmFjdG9yZWRHZW5lcmljSW50ZXJmYWNlc09mJy4KY2xhc3MgQ3JlYXRlQ29uY3JldGVUeXBlIGV4dGVuZHMgU3RhdGVtZW50IHsKICBmaW5hbCBURkNsYXNzIGNsczsKICBmaW5hbCBMaXN0PFR5cGVFeHByPiBmbGF0dGVuZWRUeXBlQXJnczsKCiAgQ3JlYXRlQ29uY3JldGVUeXBlKHRoaXMuY2xzLCB0aGlzLmZsYXR0ZW5lZFR5cGVBcmdzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2aXNpdG9yKSA9PgogICAgICB2aXNpdG9yLnZpc2l0Q3JlYXRlQ29uY3JldGVUeXBlKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZHVtcCgpIHsKICAgIGludCBudW1JbW1lZGlhdGVUeXBlQXJncyA9IGNscy5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgcmV0dXJuICIkbGFiZWwgPSBfQ3JlYXRlQ29uY3JldGVUeXBlICgkY2xzIEAgIgogICAgICAgICIke2ZsYXR0ZW5lZFR5cGVBcmdzLnRha2UobnVtSW1tZWRpYXRlVHlwZUFyZ3MpfSkiOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBhcHBseShMaXN0PFR5cGU+IGNvbXB1dGVkVHlwZXMsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwKICAgICAgQ2FsbEhhbmRsZXIgY2FsbEhhbmRsZXIpIHsKICAgIGJvb2wgaGFzUnVudGltZVR5cGUgPSBmYWxzZTsKICAgIGZpbmFsIHR5cGVzID0gbmV3IExpc3Q8VHlwZT4oZmxhdHRlbmVkVHlwZUFyZ3MubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHsKICAgICAgZmluYWwgY29tcHV0ZWQgPSBmbGF0dGVuZWRUeXBlQXJnc1tpXS5nZXRDb21wdXRlZFR5cGUoY29tcHV0ZWRUeXBlcyk7CiAgICAgIGFzc2VydHgoY29tcHV0ZWQgaXMgUnVudGltZVR5cGUgfHwgY29tcHV0ZWQgaXMgQW55VHlwZSk7CiAgICAgIGlmIChjb21wdXRlZCBpcyBSdW50aW1lVHlwZSkgaGFzUnVudGltZVR5cGUgPSB0cnVlOwogICAgICB0eXBlc1tpXSA9IGNvbXB1dGVkOwogICAgfQogICAgcmV0dXJuIG5ldyBDb25jcmV0ZVR5cGUoY2xzLCBoYXNSdW50aW1lVHlwZSA/IHR5cGVzIDogbnVsbCk7CiAgfQp9CgovLyBTaW1pbGFyIHRvICJDcmVhdGVDb25jcmV0ZVR5cGUiLCBidXQgY3JlYXRlcyBhICJSdW50aW1lVHlwZSIgcmF0aGVyIHRoYW4gYQovLyAiQ29uY3JldGVUeXBlIi4gVW5saWtlIGEgIkNvbmNyZXRlVHlwZSIsIG5vbmUgb2YgdGhlIHR5cGUgYXJndW1lbnRzIGNhbiBiZQovLyBtaXNzaW5nICgiQW55VHlwZSIpLgpjbGFzcyBDcmVhdGVSdW50aW1lVHlwZSBleHRlbmRzIFN0YXRlbWVudCB7CiAgZmluYWwgQ2xhc3Mga2xhc3M7CiAgZmluYWwgTGlzdDxUeXBlRXhwcj4gZmxhdHRlbmVkVHlwZUFyZ3M7CgogIENyZWF0ZVJ1bnRpbWVUeXBlKHRoaXMua2xhc3MsIHRoaXMuZmxhdHRlbmVkVHlwZUFyZ3MpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRDcmVhdGVSdW50aW1lVHlwZSh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGR1bXAoKSA9PiAiJGxhYmVsID0gX0NyZWF0ZVJ1bnRpbWVUeXBlICgka2xhc3MgQCAiCiAgICAgICIke2ZsYXR0ZW5lZFR5cGVBcmdzLnRha2Uoa2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoKX0pIjsKCiAgQG92ZXJyaWRlCiAgVHlwZSBhcHBseShMaXN0PFR5cGU+IGNvbXB1dGVkVHlwZXMsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwKICAgICAgQ2FsbEhhbmRsZXIgY2FsbEhhbmRsZXIpIHsKICAgIGZpbmFsIHR5cGVzID0gbmV3IExpc3Q8UnVudGltZVR5cGU+KGZsYXR0ZW5lZFR5cGVBcmdzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGZpbmFsIGNvbXB1dGVkID0gZmxhdHRlbmVkVHlwZUFyZ3NbaV0uZ2V0Q29tcHV0ZWRUeXBlKGNvbXB1dGVkVHlwZXMpOwogICAgICBhc3NlcnR4KGNvbXB1dGVkIGlzIFJ1bnRpbWVUeXBlIHx8IGNvbXB1dGVkIGlzIEFueVR5cGUpOwogICAgICBpZiAoY29tcHV0ZWQgaXMgQW55VHlwZSkgcmV0dXJuIGNvbnN0IEFueVR5cGUoKTsKICAgICAgdHlwZXNbaV0gPSBjb21wdXRlZDsKICAgIH0KICAgIHJldHVybiBuZXcgUnVudGltZVR5cGUobmV3IEludGVyZmFjZVR5cGUoa2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSksIHR5cGVzKTsKICB9Cn0KCi8vIFVzZWQgdG8gc2ltdWxhdGUgYSBydW50aW1lIHR5cGUtY2hlY2ssIHRvIGRldGVybWluZSB3aGVuIGl0IGNhbiBiZSBza2lwcGVkLgovLyBUT0RPKHNqaW5kZWwvdGZhKTogVW5pZnkgd2l0aCBOYXJyb3cuCmNsYXNzIFR5cGVDaGVjayBleHRlbmRzIFN0YXRlbWVudCB7CiAgVHlwZUV4cHIgYXJnOwogIFR5cGVFeHByIHR5cGU7CgogIC8vIFRoZSBLZXJuZWwgd2hpY2ggdGhpcyBUeXBlQ2hlY2sgY29ycmVzcG9uZHMgdG8uIENhbiBiZSBhCiAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiwgQXNFeHByZXNzaW9uIG9yIEZpZWxkLgogIC8vCiAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBpcyB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZS1jaGVja3MuCiAgLy8gRmllbGQgaXMgdXNlZCBmb3IgdHlwZS1jaGVja3Mgb2YgcGFyYW1ldGVycyB0byBpbXBsaWNpdCBzZXR0ZXJzLgogIGZpbmFsIFRyZWVOb2RlIG5vZGU7CgogIGZpbmFsIFR5cGUgc3RhdGljVHlwZTsKCiAgLy8gJ2lzVGVzdGVkT25seU9uQ2hlY2tlZEVudHJ5UG9pbnQnIGlzIHdoZXRoZXIgb3Igbm90IHRoaXMgcGFyYW1ldGVyJ3MgdHlwZS1jaGVjayB3aWxsCiAgLy8gb2NjdXIgb24gdGhlICJjaGVja2VkIiBlbnRyeXBvaW50IGluIHRoZSBWTSBidXQgd2lsbCBiZSBza2lwcGVkIG9uCiAgLy8gInVuY2hlY2tlZCIgZW50cnlwb2ludC4KICBib29sIGlzVGVzdGVkT25seU9uQ2hlY2tlZEVudHJ5UG9pbnQ7CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0IHBhcmFtZXRlciA9PgogICAgICBub2RlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb24gPyBub2RlIDogbnVsbDsKCiAgYm9vbCBjYW5BbHdheXNTa2lwID0gdHJ1ZTsKCiAgVHlwZUNoZWNrKHRoaXMuYXJnLCB0aGlzLnR5cGUsIHRoaXMubm9kZSwgdGhpcy5zdGF0aWNUeXBlKSB7CiAgICBhc3NlcnR4KG5vZGUgIT0gbnVsbCk7CiAgICBpc1Rlc3RlZE9ubHlPbkNoZWNrZWRFbnRyeVBvaW50ID0KICAgICAgICBwYXJhbWV0ZXIgIT0gbnVsbCAmJiAhcGFyYW1ldGVyLmlzQ292YXJpYW50OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0VHlwZUNoZWNrKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZHVtcCgpIHsKICAgIFN0cmluZyByZXN1bHQgPSAiJGxhYmVsID0gX1R5cGVDaGVjayAoJGFyZyBhZ2FpbnN0ICR0eXBlKSI7CiAgICByZXN1bHQgKz0gIiAoZm9yICR7bm9kZX0pIjsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlIGFwcGx5KExpc3Q8VHlwZT4gY29tcHV0ZWRUeXBlcywgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LAogICAgICBDYWxsSGFuZGxlciBjYWxsSGFuZGxlcikgewogICAgVHlwZSBhcmdUeXBlID0gYXJnLmdldENvbXB1dGVkVHlwZShjb21wdXRlZFR5cGVzKTsKICAgIFR5cGUgY2hlY2tUeXBlID0gdHlwZS5nZXRDb21wdXRlZFR5cGUoY29tcHV0ZWRUeXBlcyk7CiAgICAvLyBUT0RPKHNqaW5kZWwvdGZhKTogTmFycm93IHRoZSByZXN1bHQgaWYgcG9zc2libGUuCiAgICBhc3NlcnR4KGNoZWNrVHlwZSBpcyBBbnlUeXBlIHx8IGNoZWNrVHlwZSBpcyBSdW50aW1lVHlwZSk7CgogICAgYm9vbCBjYW5Ta2lwID0gdHJ1ZTsgLy8gQ2FuIHRoaXMgY2hlY2sgYmUgc2tpcHBlZCBvbiB0aGlzIGludm9jYXRpb24uCgogICAgaWYgKGNoZWNrVHlwZSBpcyBBbnlUeXBlKSB7CiAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgUkhTIG9mIHRoZSBjaGVjayBpcyBnb2luZyB0byBiZSwgd2UgY2FuJ3QKICAgICAgLy8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCBwYXNzLgogICAgICBjYW5Ta2lwID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKGNoZWNrVHlwZSBpcyBSdW50aW1lVHlwZSkgewogICAgICBjYW5Ta2lwID0gYXJnVHlwZS5pc1N1YnR5cGVPZlJ1bnRpbWVUeXBlKHR5cGVIaWVyYXJjaHksIGNoZWNrVHlwZSk7CiAgICAgIGFyZ1R5cGUgPSBhcmdUeXBlLmludGVyc2VjdGlvbigKICAgICAgICAgIHR5cGVIaWVyYXJjaHkuZnJvbVN0YXRpY1R5cGUoY2hlY2tUeXBlLnJlcHJlc2VudGVkVHlwZVJhdywgdHJ1ZSksCiAgICAgICAgICB0eXBlSGllcmFyY2h5KTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydHgoZmFsc2UsIGRldGFpbHM6ICJDYW5ub3Qgc2VlICRjaGVja1R5cGUgb24gUkhTIG9mIFR5cGVDaGVjay4iKTsKICAgIH0KCiAgICAvLyBJZiB0aGlzIGNoZWNrIG1pZ2h0IGJlIHNraXBwZWQgb24gYW4KICAgIC8vIHVuY2hlY2tlZCBlbnRyeS1wb2ludCwgd2UgbmVlZCB0byBzaWduYWwgdGhhdCB0aGUgY2FsbC1zaXRlIG11c3QgYmUKICAgIC8vIGNoZWNrZWQuCiAgICBpZiAoIWNhblNraXApIHsKICAgICAgY2FuQWx3YXlzU2tpcCA9IGZhbHNlOwogICAgICBpZiAoaXNUZXN0ZWRPbmx5T25DaGVja2VkRW50cnlQb2ludCkgewogICAgICAgIGNhbGxIYW5kbGVyLnR5cGVDaGVja1RyaWdnZXJlZCgpOwogICAgICB9CiAgICAgIGlmIChrUHJpbnRUcmFjZSkgewogICAgICAgIHRyYWNlUHJpbnQoIlR5cGVDaGVjayBvZiAkYXJnVHlwZSBhZ2FpbnN0ICRjaGVja1R5cGUgZmFpbGVkLiIpOwogICAgICB9CiAgICB9CgogICAgYXJnVHlwZSA9IGFyZ1R5cGUuaW50ZXJzZWN0aW9uKHN0YXRpY1R5cGUsIHR5cGVIaWVyYXJjaHkpOwoKICAgIHJldHVybiBhcmdUeXBlOwogIH0KfQoKLy8vIFN1bW1hcnkgaXMgYSBsaW5lYXIgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyByZXByZXNlbnRpbmcgYSB0eXBlIGZsb3cgaW4KLy8vIG9uZSBtZW1iZXIsIGZ1bmN0aW9uIG9yIGluaXRpYWxpemVyLgpjbGFzcyBTdW1tYXJ5IHsKICBmaW5hbCBpbnQgcGFyYW1ldGVyQ291bnQ7CiAgZmluYWwgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudDsKICBmaW5hbCBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDsKCiAgTGlzdDxTdGF0ZW1lbnQ+IF9zdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICBUeXBlRXhwciByZXN1bHQgPSBudWxsOwoKICBTdW1tYXJ5KAogICAgICB7dGhpcy5wYXJhbWV0ZXJDb3VudDogMCwKICAgICAgdGhpcy5wb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQ6IDAsCiAgICAgIHRoaXMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogMH0pOwoKICBMaXN0PFN0YXRlbWVudD4gZ2V0IHN0YXRlbWVudHMgPT4gX3N0YXRlbWVudHM7CgogIFN0YXRlbWVudCBhZGQoU3RhdGVtZW50IG9wKSB7CiAgICBvcC5pbmRleCA9IF9zdGF0ZW1lbnRzLmxlbmd0aDsKICAgIF9zdGF0ZW1lbnRzLmFkZChvcCk7CiAgICByZXR1cm4gb3A7CiAgfQoKICB2b2lkIHJlc2V0KCkgewogICAgX3N0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIF9zdGF0ZW1lbnRzLm1hcCgob3ApID0+IG9wLmR1bXAoKSkuam9pbigiXG4iKSArCiAgICAgICAgIlxuIiArCiAgICAgICAgIlJFU1VMVDogJHtyZXN1bHR9IjsKICB9CgogIC8vLyBBcHBseSB0aGlzIHN1bW1hcnkgdG8gdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgdHlwZS4KICBUeXBlIGFwcGx5KEFyZ3M8VHlwZT4gYXJndW1lbnRzLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHksCiAgICAgIENhbGxIYW5kbGVyIGNhbGxIYW5kbGVyKSB7CiAgICBmaW5hbCBhcmdzID0gYXJndW1lbnRzLnZhbHVlczsKICAgIGZpbmFsIHBvc2l0aW9uYWxBcmdDb3VudCA9IGFyZ3VtZW50cy5wb3NpdGlvbmFsQ291bnQ7CiAgICBmaW5hbCBuYW1lZEFyZ0NvdW50ID0gYXJndW1lbnRzLm5hbWVkQ291bnQ7CiAgICBhc3NlcnR4KHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPD0gcG9zaXRpb25hbEFyZ0NvdW50KTsKICAgIGFzc2VydHgocG9zaXRpb25hbEFyZ0NvdW50IDw9IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudCk7CiAgICBhc3NlcnR4KG5hbWVkQXJnQ291bnQgPD0gcGFyYW1ldGVyQ291bnQgLSBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQpOwoKICAgIC8vIEludGVycHJldCBzdGF0ZW1lbnRzIHNlcXVlbnRpYWxseSwgY2FsY3VsYXRpbmcgdGhlIHJlc3VsdCB0eXBlCiAgICAvLyBvZiBlYWNoIHN0YXRlbWVudCBhbmQgcHV0dGluZyBpdCBpbnRvIHRoZSAndHlwZXMnIGxpc3QgcGFyYWxsZWwKICAgIC8vIHRvIGBfc3RhdGVtZW50c2AuCiAgICAvLwogICAgLy8gQWZ0ZXIgbm9ybWFsaXphdGlvbiwgc3RhdGVtZW50cyBjYW4gb25seSByZWZlcmVuY2UgcHJlY2VkaW5nIHN0YXRlbWVudHMKICAgIC8vICh0aGV5IGNhbid0IGhhdmUgZm9yd2FyZCByZWZlcmVuY2VzIG9yIGxvb3BzKS4KICAgIC8vCiAgICAvLyBUaGUgZmlyc3QgYHBhcmFtZXRlckNvdW50YCBzdGF0ZW1lbnRzIGFyZSBQYXJhbWV0ZXJzLgoKICAgIExpc3Q8VHlwZT4gdHlwZXMgPSBuZXcgTGlzdDxUeXBlPihfc3RhdGVtZW50cy5sZW5ndGgpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25hbEFyZ0NvdW50OyBpKyspIHsKICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtID0gX3N0YXRlbWVudHNbaV0gYXMgUGFyYW1ldGVyOwogICAgICBpZiAoYXJnc1tpXSBpcyBSdW50aW1lVHlwZSkgewogICAgICAgIHR5cGVzW2ldID0gYXJnc1tpXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmaW5hbCBhcmdUeXBlID0gYXJnc1tpXS5zcGVjaWFsaXplKHR5cGVIaWVyYXJjaHkpOwogICAgICBwYXJhbS5fb2JzZXJ2ZUFyZ3VtZW50VHlwZShhcmdUeXBlLCB0eXBlSGllcmFyY2h5KTsKICAgICAgaWYgKHBhcmFtLnN0YXRpY1R5cGVGb3JOYXJyb3dpbmcgIT0gbnVsbCkgewogICAgICAgIHR5cGVzW2ldID0KICAgICAgICAgICAgYXJnVHlwZS5pbnRlcnNlY3Rpb24ocGFyYW0uc3RhdGljVHlwZUZvck5hcnJvd2luZywgdHlwZUhpZXJhcmNoeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhzamluZGVsL3RmYSk6IE5hcnJvd2luZyBpcyBwZXJmb3JtZWQgaW5zaWRlIGEgW1R5cGVDaGVja10gbGF0ZXIuCiAgICAgICAgdHlwZXNbaV0gPSBhcmdzW2ldOwogICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uYWxBcmdDb3VudDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgIGZpbmFsIFBhcmFtZXRlciBwYXJhbSA9IF9zdGF0ZW1lbnRzW2ldIGFzIFBhcmFtZXRlcjsKICAgICAgZmluYWwgYXJnVHlwZSA9IHBhcmFtLmRlZmF1bHRWYWx1ZS5zcGVjaWFsaXplKHR5cGVIaWVyYXJjaHkpOwogICAgICBwYXJhbS5fb2JzZXJ2ZUFyZ3VtZW50VHlwZShhcmdUeXBlLCB0eXBlSGllcmFyY2h5KTsKICAgICAgdHlwZXNbaV0gPSBhcmdUeXBlOwogICAgfQoKICAgIGZpbmFsIGFyZ05hbWVzID0gYXJndW1lbnRzLm5hbWVzOwogICAgaW50IGFyZ0luZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQ7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgIGZpbmFsIFBhcmFtZXRlciBwYXJhbSA9IF9zdGF0ZW1lbnRzW2ldIGFzIFBhcmFtZXRlcjsKICAgICAgYXNzZXJ0eChwYXJhbS5kZWZhdWx0VmFsdWUgIT0gbnVsbCk7CiAgICAgIGlmICgoYXJnSW5kZXggPCBuYW1lZEFyZ0NvdW50KSAmJiAoYXJnTmFtZXNbYXJnSW5kZXhdID09IHBhcmFtLm5hbWUpKSB7CiAgICAgICAgZmluYWwgYXJnVHlwZSA9CiAgICAgICAgICAgIGFyZ3NbcG9zaXRpb25hbEFyZ0NvdW50ICsgYXJnSW5kZXhdLnNwZWNpYWxpemUodHlwZUhpZXJhcmNoeSk7CiAgICAgICAgYXJnSW5kZXgrKzsKICAgICAgICBwYXJhbS5fb2JzZXJ2ZUFyZ3VtZW50VHlwZShhcmdUeXBlLCB0eXBlSGllcmFyY2h5KTsKICAgICAgICBpZiAocGFyYW0uc3RhdGljVHlwZUZvck5hcnJvd2luZyAhPSBudWxsKSB7CiAgICAgICAgICB0eXBlc1tpXSA9CiAgICAgICAgICAgICAgYXJnVHlwZS5pbnRlcnNlY3Rpb24ocGFyYW0uc3RhdGljVHlwZUZvck5hcnJvd2luZywgdHlwZUhpZXJhcmNoeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHR5cGVzW2ldID0gYXJnVHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0eCgoYXJnSW5kZXggPT0gbmFtZWRBcmdDb3VudCkgfHwKICAgICAgICAgICAgKHBhcmFtLm5hbWUuY29tcGFyZVRvKGFyZ05hbWVzW2FyZ0luZGV4XSkgPCAwKSk7CiAgICAgICAgZmluYWwgYXJnVHlwZSA9IHBhcmFtLmRlZmF1bHRWYWx1ZS5zcGVjaWFsaXplKHR5cGVIaWVyYXJjaHkpOwogICAgICAgIHBhcmFtLl9vYnNlcnZlQXJndW1lbnRUeXBlKGFyZ1R5cGUsIHR5cGVIaWVyYXJjaHkpOwogICAgICAgIHR5cGVzW2ldID0gYXJnVHlwZTsKICAgICAgfQogICAgfQogICAgYXNzZXJ0eChhcmdJbmRleCA9PSBuYW1lZEFyZ0NvdW50KTsKCiAgICBmb3IgKGludCBpID0gcGFyYW1ldGVyQ291bnQ7IGkgPCBfc3RhdGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAvLyBUZXN0IGlmIHRyYWNpbmcgaXMgZW5hYmxlZCB0byBhdm9pZCBleHBlbnNpdmUgbWVzc2FnZSBmb3JtYXR0aW5nLgogICAgICBpZiAoa1ByaW50VHJhY2UpIHsKICAgICAgICB0cmFjZVByaW50KCJFVkFMICR7X3N0YXRlbWVudHNbaV0uZHVtcCgpfSIpOwogICAgICB9CiAgICAgIHR5cGVzW2ldID0gX3N0YXRlbWVudHNbaV0uYXBwbHkodHlwZXMsIHR5cGVIaWVyYXJjaHksIGNhbGxIYW5kbGVyKTsKICAgICAgaWYgKGtQcmludFRyYWNlKSB7CiAgICAgICAgdHJhY2VQcmludCgiUkVTVUxUICR7dHlwZXNbaV19Iik7CiAgICAgIH0KICAgIH0KCiAgICBTdGF0aXN0aWNzLnN1bW1hcmllc0FuYWx5emVkKys7CgogICAgcmV0dXJuIHJlc3VsdC5nZXRDb21wdXRlZFR5cGUodHlwZXMpOwogIH0KCiAgQXJnczxUeXBlPiBnZXQgYXJndW1lbnRUeXBlcyB7CiAgICBmaW5hbCBhcmdUeXBlcyA9IG5ldyBMaXN0PFR5cGU+KHBhcmFtZXRlckNvdW50KTsKICAgIGZpbmFsIGFyZ05hbWVzID0KICAgICAgICBuZXcgTGlzdDxTdHJpbmc+KHBhcmFtZXRlckNvdW50IC0gcG9zaXRpb25hbFBhcmFtZXRlckNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBfc3RhdGVtZW50c1tpXSBhcyBQYXJhbWV0ZXI7CiAgICAgIGFyZ1R5cGVzW2ldID0gcGFyYW0uYXJndW1lbnRUeXBlOwogICAgICBpZiAoaSA+PSBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICBhcmdOYW1lc1tpIC0gcG9zaXRpb25hbFBhcmFtZXRlckNvdW50XSA9IHBhcmFtLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgQXJnczxUeXBlPihhcmdUeXBlcywgbmFtZXM6IGFyZ05hbWVzKTsKICB9CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0IHVuY2hlY2tlZFBhcmFtZXRlcnMgewogICAgZmluYWwgcGFyYW1zID0gTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIF9zdGF0ZW1lbnRzKSB7CiAgICAgIGlmIChzdGF0ZW1lbnQgaXMgVHlwZUNoZWNrICYmCiAgICAgICAgICBzdGF0ZW1lbnQuY2FuQWx3YXlzU2tpcCAmJgogICAgICAgICAgc3RhdGVtZW50LnBhcmFtZXRlciAhPSBudWxsKSB7CiAgICAgICAgcGFyYW1zLmFkZChzdGF0ZW1lbnQucGFyYW1ldGVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcmFtczsKICB9Cn0Kgo0ATk48ATwuAR4BQwEVFRUBHUQcHQIBMCwwEgEMKx8bEQQBIQEMHgElEQFIKQE9RCACARcZJgE9NzMxMzlPTT0CASQkFQFQUBAlARUqATUBDCABDEkBDBIxKiwGEQQBDEQmKgEqAUkkQSoEAgEiIRANAR8BDEYBDDcBDEQmTAIBSR8WHUcBJQEMLAEMRAEMSgEMRCEWICA+TgYRBAIBQx4QAREBDEMBDCsBDEQmTQIBDx8bHR8BOk8hRRwGBAEMRAEMTwEMRCFEM0cnNSIIGgYUJzgGKUUlGCZHCDExBhMEAS0BEigBLCwxKyowMQEdATYBOgE6AUQBOAE2AUIBQAEmAR4gBAEZGwQBGBoEARo2HwQBIhobLBwKDyAlCAYEAUokIwYhRS89IwYEAUYjPCgEAgFPHyIQAR4YATsBDEcBDEwBDEQhNxgBJyApD0kuQj9BIxErCggGAT8jHCUqBgEtBAIBUSsDTEItFSoBOAEMKy0BDBJEMzwEAQxEISE8LUw/OhsGQQQCAU5OGCwVKgE5AQxRAQw8QQEMRCFDLUw/NxsGUQQCAU8pJBARAT4xBTxGFwEZAVpIHSgBJzEBHQE/GyY1BAEMSQEMEkAgEwQBDEQhNzo5PwFKASBNJhcrSiZMGg1NBgEsSxAUHS0qCBlICAYBPwEUBAIBSykQHCYkAS8aAQsfKCgBMQEgIxkPBAERIQQBDBY7Dx0EAU9AISM6MDs9SQFGRxkHTzYHPQE7ATM7JBwSCDk6MhNPD1EcCAYBSjtEOhoGASYWRjsrThhLFDw0FVERHgoPLz1GPBwIBigBQEsZNQhKGSoIBgEkASoEASE1FUUvNSgrPQgGNgQBNjAvJCUpKQgGEwQCATFwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvc3VtbWFyeS5kYXJ0ZGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RhYmxlX3NlbGVjdG9yLmRhcnSIcy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vLi4vbWV0YWRhdGEvcHJvY2VkdXJlX2F0dHJpYnV0ZXMuZGFydCc7CgovLyBBc3NpZ25zIGRpc3BhdGNoIHRhYmxlIHNlbGVjdG9yIElEcyB0byBpbnRlcmZhY2UgdGFyZ2V0cy4KLy8gVE9ETyhkYXJ0YnVnLmNvbS80MDE4OCk6IEltcGxlbWVudCBhIG1vcmUgZmluZS1ncmFpbmVkIGFzc2lnbm1lbnQgYmFzZWQgb24KLy8gaGllcmFyY2h5IGNvbm5lY3RlZG5lc3MuCmNsYXNzIFRhYmxlU2VsZWN0b3JBc3NpZ25lciB7CiAgZmluYWwgTWFwPE5hbWUsIGludD4gX21ldGhvZFNlbGVjdG9ySWQgPSB7fTsKICBmaW5hbCBNYXA8TmFtZSwgaW50PiBfZ2V0dGVyU2VsZWN0b3JJZCA9IHt9OwogIGZpbmFsIE1hcDxOYW1lLCBpbnQ+IF9zZXR0ZXJTZWxlY3RvcklkID0ge307CiAgaW50IF9uZXh0U2VsZWN0b3JJZCA9IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YS5rSW52YWxpZFNlbGVjdG9ySWQgKyAxOwoKICBpbnQgX3NlbGVjdG9ySWRGb3JNYXAoTWFwPE5hbWUsIGludD4gbWFwLCBNZW1iZXIgbWVtYmVyKSB7CiAgICByZXR1cm4gbWFwLnB1dElmQWJzZW50KG1lbWJlci5uYW1lLCAoKSA9PiBfbmV4dFNlbGVjdG9ySWQrKyk7CiAgfQoKICBpbnQgbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIHN3aXRjaCAobWVtYmVyLmtpbmQpIHsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgICAgIHJldHVybiBfc2VsZWN0b3JJZEZvck1hcChfbWV0aG9kU2VsZWN0b3JJZCwgbWVtYmVyKTsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgICAgcmV0dXJuIF9zZWxlY3RvcklkRm9yTWFwKF9zZXR0ZXJTZWxlY3RvcklkLCBtZW1iZXIpOwogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgICByZXR1cm4gUHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhLmtJbnZhbGlkU2VsZWN0b3JJZDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgcHJvY2VkdXJlIGtpbmQgJyR7bWVtYmVyLmtpbmR9JyI7CiAgICAgIH0KICAgIH0KICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgcmV0dXJuIF9zZWxlY3RvcklkRm9yTWFwKF9zZXR0ZXJTZWxlY3RvcklkLCBtZW1iZXIpOwogICAgfQogICAgdGhyb3cgIlVuZXhwZWN0ZWQgbWVtYmVyIGtpbmQgJyR7bWVtYmVyLnJ1bnRpbWVUeXBlfSciOwogIH0KCiAgaW50IGdldHRlclNlbGVjdG9ySWQoTWVtYmVyIG1lbWJlcikgewogICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgc3dpdGNoIChtZW1iZXIua2luZCkgewogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgICAgIHJldHVybiBfc2VsZWN0b3JJZEZvck1hcChfZ2V0dGVyU2VsZWN0b3JJZCwgbWVtYmVyKTsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICAgIHJldHVybiBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEua0ludmFsaWRTZWxlY3RvcklkOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwcm9jZWR1cmUga2luZCAnJHttZW1iZXIua2luZH0nIjsKICAgICAgfQogICAgfQogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICByZXR1cm4gX3NlbGVjdG9ySWRGb3JNYXAoX2dldHRlclNlbGVjdG9ySWQsIG1lbWJlcik7CiAgICB9CiAgICB0aHJvdyAiVW5leHBlY3RlZCBtZW1iZXIga2luZCAnJHttZW1iZXIucnVudGltZVR5cGV9JyI7CiAgfQp9Cj4ATk48ASIBMwE9ThweLy8vTAE9QgQBMB8dIyU/Iz8jQRE+CAYbOwY8BAEoHx0jIz8lI0ERPggGGzsGPAQCAThwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdGFibGVfc2VsZWN0b3IuZGFydFtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90eXBlcy5kYXJ0wAB9US8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVjbGFyZXMgdGhlIHR5cGUgc3lzdGVtIHVzZWQgYnkgZ2xvYmFsIHR5cGUgZmxvdyBhbmFseXNpcy4KbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMudHlwZV9mbG93LnR5cGVzOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwoKaW1wb3J0ICd1dGlscy5kYXJ0JzsKCi8vLyBEYXJ0IGNsYXNzIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdHlwZSBmbG93IGFuYWx5c2lzLgovLy8gRm9yIGVhY2ggRGFydCBjbGFzcyB0aGVyZSBpcyBhIHVuaXF1ZSBpbnN0YW5jZSBvZiBbVEZDbGFzc10uCi8vLyBFYWNoIFtURkNsYXNzXSBoYXMgdW5pcXVlIGlkIHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gc29ydCBjbGFzc2VzLgpjbGFzcyBURkNsYXNzIHsKICBmaW5hbCBpbnQgaWQ7CiAgZmluYWwgQ2xhc3MgY2xhc3NOb2RlOwoKICAvLy8gVEZDbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KICAvLy8gSW5zdGVhZCwgW1R5cGVIaWVyYXJjaHkuZ2V0VEZDbGFzc10gc2hvdWxkIGJlIHVzZWQgdG8gb2J0YWluIFtURkNsYXNzXQogIC8vLyBpbnN0YW5jZXMgc3BlY2lmaWMgdG8gZ2l2ZW4gW1R5cGVIaWVyYXJjaHldLgogIFRGQ2xhc3ModGhpcy5pZCwgdGhpcy5jbGFzc05vZGUpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IGlkOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiBpZGVudGljYWwodGhpcywgb3RoZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBjbGFzc05vZGUudG9TdHJpbmcoKTsKfQoKYWJzdHJhY3QgY2xhc3MgR2VuZXJpY0ludGVyZmFjZXNJbmZvIHsKICAvLyBSZXR1cm4gYSB0eXBlIGFyZ3VtZW50cyB2ZWN0b3Igd2hpY2ggY29udGFpbnMgdGhlIGltbWVkaWF0ZSB0eXBlIHBhcmFtZXRlcnMKICAvLyB0byAna2xhc3MnIGFzIHdlbGwgYXMgdGhlIHR5cGUgYXJndW1lbnRzIHRvIGFsbCBnZW5lcmljIHN1cGVydHlwZXMgb2YKICAvLyAna2xhc3MnLCBpbnN0YW50aWF0ZWQgaW4gdGVybXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBvbiAna2xhc3MnLgogIC8vCiAgLy8gVGhlIG9mZnNldCBpbnRvIHRoaXMgdmVjdG9yIGZyb20gd2hpY2ggYSBzcGVjaWZpYyBnZW5lcmljIHN1cGVydHlwZSdzIHR5cGUKICAvLyBhcmd1bWVudHMgY2FuIGJlIGZvdW5kIGlzIGdpdmVuIGJ5ICdnZW5lcmljSW50ZXJmYWNlT2Zmc2V0Rm9yJy4KICBMaXN0PERhcnRUeXBlPiBmbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yKENsYXNzIGtsYXNzKTsKCiAgLy8gUmV0dXJuIHRoZSBvZmZzZXQgaW50byB0aGUgZmxhdHRlbmVkIHR5cGUgYXJndW1lbnRzIHZlY3RvciBmcm9tIHdoaWNoIGEKICAvLyBzcGVjaWZpYyBnZW5lcmljIHN1cGVydHlwZSdzIHR5cGUgYXJndW1lbnRzIGNhbiBiZSBmb3VuZC4gVGhlIGZsYXR0ZW5lZAogIC8vIHR5cGUgYXJndW1lbnRzIHZlY3RvciBpcyBnaXZlbiBieSAnZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0ZvcicuCiAgaW50IGdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3IoQ2xhc3Mga2xhc3MsIENsYXNzIGlmYWNlKTsKCiAgLy8gU2ltaWxhciB0byAnZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0ZvcicsIGJ1dCB3b3JrcyBmb3Igbm9uLWdlbmVyaWMgY2xhc3NlcwogIC8vIHdoaWNoIG1heSBoYXZlIHJlY3Vyc2l2ZSBzdWJzdGl0dXRpb25zLCBlLmcuICdjbGFzcyBudW0gaW1wbGVtZW50cwogIC8vIENvbXBhcmFibGU8bnVtPicuCiAgLy8KICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gZnJlZSB0eXBlIHZhcmlhYmxlcyBpbiB0aGUgcmVzdWx0LCAnUnVudGltZVR5cGUnIGlzCiAgLy8gcmV0dXJuZWQgaW5zdGVhZCBvZiAnRGFydFR5cGUnLgogIExpc3Q8VHlwZT4gZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0Zvck5vbkdlbmVyaWMoQ2xhc3Mga2xhc3MpOwp9CgphYnN0cmFjdCBjbGFzcyBUeXBlc0J1aWxkZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIFR5cGVzQnVpbGRlcih0aGlzLmNvcmVUeXBlcyk7CgogIC8vLyBSZXR1cm4gW1RGQ2xhc3NdIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFtjbGFzc05vZGVdLgogIFRGQ2xhc3MgZ2V0VEZDbGFzcyhDbGFzcyBjbGFzc05vZGUpOwoKICAvLy8gQ3JlYXRlIGEgVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHNldCBvZiBpbnN0YW5jZXMgY29uc3RyYWluZWQgYnkKICAvLy8gRGFydCB0eXBlIGFubm90YXRpb24gW2RhcnRUeXBlXS4KICBUeXBlIGZyb21TdGF0aWNUeXBlKERhcnRUeXBlIHR5cGUsIGJvb2wgaXNOdWxsYWJsZSkgewogICAgVHlwZSByZXN1bHQ7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGZpbmFsIGNscyA9IHR5cGUuY2xhc3NOb2RlOwogICAgICByZXN1bHQgPSAoY2xzID09IGNvcmVUeXBlcy5udWxsQ2xhc3MpCiAgICAgICAgICA/IGNvbnN0IEVtcHR5VHlwZSgpCiAgICAgICAgICA6IG5ldyBDb25lVHlwZShnZXRURkNsYXNzKGNscykpOwogICAgfSBlbHNlIGlmICh0eXBlID09IGNvbnN0IER5bmFtaWNUeXBlKCkgfHwgdHlwZSA9PSBjb25zdCBWb2lkVHlwZSgpKSB7CiAgICAgIHJlc3VsdCA9IGNvbnN0IEFueVR5cGUoKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSBjb25zdCBCb3R0b21UeXBlKCkgfHwgdHlwZSBpcyBOZXZlclR5cGUpIHsKICAgICAgcmVzdWx0ID0gY29uc3QgRW1wdHlUeXBlKCk7CiAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IHN1cHBvcnQgZnVuY3Rpb24gdHlwZXMKICAgICAgcmVzdWx0ID0gY29uc3QgQW55VHlwZSgpOwogICAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGZpbmFsIGJvdW5kID0gdHlwZS5ib3VuZDsKICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyB0eXBlIHBhcmFtZXRlcnMKICAgICAgLy8gbGlrZSAnVCBleHRlbmRzIFQnLiBBcyBvZiB0b2RheSwgZnJvbnQtZW5kIGRvZXNuJ3QgcmVwb3J0IGVycm9ycyBpbiBzdWNoCiAgICAgIC8vIGNhc2VzIHlldC4KICAgICAgaWYgKGJvdW5kIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgcmVzdWx0ID0gY29uc3QgQW55VHlwZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmcm9tU3RhdGljVHlwZShib3VuZCwgaXNOdWxsYWJsZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdVbmV4cGVjdGVkIHR5cGUgJHt0eXBlLnJ1bnRpbWVUeXBlfSAkdHlwZSc7CiAgICB9CiAgICBpZiAoaXNOdWxsYWJsZSkgewogICAgICByZXN1bHQgPSBuZXcgVHlwZS5udWxsYWJsZShyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUeXBlVHJhbnNsYXRvciB7CiAgVHlwZUV4cHIgaW5zdGFudGlhdGVDb25jcmV0ZVR5cGUoQ29uY3JldGVUeXBlIHR5cGUsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmdzKTsKfQoKLy8vIEFic3RyYWN0IGludGVyZmFjZSB0byB0eXBlIGhpZXJhcmNoeSBpbmZvcm1hdGlvbiB1c2VkIGJ5IHR5cGVzLgphYnN0cmFjdCBjbGFzcyBUeXBlSGllcmFyY2h5IGV4dGVuZHMgVHlwZXNCdWlsZGVyCiAgICBpbXBsZW1lbnRzIEdlbmVyaWNJbnRlcmZhY2VzSW5mbyB7CiAgVHlwZUhpZXJhcmNoeShDb3JlVHlwZXMgY29yZVR5cGVzKSA6IHN1cGVyKGNvcmVUeXBlcyk7CgogIC8vLyBUZXN0IGlmIFtzdWJdIGlzIGEgc3VidHlwZSBvZiBbc3VwXS4KICBib29sIGlzU3VidHlwZShDbGFzcyBzdWIsIENsYXNzIHN1cCk7CgogIC8vLyBSZXR1cm4gYSBtb3JlIHNwZWNpZmljIHR5cGUgZm9yIHRoZSB0eXBlIGNvbmUgd2l0aCBbYmFzZV0gcm9vdC4KICAvLy8gTWF5IHJldHVybiBFbXB0eVR5cGUsIEFueVR5cGUsIENvbmNyZXRlVHlwZSBvciBhIFNldFR5cGUuCiAgVHlwZSBzcGVjaWFsaXplVHlwZUNvbmUoVEZDbGFzcyBiYXNlKTsKCiAgVHlwZSBfY2FjaGVkSW50VHlwZTsKICBUeXBlIGdldCBpbnRUeXBlIHsKICAgIHJldHVybiBfY2FjaGVkSW50VHlwZSA/Pz0gZnJvbVN0YXRpY1R5cGUoY29yZVR5cGVzLmludExlZ2FjeVJhd1R5cGUsIHRydWUpOwogIH0KfQoKLy8vIEJhc2UgY2xhc3MgZm9yIHR5cGUgZXhwcmVzc2lvbnMuCi8vLyBUeXBlIGV4cHJlc3Npb24gaXMgZWl0aGVyIGEgW1R5cGVdIG9yIGEgc3RhdGVtZW50IGluIGEgc3VtbWFyeS4KYWJzdHJhY3QgY2xhc3MgVHlwZUV4cHIgewogIGNvbnN0IFR5cGVFeHByKCk7CgogIC8vLyBSZXR1cm5zIGNvbXB1dGVkIHR5cGUgb2YgdGhpcyB0eXBlIGV4cHJlc3Npb24uCiAgLy8vIFt0eXBlc10gaXMgdGhlIGxpc3Qgb2YgdHlwZXMgY29tcHV0ZWQgZm9yIHRoZSBzdGF0ZW1lbnRzIGluIHRoZSBzdW1tYXJ5LgogIFR5cGUgZ2V0Q29tcHV0ZWRUeXBlKExpc3Q8VHlwZT4gdHlwZXMpOwp9CgovLy8gQmFzZSBjbGFzcyBmb3IgdHlwZXMgaW5mZXJyZWQgYnkgdGhlIHR5cGUgZmxvdyBhbmFseXNpcy4KLy8vIFtUeXBlXSBkZXNjcmliZXMgYSBzcGVjaWZpYyBzZXQgb2YgdmFsdWVzIChEYXJ0IGluc3RhbmNlcykgYW5kIGRvZXMgbm90Ci8vLyBkaXJlY3RseSBjb3JyZXNwb25kIHRvIGEgRGFydCB0eXBlLgovLy8gVE9ETyhhbGV4bWFya292KTogY29uc2lkZXIgZGV0YWNoaW5nIFR5cGUgaGllcmFyY2h5IGZyb20gVHlwZUV4cHIvU3RhdGVtZW50LgphYnN0cmFjdCBjbGFzcyBUeXBlIGV4dGVuZHMgVHlwZUV4cHIgewogIGNvbnN0IFR5cGUoKTsKCiAgLy8vIENyZWF0ZSBhIG51bGxhYmxlIHR5cGUgLSB1bmlvbiBvZiBbdF0gYW5kIHRoZSBgbnVsbGAgb2JqZWN0LgogIGZhY3RvcnkgVHlwZS5udWxsYWJsZShUeXBlIHQpID0+IG5ldyBOdWxsYWJsZVR5cGUodCk7CgogIC8vLyBDcmVhdGUgYSB0eXBlIHJlcHJlc2VudGluZyBhcmJpdHJhcnkgbnVsbGFibGUgb2JqZWN0IChgZHluYW1pY2ApLgogIGZhY3RvcnkgVHlwZS5udWxsYWJsZUFueSgpID0+IG5ldyBOdWxsYWJsZVR5cGUoY29uc3QgQW55VHlwZSgpKTsKCiAgQ2xhc3MgZ2V0Q29uY3JldGVDbGFzcyhUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpID0+IG51bGw7CgogIGJvb2wgaXNTdWJ0eXBlT2YoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBDbGFzcyBjbHMpID0+IGZhbHNlOwoKICAvLyBSZXR1cm5zICd0cnVlJyBpZiB0aGlzIHR5cGUgd2lsbCBkZWZpbml0ZWx5IHBhc3MgYSBydW50aW1lIHR5cGUtY2hlY2sKICAvLyBhZ2FpbnN0ICdydW50aW1lVHlwZScuIFJldHVybnMgJ2ZhbHNlJyBpZiB0aGUgdGVzdCBtaWdodCBmYWlsIChlLmcuIGR1ZSB0bwogIC8vIGFuIGFwcHJveGltYXRpb24pLgogIGJvb2wgaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZSgKICAgICAgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSk7CgogIEBvdmVycmlkZQogIFR5cGUgZ2V0Q29tcHV0ZWRUeXBlKExpc3Q8VHlwZT4gdHlwZXMpID0+IHRoaXM7CgogIC8vLyBPcmRlciBvZiBwcmVjZWRlbmNlIGZvciBldmFsdWF0aW9uIG9mIHVuaW9uL2ludGVyc2VjdGlvbi4KICBpbnQgZ2V0IG9yZGVyOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHR5cGUgaXMgZnVsbHkgc3BlY2lhbGl6ZWQuCiAgYm9vbCBnZXQgaXNTcGVjaWFsaXplZCA9PiB0cnVlOwoKICAvLy8gUmV0dXJucyBzcGVjaWFsaXphdGlvbiBvZiB0aGlzIHR5cGUgdXNpbmcgdGhlIGdpdmVuIFtUeXBlSGllcmFyY2h5XS4KICBUeXBlIHNwZWNpYWxpemUoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSA9PiB0aGlzOwoKICAvLy8gQ2FsY3VsYXRlIHVuaW9uIG9mIHRoaXMgYW5kIFtvdGhlcl0gdHlwZXMuCiAgVHlwZSB1bmlvbihUeXBlIG90aGVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpOwoKICAvLy8gQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBvZiB0aGlzIGFuZCBbb3RoZXJdIHR5cGVzLgogIFR5cGUgaW50ZXJzZWN0aW9uKFR5cGUgb3RoZXIsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSk7Cn0KCi8vLyBPcmRlciBvZiBwcmVjZWRlbmNlIGJldHdlZW4gdHlwZXMgZm9yIGV2YWx1YXRpb24gb2YgdW5pb24vaW50ZXJzZWN0aW9uLgplbnVtIFR5cGVPcmRlciB7CiAgUnVudGltZVR5cGUsCiAgRW1wdHksCiAgTnVsbGFibGUsCiAgQW55LAogIFNldCwKICBDb25lLAogIENvbmNyZXRlLAp9CgovLy8gVHlwZSByZXByZXNlbnRpbmcgdGhlIGVtcHR5IHNldCBvZiBpbnN0YW5jZXMuCmNsYXNzIEVtcHR5VHlwZSBleHRlbmRzIFR5cGUgewogIGNvbnN0IEVtcHR5VHlwZSgpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IDk5NzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gKG90aGVyIGlzIEVtcHR5VHlwZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJfVCB7fSI7CgogIEBvdmVycmlkZQogIGludCBnZXQgb3JkZXIgPT4gVHlwZU9yZGVyLkVtcHR5LmluZGV4OwoKICBAb3ZlcnJpZGUKICBUeXBlIHVuaW9uKFR5cGUgb3RoZXIsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgPT4gb3RoZXI7CgogIEBvdmVycmlkZQogIFR5cGUgaW50ZXJzZWN0aW9uKFR5cGUgb3RoZXIsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgPT4gdGhpczsKCiAgYm9vbCBpc1N1YnR5cGVPZlJ1bnRpbWVUeXBlKFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwgUnVudGltZVR5cGUgb3RoZXIpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIE51bGxhYmxlIHR5cGUgcmVwcmVzZW50cyBhIHVuaW9uIG9mIGEgKG5vbi1udWxsYWJsZSkgdHlwZSBhbmQgdGhlIGBudWxsYAovLy8gb2JqZWN0LiBPdGhlciBraW5kcyBvZiB0eXBlcyBkbyBub3QgY29udGFpbiBgbnVsbGAgb2JqZWN0IChldmVuIEFueVR5cGUpLgpjbGFzcyBOdWxsYWJsZVR5cGUgZXh0ZW5kcyBUeXBlIHsKICBmaW5hbCBUeXBlIGJhc2VUeXBlOwoKICBOdWxsYWJsZVR5cGUodGhpcy5iYXNlVHlwZSkgewogICAgYXNzZXJ0eChiYXNlVHlwZSAhPSBudWxsKTsKICAgIGFzc2VydHgoYmFzZVR5cGUgaXMhIE51bGxhYmxlVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IChiYXNlVHlwZS5oYXNoQ29kZSArIDMxKSAmIGtIYXNoTWFzazsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICAob3RoZXIgaXMgTnVsbGFibGVUeXBlKSAmJiAodGhpcy5iYXNlVHlwZSA9PSBvdGhlci5iYXNlVHlwZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICIke2Jhc2VUeXBlfT8iOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwgQ2xhc3MgY2xzKSA9PgogICAgICBiYXNlVHlwZS5pc1N1YnR5cGVPZih0eXBlSGllcmFyY2h5LCBjbHMpOwoKICBib29sIGlzU3VidHlwZU9mUnVudGltZVR5cGUoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBSdW50aW1lVHlwZSBvdGhlcikgPT4KICAgICAgYmFzZVR5cGUuaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZSh0eXBlSGllcmFyY2h5LCBvdGhlcik7CgogIEBvdmVycmlkZQogIGludCBnZXQgb3JkZXIgPT4gVHlwZU9yZGVyLk51bGxhYmxlLmluZGV4OwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NwZWNpYWxpemVkID0+IGJhc2VUeXBlLmlzU3BlY2lhbGl6ZWQ7CgogIEBvdmVycmlkZQogIFR5cGUgc3BlY2lhbGl6ZShUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpID0+IGJhc2VUeXBlLmlzU3BlY2lhbGl6ZWQKICAgICAgPyB0aGlzCiAgICAgIDogbmV3IE51bGxhYmxlVHlwZShiYXNlVHlwZS5zcGVjaWFsaXplKHR5cGVIaWVyYXJjaHkpKTsKCiAgQG92ZXJyaWRlCiAgVHlwZSB1bmlvbihUeXBlIG90aGVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpIHsKICAgIGlmIChvdGhlci5vcmRlciA8IHRoaXMub3JkZXIpIHsKICAgICAgcmV0dXJuIG90aGVyLnVuaW9uKHRoaXMsIHR5cGVIaWVyYXJjaHkpOwogICAgfQogICAgaWYgKG90aGVyIGlzIE51bGxhYmxlVHlwZSkgewogICAgICByZXR1cm4gbmV3IE51bGxhYmxlVHlwZShiYXNlVHlwZS51bmlvbihvdGhlci5iYXNlVHlwZSwgdHlwZUhpZXJhcmNoeSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBOdWxsYWJsZVR5cGUoYmFzZVR5cGUudW5pb24ob3RoZXIsIHR5cGVIaWVyYXJjaHkpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGUgaW50ZXJzZWN0aW9uKFR5cGUgb3RoZXIsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgewogICAgaWYgKG90aGVyLm9yZGVyIDwgdGhpcy5vcmRlcikgewogICAgICByZXR1cm4gb3RoZXIuaW50ZXJzZWN0aW9uKHRoaXMsIHR5cGVIaWVyYXJjaHkpOwogICAgfQogICAgaWYgKG90aGVyIGlzIE51bGxhYmxlVHlwZSkgewogICAgICByZXR1cm4gbmV3IE51bGxhYmxlVHlwZSgKICAgICAgICAgIGJhc2VUeXBlLmludGVyc2VjdGlvbihvdGhlci5iYXNlVHlwZSwgdHlwZUhpZXJhcmNoeSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJhc2VUeXBlLmludGVyc2VjdGlvbihvdGhlciwgdHlwZUhpZXJhcmNoeSk7CiAgICB9CiAgfQp9CgovLy8gVHlwZSByZXByZXNlbnRpbmcgYW55IGluc3RhbmNlIGV4Y2VwdCBgbnVsbGAuCi8vLyBTZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBDb25lVHlwZSBvZiBPYmplY3QsIGJ1dCBtb3JlIGVmZmljaWVudC4KLy8vIENhbiBhbHNvIHJlcHJlc2VudCBhIHNldCBvZiB0eXBlcywgdGhlIHNldCBvZiBhbGwgdHlwZXMuCmNsYXNzIEFueVR5cGUgZXh0ZW5kcyBUeXBlIHsKICBjb25zdCBBbnlUeXBlKCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gOTkxOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSA9PiAob3RoZXIgaXMgQW55VHlwZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJfVCBBTlkiOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG9yZGVyID0+IFR5cGVPcmRlci5BbnkuaW5kZXg7CgogIEBvdmVycmlkZQogIFR5cGUgdW5pb24oVHlwZSBvdGhlciwgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSB7CiAgICBpZiAob3RoZXIub3JkZXIgPCB0aGlzLm9yZGVyKSB7CiAgICAgIHJldHVybiBvdGhlci51bmlvbih0aGlzLCB0eXBlSGllcmFyY2h5KTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBpbnRlcnNlY3Rpb24oVHlwZSBvdGhlciwgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSB7CiAgICBpZiAob3RoZXIub3JkZXIgPCB0aGlzLm9yZGVyKSB7CiAgICAgIHJldHVybiBvdGhlci5pbnRlcnNlY3Rpb24odGhpcywgdHlwZUhpZXJhcmNoeSk7CiAgICB9CiAgICByZXR1cm4gb3RoZXI7CiAgfQoKICBib29sIGlzU3VidHlwZU9mUnVudGltZVR5cGUoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBSdW50aW1lVHlwZSBvdGhlcikgewogICAgZmluYWwgcmhzID0gb3RoZXIuX3R5cGU7CiAgICByZXR1cm4gKHJocyBpcyBEeW5hbWljVHlwZSkgfHwKICAgICAgICAocmhzIGlzIFZvaWRUeXBlKSB8fAogICAgICAgIChyaHMgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICByaHMuY2xhc3NOb2RlID09IHR5cGVIaWVyYXJjaHkuY29yZVR5cGVzLm9iamVjdENsYXNzKTsKICB9Cn0KCi8vLyBTZXRUeXBlIGlzIGEgdW5pb24gb2YgY29uY3JldGUgdHlwZXMgVDEsIFQyLCAuLi4sIFRuLCB3aGVyZSBuID49IDIuCi8vLyBJdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgaW5zdGFuY2VzIHdoaWNoIHR5cGVzIGFyZSBpbiB0aGUge1QxLCBUMiwgLi4uLCBUbn0uCmNsYXNzIFNldFR5cGUgZXh0ZW5kcyBUeXBlIHsKICAvLy8gTGlzdCBvZiBjb25jcmV0ZSB0eXBlcywgc29ydGVkIGJ5IGNsYXNzSWQuCiAgZmluYWwgTGlzdDxDb25jcmV0ZVR5cGU+IHR5cGVzOwogIGludCBfaGFzaENvZGU7CgogIC8vLyBDcmVhdGVzIGEgbmV3IFNldFR5cGUgdXNpbmcgbGlzdCBvZiBjb25jcmV0ZSB0eXBlcyBzb3J0ZWQgYnkgY2xhc3NJZC4KICBTZXRUeXBlKHRoaXMudHlwZXMpIHsKICAgIGFzc2VydHgodHlwZXMubGVuZ3RoID49IDIpOwogICAgYXNzZXJ0eChpc1NvcnRlZCh0eXBlcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfaGFzaENvZGUgPz89IF9jb21wdXRlSGFzaENvZGUoKTsKCiAgaW50IF9jb21wdXRlSGFzaENvZGUoKSB7CiAgICBpbnQgaGFzaCA9IDEyMzc7CiAgICBmb3IgKHZhciB0IGluIHR5cGVzKSB7CiAgICAgIGhhc2ggPSAoKChoYXNoICogMzEpICYga0hhc2hNYXNrKSArIHQuaGFzaENvZGUpICYga0hhc2hNYXNrOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoKG90aGVyIGlzIFNldFR5cGUpICYmICh0eXBlcy5sZW5ndGggPT0gb3RoZXIudHlwZXMubGVuZ3RoKSkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHR5cGVzW2ldICE9IG90aGVyLnR5cGVzW2ldKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIl9UICR7dHlwZXN9IjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGVPZihUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHksIENsYXNzIGNscykgPT4KICAgICAgdHlwZXMuZXZlcnkoKENvbmNyZXRlVHlwZSB0KSA9PiB0LmlzU3VidHlwZU9mKHR5cGVIaWVyYXJjaHksIGNscykpOwoKICBib29sIGlzU3VidHlwZU9mUnVudGltZVR5cGUoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBSdW50aW1lVHlwZSBvdGhlcikgPT4KICAgICAgdHlwZXMuZXZlcnkoKHQpID0+IHQuaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZSh0eXBlSGllcmFyY2h5LCBvdGhlcikpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG9yZGVyID0+IFR5cGVPcmRlci5TZXQuaW5kZXg7CgogIHN0YXRpYyBMaXN0PENvbmNyZXRlVHlwZT4gX3VuaW9uTGlzdHMoCiAgICAgIExpc3Q8Q29uY3JldGVUeXBlPiB0eXBlczEsIExpc3Q8Q29uY3JldGVUeXBlPiB0eXBlczIpIHsKICAgIGludCBpMSA9IDA7CiAgICBpbnQgaTIgPSAwOwogICAgTGlzdDxDb25jcmV0ZVR5cGU+IHR5cGVzID0gPENvbmNyZXRlVHlwZT5bXTsKICAgIHdoaWxlICgoaTEgPCB0eXBlczEubGVuZ3RoKSAmJiAoaTIgPCB0eXBlczIubGVuZ3RoKSkgewogICAgICBmaW5hbCB0MSA9IHR5cGVzMVtpMV07CiAgICAgIGZpbmFsIHQyID0gdHlwZXMyW2kyXTsKICAgICAgZmluYWwgaWQxID0gdDEuY2xzLmlkOwogICAgICBmaW5hbCBpZDIgPSB0Mi5jbHMuaWQ7CiAgICAgIGlmIChpZDEgPCBpZDIpIHsKICAgICAgICB0eXBlcy5hZGQodDEpOwogICAgICAgICsraTE7CiAgICAgIH0gZWxzZSBpZiAoaWQxID4gaWQyKSB7CiAgICAgICAgdHlwZXMuYWRkKHQyKTsKICAgICAgICArK2kyOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0MSA9PSB0MikgewogICAgICAgICAgdHlwZXMuYWRkKHQxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVE9ETyhzamluZGVsL3RmYSk6IE1lcmdlIHRoZSB0eXBlIGFyZ3VtZW50cyB2ZWN0b3JzLgogICAgICAgICAgLy8gKGUuZy4sIE1hcDw/LCBpbnQ+IHZzIE1hcDxTdHJpbmcsIGludD4gY2FuIGJlY29tZSBNYXA8PywgaW50PikKICAgICAgICAgIHR5cGVzLmFkZCh0MS5yYXcpOwogICAgICAgIH0KICAgICAgICArK2kxOwogICAgICAgICsraTI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpMSA8IHR5cGVzMS5sZW5ndGgpIHsKICAgICAgdHlwZXMuYWRkQWxsKHR5cGVzMS5nZXRSYW5nZShpMSwgdHlwZXMxLmxlbmd0aCkpOwogICAgfSBlbHNlIGlmIChpMiA8IHR5cGVzMi5sZW5ndGgpIHsKICAgICAgdHlwZXMuYWRkQWxsKHR5cGVzMi5nZXRSYW5nZShpMiwgdHlwZXMyLmxlbmd0aCkpOwogICAgfQogICAgcmV0dXJuIHR5cGVzOwogIH0KCiAgc3RhdGljIExpc3Q8Q29uY3JldGVUeXBlPiBfaW50ZXJzZWN0TGlzdHMoCiAgICAgIExpc3Q8Q29uY3JldGVUeXBlPiB0eXBlczEsIExpc3Q8Q29uY3JldGVUeXBlPiB0eXBlczIpIHsKICAgIGludCBpMSA9IDA7CiAgICBpbnQgaTIgPSAwOwogICAgTGlzdDxDb25jcmV0ZVR5cGU+IHR5cGVzID0gPENvbmNyZXRlVHlwZT5bXTsKICAgIHdoaWxlICgoaTEgPCB0eXBlczEubGVuZ3RoKSAmJiAoaTIgPCB0eXBlczIubGVuZ3RoKSkgewogICAgICBmaW5hbCB0MSA9IHR5cGVzMVtpMV07CiAgICAgIGZpbmFsIHQyID0gdHlwZXMyW2kyXTsKICAgICAgZmluYWwgaWQxID0gdDEuY2xzLmlkOwogICAgICBmaW5hbCBpZDIgPSB0Mi5jbHMuaWQ7CiAgICAgIGlmIChpZDEgPCBpZDIpIHsKICAgICAgICArK2kxOwogICAgICB9IGVsc2UgaWYgKGlkMSA+IGlkMikgewogICAgICAgICsraTI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHQxLnR5cGVBcmdzID09IG51bGwgJiYKICAgICAgICAgICAgdDEuY29uc3RhbnQgPT0gbnVsbCAmJgogICAgICAgICAgICB0Mi50eXBlQXJncyA9PSBudWxsICYmCiAgICAgICAgICAgIHQyLmNvbnN0YW50ID09IG51bGwpIHsKICAgICAgICAgIHR5cGVzLmFkZCh0MSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZpbmFsIGludGVyc2VjdCA9IHQxLmludGVyc2VjdGlvbih0MiwgbnVsbCk7CiAgICAgICAgICBpZiAoaW50ZXJzZWN0IGlzISBFbXB0eVR5cGUpIHsKICAgICAgICAgICAgdHlwZXMuYWRkKGludGVyc2VjdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICsraTE7CiAgICAgICAgKytpMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSB1bmlvbihUeXBlIG90aGVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpIHsKICAgIGlmIChvdGhlci5vcmRlciA8IHRoaXMub3JkZXIpIHsKICAgICAgcmV0dXJuIG90aGVyLnVuaW9uKHRoaXMsIHR5cGVIaWVyYXJjaHkpOwogICAgfQogICAgaWYgKG90aGVyIGlzIFNldFR5cGUpIHsKICAgICAgcmV0dXJuIG5ldyBTZXRUeXBlKF91bmlvbkxpc3RzKHR5cGVzLCBvdGhlci50eXBlcykpOwogICAgfSBlbHNlIGlmIChvdGhlciBpcyBDb25jcmV0ZVR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGVzLmNvbnRhaW5zKG90aGVyKQogICAgICAgICAgPyB0aGlzCiAgICAgICAgICA6IG5ldyBTZXRUeXBlKF91bmlvbkxpc3RzKHR5cGVzLCA8Q29uY3JldGVUeXBlPltvdGhlcl0pKTsKICAgIH0gZWxzZSBpZiAob3RoZXIgaXMgQ29uZVR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGVIaWVyYXJjaHkKICAgICAgICAgIC5zcGVjaWFsaXplVHlwZUNvbmUob3RoZXIuY2xzKQogICAgICAgICAgLnVuaW9uKHRoaXMsIHR5cGVIaWVyYXJjaHkpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgdHlwZSAkb3RoZXInOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBpbnRlcnNlY3Rpb24oVHlwZSBvdGhlciwgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSB7CiAgICBpZiAob3RoZXIub3JkZXIgPCB0aGlzLm9yZGVyKSB7CiAgICAgIHJldHVybiBvdGhlci5pbnRlcnNlY3Rpb24odGhpcywgdHlwZUhpZXJhcmNoeSk7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgU2V0VHlwZSkgewogICAgICBMaXN0PENvbmNyZXRlVHlwZT4gbGlzdCA9IF9pbnRlcnNlY3RMaXN0cyh0eXBlcywgb3RoZXIudHlwZXMpOwogICAgICBmaW5hbCBzaXplID0gbGlzdC5sZW5ndGg7CiAgICAgIGlmIChzaXplID09IDApIHsKICAgICAgICByZXR1cm4gY29uc3QgRW1wdHlUeXBlKCk7CiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7CiAgICAgICAgcmV0dXJuIGxpc3Quc2luZ2xlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgU2V0VHlwZShsaXN0KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvdGhlciBpcyBDb25jcmV0ZVR5cGUpIHsKICAgICAgZm9yICh2YXIgdHlwZSBpbiB0eXBlcykgewogICAgICAgIGlmICh0eXBlID09IG90aGVyKSByZXR1cm4gb3RoZXI7CiAgICAgICAgaWYgKGlkZW50aWNhbCh0eXBlLmNscywgb3RoZXIuY2xzKSkgewogICAgICAgICAgcmV0dXJuIHR5cGUuaW50ZXJzZWN0aW9uKG90aGVyLCB0eXBlSGllcmFyY2h5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIEVtcHR5VHlwZSgpOwogICAgfSBlbHNlIGlmIChvdGhlciBpcyBDb25lVHlwZSkgewogICAgICByZXR1cm4gdHlwZUhpZXJhcmNoeQogICAgICAgICAgLnNwZWNpYWxpemVUeXBlQ29uZShvdGhlci5jbHMpCiAgICAgICAgICAuaW50ZXJzZWN0aW9uKHRoaXMsIHR5cGVIaWVyYXJjaHkpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgdHlwZSAkb3RoZXInOwogICAgfQogIH0KfQoKLy8vIFR5cGUgcmVwcmVzZW50aW5nIGEgc3VidHlwZSBjb25lLiBJdCBjb250YWlucyBpbnN0YW5jZXMgb2YgYWxsCi8vLyBEYXJ0IHR5cGVzIHdoaWNoIGV4dGVuZCwgbWl4LWluIG9yIGltcGxlbWVudCBjZXJ0YWluIGNsYXNzLgovLy8gVE9ETyhhbGV4bWFya292KTogSW50cm9kdWNlIGNvbmVzIG9mIHR5cGVzIHdoaWNoIGV4dGVuZCBidXQgbm90IGltcGxlbWVudC4KY2xhc3MgQ29uZVR5cGUgZXh0ZW5kcyBUeXBlIHsKICBmaW5hbCBURkNsYXNzIGNsczsKCiAgQ29uZVR5cGUodGhpcy5jbHMpOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXRDb25jcmV0ZUNsYXNzKFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgPT4KICAgICAgdHlwZUhpZXJhcmNoeS5zcGVjaWFsaXplVHlwZUNvbmUoY2xzKS5nZXRDb25jcmV0ZUNsYXNzKHR5cGVIaWVyYXJjaHkpOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwgQ2xhc3MgY2xzKSA9PgogICAgICB0eXBlSGllcmFyY2h5LmlzU3VidHlwZSh0aGlzLmNscy5jbGFzc05vZGUsIGNscyk7CgogIGJvb2wgaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZShUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHksIFJ1bnRpbWVUeXBlIG90aGVyKSB7CiAgICBmaW5hbCByaHMgPSBvdGhlci5fdHlwZTsKICAgIGlmIChyaHMgaXMgRHluYW1pY1R5cGUgfHwgcmhzIGlzIFZvaWRUeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChyaHMgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICByZXR1cm4gY2xzLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5pc0VtcHR5ICYmCiAgICAgICAgICB0eXBlSGllcmFyY2h5LmlzU3VidHlwZShjbHMuY2xhc3NOb2RlLCByaHMuY2xhc3NOb2RlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gKGNscy5pZCArIDM3KSAmIGtIYXNoTWFzazsKCiAgQG92ZXJyaWRlCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4KICAgICAgaWRlbnRpY2FsKHRoaXMsIG90aGVyKSB8fAogICAgICAob3RoZXIgaXMgQ29uZVR5cGUpICYmIGlkZW50aWNhbCh0aGlzLmNscywgb3RoZXIuY2xzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIl9UICgkY2xzKSsiOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG9yZGVyID0+IFR5cGVPcmRlci5Db25lLmluZGV4OwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NwZWNpYWxpemVkID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUeXBlIHNwZWNpYWxpemUoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSA9PgogICAgICB0eXBlSGllcmFyY2h5LnNwZWNpYWxpemVUeXBlQ29uZShjbHMpOwoKICBAb3ZlcnJpZGUKICBUeXBlIHVuaW9uKFR5cGUgb3RoZXIsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgewogICAgaWYgKG90aGVyLm9yZGVyIDwgdGhpcy5vcmRlcikgewogICAgICByZXR1cm4gb3RoZXIudW5pb24odGhpcywgdHlwZUhpZXJhcmNoeSk7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgQ29uZVR5cGUpIHsKICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBpZiAodHlwZUhpZXJhcmNoeS5pc1N1YnR5cGUob3RoZXIuY2xzLmNsYXNzTm9kZSwgdGhpcy5jbHMuY2xhc3NOb2RlKSkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGlmICh0eXBlSGllcmFyY2h5LmlzU3VidHlwZSh0aGlzLmNscy5jbGFzc05vZGUsIG90aGVyLmNscy5jbGFzc05vZGUpKSB7CiAgICAgICAgcmV0dXJuIG90aGVyOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG90aGVyIGlzIENvbmNyZXRlVHlwZSkgewogICAgICBpZiAodHlwZUhpZXJhcmNoeS5pc1N1YnR5cGUob3RoZXIuY2xzLmNsYXNzTm9kZSwgdGhpcy5jbHMuY2xhc3NOb2RlKSkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZUhpZXJhcmNoeS5zcGVjaWFsaXplVHlwZUNvbmUoY2xzKS51bmlvbihvdGhlciwgdHlwZUhpZXJhcmNoeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlIGludGVyc2VjdGlvbihUeXBlIG90aGVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpIHsKICAgIGlmIChvdGhlci5vcmRlciA8IHRoaXMub3JkZXIpIHsKICAgICAgcmV0dXJuIG90aGVyLmludGVyc2VjdGlvbih0aGlzLCB0eXBlSGllcmFyY2h5KTsKICAgIH0KICAgIGlmIChvdGhlciBpcyBDb25lVHlwZSkgewogICAgICBpZiAodGhpcyA9PSBvdGhlcikgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGlmICh0eXBlSGllcmFyY2h5LmlzU3VidHlwZShvdGhlci5jbHMuY2xhc3NOb2RlLCB0aGlzLmNscy5jbGFzc05vZGUpKSB7CiAgICAgICAgcmV0dXJuIG90aGVyOwogICAgICB9CiAgICAgIGlmICh0eXBlSGllcmFyY2h5LmlzU3VidHlwZSh0aGlzLmNscy5jbGFzc05vZGUsIG90aGVyLmNscy5jbGFzc05vZGUpKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAob3RoZXIgaXMgQ29uY3JldGVUeXBlKSB7CiAgICAgIGlmICh0eXBlSGllcmFyY2h5LmlzU3VidHlwZShvdGhlci5jbHMuY2xhc3NOb2RlLCB0aGlzLmNscy5jbGFzc05vZGUpKSB7CiAgICAgICAgcmV0dXJuIG90aGVyOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb25zdCBFbXB0eVR5cGUoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGVIaWVyYXJjaHkKICAgICAgICAuc3BlY2lhbGl6ZVR5cGVDb25lKGNscykKICAgICAgICAuaW50ZXJzZWN0aW9uKG90aGVyLCB0eXBlSGllcmFyY2h5KTsKICB9Cn0KCi8vLyBUeXBlIHJlcHJlc2VudGluZyBhIHNldCBvZiBpbnN0YW5jZXMgb2YgYSBzcGVjaWZpYyBEYXJ0IGNsYXNzIChubyBzdWJ0eXBlcwovLy8gb3IgYG51bGxgIG9iamVjdCkuCmNsYXNzIENvbmNyZXRlVHlwZSBleHRlbmRzIFR5cGUgaW1wbGVtZW50cyBDb21wYXJhYmxlPENvbmNyZXRlVHlwZT4gewogIGZpbmFsIFRGQ2xhc3MgY2xzOwogIGludCBfaGFzaENvZGU7CgogIC8vIE1heSBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyB0eXBlIGFyZ3VtZW50cyBjb25zdHJhaW50cy4gVGhlIHR5cGUgYXJndW1lbnRzCiAgLy8gc2hvdWxkIHJlcHJlc2VudCB0eXBlIHNldHMsIGkuZS4gYEFueVR5cGVgIG9yIGBSdW50aW1lVHlwZWAuIFRoZSB0eXBlCiAgLy8gYXJndW1lbnRzIHZlY3RvciBpcyBmYWN0b3JlZCBhZ2FpbnN0IHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkKICAvLyB0aGUgY2xhc3MgKHNlZSBbVHlwZUhpZXJhcmNoeS5mbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yXSkuCiAgLy8KICAvLyBUaGUgJ3R5cGVBcmdzJyB2ZWN0b3IgaXMgbnVsbCBmb3Igbm9uLWdlbmVyaWMgY2xhc3NlcywgZXZlbiBpZiB0aGV5CiAgLy8gaW1wbGVtZW50IGEgZ2VuZXJpYyBpbnRlcmZhY2UuCiAgLy8KICAvLyAnbnVtSW1tZWRpYXRlVHlwZUFyZ3MnIGlzIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBvZiAndHlwZUFyZ3MnIHdoaWNoCiAgLy8gaG9sZHMgdGhlIHR5cGUgYXJndW1lbnRzIHRvIHRoZSBjbGFzcyBpdHNlbGYuCiAgZmluYWwgaW50IG51bUltbWVkaWF0ZVR5cGVBcmdzOwogIGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3M7CgogIC8vIE1heSBiZSBudWxsIGlmIGNvbnN0YW50IHZhbHVlIGlzIG5vdCBpbmZlcnJlZC4KICBmaW5hbCBDb25zdGFudCBjb25zdGFudDsKCiAgQ29uY3JldGVUeXBlKHRoaXMuY2xzLCBbTGlzdDxUeXBlPiB0eXBlQXJnc18sIHRoaXMuY29uc3RhbnRdKQogICAgICA6IHR5cGVBcmdzID0gdHlwZUFyZ3NfLAogICAgICAgIG51bUltbWVkaWF0ZVR5cGVBcmdzID0KICAgICAgICAgICAgdHlwZUFyZ3NfICE9IG51bGwgPyBjbHMuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA6IDAgewogICAgLy8gVE9ETyhhbGV4bWFya292KTogc3VwcG9ydCBjbG9zdXJlcwogICAgYXNzZXJ0eCghY2xzLmNsYXNzTm9kZS5pc0Fic3RyYWN0KTsKICAgIGFzc2VydHgodHlwZUFyZ3MgPT0gbnVsbCB8fCBjbHMuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpOwogICAgYXNzZXJ0eCh0eXBlQXJncyA9PSBudWxsIHx8IHR5cGVBcmdzLmFueSgodCkgPT4gdCBpcyBSdW50aW1lVHlwZSkpOwogIH0KCiAgQ29uY3JldGVUeXBlIGdldCByYXcgPT4gbmV3IENvbmNyZXRlVHlwZShjbHMsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXRDb25jcmV0ZUNsYXNzKFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgPT4gY2xzLmNsYXNzTm9kZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGVPZihUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHksIENsYXNzIG90aGVyKSA9PgogICAgICB0eXBlSGllcmFyY2h5LmlzU3VidHlwZShjbHMuY2xhc3NOb2RlLCBvdGhlcik7CgogIGJvb2wgaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZSgKICAgICAgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewogICAgZmluYWwgcmhzID0gcnVudGltZVR5cGUuX3R5cGU7CiAgICBpZiAocmhzIGlzIER5bmFtaWNUeXBlIHx8IHJocyBpcyBWb2lkVHlwZSkgcmV0dXJuIHRydWU7CiAgICBpZiAocmhzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgaWYgKHJocy5jbGFzc05vZGUgPT0gdHlwZUhpZXJhcmNoeS5jb3JlVHlwZXMuZnVuY3Rpb25DbGFzcykgewogICAgICAgIC8vIFRPRE8oMzU1NzMpOiAiaW1wbGVtZW50cy9leHRlbmRzIEZ1bmN0aW9uIiBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkgYnkKICAgICAgICAvLyB0aGUgQ0ZFLiBCeSByZXR1cm5pbmcgImZhbHNlIiB3ZSBmb3JjZSBhbiBhcHByb3hpbWF0aW9uIC0tIHRoYXQgYSB0eXBlCiAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCAiRnVuY3Rpb24iIG1pZ2h0IGZhaWwsIHdoYXRldmVyIHRoZSBMSFMgaXMuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBpZiAoIXR5cGVIaWVyYXJjaHkuaXNTdWJ0eXBlKHRoaXMuY2xzLmNsYXNzTm9kZSwgcmhzLmNsYXNzTm9kZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIGlmIChyaHMudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHJocy5jbGFzc05vZGUgPT0gdHlwZUhpZXJhcmNoeS5jb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykgewogICAgICAgIGlmICh0eXBlSGllcmFyY2h5LmlzU3VidHlwZSgKICAgICAgICAgICAgICAgIGNscy5jbGFzc05vZGUsIHR5cGVIaWVyYXJjaHkuY29yZVR5cGVzLmZ1dHVyZUNsYXNzKSB8fAogICAgICAgICAgICBjbHMuY2xhc3NOb2RlID09IHR5cGVIaWVyYXJjaHkuY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIGxocyA9CiAgICAgICAgICAgICAgdHlwZUFyZ3MgPT0gbnVsbCA/IFJ1bnRpbWVUeXBlKER5bmFtaWNUeXBlKCksIG51bGwpIDogdHlwZUFyZ3NbMF07CiAgICAgICAgICByZXR1cm4gbGhzLmlzU3VidHlwZU9mUnVudGltZVR5cGUoCiAgICAgICAgICAgICAgdHlwZUhpZXJhcmNoeSwgcnVudGltZVR5cGUudHlwZUFyZ3NbMF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZSh0eXBlSGllcmFyY2h5LCBydW50aW1lVHlwZS50eXBlQXJnc1swXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBMaXN0PFR5cGU+IHVzYWJsZVR5cGVBcmdzID0gdHlwZUFyZ3M7CiAgICAgIGlmICh1c2FibGVUeXBlQXJncyA9PSBudWxsKSB7CiAgICAgICAgaWYgKGNscy5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgICAgdXNhYmxlVHlwZUFyZ3MgPQogICAgICAgICAgICAgIHR5cGVIaWVyYXJjaHkuZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0Zvck5vbkdlbmVyaWMoY2xzLmNsYXNzTm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZpbmFsIGludGVyZmFjZU9mZnNldCA9CiAgICAgICAgICB0eXBlSGllcmFyY2h5LmdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3IoY2xzLmNsYXNzTm9kZSwgcmhzLmNsYXNzTm9kZSk7CgogICAgICBhc3NlcnR4KHVzYWJsZVR5cGVBcmdzLmxlbmd0aCAtIGludGVyZmFjZU9mZnNldCA+PQogICAgICAgICAgcnVudGltZVR5cGUubnVtSW1tZWRpYXRlVHlwZUFyZ3MpOwoKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lVHlwZS5udW1JbW1lZGlhdGVUeXBlQXJnczsgKytpKSB7CiAgICAgICAgaWYgKHVzYWJsZVR5cGVBcmdzW2kgKyBpbnRlcmZhY2VPZmZzZXRdID09IGNvbnN0IEFueVR5cGUoKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBhc3NlcnR4KHVzYWJsZVR5cGVBcmdzW2kgKyBpbnRlcmZhY2VPZmZzZXRdIGlzIFJ1bnRpbWVUeXBlKTsKICAgICAgICBpZiAoIXVzYWJsZVR5cGVBcmdzW2kgKyBpbnRlcmZhY2VPZmZzZXRdCiAgICAgICAgICAgIC5pc1N1YnR5cGVPZlJ1bnRpbWVUeXBlKHR5cGVIaWVyYXJjaHksIHJ1bnRpbWVUeXBlLnR5cGVBcmdzW2ldKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gX2hhc2hDb2RlID8/PSBfY29tcHV0ZUhhc2hDb2RlKCk7CgogIGludCBfY29tcHV0ZUhhc2hDb2RlKCkgewogICAgaW50IGhhc2ggPSBjbHMuaGFzaENvZGUgXiAweDEyMzQgJiBrSGFzaE1hc2s7CiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFzaCB0aGUgZmlyc3QgdHlwZSBhcmd1bWVudHMgdmVjdG9yLCBzaW5jZSB0aGUgdHlwZQogICAgLy8gYXJndW1lbnRzIG9mIHRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzIGFyZSBpbXBsaWVkIGJ5IGl0LgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JbW1lZGlhdGVUeXBlQXJnczsgKytpKSB7CiAgICAgIGhhc2ggPSAoKChoYXNoICogMzEpICYga0hhc2hNYXNrKSArIHR5cGVBcmdzW2ldLmhhc2hDb2RlKSAmIGtIYXNoTWFzazsKICAgIH0KICAgIGhhc2ggPSAoKGhhc2ggKiAzMSkgJiBrSGFzaE1hc2spICsgY29uc3RhbnQuaGFzaENvZGU7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvdGhlciBpcyBDb25jcmV0ZVR5cGUpIHsKICAgICAgaWYgKCFpZGVudGljYWwodGhpcy5jbHMsIG90aGVyLmNscykgfHwKICAgICAgICAgIHRoaXMubnVtSW1tZWRpYXRlVHlwZUFyZ3MgIT0gb3RoZXIubnVtSW1tZWRpYXRlVHlwZUFyZ3MpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudHlwZUFyZ3MgIT0gbnVsbCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSW1tZWRpYXRlVHlwZUFyZ3M7ICsraSkgewogICAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3NbaV0gIT0gb3RoZXIudHlwZUFyZ3NbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhpcy5jb25zdGFudCAhPSBvdGhlci5jb25zdGFudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIE5vdGUgdGhhdCB0aGlzIG1heSByZXR1cm4gMCBmb3IgY29uY3JldGUgdHlwZXMgd2hpY2ggYXJlIG5vdCBlcXVhbCBpZiB0aGUKICAvLyBkaWZmZXJlbmNlIGlzIG9ubHkgaW4gdHlwZSBhcmd1bWVudHMuCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhDb25jcmV0ZVR5cGUgb3RoZXIpID0+IGNscy5pZC5jb21wYXJlVG8ob3RoZXIuY2xzLmlkKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKHR5cGVBcmdzID09IG51bGwgJiYgY29uc3RhbnQgPT0gbnVsbCkgewogICAgICByZXR1cm4gIl9UICgke2Nsc30pIjsKICAgIH0KICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWYud3JpdGUoIl9UICgke2Nsc30iKTsKICAgIGlmICh0eXBlQXJncyAhPSBudWxsKSB7CiAgICAgIGJ1Zi53cml0ZSgiPCR7dHlwZUFyZ3MudGFrZShudW1JbW1lZGlhdGVUeXBlQXJncykuam9pbignLCAnKX0+Iik7CiAgICB9CiAgICBpZiAoY29uc3RhbnQgIT0gbnVsbCkgewogICAgICBidWYud3JpdGUoIiwgJGNvbnN0YW50Iik7CiAgICB9CiAgICBidWYud3JpdGUoIikiKTsKICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgb3JkZXIgPT4gVHlwZU9yZGVyLkNvbmNyZXRlLmluZGV4OwoKICBAb3ZlcnJpZGUKICBUeXBlIHVuaW9uKFR5cGUgb3RoZXIsIFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgewogICAgaWYgKG90aGVyLm9yZGVyIDwgdGhpcy5vcmRlcikgewogICAgICByZXR1cm4gb3RoZXIudW5pb24odGhpcywgdHlwZUhpZXJhcmNoeSk7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgQ29uY3JldGVUeXBlKSB7CiAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0gZWxzZSBpZiAoIWlkZW50aWNhbCh0aGlzLmNscywgb3RoZXIuY2xzKSkgewogICAgICAgIGZpbmFsIHR5cGVzID0gKHRoaXMuY2xzLmlkIDwgb3RoZXIuY2xzLmlkKQogICAgICAgICAgICA/IDxDb25jcmV0ZVR5cGU+W3RoaXMsIG90aGVyXQogICAgICAgICAgICA6IDxDb25jcmV0ZVR5cGU+W290aGVyLCB0aGlzXTsKICAgICAgICByZXR1cm4gbmV3IFNldFR5cGUodHlwZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydHgodHlwZUFyZ3MgIT0gbnVsbCB8fAogICAgICAgICAgICBjb25zdGFudCAhPSBudWxsIHx8CiAgICAgICAgICAgIG90aGVyLnR5cGVBcmdzICE9IG51bGwgfHwKICAgICAgICAgICAgb3RoZXIuY29uc3RhbnQgIT0gbnVsbCk7CiAgICAgICAgcmV0dXJuIHJhdzsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgdHlwZSAkb3RoZXInOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSBpbnRlcnNlY3Rpb24oVHlwZSBvdGhlciwgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSB7CiAgICBpZiAob3RoZXIub3JkZXIgPCB0aGlzLm9yZGVyKSB7CiAgICAgIHJldHVybiBvdGhlci5pbnRlcnNlY3Rpb24odGhpcywgdHlwZUhpZXJhcmNoeSk7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgQ29uY3JldGVUeXBlKSB7CiAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgaWYgKCFpZGVudGljYWwodGhpcy5jbHMsIG90aGVyLmNscykpIHsKICAgICAgICByZXR1cm4gRW1wdHlUeXBlKCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVBcmdzID09IG51bGwgJiYgY29uc3RhbnQgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBvdGhlcjsKICAgICAgfSBlbHNlIGlmIChvdGhlci50eXBlQXJncyA9PSBudWxsICYmIG90aGVyLmNvbnN0YW50ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQoKICAgICAgTGlzdDxUeXBlPiBtZXJnZWRUeXBlQXJnczsKICAgICAgaWYgKHR5cGVBcmdzID09IG51bGwpIHsKICAgICAgICBtZXJnZWRUeXBlQXJncyA9IG90aGVyLnR5cGVBcmdzOwogICAgICB9IGVsc2UgaWYgKG90aGVyLnR5cGVBcmdzID09IG51bGwpIHsKICAgICAgICBtZXJnZWRUeXBlQXJncyA9IHR5cGVBcmdzOwogICAgICB9IGVsc2UgewogICAgICAgIG1lcmdlZFR5cGVBcmdzID0gbmV3IExpc3Q8VHlwZT4odHlwZUFyZ3MubGVuZ3RoKTsKICAgICAgICBib29sIGhhc1J1bnRpbWVUeXBlID0gZmFsc2U7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJncy5sZW5ndGg7ICsraSkgewogICAgICAgICAgZmluYWwgbWVyZ2VkID0KICAgICAgICAgICAgICB0eXBlQXJnc1tpXS5pbnRlcnNlY3Rpb24ob3RoZXIudHlwZUFyZ3NbaV0sIHR5cGVIaWVyYXJjaHkpOwogICAgICAgICAgaWYgKG1lcmdlZCBpcyBFbXB0eVR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnN0IEVtcHR5VHlwZSgpOwogICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQgaXMgUnVudGltZVR5cGUpIHsKICAgICAgICAgICAgaGFzUnVudGltZVR5cGUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgbWVyZ2VkVHlwZUFyZ3NbaV0gPSBtZXJnZWQ7CiAgICAgICAgfQogICAgICAgIGlmICghaGFzUnVudGltZVR5cGUpIHsKICAgICAgICAgIG1lcmdlZFR5cGVBcmdzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIENvbnN0YW50IG1lcmdlZENvbnN0YW50OwogICAgICBpZiAoY29uc3RhbnQgPT0gbnVsbCkgewogICAgICAgIG1lcmdlZENvbnN0YW50ID0gb3RoZXIuY29uc3RhbnQ7CiAgICAgIH0gZWxzZSBpZiAob3RoZXIuY29uc3RhbnQgPT0gbnVsbCB8fCBjb25zdGFudCA9PSBvdGhlci5jb25zdGFudCkgewogICAgICAgIG1lcmdlZENvbnN0YW50ID0gY29uc3RhbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IEVtcHR5VHlwZSgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgQ29uY3JldGVUeXBlKGNscywgbWVyZ2VkVHlwZUFyZ3MsIG1lcmdlZENvbnN0YW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdVbmV4cGVjdGVkIHR5cGUgJG90aGVyJzsKICAgIH0KICB9Cn0KCi8vIFVubGlrZSB0aGUgb3RoZXIgJ1R5cGUncywgdGhpcyByZXByZXNlbnRzIGEgc2luZ2xlIHR5cGUsIG5vdCBhIHNldCBvZgovLyB2YWx1ZXMuIEl0IGlzIHVzZWQgYXMgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0eXBlLXRlc3RzLgovLwovLyBUaGUgdHlwZSBhcmd1bWVudHMgYXJlIHJlcHJlc2VudGVkIGluIGEgZm9ybSB0aGF0IGlzIGZhY3RvcmVkIGFnYWluc3QgdGhlCi8vIGdlbmVyaWMgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGUgdHlwZSB0byBlbmFibGUgZWZmaWNpZW50IHR5cGUtdGVzdAovLyBhZ2FpbnN0IGl0cyBpbnRlcmZhY2VzLiBTZWUgJ1R5cGVIaWVyYXJjaHkuZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0ZvcicgZm9yCi8vIG1vcmUgZGV0YWlscy4KLy8KLy8gVGhpcyBmYWN0b3JlZCByZXByZXNlbnRhdGlvbiBjYW4gaGF2ZSBjeWNsZXMgZm9yIHNvbWUgdHlwZXM6Ci8vCi8vICAgY2xhc3MgbnVtIGltcGxlbWVudHMgQ29tcGFyYWJsZTxudW0+IHt9Ci8vICAgY2xhc3MgQTxUPiBleHRlbmRzIENvbXBhcmFibGU8QTxUPj4ge30KLy8KLy8gVG8gYXZvaWQgdGhlc2UgY3ljbGVzLCB3ZSBhcHByb3hpbWF0ZSBnZW5lcmljIHN1cGVyLWJvdW5kZWQgdHlwZXMgKHRoZSBzZWNvbmQKLy8gY2FzZSksIHNvIHRoZSByZXByZXNlbnRhdGlvbiBmb3IgJ0E8U3RyaW5nPicgd291bGQgYmUgc2ltcGx5ICdBbnlUeXBlJy4KLy8gSG93ZXZlciwgYXBwcm94aW1hdGluZyBub24tZ2VuZXJpYyB0eXBlcyBsaWtlICdpbnQnIGFuZCAnbnVtJyAodGhlIGZpcnN0Ci8vIGNhc2UpIHdvdWxkIGJlIHRvbyBjb2Fyc2UsIHNvIHdlIGxlYXZlIGFuIG51bGwgJ3R5cGVBcmdzJyBmaWVsZCBmb3IgdGhlc2UKLy8gdHlwZXMuIEFzIGEgcmVzdWx0LCB3aGVuIGRvaW5nIGFuICdpc1N1YnR5cGVPZlJ1bnRpbWVUeXBlJyBhZ2FpbnN0Ci8vIHRoZWlyIGludGVyZmFjZXMgKGUuZy4gJ2ludCcgdnMgJ0NvbXBhcmFibGU8aW50PicpIHdlIGFwcHJveGltYXRlIHRoZSByZXN1bHQKLy8gYXMgJ2ZhbHNlJy4KLy8KLy8gU28sIHRoZSBpbnZhcmlhbnQgYWJvdXQgJ3R5cGVBcmdzJyBpcyB0aGF0IHRoZXkgd2lsbCBiZSAnbnVsbCcgaWZmIHRoZSBjbGFzcwovLyBpcyBub24tZ2VuZXJpYywgYW5kIG5vbi1udWxsICh3aXRoIGF0IGxlYXN0IG9uZSB2ZWN0b3IpIG90aGVyd2lzZS4KY2xhc3MgUnVudGltZVR5cGUgZXh0ZW5kcyBUeXBlIHsKICBmaW5hbCBEYXJ0VHlwZSBfdHlwZTsgLy8gRG9lc24ndCBjb250YWluIHR5cGUgYXJncy4KCiAgZmluYWwgaW50IG51bUltbWVkaWF0ZVR5cGVBcmdzOwogIGZpbmFsIExpc3Q8UnVudGltZVR5cGU+IHR5cGVBcmdzOwoKICBSdW50aW1lVHlwZShEYXJ0VHlwZSB0eXBlLCB0aGlzLnR5cGVBcmdzKQogICAgICA6IF90eXBlID0gdHlwZSwKICAgICAgICBudW1JbW1lZGlhdGVUeXBlQXJncyA9CiAgICAgICAgICAgIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSA/IHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA6IDAgewogICAgaWYgKF90eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgbnVtSW1tZWRpYXRlVHlwZUFyZ3MgPiAwKSB7CiAgICAgIGFzc2VydHgodHlwZUFyZ3MgIT0gbnVsbCk7CiAgICAgIGFzc2VydHgodHlwZUFyZ3MubGVuZ3RoID49IG51bUltbWVkaWF0ZVR5cGVBcmdzKTsKICAgICAgYXNzZXJ0eCgoX3R5cGUgYXMgSW50ZXJmYWNlVHlwZSkKICAgICAgICAgIC50eXBlQXJndW1lbnRzCiAgICAgICAgICAuZXZlcnkoKHQpID0+IHQgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0eCh0eXBlQXJncyA9PSBudWxsKTsKICAgIH0KICB9CgogIGludCBnZXQgb3JkZXIgPT4gVHlwZU9yZGVyLlJ1bnRpbWVUeXBlLmluZGV4OwoKICBEYXJ0VHlwZSBnZXQgcmVwcmVzZW50ZWRUeXBlUmF3ID0+IF90eXBlOwoKICBEYXJ0VHlwZSBnZXQgcmVwcmVzZW50ZWRUeXBlIHsKICAgIGlmIChfdHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGVBcmdzICE9IG51bGwpIHsKICAgICAgZmluYWwga2xhc3MgPSAoX3R5cGUgYXMgSW50ZXJmYWNlVHlwZSkuY2xhc3NOb2RlOwogICAgICBmaW5hbCB0eXBlQXJndW1lbnRzID0gdHlwZUFyZ3MKICAgICAgICAgIC50YWtlKGtsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKICAgICAgICAgIC5tYXAoKHB0KSA9PiBwdC5yZXByZXNlbnRlZFR5cGUpCiAgICAgICAgICAudG9MaXN0KCk7CiAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShrbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCB0eXBlQXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfdHlwZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgewogICAgaW50IGhhc2ggPSBfdHlwZS5oYXNoQ29kZSBeIDB4MTIzNCAmIGtIYXNoTWFzazsKICAgIC8vIE9ubHkgaGFzaCBieSB0aGUgdHlwZSBhcmd1bWVudHMgb2YgdGhlIGNsYXNzLiBUaGUgdHlwZSBhcmd1bWVudHMgb2YKICAgIC8vIHN1cGVydHlwZXMgYXJlIGFyZSBpbXBsaWVkIGJ5IHRoZW0uCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUltbWVkaWF0ZVR5cGVBcmdzOyArK2kpIHsKICAgICAgaGFzaCA9ICgoKGhhc2ggKiAzMSkgJiBrSGFzaE1hc2spICsgdHlwZUFyZ3NbaV0uaGFzaENvZGUpICYga0hhc2hNYXNrOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBAb3ZlcnJpZGUKICBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgaWYgKG90aGVyIGlzIFJ1bnRpbWVUeXBlKSB7CiAgICAgIGlmIChvdGhlci5fdHlwZSAhPSBfdHlwZSkgcmV0dXJuIGZhbHNlOwogICAgICBhc3NlcnR4KG51bUltbWVkaWF0ZVR5cGVBcmdzID09IG90aGVyLm51bUltbWVkaWF0ZVR5cGVBcmdzKTsKICAgICAgcmV0dXJuIHR5cGVBcmdzID09IG51bGwgfHwgbGlzdEVxdWFscyh0eXBlQXJncywgb3RoZXIudHlwZUFyZ3MpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgZmluYWwgaGVhZCA9IF90eXBlIGlzIEludGVyZmFjZVR5cGUKICAgICAgICA/ICIkeyhfdHlwZSBhcyBJbnRlcmZhY2VUeXBlKS5jbGFzc05vZGV9IgogICAgICAgIDogIiRfdHlwZSI7CiAgICBpZiAobnVtSW1tZWRpYXRlVHlwZUFyZ3MgPT0gMCkgcmV0dXJuIGhlYWQ7CiAgICBmaW5hbCB0eXBlQXJnc1N0cnMgPQogICAgICAgIHR5cGVBcmdzLnRha2UobnVtSW1tZWRpYXRlVHlwZUFyZ3MpLm1hcCgodCkgPT4gIiR0Iikuam9pbigiLCAiKTsKICAgIHJldHVybiAiX1RTIHskaGVhZDwkdHlwZUFyZ3NTdHJzPn0iOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTcGVjaWFsaXplZCA9PgogICAgICB0aHJvdyAiRVJST1I6IFJ1bnRpbWVUeXBlIGRvZXMgbm90IHN1cHBvcnQgaXNTcGVjaWFsaXplZC4iOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKFR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSwgQ2xhc3MgY2xzKSA9PgogICAgICB0aHJvdyAiRVJST1I6IFJ1bnRpbWVUeXBlIGRvZXMgbm90IHN1cHBvcnQgaXNTdWJ0eXBlT2YuIjsKCiAgQG92ZXJyaWRlCiAgVHlwZSB1bmlvbihUeXBlIG90aGVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpID0+CiAgICAgIHRocm93ICJFUlJPUjogUnVudGltZVR5cGUgZG9lcyBub3Qgc3VwcG9ydCB1bmlvbi4iOwoKICAvLyBUaGlzIG9ubHkgd29ya3MgYmV0d2VlbiAidHlwZS1zZXQiIHJlcHJlc2VudGF0aW9ucyAoJ0FueVR5cGUnIGFuZAogIC8vICdSdW50aW1lVHlwZScpIGFuZCBpcyB1c2VkIHdoZW4gbWVyZ2luZyB0eXBlIGFyZ3VtZW50cy4KICBAb3ZlcnJpZGUKICBUeXBlIGludGVyc2VjdGlvbihUeXBlIG90aGVyLCBUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpIHsKICAgIGlmIChvdGhlciBpcyBBbnlUeXBlKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIGlmIChvdGhlciBpcyBSdW50aW1lVHlwZSkgewogICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciA/IHRoaXMgOiBjb25zdCBFbXB0eVR5cGUoKTsKICAgIH0KICAgIHRocm93ICJFUlJPUjogUnVudGltZVR5cGUgY2Fubm90IGludGVyc2VjdCB3aXRoICR7b3RoZXIucnVudGltZVR5cGV9IjsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgc3BlY2lhbGl6ZShUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpID0+CiAgICAgIHRocm93ICJFUlJPUjogUnVudGltZVR5cGUgZG9lcyBub3Qgc3VwcG9ydCBzcGVjaWFsaXplLiI7CgogIEBvdmVycmlkZQogIENsYXNzIGdldENvbmNyZXRlQ2xhc3MoVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KSA9PgogICAgICB0aHJvdyAiRVJST1I6IENvbmNyZXRlQ2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBnZXRDb25jcmV0ZUNsYXNzLiI7CgogIGJvb2wgaXNTdWJ0eXBlT2ZSdW50aW1lVHlwZSgKICAgICAgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5LCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewogICAgZmluYWwgcmhzID0gcnVudGltZVR5cGUuX3R5cGU7CiAgICBpZiAocmhzIGlzIER5bmFtaWNUeXBlIHx8CiAgICAgICAgcmhzIGlzIFZvaWRUeXBlIHx8CiAgICAgICAgX3R5cGUgaXMgQm90dG9tVHlwZSB8fAogICAgICAgIF90eXBlIGlzIE5ldmVyVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChyaHMgaXMgQm90dG9tVHlwZSB8fCByaHMgaXMgTmV2ZXJUeXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoX3R5cGUgaXMgRHluYW1pY1R5cGUgfHwgX3R5cGUgaXMgVm9pZFR5cGUpIHsKICAgICAgcmV0dXJuIChyaHMgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgcmhzLmNsYXNzTm9kZSA9PSB0eXBlSGllcmFyY2h5LmNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICB9CgogICAgZmluYWwgdGhpc0NsYXNzID0gKF90eXBlIGFzIEludGVyZmFjZVR5cGUpLmNsYXNzTm9kZTsKICAgIGZpbmFsIG90aGVyQ2xhc3MgPSAocmhzIGFzIEludGVyZmFjZVR5cGUpLmNsYXNzTm9kZTsKCiAgICBpZiAoIXR5cGVIaWVyYXJjaHkuaXNTdWJ0eXBlKHRoaXNDbGFzcywgb3RoZXJDbGFzcykpIHJldHVybiBmYWxzZTsKCiAgICAvLyBUaGUgdHlwZUhpZXJhcmNoeSByZXN1bHQgbWF5YmUgYmUgaW5hY2N1cmF0ZSBvbmx5IGlmIHRoZXJlIGFyZSB0eXBlCiAgICAvLyBhcmd1bWVudHMgd2hpY2ggbmVlZCB0byBiZSBleGFtaW5lZC4KICAgIGlmIChydW50aW1lVHlwZS5udW1JbW1lZGlhdGVUeXBlQXJncyA9PSAwKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmIChvdGhlckNsYXNzID09IHR5cGVIaWVyYXJjaHkuY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgaWYgKHRoaXNDbGFzcyA9PSB0eXBlSGllcmFyY2h5LmNvcmVUeXBlcy5mdXR1cmVDbGFzcyB8fAogICAgICAgICAgdGhpc0NsYXNzID09IHR5cGVIaWVyYXJjaHkuY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICByZXR1cm4gdHlwZUFyZ3NbMF0KICAgICAgICAgICAgLmlzU3VidHlwZU9mUnVudGltZVR5cGUodHlwZUhpZXJhcmNoeSwgcnVudGltZVR5cGUudHlwZUFyZ3NbMF0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBpc1N1YnR5cGVPZlJ1bnRpbWVUeXBlKHR5cGVIaWVyYXJjaHksIHJ1bnRpbWVUeXBlLnR5cGVBcmdzWzBdKTsKICAgICAgfQogICAgfQoKICAgIExpc3Q8VHlwZT4gdXNhYmxlVHlwZUFyZ3MgPSB0eXBlQXJnczsKICAgIGlmICh1c2FibGVUeXBlQXJncyA9PSBudWxsKSB7CiAgICAgIGFzc2VydHgodGhpc0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpOwogICAgICB1c2FibGVUeXBlQXJncyA9CiAgICAgICAgICB0eXBlSGllcmFyY2h5LmZsYXR0ZW5lZFR5cGVBcmd1bWVudHNGb3JOb25HZW5lcmljKHRoaXNDbGFzcyk7CiAgICB9CiAgICBmaW5hbCBpbnRlcmZhY2VPZmZzZXQgPQogICAgICAgIHR5cGVIaWVyYXJjaHkuZ2VuZXJpY0ludGVyZmFjZU9mZnNldEZvcih0aGlzQ2xhc3MsIG90aGVyQ2xhc3MpOwogICAgYXNzZXJ0eCh1c2FibGVUeXBlQXJncy5sZW5ndGggLSBpbnRlcmZhY2VPZmZzZXQgPj0KICAgICAgICBydW50aW1lVHlwZS5udW1JbW1lZGlhdGVUeXBlQXJncyk7CiAgICBmb3IgKGludCBpID0g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c3MsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmNvbnN0IGJvb2wga1ByaW50VHJhY2UgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoJ2dsb2JhbC50eXBlLmZsb3cucHJpbnQudHJhY2UnKTsKCmNvbnN0IGJvb2wga1ByaW50RGVidWcgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoJ2dsb2JhbC50eXBlLmZsb3cucHJpbnQuZGVidWcnKTsKCmNvbnN0IGJvb2wga1ByaW50U3RhdHMgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoJ2dsb2JhbC50eXBlLmZsb3cucHJpbnQuc3RhdHMnKTsKCmNvbnN0IGJvb2wga1JlbW92ZUFzc2VydHMgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoJ2dsb2JhbC50eXBlLmZsb3cucmVtb3ZlLmFzc2VydHMnKTsKCmNvbnN0IGJvb2wga1Njb3BlVHJhY2UgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoJ2dsb2JhbC50eXBlLmZsb3cuc2NvcGUudHJhY2UnKTsKCmNvbnN0IGludCBrU2NvcGVJbmRlbnQgPQogICAgY29uc3QgaW50LmZyb21FbnZpcm9ubWVudCgnZ2xvYmFsLnR5cGUuZmxvdy5zY29wZS5pbmRlbnQnKTsKCi8vLyBFeHRlbmRlZCAnYXNzZXJ0JzogYWx3YXlzIGNoZWNrcyBjb25kaXRpb24uCmFzc2VydHgoYm9vbCBjb25kLCB7ZGV0YWlsc30pIHsKICBpZiAoIWNvbmQpIHsKICAgIHRocm93ICdBc3NlcnRpb24gZmFpbGVkLicgKyAoZGV0YWlscyAhPSBudWxsID8gJyBEZXRhaWxzOiAkZGV0YWlscycgOiAnJyk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfTG9nZ2VyIHsKICBsb2coT2JqZWN0IG1lc3NhZ2UsIFtpbnQgc2NvcGVDaGFuZ2UgPSAwXSk7Cn0KCmNsYXNzIF9TY29wZWRMb2dnZXIgaW1wbGVtZW50cyBfTG9nZ2VyIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIF9zY29wZURlbGltaXRlciA9ICLilIMiOwogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3Jlc2V0ID0gIlx1MDAxYlswbSI7CiAgc3RhdGljIGNvbnN0IExpc3Q8U3RyaW5nPiBfY29sb3JzID0gWwogICAgIlx1MDAxYlszN20iLCAvLyBibGFjawogICAgIlx1MDAxYlszMW0iLCAvLyByZWQKICAgICJcdTAwMWJbMzJtIiwgLy8gZ3JlZW4KICAgICJcdTAwMWJbMzNtIiwgLy8geWVsbG93CiAgICAiXHUwMDFiWzM0bSIsIC8vIGJsdWUKICAgICJcdTAwMWJbMzVtIiwgLy8gbWFnZW50YQogICAgIlx1MDAxYlszNm0iLCAvLyBjeWFuCiAgXTsKICBzdGF0aWMgY29uc3QgaW50IF9zY29wZUluZGVudCA9IGtTY29wZUluZGVudCA/PyAxOwoKICBpbnQgX3Njb3BlID0gMDsKICBMaXN0PFN0cmluZz4gX3Njb3BlUHJlZml4ZXMgPSA8U3RyaW5nPlsiIl07CgogIF9wcmludChPYmplY3QgbWVzc2FnZSkgewogICAgcHJpbnQoX3Njb3BlUHJlZml4ZXNbX3Njb3BlXSArCiAgICAgICAgbWVzc2FnZS50b1N0cmluZygpLnJlcGxhY2VBbGwoIlxuIiwgIlxuIiArIF9zY29wZVByZWZpeGVzW19zY29wZV0pKTsKICB9CgogIGxvZyhPYmplY3QgbWVzc2FnZSwgW2ludCBzY29wZUNoYW5nZSA9IDBdKSB7CiAgICBpZiAoc2NvcGVDaGFuZ2UgPiAwKSBfcHJpbnQobWVzc2FnZSk7CiAgICBfc2NvcGUgKz0gc2NvcGVDaGFuZ2U7CiAgICB3aGlsZSAoX3Njb3BlUHJlZml4ZXMubGVuZ3RoIDwgX3Njb3BlICsgMSkgewogICAgICBmaW5hbCBzdGFydCA9IF9zY29wZVByZWZpeGVzW19zY29wZVByZWZpeGVzLmxlbmd0aCAtIDFdOwogICAgICBmaW5hbCBjb2x1bW4gPSBfY29sb3JzWyhfc2NvcGUgKyAxKSAlIF9jb2xvcnMubGVuZ3RoXSArCiAgICAgICAgICBfc2NvcGVEZWxpbWl0ZXIgKwogICAgICAgICAgX3Jlc2V0ICsKICAgICAgICAgICIgIiAqIF9zY29wZUluZGVudDsKICAgICAgX3Njb3BlUHJlZml4ZXMuYWRkKHN0YXJ0ICsgY29sdW1uKTsKICAgIH0KICAgIGlmIChzY29wZUNoYW5nZSA8PSAwKSBfcHJpbnQobWVzc2FnZSk7CiAgfQp9CgpjbGFzcyBfU2ltcGxlTG9nZ2VyIGltcGxlbWVudHMgX0xvZ2dlciB7CiAgbG9nKE9iamVjdCBtZXNzYWdlLCBbaW50IHNjb3BlQ2hhbmdlID0gMF0pID0+IHByaW50KG1lc3NhZ2UpOwp9CgpfTG9nZ2VyIF9sb2dnZXIgPSBrU2NvcGVUcmFjZSA/IF9TY29wZWRMb2dnZXIoKSA6IF9TaW1wbGVMb2dnZXIoKTsKCnRyYWNlUHJpbnQoT2JqZWN0IG1lc3NhZ2UsIFtpbnQgc2NvcGVDaGFuZ2UgPSAwXSkgewogIGlmIChrUHJpbnRUcmFjZSkgewogICAgX2xvZ2dlci5sb2cobWVzc2FnZSwgc2NvcGVDaGFuZ2UpOwogIH0KfQoKZGVidWdQcmludChPYmplY3QgbWVzc2FnZSkgewogIGlmIChrUHJpbnREZWJ1ZykgewogICAgX2xvZ2dlci5sb2cobWVzc2FnZSk7CiAgfQp9CgpzdGF0UHJpbnQoT2JqZWN0IG1lc3NhZ2UpIHsKICBpZiAoa1ByaW50U3RhdHMpIHsKICAgIF9sb2dnZXIubG9nKG1lc3NhZ2UpOwogIH0KfQoKY29uc3QgaW50IGtIYXNoTWFzayA9IDB4M2ZmZmZmZmY7Cgpib29sIGhhc1JlY2VpdmVyQXJnKE1lbWJlciBtZW1iZXIpID0+CiAgICBtZW1iZXIuaXNJbnN0YW5jZU1lbWJlciB8fCAobWVtYmVyIGlzIENvbnN0cnVjdG9yKTsKCi8vIFR5cGUgYXJndW1lbnRzIHRvIHByb2NlZHVyZXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGZhY3RvcnkgY29uc3RydWN0b3JzIG9mCi8vIGdlbmVyaWMgY2xhc3NlcyBhdCB0aGUgbW9tZW50LgovLwovLyBUT0RPKHNqaW5kZWwvdGZhKTogRXh0ZW5kIHN1cG9ydCB0byBub3JtYWwgZ2VuZXJpYyBmdW5jdGlvbnMuCmludCBudW1UeXBlUGFyYW1zKE1lbWJlciBtZW1iZXIpID0+IG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmlzRmFjdG9yeQogICAgPyBtZW1iZXIuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoCiAgICA6IDA7CgovLy8gUmV0dXJucyB0cnVlIGlmIGVsZW1lbnRzIGluIFtsaXN0XSBhcmUgaW4gc3RyaWN0bHkgaW5jcmVhc2luZyBvcmRlci4KLy8vIExpc3Qgd2l0aCBkdXBsaWNhdGVzIGlzIGNvbnNpZGVyZWQgbm90IHNvcnRlZC4KYm9vbCBpc1NvcnRlZChMaXN0IGxpc3QpIHsKICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICBpZiAobGlzdFtpXS5jb21wYXJlVG8obGlzdFtpICsgMV0pID49IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQoKVmFyaWFibGVEZWNsYXJhdGlvbiBmaW5kTmFtZWRQYXJhbWV0ZXIoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBTdHJpbmcgbmFtZSkgewogIHJldHVybiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMKICAgICAgLmZpcnN0V2hlcmUoKHApID0+IHAubmFtZSA9PSBuYW1lLCBvckVsc2U6ICgpID0+IG51bGwpOwp9CgovLy8gSG9sZHMgdmFyaW91cyBzdGF0aXN0aWMgY291bnRlcnMgZm9yIHR5cGUgZmxvdyBhbmFseXNpcy4KY2xhc3MgU3RhdGlzdGljcyB7CiAgc3RhdGljIGludCBzdW1tYXJpZXNDcmVhdGVkID0gMDsKICBzdGF0aWMgaW50IHN1bW1hcmllc0FuYWx5emVkID0gMDsKICBzdGF0aWMgaW50IGpvaW5zQXBwcm94aW1hdGVkVG9CcmVha0xvb3BzID0gMDsKICBzdGF0aWMgaW50IGludm9jYXRpb25zUHJvY2Vzc2VkID0gMDsKICBzdGF0aWMgaW50IHVzZWRDYWNoZWRSZXN1bHRzT2ZJbnZvY2F0aW9ucyA9IDA7CiAgc3RhdGljIGludCBpbnZvY2F0aW9uc0ludmFsaWRhdGVkID0gMDsKICBzdGF0aWMgaW50IG1heEludmFsaWRhdGlvbnNQZXJJbnZvY2F0aW9uID0gMDsKICBzdGF0aWMgaW50IHJlY3Vyc2l2ZUludm9jYXRpb25zQXBwcm94aW1hdGVkID0gMDsKICBzdGF0aWMgaW50IHR5cGVDb25lU3BlY2lhbGl6YXRpb25zID0gMDsKICBzdGF0aWMgaW50IGl0ZXJhdGlvbnNPdmVySW52b2NhdGlvbnNXb3JrTGlzdCA9IDA7CiAgc3RhdGljIGludCBpbnZvY2F0aW9uc0ludmFsaWRhdGVkRHVyaW5nUHJvY2Vzc2luZyA9IDA7CiAgc3RhdGljIGludCBpbnZvY2F0aW9uc1F1ZXJpZWRJbkNhY2hlID0gMDsKICBzdGF0aWMgaW50IGludm9jYXRpb25zQWRkZWRUb0NhY2hlID0gMDsKICBzdGF0aWMgaW50IG1heEludm9jYXRpb25zQ2FjaGVkUGVyU2VsZWN0b3IgPSAwOwogIHN0YXRpYyBpbnQgYXBwcm94aW1hdGVJbnZvY2F0aW9uc0NyZWF0ZWQgPSAwOwogIHN0YXRpYyBpbnQgYXBwcm94aW1hdGVJbnZvY2F0aW9uc1VzZWQgPSAwOwogIHN0YXRpYyBpbnQgY2xhc3Nlc0Ryb3BwZWQgPSAwOwogIHN0YXRpYyBpbnQgbWVtYmVyc0Ryb3BwZWQgPSAwOwogIHN0YXRpYyBpbnQgbWV0aG9kQm9kaWVzRHJvcHBlZCA9IDA7CiAgc3RhdGljIGludCBmaWVsZEluaXRpYWxpemVyc0Ryb3BwZWQgPSAwOwogIHN0YXRpYyBpbnQgY29uc3RydWN0b3JCb2RpZXNEcm9wcGVkID0gMDsKICBzdGF0aWMgaW50IGNhbGxzRHJvcHBlZCA9IDA7CiAgc3RhdGljIGludCB0aHJvd0V4cHJlc3Npb25zUHJ1bmVkID0gMDsKCiAgLy8vIFJlc2V0cyBzdGF0aXN0aWMgY291bnRlcnMuCiAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CiAgICBzdW1tYXJpZXNDcmVhdGVkID0gMDsKICAgIHN1bW1hcmllc0FuYWx5emVkID0gMDsKICAgIGpvaW5zQXBwcm94aW1hdGVkVG9CcmVha0xvb3BzID0gMDsKICAgIGludm9jYXRpb25zUHJvY2Vzc2VkID0gMDsKICAgIHVzZWRDYWNoZWRSZXN1bHRzT2ZJbnZvY2F0aW9ucyA9IDA7CiAgICBpbnZvY2F0aW9uc0ludmFsaWRhdGVkID0gMDsKICAgIG1heEludmFsaWRhdGlvbnNQZXJJbnZvY2F0aW9uID0gMDsKICAgIHJlY3Vyc2l2ZUludm9jYXRpb25zQXBwcm94aW1hdGVkID0gMDsKICAgIHR5cGVDb25lU3BlY2lhbGl6YXRpb25zID0gMDsKICAgIGl0ZXJhdGlvbnNPdmVySW52b2NhdGlvbnNXb3JrTGlzdCA9IDA7CiAgICBpbnZvY2F0aW9uc0ludmFsaWRhdGVkRHVyaW5nUHJvY2Vzc2luZyA9IDA7CiAgICBpbnZvY2F0aW9uc1F1ZXJpZWRJbkNhY2hlID0gMDsKICAgIGludm9jYXRpb25zQWRkZWRUb0NhY2hlID0gMDsKICAgIG1heEludm9jYXRpb25zQ2FjaGVkUGVyU2VsZWN0b3IgPSAwOwogICAgYXBwcm94aW1hdGVJbnZvY2F0aW9uc0NyZWF0ZWQgPSAwOwogICAgYXBwcm94aW1hdGVJbnZvY2F0aW9uc1VzZWQgPSAwOwogICAgY2xhc3Nlc0Ryb3BwZWQgPSAwOwogICAgbWVtYmVyc0Ryb3BwZWQgPSAwOwogICAgbWV0aG9kQm9kaWVzRHJvcHBlZCA9IDA7CiAgICBmaWVsZEluaXRpYWxpemVyc0Ryb3BwZWQgPSAwOwogICAgY29uc3RydWN0b3JCb2RpZXNEcm9wcGVkID0gMDsKICAgIGNhbGxzRHJvcHBlZCA9IDA7CiAgICB0aHJvd0V4cHJlc3Npb25zUHJ1bmVkID0gMDsKICB9CgogIHN0YXRpYyB2b2lkIHByaW50KFN0cmluZyBjYXB0aW9uKSB7CiAgICBzdGF0UHJpbnQoIiIiJHtjYXB0aW9ufToKICAgICR7c3VtbWFyaWVzQ3JlYXRlZH0gc3VtbWFyaWVzIGNyZWF0ZWQKICAgICR7c3VtbWFyaWVzQW5hbHl6ZWR9IHN1bW1hcmllcyBhbmFseXplZAogICAgJHtqb2luc0FwcHJveGltYXRlZFRvQnJlYWtMb29wc30gam9pbnMgYXJlIGFwcHJveGltYXRlZCB0byBicmVhayBsb29wcwogICAgJHtpbnZvY2F0aW9uc1Byb2Nlc3NlZH0gaW52b2NhdGlvbnMgcHJvY2Vzc2VkCiAgICAke3VzZWRDYWNoZWRSZXN1bHRzT2ZJbnZvY2F0aW9uc30gdGltZXMgY2FjaGVkIHJlc3VsdCBvZiBpbnZvY2F0aW9uIGlzIHVzZWQKICAgICR7aW52b2NhdGlvbnNJbnZhbGlkYXRlZH0gaW52b2NhdGlvbnMgaW52YWxpZGF0ZWQKICAgICR7bWF4SW52YWxpZGF0aW9uc1Blckludm9jYXRpb259IG1heGltdW0gaW52YWxpZGF0aW9ucyBwZXIgaW52b2NhdGlvbgogICAgJHtyZWN1cnNpdmVJbnZvY2F0aW9uc0FwcHJveGltYXRlZH0gcmVjdXJzaXZlIGludm9jYXRpb25zIGFwcHJveGltYXRlZAogICAgJHt0eXBlQ29uZVNwZWNpYWxpemF0aW9uc30gdHlwZSBjb25lcyBzcGVjaWFsaXplZAogICAgJHtpdGVyYXRpb25zT3Zlckludm9jYXRpb25zV29ya0xpc3R9IGl0ZXJhdGlvbnMgb3ZlciBpbnZvY2F0aW9ucyB3b3JrIGxpc3QKICAgICR7aW52b2NhdGlvbnNJbnZhbGlkYXRlZER1cmluZ1Byb2Nlc3Npbmd9IGludm9jYXRpb25zIGludmFsaWRhdGVkIGR1cmluZyBwcm9jZXNzaW5nCiAgICAke2ludm9jYXRpb25zUXVlcmllZEluQ2FjaGV9IGludm9jYXRpb25zIHF1ZXJpZWQgaW4gY2FjaGUKICAgICR7aW52b2NhdGlvbnNBZGRlZFRvQ2FjaGV9IGludm9jYXRpb25zIGFkZGVkIHRvIGNhY2hlCiAgICAke21heEludm9jYXRpb25zQ2FjaGVkUGVyU2VsZWN0b3J9IG1heGltdW0gaW52b2NhdGlvbnMgY2FjaGVkIHBlciBzZWxlY3RvcgogICAgJHthcHByb3hpbWF0ZUludm9jYXRpb25zQ3JlYXRlZH0gYXBwcm94aW1hdGUgaW52b2NhdGlvbnMgY3JlYXRlZAogICAgJHthcHByb3hpbWF0ZUludm9jYXRpb25zVXNlZH0gdGltZXMgYXBwcm94aW1hdGUgaW52b2NhdGlvbiBpcyB1c2VkCiAgICAke2NsYXNzZXNEcm9wcGVkfSBjbGFzc2VzIGRyb3BwZWQKICAgICR7bWVtYmVyc0Ryb3BwZWR9IG1lbWJlcnMgZHJvcHBlZAogICAgJHttZXRob2RCb2RpZXNEcm9wcGVkfSBtZXRob2QgYm9kaWVzIGRyb3BwZWQKICAgICR7ZmllbGRJbml0aWFsaXplcnNEcm9wcGVkfSBmaWVsZCBpbml0aWFsaXplcnMgZHJvcHBlZAogICAgJHtjb25zdHJ1Y3RvckJvZGllc0Ryb3BwZWR9IGNvbnN0cnVjdG9yIGJvZGllcyBkcm9wcGVkCiAgICAke2NhbGxzRHJvcHBlZH0gY2FsbHMgZHJvcHBlZAogICAgJHt0aHJvd0V4cHJlc3Npb25zUHJ1bmVkfSB0aHJvdyBleHByZXNzaW9ucyBwcnVuZWQKICAgICIiIik7CiAgfQp9CgppbnQgdHlwZUFyZ3VtZW50c0hhc2goTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3MpIHsKICBpbnQgaGFzaCA9IDEyMzc7CiAgZm9yICh2YXIgdCBpbiB0eXBlQXJncykgewogICAgaGFzaCA9ICgoKGhhc2ggKiAzMSkgJiBrSGFzaE1hc2spICsgdC5oYXNoQ29kZSkgJiBrSGFzaE1hc2s7CiAgfQogIHJldHVybiBoYXNoOwp9CgpjbGFzcyBTdWJ0eXBlUGFpciB7CiAgZmluYWwgQ2xhc3Mgc3VidHlwZTsKICBmaW5hbCBDbGFzcyBzdXBlcnR5cGU7CgogIFN1YnR5cGVQYWlyKHRoaXMuc3VidHlwZSwgdGhpcy5zdXBlcnR5cGUpOwoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBzdWJ0eXBlLmhhc2hDb2RlIF4gc3VwZXJ0eXBlLmhhc2hDb2RlOwogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBTdWJ0eXBlUGFpcikgewogICAgICByZXR1cm4gc3VidHlwZSA9PSBvdGhlci5zdWJ0eXBlICYmIHN1cGVydHlwZSA9PSBvdGhlci5zdXBlcnR5cGU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgovLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBpbmRleCAnaScgc3VjaCB0aGF0ICdsaXN0LnNraXAoaSknIGlzIGEgcHJlZml4IG9mCi8vICdzdWJsaXN0Jy4KaW50IGZpbmRPdmVybGFwKExpc3QgbGlzdCwgTGlzdCBzdWJsaXN0KSB7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKQogICAgb3V0ZXI6CiAgICB7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3VibGlzdC5sZW5ndGggJiYgaSArIGogPCBsaXN0Lmxlbmd0aDsgKytqKSB7CiAgICAgICAgaWYgKGxpc3RbaSArIGpdICE9IHN1Ymxpc3Rbal0pIGNvbnRpbnVlIG91dGVyOwogICAgICB9CiAgICAgIHJldHVybiBpOwogICAgfQogIHJldHVybiBsaXN0Lmxlbmd0aDsKfQqBBABOTjwBSQ4sASEJDxUSExYQHQEZQAEZQAEZQAEcQwEZQAEZQAEwIA9PBAIBGS4CASktLCgbGRscGh0aBTUBEi4BGyNNBAEvKhsxPz4cEx4qBisEAgEpQAIBQwE0FScEAgEdFRoEAgEcFRoEAgEiASY4AU4iA0FMLAkBSTMbLi8UBgQPAgFNIj4CAT0TIyQwJzEpMDMqNDksKjIwLSEhJisrHykBIRgaGyceKCAnKiErMCMhKSckGBgdIiIWIAQBJh0qLEsyUDZKSzZPWD46T0VHJiYxOzsiNwoEAgExExxBBA8CARQXGQEtARUyBAEjIEcGEgQCAUoOKygLBkg3CBAGFgIBL3BhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy91dGlscy5kYXJ0UmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvcHJhZ21hLmRhcnSRZS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLnRyYW5zZm9ybWF0aW9ucy5wcmFnbWE7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKY29uc3Qga0VudHJ5UG9pbnRQcmFnbWFOYW1lID0gInZtOmVudHJ5LXBvaW50IjsKY29uc3Qga0V4YWN0UmVzdWx0VHlwZVByYWdtYU5hbWUgPSAidm06ZXhhY3QtcmVzdWx0LXR5cGUiOwpjb25zdCBrTm9uTnVsbGFibGVSZXN1bHRUeXBlID0gInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSI7CmNvbnN0IGtSZXN1bHRUeXBlVXNlc1Bhc3NlZFR5cGVBcmd1bWVudHMgPQogICAgInJlc3VsdC10eXBlLXVzZXMtcGFzc2VkLXR5cGUtYXJndW1lbnRzIjsKCmFic3RyYWN0IGNsYXNzIFBhcnNlZFByYWdtYSB7fQoKZW51bSBQcmFnbWFFbnRyeVBvaW50VHlwZSB7IERlZmF1bHQsIEdldHRlck9ubHksIFNldHRlck9ubHksIENhbGxPbmx5IH0KCmNsYXNzIFBhcnNlZEVudHJ5UG9pbnRQcmFnbWEgZXh0ZW5kcyBQYXJzZWRQcmFnbWEgewogIGZpbmFsIFByYWdtYUVudHJ5UG9pbnRUeXBlIHR5cGU7CiAgUGFyc2VkRW50cnlQb2ludFByYWdtYSh0aGlzLnR5cGUpOwp9CgpjbGFzcyBQYXJzZWRSZXN1bHRUeXBlQnlUeXBlUHJhZ21hIGV4dGVuZHMgUGFyc2VkUHJhZ21hIHsKICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwogIGZpbmFsIGJvb2wgcmVzdWx0VHlwZVVzZXNQYXNzZWRUeXBlQXJndW1lbnRzOwogIFBhcnNlZFJlc3VsdFR5cGVCeVR5cGVQcmFnbWEoCiAgICAgIHRoaXMudHlwZSwgdGhpcy5yZXN1bHRUeXBlVXNlc1Bhc3NlZFR5cGVBcmd1bWVudHMpOwp9CgpjbGFzcyBQYXJzZWRSZXN1bHRUeXBlQnlQYXRoUHJhZ21hIGV4dGVuZHMgUGFyc2VkUHJhZ21hIHsKICBmaW5hbCBTdHJpbmcgcGF0aDsKICBQYXJzZWRSZXN1bHRUeXBlQnlQYXRoUHJhZ21hKHRoaXMucGF0aCk7Cn0KCmNsYXNzIFBhcnNlZE5vbk51bGxhYmxlUmVzdWx0VHlwZSBleHRlbmRzIFBhcnNlZFByYWdtYSB7CiAgUGFyc2VkTm9uTnVsbGFibGVSZXN1bHRUeXBlKCk7Cn0KCmFic3RyYWN0IGNsYXNzIFByYWdtYUFubm90YXRpb25QYXJzZXIgewogIC8vLyBNYXkgcmV0dXJuICdudWxsJyBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCByZXByZXNlbnQgYSByZWNvZ25pemVkCiAgLy8vIEBwcmFnbWEuCiAgUGFyc2VkUHJhZ21hIHBhcnNlUHJhZ21hKEV4cHJlc3Npb24gYW5ub3RhdGlvbik7Cn0KCmNsYXNzIENvbnN0YW50UHJhZ21hQW5ub3RhdGlvblBhcnNlciBleHRlbmRzIFByYWdtYUFubm90YXRpb25QYXJzZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIENvbnN0YW50UHJhZ21hQW5ub3RhdGlvblBhcnNlcih0aGlzLmNvcmVUeXBlcyk7CgogIFBhcnNlZFByYWdtYSBwYXJzZVByYWdtYShFeHByZXNzaW9uIGFubm90YXRpb24pIHsKICAgIEluc3RhbmNlQ29uc3RhbnQgcHJhZ21hQ29uc3RhbnQ7CiAgICBpZiAoYW5ub3RhdGlvbiBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgQ29uc3RhbnQgY29uc3RhbnQgPSBhbm5vdGF0aW9uLmNvbnN0YW50OwogICAgICBpZiAoY29uc3RhbnQgaXMgSW5zdGFuY2VDb25zdGFudCkgewogICAgICAgIGlmIChjb25zdGFudC5jbGFzc05vZGUgPT0gY29yZVR5cGVzLnByYWdtYUNsYXNzKSB7CiAgICAgICAgICBwcmFnbWFDb25zdGFudCA9IGNvbnN0YW50OwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjb25zdGFudCBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgICAgdGhyb3cgJ0Vycm9yOiB1bmV2YWx1YXRlZCBjb25zdGFudCAkY29uc3RhbnQnOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAnRXJyb3I6IG5vbi1jb25zdGFudCBhbm5vdGF0aW9uICRhbm5vdGF0aW9uJzsKICAgIH0KICAgIGlmIChwcmFnbWFDb25zdGFudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICBTdHJpbmcgcHJhZ21hTmFtZTsKICAgIENvbnN0YW50IG5hbWUgPSBwcmFnbWFDb25zdGFudC5maWVsZFZhbHVlc1tjb3JlVHlwZXMucHJhZ21hTmFtZS5yZWZlcmVuY2VdOwogICAgaWYgKG5hbWUgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgcHJhZ21hTmFtZSA9IG5hbWUudmFsdWU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBDb25zdGFudCBvcHRpb25zID0KICAgICAgICBwcmFnbWFDb25zdGFudC5maWVsZFZhbHVlc1tjb3JlVHlwZXMucHJhZ21hT3B0aW9ucy5yZWZlcmVuY2VdOwogICAgYXNzZXJ0KG9wdGlvbnMgIT0gbnVsbCk7CgogICAgc3dpdGNoIChwcmFnbWFOYW1lKSB7CiAgICAgIGNhc2Uga0VudHJ5UG9pbnRQcmFnbWFOYW1lOgogICAgICAgIFByYWdtYUVudHJ5UG9pbnRUeXBlIHR5cGU7CiAgICAgICAgaWYgKG9wdGlvbnMgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgICAgICB0eXBlID0gUHJhZ21hRW50cnlQb2ludFR5cGUuRGVmYXVsdDsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgaXMgQm9vbENvbnN0YW50ICYmIG9wdGlvbnMudmFsdWUgPT0gdHJ1ZSkgewogICAgICAgICAgdHlwZSA9IFByYWdtYUVudHJ5UG9pbnRUeXBlLkRlZmF1bHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICBpZiAob3B0aW9ucy52YWx1ZSA9PSAiZ2V0IikgewogICAgICAgICAgICB0eXBlID0gUHJhZ21hRW50cnlQb2ludFR5cGUuR2V0dGVyT25seTsKICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy52YWx1ZSA9PSAic2V0IikgewogICAgICAgICAgICB0eXBlID0gUHJhZ21hRW50cnlQb2ludFR5cGUuU2V0dGVyT25seTsKICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy52YWx1ZSA9PSAiY2FsbCIpIHsKICAgICAgICAgICAgdHlwZSA9IFByYWdtYUVudHJ5UG9pbnRUeXBlLkNhbGxPbmx5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgIkVycm9yOiBzdHJpbmcgZGlyZWN0aXZlIHRvIEBwcmFnbWEoJyRrRW50cnlQb2ludFByYWdtYU5hbWUnLCAuLi4pICIKICAgICAgICAgICAgICAgICJtdXN0IGJlIGVpdGhlciAnZ2V0JyBvciAnc2V0JyBmb3IgZmllbGRzICIKICAgICAgICAgICAgICAgICJvciAnZ2V0JyBvciAnY2FsbCcgZm9yIHByb2NlZHVyZXMuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGUgIT0gbnVsbCA/IG5ldyBQYXJzZWRFbnRyeVBvaW50UHJhZ21hKHR5cGUpIDogbnVsbDsKICAgICAgY2FzZSBrRXhhY3RSZXN1bHRUeXBlUHJhZ21hTmFtZToKICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAob3B0aW9ucyBpcyBUeXBlTGl0ZXJhbENvbnN0YW50KSB7CiAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlZFJlc3VsdFR5cGVCeVR5cGVQcmFnbWEob3B0aW9ucy50eXBlLCBmYWxzZSk7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlZFJlc3VsdFR5cGVCeVBhdGhQcmFnbWEob3B0aW9ucy52YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zIGlzIExpc3RDb25zdGFudCAmJgogICAgICAgICAgICBvcHRpb25zLmVudHJpZXMubGVuZ3RoID09IDIgJiYKICAgICAgICAgICAgb3B0aW9ucy5lbnRyaWVzWzBdIGlzIFR5cGVMaXRlcmFsQ29uc3RhbnQgJiYKICAgICAgICAgICAgb3B0aW9ucy5lbnRyaWVzWzFdIGlzIFN0cmluZ0NvbnN0YW50ICYmCiAgICAgICAgICAgIChvcHRpb25zLmVudHJpZXNbMV0gYXMgU3RyaW5nQ29uc3RhbnQpLnZhbHVlID09CiAgICAgICAgICAgICAgICBrUmVzdWx0VHlwZVVzZXNQYXNzZWRUeXBlQXJndW1lbnRzKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlZFJlc3VsdFR5cGVCeVR5cGVQcmFnbWEoCiAgICAgICAgICAgICAgKG9wdGlvbnMuZW50cmllc1swXSBhcyBUeXBlTGl0ZXJhbENvbnN0YW50KS50eXBlLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgIkVSUk9SOiBVbnN1cHBvcnRlZCBvcHRpb24gdG8gJyRrRXhhY3RSZXN1bHRUeXBlUHJhZ21hTmFtZScgIgogICAgICAgICAgICAicHJhZ21hOiAkb3B0aW9ucyI7CiAgICAgIGNhc2Uga05vbk51bGxhYmxlUmVzdWx0VHlwZToKICAgICAgICByZXR1cm4gbmV3IFBhcnNlZE5vbk51bGxhYmxlUmVzdWx0VHlwZSgpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KfQp+AE5OPAEjASI4ATA7PisuAR8BSAE0IyUCAToXMCA6AgE6FSsCATkhAgEoSg8zAgFGHQEyATQlLC8qOyUKNDcIDToGLQEXUCIfDRMGARdHHQEaIiMnL0cvMCg0LzQwMhNXPDYMCkcnKi5IMEIuKzk0PDYzRwpMICMyDxUGBAIBJnBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3ByYWdtYS5kYXJ0UGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi9tZXRhZGF0YS91bnJlYWNoYWJsZS5kYXJ0hBAvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5tZXRhZGF0YS51bnJlYWNoYWJsZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKLy8vIE1ldGFkYXRhIGZvciBhbm5vdGF0aW5nIHVucmVhY2hhYmxlIG5vZGVzLiBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50cwovLy8gb2YgYW4gdW5yZWFjaGFibGUgbm9kZSBjb3VsZCBzdGlsbCBiZSByZWFjaGFibGUuCi8vLyBVc2VkIHRvIGFubm90YXRlIGNhbGxzIGFuZCBmdW5jdGlvbnMuCmNsYXNzIFVucmVhY2hhYmxlTm9kZSB7CiAgY29uc3QgVW5yZWFjaGFibGVOb2RlKCk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICcnOwp9CgovLy8gUmVwb3NpdG9yeSBmb3IgW1VucmVhY2hhYmxlTm9kZV0uCmNsYXNzIFVucmVhY2hhYmxlTm9kZU1ldGFkYXRhUmVwb3NpdG9yeQogICAgZXh0ZW5kcyBNZXRhZGF0YVJlcG9zaXRvcnk8VW5yZWFjaGFibGVOb2RlPiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgU3RyaW5nIHRhZyA9ICd2bS51bnJlYWNoYWJsZS5tZXRhZGF0YSc7CgogIEBvdmVycmlkZQogIGZpbmFsIE1hcDxUcmVlTm9kZSwgVW5yZWFjaGFibGVOb2RlPiBtYXBwaW5nID0gPFRyZWVOb2RlLCBVbnJlYWNoYWJsZU5vZGU+e307CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGVUb0JpbmFyeShVbnJlYWNoYWJsZU5vZGUgbWV0YWRhdGEsIE5vZGUgbm9kZSwgQmluYXJ5U2luayBzaW5rKSB7fQoKICBAb3ZlcnJpZGUKICBVbnJlYWNoYWJsZU5vZGUgcmVhZEZyb21CaW5hcnkoTm9kZSBub2RlLCBCaW5hcnlTb3VyY2Ugc291cmNlKSB7CiAgICByZXR1cm4gY29uc3QgVW5yZWFjaGFibGVOb2RlKCk7CiAgfQp9CiUATk48ASEBIgFHNSoYGwEMGwIBJigyDDABDFABDE4BDEMkBAIBJHBhY2thZ2U6dm0vbWV0YWRhdGEvdW5yZWFjaGFibGUuZGFydFlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvbWV0YWRhdGEvY2FsbF9zaXRlX2F0dHJpYnV0ZXMuZGFydIUVLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0ubWV0YWRhdGEuY2FsbF9zaXRlX2F0dHJpYnV0ZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCi8vLyBNZXRhZGF0YSBmb3IgYW5ub3RhdGluZyBjYWxsIHNpdGVzIHdpdGggdmFyaW91cyBhdHRyaWJ1dGVzLgpjbGFzcyBDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YSB7CiAgZmluYWwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwoKICBjb25zdCBDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YSh7dGhpcy5yZWNlaXZlclR5cGV9KTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gInJlY2VpdmVyVHlwZTokcmVjZWl2ZXJUeXBlIjsKfQoKLy8vIFJlcG9zaXRvcnkgZm9yIFtDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YV0uCmNsYXNzIENhbGxTaXRlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeQogICAgZXh0ZW5kcyBNZXRhZGF0YVJlcG9zaXRvcnk8Q2FsbFNpdGVBdHRyaWJ1dGVzTWV0YWRhdGE+IHsKICBzdGF0aWMgZmluYWwgcmVwb3NpdG9yeVRhZyA9ICd2bS5jYWxsLXNpdGUtYXR0cmlidXRlcy5tZXRhZGF0YSc7CgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyB0YWcgPSByZXBvc2l0b3J5VGFnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNYXA8VHJlZU5vZGUsIENhbGxTaXRlQXR0cmlidXRlc01ldGFkYXRhPiBtYXBwaW5nID0KICAgICAgPFRyZWVOb2RlLCBDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YT57fTsKCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZVRvQmluYXJ5KAogICAgICBDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YSBtZXRhZGF0YSwgTm9kZSBub2RlLCBCaW5hcnlTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGVEYXJ0VHlwZShtZXRhZGF0YS5yZWNlaXZlclR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2FsbFNpdGVBdHRyaWJ1dGVzTWV0YWRhdGEgcmVhZEZyb21CaW5hcnkoTm9kZSBub2RlLCBCaW5hcnlTb3VyY2Ugc291cmNlKSB7CiAgICBmaW5hbCB0eXBlID0gc291cmNlLnJlYWREYXJ0VHlwZSgpOwogICAgcmV0dXJuIG5ldyBDYWxsU2l0ZUF0dHJpYnV0ZXNNZXRhZGF0YShyZWNlaXZlclR5cGU6IHR5cGUpOwogIH0KfQosAE5OPAEqASIBQCMfATkBDDUCATErPUMBDCQBDDwwAQwWSS8EAQxOKD8EAgEtcGFja2FnZTp2bS9tZXRhZGF0YS9jYWxsX3NpdGVfYXR0cmlidXRlcy5kYXJ0S2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9hcmdzL2xpYi9zcmMvdXRpbHMuZGFydJO6Ly8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIG1hdGg7CgovLy8gUGFkcyBbc291cmNlXSB0byBbbGVuZ3RoXSBieSBhZGRpbmcgc3BhY2VzIGF0IHRoZSBlbmQuClN0cmluZyBwYWRSaWdodChTdHJpbmcgc291cmNlLCBpbnQgbGVuZ3RoKSA9PgogICAgc291cmNlICsgJyAnICogKGxlbmd0aCAtIHNvdXJjZS5sZW5ndGgpOwoKLy8vIFdyYXBzIGEgYmxvY2sgb2YgdGV4dCBpbnRvIGxpbmVzIG5vIGxvbmdlciB0aGFuIFtsZW5ndGhdLgovLy8KLy8vIFRyaWVzIHRvIHNwbGl0IGF0IHdoaXRlc3BhY2UsIGJ1dCBpZiB0aGF0J3Mgbm90IGdvb2QgZW5vdWdoIHRvIGtlZXAgaXQKLy8vIHVuZGVyIHRoZSBsaW1pdCwgdGhlbiBpdCBzcGxpdHMgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQuCi8vLwovLy8gUHJlc2VydmVzIGluZGVudGF0aW9uIChsZWFkaW5nIHdoaXRlc3BhY2UpIGZvciBlYWNoIGxpbmUgKGRlbGltaXRlZCBieSAnXG4nKQovLy8gaW4gdGhlIGlucHV0LCBhbmQgaW5kZW50cyB3cmFwcGVkIGxpbmVzIHRoZSBzYW1lIGFtb3VudC4KLy8vCi8vLyBJZiBbaGFuZ2luZ0luZGVudF0gaXMgc3VwcGxpZWQsIHRoZW4gdGhhdCBtYW55IHNwYWNlcyBhcmUgYWRkZWQgdG8gZWFjaAovLy8gbGluZSwgZXhjZXB0IGZvciB0aGUgZmlyc3QgbGluZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGZsb3dpbmcgdGV4dCB3aXRoIGEKLy8vIGhlYWRpbmcgcHJlZml4IChlLmcuICJVc2FnZTogIik6Ci8vLwovLy8gYGBgZGFydAovLy8gdmFyIHByZWZpeCA9ICJVc2FnZTogIjsKLy8vIHByaW50KHByZWZpeCArIHdyYXBUZXh0KGludm9jYXRpb24sIGhhbmdpbmdJbmRlbnQ6IHByZWZpeC5sZW5ndGgsIGxlbmd0aDogNDApKTsKLy8vIGBgYAovLy8KLy8vIHlpZWxkczoKLy8vIGBgYAovLy8gVXNhZ2U6IGFwcCBtYWluX2NvbW1hbmQgPHN1YmNvbW1hbmQ+Ci8vLyAgICAgICAgW2FyZ3VtZW50c10KLy8vIGBgYAovLy8KLy8vIElmIFtsZW5ndGhdIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gbm8gd3JhcHBpbmcgb2NjdXJzLCBhbmQgdGhlIG9yaWdpbmFsCi8vLyBbdGV4dF0gaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgpTdHJpbmcgd3JhcFRleHQoU3RyaW5nIHRleHQsIHtpbnQgbGVuZ3RoLCBpbnQgaGFuZ2luZ0luZGVudH0pIHsKICBpZiAobGVuZ3RoID09IG51bGwpIHJldHVybiB0ZXh0OwogIGhhbmdpbmdJbmRlbnQgPz89IDA7CiAgdmFyIHNwbGl0VGV4dCA9IHRleHQuc3BsaXQoJ1xuJyk7CiAgdmFyIHJlc3VsdCA9IDxTdHJpbmc+W107CiAgZm9yICh2YXIgbGluZSBpbiBzcGxpdFRleHQpIHsKICAgIHZhciB0cmltbWVkVGV4dCA9IGxpbmUudHJpbUxlZnQoKTsKICAgIGZpbmFsIGxlYWRpbmdXaGl0ZXNwYWNlID0KICAgICAgICBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIHRyaW1tZWRUZXh0Lmxlbmd0aCk7CiAgICB2YXIgbm90SW5kZW50ZWQ7CiAgICBpZiAoaGFuZ2luZ0luZGVudCAhPSAwKSB7CiAgICAgIC8vIFdoZW4gd2UgaGF2ZSBhIGhhbmdpbmcgaW5kZW50LCB3ZSB3YW50IHRvIHdyYXAgdGhlIGZpcnN0IGxpbmUgYXQgb25lCiAgICAgIC8vIHdpZHRoLCBhbmQgdGhlIHJlc3QgYXQgYW5vdGhlciAob2Zmc2V0IGJ5IGhhbmdpbmdJbmRlbnQpLCBzbyB3ZSB3cmFwCiAgICAgIC8vIHRoZW0gdHdpY2UgYW5kIHJlY29tYmluZS4KICAgICAgdmFyIGZpcnN0TGluZVdyYXAgPSB3cmFwVGV4dEFzTGluZXModHJpbW1lZFRleHQsCiAgICAgICAgICBsZW5ndGg6IGxlbmd0aCAtIGxlYWRpbmdXaGl0ZXNwYWNlLmxlbmd0aCk7CiAgICAgIG5vdEluZGVudGVkID0gW2ZpcnN0TGluZVdyYXAucmVtb3ZlQXQoMCldOwogICAgICB0cmltbWVkVGV4dCA9IHRyaW1tZWRUZXh0LnN1YnN0cmluZyhub3RJbmRlbnRlZFswXS5sZW5ndGgpLnRyaW1MZWZ0KCk7CiAgICAgIGlmIChmaXJzdExpbmVXcmFwLmlzTm90RW1wdHkpIHsKICAgICAgICBub3RJbmRlbnRlZC5hZGRBbGwod3JhcFRleHRBc0xpbmVzKHRyaW1tZWRUZXh0LAogICAgICAgICAgICBsZW5ndGg6IGxlbmd0aCAtIGxlYWRpbmdXaGl0ZXNwYWNlLmxlbmd0aCAtIGhhbmdpbmdJbmRlbnQpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbm90SW5kZW50ZWQgPSB3cmFwVGV4dEFzTGluZXModHJpbW1lZFRleHQsCiAgICAgICAgICBsZW5ndGg6IGxlbmd0aCAtIGxlYWRpbmdXaGl0ZXNwYWNlLmxlbmd0aCk7CiAgICB9CiAgICBTdHJpbmcgaGFuZ2luZ0luZGVudFN0cmluZzsKICAgIHJlc3VsdC5hZGRBbGwobm90SW5kZW50ZWQubWFwPFN0cmluZz4oKFN0cmluZyBsaW5lKSB7CiAgICAgIC8vIERvbid0IHJldHVybiBhbnkgbGluZXMgd2l0aCBqdXN0IHdoaXRlc3BhY2Ugb24gdGhlbS4KICAgICAgaWYgKGxpbmUuaXNFbXB0eSkgcmV0dXJuICcnOwogICAgICB2YXIgcmVzdWx0ID0gJyR7aGFuZ2luZ0luZGVudFN0cmluZyA/PyAnJ30kbGVhZGluZ1doaXRlc3BhY2UkbGluZSc7CiAgICAgIGhhbmdpbmdJbmRlbnRTdHJpbmcgPz89ICcgJyAqIGhhbmdpbmdJbmRlbnQ7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KSk7CiAgfQogIHJldHVybiByZXN1bHQuam9pbignXG4nKTsKfQoKLy8vIFdyYXBzIGEgYmxvY2sgb2YgdGV4dCBpbnRvIGxpbmVzIG5vIGxvbmdlciB0aGFuIFtsZW5ndGhdLAovLy8gc3RhcnRpbmcgYXQgdGhlIFtzdGFydF0gY29sdW1uLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgbGlzdCBvZiBzdHJpbmdzLgovLy8KLy8vIFRyaWVzIHRvIHNwbGl0IGF0IHdoaXRlc3BhY2UsIGJ1dCBpZiB0aGF0J3Mgbm90IGdvb2QgZW5vdWdoIHRvIGtlZXAgaXQKLy8vIHVuZGVyIHRoZSBsaW1pdCwgdGhlbiBzcGxpdHMgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQuIFByZXNlcnZlcyBlbWJlZGRlZAovLy8gbmV3bGluZXMsIGJ1dCBub3QgaW5kZW50YXRpb24gKGl0IHRyaW1zIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUpLgovLy8KLy8vIElmIFtsZW5ndGhdIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gbm8gd3JhcHBpbmcgb2NjdXJzLCBhbmQgdGhlIG9yaWdpbmFsCi8vLyBbdGV4dF0gaXMgcmV0dXJuZWQgYWZ0ZXIgc3BsaXR0aW5nIGl0IG9uIG5ld2xpbmVzLiBXaGl0ZXNwYWNlIGlzIG5vdCB0cmltbWVkCi8vLyBpbiB0aGlzIGNhc2UuCkxpc3Q8U3RyaW5nPiB3cmFwVGV4dEFzTGluZXMoU3RyaW5nIHRleHQsIHtpbnQgc3RhcnQgPSAwLCBpbnQgbGVuZ3RofSkgewogIGFzc2VydChzdGFydCA+PSAwKTsKCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGF0IFtpbmRleF0gaW4gW3RleHRdIGlzIGEgd2hpdGVzcGFjZQogIC8vLyBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIEJhc2VkIG9uOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaGl0ZXNwYWNlX2NoYXJhY3RlciNVbmljb2RlCiAgYm9vbCBpc1doaXRlc3BhY2UoU3RyaW5nIHRleHQsIGludCBpbmRleCkgewogICAgdmFyIHJ1bmUgPSB0ZXh0LmNvZGVVbml0QXQoaW5kZXgpOwogICAgcmV0dXJuIHJ1bmUgPj0gMHgwMDA5ICYmIHJ1bmUgPD0gMHgwMDBEIHx8CiAgICAgICAgcnVuZSA9PSAweDAwMjAgfHwKICAgICAgICBydW5lID09IDB4MDA4NSB8fAogICAgICAgIHJ1bmUgPT0gMHgxNjgwIHx8CiAgICAgICAgcnVuZSA9PSAweDE4MEUgfHwKICAgICAgICBydW5lID49IDB4MjAwMCAmJiBydW5lIDw9IDB4MjAwQSB8fAogICAgICAgIHJ1bmUgPT0gMHgyMDI4IHx8CiAgICAgICAgcnVuZSA9PSAweDIwMjkgfHwKICAgICAgICBydW5lID09IDB4MjAyRiB8fAogICAgICAgIHJ1bmUgPT0gMHgyMDVGIHx8CiAgICAgICAgcnVuZSA9PSAweDMwMDAgfHwKICAgICAgICBydW5lID09IDB4RkVGRjsKICB9CgogIGlmIChsZW5ndGggPT0gbnVsbCkgcmV0dXJuIHRleHQuc3BsaXQoJ1xuJyk7CgogIHZhciByZXN1bHQgPSA8U3RyaW5nPltdOwogIHZhciBlZmZlY3RpdmVMZW5ndGggPSBtYXRoLm1heChsZW5ndGggLSBzdGFydCwgMTApOwogIGZvciAodmFyIGxpbmUgaW4gdGV4dC5zcGxpdCgnXG4nKSkgewogICAgbGluZSA9IGxpbmUudHJpbSgpOwogICAgaWYgKGxpbmUubGVuZ3RoIDw9IGVmZmVjdGl2ZUxlbmd0aCkgewogICAgICByZXN1bHQuYWRkKGxpbmUpOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICB2YXIgY3VycmVudExpbmVTdGFydCA9IDA7CiAgICB2YXIgbGFzdFdoaXRlc3BhY2U7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGlzV2hpdGVzcGFjZShsaW5lLCBpKSkgbGFzdFdoaXRlc3BhY2UgPSBpOwoKICAgICAgaWYgKGkgLSBjdXJyZW50TGluZVN0YXJ0ID49IGVmZmVjdGl2ZUxlbmd0aCkgewogICAgICAgIC8vIEJhY2sgdXAgdG8gdGhlIGxhc3Qgd2hpdGVzcGFjZSwgdW5sZXNzIHRoZXJlIHdhc24ndCBhbnksIGluIHdoaWNoCiAgICAgICAgLy8gY2FzZSB3ZSBqdXN0IHNwbGl0IHdoZXJlIHdlIGFyZS4KICAgICAgICBpZiAobGFzdFdoaXRlc3BhY2UgIT0gbnVsbCkgaSA9IGxhc3RXaGl0ZXNwYWNlOwoKICAgICAgICByZXN1bHQuYWRkKGxpbmUuc3Vic3RyaW5nKGN1cnJlbnRMaW5lU3RhcnQsIGkpLnRyaW0oKSk7CgogICAgICAgIC8vIFNraXAgYW55IGludGVydmVuaW5nIHdoaXRlc3BhY2UuCiAgICAgICAgd2hpbGUgKGlzV2hpdGVzcGFjZShsaW5lLCBpKSAmJiBpIDwgbGluZS5sZW5ndGgpIHsKICAgICAgICAgIGkrKzsKICAgICAgICB9CgogICAgICAgIGN1cnJlbnRMaW5lU3RhcnQgPSBpOwogICAgICAgIGxhc3RXaGl0ZXNwYWNlID0gbnVsbDsKICAgICAgfQogICAgfQogICAgcmVzdWx0LmFkZChsaW5lLnN1YnN0cmluZyhjdXJyZW50TGluZVN0YXJ0KS50cmltKCkpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CoCPAE5OPBwBOy4tAT4ESz0EUT0ETEwlBAwcVAgEDAgpFwgETCJAIxckGyAnHj0VHk5OIzc2MU0mOEkIDTE2BiA6PiNKMxUJBBwCAT5RBEtNSARMURJJFgFJEQZLLicvGhoaGiwaGhoaGhgEAS8BGzYnGCoYEAYBHhgsNQE1TSw4AUABLDsPCgEeHwgGOQQRAgEbcGFja2FnZTphcmdzL3NyYy91dGlscy5kYXJ0VmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb2xsZWN0aW9uL2xpYi9zcmMvYWxnb3JpdGhtcy5kYXJ0ph8vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0Om1hdGgiIGFzIG1hdGg7CgppbXBvcnQgInV0aWxzLmRhcnQiOwoKLy8vIFJldHVybnMgYSBwb3NpdGlvbiBvZiB0aGUgW3ZhbHVlXSBpbiBbc29ydGVkTGlzdF0sIGlmIGl0IGlzIHRoZXJlLgovLy8KLy8vIElmIHRoZSBsaXN0IGlzbid0IHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIFtjb21wYXJlXSBmdW5jdGlvbiwgdGhlIHJlc3VsdAovLy8gaXMgdW5wcmVkaWN0YWJsZS4KLy8vCi8vLyBJZiBbY29tcGFyZV0gaXMgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBjYWxsaW5nIFtDb21wYXJhYmxlLmNvbXBhcmVUb10gb24KLy8vIHRoZSBvYmplY3RzLiBJZiBhbnkgb2JqZWN0IGlzIG5vdCBbQ29tcGFyYWJsZV0sIHRoaXMgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uCi8vLwovLy8gUmV0dXJucyAtMSBpZiBbdmFsdWVdIGlzIG5vdCBpbiB0aGUgbGlzdCBieSBkZWZhdWx0LgppbnQgYmluYXJ5U2VhcmNoPFQ+KExpc3Q8VD4gc29ydGVkTGlzdCwgVCB2YWx1ZSwge2ludCBjb21wYXJlKFQgYSwgVCBiKX0pIHsKICBjb21wYXJlID8/PSBkZWZhdWx0Q29tcGFyZTxUPigpOwogIGludCBtaW4gPSAwOwogIGludCBtYXggPSBzb3J0ZWRMaXN0Lmxlbmd0aDsKICB3aGlsZSAobWluIDwgbWF4KSB7CiAgICBpbnQgbWlkID0gbWluICsgKChtYXggLSBtaW4pID4+IDEpOwogICAgdmFyIGVsZW1lbnQgPSBzb3J0ZWRMaXN0W21pZF07CiAgICBpbnQgY29tcCA9IGNvbXBhcmUoZWxlbWVudCwgdmFsdWUpOwogICAgaWYgKGNvbXAgPT0gMCkgcmV0dXJuIG1pZDsKICAgIGlmIChjb21wIDwgMCkgewogICAgICBtaW4gPSBtaWQgKyAxOwogICAgfSBlbHNlIHsKICAgICAgbWF4ID0gbWlkOwogICAgfQogIH0KICByZXR1cm4gLTE7Cn0KCi8vLyBSZXR1cm5zIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiBbc29ydGVkTGlzdF0gdGhhdCBkb2VzIG5vdCBjb21wYXJlIGxlc3MgdGhhbgovLy8gW3ZhbHVlXS4KLy8vCi8vLyBJZiB0aGUgbGlzdCBpc24ndCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24sIHRoZSByZXN1bHQKLy8vIGlzIHVucHJlZGljdGFibGUuCi8vLwovLy8gSWYgW2NvbXBhcmVdIGlzIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gY2FsbGluZyBbQ29tcGFyYWJsZS5jb21wYXJlVG9dIG9uCi8vLyB0aGUgb2JqZWN0cy4gSWYgYW55IG9iamVjdCBpcyBub3QgW0NvbXBhcmFibGVdLCB0aGlzIHRocm93cyBhIFtDYXN0RXJyb3JdLgovLy8KLy8vIFJldHVybnMgW3NvcnRlZExpc3QubGVuZ3RoXSBpZiBhbGwgdGhlIGl0ZW1zIGluIFtzb3J0ZWRMaXN0XSBjb21wYXJlIGxlc3MKLy8vIHRoYW4gW3ZhbHVlXS4KaW50IGxvd2VyQm91bmQ8VD4oTGlzdDxUPiBzb3J0ZWRMaXN0LCBUIHZhbHVlLCB7aW50IGNvbXBhcmUoVCBhLCBUIGIpfSkgewogIGNvbXBhcmUgPz89IGRlZmF1bHRDb21wYXJlPFQ+KCk7CiAgaW50IG1pbiA9IDA7CiAgaW50IG1heCA9IHNvcnRlZExpc3QubGVuZ3RoOwogIHdoaWxlIChtaW4gPCBtYXgpIHsKICAgIGludCBtaWQgPSBtaW4gKyAoKG1heCAtIG1pbikgPj4gMSk7CiAgICB2YXIgZWxlbWVudCA9IHNvcnRlZExpc3RbbWlkXTsKICAgIGludCBjb21wID0gY29tcGFyZShlbGVtZW50LCB2YWx1ZSk7CiAgICBpZiAoY29tcCA8IDApIHsKICAgICAgbWluID0gbWlkICsgMTsKICAgIH0gZWxzZSB7CiAgICAgIG1heCA9IG1pZDsKICAgIH0KICB9CiAgcmV0dXJuIG1pbjsKfQoKLy8vIFNodWZmbGVzIGEgbGlzdCByYW5kb21seS4KLy8vCi8vLyBBIHN1Yi1yYW5nZSBvZiBhIGxpc3QgY2FuIGJlIHNodWZmbGVkIGJ5IHByb3ZpZGluZyBbc3RhcnRdIGFuZCBbZW5kXS4Kdm9pZCBzaHVmZmxlKExpc3QgbGlzdCwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgdmFyIHJhbmRvbSA9IG5ldyBtYXRoLlJhbmRvbSgpOwogIGlmIChlbmQgPT0gbnVsbCkgZW5kID0gbGlzdC5sZW5ndGg7CiAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogIHdoaWxlIChsZW5ndGggPiAxKSB7CiAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQobGVuZ3RoKTsKICAgIGxlbmd0aC0tOwogICAgdmFyIHRtcDEgPSBsaXN0W3N0YXJ0ICsgcG9zXTsKICAgIGxpc3Rbc3RhcnQgKyBwb3NdID0gbGlzdFtzdGFydCArIGxlbmd0aF07CiAgICBsaXN0W3N0YXJ0ICsgbGVuZ3RoXSA9IHRtcDE7CiAgfQp9CgovLy8gUmV2ZXJzZXMgYSBsaXN0LCBvciBhIHBhcnQgb2YgYSBsaXN0LCBpbi1wbGFjZS4Kdm9pZCByZXZlcnNlKExpc3QgbGlzdCwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgaWYgKGVuZCA9PSBudWxsKSBlbmQgPSBsaXN0Lmxlbmd0aDsKICBfcmV2ZXJzZShsaXN0LCBzdGFydCwgZW5kKTsKfQoKLy8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbiB0aGF0IGFzc3VtZXMgdmFsaWQgYXJndW1lbnRzLgp2b2lkIF9yZXZlcnNlKExpc3QgbGlzdCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgZm9yIChpbnQgaSA9IHN0YXJ0LCBqID0gZW5kIC0gMTsgaSA8IGo7IGkrKywgai0tKSB7CiAgICB2YXIgdG1wID0gbGlzdFtpXTsKICAgIGxpc3RbaV0gPSBsaXN0W2pdOwogICAgbGlzdFtqXSA9IHRtcDsKICB9Cn0KCi8vLyBTb3J0IGEgbGlzdCBiZXR3ZWVuIFtzdGFydF0gKGluY2x1c2l2ZSkgYW5kIFtlbmRdIChleGNsdXNpdmUpIHVzaW5nCi8vLyBpbnNlcnRpb24gc29ydC4KLy8vCi8vLyBJZiBbY29tcGFyZV0gaXMgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBjYWxsaW5nIFtDb21wYXJhYmxlLmNvbXBhcmVUb10gb24KLy8vIHRoZSBvYmplY3RzLiBJZiBhbnkgb2JqZWN0IGlzIG5vdCBbQ29tcGFyYWJsZV0sIHRoaXMgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uCi8vLwovLy8gSW5zZXJ0aW9uIHNvcnQgaXMgYSBzaW1wbGUgc29ydGluZyBhbGdvcml0aG0uIEZvciBgbmAgZWxlbWVudHMgaXQgZG9lcyBvbgovLy8gdGhlIG9yZGVyIG9mIGBuICogbG9nKG4pYCBjb21wYXJpc29ucyBidXQgdXAgdG8gYG5gIHNxdWFyZWQgbW92ZXMuIFRoZQovLy8gc29ydGluZyBpcyBwZXJmb3JtZWQgaW4tcGxhY2UsIHdpdGhvdXQgdXNpbmcgZXh0cmEgbWVtb3J5LgovLy8KLy8vIEZvciBzaG9ydCBsaXN0cyB0aGUgbWFueSBtb3ZlcyBoYXZlIGxlc3MgaW1wYWN0IHRoYW4gdGhlIHNpbXBsZSBhbGdvcml0aG0sCi8vLyBhbmQgaXQgaXMgb2Z0ZW4gdGhlIGZhdm9yZWQgc29ydGluZyBhbGdvcml0aG0gZm9yIHNob3J0IGxpc3RzLgovLy8KLy8vIFRoaXMgaW5zZXJ0aW9uIHNvcnQgaXMgc3RhYmxlOiBFcXVhbCBlbGVtZW50cyBlbmQgdXAgaW4gdGhlIHNhbWUgb3JkZXIKLy8vIGFzIHRoZXkgc3RhcnRlZCBpbi4Kdm9pZCBpbnNlcnRpb25Tb3J0PFQ+KExpc3Q8VD4gbGlzdCwKICAgIHtpbnQgY29tcGFyZShUIGEsIFQgYiksIGludCBzdGFydDogMCwgaW50IGVuZH0pIHsKICAvLyBJZiB0aGUgc2FtZSBtZXRob2QgY291bGQgaGF2ZSBib3RoIHBvc2l0aW9uYWwgYW5kIG5hbWVkIG9wdGlvbmFsCiAgLy8gcGFyYW1ldGVycywgdGhpcyBzaG91bGQgYmUgKGxpc3QsIFtzdGFydCwgZW5kXSwge2NvbXBhcmV9KS4KICBjb21wYXJlID8/PSBkZWZhdWx0Q29tcGFyZTxUPigpOwogIGVuZCA/Pz0gbGlzdC5sZW5ndGg7CgogIGZvciAoaW50IHBvcyA9IHN0YXJ0ICsgMTsgcG9zIDwgZW5kOyBwb3MrKykgewogICAgaW50IG1pbiA9IHN0YXJ0OwogICAgaW50IG1heCA9IHBvczsKICAgIHZhciBlbGVtZW50ID0gbGlzdFtwb3NdOwogICAgd2hpbGUgKG1pbiA8IG1heCkgewogICAgICBpbnQgbWlkID0gbWluICsgKChtYXggLSBtaW4pID4+IDEpOwogICAgICBpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmUoZWxlbWVudCwgbGlzdFttaWRdKTsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgbWF4ID0gbWlkOwogICAgICB9IGVsc2UgewogICAgICAgIG1pbiA9IG1pZCArIDE7CiAgICAgIH0KICAgIH0KICAgIGxpc3Quc2V0UmFuZ2UobWluICsgMSwgcG9zICsgMSwgbGlzdCwgbWluKTsKICAgIGxpc3RbbWluXSA9IGVsZW1lbnQ7CiAgfQp9CgovLy8gTGltaXQgYmVsb3cgd2hpY2ggbWVyZ2Ugc29ydCBkZWZhdWx0cyB0byBpbnNlcnRpb24gc29ydC4KY29uc3QgaW50IF9NRVJHRV9TT1JUX0xJTUlUID0gMzI7CgovLy8gU29ydHMgYSBsaXN0IGJldHdlZW4gW3N0YXJ0XSAoaW5jbHVzaXZlKSBhbmQgW2VuZF0gKGV4Y2x1c2l2ZSkgdXNpbmcgdGhlCi8vLyBtZXJnZSBzb3J0IGFsZ29yaXRobS4KLy8vCi8vLyBJZiBbY29tcGFyZV0gaXMgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBjYWxsaW5nIFtDb21wYXJhYmxlLmNvbXBhcmVUb10gb24KLy8vIHRoZSBvYmplY3RzLiBJZiBhbnkgb2JqZWN0IGlzIG5vdCBbQ29tcGFyYWJsZV0sIHRoaXMgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uCi8vLwovLy8gTWVyZ2Utc29ydGluZyB3b3JrcyBieSBzcGxpdHRpbmcgdGhlIGpvYiBpbnRvIHR3byBwYXJ0cywgc29ydGluZyBlYWNoCi8vLyByZWN1cnNpdmVseSwgYW5kIHRoZW4gbWVyZ2luZyB0aGUgdHdvIHNvcnRlZCBwYXJ0cy4KLy8vCi8vLyBUaGlzIHRha2VzIG9uIHRoZSBvcmRlciBvZiBgbiAqIGxvZyhuKWAgY29tcGFyaXNvbnMgYW5kIG1vdmVzIHRvIHNvcnQKLy8vIGBuYCBlbGVtZW50cywgYnV0IHJlcXVpcmVzIGV4dHJhIHNwYWNlIG9mIGFib3V0IHRoZSBzYW1lIHNpemUgYXMgdGhlIGxpc3QKLy8vIGJlaW5nIHNvcnRlZC4KLy8vCi8vLyBUaGlzIG1lcmdlIHNvcnQgaXMgc3RhYmxlOiBFcXVhbCBlbGVtZW50cyBlbmQgdXAgaW4gdGhlIHNhbWUgb3JkZXIKLy8vIGFzIHRoZXkgc3RhcnRlZCBpbi4Kdm9pZCBtZXJnZVNvcnQ8VD4oTGlzdDxUPiBsaXN0LAogICAge2ludCBzdGFydDogMCwgaW50IGVuZCwgaW50IGNvbXBhcmUoVCBhLCBUIGIpfSkgewogIGVuZCA/Pz0gbGlzdC5sZW5ndGg7CiAgY29tcGFyZSA/Pz0gZGVmYXVsdENvbXBhcmU8VD4oKTsKCiAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogIGlmIChsZW5ndGggPCAyKSByZXR1cm47CiAgaWYgKGxlbmd0aCA8IF9NRVJHRV9TT1JUX0xJTUlUKSB7CiAgICBpbnNlcnRpb25Tb3J0KGxpc3QsIGNvbXBhcmU6IGNvbXBhcmUsIHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQpOwogICAgcmV0dXJuOwogIH0KICAvLyBTcGVjaWFsIGNhc2UgdGhlIGZpcnN0IHNwbGl0IGluc3RlYWQgb2YgZGlyZWN0bHkgY2FsbGluZwogIC8vIF9tZXJnZVNvcnQsIGJlY2F1c2UgdGhlIF9tZXJnZVNvcnQgcmVxdWlyZXMgaXRzIHRhcmdldCB0bwogIC8vIGJlIGRpZmZlcmVudCBmcm9tIGl0cyBzb3VyY2UsIGFuZCBpdCByZXF1aXJlcyBleHRyYSBzcGFjZQogIC8vIG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIGxpc3QgdG8gc29ydC4KICAvLyBUaGlzIHNwbGl0IGFsbG93cyB1cyB0byBoYXZlIG9ubHkgaGFsZiBhcyBtdWNoIGV4dHJhIHNwYWNlLAogIC8vIGFuZCBpdCBlbmRzIHVwIGluIHRoZSBvcmlnaW5hbCBwbGFjZS4KICBpbnQgbWlkZGxlID0gc3RhcnQgKyAoKGVuZCAtIHN0YXJ0KSA+PiAxKTsKICBpbnQgZmlyc3RMZW5ndGggPSBtaWRkbGUgLSBzdGFydDsKICBpbnQgc2Vjb25kTGVuZ3RoID0gZW5kIC0gbWlkZGxlOwogIC8vIHNlY29uZExlbmd0aCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgZmlyc3RMZW5ndGgsIG9yIG9uZSBncmVhdGVyLgogIHZhciBzY3JhdGNoU3BhY2UgPSBuZXcgTGlzdDxUPihzZWNvbmRMZW5ndGgpOwogIF9tZXJnZVNvcnQobGlzdCwgY29tcGFyZSwgbWlkZGxlLCBlbmQsIHNjcmF0Y2hTcGFjZSwgMCk7CiAgaW50IGZpcnN0VGFyZ2V0ID0gZW5kIC0gZmlyc3RMZW5ndGg7CiAgX21lcmdlU29ydChsaXN0LCBjb21wYXJlLCBzdGFydCwgbWlkZGxlLCBsaXN0LCBmaXJzdFRhcmdldCk7CiAgX21lcmdlKGNvbXBhcmUsIGxpc3QsIGZpcnN0VGFyZ2V0LCBlbmQsIHNjcmF0Y2hTcGFjZSwgMCwgc2Vjb25kTGVuZ3RoLCBsaXN0LAogICAgICBzdGFydCk7Cn0KCi8vLyBQZXJmb3JtcyBhbiBpbnNlcnRpb24gc29ydCBpbnRvIGEgcG90ZW50aWFsbHkgZGlmZmVyZW50IGxpc3QgdGhhbiB0aGUKLy8vIG9uZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZXMuCi8vLwovLy8gSXQgd2lsbCB3b3JrIGluLXBsYWNlIGFzIHdlbGwuCnZvaWQgX21vdmluZ0luc2VydGlvblNvcnQ8VD4oTGlzdDxUPiBsaXN0LCBpbnQgY29tcGFyZShUIGEsIFQgYiksIGludCBzdGFydCwKICAgIGludCBlbmQsIExpc3Q8VD4gdGFyZ2V0LCBpbnQgdGFyZ2V0T2Zmc2V0KSB7CiAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuOwogIHRhcmdldFt0YXJnZXRPZmZzZXRdID0gbGlzdFtzdGFydF07CiAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewogICAgdmFyIGVsZW1lbnQgPSBsaXN0W3N0YXJ0ICsgaV07CiAgICBpbnQgbWluID0gdGFyZ2V0T2Zmc2V0OwogICAgaW50IG1heCA9IHRhcmdldE9mZnNldCArIGk7CiAgICB3aGlsZSAobWluIDwgbWF4KSB7CiAgICAgIGludCBtaWQgPSBtaW4gKyAoKG1heCAtIG1pbikgPj4gMSk7CiAgICAgIGlmIChjb21wYXJlKGVsZW1lbnQsIHRhcmdldFttaWRdKSA8IDApIHsKICAgICAgICBtYXggPSBtaWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWluID0gbWlkICsgMTsKICAgICAgfQogICAgfQogICAgdGFyZ2V0LnNldFJhbmdlKG1pbiArIDEsIHRhcmdldE9mZnNldCArIGkgKyAxLCB0YXJnZXQsIG1pbik7CiAgICB0YXJnZXRbbWluXSA9IGVsZW1lbnQ7CiAgfQp9CgovLy8gU29ydHMgW2xpc3RdIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBpbnRvIFt0YXJnZXRdIGF0IFt0YXJnZXRPZmZzZXRdLgovLy8KLy8vIFRoZSBgdGFyZ2V0YCBsaXN0IG11c3QgYmUgYWJsZSB0byBjb250YWluIHRoZSByYW5nZSBmcm9tIGBzdGFydGAgdG8gYGVuZGAKLy8vIGFmdGVyIGB0YXJnZXRPZmZzZXRgLgovLy8KLy8vIEFsbG93cyB0YXJnZXQgdG8gYmUgdGhlIHNhbWUgbGlzdCBhcyBbbGlzdF0sIGFzIGxvbmcgYXMgaXQncyBub3QKLy8vIG92ZXJsYXBwaW5nIHRoZSBgc3RhcnQuLmVuZGAgcmFuZ2UuCnZvaWQgX21lcmdlU29ydDxUPihMaXN0PFQ+IGxpc3QsIGludCBjb21wYXJlKFQgYSwgVCBiKSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgTGlzdDxUPiB0YXJnZXQsIGludCB0YXJnZXRPZmZzZXQpIHsKICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgaWYgKGxlbmd0aCA8IF9NRVJHRV9TT1JUX0xJTUlUKSB7CiAgICBfbW92aW5nSW5zZXJ0aW9uU29ydChsaXN0LCBjb21wYXJlLCBzdGFydCwgZW5kLCB0YXJnZXQsIHRhcmdldE9mZnNldCk7CiAgICByZXR1cm47CiAgfQogIGludCBtaWRkbGUgPSBzdGFydCArIChsZW5ndGggPj4gMSk7CiAgaW50IGZpcnN0TGVuZ3RoID0gbWlkZGxlIC0gc3RhcnQ7CiAgaW50IHNlY29uZExlbmd0aCA9IGVuZCAtIG1pZGRsZTsKICAvLyBIZXJlIHNlY29uZExlbmd0aCA+PSBmaXJzdExlbmd0aCAoZGlmZmVycyBieSBhdCBtb3N0IG9uZSkuCiAgaW50IHRhcmdldE1pZGRsZSA9IHRhcmdldE9mZnNldCArIGZpcnN0TGVuZ3RoOwogIC8vIFNvcnQgdGhlIHNlY29uZCBoYWxmIGludG8gdGhlIGVuZCBvZiB0aGUgdGFyZ2V0IGFyZWEuCiAgX21lcmdlU29ydChsaXN0LCBjb21wYXJlLCBtaWRkbGUsIGVuZCwgdGFyZ2V0LCB0YXJnZXRNaWRkbGUpOwogIC8vIFNvcnQgdGhlIGZpcnN0IGhhbGYgaW50byB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYXJlYS4KICBfbWVyZ2VTb3J0KGxpc3QsIGNvbXBhcmUsIHN0YXJ0LCBtaWRkbGUsIGxpc3QsIG1pZGRsZSk7CiAgLy8gTWVyZ2UgdGhlIHR3byBwYXJ0cyBpbnRvIHRoZSB0YXJnZXQgYXJlYS4KICBfbWVyZ2UoY29tcGFyZSwgbGlzdCwgbWlkZGxlLCBtaWRkbGUgKyBmaXJzdExlbmd0aCwgdGFyZ2V0LCB0YXJnZXRNaWRkbGUsCiAgICAgIHRhcmdldE1pZGRsZSArIHNlY29uZExlbmd0aCwgdGFyZ2V0LCB0YXJnZXRPZmZzZXQpOwp9CgovLy8gTWVyZ2VzIHR3byBsaXN0cyBpbnRvIGEgdGFyZ2V0IGxpc3QuCi8vLwovLy8gT25lIG9mIHRoZSBpbnB1dCBsaXN0cyBtYXkgYmUgcG9zaXRpb25lZCBhdCB0aGUgZW5kIG9mIHRoZSB0YXJnZXQKLy8vIGxpc3QuCi8vLwovLy8gRm9yIGVxdWFsIG9iamVjdCwgZWxlbWVudHMgZnJvbSBbZmlyc3RMaXN0XSBhcmUgYWx3YXlzIHByZWZlcnJlZC4KLy8vIFRoaXMgYWxsb3dzIHRoZSBtZXJnZSB0byBiZSBzdGFibGUgaWYgdGhlIGZpcnN0IGxpc3QgY29udGFpbnMgZWxlbWVudHMKLy8vIHRoYXQgc3RhcnRlZCBvdXQgZWFybGllciB0aGFuIHRoZSBvbmVzIGluIFtzZWNvbmRMaXN0XQp2b2lkIF9tZXJnZTxUPigKICAgIGludCBjb21wYXJlKFQgYSwgVCBiKSwKICAgIExpc3Q8VD4gZmlyc3RMaXN0LAogICAgaW50IGZpcnN0U3RhcnQsCiAgICBpbnQgZmlyc3RFbmQsCiAgICBMaXN0PFQ+IHNlY29uZExpc3QsCiAgICBpbnQgc2Vjb25kU3RhcnQsCiAgICBpbnQgc2Vjb25kRW5kLAogICAgTGlzdDxUPiB0YXJnZXQsCiAgICBpbnQgdGFyZ2V0T2Zmc2V0KSB7CiAgLy8gTm8gZW1wdHkgbGlzdHMgcmVhY2hlcyBoZXJlLgogIGFzc2VydChmaXJzdFN0YXJ0IDwgZmlyc3RFbmQpOwogIGFzc2VydChzZWNvbmRTdGFydCA8IHNlY29uZEVuZCk7CiAgaW50IGN1cnNvcjEgPSBmaXJzdFN0YXJ0OwogIGludCBjdXJzb3IyID0gc2Vjb25kU3RhcnQ7CiAgdmFyIGZpcnN0RWxlbWVudCA9IGZpcnN0TGlzdFtjdXJzb3IxKytdOwogIHZhciBzZWNvbmRFbGVtZW50ID0gc2Vjb25kTGlzdFtjdXJzb3IyKytdOwogIHdoaWxlICh0cnVlKSB7CiAgICBpZiAoY29tcGFyZShmaXJzdEVsZW1lbnQsIHNlY29uZEVsZW1lbnQpIDw9IDApIHsKICAgICAgdGFyZ2V0W3RhcmdldE9mZnNldCsrXSA9IGZpcnN0RWxlbWVudDsKICAgICAgaWYgKGN1cnNvcjEgPT0gZmlyc3RFbmQpIGJyZWFrOyAvLyBGbHVzaGluZyBzZWNvbmQgbGlzdCBhZnRlciBsb29wLgogICAgICBmaXJzdEVsZW1lbnQgPSBmaXJzdExpc3RbY3Vyc29yMSsrXTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldFt0YXJnZXRPZmZzZXQrK10gPSBzZWNvbmRFbGVtZW50OwogICAgICBpZiAoY3Vyc29yMiAhPSBzZWNvbmRFbmQpIHsKICAgICAgICBzZWNvbmRFbGVtZW50ID0gc2Vjb25kTGlzdFtjdXJzb3IyKytdOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8vIFNlY29uZCBsaXN0IGVtcHRpZXMgZmlyc3QuIEZsdXNoaW5nIGZpcnN0IGxpc3QgaGVyZS4KICAgICAgdGFyZ2V0W3RhcmdldE9mZnNldCsrXSA9IGZpcnN0RWxlbWVudDsKICAgICAgdGFyZ2V0LnNldFJhbmdlKHRhcmdldE9mZnNldCwgdGFyZ2V0T2Zmc2V0ICsgKGZpcnN0RW5kIC0gY3Vyc29yMSksCiAgICAgICAgICBmaXJzdExpc3QsIGN1cnNvcjEpOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIC8vIEZpcnN0IGxpc3QgZW1wdGllcyBmaXJzdC4gUmVhY2hlZCBieSBicmVhayBhYm92ZS4KICB0YXJnZXRbdGFyZ2V0T2Zmc2V0KytdID0gc2Vjb25kRWxlbWVudDsKICB0YXJnZXQuc2V0UmFuZ2UoCiAgICAgIHRhcmdldE9mZnNldCwgdGFyZ2V0T2Zmc2V0ICsgKHNlY29uZEVuZCAtIGN1cnNvcjIpLCBzZWNvbmRMaXN0LCBjdXJzb3IyKTsKfQqBHQBOTjwBHAEVAUcETRYEUE8EOUwjDx8WKCMoHxQVDREGBA0CAU8NBE0WBFBPBE4SSiMPHxYoIygUFQ0RBgQOAgEeBEo0IiYcFyYOIi4hBAIBNDQmHgIBOy82FxcTBAIBSBQEUE8ETks/BE9DBEsYJDZGQSMXATAVEx0YKjQcEw8XCAYwGQQCAT0iAU0aBFBPBEo4BEpOEgRHGCA2FyMBHBokQwwEPj8/K0ErLSQjRTA7Jz9PDgIBSigEI00xHBsmJSMcIBgqLxMPFwgGQRsEAgFIBE4aBEUoTCgcJEsMBCYkI0AxO0A6Oi9MOgIBKQRGCgRGSzsQGxcUEhgVExQYIiEjHB0rLRE1LUorDS4iLxIIPi1JHw4GBDcqE1ACASZwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2FsZ29yaXRobXMuZGFydF1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL2Nhbm9uaWNhbGl6ZWRfbWFwLmRhcnSVWS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ3V0aWxzLmRhcnQnOwoKdHlwZWRlZiBDIF9DYW5vbmljYWxpemU8QywgSz4oSyBrZXkpOwoKdHlwZWRlZiBib29sIF9Jc1ZhbGlkS2V5KE9iamVjdCBrZXkpOwoKLy8vIEEgbWFwIHdob3NlIGtleXMgYXJlIGNvbnZlcnRlZCB0byBjYW5vbmljYWwgdmFsdWVzIG9mIHR5cGUgYENgLgovLy8KLy8vIFRoaXMgaXMgdXNlZnVsIGZvciB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIFN0cmluZyBrZXlzLCBmb3IgZXhhbXBsZS4gSXQncwovLy8gbW9yZSBlZmZpY2llbnQgdGhhbiBhIFtMaW5rZWRIYXNoTWFwXSB3aXRoIGEgY3VzdG9tIGVxdWFsaXR5IG9wZXJhdG9yCi8vLyBiZWNhdXNlIGl0IG9ubHkgY2Fub25pY2FsaXplcyBlYWNoIGtleSBvbmNlLCByYXRoZXIgdGhhbiBkb2luZyBzbyBmb3IgZWFjaAovLy8gY29tcGFyaXNvbi4KLy8vCi8vLyBCeSBkZWZhdWx0LCBgbnVsbGAgaXMgYWxsb3dlZCBhcyBhIGtleS4gSXQgY2FuIGJlIGZvcmJpZGRlbiB2aWEgdGhlCi8vLyBgaXNWYWxpZEtleWAgcGFyYW1ldGVyLgpjbGFzcyBDYW5vbmljYWxpemVkTWFwPEMsIEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBmaW5hbCBfQ2Fub25pY2FsaXplPEMsIEs+IF9jYW5vbmljYWxpemU7CgogIGZpbmFsIF9Jc1ZhbGlkS2V5IF9pc1ZhbGlkS2V5Rm47CgogIGZpbmFsIF9iYXNlID0gbmV3IE1hcDxDLCBQYWlyPEssIFY+PigpOwoKICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBjYW5vbmljYWxpemVkIG1hcC4KICAvLy8KICAvLy8gVGhlIFtjYW5vbmljYWxpemVdIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGNhbm9uaWNhbCB2YWx1ZSBmb3IgdGhlCiAgLy8vIGdpdmVuIGtleS4gS2V5cyB3aXRoIHRoZSBzYW1lIGNhbm9uaWNhbCB2YWx1ZSBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50LgogIC8vLwogIC8vLyBUaGUgW2lzVmFsaWRLZXldIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBbY2Fub25pY2FsaXplXSBmb3IKICAvLy8gbWV0aG9kcyB0aGF0IHRha2UgYXJiaXRyYXJ5IG9iamVjdHMuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBvdXQga2V5cwogIC8vLyB0aGF0IGNhbid0IGJlIGNhbm9uaWNhbGl6ZWQuCiAgQ2Fub25pY2FsaXplZE1hcChDIGNhbm9uaWNhbGl6ZShLIGtleSksIHtib29sIGlzVmFsaWRLZXkoT2JqZWN0IGtleSl9KQogICAgICA6IF9jYW5vbmljYWxpemUgPSBjYW5vbmljYWxpemUsCiAgICAgICAgX2lzVmFsaWRLZXlGbiA9IGlzVmFsaWRLZXk7CgogIC8vLyBDcmVhdGVzIGEgY2Fub25pY2FsaXplZCBtYXAgdGhhdCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBrZXkvdmFsdWUgcGFpcnMKICAvLy8gb2YgW290aGVyXS4KICAvLy8KICAvLy8gVGhlIFtjYW5vbmljYWxpemVdIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGNhbm9uaWNhbCB2YWx1ZSBmb3IgdGhlCiAgLy8vIGdpdmVuIGtleS4gS2V5cyB3aXRoIHRoZSBzYW1lIGNhbm9uaWNhbCB2YWx1ZSBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50LgogIC8vLwogIC8vLyBUaGUgW2lzVmFsaWRLZXldIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBbY2Fub25pY2FsaXplXSBmb3IKICAvLy8gbWV0aG9kcyB0aGF0IHRha2UgYXJiaXRyYXJ5IG9iamVjdHMuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBvdXQga2V5cwogIC8vLyB0aGF0IGNhbid0IGJlIGNhbm9uaWNhbGl6ZWQuCiAgQ2Fub25pY2FsaXplZE1hcC5mcm9tKE1hcDxLLCBWPiBvdGhlciwgQyBjYW5vbmljYWxpemUoSyBrZXkpLAogICAgICB7Ym9vbCBpc1ZhbGlkS2V5KE9iamVjdCBrZXkpfSkKICAgICAgOiBfY2Fub25pY2FsaXplID0gY2Fub25pY2FsaXplLAogICAgICAgIF9pc1ZhbGlkS2V5Rm4gPSBpc1ZhbGlkS2V5IHsKICAgIGFkZEFsbChvdGhlcik7CiAgfQoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGlmICghX2lzVmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICB2YXIgcGFpciA9IF9iYXNlW19jYW5vbmljYWxpemUoa2V5IGFzIEspXTsKICAgIHJldHVybiBwYWlyID09IG51bGwgPyBudWxsIDogcGFpci5sYXN0OwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIGlmICghX2lzVmFsaWRLZXkoa2V5KSkgcmV0dXJuOwogICAgX2Jhc2VbX2Nhbm9uaWNhbGl6ZShrZXkpXSA9IG5ldyBQYWlyKGtleSwgdmFsdWUpOwogIH0KCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSB7CiAgICBvdGhlci5mb3JFYWNoKChrZXksIHZhbHVlKSA9PiB0aGlzW2tleV0gPSB2YWx1ZSk7CiAgfQoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpID0+CiAgICAgIF9iYXNlLmFkZEVudHJpZXMoZW50cmllcy5tYXAoCiAgICAgICAgICAoZSkgPT4gbmV3IE1hcEVudHJ5KF9jYW5vbmljYWxpemUoZS5rZXkpLCBuZXcgUGFpcihlLmtleSwgZS52YWx1ZSkpKSk7CgogIE1hcDxLMiwgVjI+IGNhc3Q8SzIsIFYyPigpID0+IF9iYXNlLmNhc3Q8SzIsIFYyPigpOwoKICB2b2lkIGNsZWFyKCkgewogICAgX2Jhc2UuY2xlYXIoKTsKICB9CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgaWYgKCFfaXNWYWxpZEtleShrZXkpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX2Jhc2UuY29udGFpbnNLZXkoX2Nhbm9uaWNhbGl6ZShrZXkgYXMgSykpOwogIH0KCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4KICAgICAgX2Jhc2UudmFsdWVzLmFueSgocGFpcikgPT4gcGFpci5sYXN0ID09IHZhbHVlKTsKCiAgSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGdldCBlbnRyaWVzID0+CiAgICAgIF9iYXNlLmVudHJpZXMubWFwKChlKSA9PiBuZXcgTWFwRW50cnkoZS52YWx1ZS5maXJzdCwgZS52YWx1ZS5sYXN0KSk7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBfYmFzZS5mb3JFYWNoKChrZXksIHBhaXIpID0+IGYocGFpci5maXJzdCwgcGFpci5sYXN0KSk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IF9iYXNlLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2Jhc2UuaXNOb3RFbXB0eTsKCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4gX2Jhc2UudmFsdWVzLm1hcCgocGFpcikgPT4gcGFpci5maXJzdCk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9iYXNlLmxlbmd0aDsKCiAgTWFwPEsyLCBWMj4gbWFwPEsyLCBWMj4oTWFwRW50cnk8SzIsIFYyPiB0cmFuc2Zvcm0oSyBrZXksIFYgdmFsdWUpKSA9PgogICAgICBfYmFzZS5tYXAoKF8sIHBhaXIpID0+IHRyYW5zZm9ybShwYWlyLmZpcnN0LCBwYWlyLmxhc3QpKTsKCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICByZXR1cm4gX2Jhc2UKICAgICAgICAucHV0SWZBYnNlbnQoX2Nhbm9uaWNhbGl6ZShrZXkpLCAoKSA9PiBuZXcgUGFpcihrZXksIGlmQWJzZW50KCkpKQogICAgICAgIC5sYXN0OwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKCFfaXNWYWxpZEtleShrZXkpKSByZXR1cm4gbnVsbDsKICAgIHZhciBwYWlyID0gX2Jhc2UucmVtb3ZlKF9jYW5vbmljYWxpemUoa2V5IGFzIEspKTsKICAgIHJldHVybiBwYWlyID09IG51bGwgPyBudWxsIDogcGFpci5sYXN0OwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSA9PgogICAgICBfYmFzZS5yZW1vdmVXaGVyZSgoXywgcGFpcikgPT4gdGVzdChwYWlyLmZpcnN0LCBwYWlyLmxhc3QpKTsKCiAgQGRlcHJlY2F0ZWQKICBNYXA8SzIsIFYyPiByZXR5cGU8SzIsIFYyPigpID0+IGNhc3Q8SzIsIFYyPigpOwoKICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSA9PiBfYmFzZQogICAgICAudXBkYXRlKF9jYW5vbmljYWxpemUoa2V5KSwgKHBhaXIpID0+IG5ldyBQYWlyKGtleSwgdXBkYXRlKHBhaXIubGFzdCkpLAogICAgICAgICAgaWZBYnNlbnQ6IGlmQWJzZW50ID09IG51bGwgPyBudWxsIDogKCkgPT4gbmV3IFBhaXIoa2V5LCBpZkFic2VudCgpKSkKICAgICAgLmxhc3Q7CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgPT4gX2Jhc2UudXBkYXRlQWxsKAogICAgICAoXywgcGFpcikgPT4gbmV3IFBhaXIocGFpci5maXJzdCwgdXBkYXRlKHBhaXIuZmlyc3QsIHBhaXIubGFzdCkpKTsKCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBfYmFzZS52YWx1ZXMubWFwKChwYWlyKSA9PiBwYWlyLmxhc3QpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAvLyBEZXRlY3QgdG9TdHJpbmcoKSBjeWNsZXMuCiAgICBpZiAoX2lzVG9TdHJpbmdWaXNpdGluZyh0aGlzKSkgewogICAgICByZXR1cm4gJ3suLi59JzsKICAgIH0KCiAgICB2YXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgdHJ5IHsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcuYWRkKHRoaXMpOwogICAgICByZXN1bHQud3JpdGUoJ3snKTsKICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgIGZvckVhY2goKGssIHYpIHsKICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICByZXN1bHQud3JpdGUoJywgJyk7CiAgICAgICAgfQogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgcmVzdWx0LndyaXRlKCckazogJHYnKTsKICAgICAgfSk7CiAgICAgIHJlc3VsdC53cml0ZSgnfScpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYXNzZXJ0KGlkZW50aWNhbChfdG9TdHJpbmdWaXNpdGluZy5sYXN0LCB0aGlzKSk7CiAgICAgIF90b1N0cmluZ1Zpc2l0aW5nLnJlbW92ZUxhc3QoKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgfQoKICBib29sIF9pc1ZhbGlkS2V5KE9iamVjdCBrZXkpID0+CiAgICAgIChrZXkgPT0gbnVsbCB8fCBrZXkgaXMgSykgJiYKICAgICAgKF9pc1ZhbGlkS2V5Rm4gPT0gbnVsbCB8fCBfaXNWYWxpZEtleUZuKGtleSkpOwp9CgovLy8gQSBjb2xsZWN0aW9uIHVzZWQgdG8gaWRlbnRpZnkgY3ljbGljIG1hcHMgZHVyaW5nIHRvU3RyaW5nKCkgY2FsbHMuCmZpbmFsIExpc3QgX3RvU3RyaW5nVmlzaXRpbmcgPSBbXTsKCi8vLyBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHZpc2l0aW5nIGBvYCBpbiBhIHRvU3RyaW5nKCkgY2FsbC4KYm9vbCBfaXNUb1N0cmluZ1Zpc2l0aW5nKG8pID0+IF90b1N0cmluZ1Zpc2l0aW5nLmFueSgoZSkgPT4gaWRlbnRpY2FsKG8sIGUpKTsKgK4ATk48ARoBFQEmASYBRARNSk8QBEgcNysBIwEqASoGTE8GTE0jSSYkAU8SBkxPBkxNI0AlJiUTBAEeKC8sBAEmIzYEASE2BAE3JFEBNgEREwQBISk3BAEmNgEqSwEpPAQBJQErAUIBIgFJQAEnEUoPBAEZKDYsBAExQwEOMgE+Tk8NAT9JAUMBFiElFgYBJQojGRkXFh4KFyAKGRA3JgYBHgQBIiM1AgFHIwFBTgEtcGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0b2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb2xsZWN0aW9uL2xpYi9zcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfaXRlcmFibGUuZGFydIfZLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBBIHZpZXcgb2Ygc2V2ZXJhbCBpdGVyYWJsZXMgY29tYmluZWQgc2VxdWVudGlhbGx5IGludG8gYSBzaW5nbGUgaXRlcmFibGUuCi8vLwovLy8gQWxsIG1ldGhvZHMgYW5kIGFjY2Vzc29ycyB0cmVhdCB0aGUgW0NvbWJpbmVkSXRlcmFibGVWaWV3XSBhcyBpZiBpdCB3ZXJlIGEKLy8vIHNpbmdsZSBjb25jYXRlbmF0ZWQgaXRlcmFibGUsIGJ1dCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbgovLy8gbGF6aWx5IGFjY2Vzc2luZyBpbmRpdmlkdWFsIGl0ZXJhYmxlIGluc3RhbmNlcy4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZQovLy8gdW5kZXJseWluZyBpdGVyYWJsZXMgY2hhbmdlLCB0aGUgW0NvbWJpbmVkSXRlcmFibGVWaWV3XSB3aWxsIHJlZmxlY3QgdGhvc2UKLy8vIGNoYW5nZXMuCmNsYXNzIENvbWJpbmVkSXRlcmFibGVWaWV3PFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICAvLy8gVGhlIGl0ZXJhYmxlcyB0aGF0IHRoaXMgY29tYmluZXMuCiAgZmluYWwgSXRlcmFibGU8SXRlcmFibGU8VD4+IF9pdGVyYWJsZXM7CgogIC8vLyBDcmVhdGVzIGEgY29tYmluZWQgdmlldyBvZiBbaXRlcmFibGVzXS4KICBjb25zdCBDb21iaW5lZEl0ZXJhYmxlVmlldyh0aGlzLl9pdGVyYWJsZXMpOwoKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgPT4KICAgICAgbmV3IF9Db21iaW5lZEl0ZXJhdG9yPFQ+KF9pdGVyYWJsZXMubWFwKChpKSA9PiBpLml0ZXJhdG9yKS5pdGVyYXRvcik7CgogIC8vIFNwZWNpYWwgY2FzZWQgY29udGFpbnMvaXNFbXB0eS9sZW5ndGggc2luY2UgbWFueSBpdGVyYWJsZXMgaGF2ZSBhbgogIC8vIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhyb3VnaCB0aGUgZW50aXJlIGl0ZXJhdG9yLgoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfaXRlcmFibGVzLmFueSgoaSkgPT4gaS5jb250YWlucyhlbGVtZW50KSk7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2l0ZXJhYmxlcy5ldmVyeSgoaSkgPT4gaS5pc0VtcHR5KTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2l0ZXJhYmxlcy5mb2xkKDAsIChsZW5ndGgsIGkpID0+IGxlbmd0aCArIGkubGVuZ3RoKTsKfQoKLy8vIFRoZSBpdGVyYXRvciBmb3IgW0NvbWJpbmVkSXRlcmFibGVWaWV3XS4KLy8vCi8vLyBUaGlzIG1vdmVzIHRocm91Z2ggZWFjaCBpdGVyYWJsZSdzIGl0ZXJhdG9ycyBpbiBzZXF1ZW5jZS4KY2xhc3MgX0NvbWJpbmVkSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgLy8vIFRoZSBpdGVyYXRvcnMgdGhhdCB0aGlzIGNvbWJpbmVzLgogIC8vLwogIC8vLyBCZWNhdXNlIHRoaXMgY29tZXMgZnJvbSBhIGNhbGwgdG8gW0l0ZXJhYmxlLm1hcF0sIGl0J3MgbGF6eSBhbmQgd2lsbAogIC8vLyBhdm9pZCBpbnN0YW50aWF0aW5nIHVubmVjZXNzYXJ5IGl0ZXJhdG9ycy4KICBmaW5hbCBJdGVyYXRvcjxJdGVyYXRvcjxUPj4gX2l0ZXJhdG9yczsKCiAgX0NvbWJpbmVkSXRlcmF0b3IodGhpcy5faXRlcmF0b3JzKTsKCiAgVCBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3JzLmN1cnJlbnQ/LmN1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB2YXIgY3VycmVudCA9IF9pdGVyYXRvcnMuY3VycmVudDsKICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5tb3ZlTmV4dCgpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIF9pdGVyYXRvcnMubW92ZU5leHQoKSAmJiBtb3ZlTmV4dCgpOwogIH0KfQo5AE5OPAEaAU4ET1BLTw04KCoBLi8BHkwBSE4BTwE6AUoCAS0EPjQoBksxKgEmATABFCYxEwYwBAIBP3BhY2thZ2U6Y29sbGVjdGlvbi9zcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfaXRlcmFibGUuZGFydGtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX2xpc3QuZGFydIcpLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBBIHZpZXcgb2Ygc2V2ZXJhbCBsaXN0cyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGxpc3QuCi8vLwovLy8gQWxsIG1ldGhvZHMgYW5kIGFjY2Vzc29ycyB0cmVhdCB0aGUgW0NvbWJpbmVkTGlzdFZpZXddIGxpc3QgYXMgaWYgaXQgd2VyZSBhCi8vLyBzaW5nbGUgY29uY2F0ZW5hdGVkIGxpc3QsIGJ1dCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbgovLy8gbGF6aWx5IGFjY2Vzc2luZyBpbmRpdmlkdWFsIGxpc3QgaW5zdGFuY2VzLiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlCi8vLyB1bmRlcmx5aW5nIGxpc3RzIGNoYW5nZSwgdGhlIFtDb21iaW5lZExpc3RWaWV3XSB3aWxsIHJlZmxlY3QgdGhvc2UgY2hhbmdlcy4KLy8vCi8vLyBUaGUgaW5kZXggb3BlcmF0b3IgKGBbXWApIGFuZCBbbGVuZ3RoXSBwcm9wZXJ0eSBvZiBhIFtDb21iaW5lZExpc3RWaWV3XSBhcmUKLy8vIGJvdGggYE8obGlzdHMpYCByYXRoZXIgdGhhbiBgTygxKWAuIEEgW0NvbWJpbmVkTGlzdFZpZXddIGlzIHVubW9kaWZpYWJsZS4KY2xhc3MgQ29tYmluZWRMaXN0VmlldzxUPiBleHRlbmRzIExpc3RCYXNlPFQ+CiAgICBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZUxpc3RWaWV3PFQ+IHsKICBzdGF0aWMgdm9pZCBfdGhyb3coKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgTGlzdCcpOwogIH0KCiAgLy8vIFRoZSBsaXN0cyB0aGF0IHRoaXMgY29tYmluZXMuCiAgZmluYWwgTGlzdDxMaXN0PFQ+PiBfbGlzdHM7CgogIC8vLyBDcmVhdGVzIGEgY29tYmluZWQgdmlldyBvZiBbbGlzdHNdLgogIENvbWJpbmVkTGlzdFZpZXcodGhpcy5fbGlzdHMpOwoKICBzZXQgbGVuZ3RoKGludCBsZW5ndGgpIHsKICAgIF90aHJvdygpOwogIH0KCiAgaW50IGdldCBsZW5ndGggPT4gX2xpc3RzLmZvbGQoMCwgKGxlbmd0aCwgbGlzdCkgPT4gbGVuZ3RoICsgbGlzdC5sZW5ndGgpOwoKICBUIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgdmFyIGluaXRpYWxJbmRleCA9IGluZGV4OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbGlzdHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpc3QgPSBfbGlzdHNbaV07CiAgICAgIGlmIChpbmRleCA8IGxpc3QubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGxpc3RbaW5kZXhdOwogICAgICB9CiAgICAgIGluZGV4IC09IGxpc3QubGVuZ3RoOwogICAgfQogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5pdGlhbEluZGV4LCB0aGlzLCAnaW5kZXgnLCBudWxsLCBsZW5ndGgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBUIHZhbHVlKSB7CiAgICBfdGhyb3coKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBfdGhyb3coKTsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICBfdGhyb3coKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX3Rocm93KCk7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpKSB7CiAgICBfdGhyb3coKTsKICB9Cn0KRABOTjwBGgE5BFBMR1AEUE4uKRlGBAEkHgEqIQEbDgQBTAEdHi4cIRwIHAZLBAEqDgQBEQ4EASAOEQQBKw4EASsOBAIBO3BhY2thZ2U6Y29sbGVjdGlvbi9zcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfbGlzdC5kYXJ0N29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2NvbGxlY3Rpb25zLmRhcnQAACBkYXJ0OmNvbGxlY3Rpb24vY29sbGVjdGlvbnMuZGFydGpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0h/svLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICdjb21iaW5lZF9pdGVyYWJsZS5kYXJ0JzsKCi8vLyBSZXR1cm5zIGEgbmV3IG1hcCB0aGF0IHJlcHJlc2VudHMgbWFwcyBmbGF0dGVuZWQgaW50byBhIHNpbmdsZSBtYXAuCi8vLwovLy8gQWxsIG1ldGhvZHMgYW5kIGFjY2Vzc29ycyB0cmVhdCB0aGUgbmV3IG1hcCBhcy1pZiBpdCB3ZXJlIGEgc2luZ2xlCi8vLyBjb25jYXRlbmF0ZWQgbWFwLCBidXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gbGF6aWx5Ci8vLyBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBtYXAgaW5zdGFuY2VzLiBJbiB0aGUgb2NjYXNpb24gd2hlcmUgYSBrZXkgb2NjdXJzIGluCi8vLyBtdWx0aXBsZSBtYXBzIHRoZSBmaXJzdCB2YWx1ZSBpcyByZXR1cm5lZC4KLy8vCi8vLyBUaGUgcmVzdWx0aW5nIG1hcCBoYXMgYW4gaW5kZXggb3BlcmF0b3IgKGBbXWApIGFuZCBgbGVuZ3RoYCBwcm9wZXJ0eSB0aGF0Ci8vLyBhcmUgYm90aCBgTyhtYXBzKWAsIHJhdGhlciB0aGFuIGBPKDEpYCwgYW5kIHRoZSBtYXAgaXMgdW5tb2RpZmlhYmxlIC0gYnV0Ci8vLyB1bmRlcmx5aW5nIGNoYW5nZXMgdG8gdGhlc2UgbWFwcyBhcmUgc3RpbGwgYWNjZXNzaWJsZSBmcm9tIHRoZSByZXN1bHRpbmcKLy8vIG1hcC4KY2xhc3MgQ29tYmluZWRNYXBWaWV3PEssIFY+IGV4dGVuZHMgVW5tb2RpZmlhYmxlTWFwQmFzZTxLLCBWPiB7CiAgZmluYWwgSXRlcmFibGU8TWFwPEssIFY+PiBfbWFwczsKCiAgLy8vIENyZWF0ZSBhIG5ldyBjb21iaW5lZCB2aWV3IGludG8gbXVsdGlwbGUgbWFwcy4KICAvLy8KICAvLy8gVGhlIGl0ZXJhYmxlIGlzIGFjY2Vzc2VkIGxhemlseSBzbyBpdCBzaG91bGQgYmUgY29sbGVjdGlvbiB0eXBlIGxpa2UKICAvLy8gW0xpc3RdIG9yIFtTZXRdIHJhdGhlciB0aGFuIGEgbGF6eSBpdGVyYWJsZSBwcm9kdWNlZCBieSBgbWFwKClgIGV0IGFsLgogIENvbWJpbmVkTWFwVmlldyh0aGlzLl9tYXBzKTsKCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBmb3IgKHZhciBtYXAgaW4gX21hcHMpIHsKICAgICAgLy8gQXZvaWQgdHdvIGhhc2ggbG9va3VwcyBvbiBhIHBvc2l0aXZlIGhpdC4KICAgICAgdmFyIHZhbHVlID0gbWFwW2tleV07CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsIHx8IG1hcC5jb250YWluc0tleSh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFRoZSBrZXlzIG9mIFt0aGlzXS4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIGl0ZXJhYmxlIGhhcyBlZmZpY2llbnQgYGxlbmd0aGAgYW5kIGBjb250YWluc2Agb3BlcmF0aW9ucywKICAvLy8gYmFzZWQgb24gW2xlbmd0aF0gYW5kIFtjb250YWluc0tleV0gb2YgdGhlIGluZGl2aWR1YWwgbWFwcy4KICAvLy8KICAvLy8gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBpbmRpdmlkdWFsIGBNYXBgIGltcGxlbWVudGF0aW9ucywKICAvLy8gYnV0IG11c3QgYmUgY29uc2lzdGVudCBiZXR3ZWVuIGNoYW5nZXMgdG8gdGhlIG1hcHMuCiAgLy8vCiAgLy8vIFVubGlrZSBtb3N0IFtNYXBdIGltcGxlbWVudGF0aW9ucywgbW9kaWZ5aW5nIGFuIGluZGl2aWR1YWwgbWFwIHdoaWxlCiAgLy8vIGl0ZXJhdGluZyB0aGUga2V5cyB3aWxsIF9zb21ldGltZXNfIHRocm93LiBUaGlzIGJlaGF2aW9yIG1heSBjaGFuZ2UgaW4KICAvLy8gdGhlIGZ1dHVyZS4KICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PiBuZXcgQ29tYmluZWRJdGVyYWJsZVZpZXc8Sz4oX21hcHMubWFwKChtKSA9PiBtLmtleXMpKTsKfQo2AE5OPAEaASEBSARHS04vBE5OTQlAIwE1BktNHwEeHTMcNRYIBhEEARoGTkIGUToGS00SUQIBOnBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvY29tYmluZWRfd3JhcHBlcnMvY29tYmluZWRfbWFwLmRhcnRXZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbGxlY3Rpb24vbGliL3NyYy9jb21wYXJhdG9ycy5kYXJ0unEvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQ0KLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGENCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQoNCi8vIENoYXJhY3RlciBjb25zdGFudHMuDQpjb25zdCBpbnQgX3plcm8gPSAweDMwOw0KY29uc3QgaW50IF91cHBlckNhc2VBID0gMHg0MTsNCmNvbnN0IGludCBfdXBwZXJDYXNlWiA9IDB4NWE7DQpjb25zdCBpbnQgX2xvd2VyQ2FzZUEgPSAweDYxOw0KY29uc3QgaW50IF9sb3dlckNhc2VaID0gMHg3YTsNCmNvbnN0IGludCBfYXNjaWlDYXNlQml0ID0gMHgyMDsNCg0KLy8vIENoZWNrcyBpZiBzdHJpbmdzIFthXSBhbmQgW2JdIGRpZmZlciBvbmx5IG9uIHRoZSBjYXNlIG9mIEFTQ0lJIGxldHRlcnMuDQovLy8NCi8vLyBTdHJpbmdzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgdGhlIGNoYXJhY3RlcnMgYXQNCi8vLyBlYWNoIGluZGV4IGFyZSB0aGUgc2FtZSwgb3IgdGhleSBhcmUgQVNDSUkgbGV0dGVycyB3aGVyZSBvbmUgaXMgdXBwZXItY2FzZQ0KLy8vIGFuZCB0aGUgb3RoZXIgaXMgdGhlIGxvd2VyLWNhc2UgdmVyc2lvbiBvZiB0aGUgc2FtZSBsZXR0ZXIuDQovLy8NCi8vLyBUaGUgY29tcGFyaXNvbiBkb2VzIG5vdCBpZ25vcmUgdGhlIGNhc2Ugb2Ygbm9uLUFTQ0lJIGxldHRlcnMsIHNvDQovLy8gYW4gdXBwZXItY2FzZSBhZS1saWdhdHVyZSAow4YpIGlzIGRpZmZlcmVudCBmcm9tDQovLy8gYSBsb3dlciBjYXNlIGFlLWxpZ2F0dXJlICjDpikuDQovLy8NCi8vLyBJZ25vcmluZyBub24tQVNDSUkgbGV0dGVycyBpcyBub3QgZ2VuZXJhbGx5IGEgZ29vZCBpZGVhLCBidXQgaXQgbWFrZXMgc2Vuc2UNCi8vLyBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgc3RyaW5ncyBhcmUga25vd24gdG8gYmUgQVNDSUkuIEV4YW1wbGVzIGNvdWxkDQovLy8gYmUgRGFydCBpZGVudGlmaWVycywgYmFzZS02NCBvciBoZXggZW5jb2RlZCBzdHJpbmdzLCBHVUlEcyBvciBzaW1pbGFyDQovLy8gc3RyaW5ncyB3aXRoIGEga25vd24gc3RydWN0dXJlLg0KYm9vbCBlcXVhbHNJZ25vcmVBc2NpaUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOw0KICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsNCiAgICB2YXIgYUNoYXIgPSBhLmNvZGVVbml0QXQoaSk7DQogICAgdmFyIGJDaGFyID0gYi5jb2RlVW5pdEF0KGkpOw0KICAgIGlmIChhQ2hhciA9PSBiQ2hhcikgY29udGludWU7DQogICAgLy8gUXVpY2stY2hlY2sgZm9yIHdoZXRoZXIgdGhpcyBtYXkgYmUgZGlmZmVyZW50IGNhc2VzIG9mIHRoZSBzYW1lIGxldHRlci4NCiAgICBpZiAoYUNoYXIgXiBiQ2hhciAhPSBfYXNjaWlDYXNlQml0KSByZXR1cm4gZmFsc2U7DQogICAgLy8gSWYgaXQncyBwb3NzaWJsZSwgdGhlbiBjaGVjayBpZiBlaXRoZXIgY2hhcmFjdGVyIGlzIGFjdHVhbGx5IGFuIEFTQ0lJDQogICAgLy8gbGV0dGVyLg0KICAgIGludCBhQ2hhckxvd2VyQ2FzZSA9IGFDaGFyIHwgX2FzY2lpQ2FzZUJpdDsNCiAgICBpZiAoX2xvd2VyQ2FzZUEgPD0gYUNoYXJMb3dlckNhc2UgJiYgYUNoYXJMb3dlckNhc2UgPD0gX2xvd2VyQ2FzZVopIHsNCiAgICAgIGNvbnRpbnVlOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQogIH0NCiAgcmV0dXJuIHRydWU7DQp9DQoNCi8vLyBIYXNoIGNvZGUgZm9yIGEgc3RyaW5nIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCBbZXF1YWxzSWdub3JlQXNjaWlDYXNlXS4NCi8vLw0KLy8vIFRoZSBoYXNoIGNvZGUgaXMgdW5hZmZlY3RlZCBieSBjaGFuZ2luZyB0aGUgY2FzZSBvZiBBU0NJSSBsZXR0ZXJzLCBidXQNCi8vLyB0aGUgY2FzZSBvZiBub24tQVNDSUkgbGV0dGVycyBkbyBhZmZlY3QgdGhlIHJlc3VsdC4NCmludCBoYXNoSWdub3JlQXNjaWlDYXNlKFN0cmluZyBzdHJpbmcpIHsNCiAgLy8gSmVua2lucyBoYXNoIGNvZGUgKCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0plbmtpbnNfaGFzaF9mdW5jdGlvbikuDQogIC8vIGFkYXB0ZWQgdG8gc21pIHZhbHVlcy4NCiAgLy8gU2FtZSBoYXNoIHVzZWQgYnkgZGFydDJqcyBmb3Igc3RyaW5ncywgbW9kaWZpZWQgdG8gaWdub3JlIEFTQ0lJIGxldHRlcg0KICAvLyBjYXNlLg0KICBpbnQgaGFzaCA9IDA7DQogIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7DQogICAgaW50IGNoYXIgPSBzdHJpbmcuY29kZVVuaXRBdChpKTsNCiAgICAvLyBDb252ZXJ0IGxvd2VyLWNhc2UgQVNDSUkgbGV0dGVycyB0byB1cHBlciBjYXNlLnVwcGVyDQogICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgc3RyaW5ncyB0aGF0IGRpZmZlciBvbmx5IGluIGNhc2Ugd2lsbCBoYXZlIHRoZQ0KICAgIC8vIHNhbWUgaGFzaCBjb2RlLg0KICAgIGlmIChfbG93ZXJDYXNlQSA8PSBjaGFyICYmIGNoYXIgPD0gX2xvd2VyQ2FzZVopIGNoYXIgLT0gX2FzY2lpQ2FzZUJpdDsNCiAgICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgY2hhcik7DQogICAgaGFzaCA9IDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwMDA3ZmZmZiAmIGhhc2gpIDw8IDEwKSk7DQogICAgaGFzaCA+Pj0gNjsNCiAgfQ0KICBoYXNoID0gMHgxZmZmZmZmZiAmIChoYXNoICsgKCgweDAzZmZmZmZmICYgaGFzaCkgPDwgMykpOw0KICBoYXNoID4+PSAxMTsNCiAgcmV0dXJuIDB4MWZmZmZmZmYgJiAoaGFzaCArICgoMHgwMDAwM2ZmZiAmIGhhc2gpIDw8IDE1KSk7DQp9DQoNCi8vLyBDb21wYXJlcyBbYV0gYW5kIFtiXSBsZXhpY2FsbHksIGNvbnZlcnRpbmcgQVNDSUkgbGV0dGVycyB0byB1cHBlciBjYXNlLg0KLy8vDQovLy8gQ29tcGFyaXNvbiB0cmVhdHMgYWxsIGxvd2VyLWNhc2UgQVNDSUkgbGV0dGVycyBhcyB1cHBlci1jYXNlIGxldHRlcnMsDQovLy8gYnV0IGRvZXMgbm8gY2FzZSBjb252ZXJzaW9uIGZvciBub24tQVNDSUkgbGV0dGVycy4NCi8vLw0KLy8vIElmIHR3byBzdHJpbmdzIGRpZmZlciBvbmx5IG9uIHRoZSBjYXNlIG9mIEFTQ0lJIGxldHRlcnMsIHRoZSBvbmUgd2l0aCB0aGUNCi8vLyBjYXBpdGFsIGxldHRlciBhdCB0aGUgZmlyc3QgZGlmZmVyZW5jZSB3aWxsIGNvbXBhcmUgYXMgbGVzcyB0aGFuIHRoZSBvdGhlcg0KLy8vIHN0cmluZy4gVGhpcyB0aWUtYnJlYWtpbmcgZW5zdXJlcyB0aGF0IHRoZSBjb21wYXJpc29uIGlzIGEgdG90YWwgb3JkZXJpbmcNCi8vLyBvbiBzdHJpbmdzIGFuZCBpcyBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuDQovLy8NCi8vLyBJZ25vcmluZyBub24tQVNDSUkgbGV0dGVycyBpcyBub3QgZ2VuZXJhbGx5IGEgZ29vZCBpZGVhLCBidXQgaXQgbWFrZXMgc2Vuc2UNCi8vLyBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgc3RyaW5ncyBhcmUga25vd24gdG8gYmUgQVNDSUkuIEV4YW1wbGVzIGNvdWxkDQovLy8gYmUgRGFydCBpZGVudGlmaWVycywgYmFzZS02NCBvciBoZXggZW5jb2RlZCBzdHJpbmdzLCBHVUlEcyBvciBzaW1pbGFyDQovLy8gc3RyaW5ncyB3aXRoIGEga25vd24gc3RydWN0dXJlLg0KaW50IGNvbXBhcmVBc2NpaVVwcGVyQ2FzZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsNCiAgaW50IGRlZmF1bHRSZXN1bHQgPSAwOyAvLyBSZXR1cm5lZCBpZiBubyBkaWZmZXJlbmNlIGZvdW5kLg0KICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsNCiAgICBpZiAoaSA+PSBiLmxlbmd0aCkgcmV0dXJuIDE7DQogICAgdmFyIGFDaGFyID0gYS5jb2RlVW5pdEF0KGkpOw0KICAgIHZhciBiQ2hhciA9IGIuY29kZVVuaXRBdChpKTsNCiAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgIC8vIFVwcGVyLWNhc2UgaWYgbGV0dGVycy4NCiAgICBpbnQgYVVwcGVyQ2FzZSA9IGFDaGFyOw0KICAgIGludCBiVXBwZXJDYXNlID0gYkNoYXI7DQogICAgaWYgKF9sb3dlckNhc2VBIDw9IGFDaGFyICYmIGFDaGFyIDw9IF9sb3dlckNhc2VaKSB7DQogICAgICBhVXBwZXJDYXNlIC09IF9hc2NpaUNhc2VCaXQ7DQogICAgfQ0KICAgIGlmIChfbG93ZXJDYXNlQSA8PSBiQ2hhciAmJiBiQ2hhciA8PSBfbG93ZXJDYXNlWikgew0KICAgICAgYlVwcGVyQ2FzZSAtPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoYVVwcGVyQ2FzZSAhPSBiVXBwZXJDYXNlKSByZXR1cm4gKGFVcHBlckNhc2UgLSBiVXBwZXJDYXNlKS5zaWduOw0KICAgIGlmIChkZWZhdWx0UmVzdWx0ID09IDApIGRlZmF1bHRSZXN1bHQgPSAoYUNoYXIgLSBiQ2hhcik7DQogIH0NCiAgaWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHJldHVybiAtMTsNCiAgcmV0dXJuIGRlZmF1bHRSZXN1bHQuc2lnbjsNCn0NCg0KLy8vIENvbXBhcmVzIFthXSBhbmQgW2JdIGxleGljYWxseSwgY29udmVydGluZyBBU0NJSSBsZXR0ZXJzIHRvIGxvd2VyIGNhc2UuDQovLy8NCi8vLyBDb21wYXJpc29uIHRyZWF0cyBhbGwgdXBwZXItY2FzZSBBU0NJSSBsZXR0ZXJzIGFzIGxvd2VyLWNhc2UgbGV0dGVycywNCi8vLyBidXQgZG9lcyBubyBjYXNlIGNvbnZlcnNpb24gZm9yIG5vbi1BU0NJSSBsZXR0ZXJzLg0KLy8vDQovLy8gSWYgdHdvIHN0cmluZ3MgZGlmZmVyIG9ubHkgb24gdGhlIGNhc2Ugb2YgQVNDSUkgbGV0dGVycywgdGhlIG9uZSB3aXRoIHRoZQ0KLy8vIGNhcGl0YWwgbGV0dGVyIGF0IHRoZSBmaXJzdCBkaWZmZXJlbmNlIHdpbGwgY29tcGFyZSBhcyBsZXNzIHRoYW4gdGhlIG90aGVyDQovLy8gc3RyaW5nLiBUaGlzIHRpZS1icmVha2luZyBlbnN1cmVzIHRoYXQgdGhlIGNvbXBhcmlzb24gaXMgYSB0b3RhbCBvcmRlcmluZw0KLy8vIG9uIHN0cmluZ3MuDQovLy8NCi8vLyBJZ25vcmluZyBub24tQVNDSUkgbGV0dGVycyBpcyBub3QgZ2VuZXJhbGx5IGEgZ29vZCBpZGVhLCBidXQgaXQgbWFrZXMgc2Vuc2UNCi8vLyBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgc3RyaW5ncyBhcmUga25vd24gdG8gYmUgQVNDSUkuIEV4YW1wbGVzIGNvdWxkDQovLy8gYmUgRGFydCBpZGVudGlmaWVycywgYmFzZS02NCBvciBoZXggZW5jb2RlZCBzdHJpbmdzLCBHVUlEcyBvciBzaW1pbGFyDQovLy8gc3RyaW5ncyB3aXRoIGEga25vd24gc3RydWN0dXJlLg0KaW50IGNvbXBhcmVBc2NpaUxvd2VyQ2FzZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsNCiAgaW50IGRlZmF1bHRSZXN1bHQgPSAwOw0KICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsNCiAgICBpZiAoaSA+PSBiLmxlbmd0aCkgcmV0dXJuIDE7DQogICAgdmFyIGFDaGFyID0gYS5jb2RlVW5pdEF0KGkpOw0KICAgIHZhciBiQ2hhciA9IGIuY29kZVVuaXRBdChpKTsNCiAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgIGludCBhTG93ZXJDYXNlID0gYUNoYXI7DQogICAgaW50IGJMb3dlckNhc2UgPSBiQ2hhcjsNCiAgICAvLyBVcHBlciBjYXNlIGlmIEFTQ0lJIGxldHRlcnMuDQogICAgaWYgKF91cHBlckNhc2VBIDw9IGJDaGFyICYmIGJDaGFyIDw9IF91cHBlckNhc2VaKSB7DQogICAgICBiTG93ZXJDYXNlICs9IF9hc2NpaUNhc2VCaXQ7DQogICAgfQ0KICAgIGlmIChfdXBwZXJDYXNlQSA8PSBhQ2hhciAmJiBhQ2hhciA8PSBfdXBwZXJDYXNlWikgew0KICAgICAgYUxvd2VyQ2FzZSArPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoYUxvd2VyQ2FzZSAhPSBiTG93ZXJDYXNlKSByZXR1cm4gKGFMb3dlckNhc2UgLSBiTG93ZXJDYXNlKS5zaWduOw0KICAgIGlmIChkZWZhdWx0UmVzdWx0ID09IDApIGRlZmF1bHRSZXN1bHQgPSBhQ2hhciAtIGJDaGFyOw0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiBkZWZhdWx0UmVzdWx0LnNpZ247DQp9DQoNCi8vLyBDb21wYXJlcyBzdHJpbmdzIFthXSBhbmQgW2JdIGFjY29yZGluZyB0byBbbmF0dXJhbCBzb3J0IG9yZGVyaW5nXVtdLg0KLy8vDQovLy8gQSBuYXR1cmFsIHNvcnQgb3JkZXJpbmcgaXMgYSBsZXhpY2FsIG9yZGVyaW5nIHdoZXJlIGVtYmVkZGVkDQovLy8gbnVtZXJhbHMgKGRpZ2l0IHNlcXVlbmNlcykgYXJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBhbmQgb3JkZXJlZCBieQ0KLy8vIG51bWVyaWNhbCB2YWx1ZS4NCi8vLyBUaGlzIG1lYW5zIHRoYXQgYCJhMTBiImAgd2lsbCBiZSBvcmRlcmVkIGFmdGVyIGAiYTdiImAgaW4gbmF0dXJhbA0KLy8vIG9yZGVyaW5nLCB3aGVyZSBsZXhpY2FsIG9yZGVyaW5nIHdvdWxkIHB1dCB0aGUgYDFgIGJlZm9yZSB0aGUgYDdgLCBpZ25vcmluZw0KLy8vIHRoYXQgdGhlIGAxYCBpcyBwYXJ0IG9mIGEgbGFyZ2VyIG51bWJlci4NCi8vLw0KLy8vIEV4YW1wbGU6DQovLy8gVGhlIGZvbGxvd2luZyBzdHJpbmdzIGFyZSBpbiB0aGUgb3JkZXIgdGhleSB3b3VsZCBiZSBzb3J0ZWQgYnkgdXNpbmcgdGhpcw0KLy8vIGNvbXBhcmlzb24gZnVuY3Rpb246DQovLy8NCi8vLyAgICAgImEiLCAiYTAiLCAiYTBiIiwgImExIiwgImEwMSIsICJhOSIsICJhMTAiLCAiYTEwMCIsICJhMTAwYiIsICJhYSINCi8vLw0KLy8vIFtuYXR1cmFsIHNvcnQgb3JkZXJpbmddOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXR1cmFsX3NvcnRfb3JkZXINCmludCBjb21wYXJlTmF0dXJhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsNCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyICE9IGJDaGFyKSB7DQogICAgICByZXR1cm4gX2NvbXBhcmVOYXR1cmFsbHkoYSwgYiwgaSwgYUNoYXIsIGJDaGFyKTsNCiAgICB9DQogIH0NCiAgaWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHJldHVybiAtMTsNCiAgcmV0dXJuIDA7DQp9DQoNCi8vLyBDb21wYXJlcyBzdHJpbmdzIFthXSBhbmQgW2JdIGFjY29yZGluZyB0byBsb3dlci1jYXNlDQovLy8gW25hdHVyYWwgc29ydCBvcmRlcmluZ11bXS4NCi8vLw0KLy8vIEFTQ0lJIGxldHRlcnMgYXJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIGJlZm9yZSBiZWluZyBjb21wYXJlZCwgbGlrZQ0KLy8vIGZvciBbY29tcGFyZUFzY2lpTG93ZXJDYXNlXSwgdGhlbiB0aGUgcmVzdWx0IGlzIGNvbXBhcmVkIGxpa2UgZm9yDQovLy8gW2NvbXBhcmVOYXR1cmFsXS4NCi8vLw0KLy8vIElmIHR3byBzdHJpbmdzIGRpZmZlciBvbmx5IG9uIHRoZSBjYXNlIG9mIEFTQ0lJIGxldHRlcnMsIHRoZSBvbmUgd2l0aCB0aGUNCi8vLyBjYXBpdGFsIGxldHRlciBhdCB0aGUgZmlyc3QgZGlmZmVyZW5jZSB3aWxsIGNvbXBhcmUgYXMgbGVzcyB0aGFuIHRoZSBvdGhlcg0KLy8vIHN0cmluZy4gVGhpcyB0aWUtYnJlYWtpbmcgZW5zdXJlcyB0aGF0IHRoZSBjb21wYXJpc29uIGlzIGEgdG90YWwgb3JkZXJpbmcNCi8vLyBvbiBzdHJpbmdzLg0KLy8vDQovLy8gW25hdHVyYWwgc29ydCBvcmRlcmluZ106IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05hdHVyYWxfc29ydF9vcmRlcg0KaW50IGNvbXBhcmVBc2NpaUxvd2VyQ2FzZU5hdHVyYWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQogIGludCBkZWZhdWx0UmVzdWx0ID0gMDsgLy8gUmV0dXJuZWQgaWYgbm8gZGlmZmVyZW5jZSBmb3VuZC4NCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGkgPj0gYi5sZW5ndGgpIHJldHVybiAxOw0KICAgIHZhciBhQ2hhciA9IGEuY29kZVVuaXRBdChpKTsNCiAgICB2YXIgYkNoYXIgPSBiLmNvZGVVbml0QXQoaSk7DQogICAgaWYgKGFDaGFyID09IGJDaGFyKSBjb250aW51ZTsNCiAgICBpbnQgYUxvd2VyQ2FzZSA9IGFDaGFyOw0KICAgIGludCBiTG93ZXJDYXNlID0gYkNoYXI7DQogICAgaWYgKF91cHBlckNhc2VBIDw9IGFDaGFyICYmIGFDaGFyIDw9IF91cHBlckNhc2VaKSB7DQogICAgICBhTG93ZXJDYXNlICs9IF9hc2NpaUNhc2VCaXQ7DQogICAgfQ0KICAgIGlmIChfdXBwZXJDYXNlQSA8PSBiQ2hhciAmJiBiQ2hhciA8PSBfdXBwZXJDYXNlWikgew0KICAgICAgYkxvd2VyQ2FzZSArPSBfYXNjaWlDYXNlQml0Ow0KICAgIH0NCiAgICBpZiAoYUxvd2VyQ2FzZSAhPSBiTG93ZXJDYXNlKSB7DQogICAgICByZXR1cm4gX2NvbXBhcmVOYXR1cmFsbHkoYSwgYiwgaSwgYUxvd2VyQ2FzZSwgYkxvd2VyQ2FzZSk7DQogICAgfQ0KICAgIGlmIChkZWZhdWx0UmVzdWx0ID09IDApIGRlZmF1bHRSZXN1bHQgPSBhQ2hhciAtIGJDaGFyOw0KICB9DQogIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoKSByZXR1cm4gLTE7DQogIHJldHVybiBkZWZhdWx0UmVzdWx0LnNpZ247DQp9DQoNCi8vLyBDb21wYXJlcyBzdHJpbmdzIFthXSBhbmQgW2JdIGFjY29yZGluZyB0byB1cHBlci1jYXNlDQovLy8gW25hdHVyYWwgc29ydCBvcmRlcmluZ11bXS4NCi8vLw0KLy8vIEFTQ0lJIGxldHRlcnMgYXJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlIGJlZm9yZSBiZWluZyBjb21wYXJlZCwgbGlrZQ0KLy8vIGZvciBbY29tcGFyZUFzY2lpVXBwZXJDYXNlXSwgdGhlbiB0aGUgcmVzdWx0IGlzIGNvbXBhcmVkIGxpa2UgZm9yDQovLy8gW2NvbXBhcmVOYXR1cmFsXS4NCi8vLw0KLy8vIElmIHR3byBzdHJpbmdzIGRpZmZlciBvbmx5IG9uIHRoZSBjYXNlIG9mIEFTQ0lJIGxldHRlcnMsIHRoZSBvbmUgd2l0aCB0aGUNCi8vLyBjYXBpdGFsIGxldHRlciBhdCB0aGUgZmlyc3QgZGlmZmVyZW5jZSB3aWxsIGNvbXBhcmUgYXMgbGVzcyB0aGFuIHRoZSBvdGhlcg0KLy8vIHN0cmluZy4gVGhpcyB0aWUtYnJlYWtpbmcgZW5zdXJlcyB0aGF0IHRoZSBjb21wYXJpc29uIGlzIGEgdG90YWwgb3JkZXJpbmcNCi8vLyBvbiBzdHJpbmdzDQovLy8NCi8vLyBbbmF0dXJhbCBzb3J0IG9yZGVyaW5nXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTmF0dXJhbF9zb3J0X29yZGVyDQppbnQgY29tcGFyZUFzY2lpVXBwZXJDYXNlTmF0dXJhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsNCiAgaW50IGRlZmF1bHRSZXN1bHQgPSAwOw0KICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsNCiAgICBpZiAoaSA+PSBiLmxlbmd0aCkgcmV0dXJuIDE7DQogICAgdmFyIGFDaGFyID0gYS5jb2RlVW5pdEF0KGkpOw0KICAgIHZhciBiQ2hhciA9IGIuY29kZVVuaXRBdChpKTsNCiAgICBpZiAoYUNoYXIgPT0gYkNoYXIpIGNvbnRpbnVlOw0KICAgIGludCBhVXBwZXJDYXNlID0gYUNoYXI7DQogICAgaW50IGJVcHBlckNhc2UgPSBiQ2hhcjsNCiAgICBpZiAoX2xvd2VyQ2FzZUEgPD0gYUNoYXIgJiYgYUNoYXIgPD0gX2xvd2VyQ2FzZVopIHsNCiAgICAgIGFVcHBlckNhc2UgLT0gX2FzY2lpQ2FzZUJpdDsNCiAgICB9DQogICAgaWYgKF9sb3dlckNhc2VBIDw9IGJDaGFyICYmIGJDaGFyIDw9IF9sb3dlckNhc2VaKSB7DQogICAgICBiVXBwZXJDYXNlIC09IF9hc2NpaUNhc2VCaXQ7DQogICAgfQ0KICAgIGlmIChhVXBwZXJDYXNlICE9IGJVcHBlckNhc2UpIHsNCiAgICAgIHJldHVybiBfY29tcGFyZU5hdHVyYWxseShhLCBiLCBpLCBhVXBwZXJDYXNlLCBiVXBwZXJDYXNlKTsNCiAgICB9DQogICAgaWYgKGRlZmF1bHRSZXN1bHQgPT0gMCkgZGVmYXVsdFJlc3VsdCA9IGFDaGFyIC0gYkNoYXI7DQogIH0NCiAgaWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHJldHVybiAtMTsNCiAgcmV0dXJuIGRlZmF1bHRSZXN1bHQuc2lnbjsNCn0NCg0KLy8vIENoZWNrIGZvciBudW1iZXJzIG92ZXJsYXBwaW5nIHRoZSBjdXJyZW50IG1pc21hdGNoZWQgY2hhcmFjdGVycy4NCi8vLw0KLy8vIElmIGJvdGggW2FDaGFyXSBhbmQgW2JDaGFyXSBhcmUgZGlnaXRzLCB1c2UgbnVtZXJpY2FsIGNvbXBhcmlzb24uDQovLy8gQ2hlY2sgaWYgdGhlIHByZXZpb3VzIGNoYXJhY3RlcnMgaXMgYSBub24temVybyBudW1iZXIsIGFuZCBpZiBub3QsDQovLy8gc2tpcCAtIGJ1dCBjb3VudCAtIGxlYWRpbmcgemVyb3MgYmVmb3JlIGNvbXBhcmluZyBudW1iZXJzLg0KLy8vDQovLy8gSWYgb25lIGlzIGEgZGlnaXQgYW5kIHRoZSBvdGhlciBpc24ndCwgY2hlY2sgaWYgdGhlIHByZXZpb3VzIGNoYXJhY3Rlcg0KLy8vIGlzIGEgZGlnaXQsIGFuZCBpZiBzbywgdGhlIHRoZSBvbmUgd2l0aCB0aGUgZGlnaXQgaXMgdGhlIGdyZWF0ZXIgbnVtYmVyLg0KLy8vDQovLy8gT3RoZXJ3aXNlIGp1c3QgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFthQ2hhcl0gYW5kIFtiQ2hhcl0uDQppbnQgX2NvbXBhcmVOYXR1cmFsbHkoU3RyaW5nIGEsIFN0cmluZyBiLCBpbnQgaW5kZXgsIGludCBhQ2hhciwgaW50IGJDaGFyKSB7DQogIGFzc2VydChhQ2hhciAhPSBiQ2hhcik7DQogIHZhciBhSXNEaWdpdCA9IF9pc0RpZ2l0KGFDaGFyKTsNCiAgdmFyIGJJc0RpZ2l0ID0gX2lzRGlnaXQoYkNoYXIpOw0KICBpZiAoYUlzRGlnaXQpIHsNCiAgICBpZiAoYklzRGlnaXQpIHsNCiAgICAgIHJldHVybiBfY29tcGFyZU51bWVyaWNhbGx5KGEsIGIsIGFDaGFyLCBiQ2hhciwgaW5kZXgpOw0KICAgIH0gZWxzZSBpZiAoaW5kZXggPiAwICYmIF9pc0RpZ2l0KGEuY29kZVVuaXRBdChpbmRleCAtIDEpKSkgew0KICAgICAgLy8gYUNoYXIgaXMgdGhlIGNvbnRpbnVhdGlvbiBvZiBhIGxvbmdlciBudW1iZXIuDQogICAgICByZXR1cm4gMTsNCiAgICB9DQogIH0gZWxzZSBpZiAoYklzRGlnaXQgJiYgaW5kZXggPiAwICYmIF9pc0RpZ2l0KGIuY29kZVVuaXRBdChpbmRleCAtIDEpKSkgew0KICAgIC8vIGJDaGFyIGlzIHRoZSBjb250aW51YXRpb24gb2YgYSBsb25nZXIgbnVtYmVyLg0KICAgIHJldHVybiAtMTsNCiAgfQ0KICAvLyBDaGFyYWN0ZXJzIGFyZSBib3RoIG5vbi1kaWdpdHMsIG9yIG5vdCBjb250aW51YXRpb24gb2YgZWFybGllciBudW1iZXIuDQogIHJldHVybiAoYUNoYXIgLSBiQ2hhcikuc2lnbjsNCn0NCg0KLy8vIENvbXBhcmUgbnVtYmVycyBvdmVybGFwcGluZyBbYUNoYXJdIGFuZCBbYkNoYXJdIG51bWVyaWNhbGx5Lg0KLy8vDQovLy8gSWYgdGhlIG51bWJlcnMgaGF2ZSB0aGUgc2FtZSBudW1lcmljYWwgdmFsdWUsIGJ1dCBvbmUgaGFzIG1vcmUgbGVhZGluZw0KLy8vIHplcm9zLCB0aGUgbG9uZ2VyIG51bWJlciBpcyBjb25zaWRlcmVkIGdyZWF0ZXIgdGhhbiB0aGUgc2hvcnRlciBvbmUuDQovLy8NCi8vLyBUaGlzIGVuc3VyZXMgYSB0b3RhbCBvcmRlcmluZyBvbiBzdHJpbmdzIGNvbXBhdGlibGUgd2l0aCBlcXVhbGl0eS4NCmludCBfY29tcGFyZU51bWVyaWNhbGx5KFN0cmluZyBhLCBTdHJpbmcgYiwgaW50IGFDaGFyLCBpbnQgYkNoYXIsIGludCBpbmRleCkgew0KICAvLyBCb3RoIGFyZSBkaWdpdHMuIEZpbmQgdGhlIGZpcnN0IHNpZ25pZmljYW50IGRpZmZlcmVudCBkaWdpdCwgdGhlbiBmaW5kDQogIC8vIHRoZSBsZW5ndGggb2YgdGhlIG51bWJlcnMuDQogIGlmIChfaXNOb25aZXJvTnVtYmVyU3VmZml4KGEsIGluZGV4KSkgew0KICAgIC8vIFBhcnQgb2YgYSBsb25nZXIgbnVtYmVyLCBkaWZmZXJzIGF0IHRoaXMgaW5kZXgsIGp1c3QgY291bnQgdGhlIGxlbmd0aC4NCiAgICBpbnQgcmVzdWx0ID0gX2NvbXBhcmVEaWdpdENvdW50KGEsIGIsIGluZGV4LCBpbmRleCk7DQogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0Ow0KICAgIC8vIElmIHNhbWUgbGVuZ3RoLCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlmZmVyaW5nDQogICAgLy8gZGlnaXQuDQogICAgcmV0dXJuIChhQ2hhciAtIGJDaGFyKS5zaWduOw0KICB9DQogIC8vIE5vdCBwYXJ0IG9mIGxhcmdlciAobm9uLXplcm8pIG51bWJlciwgc28gc2tpcCBsZWFkaW5nIHplcm9zIGJlZm9yZQ0KICAvLyBjb21wYXJpbmcgbnVtYmVycy4NCiAgaW50IGFJbmRleCA9IGluZGV4Ow0KICBpbnQgYkluZGV4ID0gaW5kZXg7DQogIGlmIChhQ2hhciA9PSBfemVybykgew0KICAgIGRvIHsNCiAgICAgIGFJbmRleCsrOw0KICAgICAgaWYgKGFJbmRleCA9PSBhLmxlbmd0aCkgcmV0dXJuIC0xOyAvLyBudW1iZXIgaW4gYSBpcyB6ZXJvLCBiIGlzIG5vdC4NCiAgICAgIGFDaGFyID0gYS5jb2RlVW5pdEF0KGFJbmRleCk7DQogICAgfSB3aGlsZSAoYUNoYXIgPT0gX3plcm8pOw0KICAgIGlmICghX2lzRGlnaXQoYUNoYXIpKSByZXR1cm4gLTE7DQogIH0gZWxzZSBpZiAoYkNoYXIgPT0gX3plcm8pIHsNCiAgICBkbyB7DQogICAgICBiSW5kZXgrKzsNCiAgICAgIGlmIChiSW5kZXggPT0gYi5sZW5ndGgpIHJldHVybiAxOyAvLyBudW1iZXIgaW4gYiBpcyB6ZXJvLCBhIGlzIG5vdC4NCiAgICAgIGJDaGFyID0gYi5jb2RlVW5pdEF0KGJJbmRleCk7DQogICAgfSB3aGlsZSAoYkNoYXIgPT0gX3plcm8pOw0KICAgIGlmICghX2lzRGlnaXQoYkNoYXIpKSByZXR1cm4gMTsNCiAgfQ0KICBpZiAoYUNoYXIgIT0gYkNoYXIpIHsNCiAgICBpbnQgcmVzdWx0ID0gX2NvbXBhcmVEaWdpdENvdW50KGEsIGIsIGFJbmRleCwgYkluZGV4KTsNCiAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7DQogICAgcmV0dXJuIChhQ2hhciAtIGJDaGFyKS5zaWduOw0KICB9DQogIC8vIFNhbWUgbGVhZGluZyBkaWdpdCwgb25lIGhhZCBtb3JlIGxlYWRpbmcgemVyb3MuDQogIC8vIENvbXBhcmUgZGlnaXRzIHVudGlsIHJlYWNoaW5nIGEgZGlmZmVyZW5jZS4NCiAgd2hpbGUgKHRydWUpIHsNCiAgICB2YXIgYUlzRGlnaXQgPSBmYWxzZTsNCiAgICB2YXIgYklzRGlnaXQgPSBmYWxzZTsNCiAgICBhQ2hhciA9IDA7DQogICAgYkNoYXIgPSAwOw0KICAgIGlmICgrK2FJbmRleCA8IGEubGVuZ3RoKSB7DQogICAgICBhQ2hhciA9IGEuY29kZVVuaXRBdChhSW5kZXgpOw0KICAgICAgYUlzRGlnaXQgPSBfaXNEaWdpdChhQ2hhcik7DQogICAgfQ0KICAgIGlmICgrK2JJbmRleCA8IGIubGVuZ3RoKSB7DQogICAgICBiQ2hhciA9IGIuY29kZVVuaXRBdChiSW5kZXgpOw0KICAgICAgYklzRGlnaXQgPSBfaXNEaWdpdChiQ2hhcik7DQogICAgfQ0KICAgIGlmIChhSXNEaWdpdCkgew0KICAgICAgaWYgKGJJc0RpZ2l0KSB7DQogICAgICAgIGlmIChhQ2hhciA9PSBiQ2hhcikgY29udGludWU7DQogICAgICAgIC8vIEZpcnN0IGRpZmZlcmVudCBkaWdpdCBmb3VuZC4NCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgICAvLyBiQ2hhciBpcyBub24tZGlnaXQsIHNvIGEgaGFzIGxvbmdlciBudW1iZXIuDQogICAgICByZXR1cm4gMTsNCiAgICB9IGVsc2UgaWYgKGJJc0RpZ2l0KSB7DQogICAgICByZXR1cm4gLTE7IC8vIGIgaGFzIGxvbmdlciBudW1iZXIuDQogICAgfSBlbHNlIHsNCiAgICAgIC8vIE5laXRoZXIgaXMgZGlnaXQsIHNvIG51bWJlcnMgaGFkIHNhbWUgbnVtZXJpY2FsIHZhbHVlLg0KICAgICAgLy8gRmFsbCBiYWNrIG9uIG51bWJlciBvZiBsZWFkaW5nIHplcm9zDQogICAgICAvLyAocmVmbGVjdGVkIGJ5IGRpZmZlcmVuY2UgaW4gaW5kaWNlcykuDQogICAgICByZXR1cm4gKGFJbmRleCAtIGJJbmRleCkuc2lnbjsNCiAgICB9DQogIH0NCiAgLy8gQXQgZmlyc3QgZGlmZmVyaW5nIGRpZ2l0cy4NCiAgaW50IHJlc3VsdCA9IF9jb21wYXJlRGlnaXRDb3VudChhLCBiLCBhSW5kZXgsIGJJbmRleCk7DQogIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsNCiAgcmV0dXJuIChhQ2hhciAtIGJDaGFyKS5zaWduOw0KfQ0KDQovLy8gQ2hlY2tzIHdoaWNoIG9mIFthXSBhbmQgW2JdIGhhcyB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiBkaWdpdHMuDQovLy8NCi8vLyBTdGFydHMgY291bnRpbmcgZnJvbSBgaSArIDFgIGFuZCBgaiArIDFgIChhc3N1bWVzIHRoYXQgYGFbaV1gIGFuZCBgYltqXWAgYXJlDQovLy8gYm90aCBhbHJlYWR5IGtub3duIHRvIGJlIGRpZ2l0cykuDQppbnQgX2NvbXBhcmVEaWdpdENvdW50KFN0cmluZyBhLCBTdHJpbmcgYiwgaW50IGksIGludCBqKSB7DQogIHdoaWxlICgrK2kgPCBhLmxlbmd0aCkgew0KICAgIGJvb2wgYUlzRGlnaXQgPSBfaXNEaWdpdChhLmNvZGVVbml0QXQoaSkpOw0KICAgIGlmICgrK2ogPT0gYi5sZW5ndGgpIHJldHVybiBhSXNEaWdpdCA/IDEgOiAwOw0KICAgIGJvb2wgYklzRGlnaXQgPSBfaXNEaWdpdChiLmNvZGVVbml0QXQoaikpOw0KICAgIGlmIChhSXNEaWdpdCkg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ciBlcXVhbGl0eSByZWxhdGlvbi4KICBib29sIGVxdWFscyhFIGUxLCBFIGUyKTsKCiAgLy8vIEdldCBhIGhhc2hjb2RlIG9mIGFuIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSBoYXNoY29kZSBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIFtlcXVhbHNdLCBzbyB0aGF0IGlmCiAgLy8vIGBlcXVhbHMoYSwgYilgIHRoZW4gYGhhc2goYSkgPT0gaGFzaChiKWAuCiAgaW50IGhhc2goRSBlKTsKCiAgLy8vIFRlc3Qgd2hldGhlciBhbiBvYmplY3QgaXMgYSB2YWxpZCBhcmd1bWVudCB0byBbZXF1YWxzXSBhbmQgW2hhc2hdLgogIC8vLwogIC8vLyBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgYmUgcmVzdHJpY3RlZCB0byBvbmx5IHdvcmsgb24gc3BlY2lmaWMgdHlwZXMKICAvLy8gb2Ygb2JqZWN0cy4KICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pOwp9Cgp0eXBlZGVmIEYgX0dldEtleTxFLCBGPihFIG9iamVjdCk7CgovLy8gRXF1YWxpdHkgb2Ygb2JqZWN0cyBiYXNlZCBvbiBkZXJpdmVkIHZhbHVlcy4KLy8vCi8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIGNsYXNzOgovLy8gYGBgZGFydAovLy8gYWJzdHJhY3QgY2xhc3MgRW1wbG95ZWUgewovLy8gICBpbnQgZ2V0IGVtcGxveW1lbnRJZDsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFRoZSBmb2xsb3dpbmcgW0VxdWFsaXR5XSBjb25zaWRlcnMgZW1wbG95ZWVzIHdpdGggdGhlIHNhbWUgSURzIHRvIGJlIGVxdWFsOgovLy8gYGBgZGFydAovLy8gbmV3IEVxdWFsaXR5QnkoKEVtcGxveWVlIGUpID0+IGUuZW1wbG95bWVudElkKTsKLy8vIGBgYAovLy8KLy8vIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGFuIGFkZGl0aW9uYWwgZXF1YWxpdHkgaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUKLy8vIHVzZWQgdG8gY29tcGFyZSB0aGUgdmFsdWUgaXRzZWxmLgpjbGFzcyBFcXVhbGl0eUJ5PEUsIEY+IGltcGxlbWVudHMgRXF1YWxpdHk8RT4gewogIC8vIFJldHVybnMgYSBkZXJpdmVkIHZhbHVlIEYgZnJvbSBhbiBvYmplY3QgRS4KICBmaW5hbCBfR2V0S2V5PEUsIEY+IF9nZXRLZXk7CgogIC8vIERldGVybWluZXMgZXF1YWxpdHkgYmV0d2VlbiB0d28gdmFsdWVzIG9mIEYuCiAgZmluYWwgRXF1YWxpdHk8Rj4gX2lubmVyOwoKICBFcXVhbGl0eUJ5KEYgZ2V0S2V5KEUgb2JqZWN0KSwgW0VxdWFsaXR5PEY+IGlubmVyID0gY29uc3QgRGVmYXVsdEVxdWFsaXR5KCldKQogICAgICA6IF9nZXRLZXkgPSBnZXRLZXksCiAgICAgICAgX2lubmVyID0gaW5uZXI7CgogIGJvb2wgZXF1YWxzKEUgZTEsIEUgZTIpID0+IF9pbm5lci5lcXVhbHMoX2dldEtleShlMSksIF9nZXRLZXkoZTIpKTsKCiAgaW50IGhhc2goRSBlKSA9PiBfaW5uZXIuaGFzaChfZ2V0S2V5KGUpKTsKCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSB7CiAgICBpZiAobyBpcyBFKSB7CiAgICAgIGZpbmFsIHZhbHVlID0gX2dldEtleShvKTsKICAgICAgcmV0dXJuIHZhbHVlIGlzIEYgJiYgX2lubmVyLmlzVmFsaWRLZXkodmFsdWUpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKLy8vIEVxdWFsaXR5IG9mIG9iamVjdHMgdGhhdCBjb21wYXJlcyBvbmx5IHRoZSBuYXR1cmFsIGVxdWFsaXR5IG9mIHRoZSBvYmplY3RzLgovLy8KLy8vIFRoaXMgZXF1YWxpdHkgdXNlcyB0aGUgb2JqZWN0cycgb3duIFtPYmplY3QuPT1dIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXSBmb3IKLy8vIHRoZSBlcXVhbGl0eS4KLy8vCi8vLyBOb3RlIHRoYXQgW2VxdWFsc10gYW5kIFtoYXNoXSB0YWtlIGBPYmplY3RgcyByYXRoZXIgdGhhbiBgRWBzLiBUaGlzIGFsbG93cwovLy8gYEVgIHRvIGJlIGluZmVycmVkIGFzIGBOdWxsYCBpbiBjb25zdCBjb250ZXh0cyB3aGVyZSBgRWAgd291bGRuJ3QgYmUgYQovLy8gY29tcGlsZS10aW1lIGNvbnN0YW50LCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgY2xhc3MgdG8gYmUgdXNlZCBhdCBydW50aW1lLgpjbGFzcyBEZWZhdWx0RXF1YWxpdHk8RT4gaW1wbGVtZW50cyBFcXVhbGl0eTxFPiB7CiAgY29uc3QgRGVmYXVsdEVxdWFsaXR5KCk7CiAgYm9vbCBlcXVhbHMoT2JqZWN0IGUxLCBPYmplY3QgZTIpID0+IGUxID09IGUyOwogIGludCBoYXNoKE9iamVjdCBlKSA9PiBlLmhhc2hDb2RlOwogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gdHJ1ZTsKfQoKLy8vIEVxdWFsaXR5IG9mIG9iamVjdHMgdGhhdCBjb21wYXJlcyBvbmx5IHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0cy4KY2xhc3MgSWRlbnRpdHlFcXVhbGl0eTxFPiBpbXBsZW1lbnRzIEVxdWFsaXR5PEU+IHsKICBjb25zdCBJZGVudGl0eUVxdWFsaXR5KCk7CiAgYm9vbCBlcXVhbHMoRSBlMSwgRSBlMikgPT4gaWRlbnRpY2FsKGUxLCBlMik7CiAgaW50IGhhc2goRSBlKSA9PiBpZGVudGl0eUhhc2hDb2RlKGUpOwogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gdHJ1ZTsKfQoKLy8vIEVxdWFsaXR5IG9uIGl0ZXJhYmxlcy4KLy8vCi8vLyBUd28gaXRlcmFibGVzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCi8vLwovLy8gVGhlIFtlcXVhbHNdIGFuZCBbaGFzaF0gbWV0aG9kcyBhY2NlcHRzIGBudWxsYCB2YWx1ZXMsCi8vLyBldmVuIGlmIHRoZSBbaXNWYWxpZEtleV0gcmV0dXJucyBgZmFsc2VgIGZvciBgbnVsbGAuCi8vLyBUaGUgW2hhc2hdIG9mIGBudWxsYCBpcyBgbnVsbC5oYXNoQ29kZWAuCmNsYXNzIEl0ZXJhYmxlRXF1YWxpdHk8RT4gaW1wbGVtZW50cyBFcXVhbGl0eTxJdGVyYWJsZTxFPj4gewogIGZpbmFsIEVxdWFsaXR5PEU+IF9lbGVtZW50RXF1YWxpdHk7CiAgY29uc3QgSXRlcmFibGVFcXVhbGl0eSgKICAgICAgW0VxdWFsaXR5PEU+IGVsZW1lbnRFcXVhbGl0eSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfZWxlbWVudEVxdWFsaXR5ID0gZWxlbWVudEVxdWFsaXR5OwoKICBib29sIGVxdWFscyhJdGVyYWJsZTxFPiBlbGVtZW50czEsIEl0ZXJhYmxlPEU+IGVsZW1lbnRzMikgewogICAgaWYgKGlkZW50aWNhbChlbGVtZW50czEsIGVsZW1lbnRzMikpIHJldHVybiB0cnVlOwogICAgaWYgKGVsZW1lbnRzMSA9PSBudWxsIHx8IGVsZW1lbnRzMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgaXQxID0gZWxlbWVudHMxLml0ZXJhdG9yOwogICAgdmFyIGl0MiA9IGVsZW1lbnRzMi5pdGVyYXRvcjsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGJvb2wgaGFzTmV4dCA9IGl0MS5tb3ZlTmV4dCgpOwogICAgICBpZiAoaGFzTmV4dCAhPSBpdDIubW92ZU5leHQoKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoIWhhc05leHQpIHJldHVybiB0cnVlOwogICAgICBpZiAoIV9lbGVtZW50RXF1YWxpdHkuZXF1YWxzKGl0MS5jdXJyZW50LCBpdDIuY3VycmVudCkpIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGludCBoYXNoKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGwuaGFzaENvZGU7CiAgICAvLyBKZW5raW5zJ3Mgb25lLWF0LWEtdGltZSBoYXNoIGZ1bmN0aW9uLgogICAgaW50IGhhc2ggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaW50IGMgPSBfZWxlbWVudEVxdWFsaXR5Lmhhc2goZWxlbWVudCk7CiAgICAgIGhhc2ggPSAoaGFzaCArIGMpICYgX0hBU0hfTUFTSzsKICAgICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMTApKSAmIF9IQVNIX01BU0s7CiAgICAgIGhhc2ggXj0gKGhhc2ggPj4gNik7CiAgICB9CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAzKSkgJiBfSEFTSF9NQVNLOwogICAgaGFzaCBePSAoaGFzaCA+PiAxMSk7CiAgICBoYXNoID0gKGhhc2ggKyAoaGFzaCA8PCAxNSkpICYgX0hBU0hfTUFTSzsKICAgIHJldHVybiBoYXNoOwogIH0KCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSA9PiBvIGlzIEl0ZXJhYmxlPEU+Owp9CgovLy8gRXF1YWxpdHkgb24gbGlzdHMuCi8vLwovLy8gVHdvIGxpc3RzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGVpciBlbGVtZW50cwovLy8gYXQgZWFjaCBpbmRleCBhcmUgZXF1YWwuCi8vLwovLy8gVGhpcyBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyBbSXRlcmFibGVFcXVhbGl0eV0gZXhjZXB0IHRoYXQgaXQKLy8vIGFjY2Vzc2VzIGVsZW1lbnRzIGJ5IGluZGV4IGluc3RlYWQgb2YgdGhyb3VnaCBpdGVyYXRpb24uCi8vLwovLy8gVGhlIFtlcXVhbHNdIGFuZCBbaGFzaF0gbWV0aG9kcyBhY2NlcHRzIGBudWxsYCB2YWx1ZXMsCi8vLyBldmVuIGlmIHRoZSBbaXNWYWxpZEtleV0gcmV0dXJucyBgZmFsc2VgIGZvciBgbnVsbGAuCi8vLyBUaGUgW2hhc2hdIG9mIGBudWxsYCBpcyBgbnVsbC5oYXNoQ29kZWAuCmNsYXNzIExpc3RFcXVhbGl0eTxFPiBpbXBsZW1lbnRzIEVxdWFsaXR5PExpc3Q8RT4+IHsKICBmaW5hbCBFcXVhbGl0eTxFPiBfZWxlbWVudEVxdWFsaXR5OwogIGNvbnN0IExpc3RFcXVhbGl0eShbRXF1YWxpdHk8RT4gZWxlbWVudEVxdWFsaXR5ID0gY29uc3QgRGVmYXVsdEVxdWFsaXR5KCldKQogICAgICA6IF9lbGVtZW50RXF1YWxpdHkgPSBlbGVtZW50RXF1YWxpdHk7CgogIGJvb2wgZXF1YWxzKExpc3Q8RT4gbGlzdDEsIExpc3Q8RT4gbGlzdDIpIHsKICAgIGlmIChpZGVudGljYWwobGlzdDEsIGxpc3QyKSkgcmV0dXJuIHRydWU7CiAgICBpZiAobGlzdDEgPT0gbnVsbCB8fCBsaXN0MiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpbnQgbGVuZ3RoID0gbGlzdDEubGVuZ3RoOwogICAgaWYgKGxlbmd0aCAhPSBsaXN0Mi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFfZWxlbWVudEVxdWFsaXR5LmVxdWFscyhsaXN0MVtpXSwgbGlzdDJbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGludCBoYXNoKExpc3Q8RT4gbGlzdCkgewogICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGwuaGFzaENvZGU7CiAgICAvLyBKZW5raW5zJ3Mgb25lLWF0LWEtdGltZSBoYXNoIGZ1bmN0aW9uLgogICAgLy8gVGhpcyBjb2RlIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIG9uZSBpbiBJdGVyYWJsZUVxdWFsaXR5LCBleGNlcHQKICAgIC8vIHRoYXQgaXQgdXNlcyBpbmRleGluZyBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0byBnZXQgdGhlIGVsZW1lbnRzLgogICAgaW50IGhhc2ggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBjID0gX2VsZW1lbnRFcXVhbGl0eS5oYXNoKGxpc3RbaV0pOwogICAgICBoYXNoID0gKGhhc2ggKyBjKSAmIF9IQVNIX01BU0s7CiAgICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDEwKSkgJiBfSEFTSF9NQVNLOwogICAgICBoYXNoIF49IChoYXNoID4+IDYpOwogICAgfQogICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMykpICYgX0hBU0hfTUFTSzsKICAgIGhhc2ggXj0gKGhhc2ggPj4gMTEpOwogICAgaGFzaCA9IChoYXNoICsgKGhhc2ggPDwgMTUpKSAmIF9IQVNIX01BU0s7CiAgICByZXR1cm4gaGFzaDsKICB9CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gbyBpcyBMaXN0PEU+Owp9CgphYnN0cmFjdCBjbGFzcyBfVW5vcmRlcmVkRXF1YWxpdHk8RSwgVCBleHRlbmRzIEl0ZXJhYmxlPEU+PgogICAgaW1wbGVtZW50cyBFcXVhbGl0eTxUPiB7CiAgZmluYWwgRXF1YWxpdHk8RT4gX2VsZW1lbnRFcXVhbGl0eTsKCiAgY29uc3QgX1Vub3JkZXJlZEVxdWFsaXR5KHRoaXMuX2VsZW1lbnRFcXVhbGl0eSk7CgogIGJvb2wgZXF1YWxzKFQgZWxlbWVudHMxLCBUIGVsZW1lbnRzMikgewogICAgaWYgKGlkZW50aWNhbChlbGVtZW50czEsIGVsZW1lbnRzMikpIHJldHVybiB0cnVlOwogICAgaWYgKGVsZW1lbnRzMSA9PSBudWxsIHx8IGVsZW1lbnRzMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBIYXNoTWFwPEUsIGludD4gY291bnRzID0gbmV3IEhhc2hNYXAoCiAgICAgICAgZXF1YWxzOiBfZWxlbWVudEVxdWFsaXR5LmVxdWFscywKICAgICAgICBoYXNoQ29kZTogX2VsZW1lbnRFcXVhbGl0eS5oYXNoLAogICAgICAgIGlzVmFsaWRLZXk6IF9lbGVtZW50RXF1YWxpdHkuaXNWYWxpZEtleSk7CiAgICBpbnQgbGVuZ3RoID0gMDsKICAgIGZvciAodmFyIGUgaW4gZWxlbWVudHMxKSB7CiAgICAgIGludCBjb3VudCA9IGNvdW50c1tlXTsKICAgICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMDsKICAgICAgY291bnRzW2VdID0gY291bnQgKyAxOwogICAgICBsZW5ndGgrKzsKICAgIH0KICAgIGZvciAodmFyIGUgaW4gZWxlbWVudHMyKSB7CiAgICAgIGludCBjb3VudCA9IGNvdW50c1tlXTsKICAgICAgaWYgKGNvdW50ID09IG51bGwgfHwgY291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICBjb3VudHNbZV0gPSBjb3VudCAtIDE7CiAgICAgIGxlbmd0aC0tOwogICAgfQogICAgcmV0dXJuIGxlbmd0aCA9PSAwOwogIH0KCiAgaW50IGhhc2goVCBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzID09IG51bGwpIHJldHVybiBudWxsLmhhc2hDb2RlOwogICAgaW50IGhhc2ggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaW50IGMgPSBfZWxlbWVudEVxdWFsaXR5Lmhhc2goZWxlbWVudCk7CiAgICAgIGhhc2ggPSAoaGFzaCArIGMpICYgX0hBU0hfTUFTSzsKICAgIH0KICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDMpKSAmIF9IQVNIX01BU0s7CiAgICBoYXNoIF49IChoYXNoID4+IDExKTsKICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDE1KSkgJiBfSEFTSF9NQVNLOwogICAgcmV0dXJuIGhhc2g7CiAgfQp9CgovLy8gRXF1YWxpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIHR3byBpdGVyYWJsZXMgd2l0aG91dCBjb25zaWRlcmluZyBvcmRlci4KLy8vCi8vLyBUd28gaXRlcmFibGVzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMsCi8vLyBhbmQgdGhlIGVsZW1lbnRzIG9mIG9uZSBzZXQgY2FuIGJlIHBhaXJlZCB3aXRoIHRoZSBlbGVtZW50cwovLy8gb2YgdGhlIG90aGVyIGl0ZXJhYmxlLCBzbyB0aGF0IGVhY2ggcGFpciBhcmUgZXF1YWwuCmNsYXNzIFVub3JkZXJlZEl0ZXJhYmxlRXF1YWxpdHk8RT4gZXh0ZW5kcyBfVW5vcmRlcmVkRXF1YWxpdHk8RSwgSXRlcmFibGU8RT4+IHsKICBjb25zdCBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5KAogICAgICBbRXF1YWxpdHk8RT4gZWxlbWVudEVxdWFsaXR5ID0gY29uc3QgRGVmYXVsdEVxdWFsaXR5KCldKQogICAgICA6IHN1cGVyKGVsZW1lbnRFcXVhbGl0eSk7CgogIGJvb2wgaXNWYWxpZEtleShPYmplY3QgbykgPT4gbyBpcyBJdGVyYWJsZTxFPjsKfQoKLy8vIEVxdWFsaXR5IG9mIHNldHMuCi8vLwovLy8gVHdvIHNldHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cywKLy8vIGFuZCB0aGUgZWxlbWVudHMgb2Ygb25lIHNldCBjYW4gYmUgcGFpcmVkIHdpdGggdGhlIGVsZW1lbnRzCi8vLyBvZiB0aGUgb3RoZXIgc2V0LCBzbyB0aGF0IGVhY2ggcGFpciBhcmUgZXF1YWwuCi8vLwovLy8gVGhpcyBlcXVhbGl0eSBiZWhhdmVzIHRoZSBzYW1lIGFzIFtVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5XSBleGNlcHQgdGhhdAovLy8gaXQgZXhwZWN0cyBzZXRzIGluc3RlYWQgb2YgaXRlcmFibGVzIGFzIGFyZ3VtZW50cy4KLy8vCi8vLyBUaGUgW2VxdWFsc10gYW5kIFtoYXNoXSBtZXRob2RzIGFjY2VwdHMgYG51bGxgIHZhbHVlcywKLy8vIGV2ZW4gaWYgdGhlIFtpc1ZhbGlkS2V5XSByZXR1cm5zIGBmYWxzZWAgZm9yIGBudWxsYC4KLy8vIFRoZSBbaGFzaF0gb2YgYG51bGxgIGlzIGBudWxsLmhhc2hDb2RlYC4KY2xhc3MgU2V0RXF1YWxpdHk8RT4gZXh0ZW5kcyBfVW5vcmRlcmVkRXF1YWxpdHk8RSwgU2V0PEU+PiB7CiAgY29uc3QgU2V0RXF1YWxpdHkoW0VxdWFsaXR5PEU+IGVsZW1lbnRFcXVhbGl0eSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBzdXBlcihlbGVtZW50RXF1YWxpdHkpOwoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IG8gaXMgU2V0PEU+Owp9CgovLy8gSW50ZXJuYWwgY2xhc3MgdXNlZCBieSBbTWFwRXF1YWxpdHldLgovLy8KLy8vIFRoZSBjbGFzcyByZXByZXNlbnRzIGEgbWFwIGVudHJ5IGFzIGEgc2luZ2xlIG9iamVjdCwKLy8vIHVzaW5nIGEgY29tYmluZWQgaGFzaENvZGUgYW5kIGVxdWFsaXR5IG9mIHRoZSBrZXkgYW5kIHZhbHVlLgpjbGFzcyBfTWFwRW50cnkgewogIGZpbmFsIE1hcEVxdWFsaXR5IGVxdWFsaXR5OwogIGZpbmFsIGtleTsKICBmaW5hbCB2YWx1ZTsKICBfTWFwRW50cnkodGhpcy5lcXVhbGl0eSwgdGhpcy5rZXksIHRoaXMudmFsdWUpOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+CiAgICAgICgzICogZXF1YWxpdHkuX2tleUVxdWFsaXR5Lmhhc2goa2V5KSArCiAgICAgICAgICA3ICogZXF1YWxpdHkuX3ZhbHVlRXF1YWxpdHkuaGFzaCh2YWx1ZSkpICYKICAgICAgX0hBU0hfTUFTSzsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpID0+CiAgICAgIG90aGVyIGlzIF9NYXBFbnRyeSAmJgogICAgICBlcXVhbGl0eS5fa2V5RXF1YWxpdHkuZXF1YWxzKGtleSwgb3RoZXIua2V5KSAmJgogICAgICBlcXVhbGl0eS5fdmFsdWVFcXVhbGl0eS5lcXVhbHModmFsdWUsIG90aGVyLnZhbHVlKTsKfQoKLy8vIEVxdWFsaXR5IG9uIG1hcHMuCi8vLwovLy8gVHdvIG1hcHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcywgYW5kIGlmIHRoZQovLy8gZW50cmllcyBvZiB0aGUgdHdvIG1hcHMgYXJlIHBhaXJ3aXNlIGVxdWFsIG9uIGJvdGgga2V5IGFuZCB2YWx1ZS4KLy8vCi8vLyBUaGUgW2VxdWFsc10gYW5kIFtoYXNoXSBtZXRob2RzIGFjY2VwdHMgYG51bGxgIHZhbHVlcywKLy8vIGV2ZW4gaWYgdGhlIFtpc1ZhbGlkS2V5XSByZXR1cm5zIGBmYWxzZWAgZm9yIGBudWxsYC4KLy8vIFRoZSBbaGFzaF0gb2YgYG51bGxgIGlzIGBudWxsLmhhc2hDb2RlYC4KY2xhc3MgTWFwRXF1YWxpdHk8SywgVj4gaW1wbGVtZW50cyBFcXVhbGl0eTxNYXA8SywgVj4+IHsKICBmaW5hbCBFcXVhbGl0eTxLPiBfa2V5RXF1YWxpdHk7CiAgZmluYWwgRXF1YWxpdHk8Vj4gX3ZhbHVlRXF1YWxpdHk7CiAgY29uc3QgTWFwRXF1YWxpdHkoCiAgICAgIHtFcXVhbGl0eTxLPiBrZXlzOiBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKSwKICAgICAgRXF1YWxpdHk8Vj4gdmFsdWVzOiBjb25zdCBEZWZhdWx0RXF1YWxpdHkoKX0pCiAgICAgIDogX2tleUVxdWFsaXR5ID0ga2V5cywKICAgICAgICBfdmFsdWVFcXVhbGl0eSA9IHZhbHVlczsKCiAgYm9vbCBlcXVhbHMoTWFwPEssIFY+IG1hcDEsIE1hcDxLLCBWPiBtYXAyKSB7CiAgICBpZiAoaWRlbnRpY2FsKG1hcDEsIG1hcDIpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChtYXAxID09IG51bGwgfHwgbWFwMiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpbnQgbGVuZ3RoID0gbWFwMS5sZW5ndGg7CiAgICBpZiAobGVuZ3RoICE9IG1hcDIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBNYXA8X01hcEVudHJ5LCBpbnQ+IGVxdWFsRWxlbWVudENvdW50cyA9IG5ldyBIYXNoTWFwKCk7CiAgICBmb3IgKEsga2V5IGluIG1hcDEua2V5cykgewogICAgICBfTWFwRW50cnkgZW50cnkgPSBuZXcgX01hcEVudHJ5KHRoaXMsIGtleSwgbWFwMVtrZXldKTsKICAgICAgaW50IGNvdW50ID0gZXF1YWxFbGVtZW50Q291bnRzW2VudHJ5XTsKICAgICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMDsKICAgICAgZXF1YWxFbGVtZW50Q291bnRzW2VudHJ5XSA9IGNvdW50ICsgMTsKICAgIH0KICAgIGZvciAoSyBrZXkgaW4gbWFwMi5rZXlzKSB7CiAgICAgIF9NYXBFbnRyeSBlbnRyeSA9IG5ldyBfTWFwRW50cnkodGhpcywga2V5LCBtYXAyW2tleV0pOwogICAgICBpbnQgY291bnQgPSBlcXVhbEVsZW1lbnRDb3VudHNbZW50cnldOwogICAgICBpZiAoY291bnQgPT0gbnVsbCB8fCBjb3VudCA9PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgIGVxdWFsRWxlbWVudENvdW50c1tlbnRyeV0gPSBjb3VudCAtIDE7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGludCBoYXNoKE1hcDxLLCBWPiBtYXApIHsKICAgIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIG51bGwuaGFzaENvZGU7CiAgICBpbnQgaGFzaCA9IDA7CiAgICBmb3IgKEsga2V5IGluIG1hcC5rZXlzKSB7CiAgICAgIGludCBrZXlIYXNoID0gX2tleUVxdWFsaXR5Lmhhc2goa2V5KTsKICAgICAgaW50IHZhbHVlSGFzaCA9IF92YWx1ZUVxdWFsaXR5Lmhhc2gobWFwW2tleV0pOwogICAgICBoYXNoID0gKGhhc2ggKyAzICoga2V5SGFzaCArIDcgKiB2YWx1ZUhhc2gpICYgX0hBU0hfTUFTSzsKICAgIH0KICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDMpKSAmIF9IQVNIX01BU0s7CiAgICBoYXNoIF49IChoYXNoID4+IDExKTsKICAgIGhhc2ggPSAoaGFzaCArIChoYXNoIDw8IDE1KSkgJiBfSEFTSF9NQVNLOwogICAgcmV0dXJuIGhhc2g7CiAgfQoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pID0+IG8gaXMgTWFwPEssIFY+Owp9CgovLy8gQ29tYmluZXMgc2V2ZXJhbCBlcXVhbGl0aWVzIGludG8gYSBzaW5nbGUgZXF1YWxpdHkuCi8vLwovLy8gVHJpZXMgZWFjaCBlcXVhbGl0eSBpbiBvcmRlciwgdXNpbmcgW0VxdWFsaXR5LmlzVmFsaWRLZXldLCBhbmQgcmV0dXJucwovLy8gdGhlIHJlc3VsdCBvZiB0aGUgZmlyc3QgZXF1YWxpdHkgdGhhdCBhcHBsaWVzIHRvIHRoZSBhcmd1bWVudCBvciBhcmd1bWVudHMuCi8vLwovLy8gRm9yIGBlcXVhbHNgLCB0aGUgZmlyc3QgZXF1YWxpdHkgdGhhdCBtYXRjaGVzIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB1c2VkLAovLy8gYW5kIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgYGVxdWFsc2AgaXMgbm90IHZhbGlkIGZvciB0aGF0IGVxdWFsaXR5LAovLy8gaXQgcmV0dXJucyBmYWxzZS4KLy8vCi8vLyBCZWNhdXNlIHRoZSBlcXVhbGl0aWVzIGFyZSB0cmllZCBpbiBvcmRlciwgdGhleSBzaG91bGQgZ2VuZXJhbGx5IHdvcmsgb24KLy8vIGRpc2pvaW50IHR5cGVzLiBPdGhlcndpc2UgdGhlIG11bHRpLWVxdWFsaXR5IG1heSBnaXZlIGluY29uc2lzdGVudCByZXN1bHRzCi8vLyBmb3IgYGVxdWFscyhlMSwgZTIpYCBhbmQgYGVxdWFscyhlMiwgZTEpYC4gVGhpcyBjYW4gaGFwcGVuIGlmIG9uZSBlcXVhbGl0eQovLy8gY29uc2lkZXJzIG9ubHkgYGUxYCBhIHZhbGlkIGtleSwgYW5kIG5vdCBgZTJgLCBidXQgYW4gZXF1YWxpdHkgd2hpY2ggaXMKLy8vIGNoZWNrZWQgbGF0ZXIsIGFsbG93cyBib3RoLgpjbGFzcyBNdWx0aUVxdWFsaXR5PEU+IGltcGxlbWVudHMgRXF1YWxpdHk8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEVxdWFsaXR5PEU+PiBfZXF1YWxpdGllczsKCiAgY29uc3QgTXVsdGlFcXVhbGl0eShJdGVyYWJsZTxFcXVhbGl0eTxFPj4gZXF1YWxpdGllcykKICAgICAgOiBfZXF1YWxpdGllcyA9IGVxdWFsaXRpZXM7CgogIGJvb2wgZXF1YWxzKEUgZTEsIEUgZTIpIHsKICAgIGZvciAoRXF1YWxpdHk8RT4gZXEgaW4gX2VxdWFsaXRpZXMpIHsKICAgICAgaWYgKGVxLmlzVmFsaWRLZXkoZTEpKSByZXR1cm4gZXEuaXNWYWxpZEtleShlMikgJiYgZXEuZXF1YWxzKGUxLCBlMik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpbnQgaGFzaChFIGUpIHsKICAgIGZvciAoRXF1YWxpdHk8RT4gZXEgaW4gX2VxdWFsaXRpZXMpIHsKICAgICAgaWYgKGVxLmlzVmFsaWRLZXkoZSkpIHJldHVybiBlcS5oYXNoKGUpOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQoKICBib29sIGlzVmFsaWRLZXkoT2JqZWN0IG8pIHsKICAgIGZvciAoRXF1YWxpdHk8RT4gZXEgaW4gX2VxdWFsaXRpZXMpIHsKICAgICAgaWYgKGVxLmlzVmFsaWRLZXkobykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKLy8vIERlZXAgZXF1YWxpdHkgb24gY29sbGVjdGlvbnMuCi8vLwovLy8gUmVjb2duaXplcyBsaXN0cywgc2V0cywgaXRlcmFibGVzIGFuZCBtYXBzIGFuZCBjb21wYXJlcyB0aGVpciBlbGVtZW50cyB1c2luZwovLy8gZGVlcCBlcXVhbGl0eSBhcyB3ZWxsLgovLy8KLy8vIE5vbi1pdGVyYWJsZS9tYXAgb2JqZWN0cyBhcmUgY29tcGFyZWQgdXNpbmcgYSBjb25maWd1cmFibGUgYmFzZSBlcXVhbGl0eS4KLy8vCi8vLyBXb3JrcyBpbiBvbmUgb2YgdHdvIG1vZGVzOiBvcmRlcmVkIG9yIHVub3JkZXJlZC4KLy8vCi8vLyBJbiBvcmRlcmVkIG1vZGUsIGxpc3RzIGFuZCBpdGVyYWJsZXMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgZXF1YWwgZWxlbWVudHMKLy8vIGluIHRoZSBzYW1lIG9yZGVyLiBJbiB1bm9yZGVyZWQgbW9kZSwgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIGl0ZXJhYmxlcwovLy8gYW5kIGxpc3RzIGFyZSBub3QgaW1wb3J0YW50LgovLy8KLy8vIEEgbGlzdCBpcyBvbmx5IGVxdWFsIHRvIGFub3RoZXIgbGlzdCwgbGlrZXdpc2UgZm9yIHNldHMgYW5kIG1hcHMuIEFsbCBvdGhlcgovLy8gaXRlcmFibGVzIGFyZSBjb21wYXJlZCBhcyBpdGVyYWJsZXMgb25seS4KY2xhc3MgRGVlcENvbGxlY3Rpb25FcXVhbGl0eSBpbXBsZW1lbnRzIEVxdWFsaXR5IHsKICBmaW5hbCBFcXVhbGl0eSBfYmFzZTsKICBmaW5hbCBib29sIF91bm9yZGVyZWQ7CiAgY29uc3QgRGVlcENvbGxlY3Rpb25FcXVhbGl0eShbRXF1YWxpdHkgYmFzZSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfYmFzZSA9IGJhc2UsCiAgICAgICAgX3Vub3JkZXJlZCA9IGZhbHNlOwoKICAvLy8gQ3JlYXRlcyBhIGRlZXAgZXF1YWxpdHkgb24gY29sbGVjdGlvbnMgd2hlcmUgdGhlIG9yZGVyIG9mIGxpc3RzIGFuZAogIC8vLyBpdGVyYWJsZXMgYXJlIG5vdCBjb25zaWRlcmVkIGltcG9ydGFudC4gVGhhdCBpcywgbGlzdHMgYW5kIGl0ZXJhYmxlcyBhcmUKICAvLy8gdHJlYXRlZCBhcyB1bm9yZGVyZWQgaXRlcmFibGVzLgogIGNvbnN0IERlZXBDb2xsZWN0aW9uRXF1YWxpdHkudW5vcmRlcmVkKAogICAgICBbRXF1YWxpdHkgYmFzZSA9IGNvbnN0IERlZmF1bHRFcXVhbGl0eSgpXSkKICAgICAgOiBfYmFzZSA9IGJhc2UsCiAgICAgICAgX3Vub3JkZXJlZCA9IHRydWU7CgogIGJvb2wgZXF1YWxzKGUxLCBlMikgewogICAgaWYgKGUxIGlzIFNldCkgewogICAgICByZXR1cm4gZTIgaXMgU2V0ICYmIG5ldyBTZXRFcXVhbGl0eSh0aGlzKS5lcXVhbHMoZTEsIGUyKTsKICAgIH0KICAgIGlmIChlMSBpcyBNYXApIHsKICAgICAgcmV0dXJuIGUyIGlzIE1hcCAmJgogICAgICAgICAgbmV3IE1hcEVxdWFsaXR5KGtleXM6IHRoaXMsIHZhbHVlczogdGhpcykuZXF1YWxzKGUxLCBlMik7CiAgICB9CiAgICBpZiAoIV91bm9yZGVyZWQpIHsKICAgICAgaWYgKGUxIGlzIExpc3QpIHsKICAgICAgICByZXR1cm4gZTIgaXMgTGlzdCAmJiBuZXcgTGlzdEVxdWFsaXR5KHRoaXMpLmVxdWFscyhlMSwgZTIpOwogICAgICB9CiAgICAgIGlmIChlMSBpcyBJdGVyYWJsZSkgewogICAgICAgIHJldHVybiBlMiBpcyBJdGVyYWJsZSAmJiBuZXcgSXRlcmFibGVFcXVhbGl0eSh0aGlzKS5lcXVhbHMoZTEsIGUyKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlMSBpcyBJdGVyYWJsZSkgewogICAgICBpZiAoZTEgaXMgTGlzdCAhPSBlMiBpcyBMaXN0KSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiBlMiBpcyBJdGVyYWJsZSAmJgogICAgICAgICAgbmV3IFVub3JkZXJlZEl0ZXJhYmxlRXF1YWxpdHkodGhpcykuZXF1YWxzKGUxLCBlMik7CiAgICB9CiAgICByZXR1cm4gX2Jhc2UuZXF1YWxzKGUxLCBlMik7CiAgfQoKICBpbnQgaGFzaChPYmplY3QgbykgewogICAgaWYgKG8gaXMgU2V0KSByZXR1cm4gbmV3IFNldEVxdWFsaXR5KHRoaXMpLmhhc2gobyk7CiAgICBpZiAobyBpcyBNYXApIHJldHVybiBuZXcgTWFwRXF1YWxpdHkoa2V5czogdGhpcywgdmFsdWVzOiB0aGlzKS5oYXNoKG8pOwogICAgaWYgKCFfdW5vcmRlcmVkKSB7CiAgICAgIGlmIChvIGlzIExpc3QpIHJldHVybiBuZXcgTGlzdEVxdWFsaXR5KHRoaXMpLmhhc2gobyk7CiAgICAgIGlmIChvIGlzIEl0ZXJhYmxlKSByZXR1cm4gbmV3IEl0ZXJhYmxlRXF1YWxpdHkodGhpcykuaGFzaChvKTsKICAgIH0gZWxzZSBpZiAobyBpcyBJdGVyYWJsZSkgewogICAgICByZXR1cm4gbmV3IFVub3JkZXJlZEl0ZXJhYmxlRXF1YWxpdHkodGhpcykuaGFzaChvKTsKICAgIH0KICAgIHJldHVybiBfYmFzZS5oYXNoKG8pOwogIH0KCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvKSA9PiBvIGlzIEl0ZXJhYmxlIHx8IG8gaXMgTWFwIHx8IF9iYXNlLmlzVmFsaWRLZXkobyk7Cn0KCi8vLyBTdHJpbmcgZXF1YWxpdHkgdGhhdCdzIGluc2Vuc2l0aXZlIHRvIGRpZmZlcmVuY2VzIGluIEFTQ0lJIGNhc2UuCi8vLwovLy8gTm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIGNvbXBhcmVkIGFzLWlzLCB3aXRoIG5vIGNvbnZlcnNpb24uCmNsYXNzIENhc2VJbnNlbnNpdGl2ZUVxdWFsaXR5IGltcGxlbWVudHMgRXF1YWxpdHk8U3RyaW5nPiB7CiAgY29uc3QgQ2FzZUluc2Vuc2l0aXZlRXF1YWxpdHkoKTsKCiAgYm9vbCBlcXVhbHMoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKSA9PgogICAgICBlcXVhbHNJZ25vcmVBc2NpaUNhc2Uoc3RyaW5nMSwgc3RyaW5nMik7CgogIGludCBoYXNoKFN0cmluZyBzdHJpbmcpID0+IGhhc2hJZ25vcmVBc2NpaUNhc2Uoc3RyaW5nKTsKCiAgYm9vbCBpc1ZhbGlkS2V5KE9iamVjdCBvYmplY3QpID0+IG9iamVjdCBpcyBTdHJpbmc7Cn0KgdIATk48ARoBGwEjASwdMQEsBjEbASQGQjARAUkGTBIdAgEjATEEIgweHAYIBFAMNAgETiYwMR8BMhwBUBoYAUYBLAEeEiA1BhIEAgFQBE4SBE9LUTIbMSQlAgFIMxwwKCUCARsETgQ7OS09Jho/LAE+Nj4iIhMlMyFMBgQBIzAuEiIuJjEbBi4aLxEEATECARcESB0ERj0EOzktNSZOLAEuLjYfLidGBhEEARssLkxHEiwuJjEbBi4aLxEEAS0CATwdJgEzASo2PiopKTIUHx0kHRAGHx01HRAGGAQBGTASIi4mBi4aLxEEAgFJBFFAOFAjPyABMQIBFgRMQDMETjcEOzktPU0gASwCASoEOUESHg0PMgEWLTUSASQcNjoCARYES0YEOzktOSIkFTI0HSEBMCw0Hi08Hz0tJC0GHz0tNS0GEQQBHCsSHiw1QAYuGi8RBAEvAgE4BEtQBE5LFgRNT09MIDArATgiARwqTAYSBAESKi8GDgQBHiopBhIEAgEiBFEbBE4ENQRNTSEEUC4zGBlKFhwBSk8mKjEWGwEYFUAGFRpEBhcYRAgcTAghMh8+BiEEARc4TBc8RCA6BhoEAVECAUUEQTwjATEvAToBNgIBJHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZXF1YWxpdHkuZGFydFhmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL2VxdWFsaXR5X21hcC5kYXJ0hIMvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICdlcXVhbGl0eS5kYXJ0JzsKaW1wb3J0ICd3cmFwcGVycy5kYXJ0JzsKCi8vLyBBIFtNYXBdIHdob3NlIGtleSBlcXVhbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGFuIFtFcXVhbGl0eV0gb2JqZWN0LgpjbGFzcyBFcXVhbGl0eU1hcDxLLCBWPiBleHRlbmRzIERlbGVnYXRpbmdNYXA8SywgVj4gewogIC8vLyBDcmVhdGVzIGEgbWFwIHdpdGggZXF1YWxpdHkgYmFzZWQgb24gW2VxdWFsaXR5XS4KICBFcXVhbGl0eU1hcChFcXVhbGl0eTxLPiBlcXVhbGl0eSkKICAgICAgOiBzdXBlcihuZXcgTGlua2VkSGFzaE1hcCgKICAgICAgICAgICAgZXF1YWxzOiBlcXVhbGl0eS5lcXVhbHMsCiAgICAgICAgICAgIGhhc2hDb2RlOiBlcXVhbGl0eS5oYXNoLAogICAgICAgICAgICBpc1ZhbGlkS2V5OiBlcXVhbGl0eS5pc1ZhbGlkS2V5KSk7CgogIC8vLyBDcmVhdGVzIGEgbWFwIHdpdGggZXF1YWxpdHkgYmFzZWQgb24gW2VxdWFsaXR5XSB0aGF0IGNvbnRhaW5zIGFsbAogIC8vLyBrZXktdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICAvLy8KICAvLy8gSWYgW290aGVyXSBoYXMgbXVsdGlwbGUga2V5cyB0aGF0IGFyZSBlcXVpdmFsZW50IGFjY29yZGluZyB0byBbZXF1YWxpdHldLAogIC8vLyB0aGUgbGFzdCBvbmUgcmVhY2hlZCBkdXJpbmcgaXRlcmF0aW9uIHRha2VzIHByZWNlZGVuY2UuCiAgRXF1YWxpdHlNYXAuZnJvbShFcXVhbGl0eTxLPiBlcXVhbGl0eSwgTWFwPEssIFY+IG90aGVyKQogICAgICA6IHN1cGVyKG5ldyBMaW5rZWRIYXNoTWFwKAogICAgICAgICAgICBlcXVhbHM6IGVxdWFsaXR5LmVxdWFscywKICAgICAgICAgICAgaGFzaENvZGU6IGVxdWFsaXR5Lmhhc2gsCiAgICAgICAgICAgIGlzVmFsaWRLZXk6IGVxdWFsaXR5LmlzVmFsaWRLZXkpKSB7CiAgICBhZGRBbGwob3RoZXIpOwogIH0KfQohAE5OPAEaARgYAUY2NyQhJSUvAUgiBlA+OiElJTATBAIBKHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZXF1YWxpdHlfbWFwLmRhcnRYZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbGxlY3Rpb24vbGliL3NyYy9lcXVhbGl0eV9zZXQuZGFydIR7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCmltcG9ydCAnZXF1YWxpdHkuZGFydCc7CmltcG9ydCAnd3JhcHBlcnMuZGFydCc7CgovLy8gQSBbTWFwXSB3aG9zZSBrZXkgZXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBhbiBbRXF1YWxpdHldIG9iamVjdC4KY2xhc3MgRXF1YWxpdHlTZXQ8RT4gZXh0ZW5kcyBEZWxlZ2F0aW5nU2V0PEU+IHsKICAvLy8gQ3JlYXRlcyBhIHNldCB3aXRoIGVxdWFsaXR5IGJhc2VkIG9uIFtlcXVhbGl0eV0uCiAgRXF1YWxpdHlTZXQoRXF1YWxpdHk8RT4gZXF1YWxpdHkpCiAgICAgIDogc3VwZXIobmV3IExpbmtlZEhhc2hTZXQoCiAgICAgICAgICAgIGVxdWFsczogZXF1YWxpdHkuZXF1YWxzLAogICAgICAgICAgICBoYXNoQ29kZTogZXF1YWxpdHkuaGFzaCwKICAgICAgICAgICAgaXNWYWxpZEtleTogZXF1YWxpdHkuaXNWYWxpZEtleSkpOwoKICAvLy8gQ3JlYXRlcyBhIHNldCB3aXRoIGVxdWFsaXR5IGJhc2VkIG9uIFtlcXVhbGl0eV0gdGhhdCBjb250YWlucyBhbGwKICAvLy8gZWxlbWVudHMgaW4gW290aGVyXS4KICAvLy8KICAvLy8gSWYgW290aGVyXSBoYXMgbXVsdGlwbGUgdmFsdWVzIHRoYXQgYXJlIGVxdWl2YWxlbnQgYWNjb3JkaW5nIHRvCiAgLy8vIFtlcXVhbGl0eV0sIHRoZSBmaXJzdCBvbmUgcmVhY2hlZCBkdXJpbmcgaXRlcmF0aW9uIHRha2VzIHByZWNlZGVuY2UuCiAgRXF1YWxpdHlTZXQuZnJvbShFcXVhbGl0eTxFPiBlcXVhbGl0eSwgSXRlcmFibGU8RT4gb3RoZXIpCiAgICAgIDogc3VwZXIobmV3IExpbmtlZEhhc2hTZXQoCiAgICAgICAgICAgIGVxdWFsczogZXF1YWxpdHkuZXF1YWxzLAogICAgICAgICAgICBoYXNoQ29kZTogZXF1YWxpdHkuaGFzaCwKICAgICAgICAgICAgaXNWYWxpZEtleTogZXF1YWxpdHkuaXNWYWxpZEtleSkpIHsKICAgIGFkZEFsbChvdGhlcik7CiAgfQp9CiEATk48ARoBGBgBRjA3JCElJS8BSBsGRks8ISUlMBMEAgEocGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lcXVhbGl0eV9zZXQuZGFydFVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL2Z1bmN0aW9ucy5kYXJ0m8cvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKCmltcG9ydCAndXRpbHMuZGFydCc7CgovLyBUT0RPKG53ZWl6KTogV2hlbiBzZGsjMjY0ODggaXMgZml4ZWQsIHVzZSBvdmVybG9hZHMgdG8gZW5zdXJlIHRoYXQgaWYgW2tleV0KLy8gb3IgW3ZhbHVlXSBpc24ndCBwYXNzZWQsIGBLMmAvYFYyYCBkZWZhdWx0cyB0byBgSzFgL2BWMWAsIHJlc3BlY3RpdmVseS4KLy8vIENyZWF0ZXMgYSBuZXcgbWFwIGZyb20gW21hcF0gd2l0aCBuZXcga2V5cyBhbmQgdmFsdWVzLgovLy8KLy8vIFRoZSByZXR1cm4gdmFsdWVzIG9mIFtrZXldIGFyZSB1c2VkIGFzIHRoZSBrZXlzIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBvZgovLy8gW3ZhbHVlXSBhcmUgdXNlZCBhcyB0aGUgdmFsdWVzIGZvciB0aGUgbmV3IG1hcC4KTWFwPEsyLCBWMj4gbWFwTWFwPEsxLCBWMSwgSzIsIFYyPihNYXA8SzEsIFYxPiBtYXAsCiAgICB7SzIga2V5KEsxIGtleSwgVjEgdmFsdWUpLCBWMiB2YWx1ZShLMSBrZXksIFYxIHZhbHVlKX0pIHsKICBrZXkgPz89IChtYXBLZXksIF8pID0+IG1hcEtleSBhcyBLMjsKICB2YWx1ZSA/Pz0gKF8sIG1hcFZhbHVlKSA9PiBtYXBWYWx1ZSBhcyBWMjsKCiAgdmFyIHJlc3VsdCA9IDxLMiwgVjI+e307CiAgbWFwLmZvckVhY2goKG1hcEtleSwgbWFwVmFsdWUpIHsKICAgIHJlc3VsdFtrZXkobWFwS2V5LCBtYXBWYWx1ZSldID0gdmFsdWUobWFwS2V5LCBtYXBWYWx1ZSk7CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIFJldHVybnMgYSBuZXcgbWFwIHdpdGggYWxsIGtleS92YWx1ZSBwYWlycyBpbiBib3RoIFttYXAxXSBhbmQgW21hcDJdLgovLy8KLy8vIElmIHRoZXJlIGFyZSBrZXlzIHRoYXQgb2NjdXIgaW4gYm90aCBtYXBzLCB0aGUgW3ZhbHVlXSBmdW5jdGlvbiBpcyB1c2VkIHRvCi8vLyBzZWxlY3QgdGhlIHZhbHVlIHRoYXQgZ29lcyBpbnRvIHRoZSByZXN1bHRpbmcgbWFwIGJhc2VkIG9uIHRoZSB0d28gb3JpZ2luYWwKLy8vIHZhbHVlcy4gSWYgW3ZhbHVlXSBpcyBvbWl0dGVkLCB0aGUgdmFsdWUgZnJvbSBbbWFwMl0gaXMgdXNlZC4KTWFwPEssIFY+IG1lcmdlTWFwczxLLCBWPihNYXA8SywgVj4gbWFwMSwgTWFwPEssIFY+IG1hcDIsCiAgICB7ViB2YWx1ZShWIHZhbHVlMSwgViB2YWx1ZTIpfSkgewogIHZhciByZXN1bHQgPSBuZXcgTWFwPEssIFY+LmZyb20obWFwMSk7CiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiByZXN1bHQuLmFkZEFsbChtYXAyKTsKCiAgbWFwMi5mb3JFYWNoKChrZXksIG1hcFZhbHVlKSB7CiAgICByZXN1bHRba2V5XSA9CiAgICAgICAgcmVzdWx0LmNvbnRhaW5zS2V5KGtleSkgPyB2YWx1ZShyZXN1bHRba2V5XSwgbWFwVmFsdWUpIDogbWFwVmFsdWU7CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vIEdyb3VwcyB0aGUgZWxlbWVudHMgaW4gW3ZhbHVlc10gYnkgdGhlIHZhbHVlIHJldHVybmVkIGJ5IFtrZXldLgovLy8KLy8vIFJldHVybnMgYSBtYXAgZnJvbSBrZXlzIGNvbXB1dGVkIGJ5IFtrZXldIHRvIGEgbGlzdCBvZiBhbGwgdmFsdWVzIGZvciB3aGljaAovLy8gW2tleV0gcmV0dXJucyB0aGF0IGtleS4gVGhlIHZhbHVlcyBhcHBlYXIgaW4gdGhlIGxpc3QgaW4gdGhlIHNhbWUgcmVsYXRpdmUKLy8vIG9yZGVyIGFzIGluIFt2YWx1ZXNdLgpNYXA8VCwgTGlzdDxTPj4gZ3JvdXBCeTxTLCBUPihJdGVyYWJsZTxTPiB2YWx1ZXMsIFQga2V5KFMgZWxlbWVudCkpIHsKICB2YXIgbWFwID0gPFQsIExpc3Q8Uz4+e307CiAgZm9yICh2YXIgZWxlbWVudCBpbiB2YWx1ZXMpIHsKICAgIHZhciBsaXN0ID0gbWFwLnB1dElmQWJzZW50KGtleShlbGVtZW50KSwgKCkgPT4gW10pOwogICAgbGlzdC5hZGQoZWxlbWVudCk7CiAgfQogIHJldHVybiBtYXA7Cn0KCi8vLyBSZXR1cm5zIHRoZSBlbGVtZW50IG9mIFt2YWx1ZXNdIGZvciB3aGljaCBbb3JkZXJCeV0gcmV0dXJucyB0aGUgbWluaW11bQovLy8gdmFsdWUuCi8vLwovLy8gVGhlIHZhbHVlcyByZXR1cm5lZCBieSBbb3JkZXJCeV0gYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24uCi8vLyBJZiBbY29tcGFyZV0gaXMgb21pdHRlZCwgdmFsdWVzIG11c3QgaW1wbGVtZW50IFtDb21wYXJhYmxlPFQ+XSBhbmQgdGhleSBhcmUKLy8vIGNvbXBhcmVkIHVzaW5nIHRoZWlyIFtDb21wYXJhYmxlLmNvbXBhcmVUb10uClMgbWluQnk8UywgVD4oSXRlcmFibGU8Uz4gdmFsdWVzLCBUIG9yZGVyQnkoUyBlbGVtZW50KSwKICAgIHtpbnQgY29tcGFyZShUIHZhbHVlMSwgVCB2YWx1ZTIpfSkgewogIGNvbXBhcmUgPz89IGRlZmF1bHRDb21wYXJlPFQ+KCk7CgogIFMgbWluVmFsdWU7CiAgVCBtaW5PcmRlckJ5OwogIGZvciAodmFyIGVsZW1lbnQgaW4gdmFsdWVzKSB7CiAgICB2YXIgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpOwogICAgaWYgKG1pbk9yZGVyQnkgPT0gbnVsbCB8fCBjb21wYXJlKGVsZW1lbnRPcmRlckJ5LCBtaW5PcmRlckJ5KSA8IDApIHsKICAgICAgbWluVmFsdWUgPSBlbGVtZW50OwogICAgICBtaW5PcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7CiAgICB9CiAgfQogIHJldHVybiBtaW5WYWx1ZTsKfQoKLy8vIFJldHVybnMgdGhlIGVsZW1lbnQgb2YgW3ZhbHVlc10gZm9yIHdoaWNoIFtvcmRlckJ5XSByZXR1cm5zIHRoZSBtYXhpbXVtCi8vLyB2YWx1ZS4KLy8vCi8vLyBUaGUgdmFsdWVzIHJldHVybmVkIGJ5IFtvcmRlckJ5XSBhcmUgY29tcGFyZWQgdXNpbmcgdGhlIFtjb21wYXJlXSBmdW5jdGlvbi4KLy8vIElmIFtjb21wYXJlXSBpcyBvbWl0dGVkLCB2YWx1ZXMgbXVzdCBpbXBsZW1lbnQgW0NvbXBhcmFibGU8VD5dIGFuZCB0aGV5IGFyZQovLy8gY29tcGFyZWQgdXNpbmcgdGhlaXIgW0NvbXBhcmFibGUuY29tcGFyZVRvXS4KUyBtYXhCeTxTLCBUPihJdGVyYWJsZTxTPiB2YWx1ZXMsIFQgb3JkZXJCeShTIGVsZW1lbnQpLAogICAge2ludCBjb21wYXJlKFQgdmFsdWUxLCBUIHZhbHVlMil9KSB7CiAgY29tcGFyZSA/Pz0gZGVmYXVsdENvbXBhcmU8VD4oKTsKCiAgUyBtYXhWYWx1ZTsKICBUIG1heE9yZGVyQnk7CiAgZm9yICh2YXIgZWxlbWVudCBpbiB2YWx1ZXMpIHsKICAgIHZhciBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7CiAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGNvbXBhcmUoZWxlbWVudE9yZGVyQnksIG1heE9yZGVyQnkpID4gMCkgewogICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7CiAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTsKICAgIH0KICB9CiAgcmV0dXJuIG1heFZhbHVlOwp9CgovLy8gUmV0dXJucyB0aGUgW3RyYW5zaXRpdmUgY2xvc3VyZV1bXSBvZiBbZ3JhcGhdLgovLy8KLy8vIFt0cmFuc2l0aXZlIGNsb3N1cmVdOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UcmFuc2l0aXZlX2Nsb3N1cmUKLy8vCi8vLyBJbnRlcnByZXRzIFtncmFwaF0gYXMgYSBkaXJlY3RlZCBncmFwaCB3aXRoIGEgdmVydGV4IGZvciBlYWNoIGtleSBhbmQgZWRnZXMKLy8vIGZyb20gZWFjaCBrZXkgdG8gdGhlIHZhbHVlcyB0aGF0IHRoZSBrZXkgbWFwcyB0by4KLy8vCi8vLyBBc3N1bWVzIHRoYXQgZXZlcnkgdmVydGV4IGluIHRoZSBncmFwaCBoYXMgYSBrZXkgdG8gcmVwcmVzZW50IGl0LCBldmVuIGlmCi8vLyB0aGF0IHZlcnRleCBoYXMgbm8gb3V0Z29pbmcgZWRnZXMuIFRoaXMgaXNuJ3QgY2hlY2tlZCwgYnV0IGlmIGl0J3Mgbm90Ci8vLyBzYXRpc2ZpZWQsIHRoZSBmdW5jdGlvbiBtYXkgY3Jhc2ggb3IgcHJvdmlkZSB1bmV4cGVjdGVkIG91dHB1dC4gRm9yIGV4YW1wbGUsCi8vLyBgeyJhIjogWyJiIl19YCBpcyBub3QgdmFsaWQsIGJ1dCBgeyJhIjogWyJiIl0sICJiIjogW119YCBpcy4KTWFwPFQsIFNldDxUPj4gdHJhbnNpdGl2ZUNsb3N1cmU8VD4oTWFwPFQsIEl0ZXJhYmxlPFQ+PiBncmFwaCkgewogIC8vIFRoaXMgdXNlcyBbV2Fyc2hhbGwncyBhbGdvcml0aG1dW10sIG1vZGlmaWVkIG5vdCB0byBhZGQgYSB2ZXJ0ZXggZnJvbSBlYWNoCiAgLy8gbm9kZSB0byBpdHNlbGYuCiAgLy8KICAvLyBbV2Fyc2hhbGwncyBhbGdvcml0aG1dOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GbG95ZCVFMiU4MCU5M1dhcnNoYWxsX2FsZ29yaXRobSNBcHBsaWNhdGlvbnNfYW5kX2dlbmVyYWxpemF0aW9ucy4KICB2YXIgcmVzdWx0ID0gPFQsIFNldDxUPj57fTsKICBncmFwaC5mb3JFYWNoKCh2ZXJ0ZXgsIGVkZ2VzKSB7CiAgICByZXN1bHRbdmVydGV4XSA9IG5ldyBTZXQ8VD4uZnJvbShlZGdlcyk7CiAgfSk7CgogIC8vIExpc3RzIGFyZSBmYXN0ZXIgdG8gaXRlcmF0ZSB0aGFuIG1hcHMsIHNvIHdlIGNyZWF0ZSBhIGxpc3Qgc2luY2Ugd2UncmUKICAvLyBpdGVyYXRpbmcgcmVwZWF0ZWRseS4KICB2YXIga2V5cyA9IGdyYXBoLmtleXMudG9MaXN0KCk7CiAgZm9yICh2YXIgdmVydGV4MSBpbiBrZXlzKSB7CiAgICBmb3IgKHZhciB2ZXJ0ZXgyIGluIGtleXMpIHsKICAgICAgZm9yICh2YXIgdmVydGV4MyBpbiBrZXlzKSB7CiAgICAgICAgaWYgKHJlc3VsdFt2ZXJ0ZXgyXS5jb250YWlucyh2ZXJ0ZXgxKSAmJgogICAgICAgICAgICByZXN1bHRbdmVydGV4MV0uY29udGFpbnModmVydGV4MykpIHsKICAgICAgICAgIHJlc3VsdFt2ZXJ0ZXgyXS5hZGQodmVydGV4Myk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcmVzdWx0Owp9CgovLy8gUmV0dXJucyB0aGUgW3N0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzXVtdIG9mIFtncmFwaF0sIGluIHRvcG9sb2dpY2FsCi8vLyBvcmRlci4KLy8vCi8vLyBbc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHNdOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdHJvbmdseV9jb25uZWN0ZWRfY29tcG9uZW50Ci8vLwovLy8gSW50ZXJwcmV0cyBbZ3JhcGhdIGFzIGEgZGlyZWN0ZWQgZ3JhcGggd2l0aCBhIHZlcnRleCBmb3IgZWFjaCBrZXkgYW5kIGVkZ2VzCi8vLyBmcm9tIGVhY2gga2V5IHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGUga2V5IG1hcHMgdG8uCi8vLwovLy8gQXNzdW1lcyB0aGF0IGV2ZXJ5IHZlcnRleCBpbiB0aGUgZ3JhcGggaGFzIGEga2V5IHRvIHJlcHJlc2VudCBpdCwgZXZlbiBpZgovLy8gdGhhdCB2ZXJ0ZXggaGFzIG5vIG91dGdvaW5nIGVkZ2VzLiBUaGlzIGlzbid0IGNoZWNrZWQsIGJ1dCBpZiBpdCdzIG5vdAovLy8gc2F0aXNmaWVkLCB0aGUgZnVuY3Rpb24gbWF5IGNyYXNoIG9yIHByb3ZpZGUgdW5leHBlY3RlZCBvdXRwdXQuIEZvciBleGFtcGxlLAovLy8gYHsiYSI6IFsiYiJdfWAgaXMgbm90IHZhbGlkLCBidXQgYHsiYSI6IFsiYiJdLCAiYiI6IFtdfWAgaXMuCkxpc3Q8U2V0PFQ+PiBzdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHM8VD4oTWFwPFQsIEl0ZXJhYmxlPFQ+PiBncmFwaCkgewogIC8vIFRoaXMgdXNlcyBbVGFyamFuJ3MgYWxnb3JpdGhtXVtdLgogIC8vCiAgLy8gW1RhcmphbidzIGFsZ29yaXRobV06IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RhcmphbiUyN3Nfc3Ryb25nbHlfY29ubmVjdGVkX2NvbXBvbmVudHNfYWxnb3JpdGhtCiAgdmFyIGluZGV4ID0gMDsKICB2YXIgc3RhY2sgPSA8VD5bXTsKICB2YXIgcmVzdWx0ID0gPFNldDxUPj5bXTsKCiAgLy8gVGhlIG9yZGVyIG9mIHRoZXNlIGRvZXNuJ3QgbWF0dGVyLCBzbyB3ZSB1c2UgdW4tbGlua2VkIGltcGxlbWVudGF0aW9ucyB0bwogIC8vIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJoZWFkLgogIHZhciBpbmRpY2VzID0gbmV3IEhhc2hNYXA8VCwgaW50PigpOwogIHZhciBsb3dMaW5rcyA9IG5ldyBIYXNoTWFwPFQsIGludD4oKTsKICB2YXIgb25TdGFjayA9IG5ldyBIYXNoU2V0PFQ+KCk7CgogIHN0cm9uZ0Nvbm5lY3QoVCB2ZXJ0ZXgpIHsKICAgIGluZGljZXNbdmVydGV4XSA9IGluZGV4OwogICAgbG93TGlua3NbdmVydGV4XSA9IGluZGV4OwogICAgaW5kZXgrKzsKCiAgICBzdGFjay5hZGQodmVydGV4KTsKICAgIG9uU3RhY2suYWRkKHZlcnRleCk7CgogICAgZm9yICh2YXIgc3VjY2Vzc29yIGluIGdyYXBoW3ZlcnRleF0pIHsKICAgICAgaWYgKCFpbmRpY2VzLmNvbnRhaW5zS2V5KHN1Y2Nlc3NvcikpIHsKICAgICAgICBzdHJvbmdDb25uZWN0KHN1Y2Nlc3Nvcik7CiAgICAgICAgbG93TGlua3NbdmVydGV4XSA9IG1hdGgubWluKGxvd0xpbmtzW3ZlcnRleF0sIGxvd0xpbmtzW3N1Y2Nlc3Nvcl0pOwogICAgICB9IGVsc2UgaWYgKG9uU3RhY2suY29udGFpbnMoc3VjY2Vzc29yKSkgewogICAgICAgIGxvd0xpbmtzW3ZlcnRleF0gPSBtYXRoLm1pbihsb3dMaW5rc1t2ZXJ0ZXhdLCBsb3dMaW5rc1tzdWNjZXNzb3JdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChsb3dMaW5rc1t2ZXJ0ZXhdID09IGluZGljZXNbdmVydGV4XSkgewogICAgICB2YXIgY29tcG9uZW50ID0gbmV3IFNldDxUPigpOwogICAgICBUIG5laWdoYm9yOwogICAgICBkbyB7CiAgICAgICAgbmVpZ2hib3IgPSBzdGFjay5yZW1vdmVMYXN0KCk7CiAgICAgICAgb25TdGFjay5yZW1vdmUobmVpZ2hib3IpOwogICAgICAgIGNvbXBvbmVudC5hZGQobmVpZ2hib3IpOwogICAgICB9IHdoaWxlIChuZWlnaGJvciAhPSB2ZXJ0ZXgpOwogICAgICByZXN1bHQuYWRkKGNvbXBvbmVudCk7CiAgICB9CiAgfQoKICBmb3IgKHZhciB2ZXJ0ZXggaW4gZ3JhcGgua2V5cykgewogICAgaWYgKCFpbmRpY2VzLmNvbnRhaW5zS2V5KHZlcnRleCkpIHN0cm9uZ0Nvbm5lY3QodmVydGV4KTsKICB9CgogIC8vIFRhcmphbidzIGFsZ29yaXRobSBwcm9kdWNlcyBhIHJldmVyc2UtdG9wb2xvZ2ljYWwgc29ydCwgc28gd2UgcmV2ZXJzZSBpdCB0bwogIC8vIGdldCBhIG5vcm1hbCB0b3BvbG9naWNhbCBzb3J0LgogIHJldHVybiByZXN1bHQucmV2ZXJzZWQudG9MaXN0KCk7Cn0KgM0ATk48ARocARUBT0s7BE00ND4nLQEbIz0GEQIBSgRPUEI6JSkyASESSwYRAgFEBFBPGkYcIDgXBA4CAUwLBFBQMTgpIwEOECArSRojBgQTAgFMCwRQUDE4KSMBDhAgK0kaIwYEEwIBMwRLBFA2BE5LUUFBUBUFfh4iLQYBTBsiHiAiMTEoCggGBAERAgFNCwRgBFA2BE5LUUFJJwVsERUbAU8hJygiARwdHg0BFxkBKy0iTDBMCAYBLyQSCyciISQdBgQBIz0EAVEkIwIBJXBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZnVuY3Rpb25zLmRhcnRYZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbGxlY3Rpb24vbGliL3NyYy9pdGVyYWJsZV96aXAuZGFydIceLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIjsKCi8vLyBJdGVyYWJsZSB0aGF0IGl0ZXJhdGVzIG92ZXIgbGlzdHMgb2YgdmFsdWVzIGZyb20gb3RoZXIgaXRlcmFibGVzLgovLy8KLy8vIFdoZW4gW2l0ZXJhdG9yXSBpcyByZWFkLCBhbiBbSXRlcmF0b3JdIGlzIGNyZWF0ZWQgZm9yIGVhY2ggW0l0ZXJhYmxlXSBpbgovLy8gdGhlIFtJdGVyYWJsZV0gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBBcyBsb25nIGFzIGFsbCB0aGVzZSBpdGVyYXRvcnMgaGF2ZSBhIG5leHQgdmFsdWUsIHRob3NlIG5leHQgdmFsdWVzIGFyZQovLy8gY29tYmluZWQgaW50byBhIHNpbmdsZSBsaXN0LCB3aGljaCBiZWNvbWVzIHRoZSBuZXh0IHZhbHVlIG9mIHRoaXMKLy8vIFtJdGVyYWJsZV0ncyBbSXRlcmF0b3JdLiBBcyBzb29uIGFzIGFueSBvZiB0aGUgaXRlcmF0b3JzIHJ1biBvdXQsCi8vLyB0aGUgemlwcGVkIGl0ZXJhdG9yIGFsc28gc3RvcHMuCmNsYXNzIEl0ZXJhYmxlWmlwPFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPExpc3Q8VD4+IHsKICBmaW5hbCBJdGVyYWJsZTxJdGVyYWJsZTxUPj4gX2l0ZXJhYmxlczsKCiAgSXRlcmFibGVaaXAoSXRlcmFibGU8SXRlcmFibGU8VD4+IGl0ZXJhYmxlcykgOiB0aGlzLl9pdGVyYWJsZXMgPSBpdGVyYWJsZXM7CgogIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgY29tYmluZXMgdmFsdWVzIG9mIHRoZSBpdGVyYWJsZXMnIGl0ZXJhdG9ycwogIC8vLyBhcyBsb25nIGFzIHRoZXkgYWxsIGhhdmUgdmFsdWVzLgogIEl0ZXJhdG9yPExpc3Q8VD4+IGdldCBpdGVyYXRvciB7CiAgICB2YXIgaXRlcmF0b3JzID0gX2l0ZXJhYmxlcy5tYXAoKHgpID0+IHguaXRlcmF0b3IpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgLy8gVE9ETyhscm4pOiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgZGlyZWN0bHkgaWYgaXRlcmF0b3JzIGlzIGVtcHR5PwogICAgcmV0dXJuIG5ldyBfSXRlcmF0b3JaaXA8VD4oaXRlcmF0b3JzKTsKICB9Cn0KCmNsYXNzIF9JdGVyYXRvclppcDxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPExpc3Q8VD4+IHsKICBmaW5hbCBMaXN0PEl0ZXJhdG9yPFQ+PiBfaXRlcmF0b3JzOwogIExpc3Q8VD4gX2N1cnJlbnQ7CgogIF9JdGVyYXRvclppcChMaXN0PEl0ZXJhdG9yPFQ+PiBpdGVyYXRvcnMpIDogX2l0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaXRlcmF0b3JzLmlzRW1wdHkpIHJldHVybiBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2l0ZXJhdG9ycy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIV9pdGVyYXRvcnNbaV0ubW92ZU5leHQoKSkgewogICAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIF9jdXJyZW50ID0gbmV3IExpc3QoX2l0ZXJhdG9ycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaXRlcmF0b3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgIF9jdXJyZW50W2ldID0gX2l0ZXJhdG9yc1tpXS5jdXJyZW50OwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBMaXN0PFQ+IGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CjYATk48ARoBRgRNLgRMRkYkNSoBTgFLJyNPSysEAgE1JhQBRgEUKjInGRYIBiwyKwYRBAEjAgEocGFja2FnZTpjb2xsZWN0aW9uL3NyYy9pdGVyYWJsZV96aXAuZGFydFpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL3ByaW9yaXR5X3F1ZXVlLmRhcnSrpy8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CgppbXBvcnQgInV0aWxzLmRhcnQiOwoKLy8vIEEgcHJpb3JpdHkgcXVldWUgaXMgYSBwcmlvcml0eSBiYXNlZCB3b3JrLWxpc3Qgb2YgZWxlbWVudHMuCi8vLwovLy8gVGhlIHF1ZXVlIGFsbG93cyBhZGRpbmcgZWxlbWVudHMsIGFuZCByZW1vdmluZyB0aGVtIGFnYWluIGluIHByaW9yaXR5IG9yZGVyLgphYnN0cmFjdCBjbGFzcyBQcmlvcml0eVF1ZXVlPEU+IHsKICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBbUHJpb3JpdHlRdWV1ZV0uCiAgLy8vCiAgLy8vIFRoZSBjcmVhdGVkIFtQcmlvcml0eVF1ZXVlXSBpcyBhIHBsYWluIFtIZWFwUHJpb3JpdHlRdWV1ZV0uCiAgLy8vCiAgLy8vIFRoZSBbY29tcGFyaXNvbl0gaXMgYSBbQ29tcGFyYXRvcl0gdXNlZCB0byBjb21wYXJlIHRoZSBwcmlvcml0eSBvZgogIC8vLyBlbGVtZW50cy4gQW4gZWxlbWVudCB0aGF0IGNvbXBhcmVzIGFzIGxlc3MgdGhhbiBhbm90aGVyIGVsZW1lbnQgaGFzCiAgLy8vIGEgaGlnaGVyIHByaW9yaXR5LgogIC8vLwogIC8vLyBJZiBbY29tcGFyaXNvbl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW0NvbXBhcmFibGUuY29tcGFyZV0uIElmIHRoaXMKICAvLy8gaXMgdGhlIGNhc2UsIGBFYCBtdXN0IGltcGxlbWVudCBbQ29tcGFyYWJsZV0sIGFuZCB0aGlzIGlzIGNoZWNrZWQgYXQKICAvLy8gcnVudGltZSBmb3IgZXZlcnkgY29tcGFyaXNvbi4KICBmYWN0b3J5IFByaW9yaXR5UXVldWUoW2ludCBjb21wYXJpc29uKEUgZTEsIEUgZTIpXSkgPSBIZWFwUHJpb3JpdHlRdWV1ZTxFPjsKCiAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUuCiAgaW50IGdldCBsZW5ndGg7CgogIC8vLyBXaGV0aGVyIHRoZSBxdWV1ZSBpcyBlbXB0eS4KICBib29sIGdldCBpc0VtcHR5OwoKICAvLy8gV2hldGhlciB0aGUgcXVldWUgaGFzIGFueSBlbGVtZW50cy4KICBib29sIGdldCBpc05vdEVtcHR5OwoKICAvLy8gQ2hlY2tzIGlmIFtvYmplY3RdIGlzIGluIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIGZvdW5kLgogIGJvb2wgY29udGFpbnMoRSBvYmplY3QpOwoKICAvLy8gQWRkcyBlbGVtZW50IHRvIHRoZSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIGVsZW1lbnQgd2lsbCBiZWNvbWUgdGhlIG5leHQgdG8gYmUgcmVtb3ZlZCBieSBbcmVtb3ZlRmlyc3RdCiAgLy8vIHdoZW4gYWxsIGVsZW1lbnRzIHdpdGggaGlnaGVyIHByaW9yaXR5IGhhdmUgYmVlbiByZW1vdmVkLgogIHZvaWQgYWRkKEUgZWxlbWVudCk7CgogIC8vLyBBZGRzIGFsbCBbZWxlbWVudHNdIHRvIHRoZSBxdWV1ZS4KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cyk7CgogIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IFtyZW1vdmVGaXJzdF0uCiAgLy8vCiAgLy8vIFRoZSBlbGVtZW50IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBUaGUgcXVldWUgbXVzdCBub3QgYmUgZW1wdHkgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgRSBnZXQgZmlyc3Q7CgogIC8vLyBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCiAgLy8vCiAgLy8vIFJlcGVhdGVkbHkgY2FsbGluZyB0aGlzIG1ldGhvZCwgd2l0aG91dCBhZGRpbmcgZWxlbWVudCBpbiBiZXR3ZWVuLAogIC8vLyBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBlbGVtZW50cyBpbiBub24tZGVjcmVhc2luZyBvcmRlciBhcywgc3BlY2lmaWVkIGJ5CiAgLy8vIFtjb21wYXJpc29uXS4KICAvLy8KICAvLy8gVGhlIHF1ZXVlIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogIEUgcmVtb3ZlRmlyc3QoKTsKCiAgLy8vIFJlbW92ZXMgYW4gZWxlbWVudCB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIFtlbGVtZW50XSBpbiB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbiBlbGVtZW50IGlzIGZvdW5kIGFuZCByZW1vdmVkLAogIC8vLyBhbmQgZmFsc2UgaWYgbm8gZXF1YWwgZWxlbWVudCBpcyBmb3VuZC4KICBib29sIHJlbW92ZShFIGVsZW1lbnQpOwoKICAvLy8gUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBxdWV1ZSBhbmQgcmV0dXJucyB0aGVtLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgaXRlcmFibGUgaGFzIG5vIHNwZWNpZmllZCBvcmRlci4KICBJdGVyYWJsZTxFPiByZW1vdmVBbGwoKTsKCiAgLy8vIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUuCiAgdm9pZCBjbGVhcigpOwoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgcXVldWUgaW4gcHJpb3JpdHkgb3JkZXIuCiAgLy8vCiAgLy8vIFRoZSBxdWV1ZSBpcyBub3QgbW9kaWZpZWQuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBpcyB0aGUgb3JkZXIgdGhhdCB0aGUgZWxlbWVudHMgd291bGQgYmUgaW4gaWYgdGhleSB3ZXJlCiAgLy8vIHJlbW92ZWQgZnJvbSB0aGlzIHF1ZXVlIHVzaW5nIFtyZW1vdmVGaXJzdF0uCiAgTGlzdDxFPiB0b0xpc3QoKTsKCiAgLy8vIFJldHVybiBhIGNvbXBhcmF0b3IgYmFzZWQgc2V0IHVzaW5nIHRoZSBjb21wYXJhdG9yIG9mIHRoaXMgcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBxdWV1ZSBpcyBub3QgbW9kaWZpZWQuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBbU2V0XSBpcyBjdXJyZW50bHkgYSBbU3BsYXlUcmVlU2V0XSwKICAvLy8gYnV0IHRoaXMgbWF5IGNoYW5nZSBhcyBvdGhlciBvcmRlcmVkIHNldHMgYXJlIGltcGxlbWVudGVkLgogIC8vLwogIC8vLyBUaGUgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBxdWV1ZS4KICAvLy8gSWYgYW4gZWxlbWVudCBvY2N1cnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHF1ZXVlLAogIC8vLyB0aGUgc2V0IHdpbGwgY29udGFpbiBpdCBvbmx5IG9uY2UuCiAgU2V0PEU+IHRvU2V0KCk7Cn0KCi8vLyBIZWFwIGJhc2VkIHByaW9yaXR5IHF1ZXVlLgovLy8KLy8vIFRoZSBlbGVtZW50cyBhcmUga2VwdCBpbiBhIGhlYXAgc3RydWN0dXJlLAovLy8gd2hlcmUgdGhlIGVsZW1lbnQgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSBpcyBpbW1lZGlhdGVseSBhY2Nlc3NpYmxlLAovLy8gYW5kIG1vZGlmeWluZyBhIHNpbmdsZSBlbGVtZW50IHRha2VzCi8vLyBsb2dhcml0aG1pYyB0aW1lIGluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb24gYXZlcmFnZS4KLy8vCi8vLyAqIFRoZSBbYWRkXSBhbmQgW3JlbW92ZUZpcnN0XSBvcGVyYXRpb25zIHRha2UgYW1vcnRpemVkIGxvZ2FyaXRobWljIHRpbWUsCi8vLyAgIE8obG9nKG4pKSwgYnV0IG1heSBvY2Nhc2lvbmFsbHkgdGFrZSBsaW5lYXIgdGltZSB3aGVuIGdyb3dpbmcgdGhlIGNhcGFjaXR5Ci8vLyAgIG9mIHRoZSBoZWFwLgovLy8gKiBUaGUgW2FkZEFsbF0gb3BlcmF0aW9uIHdvcmtzIGFzIGRvaW5nIHJlcGVhdGVkIFthZGRdIG9wZXJhdGlvbnMuCi8vLyAqIFRoZSBbZmlyc3RdIGdldHRlciB0YWtlcyBjb25zdGFudCB0aW1lLCBPKDEpLgovLy8gKiBUaGUgW2NsZWFyXSBhbmQgW3JlbW92ZUFsbF0gbWV0aG9kcyBhbHNvIHRha2UgY29uc3RhbnQgdGltZSwgTygxKS4KLy8vICogVGhlIFtjb250YWluc10gYW5kIFtyZW1vdmVdIG9wZXJhdGlvbnMgbWF5IG5lZWQgdG8gc2VhcmNoIHRoZSBlbnRpcmUKLy8vICAgcXVldWUgZm9yIHRoZSBlbGVtZW50cywgdGFraW5nIE8obikgdGltZS4KLy8vICogVGhlIFt0b0xpc3RdIG9wZXJhdGlvbiBlZmZlY3RpdmVseSBzb3J0cyB0aGUgZWxlbWVudHMsIHRha2luZyBPKG4qbG9nKG4pKQovLy8gICB0aW1lLgovLy8gKiBUaGUgW3RvU2V0XSBvcGVyYXRpb24gZWZmZWN0aXZlbHkgYWRkcyBlYWNoIGVsZW1lbnQgdG8gdGhlIG5ldyBzZXQsIHRha2luZwovLy8gICBhbiBleHBlY3RlZCBPKG4qbG9nKG4pKSB0aW1lLgpjbGFzcyBIZWFwUHJpb3JpdHlRdWV1ZTxFPiBpbXBsZW1lbnRzIFByaW9yaXR5UXVldWU8RT4gewogIC8vLyBJbml0aWFsIGNhcGFjaXR5IG9mIGEgcXVldWUgd2hlbiBjcmVhdGVkLCBvciB3aGVuIGFkZGVkIHRvIGFmdGVyIGEKICAvLy8gW2NsZWFyXS4KICAvLy8KICAvLy8gTnVtYmVyIGNhbiBiZSBhbnkgcG9zaXRpdmUgdmFsdWUuIFBpY2tpbmcgYSBzaXplIHRoYXQgZ2l2ZXMgYSB3aG9sZQogIC8vLyBudW1iZXIgb2YgInRyZWUgbGV2ZWxzIiBpbiB0aGUgaGVhcCBpcyBvbmx5IGRvbmUgZm9yIGFlc3RoZXRpYyByZWFzb25zLgogIHN0YXRpYyBjb25zdCBpbnQgX0lOSVRJQUxfQ0FQQUNJVFkgPSA3OwoKICAvLy8gVGhlIGNvbXBhcmlzb24gYmVpbmcgdXNlZCB0byBjb21wYXJlIHRoZSBwcmlvcml0eSBvZiBlbGVtZW50cy4KICBmaW5hbCBDb21wYXJhdG9yPEU+IGNvbXBhcmlzb247CgogIC8vLyBMaXN0IGltcGxlbWVudGF0aW9uIG9mIGEgaGVhcC4KICBMaXN0PEU+IF9xdWV1ZSA9IG5ldyBMaXN0PEU+KF9JTklUSUFMX0NBUEFDSVRZKTsKCiAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIGhlYXAgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGZpcnN0IFtfbGVuZ3RoXSBlbnRyaWVzIG9mIFtfcXVldWVdLgogIGludCBfbGVuZ3RoID0gMDsKCiAgLy8vIENyZWF0ZSBhIG5ldyBwcmlvcml0eSBxdWV1ZS4KICAvLy8KICAvLy8gVGhlIFtjb21wYXJpc29uXSBpcyBhIFtDb21wYXJhdG9yXSB1c2VkIHRvIGNvbXBhcmUgdGhlIHByaW9yaXR5IG9mCiAgLy8vIGVsZW1lbnRzLiBBbiBlbGVtZW50IHRoYXQgY29tcGFyZXMgYXMgbGVzcyB0aGFuIGFub3RoZXIgZWxlbWVudCBoYXMKICAvLy8gYSBoaWdoZXIgcHJpb3JpdHkuCiAgLy8vCiAgLy8vIElmIFtjb21wYXJpc29uXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBbQ29tcGFyYWJsZS5jb21wYXJlXS4gSWYgdGhpcwogIC8vLyBpcyB0aGUgY2FzZSwgYEVgIG11c3QgaW1wbGVtZW50IFtDb21wYXJhYmxlXSwgYW5kIHRoaXMgaXMgY2hlY2tlZCBhdAogIC8vLyBydW50aW1lIGZvciBldmVyeSBjb21wYXJpc29uLgogIEhlYXBQcmlvcml0eVF1ZXVlKFtpbnQgY29tcGFyaXNvbihFIGUxLCBFIGUyKV0pCiAgICAgIDogY29tcGFyaXNvbiA9IGNvbXBhcmlzb24gPz8gZGVmYXVsdENvbXBhcmU8RT4oKTsKCiAgdm9pZCBhZGQoRSBlbGVtZW50KSB7CiAgICBfYWRkKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIF9hZGQoZWxlbWVudCk7CiAgICB9CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX3F1ZXVlID0gY29uc3QgW107CiAgICBfbGVuZ3RoID0gMDsKICB9CgogIGJvb2wgY29udGFpbnMoRSBvYmplY3QpIHsKICAgIHJldHVybiBfbG9jYXRlKG9iamVjdCkgPj0gMDsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChfbGVuZ3RoID09IDApIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBzdWNoIGVsZW1lbnQiKTsKICAgIHJldHVybiBfcXVldWVbMF07CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IF9sZW5ndGggPT0gMDsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbGVuZ3RoICE9IDA7CgogIGludCBnZXQgbGVuZ3RoID0+IF9sZW5ndGg7CgogIGJvb2wgcmVtb3ZlKEUgZWxlbWVudCkgewogICAgaW50IGluZGV4ID0gX2xvY2F0ZShlbGVtZW50KTsKICAgIGlmIChpbmRleCA8IDApIHJldHVybiBmYWxzZTsKICAgIEUgbGFzdCA9IF9yZW1vdmVMYXN0KCk7CiAgICBpZiAoaW5kZXggPCBfbGVuZ3RoKSB7CiAgICAgIGludCBjb21wID0gY29tcGFyaXNvbihsYXN0LCBlbGVtZW50KTsKICAgICAgaWYgKGNvbXAgPD0gMCkgewogICAgICAgIF9idWJibGVVcChsYXN0LCBpbmRleCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2J1YmJsZURvd24obGFzdCwgaW5kZXgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEl0ZXJhYmxlPEU+IHJlbW92ZUFsbCgpIHsKICAgIExpc3Q8RT4gcmVzdWx0ID0gX3F1ZXVlOwogICAgaW50IGxlbmd0aCA9IF9sZW5ndGg7CiAgICBfcXVldWUgPSBjb25zdCBbXTsKICAgIF9sZW5ndGggPSAwOwogICAgcmV0dXJuIHJlc3VsdC50YWtlKGxlbmd0aCk7CiAgfQoKICBFIHJlbW92ZUZpcnN0KCkgewogICAgaWYgKF9sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIHN1Y2ggZWxlbWVudCIpOwogICAgRSByZXN1bHQgPSBfcXVldWVbMF07CiAgICBFIGxhc3QgPSBfcmVtb3ZlTGFzdCgpOwogICAgaWYgKF9sZW5ndGggPiAwKSB7CiAgICAgIF9idWJibGVEb3duKGxhc3QsIDApOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpc3Q8RT4gdG9MaXN0KCkgewogICAgTGlzdDxFPiBsaXN0ID0gbmV3IExpc3Q8RT4oKS4ubGVuZ3RoID0gX2xlbmd0aDsKICAgIGxpc3Quc2V0UmFuZ2UoMCwgX2xlbmd0aCwgX3F1ZXVlKTsKICAgIGxpc3Quc29ydChjb21wYXJpc29uKTsKICAgIHJldHVybiBsaXN0OwogIH0KCiAgU2V0PEU+IHRvU2V0KCkgewogICAgU2V0PEU+IHNldCA9IG5ldyBTcGxheVRyZWVTZXQ8RT4oY29tcGFyaXNvbik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9sZW5ndGg7IGkrKykgewogICAgICBzZXQuYWRkKF9xdWV1ZVtpXSk7CiAgICB9CiAgICByZXR1cm4gc2V0OwogIH0KCiAgLy8vIFJldHVybnMgc29tZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVldWUuCiAgLy8vCiAgLy8vIFRoZSBmb3JtYXQgaXNuJ3Qgc2lnbmlmaWNhbnQsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIF9xdWV1ZS50YWtlKF9sZW5ndGgpLnRvU3RyaW5nKCk7CiAgfQoKICAvLy8gQWRkIGVsZW1lbnQgdG8gdGhlIHF1ZXVlLgogIC8vLwogIC8vLyBHcm93cyB0aGUgY2FwYWNpdHkgaWYgdGhlIGJhY2tpbmcgbGlzdCBpcyBmdWxsLgogIHZvaWQgX2FkZChFIGVsZW1lbnQpIHsKICAgIGlmIChfbGVuZ3RoID09IF9xdWV1ZS5sZW5ndGgpIF9ncm93KCk7CiAgICBfYnViYmxlVXAoZWxlbWVudCwgX2xlbmd0aCsrKTsKICB9CgogIC8vLyBGaW5kIHRoZSBpbmRleCBvZiBhbiBvYmplY3QgaW4gdGhlIGhlYXAuCiAgLy8vCiAgLy8vIFJldHVybnMgLTEgaWYgdGhlIG9iamVjdCBpcyBub3QgZm91bmQuCiAgaW50IF9sb2NhdGUoRSBvYmplY3QpIHsKICAgIGlmIChfbGVuZ3RoID09IDApIHJldHVybiAtMTsKICAgIC8vIENvdW50IHBvc2l0aW9ucyBmcm9tIG9uZSBpbnN0ZWFkIG9mIHplcm8uIFRoaXMgZ2l2ZXMgdGhlIG51bWJlcnMKICAgIC8vIHNvbWUgbmljZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgYWxsIHJpZ2h0IGNoaWxkcmVuIGFyZSBvZGQsCiAgICAvLyB0aGVpciBsZWZ0IHNpYmxpbmcgaXMgZXZlbiwgYW5kIHRoZSBwYXJlbnQgaXMgZm91bmQgYnkgc2hpZnRpbmcKICAgIC8vIHJpZ2h0IGJ5IG9uZS4KICAgIC8vIFZhbGlkIHJhbmdlIGZvciBwb3NpdGlvbiBpcyBbMS4uX2xlbmd0aF0sIGluY2x1c2l2ZS4KICAgIGludCBwb3NpdGlvbiA9IDE7CiAgICAvLyBQcmUtb3JkZXIgZGVwdGggZmlyc3Qgc2VhcmNoLCBvbWl0IGNoaWxkIG5vZGVzIGlmIHRoZSBjdXJyZW50CiAgICAvLyBub2RlIGhhcyBsb3dlciBwcmlvcml0eSB0aGFuIFtvYmplY3RdLCBiZWNhdXNlIGFsbCBub2RlcyBsb3dlcgogICAgLy8gaW4gdGhlIGhlYXAgd2lsbCBhbHNvIGhhdmUgbG93ZXIgcHJpb3JpdHkuCiAgICBkbyB7CiAgICAgIGludCBpbmRleCA9IHBvc2l0aW9uIC0gMTsKICAgICAgRSBlbGVtZW50ID0gX3F1ZXVlW2luZGV4XTsKICAgICAgaW50IGNvbXAgPSBjb21wYXJpc29uKGVsZW1lbnQsIG9iamVjdCk7CiAgICAgIGlmIChjb21wID09IDApIHJldHVybiBpbmRleDsKICAgICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgICAgLy8gRWxlbWVudCBtYXkgYmUgaW4gc3VidHJlZS4KICAgICAgICAvLyBDb250aW51ZSB3aXRoIHRoZSBsZWZ0IGNoaWxkLCBpZiBpdCBpcyB0aGVyZS4KICAgICAgICBpbnQgbGVmdENoaWxkUG9zaXRpb24gPSBwb3NpdGlvbiAqIDI7CiAgICAgICAgaWYgKGxlZnRDaGlsZFBvc2l0aW9uIDw9IF9sZW5ndGgpIHsKICAgICAgICAgIHBvc2l0aW9uID0gbGVmdENoaWxkUG9zaXRpb247CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gRmluZCB0aGUgbmV4dCByaWdodCBzaWJsaW5nIG9yIHJpZ2h0IGFuY2VzdG9yIHNpYmxpbmcuCiAgICAgIGRvIHsKICAgICAgICB3aGlsZSAocG9zaXRpb24uaXNPZGQpIHsKICAgICAgICAgIC8vIFdoaWxlIHBvc2l0aW9uIGlzIGEgcmlnaHQgY2hpbGQsIGdvIHRvIHRoZSBwYXJlbnQuCiAgICAgICAgICBwb3NpdGlvbiA+Pj0gMTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlbiBnbyB0byB0aGUgcmlnaHQgc2libGluZyBvZiB0aGUgbGVmdC1jaGlsZC4KICAgICAgICBwb3NpdGlvbiArPSAxOwogICAgICB9IHdoaWxlIChwb3NpdGlvbiA+IF9sZW5ndGgpOyAvLyBIYXBwZW5zIGlmIGxhc3QgZWxlbWVudCBpcyBhIGxlZnQgY2hpbGQuCiAgICB9IHdoaWxlIChwb3NpdGlvbiAhPSAxKTsgLy8gQXQgcm9vdCBhZ2Fpbi4gSGFwcGVucyBmb3IgcmlnaHQtbW9zdCBlbGVtZW50LgogICAgcmV0dXJuIC0xOwogIH0KCiAgRSBfcmVtb3ZlTGFzdCgpIHsKICAgIGludCBuZXdMZW5ndGggPSBfbGVuZ3RoIC0gMTsKICAgIEUgbGFzdCA9IF9xdWV1ZVtuZXdMZW5ndGhdOwogICAgX3F1ZXVlW25ld0xlbmd0aF0gPSBudWxsOwogICAgX2xlbmd0aCA9IG5ld0xlbmd0aDsKICAgIHJldHVybiBsYXN0OwogIH0KCiAgLy8vIFBsYWNlIFtlbGVtZW50XSBpbiBoZWFwIGF0IFtpbmRleF0gb3IgYWJvdmUuCiAgLy8vCiAgLy8vIFB1dCBlbGVtZW50IGludG8gdGhlIGVtcHR5IGNlbGwgYXQgYGluZGV4YC4KICAvLy8gV2hpbGUgdGhlIGBlbGVtZW50YCBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlCiAgLy8vIHBhcmVudCwgc3dhcCBpdCB3aXRoIHRoZSBwYXJlbnQuCiAgdm9pZCBfYnViYmxlVXAoRSBlbGVtZW50LCBpbnQgaW5kZXgpIHsKICAgIHdoaWxlIChpbmRleCA+IDApIHsKICAgICAgaW50IHBhcmVudEluZGV4ID0gKGluZGV4IC0gMSkgfi8gMjsKICAgICAgRSBwYXJlbnQgPSBfcXVldWVbcGFyZW50SW5kZXhdOwogICAgICBpZiAoY29tcGFyaXNvbihlbGVtZW50LCBwYXJlbnQpID4gMCkgYnJlYWs7CiAgICAgIF9xdWV1ZVtpbmRleF0gPSBwYXJlbnQ7CiAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7CiAgICB9CiAgICBfcXVldWVbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIC8vLyBQbGFjZSBbZWxlbWVudF0gaW4gaGVhcCBhdCBbaW5kZXhdIG9yIGFib3ZlLgogIC8vLwogIC8vLyBQdXQgZWxlbWVudCBpbnRvIHRoZSBlbXB0eSBjZWxsIGF0IGBpbmRleGAuCiAgLy8vIFdoaWxlIHRoZSBgZWxlbWVudGAgaGFzIGxvd2VyIHByaW9yaXR5IHRoYW4gZWl0aGVyIGNoaWxkLAogIC8vLyBzd2FwIGl0IHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgY2hpbGQuCiAgdm9pZCBfYnViYmxlRG93bihFIGVsZW1lbnQsIGludCBpbmRleCkgewogICAgaW50IHJpZ2h0Q2hpbGRJbmRleCA9IGluZGV4ICogMiArIDI7CiAgICB3aGlsZSAocmlnaHRDaGlsZEluZGV4IDwgX2xlbmd0aCkgewogICAgICBpbnQgbGVmdENoaWxkSW5kZXggPSByaWdodENoaWxkSW5kZXggLSAxOwogICAgICBFIGxlZnRDaGlsZCA9IF9xdWV1ZVtsZWZ0Q2hpbGRJbmRleF07CiAgICAgIEUgcmlnaHRDaGlsZCA9IF9xdWV1ZVtyaWdodENoaWxkSW5kZXhdOwogICAgICBpbnQgY29tcCA9IGNvbXBhcmlzb24obGVmdENoaWxkLCByaWdodENoaWxkKTsKICAgICAgaW50IG1pbkNoaWxkSW5kZXg7CiAgICAgIEUgbWluQ2hpbGQ7CiAgICAgIGlmIChjb21wIDwgMCkgewogICAgICAgIG1pbkNoaWxkID0gbGVmdENoaWxkOwogICAgICAgIG1pbkNoaWxkSW5kZXggPSBsZWZ0Q2hpbGRJbmRleDsKICAgICAgfSBlbHNlIHsKICAgICAgICBtaW5DaGlsZCA9IHJpZ2h0Q2hpbGQ7CiAgICAgICAgbWluQ2hpbGRJbmRleCA9IHJpZ2h0Q2hpbGRJbmRleDsKICAgICAgfQogICAgICBjb21wID0gY29tcGFyaXNvbihlbGVtZW50LCBtaW5DaGlsZCk7CiAgICAgIGlmIChjb21wIDw9IDApIHsKICAgICAgICBfcXVldWVbaW5kZXhdID0gZWxlbWVudDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3F1ZXVlW2luZGV4XSA9IG1pbkNoaWxkOwogICAgICBpbmRleCA9IG1pbkNoaWxkSW5kZXg7CiAgICAgIHJpZ2h0Q2hpbGRJbmRleCA9IGluZGV4ICogMiArIDI7CiAgICB9CiAgICBpbnQgbGVmdENoaWxkSW5kZXggPSByaWdodENoaWxkSW5kZXggLSAxOwogICAgaWYgKGxlZnRDaGlsZEluZGV4IDwgX2xlbmd0aCkgewogICAgICBFIGNoaWxkID0gX3F1ZXVlW2xlZnRDaGlsZEluZGV4XTsKICAgICAgaW50IGNvbXAgPSBjb21wYXJpc29uKGVsZW1lbnQsIGNoaWxkKTsKICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgX3F1ZXVlW2luZGV4XSA9IGNoaWxkOwogICAgICAgIGluZGV4ID0gbGVmdENoaWxkSW5kZXg7CiAgICAgIH0KICAgIH0KICAgIF9xdWV1ZVtpbmRleF0gPSBlbGVtZW50OwogIH0KCiAgLy8vIEdyb3dzIHRoZSBjYXBhY2l0eSBvZiB0aGUgbGlzdCBob2xkaW5nIHRoZSBoZWFwLgogIC8vLwogIC8vLyBDYWxsZWQgd2hlbiB0aGUgbGlzdCBpcyBmdWxsLgogIHZvaWQgX2dyb3coKSB7CiAgICBpbnQgbmV3Q2FwYWNpdHkgPSBfcXVldWUubGVuZ3RoICogMiArIDE7CiAgICBpZiAobmV3Q2FwYWNpdHkgPCBfSU5JVElBTF9DQVBBQ0lUWSkgbmV3Q2FwYWNpdHkgPSBfSU5JVElBTF9DQVBBQ0lUWTsKICAgIExpc3Q8RT4gbmV3UXVldWUgPSBuZXcgTGlzdDxFPihuZXdDYXBhY2l0eSk7CiAgICBuZXdRdWV1ZS5zZXRSYW5nZSgwLCBfbGVuZ3RoLCBfcXVldWUpOwogICAgX3F1ZXVlID0gbmV3UXVldWU7CiAgfQp9CoFqAE5OPAEaARUBQARRIigGQgZJShkGT0skTgEnEgEiFAEqFwEqBiwbASEGRkAXASglAUcGMQY+DwFBBklQFAY+EwFIBjcuGgFBBjQbATAQAUYGIQZIMxQBSAYhBjhBBjc4KRICAR8EL0spOwROURNHNElLMFAMUSQ5SQ8GSk4qAUUiASUzASMGShMBIwZJShkGT0skMjgBGBMEASYiFQYEAREXEQQBHCEEARA/FgQBJAEnAR0BGyIhHBssFyAPIggGEQQBHB0aFxEgBAEUPxocFxwGEwQBFTQnGxEEARMyKBoGEAQBMAZCFiwEASAGNhkrIwQBLwYtGiFIRkcVPBZFRjIJICEuIxYmOS4sKBQKCEALIUAaCjsXUE8PBAEUISAeGREEATMGMjcnKRgqJjIeGwYdBAEzBjJALyspKDAsLjQZEhYeKA8fKQgsFyEQCCAdJwYuJCgtFh8gCAYdBAE3BiQRLUoxKxcEAgEqcGFja2FnZTpjb2xsZWN0aW9uL3NyYy9wcmlvcml0eV9xdWV1ZS5kYXJ0VmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb2xsZWN0aW9uL2xpYi9zcmMvcXVldWVfbGlzdC5kYXJ0nlEvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKLy8vIEEgY2xhc3MgdGhhdCBlZmZpY2llbnRseSBpbXBsZW1lbnRzIGJvdGggW1F1ZXVlXSBhbmQgW0xpc3RdLgovLyBUT0RPKG53ZWl6KTogQ3VycmVudGx5IHRoaXMgY29kZSBpcyBjb3BpZWQgYWxtb3N0IHZlcmJhdGltIGZyb20KLy8gZGFydDpjb2xsZWN0aW9uLiBUaGUgb25seSBjaGFuZ2VzIGFyZSB0byBpbXBsZW1lbnQgTGlzdCBhbmQgdG8gcmVtb3ZlIG1ldGhvZHMKLy8gdGhhdCBhcmUgcmVkdW5kYW50IHdpdGggTGlzdE1peGluLiBSZW1vdmUgb3Igc2ltcGxpZnkgaXQgd2hlbiBpc3N1ZSAyMTMzMCBpcwovLyBmaXhlZC4KY2xhc3MgUXVldWVMaXN0PEU+IGV4dGVuZHMgT2JqZWN0IHdpdGggTGlzdE1peGluPEU+IGltcGxlbWVudHMgUXVldWU8RT4gewogIC8vLyBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYSBgUXVldWVMaXN0PFQ+YC4KICAvLy8KICAvLy8gQW55IHRpbWUgdGhlIGNsYXNzIHdvdWxkIHByb2R1Y2UgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBhIFtUXSwgdGhlIGVsZW1lbnQKICAvLy8gYWNjZXNzIHdpbGwgdGhyb3cuCiAgLy8vCiAgLy8vIEFueSB0aW1lIGEgW1RdIHZhbHVlIGlzIGF0dGVtcHRlZCBzdG9yZWQgaW50byB0aGUgYWRhcHRlZCBjbGFzcywgdGhlIHN0b3JlCiAgLy8vIHdpbGwgdGhyb3cgdW5sZXNzIHRoZSB2YWx1ZSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtTXS4KICAvLy8KICAvLy8gSWYgYWxsIGFjY2Vzc2VkIGVsZW1lbnRzIG9mIFtzb3VyY2VdIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdIGFuZCBpZgogIC8vLyBhbGwgZWxlbWVudHMgc3RvcmVkIGluIHRoZSByZXR1cm5lZCAgYXJlIGFjdHVhbGx5IGluc3RhbmNlIG9mIFtTXSwKICAvLy8gdGhlbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYXMgYSBgUXVldWVMaXN0PFQ+YC4KICBzdGF0aWMgUXVldWVMaXN0PFQ+IF9jYXN0RnJvbTxTLCBUPihRdWV1ZUxpc3Q8Uz4gc291cmNlKSB7CiAgICByZXR1cm4gbmV3IF9DYXN0UXVldWVMaXN0PFMsIFQ+KHNvdXJjZSk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gODsKICBMaXN0PEU+IF90YWJsZTsKICBpbnQgX2hlYWQ7CiAgaW50IF90YWlsOwoKICAvLy8gQ3JlYXRlIGFuIGVtcHR5IHF1ZXVlLgogIC8vLwogIC8vLyBJZiBbaW5pdGlhbENhcGFjaXR5XSBpcyBnaXZlbiwgcHJlcGFyZSB0aGUgcXVldWUgZm9yIGF0IGxlYXN0IHRoYXQgbWFueQogIC8vLyBlbGVtZW50cy4KICBRdWV1ZUxpc3QoW2ludCBpbml0aWFsQ2FwYWNpdHldKQogICAgICA6IF9oZWFkID0gMCwKICAgICAgICBfdGFpbCA9IDAgewogICAgaWYgKGluaXRpYWxDYXBhY2l0eSA9PSBudWxsIHx8IGluaXRpYWxDYXBhY2l0eSA8IF9JTklUSUFMX0NBUEFDSVRZKSB7CiAgICAgIGluaXRpYWxDYXBhY2l0eSA9IF9JTklUSUFMX0NBUEFDSVRZOwogICAgfSBlbHNlIGlmICghX2lzUG93ZXJPZjIoaW5pdGlhbENhcGFjaXR5KSkgewogICAgICBpbml0aWFsQ2FwYWNpdHkgPSBfbmV4dFBvd2VyT2YyKGluaXRpYWxDYXBhY2l0eSk7CiAgICB9CiAgICBhc3NlcnQoX2lzUG93ZXJPZjIoaW5pdGlhbENhcGFjaXR5KSk7CiAgICBfdGFibGUgPSBuZXcgTGlzdDxFPihpbml0aWFsQ2FwYWNpdHkpOwogIH0KCiAgLy8gQW4gaW50ZXJuYWwgY29uc3RydWN0b3IgZm9yIHVzZSBieSBfQ2FzdFF1ZXVlTGlzdC4KICBRdWV1ZUxpc3QuXygpOwoKICAvLy8gQ3JlYXRlIGEgcXVldWUgaW5pdGlhbGx5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIFtzb3VyY2VdLgogIGZhY3RvcnkgUXVldWVMaXN0LmZyb20oSXRlcmFibGU8RT4gc291cmNlKSB7CiAgICBpZiAoc291cmNlIGlzIExpc3QpIHsKICAgICAgaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICAgIFF1ZXVlTGlzdDxFPiBxdWV1ZSA9IG5ldyBRdWV1ZUxpc3QobGVuZ3RoICsgMSk7CiAgICAgIGFzc2VydChxdWV1ZS5fdGFibGUubGVuZ3RoID4gbGVuZ3RoKTsKICAgICAgdmFyIHNvdXJjZUxpc3QgPSBzb3VyY2U7CiAgICAgIHF1ZXVlLl90YWJsZS5zZXRSYW5nZSgwLCBsZW5ndGgsIHNvdXJjZUxpc3QsIDApOwogICAgICBxdWV1ZS5fdGFpbCA9IGxlbmd0aDsKICAgICAgcmV0dXJuIHF1ZXVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBRdWV1ZUxpc3Q8RT4oKS4uYWRkQWxsKHNvdXJjZSk7CiAgICB9CiAgfQoKICAvLyBDb2xsZWN0aW9uIGludGVyZmFjZS4KCiAgdm9pZCBhZGQoRSBlbGVtZW50KSB7CiAgICBfYWRkKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIGlmIChpdGVyYWJsZSBpcyBMaXN0KSB7CiAgICAgIHZhciBsaXN0ID0gaXRlcmFibGU7CiAgICAgIGludCBhZGRDb3VudCA9IGxpc3QubGVuZ3RoOwogICAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggKyBhZGRDb3VudCA+PSBfdGFibGUubGVuZ3RoKSB7CiAgICAgICAgX3ByZUdyb3cobGVuZ3RoICsgYWRkQ291bnQpOwogICAgICAgIC8vIEFmdGVyIHByZUdyb3csIGFsbCBlbGVtZW50cyBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgogICAgICAgIF90YWJsZS5zZXRSYW5nZShsZW5ndGgsIGxlbmd0aCArIGFkZENvdW50LCBsaXN0LCAwKTsKICAgICAgICBfdGFpbCArPSBhZGRDb3VudDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBBZGRpbmcgYWRkQ291bnQgZWxlbWVudHMgd29uJ3QgcmVhY2ggX2hlYWQuCiAgICAgICAgaW50IGVuZFNwYWNlID0gX3RhYmxlLmxlbmd0aCAtIF90YWlsOwogICAgICAgIGlmIChhZGRDb3VudCA8IGVuZFNwYWNlKSB7CiAgICAgICAgICBfdGFibGUuc2V0UmFuZ2UoX3RhaWwsIF90YWlsICsgYWRkQ291bnQsIGxpc3QsIDApOwogICAgICAgICAgX3RhaWwgKz0gYWRkQ291bnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludCBwcmVTcGFjZSA9IGFkZENvdW50IC0gZW5kU3BhY2U7CiAgICAgICAgICBfdGFibGUuc2V0UmFuZ2UoX3RhaWwsIF90YWlsICsgZW5kU3BhY2UsIGxpc3QsIDApOwogICAgICAgICAgX3RhYmxlLnNldFJhbmdlKDAsIHByZVNwYWNlLCBsaXN0LCBlbmRTcGFjZSk7CiAgICAgICAgICBfdGFpbCA9IHByZVNwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChFIGVsZW1lbnQgaW4gaXRlcmFibGUpIF9hZGQoZWxlbWVudCk7CiAgICB9CiAgfQoKICBRdWV1ZUxpc3Q8VD4gY2FzdDxUPigpID0+IFF1ZXVlTGlzdC5fY2FzdEZyb208RSwgVD4odGhpcyk7CgogIEBkZXByZWNhdGVkCiAgUXVldWVMaXN0PFQ+IHJldHlwZTxUPigpID0+IGNhc3Q8VD4oKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9GdWxsU3RyaW5nKHRoaXMsICJ7IiwgIn0iKTsKCiAgLy8gUXVldWUgaW50ZXJmYWNlLgoKICB2b2lkIGFkZExhc3QoRSBlbGVtZW50KSB7CiAgICBfYWRkKGVsZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRGaXJzdChFIGVsZW1lbnQpIHsKICAgIF9oZWFkID0gKF9oZWFkIC0gMSkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpOwogICAgX3RhYmxlW19oZWFkXSA9IGVsZW1lbnQ7CiAgICBpZiAoX2hlYWQgPT0gX3RhaWwpIF9ncm93KCk7CiAgfQoKICBFIHJlbW92ZUZpcnN0KCkgewogICAgaWYgKF9oZWFkID09IF90YWlsKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gZWxlbWVudCIpOwogICAgRSByZXN1bHQgPSBfdGFibGVbX2hlYWRdOwogICAgX3RhYmxlW19oZWFkXSA9IG51bGw7CiAgICBfaGVhZCA9IChfaGVhZCArIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFIHJlbW92ZUxhc3QoKSB7CiAgICBpZiAoX2hlYWQgPT0gX3RhaWwpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBlbGVtZW50Iik7CiAgICBfdGFpbCA9IChfdGFpbCAtIDEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgIEUgcmVzdWx0ID0gX3RhYmxlW190YWlsXTsKICAgIF90YWJsZVtfdGFpbF0gPSBudWxsOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIExpc3QgaW50ZXJmYWNlLgoKICBpbnQgZ2V0IGxlbmd0aCA9PiAoX3RhaWwgLSBfaGVhZCkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpOwoKICBzZXQgbGVuZ3RoKGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkxlbmd0aCAkdmFsdWUgbWF5IG5vdCBiZSBuZWdhdGl2ZS4iKTsKCiAgICBpbnQgZGVsdGEgPSB2YWx1ZSAtIGxlbmd0aDsKICAgIGlmIChkZWx0YSA+PSAwKSB7CiAgICAgIGlmIChfdGFibGUubGVuZ3RoIDw9IHZhbHVlKSB7CiAgICAgICAgX3ByZUdyb3codmFsdWUpOwogICAgICB9CiAgICAgIF90YWlsID0gKF90YWlsICsgZGVsdGEpICYgKF90YWJsZS5sZW5ndGggLSAxKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGludCBuZXdUYWlsID0gX3RhaWwgKyBkZWx0YTsgLy8gW2RlbHRhXSBpcyBuZWdhdGl2ZS4KICAgIGlmIChuZXdUYWlsID49IDApIHsKICAgICAgX3RhYmxlLmZpbGxSYW5nZShuZXdUYWlsLCBfdGFpbCwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICBuZXdUYWlsICs9IF90YWJsZS5sZW5ndGg7CiAgICAgIF90YWJsZS5maWxsUmFuZ2UoMCwgX3RhaWwsIG51bGwpOwogICAgICBfdGFibGUuZmlsbFJhbmdlKG5ld1RhaWwsIF90YWJsZS5sZW5ndGgsIG51bGwpOwogICAgfQogICAgX3RhaWwgPSBuZXdUYWlsOwogIH0KCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCAkaW5kZXggbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAuLiRsZW5ndGgpLiIpOwogICAgfQoKICAgIHJldHVybiBfdGFibGVbKF9oZWFkICsgaW5kZXgpICYgKF90YWJsZS5sZW5ndGggLSAxKV07CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCAkaW5kZXggbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAuLiRsZW5ndGgpLiIpOwogICAgfQoKICAgIF90YWJsZVsoX2hlYWQgKyBpbmRleCkgJiAoX3RhYmxlLmxlbmd0aCAtIDEpXSA9IHZhbHVlOwogIH0KCiAgLy8gSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucy4KCiAgLy8vIFdoZXRoZXIgW251bWJlcl0gaXMgYSBwb3dlciBvZiB0d28uCiAgLy8vCiAgLy8vIE9ubHkgd29ya3MgZm9yIHBvc2l0aXZlIG51bWJlcnMuCiAgc3RhdGljIGJvb2wgX2lzUG93ZXJPZjIoaW50IG51bWJlcikgPT4gKG51bWJlciAmIChudW1iZXIgLSAxKSkgPT0gMDsKCiAgLy8vIFJvdW5kcyBbbnVtYmVyXSB1cCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiAyLgogIC8vLwogIC8vLyBJZiBbbnVtYmVyXSBpcyBhIHBvd2VyIG9mIDIgYWxyZWFkeSwgaXQgaXMgcmV0dXJuZWQuCiAgLy8vCiAgLy8vIE9ubHkgd29ya3MgZm9yIHBvc2l0aXZlIG51bWJlcnMuCiAgc3RhdGljIGludCBfbmV4dFBvd2VyT2YyKGludCBudW1iZXIpIHsKICAgIGFzc2VydChudW1iZXIgPiAwKTsKICAgIG51bWJlciA9IChudW1iZXIgPDwgMSkgLSAxOwogICAgZm9yICg7OykgewogICAgICBpbnQgbmV4dE51bWJlciA9IG51bWJlciAmIChudW1iZXIgLSAxKTsKICAgICAgaWYgKG5leHROdW1iZXIgPT0gMCkgcmV0dXJuIG51bWJlcjsKICAgICAgbnVtYmVyID0gbmV4dE51bWJlcjsKICAgIH0KICB9CgogIC8vLyBBZGRzIGVsZW1lbnQgYXQgZW5kIG9mIHF1ZXVlLiBVc2VkIGJ5IGJvdGggW2FkZF0gYW5kIFthZGRBbGxdLgogIHZvaWQgX2FkZChFIGVsZW1lbnQpIHsKICAgIF90YWJsZVtfdGFpbF0gPSBlbGVtZW50OwogICAgX3RhaWwgPSAoX3RhaWwgKyAxKSAmIChfdGFibGUubGVuZ3RoIC0gMSk7CiAgICBpZiAoX2hlYWQgPT0gX3RhaWwpIF9ncm93KCk7CiAgfQoKICAvLy8gR3JvdyB0aGUgdGFibGUgd2hlbiBmdWxsLgogIHZvaWQgX2dyb3coKSB7CiAgICBMaXN0PEU+IG5ld1RhYmxlID0gbmV3IExpc3Q8RT4oX3RhYmxlLmxlbmd0aCAqIDIpOwogICAgaW50IHNwbGl0ID0gX3RhYmxlLmxlbmd0aCAtIF9oZWFkOwogICAgbmV3VGFibGUuc2V0UmFuZ2UoMCwgc3BsaXQsIF90YWJsZSwgX2hlYWQpOwogICAgbmV3VGFibGUuc2V0UmFuZ2Uoc3BsaXQsIHNwbGl0ICsgX2hlYWQsIF90YWJsZSwgMCk7CiAgICBfaGVhZCA9IDA7CiAgICBfdGFpbCA9IF90YWJsZS5sZW5ndGg7CiAgICBfdGFibGUgPSBuZXdUYWJsZTsKICB9CgogIGludCBfd3JpdGVUb0xpc3QoTGlzdDxFPiB0YXJnZXQpIHsKICAgIGFzc2VydCh0YXJnZXQubGVuZ3RoID49IGxlbmd0aCk7CiAgICBpZiAoX2hlYWQgPD0gX3RhaWwpIHsKICAgICAgaW50IGxlbmd0aCA9IF90YWlsIC0gX2hlYWQ7CiAgICAgIHRhcmdldC5zZXRSYW5nZSgwLCBsZW5ndGgsIF90YWJsZSwgX2hlYWQpOwogICAgICByZXR1cm4gbGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgaW50IGZpcnN0UGFydFNpemUgPSBfdGFibGUubGVuZ3RoIC0gX2hlYWQ7CiAgICAgIHRhcmdldC5zZXRSYW5nZSgwLCBmaXJzdFBhcnRTaXplLCBfdGFibGUsIF9oZWFkKTsKICAgICAgdGFyZ2V0LnNldFJhbmdlKGZpcnN0UGFydFNpemUsIGZpcnN0UGFydFNpemUgKyBfdGFpbCwgX3RhYmxlLCAwKTsKICAgICAgcmV0dXJuIF90YWlsICsgZmlyc3RQYXJ0U2l6ZTsKICAgIH0KICB9CgogIC8vLyBHcm93cyB0aGUgdGFibGUgZXZlbiBpZiBpdCBpcyBub3QgZnVsbC4KICB2b2lkIF9wcmVHcm93KGludCBuZXdFbGVtZW50Q291bnQpIHsKICAgIGFzc2VydChuZXdFbGVtZW50Q291bnQgPj0gbGVuZ3RoKTsKCiAgICAvLyBBZGQgMS41eCBleHRyYSByb29tIHRvIGVuc3VyZSB0aGF0IHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBlbGVtZW50cyBhZnRlcgogICAgLy8gZXhwYW5zaW9uLgogICAgbmV3RWxlbWVudENvdW50ICs9IG5ld0VsZW1lbnRDb3VudCA+PiAxOwogICAgaW50IG5ld0NhcGFjaXR5ID0gX25leHRQb3dlck9mMihuZXdFbGVtZW50Q291bnQpOwogICAgTGlzdDxFPiBuZXdUYWJsZSA9IG5ldyBMaXN0PEU+KG5ld0NhcGFjaXR5KTsKICAgIF90YWlsID0gX3dyaXRlVG9MaXN0KG5ld1RhYmxlKTsKICAgIF90YWJsZSA9IG5ld1RhYmxlOwogICAgX2hlYWQgPSAwOwogIH0KfQoKY2xhc3MgX0Nhc3RRdWV1ZUxpc3Q8UywgVD4gZXh0ZW5kcyBRdWV1ZUxpc3Q8VD4gewogIGZpbmFsIFF1ZXVlTGlzdDxTPiBfZGVsZWdhdGU7CgogIF9DYXN0UXVldWVMaXN0KHRoaXMuX2RlbGVnYXRlKSA6IHN1cGVyLl8oKSB7CiAgICBfdGFibGUgPSBfZGVsZWdhdGUuX3RhYmxlLmNhc3Q8VD4oKTsKICB9CgogIGludCBnZXQgX2hlYWQgPT4gX2RlbGVnYXRlLl9oZWFkOwogIHNldCBfaGVhZChpbnQgdmFsdWUpID0+IF9kZWxlZ2F0ZS5faGVhZCA9IHZhbHVlOwoKICBpbnQgZ2V0IF90YWlsID0+IF9kZWxlZ2F0ZS5fdGFpbDsKICBzZXQgX3RhaWwoaW50IHZhbHVlKSA9PiBfZGVsZWdhdGUuX3RhaWwgPSB2YWx1ZTsKfQqBBgBOTjwBGgFBQ1FQCkouBlEZBlE+BlBJQj0tBAEqEg0NAR0GThAjExRKKzA4BiorBAE4EQFELxoiNiwfNxwUDTEGBAEbARgTBAEmHBsiIDAlRT0bDzcuIz0dES49OBwKCA0xBgQBPQEOKQFKARYBHBMEAR0vHSEEARQ8HhovEwQBEzwvHhoTBAEVATsBGk8BIBYkGQg1DgYBORguDSAoNgYVBAEdKE8GAToEASooTwYBOwQBIAEqBidHATQGOwYnKRggDy4qGwYEAUUZHS8hBAEgETcnMDgPGxcEASUlGiIxFQ0xOEgkBgQBLicnAU8SLTYxJBcPBAIBMiABLykEASQzASQzAgEmcGFja2FnZTpjb2xsZWN0aW9uL3NyYy9xdWV1ZV9saXN0LmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vbGlzdC5kYXJ0AAAZZGFydDpjb2xsZWN0aW9uL2xpc3QuZGFydFVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL3VuaW9uX3NldC5kYXJ0jWAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICd1bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydCc7CgovLy8gQSBzaW5nbGUgc2V0IHRoYXQgcHJvdmlkZXMgYSB2aWV3IG9mIHRoZSB1bmlvbiBvdmVyIGEgc2V0IG9mIHNldHMuCi8vLwovLy8gU2luY2UgdGhpcyBpcyBqdXN0IGEgdmlldywgaXQgcmVmbGVjdHMgYWxsIGNoYW5nZXMgaW4gdGhlIHVuZGVybHlpbmcgc2V0cy4KLy8vCi8vLyBJZiBhbiBlbGVtZW50IGlzIGluIG11bHRpcGxlIHNldHMgYW5kIHRoZSBvdXRlciBzZXQgaXMgb3JkZXJlZCwgdGhlIHZlcnNpb24KLy8vIGluIHRoZSBlYXJsaWVzdCBpbm5lciBzZXQgaXMgcHJlZmVycmVkLiBDb21wb25lbnQgc2V0cyBhcmUgYXNzdW1lZCB0byB1c2UKLy8vIGA9PWAgYW5kIGBoYXNoQ29kZWAgZm9yIGVxdWFsaXR5LgpjbGFzcyBVbmlvblNldDxFPiBleHRlbmRzIFNldEJhc2U8RT4gd2l0aCBVbm1vZGlmaWFibGVTZXRNaXhpbjxFPiB7CiAgLy8vIFRoZSBzZXQgb2Ygc2V0cyB0aGF0IHRoaXMgcHJvdmlkZXMgYSB2aWV3IG9mLgogIGZpbmFsIFNldDxTZXQ8RT4+IF9zZXRzOwoKICAvLy8gV2hldGhlciB0aGUgc2V0cyBpbiBbX3NldHNdIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRpc2pvaW50LgogIGZpbmFsIGJvb2wgX2Rpc2pvaW50OwoKICAvLy8gQ3JlYXRlcyBhIG5ldyBzZXQgdGhhdCdzIGEgdmlldyBvZiB0aGUgdW5pb24gb2YgYWxsIHNldHMgaW4gW3NldHNdLgogIC8vLwogIC8vLyBJZiBhbnkgc2V0cyBpbiBbc2V0c10gY2hhbmdlLCB0aGlzIFtVbmlvblNldF0gcmVmbGVjdHMgdGhhdCBjaGFuZ2UuIElmIGEKICAvLy8gbmV3IHNldCBpcyBhZGRlZCB0byBbc2V0c10sIHRoaXMgW1VuaW9uU2V0XSByZWZsZWN0cyB0aGF0IGFzIHdlbGwuCiAgLy8vCiAgLy8vIElmIFtkaXNqb2ludF0gaXMgYHRydWVgLCB0aGVuIGFsbCBjb21wb25lbnQgc2V0cyBtdXN0IGJlIGRpc2pvaW50LiBUaGF0CiAgLy8vIGlzLCB0aGF0IHRoZXkgY29udGFpbiBubyBlbGVtZW50cyBpbiBjb21tb24uIFRoaXMgbWFrZXMgbWFueSBvcGVyYXRpb25zCiAgLy8vIGluY2x1ZGluZyBbbGVuZ3RoXSBtb3JlIGVmZmljaWVudC4gSWYgdGhlIGNvbXBvbmVudCBzZXRzIHR1cm4gb3V0IG5vdCB0bwogIC8vLyBiZSBkaXNqb2ludCwgc29tZSBvcGVyYXRpb25zIG1heSBiZWhhdmUgaW5jb25zaXN0ZW50bHkuCiAgVW5pb25TZXQodGhpcy5fc2V0cywge2Jvb2wgZGlzam9pbnQ6IGZhbHNlfSkgOiBfZGlzam9pbnQgPSBkaXNqb2ludDsKCiAgLy8vIENyZWF0ZXMgYSBuZXcgc2V0IHRoYXQncyBhIHZpZXcgb2YgdGhlIHVuaW9uIG9mIGFsbCBzZXRzIGluIFtzZXRzXS4KICAvLy8KICAvLy8gSWYgYW55IHNldHMgaW4gW3NldHNdIGNoYW5nZSwgdGhpcyBbVW5pb25TZXRdIHJlZmxlY3RzIHRoYXQgY2hhbmdlLgogIC8vLyBIb3dldmVyLCB1bmxpa2UgW25ldyBVbmlvblNldF0sIHRoaXMgY3JlYXRlcyBhIGNvcHkgb2YgaXRzIHBhcmFtZXRlciwgc28KICAvLy8gY2hhbmdlcyBpbiBbc2V0c10gYXJlbid0IHJlZmxlY3RlZCBpbiB0aGlzIFtVbmlvblNldF0uCiAgLy8vCiAgLy8vIElmIFtkaXNqb2ludF0gaXMgYHRydWVgLCB0aGVuIGFsbCBjb21wb25lbnQgc2V0cyBtdXN0IGJlIGRpc2pvaW50LiBUaGF0CiAgLy8vIGlzLCB0aGF0IHRoZXkgY29udGFpbiBubyBlbGVtZW50cyBpbiBjb21tb24uIFRoaXMgbWFrZXMgbWFueSBvcGVyYXRpb25zCiAgLy8vIGluY2x1ZGluZyBbbGVuZ3RoXSBtb3JlIGVmZmljaWVudC4gSWYgdGhlIGNvbXBvbmVudCBzZXRzIHR1cm4gb3V0IG5vdCB0bwogIC8vLyBiZSBkaXNqb2ludCwgc29tZSBvcGVyYXRpb25zIG1heSBiZWhhdmUgaW5jb25zaXN0ZW50bHkuCiAgVW5pb25TZXQuZnJvbShJdGVyYWJsZTxTZXQ8RT4+IHNldHMsIHtib29sIGRpc2pvaW50OiBmYWxzZX0pCiAgICAgIDogdGhpcyhzZXRzLnRvU2V0KCksIGRpc2pvaW50OiBkaXNqb2ludCk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9kaXNqb2ludAogICAgICA/IF9zZXRzLmZvbGQoMCwgKGxlbmd0aCwgc2V0KSA9PiBsZW5ndGggKyBzZXQubGVuZ3RoKQogICAgICA6IF9pdGVyYWJsZS5sZW5ndGg7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBfaXRlcmFibGUuaXRlcmF0b3I7CgogIC8vLyBSZXR1cm5zIGFuIGl0ZXJhYmxlIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgc2V0cyBpbiBbdGhpc10uCiAgSXRlcmFibGU8RT4gZ2V0IF9pdGVyYWJsZSA9PgogICAgICBfZGlzam9pbnQgPyBfc2V0cy5leHBhbmQoKHNldCkgPT4gc2V0KSA6IF9kZWR1cEl0ZXJhYmxlOwoKICAvLy8gUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIHRoZSBjb250ZW50cyBvZiBhbGwgdGhlIHNldHMgaW4gW3RoaXNdIHRoYXQKICAvLy8gZGUtZHVwbGljYXRlcyBlbGVtZW50cy4KICAvLy8KICAvLy8gSWYgdGhlIHNldHMgYXJlbid0IGd1YXJhbnRlZWQgdG8gYmUgZGlzam9pbnQsIHRoaXMga2VlcHMgdHJhY2sgb2YgdGhlCiAgLy8vIGVsZW1lbnRzIHdlJ3ZlIGFscmVhZHkgZW1pdHRlZCBzbyB0aGF0IHdlIGNhbiBkZS1kdXBsaWNhdGUgdGhlbS4KICBJdGVyYWJsZTxFPiBnZXQgX2RlZHVwSXRlcmFibGUgewogICAgdmFyIHNlZW4gPSBuZXcgU2V0PEU+KCk7CiAgICByZXR1cm4gX3NldHMuZXhwYW5kKChzZXQpID0+IHNldCkud2hlcmUoKGVsZW1lbnQpIHsKICAgICAgaWYgKHNlZW4uY29udGFpbnMoZWxlbWVudCkpIHJldHVybiBmYWxzZTsKICAgICAgc2Vlbi5hZGQoZWxlbWVudCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfc2V0cy5hbnkoKHNldCkgPT4gc2V0LmNvbnRhaW5zKGVsZW1lbnQpKTsKCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIHJldHVybiBfc2V0cwogICAgICAgIC5tYXAoKHNldCkgPT4gc2V0Lmxvb2t1cChlbGVtZW50KSkKICAgICAgICAuZmlyc3RXaGVyZSgocmVzdWx0KSA9PiByZXN1bHQgIT0gbnVsbCwgb3JFbHNlOiAoKSA9PiBudWxsKTsKICB9CgogIFNldDxFPiB0b1NldCgpIHsKICAgIHZhciByZXN1bHQgPSBuZXcgU2V0PEU+KCk7CiAgICBmb3IgKHZhciBzZXQgaW4gX3NldHMpIHsKICAgICAgcmVzdWx0LmFkZEFsbChzZXQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KWgBOTjwBGgElAUcETwRQTiZENBsBQRgBSgZPSQZOTk8+RwFKBkpPPQZOTk8+PzABHjwaATIBRx8/AUseBkxHIx04MBkTCAQBTgEdJgERK0UEARMfHRoGEwQCASVwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VuaW9uX3NldC5kYXJ0YWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb2xsZWN0aW9uL2xpYi9zcmMvdW5tb2RpZmlhYmxlX3dyYXBwZXJzLmRhcnSY8S8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2VtcHR5X3VubW9kaWZpYWJsZV9zZXQuZGFydCc7CmltcG9ydCAnd3JhcHBlcnMuZGFydCc7CgpleHBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBVbm1vZGlmaWFibGVMaXN0VmlldywgVW5tb2RpZmlhYmxlTWFwVmlldzsKCi8vLyBBIGZpeGVkLWxlbmd0aCBsaXN0LgovLy8KLy8vIEEgYE5vbkdyb3dhYmxlTGlzdFZpZXdgIGNvbnRhaW5zIGEgW0xpc3RdIG9iamVjdCBhbmQgZW5zdXJlcyB0aGF0Ci8vLyBpdHMgbGVuZ3RoIGRvZXMgbm90IGNoYW5nZS4KLy8vIE1ldGhvZHMgdGhhdCB3b3VsZCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCwKLy8vIHN1Y2ggYXMgW2FkZF0gYW5kIFtyZW1vdmVdLCB0aHJvdyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCi8vLyBBbGwgb3RoZXIgbWV0aG9kcyB3b3JrIGRpcmVjdGx5IG9uIHRoZSB1bmRlcmx5aW5nIGxpc3QuCi8vLwovLy8gVGhpcyBjbGFzcyBfZG9lc18gYWxsb3cgY2hhbmdlcyB0byB0aGUgY29udGVudHMgb2YgdGhlIHdyYXBwZWQgbGlzdC4KLy8vIFlvdSBjYW4sIGZvciBleGFtcGxlLCBbc29ydF0gdGhlIGxpc3QuCi8vLyBQZXJtaXR0ZWQgb3BlcmF0aW9ucyBkZWZlciB0byB0aGUgd3JhcHBlZCBsaXN0LgpjbGFzcyBOb25Hcm93YWJsZUxpc3RWaWV3PEU+IGV4dGVuZHMgRGVsZWdhdGluZ0xpc3Q8RT4KICAgIHdpdGggTm9uR3Jvd2FibGVMaXN0TWl4aW48RT4gewogIE5vbkdyb3dhYmxlTGlzdFZpZXcoTGlzdDxFPiBsaXN0QmFzZSkgOiBzdXBlcihsaXN0QmFzZSk7Cn0KCi8vLyBNaXhpbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB0aHJvd2luZyB2ZXJzaW9uIG9mIGFsbCBsaXN0IG9wZXJhdGlvbnMgdGhhdAovLy8gY2hhbmdlIHRoZSBMaXN0J3MgbGVuZ3RoLgphYnN0cmFjdCBjbGFzcyBOb25Hcm93YWJsZUxpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIGJvb2wgYWRkKEUgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEUgZWxlbWVudCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgYm9vbCByZW1vdmUoT2JqZWN0IHZhbHVlKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBhcmUgZGlzYWxsb3dlZC4KICBFIHJlbW92ZUF0KGludCBpbmRleCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgRSByZW1vdmVMYXN0KCkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZW1vdmVSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgY2xlYXIoKSA9PiBfdGhyb3coKTsKfQoKLy8vIEFuIHVubW9kaWZpYWJsZSBzZXQuCi8vLwovLy8gQW4gVW5tb2RpZmlhYmxlU2V0VmlldyBjb250YWlucyBhIFtTZXRdIG9iamVjdCBhbmQgZW5zdXJlcwovLy8gdGhhdCBpdCBkb2VzIG5vdCBjaGFuZ2UuCi8vLyBNZXRob2RzIHRoYXQgd291bGQgY2hhbmdlIHRoZSBzZXQsCi8vLyBzdWNoIGFzIFthZGRdIGFuZCBbcmVtb3ZlXSwgdGhyb3cgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdLgovLy8gUGVybWl0dGVkIG9wZXJhdGlvbnMgZGVmZXIgdG8gdGhlIHdyYXBwZWQgc2V0LgpjbGFzcyBVbm1vZGlmaWFibGVTZXRWaWV3PEU+IGV4dGVuZHMgRGVsZWdhdGluZ1NldDxFPgogICAgd2l0aCBVbm1vZGlmaWFibGVTZXRNaXhpbjxFPiB7CiAgVW5tb2RpZmlhYmxlU2V0VmlldyhTZXQ8RT4gc2V0QmFzZSkgOiBzdXBlcihzZXRCYXNlKTsKCiAgLy8vIEFuIHVubW9kaWZpYWJsZSBlbXB0eSBzZXQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgYG5ldyBVbm1vZGlmaWFibGVTZXRWaWV3KG5ldyBTZXQoKSlgLCBleGNlcHQgdGhhdCBpdAogIC8vLyBjYW4gYmUgdXNlZCBpbiBjb25zdCBjb250ZXh0cy4KICBjb25zdCBmYWN0b3J5IFVubW9kaWZpYWJsZVNldFZpZXcuZW1wdHkoKSA9IEVtcHR5VW5tb2RpZmlhYmxlU2V0PEU+Owp9CgovLy8gTWl4aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgdGhyb3dpbmcgdmVyc2lvbiBvZiBhbGwgc2V0IG9wZXJhdGlvbnMgdGhhdAovLy8gY2hhbmdlIHRoZSBTZXQuCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZVNldE1peGluPEU+IGltcGxlbWVudHMgU2V0PEU+IHsKICBzdGF0aWMgVCBfdGhyb3c8VD4oKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgU2V0Iik7CiAgfQoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIGJvb2wgYWRkKEUgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgc2V0IGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlIGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHNldCBhcmUgZGlzYWxsb3dlZC4KICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZSBlbGVtZW50cykgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBzZXQgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBjbGVhcigpID0+IF90aHJvdygpOwp9CgovLy8gTWl4aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgdGhyb3dpbmcgdmVyc2lvbiBvZiBhbGwgbWFwIG9wZXJhdGlvbnMgdGhhdAovLy8gY2hhbmdlIHRoZSBNYXAuCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZU1hcE1peGluPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBzdGF0aWMgVCBfdGhyb3c8VD4oKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIG1hcCBhcmUgZGlzYWxsb3dlZC4KICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgViByZW1vdmUoT2JqZWN0IGtleSkgPT4gX3Rocm93KCk7CgogIC8vLyBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdOwogIC8vLyBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBtYXAgYXJlIGRpc2FsbG93ZWQuCiAgdm9pZCBjbGVhcigpID0+IF90aHJvdygpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXTsKICAvLy8gb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgbWFwIGFyZSBkaXNhbGxvd2VkLgogIHNldCBmaXJzdChfKSA9PiBfdGhyb3coKTsKCiAgLy8vIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl07CiAgLy8vIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIG1hcCBhcmUgZGlzYWxsb3dlZC4KICBzZXQgbGFzdChfKSA9PiBfdGhyb3coKTsKfQqAtQBOTjwBJhgBSQEZBEYgNj08BEkrNDcjOwIBTx48GSA8BAEkRCkBJEQhASREMQEkRDEBJEQ/ASREKQEkRCUBJEQeASRENgEkRDYBJEQ0ASRESwEkRBwCARkEPx0nPTM2IzgBIQZPJUcCAU4UOxlFBAEkNSEBJDUxASQ1KQEkNTEBJDUxASQ1NgEkNTYBJDUcAgFOFEEZRQQBJDUxASQ1MgEkNSwBJDUkASQ1HAEkNRwBJDUbAgExcGFja2FnZTpjb2xsZWN0aW9uL3NyYy91bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydGBmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29sbGVjdGlvbi9saWIvc3JjL3VuaW9uX3NldF9jb250cm9sbGVyLmRhcnSHUC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3VuaW9uX3NldC5kYXJ0JzsKCi8vLyBBIGNvbnRyb2xsZXIgdGhhdCBleHBvc2VzIGEgdmlldyBvZiB0aGUgdW5pb24gb2YgYSBjb2xsZWN0aW9uIG9mIHNldHMuCi8vLwovLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIGZvciBjcmVhdGluZyBhIFtVbmlvblNldF0gd2hvc2UgY29udGVudHMgY2hhbmdlCi8vLyBvdmVyIHRoZSBsaWZldGltZSBvZiBhIGNsYXNzLiBGb3IgZXhhbXBsZToKLy8vCi8vLyBgYGBkYXJ0Ci8vLyBjbGFzcyBFbmdpbmUgewovLy8gICBTZXQ8VGVzdD4gZ2V0IGFjdGl2ZVRlc3RzID0+IF9hY3RpdmVUZXN0c0dyb3VwLnNldDsKLy8vICAgZmluYWwgX2FjdGl2ZVRlc3RzR3JvdXAgPSBuZXcgVW5pb25TZXRDb250cm9sbGVyPFRlc3Q+KCk7Ci8vLwovLy8gICB2b2lkIGFkZFN1aXRlKFN1aXRlIHN1aXRlKSB7Ci8vLyAgICAgX2FjdGl2ZVRlc3RzR3JvdXAuYWRkKHN1aXRlLnRlc3RzKTsKLy8vICAgICBfcnVuU3VpdGUoc3VpdGUpOwovLy8gICAgIF9hY3RpdmVUZXN0c0dyb3VwLnJlbW92ZShzdWl0ZS50ZXN0cyk7Ci8vLyAgIH0KLy8vIH0KLy8vIGBgYApjbGFzcyBVbmlvblNldENvbnRyb2xsZXI8RT4gewogIC8vLyBUaGUgW1VuaW9uU2V0XSB0aGF0IHByb3ZpZGVzIGEgdmlldyBvZiB0aGUgdW5pb24gb2Ygc2V0cyBpbiBbdGhpc10uCiAgVW5pb25TZXQ8RT4gZ2V0IHNldCA9PiBfc2V0OwogIFVuaW9uU2V0PEU+IF9zZXQ7CgogIC8vLyBUaGUgc2V0cyB3aG9zZSB1bmlvbiBpcyBleHBvc2VkIHRocm91Z2ggW3NldF0uCiAgZmluYWwgX3NldHMgPSBuZXcgU2V0PFNldDxFPj4oKTsKCiAgLy8vIENyZWF0ZXMgYSBzZXQgb2Ygc2V0cyB0aGF0IHByb3ZpZGVzIGEgdmlldyBvZiB0aGUgdW5pb24gb2YgdGhvc2Ugc2V0cy4KICAvLy8KICAvLy8gSWYgW2Rpc2pvaW50XSBpcyBgdHJ1ZWAsIHRoaXMgYXNzdW1lcyB0aGF0IGFsbCBjb21wb25lbnQgc2V0cyBhcmUKICAvLy8gZGlzam9pbnTigJR0aGF0IGlzLCB0aGF0IHRoZXkgY29udGFpbiBubyBlbGVtZW50cyBpbiBjb21tb24uIFRoaXMgbWFrZXMKICAvLy8gbWFueSBvcGVyYXRpb25zIGluY2x1ZGluZyBbbGVuZ3RoXSBtb3JlIGVmZmljaWVudC4KICBVbmlvblNldENvbnRyb2xsZXIoe2Jvb2wgZGlzam9pbnQ6IGZhbHNlfSkgewogICAgX3NldCA9IG5ldyBVbmlvblNldDxFPihfc2V0cywgZGlzam9pbnQ6IGRpc2pvaW50KTsKICB9CgogIC8vLyBBZGRzIHRoZSBjb250ZW50cyBvZiBbY29tcG9uZW50XSB0byBbc2V0XS4KICAvLy8KICAvLy8gSWYgdGhlIGNvbnRlbnRzIG9mIFtjb21wb25lbnRdIGNoYW5nZSBvdmVyIHRpbWUsIFtzZXRdIHdpbGwgY2hhbmdlCiAgLy8vIGFjY29yZGluZ2x5LgogIHZvaWQgYWRkKFNldDxFPiBjb21wb25lbnQpIHsKICAgIF9zZXRzLmFkZChjb21wb25lbnQpOwogIH0KCiAgLy8vIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIFtjb21wb25lbnRdIHRvIFtzZXRdLgogIC8vLwogIC8vLyBJZiBhbm90aGVyIHNldCBpbiBbdGhpc10gaGFzIG92ZXJsYXBwaW5nIGVsZW1lbnRzIHdpdGggW2NvbXBvbmVudF0sIHRob3NlCiAgLy8vIGVsZW1lbnRzIHdpbGwgcmVtYWluIGluIFtzZXRdLgogIGJvb2wgcmVtb3ZlKFNldDxFPiBjb21wb25lbnQpID0+IF9zZXRzLnJlbW92ZShjb21wb25lbnQpOwp9CjgATk48ARkBSwRQLwQMEzpABCMsGi8IBggeSh8UATUjAU0GSEw5LzcEATEGSRMfGgQBNAZQJTwCATBwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VuaW9uX3NldF9jb250cm9sbGVyLmRhcnRUZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbGxlY3Rpb24vbGliL3NyYy93cmFwcGVycy5kYXJ0wABThC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CmltcG9ydCAiZGFydDptYXRoIiBhcyBtYXRoOwoKaW1wb3J0ICJ1bm1vZGlmaWFibGVfd3JhcHBlcnMuZGFydCI7Cgp0eXBlZGVmIEsgX0tleUZvclZhbHVlPEssIFY+KFYgdmFsdWUpOwoKLy8vIEEgYmFzZSBjbGFzcyBmb3IgZGVsZWdhdGluZyBpdGVyYWJsZXMuCi8vLwovLy8gU3ViY2xhc3NlcyBjYW4gcHJvdmlkZSBhIFtfYmFzZV0gdGhhdCBzaG91bGQgYmUgZGVsZWdhdGVkIHRvLiBVbmxpa2UKLy8vIFtEZWxlZ2F0aW5nSXRlcmFibGVdLCB0aGlzIGFsbG93cyB0aGUgYmFzZSB0byBiZSBjcmVhdGVkIG9uIGRlbWFuZC4KYWJzdHJhY3QgY2xhc3MgX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2U8RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7CiAgSXRlcmFibGU8RT4gZ2V0IF9iYXNlOwoKICBjb25zdCBfRGVsZWdhdGluZ0l0ZXJhYmxlQmFzZSgpOwoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gX2Jhc2UuYW55KHRlc3QpOwoKICBJdGVyYWJsZTxUPiBjYXN0PFQ+KCkgPT4gX2Jhc2UuY2FzdDxUPigpOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBfYmFzZS5jb250YWlucyhlbGVtZW50KTsKCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSA9PiBfYmFzZS5lbGVtZW50QXQoaW5kZXgpOwoKICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfYmFzZS5ldmVyeSh0ZXN0KTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRSBlbGVtZW50KSkgPT4gX2Jhc2UuZXhwYW5kKGYpOwoKICBFIGdldCBmaXJzdCA9PiBfYmFzZS5maXJzdDsKCiAgRSBmaXJzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pID0+CiAgICAgIF9iYXNlLmZpcnN0V2hlcmUodGVzdCwgb3JFbHNlOiBvckVsc2UpOwoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpID0+CiAgICAgIF9iYXNlLmZvbGQoaW5pdGlhbFZhbHVlLCBjb21iaW5lKTsKCiAgSXRlcmFibGU8RT4gZm9sbG93ZWRCeShJdGVyYWJsZTxFPiBvdGhlcikgPT4gX2Jhc2UuZm9sbG93ZWRCeShvdGhlcik7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgPT4gX2Jhc2UuZm9yRWFjaChmKTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfYmFzZS5pc0VtcHR5OwoKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9iYXNlLmlzTm90RW1wdHk7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBfYmFzZS5pdGVyYXRvcjsKCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pID0+IF9iYXNlLmpvaW4oc2VwYXJhdG9yKTsKCiAgRSBnZXQgbGFzdCA9PiBfYmFzZS5sYXN0OwoKICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSA9PgogICAgICBfYmFzZS5sYXN0V2hlcmUodGVzdCwgb3JFbHNlOiBvckVsc2UpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZS5sZW5ndGg7CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gX2Jhc2UubWFwKGYpOwoKICBFIHJlZHVjZShFIGNvbWJpbmUoRSB2YWx1ZSwgRSBlbGVtZW50KSkgPT4gX2Jhc2UucmVkdWNlKGNvbWJpbmUpOwoKICBAZGVwcmVjYXRlZAogIEl0ZXJhYmxlPFQ+IHJldHlwZTxUPigpID0+IGNhc3Q8VD4oKTsKCiAgRSBnZXQgc2luZ2xlID0+IF9iYXNlLnNpbmdsZTsKCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICByZXR1cm4gX2Jhc2Uuc2luZ2xlV2hlcmUodGVzdCwgb3JFbHNlOiBvckVsc2UpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgbikgPT4gX2Jhc2Uuc2tpcChuKTsKCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgPT4gX2Jhc2Uuc2tpcFdoaWxlKHRlc3QpOwoKICBJdGVyYWJsZTxFPiB0YWtlKGludCBuKSA9PiBfYmFzZS50YWtlKG4pOwoKICBJdGVyYWJsZTxFPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEUgdmFsdWUpKSA9PiBfYmFzZS50YWtlV2hpbGUodGVzdCk7CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgPT4gX2Jhc2UudG9MaXN0KGdyb3dhYmxlOiBncm93YWJsZSk7CgogIFNldDxFPiB0b1NldCgpID0+IF9iYXNlLnRvU2V0KCk7CgogIEl0ZXJhYmxlPEU+IHdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfYmFzZS53aGVyZSh0ZXN0KTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gX2Jhc2Uud2hlcmVUeXBlPFQ+KCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9iYXNlLnRvU3RyaW5nKCk7Cn0KCi8vLyBBbiBbSXRlcmFibGVdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBpdGVyYWJsZS4KLy8vCi8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGhpZGUgbm9uLWBJdGVyYWJsZWAgbWV0aG9kcyBvZiBhbiBpdGVyYWJsZSBvYmplY3QsCi8vLyBvciBpdCBjYW4gYmUgZXh0ZW5kZWQgdG8gYWRkIGV4dHJhIGZ1bmN0aW9uYWxpdHkgb24gdG9wIG9mIGFuIGV4aXN0aW5nCi8vLyBpdGVyYWJsZSBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdJdGVyYWJsZTxFPiBleHRlbmRzIF9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfYmFzZTsKCiAgLy8vIENyZWF0ZXMgYSB3cmFwcGVyIHRoYXQgZm9yd2FyZHMgb3BlcmF0aW9ucyB0byBbYmFzZV0uCiAgY29uc3QgRGVsZWdhdGluZ0l0ZXJhYmxlKEl0ZXJhYmxlPEU+IGJhc2UpIDogX2Jhc2UgPSBiYXNlOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBhc3NlcnRzIHRoZSB0eXBlcyBvZiB2YWx1ZXMgaW4gW2Jhc2VdLgogIC8vLwogIC8vLyBUaGlzIHNvdW5kbHkgY29udmVydHMgYW4gW0l0ZXJhYmxlXSB3aXRob3V0IGEgZ2VuZXJpYyB0eXBlIHRvIGFuCiAgLy8vIGBJdGVyYWJsZTxFPmAgYnkgYXNzZXJ0aW5nIHRoYXQgaXRzIGVsZW1lbnRzIGFyZSBpbnN0YW5jZXMgb2YgYEVgIHdoZW5ldmVyCiAgLy8vIHRoZXkncmUgYWNjZXNzZWQuIElmIHRoZXkncmUgbm90LCBpdCB0aHJvd3MgYSBbQ2FzdEVycm9yXS4KICAvLy8KICAvLy8gVGhpcyBmb3J3YXJkcyBhbGwgb3BlcmF0aW9ucyB0byBbYmFzZV0sIHNvIGFueSBjaGFuZ2VzIGluIFtiYXNlXSB3aWxsIGJlCiAgLy8vIHJlZmxlY3RlZCBpbiBbdGhpc10uIElmIFtiYXNlXSBpcyBhbHJlYWR5IGFuIGBJdGVyYWJsZTxFPmAsIGl0J3MgcmV0dXJuZWQKICAvLy8gdW5tb2RpZmllZC4KICBARGVwcmVjYXRlZCgnVXNlIGl0ZXJhYmxlLmNhc3Q8RT4gaW5zdGVhZC4nKQogIHN0YXRpYyBJdGVyYWJsZTxFPiB0eXBlZDxFPihJdGVyYWJsZSBiYXNlKSA9PiBiYXNlLmNhc3Q8RT4oKTsKfQoKLy8vIEEgW0xpc3RdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBsaXN0LgovLy8KLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaGlkZSBub24tYExpc3RgIG1ldGhvZHMgb2YgYSBsaXN0IG9iamVjdCwgb3IgaXQKLy8vIGNhbiBiZSBleHRlbmRlZCB0byBhZGQgZXh0cmEgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgbGlzdAovLy8gb2JqZWN0LgpjbGFzcyBEZWxlZ2F0aW5nTGlzdDxFPiBleHRlbmRzIERlbGVnYXRpbmdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogIGNvbnN0IERlbGVnYXRpbmdMaXN0KExpc3Q8RT4gYmFzZSkgOiBzdXBlcihiYXNlKTsKCiAgLy8vIENyZWF0ZXMgYSB3cmFwcGVyIHRoYXQgYXNzZXJ0cyB0aGUgdHlwZXMgb2YgdmFsdWVzIGluIFtiYXNlXS4KICAvLy8KICAvLy8gVGhpcyBzb3VuZGx5IGNvbnZlcnRzIGEgW0xpc3RdIHdpdGhvdXQgYSBnZW5lcmljIHR5cGUgdG8gYSBgTGlzdDxFPmAgYnkKICAvLy8gYXNzZXJ0aW5nIHRoYXQgaXRzIGVsZW1lbnRzIGFyZSBpbnN0YW5jZXMgb2YgYEVgIHdoZW5ldmVyIHRoZXkncmUKICAvLy8gYWNjZXNzZWQuIElmIHRoZXkncmUgbm90LCBpdCB0aHJvd3MgYSBbQ2FzdEVycm9yXS4gTm90ZSB0aGF0IGV2ZW4gaWYgYW4KICAvLy8gb3BlcmF0aW9uIHRocm93cyBhIFtDYXN0RXJyb3JdLCBpdCBtYXkgc3RpbGwgbXV0YXRlIHRoZSB1bmRlcmx5aW5nCiAgLy8vIGNvbGxlY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgZm9yd2FyZHMgYWxsIG9wZXJhdGlvbnMgdG8gW2Jhc2VdLCBzbyBhbnkgY2hhbmdlcyBpbiBbYmFzZV0gd2lsbCBiZQogIC8vLyByZWZsZWN0ZWQgaW4gW3RoaXNdLiBJZiBbYmFzZV0gaXMgYWxyZWFkeSBhIGBMaXN0PEU+YCwgaXQncyByZXR1cm5lZAogIC8vLyB1bm1vZGlmaWVkLgogIEBEZXByZWNhdGVkKCdVc2UgbGlzdC5jYXN0PEU+IGluc3RlYWQuJykKICBzdGF0aWMgTGlzdDxFPiB0eXBlZDxFPihMaXN0IGJhc2UpID0+IGJhc2UuY2FzdDxFPigpOwoKICBMaXN0PEU+IGdldCBfbGlzdEJhc2UgPT4gX2Jhc2U7CgogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSA9PiBfbGlzdEJhc2VbaW5kZXhdOwoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIF9saXN0QmFzZVtpbmRleF0gPSB2YWx1ZTsKICB9CgogIExpc3Q8RT4gb3BlcmF0b3IgKyhMaXN0PEU+IG90aGVyKSA9PiBfbGlzdEJhc2UgKyBvdGhlcjsKCiAgdm9pZCBhZGQoRSB2YWx1ZSkgewogICAgX2xpc3RCYXNlLmFkZCh2YWx1ZSk7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgX2xpc3RCYXNlLmFkZEFsbChpdGVyYWJsZSk7CiAgfQoKICBNYXA8aW50LCBFPiBhc01hcCgpID0+IF9saXN0QmFzZS5hc01hcCgpOwoKICBMaXN0PFQ+IGNhc3Q8VD4oKSA9PiBfbGlzdEJhc2UuY2FzdDxUPigpOwoKICB2b2lkIGNsZWFyKCkgewogICAgX2xpc3RCYXNlLmNsZWFyKCk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pIHsKICAgIF9saXN0QmFzZS5maWxsUmFuZ2Uoc3RhcnQsIGVuZCwgZmlsbFZhbHVlKTsKICB9CgogIHNldCBmaXJzdChFIHZhbHVlKSB7CiAgICBpZiAodGhpcy5pc0VtcHR5KSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbMF0gPSB2YWx1ZTsKICB9CgogIEl0ZXJhYmxlPEU+IGdldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgPT4gX2xpc3RCYXNlLmdldFJhbmdlKHN0YXJ0LCBlbmQpOwoKICBpbnQgaW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgPT4gX2xpc3RCYXNlLmluZGV4T2YoZWxlbWVudCwgc3RhcnQpOwoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSA9PgogICAgICBfbGlzdEJhc2UuaW5kZXhXaGVyZSh0ZXN0LCBzdGFydCk7CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAgICBfbGlzdEJhc2UuaW5zZXJ0KGluZGV4LCBlbGVtZW50KTsKICB9CgogIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfbGlzdEJhc2UuaW5zZXJ0QWxsKGluZGV4LCBpdGVyYWJsZSk7CiAgfQoKICBzZXQgbGFzdChFIHZhbHVlKSB7CiAgICBpZiAodGhpcy5pc0VtcHR5KSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKEUgZWxlbWVudCwgW2ludCBzdGFydF0pID0+CiAgICAgIF9saXN0QmFzZS5sYXN0SW5kZXhPZihlbGVtZW50LCBzdGFydCk7CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwgW2ludCBzdGFydF0pID0+CiAgICAgIF9saXN0QmFzZS5sYXN0SW5kZXhXaGVyZSh0ZXN0LCBzdGFydCk7CgogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgewogICAgX2xpc3RCYXNlLmxlbmd0aCA9IG5ld0xlbmd0aDsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gX2xpc3RCYXNlLnJlbW92ZSh2YWx1ZSk7CgogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSA9PiBfbGlzdEJhc2UucmVtb3ZlQXQoaW5kZXgpOwoKICBFIHJlbW92ZUxhc3QoKSA9PiBfbGlzdEJhc2UucmVtb3ZlTGFzdCgpOwoKICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgX2xpc3RCYXNlLnJlbW92ZVJhbmdlKHN0YXJ0LCBlbmQpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2xpc3RCYXNlLnJlbW92ZVdoZXJlKHRlc3QpOwogIH0KCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgX2xpc3RCYXNlLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfbGlzdEJhc2UucmV0YWluV2hlcmUodGVzdCk7CiAgfQoKICBAZGVwcmVjYXRlZAogIExpc3Q8VD4gcmV0eXBlPFQ+KCkgPT4gY2FzdDxUPigpOwoKICBJdGVyYWJsZTxFPiBnZXQgcmV2ZXJzZWQgPT4gX2xpc3RCYXNlLnJldmVyc2VkOwoKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBfbGlzdEJhc2Uuc2V0QWxsKGluZGV4LCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIF9saXN0QmFzZS5zZXRSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSwgc2tpcENvdW50KTsKICB9CgogIHZvaWQgc2h1ZmZsZShbbWF0aC5SYW5kb20gcmFuZG9tXSkgewogICAgX2xpc3RCYXNlLnNodWZmbGUocmFuZG9tKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoRSBhLCBFIGIpXSkgewogICAgX2xpc3RCYXNlLnNvcnQoY29tcGFyZSk7CiAgfQoKICBMaXN0PEU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pID0+IF9saXN0QmFzZS5zdWJsaXN0KHN0YXJ0LCBlbmQpOwp9CgovLy8gQSBbU2V0XSB0aGF0IGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBhIGJhc2Ugc2V0LgovLy8KLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaGlkZSBub24tYFNldGAgbWV0aG9kcyBvZiBhIHNldCBvYmplY3QsIG9yIGl0IGNhbgovLy8gYmUgZXh0ZW5kZWQgdG8gYWRkIGV4dHJhIGZ1bmN0aW9uYWxpdHkgb24gdG9wIG9mIGFuIGV4aXN0aW5nIHNldCBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdTZXQ8RT4gZXh0ZW5kcyBEZWxlZ2F0aW5nSXRlcmFibGU8RT4gaW1wbGVtZW50cyBTZXQ8RT4gewogIGNvbnN0IERlbGVnYXRpbmdTZXQoU2V0PEU+IGJhc2UpIDogc3VwZXIoYmFzZSk7CgogIC8vLyBDcmVhdGVzIGEgd3JhcHBlciB0aGF0IGFzc2VydHMgdGhlIHR5cGVzIG9mIHZhbHVlcyBpbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFRoaXMgc291bmRseSBjb252ZXJ0cyBhIFtTZXRdIHdpdGhvdXQgYSBnZW5lcmljIHR5cGUgdG8gYSBgU2V0PEU+YCBieQogIC8vLyBhc3NlcnRpbmcgdGhhdCBpdHMgZWxlbWVudHMgYXJlIGluc3RhbmNlcyBvZiBgRWAgd2hlbmV2ZXIgdGhleSdyZQogIC8vLyBhY2Nlc3NlZC4gSWYgdGhleSdyZSBub3QsIGl0IHRocm93cyBhIFtDYXN0RXJyb3JdLiBOb3RlIHRoYXQgZXZlbiBpZiBhbgogIC8vLyBvcGVyYXRpb24gdGhyb3dzIGEgW0Nhc3RFcnJvcl0sIGl0IG1heSBzdGlsbCBtdXRhdGUgdGhlIHVuZGVybHlpbmcKICAvLy8gY29sbGVjdGlvbi4KICAvLy8KICAvLy8gVGhpcyBmb3J3YXJkcyBhbGwgb3BlcmF0aW9ucyB0byBbYmFzZV0sIHNvIGFueSBjaGFuZ2VzIGluIFtiYXNlXSB3aWxsIGJlCiAgLy8vIHJlZmxlY3RlZCBpbiBbdGhpc10uIElmIFtiYXNlXSBpcyBhbHJlYWR5IGEgYFNldDxFPmAsIGl0J3MgcmV0dXJuZWQKICAvLy8gdW5tb2RpZmllZC4KICBARGVwcmVjYXRlZCgnVXNlIHNldC5jYXN0PEU+IGluc3RlYWQuJykKICBzdGF0aWMgU2V0PEU+IHR5cGVkPEU+KFNldCBiYXNlKSA9PiBiYXNlLmNhc3Q8RT4oKTsKCiAgU2V0PEU+IGdldCBfc2V0QmFzZSA9PiBfYmFzZTsKCiAgYm9vbCBhZGQoRSB2YWx1ZSkgPT4gX3NldEJhc2UuYWRkKHZhbHVlKTsKCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpIHsKICAgIF9zZXRCYXNlLmFkZEFsbChlbGVtZW50cyk7CiAgfQoKICBTZXQ8VD4gY2FzdDxUPigpID0+IF9zZXRCYXNlLmNhc3Q8VD4oKTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9zZXRCYXNlLmNsZWFyKCk7CiAgfQoKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpID0+IF9zZXRCYXNlLmNvbnRhaW5zQWxsKG90aGVyKTsKCiAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+IF9zZXRCYXNlLmRpZmZlcmVuY2Uob3RoZXIpOwoKICBTZXQ8RT4gaW50ZXJzZWN0aW9uKFNldDxPYmplY3Q+IG90aGVyKSA9PiBfc2V0QmFzZS5pbnRlcnNlY3Rpb24ob3RoZXIpOwoKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgPT4gX3NldEJhc2UubG9va3VwKGVsZW1lbnQpOwoKICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpID0+IF9zZXRCYXNlLnJlbW92ZSh2YWx1ZSk7CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIF9zZXRCYXNlLnJlbW92ZUFsbChlbGVtZW50cyk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfc2V0QmFzZS5yZW1vdmVXaGVyZSh0ZXN0KTsKICB9CgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIF9zZXRCYXNlLnJldGFpbkFsbChlbGVtZW50cyk7CiAgfQoKICBAZGVwcmVjYXRlZAogIFNldDxUPiByZXR5cGU8VD4oKSA9PiBjYXN0PFQ+KCk7CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9zZXRCYXNlLnJldGFpbldoZXJlKHRlc3QpOwogIH0KCiAgU2V0PEU+IHVuaW9uKFNldDxFPiBvdGhlcikgPT4gX3NldEJhc2UudW5pb24ob3RoZXIpOwoKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgRGVsZWdhdGluZ1NldDxFPihfc2V0QmFzZS50b1NldCgpKTsKfQoKLy8vIEEgW1F1ZXVlXSB0aGF0IGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBhIGJhc2UgcXVldWUuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBoaWRlIG5vbi1gUXVldWVgIG1ldGhvZHMgb2YgYSBxdWV1ZSBvYmplY3QsIG9yIGl0Ci8vLyBjYW4gYmUgZXh0ZW5kZWQgdG8gYWRkIGV4dHJhIGZ1bmN0aW9uYWxpdHkgb24gdG9wIG9mIGFuIGV4aXN0aW5nIHF1ZXVlCi8vLyBvYmplY3QuCmNsYXNzIERlbGVnYXRpbmdRdWV1ZTxFPiBleHRlbmRzIERlbGVnYXRpbmdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIFF1ZXVlPEU+IHsKICBjb25zdCBEZWxlZ2F0aW5nUXVldWUoUXVldWU8RT4gcXVldWUpIDogc3VwZXIocXVldWUpOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBhc3NlcnRzIHRoZSB0eXBlcyBvZiB2YWx1ZXMgaW4gW2Jhc2VdLgogIC8vLwogIC8vLyBUaGlzIHNvdW5kbHkgY29udmVydHMgYSBbUXVldWVdIHdpdGhvdXQgYSBnZW5lcmljIHR5cGUgdG8gYSBgUXVldWU8RT5gIGJ5CiAgLy8vIGFzc2VydGluZyB0aGF0IGl0cyBlbGVtZW50cyBhcmUgaW5zdGFuY2VzIG9mIGBFYCB3aGVuZXZlciB0aGV5J3JlCiAgLy8vIGFjY2Vzc2VkLiBJZiB0aGV5J3JlIG5vdCwgaXQgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uIE5vdGUgdGhhdCBldmVuIGlmIGFuCiAgLy8vIG9wZXJhdGlvbiB0aHJvd3MgYSBbQ2FzdEVycm9yXSwgaXQgbWF5IHN0aWxsIG11dGF0ZSB0aGUgdW5kZXJseWluZwogIC8vLyBjb2xsZWN0aW9uLgogIC8vLwogIC8vLyBUaGlzIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIFtiYXNlXSwgc28gYW55IGNoYW5nZXMgaW4gW2Jhc2VdIHdpbGwgYmUKICAvLy8gcmVmbGVjdGVkIGluIFt0aGlzXS4gSWYgW2Jhc2VdIGlzIGFscmVhZHkgYSBgUXVldWU8RT5gLCBpdCdzIHJldHVybmVkCiAgLy8vIHVubW9kaWZpZWQuCiAgQERlcHJlY2F0ZWQoJ1VzZSBxdWV1ZS5jYXN0PEU+IGluc3RlYWQuJykKICBzdGF0aWMgUXVldWU8RT4gdHlwZWQ8RT4oUXVldWUgYmFzZSkgPT4gYmFzZS5jYXN0PEU+KCk7CgogIFF1ZXVlPEU+IGdldCBfYmFzZVF1ZXVlID0+IF9iYXNlOwoKICB2b2lkIGFkZChFIHZhbHVlKSB7CiAgICBfYmFzZVF1ZXVlLmFkZCh2YWx1ZSk7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgX2Jhc2VRdWV1ZS5hZGRBbGwoaXRlcmFibGUpOwogIH0KCiAgdm9pZCBhZGRGaXJzdChFIHZhbHVlKSB7CiAgICBfYmFzZVF1ZXVlLmFkZEZpcnN0KHZhbHVlKTsKICB9CgogIHZvaWQgYWRkTGFzdChFIHZhbHVlKSB7CiAgICBfYmFzZVF1ZXVlLmFkZExhc3QodmFsdWUpOwogIH0KCiAgUXVldWU8VD4gY2FzdDxUPigpID0+IF9iYXNlUXVldWUuY2FzdDxUPigpOwoKICB2b2lkIGNsZWFyKCkgewogICAgX2Jhc2VRdWV1ZS5jbGVhcigpOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IG9iamVjdCkgPT4gX2Jhc2VRdWV1ZS5yZW1vdmUob2JqZWN0KTsKCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgX2Jhc2VRdWV1ZS5yZW1vdmVXaGVyZSh0ZXN0KTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9iYXNlUXVldWUucmV0YWluV2hlcmUodGVzdCk7CiAgfQoKICBAZGVwcmVjYXRlZAogIFF1ZXVlPFQ+IHJldHlwZTxUPigpID0+IGNhc3Q8VD4oKTsKCiAgRSByZW1vdmVGaXJzdCgpID0+IF9iYXNlUXVldWUucmVtb3ZlRmlyc3QoKTsKCiAgRSByZW1vdmVMYXN0KCkgPT4gX2Jhc2VRdWV1ZS5yZW1vdmVMYXN0KCk7Cn0KCi8vLyBBIFtNYXBdIHRoYXQgZGVsZWdhdGVzIGFsbCBvcGVyYXRpb25zIHRvIGEgYmFzZSBtYXAuCi8vLwovLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBoaWRlIG5vbi1gTWFwYCBtZXRob2RzIG9mIGFuIG9iamVjdCB0aGF0IGV4dGVuZHMKLy8vIGBNYXBgLCBvciBpdCBjYW4gYmUgZXh0ZW5kZWQgdG8gYWRkIGV4dHJhIGZ1bmN0aW9uYWxpdHkgb24gdG9wIG9mIGFuCi8vLyBleGlzdGluZyBtYXAgb2JqZWN0LgpjbGFzcyBEZWxlZ2F0aW5nTWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+IHsKICBmaW5hbCBNYXA8SywgVj4gX2Jhc2U7CgogIGNvbnN0IERlbGVnYXRpbmdNYXAoTWFwPEssIFY+IGJhc2UpIDogX2Jhc2UgPSBiYXNlOwoKICAvLy8gQ3JlYXRlcyBhIHdyYXBwZXIgdGhhdCBhc3NlcnRzIHRoZSB0eXBlcyBvZiBrZXlzIGFuZCB2YWx1ZXMgaW4gW2Jhc2VdLgogIC8vLwogIC8vLyBUaGlzIHNvdW5kbHkgY29udmVydHMgYSBbTWFwXSB3aXRob3V0IGdlbmVyaWMgdHlwZXMgdG8gYSBgTWFwPEssIFY+YCBieQogIC8vLyBhc3NlcnRpbmcgdGhhdCBpdHMga2V5cyBhcmUgaW5zdGFuY2VzIG9mIGBFYCBhbmQgaXRzIHZhbHVlcyBhcmUgaW5zdGFuY2VzCiAgLy8vIG9mIGBWYCB3aGVuZXZlciB0aGV5J3JlIGFjY2Vzc2VkLiBJZiB0aGV5J3JlIG5vdCwgaXQgdGhyb3dzIGEgW0Nhc3RFcnJvcl0uCiAgLy8vIE5vdGUgdGhhdCBldmVuIGlmIGFuIG9wZXJhdGlvbiB0aHJvd3MgYSBbQ2FzdEVycm9yXSwgaXQgbWF5IHN0aWxsIG11dGF0ZQogIC8vLyB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uLgogIC8vLwogIC8vLyBUaGlzIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIFtiYXNlXSwgc28gYW55IGNoYW5nZXMgaW4gW2Jhc2VdIHdpbGwgYmUKICAvLy8gcmVmbGVjdGVkIGluIFt0aGlzXS4gSWYgW2Jhc2VdIGlzIGFscmVhZHkgYSBgTWFwPEssIFY+YCwgaXQncyByZXR1cm5lZAogIC8vLyB1bm1vZGlmaWVkLgogIEBEZXByZWNhdGVkKCdVc2UgbWFwLmNhc3Q8SywgVj4gaW5zdGVhZC4nKQogIHN0YXRpYyBNYXA8SywgVj4gdHlwZWQ8SywgVj4oTWFwIGJhc2UpID0+IGJhc2UuY2FzdDxLLCBWPigpOwoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpID0+IF9iYXNlW2tleV07CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBfYmFzZVtrZXldID0gdmFsdWU7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIF9iYXNlLmFkZEFsbChvdGhlcik7CiAgfQoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIF9iYXNlLmFkZEVudHJpZXMoZW50cmllcyk7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX2Jhc2UuY2xlYXIoKTsKICB9CgogIE1hcDxLMiwgVjI+IGNhc3Q8SzIsIFYyPigpID0+IF9iYXNlLmNhc3Q8SzIsIFYyPigpOwoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IF9iYXNlLmNvbnRhaW5zS2V5KGtleSk7CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpID0+IF9iYXNlLmNvbnRhaW5zVmFsdWUodmFsdWUpOwoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4gX2Jhc2UuZW50cmllczsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9iYXNlLmZvckVhY2goZik7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IF9iYXNlLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2Jhc2UuaXNOb3RFbXB0eTsKCiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4gX2Jhc2Uua2V5czsKCiAgaW50IGdldCBsZW5ndGggPT4gX2Jhc2UubGVuZ3RoOwoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IHRyYW5zZm9ybShLIGtleSwgViB2YWx1ZSkpID0+CiAgICAgIF9iYXNlLm1hcCh0cmFuc2Zvcm0pOwoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpID0+IF9iYXNlLnB1dElmQWJzZW50KGtleSwgaWZBYnNlbnQpOwoKICBWIHJlbW92ZShPYmplY3Qga2V5KSA9PiBfYmFzZS5yZW1vdmUoa2V5KTsKCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSA9PiBfYmFzZS5yZW1vdmVXaGVyZSh0ZXN0KTsKCiAgQGRlcHJlY2F0ZWQKICBNYXA8SzIsIFYyPiByZXR5cGU8SzIsIFYyPigpID0+IGNhc3Q8SzIsIFYyPigpOwoKICBJdGVyYWJsZTxWPiBnZXQgdmFsdWVzID0+IF9iYXNlLnZhbHVlczsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX2Jhc2UudG9TdHJpbmcoKTsKCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgPT4KICAgICAgX2Jhc2UudXBkYXRlKGtleSwgdXBkYXRlLCBpZkFic2VudDogaWZBYnNlbnQpOwoKICB2b2lkIHVwZGF0ZUFsbChWIHVwZGF0ZShLIGtleSwgViB2YWx1ZSkpID0+IF9iYXNlLnVwZGF0ZUFsbCh1cGRhdGUpOwp9CgovLy8gQW4gdW5tb2RpZmlhYmxlIFtTZXRdIHZpZXcgb2YgdGhlIGtleXMgb2YgYSBbTWFwXS4KLy8vCi8vLyBUaGUgc2V0IGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byB0aGUgdW5kZXJseWluZyBtYXAuCi8vLwovLy8gQSBgTWFwYCBjYW4gb25seSBjb250YWluIGVhY2gga2V5IG9uY2UsIHNvIGl0cyBrZXlzIGNhbiBhbHdheXMKLy8vIGJlIHZpZXdlZCBhcyBhIGBTZXRgIHdpdGhvdXQgYW55IGxvc3MsIGV2ZW4gaWYgdGhlIFtNYXAua2V5c10KLy8vIGdldHRlciBvbmx5IHNob3dzIGFuIFtJdGVyYWJsZV0gdmlldyBvZiB0aGUga2V5cy4KLy8vCi8vLyBOb3RlIHRoYXQgW2xvb2t1cF0gaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzZXQuCmNsYXNzIE1hcEtleVNldDxFPiBleHRlbmRzIF9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlPEU+CiAgICB3aXRoIFVubW9kaWZpYWJsZVNldE1peGluPEU+IHsKICBmaW5hbCBNYXA8RSwgZHluYW1pYz4gX2Jhc2VNYXA7CgogIE1hcEtleVNldChNYXA8RSwgZHluYW1pYz4gYmFzZSkgOiBfYmFzZU1hcCA9IGJhc2U7CgogIEl0ZXJhYmxlPEU+IGdldCBfYmFzZSA9PiBfYmFzZU1hcC5rZXlzOwoKICBTZXQ8VD4gY2FzdDxUPigpIHsKICAgIGlmICh0aGlzIGlzIE1hcEtleVNldDxUPikgewogICAgICByZXR1cm4gdGhpcyBhcyBNYXBLZXlTZXQ8VD47CiAgICB9CiAgICByZXR1cm4gU2V0LmNhc3RGcm9tPEUsIFQ+KHRoaXMpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gX2Jhc2VNYXAuY29udGFpbnNLZXkoZWxlbWVudCk7CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2Jhc2VNYXAuaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfYmFzZU1hcC5pc05vdEVtcHR5OwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFzZU1hcC5sZW5ndGg7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJ7JHtfYmFzZS5qb2luKCcsICcpfX0iOwoKICBib29sIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPE9iamVjdD4gb3RoZXIpID0+IG90aGVyLmV2ZXJ5KGNvbnRhaW5zKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgc2V0IHdpdGggdGhlIHRoZSBlbGVtZW50cyBvZiBbdGhpc10gdGhhdCBhcmUgbm90IGluIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoYXQgaXMsIHRoZSByZXR1cm5lZCBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIFtTZXRdIHRoYXQgYXJlCiAgLy8vIG5vdCBlbGVtZW50cyBvZiBbb3RoZXJdIGFjY29yZGluZyB0byBgb3RoZXIuY29udGFpbnNgLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHNldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBlcXVhbGl0eSBvcGVyYXRpb24sIHdoaWNoCiAgLy8vIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgZXF1YWxpdHkgb3BlcmF0aW9uIFt0aGlzXSB1c2VzLgogIFNldDxFPiBkaWZmZXJlbmNlKFNldDxPYmplY3Q+IG90aGVyKSA9PgogICAgICB3aGVyZSgoZWxlbWVudCkgPT4gIW90aGVyLmNvbnRhaW5zKGVsZW1lbnQpKS50b1NldCgpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgd2hpY2ggaXMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFt0aGlzXSBhbmQgW290aGVyXS4KICAvLy8KICAvLy8gVGhhdCBpcywgdGhlIHJldHVybmVkIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgW1NldF0gdGhhdCBhcmUKICAvLy8gYWxzbyBlbGVtZW50cyBvZiBbb3RoZXJdIGFjY29yZGluZyB0byBgb3RoZXIuY29udGFpbnNgLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHNldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBlcXVhbGl0eSBvcGVyYXRpb24sIHdoaWNoCiAgLy8vIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgZXF1YWxpdHkgb3BlcmF0aW9uIFt0aGlzXSB1c2VzLgogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpID0+IHdoZXJlKG90aGVyLmNvbnRhaW5zKS50b1NldCgpOwoKICAvLy8gVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBzaW5jZSB0aGVyZSdzIG5vIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGZvcgogIC8vLyBbTWFwXXMuCiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpID0+CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJNYXBLZXlTZXQgZG9lc24ndCBzdXBwb3J0IGxvb2t1cCgpLiIpOwoKICBAZGVwcmVjYXRlZAogIFNldDxUPiByZXR5cGU8VD4oKSA9PiBTZXQuY2FzdEZyb208RSwgVD4odGhpcyk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCB3aGljaCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIFt0aGlzXSBhbmQgW290aGVyXS4KICAvLy8KICAvLy8gVGhhdCBpcywgdGhlIHJldHVybmVkIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgW1NldF0gYW5kIGFsbAogIC8vLyB0aGUgZWxlbWVudHMgb2YgW290aGVyXS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBzZXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxpdHkgb3BlcmF0aW9uLCB3aGljaAogIC8vLyBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIGVxdWFsaXR5IG9wZXJhdGlvbiBbdGhpc10gdXNlcy4KICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSA9PiB0b1NldCgpLi5hZGRBbGwob3RoZXIpOwp9CgovLy8gQ3JlYXRlcyBhIG1vZGlmaWFibGUgW1NldF0gdmlldyBvZiB0aGUgdmFsdWVzIG9mIGEgW01hcF0uCi8vLwovLy8gVGhlIGBTZXRgIHZpZXcgYXNzdW1lcyB0aGF0IHRoZSBrZXlzIG9mIHRoZSBgTWFwYCBjYW4gYmUgdW5pcXVlbHkgZGV0ZXJtaW5lZAovLy8gZnJvbSB0aGUgdmFsdWVzLiBUaGUgYGtleUZvclZhbHVlYCBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGZpbmRzCi8vLyB0aGUga2V5IGZvciBhIHNpbmdsZSB2YWx1ZS4gVGhlIGBrZXlGb3JWYWx1ZWAgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpc3RlbnQKLy8vIHdpdGggZXF1YWxpdHkuIElmIGB2YWx1ZTEgPT0gdmFsdWUyYCB0aGVuIGBrZXlGb3JWYWx1ZSh2YWx1ZTEpYCBhbmQKLy8vIGBrZXlGb3JWYWx1ZSh2YWx1ZTIpYCBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbCBrZXlzIGJ5IHRoZSB1bmRlcmx5aW5nIG1hcCwKLy8vIGFuZCB2aWNlIHZlcnNhLgovLy8KLy8vIE1vZGlmeWluZyB0aGUgc2V0IHdpbGwgbW9kaWZ5IHRoZSB1bmRlcmx5aW5nIG1hcCBiYXNlZCBvbiB0aGUga2V5IHJldHVybmVkCi8vLyBieSBga2V5Rm9yVmFsdWVgLgovLy8KLy8vIElmIHRoZSBgTWFwYCBjb250ZW50cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgYGtleUZvclZhbHVlYCBmdW5jdGlvbiwKLy8vIHRoZSBzZXQgd2lsbCBub3Qgd29yayBjb25zaXN0ZW50bHksIGFuZCBtYXkgZ2l2ZSBtZWFuaW5nbGVzcyByZXNwb25zZXMgb3IgZG8KLy8vIGluY29uc2lzdGVudCB1cGRhdGVzLgovLy8KLy8vIFRoaXMgc2V0IGNhbiwgZm9yIGV4YW1wbGUsIGJlIHVzZWQgb24gYSBtYXAgZnJvbSBkYXRhYmFzZSByZWNvcmQgSURzIHRvIHRoZQovLy8gcmVjb3Jkcy4gSXQgZXhwb3NlcyB0aGUgcmVjb3JkcyBhcyBhIHNldCwgYW5kIGFsbG93cyBmb3Igd3JpdGluZyBib3RoCi8vLyBgcmVjb3JkU2V0LmFkZChkYXRhYmFzZVJlY29yZClgIGFuZCBgcmVjb3JkTWFwW2lkXWAuCi8vLwovLy8gRWZmZWN0aXZlbHksIHRoZSBtYXAgd2lsbCBhY3QgYXMgYSBraW5kIG9mIGluZGV4IGZvciB0aGUgc2V0LgpjbGFzcyBNYXBWYWx1ZVNldDxLLCBWPiBleHRlbmRzIF9EZWxlZ2F0aW5nSXRlcmFibGVCYXNlPFY+IGltcGxlbWVudHMgU2V0PFY+IHsKICBmaW5hbCBNYXA8SywgVj4gX2Jhc2VNYXA7CiAgZmluYWwgX0tleUZvclZhbHVlPEssIFY+IF9rZXlGb3JWYWx1ZTsKCiAgLy8vIENyZWF0ZXMgYSBuZXcgW01hcFZhbHVlU2V0XSBiYXNlZCBvbiBbYmFzZV0uCiAgLy8vCiAgLy8vIFtrZXlGb3JWYWx1ZV0gcmV0dXJucyB0aGUga2V5IGluIHRoZSBtYXAgdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoCiAgLy8vIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHNldCdzIG5vdGlvbiBvZiBlcXVhbGl0eSBpcyBpZGVudGljYWwgdG8gdGhlIGVxdWFsaXR5CiAgLy8vIG9mIHRoZSByZXR1cm4gdmFsdWVzIG9mIFtrZXlGb3JWYWx1ZV0uCiAgTWFwVmFsdWVTZXQoTWFwPEssIFY+IGJhc2UsIEsga2V5Rm9yVmFsdWUoViB2YWx1ZSkpCiAgICAgIDogX2Jhc2VNYXAgPSBiYXNlLAogICAgICAgIF9rZXlGb3JWYWx1ZSA9IGtleUZvclZhbHVlOwoKICBJdGVyYWJsZTxWPiBnZXQgX2Jhc2UgPT4gX2Jhc2VNYXAudmFsdWVzOwoKICBTZXQ8VD4gY2FzdDxUPigpIHsKICAgIGlmICh0aGlzIGlzIFNldDxUPikgewogICAgICByZXR1cm4gdGhpcyBhcyBTZXQ8VD47CiAgICB9CiAgICByZXR1cm4gU2V0LmNhc3RGcm9tPFYsIFQ+KHRoaXMpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGlzISBWKSByZXR1cm4gZmFsc2U7CiAgICB2YXIga2V5ID0gX2tleUZvclZhbHVlKGVsZW1lbnQgYXMgVik7CgogICAgcmV0dXJuIF9iYXNlTWFwLmNvbnRhaW5zS2V5KGtleSk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IF9iYXNlTWFwLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2Jhc2VNYXAuaXNOb3RFbXB0eTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2Jhc2VNYXAubGVuZ3RoOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB0b1NldCgpLnRvU3RyaW5nKCk7CgogIGJvb2wgYWRkKFYgdmFsdWUpIHsKICAgIEsga2V5ID0gX2tleUZvclZhbHVlKHZhbHVlKTsKICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAgICBfYmFzZU1hcC5wdXRJZkFic2VudChrZXksICgpIHsKICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8Vj4gZWxlbWVudHMpID0+IGVsZW1lbnRzLmZvckVhY2goYWRkKTsKCiAgdm9pZCBjbGVhcigpID0+IF9iYXNlTWFwLmNsZWFyKCk7CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBvdGhlcikgPT4gb3RoZXIuZXZlcnkoY29udGFpbnMpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBzZXQgd2l0aCB0aGUgdGhlIGVsZW1lbnRzIG9mIFt0aGlzXSB0aGF0IGFyZSBub3QgaW4gW290aGVyXS4KICAvLy8KICAvLy8gVGhhdCBpcywgdGhlIHJldHVybmVkIHNldCBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgW1NldF0gdGhhdCBhcmUKICAvLy8gbm90IGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PFY+IGRpZmZlcmVuY2UoU2V0PE9iamVjdD4gb3RoZXIpID0+CiAgICAgIHdoZXJlKChlbGVtZW50KSA9PiAhb3RoZXIuY29udGFpbnMoZWxlbWVudCkpLnRvU2V0KCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IHNldCB3aGljaCBpcyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gW3RoaXNdIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSB0aGF0IGFyZQogIC8vLyBhbHNvIGVsZW1lbnRzIG9mIFtvdGhlcl0gYWNjb3JkaW5nIHRvIGBvdGhlci5jb250YWluc2AuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGVxdWFsaXR5IG9wZXJhdGlvbiwgd2hpY2gKICAvLy8gbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBlcXVhbGl0eSBvcGVyYXRpb24gW3RoaXNdIHVzZXMuCiAgU2V0PFY+IGludGVyc2VjdGlvbihTZXQ8T2JqZWN0PiBvdGhlcikgPT4gd2hlcmUob3RoZXIuY29udGFpbnMpLnRvU2V0KCk7CgogIFYgbG9va3VwKE9iamVjdCBlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaXMhIFYpIHJldHVybiBudWxsOwogICAgdmFyIGtleSA9IF9rZXlGb3JWYWx1ZShlbGVtZW50IGFzIFYpOwoKICAgIHJldHVybiBfYmFzZU1hcFtrZXldOwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpcyEgVikgcmV0dXJuIGZhbHNlOwogICAgdmFyIGtleSA9IF9rZXlGb3JWYWx1ZShlbGVtZW50IGFzIFYpOwoKICAgIGlmICghX2Jhc2VNYXAuY29udGFpbnNLZXkoa2V5KSkgcmV0dXJuIGZhbHNlOwogICAgX2Jhc2VNYXAucmVtb3ZlKGtleSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpID0+IGVsZW1lbnRzLmZvckVhY2gocmVtb3ZlKTsKCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoViBlbGVtZW50KSkgewogICAgdmFyIHRvUmVtb3ZlID0gW107CiAgICBfYmFzZU1hcC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmICh0ZXN0KHZhbHVlKSkgdG9SZW1vdmUuYWRkKGtleSk7CiAgICB9KTsKICAgIHRvUmVtb3ZlLmZvckVhY2goX2Jhc2VNYXAucmVtb3ZlKTsKICB9CgogIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpIHsKICAgIHZhciB2YWx1ZXNUb1JldGFpbiA9IG5ldyBTZXQ8Vj4uaWRlbnRpdHkoKTsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGlzISBWKSBjb250aW51ZTsKICAgICAgdmFyIGtleSA9IF9rZXlGb3JWYWx1ZShlbGVtZW50IGFzIFYpOwoKICAgICAgaWYgKCFfYmFzZU1hcC5jb250YWluc0tleShrZXkpKSBjb250aW51ZTsKICAgICAgdmFsdWVzVG9SZXRhaW4uYWRkKF9iYXNlTWFwW2tleV0pOwogICAgfQoKICAgIHZhciBrZXlzVG9SZW1vdmUgPSBbXTsKICAgIF9iYXNlTWFwLmZvckVhY2goKGssIHYpIHsKICAgICAgaWYgKCF2YWx1ZXNUb1JldGFpbi5jb250YWlucyh2KSkga2V5c1RvUmVtb3ZlLmFkZChrKTsKICAgIH0pOwogICAga2V5c1RvUmVtb3ZlLmZvckVhY2goX2Jhc2VNYXAucmVtb3ZlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KFYgZWxlbWVudCkpID0+CiAgICAgIHJlbW92ZVdoZXJlKChlbGVtZW50KSA9PiAhdGVzdChlbGVtZW50KSk7CgogIEBkZXByZWNhdGVkCiAgU2V0PFQ+IHJldHlwZTxUPigpID0+IFNldC5jYXN0RnJvbTxWLCBUPih0aGlzKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgW3RoaXNdIGFuZCBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGF0IGlzLCB0aGUgcmV0dXJuZWQgc2V0IGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhpcyBbU2V0XSBhbmQgYWxsCiAgLy8vIHRoZSBlbGVtZW50cyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHNldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBlcXVhbGl0eSBvcGVyYXRpb24sIHdoaWNoCiAgLy8vIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgZXF1YWxpdHkgb3BlcmF0aW9uIFt0aGlzXSB1c2VzLgogIFNldDxWPiB1bmlvbihTZXQ8Vj4gb3RoZXIpID0+IHRvU2V0KCkuLmFkZEFsbChvdGhlcik7Cn0KgrMATk48ARocASUBJwErBElIQxkBIwE1ASwBPAE0ATkBRgEeATYuAUYpAUgBNwElASsBLgFBARwBNS0BIgE2AUQBDigBIAE2NAQBLAFGASwBRgFNASMBQAE2ASkCAUQEUUsVQRsBPD0BRAZHUUEGT1ASL0ACATsETkoMSzQBRAZOSE5JEgZPSxIrOAEiATABKh4EAToBFhoEASYgBAEsASwBERcEATYwBAEXOxUEAU4BUAE7KQEmJgQBLyoEARY7IwQBLS0BOy0BHiIEATgBNgEsASknBAErIQQBQDIEASshBAEOJAEyATEnBAFROQQBJx8EAScdBAFKAgE5BFBNSTIBRAZMSE5JEgZPShIqNgEgASwBJh8EASoBERYEAUsBRgFKATgBNwEuIgQBKyAEAS4iBAEOIwErIAQBNwE8AgE9BFBLDE04AUQGUEhOSRIGT0wSLDoBJAEWGwQBJiEEARsgBAEaHwQBLgERGAQBOwErIgQBKyIEAQ4lAS8BLQIBOQRPSRkxGQE2AU0GTlBRTyEGT00SLT8BKwEmGAQBIRkEATYfBAEREwQBNgE6AUIBOQEpFgQBJQErASYBIgFJHAFKAS0BSgEOMgEqASkBODUBRwIBNwQ8BENCNgQ2NiMiATUBKgEVICMGJQQBQgEoAS4BJQEwAUUBUQZRPQZQQCo8AU4GUT4GUEBLAU0OHkkBDjIBTwZQHwZQQDgCAT4EUVBQSFEUBE8WBE5RGgRQSjkEQk8cKQEzBk5RLTYZJAEsARUaHQYlBAEiOCoBJgQBKAEuASUBKwEWIRkjFRQIEwQBPgEkAUUBUQZRPQZQQCo8AU4GUT4GUEBLAR03KgEaBAEgOCoBMhoRBAFJASsXJCoIJwQBLjAkNiwBMCkGARsePAgrBAEsMAEOMgFPBlAfBlBAOAIBJHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvd3JhcHBlcnMuZGFydFlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29udmVydC9saWIvc3JjL2FjY3VtdWxhdG9yX3NpbmsuZGFydIPtLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKCi8vLyBBIHNpbmsgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSBbZXZlbnRzXSB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgdG8gaXQuCi8vLwovLy8gU2VlIGFsc28gW0NodW5rZWRDb252ZXJzaW9uU2luay53aXRoQ2FsbGJhY2tdLgpjbGFzcyBBY2N1bXVsYXRvclNpbms8VD4gaW1wbGVtZW50cyBTaW5rPFQ+IHsKICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgZXZlbnRzIHBhc3NlZCB0byB0aGlzIHNpbmsgc28gZmFyLgogIExpc3Q8VD4gZ2V0IGV2ZW50cyA9PiBuZXcgVW5tb2RpZmlhYmxlTGlzdFZpZXcoX2V2ZW50cyk7CiAgZmluYWwgX2V2ZW50cyA9IDxUPltdOwoKICAvLy8gV2hldGhlciBbY2xvc2VdIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIGdldCBpc0Nsb3NlZCA9PiBfaXNDbG9zZWQ7CiAgdmFyIF9pc0Nsb3NlZCA9IGZhbHNlOwoKICAvLy8gUmVtb3ZlcyBhbGwgZXZlbnRzIGZyb20gW2V2ZW50c10uCiAgLy8vCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgZG91YmxlLXByb2Nlc3NpbmcgZXZlbnRzLgogIHZvaWQgY2xlYXIoKSB7CiAgICBfZXZlbnRzLmNsZWFyKCk7CiAgfQoKICB2b2lkIGFkZChUIGV2ZW50KSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfZXZlbnRzLmFkZChldmVudCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICB9Cn0KJwBOTjwBGgFRBDMuQTsZASciGQEoBjoRFQQBFhU7BgEYBAERFgQCASlwYWNrYWdlOmNvbnZlcnQvc3JjL2FjY3VtdWxhdG9yX3NpbmsuZGFydF5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29udmVydC9saWIvc3JjL2J5dGVfYWNjdW11bGF0b3Jfc2luay5kYXJ0hcIvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnQnOwoKLy8vIEEgc2luayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29uY2F0ZW5hdGVkIGJ5dGVzIHBhc3NlZCB0byBpdC4KLy8vCi8vLyBTZWUgYWxzbyBbQnl0ZUNvbnZlcnNpb25TaW5rLndpdGhDYWxsYmFja10uCmNsYXNzIEJ5dGVBY2N1bXVsYXRvclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIGJ5dGVzIGFjY3VtdWxhdGVkIHNvIGZhci4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIFtVaW50OExpc3RdIGlzIHZpZXdpbmcgYSBzaGFyZWQgYnVmZmVyLCBzbyBpdCBzaG91bGQgbm90IGJlCiAgLy8vIGNoYW5nZWQgYW5kIGFueSBieXRlcyBvdXRzaWRlIHRoZSB2aWV3IHNob3VsZCBub3QgYmUgYWNjZXNzZWQuCiAgVWludDhMaXN0IGdldCBieXRlcyA9PiBuZXcgVWludDhMaXN0LnZpZXcoX2J1ZmZlci5idWZmZXIsIDAsIF9idWZmZXIubGVuZ3RoKTsKCiAgZmluYWwgX2J1ZmZlciA9IG5ldyBVaW50OEJ1ZmZlcigpOwoKICAvLy8gV2hldGhlciBbY2xvc2VdIGhhcyBiZWVuIGNhbGxlZC4KICBib29sIGdldCBpc0Nsb3NlZCA9PiBfaXNDbG9zZWQ7CiAgdmFyIF9pc0Nsb3NlZCA9IGZhbHNlOwoKICAvLy8gUmVtb3ZlcyBhbGwgYnl0ZXMgZnJvbSBbYnl0ZXNdLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGRvdWJsZS1wcm9jZXNzaW5nIGRhdGEuCiAgdm9pZCBjbGVhcigpIHsKICAgIF9idWZmZXIuY2xlYXIoKTsKICB9CgogIHZvaWQgYWRkKExpc3Q8aW50PiBieXRlcykgewogICAgaWYgKF9pc0Nsb3NlZCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiQ2FuJ3QgYWRkIHRvIGEgY2xvc2VkIHNpbmsuIik7CiAgICB9CgogICAgX2J1ZmZlci5hZGRBbGwoYnl0ZXMpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGlmIChfaXNDbG9zZWQpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkNhbid0IGFkZCB0byBhIGNsb3NlZCBzaW5rLiIpOwogICAgfQoKICAgIF9idWZmZXIuYWRkQWxsKGNodW5rLCBzdGFydCwgZW5kKTsKICAgIGlmIChpc0xhc3QpIF9pc0Nsb3NlZCA9IHRydWU7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX2lzQ2xvc2VkID0gdHJ1ZTsKICB9Cn0KNwBOTjwBFxoBLQFIBDA7JAZPRVABJQEnIhkBJgY4ERUEAR4VOwYBGwQBRBU7BgEnIgQBERYEAgEucGFja2FnZTpjb252ZXJ0L3NyYy9ieXRlX2FjY3VtdWxhdG9yX3NpbmsuZGFydExmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvY29udmVydC9saWIvc3JjL2hleC5kYXJ0g1YvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0LmhleDsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAnaGV4L2VuY29kZXIuZGFydCc7CmltcG9ydCAnaGV4L2RlY29kZXIuZGFydCc7CgpleHBvcnQgJ2hleC9lbmNvZGVyLmRhcnQnIGhpZGUgaGV4RW5jb2RlcjsKZXhwb3J0ICdoZXgvZGVjb2Rlci5kYXJ0JyBoaWRlIGhleERlY29kZXI7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbSGV4Q29kZWNdLgpjb25zdCBoZXggPSBjb25zdCBIZXhDb2RlYy5fKCk7CgovLy8gQSBjb2RlYyB0aGF0IGNvbnZlcnRzIGJ5dGUgYXJyYXlzIHRvIGFuZCBmcm9tIGhleGFkZWNpbWFsIHN0cmluZ3MsIGZvbGxvd2luZwovLy8gW3RoZSBCYXNlMTYgc3BlY11bcmZjXS4KLy8vCi8vLyBbcmZjXTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi04Ci8vLwovLy8gVGhpcyBzaG91bGQgYmUgdXNlZCB2aWEgdGhlIFtoZXhdIGZpZWxkLgpjbGFzcyBIZXhDb2RlYyBleHRlbmRzIENvZGVjPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgSGV4RW5jb2RlciBnZXQgZW5jb2RlciA9PiBoZXhFbmNvZGVyOwogIEhleERlY29kZXIgZ2V0IGRlY29kZXIgPT4gaGV4RGVjb2RlcjsKCiAgY29uc3QgSGV4Q29kZWMuXygpOwp9Ch8ATk48ARUBFwEbGwErKwEqIAFRHAQ5BC0yKCgBFgIBHHBhY2thZ2U6Y29udmVydC9zcmMvaGV4LmRhcnRXZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbnZlcnQvbGliL3NyYy9pZGVudGl0eV9jb2RlYy5kYXJ0g6BpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgpjbGFzcyBfSWRlbnRpdHlDb252ZXJ0ZXI8VD4gZXh0ZW5kcyBDb252ZXJ0ZXI8VCwgVD4gewogIF9JZGVudGl0eUNvbnZlcnRlcigpOwogIFQgY29udmVydChUIGlucHV0KSA9PiBpbnB1dDsKfQoKLy8vIEEgW0NvZGVjXSB0aGF0IHBlcmZvcm1zIHRoZSBpZGVudGl0eSBjb252ZXJzaW9uIChjaGFuZ2luZyBub3RoaW5nKSBpbiBib3RoCi8vLyBkaXJlY3Rpb25zLgovLy8KLy8vIFRoZSBpZGVudGl0eSBjb2RlYyBwYXNzZXMgaW5wdXQgZGlyZWN0bHkgdG8gb3V0cHV0IGluIGJvdGggZGlyZWN0aW9ucy4KLy8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgYSBiYXNlIHdoZW4gY29tYmluaW5nIG11bHRpcGxlIGNvZGVjcywKLy8vIGJlY2F1c2UgZnVzaW5nIHRoZSBpZGVudGl0eSBjb2RlYyB3aXRoIGFueSBvdGhlciBjb2RlYyBnaXZlcyB0aGUgb3RoZXIKLy8vIGNvZGVjIGJhY2suCi8vLwovLy8gTm90ZSwgdGhhdCB3aGVuIGZ1c2VkIHdpdGggYW5vdGhlciBbQ29kZWNdIHRoZSBpZGVudGl0eSBjb2RlYyBkaXNwcGVhcnMuCmNsYXNzIElkZW50aXR5Q29kZWM8VD4gZXh0ZW5kcyBDb2RlYzxULCBUPiB7CiAgY29uc3QgSWRlbnRpdHlDb2RlYygpOwoKICBDb252ZXJ0ZXI8VCwgVD4gZ2V0IGRlY29kZXIgPT4gbmV3IF9JZGVudGl0eUNvbnZlcnRlcjxUPigpOwogIENvbnZlcnRlcjxULCBUPiBnZXQgZW5jb2RlciA9PiBuZXcgX0lkZW50aXR5Q29udmVydGVyPFQ+KCk7CgogIC8vLyBGdXNlIHdpdGggYW4gb3RoZXIgY29kZWMuCiAgLy8vCiAgLy8vIEZ1c2luZyB3aXRoIHRoZSBpZGVudGlmeSBjb252ZXJ0ZXIgaXMgYSBuby1vcCwgc28gdGhpcyBhbHdheXMgcmV0dXJuCiAgLy8vIFtvdGhlcl0uCiAgQ29kZWM8VCwgUj4gZnVzZTxSPihDb2RlYzxULCBSPiBvdGhlcikgPT4gb3RoZXI7Cn0KHgAXATYYHwIBTxAES0VLEARNLRkBPj4BIAZLDzMCASdwYWNrYWdlOmNvbnZlcnQvc3JjL2lkZW50aXR5X2NvZGVjLmRhcnRQZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbnZlcnQvbGliL3NyYy9wZXJjZW50LmRhcnSF/C8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQucGVyY2VudDsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmltcG9ydCAncGVyY2VudC9lbmNvZGVyLmRhcnQnOwppbXBvcnQgJ3BlcmNlbnQvZGVjb2Rlci5kYXJ0JzsKCmV4cG9ydCAncGVyY2VudC9lbmNvZGVyLmRhcnQnIGhpZGUgcGVyY2VudEVuY29kZXI7CmV4cG9ydCAncGVyY2VudC9kZWNvZGVyLmRhcnQnIGhpZGUgcGVyY2VudERlY29kZXI7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbUGVyY2VudENvZGVjXS4KY29uc3QgcGVyY2VudCA9IGNvbnN0IFBlcmNlbnRDb2RlYy5fKCk7CgovLyBUT0RPKG53ZWl6KTogQWRkIGZsYWdzIHRvIHN1cHBvcnQgZ2VuZXJhdGluZyBhbmQgaW50ZXJwcmV0aW5nICIrIiBhcyBhIHNwYWNlCi8vIGNoYXJhY3Rlci4gQWxzbyBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gc2V0cyBvZiB1bnJlc2VydmVkIGNoYXJhY3RlcnMuCi8vLyBBIGNvZGVjIHRoYXQgY29udmVydHMgYnl0ZSBhcnJheXMgdG8gYW5kIGZyb20gcGVyY2VudC1lbmNvZGVkIChhbHNvIGtub3duIGFzCi8vLyBVUkwtZW5jb2RlZCkgc3RyaW5ncyBhY2NvcmRpbmcgdG8gW1JGQyAzOTg2XVtyZmNdLgovLy8KLy8vIFtyZmNdOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMQovLy8KLy8vIFtlbmNvZGVyXSBlbmNvZGVzIGFsbCBieXRlcyBvdGhlciB0aGFuIEFTQ0lJIGxldHRlcnMsIGRlY2ltYWwgZGlnaXRzLCBvciBvbmUKLy8vIG9mIGAtLl9+YC4gVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZiBbVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50XSBleGNlcHQKLy8vIHRoYXQgaXQgZG9lc24ndCBlbmNvZGUgYDB4MjBgIGJ5dGVzIHRvIHRoZSBgK2AgY2hhcmFjdGVyLgovLy8KLy8vIFRvIGJlIG1heGltYWxseSBmbGV4aWJsZSwgW2RlY29kZXJdIHdpbGwgZGVjb2RlIGFueSBwZXJjZW50LWVuY29kZWQgYnl0ZSBhbmQKLy8vIHdpbGwgYWxsb3cgYW55IG5vbi1wZXJjZW50LWVuY29kZWQgYnl0ZSBvdGhlciB0aGFuIGAlYC4gQnkgZGVmYXVsdCwgaXQKLy8vIGludGVycHJldHMgYCtgIGFzIGAweDJCYCByYXRoZXIgdGhhbiBgMHgyMGAgYXMgZW1pdHRlZCBieQovLy8gW1VyaS5lbmNvZGVRdWVyeUNvbXBvbmVudF0uCmNsYXNzIFBlcmNlbnRDb2RlYyBleHRlbmRzIENvZGVjPExpc3Q8aW50PiwgU3RyaW5nPiB7CiAgUGVyY2VudEVuY29kZXIgZ2V0IGVuY29kZXIgPT4gcGVyY2VudEVuY29kZXI7CiAgUGVyY2VudERlY29kZXIgZ2V0IGRlY29kZXIgPT4gcGVyY2VudERlY29kZXI7CgogIGNvbnN0IFBlcmNlbnRDb2RlYy5fKCk7Cn0KKABOTjwBGQEXAR8fATMzAS4oAVBLUTcEOwRRTj4EUUs+IDYwMAEaAgEgcGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50LmRhcnRgZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbnZlcnQvbGliL3NyYy9zdHJpbmdfYWNjdW11bGF0b3Jfc2luay5kYXJ0hLgvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKLy8vIEEgc2luayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZ3MgcGFzc2VkIHRvIGl0LgovLy8KLy8vIFNlZSBhbHNvIFtTdHJpbmdDb252ZXJzaW9uU2luay53aXRoQ2FsbGJhY2tdLgpjbGFzcyBTdHJpbmdBY2N1bXVsYXRvclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgc3RyaW5nIGFjY3VtdWxhdGVkIHNvIGZhci4KICBTdHJpbmcgZ2V0IHN0cmluZyA9PiBfYnVmZmVyLnRvU3RyaW5nKCk7CiAgZmluYWwgX2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCiAgLy8vIFdoZXRoZXIgW2Nsb3NlXSBoYXMgYmVlbiBjYWxsZWQuCiAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gX2lzQ2xvc2VkOwogIHZhciBfaXNDbG9zZWQgPSBmYWxzZTsKCiAgLy8vIEVtcHRpZXMgW3N0cmluZ10uCiAgLy8vCiAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgZG91YmxlLXByb2Nlc3NpbmcgZGF0YS4KICB2b2lkIGNsZWFyKCkgewogICAgX2J1ZmZlci5jbGVhcigpOwogIH0KCiAgdm9pZCBhZGQoU3RyaW5nIGNodW5rKSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfYnVmZmVyLndyaXRlKGNodW5rKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoX2lzQ2xvc2VkKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay4iKTsKICAgIH0KCiAgICBfYnVmZmVyLndyaXRlKGNodW5rLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBfaXNDbG9zZWQgPSB0cnVlOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9pc0Nsb3NlZCA9IHRydWU7CiAgfQp9CjAATk48ARcBSgQyPyUrJgEnIhkBGAY4ERUEARsVOwYBGgQBQRU7BgEwIgQBERYEAgEwcGFja2FnZTpjb252ZXJ0L3NyYy9zdHJpbmdfYWNjdW11bGF0b3Jfc2luay5kYXJ0UmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi90eXBlZF9kYXRhL2xpYi90eXBlZF9kYXRhLmRhcnSBaC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gVXRpbGl0aWVzIGFuZCBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gdGhlICJkYXJ0OnR5cGVkX2RhdGEiIGxpYnJhcnkuCmxpYnJhcnkgdHlwZWRfZGF0YTsKCmV4cG9ydCAicGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2J1ZmZlcnMuZGFydCI7CgoATk48AUoUATABInBhY2thZ2U6dHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnRfZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL21lc3NhZ2VzL2NvZGVzLmRhcnSegy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQubWVzc2FnZXMuY29kZXM7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBKc29uRW5jb2RlciwganNvbjsKCmltcG9ydCAnZGlhZ25vc3RpY19tZXNzYWdlLmRhcnQnIHNob3cgRGlhZ25vc3RpY01lc3NhZ2U7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAnLi4vdXRpbC9yZWxhdGl2aXplLmRhcnQnIHNob3cgaXNXaW5kb3dzOwoKaW1wb3J0ICcuLi91dGlsL3JlbGF0aXZpemUuZGFydCcgYXMgdXRpbCBzaG93IHJlbGF0aXZpemVVcmk7CgpwYXJ0ICdjb2Rlc19nZW5lcmF0ZWQuZGFydCc7Cgpjb25zdCBpbnQgbm9MZW5ndGggPSAxOwoKY2xhc3MgQ29kZTxUPiB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgdW5pcXVlIHBvc2l0aXZlIGludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSwKICAvLy8gb3IgYC0xYCBpZiBub25lLiBUaGlzIGluZGV4IGlzIHVzZWQgd2hlbiB0cmFuc2xhdGluZwogIC8vLyB0aGlzIGVycm9yIHRvIGl0cyBjb3JyZXNwb25kaW5nIEFuYWx5emVyIGVycm9yLgogIGZpbmFsIGludCBpbmRleDsKCiAgZmluYWwgVGVtcGxhdGU8VD4gdGVtcGxhdGU7CgogIGZpbmFsIExpc3Q8U3RyaW5nPiBhbmFseXplckNvZGVzOwoKICBmaW5hbCBTZXZlcml0eSBzZXZlcml0eTsKCiAgY29uc3QgQ29kZSh0aGlzLm5hbWUsIHRoaXMudGVtcGxhdGUsCiAgICAgIHtpbnQgaW5kZXgsIHRoaXMuYW5hbHl6ZXJDb2RlcywgdGhpcy5zZXZlcml0eTogU2V2ZXJpdHkuZXJyb3J9KQogICAgICA6IHRoaXMuaW5kZXggPSBpbmRleCA/PyAtMTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbmFtZTsKfQoKY2xhc3MgTWVzc2FnZSB7CiAgZmluYWwgQ29kZTxkeW5hbWljPiBjb2RlOwoKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgZmluYWwgU3RyaW5nIHRpcDsKCiAgZmluYWwgTWFwPFN0cmluZywgZHluYW1pYz4gYXJndW1lbnRzOwoKICBjb25zdCBNZXNzYWdlKHRoaXMuY29kZSwge3RoaXMubWVzc2FnZSwgdGhpcy50aXAsIHRoaXMuYXJndW1lbnRzfSk7CgogIExvY2F0ZWRNZXNzYWdlIHdpdGhMb2NhdGlvbihVcmkgdXJpLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBMb2NhdGVkTWVzc2FnZSh1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCwgdGhpcyk7CiAgfQoKICBMb2NhdGVkTWVzc2FnZSB3aXRob3V0TG9jYXRpb24oKSB7CiAgICByZXR1cm4gbmV3IExvY2F0ZWRNZXNzYWdlKG51bGwsIC0xLCBub0xlbmd0aCwgdGhpcyk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIk1lc3NhZ2VbJGNvZGUsICRtZXNzYWdlLCAkdGlwLCAkYXJndW1lbnRzXSI7CiAgfQp9CgpjbGFzcyBNZXNzYWdlQ29kZSBleHRlbmRzIENvZGU8TnVsbD4gaW1wbGVtZW50cyBNZXNzYWdlIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgZmluYWwgU3RyaW5nIHRpcDsKCiAgY29uc3QgTWVzc2FnZUNvZGUoU3RyaW5nIG5hbWUsCiAgICAgIHtpbnQgaW5kZXgsCiAgICAgIExpc3Q8U3RyaW5nPiBhbmFseXplckNvZGVzLAogICAgICBTZXZlcml0eSBzZXZlcml0eTogU2V2ZXJpdHkuZXJyb3IsCiAgICAgIHRoaXMubWVzc2FnZSwKICAgICAgdGhpcy50aXB9KQogICAgICA6IHN1cGVyKG5hbWUsIG51bGwsCiAgICAgICAgICAgIGluZGV4OiBpbmRleCwgYW5hbHl6ZXJDb2RlczogYW5hbHl6ZXJDb2Rlcywgc2V2ZXJpdHk6IHNldmVyaXR5KTsKCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IGFyZ3VtZW50cyA9PiBjb25zdCA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBDb2RlPGR5bmFtaWM+IGdldCBjb2RlID0+IHRoaXM7CgogIEBvdmVycmlkZQogIExvY2F0ZWRNZXNzYWdlIHdpdGhMb2NhdGlvbihVcmkgdXJpLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBMb2NhdGVkTWVzc2FnZSh1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCwgdGhpcyk7CiAgfQoKICBMb2NhdGVkTWVzc2FnZSB3aXRob3V0TG9jYXRpb24oKSB7CiAgICByZXR1cm4gbmV3IExvY2F0ZWRNZXNzYWdlKG51bGwsIC0xLCBub0xlbmd0aCwgdGhpcyk7CiAgfQp9CgpjbGFzcyBUZW1wbGF0ZTxUPiB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZTsKCiAgZmluYWwgU3RyaW5nIHRpcFRlbXBsYXRlOwoKICBmaW5hbCBUIHdpdGhBcmd1bWVudHM7CgogIGNvbnN0IFRlbXBsYXRlKHt0aGlzLm1lc3NhZ2VUZW1wbGF0ZSwgdGhpcy50aXBUZW1wbGF0ZSwgdGhpcy53aXRoQXJndW1lbnRzfSk7Cn0KCmNsYXNzIExvY2F0ZWRNZXNzYWdlIGltcGxlbWVudHMgQ29tcGFyYWJsZTxMb2NhdGVkTWVzc2FnZT4gewogIGZpbmFsIFVyaSB1cmk7CgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBpbnQgbGVuZ3RoOwoKICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2VPYmplY3Q7CgogIGNvbnN0IExvY2F0ZWRNZXNzYWdlKAogICAgICB0aGlzLnVyaSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmxlbmd0aCwgdGhpcy5tZXNzYWdlT2JqZWN0KTsKCiAgQ29kZTxkeW5hbWljPiBnZXQgY29kZSA9PiBtZXNzYWdlT2JqZWN0LmNvZGU7CgogIFN0cmluZyBnZXQgbWVzc2FnZSA9PiBtZXNzYWdlT2JqZWN0Lm1lc3NhZ2U7CgogIFN0cmluZyBnZXQgdGlwID0+IG1lc3NhZ2VPYmplY3QudGlwOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgYXJndW1lbnRzID0+IG1lc3NhZ2VPYmplY3QuYXJndW1lbnRzOwoKICBpbnQgY29tcGFyZVRvKExvY2F0ZWRNZXNzYWdlIG90aGVyKSB7CiAgICBpbnQgcmVzdWx0ID0gIiR7dXJpfSIuY29tcGFyZVRvKCIke290aGVyLnVyaX0iKTsKICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgIHJlc3VsdCA9IGNoYXJPZmZzZXQuY29tcGFyZVRvKG90aGVyLmNoYXJPZmZzZXQpOwogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIG1lc3NhZ2UuY29tcGFyZVRvKG1lc3NhZ2UpOwogIH0KCiAgRm9ybWF0dGVkTWVzc2FnZSB3aXRoRm9ybWF0dGluZyhTdHJpbmcgZm9ybWF0dGVkLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKICAgICAgU2V2ZXJpdHkgc2V2ZXJpdHksIExpc3Q8Rm9ybWF0dGVkTWVzc2FnZT4gcmVsYXRlZEluZm9ybWF0aW9uKSB7CiAgICByZXR1cm4gbmV3IEZvcm1hdHRlZE1lc3NhZ2UoCiAgICAgICAgdGhpcywgZm9ybWF0dGVkLCBsaW5lLCBjb2x1bW4sIHNldmVyaXR5LCByZWxhdGVkSW5mb3JtYXRpb24pOwogIH0KfQoKY2xhc3MgRm9ybWF0dGVkTWVzc2FnZSBpbXBsZW1lbnRzIERpYWdub3N0aWNNZXNzYWdlIHsKICBmaW5hbCBMb2NhdGVkTWVzc2FnZSBsb2NhdGVkTWVzc2FnZTsKCiAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDsKCiAgZmluYWwgaW50IGxpbmU7CgogIGZpbmFsIGludCBjb2x1bW47CgogIEBvdmVycmlkZQogIGZpbmFsIFNldmVyaXR5IHNldmVyaXR5OwoKICBmaW5hbCBMaXN0PEZvcm1hdHRlZE1lc3NhZ2U+IHJlbGF0ZWRJbmZvcm1hdGlvbjsKCiAgY29uc3QgRm9ybWF0dGVkTWVzc2FnZSh0aGlzLmxvY2F0ZWRNZXNzYWdlLCB0aGlzLmZvcm1hdHRlZCwgdGhpcy5saW5lLAogICAgICB0aGlzLmNvbHVtbiwgdGhpcy5zZXZlcml0eSwgdGhpcy5yZWxhdGVkSW5mb3JtYXRpb24pOwoKICBDb2RlPGR5bmFtaWM+IGdldCBjb2RlID0+IGxvY2F0ZWRNZXNzYWdlLmNvZGU7CgogIFN0cmluZyBnZXQgbWVzc2FnZSA9PiBsb2NhdGVkTWVzc2FnZS5tZXNzYWdlOwoKICBTdHJpbmcgZ2V0IHRpcCA9PiBsb2NhdGVkTWVzc2FnZS50aXA7CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCBhcmd1bWVudHMgPT4gbG9jYXRlZE1lc3NhZ2UuYXJndW1lbnRzOwoKICBVcmkgZ2V0IHVyaSA9PiBsb2NhdGVkTWVzc2FnZS51cmk7CgogIGludCBnZXQgY2hhck9mZnNldCA9PiBsb2NhdGVkTWVzc2FnZS5jaGFyT2Zmc2V0OwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBsb2NhdGVkTWVzc2FnZS5sZW5ndGg7CgogIEBvdmVycmlkZQogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IGFuc2lGb3JtYXR0ZWQgc3luYyogewogICAgeWllbGQgZm9ybWF0dGVkOwogICAgaWYgKHJlbGF0ZWRJbmZvcm1hdGlvbiAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWF0dGVkTWVzc2FnZSBtIGluIHJlbGF0ZWRJbmZvcm1hdGlvbikgewogICAgICAgIHlpZWxkIG0uZm9ybWF0dGVkOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBwbGFpblRleHRGb3JtYXR0ZWQgewogICAgLy8gVE9ETyhhaGUpOiBJbXBsZW1lbnQgdGhpcyBjb3JyZWN0bHkuCiAgICByZXR1cm4gYW5zaUZvcm1hdHRlZDsKICB9CgogIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Kc29uKCkgewogICAgLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggcGFja2FnZTprZXJuZWwvcHJvYmxlbXMubWQKICAgIHJldHVybiA8U3RyaW5nLCBPYmplY3Q+ewogICAgICAiYW5zaUZvcm1hdHRlZCI6IGFuc2lGb3JtYXR0ZWQudG9MaXN0KCksCiAgICAgICJwbGFpblRleHRGb3JtYXR0ZWQiOiBwbGFpblRleHRGb3JtYXR0ZWQudG9MaXN0KCksCiAgICAgICJzZXZlcml0eSI6IHNldmVyaXR5LmluZGV4LAogICAgICAidXJpIjogdXJpLnRvU3RyaW5nKCksCiAgICB9OwogIH0KCiAgU3RyaW5nIHRvSnNvblN0cmluZygpIHsKICAgIEpzb25FbmNvZGVyIGVuY29kZXIgPSBuZXcgSnNvbkVuY29kZXIud2l0aEluZGVudCgiICAiKTsKICAgIHJldHVybiBlbmNvZGVyLmNvbnZlcnQodGhpcyk7CiAgfQp9CgpjbGFzcyBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uIGltcGxlbWVudHMgRGlhZ25vc3RpY01lc3NhZ2UgewogIEBvdmVycmlkZQogIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gYW5zaUZvcm1hdHRlZDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBwbGFpblRleHRGb3JtYXR0ZWQ7CgogIEBvdmVycmlkZQogIGZpbmFsIFNldmVyaXR5IHNldmVyaXR5OwoKICBmaW5hbCBVcmkgdXJpOwoKICBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uKAogICAgICB0aGlzLmFuc2lGb3JtYXR0ZWQsIHRoaXMucGxhaW5UZXh0Rm9ybWF0dGVkLCB0aGlzLnNldmVyaXR5LCB0aGlzLnVyaSk7CgogIGZhY3RvcnkgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbi5mcm9tSnNvbihTdHJpbmcganNvblN0cmluZykgewogICAgTWFwPFN0cmluZywgT2JqZWN0PiBkZWNvZGVkID0ganNvbi5kZWNvZGUoanNvblN0cmluZyk7CiAgICBMaXN0PFN0cmluZz4gYW5zaUZvcm1hdHRlZCA9CiAgICAgICAgbmV3IExpc3Q8U3RyaW5nPi5mcm9tKGRlY29kZWRbImFuc2lGb3JtYXR0ZWQiXSk7CiAgICBMaXN0PFN0cmluZz4gcGxhaW5UZXh0Rm9ybWF0dGVkID0KICAgICAgICBuZXcgTGlzdDxTdHJpbmc+LmZyb20oZGVjb2RlZFsicGxhaW5UZXh0Rm9ybWF0dGVkIl0pOwogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTZXZlcml0eS52YWx1ZXNbZGVjb2RlZFsic2V2ZXJpdHkiXV07CiAgICBVcmkgdXJpID0gVXJpLnBhcnNlKGRlY29kZWRbInVyaSJdKTsKCiAgICByZXR1cm4gbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24oCiAgICAgICAgYW5zaUZvcm1hdHRlZCwgcGxhaW5UZXh0Rm9ybWF0dGVkLCBzZXZlcml0eSwgdXJpKTsKICB9CgogIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9Kc29uKCkgewogICAgLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggcGFja2FnZTprZXJuZWwvcHJvYmxlbXMubWQKICAgIHJldHVybiA8U3RyaW5nLCBPYmplY3Q+ewogICAgICAiYW5zaUZvcm1hdHRlZCI6IGFuc2lGb3JtYXR0ZWQudG9MaXN0KCksCiAgICAgICJwbGFpblRleHRGb3JtYXR0ZWQiOiBwbGFpblRleHRGb3JtYXR0ZWQudG9MaXN0KCksCiAgICAgICJzZXZlcml0eSI6IHNldmVyaXR5LmluZGV4LAogICAgICAidXJpIjogdXJpLnRvU3RyaW5nKCksCiAgICB9OwogIH0KCiAgU3RyaW5nIHRvSnNvblN0cmluZygpIHsKICAgIEpzb25FbmNvZGVyIGVuY29kZXIgPSBuZXcgSnNvbkVuY29kZXIud2l0aEluZGVudCgiICAiKTsKICAgIHJldHVybiBlbmNvZGVyLmNvbnZlcnQodGhpcyk7CiAgfQp9CgpTdHJpbmcgcmVsYXRpdml6ZVVyaShVcmkgdXJpKSB7CiAgLy8gV2UgaGF2ZSB0aGlzIG1ldGhvZCBoZXJlIGZvciB0d28gcmVhc29uczoKICAvLwogIC8vIDEuIEl0IGFsbG93cyB1cyB0byBpbXBsZW1lbnQgI3VyaSBtZXNzYWdlIGFyZ3VtZW50IHdpdGhvdXQgdXNpbmcgaXQKICAvLyAob3RoZXJ3aXNlLCB3ZSBtaWdodCBnZXQgYW4gYFVOVVNFRF9JTVBPUlRgIHdhcm5pbmcpLgogIC8vCiAgLy8gMi4gV2UgY2FuIGNoYW5nZSBgYmFzZWAgYXJndW1lbnQgaGVyZSBpZiBuZWVkZWQuCiAgcmV0dXJuIHVyaSA9PSBudWxsID8gbnVsbCA6IHV0aWwucmVsYXRpdml6ZVVyaShVcmkuYmFzZSwgdXJpLCBpc1dpbmRvd3MpOwp9Cgp0eXBlZGVmIFN1bW1hcnlUZW1wbGF0ZSA9IE1lc3NhZ2UgRnVuY3Rpb24oaW50LCBpbnQsIG51bSwgbnVtLCBudW0pOwoKU3RyaW5nIGl0ZW1pemVOYW1lcyhMaXN0PFN0cmluZz4gbmFtZXMpIHsKICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICBidWZmZXIud3JpdGUoIiAtICIpOwogICAgYnVmZmVyLndyaXRlbG4obmFtZXNbaV0pOwogIH0KICBidWZmZXIud3JpdGUoIiAtICIpOwogIGJ1ZmZlci53cml0ZShuYW1lcy5sYXN0KTsKICByZXR1cm4gIiRidWZmZXIiOwp9CgovLy8gQ29udmVydCB0aGUgc3ludGhldGljIG5hbWUgb2YgYW4gaW1wbGljaXQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKLy8vIGludG8gYSBuYW1lIHN1aXRhYmxlIGZvciB1c2VyLWZhY2VkIHN0cmluZ3MuCi8vLwovLy8gRm9yIGV4YW1wbGUsIHdoZW4gY29tcGlsaW5nICJjbGFzcyBBIGV4dGVuZHMgUyB3aXRoIE0xLCBNMiIsIHRoZQovLy8gdHdvIHN5bnRoZXRpYyBjbGFzc2VzIHdpbGwgYmUgbmFtZWQgIl9BJlMmTTEiIGFuZCAiX0EmUyZNMSZNMiIuCi8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICJTIHdpdGggTTEiIGFuZCAiUyB3aXRoIE0xLCBNMiIsIHJlc3BlY3RpdmVseS4KLy8vCi8vLyBUaGlzIG1ldGhvZCBpcyBjb3BpZWQgZnJvbSBwYWNrYWdlOmtlcm5lbC9hc3QuZGFydC4KLy8gVE9ETyhqb2hubml3aW50aGVyKTogQXZvaWQgdGhlIG5lZWQgZm9yIHRoaXMgbWV0aG9kLgpTdHJpbmcgZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShTdHJpbmcgbmFtZSkgewogIExpc3Q8U3RyaW5nPiBuYW1lUGFydHMgPSBuYW1lLnNwbGl0KCcmJyk7CiAgaWYgKG5hbWVQYXJ0cy5sZW5ndGggPCAyIHx8IG5hbWUgPT0gIiYiKSByZXR1cm4gbmFtZTsKICBTdHJpbmcgZGVtYW5nbGVkTmFtZSA9IG5hbWVQYXJ0c1sxXTsKICBmb3IgKGludCBpID0gMjsgaSA8IG5hbWVQYXJ0cy5sZW5ndGg7IGkrKykgewogICAgZGVtYW5nbGVkTmFtZSArPSAoaSA9PSAyID8gIiB3aXRoICIgOiAiLCAiKSArIG5hbWVQYXJ0c1tpXTsKICB9CiAgcmV0dXJuIGRlbWFuZ2xlZE5hbWU7Cn0KgSIATk48ASwBLgE5ASsBJgExAT0BHQEYARAVAT07NhMBHgEkARsBJ0YiAR0CARAcARgBFAEoAUYBRT4EASU5BAEWOQQCAToYARQBIRIiKRQRGk0BQwEiAQxFPgQBJTkEAgEUIAEcARkBUAIBPREBGAEUAR8BGEMBMAEvAScBQQEoNSQ1JCcEAUpGIUYEAgE2JwEaARIBFAEMGwEzAUk8ATEBMAEoAUIBJQEzASsBDC0VJjcbCAYEAQwsLBoEASFDHS85Ih0HBAEaPCIEAgE/DCgBDC0BDBsBEQEdTQFCOyE5Jj4+KQEqOwQBIUMdLzkiHQcEARo8IgQCASAvBUk7BTZMAgFFASosLxkeBBccFAIBRjEERURNBDg4Myw4Jy9ABBgCATNwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL2NvZGVzLmRhcnRpZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL21lc3NhZ2VzL2NvZGVzX2dlbmVyYXRlZC5kYXJ0wAXhZS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBOT1RFOiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBETyBOT1QgRURJVC4KLy8KLy8gSW5zdGVhZCBtb2RpZnkgJ3BrZy9mcm9udF9lbmQvbWVzc2FnZXMueWFtbCcgYW5kIHJ1bgovLyAncGtnL2Zyb250X2VuZC90b29sL2Zhc3RhIGdlbmVyYXRlLW1lc3NhZ2VzJyB0byB1cGRhdGUuCgovLyBpZ25vcmVfZm9yX2ZpbGU6IGxpbmVzX2xvbmdlcl90aGFuXzgwX2NoYXJzCgpwYXJ0IG9mIF9mZV9hbmFseXplcl9zaGFyZWQubWVzc2FnZXMuY29kZXM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBjbGFzcyAnI25hbWUnIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbiIsIHRlbXBsYXRlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5FV19XSVRIX0FCU1RSQUNUX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0Fic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBjbGFzcyAnJHtuYW1lfScgaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBYnN0cmFjdENsYXNzTWVtYmVyID0gbWVzc2FnZUFic3RyYWN0Q2xhc3NNZW1iZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkFic3RyYWN0Q2xhc3NNZW1iZXIiLAogICAgaW5kZXg6IDUxLAogICAgbWVzc2FnZTogciIiIk1lbWJlcnMgb2YgY2xhc3NlcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnYWJzdHJhY3QnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQuIFlvdSBjYW4gYWRkIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQgYmVmb3JlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQWJzdHJhY3ROb3RTeW5jID0gbWVzc2FnZUFic3RyYWN0Tm90U3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBYnN0cmFjdE5vdFN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgiQWJzdHJhY3ROb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fU1lOQ19BQlNUUkFDVF9NRVRIT0QiXSwKICAgIG1lc3NhZ2U6IHIiIiJBYnN0cmFjdCBtZXRob2RzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkZhY3RvcnkgcmVkaXJlY3RzIHRvIGNsYXNzICcjbmFtZScsIHdoaWNoIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVBYnN0cmFjdFJlZGlyZWN0ZWRDbGFzc0luc3RhbnRpYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZBQ1RPUllfUkVESVJFQ1RTX1RPX0FCU1RSQUNUX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0Fic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZhY3RvcnkgcmVkaXJlY3RzIHRvIGNsYXNzICcke25hbWV9Jywgd2hpY2ggaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVBY2Nlc3NFcnJvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQWNjZXNzIGVycm9yOiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0FjY2Vzc0Vycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVBY2Nlc3NFcnJvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiQWNjZXNzRXJyb3IiLAogIHRlbXBsYXRlQWNjZXNzRXJyb3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQWNjZXNzRXJyb3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVBY2Nlc3NFcnJvciwKICAgICAgbWVzc2FnZTogIiIiQWNjZXNzIGVycm9yOiAnJHtuYW1lfScuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQW5ub3RhdGlvbk9uRnVuY3Rpb25UeXBlVHlwZVZhcmlhYmxlID0KICAgIG1lc3NhZ2VBbm5vdGF0aW9uT25GdW5jdGlvblR5cGVUeXBlVmFyaWFibGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQW5ub3RhdGlvbk9uRnVuY3Rpb25UeXBlVHlwZVZhcmlhYmxlID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJBbm5vdGF0aW9uT25GdW5jdGlvblR5cGVUeXBlVmFyaWFibGUiLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJBIHR5cGUgdmFyaWFibGUgb24gYSBmdW5jdGlvbiB0eXBlIGNhbid0IGhhdmUgYW5ub3RhdGlvbnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIG1lc3NhZ2VBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdLAogICAgICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBicmVhayB0byBhIHRhcmdldCBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQW5vbnltb3VzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb24gPQogICAgbWVzc2FnZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbiIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkxBQkVMX0lOX09VVEVSX1NDT1BFIl0sCiAgICAgICAgbWVzc2FnZTogciIiIkNhbid0IGNvbnRpbnVlIGF0IGEgdGFyZ2V0IGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvZGVQb2ludCk+IHRlbXBsYXRlQXNjaWlDb250cm9sQ2hhcmFjdGVyID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBjb250cm9sIGNoYXJhY3RlciAjdW5pY29kZSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQXNjaWlDb250cm9sQ2hhcmFjdGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4gY29kZUFzY2lpQ29udHJvbENoYXJhY3RlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvZGVQb2ludCk+KAogICAgICAgICJBc2NpaUNvbnRyb2xDaGFyYWN0ZXIiLCB0ZW1wbGF0ZUFzY2lpQ29udHJvbENoYXJhY3RlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9DSEFSQUNURVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQXNjaWlDb250cm9sQ2hhcmFjdGVyKGludCBjb2RlUG9pbnQpIHsKICBTdHJpbmcgdW5pY29kZSA9CiAgICAgICJVKyR7Y29kZVBvaW50LnRvUmFkaXhTdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkTGVmdCg0LCAnMCcpfSI7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVBc2NpaUNvbnRyb2xDaGFyYWN0ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY29udHJvbCBjaGFyYWN0ZXIgJHt1bmljb2RlfSBjYW4gb25seSBiZSB1c2VkIGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvZGVQb2ludCc6IGNvZGVQb2ludH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBc3NlcnRBc0V4cHJlc3Npb24gPSBtZXNzYWdlQXNzZXJ0QXNFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFzc2VydEFzRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkFzc2VydEFzRXhwcmVzc2lvbiIsCiAgICBtZXNzYWdlOiByIiIiYGFzc2VydGAgY2FuJ3QgYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBc3NlcnRFeHRyYW5lb3VzQXJndW1lbnQgPSBtZXNzYWdlQXNzZXJ0RXh0cmFuZW91c0FyZ3VtZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUFzc2VydEV4dHJhbmVvdXNBcmd1bWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkFzc2VydEV4dHJhbmVvdXNBcmd1bWVudCIsCiAgICBtZXNzYWdlOiByIiIiYGFzc2VydGAgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQXdhaXRBc0lkZW50aWZpZXIgPSBtZXNzYWdlQXdhaXRBc0lkZW50aWZpZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQXdhaXRBc0lkZW50aWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJBd2FpdEFzSWRlbnRpZmllciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVNZTkNfS0VZV09SRF9VU0VEX0FTX0lERU5USUZJRVIiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIidhd2FpdCcgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonIG1ldGhvZHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUF3YWl0Rm9yTm90QXN5bmMgPSBtZXNzYWdlQXdhaXRGb3JOb3RBc3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBd2FpdEZvck5vdEFzeW5jID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQXdhaXRGb3JOb3RBc3luYyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVNZTkNfRk9SX0lOX1dST05HX0NPTlRFWFQiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBhc3luY2hyb25vdXMgZm9yLWluIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb25zIG1hcmtlZCB3aXRoICdhc3luYycgb3IgJ2FzeW5jKicuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbWFya2luZyB0aGUgZnVuY3Rpb24gYm9keSB3aXRoIGVpdGhlciAnYXN5bmMnIG9yICdhc3luYyonLCBvciByZW1vdmluZyB0aGUgJ2F3YWl0JyBiZWZvcmUgdGhlIGZvciBsb29wLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVBd2FpdEluTGF0ZUxvY2FsSW5pdGlhbGl6ZXIgPQogICAgbWVzc2FnZUF3YWl0SW5MYXRlTG9jYWxJbml0aWFsaXplcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VBd2FpdEluTGF0ZUxvY2FsSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJBd2FpdEluTGF0ZUxvY2FsSW5pdGlhbGl6ZXIiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiYGF3YWl0YCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBsYXRlIGxvY2FsIGluaXRpYWxpemVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQXdhaXROb3RBc3luYyA9IG1lc3NhZ2VBd2FpdE5vdEFzeW5jOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUF3YWl0Tm90QXN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgiQXdhaXROb3RBc3luYyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQVdBSVRfSU5fV1JPTkdfQ09OVEVYVCJdLAogICAgbWVzc2FnZTogciIiIidhd2FpdCcgY2FuIG9ubHkgYmUgdXNlZCBpbiAnYXN5bmMnIG9yICdhc3luYyonIG1ldGhvZHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLAogICAgICAgICAgICBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIHRoZSBib3VuZHMgb2YgaXRzIG93biB0eXBlIHZhcmlhYmxlcy4gSXQgaXMgcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHRocm91Z2ggJyNuYW1lMicuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyNuYW1lMicgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHkiLAogICAgICAgIHRlbXBsYXRlQm91bmRJc3N1ZVZpYUN5Y2xlTm9uU2ltcGxpY2l0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0lOU1RBTlRJQVRFRF9CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5KAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiR2VuZXJpYyB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiBJdCBpcyByZWZlcmVuY2VkIGluZGlyZWN0bHkgdGhyb3VnaCAnJHtuYW1lMn0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcke25hbWUyfScgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJHZW5lcmljIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHByb3ZpZGluZyB0eXBlIGFyZ3VtZW50cyB0byAnI25hbWUnIGhlcmUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiQm91bmRJc3N1ZVZpYUxvb3BOb25TaW1wbGljaXR5IiwKICAgICAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0lOU1RBTlRJQVRFRF9CT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHkoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJHZW5lcmljIHR5cGUgJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJyR7bmFtZX0nIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIGEgdHlwZSB2YXJpYWJsZSBib3VuZC4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcjbmFtZScgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcyIsCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9JTlNUQU5USUFURURfQk9VTkQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiR2VuZXJpYyB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gYSB0eXBlIHZhcmlhYmxlIGJvdW5kLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcke25hbWV9JyBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUJyZWFrT3V0c2lkZU9mTG9vcCA9IG1lc3NhZ2VCcmVha091dHNpZGVPZkxvb3A7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQnJlYWtPdXRzaWRlT2ZMb29wIiwKICAgIGluZGV4OiA1MiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgYnJlYWsgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGJyZWFrIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBicmVhayB0byAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLCB0ZW1wbGF0ZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBicmVhayB0byAnJHtuYW1lfScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJBc1R5cGUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlRoZSBidWlsdC1pbiBpZGVudGlmaWVyICcjbGV4ZW1lJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNCdWlsdEluSWRlbnRpZmllckFzVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlQnVpbHRJbklkZW50aWZpZXJBc1R5cGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIkJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlIiwgdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckFzVHlwZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQlVJTFRfSU5fSURFTlRJRklFUl9BU19UWVBFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVyQXNUeXBlKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgJyR7bGV4ZW1lfScgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4KICAgIHRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCB1c2UgJyNsZXhlbWUnIGFzIGEgbmFtZSBoZXJlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KCJCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24iLAogICAgICAgIHRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJCVUlMVF9JTl9JREVOVElGSUVSX0lOX0RFQ0xBUkFUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24sCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IHVzZSAnJHtsZXhlbWV9JyBhcyBhIG5hbWUgaGVyZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUJ5dGVjb2RlTGltaXRFeGNlZWRlZFRvb01hbnlBcmd1bWVudHMgPQogICAgbWVzc2FnZUJ5dGVjb2RlTGltaXRFeGNlZWRlZFRvb01hbnlBcmd1bWVudHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkVG9vTWFueUFyZ3VtZW50cyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiQnl0ZWNvZGVMaW1pdEV4Y2VlZGVkVG9vTWFueUFyZ3VtZW50cyIsCiAgICAgICAgbWVzc2FnZTogciIiIkRhcnQgYnl0ZWNvZGUgbGltaXQgZXhjZWVkZWQ6IHRvbyBtYW55IGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2FuZGlkYXRlRm91bmQgPSBtZXNzYWdlQ2FuZGlkYXRlRm91bmQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FuZGlkYXRlRm91bmQgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ2FuZGlkYXRlRm91bmQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiRm91bmQgdGhpcyBjYW5kaWRhdGUsIGJ1dCB0aGUgYXJndW1lbnRzIGRvbid0IG1hdGNoLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIGNsYXNzICcjbmFtZScgaGFzIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3IiLAogICAgICAgIHRlbXBsYXRlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgY2xhc3MgJyR7bmFtZX0nIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPQogICAgbWVzc2FnZUNhbm5vdEFzc2lnblRvUGFyZW50aGVzaXplZEV4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFTU0lHTk1FTlRfVE9fUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OIl0sCiAgICAgICAgbWVzc2FnZTogciIiIkNhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2Fubm90QXNzaWduVG9TdXBlciA9IG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1N1cGVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW5ub3RBc3NpZ25Ub1N1cGVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQU5fTFZBTFVFIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgYXNzaWduIHRvIHN1cGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJVbmFibGUgdG8gcmVhZCB0aGUgJ2xpYnJhcmllcy5qc29uJyBzcGVjaWZpY2F0aW9uIGZpbGU6CiAgI3N0cmluZy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICJDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiIsCiAgdGVtcGxhdGVDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9uLAogICAgICBtZXNzYWdlOiAiIiJVbmFibGUgdG8gcmVhZCB0aGUgJ2xpYnJhcmllcy5qc29uJyBzcGVjaWZpY2F0aW9uIGZpbGU6CiAgJHtzdHJpbmd9LiIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24gPQogICAgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24iLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQm90aCBJdGVyYWJsZSBhbmQgTWFwIHNwcmVhZCBlbGVtZW50cyBlbmNvdW50ZXJlZCBpbiBhbWJpZ3VvdXMgbGl0ZXJhbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uID0KICAgIG1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk5vdCBlbm91Z2ggdHlwZSBpbmZvcm1hdGlvbiB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBsaXRlcmFsIHNldCBhbmQgbGl0ZXJhbCBtYXAuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIGZvciB0aGUgbGl0ZXJhbCBleHBsaWNpdGx5IHRvIGRpc2FtYmlndWF0ZSBpdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0cyA9CiAgICBtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21NYW55SW5wdXRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ2FudEluZmVyUGFja2FnZXNGcm9tTWFueUlucHV0cyIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW4ndCBpbmZlciBhIC5wYWNrYWdlcyBmaWxlIHdoZW4gY29tcGlsaW5nIG11bHRpcGxlIGlucHV0cy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgc3BlY2lmeWluZyB0aGUgZmlsZSBleHBsaWNpdGx5IHdpdGggdGhlIC0tcGFja2FnZXMgb3B0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpID0KICAgIG1lc3NhZ2VDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50SW5mZXJQYWNrYWdlc0Zyb21QYWNrYWdlVXJpIiwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBpbmZlciBhIC5wYWNrYWdlcyBmaWxlIGZyb20gYW4gaW5wdXQgJ3BhY2thZ2U6KicgVVJJLiIiIiwKICAgIHRpcDogciIiIlRyeSBzcGVjaWZ5aW5nIHRoZSBmaWxlIGV4cGxpY2l0bHkgd2l0aCB0aGUgLS1wYWNrYWdlcyBvcHRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGluZmVyIGEgcmV0dXJuIHR5cGUgZm9yICcjbmFtZScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFkZGluZyBhbiBleHBsaWNpdCB0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0NhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzIiwKICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzKAogICAgU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBpbmZlciBhIHJldHVybiB0eXBlIGZvciAnJHtuYW1lfScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBhZGRpbmcgYW4gZXhwbGljaXQgdHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2FuJ3QgaW5mZXIgdGhlIHR5cGUgb2YgJyNzdHJpbmcnOiBjaXJjdWxhcml0eSBmb3VuZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuIiIiLAogICAgdGlwVGVtcGxhdGU6IHIiIiJTcGVjaWZ5IHRoZSB0eXBlIGV4cGxpY2l0bHkuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSIsIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHksCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFQ1VSU0lWRV9DT01QSUxFX1RJTUVfQ09OU1RBTlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHkoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGluZmVyIHRoZSB0eXBlIG9mICcke3N0cmluZ30nOiBjaXJjdWxhcml0eSBmb3VuZCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuIiIiLAogICAgICB0aXA6ICIiIlNwZWNpZnkgdGhlIHR5cGUgZXhwbGljaXRseS4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgaW5mZXIgYSB0eXBlIGZvciAnI25hbWUnIGFzIHNvbWUgb2YgdGhlIGluaGVyaXRlZCBtZW1iZXJzIGhhdmUgZGlmZmVyZW50IHR5cGVzLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSBhZGRpbmcgYW4gZXhwbGljaXQgdHlwZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyIsCiAgICAgICAgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfTUVUSE9EX09WRVJSSURFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGluZmVyIGEgdHlwZSBmb3IgJyR7bmFtZX0nIGFzIHNvbWUgb2YgdGhlIGluaGVyaXRlZCBtZW1iZXJzIGhhdmUgZGlmZmVyZW50IHR5cGVzLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgYWRkaW5nIGFuIGV4cGxpY2l0IHR5cGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlQ2FudFJlYWRGaWxlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFcnJvciB3aGVuIHJlYWRpbmcgJyN1cmknOiAjc3RyaW5nIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ2FudFJlYWRGaWxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+IGNvZGVDYW50UmVhZEZpbGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkNhbnRSZWFkRmlsZSIsIHRlbXBsYXRlQ2FudFJlYWRGaWxlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVUklfRE9FU19OT1RfRVhJU1QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudFJlYWRGaWxlKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbnRSZWFkRmlsZSwKICAgICAgbWVzc2FnZTogIiIiRXJyb3Igd2hlbiByZWFkaW5nICcke3VyaX0nOiAke3N0cmluZ30iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlfLCAnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPgogICAgdGVtcGxhdGVDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbGV4ZW1lJyBpcyBub3Qgc3VwcG9ydGVkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPgogICAgY29kZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50IiwKICAgICAgICB0ZW1wbGF0ZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0NPTlNUQU5UX0VYUFJFU1NJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ2FudFVzZUNvbnRyb2xGbG93T3JTcHJlYWRBc0NvbnN0YW50KFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudCwKICAgICAgbWVzc2FnZTogIiIiJyR7bGV4ZW1lfScgaXMgbm90IHN1cHBvcnRlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBUb2tlbgogICAgICAgICAgICB0b2tlbik+IHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiJyNsZXhlbWUnIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIGJlY2F1c2UgaXQncyBtYXJrZWQgYXMgJ2RlZmVycmVkJyB3aGljaCBtZWFucyBpdCBpc24ndCBhdmFpbGFibGUgdW50aWwgbG9hZGVkLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgbW92aW5nIHRoZSBjb25zdGFudCBmcm9tIHRoZSBkZWZlcnJlZCBsaWJyYXJ5LCBvciByZW1vdmluZyAnZGVmZXJyZWQnIGZyb20gdGhlIGltcG9ydC4KIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KCJDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50IiwKICAgICAgICB0ZW1wbGF0ZUNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0RFRkVSUkVEX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnQoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke2xleGVtZX0nIGNhbid0IGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIGJlY2F1c2UgaXQncyBtYXJrZWQgYXMgJ2RlZmVycmVkJyB3aGljaCBtZWFucyBpdCBpc24ndCBhdmFpbGFibGUgdW50aWwgbG9hZGVkLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgbW92aW5nIHRoZSBjb25zdGFudCBmcm9tIHRoZSBkZWZlcnJlZCBsaWJyYXJ5LCBvciByZW1vdmluZyAnZGVmZXJyZWQnIGZyb20gdGhlIGltcG9ydC4KIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uID0KICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQUkVGSVhfSURFTlRJRklFUl9OT1RfRk9MTE9XRURfQllfRE9UIl0sCiAgICBtZXNzYWdlOiByIiIiQSBwcmVmaXggY2FuJ3QgYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZSA9CiAgICBtZXNzYWdlQ2FudFVzZVByZWZpeFdpdGhOdWxsQXdhcmU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2FudFVzZVByZWZpeFdpdGhOdWxsQXdhcmUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDYW50VXNlUHJlZml4V2l0aE51bGxBd2FyZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUFJFRklYX0lERU5USUZJRVJfTk9UX0ZPTExPV0VEX0JZX0RPVCJdLAogICAgbWVzc2FnZTogciIiIkEgcHJlZml4IGNhbid0IGJlIHVzZWQgd2l0aCBudWxsLWF3YXJlIG9wZXJhdG9ycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nICc/Licgd2l0aCAnLiciIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2F0Y2hTeW50YXggPSBtZXNzYWdlQ2F0Y2hTeW50YXg7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ2F0Y2hTeW50YXggPSBjb25zdCBNZXNzYWdlQ29kZSgiQ2F0Y2hTeW50YXgiLAogICAgaW5kZXg6IDg0LAogICAgbWVzc2FnZToKICAgICAgICByIiIiJ2NhdGNoJyBtdXN0IGJlIGZvbGxvd2VkIGJ5ICcoaWRlbnRpZmllciknIG9yICcoaWRlbnRpZmllciwgaWRlbnRpZmllciknLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiTm8gdHlwZXMgYXJlIG5lZWRlZCwgdGhlIGZpcnN0IGlzIGdpdmVuIGJ5ICdvbicsIHRoZSBzZWNvbmQgaXMgYWx3YXlzICdTdGFja1RyYWNlJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnMgPQogICAgbWVzc2FnZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnMiLAogICAgaW5kZXg6IDgzLAogICAgbWVzc2FnZToKICAgICAgICByIiIiJ2NhdGNoJyBtdXN0IGJlIGZvbGxvd2VkIGJ5ICcoaWRlbnRpZmllciknIG9yICcoaWRlbnRpZmllciwgaWRlbnRpZmllciknLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiTm8gdHlwZXMgYXJlIG5lZWRlZCwgdGhlIGZpcnN0IGlzIGdpdmVuIGJ5ICdvbicsIHRoZSBzZWNvbmQgaXMgYWx3YXlzICdTdGFja1RyYWNlJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ2xhc3NJbkNsYXNzID0gbWVzc2FnZUNsYXNzSW5DbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDbGFzc0luQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ2xhc3NJbkNsYXNzIiwKICAgIGluZGV4OiA1MywKICAgIG1lc3NhZ2U6IHIiIiJDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBvdGhlciBjbGFzc2VzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGNsYXNzIHRvIHRoZSB0b3AtbGV2ZWwuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbG9uSW5QbGFjZU9mSW4gPSBtZXNzYWdlQ29sb25JblBsYWNlT2ZJbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb2xvbkluUGxhY2VPZkluID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29sb25JblBsYWNlT2ZJbiIsCiAgICBpbmRleDogNTQsCiAgICBtZXNzYWdlOiByIiIiRm9yLWluIGxvb3BzIHVzZSAnaW4nIHJhdGhlciB0aGFuIGEgY29sb24uIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlcGxhY2luZyB0aGUgY29sb24gd2l0aCB0aGUga2V5d29yZCAnaW4nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDbGFzcyAnI25hbWUnIGluaGVyaXRzIG11bHRpcGxlIG1lbWJlcnMgbmFtZWQgJyNuYW1lMicgd2l0aCBpbmNvbXBhdGlibGUgc2lnbmF0dXJlcy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSBhZGRpbmcgYSBkZWNsYXJhdGlvbiBvZiAnI25hbWUyJyB0byAnI25hbWUnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkIiwgdGVtcGxhdGVDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5DT05TSVNURU5UX0lOSEVSSVRBTkNFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDbGFzcyAnJHtuYW1lfScgaW5oZXJpdHMgbXVsdGlwbGUgbWVtYmVycyBuYW1lZCAnJHtuYW1lMn0nIHdpdGggaW5jb21wYXRpYmxlIHNpZ25hdHVyZXMuIiIiLAogICAgICB0aXA6ICIiIlRyeSBhZGRpbmcgYSBkZWNsYXJhdGlvbiBvZiAnJHtuYW1lMn0nIHRvICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBzdHJpbmcsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZzIpPiB0ZW1wbGF0ZUNvbmZsaWN0aW5nTW9kaWZpZXJzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJyNzdHJpbmcnIGFuZCAnI3N0cmluZzInLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIG9uZSBvZiB0aGUga2V5d29yZHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25mbGljdGluZ01vZGlmaWVycyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvbmZsaWN0aW5nTW9kaWZpZXJzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJDb25mbGljdGluZ01vZGlmaWVycyIsIHRlbXBsYXRlQ29uZmxpY3RpbmdNb2RpZmllcnMsCiAgICAgICAgaW5kZXg6IDU5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdGluZ01vZGlmaWVycyhTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25mbGljdGluZ01vZGlmaWVycywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnJHtzdHJpbmd9JyBhbmQgJyR7c3RyaW5nMn0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBrZXl3b3Jkcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIGNvbnN0cnVjdG9yICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvciIsIHRlbXBsYXRlQ29uZmxpY3RzV2l0aENvbnN0cnVjdG9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05GTElDVFNfV0lUSF9DT05TVFJVQ1RPUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoQ29uc3RydWN0b3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIkNvbmZsaWN0cyB3aXRoIGNvbnN0cnVjdG9yICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVDb25mbGljdHNXaXRoRmFjdG9yeSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ29uZmxpY3RzIHdpdGggZmFjdG9yeSAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhGYWN0b3J5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25mbGljdHNXaXRoRmFjdG9yeSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiQ29uZmxpY3RzV2l0aEZhY3RvcnkiLAogIHRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3RvcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aEZhY3RvcnkoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25mbGljdHNXaXRoRmFjdG9yeSwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggZmFjdG9yeSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ29uZmxpY3RzIHdpdGggbWVtYmVyICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aE1lbWJlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uZmxpY3RzV2l0aE1lbWJlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uZmxpY3RzV2l0aE1lbWJlciIsIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RTX1dJVEhfTUVNQkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhNZW1iZXIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25mbGljdHNXaXRoTWVtYmVyLAogICAgICBtZXNzYWdlOiAiIiJDb25mbGljdHMgd2l0aCBtZW1iZXIgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvbmZsaWN0cyB3aXRoIHNldHRlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbmZsaWN0c1dpdGhTZXR0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhTZXR0ZXIiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoU2V0dGVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aFNldHRlciwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggc2V0dGVyICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ29uZmxpY3RzIHdpdGggdHlwZSB2YXJpYWJsZSAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUiLCB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUSU5HX1RZUEVfVkFSSUFCTEVfQU5EX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZSwKICAgICAgbWVzc2FnZTogIiIiQ29uZmxpY3RzIHdpdGggdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNhdXNlID0KICAgIG1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2U7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNhdXNlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNhdXNlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIHR5cGUgdmFyaWFibGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0QW5kRmluYWwgPSBtZXNzYWdlQ29uc3RBbmRGaW5hbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEFuZEZpbmFsID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0QW5kRmluYWwiLAogICAgaW5kZXg6IDU4LAogICAgbWVzc2FnZTogciIiIk1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnY29uc3QnIGFuZCAnZmluYWwnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb25zdCcgb3IgJ2ZpbmFsJyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENsYXNzID0gbWVzc2FnZUNvbnN0Q2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDbGFzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdENsYXNzIiwKICAgIGluZGV4OiA2MCwKICAgIG1lc3NhZ2U6IHIiIiJDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdjb25zdCcuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZC4gSWYgeW91J3JlIHRyeWluZyB0byBpbmRpY2F0ZSB0aGF0IGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgY2FuIGJlIGNvbnN0YW50cywgcGxhY2UgdGhlICdjb25zdCcga2V5d29yZCBvbiAgdGhlIGNsYXNzJyBjb25zdHJ1Y3RvcihzKS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkQ2F1c2UgPQogICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZENhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZENhdXNlID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRDYXVzZSIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICAgICAgbWVzc2FnZTogciIiIkZpZWxkIGlzIGxhdGUsIGJ1dCBjb25zdHJ1Y3RvciBpcyAnY29uc3QnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRFcnJvciA9CiAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkRXJyb3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkRXJyb3IgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZEVycm9yIiwKICAgICAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3IgaXMgbWFya2VkICdjb25zdCcgc28gZmllbGRzIGNhbid0IGJlIGxhdGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZFdhcm5pbmcgPQogICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZFdhcm5pbmc7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkV2FybmluZyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkV2FybmluZyIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcsCiAgICAgICAgbWVzc2FnZToKICAgICAgICAgICAgciIiIkNvbnN0cnVjdG9yIGlzIG1hcmtlZCAnY29uc3QnIGFuZCBzb21lIGZpZWxkcyBhcmUgbGF0ZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQgPQogICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0ZJTkFMX0ZJRUxEIl0sCiAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3IgaXMgbWFya2VkICdjb25zdCcgc28gYWxsIGZpZWxkcyBtdXN0IGJlIGZpbmFsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlID0KICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIkZpZWxkIGlzbid0IGZpbmFsLCBidXQgY29uc3RydWN0b3IgaXMgJ2NvbnN0Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdCA9CiAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0IiwKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgICByIiIiQSBjb25zdGFudCBjb25zdHJ1Y3RvciBjYW4ndCBjYWxsIGEgbm9uLWNvbnN0YW50IGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdENvbnN0cnVjdG9yV2l0aEJvZHkgPSBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhCb2R5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0Q29uc3RydWN0b3JXaXRoQm9keSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9CT0RZIl0sCiAgICBtZXNzYWdlOiByIiIiQSBjb25zdCBjb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGEgYm9keS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgZWl0aGVyIHRoZSAnY29uc3QnIGtleXdvcmQgb3IgdGhlIGJvZHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlciA9CiAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9OT05fQ09OU1RfU1VQRVIiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29uc3RhbnQgY29uc3RydWN0b3IgY2FuJ3QgY2FsbCBhIG5vbi1jb25zdGFudCBzdXBlciBjb25zdHJ1Y3Rvci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsQ2lyY3VsYXJpdHkgPSBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxDaXJjdWxhcml0eSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0NPTVBJTEVfVElNRV9DT05TVEFOVCJdLAogICAgbWVzc2FnZTogciIiIkNvbnN0YW50IGV4cHJlc3Npb24gZGVwZW5kcyBvbiBpdHNlbGYuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbENvbnRleHQgPSBtZXNzYWdlQ29uc3RFdmFsQ29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxDb250ZXh0ID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJDb25zdEV2YWxDb250ZXh0IiwgbWVzc2FnZTogciIiIldoaWxlIGFuYWx5emluZzoiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIicjbmFtZScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBtb3ZpbmcgdGhlIGNvbnN0YW50IGZyb20gdGhlIGRlZmVycmVkIGxpYnJhcnksIG9yIHJlbW92aW5nICdkZWZlcnJlZCcgZnJvbSB0aGUgaW1wb3J0LgoiIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbERlZmVycmVkTGlicmFyeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDb25zdEV2YWxEZWZlcnJlZExpYnJhcnkiLCB0ZW1wbGF0ZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsKICAgICAgIk5PTl9DT05TVEFOVF9ERUZBVUxUX1ZBTFVFX0ZST01fREVGRVJSRURfTElCUkFSWSIKICAgIF0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbERlZmVycmVkTGlicmFyeShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke25hbWV9JyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IG1vdmluZyB0aGUgY29uc3RhbnQgZnJvbSB0aGUgZGVmZXJyZWQgbGlicmFyeSwgb3IgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQuCiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbEV4dGVuc2lvbiA9IG1lc3NhZ2VDb25zdEV2YWxFeHRlbnNpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsRXh0ZW5zaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsRXh0ZW5zaW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQ09OU1RBTlRfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRXh0ZW5zaW9uIG9wZXJhdGlvbnMgY2FuJ3QgYmUgdXNlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uID0gbWVzc2FnZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxGYWlsZWRBc3NlcnRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxGYWlsZWRBc3NlcnRpb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiJdLAogICAgbWVzc2FnZTogciIiIlRoaXMgYXNzZXJ0aW9uIGZhaWxlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhpcyBhc3NlcnRpb24gZmFpbGVkIHdpdGggbWVzc2FnZTogI3N0cmluZyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uV2l0aE1lc3NhZ2UsCiAgICAgIG1lc3NhZ2U6ICIiIlRoaXMgYXNzZXJ0aW9uIGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7c3RyaW5nfSIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgaW52b2NhdGlvbiBvZiAnI25hbWUnIGlzIG5vdCBhbGxvd2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24iLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0lOSVRJQUxJWkVEX1dJVEhfTk9OX0NPTlNUQU5UX1ZBTFVFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgaW52b2NhdGlvbiBvZiAnJHtuYW1lfScgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZyBzdHJpbmcyLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmczKT4gdGVtcGxhdGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI3N0cmluZzInIHJlcXVpcmVzIG5vbi1uZWdhdGl2ZSBvcGVyYW5kLCBidXQgd2FzICcjc3RyaW5nMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPgogICAgY29kZUNvbnN0RXZhbE5lZ2F0aXZlU2hpZnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMyk+KAogICJDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0IiwKICB0ZW1wbGF0ZUNvbnN0RXZhbE5lZ2F0aXZlU2hpZnQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCgKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzMuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQmluYXJ5IG9wZXJhdG9yICcke3N0cmluZ30nIG9uICcke3N0cmluZzJ9JyByZXF1aXJlcyBub24tbmVnYXRpdmUgb3BlcmFuZCwgYnV0IHdhcyAnJHtzdHJpbmczfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzIsICdzdHJpbmczJzogc3RyaW5nM30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgdmFyaWFibGUgJyNzdHJpbmcnIGlzIG5vdCBhIGNvbnN0YW50LCBvbmx5IGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0IiwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9DT05TVEFOVF9WQUxVRV9JTl9JTklUSUFMSVpFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSB2YXJpYWJsZSAnJHtzdHJpbmd9JyBpcyBub3QgYSBjb25zdGFudCwgb25seSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgYWxsb3dlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQgPQogICAgbWVzc2FnZUNvbnN0RXZhbE5vdExpc3RPclNldEluU3ByZWFkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0RXZhbE5vdExpc3RPclNldEluU3ByZWFkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsTm90TGlzdE9yU2V0SW5TcHJlYWQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX1NQUkVBRF9FWFBFQ1RFRF9MSVNUX09SX1NFVCJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiT25seSBsaXN0cyBhbmQgc2V0cyBjYW4gYmUgdXNlZCBpbiBzcHJlYWRzIGluIGNvbnN0YW50IGxpc3RzIGFuZCBzZXRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEV2YWxOb3RNYXBJblNwcmVhZCA9IG1lc3NhZ2VDb25zdEV2YWxOb3RNYXBJblNwcmVhZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxOb3RNYXBJblNwcmVhZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0RXZhbE5vdE1hcEluU3ByZWFkIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9TUFJFQURfRVhQRUNURURfTUFQIl0sCiAgICBtZXNzYWdlOiByIiIiT25seSBtYXBzIGNhbiBiZSB1c2VkIGluIHNwcmVhZHMgaW4gY29uc3RhbnQgbWFwcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsTnVsbFZhbHVlID0gbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxOdWxsVmFsdWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiJdLAogICAgbWVzc2FnZTogciIiIk51bGwgdmFsdWUgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RXZhbFN0YXJ0aW5nUG9pbnQgPSBtZXNzYWdlQ29uc3RFdmFsU3RhcnRpbmdQb2ludDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdEV2YWxTdGFydGluZ1BvaW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RFdmFsU3RhcnRpbmdQb2ludCIsCiAgICBtZXNzYWdlOiByIiIiQ29uc3RhbnQgZXZhbHVhdGlvbiBlcnJvcjoiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RFdmFsVW5ldmFsdWF0ZWQgPSBtZXNzYWdlQ29uc3RFdmFsVW5ldmFsdWF0ZWQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RFdmFsVW5ldmFsdWF0ZWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdEV2YWxVbmV2YWx1YXRlZCIsCiAgICBtZXNzYWdlOiByIiIiQ291bGQgbm90IGV2YWx1YXRlIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVDb25zdEV2YWxaZXJvRGl2aXNvciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI3N0cmluZzInIHJlcXVpcmVzIG5vbi16ZXJvIGRpdmlzb3IsIGJ1dCBkaXZpc29yIHdhcyAnMCcuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEV2YWxaZXJvRGl2aXNvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvbnN0RXZhbFplcm9EaXZpc29yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJDb25zdEV2YWxaZXJvRGl2aXNvciIsIHRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUX0VWQUxfVEhST1dTX0lEQlpFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbFplcm9EaXZpc29yKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RXZhbFplcm9EaXZpc29yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQmluYXJ5IG9wZXJhdG9yICcke3N0cmluZ30nIG9uICcke3N0cmluZzJ9JyByZXF1aXJlcyBub24temVybyBkaXZpc29yLCBidXQgZGl2aXNvciB3YXMgJzAnLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0RmFjdG9yeSA9IG1lc3NhZ2VDb25zdEZhY3Rvcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RGYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0RmFjdG9yeSIsCiAgICBpbmRleDogNjIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQsIG9yIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoICc9JyBmb2xsb3dlZCBieSBhIHZhbGlkIHRhcmdldC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0KICAgIG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RGYWN0b3J5UmVkaXJlY3Rpb25Ub05vbkNvbnN0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRURJUkVDVF9UT19OT05fQ09OU1RfQ09OU1RSVUNUT1IiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNvbnN0YW50IGZhY3RvcnkgY29uc3RydWN0b3IgY2FuJ3QgZGVsZWdhdGUgdG8gYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igb3IgbWFya2luZyB0aGUgdGFyZ2V0IGNvbnN0cnVjdG9yICdjb25zdCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBjb25zdCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IGV4cHJlc3Npb24nKSB0byB0aGUgZGVjbGFyYXRpb24uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyIiwgdGVtcGxhdGVDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05TVF9OT1RfSU5JVElBTElaRUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBjb25zdCB2YXJpYWJsZSAnJHtuYW1lfScgbXVzdCBiZSBpbml0aWFsaXplZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gZXhwcmVzc2lvbicpIHRvIHRoZSBkZWNsYXJhdGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdEluc3RhbmNlRmllbGQgPSBtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0SW5zdGFuY2VGaWVsZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0SW5zdGFuY2VGaWVsZCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09OU1RfSU5TVEFOQ0VfRklFTEQiXSwKICAgIG1lc3NhZ2U6IHIiIiJPbmx5IHN0YXRpYyBmaWVsZHMgY2FuIGJlIGRlY2xhcmVkIGFzIGNvbnN0LiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHVzaW5nICdmaW5hbCcgaW5zdGVhZCBvZiAnY29uc3QnLCBvciBhZGRpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0TWV0aG9kID0gbWVzc2FnZUNvbnN0TWV0aG9kOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0TWV0aG9kID0gY29uc3QgTWVzc2FnZUNvZGUoIkNvbnN0TWV0aG9kIiwKICAgIGluZGV4OiA2MywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkdldHRlcnMsIHNldHRlcnMgYW5kIG1ldGhvZHMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcga2V5d29yZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JDeWNsaWMgPSBtZXNzYWdlQ29uc3RydWN0b3JDeWNsaWM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RydWN0b3JDeWNsaWMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvckN5Y2xpYyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0NPTlNUUlVDVE9SX1JFRElSRUNUIl0sCiAgICBtZXNzYWdlOiByIiIiUmVkaXJlY3RpbmcgY29uc3RydWN0b3JzIGNhbid0IGJlIGN5Y2xpYy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSB0byBoYXZlIGFsbCBjb25zdHJ1Y3RvcnMgZXZlbnR1YWxseSByZWRpcmVjdCB0byBhIG5vbi1yZWRpcmVjdGluZyBjb25zdHJ1Y3Rvci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ29uc3RydWN0b3JOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ291bGRuJ3QgZmluZCBjb25zdHJ1Y3RvciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnN0cnVjdG9yTm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUNvbnN0cnVjdG9yTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkNvbnN0cnVjdG9yTm90Rm91bmQiLCB0ZW1wbGF0ZUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTlNUUlVDVE9SX05PVF9GT1VORCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdHJ1Y3Rvck5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RydWN0b3JOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiQ291bGRuJ3QgZmluZCBjb25zdHJ1Y3RvciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JOb3RTeW5jID0gbWVzc2FnZUNvbnN0cnVjdG9yTm90U3luYzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3Rvck5vdFN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3Rvck5vdFN5bmMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9TWU5DX0NPTlNUUlVDVE9SIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDb25zdHJ1Y3RvciBib2RpZXMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlID0KICAgIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlIiwKICAgIGluZGV4OiA1NSwKICAgIG1lc3NhZ2U6IHIiIiJDb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIHJldHVybiB0eXBlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgcmV0dXJuIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMgPQogICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZUFyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX05VTUJFUl9PRl9UWVBFX0FSR1VNRU5UU19DT05TVFJVQ1RPUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGNhbid0IGhhdmUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNvbnN0cnVjdG9yIG5hbWUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHRvIHBsYWNlIHRoZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY2xhc3MgbmFtZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnMgPQogICAgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVQYXJhbWV0ZXJzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnMiLAogICAgaW5kZXg6IDk5LAogICAgbWVzc2FnZTogciIiIkNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIHR5cGUgcGFyYW1ldGVycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIHR5cGUgcGFyYW1ldGVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lID0gbWVzc2FnZUNvbnN0cnVjdG9yV2l0aFdyb25nTmFtZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ09OU1RSVUNUT1JfTkFNRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG5hbWUgb2YgYSBjb25zdHJ1Y3RvciBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCIsCiAgICAgICAgdGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dCwKICAgICAgbWVzc2FnZTogIiIiVGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29udGludWVMYWJlbE5vdFRhcmdldCA9IG1lc3NhZ2VDb250aW51ZUxhYmVsTm90VGFyZ2V0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlTGFiZWxOb3RUYXJnZXQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJDb250aW51ZUxhYmVsTm90VGFyZ2V0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9VTkRFRklORUQiXSwKICAgIG1lc3NhZ2U6IHIiIiJUYXJnZXQgb2YgY29udGludWUgbXVzdCBiZSBhIGxhYmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVDb250aW51ZU91dHNpZGVPZkxvb3AgPSBtZXNzYWdlQ29udGludWVPdXRzaWRlT2ZMb29wOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlT3V0c2lkZU9mTG9vcCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkNvbnRpbnVlT3V0c2lkZU9mTG9vcCIsCiAgICBpbmRleDogMiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29udGludWUgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGNvbnRpbnVlIHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBjb250aW51ZSBhdCAnI25hbWUnIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb24iLCB0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9JTl9PVVRFUl9TQ09QRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBjb250aW51ZSBhdCAnJHtuYW1lfScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UgPQogICAgbWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUNvbnRpbnVlV2l0aG91dExhYmVsSW5DYXNlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2UiLAogICAgaW5kZXg6IDY0LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBjb250aW51ZSBzdGF0ZW1lbnQgaW4gYSBzd2l0Y2ggc3RhdGVtZW50IG11c3QgaGF2ZSBhIGxhYmVsIGFzIGEgdGFyZ2V0LiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IGFkZGluZyBhIGxhYmVsIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGNhc2UgY2xhdXNlcyB0byB0aGUgY29udGludWUgc3RhdGVtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ291bGRuJ3QgcGFyc2UgVVJJICcjc3RyaW5nJzoKICAjc3RyaW5nMi4iIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ291bGROb3RQYXJzZVVyaSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUNvdWxkTm90UGFyc2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgIkNvdWxkTm90UGFyc2VVcmkiLAogIHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDb3VsZE5vdFBhcnNlVXJpKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUNvdWxkTm90UGFyc2VVcmksCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IHBhcnNlIFVSSSAnJHtzdHJpbmd9JzoKICAke3N0cmluZzJ9LiIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3N0cmluZzInOiBzdHJpbmcyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUNvdmFyaWFudEFuZFN0YXRpYyA9IG1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlQ292YXJpYW50QW5kU3RhdGljID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiQ292YXJpYW50QW5kU3RhdGljIiwKICAgIGluZGV4OiA2NiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk1lbWJlcnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYm90aCAnY292YXJpYW50JyBhbmQgJ3N0YXRpYycuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvdmFyaWFudCcgb3IgJ3N0YXRpYycga2V5d29yZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlQ292YXJpYW50TWVtYmVyID0gbWVzc2FnZUNvdmFyaWFudE1lbWJlcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VDb3ZhcmlhbnRNZW1iZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgiQ292YXJpYW50TWVtYmVyIiwKICAgIGluZGV4OiA2NywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkdldHRlcnMsIHNldHRlcnMgYW5kIG1ldGhvZHMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2NvdmFyaWFudCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSAnY292YXJpYW50JyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIHN0cmluZyk+IHRlbXBsYXRlQ3ljbGVJblR5cGVWYXJpYWJsZXMgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUeXBlICcjbmFtZScgaXMgYSBib3VuZCBvZiBpdHNlbGYgdmlhICcjc3RyaW5nJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGJyZWFraW5nIHRoZSBjeWNsZSBieSByZW1vdmluZyBhdCBsZWFzdCBvbiBvZiB0aGUgJ2V4dGVuZHMnIGNsYXVzZXMgaW4gdGhlIGN5Y2xlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzQ3ljbGVJblR5cGVWYXJpYWJsZXMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVDeWNsZUluVHlwZVZhcmlhYmxlcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiQ3ljbGVJblR5cGVWYXJpYWJsZXMiLCB0ZW1wbGF0ZUN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9TVVBFUlRZUEVfT0ZfSVRTX0JPVU5EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0N5Y2xlSW5UeXBlVmFyaWFibGVzKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVDeWNsZUluVHlwZVZhcmlhYmxlcywKICAgICAgbWVzc2FnZTogIiIiVHlwZSAnJHtuYW1lfScgaXMgYSBib3VuZCBvZiBpdHNlbGYgdmlhICcke3N0cmluZ30nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGJyZWFraW5nIHRoZSBjeWNsZSBieSByZW1vdmluZyBhdCBsZWFzdCBvbiBvZiB0aGUgJ2V4dGVuZHMnIGNsYXVzZXMgaW4gdGhlIGN5Y2xlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGEgc3VwZXJ0eXBlIG9mIGl0c2VsZi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDeWNsaWNDbGFzc0hpZXJhcmNoeSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlQ3ljbGljQ2xhc3NIaWVyYXJjaHkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkN5Y2xpY0NsYXNzSGllcmFyY2h5IiwgdGVtcGxhdGVDeWNsaWNDbGFzc0hpZXJhcmNoeSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVDVVJTSVZFX0lOVEVSRkFDRV9JTkhFUklUQU5DRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNDeWNsaWNDbGFzc0hpZXJhcmNoeShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xpY0NsYXNzSGllcmFyY2h5LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgYSBzdXBlcnR5cGUgb2YgaXRzZWxmLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkN5Y2xpYyBkZWZpbml0aW9uIG9mIGZhY3RvcnkgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyIsCiAgICAgICAgdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFQ1VSU0lWRV9GQUNUT1JZX1JFRElSRUNUIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywKICAgICAgbWVzc2FnZTogIiIiQ3ljbGljIGRlZmluaXRpb24gb2YgZmFjdG9yeSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlQ3ljbGljVHlwZWRlZiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIHR5cGVkZWYgJyNuYW1lJyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0N5Y2xpY1R5cGVkZWYpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUN5Y2xpY1R5cGVkZWYgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkN5Y2xpY1R5cGVkZWYiLCB0ZW1wbGF0ZUN5Y2xpY1R5cGVkZWYsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfQUxJQVNfQ0FOTk9UX1JFRkVSRU5DRV9JVFNFTEYiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzQ3ljbGljVHlwZWRlZihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUN5Y2xpY1R5cGVkZWYsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlZGVmICcke25hbWV9JyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVEZWJ1Z1RyYWNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJGYXRhbCAnI25hbWUnIGF0Ogojc3RyaW5nIiIiLCB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RlYnVnVHJhY2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4gY29kZURlYnVnVHJhY2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkRlYnVnVHJhY2UiLCB0ZW1wbGF0ZURlYnVnVHJhY2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RlYnVnVHJhY2UoU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZURlYnVnVHJhY2UsIG1lc3NhZ2U6ICIiIkZhdGFsICcke25hbWV9JyBhdDoKJHtzdHJpbmd9IiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICdzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyID0KICAgIG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXIiLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJERUNMQVJFRF9NRU1CRVJfQ09ORkxJQ1RTX1dJVEhfSU5IRVJJVEVEIl0sCiAgICAgICAgbWVzc2FnZToKICAgICAgICAgICAgciIiIkNhbid0IGRlY2xhcmUgYSBtZW1iZXIgdGhhdCBjb25mbGljdHMgd2l0aCBhbiBpbmhlcml0ZWQgb25lLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZSA9CiAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2U7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkRlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgICAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgaW5oZXJpdGVkIG1lbWJlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRGVmYXVsdExpc3RDb25zdHJ1Y3RvckVycm9yID0KICAgIG1lc3NhZ2VEZWZhdWx0TGlzdENvbnN0cnVjdG9yRXJyb3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGVmYXVsdExpc3RDb25zdHJ1Y3RvckVycm9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRGVmYXVsdExpc3RDb25zdHJ1Y3RvckVycm9yIiwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCB1c2UgdGhlIGRlZmF1bHQgTGlzdCBjb25zdHJ1Y3Rvci4iIiIsCiAgICB0aXA6IHIiIiJUcnkgdXNpbmcgTGlzdC5maWxsZWQgaW5zdGVhZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRGVmYXVsdExpc3RDb25zdHJ1Y3Rvcldhcm5pbmcgPQogICAgbWVzc2FnZURlZmF1bHRMaXN0Q29uc3RydWN0b3JXYXJuaW5nOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZURlZmF1bHRMaXN0Q29uc3RydWN0b3JXYXJuaW5nID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRGVmYXVsdExpc3RDb25zdHJ1Y3Rvcldhcm5pbmciLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcsCiAgICBtZXNzYWdlOiByIiIiVXNpbmcgdGhlIGRlZmF1bHQgTGlzdCBjb25zdHJ1Y3Rvci4iIiIsCiAgICB0aXA6IHIiIiJUcnkgdXNpbmcgTGlzdC5maWxsZWQgaW5zdGVhZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGhlcmUgYmVjYXVzZSBhbnkgZGVmYXVsdCB2YWx1ZXMgb2YgJyNuYW1lJyB3b3VsZCBiZSB1c2VkIGluc3RlYWQuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0RlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIiwKICAgICAgICB0ZW1wbGF0ZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bCiAgICAgICJERUZBVUxUX1ZBTFVFX0lOX1JFRElSRUNUSU5HX0ZBQ1RPUllfQ09OU1RSVUNUT1IiCiAgICBdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGhlcmUgYmVjYXVzZSBhbnkgZGVmYXVsdCB2YWx1ZXMgb2YgJyR7bmFtZX0nIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZURlZmVycmVkQWZ0ZXJQcmVmaXggPSBtZXNzYWdlRGVmZXJyZWRBZnRlclByZWZpeDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VEZWZlcnJlZEFmdGVyUHJlZml4ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRGVmZXJyZWRBZnRlclByZWZpeCIsCiAgICBpbmRleDogNjgsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgZGVmZXJyZWQga2V5d29yZCBzaG91bGQgY29tZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWZpeCAoJ2FzJyBjbGF1c2UpLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGRlZmVycmVkIGtleXdvcmQgYmVmb3JlIHRoZSBwcmVmaXguIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRGVmZXJyZWRFeHRlbnNpb25JbXBvcnQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkV4dGVuc2lvbiAnI25hbWUnIGNhbm5vdCBiZSBpbXBvcnRlZCB0aHJvdWdoIGEgZGVmZXJyZWQgaW1wb3J0LiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFkZGluZyB0aGUgYGhpZGUgI25hbWVgIHRvIHRoZSBpbXBvcnQuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEZWZlcnJlZEV4dGVuc2lvbkltcG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRGVmZXJyZWRFeHRlbnNpb25JbXBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkRlZmVycmVkRXh0ZW5zaW9uSW1wb3J0IiwKICB0ZW1wbGF0ZURlZmVycmVkRXh0ZW5zaW9uSW1wb3J0LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RlZmVycmVkRXh0ZW5zaW9uSW1wb3J0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmZXJyZWRFeHRlbnNpb25JbXBvcnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJFeHRlbnNpb24gJyR7bmFtZX0nIGNhbm5vdCBiZSBpbXBvcnRlZCB0aHJvdWdoIGEgZGVmZXJyZWQgaW1wb3J0LiIiIiwKICAgICAgdGlwOiAiIiJUcnkgYWRkaW5nIHRoZSBgaGlkZSAke25hbWV9YCB0byB0aGUgaW1wb3J0LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCB1c2UgdGhlIG5hbWUgJyNuYW1lJyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQiLCB0ZW1wbGF0ZURlZmVycmVkUHJlZml4RHVwbGljYXRlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU0hBUkVEX0RFRkVSUkVEX1BSRUZJWCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgdGhlIG5hbWUgJyR7bmFtZX0nIGZvciBhIGRlZmVycmVkIGxpYnJhcnksIGFzIHRoZSBuYW1lIGlzIHVzZWQgZWxzZXdoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyB1c2VkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZURlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZSIsIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0RlZmVycmVkUHJlZml4RHVwbGljYXRlZENhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyB1c2VkIGhlcmUuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKT4KICAgIHRlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJJbmRleGVkICNjb3VudCBsaWJyYXJpZXMgKCNjb3VudDIgYnl0ZXMpIGluICNudW0xJS4zbXMsIHRoYXQgaXMsCiNudW0yJTEyLjMgYnl0ZXMvbXMsIGFuZAojbnVtMyUxMi4zIG1zL2xpYnJhcmllcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEaWxsT3V0bGluZVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlRGlsbE91dGxpbmVTdW1tYXJ5ID0gY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKT4oCiAgIkRpbGxPdXRsaW5lU3VtbWFyeSIsCiAgdGVtcGxhdGVEaWxsT3V0bGluZVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRGlsbE91dGxpbmVTdW1tYXJ5KAogICAgaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKGNvdW50MiA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIGlmIChfbnVtMSA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMSA9IF9udW0xLnRvU3RyaW5nQXNGaXhlZCgzKTsKICBpZiAoX251bTIgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTIgPSBfbnVtMi50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgaWYgKF9udW0zID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0zID0gX251bTMudG9TdHJpbmdBc0ZpeGVkKDMpLnBhZExlZnQoMTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRGlsbE91dGxpbmVTdW1tYXJ5LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiSW5kZXhlZCAke2NvdW50fSBsaWJyYXJpZXMgKCR7Y291bnQyfSBieXRlcykgaW4gJHtudW0xfW1zLCB0aGF0IGlzLAoke251bTJ9IGJ5dGVzL21zLCBhbmQKJHtudW0zfSBtcy9saWJyYXJpZXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnY291bnQnOiBjb3VudCwKICAgICAgICAnY291bnQyJzogY291bnQyLAogICAgICAgICdudW0xJzogX251bTEsCiAgICAgICAgJ251bTInOiBfbnVtMiwKICAgICAgICAnbnVtMyc6IF9udW0zCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZURpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVHlwZSAnI25hbWUnIGNhbid0IHVzZSBpdHNlbGYgYXMgYSBib3VuZC4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGJyZWFraW5nIHRoZSBjeWNsZSBieSByZW1vdmluZyBhdCBsZWFzdCBvbiBvZiB0aGUgJ2V4dGVuZHMnIGNsYXVzZXMgaW4gdGhlIGN5Y2xlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZURpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcyIsIHRlbXBsYXRlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfUEFSQU1FVEVSX1NVUEVSVFlQRV9PRl9JVFNfQk9VTkQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXMoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcywKICAgICAgbWVzc2FnZTogIiIiVHlwZSAnJHtuYW1lfScgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGJyZWFraW5nIHRoZSBjeWNsZSBieSByZW1vdmluZyBhdCBsZWFzdCBvbiBvZiB0aGUgJ2V4dGVuZHMnIGNsYXVzZXMgaW4gdGhlIGN5Y2xlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb24gPQogICAgbWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkRpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb24iLAogICAgaW5kZXg6IDY5LAogICAgbWVzc2FnZTogciIiIkRpcmVjdGl2ZXMgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBkZWNsYXJhdGlvbnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgZGlyZWN0aXZlIGJlZm9yZSBhbnkgZGVjbGFyYXRpb25zLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVEdXBsaWNhdGVEZWZlcnJlZCA9IG1lc3NhZ2VEdXBsaWNhdGVEZWZlcnJlZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VEdXBsaWNhdGVEZWZlcnJlZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkR1cGxpY2F0ZURlZmVycmVkIiwKICAgIGluZGV4OiA3MSwKICAgIG1lc3NhZ2U6IHIiIiJBbiBpbXBvcnQgZGlyZWN0aXZlIGNhbiBvbmx5IGhhdmUgb25lICdkZWZlcnJlZCcga2V5d29yZC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgJ2RlZmVycmVkJyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIGxhYmVsICcjbmFtZScgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGNob29zaW5nIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgbGFiZWwuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudCIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50LAogICAgICAgIGluZGV4OiA3Mik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbGFiZWwgJyR7bmFtZX0nIHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzd2l0Y2ggc3RhdGVtZW50LiIiIiwKICAgICAgdGlwOiAiIiJUcnkgY2hvb3NpbmcgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhpcyBsYWJlbC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVEdXBsaWNhdGVQcmVmaXggPSBtZXNzYWdlRHVwbGljYXRlUHJlZml4OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUR1cGxpY2F0ZVByZWZpeCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJEdXBsaWNhdGVQcmVmaXgiLAogICAgaW5kZXg6IDczLAogICAgbWVzc2FnZTogciIiIkFuIGltcG9ydCBkaXJlY3RpdmUgY2FuIG9ubHkgaGF2ZSBvbmUgcHJlZml4ICgnYXMnIGNsYXVzZSkuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIHByZWZpeC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGFscmVhZHkgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZERlY2xhcmF0aW9uIiwgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRVUExJQ0FURV9ERUZJTklUSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGFscmVhZHkgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlByZXZpb3VzIGRlY2xhcmF0aW9uIG9mICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZSIsIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIlByZXZpb3VzIGRlY2xhcmF0aW9uIG9mICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnI25hbWUnIGlzIGltcGxpZWQgYnkgdGhpcyBkZWZpbml0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UiLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnJHtuYW1lfScgaXMgaW1wbGllZCBieSB0aGlzIGRlZmluaXRpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCB1c2UgJyNuYW1lJyBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UiLAogIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvblVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZSwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgdXNlICcke25hbWV9JyBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkRXhwb3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUR1cGxpY2F0ZWRFeHBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRFeHBvcnQiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFNQklHVU9VU19FWFBPUlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydChTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZEV4cG9ydCwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnJHt1cml9JyBhbmQgJyR7dXJpMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBpcyBleHBvcnRlZCBmcm9tIGJvdGggJyN1cmknIGFuZCAnI3VyaTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRFeHBvcnRJblR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICJEdXBsaWNhdGVkRXhwb3J0SW5UeXBlIiwKICB0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnRJblR5cGUsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydEluVHlwZShTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZEV4cG9ydEluVHlwZSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnJHt1cml9JyBhbmQgJyR7dXJpMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZEltcG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiJyNuYW1lJyBpcyBpbXBvcnRlZCBmcm9tIGJvdGggJyN1cmknIGFuZCAnI3VyaTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVEdXBsaWNhdGVkSW1wb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJEdXBsaWNhdGVkSW1wb3J0IiwgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkSW1wb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkSW1wb3J0LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcke3VyaX0nIGFuZCAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkSW1wb3J0SW5UeXBlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGltcG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydEluVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRJbXBvcnRJblR5cGUiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFNQklHVU9VU19JTVBPUlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydEluVHlwZShTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZEltcG9ydEluVHlwZSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGltcG9ydGVkIGZyb20gYm90aCAnJHt1cml9JyBhbmQgJyR7dXJpMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQSBsaWJyYXJ5IHdpdGggbmFtZSAnI25hbWUnIGlzIGV4cG9ydGVkIG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZExpYnJhcnlFeHBvcnQiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBPUlRfRFVQTElDQVRFRF9MSUJSQVJZX05BTUVEIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnQsCiAgICAgIG1lc3NhZ2U6ICIiIkEgbGlicmFyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGlzIGV4cG9ydGVkIG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXMgYWxzbyBleHBvcnRlZCBoZXJlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQiLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBhbHNvIGV4cG9ydGVkIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkEgbGlicmFyeSB3aXRoIG5hbWUgJyNuYW1lJyBpcyBpbXBvcnRlZCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUltcG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0IiwgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FRCJdLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUltcG9ydChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0LAogICAgICBtZXNzYWdlOiAiIiJBIGxpYnJhcnkgd2l0aCBuYW1lICcke25hbWV9JyBpcyBpbXBvcnRlZCBtb3JlIHRoYW4gb25jZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGFsc28gaW1wb3J0ZWQgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0IiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0LAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgYWxzbyBpbXBvcnRlZCBoZXJlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVGhlIG1vZGlmaWVyICcjbGV4ZW1lJyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOgogICAgICAgICAgICByIiIiVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9jY3VycmVuY2Ugb2YgdGhlIG1vZGlmaWVyLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRNb2RpZmllcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlRHVwbGljYXRlZE1vZGlmaWVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJEdXBsaWNhdGVkTW9kaWZpZXIiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllciwKICAgICAgICBpbmRleDogNzApOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRNb2RpZmllcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTW9kaWZpZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBtb2RpZmllciAnJHtsZXhlbWV9JyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuIiIiLAogICAgICB0aXA6ICIiIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBtb2RpZmllci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2FuJ3QgZGVjbGFyZSAnI25hbWUnIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHNjb3BlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCIsIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVGRVJFTkNFRF9CRUZPUkVfREVDTEFSQVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBkZWNsYXJlICcke25hbWV9JyBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBzY29wZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJQcmV2aW91cyB1c2Ugb2YgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZSwKICAgICAgbWVzc2FnZTogIiIiUHJldmlvdXMgdXNlIG9mICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWROYW1lZEFyZ3VtZW50KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRHVwbGljYXRlZE5hbWVkQXJndW1lbnQiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJEVVBMSUNBVEVfTkFNRURfQVJHVU1FTlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVkQXJndW1lbnQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudCwKICAgICAgbWVzc2FnZTogIiIiRHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWUgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkR1cGxpY2F0ZWQgcGFyYW1ldGVyIG5hbWUgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRHVwbGljYXRlZFBhcmFtZXRlck5hbWUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lIiwgdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRFVQTElDQVRFX0RFRklOSVRJT04iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRHVwbGljYXRlZFBhcmFtZXRlck5hbWUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZSwKICAgICAgbWVzc2FnZTogIiIiRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIk90aGVyIHBhcmFtZXRlciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UiLCB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlLAogICAgICBtZXNzYWdlOiAiIiJPdGhlciBwYXJhbWV0ZXIgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0ID0gbWVzc2FnZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVtcHR5TmFtZWRQYXJhbWV0ZXJMaXN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRW1wdHlOYW1lZFBhcmFtZXRlckxpc3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZTogciIiIk5hbWVkIHBhcmFtZXRlciBsaXN0cyBjYW5ub3QgYmUgZW1wdHkuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIG5hbWVkIHBhcmFtZXRlciB0byB0aGUgbGlzdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3QgPQogICAgbWVzc2FnZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVtcHR5T3B0aW9uYWxQYXJhbWV0ZXJMaXN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZTogciIiIk9wdGlvbmFsIHBhcmFtZXRlciBsaXN0cyBjYW5ub3QgYmUgZW1wdHkuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gdGhlIGxpc3QuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUVuY29kaW5nID0gbWVzc2FnZUVuY29kaW5nOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUVuY29kaW5nID0gY29uc3QgTWVzc2FnZUNvZGUoIkVuY29kaW5nIiwKICAgIG1lc3NhZ2U6IHIiIiJVbmFibGUgdG8gZGVjb2RlIGJ5dGVzIGFzIFVURi04LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk5hbWUgb2YgZW51bSBjb25zdGFudCAnI25hbWUnIGNhbid0IGJlIHRoZSBzYW1lIGFzIHRoZSBlbnVtJ3Mgb3duIG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KCJFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nIiwKICAgICAgICB0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVOVU1fQ09OU1RBTlRfV0lUSF9FTlVNX05BTUUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJOYW1lIG9mIGVudW0gY29uc3RhbnQgJyR7bmFtZX0nIGNhbid0IGJlIHRoZSBzYW1lIGFzIHRoZSBlbnVtJ3Mgb3duIG5hbWUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW51bURlY2xhcmF0aW9uRW1wdHkgPSBtZXNzYWdlRW51bURlY2xhcmF0aW9uRW1wdHk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW51bURlY2xhcmF0aW9uRW1wdHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFbnVtRGVjbGFyYXRpb25FbXB0eSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRU1QVFlfRU5VTV9CT0RZIl0sCiAgICBtZXNzYWdlOiByIiIiQW4gZW51bSBkZWNsYXJhdGlvbiBjYW4ndCBiZSBlbXB0eS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW51bUluQ2xhc3MgPSBtZXNzYWdlRW51bUluQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW51bUluQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgiRW51bUluQ2xhc3MiLAogICAgaW5kZXg6IDc0LAogICAgbWVzc2FnZTogciIiIkVudW1zIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBjbGFzc2VzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGVudW0gdG8gdGhlIHRvcC1sZXZlbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRW51bUluc3RhbnRpYXRpb24gPSBtZXNzYWdlRW51bUluc3RhbnRpYXRpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRW51bUluc3RhbnRpYXRpb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFbnVtSW5zdGFudGlhdGlvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5TVEFOVElBVEVfRU5VTSJdLAogICAgbWVzc2FnZTogciIiIkVudW1zIGNhbid0IGJlIGluc3RhbnRpYXRlZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZCA9CiAgICBtZXNzYWdlRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFcXVhbGl0eUNhbm5vdEJlRXF1YWxpdHlPcGVyYW5kID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZCIsCiAgICBpbmRleDogMSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgY29tcGFyaXNvbiBleHByZXNzaW9uIGNhbid0IGJlIGFuIG9wZXJhbmQgb2YgYW5vdGhlciBjb21wYXJpc29uIGV4cHJlc3Npb24uIiIiLAogICAgdGlwOiByIiIiVHJ5IHB1dHRpbmcgcGFyZW50aGVzZXMgYXJvdW5kIG9uZSBvZiB0aGUgY29tcGFyaXNvbnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCAnI3N0cmluZycgYWZ0ZXIgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEFmdGVyQnV0R290KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUV4cGVjdGVkQWZ0ZXJCdXRHb3QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRBZnRlckJ1dEdvdCIsIHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRBZnRlckJ1dEdvdChTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkQWZ0ZXJCdXRHb3QsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICcke3N0cmluZ30nIGFmdGVyIHRoaXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkQW5Jbml0aWFsaXplciA9IG1lc3NhZ2VFeHBlY3RlZEFuSW5pdGlhbGl6ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWRBbkluaXRpYWxpemVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRBbkluaXRpYWxpemVyIiwKICAgIGluZGV4OiAzNiwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhbiBpbml0aWFsaXplci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRCbG9jayA9IG1lc3NhZ2VFeHBlY3RlZEJsb2NrOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkQmxvY2sgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRCbG9jayIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhIGJsb2NrLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcge30uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkQmxvY2tUb1NraXAgPSBtZXNzYWdlRXhwZWN0ZWRCbG9ja1RvU2tpcDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRCbG9ja1RvU2tpcCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19GVU5DVElPTl9CT0RZIl0sCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBmdW5jdGlvbiBib2R5IG9yICc9PicuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyB7fS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRCb2R5ID0gbWVzc2FnZUV4cGVjdGVkQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEJvZHkgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRCb2R5IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX0JPRFkiXSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHkgb3IgJz0+Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIHt9LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiB0ZW1wbGF0ZUV4cGVjdGVkQnV0R290ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkV4cGVjdGVkICcjc3RyaW5nJyBiZWZvcmUgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEJ1dEdvdCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVFeHBlY3RlZEJ1dEdvdCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJFeHBlY3RlZEJ1dEdvdCIsIHRlbXBsYXRlRXhwZWN0ZWRCdXRHb3QsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RPS0VOIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQnV0R290KFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRCdXRHb3QsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICcke3N0cmluZ30nIGJlZm9yZSB0aGlzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVFeHBlY3RlZENsYXNzTWVtYmVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGNsYXNzIG1lbWJlciwgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc01lbWJlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlRXhwZWN0ZWRDbGFzc01lbWJlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRDbGFzc01lbWJlciIsIHRlbXBsYXRlRXhwZWN0ZWRDbGFzc01lbWJlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfQ0xBU1NfTUVNQkVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NNZW1iZXIoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRDbGFzc01lbWJlciwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgYSBjbGFzcyBtZW1iZXIsIGJ1dCBnb3QgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQSAjc3RyaW5nIG11c3QgaGF2ZSBhIGJvZHksIGV2ZW4gaWYgaXQgaXMgZW1wdHkuIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IGFkZGluZyBhbiBlbXB0eSBib2R5LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NPck1peGluQm9keSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5IiwgdGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHksCiAgICAgICAgaW5kZXg6IDgpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkQ2xhc3NPck1peGluQm9keShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keSwKICAgICAgbWVzc2FnZTogIiIiQSAke3N0cmluZ30gbXVzdCBoYXZlIGEgYm9keSwgZXZlbiBpZiBpdCBpcyBlbXB0eS4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGFkZGluZyBhbiBlbXB0eSBib2R5LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGRlY2xhcmF0aW9uLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZERlY2xhcmF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZERlY2xhcmF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZERlY2xhcmF0aW9uIiwgdGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9FWEVDVVRBQkxFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWREZWNsYXJhdGlvbiwKICAgICAgbWVzc2FnZTogIiIiRXhwZWN0ZWQgYSBkZWNsYXJhdGlvbiwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkRWxzZU9yQ29tbWEgPSBtZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEVsc2VPckNvbW1hID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRFbHNlT3JDb21tYSIsCiAgICBpbmRleDogNDYsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgJ2Vsc2UnIG9yIGNvbW1hLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkRW51bUJvZHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGVudW0gYm9keSwgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIkFuIGVudW0gZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSBib2R5IHdpdGggYXQgbGVhc3Qgb25lIGNvbnN0YW50IG5hbWUuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEVudW1Cb2R5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZEVudW1Cb2R5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZEVudW1Cb2R5IiwgdGVtcGxhdGVFeHBlY3RlZEVudW1Cb2R5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0VOVU1fQk9EWSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZEVudW1Cb2R5KFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkRW51bUJvZHksCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgZW51bSBib2R5LCBidXQgZ290ICcke2xleGVtZX0nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiQW4gZW51bSBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGJvZHkgd2l0aCBhdCBsZWFzdCBvbmUgY29uc3RhbnQgbmFtZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIGZ1bmN0aW9uIGJvZHksIGJ1dCBnb3QgJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRnVuY3Rpb25Cb2R5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVFeHBlY3RlZEZ1bmN0aW9uQm9keSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRGdW5jdGlvbkJvZHkiLCB0ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX0JPRFkiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRGdW5jdGlvbkJvZHksCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSwgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkSGV4RGlnaXQgPSBtZXNzYWdlRXhwZWN0ZWRIZXhEaWdpdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZEhleERpZ2l0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWRIZXhEaWdpdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTUlTU0lOR19IRVhfRElHSVQiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGhleCBkaWdpdCAoMC05IG9yIEEtRikgbXVzdCBmb2xsb3cgJzB4Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkSWRlbnRpZmllciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRJZGVudGlmaWVyIiwgdGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRJZGVudGlmaWVyLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVFeHBlY3RlZEluc3RlYWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyNzdHJpbmcnIGluc3RlYWQgb2YgdGhpcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZEluc3RlYWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZWN0ZWRJbnN0ZWFkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkV4cGVjdGVkSW5zdGVhZCIsIHRlbXBsYXRlRXhwZWN0ZWRJbnN0ZWFkLAogICAgICAgIGluZGV4OiA0MSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRJbnN0ZWFkKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRJbnN0ZWFkLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCAnJHtzdHJpbmd9JyBpbnN0ZWFkIG9mIHRoaXMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGVjdGVkTmFtZWRBcmd1bWVudCA9IG1lc3NhZ2VFeHBlY3RlZE5hbWVkQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWROYW1lZEFyZ3VtZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwZWN0ZWROYW1lZEFyZ3VtZW50IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRSQV9QT1NJVElPTkFMX0FSR1VNRU5UUyJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIG5hbWVkIGFyZ3VtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZE9uZUV4cHJlc3Npb24gPSBtZXNzYWdlRXhwZWN0ZWRPbmVFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkT25lRXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4cGVjdGVkT25lRXhwcmVzc2lvbiIsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgb25lIGV4cHJlc3Npb24sIGJ1dCBmb3VuZCBhZGRpdGlvbmFsIGlucHV0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZE9wZW5QYXJlbnMgPSBtZXNzYWdlRXhwZWN0ZWRPcGVuUGFyZW5zOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGVjdGVkT3BlblBhcmVucyA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRPcGVuUGFyZW5zIiwgbWVzc2FnZTogciIiIkV4cGVjdGVkICcoJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwZWN0ZWRTdGF0ZW1lbnQgPSBtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHBlY3RlZFN0YXRlbWVudCIsCiAgICBpbmRleDogMjksCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBzdGF0ZW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkU3RyaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZWN0ZWRTdHJpbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkU3RyaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHBlY3RlZFN0cmluZyIsIHRlbXBsYXRlRXhwZWN0ZWRTdHJpbmcsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1NUUklOR19MSVRFUkFMIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGVjdGVkU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkU3RyaW5nLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnJHtsZXhlbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IHRlbXBsYXRlRXhwZWN0ZWRUb2tlbiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCB0byBmaW5kICcjc3RyaW5nJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZFRva2VuKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUV4cGVjdGVkVG9rZW4gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZWN0ZWRUb2tlbiIsIHRlbXBsYXRlRXhwZWN0ZWRUb2tlbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQRUNURURfVE9LRU4iXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZWN0ZWRUb2tlbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4cGVjdGVkVG9rZW4sCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkIHRvIGZpbmQgJyR7c3RyaW5nfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4cGVjdGVkVHlwZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgYSB0eXBlLCBidXQgZ290ICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZUV4cGVjdGVkVHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICAiRXhwZWN0ZWRUeXBlIiwgdGVtcGxhdGVFeHBlY3RlZFR5cGUsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RZUEVfTkFNRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGUoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwZWN0ZWRUeXBlLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCBhIHR5cGUsIGJ1dCBnb3QgJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHBlY3RlZFVyaSA9IG1lc3NhZ2VFeHBlY3RlZFVyaTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBlY3RlZFVyaSA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiRXhwZWN0ZWRVcmkiLCBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYSBVUkkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nKT4gdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGlzIHJlcXVpcmVzIHRoZSAnI3N0cmluZycgZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgZW5hYmxpbmcgdGhpcyBleHBlcmltZW50IGJ5IGFkZGluZyBpdCB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY29tcGlsaW5nIGFuZCBydW5uaW5nLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlRXhwZXJpbWVudE5vdEVuYWJsZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiRXhwZXJpbWVudE5vdEVuYWJsZWQiLCB0ZW1wbGF0ZUV4cGVyaW1lbnROb3RFbmFibGVkLAogICAgICAgIGluZGV4OiA0OCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBlcmltZW50Tm90RW5hYmxlZCwKICAgICAgbWVzc2FnZTogIiIiVGhpcyByZXF1aXJlcyB0aGUgJyR7c3RyaW5nfScgZXhwZXJpbWVudCB0byBiZSBlbmFibGVkLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGVuYWJsaW5nIHRoaXMgZXhwZXJpbWVudCBieSBhZGRpbmcgaXQgdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNvbXBpbGluZyBhbmQgcnVubmluZy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwbGljaXRFeHRlbnNpb25Bcmd1bWVudE1pc21hdGNoID0KICAgIG1lc3NhZ2VFeHBsaWNpdEV4dGVuc2lvbkFyZ3VtZW50TWlzbWF0Y2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwbGljaXRFeHRlbnNpb25Bcmd1bWVudE1pc21hdGNoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwbGljaXRFeHRlbnNpb25Bcmd1bWVudE1pc21hdGNoIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkV4cGxpY2l0IGV4dGVuc2lvbiBhcHBsaWNhdGlvbiByZXF1aXJlcyBleGFjdGx5IDEgcG9zaXRpb25hbCBhcmd1bWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwbGljaXRFeHRlbnNpb25Bc0V4cHJlc3Npb24gPQogICAgbWVzc2FnZUV4cGxpY2l0RXh0ZW5zaW9uQXNFeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4cGxpY2l0RXh0ZW5zaW9uQXNFeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXhwbGljaXRFeHRlbnNpb25Bc0V4cHJlc3Npb24iLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRXhwbGljaXQgZXh0ZW5zaW9uIGFwcGxpY2F0aW9uIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4cGxpY2l0RXh0ZW5zaW9uQXNMdmFsdWUgPQogICAgbWVzc2FnZUV4cGxpY2l0RXh0ZW5zaW9uQXNMdmFsdWU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXhwbGljaXRFeHRlbnNpb25Bc0x2YWx1ZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4cGxpY2l0RXh0ZW5zaW9uQXNMdmFsdWUiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRXhwbGljaXQgZXh0ZW5zaW9uIGFwcGxpY2F0aW9uIGNhbm5vdCBiZSBhIHRhcmdldCBmb3IgYXNzaWdubWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIGludAogICAgICAgICAgICBjb3VudCk+IHRlbXBsYXRlRXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBjb3VudCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJFeHBsaWNpdCBleHRlbnNpb24gYXBwbGljYXRpb24gb2YgZXh0ZW5zaW9uICcjbmFtZScgdGFrZXMgJyNjb3VudCcgdHlwZSBhcmd1bWVudChzKS4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50TWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPgogICAgY29kZUV4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50TWlzbWF0Y2ggPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPigKICAiRXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRNaXNtYXRjaCIsCiAgdGVtcGxhdGVFeHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudE1pc21hdGNoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50TWlzbWF0Y2goCiAgICBTdHJpbmcgbmFtZSwgaW50IGNvdW50KSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChjb3VudCA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkV4cGxpY2l0IGV4dGVuc2lvbiBhcHBsaWNhdGlvbiBvZiBleHRlbnNpb24gJyR7bmFtZX0nIHRha2VzICcke2NvdW50fScgdHlwZSBhcmd1bWVudChzKS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ2NvdW50JzogY291bnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwb3J0QWZ0ZXJQYXJ0ID0gbWVzc2FnZUV4cG9ydEFmdGVyUGFydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHBvcnRBZnRlclBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXhwb3J0QWZ0ZXJQYXJ0IiwKICAgIGluZGV4OiA3NSwKICAgIG1lc3NhZ2U6IHIiIiJFeHBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGV4cG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkV4cG9ydCBvZiAnI25hbWUnIChmcm9tICcjdXJpJykgaGlkZXMgZXhwb3J0IGZyb20gJyN1cmkyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHBvcnRIaWRlc0V4cG9ydCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPgogICAgY29kZUV4cG9ydEhpZGVzRXhwb3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+KAogICAgICAgICJFeHBvcnRIaWRlc0V4cG9ydCIsIHRlbXBsYXRlRXhwb3J0SGlkZXNFeHBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4cG9ydEhpZGVzRXhwb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHBvcnRIaWRlc0V4cG9ydCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkV4cG9ydCBvZiAnJHtuYW1lfScgKGZyb20gJyR7dXJpfScpIGhpZGVzIGV4cG9ydCBmcm9tICcke3VyaTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXhwcmVzc2lvbk5vdE1ldGFkYXRhID0gbWVzc2FnZUV4cHJlc3Npb25Ob3RNZXRhZGF0YTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHByZXNzaW9uTm90TWV0YWRhdGEgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHByZXNzaW9uTm90TWV0YWRhdGEiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhpcyBjYW4ndCBiZSB1c2VkIGFzIG1ldGFkYXRhOyBtZXRhZGF0YSBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBjb21waWxlLXRpbWUgY29uc3RhbnQgdmFyaWFibGUsIG9yIGEgY2FsbCB0byBhIGNvbnN0YW50IGNvbnN0cnVjdG9yLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVFeHRlbmRpbmdFbnVtID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ0VudW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUV4dGVuZGluZ0VudW0gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkV4dGVuZGluZ0VudW0iLCB0ZW1wbGF0ZUV4dGVuZGluZ0VudW0sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVEVORFNfRU5VTSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNFeHRlbmRpbmdFbnVtKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRXh0ZW5kaW5nRW51bSwKICAgICAgbWVzc2FnZTogIiIiJyR7bmFtZX0nIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUV4dGVuZGluZ1Jlc3RyaWN0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIicjbmFtZScgaXMgcmVzdHJpY3RlZCBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRXh0ZW5kaW5nUmVzdHJpY3RlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRXh0ZW5kaW5nUmVzdHJpY3RlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRXh0ZW5kaW5nUmVzdHJpY3RlZCIsIHRlbXBsYXRlRXh0ZW5kaW5nUmVzdHJpY3RlZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhURU5EU19ESVNBTExPV0VEX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ1Jlc3RyaWN0ZWQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHRlbmRpbmdSZXN0cmljdGVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGlzIHJlc3RyaWN0ZWQgYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVuZHNGdXR1cmVPciA9IG1lc3NhZ2VFeHRlbmRzRnV0dXJlT3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZW5kc0Z1dHVyZU9yID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVuZHNGdXR1cmVPciIsCiAgICBtZXNzYWdlOiByIiIiVGhlIHR5cGUgJ0Z1dHVyZU9yJyBjYW4ndCBiZSB1c2VkIGluIGFuICdleHRlbmRzJyBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVuZHNOZXZlciA9IG1lc3NhZ2VFeHRlbmRzTmV2ZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRXh0ZW5kc05ldmVyID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVuZHNOZXZlciIsCiAgICBtZXNzYWdlOiByIiIiVGhlIHR5cGUgJ05ldmVyJyBjYW4ndCBiZSB1c2VkIGluIGFuICdleHRlbmRzJyBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVuZHNWb2lkID0gbWVzc2FnZUV4dGVuZHNWb2lkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVuZHNWb2lkID0gY29uc3QgTWVzc2FnZUNvZGUoIkV4dGVuZHNWb2lkIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgdHlwZSAndm9pZCcgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnZXh0ZW5kcycgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlbnNpb25EZWNsYXJlc0Fic3RyYWN0TWVtYmVyID0KICAgIG1lc3NhZ2VFeHRlbnNpb25EZWNsYXJlc0Fic3RyYWN0TWVtYmVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVuc2lvbkRlY2xhcmVzQWJzdHJhY3RNZW1iZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHRlbnNpb25EZWNsYXJlc0Fic3RyYWN0TWVtYmVyIiwKICAgIGluZGV4OiA5NCwKICAgIG1lc3NhZ2U6IHIiIiJFeHRlbnNpb25zIGNhbid0IGRlY2xhcmUgYWJzdHJhY3QgbWVtYmVycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcHJvdmlkaW5nIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWVtYmVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlbnNpb25EZWNsYXJlc0NvbnN0cnVjdG9yID0KICAgIG1lc3NhZ2VFeHRlbnNpb25EZWNsYXJlc0NvbnN0cnVjdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVuc2lvbkRlY2xhcmVzQ29uc3RydWN0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHRlbnNpb25EZWNsYXJlc0NvbnN0cnVjdG9yIiwKICAgIGluZGV4OiA5MiwKICAgIG1lc3NhZ2U6IHIiIiJFeHRlbnNpb25zIGNhbid0IGRlY2xhcmUgY29uc3RydWN0b3JzLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVuc2lvbkRlY2xhcmVzSW5zdGFuY2VGaWVsZCA9CiAgICBtZXNzYWdlRXh0ZW5zaW9uRGVjbGFyZXNJbnN0YW5jZUZpZWxkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVuc2lvbkRlY2xhcmVzSW5zdGFuY2VGaWVsZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVuc2lvbkRlY2xhcmVzSW5zdGFuY2VGaWVsZCIsCiAgICBpbmRleDogOTMsCiAgICBtZXNzYWdlOiByIiIiRXh0ZW5zaW9ucyBjYW4ndCBkZWNsYXJlIGluc3RhbmNlIGZpZWxkcyIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgZmllbGQgZGVjbGFyYXRpb24gb3IgbWFraW5nIGl0IGEgc3RhdGljIGZpZWxkIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGlzIGV4dGVuc2lvbiBtZW1iZXIgY29uZmxpY3RzIHdpdGggT2JqZWN0IG1lbWJlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4dGVuc2lvbk1lbWJlckNvbmZsaWN0c1dpdGhPYmplY3RNZW1iZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyIiwKICB0ZW1wbGF0ZUV4dGVuc2lvbk1lbWJlckNvbmZsaWN0c1dpdGhPYmplY3RNZW1iZXIsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRXh0ZW5zaW9uTWVtYmVyQ29uZmxpY3RzV2l0aE9iamVjdE1lbWJlcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4dGVuc2lvbk1lbWJlckNvbmZsaWN0c1dpdGhPYmplY3RNZW1iZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGlzIGV4dGVuc2lvbiBtZW1iZXIgY29uZmxpY3RzIHdpdGggT2JqZWN0IG1lbWJlciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxDbGFzcyA9IG1lc3NhZ2VFeHRlcm5hbENsYXNzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXh0ZXJuYWxDbGFzcyIsCiAgICBpbmRleDogMywKICAgIG1lc3NhZ2U6IHIiIiJDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdleHRlcm5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keSA9CiAgICBtZXNzYWdlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhCb2R5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keSIsCiAgICBpbmRleDogODcsCiAgICBtZXNzYWdlOiByIiIiRXh0ZXJuYWwgY29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSBib2R5LiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSBib2R5IG9mIHRoZSBjb25zdHJ1Y3Rvciwgb3IgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVycyA9CiAgICBtZXNzYWdlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzIiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhURVJOQUxfQ09OU1RSVUNUT1JfV0lUSF9GSUVMRF9JTklUSUFMSVpFUlMiXSwKICAgICAgICBtZXNzYWdlOiByIiIiQW4gZXh0ZXJuYWwgY29uc3RydWN0b3IgY2FuJ3QgaW5pdGlhbGl6ZSBmaWVsZHMuIiIiLAogICAgICAgIHRpcDoKICAgICAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgZmllbGQgaW5pdGlhbGl6ZXJzLCBvciByZW1vdmluZyB0aGUga2V5d29yZCAnZXh0ZXJuYWwnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbEVudW0gPSBtZXNzYWdlRXh0ZXJuYWxFbnVtOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsRW51bSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJFeHRlcm5hbEVudW0iLAogICAgaW5kZXg6IDUsCiAgICBtZXNzYWdlOiByIiIiRW51bXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxGYWN0b3J5UmVkaXJlY3Rpb24gPQogICAgbWVzc2FnZUV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXh0ZXJuYWxGYWN0b3J5UmVkaXJlY3Rpb24iLAogICAgaW5kZXg6IDg1LAogICAgbWVzc2FnZTogciIiIkEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjYW4ndCBiZSBleHRlcm5hbC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlICdleHRlcm5hbCcgbW9kaWZpZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUV4dGVybmFsRmFjdG9yeVdpdGhCb2R5ID0gbWVzc2FnZUV4dGVybmFsRmFjdG9yeVdpdGhCb2R5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsRmFjdG9yeVdpdGhCb2R5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHkiLAogICAgaW5kZXg6IDg2LAogICAgbWVzc2FnZTogciIiIkV4dGVybmFsIGZhY3RvcmllcyBjYW4ndCBoYXZlIGEgYm9keS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgYm9keSBvZiB0aGUgZmFjdG9yeSwgb3IgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxGaWVsZCA9IG1lc3NhZ2VFeHRlcm5hbEZpZWxkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsRmllbGQgPSBjb25zdCBNZXNzYWdlQ29kZSgiRXh0ZXJuYWxGaWVsZCIsCiAgICBpbmRleDogNTAsCiAgICBtZXNzYWdlOiByIiIiRmllbGRzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdleHRlcm5hbCcuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJywgb3IgcmVwbGFjaW5nIHRoZSBmaWVsZCBieSBhbiBleHRlcm5hbCBnZXR0ZXIgYW5kL29yIHNldHRlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSA9IG1lc3NhZ2VFeHRlcm5hbE1ldGhvZFdpdGhCb2R5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJFeHRlcm5hbE1ldGhvZFdpdGhCb2R5IiwKICAgIGluZGV4OiA0OSwKICAgIG1lc3NhZ2U6IHIiIiJBbiBleHRlcm5hbCBvciBuYXRpdmUgbWV0aG9kIGNhbid0IGhhdmUgYSBib2R5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVFeHRlcm5hbFR5cGVkZWYgPSBtZXNzYWdlRXh0ZXJuYWxUeXBlZGVmOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUV4dGVybmFsVHlwZWRlZiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJFeHRlcm5hbFR5cGVkZWYiLAogICAgaW5kZXg6IDc2LAogICAgbWVzc2FnZTogciIiIlR5cGVkZWZzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdleHRlcm5hbCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ2FuJ3QgaGF2ZSBtb2RpZmllciAnI2xleGVtZScgaGVyZS4iIiIsCiAgICAgICAgdGlwVGVtcGxhdGU6IHIiIiJUcnkgcmVtb3ZpbmcgJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0V4dHJhbmVvdXNNb2RpZmllcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlRXh0cmFuZW91c01vZGlmaWVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJFeHRyYW5lb3VzTW9kaWZpZXIiLCB0ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllciwKICAgICAgICBpbmRleDogNzcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4dHJhbmVvdXNNb2RpZmllcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVFeHRyYW5lb3VzTW9kaWZpZXIsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGhhdmUgbW9kaWZpZXIgJyR7bGV4ZW1lfScgaGVyZS4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+CiAgICB0ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllckluRXh0ZW5zaW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBoYXZlIG1vZGlmaWVyICcjbGV4ZW1lJyBpbiBhbiBleHRlbnNpb24uIiIiLAogICAgICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nICcjbGV4ZW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNFeHRyYW5lb3VzTW9kaWZpZXJJbkV4dGVuc2lvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlRXh0cmFuZW91c01vZGlmaWVySW5FeHRlbnNpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgIkV4dHJhbmVvdXNNb2RpZmllckluRXh0ZW5zaW9uIiwgdGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXJJbkV4dGVuc2lvbiwKICAgICAgICBpbmRleDogOTgpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0V4dHJhbmVvdXNNb2RpZmllckluRXh0ZW5zaW9uKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUV4dHJhbmVvdXNNb2RpZmllckluRXh0ZW5zaW9uLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBoYXZlIG1vZGlmaWVyICcke2xleGVtZX0nIGluIGFuIGV4dGVuc2lvbi4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmFjdG9yeU5vdFN5bmMgPSBtZXNzYWdlRmFjdG9yeU5vdFN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmFjdG9yeU5vdFN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgiRmFjdG9yeU5vdFN5bmMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PTl9TWU5DX0ZBQ1RPUlkiXSwKICAgIG1lc3NhZ2U6IHIiIiJGYWN0b3J5IGJvZGllcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uID0KICAgIG1lc3NhZ2VGYWN0b3J5VG9wTGV2ZWxEZWNsYXJhdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGYWN0b3J5VG9wTGV2ZWxEZWNsYXJhdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uIiwKICAgIGluZGV4OiA3OCwKICAgIG1lc3NhZ2U6IHIiIiJUb3AtbGV2ZWwgZGVjbGFyYXRpb25zIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdmYWN0b3J5Jy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2ZhY3RvcnknLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkV4cGVjdGVkIHZhbHVlIGFmdGVyICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZhc3RhQ0xJQXJndW1lbnRSZXF1aXJlZCIsCiAgdGVtcGxhdGVGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCB2YWx1ZSBhZnRlciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmFzdGFVc2FnZUxvbmcgPSBtZXNzYWdlRmFzdGFVc2FnZUxvbmc7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmFzdGFVc2FnZUxvbmcgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkZhc3RhVXNhZ2VMb25nIiwgbWVzc2FnZTogciIiIlN1cHBvcnRlZCBvcHRpb25zOgoKICAtbyA8ZmlsZT4sIC0tb3V0cHV0PTxmaWxlPgogICAgR2VuZXJhdGUgdGhlIG91dHB1dCBpbnRvIDxmaWxlPi4KCiAgLWgsIC9oLCAvPywgLS1oZWxwCiAgICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC12IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb3B0aW9ucykuCgogIC12LCAtLXZlcmJvc2UKICAgIERpc3BsYXkgdmVyYm9zZSBpbmZvcm1hdGlvbi4KCiAgLURuYW1lCiAgLURuYW1lPXZhbHVlCiAgICBEZWZpbmUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGNvbXBpbGUtdGltZSBlbnZpcm9ubWVudC4KCiAgLS1uby1kZWZpbmVzCiAgICBJZ25vcmUgYWxsIC1EIG9wdGlvbnMgYW5kIGxlYXZlIGVudmlyb25tZW50IGNvbnN0YW50cyB1bmV2YWx1YXRlZC4KCiAgLS0KICAgIFN0b3Agb3B0aW9uIHBhcnNpbmcsIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGxpbmUgaXMgYXNzdW1lZCB0byBiZQogICAgZmlsZSBuYW1lcyBvciBhcmd1bWVudHMgdG8gdGhlIERhcnQgcHJvZ3JhbS4KCiAgLS1wYWNrYWdlcz08ZmlsZT4KICAgIFVzZSBwYWNrYWdlIHJlc29sdXRpb24gY29uZmlndXJhdGlvbiA8ZmlsZT4sIHdoaWNoIHNob3VsZCBjb250YWluIGEgbWFwcGluZwogICAgb2YgcGFja2FnZSBuYW1lcyB0byBwYXRocy4KCiAgLS1wbGF0Zm9ybT08ZmlsZT4KICAgIFJlYWQgdGhlIFNESyBwbGF0Zm9ybSBmcm9tIDxmaWxlPiwgd2hpY2ggc2hvdWxkIGJlIGluIERpbGwvS2VybmVsIElSIGZvcm1hdAogICAgYW5kIGNvbnRhaW4gdGhlIERhcnQgU0RLLgoKICAtLXRhcmdldD1kYXJ0MmpzfGRhcnQyanNfc2VydmVyfGRhcnRfcnVubmVyfGRhcnRkZXZjfGZsdXR0ZXJ8Zmx1dHRlcl9ydW5uZXJ8bm9uZXx2bQogICAgU3BlY2lmeSB0aGUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uCgogIC0tZW5hYmxlLWFzc2VydHMKICAgIENoZWNrIGFzc2VydHMgaW4gaW5pdGlhbGl6ZXJzIGR1cmluZyBjb25zdGFudCBldmFsdWF0aW9uLgoKICAtLXZlcmlmeQogICAgQ2hlY2sgdGhhdCB0aGUgZ2VuZXJhdGVkIG91dHB1dCBpcyBmcmVlIG9mIHZhcmlvdXMgcHJvYmxlbXMuIFRoaXMgaXMgbW9zdGx5CiAgICB1c2VmdWwgZm9yIGRldmVsb3BlcnMgb2YgdGhpcyBjb21waWxlciBvciBLZXJuZWwgdHJhbnNmb3JtYXRpb25zLgoKICAtLWR1bXAtaXIKICAgIFByaW50IGNvbXBpbGVkIGxpYnJhcmllcyBpbiBLZXJuZWwgc291cmNlIG5vdGF0aW9uLgoKICAtLW9taXQtcGxhdGZvcm0KICAgIEV4Y2x1ZGUgdGhlIHBsYXRmb3JtIGZyb20gdGhlIHNlcmlhbGl6ZWQgZGlsbCBmaWxlLgoKICAtLWJ5dGVjb2RlCiAgICBHZW5lcmF0ZSBieXRlY29kZS4gU3VwcG9ydGVkIG9ubHkgZm9yIFNESyBwbGF0Zm9ybSBjb21waWxhdGlvbi4KCiAgLS1leGNsdWRlLXNvdXJjZQogICAgRG8gbm90IGluY2x1ZGUgc291cmNlIGNvZGUgaW4gdGhlIGRpbGwgZmlsZS4KCiAgLS1jb21waWxlLXNkaz08c2RrPgogICAgQ29tcGlsZSB0aGUgU0RLIGZyb20gc2NyYXRjaCBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSBhIC5kaWxsIGZpbGUKICAgIChzZWUgLS1wbGF0Zm9ybSkuCgogIC0tc2RrPTxzZGs+CiAgICBMb2NhdGlvbiBvZiB0aGUgU0RLIHNvdXJjZXMgZm9yIHVzZSB3aGVuIGNvbXBpbGluZyBhZGRpdGlvbmFsIHBsYXRmb3JtCiAgICBsaWJyYXJpZXMuCgogIC0tc3VwZXJtaXhpbgogICAgSWdub3JlZCBmb3Igbm93LgoKICAtLXNpbmdsZS1yb290LXNjaGVtZT1TdHJpbmcKICAtLXNpbmdsZS1yb290LWJhc2U9PGRpcj4KICAgIFNwZWNpZnkgYSBjdXN0b20gVVJJIHNjaGVtZSBhbmQgYSBsb2NhdGlvbiBvbiBkaXNrIHdoZXJlIHN1Y2ggVVJJcyBhcmUKICAgIG1hcHBlZCB0by4KCiAgICBXaGVuIHNwZWNpZmllZCwgdGhlIGNvbXBpbGVyIGNhbiBiZSBpbnZva2VkIHdpdGggaW5wdXRzIHVzaW5nIHRoZSBjdXN0b20KICAgIFVSSSBzY2hlbWUuIFRoZSBjb21waWxlciBjYW4gaWdub3JlIHRoZSBleGFjdCBsb2NhdGlvbiBvZiBmaWxlcyBvbiBkaXNrCiAgICBhbmQgYXMgYSByZXN1bHQgdG8gcHJvZHVjZSBvdXRwdXQgdGhhdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgYWJzb2x1dGUKICAgIGxvY2F0aW9uIG9mIGZpbGVzIG9uIGRpc2suIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgaW50ZWdyYXRpbmcgd2l0aAogICAgYnVpbGQgc3lzdGVtcy4KCiAgLS1mYXRhbD1lcnJvcnMKICAtLWZhdGFsPXdhcm5pbmdzCiAgICBNYWtlcyBtZXNzYWdlcyBvZiB0aGUgZ2l2ZW4ga2luZHMgZmF0YWwsIHRoYXQgaXMsIGltbWVkaWF0ZWx5IHN0b3AgdGhlCiAgICBjb21waWxlciB3aXRoIGEgbm9uLXplcm8gZXhpdC1jb2RlLiBJbiAtLXZlcmJvc2UgbW9kZSwgYWxzbyBkaXNwbGF5IGFuCiAgICBpbnRlcm5hbCBzdGFjayB0cmFjZSBmcm9tIHRoZSBjb21waWxlci4gTXVsdGlwbGUga2luZHMgY2FuIGJlIHNlcGFyYXRlZCBieQogICAgY29tbWFzLCBmb3IgZXhhbXBsZSwgLS1mYXRhbD1lcnJvcnMsd2FybmluZ3MuCgogIC0tZmF0YWwtc2tpcD08bnVtYmVyPgogIC0tZmF0YWwtc2tpcD10cmFjZQogICAgU2tpcCB0aGlzIG1hbnkgbWVzc2FnZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgZmF0YWwgYmVmb3JlIGFib3J0aW5nIHRoZQogICAgY29tcGlsYXRpb24uIERlZmF1bHQgaXMgMCwgd2hpY2ggc3RvcHMgYXQgdGhlIGZpcnN0IG1lc3NhZ2UuIFNwZWNpZnkKICAgICd0cmFjZScgdG8gcHJpbnQgYSBzdGFjayB0cmFjZSBmb3IgZXZlcnkgbWVzc2FnZSB3aXRob3V0IHN0b3BwaW5nLgoKICAtLWVuYWJsZS1leHBlcmltZW50PTxmbGFnPgogICAgRW5hYmxlIG9yIGRpc2FibGUgYW4gZXhwZXJpbWVudGFsIGZsYWcsIHVzZWQgdG8gZ3VhcmQgZmVhdHVyZXMgY3VycmVudGx5CiAgICBpbiBkZXZlbG9wbWVudC4gUHJlZml4IGFuIGV4cGVyaW1lbnQgbmFtZSB3aXRoICduby0nIHRvIGRpc2FibGUgaXQuCiAgICBNdWx0aXBsZSBleHBlcmltZW50cyBjYW4gYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmFzdGFVc2FnZVNob3J0ID0gbWVzc2FnZUZhc3RhVXNhZ2VTaG9ydDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGYXN0YVVzYWdlU2hvcnQgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkZhc3RhVXNhZ2VTaG9ydCIsIG1lc3NhZ2U6IHIiIiJGcmVxdWVudGx5IHVzZWQgb3B0aW9uczoKCiAgLW8gPGZpbGU+IEdlbmVyYXRlIHRoZSBvdXRwdXQgaW50byA8ZmlsZT4uCiAgLWggICAgICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmZpRXhjZXB0aW9uYWxSZXR1cm5OdWxsID0gbWVzc2FnZUZmaUV4Y2VwdGlvbmFsUmV0dXJuTnVsbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGZmlFeGNlcHRpb25hbFJldHVybk51bGwgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGZmlFeGNlcHRpb25hbFJldHVybk51bGwiLAogICAgbWVzc2FnZTogciIiIkV4Y2VwdGlvbmFsIHJldHVybiB2YWx1ZSBtdXN0IG5vdCBiZSBudWxsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGZmlFeHBlY3RlZENvbnN0YW50ID0gbWVzc2FnZUZmaUV4cGVjdGVkQ29uc3RhbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmZpRXhwZWN0ZWRDb25zdGFudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZmaUV4cGVjdGVkQ29uc3RhbnQiLAogICAgbWVzc2FnZTogciIiIkV4Y2VwdGlvbmFsIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgY29uc3RhbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNsYXNzICcjbmFtZScgY2Fubm90IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZmaUV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzIiwKICB0ZW1wbGF0ZUZmaUV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzcywKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MsCiAgICAgIG1lc3NhZ2U6ICIiIkNsYXNzICcke25hbWV9JyBjYW5ub3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVGZmlGaWVsZEFubm90YXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkZpZWxkICcjbmFtZScgcmVxdWlyZXMgZXhhY3RseSBvbmUgYW5ub3RhdGlvbiB0byBkZWNsYXJlIGl0cyBuYXRpdmUgdHlwZSwgd2hpY2ggY2Fubm90IGJlIFZvaWQuIGRhcnQ6ZmZpIFN0cnVjdHMgY2Fubm90IGhhdmUgcmVndWxhciBEYXJ0IGZpZWxkcy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkQW5ub3RhdGlvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRmZpRmllbGRBbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlGaWVsZEFubm90YXRpb24iLAogIHRlbXBsYXRlRmZpRmllbGRBbm5vdGF0aW9uLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkQW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaUZpZWxkQW5ub3RhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpZWxkICcke25hbWV9JyByZXF1aXJlcyBleGFjdGx5IG9uZSBhbm5vdGF0aW9uIHRvIGRlY2xhcmUgaXRzIG5hdGl2ZSB0eXBlLCB3aGljaCBjYW5ub3QgYmUgVm9pZC4gZGFydDpmZmkgU3RydWN0cyBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiRmllbGQgJyNuYW1lJyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZmaUZpZWxkSW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZmaUZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaUZpZWxkSW5pdGlhbGl6ZXIiLAogIHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlGaWVsZEluaXRpYWxpemVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpRmllbGRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkZpZWxkICcke25hbWV9JyBpcyBhIGRhcnQ6ZmZpIFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmllbGQgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN0cnVjdG9yIGV4ZWN1dGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUZmaUZpZWxkTm9Bbm5vdGF0aW9uID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJGaWVsZCAnI25hbWUnIHJlcXVpcmVzIG5vIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgbmF0aXZlIHR5cGUsIGl0IGlzIGEgUG9pbnRlciB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGUgc2FtZSB0eXBlIGluIERhcnQgYW5kIG5hdGl2ZSBjb2RlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpRmllbGROb0Fubm90YXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUZmaUZpZWxkTm9Bbm5vdGF0aW9uID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlGaWVsZE5vQW5ub3RhdGlvbiIsCiAgdGVtcGxhdGVGZmlGaWVsZE5vQW5ub3RhdGlvbiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNGZmlGaWVsZE5vQW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaUZpZWxkTm9Bbm5vdGF0aW9uLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRmllbGQgJyR7bmFtZX0nIHJlcXVpcmVzIG5vIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgbmF0aXZlIHR5cGUsIGl0IGlzIGEgUG9pbnRlciB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGUgc2FtZSB0eXBlIGluIERhcnQgYW5kIG5hdGl2ZSBjb2RlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlRmZpTm90U3RhdGljID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiIjbmFtZSBleHBlY3RzIGEgc3RhdGljIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4gZGFydDpmZmkgb25seSBzdXBwb3J0cyBjYWxsaW5nIHN0YXRpYyBEYXJ0IGZ1bmN0aW9ucyBmcm9tIG5hdGl2ZSBjb2RlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmZpTm90U3RhdGljKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlOb3RTdGF0aWMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkZmaU5vdFN0YXRpYyIsCiAgdGVtcGxhdGVGZmlOb3RTdGF0aWMsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpTm90U3RhdGljKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmZpTm90U3RhdGljLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJHtuYW1lfSBleHBlY3RzIGEgc3RhdGljIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4gZGFydDpmZmkgb25seSBzdXBwb3J0cyBjYWxsaW5nIHN0YXRpYyBEYXJ0IGZ1bmN0aW9ucyBmcm9tIG5hdGl2ZSBjb2RlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUZmaVN0cnVjdEdlbmVyaWMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlN0cnVjdCAnI25hbWUnIHNob3VsZCBub3QgYmUgZ2VuZXJpYy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGZmlTdHJ1Y3RHZW5lcmljKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGZmlTdHJ1Y3RHZW5lcmljID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJGZmlTdHJ1Y3RHZW5lcmljIiwKICB0ZW1wbGF0ZUZmaVN0cnVjdEdlbmVyaWMsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmZpU3RydWN0R2VuZXJpYyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZmaVN0cnVjdEdlbmVyaWMsCiAgICAgIG1lc3NhZ2U6ICIiIlN0cnVjdCAnJHtuYW1lfScgc2hvdWxkIG5vdCBiZSBnZW5lcmljLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3MgPQogICAgbWVzc2FnZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmllbGRJbml0aWFsaXplZE91dHNpZGVEZWNsYXJpbmdDbGFzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3MiLAogICAgaW5kZXg6IDg4LAogICAgbWVzc2FnZTogciIiIkEgZmllbGQgY2FuIG9ubHkgYmUgaW5pdGlhbGl6ZWQgaW4gaXRzIGRlY2xhcmluZyBjbGFzcyIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHBhc3NpbmcgYSB2YWx1ZSBpbnRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLCBvciBtb3ZpbmcgdGhlIGluaXRpYWxpemF0aW9uIGludG8gdGhlIGNvbnN0cnVjdG9yIGJvZHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IgPQogICAgbWVzc2FnZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IiLAogICAgaW5kZXg6IDc5LAogICAgbWVzc2FnZTogciIiIkZpZWxkIGZvcm1hbCBwYXJhbWV0ZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3Rvci4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgJ3RoaXMuJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRmluYWxBbmRDb3ZhcmlhbnQgPSBtZXNzYWdlRmluYWxBbmRDb3ZhcmlhbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRmluYWxBbmRDb3ZhcmlhbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGaW5hbEFuZENvdmFyaWFudCIsCiAgICBpbmRleDogODAsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2ZpbmFsJyBhbmQgJ2NvdmFyaWFudCcuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2ZpbmFsJyBvciAnY292YXJpYW50JyBrZXl3b3JkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGaW5hbEFuZFZhciA9IG1lc3NhZ2VGaW5hbEFuZFZhcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGaW5hbEFuZFZhciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJGaW5hbEFuZFZhciIsCiAgICBpbmRleDogODEsCiAgICBtZXNzYWdlOiByIiIiTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdmaW5hbCcgYW5kICd2YXInLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAndmFyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJGaW5hbCBmaWVsZCAnI25hbWUnIGlzIG5vdCBpbml0aWFsaXplZC4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IHRvIGluaXRpYWxpemUgdGhlIGZpZWxkIGluIHRoZSBkZWNsYXJhdGlvbiBvciBpbiBldmVyeSBjb25zdHJ1Y3Rvci4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQiLCB0ZW1wbGF0ZUZpbmFsRmllbGROb3RJbml0aWFsaXplZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklOQUxfTk9UX0lOSVRJQUxJWkVEIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZCwKICAgICAgbWVzc2FnZTogIiIiRmluYWwgZmllbGQgJyR7bmFtZX0nIGlzIG5vdCBpbml0aWFsaXplZC4iIiIsCiAgICAgIHRpcDoKICAgICAgICAgICIiIlRyeSB0byBpbml0aWFsaXplIHRoZSBmaWVsZCBpbiB0aGUgZGVjbGFyYXRpb24gb3IgaW4gZXZlcnkgY29uc3RydWN0b3IuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJGaW5hbCBmaWVsZCAnI25hbWUnIGlzIG5vdCBpbml0aWFsaXplZCBieSB0aGlzIGNvbnN0cnVjdG9yLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgdXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvciBhIGZpZWxkIGluaXRpYWxpemVyLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IiLAogICAgICAgIHRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SXzEiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3IsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJGaW5hbCBmaWVsZCAnJHtuYW1lfScgaXMgbm90IGluaXRpYWxpemVkIGJ5IHRoaXMgY29uc3RydWN0b3IuIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJUcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgdXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvciBhIGZpZWxkIGluaXRpYWxpemVyLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSBmaW5hbCB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IGV4cHJlc3Npb24nKSB0byB0aGUgZGVjbGFyYXRpb24uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyIiwgdGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJGSU5BTF9OT1RfSU5JVElBTElaRUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBmaW5hbCB2YXJpYWJsZSAnJHtuYW1lfScgbXVzdCBiZSBpbml0aWFsaXplZC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciAoJz0gZXhwcmVzc2lvbicpIHRvIHRoZSBkZWNsYXJhdGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkIiwKICAgICAgICB0ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRklOQUxfSU5JVElBTElaRURfTVVMVElQTEVfVElNRVMiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGlzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyB3YXMgaW5pdGlhbGl6ZWQgaGVyZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSIsCiAgICAgICAgdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UoCiAgICBTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgd2FzIGluaXRpYWxpemVkIGhlcmUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlID0KICAgIG1lc3NhZ2VGb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlIiwKICAgIG1lc3NhZ2U6IHIiIiJBIGZvci1pbiBsb29wIGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBsb29wIHZhcmlhYmxlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVGb3JJbkxvb3BOb3RBc3NpZ25hYmxlID0gbWVzc2FnZUZvckluTG9vcE5vdEFzc2lnbmFibGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlRm9ySW5Mb29wTm90QXNzaWduYWJsZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkZvckluTG9vcE5vdEFzc2lnbmFibGUiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuJ3QgYXNzaWduIHRvIHRoaXMsIHNvIGl0IGNhbid0IGJlIHVzZWQgaW4gYSBmb3ItaW4gbG9vcC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGUgPQogICAgbWVzc2FnZUZvckluTG9vcFdpdGhDb25zdFZhcmlhYmxlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUZvckluTG9vcFdpdGhDb25zdFZhcmlhYmxlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZPUl9JTl9XSVRIX0NPTlNUX1ZBUklBQkxFIl0sCiAgICBtZXNzYWdlOiByIiIiQSBmb3ItaW4gbG9vcC12YXJpYWJsZSBjYW4ndCBiZSAnY29uc3QnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBtb2RpZmllci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlID0gbWVzc2FnZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkRFRkFVTFRfVkFMVUVfSU5fRlVOQ1RJT05fVFlQRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGluIGEgZnVuY3Rpb24gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhciA9CiAgICBtZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRlVOQ1RJT05fVFlQRURfUEFSQU1FVEVSX1ZBUiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRnVuY3Rpb24tdHlwZWQgcGFyYW1ldGVycyBjYW4ndCBzcGVjaWZ5ICdjb25zdCcsICdmaW5hbCcgb3IgJ3ZhcicgaW4gcGxhY2Ugb2YgYSByZXR1cm4gdHlwZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nIHRoZSBrZXl3b3JkIHdpdGggYSByZXR1cm4gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlID0gbWVzc2FnZUdlbmVyYXRvclJldHVybnNWYWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VHZW5lcmF0b3JSZXR1cm5zVmFsdWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJHZW5lcmF0b3JSZXR1cm5zVmFsdWUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVFVSTl9JTl9HRU5FUkFUT1IiXSwKICAgIG1lc3NhZ2U6IHIiIiInc3luYyonIGFuZCAnYXN5bmMqJyBjYW4ndCByZXR1cm4gYSB2YWx1ZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmQgPQogICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkdFTkVSSUNfRlVOQ1RJT05fVFlQRV9DQU5OT1RfQkVfQk9VTkQiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlR5cGUgdmFyaWFibGVzIGNhbid0IGhhdmUgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBpbiB0aGVpciBib3VuZHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQgPQogICAgbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudCA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudCIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkdFTkVSSUNfRlVOQ1RJT05fQ0FOTk9UX0JFX1RZUEVfQVJHVU1FTlQiXSwKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgICByIiIiQSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYXJndW1lbnQuIiIiLAogICAgICAgIHRpcDogciIiIlRyeSB1c2luZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUdldHRlck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJHZXR0ZXIgbm90IGZvdW5kOiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0dldHRlck5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVHZXR0ZXJOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiR2V0dGVyTm90Rm91bmQiLCB0ZW1wbGF0ZUdldHRlck5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfR0VUVEVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0dldHRlck5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlR2V0dGVyTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkdldHRlciBub3QgZm91bmQ6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVHZXR0ZXJXaXRoRm9ybWFscyA9IG1lc3NhZ2VHZXR0ZXJXaXRoRm9ybWFsczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VHZXR0ZXJXaXRoRm9ybWFscyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkdldHRlcldpdGhGb3JtYWxzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJHRVRURVJfV0lUSF9QQVJBTUVURVJTIl0sCiAgICBtZXNzYWdlOiByIiIiQSBnZXR0ZXIgY2FuJ3QgaGF2ZSBmb3JtYWwgcGFyYW1ldGVycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgJyguLi4pJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGUgPQogICAgbWVzc2FnZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGUiLAogICAgaW5kZXg6IDQ1LAogICAgbWVzc2FnZTogciIiIklsbGVnYWwgYXNzaWdubWVudCB0byBub24tYXNzaWduYWJsZSBleHByZXNzaW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlID0KICAgIG1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTExFR0FMX0FTWU5DX0dFTkVSQVRPUl9SRVRVUk5fVFlQRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiRnVuY3Rpb25zIG1hcmtlZCAnYXN5bmMqJyBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZSBhc3NpZ25hYmxlIHRvICdTdHJlYW0nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbGxlZ2FsQXN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZSA9CiAgICBtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGUgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIklsbGVnYWxBc3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlIiwKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgICByIiIiRnVuY3Rpb25zIG1hcmtlZCAnYXN5bmMqJyBjYW4ndCBoYXZlIHJldHVybiB0eXBlICd2b2lkJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSWxsZWdhbEFzeW5jUmV0dXJuVHlwZSA9IG1lc3NhZ2VJbGxlZ2FsQXN5bmNSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUlsbGVnYWxBc3luY1JldHVyblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbGxlZ2FsQXN5bmNSZXR1cm5UeXBlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTExFR0FMX0FTWU5DX1JFVFVSTl9UWVBFIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJGdW5jdGlvbnMgbWFya2VkICdhc3luYycgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnRnV0dXJlJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlSWxsZWdhbE1peGluID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgdHlwZSAnI25hbWUnIGNhbid0IGJlIG1peGVkIGluLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSWxsZWdhbE1peGluID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbGxlZ2FsTWl4aW4iLCB0ZW1wbGF0ZUlsbGVnYWxNaXhpbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSUxMRUdBTF9NSVhJTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW4oU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbGxlZ2FsTWl4aW4sCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlICcke25hbWV9JyBjYW4ndCBiZSBtaXhlZCBpbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IHVzZSAnI25hbWUnIGFzIGEgbWl4aW4gYmVjYXVzZSBpdCBoYXMgY29uc3RydWN0b3JzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0lsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMiLCB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVhJTl9ERUNMQVJFU19DT05TVFJVQ1RPUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9ycyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdXNlICcke25hbWV9JyBhcyBhIG1peGluIGJlY2F1c2UgaXQgaGFzIGNvbnN0cnVjdG9ycy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhpcyBjb25zdHJ1Y3RvciBwcmV2ZW50cyB1c2luZyAnI25hbWUnIGFzIGEgbWl4aW4uIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIklsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UiLAogICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIlRoaXMgY29uc3RydWN0b3IgcHJldmVudHMgdXNpbmcgJyR7bmFtZX0nIGFzIGEgbWl4aW4uIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlID0KICAgIG1lc3NhZ2VJbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTExFR0FMX1NZTkNfR0VORVJBVE9SX1JFVFVSTl9UWVBFIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJGdW5jdGlvbnMgbWFya2VkICdzeW5jKicgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnSXRlcmFibGUnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlID0KICAgIG1lc3NhZ2VJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlIiwKICAgIG1lc3NhZ2U6IHIiIiJGdW5jdGlvbnMgbWFya2VkICdzeW5jKicgY2FuJ3QgaGF2ZSByZXR1cm4gdHlwZSAndm9pZCcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUltcGxlbWVudHNCZWZvcmVFeHRlbmRzID0gbWVzc2FnZUltcGxlbWVudHNCZWZvcmVFeHRlbmRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUltcGxlbWVudHNCZWZvcmVFeHRlbmRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW1wbGVtZW50c0JlZm9yZUV4dGVuZHMiLAogICAgaW5kZXg6IDQ0LAogICAgbWVzc2FnZTogciIiIlRoZSBleHRlbmRzIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgZXh0ZW5kcyBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW1wbGVtZW50c0JlZm9yZU9uID0gbWVzc2FnZUltcGxlbWVudHNCZWZvcmVPbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlT24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbXBsZW1lbnRzQmVmb3JlT24iLAogICAgaW5kZXg6IDQzLAogICAgbWVzc2FnZTogciIiIlRoZSBvbiBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIG9uIGNsYXVzZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbXBsZW1lbnRzQmVmb3JlV2l0aCA9IG1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlV2l0aDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlV2l0aCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkltcGxlbWVudHNCZWZvcmVXaXRoIiwKICAgIGluZGV4OiA0MiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgd2l0aCBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIHdpdGggY2xhdXNlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUltcGxlbWVudHNGdXR1cmVPciA9IG1lc3NhZ2VJbXBsZW1lbnRzRnV0dXJlT3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW1wbGVtZW50c0Z1dHVyZU9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW1wbGVtZW50c0Z1dHVyZU9yIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSB0eXBlICdGdXR1cmVPcicgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnaW1wbGVtZW50cycgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbXBsZW1lbnRzTmV2ZXIgPSBtZXNzYWdlSW1wbGVtZW50c05ldmVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUltcGxlbWVudHNOZXZlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJJbXBsZW1lbnRzTmV2ZXIiLAogICAgbWVzc2FnZTogciIiIlRoZSB0eXBlICdOZXZlcicgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnaW1wbGVtZW50cycgY2xhdXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPgogICAgdGVtcGxhdGVJbXBsZW1lbnRzUmVwZWF0ZWQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IGNvdW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBjYW4gb25seSBiZSBpbXBsZW1lbnRlZCBvbmNlLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyAjY291bnQgb2YgdGhlIG9jY3VycmVuY2VzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNSZXBlYXRlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBjb3VudCk+IGNvZGVJbXBsZW1lbnRzUmVwZWF0ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgY291bnQpPigKICAgICAgICAiSW1wbGVtZW50c1JlcGVhdGVkIiwgdGVtcGxhdGVJbXBsZW1lbnRzUmVwZWF0ZWQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklNUExFTUVOVFNfUkVQRUFURUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW1wbGVtZW50c1JlcGVhdGVkKFN0cmluZyBuYW1lLCBpbnQgY291bnQpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbXBsZW1lbnRzUmVwZWF0ZWQsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBjYW4gb25seSBiZSBpbXBsZW1lbnRlZCBvbmNlLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgJHtjb3VudH0gb2YgdGhlIG9jY3VycmVuY2VzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnY291bnQnOiBjb3VudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUltcGxlbWVudHNTdXBlckNsYXNzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI25hbWUnIGNhbid0IGJlIHVzZWQgaW4gYm90aCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzLiIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHJlbW92aW5nIG9uZSBvZiB0aGUgb2NjdXJyZW5jZXMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbXBsZW1lbnRzU3VwZXJDbGFzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW1wbGVtZW50c1N1cGVyQ2xhc3MgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkltcGxlbWVudHNTdXBlckNsYXNzIiwgdGVtcGxhdGVJbXBsZW1lbnRzU3VwZXJDbGFzcywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU1QTEVNRU5UU19TVVBFUl9DTEFTUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBsZW1lbnRzU3VwZXJDbGFzcyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUltcGxlbWVudHNTdXBlckNsYXNzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgaW4gYm90aCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBvY2N1cnJlbmNlcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbXBsZW1lbnRzVm9pZCA9IG1lc3NhZ2VJbXBsZW1lbnRzVm9pZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbXBsZW1lbnRzVm9pZCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJJbXBsZW1lbnRzVm9pZCIsCiAgICBtZXNzYWdlOiByIiIiVGhlIHR5cGUgJ3ZvaWQnIGNhbid0IGJlIHVzZWQgaW4gYW4gJ2ltcGxlbWVudHMnIGNsYXVzZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZyBuYW1lMiwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTMpPiB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkFwcGx5aW5nIHRoZSBtaXhpbiAnI25hbWUnIHRvICcjbmFtZTInIGludHJvZHVjZXMgYW4gZXJyb25lb3VzIG92ZXJyaWRlIG9mICcjbmFtZTMnLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW1wbGljaXRNaXhpbk92ZXJyaWRlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMpPgogICAgY29kZUltcGxpY2l0TWl4aW5PdmVycmlkZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzKT4oCiAgIkltcGxpY2l0TWl4aW5PdmVycmlkZSIsCiAgdGVtcGxhdGVJbXBsaWNpdE1peGluT3ZlcnJpZGUsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW1wbGljaXRNaXhpbk92ZXJyaWRlKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMiwgU3RyaW5nIG5hbWUzKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICBpZiAobmFtZTMuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUzID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbXBsaWNpdE1peGluT3ZlcnJpZGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJBcHBseWluZyB0aGUgbWl4aW4gJyR7bmFtZX0nIHRvICcke25hbWUyfScgaW50cm9kdWNlcyBhbiBlcnJvbmVvdXMgb3ZlcnJpZGUgb2YgJyR7bmFtZTN9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTIsICduYW1lMyc6IG5hbWUzfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUltcG9ydEFmdGVyUGFydCA9IG1lc3NhZ2VJbXBvcnRBZnRlclBhcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW1wb3J0QWZ0ZXJQYXJ0ID0gY29uc3QgTWVzc2FnZUNvZGUoIkltcG9ydEFmdGVyUGFydCIsCiAgICBpbmRleDogMTAsCiAgICBtZXNzYWdlOiByIiIiSW1wb3J0IGRpcmVjdGl2ZXMgbXVzdCBwcmVjZWRlIHBhcnQgZGlyZWN0aXZlcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBpbXBvcnQgZGlyZWN0aXZlcyBiZWZvcmUgdGhlIHBhcnQgZGlyZWN0aXZlcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXyk+CiAgICB0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJJbXBvcnQgb2YgJyNuYW1lJyAoZnJvbSAnI3VyaScpIGhpZGVzIGltcG9ydCBmcm9tICcjdXJpMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW1wb3J0SGlkZXNJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVJbXBvcnRIaWRlc0ltcG9ydCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICAiSW1wb3J0SGlkZXNJbXBvcnQiLCB0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pZ25vcmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbXBvcnRIaWRlc0ltcG9ydChTdHJpbmcgbmFtZSwgVXJpIHVyaV8sIFVyaSB1cmkyXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW1wb3J0SGlkZXNJbXBvcnQsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJJbXBvcnQgb2YgJyR7bmFtZX0nIChmcm9tICcke3VyaX0nKSBoaWRlcyBpbXBvcnQgZnJvbSAnJHt1cmkyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlfLCAndXJpMic6IHVyaTJffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlID0KICAgIG1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIHR5cGUgdmFyaWFibGUgd2hvc2UgYm91bmQgaXNuJ3QgY29uZm9ybWVkIHRvLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVJbmZlcnJlZFBhY2thZ2VVcmkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkludGVycHJldGluZyB0aGlzIGFzIHBhY2thZ2UgVVJJLCAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5mZXJyZWRQYWNrYWdlVXJpKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVJbmZlcnJlZFBhY2thZ2VVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgIkluZmVycmVkUGFja2FnZVVyaSIsIHRlbXBsYXRlSW5mZXJyZWRQYWNrYWdlVXJpLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbmZlcnJlZFBhY2thZ2VVcmkoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluZmVycmVkUGFja2FnZVVyaSwKICAgICAgbWVzc2FnZTogIiIiSW50ZXJwcmV0aW5nIHRoaXMgYXMgcGFja2FnZSBVUkksICcke3VyaX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0ID0gbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkNPTkZMSUNUU19XSVRIX0lOSEVSSVRFRF9NRU1CRVIiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBpbmhlcml0IG1lbWJlcnMgdGhhdCBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSA9CiAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIG9uZSBpbmhlcml0ZWQgbWVtYmVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIgPQogICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgb3RoZXIgaW5oZXJpdGVkIG1lbWJlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBzdHJpbmcsCiAgICAgICAgVXJpCiAgICAgICAgICAgIHVyaV8pPiB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFVyaSB1cmlfKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgI3VyaSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBVcmkgdXJpXyk+CiAgICBjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgVXJpIHVyaV8pPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCIsCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkKAogICAgU3RyaW5nIHN0cmluZywgVXJpIHVyaV8pIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgke3N0cmluZ30pLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4KSWYgeW91IGFyZSBjb21mb3J0YWJsZSB3aXRoIGl0LCBpdCB3b3VsZCBpbXByb3ZlIHRoZSBjaGFuY2VzIG9mIGZpeGluZyBhbnkgYnVnIGlmIHlvdSBpbmNsdWRlZCB0aGUgZmlsZSAke3VyaX0gaW4geW91ciBlcnJvciByZXBvcnQsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgZmlsZSBpbmNsdWRlcyB5b3VyIHNvdXJjZSBjb2RlLgpFaXRoZXIgd2F5LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRlbGV0ZSB0aGUgZmlsZSBzbyBpdCBkb2Vzbid0IHVzZSB1bm5lY2Vzc2FyeSBkaXNrIHNwYWNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4KICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCB0aGUgZmlsZSB3YXMgbm90IHNlbGYtY29udGFpbmVkLiBUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXApOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgY29kZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXAgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCIsCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgke3N0cmluZ30pLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBzdHJpbmcsCiAgICAgICAgU3RyaW5nIHN0cmluZzIsCiAgICAgICAgU3RyaW5nIHN0cmluZzMsCiAgICAgICAgVXJpCiAgICAgICAgICAgIHVyaV8pPiB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczLCBVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyNzdHJpbmcyJy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnI3N0cmluZzMnLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICN1cmkgaW4geW91ciBlcnJvciByZXBvcnQsIGJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgZmlsZSBpbmNsdWRlcyB5b3VyIHNvdXJjZSBjb2RlLgpFaXRoZXIgd2F5LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRlbGV0ZSB0aGUgZmlsZSBzbyBpdCBkb2Vzbid0IHVzZSB1bm5lY2Vzc2FyeSBkaXNrIHNwYWNlLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMsIFVyaSB1cmlfKT4KICAgIGNvZGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSA9IGNvbnN0IENvZGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMsIFVyaSB1cmlfKT4oCiAgICAgICAgIkluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtIiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbSgKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMywgVXJpIHVyaV8pIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChzdHJpbmczLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoJHtzdHJpbmd9KSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnJHtzdHJpbmcyfScuClN0YWNrdHJhY2UgaW5jbHVkZWQgJyR7c3RyaW5nM30nLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LgpJZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggaXQsIGl0IHdvdWxkIGltcHJvdmUgdGhlIGNoYW5jZXMgb2YgZml4aW5nIGFueSBidWcgaWYgeW91IGluY2x1ZGVkIHRoZSBmaWxlICR7dXJpfSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnc3RyaW5nJzogc3RyaW5nLAogICAgICAgICdzdHJpbmcyJzogc3RyaW5nMiwKICAgICAgICAnc3RyaW5nMyc6IHN0cmluZzMsCiAgICAgICAgJ3VyaSc6IHVyaV8KICAgICAgfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczKT4KICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyNzdHJpbmcyJy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnI3N0cmluZzMnLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPgogICAgY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpPigKICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAiLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wKAogICAgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCR7c3RyaW5nfSksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyR7c3RyaW5nMn0nLgpTdGFja3RyYWNlIGluY2x1ZGVkICcke3N0cmluZzN9Jy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMiwgJ3N0cmluZzMnOiBzdHJpbmczfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2ggPQogICAgbWVzc2FnZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2giLAogICAgaW5kZXg6IDgyLAogICAgbWVzc2FnZTogciIiIlRoZSBsb29wIHZhcmlhYmxlIGluIGEgZm9yLWVhY2ggbG9vcCBjYW4ndCBiZSBpbml0aWFsaXplZC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgaW5pdGlhbGl6ZXIsIG9yIHVzaW5nIGEgZGlmZmVyZW50IGtpbmQgb2YgbG9vcC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZUluaXRpYWxpemVyRm9yU3RhdGljRmllbGQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIicjbmFtZScgaXNuJ3QgYW4gaW5zdGFuY2UgZmllbGQgb2YgdGhpcyBjbGFzcy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkIiwgdGVtcGxhdGVJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTklUSUFMSVpFUl9GT1JfU1RBVElDX0ZJRUxEIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVyRm9yU3RhdGljRmllbGQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplckZvclN0YXRpY0ZpZWxkLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXNuJ3QgYW4gaW5zdGFuY2UgZmllbGQgb2YgdGhpcyBjbGFzcy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZUluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJPbmx5IGNvbnN0cnVjdG9ycyBjYW4gaGF2ZSBpbml0aWFsaXplcnMsIGFuZCAnI25hbWUnIGlzIG5vdCBhIGNvbnN0cnVjdG9yLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciIsIHRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOSVRJQUxJWkVSX09VVFNJREVfQ09OU1RSVUNUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIk9ubHkgY29uc3RydWN0b3JzIGNhbiBoYXZlIGluaXRpYWxpemVycywgYW5kICcke25hbWV9JyBpcyBub3QgYSBjb25zdHJ1Y3Rvci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZCA9CiAgICBtZXNzYWdlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoRmllbGQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoRmllbGQgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgICAgICBtZXNzYWdlOiByIiIiVGhlIGZpZWxkIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBhcmFtZXRlci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlSW5wdXRGaWxlTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIklucHV0IGZpbGUgbm90IGZvdW5kOiAjdXJpLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0lucHV0RmlsZU5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVJbnB1dEZpbGVOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAiSW5wdXRGaWxlTm90Rm91bmQiLAogIHRlbXBsYXRlSW5wdXRGaWxlTm90Rm91bmQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW5wdXRGaWxlTm90Rm91bmQoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUlucHV0RmlsZU5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJJbnB1dCBmaWxlIG5vdCBmb3VuZDogJHt1cml9LiIiIiwgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcpPiB0ZW1wbGF0ZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiA2NCBiaXRzLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgdXNpbmcgdGhlIEJpZ0ludCBjbGFzcyBpZiB5b3UgbmVlZCBhbiBpbnRlZ2VyIGxhcmdlciB0aGFuIDksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDcgb3IgbGVzcyB0aGFuIC05LDIyMywzNzIsMDM2LDg1NCw3NzUsODA4LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UiLCB0ZW1wbGF0ZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlRFR0VSX0xJVEVSQUxfT1VUX09GX1JBTkdFIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2UsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgaW50ZWdlciBsaXRlcmFsICR7c3RyaW5nfSBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiA2NCBiaXRzLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IHVzaW5nIHRoZSBCaWdJbnQgY2xhc3MgaWYgeW91IG5lZWQgYW4gaW50ZWdlciBsYXJnZXIgdGhhbiA5LDIyMywzNzIsMDM2LDg1NCw3NzUsODA3IG9yIGxlc3MgdGhhbiAtOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwOC4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlSW50ZXJmYWNlQ2hlY2sgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGltcGxlbWVudGF0aW9uIG9mICcjbmFtZScgaW4gdGhlIG5vbi1hYnN0cmFjdCBjbGFzcyAnI25hbWUyJyBkb2VzIG5vdCBjb25mb3JtIHRvIGl0cyBpbnRlcmZhY2UuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcmZhY2VDaGVjayk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+IGNvZGVJbnRlcmZhY2VDaGVjayA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICJJbnRlcmZhY2VDaGVjayIsCiAgdGVtcGxhdGVJbnRlcmZhY2VDaGVjaywKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcmZhY2VDaGVjayhTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVyZmFjZUNoZWNrLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIGltcGxlbWVudGF0aW9uIG9mICcke25hbWV9JyBpbiB0aGUgbm9uLWFic3RyYWN0IGNsYXNzICcke25hbWUyfScgZG9lcyBub3QgY29uZm9ybSB0byBpdHMgaW50ZXJmYWNlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnbmFtZTInOiBuYW1lMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWQgPQogICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnRlcm5hbFByb2JsZW1BbHJlYWR5SW5pdGlhbGl6ZWQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAgIG1lc3NhZ2U6IHIiIiJBdHRlbXB0IHRvIHNldCBpbml0aWFsaXplciBvbiBmaWVsZCB3aXRob3V0IGluaXRpYWxpemVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2QgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkludGVybmFsUHJvYmxlbUJvZHlPbkFic3RyYWN0TWV0aG9kIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6IHIiIiJBdHRlbXB0aW5nIHRvIHNldCBib2R5IG9uIGFic3RyYWN0IG1ldGhvZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gY29uc3RydWN0b3IgbmFtZWQgJyNuYW1lJyBpbiAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtQ29uc3RydWN0b3JOb3RGb3VuZCIsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQoCiAgICBTdHJpbmcgbmFtZSwgVXJpIHVyaV8pIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJObyBjb25zdHJ1Y3RvciBuYW1lZCAnJHtuYW1lfScgaW4gJyR7dXJpfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJOb24tY29udGV4dCBtZXNzYWdlIGhhcyBjb250ZXh0IHNldmVyaXR5OiAjc3RyaW5nIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHkiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eShTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eSwKICAgICAgbWVzc2FnZTogIiIiTm9uLWNvbnRleHQgbWVzc2FnZSBoYXMgY29udGV4dCBzZXZlcml0eTogJHtzdHJpbmd9IiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0ID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDb21waWxhdGlvbiBhYm9ydGVkIGR1ZSB0byBmYXRhbCAnI25hbWUnIGF0Ogojc3RyaW5nIiIiLCB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbURlYnVnQWJvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+KAogICAgICAgICJJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0IiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0LAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbURlYnVnQWJvcnQoU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbURlYnVnQWJvcnQsCiAgICAgIG1lc3NhZ2U6ICIiIkNvbXBpbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGZhdGFsICcke25hbWV9JyBhdDoKJHtzdHJpbmd9IiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICdzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGUgPQogICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnRlcm5hbFByb2JsZW1FeHRlbmRpbmdVbm1vZGlmaWFibGVTY29wZSIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAgICAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgZXh0ZW5kIGFuIHVubW9kaWZpYWJsZSBzY29wZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW50ZXJuYWxQcm9ibGVtTGFiZWxVc2FnZUluVmFyaWFibGVzRGVjbGFyYXRpb24gPQogICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uID0KICAgIGNvbnN0IE1lc3NhZ2VDb2RlKCJJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbiIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSwKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgICByIiIiVW5leHBlY3RlZCB1c2FnZSBvZiBsYWJlbCBpbnNpZGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtTWlzc2luZ0NvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnRlcm5hbFByb2JsZW1NaXNzaW5nQ29udGV4dCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgbWVzc2FnZTogciIiIkNvbXBpbGVyIGNhbm5vdCBydW4gd2l0aG91dCBhIGNvbXBpbGVyIGNvbnRleHQuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJBcmUgY2FsbHMgdG8gdGhlIGNvbXBpbGVyIHdyYXBwZWQgaW4gQ29tcGlsZXJDb250ZXh0LnJ1bkluQ29udGV4dD8iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvdWxkbid0IGZpbmQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbU5vdEZvdW5kIiwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbU5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJDb3VsZG4ndCBmaW5kICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNvdWxkbid0IGZpbmQgJyNuYW1lJyBpbiAnI25hbWUyJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4iLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4sCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4sCiAgICAgIG1lc3NhZ2U6ICIiIkNvdWxkbid0IGZpbmQgJyR7bmFtZX0nIGluICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZCA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVybmFsUHJvYmxlbVByZXZpb3VzVG9rZW5Ob3RGb3VuZCA9CiAgICBjb25zdCBNZXNzYWdlQ29kZSgiSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kIiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6IHIiIiJDb3VsZG4ndCBmaW5kIHByZXZpb3VzIHRva2VuLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBhY2Nlc3MgcHJpdmF0ZSBjb25zdHJ1Y3RvciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzcyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzIiwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVByaXZhdGVDb25zdHJ1Y3RvckFjY2VzcywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGFjY2VzcyBwcml2YXRlIGNvbnN0cnVjdG9yICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeSA9CiAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnkgPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIkludGVybmFsUHJvYmxlbVByb3ZpZGVkQm90aENvbXBpbGVTZGtBbmRTZGtTdW1tYXJ5IiwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtLAogICAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAgIHIiIiJUaGUgY29tcGlsZVNkayBhbmQgc2RrU3VtbWFyeSBvcHRpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIiNuYW1lLnN0YWNrIGlzbid0IGVtcHR5OgogICNzdHJpbmciIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcpPgogICAgY29kZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHksCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSwKICAgICAgbWVzc2FnZTogIiIiJHtuYW1lfS5zdGFjayBpc24ndCBlbXB0eToKICAke3N0cmluZ30iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXhwZWN0ZWQgJyNzdHJpbmcnLCBidXQgZ290ICcjc3RyaW5nMicuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5leHBlY3RlZChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkLAogICAgICBtZXNzYWdlOiAiIiJFeHBlY3RlZCAnJHtzdHJpbmd9JywgYnV0IGdvdCAnJHtzdHJpbmcyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFVyaQogICAgICAgICAgICB1cmlfKT4gdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmZpbmlzaGVkVHlwZVZhcmlhYmxlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVW5maW5pc2hlZCB0eXBlIHZhcmlhYmxlICcjbmFtZScgZm91bmQgaW4gbm9uLXNvdXJjZSBsaWJyYXJ5ICcjdXJpJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuZmluaXNoZWRUeXBlVmFyaWFibGUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+CiAgICBjb2RlSW50ZXJuYWxQcm9ibGVtVW5maW5pc2hlZFR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVVuZmluaXNoZWRUeXBlVmFyaWFibGUiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5maW5pc2hlZFR5cGVWYXJpYWJsZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmZpbmlzaGVkVHlwZVZhcmlhYmxlKAogICAgU3RyaW5nIG5hbWUsIFVyaSB1cmlfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVW5maW5pc2hlZFR5cGVWYXJpYWJsZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlVuZmluaXNoZWQgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgZm91bmQgaW4gbm9uLXNvdXJjZSBsaWJyYXJ5ICcke3VyaX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJVbmhhbmRsZWQgI3N0cmluZyBpbiAjc3RyaW5nMi4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIGNvZGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICAgICAgIkludGVybmFsUHJvYmxlbVVuaGFuZGxlZCIsIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5oYW5kbGVkLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuaGFuZGxlZChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQsCiAgICAgIG1lc3NhZ2U6ICIiIlVuaGFuZGxlZCAke3N0cmluZ30gaW4gJHtzdHJpbmcyfS4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlVuaW1wbGVtZW50ZWQgI3N0cmluZy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gY29kZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZCIsIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZCwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkKFN0cmluZyBzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVW5pbXBsZW1lbnRlZCwKICAgICAgbWVzc2FnZTogIiIiVW5pbXBsZW1lbnRlZCAke3N0cmluZ30uIiIiLCBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQiLCB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQsCiAgICAgIG1lc3NhZ2U6ICIiIlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgVVJJICcjdXJpJyBoYXMgbm8gc2NoZW1lLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oIkludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaW50ZXJuYWxQcm9ibGVtKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lLAogICAgICBtZXNzYWdlOiAiIiJUaGUgVVJJICcke3VyaX0nIGhhcyBubyBzY2hlbWUuIiIiLCBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJWZXJpZmljYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBwcm9ncmFtIGZhaWxlZDoKI3N0cmluZyIiIiwgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IiLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmludGVybmFsUHJvYmxlbSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3IoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvciwKICAgICAgbWVzc2FnZTogIiIiVmVyaWZpY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgcHJvZ3JhbSBmYWlsZWQ6CiR7c3RyaW5nfSIiIiwgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnRlcnBvbGF0aW9uSW5VcmkgPSBtZXNzYWdlSW50ZXJwb2xhdGlvbkluVXJpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludGVycG9sYXRpb25JblVyaSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludGVycG9sYXRpb25JblVyaSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9MSVRFUkFMX0lOX0NPTkZJR1VSQVRJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCB1c2Ugc3RyaW5nIGludGVycG9sYXRpb24gaW4gYSBVUkkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRBd2FpdEZvciA9IG1lc3NhZ2VJbnZhbGlkQXdhaXRGb3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZEF3YWl0Rm9yID0gY29uc3QgTWVzc2FnZUNvZGUoIkludmFsaWRBd2FpdEZvciIsCiAgICBpbmRleDogOSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBrZXl3b3JkICdhd2FpdCcgaXNuJ3QgYWxsb3dlZCBmb3IgYSBub3JtYWwgJ2Zvcicgc3RhdGVtZW50LiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCwgb3IgdXNlIGEgZm9yLWVhY2ggc3RhdGVtZW50LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVJbnZhbGlkQnJlYWtUYXJnZXQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGJyZWFrIHRvICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZEJyZWFrVGFyZ2V0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbnZhbGlkQnJlYWtUYXJnZXQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIkludmFsaWRCcmVha1RhcmdldCIsCiAgdGVtcGxhdGVJbnZhbGlkQnJlYWtUYXJnZXQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZEJyZWFrVGFyZ2V0KFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZEJyZWFrVGFyZ2V0LAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBicmVhayB0byAnJHtuYW1lfScuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZENhdGNoQXJndW1lbnRzID0gbWVzc2FnZUludmFsaWRDYXRjaEFyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkQ2F0Y2hBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkQ2F0Y2hBcmd1bWVudHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfQ0FUQ0hfQVJHVU1FTlRTIl0sCiAgICBtZXNzYWdlOiByIiIiSW52YWxpZCBjYXRjaCBhcmd1bWVudHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRDb2RlUG9pbnQgPSBtZXNzYWdlSW52YWxpZENvZGVQb2ludDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZENvZGVQb2ludCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9DT0RFX1BPSU5UIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1x1JyBpc24ndCBhIHZhbGlkIGNvZGUgcG9pbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUludmFsaWRDb250aW51ZVRhcmdldCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiQ2FuJ3QgY29udGludWUgYXQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNJbnZhbGlkQ29udGludWVUYXJnZXQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZUludmFsaWRDb250aW51ZVRhcmdldCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiSW52YWxpZENvbnRpbnVlVGFyZ2V0IiwKICB0ZW1wbGF0ZUludmFsaWRDb250aW51ZVRhcmdldCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkQ29udGludWVUYXJnZXQoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkQ29udGludWVUYXJnZXQsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGNvbnRpbnVlIGF0ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkSGV4RXNjYXBlID0gbWVzc2FnZUludmFsaWRIZXhFc2NhcGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZEhleEVzY2FwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRIZXhFc2NhcGUiLAogICAgaW5kZXg6IDQwLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQW4gZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1x4JyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDIgaGV4YWRlY2ltYWwgZGlnaXRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkSW5pdGlhbGl6ZXIgPSBtZXNzYWdlSW52YWxpZEluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRJbml0aWFsaXplciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRJbml0aWFsaXplciIsCiAgICBpbmRleDogOTAsCiAgICBtZXNzYWdlOiByIiIiTm90IGEgdmFsaWQgaW5pdGlhbGl6ZXIuIiIiLAogICAgdGlwOiByIiIiVG8gaW5pdGlhbGl6ZSBhIGZpZWxkLCB1c2UgdGhlIHN5bnRheCAnbmFtZSA9IHZhbHVlJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZSA9CiAgICBtZXNzYWdlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9JTkxJTkVfRlVOQ1RJT05fVFlQRSJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiSW5saW5lIGZ1bmN0aW9uIHR5cGVzIGNhbm5vdCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJzIGluIGEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSBpbmxpbmUgZnVuY3Rpb24gdHlwZSAoYXMgaW4gJ2ludCBmKCknKSB0byBhIHByZWZpeGVkIGZ1bmN0aW9uIHR5cGUgdXNpbmcgdGhlIGBGdW5jdGlvbmAga2V5d29yZCAoYXMgaW4gJ2ludCBGdW5jdGlvbigpIGYnKS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IHRlbXBsYXRlSW52YWxpZE9wZXJhdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUaGUgc3RyaW5nICcjbGV4ZW1lJyBpc24ndCBhIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9yLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRPcGVyYXRvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlSW52YWxpZE9wZXJhdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJJbnZhbGlkT3BlcmF0b3IiLCB0ZW1wbGF0ZUludmFsaWRPcGVyYXRvciwKICAgICAgICBpbmRleDogMzkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0ludmFsaWRPcGVyYXRvcihUb2tlbiB0b2tlbikgewogIFN0cmluZyBsZXhlbWUgPSB0b2tlbi5sZXhlbWU7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkT3BlcmF0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBzdHJpbmcgJyR7bGV4ZW1lfScgaXNuJ3QgYSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvci4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd0b2tlbic6IHRva2VufSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFN0cmluZyBzdHJpbmcpPgogICAgdGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiSW52YWxpZCBwYWNrYWdlIFVSSSAnI3VyaSc6CiAgI3N0cmluZy4iIiIsIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZFBhY2thZ2VVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgc3RyaW5nKT4gY29kZUludmFsaWRQYWNrYWdlVXJpID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIHN0cmluZyk+KAogICJJbnZhbGlkUGFja2FnZVVyaSIsCiAgdGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkUGFja2FnZVVyaShVcmkgdXJpXywgU3RyaW5nIHN0cmluZykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkUGFja2FnZVVyaSwKICAgICAgbWVzc2FnZTogIiIiSW52YWxpZCBwYWNrYWdlIFVSSSAnJHt1cml9JzoKICAke3N0cmluZ30uIiIiLCBhcmd1bWVudHM6IHsndXJpJzogdXJpXywgJ3N0cmluZyc6IHN0cmluZ30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyID0KICAgIG1lc3NhZ2VJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRTdXBlckluSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVyIiwKICAgIGluZGV4OiA0NywKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkNhbiBvbmx5IHVzZSAnc3VwZXInIGluIGFuIGluaXRpYWxpemVyIGZvciBjYWxsaW5nIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIChlLmcuICdzdXBlcigpJyBvciAnc3VwZXIubmFtZWRDb25zdHJ1Y3RvcigpJykiIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFN5bmNNb2RpZmllciA9IG1lc3NhZ2VJbnZhbGlkU3luY01vZGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRTeW5jTW9kaWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkU3luY01vZGlmaWVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX1NUQVJfQUZURVJfU1lOQyJdLAogICAgbWVzc2FnZTogciIiIkludmFsaWQgbW9kaWZpZXIgJ3N5bmMnLiIiIiwKICAgIHRpcDogciIiIlRyeSByZXBsYWNpbmcgJ3N5bmMnIHdpdGggJ3N5bmMqJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFRoaXNJbkluaXRpYWxpemVyID0gbWVzc2FnZUludmFsaWRUaGlzSW5Jbml0aWFsaXplcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXIiLAogICAgaW5kZXg6IDY1LAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2FuIG9ubHkgdXNlICd0aGlzJyBpbiBhbiBpbml0aWFsaXplciBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24gKGUuZy4gJ3RoaXMueCA9IHNvbWV0aGluZycpIGFuZCBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiAoZS5nLiAndGhpcygpJyBvciAndGhpcy5uYW1lZENvbnN0cnVjdG9yKCkpIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcgc3RyaW5nMiwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZUludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2FuJ3QgdXNlIGltcGxpY2l0bHkgJ291dCcgdmFyaWFibGUgJyNuYW1lJyBpbiBhbiAnI3N0cmluZzInIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgbmFtZTIpPgogICAgY29kZUludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgbmFtZTIpPigKICAiSW52YWxpZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlIiwKICB0ZW1wbGF0ZUludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGUoCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgaW1wbGljaXRseSAnb3V0JyB2YXJpYWJsZSAnJHtuYW1lfScgaW4gYW4gJyR7c3RyaW5nMn0nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAnc3RyaW5nMic6IHN0cmluZzIsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIG5hbWUyKT4KICAgIHRlbXBsYXRlSW52YWxpZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlV2l0aFZhcmlhbmNlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBuYW1lMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IHVzZSAnI3N0cmluZycgdHlwZSB2YXJpYWJsZSAnI25hbWUnIGluIGFuICcjc3RyaW5nMicgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICcjbmFtZTInLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0ludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZVdpdGhWYXJpYW5jZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVXaXRoVmFyaWFuY2UgPSBjb25zdCBDb2RlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIG5hbWUyKT4oCiAgIkludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZVdpdGhWYXJpYW5jZSIsCiAgdGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVXaXRoVmFyaWFuY2UsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlV2l0aFZhcmlhbmNlKAogICAgU3RyaW5nIHN0cmluZywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVXaXRoVmFyaWFuY2UsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgJyR7c3RyaW5nfScgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgaW4gYW4gJyR7c3RyaW5nMn0nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ3N0cmluZyc6IHN0cmluZywKICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgJ3N0cmluZzInOiBzdHJpbmcyLAogICAgICAgICduYW1lMic6IG5hbWUyCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIHN0cmluZywKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgc3RyaW5nMik+IHRlbXBsYXRlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCB1c2UgJyNzdHJpbmcnIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBpbiBhbiAnI3N0cmluZzInIHBvc2l0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb24pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMik+CiAgICBjb2RlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMik+KAogICJJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbiIsCiAgdGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbigKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChzdHJpbmcyLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCB1c2UgJyR7c3RyaW5nfScgdHlwZSB2YXJpYWJsZSAnJHtuYW1lfScgaW4gYW4gJyR7c3RyaW5nMn0nIHBvc2l0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3N0cmluZyc6IHN0cmluZywgJ25hbWUnOiBuYW1lLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZzIpPgogICAgdGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbkluUmV0dXJuVHlwZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IHVzZSAnI3N0cmluZycgdHlwZSB2YXJpYWJsZSAnI25hbWUnIGluIGFuICcjc3RyaW5nMicgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c0ludmFsaWRUeXBlVmFyaWFibGVWYXJpYW5jZVBvc2l0aW9uSW5SZXR1cm5UeXBlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZzIpPgogICAgY29kZUludmFsaWRUeXBlVmFyaWFibGVWYXJpYW5jZVBvc2l0aW9uSW5SZXR1cm5UeXBlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZzIpPigKICAiSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JblJldHVyblR5cGUiLAogIHRlbXBsYXRlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JblJldHVyblR5cGUsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JblJldHVyblR5cGUoCiAgICBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN0cmluZzIpIHsKICBpZiAoc3RyaW5nLmlzRW1wdHkpIHRocm93ICdObyBzdHJpbmcgcHJvdmlkZWQnOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludmFsaWRUeXBlVmFyaWFibGVWYXJpYW5jZVBvc2l0aW9uSW5SZXR1cm5UeXBlLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdXNlICcke3N0cmluZ30nIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIGluIGFuICcke3N0cmluZzJ9JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnbmFtZSc6IG5hbWUsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVJbnZhbGlkVW5pY29kZUVzY2FwZSA9IG1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkludmFsaWRVbmljb2RlRXNjYXBlIiwKICAgIGluZGV4OiAzOCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkFuIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdcdScgbXVzdCBiZSBmb2xsb3dlZCBieSA0IGhleGFkZWNpbWFsIGRpZ2l0cyBvciBmcm9tIDEgdG8gNiBkaWdpdHMgYmV0d2VlbiAneycgYW5kICd9Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSW52YWxpZFVzZU9mTnVsbEF3YXJlQWNjZXNzID0KICAgIG1lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlSW52YWxpZFVzZU9mTnVsbEF3YXJlQWNjZXNzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSW52YWxpZFVzZU9mTnVsbEF3YXJlQWNjZXNzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX1VTRV9PRl9OVUxMX0FXQVJFX0FDQ0VTUyJdLAogICAgbWVzc2FnZTogciIiIkNhbm5vdCB1c2UgJz8uJyBoZXJlLiIiIiwKICAgIHRpcDogciIiIlRyeSB1c2luZyAnLicuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUludmFsaWRWb2lkID0gbWVzc2FnZUludmFsaWRWb2lkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUludmFsaWRWb2lkID0gY29uc3QgTWVzc2FnZUNvZGUoIkludmFsaWRWb2lkIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9UWVBFX05BTUUiXSwKICAgIG1lc3NhZ2U6IHIiIiJUeXBlICd2b2lkJyBjYW4ndCBiZSB1c2VkIGhlcmUuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgJ3ZvaWQnIGtleXdvcmQgb3IgcmVwbGFjZSBpdCB3aXRoICd2YXInLCAnZmluYWwnLCBvciBhIHR5cGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiInI25hbWUnIGlzbid0IGEgZnVuY3Rpb24gb3IgbWV0aG9kIGFuZCBjYW4ndCBiZSBpbnZva2VkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0ludm9rZU5vbkZ1bmN0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVJbnZva2VOb25GdW5jdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiSW52b2tlTm9uRnVuY3Rpb24iLCB0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZPQ0FUSU9OX09GX05PTl9GVU5DVElPTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNJbnZva2VOb25GdW5jdGlvbihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUludm9rZU5vbkZ1bmN0aW9uLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXNuJ3QgYSBmdW5jdGlvbiBvciBtZXRob2QgYW5kIGNhbid0IGJlIGludm9rZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlSnNJbnRlcm9wSW5kZXhOb3RTdXBwb3J0ZWQgPQogICAgbWVzc2FnZUpzSW50ZXJvcEluZGV4Tm90U3VwcG9ydGVkOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZUpzSW50ZXJvcEluZGV4Tm90U3VwcG9ydGVkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiSnNJbnRlcm9wSW5kZXhOb3RTdXBwb3J0ZWQiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiSlMgaW50ZXJvcCBjbGFzc2VzIGRvIG5vdCBzdXBwb3J0IFtdIGFuZCBbXT0gb3BlcmF0b3IgbWV0aG9kcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nIHdpdGggYSBub3JtYWwgbWV0aG9kLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZUxhYmVsTm90Rm91bmQgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBmaW5kIGxhYmVsICcjbmFtZScuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBkZWZpbmluZyB0aGUgbGFiZWwsIG9yIGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgbGFiZWwuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNMYWJlbE5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVMYWJlbE5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJMYWJlbE5vdEZvdW5kIiwgdGVtcGxhdGVMYWJlbE5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJMQUJFTF9VTkRFRklORUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTGFiZWxOb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUxhYmVsTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGZpbmQgbGFiZWwgJyR7bmFtZX0nLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGRlZmluaW5nIHRoZSBsYWJlbCwgb3IgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyBsYWJlbC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMYW5ndWFnZVZlcnNpb25JbnZhbGlkSW5Eb3RQYWNrYWdlcyA9CiAgICBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uSW52YWxpZEluRG90UGFja2FnZXM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uSW52YWxpZEluRG90UGFja2FnZXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMYW5ndWFnZVZlcnNpb25JbnZhbGlkSW5Eb3RQYWNrYWdlcyIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgbGFuZ3VhZ2UgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkIGNvcnJlY3RseSBpbiB0aGUgLnBhY2thZ2VzIGZpbGUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUxhbmd1YWdlVmVyc2lvbkxpYnJhcnlDb250ZXh0ID0KICAgIG1lc3NhZ2VMYW5ndWFnZVZlcnNpb25MaWJyYXJ5Q29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VMYW5ndWFnZVZlcnNpb25MaWJyYXJ5Q29udGV4dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkxhbmd1YWdlVmVyc2lvbkxpYnJhcnlDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgbGFuZ3VhZ2UgdmVyc2lvbiBhbm5vdGF0aW9uIGluIHRoZSBsaWJyYXJ5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGFydCA9CiAgICBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uTWlzbWF0Y2hJblBhcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uTWlzbWF0Y2hJblBhcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGFydCIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGUgbGFuZ3VhZ2UgdmVyc2lvbiBvdmVycmlkZSBoYXMgdG8gYmUgdGhlIHNhbWUgaW4gdGhlIGxpYnJhcnkgYW5kIGl0cyBwYXJ0KHMpLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGF0Y2ggPQogICAgbWVzc2FnZUxhbmd1YWdlVmVyc2lvbk1pc21hdGNoSW5QYXRjaDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VMYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGF0Y2ggPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGF0Y2giLAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIGxhbmd1YWdlIHZlcnNpb24gb3ZlcnJpZGUgaGFzIHRvIGJlIHRoZSBzYW1lIGluIHRoZSBsaWJyYXJ5IGFuZCBpdHMgcGF0Y2goZXMpLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMYW5ndWFnZVZlcnNpb25QYXJ0Q29udGV4dCA9CiAgICBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uUGFydENvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uUGFydENvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMYW5ndWFnZVZlcnNpb25QYXJ0Q29udGV4dCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIGxhbmd1YWdlIHZlcnNpb24gYW5ub3RhdGlvbiBpbiB0aGUgcGFydC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTGFuZ3VhZ2VWZXJzaW9uUGF0Y2hDb250ZXh0ID0KICAgIG1lc3NhZ2VMYW5ndWFnZVZlcnNpb25QYXRjaENvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uUGF0Y2hDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTGFuZ3VhZ2VWZXJzaW9uUGF0Y2hDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgbGFuZ3VhZ2UgdmVyc2lvbiBhbm5vdGF0aW9uIGluIHRoZSBwYXRjaC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIGludCBjb3VudCwKICAgICAgICBpbnQKICAgICAgICAgICAgY291bnQyKT4gdGVtcGxhdGVMYW5ndWFnZVZlcnNpb25Ub29IaWdoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIHNwZWNpZmllZCBsYW5ndWFnZSB2ZXJzaW9uIGlzIHRvbyBoaWdoLiBUaGUgaGlnaGVzdCBzdXBwb3J0ZWQgbGFuZ3VhZ2UgdmVyc2lvbiBpcyAjY291bnQuI2NvdW50Mi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c0xhbmd1YWdlVmVyc2lvblRvb0hpZ2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCwgaW50IGNvdW50Mik+IGNvZGVMYW5ndWFnZVZlcnNpb25Ub29IaWdoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAiTGFuZ3VhZ2VWZXJzaW9uVG9vSGlnaCIsCiAgdGVtcGxhdGVMYW5ndWFnZVZlcnNpb25Ub29IaWdoLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0xhbmd1YWdlVmVyc2lvblRvb0hpZ2goaW50IGNvdW50LCBpbnQgY291bnQyKSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKGNvdW50MiA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTGFuZ3VhZ2VWZXJzaW9uVG9vSGlnaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgdmVyc2lvbiBpcyB0b28gaGlnaC4gVGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxhbmd1YWdlIHZlcnNpb24gaXMgJHtjb3VudH0uJHtjb3VudDJ9LiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvdW50JzogY291bnQsICdjb3VudDInOiBjb3VudDJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0ID0gbWVzc2FnZUxpYnJhcnlEaXJlY3RpdmVOb3RGaXJzdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3QiLAogICAgaW5kZXg6IDM3LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIGxpYnJhcnkgZGlyZWN0aXZlIG11c3QgYXBwZWFyIGJlZm9yZSBhbGwgb3RoZXIgZGlyZWN0aXZlcy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBsaWJyYXJ5IGRpcmVjdGl2ZSBiZWZvcmUgYW55IG90aGVyIGRpcmVjdGl2ZXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZUxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPQogICAgbWVzc2FnZUxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIkxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX09ORV9MSVNUX1RZUEVfQVJHVU1FTlRTIl0sCiAgICBtZXNzYWdlOiByIiIiTGlzdCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgb25lIHR5cGUgYXJndW1lbnQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlTG9hZExpYnJhcnlIaWRlc01lbWJlciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVGhlIGxpYnJhcnkgJyN1cmknIGRlZmluZXMgYSB0b3AtbGV2ZWwgbWVtYmVyIG5hbWVkICdsb2FkTGlicmFyeScuIFRoaXMgbWVtYmVyIGlzIGhpZGRlbiBieSB0aGUgc3BlY2lhbCBtZW1iZXIgJ2xvYWRMaWJyYXJ5JyB0aGF0IHRoZSBsYW5ndWFnZSBhZGRzIHRvIHN1cHBvcnQgZGVmZXJyZWQgbG9hZGluZy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSB0byByZW5hbWUgb3IgaGlkZSB0aGUgbWVtYmVyLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTG9hZExpYnJhcnlIaWRlc01lbWJlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlTG9hZExpYnJhcnlIaWRlc01lbWJlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAiTG9hZExpYnJhcnlIaWRlc01lbWJlciIsIHRlbXBsYXRlTG9hZExpYnJhcnlIaWRlc01lbWJlciwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuaWdub3JlZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTG9hZExpYnJhcnlIaWRlc01lbWJlcihVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTG9hZExpYnJhcnlIaWRlc01lbWJlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBsaWJyYXJ5ICcke3VyaX0nIGRlZmluZXMgYSB0b3AtbGV2ZWwgbWVtYmVyIG5hbWVkICdsb2FkTGlicmFyeScuIFRoaXMgbWVtYmVyIGlzIGhpZGRlbiBieSB0aGUgc3BlY2lhbCBtZW1iZXIgJ2xvYWRMaWJyYXJ5JyB0aGF0IHRoZSBsYW5ndWFnZSBhZGRzIHRvIHN1cHBvcnQgZGVmZXJyZWQgbG9hZGluZy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHRvIHJlbmFtZSBvciBoaWRlIHRoZSBtZW1iZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMgPQogICAgbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJMb2FkTGlicmFyeVRha2VzTm9Bcmd1bWVudHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkxPQURfTElCUkFSWV9UQUtFU19OT19BUkdVTUVOVFMiXSwKICAgIG1lc3NhZ2U6IHIiIiInbG9hZExpYnJhcnknIHRha2VzIG5vIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkxvY2FsIGRlZmluaXRpb24gb2YgJyNuYW1lJyBoaWRlcyBleHBvcnQgZnJvbSAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+CiAgICBjb2RlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgICJMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydCIsIHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0xvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0LAogICAgICBtZXNzYWdlOiAiIiJMb2NhbCBkZWZpbml0aW9uIG9mICcke25hbWV9JyBoaWRlcyBleHBvcnQgZnJvbSAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkxvY2FsIGRlZmluaXRpb24gb2YgJyNuYW1lJyBoaWRlcyBpbXBvcnQgZnJvbSAnI3VyaScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+CiAgICBjb2RlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgICJMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydCIsIHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c0xvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0KFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0LAogICAgICBtZXNzYWdlOiAiIiJMb2NhbCBkZWZpbml0aW9uIG9mICcke25hbWV9JyBoaWRlcyBpbXBvcnQgZnJvbSAnJHt1cml9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoID0KICAgIG1lc3NhZ2VNYXBMaXRlcmFsVHlwZUFyZ3VtZW50TWlzbWF0Y2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFBFQ1RFRF9UV09fTUFQX1RZUEVfQVJHVU1FTlRTIl0sCiAgICBtZXNzYWdlOiByIiIiQSBtYXAgbGl0ZXJhbCByZXF1aXJlcyBleGFjdGx5IHR3byB0eXBlIGFyZ3VtZW50cy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzcyA9CiAgICBtZXNzYWdlTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWVtYmVyV2l0aFNhbWVOYW1lQXNDbGFzcyIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBIGNsYXNzIG1lbWJlciBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGVuY2xvc2luZyBjbGFzcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWV0YWRhdGFUeXBlQXJndW1lbnRzID0gbWVzc2FnZU1ldGFkYXRhVHlwZUFyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNZXRhZGF0YVR5cGVBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNZXRhZGF0YVR5cGVBcmd1bWVudHMiLAogICAgaW5kZXg6IDkxLAogICAgbWVzc2FnZTogciIiIkFuIGFubm90YXRpb24gKG1ldGFkYXRhKSBjYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZU1ldGhvZE5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJNZXRob2Qgbm90IGZvdW5kOiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01ldGhvZE5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVNZXRob2ROb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiTWV0aG9kTm90Rm91bmQiLCB0ZW1wbGF0ZU1ldGhvZE5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfTUVUSE9EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01ldGhvZE5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWV0aG9kTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIk1ldGhvZCBub3QgZm91bmQ6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nQXJndW1lbnRMaXN0ID0gbWVzc2FnZU1pc3NpbmdBcmd1bWVudExpc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0FyZ3VtZW50TGlzdCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdBcmd1bWVudExpc3QiLAogICAgbWVzc2FnZTogciIiIkNvbnN0cnVjdG9yIGludm9jYXRpb25zIG11c3QgaGF2ZSBhbiBhcmd1bWVudCBsaXN0LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yID0KICAgIG1lc3NhZ2VNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdBc3NpZ25hYmxlU2VsZWN0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yIiwKICAgIGluZGV4OiAzNSwKICAgIG1lc3NhZ2U6IHIiIiJNaXNzaW5nIHNlbGVjdG9yIHN1Y2ggYXMgJy5pZGVudGlmaWVyJyBvciAnWzBdJy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgc2VsZWN0b3IuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciA9CiAgICBtZXNzYWdlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplciIsCiAgICBpbmRleDogMzQsCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgYW4gYXNzaWdubWVudCBhZnRlciB0aGUgZmllbGQgbmFtZS4iIiIsCiAgICB0aXA6IHIiIiJUbyBpbml0aWFsaXplIGEgZmllbGQsIHVzZSB0aGUgc3ludGF4ICduYW1lID0gdmFsdWUnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSA9CiAgICBtZXNzYWdlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSIsCiAgICBpbmRleDogMzMsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJWYXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCB1c2luZyB0aGUga2V5d29yZHMgJ2NvbnN0JywgJ2ZpbmFsJywgJ3Zhcicgb3IgYSB0eXBlIG5hbWUuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgYWRkaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBvciB0aGUga2V5d29yZCAndmFyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ0V4cGxpY2l0Q29uc3QgPSBtZXNzYWdlTWlzc2luZ0V4cGxpY2l0Q29uc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWlzc2luZ0V4cGxpY2l0Q29uc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nRXhwbGljaXRDb25zdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0NPTlNUQU5UX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkLiIiIiwKICAgIHRpcDogciIiIlRyeSBpbnNlcnRpbmcgJ2NvbnN0Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPgogICAgdGVtcGxhdGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gdHlwZSBhcmd1bWVudHMgcHJvdmlkZWQsICNjb3VudCBwb3NzaWJsZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPiBjb2RlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgIk1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMiLCB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMoaW50IGNvdW50KSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICBtZXNzYWdlOiAiIiJObyB0eXBlIGFyZ3VtZW50cyBwcm92aWRlZCwgJHtjb3VudH0gcG9zc2libGUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnY291bnQnOiBjb3VudH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nRXhwb25lbnQgPSBtZXNzYWdlTWlzc2luZ0V4cG9uZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdFeHBvbmVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNaXNzaW5nRXhwb25lbnQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRElHSVQiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIk51bWJlcnMgaW4gZXhwb25lbnRpYWwgbm90YXRpb24gc2hvdWxkIGFsd2F5cyBjb250YWluIGFuIGV4cG9uZW50IChhbiBpbnRlZ2VyIG51bWJlciB3aXRoIGFuIG9wdGlvbmFsIHNpZ24pLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGV4cG9uZW50LCBhbmQgcmVtb3ZlIGFueSB3aGl0ZXNwYWNlIGJlZm9yZSBpdC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ0V4cHJlc3Npb25JblRocm93ID0gbWVzc2FnZU1pc3NpbmdFeHByZXNzaW9uSW5UaHJvdzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3cgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3ciLAogICAgaW5kZXg6IDMyLAogICAgbWVzc2FnZTogciIiIk1pc3NpbmcgZXhwcmVzc2lvbiBhZnRlciAndGhyb3cnLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiQWRkIGFuIGV4cHJlc3Npb24gYWZ0ZXIgJ3Rocm93JyBvciB1c2UgJ3JldGhyb3cnIHRvIHRocm93IGEgY2F1Z2h0IGV4Y2VwdGlvbiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdGdW5jdGlvblBhcmFtZXRlcnMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNSVNTSU5HX0ZVTkNUSU9OX1BBUkFNRVRFUlMiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgZnVuY3Rpb24gZGVjbGFyYXRpb24gbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBkZWZpbmVkIGhlcmUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZSIsIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBkZWZpbmVkIGhlcmUuIiIiLCBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIExpc3Q8U3RyaW5nPgogICAgICAgICAgICBfbmFtZXMpPiB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IF9uYW1lcyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbm9uLWFic3RyYWN0IGNsYXNzICcjbmFtZScgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6CiNuYW1lcyIiIiwKICAgIHRpcFRlbXBsYXRlOiByIiIiVHJ5IHRvIGVpdGhlcgogLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uLAogLSBpbmhlcml0IGFuIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlcmNsYXNzIG9yIG1peGluLAogLSBtYXJrIHRoZSBjbGFzcyBhcyBhYnN0cmFjdCwgb3IKIC0gcHJvdmlkZSBhICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLgoiIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c01pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgTGlzdDxTdHJpbmc+IF9uYW1lcyk+CiAgICBjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gX25hbWVzKT4oCiAgICAgICAgIk1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0IiwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDT05DUkVURV9DTEFTU19XSVRIX0FCU1RSQUNUX01FTUJFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdCgKICAgIFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gX25hbWVzKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChfbmFtZXMuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWVzIHByb3ZpZGVkJzsKICBTdHJpbmcgbmFtZXMgPSBpdGVtaXplTmFtZXMoX25hbWVzKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU1pc3NpbmdJbXBsZW1lbnRhdGlvbk5vdEFic3RyYWN0LAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG5vbi1hYnN0cmFjdCBjbGFzcyAnJHtuYW1lfScgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6CiR7bmFtZXN9IiIiLAogICAgICB0aXA6ICIiIlRyeSB0byBlaXRoZXIKIC0gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiwKIC0gaW5oZXJpdCBhbiBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgc3VwZXJjbGFzcyBvciBtaXhpbiwKIC0gbWFyayB0aGUgY2xhc3MgYXMgYWJzdHJhY3QsIG9yCiAtIHByb3ZpZGUgYSAnbm9TdWNoTWV0aG9kJyBpbXBsZW1lbnRhdGlvbi4KIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lcyc6IF9uYW1lc30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nSW5wdXQgPSBtZXNzYWdlTWlzc2luZ0lucHV0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdJbnB1dCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNaXNzaW5nSW5wdXQiLAogICAgbWVzc2FnZTogciIiIk5vIGlucHV0IGZpbGUgcHJvdmlkZWQgdG8gdGhlIGNvbXBpbGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNaXNzaW5nTWFpbiA9IG1lc3NhZ2VNaXNzaW5nTWFpbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nTWFpbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNaXNzaW5nTWFpbiIsCiAgICBtZXNzYWdlOiByIiIiTm8gJ21haW4nIG1ldGhvZCBmb3VuZC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgbWV0aG9kIG5hbWVkICdtYWluJyB0byB5b3VyIHByb2dyYW0uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzID0gbWVzc2FnZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ01ldGhvZFBhcmFtZXRlcnMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfTUVUSE9EX1BBUkFNRVRFUlMiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIG1ldGhvZCBkZWNsYXJhdGlvbiBuZWVkcyBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIHBhcmFtZXRlciBsaXN0IHRvIHRoZSBtZXRob2QgZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1pc3NpbmdPcGVyYXRvcktleXdvcmQgPSBtZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nT3BlcmF0b3JLZXl3b3JkID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ09wZXJhdG9yS2V5d29yZCIsCiAgICBpbmRleDogMzEsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJPcGVyYXRvciBkZWNsYXJhdGlvbnMgbXVzdCBiZSBwcmVjZWRlZCBieSB0aGUga2V5d29yZCAnb3BlcmF0b3InLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgdGhlIGtleXdvcmQgJ29wZXJhdG9yJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVNaXNzaW5nUGFydE9mID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCwgYmVjYXVzZSBpdCBoYXMgbm8gJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTWlzc2luZ1BhcnRPZik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlTWlzc2luZ1BhcnRPZiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAiTWlzc2luZ1BhcnRPZiIsIHRlbXBsYXRlTWlzc2luZ1BhcnRPZiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9OT05fUEFSVCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNNaXNzaW5nUGFydE9mKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVNaXNzaW5nUGFydE9mLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdXNlICcke3VyaX0nIGFzIGEgcGFydCwgYmVjYXVzZSBpdCBoYXMgbm8gJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV99KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnQgPQogICAgbWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU1pc3NpbmdQcmVmaXhJbkRlZmVycmVkSW1wb3J0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWlzc2luZ1ByZWZpeEluRGVmZXJyZWRJbXBvcnQiLAogICAgaW5kZXg6IDMwLAogICAgbWVzc2FnZTogciIiIkRlZmVycmVkIGltcG9ydHMgc2hvdWxkIGhhdmUgYSBwcmVmaXguIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyBhIHByZWZpeCB0byB0aGUgaW1wb3J0IGJ5IGFkZGluZyBhbiAnYXMnIGNsYXVzZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzID0gbWVzc2FnZU1pc3NpbmdUeXBlZGVmUGFyYW1ldGVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfVFlQRURFRl9QQVJBTUVURVJTIl0sCiAgICBtZXNzYWdlOiByIiIiQSB0eXBlZGVmIG5lZWRzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgcGFyYW1ldGVycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgYWRkaW5nIGEgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIHR5cGVkZWYuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU1peGluRGVjbGFyZXNDb25zdHJ1Y3RvciA9IG1lc3NhZ2VNaXhpbkRlY2xhcmVzQ29uc3RydWN0b3I7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTWl4aW5EZWNsYXJlc0NvbnN0cnVjdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTWl4aW5EZWNsYXJlc0NvbnN0cnVjdG9yIiwKICAgIGluZGV4OiA5NSwKICAgIG1lc3NhZ2U6IHIiIiJNaXhpbnMgY2FuJ3QgZGVjbGFyZSBjb25zdHJ1Y3RvcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVNb2RpZmllck91dE9mT3JkZXIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtb2RpZmllciAnI3N0cmluZycgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJyNzdHJpbmcyJy4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZS1vcmRlcmluZyB0aGUgbW9kaWZpZXJzLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTW9kaWZpZXJPdXRPZk9yZGVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICBjb2RlTW9kaWZpZXJPdXRPZk9yZGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJNb2RpZmllck91dE9mT3JkZXIiLCB0ZW1wbGF0ZU1vZGlmaWVyT3V0T2ZPcmRlciwKICAgICAgICBpbmRleDogNTYpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c01vZGlmaWVyT3V0T2ZPcmRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVNb2RpZmllck91dE9mT3JkZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbW9kaWZpZXIgJyR7c3RyaW5nfScgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJyR7c3RyaW5nMn0nLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmUtb3JkZXJpbmcgdGhlIG1vZGlmaWVycy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIgPQogICAgbWVzc2FnZU1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlNVUEVSX0lOX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lICdzdXBlcicgb3IgJ3RoaXMnIGluaXRpYWxpemVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVNdWx0aXBsZUV4dGVuZHMgPSBtZXNzYWdlTXVsdGlwbGVFeHRlbmRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlRXh0ZW5kcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJNdWx0aXBsZUV4dGVuZHMiLAogICAgaW5kZXg6IDI4LAogICAgbWVzc2FnZTogciIiIkVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBleHRlbmRzIGNsYXVzZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSBjaG9vc2luZyBvbmUgc3VwZXJjbGFzcyBhbmQgZGVmaW5lIHlvdXIgY2xhc3MgdG8gaW1wbGVtZW50IChvciBtaXggaW4pIHRoZSBvdGhlcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU11bHRpcGxlSW1wbGVtZW50cyA9IG1lc3NhZ2VNdWx0aXBsZUltcGxlbWVudHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTXVsdGlwbGVJbXBsZW1lbnRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTXVsdGlwbGVJbXBsZW1lbnRzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJNVUxUSVBMRV9JTVBMRU1FTlRTX0NMQVVTRVMiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBpbXBsZW1lbnRzIGNsYXVzZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSBjb21iaW5pbmcgYWxsIG9mIHRoZSBpbXBsZW1lbnRzIGNsYXVzZXMgaW50byBhIHNpbmdsZSBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXMgPQogICAgbWVzc2FnZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTXVsdGlwbGVMaWJyYXJ5RGlyZWN0aXZlcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXMiLAogICAgaW5kZXg6IDI3LAogICAgbWVzc2FnZTogciIiIk9ubHkgb25lIGxpYnJhcnkgZGlyZWN0aXZlIG1heSBiZSBkZWNsYXJlZCBpbiBhIGZpbGUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9mIHRoZSBsaWJyYXJ5IGRpcmVjdGl2ZXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU11bHRpcGxlT25DbGF1c2VzID0gbWVzc2FnZU11bHRpcGxlT25DbGF1c2VzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU11bHRpcGxlT25DbGF1c2VzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTXVsdGlwbGVPbkNsYXVzZXMiLAogICAgaW5kZXg6IDI2LAogICAgbWVzc2FnZTogciIiIkVhY2ggbWl4aW4gZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBvbiBjbGF1c2UuIiIiLAogICAgdGlwOiByIiIiVHJ5IGNvbWJpbmluZyBhbGwgb2YgdGhlIG9uIGNsYXVzZXMgaW50byBhIHNpbmdsZSBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU11bHRpcGxlVmFyaWFuY2VNb2RpZmllcnMgPQogICAgbWVzc2FnZU11bHRpcGxlVmFyaWFuY2VNb2RpZmllcnM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTXVsdGlwbGVWYXJpYW5jZU1vZGlmaWVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk11bHRpcGxlVmFyaWFuY2VNb2RpZmllcnMiLAogICAgaW5kZXg6IDk3LAogICAgbWVzc2FnZTogciIiIkVhY2ggdHlwZSBwYXJhbWV0ZXIgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdmFyaWFuY2UgbW9kaWZpZXIuIiIiLAogICAgdGlwOiByIiIiVXNlIGF0IG1vc3Qgb25lIG9mIHRoZSAnaW4nLCAnb3V0Jywgb3IgJ2lub3V0JyBtb2RpZmllcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU11bHRpcGxlV2l0aCA9IG1lc3NhZ2VNdWx0aXBsZVdpdGg7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTXVsdGlwbGVXaXRoID0gY29uc3QgTWVzc2FnZUNvZGUoIk11bHRpcGxlV2l0aCIsCiAgICBpbmRleDogMjQsCiAgICBtZXNzYWdlOiByIiIiRWFjaCBjbGFzcyBkZWZpbml0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHdpdGggY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBjb21iaW5pbmcgYWxsIG9mIHRoZSB3aXRoIGNsYXVzZXMgaW50byBhIHNpbmdsZSBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9uID0gbWVzc2FnZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5BTUVEX0ZVTkNUSU9OX0VYUFJFU1NJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FuJ3QgaGF2ZSBhIG5hbWUuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MgJyNuYW1lJyBpbnRyb2R1Y2VzIGFuIGVycm9uZW91cyBvdmVycmlkZSBvZiAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05hbWVkTWl4aW5PdmVycmlkZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+IGNvZGVOYW1lZE1peGluT3ZlcnJpZGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAiTmFtZWRNaXhpbk92ZXJyaWRlIiwKICB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZSwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOYW1lZE1peGluT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOYW1lZE1peGluT3ZlcnJpZGUsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUaGUgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MgJyR7bmFtZX0nIGludHJvZHVjZXMgYW4gZXJyb25lb3VzIG92ZXJyaWRlIG9mICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiA9CiAgICBtZXNzYWdlTmF0aXZlQ2xhdXNlU2hvdWxkQmVBbm5vdGF0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbiIsCiAgICBpbmRleDogMjMsCiAgICBtZXNzYWdlOiByIiIiTmF0aXZlIGNsYXVzZSBpbiB0aGlzIGZvcm0gaXMgZGVwcmVjYXRlZC4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGlzIG5hdGl2ZSBjbGF1c2UgYW5kIGFkZGluZyBAbmF0aXZlKCkgb3IgQG5hdGl2ZSgnbmF0aXZlLW5hbWUnKSBiZWZvcmUgdGhlIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZU5vRm9ybWFscyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkEgZnVuY3Rpb24gc2hvdWxkIGhhdmUgZm9ybWFsIHBhcmFtZXRlcnMuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgJygpJyBhZnRlciAnI2xleGVtZScsIG9yIGFkZCAnZ2V0JyBiZWZvcmUgJyNsZXhlbWUnIHRvIGRlY2xhcmUgYSBnZXR0ZXIuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHMpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gY29kZU5vRm9ybWFscyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigiTm9Gb3JtYWxzIiwgdGVtcGxhdGVOb0Zvcm1hbHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHMoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9Gb3JtYWxzLAogICAgICBtZXNzYWdlOiAiIiJBIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGZvcm1hbCBwYXJhbWV0ZXJzLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IGFkZGluZyAnKCknIGFmdGVyICcke2xleGVtZX0nLCBvciBhZGQgJ2dldCcgYmVmb3JlICcke2xleGVtZX0nIHRvIGRlY2xhcmUgYSBnZXR0ZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb1N1Y2hOYW1lZFBhcmFtZXRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk5vU3VjaE5hbWVkUGFyYW1ldGVyIiwgdGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX05BTUVEX1BBUkFNRVRFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb1N1Y2hOYW1lZFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vU3VjaE5hbWVkUGFyYW1ldGVyLAogICAgICBtZXNzYWdlOiAiIiJObyBuYW1lZCBwYXJhbWV0ZXIgd2l0aCB0aGUgbmFtZSAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdCA9CiAgICBtZXNzYWdlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb1VubmFtZWRDb25zdHJ1Y3RvckluT2JqZWN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdCIsCiAgICBtZXNzYWdlOiByIiIiJ09iamVjdCcgaGFzIG5vIHVubmFtZWQgY29uc3RydWN0b3IuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgY2hhcmFjdGVyLAogICAgICAgIGludAogICAgICAgICAgICBjb2RlUG9pbnQpPiB0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllciA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIGNoYXJhY3RlciwgaW50IGNvZGVQb2ludCk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbm9uLUFTQ0lJIGNoYXJhY3RlciAnI2NoYXJhY3RlcicgKCN1bmljb2RlKSBjYW4ndCBiZSB1c2VkIGluIGlkZW50aWZpZXJzLCBvbmx5IGluIHN0cmluZ3MgYW5kIGNvbW1lbnRzLiIiIiwKICAgIHRpcFRlbXBsYXRlOgogICAgICAgIHIiIiJUcnkgdXNpbmcgYW4gVVMtQVNDSUkgbGV0dGVyLCBhIGRpZ2l0LCAnXycgKGFuIHVuZGVyc2NvcmUpLCBvciAnJCcgKGEgZG9sbGFyIHNpZ24pLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm9uQXNjaWlJZGVudGlmaWVyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgY2hhcmFjdGVyLCBpbnQgY29kZVBvaW50KT4KICAgIGNvZGVOb25Bc2NpaUlkZW50aWZpZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBjaGFyYWN0ZXIsIGludCBjb2RlUG9pbnQpPigKICAgICAgICAiTm9uQXNjaWlJZGVudGlmaWVyIiwgdGVtcGxhdGVOb25Bc2NpaUlkZW50aWZpZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklMTEVHQUxfQ0hBUkFDVEVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vbkFzY2lpSWRlbnRpZmllcihTdHJpbmcgY2hhcmFjdGVyLCBpbnQgY29kZVBvaW50KSB7CiAgaWYgKGNoYXJhY3Rlci5ydW5lcy5sZW5ndGggIT0gMSkgdGhyb3cgIk5vdCBhIGNoYXJhY3RlciAnJHtjaGFyYWN0ZXJ9JyI7CiAgU3RyaW5nIHVuaWNvZGUgPQogICAgICAiVSske2NvZGVQb2ludC50b1JhZGl4U3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZExlZnQoNCwgJzAnKX0iOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uQXNjaWlJZGVudGlmaWVyLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXIgJyR7Y2hhcmFjdGVyfScgKCR7dW5pY29kZX0pIGNhbid0IGJlIHVzZWQgaW4gaWRlbnRpZmllcnMsIG9ubHkgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuIiIiLAogICAgICB0aXA6ICIiIlRyeSB1c2luZyBhbiBVUy1BU0NJSSBsZXR0ZXIsIGEgZGlnaXQsICdfJyAoYW4gdW5kZXJzY29yZSksIG9yICdcJCcgKGEgZG9sbGFyIHNpZ24pLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NoYXJhY3Rlcic6IGNoYXJhY3RlciwgJ2NvZGVQb2ludCc6IGNvZGVQb2ludH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvZGVQb2ludCk+IHRlbXBsYXRlTm9uQXNjaWlXaGl0ZXNwYWNlID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBub24tQVNDSUkgc3BhY2UgY2hhcmFjdGVyICN1bmljb2RlIGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb25Bc2NpaVdoaXRlc3BhY2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb2RlUG9pbnQpPiBjb2RlTm9uQXNjaWlXaGl0ZXNwYWNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY29kZVBvaW50KT4oCiAgICAgICAgIk5vbkFzY2lpV2hpdGVzcGFjZSIsIHRlbXBsYXRlTm9uQXNjaWlXaGl0ZXNwYWNlLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTExFR0FMX0NIQVJBQ1RFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb25Bc2NpaVdoaXRlc3BhY2UoaW50IGNvZGVQb2ludCkgewogIFN0cmluZyB1bmljb2RlID0KICAgICAgIlUrJHtjb2RlUG9pbnQudG9SYWRpeFN0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRMZWZ0KDQsICcwJyl9IjsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vbkFzY2lpV2hpdGVzcGFjZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBub24tQVNDSUkgc3BhY2UgY2hhcmFjdGVyICR7dW5pY29kZX0gY2FuIG9ubHkgYmUgdXNlZCBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeydjb2RlUG9pbnQnOiBjb2RlUG9pbnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uQ29uc3RDb25zdHJ1Y3RvciA9IG1lc3NhZ2VOb25Db25zdENvbnN0cnVjdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25Db25zdENvbnN0cnVjdG9yIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQ09OU1RBTlRfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2Fubm90IGludm9rZSBhIG5vbi0nY29uc3QnIGNvbnN0cnVjdG9yIHdoZXJlIGEgY29uc3QgZXhwcmVzc2lvbiBpcyBleHBlY3RlZC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgdXNpbmcgYSBjb25zdHJ1Y3RvciBvciBmYWN0b3J5IHRoYXQgaXMgJ2NvbnN0Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uQ29uc3RGYWN0b3J5ID0gbWVzc2FnZU5vbkNvbnN0RmFjdG9yeTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25Db25zdEZhY3RvcnkgPSBjb25zdCBNZXNzYWdlQ29kZSgiTm9uQ29uc3RGYWN0b3J5IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT1RfQ09OU1RBTlRfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQ2Fubm90IGludm9rZSBhIG5vbi0nY29uc3QnIGZhY3Rvcnkgd2hlcmUgYSBjb25zdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkLiIiIiwKICAgIHRpcDogciIiIlRyeSB1c2luZyBhIGNvbnN0cnVjdG9yIG9yIGZhY3RvcnkgdGhhdCBpcyAnY29uc3QnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSA9CiAgICBtZXNzYWdlTm9uSW5zdGFuY2VUeXBlVmFyaWFibGVVc2U7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm9uSW5zdGFuY2VUeXBlVmFyaWFibGVVc2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFRF9CWV9TVEFUSUMiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4gb25seSB1c2UgdHlwZSB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgbWV0aG9kcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsID0gbWVzc2FnZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25OdWxsQXdhcmVTcHJlYWRJc051bGwgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25OdWxsQXdhcmVTcHJlYWRJc051bGwiLAogICAgbWVzc2FnZTogciIiIkNhbid0IHNwcmVhZCBhIHZhbHVlIHdpdGggc3RhdGljIHR5cGUgTnVsbC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVOb25OdWxsYWJsZU5vdEFzc2lnbmVkRXJyb3IgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIk5vbi1udWxsYWJsZSB2YXJpYWJsZSAnI25hbWUnIG11c3QgYmUgYXNzaWduZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm9uTnVsbGFibGVOb3RBc3NpZ25lZEVycm9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOb25OdWxsYWJsZU5vdEFzc2lnbmVkRXJyb3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIk5vbk51bGxhYmxlTm90QXNzaWduZWRFcnJvciIsCiAgdGVtcGxhdGVOb25OdWxsYWJsZU5vdEFzc2lnbmVkRXJyb3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm9uTnVsbGFibGVOb3RBc3NpZ25lZEVycm9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uTnVsbGFibGVOb3RBc3NpZ25lZEVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiTm9uLW51bGxhYmxlIHZhcmlhYmxlICcke25hbWV9JyBtdXN0IGJlIGFzc2lnbmVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlTm9uTnVsbGFibGVOb3RBc3NpZ25lZFdhcm5pbmcgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk5vbi1udWxsYWJsZSB2YXJpYWJsZSAnI25hbWUnIGlzIHVzZWQgYmVmb3JlIGl0J3MgYXNzaWduZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTm9uTnVsbGFibGVOb3RBc3NpZ25lZFdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU5vbk51bGxhYmxlTm90QXNzaWduZWRXYXJuaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJOb25OdWxsYWJsZU5vdEFzc2lnbmVkV2FybmluZyIsIHRlbXBsYXRlTm9uTnVsbGFibGVOb3RBc3NpZ25lZFdhcm5pbmcsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vbk51bGxhYmxlTm90QXNzaWduZWRXYXJuaW5nKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uTnVsbGFibGVOb3RBc3NpZ25lZFdhcm5pbmcsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJOb24tbnVsbGFibGUgdmFyaWFibGUgJyR7bmFtZX0nIGlzIHVzZWQgYmVmb3JlIGl0J3MgYXNzaWduZWQuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uTnVsbGFibGVPcHRPdXQgPSBtZXNzYWdlTm9uTnVsbGFibGVPcHRPdXQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm9uTnVsbGFibGVPcHRPdXQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25OdWxsYWJsZU9wdE91dCIsCiAgICBtZXNzYWdlOiByIiIiTnVsbCBzYWZldHkgZmVhdHVyZXMgYXJlIGRpc2FibGVkIGZvciB0aGlzIGxpYnJhcnkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGBAZGFydD1gIGFubm90YXRpb24gb3Igc2V0dGluZyB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiB0byBhdCBsZWFzdCBgQGRhcnQ9Mi43YC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlTm9uTnVsbGFibGVPcHRPdXRDb21tZW50ID0gbWVzc2FnZU5vbk51bGxhYmxlT3B0T3V0Q29tbWVudDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb25OdWxsYWJsZU9wdE91dENvbW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJOb25OdWxsYWJsZU9wdE91dENvbW1lbnQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJUaGlzIGlzIHRoZSBhbm5vdGF0aW9uIHRoYXQgb3B0cyBvdXQgdGhpcyBsaWJyYXJ5IGZyb20gbnVsbCBzYWZldHkgZmVhdHVyZXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydCA9IG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fUEFSVF9PRl9ESVJFQ1RJVkVfSU5fUEFSVCJdLAogICAgbWVzc2FnZTogciIiIlRoZSBwYXJ0LW9mIGRpcmVjdGl2ZSBtdXN0IGJlIHRoZSBvbmx5IGRpcmVjdGl2ZSBpbiBhIHBhcnQuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIG90aGVyIGRpcmVjdGl2ZXMsIG9yIG1vdmluZyB0aGVtIHRvIHRoZSBsaWJyYXJ5IGZvciB3aGljaCB0aGlzIGlzIGEgcGFydC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlIiwgdGVtcGxhdGVOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZSwKICAgICAgbWVzc2FnZTogIiIiQm91bmQgb2YgdGhpcyB2YXJpYWJsZSByZWZlcmVuY2VzIHJhdyB0eXBlICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUpPiB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyB2YXJpYWJsZSAnI25hbWUnIGZyb20gdGhlIHNhbWUgZGVjbGFyYXRpb24uIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlIiwgdGVtcGxhdGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyB2YXJpYWJsZSAnJHtuYW1lfScgZnJvbSB0aGUgc2FtZSBkZWNsYXJhdGlvbi4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb3RBQ29uc3RhbnRFeHByZXNzaW9uID0gbWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk5vdEFDb25zdGFudEV4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiTm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lMik+IHRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24gPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiJyNuYW1lLiNuYW1lMicgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYmVjYXVzZSAnI25hbWUnIGRvZXNuJ3QgcmVmZXIgdG8gYW4gaW1wb3J0IHByZWZpeC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiIsIHRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9BX1RZUEUiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm90QVByZWZpeEluVHlwZUFubm90YXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIicke25hbWV9LiR7bmFtZTJ9JyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcke25hbWV9JyBkb2Vzbid0IHJlZmVyIHRvIGFuIGltcG9ydCBwcmVmaXguIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZU5vdEFUeXBlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzbid0IGEgdHlwZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOb3RBVHlwZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTm90QVR5cGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIk5vdEFUeXBlIiwgdGVtcGxhdGVOb3RBVHlwZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FfVFlQRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOb3RBVHlwZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vdEFUeXBlLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXNuJ3QgYSB0eXBlLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU5vdEFUeXBlQ29udGV4dCA9IG1lc3NhZ2VOb3RBVHlwZUNvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlTm90QVR5cGVDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoIk5vdEFUeXBlQ29udGV4dCIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwgbWVzc2FnZTogciIiIlRoaXMgaXNuJ3QgYSB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVOb3RBbkx2YWx1ZSA9IG1lc3NhZ2VOb3RBbkx2YWx1ZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOb3RBbkx2YWx1ZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJOb3RBbkx2YWx1ZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FOX0xWQUxVRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IGFzc2lnbiB0byB0aGlzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVOb3RCaW5hcnlPcGVyYXRvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNsZXhlbWUnIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdEJpbmFyeU9wZXJhdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVOb3RCaW5hcnlPcGVyYXRvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPigKICAiTm90QmluYXJ5T3BlcmF0b3IiLAogIHRlbXBsYXRlTm90QmluYXJ5T3BlcmF0b3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzTm90QmluYXJ5T3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTm90QmluYXJ5T3BlcmF0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIicke2xleGVtZX0nIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiI3N0cmluZyBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVOb3RDb25zdGFudEV4cHJlc3Npb24gPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiTm90Q29uc3RhbnRFeHByZXNzaW9uIiwgdGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9DT05TVEFOVF9FWFBSRVNTSU9OIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbihTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU5vdENvbnN0YW50RXhwcmVzc2lvbiwKICAgICAgbWVzc2FnZTogIiIiJHtzdHJpbmd9IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU51bGxBd2FyZUNhc2NhZGVPdXRPZk9yZGVyID0KICAgIG1lc3NhZ2VOdWxsQXdhcmVDYXNjYWRlT3V0T2ZPcmRlcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VOdWxsQXdhcmVDYXNjYWRlT3V0T2ZPcmRlciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk51bGxBd2FyZUNhc2NhZGVPdXRPZk9yZGVyIiwKICAgIGluZGV4OiA5NiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSAnPy4uJyBjYXNjYWRlIG9wZXJhdG9yIG11c3QgYmUgZmlyc3QgaW4gdGhlIGNhc2NhZGUgc2VxdWVuY2UuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbW92aW5nIHRoZSAnPy4uJyBvcGVyYXRvciB0byBiZSB0aGUgZmlyc3QgY2FzY2FkZSBvcGVyYXRvciBpbiB0aGUgc2VxdWVuY2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZU51bGxhYmxlSW50ZXJmYWNlRXJyb3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNhbid0IGltcGxlbWVudCAnI25hbWUnIGJlY2F1c2UgaXQncyBtYXJrZWQgd2l0aCAnPycuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTnVsbGFibGVJbnRlcmZhY2VFcnJvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTnVsbGFibGVJbnRlcmZhY2VFcnJvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiTnVsbGFibGVJbnRlcmZhY2VFcnJvciIsCiAgdGVtcGxhdGVOdWxsYWJsZUludGVyZmFjZUVycm9yLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c051bGxhYmxlSW50ZXJmYWNlRXJyb3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOdWxsYWJsZUludGVyZmFjZUVycm9yLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBpbXBsZW1lbnQgJyR7bmFtZX0nIGJlY2F1c2UgaXQncyBtYXJrZWQgd2l0aCAnPycuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJJbXBsZW1lbnRpbmcgJyNuYW1lJyBtYXJrZWQgd2l0aCAnPycuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOdWxsYWJsZUludGVyZmFjZVdhcm5pbmcgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk51bGxhYmxlSW50ZXJmYWNlV2FybmluZyIsIHRlbXBsYXRlTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5nLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZUludGVyZmFjZVdhcm5pbmcoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOdWxsYWJsZUludGVyZmFjZVdhcm5pbmcsCiAgICAgIG1lc3NhZ2U6ICIiIkltcGxlbWVudGluZyAnJHtuYW1lfScgbWFya2VkIHdpdGggJz8nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZU51bGxhYmxlTWl4aW5FcnJvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgbWl4ICcjbmFtZScgaW4gYmVjYXVzZSBpdCdzIG1hcmtlZCB3aXRoICc/Jy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOdWxsYWJsZU1peGluRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU51bGxhYmxlTWl4aW5FcnJvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiTnVsbGFibGVNaXhpbkVycm9yIiwKICB0ZW1wbGF0ZU51bGxhYmxlTWl4aW5FcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZU1peGluRXJyb3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOdWxsYWJsZU1peGluRXJyb3IsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IG1peCAnJHtuYW1lfScgaW4gYmVjYXVzZSBpdCdzIG1hcmtlZCB3aXRoICc/Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOdWxsYWJsZU1peGluV2FybmluZyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiTWl4aW5nIGluICcjbmFtZScgbWFya2VkIHdpdGggJz8nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c051bGxhYmxlTWl4aW5XYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOdWxsYWJsZU1peGluV2FybmluZyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiTnVsbGFibGVNaXhpbldhcm5pbmciLCB0ZW1wbGF0ZU51bGxhYmxlTWl4aW5XYXJuaW5nLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZU1peGluV2FybmluZyhTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU51bGxhYmxlTWl4aW5XYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJNaXhpbmcgaW4gJyR7bmFtZX0nIG1hcmtlZCB3aXRoICc/Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOdWxsYWJsZVN1cGVyY2xhc3NFcnJvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgZXh0ZW5kICcjbmFtZScgYmVjYXVzZSBpdCdzIG1hcmtlZCB3aXRoICc/Jy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOdWxsYWJsZVN1cGVyY2xhc3NFcnJvcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlTnVsbGFibGVTdXBlcmNsYXNzRXJyb3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIk51bGxhYmxlU3VwZXJjbGFzc0Vycm9yIiwKICB0ZW1wbGF0ZU51bGxhYmxlU3VwZXJjbGFzc0Vycm9yLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c051bGxhYmxlU3VwZXJjbGFzc0Vycm9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTnVsbGFibGVTdXBlcmNsYXNzRXJyb3IsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGV4dGVuZCAnJHtuYW1lfScgYmVjYXVzZSBpdCdzIG1hcmtlZCB3aXRoICc/Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlTnVsbGFibGVTdXBlcmNsYXNzV2FybmluZyA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiRXh0ZW5kaW5nICcjbmFtZScgbWFya2VkIHdpdGggJz8nLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c051bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU51bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmcgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk51bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmciLCB0ZW1wbGF0ZU51bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmcsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c051bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmcoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVOdWxsYWJsZVN1cGVyY2xhc3NXYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJFeHRlbmRpbmcgJyR7bmFtZX0nIG1hcmtlZCB3aXRoICc/Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOdWxsYWJsZVRlYXJvZmZFcnJvciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgdGVhciBvZmYgbWV0aG9kICcjbmFtZScgZnJvbSBhIHBvdGVudGlhbGx5IG51bGwgdmFsdWUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzTnVsbGFibGVUZWFyb2ZmRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU51bGxhYmxlVGVhcm9mZkVycm9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICJOdWxsYWJsZVRlYXJvZmZFcnJvciIsCiAgdGVtcGxhdGVOdWxsYWJsZVRlYXJvZmZFcnJvciwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZVRlYXJvZmZFcnJvcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU51bGxhYmxlVGVhcm9mZkVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiQ2FuJ3QgdGVhciBvZmYgbWV0aG9kICcke25hbWV9JyBmcm9tIGEgcG90ZW50aWFsbHkgbnVsbCB2YWx1ZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVOdWxsYWJsZVRlYXJvZmZXYXJuaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJUZWFyaW5nIG9mZiBtZXRob2QgJyNuYW1lJyBmcm9tIGEgcG90ZW50aWFsbHkgbnVsbCB2YWx1ZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNOdWxsYWJsZVRlYXJvZmZXYXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVOdWxsYWJsZVRlYXJvZmZXYXJuaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJOdWxsYWJsZVRlYXJvZmZXYXJuaW5nIiwgdGVtcGxhdGVOdWxsYWJsZVRlYXJvZmZXYXJuaW5nLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS53YXJuaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNOdWxsYWJsZVRlYXJvZmZXYXJuaW5nKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlTnVsbGFibGVUZWFyb2ZmV2FybmluZywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRlYXJpbmcgb2ZmIG1ldGhvZCAnJHtuYW1lfScgZnJvbSBhIHBvdGVudGlhbGx5IG51bGwgdmFsdWUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlT2JqZWN0RXh0ZW5kcyA9IG1lc3NhZ2VPYmplY3RFeHRlbmRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZU9iamVjdEV4dGVuZHMgPSBjb25zdCBNZXNzYWdlQ29kZSgiT2JqZWN0RXh0ZW5kcyIsCiAgICBtZXNzYWdlOiByIiIiVGhlIGNsYXNzICdPYmplY3QnIGNhbid0IGhhdmUgYSBzdXBlcmNsYXNzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVPYmplY3RJbXBsZW1lbnRzID0gbWVzc2FnZU9iamVjdEltcGxlbWVudHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlT2JqZWN0SW1wbGVtZW50cyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk9iamVjdEltcGxlbWVudHMiLAogICAgbWVzc2FnZTogciIiIlRoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCBpbXBsZW1lbnQgYW55dGhpbmcuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU9iamVjdE1peGVzSW4gPSBtZXNzYWdlT2JqZWN0TWl4ZXNJbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VPYmplY3RNaXhlc0luID0gY29uc3QgTWVzc2FnZUNvZGUoIk9iamVjdE1peGVzSW4iLAogICAgbWVzc2FnZTogciIiIlRoZSBjbGFzcyAnT2JqZWN0JyBjYW4ndCB1c2UgbWl4aW5zLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVPbmx5VHJ5ID0gbWVzc2FnZU9ubHlUcnk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlT25seVRyeSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJPbmx5VHJ5IiwKICAgIGluZGV4OiAyMCwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgdHJ5IGJsb2NrIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gJ29uJywgJ2NhdGNoJywgb3IgJ2ZpbmFsbHknIGNsYXVzZS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSBhZGRpbmcgZWl0aGVyIGEgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UsIG9yIHJlbW92ZSB0aGUgdHJ5IHN0YXRlbWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJPcGVyYXRvciAnI25hbWUnIHNob3VsZCBoYXZlIHplcm8gb3Igb25lIHBhcmFtZXRlci4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiV2l0aCB6ZXJvIHBhcmFtZXRlcnMsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJy1hJywgZm9ybWFsbHkga25vd24gYXMgJ3VuYXJ5LScuIFdpdGggb25lIHBhcmFtZXRlciwgaXQgaGFzIHRoZSBzeW50YWN0aWMgZm9ybSAnYSAtIGInLCBmb3JtYWxseSBrbm93biBhcyAnLScuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigiT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoIiwKICAgICAgICB0ZW1wbGF0ZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaCwgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bCiAgIldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9PUEVSQVRPUl9NSU5VUyIKXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoLAogICAgICBtZXNzYWdlOiAiIiJPcGVyYXRvciAnJHtuYW1lfScgc2hvdWxkIGhhdmUgemVybyBvciBvbmUgcGFyYW1ldGVyLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiV2l0aCB6ZXJvIHBhcmFtZXRlcnMsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJy1hJywgZm9ybWFsbHkga25vd24gYXMgJ3VuYXJ5LScuIFdpdGggb25lIHBhcmFtZXRlciwgaXQgaGFzIHRoZSBzeW50YWN0aWMgZm9ybSAnYSAtIGInLCBmb3JtYWxseSBrbm93biBhcyAnLScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJPcGVyYXRvciAnI25hbWUnIHNob3VsZG4ndCBoYXZlIGFueSBwYXJhbWV0ZXJzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAiLAogIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDAoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCwKICAgICAgbWVzc2FnZTogIiIiT3BlcmF0b3IgJyR7bmFtZX0nIHNob3VsZG4ndCBoYXZlIGFueSBwYXJhbWV0ZXJzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXIuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMSIsIHRlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDEsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9PUEVSQVRPUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxLAogICAgICBtZXNzYWdlOiAiIiJPcGVyYXRvciAnJHtuYW1lfScgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMiA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSBleGFjdGx5IHR3byBwYXJhbWV0ZXJzLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c09wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIiLCB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJXUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMiwKICAgICAgbWVzc2FnZTogIiIiT3BlcmF0b3IgJyR7bmFtZX0nIHNob3VsZCBoYXZlIGV4YWN0bHkgdHdvIHBhcmFtZXRlcnMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzID0KICAgIG1lc3NhZ2VPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzIiwKICAgIG1lc3NhZ2U6IHIiIiJBbiBvcGVyYXRvciBjYW4ndCBoYXZlIG9wdGlvbmFsIHBhcmFtZXRlcnMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZU9wZXJhdG9yV2l0aFR5cGVQYXJhbWV0ZXJzID0KICAgIG1lc3NhZ2VPcGVyYXRvcldpdGhUeXBlUGFyYW1ldGVyczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VPcGVyYXRvcldpdGhUeXBlUGFyYW1ldGVycyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIk9wZXJhdG9yV2l0aFR5cGVQYXJhbWV0ZXJzIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJUWVBFX1BBUkFNRVRFUl9PTl9PUEVSQVRPUiJdLAogICAgbWVzc2FnZTogciIiIlR5cGVzIHBhcmFtZXRlcnMgYXJlbid0IGFsbG93ZWQgd2hlbiBkZWZpbmluZyBhbiBvcGVyYXRvci4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIHR5cGUgcGFyYW1ldGVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGlzIGlzIHRoZSBvdmVycmlkZGVuIG1ldGhvZCAoJyNuYW1lJykuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGRlbk1ldGhvZENhdXNlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIk92ZXJyaWRkZW5NZXRob2RDYXVzZSIsIHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlLAogICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZGVuTWV0aG9kQ2F1c2UoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIlRoaXMgaXMgdGhlIG92ZXJyaWRkZW4gbWV0aG9kICgnJHtuYW1lfScpLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cyA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgaGFzIGZld2VyIG5hbWVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpPigKICAgICAgICAiT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzIiwgdGVtcGxhdGVPdmVycmlkZUZld2VyTmFtZWRBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfT1ZFUlJJREVfTkFNRUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIG1ldGhvZCAnJHtuYW1lfScgaGFzIGZld2VyIG5hbWVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZU92ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtZXRob2QgJyNuYW1lJyBoYXMgZmV3ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cyIsCiAgICAgICAgdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9QT1NJVElPTkFMIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c092ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzKAogICAgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGhhcyBmZXdlciBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcgbmFtZTIsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUzKT4gdGVtcGxhdGVPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgbWV0aG9kICcjbmFtZScgZG9lc24ndCBoYXZlIHRoZSBuYW1lZCBwYXJhbWV0ZXIgJyNuYW1lMicgb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIsIFN0cmluZyBuYW1lMyk+CiAgICBjb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMpPigKICAgICAgICAiT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyIiwKICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9PVkVSUklERV9OQU1FRCJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZU1pc21hdGNoTmFtZWRQYXJhbWV0ZXIoCiAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyLCBTdHJpbmcgbmFtZTMpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIGlmIChuYW1lMy5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTMgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUzKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlciwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGRvZXNuJ3QgaGF2ZSB0aGUgbmFtZWQgcGFyYW1ldGVyICcke25hbWUyfScgb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyR7bmFtZTN9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTIsICduYW1lMyc6IG5hbWUzfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBtZXRob2QgJyNuYW1lJyBoYXMgbW9yZSByZXF1aXJlZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c092ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cyIsIHRlbXBsYXRlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfT1ZFUlJJREVfUkVRVUlSRUQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMoU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBtZXRob2QgJyR7bmFtZX0nIGhhcyBtb3JlIHJlcXVpcmVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICcke25hbWUyfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICduYW1lMic6IG5hbWUyfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkRlY2xhcmVkIHR5cGUgdmFyaWFibGVzIG9mICcjbmFtZScgZG9lc24ndCBtYXRjaCB0aG9zZSBvbiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaCIsIHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzTWlzbWF0Y2gsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklOVkFMSURfTUVUSE9EX09WRVJSSURFX1RZUEVfUEFSQU1FVEVSUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaChTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIGlmIChuYW1lMi5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZTIgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUyKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJyR7bmFtZX0nIGRvZXNuJ3QgbWF0Y2ggdGhvc2Ugb24gb3ZlcnJpZGRlbiBtZXRob2QgJyR7bmFtZTJ9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPiB0ZW1wbGF0ZVBhY2thZ2VOb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIkNvdWxkIG5vdCByZXNvbHZlIHRoZSBwYWNrYWdlICcjbmFtZScgaW4gJyN1cmknLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhY2thZ2VOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4gY29kZVBhY2thZ2VOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgIlBhY2thZ2VOb3RGb3VuZCIsCiAgdGVtcGxhdGVQYWNrYWdlTm90Rm91bmQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUGFja2FnZU5vdEZvdW5kKFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVBhY2thZ2VOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiQ291bGQgbm90IHJlc29sdmUgdGhlIHBhY2thZ2UgJyR7bmFtZX0nIGluICcke3VyaX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiB0ZW1wbGF0ZVBhY2thZ2VzRmlsZUZvcm1hdCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogI3N0cmluZyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhY2thZ2VzRmlsZUZvcm1hdCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+IGNvZGVQYWNrYWdlc0ZpbGVGb3JtYXQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAiUGFja2FnZXNGaWxlRm9ybWF0IiwKICB0ZW1wbGF0ZVBhY2thZ2VzRmlsZUZvcm1hdCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNQYWNrYWdlc0ZpbGVGb3JtYXQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYWNrYWdlc0ZpbGVGb3JtYXQsCiAgICAgIG1lc3NhZ2U6ICIiIlByb2JsZW0gaW4gcGFja2FnZXMgY29uZmlndXJhdGlvbiBmaWxlOiAke3N0cmluZ30iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmd9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydEV4cG9ydCA9IG1lc3NhZ2VQYXJ0RXhwb3J0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRFeHBvcnQgPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydEV4cG9ydCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhQT1JUX09GX05PTl9MSUJSQVJZIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW4ndCBleHBvcnQgdGhpcyBmaWxlIGJlY2F1c2UgaXQgY29udGFpbnMgYSAncGFydCBvZicgZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhcnRFeHBvcnRDb250ZXh0ID0gbWVzc2FnZVBhcnRFeHBvcnRDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRFeHBvcnRDb250ZXh0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGFydEV4cG9ydENvbnRleHQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgZmlsZSB0aGF0IGNhbid0IGJlIGV4cG9ydGVkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0SW5QYXJ0ID0gbWVzc2FnZVBhcnRJblBhcnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGFydEluUGFydCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJQYXJ0SW5QYXJ0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOT05fUEFSVF9PRl9ESVJFQ1RJVkVfSU5fUEFSVCJdLAogICAgbWVzc2FnZTogciIiIkEgZmlsZSB0aGF0J3MgYSBwYXJ0IG9mIGEgbGlicmFyeSBjYW4ndCBoYXZlIHBhcnRzIGl0c2VsZi4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSAncGFydCcgZGVjbGFyYXRpb24gdG8gdGhlIGNvbnRhaW5pbmcgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydEluUGFydExpYnJhcnlDb250ZXh0ID0gbWVzc2FnZVBhcnRJblBhcnRMaWJyYXJ5Q29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgY29udGFpbmluZyBsaWJyYXJ5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZVBhcnRPZkluTGlicmFyeSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiQ2FuJ3QgaW1wb3J0ICcjdXJpJywgYmVjYXVzZSBpdCBoYXMgYSAncGFydCBvZicgZGVjbGFyYXRpb24uIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLCBvciB1c2luZyAnI3VyaScgYXMgYSBwYXJ0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzUGFydE9mSW5MaWJyYXJ5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVQYXJ0T2ZJbkxpYnJhcnkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4oCiAgICAgICAgIlBhcnRPZkluTGlicmFyeSIsIHRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5LAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTVBPUlRfT0ZfTk9OX0xJQlJBUlkiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUGFydE9mSW5MaWJyYXJ5KFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0T2ZJbkxpYnJhcnksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBpbXBvcnQgJyR7dXJpfScsIGJlY2F1c2UgaXQgaGFzIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIiwKICAgICAgdGlwOgogICAgICAgICAgIiIiVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24sIG9yIHVzaW5nICcke3VyaX0nIGFzIGEgcGFydC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBVcmkgdXJpXywKICAgICAgICBTdHJpbmcgbmFtZSwKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZTIpPiB0ZW1wbGF0ZVBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2ggPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjbmFtZScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUyJy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoIiwgdGVtcGxhdGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJQQVJUX09GX0RJRkZFUkVOVF9MSUJSQVJZIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2goCiAgICBVcmkgdXJpXywgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBpZiAobmFtZTIuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUyID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVXNpbmcgJyR7dXJpfScgYXMgcGFydCBvZiAnJHtuYW1lfScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnJHtuYW1lMn0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9mU2VsZiA9IG1lc3NhZ2VQYXJ0T2ZTZWxmOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPZlNlbGYgPSBjb25zdCBNZXNzYWdlQ29kZSgiUGFydE9mU2VsZiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9OT05fUEFSVCJdLAogICAgbWVzc2FnZTogciIiIkEgZmlsZSBjYW4ndCBiZSBhIHBhcnQgb2YgaXRzZWxmLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T2ZUd2ljZSA9IG1lc3NhZ2VQYXJ0T2ZUd2ljZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0T2ZUd2ljZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJQYXJ0T2ZUd2ljZSIsCiAgICBpbmRleDogMjUsCiAgICBtZXNzYWdlOiByIiIiT25seSBvbmUgcGFydC1vZiBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgb2YgdGhlIHBhcnQtb2YgZGlyZWN0aXZlcy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGFydE9mVHdvTGlicmFyaWVzID0gbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0T2ZUd29MaWJyYXJpZXMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBBUlRfT0ZfRElGRkVSRU5UX0xJQlJBUlkiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIGZpbGUgY2FuJ3QgYmUgcGFydCBvZiBtb3JlIHRoYW4gb25lIGxpYnJhcnkuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbW92aW5nIHRoZSBzaGFyZWQgZGVjbGFyYXRpb25zIGludG8gdGhlIGxpYnJhcmllcywgb3IgaW50byBhIG5ldyBsaWJyYXJ5LiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0ID0KICAgIG1lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlVzZWQgYXMgYSBwYXJ0IGluIHRoaXMgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFVyaSB1cmlfLAogICAgICAgIFVyaSB1cmkyXywKICAgICAgICBVcmkKICAgICAgICAgICAgdXJpM18pPiB0ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgVXJpIHVyaTJfLCBVcmkgdXJpM18pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVXNpbmcgJyN1cmknIGFzIHBhcnQgb2YgJyN1cmkyJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcjdXJpMycuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNQYXJ0T2ZVcmlNaXNtYXRjaCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFVyaSB1cmkyXywgVXJpIHVyaTNfKT4KICAgIGNvZGVQYXJ0T2ZVcmlNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8sIFVyaSB1cmkyXywgVXJpIHVyaTNfKT4oCiAgICAgICAgIlBhcnRPZlVyaU1pc21hdGNoIiwgdGVtcGxhdGVQYXJ0T2ZVcmlNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9ESUZGRVJFTlRfTElCUkFSWSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNQYXJ0T2ZVcmlNaXNtYXRjaChVcmkgdXJpXywgVXJpIHVyaTJfLCBVcmkgdXJpM18pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICBTdHJpbmcgdXJpMiA9IHJlbGF0aXZpemVVcmkodXJpMl8pOwogIFN0cmluZyB1cmkzID0gcmVsYXRpdml6ZVVyaSh1cmkzXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0T2ZVcmlNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlVzaW5nICcke3VyaX0nIGFzIHBhcnQgb2YgJyR7dXJpMn0nIGJ1dCBpdHMgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHNheXMgJyR7dXJpM30nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl8sICd1cmkzJzogdXJpM199KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFVyaSB1cmlfLAogICAgICAgIFVyaSB1cmkyXywKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlUGFydE9mVXNlVXJpID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgVXJpIHVyaTJfLCBTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJVc2luZyAnI3VyaScgYXMgcGFydCBvZiAnI3VyaTInIGJ1dCBpdHMgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHNheXMgJyNuYW1lJy4iIiIsCiAgICB0aXBUZW1wbGF0ZToKICAgICAgICByIiIiVHJ5IGNoYW5naW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24gdG8gdXNlIGEgcmVsYXRpdmUgZmlsZSBuYW1lLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzUGFydE9mVXNlVXJpKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgVXJpIHVyaTJfLCBTdHJpbmcgbmFtZSk+CiAgICBjb2RlUGFydE9mVXNlVXJpID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXywgVXJpIHVyaTJfLCBTdHJpbmcgbmFtZSk+KAogICAgICAgICJQYXJ0T2ZVc2VVcmkiLCB0ZW1wbGF0ZVBhcnRPZlVzZVVyaSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUEFSVF9PRl9VTk5BTUVEX0xJQlJBUlkiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUGFydE9mVXNlVXJpKFVyaSB1cmlfLCBVcmkgdXJpMl8sIFN0cmluZyBuYW1lKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgU3RyaW5nIHVyaTIgPSByZWxhdGl2aXplVXJpKHVyaTJfKTsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0T2ZVc2VVcmksCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJVc2luZyAnJHt1cml9JyBhcyBwYXJ0IG9mICcke3VyaTJ9JyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcke25hbWV9Jy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24gdG8gdXNlIGEgcmVsYXRpdmUgZmlsZSBuYW1lLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3VyaSc6IHVyaV8sICd1cmkyJzogdXJpMl8sICduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXJ0T3JwaGFuID0gbWVzc2FnZVBhcnRPcnBoYW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGFydE9ycGhhbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJQYXJ0T3JwaGFuIiwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIHBhcnQgZG9lc24ndCBoYXZlIGEgY29udGFpbmluZyBsaWJyYXJ5LiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVQYXJ0VHdpY2UgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IHVzZSAnI3VyaScgYXMgYSBwYXJ0IG1vcmUgdGhhbiBvbmNlLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1BhcnRUd2ljZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlUGFydFR3aWNlID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KCJQYXJ0VHdpY2UiLCB0ZW1wbGF0ZVBhcnRUd2ljZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRFVQTElDQVRFX1BBUlQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUGFydFR3aWNlKFVyaSB1cmlfKSB7CiAgU3RyaW5nIHVyaSA9IHJlbGF0aXZpemVVcmkodXJpXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVQYXJ0VHdpY2UsCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IHVzZSAnJHt1cml9JyBhcyBhIHBhcnQgbW9yZSB0aGFuIG9uY2UuIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXRjaENsYXNzT3JpZ2luID0gbWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGF0Y2hDbGFzc09yaWdpbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBhdGNoQ2xhc3NPcmlnaW4iLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBpcyB0aGUgb3JpZ2luIGNsYXNzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoID0KICAgIG1lc3NhZ2VQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhdGNoQ2xhc3NUeXBlVmFyaWFibGVzTWlzbWF0Y2ggPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoIiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgcGF0Y2ggY2xhc3MgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiB0eXBlIHZhcmlhYmxlcyBhcyBpdHMgb3JpZ2luIGNsYXNzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2ggPSBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaCIsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBwYXRjaCBkb2Vzbid0IG1hdGNoIG9yaWdpbiBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpbiA9IG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQYXRjaERlY2xhcmF0aW9uT3JpZ2luIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoaXMgaXMgdGhlIG9yaWdpbiBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPgogICAgdGVtcGxhdGVQYXRjaEluamVjdGlvbkZhaWxlZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGluamVjdCAnI25hbWUnIGludG8gJyN1cmknLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSBhZGRpbmcgJ0BwYXRjaCcuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzUGF0Y2hJbmplY3Rpb25GYWlsZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXyk+IGNvZGVQYXRjaEluamVjdGlvbkZhaWxlZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgIlBhdGNoSW5qZWN0aW9uRmFpbGVkIiwKICB0ZW1wbGF0ZVBhdGNoSW5qZWN0aW9uRmFpbGVkLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1BhdGNoSW5qZWN0aW9uRmFpbGVkKFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVBhdGNoSW5qZWN0aW9uRmFpbGVkLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCBpbmplY3QgJyR7bmFtZX0nIGludG8gJyR7dXJpfScuIiIiLAogICAgICB0aXA6ICIiIlRyeSBhZGRpbmcgJ0BwYXRjaCcuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWUsICd1cmknOiB1cmlffSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBhdGNoTm9uRXh0ZXJuYWwgPSBtZXNzYWdlUGF0Y2hOb25FeHRlcm5hbDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQYXRjaE5vbkV4dGVybmFsID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUGF0Y2hOb25FeHRlcm5hbCIsCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJDYW4ndCBhcHBseSB0aGlzIHBhdGNoIGFzIGl0cyBvcmlnaW4gZGVjbGFyYXRpb24gaXNuJ3QgZXh0ZXJuYWwuIiIiLAogICAgdGlwOiByIiIiVHJ5IGFkZGluZyAnZXh0ZXJuYWwnIHRvIHRoZSBvcmlnaW4gZGVjbGFyYXRpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MgPQogICAgbWVzc2FnZVBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlUGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2VzcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlBsYXRmb3JtUHJpdmF0ZUxpYnJhcnlBY2Nlc3MiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIklNUE9SVF9JTlRFUk5BTF9MSUJSQVJZIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgYWNjZXNzIHBsYXRmb3JtIHByaXZhdGUgbGlicmFyeS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudCA9CiAgICBtZXNzYWdlUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUE9TSVRJT05BTF9BRlRFUl9OQU1FRF9BUkdVTUVOVCJdLAogICAgbWVzc2FnZTogciIiIlBsYWNlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBuYW1lZCBhcmd1bWVudHMuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbW92aW5nIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IGJlZm9yZSB0aGUgbmFtZWQgYXJndW1lbnRzLCBvciBhZGQgYSBuYW1lIHRvIHRoZSBhcmd1bWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUG9zaXRpb25hbFBhcmFtZXRlcldpdGhFcXVhbHMgPQogICAgbWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUG9zaXRpb25hbFBhcmFtZXRlcldpdGhFcXVhbHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX1NFUEFSQVRPUl9GT1JfUE9TSVRJT05BTF9QQVJBTUVURVIiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlBvc2l0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4ndCB1c2UgJzonIHRvIHNwZWNpZnkgYSBkZWZhdWx0IHZhbHVlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZXBsYWNpbmcgJzonIHdpdGggJz0nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVQcmVmaXhBZnRlckNvbWJpbmF0b3IgPSBtZXNzYWdlUHJlZml4QWZ0ZXJDb21iaW5hdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVByZWZpeEFmdGVyQ29tYmluYXRvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlByZWZpeEFmdGVyQ29tYmluYXRvciIsCiAgICBpbmRleDogNiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBwcmVmaXggKCdhcycgY2xhdXNlKSBzaG91bGQgY29tZSBiZWZvcmUgYW55IHNob3cvaGlkZSBjb21iaW5hdG9ycy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgbW92aW5nIHRoZSBwcmVmaXggYmVmb3JlIHRoZSBjb21iaW5hdG9ycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlUHJpdmF0ZU5hbWVkUGFyYW1ldGVyID0gbWVzc2FnZVByaXZhdGVOYW1lZFBhcmFtZXRlcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJQcml2YXRlTmFtZWRQYXJhbWV0ZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlBSSVZBVEVfT1BUSU9OQUxfUEFSQU1FVEVSIl0sCiAgICBtZXNzYWdlOiByIiIiQW4gb3B0aW9uYWwgbmFtZWQgcGFyYW1ldGVyIGNhbid0IHN0YXJ0IHdpdGggJ18nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZWRpcmVjdGluZ0NvbnN0cnVjdG9yV2l0aEJvZHkgPQogICAgbWVzc2FnZVJlZGlyZWN0aW5nQ29uc3RydWN0b3JXaXRoQm9keTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZWRpcmVjdGluZ0NvbnN0cnVjdG9yV2l0aEJvZHkgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJSZWRpcmVjdGluZ0NvbnN0cnVjdG9yV2l0aEJvZHkiLAogICAgaW5kZXg6IDIyLAogICAgbWVzc2FnZTogciIiIlJlZGlyZWN0aW5nIGNvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIGEgYm9keS4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgYm9keSwgb3Igbm90IG1ha2luZyB0aGlzIGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5ID0gbWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmVkaXJlY3Rpb25Jbk5vbkZhY3RvcnkiLAogICAgaW5kZXg6IDIxLAogICAgbWVzc2FnZTogciIiIk9ubHkgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4gc3BlY2lmeSAnPScgcmVkaXJlY3Rpb24uIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgbWFraW5nIHRoaXMgYSBmYWN0b3J5IGNvbnN0cnVjdG9yLCBvciByZW1vdmUgdGhlIHJlZGlyZWN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJyNuYW1lJyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1JlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQiLCB0ZW1wbGF0ZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFRElSRUNUX1RPX01JU1NJTkdfQ09OU1RSVUNUT1IiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlJlZGlyZWN0aW9uIGNvbnN0cnVjdG9yIHRhcmdldCBub3QgZm91bmQ6ICcke25hbWV9JyIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIk5hbWVkIHBhcmFtZXRlciAnI25hbWUnIGlzIHJlcXVpcmVkIGFuZCBjYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgIlJlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVFcnJvciIsCiAgdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZUVycm9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZUVycm9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiTmFtZWQgcGFyYW1ldGVyICcke25hbWV9JyBpcyByZXF1aXJlZCBhbmQgY2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVJlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVXYXJuaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJOYW1lZCBwYXJhbWV0ZXIgJyNuYW1lJyBpcyByZXF1aXJlZCBhbmQgaGFzIGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czoKICAgICAgICAgICAgX3dpdGhBcmd1bWVudHNSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlV2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgY29kZVJlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVXYXJuaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlV2FybmluZyIsCiAgICAgICAgdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlV2FybmluZywKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkud2FybmluZyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZVdhcm5pbmcoCiAgICBTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVJlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVXYXJuaW5nLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiTmFtZWQgcGFyYW1ldGVyICcke25hbWV9JyBpcyByZXF1aXJlZCBhbmQgaGFzIGEgZGVmYXVsdCB2YWx1ZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0ID0KICAgIG1lc3NhZ2VSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJlcXVpcmVkUGFyYW1ldGVyV2l0aERlZmF1bHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJOQU1FRF9QQVJBTUVURVJfT1VUU0lERV9HUk9VUCJdLAogICAgbWVzc2FnZTogciIiIk5vbi1vcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlLiIiIiwKICAgIHRpcDoKICAgICAgICByIiIiVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG1ha2luZyB0aGUgcGFyYW1ldGVyIG9wdGlvbmFsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZXRocm93Tm90Q2F0Y2ggPSBtZXNzYWdlUmV0aHJvd05vdENhdGNoOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJldGhyb3dOb3RDYXRjaCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJSZXRocm93Tm90Q2F0Y2giLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlJFVEhST1dfT1VUU0lERV9DQVRDSCJdLAogICAgbWVzc2FnZTogciIiIidyZXRocm93JyBjYW4gb25seSBiZSB1c2VkIGluIGNhdGNoIGNsYXVzZXMuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVJldHVybkZyb21Wb2lkRnVuY3Rpb24gPSBtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiUmV0dXJuRnJvbVZvaWRGdW5jdGlvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiUkVUVVJOX09GX0lOVkFMSURfVFlQRSJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IHJldHVybiBhIHZhbHVlIGZyb20gYSB2b2lkIGZ1bmN0aW9uLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uID0KICAgIG1lc3NhZ2VSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVJldHVyblR5cGVGdW5jdGlvbkV4cHJlc3Npb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uIiwKICAgIG1lc3NhZ2U6IHIiIiJBIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FuJ3QgaGF2ZSBhIHJldHVybiB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVSZXR1cm5XaXRob3V0RXhwcmVzc2lvbiA9IG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlJldHVybldpdGhvdXRFeHByZXNzaW9uIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJSRVRVUk5fV0lUSE9VVF9WQUxVRSJdLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcsCiAgICBtZXNzYWdlOiByIiIiTXVzdCBleHBsaWNpdGx5IHJldHVybiBhIHZhbHVlIGZyb20gYSBub24tdm9pZCBmdW5jdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IHRlbXBsYXRlU2RrUm9vdE5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTREsgcm9vdCBkaXJlY3Rvcnkgbm90IGZvdW5kOiAjdXJpLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Nka1Jvb3ROb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlU2RrUm9vdE5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICJTZGtSb290Tm90Rm91bmQiLAogIHRlbXBsYXRlU2RrUm9vdE5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Nka1Jvb3ROb3RGb3VuZChVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2RrUm9vdE5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJTREsgcm9vdCBkaXJlY3Rvcnkgbm90IGZvdW5kOiAke3VyaX0uIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgVXJpCiAgICAgICAgICAgIHVyaV8pPiB0ZW1wbGF0ZVNka1NwZWNpZmljYXRpb25Ob3RGb3VuZCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlNESyBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBub3QgZm91bmQ6ICN1cmkuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIk5vcm1hbGx5LCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBhIGZpbGUgbmFtZWQgJ2xpYnJhcmllcy5qc29uJyBpbiB0aGUgRGFydCBTREsgaW5zdGFsbCBsb2NhdGlvbi4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1Nka1NwZWNpZmljYXRpb25Ob3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiBjb2RlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICJTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQiLAogIHRlbXBsYXRlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kLAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Nka1NwZWNpZmljYXRpb25Ob3RGb3VuZChVcmkgdXJpXykgewogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kLAogICAgICBtZXNzYWdlOiAiIiJTREsgbGlicmFyaWVzIHNwZWNpZmljYXRpb24gbm90IGZvdW5kOiAke3VyaX0uIiIiLAogICAgICB0aXA6CiAgICAgICAgICAiIiJOb3JtYWxseSwgdGhlIHNwZWNpZmljYXRpb24gaXMgYSBmaWxlIG5hbWVkICdsaWJyYXJpZXMuanNvbicgaW4gdGhlIERhcnQgU0RLIGluc3RhbGwgbG9jYXRpb24uIiIiLAogICAgICBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVTZGtTdW1tYXJ5Tm90Rm91bmQgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlNESyBzdW1tYXJ5IG5vdCBmb3VuZDogI3VyaS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTZGtTdW1tYXJ5Tm90Rm91bmQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gY29kZVNka1N1bW1hcnlOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAiU2RrU3VtbWFyeU5vdEZvdW5kIiwKICB0ZW1wbGF0ZVNka1N1bW1hcnlOb3RGb3VuZCwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTZGtTdW1tYXJ5Tm90Rm91bmQoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVNka1N1bW1hcnlOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiU0RLIHN1bW1hcnkgbm90IGZvdW5kOiAke3VyaX0uIiIiLCBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPQogICAgbWVzc2FnZVNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMiLAogICAgbWVzc2FnZTogciIiIkEgc2V0IGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHlwZSBhcmd1bWVudC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMgPQogICAgbWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVNldE9yTWFwTGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMiLAogICAgbWVzc2FnZToKICAgICAgICByIiIiQSBzZXQgb3IgbWFwIGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgb3IgdHdvIHR5cGUgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZVNldHRlck5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTZXR0ZXIgbm90IGZvdW5kOiAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1NldHRlck5vdEZvdW5kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTZXR0ZXJOb3RGb3VuZCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU2V0dGVyTm90Rm91bmQiLCB0ZW1wbGF0ZVNldHRlck5vdEZvdW5kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfU0VUVEVSIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1NldHRlck5vdEZvdW5kKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU2V0dGVyTm90Rm91bmQsCiAgICAgIG1lc3NhZ2U6ICIiIlNldHRlciBub3QgZm91bmQ6ICcke25hbWV9Jy4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXR0ZXJOb3RTeW5jID0gbWVzc2FnZVNldHRlck5vdFN5bmM7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU2V0dGVyTm90U3luYyA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTZXR0ZXJOb3RTeW5jIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX01PRElGSUVSX09OX1NFVFRFUiJdLAogICAgbWVzc2FnZTogciIiIlNldHRlcnMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMgPQogICAgbWVzc2FnZVNldHRlcldpdGhXcm9uZ051bWJlck9mRm9ybWFsczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9TRVRURVIiXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBmb3JtYWwgcGFyYW1ldGVyLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgaW50IGNvdW50LAogICAgICAgIGludCBjb3VudDIsCiAgICAgICAgbnVtIF9udW0xLAogICAgICAgIG51bSBfbnVtMiwKICAgICAgICBudW0KICAgICAgICAgICAgX251bTMpPiB0ZW1wbGF0ZVNvdXJjZUJvZHlTdW1tYXJ5ID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwgbnVtIF9udW0zKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIkJ1aWx0IGJvZGllcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlU291cmNlQm9keVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiU291cmNlQm9keVN1bW1hcnkiLAogIHRlbXBsYXRlU291cmNlQm9keVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU291cmNlQm9keVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTb3VyY2VCb2R5U3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJ1aWx0IGJvZGllcyBmb3IgJHtjb3VudH0gY29tcGlsYXRpb24gdW5pdHMgKCR7Y291bnQyfSBieXRlcykgaW4gJHtudW0xfW1zLCB0aGF0IGlzLAoke251bTJ9IGJ5dGVzL21zLCBhbmQKJHtudW0zfSBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgICAgYXJndW1lbnRzOiB7CiAgICAgICAgJ2NvdW50JzogY291bnQsCiAgICAgICAgJ2NvdW50Mic6IGNvdW50MiwKICAgICAgICAnbnVtMSc6IF9udW0xLAogICAgICAgICdudW0yJzogX251bTIsCiAgICAgICAgJ251bTMnOiBfbnVtMwogICAgICB9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIGludCBjb3VudCwKICAgICAgICBpbnQgY291bnQyLAogICAgICAgIG51bSBfbnVtMSwKICAgICAgICBudW0gX251bTIsCiAgICAgICAgbnVtCiAgICAgICAgICAgIF9udW0zKT4gdGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeSA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgICAgIGludCBjb3VudCwgaW50IGNvdW50MiwgbnVtIF9udW0xLCBudW0gX251bTIsIG51bSBfbnVtMyk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJCdWlsdCBvdXRsaW5lcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyLCBudW0gX251bTEsIG51bSBfbnVtMiwKICAgICAgICBudW0gX251bTMpPiBjb2RlU291cmNlT3V0bGluZVN1bW1hcnkgPSBjb25zdCBDb2RlPAogICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpPigKICAiU291cmNlT3V0bGluZVN1bW1hcnkiLAogIHRlbXBsYXRlU291cmNlT3V0bGluZVN1bW1hcnksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU291cmNlT3V0bGluZVN1bW1hcnkoCiAgICBpbnQgY291bnQsIGludCBjb3VudDIsIG51bSBfbnVtMSwgbnVtIF9udW0yLCBudW0gX251bTMpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKF9udW0xID09IG51bGwpIHRocm93ICdObyBudW1iZXIgcHJvdmlkZWQnOwogIFN0cmluZyBudW0xID0gX251bTEudG9TdHJpbmdBc0ZpeGVkKDMpOwogIGlmIChfbnVtMiA9PSBudWxsKSB0aHJvdyAnTm8gbnVtYmVyIHByb3ZpZGVkJzsKICBTdHJpbmcgbnVtMiA9IF9udW0yLnRvU3RyaW5nQXNGaXhlZCgzKS5wYWRMZWZ0KDEyKTsKICBpZiAoX251bTMgPT0gbnVsbCkgdGhyb3cgJ05vIG51bWJlciBwcm92aWRlZCc7CiAgU3RyaW5nIG51bTMgPSBfbnVtMy50b1N0cmluZ0FzRml4ZWQoMykucGFkTGVmdCgxMik7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTb3VyY2VPdXRsaW5lU3VtbWFyeSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIkJ1aWx0IG91dGxpbmVzIGZvciAke2NvdW50fSBjb21waWxhdGlvbiB1bml0cyAoJHtjb3VudDJ9IGJ5dGVzKSBpbiAke251bTF9bXMsIHRoYXQgaXMsCiR7bnVtMn0gYnl0ZXMvbXMsIGFuZAoke251bTN9IG1zL2NvbXBpbGF0aW9uIHVuaXQuIiIiLAogICAgICBhcmd1bWVudHM6IHsKICAgICAgICAnY291bnQnOiBjb3VudCwKICAgICAgICAnY291bnQyJzogY291bnQyLAogICAgICAgICdudW0xJzogX251bTEsCiAgICAgICAgJ251bTInOiBfbnVtMiwKICAgICAgICAnbnVtMyc6IF9udW0zCiAgICAgIH0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTcHJlYWRFbGVtZW50ID0gbWVzc2FnZVNwcmVhZEVsZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3ByZWFkRWxlbWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTcHJlYWRFbGVtZW50IiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LCBtZXNzYWdlOiByIiIiSXRlcmFibGUgc3ByZWFkLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTcHJlYWRNYXBFbGVtZW50ID0gbWVzc2FnZVNwcmVhZE1hcEVsZW1lbnQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3ByZWFkTWFwRWxlbWVudCA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlNwcmVhZE1hcEVsZW1lbnQiLAogICAgc2V2ZXJpdHk6IFNldmVyaXR5LmNvbnRleHQsCiAgICBtZXNzYWdlOiByIiIiTWFwIHNwcmVhZC4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3RhY2tPdmVyZmxvdyA9IG1lc3NhZ2VTdGFja092ZXJmbG93OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YWNrT3ZlcmZsb3cgPSBjb25zdCBNZXNzYWdlQ29kZSgiU3RhY2tPdmVyZmxvdyIsCiAgICBpbmRleDogMTksCiAgICBtZXNzYWdlOiByIiIiVGhlIGZpbGUgaGFzIHRvbyBtYW55IG5lc3RlZCBleHByZXNzaW9ucyBvciBzdGF0ZW1lbnRzLiIiIiwKICAgIHRpcDogciIiIlRyeSBzaW1wbGlmeWluZyB0aGUgY29kZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdCA9CiAgICBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RJTkdfU1RBVElDX0FORF9JTlNUQU5DRSJdLAogICAgbWVzc2FnZTogciIiIlRoaXMgc3RhdGljIG1lbWJlciBjb25mbGljdHMgd2l0aCBhbiBpbnN0YW5jZSBtZW1iZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSA9CiAgICBtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZSIsCiAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCwKICAgIG1lc3NhZ2U6IHIiIiJUaGlzIGlzIHRoZSBpbnN0YW5jZSBtZW1iZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY0NvbnN0cnVjdG9yID0gbWVzc2FnZVN0YXRpY0NvbnN0cnVjdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY0NvbnN0cnVjdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3RhdGljQ29uc3RydWN0b3IiLAogICAgaW5kZXg6IDQsCiAgICBtZXNzYWdlOiByIiIiQ29uc3RydWN0b3JzIGNhbid0IGJlIHN0YXRpYy4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN0YXRpY09wZXJhdG9yID0gbWVzc2FnZVN0YXRpY09wZXJhdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0YXRpY09wZXJhdG9yID0gY29uc3QgTWVzc2FnZUNvZGUoIlN0YXRpY09wZXJhdG9yIiwKICAgIGluZGV4OiAxNywKICAgIG1lc3NhZ2U6IHIiIiJPcGVyYXRvcnMgY2FuJ3QgYmUgc3RhdGljLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnc3RhdGljJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJBc0V4cHJlc3Npb24gPSBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb24gPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdXBlckFzRXhwcmVzc2lvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU1VQRVJfQVNfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZTogciIiIkNhbid0IHVzZSAnc3VwZXInIGFzIGFuIGV4cHJlc3Npb24uIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUbyBkZWxlZ2F0ZSBhIGNvbnN0cnVjdG9yIHRvIGEgc3VwZXIgY29uc3RydWN0b3IsIHB1dCB0aGUgc3VwZXIgY2FsbCBhcyBhbiBpbml0aWFsaXplci4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJBc0lkZW50aWZpZXIgPSBtZXNzYWdlU3VwZXJBc0lkZW50aWZpZXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJBc0lkZW50aWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdXBlckFzSWRlbnRpZmllciIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiU1VQRVJfQVNfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZTogciIiIkV4cGVjdGVkIGlkZW50aWZpZXIsIGJ1dCBnb3QgJ3N1cGVyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJJbml0aWFsaXplck5vdExhc3QgPSBtZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3Q7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3QgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTdXBlckluaXRpYWxpemVyTm90TGFzdCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9TVVBFUl9JTlZPQ0FUSU9OIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgaGF2ZSBpbml0aWFsaXplcnMgYWZ0ZXIgJ3N1cGVyJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJOdWxsQXdhcmUgPSBtZXNzYWdlU3VwZXJOdWxsQXdhcmU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJOdWxsQXdhcmUgPSBjb25zdCBNZXNzYWdlQ29kZSgiU3VwZXJOdWxsQXdhcmUiLAogICAgaW5kZXg6IDE4LAogICAgbWVzc2FnZToKICAgICAgICByIiIiVGhlIG9wZXJhdG9yICc/LicgY2Fubm90IGJlIHVzZWQgd2l0aCAnc3VwZXInIGJlY2F1c2UgJ3N1cGVyJyBjYW5ub3QgYmUgbnVsbC4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVwbGFjaW5nICc/Licgd2l0aCAnLiciIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTdXBlcmNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3IiLCB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WwogICAgICAiVU5ERUZJTkVEX0NPTlNUUlVDVE9SX0lOX0lOSVRJQUxJWkVSIiwKICAgICAgIlVOREVGSU5FRF9DT05TVFJVQ1RPUl9JTl9JTklUSUFMSVpFUl9ERUZBVUxUIgogICAgXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvciwKICAgICAgbWVzc2FnZTogIiIiU3VwZXJjbGFzcyBoYXMgbm8gY29uc3RydWN0b3IgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcKICAgICAgICAgICAgbmFtZSk+IHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiJUaGUgc3VwZXJjbGFzcywgJyNuYW1lJywgaGFzIG5vIHVubmFtZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3RvciIsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfSU1QTElDSVQiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yLAogICAgICBtZXNzYWdlOgogICAgICAgICAgIiIiVGhlIHN1cGVyY2xhc3MsICcke25hbWV9JywgaGFzIG5vIHVubmFtZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vR2V0dGVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJTdXBlcmNsYXNzIGhhcyBubyBnZXR0ZXIgbmFtZWQgJyNuYW1lJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9HZXR0ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVN1cGVyY2xhc3NIYXNOb0dldHRlciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICAiU3VwZXJjbGFzc0hhc05vR2V0dGVyIiwgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9HZXR0ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVOREVGSU5FRF9TVVBFUl9HRVRURVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vR2V0dGVyKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlU3VwZXJjbGFzc0hhc05vR2V0dGVyLAogICAgICBtZXNzYWdlOiAiIiJTdXBlcmNsYXNzIGhhcyBubyBnZXR0ZXIgbmFtZWQgJyR7bmFtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb01ldGhvZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU3VwZXJjbGFzcyBoYXMgbm8gbWV0aG9kIG5hbWVkICcjbmFtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vTWV0aG9kKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcmNsYXNzSGFzTm9NZXRob2QgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVyY2xhc3NIYXNOb01ldGhvZCIsIHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vTWV0aG9kLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTkRFRklORURfU1VQRVJfTUVUSE9EIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb01ldGhvZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVN1cGVyY2xhc3NIYXNOb01ldGhvZCwKICAgICAgbWVzc2FnZTogIiIiU3VwZXJjbGFzcyBoYXMgbm8gbWV0aG9kIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXIgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlN1cGVyY2xhc3MgaGFzIG5vIHNldHRlciBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb1NldHRlcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJjbGFzc0hhc05vU2V0dGVyID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJTdXBlcmNsYXNzSGFzTm9TZXR0ZXIiLCB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb1NldHRlciwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX1NVUEVSX1NFVFRFUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9TZXR0ZXIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXIsCiAgICAgIG1lc3NhZ2U6ICIiIlN1cGVyY2xhc3MgaGFzIG5vIHNldHRlciBuYW1lZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIFN0cmluZwogICAgICAgICAgICBuYW1lKT4gdGVtcGxhdGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiU3VwZXJjbGFzcyBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJyNuYW1lJyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2giLAogIHRlbXBsYXRlU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2gsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2goU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaCwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlN1cGVyY2xhc3MgZG9lc24ndCBoYXZlIGEgbWV0aG9kIG5hbWVkICcke25hbWV9JyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTdXBlcnR5cGVJc0Z1bmN0aW9uID0gbWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3VwZXJ0eXBlSXNGdW5jdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlN1cGVydHlwZUlzRnVuY3Rpb24iLAogICAgbWVzc2FnZTogciIiIkNhbid0IHVzZSBhIGZ1bmN0aW9uIHR5cGUgYXMgc3VwZXJ0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWwgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzU3VwZXJ0eXBlSXNJbGxlZ2FsKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVTdXBlcnR5cGVJc0lsbGVnYWwgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVydHlwZUlzSWxsZWdhbCIsIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJFWFRFTkRTX05PTl9DTEFTUyJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc0lsbGVnYWwoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcnR5cGVJc0lsbGVnYWwsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSB0eXBlICcke25hbWV9JyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiVGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIGFzIHN1cGVydHlwZS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlN1cGVydHlwZUlzVHlwZVZhcmlhYmxlIiwgdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRVhURU5EU19OT05fQ0xBU1MiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZSwKICAgICAgbWVzc2FnZTogIiIiVGhlIHR5cGUgdmFyaWFibGUgJyR7bmFtZX0nIGNhbid0IGJlIHVzZWQgYXMgc3VwZXJ0eXBlLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVN3aXRjaENhc2VGYWxsVGhyb3VnaCA9IG1lc3NhZ2VTd2l0Y2hDYXNlRmFsbFRocm91Z2g7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiU3dpdGNoQ2FzZUZhbGxUaHJvdWdoIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJDQVNFX0JMT0NLX05PVF9URVJNSU5BVEVEIl0sCiAgICBtZXNzYWdlOiByIiIiU3dpdGNoIGNhc2UgbWF5IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlID0KICAgIG1lc3NhZ2VTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2UgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlIiwKICAgIHNldmVyaXR5OiBTZXZlcml0eS5jb250ZXh0LAogICAgbWVzc2FnZTogciIiIlRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpcyBoZXJlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0ID0KICAgIG1lc3NhZ2VTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0IiwKICAgIGluZGV4OiAxNiwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIlRoZSBkZWZhdWx0IGNhc2Ugc2hvdWxkIGJlIHRoZSBsYXN0IGNhc2UgaW4gYSBzd2l0Y2ggc3RhdGVtZW50LiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGRlZmF1bHQgY2FzZSBhZnRlciB0aGUgb3RoZXIgY2FzZSBjbGF1c2VzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzID0KICAgIG1lc3NhZ2VTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzIiwKICAgIGluZGV4OiAxNSwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgJ2RlZmF1bHQnIGNhc2UgY2FuIG9ubHkgYmUgZGVjbGFyZWQgb25jZS4iIiIsCiAgICB0aXA6IHIiIiJUcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgZGVmYXVsdCBjYXNlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVTeW50aGV0aWNUb2tlbiA9IG1lc3NhZ2VTeW50aGV0aWNUb2tlbjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VTeW50aGV0aWNUb2tlbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJTeW50aGV0aWNUb2tlbiIsCiAgICBtZXNzYWdlOiByIiIiVGhpcyBjb3VsZG4ndCBiZSBwYXJzZWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1RoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIiLCB0ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRISVNfQUNDRVNTX0ZST01fRklFTERfSU5JVElBTElaRVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplcihTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVGhpc0FzSWRlbnRpZmllciA9IG1lc3NhZ2VUaGlzQXNJZGVudGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVRoaXNBc0lkZW50aWZpZXIgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUaGlzQXNJZGVudGlmaWVyIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJJTlZBTElEX1JFRkVSRU5DRV9UT19USElTIl0sCiAgICBtZXNzYWdlOiByIiIiRXhwZWN0ZWQgaWRlbnRpZmllciwgYnV0IGdvdCAndGhpcycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVRoaXNJbml0aWFsaXplck5vdEFsb25lID0gbWVzc2FnZVRoaXNJbml0aWFsaXplck5vdEFsb25lOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVRoaXNJbml0aWFsaXplck5vdEFsb25lID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVGhpc0luaXRpYWxpemVyTm90QWxvbmUiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkZJRUxEX0lOSVRJQUxJWkVSX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SIl0sCiAgICBtZXNzYWdlOiByIiIiQ2FuJ3QgaGF2ZSBvdGhlciBpbml0aWFsaXplcnMgdG9nZXRoZXIgd2l0aCAndGhpcycuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICB0ZW1wbGF0ZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIkNhbid0IGFjY2VzcyAnI3N0cmluZycgaW4gYSBmaWVsZCBpbml0aWFsaXplci4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplcik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZyk+CiAgICBjb2RlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICAiVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIiLAogICAgICAgIHRlbXBsYXRlVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRISVNfQUNDRVNTX0ZST01fSU5JVElBTElaRVIiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVGhpc09yU3VwZXJBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplciwKICAgICAgbWVzc2FnZTogIiIiQ2FuJ3QgYWNjZXNzICcke3N0cmluZ30nIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBpbnQgY291bnQsCiAgICAgICAgaW50CiAgICAgICAgICAgIGNvdW50Mik+IHRlbXBsYXRlVG9vRmV3QXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVG9vIGZldyBwb3NpdGlvbmFsIGFyZ3VtZW50czogI2NvdW50IHJlcXVpcmVkLCAjY291bnQyIGdpdmVuLiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVG9vRmV3QXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPiBjb2RlVG9vRmV3QXJndW1lbnRzID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgICAgICAiVG9vRmV3QXJndW1lbnRzIiwgdGVtcGxhdGVUb29GZXdBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk5PVF9FTk9VR0hfUkVRVUlSRURfQVJHVU1FTlRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Rvb0Zld0FyZ3VtZW50cyhpbnQgY291bnQsIGludCBjb3VudDIpIHsKICBpZiAoY291bnQgPT0gbnVsbCkgdGhyb3cgJ05vIGNvdW50IHByb3ZpZGVkJzsKICBpZiAoY291bnQyID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUb29GZXdBcmd1bWVudHMsCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiJUb28gZmV3IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAke2NvdW50fSByZXF1aXJlZCwgJHtjb3VudDJ9IGdpdmVuLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvdW50JzogY291bnQsICdjb3VudDInOiBjb3VudDJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8CiAgICBNZXNzYWdlIEZ1bmN0aW9uKAogICAgICAgIGludCBjb3VudCwKICAgICAgICBpbnQKICAgICAgICAgICAgY291bnQyKT4gdGVtcGxhdGVUb29NYW55QXJndW1lbnRzID0gY29uc3QgVGVtcGxhdGU8CiAgICAgICAgTWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPigKICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICByIiIiVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHM6ICNjb3VudCBhbGxvd2VkLCBidXQgI2NvdW50MiBmb3VuZC4iIiIsCiAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyB0aGUgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMuIiIiLAogICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUb29NYW55QXJndW1lbnRzKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQsIGludCBjb3VudDIpPiBjb2RlVG9vTWFueUFyZ3VtZW50cyA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50LCBpbnQgY291bnQyKT4oCiAgICAgICAgIlRvb01hbnlBcmd1bWVudHMiLCB0ZW1wbGF0ZVRvb01hbnlBcmd1bWVudHMsCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYVFJBX1BPU0lUSU9OQUxfQVJHVU1FTlRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1Rvb01hbnlBcmd1bWVudHMoaW50IGNvdW50LCBpbnQgY291bnQyKSB7CiAgaWYgKGNvdW50ID09IG51bGwpIHRocm93ICdObyBjb3VudCBwcm92aWRlZCc7CiAgaWYgKGNvdW50MiA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVG9vTWFueUFyZ3VtZW50cywKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAke2NvdW50fSBhbGxvd2VkLCBidXQgJHtjb3VudDJ9IGZvdW5kLiIiIiwKICAgICAgdGlwOiAiIiJUcnkgcmVtb3ZpbmcgdGhlIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvdW50JzogY291bnQsICdjb3VudDInOiBjb3VudDJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVG9wTGV2ZWxPcGVyYXRvciA9IG1lc3NhZ2VUb3BMZXZlbE9wZXJhdG9yOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVRvcExldmVsT3BlcmF0b3IgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUb3BMZXZlbE9wZXJhdG9yIiwKICAgIGluZGV4OiAxNCwKICAgIG1lc3NhZ2U6IHIiIiJPcGVyYXRvcnMgbXVzdCBiZSBkZWNsYXJlZCB3aXRoaW4gYSBjbGFzcy4iIiIsCiAgICB0aXA6CiAgICAgICAgciIiIlRyeSByZW1vdmluZyB0aGUgb3BlcmF0b3IsIG1vdmluZyBpdCB0byBhIGNsYXNzLCBvciBjb252ZXJ0aW5nIGl0IHRvIGJlIGEgZnVuY3Rpb24uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVR5cGVBZnRlclZhciA9IG1lc3NhZ2VUeXBlQWZ0ZXJWYXI7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZUFmdGVyVmFyID0gY29uc3QgTWVzc2FnZUNvZGUoIlR5cGVBZnRlclZhciIsCiAgICBpbmRleDogODksCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJWYXJpYWJsZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdXNpbmcgYm90aCAndmFyJyBhbmQgYSB0eXBlIG5hbWUuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nICd2YXIuJyIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+IHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2ggPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihpbnQgY291bnQpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJFeHBlY3RlZCAjY291bnQgdHlwZSBhcmd1bWVudHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50TWlzbWF0Y2gpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKGludCBjb3VudCk+IGNvZGVUeXBlQXJndW1lbnRNaXNtYXRjaCA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oaW50IGNvdW50KT4oCiAgICAgICAgIlR5cGVBcmd1bWVudE1pc21hdGNoIiwgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1R5cGVBcmd1bWVudE1pc21hdGNoKGludCBjb3VudCkgewogIGlmIChjb3VudCA9PSBudWxsKSB0aHJvdyAnTm8gY291bnQgcHJvdmlkZWQnOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZUFyZ3VtZW50TWlzbWF0Y2gsCiAgICAgIG1lc3NhZ2U6ICIiIkV4cGVjdGVkICR7Y291bnR9IHR5cGUgYXJndW1lbnRzLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J2NvdW50JzogY291bnR9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+CiAgICB0ZW1wbGF0ZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZSA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgICAgICByIiIiQ2FuJ3QgdXNlIHR5cGUgYXJndW1lbnRzIHdpdGggdHlwZSB2YXJpYWJsZSAnI25hbWUnLiIiIiwKICAgICAgICB0aXBUZW1wbGF0ZTogciIiIlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcmd1bWVudHMuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IGNvZGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZSIsIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLAogICAgICAgIGluZGV4OiAxMyk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLAogICAgICBtZXNzYWdlOiAiIiJDYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMgd2l0aCB0eXBlIHZhcmlhYmxlICcke25hbWV9Jy4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IHJlbW92aW5nIHRoZSB0eXBlIGFyZ3VtZW50cy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlQmVmb3JlRmFjdG9yeSA9IG1lc3NhZ2VUeXBlQmVmb3JlRmFjdG9yeTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlQmVmb3JlRmFjdG9yeSA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVCZWZvcmVGYWN0b3J5IiwKICAgIGluZGV4OiA1NywKICAgIG1lc3NhZ2U6IHIiIiJGYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlLiIiIiwKICAgIHRpcDogciIiIlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcHBlYXJpbmcgYmVmb3JlICdmYWN0b3J5Jy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlVHlwZU5vdEZvdW5kID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUeXBlICcjbmFtZScgbm90IGZvdW5kLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1R5cGVOb3RGb3VuZCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiBjb2RlVHlwZU5vdEZvdW5kID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJUeXBlTm90Rm91bmQiLCB0ZW1wbGF0ZVR5cGVOb3RGb3VuZCwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5ERUZJTkVEX0NMQVNTIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1R5cGVOb3RGb3VuZChTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVR5cGVOb3RGb3VuZCwKICAgICAgbWVzc2FnZTogIiIiVHlwZSAnJHtuYW1lfScgbm90IGZvdW5kLiIiIiwgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4gdGVtcGxhdGVUeXBlT3JpZ2luID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBmcm9tICcjdXJpJy4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUeXBlT3JpZ2luKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaV8pPiBjb2RlVHlwZU9yaWdpbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfKT4oCiAgIlR5cGVPcmlnaW4iLAogIHRlbXBsYXRlVHlwZU9yaWdpbiwKKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNUeXBlT3JpZ2luKFN0cmluZyBuYW1lLCBVcmkgdXJpXykgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVR5cGVPcmlnaW4sCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBmcm9tICcke3VyaX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIHRlbXBsYXRlVHlwZU9yaWdpbldpdGhGaWxlVXJpID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmlfLCBVcmkgdXJpMl8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiInI25hbWUnIGlzIGZyb20gJyN1cmknICgnI3VyaTInKS4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNUeXBlT3JpZ2luV2l0aEZpbGVVcmkpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4KICAgIGNvZGVUeXBlT3JpZ2luV2l0aEZpbGVVcmkgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKT4oCiAgIlR5cGVPcmlnaW5XaXRoRmlsZVVyaSIsCiAgdGVtcGxhdGVUeXBlT3JpZ2luV2l0aEZpbGVVcmksCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZU9yaWdpbldpdGhGaWxlVXJpKFN0cmluZyBuYW1lLCBVcmkgdXJpXywgVXJpIHVyaTJfKSB7CiAgaWYgKG5hbWUuaXNFbXB0eSkgdGhyb3cgJ05vIG5hbWUgcHJvdmlkZWQnOwogIG5hbWUgPSBkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lKG5hbWUpOwogIFN0cmluZyB1cmkgPSByZWxhdGl2aXplVXJpKHVyaV8pOwogIFN0cmluZyB1cmkyID0gcmVsYXRpdml6ZVVyaSh1cmkyXyk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVUeXBlT3JpZ2luV2l0aEZpbGVVcmksCiAgICAgIG1lc3NhZ2U6ICIiIicke25hbWV9JyBpcyBmcm9tICcke3VyaX0nICgnJHt1cmkyfScpLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lLCAndXJpJzogdXJpXywgJ3VyaTInOiB1cmkyX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZSA9CiAgICBtZXNzYWdlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWUgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiRFVQTElDQVRFX0RFRklOSVRJT04iXSwKICAgIG1lc3NhZ2U6IHIiIiJBIHR5cGUgdmFyaWFibGUgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGFub3RoZXIuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJUaGUgb3RoZXIgdHlwZSB2YXJpYWJsZSBuYW1lZCAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1R5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oIlR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UiLAogICAgICAgIHRlbXBsYXRlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZSwKICAgICAgICBzZXZlcml0eTogU2V2ZXJpdHkuY29udGV4dCk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZShTdHJpbmcgbmFtZSkgewogIGlmIChuYW1lLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lID0gZGVtYW5nbGVNaXhpbkFwcGxpY2F0aW9uTmFtZShuYW1lKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2UsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSBvdGhlciB0eXBlIHZhcmlhYmxlIG5hbWVkICcke25hbWV9Jy4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dCA9CiAgICBtZXNzYWdlVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHQ7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZVZhcmlhYmxlSW5Db25zdGFudENvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dCIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVFlQRV9QQVJBTUVURVJfSU5fQ09OU1RfRVhQUkVTU0lPTiJdLAogICAgbWVzc2FnZTogciIiIlR5cGUgdmFyaWFibGVzIGNhbid0IGJlIHVzZWQgYXMgY29uc3RhbnRzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHQgPQogICAgbWVzc2FnZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dDsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHQiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlRZUEVfUEFSQU1FVEVSX1JFRkVSRU5DRURfQllfU1RBVElDIl0sCiAgICBtZXNzYWdlOiByIiIiVHlwZSB2YXJpYWJsZXMgY2FuJ3QgYmUgdXNlZCBpbiBzdGF0aWMgbWVtYmVycy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZyA9CiAgICBtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZzsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfQ0xBU1MiXSwKICAgIG1lc3NhZ2U6CiAgICAgICAgciIiIkEgdHlwZSB2YXJpYWJsZSBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgaXRzIGVuY2xvc2luZyBkZWNsYXJhdGlvbi4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVHlwZWRlZkluQ2xhc3MgPSBtZXNzYWdlVHlwZWRlZkluQ2xhc3M7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVHlwZWRlZkluQ2xhc3MgPSBjb25zdCBNZXNzYWdlQ29kZSgiVHlwZWRlZkluQ2xhc3MiLAogICAgaW5kZXg6IDcsCiAgICBtZXNzYWdlOiByIiIiVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgaW5zaWRlIGNsYXNzZXMuIiIiLAogICAgdGlwOiByIiIiVHJ5IG1vdmluZyB0aGUgdHlwZWRlZiB0byB0aGUgdG9wLWxldmVsLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlZGVmTm90RnVuY3Rpb24gPSBtZXNzYWdlVHlwZWRlZk5vdEZ1bmN0aW9uOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVR5cGVkZWZOb3RGdW5jdGlvbiA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlR5cGVkZWZOb3RGdW5jdGlvbiIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9HRU5FUklDX0ZVTkNUSU9OX1RZUEUiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBjcmVhdGUgdHlwZWRlZiBmcm9tIG5vbi1mdW5jdGlvbiB0eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVUeXBlZGVmTm90VHlwZSA9IG1lc3NhZ2VUeXBlZGVmTm90VHlwZTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VUeXBlZGVmTm90VHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJUeXBlZGVmTm90VHlwZSIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiSU5WQUxJRF9UWVBFX0lOX1RZUEVERUYiXSwKICAgIG1lc3NhZ2U6IHIiIiJDYW4ndCBjcmVhdGUgdHlwZWRlZiBmcm9tIG5vbi10eXBlLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmcgPSBtZXNzYWdlVW5leHBlY3RlZERvbGxhckluU3RyaW5nOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIlVuZXhwZWN0ZWREb2xsYXJJblN0cmluZyIsCiAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5FWFBFQ1RFRF9ET0xMQVJfSU5fU1RSSU5HIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiJBICckJyBoYXMgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSBhIHN0cmluZywgYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciBvciBhbiBleHByZXNzaW9uIGluIGN1cmx5IGJyYWNlcyAoe30pLiIiIiwKICAgIHRpcDogciIiIlRyeSBhZGRpbmcgYSBiYWNrc2xhc2ggKFwpIHRvIGVzY2FwZSB0aGUgJyQnLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4gPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlVuZXhwZWN0ZWQgdG9rZW4gJyNsZXhlbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VuZXhwZWN0ZWRUb2tlbik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiBjb2RlVW5leHBlY3RlZFRva2VuID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJVbmV4cGVjdGVkVG9rZW4iLCB0ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5FWFBFQ1RFRF9UT0tFTiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbmV4cGVjdGVkVG9rZW4oVG9rZW4gdG9rZW4pIHsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5leHBlY3RlZFRva2VuLAogICAgICBtZXNzYWdlOiAiIiJVbmV4cGVjdGVkIHRva2VuICcke2xleGVtZX0nLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBUb2tlbiB0b2tlbik+CiAgICB0ZW1wbGF0ZVVubWF0Y2hlZFRva2VuID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgVG9rZW4gdG9rZW4pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJDYW4ndCBmaW5kICcjc3RyaW5nJyB0byBtYXRjaCAnI2xleGVtZScuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5tYXRjaGVkVG9rZW4pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFRva2VuIHRva2VuKT4gY29kZVVubWF0Y2hlZFRva2VuID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBUb2tlbiB0b2tlbik+KAogICAgICAgICJVbm1hdGNoZWRUb2tlbiIsIHRlbXBsYXRlVW5tYXRjaGVkVG9rZW4sCiAgICAgICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkVYUEVDVEVEX1RPS0VOIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VubWF0Y2hlZFRva2VuKFN0cmluZyBzdHJpbmcsIFRva2VuIHRva2VuKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBTdHJpbmcgbGV4ZW1lID0gdG9rZW4ubGV4ZW1lOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5tYXRjaGVkVG9rZW4sCiAgICAgIG1lc3NhZ2U6ICIiIkNhbid0IGZpbmQgJyR7c3RyaW5nfScgdG8gbWF0Y2ggJyR7bGV4ZW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAndG9rZW4nOiB0b2tlbn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTwKICAgIE1lc3NhZ2UgRnVuY3Rpb24oCiAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgU3RyaW5nCiAgICAgICAgICAgIG5hbWUyKT4gdGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9IGNvbnN0IFRlbXBsYXRlPAogICAgICAgIE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgbWVzc2FnZVRlbXBsYXRlOgogICAgICAgIHIiIiInI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgaXNuJ3QgZGVmaW5lZC4iIiIsCiAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKT4KICAgIGNvZGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMik+KAogICAgICAgICJVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiIsCiAgICAgICAgdGVtcGxhdGVVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbiwKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiTk9UX0FfVFlQRSJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbigKICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZTIpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgaWYgKG5hbWUyLmlzRW1wdHkpIHRocm93ICdObyBuYW1lIHByb3ZpZGVkJzsKICBuYW1lMiA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZTIpOwogIHJldHVybiBuZXcgTWVzc2FnZShjb2RlVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb24sCiAgICAgIG1lc3NhZ2U6CiAgICAgICAgICAiIiInJHtuYW1lfS4ke25hbWUyfScgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYmVjYXVzZSAnJHtuYW1lfScgaXNuJ3QgZGVmaW5lZC4iIiIsCiAgICAgIGFyZ3VtZW50czogeyduYW1lJzogbmFtZSwgJ25hbWUyJzogbmFtZTJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nKT4gdGVtcGxhdGVVbnNwZWNpZmllZCA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiIjc3RyaW5nIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW5zcGVjaWZpZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPiBjb2RlVW5zcGVjaWZpZWQgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcpPigKICAiVW5zcGVjaWZpZWQiLAogIHRlbXBsYXRlVW5zcGVjaWZpZWQsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW5zcGVjaWZpZWQoU3RyaW5nIHN0cmluZykgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbnNwZWNpZmllZCwKICAgICAgbWVzc2FnZTogIiIiJHtzdHJpbmd9IiIiLCBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVG9rZW4gdG9rZW4pPiB0ZW1wbGF0ZVVuc3VwcG9ydGVkT3BlcmF0b3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZTogciIiIlRoZSAnI2xleGVtZScgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4iIiIsCiAgICAgICAgd2l0aEFyZ3VtZW50czogX3dpdGhBcmd1bWVudHNVbnN1cHBvcnRlZE9wZXJhdG9yKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+IGNvZGVVbnN1cHBvcnRlZE9wZXJhdG9yID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihUb2tlbiB0b2tlbik+KAogICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdG9yIiwgdGVtcGxhdGVVbnN1cHBvcnRlZE9wZXJhdG9yLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTlNVUFBPUlRFRF9PUEVSQVRPUiJdKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCk1lc3NhZ2UgX3dpdGhBcmd1bWVudHNVbnN1cHBvcnRlZE9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgU3RyaW5nIGxleGVtZSA9IHRva2VuLmxleGVtZTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVuc3VwcG9ydGVkT3BlcmF0b3IsCiAgICAgIG1lc3NhZ2U6ICIiIlRoZSAnJHtsZXhlbWV9JyBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J3Rva2VuJzogdG9rZW59KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVW5zdXBwb3J0ZWRQcmVmaXhQbHVzID0gbWVzc2FnZVVuc3VwcG9ydGVkUHJlZml4UGx1czsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VVbnN1cHBvcnRlZFByZWZpeFBsdXMgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJVbnN1cHBvcnRlZFByZWZpeFBsdXMiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIk1JU1NJTkdfSURFTlRJRklFUiJdLAogICAgbWVzc2FnZTogciIiIicrJyBpcyBub3QgYSBwcmVmaXggb3BlcmF0b3IuIiIiLAogICAgdGlwOiByIiIiVHJ5IHJlbW92aW5nICcrJy4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVW50ZXJtaW5hdGVkQ29tbWVudCA9IG1lc3NhZ2VVbnRlcm1pbmF0ZWRDb21tZW50OwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVVudGVybWluYXRlZENvbW1lbnQgPSBjb25zdCBNZXNzYWdlQ29kZSgKICAgICJVbnRlcm1pbmF0ZWRDb21tZW50IiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVTlRFUk1JTkFURURfTVVMVElfTElORV9DT01NRU5UIl0sCiAgICBtZXNzYWdlOiByIiIiQ29tbWVudCBzdGFydGluZyB3aXRoICcvKicgbXVzdCBlbmQgd2l0aCAnKi8nLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4KICAgIHRlbXBsYXRlVW50ZXJtaW5hdGVkU3RyaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzIpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgICAgIHIiIiJTdHJpbmcgc3RhcnRpbmcgd2l0aCAjc3RyaW5nIG11c3QgZW5kIHdpdGggI3N0cmluZzIuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVW50ZXJtaW5hdGVkU3RyaW5nKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICBjb2RlVW50ZXJtaW5hdGVkU3RyaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICAgICAgICJVbnRlcm1pbmF0ZWRTdHJpbmciLCB0ZW1wbGF0ZVVudGVybWluYXRlZFN0cmluZywKICAgICAgICBhbmFseXplckNvZGVzOiA8U3RyaW5nPlsiVU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMIl0pOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VudGVybWluYXRlZFN0cmluZyhTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMikgewogIGlmIChzdHJpbmcuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgaWYgKHN0cmluZzIuaXNFbXB0eSkgdGhyb3cgJ05vIHN0cmluZyBwcm92aWRlZCc7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVbnRlcm1pbmF0ZWRTdHJpbmcsCiAgICAgIG1lc3NhZ2U6ICIiIlN0cmluZyBzdGFydGluZyB3aXRoICR7c3RyaW5nfSBtdXN0IGVuZCB3aXRoICR7c3RyaW5nMn0uIiIiLAogICAgICBhcmd1bWVudHM6IHsnc3RyaW5nJzogc3RyaW5nLCAnc3RyaW5nMic6IHN0cmluZzJ9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVW50ZXJtaW5hdGVkVG9rZW4gPSBtZXNzYWdlVW50ZXJtaW5hdGVkVG9rZW47CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVW50ZXJtaW5hdGVkVG9rZW4gPQogICAgY29uc3QgTWVzc2FnZUNvZGUoIlVudGVybWluYXRlZFRva2VuIiwgbWVzc2FnZTogciIiIkluY29tcGxldGUgdG9rZW4uIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPiB0ZW1wbGF0ZVVudHJhbnNsYXRhYmxlVXJpID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJOb3QgZm91bmQ6ICcjdXJpJyIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VudHJhbnNsYXRhYmxlVXJpKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihVcmkgdXJpXyk+IGNvZGVVbnRyYW5zbGF0YWJsZVVyaSA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAiVW50cmFuc2xhdGFibGVVcmkiLCB0ZW1wbGF0ZVVudHJhbnNsYXRhYmxlVXJpLAogICAgICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJVUklfRE9FU19OT1RfRVhJU1QiXSk7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVW50cmFuc2xhdGFibGVVcmkoVXJpIHVyaV8pIHsKICBTdHJpbmcgdXJpID0gcmVsYXRpdml6ZVVyaSh1cmlfKTsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVVudHJhbnNsYXRhYmxlVXJpLAogICAgICBtZXNzYWdlOiAiIiJOb3QgZm91bmQ6ICcke3VyaX0nIiIiLCBhcmd1bWVudHM6IHsndXJpJzogdXJpX30pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllciA9CiAgICBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiJyNuYW1lJyBpcyBkZXByZWNhdGVkLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOiBfd2l0aEFyZ3VtZW50c1VzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gY29kZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIgPQogICAgY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4oCiAgICAgICAgIlVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIiLCB0ZW1wbGF0ZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lmlnbm9yZWQpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1VzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVVc2VPZkRlcHJlY2F0ZWRJZGVudGlmaWVyLAogICAgICBtZXNzYWdlOiAiIiInJHtuYW1lfScgaXMgZGVwcmVjYXRlZC4iIiIsIGFyZ3VtZW50czogeyduYW1lJzogbmFtZX0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIHRlbXBsYXRlVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3IgPQogICAgY29uc3QgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgIG1lc3NhZ2VUZW1wbGF0ZToKICAgICAgICAgICAgciIiIlJlcXVpcmVkIG5hbWVkIHBhcmFtZXRlciAnI25hbWUnIG11c3QgYmUgcHJvdmlkZWQuIiIiLAogICAgICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3IpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRFcnJvciA9CiAgICBjb25zdCBDb2RlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAiVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3IiLAogIHRlbXBsYXRlVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3IsCik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpNZXNzYWdlIF93aXRoQXJndW1lbnRzVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3IoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRFcnJvciwKICAgICAgbWVzc2FnZTogIiIiUmVxdWlyZWQgbmFtZWQgcGFyYW1ldGVyICcke25hbWV9JyBtdXN0IGJlIHByb3ZpZGVkLiIiIiwKICAgICAgYXJndW1lbnRzOiB7J25hbWUnOiBuYW1lfSk7Cn0KCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPgogICAgdGVtcGxhdGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nID0KICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPigKICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHIiIiJNaXNzaW5nIHJlcXVpcmVkIG5hbWVkIHBhcmFtZXRlciAnI25hbWUnLiIiIiwKICAgICAgICB3aXRoQXJndW1lbnRzOgogICAgICAgICAgICBfd2l0aEFyZ3VtZW50c1ZhbHVlRm9yUmVxdWlyZWRQYXJhbWV0ZXJOb3RQcm92aWRlZFdhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4KICAgIGNvZGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+KAogICAgICAgICJWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nIiwKICAgICAgICB0ZW1wbGF0ZVZhbHVlRm9yUmVxdWlyZWRQYXJhbWV0ZXJOb3RQcm92aWRlZFdhcm5pbmcsCiAgICAgICAgc2V2ZXJpdHk6IFNldmVyaXR5Lndhcm5pbmcpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1ZhbHVlRm9yUmVxdWlyZWRQYXJhbWV0ZXJOb3RQcm92aWRlZFdhcm5pbmcoU3RyaW5nIG5hbWUpIHsKICBpZiAobmFtZS5pc0VtcHR5KSB0aHJvdyAnTm8gbmFtZSBwcm92aWRlZCc7CiAgbmFtZSA9IGRlbWFuZ2xlTWl4aW5BcHBsaWNhdGlvbk5hbWUobmFtZSk7CiAgcmV0dXJuIG5ldyBNZXNzYWdlKGNvZGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nLAogICAgICBtZXNzYWdlOiAiIiJNaXNzaW5nIHJlcXVpcmVkIG5hbWVkIHBhcmFtZXRlciAnJHtuYW1lfScuIiIiLAogICAgICBhcmd1bWVudHM6IHsnbmFtZSc6IG5hbWV9KTsKfQoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVmFyQXNUeXBlTmFtZSA9IG1lc3NhZ2VWYXJBc1R5cGVOYW1lOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVZhckFzVHlwZU5hbWUgPSBjb25zdCBNZXNzYWdlQ29kZSgiVmFyQXNUeXBlTmFtZSIsCiAgICBpbmRleDogNjEsIG1lc3NhZ2U6IHIiIiJUaGUga2V5d29yZCAndmFyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBuYW1lLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVWYXJSZXR1cm5UeXBlID0gbWVzc2FnZVZhclJldHVyblR5cGU7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVmFyUmV0dXJuVHlwZSA9IGNvbnN0IE1lc3NhZ2VDb2RlKCJWYXJSZXR1cm5UeXBlIiwKICAgIGluZGV4OiAxMiwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgcmV0dXJuIHR5cGUgY2FuJ3QgYmUgJ3ZhcicuIiIiLAogICAgdGlwOgogICAgICAgIHIiIiJUcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3ZhcicsIG9yIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuYW1lIG9mIHRoZSByZXR1cm4gdHlwZS4iIiIpOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgQ29kZTxOdWxsPiBjb2RlVm9pZEV4cHJlc3Npb24gPSBtZXNzYWdlVm9pZEV4cHJlc3Npb247CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBNZXNzYWdlQ29kZSBtZXNzYWdlVm9pZEV4cHJlc3Npb24gPSBjb25zdCBNZXNzYWdlQ29kZSgiVm9pZEV4cHJlc3Npb24iLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIlVTRV9PRl9WT0lEX1JFU1VMVCJdLAogICAgbWVzc2FnZTogciIiIlRoaXMgZXhwcmVzc2lvbiBoYXMgdHlwZSAndm9pZCcgYW5kIGNhbid0IGJlIHVzZWQuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IFRlbXBsYXRlPAogICAgTWVzc2FnZSBGdW5jdGlvbigKICAgICAgICBTdHJpbmcgc3RyaW5nLAogICAgICAgIFN0cmluZwogICAgICAgICAgICBzdHJpbmcyKT4gdGVtcGxhdGVXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHkgPSBjb25zdCBUZW1wbGF0ZTwKICAgICAgICBNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKT4oCiAgICBtZXNzYWdlVGVtcGxhdGU6CiAgICAgICAgciIiIlRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIEphdmFTY3JpcHQuIiIiLAogICAgdGlwVGVtcGxhdGU6CiAgICAgICAgciIiIlRyeSBjaGFuZ2luZyB0aGUgbGl0ZXJhbCB0byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSmF2YXNjcmlwdC4gSW4gSmF2YXNjcmlwdCAjc3RyaW5nMiBpcyB0aGUgbmVhcmVzdCB2YWx1ZSB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5LiIiIiwKICAgIHdpdGhBcmd1bWVudHM6IF93aXRoQXJndW1lbnRzV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5KTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+CiAgICBjb2RlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5ID0KICAgIGNvbnN0IENvZGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMik+KAogICJXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHkiLAogIHRlbXBsYXRlV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5LAopOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KTWVzc2FnZSBfd2l0aEFyZ3VtZW50c1dlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSgKICAgIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcyKSB7CiAgaWYgKHN0cmluZy5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICBpZiAoc3RyaW5nMi5pc0VtcHR5KSB0aHJvdyAnTm8gc3RyaW5nIHByb3ZpZGVkJzsKICByZXR1cm4gbmV3IE1lc3NhZ2UoY29kZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseSwKICAgICAgbWVzc2FnZToKICAgICAgICAgICIiIlRoZSBpbnRlZ2VyIGxpdGVyYWwgJHtzdHJpbmd9IGNhbid0IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgaW4gSmF2YVNjcmlwdC4iIiIsCiAgICAgIHRpcDogIiIiVHJ5IGNoYW5naW5nIHRoZSBsaXRlcmFsIHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBKYXZhc2NyaXB0LiBJbiBKYXZhc2NyaXB0ICR7c3RyaW5nMn0gaXMgdGhlIG5lYXJlc3QgdmFsdWUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseS4iIiIsCiAgICAgIGFyZ3VtZW50czogeydzdHJpbmcnOiBzdHJpbmcsICdzdHJpbmcyJzogc3RyaW5nMn0pOwp9CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVXaXRoQmVmb3JlRXh0ZW5kcyA9IG1lc3NhZ2VXaXRoQmVmb3JlRXh0ZW5kczsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VXaXRoQmVmb3JlRXh0ZW5kcyA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIldpdGhCZWZvcmVFeHRlbmRzIiwKICAgIGluZGV4OiAxMSwKICAgIG1lc3NhZ2U6IHIiIiJUaGUgZXh0ZW5kcyBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIHdpdGggY2xhdXNlLiIiIiwKICAgIHRpcDogciIiIlRyeSBtb3ZpbmcgdGhlIGV4dGVuZHMgY2xhdXNlIGJlZm9yZSB0aGUgd2l0aCBjbGF1c2UuIiIiKTsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IENvZGU8TnVsbD4gY29kZVlpZWxkQXNJZGVudGlmaWVyID0gbWVzc2FnZVlpZWxkQXNJZGVudGlmaWVyOwoKLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVlpZWxkQXNJZGVudGlmaWVyID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAiWWllbGRBc0lkZW50aWZpZXIiLAogICAgYW5hbHl6ZXJDb2RlczogPFN0cmluZz5bIkFTWU5DX0tFWVdPUkRfVVNFRF9BU19JREVOVElGSUVSIl0sCiAgICBtZXNzYWdlOgogICAgICAgIHIiIiIneWllbGQnIGNhbid0IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJyBtZXRob2RzLiIiIik7CgovLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgpjb25zdCBDb2RlPE51bGw+IGNvZGVZaWVsZE5vdEdlbmVyYXRvciA9IG1lc3NhZ2VZaWVsZE5vdEdlbmVyYXRvcjsKCi8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCmNvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VZaWVsZE5vdEdlbmVyYXRvciA9IGNvbnN0IE1lc3NhZ2VDb2RlKAogICAgIllpZWxkTm90R2VuZXJhdG9yIiwKICAgIGFuYWx5emVyQ29kZXM6IDxTdHJpbmc+WyJZSUVMRF9JTl9OT05fR0VORVJBVE9SIl0sCiAgICBtZXNzYWdlOiByIiIiJ3lpZWxkJyBjYW4gb25seSBiZSB1c2VkIGlu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dCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBEZWZpbmVzIHRoZSBmcm9udC1lbmQgQVBJIGZvciBjb252ZXJ0aW5nIHNvdXJjZSBjb2RlIHRvIHN1bW1hcmllcy4KbGlicmFyeSBmcm9udF9lbmQuc3VtbWFyeV9nZW5lcmF0b3I7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2NvbXBpbGVyX29wdGlvbnMuZGFydCc7CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCc7CmltcG9ydCAnLi4va2VybmVsX2dlbmVyYXRvcl9pbXBsLmRhcnQnOwoKLy8vIENyZWF0ZXMgYSBzdW1tYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsZCB1bml0IHdob3NlIHNvdXJjZSBmaWxlcyBhcmUgaW4KLy8vIFtzb3VyY2VzXS4KLy8vCi8vLyBJbnRlbmRlZCB0byBiZSBhIHBhcnQgb2YgYSBtb2R1bGFyIGNvbXBpbGF0aW9uIHByb2Nlc3MuCi8vLwovLy8gQW55IGRlcGVuZGVuY3kgb2YgW3NvdXJjZXNdIHRoYXQgaXMgbm90IGxpc3RlZCBpbgovLy8gW0NvbXBpbGVyT3B0aW9ucy5pbnB1dFN1bW1hcmllc10gYW5kIFtDb21waWxlck9wdGlvbnMuc2RrU3VtbWFyeV0gaXMgdHJlYXRlZAovLy8gYXMgYW4gYWRkaXRpb25hbCBzb3VyY2UgZmlsZSBmb3IgdGhlIGJ1aWxkIHVuaXQuCi8vLwovLy8gQW55IGBwYXJ0YCBkZWNsYXJhdGlvbnMgZm91bmQgaW4gW3NvdXJjZXNdIG11c3QgcmVmZXIgdG8gcGFydCBmaWxlcyB3aGljaAovLy8gYXJlIGFsc28gbGlzdGVkIGluIHRoZSBidWlsZCB1bml0IHNvdXJjZXMsIG90aGVyd2lzZSBhbiBlcnJvciByZXN1bHRzLiAgKEl0Ci8vLyBpcyBub3QgcGVybWl0dGVkIHRvIHJlZmVyIHRvIGEgcGFydCBmaWxlIGRlY2xhcmVkIGluIGFub3RoZXIgYnVpbGQgdW5pdCkuCi8vLwovLy8gSWYgW3RydW5jYXRlXSBpcyB0cnVlLCB0aGUgcmVzdWx0aW5nIHN1bW1hcnkgZG9lc24ndCBpbmNsdWRlIGFueSByZWZlcmVuY2VzCi8vLyB0byBsaWJyYXJpZXMgbG9hZGVkIGZyb20gdGhlIGlucHV0IHN1bW1hcmllcywgYW5kIG9ubHkgY29udGFpbnMgY29kZSB0aGF0Ci8vLyB3YXMgY29tcGlsZWQgZnJvbSBzb3VyY2VzLgovLy8KLy8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZSBzdW1tYXJ5IGZpbGUuCkZ1dHVyZTxMaXN0PGludD4+IHN1bW1hcnlGb3IoTGlzdDxVcmk+IHNvdXJjZXMsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zLAogICAge2Jvb2wgdHJ1bmNhdGU6IGZhbHNlfSkgYXN5bmMgewogIHJldHVybiAoYXdhaXQgZ2VuZXJhdGVLZXJuZWwoCiAgICAgICAgICBuZXcgUHJvY2Vzc2VkT3B0aW9ucyhvcHRpb25zOiBvcHRpb25zLCBpbnB1dHM6IHNvdXJjZXMpLAogICAgICAgICAgYnVpbGRTdW1tYXJ5OiB0cnVlLAogICAgICAgICAgYnVpbGRDb21wb25lbnQ6IGZhbHNlLAogICAgICAgICAgdHJ1bmNhdGVTdW1tYXJ5OiB0cnVuY2F0ZSkpCiAgICAgID8uc3VtbWFyeTsKfQoqAE5OPAFHJQEVIAEpKAFRDwQ8BDZRNQROUE4EUE4fBEZJJCBDHiEmEQIBOnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL3N1bW1hcnlfZ2VuZXJhdG9yLmRhcnRnZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvc3RyaW5nX3NjYW5uZXIuZGFydIzoLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydDJqcy5zY2FubmVyLnN0cmluZ19zY2FubmVyOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBzaG93IFRva2VuLCBTeW50aGV0aWNTdHJpbmdUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBhcyBhbmFseXplciBzaG93IFN0cmluZ1Rva2VuOwoKaW1wb3J0ICdhYnN0cmFjdF9zY2FubmVyLmRhcnQnCiAgICBzaG93IEFic3RyYWN0U2Nhbm5lciwgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCwgU2Nhbm5lckNvbmZpZ3VyYXRpb247CgppbXBvcnQgJ3Rva2VuX2ltcGwuZGFydCcKICAgIHNob3cgQ29tbWVudFRva2VuLCBEYXJ0RG9jVG9rZW4sIExhbmd1YWdlVmVyc2lvblRva2VuLCBTdHJpbmdUb2tlbjsKCmltcG9ydCAnZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBFcnJvclRva2VuOwoKLyoqCiAqIFNjYW5uZXIgdGhhdCByZWFkcyBmcm9tIGEgU3RyaW5nIGFuZCBjcmVhdGVzIHRva2VucyB0aGF0IHBvaW50cyB0bwogKiBzdWJzdHJpbmdzLgogKi8KY2xhc3MgU3RyaW5nU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0U2Nhbm5lciB7CiAgLyoqIFRoZSBmaWxlIGNvbnRlbnQuICovCiAgU3RyaW5nIHN0cmluZzsKCiAgLyoqIFRoZSBjdXJyZW50IG9mZnNldCBpbiBbc3RyaW5nXS4gKi8KICBpbnQgc2Nhbk9mZnNldCA9IC0xOwoKICBTdHJpbmdTY2FubmVyKFN0cmluZyBzdHJpbmcsCiAgICAgIHtTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAogICAgICBib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICAgIExhbmd1YWdlVmVyc2lvbkNoYW5nZWQgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZH0pCiAgICAgIDogc3RyaW5nID0gZW5zdXJlWmVyb1Rlcm1pbmF0aW9uKHN0cmluZyksCiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbiwgaW5jbHVkZUNvbW1lbnRzLCBsYW5ndWFnZVZlcnNpb25DaGFuZ2VkKTsKCiAgc3RhdGljIFN0cmluZyBlbnN1cmVaZXJvVGVybWluYXRpb24oU3RyaW5nIHN0cmluZykgewogICAgcmV0dXJuIChzdHJpbmcuaXNFbXB0eSB8fCBzdHJpbmcuY29kZVVuaXRBdChzdHJpbmcubGVuZ3RoIC0gMSkgIT0gMCkKICAgICAgICAvLyBUT0RPKGxyeSk6IGFib3J0IGluc3RlYWQgb2YgY29weWluZyB0aGUgYXJyYXksIG9yIHdhcm4/CiAgICAgICAgPyBzdHJpbmcgKyAnXHgwMCcKICAgICAgICA6IHN0cmluZzsKICB9CgogIHN0YXRpYyBib29sIGlzTGVnYWxJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CiAgICBTdHJpbmdTY2FubmVyIHNjYW5uZXIgPSBuZXcgU3RyaW5nU2Nhbm5lcihpZGVudGlmaWVyKTsKICAgIFRva2VuIHN0YXJ0VG9rZW4gPSBzY2FubmVyLnRva2VuaXplKCk7CiAgICByZXR1cm4gc3RhcnRUb2tlbiBpcyEgRXJyb3JUb2tlbiAmJiBzdGFydFRva2VuLm5leHQuaXNFb2Y7CiAgfQoKICBpbnQgYWR2YW5jZSgpID0+IHN0cmluZy5jb2RlVW5pdEF0KCsrc2Nhbk9mZnNldCk7CiAgaW50IHBlZWsoKSA9PiBzdHJpbmcuY29kZVVuaXRBdChzY2FuT2Zmc2V0ICsgMSk7CgogIGludCBnZXQgc3RyaW5nT2Zmc2V0ID0+IHNjYW5PZmZzZXQ7CgogIGludCBjdXJyZW50QXNVbmljb2RlKGludCBuZXh0KSA9PiBuZXh0OwoKICB2b2lkIGhhbmRsZVVuaWNvZGUoaW50IHN0YXJ0U2Nhbk9mZnNldCkge30KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgICB0eXBlLCBzdHJpbmcsIHN0YXJ0LCBzY2FuT2Zmc2V0ICsgZXh0cmFPZmZzZXQsIHRva2VuU3RhcnQsCiAgICAgICAgY2Fub25pY2FsaXplOiB0cnVlLCBwcmVjZWRpbmdDb21tZW50czogY29tbWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpIHsKICAgIFN0cmluZyBzb3VyY2UgPSBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBzY2FuT2Zmc2V0KTsKICAgIHJldHVybiBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgdHlwZSwgc291cmNlICsgc3ludGhldGljQ2hhcnMsIHRva2VuU3RhcnQsIHNvdXJjZS5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29tbWVudFRva2VuIGNyZWF0ZUNvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IENvbW1lbnRUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICAgIHR5cGUsIHN0cmluZywgc3RhcnQsIHNjYW5PZmZzZXQgKyBleHRyYU9mZnNldCwgdG9rZW5TdGFydCwKICAgICAgICBjYW5vbmljYWxpemU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydERvY1Rva2VuIGNyZWF0ZURhcnREb2NUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICByZXR1cm4gbmV3IERhcnREb2NUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICAgIHR5cGUsIHN0cmluZywgc3RhcnQsIHNjYW5PZmZzZXQgKyBleHRyYU9mZnNldCwgdG9rZW5TdGFydCwKICAgICAgICBjYW5vbmljYWxpemU6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gY3JlYXRlTGFuZ3VhZ2VWZXJzaW9uVG9rZW4oCiAgICAgIGludCBzdGFydCwgaW50IG1ham9yLCBpbnQgbWlub3IpIHsKICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgICBzdHJpbmcsIHN0YXJ0LCBzY2FuT2Zmc2V0LCB0b2tlblN0YXJ0LCBtYWpvciwgbWlub3IsCiAgICAgICAgY2Fub25pY2FsaXplOiB0cnVlKTsKICB9CgogIGJvb2wgYXRFbmRPZkZpbGUoKSA9PiBzY2FuT2Zmc2V0ID49IHN0cmluZy5sZW5ndGggLSAxOwp9CmcATk48ASgBQQEyAR9IARlIASsBBEYPBC4bEQEpFwEfKyM2MEcBN0lDGhIEATU7Kz8EATQzASYBKgEtAQwtMR8qQzoEAQw2SjklQwQBDE0fK0MdBAEMTR8rQx0EAQwzKTM9HQQBOQIBO3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0YWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnTAARkOLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuaW5jcmVtZW50YWxfY29tcGlsZXI7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQnCiAgICBzaG93CiAgICAgICAgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YSwKICAgICAgICBDYW5vbmljYWxOYW1lRXJyb3IsCiAgICAgICAgQ2Fub25pY2FsTmFtZVNka0Vycm9yLAogICAgICAgIEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IsCiAgICAgICAgU3ViQ29tcG9uZW50VmlldzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnCiAgICBzaG93IENsYXNzSGllcmFyY2h5LCBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBDb21wb25lbnQsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBOYW1lLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJldHVyblN0YXRlbWVudCwKICAgICAgICBTb3VyY2UsCiAgICAgICAgU3VwZXJ0eXBlLAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFR5cGVQYXJhbWV0ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBhcyBrZXJuZWwgc2hvdyBDb21iaW5hdG9yOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvY2hhbmdlZF9zdHJ1Y3R1cmVfbm90aWZpZXIuZGFydCcKICAgIHNob3cgQ2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgRmlsZVN5c3RlbSwgRmlsZVN5c3RlbUVudGl0eTsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9pbmNyZW1lbnRhbF9rZXJuZWxfZ2VuZXJhdG9yLmRhcnQnCiAgICBzaG93IEluY3JlbWVudGFsS2VybmVsR2VuZXJhdG9yLCBpc0xlZ2FsSWRlbnRpZmllcjsKCmltcG9ydCAnLi4vYXBpX3Byb3RvdHlwZS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydCcgc2hvdyBNZW1vcnlGaWxlU3lzdGVtOwoKaW1wb3J0ICdidWlsZGVyL2J1aWxkZXIuZGFydCcgc2hvdyBCdWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBDbGFzc0J1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ2J1aWxkZXIvbmFtZV9pdGVyYXRvci5kYXJ0JyBzaG93IE5hbWVJdGVyYXRvcjsKCmltcG9ydCAnYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCcgc2hvdyBUeXBlQnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCcgc2hvdyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyX2dyYXBoLmRhcnQnIHNob3cgQnVpbGRlckdyYXBoOwoKaW1wb3J0ICdjb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnZGlsbC9kaWxsX2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsQ2xhc3NCdWlsZGVyOwoKaW1wb3J0ICdkaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsL2RpbGxfdGFyZ2V0LmRhcnQnIHNob3cgRGlsbFRhcmdldDsKCmltcG9ydCAnZXhwb3J0LmRhcnQnIHNob3cgRXhwb3J0OwoKaW1wb3J0ICdpbXBvcnQuZGFydCcgc2hvdyBJbXBvcnQ7CgppbXBvcnQgJ2luY3JlbWVudGFsX3NlcmlhbGl6ZXIuZGFydCcgc2hvdyBJbmNyZW1lbnRhbFNlcmlhbGl6ZXI7CgppbXBvcnQgJ3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJ3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAndXRpbC9lcnJvcl9yZXBvcnRlcl9maWxlX2NvcGllci5kYXJ0JyBzaG93IHNhdmVBc0d6aXA7CgppbXBvcnQgJ3V0aWwvdGV4dHVhbF9vdXRsaW5lLmRhcnQnIHNob3cgdGV4dHVhbE91dGxpbmU7CgppbXBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiwKICAgICAgICB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQsCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wLAogICAgICAgIHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0sCiAgICAgICAgdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcDsKCmltcG9ydCAnaHlicmlkX2ZpbGVfc3lzdGVtLmRhcnQnIHNob3cgSHlicmlkRmlsZVN5c3RlbTsKCmltcG9ydCAna2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyOwoKaW1wb3J0ICdrZXJuZWwvaW50ZXJuYWxfYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbkltcGw7CgppbXBvcnQgJ2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnQnIHNob3cgS2VybmVsVGFyZ2V0OwoKaW1wb3J0ICdsaWJyYXJ5X2dyYXBoLmRhcnQnIHNob3cgTGlicmFyeUdyYXBoOwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JyBzaG93IE1lc3NhZ2U7CgppbXBvcnQgJ3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJ3RpY2tlci5kYXJ0JyBzaG93IFRpY2tlcjsKCmltcG9ydCAndXJpX3RyYW5zbGF0b3IuZGFydCcgc2hvdyBVcmlUcmFuc2xhdG9yOwoKY2xhc3MgSW5jcmVtZW50YWxDb21waWxlciBpbXBsZW1lbnRzIEluY3JlbWVudGFsS2VybmVsR2VuZXJhdG9yIHsKICBmaW5hbCBDb21waWxlckNvbnRleHQgY29udGV4dDsKCiAgZmluYWwgVGlja2VyIHRpY2tlcjsKCiAgZmluYWwgYm9vbCBvdXRsaW5lT25seTsKICBib29sIHRyYWNrTmVlZGVkRGlsbExpYnJhcmllcyA9IGZhbHNlOwogIFNldDxMaWJyYXJ5PiBuZWVkZWREaWxsTGlicmFyaWVzOwoKICBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKCiAgRGlsbFRhcmdldCBkaWxsTG9hZGVkRGF0YTsKICBMaXN0PExpYnJhcnlCdWlsZGVyPiBwbGF0Zm9ybUJ1aWxkZXJzOwogIE1hcDxVcmksIExpYnJhcnlCdWlsZGVyPiB1c2VyQnVpbGRlcnM7CiAgZmluYWwgVXJpIGluaXRpYWxpemVGcm9tRGlsbFVyaTsKICBDb21wb25lbnQgY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbTsKICBib29sIGluaXRpYWxpemVkRnJvbURpbGwgPSBmYWxzZTsKICBib29sIGluaXRpYWxpemVkSW5jcmVtZW50YWxTZXJpYWxpemVyID0gZmFsc2U7CiAgVXJpIHByZXZpb3VzUGFja2FnZXNVcmk7CiAgTWFwPFN0cmluZywgVXJpPiBwcmV2aW91c1BhY2thZ2VzTWFwOwogIE1hcDxTdHJpbmcsIFVyaT4gY3VycmVudFBhY2thZ2VzTWFwOwogIGJvb2wgaGFzVG9DaGVja1BhY2thZ2VVcmlzID0gZmFsc2U7CiAgTWFwPFVyaSwgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPj4gcmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMgPQogICAgICBuZXcgTWFwPFVyaSwgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPj4oKTsKICBMaXN0PENvbXBvbmVudD4gbW9kdWxlc1RvTG9hZDsKICBJbmNyZW1lbnRhbFNlcmlhbGl6ZXIgaW5jcmVtZW50YWxTZXJpYWxpemVyOwogIGJvb2wgdXNlRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uID0gZmFsc2U7CgogIHN0YXRpYyBmaW5hbCBVcmkgZGVidWdFeHByVXJpID0KICAgICAgbmV3IFVyaShzY2hlbWU6ICJvcmctZGFydGxhbmctZGVidWciLCBwYXRoOiAic3ludGhldGljX2RlYnVnX2V4cHJlc3Npb24iKTsKCiAgSW5jcmVtZW50YWxLZXJuZWxUYXJnZXQgdXNlckNvZGU7CiAgU2V0PExpYnJhcnk+IHByZXZpb3VzU291cmNlQnVpbGRlcnM7CgogIEluY3JlbWVudGFsQ29tcGlsZXIuZnJvbUNvbXBvbmVudCgKICAgICAgdGhpcy5jb250ZXh0LCB0aGlzLmNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20sCiAgICAgIFtib29sIG91dGxpbmVPbmx5LCBJbmNyZW1lbnRhbFNlcmlhbGl6ZXIgaW5jcmVtZW50YWxTZXJpYWxpemVyXSkKICAgICAgOiB0aWNrZXIgPSBjb250ZXh0Lm9wdGlvbnMudGlja2VyLAogICAgICAgIGluaXRpYWxpemVGcm9tRGlsbFVyaSA9IG51bGwsCiAgICAgICAgdGhpcy5vdXRsaW5lT25seSA9IG91dGxpbmVPbmx5ID8/IGZhbHNlLAogICAgICAgIHRoaXMuaW5jcmVtZW50YWxTZXJpYWxpemVyID0gaW5jcmVtZW50YWxTZXJpYWxpemVyOwoKICBJbmNyZW1lbnRhbENvbXBpbGVyKHRoaXMuY29udGV4dCwKICAgICAgW3RoaXMuaW5pdGlhbGl6ZUZyb21EaWxsVXJpLAogICAgICBib29sIG91dGxpbmVPbmx5LAogICAgICBJbmNyZW1lbnRhbFNlcmlhbGl6ZXIgaW5jcmVtZW50YWxTZXJpYWxpemVyXSkKICAgICAgOiB0aWNrZXIgPSBjb250ZXh0Lm9wdGlvbnMudGlja2VyLAogICAgICAgIGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20gPSBudWxsLAogICAgICAgIHRoaXMub3V0bGluZU9ubHkgPSBvdXRsaW5lT25seSA/PyBmYWxzZSwKICAgICAgICB0aGlzLmluY3JlbWVudGFsU2VyaWFsaXplciA9IGluY3JlbWVudGFsU2VyaWFsaXplcjsKCiAgQG92ZXJyaWRlCiAgRnV0dXJlPENvbXBvbmVudD4gY29tcHV0ZURlbHRhKAogICAgICB7TGlzdDxVcmk+IGVudHJ5UG9pbnRzLCBib29sIGZ1bGxDb21wb25lbnQ6IGZhbHNlfSkgYXN5bmMgewogICAgdGlja2VyLnJlc2V0KCk7CiAgICBlbnRyeVBvaW50cyA/Pz0gY29udGV4dC5vcHRpb25zLmlucHV0czsKICAgIHJldHVybiBjb250ZXh0LnJ1bkluQ29udGV4dDxDb21wb25lbnQ+KChDb21waWxlckNvbnRleHQgYykgYXN5bmMgewogICAgICAvLyBJbml0aWFsIHNldHVwOiBMb2FkIHBsYXRmb3JtLCBpbml0aWFsaXplIGZyb20gZGlsbCBvciBjb21wb25lbnQgZXRjLgogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IgPSBhd2FpdCBzZXR1cFBhY2thZ2VzQW5kVXJpVHJhbnNsYXRvcihjKTsKICAgICAgSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSA9CiAgICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybUFuZEluaXRpYWxpemUodXJpVHJhbnNsYXRvciwgYyk7CgogICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdG8ga2VlcCBhbmQgd2hhdCB0byB0aHJvdyBhd2F5LgogICAgICBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMgPSB0aGlzLmludmFsaWRhdGVkVXJpcy50b1NldCgpOwogICAgICBpbnZhbGlkYXRlTm90S2VwdFVzZXJCdWlsZGVycyhpbnZhbGlkYXRlZFVyaXMpOwogICAgICBSZXVzYWdlUmVzdWx0IHJldXNlZFJlc3VsdCA9CiAgICAgICAgICBjb21wdXRlUmV1c2VkTGlicmFyaWVzKGludmFsaWRhdGVkVXJpcywgdXJpVHJhbnNsYXRvcik7CgogICAgICAvLyBFeHBlcmltZW50YWwgaW52YWxpZGF0aW9uIGluaXRpYWxpemF0aW9uIChlLmcuIGZpZ3VyZSBvdXQgaWYgd2UgY2FuKS4KICAgICAgRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiA9CiAgICAgICAgICBhd2FpdCBpbml0aWFsaXplRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uKHJldXNlZFJlc3VsdCwgYyk7CiAgICAgIHJlY29yZFJlYnVpbGRCb2RpZXNDb3VudEZvclRlc3RpbmcoCiAgICAgICAgICBleHBlcmltZW50YWxJbnZhbGlkYXRpb24/Lm1pc3NpbmdTb3VyY2VzPy5sZW5ndGggPz8gMCk7CgogICAgICAvLyBDbGVhbnVwOiBBZnRlciAocG90ZW50aWFsbHkpIHJlbW92aW5nIGJ1aWxkZXJzIHdlIGhhdmUgc3R1ZmYgdG8gY2xlYW51cAogICAgICAvLyB0byBub3QgbGVhaywgYW5kIHdlIG1pZ2h0IG5lZWQgdG8gcmUtY3JlYXRlIHRoZSBkaWxsIHRhcmdldC4KICAgICAgY2xlYW51cFJlbW92ZWRCdWlsZGVycyhyZXVzZWRSZXN1bHQsIHVyaVRyYW5zbGF0b3IpOwogICAgICByZWNyZWF0ZURpbGxUYXJnZXRJZlBhY2thZ2VXYXNVcGRhdGVkKHVyaVRyYW5zbGF0b3IsIGMpOwogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkgPSB1c2VyQ29kZT8ubG9hZGVyPy5oaWVyYXJjaHk7CiAgICAgIGNsZWFudXBIaWVyYXJjaHkoaGllcmFyY2h5LCBleHBlcmltZW50YWxJbnZhbGlkYXRpb24sIHJldXNlZFJlc3VsdCk7CiAgICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IHJldXNlZExpYnJhcmllcyA9IHJldXNlZFJlc3VsdC5yZXVzZWRMaWJyYXJpZXM7CiAgICAgIHJldXNlZFJlc3VsdCA9IG51bGw7CgogICAgICBpZiAodXNlckNvZGUgIT0gbnVsbCkgewogICAgICAgIHRpY2tlci5sb2dNcygiRGVjaWRlZCB0byByZXVzZSAke3JldXNlZExpYnJhcmllcy5sZW5ndGh9IgogICAgICAgICAgICAiIG9mICR7dXNlckNvZGUubG9hZGVyLmJ1aWxkZXJzLmxlbmd0aH0gbGlicmFyaWVzIik7CiAgICAgIH0KCiAgICAgIC8vIEZvciBtb2R1bGFyIGNvbXBpbGF0aW9uIHdlIGNhbiBiZSBhc2tlZCB0byBsb2FkIGNvbXBvbmVudHMgYW5kIHRyYWNrCiAgICAgIC8vIHdoaWNoIGxpYnJhcmllcyB3ZSBhY3R1YWxseSB1c2UgZm9yIHRoZSBjb21waWxhdGlvbi4gU2V0IHRoYXQgdXAgbm93LgogICAgICBhd2FpdCBsb2FkRW5zdXJlTG9hZGVkQ29tcG9uZW50cyhyZXVzZWRMaWJyYXJpZXMpOwogICAgICByZXNldFRyYWNraW5nT2ZVc2VkTGlicmFyaWVzKGhpZXJhcmNoeSk7CgogICAgICAvLyBGb3IgZWFjaCBjb21wdXRlRGVsdGEgY2FsbCB3ZSBjcmVhdGUgYSBuZXcgdXNlckNvZGUgb2JqZWN0IHdoaWNoIG5lZWRzCiAgICAgIC8vIHRvIGJlIHNldHVwLCBhbmQgaW4gdGhlIGNhc2Ugb2YgZXhwZXJpbWVudGFsIGludmFsaWRhdGlvbiBzb21lIG9mIHRoZQogICAgICAvLyBidWlsZGVycyBuZWVkcyB0byBiZSBwYXRjaGVkIHVwLgogICAgICBLZXJuZWxUYXJnZXQgdXNlckNvZGVPbGQgPSB1c2VyQ29kZTsKICAgICAgc2V0dXBOZXdVc2VyQ29kZShjLCB1cmlUcmFuc2xhdG9yLCBoaWVyYXJjaHksIHJldXNlZExpYnJhcmllcywKICAgICAgICAgIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiwgZW50cnlQb2ludHMuZmlyc3QpOwogICAgICBNYXA8TGlicmFyeUJ1aWxkZXIsIExpc3Q8TGlicmFyeUJ1aWxkZXI+PiByZWJ1aWxkQm9kaWVzTWFwID0KICAgICAgICAgIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbkNyZWF0ZVJlYnVpbGRCb2RpZXNCdWlsZGVycygKICAgICAgICAgICAgICBleHBlcmltZW50YWxJbnZhbGlkYXRpb24sIHVyaVRyYW5zbGF0b3IpOwogICAgICBlbnRyeVBvaW50cyA9IHVzZXJDb2RlLnNldEVudHJ5UG9pbnRzKGVudHJ5UG9pbnRzKTsKICAgICAgYXdhaXQgdXNlckNvZGUubG9hZGVyLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uUGF0Y2hVcFNjb3BlcygKICAgICAgICAgIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiwgcmVidWlsZEJvZGllc01hcCk7CiAgICAgIHJlYnVpbGRCb2RpZXNNYXAgPSBudWxsOwoKICAgICAgLy8gQ2hlY2twb2ludDogQnVpbGQgdGhlIGFjdHVhbCBvdXRsaW5lLgogICAgICAvLyBOb3RlIHRoYXQgdGhlIFtDb21wb25lbnRdIGlzIG5vdCB0aGUgImZ1bGwiIGNvbXBvbmVudC4KICAgICAgLy8gSXQgaXMgYSBjb21wb25lbnQgY29uc2lzdGluZyBvZiBhbGwgbmV3bHkgY29tcGlsZWQgbGlicmFyaWVzIGFuZCBhbGwKICAgICAgLy8gbGlicmFyaWVzIGxvYWRlZCBmcm9tIC5kaWxsIGZpbGVzIG9yIGRpcmVjdGx5IGZyb20gY29tcG9uZW50cy4KICAgICAgLy8gVGVjaG5pY2FsbHksIGl0J3MgdGhlIGNvbWJpbmF0aW9uIG9mIHVzZXJDb2RlLmxvYWRlci5saWJyYXJpZXMgYW5kCiAgICAgIC8vIGRpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMuCiAgICAgIENvbXBvbmVudCBjb21wb25lbnRXaXRoRGlsbCA9IGF3YWl0IHVzZXJDb2RlLmJ1aWxkT3V0bGluZXMoKTsKCiAgICAgIGlmICghb3V0bGluZU9ubHkpIHsKICAgICAgICAvLyBDaGVja3BvaW50OiBCdWlsZCB0aGUgYWN0dWFsIGJvZGllcy4KICAgICAgICBjb21wb25lbnRXaXRoRGlsbCA9CiAgICAgICAgICAgIGF3YWl0IHVzZXJDb2RlLmJ1aWxkQ29tcG9uZW50KHZlcmlmeTogYy5vcHRpb25zLnZlcmlmeSk7CiAgICAgIH0KICAgICAgaGllcmFyY2h5ID8/PSB1c2VyQ29kZS5sb2FkZXIuaGllcmFyY2h5OwogICAgICBpZiAoaGllcmFyY2h5ICE9IG51bGwgJiYgdXNlckNvZGUuY2xhc3Nlc0NoYW5nZWRTdHJ1Y3R1cmUgIT0gbnVsbCkgewogICAgICAgIGhpZXJhcmNoeS5hcHBseU1lbWJlckNoYW5nZXModXNlckNvZGUuY2xhc3Nlc0NoYW5nZWRTdHJ1Y3R1cmUsCiAgICAgICAgICAgIGZpbmREZXNjZW5kYW50czogdHJ1ZSk7CiAgICAgIH0KICAgICAgcmVjb3JkTm9uRnVsbENvbXBvbmVudEZvclRlc3RpbmcoY29tcG9uZW50V2l0aERpbGwpOwoKICAgICAgLy8gUGVyZm9ybSBhY3R1YWwgZGlsbCB1c2FnZSB0cmFja2luZy4KICAgICAgcGVyZm9ybURpbGxVc2FnZVRyYWNraW5nKGhpZXJhcmNoeSk7CgogICAgICAvLyBJZiB3ZSBhY3R1YWxseSBnb3QgYSByZXN1bHQgd2UgY2FuIHRocm93IGF3YXkgdGhlIG9sZCB1c2VyQ29kZSBhbmQgdGhlCiAgICAgIC8vIGxpc3Qgb2YgaW52YWxpZGF0ZWQgdXJpcy4KICAgICAgaWYgKGNvbXBvbmVudFdpdGhEaWxsICE9IG51bGwpIHsKICAgICAgICB0aGlzLmludmFsaWRhdGVkVXJpcy5jbGVhcigpOwogICAgICAgIGhhc1RvQ2hlY2tQYWNrYWdlVXJpcyA9IGZhbHNlOwogICAgICAgIHVzZXJDb2RlT2xkPy5sb2FkZXI/LnJlbGVhc2VBbmNpbGxhcnlSZXNvdXJjZXMoKTsKICAgICAgICB1c2VyQ29kZU9sZCA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgd2hpY2ggbGlicmFyaWVzIHRvIG91dHB1dCBhbmQgd2hpY2ggKHByZXZpb3VzKSBlcnJvcnMvd2FybmluZ3MKICAgICAgLy8gd2UgaGF2ZSB0byByZWlzc3VlLiBJbiB0aGUgcHJvY2VzcyBkbyBzb21lIGNsZWFudXAgdG9vLgogICAgICBMaXN0PExpYnJhcnk+IGNvbXBpbGVkTGlicmFyaWVzID0KICAgICAgICAgIG5ldyBMaXN0PExpYnJhcnk+LmZyb20odXNlckNvZGUubG9hZGVyLmxpYnJhcmllcyk7CiAgICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSBjb21wb25lbnRXaXRoRGlsbD8udXJpVG9Tb3VyY2U7CiAgICAgIGV4cGVyaW1lbnRhbENvbXBpbGF0aW9uUG9zdENvbXBpbGVQYXRjaHVwKAogICAgICAgICAgZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uLCBjb21waWxlZExpYnJhcmllcywgdXJpVG9Tb3VyY2UpOwogICAgICBMaXN0PExpYnJhcnk+IG91dHB1dExpYnJhcmllcyA9CiAgICAgICAgICBjYWxjdWxhdGVPdXRwdXRMaWJyYXJpZXNBbmRJc3N1ZUxpYnJhcnlQcm9ibGVtcygKICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudCAhPSBudWxsIHx8IGZ1bGxDb21wb25lbnQsCiAgICAgICAgICAgICAgY29tcGlsZWRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgZW50cnlQb2ludHMsCiAgICAgICAgICAgICAgcmV1c2VkTGlicmFyaWVzLAogICAgICAgICAgICAgIGhpZXJhcmNoeSwKICAgICAgICAgICAgICB1cmlUcmFuc2xhdG9yLAogICAgICAgICAgICAgIHVyaVRvU291cmNlLAogICAgICAgICAgICAgIGMpOwogICAgICBMaXN0PFN0cmluZz4gcHJvYmxlbXNBc0pzb24gPSByZWlzc3VlQ29tcG9uZW50UHJvYmxlbXMoY29tcG9uZW50V2l0aERpbGwpOwoKICAgICAgLy8gSWYgd2UgZGlkbid0IGdldCBhIHJlc3VsdCwgZ28gYmFjayB0byB0aGUgcHJldmlvdXMgb25lIHNvIGV4cHJlc3Npb24KICAgICAgLy8gY2FsY3VsYXRpb24gaGFzIHRoZSBwb3RlbnRpYWwgdG8gd29yay4KICAgICAgaWYgKGNvbXBvbmVudFdpdGhEaWxsID09IG51bGwpIHsKICAgICAgICB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnMuY2xlYXIoKTsKICAgICAgICB1c2VyQ29kZSA9IHVzZXJDb2RlT2xkOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5jdXJyZW50U291cmNlTG9hZGVyID0gdXNlckNvZGUubG9hZGVyOwogICAgICB9IGVsc2UgewogICAgICAgIHByZXZpb3VzU291cmNlQnVpbGRlcnMgPQogICAgICAgICAgICBhd2FpdCBjb252ZXJ0U291cmNlTGlicmFyeUJ1aWxkZXJzVG9EaWxsKGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbik7CiAgICAgIH0KCiAgICAgIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiA9IG51bGw7CgogICAgICAvLyBPdXRwdXQgcmVzdWx0LgogICAgICBQcm9jZWR1cmUgbWFpbk1ldGhvZCA9IGNvbXBvbmVudFdpdGhEaWxsID09IG51bGwKICAgICAgICAgID8gZGF0YS51c2VyTG9hZGVkVXJpTWFpbgogICAgICAgICAgOiBjb21wb25lbnRXaXRoRGlsbC5tYWluTWV0aG9kOwogICAgICByZXR1cm4gY29udGV4dC5vcHRpb25zLnRhcmdldC5jb25maWd1cmVDb21wb25lbnQoCiAgICAgICAgICBuZXcgQ29tcG9uZW50KGxpYnJhcmllczogb3V0cHV0TGlicmFyaWVzLCB1cmlUb1NvdXJjZTogdXJpVG9Tb3VyY2UpKQogICAgICAgIC4ubWFpbk1ldGhvZCA9IG1haW5NZXRob2QKICAgICAgICAuLnByb2JsZW1zQXNKc29uID0gcHJvYmxlbXNBc0pzb247CiAgICB9KTsKICB9CgogIC8vLyBDb252ZXJ0IGV2ZXJ5IFNvdXJjZUxpYnJhcnlCdWlsZGVyIHRvIGEgRGlsbExpYnJhcnlCdWlsZGVyLgogIC8vLyBBcyB3ZSBhbHdheXMgZG8gdGhpcywgdGhpcyB3aWxsIG9ubHkgYmUgdGhlIG5ldyBvbmVzLgogIC8vLwogIC8vLyBJZiBkb2luZyBleHBlcmltZW50YWwgaW52YWxpZGF0aW9uIHRoYXQgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBvbGQgZGlsbAogIC8vLyBsaWJyYXJ5IGJ1aWxkZXJzIG1pZ2h0IGhhdmUgbGlua3MgKHZpYSBleHBvcnQgc2NvcGVzKSB0byB0aGUKICAvLy8gc291cmNlIGJ1aWxkZXJzIGFuZCB0aGV5IHdpbGwgdGh1cyBiZSBwYXRjaGVkIHVwIGhlcmUgdG9vLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgTGlicmFyaWVzIHRoYXQgbm93IGhhcyBuZXcgKGRpbGwpIGJ1aWxkZXJzLgogIEZ1dHVyZTxTZXQ8TGlicmFyeT4+IGNvbnZlcnRTb3VyY2VMaWJyYXJ5QnVpbGRlcnNUb0RpbGwoCiAgICAgIEV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiBleHBlcmltZW50YWxJbnZhbGlkYXRpb24pIGFzeW5jIHsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgU2V0PExpYnJhcnk+IG5ld0RpbGxMaWJyYXJ5QnVpbGRlcnMgPSBuZXcgU2V0PExpYnJhcnk+KCk7CiAgICB1c2VyQnVpbGRlcnMgPz89IDxVcmksIExpYnJhcnlCdWlsZGVyPnt9OwogICAgTWFwPExpYnJhcnlCdWlsZGVyLCBMaXN0PExpYnJhcnlCdWlsZGVyPj4gY29udmVydGVkTGlicmFyaWVzOwogICAgZm9yIChNYXBFbnRyeTxVcmksIExpYnJhcnlCdWlsZGVyPiBlbnRyeQogICAgICAgIGluIHVzZXJDb2RlLmxvYWRlci5idWlsZGVycy5lbnRyaWVzKSB7CiAgICAgIGlmIChlbnRyeS52YWx1ZSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPSBlbnRyeS52YWx1ZTsKICAgICAgICBEaWxsTGlicmFyeUJ1aWxkZXIgZGlsbEJ1aWxkZXIgPQogICAgICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYXBwZW5kTGlicmFyeShidWlsZGVyLmxpYnJhcnkpOwogICAgICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVyc1tlbnRyeS5rZXldID0gZGlsbEJ1aWxkZXI7CiAgICAgICAgdXNlckJ1aWxkZXJzW2VudHJ5LmtleV0gPSBkaWxsQnVpbGRlcjsKICAgICAgICBuZXdEaWxsTGlicmFyeUJ1aWxkZXJzLmFkZChidWlsZGVyLmxpYnJhcnkpOwogICAgICAgIGlmICh1c2VyQ29kZS5sb2FkZXIuZmlyc3QgPT0gYnVpbGRlcikgewogICAgICAgICAgdXNlckNvZGUubG9hZGVyLmZpcnN0ID0gZGlsbEJ1aWxkZXI7CiAgICAgICAgfQogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIGlmIChleHBlcmltZW50YWxJbnZhbGlkYXRpb24gIT0gbnVsbCkgewogICAgICAgICAgY29udmVydGVkTGlicmFyaWVzID8/PQogICAgICAgICAgICAgIG5ldyBNYXA8TGlicmFyeUJ1aWxkZXIsIExpc3Q8TGlicmFyeUJ1aWxkZXI+PigpOwogICAgICAgICAgY29udmVydGVkTGlicmFyaWVzW2J1aWxkZXJdID0gW2RpbGxCdWlsZGVyXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgIC8vIFdlIHN1cHByZXNzIGZpbmFsaXphdGlvbiBlcnJvcnMgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuCiAgICAgIC8vIHJlcG9ydGVkLgogICAgICBhd2FpdCBkaWxsTG9hZGVkRGF0YS5idWlsZE91dGxpbmVzKHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiB0cnVlKTsKCiAgICAgIGlmIChleHBlcmltZW50YWxJbnZhbGlkYXRpb24gIT0gbnVsbCkgewogICAgICAgIC8vLyBJZiBkb2luZyBleHBlcmltZW50YWwgaW52YWxpZGF0aW9uIHRoYXQgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBvbGQKICAgICAgICAvLy8gZGlsbCBsaWJyYXJ5IGJ1aWxkZXJzIG1pZ2h0IGhhdmUgbGlua3MgKHZpYSBleHBvcnQgc2NvcGVzKSB0byB0aGUKICAgICAgICAvLy8gc291cmNlIGJ1aWxkZXJzLiBQYXRjaCB0aGF0IHVwLgoKICAgICAgICAvLyBNYXBzIGZyb20gb2xkIGxpYnJhcnkgYnVpbGRlciB0byBtYXAgb2YgbmV3IGNvbnRlbnQuCiAgICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBNYXA8U3RyaW5nLCBCdWlsZGVyPj4gcmVwbGFjZW1lbnRNYXAgPSB7fTsKCiAgICAgICAgLy8gTWFwcyBmcm9tIG9sZCBsaWJyYXJ5IGJ1aWxkZXIgdG8gbWFwIG9mIG5ldyBjb250ZW50LgogICAgICAgIE1hcDxMaWJyYXJ5QnVpbGRlciwgTWFwPFN0cmluZywgQnVpbGRlcj4+IHJlcGxhY2VtZW50U2V0dGVyc01hcCA9IHt9OwoKICAgICAgICBleHBlcmltZW50YWxJbnZhbGlkYXRpb25GaWxsUmVwbGFjZW1lbnRNYXBzKAogICAgICAgICAgICBjb252ZXJ0ZWRMaWJyYXJpZXMsIHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXApOwoKICAgICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIKICAgICAgICAgICAgaW4gZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uLm9yaWdpbmFsTm90UmV1c2VkTGlicmFyaWVzKSB7CiAgICAgICAgICBEaWxsTGlicmFyeUJ1aWxkZXIgZGlsbEJ1aWxkZXIgPSBidWlsZGVyOwogICAgICAgICAgaWYgKGRpbGxCdWlsZGVyLmlzQnVpbHQpIHsKICAgICAgICAgICAgZGlsbEJ1aWxkZXIuZXhwb3J0U2NvcGUKICAgICAgICAgICAgICAgIC5wYXRjaFVwU2NvcGUocmVwbGFjZW1lbnRNYXAsIHJlcGxhY2VtZW50U2V0dGVyc01hcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlcGxhY2VtZW50TWFwID0gbnVsbDsKICAgICAgICByZXBsYWNlbWVudFNldHRlcnNNYXAgPSBudWxsOwogICAgICB9CiAgICB9CiAgICB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnNDcmVhdGVkV2l0aFJlZmVyZW5jZXMuY2xlYXIoKTsKICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVySGllcmFyY2h5Lm5vZGVzLmNsZWFyKCk7CiAgICB1c2VyQ29kZS5sb2FkZXIucmVmZXJlbmNlRnJvbUluZGV4ID0gbnVsbDsKICAgIGNvbnZlcnRlZExpYnJhcmllcyA9IG51bGw7CiAgICBleHBlcmltZW50YWxJbnZhbGlkYXRpb24gPSBudWxsOwogICAgaWYgKHVzZXJCdWlsZGVycy5pc0VtcHR5KSB1c2VyQnVpbGRlcnMgPSBudWxsOwogICAgcmV0dXJuIG5ld0RpbGxMaWJyYXJ5QnVpbGRlcnM7CiAgfQoKICAvLy8gQ29tcHV0ZSB3aGljaCBsaWJyYXJpZXMgdG8gb3V0cHV0IGFuZCB3aGljaCAocHJldmlvdXMpIGVycm9ycy93YXJuaW5ncyB3ZQogIC8vLyBoYXZlIHRvIHJlaXNzdWUuIEluIHRoZSBwcm9jZXNzIGRvIHNvbWUgY2xlYW51cCB0b28uCiAgTGlzdDxMaWJyYXJ5PiBjYWxjdWxhdGVPdXRwdXRMaWJyYXJpZXNBbmRJc3N1ZUxpYnJhcnlQcm9ibGVtcygKICAgICAgYm9vbCBmdWxsQ29tcG9uZW50LAogICAgICBMaXN0PExpYnJhcnk+IGNvbXBpbGVkTGlicmFyaWVzLAogICAgICBMaXN0PFVyaT4gZW50cnlQb2ludHMsCiAgICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IHJldXNlZExpYnJhcmllcywKICAgICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UsCiAgICAgIENvbXBpbGVyQ29udGV4dCBjKSB7CiAgICBMaXN0PExpYnJhcnk+IG91dHB1dExpYnJhcmllczsKICAgIFNldDxMaWJyYXJ5PiBhbGxMaWJyYXJpZXM7CiAgICBpZiAoZnVsbENvbXBvbmVudCkgewogICAgICBvdXRwdXRMaWJyYXJpZXMgPSBjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmUoY29tcGlsZWRMaWJyYXJpZXMsIGVudHJ5UG9pbnRzLAogICAgICAgICAgcmV1c2VkTGlicmFyaWVzLCBoaWVyYXJjaHksIHVyaVRyYW5zbGF0b3IsIHVyaVRvU291cmNlKTsKICAgICAgYWxsTGlicmFyaWVzID0gb3V0cHV0TGlicmFyaWVzLnRvU2V0KCk7CiAgICAgIGlmICghYy5vcHRpb25zLm9taXRQbGF0Zm9ybSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxhdGZvcm1CdWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgTGlicmFyeSBsaWIgPSBwbGF0Zm9ybUJ1aWxkZXJzW2ldLmxpYnJhcnk7CiAgICAgICAgICBvdXRwdXRMaWJyYXJpZXMuYWRkKGxpYik7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvdXRwdXRMaWJyYXJpZXMgPSBuZXcgTGlzdDxMaWJyYXJ5PigpOwogICAgICBhbGxMaWJyYXJpZXMgPSBjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmUoCiAgICAgICAgICAgICAgY29tcGlsZWRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgZW50cnlQb2ludHMsCiAgICAgICAgICAgICAgcmV1c2VkTGlicmFyaWVzLAogICAgICAgICAgICAgIGhpZXJhcmNoeSwKICAgICAgICAgICAgICB1cmlUcmFuc2xhdG9yLAogICAgICAgICAgICAgIHVyaVRvU291cmNlLAogICAgICAgICAgICAgIG91dHB1dExpYnJhcmllcykKICAgICAgICAgIC50b1NldCgpOwogICAgfQoKICAgIHJlaXNzdWVMaWJyYXJ5UHJvYmxlbXMoYWxsTGlicmFyaWVzLCBjb21waWxlZExpYnJhcmllcyk7CiAgICByZXR1cm4gb3V0cHV0TGlicmFyaWVzOwogIH0KCiAgLy8vIElmIGRvaW5nIGV4cGVyaW1lbnRhbCBjb21waWxhdGlvbiwgbWFrZSBzdXJlIFtjb21waWxlZExpYnJhcmllc10gYW5kCiAgLy8vIFt1cmlUb1NvdXJjZV0gbG9va3MgYXMgdGhleSB3b3VsZCBoYXZlIGlmIHdlIGhhZG4ndCBkb25lIGV4cGVyaW1lbnRhbAogIC8vLyBjb21waWxhdGlvbiwgaS5lLiBiZWZvcmUgdGhpcyBjYWxsIFtjb21waWxlZExpYnJhcmllc10gbWlnaHQgb25seSBjb250YWluCiAgLy8vIHRoZSBzaW5nbGUgTGlicmFyeSB3ZSBjb21waWxlZCBhZ2FpbiwgYnV0IGFmdGVyIHRoaXMgY2FsbCwgaXQgd2lsbCBhbHNvCiAgLy8vIGNvbnRhaW4gYWxsIHRoZSBsaWJyYXJpZXMgdGhhdCB3b3VsZCBub3JtYWxseSBoYXZlIGJlZW4gcmVjb21waWxlZC4KICAvLy8gVGhpcyBtaWdodCBiZSBhIHRlbXBvcmFyeSB0aGluZywgYnV0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgVk0KICAvLy8gY2FuIChhbHdheXMpIHdvcmsgd2l0aCBvbmx5IGdldHRpbmcgdGhlIGFjdHVhbGx5IHJlYnVpbGQgc3R1ZmYuCiAgdm9pZCBleHBlcmltZW50YWxDb21waWxhdGlvblBvc3RDb21waWxlUGF0Y2h1cCgKICAgICAgRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiwKICAgICAgTGlzdDxMaWJyYXJ5PiBjb21waWxlZExpYnJhcmllcywKICAgICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSkgewogICAgaWYgKGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiAhPSBudWxsKSB7CiAgICAgIC8vIE1ha2Ugc3VyZSAiY29tcGlsZWRMaWJyYXJpZXMiIGNvbnRhaW5zIHdoYXQgaXQgd291bGQgaGF2ZSwgaGFkIHdlIG5vdAogICAgICAvLyBvbmx5IHJlLWRvbmUgdGhlIGJvZGllcywgYnV0IGludmFsaWRhdGVkIGV2ZXJ5dGhpbmcuCiAgICAgIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbi5vcmlnaW5hbE5vdFJldXNlZExpYnJhcmllcwogICAgICAgICAgLnJlbW92ZUFsbChleHBlcmltZW50YWxJbnZhbGlkYXRpb24ucmVidWlsZEJvZGllcyk7CiAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlcgogICAgICAgICAgaW4gZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uLm9yaWdpbmFsTm90UmV1c2VkTGlicmFyaWVzKSB7CiAgICAgICAgY29tcGlsZWRMaWJyYXJpZXMuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICAgIH0KCiAgICAgIC8vIHVyaVRvU291cmNlcyBhcmUgY3JlYXRlZCBpbiB0aGUgb3V0bGluZSBzdGFnZSB3aGljaCB3ZSBza2lwcGVkIGZvcgogICAgICAvLyBzb21lIG9mIHRoZSBsaWJyYXJpZXMuCiAgICAgIGZvciAoVXJpIHVyaSBpbiBleHBlcmltZW50YWxJbnZhbGlkYXRpb24ubWlzc2luZ1NvdXJjZXMpIHsKICAgICAgICAvLyBUT0RPKGplbnNqKTogS2VybmVsVGFyZ2V0cyAibGluayIgdGFrZXMgc29tZSAiZXhjbHVkZVNvdXJjZSIKICAgICAgICAvLyBzZXR0aW5nIGludG8gYWNjb3VudC4KICAgICAgICB1cmlUb1NvdXJjZVt1cmldID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2VbdXJpXTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFBlcmZvcm0gZGlsbCB1c2FnZSB0cmFja2luZyBpZiBhc2tlZC4gVXNlIHRoZSBtYXJraW5nIG9uIGRpbGwgYnVpbGRlcnMgYXMKICAvLy8gd2VsbCBhcyB0aGUgY2xhc3MgaGllcmFyY2h5IHRvIGZpZ3VyZSBvdXQgd2hpY2ggZGlsbCBsaWJyYXJpZXMgd2FzCiAgLy8vIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGNvbXBpbGF0aW9uLgogIHZvaWQgcGVyZm9ybURpbGxVc2FnZVRyYWNraW5nKENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogICAgaWYgKHRyYWNrTmVlZGVkRGlsbExpYnJhcmllcykgewogICAgICAvLyBXaGljaCBkaWxsIGJ1aWxkZXJzIHdlcmUgYnVpbHQ/CiAgICAgIG5lZWRlZERpbGxMaWJyYXJpZXMgPSBuZXcgU2V0PExpYnJhcnk+KCk7CiAgICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgICAgaWYgKGJ1aWxkZXIgaXMgRGlsbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgICBpZiAoYnVpbGRlci5pc0J1aWx0QW5kTWFya2VkKSB7CiAgICAgICAgICAgIG5lZWRlZERpbGxMaWJyYXJpZXMuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB1cGRhdGVOZWVkZWREaWxsTGlicmFyaWVzV2l0aEhpZXJhcmNoeSgKICAgICAgICAgIGhpZXJhcmNoeSwgdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJIaWVyYXJjaHkpOwogICAgfQogIH0KCiAgLy8vIEZpbGwgaW4gdGhlIHJlcGxhY2VtZW50IG1hcHMgdGhhdCBkZXNjcmliZSB0aGUgcmVwbGFjZW1lbnRzIHRoYXQgbmVlZCB0bwogIC8vLyBoYXBwZW4gYmVjYXVzZSBvZiBleHBlcmltZW50YWwgaW52YWxpZGF0aW9uLgogIHZvaWQgZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uRmlsbFJlcGxhY2VtZW50TWFwcygKICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBMaXN0PExpYnJhcnlCdWlsZGVyPj4gcmVidWlsZEJvZGllc01hcCwKICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBNYXA8U3RyaW5nLCBCdWlsZGVyPj4gcmVwbGFjZW1lbnRNYXAsCiAgICAgIE1hcDxMaWJyYXJ5QnVpbGRlciwgTWFwPFN0cmluZywgQnVpbGRlcj4+IHJlcGxhY2VtZW50U2V0dGVyc01hcCkgewogICAgZm9yIChNYXBFbnRyeTxMaWJyYXJ5QnVpbGRlciwgTGlzdDxMaWJyYXJ5QnVpbGRlcj4+IGVudHJ5CiAgICAgICAgaW4gcmVidWlsZEJvZGllc01hcC5lbnRyaWVzKSB7CiAgICAgIE1hcDxTdHJpbmcsIEJ1aWxkZXI+IGNoaWxkUmVwbGFjZW1lbnRNYXAgPSB7fTsKICAgICAgTWFwPFN0cmluZywgQnVpbGRlcj4gY2hpbGRSZXBsYWNlbWVudFNldHRlcnNNYXAgPSB7fTsKICAgICAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gYnVpbGRlcnMgPSByZWJ1aWxkQm9kaWVzTWFwW2VudHJ5LmtleV07CiAgICAgIHJlcGxhY2VtZW50TWFwW2VudHJ5LmtleV0gPSBjaGlsZFJlcGxhY2VtZW50TWFwOwogICAgICByZXBsYWNlbWVudFNldHRlcnNNYXBbZW50cnkua2V5XSA9IGNoaWxkUmVwbGFjZW1lbnRTZXR0ZXJzTWFwOwogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gYnVpbGRlcnMpIHsKICAgICAgICBOYW1lSXRlcmF0b3IgaXRlcmF0b3IgPSBidWlsZGVyLm5hbWVJdGVyYXRvcjsKICAgICAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgICAgQnVpbGRlciBjaGlsZEJ1aWxkZXIgPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgU3RyaW5nIG5hbWUgPSBpdGVyYXRvci5uYW1lOwogICAgICAgICAgTWFwPFN0cmluZywgQnVpbGRlcj4gbWFwOwogICAgICAgICAgaWYgKGNoaWxkQnVpbGRlci5pc1NldHRlcikgewogICAgICAgICAgICBtYXAgPSBjaGlsZFJlcGxhY2VtZW50U2V0dGVyc01hcDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1hcCA9IGNoaWxkUmVwbGFjZW1lbnRNYXA7CiAgICAgICAgICB9CiAgICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICAgIW1hcC5jb250YWluc0tleShuYW1lKSwKICAgICAgICAgICAgICAiVW5leHBlY3RlZCBkb3VibGUtZW50cnkgZm9yICRuYW1lIGluICR7YnVpbGRlci5pbXBvcnRVcml9ICIKICAgICAgICAgICAgICAiKG9yZyBmcm9tICR7ZW50cnkua2V5LmltcG9ydFVyaX0pOiAkY2hpbGRCdWlsZGVyIGFuZCAiCiAgICAgICAgICAgICAgIiR7bWFwW25hbWVdfSIpOwogICAgICAgICAgbWFwW25hbWVdID0gY2hpbGRCdWlsZGVyOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIFdoZW4gZG9pbmcgZXhwZXJpbWVudGFsIGludmFsaWRhdGlvbiwgd2UgaGF2ZSBzb21lIGJ1aWxkZXJzIHRoYXQgbmVlZHMgdG8KICAvLy8gYmUgcmVidWlsZCBzcGVjaWFsLCBuYW1lbHkgdGhleSBoYXZlIHRvIGJlIFt1c2VyQ29kZS5sb2FkZXIucmVhZF0gd2l0aAogIC8vLyByZWZlcmVuY2VzIGZyb20gdGhlIG9yaWdpbmFsIFtMaWJyYXJ5XSBmb3IgdGhpbmdzIHRvIHdvcmsuCiAgTWFwPExpYnJhcnlCdWlsZGVyLCBMaXN0PExpYnJhcnlCdWlsZGVyPj4KICAgICAgZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uQ3JlYXRlUmVidWlsZEJvZGllc0J1aWxkZXJzKAogICAgICAgICAgRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiwKICAgICAgICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvcikgewogICAgLy8gQW55IGJ1aWxkZXIocykgaW4gW3JlYnVpbGRCb2RpZXNdIHNob3VsZCBiZSBzZW1pLXJldXNlZDogQ3JlYXRlIHNvdXJjZQogICAgLy8gYnVpbGRlcnMgYmFzZWQgb24gdGhlIHVuZGVybHlpbmcgbGlicmFyaWVzLgogICAgLy8gTWFwcyBmcm9tIG9sZCBsaWJyYXJ5IGJ1aWxkZXIgdG8gbGlzdCBvZiBuZXcgbGlicmFyeSBidWlsZGVyKHMpLgogICAgTWFwPExpYnJhcnlCdWlsZGVyLCBMaXN0PExpYnJhcnlCdWlsZGVyPj4gcmVidWlsZEJvZGllc01hcCA9CiAgICAgICAgbmV3IE1hcDxMaWJyYXJ5QnVpbGRlciwgTGlzdDxMaWJyYXJ5QnVpbGRlcj4+LmlkZW50aXR5KCk7CiAgICBpZiAoZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uICE9IG51bGwpIHsKICAgICAgZm9yIChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5IGluIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbi5yZWJ1aWxkQm9kaWVzKSB7CiAgICAgICAgTGlicmFyeUJ1aWxkZXIgbmV3QnVpbGRlciA9IHVzZXJDb2RlLmxvYWRlci5yZWFkKGxpYnJhcnkuaW1wb3J0VXJpLCAtMSwKICAgICAgICAgICAgYWNjZXNzb3I6IHVzZXJDb2RlLmxvYWRlci5maXJzdCwKICAgICAgICAgICAgZmlsZVVyaTogbGlicmFyeS5maWxlVXJpLAogICAgICAgICAgICByZWZlcmVuY2VzRnJvbTogbGlicmFyeS5saWJyYXJ5KTsKICAgICAgICBMaXN0PExpYnJhcnlCdWlsZGVyPiBidWlsZGVycyA9IFtuZXdCdWlsZGVyXTsKICAgICAgICByZWJ1aWxkQm9kaWVzTWFwW2xpYnJhcnldID0gYnVpbGRlcnM7CiAgICAgICAgZm9yIChMaWJyYXJ5UGFydCBwYXJ0IGluIGxpYnJhcnkubGlicmFyeS5wYXJ0cykgewogICAgICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoZSByZWZlcmVuY2UgdG8gbWFrZSBhbnkgY2xhc3MsIHByb2NlZHVyZSBldGMKICAgICAgICAgIC8vIG92ZXJ3cml0ZSBjb3JyZWN0bHksIGJ1dCB0aGUgbGlicmFyeSBpdHNlbGYgc2hvdWxkICBub3QgYmUKICAgICAgICAgIC8vIG92ZXIgd3JpdHRlbiBhcyB0aGUgbGlicmFyeSBmb3IgcGFydHMgYXJlIHRlbXBvcmFyeSAiZmFrZSIKICAgICAgICAgIC8vIGxpYnJhcmllcy4KICAgICAgICAgIFVyaSBwYXJ0VXJpID0gZ2V0UGFydFVyaShsaWJyYXJ5LmltcG9ydFVyaSwgcGFydCk7CiAgICAgICAgICBVcmkgZmlsZVVyaSA9CiAgICAgICAgICAgICAgZ2V0UGFydEZpbGVVcmkobGlicmFyeS5saWJyYXJ5LmZpbGVVcmksIHBhcnQsIHVyaVRyYW5zbGF0b3IpOwogICAgICAgICAgTGlicmFyeUJ1aWxkZXIgbmV3UGFydEJ1aWxkZXIgPSB1c2VyQ29kZS5sb2FkZXIucmVhZChwYXJ0VXJpLCAtMSwKICAgICAgICAgICAgICBhY2Nlc3NvcjogbGlicmFyeSwKICAgICAgICAgICAgICBmaWxlVXJpOiBmaWxlVXJpLAogICAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tOiBsaWJyYXJ5LmxpYnJhcnksCiAgICAgICAgICAgICAgcmVmZXJlbmNlSXNQYXJ0T3duZXI6IHRydWUpOwogICAgICAgICAgYnVpbGRlcnMuYWRkKG5ld1BhcnRCdWlsZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZWJ1aWxkQm9kaWVzTWFwOwogIH0KCiAgLy8vIFdoZW4gZG9pbmcgZXhwZXJpbWVudGFsIGludmFsaWRhdGlvbiB3ZSBoYXZlIHRvIHBhdGNoIHVwIHRoZSBzY29wZXMgb2YgdGhlCiAgLy8vIHRoZSBsaWJyYXJpZXMgd2UncmUgbm90IHJlY29tcGlsaW5nIGJ1dCBzaG91bGQgaGF2ZSByZWNvbXBpbGVkIGlmIHdlCiAgLy8vIGRpZG4ndCBkbyBhbnl0aGluZyBzcGVjaWFsLgogIHZvaWQgZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uUGF0Y2hVcFNjb3BlcygKICAgICAgRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiwKICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBMaXN0PExpYnJhcnlCdWlsZGVyPj4gcmVidWlsZEJvZGllc01hcCkgewogICAgaWYgKGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiAhPSBudWxsKSB7CiAgICAgIC8vIE1hcHMgZnJvbSBvbGQgbGlicmFyeSBidWlsZGVyIHRvIG1hcCBvZiBuZXcgY29udGVudC4KICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBNYXA8U3RyaW5nLCBCdWlsZGVyPj4gcmVwbGFjZW1lbnRNYXAgPSB7fTsKCiAgICAgIC8vIE1hcHMgZnJvbSBvbGQgbGlicmFyeSBidWlsZGVyIHRvIG1hcCBvZiBuZXcgY29udGVudC4KICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBNYXA8U3RyaW5nLCBCdWlsZGVyPj4gcmVwbGFjZW1lbnRTZXR0ZXJzTWFwID0ge307CgogICAgICBleHBlcmltZW50YWxJbnZhbGlkYXRpb25GaWxsUmVwbGFjZW1lbnRNYXBzKAogICAgICAgICAgcmVidWlsZEJvZGllc01hcCwgcmVwbGFjZW1lbnRNYXAsIHJlcGxhY2VtZW50U2V0dGVyc01hcCk7CgogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIKICAgICAgICAgIGluIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbi5vcmlnaW5hbE5vdFJldXNlZExpYnJhcmllcykgewogICAgICAgIGlmIChidWlsZGVyIGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgICBidWlsZGVyLmNsZWFyRXh0ZW5zaW9uc0luU2NvcGVDYWNoZSgpOwogICAgICAgICAgZm9yIChJbXBvcnQgaW1wb3J0IGluIGJ1aWxkZXIuaW1wb3J0cykgewogICAgICAgICAgICBhc3NlcnQoaW1wb3J0LmltcG9ydGVyID09IGJ1aWxkZXIpOwogICAgICAgICAgICBMaXN0PExpYnJhcnlCdWlsZGVyPiByZXBsYWNlbWVudHMgPQogICAgICAgICAgICAgICAgcmVidWlsZEJvZGllc01hcFtpbXBvcnQuaW1wb3J0ZWRdOwogICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgICBpbXBvcnQuaW1wb3J0ZWQgPSByZXBsYWNlbWVudHMuZmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGltcG9ydC5wcmVmaXhCdWlsZGVyPy5leHBvcnRTY29wZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgU2NvcGUgc2NvcGUgPSBpbXBvcnQucHJlZml4QnVpbGRlcj8uZXhwb3J0U2NvcGU7CiAgICAgICAgICAgICAgc2NvcGUucGF0Y2hVcFNjb3BlKHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gYnVpbGRlci5leHBvcnRzKSB7CiAgICAgICAgICAgIGFzc2VydChleHBvcnQuZXhwb3J0ZXIgPT0gYnVpbGRlcik7CiAgICAgICAgICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IHJlcGxhY2VtZW50cyA9CiAgICAgICAgICAgICAgICByZWJ1aWxkQm9kaWVzTWFwW2V4cG9ydC5leHBvcnRlZF07CgogICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgICBleHBvcnQuZXhwb3J0ZWQgPSByZXBsYWNlbWVudHMuZmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJ1aWxkZXIuZXhwb3J0U2NvcGUKICAgICAgICAgICAgICAucGF0Y2hVcFNjb3BlKHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXApOwogICAgICAgICAgYnVpbGRlci5pbXBvcnRTY29wZQogICAgICAgICAgICAgIC5wYXRjaFVwU2NvcGUocmVwbGFjZW1lbnRNYXAsIHJlcGxhY2VtZW50U2V0dGVyc01hcCk7CgogICAgICAgICAgSXRlcmF0b3I8QnVpbGRlcj4gaXRlcmF0b3IgPSBidWlsZGVyLml0ZXJhdG9yOwogICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICAgICAgQnVpbGRlciBjaGlsZEJ1aWxkZXIgPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgICBpZiAoY2hpbGRCdWlsZGVyIGlzIFNvdXJjZUNsYXNzQnVpbGRlcikgewogICAgICAgICAgICAgIFR5cGVCdWlsZGVyIHR5cGVCdWlsZGVyID0gY2hpbGRCdWlsZGVyLnN1cGVydHlwZTsKICAgICAgICAgICAgICByZXBsYWNlVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXAsIHR5cGVCdWlsZGVyKTsKICAgICAgICAgICAgICB0eXBlQnVpbGRlciA9IGNoaWxkQnVpbGRlci5taXhlZEluVHlwZTsKICAgICAgICAgICAgICByZXBsYWNlVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXAsIHR5cGVCdWlsZGVyKTsKICAgICAgICAgICAgICBpZiAoY2hpbGRCdWlsZGVyLm9uVHlwZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh0eXBlQnVpbGRlciBpbiBjaGlsZEJ1aWxkZXIub25UeXBlcykgewogICAgICAgICAgICAgICAgICByZXBsYWNlVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudE1hcCwgcmVwbGFjZW1lbnRTZXR0ZXJzTWFwLCB0eXBlQnVpbGRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChjaGlsZEJ1aWxkZXIuaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBmb3IgKHR5cGVCdWlsZGVyIGluIGNoaWxkQnVpbGRlci5pbnRlcmZhY2VzKSB7CiAgICAgICAgICAgICAgICAgIHJlcGxhY2VUeXBlQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXAsIHR5cGVCdWlsZGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgaXMgRGlsbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgICBEaWxsTGlicmFyeUJ1aWxkZXIgZGlsbEJ1aWxkZXIgPSBidWlsZGVyOwogICAgICAgICAgLy8gVGhlcmUncyBvbmx5IHNvbWV0aGluZyB0byBwYXRjaCB1cCBpZiBpdCB3YXMgYnVpbGQgYWxyZWFkeS4KICAgICAgICAgIGlmIChkaWxsQnVpbGRlci5pc0J1aWx0KSB7CiAgICAgICAgICAgIGRpbGxCdWlsZGVyLmV4cG9ydFNjb3BlCiAgICAgICAgICAgICAgICAucGF0Y2hVcFNjb3BlKHJlcGxhY2VtZW50TWFwLCByZXBsYWNlbWVudFNldHRlcnNNYXApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICAgICAiVW5leHBlY3RlZCBidWlsZGVyOiAkYnVpbGRlciAoJHtidWlsZGVyLnJ1bnRpbWVUeXBlfSkiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyBDcmVhdGUgYSBuZXcgW3VzZXJDb2RlXSBvYmplY3QsIGFuZCBhZGQgdGhlIHJldXNlZCBidWlsZGVycyB0byBpdC4KICB2b2lkIHNldHVwTmV3VXNlckNvZGUoCiAgICAgIENvbXBpbGVyQ29udGV4dCBjLAogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmV1c2VkTGlicmFyaWVzLAogICAgICBFeHBlcmltZW50YWxJbnZhbGlkYXRpb24gZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uLAogICAgICBVcmkgZmlyc3RFbnRyeVBvaW50KSB7CiAgICB1c2VyQ29kZSA9IG5ldyBJbmNyZW1lbnRhbEtlcm5lbFRhcmdldCgKICAgICAgICBuZXcgSHlicmlkRmlsZVN5c3RlbSgKICAgICAgICAgICAgbmV3IE1lbW9yeUZpbGVTeXN0ZW0oCiAgICAgICAgICAgICAgICBuZXcgVXJpKHNjaGVtZTogIm9yZy1kYXJ0bGFuZy1kZWJ1ZyIsIHBhdGg6ICIvIikpLAogICAgICAgICAgICBjLmZpbGVTeXN0ZW0pLAogICAgICAgIGZhbHNlLAogICAgICAgIGRpbGxMb2FkZWREYXRhLAogICAgICAgIHVyaVRyYW5zbGF0b3IpOwogICAgdXNlckNvZGUubG9hZGVyLmhpZXJhcmNoeSA9IGhpZXJhcmNoeTsKICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5jdXJyZW50U291cmNlTG9hZGVyID0gdXNlckNvZGUubG9hZGVyOwoKICAgIC8vIFJlLXVzZSB0aGUgbGlicmFyaWVzIHdlJ3ZlIGRlZW1lZCByZS11c2FibGUuCiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gcmV1c2VkTGlicmFyaWVzKSB7CiAgICAgIHVzZXJDb2RlLmxvYWRlci5idWlsZGVyc1tsaWJyYXJ5LmltcG9ydFVyaV0gPSBsaWJyYXJ5OwogICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICJkYXJ0IiAmJgogICAgICAgICAgbGlicmFyeS5pbXBvcnRVcmkucGF0aCA9PSAiY29yZSIpIHsKICAgICAgICB1c2VyQ29kZS5sb2FkZXIuY29yZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICB9CiAgICB9CgogICAgLy8gVGhlIGVudHJ5IHBvaW50KHMpIGhhcyB0byBiZSBzZXQgZmlyc3QgZm9yIGxvYWRlci5maXJzdCB0byBiZSBzZXR1cAogICAgLy8gY29ycmVjdGx5LiBJZiB0aGUgZmlyc3Qgb25lIGlzIGluIHRoZSByZWJ1aWxkQm9kaWVzLCB3ZSBoYXZlIHRvIGFkZCBpdAogICAgLy8gZnJvbSB0aGVyZSBmaXJzdC4KICAgIFVyaSBmaXJzdEVudHJ5UG9pbnRJbXBvcnRVcmkgPQogICAgICAgIHVzZXJDb2RlLmdldEVudHJ5UG9pbnRVcmkoZmlyc3RFbnRyeVBvaW50LCBpc3N1ZVByb2JsZW06IGZhbHNlKTsKICAgIGJvb2wgd2FzRmlyc3RTZXQgPSBmYWxzZTsKICAgIGlmIChleHBlcmltZW50YWxJbnZhbGlkYXRpb24gIT0gbnVsbCkgewogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gZXhwZXJpbWVudGFsSW52YWxpZGF0aW9uLnJlYnVpbGRCb2RpZXMpIHsKICAgICAgICBpZiAobGlicmFyeS5pbXBvcnRVcmkgPT0gZmlyc3RFbnRyeVBvaW50SW1wb3J0VXJpKSB7CiAgICAgICAgICB1c2VyQ29kZS5sb2FkZXIucmVhZChsaWJyYXJ5LmltcG9ydFVyaSwgLTEsCiAgICAgICAgICAgICAgYWNjZXNzb3I6IHVzZXJDb2RlLmxvYWRlci5maXJzdCwKICAgICAgICAgICAgICBmaWxlVXJpOiBsaWJyYXJ5LmZpbGVVcmksCiAgICAgICAgICAgICAgcmVmZXJlbmNlc0Zyb206IGxpYnJhcnkubGlicmFyeSk7CiAgICAgICAgICB3YXNGaXJzdFNldCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghd2FzRmlyc3RTZXQpIHsKICAgICAgdXNlckNvZGUubG9hZGVyLnJlYWQoZmlyc3RFbnRyeVBvaW50SW1wb3J0VXJpLCAtMSwKICAgICAgICAgIGFjY2Vzc29yOiB1c2VyQ29kZS5sb2FkZXIuZmlyc3QsCiAgICAgICAgICBmaWxlVXJpOiBmaXJzdEVudHJ5UG9pbnRJbXBvcnRVcmkgIT0gZmlyc3RFbnRyeVBvaW50CiAgICAgICAgICAgICAgPyBmaXJzdEVudHJ5UG9pbnQKICAgICAgICAgICAgICA6IG51bGwpOwogICAgfQogICAgaWYgKHVzZXJDb2RlLmxvYWRlci5maXJzdCA9PSBudWxsICYmCiAgICAgICAgdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJzW2ZpcnN0RW50cnlQb2ludEltcG9ydFVyaV0gIT0gbnVsbCkgewogICAgICB1c2VyQ29kZS5sb2FkZXIuZmlyc3QgPQogICAgICAgICAgdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJzW2ZpcnN0RW50cnlQb2ludEltcG9ydFVyaV07CiAgICB9CiAgfQoKICAvLy8gV2hlbiB0cmFja2luZyB1c2VkIGxpYnJhcmllcyB3ZSBtYXJrIHRoZW0gd2hlbiB3ZSB1c2UgdGhlbS4gVG8gdHJhY2sKICAvLy8gY29ycmVjdGx5IHdlIGhhdmUgdG8gdW5tYXJrIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24gdG8gbm90IGhhdmUgdG9vIG11Y2gKICAvLy8gbWFya2VkIGFuZCB0aGVyZWZvcmUgaW5jb3JyZWN0bHkgbWFya2VkIHNvbWV0aGluZyBhcyB1c2VkIHdoZW4gaXQgaXMgbm90LgogIHZvaWQgcmVzZXRUcmFja2luZ09mVXNlZExpYnJhcmllcyhDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpIHsKICAgIGlmICh0cmFja05lZWRlZERpbGxMaWJyYXJpZXMpIHsKICAgICAgLy8gUmVzZXQgZGlsbCBsb2FkZXJzIGFuZCBrZXJuZWwgY2xhc3MgaGllcmFyY2h5LgogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLnZhbHVlcykgewogICAgICAgIGlmIChidWlsZGVyIGlzIERpbGxMaWJyYXJ5QnVpbGRlcikgewogICAgICAgICAgaWYgKGJ1aWxkZXIuaXNCdWlsdEFuZE1hcmtlZCkgewogICAgICAgICAgICAvLyBDbGVhciBjYWNoZWQgY2FsY3VsYXRpb25zIGluIGNsYXNzZXMgd2hpY2ggdXBvbiBjYWxjdWxhdGlvbiBjYW4KICAgICAgICAgICAgLy8gbWFyayB0aGluZ3MgYXMgbmVlZGVkLgogICAgICAgICAgICBmb3IgKEJ1aWxkZXIgYnVpbGRlciBpbiBidWlsZGVyLnNjb3BlLmxvY2FsTWVtYmVycykgewogICAgICAgICAgICAgIGlmIChidWlsZGVyIGlzIERpbGxDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgICAgICAgIGJ1aWxkZXIuc3VwZXJ0eXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIGJ1aWxkZXIuaW50ZXJmYWNlcyA9IG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1aWxkZXIuaXNCdWlsdEFuZE1hcmtlZCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGhpZXJhcmNoeSBpcyBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5KSB7CiAgICAgICAgaGllcmFyY2h5LnJlc2V0VXNlZCgpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ2xlYW51cCB0aGUgaGllcmFyY2h5IHRvIG5vIGxvbmdlciByZWZlcmVuY2UgbGlicmFyaWVzIHRoYXQgd2UgYXJlCiAgLy8vIGludmFsaWRhdGluZyAob3Igd291bGQgbm9ybWFsbHkgaGF2ZSBpbnZhbGlkYXRlZCBpZiB3ZSBoYWRuJ3QgZG9uZSBhbnkKICAvLy8gZXhwZXJpbWVudGFsIGludmFsaWRhdGlvbikuCiAgdm9pZCBjbGVhbnVwSGllcmFyY2h5KAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIEV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiBleHBlcmltZW50YWxJbnZhbGlkYXRpb24sCiAgICAgIFJldXNhZ2VSZXN1bHQgcmV1c2VkUmVzdWx0KSB7CiAgICBpZiAoaGllcmFyY2h5ICE9IG51bGwpIHsKICAgICAgTGlzdDxMaWJyYXJ5PiByZW1vdmVkTGlicmFyaWVzID0gbmV3IExpc3Q8TGlicmFyeT4oKTsKICAgICAgLy8gVE9ETyhqZW5zaik6IEZvciBub3cgcmVtb3ZlIGFsbCB0aGUgb3JpZ2luYWwgZnJvbSB0aGUgY2xhc3MgaGllcmFyY2h5CiAgICAgIC8vIHRvIGF2b2lkIHRoZSBjbGFzcyBoaWVyYXJjaHkgZ2V0dGluZyBjb25mdXNlZC4KICAgICAgaWYgKGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgZm9yIChMaWJyYXJ5QnVpbGRlciBidWlsZGVyCiAgICAgICAgICAgIGluIGV4cGVyaW1lbnRhbEludmFsaWRhdGlvbi5vcmlnaW5hbE5vdFJldXNlZExpYnJhcmllcykgewogICAgICAgICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLmxpYnJhcnk7CiAgICAgICAgICByZW1vdmVkTGlicmFyaWVzLmFkZChsaWIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gcmV1c2VkUmVzdWx0Lm5vdFJldXNlZExpYnJhcmllcykgewogICAgICAgIExpYnJhcnkgbGliID0gYnVpbGRlci5saWJyYXJ5OwogICAgICAgIHJlbW92ZWRMaWJyYXJpZXMuYWRkKGxpYik7CiAgICAgIH0KICAgICAgaGllcmFyY2h5LmFwcGx5VHJlZUNoYW5nZXMocmVtb3ZlZExpYnJhcmllcywgY29uc3QgW10pOwogICAgfQogIH0KCiAgLy8vIElmIHRoZSBwYWNrYWdlIHVyaXMgbmVlZHMgdG8gYmUgcmUtY2hlY2tlZCB0aGUgdXJpIHRyYW5zbGF0b3IgaGFzIGNoYW5nZWQsCiAgLy8vIGFuZCB0aGUgW0RpbGxUYXJnZXRdIG5lZWRzIHRvIGdldCB0aGUgbmV3IHVyaSB0cmFuc2xhdG9yLiBXZSBkbyB0aGF0CiAgLy8vIGJ5IGNyZWF0aW5nIGEgbmV3IG9uZS4KICB2b2lkIHJlY3JlYXRlRGlsbFRhcmdldElmUGFja2FnZVdhc1VwZGF0ZWQoCiAgICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwgQ29tcGlsZXJDb250ZXh0IGMpIHsKICAgIGlmIChoYXNUb0NoZWNrUGFja2FnZVVyaXMpIHsKICAgICAgLy8gVGhlIHBhY2thZ2UgZmlsZSB3YXMgY2hhbmdlZC4KICAgICAgLy8gTWFrZSBzdXJlIHRoZSBkaWxsIGxvYWRlciBpcyBvbiB0aGUgc2FtZSBwYWdlLgogICAgICBEaWxsVGFyZ2V0IG9sZERpbGxMb2FkZWREYXRhID0gZGlsbExvYWRlZERhdGE7CiAgICAgIGRpbGxMb2FkZWREYXRhID0gbmV3IERpbGxUYXJnZXQodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBjLm9wdGlvbnMudGFyZ2V0KTsKICAgICAgZm9yIChEaWxsTGlicmFyeUJ1aWxkZXIgbGlicmFyeQogICAgICAgICAgaW4gb2xkRGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLnZhbHVlcykgewogICAgICAgIGxpYnJhcnkubG9hZGVyID0gZGlsbExvYWRlZERhdGEubG9hZGVyOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVyc1tsaWJyYXJ5LmltcG9ydFVyaV0gPSBsaWJyYXJ5OwogICAgICAgIGlmIChsaWJyYXJ5LmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiICYmCiAgICAgICAgICAgIGxpYnJhcnkuaW1wb3J0VXJpLnBhdGggPT0gImNvcmUiKSB7CiAgICAgICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuY29yZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgIH0KICAgICAgfQogICAgICBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuZmlyc3QgPSBvbGREaWxsTG9hZGVkRGF0YS5sb2FkZXIuZmlyc3Q7CiAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMKICAgICAgICAgIC5hZGRBbGwob2xkRGlsbExvYWRlZERhdGEubG9hZGVyLmxpYnJhcmllcyk7CiAgICB9CiAgfQoKICAvLy8gQnVpbGRlcnMgd2UgZG9uJ3QgdXNlIGFnYWluIHNob3VsZCBiZSByZW1vdmVkIGZyb20gcGxhY2VzIGxpa2UKICAvLy8gdXJpVG9Tb3VyY2UgKHVzZWQgaW4gcGxhY2VzIGZvciBkZXBlbmRlbmN5IHRyYWNraW5nKSwgdGhlIGluY3JlbWVudGFsCiAgLy8vIHNlcmlhbGl6ZXIgKHRoZXkgYXJlIG5vIGxvbmdlciBrZXB0IHVwLXRvLWRhdGUpIGFuZCB0aGUgRGlsbFRhcmdldAogIC8vLyAodG8gYXZvaWQgbGVha3MpLgogIC8vLyBXZSBhbHNvIGhhdmUgdG8gcmVtb3ZlIGFueSBjb21wb25lbnQgcHJvYmxlbXMgYmVsb25pbmcgdG8gYW55IHN1Y2gKICAvLy8gbm8tbG9uZ2VyLXVzZWQgbGlicmFyeSAodG8gYXZvaWQgcmUtaXNzdWluZyBlcnJvcnMgYWJvdXQgbm8gbG9uZ2VyCiAgLy8vIHJlbGV2YW50IHN0dWZmKS4KICB2b2lkIGNsZWFudXBSZW1vdmVkQnVpbGRlcnMoCiAgICAgIFJldXNhZ2VSZXN1bHQgcmV1c2VkUmVzdWx0LCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IpIHsKICAgIGJvb2wgcmVtb3ZlZERpbGxCdWlsZGVycyA9IGZhbHNlOwogICAgZm9yIChMaWJyYXJ5QnVpbGRlciBidWlsZGVyIGluIHJldXNlZFJlc3VsdC5ub3RSZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgY2xlYW51cFNvdXJjZXNGb3JCdWlsZGVyKAogICAgICAgICAgYnVpbGRlciwgdXJpVHJhbnNsYXRvciwgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2UpOwogICAgICBpbmNyZW1lbnRhbFNlcmlhbGl6ZXI/LmludmFsaWRhdGUoYnVpbGRlci5maWxlVXJpKTsKCiAgICAgIExpYnJhcnlCdWlsZGVyIGRpbGxCdWlsZGVyID0KICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5yZW1vdmUoYnVpbGRlci5pbXBvcnRVcmkpOwogICAgICBpZiAoZGlsbEJ1aWxkZXIgIT0gbnVsbCkgewogICAgICAgIHJlbW92ZWREaWxsQnVpbGRlcnMgPSB0cnVlOwogICAgICAgIHVzZXJCdWlsZGVycz8ucmVtb3ZlKGJ1aWxkZXIuaW1wb3J0VXJpKTsKICAgICAgfQoKICAgICAgLy8gUmVtb3ZlIGNvbXBvbmVudCBwcm9ibGVtcyBmb3IgbGlicmFyaWVzIHdlIGRvbid0IHJldXNlLgogICAgICBpZiAocmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMuaXNOb3RFbXB0eSkgewogICAgICAgIExpYnJhcnkgbGliID0gYnVpbGRlci5saWJyYXJ5OwogICAgICAgIHJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMobGliLCB1cmlUcmFuc2xhdG9yKTsKICAgICAgfQogICAgfQoKICAgIGlmIChyZW1vdmVkRGlsbEJ1aWxkZXJzKSB7CiAgICAgIG1ha2VEaWxsTG9hZGVyTGlicmFyaWVzVXBUb0RhdGVXaXRoQnVpbGRlcnNNYXAoKTsKICAgIH0KICB9CgogIC8vLyBGaWd1cmUgb3V0IGlmIHdlIGNhbiAoYW5kIHdhcyBhc2tlZCB0bykgZG8gZXhwZXJpbWVudGFsIGludmFsaWRhdGlvbi4KICAvLy8gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyAoZnV0dXJlIG9yKSBbbnVsbF0gaWYgd2UncmUgbm90IGRvaW5nIGV4cGVyaW1lbnRhbAogIC8vLyBpbnZhbGlkYXRpb24uCiAgRnV0dXJlPEV4cGVyaW1lbnRhbEludmFsaWRhdGlvbj4gaW5pdGlhbGl6ZUV4cGVyaW1lbnRhbEludmFsaWRhdGlvbigKICAgICAgUmV1c2FnZVJlc3VsdCByZXVzZWRSZXN1bHQsIENvbXBpbGVyQ29udGV4dCBjKSBhc3luYyB7CiAgICBTZXQ8TGlicmFyeUJ1aWxkZXI+IHJlYnVpbGRCb2RpZXM7CiAgICBTZXQ8TGlicmFyeUJ1aWxkZXI+IG9yaWdpbmFsTm90UmV1c2VkTGlicmFyaWVzOwogICAgU2V0PFVyaT4gbWlzc2luZ1NvdXJjZXM7CgogICAgaWYgKCF1c2VFeHBlcmltZW50YWxJbnZhbGlkYXRpb24pIHJldHVybiBudWxsOwogICAgaWYgKG1vZHVsZXNUb0xvYWQgIT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAocmV1c2VkUmVzdWx0LmRpcmVjdGx5SW52YWxpZGF0ZWQuaXNFbXB0eSkgcmV0dXJuIG51bGw7CiAgICBpZiAocmV1c2VkUmVzdWx0LmludmFsaWRhdGVkQmVjYXVzZU9mUGFja2FnZVVwZGF0ZSkgcmV0dXJuIG51bGw7CgogICAgLy8gRmlndXJlIG91dCBpZiB0aGUgZmlsZShzKSBoYXZlIGNoYW5nZWQgb3V0bGluZSwgb3Igd2UgY2FuIGp1c3QKICAgIC8vIHJlYnVpbGQgdGhlIGJvZGllcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV1c2VkUmVzdWx0LmRpcmVjdGx5SW52YWxpZGF0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgTGlicmFyeUJ1aWxkZXIgYnVpbGRlciA9IHJldXNlZFJlc3VsdC5kaXJlY3RseUludmFsaWRhdGVkW2ldOwogICAgICBpZiAoYnVpbGRlci5saWJyYXJ5LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgICBhc3NlcnQoYnVpbGRlci5saWJyYXJ5LnByb2JsZW1zQXNKc29uLmlzTm90RW1wdHkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIEl0ZXJhdG9yPEJ1aWxkZXI+IGl0ZXJhdG9yID0gYnVpbGRlci5pdGVyYXRvcjsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBCdWlsZGVyIGNoaWxkQnVpbGRlciA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgICAgaWYgKGNoaWxkQnVpbGRlci5pc0R1cGxpY2F0ZSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgICBMaXN0PGludD4gcHJldmlvdXNTb3VyY2UgPQogICAgICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2VbYnVpbGRlci5maWxlVXJpXS5zb3VyY2U7CiAgICAgIGlmIChwcmV2aW91c1NvdXJjZSA9PSBudWxsIHx8IHByZXZpb3VzU291cmNlLmlzRW1wdHkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBTdHJpbmcgYmVmb3JlID0gdGV4dHVhbE91dGxpbmUocHJldmlvdXNTb3VyY2UpOwogICAgICBpZiAoYmVmb3JlID09IG51bGwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBTdHJpbmcgbm93OwogICAgICBGaWxlU3lzdGVtRW50aXR5IGVudGl0eSA9CiAgICAgICAgICBjLm9wdGlvbnMuZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoYnVpbGRlci5maWxlVXJpKTsKICAgICAgaWYgKGF3YWl0IGVudGl0eS5leGlzdHMoKSkgewogICAgICAgIG5vdyA9IHRleHR1YWxPdXRsaW5lKGF3YWl0IGVudGl0eS5yZWFkQXNCeXRlcygpKTsKICAgICAgfQogICAgICBpZiAoYmVmb3JlICE9IG5vdykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8vIFRPRE8oamVuc2opOiBXZSBzaG91bGQgb25seSBkbyB0aGlzIHdoZW4gd2UncmUgc3VyZSB3ZSdyZSBnb2luZyB0bwogICAgICAvLyBkbyBpdCEKICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2UucmVtb3ZlKGJ1aWxkZXIuZmlsZVVyaSk7CiAgICAgIG1pc3NpbmdTb3VyY2VzID8/PSBuZXcgU2V0PFVyaT4oKTsKICAgICAgbWlzc2luZ1NvdXJjZXMuYWRkKGJ1aWxkZXIuZmlsZVVyaSk7CiAgICAgIExpYnJhcnlCdWlsZGVyIHBhcnRPZkxpYnJhcnkgPSBidWlsZGVyLnBhcnRPZkxpYnJhcnk7CiAgICAgIHJlYnVpbGRCb2RpZXMgPz89IG5ldyBTZXQ8TGlicmFyeUJ1aWxkZXI+KCk7CiAgICAgIGlmIChwYXJ0T2ZMaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICByZWJ1aWxkQm9kaWVzLmFkZChwYXJ0T2ZMaWJyYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWJ1aWxkQm9kaWVzLmFkZChidWlsZGVyKTsKICAgICAgfQogICAgfQoKICAgIC8vIFRPRE8oamVuc2opOiBDaGVjayBmb3IgbWl4aW5zIGluIGEgc21hcnRlciBhbmQgZmFzdGVyIHdheS4KICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiByZXVzZWRSZXN1bHQubm90UmV1c2VkTGlicmFyaWVzKSB7CiAgICAgIGlmIChtaXNzaW5nU291cmNlcy5jb250YWlucyhidWlsZGVyLmZpbGVVcmkpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLmxpYnJhcnk7CiAgICAgIGZvciAoQ2xhc3MgYyBpbiBsaWIuY2xhc3NlcykgewogICAgICAgIGlmICghYy5pc0Fub255bW91c01peGluICYmICFjLmlzRWxpbWluYXRlZE1peGluKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9yIChTdXBlcnR5cGUgc3VwZXJ0eXBlIGluIGMuaW1wbGVtZW50ZWRUeXBlcykgewogICAgICAgICAgaWYgKG1pc3NpbmdTb3VyY2VzLmNvbnRhaW5zKHN1cGVydHlwZS5jbGFzc05vZGUuZmlsZVVyaSkpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIG1peGluIGZyb20gb25lIG9mIHRoZSBsaWJyYXJpZXMgd2Ugd2FudAogICAgICAgICAgICAvLyB0byByZWJ1aWxkIG9ubHkgdGhlIGJvZHkgb2YuCiAgICAgICAgICAgIC8vIFRPRE8oamVuc2opOiBXZSBjYW4gcHJvYmFibHkgYWRkIHRoaXMgdG8gdGhlIHJlYnVpbGRCb2RpZXMKICAgICAgICAgICAgLy8gbGlzdCBhbmQganVzdCByZWJ1aWxkIHRoYXQgbGlicmFyeSB0b28uCiAgICAgICAgICAgIC8vIHByaW50KCJVc2FnZSBvZiBtaXhpbiBpbiAke2xpYi5pbXBvcnRVcml9Iik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIG9yaWdpbmFsTm90UmV1c2VkTGlicmFyaWVzID0gbmV3IFNldDxMaWJyYXJ5QnVpbGRlcj4oKTsKICAgIFNldDxVcmk+IHNlZW5VcmlzID0gbmV3IFNldDxVcmk+KCk7CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gcmV1c2VkUmVzdWx0Lm5vdFJldXNlZExpYnJhcmllcykgewogICAgICBpZiAoYnVpbGRlci5pc1BhcnQpIGNvbnRpbnVlOwogICAgICBpZiAoYnVpbGRlci5pc1BhdGNoKSBjb250aW51ZTsKICAgICAgaWYgKHJlYnVpbGRCb2RpZXMuY29udGFpbnMoYnVpbGRlcikpIGNvbnRpbnVlOwogICAgICBpZiAoIXNlZW5VcmlzLmFkZChidWlsZGVyLmltcG9ydFVyaSkpIGNvbnRpbnVlOwogICAgICByZXVzZWRSZXN1bHQucmV1c2VkTGlicmFyaWVzLmFkZChidWlsZGVyKTsKICAgICAgb3JpZ2luYWxOb3RSZXVzZWRMaWJyYXJpZXMuYWRkKGJ1aWxkZXIpOwogICAgfQogICAgcmV1c2VkUmVzdWx0Lm5vdFJldXNlZExpYnJhcmllcy5jbGVhcigpOwogICAgcmV1c2VkUmVzdWx0Lm5vdFJldXNlZExpYnJhcmllcy5hZGRBbGwocmVidWlsZEJvZGllcyk7CgogICAgcmV0dXJuIG5ldyBFeHBlcmltZW50YWxJbnZhbGlkYXRpb24oCiAgICAgICAgcmVidWlsZEJvZGllcywgb3JpZ2luYWxOb3RSZXVzZWRMaWJyYXJpZXMsIG1pc3NpbmdTb3VyY2VzKTsKICB9CgogIC8vLyBHZXQgVXJpVHJhbnNsYXRvciwgYW5kIGZpZ3VyZSBvdXQgaWYgdGhlIHBhY2thZ2VzIGZpbGUgd2FzIChwb3RlbnRpYWxseSkKICAvLy8gY2hhbmdlZC4KICBGdXR1cmU8VXJpVHJhbnNsYXRvcj4gc2V0dXBQYWNrYWdlc0FuZFVyaVRyYW5zbGF0b3IoQ29tcGlsZXJDb250ZXh0IGMpIGFzeW5jIHsKICAgIGJvb2wgYnlwYXNzQ2FjaGUgPSBmYWxzZTsKICAgIGlmICghaWRlbnRpY2FsKHByZXZpb3VzUGFja2FnZXNVcmksIGMub3B0aW9ucy5wYWNrYWdlc1VyaVJhdykpIHsKICAgICAgcHJldmlvdXNQYWNrYWdlc1VyaSA9IGMub3B0aW9ucy5wYWNrYWdlc1VyaVJhdzsKICAgICAgYnlwYXNzQ2FjaGUgPSB0cnVlOwogICAgfSBlbHNlIGlmICh0aGlzLmludmFsaWRhdGVkVXJpcy5jb250YWlucyhjLm9wdGlvbnMucGFja2FnZXNVcmkpKSB7CiAgICAgIGJ5cGFzc0NhY2hlID0gdHJ1ZTsKICAgIH0KICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciA9CiAgICAgICAgYXdhaXQgYy5vcHRpb25zLmdldFVyaVRyYW5zbGF0b3IoYnlwYXNzQ2FjaGU6IGJ5cGFzc0NhY2hlKTsKICAgIHByZXZpb3VzUGFja2FnZXNNYXAgPSBjdXJyZW50UGFja2FnZXNNYXA7CiAgICBjdXJyZW50UGFja2FnZXNNYXAgPSB1cmlUcmFuc2xhdG9yLnBhY2thZ2VzLmFzTWFwKCk7CiAgICAvLyBUT0RPKGplbnNqKTogV2UgY2FuIHByb2JhYmx5IChmcm9tIHRoZSBtYXBzIGFib3ZlKSBmaWd1cmUgb3V0IGlmIGFueXRoaW5nCiAgICAvLyBjaGFuZ2VkIGFuZCBvbmx5IHNldCB0aGlzIHRvIHRydWUgaWYgaXQgZGlkLgogICAgaGFzVG9DaGVja1BhY2thZ2VVcmlzID0gaGFzVG9DaGVja1BhY2thZ2VVcmlzIHx8IGJ5cGFzc0NhY2hlOwogICAgdGlja2VyLmxvZ01zKCJSZWFkIHBhY2thZ2VzIGZpbGUiKTsKICAgIHJldHVybiB1cmlUcmFuc2xhdG9yOwogIH0KCiAgLy8vIExvYWQgcGxhdGZvcm0gYW5kIChwb3RlbnRpYWxseSkgaW5pdGlhbGl6ZSBmcm9tIGRpbGwsCiAgLy8vIG9yIGluaXRpYWxpemUgZnJvbSBjb21wb25lbnQuCiAgRnV0dXJlPEluY3JlbWVudGFsQ29tcGlsZXJEYXRhPiBlbnN1cmVQbGF0Zm9ybUFuZEluaXRpYWxpemUoCiAgICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwgQ29tcGlsZXJDb250ZXh0IGMpIGFzeW5jIHsKICAgIEluY3JlbWVudGFsQ29tcGlsZXJEYXRhIGRhdGEgPSBuZXcgSW5jcmVtZW50YWxDb21waWxlckRhdGEoKTsKICAgIGlmIChkaWxsTG9hZGVkRGF0YSA9PSBudWxsKSB7CiAgICAgIGludCBieXRlc0xlbmd0aCA9IDA7CiAgICAgIGlmIChjb21wb25lbnRUb0luaXRpYWxpemVGcm9tICE9IG51bGwpIHsKICAgICAgICAvLyBJZiBpbml0aWFsaXppbmcgZnJvbSBhIGNvbXBvbmVudCBpdCBoYXMgdG8gaW5jbHVkZSB0aGUgc2RrLAogICAgICAgIC8vIHNvIHdlIGV4cGxpY2l0bHkgZG9uJ3QgbG9hZCBpdCBoZXJlLgogICAgICAgIGluaXRpYWxpemVGcm9tQ29tcG9uZW50KHVyaVRyYW5zbGF0b3IsIGMsIGRhdGEpOwogICAgICAgIGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20gPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIExpc3Q8aW50PiBzdW1tYXJ5Qnl0ZXMgPSBhd2FpdCBjLm9wdGlvbnMubG9hZFNka1N1bW1hcnlCeXRlcygpOwogICAgICAgIGJ5dGVzTGVuZ3RoID0gcHJlcGFyZVN1bW1hcnkoc3VtbWFyeUJ5dGVzLCB1cmlUcmFuc2xhdG9yLCBjLCBkYXRhKTsKICAgICAgICBpZiAoaW5pdGlhbGl6ZUZyb21EaWxsVXJpICE9IG51bGwpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGJ5dGVzTGVuZ3RoICs9IGF3YWl0IGluaXRpYWxpemVGcm9tRGlsbCh1cmlUcmFuc2xhdG9yLCBjLCBkYXRhKTsKICAgICAgICAgIH0gY2F0Y2ggKGUsIHN0KSB7CiAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgbG9hZGVkIHggb3V0IG9mIHkgbGlicmFyaWVzIGludG8gdGhlIGNvbXBvbmVudC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgYW55IHVuZm9yZXNlZW4gcHJvYmxlbXMgc3RhcnQgb3Zlci4KICAgICAgICAgICAgYnl0ZXNMZW5ndGggPSBwcmVwYXJlU3VtbWFyeShzdW1tYXJ5Qnl0ZXMsIHVyaVRyYW5zbGF0b3IsIGMsIGRhdGEpOwoKICAgICAgICAgICAgaWYgKGUgaXMgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvciB8fAogICAgICAgICAgICAgICAgZSBpcyBQYWNrYWdlQ2hhbmdlZEVycm9yIHx8CiAgICAgICAgICAgICAgICBlIGlzIENhbm9uaWNhbE5hbWVTZGtFcnJvcikgewogICAgICAgICAgICAgIC8vIERvbid0IHJlcG9ydCBhbnkgd2FybmluZy4KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBVcmkgZ3pJbml0aWFsaXplZEZyb207CiAgICAgICAgICAgICAgaWYgKGMub3B0aW9ucy53cml0ZUZpbGVPbkNyYXNoUmVwb3J0KSB7CiAgICAgICAgICAgICAgICBnekluaXRpYWxpemVkRnJvbSA9IHNhdmVBc0d6aXAoCiAgICAgICAgICAgICAgICAgICAgZGF0YS5pbml0aWFsaXphdGlvbkJ5dGVzLCAiaW5pdGlhbGl6ZV9mcm9tLmRpbGwiKTsKICAgICAgICAgICAgICAgIHJlY29yZFRlbXBvcmFyeUZpbGVGb3JUZXN0aW5nKGd6SW5pdGlhbGl6ZWRGcm9tKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGUgaXMgQ2Fub25pY2FsTmFtZUVycm9yKSB7CiAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnekluaXRpYWxpemVkRnJvbSAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgPyB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLnRvU3RyaW5nKCksIGd6SW5pdGlhbGl6ZWRGcm9tKQogICAgICAgICAgICAgICAgICAgIDogdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGluaXRpYWxpemVGcm9tRGlsbFVyaS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlcgogICAgICAgICAgICAgICAgICAgIC5hZGRQcm9ibGVtKG1lc3NhZ2UsIFRyZWVOb2RlLm5vT2Zmc2V0LCAxLCBudWxsKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gVW5rbm93biBlcnJvcjogUmVwb3J0IHByb2JsZW0gYXMgc3VjaC4KICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGd6SW5pdGlhbGl6ZWRGcm9tICE9IG51bGwKICAgICAgICAgICAgICAgICAgICA/IHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUZyb21EaWxsVXJpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICIkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIkc3QiLAogICAgICAgICAgICAgICAgICAgICAgICBnekluaXRpYWxpemVkRnJvbSkKICAgICAgICAgICAgICAgICAgICA6IHRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXAKICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplRnJvbURpbGxVcmkudG9TdHJpbmcoKSwgIiRlIiwgIiRzdCIpOwogICAgICAgICAgICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyCiAgICAgICAgICAgICAgICAgICAgLmFkZFByb2JsZW0obWVzc2FnZSwgVHJlZU5vZGUubm9PZmZzZXQsIDEsIG51bGwpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhcHBlbmRMaWJyYXJpZXMoZGF0YSwgYnl0ZXNMZW5ndGgpOwoKICAgICAgLy8gV2Ugc3VwcHJlc3MgZmluYWxpemF0aW9uIGVycm9ycyBiZWNhdXNlIHRoZXkgd2lsbCByZXBvcnRlZCB2aWEKICAgICAgLy8gcHJvYmxlbXNBc0pzb24gZmllbGRzICh3aXRoIGJldHRlciBwcmVjaXNpb24pLgogICAgICBhd2FpdCBkaWxsTG9hZGVkRGF0YS5idWlsZE91dGxpbmVzKHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiB0cnVlKTsKICAgICAgdXNlckJ1aWxkZXJzID0gPFVyaSwgTGlicmFyeUJ1aWxkZXI+e307CiAgICAgIHBsYXRmb3JtQnVpbGRlcnMgPSA8TGlicmFyeUJ1aWxkZXI+W107CiAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5mb3JFYWNoKCh1cmksIGJ1aWxkZXIpIHsKICAgICAgICBpZiAoYnVpbGRlci5pbXBvcnRVcmkuc2NoZW1lID09ICJkYXJ0IikgewogICAgICAgICAgcGxhdGZvcm1CdWlsZGVycy5hZGQoYnVpbGRlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVzZXJCdWlsZGVyc1t1cmldID0gYnVpbGRlcjsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAodXNlckJ1aWxkZXJzLmlzRW1wdHkpIHVzZXJCdWlsZGVycyA9IG51bGw7CiAgICB9CiAgICBkYXRhLmluaXRpYWxpemF0aW9uQnl0ZXMgPSBudWxsOwogICAgcmV0dXJuIGRhdGE7CiAgfQoKICB2b2lkIHJlcGxhY2VUeXBlQnVpbGRlcigKICAgICAgTWFwPExpYnJhcnlCdWlsZGVyLCBNYXA8U3RyaW5nLCBCdWlsZGVyPj4gcmVwbGFjZW1lbnRNYXAsCiAgICAgIE1hcDxMaWJyYXJ5QnVpbGRlciwgTWFwPFN0cmluZywgQnVpbGRlcj4+IHJlcGxhY2VtZW50U2V0dGVyc01hcCwKICAgICAgVHlwZUJ1aWxkZXIgdHlwZUJ1aWxkZXIpIHsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0eXBlQnVpbGRlcj8uZGVjbGFyYXRpb247CiAgICBCdWlsZGVyIHBhcmVudCA9IGRlY2xhcmF0aW9uPy5wYXJlbnQ7CiAgICBpZiAocGFyZW50ID09IG51bGwpIHJldHVybjsKICAgIE1hcDxTdHJpbmcsIEJ1aWxkZXI+IGNoaWxkUmVwbGFjZW1lbnRNYXA7CiAgICBpZiAoZGVjbGFyYXRpb24uaXNTZXR0ZXIpIHsKICAgICAgY2hpbGRSZXBsYWNlbWVudE1hcCA9IHJlcGxhY2VtZW50U2V0dGVyc01hcFtwYXJlbnRdOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRSZXBsYWNlbWVudE1hcCA9IHJlcGxhY2VtZW50TWFwW3BhcmVudF07CiAgICB9CgogICAgaWYgKGNoaWxkUmVwbGFjZW1lbnRNYXAgPT0gbnVsbCkgcmV0dXJuOwogICAgQnVpbGRlciByZXBsYWNlbWVudCA9IGNoaWxkUmVwbGFjZW1lbnRNYXBbZGVjbGFyYXRpb24ubmFtZV07CiAgICBhc3NlcnQocmVwbGFjZW1lbnQgIT0gbnVsbCwgIkRpZG4ndCBmaW5kIHRoZSByZXBsYWNlbWVudCBmb3IgJHR5cGVCdWlsZGVyIik7CiAgICB0eXBlQnVpbGRlci5iaW5kKHJlcGxhY2VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIENvcmVUeXBlcyBnZXRDb3JlVHlwZXMoKSA9PiB1c2VyQ29kZT8ubG9hZGVyPy5jb3JlVHlwZXM7CgogIEBvdmVycmlkZQogIENsYXNzSGllcmFyY2h5IGdldENsYXNzSGllcmFyY2h5KCkgPT4gdXNlckNvZGU/LmxvYWRlcj8uaGllcmFyY2h5OwoKICAvLy8gQWxsb3dzIGZvciB1cGRhdGluZyB0aGUgbGlzdCBvZiBuZWVkZWQgbGlicmFyaWVzLgogIC8vLwogIC8vLyBVc2VmdWwgaWYgYSBjbGFzcyBoaWVyYXJjaHkgaGFzIGJlZW4gdXNlZCBleHRlcm5hbGx5LgogIC8vLyBDdXJyZW50bHkgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgY2xhc3MgaGllcmFyY2hpZXMgd2hpY2ggaXMgdW5mb3J0dW5hdGUuCiAgLy8vIEZvciBub3cgdGhpcyBtZXRob2QgYWxsb3dzIHRoZSAnQ2xhc3NIaWVyYXJjaHlCdWlsZGVyJyB0byBiZSBudWxsLgogIC8vLwogIC8vLyBUT0RPKGplbnNqLENGRSBpbiBnZW5lcmFsKTogRXZlbnR1YWxseSB3ZSBzaG91bGQgZ2V0IHRvIGEgcG9pbnQgd2hlcmUgd2UKICAvLy8gb25seSBoYXZlIG9uZSBjbGFzcyBoaWVyYXJjaHkuCiAgLy8vIFRPRE8oamVuc2opOiBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIGEgdXRpbGl0eSBtZXRob2Qgc29tZXdoZXJlIGluc3RlYWQKICAvLy8gKHRob3VnaCBoYW5kbGluZyBvZiB0aGUgY2FzZSB3aGVyZSBhbGwgYmV0cyBhcmUgb2ZmIHNob3VsZCBwcm9iYWJseSBzdGlsbAogIC8vLyBsaXZlIGxvY2FsbHkpLgogIHZvaWQgdXBkYXRlTmVlZGVkRGlsbExpYnJhcmllc1dpdGhIaWVyYXJjaHkoCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkZXJIaWVyYXJjaHkpIHsKICAgIGlmIChoaWVyYXJjaHkgaXMgQ2xvc2VkV29ybGRDbGFzc0hpZXJhcmNoeSAmJiAhaGllcmFyY2h5LmFsbEJldHNPZmYpIHsKICAgICAgbmVlZGVkRGlsbExpYnJhcmllcyA/Pz0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICBTZXQ8Q2xhc3M+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogICAgICBMaXN0PENsYXNzPiB3b3JrbGlzdCA9IG5ldyBMaXN0PENsYXNzPigpOwogICAgICAvLyBHZXQgYWxsIGNsYXNzZXMgdG91Y2hlZCBieSBrZXJuZWwgY2xhc3MgaGllcmFyY2h5LgogICAgICBMaXN0PENsYXNzPiB1c2VkQ2xhc3NlcyA9IGhpZXJhcmNoeS5nZXRVc2VkQ2xhc3NlcygpOwogICAgICB3b3JrbGlzdC5hZGRBbGwodXNlZENsYXNzZXMpOwogICAgICBjbGFzc2VzLmFkZEFsbCh1c2VkQ2xhc3Nlcyk7CgogICAgICAvLyBHZXQgYWxsIGNsYXNzZXMgdG91Y2hlZCBieSBmYXN0YSBjbGFzcyBoaWVyYXJjaHkuCiAgICAgIGlmIChidWlsZGVySGllcmFyY2h5ICE9IG51bGwpIHsKICAgICAgICBmb3IgKENsYXNzIGMgaW4gYnVpbGRlckhpZXJhcmNoeS5ub2Rlcy5rZXlzKSB7CiAgICAgICAgICBpZiAoY2xhc3Nlcy5hZGQoYykpIHdvcmtsaXN0LmFkZChjKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdldCBhbGwgc3VwZXJzIGV0Yy4KICAgICAgd2hpbGUgKHdvcmtsaXN0LmlzTm90RW1wdHkpIHsKICAgICAgICBDbGFzcyBjID0gd29ya2xpc3QucmVtb3ZlTGFzdCgpOwogICAgICAgIGZvciAoU3VwZXJ0eXBlIHN1cGVydHlwZSBpbiBjLmltcGxlbWVudGVkVHlwZXMpIHsKICAgICAgICAgIGlmIChjbGFzc2VzLmFkZChzdXBlcnR5cGUuY2xhc3NOb2RlKSkgewogICAgICAgICAgICB3b3JrbGlzdC5hZGQoc3VwZXJ0eXBlLmNsYXNzTm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICAgIGlmIChjbGFzc2VzLmFkZChjLm1peGVkSW5UeXBlLmNsYXNzTm9kZSkpIHsKICAgICAgICAgICAgd29ya2xpc3QuYWRkKGMubWl4ZWRJblR5cGUuY2xhc3NOb2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGMuc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICAgIGlmIChjbGFzc2VzLmFkZChjLnN1cGVydHlwZS5jbGFzc05vZGUpKSB7CiAgICAgICAgICAgIHdvcmtsaXN0LmFkZChjLnN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQWRkIGFueSBsaWJyYXJpZXMgdGhhdCB3YXMgdXNlZCBvciB3YXMgaW4gdGhlICJwYXJlbnQtY2hhaW4iIG9mIGEKICAgICAgLy8gdXNlZCBjbGFzcy4KICAgICAgZm9yIChDbGFzcyBjIGluIGNsYXNzZXMpIHsKICAgICAgICBMaWJyYXJ5IGxpYnJhcnkgPSBjLmVuY2xvc2luZ0xpYnJhcnk7CiAgICAgICAgLy8gT25seSBhZGQgaWYgbG9hZGVkIGZyb20gYSBkaWxsIGZpbGUgKGFuZCB3YXNuJ3QgYSAnZGlsbCcgdGhhdCB3YXMKICAgICAgICAvLyBjb252ZXJ0ZWQgZnJvbSBzb3VyY2UgYnVpbGRlcnMgdG8gZGlsbCBidWlsZGVycykuCiAgICAgICAgaWYgKGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5jb250YWluc0tleShsaWJyYXJ5LmltcG9ydFVyaSkgJiYKICAgICAgICAgICAgKHByZXZpb3VzU291cmNlQnVpbGRlcnMgPT0gbnVsbCB8fAogICAgICAgICAgICAgICAgIXByZXZpb3VzU291cmNlQnVpbGRlcnMuY29udGFpbnMobGlicmFyeSkpKSB7CiAgICAgICAgICBuZWVkZWREaWxsTGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIENhbm5vdCB0cmFjayBpbiBvdGhlciBrZXJuZWwgY2xhc3MgaGllcmFyY2hpZXMgb3IKICAgICAgLy8gaWYgYWxsIGJldHMgYXJlIG9mZjogQWRkIGV2ZXJ5dGhpbmcgKGV4Y2VwdCBmb3IgdGhlIGxpYnJhcmllcyB3ZSBqdXN0CiAgICAgIC8vIGNvbnZlcnRlZCBmcm9tIHNvdXJjZSBidWlsZGVycyB0byBkaWxsIGJ1aWxkZXJzKS4KICAgICAgbmVlZGVkRGlsbExpYnJhcmllcyA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICAgICAgZm9yIChMaWJyYXJ5QnVpbGRlciBidWlsZGVyIGluIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy52YWx1ZXMpIHsKICAgICAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIgJiYKICAgICAgICAgICAgKHByZXZpb3VzU291cmNlQnVpbGRlcnMgPT0gbnVsbCB8fAogICAgICAgICAgICAgICAgIXByZXZpb3VzU291cmNlQnVpbGRlcnMuY29udGFpbnMoYnVpbGRlci5saWJyYXJ5KSkpIHsKICAgICAgICAgIG5lZWRlZERpbGxMaWJyYXJpZXMuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgaW52YWxpZGF0ZU5vdEtlcHRVc2VyQnVpbGRlcnMoU2V0PFVyaT4gaW52YWxpZGF0ZWRVcmlzKSB7CiAgICBpZiAobW9kdWxlc1RvTG9hZCAhPSBudWxsICYmIHVzZXJCdWlsZGVycyAhPSBudWxsKSB7CiAgICAgIFNldDxMaWJyYXJ5PiBsb2FkZWROb3RLZXB0ID0gbmV3IFNldDxMaWJyYXJ5PigpOwogICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gdXNlckJ1aWxkZXJzLnZhbHVlcykgewogICAgICAgIGxvYWRlZE5vdEtlcHQuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICAgIH0KICAgICAgZm9yIChDb21wb25lbnQgbW9kdWxlIGluIG1vZHVsZXNUb0xvYWQpIHsKICAgICAgICBsb2FkZWROb3RLZXB0LnJlbW92ZUFsbChtb2R1bGUubGlicmFyaWVzKTsKICAgICAgfQogICAgICBmb3IgKExpYnJhcnkgbGliIGluIGxvYWRlZE5vdEtlcHQpIHsKICAgICAgICBpbnZhbGlkYXRlZFVyaXMuYWRkKGxpYi5pbXBvcnRVcmkpOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIEZ1dHVyZTx2b2lkPiBsb2FkRW5zdXJlTG9hZGVkQ29tcG9uZW50cygKICAgICAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmV1c2VkTGlicmFyaWVzKSBhc3luYyB7CiAgICBpZiAobW9kdWxlc1RvTG9hZCAhPSBudWxsKSB7CiAgICAgIGJvb2wgbG9hZGVkQW55dGhpbmcgPSBmYWxzZTsKICAgICAgZm9yIChDb21wb25lbnQgbW9kdWxlIGluIG1vZHVsZXNUb0xvYWQpIHsKICAgICAgICBib29sIHVzZWRDb21wb25lbnQgPSBmYWxzZTsKICAgICAgICBmb3IgKExpYnJhcnkgbGliIGluIG1vZHVsZS5saWJyYXJpZXMpIHsKICAgICAgICAgIGlmICghZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLmNvbnRhaW5zS2V5KGxpYi5pbXBvcnRVcmkpKSB7CiAgICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMuYWRkKGxpYik7CiAgICAgICAgICAgIGRpbGxMb2FkZWREYXRhLmFkZExpYnJhcnkobGliKTsKICAgICAgICAgICAgcmV1c2VkTGlicmFyaWVzLmFkZChkaWxsTG9hZGVkRGF0YS5sb2FkZXIucmVhZChsaWIuaW1wb3J0VXJpLCAtMSkpOwogICAgICAgICAgICB1c2VkQ29tcG9uZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHVzZWRDb21wb25lbnQpIHsKICAgICAgICAgIGRpbGxMb2FkZWREYXRhLnVyaVRvU291cmNlLmFkZEFsbChtb2R1bGUudXJpVG9Tb3VyY2UpOwogICAgICAgICAgbG9hZGVkQW55dGhpbmcgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobG9hZGVkQW55dGhpbmcpIHsKICAgICAgICAvLyBXZSBzdXBwcmVzcyBmaW5hbGl6YXRpb24gZXJyb3JzIGJlY2F1c2UgdGhleSB3aWxsIHJlcG9ydGVkIHZpYQogICAgICAgIC8vIHByb2JsZW1zQXNKc29uIGZpZWxkcyAod2l0aCBiZXR0ZXIgcHJlY2lzaW9uKS4KICAgICAgICBhd2FpdCBkaWxsTG9hZGVkRGF0YS5idWlsZE91dGxpbmVzKHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiB0cnVlKTsKICAgICAgICB1c2VyQnVpbGRlcnMgPSA8VXJpLCBMaWJyYXJ5QnVpbGRlcj57fTsKICAgICAgICBwbGF0Zm9ybUJ1aWxkZXJzID0gPExpYnJhcnlCdWlsZGVyPltdOwogICAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5idWlsZGVycy5mb3JFYWNoKCh1cmksIGJ1aWxkZXIpIHsKICAgICAgICAgIGlmIChidWlsZGVyLmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiKSB7CiAgICAgICAgICAgIHBsYXRmb3JtQnVpbGRlcnMuYWRkKGJ1aWxkZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXNlckJ1aWxkZXJzW3VyaV0gPSBidWlsZGVyOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh1c2VyQnVpbGRlcnMuaXNFbXB0eSkgewogICAgICAgICAgdXNlckJ1aWxkZXJzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgbW9kdWxlc1RvTG9hZCA9IG51bGw7CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVpc3N1ZUxpYnJhcnlQcm9ibGVtcygKICAgICAgU2V0PExpYnJhcnk+IGFsbExpYnJhcmllcywgTGlzdDxMaWJyYXJ5PiBjb21waWxlZExpYnJhcmllcykgewogICAgLy8gVGhlIG5ld2x5LWNvbXBpbGVkIGxpYnJhcmllcyBoYXZlIGlzc3VlZCBwcm9ibGVtcyBhbHJlYWR5LiBSZS1pc3N1ZQogICAgLy8gcHJvYmxlbXMgZm9yIHRoZSBsaWJyYXJpZXMgdGhhdCB3ZXJlbid0IHJlLWNvbXBpbGVkIChpZ25vcmUgY29tcGlsZQogICAgLy8gZXhwcmVzc2lvbiBwcm9ibGVtcykKICAgIGFsbExpYnJhcmllcy5yZW1vdmVBbGwoY29tcGlsZWRMaWJyYXJpZXMpOwogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gYWxsTGlicmFyaWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LnByb2JsZW1zQXNKc29uPy5pc05vdEVtcHR5ID09IHRydWUpIHsKICAgICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGxpYnJhcnkucHJvYmxlbXNBc0pzb24pIHsKICAgICAgICAgIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24gbWVzc2FnZSA9CiAgICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgICBpZiAobWVzc2FnZS51cmkgPT0gZGVidWdFeHByVXJpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29udGV4dC5vcHRpb25zLnJlcG9ydERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLy8gUmUtaXNzdWUgcHJvYmxlbXMgb24gdGhlIGNvbXBvbmVudCBhbmQgcmV0dXJuIHRoZSBmaWx0ZXJlZCBsaXN0LgogIExpc3Q8U3RyaW5nPiByZWlzc3VlQ29tcG9uZW50UHJvYmxlbXMoQ29tcG9uZW50IGNvbXBvbmVudFdpdGhEaWxsKSB7CiAgICAvLyBUaGVzZSBwcm9ibGVtcyBoYXZlIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICAgIFNldDxTdHJpbmc+IGlzc3VlZFByb2JsZW1zID0gbmV3IFNldDxTdHJpbmc+KCk7CiAgICBpZiAoY29tcG9uZW50V2l0aERpbGw/LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgaXNzdWVkUHJvYmxlbXMuYWRkQWxsKGNvbXBvbmVudFdpdGhEaWxsLnByb2JsZW1zQXNKc29uKTsKICAgIH0KCiAgICAvLyBSZXBvcnQgb2xkIHByb2JsZW1zIHRoYXQgd2Fzbid0IHJlcG9ydGVkIGFnYWluLgogICAgZm9yIChMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+IG1lc3NhZ2VzCiAgICAgICAgaW4gcmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMudmFsdWVzKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKICAgICAgICBpZiAoaXNzdWVkUHJvYmxlbXMuYWRkKG1lc3NhZ2UudG9Kc29uU3RyaW5nKCkpKSB7CiAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMucmVwb3J0RGlhZ25vc3RpY01lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gU2F2ZSBhbnkgbmV3IGNvbXBvbmVudC1wcm9ibGVtcy4KICAgIGlmIChjb21wb25lbnRXaXRoRGlsbD8ucHJvYmxlbXNBc0pzb24gIT0gbnVsbCkgewogICAgICBmb3IgKFN0cmluZyBqc29uU3RyaW5nIGluIGNvbXBvbmVudFdpdGhEaWxsLnByb2JsZW1zQXNKc29uKSB7CiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbiBtZXNzYWdlID0KICAgICAgICAgICAgbmV3IERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24uZnJvbUpzb24oanNvblN0cmluZyk7CiAgICAgICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPiBtZXNzYWdlcyA9CiAgICAgICAgICAgIHJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zW21lc3NhZ2UudXJpXSA/Pz0KICAgICAgICAgICAgICAgIG5ldyBMaXN0PERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24+KCk7CiAgICAgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IExpc3Q8U3RyaW5nPi5mcm9tKGlzc3VlZFByb2JsZW1zKTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgVXJpIGdldFBhcnRGaWxlVXJpKAogICAgICBVcmkgcGFyZW50RmlsZVVyaSwgTGlicmFyeVBhcnQgcGFydCwgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yKSB7CiAgICBVcmkgZmlsZVVyaSA9IGdldFBhcnRVcmkocGFyZW50RmlsZVVyaSwgcGFydCk7CiAgICBpZiAoZmlsZVVyaS5zY2hlbWUgPT0gInBhY2thZ2UiKSB7CiAgICAgIC8vIFBhcnQgd2FzIHNwZWNpZmllZCB2aWEgcGFja2FnZSBVUkkgYW5kIHRoZSByZXNvbHZlIGFib3ZlIHRodXMKICAgICAgLy8gZGlkIG5vdCBnbyBhcyBleHBlY3RlZC4gVHJhbnNsYXRlIHRoZSBwYWNrYWdlIFVSSSB0byBnZXQgdGhlCiAgICAgIC8vIGFjdHVhbCBmaWxlIFVSSS4KICAgICAgZmlsZVVyaSA9IHVyaVRyYW5zbGF0b3IudHJhbnNsYXRlKGZpbGVVcmksIGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBmaWxlVXJpOwogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLy8gQ29tcHV0ZSB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlLgogIC8vLwogIC8vLyBBcyBhIHNpZGUtZWZmZWN0LCB0aGlzIGFsc28gY2xlYW5zLXVwIG5vdy11bnJlZmVyZW5jZWQgYnVpbGRlcnMgYXMgd2VsbCBhcwogIC8vLyBhbnkgc2F2ZWQgY29tcG9uZW50IHByb2JsZW1zIGZvciBzdWNoIGJ1aWxkZXJzLgogIExpc3Q8TGlicmFyeT4gY29tcHV0ZVRyYW5zaXRpdmVDbG9zdXJlKAogICAgICBMaXN0PExpYnJhcnk+IGlucHV0TGlicmFyaWVzLAogICAgICBMaXN0PFVyaT4gZW50cmllcywKICAgICAgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmV1c2VkTGlicmFyaWVzLAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwKICAgICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSwKICAgICAgW0xpc3Q8TGlicmFyeT4gaW5wdXRMaWJyYXJpZXNGaWx0ZXJlZF0pIHsKICAgIExpc3Q8TGlicmFyeT4gcmVzdWx0ID0gbmV3IExpc3Q8TGlicmFyeT4oKTsKICAgIE1hcDxVcmksIExpYnJhcnk+IGxpYnJhcnlNYXAgPSA8VXJpLCBMaWJyYXJ5Pnt9OwogICAgTWFwPFVyaSwgTGlicmFyeT4gcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzID0gPFVyaSwgTGlicmFyeT57fTsKICAgIE1hcDxVcmksIExpYnJhcnk+IHBvdGVudGlhbGx5UmVmZXJlbmNlZElucHV0TGlicmFyaWVzID0gPFVyaSwgTGlicmFyeT57fTsKICAgIGZvciAoTGlicmFyeSBsaWJyYXJ5IGluIGlucHV0TGlicmFyaWVzKSB7CiAgICAgIGxpYnJhcnlNYXBbbGlicmFyeS5pbXBvcnRVcmldID0gbGlicmFyeTsKICAgICAgaWYgKGxpYnJhcnkuaW1wb3J0VXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgICByZXN1bHQuYWRkKGxpYnJhcnkpOwogICAgICAgIGlucHV0TGlicmFyaWVzRmlsdGVyZWQ/LmFkZChsaWJyYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3RlbnRpYWxseVJlZmVyZW5jZWRMaWJyYXJpZXNbbGlicmFyeS5pbXBvcnRVcmldID0gbGlicmFyeTsKICAgICAgICBwb3RlbnRpYWxseVJlZmVyZW5jZWRJbnB1dExpYnJhcmllc1tsaWJyYXJ5LmltcG9ydFVyaV0gPSBsaWJyYXJ5OwogICAgICB9CiAgICB9CgogICAgTGlzdDxVcmk+IHdvcmtsaXN0ID0gbmV3IExpc3Q8VXJpPigpOwogICAgd29ya2xpc3QuYWRkQWxsKGVudHJpZXMpOwogICAgZm9yIChMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciBpbiByZXVzZWRMaWJyYXJpZXMpIHsKICAgICAgaWYgKGxpYnJhcnlCdWlsZGVyLmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiICYmCiAgICAgICAgICAhbGlicmFyeUJ1aWxkZXIuaXNTeW50aGV0aWMpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBMaWJyYXJ5IGxpYiA9IGxpYnJhcnlCdWlsZGVyLmxpYnJhcnk7CiAgICAgIHBvdGVudGlhbGx5UmVmZXJlbmNlZExpYnJhcmllc1tsaWJyYXJ5QnVpbGRlci5pbXBvcnRVcmldID0gbGliOwogICAgICBsaWJyYXJ5TWFwW2xpYnJhcnlCdWlsZGVyLmltcG9ydFVyaV0gPSBsaWI7CiAgICB9CgogICAgTGlicmFyeUdyYXBoIGdyYXBoID0gbmV3IExpYnJhcnlHcmFwaChsaWJyYXJ5TWFwKTsKICAgIFNldDxVcmk+IHBhcnRzVXNlZCA9IG5ldyBTZXQ8VXJpPigpOwogICAgd2hpbGUgKHdvcmtsaXN0LmlzTm90RW1wdHkgJiYgcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgVXJpIHVyaSA9IHdvcmtsaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgaWYgKGxpYnJhcnlNYXAuY29udGFpbnNLZXkodXJpKSkgewogICAgICAgIGZvciAoVXJpIG5laWdoYm9yIGluIGdyYXBoLm5laWdoYm9yc09mKHVyaSkpIHsKICAgICAgICAgIHdvcmtsaXN0LmFkZChuZWlnaGJvcik7CiAgICAgICAgfQogICAgICAgIGxpYnJhcnlNYXAucmVtb3ZlKHVyaSk7CiAgICAgICAgTGlicmFyeSBsaWJyYXJ5ID0gcG90ZW50aWFsbHlSZWZlcmVuY2VkTGlicmFyaWVzLnJlbW92ZSh1cmkpOwogICAgICAgIGlmIChsaWJyYXJ5ICE9IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5hZGQobGlicmFyeSk7CiAgICAgICAgICBpZiAocG90ZW50aWFsbHlSZWZlcmVuY2VkSW5wdXRMaWJyYXJpZXMucmVtb3ZlKHVyaSkgIT0gbnVsbCkgewogICAgICAgICAgICBpbnB1dExpYnJhcmllc0ZpbHRlcmVkPy5hZGQobGlicmFyeSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICAgICAgICBVcmkgcGFydEZpbGVVcmkgPQogICAgICAgICAgICAgICAgZ2V0UGFydEZpbGVVcmkobGlicmFyeS5maWxlVXJpLCBwYXJ0LCB1cmlUcmFuc2xhdG9yKTsKICAgICAgICAgICAgcGFydHNVc2VkLmFkZChwYXJ0RmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgICBwYXJ0c1VzZWQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlzdDxMaWJyYXJ5PiByZW1vdmVkTGlicmFyaWVzID0gbmV3IExpc3Q8TGlicmFyeT4oKTsKICAgIGJvb2wgcmVtb3ZlZERpbGxCdWlsZGVycyA9IGZhbHNlOwogICAgZm9yIChVcmkgdXJpIGluIHBvdGVudGlhbGx5UmVmZXJlbmNlZExpYnJhcmllcy5rZXlzKSB7CiAgICAgIGlmICh1cmkuc2NoZW1lID09ICJwYWNrYWdlIikgY29udGludWU7CiAgICAgIExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPSB1c2VyQ29kZS5sb2FkZXIuYnVpbGRlcnMucmVtb3ZlKHVyaSk7CiAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKICAgICAgICBMaWJyYXJ5IGxpYiA9IGJ1aWxkZXIubGlicmFyeTsKICAgICAgICByZW1vdmVkTGlicmFyaWVzLmFkZChsaWIpOwogICAgICAgIGlmIChkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnMucmVtb3ZlKHVyaSkgIT0gbnVsbCkgewogICAgICAgICAgcmVtb3ZlZERpbGxCdWlsZGVycyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNsZWFudXBTb3VyY2VzRm9yQnVpbGRlcihidWlsZGVyLCB1cmlUcmFuc2xhdG9yLAogICAgICAgICAgICBDb21waWxlckNvbnRleHQuY3VycmVudC51cmlUb1NvdXJjZSwgdXJpVG9Tb3VyY2UsIHBhcnRzVXNlZCk7CiAgICAgICAgdXNlckJ1aWxkZXJzPy5yZW1vdmUodXJpKTsKICAgICAgICByZW1vdmVMaWJyYXJ5RnJvbVJlbWFpbmluZ0NvbXBvbmVudFByb2JsZW1zKAogICAgICAgICAgICBsaWIsIHVyaVRyYW5zbGF0b3IsIHBhcnRzVXNlZCk7CgogICAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IGFzIHRoZSB1cmkgaXMgbm90IGEgcGFja2FnZS11cmkuCiAgICAgICAgaW5jcmVtZW50YWxTZXJpYWxpemVyPy5pbnZhbGlkYXRlKGJ1aWxkZXIuZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICAgIGhpZXJhcmNoeT8uYXBwbHlUcmVlQ2hhbmdlcyhyZW1vdmVkTGlicmFyaWVzLCBjb25zdCBbXSk7CiAgICBpZiAocmVtb3ZlZERpbGxCdWlsZGVycykgewogICAgICBtYWtlRGlsbExvYWRlckxpYnJhcmllc1VwVG9EYXRlV2l0aEJ1aWxkZXJzTWFwKCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBJZiBidWlsZGVycyB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBbZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzXSBtYXAKICAvLy8gdGhlIGxvYWRlcnMgW2xpYnJhcmllc10gbGlzdCBoYXMgdG8gYmUgdXBkYXRlZCB0b28sIG9yIHRob3NlIGxpYnJhcmllcwogIC8vLyB3aWxsIHN0aWxsIGhhbmcgYXJvdW5kIGFuZCBiZSBsaW5rZWQgaW50byB0aGUgQ29tcG9uZW50IGNyZWF0ZWQgaW50ZXJuYWxseQogIC8vLyBpbiB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KICAvLy8gVGhpcyBtZXRob2Qgc3luY3MgdGhlIFtsaWJyYXJpZXNdIGxpc3Qgd2l0aCB0aGUgZGF0YSBpbiBbYnVpbGRlcnNdLgogIHZvaWQgbWFrZURpbGxMb2FkZXJMaWJyYXJpZXNVcFRvRGF0ZVdpdGhCdWlsZGVyc01hcCgpIHsKICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMuY2xlYXIoKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciBpbiBkaWxsTG9hZGVkRGF0YS5sb2FkZXIuYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGRpbGxMb2FkZWREYXRhLmxvYWRlci5saWJyYXJpZXMuYWRkKGJ1aWxkZXIubGlicmFyeSk7CiAgICB9CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIC8vLwogIC8vLyBbcGFydHNVc2VkXSBpbmRpY2F0ZXMgcGFydCB1cmlzIHRoYXQgYXJlIHVzZWQgYnkgKG90aGVyL2FsaXZlKSBsaWJyYXJpZXMuCiAgLy8vIFRob3NlIHBhcnRzIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBwYXJ0IGhhcyBiZWVuCiAgLy8vICJtb3ZlZCIgdG8gYmUgcGFydCBvZiBhbm90aGVyIGxpYnJhcnkuCiAgdm9pZCBjbGVhbnVwU291cmNlc0ZvckJ1aWxkZXIoTGlicmFyeUJ1aWxkZXIgYnVpbGRlciwKICAgICAgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yLCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlLAogICAgICBbTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZUV4dHJhLCBTZXQ8VXJpPiBwYXJ0c1VzZWRdKSB7CiAgICB1cmlUb1NvdXJjZS5yZW1vdmUoYnVpbGRlci5maWxlVXJpKTsKICAgIHVyaVRvU291cmNlRXh0cmE/LnJlbW92ZShidWlsZGVyLmZpbGVVcmkpOwogICAgTGlicmFyeSBsaWIgPSBidWlsZGVyLmxpYnJhcnk7CiAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGliLnBhcnRzKSB7CiAgICAgIFVyaSBwYXJ0RmlsZVVyaSA9IGdldFBhcnRGaWxlVXJpKGxpYi5maWxlVXJpLCBwYXJ0LCB1cmlUcmFuc2xhdG9yKTsKICAgICAgaWYgKHBhcnRzVXNlZCAhPSBudWxsICYmIHBhcnRzVXNlZC5jb250YWlucyhwYXJ0RmlsZVVyaSkpIGNvbnRpbnVlOwogICAgICB1cmlUb1NvdXJjZS5yZW1vdmUocGFydEZpbGVVcmkpOwogICAgICB1cmlUb1NvdXJjZUV4dHJhPy5yZW1vdmUocGFydEZpbGVVcmkpOwogICAgfQogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLy8KICAvLy8gW3BhcnRzVXNlZF0gaW5kaWNhdGVzIHBhcnQgdXJpcyB0aGF0IGFyZSB1c2VkIGJ5IChvdGhlci9hbGl2ZSkgbGlicmFyaWVzLgogIC8vLyBUaG9zZSBwYXJ0cyB3aWxsIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGNvbXBvbmVudCBwcm9ibGVtcy4KICAvLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIHBhcnQgaGFzIGJlZW4gIm1vdmVkIiB0byBiZSBwYXJ0IG9mIGFub3RoZXIgbGlicmFyeS4KICB2b2lkIHJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXMoCiAgICAgIExpYnJhcnkgbGliLCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIFtTZXQ8VXJpPiBwYXJ0c1VzZWRdKSB7CiAgICByZW1haW5pbmdDb21wb25lbnRQcm9ibGVtcy5yZW1vdmUobGliLmZpbGVVcmkpOwogICAgLy8gUmVtb3ZlIHBhcnRzIHRvby4KICAgIGZvciAoTGlicmFyeVBhcnQgcGFydCBpbiBsaWIucGFydHMpIHsKICAgICAgVXJpIHBhcnRGaWxlVXJpID0gZ2V0UGFydEZpbGVVcmkobGliLmZpbGVVcmksIHBhcnQsIHVyaVRyYW5zbGF0b3IpOwogICAgICByZW1haW5pbmdDb21wb25lbnRQcm9ibGVtcy5yZW1vdmUocGFydEZpbGVVcmkpOwogICAgfQogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICBpbnQgcHJlcGFyZVN1bW1hcnkoTGlzdDxpbnQ+IHN1bW1hcnlCeXRlcywgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yLAogICAgICBDb21waWxlckNvbnRleHQgYywgSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSkgewogICAgZGlsbExvYWRlZERhdGEgPSBuZXcgRGlsbFRhcmdldCh0aWNrZXIsIHVyaVRyYW5zbGF0b3IsIGMub3B0aW9ucy50YXJnZXQpOwogICAgaW50IGJ5dGVzTGVuZ3RoID0gMDsKCiAgICBpZiAoc3VtbWFyeUJ5dGVzICE9IG51bGwpIHsKICAgICAgdGlja2VyLmxvZ01zKCJSZWFkICR7Yy5vcHRpb25zLnNka1N1bW1hcnl9Iik7CiAgICAgIGRhdGEuY29tcG9uZW50ID0gYy5vcHRpb25zLnRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudCgpKTsKICAgICAgbmV3IEJpbmFyeUJ1aWxkZXJXaXRoTWV0YWRhdGEoc3VtbWFyeUJ5dGVzLAogICAgICAgICAgICAgIGRpc2FibGVMYXp5UmVhZGluZzogZmFsc2UsIGRpc2FibGVMYXp5Q2xhc3NSZWFkaW5nOiB0cnVlKQogICAgICAgICAgLnJlYWRDb21wb25lbnQoZGF0YS5jb21wb25lbnQpOwogICAgICB0aWNrZXIubG9nTXMoIkRlc2VyaWFsaXplZCAke2Mub3B0aW9ucy5zZGtTdW1tYXJ5fSIpOwogICAgICBieXRlc0xlbmd0aCArPSBzdW1tYXJ5Qnl0ZXMubGVuZ3RoOwogICAgfQoKICAgIHJldHVybiBieXRlc0xlbmd0aDsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgLy8gVGhpcyBwcm9jZWR1cmUgd2lsbCB0cnkgdG8gbG9hZCB0aGUgZGlsbCBmaWxlIGFuZCB3aWxsIGNyYXNoIGlmIGl0IGNhbm5vdC4KICBGdXR1cmU8aW50PiBpbml0aWFsaXplRnJvbURpbGwoVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yLCBDb21waWxlckNvbnRleHQgYywKICAgICAgSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSkgYXN5bmMgewogICAgaW50IGJ5dGVzTGVuZ3RoID0gMDsKICAgIEZpbGVTeXN0ZW1FbnRpdHkgZW50aXR5ID0KICAgICAgICBjLm9wdGlvbnMuZmlsZVN5c3RlbS5lbnRpdHlGb3JVcmkoaW5pdGlhbGl6ZUZyb21EaWxsVXJpKTsKICAgIGlmIChhd2FpdCBlbnRpdHkuZXhpc3RzKCkpIHsKICAgICAgTGlzdDxpbnQ+IGluaXRpYWxpemF0aW9uQnl0ZXMgPSBhd2FpdCBlbnRpdHkucmVhZEFzQnl0ZXMoKTsKICAgICAgaWYgKGluaXRpYWxpemF0aW9uQnl0ZXMgIT0gbnVsbCAmJiBpbml0aWFsaXphdGlvbkJ5dGVzLmlzTm90RW1wdHkpIHsKICAgICAgICB0aWNrZXIubG9nTXMoIlJlYWQgJGluaXRpYWxpemVGcm9tRGlsbFVyaSIpOwogICAgICAgIGRhdGEuaW5pdGlhbGl6YXRpb25CeXRlcyA9IGluaXRpYWxpemF0aW9uQnl0ZXM7CgogICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIG91dHB1dCBhbGwgd2UgcmVhZCBoZXJlIHNvIGxhenkgbG9hZGluZyBpdAogICAgICAgIC8vIGRvZXNuJ3QgbWFrZSBzZW5zZS4KICAgICAgICBMaXN0PFN1YkNvbXBvbmVudFZpZXc+IHZpZXdzID0gbmV3IEJpbmFyeUJ1aWxkZXJXaXRoTWV0YWRhdGEoCiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbkJ5dGVzLAogICAgICAgICAgICAgICAgZGlzYWJsZUxhenlSZWFkaW5nOiB0cnVlKQogICAgICAgICAgICAucmVhZENvbXBvbmVudChkYXRhLmNvbXBvbmVudCwKICAgICAgICAgICAgICAgIGNoZWNrQ2Fub25pY2FsTmFtZXM6IHRydWUsIGNyZWF0ZVZpZXc6IHRydWUpOwoKICAgICAgICAvLyBDaGVjayB0aGUgYW55IHBhY2thZ2UtdXJscyBzdGlsbCBwb2ludCB0byB0aGUgc2FtZSBmaWxlCiAgICAgICAgLy8gKGUuZy4gdGhlIHBhY2thZ2Ugc3RpbGwgZXhpc3RzIGFuZCBoYXNuJ3QgYmVlbiB1cGRhdGVkKS4KICAgICAgICBmb3IgKExpYnJhcnkgbGliIGluIGRhdGEuY29tcG9uZW50LmxpYnJhcmllcykgewogICAgICAgICAgaWYgKGxpYi5pbXBvcnRVcmkuc2NoZW1lID09ICJwYWNrYWdlIiAmJgogICAgICAgICAgICAgIHVyaVRyYW5zbGF0b3IudHJhbnNsYXRlKGxpYi5pbXBvcnRVcmksIGZhbHNlKSAhPSBsaWIuZmlsZVVyaSkgewogICAgICAgICAgICAvLyBQYWNrYWdlIGhhcyBiZWVuIHJlbW92ZWQgb3IgdXBkYXRlZC4KICAgICAgICAgICAgLy8gVGhpcyBsaWJyYXJ5IHNob3VsZCBiZSB0aHJvd24gYXdheS4KICAgICAgICAgICAgLy8gRXZlcnl0aGluZyB0aGF0IGRlcGVuZHMgb24gaXQgc2hvdWxkIGJlIHRocm93biBhd2F5LgogICAgICAgICAgICAvLyBUT0RPKGplbnNqKTogQW55dGhpbmcgdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiBpdCBjYW4gYmUga2VwdC4KICAgICAgICAgICAgLy8gRm9yIG5vdyBqdXN0IGRvbid0IGluaXRpYWxpemUgZnJvbSB0aGlzIGRpbGwuCiAgICAgICAgICAgIHRocm93IGNvbnN0IFBhY2thZ2VDaGFuZ2VkRXJyb3IoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9ubHkgaW5pdGlhbGl6ZSB0aGUgaW5jcmVtZW50YWwgc2VyaWFsaXplciB3aGVuIHdlIGtub3cgd2UnbGwKICAgICAgICAvLyBhY3R1YWxseSB1c2UgdGhlIGRhdGEgbG9hZGVkIGZyb20gZGlsbC4KICAgICAgICBpbml0aWFsaXplZEluY3JlbWVudGFsU2VyaWFsaXplciA9CiAgICAgICAgICAgIGluY3JlbWVudGFsU2VyaWFsaXplcj8uaW5pdGlhbGl6ZShpbml0aWFsaXphdGlvbkJ5dGVzLCB2aWV3cykgPz8KICAgICAgICAgICAgICAgIGZhbHNlOwoKICAgICAgICBpbml0aWFsaXplZEZyb21EaWxsID0gdHJ1ZTsKICAgICAgICBieXRlc0xlbmd0aCArPSBpbml0aWFsaXphdGlvbkJ5dGVzLmxlbmd0aDsKICAgICAgICBkYXRhLnVzZXJMb2FkZWRVcmlNYWluID0gZGF0YS5jb21wb25lbnQubWFpbk1ldGhvZDsKICAgICAgICBzYXZlQ29tcG9uZW50UHJvYmxlbXMoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBieXRlc0xlbmd0aDsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgdm9pZCBzYXZlQ29tcG9uZW50UHJvYmxlbXMoSW5jcmVtZW50YWxDb21waWxlckRhdGEgZGF0YSkgewogICAgaWYgKGRhdGEuY29tcG9uZW50LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgZm9yIChTdHJpbmcganNvblN0cmluZyBpbiBkYXRhLmNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbikgewogICAgICAgIERpYWdub3N0aWNNZXNzYWdlRnJvbUpzb24gbWVzc2FnZSA9CiAgICAgICAgICAgIG5ldyBEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uLmZyb21Kc29uKGpzb25TdHJpbmcpOwogICAgICAgIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbj4gbWVzc2FnZXMgPQogICAgICAgICAgICByZW1haW5pbmdDb21wb25lbnRQcm9ibGVtc1ttZXNzYWdlLnVyaV0gPz89CiAgICAgICAgICAgICAgICBuZXcgTGlzdDxEaWFnbm9zdGljTWVzc2FnZUZyb21Kc29uPigpOwogICAgICAgIG1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICAvLyBUaGlzIHByb2NlZHVyZSB3aWxsIHNldCB1cCBjb21waWxlciBmcm9tIFtjb21wb25lbnRUb0luaXRpYWxpemVGcm9tXS4KICB2b2lkIGluaXRpYWxpemVGcm9tQ29tcG9uZW50KFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwgQ29tcGlsZXJDb250ZXh0IGMsCiAgICAgIEluY3JlbWVudGFsQ29tcGlsZXJEYXRhIGRhdGEpIHsKICAgIHRpY2tlci5sb2dNcygiQWJvdXQgdG8gaW5pdGlhbGl6ZUZyb21Db21wb25lbnQiKTsKCiAgICBkaWxsTG9hZGVkRGF0YSA9IG5ldyBEaWxsVGFyZ2V0KHRpY2tlciwgdXJpVHJhbnNsYXRvciwgYy5vcHRpb25zLnRhcmdldCk7CiAgICBkYXRhLmNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoCiAgICAgICAgbGlicmFyaWVzOiBjb21wb25lbnRUb0luaXRpYWxpemVGcm9tLmxpYnJhcmllcywKICAgICAgICB1cmlUb1NvdXJjZTogY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbS51cmlUb1NvdXJjZSkKICAgICAgLi5tYWluTWV0aG9kID0gY29tcG9uZW50VG9Jbml0aWFsaXplRnJvbS5tYWluTWV0aG9kOwogICAgZGF0YS51c2VyTG9hZGVkVXJpTWFpbiA9IGNvbXBvbmVudFRvSW5pdGlhbGl6ZUZyb20ubWFpbk1ldGhvZDsKICAgIHNhdmVDb21wb25lbnRQcm9ibGVtcyhkYXRhKTsKCiAgICBib29sIGZvdW5kRGFydENvcmUgPSBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5jb21wb25lbnQubGlicmFyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IGRhdGEuY29tcG9uZW50LmxpYnJhcmllc1tpXTsKICAgICAgaWYgKGxpYnJhcnkuaW1wb3J0VXJpLnNjaGVtZSA9PSAiZGFydCIgJiYKICAgICAgICAgIGxpYnJhcnkuaW1wb3J0VXJpLnBhdGggPT0gImNvcmUiKSB7CiAgICAgICAgZm91bmREYXJ0Q29yZSA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWZvdW5kRGFydENvcmUpIHsKICAgICAgdGhyb3cgY29uc3QgSW5pdGlhbGl6ZUZyb21Db21wb25lbnRFcnJvcigiRGlkIG5vdCBmaW5kIGRhcnQ6Y29yZSB3aGVuICIKICAgICAgICAgICJ0cmllZCB0byBpbml0aWFsaXplIGZyb20gY29tcG9uZW50LiIpOwogICAgfQoKICAgIHRpY2tlci5sb2dNcygiUmFuIGluaXRpYWxpemVGcm9tQ29tcG9uZW50Iik7CiAgfQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgYXBwZW5kTGlicmFyaWVzKEluY3JlbWVudGFsQ29tcGlsZXJEYXRhIGRhdGEsIGludCBieXRlc0xlbmd0aCkgewogICAgaWYgKGRhdGEuY29tcG9uZW50ICE9IG51bGwpIHsKICAgICAgZGlsbExvYWRlZERhdGEubG9hZGVyCiAgICAgICAgICAuYXBwZW5kTGlicmFyaWVzKGRhdGEuY29tcG9uZW50LCBieXRlQ291bnQ6IGJ5dGVzTGVuZ3RoKTsKICAgIH0KICAgIHRpY2tlci5sb2dNcygiQXBwZW5kZWQgbGlicmFyaWVzIik7CiAgfQoKICBAb3ZlcnJpZGUKICBGdXR1cmU8UHJvY2VkdXJlPiBjb21waWxlRXhwcmVzc2lvbigKICAgICAgU3RyaW5nIGV4cHJlc3Npb24sCiAgICAgIE1hcDxTdHJpbmcsIERhcnRUeXBlPiBkZWZpbml0aW9ucywKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlRGVmaW5pdGlvbnMsCiAgICAgIFN0cmluZyBzeW50aGV0aWNQcm9jZWR1cmVOYW1lLAogICAgICBVcmkgbGlicmFyeVVyaSwKICAgICAgW1N0cmluZyBjbGFzc05hbWUsCiAgICAgIGJvb2wgaXNTdGF0aWMgPSBmYWxzZV0pIGFzeW5jIHsKICAgIGFzc2VydChkaWxsTG9hZGVkRGF0YSAhPSBudWxsICYmIHVzZXJDb2RlICE9IG51bGwpOwoKICAgIHJldHVybiBhd2FpdCBjb250ZXh0LnJ1bkluQ29udGV4dCgoXykgYXN5bmMgewogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciA9CiAgICAgICAgICB1c2VyQ29kZS5sb2FkZXIucmVhZChsaWJyYXJ5VXJpLCAtMSwgYWNjZXNzb3I6IHVzZXJDb2RlLmxvYWRlci5maXJzdCk7CgogICAgICBDbGFzcyBjbHM7CiAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIgPSBsaWJyYXJ5QnVpbGRlci5zY29wZUJ1aWxkZXJbY2xhc3NOYW1lXTsKICAgICAgICBjbHMgPSBjbGFzc0J1aWxkZXI/LmNsczsKICAgICAgICBpZiAoY2xzID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB9CgogICAgICB1c2VyQ29kZS5sb2FkZXIuc2Vlbk1lc3NhZ2VzLmNsZWFyKCk7CgogICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtIGluIHR5cGVEZWZpbml0aW9ucykgewogICAgICAgIGlmICghaXNMZWdhbElkZW50aWZpZXIodHlwZVBhcmFtLm5hbWUpKSByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBmb3IgKFN0cmluZyBuYW1lIGluIGRlZmluaXRpb25zLmtleXMpIHsKICAgICAgICBpZiAoIWlzTGVnYWxJZGVudGlmaWVyKG5hbWUpKSByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgZGVidWdMaWJyYXJ5ID0gbmV3IFNvdXJjZUxpYnJhcnlCdWlsZGVyKAogICAgICAgIGxpYnJhcnlVcmksCiAgICAgICAgZGVidWdFeHByVXJpLAogICAgICAgIHVzZXJDb2RlLmxvYWRlciwKICAgICAgICBudWxsLAogICAgICAgIHNjb3BlOiBsaWJyYXJ5QnVpbGRlci5zY29wZS5jcmVhdGVOZXN0ZWRTY29wZSgiZXhwcmVzc2lvbiIpLAogICAgICAgIG5hbWVPcmlnaW46IGxpYnJhcnlCdWlsZGVyLmxpYnJhcnksCiAgICAgICk7CiAgICAgIGRlYnVnTGlicmFyeS5zZXRMYW5ndWFnZVZlcnNpb24oCiAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5saWJyYXJ5Lmxhbmd1YWdlVmVyc2lvbk1ham9yLAogICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeS5sYW5ndWFnZVZlcnNpb25NaW5vcik7CgogICAgICBpZiAobGlicmFyeUJ1aWxkZXIgaXMgRGlsbExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgZm9yIChMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5CiAgICAgICAgICAgIGluIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kuaXNJbXBvcnQpIGNvbnRpbnVlOwoKICAgICAgICAgIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnM7CgogICAgICAgICAgZm9yIChrZXJuZWwuQ29tYmluYXRvciBjb21iaW5hdG9yIGluIGRlcGVuZGVuY3kuY29tYmluYXRvcnMpIHsKICAgICAgICAgICAgY29tYmluYXRvcnMgPz89IDxDb21iaW5hdG9yPltdOwoKICAgICAgICAgICAgY29tYmluYXRvcnMuYWRkKGNvbWJpbmF0b3IuaXNTaG93CiAgICAgICAgICAgICAgICA/IG5ldyBDb21iaW5hdG9yLnNob3coY29tYmluYXRvci5uYW1lcywgY29tYmluYXRvci5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmZpbGVVcmkpCiAgICAgICAgICAgICAgICA6IG5ldyBDb21iaW5hdG9yLmhpZGUoY29tYmluYXRvci5uYW1lcywgY29tYmluYXRvci5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmZpbGVVcmkpKTsKICAgICAgICAgIH0KCiAgICAgICAgICBkZWJ1Z0xpYnJhcnkuYWRkSW1wb3J0KAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZGVwZW5kZW5jeS5pbXBvcnRlZExpYnJhcnlSZWZlcmVuY2UuY2Fub25pY2FsTmFtZS5uYW1lLAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgZGVwZW5kZW5jeS5uYW1lLAogICAgICAgICAgICAgIGNvbWJpbmF0b3JzLAogICAgICAgICAgICAgIGRlcGVuZGVuY3kuaXNEZWZlcnJlZCwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAtMSk7CiAgICAgICAgfQoKICAgICAgICBkZWJ1Z0xpYnJhcnkuYWRkSW1wb3J0c1RvU2NvcGUoKTsKICAgICAgfQoKICAgICAgSHlicmlkRmlsZVN5c3RlbSBoZnMgPSB1c2VyQ29kZS5maWxlU3lzdGVtOwogICAgICBNZW1vcnlGaWxlU3lzdGVtIGZzID0gaGZzLm1lbW9yeTsKICAgICAgZnMuZW50aXR5Rm9yVXJpKGRlYnVnRXhwclVyaSkud3JpdGVBc1N0cmluZ1N5bmMoZXhwcmVzc2lvbik7CgogICAgICBGdW5jdGlvbk5vZGUgcGFyYW1ldGVycyA9IG5ldyBGdW5jdGlvbk5vZGUobnVsbCwKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlRGVmaW5pdGlvbnMsCiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogZGVmaW5pdGlvbnMua2V5cwogICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbChuYW1lLCAwKSkKICAgICAgICAgICAgICAudG9MaXN0KCkpOwoKICAgICAgZGVidWdMaWJyYXJ5LmJ1aWxkKHVzZXJDb2RlLmxvYWRlci5jb3JlTGlicmFyeSwgbW9kaWZ5VGFyZ2V0OiBmYWxzZSk7CiAgICAgIEV4cHJlc3Npb24gY29tcGlsZWRFeHByZXNzaW9uID0gYXdhaXQgdXNlckNvZGUubG9hZGVyLmJ1aWxkRXhwcmVzc2lvbigKICAgICAgICAgIGRlYnVnTGlicmFyeSwgY2xhc3NOYW1lLCBjbGFzc05hbWUgIT0gbnVsbCAmJiAhaXNTdGF0aWMsIHBhcmFtZXRlcnMpOwoKICAgICAgUHJvY2VkdXJlIHByb2NlZHVyZSA9IG5ldyBQcm9jZWR1cmUoCiAgICAgICAgICBuZXcgTmFtZShzeW50aGV0aWNQcm9jZWR1cmVOYW1lKSwgUHJvY2VkdXJlS2luZC5NZXRob2QsIHBhcmFtZXRlcnMsCiAgICAgICAgICBpc1N0YXRpYzogaXNTdGF0aWMpCiAgICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0gZGVidWdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CgogICAgICBwYXJhbWV0ZXJzLmJvZHkgPSBuZXcgUmV0dXJuU3RhdGVtZW50KGNvbXBpbGVkRXhwcmVzc2lvbikKICAgICAgICAuLnBhcmVudCA9IHBhcmFtZXRlcnM7CgogICAgICBwcm9jZWR1cmUuZmlsZVVyaSA9IGRlYnVnTGlicmFyeS5maWxlVXJpOwogICAgICBwcm9jZWR1cmUucGFyZW50ID0gY2xhc3NOYW1lICE9IG51bGwgPyBjbHMgOiBsaWJyYXJ5QnVpbGRlci5saWJyYXJ5OwoKICAgICAgdXNlckNvZGUudXJpVG9Tb3VyY2UucmVtb3ZlKGRlYnVnRXhwclVyaSk7CiAgICAgIHVzZXJDb2RlLmxvYWRlci5zb3VyY2VCeXRlcy5yZW1vdmUoZGVidWdFeHByVXJpKTsKCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGlicmFyeSBoYXMgYSBjYW5vbmljYWwgbmFtZS4KICAgICAgQ29tcG9uZW50IGMgPSBuZXcgQ29tcG9uZW50KGxpYnJhcmllczogW2RlYnVnTGlicmFyeS5saWJyYXJ5XSk7CiAgICAgIGMuY29tcHV0ZUNhbm9uaWNhbE5hbWVzKCk7CgogICAgICB1c2VyQ29kZS5ydW5Qcm9jZWR1cmVUcmFuc2Zvcm1hdGlvbnMocHJvY2VkdXJlKTsKCiAgICAgIHJldHVybiBwcm9jZWR1cmU7CiAgICB9KTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgUmV1c2FnZVJlc3VsdCBjb21wdXRlUmV1c2VkTGlicmFyaWVzKAogICAgICBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMsIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvcikgewogICAgU2V0PFVyaT4gc2VlblVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IHJldXNlZExpYnJhcmllcyA9IDxMaWJyYXJ5QnVpbGRlcj5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxhdGZvcm1CdWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0gcGxhdGZvcm1CdWlsZGVyc1tpXTsKICAgICAgaWYgKCFzZWVuVXJpcy5hZGQoYnVpbGRlci5pbXBvcnRVcmkpKSBjb250aW51ZTsKICAgICAgcmV1c2VkTGlicmFyaWVzLmFkZChidWlsZGVyKTsKICAgIH0KICAgIGlmICh1c2VyQ29kZSA9PSBudWxsICYmIHVzZXJCdWlsZGVycyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgUmV1c2FnZVJlc3VsdCh7fSwgW10sIGZhbHNlLCByZXVzZWRMaWJyYXJpZXMpOwogICAgfQogICAgYm9vbCBpbnZhbGlkYXRlZEJlY2F1c2VPZlBhY2thZ2VVcGRhdGUgPSBmYWxzZTsKICAgIExpc3Q8TGlicmFyeUJ1aWxkZXI+IGRpcmVjdGx5SW52YWxpZGF0ZWQgPSBuZXcgTGlzdDxMaWJyYXJ5QnVpbGRlcj4oKTsKICAgIFNldDxMaWJyYXJ5QnVpbGRlcj4gbm90UmV1c2VkTGlicmFyaWVzID0gbmV3IFNldDxMaWJyYXJ5QnVpbGRlcj4oKTsKCiAgICAvLyBNYXBzIGFsbCBub24tcGxhdGZvcm0gTGlicmFyeUJ1aWxkZXJzIGZyb20gdGhlaXIgaW1wb3J0IFVSSS4KICAgIE1hcDxVcmksIExpYnJhcnlCdWlsZGVyPiBidWlsZGVycyA9IDxVcmksIExpYnJhcnlCdWlsZGVyPnt9OwoKICAgIC8vIEludmFsaWRhdGVkIFVSSXMgdHJhbnNsYXRlZCBiYWNrIHRvIHRoZWlyIGltcG9ydCBVUkkgKHBhY2thZ2U6LCBkYXJ0OiwKICAgIC8vIGV0Yy4pLgogICAgTGlzdDxVcmk+IGludmFsaWRhdGVkSW1wb3J0VXJpcyA9IDxVcmk+W107CgogICAgYm9vbCBpc0ludmFsaWRhdGVkKFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpKSB7CiAgICAgIGlmIChpbnZhbGlkYXRlZFVyaXMuY29udGFpbnMoaW1wb3J0VXJpKSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChpbXBvcnRVcmkgIT0gZmlsZVVyaSAmJiBpbnZhbGlkYXRlZFVyaXMuY29udGFpbnMoZmlsZVVyaSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaGFzVG9DaGVja1BhY2thZ2VVcmlzICYmIGltcG9ydFVyaS5zY2hlbWUgPT0gInBhY2thZ2UiKSB7CiAgICAgICAgLy8gR2V0IHBhY2thZ2UgbmFtZSwgY2hlY2sgaWYgdGhlIGJhc2UgVVJJIGhhcyBjaGFuZ2VkIGZvciB0aGUgcGFja2FnZSwKICAgICAgICAvLyBpZiBpdCBoYXMsIHRyYW5zbGF0ZSB0aGUgVVJJIGFnYWluLAogICAgICAgIC8vIG90aGVyd2lzZSB0aGUgVVJJIGNhbm5vdCBoYXZlIGNoYW5nZWQuCiAgICAgICAgU3RyaW5nIHBhdGggPSBpbXBvcnRVcmkucGF0aDsKICAgICAgICBpbnQgZmlyc3RTbGFzaCA9IHBhdGguaW5kZXhPZignLycpOwogICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBhdGguc3Vic3RyaW5nKDAsIGZpcnN0U2xhc2gpOwogICAgICAgIGlmIChwcmV2aW91c1BhY2thZ2VzTWFwID09IG51bGwgfHwKICAgICAgICAgICAgKHByZXZpb3VzUGFja2FnZXNNYXBbcGFja2FnZU5hbWVdICE9CiAgICAgICAgICAgICAgICBjdXJyZW50UGFja2FnZXNNYXBbcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgVXJpIG5ld0ZpbGVVcmkgPSB1cmlUcmFuc2xhdG9yLnRyYW5zbGF0ZShpbXBvcnRVcmksIGZhbHNlKTsKICAgICAgICAgIGlmIChuZXdGaWxlVXJpICE9IGZpbGVVcmkpIHsKICAgICAgICAgICAgaW52YWxpZGF0ZWRCZWNhdXNlT2ZQYWNrYWdlVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChidWlsZGVyc1tpbXBvcnRVcmldPy5pc1N5bnRoZXRpYyA/PyBmYWxzZSkgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBhZGRCdWlsZGVyQW5kSW52YWxpZGF0ZVVyaXMoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeUJ1aWxkZXIpIHsKICAgICAgaWYgKHVyaS5zY2hlbWUgPT0gImRhcnQiICYmICFsaWJyYXJ5QnVpbGRlci5pc1N5bnRoZXRpYykgewogICAgICAgIGlmIChzZWVuVXJpcy5hZGQobGlicmFyeUJ1aWxkZXIuaW1wb3J0VXJpKSkgewogICAgICAgICAgcmV1c2VkTGlicmFyaWVzLmFkZChsaWJyYXJ5QnVpbGRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBidWlsZGVyc1t1cmldID0gbGlicmFyeUJ1aWxkZXI7CiAgICAgIGlmIChpc0ludmFsaWRhdGVkKHVyaSwgbGlicmFyeUJ1aWxkZXIubGlicmFyeS5maWxlVXJpKSkgewogICAgICAgIGludmFsaWRhdGVkSW1wb3J0VXJpcy5hZGQodXJpKTsKICAgICAgfQogICAgICBpZiAobGlicmFyeUJ1aWxkZXIgaXMgU291cmNlTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBmb3IgKExpYnJhcnlCdWlsZGVyIHBhcnQgaW4gbGlicmFyeUJ1aWxkZXIucGFydHMpIHsKICAgICAgICAgIGlmIChpc0ludmFsaWRhdGVkKHBhcnQuaW1wb3J0VXJpLCBwYXJ0LmZpbGVVcmkpKSB7CiAgICAgICAgICAgIGludmFsaWRhdGVkSW1wb3J0VXJpcy5hZGQocGFydC5pbXBvcnRVcmkpOwogICAgICAgICAgICBidWlsZGVyc1twYXJ0LmltcG9ydFVyaV0gPSBwYXJ0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsaWJyYXJ5QnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeUJ1aWxkZXIubGlicmFyeS5wYXJ0cykgewogICAgICAgICAgVXJpIHBhcnRVcmkgPSBnZXRQYXJ0VXJpKGxpYnJhcnlCdWlsZGVyLmltcG9ydFVyaSwgcGFydCk7CiAgICAgICAgICBVcmkgZmlsZVVyaSA9IGdldFBhcnRGaWxlVXJpKAogICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkuZmlsZVVyaSwgcGFydCwgdXJpVHJhbnNsYXRvcik7CgogICAgICAgICAgaWYgKGlzSW52YWxpZGF0ZWQocGFydFVyaSwgZmlsZVVyaSkpIHsKICAgICAgICAgICAgaW52YWxpZGF0ZWRJbXBvcnRVcmlzLmFkZChwYXJ0VXJpKTsKICAgICAgICAgICAgYnVpbGRlcnNbcGFydFVyaV0gPSBsaWJyYXJ5QnVpbGRlcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAodXNlckNvZGUgIT0gbnVsbCkgewogICAgICAvLyB1c2VyQ29kZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBidWlsZGVycyBmcm9tIHVzZXJCdWlsZGVycy4KICAgICAgdXNlckNvZGUubG9hZGVyLmJ1aWxkZXJzLmZvckVhY2goYWRkQnVpbGRlckFuZEludmFsaWRhdGVVcmlzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIHVzZXJDb2RlIHdhcyBudWxsIHNvIHdlIGV4cGxpY2l0bHkgaGF2ZSB0byBhZGQgdGhlIGJ1aWxkZXJzIGZyb20KICAgICAgLy8gdXNlckJ1aWxkZXJzICh3aGljaCBjYW5ub3QgYmUgbnVsbCBhcyB3ZSBjaGVja2VkIGluaXRpYWxseSB0aGF0IG9uZSBvZgogICAgICAvLyB0aGVtIHdhcyBub24tbnVsbCkuCiAgICAgIHVzZXJCdWlsZGVycy5mb3JFYWNoKGFkZEJ1aWxkZXJBbmRJbnZhbGlkYXRlVXJpcyk7CiAgICB9CgogICAgcmVjb3JkSW52YWxpZGF0ZWRJbXBvcnRVcmlzRm9yVGVzdGluZyhpbnZhbGlkYXRlZEltcG9ydFVyaXMpOwogICAgZm9yIChVcmkgdXJpIGluIGludmFsaWRhdGVkSW1wb3J0VXJpcykgewogICAgICBkaXJlY3RseUludmFsaWRhdGVkLmFkZChidWlsZGVyc1t1cmldKTsKICAgIH0KCiAgICBCdWlsZGVyR3JhcGggZ3JhcGggPSBuZXcgQnVpbGRlckdyYXBoKGJ1aWxkZXJzKTsKCiAgICAvLyBDb21wdXRlIGRpcmVjdCBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaW1wb3J0IFVSSSAodGhlIHJldmVyc2Ugb2YgdGhlCiAgICAvLyBlZGdlcyByZXR1cm5lZCBieSBgZ3JhcGgubmVpZ2hib3JzT2ZgKS4KICAgIE1hcDxVcmksIFNldDxVcmk+PiBkaXJlY3REZXBlbmRlbmNpZXMgPSA8VXJpLCBTZXQ8VXJpPj57fTsKICAgIGZvciAoVXJpIHZlcnRleCBpbiBncmFwaC52ZXJ0aWNlcykgewogICAgICBmb3IgKFVyaSBuZWlnaGJvciBpbiBncmFwaC5uZWlnaGJvcnNPZih2ZXJ0ZXgpKSB7CiAgICAgICAgKGRpcmVjdERlcGVuZGVuY2llc1tuZWlnaGJvcl0gPz89IG5ldyBTZXQ8VXJpPigpKS5hZGQodmVydGV4KTsKICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92ZSBhbGwgZGVwZW5kZW5jaWVzIG9mIFtpbnZhbGlkYXRlZEltcG9ydFVyaXNdIGZyb20gYnVpbGRlcnMuCiAgICBMaXN0PFVyaT4gd29ya0xpc3QgPSBpbnZhbGlkYXRlZEltcG9ydFVyaXM7CiAgICB3aGlsZSAod29ya0xpc3QuaXNOb3RFbXB0eSkgewogICAgICBVcmkgcmVtb3ZlZCA9IHdvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgTGlicmFyeUJ1aWxkZXIgY3VycmVudCA9IGJ1aWxkZXJzLnJlbW92ZShyZW1vdmVkKTsKICAgICAgLy8gW2N1cnJlbnRdIGlzIG51bGwgaWYgdGhlIGNvcnJlc3BvbmRpbmcga2V5IChVUkkpIGhhcyBhbHJlYWR5IGJlZW4KICAgICAgLy8gcmVtb3ZlZC4KICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgIFNldDxVcmk+IHMgPSBkaXJlY3REZXBlbmRlbmNpZXNbY3VycmVudC5pbXBvcnRVcmldOwogICAgICAgIGlmIChjdXJyZW50LmltcG9ydFVyaSAhPSByZW1vdmVkKSB7CiAgICAgICAgICBpZiAocyA9PSBudWxsKSB7CiAgICAgICAgICAgIHMgPSBkaXJlY3REZXBlbmRlbmNpZXNbcmVtb3ZlZF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzLmFkZEFsbChkaXJlY3REZXBlbmRlbmNpZXNbcmVtb3ZlZF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocyAhPSBudWxsKSB7CiAgICAgICAgICAvLyBbc10gaXMgbnVsbCBmb3IgbGVhdmVzLgogICAgICAgICAgZm9yIChVcmkgZGVwZW5kZW5jeSBpbiBzKSB7CiAgICAgICAgICAgIHdvcmtMaXN0LmFkZChkZXBlbmRlbmN5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm90UmV1c2VkTGlicmFyaWVzLmFkZChjdXJyZW50KTsKICAgICAgfQogICAgfQoKICAgIC8vIEJ1aWxkZXJzIGNvbnRhaW4gbWFwcGluZ3MgZnJvbSBwYXJ0IHVyaSB0byBidWlsZGVyLCBtZWFuaW5nIHRoZSBzYW1lCiAgICAvLyBidWlsZGVyIGNhbiBleGlzdCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgdmFsdWVzIGxpc3QuCiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChidWlsZGVyLmlzUGFydCkgY29udGludWU7CiAgICAgIC8vIFRPRE8oamVuc2ovYWhlKTogVGhpcyBsaW5lIGNhbiBwcm9iYWJseSBnbyBhd2F5IG9uY2UKICAgICAgLy8gaHR0cHM6Ly9kYXJ0LXJldmlldy5nb29nbGVzb3VyY2UuY29tLzQ3NDQyIGxhbmRzLgogICAgICBpZiAoYnVpbGRlci5pc1BhdGNoKSBjb250aW51ZTsKICAgICAgaWYgKCFzZWVuVXJpcy5hZGQoYnVpbGRlci5pbXBvcnRVcmkpKSBjb250aW51ZTsKICAgICAgcmV1c2VkTGlicmFyaWVzLmFkZChidWlsZGVyKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IFJldXNhZ2VSZXN1bHQobm90UmV1c2VkTGlicmFyaWVzLCBkaXJlY3RseUludmFsaWRhdGVkLAogICAgICAgIGludmFsaWRhdGVkQmVjYXVzZU9mUGFja2FnZVVwZGF0ZSwgcmV1c2VkTGlicmFyaWVzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW52YWxpZGF0ZShVcmkgdXJpKSB7CiAgICBpbnZhbGlkYXRlZFVyaXMuYWRkKHVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGludmFsaWRhdGVBbGxTb3VyY2VzKCkgewogICAgaWYgKHVzZXJDb2RlICE9IG51bGwpIHsKICAgICAgU2V0PFVyaT4gdXJpcyA9IG5ldyBTZXQ8VXJpPi5mcm9tKHVzZXJDb2RlLmxvYWRlci5idWlsZGVycy5rZXlzKTsKICAgICAgdXJpcy5yZW1vdmVBbGwoZGlsbExvYWRlZERhdGEubG9hZGVyLmJ1aWxkZXJzLmtleXMpOwogICAgICBpZiAocHJldmlvdXNTb3VyY2VCdWlsZGVycyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gcHJldmlvdXNTb3VyY2VCdWlsZGVycykgewogICAgICAgICAgdXJpcy5hZGQobGlicmFyeS5pbXBvcnRVcmkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpbnZhbGlkYXRlZFVyaXMuYWRkQWxsKHVyaXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRNb2R1bGVzVG9Mb2FkT25OZXh0Q29tcHV0ZURlbHRhKExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzKSB7CiAgICBtb2R1bGVzVG9Mb2FkID0gY29tcG9uZW50cy50b0xpc3QoKTsKICB9CgogIC8vLyBJbnRlcm5hbCBtZXRob2QuCiAgdm9pZCByZWNvcmROb25GdWxsQ29tcG9uZW50Rm9yVGVzdGluZyhDb21wb25lbnQgY29tcG9uZW50KSB7fQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVjb3JkSW52YWxpZGF0ZWRJbXBvcnRVcmlzRm9yVGVzdGluZyhMaXN0PFVyaT4gdXJpcykge30KCiAgLy8vIEludGVybmFsIG1ldGhvZC4KICB2b2lkIHJlY29yZFJlYnVpbGRCb2RpZXNDb3VudEZvclRlc3RpbmcoaW50IGNvdW50KSB7fQoKICAvLy8gSW50ZXJuYWwgbWV0aG9kLgogIHZvaWQgcmVjb3JkVGVtcG9yYXJ5RmlsZUZvclRlc3RpbmcoVXJpIHVyaSkge30KfQoKLy8vIFRyYW5zbGF0ZSBhIHBhcnRzICJwYXJ0VXJpIiB0byBhbiBhY3R1YWwgdXJpIHdpdGggaGFuZGxpbmcgb2YgaW52YWxpZCB1cmlzLgpVcmkgZ2V0UGFydFVyaShVcmkgcGFyZW50VXJpLCBMaWJyYXJ5UGFydCBwYXJ0KSB7CiAgdHJ5IHsKICAgIHJldHVybiBwYXJlbnRVcmkucmVzb2x2ZShwYXJ0LnBhcnRVcmkpOwogIH0gb24gRm9ybWF0RXhjZXB0aW9uIHsKICAgIC8vIFRoaXMgaXMgYWxzbyBkb25lIGluIFtTb3VyY2VMaWJyYXJ5QnVpbGRlci5yZXNvbHZlXQogICAgcmV0dXJuIG5ldyBVcmkoCiAgICAgICAgc2NoZW1lOiBTb3VyY2VMaWJyYXJ5QnVpbGRlci5NQUxGT1JNRURfVVJJX1NDSEVNRSwKICAgICAgICBxdWVyeTogVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50KHBhcnQucGFydFVyaSkpOwogIH0KfQoKY2xhc3MgUGFja2FnZUNoYW5nZWRFcnJvciB7CiAgY29uc3QgUGFja2FnZUNoYW5nZWRFcnJvcigpOwp9CgpjbGFzcyBJbml0aWFsaXplRnJvbUNvbXBvbmVudEVycm9yIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgY29uc3QgSW5pdGlhbGl6ZUZyb21Db21wb25lbnRFcnJvcih0aGlzLm1lc3NhZ2UpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBtZXNzYWdlOwp9CgpjbGFzcyBJbmNyZW1lbnRhbENvbXBpbGVyRGF0YSB7CiAgUHJvY2VkdXJlIHVzZXJMb2FkZWRVcmlNYWluID0gbnVsbDsKICBDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKICBMaXN0PGludD4gaW5pdGlhbGl6YXRpb25CeXRlcyA9IG51bGw7Cn0KCmNsYXNzIFJldXNhZ2VSZXN1bHQgewogIGZpbmFsIFNldDxMaWJyYXJ5QnVpbGRlcj4gbm90UmV1c2VkTGlicmFyaWVzOwogIGZpbmFsIExpc3Q8TGlicmFyeUJ1aWxkZXI+IGRpcmVjdGx5SW52YWxpZGF0ZWQ7CiAgZmluYWwgYm9vbCBpbnZhbGlkYXRlZEJlY2F1c2VPZlBhY2thZ2VVcGRhdGU7CiAgZmluYWwgTGlzdDxMaWJyYXJ5QnVpbGRlcj4gcmV1c2VkTGlicmFyaWVzOwoKICBSZXVzYWdlUmVzdWx0KHRoaXMubm90UmV1c2VkTGlicmFyaWVzLCB0aGlzLmRpcmVjdGx5SW52YWxpZGF0ZWQsCiAgICAgIHRoaXMuaW52YWxpZGF0ZWRCZWNhdXNlT2ZQYWNrYWdlVXBkYXRlLCB0aGlzLnJldXNlZExpYnJhcmllcykKICAgICAgOiBhc3NlcnQobm90UmV1c2VkTGlicmFyaWVzICE9IG51bGwpLAogICAgICAgIGFzc2VydChkaXJlY3RseUludmFsaWRhdGVkICE9IG51bGwpLAogICAgICAgIGFzc2VydChpbnZhbGlkYXRlZEJlY2F1c2VPZlBhY2thZ2VVcGRhdGUgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHJldXNlZExpYnJhcmllcyAhPSBudWxsKTsKfQoKY2xhc3MgRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uIHsKICBmaW5hbCBTZXQ8TGlicmFyeUJ1aWxkZXI+IHJlYnVpbGRCb2RpZXM7CiAgZmluYWwgU2V0PExpYnJhcnlCdWlsZGVyPiBvcmlnaW5hbE5vdFJldXNlZExpYnJhcmllczsKICBmaW5hbCBTZXQ8VXJpPiBtaXNzaW5nU291cmNlczsKCiAgRXhwZXJpbWVudGFsSW52YWxpZGF0aW9uKAogICAgICB0aGlzLnJlYnVpbGRCb2RpZXMsIHRoaXMub3JpZ2luYWxOb3RSZXVzZWRMaWJyYXJpZXMsIHRoaXMubWlzc2luZ1NvdXJjZXMpCiAgICAgIDogYXNzZXJ0KHJlYnVpbGRCb2RpZXMgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KG9yaWdpbmFsTm90UmV1c2VkTGlicmFyaWVzICE9IG51bGwpLAogICAgICAgIGFzc2VydChtaXNzaW5nU291cmNlcyAhPSBudWxsKTsKfQoKY2xhc3MgSW5jcmVtZW50YWxLZXJuZWxUYXJnZXQgZXh0ZW5kcyBLZXJuZWxUYXJnZXQKICAgIGltcGxlbWVudHMgQ2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyIHsKICBTZXQ8Q2xhc3M+IGNsYXNzZXNDaGFuZ2VkU3RydWN0dXJlOwogIEluY3JlbWVudGFsS2VybmVsVGFyZ2V0KEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSwgYm9vbCBpbmNsdWRlQ29tbWVudHMsCiAgICAgIERpbGxUYXJnZXQgZGlsbFRhcmdldCwgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yKQogICAgICA6IHN1cGVyKGZpbGVTeXN0ZW0sIGluY2x1ZGVDb21tZW50cywgZGlsbFRhcmdldCwgdXJpVHJhbnNsYXRvcik7CgogIENoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllciBnZXQgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyID0+IHRoaXM7CgogIEBvdmVycmlkZQogIHZvaWQgZm9yQ2xhc3MoQ2xhc3MgYykgewogICAgY2xhc3Nlc0NoYW5nZWRTdHJ1Y3R1cmUgPz89IG5ldyBTZXQ8Q2xhc3M+KCk7CiAgICBjbGFzc2VzQ2hhbmdlZFN0cnVjdHVyZS5hZGQoYyk7CiAgfQp9CodJAE5OPAEkASEBNAkjHB8jGgEtNAE4ASQJDxMSFBYRGxUOExcZEBMSFwE/AT8jAU4BPDgB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Jkc6RwFBAQwbMiQEAgE1cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnRjZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvaW5jcmVtZW50YWxfc2VyaWFsaXplci5kYXJ0tIgvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5pbmNyZW1lbnRhbF9zZXJpYWxpemVyOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQnIHNob3cgU3ViQ29tcG9uZW50VmlldzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydCcgc2hvdyBCaW5hcnlQcmludGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcgc2hvdyBDb21wb25lbnQsIExpYnJhcnksIExpYnJhcnlEZXBlbmRlbmN5OwoKaW1wb3J0ICdrZXJuZWwvdXRpbHMuZGFydCcgc2hvdyBCeXRlU2luazsKCmNsYXNzIEluY3JlbWVudGFsU2VyaWFsaXplciB7CiAgZmluYWwgTWFwPFVyaSwgU2VyaWFsaXphdGlvbkdyb3VwPiB1cmlUb0dyb3VwID0KICAgICAgbmV3IE1hcDxVcmksIFNlcmlhbGl6YXRpb25Hcm91cD4oKTsKICBmaW5hbCBTZXQ8VXJpPiBpbnZhbGlkYXRlZFVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKCiAgLy8vIEludmFsaWRhdGUgdGhlIHVyaTogV2lsbCByZW1vdmUgY2FjaGUgYXNzb2NpYXRlZCB3aXRoIGl0LCBkZXBlbmRpbmcgb24gaXQKICAvLy8gZXRjLiBDYWxsZWQgYnkgdGhlIGluY3JlbWVudGFsIGNvbXBpbGVyLgogIHZvaWQgaW52YWxpZGF0ZShVcmkgdXJpKSB7CiAgICBpbnZhbGlkYXRlZFVyaXMuYWRkKHVyaSk7CiAgfQoKICAvLy8gSW5pdGlhbGl6ZXMgdGhlIGNhY2hlIHZpYSBhIGFscmVhZHkgc2VyaWFsaXplZCBsaXN0IG9mIGJ5dGVzIGJhc2VkIG9uIHRoZQogIC8vLyB2aWV3IG9mIHRob3NlIGJ5dGVzLiBDYWxsZWQgYnkgdGhlIGluY3JlbWVudGFsIGNvbXBpbGVyLgogIGJvb2wgaW5pdGlhbGl6ZShMaXN0PGludD4gYnl0ZXMsIExpc3Q8U3ViQ29tcG9uZW50Vmlldz4gdmlld3MpIHsKICAgIGlmICh1cmlUb0dyb3VwLmlzTm90RW1wdHkpIHsKICAgICAgdGhyb3cgIkNhbm5vdCBpbml0aWFsaXplIHdoZW4gYWxyZWFkeSBpbiB1c2UuIjsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBzdWItY29tcG9uZW50cyB0aGF0IGFyZSBwYWNrYWdlZCBjb3JyZWN0bHkuCiAgICBMaXN0PFN1YkNvbXBvbmVudFZpZXc+IGdvb2RWaWV3cyA9IFtdOwogICAgU2V0PFVyaT4gdXJpcyA9IG5ldyBTZXQ8VXJpPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3cy5sZW5ndGg7IGkrKykgewogICAgICBTdWJDb21wb25lbnRWaWV3IHZpZXcgPSB2aWV3c1tpXTsKICAgICAgYm9vbCBnb29kID0gdHJ1ZTsKICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lOwogICAgICBmb3IgKExpYnJhcnkgbGliIGluIHZpZXcubGlicmFyaWVzKSB7CiAgICAgICAgVXJpIHVyaSA9IGxpYi5pbXBvcnRVcmk7CiAgICAgICAgLy8gVXJpcyBuZWVkIHRvIGJlIHVuaXF1ZS4KICAgICAgICBpZiAoIXVyaXMuYWRkKGxpYi5maWxlVXJpKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICh1cmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICAgICAgU3RyaW5nIHRoaXNQYWNrYWdlTmFtZSA9IHVyaS5wYXRoU2VnbWVudHMuZmlyc3Q7CiAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHRoaXNQYWNrYWdlTmFtZTsKICAgICAgICAgIH0gZWxzZSBpZiAocGFja2FnZU5hbWUgIT0gdGhpc1BhY2thZ2VOYW1lKSB7CiAgICAgICAgICAgIGdvb2QgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ29vZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZ29vZCkgewogICAgICAgIGdvb2RWaWV3cy5hZGQodmlldyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgZ3JvdXBzLiBXcmFwIGluIHRyeSBiZWNhdXNlIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiBhIGdyb3VwCiAgICAvLyBoYXMgYSBkZXBlbmRlbmN5IHRoYXQgaXNuJ3QgYmVpbmcgbWV0LgogICAgdHJ5IHsKICAgICAgTGlzdDxTZXJpYWxpemF0aW9uR3JvdXA+IG5ld0dyb3VwcyA9IG5ldyBMaXN0PFNlcmlhbGl6YXRpb25Hcm91cD4oKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnb29kVmlld3MubGVuZ3RoOyBpKyspIHsKICAgICAgICBTdWJDb21wb25lbnRWaWV3IHZpZXcgPSBnb29kVmlld3NbaV07CiAgICAgICAgTGlzdDxpbnQ+IGRhdGEgPSBuZXcgVWludDhMaXN0KHZpZXcuY29tcG9uZW50RmlsZVNpemUpOwogICAgICAgIGRhdGEuc2V0UmFuZ2UoMCwgZGF0YS5sZW5ndGgsIGJ5dGVzLCB2aWV3LmNvbXBvbmVudFN0YXJ0T2Zmc2V0KTsKICAgICAgICBTZXJpYWxpemF0aW9uR3JvdXAgbmV3R3JvdXAgPSBjcmVhdGVHcm91cEZvcih2aWV3LmxpYnJhcmllcywgZGF0YSk7CiAgICAgICAgbmV3R3JvdXBzLmFkZChuZXdHcm91cCk7CiAgICAgIH0KCiAgICAgIC8vIFNldHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcgZm9yIHRoZSBuZXcgZ3JvdXBzLgogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdvb2RWaWV3cy5sZW5ndGg7IGkrKykgewogICAgICAgIFN1YkNvbXBvbmVudFZpZXcgdmlldyA9IGdvb2RWaWV3c1tpXTsKICAgICAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcyA9IHZpZXcubGlicmFyaWVzOwogICAgICAgIFNlcmlhbGl6YXRpb25Hcm91cCBwYWNrYWdlR3JvdXAgPSBuZXdHcm91cHNbaV07CiAgICAgICAgc2V0dXBEZXBlbmRlbmN5VHJhY2tpbmcobGlicmFyaWVzLCBwYWNrYWdlR3JvdXApOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHVyaVRvR3JvdXAuY2xlYXIoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8gV3JpdGUgcGFja2FnZXMgdG8gc2luaywgY2FjaGUgbmV3IHBhY2thZ2UgZGF0YSwgdHJpbSBpbnB1dCBjb21wb25lbnQuCiAgdm9pZCB3cml0ZVBhY2thZ2VzVG9TaW5rQW5kVHJpbUNvbXBvbmVudCgKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwgU2luazxMaXN0PGludD4+IHNpbmspIHsKICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKGNvbXBvbmVudC5saWJyYXJpZXMuaXNFbXB0eSkgcmV0dXJuOwoKICAgIC8vIElmIHdlJ3JlIGdpdmVuIGEgcGFydGlhbCBjb21wb25lbnQgKGkuZS4gYW4gYWN0dWFsIGRlbHRhIGNvbXBvbmVudCkKICAgIC8vIGluY3JlbWVudGFsIHNlcmlhbGl6YXRpb24gKGF0IGxlYXN0IGN1cnJlbnRseSkgZG9lc24ndCB3b3JrLgogICAgLy8gVGhlIHJlYXNvbiBpcyB0aGF0IGl0IG1pZ2h0IGNvbnRhaW4gYSBuZXcgcGFydGlhbCB0aGluZyBvZiB3aGF0IHdlCiAgICAvLyBhbHJlYWR5IGhhdmUgY2FjaGVkIHdoaWxlIHN0aWxsIGRlcGVuZGluZyBvbiBzb21ldGhpbmcgZnJvbSB0aGUgc2FtZQogICAgLy8gZ3JvdXAgdGhhdCBpcyBjdXJyZW50bHkgY2FjaGVkLiBXZSB3b3VsZCB0aHJvdyBhd2F5IHRoZSBjYWNoZSwgYnV0CiAgICAvLyBhY3R1YWxseSBkZXBlbmQgb24gc29tZXRoaW5nIHdlIGp1c3QgdGhyZXcgYXdheSAtLS0gd2Ugd291bGQgdHJ5IHRvCiAgICAvLyBpbmNsdWRlIGl0IGFuZCBjcmFzaCBiZWNhdXNlIHdlIG5vIGxvbmdlciBoYXZlIGl0LgogICAgLy8gQWx0ZXJuYXRpdmUgd2F5cyB0byBmaXggdGhpcyBjb3VsZCBiZToKICAgIC8vICogdG8gZ3JvdXAgaW50byBzbWFsbGVyIGdyb3VwcyBzbyB0aGlzIHdvdWxkbid0IGhhcHBlbi4KICAgIC8vICogY2FjaGUgdGhlIGFjdHVhbCBMaWJyYXJpZXMgdG9vLCBzbyB3ZSBjb3VsZCByZS1zZXJpYWxpemUgd2hlbiBuZWVkZWQKICAgIC8vICAgKHRob3VnaCBtYXliZSBub3QgZWFnZXJseSkuCiAgICBpZiAoIWlzU2VsZkNvbnRhaW5lZChjb21wb25lbnQpKSByZXR1cm47CgogICAgLy8gUmVtb3ZlIGNhY2hlIHBlcnRhaW5pbmcgdG8gaW52YWxpZGF0ZWQgdXJpcy4KICAgIGlmIChpbnZhbGlkYXRlZFVyaXMuaXNOb3RFbXB0eSkgewogICAgICByZW1vdmVJbnZhbGlkYXRlZCgpOwogICAgfQoKICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gc2VyaWFsaXplIGluZGl2aWR1YWwgbGlicmFyaWVzLgogICAgY29tcG9uZW50LmNvbXB1dGVDYW5vbmljYWxOYW1lcygpOwoKICAgIC8vIFNwbGl0IGludG8gcGFja2FnZSBhbmQgbm9uLXBhY2thZ2UgbGlicmFyaWVzLgogICAgTGlzdDxMaWJyYXJ5PiBwYWNrYWdlTGlicmFyaWVzID0gbmV3IExpc3Q8TGlicmFyeT4oKTsKICAgIExpc3Q8TGlicmFyeT4gbm9uUGFja2FnZUxpYnJhcmllcyA9IG5ldyBMaXN0PExpYnJhcnk+KCk7CiAgICBmb3IgKExpYnJhcnkgbGliIGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgVXJpIHVyaSA9IGxpYi5pbXBvcnRVcmk7CiAgICAgIGlmICh1cmkuc2NoZW1lID09ICJwYWNrYWdlIikgewogICAgICAgIHBhY2thZ2VMaWJyYXJpZXMuYWRkKGxpYik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9uUGFja2FnZUxpYnJhcmllcy5hZGQobGliKTsKICAgICAgfQogICAgfQoKICAgIC8vIE91dHB1dCBhbHJlYWR5IHNlcmlhbGl6ZWQgcGFja2FnZXMgYW5kIGdyb3VwIG5lZWRlZCBub24tc2VyaWFsaXplZAogICAgLy8gcGFja2FnZXMuCiAgICBNYXA8U3RyaW5nLCBMaXN0PExpYnJhcnk+PiBuZXdQYWNrYWdlcyA9IG5ldyBNYXA8U3RyaW5nLCBMaXN0PExpYnJhcnk+PigpOwogICAgU2V0PFNlcmlhbGl6YXRpb25Hcm91cD4gY2FjaGVkUGFja2FnZXNJbk91dHB1dCA9CiAgICAgICAgbmV3IFNldDxTZXJpYWxpemF0aW9uR3JvdXA+LmlkZW50aXR5KCk7CiAgICBmb3IgKExpYnJhcnkgbGliIGluIHBhY2thZ2VMaWJyYXJpZXMpIHsKICAgICAgU2VyaWFsaXphdGlvbkdyb3VwIGdyb3VwID0gdXJpVG9Hcm91cFtsaWIuZmlsZVVyaV07CiAgICAgIGlmIChncm91cCAhPSBudWxsKSB7CiAgICAgICAgYWRkRGF0YUJ1dE5vdERlcGVuZGVudERhdGEoZ3JvdXAsIGNhY2hlZFBhY2thZ2VzSW5PdXRwdXQsIHNpbmspOwogICAgICB9IGVsc2UgewogICAgICAgIFN0cmluZyBwYWNrYWdlID0gbGliLmltcG9ydFVyaS5wYXRoU2VnbWVudHMuZmlyc3Q7CiAgICAgICAgbmV3UGFja2FnZXNbcGFja2FnZV0gPz89IDxMaWJyYXJ5PltdOwogICAgICAgIG5ld1BhY2thZ2VzW3BhY2thZ2VdLmFkZChsaWIpOwogICAgICB9CiAgICB9CgogICAgLy8gQWRkIGFueSBkZXBlbmRlbmNpZXMgdGhhdCB3YXNuJ3QgYWRkZWQgYWxyZWFkeS4KICAgIExpc3Q8U2VyaWFsaXphdGlvbkdyb3VwPiB1cEZyb250R3JvdXBzID0gY2FjaGVkUGFja2FnZXNJbk91dHB1dC50b0xpc3QoKTsKICAgIGZvciAoU2VyaWFsaXphdGlvbkdyb3VwIGdyb3VwIGluIHVwRnJvbnRHcm91cHMpIHsKICAgICAgaWYgKGdyb3VwLmRlcGVuZGVuY2llcyAhPSBudWxsKSB7CiAgICAgICAgLy8gTm93IGFsc28gYWRkIGFsbCBkZXBlbmRlbmNpZXMuCiAgICAgICAgZm9yIChTZXJpYWxpemF0aW9uR3JvdXAgZGVwIGluIGdyb3VwLmRlcGVuZGVuY2llcykgewogICAgICAgICAgYWRkRGF0YUFuZERlcGVuZGVudERhdGEoZGVwLCBjYWNoZWRQYWNrYWdlc0luT3V0cHV0LCBzaW5rKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBTZXJpYWxpemUgYWxsIG5ldyBwYWNrYWdlcywgY3JlYXRlIGdyb3VwcyBhbmQgYWRkIHRvIHNpbmsuCiAgICBNYXA8U3RyaW5nLCBTZXJpYWxpemF0aW9uR3JvdXA+IG5ld1BhY2thZ2VHcm91cHMgPQogICAgICAgIG5ldyBNYXA8U3RyaW5nLCBTZXJpYWxpemF0aW9uR3JvdXA+KCk7CiAgICBmb3IgKFN0cmluZyBwYWNrYWdlIGluIG5ld1BhY2thZ2VzLmtleXMpIHsKICAgICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMgPSBuZXdQYWNrYWdlc1twYWNrYWdlXTsKICAgICAgTGlzdDxpbnQ+IGRhdGEgPSBzZXJpYWxpemUoY29tcG9uZW50LCBsaWJyYXJpZXMpOwogICAgICBzaW5rLmFkZChkYXRhKTsKICAgICAgU2VyaWFsaXphdGlvbkdyb3VwIG5ld0dyb3VwID0gY3JlYXRlR3JvdXBGb3IobGlicmFyaWVzLCBkYXRhKTsKICAgICAgbmV3UGFja2FnZUdyb3Vwc1twYWNrYWdlXSA9IG5ld0dyb3VwOwogICAgfQoKICAgIC8vIFNldHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcgZm9yIHRoZSBuZXcgZ3JvdXBzLgogICAgZm9yIChTdHJpbmcgcGFja2FnZSBpbiBuZXdQYWNrYWdlcy5rZXlzKSB7CiAgICAgIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzID0gbmV3UGFja2FnZXNbcGFja2FnZV07CiAgICAgIFNlcmlhbGl6YXRpb25Hcm91cCBwYWNrYWdlR3JvdXAgPSBuZXdQYWNrYWdlR3JvdXBzW3BhY2thZ2VdOwogICAgICBzZXR1cERlcGVuZGVuY3lUcmFja2luZyhsaWJyYXJpZXMsIHBhY2thZ2VHcm91cCk7CiAgICB9CgogICAgLy8gQWxsIHBhY2thZ2VzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgc2luayBhbHJlYWR5LgogICAgY29tcG9uZW50LmxpYnJhcmllcwogICAgICAuLmNsZWFyKCkKICAgICAgLi5hZGRBbGwobm9uUGFja2FnZUxpYnJhcmllcyk7CiAgfQoKICBib29sIGlzU2VsZkNvbnRhaW5lZChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBTZXQ8TGlicmFyeT4gZ290ID0gbmV3IFNldDxMaWJyYXJ5Pi5mcm9tKGNvbXBvbmVudC5saWJyYXJpZXMpOwogICAgZm9yIChMaWJyYXJ5IGxpYiBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSBpbiBsaWIuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgaWYgKCFnb3QuY29udGFpbnMoZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5KSkgewogICAgICAgICAgaWYgKGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICJkYXJ0IikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8vIFJlbW92ZSBjYWNoZWQgZGF0YSBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIGludmFsaWRhdGVkLgogIC8vLyBOb3RlIHRoYXQgaW52YWxpZGF0aW5nIGEgc2luZ2xlIGZpbGUgY2FuIHJlbW92ZSBtYW55IGNhY2hlZCB0aGluZ3MgYmVjYXVzZQogIC8vLyBvZiBkZXBlbmRlbmNpZXMuCiAgdm9pZCByZW1vdmVJbnZhbGlkYXRlZCgpIHsKICAgIC8vIFJlbW92ZSBhbGwgZGlyZWN0bHkgaW52YWxpZGF0ZWQgZW50cmllcy4KICAgIFNldDxTZXJpYWxpemF0aW9uR3JvdXA+IHJlbW92ZWQgPSBuZXcgU2V0PFNlcmlhbGl6YXRpb25Hcm91cD4oKTsKICAgIExpc3Q8U2VyaWFsaXphdGlvbkdyb3VwPiB3b3JrTGlzdCA9IG5ldyBMaXN0PFNlcmlhbGl6YXRpb25Hcm91cD4oKTsKICAgIGZvciAoVXJpIHVyaSBpbiBpbnZhbGlkYXRlZFVyaXMpIHsKICAgICAgcmVtb3ZlVXJpRnJvbU1hcCh1cmksIHJlbW92ZWQsIHdvcmtMaXN0KTsKICAgIH0KCiAgICAvLyBDb250aW51b3VzbHkgcmVtb3ZlIGFsbCB0aGF0IGRlcGVuZCBvbiB0aGUgcmVtb3ZlZCBncm91cHMuCiAgICAvLwogICAgLy8gTm90ZSB0aGF0IHdpdGggdGhlIGN1cnJlbnQgaW52YWxpZGF0aW5nIHN0cmF0ZWd5IGluIHRoZSBpbmNyZW1lbnRhbAogICAgLy8gY29tcGlsZXIgdGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IChhc3N1bWluZyB0aGUgaW5jcmVtZW50YWwKICAgIC8vIGNvbXBpbGVyIGlzIHVzZWQgdmlhIHRoZSBpbmNyZW1lbnRhbCBjb21waWxlcikgLSBidXQgaXQgaXMgaW5jbHVkZWQgZm9yCiAgICAvLyBjb21wbGV0ZW5lc3MuCiAgICAvLwogICAgLy8gVGhlIHJlYXNvbiB3ZSBoYXZlIHRvIGRvIHRoaXMgKGFzc3VtaW5nIGEgZGlmZmVyZW50IGluY3JlbWVudGFsCiAgICAvLyBjb21waWxlciBpbnZhbGlkYXRpb24gc3RyYXRlZ3kpLCBpcyB0aGF0IHdlIGdyb3VwIHRoaW5ncyBpbnRvIHBhY2thZ2VzLAogICAgLy8gbWVhbmluZyB0aGF0IGEgZ3JvdXAgYXMgYSB3aG9sZSBtaWdodCBkZXBlbmQgb24gYW5vdGhlciBncm91cCBjb250YWluaW5nCiAgICAvLyBsaWJyYXJpZXMgdGhhdCBpcyBub3QgaW4gdGhlIGlucHV0IGNvbXBvbmVudC4gTm90IHJlbW92aW5nIHRoZXNlIGdyb3VwcwogICAgLy8gY291bGQgbGVhZCB0byBpbmNsdWRpbmcgYSBncm91cCBpbiBhbiBvdXRwdXQgd2hlcmUgd2UgY2Fubm90IHJlLWNyZWF0ZQogICAgLy8gdGhlIGRlcGVuZGVuY2llcy4gRXhhbXBsZToKICAgIC8vIEdyb3VwICMxOiBbbGliMV0KICAgIC8vIEdyb3VwICMyOiBbbGliMiwgbGliM10uIE5vdGUgdGhhdCBsaWIzIGRlcGVuZHMgb24gbGliMSwgYnV0IGxpYjIgaXMKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYWxvbmUuCiAgICAvLyBMaWIxIGlzIGludmFsaWRhdGVkIGFuZCB3ZSB0aHVzIHJlbW92ZSBncm91cCAjMS4KICAgIC8vIFdlIHRoZW4gc2VyaWFsaXplIHNvbWV0aGluZyB0aGF0IG5lZWRzIGxpYjIuIFdlIHRodXMgb3V0cHV0IGdyb3VwICMyLgogICAgLy8gV2Ugc2hvdWxkIG5vdyBhbHNvIG91dHB1dCBncm91cCAjMSwgYnV0IHdlIGRvbid0IGhhdmUgaXQgc28gd2UgY2FuJ3QuCiAgICAvLyBXZSBjYW4ndCByZS1jcmVhdGUgaXQgZWl0aGVyLCBiZWNhdXNlIHRoZSBpbnB1dCBjb21wb25lbnQgb25seSBjb250YWlucwogICAgLy8gbGliMiBhcyBpdCBpcyBzdGFuZGFsb25lLiBIYWQgd2UgcmVtb3ZlZCBncm91cCAjMiB0b28gZXZlcnl0aGluZyB3b3VsZAogICAgLy8gaGF2ZSBiZWVuIGZpbmUgYXMgd2Ugd291bGQgdGhlbiBqdXN0IHNlcmlhbGl6ZSBhbmQgY2FjaGVkIGxpYjIgYnkgaXRzZWxmLgogICAgd2hpbGUgKHdvcmtMaXN0LmlzTm90RW1wdHkpIHsKICAgICAgU2VyaWFsaXphdGlvbkdyb3VwIGdyb3VwID0gd29ya0xpc3QucmVtb3ZlTGFzdCgpOwogICAgICBpZiAoZ3JvdXAub3RoZXJzRGVwZW5kaW5nT25NZSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgZm9yIChTZXJpYWxpemF0aW9uR3JvdXAgZGVwZW5kc09uR3JvdXAgaW4gZ3JvdXAub3RoZXJzRGVwZW5kaW5nT25NZSkgewogICAgICAgIHJlbW92ZVVyaUZyb21NYXAoZGVwZW5kc09uR3JvdXAudXJpcy5maXJzdCwgcmVtb3ZlZCwgd29ya0xpc3QpOwogICAgICB9CiAgICB9CgogICAgaW52YWxpZGF0ZWRVcmlzLmNsZWFyKCk7CiAgfQoKICAvLy8gU2V0dXAgZGVwZW5kZW5jeSB0cmFja2luZyBmb3IgYSBzaW5nbGUgZ3JvdXAgaGF2aW5nIHRoZSBzcGVjaWZpZWQKICAvLy8gbGlicmFyaWVzLiBOb3RlIHRoYXQgYWxsIGdyb3VwcyB0aGlzIGRlcGVuZCBvbiBoYXMgdG8gYmUgY3JlYXRlZCBwcmlvcgogIC8vLyB0byBjYWxsaW5nIHRoaXMuCiAgdm9pZCBzZXR1cERlcGVuZGVuY3lUcmFja2luZygKICAgICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsIFNlcmlhbGl6YXRpb25Hcm91cCBwYWNrYWdlR3JvdXApIHsKICAgIGZvciAoTGlicmFyeSBsaWIgaW4gbGlicmFyaWVzKSB7CiAgICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3kgZGVwIGluIGxpYi5kZXBlbmRlbmNpZXMpIHsKICAgICAgICBMaWJyYXJ5IGRlcGVuZGVuY3lMaWJyYXJ5ID0gZGVwLmltcG9ydGVkTGlicmFyeVJlZmVyZW5jZS5hc0xpYnJhcnk7CiAgICAgICAgaWYgKGRlcGVuZGVuY3lMaWJyYXJ5LmltcG9ydFVyaS5zY2hlbWUgIT0gInBhY2thZ2UiKSBjb250aW51ZTsKICAgICAgICBVcmkgZGVwZW5kZW5jeUxpYnJhcnlVcmkgPQogICAgICAgICAgICBkZXAuaW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlLmFzTGlicmFyeS5maWxlVXJpOwogICAgICAgIFNlcmlhbGl6YXRpb25Hcm91cCBkZXBHcm91cCA9IHVyaVRvR3JvdXBbZGVwZW5kZW5jeUxpYnJhcnlVcmldOwogICAgICAgIGlmIChkZXBHcm91cCA9PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyAiRGlkbid0IGNvbnRhaW4gZ3JvdXAgZm9yICRkZXBlbmRlbmN5TGlicmFyeVVyaSI7CiAgICAgICAgfQogICAgICAgIGlmIChkZXBHcm91cCA9PSBwYWNrYWdlR3JvdXApIGNvbnRpbnVlOwogICAgICAgIHBhY2thZ2VHcm91cC5yZWdpc3RlckRlcGVuZGVuY3koZGVwR3JvdXApOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQWRkIHRoZSBncm91cCBidXQgbm90IGl0cyBkZXBlbmRlbmNpZXMgdG8gdGhlIG91dHB1dCBpZiB0aGV5IHdlcmVuJ3QgYWRkZWQKICAvLy8gYWxyZWFkeS4KICBhZGREYXRhQnV0Tm90RGVwZW5kZW50RGF0YShTZXJpYWxpemF0aW9uR3JvdXAgZ3JvdXAsCiAgICAgIFNldDxTZXJpYWxpemF0aW9uR3JvdXA+IGNhY2hlZFBhY2thZ2VzSW5PdXRwdXQsIFNpbms8TGlzdDxpbnQ+PiBzaW5rKSB7CiAgICBpZiAoY2FjaGVkUGFja2FnZXNJbk91dHB1dC5hZGQoZ3JvdXApKSB7CiAgICAgIHNpbmsuYWRkKGdyb3VwLnNlcmlhbGl6ZWREYXRhKTsKICAgIH0KICB9CgogIC8vLyBBZGQgdGhlIGdyb3VwIGFuZCBpdHMgZGVwZW5kZW5jaWVzIHRvIHRoZSBvdXRwdXQgaWYgdGhleSB3ZXJlbid0IGFkZGVkCiAgLy8vIGFscmVhZHkuCiAgYWRkRGF0YUFuZERlcGVuZGVudERhdGEoU2VyaWFsaXphdGlvbkdyb3VwIGdyb3VwLAogICAgICBTZXQ8U2VyaWFsaXphdGlvbkdyb3VwPiBjYWNoZWRQYWNrYWdlc0luT3V0cHV0LCBTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgaWYgKGNhY2hlZFBhY2thZ2VzSW5PdXRwdXQuYWRkKGdyb3VwKSkgewogICAgICBzaW5rLmFkZChncm91cC5zZXJpYWxpemVkRGF0YSk7CiAgICAgIGlmIChncm91cC5kZXBlbmRlbmNpZXMgIT0gbnVsbCkgewogICAgICAgIC8vIE5vdyBhbHNvIGFkZCBhbGwgZGVwZW5kZW5jaWVzLgogICAgICAgIGZvciAoU2VyaWFsaXphdGlvbkdyb3VwIGRlcCBpbiBncm91cC5kZXBlbmRlbmNpZXMpIHsKICAgICAgICAgIGFkZERhdGFBbmREZXBlbmRlbnREYXRhKGRlcCwgY2FjaGVkUGFja2FnZXNJbk91dHB1dCwgc2luayk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlIGEgW1NlcmlhbGl6YXRpb25Hcm91cF0gZm9yIHRoZSBpbnB1dCwgc2V0dGluZyB1cCBbdXJpVG9Hcm91cF0uCiAgU2VyaWFsaXphdGlvbkdyb3VwIGNyZWF0ZUdyb3VwRm9yKExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLCBMaXN0PGludD4gZGF0YSkgewogICAgU2V0PFVyaT4gbGlicmFyeVVyaXMgPSBuZXcgU2V0PFVyaT4oKTsKICAgIGZvciAoTGlicmFyeSBsaWIgaW4gbGlicmFyaWVzKSB7CiAgICAgIGxpYnJhcnlVcmlzLmFkZChsaWIuZmlsZVVyaSk7CiAgICB9CgogICAgU2VyaWFsaXphdGlvbkdyb3VwIG5ld0dyb3VwID0gbmV3IFNlcmlhbGl6YXRpb25Hcm91cChkYXRhLCBsaWJyYXJ5VXJpcyk7CgogICAgZm9yIChVcmkgdXJpIGluIGxpYnJhcnlVcmlzKSB7CiAgICAgIGFzc2VydCghdXJpVG9Hcm91cC5jb250YWluc0tleSh1cmkpKTsKICAgICAgdXJpVG9Hcm91cFt1cmldID0gbmV3R3JvdXA7CiAgICB9CiAgICByZXR1cm4gbmV3R3JvdXA7CiAgfQoKICAvLy8gU2VyaWFsaXplIHRoZSBzcGVjaWZpZWQgbGlicmFyaWVzIHVzaW5nIG90aGVyIG5lZWRlZCBkYXRhIGZyb20gdGhlCiAgLy8vIGNvbXBvbmVudC4KICBMaXN0PGludD4gc2VyaWFsaXplKENvbXBvbmVudCBjb21wb25lbnQsIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzKSB7CiAgICBDb21wb25lbnQgc2luZ2xlUGFja2FnZUxpYnJhcmllcyA9IG5ldyBDb21wb25lbnQoCiAgICAgICAgbGlicmFyaWVzOiBsaWJyYXJpZXMsCiAgICAgICAgdXJpVG9Tb3VyY2U6IGNvbXBvbmVudC51cmlUb1NvdXJjZSwKICAgICAgICBuYW1lUm9vdDogY29tcG9uZW50LnJvb3QpOwoKICAgIEJ5dGVTaW5rIGJ5dGVTaW5rID0gbmV3IEJ5dGVTaW5rKCk7CiAgICBmaW5hbCBCaW5hcnlQcmludGVyIHByaW50ZXIgPSBuZXcgQmluYXJ5UHJpbnRlcihieXRlU2luayk7CiAgICBwcmludGVyLndyaXRlQ29tcG9uZW50RmlsZShzaW5nbGVQYWNrYWdlTGlicmFyaWVzKTsKICAgIHJldHVybiBieXRlU2luay5idWlsZGVyLnRha2VCeXRlcygpOwogIH0KCiAgLy8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHVyaSBmcm9tIHRoZSBbdXJpVG9Hcm91cF0gbWFwLgogIC8vLwogIC8vLyBBbHNvIHJlbW92ZSBhbGwgdXJpcyBpbiB0aGUgZ3JvdXAgdGhlIHVyaSBiZWxvbmdzIHRvLCBhbmQgYWRkIHRoZSBncm91cCB0bwogIC8vLyB0aGUgd29ya2xpc3QuCiAgdm9pZCByZW1vdmVVcmlGcm9tTWFwKFVyaSB1cmksIFNldDxTZXJpYWxpemF0aW9uR3JvdXA+IHJlbW92ZWQsCiAgICAgIExpc3Q8U2VyaWFsaXphdGlvbkdyb3VwPiB3b3JrTGlzdCkgewogICAgU2VyaWFsaXphdGlvbkdyb3VwIGdyb3VwID0gdXJpVG9Hcm91cC5yZW1vdmUodXJpKTsKICAgIGlmIChncm91cCA9PSBudWxsKSByZXR1cm47CiAgICBib29sIGFkZGVkID0gcmVtb3ZlZC5hZGQoZ3JvdXApOwogICAgYXNzZXJ0KGFkZGVkKTsKICAgIHdvcmtMaXN0LmFkZChncm91cCk7CiAgICBmb3IgKFVyaSBncm91cFVyaSBpbiBncm91cC51cmlzKSB7CiAgICAgIFNlcmlhbGl6YXRpb25Hcm91cCBzYW1lR3JvdXAgPSB1cmlUb0dyb3VwLnJlbW92ZShncm91cFVyaSk7CiAgICAgIGFzc2VydCgoZ3JvdXBVcmkgPT0gdXJpICYmIHNhbWVHcm91cCA9PSBudWxsKSB8fAogICAgICAgICAgKGdyb3VwVXJpICE9IHVyaSAmJiBzYW1lR3JvdXAgIT0gbnVsbCkpOwogICAgfQogIH0KfQoKY2xhc3MgU2VyaWFsaXphdGlvbkdyb3VwIHsKICBmaW5hbCBMaXN0PGludD4gc2VyaWFsaXplZERhdGE7CiAgZmluYWwgU2V0PFVyaT4gdXJpczsKICBTZXQ8U2VyaWFsaXphdGlvbkdyb3VwPiBkZXBlbmRlbmNpZXM7CiAgU2V0PFNlcmlhbGl6YXRpb25Hcm91cD4gb3RoZXJzRGVwZW5kaW5nT25NZTsKCiAgU2VyaWFsaXphdGlvbkdyb3VwKHRoaXMuc2VyaWFsaXplZERhdGEsIHRoaXMudXJpcyk7CgogIC8vLyBSZWdpc3RlciB0aGUgZGVwZW5kZW5jeSB0aGF0IHRoaXMgZ3JvdXAgZGVwZW5kcyBvbiB0aGUgW290aGVyXSBvbmUuCiAgLy8vIFRoZSByZWdpc3RyYXRpb24gaXMgYmlsYXRlcmFsIHNvIHRoYXQgW290aGVyXSBpcyBhZGRlZCBhcyBhIGRlcGVuZGVuY3kgZm9yCiAgLy8vIHRoaXMsIGFuZCB0aGlzIGlzIGFkZGVkIGFzIGEgIm90aGVycyBkZXBlbmQgb24gbWUiIGZvciBbb3RoZXJdLgogIHZvaWQgcmVnaXN0ZXJEZXBlbmRlbmN5KFNlcmlhbGl6YXRpb25Hcm91cCBvdGhlcikgewogICAgZGVwZW5kZW5jaWVzID8/PSBuZXcgU2V0PFNlcmlhbGl6YXRpb25Hcm91cD4uaWRlbnRpdHkoKTsKICAgIGlmIChkZXBlbmRlbmNpZXMuYWRkKG90aGVyKSkgewogICAgICBvdGhlci5vdGhlcnNEZXBlbmRpbmdPbk1lID8/PSBuZXcgU2V0PFNlcmlhbGl6YXRpb25Hcm91cD4uaWRlbnRpdHkoKTsKICAgICAgb3RoZXIub3RoZXJzRGVwZW5kaW5nT25NZS5hZGQodGhpcyk7CiAgICB9CiAgfQp9CoFfAE5OPAEmASkBSwFGAVABKgEeMiozAVAvHR4EAVA/QyE2BgE8KyQtKBgaLCEjMic7JSs3GgwRGAoIEh0IBgFOLgpLMy5ASUwhCAE3My4yODoIEhoUBhEEAUwsMyMtAUtESkxKSzouP04lLQE0JhsGATgnATU6PS8fJSMPJggGAUoRTzUwLDobSQ87LicIBgE3TjYoKj1GCggGAUI3Ly82OBZFLAYBNS82QzgGATkYECUEAS5DLz83RRYMGAoIBhEEAT1RFx0wRUgnMAYBQgdLSU8VB0dPUE9OIhhLKzhNTU9OUSI4N01ICAYBHQQBSE0XIEIlOExHIzxIIEIKMDMIBgQBUQ83Ti0mBgQBTQ80Ti0mKCo9RgoIBgQBTE8rJSQGAU0BIywiBhUEAUkRRjYeLCMBKD84KQQBOgZRFEIrNx8lExknQjczBgQCARsiFygvATYBSlFGNj0jTCsGBAIBN3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pbmNyZW1lbnRhbF9zZXJpYWxpemVyLmRhcnRcZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMva2VybmVsX2dlbmVyYXRvcl9pbXBsLmRhcnSd7y8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gRGVmaW5lcyB0aGUgZnJvbnQtZW5kIEFQSSBmb3IgY29udmVydGluZyBzb3VyY2UgY29kZSB0byBEYXJ0IEtlcm5lbCBvYmplY3RzLgpsaWJyYXJ5IGZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9yX2ltcGw7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IENhbm9uaWNhbE5hbWUsIENvbXBvbmVudDsKCmltcG9ydCAnYmFzZS9wcm9jZXNzZWRfb3B0aW9ucy5kYXJ0JyBzaG93IFByb2Nlc3NlZE9wdGlvbnM7CgppbXBvcnQgJ2Zhc3RhL2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgppbXBvcnQgJ2Zhc3RhL2NyYXNoLmRhcnQnIHNob3cgd2l0aENyYXNoUmVwb3J0aW5nOwoKaW1wb3J0ICdmYXN0YS9kaWxsL2RpbGxfdGFyZ2V0LmRhcnQnIHNob3cgRGlsbFRhcmdldDsKCmltcG9ydCAnZmFzdGEvZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKCmltcG9ydCAnZmFzdGEva2VybmVsL2tlcm5lbF9hcGkuZGFydCc7CgppbXBvcnQgJ2Zhc3RhL2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnQnIHNob3cgS2VybmVsVGFyZ2V0OwoKaW1wb3J0ICdmYXN0YS9rZXJuZWwvdXRpbHMuZGFydCcgc2hvdyBwcmludENvbXBvbmVudFRleHQsIHNlcmlhbGl6ZUNvbXBvbmVudDsKCmltcG9ydCAnZmFzdGEva2VybmVsL3ZlcmlmaWVyLmRhcnQnIHNob3cgdmVyaWZ5Q29tcG9uZW50OwoKaW1wb3J0ICdmYXN0YS9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJ2Zhc3RhL3VyaV90cmFuc2xhdG9yLmRhcnQnIHNob3cgVXJpVHJhbnNsYXRvcjsKCmltcG9ydCAnYXBpX3Byb3RvdHlwZS9mcm9udF9lbmQuZGFydCcgc2hvdyBDb21waWxlclJlc3VsdDsKCmltcG9ydCAnYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IEZpbGVTeXN0ZW07CgovLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZQovLy8gYHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2tlcm5lbF9nZW5lcmF0b3IuZGFydGAgYW5kCi8vLyBgcGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvc3VtbWFyeV9nZW5lcmF0b3IuZGFydGAgQVBJcy4KRnV0dXJlPENvbXBpbGVyUmVzdWx0PiBnZW5lcmF0ZUtlcm5lbChQcm9jZXNzZWRPcHRpb25zIG9wdGlvbnMsCiAgICB7Ym9vbCBidWlsZFN1bW1hcnk6IGZhbHNlLAogICAgYm9vbCBidWlsZENvbXBvbmVudDogdHJ1ZSwKICAgIGJvb2wgdHJ1bmNhdGVTdW1tYXJ5OiBmYWxzZSwKICAgIGJvb2wgaW5jbHVkZU9mZnNldHM6IHRydWUsCiAgICBib29sIGluY2x1ZGVIaWVyYXJjaHlBbmRDb3JlVHlwZXM6IGZhbHNlfSkgYXN5bmMgewogIHJldHVybiBhd2FpdCBDb21waWxlckNvbnRleHQucnVuV2l0aE9wdGlvbnMob3B0aW9ucywgKF8pIGFzeW5jIHsKICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUtlcm5lbEludGVybmFsKAogICAgICAgIGJ1aWxkU3VtbWFyeTogYnVpbGRTdW1tYXJ5LAogICAgICAgIGJ1aWxkQ29tcG9uZW50OiBidWlsZENvbXBvbmVudCwKICAgICAgICB0cnVuY2F0ZVN1bW1hcnk6IHRydW5jYXRlU3VtbWFyeSwKICAgICAgICBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMsCiAgICAgICAgaW5jbHVkZUhpZXJhcmNoeUFuZENvcmVUeXBlczogaW5jbHVkZUhpZXJhcmNoeUFuZENvcmVUeXBlcyk7CiAgfSk7Cn0KCkZ1dHVyZTxDb21waWxlclJlc3VsdD4gZ2VuZXJhdGVLZXJuZWxJbnRlcm5hbCgKICAgIHtib29sIGJ1aWxkU3VtbWFyeTogZmFsc2UsCiAgICBib29sIGJ1aWxkQ29tcG9uZW50OiB0cnVlLAogICAgYm9vbCB0cnVuY2F0ZVN1bW1hcnk6IGZhbHNlLAogICAgYm9vbCBpbmNsdWRlT2Zmc2V0czogdHJ1ZSwKICAgIGJvb2wgcmV0YWluRGF0YUZvclRlc3Rpbmc6IGZhbHNlLAogICAgYm9vbCBpbmNsdWRlSGllcmFyY2h5QW5kQ29yZVR5cGVzOiBmYWxzZX0pIGFzeW5jIHsKICBQcm9jZXNzZWRPcHRpb25zIG9wdGlvbnMgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zOwogIEZpbGVTeXN0ZW0gZnMgPSBvcHRpb25zLmZpbGVTeXN0ZW07CgogIExvYWRlciBzb3VyY2VMb2FkZXI7CiAgcmV0dXJuIHdpdGhDcmFzaFJlcG9ydGluZzxDb21waWxlclJlc3VsdD4oKCkgYXN5bmMgewogICAgVXJpVHJhbnNsYXRvciB1cmlUcmFuc2xhdG9yID0gYXdhaXQgb3B0aW9ucy5nZXRVcmlUcmFuc2xhdG9yKCk7CgogICAgRGlsbFRhcmdldCBkaWxsVGFyZ2V0ID0KICAgICAgICBuZXcgRGlsbFRhcmdldChvcHRpb25zLnRpY2tlciwgdXJpVHJhbnNsYXRvciwgb3B0aW9ucy50YXJnZXQpOwoKICAgIExpc3Q8Q29tcG9uZW50PiBsb2FkZWRDb21wb25lbnRzID0gbmV3IExpc3Q8Q29tcG9uZW50PigpOwoKICAgIENvbXBvbmVudCBzZGtTdW1tYXJ5ID0gYXdhaXQgb3B0aW9ucy5sb2FkU2RrU3VtbWFyeShudWxsKTsKICAgIC8vIEJ5IHVzaW5nIHRoZSBuYW1lUm9vdCBvZiB0aGUgdGhlIHN1bW1hcnksIHdlIGVuYWJsZSBzaGFyaW5nIHRoZQogICAgLy8gc2RrU3VtbWFyeSBiZXR3ZWVuIG11bHRpcGxlIGludm9jYXRpb25zLgogICAgQ2Fub25pY2FsTmFtZSBuYW1lUm9vdCA9IHNka1N1bW1hcnk/LnJvb3QgPz8gbmV3IENhbm9uaWNhbE5hbWUucm9vdCgpOwogICAgaWYgKHNka1N1bW1hcnkgIT0gbnVsbCkgewogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoc2RrU3VtbWFyeSk7CiAgICB9CgogICAgLy8gVE9ETyhzaWdtdW5kKTogcHJvdmlkZSBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGlmIGlucHV0IHN1bW1hcmllcyBvcgogICAgLy8gbGlua2VkIGRlcGVuZGVuY2llcyB3ZXJlIGxpc3RlZCBvdXQgb2Ygb3JkZXIgKG9yIHByb3ZpZGUgbWVjaGFuaXNtIHRvCiAgICAvLyBzb3J0IHRoZW0pLgogICAgZm9yIChDb21wb25lbnQgaW5wdXRTdW1tYXJ5IGluIGF3YWl0IG9wdGlvbnMubG9hZElucHV0U3VtbWFyaWVzKG5hbWVSb290KSkgewogICAgICBsb2FkZWRDb21wb25lbnRzLmFkZChpbnB1dFN1bW1hcnkpOwogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoaW5wdXRTdW1tYXJ5KTsKICAgIH0KCiAgICAvLyBMaW5rZWQgZGVwZW5kZW5jaWVzIGFyZSBtZWFudCB0byBiZSBwYXJ0IG9mIHRoZSBjb21wb25lbnQgc28gdGhleSBhcmUgbm90CiAgICAvLyBtYXJrZWQgZXh0ZXJuYWwuCiAgICBmb3IgKENvbXBvbmVudCBkZXBlbmRlbmN5IGluIGF3YWl0IG9wdGlvbnMubG9hZExpbmtEZXBlbmRlbmNpZXMobmFtZVJvb3QpKSB7CiAgICAgIGxvYWRlZENvbXBvbmVudHMuYWRkKGRlcGVuZGVuY3kpOwogICAgICBkaWxsVGFyZ2V0LmxvYWRlci5hcHBlbmRMaWJyYXJpZXMoZGVwZW5kZW5jeSk7CiAgICB9CgogICAgYXdhaXQgZGlsbFRhcmdldC5idWlsZE91dGxpbmVzKCk7CgogICAgS2VybmVsVGFyZ2V0IGtlcm5lbFRhcmdldCA9CiAgICAgICAgbmV3IEtlcm5lbFRhcmdldChmcywgZmFsc2UsIGRpbGxUYXJnZXQsIHVyaVRyYW5zbGF0b3IpOwogICAgc291cmNlTG9hZGVyID0ga2VybmVsVGFyZ2V0LmxvYWRlcjsKICAgIGtlcm5lbFRhcmdldC5zZXRFbnRyeVBvaW50cyhvcHRpb25zLmlucHV0cyk7CiAgICBDb21wb25lbnQgc3VtbWFyeUNvbXBvbmVudCA9CiAgICAgICAgYXdhaXQga2VybmVsVGFyZ2V0LmJ1aWxkT3V0bGluZXMobmFtZVJvb3Q6IG5hbWVSb290KTsKICAgIExpc3Q8aW50PiBzdW1tYXJ5ID0gbnVsbDsKICAgIGlmIChidWlsZFN1bW1hcnkpIHsKICAgICAgaWYgKG9wdGlvbnMudmVyaWZ5KSB7CiAgICAgICAgZm9yIChMb2NhdGVkTWVzc2FnZSBlcnJvciBpbiB2ZXJpZnlDb21wb25lbnQoc3VtbWFyeUNvbXBvbmVudCkpIHsKICAgICAgICAgIG9wdGlvbnMucmVwb3J0KGVycm9yLCBTZXZlcml0eS5lcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmRlYnVnRHVtcCkgewogICAgICAgIHByaW50Q29tcG9uZW50VGV4dChzdW1tYXJ5Q29tcG9uZW50LAogICAgICAgICAgICBsaWJyYXJ5RmlsdGVyOiBrZXJuZWxUYXJnZXQuaXNTb3VyY2VMaWJyYXJ5KTsKICAgICAgfQoKICAgICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0ZWQgY29tcG9uZW50ICgidHJ1bmNhdGluZyIgb3Igbm90KS4KICAgICAgLy8KICAgICAgLy8gTm90ZTogd2UgZG9uJ3QgcGFzcyB0aGUgbGlicmFyeSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IgdG8KICAgICAgLy8gcHJlc2VydmUgdGhlIHRoZSBsaWJyYXJpZXMgcGFyZW50IHBvaW50ZXIgKGl0IHNob3VsZCBjb250aW51ZSB0byBwb2ludAogICAgICAvLyB0byB0aGUgY29tcG9uZW50IHdpdGhpbiBLZXJuZWxUYXJnZXQpLgogICAgICBDb21wb25lbnQgdHJpbW1lZFN1bW1hcnlDb21wb25lbnQgPQogICAgICAgICAgbmV3IENvbXBvbmVudChuYW1lUm9vdDogc3VtbWFyeUNvbXBvbmVudC5yb290KQogICAgICAgICAgICAuLmxpYnJhcmllcy5hZGRBbGwodHJ1bmNhdGVTdW1tYXJ5CiAgICAgICAgICAgICAgICA/IGtlcm5lbFRhcmdldC5sb2FkZXIubGlicmFyaWVzCiAgICAgICAgICAgICAgICA6IHN1bW1hcnlDb21wb25lbnQubGlicmFyaWVzKTsKICAgICAgdHJpbW1lZFN1bW1hcnlDb21wb25lbnQubWV0YWRhdGEuYWRkQWxsKHN1bW1hcnlDb21wb25lbnQubWV0YWRhdGEpOwogICAgICB0cmltbWVkU3VtbWFyeUNvbXBvbmVudC51cmlUb1NvdXJjZS5hZGRBbGwoc3VtbWFyeUNvbXBvbmVudC51cmlUb1NvdXJjZSk7CgogICAgICAvLyBBcyBkb2N1bWVudGVkLCB3ZSBvbmx5IHJ1biBvdXRsaW5lIHRyYW5zZm9ybWF0aW9ucyB3aGVuIHdlIGFyZSBidWlsZGluZwogICAgICAvLyBzdW1tYXJpZXMgd2l0aG91dCBidWlsZGluZyBhIGZ1bGwgY29tcG9uZW50IChhdCB0aGlzIHRpbWUsIHRoYXQncwogICAgICAvLyB0aGUgb25seSBuZWVkIHdlIGhhdmUgZm9yIHRoZXNlIHRyYW5zZm9ybWF0aW9ucykuCiAgICAgIGlmICghYnVpbGRDb21wb25lbnQpIHsKICAgICAgICBvcHRpb25zLnRhcmdldC5wZXJmb3JtT3V0bGluZVRyYW5zZm9ybWF0aW9ucyh0cmltbWVkU3VtbWFyeUNvbXBvbmVudCk7CiAgICAgICAgb3B0aW9ucy50aWNrZXIubG9nTXMoIlRyYW5zZm9ybWVkIG91dGxpbmUiKTsKICAgICAgfQogICAgICAvLyBEb24ndCBpbmNsdWRlIHNvdXJjZSAoYnV0IGRvIGFkZCBpdCBhYm92ZSB0byBpbmNsdWRlIGltcG9ydFVyaXMpLgogICAgICBzdW1tYXJ5ID0gc2VyaWFsaXplQ29tcG9uZW50KHRyaW1tZWRTdW1tYXJ5Q29tcG9uZW50LAogICAgICAgICAgaW5jbHVkZVNvdXJjZXM6IGZhbHNlLCBpbmNsdWRlT2Zmc2V0czogaW5jbHVkZU9mZnNldHMpOwogICAgICBvcHRpb25zLnRpY2tlci5sb2dNcygiR2VuZXJhdGVkIG91dGxpbmUiKTsKICAgIH0KCiAgICBDb21wb25lbnQgY29tcG9uZW50OwogICAgaWYgKGJ1aWxkQ29tcG9uZW50KSB7CiAgICAgIGNvbXBvbmVudCA9IGF3YWl0IGtlcm5lbFRhcmdldC5idWlsZENvbXBvbmVudCh2ZXJpZnk6IG9wdGlvbnMudmVyaWZ5KTsKICAgICAgaWYgKG9wdGlvbnMuZGVidWdEdW1wKSB7CiAgICAgICAgcHJpbnRDb21wb25lbnRUZXh0KGNvbXBvbmVudCwKICAgICAgICAgICAgbGlicmFyeUZpbHRlcjoga2VybmVsVGFyZ2V0LmlzU291cmNlTGlicmFyeSk7CiAgICAgIH0KICAgICAgb3B0aW9ucy50aWNrZXIubG9nTXMoIkdlbmVyYXRlZCBjb21wb25lbnQiKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IEludGVybmFsQ29tcGlsZXJSZXN1bHQoCiAgICAgICAgc3VtbWFyeTogc3VtbWFyeSwKICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCwKICAgICAgICBzZGtDb21wb25lbnQ6IHNka1N1bW1hcnksCiAgICAgICAgbG9hZGVkQ29tcG9uZW50czogbG9hZGVkQ29tcG9uZW50cywKICAgICAgICBjbGFzc0hpZXJhcmNoeToKICAgICAgICAgICAgaW5jbHVkZUhpZXJhcmNoeUFuZENvcmVUeXBlcyA/IGtlcm5lbFRhcmdldC5sb2FkZXIuaGllcmFyY2h5IDogbnVsbCwKICAgICAgICBjb3JlVHlwZXM6CiAgICAgICAgICAgIGluY2x1ZGVIaWVyYXJjaHlBbmRDb3JlVHlwZXMgPyBrZXJuZWxUYXJnZXQubG9hZGVyLmNvcmVUeXBlcyA6IG51bGwsCiAgICAgICAgZGVwczogbmV3IExpc3Q8VXJpPi5mcm9tKENvbXBpbGVyQ29udGV4dC5jdXJyZW50LmRlcGVuZGVuY2llcyksCiAgICAgICAga2VybmVsVGFyZ2V0Rm9yVGVzdGluZzogcmV0YWluRGF0YUZvclRlc3RpbmcgPyBrZXJuZWxUYXJnZXQgOiBudWxsKTsKICB9LCAoKSA9PiBzb3VyY2VMb2FkZXI/LmN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZyA/PyBvcHRpb25zLmlucHV0cy5maXJzdCk7Cn0KCi8vLyBSZXN1bHQgb2JqZWN0IG9mIFtnZW5lcmF0ZUtlcm5lbF0uCmNsYXNzIEludGVybmFsQ29tcGlsZXJSZXN1bHQgaW1wbGVtZW50cyBDb21waWxlclJlc3VsdCB7CiAgLy8vIFRoZSBnZW5lcmF0ZWQgc3VtbWFyeSBieXRlcywgaWYgaXQgd2FzIHJlcXVlc3RlZC4KICBmaW5hbCBMaXN0PGludD4gc3VtbWFyeTsKCiAgLy8vIFRoZSBnZW5lcmF0ZWQgY29tcG9uZW50LCBpZiBpdCB3YXMgcmVxdWVzdGVkLgogIGZpbmFsIENvbXBvbmVudCBjb21wb25lbnQ7CgogIGZpbmFsIENvbXBvbmVudCBzZGtDb21wb25lbnQ7CgogIGZpbmFsIExpc3Q8Q29tcG9uZW50PiBsb2FkZWRDb21wb25lbnRzOwoKICAvLy8gRGVwZW5kZW5jaWVzIHRyYXZlcnNlZCBieSB0aGUgY29tcGlsZXIuIFVzZWQgb25seSBmb3IgZ2VuZXJhdGluZwogIC8vLyBkZXBlbmRlbmN5IC5HTiBmaWxlcyBpbiB0aGUgZGFydC1zZGsgYnVpbGQgc3lzdGVtLgogIC8vLyBOb3RlIHRoaXMgbWlnaHQgYmUgcmVtb3ZlZCB3aGVuIHdlIHN3aXRjaCB0byBjb21wdXRlIGRlcGVuZGVuY2llcyB3aXRob3V0CiAgLy8vIHVzaW5nIHRoZSBjb21waWxlciBpdHNlbGYuCiAgZmluYWwgTGlzdDxVcmk+IGRlcHM7CgogIGZpbmFsIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5OwoKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICAvLy8gVGhlIFtLZXJuZWxUYXJnZXRdIHVzZWQgdG8gZ2VuZXJhdGVkIHRoZSBjb21wb25lbnQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25seSBwcm92aWRlZCBmb3IgdXNlIGluIHRlc3RpbmcuCiAgZmluYWwgS2VybmVsVGFyZ2V0IGtlcm5lbFRhcmdldEZvclRlc3Rpbmc7CgogIEludGVybmFsQ29tcGlsZXJSZXN1bHQoCiAgICAgIHt0aGlzLnN1bW1hcnksCiAgICAgIHRoaXMuY29tcG9uZW50LAogICAgICB0aGlzLnNka0NvbXBvbmVudCwKICAgICAgdGhpcy5sb2FkZWRDb21wb25lbnRzLAogICAgICB0aGlzLmRlcHMsCiAgICAgIHRoaXMuY2xhc3NIaWVyYXJjaHksCiAgICAgIHRoaXMuY29yZVR5cGVzLAogICAgICB0aGlzLmtlcm5lbFRhcmdldEZvclRlc3Rpbmd9KTsKfQqA0QBOTjwBUSkBIQFPAUMBPAE7ATMBNgE1AScBPAFOAToBKAE3ATsBOQEbREdAHx8hHzdDKSQoKihFBgIBLx8fIR8mNz4mARc3RAEcRwE+AT9HMEseNQYBS00TUSo3BgFRGFEoNQYBJgEgQCgxIT4eGBxKMQoIHy06CAE/CUhQMCo5LzAvSlABUUs7HU81CEs8QjEGARkaTR8mOggzBgEnGh4iLBhRE1FITU8CASc5OBsBNB0BIAEqAUc5UCEYAScBHQE6BjAtARoVFhkdERsWJQIBMHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9rZXJuZWxfZ2VuZXJhdG9yX2ltcGwuZGFydFxmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvdXRpbC9jb2xvcnMuZGFydJqiLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIFRPRE8oYWhlKTogT3JpZ2luYWxseSBjb3BpZWQgZnJvbSBzZGsvcGtnL2NvbXBpbGVyL2xpYi9zcmMvY29sb3JzLmRhcnQsCi8vIG1lcmdlIHRoZXNlIHR3byBwYWNrYWdlcy4KbGlicmFyeSBjb2xvcnM7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRW5jb2RlOwoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IFBsYXRmb3JtLCBQcm9jZXNzLCBQcm9jZXNzUmVzdWx0LCBzdGRlcnIsIHN0ZG91dDsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgZGVmYXVsdCBjb2xvcnMuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IG9wYC4KY29uc3QgU3RyaW5nIERFRkFVTFRfQ09MT1IgPSAiXHgxYlszOTs0OW0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyBibGFjayB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiAwYC4KY29uc3QgU3RyaW5nIEJMQUNLX0NPTE9SID0gIlx4MWJbMzBtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgcmVkIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDFgLgpjb25zdCBTdHJpbmcgUkVEX0NPTE9SID0gIlx4MWJbMzFtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgZ3JlZW4gdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgMmAuCmNvbnN0IFN0cmluZyBHUkVFTl9DT0xPUiA9ICJceDFiWzMybSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIHllbGxvdyB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiAzYC4KY29uc3QgU3RyaW5nIFlFTExPV19DT0xPUiA9ICJceDFiWzMzbSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIGJsdWUgdGV4dCBjb2xvci4gT3V0cHV0IGZyb20gVW5peAovLy8gY29tbWFuZC1saW5lIHByb2dyYW0gYHRwdXQgc2V0YWYgNGAuCmNvbnN0IFN0cmluZyBCTFVFX0NPTE9SID0gIlx4MWJbMzRtIjsKCi8vLyBBTlNJL3h0ZXJtIHRlcm1jYXAgZm9yIHNldHRpbmcgbWFnZW50YSB0ZXh0IGNvbG9yLiBPdXRwdXQgZnJvbSBVbml4Ci8vLyBjb21tYW5kLWxpbmUgcHJvZ3JhbSBgdHB1dCBzZXRhZiA1YC4KY29uc3QgU3RyaW5nIE1BR0VOVEFfQ09MT1IgPSAiXHgxYlszNW0iOwoKLy8vIEFOU0kveHRlcm0gdGVybWNhcCBmb3Igc2V0dGluZyBjeWFuIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDZgLgpjb25zdCBTdHJpbmcgQ1lBTl9DT0xPUiA9ICJceDFiWzM2bSI7CgovLy8gQU5TSS94dGVybSB0ZXJtY2FwIGZvciBzZXR0aW5nIHdoaXRlIHRleHQgY29sb3IuIE91dHB1dCBmcm9tIFVuaXgKLy8vIGNvbW1hbmQtbGluZSBwcm9ncmFtIGB0cHV0IHNldGFmIDdgLgpjb25zdCBTdHJpbmcgV0hJVEVfQ09MT1IgPSAiXHgxYlszN20iOwoKLy8vIEFsbCB0aGUgYWJvdmUgY29kZXMuIFRoaXMgaXMgdXNlZCB0byBjb21wYXJlIHRoZSBhYm92ZSBjb2RlcyB0byB0aGUKLy8vIHRlcm1pbmFsJ3MuIFByaW50aW5nIHRoaXMgc3RyaW5nIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBqdXN0Ci8vLyBwcmludGluZyBbREVGQVVMVF9DT0xPUl0uCmNvbnN0IFN0cmluZyBBTExfQ09ERVMgPSBCTEFDS19DT0xPUiArCiAgICBSRURfQ09MT1IgKwogICAgR1JFRU5fQ09MT1IgKwogICAgWUVMTE9XX0NPTE9SICsKICAgIEJMVUVfQ09MT1IgKwogICAgTUFHRU5UQV9DT0xPUiArCiAgICBDWUFOX0NPTE9SICsKICAgIFdISVRFX0NPTE9SICsKICAgIERFRkFVTFRfQ09MT1I7Cgpjb25zdCBTdHJpbmcgVEVSTUlOQUxfQ0FQQUJJTElUSUVTID0gIiIiCmNvbG9ycwpzZXRhZiAwCnNldGFmIDEKc2V0YWYgMgpzZXRhZiAzCnNldGFmIDQKc2V0YWYgNQpzZXRhZiA2CnNldGFmIDcKb3AKIiIiOwoKLy8vIEJvb2xlYW4gdmFsdWUgY2FjaGluZyB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgZGlzcGxheSBBTlNJIGNvbG9ycy4KLy8vCi8vLyBJZiBgbnVsbGAsIHdlIGhhdmVuJ3QgZGVjaWRlZCB3aGV0aGVyIHdlIHNob3VsZCBkaXNwbGF5IEFOU0kgY29sb3JzIG9yIG5vdC4KYm9vbCBfZW5hYmxlQ29sb3JzOwoKLy8vIEZpbmRzIG91dCB3aGV0aGVyIHdlIGFyZSBkaXNwbGF5aW5nIEFOU0kgY29sb3JzLgovLy8KLy8vIFRoZSBmaXJzdCB0aW1lIHRoaXMgZ2V0dGVyIGlzIGludm9rZWQgKGVpdGhlciBieSBhIGNsaWVudCBvciBieSBhbiBhdHRlbXB0Ci8vLyB0byB1c2UgYSBjb2xvciksIGl0IGRlY2lkZXMgd2hldGhlciBjb2xvcnMgc2hvdWxkIGJlIHVzZWQgYmFzZWQgb24gdGhlCi8vLyBsb2dpYyBpbiBbX2NvbXB1dGVFbmFibGVDb2xvcnNdICh1bmxlc3MgYSB2YWx1ZSBoYXMgcHJldmlvdXNseSBiZWVuIHNldCkuCmJvb2wgZ2V0IGVuYWJsZUNvbG9ycyA9PiBfZW5hYmxlQ29sb3JzID8/PSBfY29tcHV0ZUVuYWJsZUNvbG9ycygpOwoKLy8vIEFsbG93cyB0aGUgY2xpZW50IHRvIG92ZXJyaWRlIHRoZSBkZWNpc2lvbiBvZiB3aGV0aGVyIHRvIGRpc2FibGUgQU5TSQovLy8gY29sb3JzLgp2b2lkIHNldCBlbmFibGVDb2xvcnMoYm9vbCB2YWx1ZSkgewogIGFzc2VydCh2YWx1ZSAhPSBudWxsKTsKICBfZW5hYmxlQ29sb3JzID0gdmFsdWU7Cn0KClN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIFN0cmluZyBjb2xvcikgewogIHJldHVybiBlbmFibGVDb2xvcnMgPyAiJHtjb2xvcn0kc3RyaW5nJHtERUZBVUxUX0NPTE9SfSIgOiBzdHJpbmc7Cn0KClN0cmluZyBibGFjayhTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgQkxBQ0tfQ09MT1IpOwpTdHJpbmcgcmVkKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBSRURfQ09MT1IpOwpTdHJpbmcgZ3JlZW4oU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEdSRUVOX0NPTE9SKTsKU3RyaW5nIHllbGxvdyhTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgWUVMTE9XX0NPTE9SKTsKU3RyaW5nIGJsdWUoU3RyaW5nIHN0cmluZykgPT4gd3JhcChzdHJpbmcsIEJMVUVfQ09MT1IpOwpTdHJpbmcgbWFnZW50YShTdHJpbmcgc3RyaW5nKSA9PiB3cmFwKHN0cmluZywgTUFHRU5UQV9DT0xPUik7ClN0cmluZyBjeWFuKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBDWUFOX0NPTE9SKTsKU3RyaW5nIHdoaXRlKFN0cmluZyBzdHJpbmcpID0+IHdyYXAoc3RyaW5nLCBXSElURV9DT0xPUik7CgovLy8gUmV0dXJucyB3aGV0aGVyIFtzaW5rXSBzdXBwb3J0cyBBTlNJIGVzY2FwZXMgb3IgYG51bGxgIGlmIGl0IGNvdWxkIG5vdCBiZQovLy8gZGV0ZXJtaW5lZC4KYm9vbCBfc3VwcG9ydHNBbnNpRXNjYXBlcyhzaW5rKSB7CiAgdHJ5IHsKICAgIC8vIGlnbm9yZTogdW5kZWZpbmVkX2dldHRlcgogICAgcmV0dXJuIHNpbmsuc3VwcG9ydHNBbnNpRXNjYXBlczsKICB9IG9uIE5vU3VjaE1ldGhvZEVycm9yIHsKICAgIC8vIElnbm9yZWQ6IFdlJ3JlIHJ1bm5pbmcgb24gYW4gb2xkZXIgdmVyc2lvbiBvZiB0aGUgRGFydCBWTSB3aGljaCBkb2Vzbid0CiAgICAvLyBpbXBsZW1lbnQgYHN1cHBvcnRzQW5zaUVzY2FwZXNgLgogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLy8gQ2FsbGJhY2sgdXNlZCBieSBbX2NvbXB1dGVFbmFibGVDb2xvcnNdIHRvIHJlcG9ydCB3aHkgaXQgaGFzIG9yIGhhc24ndAovLy8gY2hvc2VuIHRvIHVzZSBBTlNJIGNvbG9ycy4Kdm9pZCBGdW5jdGlvbihTdHJpbmcpIHByaW50RW5hYmxlQ29sb3JzUmVhc29uID0gKF8pIHt9OwoKLy8vIFRydWUgaWYgd2Ugc2hvdWxkIGVuYWJsZSBjb2xvcnMgaW4gb3V0cHV0LgovLy8KLy8vIFdlIGVuYWJsZSBjb2xvcnMgd2hlbiBib3RoIGBzdGRvdXRgIGFuZCBgc3RkZXJyYCBzdXBwb3J0IEFOU0kgZXNjYXBlcy4KLy8vCi8vLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHRoaXMgZnVuY3Rpb25zIGNoZWNrcyB0aGUgdGVybWluYWwgY2FwYWJpbGl0aWVzLAovLy8gb24gV2luZG93cyB3ZSBvbmx5IGVuYWJsZSBjb2xvcnMgaWYgdGhlIFZNIGdldHRlcnMgYXJlIHByZXNlbnQgYW5kIHJldHVybmVkCi8vLyBgdHJ1ZWAuCi8vLwovLy8gTm90ZTogZG8gbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHksIGFzIGl0IGlzIGV4cGVuc2l2ZSB0bwovLy8gY29tcHV0ZS4gSW5zdGVhZCwgdXNlIFtDb21waWxlckNvbnRleHQuZW5hYmxlQ29sb3JzXS4KYm9vbCBfY29tcHV0ZUVuYWJsZUNvbG9ycygpIHsKICBib29sIHN0ZGVyclN1cHBvcnRzQ29sb3JzID0gX3N1cHBvcnRzQW5zaUVzY2FwZXMoc3Rkb3V0KTsKICBib29sIHN0ZG91dFN1cHBvcnRzQ29sb3JzID0gX3N1cHBvcnRzQW5zaUVzY2FwZXMoc3RkZXJyKTsKCiAgaWYgKHN0ZG91dFN1cHBvcnRzQ29sb3JzID09IGZhbHNlKSB7CiAgICBwcmludEVuYWJsZUNvbG9yc1JlYXNvbigKICAgICAgICAiTm90IGVuYWJsaW5nIGNvbG9ycywgc3Rkb3V0IGRvZXMgbm90IHN1cHBvcnQgQU5TSSBjb2xvcnMuIik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmIChzdGRlcnJTdXBwb3J0c0NvbG9ycyA9PSBmYWxzZSkgewogICAgcHJpbnRFbmFibGVDb2xvcnNSZWFzb24oCiAgICAgICAgIk5vdCBlbmFibGluZyBjb2xvcnMsIHN0ZGVyciBkb2VzIG5vdCBzdXBwb3J0IEFOU0kgY29sb3JzLiIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgaWYgKHN0ZGVyclN1cHBvcnRzQ29sb3JzICE9IHRydWUgfHwgc3Rkb3V0U3VwcG9ydHNDb2xvcnMgIT0gdHJ1ZSkgewogICAgICAvLyBJbiB0aGlzIGNhc2UsIGVpdGhlciBbc3Rkb3V0XSBvciBbc3RkZXJyXSBkaWQgbm90IHN1cHBvcnQgdGhlCiAgICAgIC8vIHByb3BlcnR5IGBzdXBwb3J0c0Fuc2lFc2NhcGVzYC4gU2luY2Ugd2UgZG8gbm90IGhhdmUgYW5vdGhlciB3YXkKICAgICAgLy8gdG8gZGV0ZXJtaW5lIHN1cHBvcnQgZm9yIGNvbG9ycywgd2UgZGlzYWJsZSB0aGVtLgogICAgICBwcmludEVuYWJsZUNvbG9yc1JlYXNvbigiTm90IGVuYWJsaW5nIGNvbG9ycyBhcyBBTlNJIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHByaW50RW5hYmxlQ29sb3JzUmVhc29uKCJFbmFibGluZyBjb2xvcnMgYXMgT1MgaXMgV2luZG93cy4iKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8gV2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgdGVybWluYWwgYWN0dWFsbHkgc3VwcG9ydHMgY29sb3JzLiBDdXJyZW50bHksCiAgLy8gdG8gYXZvaWQgbGlua2luZyB0aGUgRGFydCBWTSB3aXRoIG5jdXJzZXMsIEFOU0kgZXNjYXBlIHN1cHBvcnQgaXMgcmVkdWNlZAogIC8vIHRvIGBQbGF0Zm9ybS5lbnZpcm9ubWVudFsnVEVSTSddLmNvbnRhaW5zKCJ4dGVybSIpYC4KCiAgLy8gVGhlIGAtU2Agb3B0aW9uIG9mIGB0cHV0YCBhbGxvd3MgdXMgdG8gcXVlcnkgbXVsdGlwbGUgY2FwYWJpbGl0aWVzIGF0CiAgLy8gb25jZS4KICBQcm9jZXNzUmVzdWx0IHJlc3VsdCA9IFByb2Nlc3MucnVuU3luYygKICAgICAgIi9iaW4vc2giLCBbIi1jIiwgInByaW50ZiAnJXMnICckVEVSTUlOQUxfQ0FQQUJJTElUSUVTJyB8IHRwdXQgLVMiXSk7CgogIGlmIChyZXN1bHQuZXhpdENvZGUgIT0gMCkgewogICAgcHJpbnRFbmFibGVDb2xvcnNSZWFzb24oIk5vdCBlbmFibGluZyBjb2xvcnMsIHJ1bm5pbmcgdHB1dCBmYWlsZWQuIik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBMaXN0PFN0cmluZz4gbGluZXMgPSByZXN1bHQuc3Rkb3V0LnNwbGl0KCJcbiIpOwoKICBpZiAobGluZXMubGVuZ3RoICE9IDIpIHsKICAgIHByaW50RW5hYmxlQ29sb3JzUmVhc29uKCJOb3QgZW5hYmxpbmcgY29sb3JzLCB1bmV4cGVjdGVkIG91dHB1dCBmcm9tIHRwdXQ6ICIKICAgICAgICAiJHtqc29uRW5jb2RlKHJlc3VsdC5zdGRvdXQpfS4iKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBudW1iZXJPZkNvbG9ycyA9IGxpbmVzWzBdOwogIGlmICgoaW50LnRyeVBhcnNlKG51bWJlck9mQ29sb3JzKSA/PyAtMSkgPCA4KSB7CiAgICBwcmludEVuYWJsZUNvbG9yc1JlYXNvbigKICAgICAgICAiTm90IGVuYWJsaW5nIGNvbG9ycywgbGVzcyB0aGFuIDggY29sb3JzIHN1cHBvcnRlZDogIgogICAgICAgICIke2pzb25FbmNvZGUobnVtYmVyT2ZDb2xvcnMpfS4iKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyBhbGxDb2RlcyA9IGxpbmVzWzFdLnRyaW0oKTsKICBpZiAoQUxMX0NPREVTICE9IGFsbENvZGVzKSB7CiAgICBwcmludEVuYWJsZUNvbG9yc1JlYXNvbigiTm90IGVuYWJsaW5nIGNvbG9ycywgY29sb3IgY29kZXMgZG9uJ3QgbWF0Y2g6ICIKICAgICAgICAiJHtqc29uRW5jb2RlKEFMTF9DT0RFUyl9ICE9ICR7anNvbkVuY29kZShhbGxDb2Rlcyl9LiIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgcHJpbnRFbmFibGVDb2xvcnNSZWFzb24oIkVuYWJsaW5nIGNvbG9ycy4iKTsKICByZXR1cm4gdHJ1ZTsKfQqAygBOTjwBSx0QAScBSAFEJCwBRiknAUQpJQFGKScBRykoAUUpJgFIKSkBRSkmAUYpJwFISR4nEBITERQREhMBKQcICAgICAgICAMFAUgEUBQBNQRPS05DAUoMJBkZAgErRAIBOjY6PDg+ODoBThAiCCAlG08oEQQCAUsfOAEvBEsET1AMBEI6Hjw8AScdRhIEJx1GEgQBHEhHSjtQFAZCEQQBS086AUsLKkwBHkoSBAEyARtRKhIEASQyHT4rEgQBJR9NQRIEAS8PAgEwcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy91dGlsL2NvbG9ycy5kYXJ0VmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0wAFZaC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmFzdF9mcm9tX2JpbmFyeTsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDpkZXZlbG9wZXInOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKaW1wb3J0ICcuLi90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydCc7CmltcG9ydCAndGFnLmRhcnQnOwoKY2xhc3MgUGFyc2VFcnJvciB7CiAgU3RyaW5nIGZpbGVuYW1lOwogIGludCBieXRlSW5kZXg7CiAgU3RyaW5nIG1lc3NhZ2U7CiAgU3RyaW5nIHBhdGg7CgogIFBhcnNlRXJyb3IodGhpcy5tZXNzYWdlLCB7dGhpcy5maWxlbmFtZSwgdGhpcy5ieXRlSW5kZXgsIHRoaXMucGF0aH0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGZpbGVuYW1lOiRieXRlSW5kZXg6ICRtZXNzYWdlIGF0ICRwYXRoJzsKfQoKY2xhc3MgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvciB7CiAgZmluYWwgaW50IHZlcnNpb247CgogIEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IodGhpcy52ZXJzaW9uKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICdVbmV4cGVjdGVkIEtlcm5lbCB2ZXJzaW9uICR7dmVyc2lvbn0gJwogICAgICAgICcoZXhwZWN0ZWQgJHtUYWcuQmluYXJ5Rm9ybWF0VmVyc2lvbn0pLic7CiAgfQp9CgpjbGFzcyBDYW5vbmljYWxOYW1lRXJyb3IgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICBDYW5vbmljYWxOYW1lRXJyb3IodGhpcy5tZXNzYWdlKTsKfQoKY2xhc3MgQ2Fub25pY2FsTmFtZVNka0Vycm9yIGV4dGVuZHMgQ2Fub25pY2FsTmFtZUVycm9yIHsKICBDYW5vbmljYWxOYW1lU2RrRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIDogc3VwZXIobWVzc2FnZSk7Cn0KCmNsYXNzIF9Db21wb25lbnRJbmRleCB7CiAgc3RhdGljIGNvbnN0IG51bWJlck9mRml4ZWRGaWVsZHMgPSA5OwoKICBpbnQgYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGU7CiAgaW50IGJpbmFyeU9mZnNldEZvckNhbm9uaWNhbE5hbWVzOwogIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzOwogIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YU1hcHBpbmdzOwogIGludCBiaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZTsKICBpbnQgYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZTsKICBpbnQgbWFpbk1ldGhvZFJlZmVyZW5jZTsKICBMaXN0PGludD4gbGlicmFyeU9mZnNldHM7CiAgaW50IGxpYnJhcnlDb3VudDsKICBpbnQgY29tcG9uZW50RmlsZVNpemVJbkJ5dGVzOwp9CgpjbGFzcyBTdWJDb21wb25lbnRWaWV3IHsKICBmaW5hbCBMaXN0PExpYnJhcnk+IGxpYnJhcmllczsKICBmaW5hbCBpbnQgY29tcG9uZW50U3RhcnRPZmZzZXQ7CiAgZmluYWwgaW50IGNvbXBvbmVudEZpbGVTaXplOwoKICBTdWJDb21wb25lbnRWaWV3KAogICAgICB0aGlzLmxpYnJhcmllcywgdGhpcy5jb21wb25lbnRTdGFydE9mZnNldCwgdGhpcy5jb21wb25lbnRGaWxlU2l6ZSk7Cn0KCmNsYXNzIEJpbmFyeUJ1aWxkZXIgewogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVTdGFjayA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogIGZpbmFsIExpc3Q8TGFiZWxlZFN0YXRlbWVudD4gbGFiZWxTdGFjayA9IDxMYWJlbGVkU3RhdGVtZW50PltdOwogIGludCBsYWJlbFN0YWNrQmFzZSA9IDA7CiAgaW50IHN3aXRjaENhc2VTdGFja0Jhc2UgPSAwOwogIGZpbmFsIExpc3Q8U3dpdGNoQ2FzZT4gc3dpdGNoQ2FzZVN0YWNrID0gPFN3aXRjaENhc2U+W107CiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyU3RhY2sgPSA8VHlwZVBhcmFtZXRlcj5bXTsKICBmaW5hbCBTdHJpbmcgZmlsZW5hbWU7CiAgZmluYWwgTGlzdDxpbnQ+IF9ieXRlczsKICBpbnQgX2J5dGVPZmZzZXQgPSAwOwogIGZpbmFsIExpc3Q8U3RyaW5nPiBfc3RyaW5nVGFibGUgPSA8U3RyaW5nPltdOwogIGZpbmFsIExpc3Q8VXJpPiBfc291cmNlVXJpVGFibGUgPSA8VXJpPltdOwogIE1hcDxpbnQsIENvbnN0YW50PiBfY29uc3RhbnRUYWJsZSA9IDxpbnQsIENvbnN0YW50Pnt9OwogIExpc3Q8Q2Fub25pY2FsTmFtZT4gX2xpbmtUYWJsZTsKICBpbnQgX3RyYW5zZm9ybWVyRmxhZ3MgPSAwOwogIExpYnJhcnkgX2N1cnJlbnRMaWJyYXJ5OwogIGludCBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSAwOwoKICAvLyBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgdGhpcyBsaXN0IHNob3VsZCBpbmRpY2F0ZSB3aGF0IGxpYnJhcnksCiAgLy8gY2xhc3MsIGFuZCBtZW1iZXIgd2FzIGJlaW5nIGJ1aWx0LgogIExpc3Q8U3RyaW5nPiBkZWJ1Z1BhdGggPSA8U3RyaW5nPltdOwoKICBmaW5hbCBib29sIGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXM7CgogIC8vLyBJZiBiaW5hcnkgY29udGFpbnMgbWV0YWRhdGEgc2VjdGlvbiB3aXRoIHBheWxvYWRzIHJlZmVyZW5jaW5nIG90aGVyIG5vZGVzCiAgLy8vIHN1Y2ggS2VybmVsIGJpbmFyeSBjYW4ndCBiZSByZWFkIGxhemlseSBiZWNhdXNlIG1ldGFkYXRhIGNyb3NzIHJlZmVyZW5jZXMKICAvLy8gd2lsbCBub3QgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LgogIGJvb2wgX2Rpc2FibGVMYXp5UmVhZGluZyA9IGZhbHNlOwoKICAvLy8gSWYgYmluYXJ5IGNvbnRhaW5zIG1ldGFkYXRhIHNlY3Rpb24gd2l0aCBwYXlsb2FkcyByZWZlcmVuY2luZyBvdGhlciBub2RlcwogIC8vLyBzdWNoIEtlcm5lbCBiaW5hcnkgY2FuJ3QgYmUgcmVhZCBsYXppbHkgYmVjYXVzZSBtZXRhZGF0YSBjcm9zcyByZWZlcmVuY2VzCiAgLy8vIHdpbGwgbm90IGJlIHJlc29sdmVkIGNvcnJlY3RseS4KICBib29sIF9kaXNhYmxlTGF6eUNsYXNzUmVhZGluZyA9IGZhbHNlOwoKICAvLy8gTm90ZSB0aGF0IFtkaXNhYmxlTGF6eUNsYXNzUmVhZGluZ10gaXMgaW5jb21wYXRpYmxlCiAgLy8vIHdpdGggY2hlY2tDYW5vbmljYWxOYW1lcyBvbiByZWFkQ29tcG9uZW50LgogIEJpbmFyeUJ1aWxkZXIodGhpcy5fYnl0ZXMsCiAgICAgIHt0aGlzLmZpbGVuYW1lLAogICAgICBib29sIGRpc2FibGVMYXp5UmVhZGluZyA9IGZhbHNlLAogICAgICBib29sIGRpc2FibGVMYXp5Q2xhc3NSZWFkaW5nID0gZmFsc2UsCiAgICAgIGJvb2wgYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2Rlc30pCiAgICAgIDogX2Rpc2FibGVMYXp5UmVhZGluZyA9IGRpc2FibGVMYXp5UmVhZGluZywKICAgICAgICBfZGlzYWJsZUxhenlDbGFzc1JlYWRpbmcgPQogICAgICAgICAgICBkaXNhYmxlTGF6eVJlYWRpbmcgfHwgZGlzYWJsZUxhenlDbGFzc1JlYWRpbmcsCiAgICAgICAgdGhpcy5hbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzID0gYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcyA/PyBmYWxzZTsKCiAgZmFpbChTdHJpbmcgbWVzc2FnZSkgewogICAgdGhyb3cgUGFyc2VFcnJvcihtZXNzYWdlLAogICAgICAgIGJ5dGVJbmRleDogX2J5dGVPZmZzZXQsIGZpbGVuYW1lOiBmaWxlbmFtZSwgcGF0aDogZGVidWdQYXRoLmpvaW4oJzo6JykpOwogIH0KCiAgaW50IGdldCBieXRlT2Zmc2V0ID0+IF9ieXRlT2Zmc2V0OwoKICBpbnQgcmVhZEJ5dGUoKSA9PiBfYnl0ZXNbX2J5dGVPZmZzZXQrK107CgogIGludCByZWFkVUludCgpIHsKICAgIHZhciBieXRlID0gcmVhZEJ5dGUoKTsKICAgIGlmIChieXRlICYgMHg4MCA9PSAwKSB7CiAgICAgIC8vIDB4eHh4eHh4CiAgICAgIHJldHVybiBieXRlOwogICAgfSBlbHNlIGlmIChieXRlICYgMHg0MCA9PSAwKSB7CiAgICAgIC8vIDEweHh4eHh4CiAgICAgIHJldHVybiAoKGJ5dGUgJiAweDNGKSA8PCA4KSB8IHJlYWRCeXRlKCk7CiAgICB9IGVsc2UgewogICAgICAvLyAxMXh4eHh4eAogICAgICByZXR1cm4gKChieXRlICYgMHgzRikgPDwgMjQpIHwKICAgICAgICAgIChyZWFkQnl0ZSgpIDw8IDE2KSB8CiAgICAgICAgICAocmVhZEJ5dGUoKSA8PCA4KSB8CiAgICAgICAgICByZWFkQnl0ZSgpOwogICAgfQogIH0KCiAgaW50IHJlYWRVaW50MzIoKSB7CiAgICByZXR1cm4gKHJlYWRCeXRlKCkgPDwgMjQpIHwKICAgICAgICAocmVhZEJ5dGUoKSA8PCAxNikgfAogICAgICAgIChyZWFkQnl0ZSgpIDw8IDgpIHwKICAgICAgICByZWFkQnl0ZSgpOwogIH0KCiAgZmluYWwgRmxvYXQ2NExpc3QgX2RvdWJsZUJ1ZmZlciA9IG5ldyBGbG9hdDY0TGlzdCgxKTsKICBVaW50OExpc3QgX2RvdWJsZUJ1ZmZlclVpbnQ4OwoKICBkb3VibGUgcmVhZERvdWJsZSgpIHsKICAgIF9kb3VibGVCdWZmZXJVaW50OCA/Pz0gX2RvdWJsZUJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFswXSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbMV0gPSByZWFkQnl0ZSgpOwogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzJdID0gcmVhZEJ5dGUoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFszXSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbNF0gPSByZWFkQnl0ZSgpOwogICAgX2RvdWJsZUJ1ZmZlclVpbnQ4WzVdID0gcmVhZEJ5dGUoKTsKICAgIF9kb3VibGVCdWZmZXJVaW50OFs2XSA9IHJlYWRCeXRlKCk7CiAgICBfZG91YmxlQnVmZmVyVWludDhbN10gPSByZWFkQnl0ZSgpOwogICAgcmV0dXJuIF9kb3VibGVCdWZmZXJbMF07CiAgfQoKICBMaXN0PGludD4gcmVhZEJ5dGVzKGludCBsZW5ndGgpIHsKICAgIExpc3Q8aW50PiBieXRlcyA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICAgIGJ5dGVzLnNldFJhbmdlKDAsIGJ5dGVzLmxlbmd0aCwgX2J5dGVzLCBfYnl0ZU9mZnNldCk7CiAgICBfYnl0ZU9mZnNldCArPSBieXRlcy5sZW5ndGg7CiAgICByZXR1cm4gYnl0ZXM7CiAgfQoKICBMaXN0PGludD4gcmVhZEJ5dGVMaXN0KCkgewogICAgcmV0dXJuIHJlYWRCeXRlcyhyZWFkVUludCgpKTsKICB9CgogIFN0cmluZyByZWFkU3RyaW5nRW50cnkoaW50IG51bUJ5dGVzKSB7CiAgICAvLyBVdGY4RGVjb2RlciB3aWxsIHNraXAgbGVhZGluZyBCT00gY2hhcmFjdGVycywgYnV0IHdlIG11c3QgcHJlc2VydmUgdGhlbS4KICAgIC8vIENvbGxlY3QgbGVhZGluZyBCT01zIGJlZm9yZSBwYXNzaW5nIHRoZSBieXRlcyBvbnRvIFV0ZjhEZWNvZGVyLgogICAgaW50IG51bUJ5dGVPcmRlck1hcmtzID0gMDsKICAgIHdoaWxlIChfYnl0ZU9mZnNldCArIDIgPCBfYnl0ZXMubGVuZ3RoICYmCiAgICAgICAgX2J5dGVzW19ieXRlT2Zmc2V0XSA9PSAweGVmICYmCiAgICAgICAgX2J5dGVzW19ieXRlT2Zmc2V0ICsgMV0gPT0gMHhiYiAmJgogICAgICAgIF9ieXRlc1tfYnl0ZU9mZnNldCArIDJdID09IDB4YmYpIHsKICAgICAgKytudW1CeXRlT3JkZXJNYXJrczsKICAgICAgX2J5dGVPZmZzZXQgKz0gMzsKICAgICAgbnVtQnl0ZXMgLT0gMzsKICAgIH0KICAgIFN0cmluZyBzdHJpbmcgPSBjb25zdCBVdGY4RGVjb2RlcigpCiAgICAgICAgLmNvbnZlcnQoX2J5dGVzLCBfYnl0ZU9mZnNldCwgX2J5dGVPZmZzZXQgKyBudW1CeXRlcyk7CiAgICBfYnl0ZU9mZnNldCArPSBudW1CeXRlczsKICAgIGlmIChudW1CeXRlT3JkZXJNYXJrcyA+IDApIHsKICAgICAgcmV0dXJuICdcdWZlZmYnICogbnVtQnl0ZU9yZGVyTWFya3MgKyBzdHJpbmc7CiAgICB9CiAgICByZXR1cm4gc3RyaW5nOwogIH0KCiAgLy8vIFJlYWQgbWV0YWRhdGFNYXBwaW5ncyBzZWN0aW9uIGZyb20gdGhlIGJpbmFyeS4KICB2b2lkIF9yZWFkTWV0YWRhdGFNYXBwaW5ncygKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpIHsKICAgIC8vIERlZmF1bHQgcmVhZGVyIGlnbm9yZXMgbWV0YWRhdGEgc2VjdGlvbiBlbnRpcmVseS4KICB9CgogIC8vLyBSZWFkcyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIFtub2RlXS4KICBOb2RlIF9hc3NvY2lhdGVNZXRhZGF0YShOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICAvLyBEZWZhdWx0IHJlYWRlciBpZ25vcmVzIG1ldGFkYXRhIHNlY3Rpb24gZW50aXJlbHkuCiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZvaWQgcmVhZFN0cmluZ1RhYmxlKExpc3Q8U3RyaW5nPiB0YWJsZSkgewogICAgLy8gUmVhZCB0aGUgdGFibGUgb2YgZW5kIG9mZnNldHMuCiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8aW50PiBlbmRPZmZzZXRzID0gbmV3IExpc3Q8aW50PihsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBlbmRPZmZzZXRzW2ldID0gcmVhZFVJbnQoKTsKICAgIH0KICAgIC8vIFJlYWQgdGhlIFVURi04IGVuY29kZWQgc3RyaW5ncy4KICAgIHRhYmxlLmxlbmd0aCA9IGxlbmd0aDsKICAgIGludCBzdGFydE9mZnNldCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHRhYmxlW2ldID0gcmVhZFN0cmluZ0VudHJ5KGVuZE9mZnNldHNbaV0gLSBzdGFydE9mZnNldCk7CiAgICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0c1tpXTsKICAgIH0KICB9CgogIHZvaWQgcmVhZENvbnN0YW50VGFibGUoKSB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGZpbmFsIGludCBzdGFydE9mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIF9jb25zdGFudFRhYmxlW2J5dGVPZmZzZXQgLSBzdGFydE9mZnNldF0gPSByZWFkQ29uc3RhbnRUYWJsZUVudHJ5KCk7CiAgICB9CiAgfQoKICBDb25zdGFudCByZWFkQ29uc3RhbnRUYWJsZUVudHJ5KCkgewogICAgZmluYWwgaW50IGNvbnN0YW50VGFnID0gcmVhZEJ5dGUoKTsKICAgIHN3aXRjaCAoY29uc3RhbnRUYWcpIHsKICAgICAgY2FzZSBDb25zdGFudFRhZy5OdWxsQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBOdWxsQ29uc3RhbnQoKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5Cb29sQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBCb29sQ29uc3RhbnQocmVhZEJ5dGUoKSA9PSAxKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5JbnRDb25zdGFudDoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KChyZWFkRXhwcmVzc2lvbigpIGFzIEludExpdGVyYWwpLnZhbHVlKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5Eb3VibGVDb25zdGFudDoKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHJlYWREb3VibGUoKSk7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcuU3RyaW5nQ29uc3RhbnQ6CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudChyZWFkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlN5bWJvbENvbnN0YW50OgogICAgICAgIFJlZmVyZW5jZSBsaWJyYXJ5UmVmZXJlbmNlID0gcmVhZExpYnJhcnlSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgICAgICByZXR1cm4gbmV3IFN5bWJvbENvbnN0YW50KHJlYWRTdHJpbmdSZWZlcmVuY2UoKSwgbGlicmFyeVJlZmVyZW5jZSk7CiAgICAgIGNhc2UgQ29uc3RhbnRUYWcuTWFwQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUga2V5VHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIERhcnRUeXBlIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4gZW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50TWFwRW50cnk+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBrZXkgPSByZWFkQ29uc3RhbnRSZWZlcmVuY2UoKTsKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHZhbHVlID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCk7CiAgICAgICAgICBlbnRyaWVzW2ldID0gbmV3IENvbnN0YW50TWFwRW50cnkoa2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgTWFwQ29uc3RhbnQoa2V5VHlwZSwgdmFsdWVUeXBlLCBlbnRyaWVzKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5MaXN0Q29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICAgICAgZmluYWwgTGlzdDxDb25zdGFudD4gZW50cmllcyA9CiAgICAgICAgICAgIG5ldyBMaXN0PENvbnN0YW50Pi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgZW50cmllc1tpXSA9IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IExpc3RDb25zdGFudCh0eXBlQXJndW1lbnQsIGVudHJpZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlNldENvbnN0YW50OgogICAgICAgIGZpbmFsIERhcnRUeXBlIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxDb25zdGFudD4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGVudHJpZXNbaV0gPSByZWFkQ29uc3RhbnRSZWZlcmVuY2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBTZXRDb25zdGFudCh0eXBlQXJndW1lbnQsIGVudHJpZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLkluc3RhbmNlQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlID0gcmVhZENsYXNzUmVmZXJlbmNlKCk7CiAgICAgICAgZmluYWwgaW50IHR5cGVBcmd1bWVudENvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlQXJndW1lbnRDb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50Q291bnQ7IGkrKykgewogICAgICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbCBpbnQgZmllbGRWYWx1ZUNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBDb25zdGFudD4gZmllbGRWYWx1ZXMgPSA8UmVmZXJlbmNlLCBDb25zdGFudD57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkVmFsdWVDb3VudDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBSZWZlcmVuY2UgZmllbGRSZWYgPQogICAgICAgICAgICAgIHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCkuZ2V0UmVmZXJlbmNlKCk7CiAgICAgICAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpOwogICAgICAgICAgZmllbGRWYWx1ZXNbZmllbGRSZWZdID0gY29uc3RhbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VDb25zdGFudChjbGFzc1JlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgdGVhck9mZkNvbnN0YW50ID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCkgYXMgVGVhck9mZkNvbnN0YW50OwogICAgICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgICAgIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KGxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgdHlwZXNbaV0gPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KHRlYXJPZmZDb25zdGFudCwgdHlwZXMpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlRlYXJPZmZDb25zdGFudDoKICAgICAgICBmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKS5nZXRSZWZlcmVuY2UoKTsKICAgICAgICByZXR1cm4gbmV3IFRlYXJPZmZDb25zdGFudC5ieVJlZmVyZW5jZShyZWZlcmVuY2UpOwogICAgICBjYXNlIENvbnN0YW50VGFnLlR5cGVMaXRlcmFsQ29uc3RhbnQ6CiAgICAgICAgZmluYWwgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgVHlwZUxpdGVyYWxDb25zdGFudCh0eXBlKTsKICAgICAgY2FzZSBDb25zdGFudFRhZy5VbmV2YWx1YXRlZENvbnN0YW50OgogICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIG5ldyBVbmV2YWx1YXRlZENvbnN0YW50KGV4cHJlc3Npb24pOwogICAgfQoKICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgY29uc3RhbnQgdGFnOiAkY29uc3RhbnRUYWcnKTsKICB9CgogIENvbnN0YW50IHJlYWRDb25zdGFudFJlZmVyZW5jZSgpIHsKICAgIGZpbmFsIGludCBvZmZzZXQgPSByZWFkVUludCgpOwogICAgQ29uc3RhbnQgY29uc3RhbnQgPSBfY29uc3RhbnRUYWJsZVtvZmZzZXRdOwogICAgYXNzZXJ0KGNvbnN0YW50ICE9IG51bGwpOwogICAgcmV0dXJuIGNvbnN0YW50OwogIH0KCiAgVXJpIHJlYWRVcmlSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gX3NvdXJjZVVyaVRhYmxlW3JlYWRVSW50KCldOwogIH0KCiAgU3RyaW5nIHJlYWRTdHJpbmdSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gX3N0cmluZ1RhYmxlW3JlYWRVSW50KCldOwogIH0KCiAgTGlzdDxTdHJpbmc+IHJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IExpc3Q8U3RyaW5nPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRTdHJpbmdSZWZlcmVuY2UoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdHJpbmcgcmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKSB7CiAgICB2YXIgc3RyaW5nID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgcmV0dXJuIHN0cmluZy5pc0VtcHR5ID8gbnVsbCA6IHN0cmluZzsKICB9CgogIGJvb2wgcmVhZEFuZENoZWNrT3B0aW9uVGFnKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBpZiAodGFnID09IFRhZy5Ob3RoaW5nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAodGFnID09IFRhZy5Tb21ldGhpbmcpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIG9wdGlvbiB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcmVhZEFubm90YXRpb25MaXN0KFRyZWVOb2RlIHBhcmVudCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gbGlzdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBsaXN0W2ldID0gcmVhZEV4cHJlc3Npb24oKS4ucGFyZW50ID0gcGFyZW50OwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICB2b2lkIF9maWxsVHJlZU5vZGVMaXN0KAogICAgICBMaXN0PFRyZWVOb2RlPiBsaXN0LCBUcmVlTm9kZSBidWlsZE9iamVjdChpbnQgaW5kZXgpLCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIHZhciBsZW5ndGggPSByZWFkVUludCgpOwogICAgbGlzdC5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIFRyZWVOb2RlIG9iamVjdCA9IGJ1aWxkT2JqZWN0KGkpOwogICAgICBsaXN0W2ldID0gb2JqZWN0Li5wYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgfQoKICB2b2lkIF9maWxsTm9uVHJlZU5vZGVMaXN0KExpc3Q8Tm9kZT4gbGlzdCwgTm9kZSBidWlsZE9iamVjdCgpKSB7CiAgICB2YXIgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGxpc3QubGVuZ3RoID0gbGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBOb2RlIG9iamVjdCA9IGJ1aWxkT2JqZWN0KCk7CiAgICAgIGxpc3RbaV0gPSBvYmplY3Q7CiAgICB9CiAgfQoKICAvLy8gUmVhZHMgYSBsaXN0IG9mIG5hbWVkIG5vZGVzLCByZXVzaW5nIGFueSBleGlzdGluZyBvYmplY3RzIGFscmVhZHkgaW4gdGhlCiAgLy8vIGxpbmtpbmcgdHJlZS4gVGhlIG5vZGVzIGFyZSBtZXJnZWQgaW50byBbbGlzdF0sIGFuZCBpZiByZWFkaW5nIHRoZSBsaWJyYXJ5CiAgLy8vIGltcGxlbWVudGF0aW9uLCB0aGUgb3JkZXIgaXMgY29ycmVjdGVkLgogIC8vLwogIC8vLyBbcmVhZE9iamVjdF0gc2hvdWxkIHJlYWQgdGhlIG9iamVjdCBkZWZpbml0aW9uIGFuZCBpdHMgY2Fub25pY2FsIG5hbWUuCiAgLy8vIElmIGFuIGV4aXN0aW5nIG9iamVjdCBpcyBib3VuZCB0byB0aGUgY2Fub25pY2FsIG5hbWUsIHRoZSBleGlzdGluZyBvYmplY3QKICAvLy8gbXVzdCBiZSByZXVzZWQgYW5kIHJldHVybmVkLgogIHZvaWQgX21lcmdlTmFtZWROb2RlTGlzdCgKICAgICAgTGlzdDxOYW1lZE5vZGU+IGxpc3QsIE5hbWVkTm9kZSByZWFkT2JqZWN0KGludCBpbmRleCksIFRyZWVOb2RlIHBhcmVudCkgewogICAgLy8gV2hlbiByZWFkaW5nIHRoZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLCBvdmVyd3JpdGUgdGhlIHdob2xlIGxpc3QKICAgIC8vIHdpdGggdGhlIG5ldyBvbmUuCiAgICBfZmlsbFRyZWVOb2RlTGlzdChsaXN0LCByZWFkT2JqZWN0LCBwYXJlbnQpOwogIH0KCiAgdm9pZCByZWFkTGlua1RhYmxlKENhbm9uaWNhbE5hbWUgbGlua1Jvb3QpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgX2xpbmtUYWJsZSA9IG5ldyBMaXN0PENhbm9uaWNhbE5hbWU+KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGludCBiaWFzZWRQYXJlbnRJbmRleCA9IHJlYWRVSW50KCk7CiAgICAgIFN0cmluZyBuYW1lID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgICB2YXIgcGFyZW50ID0KICAgICAgICAgIGJpYXNlZFBhcmVudEluZGV4ID09IDAgPyBsaW5rUm9vdCA6IF9saW5rVGFibGVbYmlhc2VkUGFyZW50SW5kZXggLSAxXTsKICAgICAgX2xpbmtUYWJsZVtpXSA9IHBhcmVudC5nZXRDaGlsZChuYW1lKTsKICAgIH0KICB9CgogIExpc3Q8aW50PiBfaW5kZXhDb21wb25lbnRzKCkgewogICAgX2NoZWNrRW1wdHlJbnB1dCgpOwogICAgaW50IHNhdmVkQnl0ZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgX2J5dGVPZmZzZXQgPSBfYnl0ZXMubGVuZ3RoIC0gNDsKICAgIExpc3Q8aW50PiBpbmRleCA9IDxpbnQ+W107CiAgICB3aGlsZSAoX2J5dGVPZmZzZXQgPiAwKSB7CiAgICAgIGludCBzaXplID0gcmVhZFVpbnQzMigpOwogICAgICBpbnQgc3RhcnQgPSBfYnl0ZU9mZnNldCAtIHNpemU7CiAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICB0aHJvdyBmYWlsKCJpbmRpY2F0ZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBmaWxlIHNpemUiKTsKICAgICAgfQogICAgICBpbmRleC5hZGQoc2l6ZSk7CiAgICAgIF9ieXRlT2Zmc2V0ID0gc3RhcnQgLSA0OwogICAgfQogICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IExpc3QuZnJvbShpbmRleC5yZXZlcnNlZCk7CiAgfQoKICB2b2lkIF9jaGVja0VtcHR5SW5wdXQoKSB7CiAgICBpZiAoX2J5dGVzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiRW1wdHkgaW5wdXQgZ2l2ZW4uIik7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIGEga2VybmVsIGNvbXBvbmVudCBhbmQgc3RvcmVzIGl0IGluIFtjb21wb25lbnRdLgogIC8vLwogIC8vLyBXaGVuIGxpbmtpbmcgd2l0aCBhIG5vbi1lbXB0eSBjb21wb25lbnQsIGNhbm9uaWNhbCBuYW1lcyBtdXN0IGhhdmUgYmVlbgogIC8vLyBjb21wdXRlZCBhaGVhZCBvZiB0aW1lLgogIC8vLwogIC8vLyBUaGUgaW5wdXQgYnl0ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMgY29uY2F0ZW5hdGVkLgogIC8vLwogIC8vLyBJZiBbY3JlYXRlVmlld10gaXMgdHJ1ZSwgcmV0dXJucyBhIGxpc3Qgb2YgW1N1YkNvbXBvbmVudFZpZXddIC0gb25lIGZvcgogIC8vLyBlYWNoIGNvbmNhdGVuYXRlZCBkaWxsIC0gZWFjaCBvZiB3aGljaCBrbm93aW5nIHdoZXJlIGluIHRoZSBjb21iaW5lZCBkaWxsCiAgLy8vIGl0IGNhbWUgZnJvbS4gSWYgW2NyZWF0ZVZpZXddIGlzIGZhbHNlIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KICBMaXN0PFN1YkNvbXBvbmVudFZpZXc+IHJlYWRDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAge2Jvb2wgY2hlY2tDYW5vbmljYWxOYW1lczogZmFsc2UsIGJvb2wgY3JlYXRlVmlldzogZmFsc2V9KSB7CiAgICByZXR1cm4gVGltZWxpbmUudGltZVN5bmM8TGlzdDxTdWJDb21wb25lbnRWaWV3Pj4oCiAgICAgICAgIkJpbmFyeUJ1aWxkZXIucmVhZENvbXBvbmVudCIsICgpIHsKICAgICAgX2NoZWNrRW1wdHlJbnB1dCgpOwoKICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgLmRpbGwgZmlsZSBhbmQgaXQgaGFzIHRoZSBjb3JyZWN0IHZlcnNpb24gYmVmb3JlIHdlCiAgICAgIC8vIHN0YXJ0IGRlY29kaW5nIGl0LiAgT3RoZXJ3aXNlIHdlIHdpbGwgZmFpbCBmb3IgY3J5cHRpYyByZWFzb25zLgogICAgICBpbnQgb2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICAgIGludCBtYWdpYyA9IHJlYWRVaW50MzIoKTsKICAgICAgaWYgKG1hZ2ljICE9IFRhZy5Db21wb25lbnRGaWxlKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgICAgfQogICAgICBpbnQgdmVyc2lvbiA9IHJlYWRVaW50MzIoKTsKICAgICAgaWYgKHZlcnNpb24gIT0gVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pIHsKICAgICAgICB0aHJvdyBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yKHZlcnNpb24pOwogICAgICB9CiAgICAgIF9ieXRlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBMaXN0PGludD4gY29tcG9uZW50RmlsZVNpemVzID0gX2luZGV4Q29tcG9uZW50cygpOwogICAgICBpZiAoY29tcG9uZW50RmlsZVNpemVzLmxlbmd0aCA+IDEpIHsKICAgICAgICBfZGlzYWJsZUxhenlSZWFkaW5nID0gdHJ1ZTsKICAgICAgICBfZGlzYWJsZUxhenlDbGFzc1JlYWRpbmcgPSB0cnVlOwogICAgICB9CiAgICAgIGludCBjb21wb25lbnRGaWxlSW5kZXggPSAwOwogICAgICBMaXN0PFN1YkNvbXBvbmVudFZpZXc+IHZpZXdzOwogICAgICBpZiAoY3JlYXRlVmlldykgewogICAgICAgIHZpZXdzID0gbmV3IExpc3Q8U3ViQ29tcG9uZW50Vmlldz4oKTsKICAgICAgfQogICAgICB3aGlsZSAoX2J5dGVPZmZzZXQgPCBfYnl0ZXMubGVuZ3RoKSB7CiAgICAgICAgU3ViQ29tcG9uZW50VmlldyB2aWV3ID0gX3JlYWRPbmVDb21wb25lbnQoCiAgICAgICAgICAgIGNvbXBvbmVudCwgY29tcG9uZW50RmlsZVNpemVzW2NvbXBvbmVudEZpbGVJbmRleF0sCiAgICAgICAgICAgIGNyZWF0ZVZpZXc6IGNyZWF0ZVZpZXcpOwogICAgICAgIGlmIChjcmVhdGVWaWV3KSB7CiAgICAgICAgICB2aWV3cy5hZGQodmlldyk7CiAgICAgICAgfQogICAgICAgICsrY29tcG9uZW50RmlsZUluZGV4OwogICAgICB9CgogICAgICBpZiAoY2hlY2tDYW5vbmljYWxOYW1lcykgewogICAgICAgIF9jaGVja0Nhbm9uaWNhbE5hbWVDaGlsZHJlbihjb21wb25lbnQucm9vdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZpZXdzOwogICAgfSk7CiAgfQoKICAvLy8gRGVzZXJpYWxpemVzIHRoZSBzb3VyY2UgYW5kIHN0b3JlcyBpdCBpbiBbY29tcG9uZW50XS4KICAvLy8KICAvLy8gVGhlIGlucHV0IGJ5dGVzIG1heSBjb250YWluIG11bHRpcGxlIGZpbGVzIGNvbmNhdGVuYXRlZC4KICB2b2lkIHJlYWRDb21wb25lbnRTb3VyY2UoQ29tcG9uZW50IGNvbXBvbmVudCkgewogICAgTGlzdDxpbnQ+IGNvbXBvbmVudEZpbGVTaXplcyA9IF9pbmRleENvbXBvbmVudHMoKTsKICAgIGlmIChjb21wb25lbnRGaWxlU2l6ZXMubGVuZ3RoID4gMSkgewogICAgICBfZGlzYWJsZUxhenlSZWFkaW5nID0gdHJ1ZTsKICAgICAgX2Rpc2FibGVMYXp5Q2xhc3NSZWFkaW5nID0gdHJ1ZTsKICAgIH0KICAgIGludCBjb21wb25lbnRGaWxlSW5kZXggPSAwOwogICAgd2hpbGUgKF9ieXRlT2Zmc2V0IDwgX2J5dGVzLmxlbmd0aCkgewogICAgICBfcmVhZE9uZUNvbXBvbmVudFNvdXJjZSgKICAgICAgICAgIGNvbXBvbmVudCwgY29tcG9uZW50RmlsZVNpemVzW2NvbXBvbmVudEZpbGVJbmRleF0pOwogICAgICArK2NvbXBvbmVudEZpbGVJbmRleDsKICAgIH0KICB9CgogIC8vLyBSZWFkcyBhIHNpbmdsZSBjb21wb25lbnQgZmlsZSBmcm9tIHRoZSBpbnB1dCBhbmQgbG9hZHMgaXQgaW50byBbY29tcG9uZW50XSwKICAvLy8gb3ZlcndyaXRpbmcgYW5kIHJldXNpbmcgYW55IGV4aXN0aW5nIGRhdGEgaW4gdGhlIGNvbXBvbmVudC4KICAvLy8KICAvLy8gV2hlbiBsaW5raW5nIHdpdGggYSBub24tZW1wdHkgY29tcG9uZW50LCBjYW5vbmljYWwgbmFtZXMgbXVzdCBoYXZlIGJlZW4KICAvLy8gY29tcHV0ZWQgYWhlYWQgb2YgdGltZS4KICAvLy8KICAvLy8gVGhpcyBzaG91bGQgKm9ubHkqIGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIHJlYXNvbiB0byBub3QgYWxsb3cKICAvLy8gY29uY2F0ZW5hdGVkIGZpbGVzLgogIHZvaWQgcmVhZFNpbmdsZUZpbGVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgICAge2Jvb2wgY2hlY2tDYW5vbmljYWxOYW1lczogZmFsc2V9KSB7CiAgICBMaXN0PGludD4gY29tcG9uZW50RmlsZVNpemVzID0gX2luZGV4Q29tcG9uZW50cygpOwogICAgaWYgKGNvbXBvbmVudEZpbGVTaXplcy5pc0VtcHR5KSB0aHJvdyBmYWlsKCJpbnZhbGlkIGNvbXBvbmVudCBkYXRhIik7CiAgICBfcmVhZE9uZUNvbXBvbmVudChjb21wb25lbnQsIGNvbXBvbmVudEZpbGVTaXplc1swXSk7CiAgICBpZiAoX2J5dGVPZmZzZXQgPCBfYnl0ZXMubGVuZ3RoKSB7CiAgICAgIGlmIChfYnl0ZU9mZnNldCArIDMgPCBfYnl0ZXMubGVuZ3RoKSB7CiAgICAgICAgaW50IG1hZ2ljID0gcmVhZFVpbnQzMigpOwogICAgICAgIGlmIChtYWdpYyA9PSBUYWcuQ29tcG9uZW50RmlsZSkgewogICAgICAgICAgdGhyb3cgJ0NvbmNhdGVuYXRlZCBjb21wb25lbnQgZmlsZSBnaXZlbiB3aGVuIGEgc2luZ2xlIGNvbXBvbmVudCAnCiAgICAgICAgICAgICAgJ3dhcyBleHBlY3RlZC4nOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyAnVW5yZWNvZ25pemVkIGJ5dGVzIGZvbGxvd2luZyBjb21wb25lbnQgZGF0YSc7CiAgICB9CgogICAgaWYgKGNoZWNrQ2Fub25pY2FsTmFtZXMpIHsKICAgICAgX2NoZWNrQ2Fub25pY2FsTmFtZUNoaWxkcmVuKGNvbXBvbmVudC5yb290KTsKICAgIH0KICB9CgogIHZvaWQgX2NoZWNrQ2Fub25pY2FsTmFtZUNoaWxkcmVuKENhbm9uaWNhbE5hbWUgcGFyZW50KSB7CiAgICBJdGVyYWJsZTxDYW5vbmljYWxOYW1lPiBwYXJlbnRDaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbk9yTnVsbDsKICAgIGlmIChwYXJlbnRDaGlsZHJlbiAhPSBudWxsKSB7CiAgICAgIGZvciAoQ2Fub25pY2FsTmFtZSBjaGlsZCBpbiBwYXJlbnRDaGlsZHJlbikgewogICAgICAgIGlmIChjaGlsZC5uYW1lICE9ICdAbWV0aG9kcycgJiYKICAgICAgICAgICAgY2hpbGQubmFtZSAhPSAnQHR5cGVkZWZzJyAmJgogICAgICAgICAgICBjaGlsZC5uYW1lICE9ICdAZmllbGRzJyAmJgogICAgICAgICAgICBjaGlsZC5uYW1lICE9ICdAZ2V0dGVycycgJiYKICAgICAgICAgICAgY2hpbGQubmFtZSAhPSAnQHNldHRlcnMnICYmCiAgICAgICAgICAgIGNoaWxkLm5hbWUgIT0gJ0BmYWN0b3JpZXMnICYmCiAgICAgICAgICAgIGNoaWxkLm5hbWUgIT0gJ0Bjb25zdHJ1Y3RvcnMnKSB7CiAgICAgICAgICBib29sIGNoZWNrUmVmZXJlbmNlTm9kZSA9IHRydWU7CiAgICAgICAgICBpZiAoY2hpbGQucmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgICAgICAgLy8gT0sgZm9yICJpZiBwcml2YXRlOiBVUkkgb2YgbGlicmFyeSIgcGFydCBvZiAiUXVhbGlmaWVkIG5hbWUiLi4uCiAgICAgICAgICAgIEl0ZXJhYmxlPENhbm9uaWNhbE5hbWU+IGNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW5Pck51bGw7CiAgICAgICAgICAgIGlmIChwYXJlbnQucGFyZW50ICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIGNoaWxkcmVuICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIGNoaWxkcmVuLmlzTm90RW1wdHkgJiYKICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZpcnN0Lm5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgICAgICAgICAgLy8gT0sgdGhlbi4KICAgICAgICAgICAgICBjaGVja1JlZmVyZW5jZU5vZGUgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBidWlsZENhbm9uaWNhbE5hbWVFcnJvcigKICAgICAgICAgICAgICAgICAgIk51bGwgcmVmZXJlbmNlICgke2NoaWxkLm5hbWV9KSAoJGNoaWxkKS4iLCBjaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaGVja1JlZmVyZW5jZU5vZGUpIHsKICAgICAgICAgICAgaWYgKGNoaWxkLnJlZmVyZW5jZS5jYW5vbmljYWxOYW1lICE9IGNoaWxkKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm9uaWNhbE5hbWVFcnJvcigKICAgICAgICAgICAgICAgICAgIkNhbm9uaWNhbCBuYW1lIGFuZCByZWZlcmVuY2UgZG9lc24ndCBhZ3JlZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hpbGQucmVmZXJlbmNlLm5vZGUgPT0gbnVsbCkgewogICAgICAgICAgICAgIHRocm93IGJ1aWxkQ2Fub25pY2FsTmFtZUVycm9yKAogICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIGlzIG51bGwgKCR7Y2hpbGQubmFtZX0pICgkY2hpbGQpLiIsIGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfY2hlY2tDYW5vbmljYWxOYW1lQ2hpbGRyZW4oY2hpbGQpOwogICAgICB9CiAgICB9CiAgfQoKICBDYW5vbmljYWxOYW1lRXJyb3IgYnVpbGRDYW5vbmljYWxOYW1lRXJyb3IoCiAgICAgIFN0cmluZyBtZXNzYWdlLCBDYW5vbmljYWxOYW1lIHByb2JsZW1Ob2RlKSB7CiAgICAvLyBTcGVjaWFsLWNhc2UgbWlzc2luZyBzZGsgZW50cmllcyBhcyB0aGF0IGlzIHByb2JhYmx5IGEgY2hhbmdlIHRvIHRoZQogICAgLy8gcGxhdGZvcm0gLSB0aGF0J3Mgc29tZXRoaW5nIHdlIG1pZ2h0IHdhbnQgdG8gcmVhY3QgZGlmZmVyZW50bHkgdG8uCiAgICBTdHJpbmcgbGlicmFyeVVyaSA9IHByb2JsZW1Ob2RlPy5ub25Sb290VG9wPy5uYW1lID8/ICIiOwogICAgaWYgKGxpYnJhcnlVcmkuc3RhcnRzV2l0aCgiZGFydDoiKSkgewogICAgICByZXR1cm4gbmV3IENhbm9uaWNhbE5hbWVTZGtFcnJvcihtZXNzYWdlKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ2Fub25pY2FsTmFtZUVycm9yKG1lc3NhZ2UpOwogIH0KCiAgX0NvbXBvbmVudEluZGV4IF9yZWFkQ29tcG9uZW50SW5kZXgoaW50IGNvbXBvbmVudEZpbGVTaXplKSB7CiAgICBpbnQgc2F2ZWRCeXRlSW5kZXggPSBfYnl0ZU9mZnNldDsKCiAgICBfQ29tcG9uZW50SW5kZXggcmVzdWx0ID0gbmV3IF9Db21wb25lbnRJbmRleCgpOwoKICAgIC8vIFRoZXJlIGFyZSB0d28gZmllbGRzOiBmaWxlIHNpemUgYW5kIGxpYnJhcnkgY291bnQuCiAgICBfYnl0ZU9mZnNldCA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIGNvbXBvbmVudEZpbGVTaXplIC0gKDIpICogNDsKICAgIHJlc3VsdC5saWJyYXJ5Q291bnQgPSByZWFkVWludDMyKCk7CiAgICAvLyBMaWJyYXJ5IG9mZnNldHMgYXJlIHVzZWQgZm9yIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cywgc28gdGhlcmUgaXMgb25lIGV4dHJhCiAgICAvLyBlbGVtZW50IHRoYXQgdGhpcyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgbGFzdCBsaWJyYXJ5CiAgICByZXN1bHQubGlicmFyeU9mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KHJlc3VsdC5saWJyYXJ5Q291bnQgKyAxKTsKICAgIHJlc3VsdC5jb21wb25lbnRGaWxlU2l6ZUluQnl0ZXMgPSByZWFkVWludDMyKCk7CiAgICBpZiAocmVzdWx0LmNvbXBvbmVudEZpbGVTaXplSW5CeXRlcyAhPSBjb21wb25lbnRGaWxlU2l6ZSkgewogICAgICB0aHJvdyAiTWFsZm9ybWVkIGJpbmFyeTogVGhpcyBjb21wb25lbnQgZmlsZSdzIGNvbXBvbmVudCBpbmRleCBpbmRpY2F0ZXMgdGhhdCIKICAgICAgICAgICIgdGhlIGZpbGUgc2l6ZSBzaG91bGQgYmUgJGNvbXBvbmVudEZpbGVTaXplIGJ1dCBvdGhlciBjb21wb25lbnQgaW5kZXhlcyIKICAgICAgICAgICIgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBzaXplIHNob3VsZCBiZSAiCiAgICAgICAgICAiJHtyZXN1bHQuY29tcG9uZW50RmlsZVNpemVJbkJ5dGVzfS4iOwogICAgfQoKICAgIC8vIFNraXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbmRleC4KICAgIF9ieXRlT2Zmc2V0IC09CiAgICAgICAgKChyZXN1bHQubGlicmFyeUNvdW50ICsgMSkgKyBfQ29tcG9uZW50SW5kZXgubnVtYmVyT2ZGaXhlZEZpZWxkcykgKiA0OwoKICAgIC8vIE5vdyByZWFkIHRoZSBjb21wb25lbnQgaW5kZXguCiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yU291cmNlVGFibGUgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXMgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyByZWFkVWludDMyKCk7CiAgICByZXN1bHQuYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFQYXlsb2FkcyA9CiAgICAgICAgX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgcmVzdWx0LmJpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3MgPQogICAgICAgIF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIHJlc3VsdC5iaW5hcnlPZmZzZXRGb3JDb25zdGFudFRhYmxlID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgcmVzdWx0Lm1haW5NZXRob2RSZWZlcmVuY2UgPSByZWFkVWludDMyKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5saWJyYXJ5Q291bnQgKyAxOyArK2kpIHsKICAgICAgcmVzdWx0LmxpYnJhcnlPZmZzZXRzW2ldID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgfQoKICAgIF9ieXRlT2Zmc2V0ID0gc2F2ZWRCeXRlSW5kZXg7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX3JlYWRPbmVDb21wb25lbnRTb3VyY2UoQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGNvbXBvbmVudEZpbGVTaXplKSB7CiAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSBfYnl0ZU9mZnNldDsKCiAgICBmaW5hbCBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gVGFnLkNvbXBvbmVudEZpbGUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgIH0KCiAgICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbiA9IHJlYWRVaW50MzIoKTsKICAgIGlmIChmb3JtYXRWZXJzaW9uICE9IFRhZy5CaW5hcnlGb3JtYXRWZXJzaW9uKSB7CiAgICAgIHRocm93IEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IoZm9ybWF0VmVyc2lvbik7CiAgICB9CgogICAgLy8gUmVhZCBjb21wb25lbnQgaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoaXMgQ29tcG9uZW50RmlsZXMgc2VyaWFsaXplZCBkYXRhLgogICAgX0NvbXBvbmVudEluZGV4IGluZGV4ID0gX3JlYWRDb21wb25lbnRJbmRleChjb21wb25lbnRGaWxlU2l6ZSk7CgogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZTsKICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSByZWFkVXJpVG9Tb3VyY2UoKTsKICAgIF9tZXJnZVVyaVRvU291cmNlKGNvbXBvbmVudC51cmlUb1NvdXJjZSwgdXJpVG9Tb3VyY2UpOwoKICAgIF9ieXRlT2Zmc2V0ID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgY29tcG9uZW50RmlsZVNpemU7CiAgfQoKICBTdWJDb21wb25lbnRWaWV3IF9yZWFkT25lQ29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQsIGludCBjb21wb25lbnRGaWxlU2l6ZSwKICAgICAge2Jvb2wgY3JlYXRlVmlldzogZmFsc2V9KSB7CiAgICBfY29tcG9uZW50U3RhcnRPZmZzZXQgPSBfYnl0ZU9mZnNldDsKCiAgICBmaW5hbCBpbnQgbWFnaWMgPSByZWFkVWludDMyKCk7CiAgICBpZiAobWFnaWMgIT0gVGFnLkNvbXBvbmVudEZpbGUpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignTm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS4nKTsKICAgIH0KCiAgICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbiA9IHJlYWRVaW50MzIoKTsKICAgIGlmIChmb3JtYXRWZXJzaW9uICE9IFRhZy5CaW5hcnlGb3JtYXRWZXJzaW9uKSB7CiAgICAgIHRocm93IEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IoZm9ybWF0VmVyc2lvbik7CiAgICB9CgogICAgTGlzdDxTdHJpbmc+IHByb2JsZW1zQXNKc29uID0gcmVhZExpc3RPZlN0cmluZ3MoKTsKICAgIGlmIChwcm9ibGVtc0FzSnNvbiAhPSBudWxsKSB7CiAgICAgIGNvbXBvbmVudC5wcm9ibGVtc0FzSnNvbiA/Pz0gPFN0cmluZz5bXTsKICAgICAgY29tcG9uZW50LnByb2JsZW1zQXNKc29uLmFkZEFsbChwcm9ibGVtc0FzSnNvbik7CiAgICB9CgogICAgLy8gUmVhZCBjb21wb25lbnQgaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoaXMgQ29tcG9uZW50RmlsZXMgc2VyaWFsaXplZCBkYXRhLgogICAgX0NvbXBvbmVudEluZGV4IGluZGV4ID0gX3JlYWRDb21wb25lbnRJbmRleChjb21wb25lbnRGaWxlU2l6ZSk7CgogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTdHJpbmdUYWJsZTsKICAgIHJlYWRTdHJpbmdUYWJsZShfc3RyaW5nVGFibGUpOwoKICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXguYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXM7CiAgICByZWFkTGlua1RhYmxlKGNvbXBvbmVudC5yb290KTsKCiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiByZXZlcnNlIG1ldGFkYXRhIG1hcHBpbmdzIGFuZCByZWFkIGZvcndhcmRzCiAgICBfYnl0ZU9mZnNldCA9IGluZGV4LmJpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlOyAvLyBSZWFkIGJhY2t3YXJkcy4KICAgIF9yZWFkTWV0YWRhdGFNYXBwaW5ncyhjb21wb25lbnQsIGluZGV4LmJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMpOwoKICAgIF9hc3NvY2lhdGVNZXRhZGF0YShjb21wb25lbnQsIF9jb21wb25lbnRTdGFydE9mZnNldCk7CgogICAgX2J5dGVPZmZzZXQgPSBpbmRleC5iaW5hcnlPZmZzZXRGb3JTb3VyY2VUYWJsZTsKICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSByZWFkVXJpVG9Tb3VyY2UoKTsKICAgIF9tZXJnZVVyaVRvU291cmNlKGNvbXBvbmVudC51cmlUb1NvdXJjZSwgdXJpVG9Tb3VyY2UpOwoKICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXguYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZTsKICAgIHJlYWRDb25zdGFudFRhYmxlKCk7CgogICAgaW50IG51bWJlck9mTGlicmFyaWVzID0gaW5kZXgubGlicmFyeUNvdW50OwoKICAgIFN1YkNvbXBvbmVudFZpZXcgcmVzdWx0OwogICAgaWYgKGNyZWF0ZVZpZXcpIHsKICAgICAgcmVzdWx0ID0gbmV3IFN1YkNvbXBvbmVudFZpZXcobmV3IExpc3Q8TGlicmFyeT4obnVtYmVyT2ZMaWJyYXJpZXMpLAogICAgICAgICAgX2NvbXBvbmVudFN0YXJ0T2Zmc2V0LCBjb21wb25lbnRGaWxlU2l6ZSk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkxpYnJhcmllczsgKytpKSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gaW5kZXgubGlicmFyeU9mZnNldHNbaV07CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IHJlYWRMaWJyYXJ5KGNvbXBvbmVudCwgaW5kZXgubGlicmFyeU9mZnNldHNbaSArIDFdKTsKICAgICAgaWYgKGNyZWF0ZVZpZXcpIHsKICAgICAgICByZXN1bHQubGlicmFyaWVzW2ldID0gbGlicmFyeTsKICAgICAgfQogICAgfQoKICAgIHZhciBtYWluTWV0aG9kID0KICAgICAgICBnZXRNZW1iZXJSZWZlcmVuY2VGcm9tSW50KGluZGV4Lm1haW5NZXRob2RSZWZlcmVuY2UsIGFsbG93TnVsbDogdHJ1ZSk7CiAgICBjb21wb25lbnQubWFpbk1ldGhvZE5hbWUgPz89IG1haW5NZXRob2Q7CgogICAgX2J5dGVPZmZzZXQgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQgKyBjb21wb25lbnRGaWxlU2l6ZTsKCiAgICBhc3NlcnQodHlwZVBhcmFtZXRlclN0YWNrLmlzRW1wdHkpOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmVhZCBhIGxpc3Qgb2Ygc3RyaW5ncy4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIFtudWxsXSBpcyByZXR1cm5lZC4KICBMaXN0PFN0cmluZz4gcmVhZExpc3RPZlN0cmluZ3MoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFN0cmluZz4gc3RyaW5ncyA9CiAgICAgICAgbmV3IExpc3Q8U3RyaW5nPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIFN0cmluZyBzID0gY29uc3QgVXRmOERlY29kZXIoKS5jb252ZXJ0KHJlYWRCeXRlTGlzdCgpKTsKICAgICAgc3RyaW5nc1tpXSA9IHM7CiAgICB9CiAgICByZXR1cm4gc3RyaW5nczsKICB9CgogIE1hcDxVcmksIFNvdXJjZT4gcmVhZFVyaVRvU291cmNlKCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVaW50MzIoKTsKCiAgICAvLyBSZWFkIGRhdGEuCiAgICBfc291cmNlVXJpVGFibGUubGVuZ3RoID0gbGVuZ3RoOwogICAgTWFwPFVyaSwgU291cmNlPiB1cmlUb1NvdXJjZSA9IDxVcmksIFNvdXJjZT57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgTGlzdDxpbnQ+IHVyaUJ5dGVzID0gcmVhZEJ5dGVMaXN0KCk7CiAgICAgIFVyaSB1cmkgPSB1cmlCeXRlcy5pc0VtcHR5CiAgICAgICAgICA/IG51bGwKICAgICAgICAgIDogVXJpLnBhcnNlKGNvbnN0IFV0ZjhEZWNvZGVyKCkuY29udmVydCh1cmlCeXRlcykpOwogICAgICBfc291cmNlVXJpVGFibGVbaV0gPSB1cmk7CiAgICAgIExpc3Q8aW50PiBzb3VyY2VDb2RlID0gcmVhZEJ5dGVMaXN0KCk7CiAgICAgIGludCBsaW5lQ291bnQgPSByZWFkVUludCgpOwogICAgICBMaXN0PGludD4gbGluZVN0YXJ0cyA9IG5ldyBMaXN0PGludD4obGluZUNvdW50KTsKICAgICAgaW50IHByZXZpb3VzTGluZVN0YXJ0ID0gMDsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsaW5lQ291bnQ7ICsraikgewogICAgICAgIGludCBsaW5lU3RhcnQgPSByZWFkVUludCgpICsgcHJldmlvdXNMaW5lU3RhcnQ7CiAgICAgICAgbGluZVN0YXJ0c1tqXSA9IGxpbmVTdGFydDsKICAgICAgICBwcmV2aW91c0xpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgfQogICAgICBMaXN0PGludD4gaW1wb3J0VXJpQnl0ZXMgPSByZWFkQnl0ZUxpc3QoKTsKICAgICAgVXJpIGltcG9ydFVyaSA9IGltcG9ydFVyaUJ5dGVzLmlzRW1wdHkKICAgICAgICAgID8gbnVsbAogICAgICAgICAgOiBVcmkucGFyc2UoY29uc3QgVXRmOERlY29kZXIoKS5jb252ZXJ0KGltcG9ydFVyaUJ5dGVzKSk7CiAgICAgIHVyaVRvU291cmNlW3VyaV0gPSBuZXcgU291cmNlKGxpbmVTdGFydHMsIHNvdXJjZUNvZGUsIGltcG9ydFVyaSwgdXJpKTsKICAgIH0KCiAgICAvLyBSZWFkIGluZGV4LgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZWFkVWludDMyKCk7CiAgICB9CiAgICByZXR1cm4gdXJpVG9Tb3VyY2U7CiAgfQoKICAvLyBBZGQgZXZlcnl0aGluZyBmcm9tIFtzcmNdIGludG8gW2RzdF0sIGJ1dCBkb24ndCBvdmVyd3JpdGUgYSBub24tZW1wdHkKICAvLyBzb3VyY2Ugd2l0aCBhbiBlbXB0eSBzb3VyY2UuIEVtcHR5IHNvdXJjZXMgbWF5IGJlIGludHJvZHVjZWQgYnkKICAvLyBzeW50aGV0aWMsIGNvcHktZG93biBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyBtaXhpbiBhcHBsaWNhdGlvbnMgb3IKICAvLyBub1N1Y2hNZXRob2QgZm9yd2FyZGVycy4KICB2b2lkIF9tZXJnZVVyaVRvU291cmNlKE1hcDxVcmksIFNvdXJjZT4gZHN0LCBNYXA8VXJpLCBTb3VyY2U+IHNyYykgewogICAgaWYgKGRzdC5pc0VtcHR5KSB7CiAgICAgIC8vIEZhc3QgcGF0aCBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIG9uZSBjb21wb25lbnQgcGVyIGJpbmFyeS4KICAgICAgZHN0LmFkZEFsbChzcmMpOwogICAgfSBlbHNlIHsKICAgICAgc3JjLmZvckVhY2goKFVyaSBrZXksIFNvdXJjZSB2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZS5zb3VyY2UuaXNOb3RFbXB0eSB8fCAhZHN0LmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgIGRzdFtrZXldID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIENhbm9uaWNhbE5hbWUgcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKSB7CiAgICB2YXIgaW5kZXggPSByZWFkVUludCgpOwogICAgaWYgKGluZGV4ID09IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9saW5rVGFibGVbaW5kZXggLSAxXTsKICB9CgogIENhbm9uaWNhbE5hbWUgZ2V0Q2Fub25pY2FsTmFtZVJlZmVyZW5jZUZyb21JbnQoaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPT0gMCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gX2xpbmtUYWJsZVtpbmRleCAtIDFdOwogIH0KCiAgUmVmZXJlbmNlIHJlYWRMaWJyYXJ5UmVmZXJlbmNlKHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICBDYW5vbmljYWxOYW1lIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgaWYgKGNhbm9uaWNhbE5hbWUgIT0gbnVsbCkgcmV0dXJuIGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBpZiAoYWxsb3dOdWxsKSByZXR1cm4gbnVsbDsKICAgIHRocm93ICdFeHBlY3RlZCBhIGxpYnJhcnkgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLic7CiAgfQoKICBMaWJyYXJ5RGVwZW5kZW5jeSByZWFkTGlicmFyeURlcGVuZGVuY3lSZWZlcmVuY2UoKSB7CiAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgcmV0dXJuIF9jdXJyZW50TGlicmFyeS5kZXBlbmRlbmNpZXNbaW5kZXhdOwogIH0KCiAgUmVmZXJlbmNlIHJlYWRDbGFzc1JlZmVyZW5jZSh7Ym9vbCBhbGxvd051bGw6IGZhbHNlfSkgewogICAgdmFyIG5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgaWYgKG5hbWUgPT0gbnVsbCAmJiAhYWxsb3dOdWxsKSB7CiAgICAgIHRocm93ICdFeHBlY3RlZCBhIGNsYXNzIHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC4nOwogICAgfQogICAgcmV0dXJuIG5hbWU/LmdldFJlZmVyZW5jZSgpOwogIH0KCiAgUmVmZXJlbmNlIHJlYWRNZW1iZXJSZWZlcmVuY2Uoe2Jvb2wgYWxsb3dOdWxsOiBmYWxzZX0pIHsKICAgIHZhciBuYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIGlmIChuYW1lID09IG51bGwgJiYgIWFsbG93TnVsbCkgewogICAgICB0aHJvdyAnRXhwZWN0ZWQgYSBtZW1iZXIgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLic7CiAgICB9CiAgICByZXR1cm4gbmFtZT8uZ2V0UmVmZXJlbmNlKCk7CiAgfQoKICBSZWZlcmVuY2UgZ2V0TWVtYmVyUmVmZXJlbmNlRnJvbUludChpbnQgaW5kZXgsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KSB7CiAgICB2YXIgbmFtZSA9IGdldENhbm9uaWNhbE5hbWVSZWZlcmVuY2VGcm9tSW50KGluZGV4KTsKICAgIGlmIChuYW1lID09IG51bGwgJiYgIWFsbG93TnVsbCkgewogICAgICB0aHJvdyAnRXhwZWN0ZWQgYSBtZW1iZXIgcmVmZXJlbmNlIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLic7CiAgICB9CiAgICByZXR1cm4gbmFtZT8uZ2V0UmVmZXJlbmNlKCk7CiAgfQoKICBSZWZlcmVuY2UgcmVhZFR5cGVkZWZSZWZlcmVuY2UoKSB7CiAgICByZXR1cm4gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKT8uZ2V0UmVmZXJlbmNlKCk7CiAgfQoKICBOYW1lIHJlYWROYW1lKCkgewogICAgU3RyaW5nIHRleHQgPSByZWFkU3RyaW5nUmVmZXJlbmNlKCk7CiAgICBpZiAodGV4dC5pc05vdEVtcHR5ICYmIHRleHRbMF0gPT0gJ18nKSB7CiAgICAgIHJldHVybiBuZXcgTmFtZS5ieVJlZmVyZW5jZSh0ZXh0LCByZWFkTGlicmFyeVJlZmVyZW5jZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgTmFtZSh0ZXh0KTsKICAgIH0KICB9CgogIExpYnJhcnkgcmVhZExpYnJhcnkoQ29tcG9uZW50IGNvbXBvbmVudCwgaW50IGVuZE9mZnNldCkgewogICAgLy8gUmVhZCBpbmRleC4KICAgIGludCBzYXZlZEJ5dGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKCiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQgLSAoMSkgKiA0OwogICAgaW50IHByb2NlZHVyZUNvdW50ID0gcmVhZFVpbnQzMigpOwogICAgTGlzdDxpbnQ+IHByb2NlZHVyZU9mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KHByb2NlZHVyZUNvdW50ICsgMSk7CgogICAgLy8gVGhlcmUgaXMgYSBmaWVsZCBmb3IgdGhlIHByb2NlZHVyZSBjb3VudCwgdGhhdCBudW1iZXIgKyAxIChmb3IgdGhlIGVuZCkKICAgIC8vIG9mZnNldHMsIGFuZCB0aGVuIHRoZSBjbGFzcyBjb3VudCAoaS5lLiBwcm9jZWR1cmUgY291bnQgKyAzIGZpZWxkcykuCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIChwcm9jZWR1cmVDb3VudCArIDMpICogNDsKICAgIGludCBjbGFzc0NvdW50ID0gcmVhZFVpbnQzMigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZWR1cmVDb3VudCArIDE7IGkrKykgewogICAgICBwcm9jZWR1cmVPZmZzZXRzW2ldID0gX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ICsgcmVhZFVpbnQzMigpOwogICAgfQogICAgTGlzdDxpbnQ+IGNsYXNzT2Zmc2V0cyA9IG5ldyBMaXN0PGludD4oY2xhc3NDb3VudCArIDEpOwoKICAgIC8vIFRoZXJlIGlzIGEgZmllbGQgZm9yIHRoZSBwcm9jZWR1cmUgY291bnQsIHRoYXQgbnVtYmVyICsgMSAoZm9yIHRoZSBlbmQpCiAgICAvLyBvZmZzZXRzLCB0aGVuIHRoZSBjbGFzcyBjb3VudCBhbmQgdGhhdCBudW1iZXIgKyAxIChmb3IgdGhlIGVuZCkgb2Zmc2V0cy4KICAgIC8vIChpLmUuIHByb2NlZHVyZSBjb3VudCArIGNsYXNzIGNvdW50ICsgNCBmaWVsZHMpLgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQgLSAocHJvY2VkdXJlQ291bnQgKyBjbGFzc0NvdW50ICsgNCkgKiA0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0NvdW50ICsgMTsgaSsrKSB7CiAgICAgIGNsYXNzT2Zmc2V0c1tpXSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIH0KICAgIF9ieXRlT2Zmc2V0ID0gc2F2ZWRCeXRlT2Zmc2V0OwoKICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CgogICAgaW50IGxhbmd1YWdlVmVyc2lvbk1ham9yID0gcmVhZFVJbnQoKTsKICAgIGludCBsYW5ndWFnZVZlcnNpb25NaW5vciA9IHJlYWRVSW50KCk7CgogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBMaWJyYXJ5IGxpYnJhcnkgPSByZWZlcmVuY2Uubm9kZTsKICAgIGlmIChhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzKSB7CiAgICAgIGxpYnJhcnkgPSBudWxsOwogICAgfQogICAgaWYgKGxpYnJhcnkgPT0gbnVsbCkgewogICAgICBsaWJyYXJ5ID0KICAgICAgICAgIG5ldyBMaWJyYXJ5KFVyaS5wYXJzZShjYW5vbmljYWxOYW1lLm5hbWUpLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICAgIGNvbXBvbmVudC5saWJyYXJpZXMuYWRkKGxpYnJhcnkuLnBhcmVudCA9IGNvbXBvbmVudCk7CiAgICB9CiAgICBfY3VycmVudExpYnJhcnkgPSBsaWJyYXJ5OwogICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nT3JOdWxsSWZFbXB0eSgpOwoKICAgIC8vIFRPRE8oamVuc2opOiBXZSBjdXJyZW50bHkgc2F2ZSAoYWxtb3N0IHRoZSBzYW1lKSB1cmkgdHdpY2UuCiAgICBVcmkgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKCiAgICBMaXN0PFN0cmluZz4gcHJvYmxlbXNBc0pzb24gPSByZWFkTGlzdE9mU3RyaW5ncygpOwoKICAgIGxpYnJhcnkuZmxhZ3MgPSBmbGFnczsKICAgIGxpYnJhcnkuc2V0TGFuZ3VhZ2VWZXJzaW9uKGxhbmd1YWdlVmVyc2lvbk1ham9yLCBsYW5ndWFnZVZlcnNpb25NaW5vcik7CiAgICBsaWJyYXJ5Lm5hbWUgPSBuYW1lOwogICAgbGlicmFyeS5maWxlVXJpID0gZmlsZVVyaTsKICAgIGxpYnJhcnkucHJvYmxlbXNBc0pzb24gPSBwcm9ibGVtc0FzSnNvbjsKCiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKGxpYnJhcnkubmFtZSA/PyBsaWJyYXJ5LmltcG9ydFVyaT8udG9TdHJpbmcoKSA/PyAnbGlicmFyeScpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CgogICAgX2ZpbGxUcmVlTm9kZUxpc3QoCiAgICAgICAgbGlicmFyeS5hbm5vdGF0aW9ucywgKGluZGV4KSA9PiByZWFkRXhwcmVzc2lvbigpLCBsaWJyYXJ5KTsKICAgIF9yZWFkTGlicmFyeURlcGVuZGVuY2llcyhsaWJyYXJ5KTsKICAgIF9yZWFkQWRkaXRpb25hbEV4cG9ydHMobGlicmFyeSk7CiAgICBfcmVhZExpYnJhcnlQYXJ0cyhsaWJyYXJ5KTsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3QobGlicmFyeS50eXBlZGVmcywgKGluZGV4KSA9PiByZWFkVHlwZWRlZigpLCBsaWJyYXJ5KTsKCiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KGxpYnJhcnkuY2xhc3NlcywgKGluZGV4KSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gY2xhc3NPZmZzZXRzW2luZGV4XTsKICAgICAgcmV0dXJuIHJlYWRDbGFzcyhjbGFzc09mZnNldHNbaW5kZXggKyAxXSk7CiAgICB9LCBsaWJyYXJ5KTsKICAgIF9ieXRlT2Zmc2V0ID0gY2xhc3NPZmZzZXRzLmxhc3Q7CgogICAgX21lcmdlTmFtZWROb2RlTGlzdChsaWJyYXJ5LmV4dGVuc2lvbnMsIChpbmRleCkgewogICAgICByZXR1cm4gcmVhZEV4dGVuc2lvbigpOwogICAgfSwgbGlicmFyeSk7CgogICAgX21lcmdlTmFtZWROb2RlTGlzdChsaWJyYXJ5LmZpZWxkcywgKGluZGV4KSA9PiByZWFkRmllbGQoKSwgbGlicmFyeSk7CiAgICBfbWVyZ2VOYW1lZE5vZGVMaXN0KGxpYnJhcnkucHJvY2VkdXJlcywgKGluZGV4KSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0c1tpbmRleF07CiAgICAgIHJldHVybiByZWFkUHJvY2VkdXJlKHByb2NlZHVyZU9mZnNldHNbaW5kZXggKyAxXSk7CiAgICB9LCBsaWJyYXJ5KTsKICAgIF9ieXRlT2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0cy5sYXN0OwoKICAgIGFzc2VydCgoKF8pID0+IHRydWUpKGRlYnVnUGF0aC5yZW1vdmVMYXN0KCkpKTsKICAgIF9jdXJyZW50TGlicmFyeSA9IG51bGw7CiAgICByZXR1cm4gbGlicmFyeTsKICB9CgogIHZvaWQgX3JlYWRMaWJyYXJ5RGVwZW5kZW5jaWVzKExpYnJhcnkgbGlicmFyeSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBsaWJyYXJ5LmRlcGVuZGVuY2llcy5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGxpYnJhcnkuZGVwZW5kZW5jaWVzW2ldID0gcmVhZExpYnJhcnlEZXBlbmRlbmN5KGxpYnJhcnkpOwogICAgfQogIH0KCiAgTGlicmFyeURlcGVuZGVuY3kgcmVhZExpYnJhcnlEZXBlbmRlbmN5KExpYnJhcnkgbGlicmFyeSkgewogICAgdmFyIGZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEV4cHJlc3Npb25MaXN0KCk7CiAgICB2YXIgdGFyZ2V0TGlicmFyeSA9IHJlYWRMaWJyYXJ5UmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSk7CiAgICB2YXIgcHJlZml4TmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICB2YXIgbmFtZXMgPSByZWFkQ29tYmluYXRvckxpc3QoKTsKICAgIHJldHVybiBuZXcgTGlicmFyeURlcGVuZGVuY3kuYnlSZWZlcmVuY2UoCiAgICAgICAgZmxhZ3MsIGFubm90YXRpb25zLCB0YXJnZXRMaWJyYXJ5LCBwcmVmaXhOYW1lLCBuYW1lcykKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldAogICAgICAuLnBhcmVudCA9IGxpYnJhcnk7CiAgfQoKICB2b2lkIF9yZWFkQWRkaXRpb25hbEV4cG9ydHMoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBpbnQgbnVtRXhwb3J0ZWRSZWZlcmVuY2UgPSByZWFkVUludCgpOwogICAgaWYgKG51bUV4cG9ydGVkUmVmZXJlbmNlICE9IDApIHsKICAgICAgbGlicmFyeS5hZGRpdGlvbmFsRXhwb3J0cy5jbGVhcigpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUV4cG9ydGVkUmVmZXJlbmNlOyBpKyspIHsKICAgICAgICBDYW5vbmljYWxOYW1lIGV4cG9ydGVkTmFtZSA9IHJlYWRDYW5vbmljYWxOYW1lUmVmZXJlbmNlKCk7CiAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGV4cG9ydGVkTmFtZS5nZXRSZWZlcmVuY2UoKTsKICAgICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLmFkZChyZWZlcmVuY2UpOwogICAgICB9CiAgICB9CiAgfQoKICBDb21iaW5hdG9yIHJlYWRDb21iaW5hdG9yKCkgewogICAgdmFyIGlzU2hvdyA9IHJlYWRCeXRlKCkgPT0gMTsKICAgIHZhciBuYW1lcyA9IHJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0KCk7CiAgICByZXR1cm4gbmV3IENvbWJpbmF0b3IoaXNTaG93LCBuYW1lcyk7CiAgfQoKICBMaXN0PENvbWJpbmF0b3I+IHJlYWRDb21iaW5hdG9yTGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxDb21iaW5hdG9yPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PENvbWJpbmF0b3I+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gcmVhZENvbWJpbmF0b3IoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9yZWFkTGlicmFyeVBhcnRzKExpYnJhcnkgbGlicmFyeSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBsaWJyYXJ5LnBhcnRzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgbGlicmFyeS5wYXJ0c1tpXSA9IHJlYWRMaWJyYXJ5UGFydChsaWJyYXJ5KTsKICAgIH0KICB9CgogIExpYnJhcnlQYXJ0IHJlYWRMaWJyYXJ5UGFydChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSByZWFkRXhwcmVzc2lvbkxpc3QoKTsKICAgIFN0cmluZyBwYXJ0VXJpID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgcmV0dXJuIG5ldyBMaWJyYXJ5UGFydChhbm5vdGF0aW9ucywgcGFydFVyaSkuLnBhcmVudCA9IGxpYnJhcnk7CiAgfQoKICBUeXBlZGVmIHJlYWRUeXBlZGVmKCkgewogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBUeXBlZGVmIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgIGlmIChhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzKSB7CiAgICAgIG5vZGUgPSBudWxsOwogICAgfQogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBub2RlID0gbmV3IFR5cGVkZWYobnVsbCwgbnVsbCwgcmVmZXJlbmNlOiByZWZlcmVuY2UpOwogICAgfQogICAgVXJpIGZpbGVVcmkgPSByZWFkVXJpUmVmZXJlbmNlKCk7CiAgICBpbnQgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIFN0cmluZyBuYW1lID0gcmVhZFN0cmluZ1JlZmVyZW5jZSgpOwogICAgbm9kZS5hbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIHJlYWRBbmRQdXNoVHlwZVBhcmFtZXRlckxpc3Qobm9kZS50eXBlUGFyYW1ldGVycywgbm9kZSk7CiAgICB2YXIgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUsIG5vZGUpOwogICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5jbGVhcigpOwogICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5hZGRBbGwocmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpKTsKICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzLmNsZWFyKCk7CiAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5hZGRBbGwocmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpKTsKICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGggPSAwOwogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSAwOwogICAgbm9kZS5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICBub2RlLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgbm9kZS50eXBlID0gdHlwZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQ2xhc3MgcmVhZENsYXNzKGludCBlbmRPZmZzZXQpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuQ2xhc3MpOwoKICAgIC8vIFJlYWQgaW5kZXguCiAgICBpbnQgc2F2ZWRCeXRlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQgLSAoMSkgKiA0OwogICAgaW50IHByb2NlZHVyZUNvdW50ID0gcmVhZFVpbnQzMigpOwogICAgTGlzdDxpbnQ+IHByb2NlZHVyZU9mZnNldHMgPSBuZXcgTGlzdDxpbnQ+KHByb2NlZHVyZUNvdW50ICsgMSk7CiAgICAvLyBUaGVyZSBpcyBhIGZpZWxkIGZvciB0aGUgcHJvY2VkdXJlIGNvdW50LCB0aGF0IG51bWJlciArIDEgKGZvciB0aGUgZW5kKQogICAgLy8gb2Zmc2V0cyAoaS5lLiBwcm9jZWR1cmUgY291bnQgKyAyIGZpZWxkcykuCiAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIChwcm9jZWR1cmVDb3VudCArIDIpICogNDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2VkdXJlQ291bnQgKyAxOyBpKyspIHsKICAgICAgcHJvY2VkdXJlT2Zmc2V0c1tpXSA9IF9jb21wb25lbnRTdGFydE9mZnNldCArIHJlYWRVaW50MzIoKTsKICAgIH0KICAgIF9ieXRlT2Zmc2V0ID0gc2F2ZWRCeXRlT2Zmc2V0OwoKICAgIHZhciBjYW5vbmljYWxOYW1lID0gcmVhZENhbm9uaWNhbE5hbWVSZWZlcmVuY2UoKTsKICAgIHZhciByZWZlcmVuY2UgPSBjYW5vbmljYWxOYW1lLmdldFJlZmVyZW5jZSgpOwogICAgQ2xhc3Mgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgaWYgKGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXMpIHsKICAgICAgbm9kZSA9IG51bGw7CiAgICB9CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgQ2xhc3MocmVmZXJlbmNlOiByZWZlcmVuY2UpCiAgICAgICAgLi5sZXZlbCA9IENsYXNzTGV2ZWwuVGVtcG9yYXJ5CiAgICAgICAgLi5kaXJ0eSA9IGZhbHNlOwogICAgfQoKICAgIHZhciBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgbm9kZS5zdGFydEZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBub2RlLmZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgbm9kZS5mbGFncyA9IGZsYWdzICYgfkNsYXNzLkxldmVsTWFzazsKICAgIGludCBsZXZlbEluZGV4ID0gZmxhZ3MgJiBDbGFzcy5MZXZlbE1hc2s7CiAgICB2YXIgbGV2ZWwgPSBDbGFzc0xldmVsLnZhbHVlc1tsZXZlbEluZGV4ICsgMV07CiAgICBpZiAobGV2ZWwuaW5kZXggPj0gbm9kZS5sZXZlbC5pbmRleCkgewogICAgICBub2RlLmxldmVsID0gbGV2ZWw7CiAgICB9CiAgICB2YXIgbmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKG5vZGUubmFtZSA/PyAnbm9ybWFsLWNsYXNzJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKCiAgICBhc3NlcnQodHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCA9PSAwKTsKCiAgICByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIG5vZGUpOwogICAgdmFyIHN1cGVydHlwZSA9IHJlYWRTdXBlcnR5cGVPcHRpb24oKTsKICAgIHZhciBtaXhlZEluVHlwZSA9IHJlYWRTdXBlcnR5cGVPcHRpb24oKTsKICAgIF9maWxsTm9uVHJlZU5vZGVMaXN0KG5vZGUuaW1wbGVtZW50ZWRUeXBlcywgcmVhZFN1cGVydHlwZSk7CiAgICBpZiAoX2Rpc2FibGVMYXp5Q2xhc3NSZWFkaW5nKSB7CiAgICAgIHJlYWRDbGFzc1BhcnRpYWxDb250ZW50KG5vZGUsIHByb2NlZHVyZU9mZnNldHMpOwogICAgfSBlbHNlIHsKICAgICAgX3NldExhenlMb2FkQ2xhc3Mobm9kZSwgcHJvY2VkdXJlT2Zmc2V0cyk7CiAgICB9CgogICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCA9IDA7CiAgICBhc3NlcnQoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSAhPSBudWxsKTsKICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICBub2RlLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgbm9kZS5zdXBlcnR5cGUgPSBzdXBlcnR5cGU7CiAgICBub2RlLm1peGVkSW5UeXBlID0gbWl4ZWRJblR5cGU7CgogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQ7CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBFeHRlbnNpb24gcmVhZEV4dGVuc2lvbigpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuRXh0ZW5zaW9uKTsKCiAgICBDYW5vbmljYWxOYW1lIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBFeHRlbnNpb24gbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgaWYgKGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXMpIHsKICAgICAgbm9kZSA9IG51bGw7CiAgICB9CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgRXh0ZW5zaW9uKHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgIH0KCiAgICBTdHJpbmcgbmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKG5vZGUubmFtZSA/PyAnZXh0ZW5zaW9uJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKCiAgICBVcmkgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIG5vZGUuZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKCiAgICByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIG5vZGUpOwogICAgRGFydFR5cGUgb25UeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gMDsKCiAgICBub2RlLm5hbWUgPSBuYW1lOwogICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgIG5vZGUub25UeXBlID0gb25UeXBlOwoKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgbm9kZS5tZW1iZXJzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgTmFtZSBuYW1lID0gcmVhZE5hbWUoKTsKICAgICAgaW50IGtpbmQgPSByZWFkQnl0ZSgpOwogICAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgICBDYW5vbmljYWxOYW1lIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgICBub2RlLm1lbWJlcnNbaV0gPSBuZXcgRXh0ZW5zaW9uTWVtYmVyRGVzY3JpcHRvcigKICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICBraW5kOiBFeHRlbnNpb25NZW1iZXJLaW5kLnZhbHVlc1traW5kXSwKICAgICAgICAgIG1lbWJlcjogY2Fub25pY2FsTmFtZS5nZXRSZWZlcmVuY2UoKSkKICAgICAgICAuLmZsYWdzID0gZmxhZ3M7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIC8vLyBSZWFkcyB0aGUgcGFydGlhbCBjb250ZW50IG9mIGEgY2xhc3MsIG5hbWVseSBmaWVsZHMsIHByb2NlZHVyZXMsCiAgLy8vIGNvbnN0cnVjdG9ycyBhbmQgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMuCiAgdm9pZCByZWFkQ2xhc3NQYXJ0aWFsQ29udGVudChDbGFzcyBub2RlLCBMaXN0PGludD4gcHJvY2VkdXJlT2Zmc2V0cykgewogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLmZpZWxkc0ludGVybmFsLCAoaW5kZXgpID0+IHJlYWRGaWVsZCgpLCBub2RlKTsKICAgIF9tZXJnZU5hbWVkTm9kZUxpc3QoCiAgICAgICAgbm9kZS5jb25zdHJ1Y3RvcnNJbnRlcm5hbCwgKGluZGV4KSA9PiByZWFkQ29uc3RydWN0b3IoKSwgbm9kZSk7CgogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLnByb2NlZHVyZXNJbnRlcm5hbCwgKGluZGV4KSB7CiAgICAgIF9ieXRlT2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0c1tpbmRleF07CiAgICAgIHJldHVybiByZWFkUHJvY2VkdXJlKHByb2NlZHVyZU9mZnNldHNbaW5kZXggKyAxXSk7CiAgICB9LCBub2RlKTsKICAgIF9ieXRlT2Zmc2V0ID0gcHJvY2VkdXJlT2Zmc2V0cy5sYXN0OwogICAgX21lcmdlTmFtZWROb2RlTGlzdChub2RlLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0ludGVybmFsLAogICAgICAgIChpbmRleCkgPT4gcmVhZFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKCksIG5vZGUpOwogIH0KCiAgLy8vIFNldCB0aGUgbGF6eUJ1aWxkZXIgb24gdGhlIGNsYXNzIHNvIGl0IGNhbiBiZSBsYXp5IGxvYWRlZCBpbiB0aGUgZnV0dXJlLgogIHZvaWQgX3NldExhenlMb2FkQ2xhc3MoQ2xhc3Mgbm9kZSwgTGlzdDxpbnQ+IHByb2NlZHVyZU9mZnNldHMpIHsKICAgIGZpbmFsIGludCBzYXZlZEJ5dGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIGludCBjb21wb25lbnRTdGFydE9mZnNldCA9IF9jb21wb25lbnRTdGFydE9mZnNldDsKICAgIGZpbmFsIExpYnJhcnkgY3VycmVudExpYnJhcnkgPSBfY3VycmVudExpYnJhcnk7CiAgICBub2RlLmxhenlCdWlsZGVyID0gKCkgewogICAgICBfYnl0ZU9mZnNldCA9IHNhdmVkQnl0ZU9mZnNldDsKICAgICAgX2N1cnJlbnRMaWJyYXJ5ID0gY3VycmVudExpYnJhcnk7CiAgICAgIGFzc2VydCh0eXBlUGFyYW1ldGVyU3RhY2suaXNFbXB0eSk7CiAgICAgIF9jb21wb25lbnRTdGFydE9mZnNldCA9IGNvbXBvbmVudFN0YXJ0T2Zmc2V0OwogICAgICB0eXBlUGFyYW1ldGVyU3RhY2suYWRkQWxsKG5vZGUudHlwZVBhcmFtZXRlcnMpOwoKICAgICAgcmVhZENsYXNzUGFydGlhbENvbnRlbnQobm9kZSwgcHJvY2VkdXJlT2Zmc2V0cyk7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGggPSAwOwogICAgfTsKICB9CgogIGludCBnZXRBbmRSZXNldFRyYW5zZm9ybWVyRmxhZ3MoKSB7CiAgICBpbnQgZmxhZ3MgPSBfdHJhbnNmb3JtZXJGbGFnczsKICAgIF90cmFuc2Zvcm1lckZsYWdzID0gMDsKICAgIHJldHVybiBmbGFnczsKICB9CgogIC8vLyBBZGRzIHRoZSBnaXZlbiBmbGFnIHRvIHRoZSBjdXJyZW50IFtNZW1iZXIudHJhbnNmb3JtZXJGbGFnc10uCiAgdm9pZCBhZGRUcmFuc2Zvcm1lckZsYWcoaW50IGZsYWdzKSB7CiAgICBfdHJhbnNmb3JtZXJGbGFncyB8PSBmbGFnczsKICB9CgogIEZpZWxkIHJlYWRGaWVsZCgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuRmllbGQpOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBGaWVsZCBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBpZiAoYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykgewogICAgICBub2RlID0gbnVsbDsKICAgIH0KICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBGaWVsZChudWxsLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICB9CiAgICB2YXIgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIGludCBmaWxlT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgaW50IGZpbGVFbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQgZmxhZ3MgPSByZWFkVUludCgpOwogICAgdmFyIG5hbWUgPSByZWFkTmFtZSgpOwogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG5vZGUpOwogICAgYXNzZXJ0KCgpIHsKICAgICAgZGVidWdQYXRoLmFkZChub2RlLm5hbWU/Lm5hbWUgPz8gJ2ZpZWxkJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICAgIHZhciB0eXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICB2YXIgaW5pdGlhbGl6ZXIgPSByZWFkRXhwcmVzc2lvbk9wdGlvbigpOwogICAgaW50IHRyYW5zZm9ybWVyRmxhZ3MgPSBnZXRBbmRSZXNldFRyYW5zZm9ybWVyRmxhZ3MoKTsKICAgIGFzc2VydCgoKF8pID0+IHRydWUpKGRlYnVnUGF0aC5yZW1vdmVMYXN0KCkpKTsKICAgIG5vZGUuZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogICAgbm9kZS5mbGFncyA9IGZsYWdzOwogICAgbm9kZS5uYW1lID0gbmFtZTsKICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICBub2RlLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CiAgICBub2RlLnR5cGUgPSB0eXBlOwogICAgbm9kZS5pbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAgbm9kZS5pbml0aWFsaXplcj8ucGFyZW50ID0gbm9kZTsKICAgIG5vZGUudHJhbnNmb3JtZXJGbGFncyA9IHRyYW5zZm9ybWVyRmxhZ3M7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIENvbnN0cnVjdG9yIHJlYWRDb25zdHJ1Y3RvcigpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuQ29uc3RydWN0b3IpOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBDb25zdHJ1Y3RvciBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBpZiAoYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykgewogICAgICBub2RlID0gbnVsbDsKICAgIH0KICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBDb25zdHJ1Y3RvcihudWxsLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICB9CiAgICB2YXIgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIHZhciBzdGFydEZpbGVPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlRW5kT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBuYW1lID0gcmVhZE5hbWUoKTsKICAgIHZhciBhbm5vdGF0aW9ucyA9IHJlYWRBbm5vdGF0aW9uTGlzdChub2RlKTsKICAgIGFzc2VydCgoKSB7CiAgICAgIGRlYnVnUGF0aC5hZGQobm9kZS5uYW1lPy5uYW1lID8/ICdjb25zdHJ1Y3RvcicpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CiAgICB2YXIgZnVuY3Rpb24gPSByZWFkRnVuY3Rpb25Ob2RlKCk7CiAgICBwdXNoVmFyaWFibGVEZWNsYXJhdGlvbnMoZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMpOwogICAgcHVzaFZhcmlhYmxlRGVjbGFyYXRpb25zKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycyk7CiAgICBfZmlsbFRyZWVOb2RlTGlzdChub2RlLmluaXRpYWxpemVycywgKGluZGV4KSA9PiByZWFkSW5pdGlhbGl6ZXIoKSwgbm9kZSk7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IDA7CiAgICB2YXIgdHJhbnNmb3JtZXJGbGFncyA9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgYXNzZXJ0KCgoXykgPT4gdHJ1ZSkoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSkpOwogICAgbm9kZS5zdGFydEZpbGVPZmZzZXQgPSBzdGFydEZpbGVPZmZzZXQ7CiAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgbm9kZS5maWxlRW5kT2Zmc2V0ID0gZmlsZUVuZE9mZnNldDsKICAgIG5vZGUuZmxhZ3MgPSBmbGFnczsKICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICBub2RlLmZpbGVVcmkgPSBmaWxlVXJpOwogICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgbm9kZS5mdW5jdGlvbiA9IGZ1bmN0aW9uLi5wYXJlbnQgPSBub2RlOwogICAgbm9kZS50cmFuc2Zvcm1lckZsYWdzID0gdHJhbnNmb3JtZXJGbGFnczsKICAgIHJldHVybiBub2RlOwogIH0KCiAgUHJvY2VkdXJlIHJlYWRQcm9jZWR1cmUoaW50IGVuZE9mZnNldCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBhc3NlcnQodGFnID09IFRhZy5Qcm9jZWR1cmUpOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBQcm9jZWR1cmUgbm9kZSA9IHJlZmVyZW5jZS5ub2RlOwogICAgaWYgKGFsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXMpIHsKICAgICAgbm9kZSA9IG51bGw7CiAgICB9CiAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgIG5vZGUgPSBuZXcgUHJvY2VkdXJlKG51bGwsIG51bGwsIG51bGwsIHJlZmVyZW5jZTogcmVmZXJlbmNlKTsKICAgIH0KICAgIHZhciBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgdmFyIHN0YXJ0RmlsZU9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIHZhciBmaWxlT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZpbGVFbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBpbnQga2luZEluZGV4ID0gcmVhZEJ5dGUoKTsKICAgIHZhciBraW5kID0gUHJvY2VkdXJlS2luZC52YWx1ZXNba2luZEluZGV4XTsKICAgIHZhciBmbGFncyA9IHJlYWRVSW50KCk7CiAgICB2YXIgbmFtZSA9IHJlYWROYW1lKCk7CiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICBhc3NlcnQoKCkgewogICAgICBkZWJ1Z1BhdGguYWRkKG5vZGUubmFtZT8ubmFtZSA/PyAncHJvY2VkdXJlJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSgpKTsKICAgIGludCBmdW5jdGlvbk5vZGVTaXplID0gZW5kT2Zmc2V0IC0gX2J5dGVPZmZzZXQ7CiAgICAvLyBSZWFkIHNtYWxsIGZhY3RvcmllcyB1cCBmcm9udC4gUG9zdHBvbmUgZXZlcnl0aGluZyBlbHNlLgogICAgYm9vbCByZWFkRnVuY3Rpb25Ob2RlTm93ID0KICAgICAgICAoa2luZCA9PSBQcm9jZWR1cmVLaW5kLkZhY3RvcnkgJiYgZnVuY3Rpb25Ob2RlU2l6ZSA8PSA1MCkgfHwKICAgICAgICAgICAgX2Rpc2FibGVMYXp5UmVhZGluZzsKICAgIHZhciBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlID0KICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSk7CiAgICB2YXIgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2UgPQogICAgICAgIHJlYWRNZW1iZXJSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKTsKICAgIHZhciBmdW5jdGlvbiA9IHJlYWRGdW5jdGlvbk5vZGVPcHRpb24oIXJlYWRGdW5jdGlvbk5vZGVOb3csIGVuZE9mZnNldCk7CiAgICB2YXIgdHJhbnNmb3JtZXJGbGFncyA9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgYXNzZXJ0KCgoXykgPT4gdHJ1ZSkoZGVidWdQYXRoLnJlbW92ZUxhc3QoKSkpOwogICAgbm9kZS5zdGFydEZpbGVPZmZzZXQgPSBzdGFydEZpbGVPZmZzZXQ7CiAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgbm9kZS5maWxlRW5kT2Zmc2V0ID0gZmlsZUVuZE9mZnNldDsKICAgIG5vZGUua2luZCA9IGtpbmQ7CiAgICBub2RlLmZsYWdzID0gZmxhZ3M7CiAgICBub2RlLm5hbWUgPSBuYW1lOwogICAgbm9kZS5maWxlVXJpID0gZmlsZVVyaTsKICAgIG5vZGUuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKICAgIG5vZGUuZnVuY3Rpb24gPSBmdW5jdGlvbjsKICAgIGZ1bmN0aW9uPy5wYXJlbnQgPSBub2RlOwogICAgbm9kZS5zZXRUcmFuc2Zvcm1lckZsYWdzV2l0aG91dExhenlMb2FkaW5nKHRyYW5zZm9ybWVyRmxhZ3MpOwogICAgbm9kZS5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlID0KICAgICAgICBmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0UmVmZXJlbmNlOwogICAgbm9kZS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldFJlZmVyZW5jZSA9CiAgICAgICAgZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2U7CgogICAgYXNzZXJ0KChub2RlLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRSZWZlcmVuY2UgIT0gbnVsbCkgfHwKICAgICAgICAhKG5vZGUuaXNGb3J3YXJkaW5nU3R1YiAmJiBub2RlLmZ1bmN0aW9uLmJvZHkgIT0gbnVsbCkpOwogICAgX2J5dGVPZmZzZXQgPSBlbmRPZmZzZXQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIHJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgYXNzZXJ0KHRhZyA9PSBUYWcuUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IpOwogICAgdmFyIGNhbm9uaWNhbE5hbWUgPSByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpOwogICAgdmFyIHJlZmVyZW5jZSA9IGNhbm9uaWNhbE5hbWUuZ2V0UmVmZXJlbmNlKCk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlID0gcmVmZXJlbmNlLm5vZGU7CiAgICBpZiAoYWx3YXlzQ3JlYXRlTmV3TmFtZWROb2RlcykgewogICAgICBub2RlID0gbnVsbDsKICAgIH0KICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgbm9kZSA9IG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcihudWxsLCByZWZlcmVuY2U6IHJlZmVyZW5jZSk7CiAgICB9CiAgICB2YXIgZmlsZVVyaSA9IHJlYWRVcmlSZWZlcmVuY2UoKTsKICAgIHZhciBmaWxlT2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGZpbGVFbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICB2YXIgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgdmFyIG5hbWUgPSByZWFkTmFtZSgpOwogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG5vZGUpOwogICAgYXNzZXJ0KCgpIHsKICAgICAgZGVidWdQYXRoLmFkZChub2RlLm5hbWU/Lm5hbWUgPz8gJ3JlZGlyZWN0aW5nLWZhY3RvcnktY29uc3RydWN0b3InKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogICAgdmFyIHRhcmdldFJlZmVyZW5jZSA9IHJlYWRNZW1iZXJSZWZlcmVuY2UoKTsKICAgIHZhciB0eXBlQXJndW1lbnRzID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgaW50IHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodCA9IHR5cGVQYXJhbWV0ZXJTdGFjay5sZW5ndGg7CiAgICB2YXIgdHlwZVBhcmFtZXRlcnMgPSByZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0KCk7CiAgICByZWFkVUludCgpOyAvLyBUb3RhbCBwYXJhbWV0ZXIgY291bnQuCiAgICB2YXIgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IHJlYWRVSW50KCk7CiAgICBpbnQgdmFyaWFibGVTdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgdmFyIHBvc2l0aW9uYWwgPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCk7CiAgICB2YXIgbmFtZWQgPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCk7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0OwogICAgZGVidWdQYXRoLnJlbW92ZUxhc3QoKTsKICAgIG5vZGUuZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICBub2RlLmZpbGVFbmRPZmZzZXQgPSBmaWxlRW5kT2Zmc2V0OwogICAgbm9kZS5mbGFncyA9IGZsYWdzOwogICAgbm9kZS5uYW1lID0gbmFtZTsKICAgIG5vZGUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICBub2RlLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CiAgICBub2RlLnRhcmdldFJlZmVyZW5jZSA9IHRhcmdldFJlZmVyZW5jZTsKICAgIG5vZGUudHlwZUFyZ3VtZW50cy5hZGRBbGwodHlwZUFyZ3VtZW50cyk7CiAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CiAgICBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycyA9IHBvc2l0aW9uYWw7CiAgICBub2RlLm5hbWVkUGFyYW1ldGVycyA9IG5hbWVkOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBJbml0aWFsaXplciByZWFkSW5pdGlhbGl6ZXIoKSB7CiAgICBpbnQgdGFnID0gcmVhZEJ5dGUoKTsKICAgIGJvb2wgaXNTeW50aGV0aWMgPSByZWFkQnl0ZSgpID09IDE7CiAgICBzd2l0Y2ggKHRhZykgewogICAgICBjYXNlIFRhZy5JbnZhbGlkSW5pdGlhbGl6ZXI6CiAgICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkSW5pdGlhbGl6ZXIoKTsKICAgICAgY2FzZSBUYWcuRmllbGRJbml0aWFsaXplcjoKICAgICAgICB2YXIgcmVmZXJlbmNlID0gcmVhZE1lbWJlclJlZmVyZW5jZSgpOwogICAgICAgIHZhciB2YWx1ZSA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZEluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgdmFsdWUpCiAgICAgICAgICAuLmlzU3ludGhldGljID0gaXNTeW50aGV0aWM7CiAgICAgIGNhc2UgVGFnLlN1cGVySW5pdGlhbGl6ZXI6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgcmVmZXJlbmNlID0gcmVhZE1lbWJlclJlZmVyZW5jZSgpOwogICAgICAgIHZhciBhcmd1bWVudHMgPSByZWFkQXJndW1lbnRzKCk7CiAgICAgICAgcmV0dXJuIG5ldyBTdXBlckluaXRpYWxpemVyLmJ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgYXJndW1lbnRzKQogICAgICAgICAgLi5pc1N5bnRoZXRpYyA9IGlzU3ludGhldGljCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlJlZGlyZWN0aW5nSW5pdGlhbGl6ZXI6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWRNZW1iZXJSZWZlcmVuY2UoKSwgcmVhZEFyZ3VtZW50cygpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Mb2NhbEluaXRpYWxpemVyOgogICAgICAgIHJldHVybiBuZXcgTG9jYWxJbml0aWFsaXplcihyZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb24oKSk7CiAgICAgIGNhc2UgVGFnLkFzc2VydEluaXRpYWxpemVyOgogICAgICAgIHJldHVybiBuZXcgQXNzZXJ0SW5pdGlhbGl6ZXIocmVhZFN0YXRlbWVudCgpKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIGluaXRpYWxpemVyIHRhZzogJHRhZycpOwogICAgfQogIH0KCiAgRnVuY3Rpb25Ob2RlIHJlYWRGdW5jdGlvbk5vZGVPcHRpb24oYm9vbCBsYXp5TG9hZEJvZHksIGludCBvdXRlckVuZE9mZnNldCkgewogICAgcmV0dXJuIHJlYWRBbmRDaGVja09wdGlvblRhZygpCiAgICAgICAgPyByZWFkRnVuY3Rpb25Ob2RlKAogICAgICAgICAgICBsYXp5TG9hZEJvZHk6IGxhenlMb2FkQm9keSwgb3V0ZXJFbmRPZmZzZXQ6IG91dGVyRW5kT2Zmc2V0KQogICAgICAgIDogbnVsbDsKICB9CgogIEZ1bmN0aW9uTm9kZSByZWFkRnVuY3Rpb25Ob2RlKAogICAgICB7Ym9vbCBsYXp5TG9hZEJvZHk6IGZhbHNlLCBpbnQgb3V0ZXJFbmRPZmZzZXQ6IC0xfSkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBhc3NlcnQodGFnID09IFRhZy5GdW5jdGlvbk5vZGUpOwogICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgIGludCBlbmRPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICBBc3luY01hcmtlciBhc3luY01hcmtlciA9IEFzeW5jTWFya2VyLnZhbHVlc1tyZWFkQnl0ZSgpXTsKICAgIEFzeW5jTWFya2VyIGRhcnRBc3luY01hcmtlciA9IEFzeW5jTWFya2VyLnZhbHVlc1tyZWFkQnl0ZSgpXTsKICAgIGludCB0eXBlUGFyYW1ldGVyU3RhY2tIZWlnaHQgPSB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoOwogICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdCgpOwogICAgcmVhZFVJbnQoKTsgLy8gdG90YWwgcGFyYW1ldGVyIGNvdW50LgogICAgdmFyIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPSByZWFkVUludCgpOwogICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgIHZhciBwb3NpdGlvbmFsID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgdmFyIG5hbWVkID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgdmFyIHJldHVyblR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgIGludCBvbGRMYWJlbFN0YWNrQmFzZSA9IGxhYmVsU3RhY2tCYXNlOwogICAgaW50IG9sZFN3aXRjaENhc2VTdGFja0Jhc2UgPSBzd2l0Y2hDYXNlU3RhY2tCYXNlOwoKICAgIGlmIChsYXp5TG9hZEJvZHkgJiYgb3V0ZXJFbmRPZmZzZXQgPiAwKSB7CiAgICAgIGxhenlMb2FkQm9keSA9IG91dGVyRW5kT2Zmc2V0IC0gX2J5dGVPZmZzZXQgPgogICAgICAgICAgMjsgLy8gZS5nLiBvdXRsaW5lIGhhcyBUYWcuU29tZXRoaW5nIGFuZCBUYWcuRW1wdHlTdGF0ZW1lbnQKICAgIH0KCiAgICB2YXIgYm9keTsKICAgIGlmICghbGF6eUxvYWRCb2R5KSB7CiAgICAgIGxhYmVsU3RhY2tCYXNlID0gbGFiZWxTdGFjay5sZW5ndGg7CiAgICAgIHN3aXRjaENhc2VTdGFja0Jhc2UgPSBzd2l0Y2hDYXNlU3RhY2subGVuZ3RoOwogICAgICBib2R5ID0gcmVhZFN0YXRlbWVudE9wdGlvbigpOwogICAgfQoKICAgIEZ1bmN0aW9uTm9kZSByZXN1bHQgPSBuZXcgRnVuY3Rpb25Ob2RlKGJvZHksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWwsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICByZXR1cm5UeXBlOiByZXR1cm5UeXBlLAogICAgICAgIGFzeW5jTWFya2VyOiBhc3luY01hcmtlciwKICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IGRhcnRBc3luY01hcmtlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGVuZE9mZnNldDsKCiAgICBpZiAobGF6eUxvYWRCb2R5KSB7CiAgICAgIF9zZXRMYXp5TG9hZEZ1bmN0aW9uKHJlc3VsdCwgb2xkTGFiZWxTdGFja0Jhc2UsIG9sZFN3aXRjaENhc2VTdGFja0Jhc2UsCiAgICAgICAgICB2YXJpYWJsZVN0YWNrSGVpZ2h0KTsKICAgIH0KCiAgICBsYWJlbFN0YWNrQmFzZSA9IG9sZExhYmVsU3RhY2tCYXNlOwogICAgc3dpdGNoQ2FzZVN0YWNrQmFzZSA9IG9sZFN3aXRjaENhc2VTdGFja0Jhc2U7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0OwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIF9zZXRMYXp5TG9hZEZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSByZXN1bHQsIGludCBvbGRMYWJlbFN0YWNrQmFzZSwKICAgICAgaW50IG9sZFN3aXRjaENhc2VTdGFja0Jhc2UsIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0KSB7CiAgICBmaW5hbCBpbnQgc2F2ZWRCeXRlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCBpbnQgY29tcG9uZW50U3RhcnRPZmZzZXQgPSBfY29tcG9uZW50U3RhcnRPZmZzZXQ7CiAgICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlclN0YWNrLnRvTGlzdCgpOwogICAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPSB2YXJpYWJsZVN0YWNrLnRvTGlzdCgpOwogICAgZmluYWwgTGlicmFyeSBjdXJyZW50TGlicmFyeSA9IF9jdXJyZW50TGlicmFyeTsKICAgIHJlc3VsdC5sYXp5QnVpbGRlciA9ICgpIHsKICAgICAgX2J5dGVPZmZzZXQgPSBzYXZlZEJ5dGVPZmZzZXQ7CiAgICAgIF9jdXJyZW50TGlicmFyeSA9IGN1cnJlbnRMaWJyYXJ5OwogICAgICB0eXBlUGFyYW1ldGVyU3RhY2suY2xlYXIoKTsKICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmFkZEFsbCh0eXBlUGFyYW1ldGVycyk7CiAgICAgIHZhcmlhYmxlU3RhY2suY2xlYXIoKTsKICAgICAgdmFyaWFibGVTdGFjay5hZGRBbGwodmFyaWFibGVzKTsKICAgICAgX2NvbXBvbmVudFN0YXJ0T2Zmc2V0ID0gY29tcG9uZW50U3RhcnRPZmZzZXQ7CgogICAgICByZXN1bHQuYm9keSA9IHJlYWRTdGF0ZW1lbnRPcHRpb24oKTsKICAgICAgcmVzdWx0LmJvZHk/LnBhcmVudCA9IHJlc3VsdDsKICAgICAgbGFiZWxTdGFja0Jhc2UgPSBvbGRMYWJlbFN0YWNrQmFzZTsKICAgICAgc3dpdGNoQ2FzZVN0YWNrQmFzZSA9IG9sZFN3aXRjaENhc2VTdGFja0Jhc2U7CiAgICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gdmFyaWFibGVTdGFja0hlaWdodDsKICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmNsZWFyKCk7CiAgICAgIGlmIChyZXN1bHQucGFyZW50IGlzIFByb2NlZHVyZSkgewogICAgICAgIFByb2NlZHVyZSBwYXJlbnQgPSByZXN1bHQucGFyZW50OwogICAgICAgIHBhcmVudC50cmFuc2Zvcm1lckZsYWdzIHw9IGdldEFuZFJlc2V0VHJhbnNmb3JtZXJGbGFncygpOwogICAgICB9CiAgICB9OwogIH0KCiAgdm9pZCBwdXNoVmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7CiAgfQoKICB2b2lkIHB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucyhMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcykgewogICAgdmFyaWFibGVTdGFjay5hZGRBbGwodmFyaWFibGVzKTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlUmVmZXJlbmNlKCkgewogICAgaW50IGluZGV4ID0gcmVhZFVJbnQoKTsKICAgIGlmIChpbmRleCA+PSB2YXJpYWJsZVN0YWNrLmxlbmd0aCkgewogICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIHZhcmlhYmxlIGluZGV4OiAkaW5kZXgnKTsKICAgIH0KICAgIHJldHVybiB2YXJpYWJsZVN0YWNrW2luZGV4XTsKICB9CgogIFN0cmluZyBsb2dpY2FsT3BlcmF0b3JUb1N0cmluZyhpbnQgaW5kZXgpIHsKICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiAnJiYnOwogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuICd8fCc7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbCgndW5leHBlY3RlZCBsb2dpY2FsIG9wZXJhdG9yIGluZGV4OiAkaW5kZXgnKTsKICAgIH0KICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcmVhZEV4cHJlc3Npb25MaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkRXhwcmVzc2lvbigpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb25PcHRpb24oKSB7CiAgICByZXR1cm4gcmVhZEFuZENoZWNrT3B0aW9uVGFnKCkgPyByZWFkRXhwcmVzc2lvbigpIDogbnVsbDsKICB9CgogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb24oKSB7CiAgICBpbnQgdGFnQnl0ZSA9IHJlYWRCeXRlKCk7CiAgICBpbnQgdGFnID0gdGFnQnl0ZSAmIFRhZy5TcGVjaWFsaXplZFRhZ0hpZ2hCaXQgPT0gMAogICAgICAgID8gdGFnQnl0ZQogICAgICAgIDogKHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRUYWdNYXNrKTsKICAgIHN3aXRjaCAodGFnKSB7CiAgICAgIGNhc2UgVGFnLkxvYWRMaWJyYXJ5OgogICAgICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnkocmVhZExpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlKCkpOwogICAgICBjYXNlIFRhZy5DaGVja0xpYnJhcnlJc0xvYWRlZDoKICAgICAgICByZXR1cm4gbmV3IENoZWNrTGlicmFyeUlzTG9hZGVkKHJlYWRMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZSgpKTsKICAgICAgY2FzZSBUYWcuSW52YWxpZEV4cHJlc3Npb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IEludmFsaWRFeHByZXNzaW9uKHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlZhcmlhYmxlR2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmVhZFVJbnQoKTsgLy8gb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiB0aGUgYmluYXJ5LgogICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQocmVhZFZhcmlhYmxlUmVmZXJlbmNlKCksIHJlYWREYXJ0VHlwZU9wdGlvbigpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TcGVjaWFsaXplZFZhcmlhYmxlR2V0OgogICAgICAgIGludCBpbmRleCA9IHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzazsKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJlYWRVSW50KCk7IC8vIG9mZnNldCBvZiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gdGhlIGJpbmFyeS4KICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlU3RhY2tbaW5kZXhdKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuVmFyaWFibGVTZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZWFkVUludCgpOyAvLyBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIHRoZSBiaW5hcnkuCiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVNldChyZWFkVmFyaWFibGVSZWZlcmVuY2UoKSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuU3BlY2lhbGl6ZWRWYXJpYWJsZVNldDoKICAgICAgICBpbnQgaW5kZXggPSB0YWdCeXRlICYgVGFnLlNwZWNpYWxpemVkUGF5bG9hZE1hc2s7CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZWFkVUludCgpOyAvLyBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIHRoZSBiaW5hcnkuCiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVNldCh2YXJpYWJsZVN0YWNrW2luZGV4XSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuUHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTmFtZSgpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZShyZWFkRXhwcmVzc2lvbigpLCByZWFkTmFtZSgpLAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN1cGVyUHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBhZGRUcmFuc2Zvcm1lckZsYWcoVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHMpOwogICAgICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE5hbWUoKSwgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TdXBlclByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgYWRkVHJhbnNmb3JtZXJGbGFnKFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzKTsKICAgICAgICByZXR1cm4gbmV3IFN1cGVyUHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWROYW1lKCksIHJlYWRFeHByZXNzaW9uKCksIHJlYWRNZW1iZXJSZWZlcmVuY2UoYWxsb3dOdWxsOiB0cnVlKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRGlyZWN0UHJvcGVydHlHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkRpcmVjdFByb3BlcnR5U2V0OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZEV4cHJlc3Npb24oKSwgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkRXhwcmVzc2lvbigpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TdGF0aWNHZXQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0dldC5ieVJlZmVyZW5jZShyZWFkTWVtYmVyUmVmZXJlbmNlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN0YXRpY1NldDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RhdGljU2V0LmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRFeHByZXNzaW9uKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLk1ldGhvZEludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UocmVhZEV4cHJlc3Npb24oKSwgcmVhZE5hbWUoKSwKICAgICAgICAgICAgcmVhZEFyZ3VtZW50cygpLCByZWFkTWVtYmVyUmVmZXJlbmNlKGFsbG93TnVsbDogdHJ1ZSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlN1cGVyTWV0aG9kSW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGFkZFRyYW5zZm9ybWVyRmxhZyhUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscyk7CiAgICAgICAgcmV0dXJuIG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWROYW1lKCksIHJlYWRBcmd1bWVudHMoKSwgcmVhZE1lbWJlclJlZmVyZW5jZShhbGxvd051bGw6IHRydWUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuU3RhdGljSW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkQXJndW1lbnRzKCksCiAgICAgICAgICAgIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdFN0YXRpY0ludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0ludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgICAgIHJlYWRNZW1iZXJSZWZlcmVuY2UoKSwgcmVhZEFyZ3VtZW50cygpLAogICAgICAgICAgICBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdHJ1Y3Rvckludm9jYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICAgICAgcmVhZE1lbWJlclJlZmVyZW5jZSgpLCByZWFkQXJndW1lbnRzKCksCiAgICAgICAgICAgIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdENvbnN0cnVjdG9ySW52b2NhdGlvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICAgICAgICByZWFkTWVtYmVyUmVmZXJlbmNlKCksIHJlYWRBcmd1bWVudHMoKSwKICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTm90OgogICAgICAgIHJldHVybiBuZXcgTm90KHJlYWRFeHByZXNzaW9uKCkpOwogICAgICBjYXNlIFRhZy5OdWxsQ2hlY2s6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IE51bGxDaGVjayhyZWFkRXhwcmVzc2lvbigpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTG9naWNhbEV4cHJlc3Npb246CiAgICAgICAgcmV0dXJuIG5ldyBMb2dpY2FsRXhwcmVzc2lvbihyZWFkRXhwcmVzc2lvbigpLAogICAgICAgICAgICBsb2dpY2FsT3BlcmF0b3JUb1N0cmluZyhyZWFkQnl0ZSgpKSwgcmVhZEV4cHJlc3Npb24oKSk7CiAgICAgIGNhc2UgVGFnLkNvbmRpdGlvbmFsRXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihyZWFkRXhwcmVzc2lvbigpLCByZWFkRXhwcmVzc2lvbigpLAogICAgICAgICAgICByZWFkRXhwcmVzc2lvbigpLCByZWFkRGFydFR5cGVPcHRpb24oKSk7CiAgICAgIGNhc2UgVGFnLlN0cmluZ0NvbmNhdGVuYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24ocmVhZEV4cHJlc3Npb25MaXN0KCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkxpc3RDb25jYXRlbmF0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTGlzdENvbmNhdGVuYXRpb24ocmVhZEV4cHJlc3Npb25MaXN0KCksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudDogdHlwZUFyZ3VtZW50KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TZXRDb25jYXRlbmF0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgU2V0Q29uY2F0ZW5hdGlvbihyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLk1hcENvbmNhdGVuYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIga2V5VHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHZhciB2YWx1ZVR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICByZXR1cm4gbmV3IE1hcENvbmNhdGVuYXRpb24ocmVhZEV4cHJlc3Npb25MaXN0KCksCiAgICAgICAgICAgIGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5JbnN0YW5jZUNyZWF0aW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgUmVmZXJlbmNlIGNsYXNzUmVmZXJlbmNlID0gcmVhZENsYXNzUmVmZXJlbmNlKCk7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IHJlYWREYXJ0VHlwZUxpc3QoKTsKICAgICAgICBpbnQgZmllbGRWYWx1ZUNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBNYXA8UmVmZXJlbmNlLCBFeHByZXNzaW9uPiBmaWVsZFZhbHVlcyA9IDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+e307CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlQ291bnQ7IGkrKykgewogICAgICAgICAgZmluYWwgUmVmZXJlbmNlIGZpZWxkUmVmID0KICAgICAgICAgICAgICByZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZSgpLmdldFJlZmVyZW5jZSgpOwogICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgICBmaWVsZFZhbHVlc1tmaWVsZFJlZl0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgaW50IGFzc2VydENvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBMaXN0PEFzc2VydFN0YXRlbWVudD4gYXNzZXJ0cyA9IG5ldyBMaXN0PEFzc2VydFN0YXRlbWVudD4oYXNzZXJ0Q291bnQpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXNzZXJ0Q291bnQ7IGkrKykgewogICAgICAgICAgYXNzZXJ0c1tpXSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgICAgICB9CiAgICAgICAgTGlzdDxFeHByZXNzaW9uPiB1bnVzZWRBcmd1bWVudHMgPSByZWFkRXhwcmVzc2lvbkxpc3QoKTsKICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlQ3JlYXRpb24oY2xhc3NSZWZlcmVuY2UsIHR5cGVBcmd1bWVudHMsIGZpZWxkVmFsdWVzLAogICAgICAgICAgICBhc3NlcnRzLCB1bnVzZWRBcmd1bWVudHMpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkZpbGVVcmlFeHByZXNzaW9uOgogICAgICAgIFVyaSBmaWxlVXJpID0gcmVhZFVyaVJlZmVyZW5jZSgpOwogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBGaWxlVXJpRXhwcmVzc2lvbihyZWFkRXhwcmVzc2lvbigpLCBmaWxlVXJpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Jc0V4cHJlc3Npb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBpbnQgZmxhZ3MgPSByZWFkQnl0ZSgpOwogICAgICAgIHJldHVybiBuZXcgSXNFeHByZXNzaW9uKHJlYWRFeHByZXNzaW9uKCksIHJlYWREYXJ0VHlwZSgpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgICAuLmZsYWdzID0gZmxhZ3M7CiAgICAgIGNhc2UgVGFnLkFzRXhwcmVzc2lvbjoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBBc0V4cHJlc3Npb24ocmVhZEV4cHJlc3Npb24oKSwgcmVhZERhcnRUeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQKICAgICAgICAgIC4uZmxhZ3MgPSBmbGFnczsKICAgICAgY2FzZSBUYWcuU3RyaW5nTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwocmVhZFN0cmluZ1JlZmVyZW5jZSgpKTsKICAgICAgY2FzZSBUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsOgogICAgICAgIGludCBiaWFzZWRWYWx1ZSA9IHRhZ0J5dGUgJiBUYWcuU3BlY2lhbGl6ZWRQYXlsb2FkTWFzazsKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwoYmlhc2VkVmFsdWUgLSBUYWcuU3BlY2lhbGl6ZWRJbnRMaXRlcmFsQmlhcyk7CiAgICAgIGNhc2UgVGFnLlBvc2l0aXZlSW50TGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwocmVhZFVJbnQoKSk7CiAgICAgIGNhc2UgVGFnLk5lZ2F0aXZlSW50TGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwoLXJlYWRVSW50KCkpOwogICAgICBjYXNlIFRhZy5CaWdJbnRMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgSW50TGl0ZXJhbChpbnQucGFyc2UocmVhZFN0cmluZ1JlZmVyZW5jZSgpKSk7CiAgICAgIGNhc2UgVGFnLkRvdWJsZUxpdGVyYWw6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKHJlYWREb3VibGUoKSk7CiAgICAgIGNhc2UgVGFnLlRydWVMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWwodHJ1ZSk7CiAgICAgIGNhc2UgVGFnLkZhbHNlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IEJvb2xMaXRlcmFsKGZhbHNlKTsKICAgICAgY2FzZSBUYWcuTnVsbExpdGVyYWw6CiAgICAgICAgcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbCgpOwogICAgICBjYXNlIFRhZy5TeW1ib2xMaXRlcmFsOgogICAgICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbChyZWFkU3RyaW5nUmVmZXJlbmNlKCkpOwogICAgICBjYXNlIFRhZy5UeXBlTGl0ZXJhbDoKICAgICAgICByZXR1cm4gbmV3IFR5cGVMaXRlcmFsKHJlYWREYXJ0VHlwZSgpKTsKICAgICAgY2FzZSBUYWcuVGhpc0V4cHJlc3Npb246CiAgICAgICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpOwogICAgICBjYXNlIFRhZy5SZXRocm93OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZXRocm93KCkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLlRocm93OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBUaHJvdyhyZWFkRXhwcmVzc2lvbigpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGlzdExpdGVyYWw6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbChyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdExpc3RMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTGlzdExpdGVyYWwocmVhZEV4cHJlc3Npb25MaXN0KCksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudDogdHlwZUFyZ3VtZW50LCBpc0NvbnN0OiB0cnVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5TZXRMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIHR5cGVBcmd1bWVudCA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgU2V0TGl0ZXJhbChyZWFkRXhwcmVzc2lvbkxpc3QoKSwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50OiB0eXBlQXJndW1lbnQsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db25zdFNldExpdGVyYWw6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdHlwZUFyZ3VtZW50ID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXRMaXRlcmFsKHJlYWRFeHByZXNzaW9uTGlzdCgpLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCwgaXNDb25zdDogdHJ1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTWFwTGl0ZXJhbDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBrZXlUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgTWFwTGl0ZXJhbChyZWFkTWFwRW50cnlMaXN0KCksCiAgICAgICAgICAgIGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLCBpc0NvbnN0OiBmYWxzZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuQ29uc3RNYXBMaXRlcmFsOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgdmFyIGtleVR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB2YXIgdmFsdWVUeXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBNYXBMaXRlcmFsKHJlYWRNYXBFbnRyeUxpc3QoKSwKICAgICAgICAgICAga2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIGlzQ29uc3Q6IHRydWUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLkF3YWl0RXhwcmVzc2lvbjoKICAgICAgICByZXR1cm4gbmV3IEF3YWl0RXhwcmVzc2lvbihyZWFkRXhwcmVzc2lvbigpKTsKICAgICAgY2FzZSBUYWcuRnVuY3Rpb25FeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24ocmVhZEZ1bmN0aW9uTm9kZSgpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuTGV0OgogICAgICAgIHZhciB2YXJpYWJsZSA9IHJlYWRWYXJpYWJsZURlY2xhcmF0aW9uKCk7CiAgICAgICAgaW50IHN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICAgICAgcHVzaFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGUpOwogICAgICAgIHZhciBib2R5ID0gcmVhZEV4cHJlc3Npb24oKTsKICAgICAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgTGV0KHZhcmlhYmxlLCBib2R5KTsKICAgICAgY2FzZSBUYWcuQmxvY2tFeHByZXNzaW9uOgogICAgICAgIGludCBzdGFja0hlaWdodCA9IHZhcmlhYmxlU3RhY2subGVuZ3RoOwogICAgICAgIHZhciBzdGF0ZW1lbnRzID0gcmVhZFN0YXRlbWVudExpc3QoKTsKICAgICAgICB2YXIgdmFsdWUgPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gc3RhY2tIZWlnaHQ7CiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0V4cHJlc3Npb24obmV3IEJsb2NrKHN0YXRlbWVudHMpLCB2YWx1ZSk7CiAgICAgIGNhc2UgVGFnLkluc3RhbnRpYXRpb246CiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSByZWFkRXhwcmVzc2lvbigpOwogICAgICAgIHZhciB0eXBlQXJndW1lbnRzID0gcmVhZERhcnRUeXBlTGlzdCgpOwogICAgICAgIHJldHVybiBuZXcgSW5zdGFudGlhdGlvbihleHByZXNzaW9uLCB0eXBlQXJndW1lbnRzKTsKICAgICAgY2FzZSBUYWcuQ29uc3RhbnRFeHByZXNzaW9uOgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gcmVhZENvbnN0YW50UmVmZXJlbmNlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudEV4cHJlc3Npb24oY29uc3RhbnQsIHR5cGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IGZhaWwoJ3VuZXhwZWN0ZWQgZXhwcmVzc2lvbiB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8TWFwRW50cnk+IHJlYWRNYXBFbnRyeUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TWFwRW50cnk+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8TWFwRW50cnk+LmZpbGxlZChsZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gcmVhZE1hcEVudHJ5KCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTWFwRW50cnkgcmVhZE1hcEVudHJ5KCkgewogICAgcmV0dXJuIG5ldyBNYXBFbnRyeShyZWFkRXhwcmVzc2lvbigpLCByZWFkRXhwcmVzc2lvbigpKTsKICB9CgogIExpc3Q8U3RhdGVtZW50PiByZWFkU3RhdGVtZW50TGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8U3RhdGVtZW50Pi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHkoKSB7CiAgICB2YXIgbm9kZSA9IHJlYWRTdGF0ZW1lbnQoKTsKICAgIGlmIChub2RlIGlzIEVtcHR5U3RhdGVtZW50KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudE9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRTdGF0ZW1lbnQoKSA6IG51bGw7CiAgfQoKICBTdGF0ZW1lbnQgcmVhZFN0YXRlbWVudCgpIHsKICAgIGludCB0YWcgPSByZWFkQnl0ZSgpOwogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBUYWcuRXhwcmVzc2lvblN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQocmVhZEV4cHJlc3Npb24oKSk7CiAgICAgIGNhc2UgVGFnLkJsb2NrOgogICAgICAgIHJldHVybiByZWFkQmxvY2soKTsKICAgICAgY2FzZSBUYWcuQXNzZXJ0QmxvY2s6CiAgICAgICAgcmV0dXJuIHJlYWRBc3NlcnRCbG9jaygpOwogICAgICBjYXNlIFRhZy5FbXB0eVN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICAgIGNhc2UgVGFnLkFzc2VydFN0YXRlbWVudDoKICAgICAgICByZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudChyZWFkRXhwcmVzc2lvbigpLAogICAgICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogcmVhZE9mZnNldCgpLAogICAgICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IHJlYWRPZmZzZXQoKSwKICAgICAgICAgICAgbWVzc2FnZTogcmVhZEV4cHJlc3Npb25PcHRpb24oKSk7CiAgICAgIGNhc2UgVGFnLkxhYmVsZWRTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIGxhYmVsID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQobnVsbCk7CiAgICAgICAgbGFiZWxTdGFjay5hZGQobGFiZWwpOwogICAgICAgIGxhYmVsLmJvZHkgPSByZWFkU3RhdGVtZW50KCkuLnBhcmVudCA9IGxhYmVsOwogICAgICAgIGxhYmVsU3RhY2sucmVtb3ZlTGFzdCgpOwogICAgICAgIHJldHVybiBsYWJlbDsKICAgICAgY2FzZSBUYWcuQnJlYWtTdGF0ZW1lbnQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgICAgIHJldHVybiBuZXcgQnJlYWtTdGF0ZW1lbnQobGFiZWxTdGFja1tsYWJlbFN0YWNrQmFzZSArIGluZGV4XSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuV2hpbGVTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFdoaWxlU3RhdGVtZW50KHJlYWRFeHByZXNzaW9uKCksIHJlYWRTdGF0ZW1lbnQoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRG9TdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IERvU3RhdGVtZW50KHJlYWRTdGF0ZW1lbnQoKSwgcmVhZEV4cHJlc3Npb24oKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuRm9yU3RhdGVtZW50OgogICAgICAgIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdmFyaWFibGVzID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCgpOwogICAgICAgIHZhciBjb25kaXRpb24gPSByZWFkRXhwcmVzc2lvbk9wdGlvbigpOwogICAgICAgIHZhciB1cGRhdGVzID0gcmVhZEV4cHJlc3Npb25MaXN0KCk7CiAgICAgICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRm9yU3RhdGVtZW50KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCBib2R5KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Gb3JJblN0YXRlbWVudDoKICAgICAgY2FzZSBUYWcuQXN5bmNGb3JJblN0YXRlbWVudDoKICAgICAgICBib29sIGlzQXN5bmMgPSB0YWcgPT0gVGFnLkFzeW5jRm9ySW5TdGF0ZW1lbnQ7CiAgICAgICAgaW50IHZhcmlhYmxlU3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciBib2R5T2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIHZhciB2YXJpYWJsZSA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgICAgIHZhciBpdGVyYWJsZSA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSB2YXJpYWJsZVN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRm9ySW5TdGF0ZW1lbnQodmFyaWFibGUsIGl0ZXJhYmxlLCBib2R5LCBpc0FzeW5jOiBpc0FzeW5jKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgICAuLmJvZHlPZmZzZXQgPSBib2R5T2Zmc2V0OwogICAgICBjYXNlIFRhZy5Td2l0Y2hTdGF0ZW1lbnQ6CiAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHJlYWRFeHByZXNzaW9uKCk7CiAgICAgICAgaW50IGNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICBMaXN0PFN3aXRjaENhc2U+IGNhc2VzID0KICAgICAgICAgICAgbmV3IExpc3Q8U3dpdGNoQ2FzZT4uZmlsbGVkKGNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICBjYXNlc1tpXSA9IG5ldyBTd2l0Y2hDYXNlLmVtcHR5KCk7CiAgICAgICAgfQogICAgICAgIHN3aXRjaENhc2VTdGFjay5hZGRBbGwoY2FzZXMpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHJlYWRTd2l0Y2hDYXNlSW50byhjYXNlc1tpXSk7CiAgICAgICAgfQogICAgICAgIHN3aXRjaENhc2VTdGFjay5sZW5ndGggLT0gY291bnQ7CiAgICAgICAgcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQoZXhwcmVzc2lvbiwgY2FzZXMpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5Db250aW51ZVN3aXRjaFN0YXRlbWVudDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBpbmRleCA9IHJlYWRVSW50KCk7CiAgICAgICAgcmV0dXJuIG5ldyBDb250aW51ZVN3aXRjaFN0YXRlbWVudCgKICAgICAgICAgICAgc3dpdGNoQ2FzZVN0YWNrW3N3aXRjaENhc2VTdGFja0Jhc2UgKyBpbmRleF0pCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGNhc2UgVGFnLklmU3RhdGVtZW50OgogICAgICAgIGludCBvZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAgICAgcmV0dXJuIG5ldyBJZlN0YXRlbWVudCgKICAgICAgICAgICAgcmVhZEV4cHJlc3Npb24oKSwgcmVhZFN0YXRlbWVudCgpLCByZWFkU3RhdGVtZW50T3JOdWxsSWZFbXB0eSgpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICBjYXNlIFRhZy5SZXR1cm5TdGF0ZW1lbnQ6CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudChyZWFkRXhwcmVzc2lvbk9wdGlvbigpKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuVHJ5Q2F0Y2g6CiAgICAgICAgU3RhdGVtZW50IGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICAgICAgaW50IGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgICAgICByZXR1cm4gbmV3IFRyeUNhdGNoKGJvZHksIHJlYWRDYXRjaExpc3QoKSwgaXNTeW50aGV0aWM6IGZsYWdzICYgMiA9PSAyKTsKICAgICAgY2FzZSBUYWcuVHJ5RmluYWxseToKICAgICAgICByZXR1cm4gbmV3IFRyeUZpbmFsbHkocmVhZFN0YXRlbWVudCgpLCByZWFkU3RhdGVtZW50KCkpOwogICAgICBjYXNlIFRhZy5ZaWVsZFN0YXRlbWVudDoKICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBZaWVsZFN0YXRlbWVudChyZWFkRXhwcmVzc2lvbigpLAogICAgICAgICAgICBpc1lpZWxkU3RhcjogZmxhZ3MgJiBZaWVsZFN0YXRlbWVudC5GbGFnWWllbGRTdGFyICE9IDAsCiAgICAgICAgICAgIGlzTmF0aXZlOiBmbGFncyAmIFlpZWxkU3RhdGVtZW50LkZsYWdOYXRpdmUgIT0gMCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgY2FzZSBUYWcuVmFyaWFibGVEZWNsYXJhdGlvbjoKICAgICAgICB2YXIgdmFyaWFibGUgPSByZWFkVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsgLy8gV2lsbCBiZSBwb3BwZWQgYnkgdGhlIGVuY2xvc2luZyBzY29wZS4KICAgICAgICByZXR1cm4gdmFyaWFibGU7CiAgICAgIGNhc2UgVGFnLkZ1bmN0aW9uRGVjbGFyYXRpb246CiAgICAgICAgaW50IG9mZnNldCA9IHJlYWRPZmZzZXQoKTsKICAgICAgICB2YXIgdmFyaWFibGUgPSByZWFkVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsgLy8gV2lsbCBiZSBwb3BwZWQgYnkgdGhlIGVuY2xvc2luZyBzY29wZS4KICAgICAgICB2YXIgZnVuY3Rpb24gPSByZWFkRnVuY3Rpb25Ob2RlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkRlY2xhcmF0aW9uKHZhcmlhYmxlLCBmdW5jdGlvbikuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgZmFpbCgndW5leHBlY3RlZCBzdGF0ZW1lbnQgdGFnOiAkdGFnJyk7CiAgICB9CiAgfQoKICB2b2lkIHJlYWRTd2l0Y2hDYXNlSW50byhTd2l0Y2hDYXNlIGNhc2VOb2RlKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIGNhc2VOb2RlLmV4cHJlc3Npb25zLmxlbmd0aCA9IGxlbmd0aDsKICAgIGNhc2VOb2RlLmV4cHJlc3Npb25PZmZzZXRzLmxlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgY2FzZU5vZGUuZXhwcmVzc2lvbk9mZnNldHNbaV0gPSByZWFkT2Zmc2V0KCk7CiAgICAgIGNhc2VOb2RlLmV4cHJlc3Npb25zW2ldID0gcmVhZEV4cHJlc3Npb24oKS4ucGFyZW50ID0gY2FzZU5vZGU7CiAgICB9CiAgICBjYXNlTm9kZS5pc0RlZmF1bHQgPSByZWFkQnl0ZSgpID09IDE7CiAgICBjYXNlTm9kZS5ib2R5ID0gcmVhZFN0YXRlbWVudCgpLi5wYXJlbnQgPSBjYXNlTm9kZTsKICB9CgogIExpc3Q8Q2F0Y2g+IHJlYWRDYXRjaExpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8Q2F0Y2g+IHJlc3VsdCA9IG5ldyBMaXN0PENhdGNoPi5maWxsZWQobGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHJlYWRDYXRjaCgpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIENhdGNoIHJlYWRDYXRjaCgpIHsKICAgIGludCB2YXJpYWJsZVN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICB2YXIgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgdmFyIGd1YXJkID0gcmVhZERhcnRUeXBlKCk7CiAgICB2YXIgZXhjZXB0aW9uID0gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uT3B0aW9uKCk7CiAgICB2YXIgc3RhY2tUcmFjZSA9IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbigpOwogICAgdmFyIGJvZHkgPSByZWFkU3RhdGVtZW50KCk7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHZhcmlhYmxlU3RhY2tIZWlnaHQ7CiAgICByZXR1cm4gbmV3IENhdGNoKGV4Y2VwdGlvbiwgYm9keSwgZ3VhcmQ6IGd1YXJkLCBzdGFja1RyYWNlOiBzdGFja1RyYWNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgfQoKICBCbG9jayByZWFkQmxvY2soKSB7CiAgICBpbnQgc3RhY2tIZWlnaHQgPSB2YXJpYWJsZVN0YWNrLmxlbmd0aDsKICAgIHZhciBib2R5ID0gcmVhZFN0YXRlbWVudExpc3QoKTsKICAgIHZhcmlhYmxlU3RhY2subGVuZ3RoID0gc3RhY2tIZWlnaHQ7CiAgICByZXR1cm4gbmV3IEJsb2NrKGJvZHkpOwogIH0KCiAgQXNzZXJ0QmxvY2sgcmVhZEFzc2VydEJsb2NrKCkgewogICAgaW50IHN0YWNrSGVpZ2h0ID0gdmFyaWFibGVTdGFjay5sZW5ndGg7CiAgICB2YXIgYm9keSA9IHJlYWRTdGF0ZW1lbnRMaXN0KCk7CiAgICB2YXJpYWJsZVN0YWNrLmxlbmd0aCA9IHN0YWNrSGVpZ2h0OwogICAgcmV0dXJuIG5ldyBBc3NlcnRCbG9jayhib2R5KTsKICB9CgogIFN1cGVydHlwZSByZWFkU3VwZXJ0eXBlKCkgewogICAgSW50ZXJmYWNlVHlwZSB0eXBlID0gcmVhZERhcnRUeXBlKCk7CiAgICBhc3NlcnQoCiAgICAgICAgdHlwZS5udWxsYWJpbGl0eSA9PSBfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUsCiAgICAgICAgIkluIHNlcmlhbGl6ZWQgZm9ybSBzdXBlcnR5cGVzIHNob3VsZCBoYXZlIE51bGxhYmlsaXR5LmxlZ2FjeSBpZiB0aGV5ICIKICAgICAgICAiYXJlIGluIGEgbGlicmFyeSB0aGF0IGlzIG9wdGVkIG91dCBvZiB0aGUgTk5CRCBmZWF0dXJlLiAgSWYgdGhleSBhcmUgIgogICAgICAgICJpbiBhbiBvcHRlZC1pbiBsaWJyYXJ5LCB0aGV5IHNob3VsZCBoYXZlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLiIpOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUuYnlSZWZlcmVuY2UodHlwZS5jbGFzc05hbWUsIHR5cGUudHlwZUFyZ3VtZW50cyk7CiAgfQoKICBTdXBlcnR5cGUgcmVhZFN1cGVydHlwZU9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRTdXBlcnR5cGUoKSA6IG51bGw7CiAgfQoKICBMaXN0PFN1cGVydHlwZT4gcmVhZFN1cGVydHlwZUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8U3VwZXJ0eXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PFN1cGVydHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkU3VwZXJ0eXBlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gcmVhZERhcnRUeXBlTGlzdCgpIHsKICAgIGludCBsZW5ndGggPSByZWFkVUludCgpOwogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkRGFydFR5cGUoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaXN0PE5hbWVkVHlwZT4gcmVhZE5hbWVkVHlwZUxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TmFtZWRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkVHlwZT4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkTmFtZWRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTmFtZWRUeXBlIHJlYWROYW1lZFR5cGUoKSB7CiAgICBTdHJpbmcgbmFtZSA9IHJlYWRTdHJpbmdSZWZlcmVuY2UoKTsKICAgIERhcnRUeXBlIHR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgIGludCBmbGFncyA9IHJlYWRCeXRlKCk7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShuYW1lLCB0eXBlLAogICAgICAgIGlzUmVxdWlyZWQ6IChmbGFncyAmIE5hbWVkVHlwZS5GbGFnUmVxdWlyZWROYW1lZFR5cGUpICE9IDApOwogIH0KCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlT3B0aW9uKCkgewogICAgcmV0dXJuIHJlYWRBbmRDaGVja09wdGlvblRhZygpID8gcmVhZERhcnRUeXBlKCkgOiBudWxsOwogIH0KCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlKCkgewogICAgaW50IHRhZyA9IHJlYWRCeXRlKCk7CiAgICBzd2l0Y2ggKHRhZykgewogICAgICBjYXNlIFRhZy5UeXBlZGVmVHlwZToKICAgICAgICBpbnQgbnVsbGFiaWxpdHlJbmRleCA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZS5ieVJlZmVyZW5jZShyZWFkVHlwZWRlZlJlZmVyZW5jZSgpLAogICAgICAgICAgICBOdWxsYWJpbGl0eS52YWx1ZXNbbnVsbGFiaWxpdHlJbmRleF0sIHJlYWREYXJ0VHlwZUxpc3QoKSk7CiAgICAgIGNhc2UgVGFnLkJvdHRvbVR5cGU6CiAgICAgICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICAgICAgY2FzZSBUYWcuSW52YWxpZFR5cGU6CiAgICAgICAgcmV0dXJuIGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIGNhc2UgVGFnLkR5bmFtaWNUeXBlOgogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICBjYXNlIFRhZy5Wb2lkVHlwZToKICAgICAgICByZXR1cm4gY29uc3QgVm9pZFR5cGUoKTsKICAgICAgY2FzZSBUYWcuTmV2ZXJUeXBlOgogICAgICAgIGludCBudWxsYWJpbGl0eUluZGV4ID0gcmVhZEJ5dGUoKTsKICAgICAgICByZXR1cm4gbmV3IE5ldmVyVHlwZShOdWxsYWJpbGl0eS52YWx1ZXNbbnVsbGFiaWxpdHlJbmRleF0pOwogICAgICBjYXNlIFRhZy5JbnRlcmZhY2VUeXBlOgogICAgICAgIGludCBudWxsYWJpbGl0eUluZGV4ID0gcmVhZEJ5dGUoKTsKICAgICAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUuYnlSZWZlcmVuY2UocmVhZENsYXNzUmVmZXJlbmNlKCksCiAgICAgICAgICAgIE51bGxhYmlsaXR5LnZhbHVlc1tudWxsYWJpbGl0eUluZGV4XSwgcmVhZERhcnRUeXBlTGlzdCgpKTsKICAgICAgY2FzZSBUYWcuU2ltcGxlSW50ZXJmYWNlVHlwZToKICAgICAgICBpbnQgbnVsbGFiaWxpdHlJbmRleCA9IHJlYWRCeXRlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlLmJ5UmVmZXJlbmNlKHJlYWRDbGFzc1JlZmVyZW5jZSgpLAogICAgICAgICAgICBOdWxsYWJpbGl0eS52YWx1ZXNbbnVsbGFiaWxpdHlJbmRleF0sIGNvbnN0IDxEYXJ0VHlwZT5bXSk7CiAgICAgIGNhc2UgVGFnLkZ1bmN0aW9uVHlwZToKICAgICAgICBpbnQgdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0ID0gdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aDsKICAgICAgICBpbnQgbnVsbGFiaWxpdHlJbmRleCA9IHJlYWRCeXRlKCk7CiAgICAgICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdCgpOwogICAgICAgIHZhciByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gcmVhZFVJbnQoKTsKICAgICAgICB2YXIgdG90YWxQYXJhbWV0ZXJDb3VudCA9IHJlYWRVSW50KCk7CiAgICAgICAgdmFyIHBvc2l0aW9uYWwgPSByZWFkRGFydFR5cGVMaXN0KCk7CiAgICAgICAgdmFyIG5hbWVkID0gcmVhZE5hbWVkVHlwZUxpc3QoKTsKICAgICAgICB2YXIgdHlwZWRlZlR5cGUgPSByZWFkRGFydFR5cGVPcHRpb24oKTsKICAgICAgICBhc3NlcnQocG9zaXRpb25hbC5sZW5ndGggKyBuYW1lZC5sZW5ndGggPT0gdG90YWxQYXJhbWV0ZXJDb3VudCk7CiAgICAgICAgdmFyIHJldHVyblR5cGUgPSByZWFkRGFydFR5cGUoKTsKICAgICAgICB0eXBlUGFyYW1ldGVyU3RhY2subGVuZ3RoID0gdHlwZVBhcmFtZXRlclN0YWNrSGVpZ2h0OwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgICBwb3NpdGlvbmFsLCByZXR1cm5UeXBlLCBOdWxsYWJpbGl0eS52YWx1ZXNbbnVsbGFiaWxpdHlJbmRleF0sCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICAgICAgdHlwZWRlZlR5cGU6IHR5cGVkZWZUeXBlKTsKICAgICAgY2FzZSBUYWcuU2ltcGxlRnVuY3Rpb25UeXBlOgogICAgICAgIGludCBudWxsYWJpbGl0eUluZGV4ID0gcmVhZEJ5dGUoKTsKICAgICAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWREYXJ0VHlwZUxpc3QoKTsKICAgICAgICB2YXIgcmV0dXJuVHlwZSA9IHJlYWREYXJ0VHlwZSgpOwogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgICBwb3NpdGlvbmFsLCByZXR1cm5UeXBlLCBOdWxsYWJpbGl0eS52YWx1ZXNbbnVsbGFiaWxpdHlJbmRleF0pOwogICAgICBjYXNlIFRhZy5UeXBlUGFyYW1ldGVyVHlwZToKICAgICAgICBpbnQgZGVjbGFyZWROdWxsYWJpbGl0eUluZGV4ID0gcmVhZEJ5dGUoKTsKICAgICAgICBpbnQgaW5kZXggPSByZWFkVUludCgpOwogICAgICAgIHZhciBib3VuZCA9IHJlYWREYXJ0VHlwZU9wdGlvbigpOwogICAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlclN0YWNrW2luZGV4XSwKICAgICAgICAgICAgTnVsbGFiaWxpdHkudmFsdWVzW2RlY2xhcmVkTnVsbGFiaWxpdHlJbmRleF0sIGJvdW5kKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBmYWlsKCd1bmV4cGVjdGVkIGRhcnQgdHlwZSB0YWc6ICR0YWcnKTsKICAgIH0KICB9CgogIExpc3Q8VHlwZVBhcmFtZXRlcj4gcmVhZEFuZFB1c2hUeXBlUGFyYW1ldGVyTGlzdCgKICAgICAgW0xpc3Q8VHlwZVBhcmFtZXRlcj4gbGlzdCwgVHJlZU5vZGUgcGFyZW50XSkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBsaXN0ID8/IDxUeXBlUGFyYW1ldGVyPltdOwogICAgaWYgKGxpc3QgPT0gbnVsbCkgewogICAgICBsaXN0ID0gbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgbGlzdFtpXSA9IG5ldyBUeXBlUGFyYW1ldGVyKG51bGwsIG51bGwpLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobGlzdC5sZW5ndGggIT0gbGVuZ3RoKSB7CiAgICAgIGxpc3QubGVuZ3RoID0gbGVuZ3RoOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgbGlzdFtpXSA9IG5ldyBUeXBlUGFyYW1ldGVyKG51bGwsIG51bGwpLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIH0KICAgIH0KICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5hZGRBbGwobGlzdCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgcmVhZFR5cGVQYXJhbWV0ZXIobGlzdFtpXSk7CiAgICB9CiAgICByZXR1cm4gbGlzdDsKICB9CgogIHZvaWQgcmVhZFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICBub2RlLmZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIG5vZGUuYW5ub3RhdGlvbnMgPSByZWFkQW5ub3RhdGlvbkxpc3Qobm9kZSk7CiAgICBpbnQgdmFyaWFuY2UgPSByZWFkQnl0ZSgpOwogICAgaWYgKHZhcmlhbmNlID09IFR5cGVQYXJhbWV0ZXIubGVnYWN5Q292YXJpYW50U2VyaWFsaXphdGlvbk1hcmtlcikgewogICAgICBub2RlLnZhcmlhbmNlID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUudmFyaWFuY2UgPSB2YXJpYW5jZTsKICAgIH0KICAgIG5vZGUubmFtZSA9IHJlYWRTdHJpbmdPck51bGxJZkVtcHR5KCk7CiAgICBub2RlLmJvdW5kID0gcmVhZERhcnRUeXBlKCk7CiAgICBub2RlLmRlZmF1bHRUeXBlID0gcmVhZERhcnRUeXBlT3B0aW9uKCk7CiAgfQoKICBBcmd1bWVudHMgcmVhZEFyZ3VtZW50cygpIHsKICAgIHZhciBudW1Bcmd1bWVudHMgPSByZWFkVUludCgpOwogICAgdmFyIHR5cGVBcmd1bWVudHMgPSByZWFkRGFydFR5cGVMaXN0KCk7CiAgICB2YXIgcG9zaXRpb25hbCA9IHJlYWRFeHByZXNzaW9uTGlzdCgpOwogICAgdmFyIG5hbWVkID0gcmVhZE5hbWVkRXhwcmVzc2lvbkxpc3QoKTsKICAgIGFzc2VydChudW1Bcmd1bWVudHMgPT0gcG9zaXRpb25hbC5sZW5ndGggKyBuYW1lZC5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBBcmd1bWVudHMocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVBcmd1bWVudHMsIG5hbWVkOiBuYW1lZCk7CiAgfQoKICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gcmVhZE5hbWVkRXhwcmVzc2lvbkxpc3QoKSB7CiAgICBpbnQgbGVuZ3RoID0gcmVhZFVJbnQoKTsKICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkTmFtZWRFeHByZXNzaW9uKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTmFtZWRFeHByZXNzaW9uIHJlYWROYW1lZEV4cHJlc3Npb24oKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkRXhwcmVzc2lvbihyZWFkU3RyaW5nUmVmZXJlbmNlKCksIHJlYWRFeHByZXNzaW9uKCkpOwogIH0KCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KCkgewogICAgaW50IGxlbmd0aCA9IHJlYWRVSW50KCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4uZmlsbGVkKGxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSByZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbk9wdGlvbigpIHsKICAgIHJldHVybiByZWFkQW5kQ2hlY2tPcHRpb25UYWcoKSA/IHJlYWRBbmRQdXNoVmFyaWFibGVEZWNsYXJhdGlvbigpIDogbnVsbDsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uKCkgewogICAgdmFyIHZhcmlhYmxlID0gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKICAgIHZhcmlhYmxlU3RhY2suYWRkKHZhcmlhYmxlKTsKICAgIHJldHVybiB2YXJpYWJsZTsKICB9CgogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7CiAgICBpbnQgb2Zmc2V0ID0gcmVhZE9mZnNldCgpOwogICAgaW50IGZpbGVFcXVhbHNPZmZzZXQgPSByZWFkT2Zmc2V0KCk7CiAgICAvLyBUaGUgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIGluc3RhbmNlIGlzIG5vdCBjcmVhdGVkIGF0IHRoaXMgcG9pbnQgeWV0LAogICAgLy8gc28gYG51bGxgIGlzIHRlbXBvcmFyaWx5IHNldCBhcyB0aGUgcGFyZW50IG9mIHRoZSBhbm5vdGF0aW9uIG5vZGVzLgogICAgdmFyIGFubm90YXRpb25zID0gcmVhZEFubm90YXRpb25MaXN0KG51bGwpOwogICAgaW50IGZsYWdzID0gcmVhZEJ5dGUoKTsKICAgIHZhciBub2RlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24ocmVhZFN0cmluZ09yTnVsbElmRW1wdHkoKSwKICAgICAgICB0eXBlOiByZWFkRGFydFR5cGUoKSwgaW5pdGlhbGl6ZXI6IHJlYWRFeHByZXNzaW9uT3B0aW9uKCksIGZsYWdzOiBmbGFncykKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0CiAgICAgIC4uZmlsZUVxdWFsc09mZnNldCA9IGZpbGVFcXVhbHNPZmZzZXQ7CiAgICBpZiAoYW5ub3RhdGlvbnMuaXNOb3RFbXB0eSkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTsKICAgICAgICBhbm5vdGF0aW9uLnBhcmVudCA9IG5vZGU7CiAgICAgIH0KICAgICAgbm9kZS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBpbnQgcmVhZE9mZnNldCgpIHsKICAgIC8vIE9mZnNldCBpcyBzYXZlZCBhcyB1bnNpZ25lZCwKICAgIC8vIGJ1dCBhY3R1YWxseSByYW5nZXMgZnJvbSAtMSBhbmQgdXAgKHRodXMgdGhlIC0xKQogICAgcmV0dXJuIHJlYWRVSW50KCkgLSAxOwogIH0KfQoKY2xhc3MgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YSBleHRlbmRzIEJpbmFyeUJ1aWxkZXIgaW1wbGVtZW50cyBCaW5hcnlTb3VyY2UgewogIC8vLyBMaXN0IG9mIG1ldGFkYXRhIHN1YnNlY3Rpb25zIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIFtNZXRhZGF0YVJlcG9zaXRvcnldCiAgLy8vIGFuZCBhcmUgYXdhaXRpbmcgdG8gYmUgcGFyc2VkIGFuZCBhdHRhY2hlZCB0byBub2Rlcy4KICBMaXN0PF9NZXRhZGF0YVN1YnNlY3Rpb24+IF9zdWJzZWN0aW9uczsKCiAgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YShMaXN0PGludD4gYnl0ZXMsCiAgICAgIHtTdHJpbmcgZmlsZW5hbWUsCiAgICAgIGJvb2wgZGlzYWJsZUxhenlSZWFkaW5nID0gZmFsc2UsCiAgICAgIGJvb2wgZGlzYWJsZUxhenlDbGFzc1JlYWRpbmcgPSBmYWxzZSwKICAgICAgYm9vbCBhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzfSkKICAgICAgOiBzdXBlcihieXRlcywKICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLAogICAgICAgICAgICBkaXNhYmxlTGF6eVJlYWRpbmc6IGRpc2FibGVMYXp5UmVhZGluZywKICAgICAgICAgICAgZGlzYWJsZUxhenlDbGFzc1JlYWRpbmc6IGRpc2FibGVMYXp5Q2xhc3NSZWFkaW5nLAogICAgICAgICAgICBhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzOiBhbHdheXNDcmVhdGVOZXdOYW1lZE5vZGVzKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBfcmVhZE1ldGFkYXRhTWFwcGluZ3MoCiAgICAgIENvbXBvbmVudCBjb21wb25lbnQsIGludCBiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzKSB7CiAgICAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZnVuY3Rpb24gX2J5dGVPZmZzZXQgcG9pbnRzIHJpZ2h0IHBhc3QKICAgIC8vIG1ldGFkYXRhTWFwcGluZ3MgdG8gc3RyaW5nIHRhYmxlLgoKICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiBtZXRhZGF0YU1hcHBpbmdzLgogICAgX2J5dGVPZmZzZXQgLT0gNDsKICAgIGZpbmFsIHN1YlNlY3Rpb25Db3VudCA9IHJlYWRVaW50MzIoKTsKCiAgICBpbnQgZW5kT2Zmc2V0ID0gX2J5dGVPZmZzZXQgLSA0OyAvLyBFbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YlNlY3Rpb25Db3VudDsgaSsrKSB7CiAgICAgIC8vIFJMaXN0PFBhaXI8VUludDMyLCBVSW50MzI+PiBub2RlT2Zmc2V0VG9NZXRhZGF0YU9mZnNldAogICAgICBfYnl0ZU9mZnNldCA9IGVuZE9mZnNldCAtIDQ7CiAgICAgIGZpbmFsIG1hcHBpbmdMZW5ndGggPSByZWFkVWludDMyKCk7CiAgICAgIGZpbmFsIG1hcHBpbmdTdGFydCA9IChlbmRPZmZzZXQgLSA0KSAtIDQgKiAyICogbWFwcGluZ0xlbmd0aDsKICAgICAgX2J5dGVPZmZzZXQgPSBtYXBwaW5nU3RhcnQgLSA0OwoKICAgICAgLy8gVUludDMyIHRhZyAoZml4ZWQgc2l6ZSBTdHJpbmdSZWZlcmVuY2UpCiAgICAgIGZpbmFsIHRhZyA9IF9zdHJpbmdUYWJsZVtyZWFkVWludDMyKCldOwoKICAgICAgZmluYWwgcmVwb3NpdG9yeSA9IGNvbXBvbmVudC5tZXRhZGF0YVt0YWddOwogICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7CiAgICAgICAgLy8gUmVhZCBub2RlT2Zmc2V0VG9NZXRhZGF0YU9mZnNldCBtYXBwaW5nLgogICAgICAgIGZpbmFsIG1hcHBpbmcgPSA8aW50LCBpbnQ+e307CiAgICAgICAgX2J5dGVPZmZzZXQgPSBtYXBwaW5nU3RhcnQ7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXBwaW5nTGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGZpbmFsIG5vZGVPZmZzZXQgPSByZWFkVWludDMyKCk7CiAgICAgICAgICBmaW5hbCBtZXRhZGF0YU9mZnNldCA9IGJpbmFyeU9mZnNldEZvck1ldGFkYXRhUGF5bG9hZHMgKyByZWFkVWludDMyKCk7CiAgICAgICAgICBtYXBwaW5nW25vZGVPZmZzZXRdID0gbWV0YWRhdGFPZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICBfc3Vic2VjdGlvbnMgPz89IDxfTWV0YWRhdGFTdWJzZWN0aW9uPltdOwogICAgICAgIF9zdWJzZWN0aW9ucy5hZGQobmV3IF9NZXRhZGF0YVN1YnNlY3Rpb24ocmVwb3NpdG9yeSwgbWFwcGluZykpOwogICAgICB9CgogICAgICAvLyBTdGFydCBvZiB0aGUgc3Vic2VjdGlvbiBhbmQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLgogICAgICBlbmRPZmZzZXQgPSBtYXBwaW5nU3RhcnQgLSA0OwogICAgfQogIH0KCiAgT2JqZWN0IF9yZWFkTWV0YWRhdGEoTm9kZSBub2RlLCBNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgaW50IG9mZnNldCkgewogICAgZmluYWwgaW50IHNhdmVkT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBfYnl0ZU9mZnNldCA9IG9mZnNldDsKCiAgICBmaW5hbCBtZXRhZGF0YSA9IHJlcG9zaXRvcnkucmVhZEZyb21CaW5hcnkobm9kZSwgdGhpcyk7CgogICAgX2J5dGVPZmZzZXQgPSBzYXZlZE9mZnNldDsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW50ZXJTY29wZSh7TGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc30pIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJTdGFjay5hZGRBbGwodHlwZVBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsZWF2ZVNjb3BlKHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzfSkgewogICAgaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgdHlwZVBhcmFtZXRlclN0YWNrLmxlbmd0aCAtPSB0eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBOb2RlIF9hc3NvY2lhdGVNZXRhZGF0YShOb2RlIG5vZGUsIGludCBub2RlT2Zmc2V0KSB7CiAgICBpZiAoX3N1YnNlY3Rpb25zID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZm9yICh2YXIgc3Vic2VjdGlvbiBpbiBfc3Vic2VjdGlvbnMpIHsKICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYW55IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCiAgICAgIGZpbmFsIG1ldGFkYXRhT2Zmc2V0ID0gc3Vic2VjdGlvbi5tYXBwaW5nW25vZGVPZmZzZXRdOwogICAgICBpZiAobWV0YWRhdGFPZmZzZXQgIT0gbnVsbCkgewogICAgICAgIHN1YnNlY3Rpb24ucmVwb3NpdG9yeS5tYXBwaW5nW25vZGVdID0KICAgICAgICAgICAgX3JlYWRNZXRhZGF0YShub2RlLCBzdWJzZWN0aW9uLnJlcG9zaXRvcnksIG1ldGFkYXRhT2Zmc2V0KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgcmVhZERhcnRUeXBlKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZERhcnRUeXBlKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5IHJlYWRMaWJyYXJ5KENvbXBvbmVudCBjb21wb25lbnQsIGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRMaWJyYXJ5KGNvbXBvbmVudCwgZW5kT2Zmc2V0KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVkZWYgcmVhZFR5cGVkZWYoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkVHlwZWRlZigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3MgcmVhZENsYXNzKGludCBlbmRPZmZzZXQpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRDbGFzcyhlbmRPZmZzZXQpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXh0ZW5zaW9uIHJlYWRFeHRlbnNpb24oKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkRXh0ZW5zaW9uKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBGaWVsZCByZWFkRmllbGQoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkRmllbGQoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yIHJlYWRDb25zdHJ1Y3RvcigpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRDb25zdHJ1Y3RvcigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlIHJlYWRQcm9jZWR1cmUoaW50IGVuZE9mZnNldCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZFByb2NlZHVyZShlbmRPZmZzZXQpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVhZFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplciByZWFkSW5pdGlhbGl6ZXIoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkSW5pdGlhbGl6ZXIoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uTm9kZSByZWFkRnVuY3Rpb25Ob2RlKAogICAgICB7Ym9vbCBsYXp5TG9hZEJvZHk6IGZhbHNlLCBpbnQgb3V0ZXJFbmRPZmZzZXQ6IC0xfSkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZEZ1bmN0aW9uTm9kZSgKICAgICAgICBsYXp5TG9hZEJvZHk6IGxhenlMb2FkQm9keSwgb3V0ZXJFbmRPZmZzZXQ6IG91dGVyRW5kT2Zmc2V0KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gcmVhZEV4cHJlc3Npb24oKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkRXhwcmVzc2lvbigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgQXJndW1lbnRzIHJlYWRBcmd1bWVudHMoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkQXJndW1lbnRzKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBOYW1lZEV4cHJlc3Npb24gcmVhZE5hbWVkRXhwcmVzc2lvbigpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWROYW1lZEV4cHJlc3Npb24oKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkVmFyaWFibGVEZWNsYXJhdGlvbigpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YShyZXN1bHQsIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IHJlYWRTdGF0ZW1lbnQoKSB7CiAgICBmaW5hbCBub2RlT2Zmc2V0ID0gX2J5dGVPZmZzZXQ7CiAgICBmaW5hbCByZXN1bHQgPSBzdXBlci5yZWFkU3RhdGVtZW50KCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21iaW5hdG9yIHJlYWRDb21iaW5hdG9yKCkgewogICAgZmluYWwgbm9kZU9mZnNldCA9IF9ieXRlT2Zmc2V0OwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIucmVhZENvbWJpbmF0b3IoKTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIExpYnJhcnlEZXBlbmRlbmN5IHJlYWRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRMaWJyYXJ5RGVwZW5kZW5jeShsaWJyYXJ5KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIExpYnJhcnlQYXJ0IHJlYWRMaWJyYXJ5UGFydChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWRMaWJyYXJ5UGFydChsaWJyYXJ5KTsKICAgIHJldHVybiBfYXNzb2NpYXRlTWV0YWRhdGEocmVzdWx0LCBub2RlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZFN3aXRjaENhc2VJbnRvKFN3aXRjaENhc2UgY2FzZU5vZGUpIHsKICAgIF9hc3NvY2lhdGVNZXRhZGF0YShjYXNlTm9kZSwgX2J5dGVPZmZzZXQpOwogICAgc3VwZXIucmVhZFN3aXRjaENhc2VJbnRvKGNhc2VOb2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVhZFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBwYXJhbSkgewogICAgX2Fzc29jaWF0ZU1ldGFkYXRhKHBhcmFtLCBfYnl0ZU9mZnNldCk7CiAgICBzdXBlci5yZWFkVHlwZVBhcmFtZXRlcihwYXJhbSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgcmVhZFN1cGVydHlwZSgpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIEludGVyZmFjZVR5cGUgdHlwZSA9IHN1cGVyLnJlYWREYXJ0VHlwZSgpOwogICAgcmV0dXJuIF9hc3NvY2lhdGVNZXRhZGF0YSgKICAgICAgICBuZXcgU3VwZXJ0eXBlLmJ5UmVmZXJlbmNlKHR5cGUuY2xhc3NOYW1lLCB0eXBlLnR5cGVBcmd1bWVudHMpLAogICAgICAgIG5vZGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZSByZWFkTmFtZSgpIHsKICAgIGZpbmFsIG5vZGVPZmZzZXQgPSBfYnl0ZU9mZnNldDsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnJlYWROYW1lKCk7CiAgICByZXR1cm4gX2Fzc29jaWF0ZU1ldGFkYXRhKHJlc3VsdCwgbm9kZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGN1cnJlbnRPZmZzZXQgPT4gX2J5dGVPZmZzZXQ7CgogIEBvdmVycmlkZQogIExpc3Q8aW50PiBnZXQgYnl0ZXMgPT4gX2J5dGVzOwp9CgovLy8gRGVzZXJpYWxpemVkIE1ldGFkYXRhTWFwcGluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBtZXRhZGF0YSByZXBvc2l0b3J5LgpjbGFzcyBfTWV0YWRhdGFTdWJzZWN0aW9uIHsKICAvLy8gW01ldGFkYXRhUmVwb3NpdG9yeV0gdGhhdCBjYW4gcmVhZCB0aGlzIHN1YnNlY3Rpb24uCiAgZmluYWwgTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnk7CgogIC8vLyBEZXNlcmlhbGl6ZWQgbWFwcGluZyBmcm9tIG5vZGUgb2Zmc2V0cyB0byBtZXRhZGF0YSBvZmZzZXRzLgogIGZpbmFsIE1hcDxpbnQsIGludD4gbWFwcGluZzsKCiAgX01ldGFkYXRhU3Vic2VjdGlvbih0aGlzLnJlcG9zaXRvcnksIHRoaXMubWFwcGluZyk7Cn0Kie8ATk48IAEiFxkaARYoEwETExESDwFIAUICASIVASsBFjMyBAIBGxgBJAIBOToCARgoASIlJyciJBscFCACARkhIh8BFEoCARZLQhofO0QZGhcwLTkiHRshAUYoJwEoAVBQJiQBUFAmKQE6MR0WJywnMiM7TQEZHlEEASUBKwETGxwSEyMSMA0SJR8eFgYEARUgHRwUBAE4IAEYPygoKCgoKCgoHQQBJC06IRIE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aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBwYWNrYWdlX2NvbmZpZy5wYWNrYWdlczsKCmltcG9ydCAic3JjL3BhY2thZ2VzX2ltcGwuZGFydCI7CgovLy8gQSBwYWNrYWdlIHJlc29sdXRpb24gc3RyYXRlZ3kuCi8vLwovLy8gQWxsb3dzIGNvbnZlcnRpbmcgYSBgcGFja2FnZTpgIFVSSSB0byBhIGRpZmZlcmVudCBraW5kIG9mIFVSSS4KLy8vCi8vLyBNYXkgYWxzbyBhbGxvdyBsaXN0aW5nIHRoZSBhdmFpbGFibGUgcGFja2FnZXMgYW5kIGNvbnZlcnRpbmcKLy8vIHRvIGEgYE1hcDxTdHJpbmcsIFVyaT5gIHRoYXQgZ2l2ZXMgdGhlIGJhc2UgbG9jYXRpb24gb2YgZWFjaCBhdmFpbGFibGUKLy8vIHBhY2thZ2UuIEluIHNvbWUgY2FzZXMgdGhlcmUgaXMgbm8gd2F5IHRvIGZpbmQgdGhlIGF2YWlsYWJsZSBwYWNrYWdlcywKLy8vIGluIHdoaWNoIGNhc2UgW3BhY2thZ2VzXSBhbmQgW2FzTWFwXSB3aWxsIHRocm93IGlmIHVzZWQuCi8vLyBPbmUgc3VjaCBjYXNlIGlzIGlmIHRoZSBwYWNrYWdlcyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gYQovLy8gYHBhY2thZ2VzL2AgZGlyZWN0b3J5IGF2YWlsYWJsZSBvdmVyIEhUVFAuCmFic3RyYWN0IGNsYXNzIFBhY2thZ2VzIHsKICAvLy8gQSBbUGFja2FnZXNdIHJlc29sdmVyIGNvbnRhaW5pbmcgbm8gcGFja2FnZXMuCiAgLy8vCiAgLy8vIFRoaXMgY29uc3RhbnQgb2JqZWN0IGlzIHJldHVybmVkIGJ5IFtmaW5kXSBhYm92ZSBpZiBubwogIC8vLyBwYWNrYWdlIHJlc29sdXRpb24gc3RyYXRlZ3kgaXMgZm91bmQuCiAgc3RhdGljIGNvbnN0IFBhY2thZ2VzIG5vUGFja2FnZXMgPSBjb25zdCBOb1BhY2thZ2VzKCk7CgogIC8vLyBSZXNvbHZlIGEgcGFja2FnZSBVUkkgaW50byBhIG5vbi1wYWNrYWdlIFVSSS4KICAvLy8KICAvLy8gVHJhbnNsYXRlcyBhIGBwYWNrYWdlOmAgVVJJLCBhY2NvcmRpbmcgdG8gdGhlIHBhY2thZ2UgcmVzb2x1dGlvbgogIC8vLyBzdHJhdGVneSwgaW50byBhIFVSSSB0aGF0IGNhbiBiZSBsb2FkZWQuCiAgLy8vIEJ5IGRlZmF1bHQsIG9ubHkgYGZpbGVgLCBgaHR0cGAgYW5kIGBodHRwc2AgVVJJcyBhcmUgcmV0dXJuZWQuCiAgLy8vIEN1c3RvbSBgUGFja2FnZXNgIG9iamVjdHMgbWF5IHJldHVybiBvdGhlciBVUklzLgogIC8vLwogIC8vLyBJZiByZXNvbHV0aW9uIGZhaWxzIGJlY2F1c2UgYSBwYWNrYWdlIHdpdGggdGhlIHJlcXVlc3RlZCBwYWNrYWdlIG5hbWUKICAvLy8gaXMgbm90IGF2YWlsYWJsZSwgdGhlIFtub3RGb3VuZF0gZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vLyBJZiBubyBgbm90Rm91bmRgIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byB0aHJvd2luZyBhbiBlcnJvci4KICAvLy8KICAvLy8gVGhlIFtwYWNrYWdlVXJpXSBtdXN0IGJlIGEgdmFsaWQgcGFja2FnZSBVUkkuCiAgVXJpIHJlc29sdmUoVXJpIHBhY2thZ2VVcmksIHtVcmkgbm90Rm91bmQoVXJpIHBhY2thZ2VVcmkpfSk7CgogIC8vLyBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgcGFja2FnZXMuCiAgLy8vCiAgLy8vIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCBhbGxvd3MgaXRlcmF0aW5nIHRoZSBuYW1lcyBvZiBhdmFpbGFibGUgcGFja2FnZXMuCiAgLy8vCiAgLy8vIFNvbWUgYFBhY2thZ2VzYCBvYmplY3RzIGFyZSB1bmFibGUgdG8gZmluZCB0aGUgcGFja2FnZSBuYW1lcywKICAvLy8gYW5kIGdldHRpbmcgYHBhY2thZ2VzYCBmcm9tIHN1Y2ggYSBgUGFja2FnZXNgIG9iamVjdCB3aWxsIHRocm93LgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBhY2thZ2VzOwoKICAvLy8gUmV0cmlldmUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2FnZS4KICAvLy8KICAvLy8gTWV0YWRhdGEgaGF2ZSBzdHJpbmcga2V5cyBhbmQgdmFsdWVzLCBhbmQgYXJlIGxvb2tlZCB1cCBieSBrZXkuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUsCiAgLy8vIG9yIGlmIHRoZSBwYWNrYWdlIGlzIG5vdCBvbmUgb2YgdGhlIHBhY2thZ2VzIGNvbmZpZ3VyZWQgYnkKICAvLy8gdGhpcyBwYWNrYWdlcyBvYmplY3QsIG9yIGlmIHRoZSBwYWNrYWdlIGRvZXMgbm90IGhhdmUgYXNzb2NpYXRlZAogIC8vLyBtZXRhZGF0YSB3aXRoIHRoZSBwcm92aWRlZCBba2V5XS4KICAvLy8KICAvLy8gTm90IGFsbCBgUGFja2FnZXNgIG9iamVjdHMgY2FuIHN1cHBvcnQgbWV0YWRhdGEuCiAgLy8vIFRob3NlIHdpbGwgYWx3YXlzIHJldHVybiBgbnVsbGAuCiAgU3RyaW5nIHBhY2thZ2VNZXRhZGF0YShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBrZXkpOwoKICAvLy8gUmV0cmlldmUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbGlicmFyeS4KICAvLy8KICAvLy8gSWYgW2xpYnJhcnlVcmldIGlzIGEgYHBhY2thZ2U6YCBVUkksIHRoZSByZXR1cm5lZCB2YWx1ZQogIC8vLyBpcyB0aGUgc2FtZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IFtwYWNrYWdlTWV0YWRhdGFdIHdpdGgKICAvLy8gdGhlIHBhY2thZ2UncyBuYW1lIGFuZCB0aGUgc2FtZSBrZXkuCiAgLy8vCiAgLy8vIElmIFtsaWJyYXJ5VXJpXSBpcyBub3QgYSBgcGFja2FnZTpgIFVSSSwgYW5kIHRoaXMgW1BhY2thZ2VzXQogIC8vLyBvYmplY3QgaGFzIGEgW2RlZmF1bHRQYWNrYWdlTmFtZV0sIHRoZW4gdGhlIFtrZXldIGlzIGxvb2tlZAogIC8vLyB1cCBvbiB0aGUgZGVmYXVsdCBwYWNrYWdlIGluc3RlYWQuCiAgLy8vCiAgLy8vIE90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGBudWxsYC4KICBTdHJpbmcgbGlicmFyeU1ldGFkYXRhKFVyaSBsaWJyYXJ5VXJpLCBTdHJpbmcga2V5KTsKCiAgLy8vIFJldHVybiB0aGUgbmFtZXMtdG8tYmFzZS1VUkkgbWFwcGluZyBvZiB0aGUgYXZhaWxhYmxlIHBhY2thZ2VzLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgbWFwIGZyb20gcGFja2FnZSBuYW1lIHRvIGEgYmFzZSBVUkkuCiAgLy8vIFRoZSBbcmVzb2x2ZV0gbWV0aG9kIHdpbGwgcmVzb2x2ZSBhIHBhY2thZ2UgVVJJIHdpdGggYSBzcGVjaWZpYyBwYWNrYWdlCiAgLy8vIG5hbWUgdG8gYSBwYXRoIGV4dGVuZGluZyB0aGUgYmFzZSBVUkkgdGhhdCB0aGlzIG1hcCBnaXZlcyBmb3IgdGhhdAogIC8vLyBwYWNrYWdlIG5hbWUuCiAgLy8vCiAgLy8vIFNvbWUgYFBhY2thZ2VzYCBvYmplY3RzIGFyZSB1bmFibGUgdG8gZmluZCB0aGUgcGFja2FnZSBuYW1lcywKICAvLy8gYW5kIGNhbGxpbmcgYGFzTWFwYCBvbiBzdWNoIGEgYFBhY2thZ2VzYCBvYmplY3Qgd2lsbCB0aHJvdy4KICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCk7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgImRlZmF1bHQgcGFja2FnZSIuCiAgLy8vCiAgLy8vIEEgZGVmYXVsdCBwYWNrYWdlIGlzIGEgcGFja2FnZSB0aGF0ICpub24tcGFja2FnZSogbGlicmFyaWVzCiAgLy8vIG1heSBiZSBjb25zaWRlcmVkIHBhcnQgb2YgZm9yIHNvbWUgcHVycG9zZXMuCiAgLy8vCiAgLy8vIFRoZSB2YWx1ZSBpcyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBwYWNrYWdlLgogIC8vLyBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyBvZiBbUGFja2FnZXNdIHN1cHBvcnRzIGEgZGVmYXVsdCBwYWNrYWdlLAogIC8vLyBhbmQgd2lsbCBhbHdheXMgaGF2ZSBhIGBudWxsYCB2YWx1ZSBmb3IgdGhvc2UuCiAgU3RyaW5nIGdldCBkZWZhdWx0UGFja2FnZU5hbWU7Cn0KYABOTjwBIQEhASMEQwRBS0s9QC8aNAY9LDkBNAZHL0U3Bkw7TwY0PwEyBlEGREchATMGRgZCQUcoBjcnOgEzBj5DKwZDQikGJjYBRgY1TkkUBkRCHAEpBkIzBjpINSECASRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzLmRhcnRZZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL3BhY2thZ2VfY29uZmlnL2xpYi9wYWNrYWdlc19maWxlLmRhcnScUC8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHBhY2thZ2VfY29uZmlnLnBhY2thZ2VzX2ZpbGU7CgppbXBvcnQgInBhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCI7CgppbXBvcnQgInNyYy91dGlsLmRhcnQiIHNob3cgaXNWYWxpZFBhY2thZ2VOYW1lOwoKLy8vIFBhcnNlcyBhIGAucGFja2FnZXNgIGZpbGUgaW50byBhIG1hcCBmcm9tIHBhY2thZ2UgbmFtZSB0byBiYXNlIFVSSS4KLy8vCi8vLyBUaGUgW3NvdXJjZV0gaXMgdGhlIGJ5dGUgY29udGVudCBvZiBhIGAucGFja2FnZXNgIGZpbGUsIGFzc3VtZWQgdG8gYmUKLy8vIFVURi04IGVuY29kZWQuIEluIHByYWN0aWNlLCBhbGwgc2lnbmlmaWNhbnQgcGFydHMgb2YgdGhlIGZpbGUgbXVzdCBiZSBBU0NJSSwKLy8vIHNvIExhdGluLTEgb3IgV2luZG93cy0xMjUyIGVuY29kaW5nIHdpbGwgYWxzbyB3b3JrIGZpbmUuCi8vLwovLy8gSWYgdGhlIGZpbGUgY29udGVudCBpcyBhdmFpbGFibGUgYXMgYSBzdHJpbmcsIGl0cyBbU3RyaW5nLmNvZGVVbml0c10gY2FuCi8vLyBiZSB1c2VkIGFzIHRoZSBgc291cmNlYCBhcmd1bWVudCBvZiB0aGlzIGZ1bmN0aW9uLgovLy8KLy8vIFRoZSBbYmFzZUxvY2F0aW9uXSBpcyB1c2VkIGFzIGEgYmFzZSBVUkkgdG8gcmVzb2x2ZSBhbGwgcmVsYXRpdmUKLy8vIFVSSSByZWZlcmVuY2VzIGFnYWluc3QuCi8vLyBJZiB0aGUgY29udGVudCB3YXMgcmVhZCBmcm9tIGEgZmlsZSwgYGJhc2VMb2NhdGlvbmAgc2hvdWxkIGJlIHRoZQovLy8gbG9jYXRpb24gb2YgdGhhdCBmaWxlLgovLy8KLy8vIElmIFthbGxvd0RlZmF1bHRQYWNrYWdlXSBpcyBzZXQgdG8gdHJ1ZSwgYW4gZW50cnkgd2l0aCBhbiBlbXB0eSBwYWNrYWdlIG5hbWUKLy8vIGlzIGFjY2VwdGVkLiBUaGlzIGVudHJ5IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBwYWNrYWdlLCBidXQgaW5zdGVhZAovLy8gcmVwcmVzZW50cyBhICpkZWZhdWx0IHBhY2thZ2UqIHdoaWNoIG5vbi1wYWNrYWdlIGxpYnJhcmllcyBtYXkgYmUgY29uc2lkZXJlZAovLy8gcGFydCBvZiBpbiBzb21lIGNhc2VzLiBUaGUgdmFsdWUgb2YgdGhhdCBlbnRyeSBtdXN0IGJlIGEgdmFsaWQgcGFja2FnZSBuYW1lLgovLy8KLy8vIFJldHVybnMgYSBzaW1wbGUgbWFwcGluZyBmcm9tIHBhY2thZ2UgbmFtZSB0byBwYWNrYWdlIGxvY2F0aW9uLgovLy8gSWYgZGVmYXVsdCBwYWNrYWdlIGlzIGFsbG93ZWQsIHRoZSBtYXAgbWFwcyB0aGUgZW1wdHkgc3RyaW5nIHRvIHRoZSBkZWZhdWx0IHBhY2thZ2UncyBuYW1lLgpNYXA8U3RyaW5nLCBVcmk+IHBhcnNlKExpc3Q8aW50PiBzb3VyY2UsIFVyaSBiYXNlTG9jYXRpb24sCiAgICB7Ym9vbCBhbGxvd0RlZmF1bHRQYWNrYWdlID0gZmFsc2V9KSB7CiAgaW50IGluZGV4ID0gMDsKICBNYXA8U3RyaW5nLCBVcmk+IHJlc3VsdCA9IDxTdHJpbmcsIFVyaT57fTsKICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7CiAgICBib29sIGlzQ29tbWVudCA9IGZhbHNlOwogICAgaW50IHN0YXJ0ID0gaW5kZXg7CiAgICBpbnQgc2VwYXJhdG9ySW5kZXggPSAtMTsKICAgIGludCBlbmQgPSBzb3VyY2UubGVuZ3RoOwogICAgaW50IGNoYXIgPSBzb3VyY2VbaW5kZXgrK107CiAgICBpZiAoY2hhciA9PSAkY3IgfHwgY2hhciA9PSAkbGYpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoY2hhciA9PSAkY29sb24pIHsKICAgICAgaWYgKCFhbGxvd0RlZmF1bHRQYWNrYWdlKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJNaXNzaW5nIHBhY2thZ2UgbmFtZSIsIHNvdXJjZSwgaW5kZXggLSAxKTsKICAgICAgfQogICAgICBzZXBhcmF0b3JJbmRleCA9IGluZGV4IC0gMTsKICAgIH0KICAgIGlzQ29tbWVudCA9IGNoYXIgPT0gJGhhc2g7CiAgICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7CiAgICAgIGNoYXIgPSBzb3VyY2VbaW5kZXgrK107CiAgICAgIGlmIChjaGFyID09ICRjb2xvbiAmJiBzZXBhcmF0b3JJbmRleCA8IDApIHsKICAgICAgICBzZXBhcmF0b3JJbmRleCA9IGluZGV4IC0gMTsKICAgICAgfSBlbHNlIGlmIChjaGFyID09ICRjciB8fCBjaGFyID09ICRsZikgewogICAgICAgIGVuZCA9IGluZGV4IC0gMTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzQ29tbWVudCkgY29udGludWU7CiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAwKSB7CiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiTm8gJzonIG9uIGxpbmUiLCBzb3VyY2UsIGluZGV4IC0gMSk7CiAgICB9CiAgICB2YXIgcGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlLCBzdGFydCwgc2VwYXJhdG9ySW5kZXgpOwogICAgaWYgKHBhY2thZ2VOYW1lLmlzRW1wdHkKICAgICAgICA/ICFhbGxvd0RlZmF1bHRQYWNrYWdlCiAgICAgICAgOiAhaXNWYWxpZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIk5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZSIsIHBhY2thZ2VOYW1lLCAwKTsKICAgIH0KICAgIHZhciBwYWNrYWdlVmFsdWUgPQogICAgICAgIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhzb3VyY2UsIHNlcGFyYXRvckluZGV4ICsgMSwgZW5kKTsKICAgIFVyaSBwYWNrYWdlTG9jYXRpb247CiAgICBpZiAocGFja2FnZU5hbWUuaXNFbXB0eSkgewogICAgICBpZiAoIWlzVmFsaWRQYWNrYWdlTmFtZShwYWNrYWdlVmFsdWUpKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAiRGVmYXVsdCBwYWNrYWdlIGVudHJ5IHZhbHVlIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZSIpOwogICAgICB9CiAgICAgIHBhY2thZ2VMb2NhdGlvbiA9IFVyaShwYXRoOiBwYWNrYWdlVmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgcGFja2FnZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLnJlc29sdmUocGFja2FnZVZhbHVlKTsKICAgICAgaWYgKCFwYWNrYWdlTG9jYXRpb24ucGF0aC5lbmRzV2l0aCgnLycpKSB7CiAgICAgICAgcGFja2FnZUxvY2F0aW9uID0KICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLnJlcGxhY2UocGF0aDogcGFja2FnZUxvY2F0aW9uLnBhdGggKyAiLyIpOwogICAgICB9CiAgICB9CiAgICBpZiAocmVzdWx0LmNvbnRhaW5zS2V5KHBhY2thZ2VOYW1lKSkgewogICAgICBpZiAocGFja2FnZU5hbWUuaXNFbXB0eSkgewogICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgZGVmYXVsdCBwYWNrYWdlIGVudHJ5Iiwgc291cmNlLCBzdGFydCk7CiAgICAgIH0KICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJTYW1lIHBhY2thZ2UgbmFtZSBvY2N1cmVkIHR3aWNlIiwgc291cmNlLCBzdGFydCk7CiAgICB9CiAgICByZXN1bHRbcGFja2FnZU5hbWVdID0gcGFja2FnZUxvY2F0aW9uOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CgovLy8gV3JpdGVzIHRoZSBtYXBwaW5nIHRvIGEgW1N0cmluZ1NpbmtdLgovLy8KLy8vIElmIFtjb21tZW50XSBpcyBwcm92aWRlZCwgdGhlIG91dHB1dCB3aWxsIGNvbnRhaW4gdGhpcyBjb21tZW50Ci8vLyB3aXRoIGAjIGAgaW4gZnJvbnQgb2YgZWFjaCBsaW5lLgovLy8gTGluZXMgYXJlIGRlZmluZWQgYXMgZW5kaW5nIGluIGxpbmUgZmVlZCAoYCdcbidgKS4gSWYgdGhlIGZpbmFsCi8vLyBsaW5lIG9mIHRoZSBjb21tZW50IGRvZXNuJ3QgZW5kIGluIGEgbGluZSBmZWVkLCBvbmUgd2lsbCBiZSBhZGRlZC4KLy8vCi8vLyBJZiBbYmFzZVVyaV0gaXMgcHJvdmlkZWQsIHBhY2thZ2UgbG9jYXRpb25zIHdpbGwgYmUgbWFkZSByZWxhdGl2ZQovLy8gdG8gdGhlIGJhc2UgVVJJLCBpZiBwb3NzaWJsZSwgYmVmb3JlIHdyaXRpbmcuCi8vLwovLy8gQWxsIHRoZSBrZXlzIG9mIFtwYWNrYWdlTWFwcGluZ10gbXVzdCBiZSB2YWxpZCBwYWNrYWdlIG5hbWVzLAovLy8gYW5kIHRoZSB2YWx1ZXMgbXVzdCBiZSBVUklzIHRoYXQgZG8gbm90IGhhdmUgdGhlIGBwYWNrYWdlOmAgc2NoZW1lLgp2b2lkIHdyaXRlKFN0cmluZ1Npbmsgb3V0cHV0LCBNYXA8U3RyaW5nLCBVcmk+IHBhY2thZ2VNYXBwaW5nLAogICAge1VyaSBiYXNlVXJpLCBTdHJpbmcgY29tbWVudH0pIHsKICBpZiAoYmFzZVVyaSAhPSBudWxsICYmICFiYXNlVXJpLmlzQWJzb2x1dGUpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGJhc2VVcmksICJiYXNlVXJpIiwgIk11c3QgYmUgYWJzb2x1dGUiKTsKICB9CgogIGlmIChjb21tZW50ICE9IG51bGwpIHsKICAgIHZhciBsaW5lcyA9IGNvbW1lbnQuc3BsaXQoJ1xuJyk7CiAgICBpZiAobGluZXMubGFzdC5pc0VtcHR5KSBsaW5lcy5yZW1vdmVMYXN0KCk7CiAgICBmb3IgKHZhciBjb21tZW50TGluZSBpbiBsaW5lcykgewogICAgICBvdXRwdXQud3JpdGUoJyMgJyk7CiAgICAgIG91dHB1dC53cml0ZWxuKGNvbW1lbnRMaW5lKTsKICAgIH0KICB9IGVsc2UgewogICAgb3V0cHV0LndyaXRlKCIjIGdlbmVyYXRlZCBieSBwYWNrYWdlOnBhY2thZ2VfY29uZmlnIGF0ICIpOwogICAgb3V0cHV0LndyaXRlKG5ldyBEYXRlVGltZS5ub3coKSk7CiAgICBvdXRwdXQud3JpdGVsbigpOwogIH0KCiAgcGFja2FnZU1hcHBpbmcuZm9yRWFjaCgoU3RyaW5nIHBhY2thZ2VOYW1lLCBVcmkgdXJpKSB7CiAgICAvLyBWYWxpZGF0ZSBwYWNrYWdlTmFtZS4KICAgIGlmICghaXNWYWxpZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignIiRwYWNrYWdlTmFtZSIgaXMgbm90IGEgdmFsaWQgcGFja2FnZSBuYW1lJyk7CiAgICB9CiAgICBpZiAodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgICAiUGFja2FnZSBsb2NhdGlvbiBtdXN0IG5vdCBiZSBhIHBhY2thZ2U6IFVSSSIsIHVyaS50b1N0cmluZygpKTsKICAgIH0KICAgIG91dHB1dC53cml0ZShwYWNrYWdlTmFtZSk7CiAgICBvdXRwdXQud3JpdGUoJzonKTsKICAgIC8vIElmIGJhc2VVcmkgcHJvdmlkZWQsIG1ha2UgdXJpIHJlbGF0aXZlLgogICAgaWYgKGJhc2VVcmkgIT0gbnVsbCkgewogICAgICB1cmkgPSBfcmVsYXRpdml6ZSh1cmksIGJhc2VVcmkpOwogICAgfQogICAgb3V0cHV0LndyaXRlKHVyaSk7CiAgICBpZiAoIXVyaS5wYXRoLmVuZHNXaXRoKCcvJykpIHsKICAgICAgb3V0cHV0LndyaXRlKCcvJyk7CiAgICB9CiAgICBvdXRwdXQud3JpdGVsbigpOwogIH0pOwp9CgovLy8gQXR0ZW1wdHMgdG8gcmV0dXJuIGEgcmVsYXRpdmUgVVJJIGZvciBbdXJpXS4KLy8vCi8vLyBUaGUgcmVzdWx0IFVSSSBzYXRpc2ZpZXMgYGJhc2VVcmkucmVzb2x2ZVVyaShyZXN1bHQpID09IHVyaWAsCi8vLyBidXQgbWF5IGJlIHJlbGF0aXZlLgovLy8gVGhlIGBiYXNlVXJpYCBtdXN0IGJlIGFic29sdXRlLgpVcmkgX3JlbGF0aXZpemUoVXJpIHVyaSwgVXJpIGJhc2VVcmkpIHsKICBhc3NlcnQoYmFzZVVyaS5pc0Fic29sdXRlKTsKICBpZiAodXJpLmhhc1F1ZXJ5IHx8IHVyaS5oYXNGcmFnbWVudCkgewogICAgdXJpID0gbmV3IFVyaSgKICAgICAgICBzY2hlbWU6IHVyaS5zY2hlbWUsCiAgICAgICAgdXNlckluZm86IHVyaS5oYXNBdXRob3JpdHkgPyB1cmkudXNlckluZm8gOiBudWxsLAogICAgICAgIGhvc3Q6IHVyaS5oYXNBdXRob3JpdHkgPyB1cmkuaG9zdCA6IG51bGwsCiAgICAgICAgcG9ydDogdXJpLmhhc0F1dGhvcml0eSA/IHVyaS5wb3J0IDogbnVsbCwKICAgICAgICBwYXRoOiB1cmkucGF0aCk7CiAgfQoKICAvLyBBbHJlYWR5IHJlbGF0aXZlLiBXZSBhc3N1bWUgdGhlIGNhbGxlciBrbm93cyB3aGF0IHRoZXkgYXJlIGRvaW5nLgogIGlmICghdXJpLmlzQWJzb2x1dGUpIHJldHVybiB1cmk7CgogIGlmIChiYXNlVXJpLnNjaGVtZSAhPSB1cmkuc2NoZW1lKSB7CiAgICByZXR1cm4gdXJpOwogIH0KCiAgLy8gSWYgYXV0aG9yaXR5IGRpZmZlcnMsIHdlIGNvdWxkIHJlbW92ZSB0aGUgc2NoZW1lLCBidXQgaXQncyBub3Qgd29ydGggaXQuCiAgaWYgKHVyaS5oYXNBdXRob3JpdHkgIT0gYmFzZVVyaS5oYXNBdXRob3JpdHkpIHJldHVybiB1cmk7CiAgaWYgKHVyaS5oYXNBdXRob3JpdHkpIHsKICAgIGlmICh1cmkudXNlckluZm8gIT0gYmFzZVVyaS51c2VySW5mbyB8fAogICAgICAgIHVyaS5ob3N0LnRvTG93ZXJDYXNlKCkgIT0gYmFzZVVyaS5ob3N0LnRvTG93ZXJDYXNlKCkgfHwKICAgICAgICB1cmkucG9ydCAhPSBiYXNlVXJpLnBvcnQpIHsKICAgICAgcmV0dXJuIHVyaTsKICAgIH0KICB9CgogIGJhc2VVcmkgPSBiYXNlVXJpLm5vcm1hbGl6ZVBhdGgoKTsKICBMaXN0PFN0cmluZz4gYmFzZSA9IGJhc2VVcmkucGF0aFNlZ21lbnRzLnRvTGlzdCgpOwogIGlmIChiYXNlLmlzTm90RW1wdHkpIHsKICAgIGJhc2UgPSBuZXcgTGlzdDxTdHJpbmc+LmZyb20oYmFzZSkuLnJlbW92ZUxhc3QoKTsKICB9CiAgdXJpID0gdXJpLm5vcm1hbGl6ZVBhdGgoKTsKICBMaXN0PFN0cmluZz4gdGFyZ2V0ID0gdXJpLnBhdGhTZWdtZW50cy50b0xpc3QoKTsKICBpZiAodGFyZ2V0LmlzTm90RW1wdHkgJiYgdGFyZ2V0Lmxhc3QuaXNFbXB0eSkgdGFyZ2V0LnJlbW92ZUxhc3QoKTsKICBpbnQgaW5kZXggPSAwOwogIHdoaWxlIChpbmRleCA8IGJhc2UubGVuZ3RoICYmIGluZGV4IDwgdGFyZ2V0Lmxlbmd0aCkgewogICAgaWYgKGJhc2VbaW5kZXhdICE9IHRhcmdldFtpbmRleF0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpbmRleCsrOwogIH0KICBpZiAoaW5kZXggPT0gYmFzZS5sZW5ndGgpIHsKICAgIGlmIChpbmRleCA9PSB0YXJnZXQubGVuZ3RoKSB7CiAgICAgIHJldHVybiBuZXcgVXJpKHBhdGg6ICIuLyIpOwogICAgfQogICAgcmV0dXJuIG5ldyBVcmkocGF0aDogdGFyZ2V0LnNraXAoaW5kZXgpLmpvaW4oJy8nKSk7CiAgfSBlbHNlIGlmIChpbmRleCA+IDApIHsKICAgIHJldHVybiBuZXcgVXJpKAogICAgICAgIHBhdGg6ICcuLi8nICogKGJhc2UubGVuZ3RoIC0gaW5kZXgpICsgdGFyZ2V0LnNraXAoaW5kZXgpLmpvaW4oJy8nKSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB1cmk7CiAgfQp9CoDWAE5OPAEmASYBMAFIBEpRPQRNNwRFHEYbBFFKUVEERGA7KhEtIhwXHR0gJhAGGiJKCCIGHyQeMiQvGQ8IBh0eQgZPHB8uSQYXQxkfLx9ICDENPDEaRwgGKyEfQwhPBisEEQIBKgRDJURHBEYyBEJIPyUwSwQBGSUwJRojBgs/JhYEATkdLE0GIyVKBh8XLxsnBhcjGQYWBgIBMQRCGSQoHikTHDoyMhkEAUcjASYQBAFOPBosQCQSBgQBJTUZNgQdM0UROSgNBg0EHiIiBjgaFE0LEAQCASlwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzX2ZpbGUuZGFydF1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0LXBrZy9wdWIvcGFja2FnZV9jb25maWcvbGliL3NyYy9wYWNrYWdlc19pbXBsLmRhcnSQ4y8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gSW1wbGVtZW50YXRpb25zIG9mIFtQYWNrYWdlc10gdGhhdCBtYXkgYmUgdXNlZCBpbiBlaXRoZXIgc2VydmVyIG9yIGJyb3dzZXIKLy8vIGJhc2VkIGFwcGxpY2F0aW9ucy4gRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbiBvbmx5IHJ1biBpbiB0aGUgYnJvd3NlciwKLy8vIHNlZSBbcGFja2FnZV9jb25maWcucGFja2FnZXNfaW9faW1wbF0uCmxpYnJhcnkgcGFja2FnZV9jb25maWcucGFja2FnZXNfaW1wbDsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IFVubW9kaWZpYWJsZU1hcFZpZXc7CgppbXBvcnQgIi4uL3BhY2thZ2VzLmRhcnQiOwppbXBvcnQgInV0aWwuZGFydCIgc2hvdyBjaGVja1ZhbGlkUGFja2FnZVVyaTsKCi8vLyBBIFtQYWNrYWdlc10gbnVsbC1vYmplY3QuCmNsYXNzIE5vUGFja2FnZXMgaW1wbGVtZW50cyBQYWNrYWdlcyB7CiAgY29uc3QgTm9QYWNrYWdlcygpOwoKICBVcmkgcmVzb2x2ZShVcmkgcGFja2FnZVVyaSwge1VyaSBub3RGb3VuZChVcmkgcGFja2FnZVVyaSl9KSB7CiAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjaGVja1ZhbGlkUGFja2FnZVVyaShwYWNrYWdlVXJpKTsKICAgIGlmIChub3RGb3VuZCAhPSBudWxsKSByZXR1cm4gbm90Rm91bmQocGFja2FnZVVyaSk7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICdObyBwYWNrYWdlIG5hbWVkICIkcGFja2FnZU5hbWUiJyk7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBwYWNrYWdlcyA9PiBuZXcgSXRlcmFibGU8U3RyaW5nPi5lbXB0eSgpOwoKICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCkgPT4gY29uc3QgPFN0cmluZywgVXJpPnt9OwoKICBTdHJpbmcgZ2V0IGRlZmF1bHRQYWNrYWdlTmFtZSA9PiBudWxsOwoKICBTdHJpbmcgcGFja2FnZU1ldGFkYXRhKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGtleSkgPT4gbnVsbDsKCiAgU3RyaW5nIGxpYnJhcnlNZXRhZGF0YShVcmkgbGlicmFyeVVyaSwgU3RyaW5nIGtleSkgPT4gbnVsbDsKfQoKLy8vIEJhc2UgY2xhc3MgZm9yIFtQYWNrYWdlc10gaW1wbGVtZW50YXRpb25zLgovLy8KLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgW3Jlc29sdmVdIG1ldGhvZCBpbiB0ZXJtcyBvZiBhIHByaXZhdGUKLy8vIG1lbWJlcgphYnN0cmFjdCBjbGFzcyBQYWNrYWdlc0Jhc2UgaW1wbGVtZW50cyBQYWNrYWdlcyB7CiAgVXJpIHJlc29sdmUoVXJpIHBhY2thZ2VVcmksIHtVcmkgbm90Rm91bmQoVXJpIHBhY2thZ2VVcmkpfSkgewogICAgcGFja2FnZVVyaSA9IHBhY2thZ2VVcmkubm9ybWFsaXplUGF0aCgpOwogICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2hlY2tWYWxpZFBhY2thZ2VVcmkocGFja2FnZVVyaSk7CiAgICBVcmkgcGFja2FnZUJhc2UgPSBnZXRCYXNlKHBhY2thZ2VOYW1lKTsKICAgIGlmIChwYWNrYWdlQmFzZSA9PSBudWxsKSB7CiAgICAgIGlmIChub3RGb3VuZCAhPSBudWxsKSByZXR1cm4gbm90Rm91bmQocGFja2FnZVVyaSk7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAnTm8gcGFja2FnZSBuYW1lZCAiJHBhY2thZ2VOYW1lIicpOwogICAgfQogICAgU3RyaW5nIHBhY2thZ2VQYXRoID0gcGFja2FnZVVyaS5wYXRoLnN1YnN0cmluZyhwYWNrYWdlTmFtZS5sZW5ndGggKyAxKTsKICAgIHJldHVybiBwYWNrYWdlQmFzZS5yZXNvbHZlKHBhY2thZ2VQYXRoKTsKICB9CgogIC8vLyBGaW5kIGEgYmFzZSBsb2NhdGlvbiBmb3IgYSBwYWNrYWdlIG5hbWUuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIG5vIHBhY2thZ2UgZXhpc3RzIHdpdGggdGhhdCBuYW1lLCBhbmQgdGhhdCBjYW4gYmUKICAvLy8gZGV0ZXJtaW5lZC4KICBVcmkgZ2V0QmFzZShTdHJpbmcgcGFja2FnZU5hbWUpOwoKICBTdHJpbmcgZ2V0IGRlZmF1bHRQYWNrYWdlTmFtZSA9PiBudWxsOwoKICBTdHJpbmcgcGFja2FnZU1ldGFkYXRhKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGtleSkgPT4gbnVsbDsKCiAgU3RyaW5nIGxpYnJhcnlNZXRhZGF0YShVcmkgbGlicmFyeVVyaSwgU3RyaW5nIGtleSkgPT4gbnVsbDsKfQoKLy8vIEEgW1BhY2thZ2VzXSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhbiBleGlzdGluZyBtYXAuCmNsYXNzIE1hcFBhY2thZ2VzIGV4dGVuZHMgUGFja2FnZXNCYXNlIHsKICBmaW5hbCBNYXA8U3RyaW5nLCBVcmk+IF9tYXBwaW5nOwogIE1hcFBhY2thZ2VzKHRoaXMuX21hcHBpbmcpOwoKICBVcmkgZ2V0QmFzZShTdHJpbmcgcGFja2FnZU5hbWUpID0+CiAgICAgIHBhY2thZ2VOYW1lLmlzRW1wdHkgPyBudWxsIDogX21hcHBpbmdbcGFja2FnZU5hbWVdOwoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBwYWNrYWdlcyA9PiBfbWFwcGluZy5rZXlzOwoKICBNYXA8U3RyaW5nLCBVcmk+IGFzTWFwKCkgPT4gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8U3RyaW5nLCBVcmk+KF9tYXBwaW5nKTsKCiAgU3RyaW5nIGdldCBkZWZhdWx0UGFja2FnZU5hbWUgPT4gX21hcHBpbmdbIiJdPy50b1N0cmluZygpOwoKICBTdHJpbmcgcGFja2FnZU1ldGFkYXRhKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGtleSkgewogICAgaWYgKHBhY2thZ2VOYW1lLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgVXJpIHVyaSA9IF9tYXBwaW5nW3BhY2thZ2VOYW1lXTsKICAgIGlmICh1cmkgPT0gbnVsbCB8fCAhdXJpLmhhc0ZyYWdtZW50KSByZXR1cm4gbnVsbDsKICAgIC8vIFRoaXMgY2FuIGJlIG9wdGltaXplZCwgZWl0aGVyIGJ5IGNhY2hpbmcgdGhlIG1hcCBvciBieQogICAgLy8gcGFyc2luZyBpbmNyZW1lbnRhbGx5IGluc3RlYWQgb2YgcGFyc2luZyB0aGUgZW50aXJlIGZyYWdtZW50LgogICAgcmV0dXJuIFVyaS5zcGxpdFF1ZXJ5U3RyaW5nKHVyaS5mcmFnbWVudClba2V5XTsKICB9CgogIFN0cmluZyBsaWJyYXJ5TWV0YWRhdGEoVXJpIGxpYnJhcnlVcmksIFN0cmluZyBrZXkpIHsKICAgIGlmIChsaWJyYXJ5VXJpLmlzU2NoZW1lKCJwYWNrYWdlIikpIHsKICAgICAgcmV0dXJuIHBhY2thZ2VNZXRhZGF0YShsaWJyYXJ5VXJpLnBhdGhTZWdtZW50cy5maXJzdCwga2V5KTsKICAgIH0KICAgIHZhciBkZWZhdWx0UGFja2FnZU5hbWVVcmkgPSBfbWFwcGluZ1siIl07CiAgICBpZiAoZGVmYXVsdFBhY2thZ2VOYW1lVXJpICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHBhY2thZ2VNZXRhZGF0YShkZWZhdWx0UGFja2FnZU5hbWVVcmkudG9TdHJpbmcoKSwga2V5KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIEEgW1BhY2thZ2VzXSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIHJlbW90ZSAoZS5nLiwgSFRUUCkgZGlyZWN0b3J5LgovLy8KLy8vIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3Qgd2hpY2ggcGFja2FnZXMgZXhpc3Qgc2hvcnQgb2YgdHJ5aW5nIHRvIHVzZQovLy8gdGhlbS4gWW91IGNhbid0IG5lY2Vzc2FyaWx5IGNoZWNrIHdoZXRoZXIgYSBkaXJlY3RvcnkgZXhpc3RzLAovLy8gZXhjZXB0IGJ5IGNoZWNraW5nIGZvciBhIGtub3cgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LgpjbGFzcyBOb25GaWxlUGFja2FnZXNEaXJlY3RvcnlQYWNrYWdlcyBleHRlbmRzIFBhY2thZ2VzQmFzZSB7CiAgZmluYWwgVXJpIF9wYWNrYWdlQmFzZTsKICBOb25GaWxlUGFja2FnZXNEaXJlY3RvcnlQYWNrYWdlcyh0aGlzLl9wYWNrYWdlQmFzZSk7CgogIFVyaSBnZXRCYXNlKFN0cmluZyBwYWNrYWdlTmFtZSkgPT4gX3BhY2thZ2VCYXNlLnJlc29sdmUoIiRwYWNrYWdlTmFtZS8iKTsKCiAgRXJyb3IgX2ZhaWxMaXN0aW5nUGFja2FnZXMoKSB7CiAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBsaXN0IHBhY2thZ2VzIGZvciBhICR7X3BhY2thZ2VCYXNlLnNjaGVtZX06ICIKICAgICAgICAiYmFzZWQgcGFja2FnZSByb290Iik7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBwYWNrYWdlcyB7CiAgICB0aHJvdyBfZmFpbExpc3RpbmdQYWNrYWdlcygpOwogIH0KCiAgTWFwPFN0cmluZywgVXJpPiBhc01hcCgpIHsKICAgIHRocm93IF9mYWlsTGlzdGluZ1BhY2thZ2VzKCk7CiAgfQp9CoCBAE5OPAFPTismATMBGy4BHicWAUA7NyNGBAFBATUBKQFCAT4CAS8ERQsyQC07LB85JUgGTC0EAS8GShIjASkBQgE+AgE6KSMeASU6ATIBTgE9ATsqJTY+RTQEATcqQgYuKUUGEQQCAUoESkI5Pho3AUwBISE+HwQBIiIEAR0iBAIBLXBhY2thZ2U6cGFja2FnZV9jb25maWcvc3JjL3BhY2thZ2VzX2ltcGwuZGFydGNmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb21tYW5kX2xpbmVfcmVwb3J0aW5nLmRhcnSYXy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gUHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXBvcnQgYW5kIGZvcm1hdCBtZXRob2RzIG9mCi8vLyBbQ29tcGlsZXJDb250ZXh0XSB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgY29tbWFuZC1saW5lIHRvb2xzLiBUaGUgbWV0aG9kcyBpbgovLy8gdGhpcyBsaWJyYXJ5IGFyZW4ndCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGluc3RlYWQsIG9uZSBzaG91bGQgdXNlCi8vLyBbQ29tcGlsZXJDb250ZXh0XS4KbGlicmFyeSBmYXN0YS5jb21tYW5kX2xpbmVfcmVwb3J0aW5nOwoKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgbWluOwoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnCiAgICBzaG93IFNldmVyaXR5LCBzZXZlcml0eVByZWZpeGVzOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvY2hhcmFjdGVycy5kYXJ0JwogICAgc2hvdyAkQ0FSRVQsICRTUEFDRSwgJFRBQjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy91dGlsL2NvbG9ycy5kYXJ0JwogICAgc2hvdyBlbmFibGVDb2xvcnMsIGdyZWVuLCBtYWdlbnRhLCByZWQ7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvdXRpbC9yZWxhdGl2aXplLmRhcnQnCiAgICBzaG93IGlzV2luZG93cywgcmVsYXRpdml6ZVVyaTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTG9jYXRpb24sIFRyZWVOb2RlOwoKaW1wb3J0ICcuLi9jb21wdXRlX3BsYXRmb3JtX2JpbmFyaWVzX2xvY2F0aW9uLmRhcnQnIHNob3cgdHJhbnNsYXRlU2RrOwoKaW1wb3J0ICdjb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICdjcmFzaC5kYXJ0JyBzaG93IENyYXNoLCBzYWZlVG9TdHJpbmc7CgppbXBvcnQgJ2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2U7CgppbXBvcnQgJ21lc3NhZ2VzLmRhcnQnIHNob3cgZ2V0TG9jYXRpb24sIGdldFNvdXJjZUxpbmU7CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKY29uc3QgYm9vbCBoaWRlV2FybmluZ3MgPSBmYWxzZTsKCi8vLyBGb3JtYXRzIFttZXNzYWdlXSBhcyBhIHN0cmluZyB0aGF0IGlzIHN1aXRhYmxlIGZvciBvdXRwdXQgZnJvbSBhCi8vLyBjb21tYW5kLWxpbmUgdG9vbC4gVGhpcyBpbmNsdWRlcyBzb3VyY2Ugc25pcHBldHMgYW5kIGRpZmZlcmVudCBjb2xvcnMgYmFzZWQKLy8vIG9uIFtzZXZlcml0eV0uClN0cmluZyBmb3JtYXQoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHksIHtMb2NhdGlvbiBsb2NhdGlvbn0pIHsKICB0cnkgewogICAgaW50IGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA8IDEpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBUaHJvdyBpbiB0aGlzIHNpdHVhdGlvbi4gSXQgaXMgbm9ybWFsbHkgYW4gZXJyb3IgY2F1c2VkIGJ5CiAgICAgIC8vIGVtcHR5IG5hbWVzLgogICAgICBsZW5ndGggPSAxOwogICAgfQogICAgU3RyaW5nIHByZWZpeCA9IHNldmVyaXR5UHJlZml4ZXNbc2V2ZXJpdHldOwogICAgU3RyaW5nIG1lc3NhZ2VUZXh0ID0KICAgICAgICBwcmVmaXggPT0gbnVsbCA/IG1lc3NhZ2UubWVzc2FnZSA6ICIkcHJlZml4OiAke21lc3NhZ2UubWVzc2FnZX0iOwogICAgaWYgKG1lc3NhZ2UudGlwICE9IG51bGwpIHsKICAgICAgbWVzc2FnZVRleHQgKz0gIlxuJHttZXNzYWdlLnRpcH0iOwogICAgfQogICAgaWYgKGVuYWJsZUNvbG9ycykgewogICAgICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICAgICAgY2FzZSBTZXZlcml0eS5lcnJvcjoKICAgICAgICBjYXNlIFNldmVyaXR5LmludGVybmFsUHJvYmxlbToKICAgICAgICAgIG1lc3NhZ2VUZXh0ID0gcmVkKG1lc3NhZ2VUZXh0KTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFNldmVyaXR5Lndhcm5pbmc6CiAgICAgICAgICBtZXNzYWdlVGV4dCA9IG1hZ2VudGEobWVzc2FnZVRleHQpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgU2V2ZXJpdHkuY29udGV4dDoKICAgICAgICAgIG1lc3NhZ2VUZXh0ID0gZ3JlZW4obWVzc2FnZVRleHQpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gdW5oYW5kbGVkKCIkc2V2ZXJpdHkiLCAiZm9ybWF0IiwgLTEsIG51bGwpOwogICAgICB9CiAgICB9CgogICAgaWYgKG1lc3NhZ2UudXJpICE9IG51bGwpIHsKICAgICAgU3RyaW5nIHBhdGggPQogICAgICAgICAgcmVsYXRpdml6ZVVyaShVcmkuYmFzZSwgdHJhbnNsYXRlU2RrKG1lc3NhZ2UudXJpKSwgaXNXaW5kb3dzKTsKICAgICAgaW50IG9mZnNldCA9IG1lc3NhZ2UuY2hhck9mZnNldDsKICAgICAgbG9jYXRpb24gPz89IChvZmZzZXQgPT0gLTEgPyBudWxsIDogZ2V0TG9jYXRpb24obWVzc2FnZS51cmksIG9mZnNldCkpOwogICAgICBpZiAobG9jYXRpb24/LmxpbmUgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgICBsb2NhdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgU3RyaW5nIHNvdXJjZUxpbmUgPSBnZXRTb3VyY2VMaW5lKGxvY2F0aW9uKTsKICAgICAgcmV0dXJuIGZvcm1hdEVycm9yTWVzc2FnZSgKICAgICAgICAgIHNvdXJjZUxpbmUsIGxvY2F0aW9uLCBsZW5ndGgsIHBhdGgsIG1lc3NhZ2VUZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBtZXNzYWdlVGV4dDsKICAgIH0KICB9IGNhdGNoIChlcnJvciwgdHJhY2UpIHsKICAgIHByaW50KCJDcmFzaCB3aGVuIGZvcm1hdHRpbmc6ICIKICAgICAgICAiWyR7bWVzc2FnZS5jb2RlLm5hbWV9XSAke3NhZmVUb1N0cmluZyhtZXNzYWdlLm1lc3NhZ2UpfVxuIgogICAgICAgICIke3NhZmVUb1N0cmluZyhlcnJvcil9XG4iCiAgICAgICAgIiR0cmFjZSIpOwogICAgdGhyb3cgbmV3IENyYXNoKG1lc3NhZ2UudXJpLCBtZXNzYWdlLmNoYXJPZmZzZXQsIGVycm9yLCB0cmFjZSk7CiAgfQp9CgpTdHJpbmcgZm9ybWF0RXJyb3JNZXNzYWdlKFN0cmluZyBzb3VyY2VMaW5lLCBMb2NhdGlvbiBsb2NhdGlvbiwKICAgIGludCBzcXVpZ2dseUxlbmd0aCwgU3RyaW5nIHBhdGgsIFN0cmluZyBtZXNzYWdlVGV4dCkgewogIGlmIChzb3VyY2VMaW5lID09IG51bGwpIHsKICAgIHNvdXJjZUxpbmUgPSAiIjsKICB9IGVsc2UgaWYgKHNvdXJjZUxpbmUuaXNOb3RFbXB0eSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBNdWNoIG1vcmUgY291bGQgYmUgZG9uZSB0byBpbmRlbnQgcHJvcGVybHkgaW4gdGhlCiAgICAvLyBwcmVzZW5jZSBvZiBhbGwgc29ydHMgb2YgdW5pY29kZSB3ZWlyZG5lc3MuCiAgICAvLyBUaGlzIGhhbmRsaW5nIGNvdmVycyB0aGUgY29tbW9uIGNhc2Ugb2Ygc2luZ2xlLXdpZHRoIGNoYXJhY3RlcnMKICAgIC8vIGluZGVudGVkIHdpdGggc3BhY2VzIGFuZC9vciB0YWJzLCB1c2luZyBubyBzdXJyb2dhdGVzLgogICAgaW50IGluZGVudExlbmd0aCA9IGxvY2F0aW9uLmNvbHVtbiAtIDE7CiAgICBVaW50OExpc3QgaW5kZW50YXRpb24gPSBuZXcgVWludDhMaXN0KGluZGVudExlbmd0aCArIHNxdWlnZ2x5TGVuZ3RoKQogICAgICAuLmZpbGxSYW5nZSgwLCBpbmRlbnRMZW5ndGgsICRTUEFDRSkKICAgICAgLi5maWxsUmFuZ2UoaW5kZW50TGVuZ3RoLCBpbmRlbnRMZW5ndGggKyBzcXVpZ2dseUxlbmd0aCwgJENBUkVUKTsKICAgIGludCBsZW5ndGhJblNvdXJjZUxpbmUgPSBtaW4oaW5kZW50YXRpb24ubGVuZ3RoLCBzb3VyY2VMaW5lLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aEluU291cmNlTGluZTsgaSsrKSB7CiAgICAgIGlmIChzb3VyY2VMaW5lLmNvZGVVbml0QXQoaSkgPT0gJFRBQikgewogICAgICAgIGluZGVudGF0aW9uW2ldID0gJFRBQjsKICAgICAgfQogICAgfQogICAgU3RyaW5nIHBvaW50ZXIgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoaW5kZW50YXRpb24pOwogICAgaWYgKHBvaW50ZXIubGVuZ3RoID4gc291cmNlTGluZS5sZW5ndGgpIHsKICAgICAgLy8gVHJ1bmNhdGUgdGhlIGNhcmV0cyB0byBoYW5kbGUgbWVzc2FnZXMgdGhhdCBzcGFuIG11bHRpcGxlIGxpbmVzLgogICAgICBpbnQgcG9pbnRlckxlbmd0aCA9IHNvdXJjZUxpbmUubGVuZ3RoOwogICAgICAvLyBBZGQgb25lIHRvIGNvdmVyIHRoZSBjYXNlIG9mIGEgcGFyc2VyIGVycm9yIHBvaW50aW5nIHRvIEVPRiB3aGVuCiAgICAgIC8vIHRoZSBsYXN0IGxpbmUgZG9lc24ndCBlbmQgd2l0aCBhIG5ld2xpbmUuIEZvciBtZXNzYWdlcyBzcGFubmluZwogICAgICAvLyBtdWx0aXBsZSBsaW5lcywgdGhpcyBhbHNvIHByb3ZpZGVzIGEgbWlub3IgdmlzdWFsIGNsdWUgdGhhdCBjYW4gYmUKICAgICAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgRmFzdGEuCiAgICAgIHBvaW50ZXJMZW5ndGggKz0gMTsKICAgICAgcG9pbnRlciA9IHBvaW50ZXIuc3Vic3RyaW5nKDAsIHBvaW50ZXJMZW5ndGgpOwogICAgICBwb2ludGVyICs9ICIuLi4iOwogICAgfQogICAgc291cmNlTGluZSA9ICJcbiRzb3VyY2VMaW5lXG4kcG9pbnRlciI7CiAgfQogIFN0cmluZyBwb3NpdGlvbiA9CiAgICAgIGxvY2F0aW9uID09IG51bGwgPyAiIiA6ICI6JHtsb2NhdGlvbi5saW5lfToke2xvY2F0aW9uLmNvbHVtbn0iOwogIHJldHVybiAiJHBhdGgkcG9zaXRpb246ICRtZXNzYWdlVGV4dCRzb3VyY2VMaW5lIjsKfQoKLy8vIEFyZSBwcm9ibGVtcyBvZiBbc2V2ZXJpdHldIHN1cHByZXNzZWQ/CmJvb2wgaXNIaWRkZW4oU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICBjYXNlIFNldmVyaXR5LmVycm9yOgogICAgY2FzZSBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW06CiAgICBjYXNlIFNldmVyaXR5LmNvbnRleHQ6CiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBjYXNlIFNldmVyaXR5Lndhcm5pbmc6CiAgICAgIHJldHVybiBoaWRlV2FybmluZ3M7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHNldmVyaXR5IiwgImlzSGlkZGVuIiwgLTEsIG51bGwpOwogIH0KfQoKLy8vIEFyZSBwcm9ibGVtcyBvZiBbc2V2ZXJpdHldIGZhdGFsPyBUaGF0IGlzLCBzaG91bGQgdGhlIGNvbXBpbGVyIHRlcm1pbmF0ZQovLy8gaW1tZWRpYXRlbHk/CmJvb2wgc2hvdWxkVGhyb3dPbihTZXZlcml0eSBzZXZlcml0eSkgewogIHN3aXRjaCAoc2V2ZXJpdHkpIHsKICAgIGNhc2UgU2V2ZXJpdHkuZXJyb3I6CiAgICAgIHJldHVybiBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLnRocm93T25FcnJvcnNGb3JEZWJ1Z2dpbmc7CgogICAgY2FzZSBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW06CiAgICAgIHJldHVybiB0cnVlOwoKICAgIGNhc2UgU2V2ZXJpdHkud2FybmluZzoKICAgICAgcmV0dXJuIENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMudGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nOwoKICAgIGNhc2UgU2V2ZXJpdHkuY29udGV4dDoKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB1bmhhbmRsZWQoIiRzZXZlcml0eSIsICJzaG91bGRUaHJvd09uIiwgLTEsIG51bGwpOwogIH0KfQoKYm9vbCBpc0NvbXBpbGVUaW1lRXJyb3IoU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICBjYXNlIFNldmVyaXR5LmVycm9yOgogICAgY2FzZSBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW06CiAgICAgIHJldHVybiB0cnVlOwoKICAgIGNhc2UgU2V2ZXJpdHkud2FybmluZzoKICAgIGNhc2UgU2V2ZXJpdHkuY29udGV4dDoKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhc2UgU2V2ZXJpdHkuaWdub3JlZDoKICAgICAgYnJlYWs7IC8vIEZhbGwtdGhyb3VnaCB0byB1bmhhbmRsZWQgYmVsb3cuCiAgfQogIHJldHVybiB1bmhhbmRsZWQoIiRzZXZlcml0eSIsICJpc0NvbXBpbGVUaW1lRXJyb3IiLCAtMSwgbnVsbCk7Cn0KgMIATk48AUpPUBcmAR0BKQFAJQFBHwE6LAE+IwE6AUcBNQEuAS8BOAEnASEBRVATUAghFk8WEgYwGUofKQYYGh0nKhEBHy4RAR8sEQERPQgGAR8USSdNMRkIMyE8DRoGGyREIxNEBAIBQDscFSZHM0c+LEkrSEkzLh8IBjwuSi1KSUwlGjUYBiwEFEY0AgErIxYZIxsUARsbAQ07BAIBTREoFhlIASMTARtKARsUAQ1ABAIBLRYZIxMBGxsUARsxBEECATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0VWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL21lc3NhZ2VzLmRhcnSGPC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm1lc3NhZ2VzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5LCBMb2NhdGlvbiwgQ29tcG9uZW50LCBUcmVlTm9kZTsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmV4cG9ydCAnZmFzdGFfY29kZXMuZGFydCc7Cgpib29sIGdldCBpc1ZlcmJvc2UgPT4gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy52ZXJib3NlOwoKTG9jYXRpb24gZ2V0TG9jYXRpb24oVXJpIHVyaSwgaW50IGNoYXJPZmZzZXQpIHsKICByZXR1cm4gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2VbdXJpXT8uZ2V0TG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0KTsKfQoKTG9jYXRpb24gZ2V0TG9jYXRpb25Gcm9tVXJpKFVyaSB1cmksIGludCBjaGFyT2Zmc2V0KSB7CiAgaWYgKGNoYXJPZmZzZXQgPT0gLTEpIHJldHVybiBudWxsOwogIHJldHVybiBnZXRMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQpOwp9CgpTdHJpbmcgZ2V0U291cmNlTGluZShMb2NhdGlvbiBsb2NhdGlvbikgewogIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKICByZXR1cm4gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2VbbG9jYXRpb24uZmlsZV0KICAgICAgPy5nZXRUZXh0TGluZShsb2NhdGlvbi5saW5lKTsKfQoKTG9jYXRpb24gZ2V0TG9jYXRpb25Gcm9tTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgaWYgKG5vZGUuZW5jbG9zaW5nQ29tcG9uZW50ID09IG51bGwpIHsKICAgIFRyZWVOb2RlIHBhcmVudCA9IG5vZGU7CiAgICB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGlzISBMaWJyYXJ5KSB7CiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICB9CiAgICBpZiAocGFyZW50IGlzIExpYnJhcnkpIHsKICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMudGFyZ2V0CiAgICAgICAgICAuY29uZmlndXJlQ29tcG9uZW50KAogICAgICAgICAgICAgIG5ldyBDb21wb25lbnQodXJpVG9Tb3VyY2U6IENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnVyaVRvU291cmNlKSk7CiAgICAgIGNvbXBvbmVudC5saWJyYXJpZXMuYWRkKHBhcmVudCk7CiAgICAgIHBhcmVudC5wYXJlbnQgPSBjb21wb25lbnQ7CiAgICAgIExvY2F0aW9uIHJlc3VsdCA9IG5vZGUubG9jYXRpb247CiAgICAgIGNvbXBvbmVudC5saWJyYXJpZXMuY2xlYXIoKTsKICAgICAgcGFyZW50LnBhcmVudCA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9IGVsc2UgewogICAgcmV0dXJuIG5vZGUubG9jYXRpb247CiAgfQp9CjYATk48ARgBTgE1ARsBPwEwUQIBNyUnAgEqJTwkAgEuKRwzHgYdQx9QJyEnIxwVDRMGCxoEAgEpcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL21lc3NhZ2VzLmRhcnRVZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcHJvYmxlbXMuZGFydIrPLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucHJvYmxlbXM7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydCcKICAgIHNob3cgU2V2ZXJpdHksIHNldmVyaXR5VGV4dHM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEZpbGVVcmlOb2RlLCBUcmVlTm9kZTsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydCwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWQ7CgpjbGFzcyBEZWJ1Z0Fib3J0IHsKICBmaW5hbCBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwoKICBEZWJ1Z0Fib3J0KFVyaSB1cmksIGludCBjaGFyT2Zmc2V0LCBTZXZlcml0eSBzZXZlcml0eSwgU3RhY2tUcmFjZSB0cmFjZSkKICAgICAgOiBtZXNzYWdlID0gdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1EZWJ1Z0Fib3J0CiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHNldmVyaXR5VGV4dHNbc2V2ZXJpdHldLCAiJHRyYWNlIikKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKCiAgdG9TdHJpbmcoKSA9PiAiRGVidWdBYm9ydDogJHttZXNzYWdlLm1lc3NhZ2V9IjsKfQoKLy8vIFVzZWQgdG8gcmVwb3J0IGFuIGludGVybmFsIGVycm9yLgovLy8KLy8vIEludGVybmFsIGVycm9ycyBzaG91bGQgYmUgYXZvaWRlZCBhcyBiZXN0IGFzIHBvc3NpYmxlLCBidXQgYXJlIHByZWZlcnJlZAovLy8gb3ZlciBhc3NlcnRpb24gZmFpbHVyZXMuIFRoZSBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIGFuIHVwcGVyLWNhc2UgbGV0dGVyCi8vLyBhbmQgY29udGFpbiBhIHNob3J0IGRlc2NyaXB0aW9uIHRoYXQgbWF5IGhlbHAgYSBkZXZlbG9wZXIgZGVidWcgdGhlIGlzc3VlLgovLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnN0ZWFkIG9mIHVzaW5nIGB0aHJvd2AsIGFzIHRoaXMgYWxsb3dzIHVzIHRvCi8vLyBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gdGhyb3dzIGFueXdoZXJlIGVsc2UgaW4gdGhlIGNvZGViYXNlLgovLy8KLy8vIEJlZm9yZSBwcmludGluZyB0aGUgbWVzc2FnZSwgdGhlIHN0cmluZyBgIkludGVybmFsIGVycm9yOiAiYCBpcyBwcmVwZW5kZWQuCmR5bmFtaWMgaW50ZXJuYWxQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICB0aHJvdyBDb21waWxlckNvbnRleHQuY3VycmVudC5mb3JtYXQoCiAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpLAogICAgICBTZXZlcml0eS5pbnRlcm5hbFByb2JsZW0pOwp9CgpkeW5hbWljIHVuaW1wbGVtZW50ZWQoU3RyaW5nIHdoYXQsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkLndpdGhBcmd1bWVudHMod2hhdCksCiAgICAgIGNoYXJPZmZzZXQsCiAgICAgIHVyaSk7Cn0KCmR5bmFtaWMgdW5oYW5kbGVkKFN0cmluZyB3aGF0LCBTdHJpbmcgd2hlcmUsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQud2l0aEFyZ3VtZW50cyh3aGF0LCB3aGVyZSksCiAgICAgIGNoYXJPZmZzZXQsCiAgICAgIHVyaSk7Cn0KCmR5bmFtaWMgdW5leHBlY3RlZChTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkLndpdGhBcmd1bWVudHMoZXhwZWN0ZWQsIGFjdHVhbCksCiAgICAgIGNoYXJPZmZzZXQsCiAgICAgIHVyaSk7Cn0KCmR5bmFtaWMgdW5zdXBwb3J0ZWQoU3RyaW5nIG9wZXJhdGlvbiwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmkpIHsKICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKAogICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkLndpdGhBcmd1bWVudHMob3BlcmF0aW9uKSwKICAgICAgY2hhck9mZnNldCwKICAgICAgdXJpKTsKfQoKVXJpIGdldEZpbGVVcmkoVHJlZU5vZGUgbm9kZSkgewogIGRvIHsKICAgIGlmIChub2RlIGlzIEZpbGVVcmlOb2RlKSByZXR1cm4gbm9kZS5maWxlVXJpOwogICAgbm9kZSA9IG5vZGUucGFyZW50OwogIH0gd2hpbGUgKG5vZGUgaXMgVHJlZU5vZGUpOwogIHJldHVybiBudWxsOwp9ClcATk48ARgBQCIBPQE1ARcJGBESKysqLiwBEyABSzQ+NgEyAgEmBE1QT1BDBE9EKDchAgE+GkASDAIBSBpDEgwCAU4aSRIMAgFBGkMSDAIBIAcyGB4PAgEpcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Byb2JsZW1zLmRhcnRTZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdGlja2VyLmRhcnSDbS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnRpY2tlcjsKCmNsYXNzIFRpY2tlciB7CiAgZmluYWwgU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOwoKICBib29sIGlzVmVyYm9zZTsKCiAgRHVyYXRpb24gcHJldmlvdXNUaWNrOwoKICBUaWNrZXIoe3RoaXMuaXNWZXJib3NlOiB0cnVlfSkgewogICAgcHJldmlvdXNUaWNrID0gc3cuZWxhcHNlZDsKICB9CgogIHZvaWQgbG9nTXMoT2JqZWN0IG1lc3NhZ2UpIHsKICAgIGxvZygoRHVyYXRpb24gZWxhcHNlZCwgRHVyYXRpb24gc2luY2VTdGFydCkgewogICAgICBwcmludCgiJHNpbmNlU3RhcnQ6ICRtZXNzYWdlIGluICR7ZWxhcHNlZC5pbk1pbGxpc2Vjb25kc31tcy4iKTsKICAgIH0pOwogIH0KCiAgdm9pZCBsb2codm9pZCBmKER1cmF0aW9uIGVsYXBzZWQsIER1cmF0aW9uIHNpbmNlU3RhcnQpKSB7CiAgICBEdXJhdGlvbiBlbGFwc2VkID0gc3cuZWxhcHNlZDsKICAgIHRyeSB7CiAgICAgIGlmIChpc1ZlcmJvc2UpIGYoZWxhcHNlZCAtIHByZXZpb3VzVGljaywgZWxhcHNlZCk7CiAgICB9IGZpbmFsbHkgewogICAgICBwcmV2aW91c1RpY2sgPSBzdy5lbGFwc2VkOwogICAgfQogIH0KCiAgdm9pZCByZXNldCgpIHsKICAgIHN3LnJlc2V0KCk7CiAgICBwcmV2aW91c1RpY2sgPSBzdy5lbGFwc2VkOwogIH0KfQonAE5OPAEWAQ8xARIBGQEjHwQBHzJGCAQBPCMKORAhBgQBERAfBAIBJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90aWNrZXIuZGFydFtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS91cmlfdHJhbnNsYXRvci5kYXJ0j3UvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS51cmlfdHJhbnNsYXRvcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3BhY2thZ2VzLmRhcnQnIHNob3cgUGFja2FnZXM7CgppbXBvcnQgJy4uL2Jhc2UvbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydCcgc2hvdyBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uOwppbXBvcnQgJ2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CmltcG9ydCAnZmFzdGFfY29kZXMuZGFydCc7CgpjbGFzcyBVcmlUcmFuc2xhdG9yIHsKICBmaW5hbCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIGRhcnRMaWJyYXJpZXM7CgogIGZpbmFsIFBhY2thZ2VzIHBhY2thZ2VzOwoKICBVcmlUcmFuc2xhdG9yKHRoaXMuZGFydExpYnJhcmllcywgdGhpcy5wYWNrYWdlcyk7CgogIExpc3Q8VXJpPiBnZXREYXJ0UGF0Y2hlcyhTdHJpbmcgbGlicmFyeU5hbWUpID0+CiAgICAgIGRhcnRMaWJyYXJpZXMubGlicmFyeUluZm9Gb3IobGlicmFyeU5hbWUpPy5wYXRjaGVzOwoKICBib29sIGlzUGxhdGZvcm1JbXBsZW1lbnRhdGlvbihVcmkgdXJpKSB7CiAgICBpZiAodXJpLnNjaGVtZSAhPSAiZGFydCIpIHJldHVybiBmYWxzZTsKICAgIFN0cmluZyBwYXRoID0gdXJpLnBhdGg7CiAgICByZXR1cm4gZGFydExpYnJhcmllcy5saWJyYXJ5SW5mb0ZvcihwYXRoKSA9PSBudWxsIHx8IHBhdGguc3RhcnRzV2l0aCgiXyIpOwogIH0KCiAgLy8gVE9ETyhzaWdtdW5kLCBhaGUpOiBjb25zaWRlciBleHBhbmRpbmcgdGhpcyBBUEkgdG8gaW5jbHVkZSBhbiBlcnJvcgogIC8vIGNhbGxiYWNrLCBzbyB3ZSBjYW4gcHJvdmlkZSBhbiBlcnJvciBsb2NhdGlvbiB3aGVuIG9uZSBpcyBhdmFpbGFibGUuIEZvcgogIC8vIGV4YW1wbGUsIGlmIHRoZSBlcnJvciBvY2N1cnMgaW4gYW4gYGltcG9ydGAuCiAgVXJpIHRyYW5zbGF0ZShVcmkgdXJpLCBbYm9vbCByZXBvcnRNZXNzYWdlID0gdHJ1ZV0pIHsKICAgIGlmICh1cmkuc2NoZW1lID09ICJkYXJ0IikgcmV0dXJuIF90cmFuc2xhdGVEYXJ0VXJpKHVyaSk7CiAgICBpZiAodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgcmV0dXJuIF90cmFuc2xhdGVQYWNrYWdlVXJpKHVyaSwgcmVwb3J0TWVzc2FnZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBGb3IgYSBwYWNrYWdlIHVyaSwgZ2V0IHRoZSBmcmFnbWVudCBvZiB0aGUgdXJpIHNwZWNpZmllZCBmb3IgdGhhdCBwYWNrYWdlLgogIFN0cmluZyBnZXRQYWNrYWdlRnJhZ21lbnQoVXJpIHVyaSkgewogICAgaWYgKHBhY2thZ2VzID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHVyaS5zY2hlbWUgIT0gInBhY2thZ2UiKSByZXR1cm4gbnVsbDsKICAgIGludCBmaXJzdFNsYXNoID0gdXJpLnBhdGguaW5kZXhPZignLycpOwogICAgaWYgKGZpcnN0U2xhc2ggPT0gLTEpIHJldHVybiBudWxsOwogICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gdXJpLnBhdGguc3Vic3RyaW5nKDAsIGZpcnN0U2xhc2gpOwogICAgVXJpIHBhY2thZ2VCYXNlVXJpID0gcGFja2FnZXMuYXNNYXAoKVtwYWNrYWdlTmFtZV07CiAgICBpZiAocGFja2FnZUJhc2VVcmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcGFja2FnZUJhc2VVcmkuZnJhZ21lbnQ7CiAgfQoKICAvLy8gR2V0IHRoZSBmcmFnbWVudCBmb3IgdGhlIHBhY2thZ2Ugc3BlY2lmaWVkIGFzIHRoZSBkZWZhdWx0IHBhY2thZ2UsIGlmIGFueS4KICBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2VGcmFnbWVudCgpIHsKICAgIFVyaSBlbXB0eVBhY2thZ2VSZWRpcmVjdCA9IHBhY2thZ2VzLmFzTWFwKClbIiJdOwogICAgaWYgKGVtcHR5UGFja2FnZVJlZGlyZWN0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZW1wdHlQYWNrYWdlUmVkaXJlY3QudG9TdHJpbmcoKTsKICAgIFVyaSBwYWNrYWdlQmFzZVVyaSA9IHBhY2thZ2VzLmFzTWFwKClbcGFja2FnZU5hbWVdOwogICAgaWYgKHBhY2thZ2VCYXNlVXJpID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHBhY2thZ2VCYXNlVXJpLmZyYWdtZW50OwogIH0KCiAgYm9vbCBpc0xpYnJhcnlTdXBwb3J0ZWQoU3RyaW5nIGxpYnJhcnlOYW1lKSB7CiAgICAvLyBUT0RPKHNpZ211bmQpOiBjaGFuZ2UgdGhpcyB0byBgPz8gZmFsc2VgIHdoZW4gYWxsIGJhY2tlbmRzIHByb3ZpZGUgdGhlCiAgICAvLyBgbGlicmFyaWVzLmpzb25gIGZpbGUgYnkgZGVmYXVsdCAoSXNzdWUgIzMyNjU3KS4KICAgIHJldHVybiBkYXJ0TGlicmFyaWVzLmxpYnJhcnlJbmZvRm9yKGxpYnJhcnlOYW1lKT8uaXNTdXBwb3J0ZWQgPz8gdHJ1ZTsKICB9CgogIFVyaSBfdHJhbnNsYXRlRGFydFVyaShVcmkgdXJpKSB7CiAgICBpZiAoIXVyaS5pc1NjaGVtZSgnZGFydCcpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBkYXJ0TGlicmFyaWVzLmxpYnJhcnlJbmZvRm9yKHVyaS5wYXRoKT8udXJpOwogIH0KCiAgVXJpIF90cmFuc2xhdGVQYWNrYWdlVXJpKFVyaSB1cmksIGJvb2wgcmVwb3J0TWVzc2FnZSkgewogICAgdHJ5IHsKICAgICAgLy8gVE9ETyhzaWdtdW5kKTogb25jZSB3ZSByZW1vdmUgdGhlIGBwYXJzZWAgQVBJLCB3ZSBjYW4gZW5zdXJlIHRoYXQKICAgICAgLy8gcGFja2FnZXMgd2lsbCBuZXZlciBiZSBudWxsIGFuZCBnZXQgcmlkIG9mIGA/YCBiZWxvdy4KICAgICAgcmV0dXJuIHBhY2thZ2VzPy5yZXNvbHZlKHVyaSwKICAgICAgICAgIG5vdEZvdW5kOiByZXBvcnRNZXNzYWdlCiAgICAgICAgICAgICAgPyBfcGFja2FnZVVyaU5vdEZvdW5kCiAgICAgICAgICAgICAgOiBfcGFja2FnZVVyaU5vdEZvdW5kTm9SZXBvcnQpOwogICAgfSBvbiBBcmd1bWVudEVycm9yIGNhdGNoIChlKSB7CiAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNhdGNoIGEgbW9yZSBwcmVjaXNlIGVycm9yIHdoZW4KICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9wYWNrYWdlX2NvbmZpZy9pc3N1ZXMvNDAgaXMgZml4ZWQuCiAgICAgIGlmIChyZXBvcnRNZXNzYWdlKSB7CiAgICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQucmVwb3J0V2l0aG91dExvY2F0aW9uKAogICAgICAgICAgICB0ZW1wbGF0ZUludmFsaWRQYWNrYWdlVXJpLndpdGhBcmd1bWVudHModXJpLCAnJGUnKSwgU2V2ZXJpdHkuZXJyb3IpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgc3RhdGljIFVyaSBfcGFja2FnZVVyaU5vdEZvdW5kKFVyaSB1cmkpIHsKICAgIFN0cmluZyBuYW1lID0gdXJpLnBhdGhTZWdtZW50cy5maXJzdDsKICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50LnJlcG9ydFdpdGhvdXRMb2NhdGlvbigKICAgICAgICB0ZW1wbGF0ZVBhY2thZ2VOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUsIHVyaSksIFNldmVyaXR5LmVycm9yKTsKICAgIC8vIFRPRE8oc2lnbXVuZCwgYWhlKTogZW5zdXJlIHdlIG9ubHkgcmVwb3J0IGFuIGVycm9yIG9uY2UsCiAgICAvLyB0aGlzIG51bGwgcmVzdWx0IHdpbGwgbGlrZWx5IGNhdXNlIGFub3RoZXIgZXJyb3IgZnVydGhlciBkb3duIGluIHRoZQogICAgLy8gY29tcGlsZXIuCiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyBVcmkgX3BhY2thZ2VVcmlOb3RGb3VuZE5vUmVwb3J0KFVyaSB1cmkpIHsKICAgIHJldHVybiBudWxsOwogIH0KfQptAE5OPAEeAU8BPQFRNRsBFjQBGwE0ATI6ASssHE8EAUlOMjg9IzcGEQQBUScnLiwnPDgtJAQBUSc1Mzo4LSQEATBOOEsEASMsOAQBOgpLPyQiJC4jOEkbN1EIEwYEASwqM0tATBERBAE0EQQCAS9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXJpX3RyYW5zbGF0b3IuZGFydGNmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9iYXNlL2xpYnJhcmllc19zcGVjaWZpY2F0aW9uLmRhcnSoUS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTGlicmFyeSBzcGVjaWZpY2F0aW9uIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbi4KLy8vCi8vLyBNYW55IGRhcnQgdG9vbHMgYXJlIGNvbmZpZ3VyYWJsZSB0byBzdXBwb3J0IGRpZmZlcmVudCB0YXJnZXQgcGxhdGZvcm1zLiAgRm9yCi8vLyBhIGdpdmVuIHRhcmdldCwgdGhleSBuZWVkIHRvIGtub3cgd2hhdCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZSBhbmQgd2hlcmUgYXJlCi8vLyB0aGUgc291cmNlcyBhbmQgdGFyZ2V0LXNwZWNpZmljIHBhdGNoZXMuCi8vLwovLy8gSGVyZSB3ZSBkZWZpbmUgQVBJcyB0byByZXByZXNlbnQgdGhpcyBzcGVjaWZpY2F0aW9uIGFuZCBpbXBsZW1lbnQKLy8vIHNlcmlhbGl6YXRpb24gdG8gKGFuZCBkZXNlcmlhbGl6YXRpb24gZnJvbSkgYSBKU09OIGZpbGUuCi8vLwovLy8gSGVyZSBpcyBhbiBleGFtcGxlIHNwZWNpZmljYXRpb24gSlNPTiBmaWxlOgovLy8KLy8vICAgICB7Ci8vLyAgICAgICAidm0iOiB7Ci8vLyAgICAgICAgICJsaWJyYXJpZXMiOiB7Ci8vLyAgICAgICAgICAgICAiY29yZSI6IHsKLy8vICAgICAgICAgICAgICAgICJ1cmkiOiAiYXN5bmMvY29yZS5kYXJ0IiwKLy8vICAgICAgICAgICAgICAgICJwYXRjaGVzIjogWwovLy8gICAgICAgICAgICAgICAgICAgICJwYXRoL3RvL2NvcmVfcGF0Y2guZGFydCIsCi8vLyAgICAgICAgICAgICAgICAgICAgInBhdGgvdG8vbGlzdF9wYXRjaC5kYXJ0IgovLy8gICAgICAgICAgICAgICAgXQovLy8gICAgICAgICAgICAgfQovLy8gICAgICAgICAgICAgImFzeW5jIjogewovLy8gICAgICAgICAgICAgICAgInVyaSI6ICJhc3luYy9hc3luYy5kYXJ0IiwKLy8vICAgICAgICAgICAgICAgICJwYXRjaGVzIjogInBhdGgvdG8vYXN5bmNfcGF0Y2guZGFydCIKLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgICAgICJjb252ZXJ0IjogewovLy8gICAgICAgICAgICAgICAgInVyaSI6ICJjb252ZXJ0L2NvbnZlcnQuZGFydCIsCi8vLyAgICAgICAgICAgICB9Ci8vLyAgICAgICAgICAgICAibWlycm9ycyI6IHsKLy8vICAgICAgICAgICAgICAgICJ1cmkiOiAibWlycm9ycy9taXJyb3JzLmRhcnQiLAovLy8gICAgICAgICAgICAgICAgInN1cHBvcnRlZCI6IGZhbHNlCi8vLyAgICAgICAgICAgICB9Ci8vLyAgICAgICAgIH0KLy8vICAgICAgIH0KLy8vICAgICB9Ci8vLwovLy8gVGhlIGZvcm1hdCBjb250YWluczoKLy8vICAgLSBhIHRvcCBsZXZlbCBlbnRyeSBmb3IgZWFjaCB0YXJnZXQuIEtleXMgYXJlIHRhcmdldCBuYW1lcyAoZS5nLiAidm0iCi8vLyAgICAgYWJvdmUpLCBhbmQgdmFsdWVzIGNvbnRhaW4gdGhlIGVudGlyZSBzcGVjaWZpY2F0aW9uIG9mIGEgdGFyZ2V0LgovLy8KLy8vICAgLSBlYWNoIHRhcmdldCBzcGVjaWZpY2F0aW9uIGlzIGEgbWFwLiBUb2RheSwgb25seSBvbmUga2V5IGlzIHN1cHBvcnRlZCBvbgovLy8gICAgIHRoaXMgbWFwOiAibGlicmFyaWVzIi4KLy8vCi8vLyAgIC0gVGhlICJsaWJyYXJpZXMiIGVudHJ5IGNvbnRhaW5zIGRldGFpbHMgZm9yIGhvdyBlYWNoIHBsYXRmb3JtIGxpYnJhcnkgaXMKLy8vICAgICBpbXBsZW1lbnRlZC4gVGhlIGVudHJ5IGlzIGEgbWFwLCB3aGVyZSBrZXlzIGFyZSB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KLy8vICAgICBsaWJyYXJ5IGFuZCB2YWx1ZXMgY29udGFpbiBkZXRhaWxzIGZvciB3aGVyZSB0byBmaW5kIHRoZSBpbXBsZW1lbnRhdGlvbgovLy8gICAgIGZvIHRoYXQgbGlicmFyeS4KLy8vCi8vLyAgIC0gVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgaXMgYSBzaW5nbGUgdG9rZW4gKGUuZy4gImNvcmUiKSB0aGF0IG1hdGNoZXMgdGhlCi8vLyAgICAgVXJpIHBhdGggdXNlZCBhZnRlciBgZGFydDpgIChlLmcuICJkYXJ0OmNvcmUiKS4KLy8vCi8vLyAgIC0gVGhlICJ1cmkiIGVudHJ5IG9uIHRoZSBsaWJyYXJ5IGluZm9ybWF0aW9uIGlzIG1hbmRhdG9yeS4gVGhlIHZhbHVlIGlzIGEKLy8vICAgICBzdHJpbmcgVVJJIHJlZmVyZW5jZS4gVGhlICJwYXRjaGVzIiBlbnRyeSBpcyBvcHRpb25hbCBhbmQgbWF5IGhhdmUgYXMgYQovLy8gICAgIHZhbHVlIGEgc3RyaW5nIFVSSSByZWZlcmVuY2Ugb3IgYSBsaXN0IG9mIFVSSSByZWZlcmVuY2VzLgovLy8KLy8vICAgICBBbGwgVVJJIHJlZmVyZW5jZXMgY2FuIGVpdGhlciBiZSBhIGZpbGUgVVJJIG9yIGEgcmVsYXRpdmUgVVJJIHBhdGgsCi8vLyAgICAgd2hpY2ggd2lsbCBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkKLy8vICAgICBzcGVjaWZpY2F0aW9uIGZpbGUuCi8vLwovLy8gICAtIFRoZSAic3VwcG9ydGVkIiBlbnRyeSBvbiB0aGUgbGlicmFyeSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbC4gVGhlIHZhbHVlCi8vLyAgICAgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbGlicmFyeSBpcyBzdXBwb3J0ZWQgaW4gdGhlCi8vLyAgICAgdW5kZXJseWluZyB0YXJnZXQuICBIb3dldmVyLCBzaW5jZSB0aGUgbGlicmFyaWVzIGFyZSBhc3N1bWVkIHRvIGJlCi8vLyAgICAgc3VwcG9ydGVkIGJ5IGRlZmF1bHQsIHdlIG9ubHkgZXhwZWN0IHVzZXJzIHRvIHVzZSBgZmFsc2VgLgovLy8KLy8vICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIHZhbHVlIGlzIHRvIGNvbmZpZ3VyZSBjb25kaXRpb25hbCBpbXBvcnRzIGFuZAovLy8gICAgIGVudmlyb25tZW50IGNvbnN0YW50cy4gQnkgZGVmYXVsdCBldmVyeSBwbGF0Zm9ybSBsaWJyYXJ5IHRoYXQgaXMKLy8vICAgICBhdmFpbGFibGUgaW4gdGhlICJsaWJyYXJpZXMiIHNlY3Rpb24gaW1wbGljaXRseSBkZWZpbmVzIGFuIGVudmlyb25tZW50Ci8vLyAgICAgdmFyaWFibGUgYGRhcnQubGlicmFyeS5uYW1lYCBhcyBgInRydWUiYCwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGlicmFyeQovLy8gICAgIGlzIHN1cHBvcnRlZC4gIFNvbWUgYmFja2VuZHMgYWxsb3cgaW1wb3J0cyB0byBhbiB1bnN1cHBvcnRlZCBwbGF0Zm9ybQovLy8gICAgIGxpYnJhcnkgKHR1cm5pbmcgYSBzdGF0aWMgZXJyb3IgaW50byBhIHJ1bnRpbWUgZXJyb3Igd2hlbiB0aGUgbGlicmFyeSBpcwovLy8gICAgIGV2ZW50dWFsbHkgYWNjZXNzZWQpLiBUaGVzZSBiYWNrZW5kcyBjYW4gdXNlIGBzdXBwb3J0ZWQ6IGZhbHNlYCB0bwovLy8gICAgIHJlcG9ydCB0aGF0IHN1Y2ggbGlicmFyeSBpcyBzdGlsbCBub3Qgc3VwcG9ydGVkIGluIGNvbmRpdGlvbmFsIGltcG9ydHMKLy8vICAgICBhbmQgY29uc3QgYGZyb21FbnZpcm9ubWVudGAgZXhwcmVzc2lvbnMuCi8vLwovLy8KLy8vIE5vdGU6IHdlIGN1cnJlbnRseSBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGZpbGVzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkCi8vLyB3aGVuIGNoYW5naW5nIGxpYnJhcmllcywgc291cmNlcywgYW5kIHBhdGNoIGZpbGVzOgovLy8gICAgKiAucGxhdGZvcm0gZmlsZXMgKGZvciBkYXJ0MmpzKQovLy8gICAgKiAuZ3lwaSBmaWxlcyAoZm9yIHZtKQovLy8gICAgKiBzZGtfbGlicmFyeV9tZXRhZGF0YS9saWIvbGlicmFyaWVzLmRhcnQgKGZvciBhbmFseXplciwgZGRjKQovLy8KLy8vIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiB1bmlmeWluZyB0aGVtIGFsbCB1bmRlciB0aGlzIGZvcm1hdCAoc2VlCi8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMjg4MzYpLCBidXQgZm9yIG5vdyB3ZSBuZWVkIHRvIHBheQovLy8gY2xvc2UgYXR0ZW50aW9uIHRvIGNoYW5nZSB0aGVtIGNvbnNpc3RlbnRseS4KCi8vIFRPRE8oc2lnbXVuZCk6IG1vdmUgdGhpcyBmaWxlIHRvIGEgc2hhcmVkIHBhY2thZ2UuCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IGpzb25EZWNvZGUsIGpzb25FbmNvZGU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvdXRpbC9yZWxhdGl2aXplLmRhcnQnCiAgICBzaG93IHJlbGF0aXZpemVVcmksIGlzV2luZG93czsKCi8vLyBDb250ZW50cyBmcm9tIGEgc2luZ2xlIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiBmaWxlLgovLy8KLy8vIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFsbCBsaWJyYXJpZXMgb24gYWxsIHRhcmdldCBwbGF0Zm9ybXMgZGVmaW5lZCBpbgovLy8gdGhhdCBmaWxlLgpjbGFzcyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uIHsKICBmaW5hbCBNYXA8U3RyaW5nLCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPiBfdGFyZ2V0czsKCiAgY29uc3QgTGlicmFyaWVzU3BlY2lmaWNhdGlvbigKICAgICAgW3RoaXMuX3RhcmdldHMgPSBjb25zdCA8U3RyaW5nLCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPnt9XSk7CgogIC8vLyBUaGUgbGlicmFyeSBzcGVjaWZpY2F0aW9uIGZvciBhIGdpdmVuIFt0YXJnZXRdLCBvciB0aHJvd3MgaWYgbm9uZSBpcwogIC8vLyBhdmFpbGFibGUuCiAgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uRm9yKFN0cmluZyB0YXJnZXQpIHsKICAgIFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24gdGFyZ2V0U3BlYyA9IF90YXJnZXRzW3RhcmdldF07CiAgICBpZiAodGFyZ2V0U3BlYyA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKAogICAgICAgICAgJ05vIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiBmb3IgdGFyZ2V0ICIkdGFyZ2V0IicpOwogICAgfQogICAgcmV0dXJuIHRhcmdldFNwZWM7CiAgfQoKICAvLy8gUGFyc2UgdGhlIGdpdmVuIFtqc29uXSBhcyBhIGxpYnJhcnkgc3BlY2lmaWNhdGlvbiwgcmVzb2x2aW5nIGFueSByZWxhdGl2ZQogIC8vLyBwYXRocyBmcm9tIFtiYXNlVXJpXS4KICAvLy8KICAvLy8gTWF5IHRocm93IGFuIGV4Y2VwdGlvbiBpZiBbanNvbl0gaXMgbm90IHByb3Blcmx5IGZvcm1hdHRlZCBvciBjb250YWlucwogIC8vLyBpbnZhbGlkIHZhbHVlcy4KICBzdGF0aWMgTGlicmFyaWVzU3BlY2lmaWNhdGlvbiBwYXJzZShVcmkgYmFzZVVyaSwgU3RyaW5nIGpzb24pIHsKICAgIGlmIChqc29uID09IG51bGwpIHJldHVybiBjb25zdCBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uKCk7CiAgICBNYXA8U3RyaW5nLCBkeW5hbWljPiBqc29uRGF0YTsKICAgIHRyeSB7CiAgICAgIGR5bmFtaWMgZGF0YSA9IGpzb25EZWNvZGUoanNvbik7CiAgICAgIGlmIChkYXRhIGlzISBNYXApIHsKICAgICAgICByZXR1cm4gX3JlcG9ydEVycm9yKCd0b3AtbGV2ZWwgc3BlY2lmaWNhdGlvbiBpcyBub3QgYSBtYXAnKTsKICAgICAgfQogICAgICBqc29uRGF0YSA9IGRhdGEgYXMgTWFwOwogICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IExpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb24oZSk7CiAgICB9CiAgICBNYXA8U3RyaW5nLCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPiB0YXJnZXRzID0KICAgICAgICA8U3RyaW5nLCBUYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uPnt9OwogICAganNvbkRhdGEuZm9yRWFjaCgoU3RyaW5nIHRhcmdldE5hbWUsIHRhcmdldERhdGEpIHsKICAgICAgaWYgKHRhcmdldE5hbWUuc3RhcnRzV2l0aCgiY29tbWVudDoiKSkgcmV0dXJuIG51bGw7CiAgICAgIE1hcDxTdHJpbmcsIExpYnJhcnlJbmZvPiBsaWJyYXJpZXMgPSA8U3RyaW5nLCBMaWJyYXJ5SW5mbz57fTsKICAgICAgaWYgKHRhcmdldERhdGEgaXMhIE1hcCkgewogICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICJ0YXJnZXQgc3BlY2lmaWNhdGlvbiBmb3IgJyR0YXJnZXROYW1lJyBpcyBub3QgYSBtYXAiKTsKICAgICAgfQogICAgICBpZiAoIXRhcmdldERhdGEuY29udGFpbnNLZXkoImxpYnJhcmllcyIpKSB7CiAgICAgICAgcmV0dXJuIF9yZXBvcnRFcnJvcigidGFyZ2V0IHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAiZm9yICckdGFyZ2V0TmFtZScgZG9lc24ndCBoYXZlIGEgbGlicmFyaWVzIGVudHJ5Iik7CiAgICAgIH0KICAgICAgZHluYW1pYyBsaWJyYXJpZXNEYXRhID0gdGFyZ2V0RGF0YVsibGlicmFyaWVzIl07CiAgICAgIGlmIChsaWJyYXJpZXNEYXRhIGlzISBNYXApIHsKICAgICAgICByZXR1cm4gX3JlcG9ydEVycm9yKCJsaWJyYXJpZXMgZW50cnkgZm9yICckdGFyZ2V0TmFtZScgaXMgbm90IGEgbWFwIik7CiAgICAgIH0KICAgICAgbGlicmFyaWVzRGF0YS5mb3JFYWNoKChTdHJpbmcgbmFtZSwgZGF0YSkgewogICAgICAgIGlmIChkYXRhIGlzISBNYXApIHsKICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgImxpYnJhcnkgZGF0YSBmb3IgJyRuYW1lJyBpbiB0YXJnZXQgJyR0YXJnZXROYW1lJyBpcyBub3QgYSBtYXAiKTsKICAgICAgICB9CiAgICAgICAgVXJpIGNoZWNrQW5kUmVzb2x2ZSh1cmlTdHJpbmcpIHsKICAgICAgICAgIGlmICh1cmlTdHJpbmcgaXMhIFN0cmluZykgewogICAgICAgICAgICByZXR1cm4gX3JlcG9ydEVycm9yKCJ1cmkgdmFsdWUgJyR1cmlTdHJpbmcnIGlzIG5vdCBhIHN0cmluZyIKICAgICAgICAgICAgICAgICIoZnJvbSBsaWJyYXJ5ICckbmFtZScgaW4gdGFyZ2V0ICckdGFyZ2V0TmFtZScpIik7CiAgICAgICAgICB9CiAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHVyaVN0cmluZyk7CiAgICAgICAgICBpZiAodXJpLnNjaGVtZSAhPSAnJyAmJiB1cmkuc2NoZW1lICE9ICdmaWxlJykgewogICAgICAgICAgICByZXR1cm4gX3JlcG9ydEVycm9yKCJ1cmkgc2NoZW1lIGluICckdXJpU3RyaW5nJyBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VVcmkucmVzb2x2ZVVyaSh1cmkpOwogICAgICAgIH0KCiAgICAgICAgVXJpIHVyaSA9IGNoZWNrQW5kUmVzb2x2ZShkYXRhWyd1cmknXSk7CiAgICAgICAgTGlzdDxVcmk+IHBhdGNoZXM7CiAgICAgICAgaWYgKGRhdGFbJ3BhdGNoZXMnXSBpcyBMaXN0KSB7CiAgICAgICAgICBwYXRjaGVzID0KICAgICAgICAgICAgICBkYXRhWydwYXRjaGVzJ10ubWFwPFVyaT4oKHMpID0+IGJhc2VVcmkucmVzb2x2ZShzKSkudG9MaXN0KCk7CiAgICAgICAgfSBlbHNlIGlmIChkYXRhWydwYXRjaGVzJ10gaXMgU3RyaW5nKSB7CiAgICAgICAgICBwYXRjaGVzID0gW2NoZWNrQW5kUmVzb2x2ZShkYXRhWydwYXRjaGVzJ10pXTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGFbJ3BhdGNoZXMnXSA9PSBudWxsKSB7CiAgICAgICAgICBwYXRjaGVzID0gY29uc3QgW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgICAgInBhdGNoZXMgZW50cnkgZm9yICckbmFtZScgaXMgbm90IGEgbGlzdCBvciBhIHN0cmluZyIpOwogICAgICAgIH0KCiAgICAgICAgZHluYW1pYyBzdXBwb3J0ZWQgPSBkYXRhWydzdXBwb3J0ZWQnXSA/PyB0cnVlOwogICAgICAgIGlmIChzdXBwb3J0ZWQgaXMhIGJvb2wpIHsKICAgICAgICAgIHJldHVybiBfcmVwb3J0RXJyb3IoIlwic3VwcG9ydGVkXCIgZW50cnk6IGV4cGVjdGVkIGEgJ2Jvb2wnIGJ1dCAiCiAgICAgICAgICAgICAgImdvdCBhICcke3N1cHBvcnRlZC5ydW50aW1lVHlwZX0nICgnJHN1cHBvcnRlZCcpIik7CiAgICAgICAgfQogICAgICAgIGxpYnJhcmllc1tuYW1lXSA9CiAgICAgICAgICAgIG5ldyBMaWJyYXJ5SW5mbyhuYW1lLCB1cmksIHBhdGNoZXMsIGlzU3VwcG9ydGVkOiBzdXBwb3J0ZWQpOwogICAgICB9KTsKICAgICAgdGFyZ2V0c1t0YXJnZXROYW1lXSA9CiAgICAgICAgICBuZXcgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbih0YXJnZXROYW1lLCBsaWJyYXJpZXMpOwogICAgfSk7CiAgICByZXR1cm4gbmV3IExpYnJhcmllc1NwZWNpZmljYXRpb24odGFyZ2V0cyk7CiAgfQoKICBzdGF0aWMgX3JlcG9ydEVycm9yKFN0cmluZyBlcnJvcikgPT4KICAgICAgdGhyb3cgbmV3IExpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb24oZXJyb3IpOwoKICAvLy8gU2VyaWFsaXplIHRoaXMgc3BlY2lmaWNhdGlvbiB0byBqc29uLgogIC8vLwogIC8vLyBJZiBwb3NzaWJsZSBzZXJpYWxpemVzIHBhdGhzIHJlbGF0aXZlIHRvIFtvdXRwdXRVcmldLgogIFN0cmluZyB0b0pzb25TdHJpbmcoVXJpIG91dHB1dFVyaSkgPT4ganNvbkVuY29kZSh0b0pzb25NYXAob3V0cHV0VXJpKSk7CgogIE1hcCB0b0pzb25NYXAoVXJpIG91dHB1dFVyaSkgewogICAgTWFwIHJlc3VsdCA9IHt9OwogICAgVXJpIGRpciA9IG91dHB1dFVyaS5yZXNvbHZlKCcuJyk7CiAgICBTdHJpbmcgcGF0aEZvcihVcmkgdXJpKSA9PiByZWxhdGl2aXplVXJpKGRpciwgdXJpLCBpc1dpbmRvd3MpOwogICAgX3RhcmdldHMuZm9yRWFjaCgodGFyZ2V0TmFtZSwgdGFyZ2V0KSB7CiAgICAgIE1hcCBsaWJyYXJpZXMgPSB7fTsKICAgICAgdGFyZ2V0Ll9saWJyYXJpZXMuZm9yRWFjaCgobmFtZSwgbGliKSB7CiAgICAgICAgbGlicmFyaWVzW25hbWVdID0gewogICAgICAgICAgJ3VyaSc6IHBhdGhGb3IobGliLnVyaSksCiAgICAgICAgICAncGF0Y2hlcyc6IGxpYi5wYXRjaGVzLm1hcChwYXRoRm9yKS50b0xpc3QoKSwKICAgICAgICB9OwogICAgICAgIGlmICghbGliLmlzU3VwcG9ydGVkKSB7CiAgICAgICAgICBsaWJyYXJpZXNbbmFtZV1bJ3N1cHBvcnRlZCddID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmVzdWx0W3RhcmdldE5hbWVdID0geydsaWJyYXJpZXMnOiBsaWJyYXJpZXN9OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLy8vIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgbGlicmFyaWVzIHN1cHBvcnRlZCBieSBhIGdpdmVuIHRhcmdldC4KY2xhc3MgVGFyZ2V0TGlicmFyaWVzU3BlY2lmaWNhdGlvbiB7CiAgLy8vIE5hbWUgb2YgdGhlIHRhcmdldCBwbGF0Zm9ybS4KICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZTsKCiAgZmluYWwgTWFwPFN0cmluZywgTGlicmFyeUluZm8+IF9saWJyYXJpZXM7CgogIGNvbnN0IFRhcmdldExpYnJhcmllc1NwZWNpZmljYXRpb24odGhpcy50YXJnZXROYW1lLAogICAgICBbdGhpcy5fbGlicmFyaWVzID0gY29uc3QgPFN0cmluZywgTGlicmFyeUluZm8+e31dKTsKCiAgLy8vIERldGFpbHMgYWJvdXQgYSBsaWJyYXJ5IHdob3NlIGltcG9ydCBpcyBgZGFydDokbmFtZWAuCiAgTGlicmFyeUluZm8gbGlicmFyeUluZm9Gb3IoU3RyaW5nIG5hbWUpID0+IF9saWJyYXJpZXNbbmFtZV07CgogIEl0ZXJhYmxlPExpYnJhcnlJbmZvPiBnZXQgYWxsTGlicmFyaWVzID0+IF9saWJyYXJpZXMudmFsdWVzOwp9CgovLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBgZGFydDpgIGxpYnJhcnkgaW4gYSBzcGVjaWZpYyB0YXJnZXQgcGxhdGZvcm0uCmNsYXNzIExpYnJhcnlJbmZvIHsKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnksIHdoaWNoIGlzIHRoZSBwYXRoIGRldmVsb3BlcnMgdXNlIHRvIGltcG9ydCB0aGlzCiAgLy8vIGxpYnJhcnkgKGFzIGBkYXJ0OiRuYW1lYCkuCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgZmlsZSBkZWZpbmluZyB0aGUgbWFpbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeS4KICBmaW5hbCBVcmkgdXJpOwoKICAvLy8gUGF0Y2ggZmlsZXMgdXNlZCBmb3IgdGhpcyBsaWJyYXJ5IGluIHRoZSB0YXJnZXQgcGxhdGZvcm0sIGlmIGFueS4KICBmaW5hbCBMaXN0PFVyaT4gcGF0Y2hlczsKCiAgLy8vIFdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgc3VwcG9ydGVkIGFuZCB0aHVzIGBkYXJ0LmxpYnJhcnkubmFtZWAgaXMgInRydWUiCiAgLy8vIGZvciBjb25kaXRpb25hbCBpbXBvcnRzIGFuZCBmcm9tRW52aXJvbm1lbnQgY29uc3RhbnRzLgogIGZpbmFsIGJvb2wgaXNTdXBwb3J0ZWQ7CgogIGNvbnN0IExpYnJhcnlJbmZvKHRoaXMubmFtZSwgdGhpcy51cmksIHRoaXMucGF0Y2hlcywKICAgICAge3RoaXMuaXNTdXBwb3J0ZWQ6IHRydWV9KTsKCiAgLy8vIFRoZSBpbXBvcnQgdXJpIGZvciB0aGUgZGVmaW5lZCBsaWJyYXJ5LgogIFVyaSBnZXQgaW1wb3J0VXJpID0+IFVyaS5wYXJzZSgnZGFydDoke25hbWV9Jyk7Cn0KCmNsYXNzIExpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb24gewogIE9iamVjdCBlcnJvcjsKICBMaWJyYXJpZXNTcGVjaWZpY2F0aW9uRXhjZXB0aW9uKHRoaXMuZXJyb3IpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGVycm9yJzsKfQqBDwBOTjwBNARRUS0ERj0EMAQKEhsaLSAyMRUSGy45Eh0yEh0yJhIODAoEGUxJBFAfBFBRUBkEUTgEUFBCBExHHARQSEtDBEpJT09OUUtPMQQETDcnHkUERk8xATYzAT4jATcEUA8fPAEgSQFLEUFAHjE8BhcEAVAcBk0WQj0jCicaRQgeJTQGODI3OkQgHUQIMjRBCDcjTwgyHB9QCikmSUMMKjpRDCoKATAbJxRMMDguHhEfRgoBNyJMQgoaSQocQwgwBAEnOAEsBjxKASEVJkMsGi4cIzgLIDAKCjUIEwQCAUslIxsBLQE2OgE8PwE/AgFHFE8hFQFAEQFIGwFOPRoBNyEBLjICASgQLwEhAgE3cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydGNmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvc2Nhbm5lci90b2tlbl9pbXBsLmRhcnSsJS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQuc2Nhbm5lci50b2tlbjsKCmltcG9ydCAndG9rZW4uZGFydCcgYXMgYW5hbHl6ZXI7CmltcG9ydCAndG9rZW4uZGFydCcgc2hvdyBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICd0b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOOwoKaW1wb3J0ICdzdHJpbmdfY2Fub25pY2FsaXplci5kYXJ0JzsKCi8qKgogKiBBIFN0cmluZy12YWx1ZWQgdG9rZW4uIFJlcHJlc2VudHMgaWRlbnRpZmllcnMsIHN0cmluZyBsaXRlcmFscywKICogbnVtYmVyIGxpdGVyYWxzLCBjb21tZW50cywgYW5kIGVycm9yIHRva2VucywgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcKICogcHJlY2VkZW5jZSBpbmZvLgogKi8KY2xhc3MgU3RyaW5nVG9rZW4gZXh0ZW5kcyBhbmFseXplci5TaW1wbGVUb2tlbiBpbXBsZW1lbnRzIGFuYWx5emVyLlN0cmluZ1Rva2VuIHsKICAvKioKICAgKiBUaGUgbGVuZ3RoIHRocmVzaG9sZCBhYm92ZSB3aGljaCBzdWJzdHJpbmcgdG9rZW5zIGFyZSBjb21wdXRlZCBsYXppbHkuCiAgICoKICAgKiBGb3Igc3RyaW5nIHRva2VucyB0aGF0IGFyZSBzdWJzdHJpbmdzIG9mIHRoZSBwcm9ncmFtIHNvdXJjZSwgdGhlIGFjdHVhbAogICAqIHN1YnN0cmluZyBleHRyYWN0aW9uIGlzIHBlcmZvcm1lZCBsYXppbHkuIFRoaXMgaXMgYmVuZWZpY2lhbCBiZWNhdXNlCiAgICogbm90IGFsbCBzY2FubmVkIGNvZGUgYXJlIGFjdHVhbGx5IHVzZWQuIEZvciB1bnVzZWQgcGFydHMsIHRoZSBzdWJzdHJpbmdzCiAgICogYXJlIG5ldmVyIGNvbXB1dGVkIGFuZCBhbGxvY2F0ZWQuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBMQVpZX1RIUkVTSE9MRCA9IDQ7CgogIGR5bmFtaWMgLyogU3RyaW5nIHwgTGF6eVN1YnN0cmluZyAqLyB2YWx1ZU9yTGF6eVN1YnN0cmluZzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5vbi1sYXp5IHN0cmluZyB0b2tlbi4gSWYgW2Nhbm9uaWNhbGl6ZV0gaXMgdHJ1ZSwgdGhlIHN0cmluZwogICAqIGlzIGNhbm9uaWNhbGl6ZWQgYmVmb3JlIHRoZSB0b2tlbiBpcyBjcmVhdGVkLgogICAqLwogIFN0cmluZ1Rva2VuLmZyb21TdHJpbmcoVG9rZW5UeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGNhbm9uaWNhbGl6ZTogZmFsc2UsIGFuYWx5emVyLkNvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50c30pCiAgICAgIDogdmFsdWVPckxhenlTdWJzdHJpbmcgPQogICAgICAgICAgICBjYW5vbmljYWxpemVkU3RyaW5nKHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgsIGNhbm9uaWNhbGl6ZSksCiAgICAgICAgc3VwZXIodHlwZSwgY2hhck9mZnNldCwgcHJlY2VkaW5nQ29tbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbGF6eSBzdHJpbmcgdG9rZW4uIElmIFtjYW5vbmljYWxpemVdIGlzIHRydWUsIHRoZSBzdHJpbmcKICAgKiBpcyBjYW5vbmljYWxpemVkIGJlZm9yZSB0aGUgdG9rZW4gaXMgY3JlYXRlZC4KICAgKi8KICBTdHJpbmdUb2tlbi5mcm9tU3Vic3RyaW5nKAogICAgICBUb2tlblR5cGUgdHlwZSwgU3RyaW5nIGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGNhbm9uaWNhbGl6ZTogZmFsc2UsIGFuYWx5emVyLkNvbW1lbnRUb2tlbiBwcmVjZWRpbmdDb21tZW50c30pCiAgICAgIDogc3VwZXIodHlwZSwgY2hhck9mZnNldCwgcHJlY2VkaW5nQ29tbWVudHMpIHsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPD0gTEFaWV9USFJFU0hPTEQpIHsKICAgICAgdmFsdWVPckxhenlTdWJzdHJpbmcgPQogICAgICAgICAgY2Fub25pY2FsaXplZFN0cmluZyhkYXRhLCBzdGFydCwgZW5kLCBjYW5vbmljYWxpemUpOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVPckxhenlTdWJzdHJpbmcgPQogICAgICAgICAgbmV3IF9MYXp5U3Vic3RyaW5nKGRhdGEsIHN0YXJ0LCBsZW5ndGgsIGNhbm9uaWNhbGl6ZSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbGF6eSBzdHJpbmcgdG9rZW4uIElmIFthc2NpaU9ubHldIGlzIGZhbHNlLCB0aGUgYnl0ZSBhcnJheQogICAqIGlzIHBhc3NlZCB0aHJvdWdoIGEgVVRGLTggZGVjb2Rlci4KICAgKi8KICBTdHJpbmdUb2tlbi5mcm9tVXRmOEJ5dGVzKFRva2VuVHlwZSB0eXBlLCBMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBib29sIGFzY2lpT25seSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHthbmFseXplci5Db21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudHN9KQogICAgICA6IHN1cGVyKHR5cGUsIGNoYXJPZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKSB7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoIDw9IExBWllfVEhSRVNIT0xEKSB7CiAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0gZGVjb2RlVXRmOChkYXRhLCBzdGFydCwgZW5kLCBhc2NpaU9ubHkpOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVPckxhenlTdWJzdHJpbmcgPSBuZXcgX0xhenlTdWJzdHJpbmcoZGF0YSwgc3RhcnQsIGxlbmd0aCwgYXNjaWlPbmx5KTsKICAgIH0KICB9CgogIFN0cmluZ1Rva2VuLl8oVG9rZW5UeXBlIHR5cGUsIHRoaXMudmFsdWVPckxhenlTdWJzdHJpbmcsIGludCBjaGFyT2Zmc2V0LAogICAgICBbYW5hbHl6ZXIuQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzXSkKICAgICAgOiBzdXBlcih0eXBlLCBjaGFyT2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50cyk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbGV4ZW1lIHsKICAgIGlmICh2YWx1ZU9yTGF6eVN1YnN0cmluZyBpcyBTdHJpbmcpIHsKICAgICAgcmV0dXJuIHZhbHVlT3JMYXp5U3Vic3RyaW5nOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHZhbHVlT3JMYXp5U3Vic3RyaW5nIGlzIF9MYXp5U3Vic3RyaW5nKTsKICAgICAgZHluYW1pYyBkYXRhID0gdmFsdWVPckxhenlTdWJzdHJpbmcuZGF0YTsKICAgICAgaW50IHN0YXJ0ID0gdmFsdWVPckxhenlTdWJzdHJpbmcuc3RhcnQ7CiAgICAgIGludCBlbmQgPSBzdGFydCArIHZhbHVlT3JMYXp5U3Vic3RyaW5nLmxlbmd0aDsKICAgICAgaWYgKGRhdGEgaXMgU3RyaW5nKSB7CiAgICAgICAgdmFsdWVPckxhenlTdWJzdHJpbmcgPSBjYW5vbmljYWxpemVkU3RyaW5nKAogICAgICAgICAgICBkYXRhLCBzdGFydCwgZW5kLCB2YWx1ZU9yTGF6eVN1YnN0cmluZy5ib29sVmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlT3JMYXp5U3Vic3RyaW5nID0KICAgICAgICAgICAgZGVjb2RlVXRmOChkYXRhLCBzdGFydCwgZW5kLCB2YWx1ZU9yTGF6eVN1YnN0cmluZy5ib29sVmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZU9yTGF6eVN1YnN0cmluZzsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSWRlbnRpZmllciA9PiBpZGVudGljYWwoa2luZCwgSURFTlRJRklFUl9UT0tFTik7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IGxleGVtZTsKCiAgc3RhdGljIGZpbmFsIFN0cmluZ0Nhbm9uaWNhbGl6ZXIgY2Fub25pY2FsaXplciA9IG5ldyBTdHJpbmdDYW5vbmljYWxpemVyKCk7CgogIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsaXplZFN0cmluZygKICAgICAgU3RyaW5nIHMsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBjYW5vbmljYWxpemUpIHsKICAgIGlmICghY2Fub25pY2FsaXplKSByZXR1cm4gczsKICAgIHJldHVybiBjYW5vbmljYWxpemVyLmNhbm9uaWNhbGl6ZShzLCBzdGFydCwgZW5kLCBmYWxzZSk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIGRlY29kZVV0ZjgoTGlzdDxpbnQ+IGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIHJldHVybiBjYW5vbmljYWxpemVyLmNhbm9uaWNhbGl6ZShkYXRhLCBzdGFydCwgZW5kLCBhc2NpaU9ubHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTdHJpbmdUb2tlbi5fKAogICAgICB0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2YWx1ZSgpID0+IGxleGVtZTsKfQoKLyoqCiAqIEEgU3RyaW5nLXZhbHVlZCB0b2tlbiB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAqLwpjbGFzcyBTeW50aGV0aWNTdHJpbmdUb2tlbiBleHRlbmRzIFN0cmluZ1Rva2VuCiAgICBpbXBsZW1lbnRzIGFuYWx5emVyLlN5bnRoZXRpY1N0cmluZ1Rva2VuIHsKICBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LAogICAgICBbYW5hbHl6ZXIuQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRzXSkKICAgICAgOiBzdXBlci5fKHR5cGUsIHZhbHVlLCBvZmZzZXQsIHByZWNlZGluZ0NvbW1lbnRzKTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gMDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+IG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgdHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIG9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7Cn0KCmNsYXNzIENvbW1lbnRUb2tlbiBleHRlbmRzIFN0cmluZ1Rva2VuIGltcGxlbWVudHMgYW5hbHl6ZXIuQ29tbWVudFRva2VuIHsKICBAb3ZlcnJpZGUKICBhbmFseXplci5TaW1wbGVUb2tlbiBwYXJlbnQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IGNvbW1lbnQgdG9rZW4uIElmIFtjYW5vbmljYWxpemVdIGlzIHRydWUsIHRoZSBzdHJpbmcKICAgKiBpcyBjYW5vbmljYWxpemVkIGJlZm9yZSB0aGUgdG9rZW4gaXMgY3JlYXRlZC4KICAgKi8KICBDb21tZW50VG9rZW4uZnJvbVN1YnN0cmluZygKICAgICAgVG9rZW5UeXBlIHR5cGUsIFN0cmluZyBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBjYW5vbmljYWxpemU6IGZhbHNlfSkKICAgICAgOiBzdXBlci5mcm9tU3Vic3RyaW5nKHR5cGUsIGRhdGEsIHN0YXJ0LCBlbmQsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZTogY2Fub25pY2FsaXplKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5vbi1sYXp5IGNvbW1lbnQgdG9rZW4uCiAgICovCiAgQ29tbWVudFRva2VuLmZyb21TdHJpbmcoVG9rZW5UeXBlIHR5cGUsIFN0cmluZyBsZXhlbWUsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLmZyb21TdHJpbmcodHlwZSwgbGV4ZW1lLCBjaGFyT2Zmc2V0KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxhenkgc3RyaW5nIHRva2VuLiBJZiBbYXNjaWlPbmx5XSBpcyBmYWxzZSwgdGhlIGJ5dGUgYXJyYXkKICAgKiBpcyBwYXNzZWQgdGhyb3VnaCBhIFVURi04IGRlY29kZXIuCiAgICovCiAgQ29tbWVudFRva2VuLmZyb21VdGY4Qnl0ZXMoVG9rZW5UeXBlIHR5cGUsIExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgYXNjaWlPbmx5LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlci5mcm9tVXRmOEJ5dGVzKHR5cGUsIGRhdGEsIHN0YXJ0LCBlbmQsIGFzY2lpT25seSwgY2hhck9mZnNldCk7CgogIENvbW1lbnRUb2tlbi5fKFRva2VuVHlwZSB0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIuXyh0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIENvbW1lbnRUb2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IENvbW1lbnRUb2tlbi5fKHR5cGUsIHZhbHVlT3JMYXp5U3Vic3RyaW5nLCBjaGFyT2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgdm9pZCByZW1vdmUoKSB7CiAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICBwcmV2aW91cy5zZXROZXh0V2l0aG91dFNldHRpbmdQcmV2aW91cyhuZXh0KTsKICAgICAgbmV4dD8ucHJldmlvdXMgPSBwcmV2aW91czsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChwYXJlbnQucHJlY2VkaW5nQ29tbWVudHMgPT0gdGhpcyk7CiAgICAgIHBhcmVudC5wcmVjZWRpbmdDb21tZW50cyA9IG5leHQgYXMgQ29tbWVudFRva2VuOwogICAgfQogIH0KfQoKLyoqCiAqIEEgc3BlY2lhbGl6ZWQgY29tbWVudCB0b2tlbiByZXByZXNlbnRpbmcgYSBsYW5ndWFnZSB2ZXJzaW9uCiAqIChlLmcuICcvLyBAZGFydCA9IDIuMScpLgogKi8KY2xhc3MgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gZXh0ZW5kcyBDb21tZW50VG9rZW4gewogIC8qKgogICAqIFRoZSBtYWpvciBsYW5ndWFnZSB2ZXJzaW9uLgogICAqLwogIGludCBtYWpvcjsKCiAgLyoqCiAgICogVGhlIG1pbm9yIGxhbmd1YWdlIHZlcnNpb24uCiAgICovCiAgaW50IG1pbm9yOwoKICBMYW5ndWFnZVZlcnNpb25Ub2tlbi5mcm9tKFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0LCB0aGlzLm1ham9yLCB0aGlzLm1pbm9yKQogICAgICA6IHN1cGVyLmZyb21TdHJpbmcoVG9rZW5UeXBlLlNJTkdMRV9MSU5FX0NPTU1FTlQsIHRleHQsIG9mZnNldCk7CgogIExhbmd1YWdlVmVyc2lvblRva2VuLmZyb21TdWJzdHJpbmcoCiAgICAgIFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHRva2VuU3RhcnQsIHRoaXMubWFqb3IsIHRoaXMubWlub3IsCiAgICAgIHtib29sIGNhbm9uaWNhbGl6ZX0pCiAgICAgIDogc3VwZXIuZnJvbVN1YnN0cmluZygKICAgICAgICAgICAgVG9rZW5UeXBlLlNJTkdMRV9MSU5FX0NPTU1FTlQsIHN0cmluZywgc3RhcnQsIGVuZCwgdG9rZW5TdGFydCwKICAgICAgICAgICAgY2Fub25pY2FsaXplOiBjYW5vbmljYWxpemUpOwoKICBMYW5ndWFnZVZlcnNpb25Ub2tlbi5mcm9tVXRmOEJ5dGVzKExpc3Q8aW50PiBieXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBpbnQgdG9rZW5TdGFydCwgdGhpcy5tYWpvciwgdGhpcy5taW5vcikKICAgICAgOiBzdXBlci5mcm9tVXRmOEJ5dGVzKAogICAgICAgICAgICBUb2tlblR5cGUuU0lOR0xFX0xJTkVfQ09NTUVOVCwgYnl0ZXMsIHN0YXJ0LCBlbmQsIHRydWUsIHRva2VuU3RhcnQpOwoKICBAb3ZlcnJpZGUKICBMYW5ndWFnZVZlcnNpb25Ub2tlbiBjb3B5KCkgPT4KICAgICAgbmV3IExhbmd1YWdlVmVyc2lvblRva2VuLmZyb20obGV4ZW1lLCBvZmZzZXQsIG1ham9yLCBtaW5vcik7Cn0KCmNsYXNzIERhcnREb2NUb2tlbiBleHRlbmRzIENvbW1lbnRUb2tlbgogICAgaW1wbGVtZW50cyBhbmFseXplci5Eb2N1bWVudGF0aW9uQ29tbWVudFRva2VuIHsKICAvKioKICAgKiBDcmVhdGVzIGEgbGF6eSBjb21tZW50IHRva2VuLiBJZiBbY2Fub25pY2FsaXplXSBpcyB0cnVlLCB0aGUgc3RyaW5nCiAgICogaXMgY2Fub25pY2FsaXplZCBiZWZvcmUgdGhlIHRva2VuIGlzIGNyZWF0ZWQuCiAgICovCiAgRGFydERvY1Rva2VuLmZyb21TdWJzdHJpbmcoCiAgICAgIFRva2VuVHlwZSB0eXBlLCBTdHJpbmcgZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgY2Fub25pY2FsaXplOiBmYWxzZX0pCiAgICAgIDogc3VwZXIuZnJvbVN1YnN0cmluZyh0eXBlLCBkYXRhLCBzdGFydCwgZW5kLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBjYW5vbmljYWxpemU6IGNhbm9uaWNhbGl6ZSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBsYXp5IHN0cmluZyB0b2tlbi4gSWYgW2FzY2lpT25seV0gaXMgZmFsc2UsIHRoZSBieXRlIGFycmF5CiAgICogaXMgcGFzc2VkIHRocm91Z2ggYSBVVEYtOCBkZWNvZGVyLgogICAqLwogIERhcnREb2NUb2tlbi5mcm9tVXRmOEJ5dGVzKFRva2VuVHlwZSB0eXBlLCBMaXN0PGludD4gZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBib29sIGFzY2lpT25seSwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIuZnJvbVV0ZjhCeXRlcyh0eXBlLCBkYXRhLCBzdGFydCwgZW5kLCBhc2NpaU9ubHksIGNoYXJPZmZzZXQpOwoKICBEYXJ0RG9jVG9rZW4uXyhUb2tlblR5cGUgdHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLl8odHlwZSwgdmFsdWVPckxhenlTdWJzdHJpbmcsIGNoYXJPZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBEYXJ0RG9jVG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBEYXJ0RG9jVG9rZW4uXyh0eXBlLCB2YWx1ZU9yTGF6eVN1YnN0cmluZywgY2hhck9mZnNldCk7Cn0KCi8qKgogKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBjb21wdXRlIGEgc3Vic3RyaW5nCiAqIGxhemlseS4gVGhlIHN1YnN0cmluZyBjYW4gZWl0aGVyIG9yaWdpbmF0ZSBmcm9tIGEgc3RyaW5nIG9yIGZyb20KICogYSBbOkxpc3Q8aW50PjpdIG9mIFVURi04IGJ5dGVzLgogKi8KYWJzdHJhY3QgY2xhc3MgX0xhenlTdWJzdHJpbmcgewogIC8qKiBUaGUgb3JpZ2luYWwgZGF0YSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgTGlzdDxpbnQ+ICovCiAgZ2V0IGRhdGE7CgogIGludCBnZXQgc3RhcnQ7CiAgaW50IGdldCBsZW5ndGg7CgogIC8qKgogICAqIElmIHRoaXMgc3Vic3RyaW5nIGlzIGJhc2VkIG9uIGEgU3RyaW5nLCB0aGUgW2Jvb2xWYWx1ZV0gaW5kaWNhdGVzIHdoZXRoZXIKICAgKiB0aGUgcmVzdWx0aW5nIHN1YnN0cmluZyBzaG91bGQgYmUgY2Fub25pY2FsaXplZC4KICAgKgogICAqIEZvciBzdWJzdHJpbmdzIGJhc2VkIG9uIGEgYnl0ZSBhcnJheSwgdGhlIFtib29sVmFsdWVdIGlzIHRydWUgaWYgdGhlCiAgICogYXJyYXkgb25seSBob2xkcyBBU0NJSSBjaGFyYWN0ZXJzLiBUaGUgcmVzdWx0aW5nIHN1YnN0cmluZyB3aWxsIGJlCiAgICogY2Fub25pY2FsaXplZCBhZnRlciBkZWNvZGluZy4KICAgKi8KICBib29sIGdldCBib29sVmFsdWU7CgogIF9MYXp5U3Vic3RyaW5nLmludGVybmFsKCk7CgogIGZhY3RvcnkgX0xhenlTdWJzdHJpbmcoZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBib29sIGIpIHsKICAgIC8vIFNlZSBjb21tZW50IG9uIFtDb21wYWN0TGF6eVN1YnN0cmluZ10uCiAgICBpZiAoc3RhcnQgPCAweDEwMDAwMCAmJiBsZW5ndGggPCAweDIwMCkgewogICAgICBpbnQgZmllbGRzID0gKHN0YXJ0IDw8IDkpOwogICAgICBmaWVsZHMgPSBmaWVsZHMgfCBsZW5ndGg7CiAgICAgIGZpZWxkcyA9IGZpZWxkcyA8PCAxOwogICAgICBpZiAoYikgZmllbGRzIHw9IDE7CiAgICAgIHJldHVybiBuZXcgX0NvbXBhY3RMYXp5U3Vic3RyaW5nKGRhdGEsIGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IF9GdWxsTGF6eVN1YnN0cmluZyhkYXRhLCBzdGFydCwgbGVuZ3RoLCBiKTsKICAgIH0KICB9Cn0KCi8qKgogKiBUaGlzIGNsYXNzIGVuY29kZXMgW3N0YXJ0XSwgW2xlbmd0aF0gYW5kIFtib29sVmFsdWVdIGluIGEgc2luZ2xlCiAqIDMwIGJpdCBpbnRlZ2VyLiBJdCB1c2VzIDIwIGJpdHMgZm9yIFtzdGFydF0sIHdoaWNoIGNvdmVycyBzb3VyY2UgZmlsZXMKICogb2YgMU1CLiBbbGVuZ3RoXSBoYXMgOSBiaXRzLCB3aGljaCBjb3ZlcnMgNTEyIGNoYXJhY3RlcnMuCiAqCiAqIFRoZSBmaWxlIGh0bWxfZGFydDJqcy5kYXJ0IGlzIGN1cnJlbnRseSBhcm91bmQgMU1CLgogKi8KY2xhc3MgX0NvbXBhY3RMYXp5U3Vic3RyaW5nIGV4dGVuZHMgX0xhenlTdWJzdHJpbmcgewogIGZpbmFsIGR5bmFtaWMgZGF0YTsKICBmaW5hbCBpbnQgZmllbGRzOwoKICBfQ29tcGFjdExhenlTdWJzdHJpbmcodGhpcy5kYXRhLCB0aGlzLmZpZWxkcykgOiBzdXBlci5pbnRlcm5hbCgpOwoKICBpbnQgZ2V0IHN0YXJ0ID0+IGZpZWxkcyA+PiAxMDsKICBpbnQgZ2V0IGxlbmd0aCA9PiAoZmllbGRzID4+IDEpICYgMHgxZmY7CiAgYm9vbCBnZXQgYm9vbFZhbHVlID0+IChmaWVsZHMgJiAxKSA9PSAxOwp9CgpjbGFzcyBfRnVsbExhenlTdWJzdHJpbmcgZXh0ZW5kcyBfTGF6eVN1YnN0cmluZyB7CiAgZmluYWwgZHluYW1pYyBkYXRhOwogIGZpbmFsIGludCBzdGFydDsKICBmaW5hbCBpbnQgbGVuZ3RoOwogIGZpbmFsIGJvb2wgYm9vbFZhbHVlOwogIF9GdWxsTGF6eVN1YnN0cmluZyh0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMubGVuZ3RoLCB0aGlzLmJvb2xWYWx1ZSkKICAgICAgOiBzdXBlci5pbnRlcm5hbCgpOwp9Cgpib29sIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yKFN0cmluZyB2YWx1ZSkgewogIHJldHVybiBpc0JpbmFyeU9wZXJhdG9yKHZhbHVlKSB8fAogICAgICBpc01pbnVzT3BlcmF0b3IodmFsdWUpIHx8CiAgICAgIGlzVGVybmFyeU9wZXJhdG9yKHZhbHVlKSB8fAogICAgICBpc1VuYXJ5T3BlcmF0b3IodmFsdWUpOwp9Cgpib29sIGlzVW5hcnlPcGVyYXRvcihTdHJpbmcgdmFsdWUpID0+IGlkZW50aWNhbCh2YWx1ZSwgIn4iKTsKCmJvb2wgaXNCaW5hcnlPcGVyYXRvcihTdHJpbmcgdmFsdWUpIHsKICByZXR1cm4gaWRlbnRpY2FsKHZhbHVlLCAiPT0iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICJbXSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIioiKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICIvIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiJSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIn4vIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiKyIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIjw8IikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiPj4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI+Pj4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI+PSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIj4iKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICI8PSIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgIjwiKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICImIikgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAiXiIpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgInwiKTsKfQoKYm9vbCBpc1Rlcm5hcnlPcGVyYXRvcihTdHJpbmcgdmFsdWUpID0+IGlkZW50aWNhbCh2YWx1ZSwgIltdPSIpOwoKYm9vbCBpc01pbnVzT3BlcmF0b3IoU3RyaW5nIHZhbHVlKSA9PiBpZGVudGljYWwodmFsdWUsICItIik7CoFfAE5OPAErASErATUBJAEEQ0gUBFEGTAVNSk4nBicBPQEGTDMGR0sfRzQBBkgzBh1HSzUeJB0/DR1BBgQBBkooBlAmMTUeJEYNUQYEAUsxNAEMFiojDTYwLjUcND8PH0oIIwYEAQw+AQwfAU4BJTkhPQQBUUQEAQwlUAEMHAIBBEUELy9BMTkBDBcBDCxMAgFKDB8BBkkzBh5HIkApAQYnBkk0AQZKKAZRJkwBRzkBDBlCAQwSHDQhDTA3BgQCAQQ/HAQyBiEGDQEGIQYNAU1HASZRGx1LKQFKLh1RAQwhQwIBKDQGSTMGHkciQCkBBkooBlEmTAFHOQEMGUICAQRKRCMEIDsMARESAQZPNgVKSCMGFgEdAUAuLiEgHBo2DT0GBAIBBERKPQM3BDUWFAFEASErKwIBMhYTFBhJGgIBLSQgIh4CAT0BJiMgHx8fIB8gICEgHyAfHx8dAgFBAT0BN3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbl9pbXBsLmRhcnReZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvdG9rZW4uZGFydMAAwr8vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIERlZmluZXMgdGhlIHRva2VucyB0aGF0IGFyZSBwcm9kdWNlZCBieSB0aGUgc2Nhbm5lciwgdXNlZCBieSB0aGUgcGFyc2VyLCBhbmQKICogcmVmZXJlbmNlZCBmcm9tIHRoZSBbQVNUIHN0cnVjdHVyZV0oYXN0LmRhcnQpLgogKi8KaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICcuLi9iYXNlL3N5bnRhY3RpY19lbnRpdHkuZGFydCc7CmltcG9ydCAnc3RyaW5nX3V0aWxpdGllcy5kYXJ0JzsKaW1wb3J0ICd0b2tlbl9jb25zdGFudHMuZGFydCc7Cgpjb25zdCBpbnQgTk9fUFJFQ0VERU5DRSA9IDA7CmNvbnN0IGludCBBU1NJR05NRU5UX1BSRUNFREVOQ0UgPSAxOwpjb25zdCBpbnQgQ0FTQ0FERV9QUkVDRURFTkNFID0gMjsKY29uc3QgaW50IENPTkRJVElPTkFMX1BSRUNFREVOQ0UgPSAzOwpjb25zdCBpbnQgSUZfTlVMTF9QUkVDRURFTkNFID0gNDsKY29uc3QgaW50IExPR0lDQUxfT1JfUFJFQ0VERU5DRSA9IDU7CmNvbnN0IGludCBMT0dJQ0FMX0FORF9QUkVDRURFTkNFID0gNjsKY29uc3QgaW50IEVRVUFMSVRZX1BSRUNFREVOQ0UgPSA3Owpjb25zdCBpbnQgUkVMQVRJT05BTF9QUkVDRURFTkNFID0gODsKY29uc3QgaW50IEJJVFdJU0VfT1JfUFJFQ0VERU5DRSA9IDk7CmNvbnN0IGludCBCSVRXSVNFX1hPUl9QUkVDRURFTkNFID0gMTA7CmNvbnN0IGludCBCSVRXSVNFX0FORF9QUkVDRURFTkNFID0gMTE7CmNvbnN0IGludCBTSElGVF9QUkVDRURFTkNFID0gMTI7CmNvbnN0IGludCBBRERJVElWRV9QUkVDRURFTkNFID0gMTM7CmNvbnN0IGludCBNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFID0gMTQ7CmNvbnN0IGludCBQUkVGSVhfUFJFQ0VERU5DRSA9IDE1Owpjb25zdCBpbnQgUE9TVEZJWF9QUkVDRURFTkNFID0gMTY7CmNvbnN0IGludCBTRUxFQ1RPUl9QUkVDRURFTkNFID0gMTc7CgovKioKICogVGhlIG9wZW5pbmcgaGFsZiBvZiBhIGdyb3VwaW5nIHBhaXIgb2YgdG9rZW5zLiBUaGlzIGlzIHVzZWQgZm9yIGN1cmx5CiAqIGJyYWNrZXRzICgneycpLCBwYXJlbnRoZXNlcyAoJygnKSwgYW5kIHNxdWFyZSBicmFja2V0cyAoJ1snKS4KICovCmNsYXNzIEJlZ2luVG9rZW4gZXh0ZW5kcyBTaW1wbGVUb2tlbiB7CiAgLyoqCiAgICogVGhlIHRva2VuIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyB0b2tlbi4KICAgKi8KICBUb2tlbiBlbmRUb2tlbjsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gaGF2ZSB0aGUgZ2l2ZW4gW3R5cGVdIGF0IHRoZSBnaXZlbgogICAqIFtvZmZzZXRdLgogICAqLwogIEJlZ2luVG9rZW4oVG9rZW5UeXBlIHR5cGUsIGludCBvZmZzZXQsIFtDb21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudF0pCiAgICAgIDogc3VwZXIodHlwZSwgb2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50KSB7CiAgICBhc3NlcnQodHlwZSA9PSBUb2tlblR5cGUuTFQgfHwKICAgICAgICB0eXBlID09IFRva2VuVHlwZS5PUEVOX0NVUkxZX0JSQUNLRVQgfHwKICAgICAgICB0eXBlID09IFRva2VuVHlwZS5PUEVOX1BBUkVOIHx8CiAgICAgICAgdHlwZSA9PSBUb2tlblR5cGUuT1BFTl9TUVVBUkVfQlJBQ0tFVCB8fAogICAgICAgIHR5cGUgPT0gVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUIHx8CiAgICAgICAgdHlwZSA9PSBUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fRVhQUkVTU0lPTik7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4gbmV3IEJlZ2luVG9rZW4odHlwZSwgb2Zmc2V0LCBjb3B5Q29tbWVudHMocHJlY2VkaW5nQ29tbWVudHMpKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZ2V0IGVuZEdyb3VwID0+IGVuZFRva2VuOwoKICAvKioKICAgKiBTZXQgdGhlIHRva2VuIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyB0b2tlbi4KICAgKi8KICBzZXQgZW5kR3JvdXAoVG9rZW4gdG9rZW4pIHsKICAgIGVuZFRva2VuID0gdG9rZW47CiAgfQp9CgovKioKICogQSB0b2tlbiByZXByZXNlbnRpbmcgYSBjb21tZW50LgogKi8KY2xhc3MgQ29tbWVudFRva2VuIGV4dGVuZHMgU3RyaW5nVG9rZW4gewogIC8qKgogICAqIFRoZSB0b2tlbiB0aGF0IGNvbnRhaW5zIHRoaXMgY29tbWVudC4KICAgKi8KICBTaW1wbGVUb2tlbiBwYXJlbnQ7CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCBhIHRva2VuIG9mIHRoZSBnaXZlbiBbdHlwZV0KICAgKiB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdIGF0IHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBDb21tZW50VG9rZW4oVG9rZW5UeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgaW50IG9mZnNldCkKICAgICAgOiBzdXBlcih0eXBlLCB2YWx1ZSwgb2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgQ29tbWVudFRva2VuIGNvcHkoKSA9PiBuZXcgQ29tbWVudFRva2VuKHR5cGUsIF92YWx1ZSwgb2Zmc2V0KTsKCiAgLyoqCiAgICogUmVtb3ZlIHRoaXMgY29tbWVudCB0b2tlbiBmcm9tIHRoZSBsaXN0LgogICAqCiAgICogVGhpcyBpcyB1c2VkIHdoZW4gd2UgZGVjaWRlIHRvIGludGVycHJldCB0aGUgY29tbWVudCBhcyBzeW50YXguCiAgICovCiAgdm9pZCByZW1vdmUoKSB7CiAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICBwcmV2aW91cy5zZXROZXh0V2l0aG91dFNldHRpbmdQcmV2aW91cyhuZXh0KTsKICAgICAgbmV4dD8ucHJldmlvdXMgPSBwcmV2aW91czsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChwYXJlbnQucHJlY2VkaW5nQ29tbWVudHMgPT0gdGhpcyk7CiAgICAgIHBhcmVudC5wcmVjZWRpbmdDb21tZW50cyA9IG5leHQ7CiAgICB9CiAgfQp9CgovKioKICogQSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgdG9rZW4uCiAqLwpjbGFzcyBEb2N1bWVudGF0aW9uQ29tbWVudFRva2VuIGV4dGVuZHMgQ29tbWVudFRva2VuIHsKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byByZXByZXNlbnQgYSB0b2tlbiBvZiB0aGUgZ2l2ZW4gW3R5cGVdCiAgICogd2l0aCB0aGUgZ2l2ZW4gW3ZhbHVlXSBhdCB0aGUgZ2l2ZW4gW29mZnNldF0uCiAgICovCiAgRG9jdW1lbnRhdGlvbkNvbW1lbnRUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0KQogICAgICA6IHN1cGVyKHR5cGUsIHZhbHVlLCBvZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBDb21tZW50VG9rZW4gY29weSgpID0+IG5ldyBEb2N1bWVudGF0aW9uQ29tbWVudFRva2VuKHR5cGUsIF92YWx1ZSwgb2Zmc2V0KTsKfQoKLyoqCiAqIFRoZSBrZXl3b3JkcyBpbiB0aGUgRGFydCBwcm9ncmFtbWluZyBsYW5ndWFnZS4KICoKICogQ2xpZW50cyBtYXkgbm90IGV4dGVuZCwgaW1wbGVtZW50IG9yIG1peC1pbiB0aGlzIGNsYXNzLgogKi8KY2xhc3MgS2V5d29yZCBleHRlbmRzIFRva2VuVHlwZSB7CiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQUJTVFJBQ1QgPQogICAgICBjb25zdCBLZXl3b3JkKCJhYnN0cmFjdCIsICJBQlNUUkFDVCIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEFTID0gY29uc3QgS2V5d29yZCgiYXMiLCAiQVMiLAogICAgICBwcmVjZWRlbmNlOiBSRUxBVElPTkFMX1BSRUNFREVOQ0UsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEFTU0VSVCA9IGNvbnN0IEtleXdvcmQoImFzc2VydCIsICJBU1NFUlQiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQVNZTkMgPSBjb25zdCBLZXl3b3JkKCJhc3luYyIsICJBU1lOQyIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQVdBSVQgPSBjb25zdCBLZXl3b3JkKCJhd2FpdCIsICJBV0FJVCIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQlJFQUsgPSBjb25zdCBLZXl3b3JkKCJicmVhayIsICJCUkVBSyIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBDQVNFID0gY29uc3QgS2V5d29yZCgiY2FzZSIsICJDQVNFIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIENBVENIID0gY29uc3QgS2V5d29yZCgiY2F0Y2giLCAiQ0FUQ0giKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQ0xBU1MgPQogICAgICBjb25zdCBLZXl3b3JkKCJjbGFzcyIsICJDTEFTUyIsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgQ09OU1QgPQogICAgICBjb25zdCBLZXl3b3JkKCJjb25zdCIsICJDT05TVCIsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBDT05USU5VRSA9IGNvbnN0IEtleXdvcmQoImNvbnRpbnVlIiwgIkNPTlRJTlVFIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIENPVkFSSUFOVCA9IGNvbnN0IEtleXdvcmQoImNvdmFyaWFudCIsICJDT1ZBUklBTlQiLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBERUZBVUxUID0gY29uc3QgS2V5d29yZCgiZGVmYXVsdCIsICJERUZBVUxUIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIERFRkVSUkVEID0KICAgICAgY29uc3QgS2V5d29yZCgiZGVmZXJyZWQiLCAiREVGRVJSRUQiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBETyA9IGNvbnN0IEtleXdvcmQoImRvIiwgIkRPIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIERZTkFNSUMgPQogICAgICBjb25zdCBLZXl3b3JkKCJkeW5hbWljIiwgIkRZTkFNSUMiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBFTFNFID0gY29uc3QgS2V5d29yZCgiZWxzZSIsICJFTFNFIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVOVU0gPQogICAgICBjb25zdCBLZXl3b3JkKCJlbnVtIiwgIkVOVU0iLCBpc1RvcExldmVsS2V5d29yZDogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVYUE9SVCA9IGNvbnN0IEtleXdvcmQoImV4cG9ydCIsICJFWFBPUlQiLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRVhURU5EUyA9IGNvbnN0IEtleXdvcmQoImV4dGVuZHMiLCAiRVhURU5EUyIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBFWFRFTlNJT04gPSBjb25zdCBLZXl3b3JkKCJleHRlbnNpb24iLCAiRVhURU5TSU9OIiwKICAgICAgaXNCdWlsdEluOiB0cnVlLCBpc1RvcExldmVsS2V5d29yZDogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEVYVEVSTkFMID0KICAgICAgY29uc3QgS2V5d29yZCgiZXh0ZXJuYWwiLCAiRVhURVJOQUwiLCBpc0J1aWx0SW46IHRydWUsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGQUNUT1JZID0KICAgICAgY29uc3QgS2V5d29yZCgiZmFjdG9yeSIsICJGQUNUT1JZIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRkFMU0UgPSBjb25zdCBLZXl3b3JkKCJmYWxzZSIsICJGQUxTRSIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGSU5BTCA9CiAgICAgIGNvbnN0IEtleXdvcmQoImZpbmFsIiwgIkZJTkFMIiwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIEZJTkFMTFkgPSBjb25zdCBLZXl3b3JkKCJmaW5hbGx5IiwgIkZJTkFMTFkiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgRk9SID0gY29uc3QgS2V5d29yZCgiZm9yIiwgIkZPUiIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBGVU5DVElPTiA9CiAgICAgIGNvbnN0IEtleXdvcmQoIkZ1bmN0aW9uIiwgIkZVTkNUSU9OIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBHRVQgPSBjb25zdCBLZXl3b3JkKCJnZXQiLCAiR0VUIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSElERSA9IGNvbnN0IEtleXdvcmQoImhpZGUiLCAiSElERSIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSUYgPSBjb25zdCBLZXl3b3JkKCJpZiIsICJJRiIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJTVBMRU1FTlRTID0KICAgICAgY29uc3QgS2V5d29yZCgiaW1wbGVtZW50cyIsICJJTVBMRU1FTlRTIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgSU1QT1JUID0gY29uc3QgS2V5d29yZCgiaW1wb3J0IiwgIklNUE9SVCIsCiAgICAgIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJTiA9IGNvbnN0IEtleXdvcmQoImluIiwgIklOIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIElOT1VUID0gY29uc3QgS2V5d29yZCgiaW5vdXQiLCAiSU5PVVQiLCBpc1BzZXVkbzogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIElOVEVSRkFDRSA9CiAgICAgIGNvbnN0IEtleXdvcmQoImludGVyZmFjZSIsICJJTlRFUkZBQ0UiLCBpc0J1aWx0SW46IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBJUyA9CiAgICAgIGNvbnN0IEtleXdvcmQoImlzIiwgIklTIiwgcHJlY2VkZW5jZTogUkVMQVRJT05BTF9QUkVDRURFTkNFKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgTEFURSA9CiAgICAgIGNvbnN0IEtleXdvcmQoImxhdGUiLCAiTEFURSIsIGlzTW9kaWZpZXI6IHRydWUsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIExJQlJBUlkgPSBjb25zdCBLZXl3b3JkKCJsaWJyYXJ5IiwgIkxJQlJBUlkiLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgTUlYSU4gPQogICAgICBjb25zdCBLZXl3b3JkKCJtaXhpbiIsICJNSVhJTiIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNUb3BMZXZlbEtleXdvcmQ6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBOQVRJVkUgPQogICAgICBjb25zdCBLZXl3b3JkKCJuYXRpdmUiLCAiTkFUSVZFIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBORVcgPSBjb25zdCBLZXl3b3JkKCJuZXciLCAiTkVXIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIE5VTEwgPSBjb25zdCBLZXl3b3JkKCJudWxsIiwgIk5VTEwiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgT0YgPSBjb25zdCBLZXl3b3JkKCJvZiIsICJPRiIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgT04gPSBjb25zdCBLZXl3b3JkKCJvbiIsICJPTiIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgT1BFUkFUT1IgPQogICAgICBjb25zdCBLZXl3b3JkKCJvcGVyYXRvciIsICJPUEVSQVRPUiIsIGlzQnVpbHRJbjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIE9VVCA9IGNvbnN0IEtleXdvcmQoIm91dCIsICJPVVQiLCBpc1BzZXVkbzogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFBBUlQgPQogICAgICBjb25zdCBLZXl3b3JkKCJwYXJ0IiwgIlBBUlQiLCBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUEFUQ0ggPSBjb25zdCBLZXl3b3JkKCJwYXRjaCIsICJQQVRDSCIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUkVRVUlSRUQgPQogICAgICBjb25zdCBLZXl3b3JkKCJyZXF1aXJlZCIsICJSRVFVSVJFRCIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFJFVEhST1cgPSBjb25zdCBLZXl3b3JkKCJyZXRocm93IiwgIlJFVEhST1ciKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgUkVUVVJOID0gY29uc3QgS2V5d29yZCgicmV0dXJuIiwgIlJFVFVSTiIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBTRVQgPSBjb25zdCBLZXl3b3JkKCJzZXQiLCAiU0VUIiwgaXNCdWlsdEluOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU0hPVyA9IGNvbnN0IEtleXdvcmQoInNob3ciLCAiU0hPVyIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU09VUkNFID0KICAgICAgY29uc3QgS2V5d29yZCgic291cmNlIiwgIlNPVVJDRSIsIGlzUHNldWRvOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU1RBVElDID0KICAgICAgY29uc3QgS2V5d29yZCgic3RhdGljIiwgIlNUQVRJQyIsIGlzQnVpbHRJbjogdHJ1ZSwgaXNNb2RpZmllcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFNVUEVSID0gY29uc3QgS2V5d29yZCgic3VwZXIiLCAiU1VQRVIiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgU1dJVENIID0gY29uc3QgS2V5d29yZCgic3dpdGNoIiwgIlNXSVRDSCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBTWU5DID0gY29uc3QgS2V5d29yZCgic3luYyIsICJTWU5DIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBUSElTID0gY29uc3QgS2V5d29yZCgidGhpcyIsICJUSElTIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFRIUk9XID0gY29uc3QgS2V5d29yZCgidGhyb3ciLCAiVEhST1ciKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVFJVRSA9IGNvbnN0IEtleXdvcmQoInRydWUiLCAiVFJVRSIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBUUlkgPSBjb25zdCBLZXl3b3JkKCJ0cnkiLCAiVFJZIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFRZUEVERUYgPSBjb25zdCBLZXl3b3JkKCJ0eXBlZGVmIiwgIlRZUEVERUYiLAogICAgICBpc0J1aWx0SW46IHRydWUsIGlzVG9wTGV2ZWxLZXl3b3JkOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgVkFSID0gY29uc3QgS2V5d29yZCgidmFyIiwgIlZBUiIsIGlzTW9kaWZpZXI6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBWT0lEID0gY29uc3QgS2V5d29yZCgidm9pZCIsICJWT0lEIik7CgogIHN0YXRpYyBjb25zdCBLZXl3b3JkIFdISUxFID0gY29uc3QgS2V5d29yZCgid2hpbGUiLCAiV0hJTEUiKTsKCiAgc3RhdGljIGNvbnN0IEtleXdvcmQgV0lUSCA9IGNvbnN0IEtleXdvcmQoIndpdGgiLCAiV0lUSCIpOwoKICBzdGF0aWMgY29uc3QgS2V5d29yZCBZSUVMRCA9IGNvbnN0IEtleXdvcmQoInlpZWxkIiwgIllJRUxEIiwgaXNQc2V1ZG86IHRydWUpOwoKICBzdGF0aWMgY29uc3QgTGlzdDxLZXl3b3JkPiB2YWx1ZXMgPSBjb25zdCA8S2V5d29yZD5bCiAgICBBQlNUUkFDVCwKICAgIEFTLAogICAgQVNTRVJULAogICAgQVNZTkMsCiAgICBBV0FJVCwKICAgIEJSRUFLLAogICAgQ0FTRSwKICAgIENBVENILAogICAgQ0xBU1MsCiAgICBDT05TVCwKICAgIENPTlRJTlVFLAogICAgQ09WQVJJQU5ULAogICAgREVGQVVMVCwKICAgIERFRkVSUkVELAogICAgRE8sCiAgICBEWU5BTUlDLAogICAgRUxTRSwKICAgIEVOVU0sCiAgICBFWFBPUlQsCiAgICBFWFRFTkRTLAogICAgRVhURU5TSU9OLAogICAgRVhURVJOQUwsCiAgICBGQUNUT1JZLAogICAgRkFMU0UsCiAgICBGSU5BTCwKICAgIEZJTkFMTFksCiAgICBGT1IsCiAgICBGVU5DVElPTiwKICAgIEdFVCwKICAgIEhJREUsCiAgICBJRiwKICAgIElNUExFTUVOVFMsCiAgICBJTVBPUlQsCiAgICBJTiwKICAgIElOT1VULAogICAgSU5URVJGQUNFLAogICAgSVMsCiAgICBMQVRFLAogICAgTElCUkFSWSwKICAgIE1JWElOLAogICAgTkFUSVZFLAogICAgTkVXLAogICAgTlVMTCwKICAgIE9GLAogICAgT04sCiAgICBPUEVSQVRPUiwKICAgIE9VVCwKICAgIFBBUlQsCiAgICBQQVRDSCwKICAgIFJFUVVJUkVELAogICAgUkVUSFJPVywKICAgIFJFVFVSTiwKICAgIFNFVCwKICAgIFNIT1csCiAgICBTT1VSQ0UsCiAgICBTVEFUSUMsCiAgICBTVVBFUiwKICAgIFNXSVRDSCwKICAgIFNZTkMsCiAgICBUSElTLAogICAgVEhST1csCiAgICBUUlVFLAogICAgVFJZLAogICAgVFlQRURFRiwKICAgIFZBUiwKICAgIFZPSUQsCiAgICBXSElMRSwKICAgIFdJVEgsCiAgICBZSUVMRCwKICBdOwoKICAvKioKICAgKiBBIHRhYmxlIG1hcHBpbmcgdGhlIGxleGVtZXMgb2Yga2V5d29yZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZC4KICAgKi8KICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgS2V5d29yZD4ga2V5d29yZHMgPSBfY3JlYXRlS2V5d29yZE1hcCgpOwoKICAvKioKICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBrZXl3b3JkIGlzICJidWlsdC1pbiIgaWRlbnRpZmllci4KICAgKi8KICBAb3ZlcnJpZGUKICBmaW5hbCBib29sIGlzQnVpbHRJbjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgYm9vbCBpc1BzZXVkbzsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQga2V5d29yZC4KICAgKi8KICBjb25zdCBLZXl3b3JkKFN0cmluZyBsZXhlbWUsIFN0cmluZyBuYW1lLAogICAgICB7dGhpcy5pc0J1aWx0SW46IGZhbHNlLAogICAgICBib29sIGlzTW9kaWZpZXI6IGZhbHNlLAogICAgICB0aGlzLmlzUHNldWRvOiBmYWxzZSwKICAgICAgYm9vbCBpc1RvcExldmVsS2V5d29yZDogZmFsc2UsCiAgICAgIGludCBwcmVjZWRlbmNlOiBOT19QUkVDRURFTkNFfSkKICAgICAgOiBzdXBlcihsZXhlbWUsIG5hbWUsIHByZWNlZGVuY2UsIEtFWVdPUkRfVE9LRU4sCiAgICAgICAgICAgIGlzTW9kaWZpZXI6IGlzTW9kaWZpZXIsIGlzVG9wTGV2ZWxLZXl3b3JkOiBpc1RvcExldmVsS2V5d29yZCk7CgogIGJvb2wgZ2V0IGlzQnVpbHRJbk9yUHNldWRvID0+IGlzQnVpbHRJbiB8fCBpc1BzZXVkbzsKCiAgLyoqCiAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUga2V5d29yZCBpcyAiYnVpbHQtaW4iIGlkZW50aWZpZXIuCiAgICogVGhpcyBtZXRob2QgZXhpc3RzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCB3aWxsIGJlIHJlbW92ZWQuCiAgICogVXNlIFtpc0J1aWx0SW5dIGluc3RlYWQuCiAgICovCiAgQGRlcHJlY2F0ZWQKICBib29sIGdldCBpc1BzZXVkb0tleXdvcmQgPT4gaXNCdWlsdEluOyAvLyBUT0RPIChkYW5ydWJlbCk6IHJlbW92ZSB0aGlzCgogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSBrZXl3b3JkIHR5cGUuCiAgICovCiAgU3RyaW5nIGdldCBuYW1lID0+IGxleGVtZS50b1VwcGVyQ2FzZSgpOwoKICAvKioKICAgKiBUaGUgbGV4ZW1lIGZvciB0aGUga2V5d29yZC4KICAgKgogICAqIERlcHJlY2F0ZWQgLSB1c2UgW2xleGVtZV0gaW5zdGVhZC4KICAgKi8KICBAZGVwcmVjYXRlZAogIFN0cmluZyBnZXQgc3ludGF4ID0+IGxleGVtZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbmFtZTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgdGFibGUgbWFwcGluZyB0aGUgbGV4ZW1lcyBvZiBrZXl3b3JkcyB0byB0aGUgY29ycmVzcG9uZGluZyBrZXl3b3JkCiAgICogYW5kIHJldHVybiB0aGUgdGFibGUgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KICBzdGF0aWMgTWFwPFN0cmluZywgS2V5d29yZD4gX2NyZWF0ZUtleXdvcmRNYXAoKSB7CiAgICBMaW5rZWRIYXNoTWFwPFN0cmluZywgS2V5d29yZD4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEtleXdvcmQ+KCk7CiAgICBmb3IgKEtleXdvcmQga2V5d29yZCBpbiB2YWx1ZXMpIHsKICAgICAgcmVzdWx0W2tleXdvcmQubGV4ZW1lXSA9IGtleXdvcmQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLyoqCiAqIEEgdG9rZW4gcmVwcmVzZW50aW5nIGEga2V5d29yZCBpbiB0aGUgbGFuZ3VhZ2UuCiAqLwpjbGFzcyBLZXl3b3JkVG9rZW4gZXh0ZW5kcyBTaW1wbGVUb2tlbiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgS2V5d29yZCBrZXl3b3JkOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0b2tlbiB0byByZXByZXNlbnQgdGhlIGdpdmVuIFtrZXl3b3JkXSBhdCB0aGUKICAgKiBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBLZXl3b3JkVG9rZW4odGhpcy5rZXl3b3JkLCBpbnQgb2Zmc2V0LCBbQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRdKQogICAgICA6IHN1cGVyKGtleXdvcmQsIG9mZnNldCwgcHJlY2VkaW5nQ29tbWVudCk7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PgogICAgICBuZXcgS2V5d29yZFRva2VuKGtleXdvcmQsIG9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSWRlbnRpZmllciA9PiBrZXl3b3JkLmlzUHNldWRvIHx8IGtleXdvcmQuaXNCdWlsdEluOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0tleXdvcmQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNLZXl3b3JkT3JJZGVudGlmaWVyID0+IHRydWU7CgogIEBvdmVycmlkZQogIE9iamVjdCB2YWx1ZSgpID0+IGtleXdvcmQ7Cn0KCi8qKgogKiBBIHRva2VuIHRoYXQgd2FzIHNjYW5uZWQgZnJvbSB0aGUgaW5wdXQuIEVhY2ggdG9rZW4ga25vd3Mgd2hpY2ggdG9rZW5zCiAqIHByZWNlZGUgYW5kIGZvbGxvdyBpdCwgYWN0aW5nIGFzIGEgbGluayBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiB0b2tlbnMuCiAqLwpjbGFzcyBTaW1wbGVUb2tlbiBpbXBsZW1lbnRzIFRva2VuIHsKICAvKioKICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9rZW4uCiAgICovCiAgQG92ZXJyaWRlCiAgZmluYWwgVG9rZW5UeXBlIHR5cGU7CgogIC8qKgogICAqIFRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlCiAgICogdG9rZW4uCiAgICovCiAgQG92ZXJyaWRlCiAgaW50IG9mZnNldCA9IDA7CgogIC8qKgogICAqIFRoZSBwcmV2aW91cyB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIEBvdmVycmlkZQogIFRva2VuIHByZXZpb3VzOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBuZXh0OwoKICAvKioKICAgKiBUaGUgZmlyc3QgY29tbWVudCBpbiB0aGUgbGlzdCBvZiBjb21tZW50cyB0aGF0IHByZWNlZGUgdGhpcyB0b2tlbi4KICAgKi8KICBDb21tZW50VG9rZW4gX3ByZWNlZGluZ0NvbW1lbnQ7CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIGhhdmUgdGhlIGdpdmVuIFt0eXBlXSBhbmQgW29mZnNldF0uCiAgICovCiAgU2ltcGxlVG9rZW4odGhpcy50eXBlLCB0aGlzLm9mZnNldCwgW3RoaXMuX3ByZWNlZGluZ0NvbW1lbnRdKSB7CiAgICBfc2V0Q29tbWVudFBhcmVudChfcHJlY2VkaW5nQ29tbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJDb3VudCA9PiBsZW5ndGg7CgogIEBvdmVycmlkZQogIGludCBnZXQgY2hhck9mZnNldCA9PiBvZmZzZXQ7CgogIEBvdmVycmlkZQogIGludCBnZXQgY2hhckVuZCA9PiBlbmQ7CgogIEBvdmVycmlkZQogIFRva2VuIGdldCBiZWZvcmVTeW50aGV0aWMgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgc2V0IGJlZm9yZVN5bnRoZXRpYyhUb2tlbiBwcmV2aW91cykgewogICAgLy8gaWdub3JlZAogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBlbmQgPT4gb2Zmc2V0ICsgbGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBnZXQgZW5kR3JvdXAgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFb2YgPT4gdHlwZSA9PSBUb2tlblR5cGUuRU9GOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0lkZW50aWZpZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzS2V5d29yZCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNLZXl3b3JkT3JJZGVudGlmaWVyID0+IGlzSWRlbnRpZmllcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNNb2RpZmllciA9PiB0eXBlLmlzTW9kaWZpZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4gdHlwZS5pc09wZXJhdG9yOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiBsZW5ndGggPT0gMDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUb3BMZXZlbEtleXdvcmQgPT4gdHlwZS5pc1RvcExldmVsS2V5d29yZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IgPT4gdHlwZS5pc1VzZXJEZWZpbmFibGVPcGVyYXRvcjsKCiAgQG92ZXJyaWRlCiAgS2V5d29yZCBnZXQga2V5d29yZCA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGtpbmQgPT4gdHlwZS5raW5kOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiBsZXhlbWUubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGxleGVtZSA9PiB0eXBlLmxleGVtZTsKCiAgQG92ZXJyaWRlCiAgQ29tbWVudFRva2VuIGdldCBwcmVjZWRpbmdDb21tZW50cyA9PiBfcHJlY2VkaW5nQ29tbWVudDsKCiAgdm9pZCBzZXQgcHJlY2VkaW5nQ29tbWVudHMoQ29tbWVudFRva2VuIGNvbW1lbnQpIHsKICAgIF9wcmVjZWRpbmdDb21tZW50ID0gY29tbWVudDsKICAgIF9zZXRDb21tZW50UGFyZW50KF9wcmVjZWRpbmdDb21tZW50KTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgc3RyaW5nVmFsdWUgPT4gdHlwZS5zdHJpbmdWYWx1ZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBTaW1wbGVUb2tlbih0eXBlLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5Q29tbWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgVG9rZW4gaGVhZCA9IHRva2VuLmNvcHkoKTsKICAgIFRva2VuIHRhaWwgPSBoZWFkOwogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgd2hpbGUgKHRva2VuICE9IG51bGwpIHsKICAgICAgdGFpbCA9IHRhaWwuc2V0TmV4dCh0b2tlbi5jb3B5KCkpOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gaGVhZDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgbWF0Y2hlc0FueShMaXN0PFRva2VuVHlwZT4gdHlwZXMpIHsKICAgIGZvciAoVG9rZW5UeXBlIHR5cGUgaW4gdHlwZXMpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PSB0eXBlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNldE5leHQoVG9rZW4gdG9rZW4pIHsKICAgIG5leHQgPSB0b2tlbjsKICAgIHRva2VuLnByZXZpb3VzID0gdGhpczsKICAgIHRva2VuLmJlZm9yZVN5bnRoZXRpYyA9IHRoaXM7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBzZXROZXh0V2l0aG91dFNldHRpbmdQcmV2aW91cyhUb2tlbiB0b2tlbikgewogICAgbmV4dCA9IHRva2VuOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbGV4ZW1lOwoKICBAb3ZlcnJpZGUKICBPYmplY3QgdmFsdWUoKSA9PiBsZXhlbWU7CgogIC8qKgogICAqIFNldHMgdGhlIGBwYXJlbnRgIHByb3BlcnR5IHRvIGB0aGlzYCBmb3IgdGhlIGdpdmVuIFtjb21tZW50XSBhbmQgYWxsIHRoZQogICAqIG5leHQgdG9rZW5zLgogICAqLwogIHZvaWQgX3NldENvbW1lbnRQYXJlbnQoQ29tbWVudFRva2VuIGNvbW1lbnQpIHsKICAgIHdoaWxlIChjb21tZW50ICE9IG51bGwpIHsKICAgICAgY29tbWVudC5wYXJlbnQgPSB0aGlzOwogICAgICBjb21tZW50ID0gY29tbWVudC5uZXh0OwogICAgfQogIH0KfQoKLyoqCiAqIEEgdG9rZW4gd2hvc2UgdmFsdWUgaXMgaW5kZXBlbmRlbnQgb2YgaXQncyB0eXBlLgogKi8KY2xhc3MgU3RyaW5nVG9rZW4gZXh0ZW5kcyBTaW1wbGVUb2tlbiB7CiAgLyoqCiAgICogVGhlIGxleGVtZSByZXByZXNlbnRlZCBieSB0aGlzIHRva2VuLgogICAqLwogIFN0cmluZyBfdmFsdWU7CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIHJlcHJlc2VudCBhIHRva2VuIG9mIHRoZSBnaXZlbiBbdHlwZV0KICAgKiB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdIGF0IHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICBTdHJpbmdUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LAogICAgICBbQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRdKQogICAgICA6IHN1cGVyKHR5cGUsIG9mZnNldCwgcHJlY2VkaW5nQ29tbWVudCkgewogICAgdGhpcy5fdmFsdWUgPSBTdHJpbmdVdGlsaXRpZXMuaW50ZXJuKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzSWRlbnRpZmllciA9PiBpZGVudGljYWwoa2luZCwgSURFTlRJRklFUl9UT0tFTik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbGV4ZW1lID0+IF92YWx1ZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gY29weSgpID0+CiAgICAgIG5ldyBTdHJpbmdUb2tlbih0eXBlLCBfdmFsdWUsIG9mZnNldCwgY29weUNvbW1lbnRzKHByZWNlZGluZ0NvbW1lbnRzKSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB2YWx1ZSgpID0+IF92YWx1ZTsKfQoKLyoqCiAqIEEgc3ludGhldGljIGJlZ2luIHRva2VuLgogKi8KY2xhc3MgU3ludGhldGljQmVnaW5Ub2tlbiBleHRlbmRzIEJlZ2luVG9rZW4gewogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIGhhdmUgdGhlIGdpdmVuIFt0eXBlXSBhdCB0aGUgZ2l2ZW4KICAgKiBbb2Zmc2V0XS4KICAgKi8KICBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICBbQ29tbWVudFRva2VuIHByZWNlZGluZ0NvbW1lbnRdKQogICAgICA6IHN1cGVyKHR5cGUsIG9mZnNldCwgcHJlY2VkaW5nQ29tbWVudCk7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PgogICAgICBuZXcgU3ludGhldGljQmVnaW5Ub2tlbih0eXBlLCBvZmZzZXQsIGNvcHlDb21tZW50cyhwcmVjZWRpbmdDb21tZW50cykpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N5bnRoZXRpYyA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwp9CgovKioKICogQSBzeW50aGV0aWMga2V5d29yZCB0b2tlbi4KICovCmNsYXNzIFN5bnRoZXRpY0tleXdvcmRUb2tlbiBleHRlbmRzIEtleXdvcmRUb2tlbiB7CiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBba2V5d29yZF0gYXQgdGhlCiAgICogZ2l2ZW4gW29mZnNldF0uCiAgICovCiAgU3ludGhldGljS2V5d29yZFRva2VuKEtleXdvcmQga2V5d29yZCwgaW50IG9mZnNldCkgOiBzdXBlcihrZXl3b3JkLCBvZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb3B5KCkgPT4gbmV3IFN5bnRoZXRpY0tleXdvcmRUb2tlbihrZXl3b3JkLCBvZmZzZXQpOwp9CgovKioKICogQSB0b2tlbiB3aG9zZSB2YWx1ZSBpcyBpbmRlcGVuZGVudCBvZiBpdCdzIHR5cGUuCiAqLwpjbGFzcyBTeW50aGV0aWNTdHJpbmdUb2tlbiBleHRlbmRzIFN0cmluZ1Rva2VuIHsKICBmaW5hbCBpbnQgX2xlbmd0aDsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdG8gcmVwcmVzZW50IGEgdG9rZW4gb2YgdGhlIGdpdmVuIFt0eXBlXQogICAqIHdpdGggdGhlIGdpdmVuIFt2YWx1ZV0gYXQgdGhlIGdpdmVuIFtvZmZzZXRdLiBJZiB0aGUgW2xlbmd0aF0gaXMKICAgKiBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzIHRvIHRoZSBsZW5ndGggb2YgW3ZhbHVlXS4KICAgKi8KICBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LCBbdGhpcy5fbGVuZ3RoXSkKICAgICAgOiBzdXBlcih0eXBlLCB2YWx1ZSwgb2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTeW50aGV0aWMgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBsZW5ndGggPT4gX2xlbmd0aCA/PyBzdXBlci5sZW5ndGg7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4odHlwZSwgX3ZhbHVlLCBvZmZzZXQsIF9sZW5ndGgpOwp9CgovKioKICogQSBzeW50aGV0aWMgdG9rZW4uCiAqLwpjbGFzcyBTeW50aGV0aWNUb2tlbiBleHRlbmRzIFNpbXBsZVRva2VuIHsKICBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IG9mZnNldCkgOiBzdXBlcih0eXBlLCBvZmZzZXQpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBiZWZvcmVTeW50aGV0aWM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IHRydWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoID0+IDA7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSA9PiBuZXcgU3ludGhldGljVG9rZW4odHlwZSwgb2Zmc2V0KTsKfQoKLyoqCiAqIEEgdG9rZW4gdGhhdCB3YXMgc2Nhbm5lZCBmcm9tIHRoZSBpbnB1dC4gRWFjaCB0b2tlbiBrbm93cyB3aGljaCB0b2tlbnMKICogcHJlY2VkZSBhbmQgZm9sbG93IGl0LCBhY3RpbmcgYXMgYSBsaW5rIGluIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIHRva2Vucy4KICoKICogQ2xpZW50cyBtYXkgbm90IGV4dGVuZCwgaW1wbGVtZW50IG9yIG1peC1pbiB0aGlzIGNsYXNzLgogKi8KYWJzdHJhY3QgY2xhc3MgVG9rZW4gaW1wbGVtZW50cyBTeW50YWN0aWNFbnRpdHkgewogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRva2VuIHRvIGhhdmUgdGhlIGdpdmVuIFt0eXBlXSBhbmQgW29mZnNldF0uCiAgICovCiAgZmFjdG9yeSBUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IG9mZnNldCwgW0NvbW1lbnRUb2tlbiBwcmVjZWVkaW5nQ29tbWVudF0pID0KICAgICAgU2ltcGxlVG9rZW47CgogIC8qKgogICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVuZC1vZi1maWxlIHRva2VuIHRvIGhhdmUgdGhlIGdpdmVuIFtvZmZzZXRdLgogICAqLwogIGZhY3RvcnkgVG9rZW4uZW9mKGludCBvZmZzZXQsIFtDb21tZW50VG9rZW4gcHJlY2VkaW5nQ29tbWVudHNdKSB7CiAgICBUb2tlbiBlb2YgPSBuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkVPRiwgb2Zmc2V0LCBwcmVjZWRpbmdDb21tZW50cyk7CiAgICAvLyBFT0YgcG9pbnRzIHRvIGl0c2VsZiBzbyB0aGVyZSdzIGFsd2F5cyBpbmZpbml0ZSBsb29rLWFoZWFkLgogICAgZW9mLnByZXZpb3VzID0gZW9mOwogICAgZW9mLm5leHQgPSBlb2Y7CiAgICByZXR1cm4gZW9mOwogIH0KCiAgLyoqCiAgICogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBhcnNlZCBieSB0aGlzIHRva2VuLgogICAqLwogIGludCBnZXQgY2hhckNvdW50OwoKICAvKioKICAgKiBUaGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyB0b2tlbiB3aXRoaW4gdGhlIHNvdXJjZSB0ZXh0LgogICAqLwogIGludCBnZXQgY2hhck9mZnNldDsKCiAgLyoqCiAgICogVGhlIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGlzIHRva2VuIHdpdGhpbiB0aGUgc291cmNlIHRleHQuCiAgICovCiAgaW50IGdldCBjaGFyRW5kOwoKICAvKioKICAgKiBUaGUgdG9rZW4gYmVmb3JlIHRoaXMgc3ludGhldGljIHRva2VuLAogICAqIG9yIGBudWxsYCBpZiB0aGlzIGlzIG5vdCBhIHN5bnRoZXRpYyBgKWAsIGBdYCwgYH1gLCBvciBgPmAgdG9rZW4uCiAgICovCiAgVG9rZW4gZ2V0IGJlZm9yZVN5bnRoZXRpYzsKCiAgLyoqCiAgICogU2V0IHRva2VuIGJlZm9yZSB0aGlzIHN5bnRoZXRpYyBgKWAsIGBdYCwgYH1gLCBvciBgPmAgdG9rZW4sCiAgICogYW5kIGlnbm9yZWQgb3RoZXJ3aXNlLgogICAqLwogIHNldCBiZWZvcmVTeW50aGV0aWMoVG9rZW4gcHJldmlvdXMpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGVuZDsKCiAgLyoqCiAgICogVGhlIHRva2VuIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyB0b2tlbiwgb3IgYG51bGxgIGlmIHRoaXMgdG9rZW4gaXMgbm90CiAgICogdGhlIGZpcnN0IG9mIGEgcGFpciBvZiBtYXRjaGluZyB0b2tlbnMgKHN1Y2ggYXMgcGFyZW50aGVzZXMpLgogICAqLwogIFRva2VuIGdldCBlbmRHcm91cCA9PiBudWxsOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gcmVwcmVzZW50cyBhbiBlbmQgb2YgZmlsZS4KICAgKi8KICBib29sIGdldCBpc0VvZjsKCiAgLyoqCiAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGFuIGlkZW50aWZpZXIuIFNvbWUga2V5d29yZHMgYWxsb3dlZCBhcyBpZGVudGlmaWVycywKICAgKiBzZWUgaW1wbGVtZW50YXRpb24gaW4gW0tleXdvcmRUb2tlbl0uCiAgICovCiAgYm9vbCBnZXQgaXNJZGVudGlmaWVyOwoKICAvKioKICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBrZXl3b3JkLiBTb21lIGtleXdvcmRzIGFsbG93ZWQgYXMgaWRlbnRpZmllcnMsCiAgICogc2VlIGltcGxlbWVudGF0aW9uIGluIFtLZXl3b3JkVG9rZW5dLgogICAqLwogIGJvb2wgZ2V0IGlzS2V5d29yZDsKCiAgLyoqCiAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEga2V5d29yZCBvciBhbiBpZGVudGlmaWVyLgogICAqLwogIGJvb2wgZ2V0IGlzS2V5d29yZE9ySWRlbnRpZmllcjsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIGlzIGEgbW9kaWZpZXIgc3VjaCBhcyBgYWJzdHJhY3RgIG9yIGBjb25zdGAuCiAgICovCiAgYm9vbCBnZXQgaXNNb2RpZmllcjsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIHJlcHJlc2VudHMgYW4gb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNPcGVyYXRvcjsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHRva2VuIGlzIGEgc3ludGhldGljIHRva2VuLiBBIHN5bnRoZXRpYyB0b2tlbiBpcyBhCiAgICogdG9rZW4gdGhhdCB3YXMgaW50cm9kdWNlZCBieSB0aGUgcGFyc2VyIGluIG9yZGVyIHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvcgogICAqIGluIHRoZSBjb2RlLgogICAqLwogIGJvb2wgZ2V0IGlzU3ludGhldGljOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdG9rZW4gaXMgYSBrZXl3b3JkIHN0YXJ0aW5nIGEgdG9wIGxldmVsIGRlY2xhcmF0aW9uCiAgICogc3VjaCBhcyBgY2xhc3NgLCBgZW51bWAsIGBpbXBvcnRgLCBldGMuCiAgICovCiAgYm9vbCBnZXQgaXNUb3BMZXZlbEtleXdvcmQ7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiByZXByZXNlbnRzIGFuIG9wZXJhdG9yIHRoYXQgY2FuIGJlIGRlZmluZWQgYnkKICAgKiB1c2Vycy4KICAgKi8KICBib29sIGdldCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBrZXl3b3JkLCBpZiBhIGtleXdvcmQgdG9rZW4sIG9yIGBudWxsYCBvdGhlcndpc2UuCiAgICovCiAgS2V5d29yZCBnZXQga2V5d29yZDsKCiAgLyoqCiAgICogVGhlIGtpbmQgZW51bSBvZiB0aGlzIHRva2VuIGFzIGRldGVybWluZWQgYnkgaXRzIFt0eXBlXS4KICAgKi8KICBpbnQgZ2V0IGtpbmQ7CgogIEBvdmVycmlkZQogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIGxleGVtZSB0aGF0IHJlcHJlc2VudHMgdGhpcyB0b2tlbi4KICAgKgogICAqIEZvciBbU3RyaW5nVG9rZW5dcyB0aGUgW2xleGVtZV0gaW5jbHVkZXMgdGhlIHF1b3RlcywgZXhwbGljaXQgZXNjYXBlcywgZXRjLgogICAqLwogIFN0cmluZyBnZXQgbGV4ZW1lOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG5leHQgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbS4KICAgKi8KICBUb2tlbiBnZXQgbmV4dDsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSBuZXh0IHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgICovCiAgdm9pZCBzZXQgbmV4dChUb2tlbiBuZXh0KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCBvZmZzZXQ7CgogIC8qKgogICAqIFNldCB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCiAgICogdGhlIHRva2VuIHRvIHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgKi8KICB2b2lkIHNldCBvZmZzZXQoaW50IG9mZnNldCk7CgogIC8qKgogICAqIFJldHVybiB0aGUgZmlyc3QgY29tbWVudCBpbiB0aGUgbGlzdCBvZiBjb21tZW50cyB0aGF0IHByZWNlZGUgdGhpcyB0b2tlbiwKICAgKiBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIGNvbW1lbnRzIHByZWNlZGluZyB0aGlzIHRva2VuLiBBZGRpdGlvbmFsCiAgICogY29tbWVudHMgY2FuIGJlIHJlYWNoZWQgYnkgZm9sbG93aW5nIHRoZSB0b2tlbiBzdHJlYW0gdXNpbmcgW25leHRdIHVudGlsCiAgICogYG51bGxgIGlzIHJldHVybmVkLgogICAqCiAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBvcmlnaW5hbCBjb250ZW50cyB3ZXJlIGAvKiBvbmUgKi8gLyogdHdvICovIGlkYCwgdGhlbgogICAqIHRoZSBmaXJzdCBwcmVjZWRpbmcgY29tbWVudCB0b2tlbiB3aWxsIGhhdmUgYSBsZXhlbWUgb2YgYC8qIG9uZSAqL2AgYW5kCiAgICogdGhlIG5leHQgY29tbWVudCB0b2tlbiB3aWxsIGhhdmUgYSBsZXhlbWUgb2YgYC8qIHR3byAqL2AuCiAgICovCiAgVG9rZW4gZ2V0IHByZWNlZGluZ0NvbW1lbnRzOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgICovCiAgVG9rZW4gZ2V0IHByZXZpb3VzOwoKICAvKioKICAgKiBTZXQgdGhlIHByZXZpb3VzIHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0gdG8gdGhlIGdpdmVuIFt0b2tlbl0uCiAgICovCiAgdm9pZCBzZXQgcHJldmlvdXMoVG9rZW4gdG9rZW4pOwoKICAvKioKICAgKiBGb3Igc3ltYm9sIGFuZCBrZXl3b3JkIHRva2VucywgcmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoaXMKICAgKiB0b2tlbi4gRm9yIFtTdHJpbmdUb2tlbl1zIHRoaXMgbWV0aG9kIHJldHVybnMgWzpudWxsOl0uCiAgICoKICAgKiBGb3IgW1N5bWJvbFRva2VuXXMgYW5kIFtLZXl3b3JkVG9rZW5dcywgdGhlIHN0cmluZyB2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZQogICAqIGNvbnN0YW50IG9yaWdpbmF0aW5nIGluIHRoZSBbVG9rZW5UeXBlXSBvciBpbiB0aGUgW0tleXdvcmRdIGluc3RhbmNlLgogICAqIFRoaXMgYWxsb3dzIHRlc3RpbmcgZm9yIGtleXdvcmRzIGFuZCBzeW1ib2xzIHVzaW5nIFs6aWRlbnRpY2FsOl0sIGUuZy4sCiAgICogWzppZGVudGljYWwoJ2NsYXNzJywgdG9rZW4udmFsdWUpOl0uCiAgICoKICAgKiBOb3RlIHRoYXQgcmV0dXJuaW5nIFs6bnVsbDpdIGZvciBzdHJpbmcgdG9rZW5zIGlzIGltcG9ydGFudCB0byBpZGVudGlmeQogICAqIHN5bWJvbHMgYW5kIGtleXdvcmRzLCB3ZSBjYW5ub3QgdXNlIFtsZXhlbWVdIGluc3RlYWQuIFRoZSBzdHJpbmcgbGl0ZXJhbAogICAqICAgIiRhKCRiIgogICAqIHByb2R1Y2VzIC4uLiwgU3ltYm9sVG9rZW4oJCksIFN0cmluZ1Rva2VuKGEpLCBTdHJpbmdUb2tlbigoKSwgLi4uCiAgICoKICAgKiBBZnRlciBwYXJzaW5nIHRoZSBpZGVudGlmaWVyICdhJywgdGhlIHBhcnNlciB0ZXN0cyBmb3IgYSBmdW5jdGlvbgogICAqIGRlY2xhcmF0aW9uIHVzaW5nIFs6aWRlbnRpY2FsKG5leHQuc3RyaW5nVmFsdWUsICcoJyk6XSwgd2hpY2ggKHJpZ2h0ZnVsbHkpCiAgICogcmV0dXJucyBmYWxzZSBiZWNhdXNlIHN0cmluZ1ZhbHVlIHJldHVybnMgWzpudWxsOl0uCiAgICovCiAgU3RyaW5nIGdldCBzdHJpbmdWYWx1ZTsKCiAgLyoqCiAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSB0b2tlbi4KICAgKi8KICBUb2tlblR5cGUgZ2V0IHR5cGU7CgogIC8qKgogICAqIFJldHVybiBhIG5ld2x5IGNyZWF0ZWQgdG9rZW4gdGhhdCBpcyBhIGNvcHkgb2YgdGhpcyB0b2tlbnMKICAgKiBpbmNsdWRpbmcgYW55IFtwcmVjZWVkaW5nQ29tbWVudF0gdG9rZW5zLAogICAqIGJ1dCB0aGF0IGlzIG5vdCBhIHBhcnQgb2YgYW55IHRva2VuIHN0cmVhbS4KICAgKi8KICBUb2tlbiBjb3B5KCk7CgogIC8qKgogICAqIENvcHkgYSBsaW5rZWQgbGlzdCBvZiBjb21tZW50IHRva2VucyBpZGVudGljYWwgdG8gdGhlIGdpdmVuIGNvbW1lbnQgdG9rZW5zLgogICAqLwogIFRva2VuIGNvcHlDb21tZW50cyhUb2tlbiB0b2tlbik7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiBoYXMgYW55IG9uZSBvZiB0aGUgZ2l2ZW4gW3R5cGVzXS4KICAgKi8KICBib29sIG1hdGNoZXNBbnkoTGlzdDxUb2tlblR5cGU+IHR5cGVzKTsKCiAgLyoqCiAgICogU2V0IHRoZSBuZXh0IHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0gdG8gdGhlIGdpdmVuIFt0b2tlbl0uIFRoaXMgaGFzIHRoZQogICAqIHNpZGUtZWZmZWN0IG9mIHNldHRpbmcgdGhpcyB0b2tlbiB0byBiZSB0aGUgcHJldmlvdXMgdG9rZW4gZm9yIHRoZSBnaXZlbgogICAqIHRva2VuLiBSZXR1cm4gdGhlIHRva2VuIHRoYXQgd2FzIHBhc3NlZCBpbi4KICAgKi8KICBUb2tlbiBzZXROZXh0KFRva2VuIHRva2VuKTsKCiAgLyoqCiAgICogU2V0IHRoZSBuZXh0IHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0gdG8gdGhlIGdpdmVuIHRva2VuIHdpdGhvdXQgY2hhbmdpbmcKICAgKiB3aGljaCB0b2tlbiBpcyB0aGUgcHJldmlvdXMgdG9rZW4gZm9yIHRoZSBnaXZlbiB0b2tlbi4gUmV0dXJuIHRoZSB0b2tlbgogICAqIHRoYXQgd2FzIHBhc3NlZCBpbi4KICAgKi8KICBUb2tlbiBzZXROZXh0V2l0aG91dFNldHRpbmdQcmV2aW91cyhUb2tlbiB0b2tlbik7CgogIC8qKgogICAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdG9rZW4gdG8gYmUgdXNlZCBmb3IgZGVidWdnaW5nCiAgICogcHVycG9zZXMuIFRoZSByZXN1bHRpbmcgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgICogc3RydWN0dXJlIG9mIHRoZSB0b2tlbiwgZm9yIGV4YW1wbGUgJ1N0cmluZ1Rva2VuKGZvbyknIGZvciB0aGUgaWRlbnRpZmllcgogICAqIHRva2VuICdmb28nLgogICAqCiAgICogVXNlIFtsZXhlbWVdIGZvciB0aGUgdGV4dCBhY3R1YWxseSBwYXJzZWQgYnkgdGhlIHRva2VuLgogICAqLwogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgdG9rZW4uIEZvciBrZXl3b3JkIHRva2VucywgdGhpcyBpcyB0aGUga2V5d29yZAogICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9rZW4sIGZvciBvdGhlciB0b2tlbnMgaXQgaXMgdGhlIGxleGVtZSBhc3NvY2lhdGVkCiAgICogd2l0aCB0aGUgdG9rZW4uCiAgICovCiAgT2JqZWN0IHZhbHVlKCk7CgogIC8qKgogICAqIENvbXBhcmUgdGhlIGdpdmVuIFt0b2tlbnNdIHRvIGZpbmQgdGhlIHRva2VuIHRoYXQgYXBwZWFycyBmaXJzdCBpbiB0aGUKICAgKiBzb3VyY2UgYmVpbmcgcGFyc2VkLiBUaGF0IGlzLCByZXR1cm4gdGhlIGxlZnQtbW9zdCBvZiBhbGwgb2YgdGhlIHRva2Vucy4KICAgKiBUaGUgbGlzdCBtdXN0IGJlIG5vbi1gbnVsbGAsIGJ1dCB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgYXJlIGFsbG93ZWQgdG8gYmUKICAgKiBgbnVsbGAuIFJldHVybiB0aGUgdG9rZW4gd2l0aCB0aGUgc21hbGxlc3Qgb2Zmc2V0LCBvciBgbnVsbGAgaWYgdGhlIGxpc3QgaXMKICAgKiBlbXB0eSBvciBpZiBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFyZSBgbnVsbGAuCiAgICovCiAgc3RhdGljIFRva2VuIGxleGljYWxseUZpcnN0KExpc3Q8VG9rZW4+IHRva2VucykgewogICAgVG9rZW4gZmlyc3QgPSBudWxsOwogICAgaW50IG9mZnNldCA9IC0xOwogICAgaW50IGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIFRva2VuIHRva2VuID0gdG9rZW5zW2ldOwogICAgICBpZiAodG9rZW4gIT0gbnVsbCAmJiAob2Zmc2V0IDwgMCB8fCB0b2tlbi5vZmZzZXQgPCBvZmZzZXQpKSB7CiAgICAgICAgZmlyc3QgPSB0b2tlbjsKICAgICAgICBvZmZzZXQgPSB0b2tlbi5vZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaXJzdDsKICB9Cn0KCi8qKgogKiBUaGUgY2xhc3NlcyAob3IgZ3JvdXBzKSBvZiB0b2tlbnMgd2l0aCBhIHNpbWlsYXIgdXNlLgogKi8KY2xhc3MgVG9rZW5DbGFzcyB7CiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgbm90IHBhcnQgb2YgYW55IHNwZWNpZmljCiAgICogY2xhc3Mgb2YgdG9rZW4uCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgTk9fQ0xBU1MgPSBjb25zdCBUb2tlbkNsYXNzKCdOT19DTEFTUycpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhbiBhZGRpdGl2ZSBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBBRERJVElWRV9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0FERElUSVZFX09QRVJBVE9SJywgQURESVRJVkVfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGFuIGFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQVNTSUdOTUVOVF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0FTU0lHTk1FTlRfT1BFUkFUT1InLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGJpdHdpc2UtYW5kIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIEJJVFdJU0VfQU5EX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQklUV0lTRV9BTkRfT1BFUkFUT1InLCBCSVRXSVNFX0FORF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBiaXR3aXNlLW9yIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIEJJVFdJU0VfT1JfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdCSVRXSVNFX09SX09QRVJBVE9SJywgQklUV0lTRV9PUl9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBiaXR3aXNlLXhvciBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBCSVRXSVNFX1hPUl9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0JJVFdJU0VfWE9SX09QRVJBVE9SJywgQklUV0lTRV9YT1JfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgY2FzY2FkZSBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBDQVNDQURFX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnQ0FTQ0FERV9PUEVSQVRPUicsIENBU0NBREVfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgY29uZGl0aW9uYWwgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgQ09ORElUSU9OQUxfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdDT05ESVRJT05BTF9PUEVSQVRPUicsIENPTkRJVElPTkFMX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhbiBlcXVhbGl0eSBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBFUVVBTElUWV9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0VRVUFMSVRZX09QRVJBVE9SJywgRVFVQUxJVFlfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGFuIGlmLW51bGwgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgSUZfTlVMTF9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ0lGX05VTExfT1BFUkFUT1InLCBJRl9OVUxMX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIGxvZ2ljYWwtYW5kIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIExPR0lDQUxfQU5EX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnTE9HSUNBTF9BTkRfT1BFUkFUT1InLCBMT0dJQ0FMX0FORF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBsb2dpY2FsLW9yIG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIExPR0lDQUxfT1JfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdMT0dJQ0FMX09SX09QRVJBVE9SJywgTE9HSUNBTF9PUl9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSBtdWx0aXBsaWNhdGl2ZSBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBNVUxUSVBMSUNBVElWRV9PUEVSQVRPUiA9CiAgICAgIGNvbnN0IFRva2VuQ2xhc3MoJ01VTFRJUExJQ0FUSVZFX09QRVJBVE9SJywgTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgcmVsYXRpb25hbCBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBSRUxBVElPTkFMX09QRVJBVE9SID0KICAgICAgY29uc3QgVG9rZW5DbGFzcygnUkVMQVRJT05BTF9PUEVSQVRPUicsIFJFTEFUSU9OQUxfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIEEgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0b2tlbiB0eXBlIGlzIGEgc2hpZnQgb3BlcmF0b3IuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuQ2xhc3MgU0hJRlRfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdTSElGVF9PUEVSQVRPUicsIFNISUZUX1BSRUNFREVOQ0UpOwoKICAvKioKICAgKiBBIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdG9rZW4gdHlwZSBpcyBhIHVuYXJ5IG9wZXJhdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlbkNsYXNzIFVOQVJZX1BPU1RGSVhfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdVTkFSWV9QT1NURklYX09QRVJBVE9SJywgUE9TVEZJWF9QUkVDRURFTkNFKTsKCiAgLyoqCiAgICogQSB2YWx1ZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRva2VuIHR5cGUgaXMgYSB1bmFyeSBvcGVyYXRvci4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5DbGFzcyBVTkFSWV9QUkVGSVhfT1BFUkFUT1IgPQogICAgICBjb25zdCBUb2tlbkNsYXNzKCdVTkFSWV9QUkVGSVhfT1BFUkFUT1InLCBQUkVGSVhfUFJFQ0VERU5DRSk7CgogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSB0b2tlbiBjbGFzcy4KICAgKi8KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLyoqCiAgICogVGhlIHByZWNlZGVuY2Ugb2YgdG9rZW5zIG9mIHRoaXMgY2xhc3MsIG9yIGAwYCBpZiB0aGUgc3VjaCB0b2tlbnMgZG8gbm90CiAgICogcmVwcmVzZW50IGFuIG9wZXJhdG9yLgogICAqLwogIGZpbmFsIGludCBwcmVjZWRlbmNlOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjbGFzcyBvZiB0b2tlbnMgdG8gaGF2ZSB0aGUgZ2l2ZW4gW25hbWVdIGFuZAogICAqIFtwcmVjZWRlbmNlXS4KICAgKi8KICBjb25zdCBUb2tlbkNsYXNzKHRoaXMubmFtZSwgW3RoaXMucHJlY2VkZW5jZSA9IE5PX1BSRUNFREVOQ0VdKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbmFtZTsKfQoKLyoqCiAqIFRoZSB0eXBlcyBvZiB0b2tlbnMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIHNjYW5uZXIuCiAqCiAqIENsaWVudHMgbWF5IG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXgtaW4gdGhpcyBjbGFzcy4KICovCmNsYXNzIFRva2VuVHlwZSB7CiAgLyoqCiAgICogVGhlIHR5cGUgb2YgdGhlIHRva2VuIHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgaW5wdXQuCiAgICovCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBFT0YgPQogICAgICBjb25zdCBUb2tlblR5cGUoJycsICdFT0YnLCBOT19QUkVDRURFTkNFLCBFT0ZfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIERPVUJMRSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ2RvdWJsZScsICdET1VCTEUnLCBOT19QUkVDRURFTkNFLCBET1VCTEVfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBIRVhBREVDSU1BTCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ2hleGFkZWNpbWFsJywgJ0hFWEFERUNJTUFMJywgTk9fUFJFQ0VERU5DRSwgSEVYQURFQ0lNQUxfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBJREVOVElGSUVSID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnaWRlbnRpZmllcicsICdJREVOVElGSUVSJywgTk9fUFJFQ0VERU5DRSwgSURFTlRJRklFUl9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIElOVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ2ludCcsICdJTlQnLCBOT19QUkVDRURFTkNFLCBJTlRfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBNVUxUSV9MSU5FX0NPTU1FTlQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdjb21tZW50JywgJ01VTFRJX0xJTkVfQ09NTUVOVCcsIE5PX1BSRUNFREVOQ0UsIENPTU1FTlRfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTQ1JJUFRfVEFHID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCdzY3JpcHQnLCAnU0NSSVBUX1RBRycsIE5PX1BSRUNFREVOQ0UsIFNDUklQVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ2NvbW1lbnQnLCAnU0lOR0xFX0xJTkVfQ09NTUVOVCcsIE5PX1BSRUNFREVOQ0UsIENPTU1FTlRfVE9LRU4sCiAgICAgIHN0cmluZ1ZhbHVlOiBudWxsKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTVFJJTkcgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdzdHJpbmcnLCAnU1RSSU5HJywgTk9fUFJFQ0VERU5DRSwgU1RSSU5HX1RPS0VOLAogICAgICBzdHJpbmdWYWx1ZTogbnVsbCk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQU1QRVJTQU5EID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnJicsICdBTVBFUlNBTkQnLCBCSVRXSVNFX0FORF9QUkVDRURFTkNFLCBBTVBFUlNBTkRfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBTVBFUlNBTkRfQU1QRVJTQU5EID0gY29uc3QgVG9rZW5UeXBlKCcmJicsCiAgICAgICdBTVBFUlNBTkRfQU1QRVJTQU5EJywgTE9HSUNBTF9BTkRfUFJFQ0VERU5DRSwgQU1QRVJTQU5EX0FNUEVSU0FORF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIC8vIFRoaXMgaXMgbm90IHlldCBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBhbmQgbm90IHN1cHBvcnRlZCBieSBmYXN0YQogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQU1QRVJTQU5EX0FNUEVSU0FORF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyYmPScsCiAgICAgICdBTVBFUlNBTkRfQU1QRVJTQU5EX0VRJywKICAgICAgQVNTSUdOTUVOVF9QUkVDRURFTkNFLAogICAgICBBTVBFUlNBTkRfQU1QRVJTQU5EX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBTVBFUlNBTkRfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcmPScsICdBTVBFUlNBTkRfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIEFNUEVSU0FORF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQVQgPQogICAgICBjb25zdCBUb2tlblR5cGUoJ0AnLCAnQVQnLCBOT19QUkVDRURFTkNFLCBBVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFORyA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyEnLCAnQkFORycsIFBSRUZJWF9QUkVDRURFTkNFLCBCQU5HX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQU5HX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnIT0nLCAnQkFOR19FUScsIEVRVUFMSVRZX1BSRUNFREVOQ0UsIEJBTkdfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBTkdfRVFfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICchPT0nLCAnQkFOR19FUV9FUScsIEVRVUFMSVRZX1BSRUNFREVOQ0UsIEJBTkdfRVFfRVFfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBUiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ3wnLCAnQkFSJywgQklUV0lTRV9PUl9QUkVDRURFTkNFLCBCQVJfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQVJfQkFSID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnfHwnLCAnQkFSX0JBUicsIExPR0lDQUxfT1JfUFJFQ0VERU5DRSwgQkFSX0JBUl9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIC8vIFRoaXMgaXMgbm90IHlldCBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBhbmQgbm90IHN1cHBvcnRlZCBieSBmYXN0YQogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFSX0JBUl9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ3x8PScsICdCQVJfQkFSX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBCQVJfQkFSX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBCQVJfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICd8PScsICdCQVJfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIEJBUl9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ09MT04gPQogICAgICBjb25zdCBUb2tlblR5cGUoJzonLCAnQ09MT04nLCBOT19QUkVDRURFTkNFLCBDT0xPTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ09NTUEgPQogICAgICBjb25zdCBUb2tlblR5cGUoJywnLCAnQ09NTUEnLCBOT19QUkVDRURFTkNFLCBDT01NQV9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ0FSRVQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICdeJywgJ0NBUkVUJywgQklUV0lTRV9YT1JfUFJFQ0VERU5DRSwgQ0FSRVRfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBDQVJFVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ149JywgJ0NBUkVUX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBDQVJFVF9FUV9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQ0xPU0VfQ1VSTFlfQlJBQ0tFVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ30nLCAnQ0xPU0VfQ1VSTFlfQlJBQ0tFVCcsIE5PX1BSRUNFREVOQ0UsIENMT1NFX0NVUkxZX0JSQUNLRVRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENMT1NFX1BBUkVOID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCcpJywgJ0NMT1NFX1BBUkVOJywgTk9fUFJFQ0VERU5DRSwgQ0xPU0VfUEFSRU5fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIENMT1NFX1NRVUFSRV9CUkFDS0VUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnXScsICdDTE9TRV9TUVVBUkVfQlJBQ0tFVCcsIE5PX1BSRUNFREVOQ0UsIENMT1NFX1NRVUFSRV9CUkFDS0VUX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBFUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz0nLCAnRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIEVRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBFUV9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz09JywgJ0VRX0VRJywgRVFVQUxJVFlfUFJFQ0VERU5DRSwgRVFfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgLy8vIFRoZSBgPT09YCBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBEYXJ0IGxhbmd1YWdlCiAgLy8vIGJ1dCBpcyBwYXJzZWQgYXMgc3VjaCBieSB0aGUgc2Nhbm5lciB0byBzdXBwb3J0IGJldHRlciByZWNvdmVyeQogIC8vLyB3aGVuIGEgSmF2YVNjcmlwdCBjb2RlIHNuaXBwZXQgaXMgcGFzdGVkIGludG8gYSBEYXJ0IGZpbGUuCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBFUV9FUV9FUSA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnPT09JywgJ0VRX0VRX0VRJywgRVFVQUxJVFlfUFJFQ0VERU5DRSwgRVFfRVFfRVFfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEZVTkNUSU9OID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCc9PicsICdGVU5DVElPTicsIE5PX1BSRUNFREVOQ0UsIEZVTkNUSU9OX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBHVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz4nLCAnR1QnLCBSRUxBVElPTkFMX1BSRUNFREVOQ0UsIEdUX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgR1RfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc+PScsICdHVF9FUScsIFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwgR1RfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBHVF9HVCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz4+JywgJ0dUX0dUJywgU0hJRlRfUFJFQ0VERU5DRSwgR1RfR1RfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBHVF9HVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz4+PScsICdHVF9HVF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgR1RfR1RfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEdUX0dUX0dUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPj4+JywgJ0dUX0dUX0dUJywgU0hJRlRfUFJFQ0VERU5DRSwgR1RfR1RfR1RfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBHVF9HVF9HVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz4+Pj0nLCAnR1RfR1RfR1RfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIEdUX0dUX0dUX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBIQVNIID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCcjJywgJ0hBU0gnLCBOT19QUkVDRURFTkNFLCBIQVNIX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBJTkRFWCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ1tdJywgJ0lOREVYJywgU0VMRUNUT1JfUFJFQ0VERU5DRSwgSU5ERVhfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBJTkRFWF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ1tdPScsICdJTkRFWF9FUScsIE5PX1BSRUNFREVOQ0UsIElOREVYX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTFQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc8JywgJ0xUJywgUkVMQVRJT05BTF9QUkVDRURFTkNFLCBMVF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIExUX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnPD0nLCAnTFRfRVEnLCBSRUxBVElPTkFMX1BSRUNFREVOQ0UsIExUX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTFRfTFQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc8PCcsICdMVF9MVCcsIFNISUZUX1BSRUNFREVOQ0UsIExUX0xUX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgTFRfTFRfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc8PD0nLCAnTFRfTFRfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIExUX0xUX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBNSU5VUyA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy0nLCAnTUlOVVMnLCBBRERJVElWRV9QUkVDRURFTkNFLCBNSU5VU19UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE1JTlVTX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLT0nLCAnTUlOVVNfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIE1JTlVTX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBNSU5VU19NSU5VUyA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy0tJywgJ01JTlVTX01JTlVTJywgUE9TVEZJWF9QUkVDRURFTkNFLCBNSU5VU19NSU5VU19UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgT1BFTl9DVVJMWV9CUkFDS0VUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAneycsICdPUEVOX0NVUkxZX0JSQUNLRVQnLCBOT19QUkVDRURFTkNFLCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE9QRU5fUEFSRU4gPQogICAgICBjb25zdCBUb2tlblR5cGUoJygnLCAnT1BFTl9QQVJFTicsIFNFTEVDVE9SX1BSRUNFREVOQ0UsIE9QRU5fUEFSRU5fVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIE9QRU5fU1FVQVJFX0JSQUNLRVQgPSBjb25zdCBUb2tlblR5cGUoJ1snLAogICAgICAnT1BFTl9TUVVBUkVfQlJBQ0tFVCcsIFNFTEVDVE9SX1BSRUNFREVOQ0UsIE9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBFUkNFTlQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICclJywgJ1BFUkNFTlQnLCBNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFLCBQRVJDRU5UX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlLCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUEVSQ0VOVF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJyU9JywgJ1BFUkNFTlRfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIFBFUkNFTlRfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBFUklPRCA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnLicsICdQRVJJT0QnLCBTRUxFQ1RPUl9QUkVDRURFTkNFLCBQRVJJT0RfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBFUklPRF9QRVJJT0QgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcuLicsICdQRVJJT0RfUEVSSU9EJywgQ0FTQ0FERV9QUkVDRURFTkNFLCBQRVJJT0RfUEVSSU9EX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQTFVTID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnKycsICdQTFVTJywgQURESVRJVkVfUFJFQ0VERU5DRSwgUExVU19UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFBMVVNfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcrPScsICdQTFVTX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBQTFVTX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQTFVTX1BMVVMgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcrKycsICdQTFVTX1BMVVMnLCBQT1NURklYX1BSRUNFREVOQ0UsIFBMVVNfUExVU19UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUVVFU1RJT04gPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc/JywgJ1FVRVNUSU9OJywgQ09ORElUSU9OQUxfUFJFQ0VERU5DRSwgUVVFU1RJT05fVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFFVRVNUSU9OX1BFUklPRCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz8uJywgJ1FVRVNUSU9OX1BFUklPRCcsIFNFTEVDVE9SX1BSRUNFREVOQ0UsIFFVRVNUSU9OX1BFUklPRF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSk7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUVVFU1RJT05fUVVFU1RJT04gPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc/PycsICdRVUVTVElPTl9RVUVTVElPTicsIElGX05VTExfUFJFQ0VERU5DRSwgUVVFU1RJT05fUVVFU1RJT05fVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFFVRVNUSU9OX1FVRVNUSU9OX0VRID0gY29uc3QgVG9rZW5UeXBlKCc/Pz0nLAogICAgICAnUVVFU1RJT05fUVVFU1RJT05fRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIFFVRVNUSU9OX1FVRVNUSU9OX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTRU1JQ09MT04gPQogICAgICBjb25zdCBUb2tlblR5cGUoJzsnLCAnU0VNSUNPTE9OJywgTk9fUFJFQ0VERU5DRSwgU0VNSUNPTE9OX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTTEFTSCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy8nLCAnU0xBU0gnLCBNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFLCBTTEFTSF9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNMQVNIX0VRID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnLz0nLCAnU0xBU0hfRVEnLCBBU1NJR05NRU5UX1BSRUNFREVOQ0UsIFNMQVNIX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTVEFSID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnKicsICdTVEFSJywgTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRSwgU1RBUl9UT0tFTiwKICAgICAgaXNPcGVyYXRvcjogdHJ1ZSwgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFNUQVJfRVEgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICcqPScsICdTVEFSX0VRJywgQVNTSUdOTUVOVF9QUkVDRURFTkNFLCBTVEFSX0VRX1RPS0VOLAogICAgICBpc09wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBTVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9OID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnXCR7JywKICAgICAgJ1NUUklOR19JTlRFUlBPTEFUSU9OX0VYUFJFU1NJT04nLAogICAgICBOT19QUkVDRURFTkNFLAogICAgICBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ1wkJywKICAgICAgJ1NUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVInLAogICAgICBOT19QUkVDRURFTkNFLAogICAgICBTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBUSUxERSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ34nLCAnVElMREUnLCBQUkVGSVhfUFJFQ0VERU5DRSwgVElMREVfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBUSUxERV9TTEFTSCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ34vJywgJ1RJTERFX1NMQVNIJywgTVVMVElQTElDQVRJVkVfUFJFQ0VERU5DRSwgVElMREVfU0xBU0hfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiB0cnVlKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBUSUxERV9TTEFTSF9FUSA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJ34vPScsICdUSUxERV9TTEFTSF9FUScsIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgVElMREVfU0xBU0hfRVFfVE9LRU4sCiAgICAgIGlzT3BlcmF0b3I6IHRydWUpOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBQ0tQSU5HID0KICAgICAgY29uc3QgVG9rZW5UeXBlKCdgJywgJ0JBQ0tQSU5HJywgTk9fUFJFQ0VERU5DRSwgQkFDS1BJTkdfVE9LRU4pOwoKICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIEJBQ0tTTEFTSCA9CiAgICAgIGNvbnN0IFRva2VuVHlwZSgnXFwnLCAnQkFDS1NMQVNIJywgTk9fUFJFQ0VERU5DRSwgQkFDS1NMQVNIX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQRVJJT0RfUEVSSU9EX1BFUklPRCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy4uLicsICdQRVJJT0RfUEVSSU9EX1BFUklPRCcsIE5PX1BSRUNFREVOQ0UsIFBFUklPRF9QRVJJT0RfUEVSSU9EX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBQRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTiA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJy4uLj8nLAogICAgICAnUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT04nLAogICAgICBOT19QUkVDRURFTkNFLAogICAgICBQRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTl9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVQgPSBjb25zdCBUb2tlblR5cGUoCiAgICAgICc/LlsnLAogICAgICAnUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVQnLAogICAgICBTRUxFQ1RPUl9QUkVDRURFTkNFLAogICAgICBRVUVTVElPTl9QRVJJT0RfT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTik7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgUVVFU1RJT05fUEVSSU9EX1BFUklPRCA9IGNvbnN0IFRva2VuVHlwZSgKICAgICAgJz8uLicsCiAgICAgICdRVUVTVElPTl9QRVJJT0RfUEVSSU9EJywKICAgICAgQ0FTQ0FERV9QUkVDRURFTkNFLAogICAgICBRVUVTVElPTl9QRVJJT0RfUEVSSU9EX1RPS0VOKTsKCiAgc3RhdGljIGNvbnN0IFRva2VuVHlwZSBBUyA9IEtleXdvcmQuQVM7CgogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgSVMgPSBLZXl3b3JkLklTOwoKICAvKioKICAgKiBUb2tlbiB0eXBlIHVzZWQgYnkgZXJyb3IgdG9rZW5zLgogICAqLwogIHN0YXRpYyBjb25zdCBUb2tlblR5cGUgQkFEX0lOUFVUID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAnbWFsZm9ybWVkIGlucHV0JywgJ0JBRF9JTlBVVCcsIE5PX1BSRUNFREVOQ0UsIEJBRF9JTlBVVF9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICAvKioKICAgKiBUb2tlbiB0eXBlIHVzZWQgYnkgc3ludGhldGljIHRva2VucyB0aGF0IGFyZSBjcmVhdGVkIGR1cmluZyBwYXJzZXIKICAgKiByZWNvdmVyeSAobm9uLWFuYWx5emVyIHVzZSBjYXNlKS4KICAgKi8KICBzdGF0aWMgY29uc3QgVG9rZW5UeXBlIFJFQ09WRVJZID0gY29uc3QgVG9rZW5UeXBlKAogICAgICAncmVjb3ZlcnknLCAnUkVDT1ZFUlknLCBOT19QUkVDRURFTkNFLCBSRUNPVkVSWV9UT0tFTiwKICAgICAgc3RyaW5nVmFsdWU6IG51bGwpOwoKICAvLyBUT0RPKGRhbnJ1YmVsKTogImFsbCIgaXMgbWlzbGVhZGluZwogIC8vIGJlY2F1c2UgdGhpcyBsaXN0IGRvZXMgbm90IGluY2x1ZGUgYWxsIFRva2VuVHlwZSBpbnN0YW5jZXMuCiAgc3RhdGljIGNvbnN0IExpc3Q8VG9rZW5UeXBlPiBhbGwgPSBjb25zdCA8VG9rZW5UeXBlPlsKICAgIFRva2VuVHlwZS5FT0YsCiAgICBUb2tlblR5cGUuRE9VQkxFLAogICAgVG9rZW5UeXBlLkhFWEFERUNJTUFMLAogICAgVG9rZW5UeXBlLklERU5USUZJRVIsCiAgICBUb2tlblR5cGUuSU5ULAogICAgVG9rZW5UeXBlLk1VTFRJX0xJTkVfQ09NTUVOVCwKICAgIFRva2VuVHlwZS5TQ1JJUFRfVEFHLAogICAgVG9rZW5UeXBlLlNJTkdMRV9MSU5FX0NPTU1FTlQsCiAgICBUb2tlblR5cGUuU1RSSU5HLAogICAgVG9rZW5UeXBlLkFNUEVSU0FORCwKICAgIFRva2VuVHlwZS5BTVBFUlNBTkRfQU1QRVJTQU5ELAogICAgVG9rZW5UeXBlLkFNUEVSU0FORF9FUSwKICAgIFRva2VuVHlwZS5BVCwKICAgIFRva2VuVHlwZS5CQU5HLAogICAgVG9rZW5UeXBlLkJBTkdfRVEsCiAgICBUb2tlblR5cGUuQkFSLAogICAgVG9rZW5UeXBlLkJBUl9CQVIsCiAgICBUb2tlblR5cGUuQkFSX0VRLAogICAgVG9rZW5UeXBlLkNPTE9OLAogICAgVG9rZW5UeXBlLkNPTU1BLAogICAgVG9rZW5UeXBlLkNBUkVULAogICAgVG9rZW5UeXBlLkNBUkVUX0VRLAogICAgVG9rZW5UeXBlLkNMT1NFX0NVUkxZX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuQ0xPU0VfUEFSRU4sCiAgICBUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuRVEsCiAgICBUb2tlblR5cGUuRVFfRVEsCiAgICBUb2tlblR5cGUuRlVOQ1RJT04sCiAgICBUb2tlblR5cGUuR1QsCiAgICBUb2tlblR5cGUuR1RfRVEsCiAgICBUb2tlblR5cGUuR1RfR1QsCiAgICBUb2tlblR5cGUuR1RfR1RfRVEsCiAgICBUb2tlblR5cGUuSEFTSCwKICAgIFRva2VuVHlwZS5JTkRFWCwKICAgIFRva2VuVHlwZS5JTkRFWF9FUSwKICAgIFRva2VuVHlwZS5MVCwKICAgIFRva2VuVHlwZS5MVF9FUSwKICAgIFRva2VuVHlwZS5MVF9MVCwKICAgIFRva2VuVHlwZS5MVF9MVF9FUSwKICAgIFRva2VuVHlwZS5NSU5VUywKICAgIFRva2VuVHlwZS5NSU5VU19FUSwKICAgIFRva2VuVHlwZS5NSU5VU19NSU5VUywKICAgIFRva2VuVHlwZS5PUEVOX0NVUkxZX0JSQUNLRVQsCiAgICBUb2tlblR5cGUuT1BFTl9QQVJFTiwKICAgIFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VULAogICAgVG9rZW5UeXBlLlBFUkNFTlQsCiAgICBUb2tlblR5cGUuUEVSQ0VOVF9FUSwKICAgIFRva2VuVHlwZS5QRVJJT0QsCiAgICBUb2tlblR5cGUuUEVSSU9EX1BFUklPRCwKICAgIFRva2VuVHlwZS5QTFVTLAogICAgVG9rZW5UeXBlLlBMVVNfRVEsCiAgICBUb2tlblR5cGUuUExVU19QTFVTLAogICAgVG9rZW5UeXBlLlFVRVNUSU9OLAogICAgVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRCwKICAgIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTiwKICAgIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTl9FUSwKICAgIFRva2VuVHlwZS5TRU1JQ09MT04sCiAgICBUb2tlblR5cGUuU0xBU0gsCiAgICBUb2tlblR5cGUuU0xBU0hfRVEsCiAgICBUb2tlblR5cGUuU1RBUiwKICAgIFRva2VuVHlwZS5TVEFSX0VRLAogICAgVG9rZW5UeXBlLlNUUklOR19JTlRFUlBPTEFUSU9OX0VYUFJFU1NJT04sCiAgICBUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUiwKICAgIFRva2VuVHlwZS5USUxERSwKICAgIFRva2VuVHlwZS5USUxERV9TTEFTSCwKICAgIFRva2VuVHlwZS5USUxERV9TTEFTSF9FUSwKICAgIFRva2VuVHlwZS5CQUNLUElORywKICAgIFRva2VuVHlwZS5CQUNLU0xBU0gsCiAgICBUb2tlblR5cGUuUEVSSU9EX1BFUklPRF9QRVJJT0QsCiAgICBUb2tlblR5cGUuUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT04sCgogICAgLy8gVE9ETyhkYW5ydWJlbCk6IFNob3VsZCB0aGVzZSBiZSBhZGRlZCB0byB0aGUgImFsbCIgbGlzdD8KICAgIC8vVG9rZW5UeXBlLklTLAogICAgLy9Ub2tlblR5cGUuQVMsCgogICAgLy8gVGhlc2UgYXJlIG5vdCB5ZXQgcGFydCBvZiB0aGUgbGFuZ3VhZ2UgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgZmFzdGEKICAgIC8vVG9rZW5UeXBlLkFNUEVSU0FORF9BTVBFUlNBTkRfRVEsCiAgICAvL1Rva2VuVHlwZS5CQVJfQkFSX0VRLAoKICAgIC8vIFN1cHBvcnRlZCBieSBmYXN0YSBidXQgbm90IHBhcnQgb2YgdGhlIGxhbmd1YWdlCiAgICAvL1Rva2VuVHlwZS5CQU5HX0VRX0VRLAogICAgLy9Ub2tlblR5cGUuRVFfRVFfRVEsCgogICAgLy8gVXNlZCBieSBzeW50aGV0aWMgdG9rZW5zIGdlbmVyYXRlZCBkdXJpbmcgcmVjb3ZlcnkKICAgIC8vVG9rZW5UeXBlLkJBRF9JTlBVVCwKICAgIC8vVG9rZW5UeXBlLlJFQ09WRVJZLAogIF07CgogIGZpbmFsIGludCBraW5kOwoKICAvKioKICAgKiBgdHJ1ZWAgaWYgdGhpcyB0b2tlbiB0eXBlIHJlcHJlc2VudHMgYSBtb2RpZmllcgogICAqIHN1Y2ggYXMgYGFic3RyYWN0YCBvciBgY29uc3RgLgogICAqLwogIGZpbmFsIGJvb2wgaXNNb2RpZmllcjsKCiAgLyoqCiAgICogYHRydWVgIGlmIHRoaXMgdG9rZW4gdHlwZSByZXByZXNlbnRzIGFuIG9wZXJhdG9yLgogICAqLwogIGZpbmFsIGJvb2wgaXNPcGVyYXRvcjsKCiAgLyoqCiAgICogYHRydWVgIGlmIHRoaXMgdG9rZW4gdHlwZSByZXByZXNlbnRzIGEga2V5d29yZCBzdGFydGluZyBhIHRvcCBsZXZlbAogICAqIGRlY2xhcmF0aW9uIHN1Y2ggYXMgYGNsYXNzYCwgYGVudW1gLCBgaW1wb3J0YCwgZXRjLgogICAqLwogIGZpbmFsIGJvb2wgaXNUb3BMZXZlbEtleXdvcmQ7CgogIC8qKgogICAqIGB0cnVlYCBpZiB0aGlzIHRva2VuIHR5cGUgcmVwcmVzZW50cyBhbiBvcGVyYXRvcgogICAqIHRoYXQgY2FuIGJlIGRlZmluZWQgYnkgdXNlcnMuCiAgICovCiAgZmluYWwgYm9vbCBpc1VzZXJEZWZpbmFibGVPcGVyYXRvcjsKCiAgLyoqCiAgICogVGhlIGxleGVtZSB0aGF0IGRlZmluZXMgdGhpcyB0eXBlIG9mIHRva2VuLAogICAqIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIGxleGVtZSBmb3IgdGhpcyB0eXBlIG9mIHRva2VuLgogICAqLwogIGZpbmFsIFN0cmluZyBsZXhlbWU7CgogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSB0b2tlbiB0eXBlLgogICAqLwogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvKioKICAgKiBUaGUgcHJlY2VkZW5jZSBvZiB0aGlzIHR5cGUgb2YgdG9rZW4sCiAgICogb3IgYDBgIGlmIHRoZSB0b2tlbiBkb2VzIG5vdCByZXByZXNlbnQgYW4gb3BlcmF0b3IuCiAgICovCiAgZmluYWwgaW50IHByZWNlZGVuY2U7CgogIC8qKgogICAqIFNlZSBbVG9rZW4uc3RyaW5nVmFsdWVdIGZvciBhbiBleHBsYW5hdGlvbi4KICAgKi8KICBmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWU7CgogIGNvbnN0IFRva2VuVHlwZSh0aGlzLmxleGVtZSwgdGhpcy5uYW1lLCB0aGlzLnByZWNlZGVuY2UsIHRoaXMua2luZCwKICAgICAge3RoaXMuaXNNb2RpZmllcjogZmFsc2UsCiAgICAgIHRoaXMuaXNPcGVyYXRvcjogZmFsc2UsCiAgICAgIHRoaXMuaXNUb3BMZXZlbEtleXdvcmQ6IGZhbHNlLAogICAgICB0aGlzLmlzVXNlckRlZmluYWJsZU9wZXJhdG9yOiBmYWxzZSwKICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlOiAndW5zcGVjaWZpZWQnfSkKICAgICAgOiB0aGlzLnN0cmluZ1ZhbHVlID0gc3RyaW5nVmFsdWUgPT0gJ3Vuc3BlY2lmaWVkJyA/IGxleGVtZSA6IHN0cmluZ1ZhbHVlOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGFkZGl0aXZlIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzQWRkaXRpdmVPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IEFERElUSVZFX1BSRUNFREVOQ0U7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc0Fzc2lnbm1lbnRPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IEFTU0lHTk1FTlRfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhbiBhc3NvY2lhdGl2ZSBvcGVyYXRvci4gQW4KICAgKiBhc3NvY2lhdGl2ZSBvcGVyYXRvciBpcyBhbiBvcGVyYXRvciBmb3Igd2hpY2ggdGhlIGZvbGxvd2luZyBlcXVhbGl0eSBpcwogICAqIHRydWU6IGAoYSAqIGIpICogYyA9PSBhICogKGIgKiBjKWAuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgcmVzdWx0IG9mCiAgICogYXBwbHlpbmcgdGhlIG9wZXJhdG9yIHRvIG11bHRpcGxlIG9wZXJhbmRzIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4KICAgKiB3aGljaCB0aG9zZSBhcHBsaWNhdGlvbnMgb2NjdXIuCiAgICoKICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBjb25zaWRlcnMgdGhlIGxvZ2ljYWwtYW5kIGFuZCBsb2dpY2FsLW9yIG9wZXJhdG9ycyB0byBiZQogICAqIGFzc29jaWF0aXZlLCBldmVuIHRob3VnaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG9mIHRob3NlCiAgICogb3BlcmF0b3JzIGNhbiBoYXZlIGFuIGVmZmVjdCBiZWNhdXNlIGV2YWx1YXRpb24gb2YgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZAogICAqIGlzIGNvbmRpdGlvbmFsLgogICAqLwogIGJvb2wgZ2V0IGlzQXNzb2NpYXRpdmVPcGVyYXRvciA9PgogICAgICB0aGlzID09IFRva2VuVHlwZS5BTVBFUlNBTkQgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuQU1QRVJTQU5EX0FNUEVSU0FORCB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5CQVIgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuQkFSX0JBUiB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5DQVJFVCB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5QTFVTIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLlNUQVI7CgogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleXdvcmQgaXMgYSAiYnVpbHQtaW4iIGlkZW50aWZpZXIuCiAgICovCiAgYm9vbCBnZXQgaXNCdWlsdEluID0+IGZhbHNlOwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGVxdWFsaXR5IG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzRXF1YWxpdHlPcGVyYXRvciA9PgogICAgICB0aGlzID09IFRva2VuVHlwZS5CQU5HX0VRIHx8IHRoaXMgPT0gVG9rZW5UeXBlLkVRX0VROwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGFuIGluY3JlbWVudCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc0luY3JlbWVudE9wZXJhdG9yID0+CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLlBMVVNfUExVUyB8fCB0aGlzID09IFRva2VuVHlwZS5NSU5VU19NSU5VUzsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gaXMgYSBrZXl3b3JkLgogICAqLwogIGJvb2wgZ2V0IGlzS2V5d29yZCA9PiBraW5kID09IEtFWVdPUkRfVE9LRU47CgogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGtleXdvcmQgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllcgogICAqIGluIHNvbWUgc2l0dWF0aW9ucy4KICAgKi8KICBib29sIGdldCBpc1BzZXVkbyA9PiBmYWxzZTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzTXVsdGlwbGljYXRpdmVPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IE1VTFRJUExJQ0FUSVZFX1BSRUNFREVOQ0U7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYSByZWxhdGlvbmFsIG9wZXJhdG9yLgogICAqLwogIGJvb2wgZ2V0IGlzUmVsYXRpb25hbE9wZXJhdG9yID0+CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkxUIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkxUX0VRIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkdUIHx8CiAgICAgIHRoaXMgPT0gVG9rZW5UeXBlLkdUX0VROwoKICAvKioKICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBvZiB0b2tlbiByZXByZXNlbnRzIGEgc2hpZnQgb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNTaGlmdE9wZXJhdG9yID0+IHByZWNlZGVuY2UgPT0gU0hJRlRfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIHVuYXJ5IHBvc3RmaXggb3BlcmF0b3IuCiAgICovCiAgYm9vbCBnZXQgaXNVbmFyeVBvc3RmaXhPcGVyYXRvciA9PiBwcmVjZWRlbmNlID09IFBPU1RGSVhfUFJFQ0VERU5DRTsKCiAgLyoqCiAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgb2YgdG9rZW4gcmVwcmVzZW50cyBhIHVuYXJ5IHByZWZpeCBvcGVyYXRvci4KICAgKi8KICBib29sIGdldCBpc1VuYXJ5UHJlZml4T3BlcmF0b3IgPT4KICAgICAgcHJlY2VkZW5jZSA9PSBQUkVGSVhfUFJFQ0VERU5DRSB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5NSU5VUyB8fAogICAgICB0aGlzID09IFRva2VuVHlwZS5QTFVTX1BMVVMgfHwKICAgICAgdGhpcyA9PSBUb2tlblR5cGUuTUlOVVNfTUlOVVM7CgogIC8qKgogICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIG9mIHRva2VuIHJlcHJlc2VudHMgYSBzZWxlY3RvciBvcGVyYXRvcgogICAqIChzdGFydGluZyB0b2tlbiBvZiBhIHNlbGVjdG9yKS4KICAgKi8KICBib29sIGdldCBpc1NlbGVjdG9yT3BlcmF0b3IgPT4gcHJlY2VkZW5jZSA9PSBTRUxFQ1RPUl9QUkVDRURFTkNFOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwoKICAvKioKICAgKiBVc2UgW2xleGVtZV0gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZAogICAqLwogIEBkZXByZWNhdGVkCiAgU3RyaW5nIGdldCB2YWx1ZSA9PiBsZXhlbWU7Cn0KhssATk48AQRQMgQaASggHwEdJSImIiUmIyUlJychJCoiIyQBBElBBCcGLwYSAQZMDwZKMCMwKDFBPAQBDFEBDCIBBjMGHhYEAgEEIwQpBisGFgEGTzMGOSQBDEEBBi4FRQYSHDQhDTAnBgQCAQQiBDcGTzMGRiQBDE4CAQQyAzsEIiJQATY7AUMBUAFQAUABPQFAAR9AAR85AUkB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QVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb29sQ29uc3RhbnQsCiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdGFudCwKICAgICAgICBDb25zdGFudE1hcEVudHJ5LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIERvdWJsZUNvbnN0YW50LAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBJbnN0YW5jZUNvbnN0YW50LAogICAgICAgIEludENvbnN0YW50LAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaXN0Q29uc3RhbnQsCiAgICAgICAgTWFwQ29uc3RhbnQsCiAgICAgICAgTmV2ZXJUeXBlLAogICAgICAgIE51bGxDb25zdGFudCwKICAgICAgICBOdWxsYWJpbGl0eSwKICAgICAgICBQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50LAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTZXRDb25zdGFudCwKICAgICAgICBTdHJpbmdDb25zdGFudCwKICAgICAgICBTeW1ib2xDb25zdGFudCwKICAgICAgICBUZWFyT2ZmQ29uc3RhbnQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVHlwZUxpdGVyYWxDb25zdGFudCwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFVuZXZhbHVhdGVkQ29uc3RhbnQsCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3Zpc2l0b3IuZGFydCcgc2hvdyBDb25zdGFudFZpc2l0b3IsIERhcnRUeXBlVmlzaXRvcjsKCmltcG9ydCAnLi4vYmxhY2tsaXN0ZWRfY2xhc3Nlcy5kYXJ0JyBzaG93IGJsYWNrbGlzdGVkQ29yZUNsYXNzZXM7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93IE1lc3NhZ2UsIHRlbXBsYXRlVHlwZU9yaWdpbiwgdGVtcGxhdGVUeXBlT3JpZ2luV2l0aEZpbGVVcmk7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5zdXBwb3J0ZWQ7CgovLy8gQSBwcmV0dHktcHJpbnRlciBmb3IgS2VybmVsIHR5cGVzIGFuZCBjb25zdGFudHMgd2l0aCB0aGUgYWJpbGl0eSB0byBsYWJlbAovLy8gcmF3IHR5cGVzIHdpdGggbnVtZXJpYyBtYXJrZXJzIGluIERhcnQgY29tbWVudHMgKGUuZy4gYC8qMSovYCkgdG8KLy8vIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCB0eXBlcyB3aXRoIHRoZSBzYW1lIG5hbWUuIFRoaXMgaXMgdXNlZCBpbiBkaWFnbm9zdGljCi8vLyBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgb3JpZ2lucyBvZiB0eXBlcyBvY2N1cnJpbmcgaW4gdGhlIG1lc3NhZ2UuCmNsYXNzIFR5cGVMYWJlbGVyIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPHZvaWQ+LCBDb25zdGFudFZpc2l0b3I8dm9pZD4gewogIGZpbmFsIExpc3Q8TGFiZWxlZE5vZGU+IG5hbWVzID0gPExhYmVsZWROb2RlPltdOwogIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8TGFiZWxlZE5vZGU+PiBuYW1lTWFwID0gPFN0cmluZywgTGlzdDxMYWJlbGVkTm9kZT4+e307CiAgZmluYWwgYm9vbCBwcmludE51bGxhYmlsaXR5OwoKICBMaXN0PE9iamVjdD4gcmVzdWx0OwoKICBUeXBlTGFiZWxlcih0aGlzLnByaW50TnVsbGFiaWxpdHkpOwoKICAvLy8gUHJldHR5LXByaW50IGEgdHlwZS4KICAvLy8gV2hlbiBhbGwgdHlwZXMgYW5kIGNvbnN0YW50cyBhcHBlYXJpbmcgaW4gdGhlIHNhbWUgbWVzc2FnZSBoYXZlIGJlZW4KICAvLy8gcHJldHR5LXByaW50ZWQsIHRoZSByZXR1cm5lZCBsaXN0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gaXRzIHN0cmluZwogIC8vLyByZXByZXNlbnRhdGlvbiAod2l0aCBsYWJlbHMgb24gZHVwbGljYXRlZCBuYW1lcykgYnkgdGhlIGBqb2luKClgIG1ldGhvZC4KICBMaXN0PE9iamVjdD4gbGFiZWxUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogUmVtb3ZlIG51bGwgY2hlY2sgd2hlbiB3ZSBhcmUgY29tcGxldGVseSBudWxsIGNsZWFuIGhlcmUuCiAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gWyJudWxsLXR5cGUiXTsKICAgIHJlc3VsdCA9IFtdOwogICAgdHlwZS5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFByZXR0eS1wcmludCBhIGNvbnN0YW50LgogIC8vLyBXaGVuIGFsbCB0eXBlcyBhbmQgY29uc3RhbnRzIGFwcGVhcmluZyBpbiB0aGUgc2FtZSBtZXNzYWdlIGhhdmUgYmVlbgogIC8vLyBwcmV0dHktcHJpbnRlZCwgdGhlIHJldHVybmVkIGxpc3QgY2FuIGJlIGNvbnZlcnRlZCB0byBpdHMgc3RyaW5nCiAgLy8vIHJlcHJlc2VudGF0aW9uICh3aXRoIGxhYmVscyBvbiBkdXBsaWNhdGVkIG5hbWVzKSBieSB0aGUgYGpvaW4oKWAgbWV0aG9kLgogIExpc3Q8T2JqZWN0PiBsYWJlbENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50KSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IFJlbW92ZSBudWxsIGNoZWNrIHdoZW4gd2UgYXJlIGNvbXBsZXRlbHkgbnVsbCBjbGVhbiBoZXJlLgogICAgaWYgKGNvbnN0YW50ID09IG51bGwpIHJldHVybiBbIm51bGwtY29uc3RhbnQiXTsKICAgIHJlc3VsdCA9IFtdOwogICAgY29uc3RhbnQuYWNjZXB0KHRoaXMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBHZXQgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBvcmlnaW5zIG9mIHRoZSByYXcgdHlwZXMgYXBwZWFyaW5nIGluCiAgLy8vIHR5cGVzIGFuZCBjb25zdGFudHMgdGhhdCBoYXZlIGJlZW4gcHJldHR5LXByaW50ZWQgdXNpbmcgdGhpcyBsYWJlbGVyLgogIFN0cmluZyBnZXQgb3JpZ2luTWVzc2FnZXMgewogICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChMYWJlbGVkTm9kZSBuYW1lIGluIG5hbWVzKSB7CiAgICAgIG1lc3NhZ2VzLndyaXRlKG5hbWUub3JpZ2luTWVzc2FnZSk7CiAgICB9CiAgICByZXR1cm4gbWVzc2FnZXMudG9TdHJpbmcoKTsKICB9CgogIC8vIFdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIGNvcmVUeXBlcyBoZXJlLCBzbyB3ZSBoYXZlIG91ciBvd24gT2JqZWN0IGNoZWNrLgogIHN0YXRpYyBib29sIGlzT2JqZWN0KERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZS5jbGFzc05vZGUubmFtZSA9PSAnT2JqZWN0JykgewogICAgICBVcmkgaW1wb3J0VXJpID0gdHlwZS5jbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk7CiAgICAgIHJldHVybiBpbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JyAmJiBpbXBvcnRVcmkucGF0aCA9PSAnY29yZSc7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBMYWJlbGVkTm9kZSBuYW1lRm9yRW50aXR5KAogICAgICBUcmVlTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUsIFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpKSB7CiAgICBMaXN0PExhYmVsZWROb2RlPiBsYWJlbHNGb3JOYW1lID0gbmFtZU1hcFtub2RlTmFtZV07CiAgICBpZiAobGFiZWxzRm9yTmFtZSA9PSBudWxsKSB7CiAgICAgIC8vIEZpcnN0IGVuY291bnRlcmVkIGVudGl0eSB3aXRoIHRoaXMgbmFtZQogICAgICBMYWJlbGVkTm9kZSBuYW1lID0KICAgICAgICAgIG5ldyBMYWJlbGVkTm9kZShub2RlLCBub2RlTmFtZSwgaW1wb3J0VXJpLCBmaWxlVXJpLCB0aGlzKTsKICAgICAgbmFtZXMuYWRkKG5hbWUpOwogICAgICBuYW1lTWFwW25vZGVOYW1lXSA9IFtuYW1lXTsKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9IGVsc2UgewogICAgICBmb3IgKExhYmVsZWROb2RlIGVudGl0eUZvck5hbWUgaW4gbGFiZWxzRm9yTmFtZSkgewogICAgICAgIGlmIChlbnRpdHlGb3JOYW1lLm5vZGUgPT0gbm9kZSkgewogICAgICAgICAgLy8gUHJldmlvdXNseSBlbmNvdW50ZXJlZCBlbnRpdHkKICAgICAgICAgIHJldHVybiBlbnRpdHlGb3JOYW1lOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBOZXcgZW50aXR5IHdpdGggbmFtZSB0aGF0IHdhcyBwcmV2aW91c2x5IGVuY291bnRlcmVkCiAgICAgIExhYmVsZWROb2RlIG5hbWUgPQogICAgICAgICAgbmV3IExhYmVsZWROb2RlKG5vZGUsIG5vZGVOYW1lLCBpbXBvcnRVcmksIGZpbGVVcmksIHRoaXMpOwogICAgICBuYW1lcy5hZGQobmFtZSk7CiAgICAgIGxhYmVsc0Zvck5hbWUuYWRkKG5hbWUpOwogICAgICByZXR1cm4gbmFtZTsKICAgIH0KICB9CgogIHZvaWQgYWRkTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIGlmIChwcmludE51bGxhYmlsaXR5KSB7CiAgICAgIGlmIChudWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgICAgIHJlc3VsdC5hZGQoIj8iKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgdHlwZSkge30KICB2b2lkIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkge30KCiAgdm9pZCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogVGhyb3cgaW50ZXJuYWwgZXJyb3IgaWYgSW52YWxpZFR5cGUgYXBwZWFycyBpbiBkaWFnbm9zdGljcy4KICAgIHJlc3VsdC5hZGQoImludmFsaWQtdHlwZSIpOwogIH0KCiAgdm9pZCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IFRocm93IGludGVybmFsIGVycm9yIGlmIEJvdHRvbVR5cGUgYXBwZWFycyBpbiBkaWFnbm9zdGljcy4KICAgIHJlc3VsdC5hZGQoImJvdHRvbS10eXBlIik7CiAgfQoKICB2b2lkIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSBub2RlKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IENvbnNpZGVyIHRocm93aW5nIGludGVybmFsIGVycm9yIGlmIE5ldmVyVHlwZSBhcHBlYXJzIGluCiAgICAvLyAgZGlhZ25vc3RpY3MuCiAgICByZXN1bHQuYWRkKCJOZXZlciIpOwogIH0KCiAgdm9pZCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpIHsKICAgIHJlc3VsdC5hZGQoImR5bmFtaWMiKTsKICB9CgogIHZvaWQgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICByZXN1bHQuYWRkKCJ2b2lkIik7CiAgfQoKICB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgVHJlZU5vZGUgcGFyZW50ID0gbm9kZS5wYXJhbWV0ZXI7CiAgICB3aGlsZSAocGFyZW50IGlzISBMaWJyYXJ5ICYmIHBhcmVudCAhPSBudWxsKSB7CiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICB9CiAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgbnVsbCBpZiwgZm9yIGluc3RhbmNlLCB0aGUgZXJyb25lb3VzIGNvZGUgaXMgbm90CiAgICAvLyBhY3R1YWxseSBpbiB0aGUgdHJlZSAtIHRoZW4gd2UgZG9uJ3Qga25vdyB3aGVyZSBpdCBjb21lcyBmcm9tIQogICAgTGlicmFyeSBlbmNsb3NpbmdMaWJyYXJ5ID0gcGFyZW50OwoKICAgIHJlc3VsdC5hZGQobmFtZUZvckVudGl0eSgKICAgICAgICBub2RlLnBhcmFtZXRlciwKICAgICAgICBub2RlLnBhcmFtZXRlci5uYW1lLAogICAgICAgIGVuY2xvc2luZ0xpYnJhcnkgPT0gbnVsbCA/IHVua25vd25VcmkgOiBlbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSwKICAgICAgICBlbmNsb3NpbmdMaWJyYXJ5ID09IG51bGwgPyB1bmtub3duVXJpIDogZW5jbG9zaW5nTGlicmFyeS5maWxlVXJpKSk7CiAgICBhZGROdWxsYWJpbGl0eShub2RlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkpOwogIH0KCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKICAgIHJlc3VsdC5hZGQoIiBGdW5jdGlvbiIpOwogICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICByZXN1bHQuYWRkKCI8Iik7CiAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgcGFyYW0gaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgICAgcmVzdWx0LmFkZChwYXJhbS5uYW1lKTsKICAgICAgICBpZiAoaXNPYmplY3QocGFyYW0uYm91bmQpICYmIHBhcmFtLmRlZmF1bHRUeXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgICAvLyBCb3VuZCB3YXMgbm90IHNwZWNpZmllZCwgYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGJlIHByaW50ZWQuCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5hZGQoIiBleHRlbmRzICIpOwogICAgICAgICAgcGFyYW0uYm91bmQuYWNjZXB0KHRoaXMpOwogICAgICAgIH0KICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIHJlc3VsdC5hZGQoIj4iKTsKICAgIH0KICAgIHJlc3VsdC5hZGQoIigiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLmFjY2VwdCh0aGlzKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGlmIChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+IG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICBpZiAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID4gMCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgcmVzdWx0LmFkZCgiWyIpOwogICAgICBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoaW50IGkgPSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQ7CiAgICAgICAgICBpIDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgICAgICBpKyspIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uYWNjZXB0KHRoaXMpOwogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCgiXSIpOwogICAgfQogICAgaWYgKG5vZGUubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgcmVzdWx0LmFkZCgieyIpOwogICAgICBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWZpcnN0KSByZXN1bHQuYWRkKCIsICIpOwogICAgICAgIG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUuYWNjZXB0KHRoaXMpOwogICAgICAgIHJlc3VsdC5hZGQoIiAke25vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWV9Iik7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICByZXN1bHQuYWRkKCJ9Iik7CiAgICB9CiAgICByZXN1bHQuYWRkKCIpIik7CiAgICBhZGROdWxsYWJpbGl0eShub2RlLm51bGxhYmlsaXR5KTsKICB9CgogIHZvaWQgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgQ2xhc3MgY2xhc3NOb2RlID0gbm9kZS5jbGFzc05vZGU7CiAgICByZXN1bHQuYWRkKG5hbWVGb3JFbnRpdHkoCiAgICAgICAgY2xhc3NOb2RlLAogICAgICAgIGNsYXNzTm9kZS5uYW1lLAogICAgICAgIGNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaSwKICAgICAgICBjbGFzc05vZGUuZW5jbG9zaW5nTGlicmFyeS5maWxlVXJpKSk7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgcmVzdWx0LmFkZCgiPCIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJnIGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgICAgdHlwZUFyZy5hY2NlcHQodGhpcyk7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICByZXN1bHQuYWRkKCI+Iik7CiAgICB9CiAgICBhZGROdWxsYWJpbGl0eShub2RlLm51bGxhYmlsaXR5KTsKICB9CgogIHZvaWQgZGVmYXVsdENvbnN0YW50KENvbnN0YW50IG5vZGUpIHt9CgogIHZvaWQgdmlzaXROdWxsQ29uc3RhbnQoTnVsbENvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQobm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQobm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0RG91YmxlQ29uc3RhbnQoRG91YmxlQ29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZChub2RlKTsKICB9CgogIHZvaWQgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKG5vZGUpOwogIH0KCiAgdm9pZCB2aXNpdFN0cmluZ0NvbnN0YW50KFN0cmluZ0NvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQoanNvbi5lbmNvZGUobm9kZS52YWx1ZSkpOwogIH0KCiAgdm9pZCB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICBuZXcgSW50ZXJmYWNlVHlwZShub2RlLmNsYXNzTm9kZSwgTnVsbGFiaWxpdHkubGVnYWN5LCBub2RlLnR5cGVBcmd1bWVudHMpCiAgICAgICAgLmFjY2VwdCh0aGlzKTsKICAgIHJlc3VsdC5hZGQoIiB7Iik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoRmllbGQgZmllbGQgaW4gbm9kZS5jbGFzc05vZGUuZmllbGRzKSB7CiAgICAgIGlmIChmaWVsZC5pc1N0YXRpYykgY29udGludWU7CiAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgIHJlc3VsdC5hZGQoIiR7ZmllbGQubmFtZX06ICIpOwogICAgICBub2RlLmZpZWxkVmFsdWVzW2ZpZWxkLnJlZmVyZW5jZV0uYWNjZXB0KHRoaXMpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgcmVzdWx0LmFkZCgifSIpOwogIH0KCiAgdm9pZCB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgewogICAgcmVzdWx0LmFkZCgiPCIpOwogICAgbm9kZS50eXBlQXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiPlsiKTsKICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgZm9yIChDb25zdGFudCBjb25zdGFudCBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgY29uc3RhbnQuYWNjZXB0KHRoaXMpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgcmVzdWx0LmFkZCgiXSIpOwogIH0KCiAgdm9pZCB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpIHsKICAgIHJlc3VsdC5hZGQoIjwiKTsKICAgIG5vZGUudHlwZUFyZ3VtZW50LmFjY2VwdCh0aGlzKTsKICAgIHJlc3VsdC5hZGQoIj57Iik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoQ29uc3RhbnQgY29uc3RhbnQgaW4gbm9kZS5lbnRyaWVzKSB7CiAgICAgIGlmICghZmlyc3QpIHJlc3VsdC5hZGQoIiwgIik7CiAgICAgIGNvbnN0YW50LmFjY2VwdCh0aGlzKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIHJlc3VsdC5hZGQoIn0iKTsKICB9CgogIHZvaWQgdmlzaXRNYXBDb25zdGFudChNYXBDb25zdGFudCBub2RlKSB7CiAgICByZXN1bHQuYWRkKCI8Iik7CiAgICBub2RlLmtleVR5cGUuYWNjZXB0KHRoaXMpOwogICAgcmVzdWx0LmFkZCgiLCAiKTsKICAgIG5vZGUudmFsdWVUeXBlLmFjY2VwdCh0aGlzKTsKICAgIHJlc3VsdC5hZGQoIj57Iik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoQ29uc3RhbnRNYXBFbnRyeSBlbnRyeSBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgZW50cnkua2V5LmFjY2VwdCh0aGlzKTsKICAgICAgcmVzdWx0LmFkZCgiOiAiKTsKICAgICAgZW50cnkudmFsdWUuYWNjZXB0KHRoaXMpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgcmVzdWx0LmFkZCgifSIpOwogIH0KCiAgdm9pZCB2aXNpdFRlYXJPZmZDb25zdGFudChUZWFyT2ZmQ29uc3RhbnQgbm9kZSkgewogICAgUHJvY2VkdXJlIHByb2NlZHVyZSA9IG5vZGUucHJvY2VkdXJlOwogICAgQ2xhc3MgY2xhc3NOb2RlID0gcHJvY2VkdXJlLmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGNsYXNzTm9kZSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdC5hZGQobmFtZUZvckVudGl0eSgKICAgICAgICAgIGNsYXNzTm9kZSwKICAgICAgICAgIGNsYXNzTm9kZS5uYW1lLAogICAgICAgICAgY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpLAogICAgICAgICAgY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaSkpOwogICAgICByZXN1bHQuYWRkKCIuIik7CiAgICB9CiAgICByZXN1bHQuYWRkKHByb2NlZHVyZS5uYW1lLm5hbWUpOwogIH0KCiAgdm9pZCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCBub2RlKSB7CiAgICBub2RlLnRlYXJPZmZDb25zdGFudC5hY2NlcHQodGhpcyk7CiAgICBpZiAobm9kZS50eXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIHJlc3VsdC5hZGQoIjwiKTsKICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZyBpbiBub2RlLnR5cGVzKSB7CiAgICAgICAgaWYgKCFmaXJzdCkgcmVzdWx0LmFkZCgiLCAiKTsKICAgICAgICB0eXBlQXJnLmFjY2VwdCh0aGlzKTsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB9CiAgICAgIHJlc3VsdC5hZGQoIj4iKTsKICAgIH0KICB9CgogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgbm9kZS50eXBlLmFjY2VwdCh0aGlzKTsKICB9CgogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgdW5zdXBwb3J0ZWQoJ3ByaW50aW5nIHVuZXZhbHVhdGVkIGNvbnN0YW50cycsIC0xLCBudWxsKTsKICB9Cn0KCmZpbmFsIFVyaSB1bmtub3duVXJpID0gVXJpLnBhcnNlKCJ1bmtub3duIik7CgpjbGFzcyBMYWJlbGVkTm9kZSB7CiAgZmluYWwgVHJlZU5vZGUgbm9kZTsKICBmaW5hbCBUeXBlTGFiZWxlciB0eXBlTGFiZWxlcjsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBVcmkgaW1wb3J0VXJpOwogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBMYWJlbGVkTm9kZSgKICAgICAgdGhpcy5ub2RlLCB0aGlzLm5hbWUsIHRoaXMuaW1wb3J0VXJpLCB0aGlzLmZpbGVVcmksIHRoaXMudHlwZUxhYmVsZXIpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBMaXN0PExhYmVsZWROb2RlPiBlbnRpdHlGb3JOYW1lID0gdHlwZUxhYmVsZXIubmFtZU1hcFtuYW1lXTsKICAgIGlmIChlbnRpdHlGb3JOYW1lLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBuYW1lOwogICAgfQogICAgcmV0dXJuICIkbmFtZS8qJHtlbnRpdHlGb3JOYW1lLmluZGV4T2YodGhpcykgKyAxfSovIjsKICB9CgogIFN0cmluZyBnZXQgb3JpZ2luTWVzc2FnZSB7CiAgICBpZiAoaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcgJiYgaW1wb3J0VXJpLnBhdGggPT0gJ2NvcmUnKSB7CiAgICAgIGlmIChub2RlIGlzIENsYXNzICYmIGJsYWNrbGlzdGVkQ29yZUNsYXNzZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAvLyBCbGFja2xpc3RlZCBjb3JlIGNsYXNzLiBPbmx5IHByaW50IGlmIGFtYmlndW91cy4KICAgICAgICBMaXN0PExhYmVsZWROb2RlPiBlbnRpdHlGb3JOYW1lID0gdHlwZUxhYmVsZXIubmFtZU1hcFtuYW1lXTsKICAgICAgICBpZiAoZW50aXR5Rm9yTmFtZS5sZW5ndGggPT0gMSkgewogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGltcG9ydFVyaSA9PSB1bmtub3duVXJpIHx8IG5vZGUgaXMhIENsYXNzKSB7CiAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hlcmUgaXQgY29tZXMgZnJvbSBhbmQvb3IgaXQncyBub3QgYSBjbGFzcy4KICAgICAgLy8gT25seSBwcmludCBpZiBhbWJpZ3VvdXMuCiAgICAgIExpc3Q8TGFiZWxlZE5vZGU+IGVudGl0eUZvck5hbWUgPSB0eXBlTGFiZWxlci5uYW1lTWFwW25hbWVdOwogICAgICBpZiAoZW50aXR5Rm9yTmFtZS5sZW5ndGggPT0gMSkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgfQogICAgTWVzc2FnZSBtZXNzYWdlID0gKGltcG9ydFVyaSA9PSBmaWxlVXJpIHx8IGltcG9ydFVyaS5zY2hlbWUgPT0gJ2RhcnQnKQogICAgICAgID8gdGVtcGxhdGVUeXBlT3JpZ2luLndpdGhBcmd1bWVudHModG9TdHJpbmcoKSwgaW1wb3J0VXJpKQogICAgICAgIDogdGVtcGxhdGVUeXBlT3JpZ2luV2l0aEZpbGVVcmkud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgdG9TdHJpbmcoKSwgaW1wb3J0VXJpLCBmaWxlVXJpKTsKICAgIHJldHVybiAiXG4gLSAiICsgbWVzc2FnZS5tZXNzYWdlOwogIH0KfQqBrABOTjwBIQEhCRYUDxIaEhgVDxYVGhUXERYVExYVJhMVGBgZEhUdFxsdEgFMAUIBHUUBLAFORk9ITDNQHwEXASYBG0tHTypPLBEXEwQBH0tHTzJPNBEbEwQBTUweMCYqBiAEAU4oREFFBhIEAR1EOSExGUUXIhMNOSorIAoIPhlFFx8TBgQBMRwxGQgGBAEpLQEsUSAEASpQHwQBKE4VGQQBLBsEASYYBAE4JjMeBk5GJwEeGB1MTDcEAS4iHSoXGTkmIElLESMkChcIFwYVFzwkMRUGSj0XFDAwESYzFwgXBitCFxQ+JjM4FwgXBhUmBAEwJh4TGC4uKRcZNSYeFwgXBiYEASkBLhYEAS4WBAEsFgQBMhYEATIWBAEyKQQBNk4XFhcxJCQlNhUGFQQBLhUkFhcuJB0VBhUEASwVJBYXLiQdFQYVBAEsFR8WIRYXMyQeGCAVBhUEATQqMB0gFRowMBcGJQQBTichFxktJh4XCBcGBAE8HAQBPD0EAgEtARQXIRUXFQEPTQEWQSUTBjoEAR1CRDxFKRUKCAY1RCJDJxMIBktCNy0mBAIBNHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9sYWJlbGVyLmRhcnRgZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0wANVjS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmJvZHlfYnVpbGRlcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL2Zsb3dfYW5hbHlzaXMvZmxvd19hbmFseXNpcy5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydCcKICAgIHNob3cKICAgICAgICBBc3NlcnQsCiAgICAgICAgQmxvY2tLaW5kLAogICAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgSWRlbnRpZmllckNvbnRleHQsCiAgICAgICAgTWVtYmVyS2luZCwKICAgICAgICBQYXJzZXIsCiAgICAgICAgbGVuZ3RoRm9yVG9rZW4sCiAgICAgICAgbGVuZ3RoT2ZTcGFuLAogICAgICAgIG9wdGlvbmFsOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9xdW90ZS5kYXJ0JwogICAgc2hvdwogICAgICAgIFF1b3RlLAogICAgICAgIGFuYWx5emVRdW90ZSwKICAgICAgICB1bmVzY2FwZSwKICAgICAgICB1bmVzY2FwZUZpcnN0U3RyaW5nUGFydCwKICAgICAgICB1bmVzY2FwZUxhc3RTdHJpbmdQYXJ0LAogICAgICAgIHVuZXNjYXBlU3RyaW5nOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci92YWx1ZV9raW5kLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdG9rZW5faW1wbC5kYXJ0JwogICAgc2hvdyBpc0JpbmFyeU9wZXJhdG9yLCBpc01pbnVzT3BlcmF0b3IsIGlzVXNlckRlZmluYWJsZU9wZXJhdG9yOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvbGluay5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9jb25zdHJ1Y3Rvcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZmllbGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Z1bmN0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9pbnZhbGlkX3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbW9kaWZpZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3Byb2NlZHVyZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBhcyBmYXN0YTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZSwgTWVzc2FnZSwgbm9MZW5ndGgsIFRlbXBsYXRlOwoKaW1wb3J0ICcuLi9pZGVudGlmaWVycy5kYXJ0JwogICAgc2hvdwogICAgICAgIElkZW50aWZpZXIsCiAgICAgICAgSW5pdGlhbGl6ZWRJZGVudGlmaWVyLAogICAgICAgIFF1YWxpZmllZE5hbWUsCiAgICAgICAgZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4sCiAgICAgICAgZmxhdHRlbk5hbWU7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnIGFzIG1lc3NhZ2VzIHNob3cgZ2V0TG9jYXRpb25Gcm9tVXJpOwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JwogICAgc2hvdyBNb2RpZmllciwgY29uc3RNYXNrLCBjb3ZhcmlhbnRNYXNrLCBmaW5hbE1hc2ssIGxhdGVNYXNrLCByZXF1aXJlZE1hc2s7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnIHNob3cgZW1wdHlOYW1lLCBtaW51c05hbWUsIHBsdXNOYW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JwogICAgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuZXhwZWN0ZWQsIHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc2NvcGVfbGlzdGVuZXIuZGFydCcKICAgIHNob3cKICAgICAgICBGaXhlZE51bGxhYmxlTGlzdCwKICAgICAgICBHcm93YWJsZUxpc3QsCiAgICAgICAgSnVtcFRhcmdldEtpbmQsCiAgICAgICAgTnVsbFZhbHVlLAogICAgICAgIFBhcnNlclJlY292ZXJ5LAogICAgICAgIFNjb3BlTGlzdGVuZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zdGFja19saXN0ZW5lcl9pbXBsLmRhcnQnIHNob3cgb2Zmc2V0Rm9yVG9rZW47CgppbXBvcnQgJy4uL3NvdXJjZS92YWx1ZV9raW5kcy5kYXJ0JzsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JyBzaG93IFR5cGVJbmZlcnJlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9wcm9tb3Rpb24uZGFydCcKICAgIHNob3cgVHlwZVByb21vdGVyLCBUeXBlUHJvbW90aW9uRmFjdCwgVHlwZVByb21vdGlvblNjb3BlOwoKaW1wb3J0ICdjb2xsZWN0aW9ucy5kYXJ0JzsKCmltcG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0JzsKCmltcG9ydCAnZXhwcmVzc2lvbl9nZW5lcmF0b3JfaGVscGVyLmRhcnQnIHNob3cgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlcjsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKaW1wb3J0ICdpbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnQnIHNob3cgSW1wbGljaXRUeXBlQXJndW1lbnQ7CgppbXBvcnQgJ3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JwogICAgc2hvdwogICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHksCiAgICAgICAgUmVkaXJlY3Rpb25UYXJnZXQsCiAgICAgICAgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwKICAgICAgICBnZXRSZWRpcmVjdGlvblRhcmdldCwKICAgICAgICBpc1JlZGlyZWN0aW5nRmFjdG9yeTsKCmltcG9ydCAndHlwZV9hbGdvcml0aG1zLmRhcnQnIHNob3cgY2FsY3VsYXRlQm91bmRzOwoKaW1wb3J0ICdrZXJuZWxfYXBpLmRhcnQnOwoKaW1wb3J0ICdrZXJuZWxfYXN0X2FwaS5kYXJ0JzsKCmltcG9ydCAnaW50ZXJuYWxfYXN0LmRhcnQnOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JzsKCi8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgYW5kIGVuc3VyZSBhbGwgbm9kZXMgaGF2ZSBhIGxvY2F0aW9uLgpjb25zdCBpbnQgbm9Mb2NhdGlvbiA9IFRyZWVOb2RlLm5vT2Zmc2V0OwoKLy8gVE9ETyhkYW5ydWJlbCk6IFJlbW92ZSB0aGlzIG9uY2UgY29udHJvbCBmbG93IGFuZCBzcHJlYWQgY29sbGVjdGlvbiBzdXBwb3J0Ci8vIGhhcyBiZWVuIGVuYWJsZWQgYnkgZGVmYXVsdC4KY29uc3QgT2JqZWN0IGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCA9IGNvbnN0IE9iamVjdCgpOwoKY2xhc3MgQm9keUJ1aWxkZXIgZXh0ZW5kcyBTY29wZUxpc3RlbmVyPEp1bXBUYXJnZXQ+CiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIsIEVuc3VyZUxvYWRlZCB7CiAgZmluYWwgRm9yZXN0IGZvcmVzdDsKCiAgLy8gVE9ETyhhaGUpOiBSZW5hbWUgW2xpYnJhcnldIHRvICdwYXJ0Jy4KICBAb3ZlcnJpZGUKICBmaW5hbCBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcjsKCiAgZmluYWwgTW9kaWZpZXJCdWlsZGVyIG1lbWJlcjsKCiAgLy8vIFRoZSBjbGFzcywgbWl4aW4gb3IgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIGluIHdoaWNoIFttZW1iZXJdIGlzIGRlY2xhcmVkLAogIC8vLyBpZiBhbnkuCiAgZmluYWwgRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uQnVpbGRlcjsKCiAgLy8vIFRoZSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbiBpbiB3aGljaCBbbWVtYmVyXSBpcyBkZWNsYXJlZCwgaWYgYW55LgogIGZpbmFsIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXI7CgogIGZpbmFsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgZmluYWwgYm9vbCBpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXI7CgogIGZpbmFsIFNjb3BlIGVuY2xvc2luZ1Njb3BlOwoKICBmaW5hbCBib29sIGVuYWJsZU5hdGl2ZTsKCiAgZmluYWwgYm9vbCBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlOwoKICAvLy8gV2hldGhlciB0byBpZ25vcmUgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UgdG8gYG1haW5gIHdpdGhpbiB0aGUgYm9keSBvZgogIC8vLyBgX2dldE1haW5DbG9zdXJlYCB3aGVuIGNvbXBpbGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgogIC8vLwogIC8vLyBUaGlzIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQuIFRoZSBzdGFuZGFsb25lIFZNIGFuZCBmbHV0dGVyIGhhdmUKICAvLy8gc3BlY2lhbCBsb2dpYyB0byByZXNvbHZlIGBtYWluYCBpbiBgX2dldE1haW5DbG9zdXJlYCwgdGhpcyBmbGFnIGlzIHVzZWQgdG8KICAvLy8gaWdub3JlIHRoYXQgcmVmZXJlbmNlIHRvIGBtYWluYCwgYnV0IG9ubHkgb24gbGlicmFyaWVzIHdoZXJlIHdlIGV4cGVjdCB0bwogIC8vLyBzZWUgaXQgKHRvZGF5IHRoYXQgaXMgZGFydDpfYnVpbHRpbiBhbmQgZGFydDp1aSkuCiAgLy8vCiAgLy8gVE9ETyhhaGUsc2lnbXVuZCk6IHJlbW92ZSB3aGVuIHRoZSBWTSBnZXRzIHJpZCBvZiB0aGUgc3BlY2lhbCBydWxlLCBzZWUKICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMjg5ODkuCiAgZmluYWwgYm9vbCBpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZTsKCiAgLy8gVE9ETyhhaGUpOiBDb25zaWRlciByZW5hbWluZyBbdXJpXSB0byAncGFydFVyaScuCiAgQG92ZXJyaWRlCiAgZmluYWwgVXJpIHVyaTsKCiAgZmluYWwgVHlwZUluZmVycmVyIHR5cGVJbmZlcnJlcjsKCiAgZmluYWwgVHlwZVByb21vdGVyIHR5cGVQcm9tb3RlcjsKCiAgLy8vIE9ubHkgdXNlZCB3aGVuIFttZW1iZXJdIGlzIGEgY29uc3RydWN0b3IuIEl0IHRyYWNrcyBpZiBhbiBpbXBsaWNpdCBzdXBlcgogIC8vLyBpbml0aWFsaXplciBpcyBuZWVkZWQuCiAgLy8vCiAgLy8vIEFuIGltcGxpY2l0IHN1cGVyIGluaXRpYWxpemVyIGlzbid0IG5lZWRlZAogIC8vLwogIC8vLyAxLiBpZiB0aGUgY3VycmVudCBjbGFzcyBpcyBPYmplY3QsCiAgLy8vIDIuIGlmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHN1cGVyIGluaXRpYWxpemVyLAogIC8vLyAzLiBpZiB0aGVyZSBpcyBhIHJlZGlyZWN0aW5nICh0aGlzKSBpbml0aWFsaXplciwgb3IKICAvLy8gNC4gaWYgYSBjb21waWxlLXRpbWUgZXJyb3IgcHJldmVudGVkIHVzIGZyb20gZ2VuZXJhdGluZyBjb2RlIGZvciBhbgogIC8vLyAgICBpbml0aWFsaXplci4gVGhpcyBhdm9pZHMgY2FzY2FkaW5nIGVycm9ycy4KICBib29sIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyOwoKICBTY29wZSBmb3JtYWxQYXJhbWV0ZXJTY29wZTsKCiAgLy8vIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSBzdGFydCBwYXJzaW5nIGFuIGluaXRpYWxpemVyLiBXZSB1c2UgdGhpcyB0bwogIC8vLyBmaW5kIHRoZSBjb3JyZWN0IHNjb3BlIGZvciBpbml0aWFsaXplcnMgbGlrZSBpbiB0aGlzIGV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBjbGFzcyBDIHsKICAvLy8gICAgICAgZmluYWwgeDsKICAvLy8gICAgICAgQyh4KSA6IHggPSB4OwogIC8vLyAgICAgfQogIC8vLwogIC8vLyBXaGVuIHBhcnNpbmcgdGhpcyBpbml0aWFsaXplciBgeCA9IHhgLCBgeGAgbXVzdCBiZSByZXNvbHZlZCBpbiB0d28KICAvLy8gZGlmZmVyZW50IHNjb3Blcy4gVGhlIGZpcnN0IGB4YCBtdXN0IGJlIHJlc29sdmVkIGluIHRoZSBjbGFzcycgc2NvcGUsIHRoZQogIC8vLyBzZWNvbmQgaW4gdGhlIGZvcm1hbCBwYXJhbWV0ZXIgc2NvcGUuCiAgYm9vbCBpbkluaXRpYWxpemVyID0gZmFsc2U7CgogIC8vLyBTZXQgdG8gYHRydWVgIHdoZW4gd2UgYXJlIHBhcnNpbmcgYSBmaWVsZCBpbml0aWFsaXplciBlaXRoZXIgZGlyZWN0bHkKICAvLy8gb3Igd2l0aGluIGFuIGluaXRpYWxpemVyIGxpc3QuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBpbiBgPGluaXQ+YCBpbgogIC8vLwogIC8vLyAgICB2YXIgZm9vID0gPGluaXQ+OwogIC8vLyAgICBjbGFzcyBDbGFzcyB7CiAgLy8vICAgICAgdmFyIGJhciA9IDxpbml0PjsKICAvLy8gICAgICBDbGFzcygpIDogPGluaXQ+OwogIC8vLyAgICB9CiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBpbnN0YW5jZSBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUuCiAgYm9vbCBpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKCiAgLy8vIGB0cnVlYCBpZiB3ZSBhcmUgZGlyZWN0bHkgaW4gYSBmaWVsZCBpbml0aWFsaXplciBvZiBhIGxhdGUgZmllbGQuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBpbiBgPGluaXQ+YCBpbgogIC8vLwogIC8vLyAgICBsYXRlIHZhciBmb28gPSA8aW5pdD47CiAgLy8vICAgIGNsYXNzIENsYXNzIHsKICAvLy8gICAgICBsYXRlIHZhciBiYXIgPSA8aW5pdD47CiAgLy8vICAgICAgQ2xhc3MoKSA6IGJhciA9IDQyOwogIC8vLyAgICB9CiAgLy8vCiAgYm9vbCBpbkxhdGVGaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CgogIC8vLyBgdHJ1ZWAgaWYgd2UgYXJlIGRpcmVjdGx5IGluIHRoZSBpbml0aWFsaXplciBvZiBhIGxhdGUgbG9jYWwuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBpbiBgPGluaXQ+YCBpbgogIC8vLwogIC8vLyAgICBtZXRob2QoKSB7CiAgLy8vICAgICAgbGF0ZSB2YXIgZm9vID0gPGluaXQ+OwogIC8vLyAgICB9CiAgLy8vICAgIGNsYXNzIENsYXNzIHsKICAvLy8gICAgICBtZXRob2QoKSB7CiAgLy8vICAgICAgICBsYXRlIHZhciBiYXIgPSA8aW5pdD47CiAgLy8vICAgICAgfQogIC8vLyAgICB9CiAgLy8vCiAgYm9vbCBnZXQgaW5MYXRlTG9jYWxJbml0aWFsaXplciA9PiBfbG9jYWxJbml0aWFsaXplclN0YXRlLmhlYWQ7CgogIExpbms8Ym9vbD4gX2xvY2FsSW5pdGlhbGl6ZXJTdGF0ZSA9IGNvbnN0IExpbms8Ym9vbD4oKS5wcmVwZW5kKGZhbHNlKTsKCiAgTGlzdDxJbml0aWFsaXplcj4gX2luaXRpYWxpemVyczsKCiAgYm9vbCBpbkNhdGNoQ2xhdXNlID0gZmFsc2U7CgogIGJvb2wgaW5DYXRjaEJsb2NrID0gZmFsc2U7CgogIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCA9IDA7CgogIC8vIFNldCB3aGVuIGEgc3ByZWFkIGVsZW1lbnQgaXMgZW5jb3VudGVyZWQgaW4gYSBjb2xsZWN0aW9uIHNvIHRoZSBjb2xsZWN0aW9uCiAgLy8gbmVlZHMgdG8gYmUgZGVzdWdhcmVkIGFmdGVyIHR5cGUgaW5mZXJlbmNlLgogIGJvb2wgdHJhbnNmb3JtQ29sbGVjdGlvbnMgPSBmYWxzZTsKCiAgLy8gU2V0IGJ5IHR5cGUgaW5mZXJlbmNlIHdoZW4gYSBzZXQgbGl0ZXJhbCBpcyBlbmNvdW50ZXJlZCB0aGF0IG5lZWRzIHRvIGJlCiAgLy8gdHJhbnNmb3JtZWQgYmVjYXVzZSB0aGUgYmFja2VuZCB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCBzZXQgbGl0ZXJhbHMuCiAgYm9vbCB0cmFuc2Zvcm1TZXRMaXRlcmFscyA9IGZhbHNlOwoKICBTdGF0ZW1lbnQgcHJvYmxlbUluTG9vcE9yU3dpdGNoOwoKICBTY29wZSBzd2l0Y2hTY29wZTsKCiAgQ2xvbmVWaXNpdG9yTm90TWVtYmVycyBjbG9uZXI7CgogIENvbnN0YW50Q29udGV4dCBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQubm9uZTsKCiAgVW5yZXNvbHZlZFR5cGUgY3VycmVudExvY2FsVmFyaWFibGVUeXBlOwoKICAvLyBVc2luZyBub24tbnVsbCB2YWx1ZSB0byBpbml0aWFsaXplIHRoaXMgZmllbGQgYmFzZWQgb24gcGVyZm9ybWFuY2UgYWR2aWNlCiAgLy8gZnJvbSBWTSBlbmdpbmVlcnMuIFRPRE8oYWhlKTogRG9lcyB0aGlzIHN0aWxsIGFwcGx5PwogIGludCBjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyA9IC0xOwoKICAvLy8gSWYgbm9uLW51bGwsIHJlY29yZHMgaW5zdGFuY2UgZmllbGRzIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkCiAgLy8vIGFuZCB3aGVyZSB0aGF0IHdhcy4KICBNYXA8U3RyaW5nLCBpbnQ+IGluaXRpYWxpemVkRmllbGRzOwoKICAvLy8gTGlzdCBvZiBidWlsdCByZWRpcmVjdGluZyBmYWN0b3J5IGludm9jYXRpb25zLiAgVGhlIHRhcmdldHMgb2YgdGhlCiAgLy8vIGludm9jYXRpb25zIGFyZSB0byBiZSByZXNvbHZlZCBpbiBhIHNlcGFyYXRlIHN0ZXAuCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiByZWRpcmVjdGluZ0ZhY3RvcnlJbnZvY2F0aW9ucyA9IDxFeHByZXNzaW9uPltdOwoKICAvLy8gVmFyaWFibGVzIHdpdGggbWV0YWRhdGEuICBUaGVpciB0eXBlcyBuZWVkIHRvIGJlIGluZmVycmVkIGxhdGUsIGZvcgogIC8vLyBleGFtcGxlLCBpbiBbZmluaXNoRnVuY3Rpb25dLgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzV2l0aE1ldGFkYXRhOwoKICAvLy8gTW9yZSB0aGFuIG9uZSB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQgdGhhdCBoYXMgbWV0YWRhdGEuCiAgLy8vIFRoZWlyIHR5cGVzIG5lZWQgdG8gYmUgaW5mZXJyZWQgbGF0ZSwgZm9yIGV4YW1wbGUsIGluIFtmaW5pc2hGdW5jdGlvbl0uCiAgTGlzdDxMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+PiBtdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YTsKCiAgLy8vIElmIHRoZSBjdXJyZW50IG1lbWJlciBpcyBhbiBpbnN0YW5jZSBtZW1iZXIgaW4gYW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLAogIC8vLyBbZXh0ZW5zaW9uVGhpc10gaG9sZHMgdGhlIHN5bnRoZXRpY2FsbHkgYWRkIHBhcmFtZXRlciBob2xkaW5nIHRoZSB2YWx1ZQogIC8vLyBmb3IgYHRoaXNgLgogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5zaW9uVGhpczsKCiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiBleHRlbnNpb25UeXBlUGFyYW1ldGVyczsKCiAgQm9keUJ1aWxkZXIoCiAgICAgIHt0aGlzLmxpYnJhcnlCdWlsZGVyLAogICAgICB0aGlzLm1lbWJlciwKICAgICAgdGhpcy5lbmNsb3NpbmdTY29wZSwKICAgICAgdGhpcy5mb3JtYWxQYXJhbWV0ZXJTY29wZSwKICAgICAgdGhpcy5oaWVyYXJjaHksCiAgICAgIHRoaXMuY29yZVR5cGVzLAogICAgICB0aGlzLmRlY2xhcmF0aW9uQnVpbGRlciwKICAgICAgdGhpcy5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIsCiAgICAgIHRoaXMuZXh0ZW5zaW9uVGhpcywKICAgICAgdGhpcy5leHRlbnNpb25UeXBlUGFyYW1ldGVycywKICAgICAgdGhpcy51cmksCiAgICAgIHRoaXMudHlwZUluZmVycmVyfSkKICAgICAgOiBmb3Jlc3QgPSBjb25zdCBGb3Jlc3QoKSwKICAgICAgICBjbGFzc0J1aWxkZXIgPQogICAgICAgICAgICBkZWNsYXJhdGlvbkJ1aWxkZXIgaXMgQ2xhc3NCdWlsZGVyID8gZGVjbGFyYXRpb25CdWlsZGVyIDogbnVsbCwKICAgICAgICBlbmFibGVOYXRpdmUgPSBsaWJyYXJ5QnVpbGRlci5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQKICAgICAgICAgICAgLmVuYWJsZU5hdGl2ZShsaWJyYXJ5QnVpbGRlci5pbXBvcnRVcmkpLAogICAgICAgIHN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmUgPSBsaWJyYXJ5QnVpbGRlcgogICAgICAgICAgICAubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0Lm5hdGl2ZUV4dGVuc2lvbkV4cGVjdHNTdHJpbmcsCiAgICAgICAgaWdub3JlTWFpbkluR2V0TWFpbkNsb3N1cmUgPQogICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5pbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0JyAmJgogICAgICAgICAgICAgICAgKGxpYnJhcnlCdWlsZGVyLmltcG9ydFVyaS5wYXRoID09ICJfYnVpbHRpbiIgfHwKICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5pbXBvcnRVcmkucGF0aCA9PSAidWkiKSwKICAgICAgICBuZWVkc0ltcGxpY2l0U3VwZXJJbml0aWFsaXplciA9IGRlY2xhcmF0aW9uQnVpbGRlciBpcyBDbGFzc0J1aWxkZXIgJiYKICAgICAgICAgICAgY29yZVR5cGVzPy5vYmplY3RDbGFzcyAhPSBkZWNsYXJhdGlvbkJ1aWxkZXIuY2xzLAogICAgICAgIHR5cGVQcm9tb3RlciA9IHR5cGVJbmZlcnJlcj8udHlwZVByb21vdGVyLAogICAgICAgIHN1cGVyKGVuY2xvc2luZ1Njb3BlKSB7CiAgICBmb3JtYWxQYXJhbWV0ZXJTY29wZT8uZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgYnVpbGRlcikgewogICAgICBpZiAoYnVpbGRlciBpcyBWYXJpYWJsZUJ1aWxkZXIpIHsKICAgICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5kZWNsYXJlKGJ1aWxkZXIudmFyaWFibGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIEJvZHlCdWlsZGVyLndpdGhQYXJlbnRzKEZpZWxkQnVpbGRlciBmaWVsZCwgU291cmNlTGlicmFyeUJ1aWxkZXIgcGFydCwKICAgICAgRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uQnVpbGRlciwgVHlwZUluZmVycmVyIHR5cGVJbmZlcnJlcikKICAgICAgOiB0aGlzKAogICAgICAgICAgICBsaWJyYXJ5QnVpbGRlcjogcGFydCwKICAgICAgICAgICAgbWVtYmVyOiBmaWVsZCwKICAgICAgICAgICAgZW5jbG9zaW5nU2NvcGU6IGRlY2xhcmF0aW9uQnVpbGRlcj8uc2NvcGUgPz8gZmllbGQubGlicmFyeS5zY29wZSwKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyU2NvcGU6IG51bGwsCiAgICAgICAgICAgIGhpZXJhcmNoeTogcGFydC5sb2FkZXIuaGllcmFyY2h5LAogICAgICAgICAgICBjb3JlVHlwZXM6IHBhcnQubG9hZGVyLmNvcmVUeXBlcywKICAgICAgICAgICAgZGVjbGFyYXRpb25CdWlsZGVyOiBkZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcjogZmllbGQuaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyLAogICAgICAgICAgICBleHRlbnNpb25UaGlzOiBudWxsLAogICAgICAgICAgICB1cmk6IGZpZWxkLmZpbGVVcmksCiAgICAgICAgICAgIHR5cGVJbmZlcnJlcjogdHlwZUluZmVycmVyKTsKCiAgQm9keUJ1aWxkZXIuZm9yRmllbGQoRmllbGRCdWlsZGVyIGZpZWxkLCBUeXBlSW5mZXJyZXIgdHlwZUluZmVycmVyKQogICAgICA6IHRoaXMud2l0aFBhcmVudHMoCiAgICAgICAgICAgIGZpZWxkLAogICAgICAgICAgICBmaWVsZC5wYXJlbnQgaXMgRGVjbGFyYXRpb25CdWlsZGVyCiAgICAgICAgICAgICAgICA/IGZpZWxkLnBhcmVudC5wYXJlbnQKICAgICAgICAgICAgICAgIDogZmllbGQucGFyZW50LAogICAgICAgICAgICBmaWVsZC5wYXJlbnQgaXMgRGVjbGFyYXRpb25CdWlsZGVyID8gZmllbGQucGFyZW50IDogbnVsbCwKICAgICAgICAgICAgdHlwZUluZmVycmVyKTsKCiAgQm9keUJ1aWxkZXIuZm9yT3V0bGluZUV4cHJlc3Npb24oCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIERlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgIE1vZGlmaWVyQnVpbGRlciBtZW1iZXIsCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBVcmkgZmlsZVVyaSkKICAgICAgOiB0aGlzKAogICAgICAgICAgICBsaWJyYXJ5QnVpbGRlcjogbGlicmFyeSwKICAgICAgICAgICAgbWVtYmVyOiBtZW1iZXIsCiAgICAgICAgICAgIGVuY2xvc2luZ1Njb3BlOiBzY29wZSwKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyU2NvcGU6IG51bGwsCiAgICAgICAgICAgIGhpZXJhcmNoeTogbGlicmFyeS5sb2FkZXIuaGllcmFyY2h5LAogICAgICAgICAgICBjb3JlVHlwZXM6IGxpYnJhcnkubG9hZGVyLmNvcmVUeXBlcywKICAgICAgICAgICAgZGVjbGFyYXRpb25CdWlsZGVyOiBkZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcjoKICAgICAgICAgICAgICAgIG1lbWJlcj8uaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyID8/IGZhbHNlLAogICAgICAgICAgICBleHRlbnNpb25UaGlzOiBudWxsLAogICAgICAgICAgICB1cmk6IGZpbGVVcmksCiAgICAgICAgICAgIHR5cGVJbmZlcnJlcjogbGlicmFyeS5sb2FkZXIudHlwZUluZmVyZW5jZUVuZ2luZQogICAgICAgICAgICAgICAgPy5jcmVhdGVMb2NhbFR5cGVJbmZlcnJlcigKICAgICAgICAgICAgICAgICAgICBmaWxlVXJpLCBkZWNsYXJhdGlvbkJ1aWxkZXI/LnRoaXNUeXBlLCBsaWJyYXJ5LCBudWxsKSk7CgogIGJvb2wgZ2V0IGluQ29uc3RydWN0b3IgewogICAgcmV0dXJuIGZ1bmN0aW9uTmVzdGluZ0xldmVsID09IDAgJiYgbWVtYmVyIGlzIENvbnN0cnVjdG9yQnVpbGRlcjsKICB9CgogIGJvb2wgZ2V0IGlzRGVjbGFyYXRpb25JbnN0YW5jZUNvbnRleHQgewogICAgcmV0dXJuIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlciB8fCBtZW1iZXIgaXMgQ29uc3RydWN0b3JCdWlsZGVyOwogIH0KCiAgVHlwZUVudmlyb25tZW50IGdldCB0eXBlRW52aXJvbm1lbnQgPT4gdHlwZUluZmVycmVyPy50eXBlU2NoZW1hRW52aXJvbm1lbnQ7CgogIERhcnRUeXBlIGdldCBpbXBsaWNpdFR5cGVBcmd1bWVudCA9PiBjb25zdCBJbXBsaWNpdFR5cGVBcmd1bWVudCgpOwoKICB2b2lkIF9lbnRlckxvY2FsU3RhdGUoe2Jvb2wgaW5MYXRlTG9jYWxJbml0aWFsaXplcjogZmFsc2V9KSB7CiAgICBfbG9jYWxJbml0aWFsaXplclN0YXRlID0KICAgICAgICBfbG9jYWxJbml0aWFsaXplclN0YXRlLnByZXBlbmQoaW5MYXRlTG9jYWxJbml0aWFsaXplcik7CiAgfQoKICB2b2lkIF9leGl0TG9jYWxTdGF0ZSgpIHsKICAgIF9sb2NhbEluaXRpYWxpemVyU3RhdGUgPSBfbG9jYWxJbml0aWFsaXplclN0YXRlLnRhaWw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyVmFyaWFibGVBc3NpZ25tZW50KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIHR5cGVQcm9tb3Rlcj8ubXV0YXRlVmFyaWFibGUodmFyaWFibGUsIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LndyaXRlKHZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHVzaChPYmplY3Qgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgRGFydFR5cGUpIHsKICAgICAgdW5oYW5kbGVkKCJEYXJ0VHlwZSIsICJwdXNoIiwgLTEsIHVyaSk7CiAgICB9CiAgICBpbkluaXRpYWxpemVyID0gZmFsc2U7CiAgICBzdXBlci5wdXNoKG5vZGUpOwogIH0KCiAgRXhwcmVzc2lvbiBwb3BGb3JWYWx1ZSgpID0+IHRvVmFsdWUocG9wKCkpOwoKICBFeHByZXNzaW9uIHBvcEZvckVmZmVjdCgpID0+IHRvRWZmZWN0KHBvcCgpKTsKCiAgRXhwcmVzc2lvbiBwb3BGb3JWYWx1ZUlmTm90TnVsbChPYmplY3QgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHBvcEZvclZhbHVlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHRvVmFsdWUoT2JqZWN0IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gbm9kZS5idWlsZFNpbXBsZVJlYWQoKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBFeHByZXNzaW9uKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfSBlbHNlIGlmIChub2RlIGlzIFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VTdXBlckFzRXhwcmVzc2lvbiwgbm9kZS5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgUHJvYmxlbUJ1aWxkZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbShub2RlLm1lc3NhZ2UsIG5vZGUuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtub2RlLnJ1bnRpbWVUeXBlfSIsICJ0b1ZhbHVlIiwgLTEsIHVyaSk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIHRvRWZmZWN0KE9iamVjdCBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBHZW5lcmF0b3IpIHJldHVybiBub2RlLmJ1aWxkRm9yRWZmZWN0KCk7CiAgICByZXR1cm4gdG9WYWx1ZShub2RlKTsKICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gcG9wTGlzdEZvclZhbHVlKGludCBuKSB7CiAgICBMaXN0PEV4cHJlc3Npb24+IGxpc3QgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+LmZpbGxlZChuLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGxpc3RbaV0gPSBwb3BGb3JWYWx1ZSgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBMaXN0PEV4cHJlc3Npb24+IHBvcExpc3RGb3JFZmZlY3QoaW50IG4pIHsKICAgIExpc3Q8RXhwcmVzc2lvbj4gbGlzdCA9CiAgICAgICAgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZmlsbGVkKG4sIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgbGlzdFtpXSA9IHBvcEZvckVmZmVjdCgpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQoKICBTdGF0ZW1lbnQgcG9wQmxvY2soaW50IGNvdW50LCBUb2tlbiBvcGVuQnJhY2UsIFRva2VuIGNsb3NlQnJhY2UpIHsKICAgIHJldHVybiBmb3Jlc3QuY3JlYXRlQmxvY2sob2Zmc2V0Rm9yVG9rZW4ob3BlbkJyYWNlKSwKICAgICAgICBjb25zdCBHcm93YWJsZUxpc3Q8U3RhdGVtZW50PigpLnBvcChzdGFjaywgY291bnQpID8/IDxTdGF0ZW1lbnQ+W10pOwogIH0KCiAgU3RhdGVtZW50IHBvcFN0YXRlbWVudElmTm90TnVsbChPYmplY3QgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHBvcFN0YXRlbWVudCgpOwogIH0KCiAgU3RhdGVtZW50IHBvcFN0YXRlbWVudCgpID0+IGZvcmVzdC53cmFwVmFyaWFibGVzKHBvcCgpKTsKCiAgdm9pZCBlbnRlclN3aXRjaFNjb3BlKCkgewogICAgcHVzaChzd2l0Y2hTY29wZSA/PyBOdWxsVmFsdWUuU3dpdGNoU2NvcGUpOwogICAgc3dpdGNoU2NvcGUgPSBzY29wZTsKICB9CgogIHZvaWQgZXhpdFN3aXRjaFNjb3BlKCkgewogICAgU2NvcGUgb3V0ZXJTd2l0Y2hTY29wZSA9IHBvcCgpOwogICAgaWYgKHN3aXRjaFNjb3BlLnVuY2xhaW1lZEZvcndhcmREZWNsYXJhdGlvbnMgIT0gbnVsbCkgewogICAgICBzd2l0Y2hTY29wZS51bmNsYWltZWRGb3J3YXJkRGVjbGFyYXRpb25zCiAgICAgICAgICAuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEp1bXBUYXJnZXQgZGVjbGFyYXRpb24pIHsKICAgICAgICBpZiAob3V0ZXJTd2l0Y2hTY29wZSA9PSBudWxsKSB7CiAgICAgICAgICBmb3IgKFN0YXRlbWVudCBzdGF0ZW1lbnQgaW4gZGVjbGFyYXRpb24udXNlcnMpIHsKICAgICAgICAgICAgc3RhdGVtZW50LnBhcmVudC5yZXBsYWNlQ2hpbGQoCiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsCiAgICAgICAgICAgICAgICB3cmFwSW5Qcm9ibGVtU3RhdGVtZW50KHN0YXRlbWVudCwKICAgICAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUxhYmVsTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lKSkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXRlclN3aXRjaFNjb3BlLmZvcndhcmREZWNsYXJlTGFiZWwobmFtZSwgZGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBzd2l0Y2hTY29wZSA9IG91dGVyU3dpdGNoU2NvcGU7CiAgfQoKICB2b2lkIHdyYXBWYXJpYWJsZUluaXRpYWxpemVySW5FcnJvcigKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwKICAgICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0KSB7CiAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlLm5hbWU7CiAgICBpbnQgb2Zmc2V0ID0gdmFyaWFibGUuZmlsZU9mZnNldDsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlLndpdGhBcmd1bWVudHMobmFtZSk7CiAgICBpZiAodmFyaWFibGUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewogICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9CiAgICAgICAgICBidWlsZFByb2JsZW0obWVzc2FnZSwgb2Zmc2V0LCBuYW1lLmxlbmd0aCwgY29udGV4dDogY29udGV4dCkKICAgICAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gd3JhcEluTG9jYXRlZFByb2JsZW0oCiAgICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciwgbWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBvZmZzZXQsIG5hbWUubGVuZ3RoKSwKICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpCiAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgIH0KICB9CgogIHZvaWQgZGVjbGFyZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIFNjb3BlIHNjb3BlKSB7CiAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlLm5hbWU7CiAgICBCdWlsZGVyIGV4aXN0aW5nID0gc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBmYWxzZSk7CiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAvLyBUaGlzIHJlcG9ydHMgYW4gZXJyb3IgZm9yIGR1cGxpY2F0ZWQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHNjb3BlOgogICAgICAvLyBgeyB2YXIgeDsgdmFyIHg7IH1gCiAgICAgIHdyYXBWYXJpYWJsZUluaXRpYWxpemVySW5FcnJvcigKICAgICAgICAgIHZhcmlhYmxlLCBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwgPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBleGlzdGluZy5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIExvY2F0ZWRNZXNzYWdlIGNvbnRleHQgPSBzY29wZS5kZWNsYXJlKAogICAgICAgIHZhcmlhYmxlLm5hbWUsCiAgICAgICAgbmV3IFZhcmlhYmxlQnVpbGRlckltcGwoCiAgICAgICAgICAgIHZhcmlhYmxlLCBtZW1iZXIgPz8gY2xhc3NCdWlsZGVyID8/IGxpYnJhcnlCdWlsZGVyLCB1cmkpLAogICAgICAgIHVyaSk7CiAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CiAgICAgIC8vIFRoaXMgY2FzZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgZXJyb3IuIEluIHRoaXMgY2FzZSwgdGhlIHByb2JsZW0KICAgICAgLy8gaXMgdXNpbmcgYHhgIGJlZm9yZSBpdCdzIGRlY2xhcmVkOiBgeyB2YXIgeDsgeyBwcmludCh4KTsgdmFyIHg7CiAgICAgIC8vIH19YC4gSW4gdGhpcyBjYXNlLCB3ZSB3YW50IHR3byBlcnJvcnMsIHRoZSBgeGAgaW4gYHByaW50KHgpYCBhbmQgdGhlCiAgICAgIC8vIHNlY29uZCAob3IgaW5uZXJtb3N0IGRlY2xhcmF0aW9uKSBvZiBgeGAuCiAgICAgIHdyYXBWYXJpYWJsZUluaXRpYWxpemVySW5FcnJvcigKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkLAogICAgICAgICAgPExvY2F0ZWRNZXNzYWdlPltjb250ZXh0XSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBKdW1wVGFyZ2V0IGNyZWF0ZUp1bXBUYXJnZXQoSnVtcFRhcmdldEtpbmQga2luZCwgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBuZXcgSnVtcFRhcmdldChraW5kLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICB9CgogIHZvaWQgaW5mZXJBbm5vdGF0aW9ucyhUcmVlTm9kZSBwYXJlbnQsIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIHR5cGVJbmZlcnJlcj8uaW5mZXJNZXRhZGF0YSh0aGlzLCBwYXJlbnQsIGFubm90YXRpb25zKTsKICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRyYW5zZm9ybUxpc3RQb3N0SW5mZXJlbmNlKGFubm90YXRpb25zLAogICAgICAgICAgdHJhbnNmb3JtU2V0TGl0ZXJhbHMsIHRyYW5zZm9ybUNvbGxlY3Rpb25zLCBsaWJyYXJ5QnVpbGRlci5saWJyYXJ5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRhZGF0YShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5NZXRhZGF0YSIpOwogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRhZGF0YShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiTWV0YWRhdGEiKTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBwb3AoKTsKICAgIHB1c2hRdWFsaWZpZWRSZWZlcmVuY2UoYmVnaW5Ub2tlbi5uZXh0LCBwZXJpb2RCZWZvcmVOYW1lKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIF9idWlsZENvbnN0cnVjdG9yUmVmZXJlbmNlSW52b2NhdGlvbigKICAgICAgICAgIGJlZ2luVG9rZW4ubmV4dCwgYmVnaW5Ub2tlbi5vZmZzZXQsIENvbnN0bmVzcy5leHBsaWNpdENvbnN0KTsKICAgICAgcHVzaChwb3BGb3JWYWx1ZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvcCgpOyAvLyBOYW1lIGxhc3QgaWRlbnRpZmllcgogICAgICBTdHJpbmcgbmFtZSA9IHBvcCgpOwogICAgICBwb3AoKTsgLy8gVHlwZSBhcmd1bWVudHMgKGlnbm9yZWQsIGFscmVhZHkgcmVwb3J0ZWQgYnkgcGFyc2VyKS4KICAgICAgT2JqZWN0IGV4cHJlc3Npb24gPSBwb3AoKTsKICAgICAgaWYgKGV4cHJlc3Npb24gaXMgSWRlbnRpZmllcikgewogICAgICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IGV4cHJlc3Npb247CiAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBVbnJlc29sdmVkTmFtZUdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4oaWRlbnRpZmllciksCiAgICAgICAgICAgIG5ldyBOYW1lKGlkZW50aWZpZXIubmFtZSwgbGlicmFyeUJ1aWxkZXIubmFtZU9yaWdpbikpOwogICAgICB9CiAgICAgIGlmIChuYW1lPy5pc05vdEVtcHR5ID8/IGZhbHNlKSB7CiAgICAgICAgVG9rZW4gcGVyaW9kID0gcGVyaW9kQmVmb3JlTmFtZSA/PyBiZWdpblRva2VuLm5leHQubmV4dDsKICAgICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZXhwcmVzc2lvbjsKICAgICAgICBleHByZXNzaW9uID0gZ2VuZXJhdG9yLmJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgICAgICAgIG5ldyBJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgICAgICAgICB0aGlzLCBwZXJpb2QubmV4dCwgbmV3IE5hbWUobmFtZSwgbGlicmFyeUJ1aWxkZXIubmFtZU9yaWdpbikpLAogICAgICAgICAgICBwZXJpb2QubmV4dC5vZmZzZXQsCiAgICAgICAgICAgIGZhbHNlKTsKICAgICAgfQoKICAgICAgQ29uc3RhbnRDb250ZXh0IHNhdmVkQ29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICAgIGlmIChleHByZXNzaW9uIGlzISBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IgJiYKICAgICAgICAgIGV4cHJlc3Npb24gaXMhIFZhcmlhYmxlVXNlR2VuZXJhdG9yICYmCiAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdG9wIHVzaW5nIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0b3IgaGVyZS4KICAgICAgICAgIC8vIEFzayBhIHByb3BlcnR5IGluc3RlYWQuCiAgICAgICAgICAoZXhwcmVzc2lvbiBpcyEgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgfHwKICAgICAgICAgICAgICBleHByZXNzaW9uIGlzIFR5cGVVc2VHZW5lcmF0b3IgfHwKICAgICAgICAgICAgICBleHByZXNzaW9uIGlzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yKSkgewogICAgICAgIHB1c2god3JhcEluUHJvYmxlbSgKICAgICAgICAgICAgdG9WYWx1ZShleHByZXNzaW9uKSwgZmFzdGEubWVzc2FnZUV4cHJlc3Npb25Ob3RNZXRhZGF0YSwgbm9MZW5ndGgpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwdXNoKHRvVmFsdWUoZXhwcmVzc2lvbikpOwogICAgICB9CiAgICAgIGNvbnN0YW50Q29udGV4dCA9IHNhdmVkQ29uc3RhbnRDb250ZXh0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRhZGF0YVN0YXIoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YVN0YXIiKTsKICAgIGlmIChjb3VudCA9PSAwKSB7CiAgICAgIHB1c2goTnVsbFZhbHVlLk1ldGFkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goY29uc3QgR3Jvd2FibGVMaXN0PEV4cHJlc3Npb24+KCkucG9wKHN0YWNrLCBjb3VudCkgPz8KICAgICAgICAgIE51bGxWYWx1ZS5NZXRhZGF0YSAvKiBJZ25vcmUgcGFyc2VyIHJlY292ZXJ5ICovKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxGaWVsZHMoCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlRvcExldmVsRmllbGRzIik7CiAgICBpZiAoIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBwdXNoKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NGaWVsZHMoVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRmllbGRzIik7CiAgICBpZiAoIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBwdXNoKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZmluaXNoRmllbGRzKCkgewogICAgZGVidWdFdmVudCgiZmluaXNoRmllbGRzIik7CiAgICBpbnQgY291bnQgPSBwb3AoKTsKICAgIExpc3Q8RmllbGRCdWlsZGVyPiBmaWVsZHMgPSA8RmllbGRCdWlsZGVyPltdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBwb3AoKTsKICAgICAgSWRlbnRpZmllciBpZGVudGlmaWVyID0gcG9wKCk7CiAgICAgIFN0cmluZyBuYW1lID0gaWRlbnRpZmllci5uYW1lOwogICAgICBCdWlsZGVyIGRlY2xhcmF0aW9uOwogICAgICBpZiAoZGVjbGFyYXRpb25CdWlsZGVyICE9IG51bGwpIHsKICAgICAgICBkZWNsYXJhdGlvbiA9CiAgICAgICAgICAgIGRlY2xhcmF0aW9uQnVpbGRlci5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCByZXF1aXJlZDogdHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5QnVpbGRlci5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCByZXF1aXJlZDogdHJ1ZSk7CiAgICAgIH0KICAgICAgRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlcjsKICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQgJiYgZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsKSB7CiAgICAgICAgZmllbGRCdWlsZGVyID0gZGVjbGFyYXRpb247CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZmllbGRzLmFkZChmaWVsZEJ1aWxkZXIpOwogICAgICBpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIGlmIChmaWVsZEJ1aWxkZXIuaXNEdXBsaWNhdGUpIHsKICAgICAgICAgIC8vIER1cGxpY2F0ZSBkZWZpbml0aW9uLiBUaGUgZmllbGQgbWlnaHQgbm90IGJlIHRoZSBjb3JyZWN0IG9uZSwKICAgICAgICAgIC8vIHNvIHdlIHNraXAgaW5mZXJlbmNlIG9mIHRoZSBpbml0aWFsaXplci4KICAgICAgICAgIC8vIEVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaXMgaGFuZGxlZCBlbHNld2hlcmUuCiAgICAgICAgfSBlbHNlIGlmIChmaWVsZEJ1aWxkZXIuaGFzQm9keUJlZW5CdWlsdCkgewogICAgICAgICAgLy8gVGhlIGluaXRpYWxpemVyIHdhcyBhbHJlYWR5IGNvbXBpbGVkIChlLmcuLCBpZiBpdCBhcHBlYXIgaW4gdGhlCiAgICAgICAgICAvLyBvdXRsaW5lLCBsaWtlIGNvbnN0YW50IGZpZWxkIGluaXRpYWxpemVycykgc28gd2UgZG8gbm90IG5lZWQgdG8KICAgICAgICAgIC8vIHBlcmZvcm0gdHlwZSBpbmZlcmVuY2Ugb3IgdHJhbnNmb3JtYXRpb25zLgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbml0aWFsaXplciA9IHR5cGVJbmZlcnJlcj8uaW5mZXJGaWVsZEluaXRpYWxpemVyKAogICAgICAgICAgICAgIHRoaXMsIGZpZWxkQnVpbGRlci5idWlsdFR5cGUsIGluaXRpYWxpemVyKTsKCiAgICAgICAgICBpZiAodHJhbnNmb3JtQ29sbGVjdGlvbnMgfHwgdHJhbnNmb3JtU2V0TGl0ZXJhbHMpIHsKICAgICAgICAgICAgLy8gV3JhcCB0aGUgaW5pdGlhbGl6ZXIgaW4gYSB0ZW1wb3JhcnkgcGFyZW50IGV4cHJlc3Npb247IHRoZQogICAgICAgICAgICAvLyB0cmFuc2Zvcm1hdGlvbnMgbmVlZCBhIHBhcmVudCByZWxhdGlvbi4KICAgICAgICAgICAgTm90IHdyYXBwZXIgPSBuZXcgTm90KGluaXRpYWxpemVyKTsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoCiAgICAgICAgICAgICAgICB3cmFwcGVyLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtU2V0TGl0ZXJhbHMsCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2xsZWN0aW9ucywKICAgICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpOwogICAgICAgICAgICBpbml0aWFsaXplciA9IHdyYXBwZXIub3BlcmFuZDsKICAgICAgICAgIH0KICAgICAgICAgIGZpZWxkQnVpbGRlci5idWlsZEJvZHkoY29yZVR5cGVzLCBpbml0aWFsaXplcik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFmaWVsZEJ1aWxkZXIuaGFzQm9keUJlZW5CdWlsdCkgewogICAgICAgIGZpZWxkQnVpbGRlci5idWlsZEJvZHkoY29yZVR5cGVzLCBudWxsKTsKICAgICAgfQogICAgfQogICAgewogICAgICAvLyBUT0RPKGFoZSk6IFRoZSB0eXBlIHdlIGNvbXB1dGUgaGVyZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gd2hhdCBpcwogICAgICAvLyBjb21wdXRlZCBpbiB0aGUgb3V0bGluZSBwaGFzZS4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBvdXRsaW5lCiAgICAgIC8vIHBoYXNlIGNvbXB1dGVzIHRoZSBzYW1lIHR5cGUuIFNlZQogICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzMyMjAwLmRhcnQgZm9yIGFuIGV4YW1wbGUgd2hlcmUKICAgICAgLy8gbm90IGNhbGxpbmcgW2J1aWxkRGFydFR5cGVdIGxlYWRzIHRvIGEgbWlzc2luZyBjb21waWxlLXRpbWUKICAgICAgLy8gZXJyb3IuIEFsc28sIG5vdGljZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBwcm9ibGVtYXRpYyBmaWVsZCBpc24ndAogICAgICAvLyBgaW52YWxpZC10eXBlYC4KICAgICAgYnVpbGREYXJ0VHlwZShwb3AoKSk7IC8vIFR5cGUuCiAgICB9CiAgICBwb3AoKTsgLy8gQW5ub3RhdGlvbnMuCgogICAgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWVtYmVyKCkgewogICAgZGVidWdFdmVudCgiTWVtYmVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJsb2NrRnVuY3Rpb25Cb2R5KGludCBjb3VudCwgVG9rZW4gb3BlbkJyYWNlLCBUb2tlbiBjbG9zZUJyYWNlKSB7CiAgICBkZWJ1Z0V2ZW50KCJCbG9ja0Z1bmN0aW9uQm9keSIpOwogICAgaWYgKG9wZW5CcmFjZSA9PSBudWxsKSB7CiAgICAgIGFzc2VydChjb3VudCA9PSAwKTsKICAgICAgcHVzaChOdWxsVmFsdWUuQmxvY2spOwogICAgfSBlbHNlIHsKICAgICAgU3RhdGVtZW50IGJsb2NrID0gcG9wQmxvY2soY291bnQsIG9wZW5CcmFjZSwgY2xvc2VCcmFjZSk7CiAgICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICAgIHB1c2goYmxvY2spOwogICAgfQogIH0KCiAgdm9pZCBwcmVwYXJlSW5pdGlhbGl6ZXJzKCkgewogICAgRnVuY3Rpb25CdWlsZGVyIG1lbWJlciA9IHRoaXMubWVtYmVyOwogICAgc2NvcGUgPSBtZW1iZXIuY29tcHV0ZUZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGUoc2NvcGUpOwogICAgaWYgKG1lbWJlciBpcyBDb25zdHJ1Y3RvckJ1aWxkZXIpIHsKICAgICAgbWVtYmVyLnByZXBhcmVJbml0aWFsaXplcnMoKTsKICAgICAgaWYgKG1lbWJlci5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIG1lbWJlci5mb3JtYWxzKSB7CiAgICAgICAgICBpZiAoZm9ybWFsLmlzSW5pdGlhbGl6aW5nRm9ybWFsKSB7CiAgICAgICAgICAgIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVyczsKICAgICAgICAgICAgaWYgKG1lbWJlci5pc0V4dGVybmFsKSB7CiAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzID0gPEluaXRpYWxpemVyPlsKICAgICAgICAgICAgICAgIGJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgICAgICAgICAgICAgIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgpLAogICAgICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0KQogICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzID0gYnVpbGRGaWVsZEluaXRpYWxpemVyKAogICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZSwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGZvcm1hbC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoZm9ybWFsLnZhcmlhYmxlKSwKICAgICAgICAgICAgICAgICAgZm9ybWFsOiBmb3JtYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgICAgICAgbWVtYmVyLmFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0luaXRpYWxpemVycygpIHsKICAgIGRlYnVnRXZlbnQoIk5vSW5pdGlhbGl6ZXJzIik7CiAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICBwcmVwYXJlSW5pdGlhbGl6ZXJzKCk7CiAgICAgIHNjb3BlID0gZm9ybWFsUGFyYW1ldGVyU2NvcGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZXJzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkluaXRpYWxpemVycyIpOwogICAgaWYgKGZ1bmN0aW9uTmVzdGluZ0xldmVsID09IDApIHsKICAgICAgcHJlcGFyZUluaXRpYWxpemVycygpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbml0aWFsaXplcnMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiSW5pdGlhbGl6ZXJzIik7CiAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCkgewogICAgICBzY29wZSA9IGZvcm1hbFBhcmFtZXRlclNjb3BlOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkluaXRpYWxpemVyIik7CiAgICBpbkluaXRpYWxpemVyID0gdHJ1ZTsKICAgIGluRmllbGRJbml0aWFsaXplciA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRJbml0aWFsaXplciIpOwogICAgaW5GaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CiAgICBhc3NlcnQoIWluSW5pdGlhbGl6ZXIpOwogICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgIExpc3Q8SW5pdGlhbGl6ZXI+IGluaXRpYWxpemVyczsKICAgIGlmIChub2RlIGlzIEluaXRpYWxpemVyKSB7CiAgICAgIGluaXRpYWxpemVycyA9IDxJbml0aWFsaXplcj5bbm9kZV07CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgR2VuZXJhdG9yKSB7CiAgICAgIGluaXRpYWxpemVycyA9IG5vZGUuYnVpbGRGaWVsZEluaXRpYWxpemVyKGluaXRpYWxpemVkRmllbGRzKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBDb25zdHJ1Y3Rvckludm9jYXRpb24pIHsKICAgICAgaW5pdGlhbGl6ZXJzID0gPEluaXRpYWxpemVyPlsKICAgICAgICBidWlsZFN1cGVySW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGZhbHNlLCBub2RlLnRhcmdldCwgbm9kZS5hcmd1bWVudHMsIHRva2VuLmNoYXJPZmZzZXQpCiAgICAgIF07CiAgICB9IGVsc2UgewogICAgICBFeHByZXNzaW9uIHZhbHVlID0gdG9WYWx1ZShub2RlKTsKICAgICAgaWYgKCFmb3Jlc3QuaXNUaHJvdyhub2RlKSkgewogICAgICAgIHZhbHVlID0KICAgICAgICAgICAgd3JhcEluUHJvYmxlbSh2YWx1ZSwgZmFzdGEubWVzc2FnZUV4cGVjdGVkQW5Jbml0aWFsaXplciwgbm9MZW5ndGgpOwogICAgICB9CiAgICAgIGluaXRpYWxpemVycyA9IDxJbml0aWFsaXplcj5bCiAgICAgICAgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIobm9kZSwgdG9rZW4uY2hhck9mZnNldCkKICAgICAgXTsKICAgIH0KICAgIF9pbml0aWFsaXplcnMgPz89IDxJbml0aWFsaXplcj5bXTsKICAgIF9pbml0aWFsaXplcnMuYWRkQWxsKGluaXRpYWxpemVycyk7CiAgICBmaW5hbCBNb2RpZmllckJ1aWxkZXIgbWVtYmVyID0gdGhpcy5tZW1iZXI7CiAgICBpZiAoIShtZW1iZXIgaXMgQ29uc3RydWN0b3JCdWlsZGVyICYmICFtZW1iZXIuaXNFeHRlcm5hbCkpIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3IKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhtZW1iZXIubmFtZSksCiAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgbWVtYmVyLm5hbWUubGVuZ3RoKTsKICAgIH0KICB9CgogIERhcnRUeXBlIF9jb21wdXRlUmV0dXJuVHlwZUNvbnRleHQoTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICByZXR1cm4gbWVtYmVyLmFjdHVhbFByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG1lbWJlciBpcyBDb25zdHJ1Y3RvckJ1aWxkZXIpOwogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZmluaXNoRnVuY3Rpb24oCiAgICAgIEZvcm1hbFBhcmFtZXRlcnMgZm9ybWFscywgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciwgU3RhdGVtZW50IGJvZHkpIHsKICAgIGRlYnVnRXZlbnQoImZpbmlzaEZ1bmN0aW9uIik7CiAgICB0eXBlUHJvbW90ZXI/LmZpbmlzaGVkKCk7CiAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5maW5pc2goKTsKCiAgICBGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG1lbWJlcjsKICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IGJ1aWxkZXIubWVtYmVyLmZ1bmN0aW9uOwogICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICB0eXBlSW5mZXJyZXI/LmZsb3dBbmFseXNpcz8uaW5pdGlhbGl6ZShwYXJhbWV0ZXIpOwogICAgfQogICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgdHlwZUluZmVycmVyPy5mbG93QW5hbHlzaXM/LmluaXRpYWxpemUocGFyYW1ldGVyKTsKICAgIH0KCiAgICBpZiAoZm9ybWFscz8ucGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgPSBmb3JtYWxzLnBhcmFtZXRlcnNbaV07CiAgICAgICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IHBhcmFtZXRlci52YXJpYWJsZS5pbml0aWFsaXplcjsKICAgICAgICBpZiAocGFyYW1ldGVyLmlzT3B0aW9uYWwgfHwgaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgaWYgKCFwYXJhbWV0ZXIuaW5pdGlhbGl6ZXJXYXNJbmZlcnJlZCkgewogICAgICAgICAgICBwYXJhbWV0ZXIuaW5pdGlhbGl6ZXJXYXNJbmZlcnJlZCA9IHRydWU7CiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaXNPcHRpb25hbCkgewogICAgICAgICAgICAgIGluaXRpYWxpemVyID8/PSBmb3Jlc3QuY3JlYXRlTnVsbExpdGVyYWwoCiAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYWhlKTogU2hvdWxkIHN0b3JlOiBvcmlnaW5QYXJhbWV0ZXIuZmlsZU9mZnNldAogICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzIyODkKICAgICAgICAgICAgICAgICAgbm9Mb2NhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvcmlnaW5QYXJhbWV0ZXIgPSBidWlsZGVyLmdldEZvcm1hbFBhcmFtZXRlcihpKTsKICAgICAgICAgICAgaW5pdGlhbGl6ZXIgPSB0eXBlSW5mZXJyZXI/LmluZmVyUGFyYW1ldGVySW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIsCiAgICAgICAgICAgICAgICBvcmlnaW5QYXJhbWV0ZXIudHlwZSwKICAgICAgICAgICAgICAgIHBhcmFtZXRlci5oYXNEZWNsYXJlZEluaXRpYWxpemVyKTsKICAgICAgICAgICAgb3JpZ2luUGFyYW1ldGVyLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIuLnBhcmVudCA9IG9yaWdpblBhcmFtZXRlcjsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoCiAgICAgICAgICAgICAgICBvcmlnaW5QYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1TZXRMaXRlcmFscywKICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zLAogICAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgICB9CgogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbnNpb25UZWFyT2ZmUGFyYW1ldGVyID0KICAgICAgICAgICAgICBidWlsZGVyLmdldEV4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXIoaSk7CiAgICAgICAgICBpZiAoZXh0ZW5zaW9uVGVhck9mZlBhcmFtZXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgIGNsb25lciA/Pz0gbmV3IENsb25lVmlzaXRvck5vdE1lbWJlcnMoKTsKICAgICAgICAgICAgRXhwcmVzc2lvbiB0ZWFyT2ZmSW5pdGlhbGl6ZXIgPSBjbG9uZXIuY2xvbmUoaW5pdGlhbGl6ZXIpOwogICAgICAgICAgICBleHRlbnNpb25UZWFyT2ZmUGFyYW1ldGVyLmluaXRpYWxpemVyID0gdGVhck9mZkluaXRpYWxpemVyCiAgICAgICAgICAgICAgLi5wYXJlbnQgPSBleHRlbnNpb25UZWFyT2ZmUGFyYW1ldGVyOwogICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIudHJhbnNmb3JtUG9zdEluZmVyZW5jZSgKICAgICAgICAgICAgICAgIGV4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1TZXRMaXRlcmFscywKICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zLAogICAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoYnVpbGRlciBpcyBDb25zdHJ1Y3RvckJ1aWxkZXIpIHsKICAgICAgZmluaXNoQ29uc3RydWN0b3IoYnVpbGRlciwgYXN5bmNNb2RpZmllciwgYm9keSk7CiAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICBidWlsZGVyLmFzeW5jTW9kaWZpZXIgPSBhc3luY01vZGlmaWVyOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke2J1aWxkZXIucnVudGltZVR5cGV9IiwgImZpbmlzaEZ1bmN0aW9uIiwgYnVpbGRlci5jaGFyT2Zmc2V0LAogICAgICAgICAgYnVpbGRlci5maWxlVXJpKTsKICAgIH0KCiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSB0eXBlSW5mZXJyZXI/LmluZmVyRnVuY3Rpb25Cb2R5KAogICAgICAgICAgdGhpcywgX2NvbXB1dGVSZXR1cm5UeXBlQ29udGV4dChtZW1iZXIpLCBhc3luY01vZGlmaWVyLCBib2R5KTsKICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoYm9keSwgdHJhbnNmb3JtU2V0TGl0ZXJhbHMsCiAgICAgICAgICB0cmFuc2Zvcm1Db2xsZWN0aW9ucywgbGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICB9CgogICAgaWYgKGJ1aWxkZXIucmV0dXJuVHlwZSAhPSBudWxsKSB7CiAgICAgIGNoZWNrQXN5bmNSZXR1cm5UeXBlKGFzeW5jTW9kaWZpZXIsIGJ1aWxkZXIuZnVuY3Rpb24ucmV0dXJuVHlwZSwKICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCBtZW1iZXIubmFtZS5sZW5ndGgpOwogICAgfQoKICAgIGlmIChidWlsZGVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpIHsKICAgICAgaWYgKGZvcm1hbHM/LnBhcmFtZXRlcnMgPT0gbnVsbCB8fAogICAgICAgICAgZm9ybWFscy5wYXJhbWV0ZXJzLmxlbmd0aCAhPSAxIHx8CiAgICAgICAgICBmb3JtYWxzLnBhcmFtZXRlcnMuc2luZ2xlLmlzT3B0aW9uYWwpIHsKICAgICAgICBpbnQgY2hhck9mZnNldCA9IGZvcm1hbHM/LmNoYXJPZmZzZXQgPz8KICAgICAgICAgICAgYm9keT8uZmlsZU9mZnNldCA/PwogICAgICAgICAgICBidWlsZGVyLm1lbWJlci5maWxlT2Zmc2V0OwogICAgICAgIGlmIChib2R5ID09IG51bGwpIHsKICAgICAgICAgIGJvZHkgPSBuZXcgRW1wdHlTdGF0ZW1lbnQoKS4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgICAgfQogICAgICAgIGlmIChidWlsZGVyLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgICAgLy8gSWxsZWdhbCBwYXJhbWV0ZXJzIHdlcmUgcmVtb3ZlZCBieSB0aGUgZnVuY3Rpb24gYnVpbGRlci4KICAgICAgICAgIC8vIEFkZCB0aGVtIGFzIGxvY2FsIHZhcmlhYmxlIHRvIHB1dCB0aGVtIGluIHNjb3BlIG9mIHRoZSBib2R5LgogICAgICAgICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciBpbiBidWlsZGVyLmZvcm1hbHMpIHsKICAgICAgICAgICAgc3RhdGVtZW50cy5hZGQocGFyYW1ldGVyLnZhcmlhYmxlKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlbWVudHMuYWRkKGJvZHkpOwogICAgICAgICAgYm9keSA9IGZvcmVzdC5jcmVhdGVCbG9jayhjaGFyT2Zmc2V0LCBzdGF0ZW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgYm9keSA9IGZvcmVzdC5jcmVhdGVCbG9jayhjaGFyT2Zmc2V0LCA8U3RhdGVtZW50PlsKICAgICAgICAgIGZvcmVzdC5jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgICAgIG5vTG9jYXRpb24sCiAgICAgICAgICAgICAgLy8gVGhpcyBlcnJvciBpcyBhZGRlZCBhZnRlciB0eXBlIGluZmVyZW5jZSBpcyBkb25lLCBzbyB3ZQogICAgICAgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gd3JhcCBlcnJvcnMgaW4gU3ludGhldGljRXhwcmVzc2lvbkp1ZGdtZW50LgogICAgICAgICAgICAgIGJ1aWxkUHJvYmxlbShmYXN0YS5tZXNzYWdlU2V0dGVyV2l0aFdyb25nTnVtYmVyT2ZGb3JtYWxzLAogICAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LCBub0xlbmd0aCkpLAogICAgICAgICAgYm9keSwKICAgICAgICBdKTsKICAgICAgfQogICAgfQogICAgLy8gTm8tc3VjaC1tZXRob2QgZm9yd2FyZGVycyBnZXQgdGhlaXIgYm9kaWVzIGluamVjdGVkIGR1cmluZyBvdXRsaW5lCiAgICAvLyBidWlsZGluZywgc28gd2Ugc2hvdWxkIHNraXAgdGhlbSBoZXJlLgogICAgYm9vbCBpc05vU3VjaE1ldGhvZEZvcndhcmRlciA9IChidWlsZGVyLmZ1bmN0aW9uLnBhcmVudCBpcyBQcm9jZWR1cmUgJiYKICAgICAgICAoYnVpbGRlci5mdW5jdGlvbi5wYXJlbnQgYXMgUHJvY2VkdXJlKS5pc05vU3VjaE1ldGhvZEZvcndhcmRlcik7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGlmICghYnVpbGRlci5pc0V4dGVybmFsICYmICFpc05vU3VjaE1ldGhvZEZvcndhcmRlcikgewogICAgICAgIGJ1aWxkZXIuYm9keSA9IGJvZHk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVpbGRlci5ib2R5ID0gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+WwogICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VFeHRlcm5hbE1ldGhvZFdpdGhCb2R5LCBib2R5LmZpbGVPZmZzZXQsIG5vTGVuZ3RoKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYm9keS5maWxlT2Zmc2V0LAogICAgICAgICAgYm9keSwKICAgICAgICBdKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYm9keS5maWxlT2Zmc2V0OwogICAgICB9CiAgICB9CgogICAgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKTsKICB9CgogIHZvaWQgY2hlY2tBc3luY1JldHVyblR5cGUoQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciwgRGFydFR5cGUgcmV0dXJuVHlwZSwKICAgICAgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIC8vIEZvciBhc3luYywgYXN5bmMqLCBhbmQgc3luYyogZnVuY3Rpb25zIHdpdGggZGVjbGFyZWQgcmV0dXJuIHR5cGVzLCB3ZQogICAgLy8gbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aG9zZSB0eXBlcyBhcmUgdmFsaWQuCiAgICAvLyBXZSB1c2UgdGhlIHNhbWUgdHJpY2sgaW4gZWFjaCBjYXNlIGJlbG93LiBGb3IgZXhhbXBsZSB0byBkZWNpZGUgd2hldGhlcgogICAgLy8gRnV0dXJlPFQ+IDw6IFtyZXR1cm5UeXBlXSBmb3IgZXZlcnkgVCwgd2UgcmVseSBvbiBGdXR1cmU8Qm90PiBhbmQKICAgIC8vIHRyYW5zaXRpdml0eSBvZiB0aGUgc3VidHlwaW5nIHJlbGF0aW9uIGJlY2F1c2UgRnV0dXJlPEJvdD4gPDogRnV0dXJlPFQ+CiAgICAvLyBmb3IgZXZlcnkgVC4KCiAgICAvLyBXZSB1c2UgW3Byb2JsZW0gPT0gbnVsbF0gdG8gc2lnbmFsIHN1Y2Nlc3MuCiAgICBNZXNzYWdlIHByb2JsZW07CiAgICBzd2l0Y2ggKGFzeW5jTW9kaWZpZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luYzoKICAgICAgICBEYXJ0VHlwZSBmdXR1cmVCb3R0b21UeXBlID0gbGlicmFyeUJ1aWxkZXIubG9hZGVyLmZ1dHVyZU9mQm90dG9tOwogICAgICAgIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGZ1dHVyZUJvdHRvbVR5cGUsIHJldHVyblR5cGUsCiAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsQXN5bmNSZXR1cm5UeXBlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgIERhcnRUeXBlIHN0cmVhbUJvdHRvbVR5cGUgPSBsaWJyYXJ5QnVpbGRlci5sb2FkZXIuc3RyZWFtT2ZCb3R0b207CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgIHByb2JsZW0gPSBmYXN0YS5tZXNzYWdlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGU7CiAgICAgICAgfSBlbHNlIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKHN0cmVhbUJvdHRvbVR5cGUsIHJldHVyblR5cGUsCiAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgcHJvYmxlbSA9IGZhc3RhLm1lc3NhZ2VJbGxlZ2FsQXN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgRGFydFR5cGUgaXRlcmFibGVCb3R0b21UeXBlID0gbGlicmFyeUJ1aWxkZXIubG9hZGVyLml0ZXJhYmxlT2ZCb3R0b207CiAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgIHByb2JsZW0gPSBmYXN0YS5tZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZTsKICAgICAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoaXRlcmFibGVCb3R0b21UeXBlLCByZXR1cm5UeXBlLAogICAgICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpIHsKICAgICAgICAgIHByb2JsZW0gPSBmYXN0YS5tZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luYzoKICAgICAgICBicmVhazsgLy8gc2tpcAogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICB1bmV4cGVjdGVkKCJhc3luYywgYXN5bmMqLCBzeW5jLCBvciBzeW5jKiIsICIkYXN5bmNNb2RpZmllciIsCiAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCB1cmkpOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmIChwcm9ibGVtICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhoaWxsZXJzdHJvbSk6IG9uY2UgdHlwZXMgZ2V0IGFubm90YXRlZCB3aXRoIGxvY2F0aW9uCiAgICAgIC8vIGluZm9ybWF0aW9uLCB3ZSBjYW4gaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB0aGUgZXJyb3IgbWVzc2FnZSBieQogICAgICAvLyB1c2luZyB0aGUgb2Zmc2V0IG9mIFtyZXR1cm5UeXBlXSAoYW5kIHRoZSBsZW5ndGggb2YgaXRzIG5hbWUpLgogICAgICBhZGRQcm9ibGVtKHByb2JsZW0sIGNoYXJPZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgfQoKICAvLy8gRW5zdXJlIHRoYXQgdGhlIGNvbnRhaW5pbmcgbGlicmFyeSBvZiB0aGUgW21lbWJlcl0gaGFzIGJlZW4gbG9hZGVkLgogIC8vLwogIC8vLyBUaGlzIGlzIGZvciBpbnN0YW5jZSBpbXBvcnRhbnQgZm9yIGxhenkgZGlsbCBsaWJyYXJ5IGJ1aWxkZXJzIHdoZXJlIHRoaXMKICAvLy8gbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgdG8gZW5zdXJlIHRoYXQKICAvLy8gYSkgVGhlIGxpYnJhcnkgaGFzIGJlZW4gZnVsbHkgbG9hZGVkIChhbmQgZm9yIGluc3RhbmNlIGFueSBpbnRlcm5hbAogIC8vLyAgICB0cmFuc2Zvcm1hdGlvbiBuZWVkZWQgaGFzIGJlZW4gcGVyZm9ybWVkKTsgYW5kCiAgLy8vIGIpIFRoZSBsaWJyYXJ5IGlzIGNvcnJlY3RseSBtYXJrZWQgYXMgYmVpbmcgdXNlZCB0byBhbGxvdyBmb3IgcHJvcGVyCiAgLy8vICAgICdkZXBlbmRlbmN5IHBydW5pbmcnLgogIHZvaWQgZW5zdXJlTG9hZGVkKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgTGlicmFyeSBlbnN1cmVMaWJyYXJ5TG9hZGVkID0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnk7CiAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0KICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIuYnVpbGRlcnNbZW5zdXJlTGlicmFyeUxvYWRlZC5pbXBvcnRVcmldID8/CiAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQuZGlsbFRhcmdldC5sb2FkZXIKICAgICAgICAgICAgICAgIC5idWlsZGVyc1tlbnN1cmVMaWJyYXJ5TG9hZGVkLmltcG9ydFVyaV07CiAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgYnVpbGRlci5lbnN1cmVMb2FkZWQoKTsKICAgIH0KICB9CgogIC8vLyBDaGVjayBpZiB0aGUgY29udGFpbmluZyBsaWJyYXJ5IG9mIHRoZSBbbWVtYmVyXSBoYXMgYmVlbiBsb2FkZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIGFzc2VydHMuCiAgLy8vIFNlZSBbZW5zdXJlTG9hZGVkXSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0ICdsb2FkZWQnIG1lYW5zIGFuZCB0aGUgaWRlYXMKICAvLy8gYmVoaW5kIHRoYXQuCiAgYm9vbCBpc0xvYWRlZChNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyID09IG51bGwpIHJldHVybiB0cnVlOwogICAgTGlicmFyeSBlbnN1cmVMaWJyYXJ5TG9hZGVkID0gbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnk7CiAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0KICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIuYnVpbGRlcnNbZW5zdXJlTGlicmFyeUxvYWRlZC5pbXBvcnRVcmldID8/CiAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQuZGlsbFRhcmdldC5sb2FkZXIKICAgICAgICAgICAgICAgIC5idWlsZGVyc1tlbnN1cmVMaWJyYXJ5TG9hZGVkLmltcG9ydFVyaV07CiAgICBpZiAoYnVpbGRlciBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkZXIuaXNCdWlsdEFuZE1hcmtlZDsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCByZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpIHsKICAgIGZvciAoU3RhdGljSW52b2NhdGlvbiBpbnZvY2F0aW9uIGluIHJlZGlyZWN0aW5nRmFjdG9yeUludm9jYXRpb25zKSB7CiAgICAgIC8vIElmIHRoZSBpbnZvY2F0aW9uIHdhcyBpbnZhbGlkLCBpdCBvciBpdHMgcGFyZW50IGhhcyBhbHJlYWR5IGJlZW4KICAgICAgLy8gZGVzdWdhcmVkIGludG8gYW4gZXhjZXB0aW9uIHRocm93aW5nIGV4cHJlc3Npb24uICBUaGVyZSBpcyBub3RoaW5nIHRvCiAgICAgIC8vIHJlc29sdmUgYW55bW9yZS4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaW52b2NhdGlvbidzIHBhcmVudAogICAgICAvLyB3YXMgaW52YWxpZCwgdHlwZSBpbmZlcmVuY2Ugd29uJ3QgcmVhY2ggdGhlIGludm9jYXRpb24gbm9kZSBhbmQgd29uJ3QKICAgICAgLy8gc2V0IGl0cyBpbmZlcnJlZFR5cGUgZmllbGQuICBJZiB0eXBlIGluZmVyZW5jZSBpcyBkaXNhYmxlZCwgcmVhY2ggdG8KICAgICAgLy8gdGhlIG91dGVybW9zdCBwYXJlbnQgdG8gY2hlY2sgaWYgdGhlIG5vZGUgaXMgYSBkZWFkIGNvZGUuCiAgICAgIGlmIChpbnZvY2F0aW9uLnBhcmVudCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgaWYgKHR5cGVJbmZlcnJlciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGludm9jYXRpb24gaXMgRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50ICYmCiAgICAgICAgICAgICFpbnZvY2F0aW9uLmhhc0JlZW5JbmZlcnJlZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIFRyZWVOb2RlIHBhcmVudCA9IGludm9jYXRpb24ucGFyZW50OwogICAgICAgIHdoaWxlIChwYXJlbnQgaXMhIENvbXBvbmVudCAmJiBwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgfQoKICAgICAgUHJvY2VkdXJlIGluaXRpYWxUYXJnZXQgPSBpbnZvY2F0aW9uLnRhcmdldDsKICAgICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudE5vZGU7CgogICAgICBSZWRpcmVjdGlvblRhcmdldCByZWRpcmVjdGlvblRhcmdldCA9CiAgICAgICAgICBnZXRSZWRpcmVjdGlvblRhcmdldChpbml0aWFsVGFyZ2V0LCB0aGlzKTsKICAgICAgTWVtYmVyIHJlc29sdmVkVGFyZ2V0ID0gcmVkaXJlY3Rpb25UYXJnZXQ/LnRhcmdldDsKCiAgICAgIGlmIChyZXNvbHZlZFRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBjb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhpbml0aWFsVGFyZ2V0Lm5hbWUubmFtZSwKICAgICAgICAgICAgY2xhc3NOYW1lOiBpbml0aWFsVGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUpOwogICAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBSZXBvcnQgdGhpcyBlcnJvciBlYXJsaWVyLgogICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBpbml0aWFsVGFyZ2V0LmZpbGVPZmZzZXQsCiAgICAgICAgICAgIG5hbWUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZXNvbHZlZFRhcmdldCBpcyBDb25zdHJ1Y3RvciAmJgogICAgICAgICAgcmVzb2x2ZWRUYXJnZXQuZW5jbG9zaW5nQ2xhc3MuaXNBYnN0cmFjdCkgewogICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICAgICAgICBmb3Jlc3QuY3JlYXRlQXJndW1lbnRzKG5vTG9jYXRpb24sIGludm9jYXRpb24uYXJndW1lbnRzLnBvc2l0aW9uYWwsCiAgICAgICAgICAgICAgICB0eXBlczogaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICAgICAgICBuYW1lZDogaW52b2NhdGlvbi5hcmd1bWVudHMubmFtZWQpLAogICAgICAgICAgICBidWlsZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUFic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbgogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHJlc29sdmVkVGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWUpLAogICAgICAgICAgICAgICAgcmVzb2x2ZWRUYXJnZXQuZW5jbG9zaW5nQ2xhc3MubmFtZSwKICAgICAgICAgICAgICAgIGluaXRpYWxUYXJnZXQuZmlsZU9mZnNldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkgcmVkaXJlY3RpbmdGYWN0b3J5Qm9keSA9CiAgICAgICAgICAgIGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkocmVzb2x2ZWRUYXJnZXQpOwogICAgICAgIGlmIChyZWRpcmVjdGluZ0ZhY3RvcnlCb2R5ICE9IG51bGwpIHsKICAgICAgICAgIC8vIElmIHRoZSByZWRpcmVjdGlvbiB0YXJnZXQgaXMgaXRzZWxmIGEgcmVkaXJlY3RpbmcgZmFjdG9yeSwgaXQgbWVhbnMKICAgICAgICAgIC8vIHRoYXQgaXQgaXMgdW5yZXNvbHZlZC4KICAgICAgICAgIGFzc2VydChyZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LmlzVW5yZXNvbHZlZCk7CiAgICAgICAgICBTdHJpbmcgZXJyb3JOYW1lID0gcmVkaXJlY3RpbmdGYWN0b3J5Qm9keS51bnJlc29sdmVkTmFtZTsKICAgICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU1ldGhvZE5vdEZvdW5kLndpdGhBcmd1bWVudHMoZXJyb3JOYW1lKSwKICAgICAgICAgICAgICBpbnZvY2F0aW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgaW5pdGlhbFRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICBpbnZvY2F0aW9uLmFyZ3VtZW50cy50eXBlcyk7CiAgICAgICAgICBpbnZvY2F0aW9uLmFyZ3VtZW50cy50eXBlcy5jbGVhcigpOwogICAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMubGVuZ3RoID0KICAgICAgICAgICAgICByZWRpcmVjdGlvblRhcmdldC50eXBlQXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXNbaV0gPQogICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHJlZGlyZWN0aW9uVGFyZ2V0LnR5cGVBcmd1bWVudHNbaV0pOwogICAgICAgICAgfQoKICAgICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICByZXNvbHZlZFRhcmdldCwKICAgICAgICAgICAgICBmb3Jlc3QuY3JlYXRlQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBub0xvY2F0aW9uLCBpbnZvY2F0aW9uLmFyZ3VtZW50cy5wb3NpdGlvbmFsLAogICAgICAgICAgICAgICAgICB0eXBlczogaW52b2NhdGlvbi5hcmd1bWVudHMudHlwZXMsCiAgICAgICAgICAgICAgICAgIG5hbWVkOiBpbnZvY2F0aW9uLmFyZ3VtZW50cy5uYW1lZCksCiAgICAgICAgICAgICAgY29uc3RuZXNzOiBpbnZvY2F0aW9uLmlzQ29uc3QKICAgICAgICAgICAgICAgICAgPyBDb25zdG5lc3MuZXhwbGljaXRDb25zdAogICAgICAgICAgICAgICAgICA6IENvbnN0bmVzcy5leHBsaWNpdE5ldywKICAgICAgICAgICAgICBjaGFyT2Zmc2V0OiBpbnZvY2F0aW9uLmZpbGVPZmZzZXQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaW52b2NhdGlvbi5yZXBsYWNlV2l0aChyZXBsYWNlbWVudE5vZGUpOwogICAgfQogICAgcmVkaXJlY3RpbmdGYWN0b3J5SW52b2NhdGlvbnMuY2xlYXIoKTsKICB9CgogIHZvaWQgZmluaXNoVmFyaWFibGVNZXRhZGF0YSgpIHsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzV2l0aE1ldGFkYXRhID0KICAgICAgICB0aGlzLnZhcmlhYmxlc1dpdGhNZXRhZGF0YTsKICAgIHRoaXMudmFyaWFibGVzV2l0aE1ldGFkYXRhID0gbnVsbDsKICAgIExpc3Q8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPj4gbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGEgPQogICAgICAgIHRoaXMubXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGE7CiAgICB0aGlzLm11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhID0gbnVsbDsKCiAgICBpZiAodmFyaWFibGVzV2l0aE1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXNXaXRoTWV0YWRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICBpbmZlckFubm90YXRpb25zKAogICAgICAgICAgICB2YXJpYWJsZXNXaXRoTWV0YWRhdGFbaV0sIHZhcmlhYmxlc1dpdGhNZXRhZGF0YVtpXS5hbm5vdGF0aW9ucyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXVsdGlWYXJpYWJsZXNXaXRoTWV0YWRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9IG11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhW2ldOwogICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSB2YXJpYWJsZXMuZmlyc3QuYW5ub3RhdGlvbnM7CiAgICAgICAgaW5mZXJBbm5vdGF0aW9ucyh2YXJpYWJsZXMuZmlyc3QsIGFubm90YXRpb25zKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY2xvbmVyID8/PSBuZXcgQ2xvbmVWaXNpdG9yTm90TWVtYmVycygpOwogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IHZhcmlhYmxlc1tpXTsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyaWFibGUuYWRkQW5ub3RhdGlvbihjbG9uZXIuY2xvbmUoYW5ub3RhdGlvbnNbaV0pKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIExpc3Q8RXhwcmVzc2lvbj4gZmluaXNoTWV0YWRhdGEoVHJlZU5vZGUgcGFyZW50KSB7CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gcG9wKCk7CiAgICBpbmZlckFubm90YXRpb25zKHBhcmVudCwgZXhwcmVzc2lvbnMpOwoKICAgIC8vIFRoZSBpbnZvY2F0aW9uIG9mIFtyZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0c10gYmVsb3cgbWF5IGNoYW5nZSB0aGUKICAgIC8vIHJvb3Qgbm9kZXMgb2YgdGhlIGFubm90YXRpb24gZXhwcmVzc2lvbnMuICBXZSBuZWVkIHRvIGhhdmUgYSBwYXJlbnQgb2YKICAgIC8vIHRoZSBhbm5vdGF0aW9uIG5vZGVzIGJlZm9yZSB0aGUgcmVzb2x1dGlvbiBpcyBwZXJmb3JtZWQsIHRvIGNvbGxlY3QgYW5kCiAgICAvLyByZXR1cm4gdGhlbSBsYXRlci4gIElmIFtwYXJlbnRdIGlzIG5vdCBwcm92aWRlZCwgW3RlbXBvcmFyeVBhcmVudF0gaXMKICAgIC8vIHVzZWQuCiAgICBMaXN0TGl0ZXJhbCB0ZW1wb3JhcnlQYXJlbnQ7CgogICAgaWYgKHBhcmVudCBpcyBDbGFzcykgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBMaWJyYXJ5KSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIExpYnJhcnlEZXBlbmRlbmN5KSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIExpYnJhcnlQYXJ0KSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIE1lbWJlcikgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBUeXBlZGVmKSB7CiAgICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIGV4cHJlc3Npb25zKSB7CiAgICAgICAgcGFyZW50LmFkZEFubm90YXRpb24oZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFyZW50IGlzIFR5cGVQYXJhbWV0ZXIpIHsKICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gZXhwcmVzc2lvbnMpIHsKICAgICAgICBwYXJlbnQuYWRkQW5ub3RhdGlvbihleHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJlbnQgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0ZW1wb3JhcnlQYXJlbnQgPSBuZXcgTGlzdExpdGVyYWwoZXhwcmVzc2lvbnMpOwogICAgfQogICAgcmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIGZpbmlzaFZhcmlhYmxlTWV0YWRhdGEoKTsKICAgIHJldHVybiB0ZW1wb3JhcnlQYXJlbnQgIT0gbnVsbCA/IHRlbXBvcmFyeVBhcmVudC5leHByZXNzaW9ucyA6IGV4cHJlc3Npb25zOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBwYXJzZVNpbmdsZUV4cHJlc3Npb24oCiAgICAgIFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuLCBGdW5jdGlvbk5vZGUgcGFyYW1ldGVycykgewogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlUGFyYW1ldGVyQnVpbGRlcnM7CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciBpbiBwYXJhbWV0ZXJzLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJCdWlsZGVycyA/Pz0gPFR5cGVWYXJpYWJsZUJ1aWxkZXI+W107CiAgICAgIHR5cGVQYXJhbWV0ZXJCdWlsZGVycy5hZGQoCiAgICAgICAgICBuZXcgVHlwZVZhcmlhYmxlQnVpbGRlci5mcm9tS2VybmVsKHR5cGVQYXJhbWV0ZXIsIGxpYnJhcnlCdWlsZGVyKSk7CiAgICB9CiAgICBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKHR5cGVQYXJhbWV0ZXJCdWlsZGVycyk7CgogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0KICAgICAgICBwYXJhbWV0ZXJzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwCiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICA6IG5ldyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KAogICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsID0gcGFyYW1ldGVycy5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgZm9ybWFsc1tpXSA9IG5ldyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgICAgbnVsbCwgMCwgbnVsbCwgZm9ybWFsLm5hbWUsIGxpYnJhcnlCdWlsZGVyLCBmb3JtYWwuZmlsZU9mZnNldCwgdXJpKQogICAgICAgIC4udmFyaWFibGUgPSBmb3JtYWw7CiAgICB9CiAgICBlbnRlckxvY2FsU2NvcGUoCiAgICAgICAgbnVsbCwKICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVycyhmb3JtYWxzLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIG5vTGVuZ3RoLCB1cmkpCiAgICAgICAgICAgIC5jb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoc2NvcGUsIG1lbWJlciwgdGhpcykpOwoKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihwYXJzZXIuc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbikpOwoKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBUb2tlbiBlb2YgPSB0b2tlbi5uZXh0OwoKICAgIGlmICghZW9mLmlzRW9mKSB7CiAgICAgIGV4cHJlc3Npb24gPSB3cmFwSW5Mb2NhdGVkUHJvYmxlbSgKICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICBmYXN0YS5tZXNzYWdlRXhwZWN0ZWRPbmVFeHByZXNzaW9uCiAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGVvZi5jaGFyT2Zmc2V0LCBlb2YubGVuZ3RoKSk7CiAgICB9CgogICAgUmV0dXJuU3RhdGVtZW50SW1wbCBmYWtlUmV0dXJuID0gbmV3IFJldHVyblN0YXRlbWVudEltcGwodHJ1ZSwgZXhwcmVzc2lvbik7CgogICAgdHlwZUluZmVycmVyPy5pbmZlckZ1bmN0aW9uQm9keSgKICAgICAgICB0aGlzLCBjb25zdCBEeW5hbWljVHlwZSgpLCBBc3luY01hcmtlci5TeW5jLCBmYWtlUmV0dXJuKTsKCiAgICByZXR1cm4gZmFrZVJldHVybi5leHByZXNzaW9uOwogIH0KCiAgdm9pZCBwYXJzZUluaXRpYWxpemVycyhUb2tlbiB0b2tlbikgewogICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIodGhpcyk7CiAgICBpZiAoIXRva2VuLmlzRW9mKSB7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlSW5pdGlhbGl6ZXJzKHRva2VuKTsKICAgICAgY2hlY2tFbXB0eSh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCk7CiAgICB9CiAgICAvLyBXZSBhcmUgcGFzc2luZyBbQXN5bmNNYXJrZXIuU3luY10gYmVjYXVzZSB0aGUgZXJyb3Igd2lsbCBiZSByZXBvcnRlZAogICAgLy8gYWxyZWFkeS4KICAgIGZpbmlzaENvbnN0cnVjdG9yKG1lbWJlciwgQXN5bmNNYXJrZXIuU3luYywgbnVsbCk7CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIodGhpcyk7CiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24ocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICBFeHByZXNzaW9uIHBhcnNlQW5ub3RhdGlvbihUb2tlbiB0b2tlbikgewogICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIodGhpcyk7CiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZU1ldGFkYXRhKHBhcnNlci5zeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSk7CiAgICBFeHByZXNzaW9uIGFubm90YXRpb24gPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgICByZXR1cm4gYW5ub3RhdGlvbjsKICB9CgogIHZvaWQgZmluaXNoQ29uc3RydWN0b3IoCiAgICAgIENvbnN0cnVjdG9yQnVpbGRlciBidWlsZGVyLCBBc3luY01hcmtlciBhc3luY01vZGlmaWVyLCBTdGF0ZW1lbnQgYm9keSkgewogICAgLy8vIFF1b3RlcyBiZWxvdyBhcmUgZnJvbSBbRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCA0dGgKICAgIC8vLyBFZGl0aW9uXSgKICAgIC8vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS00MDgucGRmKS4KICAgIGFzc2VydChidWlsZGVyID09IG1lbWJlcik7CiAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGJ1aWxkZXIuYWN0dWFsQ29uc3RydWN0b3I7CiAgICBpZiAoX2luaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gX2luaXRpYWxpemVycykgewogICAgICAgIHR5cGVJbmZlcnJlcj8uaW5mZXJJbml0aWFsaXplcih0aGlzLCBpbml0aWFsaXplcik7CiAgICAgIH0KICAgICAgaWYgKCFidWlsZGVyLmlzRXh0ZXJuYWwpIHsKICAgICAgICBmb3IgKEluaXRpYWxpemVyIGluaXRpYWxpemVyIGluIF9pbml0aWFsaXplcnMpIHsKICAgICAgICAgIGJ1aWxkZXIuYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIsIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFzeW5jTW9kaWZpZXIgIT0gQXN5bmNNYXJrZXIuU3luYykgewogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKGJ1aWxkSW52YWxpZEluaXRpYWxpemVyKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3Rvck5vdFN5bmMsIGJvZHkuZmlsZU9mZnNldCwgbm9MZW5ndGgpKSk7CiAgICB9CiAgICBpZiAobmVlZHNJbXBsaWNpdFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgLy8vID5JZiBubyBzdXBlcmluaXRpYWxpemVyIGlzIHByb3ZpZGVkLCBhbiBpbXBsaWNpdCBzdXBlcmluaXRpYWxpemVyCiAgICAgIC8vLyA+b2YgdGhlIGZvcm0gc3VwZXIoKSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIGvigJlzIGluaXRpYWxpemVyIGxpc3QsCiAgICAgIC8vLyA+dW5sZXNzIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgY2xhc3MgT2JqZWN0LgogICAgICBDb25zdHJ1Y3RvciBzdXBlclRhcmdldCA9IGxvb2t1cENvbnN0cnVjdG9yKGVtcHR5TmFtZSwgaXNTdXBlcjogdHJ1ZSk7CiAgICAgIEluaXRpYWxpemVyIGluaXRpYWxpemVyOwogICAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gZm9yZXN0LmNyZWF0ZUFyZ3VtZW50c0VtcHR5KG5vTG9jYXRpb24pOwogICAgICBpZiAoc3VwZXJUYXJnZXQgPT0gbnVsbCB8fAogICAgICAgICAgY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbihzdXBlclRhcmdldC5mdW5jdGlvbiwgYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICBidWlsZGVyLmNoYXJPZmZzZXQsIGNvbnN0IDxUeXBlUGFyYW1ldGVyPltdKSAhPQogICAgICAgICAgICAgIG51bGwpIHsKICAgICAgICBTdHJpbmcgc3VwZXJjbGFzcyA9IGNsYXNzQnVpbGRlci5zdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnM7CiAgICAgICAgaW50IGxlbmd0aCA9IGNvbnN0cnVjdG9yLm5hbWUubmFtZS5sZW5ndGg7CiAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBsZW5ndGggPSAoY29uc3RydWN0b3IucGFyZW50IGFzIENsYXNzKS5uYW1lLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgaW5pdGlhbGl6ZXIgPSBidWlsZEludmFsaWRJbml0aWFsaXplcigKICAgICAgICAgICAgYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcmNsYXNzKSwKICAgICAgICAgICAgICAgIGJ1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGxlbmd0aCksCiAgICAgICAgICAgIGJ1aWxkZXIuY2hhck9mZnNldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5pdGlhbGl6ZXIgPSBidWlsZFN1cGVySW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIHRydWUsIHN1cGVyVGFyZ2V0LCBhcmd1bWVudHMsIGJ1aWxkZXIuY2hhck9mZnNldCk7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplcik7CiAgICB9CiAgICBzZXRQYXJlbnRzKGNvbnN0cnVjdG9yLmluaXRpYWxpemVycywgY29uc3RydWN0b3IpOwogICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRyYW5zZm9ybUxpc3RQb3N0SW5mZXJlbmNlKGNvbnN0cnVjdG9yLmluaXRpYWxpemVycywKICAgICAgICB0cmFuc2Zvcm1TZXRMaXRlcmFscywgdHJhbnNmb3JtQ29sbGVjdGlvbnMsIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpOwogICAgaWYgKGJvZHkgPT0gbnVsbCkgewogICAgICAvLy8gPklmIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBjIGlzIG5vdCBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yCiAgICAgIC8vLyA+YW5kIG5vIGJvZHkgaXMgcHJvdmlkZWQsIHRoZW4gYyBpbXBsaWNpdGx5IGhhcyBhbiBlbXB0eSBib2R5IHt9LgogICAgICAvLy8gV2UgdXNlIGFuIGVtcHR5IHN0YXRlbWVudCBpbnN0ZWFkLgogICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ID0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLmJvZHkucGFyZW50ID0gY29uc3RydWN0b3IuZnVuY3Rpb247CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkV4cHJlc3Npb25TdGF0ZW1lbnQiKTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBwb3BGb3JFZmZlY3QoKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQXJndW1lbnRzIik7CiAgICBMaXN0PE9iamVjdD4gYXJndW1lbnRzID0gY291bnQgPT0gMAogICAgICAgID8gPE9iamVjdD5bXQogICAgICAgIDogY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY291bnQpOwogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KGJlZ2luVG9rZW4uY2hhck9mZnNldCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgT2JqZWN0IG5vZGUgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChub2RlIGlzIE5hbWVkRXhwcmVzc2lvbikgewogICAgICAgIGZpcnN0TmFtZWRBcmd1bWVudEluZGV4ID0KICAgICAgICAgICAgaSA8IGZpcnN0TmFtZWRBcmd1bWVudEluZGV4ID8gaSA6IGZpcnN0TmFtZWRBcmd1bWVudEluZGV4OwogICAgICB9IGVsc2UgewogICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnQgPSB0b1ZhbHVlKG5vZGUpOwogICAgICAgIGFyZ3VtZW50c1tpXSA9IGFyZ3VtZW50OwogICAgICAgIGlmIChpID4gZmlyc3ROYW1lZEFyZ3VtZW50SW5kZXgpIHsKICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IG5ldyBOYW1lZEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgIiMkaSIsCiAgICAgICAgICAgICAgYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VFeHBlY3RlZE5hbWVkQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LmZpbGVPZmZzZXQsIG5vTGVuZ3RoKSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGZpcnN0TmFtZWRBcmd1bWVudEluZGV4IDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgICBMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWwgPSBuZXcgTGlzdDxFeHByZXNzaW9uPi5mcm9tKAogICAgICAgICAgYXJndW1lbnRzLmdldFJhbmdlKDAsIGZpcnN0TmFtZWRBcmd1bWVudEluZGV4KSk7CiAgICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZCA9IG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4uZnJvbSgKICAgICAgICAgIGFyZ3VtZW50cy5nZXRSYW5nZShmaXJzdE5hbWVkQXJndW1lbnRJbmRleCwgYXJndW1lbnRzLmxlbmd0aCkpOwogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVBcmd1bWVudHMoYmVnaW5Ub2tlbi5vZmZzZXQsIHBvc2l0aW9uYWwsIG5hbWVkOiBuYW1lZCkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhrbWlsbGlraW4pOiBGaW5kIGEgd2F5IHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBzZWNvbmQgbGlzdCBpbiB0aGUKICAgICAgLy8gY2FzZSB3aGVyZSB0aGVyZSB3ZXJlIG5vIG5hbWVkIGFyZ3VtZW50cywgd2hpY2ggaXMgYSBjb21tb24gb25lLgogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVBcmd1bWVudHMoCiAgICAgICAgICBiZWdpblRva2VuLm9mZnNldCwgbmV3IExpc3Q8RXhwcmVzc2lvbj4uZnJvbShhcmd1bWVudHMpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlBhcmVudGhlc2l6ZWRDb25kaXRpb24iKTsKICAgIHB1c2gocG9wRm9yVmFsdWUoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIpOwogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IHBvcEZvclZhbHVlKCk7CiAgICBpZiAodmFsdWUgaXMgU2hhZG93TGFyZ2VJbnRMaXRlcmFsKSB7CiAgICAgIC8vIFdlIG5lZWQgdG8ga25vdyB0aGF0IHRoZSBleHByZXNzaW9uIHdhcyBwYXJlbnRoZXNpemVkIGJlY2F1c2Ugd2Ugd2lsbAogICAgICAvLyB0cmVhdCAtbiBkaWZmZXJlbnRseSBmcm9tIC0obikuICBJZiB0aGUgZXhwcmVzc2lvbiBvY2N1cnMgaW4gYSBkb3VibGUKICAgICAgLy8gY29udGV4dCwgLW4gaXMgYSBkb3VibGUgbGl0ZXJhbCBhbmQgLShuKSBpcyBhbiBhcHBsaWNhdGlvbiBvZiB1bmFyeS0gdG8KICAgICAgLy8gYW4gaW50ZWdlciBsaXRlcmFsLiAgQW5kIGluIGFueSBvdGhlciBjb250ZXh0LCAnLScgaXMgcGFydCBvZiB0aGUKICAgICAgLy8gc3ludGF4IG9mIC1uLCBpLmUuLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCBpcyBPSyBhbmQgaXQgaXMgdGhlIG1pbmltdW0KICAgICAgLy8gNjQtYml0IGludGVnZXIsIGFuZCAnLScgaXMgYW4gYXBwbGljYXRpb24gb2YgdW5hcnktIGluIC0obiksIGkuZS4sCiAgICAgIC8vIC0oOTIyMzM3MjAzNjg1NDc3NTgwOCkgaXMgYW4gZXJyb3IgYmVjYXVzZSB0aGUgbGl0ZXJhbCBkb2VzIG5vdCBmaXQgaW4KICAgICAgLy8gNjQtYml0cy4KICAgICAgcHVzaCh2YWx1ZS4uaXNQYXJlbnRoZXNpemVkID0gdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkdlbmVyYXRvcih0aGlzLCB0b2tlbi5lbmRHcm91cCwgdmFsdWUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2VuZChUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUoYmVnaW5Ub2tlbiwgWwogICAgICBWYWx1ZUtpbmRzLkFyZ3VtZW50c09yTnVsbCwKICAgICAgVmFsdWVLaW5kcy5UeXBlQXJndW1lbnRzT3JOdWxsLAogICAgICB1bmlvbk9mS2luZHMoWwogICAgICAgIFZhbHVlS2luZHMuRXhwcmVzc2lvbiwKICAgICAgICBWYWx1ZUtpbmRzLkdlbmVyYXRvciwKICAgICAgICBWYWx1ZUtpbmRzLklkZW50aWZpZXIsCiAgICAgICAgVmFsdWVLaW5kcy5QYXJzZXJSZWNvdmVyeSwKICAgICAgICBWYWx1ZUtpbmRzLlByb2JsZW1CdWlsZGVyCiAgICAgIF0pCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJTZW5kIik7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gcG9wKCk7CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzID0gcG9wKCk7CiAgICBPYmplY3QgcmVjZWl2ZXIgPSBwb3AoKTsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykuaXNFbXB0eSk7CiAgICAgIGZvcmVzdC5hcmd1bWVudHNTZXRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLCBidWlsZERhcnRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh0eXBlQXJndW1lbnRzID09IG51bGwpOwogICAgfQogICAgaWYgKHJlY2VpdmVyIGlzIElkZW50aWZpZXIpIHsKICAgICAgTmFtZSBuYW1lID0gbmV3IE5hbWUocmVjZWl2ZXIubmFtZSwgbGlicmFyeUJ1aWxkZXIubmFtZU9yaWdpbik7CiAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IEluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcih0aGlzLCBiZWdpblRva2VuLCBuYW1lKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaChuZXcgU2VuZEFjY2Vzc0dlbmVyYXRvcih0aGlzLCBiZWdpblRva2VuLCBuYW1lLCBhcmd1bWVudHMpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBwdXNoKHJlY2VpdmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZmluaXNoU2VuZChyZWNlaXZlciwgYXJndW1lbnRzLCBiZWdpblRva2VuLmNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGZpbmlzaFNlbmQoT2JqZWN0IHJlY2VpdmVyLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCkgewogICAgaWYgKHJlY2VpdmVyIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gcmVjZWl2ZXIuZG9JbnZvY2F0aW9uKGNoYXJPZmZzZXQsIGFyZ3VtZW50cyk7CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHJldHVybiBuZXcgUGFyc2VyRXJyb3JHZW5lcmF0b3IodGhpcywgbnVsbCwgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmb3Jlc3QuY3JlYXRlRXhwcmVzc2lvbkludm9jYXRpb24oCiAgICAgICAgICBjaGFyT2Zmc2V0LCB0b1ZhbHVlKHJlY2VpdmVyKSwgYXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXNjYWRlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNhc2NhZGUiKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBDYXNjYWRlKSB7CiAgICAgIHB1c2goZXhwcmVzc2lvbik7CiAgICAgIHB1c2goX2NyZWF0ZVJlYWRPbmx5VmFyaWFibGVBY2Nlc3MoCiAgICAgICAgICBleHByZXNzaW9uLnZhcmlhYmxlLCB0b2tlbiwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCBudWxsKSk7CiAgICB9IGVsc2UgewogICAgICBib29sIGlzTnVsbEF3YXJlID0gb3B0aW9uYWwoJz8uLicsIHRva2VuKTsKICAgICAgaWYgKGlzTnVsbEF3YXJlICYmICFsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgICAgcmVwb3J0TWlzc2luZ05vbk51bGxhYmxlU3VwcG9ydCh0b2tlbik7CiAgICAgIH0KICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgICBmb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKGV4cHJlc3Npb24pOwogICAgICBwdXNoKG5ldyBDYXNjYWRlKHZhcmlhYmxlLCBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0KTsKICAgICAgcHVzaChfY3JlYXRlUmVhZE9ubHlWYXJpYWJsZUFjY2VzcygKICAgICAgICAgIHZhcmlhYmxlLCB0b2tlbiwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCBudWxsKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhc2NhZGUoKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRDYXNjYWRlIik7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JFZmZlY3QoKTsKICAgIENhc2NhZGUgY2FzY2FkZVJlY2VpdmVyID0gcG9wKCk7CiAgICBjYXNjYWRlUmVjZWl2ZXIuYWRkQ2FzY2FkZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7CiAgICBwdXNoKGNhc2NhZGVSZWNlaXZlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2FzZUV4cHJlc3Npb24oVG9rZW4gY2FzZUtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ2FzZUV4cHJlc3Npb24iKTsKICAgIHN1cGVyLnB1c2goY29uc3RhbnRDb250ZXh0KTsKICAgIGNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2FzZUV4cHJlc3Npb24oVG9rZW4gY29sb24pIHsKICAgIGRlYnVnRXZlbnQoImVuZENhc2VFeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBzdXBlci5wdXNoKGV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGlmIChvcHRpb25hbCgiJiYiLCB0b2tlbikgfHwgb3B0aW9uYWwoInx8IiwgdG9rZW4pKSB7CiAgICAgIEV4cHJlc3Npb24gbGhzID0gcG9wRm9yVmFsdWUoKTsKICAgICAgdHlwZVByb21vdGVyPy5lbnRlckxvZ2ljYWxFeHByZXNzaW9uKGxocywgdG9rZW4uc3RyaW5nVmFsdWUpOwogICAgICBwdXNoKGxocyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkJpbmFyeUV4cHJlc3Npb24iKTsKICAgIGlmIChvcHRpb25hbCgiLiIsIHRva2VuKSB8fAogICAgICAgIG9wdGlvbmFsKCIuLiIsIHRva2VuKSB8fAogICAgICAgIG9wdGlvbmFsKCI/Li4iLCB0b2tlbikpIHsKICAgICAgZG9Eb3RPckNhc2NhZGVFeHByZXNzaW9uKHRva2VuKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoIiYmIiwgdG9rZW4pIHx8IG9wdGlvbmFsKCJ8fCIsIHRva2VuKSkgewogICAgICBkb0xvZ2ljYWxFeHByZXNzaW9uKHRva2VuKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoIj8/IiwgdG9rZW4pKSB7CiAgICAgIGRvSWZOdWxsKHRva2VuKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoIj8uIiwgdG9rZW4pKSB7CiAgICAgIGRvSWZOb3ROdWxsKHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvQmluYXJ5RXhwcmVzc2lvbih0b2tlbik7CiAgICB9CiAgfQoKICB2b2lkIGRvQmluYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUodG9rZW4sIDxWYWx1ZUtpbmQ+WwogICAgICB1bmlvbk9mS2luZHMoW1ZhbHVlS2luZHMuRXhwcmVzc2lvbiwgVmFsdWVLaW5kcy5HZW5lcmF0b3JdKSwKICAgICAgdW5pb25PZktpbmRzKFtWYWx1ZUtpbmRzLkV4cHJlc3Npb24sIFZhbHVlS2luZHMuR2VuZXJhdG9yXSksCiAgICBdKSk7CiAgICBFeHByZXNzaW9uIHJpZ2h0ID0gcG9wRm9yVmFsdWUoKTsKICAgIE9iamVjdCBsZWZ0ID0gcG9wKCk7CiAgICBpbnQgZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIFN0cmluZyBvcGVyYXRvciA9IHRva2VuLnN0cmluZ1ZhbHVlOwogICAgYm9vbCBpc05vdCA9IGlkZW50aWNhbCgiIT0iLCBvcGVyYXRvcik7CiAgICBpZiAoaXNOb3QgfHwgaWRlbnRpY2FsKCI9PSIsIG9wZXJhdG9yKSkgewogICAgICBpZiAobGVmdCBpcyBHZW5lcmF0b3IpIHsKICAgICAgICBwdXNoKGxlZnQuYnVpbGRFcXVhbHNPcGVyYXRpb24odG9rZW4sIHJpZ2h0LCBpc05vdDogaXNOb3QpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQobGVmdCBpcyBFeHByZXNzaW9uKTsKICAgICAgICBwdXNoKGZvcmVzdC5jcmVhdGVFcXVhbHMoZmlsZU9mZnNldCwgbGVmdCwgcmlnaHQsIGlzTm90OiBpc05vdCkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZShvcGVyYXRvcik7CiAgICAgIGlmICghaXNCaW5hcnlPcGVyYXRvcihvcGVyYXRvcikgJiYgIWlzTWludXNPcGVyYXRvcihvcGVyYXRvcikpIHsKICAgICAgICBpZiAoaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3Iob3BlcmF0b3IpKSB7CiAgICAgICAgICBwdXNoKGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdEJpbmFyeU9wZXJhdG9yLndpdGhBcmd1bWVudHModG9rZW4pLAogICAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgdG9rZW4ubGVuZ3RoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHB1c2goYnVpbGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlSW52YWxpZE9wZXJhdG9yLndpdGhBcmd1bWVudHModG9rZW4pLAogICAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLmxlbmd0aCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsZWZ0IGlzIEdlbmVyYXRvcikgewogICAgICAgIHB1c2gobGVmdC5idWlsZEJpbmFyeU9wZXJhdGlvbih0b2tlbiwgbmFtZSwgcmlnaHQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQobGVmdCBpcyBFeHByZXNzaW9uKTsKICAgICAgICBwdXNoKGZvcmVzdC5jcmVhdGVCaW5hcnkoZmlsZU9mZnNldCwgbGVmdCwgbmFtZSwgcmlnaHQpKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBkb0xvZ2ljYWxFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBFeHByZXNzaW9uIGFyZ3VtZW50ID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBwb3AoKTsKICAgIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24gPSBmb3Jlc3QuY3JlYXRlTG9naWNhbEV4cHJlc3Npb24oCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCByZWNlaXZlciwgdG9rZW4uc3RyaW5nVmFsdWUsIGFyZ3VtZW50KTsKICAgIHR5cGVQcm9tb3Rlcj8uZXhpdExvZ2ljYWxFeHByZXNzaW9uKGFyZ3VtZW50LCBsb2dpY2FsRXhwcmVzc2lvbik7CiAgICBwdXNoKGxvZ2ljYWxFeHByZXNzaW9uKTsKICB9CgogIC8vLyBIYW5kbGUgYGEgPz8gYmAuCiAgdm9pZCBkb0lmTnVsbChUb2tlbiB0b2tlbikgewogICAgRXhwcmVzc2lvbiBiID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24gYSA9IHBvcEZvclZhbHVlKCk7CiAgICBwdXNoKG5ldyBJZk51bGxFeHByZXNzaW9uKGEsIGIpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pKTsKICB9CgogIC8vLyBIYW5kbGUgYGE/LmIoLi4uKWAuCiAgdm9pZCBkb0lmTm90TnVsbChUb2tlbiB0b2tlbikgewogICAgT2JqZWN0IHNlbmQgPSBwb3AoKTsKICAgIGlmIChzZW5kIGlzIEluY29tcGxldGVTZW5kR2VuZXJhdG9yKSB7CiAgICAgIHB1c2goc2VuZC53aXRoUmVjZWl2ZXIocG9wKCksIHRva2VuLmNoYXJPZmZzZXQsIGlzTnVsbEF3YXJlOiB0cnVlKSk7CiAgICB9IGVsc2UgewogICAgICBwb3AoKTsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBwdXNoKGJ1aWxkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSk7CiAgICB9CiAgfQoKICB2b2lkIGRvRG90T3JDYXNjYWRlRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgT2JqZWN0IHNlbmQgPSBwb3AoKTsKICAgIGlmIChzZW5kIGlzIEluY29tcGxldGVTZW5kR2VuZXJhdG9yKSB7CiAgICAgIE9iamVjdCByZWNlaXZlciA9IG9wdGlvbmFsKCIuIiwgdG9rZW4pID8gcG9wKCkgOiBwb3BGb3JWYWx1ZSgpOwogICAgICBwdXNoKHNlbmQud2l0aFJlY2VpdmVyKHJlY2VpdmVyLCB0b2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgewogICAgICBwb3AoKTsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBwdXNoKGJ1aWxkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSk7CiAgICB9CiAgfQoKICBib29sIGFyZUFyZ3VtZW50c0NvbXBhdGlibGUoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICAvLyBUT0RPKGFoZSk6IEltcGxlbWVudCB0aGlzLgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgY2hhck9mZnNldCwKICAgICAge01lbWJlciBjYW5kaWRhdGUsCiAgICAgIGJvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNHZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzU2V0dGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2V9KSB7CiAgICBpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGg7CiAgICBpbnQgcGVyaW9kSW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCIuIik7CiAgICBpZiAocGVyaW9kSW5kZXggIT0gLTEpIHsKICAgICAgbGVuZ3RoIC09IHBlcmlvZEluZGV4ICsgMTsKICAgIH0KICAgIE5hbWUga2VybmVsTmFtZSA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnlCdWlsZGVyLm5hbWVPcmlnaW4pOwogICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dDsKICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCAmJiBjYW5kaWRhdGUubG9jYXRpb24gIT0gbnVsbCkgewogICAgICBVcmkgdXJpID0gY2FuZGlkYXRlLmxvY2F0aW9uLmZpbGU7CiAgICAgIGludCBvZmZzZXQgPSBjYW5kaWRhdGUuZmlsZU9mZnNldDsKICAgICAgTWVzc2FnZSBjb250ZXh0TWVzc2FnZTsKICAgICAgaW50IGxlbmd0aCA9IG5vTGVuZ3RoOwogICAgICBpZiAoY2FuZGlkYXRlIGlzIENvbnN0cnVjdG9yICYmIGNhbmRpZGF0ZS5pc1N5bnRoZXRpYykgewogICAgICAgIG9mZnNldCA9IGNhbmRpZGF0ZS5lbmNsb3NpbmdDbGFzcy5maWxlT2Zmc2V0OwogICAgICAgIGNvbnRleHRNZXNzYWdlID0gZmFzdGEudGVtcGxhdGVDYW5kaWRhdGVGb3VuZElzRGVmYXVsdENvbnN0cnVjdG9yCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGNhbmRpZGF0ZS5lbmNsb3NpbmdDbGFzcy5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY2FuZGlkYXRlIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgICAgICBpZiAoY2FuZGlkYXRlLm5hbWUubmFtZSA9PSAnJykgewogICAgICAgICAgICBsZW5ndGggPSBjYW5kaWRhdGUuZW5jbG9zaW5nQ2xhc3MubmFtZS5sZW5ndGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBBc3N1bWUgbm8gc3BhY2VzIGFyb3VuZCB0aGUgZG90LiBOb3QgcGVyZmVjdCwgYnV0IHByb2JhYmx5IHRoZQogICAgICAgICAgICAvLyBiZXN0IHdlIGNhbiBkbyB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUuCiAgICAgICAgICAgIGxlbmd0aCA9IGNhbmRpZGF0ZS5lbmNsb3NpbmdDbGFzcy5uYW1lLmxlbmd0aCArIDEgKyBuYW1lLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGVuZ3RoID0gbmFtZS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGNvbnRleHRNZXNzYWdlID0gZmFzdGEubWVzc2FnZUNhbmRpZGF0ZUZvdW5kOwogICAgICB9CiAgICAgIGNvbnRleHQgPSBbY29udGV4dE1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0LCBsZW5ndGgpXTsKICAgIH0KICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKICAgICAgaWYgKGlzR2V0dGVyKSB7CiAgICAgICAgbWVzc2FnZSA9IHdhcm5VbnJlc29sdmVkR2V0KGtlcm5lbE5hbWUsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyLCByZXBvcnRXYXJuaW5nOiBmYWxzZSwgY29udGV4dDogY29udGV4dCkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0gZWxzZSBpZiAoaXNTZXR0ZXIpIHsKICAgICAgICBtZXNzYWdlID0gd2FyblVucmVzb2x2ZWRTZXQoa2VybmVsTmFtZSwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsIHJlcG9ydFdhcm5pbmc6IGZhbHNlLCBjb250ZXh0OiBjb250ZXh0KQogICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtZXNzYWdlID0gd2FyblVucmVzb2x2ZWRNZXRob2Qoa2VybmVsTmFtZSwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsIHJlcG9ydFdhcm5pbmc6IGZhbHNlLCBjb250ZXh0OiBjb250ZXh0KQogICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICBtZXNzYWdlLm1lc3NhZ2VPYmplY3QsIG1lc3NhZ2UuY2hhck9mZnNldCwgbWVzc2FnZS5sZW5ndGgsCiAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZXNzYWdlIHdhcm5VbnJlc29sdmVkR2V0KE5hbWUgbmFtZSwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzU3VwZXI6IGZhbHNlLAogICAgICBib29sIHJlcG9ydFdhcm5pbmc6IHRydWUsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpc1N1cGVyCiAgICAgICAgPyBmYXN0YS50ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0dldHRlci53aXRoQXJndW1lbnRzKG5hbWUubmFtZSkKICAgICAgICA6IGZhc3RhLnRlbXBsYXRlR2V0dGVyTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpOwogICAgaWYgKHJlcG9ydFdhcm5pbmcpIHsKICAgICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBuYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gbWVzc2FnZTsKICB9CgogIEBvdmVycmlkZQogIE1lc3NhZ2Ugd2FyblVucmVzb2x2ZWRTZXQoTmFtZSBuYW1lLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgaXNTdXBlcjogZmFsc2UsCiAgICAgIGJvb2wgcmVwb3J0V2FybmluZzogdHJ1ZSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlzU3VwZXIKICAgICAgICA/IGZhc3RhLnRlbXBsYXRlU3VwZXJjbGFzc0hhc05vU2V0dGVyLndpdGhBcmd1bWVudHMobmFtZS5uYW1lKQogICAgICAgIDogZmFzdGEudGVtcGxhdGVTZXR0ZXJOb3RGb3VuZC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSk7CiAgICBpZiAocmVwb3J0V2FybmluZykgewogICAgICBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBtZXNzYWdlOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVzc2FnZSB3YXJuVW5yZXNvbHZlZE1ldGhvZChOYW1lIG5hbWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCByZXBvcnRXYXJuaW5nOiB0cnVlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgU3RyaW5nIHBsYWluTmFtZSA9IG5hbWUubmFtZTsKICAgIGludCBkb3RJbmRleCA9IHBsYWluTmFtZS5sYXN0SW5kZXhPZigiLiIpOwogICAgaWYgKGRvdEluZGV4ICE9IC0xKSB7CiAgICAgIHBsYWluTmFtZSA9IHBsYWluTmFtZS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKTsKICAgIH0KICAgIC8vIFRPRE8oYWhlKTogVGhpcyBpcyByYXRoZXIgYnJpdHRsZS4gV2Ugd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIG9mZiB3aXRoCiAgICAvLyBtb3JlIHByZWNpc2UgbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gdGhpcyBjYXNlLgogICAgaW50IGxlbmd0aCA9IHBsYWluTmFtZS5sZW5ndGg7CiAgICBpZiAocGxhaW5OYW1lLnN0YXJ0c1dpdGgoIlsiKSkgewogICAgICBsZW5ndGggPSAxOwogICAgfQogICAgTWVzc2FnZSBtZXNzYWdlID0gaXNTdXBlcgogICAgICAgID8gZmFzdGEudGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9NZXRob2Qud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpCiAgICAgICAgOiBmYXN0YS50ZW1wbGF0ZU1ldGhvZE5vdEZvdW5kLndpdGhBcmd1bWVudHMobmFtZS5uYW1lKTsKICAgIGlmIChyZXBvcnRXYXJuaW5nKSB7CiAgICAgIGFkZFByb2JsZW1FcnJvcklmQ29uc3QobWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBtZXNzYWdlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3YXJuVHlwZUFyZ3VtZW50c01pc21hdGNoKFN0cmluZyBuYW1lLCBpbnQgZXhwZWN0ZWQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KAogICAgICAgIGZhc3RhLnRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gud2l0aEFyZ3VtZW50cyhleHBlY3RlZCksCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBuYW1lLmxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgbG9va3VwSW5zdGFuY2VNZW1iZXIoTmFtZSBuYW1lLAogICAgICB7Ym9vbCBpc1NldHRlcjogZmFsc2UsIGJvb2wgaXNTdXBlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gY2xhc3NCdWlsZGVyLmxvb2t1cEluc3RhbmNlTWVtYmVyKGhpZXJhcmNoeSwgbmFtZSwKICAgICAgICBpc1NldHRlcjogaXNTZXR0ZXIsIGlzU3VwZXI6IGlzU3VwZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3IgbG9va3VwQ29uc3RydWN0b3IoTmFtZSBuYW1lLCB7Ym9vbCBpc1N1cGVyfSkgewogICAgcmV0dXJuIGNsYXNzQnVpbGRlci5sb29rdXBDb25zdHJ1Y3RvcihuYW1lLCBpc1N1cGVyOiBpc1N1cGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlSWRlbnRpZmllciIpOwogICAgU3RyaW5nIG5hbWUgPSB0b2tlbi5sZXhlbWU7CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJkZXByZWNhdGVkIikgJiYKICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGNoZWNrIGlzIHJlZHVuZGFudCwgYnV0IGZhc3RlciBpbiB0aGUgY29tbW9uCiAgICAgICAgLy8gY2FzZSAod2hlbiBbbmFtZV0gaXNuJ3QgZGVwcmVjYXRlZCkuCiAgICAgICAgKG5hbWUgPT0gImRlcHJlY2F0ZWQiIHx8IG5hbWUuc3RhcnRzV2l0aCgiZGVwcmVjYXRlZF8iKSkpIHsKICAgICAgYWRkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZVVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgIH0KICAgIGlmIChjb250ZXh0LmlzU2NvcGVSZWZlcmVuY2UpIHsKICAgICAgYXNzZXJ0KCFpbkluaXRpYWxpemVyIHx8CiAgICAgICAgICB0aGlzLnNjb3BlID09IGVuY2xvc2luZ1Njb3BlIHx8CiAgICAgICAgICB0aGlzLnNjb3BlLnBhcmVudCA9PSBlbmNsb3NpbmdTY29wZSk7CiAgICAgIC8vIFRoaXMgZGVhbHMgd2l0aCB0aGlzIGtpbmQgb2YgaW5pdGlhbGl6ZXI6IGBDKGEpIDogYSA9IGE7YAogICAgICBTY29wZSBzY29wZSA9IGluSW5pdGlhbGl6ZXIgPyBlbmNsb3NpbmdTY29wZSA6IHRoaXMuc2NvcGU7CiAgICAgIHB1c2goc2NvcGVMb29rdXAoc2NvcGUsIG5hbWUsIHRva2VuKSk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoY29udGV4dC5pbkRlY2xhcmF0aW9uKSB7CiAgICAgIGlmIChjb250ZXh0ID09IElkZW50aWZpZXJDb250ZXh0LnRvcExldmVsVmFyaWFibGVEZWNsYXJhdGlvbiB8fAogICAgICAgICAgY29udGV4dCA9PSBJZGVudGlmaWVyQ29udGV4dC5maWVsZERlY2xhcmF0aW9uKSB7CiAgICAgICAgY29uc3RhbnRDb250ZXh0ID0gbWVtYmVyLmlzQ29uc3QKICAgICAgICAgICAgPyBDb25zdGFudENvbnRleHQuaW5mZXJyZWQKICAgICAgICAgICAgOiAhbWVtYmVyLmlzU3RhdGljICYmCiAgICAgICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIuaGFzQ29uc3RDb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgPyBDb25zdGFudENvbnRleHQucmVxdWlyZWQKICAgICAgICAgICAgICAgIDogQ29uc3RhbnRDb250ZXh0Lm5vbmU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgIWNvbnRleHQuYWxsb3dlZEluQ29uc3RhbnRFeHByZXNzaW9uKSB7CiAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICBmYXN0YS5tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgIH0KICAgIGlmICh0b2tlbi5pc1N5bnRoZXRpYykgewogICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeShvZmZzZXRGb3JUb2tlbih0b2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IElkZW50aWZpZXIucHJlc2VydmVUb2tlbih0b2tlbikpOwogICAgfQogIH0KCiAgLy8vIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgW1ZhcmlhYmxlR2V0XSBvZiB0aGUgW3ZhcmlhYmxlXSB1c2luZwogIC8vLyBbY2hhck9mZnNldF0gYXMgdGhlIGZpbGUgb2Zmc2V0LgogIEBvdmVycmlkZQogIFZhcmlhYmxlR2V0IGNyZWF0ZVZhcmlhYmxlR2V0KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBmb3JOdWxsR3VhcmRlZEFjY2VzczogZmFsc2V9KSB7CiAgICBPYmplY3QgZmFjdCA9CiAgICAgICAgdHlwZVByb21vdGVyPy5nZXRGYWN0Rm9yQWNjZXNzKHZhcmlhYmxlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICBPYmplY3Qgc2NvcGUgPSB0eXBlUHJvbW90ZXI/LmN1cnJlbnRTY29wZTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXRJbXBsKHZhcmlhYmxlLCBmYWN0LCBzY29wZSwKICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogZm9yTnVsbEd1YXJkZWRBY2Nlc3MpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICAvLy8gSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBbUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3JdIG9uIHRoZSBbdmFyaWFibGVdCiAgLy8vIHVzaW5nIFt0b2tlbl0gYW5kIFtjaGFyT2Zmc2V0XSBmb3Igb2Zmc2V0IGluZm9ybWF0aW9uIGFuZCBbbmFtZV0KICAvLy8gZm9yIGBFeHByZXNzaW9uR2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkYC4KICBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBfY3JlYXRlUmVhZE9ubHlWYXJpYWJsZUFjY2VzcygKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgVG9rZW4gdG9rZW4sIGludCBjaGFyT2Zmc2V0LCBTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIG5ldyBSZWFkT25seUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICB0aGlzLCB0b2tlbiwgY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIGNoYXJPZmZzZXQpLCBuYW1lKTsKICB9CgogIC8vLyBMb29rIHVwIFtuYW1lXSBpbiBbc2NvcGVdIHVzaW5nIFt0b2tlbl0gYXMgbG9jYXRpb24gaW5mb3JtYXRpb24gKGJvdGggdG8KICAvLy8gcmVwb3J0IHByb2JsZW1zIGFuZCBhcyB0aGUgZmlsZSBvZmZzZXQgaW4gdGhlIGdlbmVyYXRlZCBrZXJuZWwgY29kZSkuCiAgLy8vIFtpc1F1YWxpZmllZF0gc2hvdWxkIGJlIHRydWUgaWYgW25hbWVdIGlzIGEgcXVhbGlmaWVkIGFjY2VzcyAod2hpY2gKICAvLy8gaW1wbGllcyB0aGF0IGl0IHNob3VsZG4ndCBiZSB0dXJuZWQgaW50byBhIFtUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JdCiAgLy8vIGlmIHRoZSBuYW1lIGRvZXNuJ3QgcmVzb2x2ZSBpbiB0aGUgc2NvcGUpLgogIEBvdmVycmlkZQogIHNjb3BlTG9va3VwKFNjb3BlIHNjb3BlLCBTdHJpbmcgbmFtZSwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzUXVhbGlmaWVkOiBmYWxzZSwgUHJlZml4QnVpbGRlciBwcmVmaXh9KSB7CiAgICBpbnQgY2hhck9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIGlmICh0b2tlbi5pc1N5bnRoZXRpYykgewogICAgICByZXR1cm4gbmV3IFBhcnNlckVycm9yR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBmYXN0YS5tZXNzYWdlU3ludGhldGljVG9rZW4pOwogICAgfQogICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgaWYgKGRlY2xhcmF0aW9uID09IG51bGwgJiYKICAgICAgICBwcmVmaXggPT0gbnVsbCAmJgogICAgICAgIChjbGFzc0J1aWxkZXI/LmlzUGF0Y2ggPz8gZmFsc2UpKSB7CiAgICAgIC8vIFRoZSBzY29wZSBvZiBhIHBhdGNoZWQgbWV0aG9kIGluY2x1ZGVzIHRoZSBvcmlnaW4gY2xhc3MuCiAgICAgIGRlY2xhcmF0aW9uID0gY2xhc3NCdWlsZGVyLm9yaWdpbgogICAgICAgICAgLmZpbmRTdGF0aWNCdWlsZGVyKG5hbWUsIGNoYXJPZmZzZXQsIHVyaSwgbGlicmFyeUJ1aWxkZXIpOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uICE9IG51bGwgJiYKICAgICAgICBkZWNsYXJhdGlvbi5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAoaW5GaWVsZEluaXRpYWxpemVyICYmICFpbkxhdGVGaWVsZEluaXRpYWxpemVyKSAmJgogICAgICAgICFpbkluaXRpYWxpemVyKSB7CiAgICAgIC8vIFdlIGNhbm5vdCBhY2Nlc3MgYSBjbGFzcyBpbnN0YW5jZSBtZW1iZXIgaW4gYW4gaW5pdGlhbGl6ZXIgb2YgYQogICAgICAvLyBmaWVsZC4KICAgICAgLy8KICAgICAgLy8gRm9yIGluc3RhbmNlCiAgICAgIC8vCiAgICAgIC8vICAgICBjbGFzcyBNIHsKICAgICAgLy8gICAgICAgaW50IGZvbyA9IGJhcjsKICAgICAgLy8gICAgICAgaW50IGJhcjsKICAgICAgLy8gICAgIH0KICAgICAgLy8KICAgICAgcmV0dXJuIG5ldyBJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IodGhpcywgdG9rZW4sCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXIud2l0aEFyZ3VtZW50cyhuYW1lKSk7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCB8fAogICAgICAgICghaXNEZWNsYXJhdGlvbkluc3RhbmNlQ29udGV4dCAmJgogICAgICAgICAgICBkZWNsYXJhdGlvbi5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIpKSB7CiAgICAgIC8vIFdlIGVpdGhlciBkaWRuJ3QgZmluZCBhIGRlY2xhcmF0aW9uIG9yIGZvdW5kIGFuIGluc3RhbmNlIG1lbWJlciBmcm9tCiAgICAgIC8vIGEgbm9uLWluc3RhbmNlIGNvbnRleHQuCiAgICAgIE5hbWUgbiA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnlCdWlsZGVyLm5hbWVPcmlnaW4pOwogICAgICBpZiAoIWlzUXVhbGlmaWVkICYmIGlzRGVjbGFyYXRpb25JbnN0YW5jZUNvbnRleHQpIHsKICAgICAgICBhc3NlcnQoZGVjbGFyYXRpb24gPT0gbnVsbCk7CiAgICAgICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSB8fCBtZW1iZXIuaXNGaWVsZCkgewogICAgICAgICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkTmFtZUdlbmVyYXRvcih0aGlzLCB0b2tlbiwgbik7CiAgICAgICAgfQogICAgICAgIGlmIChleHRlbnNpb25UaGlzICE9IG51bGwpIHsKICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWVtYmVyIHdlIGludGVycHJldCB0aGlzIGFzIGFuCiAgICAgICAgICAvLyBpbXBsaWNpdCBhY2Nlc3Mgb24gdGhlICd0aGlzJyBwYXJhbWV0ZXIuCiAgICAgICAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IubWFrZSh0aGlzLCB0b2tlbiwKICAgICAgICAgICAgICBjcmVhdGVWYXJpYWJsZUdldChleHRlbnNpb25UaGlzLCBjaGFyT2Zmc2V0KSwgbiwgZmFsc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUaGlzIGlzIGFuIGltcGxpY2l0IGFjY2VzcyBvbiAndGhpcycuCiAgICAgICAgICByZXR1cm4gbmV3IFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcih0aGlzLCB0b2tlbiwgbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGlnbm9yZU1haW5JbkdldE1haW5DbG9zdXJlICYmCiAgICAgICAgICBuYW1lID09ICJtYWluIiAmJgogICAgICAgICAgbWVtYmVyPy5uYW1lID09ICJfZ2V0TWFpbkNsb3N1cmUiKSB7CiAgICAgICAgcmV0dXJuIGZvcmVzdC5jcmVhdGVOdWxsTGl0ZXJhbChjaGFyT2Zmc2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBuKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pc1R5cGVEZWNsYXJhdGlvbikgewogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgICAgQWNjZXNzRXJyb3JCdWlsZGVyIGFjY2Vzc0Vycm9yID0gZGVjbGFyYXRpb247CiAgICAgICAgZGVjbGFyYXRpb24gPSBhY2Nlc3NFcnJvci5idWlsZGVyOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVHlwZVVzZUdlbmVyYXRvcih0aGlzLCB0b2tlbiwgZGVjbGFyYXRpb24sIG5hbWUpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pc0xvY2FsKSB7CiAgICAgIFZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZUJ1aWxkZXIgPSBkZWNsYXJhdGlvbjsKICAgICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJgogICAgICAgICAgIXZhcmlhYmxlQnVpbGRlci5pc0NvbnN0ICYmCiAgICAgICAgICAhbWVtYmVyLmlzQ29uc3RydWN0b3IpIHsKICAgICAgICByZXR1cm4gbmV3IEluY29tcGxldGVFcnJvckdlbmVyYXRvcigKICAgICAgICAgICAgdGhpcywgdG9rZW4sIGZhc3RhLm1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uKTsKICAgICAgfQogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gdmFyaWFibGVCdWlsZGVyLnZhcmlhYmxlOwogICAgICBpZiAoIXZhcmlhYmxlQnVpbGRlci5pc0Fzc2lnbmFibGUpIHsKICAgICAgICByZXR1cm4gX2NyZWF0ZVJlYWRPbmx5VmFyaWFibGVBY2Nlc3ModmFyaWFibGUsIHRva2VuLCBjaGFyT2Zmc2V0LCBuYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlVXNlR2VuZXJhdG9yKHRoaXMsIHRva2VuLCB2YXJpYWJsZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uaXNDbGFzc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYKICAgICAgICAgICFpbkluaXRpYWxpemVyICYmCiAgICAgICAgICAvLyBUT0RPKGFoZSk6IFRoaXMgaXMgYSBoYWNrIGJlY2F1c2UgRmFzdGEgc2V0cyB1cCB0aGUgc2NvcGUKICAgICAgICAgIC8vICJ0aGlzLmZpZWxkIiBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBvbGQgc2VtYW50aWNzLiBVbmRlciB0aGUgbmV3CiAgICAgICAgICAvLyBzZW1hbnRpY3MsIHN1Y2ggcGFyYW1ldGVycyBpbnRyb2R1Y2VzIGEgbmV3IHBhcmFtZXRlciB3aXRoIHRoYXQKICAgICAgICAgIC8vIG5hbWUgdGhhdCBzaG91bGQgYmUgcmVzb2x2ZWQgaGVyZS4KICAgICAgICAgICFtZW1iZXIuaXNDb25zdHJ1Y3RvcikgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLCBjaGFyT2Zmc2V0LCB0b2tlbi5sZW5ndGgpOwogICAgICB9CiAgICAgIE5hbWUgbiA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnlCdWlsZGVyLm5hbWVPcmlnaW4pOwogICAgICByZXR1cm4gbmV3IFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcih0aGlzLCB0b2tlbiwgbik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzRXh0ZW5zaW9uSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgRXh0ZW5zaW9uQnVpbGRlciBleHRlbnNpb25CdWlsZGVyID0gZGVjbGFyYXRpb25CdWlsZGVyOwogICAgICBNZW1iZXJCdWlsZGVyIHNldHRlckJ1aWxkZXIgPQogICAgICAgICAgX2dldENvcnJlc3BvbmRpbmdTZXR0ZXJCdWlsZGVyKHNjb3BlLCBkZWNsYXJhdGlvbiwgbmFtZSwgY2hhck9mZnNldCk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoZWNrIGZvciBjb25zdGFudENvbnRleHQgbGlrZSBiZWxvdz8KICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzRmllbGQpIHsKICAgICAgICBkZWNsYXJhdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHNldHRlckJ1aWxkZXIgIT0gbnVsbCAmJgogICAgICAgICAgKHNldHRlckJ1aWxkZXIuaXNGaWVsZCB8fCBzZXR0ZXJCdWlsZGVyLmlzU3RhdGljKSkgewogICAgICAgIHNldHRlckJ1aWxkZXIgPSBudWxsOwogICAgICB9CiAgICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsICYmIHNldHRlckJ1aWxkZXIgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoCiAgICAgICAgICAgIHRoaXMsIHRva2VuLCBuZXcgTmFtZShuYW1lLCBsaWJyYXJ5QnVpbGRlci5uYW1lT3JpZ2luKSk7CiAgICAgIH0KICAgICAgTWVtYmVyQnVpbGRlciBnZXR0ZXJCdWlsZGVyID0KICAgICAgICAgIGRlY2xhcmF0aW9uIGlzIE1lbWJlckJ1aWxkZXIgPyBkZWNsYXJhdGlvbiA6IG51bGw7CiAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgdG9rZW4sCiAgICAgICAgICBleHRlbnNpb25CdWlsZGVyLmV4dGVuc2lvbiwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBleHRlbnNpb25UaGlzLAogICAgICAgICAgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBnZXR0ZXJCdWlsZGVyLAogICAgICAgICAgc2V0dGVyQnVpbGRlcik7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzUmVndWxhck1ldGhvZCkgewogICAgICBhc3NlcnQoZGVjbGFyYXRpb24uaXNTdGF0aWMgfHwgZGVjbGFyYXRpb24uaXNUb3BMZXZlbCk7CiAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyQnVpbGRlciA9IGRlY2xhcmF0aW9uOwogICAgICByZXR1cm4gbmV3IFN0YXRpY0FjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgIHRoaXMsIHRva2VuLCBuYW1lLCBtZW1iZXJCdWlsZGVyLm1lbWJlciwgbnVsbCk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFByZWZpeEJ1aWxkZXIpIHsKICAgICAgYXNzZXJ0KHByZWZpeCA9PSBudWxsKTsKICAgICAgcmV0dXJuIG5ldyBQcmVmaXhVc2VHZW5lcmF0b3IodGhpcywgdG9rZW4sIGRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgTG9hZExpYnJhcnlCdWlsZGVyKSB7CiAgICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnlHZW5lcmF0b3IodGhpcywgdG9rZW4sIGRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uaGFzUHJvYmxlbSAmJiBkZWNsYXJhdGlvbiBpcyEgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIE1lbWJlckJ1aWxkZXIgc2V0dGVyQnVpbGRlciA9CiAgICAgICAgICBfZ2V0Q29ycmVzcG9uZGluZ1NldHRlckJ1aWxkZXIoc2NvcGUsIGRlY2xhcmF0aW9uLCBuYW1lLCBjaGFyT2Zmc2V0KTsKICAgICAgTWVtYmVyQnVpbGRlciBnZXR0ZXJCdWlsZGVyID0KICAgICAgICAgIGRlY2xhcmF0aW9uIGlzIE1lbWJlckJ1aWxkZXIgPyBkZWNsYXJhdGlvbiA6IG51bGw7CiAgICAgIGFzc2VydChnZXR0ZXJCdWlsZGVyICE9IG51bGwgfHwgc2V0dGVyQnVpbGRlciAhPSBudWxsKTsKICAgICAgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIoCiAgICAgICAgICB0aGlzLCBuYW1lLCB0b2tlbiwgZ2V0dGVyQnVpbGRlciwgc2V0dGVyQnVpbGRlcik7CiAgICAgIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgICBNZW1iZXIgcmVhZFRhcmdldCA9IGdlbmVyYXRvci5yZWFkVGFyZ2V0OwogICAgICAgIGlmICghKHJlYWRUYXJnZXQgaXMgRmllbGQgJiYgcmVhZFRhcmdldC5pc0NvbnN0IHx8CiAgICAgICAgICAgIC8vIFN0YXRpYyB0ZWFyLW9mZnMgYXJlIGFsc28gY29tcGlsZSB0aW1lIGNvbnN0YW50cy4KICAgICAgICAgICAgcmVhZFRhcmdldCBpcyBQcm9jZWR1cmUpKSB7CiAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VOb3RBQ29uc3RhbnRFeHByZXNzaW9uLCBjaGFyT2Zmc2V0LCB0b2tlbi5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJhdG9yOwogICAgfQogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNldHRlciBidWlsZGVyIGNvcnJlc3BvbmRpbmcgdG8gW2RlY2xhcmF0aW9uXSB1c2luZyB0aGUKICAvLy8gW25hbWVdIGFuZCBbY2hhck9mZnNldF0gZm9yIHRoZSBsb29rdXAgaW50byBbc2NvcGVdIGlmIG5lY2Vzc2FyeS4KICBNZW1iZXJCdWlsZGVyIF9nZXRDb3JyZXNwb25kaW5nU2V0dGVyQnVpbGRlcigKICAgICAgU2NvcGUgc2NvcGUsIEJ1aWxkZXIgZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCkgewogICAgQnVpbGRlciBzZXR0ZXI7CiAgICBpZiAoZGVjbGFyYXRpb24uaXNTZXR0ZXIpIHsKICAgICAgc2V0dGVyID0gZGVjbGFyYXRpb247CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzR2V0dGVyKSB7CiAgICAgIHNldHRlciA9IHNjb3BlLmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pc0ZpZWxkKSB7CiAgICAgIE1lbWJlckJ1aWxkZXIgZmllbGRCdWlsZGVyID0gZGVjbGFyYXRpb247CiAgICAgIGlmICghZmllbGRCdWlsZGVyLmlzQXNzaWduYWJsZSkgewogICAgICAgIHNldHRlciA9IHNjb3BlLmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9IGVsc2UgewogICAgICAgIHNldHRlciA9IGRlY2xhcmF0aW9uOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2V0dGVyIGlzIE1lbWJlckJ1aWxkZXIgPyBzZXR0ZXIgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVRdWFsaWZpZWQoVG9rZW4gcGVyaW9kKSB7CiAgICBkZWJ1Z0V2ZW50KCJRdWFsaWZpZWQiKTsKICAgIE9iamVjdCBub2RlID0gcG9wKCk7CiAgICBPYmplY3QgcXVhbGlmaWVyID0gcG9wKCk7CiAgICBpZiAocXVhbGlmaWVyIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gocXVhbGlmaWVyKTsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgSWRlbnRpZmllciBpZGVudGlmaWVyID0gbm9kZTsKICAgICAgcHVzaChpZGVudGlmaWVyLndpdGhRdWFsaWZpZXIocXVhbGlmaWVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5MaXRlcmFsU3RyaW5nIik7CiAgICBwdXNoKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU3RyaW5nUGFydCIpOwogICAgcHVzaCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTdHJpbmcoaW50IGludGVycG9sYXRpb25Db3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpdGVyYWxTdHJpbmciKTsKICAgIGlmIChpbnRlcnBvbGF0aW9uQ291bnQgPT0gMCkgewogICAgICBUb2tlbiB0b2tlbiA9IHBvcCgpOwogICAgICBTdHJpbmcgdmFsdWUgPSB1bmVzY2FwZVN0cmluZyh0b2tlbi5sZXhlbWUsIHRva2VuLCB0aGlzKTsKICAgICAgcHVzaChmb3Jlc3QuY3JlYXRlU3RyaW5nTGl0ZXJhbChvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZhbHVlKSk7CiAgICB9IGVsc2UgewogICAgICBpbnQgY291bnQgPSAxICsgaW50ZXJwb2xhdGlvbkNvdW50ICogMjsKICAgICAgTGlzdDxPYmplY3Q+IHBhcnRzID0gY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY291bnQpOwogICAgICBpZiAocGFydHMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KGVuZFRva2VuLmNoYXJPZmZzZXQpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgVG9rZW4gZmlyc3QgPSBwYXJ0cy5maXJzdDsKICAgICAgVG9rZW4gbGFzdCA9IHBhcnRzLmxhc3Q7CiAgICAgIFF1b3RlIHF1b3RlID0gYW5hbHl6ZVF1b3RlKGZpcnN0LmxleGVtZSk7CiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgICAgLy8gQ29udGFpbnMgbW9yZSB0aGFuIGp1c3QgXCcgb3IgXCIuCiAgICAgIGlmIChmaXJzdC5sZXhlbWUubGVuZ3RoID4gMSkgewogICAgICAgIFN0cmluZyB2YWx1ZSA9CiAgICAgICAgICAgIHVuZXNjYXBlRmlyc3RTdHJpbmdQYXJ0KGZpcnN0LmxleGVtZSwgcXVvdGUsIGZpcnN0LCB0aGlzKTsKICAgICAgICBpZiAodmFsdWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAuYWRkKGZvcmVzdC5jcmVhdGVTdHJpbmdMaXRlcmFsKG9mZnNldEZvclRva2VuKGZpcnN0KSwgdmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICBPYmplY3QgcGFydCA9IHBhcnRzW2ldOwogICAgICAgIGlmIChwYXJ0IGlzIFRva2VuKSB7CiAgICAgICAgICBpZiAocGFydC5sZXhlbWUubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdW5lc2NhcGUocGFydC5sZXhlbWUsIHF1b3RlLCBwYXJ0LCB0aGlzKTsKICAgICAgICAgICAgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgIC5hZGQoZm9yZXN0LmNyZWF0ZVN0cmluZ0xpdGVyYWwob2Zmc2V0Rm9yVG9rZW4ocGFydCksIHZhbHVlKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4cHJlc3Npb25zLmFkZCh0b1ZhbHVlKHBhcnQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gQ29udGFpbnMgbW9yZSB0aGFuIGp1c3QgXCcgb3IgXCIuCiAgICAgIGlmIChsYXN0LmxleGVtZS5sZW5ndGggPiAxKSB7CiAgICAgICAgU3RyaW5nIHZhbHVlID0gdW5lc2NhcGVMYXN0U3RyaW5nUGFydCgKICAgICAgICAgICAgbGFzdC5sZXhlbWUsIHF1b3RlLCBsYXN0LCBsYXN0LmlzU3ludGhldGljLCB0aGlzKTsKICAgICAgICBpZiAodmFsdWUuaXNOb3RFbXB0eSkgewogICAgICAgICAgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAuYWRkKGZvcmVzdC5jcmVhdGVTdHJpbmdMaXRlcmFsKG9mZnNldEZvclRva2VuKGxhc3QpLCB2YWx1ZSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVTdHJpbmdDb25jYXRlbmF0aW9uKAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oZW5kVG9rZW4pLCBleHByZXNzaW9ucykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgZGVidWdFdmVudCgiTmF0aXZlQ2xhdXNlIik7CiAgICBpZiAoaGFzTmFtZSkgewogICAgICBwb3AoKSBhcyBTdHJpbmdMaXRlcmFsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTY3JpcHQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlNjcmlwdCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKFRva2VuIHN0YXJ0VG9rZW4sIGludCBsaXRlcmFsQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ0p1eHRhcG9zaXRpb24iKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gcGFydHMgPSBwb3BMaXN0Rm9yVmFsdWUobGl0ZXJhbENvdW50KTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnM7CiAgICAvLyBGbGF0dGVuIHN0cmluZyBqdXh0YXBvc2l0aW9ucyBvZiBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgRXhwcmVzc2lvbiBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGlmIChwYXJ0IGlzIFN0cmluZ0NvbmNhdGVuYXRpb24pIHsKICAgICAgICBpZiAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgewogICAgICAgICAgZXhwcmVzc2lvbnMgPSBwYXJ0cy5zdWJsaXN0KDAsIGkpOwogICAgICAgIH0KICAgICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBwYXJ0LmV4cHJlc3Npb25zKSB7CiAgICAgICAgICBleHByZXNzaW9ucy5hZGQoZXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChleHByZXNzaW9ucyAhPSBudWxsKSB7CiAgICAgICAgICBleHByZXNzaW9ucy5hZGQocGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBwdXNoKGZvcmVzdC5jcmVhdGVTdHJpbmdDb25jYXRlbmF0aW9uKAogICAgICAgIG9mZnNldEZvclRva2VuKHN0YXJ0VG9rZW4pLCBleHByZXNzaW9ucyA/PyBwYXJ0cykpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsSW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsSW50Iik7CiAgICBpbnQgdmFsdWUgPSBpbnQudHJ5UGFyc2UodG9rZW4ubGV4ZW1lKTsKICAgIC8vIFBvc3Rwb25lIHBhcnNpbmcgb2YgbGl0ZXJhbHMgcmVzdWx0aW5nIGluIGEgbmVnYXRpdmUgdmFsdWUKICAgIC8vIChoZXggbGl0ZXJhbHMgPj0gMl42MykuIFRoZXNlIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiBub3QgbmVnYXRlZC4KICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlIDwgMCkgewogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVJbnRMaXRlcmFsTGFyZ2Uob2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB0b2tlbi5sZXhlbWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCB2YWx1ZSwgdG9rZW4ubGV4ZW1lKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVtcHR5RnVuY3Rpb25Cb2R5KFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSIpOwogICAgZW5kQmxvY2tGdW5jdGlvbkJvZHkoMCwgbnVsbCwgc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiBhcnJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSIpOwogICAgZW5kUmV0dXJuU3RhdGVtZW50KHRydWUsIGFycm93VG9rZW4ubmV4dCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXR1cm5TdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbiwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlJldHVyblN0YXRlbWVudCIpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaGFzRXhwcmVzc2lvbiA/IHBvcEZvclZhbHVlKCkgOiBudWxsOwogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBpbkNvbnN0cnVjdG9yKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEubWVzc2FnZUNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGUsIGJlZ2luVG9rZW4uY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChmb3Jlc3QuY3JlYXRlUmV0dXJuU3RhdGVtZW50KG9mZnNldEZvclRva2VuKGJlZ2luVG9rZW4pLCBleHByZXNzaW9uLAogICAgICAgICAgaXNBcnJvdzogIWlkZW50aWNhbChiZWdpblRva2VuLmxleGVtZSwgInJldHVybiIpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgZW50ZXJUaGVuRm9yVHlwZVByb21vdGlvbihjb25kaXRpb24pOwogICAgcHVzaChjb25kaXRpb24pOwogICAgc3VwZXIuYmVnaW5UaGVuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgdHlwZVByb21vdGVyPy5lbnRlckVsc2UoKTsKICAgIHN1cGVyLmVuZFRoZW5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJZlN0YXRlbWVudChUb2tlbiBpZlRva2VuLCBUb2tlbiBlbHNlVG9rZW4pIHsKICAgIFN0YXRlbWVudCBlbHNlUGFydCA9IHBvcFN0YXRlbWVudElmTm90TnVsbChlbHNlVG9rZW4pOwogICAgU3RhdGVtZW50IHRoZW5QYXJ0ID0gcG9wU3RhdGVtZW50KCk7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcCgpOwogICAgdHlwZVByb21vdGVyPy5leGl0Q29uZGl0aW9uYWwoKTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZUlmU3RhdGVtZW50KAogICAgICAgIG9mZnNldEZvclRva2VuKGlmVG9rZW4pLCBjb25kaXRpb24sIHRoZW5QYXJ0LCBlbHNlUGFydCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRWYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvcikgewogICAgZGVidWdFdmVudCgiVmFyaWFibGVJbml0aWFsaXplciIpOwogICAgYXNzZXJ0KGFzc2lnbm1lbnRPcGVyYXRvci5zdHJpbmdWYWx1ZSA9PSAiPSIpOwogICAgcHVzaE5ld0xvY2FsVmFyaWFibGUocG9wRm9yVmFsdWUoKSwgZXF1YWxzVG9rZW46IGFzc2lnbm1lbnRPcGVyYXRvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9WYXJpYWJsZUluaXRpYWxpemVyIik7CiAgICBib29sIGlzQ29uc3QgPSAoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDA7CiAgICBib29sIGlzRmluYWwgPSAoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgJiBmaW5hbE1hc2spICE9IDA7CiAgICBib29sIGlzTGF0ZSA9IChjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyAmIGxhdGVNYXNrKSAhPSAwOwogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsKICAgIGlmICghb3B0aW9uYWwoImluIiwgdG9rZW4pKSB7CiAgICAgIC8vIEEgZm9yLWluIGxvb3AtdmFyaWFibGUgY2FuJ3QgaGF2ZSBhbiBpbml0aWFsaXplci4gU28gbGV0J3MgcmVtYWluCiAgICAgIC8vIHNpbGVudCBpZiB0aGUgbmV4dCB0b2tlbiBpcyBgaW5gLiBTaW5jZSBhIGZvci1pbiBsb29wIGNhbiBvbmx5IGhhdmUKICAgICAgLy8gb25lIHZhcmlhYmxlIGl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYGluYC4KICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICBpbml0aWFsaXplciA9IGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0b2tlbi5sZXhlbWUpLAogICAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0b2tlbi5sZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGlzRmluYWwgJiYgIWlzTGF0ZSkgewogICAgICAgIGluaXRpYWxpemVyID0gYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXIKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHRva2VuLmxleGVtZSksCiAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIHRva2VuLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIHB1c2hOZXdMb2NhbFZhcmlhYmxlKGluaXRpYWxpemVyKTsKICB9CgogIHZvaWQgcHVzaE5ld0xvY2FsVmFyaWFibGUoRXhwcmVzc2lvbiBpbml0aWFsaXplciwge1Rva2VuIGVxdWFsc1Rva2VufSkgewogICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgIGlmIChub2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobm9kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IG5vZGU7CiAgICBhc3NlcnQoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgIT0gLTEpOwogICAgYm9vbCBpc0NvbnN0ID0gKGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICYgY29uc3RNYXNrKSAhPSAwOwogICAgYm9vbCBpc0ZpbmFsID0gKGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzICYgZmluYWxNYXNrKSAhPSAwOwogICAgYm9vbCBpc0xhdGUgPSAoY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMgJiBsYXRlTWFzaykgIT0gMDsKICAgIGJvb2wgaXNSZXF1aXJlZCA9IChjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyAmIHJlcXVpcmVkTWFzaykgIT0gMDsKICAgIGFzc2VydChpc0NvbnN0ID09IChjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsKAogICAgICAgIGlkZW50aWZpZXIubmFtZSwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsCiAgICAgICAgZm9yU3ludGhldGljVG9rZW46IGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKGlkZW50aWZpZXIpLmlzU3ludGhldGljLAogICAgICAgIGluaXRpYWxpemVyOiBpbml0aWFsaXplciwKICAgICAgICB0eXBlOiBidWlsZERhcnRUeXBlKGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSksCiAgICAgICAgaXNGaW5hbDogaXNGaW5hbCwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgIGlzTGF0ZTogaXNMYXRlLAogICAgICAgIGlzUmVxdWlyZWQ6IGlzUmVxdWlyZWQsCiAgICAgICAgaGFzRGVjbGFyZWRJbml0aWFsaXplcjogaW5pdGlhbGl6ZXIgIT0gbnVsbCkKICAgICAgLi5maWxlT2Zmc2V0ID0gaWRlbnRpZmllci5jaGFyT2Zmc2V0CiAgICAgIC4uZmlsZUVxdWFsc09mZnNldCA9IG9mZnNldEZvclRva2VuKGVxdWFsc1Rva2VuKTsKICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmRlY2xhcmUodmFyaWFibGUpOwogICAgbGlicmFyeUJ1aWxkZXIuY2hlY2tCb3VuZHNJblZhcmlhYmxlRGVjbGFyYXRpb24oCiAgICAgICAgdmFyaWFibGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpKTsKICAgIHB1c2godmFyaWFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGluRmllbGRJbml0aWFsaXplciA9IHRydWU7CiAgICBpZiAobWVtYmVyIGlzIEZpZWxkQnVpbGRlcikgewogICAgICBGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyID0gbWVtYmVyOwogICAgICBpbkxhdGVGaWVsZEluaXRpYWxpemVyID0gZmllbGRCdWlsZGVyLmlzTGF0ZTsKICAgIH0gZWxzZSB7CiAgICAgIGluTGF0ZUZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZEluaXRpYWxpemVyIik7CiAgICBpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIGluTGF0ZUZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgIGFzc2VydChhc3NpZ25tZW50T3BlcmF0b3Iuc3RyaW5nVmFsdWUgPT0gIj0iKTsKICAgIHB1c2gocG9wRm9yVmFsdWUoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GaWVsZEluaXRpYWxpemVyIik7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCkgewogICAgICAvLyBDcmVhdGluZyBhIG51bGwgdmFsdWUgdG8gcHJldmVudCB0aGUgRGFydCBWTSBmcm9tIGNyYXNoaW5nLgogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVOdWxsTGl0ZXJhbChvZmZzZXRGb3JUb2tlbih0b2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goTnVsbFZhbHVlLkZpZWxkSW5pdGlhbGl6ZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbml0aWFsaXplZElkZW50aWZpZXIoVG9rZW4gbmFtZVRva2VuKSB7CiAgICAvLyBUT0RPKGFoZSk6IFVzZSBbSW5pdGlhbGl6ZWRJZGVudGlmaWVyXSBoZXJlPwogICAgZGVidWdFdmVudCgiSW5pdGlhbGl6ZWRJZGVudGlmaWVyIik7CiAgICBPYmplY3Qgbm9kZSA9IHBvcCgpOwogICAgaWYgKG5vZGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChub2RlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGU7CiAgICB2YXJpYWJsZS5maWxlT2Zmc2V0ID0gbmFtZVRva2VuLmNoYXJPZmZzZXQ7CiAgICBwdXNoKHZhcmlhYmxlKTsKICAgIGRlY2xhcmVWYXJpYWJsZSh2YXJpYWJsZSwgc2NvcGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblZhcmlhYmxlc0RlY2xhcmF0aW9uKAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gbGF0ZVRva2VuLCBUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb24iKTsKICAgIGlmICghbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXBvcnROb25OdWxsYWJsZU1vZGlmaWVyRXJyb3IobGF0ZVRva2VuKTsKICAgIH0KICAgIFVucmVzb2x2ZWRUeXBlIHR5cGUgPSBwb3AoKTsKICAgIGludCBtb2RpZmllcnMgPSAobGF0ZVRva2VuICE9IG51bGwgPyBsYXRlTWFzayA6IDApIHwKICAgICAgICBNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCh2YXJGaW5hbE9yQ29uc3Q/LmxleGVtZSk7CiAgICBfZW50ZXJMb2NhbFN0YXRlKGluTGF0ZUxvY2FsSW5pdGlhbGl6ZXI6IGxhdGVUb2tlbiAhPSBudWxsKTsKICAgIHN1cGVyLnB1c2goY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnMpOwogICAgc3VwZXIucHVzaChjdXJyZW50TG9jYWxWYXJpYWJsZVR5cGUgPz8gTnVsbFZhbHVlLlR5cGUpOwogICAgY3VycmVudExvY2FsVmFyaWFibGVUeXBlID0gdHlwZTsKICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlTW9kaWZpZXJzID0gbW9kaWZpZXJzOwogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gKChtb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDApCiAgICAgICAgPyBDb25zdGFudENvbnRleHQuaW5mZXJyZWQKICAgICAgICA6IENvbnN0YW50Q29udGV4dC5ub25lOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihpbnQgY291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJWYXJpYWJsZXNEZWNsYXJhdGlvbiIpOwogICAgaWYgKGNvdW50ID09IDEpIHsKICAgICAgT2JqZWN0IG5vZGUgPSBwb3AoKTsKICAgICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSA9IHBvcCgpOwogICAgICBjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyA9IHBvcCgpOwogICAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICAgIGlmIChub2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcHVzaChub2RlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGU7CiAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyaWFibGUuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uc1tpXSk7CiAgICAgICAgfQogICAgICAgICh2YXJpYWJsZXNXaXRoTWV0YWRhdGEgPz89IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdKS5hZGQodmFyaWFibGUpOwogICAgICB9CiAgICAgIHB1c2godmFyaWFibGUpOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICAgIGN1cnJlbnRMb2NhbFZhcmlhYmxlVHlwZSA9IHBvcCgpOwogICAgICBjdXJyZW50TG9jYWxWYXJpYWJsZU1vZGlmaWVycyA9IHBvcCgpOwogICAgICBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zID0gcG9wKCk7CiAgICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IFBhcnNlclJlY292ZXJ5KG9mZnNldEZvclRva2VuKGVuZFRva2VuKSkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZmlyc3QgPSB2YXJpYWJsZXMuZmlyc3Q7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgZmlyc3QuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uc1tpXSk7CiAgICAgICAgfQogICAgICAgIChtdWx0aVZhcmlhYmxlc1dpdGhNZXRhZGF0YSA/Pz0gPExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4+W10pCiAgICAgICAgICAgIC5hZGQodmFyaWFibGVzKTsKICAgICAgfQogICAgICBwdXNoKGZvcmVzdC52YXJpYWJsZXNEZWNsYXJhdGlvbih2YXJpYWJsZXMsIHVyaSkpOwogICAgfQogICAgX2V4aXRMb2NhbFN0YXRlKCk7CiAgfQoKICAvLy8gU3RhY2sgY29udGFpbmluZyBhc3NpZ25lZCB2YXJpYWJsZXMgaW5mbyBmb3IgdHJ5IHN0YXRlbWVudHMuCiAgLy8vCiAgLy8vIFRoZXNlIGFyZSBjcmVhdGVkIGluIFtiZWdpblRyeVN0YXRlbWVudF0gYW5kIGVuZGVkIGluIGVpdGhlciBbYmVnaW5CbG9ja10KICAvLy8gd2hlbiBhIGZpbmFsbHkgYmxvY2sgc3RhcnRzIG9yIGluIFtlbmRUcnlTdGF0ZW1lbnRdIHdoZW4gdGhlIHRyeSBzdGF0ZW1lbnQKICAvLy8gZW5kcy4gU2luY2UgdGhlc2UgbmVlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyeSBzdGF0ZW1lbnQgY3JlYXRlZCBpbgogIC8vLyBpbiBbZW5kVHJ5U3RhdGVtZW50XSB3ZSBzdG9yZSB0aGVtIHRoZSBzdGFjayB1bnRpbCB0aGUgdHJ5IHN0YXRlbWVudCBpcwogIC8vLyBjcmVhdGVkLgogIExpbms8QXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZURlY2xhcmF0aW9uPj4gdHJ5U3RhdGVtZW50SW5mb1N0YWNrID0KICAgICAgY29uc3QgTGluazxBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlRGVjbGFyYXRpb24+PigpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2soVG9rZW4gdG9rZW4sIEJsb2NrS2luZCBibG9ja0tpbmQpIHsKICAgIGlmIChibG9ja0tpbmQgPT0gQmxvY2tLaW5kLnRyeVN0YXRlbWVudCkgewogICAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2VuZE5vZGVdIGluIFtlbmRCbG9ja10uCiAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmJlZ2luTm9kZSgpOwogICAgfSBlbHNlIGlmIChibG9ja0tpbmQgPT0gQmxvY2tLaW5kLmZpbmFsbHlDbGF1c2UpIHsKICAgICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtiZWdpbk5vZGVdIGluIFtiZWdpblRyeVN0YXRlbWVudF0uCiAgICAgIHRyeVN0YXRlbWVudEluZm9TdGFjayA9IHRyeVN0YXRlbWVudEluZm9TdGFjawogICAgICAgICAgLnByZXBlbmQodHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZGVmZXJOb2RlKCkpOwoKICAgICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtlbmROb2RlXSBpbiBbZW5kVHJ5U3RhdGVtZW50XS4KICAgICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uYmVnaW5Ob2RlKCk7CiAgICB9CiAgICBzdXBlci5iZWdpbkJsb2NrKHRva2VuLCBibG9ja0tpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRCbG9jaygKICAgICAgaW50IGNvdW50LCBUb2tlbiBvcGVuQnJhY2UsIFRva2VuIGNsb3NlQnJhY2UsIEJsb2NrS2luZCBibG9ja0tpbmQpIHsKICAgIGRlYnVnRXZlbnQoIkJsb2NrIik7CiAgICBTdGF0ZW1lbnQgYmxvY2sgPSBwb3BCbG9jayhjb3VudCwgb3BlbkJyYWNlLCBjbG9zZUJyYWNlKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKGJsb2NrKTsKICAgIGlmIChibG9ja0tpbmQgPT0gQmxvY2tLaW5kLnRyeVN0YXRlbWVudCkgewogICAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2JlZ2luTm9kZV0gaW4gW2JlZ2luQmxvY2tdLgogICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5lbmROb2RlKGJsb2NrKTsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2soVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBpbXByb3ZlZCByZWNvdmVyeSBieSBhZGRpbmcgdGhpcyBibG9jawogICAgLy8gYXMgcGFydCBvZiBhIHN5bnRoZXRpYyB0b3AgbGV2ZWwgZnVuY3Rpb24uCiAgICBwb3AoKTsgLy8gYmxvY2sKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKHRva2VuLCBbCiAgICAgIHVuaW9uT2ZLaW5kcyg8VmFsdWVLaW5kPltWYWx1ZUtpbmRzLkV4cHJlc3Npb24sIFZhbHVlS2luZHMuR2VuZXJhdG9yXSksCiAgICAgIHVuaW9uT2ZLaW5kcyg8VmFsdWVLaW5kPlsKICAgICAgICBWYWx1ZUtpbmRzLkV4cHJlc3Npb24sIFZhbHVlS2luZHMuR2VuZXJhdG9yLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIHByb2JsZW0gYnVpbGRlcnMgaGVyZS4KICAgICAgICBWYWx1ZUtpbmRzLlByb2JsZW1CdWlsZGVyCiAgICAgIF0pCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJBc3NpZ25tZW50RXhwcmVzc2lvbiIpOwogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IHBvcEZvclZhbHVlKCk7CiAgICBPYmplY3QgZ2VuZXJhdG9yID0gcG9wKCk7CiAgICBpZiAoZ2VuZXJhdG9yIGlzISBHZW5lcmF0b3IpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZU5vdEFuTHZhbHVlLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICBsZW5ndGhGb3JUb2tlbih0b2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IERlbGF5ZWRBc3NpZ25tZW50KAogICAgICAgICAgdGhpcywgdG9rZW4sIGdlbmVyYXRvciwgdmFsdWUsIHRva2VuLnN0cmluZ1ZhbHVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyTG9vcChpbnQgY2hhck9mZnNldCkgewogICAgaWYgKHBlZWsoKSBpcyBMYWJlbFRhcmdldCkgewogICAgICBMYWJlbFRhcmdldCB0YXJnZXQgPSBwZWVrKCk7CiAgICAgIGVudGVyQnJlYWtUYXJnZXQoY2hhck9mZnNldCwgdGFyZ2V0LmJyZWFrVGFyZ2V0KTsKICAgICAgZW50ZXJDb250aW51ZVRhcmdldChjaGFyT2Zmc2V0LCB0YXJnZXQuY29udGludWVUYXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgZW50ZXJCcmVha1RhcmdldChjaGFyT2Zmc2V0KTsKICAgICAgZW50ZXJDb250aW51ZVRhcmdldChjaGFyT2Zmc2V0KTsKICAgIH0KICB9CgogIHZvaWQgZXhpdExvb3BPclN3aXRjaChTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBpZiAocHJvYmxlbUluTG9vcE9yU3dpdGNoICE9IG51bGwpIHsKICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2gpOwogICAgICBwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChzdGF0ZW1lbnQpOwogICAgfQogIH0KCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBfYnVpbGRGb3JMb29wVmFyaWFibGVEZWNsYXJhdGlvbnMoCiAgICAgIHZhcmlhYmxlT3JFeHByZXNzaW9uKSB7CiAgICAvLyBUT0RPKGFoZSk6IFRoaXMgY2FuIGJlIHNpbXBsaWZpZWQgbm93IHRoYXQgd2UgaGF2ZSB0aGUgZXZlbnRzCiAgICAvLyBgaGFuZGxlRm9ySW5pdGlhbGl6ZXIuLi5gIGV2ZW50cy4KICAgIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBHZW5lcmF0b3IpIHsKICAgICAgdmFyaWFibGVPckV4cHJlc3Npb24gPSB2YXJpYWJsZU9yRXhwcmVzc2lvbi5idWlsZEZvckVmZmVjdCgpOwogICAgfQogICAgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgLy8gTGF0ZSBmb3IgbG9vcCB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIEFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4KICAgICAgLy8gcmVwb3J0ZWQgYnkgdGhlIHBhcnNlci4KICAgICAgdmFyaWFibGVPckV4cHJlc3Npb24uaXNMYXRlID0gZmFsc2U7CiAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bdmFyaWFibGVPckV4cHJlc3Npb25dOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBFeHByZXNzaW9uKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsLmZvckVmZmVjdCh2YXJpYWJsZU9yRXhwcmVzc2lvbik7CiAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bdmFyaWFibGVdOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZU9yRXhwcmVzc2lvbiBpcyBFeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkltcGwuZm9yRWZmZWN0KAogICAgICAgICAgdmFyaWFibGVPckV4cHJlc3Npb24uZXhwcmVzc2lvbik7CiAgICAgIHJldHVybiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bdmFyaWFibGVdOwogICAgfSBlbHNlIGlmIChmb3Jlc3QuaXNWYXJpYWJsZXNEZWNsYXJhdGlvbih2YXJpYWJsZU9yRXhwcmVzc2lvbikpIHsKICAgICAgcmV0dXJuIGZvcmVzdAogICAgICAgICAgLnZhcmlhYmxlc0RlY2xhcmF0aW9uRXh0cmFjdERlY2xhcmF0aW9ucyh2YXJpYWJsZU9yRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uIGlzIExpc3Q8T2JqZWN0PikgewogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgICBmb3IgKE9iamVjdCB2IGluIHZhcmlhYmxlT3JFeHByZXNzaW9uKSB7CiAgICAgICAgdmFyaWFibGVzLmFkZEFsbChfYnVpbGRGb3JMb29wVmFyaWFibGVEZWNsYXJhdGlvbnModikpOwogICAgICB9CiAgICAgIHJldHVybiB2YXJpYWJsZXM7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlT3JFeHByZXNzaW9uID09IG51bGwpIHsKICAgICAgcmV0dXJuIDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQiKTsKICAgIHB1c2goTnVsbFZhbHVlLkV4cHJlc3Npb24pOwogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtkZWZlck5vZGVdIGluIFtlbmRGb3JTdGF0ZW1lbnRdIG9yCiAgICAvLyBbZW5kRm9yQ29udHJvbEZsb3ddLgogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uYmVnaW5Ob2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbiwgYm9vbCBmb3JJbikgewogICAgZGVidWdFdmVudCgiRm9ySW5pdGlhbGl6ZXJFeHByZXNzaW9uU3RhdGVtZW50Iik7CiAgICBpZiAoIWZvckluKSB7CiAgICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbZGVmZXJOb2RlXSBpbiBbZW5kRm9yU3RhdGVtZW50XSBvcgogICAgICAvLyBbZW5kRm9yQ29udHJvbEZsb3ddLgogICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5iZWdpbk5vZGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4sIGJvb2wgZm9ySW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIik7CiAgICBpZiAoIWZvckluKSB7CiAgICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbZGVmZXJOb2RlXSBpbiBbZW5kRm9yU3RhdGVtZW50XSBvcgogICAgICAvLyBbZW5kRm9yQ29udHJvbEZsb3ddLgogICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5iZWdpbk5vZGUoKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9yTG9vcFBhcnRzKFRva2VuIGZvcktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwKICAgICAgVG9rZW4gbGVmdFNlcGFyYXRvciwgaW50IHVwZGF0ZUV4cHJlc3Npb25Db3VudCkgewogICAgcHVzaChmb3JLZXl3b3JkKTsKICAgIHB1c2gobGVmdFBhcmVuKTsKICAgIHB1c2gobGVmdFNlcGFyYXRvcik7CiAgICBwdXNoKHVwZGF0ZUV4cHJlc3Npb25Db3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JDb250cm9sRmxvdyIpOwogICAgT2JqZWN0IGVudHJ5ID0gcG9wKCk7CiAgICBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50ID0gcG9wKCk7CiAgICBwb3AoKTsgLy8gbGVmdCBzZXBhcmF0b3IKICAgIHBvcCgpOyAvLyBsZWZ0IHBhcmVudGhlc2lzCiAgICBUb2tlbiBmb3JUb2tlbiA9IHBvcCgpOwogICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVzID0gcG9wTGlzdEZvckVmZmVjdCh1cGRhdGVFeHByZXNzaW9uQ291bnQpOwogICAgU3RhdGVtZW50IGNvbmRpdGlvblN0YXRlbWVudCA9IHBvcFN0YXRlbWVudCgpOyAvLyBjb25kaXRpb24KCiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIHBvcCgpOyAvLyBQb3AgdmFyaWFibGUgb3IgZXhwcmVzc2lvbi4KICAgICAgZXhpdExvY2FsU2NvcGUoKTsKICAgICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZGlzY2FyZE5vZGUoKTsKCiAgICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZvclRva2VuKSwKICAgICAgICAgIGZvclRva2VuLAogICAgICAgICAgZm9yVG9rZW4pOwogICAgICBwdXNoKGludmFsaWRDb2xsZWN0aW9uRWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2JlZ2luTm9kZV0gaW4KICAgIC8vIFtoYW5kbGVGb3JJbml0aWFsaXplckVtcHR5U3RhdGVtZW50XSwKICAgIC8vIFtoYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnRdLCBhbmQKICAgIC8vIFtoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbl0uCiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlRGVjbGFyYXRpb24+IGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8gPQogICAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmRlZmVyTm9kZSgpOwoKICAgIE9iamVjdCB2YXJpYWJsZU9yRXhwcmVzc2lvbiA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKCiAgICB0cmFuc2Zvcm1Db2xsZWN0aW9ucyA9IHRydWU7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgICAgX2J1aWxkRm9yTG9vcFZhcmlhYmxlRGVjbGFyYXRpb25zKHZhcmlhYmxlT3JFeHByZXNzaW9uKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uOwogICAgaWYgKGNvbmRpdGlvblN0YXRlbWVudCBpcyBFeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvblN0YXRlbWVudC5leHByZXNzaW9uOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGNvbmRpdGlvblN0YXRlbWVudCBpcyBFbXB0eVN0YXRlbWVudCk7CiAgICB9CiAgICBpZiAoZW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgRm9yTWFwRW50cnkgcmVzdWx0ID0gZm9yZXN0LmNyZWF0ZUZvck1hcEVudHJ5KAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oZm9yVG9rZW4pLCB2YXJpYWJsZXMsIGNvbmRpdGlvbiwgdXBkYXRlcywgZW50cnkpOwogICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzCiAgICAgICAgICA/LnN0b3JlSW5mbyhyZXN1bHQsIGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8pOwogICAgICBwdXNoKHJlc3VsdCk7CiAgICB9IGVsc2UgewogICAgICBGb3JFbGVtZW50IHJlc3VsdCA9IGZvcmVzdC5jcmVhdGVGb3JFbGVtZW50KG9mZnNldEZvclRva2VuKGZvclRva2VuKSwKICAgICAgICAgIHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCB0b1ZhbHVlKGVudHJ5KSk7CiAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXMKICAgICAgICAgID8uc3RvcmVJbmZvKHJlc3VsdCwgYXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbyk7CiAgICAgIHB1c2gocmVzdWx0KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9yU3RhdGVtZW50KFRva2VuIGVuZFRva2VuKSB7CiAgICBhc3NlcnQoY2hlY2tTdGF0ZShlbmRUb2tlbiwgPFZhbHVlS2luZD5bCiAgICAgIC8qIGJvZHkgKi8gVmFsdWVLaW5kcy5TdGF0ZW1lbnQsCiAgICAgIC8qIGV4cHJlc3Npb24gY291bnQgKi8gVmFsdWVLaW5kcy5JbnRlZ2VyLAogICAgICAvKiBsZWZ0IHNlcGFyYXRvciAqLyBWYWx1ZUtpbmRzLlRva2VuLAogICAgICAvKiBsZWZ0IHBhcmVudGhlc2lzICovIFZhbHVlS2luZHMuVG9rZW4sCiAgICAgIC8qIGZvciBrZXl3b3JkICovIFZhbHVlS2luZHMuVG9rZW4sCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJGb3JTdGF0ZW1lbnQiKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wU3RhdGVtZW50KCk7CgogICAgaW50IHVwZGF0ZUV4cHJlc3Npb25Db3VudCA9IHBvcCgpOwogICAgcG9wKCk7IC8vIExlZnQgc2VwYXJhdG9yLgogICAgcG9wKCk7IC8vIExlZnQgcGFyZW50aGVzaXMuCiAgICBUb2tlbiBmb3JLZXl3b3JkID0gcG9wKCk7CgogICAgYXNzZXJ0KGNoZWNrU3RhdGUoZW5kVG9rZW4sIDxWYWx1ZUtpbmQ+WwogICAgICAvKiBleHByZXNzaW9ucyAqLyAuLi5yZXBlYXRlZEtpbmRzKAogICAgICAgICAgdW5pb25PZktpbmRzKAogICAgICAgICAgICAgIDxWYWx1ZUtpbmQ+W1ZhbHVlS2luZHMuRXhwcmVzc2lvbiwgVmFsdWVLaW5kcy5HZW5lcmF0b3JdKSwKICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb25Db3VudCksCiAgICAgIC8qIGNvbmRpdGlvbiAqLyBWYWx1ZUtpbmRzLlN0YXRlbWVudCwKICAgICAgLyogdmFyaWFibGUgb3IgZXhwcmVzc2lvbiAqLyB1bmlvbk9mS2luZHMoPFZhbHVlS2luZD5bCiAgICAgICAgVmFsdWVLaW5kcy5HZW5lcmF0b3IsCiAgICAgICAgVmFsdWVLaW5kcy5FeHByZXNzaW9uT3JOdWxsLAogICAgICAgIFZhbHVlS2luZHMuU3RhdGVtZW50LAogICAgICAgIFZhbHVlS2luZHMuT2JqZWN0TGlzdCwKICAgICAgICBWYWx1ZUtpbmRzLlBhcnNlclJlY292ZXJ5LAogICAgICBdKSwKICAgIF0pKTsKCiAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXMgPSBwb3BMaXN0Rm9yRWZmZWN0KHVwZGF0ZUV4cHJlc3Npb25Db3VudCk7CiAgICBTdGF0ZW1lbnQgY29uZGl0aW9uU3RhdGVtZW50ID0gcG9wU3RhdGVtZW50KCk7CiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2JlZ2luTm9kZV0gaW4KICAgIC8vIFtoYW5kbGVGb3JJbml0aWFsaXplckVtcHR5U3RhdGVtZW50XSwKICAgIC8vIFtoYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnRdLCBhbmQKICAgIC8vIFtoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbl0uCiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlRGVjbGFyYXRpb24+IGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8gPQogICAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmRlZmVyTm9kZSgpOwoKICAgIE9iamVjdCB2YXJpYWJsZU9yRXhwcmVzc2lvbiA9IHBvcCgpOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMgPQogICAgICAgIF9idWlsZEZvckxvb3BWYXJpYWJsZURlY2xhcmF0aW9ucyh2YXJpYWJsZU9yRXhwcmVzc2lvbik7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9IGV4aXRDb250aW51ZVRhcmdldCgpOwogICAgSnVtcFRhcmdldCBicmVha1RhcmdldCA9IGV4aXRCcmVha1RhcmdldCgpOwogICAgTGlzdDxCcmVha1N0YXRlbWVudEltcGw+IGNvbnRpbnVlU3RhdGVtZW50czsKICAgIGlmIChjb250aW51ZVRhcmdldC5oYXNVc2VycykgewogICAgICBib2R5ID0gZm9yZXN0LmNyZWF0ZUxhYmVsZWRTdGF0ZW1lbnQoYm9keSk7CiAgICAgIGNvbnRpbnVlU3RhdGVtZW50cyA9IGNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCBib2R5KTsKICAgIH0KICAgIEV4cHJlc3Npb24gY29uZGl0aW9uOwogICAgaWYgKGNvbmRpdGlvblN0YXRlbWVudCBpcyBFeHByZXNzaW9uU3RhdGVtZW50KSB7CiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvblN0YXRlbWVudC5leHByZXNzaW9uOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGNvbmRpdGlvblN0YXRlbWVudCBpcyBFbXB0eVN0YXRlbWVudCk7CiAgICB9CiAgICBTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gZm9yZXN0LmNyZWF0ZUZvclN0YXRlbWVudCgKICAgICAgICBvZmZzZXRGb3JUb2tlbihmb3JLZXl3b3JkKSwgdmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXMsIGJvZHkpOwogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcwogICAgICAgID8uc3RvcmVJbmZvKGZvclN0YXRlbWVudCwgYXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbyk7CiAgICBpZiAoY29udGludWVTdGF0ZW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yIChCcmVha1N0YXRlbWVudEltcGwgY29udGludWVTdGF0ZW1lbnQgaW4gY29udGludWVTdGF0ZW1lbnRzKSB7CiAgICAgICAgY29udGludWVTdGF0ZW1lbnQudGFyZ2V0U3RhdGVtZW50ID0gZm9yU3RhdGVtZW50OwogICAgICB9CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gZm9yU3RhdGVtZW50OwogICAgaWYgKGJyZWFrVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIHJlc3VsdCA9IGZvcmVzdC5jcmVhdGVMYWJlbGVkU3RhdGVtZW50KHJlc3VsdCk7CiAgICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQsIGZvclN0YXRlbWVudCk7CiAgICB9CiAgICBpZiAodmFyaWFibGVPckV4cHJlc3Npb24gaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHJvYmxlbUluTG9vcE9yU3dpdGNoID8/PSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICBmYXN0YS5tZXNzYWdlU3ludGhldGljVG9rZW4sIHZhcmlhYmxlT3JFeHByZXNzaW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICBzdXBwcmVzc01lc3NhZ2U6IHRydWUpOwogICAgfQogICAgZXhpdExvb3BPclN3aXRjaChyZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBd2FpdEV4cHJlc3Npb24oVG9rZW4ga2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkF3YWl0RXhwcmVzc2lvbiIpOwogICAgaW50IGZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihrZXl3b3JkKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBwb3BGb3JWYWx1ZSgpOwogICAgaWYgKGluTGF0ZUxvY2FsSW5pdGlhbGl6ZXIpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZUF3YWl0SW5MYXRlTG9jYWxJbml0aWFsaXplciwgZmlsZU9mZnNldCwKICAgICAgICAgIGtleXdvcmQuY2hhckNvdW50KSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVBd2FpdEV4cHJlc3Npb24oZmlsZU9mZnNldCwgdmFsdWUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW52YWxpZEF3YWl0RXhwcmVzc2lvbigKICAgICAgVG9rZW4ga2V5d29yZCwgVG9rZW4gZW5kVG9rZW4sIGZhc3RhLk1lc3NhZ2VDb2RlIGVycm9yQ29kZSkgewogICAgZGVidWdFdmVudCgiQXdhaXRFeHByZXNzaW9uIik7CiAgICBwb3BGb3JWYWx1ZSgpOwogICAgcHVzaChidWlsZFByb2JsZW0oZXJyb3JDb2RlLCBrZXl3b3JkLm9mZnNldCwga2V5d29yZC5sZW5ndGgpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXN5bmNNb2RpZmllcihUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzeW5jTW9kaWZpZXIiKTsKICAgIHB1c2goYXN5bmNNYXJrZXJGcm9tVG9rZW5zKGFzeW5jVG9rZW4sIHN0YXJUb2tlbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsTGlzdCgKICAgICAgaW50IGNvdW50LCBUb2tlbiBsZWZ0QnJhY2tldCwgVG9rZW4gY29uc3RLZXl3b3JkLCBUb2tlbiByaWdodEJyYWNrZXQpIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxMaXN0Iik7CgogICAgaWYgKGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQucmVxdWlyZWQgJiYgY29uc3RLZXl3b3JkID09IG51bGwpIHsKICAgICAgYWRkUHJvYmxlbShmYXN0YS5tZXNzYWdlTWlzc2luZ0V4cGxpY2l0Q29uc3QsIG9mZnNldEZvclRva2VuKGxlZnRCcmFja2V0KSwKICAgICAgICAgIG5vTGVuZ3RoKTsKICAgIH0KCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVwbGFjZSB0aGlzIHdpdGggcG9wTGlzdEZvclZhbHVlCiAgICAvLyB3aGVuIGNvbnRyb2wgZmxvdyBhbmQgc3ByZWFkIGNvbGxlY3Rpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IGRlZmF1bHQKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+LmZpbGxlZChjb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgT2JqZWN0IGVsZW0gPSBwb3AoKTsKICAgICAgaWYgKGVsZW0gIT0gaW52YWxpZENvbGxlY3Rpb25FbGVtZW50KSB7CiAgICAgICAgZXhwcmVzc2lvbnNbaV0gPSB0b1ZhbHVlKGVsZW0pOwogICAgICB9IGVsc2UgewogICAgICAgIGV4cHJlc3Npb25zLnJlbW92ZUF0KGkpOwogICAgICB9CiAgICB9CgogICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwoKICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudDsKICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VMaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbihsZWZ0QnJhY2tldCksCiAgICAgICAgICAgIGxlbmd0aE9mU3BhbihsZWZ0QnJhY2tldCwgbGVmdEJyYWNrZXQuZW5kR3JvdXApKTsKICAgICAgICB0eXBlQXJndW1lbnQgPSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGVBcmd1bWVudCA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogICAgICAgIHR5cGVBcmd1bWVudCA9IGluc3RhbnRpYXRlVG9Cb3VuZHModHlwZUFyZ3VtZW50LCBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0eXBlQXJndW1lbnQgPSBpbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIH0KCiAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QuY3JlYXRlTGlzdExpdGVyYWwoCiAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVGhlIGZpbGUgb2Zmc2V0IGNvbXB1dGVkIGJlbG93IHdpbGwgbm90IGJlCiAgICAgICAgLy8gY29ycmVjdCBpZiB0aGVyZSBhcmUgdHlwZSBhcmd1bWVudHMgYnV0IG5vIGBjb25zdGAga2V5d29yZC4KICAgICAgICBvZmZzZXRGb3JUb2tlbihjb25zdEtleXdvcmQgPz8gbGVmdEJyYWNrZXQpLAogICAgICAgIHR5cGVBcmd1bWVudCwKICAgICAgICBleHByZXNzaW9ucywKICAgICAgICBpc0NvbnN0OiBjb25zdEtleXdvcmQgIT0gbnVsbCB8fAogICAgICAgICAgICBjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKTsKICAgIGxpYnJhcnlCdWlsZGVyLmNoZWNrQm91bmRzSW5MaXN0TGl0ZXJhbChub2RlLCB0eXBlRW52aXJvbm1lbnQsIHVyaSk7CiAgICBwdXNoKG5vZGUpOwogIH0KCiAgdm9pZCBidWlsZExpdGVyYWxTZXQoTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cywgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBUb2tlbiBsZWZ0QnJhY2UsIExpc3Q8ZHluYW1pYz4gc2V0T3JNYXBFbnRyaWVzKSB7CiAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQ7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGJ1aWxkRGFydFR5cGUodHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogICAgICB0eXBlQXJndW1lbnQgPSBpbnN0YW50aWF0ZVRvQm91bmRzKHR5cGVBcmd1bWVudCwgY29yZVR5cGVzLm9iamVjdENsYXNzKTsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGVBcmd1bWVudCA9IGltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgfQoKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSA8RXhwcmVzc2lvbj5bXTsKICAgIGlmIChzZXRPck1hcEVudHJpZXMgIT0gbnVsbCkgewogICAgICBmb3IgKGR5bmFtaWMgZW50cnkgaW4gc2V0T3JNYXBFbnRyaWVzKSB7CiAgICAgICAgaWYgKGVudHJ5IGlzIE1hcEVudHJ5KSB7CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVwb3J0IHRoZSBlcnJvciBvbiB0aGUgY29sb24KICAgICAgICAgIGFkZFByb2JsZW0oZmFzdGEudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyksCiAgICAgICAgICAgICAgZW50cnkuZmlsZU9mZnNldCwgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZXZpc2Ugb25jZSBjb250cm9sIGZsb3cgYW5kIHNwcmVhZAogICAgICAgICAgLy8gIGNvbGxlY3Rpb24gZW50cmllcyBhcmUgc3VwcG9ydGVkLgogICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKGVudHJ5IGFzIEV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIEV4cHJlc3Npb24gbm9kZSA9IGZvcmVzdC5jcmVhdGVTZXRMaXRlcmFsKAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoZSBmaWxlIG9mZnNldCBjb21wdXRlZCBiZWxvdyB3aWxsIG5vdCBiZQogICAgICAgIC8vIGNvcnJlY3QgaWYgdGhlcmUgYXJlIHR5cGUgYXJndW1lbnRzIGJ1dCBubyBgY29uc3RgIGtleXdvcmQuCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oY29uc3RLZXl3b3JkID8/IGxlZnRCcmFjZSksCiAgICAgICAgdHlwZUFyZ3VtZW50LAogICAgICAgIGV4cHJlc3Npb25zLAogICAgICAgIGlzQ29uc3Q6IGNvbnN0S2V5d29yZCAhPSBudWxsIHx8CiAgICAgICAgICAgIGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQpOwogICAgbGlicmFyeUJ1aWxkZXIuY2hlY2tCb3VuZHNJblNldExpdGVyYWwobm9kZSwgdHlwZUVudmlyb25tZW50LCB1cmkpOwogICAgcHVzaChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbFNldE9yTWFwKAogICAgaW50IGNvdW50LAogICAgVG9rZW4gbGVmdEJyYWNlLAogICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgVG9rZW4gcmlnaHRCcmFjZSwKICAgIC8vIFRPRE8oZGFucnViZWwpOiBoYXNTZXRFbnRyeSBwYXJhbWV0ZXIgZXhpc3RzIGZvciByZXBsaWNhdGluZyBleGlzdGluZwogICAgLy8gYmVoYXZpb3IgYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHVuaWZpZWQgY29sbGVjdGlvbiBoYXMgYmVlbiBlbmFibGVkCiAgICBib29sIGhhc1NldEVudHJ5LAogICkgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbFNldE9yTWFwIik7CgogICAgaWYgKGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQucmVxdWlyZWQgJiYgY29uc3RLZXl3b3JkID09IG51bGwpIHsKICAgICAgYWRkUHJvYmxlbShmYXN0YS5tZXNzYWdlTWlzc2luZ0V4cGxpY2l0Q29uc3QsIG9mZnNldEZvclRva2VuKGxlZnRCcmFjZSksCiAgICAgICAgICBub0xlbmd0aCk7CiAgICB9CgogICAgTGlzdDxkeW5hbWljPiBzZXRPck1hcEVudHJpZXMgPQogICAgICAgIG5ldyBMaXN0PGR5bmFtaWM+LmZpbGxlZChjb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgT2JqZWN0IGVsZW0gPSBwb3AoKTsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IFJldmlzZSB0aGlzIHRvIGhhbmRsZSBjb250cm9sIGZsb3cgYW5kIHNwcmVhZAogICAgICBpZiAoZWxlbSA9PSBpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpIHsKICAgICAgICBzZXRPck1hcEVudHJpZXMucmVtb3ZlQXQoaSk7CiAgICAgIH0gZWxzZSBpZiAoZWxlbSBpcyBNYXBFbnRyeSkgewogICAgICAgIHNldE9yTWFwRW50cmllc1tpXSA9IGVsZW07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0T3JNYXBFbnRyaWVzW2ldID0gdG9WYWx1ZShlbGVtKTsKICAgICAgfQogICAgfQogICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwoKICAgIC8vIFJlcGxpY2F0ZSBleGlzdGluZyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyc2VyLgogICAgLy8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb25zIGlzIGltcGxlbWVudGVkLgoKICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2V0IG9yIG1hcCBiYXNlZCBvbiB0eXBlIGFyZ3MgYW5kIGNvbnRlbnQKICAgIC8vIFRPRE8oZGFucnViZWwpOiBTaW5jZSB0eXBlIHJlc29sdXRpb24gaXMgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZQogICAgLy8gc2V0IG9yIG1hcCBpbiBzb21lIHNpdHVhdGlvbnMsIGNvbnNpZGVyIGFsd2F5cyBkZWZlcnJpbmcgZGV0ZXJtaW5hdGlvbgogICAgLy8gdW50aWwgdGhlIHR5cGUgcmVzb2x1dGlvbiBwaGFzZS4KICAgIGZpbmFsIGludCB0eXBlQXJnQ291bnQgPSB0eXBlQXJndW1lbnRzPy5sZW5ndGg7CiAgICBib29sIGlzU2V0ID0gdHlwZUFyZ0NvdW50ID09IDEgPyB0cnVlIDogdHlwZUFyZ0NvdW50ICE9IG51bGwgPyBmYWxzZSA6IG51bGw7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRPck1hcEVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHNldE9yTWFwRW50cmllc1tpXSBpcyEgTWFwRW50cnkgJiYKICAgICAgICAgICFpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeShzZXRPck1hcEVudHJpZXNbaV0pKSB7CiAgICAgICAgaGFzU2V0RW50cnkgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgLy8gVE9ETyhkYW5ydWJlbCk6IElmIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgbm90IGtub3duIChudWxsKSB0aGVuCiAgICAvLyBkZWZlciBzZXQvbWFwIGRldGVybWluYXRpb24gdW50aWwgYWZ0ZXIgdHlwZSByZXNvbHV0aW9uIGFzIHBlciB0aGUKICAgIC8vIHVuaWZpZWQgY29sbGVjdGlvbiBzcGVjOiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL3B1bGwvMjAwCiAgICAvLyByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZ3Vlc3MgYXMgZG9uZSBiZWxvdy4KICAgIGlzU2V0ID8/PSBoYXNTZXRFbnRyeTsKCiAgICBpZiAoaXNTZXQpIHsKICAgICAgYnVpbGRMaXRlcmFsU2V0KHR5cGVBcmd1bWVudHMsIGNvbnN0S2V5d29yZCwgbGVmdEJyYWNlLCBzZXRPck1hcEVudHJpZXMpOwogICAgfSBlbHNlIHsKICAgICAgTGlzdDxNYXBFbnRyeT4gbWFwRW50cmllcyA9IG5ldyBMaXN0PE1hcEVudHJ5PihzZXRPck1hcEVudHJpZXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRPck1hcEVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoc2V0T3JNYXBFbnRyaWVzW2ldIGlzIE1hcEVudHJ5KSB7CiAgICAgICAgICBtYXBFbnRyaWVzW2ldID0gc2V0T3JNYXBFbnRyaWVzW2ldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXBFbnRyaWVzW2ldID0gY29udmVydFRvTWFwRW50cnkoc2V0T3JNYXBFbnRyaWVzW2ldLCB0aGlzLAogICAgICAgICAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LnJlYXNzaWduSW5mbyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJ1aWxkTGl0ZXJhbE1hcCh0eXBlQXJndW1lbnRzLCBjb25zdEtleXdvcmQsIGxlZnRCcmFjZSwgbWFwRW50cmllcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxCb29sKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsQm9vbCIpOwogICAgYm9vbCB2YWx1ZSA9IG9wdGlvbmFsKCJ0cnVlIiwgdG9rZW4pOwogICAgYXNzZXJ0KHZhbHVlIHx8IG9wdGlvbmFsKCJmYWxzZSIsIHRva2VuKSk7CiAgICBwdXNoKGZvcmVzdC5jcmVhdGVCb29sTGl0ZXJhbChvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZhbHVlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxEb3VibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxEb3VibGUiKTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZURvdWJsZUxpdGVyYWwoCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBkb3VibGUucGFyc2UodG9rZW4ubGV4ZW1lKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsTnVsbChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTGl0ZXJhbE51bGwiKTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKG9mZnNldEZvclRva2VuKHRva2VuKSkpOwogIH0KCiAgdm9pZCBidWlsZExpdGVyYWxNYXAoTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cywgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgICBUb2tlbiBsZWZ0QnJhY2UsIExpc3Q8TWFwRW50cnk+IGVudHJpZXMpIHsKICAgIERhcnRUeXBlIGtleVR5cGU7CiAgICBEYXJ0VHlwZSB2YWx1ZVR5cGU7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSAyKSB7CiAgICAgICAga2V5VHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgICAgdmFsdWVUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBrZXlUeXBlID0gYnVpbGREYXJ0VHlwZSh0eXBlQXJndW1lbnRzWzBdKTsKICAgICAgICB2YWx1ZVR5cGUgPSBidWlsZERhcnRUeXBlKHR5cGVBcmd1bWVudHNbMV0pOwogICAgICAgIGtleVR5cGUgPSBpbnN0YW50aWF0ZVRvQm91bmRzKGtleVR5cGUsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICAgICAgdmFsdWVUeXBlID0gaW5zdGFudGlhdGVUb0JvdW5kcyh2YWx1ZVR5cGUsIGNvcmVUeXBlcy5vYmplY3RDbGFzcyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIERhcnRUeXBlIGltcGxpY2l0VHlwZUFyZ3VtZW50ID0gdGhpcy5pbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgICAga2V5VHlwZSA9IGltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgICB2YWx1ZVR5cGUgPSBpbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIH0KCiAgICBFeHByZXNzaW9uIG5vZGUgPSBmb3Jlc3QuY3JlYXRlTWFwTGl0ZXJhbCgKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGUgZmlsZSBvZmZzZXQgY29tcHV0ZWQgYmVsb3cgd2lsbCBub3QgYmUKICAgICAgICAvLyBjb3JyZWN0IGlmIHRoZXJlIGFyZSB0eXBlIGFyZ3VtZW50cyBidXQgbm8gYGNvbnN0YCBrZXl3b3JkLgogICAgICAgIG9mZnNldEZvclRva2VuKGNvbnN0S2V5d29yZCA/PyBsZWZ0QnJhY2UpLAogICAgICAgIGtleVR5cGUsCiAgICAgICAgdmFsdWVUeXBlLAogICAgICAgIGVudHJpZXMsCiAgICAgICAgaXNDb25zdDogY29uc3RLZXl3b3JkICE9IG51bGwgfHwKICAgICAgICAgICAgY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5pbmZlcnJlZCk7CiAgICBsaWJyYXJ5QnVpbGRlci5jaGVja0JvdW5kc0luTWFwTGl0ZXJhbChub2RlLCB0eXBlRW52aXJvbm1lbnQsIHVyaSk7CiAgICBwdXNoKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsTWFwRW50cnkoVG9rZW4gY29sb24sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJMaXRlcmFsTWFwRW50cnkiKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBwb3BGb3JWYWx1ZSgpOwogICAgRXhwcmVzc2lvbiBrZXkgPSBwb3BGb3JWYWx1ZSgpOwogICAgcHVzaChmb3Jlc3QuY3JlYXRlTWFwRW50cnkob2Zmc2V0Rm9yVG9rZW4oY29sb24pLCBrZXksIHZhbHVlKSk7CiAgfQoKICBTdHJpbmcgc3ltYm9sUGFydFRvU3RyaW5nKG5hbWUpIHsKICAgIGlmIChuYW1lIGlzIElkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIG5hbWUubmFtZTsKICAgIH0gZWxzZSBpZiAobmFtZSBpcyBPcGVyYXRvcikgewogICAgICByZXR1cm4gbmFtZS5uYW1lOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJzeW1ib2xQYXJ0VG9TdHJpbmciLCAtMSwgdXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN5bWJvbChUb2tlbiBoYXNoVG9rZW4sIGludCBpZGVudGlmaWVyQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkxpdGVyYWxTeW1ib2wiKTsKICAgIGlmIChpZGVudGlmaWVyQ291bnQgPT0gMSkgewogICAgICBPYmplY3QgcGFydCA9IHBvcCgpOwogICAgICBpZiAocGFydCBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIHB1c2gobmV3IFBhcnNlckVycm9yR2VuZXJhdG9yKAogICAgICAgICAgICB0aGlzLCBoYXNoVG9rZW4sIGZhc3RhLm1lc3NhZ2VTeW50aGV0aWNUb2tlbikpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZVN5bWJvbExpdGVyYWwoCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKGhhc2hUb2tlbiksIHN5bWJvbFBhcnRUb1N0cmluZyhwYXJ0KSkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBMaXN0PElkZW50aWZpZXI+IHBhcnRzID0KICAgICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PElkZW50aWZpZXI+KCkucG9wKHN0YWNrLCBpZGVudGlmaWVyQ291bnQpOwogICAgICBpZiAocGFydHMgPT0gbnVsbCkgewogICAgICAgIHB1c2gobmV3IFBhcnNlckVycm9yR2VuZXJhdG9yKAogICAgICAgICAgICB0aGlzLCBoYXNoVG9rZW4sIGZhc3RhLm1lc3NhZ2VTeW50aGV0aWNUb2tlbikpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBTdHJpbmcgdmFsdWUgPSBzeW1ib2xQYXJ0VG9TdHJpbmcocGFydHMuZmlyc3QpOwogICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFsdWUgKz0gIi4ke3N5bWJvbFBhcnRUb1N0cmluZyhwYXJ0c1tpXSl9IjsKICAgICAgfQogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVTeW1ib2xMaXRlcmFsKG9mZnNldEZvclRva2VuKGhhc2hUb2tlbiksIHZhbHVlKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKFRva2VuIGJhbmcpIHsKICAgIGFzc2VydChjaGVja1N0YXRlKGJhbmcsIFsKICAgICAgdW5pb25PZktpbmRzKFtWYWx1ZUtpbmRzLkV4cHJlc3Npb24sIFZhbHVlS2luZHMuR2VuZXJhdG9yXSkKICAgIF0pKTsKICAgIGlmICghbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXBvcnROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbk5vdEVuYWJsZWQoYmFuZyk7CiAgICB9CiAgICBPYmplY3Qgb3BlcmFuZCA9IHBvcCgpOwogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogICAgaWYgKG9wZXJhbmQgaXMgR2VuZXJhdG9yKSB7CiAgICAgIGV4cHJlc3Npb24gPSBvcGVyYW5kLmJ1aWxkU2ltcGxlUmVhZCgpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KG9wZXJhbmQgaXMgRXhwcmVzc2lvbik7CiAgICAgIGV4cHJlc3Npb24gPSBvcGVyYW5kOwogICAgfQogICAgcHVzaChmb3Jlc3QuY3JlYXRlTnVsbENoZWNrKG9mZnNldEZvclRva2VuKGJhbmcpLCBleHByZXNzaW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICAvLyBUT0RPKGFoZSk6IFRoZSBzY29wZSBpcyB3cm9uZyBmb3IgcmV0dXJuIHR5cGVzIG9mIGdlbmVyaWMgZnVuY3Rpb25zLgogICAgZGVidWdFdmVudCgiVHlwZSIpOwogICAgaWYgKCFsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGUocXVlc3Rpb25NYXJrKTsKICAgIH0KICAgIGJvb2wgaXNNYXJrZWRBc051bGxhYmxlID0gcXVlc3Rpb25NYXJrICE9IG51bGw7CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiBhcmd1bWVudHMgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkID0gbmFtZTsKICAgICAgT2JqZWN0IHByZWZpeCA9IHF1YWxpZmllZC5xdWFsaWZpZXI7CiAgICAgIFRva2VuIHN1ZmZpeCA9IGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKHF1YWxpZmllZCk7CiAgICAgIGlmIChwcmVmaXggaXMgR2VuZXJhdG9yKSB7CiAgICAgICAgbmFtZSA9IHByZWZpeC5xdWFsaWZpZWRMb29rdXAoc3VmZml4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5vZGVOYW1lKHByZWZpeCk7CiAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gZGVidWdOYW1lKG5hbWUsIHN1ZmZpeC5sZXhlbWUpOwogICAgICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihiZWdpblRva2VuKTsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmYXN0YS50ZW1wbGF0ZU5vdEFUeXBlLndpdGhBcmd1bWVudHMoZGlzcGxheU5hbWUpOwogICAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2UsIG9mZnNldCwgbGVuZ3RoT2ZTcGFuKGJlZ2luVG9rZW4sIHN1ZmZpeCksIHVyaSk7CiAgICAgICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGUoCiAgICAgICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsCiAgICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5udWxsYWJsZUJ1aWxkZXJJZlRydWUoaXNNYXJrZWRBc051bGxhYmxlKSwgbnVsbCkKICAgICAgICAgICAgICAuLmJpbmQobmV3IEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICBtZXNzYWdlLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgIHVyaSwgb2Zmc2V0LCBsZW5ndGhPZlNwYW4oYmVnaW5Ub2tlbiwgc3VmZml4KSkpKSwKICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICB1cmkpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIFR5cGVCdWlsZGVyIHJlc3VsdDsKICAgIGlmIChuYW1lIGlzIEdlbmVyYXRvcikgewogICAgICByZXN1bHQgPSBuYW1lLmJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cygKICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLm51bGxhYmxlQnVpbGRlcklmVHJ1ZShpc01hcmtlZEFzTnVsbGFibGUpLCBhcmd1bWVudHMpOwogICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoIm51bGwiLCAicmVzdWx0IiwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5hbWUgaXMgUHJvYmxlbUJ1aWxkZXIpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBBcmd1bWVudHMgY291bGQgYmUgcGFzc2VkIGhlcmUuCiAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICBuYW1lLm1lc3NhZ2UsIG5hbWUuY2hhck9mZnNldCwgbmFtZS5uYW1lLmxlbmd0aCwgbmFtZS5maWxlVXJpKTsKICAgICAgcmVzdWx0ID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIobmFtZS5uYW1lLAogICAgICAgICAgbGlicmFyeUJ1aWxkZXIubnVsbGFibGVCdWlsZGVySWZUcnVlKGlzTWFya2VkQXNOdWxsYWJsZSksIG51bGwpCiAgICAgICAgLi5iaW5kKG5ldyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgICAgICAgbmFtZS5uYW1lLAogICAgICAgICAgICBuYW1lLm1lc3NhZ2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgbmFtZS5maWxlVXJpLCBuYW1lLmNoYXJPZmZzZXQsIG5hbWUubmFtZS5sZW5ndGgpKSk7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoCiAgICAgICAgICAiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJoYW5kbGVUeXBlIiwgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LCB1cmkpOwogICAgfQogICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGUocmVzdWx0LCBiZWdpblRva2VuLmNoYXJPZmZzZXQsIHVyaSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZShUb2tlbiBiZWdpblRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZ1bmN0aW9uVHlwZSIpOwogIH0KCiAgdm9pZCBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcykgewogICAgZGVidWdFdmVudCgiZW50ZXJGdW5jdGlvblR5cGVTY29wZSIpOwogICAgZW50ZXJMb2NhbFNjb3BlKG51bGwsCiAgICAgICAgc2NvcGUuY3JlYXRlTmVzdGVkU2NvcGUoImZ1bmN0aW9uLXR5cGUgc2NvcGUiLCBpc01vZGlmaWFibGU6IHRydWUpKTsKICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgU2NvcGVCdWlsZGVyIHNjb3BlQnVpbGRlciA9IG5ldyBTY29wZUJ1aWxkZXIoc2NvcGUpOwogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBidWlsZGVyLm5hbWU7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBleGlzdGluZyA9IHNjb3BlQnVpbGRlcltuYW1lXTsKICAgICAgICBpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewogICAgICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBidWlsZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0RHVwbGljYXRlZERlY2xhcmF0aW9uKGV4aXN0aW5nLCBuYW1lLCBidWlsZGVyLmNoYXJPZmZzZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGUiKTsKICAgIGlmICghbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlKHF1ZXN0aW9uTWFyayk7CiAgICB9CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgaWYgKGJ1aWxkZXIucGFyYW1ldGVyLmFubm90YXRpb25zLmlzTm90RW1wdHkpIHsKICAgICAgICAgIGFkZFByb2JsZW0oZmFzdGEubWVzc2FnZUFubm90YXRpb25PbkZ1bmN0aW9uVHlwZVR5cGVWYXJpYWJsZSwKICAgICAgICAgICAgICBidWlsZGVyLmNoYXJPZmZzZXQsIGJ1aWxkZXIubmFtZS5sZW5ndGgpOwogICAgICAgICAgYnVpbGRlci5wYXJhbWV0ZXIuYW5ub3RhdGlvbnMgPSBjb25zdCA8RXhwcmVzc2lvbj5bXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFVucmVzb2x2ZWRUeXBlIHR5cGUgPSBmb3JtYWxzLnRvRnVuY3Rpb25UeXBlKAogICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgbGlicmFyeUJ1aWxkZXIubnVsbGFibGVCdWlsZGVySWZUcnVlKHF1ZXN0aW9uTWFyayAhPSBudWxsKSwKICAgICAgICB0eXBlVmFyaWFibGVzKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKHR5cGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVm9pZEtleXdvcmQiKTsKICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICAvLyAidm9pZCIgaXMgYWx3YXlzIG51bGxhYmxlLgogICAgcHVzaChuZXcgVW5yZXNvbHZlZFR5cGUoCiAgICAgICAgbmV3IE5hbWVkVHlwZUJ1aWxkZXIoInZvaWQiLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKSwgbnVsbCkKICAgICAgICAgIC4uYmluZChuZXcgVm9pZFR5cGVCdWlsZGVyKGNvbnN0IFZvaWRUeXBlKCksIGxpYnJhcnlCdWlsZGVyLCBvZmZzZXQpKSwKICAgICAgICBvZmZzZXQsCiAgICAgICAgdXJpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzT3BlcmF0b3IoVG9rZW4gb3BlcmF0b3IpIHsKICAgIGRlYnVnRXZlbnQoIkFzT3BlcmF0b3IiKTsKICAgIERhcnRUeXBlIHR5cGUgPSBidWlsZERhcnRUeXBlKHBvcCgpKTsKICAgIGxpYnJhcnlCdWlsZGVyLmNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgIHR5cGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpLCBvcGVyYXRvci5jaGFyT2Zmc2V0KTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBFeHByZXNzaW9uIGFzRXhwcmVzc2lvbiA9IGZvcmVzdC5jcmVhdGVBc0V4cHJlc3Npb24oCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4ob3BlcmF0b3IpLCBleHByZXNzaW9uLCB0eXBlLAogICAgICAgIGZvck5vbk51bGxhYmxlQnlEZWZhdWx0OiBsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICAgIHB1c2goYXNFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSXNPcGVyYXRvcihUb2tlbiBpc09wZXJhdG9yLCBUb2tlbiBub3QpIHsKICAgIGRlYnVnRXZlbnQoIklzT3BlcmF0b3IiKTsKICAgIERhcnRUeXBlIHR5cGUgPSBidWlsZERhcnRUeXBlKHBvcCgpKTsKICAgIEV4cHJlc3Npb24gb3BlcmFuZCA9IHBvcEZvclZhbHVlKCk7CiAgICBib29sIGlzSW52ZXJ0ZWQgPSBub3QgIT0gbnVsbDsKICAgIEV4cHJlc3Npb24gaXNFeHByZXNzaW9uID0gZm9yZXN0LmNyZWF0ZUlzRXhwcmVzc2lvbigKICAgICAgICBvZmZzZXRGb3JUb2tlbihpc09wZXJhdG9yKSwgb3BlcmFuZCwgdHlwZSwKICAgICAgICBmb3JOb25OdWxsYWJsZUJ5RGVmYXVsdDogbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCwKICAgICAgICBub3RGaWxlT2Zmc2V0OiBub3QgIT0gbnVsbCA/IG9mZnNldEZvclRva2VuKG5vdCkgOiBudWxsKTsKICAgIGxpYnJhcnlCdWlsZGVyLmNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgIHR5cGUsIHR5cGVFbnZpcm9ubWVudCwgdXJpLCBpc09wZXJhdG9yLmNoYXJPZmZzZXQpOwogICAgaWYgKG9wZXJhbmQgaXMgVmFyaWFibGVHZXQpIHsKICAgICAgdHlwZVByb21vdGVyPy5oYW5kbGVJc0NoZWNrKGlzRXhwcmVzc2lvbiwgaXNJbnZlcnRlZCwgb3BlcmFuZC52YXJpYWJsZSwKICAgICAgICAgIHR5cGUsIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgIH0KICAgIHB1c2goaXNFeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24pIHsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJUaGVuKGNvbmRpdGlvbik7CiAgICBwdXNoKGNvbmRpdGlvbik7CiAgICBzdXBlci5iZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihxdWVzdGlvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uKCkgewogICAgRXhwcmVzc2lvbiB0aGVuID0gcG9wRm9yVmFsdWUoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgICBwdXNoKHRoZW4pOwogICAgc3VwZXIuaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKFRva2VuIHF1ZXN0aW9uLCBUb2tlbiBjb2xvbikgewogICAgZGVidWdFdmVudCgiQ29uZGl0aW9uYWxFeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIGVsc2VFeHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIEV4cHJlc3Npb24gdGhlbkV4cHJlc3Npb24gPSBwb3AoKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gcG9wKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwogICAgcHVzaChmb3Jlc3QuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgIG9mZnNldEZvclRva2VuKHF1ZXN0aW9uKSwgY29uZGl0aW9uLCB0aGVuRXhwcmVzc2lvbiwgZWxzZUV4cHJlc3Npb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVGhyb3dFeHByZXNzaW9uKFRva2VuIHRocm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUaHJvd0V4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24ud2l0aEFyZ3VtZW50cygnVGhyb3cnKSwKICAgICAgICAgIHRocm93VG9rZW4ub2Zmc2V0LAogICAgICAgICAgdGhyb3dUb2tlbi5sZW5ndGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZVRocm93KG9mZnNldEZvclRva2VuKHRocm93VG9rZW4pLCBleHByZXNzaW9uKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQsIFRva2VuIHJlcXVpcmVkVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiB2YXJGaW5hbE9yQ29uc3QpIHsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBoYW5kbGUgcmVxdWlyZWQgdG9rZW4KICAgIGlmICghbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXBvcnROb25OdWxsYWJsZU1vZGlmaWVyRXJyb3IocmVxdWlyZWRUb2tlbik7CiAgICB9CiAgICBwdXNoKChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsID8gY292YXJpYW50TWFzayA6IDApIHwKICAgICAgICAocmVxdWlyZWRUb2tlbiAhPSBudWxsID8gcmVxdWlyZWRNYXNrIDogMCkgfAogICAgICAgIE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0KHZhckZpbmFsT3JDb25zdD8ubGV4ZW1lKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcigKICAgICAgVG9rZW4gdGhpc0tleXdvcmQsCiAgICAgIFRva2VuIHBlcmlvZEFmdGVyVGhpcywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBpbml0aWFsaXplclN0YXJ0LAogICAgICBUb2tlbiBpbml0aWFsaXplckVuZCwKICAgICAgRm9ybWFsUGFyYW1ldGVyS2luZCBraW5kLAogICAgICBNZW1iZXJLaW5kIG1lbWJlcktpbmQpIHsKICAgIGRlYnVnRXZlbnQoIkZvcm1hbFBhcmFtZXRlciIpOwogICAgaWYgKHRoaXNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgaWYgKCFpbkNvbnN0cnVjdG9yKSB7CiAgICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcihmYXN0YS5tZXNzYWdlRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvciwKICAgICAgICAgICAgdGhpc0tleXdvcmQsIHRoaXNLZXl3b3JkKTsKICAgICAgICB0aGlzS2V5d29yZCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIE9iamVjdCBuYW1lTm9kZSA9IHBvcCgpOwogICAgVW5yZXNvbHZlZFR5cGUgdHlwZSA9IHBvcCgpOwogICAgaWYgKGZ1bmN0aW9uTmVzdGluZ0xldmVsID09IDApIHsKICAgICAgLy8gVE9ETyhhaGUpOiBUaGUgdHlwZSB3ZSBjb21wdXRlIGhlcmUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHdoYXQgaXMKICAgICAgLy8gY29tcHV0ZWQgaW4gdGhlIG91dGxpbmUgcGhhc2UuIFdlIHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgb3V0bGluZQogICAgICAvLyBwaGFzZSBjb21wdXRlcyB0aGUgc2FtZSB0eXBlLiBTZWUKICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZGVmZXJyZWRfdHlwZV9hbm5vdGF0aW9uLmRhcnQgZm9yIGFuIGV4YW1wbGUKICAgICAgLy8gd2hlcmUgbm90IGNhbGxpbmcgW2J1aWxkRGFydFR5cGVdIGxlYWRzIHRvIGEgbWlzc2luZyBjb21waWxlLXRpbWUKICAgICAgLy8gZXJyb3IuIEFsc28sIG5vdGljZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBwcm9ibGVtYXRpYyBwYXJhbWV0ZXIgaXNuJ3QKICAgICAgLy8gYGludmFsaWQtdHlwZWAuCiAgICAgIGJ1aWxkRGFydFR5cGUodHlwZSk7CiAgICB9CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBpZiAoaW5DYXRjaENsYXVzZSkgewogICAgICBtb2RpZmllcnMgfD0gZmluYWxNYXNrOwogICAgfQogICAgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyA9IHBvcCgpOwogICAgaWYgKG5hbWVOb2RlIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZU5vZGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBJZGVudGlmaWVyIG5hbWUgPSBuYW1lTm9kZTsKICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyOwogICAgaWYgKCFpbkNhdGNoQ2xhdXNlICYmCiAgICAgICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPT0gMCAmJgogICAgICAgIG1lbWJlcktpbmQgIT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZSkgewogICAgICBGdW5jdGlvbkJ1aWxkZXIgbWVtYmVyID0gdGhpcy5tZW1iZXI7CiAgICAgIHBhcmFtZXRlciA9IG1lbWJlci5nZXRGb3JtYWwobmFtZSk7CiAgICAgIGlmIChwYXJhbWV0ZXIgPT0gbnVsbCkgewogICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBsaXN0IG9mIGZvcm1hbHMgKG9yaWdpbmFsbHkpIGNvbnRhaW5zIGEKICAgICAgICAvLyBQYXJzZXJSZWNvdmVyeSAtIHRoZW4gdGhlIHBvcHBlZCBsaXN0IGJlY29tZXMgbnVsbC4KICAgICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeShuYW1lVG9rZW4uY2hhck9mZnNldCkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcGFyYW1ldGVyID0gbmV3IEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIobnVsbCwgbW9kaWZpZXJzLCB0eXBlPy5idWlsZGVyLAogICAgICAgICAgbmFtZT8ubmFtZSwgbGlicmFyeUJ1aWxkZXIsIG9mZnNldEZvclRva2VuKG5hbWVUb2tlbiksIHVyaSkKICAgICAgICAuLmhhc0RlY2xhcmVkSW5pdGlhbGl6ZXIgPSAoaW5pdGlhbGl6ZXJTdGFydCAhPSBudWxsKTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgIHBhcmFtZXRlci5idWlsZChsaWJyYXJ5QnVpbGRlciwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IG5hbWU/LmluaXRpYWxpemVyOwogICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgaWYgKG1lbWJlciBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKSB7CiAgICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBmYWN0b3J5ID0gbWVtYmVyOwogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRGVmYXVsdFZhbHVlSW5SZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZmFjdG9yeS5yZWRpcmVjdGlvblRhcmdldC5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXBhcmFtZXRlci5pbml0aWFsaXplcldhc0luZmVycmVkKSB7CiAgICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IGluaXRpYWxpemVyLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoa2luZCAhPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeSkgewogICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA/Pz0gZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKG5vTG9jYXRpb24pCiAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgIH0KICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGlmIChmdW5jdGlvbk5lc3RpbmdMZXZlbCA9PSAwKSB7CiAgICAgICAgaW5mZXJBbm5vdGF0aW9ucyh2YXJpYWJsZSwgYW5ub3RhdGlvbnMpOwogICAgICB9CiAgICAgIHZhcmlhYmxlLmNsZWFyQW5ub3RhdGlvbnMoKTsKICAgICAgZm9yIChFeHByZXNzaW9uIGFubm90YXRpb24gaW4gYW5ub3RhdGlvbnMpIHsKICAgICAgICB2YXJpYWJsZS5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICB9CiAgICB9CiAgICBwdXNoKHBhcmFtZXRlcik7CiAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5kZWNsYXJlKHZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMiKTsKICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCA9IG9wdGlvbmFsKCJ7IiwgYmVnaW5Ub2tlbikKICAgICAgICA/IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZAogICAgICAgIDogRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWw7CiAgICAvLyBXaGVuIHJlY292ZXJpbmcgZnJvbSBhbiBlbXB0eSBsaXN0IG9mIG9wdGlvbmFsIGFyZ3VtZW50cywgY291bnQgbWF5IGJlCiAgICAvLyAwLiBJdCBtaWdodCBiZSBzaW1wbGVyIGlmIHRoZSBwYXJzZXIgZGlkbid0IGNhbGwgdGhpcyBtZXRob2QgaW4gdGhhdAogICAgLy8gY2FzZSwgaG93ZXZlciwgdGhlbiBbYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnNdIHdvdWxkbid0IGFsd2F5cyBiZQogICAgLy8gbWF0Y2hlZCBieSB0aGlzIG1ldGhvZC4KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gcGFyYW1ldGVycyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkob2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICAgIHBhcmFtZXRlci5raW5kID0ga2luZDsKICAgICAgfQogICAgICBwdXNoKHBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwrKzsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBuYW1lVG9rZW4sIFRva2VuIHF1ZXN0aW9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyIik7CiAgICBpZiAoaW5DYXRjaENsYXVzZSB8fCBmdW5jdGlvbk5lc3RpbmdMZXZlbCAhPSAwKSB7CiAgICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICB9CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIFVucmVzb2x2ZWRUeXBlIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgaWYgKCFsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGUocXVlc3Rpb24pOwogICAgfQogICAgVW5yZXNvbHZlZFR5cGUgdHlwZSA9IGZvcm1hbHMudG9GdW5jdGlvblR5cGUocmV0dXJuVHlwZSwKICAgICAgICBsaWJyYXJ5QnVpbGRlci5udWxsYWJsZUJ1aWxkZXJJZlRydWUocXVlc3Rpb24gIT0gbnVsbCksIHR5cGVWYXJpYWJsZXMpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2godHlwZSk7CiAgICBmdW5jdGlvbk5lc3RpbmdMZXZlbC0tOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQucmVxdWlyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uIik7CiAgICBPYmplY3QgZGVmYXVsdFZhbHVlRXhwcmVzc2lvbiA9IHBvcCgpOwogICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBwdXNoKGRlZmF1bHRWYWx1ZUV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gZXF1YWxzLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVmFsdWVkRm9ybWFsUGFyYW1ldGVyIik7CiAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gcG9wRm9yVmFsdWUoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWUsIGluaXRpYWxpemVyKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQubm9uZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJzIik7CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IG9wdGlvbmFsczsKICAgIGludCBvcHRpb25hbHNDb3VudCA9IDA7CiAgICBpZiAoY291bnQgPiAwICYmIHBlZWsoKSBpcyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KSB7CiAgICAgIG9wdGlvbmFscyA9IHBvcCgpOwogICAgICBjb3VudC0tOwogICAgICBvcHRpb25hbHNDb3VudCA9IG9wdGlvbmFscy5sZW5ndGg7CiAgICB9CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHBhcmFtZXRlcnMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KCkKICAgICAgICAgICAgLnBvcFBhZGRlZChzdGFjaywgY291bnQsIG9wdGlvbmFsc0NvdW50KTsKICAgIGlmIChvcHRpb25hbHMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgcGFyYW1ldGVycy5zZXRSYW5nZShjb3VudCwgY291bnQgKyBvcHRpb25hbHNDb3VudCwgb3B0aW9uYWxzKTsKICAgIH0KICAgIGFzc2VydChwYXJhbWV0ZXJzPy5pc05vdEVtcHR5ID8/IHRydWUpOwogICAgRm9ybWFsUGFyYW1ldGVycyBmb3JtYWxzID0gbmV3IEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVycywKICAgICAgICBvZmZzZXRGb3JUb2tlbihiZWdpblRva2VuKSwgbGVuZ3RoT2ZTcGFuKGJlZ2luVG9rZW4sIGVuZFRva2VuKSwgdXJpKTsKICAgIGNvbnN0YW50Q29udGV4dCA9IHBvcCgpOwogICAgcHVzaChmb3JtYWxzKTsKICAgIGlmICgoaW5DYXRjaENsYXVzZSB8fCBmdW5jdGlvbk5lc3RpbmdMZXZlbCAhPSAwKSAmJgogICAgICAgIGtpbmQgIT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZSkgewogICAgICBlbnRlckxvY2FsU2NvcGUoCiAgICAgICAgICBudWxsLAogICAgICAgICAgZm9ybWFscy5jb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoCiAgICAgICAgICAgICAgc2NvcGUsIG1lbWJlciA/PyBjbGFzc0J1aWxkZXIgPz8gbGlicmFyeUJ1aWxkZXIsIHRoaXMpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5DYXRjaENsYXVzZSIpOwogICAgaW5DYXRjaENsYXVzZSA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXRjaENsYXVzZSIpOwogICAgaW5DYXRjaENsYXVzZSA9IGZhbHNlOwogICAgcHVzaChpbkNhdGNoQmxvY2spOwogICAgaW5DYXRjaEJsb2NrID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGRlYnVnRXZlbnQoIkNhdGNoQmxvY2siKTsKICAgIFN0YXRlbWVudCBib2R5ID0gcG9wKCk7CiAgICBpbkNhdGNoQmxvY2sgPSBwb3AoKTsKICAgIGlmIChjYXRjaEtleXdvcmQgIT0gbnVsbCkgewogICAgICBleGl0TG9jYWxTY29wZSgpOwogICAgfQogICAgRm9ybWFsUGFyYW1ldGVycyBjYXRjaFBhcmFtZXRlcnMgPSBwb3BJZk5vdE51bGwoY2F0Y2hLZXl3b3JkKTsKICAgIERhcnRUeXBlIGV4Y2VwdGlvblR5cGUgPQogICAgICAgIGJ1aWxkRGFydFR5cGUocG9wSWZOb3ROdWxsKG9uS2V5d29yZCkpID8/IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGV4Y2VwdGlvbjsKICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgc3RhY2tUcmFjZTsKICAgIExpc3Q8U3RhdGVtZW50PiBjb21waWxlVGltZUVycm9yczsKICAgIGlmIChjYXRjaFBhcmFtZXRlcnM/LnBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBpbnQgcGFyYW1ldGVyQ291bnQgPSBjYXRjaFBhcmFtZXRlcnMucGFyYW1ldGVycy5sZW5ndGg7CiAgICAgIGlmIChwYXJhbWV0ZXJDb3VudCA+IDApIHsKICAgICAgICBleGNlcHRpb24gPSBjYXRjaFBhcmFtZXRlcnMucGFyYW1ldGVyc1swXTsKICAgICAgICBleGNlcHRpb24uYnVpbGQobGlicmFyeUJ1aWxkZXIsIGZ1bmN0aW9uTmVzdGluZ0xldmVsKS50eXBlID0KICAgICAgICAgICAgZXhjZXB0aW9uVHlwZTsKICAgICAgICBpZiAocGFyYW1ldGVyQ291bnQgPiAxKSB7CiAgICAgICAgICBzdGFja1RyYWNlID0gY2F0Y2hQYXJhbWV0ZXJzLnBhcmFtZXRlcnNbMV07CiAgICAgICAgICBzdGFja1RyYWNlLmJ1aWxkKGxpYnJhcnlCdWlsZGVyLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkudHlwZSA9CiAgICAgICAgICAgICAgY29yZVR5cGVzLnN0YWNrVHJhY2VSYXdUeXBlKGxpYnJhcnlCdWlsZGVyLm5vbk51bGxhYmxlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBhcmFtZXRlckNvdW50ID4gMikgewogICAgICAgIC8vIElmIHBhcmFtZXRlckNvdW50IGlzIDAsIHRoZSBwYXJzZXIgcmVwb3J0ZWQgYW4gZXJyb3IgYWxyZWFkeS4KICAgICAgICBpZiAocGFyYW1ldGVyQ291bnQgIT0gMCkgewogICAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyID0gY2F0Y2hQYXJhbWV0ZXJzLnBhcmFtZXRlcnNbaV07CiAgICAgICAgICAgIGNvbXBpbGVUaW1lRXJyb3JzID8/PSA8U3RhdGVtZW50PltdOwogICAgICAgICAgICBjb21waWxlVGltZUVycm9ycy5hZGQoYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgICAgICAgZmFzdGEubWVzc2FnZUNhdGNoU3ludGF4RXh0cmFQYXJhbWV0ZXJzLCBwYXJhbWV0ZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGxlbmd0aDogcGFyYW1ldGVyLm5hbWUubGVuZ3RoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBwdXNoKGZvcmVzdC5jcmVhdGVDYXRjaCgKICAgICAgICBvZmZzZXRGb3JUb2tlbihvbktleXdvcmQgPz8gY2F0Y2hLZXl3b3JkKSwKICAgICAgICBleGNlcHRpb25UeXBlLAogICAgICAgIGV4Y2VwdGlvbj8udmFyaWFibGUsCiAgICAgICAgc3RhY2tUcmFjZT8udmFyaWFibGUsCiAgICAgICAgY29yZVR5cGVzLnN0YWNrVHJhY2VSYXdUeXBlKGxpYnJhcnlCdWlsZGVyLm5vbk51bGxhYmxlKSwKICAgICAgICBib2R5KSk7CiAgICBpZiAoY29tcGlsZVRpbWVFcnJvcnMgPT0gbnVsbCkgewogICAgICBwdXNoKE51bGxWYWx1ZS5CbG9jayk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVCbG9jayhub0xvY2F0aW9uLCBjb21waWxlVGltZUVycm9ycykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRyeVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtlbmROb2RlXSBpbiBbZW5kVHJ5U3RhdGVtZW50XS4KICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmJlZ2luTm9kZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUcnlTdGF0ZW1lbnQoaW50IGNhdGNoQ291bnQsIFRva2VuIHRyeUtleXdvcmQsIFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBTdGF0ZW1lbnQgZmluYWxseUJsb2NrOwogICAgaWYgKGZpbmFsbHlLZXl3b3JkICE9IG51bGwpIHsKICAgICAgZmluYWxseUJsb2NrID0gcG9wKCk7CiAgICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbYmVnaW5Ob2RlXSBpbiBbYmVnaW5CbG9ja10uCiAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmVuZE5vZGUoZmluYWxseUJsb2NrKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbYmVnaW5Ob2RlXSBpbiBbYmVnaW5UcnlTdGF0ZW1lbnRdLgogICAgICB0cnlTdGF0ZW1lbnRJbmZvU3RhY2sgPSB0cnlTdGF0ZW1lbnRJbmZvU3RhY2sKICAgICAgICAgIC5wcmVwZW5kKHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmRlZmVyTm9kZSgpKTsKICAgIH0KICAgIExpc3Q8Q2F0Y2g+IGNhdGNoQmxvY2tzOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGNvbXBpbGVUaW1lRXJyb3JzOwogICAgaWYgKGNhdGNoQ291bnQgIT0gMCkgewogICAgICBMaXN0PE9iamVjdD4gY2F0Y2hCbG9ja3NBbmRFcnJvcnMgPQogICAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY2F0Y2hDb3VudCAqIDIpOwogICAgICBjYXRjaEJsb2NrcyA9IG5ldyBMaXN0PENhdGNoPi5maWxsZWQoY2F0Y2hDb3VudCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGNoQ291bnQ7IGkrKykgewogICAgICAgIGNhdGNoQmxvY2tzW2ldID0gY2F0Y2hCbG9ja3NBbmRFcnJvcnNbaSAqIDJdOwogICAgICAgIFN0YXRlbWVudCBlcnJvciA9IGNhdGNoQmxvY2tzQW5kRXJyb3JzW2kgKiAyICsgMV07CiAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgICAgIGNvbXBpbGVUaW1lRXJyb3JzID8/PSA8U3RhdGVtZW50PltdOwogICAgICAgICAgY29tcGlsZVRpbWVFcnJvcnMuYWRkKGVycm9yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFN0YXRlbWVudCB0cnlCbG9jayA9IHBvcFN0YXRlbWVudCgpOwogICAgaW50IGZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0cnlLZXl3b3JkKTsKICAgIFN0YXRlbWVudCByZXN1bHQgPSBmb3Jlc3QuY3JlYXRlVHJ5U3RhdGVtZW50KAogICAgICAgIGZpbGVPZmZzZXQsIHRyeUJsb2NrLCBjYXRjaEJsb2NrcywgZmluYWxseUJsb2NrKTsKICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXMKICAgICAgICA/LnN0b3JlSW5mbyhyZXN1bHQsIHRyeVN0YXRlbWVudEluZm9TdGFjay5oZWFkKTsKICAgIHRyeVN0YXRlbWVudEluZm9TdGFjayA9IHRyeVN0YXRlbWVudEluZm9TdGFjay50YWlsOwoKICAgIGlmIChjb21waWxlVGltZUVycm9ycyAhPSBudWxsKSB7CiAgICAgIGNvbXBpbGVUaW1lRXJyb3JzLmFkZChyZXN1bHQpOwogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVCbG9jayhub0xvY2F0aW9uLCBjb21waWxlVGltZUVycm9ycykpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChyZXN1bHQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbmRleGVkRXhwcmVzc2lvbigKICAgICAgVG9rZW4gb3BlblNxdWFyZUJyYWNrZXQsIFRva2VuIGNsb3NlU3F1YXJlQnJhY2tldCkgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUob3BlblNxdWFyZUJyYWNrZXQsIFsKICAgICAgdW5pb25PZktpbmRzKFtWYWx1ZUtpbmRzLkV4cHJlc3Npb24sIFZhbHVlS2luZHMuR2VuZXJhdG9yXSksCiAgICAgIHVuaW9uT2ZLaW5kcygKICAgICAgICAgIFtWYWx1ZUtpbmRzLkV4cHJlc3Npb24sIFZhbHVlS2luZHMuR2VuZXJhdG9yLCBWYWx1ZUtpbmRzLkluaXRpYWxpemVyXSkKICAgIF0pKTsKICAgIGRlYnVnRXZlbnQoIkluZGV4ZWRFeHByZXNzaW9uIik7CiAgICBFeHByZXNzaW9uIGluZGV4ID0gcG9wRm9yVmFsdWUoKTsKICAgIE9iamVjdCByZWNlaXZlciA9IHBvcCgpOwogICAgYm9vbCBpc051bGxBd2FyZSA9IG9wdGlvbmFsKCc/LlsnLCBvcGVuU3F1YXJlQnJhY2tldCk7CiAgICBpZiAoaXNOdWxsQXdhcmUgJiYgIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmVwb3J0TWlzc2luZ05vbk51bGxhYmxlU3VwcG9ydChvcGVuU3F1YXJlQnJhY2tldCk7CiAgICB9CiAgICBpZiAocmVjZWl2ZXIgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHB1c2gocmVjZWl2ZXIuYnVpbGRJbmRleGVkQWNjZXNzKGluZGV4LCBvcGVuU3F1YXJlQnJhY2tldCwKICAgICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSkpOwogICAgfSBlbHNlIGlmIChyZWNlaXZlciBpcyBFeHByZXNzaW9uKSB7CiAgICAgIHB1c2goSW5kZXhlZEFjY2Vzc0dlbmVyYXRvci5tYWtlKHRoaXMsIG9wZW5TcXVhcmVCcmFja2V0LCByZWNlaXZlciwgaW5kZXgsCiAgICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChyZWNlaXZlciBpcyBJbml0aWFsaXplcik7CiAgICAgIHB1c2goSW5kZXhlZEFjY2Vzc0dlbmVyYXRvci5tYWtlKAogICAgICAgICAgdGhpcywgb3BlblNxdWFyZUJyYWNrZXQsIHRvVmFsdWUocmVjZWl2ZXIpLCBpbmRleCwKICAgICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVByZWZpeEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKHRva2VuLCA8VmFsdWVLaW5kPlsKICAgICAgdW5pb25PZktpbmRzKDxWYWx1ZUtpbmQ+WwogICAgICAgIFZhbHVlS2luZHMuRXhwcmVzc2lvbiwKICAgICAgICBWYWx1ZUtpbmRzLkdlbmVyYXRvciwKICAgICAgXSksCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJVbmFyeVByZWZpeEV4cHJlc3Npb24iKTsKICAgIE9iamVjdCByZWNlaXZlciA9IHBvcCgpOwogICAgaWYgKG9wdGlvbmFsKCIhIiwgdG9rZW4pKSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZU5vdChvZmZzZXRGb3JUb2tlbih0b2tlbiksIHRvVmFsdWUocmVjZWl2ZXIpKSk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgb3BlcmF0b3IgPSB0b2tlbi5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKG9wdGlvbmFsKCItIiwgdG9rZW4pKSB7CiAgICAgICAgb3BlcmF0b3IgPSAidW5hcnktIjsKICAgICAgfQogICAgICBpbnQgZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgTmFtZSBuYW1lID0gbmV3IE5hbWUob3BlcmF0b3IpOwogICAgICBpZiAocmVjZWl2ZXIgaXMgR2VuZXJhdG9yKSB7CiAgICAgICAgcHVzaChyZWNlaXZlci5idWlsZFVuYXJ5T3BlcmF0aW9uKHRva2VuLCBuYW1lKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KHJlY2VpdmVyIGlzIEV4cHJlc3Npb24pOwogICAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZVVuYXJ5KGZpbGVPZmZzZXQsIG5hbWUsIHJlY2VpdmVyKSk7CiAgICAgIH0KICAgIH0KICB9CgogIE5hbWUgaW5jcmVtZW50T3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKICAgIGlmIChvcHRpb25hbCgiKysiLCB0b2tlbikpIHJldHVybiBwbHVzTmFtZTsKICAgIGlmIChvcHRpb25hbCgiLS0iLCB0b2tlbikpIHJldHVybiBtaW51c05hbWU7CiAgICByZXR1cm4gdW5oYW5kbGVkKHRva2VuLmxleGVtZSwgImluY3JlbWVudE9wZXJhdG9yIiwgdG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbiIpOwogICAgT2JqZWN0IGdlbmVyYXRvciA9IHBvcCgpOwogICAgaWYgKGdlbmVyYXRvciBpcyBHZW5lcmF0b3IpIHsKICAgICAgcHVzaChnZW5lcmF0b3IuYnVpbGRQcmVmaXhJbmNyZW1lbnQoaW5jcmVtZW50T3BlcmF0b3IodG9rZW4pLAogICAgICAgICAgb2Zmc2V0OiB0b2tlbi5jaGFyT2Zmc2V0KSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKHdyYXBJblByb2JsZW0oCiAgICAgICAgICB0b1ZhbHVlKGdlbmVyYXRvciksIGZhc3RhLm1lc3NhZ2VOb3RBbkx2YWx1ZSwgbm9MZW5ndGgpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgICBPYmplY3QgZ2VuZXJhdG9yID0gcG9wKCk7CiAgICBpZiAoZ2VuZXJhdG9yIGlzIEdlbmVyYXRvcikgewogICAgICBwdXNoKG5ldyBEZWxheWVkUG9zdGZpeEluY3JlbWVudCgKICAgICAgICAgIHRoaXMsIHRva2VuLCBnZW5lcmF0b3IsIGluY3JlbWVudE9wZXJhdG9yKHRva2VuKSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaCh3cmFwSW5Qcm9ibGVtKAogICAgICAgICAgdG9WYWx1ZShnZW5lcmF0b3IpLCBmYXN0YS5tZXNzYWdlTm90QW5MdmFsdWUsIG5vTGVuZ3RoKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBUb2tlbiBzdGFydCwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNvbnN0cnVjdG9yUmVmZXJlbmNlIik7CiAgICBwdXNoUXVhbGlmaWVkUmVmZXJlbmNlKHN0YXJ0LCBwZXJpb2RCZWZvcmVOYW1lKTsKICB9CgogIC8vLyBBIHF1YWxpZmllZCByZWZlcmVuY2UgaXMgc29tZXRoaW5nIHRoYXQgbWF0Y2hlcyBvbmUgb2Y6CiAgLy8vCiAgLy8vICAgICBpZGVudGlmaWVyCiAgLy8vICAgICBpZGVudGlmaWVyIHR5cGVBcmd1bWVudHM/ICcuJyBpZGVudGlmaWVyCiAgLy8vICAgICBpZGVudGlmaWVyICcuJyBpZGVudGlmaWVyIHR5cGVBcmd1bWVudHM/ICcuJyBpZGVudGlmaWVyCiAgLy8vCiAgLy8vIFRoYXQgaXMsIG9uZSB0byB0aHJlZSBpZGVudGlmaWVycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBhbmQgb3B0aW9uYWxseSBvbmUKICAvLy8gbGlzdCBvZiB0eXBlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gQSBxdWFsaWZpZWQgcmVmZXJlbmNlIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoIGEgcmVmZXJlbmNlIHRvCiAgLy8vIGNvbXBpbGUtdGltZSBjb25zdGFudCB2YXJpYWJsZSAobWV0YWRhdGEpIG9yIGEgY29uc3RydWN0b3IgcmVmZXJlbmNlCiAgLy8vICh1c2VkIGJ5IG1ldGFkYXRhLCBuZXcvY29uc3QgZXhwcmVzc2lvbiwgYW5kIHJlZGlyZWN0aW5nIGZhY3RvcmllcykuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGUgcGFyc2VyIHdpbGwgcmVwb3J0IGVycm9ycyBpZiBtZXRhZGF0YSBpbmNsdWRlcyB0eXBlCiAgLy8vIGFyZ3VtZW50cywgYnV0IHdpbGwgb3RoZXIgcHJlc2VydmUgdGhlbSBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgLy8vCiAgLy8vIEEgY29uc3RydWN0b3IgcmVmZXJlbmNlIGNhbiBjb250YWluIHVwIHRvIHRocmVlIGlkZW50aWZpZXJzOgogIC8vLwogIC8vLyAgICAgYSkgdHlwZSB0eXBlQXJndW1lbnRzPwogIC8vLyAgICAgYikgdHlwZSB0eXBlQXJndW1lbnRzPyAnLicgbmFtZQogIC8vLyAgICAgYykgcHJlZml4ICcuJyB0eXBlIHR5cGVBcmd1bWVudHM/CiAgLy8vICAgICBkKSBwcmVmaXggJy4nIHR5cGUgdHlwZUFyZ3VtZW50cz8gJy4nIG5hbWUKICAvLy8KICAvLy8gVGhpcyBpc24ndCBhIGxlZ2FsIGNvbnN0cnVjdG9yIHJlZmVyZW5jZToKICAvLy8KICAvLy8gICAgIHR5cGUgJy4nIG5hbWUgdHlwZUFyZ3VtZW50cz8KICAvLy8KICAvLy8gQnV0IHRoZSBwYXJzZXIgY2FuJ3QgdGVsbCB0aGlzIGZyb20gdHlwZSBjKSBhYm92ZS4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgcG9wcyAyIChvciAzIGlmIGBwZXJpb2RCZWZvcmVOYW1lICE9IG51bGxgKSB2YWx1ZXMgZnJvbSB0aGUKICAvLy8gc3RhY2sgYW5kIHB1c2hlcyAzIHZhbHVlczogYSBnZW5lcmF0b3IgKHRoZSB0eXBlIGluIGEgY29uc3RydWN0b3IKICAvLy8gcmVmZXJlbmNlLCBvciBhbiBleHByZXNzaW9uIGluIG1ldGFkYXRhKSwgYSBsaXN0IG9mIHR5cGUgYXJndW1lbnRzLCBhbmQgYQogIC8vLyBuYW1lLgogIHZvaWQgcHVzaFF1YWxpZmllZFJlZmVyZW5jZShUb2tlbiBzdGFydCwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSkgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUoc3RhcnQsIFsKICAgICAgLypzdWZmaXgqLyBpZiAocGVyaW9kQmVmb3JlTmFtZSAhPSBudWxsKSBWYWx1ZUtpbmRzLklkZW50aWZpZXIsCiAgICAgIC8qdHlwZSBhcmd1bWVudHMqLyBWYWx1ZUtpbmRzLlR5cGVBcmd1bWVudHNPck51bGwsCiAgICAgIC8qdHlwZSovIHVuaW9uT2ZLaW5kcyhbCiAgICAgICAgVmFsdWVLaW5kcy5HZW5lcmF0b3IsCiAgICAgICAgVmFsdWVLaW5kcy5RdWFsaWZpZWROYW1lLAogICAgICAgIFZhbHVlS2luZHMuUHJvYmxlbUJ1aWxkZXIsCiAgICAgICAgVmFsdWVLaW5kcy5QYXJzZXJSZWNvdmVyeQogICAgICBdKQogICAgXSkpOwogICAgSWRlbnRpZmllciBzdWZmaXggPSBwb3BJZk5vdE51bGwocGVyaW9kQmVmb3JlTmFtZSk7CiAgICBJZGVudGlmaWVyIGlkZW50aWZpZXI7CiAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzID0gcG9wKCk7CiAgICBPYmplY3QgdHlwZSA9IHBvcCgpOwogICAgaWYgKHR5cGUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBpZGVudGlmaWVyID0gdHlwZTsKICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWQgPSB0eXBlOwogICAgICBPYmplY3QgcXVhbGlmaWVyID0gcXVhbGlmaWVkLnF1YWxpZmllcjsKICAgICAgYXNzZXJ0KGNoZWNrVmFsdWUoCiAgICAgICAgICBzdGFydCwKICAgICAgICAgIHVuaW9uT2ZLaW5kcyhbVmFsdWVLaW5kcy5HZW5lcmF0b3IsIFZhbHVlS2luZHMuUHJvYmxlbUJ1aWxkZXJdKSwKICAgICAgICAgIHF1YWxpZmllcikpOwogICAgICBpZiAocXVhbGlmaWVyIGlzIFR5cGVVc2VHZW5lcmF0b3IpIHsKICAgICAgICB0eXBlID0gcXVhbGlmaWVyOwogICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogUG9pbnQgdG8gdGhlIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlQXJndW1lbnRzLAogICAgICAgICAgICAgIGlkZW50aWZpZXIuY2hhck9mZnNldCwgaWRlbnRpZmllci5uYW1lLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciBpcyBHZW5lcmF0b3IpIHsKICAgICAgICB0eXBlID0gcXVhbGlmaWVyLnF1YWxpZmllZExvb2t1cChkZXByZWNhdGVkX2V4dHJhY3RUb2tlbihpZGVudGlmaWVyKSk7CiAgICAgICAgaWRlbnRpZmllciA9IG51bGw7CiAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyIGlzIFByb2JsZW1CdWlsZGVyKSB7CiAgICAgICAgdHlwZSA9IHF1YWxpZmllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICB1bmhhbmRsZWQoIiR7cXVhbGlmaWVyLnJ1bnRpbWVUeXBlfSIsICJwdXNoUXVhbGlmaWVkUmVmZXJlbmNlIiwKICAgICAgICAgICAgc3RhcnQuY2hhck9mZnNldCwgdXJpKTsKICAgICAgfQogICAgfQogICAgU3RyaW5nIG5hbWU7CiAgICBpZiAoaWRlbnRpZmllciAhPSBudWxsICYmIHN1ZmZpeCAhPSBudWxsKSB7CiAgICAgIG5hbWUgPSAiJHtpZGVudGlmaWVyLm5hbWV9LiR7c3VmZml4Lm5hbWV9IjsKICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllciAhPSBudWxsKSB7CiAgICAgIG5hbWUgPSBpZGVudGlmaWVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKHN1ZmZpeCAhPSBudWxsKSB7CiAgICAgIG5hbWUgPSBzdWZmaXgubmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIG5hbWUgPSAiIjsKICAgIH0KICAgIHB1c2godHlwZSk7CiAgICBwdXNoKHR5cGVBcmd1bWVudHMgPz8gTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogICAgcHVzaChuYW1lKTsKICAgIHB1c2goc3VmZml4ID8/IGlkZW50aWZpZXIgPz8gTnVsbFZhbHVlLklkZW50aWZpZXIpOwoKICAgIGFzc2VydChjaGVja1N0YXRlKHN0YXJ0LCBbCiAgICAgIC8qY29uc3RydWN0b3IgbmFtZSBpZGVudGlmaWVyKi8gVmFsdWVLaW5kcy5JZGVudGlmaWVyT3JOdWxsLAogICAgICAvKmNvbnN0cnVjdG9yIG5hbWUqLyBWYWx1ZUtpbmRzLk5hbWUsCiAgICAgIC8qdHlwZSBhcmd1bWVudHMqLyBWYWx1ZUtpbmRzLlR5cGVBcmd1bWVudHNPck51bGwsCiAgICAgIC8qY2xhc3MqLyB1bmlvbk9mS2luZHMoWwogICAgICAgIFZhbHVlS2luZHMuR2VuZXJhdG9yLAogICAgICAgIFZhbHVlS2luZHMuUHJvYmxlbUJ1aWxkZXIsCiAgICAgICAgVmFsdWVLaW5kcy5QYXJzZXJSZWNvdmVyeQogICAgICBdKSwKICAgIF0pKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTdGF0aWNJbnZvY2F0aW9uKE1lbWJlciB0YXJnZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIHtDb25zdG5lc3MgY29uc3RuZXNzOiBDb25zdG5lc3MuaW1wbGljaXQsCiAgICAgIGludCBjaGFyT2Zmc2V0OiAtMSwKICAgICAgaW50IGNoYXJMZW5ndGg6IG5vTGVuZ3RofSkgewogICAgLy8gVGhlIGFyZ3VtZW50IGNoZWNrcyBmb3IgdGhlIGluaXRpYWwgdGFyZ2V0IG9mIHJlZGlyZWN0aW5nIGZhY3RvcmllcwogICAgLy8gaW52b2NhdGlvbnMgYXJlIHNraXBwZWQgaW4gRGFydCAxLgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IHRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgIGlmICh0YXJnZXQgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgYXNzZXJ0KCF0YXJnZXQuZW5jbG9zaW5nQ2xhc3MuaXNBYnN0cmFjdCk7CiAgICAgIHR5cGVQYXJhbWV0ZXJzID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzOwogICAgfQogICAgTG9jYXRlZE1lc3NhZ2UgYXJnTWVzc2FnZSA9IGNoZWNrQXJndW1lbnRzRm9yRnVuY3Rpb24oCiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLCBhcmd1bWVudHMsIGNoYXJPZmZzZXQsIHR5cGVQYXJhbWV0ZXJzKTsKICAgIGlmIChhcmdNZXNzYWdlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKGNoYXJPZmZzZXQpLAogICAgICAgICAgdGFyZ2V0Lm5hbWUubmFtZSwgYXJndW1lbnRzLCBjaGFyT2Zmc2V0LAogICAgICAgICAgY2FuZGlkYXRlOiB0YXJnZXQsIG1lc3NhZ2U6IGFyZ01lc3NhZ2UpOwogICAgfQoKICAgIGJvb2wgaXNDb25zdCA9IGNvbnN0bmVzcyA9PSBDb25zdG5lc3MuZXhwbGljaXRDb25zdCB8fAogICAgICAgIGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZTsKICAgIGlmICh0YXJnZXQgaXMgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKGNvbnN0YW50Q29udGV4dCA9PSBDb25zdGFudENvbnRleHQucmVxdWlyZWQgJiYKICAgICAgICAgIGNvbnN0bmVzcyA9PSBDb25zdG5lc3MuaW1wbGljaXQpIHsKICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VNaXNzaW5nRXhwbGljaXRDb25zdCwgY2hhck9mZnNldCwgY2hhckxlbmd0aCk7CiAgICAgIH0KICAgICAgaWYgKGlzQ29uc3QgJiYgIXRhcmdldC5pc0NvbnN0KSB7CiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgZmFzdGEubWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3IsIGNoYXJPZmZzZXQsIGNoYXJMZW5ndGgpOwogICAgICB9CiAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlID0KICAgICAgICAgIG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24odGFyZ2V0LCBhcmd1bWVudHMsIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgIGxpYnJhcnlCdWlsZGVyLmNoZWNrQm91bmRzSW5Db25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgICBub2RlLCB0eXBlRW52aXJvbm1lbnQsIHVyaSk7CiAgICAgIHJldHVybiBub2RlOwogICAgfSBlbHNlIHsKICAgICAgUHJvY2VkdXJlIHByb2NlZHVyZSA9IHRhcmdldDsKICAgICAgaWYgKHByb2NlZHVyZS5pc0ZhY3RvcnkpIHsKICAgICAgICBpZiAoY29uc3RhbnRDb250ZXh0ID09IENvbnN0YW50Q29udGV4dC5yZXF1aXJlZCAmJgogICAgICAgICAgICBjb25zdG5lc3MgPT0gQ29uc3RuZXNzLmltcGxpY2l0KSB7CiAgICAgICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VNaXNzaW5nRXhwbGljaXRDb25zdCwgY2hhck9mZnNldCwgY2hhckxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0NvbnN0ICYmICFwcm9jZWR1cmUuaXNDb25zdCkgewogICAgICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlTm9uQ29uc3RGYWN0b3J5LCBjaGFyT2Zmc2V0LCBjaGFyTGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgU3RhdGljSW52b2NhdGlvbiBub2RlID0gbmV3IEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCgKICAgICAgICAgICAgdGFyZ2V0LCBhcmd1bWVudHMsCiAgICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgICAgIGxpYnJhcnlCdWlsZGVyLmNoZWNrQm91bmRzSW5GYWN0b3J5SW52b2NhdGlvbigKICAgICAgICAgICAgbm9kZSwgdHlwZUVudmlyb25tZW50LCB1cmkpOwogICAgICAgIHJldHVybiBub2RlOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChjb25zdG5lc3MgPT0gQ29uc3RuZXNzLmltcGxpY2l0KTsKICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0ludm9jYXRpb24odGFyZ2V0LCBhcmd1bWVudHMsIGlzQ29uc3Q6IGZhbHNlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgfQogICAgfQogIH0KCiAgRXhwcmVzc2lvbiBidWlsZEV4dGVuc2lvbk1ldGhvZEludm9jYXRpb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LCBQcm9jZWR1cmUgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc1RlYXJPZmZ9KSB7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gdGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgTG9jYXRlZE1lc3NhZ2UgYXJnTWVzc2FnZSA9IGNoZWNrQXJndW1lbnRzRm9yRnVuY3Rpb24oCiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLCBhcmd1bWVudHMsIGZpbGVPZmZzZXQsIHR5cGVQYXJhbWV0ZXJzKTsKICAgIGlmIChhcmdNZXNzYWdlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKGZpbGVPZmZzZXQpLAogICAgICAgICAgdGFyZ2V0Lm5hbWUubmFtZSwgYXJndW1lbnRzLCBmaWxlT2Zmc2V0LAogICAgICAgICAgY2FuZGlkYXRlOiB0YXJnZXQsIG1lc3NhZ2U6IGFyZ01lc3NhZ2UpOwogICAgfQoKICAgIEV4cHJlc3Npb24gbm9kZTsKICAgIGlmIChpc1RlYXJPZmYpIHsKICAgICAgbm9kZSA9IG5ldyBFeHRlbnNpb25UZWFyT2ZmKHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUgPSBuZXcgU3RhdGljSW52b2NhdGlvbih0YXJnZXQsIGFyZ3VtZW50cyk7CiAgICB9CiAgICBub2RlLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBMb2NhdGVkTWVzc2FnZSBjaGVja0FyZ3VtZW50c0ZvckZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewogICAgaWYgKGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoIDwKICAgICAgICBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVRvb0Zld0FyZ3VtZW50cwogICAgICAgICAgLndpdGhBcmd1bWVudHMoZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgICBmb3Jlc3QuYXJndW1lbnRzUG9zaXRpb25hbChhcmd1bWVudHMpLmxlbmd0aCkKICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudHMuZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgfQogICAgaWYgKGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoID4KICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVG9vTWFueUFyZ3VtZW50cwogICAgICAgICAgLndpdGhBcmd1bWVudHMoZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoKQogICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50cy5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9CiAgICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWQgPSBmb3Jlc3QuYXJndW1lbnRzTmFtZWQoYXJndW1lbnRzKTsKICAgIGlmIChuYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIFNldDxTdHJpbmc+IHBhcmFtZXRlck5hbWVzID0KICAgICAgICAgIG5ldyBTZXQuZnJvbShmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubWFwKChhKSA9PiBhLm5hbWUpKTsKICAgICAgZm9yIChOYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gbmFtZWQpIHsKICAgICAgICBpZiAoIXBhcmFtZXRlck5hbWVzLmNvbnRhaW5zKGFyZ3VtZW50Lm5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVOb1N1Y2hOYW1lZFBhcmFtZXRlcgogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGFyZ3VtZW50Lm5hbWUpCiAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50LmZpbGVPZmZzZXQsIGFyZ3VtZW50Lm5hbWUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBpZiAobGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgICAgU2V0PFN0cmluZz4gYXJndW1lbnROYW1lcyA9IG5ldyBTZXQuZnJvbShuYW1lZC5tYXAoKGEpID0+IGEubmFtZSkpOwogICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICBpZiAocGFyYW1ldGVyLmlzUmVxdWlyZWQgJiYgIWFyZ3VtZW50TmFtZXMuY29udGFpbnMocGFyYW1ldGVyLm5hbWUpKSB7CiAgICAgICAgICAgIGlmIChsaWJyYXJ5QnVpbGRlci5sb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRFcnJvcgogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhwYXJhbWV0ZXIubmFtZSkKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50cy5maWxlT2Zmc2V0LCBmYXN0YS5ub0xlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhwYXJhbWV0ZXIubmFtZSksCiAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICBmYXN0YS5ub0xlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PERhcnRUeXBlPiB0eXBlcyA9IGZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGVzLmxlbmd0aCkgewogICAgICBpZiAodHlwZXMubGVuZ3RoID09IDApIHsKICAgICAgICAvLyBFeHBlY3RlZCBgdHlwZVBhcmFtZXRlcnMubGVuZ3RoYCB0eXBlIGFyZ3VtZW50cywgYnV0IG5vbmUgZ2l2ZW4sIHNvCiAgICAgICAgLy8gd2UgdXNlIHR5cGUgaW5mZXJlbmNlLgogICAgICB9IGVsc2UgewogICAgICAgIC8vIEEgd3JvbmcgKG5vbi16ZXJvKSBhbW91bnQgb2YgdHlwZSBhcmd1bWVudHMgZ2l2ZW4uIFRoYXQncyBhbiBlcnJvci4KICAgICAgICAvLyBUT0RPKGplbnNqKTogUG9zaXRpb24gc2hvdWxkIGJlIG9uIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZVBhcmFtZXRlcnMubGVuZ3RoKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExvY2F0ZWRNZXNzYWdlIGNoZWNrQXJndW1lbnRzRm9yVHlwZSgKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAoZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGggPAogICAgICAgIGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVG9vRmV3QXJndW1lbnRzCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgICAgICAgIGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykubGVuZ3RoKQogICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGFyZ3VtZW50cy5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9CiAgICBpZiAoZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGggPgogICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFzdGEudGVtcGxhdGVUb29NYW55QXJndW1lbnRzCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGgpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgYXJndW1lbnRzLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZCA9IGZvcmVzdC5hcmd1bWVudHNOYW1lZChhcmd1bWVudHMpOwogICAgaWYgKG5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPQogICAgICAgICAgbmV3IFNldC5mcm9tKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5tYXAoKGEpID0+IGEubmFtZSkpOwogICAgICBmb3IgKE5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBuYW1lZCkgewogICAgICAgIGlmICghbmFtZXMuY29udGFpbnMoYXJndW1lbnQubmFtZSkpIHsKICAgICAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZU5vU3VjaE5hbWVkUGFyYW1ldGVyCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYXJndW1lbnQubmFtZSkKICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgYXJndW1lbnQuZmlsZU9mZnNldCwgYXJndW1lbnQubmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmCiAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgICBTZXQ8U3RyaW5nPiBhcmd1bWVudE5hbWVzID0gbmV3IFNldC5mcm9tKG5hbWVkLm1hcCgoYSkgPT4gYS5uYW1lKSk7CiAgICAgICAgZm9yIChOYW1lZFR5cGUgcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgICAgaWYgKHBhcmFtZXRlci5pc1JlcXVpcmVkICYmICFhcmd1bWVudE5hbWVzLmNvbnRhaW5zKHBhcmFtZXRlci5uYW1lKSkgewogICAgICAgICAgICBpZiAobGlicmFyeUJ1aWxkZXIubG9hZGVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhc3RhLnRlbXBsYXRlVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3IKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMocGFyYW1ldGVyLm5hbWUpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBhcmd1bWVudHMuZmlsZU9mZnNldCwgZmFzdGEubm9MZW5ndGgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMocGFyYW1ldGVyLm5hbWUpLAogICAgICAgICAgICAgICAgICBhcmd1bWVudHMuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgZmFzdGEubm9MZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBMaXN0PE9iamVjdD4gdHlwZXMgPSBmb3Jlc3QuYXJndW1lbnRzVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSB0eXBlcy5sZW5ndGggJiYgdHlwZXMubGVuZ3RoICE9IDApIHsKICAgICAgLy8gQSB3cm9uZyAobm9uLXplcm8pIGFtb3VudCBvZiB0eXBlIGFyZ3VtZW50cyBnaXZlbi4gVGhhdCdzIGFuIGVycm9yLgogICAgICAvLyBUT0RPKGplbnNqKTogUG9zaXRpb24gc2hvdWxkIGJlIG9uIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgIHJldHVybiBmYXN0YS50ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlUGFyYW1ldGVycy5sZW5ndGgpCiAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgb2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5OZXdFeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZU5vdENvbnN0YW50RXhwcmVzc2lvbi53aXRoQXJndW1lbnRzKCdOZXcgZXhwcmVzc2lvbicpLAogICAgICAgICAgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIHRva2VuLmxlbmd0aCk7CiAgICB9CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQubm9uZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQ29uc3RFeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgICBjb25zdGFudENvbnRleHQgPSBDb25zdGFudENvbnRleHQuaW5mZXJyZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNvbnN0TGl0ZXJhbCIpOwogICAgc3VwZXIucHVzaChjb25zdGFudENvbnRleHQpOwogICAgY29uc3RhbnRDb250ZXh0ID0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uIik7CiAgICBzdXBlci5wdXNoKGNvbnN0YW50Q29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0TGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kQ29uc3RMaXRlcmFsIik7CiAgICBPYmplY3QgbGl0ZXJhbCA9IHBvcCgpOwogICAgY29uc3RhbnRDb250ZXh0ID0gcG9wKCk7CiAgICBwdXNoKGxpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmROZXdFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOZXdFeHByZXNzaW9uIik7CiAgICBfYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgICAgdG9rZW4ubmV4dCwgdG9rZW4ub2Zmc2V0LCBDb25zdG5lc3MuZXhwbGljaXROZXcpOwogIH0KCiAgdm9pZCBfYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgIFRva2VuIG5hbWVUb2tlbiwgaW50IG9mZnNldCwgQ29uc3RuZXNzIGNvbnN0bmVzcykgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUobmFtZVRva2VuLCBbCiAgICAgIC8qYXJndW1lbnRzKi8gVmFsdWVLaW5kcy5Bcmd1bWVudHMsCiAgICAgIC8qY29uc3RydWN0b3IgbmFtZSBpZGVudGlmaWVyKi8gVmFsdWVLaW5kcy5JZGVudGlmaWVyT3JOdWxsLAogICAgICAvKmNvbnN0cnVjdG9yIG5hbWUqLyBWYWx1ZUtpbmRzLk5hbWUsCiAgICAgIC8qdHlwZSBhcmd1bWVudHMqLyBWYWx1ZUtpbmRzLlR5cGVBcmd1bWVudHNPck51bGwsCiAgICAgIC8qY2xhc3MqLyB1bmlvbk9mS2luZHMoWwogICAgICAgIFZhbHVlS2luZHMuR2VuZXJhdG9yLAogICAgICAgIFZhbHVlS2luZHMuUHJvYmxlbUJ1aWxkZXIsCiAgICAgICAgVmFsdWVLaW5kcy5QYXJzZXJSZWNvdmVyeQogICAgICBdKSwKICAgIF0pKTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBwb3AoKTsKICAgIElkZW50aWZpZXIgbmFtZUxhc3RJZGVudGlmaWVyID0gcG9wKE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICAgIFRva2VuIG5hbWVMYXN0VG9rZW4gPQogICAgICAgIGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKG5hbWVMYXN0SWRlbnRpZmllcikgPz8gbmFtZVRva2VuOwogICAgU3RyaW5nIG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMgPSBwb3AoKTsKCiAgICBPYmplY3QgdHlwZSA9IHBvcCgpOwoKICAgIENvbnN0YW50Q29udGV4dCBzYXZlZENvbnN0YW50Q29udGV4dCA9IHBvcCgpOwogICAgaWYgKHR5cGUgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHB1c2godHlwZS5pbnZva2VDb25zdHJ1Y3RvcigKICAgICAgICAgIHR5cGVBcmd1bWVudHMsIG5hbWUsIGFyZ3VtZW50cywgbmFtZVRva2VuLCBuYW1lTGFzdFRva2VuLCBjb25zdG5lc3MpKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5ldyBQYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgICAgIHRoaXMsIG5hbWVUb2tlbiwgZmFzdGEubWVzc2FnZVN5bnRoZXRpY1Rva2VuKSk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmcgdHlwZU5hbWU7CiAgICAgIGlmICh0eXBlIGlzIFByb2JsZW1CdWlsZGVyKSB7CiAgICAgICAgdHlwZU5hbWUgPSB0eXBlLmZ1bGxOYW1lRm9yRXJyb3JzOwogICAgICB9CiAgICAgIHB1c2godGhyb3dOb1N1Y2hNZXRob2RFcnJvcihmb3Jlc3QuY3JlYXRlTnVsbExpdGVyYWwob2Zmc2V0KSwKICAgICAgICAgIGRlYnVnTmFtZSh0eXBlTmFtZSwgbmFtZSksIGFyZ3VtZW50cywgbmFtZVRva2VuLmNoYXJPZmZzZXQpKTsKICAgIH0KICAgIGNvbnN0YW50Q29udGV4dCA9IHNhdmVkQ29uc3RhbnRDb250ZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24iKTsKICAgIF9idWlsZENvbnN0cnVjdG9yUmVmZXJlbmNlSW52b2NhdGlvbigKICAgICAgICB0b2tlbiwgdG9rZW4ub2Zmc2V0LCBDb25zdG5lc3MuaW1wbGljaXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciB0eXBlLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgQ29uc3RuZXNzIGNvbnN0bmVzcykgewogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZU1pc3NpbmdBcmd1bWVudExpc3QsCiAgICAgICAgICBuYW1lVG9rZW4uY2hhck9mZnNldCwgbmFtZVRva2VuLmxlbmd0aCk7CiAgICB9CiAgICBpZiAobmFtZS5pc05vdEVtcHR5ICYmIGFyZ3VtZW50cy50eXBlcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIFRPRE8oYWhlKTogUG9pbnQgdG8gdGhlIHR5cGUgYXJndW1lbnRzIGluc3RlYWQuCiAgICAgIGFkZFByb2JsZW0oZmFzdGEubWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMsCiAgICAgICAgICBuYW1lVG9rZW4uY2hhck9mZnNldCwgbmFtZVRva2VuLmxlbmd0aCk7CiAgICB9CgogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhc3NlcnQoZm9yZXN0LmFyZ3VtZW50c1R5cGVBcmd1bWVudHMoYXJndW1lbnRzKS5pc0VtcHR5KTsKICAgICAgZm9yZXN0LmFyZ3VtZW50c1NldFR5cGVBcmd1bWVudHMoCiAgICAgICAgICBhcmd1bWVudHMsIGJ1aWxkRGFydFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cykpOwogICAgfQoKICAgIFN0cmluZyBlcnJvck5hbWU7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwoKICAgIGlmICh0eXBlIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgZXJyb3JOYW1lID0gZGVidWdOYW1lKHR5cGUubmFtZSwgbmFtZSk7CiAgICAgIFR5cGVBbGlhc0J1aWxkZXIgYWxpYXNCdWlsZGVyID0gdHlwZTsKICAgICAgdHlwZSA9IGFsaWFzQnVpbGRlci51bmFsaWFzRGVjbGFyYXRpb247CiAgICB9CiAgICBpZiAodHlwZSBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgaWYgKHR5cGUgaXMgRW51bUJ1aWxkZXIpIHsKICAgICAgICByZXR1cm4gYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VFbnVtSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgbmFtZVRva2VuLmNoYXJPZmZzZXQsIG5hbWVUb2tlbi5sZW5ndGgpOwogICAgICB9CiAgICAgIE1lbWJlckJ1aWxkZXIgYiA9CiAgICAgICAgICB0eXBlLmZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeShuYW1lLCBjaGFyT2Zmc2V0LCB1cmksIGxpYnJhcnlCdWlsZGVyKTsKICAgICAgTWVtYmVyIHRhcmdldCA9IGI/Lm1lbWJlcjsKICAgICAgaWYgKGIgPT0gbnVsbCkgewogICAgICAgIC8vIE5vdCBmb3VuZC4gUmVwb3J0ZWQgYmVsb3cuCiAgICAgIH0gZWxzZSBpZiAoYiBpcyBBbWJpZ3VvdXNNZW1iZXJCdWlsZGVyKSB7CiAgICAgICAgbWVzc2FnZSA9IGIubWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0gZWxzZSBpZiAoYi5pc0NvbnN0cnVjdG9yKSB7CiAgICAgICAgaWYgKHR5cGUuaXNBYnN0cmFjdCkgewogICAgICAgICAgcmV0dXJuIGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgICAgICBidWlsZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb24KICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGUubmFtZSksCiAgICAgICAgICAgICAgICAgIHR5cGUubmFtZSwKICAgICAgICAgICAgICAgICAgbmFtZVRva2VuLmNoYXJPZmZzZXQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCBpcyBDb25zdHJ1Y3RvciB8fAogICAgICAgICAgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5GYWN0b3J5KSkgewogICAgICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbjsKCiAgICAgICAgaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbih0YXJnZXQsIGFyZ3VtZW50cywKICAgICAgICAgICAgY29uc3RuZXNzOiBjb25zdG5lc3MsCiAgICAgICAgICAgIGNoYXJPZmZzZXQ6IG5hbWVUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICBjaGFyTGVuZ3RoOiBuYW1lVG9rZW4ubGVuZ3RoKTsKCiAgICAgICAgaWYgKGludm9jYXRpb24gaXMgU3RhdGljSW52b2NhdGlvbiAmJgogICAgICAgICAgICBpc1JlZGlyZWN0aW5nRmFjdG9yeSh0YXJnZXQsIGhlbHBlcjogdGhpcykpIHsKICAgICAgICAgIHJlZGlyZWN0aW5nRmFjdG9yeUludm9jYXRpb25zLmFkZChpbnZvY2F0aW9uKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbnZvY2F0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIGVycm9yTmFtZSA/Pz0gZGVidWdOYW1lKHR5cGUubmFtZSwgbmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSBpcyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcikgewogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlID0gdHlwZS5tZXNzYWdlOwogICAgICByZXR1cm4gZXZhbHVhdGVBcmd1bWVudHNCZWZvcmUoCiAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICBidWlsZFByb2JsZW0obWVzc2FnZS5tZXNzYWdlT2JqZWN0LCBuYW1lVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICAgICBuYW1lVG9rZW4ubGV4ZW1lLmxlbmd0aCkpOwogICAgfSBlbHNlIHsKICAgICAgZXJyb3JOYW1lID8/PSBkZWJ1Z05hbWUodHlwZS5mdWxsTmFtZUZvckVycm9ycywgbmFtZSk7CiAgICB9CiAgICBlcnJvck5hbWUgPz89IG5hbWU7CgogICAgcmV0dXJuIHRocm93Tm9TdWNoTWV0aG9kRXJyb3IoZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKGNoYXJPZmZzZXQpLAogICAgICAgIGVycm9yTmFtZSwgYXJndW1lbnRzLCBuYW1lTGFzdFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kQ29uc3RFeHByZXNzaW9uIik7CiAgICBfYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb24oCiAgICAgICAgdG9rZW4ubmV4dCwgdG9rZW4ub2Zmc2V0LCBDb25zdG5lc3MuZXhwbGljaXRDb25zdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSWZDb250cm9sRmxvdyhUb2tlbiBpZlRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcyB3aGVuIGNvbnRyb2wgZmxvdyBzdXBwb3J0IGlzIGFkZGVkCiAgICAvLyBpZiB0aGUgaWZUb2tlbiBpcyBub3QgbmVlZGVkIGZvciBlcnJvciByZXBvcnRpbmcKICAgIHB1c2goaWZUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBlbnRlclRoZW5Gb3JUeXBlUHJvbW90aW9uKGNvbmRpdGlvbik7CiAgICBwdXNoKGNvbmRpdGlvbik7CiAgICBzdXBlci5iZWdpblRoZW5Db250cm9sRmxvdyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZElmQ29udHJvbEZsb3ciKTsKICAgIE9iamVjdCBlbnRyeSA9IHBvcCgpOwogICAgT2JqZWN0IGNvbmRpdGlvbiA9IHBvcCgpOyAvLyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24KICAgIFRva2VuIGlmVG9rZW4gPSBwb3AoKTsKICAgIHR5cGVQcm9tb3Rlcj8uZW50ZXJFbHNlKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwoKICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIGlmIChlbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICBwdXNoKGZvcmVzdC5jcmVhdGVJZk1hcEVudHJ5KAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbiksIHRvVmFsdWUoY29uZGl0aW9uKSwgZW50cnkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZUlmRWxlbWVudCgKICAgICAgICAgIG9mZnNldEZvclRva2VuKGlmVG9rZW4pLCB0b1ZhbHVlKGNvbmRpdGlvbiksIHRvVmFsdWUoZW50cnkpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmRWxzZUNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRJZkVsc2VDb250cm9sRmxvdyIpOwogICAgT2JqZWN0IGVsc2VFbnRyeSA9IHBvcCgpOyAvLyBlbHNlIGVudHJ5CiAgICBPYmplY3QgdGhlbkVudHJ5ID0gcG9wKCk7IC8vIHRoZW4gZW50cnkKICAgIE9iamVjdCBjb25kaXRpb24gPSBwb3AoKTsgLy8gcGFyZW50aGVzaXplZCBleHByZXNzaW9uCiAgICBUb2tlbiBpZlRva2VuID0gcG9wKCk7CiAgICB0eXBlUHJvbW90ZXI/LmV4aXRDb25kaXRpb25hbCgpOwoKICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIGlmICh0aGVuRW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgaWYgKGVsc2VFbnRyeSBpcyBNYXBFbnRyeSkgewogICAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZUlmTWFwRW50cnkoCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKGlmVG9rZW4pLCB0b1ZhbHVlKGNvbmRpdGlvbiksIHRoZW5FbnRyeSwgZWxzZUVudHJ5KSk7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUVudHJ5IGlzIENvbnRyb2xGbG93RWxlbWVudCkgewogICAgICAgIE1hcEVudHJ5IGVsc2VNYXBFbnRyeSA9CiAgICAgICAgICAgIGVsc2VFbnRyeS50b01hcEVudHJ5KHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LnJlYXNzaWduSW5mbyk7CiAgICAgICAgaWYgKGVsc2VNYXBFbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICBwdXNoKGZvcmVzdC5jcmVhdGVJZk1hcEVudHJ5KG9mZnNldEZvclRva2VuKGlmVG9rZW4pLAogICAgICAgICAgICAgIHRvVmFsdWUoY29uZGl0aW9uKSwgdGhlbkVudHJ5LCBlbHNlTWFwRW50cnkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW50IG9mZnNldCA9IGVsc2VFbnRyeSBpcyBFeHByZXNzaW9uCiAgICAgICAgICAgICAgPyBlbHNlRW50cnkuZmlsZU9mZnNldAogICAgICAgICAgICAgIDogb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbik7CiAgICAgICAgICBwdXNoKG5ldyBNYXBFbnRyeSgKICAgICAgICAgICAgICBidWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb24sIG9mZnNldCwgMSksCiAgICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGlmVG9rZW4pKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50IG9mZnNldCA9IGVsc2VFbnRyeSBpcyBFeHByZXNzaW9uCiAgICAgICAgICAgID8gZWxzZUVudHJ5LmZpbGVPZmZzZXQKICAgICAgICAgICAgOiBvZmZzZXRGb3JUb2tlbihpZlRva2VuKTsKICAgICAgICBwdXNoKG5ldyBNYXBFbnRyeSgKICAgICAgICAgICAgYnVpbGRQcm9ibGVtKGZhc3RhLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc6JyksCiAgICAgICAgICAgICAgICBvZmZzZXQsIDEpLAogICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKGlmVG9rZW4pKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbHNlRW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgaWYgKHRoZW5FbnRyeSBpcyBDb250cm9sRmxvd0VsZW1lbnQpIHsKICAgICAgICBNYXBFbnRyeSB0aGVuTWFwRW50cnkgPQogICAgICAgICAgICB0aGVuRW50cnkudG9NYXBFbnRyeSh0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5yZWFzc2lnbkluZm8pOwogICAgICAgIGlmICh0aGVuTWFwRW50cnkgIT0gbnVsbCkgewogICAgICAgICAgcHVzaChmb3Jlc3QuY3JlYXRlSWZNYXBFbnRyeShvZmZzZXRGb3JUb2tlbihpZlRva2VuKSwKICAgICAgICAgICAgICB0b1ZhbHVlKGNvbmRpdGlvbiksIHRoZW5NYXBFbnRyeSwgZWxzZUVudHJ5KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludCBvZmZzZXQgPSB0aGVuRW50cnkgaXMgRXhwcmVzc2lvbgogICAgICAgICAgICAgID8gdGhlbkVudHJ5LmZpbGVPZmZzZXQKICAgICAgICAgICAgICA6IG9mZnNldEZvclRva2VuKGlmVG9rZW4pOwogICAgICAgICAgcHVzaChuZXcgTWFwRW50cnkoCiAgICAgICAgICAgICAgYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlQ2FudERpc2FtYmlndWF0ZUFtYmlndW91c0luZm9ybWF0aW9uLCBvZmZzZXQsIDEpLAogICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihpZlRva2VuKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGludCBvZmZzZXQgPSB0aGVuRW50cnkgaXMgRXhwcmVzc2lvbgogICAgICAgICAgICA/IHRoZW5FbnRyeS5maWxlT2Zmc2V0CiAgICAgICAgICAgIDogb2Zmc2V0Rm9yVG9rZW4oaWZUb2tlbik7CiAgICAgICAgcHVzaChuZXcgTWFwRW50cnkoCiAgICAgICAgICAgIGJ1aWxkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnOicpLAogICAgICAgICAgICAgICAgb2Zmc2V0LCAxKSwKICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihpZlRva2VuKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZUlmRWxlbWVudChvZmZzZXRGb3JUb2tlbihpZlRva2VuKSwgdG9WYWx1ZShjb25kaXRpb24pLAogICAgICAgICAgdG9WYWx1ZSh0aGVuRW50cnkpLCB0b1ZhbHVlKGVsc2VFbnRyeSkpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ByZWFkRXhwcmVzc2lvbihUb2tlbiBzcHJlYWRUb2tlbikgewogICAgZGVidWdFdmVudCgiU3ByZWFkRXhwcmVzc2lvbiIpOwogICAgT2JqZWN0IGV4cHJlc3Npb24gPSBwb3AoKTsKICAgIHRyYW5zZm9ybUNvbGxlY3Rpb25zID0gdHJ1ZTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZVNwcmVhZEVsZW1lbnQoCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oc3ByZWFkVG9rZW4pLCB0b1ZhbHVlKGV4cHJlc3Npb24pLAogICAgICAgIGlzTnVsbEF3YXJlOiBzcHJlYWRUb2tlbi5sZXhlbWUgPT0gJy4uLj8nKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZUFyZ3VtZW50cyIpOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxVbnJlc29sdmVkVHlwZT4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5UeXBlQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRUeXBlQXJndW1lbnRzIik7CiAgICBwb3AoTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZGVidWdFdmVudCgiVGhpc0V4cHJlc3Npb24iKTsKICAgIGlmIChjb250ZXh0LmlzU2NvcGVSZWZlcmVuY2UgJiYgaXNEZWNsYXJhdGlvbkluc3RhbmNlQ29udGV4dCkgewogICAgICBpZiAoZXh0ZW5zaW9uVGhpcyAhPSBudWxsKSB7CiAgICAgICAgcHVzaChfY3JlYXRlUmVhZE9ubHlWYXJpYWJsZUFjY2VzcygKICAgICAgICAgICAgZXh0ZW5zaW9uVGhpcywgdG9rZW4sIG9mZnNldEZvclRva2VuKHRva2VuKSwgJ3RoaXMnKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaChuZXcgVGhpc0FjY2Vzc0dlbmVyYXRvcih0aGlzLCB0b2tlbiwgaW5Jbml0aWFsaXplciwKICAgICAgICAgICAgaW5GaWVsZEluaXRpYWxpemVyLCBpbkxhdGVGaWVsZEluaXRpYWxpemVyKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IEluY29tcGxldGVFcnJvckdlbmVyYXRvcigKICAgICAgICAgIHRoaXMsIHRva2VuLCBmYXN0YS5tZXNzYWdlVGhpc0FzSWRlbnRpZmllcikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdXBlckV4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGRlYnVnRXZlbnQoIlN1cGVyRXhwcmVzc2lvbiIpOwogICAgaWYgKGNvbnRleHQuaXNTY29wZVJlZmVyZW5jZSAmJgogICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZUNvbnRleHQgJiYKICAgICAgICBleHRlbnNpb25UaGlzID09IG51bGwpIHsKICAgICAgTWVtYmVyQnVpbGRlciBtZW1iZXJCdWlsZGVyID0gbWVtYmVyOwogICAgICBtZW1iZXJCdWlsZGVyLm1lbWJlci50cmFuc2Zvcm1lckZsYWdzIHw9IFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzOwogICAgICBwdXNoKG5ldyBUaGlzQWNjZXNzR2VuZXJhdG9yKHRoaXMsIHRva2VuLCBpbkluaXRpYWxpemVyLAogICAgICAgICAgaW5GaWVsZEluaXRpYWxpemVyLCBpbkxhdGVGaWVsZEluaXRpYWxpemVyLAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICAgICAgdGhpcywgdG9rZW4sIGZhc3RhLm1lc3NhZ2VTdXBlckFzSWRlbnRpZmllcikpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYW1lZEFyZ3VtZW50KFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYW1lZEFyZ3VtZW50Iik7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gcG9wRm9yVmFsdWUoKTsKICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IHBvcCgpOwogICAgcHVzaChuZXcgTmFtZWRFeHByZXNzaW9uKGlkZW50aWZpZXIubmFtZSwgdmFsdWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGlkZW50aWZpZXIuY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uTmFtZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25OYW1lIik7CiAgICBJZGVudGlmaWVyIG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG5hbWVUb2tlbiA9IGRlcHJlY2F0ZWRfZXh0cmFjdFRva2VuKG5hbWUpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCgKICAgICAgICBuYW1lLm5hbWUsIGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICAgIGZvclN5bnRoZXRpY1Rva2VuOiBuYW1lVG9rZW4uaXNTeW50aGV0aWMsCiAgICAgICAgaXNGaW5hbDogdHJ1ZSwKICAgICAgICBpc0xvY2FsRnVuY3Rpb246IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG5hbWUuY2hhck9mZnNldDsKICAgIC8vIFRPRE8oYWhlKTogV2h5IGFyZSB3ZSBsb29raW5nIHVwIGluIGxvY2FsIHNjb3BlLCBidXQgZGVjbGFyaW5nIGluIHBhcmVudAogICAgLy8gc2NvcGU/CiAgICBCdWlsZGVyIGV4aXN0aW5nID0gc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZS5uYW1lLCBzZXR0ZXI6IGZhbHNlKTsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIHJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbihleGlzdGluZywgbmFtZS5uYW1lLCBuYW1lLmNoYXJPZmZzZXQpOwogICAgfQogICAgcHVzaChuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbkltcGwoCiAgICAgICAgdmFyaWFibGUsCiAgICAgICAgLy8gVGhlIGZ1bmN0aW9uIG5vZGUgaXMgY3JlYXRlZCBsYXRlci4KICAgICAgICBudWxsKQogICAgICAuLmZpbGVPZmZzZXQgPSBiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgZGVjbGFyZVZhcmlhYmxlKHZhcmlhYmxlLCBzY29wZS5wYXJlbnQpOwogIH0KCiAgdm9pZCBlbnRlckZ1bmN0aW9uKCkgewogICAgX2VudGVyTG9jYWxTdGF0ZSgpOwogICAgZGVidWdFdmVudCgiZW50ZXJGdW5jdGlvbiIpOwogICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwrKzsKICAgIHB1c2goc3dpdGNoU2NvcGUgPz8gTnVsbFZhbHVlLlN3aXRjaFNjb3BlKTsKICAgIHN3aXRjaFNjb3BlID0gbnVsbDsKICAgIHB1c2goaW5DYXRjaEJsb2NrKTsKICAgIGluQ2F0Y2hCbG9jayA9IGZhbHNlOwogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtlbmROb2RlXSBpbiBbcHVzaE5hbWVkRnVuY3Rpb25dIG9yCiAgICAvLyBbZW5kRnVuY3Rpb25FeHByZXNzaW9uXS4KICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmJlZ2luTm9kZSgpOwogIH0KCiAgdm9pZCBleGl0RnVuY3Rpb24oKSB7CiAgICBkZWJ1Z0V2ZW50KCJleGl0RnVuY3Rpb24iKTsKICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsLS07CiAgICBpbkNhdGNoQmxvY2sgPSBwb3AoKTsKICAgIHN3aXRjaFNjb3BlID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKHR5cGVWYXJpYWJsZXMgPz8gTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogICAgX2V4aXRMb2NhbFN0YXRlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbiIpOwogICAgZW50ZXJGdW5jdGlvbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uIik7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIC8vIENyZWF0ZSBhbiBhZGRpdGlvbmFsIHNjb3BlIGluIHdoaWNoIHRoZSBuYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIGlzCiAgICAvLyBkZWNsYXJlZC4KICAgIGVudGVyTG9jYWxTY29wZSgibmFtZWQgZnVuY3Rpb24iKTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyA/PyBOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBlbnRlckZ1bmN0aW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogICAgZW50ZXJGdW5jdGlvbigpOwogIH0KCiAgdm9pZCBwdXNoTmFtZWRGdW5jdGlvbihUb2tlbiB0b2tlbiwgYm9vbCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIE9iamVjdCBkZWNsYXJhdGlvbiA9IHBvcCgpOwogICAgVW5yZXNvbHZlZFR5cGUgcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgYm9vbCBoYXNJbXBsaWNpdFJldHVyblR5cGUgPSByZXR1cm5UeXBlID09IG51bGw7CiAgICBleGl0RnVuY3Rpb24oKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnMgPSBwb3AoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnM7CiAgICBpZiAoIWlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgIGFubm90YXRpb25zID0gcG9wKCk7IC8vIE1ldGFkYXRhLgogICAgfQogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gZm9ybWFscy5idWlsZEZ1bmN0aW9uTm9kZShsaWJyYXJ5QnVpbGRlciwKICAgICAgICByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgYXN5bmNNb2RpZmllciwgYm9keSwgdG9rZW4uY2hhck9mZnNldCk7CgogICAgaWYgKGRlY2xhcmF0aW9uIGlzIEZ1bmN0aW9uRGVjbGFyYXRpb24pIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGRlY2xhcmF0aW9uLnZhcmlhYmxlOwogICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICAgIGZvciAoRXhwcmVzc2lvbiBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgICAgICB2YXJpYWJsZS5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uSW1wbC5zZXRIYXNJbXBsaWNpdFJldHVyblR5cGUoCiAgICAgICAgICBkZWNsYXJhdGlvbiwgaGFzSW1wbGljaXRSZXR1cm5UeXBlKTsKICAgICAgaWYgKCFoYXNJbXBsaWNpdFJldHVyblR5cGUpIHsKICAgICAgICBjaGVja0FzeW5jUmV0dXJuVHlwZShhc3luY01vZGlmaWVyLCBmdW5jdGlvbi5yZXR1cm5UeXBlLAogICAgICAgICAgICB2YXJpYWJsZS5maWxlT2Zmc2V0LCB2YXJpYWJsZS5uYW1lLmxlbmd0aCk7CiAgICAgIH0KCiAgICAgIHZhcmlhYmxlLnR5cGUgPSBmdW5jdGlvbi5jb21wdXRlRnVuY3Rpb25UeXBlKGxpYnJhcnlCdWlsZGVyLm5vbk51bGxhYmxlKTsKICAgICAgaWYgKGlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICAgICAgRXhwcmVzc2lvbiBvbGRJbml0aWFsaXplciA9IHZhcmlhYmxlLmluaXRpYWxpemVyOwogICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihmdW5jdGlvbikKICAgICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGUKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZvcm1hbHMuY2hhck9mZnNldDsKICAgICAgICBleGl0TG9jYWxTY29wZSgpOwogICAgICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbYmVnaW5Ob2RlXSBpbiBbZW50ZXJGdW5jdGlvbl0uCiAgICAgICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcwogICAgICAgICAgICA/LmVuZE5vZGUodmFyaWFibGUuaW5pdGlhbGl6ZXIsIGlzQ2xvc3VyZTogdHJ1ZSk7CiAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbmV3IE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQodmFyaWFibGUpOwogICAgICAgIGlmIChvbGRJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAvLyBUaGlzIG11c3QgaGF2ZSBiZWVuIGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IG9sZEluaXRpYWxpemVyOwogICAgICAgICAgYXNzZXJ0KGlzRXJyb25lb3VzTm9kZShlcnJvcikpOwogICAgICAgICAgaW50IG9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgICAgICAgIHB1c2gobmV3IExldCgKICAgICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShlcnJvcikuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgICAgZXhwcmVzc2lvbikKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHVzaChleHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVjbGFyYXRpb24uZnVuY3Rpb24gPSBmdW5jdGlvbjsKICAgICAgICBmdW5jdGlvbi5wYXJlbnQgPSBkZWNsYXJhdGlvbjsKICAgICAgICBpZiAodmFyaWFibGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgLy8gVGhpcyBtdXN0IGhhdmUgYmVlbiBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAgICAgICAgIGFzc2VydChpc0Vycm9uZW91c05vZGUodmFyaWFibGUuaW5pdGlhbGl6ZXIpKTsKCiAgICAgICAgICBwdXNoKGZvcmVzdC5jcmVhdGVCbG9jayhkZWNsYXJhdGlvbi5maWxlT2Zmc2V0LCA8U3RhdGVtZW50PlsKICAgICAgICAgICAgZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksIHZhcmlhYmxlLmluaXRpYWxpemVyKSwKICAgICAgICAgICAgZGVjbGFyYXRpb24KICAgICAgICAgIF0pKTsKICAgICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHVzaChkZWNsYXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbYmVnaW5Ob2RlXSBpbiBbZW50ZXJGdW5jdGlvbl0uCiAgICAgICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZW5kTm9kZShkZWNsYXJhdGlvbiwgaXNDbG9zdXJlOiB0cnVlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLCAicHVzaE5hbWVkRnVuY3Rpb24iLAogICAgICAgICAgdG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uIik7CiAgICBwdXNoTmFtZWRGdW5jdGlvbihlbmRUb2tlbiwgdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uIik7CiAgICBwdXNoTmFtZWRGdW5jdGlvbih0b2tlbiwgZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBGb3JtYWxQYXJhbWV0ZXJzIGZvcm1hbHMgPSBwb3AoKTsKICAgIGV4aXRGdW5jdGlvbigpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlUGFyYW1ldGVycyA9IHBvcCgpOwogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gZm9ybWFscy5idWlsZEZ1bmN0aW9uTm9kZShsaWJyYXJ5QnVpbGRlciwgbnVsbCwKICAgICAgICB0eXBlUGFyYW1ldGVycywgYXN5bmNNb2RpZmllciwgYm9keSwgdG9rZW4uY2hhck9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0OwoKICAgIEV4cHJlc3Npb24gcmVzdWx0OwogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICByZXN1bHQgPSBidWlsZFByb2JsZW0oZmFzdGEubWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sCiAgICAgICAgICBmb3JtYWxzLmNoYXJPZmZzZXQsIGZvcm1hbHMubGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oZnVuY3Rpb24pCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbik7CiAgICB9CiAgICBwdXNoKHJlc3VsdCk7CiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2JlZ2luTm9kZV0gaW4gW2VudGVyRnVuY3Rpb25dLgogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZW5kTm9kZShyZXN1bHQsIGlzQ2xvc3VyZTogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRG9XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBbZW5kTm9kZV0gY2FsbCBpbiBbZW5kRG9XaGlsZVN0YXRlbWVudF0uCiAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzPy5iZWdpbk5vZGUoKTsKICAgIHN1cGVyLmJlZ2luRG9XaGlsZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZERvV2hpbGVTdGF0ZW1lbnQoCiAgICAgIFRva2VuIGRvS2V5d29yZCwgVG9rZW4gd2hpbGVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRG9XaGlsZVN0YXRlbWVudCIpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKICAgIEp1bXBUYXJnZXQgY29udGludWVUYXJnZXQgPSBleGl0Q29udGludWVUYXJnZXQoKTsKICAgIEp1bXBUYXJnZXQgYnJlYWtUYXJnZXQgPSBleGl0QnJlYWtUYXJnZXQoKTsKICAgIExpc3Q8QnJlYWtTdGF0ZW1lbnRJbXBsPiBjb250aW51ZVN0YXRlbWVudHM7CiAgICBpZiAoY29udGludWVUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgYm9keSA9IGZvcmVzdC5jcmVhdGVMYWJlbGVkU3RhdGVtZW50KGJvZHkpOwogICAgICBjb250aW51ZVN0YXRlbWVudHMgPSBjb250aW51ZVRhcmdldC5yZXNvbHZlQ29udGludWVzKGZvcmVzdCwgYm9keSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgZG9TdGF0ZW1lbnQgPQogICAgICAgIGZvcmVzdC5jcmVhdGVEb1N0YXRlbWVudChvZmZzZXRGb3JUb2tlbihkb0tleXdvcmQpLCBib2R5LCBjb25kaXRpb24pOwogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBbYmVnaW5Ob2RlXSBjYWxsIGluIFtiZWdpbkRvV2hpbGVTdGF0ZW1lbnRdLgogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZW5kTm9kZShkb1N0YXRlbWVudCk7CiAgICBpZiAoY29udGludWVTdGF0ZW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yIChCcmVha1N0YXRlbWVudEltcGwgY29udGludWVTdGF0ZW1lbnQgaW4gY29udGludWVTdGF0ZW1lbnRzKSB7CiAgICAgICAgY29udGludWVTdGF0ZW1lbnQudGFyZ2V0U3RhdGVtZW50ID0gZG9TdGF0ZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIFN0YXRlbWVudCByZXN1bHQgPSBkb1N0YXRlbWVudDsKICAgIGlmIChicmVha1RhcmdldC5oYXNVc2VycykgewogICAgICByZXN1bHQgPSBmb3Jlc3QuY3JlYXRlTGFiZWxlZFN0YXRlbWVudChyZXN1bHQpOwogICAgICBicmVha1RhcmdldC5yZXNvbHZlQnJlYWtzKGZvcmVzdCwgcmVzdWx0LCBkb1N0YXRlbWVudCk7CiAgICB9CiAgICBleGl0TG9vcE9yU3dpdGNoKHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBlbnRlckxvY2FsU2NvcGUobnVsbCwgc2NvcGUucGFyZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JJbkV4cHJlc3Npb24iKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChleHByZXNzaW9uID8/IE51bGxWYWx1ZS5FeHByZXNzaW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5Mb29wUGFydHMoVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4sCiAgICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcywgVG9rZW4gaW5LZXl3b3JkKSB7CiAgICBwdXNoKGF3YWl0VG9rZW4gPz8gTnVsbFZhbHVlLkF3YWl0VG9rZW4pOwogICAgcHVzaChmb3JUb2tlbik7CiAgICBwdXNoKGluS2V5d29yZCk7CiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2RlZmVyTm9kZV0gaW4gW2VuZEZvckluXSBvcgogICAgLy8gW2VuZEZvckluQ29udHJvbEZsb3ddLgogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uYmVnaW5Ob2RlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZvckluQ29udHJvbEZsb3ciKTsKICAgIE9iamVjdCBlbnRyeSA9IHBvcCgpOwogICAgVG9rZW4gaW5Ub2tlbiA9IHBvcCgpOwogICAgVG9rZW4gZm9yVG9rZW4gPSBwb3AoKTsKICAgIFRva2VuIGF3YWl0VG9rZW4gPSBwb3AoTnVsbFZhbHVlLkF3YWl0VG9rZW4pOwoKICAgIGlmIChjb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgcG9wRm9yVmFsdWUoKTsgLy8gUG9wIGl0ZXJhYmxlCiAgICAgIHBvcCgpOyAvLyBQb3AgbHZhbHVlCiAgICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmRpc2NhcmROb2RlKCk7CgogICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZmFzdGEudGVtcGxhdGVDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnQKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmb3JUb2tlbiksCiAgICAgICAgICBmb3JUb2tlbiwKICAgICAgICAgIGZvclRva2VuKTsKICAgICAgcHVzaChpbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtiZWdpbk5vZGVdIGluIFtoYW5kbGVGb3JJbkxvb3BQYXJ0c10uCiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlRGVjbGFyYXRpb24+IGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8gPQogICAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmRlZmVyTm9kZSgpOwoKICAgIEV4cHJlc3Npb24gaXRlcmFibGUgPSBwb3BGb3JWYWx1ZSgpOwogICAgT2JqZWN0IGx2YWx1ZSA9IHBvcCgpOyAvLyBsdmFsdWUKICAgIGV4aXRMb2NhbFNjb3BlKCk7CgogICAgdHJhbnNmb3JtQ29sbGVjdGlvbnMgPSB0cnVlOwogICAgRm9ySW5FbGVtZW50cyBlbGVtZW50cyA9CiAgICAgICAgX2NvbXB1dGVGb3JJbkVsZW1lbnRzKGZvclRva2VuLCBpblRva2VuLCBsdmFsdWUsIG51bGwpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGVsZW1lbnRzLnZhcmlhYmxlOwogICAgRXhwcmVzc2lvbiBwcm9ibGVtID0gZWxlbWVudHMuZXhwcmVzc2lvblByb2JsZW07CiAgICBpZiAoZW50cnkgaXMgTWFwRW50cnkpIHsKICAgICAgRm9ySW5NYXBFbnRyeSByZXN1bHQgPSBmb3Jlc3QuY3JlYXRlRm9ySW5NYXBFbnRyeSgKICAgICAgICAgIG9mZnNldEZvclRva2VuKGZvclRva2VuKSwKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgaXRlcmFibGUsCiAgICAgICAgICBlbGVtZW50cy5zeW50aGV0aWNBc3NpZ25tZW50LAogICAgICAgICAgZWxlbWVudHMuZXhwcmVzc2lvbkVmZmVjdHMsCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIHByb2JsZW0sCiAgICAgICAgICBpc0FzeW5jOiBhd2FpdFRva2VuICE9IG51bGwpOwogICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzCiAgICAgICAgICA/LnN0b3JlSW5mbyhyZXN1bHQsIGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8pOwogICAgICBwdXNoKHJlc3VsdCk7CiAgICB9IGVsc2UgewogICAgICBGb3JJbkVsZW1lbnQgcmVzdWx0ID0gZm9yZXN0LmNyZWF0ZUZvckluRWxlbWVudCgKICAgICAgICAgIG9mZnNldEZvclRva2VuKGZvclRva2VuKSwKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgaXRlcmFibGUsCiAgICAgICAgICBlbGVtZW50cy5zeW50aGV0aWNBc3NpZ25tZW50LAogICAgICAgICAgZWxlbWVudHMuZXhwcmVzc2lvbkVmZmVjdHMsCiAgICAgICAgICB0b1ZhbHVlKGVudHJ5KSwKICAgICAgICAgIHByb2JsZW0sCiAgICAgICAgICBpc0FzeW5jOiBhd2FpdFRva2VuICE9IG51bGwpOwogICAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzCiAgICAgICAgICA/LnN0b3JlSW5mbyhyZXN1bHQsIGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8pOwogICAgICBwdXNoKHJlc3VsdCk7CiAgICB9CiAgfQoKICBGb3JJbkVsZW1lbnRzIF9jb21wdXRlRm9ySW5FbGVtZW50cygKICAgICAgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGluVG9rZW4sIE9iamVjdCBsdmFsdWUsIFN0YXRlbWVudCBib2R5KSB7CiAgICBGb3JJbkVsZW1lbnRzIGVsZW1lbnRzID0gbmV3IEZvckluRWxlbWVudHMoKTsKICAgIGlmIChsdmFsdWUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICAvLyBMYXRlIGZvci1pbiB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIEFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4KICAgICAgLy8gcmVwb3J0ZWQgYnkgdGhlIHBhcnNlci4KICAgICAgbHZhbHVlLmlzTGF0ZSA9IGZhbHNlOwogICAgICBlbGVtZW50cy5leHBsaWNpdFZhcmlhYmxlRGVjbGFyYXRpb24gPSBsdmFsdWU7CiAgICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LndyaXRlKGx2YWx1ZSk7CiAgICAgIGlmIChsdmFsdWUuaXNDb25zdCkgewogICAgICAgIGVsZW1lbnRzLmV4cHJlc3Npb25Qcm9ibGVtID0gYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS5tZXNzYWdlRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGUsCiAgICAgICAgICAgIGx2YWx1ZS5maWxlT2Zmc2V0LAogICAgICAgICAgICBsdmFsdWUubmFtZS5sZW5ndGgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gZWxlbWVudHMuc3ludGhldGljVmFyaWFibGVEZWNsYXJhdGlvbiA9CiAgICAgICAgICBmb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgICAgICAgICBvZmZzZXRGb3JUb2tlbihmb3JUb2tlbiksIG51bGwsIGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICAgICAgICAgIGlzRmluYWw6IHRydWUpOwogICAgICBpZiAobHZhbHVlIGlzIEdlbmVyYXRvcikgewogICAgICAgIC8vLyBXZSBhcmUgaW4gdGhpcyBjYXNlLCB3aGVyZSBgbHZhbHVlYCBpc24ndCBhIFtWYXJpYWJsZURlY2xhcmF0aW9uXToKICAgICAgICAvLy8KICAgICAgICAvLy8gICAgIGZvciAobHZhbHVlIGluIGV4cHJlc3Npb24pIGJvZHkKICAgICAgICAvLy8KICAgICAgICAvLy8gVGhpcyBpcyBub3JtYWxpemVkIHRvOgogICAgICAgIC8vLwogICAgICAgIC8vLyAgICAgZm9yIChmaW5hbCAjdCBpbiBleHByZXNzaW9uKSB7CiAgICAgICAgLy8vICAgICAgIGx2YWx1ZSA9ICN0OwogICAgICAgIC8vLyAgICAgICBib2R5OwogICAgICAgIC8vLyAgICAgfQogICAgICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QgPQogICAgICAgICAgICB0eXBlUHJvbW90ZXI/LmdldEZhY3RGb3JBY2Nlc3ModmFyaWFibGUsIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKICAgICAgICBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUgPSB0eXBlUHJvbW90ZXI/LmN1cnJlbnRTY29wZTsKICAgICAgICBlbGVtZW50cy5zeW50aGV0aWNBc3NpZ25tZW50ID0gbHZhbHVlLmJ1aWxkQXNzaWdubWVudCgKICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0SW1wbCh2YXJpYWJsZSwgZmFjdCwgc2NvcGUsCiAgICAgICAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogZmFsc2UpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gaW5Ub2tlbi5vZmZzZXQsCiAgICAgICAgICAgIHZvaWRDb250ZXh0OiB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmb3Jlc3QuaXNWYXJpYWJsZXNEZWNsYXJhdGlvbihsdmFsdWUpCiAgICAgICAgICAgID8gZmFzdGEubWVzc2FnZUZvckluTG9vcEV4YWN0bHlPbmVWYXJpYWJsZQogICAgICAgICAgICA6IGZhc3RhLm1lc3NhZ2VGb3JJbkxvb3BOb3RBc3NpZ25hYmxlOwogICAgICAgIFRva2VuIHRva2VuID0gZm9yVG9rZW4ubmV4dC5uZXh0OwogICAgICAgIGVsZW1lbnRzLmV4cHJlc3Npb25Qcm9ibGVtID0KICAgICAgICAgICAgYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgICAgICBTdGF0ZW1lbnQgZWZmZWN0czsKICAgICAgICBpZiAoZm9yZXN0LmlzVmFyaWFibGVzRGVjbGFyYXRpb24obHZhbHVlKSkgewogICAgICAgICAgZWZmZWN0cyA9IGZvcmVzdC5jcmVhdGVCbG9jaygKICAgICAgICAgICAgICBub0xvY2F0aW9uLAogICAgICAgICAgICAgIC8vIE5ldyBsaXN0IGJlY2F1c2UgdGhlIGRlY2xhcmF0aW9ucyBhcmUgbm90IGEgZ3Jvd2FibGUgbGlzdC4KICAgICAgICAgICAgICBuZXcgTGlzdDxTdGF0ZW1lbnQ+LmZyb20oCiAgICAgICAgICAgICAgICAgIGZvcmVzdC52YXJpYWJsZXNEZWNsYXJhdGlvbkV4dHJhY3REZWNsYXJhdGlvbnMobHZhbHVlKSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlZmZlY3RzID0gZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9Mb2NhdGlvbiwgbHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxlbWVudHMuZXhwcmVzc2lvbkVmZmVjdHMgPSBjb21iaW5lU3RhdGVtZW50cygKICAgICAgICAgICAgZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICAgICAgICBub0xvY2F0aW9uLAogICAgICAgICAgICAgICAgYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIG9mZnNldEZvclRva2VuKHRva2VuKSwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSksCiAgICAgICAgICAgIGVmZmVjdHMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWxlbWVudHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluKFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JJbiIpOwogICAgU3RhdGVtZW50IGJvZHkgPSBwb3BTdGF0ZW1lbnQoKTsKCiAgICBUb2tlbiBpbktleXdvcmQgPSBwb3AoKTsKICAgIFRva2VuIGZvclRva2VuID0gcG9wKCk7CiAgICBUb2tlbiBhd2FpdFRva2VuID0gcG9wKE51bGxWYWx1ZS5Bd2FpdFRva2VuKTsKCiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2JlZ2luTm9kZV0gaW4gW2hhbmRsZUZvckluTG9vcFBhcnRzXS4KICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGVEZWNsYXJhdGlvbj4gYXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbyA9CiAgICAgICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZGVmZXJOb2RlKCk7CgogICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcG9wRm9yVmFsdWUoKTsKICAgIE9iamVjdCBsdmFsdWUgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBKdW1wVGFyZ2V0IGNvbnRpbnVlVGFyZ2V0ID0gZXhpdENvbnRpbnVlVGFyZ2V0KCk7CiAgICBKdW1wVGFyZ2V0IGJyZWFrVGFyZ2V0ID0gZXhpdEJyZWFrVGFyZ2V0KCk7CiAgICBMaXN0PEJyZWFrU3RhdGVtZW50SW1wbD4gY29udGludWVTdGF0ZW1lbnRzOwogICAgaWYgKGNvbnRpbnVlVGFyZ2V0Lmhhc1VzZXJzKSB7CiAgICAgIGJvZHkgPSBmb3Jlc3QuY3JlYXRlTGFiZWxlZFN0YXRlbWVudChib2R5KTsKICAgICAgY29udGludWVTdGF0ZW1lbnRzID0gY29udGludWVUYXJnZXQucmVzb2x2ZUNvbnRpbnVlcyhmb3Jlc3QsIGJvZHkpOwogICAgfQogICAgRm9ySW5FbGVtZW50cyBlbGVtZW50cyA9CiAgICAgICAgX2NvbXB1dGVGb3JJbkVsZW1lbnRzKGZvclRva2VuLCBpbktleXdvcmQsIGx2YWx1ZSwgYm9keSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gZWxlbWVudHMudmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHByb2JsZW0gPSBlbGVtZW50cy5leHByZXNzaW9uUHJvYmxlbTsKICAgIFN0YXRlbWVudCBmb3JJblN0YXRlbWVudDsKICAgIGlmIChlbGVtZW50cy5leHBsaWNpdFZhcmlhYmxlRGVjbGFyYXRpb24gIT0gbnVsbCkgewogICAgICBmb3JJblN0YXRlbWVudCA9IG5ldyBGb3JJblN0YXRlbWVudCh2YXJpYWJsZSwgZXhwcmVzc2lvbiwgYm9keSwKICAgICAgICAgIGlzQXN5bmM6IGF3YWl0VG9rZW4gIT0gbnVsbCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBhd2FpdFRva2VuPy5jaGFyT2Zmc2V0ID8/IGZvclRva2VuLmNoYXJPZmZzZXQKICAgICAgICAuLmJvZHlPZmZzZXQgPSBib2R5LmZpbGVPZmZzZXQ7IC8vIFRPRE8oYWhlKTogSXNuJ3QgdGhpcyByZWR1bmRhbnQ/CiAgICB9IGVsc2UgewogICAgICBmb3JJblN0YXRlbWVudCA9IG5ldyBGb3JJblN0YXRlbWVudFdpdGhTeW50aGVzaXplZFZhcmlhYmxlKAogICAgICAgICAgdmFyaWFibGUsCiAgICAgICAgICBleHByZXNzaW9uLAogICAgICAgICAgZWxlbWVudHMuc3ludGhldGljQXNzaWdubWVudCwKICAgICAgICAgIGVsZW1lbnRzLmV4cHJlc3Npb25FZmZlY3RzLAogICAgICAgICAgYm9keSwKICAgICAgICAgIGlzQXN5bmM6IGF3YWl0VG9rZW4gIT0gbnVsbCwKICAgICAgICAgIGhhc1Byb2JsZW06IHByb2JsZW0gIT0gbnVsbCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBhd2FpdFRva2VuPy5jaGFyT2Zmc2V0ID8/IGZvclRva2VuLmNoYXJPZmZzZXQKICAgICAgICAuLmJvZHlPZmZzZXQgPSBib2R5LmZpbGVPZmZzZXQ7IC8vIFRPRE8oYWhlKTogSXNuJ3QgdGhpcyByZWR1bmRhbnQ/CiAgICB9CiAgICB0eXBlSW5mZXJyZXI/LmFzc2lnbmVkVmFyaWFibGVzCiAgICAgICAgPy5zdG9yZUluZm8oZm9ySW5TdGF0ZW1lbnQsIGFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8pOwogICAgaWYgKGNvbnRpbnVlU3RhdGVtZW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoQnJlYWtTdGF0ZW1lbnRJbXBsIGNvbnRpbnVlU3RhdGVtZW50IGluIGNvbnRpbnVlU3RhdGVtZW50cykgewogICAgICAgIGNvbnRpbnVlU3RhdGVtZW50LnRhcmdldFN0YXRlbWVudCA9IGZvckluU3RhdGVtZW50OwogICAgICB9CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gZm9ySW5TdGF0ZW1lbnQ7CiAgICBpZiAoYnJlYWtUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgcmVzdWx0ID0gZm9yZXN0LmNyZWF0ZUxhYmVsZWRTdGF0ZW1lbnQocmVzdWx0KTsKICAgICAgYnJlYWtUYXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHJlc3VsdCwgZm9ySW5TdGF0ZW1lbnQpOwogICAgfQogICAgaWYgKHByb2JsZW0gIT0gbnVsbCkgewogICAgICByZXN1bHQgPSBjb21iaW5lU3RhdGVtZW50cygKICAgICAgICAgIGZvcmVzdC5jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KG5vTG9jYXRpb24sIHByb2JsZW0pLCByZXN1bHQpOwogICAgfQogICAgZXhpdExvb3BPclN3aXRjaChyZXN1bHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMYWJlbChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTGFiZWwiKTsKICAgIElkZW50aWZpZXIgaWRlbnRpZmllciA9IHBvcCgpOwogICAgcHVzaChuZXcgTGFiZWwoaWRlbnRpZmllci5uYW1lLCBpZGVudGlmaWVyLmNoYXJPZmZzZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkgewogICAgZGVidWdFdmVudCgiYmVnaW5MYWJlbGVkU3RhdGVtZW50Iik7CiAgICBMaXN0PExhYmVsPiBsYWJlbHMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PExhYmVsPigpLnBvcChzdGFjaywgbGFiZWxDb3VudCk7CiAgICBlbnRlckxvY2FsU2NvcGUobnVsbCwgc2NvcGUuY3JlYXRlTmVzdGVkTGFiZWxTY29wZSgpKTsKICAgIExhYmVsVGFyZ2V0IHRhcmdldCA9CiAgICAgICAgbmV3IExhYmVsVGFyZ2V0KG1lbWJlciwgZnVuY3Rpb25OZXN0aW5nTGV2ZWwsIHRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKGxhYmVscyAhPSBudWxsKSB7CiAgICAgIGZvciAoTGFiZWwgbGFiZWwgaW4gbGFiZWxzKSB7CiAgICAgICAgc2NvcGUuZGVjbGFyZUxhYmVsKGxhYmVsLm5hbWUsIHRhcmdldCk7CiAgICAgIH0KICAgIH0KICAgIHB1c2godGFyZ2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGFiZWxlZFN0YXRlbWVudChpbnQgbGFiZWxDb3VudCkgewogICAgZGVidWdFdmVudCgiTGFiZWxlZFN0YXRlbWVudCIpOwogICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IHBvcCgpOwogICAgTGFiZWxUYXJnZXQgdGFyZ2V0ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgaWYgKHRhcmdldC5icmVha1RhcmdldC5oYXNVc2VycyB8fCB0YXJnZXQuY29udGludWVUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgaWYgKGZvcmVzdC5pc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKHN0YXRlbWVudCkpIHsKICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VJbnRlcm5hbFByb2JsZW1MYWJlbFVzYWdlSW5WYXJpYWJsZXNEZWNsYXJhdGlvbiwKICAgICAgICAgICAgc3RhdGVtZW50LmZpbGVPZmZzZXQsCiAgICAgICAgICAgIHVyaSk7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlbWVudCBpcyEgTGFiZWxlZFN0YXRlbWVudCkgewogICAgICAgIHN0YXRlbWVudCA9IGZvcmVzdC5jcmVhdGVMYWJlbGVkU3RhdGVtZW50KHN0YXRlbWVudCk7CiAgICAgIH0KICAgICAgdGFyZ2V0LmJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCBzdGF0ZW1lbnQsIHN0YXRlbWVudCk7CiAgICAgIExpc3Q8QnJlYWtTdGF0ZW1lbnRJbXBsPiBjb250aW51ZVN0YXRlbWVudHMgPQogICAgICAgICAgdGFyZ2V0LmNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCBzdGF0ZW1lbnQpOwogICAgICBpZiAoY29udGludWVTdGF0ZW1lbnRzICE9IG51bGwpIHsKICAgICAgICBmb3IgKEJyZWFrU3RhdGVtZW50SW1wbCBjb250aW51ZVN0YXRlbWVudCBpbiBjb250aW51ZVN0YXRlbWVudHMpIHsKICAgICAgICAgIGNvbnRpbnVlU3RhdGVtZW50LnRhcmdldFN0YXRlbWVudCA9IHN0YXRlbWVudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHB1c2goc3RhdGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmV0aHJvd1N0YXRlbWVudChUb2tlbiByZXRocm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJSZXRocm93U3RhdGVtZW50Iik7CiAgICBpZiAoaW5DYXRjaEJsb2NrKSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZVJldGhyb3dTdGF0ZW1lbnQoCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihyZXRocm93VG9rZW4pLCBvZmZzZXRGb3JUb2tlbihlbmRUb2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoYnVpbGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VSZXRocm93Tm90Q2F0Y2gsCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihyZXRocm93VG9rZW4pLCBsZW5ndGhGb3JUb2tlbihyZXRocm93VG9rZW4pKSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihyZXRocm93VG9rZW4pKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRmluYWxseUJsb2NrKFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaW5hbGx5QmxvY2siKTsKICAgIC8vIERvIG5vdGhpbmcsIGhhbmRsZWQgYnkgW2VuZFRyeVN0YXRlbWVudF0uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgW2VuZE5vZGVdIGNhbGwgaW4gW2VuZFdoaWxlU3RhdGVtZW50XS4KICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmJlZ2luTm9kZSgpOwogICAgc3VwZXIuYmVnaW5XaGlsZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50KFRva2VuIHdoaWxlS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIldoaWxlU3RhdGVtZW50Iik7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHBvcFN0YXRlbWVudCgpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgSnVtcFRhcmdldCBjb250aW51ZVRhcmdldCA9IGV4aXRDb250aW51ZVRhcmdldCgpOwogICAgSnVtcFRhcmdldCBicmVha1RhcmdldCA9IGV4aXRCcmVha1RhcmdldCgpOwogICAgTGlzdDxCcmVha1N0YXRlbWVudEltcGw+IGNvbnRpbnVlU3RhdGVtZW50czsKICAgIGlmIChjb250aW51ZVRhcmdldC5oYXNVc2VycykgewogICAgICBib2R5ID0gZm9yZXN0LmNyZWF0ZUxhYmVsZWRTdGF0ZW1lbnQoYm9keSk7CiAgICAgIGNvbnRpbnVlU3RhdGVtZW50cyA9IGNvbnRpbnVlVGFyZ2V0LnJlc29sdmVDb250aW51ZXMoZm9yZXN0LCBib2R5KTsKICAgIH0KICAgIFN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCA9IGZvcmVzdC5jcmVhdGVXaGlsZVN0YXRlbWVudCgKICAgICAgICBvZmZzZXRGb3JUb2tlbih3aGlsZUtleXdvcmQpLCBjb25kaXRpb24sIGJvZHkpOwogICAgaWYgKGNvbnRpbnVlU3RhdGVtZW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoQnJlYWtTdGF0ZW1lbnRJbXBsIGNvbnRpbnVlU3RhdGVtZW50IGluIGNvbnRpbnVlU3RhdGVtZW50cykgewogICAgICAgIGNvbnRpbnVlU3RhdGVtZW50LnRhcmdldFN0YXRlbWVudCA9IHdoaWxlU3RhdGVtZW50OwogICAgICB9CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVzdWx0ID0gd2hpbGVTdGF0ZW1lbnQ7CiAgICBpZiAoYnJlYWtUYXJnZXQuaGFzVXNlcnMpIHsKICAgICAgcmVzdWx0ID0gZm9yZXN0LmNyZWF0ZUxhYmVsZWRTdGF0ZW1lbnQocmVzdWx0KTsKICAgICAgYnJlYWtUYXJnZXQucmVzb2x2ZUJyZWFrcyhmb3Jlc3QsIHJlc3VsdCwgd2hpbGVTdGF0ZW1lbnQpOwogICAgfQogICAgZXhpdExvb3BPclN3aXRjaChyZXN1bHQpOwogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBbYmVnaW5Ob2RlXSBjYWxsIGluIFtiZWdpbldoaWxlU3RhdGVtZW50XS4KICAgIHR5cGVJbmZlcnJlcj8uYXNzaWduZWRWYXJpYWJsZXM/LmVuZE5vZGUod2hpbGVTdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiRW1wdHlTdGF0ZW1lbnQiKTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZUVtcHR5U3RhdGVtZW50KG9mZnNldEZvclRva2VuKHRva2VuKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkFzc2VydChUb2tlbiBhc3NlcnRLZXl3b3JkLCBBc3NlcnQga2luZCkgewogICAgZGVidWdFdmVudCgiYmVnaW5Bc3NlcnQiKTsKICAgIC8vIElmIGluIGFuIGFzc2VydCBpbml0aWFsaXplciwgbWFrZSBzdXJlIFtpbkluaXRpYWxpemVyXSBpcyBmYWxzZSBzbyB3ZQogICAgLy8gdXNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIHNjb3BlLiBJZiB0aGlzIGlzIGFueSBvdGhlciBraW5kIG9mIGFzc2VydCwKICAgIC8vIGluSW5pdGlhbGl6ZXIgc2hvdWxkIGJlIGZhbHNlIGFueXdheS4KICAgIGluSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kLCBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIFRva2VuIGNvbW1hVG9rZW4sIFRva2VuIHNlbWljb2xvblRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3NlcnQiKTsKICAgIEV4cHJlc3Npb24gbWVzc2FnZSA9IHBvcEZvclZhbHVlSWZOb3ROdWxsKGNvbW1hVG9rZW4pOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBwb3BGb3JWYWx1ZSgpOwogICAgaW50IGZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihhc3NlcnRLZXl3b3JkKTsKCiAgICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gYXNzZXJ0IHRoYXQgYXBwZWFycyBhcyBhIHN0YXRlbWVudC4KICAgIFN0YXRlbWVudCBjcmVhdGVBc3NlcnRTdGF0ZW1lbnQoKSB7CiAgICAgIC8vIENvbXB1dGUgc3RhcnQgYW5kIGVuZCBvZmZzZXRzIGZvciB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24uCiAgICAgIC8vIFRoaXMgY29kZSBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGJlY2F1c2UgZXhwcmVzc2lvbnMgZG9uJ3QgY2FycnkKICAgICAgLy8gdGhlaXIgc3RhcnQgYW5kIGVuZCBvZmZzZXRzIGN1cnJlbnRseS4KICAgICAgLy8KICAgICAgLy8gVGhlIHRva2VuIHRoYXQgZm9sbG93cyBsZWZ0UGFyZW50aGVzaXMgaXMgY29uc2lkZXJlZCB0byBiZSB0aGUKICAgICAgLy8gZmlyc3QgdG9rZW4gb2YgdGhlIGNvbmRpdGlvbi4KICAgICAgLy8gVE9ETyhhaGUpOiB0aGlzIHJlYWxseSBzaG91bGQgYmUgY29uZGl0aW9uLmZpbGVPZmZzZXQuCiAgICAgIGludCBzdGFydE9mZnNldCA9IGxlZnRQYXJlbnRoZXNpcy5uZXh0Lm9mZnNldDsKICAgICAgaW50IGVuZE9mZnNldDsKCiAgICAgIC8vIFNlYXJjaCBmb3J3YXJkIGZyb20gbGVmdFBhcmVudGhlc2lzIHRvIGZpbmQgdGhlIGxhc3QgdG9rZW4gb2YKICAgICAgLy8gdGhlIGNvbmRpdGlvbiAtIHdoaWNoIGlzIGEgdG9rZW4gaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb21tYVRva2VuLAogICAgICAvLyByaWdodCBwYXJlbnRoZXNpcyBvciBhIHRyYWlsaW5nIGNvbW1hLgogICAgICBUb2tlbiBjb25kaXRpb25Cb3VuZGFyeSA9IGNvbW1hVG9rZW4gPz8gbGVmdFBhcmVudGhlc2lzLmVuZEdyb3VwOwogICAgICBUb2tlbiBjb25kaXRpb25MYXN0VG9rZW4gPSBsZWZ0UGFyZW50aGVzaXM7CiAgICAgIHdoaWxlICghY29uZGl0aW9uTGFzdFRva2VuLmlzRW9mKSB7CiAgICAgICAgVG9rZW4gbmV4dFRva2VuID0gY29uZGl0aW9uTGFzdFRva2VuLm5leHQ7CiAgICAgICAgaWYgKG5leHRUb2tlbiA9PSBjb25kaXRpb25Cb3VuZGFyeSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnLCcsIG5leHRUb2tlbikgJiYKICAgICAgICAgICAgbmV4dFRva2VuLm5leHQgPT0gY29uZGl0aW9uQm91bmRhcnkpIHsKICAgICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIHRyYWlsaW5nIGNvbW1hLCB3aGljaCBtZWFucyBjdXJyZW50IHRva2VuIGlzCiAgICAgICAgICAvLyB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgY29uZGl0aW9uLgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbmRpdGlvbkxhc3RUb2tlbiA9IG5leHRUb2tlbjsKICAgICAgfQogICAgICBpZiAoY29uZGl0aW9uTGFzdFRva2VuLmlzRW9mKSB7CiAgICAgICAgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSAtMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbmRPZmZzZXQgPSBjb25kaXRpb25MYXN0VG9rZW4ub2Zmc2V0ICsgY29uZGl0aW9uTGFzdFRva2VuLmxlbmd0aDsKICAgICAgfQoKICAgICAgcmV0dXJuIGZvcmVzdC5jcmVhdGVBc3NlcnRTdGF0ZW1lbnQoCiAgICAgICAgICBmaWxlT2Zmc2V0LCBjb25kaXRpb24sIG1lc3NhZ2UsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwogICAgfQoKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEFzc2VydC5TdGF0ZW1lbnQ6CiAgICAgICAgcHVzaChjcmVhdGVBc3NlcnRTdGF0ZW1lbnQoKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEFzc2VydC5FeHByZXNzaW9uOgogICAgICAgIC8vIFRoZSBwYXJzZXIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IGFzc2VydAogICAgICAgIC8vIGNhbm5vdCBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uCiAgICAgICAgcHVzaChidWlsZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VBc3NlcnRBc0V4cHJlc3Npb24sIGZpbGVPZmZzZXQsIGFzc2VydEtleXdvcmQubGVuZ3RoKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEFzc2VydC5Jbml0aWFsaXplcjoKICAgICAgICBwdXNoKGZvcmVzdC5jcmVhdGVBc3NlcnRJbml0aWFsaXplcigKICAgICAgICAgICAgZmlsZU9mZnNldCwgY3JlYXRlQXNzZXJ0U3RhdGVtZW50KCkpKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kWWllbGRTdGF0ZW1lbnQoVG9rZW4geWllbGRUb2tlbiwgVG9rZW4gc3RhclRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiWWllbGRTdGF0ZW1lbnQiKTsKICAgIHB1c2goZm9yZXN0LmNyZWF0ZVlpZWxkU3RhdGVtZW50KG9mZnNldEZvclRva2VuKHlpZWxkVG9rZW4pLCBwb3BGb3JWYWx1ZSgpLAogICAgICAgIGlzWWllbGRTdGFyOiBzdGFyVG9rZW4gIT0gbnVsbCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblN3aXRjaEJsb2NrIik7CiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIFtlbmROb2RlXSBjYWxsIGluIFtlbmRTd2l0Y2hTdGF0ZW1lbnRdLgogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uYmVnaW5Ob2RlKCk7CiAgICBlbnRlckxvY2FsU2NvcGUoInN3aXRjaCBibG9jayIpOwogICAgZW50ZXJTd2l0Y2hTY29wZSgpOwogICAgZW50ZXJCcmVha1RhcmdldCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hDYXNlKGludCBsYWJlbENvdW50LCBpbnQgZXhwcmVzc2lvbkNvdW50LCBUb2tlbiBmaXJzdFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblN3aXRjaENhc2UiKTsKICAgIGludCBjb3VudCA9IGxhYmVsQ291bnQgKyBleHByZXNzaW9uQ291bnQ7CiAgICBMaXN0PE9iamVjdD4gbGFiZWxzQW5kRXhwcmVzc2lvbnMgPQogICAgICAgIGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE9iamVjdD4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIExpc3Q8TGFiZWw+IGxhYmVscyA9IGxhYmVsQ291bnQgPT0gMCA/IG51bGwgOiBuZXcgTGlzdDxMYWJlbD4obGFiZWxDb3VudCk7CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0KICAgICAgICBuZXcgTGlzdDxFeHByZXNzaW9uPi5maWxsZWQoZXhwcmVzc2lvbkNvdW50LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBpbnQgbGFiZWxJbmRleCA9IDA7CiAgICBpbnQgZXhwcmVzc2lvbkluZGV4ID0gMDsKICAgIGlmIChsYWJlbHNBbmRFeHByZXNzaW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoT2JqZWN0IGxhYmVsT3JFeHByZXNzaW9uIGluIGxhYmVsc0FuZEV4cHJlc3Npb25zKSB7CiAgICAgICAgaWYgKGxhYmVsT3JFeHByZXNzaW9uIGlzIExhYmVsKSB7CiAgICAgICAgICBsYWJlbHNbbGFiZWxJbmRleCsrXSA9IGxhYmVsT3JFeHByZXNzaW9uOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleHByZXNzaW9uc1tleHByZXNzaW9uSW5kZXgrK10gPSBsYWJlbE9yRXhwcmVzc2lvbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChzY29wZSA9PSBzd2l0Y2hTY29wZSk7CiAgICBpZiAobGFiZWxzICE9IG51bGwpIHsKICAgICAgZm9yIChMYWJlbCBsYWJlbCBpbiBsYWJlbHMpIHsKICAgICAgICBTdHJpbmcgbGFiZWxOYW1lID0gbGFiZWwubmFtZTsKICAgICAgICBpZiAoc2NvcGUuaGFzTG9jYWxMYWJlbChsYWJlbE5hbWUpKSB7CiAgICAgICAgICAvLyBUT0RPKGFoZSk6IFNob3VsZCB2YWxpZGF0ZSB0aGlzIGlzIGEgZ290byB0YXJnZXQuCiAgICAgICAgICBpZiAoIXNjb3BlLmNsYWltTGFiZWwobGFiZWxOYW1lKSkgewogICAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50CiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobGFiZWxOYW1lKSwKICAgICAgICAgICAgICAgIGxhYmVsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBsYWJlbE5hbWUubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2NvcGUuZGVjbGFyZUxhYmVsKAogICAgICAgICAgICAgIGxhYmVsTmFtZSwgY3JlYXRlR290b1RhcmdldChmaXJzdFRva2VuLmNoYXJPZmZzZXQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHB1c2goZXhwcmVzc2lvbnMpOwogICAgcHVzaChsYWJlbHMgPz8gTnVsbFZhbHVlLkxhYmVscyk7CiAgICBlbnRlckxvY2FsU2NvcGUoInN3aXRjaCBjYXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaENhc2UoCiAgICAgIGludCBsYWJlbENvdW50LAogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50LAogICAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCwKICAgICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQsCiAgICAgIGludCBzdGF0ZW1lbnRDb3VudCwKICAgICAgVG9rZW4gZmlyc3RUb2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN3aXRjaENhc2UiKTsKICAgIC8vIFdlIGFsd2F5cyBjcmVhdGUgYSBibG9jayBoZXJlIHNvIHRoYXQgd2UgbGF0ZXIga25vdyB0aGF0IHRoZXJlJ3MgYWx3YXlzCiAgICAvLyBvbmUgc3ludGhldGljIGJsb2NrIHdoZW4gd2UgZmluaXNoIGNvbXBpbGluZyB0aGUgc3dpdGNoIHN0YXRlbWVudCBhbmQKICAgIC8vIGNoZWNrIHRoaXMgc3dpdGNoIGNhc2UgdG8gc2VlIGlmIGl0IGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZS4KICAgIFN0YXRlbWVudCBibG9jayA9IHBvcEJsb2NrKHN0YXRlbWVudENvdW50LCBmaXJzdFRva2VuLCBudWxsKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBMaXN0PExhYmVsPiBsYWJlbHMgPSBwb3AoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSBwb3AoKTsKICAgIExpc3Q8aW50PiBleHByZXNzaW9uT2Zmc2V0cyA9IDxpbnQ+W107CiAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBleHByZXNzaW9ucykgewogICAgICBleHByZXNzaW9uT2Zmc2V0cy5hZGQoZXhwcmVzc2lvbi5maWxlT2Zmc2V0KTsKICAgIH0KICAgIGFzc2VydChsYWJlbHMgPT0gbnVsbCB8fCBsYWJlbHMuaXNOb3RFbXB0eSk7CiAgICBwdXNoKG5ldyBTd2l0Y2hDYXNlSW1wbChleHByZXNzaW9ucywgZXhwcmVzc2lvbk9mZnNldHMsIGJsb2NrLAogICAgICAgIGlzRGVmYXVsdDogZGVmYXVsdEtleXdvcmQgIT0gbnVsbCwgaGFzTGFiZWw6IGxhYmVscyAhPSBudWxsKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaXJzdFRva2VuLmNoYXJPZmZzZXQpOwogICAgcHVzaChsYWJlbHMgPz8gTnVsbFZhbHVlLkxhYmVscyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiU3dpdGNoU3RhdGVtZW50Iik7CgogICAgTGlzdDxTd2l0Y2hDYXNlPiBjYXNlcyA9IHBvcCgpOwogICAgSnVtcFRhcmdldCB0YXJnZXQgPSBleGl0QnJlYWtUYXJnZXQoKTsKICAgIGV4aXRTd2l0Y2hTY29wZSgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBvcEZvclZhbHVlKCk7CiAgICBTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50ID0gbmV3IFN3aXRjaFN0YXRlbWVudChleHByZXNzaW9uLCBjYXNlcykKICAgICAgLi5maWxlT2Zmc2V0ID0gc3dpdGNoS2V5d29yZC5jaGFyT2Zmc2V0OwogICAgU3RhdGVtZW50IHJlc3VsdCA9IHN3aXRjaFN0YXRlbWVudDsKICAgIGlmICh0YXJnZXQuaGFzVXNlcnMpIHsKICAgICAgcmVzdWx0ID0gZm9yZXN0LmNyZWF0ZUxhYmVsZWRTdGF0ZW1lbnQocmVzdWx0KTsKICAgICAgdGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCByZXN1bHQsIHN3aXRjaFN0YXRlbWVudCk7CiAgICB9CiAgICBleGl0TG9vcE9yU3dpdGNoKHJlc3VsdCk7CiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIFtiZWdpbk5vZGVdIGNhbGwgaW4gW2JlZ2luU3dpdGNoQmxvY2tdLgogICAgdHlwZUluZmVycmVyPy5hc3NpZ25lZFZhcmlhYmxlcz8uZW5kTm9kZShzd2l0Y2hTdGF0ZW1lbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTd2l0Y2hCbG9jayhpbnQgY2FzZUNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiU3dpdGNoQmxvY2siKTsKICAgIExpc3Q8U3dpdGNoQ2FzZT4gY2FzZXMgPQogICAgICAgIG5ldyBMaXN0PFN3aXRjaENhc2U+LmZpbGxlZChjYXNlQ291bnQsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSBjYXNlQ291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICBMaXN0PExhYmVsPiBsYWJlbHMgPSBwb3AoKTsKICAgICAgU3dpdGNoQ2FzZSBjdXJyZW50ID0gY2FzZXNbaV0gPSBwb3AoKTsKICAgICAgaWYgKGxhYmVscyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChMYWJlbCBsYWJlbCBpbiBsYWJlbHMpIHsKICAgICAgICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gc3dpdGNoU2NvcGUubG9va3VwTGFiZWwobGFiZWwubmFtZSk7CiAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgdGFyZ2V0LnJlc29sdmVHb3Rvcyhmb3Jlc3QsIGN1cnJlbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlQ291bnQgLSAxOyBpKyspIHsKICAgICAgU3dpdGNoQ2FzZSBjdXJyZW50ID0gY2FzZXNbaV07CiAgICAgIEJsb2NrIGJsb2NrID0gY3VycmVudC5ib2R5OwogICAgICAvLyBbYmxvY2tdIGlzIGEgc3ludGhldGljIGJsb2NrIHRoYXQgaXMgYWRkZWQgdG8gaGFuZGxlIHZhcmlhYmxlCiAgICAgIC8vIGRlY2xhcmF0aW9ucyBpbiB0aGUgc3dpdGNoIGNhc2UuCiAgICAgIFRyZWVOb2RlIGxhc3ROb2RlID0KICAgICAgICAgIGJsb2NrLnN0YXRlbWVudHMuaXNFbXB0eSA/IG51bGwgOiBibG9jay5zdGF0ZW1lbnRzLmxhc3Q7CiAgICAgIGlmIChmb3Jlc3QuaXNCbG9jayhsYXN0Tm9kZSkpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgbm9uLXN5bnRoZXRpYyBibG9jay4KICAgICAgICBCbG9jayBibG9jayA9IGxhc3ROb2RlOwogICAgICAgIGxhc3ROb2RlID0gYmxvY2suc3RhdGVtZW50cy5pc0VtcHR5ID8gbnVsbCA6IGJsb2NrLnN0YXRlbWVudHMubGFzdDsKICAgICAgfQogICAgICBpZiAobGFzdE5vZGUgaXMgRXhwcmVzc2lvblN0YXRlbWVudCkgewogICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gbGFzdE5vZGU7CiAgICAgICAgbGFzdE5vZGUgPSBzdGF0ZW1lbnQuZXhwcmVzc2lvbjsKICAgICAgfQogICAgICBpZiAobGFzdE5vZGUgaXMhIEJyZWFrU3RhdGVtZW50ICYmCiAgICAgICAgICBsYXN0Tm9kZSBpcyEgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgJiYKICAgICAgICAgIGxhc3ROb2RlIGlzISBSZXRocm93ICYmCiAgICAgICAgICBsYXN0Tm9kZSBpcyEgUmV0dXJuU3RhdGVtZW50ICYmCiAgICAgICAgICAhZm9yZXN0LmlzVGhyb3cobGFzdE5vZGUpKSB7CiAgICAgICAgYmxvY2suYWRkU3RhdGVtZW50KAogICAgICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChidWlsZEZhbGxUaHJvdWdoRXJyb3IoY3VycmVudC5maWxlT2Zmc2V0KSkpOwogICAgICB9CiAgICB9CgogICAgcHVzaChjYXNlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNhc2VNYXRjaChUb2tlbiBjYXNlS2V5d29yZCwgVG9rZW4gY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkNhc2VNYXRjaCIpOwogICAgLy8gRG8gbm90aGluZy4gSGFuZGxlZCBieSBbaGFuZGxlU3dpdGNoQ2FzZV0uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQnJlYWtTdGF0ZW1lbnQiKTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gYnJlYWtUYXJnZXQ7CiAgICBJZGVudGlmaWVyIGlkZW50aWZpZXI7CiAgICBTdHJpbmcgbmFtZTsKICAgIGlmIChoYXNUYXJnZXQpIHsKICAgICAgaWRlbnRpZmllciA9IHBvcCgpOwogICAgICBuYW1lID0gaWRlbnRpZmllci5uYW1lOwogICAgICB0YXJnZXQgPSBzY29wZS5sb29rdXBMYWJlbChuYW1lKTsKICAgIH0KICAgIGlmICh0YXJnZXQgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpIHsKICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICBmYXN0YS5tZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wLCBicmVha0tleXdvcmQuY2hhck9mZnNldCkpOwogICAgfSBlbHNlIGlmICh0YXJnZXQgPT0gbnVsbCB8fAogICAgICAgIHRhcmdldCBpcyEgSnVtcFRhcmdldCB8fAogICAgICAgICF0YXJnZXQuaXNCcmVha1RhcmdldCkgewogICAgICBUb2tlbiBsYWJlbFRva2VuID0gYnJlYWtLZXl3b3JkLm5leHQ7CiAgICAgIHB1c2gocHJvYmxlbUluTG9vcE9yU3dpdGNoID0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgZmFzdGEudGVtcGxhdGVJbnZhbGlkQnJlYWtUYXJnZXQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGxhYmVsVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIGxlbmd0aDogbGFiZWxUb2tlbi5sZW5ndGgpKTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0LmZ1bmN0aW9uTmVzdGluZ0xldmVsICE9IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgIHB1c2goYnVpbGRQcm9ibGVtVGFyZ2V0T3V0c2lkZUxvY2FsRnVuY3Rpb24obmFtZSwgYnJlYWtLZXl3b3JkKSk7CiAgICB9IGVsc2UgewogICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0KICAgICAgICAgIGZvcmVzdC5jcmVhdGVCcmVha1N0YXRlbWVudChvZmZzZXRGb3JUb2tlbihicmVha0tleXdvcmQpLCBpZGVudGlmaWVyKTsKICAgICAgdGFyZ2V0LmFkZEJyZWFrKHN0YXRlbWVudCk7CiAgICAgIHB1c2goc3RhdGVtZW50KTsKICAgIH0KICB9CgogIFN0YXRlbWVudCBidWlsZFByb2JsZW1UYXJnZXRPdXRzaWRlTG9jYWxGdW5jdGlvbihTdHJpbmcgbmFtZSwgVG9rZW4ga2V5d29yZCkgewogICAgU3RhdGVtZW50IHByb2JsZW07CiAgICBib29sIGlzQnJlYWsgPSBvcHRpb25hbCgiYnJlYWsiLCBrZXl3b3JkKTsKICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcpPiB0ZW1wbGF0ZSA9IGlzQnJlYWsKICAgICAgICAgID8gZmFzdGEudGVtcGxhdGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbgogICAgICAgICAgOiBmYXN0YS50ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOwogICAgICBwcm9ibGVtID0gYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgdGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuYW1lKSwgb2Zmc2V0Rm9yVG9rZW4oa2V5d29yZCksCiAgICAgICAgICBsZW5ndGg6IGxlbmd0aE9mU3BhbihrZXl3b3JkLCBrZXl3b3JkLm5leHQpKTsKICAgIH0gZWxzZSB7CiAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlzQnJlYWsKICAgICAgICAgID8gZmFzdGEubWVzc2FnZUFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uCiAgICAgICAgICA6IGZhc3RhLm1lc3NhZ2VBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbjsKICAgICAgcHJvYmxlbSA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudChtZXNzYWdlLCBvZmZzZXRGb3JUb2tlbihrZXl3b3JkKSwKICAgICAgICAgIGxlbmd0aDogbGVuZ3RoRm9yVG9rZW4oa2V5d29yZCkpOwogICAgfQogICAgcHJvYmxlbUluTG9vcE9yU3dpdGNoID8/PSBwcm9ibGVtOwogICAgcmV0dXJuIHByb2JsZW07CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbnRpbnVlU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gY29udGludWVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQ29udGludWVTdGF0ZW1lbnQiKTsKICAgIEp1bXBUYXJnZXQgdGFyZ2V0ID0gY29udGludWVUYXJnZXQ7CiAgICBJZGVudGlmaWVyIGlkZW50aWZpZXI7CiAgICBTdHJpbmcgbmFtZTsKICAgIGlmIChoYXNUYXJnZXQpIHsKICAgICAgaWRlbnRpZmllciA9IHBvcCgpOwogICAgICBuYW1lID0gaWRlbnRpZmllci5uYW1lOwogICAgICBCdWlsZGVyIG5hbWVkVGFyZ2V0ID0gc2NvcGUubG9va3VwTGFiZWwoaWRlbnRpZmllci5uYW1lKTsKICAgICAgaWYgKG5hbWVkVGFyZ2V0ICE9IG51bGwgJiYgbmFtZWRUYXJnZXQgaXMhIEp1bXBUYXJnZXQpIHsKICAgICAgICBUb2tlbiBsYWJlbFRva2VuID0gY29udGludWVLZXl3b3JkLm5leHQ7CiAgICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDb250aW51ZUxhYmVsTm90VGFyZ2V0LCBsYWJlbFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIGxlbmd0aDogbGFiZWxUb2tlbi5sZW5ndGgpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGFyZ2V0ID0gbmFtZWRUYXJnZXQ7CiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAgIGlmIChzd2l0Y2hTY29wZSA9PSBudWxsKSB7CiAgICAgICAgICBwdXNoKGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUxhYmVsTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBjb250aW51ZUtleXdvcmQubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN3aXRjaFNjb3BlLmZvcndhcmREZWNsYXJlTGFiZWwoCiAgICAgICAgICAgIGlkZW50aWZpZXIubmFtZSwgdGFyZ2V0ID0gY3JlYXRlR290b1RhcmdldChpZGVudGlmaWVyLmNoYXJPZmZzZXQpKTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0LmlzR290b1RhcmdldCAmJgogICAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uTmVzdGluZ0xldmVsID09IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgICAgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KG51bGwpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjb250aW51ZUtleXdvcmQuY2hhck9mZnNldDsKICAgICAgICB0YXJnZXQuYWRkR290byhzdGF0ZW1lbnQpOwogICAgICAgIHB1c2goc3RhdGVtZW50KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICBwdXNoKHByb2JsZW1Jbkxvb3BPclN3aXRjaCA9IGJ1aWxkUHJvYmxlbVN0YXRlbWVudCgKICAgICAgICAgIGZhc3RhLm1lc3NhZ2VDb250aW51ZVdpdGhvdXRMYWJlbEluQ2FzZSwgY29udGludWVLZXl3b3JkLmNoYXJPZmZzZXQsCiAgICAgICAgICBsZW5ndGg6IGNvbnRpbnVlS2V5d29yZC5sZW5ndGgpKTsKICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pc0NvbnRpbnVlVGFyZ2V0KSB7CiAgICAgIFRva2VuIGxhYmVsVG9rZW4gPSBjb250aW51ZUtleXdvcmQubmV4dDsKICAgICAgcHVzaChwcm9ibGVtSW5Mb29wT3JTd2l0Y2ggPSBidWlsZFByb2JsZW1TdGF0ZW1lbnQoCiAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUludmFsaWRDb250aW51ZVRhcmdldC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgbGFiZWxUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgbGVuZ3RoOiBsYWJlbFRva2VuLmxlbmd0aCkpOwogICAgfSBlbHNlIGlmICh0YXJnZXQuZnVuY3Rpb25OZXN0aW5nTGV2ZWwgIT0gZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgICAgcHVzaChidWlsZFByb2JsZW1UYXJnZXRPdXRzaWRlTG9jYWxGdW5jdGlvbihuYW1lLCBjb250aW51ZUtleXdvcmQpKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBmb3Jlc3QuY3JlYXRlQ29udGludWVTdGF0ZW1lbnQoCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihjb250aW51ZUtleXdvcmQpLCBpZGVudGlmaWVyKTsKICAgICAgdGFyZ2V0LmFkZENvbnRpbnVlKHN0YXRlbWVudCk7CiAgICAgIHB1c2goc3RhdGVtZW50KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVHlwZVZhcmlhYmxlIik7CiAgICBJZGVudGlmaWVyIG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPSBwb3AoKTsKICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPQogICAgICAgIG5ldyBUeXBlVmFyaWFibGVCdWlsZGVyKG5hbWUubmFtZSwgbGlicmFyeUJ1aWxkZXIsIG5hbWUuY2hhck9mZnNldCk7CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICBpbmZlckFubm90YXRpb25zKHZhcmlhYmxlLnBhcmFtZXRlciwgYW5ub3RhdGlvbnMpOwogICAgICBmb3IgKEV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBhbm5vdGF0aW9ucykgewogICAgICAgIHZhcmlhYmxlLnBhcmFtZXRlci5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogICAgICB9CiAgICB9CiAgICBwdXNoKHZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQiKTsKICAgIGFzc2VydChjb3VudCA+IDApOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPigpLnBvcChzdGFjaywgY291bnQpOwogICAgZW50ZXJGdW5jdGlvblR5cGVTY29wZSh0eXBlVmFyaWFibGVzKTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZSgKICAgICAgVG9rZW4gdG9rZW4sIGludCBpbmRleCwgVG9rZW4gZXh0ZW5kc09yU3VwZXIsIFRva2VuIHZhcmlhbmNlKSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlVmFyaWFibGUiKTsKICAgIFVucmVzb2x2ZWRUeXBlIGJvdW5kID0gcG9wKCk7CiAgICAvLyBQZWVrIHRvIGxlYXZlIHR5cGUgcGFyYW1ldGVycyBvbiB0b3Agb2Ygc3RhY2suCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwZWVrKCk7CgogICAgVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IHR5cGVWYXJpYWJsZXNbaW5kZXhdOwogICAgdmFyaWFibGUuYm91bmQgPSBib3VuZD8uYnVpbGRlcjsKICAgIGlmICh2YXJpYW5jZSAhPSBudWxsKSB7CiAgICAgIGlmICghbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRhcmdldC5lbmFibGVWYXJpYW5jZSkgewogICAgICAgIHJlcG9ydFZhcmlhbmNlTW9kaWZpZXJOb3RFbmFibGVkKHZhcmlhbmNlKTsKICAgICAgfQogICAgICB2YXJpYWJsZS52YXJpYW5jZSA9IFZhcmlhbmNlLmZyb21TdHJpbmcodmFyaWFuY2UubGV4ZW1lKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZVZhcmlhYmxlcyhUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZVZhcmlhYmxlcyIpOwogICAgLy8gUGVlayB0byBsZWF2ZSB0eXBlIHBhcmFtZXRlcnMgb24gdG9wIG9mIHN0YWNrLgogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcGVlaygpOwoKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGNhbGN1bGF0ZWRCb3VuZHMgPSBjYWxjdWxhdGVCb3VuZHMoCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIudGFyZ2V0LmR5bmFtaWNUeXBlLAogICAgICAgIGxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQuYm90dG9tVHlwZSwKICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIudGFyZ2V0Lm9iamVjdENsYXNzQnVpbGRlcik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVWYXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdHlwZVZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZSA9IGNhbGN1bGF0ZWRCb3VuZHNbaV07CiAgICAgIHR5cGVWYXJpYWJsZXNbaV0uZGVmYXVsdFR5cGUucmVzb2x2ZUluKHNjb3BlLCB0eXBlVmFyaWFibGVzW2ldLmNoYXJPZmZzZXQsCiAgICAgICAgICB0eXBlVmFyaWFibGVzW2ldLmZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgICAgdHlwZVZhcmlhYmxlc1tpXS5maW5pc2goCiAgICAgICAgICBsaWJyYXJ5QnVpbGRlciwKICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQub2JqZWN0Q2xhc3NCdWlsZGVyLAogICAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRhcmdldC5keW5hbWljVHlwZSk7CiAgICB9CiAgICBUeXBlVmFyaWFibGVCdWlsZGVyLmZpbmlzaE51bGxhYmlsaXRpZXMoCiAgICAgICAgbGlicmFyeUJ1aWxkZXIsIGxpYnJhcnlCdWlsZGVyLnBlbmRpbmdOdWxsYWJpbGl0aWVzKTsKICAgIGxpYnJhcnlCdWlsZGVyLnBlbmRpbmdOdWxsYWJpbGl0aWVzLmNsZWFyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlVmFyaWFibGVzIik7CiAgICBlbnRlckZ1bmN0aW9uVHlwZVNjb3BlKG51bGwpOwogICAgcHVzaChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgfQoKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVWYXJpYWJsZUJ1aWxkZXJzVG9LZXJuZWwoCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlQnVpbGRlcnMpIHsKICAgIGlmICh0eXBlVmFyaWFibGVCdWlsZGVycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQoCiAgICAgICAgdHlwZVZhcmlhYmxlQnVpbGRlcnMubGVuZ3RoLCBudWxsLAogICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgIGludCBpID0gMDsKICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciBidWlsZGVyIGluIHR5cGVWYXJpYWJsZUJ1aWxkZXJzKSB7CiAgICAgIHR5cGVQYXJhbWV0ZXJzW2krK10gPSBidWlsZGVyLnBhcmFtZXRlcjsKICAgIH0KICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcG9wKCk7CiAgICBwdXNoKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgIGJ1aWxkUHJvYmxlbShtZXNzYWdlLCBzdGF0ZW1lbnQuZmlsZU9mZnNldCwgbm9MZW5ndGgpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwgYm9vbCBzdXBwcmVzc01lc3NhZ2U6IGZhbHNlfSkgewogICAgaWYgKCFzdXBwcmVzc01lc3NhZ2UpIHsKICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsCiAgICAgICAgICB3YXNIYW5kbGVkOiB0cnVlLCBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIFN0cmluZyB0ZXh0ID0gbGlicmFyeUJ1aWxkZXIubG9hZGVyLnRhcmdldC5jb250ZXh0CiAgICAgICAgLmZvcm1hdChtZXNzYWdlLndpdGhMb2NhdGlvbih1cmksIGNoYXJPZmZzZXQsIGxlbmd0aCksIFNldmVyaXR5LmVycm9yKTsKICAgIEludmFsaWRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgSW52YWxpZEV4cHJlc3Npb24odGV4dCkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIHJldHVybiBleHByZXNzaW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwSW5Qcm9ibGVtKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTWVzc2FnZSBtZXNzYWdlLCBpbnQgbGVuZ3RoLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pIHsKICAgIGludCBjaGFyT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0OwogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuZXJyb3IpIHsKICAgICAgcmV0dXJuIHdyYXBJbkxvY2F0ZWRQcm9ibGVtKAogICAgICAgICAgZXhwcmVzc2lvbiwgbWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpLAogICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgY29udGV4dDogY29udGV4dCk7CiAgICAgIHJldHVybiBleHByZXNzaW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB3cmFwSW5Mb2NhdGVkUHJvYmxlbShFeHByZXNzaW9uIGV4cHJlc3Npb24sIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBQcm9kdWNlIGV4cGxpY2l0IGVycm9yIGV4cHJlc3Npb24gd3JhcHBpbmcgdGhlIG9yaWdpbmFsLgogICAgLy8gU2VlIFtpc3N1ZSAyOTcxN10oaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI5NzE3KQogICAgaW50IG9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKICAgICAgb2Zmc2V0ID0gbWVzc2FnZS5jaGFyT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIG5ldyBMZXQoCiAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICAgIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCwKICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpLAogICAgICAgICAgICB0eXBlOiBjb25zdCBCb3R0b21UeXBlKCkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgZXhwcmVzc2lvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZEZhbGxUaHJvdWdoRXJyb3IoaW50IGNoYXJPZmZzZXQpIHsKICAgIGFkZFByb2JsZW0oZmFzdGEubWVzc2FnZVN3aXRjaENhc2VGYWxsVGhyb3VnaCwgY2hhck9mZnNldCwgbm9MZW5ndGgpOwoKICAgIC8vIFRPRE8oYWhlKTogVGhlIGZvbGxvd2luZyBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHRoZSBBbmFseXplci4gSXQgc2hvdWxkCiAgICAvLyBiZSBtb3ZlZCB0byBbRm9yZXN0XSBvciBjb25kaXRpb25hbCBvbiBgZm9yZXN0IGlzIEZhbmdvcm5gLgoKICAgIC8vIFRPRE8oYWhlKTogQ29tcHV0ZSBhIExvY2F0ZWRNZXNzYWdlIGFib3ZlIGluc3RlYWQ/CiAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG1lc3NhZ2VzLmdldExvY2F0aW9uRnJvbVVyaSh1cmksIGNoYXJPZmZzZXQpOwoKICAgIHJldHVybiBmb3Jlc3QuY3JlYXRlVGhyb3coCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBidWlsZFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyCiAgICAgICAgICAgICAgICAubG9hZGVyLmNvcmVUeXBlcy5mYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yLAogICAgICAgICAgICBmb3Jlc3QuY3JlYXRlQXJndW1lbnRzKG5vTG9jYXRpb24sIDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgICBmb3Jlc3QuY3JlYXRlU3RyaW5nTGl0ZXJhbCgKICAgICAgICAgICAgICAgICAgY2hhck9mZnNldCwgIiR7bG9jYXRpb24/LmZpbGUgPz8gdXJpfSIpLAogICAgICAgICAgICAgIGZvcmVzdC5jcmVhdGVJbnRMaXRlcmFsKGNoYXJPZmZzZXQsIGxvY2F0aW9uPy5saW5lID8/IDApLAogICAgICAgICAgICBdKSwKICAgICAgICAgICAgY29uc3RuZXNzOiBDb25zdG5lc3MuZXhwbGljaXROZXcsCiAgICAgICAgICAgIGNoYXJPZmZzZXQ6IGNoYXJPZmZzZXQpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBjbGFzc05hbWUsCiAgICAgIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBjbGFzc05hbWUubGVuZ3RoKTsKICAgIC8vIFRPRE8oYWhlKTogVGhlIGZvbGxvd2luZyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gQW5hbHl6ZXIgQVNULgogICAgTWVtYmVyQnVpbGRlciBjb25zdHJ1Y3RvciA9CiAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLmdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoKTsKICAgIEV4cHJlc3Npb24gaW52b2NhdGlvbiA9IGJ1aWxkU3RhdGljSW52b2NhdGlvbigKICAgICAgICBjb25zdHJ1Y3Rvci5tZW1iZXIsCiAgICAgICAgZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cyhjaGFyT2Zmc2V0LAogICAgICAgICAgICA8RXhwcmVzc2lvbj5bZm9yZXN0LmNyZWF0ZVN0cmluZ0xpdGVyYWwoY2hhck9mZnNldCwgY2xhc3NOYW1lKV0pLAogICAgICAgIGNvbnN0bmVzczogQ29uc3RuZXNzLmV4cGxpY2l0TmV3LAogICAgICAgIGNoYXJPZmZzZXQ6IGNoYXJPZmZzZXQpOwogICAgcmV0dXJuIGZvcmVzdC5jcmVhdGVUaHJvdyhjaGFyT2Zmc2V0LCBpbnZvY2F0aW9uKTsKICB9CgogIFN0YXRlbWVudCBidWlsZFByb2JsZW1TdGF0ZW1lbnQoTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsIGludCBsZW5ndGgsIGJvb2wgc3VwcHJlc3NNZXNzYWdlOiBmYWxzZX0pIHsKICAgIGxlbmd0aCA/Pz0gbm9MZW5ndGg7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LCBzdXBwcmVzc01lc3NhZ2U6IHN1cHByZXNzTWVzc2FnZSkpOwogIH0KCiAgU3RhdGVtZW50IHdyYXBJblByb2JsZW1TdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IFByb2R1Y2UgZXhwbGljaXQgZXJyb3Igc3RhdGVtZW50IHdyYXBwaW5nIHRoZSBvcmlnaW5hbC4KICAgIC8vIFNlZSBbaXNzdWUgMjk3MTddKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTcxNykKICAgIHJldHVybiBidWlsZFByb2JsZW1TdGF0ZW1lbnQobWVzc2FnZSwgc3RhdGVtZW50LmZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW5pdGlhbGl6ZXIgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CiAgICByZXR1cm4gbmV3IFNoYWRvd0ludmFsaWRJbml0aWFsaXplcigKICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShleHByZXNzaW9uKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIEluaXRpYWxpemVyIGJ1aWxkRHVwbGljYXRlZEluaXRpYWxpemVyKEZpZWxkIGZpZWxkLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICBTdHJpbmcgbmFtZSwgaW50IG9mZnNldCwgaW50IHByZXZpb3VzSW5pdGlhbGl6ZXJPZmZzZXQpIHsKICAgIHJldHVybiBuZXcgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIoCiAgICAgICAgZmllbGQsCiAgICAgICAgdmFsdWUsCiAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoYnVpbGRQcm9ibGVtKAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZAogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgLy8vIFBhcmFtZXRlciBbZm9ybWFsVHlwZV0gc2hvdWxkIG9ubHkgYmUgcGFzc2VkIGluIHRoZSBzcGVjaWFsIGNhc2Ugb2YKICAvLy8gYnVpbGRpbmcgYSBmaWVsZCBpbml0aWFsaXplciBhcyBhIGRlc3VnYXJpbmcgb2YgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbAogIC8vLyBwYXJhbWV0ZXIuICBUaGUgc3BlYyBzYXlzIHRoZSBmb2xsb3dpbmc6CiAgLy8vCiAgLy8vICJJZiBhbiBleHBsaWNpdCB0eXBlIGlzIGF0dGFjaGVkIHRvIHRoZSBpbml0aWFsaXppbmcgZm9ybWFsLCB0aGF0IGlzIGl0cwogIC8vLyBzdGF0aWMgdHlwZS4gIE90aGVyd2lzZSwgdGhlIHR5cGUgb2YgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBuYW1lZCBfaWRfIGlzCiAgLy8vIF9UaWRfLCB3aGVyZSBfVGlkXyBpcyB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdmFyaWFibGUgbmFtZWQgX2lkXyBpbiB0aGUKICAvLy8gaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLiAgSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YKICAvLy8gX2lkXyBpcyBub3QgYSBzdWJ0eXBlIG9mIF9UaWRfLiIKICBAb3ZlcnJpZGUKICBMaXN0PEluaXRpYWxpemVyPiBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoU3RyaW5nIG5hbWUsIGludCBmaWVsZE5hbWVPZmZzZXQsCiAgICAgIGludCBhc3NpZ25tZW50T2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbH0pIHsKICAgIEJ1aWxkZXIgYnVpbGRlciA9IGRlY2xhcmF0aW9uQnVpbGRlci5sb29rdXBMb2NhbE1lbWJlcihuYW1lKTsKICAgIGlmIChidWlsZGVyPy5uZXh0ICE9IG51bGwpIHsKICAgICAgLy8gRHVwbGljYXRlZCBuYW1lLCBhbHJlYWR5IHJlcG9ydGVkLgogICAgICByZXR1cm4gPEluaXRpYWxpemVyPlsKICAgICAgICBuZXcgTG9jYWxJbml0aWFsaXplcihuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZShidWlsZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIGZpZWxkTmFtZU9mZnNldCwKICAgICAgICAgICAgbmFtZS5sZW5ndGgpKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpZWxkTmFtZU9mZnNldAogICAgICBdOwogICAgfSBlbHNlIGlmIChidWlsZGVyIGlzIEZpZWxkQnVpbGRlciAmJiBidWlsZGVyLmlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcikgewogICAgICBpbml0aWFsaXplZEZpZWxkcyA/Pz0gPFN0cmluZywgaW50Pnt9OwogICAgICBpZiAoaW5pdGlhbGl6ZWRGaWVsZHMuY29udGFpbnNLZXkobmFtZSkpIHsKICAgICAgICByZXR1cm4gPEluaXRpYWxpemVyPlsKICAgICAgICAgIGJ1aWxkRHVwbGljYXRlZEluaXRpYWxpemVyKGJ1aWxkZXIuZmllbGQsIGV4cHJlc3Npb24sIG5hbWUsCiAgICAgICAgICAgICAgYXNzaWdubWVudE9mZnNldCwgaW5pdGlhbGl6ZWRGaWVsZHNbbmFtZV0pCiAgICAgICAgXTsKICAgICAgfQogICAgICBpbml0aWFsaXplZEZpZWxkc1tuYW1lXSA9IGFzc2lnbm1lbnRPZmZzZXQ7CiAgICAgIGlmIChidWlsZGVyLmlzRmluYWwgJiYgYnVpbGRlci5oYXNJbml0aWFsaXplcikgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgYXNzaWdubWVudE9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBidWlsZGVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgICBNZW1iZXJCdWlsZGVyIGNvbnN0cnVjdG9yID0KICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLmdldER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IoKTsKICAgICAgICBFeHByZXNzaW9uIGludm9jYXRpb24gPSBidWlsZFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgIGNvbnN0cnVjdG9yLm1lbWJlciwKICAgICAgICAgICAgZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cyhhc3NpZ25tZW50T2Zmc2V0LCA8RXhwcmVzc2lvbj5bCiAgICAgICAgICAgICAgZm9yZXN0LmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXNzaWdubWVudE9mZnNldCwgbmFtZSkKICAgICAgICAgICAgXSksCiAgICAgICAgICAgIGNvbnN0bmVzczogQ29uc3RuZXNzLmV4cGxpY2l0TmV3LAogICAgICAgICAgICBjaGFyT2Zmc2V0OiBhc3NpZ25tZW50T2Zmc2V0KTsKICAgICAgICByZXR1cm4gPEluaXRpYWxpemVyPlsKICAgICAgICAgIG5ldyBTaGFkb3dJbnZhbGlkRmllbGRJbml0aWFsaXplcigKICAgICAgICAgICAgICBidWlsZGVyLmZpZWxkLAogICAgICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgICAgICAgICAgIGZvcmVzdC5jcmVhdGVUaHJvdyhhc3NpZ25tZW50T2Zmc2V0LCBpbnZvY2F0aW9uKSkpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGFzc2lnbm1lbnRPZmZzZXQKICAgICAgICBdOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChmb3JtYWwgIT0gbnVsbCAmJiBmb3JtYWwudHlwZSAhPSBudWxsKSB7CiAgICAgICAgICBEYXJ0VHlwZSBmb3JtYWxUeXBlID0gZm9ybWFsLnZhcmlhYmxlLnR5cGU7CiAgICAgICAgICBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihmb3JtYWxUeXBlLCBidWlsZGVyLmZpZWxkVHlwZSwKICAgICAgICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpIHsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICBmb3JtYWxUeXBlLAogICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuZmllbGRUeXBlLAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgYXNzaWdubWVudE9mZnNldCwKICAgICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgICBmYXN0YS5tZXNzYWdlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoRmllbGQud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5maWxlVXJpLCBidWlsZGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkSW5pdGlhbGl6ZXIoYXNzaWdubWVudE9mZnNldCwgZXhwcmVzc2lvbiwKICAgICAgICAgICAgaXNTeW50aGV0aWM6IGZvcm1hbCAhPSBudWxsKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIDxJbml0aWFsaXplcj5bCiAgICAgICAgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIGZhc3RhLnRlbXBsYXRlSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgICAgZmllbGROYW1lT2Zmc2V0LAogICAgICAgICAgICAgICAgbmFtZS5sZW5ndGgpLAogICAgICAgICAgICBmaWVsZE5hbWVPZmZzZXQpCiAgICAgIF07CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplciBidWlsZFN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGJvb2wgaXNTeW50aGV0aWMsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIGlmIChtZW1iZXIuaXNDb25zdCAmJiAhY29uc3RydWN0b3IuaXNDb25zdCkgewogICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aE5vbkNvbnN0U3VwZXIsIGNoYXJPZmZzZXQsCiAgICAgICAgICBjb25zdHJ1Y3Rvci5uYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICAgIG5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CiAgICByZXR1cm4gbmV3IFN1cGVySW5pdGlhbGl6ZXIoY29uc3RydWN0b3IsIGFyZ3VtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAuLmlzU3ludGhldGljID0gaXNTeW50aGV0aWM7CiAgfQoKICBAb3ZlcnJpZGUKICBJbml0aWFsaXplciBidWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pIHsKICAgIGlmIChjbGFzc0J1aWxkZXIuY2hlY2tDb25zdHJ1Y3RvckN5Y2xpYygKICAgICAgICBtZW1iZXIubmFtZSwgY29uc3RydWN0b3IubmFtZS5uYW1lKSkgewogICAgICBpbnQgbGVuZ3RoID0gY29uc3RydWN0b3IubmFtZS5uYW1lLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSBsZW5ndGggPSAidGhpcyIubGVuZ3RoOwogICAgICBhZGRQcm9ibGVtKGZhc3RhLm1lc3NhZ2VDb25zdHJ1Y3RvckN5Y2xpYywgY2hhck9mZnNldCwgbGVuZ3RoKTsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBQcm9kdWNlIGludmFsaWQgaW5pdGlhbGl6ZXIuCiAgICB9CiAgICBuZWVkc0ltcGxpY2l0U3VwZXJJbml0aWFsaXplciA9IGZhbHNlOwogICAgcmV0dXJuIG5ldyBSZWRpcmVjdGluZ0luaXRpYWxpemVyKGNvbnN0cnVjdG9yLCBhcmd1bWVudHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcGVyYXRvciIpOwogICAgcHVzaChuZXcgT3BlcmF0b3IodG9rZW4sIHRva2VuLmNoYXJPZmZzZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3ltYm9sVm9pZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU3ltYm9sVm9pZCIpOwogICAgcHVzaChuZXcgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKHRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGlmIChtZW1iZXIuaXNOYXRpdmUpIHsKICAgICAgcHVzaChOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5KTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2goZm9yZXN0LmNyZWF0ZUJsb2NrKG9mZnNldEZvclRva2VuKHRva2VuKSwgPFN0YXRlbWVudD5bCiAgICAgICAgYnVpbGRQcm9ibGVtU3RhdGVtZW50KAogICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZUV4cGVjdGVkRnVuY3Rpb25Cb2R5LndpdGhBcmd1bWVudHModG9rZW4pLAogICAgICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICBsZW5ndGg6IHRva2VuLmxlbmd0aCkKICAgICAgXSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVW5yZXNvbHZlZFR5cGUgdmFsaWRhdGVUeXBlVXNlKAogICAgICBVbnJlc29sdmVkVHlwZSB1bnJlc29sdmVkLCBib29sIG5vbkluc3RhbmNlQWNjZXNzSXNFcnJvcikgewogICAgVHlwZUJ1aWxkZXIgYnVpbGRlciA9IHVucmVzb2x2ZWQuYnVpbGRlcjsKICAgIGlmIChidWlsZGVyIGlzIE5hbWVkVHlwZUJ1aWxkZXIgJiYgYnVpbGRlci5kZWNsYXJhdGlvbi5pc1R5cGVWYXJpYWJsZSkgewogICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVQYXJhbWV0ZXJCdWlsZGVyID0gYnVpbGRlci5kZWNsYXJhdGlvbjsKICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlckJ1aWxkZXIucGFyYW1ldGVyOwogICAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgICBpZiAoIWlzRGVjbGFyYXRpb25JbnN0YW5jZUNvbnRleHQgJiYgdHlwZVBhcmFtZXRlci5wYXJlbnQgaXMgQ2xhc3MpIHsKICAgICAgICBtZXNzYWdlID0gZmFzdGEubWVzc2FnZVR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIHVucmVzb2x2ZWQuZmlsZVVyaSwKICAgICAgICAgICAgdW5yZXNvbHZlZC5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChjb25zdGFudENvbnRleHQgPT0gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkKSB7CiAgICAgICAgbWVzc2FnZSA9IGZhc3RhLm1lc3NhZ2VUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIHVucmVzb2x2ZWQuZmlsZVVyaSwKICAgICAgICAgICAgdW5yZXNvbHZlZC5jaGFyT2Zmc2V0LAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5yZXNvbHZlZDsKICAgICAgfQogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCk7CiAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZFR5cGUoCiAgICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcigKICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsIGJ1aWxkZXIubnVsbGFiaWxpdHlCdWlsZGVyLCBudWxsKQogICAgICAgICAgICAuLmJpbmQoCiAgICAgICAgICAgICAgICBuZXcgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIodHlwZVBhcmFtZXRlci5uYW1lLCBtZXNzYWdlKSksCiAgICAgICAgICB1bnJlc29sdmVkLmNoYXJPZmZzZXQsCiAgICAgICAgICB1bnJlc29sdmVkLmZpbGVVcmkpOwogICAgfQogICAgcmV0dXJuIHVucmVzb2x2ZWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIGV4cHJlc3Npb247CiAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0KICAgICAgICBuZXcgTGlzdDxFeHByZXNzaW9uPi5mcm9tKGZvcmVzdC5hcmd1bWVudHNQb3NpdGlvbmFsKGFyZ3VtZW50cykpOwogICAgZm9yIChOYW1lZEV4cHJlc3Npb24gbmFtZWQgaW4gZm9yZXN0LmFyZ3VtZW50c05hbWVkKGFyZ3VtZW50cykpIHsKICAgICAgZXhwcmVzc2lvbnMuYWRkKG5hbWVkLnZhbHVlKTsKICAgIH0KICAgIGZvciAoRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBleHByZXNzaW9ucy5yZXZlcnNlZCkgewogICAgICBleHByZXNzaW9uID0gbmV3IExldCgKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGFyZ3VtZW50LAogICAgICAgICAgICAgIGlzRmluYWw6IHRydWUsCiAgICAgICAgICAgICAgdHlwZTogY29yZVR5cGVzLm9iamVjdFJhd1R5cGUobGlicmFyeUJ1aWxkZXIubnVsbGFibGUpKSwKICAgICAgICAgIGV4cHJlc3Npb24pOwogICAgfQogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzSWRlbnRpY2FsKE1lbWJlciBtZW1iZXIpID0+IG1lbWJlciA9PSBjb3JlVHlwZXMuaWRlbnRpY2FsUHJvY2VkdXJlOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc0NvbnN0YW50RXhwcmVzc2lvbjogZmFsc2UsCiAgICAgIGJvb2wgaXNOdWxsQXdhcmU6IGZhbHNlLAogICAgICBib29sIGlzU3VwZXI6IGZhbHNlfSkgewogICAgaWYgKGNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJiAhaXNDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGJ1aWxkUHJvYmxlbSgKICAgICAgICAgIGZhc3RhLnRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoJ01ldGhvZCBpbnZvY2F0aW9uJyksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBuYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICAgIGlmIChpc1N1cGVyKSB7CiAgICAgIC8vIFdlIGNhbiBpZ25vcmUgW2lzTnVsbEF3YXJlXSBvbiBzdXBlciBzZW5kcy4KICAgICAgYXNzZXJ0KGZvcmVzdC5pc1RoaXNFeHByZXNzaW9uKHJlY2VpdmVyKSk7CiAgICAgIE1lbWJlciB0YXJnZXQgPSBsb29rdXBJbnN0YW5jZU1lbWJlcihuYW1lLCBpc1N1cGVyOiB0cnVlKTsKCiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiAhdGFyZ2V0LmlzQWNjZXNzb3IpKSB7CiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICB3YXJuVW5yZXNvbHZlZE1ldGhvZChuYW1lLCBvZmZzZXQsIGlzU3VwZXI6IHRydWUpOwogICAgICAgIH0gZWxzZSBpZiAoIWFyZUFyZ3VtZW50c0NvbXBhdGlibGUodGFyZ2V0LmZ1bmN0aW9uLCBhcmd1bWVudHMpKSB7CiAgICAgICAgICB0YXJnZXQgPSBudWxsOwogICAgICAgICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdCgKICAgICAgICAgICAgICBmYXN0YS50ZW1wbGF0ZVN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSksCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgIG5hbWUubmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbihuYW1lLCBhcmd1bWVudHMsIHRhcmdldCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgICAgfQoKICAgICAgcmVjZWl2ZXIgPSBuZXcgU3VwZXJQcm9wZXJ0eUdldChuYW1lLCB0YXJnZXQpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICByZXR1cm4gZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25JbnZvY2F0aW9uKAogICAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQsIHJlY2VpdmVyLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0KICAgICAgICAgIGZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgIGZvcmVzdC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICBjcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgcmVjZWl2ZXIuZmlsZU9mZnNldCksCiAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICBhcmd1bWVudHMpKQogICAgICAgIC4uZmlsZU9mZnNldCA9IHJlY2VpdmVyLmZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICBNZXRob2RJbnZvY2F0aW9uIG5vZGUgPQogICAgICAgICAgZm9yZXN0LmNyZWF0ZU1ldGhvZEludm9jYXRpb24ob2Zmc2V0LCByZWNlaXZlciwgbmFtZSwgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5fSkgewogICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIHVyaSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0LCBzZXZlcml0eTogc2V2ZXJpdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhc2tlc2MpOiBJbnN0ZWFkIG9mIGRlY2lkaW5nIG9uIHRoZSBzZXZlcml0eSwgdGhpcyBtZXRob2Qgc2hvdWxkCiAgICAvLyB0YWtlIHR3byBtZXNzYWdlczogb25lIHRvIHVzZSB3aGVuIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpcwogICAgLy8gcmVxdWlyZWQgYW5kIG9uZSB0byB1c2Ugb3RoZXJ3aXNlLgogICAgU2V2ZXJpdHkgc2V2ZXJpdHkgPSBtZXNzYWdlLmNvZGUuc2V2ZXJpdHk7CiAgICBpZiAoY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lKSB7CiAgICAgIHNldmVyaXR5ID0gU2V2ZXJpdHkuZXJyb3I7CiAgICB9CiAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLCBjb250ZXh0OiBjb250ZXh0LCBzZXZlcml0eTogc2V2ZXJpdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFByb2JsZW1FcnJvcklmQ29uc3QoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgYWRkUHJvYmxlbUVycm9ySWZDb25zdChtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwgY29udGV4dDogY29udGV4dCk7CiAgICBTdHJpbmcgdGV4dCA9IGxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQuY29udGV4dAogICAgICAgIC5mb3JtYXQobWVzc2FnZS53aXRoTG9jYXRpb24odXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpLCBTZXZlcml0eS5lcnJvcik7CiAgICBJbnZhbGlkRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbmV3IEludmFsaWRFeHByZXNzaW9uKHRleHQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0RHVwbGljYXRlZERlY2xhcmF0aW9uKAogICAgICBCdWlsZGVyIGV4aXN0aW5nLCBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQpIHsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBleGlzdGluZy5pc1N5bnRoZXRpYwogICAgICAgID8gbnVsbAogICAgICAgIDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgZmFzdGEudGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICBdOwogICAgYWRkUHJvYmxlbShmYXN0YS50ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbi53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgIGNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWJ1Z0V2ZW50KFN0cmluZyBuYW1lKSB7CiAgICAvLyBwcmludEV2ZW50KCdCb2R5QnVpbGRlcjogJG5hbWUnKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRpY0dldCBtYWtlU3RhdGljR2V0KE1lbWJlciByZWFkVGFyZ2V0LCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG5ldyBTdGF0aWNHZXQocmVhZFRhcmdldCkuLmZpbGVPZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHdyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUHJlZml4QnVpbGRlciBwcmVmaXgsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNoZWNrID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgZm9yZXN0LmNoZWNrTGlicmFyeUlzTG9hZGVkKGNoYXJPZmZzZXQsIHByZWZpeC5kZXBlbmRlbmN5KSk7CiAgICByZXR1cm4gbmV3IERlZmVycmVkQ2hlY2soY2hlY2ssIGV4cHJlc3Npb24pLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CgogIC8vLyBUT0RPKGFoZSk6IFRoaXMgbWV0aG9kIGlzIHRlbXBvcmFyaWx5IGltcGxlbWVudGVkLiBPbmNlIHR5cGUgcHJvbW90aW9uIGlzCiAgLy8vIGluZGVwZW5kZW50IG9mIHNoYWRvdyBub2RlcywgcmVtb3ZlIHRoaXMgbWV0aG9kLgogIHZvaWQgZW50ZXJUaGVuRm9yVHlwZVByb21vdGlvbihFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgdHlwZVByb21vdGVyPy5lbnRlclRoZW4oY29uZGl0aW9uKTsKICB9CgogIGJvb2wgaXNFcnJvbmVvdXNOb2RlKFRyZWVOb2RlIG5vZGUpIHsKICAgIHJldHVybiBsaWJyYXJ5QnVpbGRlci5sb2FkZXIuaGFuZGxlZEVycm9ycy5pc05vdEVtcHR5ICYmCiAgICAgICAgZm9yZXN0LmlzRXJyb25lb3VzTm9kZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGJ1aWxkRGFydFR5cGUoVW5yZXNvbHZlZFR5cGUgdW5yZXNvbHZlZFR5cGUsCiAgICAgIHtib29sIG5vbkluc3RhbmNlQWNjZXNzSXNFcnJvcjogZmFsc2V9KSB7CiAgICBpZiAodW5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gdmFsaWRhdGVUeXBlVXNlKHVucmVzb2x2ZWRUeXBlLCBub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3IpCiAgICAgICAgLmJ1aWxkZXIKICAgICAgICA/LmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGJ1aWxkRGFydFR5cGVBcmd1bWVudHMoTGlzdDxVbnJlc29sdmVkVHlwZT4gdW5yZXNvbHZlZFR5cGVzKSB7CiAgICBpZiAodW5yZXNvbHZlZFR5cGVzID09IG51bGwpIHJldHVybiA8RGFydFR5cGU+W107CiAgICBMaXN0PERhcnRUeXBlPiB0eXBlcyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh1bnJlc29sdmVkVHlwZXMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHR5cGVzW2ldID0gYnVpbGREYXJ0VHlwZSh1bnJlc29sdmVkVHlwZXNbaV0pOwogICAgfQogICAgcmV0dXJuIHR5cGVzOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzKFN0cmluZyBuYW1lLAogICAgICB7U3RyaW5nIGNsYXNzTmFtZSwgYm9vbCBpc1N1cGVyOiBmYWxzZX0pIHsKICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewogICAgICBDbGFzcyBjbHMgPSBjbGFzc0J1aWxkZXIuY2xzOwogICAgICBpZiAoaXNTdXBlcikgewogICAgICAgIGNscyA9IGNscy5zdXBlcmNsYXNzOwogICAgICAgIHdoaWxlIChjbHMuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICBjbHMgPSBjbHMuc3VwZXJjbGFzczsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xhc3NOYW1lID0gY2xzLm5hbWU7CiAgICB9CiAgICByZXR1cm4gbmFtZS5pc0VtcHR5ID8gY2xhc3NOYW1lIDogIiRjbGFzc05hbWUuJG5hbWUiOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRW5zdXJlTG9hZGVkIHsKICB2b2lkIGVuc3VyZUxvYWRlZChNZW1iZXIgbWVtYmVyKTsKICBib29sIGlzTG9hZGVkKE1lbWJlciBtZW1iZXIpOwp9CgpjbGFzcyBPcGVyYXRvciB7CiAgZmluYWwgVG9rZW4gdG9rZW47CiAgU3RyaW5nIGdldCBuYW1lID0+IHRva2VuLnN0cmluZ1ZhbHVlOwoKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgT3BlcmF0b3IodGhpcy50b2tlbiwgdGhpcy5jaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIm9wZXJhdG9yKCRuYW1lKSI7Cn0KCmNsYXNzIEp1bXBUYXJnZXQgZXh0ZW5kcyBCdWlsZGVySW1wbCB7CiAgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHVzZXJzID0gPFN0YXRlbWVudD5bXTsKCiAgZmluYWwgSnVtcFRhcmdldEtpbmQga2luZDsKCiAgZmluYWwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNZW1iZXJCdWlsZGVyIHBhcmVudDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIEp1bXBUYXJnZXQoCiAgICAgIHRoaXMua2luZCwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCwgdGhpcy5wYXJlbnQsIHRoaXMuY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIFVyaSBnZXQgZmlsZVVyaSA9PiBwYXJlbnQuZmlsZVVyaTsKCiAgYm9vbCBnZXQgaXNCcmVha1RhcmdldCA9PiBraW5kID09IEp1bXBUYXJnZXRLaW5kLkJyZWFrOwoKICBib29sIGdldCBpc0NvbnRpbnVlVGFyZ2V0ID0+IGtpbmQgPT0gSnVtcFRhcmdldEtpbmQuQ29udGludWU7CgogIGJvb2wgZ2V0IGlzR290b1RhcmdldCA9PiBraW5kID09IEp1bXBUYXJnZXRLaW5kLkdvdG87CgogIGJvb2wgZ2V0IGhhc1VzZXJzID0+IHVzZXJzLmlzTm90RW1wdHk7CgogIHZvaWQgYWRkQnJlYWsoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgYXNzZXJ0KGlzQnJlYWtUYXJnZXQpOwogICAgdXNlcnMuYWRkKHN0YXRlbWVudCk7CiAgfQoKICB2b2lkIGFkZENvbnRpbnVlKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGFzc2VydChpc0NvbnRpbnVlVGFyZ2V0KTsKICAgIHVzZXJzLmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRHb3RvKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGFzc2VydChpc0dvdG9UYXJnZXQpOwogICAgdXNlcnMuYWRkKHN0YXRlbWVudCk7CiAgfQoKICB2b2lkIHJlc29sdmVCcmVha3MoCiAgICAgIEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQsIFN0YXRlbWVudCB0YXJnZXRTdGF0ZW1lbnQpIHsKICAgIGFzc2VydChpc0JyZWFrVGFyZ2V0KTsKICAgIGZvciAoQnJlYWtTdGF0ZW1lbnRJbXBsIHVzZXIgaW4gdXNlcnMpIHsKICAgICAgdXNlci50YXJnZXQgPSB0YXJnZXQ7CiAgICAgIHVzZXIudGFyZ2V0U3RhdGVtZW50ID0gdGFyZ2V0U3RhdGVtZW50OwogICAgfQogICAgdXNlcnMuY2xlYXIoKTsKICB9CgogIExpc3Q8QnJlYWtTdGF0ZW1lbnRJbXBsPiByZXNvbHZlQ29udGludWVzKEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIGFzc2VydChpc0NvbnRpbnVlVGFyZ2V0KTsKICAgIExpc3Q8QnJlYWtTdGF0ZW1lbnRJbXBsPiBzdGF0ZW1lbnRzID0gPEJyZWFrU3RhdGVtZW50SW1wbD5bXTsKICAgIGZvciAoQnJlYWtTdGF0ZW1lbnRJbXBsIHVzZXIgaW4gdXNlcnMpIHsKICAgICAgdXNlci50YXJnZXQgPSB0YXJnZXQ7CiAgICAgIHN0YXRlbWVudHMuYWRkKHVzZXIpOwogICAgfQogICAgdXNlcnMuY2xlYXIoKTsKICAgIHJldHVybiBzdGF0ZW1lbnRzOwogIH0KCiAgdm9pZCByZXNvbHZlR290b3MoRm9yZXN0IGZvcmVzdCwgU3dpdGNoQ2FzZSB0YXJnZXQpIHsKICAgIGFzc2VydChpc0dvdG9UYXJnZXQpOwogICAgZm9yIChDb250aW51ZVN3aXRjaFN0YXRlbWVudCB1c2VyIGluIHVzZXJzKSB7CiAgICAgIHVzZXIudGFyZ2V0ID0gdGFyZ2V0OwogICAgfQogICAgdXNlcnMuY2xlYXIoKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gIjxqdW1wLXRhcmdldD4iOwp9CgpjbGFzcyBMYWJlbFRhcmdldCBleHRlbmRzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgSnVtcFRhcmdldCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyQnVpbGRlciBwYXJlbnQ7CgogIGZpbmFsIEp1bXBUYXJnZXQgYnJlYWtUYXJnZXQ7CgogIGZpbmFsIEp1bXBUYXJnZXQgY29udGludWVUYXJnZXQ7CgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIExhYmVsVGFyZ2V0KHRoaXMucGFyZW50LCB0aGlzLmZ1bmN0aW9uTmVzdGluZ0xldmVsLCB0aGlzLmNoYXJPZmZzZXQpCiAgICAgIDogYnJlYWtUYXJnZXQgPSBuZXcgSnVtcFRhcmdldCgKICAgICAgICAgICAgSnVtcFRhcmdldEtpbmQuQnJlYWssIGZ1bmN0aW9uTmVzdGluZ0xldmVsLCBwYXJlbnQsIGNoYXJPZmZzZXQpLAogICAgICAgIGNvbnRpbnVlVGFyZ2V0ID0gbmV3IEp1bXBUYXJnZXQoCiAgICAgICAgICAgIEp1bXBUYXJnZXRLaW5kLkNvbnRpbnVlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwgcGFyZW50LCBjaGFyT2Zmc2V0KTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCBmaWxlVXJpID0+IHBhcmVudC5maWxlVXJpOwoKICBib29sIGdldCBoYXNVc2VycyA9PiBicmVha1RhcmdldC5oYXNVc2VycyB8fCBjb250aW51ZVRhcmdldC5oYXNVc2VyczsKCiAgTGlzdDxTdGF0ZW1lbnQ+IGdldCB1c2VycyA9PiB1bnN1cHBvcnRlZCgidXNlcnMiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgSnVtcFRhcmdldEtpbmQgZ2V0IGtpbmQgPT4gdW5zdXBwb3J0ZWQoImtpbmQiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgYm9vbCBnZXQgaXNCcmVha1RhcmdldCA9PiB0cnVlOwoKICBib29sIGdldCBpc0NvbnRpbnVlVGFyZ2V0ID0+IHRydWU7CgogIGJvb2wgZ2V0IGlzR290b1RhcmdldCA9PiBmYWxzZTsKCiAgdm9pZCBhZGRCcmVhayhTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBicmVha1RhcmdldC5hZGRCcmVhayhzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRDb250aW51ZShTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBjb250aW51ZVRhcmdldC5hZGRDb250aW51ZShzdGF0ZW1lbnQpOwogIH0KCiAgdm9pZCBhZGRHb3RvKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIHVuc3VwcG9ydGVkKCJhZGRHb3RvIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICB2b2lkIHJlc29sdmVCcmVha3MoCiAgICAgIEZvcmVzdCBmb3Jlc3QsIFN0YXRlbWVudCB0YXJnZXQsIFN0YXRlbWVudCB0YXJnZXRTdGF0ZW1lbnQpIHsKICAgIGJyZWFrVGFyZ2V0LnJlc29sdmVCcmVha3MoZm9yZXN0LCB0YXJnZXQsIHRhcmdldFN0YXRlbWVudCk7CiAgfQoKICBMaXN0PEJyZWFrU3RhdGVtZW50SW1wbD4gcmVzb2x2ZUNvbnRpbnVlcyhGb3Jlc3QgZm9yZXN0LCBTdGF0ZW1lbnQgdGFyZ2V0KSB7CiAgICByZXR1cm4gY29udGludWVUYXJnZXQucmVzb2x2ZUNvbnRpbnVlcyhmb3Jlc3QsIHRhcmdldCk7CiAgfQoKICB2b2lkIHJlc29sdmVHb3RvcyhGb3Jlc3QgZm9yZXN0LCBTd2l0Y2hDYXNlIHRhcmdldCkgewogICAgdW5zdXBwb3J0ZWQoInJlc29sdmVHb3RvcyIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiAiPGxhYmVsLXRhcmdldD4iOwp9CgpjbGFzcyBGb3JtYWxQYXJhbWV0ZXJzIHsKICBmaW5hbCBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHBhcmFtZXRlcnM7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgaW50IGxlbmd0aDsKICBmaW5hbCBVcmkgdXJpOwoKICBGb3JtYWxQYXJhbWV0ZXJzKHRoaXMucGFyYW1ldGVycywgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmxlbmd0aCwgdGhpcy51cmkpIHsKICAgIGlmIChwYXJhbWV0ZXJzPy5pc0VtcHR5ID8/IGZhbHNlKSB7CiAgICAgIHRocm93ICJFbXB0eSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBudWxsIjsKICAgIH0KICB9CgogIEZ1bmN0aW9uTm9kZSBidWlsZEZ1bmN0aW9uTm9kZSgKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgVW5yZXNvbHZlZFR5cGUgcmV0dXJuVHlwZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlUGFyYW1ldGVycywKICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciwKICAgICAgU3RhdGVtZW50IGJvZHksCiAgICAgIGludCBmaWxlRW5kT2Zmc2V0KSB7CiAgICBGdW5jdGlvblR5cGUgdHlwZSA9IHRvRnVuY3Rpb25UeXBlKAogICAgICAgICAgICByZXR1cm5UeXBlLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLCB0eXBlUGFyYW1ldGVycykKICAgICAgICAuYnVpbGRlcgogICAgICAgIC5idWlsZChsaWJyYXJ5KTsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICAgIGlmIChwYXJhbWV0ZXIuaXNOYW1lZCkgewogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIudmFyaWFibGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyLnZhcmlhYmxlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbmFtZWRQYXJhbWV0ZXJzLnNvcnQoKFZhcmlhYmxlRGVjbGFyYXRpb24gYSwgVmFyaWFibGVEZWNsYXJhdGlvbiBiKSB7CiAgICAgICAgcmV0dXJuIGEubmFtZS5jb21wYXJlVG8oYi5uYW1lKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTm9kZShib2R5LAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogdHlwZS5yZXR1cm5UeXBlLAogICAgICAgIGFzeW5jTWFya2VyOiBhc3luY01vZGlmaWVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGZpbGVFbmRPZmZzZXQ7CiAgfQoKICBVbnJlc29sdmVkVHlwZSB0b0Z1bmN0aW9uVHlwZSgKICAgICAgVW5yZXNvbHZlZFR5cGUgcmV0dXJuVHlwZSwgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwKICAgICAgW0xpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnNdKSB7CiAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWRUeXBlKAogICAgICAgIG5ldyBGdW5jdGlvblR5cGVCdWlsZGVyKHJldHVyblR5cGU/LmJ1aWxkZXIsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLAogICAgICAgICAgICBudWxsYWJpbGl0eUJ1aWxkZXIpLAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgdXJpKTsKICB9CgogIFNjb3BlIGNvbXB1dGVGb3JtYWxQYXJhbWV0ZXJTY29wZSgKICAgICAgU2NvcGUgcGFyZW50LCBCdWlsZGVyIGRlY2xhcmF0aW9uLCBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlcikgewogICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgcmV0dXJuIHBhcmVudDsKICAgIGFzc2VydChwYXJhbWV0ZXJzLmlzTm90RW1wdHkpOwogICAgTWFwPFN0cmluZywgQnVpbGRlcj4gbG9jYWwgPSA8U3RyaW5nLCBCdWlsZGVyPnt9OwoKICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICBCdWlsZGVyIGV4aXN0aW5nID0gbG9jYWxbcGFyYW1ldGVyLm5hbWVdOwogICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAgIGhlbHBlci5yZXBvcnREdXBsaWNhdGVkRGVjbGFyYXRpb24oCiAgICAgICAgICAgIGV4aXN0aW5nLCBwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLmNoYXJPZmZzZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FsW3BhcmFtZXRlci5uYW1lXSA9IHBhcmFtZXRlcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTY29wZSgKICAgICAgICBsb2NhbDogbG9jYWwsCiAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgZGVidWdOYW1lOiAiZm9ybWFscyIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIkZvcm1hbFBhcmFtZXRlcnMoJHBhcmFtZXRlcnMsICRjaGFyT2Zmc2V0LCAkdXJpKSI7CiAgfQp9CgovLy8gUmV0dXJucyBhIGJsb2NrIGxpa2UgdGhpczoKLy8vCi8vLyAgICAgewovLy8gICAgICAgc3RhdGVtZW50OwovLy8gICAgICAgYm9keTsKLy8vICAgICB9Ci8vLwovLy8gSWYgW2JvZHldIGlzIGEgW0Jsb2NrXSwgaXQncyByZXR1cm5lZCB3aXRoIFtzdGF0ZW1lbnRdIHByZXBlbmRlZCB0byBpdC4KQmxvY2sgY29tYmluZVN0YXRlbWVudHMoU3RhdGVtZW50IHN0YXRlbWVudCwgU3RhdGVtZW50IGJvZHkpIHsKICBpZiAoYm9keSBpcyBCbG9jaykgewogICAgaWYgKHN0YXRlbWVudCBpcyBCbG9jaykgewogICAgICBib2R5LnN0YXRlbWVudHMuaW5zZXJ0QWxsKDAsIHN0YXRlbWVudC5zdGF0ZW1lbnRzKTsKICAgICAgc2V0UGFyZW50cyhzdGF0ZW1lbnQuc3RhdGVtZW50cywgYm9keSk7CiAgICB9IGVsc2UgewogICAgICBib2R5LnN0YXRlbWVudHMuaW5zZXJ0KDAsIHN0YXRlbWVudCk7CiAgICAgIHN0YXRlbWVudC5wYXJlbnQgPSBib2R5OwogICAgfQogICAgcmV0dXJuIGJvZHk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgQmxvY2soPFN0YXRlbWVudD5bc3RhdGVtZW50LCBib2R5XSkKICAgICAgLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQ7CiAgfQp9CgpTdHJpbmcgZGVidWdOYW1lKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBuYW1lLCBbU3RyaW5nIHByZWZpeF0pIHsKICBTdHJpbmcgcmVzdWx0ID0gbmFtZS5pc0VtcHR5ID8gY2xhc3NOYW1lIDogIiRjbGFzc05hbWUuJG5hbWUiOwogIHJldHVybiBwcmVmaXggPT0gbnVsbCA/IHJlc3VsdCA6ICIkcHJlZml4LnJlc3VsdCI7Cn0KCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFRoaXMgaXMgYSBiaXQgYWQgaG9jLiBDYWxsIHNpdGVzIHNob3VsZCBrbm93IHdoYXQga2luZAovLyBvZiBvYmplY3RzIGNhbiBiZSBhbnRpY2lwYXRlZCBhbmQgaGFuZGxlIHRoZXNlIGRpcmVjdGx5LgpTdHJpbmcgZ2V0Tm9kZU5hbWUoT2JqZWN0IG5vZGUpIHsKICBpZiAobm9kZSBpcyBJZGVudGlmaWVyKSB7CiAgICByZXR1cm4gbm9kZS5uYW1lOwogIH0gZWxzZSBpZiAobm9kZSBpcyBCdWlsZGVyKSB7CiAgICByZXR1cm4gbm9kZS5mdWxsTmFtZUZvckVycm9yczsKICB9IGVsc2UgaWYgKG5vZGUgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgcmV0dXJuIGZsYXR0ZW5OYW1lKG5vZGUsIG5vZGUuY2hhck9mZnNldCwgbnVsbCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB1bmhhbmRsZWQoIiR7bm9kZS5ydW50aW1lVHlwZX0iLCAiZ2V0Tm9kZU5hbWUiLCAtMSwgbnVsbCk7CiAgfQp9CgpBc3luY01hcmtlciBhc3luY01hcmtlckZyb21Ub2tlbnMoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgaWYgKGFzeW5jVG9rZW4gPT0gbnVsbCB8fCBpZGVudGljYWwoYXN5bmNUb2tlbi5zdHJpbmdWYWx1ZSwgInN5bmMiKSkgewogICAgaWYgKHN0YXJUb2tlbiA9PSBudWxsKSB7CiAgICAgIHJldHVybiBBc3luY01hcmtlci5TeW5jOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlkZW50aWNhbChzdGFyVG9rZW4uc3RyaW5nVmFsdWUsICIqIikpOwogICAgICByZXR1cm4gQXN5bmNNYXJrZXIuU3luY1N0YXI7CiAgICB9CiAgfSBlbHNlIGlmIChpZGVudGljYWwoYXN5bmNUb2tlbi5zdHJpbmdWYWx1ZSwgImFzeW5jIikpIHsKICAgIGlmIChzdGFyVG9rZW4gPT0gbnVsbCkgewogICAgICByZXR1cm4gQXN5bmNNYXJrZXIuQXN5bmM7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoaWRlbnRpY2FsKHN0YXJUb2tlbi5zdHJpbmdWYWx1ZSwgIioiKSk7CiAgICAgIHJldHVybiBBc3luY01hcmtlci5Bc3luY1N0YXI7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJldHVybiB1bmhhbmRsZWQoYXN5bmNUb2tlbi5sZXhlbWUsICJhc3luY01hcmtlckZyb21Ub2tlbnMiLAogICAgICAgIGFzeW5jVG9rZW4uY2hhck9mZnNldCwgbnVsbCk7CiAgfQp9Cgov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aXRvciB0aGF0IHJldHVybiBhIGNsb25lIG9mIGEgdHJlZSwgbWFpbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBjbG9uZWQKLy8vIG9iamVjdHMuCi8vLwovLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBjbG9uZSBtZW1iZXJzLiBGb3IgdGhhdCwgdXNlIHRoZQovLy8gW0Nsb25lVmlzaXRvcldpdGhNZW1iZXJzXSBhbmQgc2V0dXAgcmVmZXJlbmNlcyBwcm9wZXJseS4KY2xhc3MgQ2xvbmVWaXNpdG9yTm90TWVtYmVycyBpbXBsZW1lbnRzIFRyZWVWaXNpdG9yPFRyZWVOb2RlPiB7CiAgZmluYWwgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcyA9CiAgICAgIDxWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uPnt9OwogIGZpbmFsIE1hcDxMYWJlbGVkU3RhdGVtZW50LCBMYWJlbGVkU3RhdGVtZW50PiBsYWJlbHMgPQogICAgICA8TGFiZWxlZFN0YXRlbWVudCwgTGFiZWxlZFN0YXRlbWVudD57fTsKICBmaW5hbCBNYXA8U3dpdGNoQ2FzZSwgU3dpdGNoQ2FzZT4gc3dpdGNoQ2FzZXMgPSA8U3dpdGNoQ2FzZSwgU3dpdGNoQ2FzZT57fTsKICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHR5cGVTdWJzdGl0dXRpb247CiAgZmluYWwgTWFwPFR5cGVQYXJhbWV0ZXIsIFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbXM7CiAgYm9vbCBjbG9uZUFubm90YXRpb25zOwoKICAvLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xvbmluZyB2aXNpdG9yIGZvciBLZXJuZWwgQVNUcy4KICAvLy8KICAvLy8gVGhlIGJvb2xlYW4gdmFsdWUgb2YgW2Nsb25lQW5ub3RhdGlvbnNdIHRlbGxzIGlmIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUKICAvLy8gb3V0bGluZSBlbGVtZW50cyBpbiB0aGUgc291cmNlIEFTVCBzaG91bGQgYmUgY2xvbmVkIHRvIHRoZSB0YXJnZXQgQVNULiBUaGUKICAvLy8gYW5ub3RhdGlvbnMgaW4gcHJvY2VkdXJlIGJvZGllcyBhcmUgY2xvbmVkIHVuY29uZGl0aW9uYWxseS4KICBDbG9uZVZpc2l0b3JOb3RNZW1iZXJzKAogICAgICB7TWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB0eXBlU3Vic3RpdHV0aW9uLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcywKICAgICAgdGhpcy5jbG9uZUFubm90YXRpb25zID0gdHJ1ZX0pCiAgICAgIDogdGhpcy50eXBlU3Vic3RpdHV0aW9uID0gZW5zdXJlTXV0YWJsZSh0eXBlU3Vic3RpdHV0aW9uKSwKICAgICAgICB0aGlzLnR5cGVQYXJhbXMgPSB0eXBlUGFyYW1zID8/IDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPnt9OwoKICBzdGF0aWMgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBlbnN1cmVNdXRhYmxlKAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IG1hcCkgewogICAgLy8gV2UgbmVlZCB0byBtdXRhdGUgdGhpcyBtYXAsIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgYSBjb25zdGFudCBtYXAuCiAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBUcmVlTm9kZSB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICB0aHJvdyAnQ2xvbmluZyBvZiBsaWJyYXJpZXMgaXMgbm90IGltcGxlbWVudGVkJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0Q2xhc3MoQ2xhc3Mgbm9kZSkgewogICAgdGhyb3cgJ0Nsb25pbmcgb2YgY2xhc3NlcyBpcyBub3QgaW1wbGVtZW50ZWQnOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRFeHRlbnNpb24oRXh0ZW5zaW9uIG5vZGUpIHsKICAgIHRocm93ICdDbG9uaW5nIG9mIGV4dGVuc2lvbnMgaXMgbm90IGltcGxlbWVudGVkJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgdGhyb3cgJ0Nsb25pbmcgb2YgY29uc3RydWN0b3JzIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICB0aHJvdyAnQ2xvbmluZyBvZiBwcm9jZWR1cmVzIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0RmllbGQoRmllbGQgbm9kZSkgewogICAgdGhyb3cgJ0Nsb25pbmcgb2YgZmllbGRzIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlJzsKICB9CgogIFRyZWVOb2RlIHZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHRocm93ICdDbG9uaW5nIG9mIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlJzsKICB9CgogIC8vIFRoZSBjdXJyZW50bHkgYWN0aXZlIGZpbGUgdXJpIHdoZXJlIHdlIGFyZSBjbG9uaW5nIFtUcmVlTm9kZV1zIGZyb20uICBJZgogIC8vIHRoaXMgaXMgc2V0IHRvIGBudWxsYCB3ZSBjYW5ub3QgY2xvbmUgZmlsZSBvZmZzZXRzIHRvIG5ld2x5IGNyZWF0ZWQgbm9kZXMuCiAgLy8gVGhlIFtfY2xvbmVGaWxlT2Zmc2V0XSBoZWxwZXIgZnVuY3Rpb24gd2lsbCBlbnN1cmUgdGhpcy4KICBVcmkgX2FjdGl2ZUZpbGVVcmk7CgogIC8vIElmIHdlIGRvbid0IGtub3cgdGhlIGZpbGUgdXJpIHdlIGFyZSBjbG9uaW5nIGVsZW1lbnRzIGZyb20sIGl0J3Mgbm90IHNhZmUKICAvLyB0byBjbG9uZSBmaWxlIG9mZnNldHMgZWl0aGVyLgogIGludCBfY2xvbmVGaWxlT2Zmc2V0KGludCBmaWxlT2Zmc2V0KSB7CiAgICByZXR1cm4gX2FjdGl2ZUZpbGVVcmkgPT0gbnVsbCA/IFRyZWVOb2RlLm5vT2Zmc2V0IDogZmlsZU9mZnNldDsKICB9CgogIFQgY2xvbmU8VCBleHRlbmRzIFRyZWVOb2RlPihUIG5vZGUpIHsKICAgIGZpbmFsIFVyaSBhY3RpdmVGaWxlVXJpU2F2ZWQgPSBfYWN0aXZlRmlsZVVyaTsKICAgIGlmIChub2RlIGlzIEZpbGVVcmlOb2RlKSBfYWN0aXZlRmlsZVVyaSA9IG5vZGUuZmlsZVVyaSA/PyBfYWN0aXZlRmlsZVVyaTsKICAgIGZpbmFsIFRyZWVOb2RlIHJlc3VsdCA9IG5vZGUuYWNjZXB0KHRoaXMpCiAgICAgIC4uZmlsZU9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KTsKICAgIF9hY3RpdmVGaWxlVXJpID0gYWN0aXZlRmlsZVVyaVNhdmVkOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFRyZWVOb2RlIGNsb25lT3B0aW9uYWwoVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBmaW5hbCBVcmkgYWN0aXZlRmlsZVVyaVNhdmVkID0gX2FjdGl2ZUZpbGVVcmk7CiAgICBpZiAobm9kZSBpcyBGaWxlVXJpTm9kZSkgX2FjdGl2ZUZpbGVVcmkgPSBub2RlLmZpbGVVcmkgPz8gX2FjdGl2ZUZpbGVVcmk7CiAgICBUcmVlTm9kZSByZXN1bHQgPSBub2RlPy5hY2NlcHQodGhpcyk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJlc3VsdC5maWxlT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVPZmZzZXQpOwogICAgX2FjdGl2ZUZpbGVVcmkgPSBhY3RpdmVGaWxlVXJpU2F2ZWQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRGFydFR5cGUgdmlzaXRUeXBlKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiBzdWJzdGl0dXRlKHR5cGUsIHR5cGVTdWJzdGl0dXRpb24pOwogIH0KCiAgQ29uc3RhbnQgdmlzaXRDb25zdGFudChDb25zdGFudCBjb25zdGFudCkgewogICAgcmV0dXJuIGNvbnN0YW50OwogIH0KCiAgRGFydFR5cGUgdmlzaXRPcHRpb25hbFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUgPT0gbnVsbCA/IG51bGwgOiBzdWJzdGl0dXRlKHR5cGUsIHR5cGVTdWJzdGl0dXRpb24pOwogIH0KCiAgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IEludmFsaWRFeHByZXNzaW9uKG5vZGUubWVzc2FnZSk7CiAgfQoKICB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQoCiAgICAgICAgdmFyaWFibGVzW25vZGUudmFyaWFibGVdLCB2aXNpdE9wdGlvbmFsVHlwZShub2RlLnByb21vdGVkVHlwZSkpOwogIH0KCiAgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlU2V0KHZhcmlhYmxlc1tub2RlLnZhcmlhYmxlXSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRQcm9wZXJ0eUdldChQcm9wZXJ0eUdldCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0LmJ5UmVmZXJlbmNlKAogICAgICAgIGNsb25lKG5vZGUucmVjZWl2ZXIpLCBub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZShjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS5uYW1lLAogICAgICAgIGNsb25lKG5vZGUudmFsdWUpLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgRGlyZWN0UHJvcGVydHlHZXQuYnlSZWZlcmVuY2UoCiAgICAgICAgY2xvbmUobm9kZS5yZWNlaXZlciksIG5vZGUudGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBEaXJlY3RQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgICBjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eUdldC5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eVNldC5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLm5hbWUsIGNsb25lKG5vZGUudmFsdWUpLCBub2RlLmludGVyZmFjZVRhcmdldFJlZmVyZW5jZSk7CiAgfQoKICB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdGF0aWNHZXQuYnlSZWZlcmVuY2Uobm9kZS50YXJnZXRSZWZlcmVuY2UpOwogIH0KCiAgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3RhdGljU2V0LmJ5UmVmZXJlbmNlKG5vZGUudGFyZ2V0UmVmZXJlbmNlLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoY2xvbmUobm9kZS5yZWNlaXZlciksIG5vZGUubmFtZSwKICAgICAgICBjbG9uZShub2RlLmFyZ3VtZW50cyksIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgRGlyZWN0TWV0aG9kSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICBjbG9uZShub2RlLnJlY2VpdmVyKSwgbm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUuYXJndW1lbnRzKSk7CiAgfQoKICB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgbm9kZS5uYW1lLCBjbG9uZShub2RlLmFyZ3VtZW50cyksIG5vZGUuaW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlKTsKICB9CgogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpLAogICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgfQoKICB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgICAgbm9kZS50YXJnZXRSZWZlcmVuY2UsIGNsb25lKG5vZGUuYXJndW1lbnRzKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgdmlzaXROb3QoTm90IG5vZGUpIHsKICAgIHJldHVybiBuZXcgTm90KGNsb25lKG5vZGUub3BlcmFuZCkpOwogIH0KCiAgdmlzaXROdWxsQ2hlY2soTnVsbENoZWNrIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTnVsbENoZWNrKGNsb25lKG5vZGUub3BlcmFuZCkpOwogIH0KCiAgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IExvZ2ljYWxFeHByZXNzaW9uKAogICAgICAgIGNsb25lKG5vZGUubGVmdCksIG5vZGUub3BlcmF0b3IsIGNsb25lKG5vZGUucmlnaHQpKTsKICB9CgogIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihjbG9uZShub2RlLmNvbmRpdGlvbiksIGNsb25lKG5vZGUudGhlbiksCiAgICAgICAgY2xvbmUobm9kZS5vdGhlcndpc2UpLCB2aXNpdE9wdGlvbmFsVHlwZShub2RlLnN0YXRpY1R5cGUpKTsKICB9CgogIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbihub2RlLmV4cHJlc3Npb25zLm1hcChjbG9uZSkudG9MaXN0KCkpOwogIH0KCiAgdmlzaXRMaXN0Q29uY2F0ZW5hdGlvbihMaXN0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IExpc3RDb25jYXRlbmF0aW9uKG5vZGUubGlzdHMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICB0eXBlQXJndW1lbnQ6IHZpc2l0VHlwZShub2RlLnR5cGVBcmd1bWVudCkpOwogIH0KCiAgdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBTZXRDb25jYXRlbmF0aW9uKG5vZGUuc2V0cy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVBcmd1bWVudDogdmlzaXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSk7CiAgfQoKICB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IE1hcENvbmNhdGVuYXRpb24obm9kZS5tYXBzLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAga2V5VHlwZTogdmlzaXRUeXBlKG5vZGUua2V5VHlwZSksIHZhbHVlVHlwZTogdmlzaXRUeXBlKG5vZGUudmFsdWVUeXBlKSk7CiAgfQoKICB2aXNpdEluc3RhbmNlQ3JlYXRpb24oSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBNYXA8UmVmZXJlbmNlLCBFeHByZXNzaW9uPiBmaWVsZFZhbHVlcyA9IDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+e307CiAgICBub2RlLmZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICBmaWVsZFZhbHVlc1tmaWVsZFJlZl0gPSBjbG9uZSh2YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiBuZXcgSW5zdGFuY2VDcmVhdGlvbigKICAgICAgICBub2RlLmNsYXNzUmVmZXJlbmNlLAogICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodmlzaXRUeXBlKS50b0xpc3QoKSwKICAgICAgICBmaWVsZFZhbHVlcywKICAgICAgICBub2RlLmFzc2VydHMubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICBub2RlLnVudXNlZEFyZ3VtZW50cy5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0RmlsZVVyaUV4cHJlc3Npb24oRmlsZVVyaUV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBGaWxlVXJpRXhwcmVzc2lvbihjbG9uZShub2RlLmV4cHJlc3Npb24pLCBfYWN0aXZlRmlsZVVyaSk7CiAgfQoKICB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIG5ldyBJc0V4cHJlc3Npb24oY2xvbmUobm9kZS5vcGVyYW5kKSwgdmlzaXRUeXBlKG5vZGUudHlwZSkpCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwogIH0KCiAgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQXNFeHByZXNzaW9uKGNsb25lKG5vZGUub3BlcmFuZCksIHZpc2l0VHlwZShub2RlLnR5cGUpKQogICAgICAuLmZsYWdzID0gbm9kZS5mbGFnczsKICB9CgogIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbChub2RlLnZhbHVlKTsKICB9CgogIHZpc2l0VHlwZUxpdGVyYWwoVHlwZUxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBUeXBlTGl0ZXJhbCh2aXNpdFR5cGUobm9kZS50eXBlKSk7CiAgfQoKICB2aXNpdFRoaXNFeHByZXNzaW9uKFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgVGhpc0V4cHJlc3Npb24oKTsKICB9CgogIHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUpIHsKICAgIHJldHVybiBuZXcgUmV0aHJvdygpOwogIH0KCiAgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSB7CiAgICByZXR1cm4gbmV3IFRocm93KGNsb25lT3B0aW9uYWwobm9kZS5leHByZXNzaW9uKSk7CiAgfQoKICB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTGlzdExpdGVyYWwobm9kZS5leHByZXNzaW9ucy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIHR5cGVBcmd1bWVudDogdmlzaXRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSwgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICB9CgogIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgU2V0TGl0ZXJhbChub2RlLmV4cHJlc3Npb25zLm1hcChjbG9uZSkudG9MaXN0KCksCiAgICAgICAgdHlwZUFyZ3VtZW50OiB2aXNpdFR5cGUobm9kZS50eXBlQXJndW1lbnQpLCBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgdmlzaXRNYXBMaXRlcmFsKE1hcExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG5ldyBNYXBMaXRlcmFsKG5vZGUuZW50cmllcy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIGtleVR5cGU6IHZpc2l0VHlwZShub2RlLmtleVR5cGUpLAogICAgICAgIHZhbHVlVHlwZTogdmlzaXRUeXBlKG5vZGUudmFsdWVUeXBlKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogIH0KCiAgdmlzaXRNYXBFbnRyeShNYXBFbnRyeSBub2RlKSB7CiAgICByZXR1cm4gbmV3IE1hcEVudHJ5KGNsb25lKG5vZGUua2V5KSwgY2xvbmUobm9kZS52YWx1ZSkpOwogIH0KCiAgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQXdhaXRFeHByZXNzaW9uKGNsb25lKG5vZGUub3BlcmFuZCkpOwogIH0KCiAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKGNsb25lKG5vZGUuZnVuY3Rpb24pKTsKICB9CgogIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICB2aXNpdENvbnN0YW50KG5vZGUuY29uc3RhbnQpLCB2aXNpdFR5cGUobm9kZS50eXBlKSk7CiAgfQoKICB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEludExpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gbmV3IERvdWJsZUxpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWwobm9kZS52YWx1ZSk7CiAgfQoKICB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTnVsbExpdGVyYWwoKTsKICB9CgogIHZpc2l0TGV0KExldCBub2RlKSB7CiAgICB2YXIgbmV3VmFyaWFibGUgPSBjbG9uZShub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiBuZXcgTGV0KG5ld1ZhcmlhYmxlLCBjbG9uZShub2RlLmJvZHkpKTsKICB9CgogIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IEJsb2NrRXhwcmVzc2lvbihjbG9uZShub2RlLmJvZHkpLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoY2xvbmUobm9kZS5leHByZXNzaW9uKSk7CiAgfQoKICB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQmxvY2sobm9kZS5zdGF0ZW1lbnRzLm1hcChjbG9uZSkudG9MaXN0KCkpOwogIH0KCiAgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICByZXR1cm4gbmV3IEFzc2VydEJsb2NrKG5vZGUuc3RhdGVtZW50cy5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBFbXB0eVN0YXRlbWVudCgpOwogIH0KCiAgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgQXNzZXJ0U3RhdGVtZW50KGNsb25lKG5vZGUuY29uZGl0aW9uKSwKICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogbm9kZS5jb25kaXRpb25TdGFydE9mZnNldCwKICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IG5vZGUuY29uZGl0aW9uRW5kT2Zmc2V0LAogICAgICAgIG1lc3NhZ2U6IGNsb25lT3B0aW9uYWwobm9kZS5tZXNzYWdlKSk7CiAgfQoKICB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CiAgICBMYWJlbGVkU3RhdGVtZW50IG5ld05vZGUgPSBuZXcgTGFiZWxlZFN0YXRlbWVudChudWxsKTsKICAgIGxhYmVsc1tub2RlXSA9IG5ld05vZGU7CiAgICBuZXdOb2RlLmJvZHkgPSBjbG9uZShub2RlLmJvZHkpLi5wYXJlbnQgPSBuZXdOb2RlOwogICAgcmV0dXJuIG5ld05vZGU7CiAgfQoKICB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgQnJlYWtTdGF0ZW1lbnQobGFiZWxzW25vZGUudGFyZ2V0XSk7CiAgfQoKICB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgV2hpbGVTdGF0ZW1lbnQoY2xvbmUobm9kZS5jb25kaXRpb24pLCBjbG9uZShub2RlLmJvZHkpKTsKICB9CgogIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBEb1N0YXRlbWVudChjbG9uZShub2RlLmJvZHkpLCBjbG9uZShub2RlLmNvbmRpdGlvbikpOwogIH0KCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHZhciB2YXJpYWJsZXMgPSBub2RlLnZhcmlhYmxlcy5tYXAoY2xvbmUpLnRvTGlzdCgpOwogICAgcmV0dXJuIG5ldyBGb3JTdGF0ZW1lbnQodmFyaWFibGVzLCBjbG9uZU9wdGlvbmFsKG5vZGUuY29uZGl0aW9uKSwKICAgICAgICBub2RlLnVwZGF0ZXMubWFwKGNsb25lKS50b0xpc3QoKSwgY2xvbmUobm9kZS5ib2R5KSk7CiAgfQoKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHZhciBuZXdWYXJpYWJsZSA9IGNsb25lKG5vZGUudmFyaWFibGUpOwogICAgcmV0dXJuIG5ldyBGb3JJblN0YXRlbWVudCgKICAgICAgICBuZXdWYXJpYWJsZSwgY2xvbmUobm9kZS5pdGVyYWJsZSksIGNsb25lKG5vZGUuYm9keSksCiAgICAgICAgaXNBc3luYzogbm9kZS5pc0FzeW5jKQogICAgICAuLmJvZHlPZmZzZXQgPSBub2RlLmJvZHlPZmZzZXQ7CiAgfQoKICB2aXNpdFN3aXRjaFN0YXRlbWVudChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewogICAgZm9yIChTd2l0Y2hDYXNlIHN3aXRjaENhc2UgaW4gbm9kZS5jYXNlcykgewogICAgICBzd2l0Y2hDYXNlc1tzd2l0Y2hDYXNlXSA9IG5ldyBTd2l0Y2hDYXNlKAogICAgICAgICAgc3dpdGNoQ2FzZS5leHByZXNzaW9ucy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgICAgbmV3IExpc3Q8aW50Pi5mcm9tKHN3aXRjaENhc2UuZXhwcmVzc2lvbk9mZnNldHMpLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIGlzRGVmYXVsdDogc3dpdGNoQ2FzZS5pc0RlZmF1bHQpOwogICAgfQogICAgcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQoCiAgICAgICAgY2xvbmUobm9kZS5leHByZXNzaW9uKSwgbm9kZS5jYXNlcy5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0U3dpdGNoQ2FzZShTd2l0Y2hDYXNlIG5vZGUpIHsKICAgIHZhciBzd2l0Y2hDYXNlID0gc3dpdGNoQ2FzZXNbbm9kZV07CiAgICBzd2l0Y2hDYXNlLmJvZHkgPSBjbG9uZShub2RlLmJvZHkpLi5wYXJlbnQgPSBzd2l0Y2hDYXNlOwogICAgcmV0dXJuIHN3aXRjaENhc2U7CiAgfQoKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQoc3dpdGNoQ2FzZXNbbm9kZS50YXJnZXRdKTsKICB9CgogIHZpc2l0SWZTdGF0ZW1lbnQoSWZTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIG5ldyBJZlN0YXRlbWVudCgKICAgICAgICBjbG9uZShub2RlLmNvbmRpdGlvbiksIGNsb25lKG5vZGUudGhlbiksIGNsb25lT3B0aW9uYWwobm9kZS5vdGhlcndpc2UpKTsKICB9CgogIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudChjbG9uZU9wdGlvbmFsKG5vZGUuZXhwcmVzc2lvbikpOwogIH0KCiAgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFRyeUNhdGNoKGNsb25lKG5vZGUuYm9keSksIG5vZGUuY2F0Y2hlcy5tYXAoY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIGlzU3ludGhldGljOiBub2RlLmlzU3ludGhldGljKTsKICB9CgogIHZpc2l0Q2F0Y2goQ2F0Y2ggbm9kZSkgewogICAgdmFyIG5ld0V4Y2VwdGlvbiA9IGNsb25lT3B0aW9uYWwobm9kZS5leGNlcHRpb24pOwogICAgdmFyIG5ld1N0YWNrVHJhY2UgPSBjbG9uZU9wdGlvbmFsKG5vZGUuc3RhY2tUcmFjZSk7CiAgICByZXR1cm4gbmV3IENhdGNoKG5ld0V4Y2VwdGlvbiwgY2xvbmUobm9kZS5ib2R5KSwKICAgICAgICBzdGFja1RyYWNlOiBuZXdTdGFja1RyYWNlLCBndWFyZDogdmlzaXRUeXBlKG5vZGUuZ3VhcmQpKTsKICB9CgogIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpIHsKICAgIHJldHVybiBuZXcgVHJ5RmluYWxseShjbG9uZShub2RlLmJvZHkpLCBjbG9uZShub2RlLmZpbmFsaXplcikpOwogIH0KCiAgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gbmV3IFlpZWxkU3RhdGVtZW50KGNsb25lKG5vZGUuZXhwcmVzc2lvbikpLi5mbGFncyA9IG5vZGUuZmxhZ3M7CiAgfQoKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gdmFyaWFibGVzW25vZGVdID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obm9kZS5uYW1lLAogICAgICAgIGluaXRpYWxpemVyOiBjbG9uZU9wdGlvbmFsKG5vZGUuaW5pdGlhbGl6ZXIpLAogICAgICAgIHR5cGU6IHZpc2l0VHlwZShub2RlLnR5cGUpKQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLmZsYWdzID0gbm9kZS5mbGFncwogICAgICAuLmZpbGVFcXVhbHNPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZUVxdWFsc09mZnNldCk7CiAgfQoKICB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICB2YXIgbmV3VmFyaWFibGUgPSBjbG9uZShub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbihuZXdWYXJpYWJsZSwgY2xvbmUobm9kZS5mdW5jdGlvbikpOwogIH0KCiAgdm9pZCBwcmVwYXJlVHlwZVBhcmFtZXRlcnMoTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewogICAgZm9yIChUeXBlUGFyYW1ldGVyIG5vZGUgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgVHlwZVBhcmFtZXRlciBuZXdOb2RlID0gdHlwZVBhcmFtc1tub2RlXTsKICAgICAgaWYgKG5ld05vZGUgPT0gbnVsbCkgewogICAgICAgIG5ld05vZGUgPSBuZXcgVHlwZVBhcmFtZXRlcihub2RlLm5hbWUpOwogICAgICAgIHR5cGVQYXJhbXNbbm9kZV0gPSBuZXdOb2RlOwogICAgICAgIHR5cGVTdWJzdGl0dXRpb25bbm9kZV0gPQogICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUuZm9yQWxwaGFSZW5hbWluZyhub2RlLCBuZXdOb2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgdmlzaXRUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgVHlwZVBhcmFtZXRlciBuZXdOb2RlID0gdHlwZVBhcmFtc1tub2RlXTsKICAgIG5ld05vZGUuYm91bmQgPSB2aXNpdFR5cGUobm9kZS5ib3VuZCk7CiAgICBpZiAobm9kZS5kZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgIG5ld05vZGUuZGVmYXVsdFR5cGUgPSB2aXNpdFR5cGUobm9kZS5kZWZhdWx0VHlwZSk7CiAgICB9CiAgICByZXR1cm4gbmV3Tm9kZQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKGNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLmZsYWdzID0gbm9kZS5mbGFnczsKICB9CgogIFRyZWVOb2RlIGNsb25lRnVuY3Rpb25Ob2RlQm9keShGdW5jdGlvbk5vZGUgbm9kZSkgewogICAgYm9vbCBzYXZlZENsb25lQW5ub3RhdGlvbnMgPSB0aGlzLmNsb25lQW5ub3RhdGlvbnM7CiAgICB0cnkgewogICAgICB0aGlzLmNsb25lQW5ub3RhdGlvbnMgPSB0cnVlOwogICAgICByZXR1cm4gY2xvbmVPcHRpb25hbChub2RlLmJvZHkpOwogICAgfSBmaW5hbGx5IHsKICAgICAgdGhpcy5jbG9uZUFubm90YXRpb25zID0gc2F2ZWRDbG9uZUFubm90YXRpb25zOwogICAgfQogIH0KCiAgdmlzaXRGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIHByZXBhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IG5vZGUudHlwZVBhcmFtZXRlcnMubWFwKGNsb25lKS50b0xpc3QoKTsKICAgIHZhciBwb3NpdGlvbmFsID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5tYXAoY2xvbmUpLnRvTGlzdCgpOwogICAgdmFyIG5hbWVkID0gbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKGNsb25lKS50b0xpc3QoKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25Ob2RlKGNsb25lRnVuY3Rpb25Ob2RlQm9keShub2RlKSwKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWwsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogdmlzaXRUeXBlKG5vZGUucmV0dXJuVHlwZSksCiAgICAgICAgYXN5bmNNYXJrZXI6IG5vZGUuYXN5bmNNYXJrZXIsCiAgICAgICAgZGFydEFzeW5jTWFya2VyOiBub2RlLmRhcnRBc3luY01hcmtlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVPZmZzZXQpCiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlRW5kT2Zmc2V0KTsKICB9CgogIHZpc2l0QXJndW1lbnRzKEFyZ3VtZW50cyBub2RlKSB7CiAgICByZXR1cm4gbmV3IEFyZ3VtZW50cyhub2RlLnBvc2l0aW9uYWwubWFwKGNsb25lKS50b0xpc3QoKSwKICAgICAgICB0eXBlczogbm9kZS50eXBlcy5tYXAodmlzaXRUeXBlKS50b0xpc3QoKSwKICAgICAgICBuYW1lZDogbm9kZS5uYW1lZC5tYXAoY2xvbmUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0TmFtZWRFeHByZXNzaW9uKE5hbWVkRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkRXhwcmVzc2lvbihub2RlLm5hbWUsIGNsb25lKG5vZGUudmFsdWUpKTsKICB9CgogIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0RXhwcmVzc2lvbihub2RlKTsKICB9CgogIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgdGhyb3cgJ1VuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBleHByZXNzaW9uOiAkbm9kZSc7CiAgfQoKICBkZWZhdWx0SW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdGhyb3cgJ1VuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBpbml0aWFsaXplcjogJG5vZGUnOwogIH0KCiAgZGVmYXVsdE1lbWJlcihNZW1iZXIgbm9kZSkgewogICAgdGhyb3cgJ1VuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBtZW1iZXI6ICRub2RlJzsKICB9CgogIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpIHsKICAgIHRocm93ICdVbmltcGxlbWVudGVkIGNsb25lIGZvciBLZXJuZWwgc3RhdGVtZW50OiAkbm9kZSc7CiAgfQoKICBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgdGhyb3cgJ0Nsb25pbmcgS2VybmVsIG5vbi1tZW1iZXJzIGlzIG5vdCBzdXBwb3J0ZWQuICAnCiAgICAgICAgJ1RyaWVkIGNsb25pbmcgJG5vZGUnOwogIH0KCiAgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbmV3IEFzc2VydEluaXRpYWxpemVyKGNsb25lKG5vZGUuc3RhdGVtZW50KSk7CiAgfQoKICB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHJldHVybiBuZXcgQ2hlY2tMaWJyYXJ5SXNMb2FkZWQobm9kZS5pbXBvcnQpOwogIH0KCiAgdmlzaXRDb21iaW5hdG9yKENvbWJpbmF0b3Igbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICB9CgogIHZpc2l0RmllbGRJbml0aWFsaXplcihGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBuZXcgRmllbGRJbml0aWFsaXplci5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLmZpZWxkUmVmZXJlbmNlLCBjbG9uZShub2RlLnZhbHVlKSk7CiAgfQoKICB2aXNpdEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gbmV3IEluc3RhbnRpYXRpb24oCiAgICAgICAgY2xvbmUobm9kZS5leHByZXNzaW9uKSwgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh2aXNpdFR5cGUpLnRvTGlzdCgpKTsKICB9CgogIHZpc2l0SW52YWxpZEluaXRpYWxpemVyKEludmFsaWRJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbmV3IEludmFsaWRJbml0aWFsaXplcigpOwogIH0KCiAgdmlzaXRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgdmlzaXRMaWJyYXJ5UGFydChMaWJyYXJ5UGFydCBub2RlKSB7CiAgICByZXR1cm4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlKSB7CiAgICByZXR1cm4gbmV3IExvYWRMaWJyYXJ5KG5vZGUuaW1wb3J0KTsKICB9CgogIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBuZXcgTG9jYWxJbml0aWFsaXplcihjbG9uZShub2RlLnZhcmlhYmxlKSk7CiAgfQoKICB2aXNpdENvbXBvbmVudChDb21wb25lbnQgbm9kZSkgewogICAgcmV0dXJuIGRlZmF1bHRUcmVlTm9kZShub2RlKTsKICB9CgogIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcihSZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBuZXcgUmVkaXJlY3RpbmdJbml0aWFsaXplci5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpKTsKICB9CgogIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIHJldHVybiBuZXcgU3VwZXJJbml0aWFsaXplci5ieVJlZmVyZW5jZSgKICAgICAgICBub2RlLnRhcmdldFJlZmVyZW5jZSwgY2xvbmUobm9kZS5hcmd1bWVudHMpKTsKICB9CgogIHZpc2l0VHlwZWRlZihUeXBlZGVmIG5vZGUpIHsKICAgIHJldHVybiBkZWZhdWx0VHJlZU5vZGUobm9kZSk7CiAgfQp9CgovLy8gVmlzaXRvciB0aGF0IHJldHVybiBhIGNsb25lIG9mIGEgdHJlZSwgbWFpbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBjbG9uZWQKLy8vIG9iamVjdHMuCi8vLwovLy8gSXQgaXMgc2FmZSB0byBjbG9uZSBtZW1iZXJzLCBidXQgY2xvbmluZyBhIGNsYXNzIG9yIGxpYnJhcnkgaXMgbm90Ci8vLyBzdXBwb3J0ZWQuCmNsYXNzIENsb25lVmlzaXRvcldpdGhNZW1iZXJzIGV4dGVuZHMgQ2xvbmVWaXNpdG9yTm90TWVtYmVycyB7CiAgQ2xvbmVWaXNpdG9yV2l0aE1lbWJlcnMoCiAgICAgIHtNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHR5cGVTdWJzdGl0dXRpb24sCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1zLAogICAgICBib29sIGNsb25lQW5ub3RhdGlvbnMgPSB0cnVlfSkKICAgICAgOiBzdXBlcigKICAgICAgICAgICAgdHlwZVN1YnN0aXR1dGlvbjogdHlwZVN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgdHlwZVBhcmFtczogdHlwZVBhcmFtcywKICAgICAgICAgICAgY2xvbmVBbm5vdGF0aW9uczogY2xvbmVBbm5vdGF0aW9ucyk7CgogIEBEZXByZWNhdGVkKCJXaGVuIGNsb25pbmcgd2l0aCBtZW1iZXJzIG9uZSBzaG91bGQgdXNlIHRoZSBzcGVjaWZpYyBjbG9uZVgiKQogIFQgY2xvbmU8VCBleHRlbmRzIFRyZWVOb2RlPihUIG5vZGUpIHsKICAgIHJldHVybiBzdXBlci5jbG9uZShub2RlKTsKICB9CgogIENvbnN0cnVjdG9yIGNsb25lQ29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSwgQ29uc3RydWN0b3IgcmVmZXJlbmNlRnJvbSkgewogICAgZmluYWwgVXJpIGFjdGl2ZUZpbGVVcmlTYXZlZCA9IF9hY3RpdmVGaWxlVXJpOwogICAgX2FjdGl2ZUZpbGVVcmkgPSBub2RlLmZpbGVVcmkgPz8gX2FjdGl2ZUZpbGVVcmk7CgogICAgQ29uc3RydWN0b3IgcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yKHN1cGVyLmNsb25lKG5vZGUuZnVuY3Rpb24pLAogICAgICAgIG5hbWU6IG5vZGUubmFtZSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsCiAgICAgICAgaXNFeHRlcm5hbDogbm9kZS5pc0V4dGVybmFsLAogICAgICAgIGlzU3ludGhldGljOiBub2RlLmlzU3ludGhldGljLAogICAgICAgIGluaXRpYWxpemVyczogbm9kZS5pbml0aWFsaXplcnMubWFwKHN1cGVyLmNsb25lKS50b0xpc3QoKSwKICAgICAgICB0cmFuc2Zvcm1lckZsYWdzOiBub2RlLnRyYW5zZm9ybWVyRmxhZ3MsCiAgICAgICAgZmlsZVVyaTogX2FjdGl2ZUZpbGVVcmksCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgIC4uYW5ub3RhdGlvbnMgPSBjbG9uZUFubm90YXRpb25zICYmICFub2RlLmFubm90YXRpb25zLmlzRW1wdHkKICAgICAgICAgID8gbm9kZS5hbm5vdGF0aW9ucy5tYXAoc3VwZXIuY2xvbmUpLnRvTGlzdCgpCiAgICAgICAgICA6IGNvbnN0IDxFeHByZXNzaW9uPltdCiAgICAgIC4uZmlsZU9mZnNldCA9IF9jbG9uZUZpbGVPZmZzZXQobm9kZS5maWxlT2Zmc2V0KQogICAgICAuLmZpbGVFbmRPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZUVuZE9mZnNldCk7CgogICAgX2FjdGl2ZUZpbGVVcmkgPSBhY3RpdmVGaWxlVXJpU2F2ZWQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgY2xvbmVQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUsIFByb2NlZHVyZSByZWZlcmVuY2VGcm9tKSB7CiAgICBmaW5hbCBVcmkgYWN0aXZlRmlsZVVyaVNhdmVkID0gX2FjdGl2ZUZpbGVVcmk7CiAgICBfYWN0aXZlRmlsZVVyaSA9IG5vZGUuZmlsZVVyaSA/PyBfYWN0aXZlRmlsZVVyaTsKCiAgICBQcm9jZWR1cmUgcmVzdWx0ID0gbmV3IFByb2NlZHVyZSgKICAgICAgICBub2RlLm5hbWUsIG5vZGUua2luZCwgc3VwZXIuY2xvbmUobm9kZS5mdW5jdGlvbiksCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UsCiAgICAgICAgdHJhbnNmb3JtZXJGbGFnczogbm9kZS50cmFuc2Zvcm1lckZsYWdzLAogICAgICAgIGZpbGVVcmk6IF9hY3RpdmVGaWxlVXJpLAogICAgICAgIGZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQ6IG5vZGUuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldCwKICAgICAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldDogbm9kZS5mb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldCkKICAgICAgLi5hbm5vdGF0aW9ucyA9IGNsb25lQW5ub3RhdGlvbnMgJiYgIW5vZGUuYW5ub3RhdGlvbnMuaXNFbXB0eQogICAgICAgICAgPyBub2RlLmFubm90YXRpb25zLm1hcChzdXBlci5jbG9uZSkudG9MaXN0KCkKICAgICAgICAgIDogY29uc3QgPEV4cHJlc3Npb24+W10KICAgICAgLi5zdGFydEZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuc3RhcnRGaWxlT2Zmc2V0KQogICAgICAuLmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCkKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwoKICAgIF9hY3RpdmVGaWxlVXJpID0gYWN0aXZlRmlsZVVyaVNhdmVkOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGNsb25lRmllbGQoRmllbGQgbm9kZSwgRmllbGQgcmVmZXJlbmNlRnJvbSkgewogICAgZmluYWwgVXJpIGFjdGl2ZUZpbGVVcmlTYXZlZCA9IF9hY3RpdmVGaWxlVXJpOwogICAgX2FjdGl2ZUZpbGVVcmkgPSBub2RlLmZpbGVVcmkgPz8gX2FjdGl2ZUZpbGVVcmk7CgogICAgRmllbGQgcmVzdWx0ID0gbmV3IEZpZWxkKG5vZGUubmFtZSwKICAgICAgICB0eXBlOiB2aXNpdFR5cGUobm9kZS50eXBlKSwKICAgICAgICBpbml0aWFsaXplcjogY2xvbmVPcHRpb25hbChub2RlLmluaXRpYWxpemVyKSwKICAgICAgICBpc0NvdmFyaWFudDogbm9kZS5pc0NvdmFyaWFudCwKICAgICAgICBpc0ZpbmFsOiBub2RlLmlzRmluYWwsCiAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0LAogICAgICAgIGlzU3RhdGljOiBub2RlLmlzU3RhdGljLAogICAgICAgIGlzTGF0ZTogbm9kZS5pc0xhdGUsCiAgICAgICAgaGFzSW1wbGljaXRHZXR0ZXI6IG5vZGUuaGFzSW1wbGljaXRHZXR0ZXIsCiAgICAgICAgaGFzSW1wbGljaXRTZXR0ZXI6IG5vZGUuaGFzSW1wbGljaXRTZXR0ZXIsCiAgICAgICAgdHJhbnNmb3JtZXJGbGFnczogbm9kZS50cmFuc2Zvcm1lckZsYWdzLAogICAgICAgIGZpbGVVcmk6IF9hY3RpdmVGaWxlVXJpLAogICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlRnJvbT8ucmVmZXJlbmNlKQogICAgICAuLmFubm90YXRpb25zID0gY2xvbmVBbm5vdGF0aW9ucyAmJiAhbm9kZS5hbm5vdGF0aW9ucy5pc0VtcHR5CiAgICAgICAgICA/IG5vZGUuYW5ub3RhdGlvbnMubWFwKHN1cGVyLmNsb25lKS50b0xpc3QoKQogICAgICAgICAgOiBjb25zdCA8RXhwcmVzc2lvbj5bXQogICAgICAuLmZpbGVPZmZzZXQgPSBfY2xvbmVGaWxlT2Zmc2V0KG5vZGUuZmlsZU9mZnNldCkKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gX2Nsb25lRmlsZU9mZnNldChub2RlLmZpbGVFbmRPZmZzZXQpCiAgICAgIC4uZmxhZ3MgPSBub2RlLmZsYWdzOwoKICAgIF9hY3RpdmVGaWxlVXJpID0gYWN0aXZlRmlsZVVyaVNhdmVkOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGNsb25lUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IoUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSwKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVmZXJlbmNlRnJvbSkgewogICAgZmluYWwgVXJpIGFjdGl2ZUZpbGVVcmlTYXZlZCA9IF9hY3RpdmVGaWxlVXJpOwogICAgX2FjdGl2ZUZpbGVVcmkgPSBub2RlLmZpbGVVcmkgPz8gX2FjdGl2ZUZpbGVVcmk7CgogICAgcHJlcGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVzdWx0ID0gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yKAogICAgICAgIG5vZGUudGFyZ2V0UmVmZXJlbmNlLAogICAgICAgIG5hbWU6IG5vZGUubmFtZSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QsCiAgICAgICAgaXNFeHRlcm5hbDogbm9kZS5pc0V4dGVybmFsLAogICAgICAgIHRyYW5zZm9ybWVyRmxhZ3M6IG5vZGUudHJhbnNmb3JtZXJGbGFncywKICAgICAgICB0eXBlQXJndW1lbnRzOiBub2RlLnR5cGVBcmd1bWVudHMubWFwKHZpc2l0VHlwZSkudG9MaXN0KCksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IG5vZGUudHlwZVBhcmFtZXRlcnMubWFwKHN1cGVyLmNsb25lKS50b0xpc3QoKSwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczoKICAgICAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5tYXAoc3VwZXIuY2xvbmUpLnRvTGlzdCgpLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbm9kZS5uYW1lZFBhcmFtZXRlcnMubWFwKHN1cGVyLmNsb25lKS50b0xpc3QoKSwKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgZmlsZVVyaTogX2FjdGl2ZUZpbGVVcmksCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgIC4uYW5ub3RhdGlvbnMgPSBjbG9uZUFubm90YXRpb25zICYmICFub2RlLmFubm90YXRpb25zLmlzRW1wdHkKICAgICAgICAgID8gbm9kZS5hbm5vdGF0aW9ucy5tYXAoc3VwZXIuY2xvbmUpLnRvTGlzdCgpCiAgICAgICAgICA6IGNvbnN0IDxFeHByZXNzaW9uPltdOwoKICAgIF9hY3RpdmVGaWxlVXJpID0gYWN0aXZlRmlsZVVyaVNhdmVkOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmNsYXNzIENsb25lUHJvY2VkdXJlV2l0aG91dEJvZHkgZXh0ZW5kcyBDbG9uZVZpc2l0b3JXaXRoTWVtYmVycyB7CiAgQ2xvbmVQcm9jZWR1cmVXaXRob3V0Qm9keSgKICAgICAge01hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdHlwZVN1YnN0aXR1dGlvbiwKICAgICAgYm9vbCBjbG9uZUFubm90YXRpb25zID0gdHJ1ZX0pCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIHR5cGVTdWJzdGl0dXRpb246IHR5cGVTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIGNsb25lQW5ub3RhdGlvbnM6IGNsb25lQW5ub3RhdGlvbnMpOwoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSBjbG9uZUZ1bmN0aW9uTm9kZUJvZHkoRnVuY3Rpb25Ob2RlIG5vZGUpID0+IG51bGw7Cn0Kgu0ATk48FgEiARMcAUwNBDk9QEI0OS5ONzYZAUIGTlFCGjY0JUFKATUqTSYqBhAEASg1BAEkMwQBLDYEATA9BAEsOwQBJDcEAS8sUQQBTlA+FgFPIylEBAEoM04uOCkTBAEqIzNOKk8pEwQBJi8EAS4VBAEuRQQBMzAEASccSQQBJ0kEAScoSQQBJ0g7BAEzLjUEATMuSAQBMS0zBAExLUYEASM8BAEjTwQBMU0/BAE9M0wEATsySgQBMS01IAQBOzI1IAQBFykEASMvBAEzIj0EATtORAQBN0oEATNBNQQBMT81BAExP1EEATFORiwIIR00FSozBAEzSgQBKUccBAEpRxwEASsqBAEnMgQBLSEEAR8aBAEbNgQBJ0FMBAElQEwEASU8Ki4gBAEhPQQBLzUEATU5BAE1Iz0EASsqBAElJwQBKyoEAScoBAEnHgQBFywzBAEvRQQBNzwEARs7BAEnQQQBLSEEAS82OTUvBAExOxw3FAQBLTQEAS1IBAEnRQQBKThGPQQBLSwfPR8mBAEvMDA2PBAsBiBBBAElKD0XBAE/QgQBJxxRBAEvQAQBIUwoBAEbNjg1QgQBJUQEAS1LBAE3QDYkRDEhG0QEATcsRwQBQzEwHTAkIUMIBgQBKy4rJDkGE0QxIRwEATY4CiQnEDUGBAEpMEJEOjkoKiA9MCcvNz4EASM+MzAEAS8+BAErJAQBJz4EASk/BAEfOgQBJT0EASM7HwQBMzkEATkyBAElIgQBMS0xBAErHk0EATUlBAEzIgQBJyIEAScpBAExNwQBIyIEAT0zNgQBMS02BAEfIgQCAUwNBEcPPxs2NCUPMCQxAU4oHgQBTjM1AUUZHyUnQzEhLUQ3ITc+ASkTBAE8MzUBJjotMSFDS0Q3IUE3PRwBKRMEATAzNQEoJDYnHx8hHTMzMSEtRDchNz0cASkTBAFJNTM1ATBOHhkfJTFDRx5BST0hLUQ3IgEpEwQCAUIdNiUPMDEBDD0CARlwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0YGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy91dGlsL3JlbGF0aXZpemUuZGFydIkyLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC51dGlsLnJlbGF0aXZpemU7CgppbXBvcnQgJ2RhcnQ6bWF0aCc7CgovLy8gRGV0ZWN0IGlmIHdlJ3JlIG9uIFdpbmRvd3Mgd2l0aG91dCBpbXBvcnRpbmcgYGRhcnQ6aW9gLgpib29sIGlzV2luZG93cyA9IG5ldyBVcmkuZGlyZWN0b3J5KCJDOlxcIikucGF0aCA9PQogICAgbmV3IFVyaS5kaXJlY3RvcnkoIkM6XFwiLCB3aW5kb3dzOiB0cnVlKS5wYXRoOwoKU3RyaW5nIHJlbGF0aXZpemVVcmkoVXJpIGJhc2UsIFVyaSB1cmksIGJvb2wgaXNXaW5kb3dzKSB7CiAgYm9vbCBlcXVhbHNOQ1MoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAgICByZXR1cm4gYS50b0xvd2VyQ2FzZSgpID09IGIudG9Mb3dlckNhc2UoKTsKICB9CgogIGlmICghZXF1YWxzTkNTKGJhc2Uuc2NoZW1lLCB1cmkuc2NoZW1lKSB8fAogICAgICBlcXVhbHNOQ1MoYmFzZS5zY2hlbWUsICdkYXJ0JykgfHwKICAgICAgZXF1YWxzTkNTKGJhc2Uuc2NoZW1lLCAncGFja2FnZScpKSB7CiAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7CiAgfQoKICBpZiAoIWVxdWFsc05DUyhiYXNlLnNjaGVtZSwgJ2ZpbGUnKSkgewogICAgaXNXaW5kb3dzID0gZmFsc2U7CiAgfQoKICBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBwYXRoKSB7CiAgICBpZiAoaXNXaW5kb3dzKSB7CiAgICAgIHJldHVybiBwYXRoLnRvTG93ZXJDYXNlKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcGF0aDsKICAgIH0KICB9CgogIGlmIChiYXNlLnVzZXJJbmZvID09IHVyaS51c2VySW5mbyAmJgogICAgICBlcXVhbHNOQ1MoYmFzZS5ob3N0LCB1cmkuaG9zdCkgJiYKICAgICAgYmFzZS5wb3J0ID09IHVyaS5wb3J0ICYmCiAgICAgIHVyaS5xdWVyeSA9PSAiIiAmJgogICAgICB1cmkuZnJhZ21lbnQgPT0gIiIpIHsKICAgIGlmIChub3JtYWxpemUodXJpLnBhdGgpLnN0YXJ0c1dpdGgobm9ybWFsaXplKGJhc2UucGF0aCkpKSB7CiAgICAgIHJldHVybiB1cmkucGF0aC5zdWJzdHJpbmcoYmFzZS5wYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgIH0KCiAgICBpZiAoIWJhc2UucGF0aC5zdGFydHNXaXRoKCcvJykgfHwgIXVyaS5wYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7CiAgICB9CgogICAgTGlzdDxTdHJpbmc+IHVyaVBhcnRzID0gdXJpLnBhdGguc3BsaXQoJy8nKTsKICAgIExpc3Q8U3RyaW5nPiBiYXNlUGFydHMgPSBiYXNlLnBhdGguc3BsaXQoJy8nKTsKICAgIGludCBjb21tb24gPSAwOwogICAgaW50IGxlbmd0aCA9IG1pbih1cmlQYXJ0cy5sZW5ndGgsIGJhc2VQYXJ0cy5sZW5ndGgpOwogICAgd2hpbGUgKGNvbW1vbiA8IGxlbmd0aCAmJgogICAgICAgIG5vcm1hbGl6ZSh1cmlQYXJ0c1tjb21tb25dKSA9PSBub3JtYWxpemUoYmFzZVBhcnRzW2NvbW1vbl0pKSB7CiAgICAgIGNvbW1vbisrOwogICAgfQogICAgaWYgKGNvbW1vbiA9PSAxIHx8IChpc1dpbmRvd3MgJiYgY29tbW9uID09IDIpKSB7CiAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IHdpbGwgYWx3YXlzIGJlIGFuIGVtcHR5IHN0cmluZyBiZWNhdXNlIHRoZQogICAgICAvLyBwYXRocyBhcmUgYWJzb2x1dGUuIE9uIFdpbmRvd3MsIHdlIG11c3QgYWxzbyBjb25zaWRlciBkcml2ZQogICAgICAvLyBsZXR0ZXJzIG9yIGhvc3RuYW1lcy4KICAgICAgaWYgKGJhc2VQYXJ0cy5sZW5ndGggPiBjb21tb24gKyAxKSB7CiAgICAgICAgLy8gQXZvaWQgdXNpbmcgJy4uJyB0byBnbyB0byB0aGUgcm9vdCwgdW5sZXNzIHdlIGFyZSBhbHJlYWR5IHRoZXJlLgogICAgICAgIHJldHVybiB1cmkucGF0aDsKICAgICAgfQogICAgfQogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZm9yIChpbnQgaSA9IGNvbW1vbiArIDE7IGkgPCBiYXNlUGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgc2Iud3JpdGUoJy4uLycpOwogICAgfQogICAgZm9yIChpbnQgaSA9IGNvbW1vbjsgaSA8IHVyaVBhcnRzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICBzYi53cml0ZSgnJHt1cmlQYXJ0c1tpXX0vJyk7CiAgICB9CiAgICBzYi53cml0ZSgnJHt1cmlQYXJ0cy5sYXN0fScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQogIHJldHVybiB1cmkudG9TdHJpbmcoKTsKfQpPAE5OPAEtARQBPDMzATonLwQBLSgrGwQBKRcEASIVIQ0TBgQBJygfGRxAQQYBQx0GATEzFDkeRxAGNUNFHytMGQgGKjoXBjkjBiIaBBkCATRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvcmVsYXRpdml6ZS5kYXJ0UWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvc3JjL21lcmdlX3Zpc2l0b3IuZGFydKW1Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICcuLi9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKaW1wb3J0ICcuLi90eXBlX2FsZ2VicmEuZGFydCc7CgovLy8gSGVscGVyIHZpc2l0b3IgdGhhdCBtZXJnZXMgdHdvIHR5cGVzLCBhbmQgcmV0dXJuIHRoZSBtZXJnZWQgdHlwZSBvciBgbnVsbGAKLy8vIGlmIHRoZSB0eXBlcyBjb3VsZCBub3QgYmUgbWVyZ2VkLgpjbGFzcyBNZXJnZVZpc2l0b3IgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3IxPERhcnRUeXBlLCBEYXJ0VHlwZT4gewogIE51bGxhYmlsaXR5IG1lcmdlTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgYSwgTnVsbGFiaWxpdHkgYikgewogICAgcmV0dXJuIGEgPT0gYiA/IGEgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChiIGlzIEZ1bmN0aW9uVHlwZSAmJgogICAgICAgIGEudHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IGIudHlwZVBhcmFtZXRlcnMubGVuZ3RoICYmCiAgICAgICAgYS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID09IGIucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAmJgogICAgICAgIGEucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoID09IGIucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICYmCiAgICAgICAgYS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoID09IGIubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSA9IG1lcmdlTnVsbGFiaWxpdHkoYS5udWxsYWJpbGl0eSwgYi5udWxsYWJpbGl0eSk7CiAgICAgIGlmIChudWxsYWJpbGl0eSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlRnVuY3Rpb25UeXBlcyhhLCBiLCBudWxsYWJpbGl0eSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgRnVuY3Rpb25UeXBlIG1lcmdlRnVuY3Rpb25UeXBlcygKICAgICAgRnVuY3Rpb25UeXBlIGEsIEZ1bmN0aW9uVHlwZSBiLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgYXNzZXJ0KGEudHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IGIudHlwZVBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGFzc2VydChhLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPT0gYi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIGFzc2VydChhLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA9PSBiLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBhc3NlcnQoYS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoID09IGIubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBuZXdUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4oYS50eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgYVR5cGVQYXJhbWV0ZXIgPSBhLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICBUeXBlUGFyYW1ldGVyIGJUeXBlUGFyYW1ldGVyID0gYi50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgbmV3VHlwZVBhcmFtZXRlcnNbaV0gPQogICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXIoYVR5cGVQYXJhbWV0ZXIubmFtZSA/PyBiVHlwZVBhcmFtZXRlci5uYW1lKTsKICAgIH0KCiAgICBTdWJzdGl0dXRpb24gYVN1YnN0aXR1dGlvbjsKICAgIFN1YnN0aXR1dGlvbiBiU3Vic3RpdHV0aW9uOwoKICAgIERhcnRUeXBlIG1lcmdlVHlwZXMoRGFydFR5cGUgYSwgRGFydFR5cGUgYikgewogICAgICBpZiAoYVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgYSA9IGFTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYSk7CiAgICAgICAgYiA9IGJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYik7CiAgICAgIH0KICAgICAgcmV0dXJuIGEuYWNjZXB0MSh0aGlzLCBiKTsKICAgIH0KCiAgICBpZiAobmV3VHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJUeXBlPiBhVHlwZVBhcmFtZXRlclR5cGVzID0KICAgICAgICAgIG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXJUeXBlPihuZXdUeXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld1R5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYVR5cGVQYXJhbWV0ZXJUeXBlc1tpXSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICBhLnR5cGVQYXJhbWV0ZXJzW2ldLCBuZXdUeXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgYVN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGEudHlwZVBhcmFtZXRlcnMsIGFUeXBlUGFyYW1ldGVyVHlwZXMpOwogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJUeXBlPiBiVHlwZVBhcmFtZXRlclR5cGVzID0KICAgICAgICAgIG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXJUeXBlPihuZXdUeXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld1R5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYlR5cGVQYXJhbWV0ZXJUeXBlc1tpXSA9IG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICBiLnR5cGVQYXJhbWV0ZXJzW2ldLCBuZXdUeXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgYlN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGIudHlwZVBhcmFtZXRlcnMsIGJUeXBlUGFyYW1ldGVyVHlwZXMpOwoKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIERhcnRUeXBlIG5ld0JvdW5kID0KICAgICAgICAgICAgbWVyZ2VUeXBlcyhhLnR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kLCBiLnR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kKTsKICAgICAgICBpZiAobmV3Qm91bmQgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG5ld1R5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kID0gbmV3Qm91bmQ7CiAgICAgICAgRGFydFR5cGUgbmV3RGVmYXVsdFR5cGUgPSBtZXJnZVR5cGVzKAogICAgICAgICAgICBhLnR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlLCBiLnR5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlKTsKICAgICAgICBpZiAobmV3RGVmYXVsdFR5cGUgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG5ld1R5cGVQYXJhbWV0ZXJzW2ldLmRlZmF1bHRUeXBlID0gbmV3RGVmYXVsdFR5cGU7CiAgICAgIH0KICAgIH0KCiAgICBEYXJ0VHlwZSBuZXdSZXR1cm5UeXBlID0gbWVyZ2VUeXBlcyhhLnJldHVyblR5cGUsIGIucmV0dXJuVHlwZSk7CiAgICBpZiAobmV3UmV0dXJuVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8RGFydFR5cGU+IG5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4oYS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIG5ld1R5cGUgPQogICAgICAgICAgbWVyZ2VUeXBlcyhhLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLCBiLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldKTsKICAgICAgaWYgKG5ld1R5cGUgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIG5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0gbmV3VHlwZTsKICAgIH0KICAgIExpc3Q8TmFtZWRUeXBlPiBuZXdOYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkVHlwZT4oYS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgRGFydFR5cGUgbmV3VHlwZSA9CiAgICAgICAgICBtZXJnZVR5cGVzKGEubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUsIGIubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUpOwogICAgICBpZiAobmV3VHlwZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgTmFtZWRUeXBlIG5ld05hbWVkVHlwZSA9CiAgICAgICAgICBtZXJnZU5hbWVkVHlwZXMoYS5uYW1lZFBhcmFtZXRlcnNbaV0sIGIubmFtZWRQYXJhbWV0ZXJzW2ldLCBuZXdUeXBlKTsKICAgICAgaWYgKG5ld05hbWVkVHlwZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgbmV3TmFtZWRQYXJhbWV0ZXJzW2ldID0gbmV3TmFtZWRUeXBlOwogICAgfQogICAgRGFydFR5cGUgbmV3VHlwZWRlZlR5cGU7CiAgICBpZiAoYS50eXBlZGVmVHlwZSAhPSBudWxsKSB7CiAgICAgIG5ld1R5cGVkZWZUeXBlID0gbWVyZ2VUeXBlcyhhLnR5cGVkZWZUeXBlLCBiLnR5cGVkZWZUeXBlKTsKICAgICAgaWYgKG5ld1R5cGVkZWZUeXBlID09IG51bGwpIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKG5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzLCBuZXdSZXR1cm5UeXBlLCBudWxsYWJpbGl0eSwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5ld05hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogbmV3VHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogYS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHR5cGVkZWZUeXBlOiBuZXdUeXBlZGVmVHlwZSk7CiAgfQoKICBOYW1lZFR5cGUgbWVyZ2VOYW1lZFR5cGVzKE5hbWVkVHlwZSBhLCBOYW1lZFR5cGUgYiwgRGFydFR5cGUgbmV3VHlwZSkgewogICAgaWYgKGEubmFtZSAhPSBiLm5hbWUgfHwgYS5pc1JlcXVpcmVkICE9IGIuaXNSZXF1aXJlZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgTmFtZWRUeXBlKGEubmFtZSwgbmV3VHlwZSwgaXNSZXF1aXJlZDogYS5pc1JlcXVpcmVkKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChiIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBhLmNsYXNzTm9kZSA9PSBiLmNsYXNzTm9kZSAmJgogICAgICAgIGEudHlwZUFyZ3VtZW50cy5sZW5ndGggPT0gYi50eXBlQXJndW1lbnRzLmxlbmd0aCkgewogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSA9IG1lcmdlTnVsbGFiaWxpdHkoYS5udWxsYWJpbGl0eSwgYi5udWxsYWJpbGl0eSk7CiAgICAgIGlmIChudWxsYWJpbGl0eSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlSW50ZXJmYWNlVHlwZXMoYSwgYiwgbnVsbGFiaWxpdHkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIERhcnRUeXBlIG1lcmdlSW50ZXJmYWNlVHlwZXMoCiAgICAgIEludGVyZmFjZVR5cGUgYSwgSW50ZXJmYWNlVHlwZSBiLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgYXNzZXJ0KGEuY2xhc3NOb2RlID09IGIuY2xhc3NOb2RlKTsKICAgIGFzc2VydChhLnR5cGVBcmd1bWVudHMubGVuZ3RoID09IGIudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgaWYgKGEudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShhLmNsYXNzTm9kZSwgbnVsbGFiaWxpdHkpOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+KGEudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgRGFydFR5cGUgbmV3VHlwZSA9IGEudHlwZUFyZ3VtZW50c1tpXS5hY2NlcHQxKHRoaXMsIGIudHlwZUFyZ3VtZW50c1tpXSk7CiAgICAgIGlmIChuZXdUeXBlID09IG51bGwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gbmV3VHlwZTsKICAgIH0KICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZShhLmNsYXNzTm9kZSwgbnVsbGFiaWxpdHksIG5ld1R5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICBpZiAoYiBpcyBEeW5hbWljVHlwZSkgewogICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXROZXZlclR5cGUoTmV2ZXJUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChiIGlzIE5ldmVyVHlwZSkgewogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSA9IG1lcmdlTnVsbGFiaWxpdHkoYS5udWxsYWJpbGl0eSwgYi5udWxsYWJpbGl0eSk7CiAgICAgIGlmIChudWxsYWJpbGl0eSAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOZXZlclR5cGUobnVsbGFiaWxpdHkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgYSwgRGFydFR5cGUgYikgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgYSwgRGFydFR5cGUgYikgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICBpZiAoYiBpcyBWb2lkVHlwZSkgewogICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICBpZiAoYiBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiBhLnBhcmFtZXRlciA9PSBiLnBhcmFtZXRlcikgewogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSA9IG1lcmdlTnVsbGFiaWxpdHkoCiAgICAgICAgICBhLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHksIGIudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSk7CiAgICAgIGlmIChudWxsYWJpbGl0eSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKGEucHJvbW90ZWRCb3VuZCAhPSBudWxsICYmIGIucHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlUHJvbW90ZWRUeXBlUGFyYW1ldGVyVHlwZXMoYSwgYiwgbnVsbGFiaWxpdHkpOwogICAgICB9IGVsc2UgaWYgKGEucHJvbW90ZWRCb3VuZCA9PSBudWxsICYmIGIucHJvbW90ZWRCb3VuZCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG1lcmdlVHlwZVBhcmFtZXRlclR5cGVzKGEsIGIsIG51bGxhYmlsaXR5KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBEYXJ0VHlwZSBtZXJnZVR5cGVQYXJhbWV0ZXJUeXBlcygKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgYSwgVHlwZVBhcmFtZXRlclR5cGUgYiwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIGFzc2VydChhLnBhcmFtZXRlciA9PSBiLnBhcmFtZXRlcik7CiAgICBhc3NlcnQoYS5wcm9tb3RlZEJvdW5kID09IG51bGwpOwogICAgYXNzZXJ0KGIucHJvbW90ZWRCb3VuZCA9PSBudWxsKTsKICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoYS5wYXJhbWV0ZXIsIG51bGxhYmlsaXR5KTsKICB9CgogIERhcnRUeXBlIG1lcmdlUHJvbW90ZWRUeXBlUGFyYW1ldGVyVHlwZXMoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGEsIFR5cGVQYXJhbWV0ZXJUeXBlIGIsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBhc3NlcnQoYS5wYXJhbWV0ZXIgPT0gYi5wYXJhbWV0ZXIpOwogICAgYXNzZXJ0KGEucHJvbW90ZWRCb3VuZCAhPSBudWxsKTsKICAgIGFzc2VydChiLnByb21vdGVkQm91bmQgIT0gbnVsbCk7CiAgICBEYXJ0VHlwZSBuZXdQcm9tb3RlZEJvdW5kID0gYS5wcm9tb3RlZEJvdW5kLmFjY2VwdDEodGhpcywgYi5wcm9tb3RlZEJvdW5kKTsKICAgIGlmIChuZXdQcm9tb3RlZEJvdW5kID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKGEucGFyYW1ldGVyLCBudWxsYWJpbGl0eSwgbmV3UHJvbW90ZWRCb3VuZCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIGEsIERhcnRUeXBlIGIpIHsKICAgIGlmIChiIGlzIFR5cGVkZWZUeXBlICYmCiAgICAgICAgYS50eXBlZGVmTm9kZSA9PSBiLnR5cGVkZWZOb2RlICYmCiAgICAgICAgYS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PSBiLnR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5ID0gbWVyZ2VOdWxsYWJpbGl0eShhLm51bGxhYmlsaXR5LCBiLm51bGxhYmlsaXR5KTsKICAgICAgaWYgKG51bGxhYmlsaXR5ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gbWVyZ2VUeXBlZGVmVHlwZXMoYSwgYiwgbnVsbGFiaWxpdHkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIERhcnRUeXBlIG1lcmdlVHlwZWRlZlR5cGVzKAogICAgICBUeXBlZGVmVHlwZSBhLCBUeXBlZGVmVHlwZSBiLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgYXNzZXJ0KGEudHlwZWRlZk5vZGUgPT0gYi50eXBlZGVmTm9kZSk7CiAgICBhc3NlcnQoYS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PSBiLnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgIGlmIChhLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkKICAgICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZShhLnR5cGVkZWZOb2RlLCBudWxsYWJpbGl0eSk7CiAgICBMaXN0PERhcnRUeXBlPiBuZXdUeXBlQXJndW1lbnRzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4oYS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGEudHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBuZXdUeXBlID0gYS50eXBlQXJndW1lbnRzW2ldLmFjY2VwdDEodGhpcywgYi50eXBlQXJndW1lbnRzW2ldKTsKICAgICAgaWYgKG5ld1R5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIG5ld1R5cGVBcmd1bWVudHNbaV0gPSBuZXdUeXBlOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlZGVmVHlwZShhLnR5cGVkZWZOb2RlLCBudWxsYWJpbGl0eSwgbmV3VHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgYSwgRGFydFR5cGUgYikgPT4gbnVsbDsKfQqBEgBNTj8BJB8BTyZFPx4EAQw7HT5ASkBQITYIBhEEASNBQEJMQgEsOjg6Oh1JBgEgIAEyIy0tCCEGASg0QTtJOAgWSTRBO0k4CBZJATscTiAXCi8uTyYXCjsIBgFFLC07PhlMHRUILAYpNzkZTB0VCB9QIhUILAYdIUEvBgFRLSs6JgQBSjwTDUcGBAEMPR4mPFAhNwgGEQQBIEMoPiM6BiY0N08dFQglBkoEAQw5HBAGEQQBDDUaUCErCAYRBAEMQAEMPgEMMxkQBhEEAQxFQDJLIRUIQENHOwgGEQQBJEsoJSU8BAEsSyglJVAkEwZOBAEMORwqPFAhNQgGEQQBHj8sPiE6JjQ3TyglBkoEAQw8AgElcGFja2FnZTprZXJuZWwvc3JjL21lcmdlX3Zpc2l0b3IuZGFydFdmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3NyYy9yZXBsYWNlbWVudF92aXNpdG9yLmRhcnShFi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAnLi4vYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAnLi4vdHlwZV9hbGdlYnJhLmRhcnQnOwoKLy8vIEhlbHBlciB2aXNpdG9yIHRoYXQgY2xvbmVzIGEgdHlwZSBpZiBhIG5lc3RlZCB0eXBlIGlzIHJlcGxhY2VkLCBhbmQKLy8vIG90aGVyd2lzZSByZXR1cm5zIGBudWxsYC4KY2xhc3MgUmVwbGFjZW1lbnRWaXNpdG9yIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPERhcnRUeXBlPiB7CiAgY29uc3QgUmVwbGFjZW1lbnRWaXNpdG9yKCk7CgogIHZvaWQgY2hhbmdlVmFyaWFuY2UoKSB7fQoKICBOdWxsYWJpbGl0eSB2aXNpdE51bGxhYmlsaXR5KERhcnRUeXBlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBOdWxsYWJpbGl0eSBuZXdOdWxsYWJpbGl0eSA9IHZpc2l0TnVsbGFiaWxpdHkobm9kZSk7CgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBuZXdUeXBlUGFyYW1ldGVyczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBub2RlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICBEYXJ0VHlwZSBuZXdCb3VuZCA9IHR5cGVQYXJhbWV0ZXIuYm91bmQuYWNjZXB0KHRoaXMpOwogICAgICBEYXJ0VHlwZSBuZXdEZWZhdWx0VHlwZSA9IHR5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGUuYWNjZXB0KHRoaXMpOwogICAgICBpZiAobmV3Qm91bmQgIT0gbnVsbCB8fCBuZXdEZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgICAgbmV3VHlwZVBhcmFtZXRlcnMgPz89IG5vZGUudHlwZVBhcmFtZXRlcnMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgICAgbmV3VHlwZVBhcmFtZXRlcnNbaV0gPSBuZXcgVHlwZVBhcmFtZXRlcigKICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICBuZXdCb3VuZCA/PyB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICBuZXdEZWZhdWx0VHlwZSA/PyB0eXBlUGFyYW1ldGVyLmRlZmF1bHRUeXBlKTsKICAgICAgfQogICAgfQoKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb247CiAgICBpZiAobmV3VHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJUeXBlPiB0eXBlUGFyYW1ldGVyVHlwZXMgPQogICAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlclR5cGU+KG5ld1R5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3VHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0eXBlUGFyYW1ldGVyVHlwZXNbaV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUuZm9yQWxwaGFSZW5hbWluZygKICAgICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVyc1tpXSwgbmV3VHlwZVBhcmFtZXRlcnNbaV0pOwogICAgICB9CiAgICAgIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKG5vZGUudHlwZVBhcmFtZXRlcnMsIHR5cGVQYXJhbWV0ZXJUeXBlcyk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3VHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBuZXdUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZCA9CiAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShuZXdUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZCk7CiAgICAgIH0KICAgIH0KCiAgICBEYXJ0VHlwZSB2aXNpdFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgRGFydFR5cGUgcmVzdWx0ID0gdHlwZS5hY2NlcHQodGhpcyk7CiAgICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgIHJlc3VsdCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShyZXN1bHQgPz8gdHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBEYXJ0VHlwZSBuZXdSZXR1cm5UeXBlID0gdmlzaXRUeXBlKG5vZGUucmV0dXJuVHlwZSk7CiAgICBjaGFuZ2VWYXJpYW5jZSgpOwogICAgTGlzdDxEYXJ0VHlwZT4gbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIG5ld1R5cGUgPSB2aXNpdFR5cGUobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSk7CiAgICAgIGlmIChuZXdUeXBlICE9IG51bGwpIHsKICAgICAgICBuZXdQb3NpdGlvbmFsUGFyYW1ldGVycyA/Pz0KICAgICAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgICBuZXdQb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSA9IG5ld1R5cGU7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8TmFtZWRUeXBlPiBuZXdOYW1lZFBhcmFtZXRlcnMgPSBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBuZXdUeXBlID0gdmlzaXRUeXBlKG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUpOwogICAgICBOYW1lZFR5cGUgbmV3TmFtZWRUeXBlID0KICAgICAgICAgIGNyZWF0ZU5hbWVkVHlwZShub2RlLm5hbWVkUGFyYW1ldGVyc1tpXSwgbmV3VHlwZSk7CiAgICAgIGlmIChuZXdOYW1lZFR5cGUgIT0gbnVsbCkgewogICAgICAgIG5ld05hbWVkUGFyYW1ldGVycyA/Pz0gbm9kZS5uYW1lZFBhcmFtZXRlcnMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgICAgbmV3TmFtZWRQYXJhbWV0ZXJzW2ldID0gbmV3TmFtZWRUeXBlOwogICAgICB9CiAgICB9CiAgICBjaGFuZ2VWYXJpYW5jZSgpOwogICAgRGFydFR5cGUgbmV3VHlwZWRlZlR5cGUgPSB2aXNpdFR5cGUobm9kZS50eXBlZGVmVHlwZSk7CgogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uVHlwZSgKICAgICAgICBub2RlLAogICAgICAgIG5ld051bGxhYmlsaXR5LAogICAgICAgIG5ld1R5cGVQYXJhbWV0ZXJzLAogICAgICAgIG5ld1JldHVyblR5cGUsCiAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgbmV3TmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIG5ld1R5cGVkZWZUeXBlKTsKICB9CgogIE5hbWVkVHlwZSBjcmVhdGVOYW1lZFR5cGUoTmFtZWRUeXBlIG5vZGUsIERhcnRUeXBlIG5ld1R5cGUpIHsKICAgIGlmIChuZXdUeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IE5hbWVkVHlwZShub2RlLm5hbWUsIG5ld1R5cGUsIGlzUmVxdWlyZWQ6IG5vZGUuaXNSZXF1aXJlZCk7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBjcmVhdGVGdW5jdGlvblR5cGUoCiAgICAgIEZ1bmN0aW9uVHlwZSBub2RlLAogICAgICBOdWxsYWJpbGl0eSBuZXdOdWxsYWJpbGl0eSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBuZXdUeXBlUGFyYW1ldGVycywKICAgICAgRGFydFR5cGUgbmV3UmV0dXJuVHlwZSwKICAgICAgTGlzdDxEYXJ0VHlwZT4gbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgIExpc3Q8TmFtZWRUeXBlPiBuZXdOYW1lZFBhcmFtZXRlcnMsCiAgICAgIFR5cGVkZWZUeXBlIG5ld1R5cGVkZWZUeXBlKSB7CiAgICBpZiAobmV3TnVsbGFiaWxpdHkgPT0gbnVsbCAmJgogICAgICAgIG5ld1JldHVyblR5cGUgPT0gbnVsbCAmJgogICAgICAgIG5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzID09IG51bGwgJiYKICAgICAgICBuZXdOYW1lZFBhcmFtZXRlcnMgPT0gbnVsbCAmJgogICAgICAgIG5ld1R5cGVkZWZUeXBlID09IG51bGwpIHsKICAgICAgLy8gTm8gbnVsbGFiaWxpdHkgb3IgdHlwZXMgaGFkIHRvIGJlIHN1YnN0aXR1dGVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgbmV3UG9zaXRpb25hbFBhcmFtZXRlcnMgPz8gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgIG5ld1JldHVyblR5cGUgPz8gbm9kZS5yZXR1cm5UeXBlLAogICAgICAgICAgbmV3TnVsbGFiaWxpdHkgPz8gbm9kZS5udWxsYWJpbGl0eSwKICAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmV3TmFtZWRQYXJhbWV0ZXJzID8/IG5vZGUubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IG5ld1R5cGVQYXJhbWV0ZXJzID8/IG5vZGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgICB0eXBlZGVmVHlwZTogbmV3VHlwZWRlZlR5cGUgPz8gbm9kZS50eXBlZGVmVHlwZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBOdWxsYWJpbGl0eSBuZXdOdWxsYWJpbGl0eSA9IHZpc2l0TnVsbGFiaWxpdHkobm9kZSk7CiAgICBMaXN0PERhcnRUeXBlPiBuZXdUeXBlQXJndW1lbnRzID0gbnVsbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIHN1YnN0aXR1dGlvbiA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXS5hY2NlcHQodGhpcyk7CiAgICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgIG5ld1R5cGVBcmd1bWVudHMgPz89IG5vZGUudHlwZUFyZ3VtZW50cy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gc3Vic3RpdHV0aW9uOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY3JlYXRlSW50ZXJmYWNlVHlwZShub2RlLCBuZXdOdWxsYWJpbGl0eSwgbmV3VHlwZUFyZ3VtZW50cyk7CiAgfQoKICBEYXJ0VHlwZSBjcmVhdGVJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSwgTnVsbGFiaWxpdHkgbmV3TnVsbGFiaWxpdHksCiAgICAgIExpc3Q8RGFydFR5cGU+IG5ld1R5cGVBcmd1bWVudHMpIHsKICAgIGlmIChuZXdOdWxsYWJpbGl0eSA9PSBudWxsICYmIG5ld1R5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAvLyBObyBudWxsYWJpbGl0eSBvciB0eXBlIGFyZ3VtZW50cyBuZWVkZWQgdG8gYmUgc3Vic3RpdHV0ZWQuCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgbm9kZS5jbGFzc05vZGUsCiAgICAgICAgICBuZXdOdWxsYWJpbGl0eSA/PyBub2RlLm51bGxhYmlsaXR5LAogICAgICAgICAgbmV3VHlwZUFyZ3VtZW50cyA/PyBub2RlLnR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgewogICAgTnVsbGFiaWxpdHkgbmV3TnVsbGFiaWxpdHkgPSB2aXNpdE51bGxhYmlsaXR5KG5vZGUpOwogICAgcmV0dXJuIGNyZWF0ZU5ldmVyVHlwZShub2RlLCBuZXdOdWxsYWJpbGl0eSk7CiAgfQoKICBEYXJ0VHlwZSBjcmVhdGVOZXZlclR5cGUoTmV2ZXJUeXBlIG5vZGUsIE51bGxhYmlsaXR5IG5ld051bGxhYmlsaXR5KSB7CiAgICBpZiAobmV3TnVsbGFiaWxpdHkgPT0gbnVsbCkgewogICAgICAvLyBObyBudWxsYWJpbGl0eSBuZWVkZWQgdG8gYmUgc3Vic3RpdHV0ZWQuCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBOZXZlclR5cGUobmV3TnVsbGFiaWxpdHkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpID0+IG51bGw7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgTnVsbGFiaWxpdHkgbmV3TnVsbGFiaWxpdHkgPSB2aXNpdE51bGxhYmlsaXR5KG5vZGUpOwogICAgaWYgKG5vZGUucHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CiAgICAgIERhcnRUeXBlIG5ld1Byb21vdGVkQm91bmQgPSBub2RlLnByb21vdGVkQm91bmQuYWNjZXB0KHRoaXMpOwogICAgICByZXR1cm4gY3JlYXRlUHJvbW90ZWRUeXBlUGFyYW1ldGVyVHlwZSgKICAgICAgICAgIG5vZGUsIG5ld051bGxhYmlsaXR5LCBuZXdQcm9tb3RlZEJvdW5kKTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVUeXBlUGFyYW1ldGVyVHlwZShub2RlLCBuZXdOdWxsYWJpbGl0eSk7CiAgfQoKICBEYXJ0VHlwZSBjcmVhdGVUeXBlUGFyYW1ldGVyVHlwZSgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgbm9kZSwgTnVsbGFiaWxpdHkgbmV3TnVsbGFiaWxpdHkpIHsKICAgIGlmIChuZXdOdWxsYWJpbGl0eSA9PSBudWxsKSB7CiAgICAgIC8vIE5vIG51bGxhYmlsaXR5IG5lZWRlZCB0byBiZSBzdWJzdGl0dXRlZC4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlKG5vZGUucGFyYW1ldGVyLCBuZXdOdWxsYWJpbGl0eSk7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBjcmVhdGVQcm9tb3RlZFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUsCiAgICAgIE51bGxhYmlsaXR5IG5ld051bGxhYmlsaXR5LCBEYXJ0VHlwZSBuZXdQcm9tb3RlZEJvdW5kKSB7CiAgICBpZiAobmV3TnVsbGFiaWxpdHkgPT0gbnVsbCAmJiBuZXdQcm9tb3RlZEJvdW5kID09IG51bGwpIHsKICAgICAgLy8gTm8gbnVsbGFiaWxpdHkgb3IgYm91bmQgbmVlZGVkIHRvIGJlIHN1YnN0aXR1dGVkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICBub2RlLnBhcmFtZXRlciwKICAgICAgICAgIG5ld051bGxhYmlsaXR5ID8/IG5vZGUudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSwKICAgICAgICAgIG5ld1Byb21vdGVkQm91bmQgPz8gbm9kZS5wcm9tb3RlZEJvdW5kKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgTnVsbGFiaWxpdHkgbmV3TnVsbGFiaWxpdHkgPSB2aXNpdE51bGxhYmlsaXR5KG5vZGUpOwogICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cyA9IG51bGw7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdWJzdGl0dXRpb24gPSBub2RlLnR5cGVBcmd1bWVudHNbaV0uYWNjZXB0KHRoaXMpOwogICAgICBpZiAoc3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICBuZXdUeXBlQXJndW1lbnRzID8/PSBub2RlLnR5cGVBcmd1bWVudHMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgICAgbmV3VHlwZUFyZ3VtZW50c1tpXSA9IHN1YnN0aXR1dGlvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNyZWF0ZVR5cGVkZWYobm9kZSwgbmV3TnVsbGFiaWxpdHksIG5ld1R5cGVBcmd1bWVudHMpOwogIH0KCiAgRGFydFR5cGUgY3JlYXRlVHlwZWRlZihUeXBlZGVmVHlwZSBub2RlLCBOdWxsYWJpbGl0eSBuZXdOdWxsYWJpbGl0eSwKICAgICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cykgewogICAgaWYgKG5ld051bGxhYmlsaXR5ID09IG51bGwgJiYgbmV3VHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIC8vIE5vIG51bGxhYmlsaXR5IG9yIHR5cGUgYXJndW1lbnRzIG5lZWRlZCB0byBiZSBzdWJzdGl0dXRlZC4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlKAogICAgICAgICAgbm9kZS50eXBlZGVmTm9kZSwKICAgICAgICAgIG5ld051bGxhYmlsaXR5ID8/IG5vZGUubnVsbGFiaWxpdHksCiAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzID8/IG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgPT4gbnVsbDsKfQqA+ABNTj8BJB8BSB5AHgEbATcBDDI5ASs7PDxIOEsyIC06CAYBHyUzQTtIOwgVSzslRQgGASglKyI+CBUGATkWM0FCHSQ/LggGLzxCHz0iTS4IBhY7AR8OGBsXIRwZBAFAGxMNTQYEAR8ZIi0eLiokIiErJiI4Ew0fQCwuR0Q/PAYEAQw0OSw6QiJJLAgGSAQBTyk+RBMNIBouMwYEAQw3AQwsOTIEAUkiMhMNLAYEAQw3AQw1AQwxAQw8OSZDLjMGOgQBJDwiMhMNRAYEAUM/PjsTDSQaPzMGBAEMMDksOkIiSSwIBkIEAUcpPkQTDR4cLjMGBAEMMwIBK3BhY2thZ2U6a2VybmVsL3NyYy9yZXBsYWNlbWVudF92aXNpdG9yLmRhcnRMZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi9pbXBvcnRfdGFibGUuZGFydJN7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwuaW1wb3J0X3RhYmxlOwoKaW1wb3J0ICdhc3QuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBJbXBvcnRUYWJsZSB7CiAgaW50IGdldEltcG9ydEluZGV4KExpYnJhcnkgbGlicmFyeSk7Cn0KCmNsYXNzIENvbXBvbmVudEltcG9ydFRhYmxlIGltcGxlbWVudHMgSW1wb3J0VGFibGUgewogIGZpbmFsIE1hcDxMaWJyYXJ5LCBpbnQ+IF9saWJyYXJ5SW5kZXggPSA8TGlicmFyeSwgaW50Pnt9OwoKICBDb21wb25lbnRJbXBvcnRUYWJsZShDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudC5saWJyYXJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgX2xpYnJhcnlJbmRleFtjb21wb25lbnQubGlicmFyaWVzW2ldXSA9IGk7CiAgICB9CiAgfQoKICBpbnQgZ2V0SW1wb3J0SW5kZXgoTGlicmFyeSBsaWJyYXJ5KSA9PiBfbGlicmFyeUluZGV4W2xpYnJhcnldID8/IC0xOwp9CgpjbGFzcyBMaWJyYXJ5SW1wb3J0VGFibGUgaW1wbGVtZW50cyBJbXBvcnRUYWJsZSB7CiAgZmluYWwgTGlzdDxTdHJpbmc+IF9pbXBvcnRQYXRocyA9IDxTdHJpbmc+W107CiAgZmluYWwgTGlzdDxMaWJyYXJ5PiBfaW1wb3J0ZWRMaWJyYXJpZXMgPSA8TGlicmFyeT5bXTsKICBmaW5hbCBNYXA8TGlicmFyeSwgaW50PiBfbGlicmFyeUluZGV4ID0gPExpYnJhcnksIGludD57fTsKCiAgZmFjdG9yeSBMaWJyYXJ5SW1wb3J0VGFibGUoTGlicmFyeSBsaWIpIHsKICAgIHJldHVybiBuZXcgX0ltcG9ydFRhYmxlQnVpbGRlcihsaWIpLmJ1aWxkKCk7CiAgfQoKICBMaWJyYXJ5SW1wb3J0VGFibGUuZW1wdHkoKTsKCiAgLy8vIFRoZSBsaXN0IG9mIGltcG9ydHMuCiAgLy8vCiAgLy8vIFNob3VsZCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHksIGFzIHRoZSBpbmRleCBtYXAgd291bGQgZ28gb3V0IG9mIHN5bmMuCiAgTGlzdDxTdHJpbmc+IGdldCBpbXBvcnRQYXRocyA9PiBfaW1wb3J0UGF0aHM7CgogIExpc3Q8TGlicmFyeT4gZ2V0IGltcG9ydGVkTGlicmFyaWVzID0+IF9pbXBvcnRlZExpYnJhcmllczsKCiAgaW50IGFkZEltcG9ydChMaWJyYXJ5IHRhcmdldCwgU3RyaW5nIGltcG9ydFBhdGgpIHsKICAgIGludCBpbmRleCA9IF9saWJyYXJ5SW5kZXhbdGFyZ2V0XTsKICAgIGlmIChpbmRleCAhPSBudWxsKSByZXR1cm4gaW5kZXg7CiAgICBpbmRleCA9IF9pbXBvcnRQYXRocy5sZW5ndGg7CiAgICBfaW1wb3J0UGF0aHMuYWRkKGltcG9ydFBhdGgpOwogICAgX2ltcG9ydGVkTGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgX2xpYnJhcnlJbmRleFt0YXJnZXRdID0gaW5kZXg7CiAgICByZXR1cm4gaW5kZXg7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGltcG9ydCwgb3IgLTEgaWYgbm90IGZvdW5kLgogIGludCBnZXRJbXBvcnRJbmRleChMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBfbGlicmFyeUluZGV4W2xpYnJhcnldID8/IC0xOwogIH0KCiAgU3RyaW5nIGdldEltcG9ydFBhdGgoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICByZXR1cm4gX2ltcG9ydFBhdGhzW2dldEltcG9ydEluZGV4KGxpYnJhcnkpXTsKICB9Cn0KCi8vLyBCdWlsZHMgdGhlIGltcG9ydCB0YWJsZSBmb3IgYSBnaXZlbiBsaWJyYXJ5LgpjbGFzcyBfSW1wb3J0VGFibGVCdWlsZGVyIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgTGlicmFyeUltcG9ydFRhYmxlIHRhYmxlID0gbmV3IExpYnJhcnlJbXBvcnRUYWJsZS5lbXB0eSgpOwogIGZpbmFsIExpYnJhcnkgcmVmZXJlbmNlTGlicmFyeTsKCiAgTGlicmFyeUltcG9ydFRhYmxlIGJ1aWxkKCkgewogICAgcmVmZXJlbmNlTGlicmFyeS5hY2NlcHQodGhpcyk7CiAgICByZXR1cm4gdGFibGU7CiAgfQoKICBfSW1wb3J0VGFibGVCdWlsZGVyKHRoaXMucmVmZXJlbmNlTGlicmFyeSkgewogICAgdGFibGUuYWRkSW1wb3J0KHJlZmVyZW5jZUxpYnJhcnksICcnKTsKICB9CgogIHZvaWQgYWRkTGlicmFyeUltcG9ydChMaWJyYXJ5IHRhcmdldCkgewogICAgaWYgKHRhcmdldCA9PSByZWZlcmVuY2VMaWJyYXJ5KSByZXR1cm47IC8vIFNlbGYtcmVmZXJlbmNlIGlzIHNwZWNpYWwuCiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybjsKICAgIHZhciByZWZlcmVuY2VVcmkgPSByZWZlcmVuY2VMaWJyYXJ5LmltcG9ydFVyaTsKICAgIHZhciB0YXJnZXRVcmkgPSB0YXJnZXQuaW1wb3J0VXJpOwogICAgaWYgKHRhcmdldFVyaSA9PSBudWxsKSB7CiAgICAgIHRocm93ICckcmVmZXJlbmNlVXJpIGNhbm5vdCByZWZlciB0byBsaWJyYXJ5IHdpdGhvdXQgYW4gaW1wb3J0IFVSSSc7CiAgICB9CiAgICAvLyBUbyBzdXBwb3J0IHVzaW5nIGN1c3RvbS11cmlzIGluIHVuaXQgdGVzdHMsIHdlIGRvbid0IGNoZWNrIGRpcmVjdGx5CiAgICAvLyB3aGV0aGVyIHRoZSBzY2hlbWUgaXMgJ2ZpbGU6JywgYnV0IGluc3RlYWQgd2UgY2hlY2sgdGhhdCBpcyBub3QgJ2RhcnQ6JwogICAgLy8gb3IgJ3BhY2thZ2U6Jy4KICAgIGJvb2wgaXNGaWxlT3JDdXN0b21TY2hlbWUodXJpKSA9PgogICAgICAgIHVyaS5zY2hlbWUgIT0gJycgJiYgdXJpLnNjaGVtZSAhPSAncGFja2FnZScgJiYgdXJpLnNjaGVtZSAhPSAnZGFydCc7CiAgICBib29sIGlzVGFyZ2V0U2NoZW1lRmlsZU9yQ3VzdG9tID0gaXNGaWxlT3JDdXN0b21TY2hlbWUodGFyZ2V0VXJpKTsKICAgIGJvb2wgaXNSZWZlcmVuY2VTY2hlbWVGaWxlT3JDdXN0b20gPSBpc0ZpbGVPckN1c3RvbVNjaGVtZShyZWZlcmVuY2VVcmkpOwogICAgaWYgKGlzVGFyZ2V0U2NoZW1lRmlsZU9yQ3VzdG9tICYmIGlzUmVmZXJlbmNlU2NoZW1lRmlsZU9yQ3VzdG9tKSB7CiAgICAgIFN0cmluZyByZWxhdGl2ZVVyaSA9IHJlbGF0aXZlVXJpUGF0aCh0YXJnZXRVcmksIHJlZmVyZW5jZVVyaSk7CiAgICAgIHRhYmxlLmFkZEltcG9ydCh0YXJnZXQsIHJlbGF0aXZlVXJpKTsKICAgIH0gZWxzZSBpZiAoaXNUYXJnZXRTY2hlbWVGaWxlT3JDdXN0b20pIHsKICAgICAgLy8gQ2Fubm90IGltcG9ydCBhIGZpbGU6VVJJIGZyb20gYSBkYXJ0OlVSSSBvciBwYWNrYWdlOlVSSS4KICAgICAgLy8gV2UgbWF5IHdhbnQgdG8gcmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24sIGJ1dCBmb3Igbm93IGl0J3MganVzdCBhIHNhbml0eQogICAgICAvLyBjaGVjay4KICAgICAgdGhyb3cgJyRyZWZlcmVuY2VVcmkgY2Fubm90IHJlZmVyIHRvIGFwcGxpY2F0aW9uIGxpYnJhcnkgJHRhcmdldFVyaSc7CiAgICB9IGVsc2UgewogICAgICB0YWJsZS5hZGRJbXBvcnQodGFyZ2V0LCB0YXJnZXQuaW1wb3J0VXJpLnRvU3RyaW5nKCkpOwogICAgfQogIH0KCiAgdmlzaXRDbGFzc1JlZmVyZW5jZShDbGFzcyBub2RlKSB7CiAgICBhZGRMaWJyYXJ5SW1wb3J0KG5vZGUuZW5jbG9zaW5nTGlicmFyeSk7CiAgfQoKICB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICBzdXBlci52aXNpdExpYnJhcnkobm9kZSk7CiAgICBmb3IgKFJlZmVyZW5jZSBleHBvcnRlZFJlZmVyZW5jZSBpbiBub2RlLmFkZGl0aW9uYWxFeHBvcnRzKSB7CiAgICAgIGFkZExpYnJhcnlJbXBvcnQoZXhwb3J0ZWRSZWZlcmVuY2Uubm9kZS5wYXJlbnQpOwogICAgfQogIH0KCiAgZGVmYXVsdE1lbWJlclJlZmVyZW5jZShNZW1iZXIgbm9kZSkgewogICAgYWRkTGlicmFyeUltcG9ydChub2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogIH0KCiAgdmlzaXROYW1lKE5hbWUgbmFtZSkgewogICAgaWYgKG5hbWUubGlicmFyeSAhPSBudWxsKSB7CiAgICAgIGFkZExpYnJhcnlJbXBvcnQobmFtZS5saWJyYXJ5KTsKICAgIH0KICB9Cn0KClN0cmluZyByZWxhdGl2ZVVyaVBhdGgoVXJpIHRhcmdldCwgVXJpIHJlZikgewogIExpc3Q8U3RyaW5nPiB0YXJnZXRTZWdtZW50cyA9IHRhcmdldC5wYXRoU2VnbWVudHM7CiAgTGlzdDxTdHJpbmc+IHJlZlNlZ21lbnRzID0gcmVmLnBhdGhTZWdtZW50czsKICBpbnQgdG8gPSByZWZTZWdtZW50cy5sZW5ndGg7CiAgaWYgKHRhcmdldFNlZ21lbnRzLmxlbmd0aCA8IHRvKSB0byA9IHRhcmdldFNlZ21lbnRzLmxlbmd0aDsKICB0by0tOyAvLyBUaGUgbGFzdCBlbnRyeSBpcyB0aGUgZmlsZW5hbWUsIGhlcmUgd2UgY29tcGFyZSBvbmx5IGRpcmVjdG9yaWVzLgogIGludCBzYW1lID0gLTE7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bzsgaSsrKSB7CiAgICBpZiAodGFyZ2V0U2VnbWVudHNbaV0gPT0gcmVmU2VnbWVudHNbaV0pIHsKICAgICAgc2FtZSA9IGk7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKHNhbWUgPT0gdGFyZ2V0U2VnbWVudHMubGVuZ3RoIC0gMiAmJgogICAgICB0YXJnZXRTZWdtZW50cy5sZW5ndGggPT0gcmVmU2VnbWVudHMubGVuZ3RoKSB7CiAgICAvLyBCb3RoIHBhcnRzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHNlZ21lbnRzLAogICAgLy8gYW5kIHRoZXkgYWdyZWUgb24gYWxsIGRpcmVjdG9yaWVzLgogICAgaWYgKHRhcmdldFNlZ21lbnRzLmxhc3QgPT0gIiIpIHJldHVybiAiLiI7CiAgICByZXR1cm4gdGFyZ2V0U2VnbWVudHMubGFzdDsKICB9CiAgTGlzdDxTdHJpbmc+IHBhdGggPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgaW50IG9rZWQgPSBzYW1lICsgMTsKICB3aGlsZSAob2tlZCA8IHJlZlNlZ21lbnRzLmxlbmd0aCAtIDEpIHsKICAgIHBhdGguYWRkKCIuLiIpOwogICAgb2tlZCsrOwogIH0KICBwYXRoLmFkZEFsbCh0YXJnZXRTZWdtZW50cy5za2lwKHNhbWUgKyAxKSk7CgogIGlmIChwYXRoLmlzRW1wdHkpIHBhdGguYWRkKCIuIik7CiAgcmV0dXJuIHBhdGguam9pbigiLyIpOwp9CoCfAE5OPB0BEwEdJwIBNDwBLjsxBgQBRwIBMjA4PAEsMQQBHgEbBk4wAT0BNSclISIkIxIEAUEoKQQBKjIEAgExNUMiAR8jEgQBLysEASpKIDMmHUsGS08WJk1HTUdFLC1CUBBMDTwGBAEkLQQBHx5CNwYEASgtBAEZICYGBAIBLjUvHz5NESEvEA0NBgQrNTQqLyAEKhcqFAwELgEjGQIBIHBhY2thZ2U6a2VybmVsL2ltcG9ydF90YWJsZS5kYXJ0ZGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvc3JjL2hpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50LmRhcnSGTi8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGtlcm5lbC5oaWVyYXJjaHlfYmFzZWRfdHlwZV9lbnZpcm9ubWVudDsKCmltcG9ydCAnLi4vYXN0LmRhcnQnIHNob3cgQ2xhc3MsIERhcnRUeXBlLCBJbnRlcmZhY2VUeXBlLCBMaWJyYXJ5LCBNZW1iZXIsIE5hbWU7CgppbXBvcnQgJy4uL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICcuLi9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICcuLi90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKY2xhc3MgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQgZXh0ZW5kcyBUeXBlRW52aXJvbm1lbnQgewogIGZpbmFsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeTsKCiAgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQoQ29yZVR5cGVzIGNvcmVUeXBlcywgdGhpcy5oaWVyYXJjaHkpCiAgICAgIDogc3VwZXIuZnJvbVN1YmNsYXNzKGNvcmVUeXBlcyk7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MsCiAgICAgIExpYnJhcnkgY2xpZW50TGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgcmV0dXJuIGhpZXJhcmNoeS5nZXRUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgIHR5cGUsIHN1cGVyY2xhc3MsIGNsaWVudExpYnJhcnksIGNvcmVUeXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBnZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MpIHsKICAgIENsYXNzIHR5cGVDbGFzcyA9IHR5cGUuY2xhc3NOb2RlOwogICAgaWYgKHR5cGVDbGFzcyA9PSBzdXBlcmNsYXNzKSByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzOwogICAgaWYgKHR5cGVDbGFzcyA9PSBjb3JlVHlwZXMubnVsbENsYXNzKSB7CiAgICAgIGlmIChzdXBlcmNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CiAgICAgIHJldHVybiBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvcmVUeXBlcy5udWxsVHlwZSk7CiAgICB9CiAgICByZXR1cm4gaGllcmFyY2h5LmdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0SW50ZXJmYWNlTWVtYmVyKENsYXNzIGNscywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgcmV0dXJuIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoY2xzLCBuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgfQp9Ci8ATk48ATEBUQE2ASwBOAE+IgFFJwEMSjQqNQQBDC8uJjwsSChBBkUEAQxKRAQCAThwYWNrYWdlOmtlcm5lbC9zcmMvaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnQuZGFydFFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvYnl0ZWNvZGUvZGlzYXNzZW1ibGVyLmRhcnSajS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLmJ5dGVjb2RlLmRpc2Fzc2VtYmxlcjsKCmltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgbGlzdEVxdWFscywgbGlzdEhhc2hDb2RlOwoKaW1wb3J0ICdkYmMuZGFydCc7CmltcG9ydCAnZXhjZXB0aW9ucy5kYXJ0JzsKCmNsYXNzIEluc3RydWN0aW9uIHsKICBmaW5hbCBPcGNvZGUgb3Bjb2RlOwogIGZpbmFsIGJvb2wgaXNXaWRlOwogIGZpbmFsIExpc3Q8aW50PiBvcGVyYW5kczsKICBmaW5hbCBpbnQgcGM7CgogIEluc3RydWN0aW9uKHRoaXMub3Bjb2RlLCB0aGlzLmlzV2lkZSwgdGhpcy5vcGVyYW5kcywgdGhpcy5wYyk7CgogIEZvcm1hdCBnZXQgZm9ybWF0ID0+IEJ5dGVjb2RlRm9ybWF0c1tvcGNvZGVdOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBpbnN0cnVjdGlvblNpemUoZm9ybWF0LmVuY29kaW5nLCBpc1dpZGUpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGhhc2hDb2RlID0+IG9wY29kZS5pbmRleC5oYXNoQ29kZSBeIGxpc3RIYXNoQ29kZShvcGVyYW5kcyk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIHJldHVybiAob3RoZXIgaXMgSW5zdHJ1Y3Rpb24pICYmCiAgICAgICAgKG9wY29kZSA9PSBvdGhlci5vcGNvZGUpICYmCiAgICAgICAgbGlzdEVxdWFscyhvcGVyYW5kcywgb3RoZXIub3BlcmFuZHMpOwogIH0KfQoKY2xhc3MgQnl0ZWNvZGVEaXNhc3NlbWJsZXIgewogIFVpbnQ4TGlzdCBfYnl0ZWNvZGU7CiAgTGlzdDxJbnN0cnVjdGlvbj4gX2luc3RydWN0aW9uczsKICBpbnQgX2xhYmVsQ291bnQ7CiAgTWFwPGludCwgU3RyaW5nPiBfbGFiZWxzOwogIE1hcDxpbnQsIExpc3Q8U3RyaW5nPj4gX21hcmtlcnM7CgogIFN0cmluZyBkaXNhc3NlbWJsZShMaXN0PGludD4gYnl0ZWNvZGUsIEV4Y2VwdGlvbnNUYWJsZSBleGNlcHRpb25zVGFibGUsCiAgICAgIHtMaXN0PE1hcDxpbnQsIFN0cmluZz4+IGFubm90YXRpb25zfSkgewogICAgX2luaXQoYnl0ZWNvZGUpOwogICAgX3NjYW5Gb3JKdW1wVGFyZ2V0cygpOwogICAgX21hcmtUcnlCbG9ja3MoZXhjZXB0aW9uc1RhYmxlKTsKICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIF9tYXJrQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOwogICAgfQogICAgcmV0dXJuIF9kaXNhc20oKTsKICB9CgogIExpc3Q8SW5zdHJ1Y3Rpb24+IGRlY29kZShVaW50OExpc3QgYnl0ZWNvZGUpIHsKICAgIF9pbml0KGJ5dGVjb2RlKTsKICAgIHJldHVybiBfaW5zdHJ1Y3Rpb25zOwogIH0KCiAgdm9pZCBfaW5pdChMaXN0PGludD4gYnl0ZWNvZGUpIHsKICAgIF9ieXRlY29kZSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoYnl0ZWNvZGUpOwoKICAgIF9pbnN0cnVjdGlvbnMgPSBuZXcgTGlzdDxJbnN0cnVjdGlvbj4oKTsKICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8IF9ieXRlY29kZS5sZW5ndGg7KSB7CiAgICAgIGZpbmFsIGluc3RyID0gZGVjb2RlSW5zdHJ1Y3Rpb25BdChwb3MpOwogICAgICBfaW5zdHJ1Y3Rpb25zLmFkZChpbnN0cik7CiAgICAgIHBvcyArPSBpbnN0ci5sZW5ndGg7CiAgICB9CgogICAgX2xhYmVsQ291bnQgPSAwOwogICAgX2xhYmVscyA9IDxpbnQsIFN0cmluZz57fTsKICAgIF9tYXJrZXJzID0gPGludCwgTGlzdDxTdHJpbmc+Pnt9OwogIH0KCiAgSW5zdHJ1Y3Rpb24gZGVjb2RlSW5zdHJ1Y3Rpb25BdChpbnQgcG9zKSB7CiAgICBPcGNvZGUgb3Bjb2RlID0gT3Bjb2RlLnZhbHVlc1tfYnl0ZWNvZGVbcG9zXV07CiAgICBib29sIGlzV2lkZSA9IGlzV2lkZU9wY29kZShvcGNvZGUpOwogICAgaWYgKGlzV2lkZSkgewogICAgICBvcGNvZGUgPSBmcm9tV2lkZU9wY29kZShvcGNvZGUpOwogICAgfQoKICAgIGZpbmFsIGZvcm1hdCA9IEJ5dGVjb2RlRm9ybWF0c1tvcGNvZGVdOwogICAgZmluYWwgb3BlcmFuZHMgPSBfZGVjb2RlT3BlcmFuZHMoZm9ybWF0LCBwb3MsIGlzV2lkZSk7CiAgICByZXR1cm4gbmV3IEluc3RydWN0aW9uKG9wY29kZSwgaXNXaWRlLCBvcGVyYW5kcywgcG9zKTsKICB9CgogIExpc3Q8aW50PiBfZGVjb2RlT3BlcmFuZHMoRm9ybWF0IGZvcm1hdCwgaW50IHBvcywgYm9vbCBpc1dpZGUpIHsKICAgIHN3aXRjaCAoZm9ybWF0LmVuY29kaW5nKSB7CiAgICAgIGNhc2UgRW5jb2RpbmcuazA6CiAgICAgICAgcmV0dXJuIGNvbnN0IFtdOwogICAgICBjYXNlIEVuY29kaW5nLmtBOgogICAgICAgIHJldHVybiBbX2J5dGVjb2RlW3BvcyArIDFdXTsKICAgICAgY2FzZSBFbmNvZGluZy5rRDoKICAgICAgICByZXR1cm4gaXNXaWRlID8gW19kZWNvZGVVaW50MzJBdChwb3MgKyAxKV0gOiBbX2J5dGVjb2RlW3BvcyArIDFdXTsKICAgICAgY2FzZSBFbmNvZGluZy5rWDoKICAgICAgICByZXR1cm4gaXNXaWRlCiAgICAgICAgICAgID8gW19kZWNvZGVVaW50MzJBdChwb3MgKyAxKS50b1NpZ25lZCgzMildCiAgICAgICAgICAgIDogW19ieXRlY29kZVtwb3MgKyAxXS50b1NpZ25lZCg4KV07CiAgICAgIGNhc2UgRW5jb2Rpbmcua1Q6CiAgICAgICAgcmV0dXJuIGlzV2lkZQogICAgICAgICAgICA/IFsKICAgICAgICAgICAgICAgIChfYnl0ZWNvZGVbcG9zICsgMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAoX2J5dGVjb2RlW3BvcyArIDJdIDw8IDgpICsKICAgICAgICAgICAgICAgICAgICAgICAgKF9ieXRlY29kZVtwb3MgKyAzXSA8PCAxNikpCiAgICAgICAgICAgICAgICAgICAgLnRvU2lnbmVkKDI0KQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgOiBbX2J5dGVjb2RlW3BvcyArIDFdLnRvU2lnbmVkKDgpXTsKICAgICAgY2FzZSBFbmNvZGluZy5rQUU6CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIF9ieXRlY29kZVtwb3MgKyAxXSwKICAgICAgICAgIGlzV2lkZSA/IF9kZWNvZGVVaW50MzJBdChwb3MgKyAyKSA6IF9ieXRlY29kZVtwb3MgKyAyXSwKICAgICAgICBdOwogICAgICBjYXNlIEVuY29kaW5nLmtBWToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgX2J5dGVjb2RlW3BvcyArIDFdLAogICAgICAgICAgaXNXaWRlCiAgICAgICAgICAgICAgPyBfZGVjb2RlVWludDMyQXQocG9zICsgMikudG9TaWduZWQoMzIpCiAgICAgICAgICAgICAgOiBfYnl0ZWNvZGVbcG9zICsgMl0udG9TaWduZWQoOCkKICAgICAgICBdOwogICAgICBjYXNlIEVuY29kaW5nLmtERjoKICAgICAgICByZXR1cm4gaXNXaWRlCiAgICAgICAgICAgID8gW19kZWNvZGVVaW50MzJBdChwb3MgKyAxKSwgX2J5dGVjb2RlW3BvcyArIDVdXQogICAgICAgICAgICA6IFtfYnl0ZWNvZGVbcG9zICsgMV0sIF9ieXRlY29kZVtwb3MgKyAyXV07CiAgICAgIGNhc2UgRW5jb2Rpbmcua0FCQzoKICAgICAgICByZXR1cm4gW19ieXRlY29kZVtwb3MgKyAxXSwgX2J5dGVjb2RlW3BvcyArIDJdLCBfYnl0ZWNvZGVbcG9zICsgM11dOwogICAgfQogICAgdGhyb3cgJ1VuZXhwZWN0ZWQgZm9ybWF0ICRmb3JtYXQnOwogIH0KCiAgX2RlY29kZVVpbnQzMkF0KGludCBwb3MpID0+CiAgICAgIF9ieXRlY29kZVtwb3NdICsKICAgICAgKF9ieXRlY29kZVtwb3MgKyAxXSA8PCA4KSArCiAgICAgIChfYnl0ZWNvZGVbcG9zICsgMl0gPDwgMTYpICsKICAgICAgKF9ieXRlY29kZVtwb3MgKyAzXSA8PCAyNCk7CgogIHZvaWQgX3NjYW5Gb3JKdW1wVGFyZ2V0cygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2luc3RydWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBpbnN0ciA9IF9pbnN0cnVjdGlvbnNbaV07CiAgICAgIGlmIChpc0p1bXAoaW5zdHIub3Bjb2RlKSkgewogICAgICAgIGZpbmFsIHRhcmdldCA9IGluc3RyLnBjICsgaW5zdHIub3BlcmFuZHNbMF07CiAgICAgICAgYXNzZXJ0KDAgPD0gdGFyZ2V0ICYmIHRhcmdldCA8IF9ieXRlY29kZS5sZW5ndGgpOwogICAgICAgIGlmICghX2xhYmVscy5jb250YWluc0tleSh0YXJnZXQpKSB7CiAgICAgICAgICBmaW5hbCBsYWJlbCA9ICdMJHsrK19sYWJlbENvdW50fSc7CiAgICAgICAgICBfbGFiZWxzW3RhcmdldF0gPSBsYWJlbDsKICAgICAgICAgIF9hZGRNYXJrZXIodGFyZ2V0LCAnJGxhYmVsOicpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfbWFya1RyeUJsb2NrcyhFeGNlcHRpb25zVGFibGUgZXhjZXB0aW9uc1RhYmxlKSB7CiAgICBmb3IgKHZhciB0cnlCbG9jayBpbiBleGNlcHRpb25zVGFibGUuYmxvY2tzKSB7CiAgICAgIGZpbmFsIGludCB0cnlJbmRleCA9IHRyeUJsb2NrLnRyeUluZGV4OwogICAgICBfYWRkTWFya2VyKHRyeUJsb2NrLnN0YXJ0UEMsICdUcnkgIyR0cnlJbmRleCBzdGFydDonKTsKICAgICAgX2FkZE1hcmtlcih0cnlCbG9jay5lbmRQQywgJ1RyeSAjJHRyeUluZGV4IGVuZDonKTsKICAgICAgX2FkZE1hcmtlcih0cnlCbG9jay5oYW5kbGVyUEMsICdUcnkgIyR0cnlJbmRleCBoYW5kbGVyOicpOwogICAgfQogIH0KCiAgdm9pZCBfbWFya0Fubm90YXRpb25zKExpc3Q8TWFwPGludCwgU3RyaW5nPj4gYW5ub3RhdGlvbnMpIHsKICAgIGZvciAodmFyIG1hcCBpbiBhbm5vdGF0aW9ucykgewogICAgICBtYXAuZm9yRWFjaCgoaW50IHBjLCBTdHJpbmcgYW5ub3RhdGlvbikgewogICAgICAgIF9hZGRNYXJrZXIocGMsICcjICRhbm5vdGF0aW9uJyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgdm9pZCBfYWRkTWFya2VyKGludCBwYywgU3RyaW5nIG1hcmtlcikgewogICAgZmluYWwgbWFya2VycyA9IChfbWFya2Vyc1twY10gPz89IDxTdHJpbmc+W10pOwogICAgbWFya2Vycy5hZGQobWFya2VyKTsKICB9CgogIFN0cmluZyBfZGlzYXNtKCkgewogICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoSW5zdHJ1Y3Rpb24gaW5zdHIgaW4gX2luc3RydWN0aW9ucykgewogICAgICBMaXN0PFN0cmluZz4gbWFya2VycyA9IF9tYXJrZXJzW2luc3RyLnBjXTsKICAgICAgaWYgKG1hcmtlcnMgIT0gbnVsbCkgewogICAgICAgIG1hcmtlcnMuZm9yRWFjaChvdXQud3JpdGVsbik7CiAgICAgIH0KICAgICAgd3JpdGVJbnN0cnVjdGlvbihvdXQsIGluc3RyKTsKICAgIH0KICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKICB9CgogIHZvaWQgd3JpdGVJbnN0cnVjdGlvbihTdHJpbmdCdWZmZXIgb3V0LCBJbnN0cnVjdGlvbiBpbnN0cikgewogICAgZmluYWwgZm9ybWF0ID0gQnl0ZWNvZGVGb3JtYXRzW2luc3RyLm9wY29kZV07CiAgICBhc3NlcnQoZm9ybWF0ICE9IG51bGwpOwoKICAgIG91dC53cml0ZSgnICAnKTsKCiAgICBjb25zdCBpbnQga09wY29kZVdpZHRoID0gMjA7CiAgICBjb25zdCBTdHJpbmcga09wY29kZVByZWZpeCA9ICdPcGNvZGUuayc7CgogICAgU3RyaW5nIG9wY29kZSA9IGluc3RyLm9wY29kZS50b1N0cmluZygpOwogICAgYXNzZXJ0KG9wY29kZS5zdGFydHNXaXRoKGtPcGNvZGVQcmVmaXgpKTsKICAgIG9wY29kZSA9IG9wY29kZS5zdWJzdHJpbmcoa09wY29kZVByZWZpeC5sZW5ndGgpOwoKICAgIGlmIChpbnN0ci5vcGVyYW5kcy5pc0VtcHR5KSB7CiAgICAgIG91dC53cml0ZWxuKG9wY29kZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBvdXQud3JpdGUob3Bjb2RlLnBhZFJpZ2h0KGtPcGNvZGVXaWR0aCkpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdHIub3BlcmFuZHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGkgPT0gMCkgewogICAgICAgIG91dC53cml0ZSgnICcpOwogICAgICB9IGVsc2UgewogICAgICAgIG91dC53cml0ZSgnLCAnKTsKICAgICAgfQogICAgICBmaW5hbCBvcGVyYW5kID0KICAgICAgICAgIF9mb3JtYXRPcGVyYW5kKGluc3RyLnBjLCBmb3JtYXQub3BlcmFuZHNbaV0sIGluc3RyLm9wZXJhbmRzW2ldKTsKICAgICAgb3V0LndyaXRlKG9wZXJhbmQpOwogICAgfQoKICAgIG91dC53cml0ZWxuKCk7CiAgfQoKICBTdHJpbmcgX2Zvcm1hdE9wZXJhbmQoaW50IHBjLCBPcGVyYW5kIGZtdCwgaW50IHZhbHVlKSB7CiAgICBzd2l0Y2ggKGZtdCkgewogICAgICBjYXNlIE9wZXJhbmQubm9uZToKICAgICAgICBicmVhazsKICAgICAgY2FzZSBPcGVyYW5kLmltbToKICAgICAgICByZXR1cm4gJyR2YWx1ZSc7CiAgICAgIGNhc2UgT3BlcmFuZC5saXQ6CiAgICAgICAgcmV0dXJuICdDUCMkdmFsdWUnOwogICAgICBjYXNlIE9wZXJhbmQucmVnOgogICAgICAgIHJldHVybiAnciR2YWx1ZSc7CiAgICAgIGNhc2UgT3BlcmFuZC54ZWc6CiAgICAgICAgcmV0dXJuICh2YWx1ZSA8IDApID8gJ0ZQWyR2YWx1ZV0nIDogJ3IkdmFsdWUnOwogICAgICBjYXNlIE9wZXJhbmQudGd0OgogICAgICAgIHJldHVybiAoX2xhYmVscyA9PSBudWxsKQogICAgICAgICAgICA/IHZhbHVlLnRvU3RyaW5nKCkKICAgICAgICAgICAgOiBfbGFiZWxzW3BjICsgdmFsdWVdID8/ICh0aHJvdyAnTGFiZWwgbm90IGZvdW5kJyk7CiAgICAgIGNhc2UgT3BlcmFuZC5zcGU6CiAgICAgICAgcmV0dXJuIFNwZWNpYWxJbmRleC52YWx1ZXNbdmFsdWVdCiAgICAgICAgICAgIC50b1N0cmluZygpCiAgICAgICAgICAgIC5zdWJzdHJpbmcoJ1NwZWNpYWxJbmRleC4nLmxlbmd0aCk7CiAgICB9CiAgICB0aHJvdyAnVW5leHBlY3RlZCBvcGVyYW5kIGZvcm1hdCAkZm10JzsKICB9Cn0KgPQATk48ASIBGgFAARMaARQXFRwQAUEBMAE+AQxGAQwcJSQuBAIBHRcjExwjAUouFRslHyUGFgQBMRUaBAEjMgEtMS4gGwYBFR8mBAEtMygSJwYBLDs7BAFDHxgZGCUYSxgWNjAYFhAmNDQiEDAZER5CCxkRHhE2LwsZFj04Gk0GJwQBHhciIyIBHzUmIjU6LC0jKQoIBgQBOTMuPTlBBgQBPiMwKQoGBAErMxkEARUrLzEdJggkBhsEAT8yHAEVASEtAS0uNQEiGw4GAS4BNhQYDxkIFksaBgETBAE6ExkPGBkYHBgaGDcYIR9AGCoYMAYsBAIBJXBhY2thZ2U6dm0vYnl0ZWNvZGUvZGlzYXNzZW1ibGVyLmRhcnRcZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi90cmFuc2Zvcm1hdGlvbnMvY29udGludWF0aW9uLmRhcnTAAL1XLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkga2VybmVsLnRyYW5zZm9ybWF0aW9ucy5jb250aW51YXRpb247CgppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKCmltcG9ydCAnLi4vYXN0LmRhcnQnOwppbXBvcnQgJy4uL2NvcmVfdHlwZXMuZGFydCc7CmltcG9ydCAnLi4vdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICcuLi92aXNpdG9yLmRhcnQnOwoKaW1wb3J0ICdhc3luYy5kYXJ0JzsKCmNsYXNzIENvbnRpbnVhdGlvblZhcmlhYmxlcyB7CiAgc3RhdGljIGNvbnN0IGF3YWl0SnVtcFZhciA9ICc6YXdhaXRfanVtcF92YXInOwogIHN0YXRpYyBjb25zdCBhc3luY0NvbXBsZXRlciA9ICc6YXN5bmNfY29tcGxldGVyJzsKICBzdGF0aWMgY29uc3QgYXdhaXRDb250ZXh0VmFyID0gJzphd2FpdF9jdHhfdmFyJzsKICBzdGF0aWMgY29uc3QgYXN5bmNTdGFja1RyYWNlVmFyID0gJzphc3luY19zdGFja190cmFjZSc7CiAgc3RhdGljIGNvbnN0IGNvbnRyb2xsZXIgPSAnOmNvbnRyb2xsZXInOwogIHN0YXRpYyBjb25zdCBjb250cm9sbGVyU3RyZWFtVmFyID0gJzpjb250cm9sbGVyX3N0cmVhbSc7CiAgc3RhdGljIGNvbnN0IGV4Y2VwdGlvblBhcmFtID0gJzpleGNlcHRpb24nOwogIHN0YXRpYyBjb25zdCBzdGFja1RyYWNlUGFyYW0gPSAnOnN0YWNrX3RyYWNlJzsKCiAgc3RhdGljIFN0cmluZyBzYXZlZFRyeUNvbnRleHRWYXIoaW50IGRlcHRoKSA9PiAnOnNhdmVkX3RyeV9jb250ZXh0X3ZhciRkZXB0aCc7CiAgc3RhdGljIFN0cmluZyBleGNlcHRpb25WYXIoaW50IGRlcHRoKSA9PiAnOmV4Y2VwdGlvbiRkZXB0aCc7CiAgc3RhdGljIFN0cmluZyBzdGFja1RyYWNlVmFyKGludCBkZXB0aCkgPT4gJzpzdGFja190cmFjZSRkZXB0aCc7Cn0KCnZvaWQgdHJhbnNmb3JtTGlicmFyaWVzKAogICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICB7Ym9vbCBwcm9kdWN0TW9kZX0pIHsKICB2YXIgaGVscGVyID0KICAgICAgbmV3IEhlbHBlck5vZGVzLmZyb21Db3JlVHlwZXModHlwZUVudmlyb25tZW50LmNvcmVUeXBlcywgcHJvZHVjdE1vZGUpOwogIHZhciByZXdyaXRlciA9IG5ldyBSZWN1cnNpdmVDb250aW51YXRpb25SZXdyaXRlcigKICAgICAgaGVscGVyLCBuZXcgU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dC5zdGFja2VkKHR5cGVFbnZpcm9ubWVudCkpOwogIGZvciAodmFyIGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICByZXdyaXRlci5yZXdyaXRlTGlicmFyeShsaWJyYXJ5KTsKICB9Cn0KCkNvbXBvbmVudCB0cmFuc2Zvcm1Db21wb25lbnQoCiAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBDb21wb25lbnQgY29tcG9uZW50LAogICAge2Jvb2wgcHJvZHVjdE1vZGV9KSB7CiAgdmFyIGhlbHBlciA9CiAgICAgIG5ldyBIZWxwZXJOb2Rlcy5mcm9tQ29yZVR5cGVzKHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMsIHByb2R1Y3RNb2RlKTsKICB2YXIgcmV3cml0ZXIgPSBuZXcgUmVjdXJzaXZlQ29udGludWF0aW9uUmV3cml0ZXIoCiAgICAgIGhlbHBlciwgbmV3IFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQuc3RhY2tlZCh0eXBlRW52aXJvbm1lbnQpKTsKICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUNvbXBvbmVudChjb21wb25lbnQpOwp9CgpQcm9jZWR1cmUgdHJhbnNmb3JtUHJvY2VkdXJlKAogICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgUHJvY2VkdXJlIHByb2NlZHVyZSwKICAgIHtib29sIHByb2R1Y3RNb2RlfSkgewogIHZhciBoZWxwZXIgPQogICAgICBuZXcgSGVscGVyTm9kZXMuZnJvbUNvcmVUeXBlcyh0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLCBwcm9kdWN0TW9kZSk7CiAgdmFyIHJld3JpdGVyID0gbmV3IFJlY3Vyc2l2ZUNvbnRpbnVhdGlvblJld3JpdGVyKAogICAgICBoZWxwZXIsIG5ldyBTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0LnN0YWNrZWQodHlwZUVudmlyb25tZW50KSk7CiAgcmV0dXJuIHJld3JpdGVyLnZpc2l0UHJvY2VkdXJlKHByb2NlZHVyZSk7Cn0KCmNsYXNzIFJlY3Vyc2l2ZUNvbnRpbnVhdGlvblJld3JpdGVyIGV4dGVuZHMgVHJhbnNmb3JtZXIgewogIGZpbmFsIEhlbHBlck5vZGVzIGhlbHBlcjsKCiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiBhc3luY0p1bXBWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICBDb250aW51YXRpb25WYXJpYWJsZXMuYXdhaXRKdW1wVmFyLAogICAgICBpbml0aWFsaXplcjogbmV3IEludExpdGVyYWwoMCkpOwogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gYXN5bmNDb250ZXh0VmFyaWFibGUgPQogICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihDb250aW51YXRpb25WYXJpYWJsZXMuYXdhaXRDb250ZXh0VmFyKTsKCiAgU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dCBzdGF0aWNUeXBlQ29udGV4dDsKCiAgUmVjdXJzaXZlQ29udGludWF0aW9uUmV3cml0ZXIodGhpcy5oZWxwZXIsIHRoaXMuc3RhdGljVHlwZUNvbnRleHQpOwoKICBDb21wb25lbnQgcmV3cml0ZUNvbXBvbmVudChDb21wb25lbnQgbm9kZSkgewogICAgcmV0dXJuIG5vZGUuYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKICB9CgogIExpYnJhcnkgcmV3cml0ZUxpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBzdGF0aWNUeXBlQ29udGV4dC5lbnRlck1lbWJlcihub2RlKTsKICAgIGZpbmFsIHJlc3VsdCA9IHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CiAgICBzdGF0aWNUeXBlQ29udGV4dC5sZWF2ZU1lbWJlcihub2RlKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHN0YXRpY1R5cGVDb250ZXh0LmVudGVyTWVtYmVyKG5vZGUpOwogICAgZmluYWwgcmVzdWx0ID0gc3VwZXIudmlzaXRDb25zdHJ1Y3Rvcihub2RlKTsKICAgIHN0YXRpY1R5cGVDb250ZXh0LmxlYXZlTWVtYmVyKG5vZGUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBzdGF0aWNUeXBlQ29udGV4dC5lbnRlck1lbWJlcihub2RlKTsKICAgIGZpbmFsIHJlc3VsdCA9IG5vZGUuaXNBYnN0cmFjdCA/IG5vZGUgOiBzdXBlci52aXNpdFByb2NlZHVyZShub2RlKTsKICAgIHN0YXRpY1R5cGVDb250ZXh0LmxlYXZlTWVtYmVyKG5vZGUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIHN0YXRpY1R5cGVDb250ZXh0LmVudGVyTGlicmFyeShub2RlKTsKICAgIExpYnJhcnkgcmVzdWx0ID0gc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogICAgc3RhdGljVHlwZUNvbnRleHQubGVhdmVMaWJyYXJ5KG5vZGUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBzd2l0Y2ggKG5vZGUuYXN5bmNNYXJrZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jOgogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKAogICAgICAgICAgICBuZXcgUmVjdXJzaXZlQ29udGludWF0aW9uUmV3cml0ZXIoaGVscGVyLCBzdGF0aWNUeXBlQ29udGV4dCkpOwogICAgICAgIHJldHVybiBub2RlOwogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNTdGFyOgogICAgICAgIHJldHVybiBuZXcgU3luY1N0YXJGdW5jdGlvblJld3JpdGVyKGhlbHBlciwgbm9kZSwgc3RhdGljVHlwZUNvbnRleHQpCiAgICAgICAgICAgIC5yZXdyaXRlKCk7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmM6CiAgICAgICAgcmV0dXJuIG5ldyBBc3luY0Z1bmN0aW9uUmV3cml0ZXIoaGVscGVyLCBub2RlLCBzdGF0aWNUeXBlQ29udGV4dCkKICAgICAgICAgICAgLnJld3JpdGUoKTsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luY1N0YXI6CiAgICAgICAgcmV0dXJuIG5ldyBBc3luY1N0YXJGdW5jdGlvblJld3JpdGVyKGhlbHBlciwgbm9kZSwgc3RhdGljVHlwZUNvbnRleHQpCiAgICAgICAgICAgIC5yZXdyaXRlKCk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUcmVlTm9kZSB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IHN0bXQpIHsKICAgIGlmIChzdG10LmlzQXN5bmMpIHsKICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0Rm9ySW5TdGF0ZW1lbnQoc3RtdCk7CiAgICB9CgogICAgLy8gVHJhbnNmb3JtCiAgICAvLwogICAgLy8gICBmb3IgKHt2YXIvZmluYWx9IFQgPHZhcmlhYmxlPiBpbiA8aXRlcmFibGU+KSB7IC4uLiB9CiAgICAvLwogICAgLy8gSW50bwogICAgLy8KICAgIC8vICB7CiAgICAvLyAgICBmaW5hbCBJdGVyYXRvcjxUPiA6c3luYy1mb3ItaXRlcmF0b3IgPSA8aXRlcmFibGU+Lml0ZXJhdG9yOwogICAgLy8gICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci5tb3ZlTmV4dCgpIDspIHsKICAgIC8vICAgICAgICB7dmFyL2ZpbmFsfSBUIHZhcmlhYmxlID0gOml0ZXJhdG9yLmN1cnJlbnQ7CiAgICAvLyAgICAgICAgLi4uCiAgICAvLyAgICAgIH0KICAgIC8vICAgIH0KICAgIC8vICB9CiAgICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzID0gc3RhdGljVHlwZUNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlczsKCiAgICAvLyBUT0RPKDM5NTY1KTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIGZvckluRWxlbWVudFR5cGUuCiAgICBoZWxwZXIudW5zYWZlQ2FzdDsKICAgIGZpbmFsIERhcnRUeXBlIGl0ZXJhYmxlVHlwZSA9CiAgICAgICAgc3RtdC5pdGVyYWJsZS5nZXRTdGF0aWNUeXBlKHN0YXRpY1R5cGVDb250ZXh0KTsKICAgIGZpbmFsIERhcnRUeXBlIGl0ZXJhdGlvblR5cGUgPSBpdGVyYWJsZVR5cGUgaXMgSW50ZXJmYWNlVHlwZQogICAgICAgID8gc3RhdGljVHlwZUNvbnRleHQudHlwZUVudmlyb25tZW50LmZvckluRWxlbWVudFR5cGUoc3RtdCwgaXRlcmFibGVUeXBlKQogICAgICAgIDogRHluYW1pY1R5cGUoKTsKICAgIGZpbmFsIGV4cGVjdGVkSXRlcmFibGVUeXBlID0gSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuaXRlcmFibGVDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBbaXRlcmF0aW9uVHlwZV0pOwogICAgZmluYWwgaXRlcmF0b3JUeXBlID0gSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuaXRlcmF0b3JDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBbaXRlcmF0aW9uVHlwZV0pOwoKICAgIC8vIFRPRE8oMzk1NjYpOiBJdGVyYWJsZSBleHByZXNzaW9uIGlzIG5vdCBhbHdheXMgd2VsbCB0eXBlZCBpbiB0aGUgQVNULgogICAgZmluYWwgdHlwZWRJdGVyYWJsZSA9IFN0YXRpY0ludm9jYXRpb24oaGVscGVyLnVuc2FmZUNhc3QsCiAgICAgICAgQXJndW1lbnRzKFtzdG10Lml0ZXJhYmxlXSwgdHlwZXM6IFtleHBlY3RlZEl0ZXJhYmxlVHlwZV0pKTsKICAgIGZpbmFsIGl0ZXJhdG9yID0gVmFyaWFibGVEZWNsYXJhdGlvbignOnN5bmMtZm9yLWl0ZXJhdG9yJywKICAgICAgICBpbml0aWFsaXplcjogUHJvcGVydHlHZXQoCiAgICAgICAgICAgIHR5cGVkSXRlcmFibGUsIE5hbWUoJ2l0ZXJhdG9yJyksIGNvcmVUeXBlcy5pdGVyYWJsZUdldEl0ZXJhdG9yKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3RtdC5pdGVyYWJsZS5maWxlT2Zmc2V0LAogICAgICAgIHR5cGU6IGl0ZXJhdG9yVHlwZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gc3RtdC5pdGVyYWJsZS5maWxlT2Zmc2V0OwoKICAgIGZpbmFsIGNvbmRpdGlvbiA9IE1ldGhvZEludm9jYXRpb24oVmFyaWFibGVHZXQoaXRlcmF0b3IpLCBOYW1lKCdtb3ZlTmV4dCcpLAogICAgICAgIEFyZ3VtZW50cyhbXSksIGNvcmVUeXBlcy5pdGVyYXRvck1vdmVOZXh0KQogICAgICAuLmZpbGVPZmZzZXQgPSBzdG10Lml0ZXJhYmxlLmZpbGVPZmZzZXQ7CgogICAgZmluYWwgdmFyaWFibGUgPSBzdG10LnZhcmlhYmxlCiAgICAgIC4uaW5pdGlhbGl6ZXIgPSAoUHJvcGVydHlHZXQoCiAgICAgICAgICBWYXJpYWJsZUdldChpdGVyYXRvciksIE5hbWUoJ2N1cnJlbnQnKSwgY29yZVR5cGVzLml0ZXJhdG9yR2V0Q3VycmVudCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBzdG10LmJvZHlPZmZzZXQpOwoKICAgIGZpbmFsIEJsb2NrIGJvZHkgPSBCbG9jayhbdmFyaWFibGUsIHN0bXQuYm9keV0pOwoKICAgIHJldHVybiBCbG9jayhbaXRlcmF0b3IsIEZvclN0YXRlbWVudChbXSwgY29uZGl0aW9uLCBbXSwgYm9keSldKQogICAgICAgIC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgQ29udGludWF0aW9uUmV3cml0ZXJCYXNlIGV4dGVuZHMgUmVjdXJzaXZlQ29udGludWF0aW9uUmV3cml0ZXIgewogIGZpbmFsIEZ1bmN0aW9uTm9kZSBlbmNsb3NpbmdGdW5jdGlvbjsKCiAgaW50IGN1cnJlbnRUcnlEZXB0aCA9IDA7IC8vIE5lc3RpbmcgZGVwdGggZm9yIHRyeS1ibG9ja3MuCiAgaW50IGN1cnJlbnRDYXRjaERlcHRoID0gMDsgLy8gTmVzdGluZyBkZXB0aCBmb3IgY2F0Y2gtYmxvY2tzLgogIGludCBjYXB0dXJlZFRyeURlcHRoID0gMDsgLy8gRGVlcGVzdCB5aWVsZCBwb2ludCB3aXRoaW4gYSB0cnktYmxvY2suCiAgaW50IGNhcHR1cmVkQ2F0Y2hEZXB0aCA9IDA7IC8vIERlZXBlc3QgeWllbGQgcG9pbnQgd2l0aGluIGEgY2F0Y2gtYmxvY2suCgogIENvbnRpbnVhdGlvblJld3JpdGVyQmFzZShIZWxwZXJOb2RlcyBoZWxwZXIsIHRoaXMuZW5jbG9zaW5nRnVuY3Rpb24sCiAgICAgIFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQpCiAgICAgIDogc3VwZXIoaGVscGVyLCBzdGF0aWNUeXBlQ29udGV4dCk7CgogIC8vLyBHaXZlbiBhIGNvbnRhaW5lciBbdHlwZV0sIHdoaWNoIGlzIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIGdpdmVuCiAgLy8vIFtjb250YWluZXJDbGFzc10gZXh0cmFjdCBpdHMgZWxlbWVudCB0eXBlLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBlbGVtZW50IHR5cGUgZnJvbSBGdXR1cmU8VD4sIEl0ZXJhYmxlPFQ+IGFuZAogIC8vLyBTdHJlYW08VD4gaW5zdGFudGlhdGlvbnMuCiAgLy8vCiAgLy8vIElmIGluc3RhbnRpYXRpb24gaXMgbm90IHZhbGlkIChoYXMgbW9yZSB0aGFuIDEgdHlwZSBhcmd1bWVudCkgdGhlbgogIC8vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgW0ludmFsaWRUeXBlXS4KICBzdGF0aWMgRGFydFR5cGUgZWxlbWVudFR5cGVGcm9tKENsYXNzIGNvbnRhaW5lckNsYXNzLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGlmICh0eXBlLmNsYXNzTm9kZSA9PSBjb250YWluZXJDbGFzcykgewogICAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgRGFydFR5cGUgZWxlbWVudFR5cGVGcm9tUmV0dXJuVHlwZShDbGFzcyBleHBlY3RlZCkgPT4KICAgICAgZWxlbWVudFR5cGVGcm9tKGV4cGVjdGVkLCBlbmNsb3NpbmdGdW5jdGlvbi5yZXR1cm5UeXBlKTsKCiAgU3RhdGVtZW50IGNyZWF0ZUNvbnRpbnVhdGlvblBvaW50KFtFeHByZXNzaW9uIHZhbHVlXSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gbmV3IE51bGxMaXRlcmFsKCk7CiAgICBjYXB0dXJlZFRyeURlcHRoID0gbWF0aC5tYXgoY2FwdHVyZWRUcnlEZXB0aCwgY3VycmVudFRyeURlcHRoKTsKICAgIGNhcHR1cmVkQ2F0Y2hEZXB0aCA9IG1hdGgubWF4KGNhcHR1cmVkQ2F0Y2hEZXB0aCwgY3VycmVudENhdGNoRGVwdGgpOwogICAgcmV0dXJuIG5ldyBZaWVsZFN0YXRlbWVudCh2YWx1ZSwgaXNOYXRpdmU6IHRydWUpOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICBpZiAobm9kZS5ib2R5ICE9IG51bGwpIHsKICAgICAgKytjdXJyZW50VHJ5RGVwdGg7CiAgICAgIG5vZGUuYm9keSA9IG5vZGUuYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICBub2RlLmJvZHk/LnBhcmVudCA9IG5vZGU7CiAgICAgIC0tY3VycmVudFRyeURlcHRoOwogICAgfQoKICAgICsrY3VycmVudENhdGNoRGVwdGg7CiAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuY2F0Y2hlcywgdGhpcywgbm9kZSk7CiAgICAtLWN1cnJlbnRDYXRjaERlcHRoOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBUcmVlTm9kZSB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBub2RlKSB7CiAgICBpZiAobm9kZS5ib2R5ICE9IG51bGwpIHsKICAgICAgKytjdXJyZW50VHJ5RGVwdGg7CiAgICAgIG5vZGUuYm9keSA9IG5vZGUuYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICBub2RlLmJvZHk/LnBhcmVudCA9IG5vZGU7CiAgICAgIC0tY3VycmVudFRyeURlcHRoOwogICAgfQogICAgaWYgKG5vZGUuZmluYWxpemVyICE9IG51bGwpIHsKICAgICAgKytjdXJyZW50Q2F0Y2hEZXB0aDsKICAgICAgbm9kZS5maW5hbGl6ZXIgPSBub2RlLmZpbmFsaXplci5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICBub2RlLmZpbmFsaXplcj8ucGFyZW50ID0gbm9kZTsKICAgICAgLS1jdXJyZW50Q2F0Y2hEZXB0aDsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgSXRlcmFibGU8VmFyaWFibGVEZWNsYXJhdGlvbj4gY3JlYXRlQ2FwdHVyZWRUcnlWYXJpYWJsZXMoKSA9PgogICAgICBuZXcgSXRlcmFibGUuZ2VuZXJhdGUoCiAgICAgICAgICBjYXB0dXJlZFRyeURlcHRoLAogICAgICAgICAgKGRlcHRoKSA9PiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgICAgICAgICBDb250aW51YXRpb25WYXJpYWJsZXMuc2F2ZWRUcnlDb250ZXh0VmFyKGRlcHRoKSkpOwoKICBJdGVyYWJsZTxWYXJpYWJsZURlY2xhcmF0aW9uPiBjcmVhdGVDYXB0dXJlZENhdGNoVmFyaWFibGVzKCkgPT4KICAgICAgbmV3IEl0ZXJhYmxlLmdlbmVyYXRlKGNhcHR1cmVkQ2F0Y2hEZXB0aCkuZXhwYW5kKChkZXB0aCkgPT4gWwogICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihDb250aW51YXRpb25WYXJpYWJsZXMuZXhjZXB0aW9uVmFyKGRlcHRoKSksCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKENvbnRpbnVhdGlvblZhcmlhYmxlcy5zdGFja1RyYWNlVmFyKGRlcHRoKSksCiAgICAgICAgICBdKTsKCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZURlY2xhcmF0aW9ucygpIHsKICAgIGFzeW5jSnVtcFZhcmlhYmxlLnR5cGUgPSBzdGF0aWNUeXBlQ29udGV4dC50eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzCiAgICAgICAgLmludFJhd1R5cGUoc3RhdGljVHlwZUNvbnRleHQubm9uTnVsbGFibGUpOwogICAgcmV0dXJuIFthc3luY0p1bXBWYXJpYWJsZSwgYXN5bmNDb250ZXh0VmFyaWFibGVdCiAgICAgIC4uYWRkQWxsKGNyZWF0ZUNhcHR1cmVkVHJ5VmFyaWFibGVzKCkpCiAgICAgIC4uYWRkQWxsKGNyZWF0ZUNhcHR1cmVkQ2F0Y2hWYXJpYWJsZXMoKSk7CiAgfQp9CgpjbGFzcyBTeW5jU3RhckZ1bmN0aW9uUmV3cml0ZXIgZXh0ZW5kcyBDb250aW51YXRpb25SZXdyaXRlckJhc2UgewogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gaXRlcmF0b3JWYXJpYWJsZTsKCiAgU3luY1N0YXJGdW5jdGlvblJld3JpdGVyKEhlbHBlck5vZGVzIGhlbHBlciwgRnVuY3Rpb25Ob2RlIGVuY2xvc2luZ0Z1bmN0aW9uLAogICAgICBTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0IHN0YXRpY1R5cGVDb250ZXh0KQogICAgICA6IGl0ZXJhdG9yVmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignOml0ZXJhdG9yJykKICAgICAgICAgIC4udHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgIGhlbHBlci5zeW5jSXRlcmF0b3JDbGFzcywgc3RhdGljVHlwZUNvbnRleHQubnVsbGFibGUsIFsKICAgICAgICAgICAgQ29udGludWF0aW9uUmV3cml0ZXJCYXNlLmVsZW1lbnRUeXBlRnJvbSgKICAgICAgICAgICAgICAgIGhlbHBlci5pdGVyYWJsZUNsYXNzLCBlbmNsb3NpbmdGdW5jdGlvbi5yZXR1cm5UeXBlKQogICAgICAgICAgXSksCiAgICAgICAgc3VwZXIoaGVscGVyLCBlbmNsb3NpbmdGdW5jdGlvbiwgc3RhdGljVHlwZUNvbnRleHQpOwoKICBGdW5jdGlvbk5vZGUgcmV3cml0ZSgpIHsKICAgIC8vIDpzeW5jX29wKDppdGVyYXRvcikgewogICAgLy8gICAgIG1vZGlmaWVkIDxub2RlLmJvZHk+OwogICAgLy8gfQoKICAgIC8vIE5vdGU6IFN5bmNZaWVsZGluZyBmdW5jdGlvbnMgaGF2ZSBubyBEYXJ0IGVxdWl2YWxlbnQuIFNpbmNlIHRoZXkgYXJlCiAgICAvLyBzeW5jaHJvbm91cywgd2UgdXNlIFN5bmMuIChOb3RlIGFsc28gdGhhdCB0aGUgRGFydCBWTSBiYWNrZW5kIHVzZXMgdGhlCiAgICAvLyBEYXJ0IGFzeW5jIG1hcmtlciB0byBkZWNpZGUgaWYgZnVuY3Rpb25zIGFyZSBkZWJ1Z2dhYmxlLikKICAgIGZpbmFsIG5lc3RlZENsb3N1cmVWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCI6c3luY19vcCIpOwogICAgZmluYWwgZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25Ob2RlKGJ1aWxkQ2xvc3VyZUJvZHkoKSwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogW2l0ZXJhdG9yVmFyaWFibGVdLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IDEsCiAgICAgICAgYXN5bmNNYXJrZXI6IEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZywKICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IEFzeW5jTWFya2VyLlN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0Z1bmN0aW9uLmZpbGVPZmZzZXQKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gZW5jbG9zaW5nRnVuY3Rpb24uZmlsZUVuZE9mZnNldAogICAgICAuLnJldHVyblR5cGUgPSBoZWxwZXIuY29yZVR5cGVzLmJvb2xMZWdhY3lSYXdUeXBlOwoKICAgIGZpbmFsIGNsb3N1cmVGdW5jdGlvbiA9CiAgICAgICAgbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24obmVzdGVkQ2xvc3VyZVZhcmlhYmxlLCBmdW5jdGlvbikKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0Z1bmN0aW9uLnBhcmVudC5maWxlT2Zmc2V0OwoKICAgIC8vIHJldHVybiBuZXcgX1N5bmNJdGVyYWJsZTxUPig6c3luY19ib2R5KTsKICAgIGZpbmFsIGFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudHMoW25ldyBWYXJpYWJsZUdldChuZXN0ZWRDbG9zdXJlVmFyaWFibGUpXSwKICAgICAgICB0eXBlczogW2VsZW1lbnRUeXBlRnJvbVJldHVyblR5cGUoaGVscGVyLml0ZXJhYmxlQ2xhc3MpXSk7CiAgICBmaW5hbCByZXR1cm5TdGF0ZW1lbnQgPSBuZXcgUmV0dXJuU3RhdGVtZW50KAogICAgICAgIG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oaGVscGVyLnN5bmNJdGVyYWJsZUNvbnN0cnVjdG9yLCBhcmd1bWVudHMpKTsKCiAgICBlbmNsb3NpbmdGdW5jdGlvbi5ib2R5ID0gbmV3IEJsb2NrKFtdCiAgICAgIC4uYWRkQWxsKHZhcmlhYmxlRGVjbGFyYXRpb25zKCkpCiAgICAgIC4uYWRkQWxsKFtjbG9zdXJlRnVuY3Rpb24sIHJldHVyblN0YXRlbWVudF0pKTsKICAgIGVuY2xvc2luZ0Z1bmN0aW9uLmJvZHkucGFyZW50ID0gZW5jbG9zaW5nRnVuY3Rpb247CiAgICBlbmNsb3NpbmdGdW5jdGlvbi5hc3luY01hcmtlciA9IEFzeW5jTWFya2VyLlN5bmM7CiAgICByZXR1cm4gZW5jbG9zaW5nRnVuY3Rpb247CiAgfQoKICBTdGF0ZW1lbnQgYnVpbGRDbG9zdXJlQm9keSgpIHsKICAgIC8vIFRoZSBib2R5IHdpbGwgaW5zZXJ0IGNhbGxzIHRvCiAgICAvLyAgICA6aXRlcmF0b3IuY3VycmVudF89CiAgICAvLyAgICA6aXRlcmF0b3IuaXNZaWVsZEVhY2g9CiAgICAvLyBhbmQgcmV0dXJuIGB0cnVlYCBhcyBsb25nIGFzIGl0IGRpZCBzb21ldGhpbmcgYW5kIGBmYWxzZWAgd2hlbiBpdCdzIGRvbmUuCiAgICByZXR1cm4gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+WwogICAgICBlbmNsb3NpbmdGdW5jdGlvbi5ib2R5LmFjY2VwdDxUcmVlTm9kZT4odGhpcyksCiAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQobmV3IEJvb2xMaXRlcmFsKGZhbHNlKSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbmNsb3NpbmdGdW5jdGlvbi5maWxlRW5kT2Zmc2V0CiAgICBdKTsKICB9CgogIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSkgewogICAgRXhwcmVzc2lvbiB0cmFuc2Zvcm1lZEV4cHJlc3Npb24gPSBub2RlLmV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKCiAgICB2YXIgc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICBpZiAobm9kZS5pc1lpZWxkU3RhcikgewogICAgICBzdGF0ZW1lbnRzLmFkZChuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgUHJvcGVydHlTZXQoCiAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoaXRlcmF0b3JWYXJpYWJsZSksCiAgICAgICAgICBuZXcgTmFtZSgiX3lpZWxkRWFjaEl0ZXJhYmxlIiwgaGVscGVyLmNvcmVMaWJyYXJ5KSwKICAgICAgICAgIHRyYW5zZm9ybWVkRXhwcmVzc2lvbiwKICAgICAgICAgIGhlbHBlci5zeW5jSXRlcmF0b3JZaWVsZEVhY2hJdGVyYWJsZSkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlbWVudHMuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBQcm9wZXJ0eVNldCgKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChpdGVyYXRvclZhcmlhYmxlKSwKICAgICAgICAgIG5ldyBOYW1lKCJfY3VycmVudCIsIGhlbHBlci5jb3JlTGlicmFyeSksCiAgICAgICAgICB0cmFuc2Zvcm1lZEV4cHJlc3Npb24sCiAgICAgICAgICBoZWxwZXIuc3luY0l0ZXJhdG9yQ3VycmVudCkpKTsKICAgIH0KCiAgICBzdGF0ZW1lbnRzLmFkZChjcmVhdGVDb250aW51YXRpb25Qb2ludChuZXcgQm9vbExpdGVyYWwodHJ1ZSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCk7CiAgICByZXR1cm4gbmV3IEJsb2NrKHN0YXRlbWVudHMpOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIHN5bmMqIGZ1bmN0aW9ucyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuCiAgICBhc3NlcnQobm9kZS5leHByZXNzaW9uID09IG51bGwgfHwgbm9kZS5leHByZXNzaW9uIGlzIE51bGxMaXRlcmFsKTsKICAgIG5vZGUuZXhwcmVzc2lvbiA9IG5ldyBCb29sTGl0ZXJhbChmYWxzZSkuLnBhcmVudCA9IG5vZGU7CiAgICByZXR1cm4gbm9kZTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEFzeW5jUmV3cml0ZXJCYXNlIGV4dGVuZHMgQ29udGludWF0aW9uUmV3cml0ZXJCYXNlIHsKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIG5lc3RlZENsb3N1cmVWYXJpYWJsZSA9CiAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCI6YXN5bmNfb3AiKTsKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHN0YWNrVHJhY2VWYXJpYWJsZSA9CiAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKENvbnRpbnVhdGlvblZhcmlhYmxlcy5hc3luY1N0YWNrVHJhY2VWYXIpOwogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdGhlbkNvbnRpbnVhdGlvblZhcmlhYmxlID0KICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oIjphc3luY19vcF90aGVuIik7CiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiBjYXRjaEVycm9yQ29udGludWF0aW9uVmFyaWFibGUgPQogICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigiOmFzeW5jX29wX2Vycm9yIik7CgogIExhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZEJvZHk7CgogIEV4cHJlc3Npb25MaWZ0ZXIgZXhwcmVzc2lvblJld3JpdGVyOwoKICBBc3luY1Jld3JpdGVyQmFzZShIZWxwZXJOb2RlcyBoZWxwZXIsIEZ1bmN0aW9uTm9kZSBlbmNsb3NpbmdGdW5jdGlvbiwKICAgICAgU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQpCiAgICAgIDogc3VwZXIoaGVscGVyLCBlbmNsb3NpbmdGdW5jdGlvbiwgc3RhdGljVHlwZUNvbnRleHQpIHt9CgogIHZvaWQgc2V0dXBBc3luY0NvbnRpbnVhdGlvbnMoTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMpIHsKICAgIGV4cHJlc3Npb25SZXdyaXRlciA9IG5ldyBFeHByZXNzaW9uTGlmdGVyKHRoaXMpOwoKICAgIC8vIHZhciA6YXN5bmNfc3RhY2tfdHJhY2U7CiAgICBzdGF0ZW1lbnRzLmFkZChzdGFja1RyYWNlVmFyaWFibGUpOwoKICAgIC8vIHZhciA6YXN5bmNfb3BfdGhlbjsKICAgIHN0YXRlbWVudHMuYWRkKHRoZW5Db250aW51YXRpb25WYXJpYWJsZSk7CgogICAgLy8gdmFyIDphc3luY19vcF9lcnJvcjsKICAgIHN0YXRlbWVudHMuYWRkKGNhdGNoRXJyb3JDb250aW51YXRpb25WYXJpYWJsZSk7CgogICAgLy8gOmFzeW5jX29wKFs6cmVzdWx0LCA6ZXhjZXB0aW9uLCA6c3RhY2tfdHJhY2VdKSB7CiAgICAvLyAgICAgbW9kaWZpZWQgPG5vZGUuYm9keT47CiAgICAvLyB9CiAgICBmaW5hbCBwYXJhbWV0ZXJzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+WwogICAgICBleHByZXNzaW9uUmV3cml0ZXIuYXN5bmNSZXN1bHQsCiAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKENvbnRpbnVhdGlvblZhcmlhYmxlcy5leGNlcHRpb25QYXJhbSksCiAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKENvbnRpbnVhdGlvblZhcmlhYmxlcy5zdGFja1RyYWNlUGFyYW0pLAogICAgXTsKCiAgICAvLyBOb3RlOiBTeW5jWWllbGRpbmcgZnVuY3Rpb25zIGhhdmUgbm8gRGFydCBlcXVpdmFsZW50LiBTaW5jZSB0aGV5IGFyZQogICAgLy8gc3luY2hyb25vdXMsIHdlIHVzZSBTeW5jLiAoTm90ZSBhbHNvIHRoYXQgdGhlIERhcnQgVk0gYmFja2VuZCB1c2VzIHRoZQogICAgLy8gRGFydCBhc3luYyBtYXJrZXIgdG8gZGVjaWRlIGlmIGZ1bmN0aW9ucyBhcmUgZGVidWdnYWJsZS4pCiAgICBmaW5hbCBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUoYnVpbGRXcmFwcGVkQm9keSgpLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IDAsCiAgICAgICAgYXN5bmNNYXJrZXI6IEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZywKICAgICAgICBkYXJ0QXN5bmNNYXJrZXI6IEFzeW5jTWFya2VyLlN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0Z1bmN0aW9uLmZpbGVPZmZzZXQKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gZW5jbG9zaW5nRnVuY3Rpb24uZmlsZUVuZE9mZnNldDsKCiAgICAvLyBUaGUgYXdhaXQgZXhwcmVzc2lvbiBsaWZ0ZXIgbWlnaHQgaGF2ZSBjcmVhdGVkIGEgbnVtYmVyIG9mCiAgICAvLyBbVmFyaWFibGVEZWNsYXJhdGlvbnNdLgogICAgLy8gVE9ETyhrdXN0ZXJtYW5uKTogSWYgd2UgZGlkbid0IG5lZWQgYW55IHZhcmlhYmxlcyB3ZSBzaG91bGQgbm90IGVtaXQKICAgIC8vIHRoZXNlLgogICAgc3RhdGVtZW50cy5hZGRBbGwodmFyaWFibGVEZWNsYXJhdGlvbnMoKSk7CiAgICBzdGF0ZW1lbnRzLmFkZEFsbChleHByZXNzaW9uUmV3cml0ZXIudmFyaWFibGVzKTsKCiAgICAvLyBOb3cgYWRkIHRoZSBjbG9zdXJlIGZ1bmN0aW9uIGl0c2VsZi4KICAgIGZpbmFsIGNsb3N1cmVGdW5jdGlvbiA9CiAgICAgICAgbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24obmVzdGVkQ2xvc3VyZVZhcmlhYmxlLCBmdW5jdGlvbikKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0Z1bmN0aW9uLnBhcmVudC5maWxlT2Zmc2V0OwogICAgc3RhdGVtZW50cy5hZGQoY2xvc3VyZUZ1bmN0aW9uKTsKCiAgICAvLyA6YXN5bmNfc3RhY2tfdHJhY2UgPSBfYXN5bmNTdGFja1RyYWNlSGVscGVyKGFzeW5jQm9keSk7CiAgICBmaW5hbCBzdGFja1RyYWNlID0gbmV3IFN0YXRpY0ludm9jYXRpb24oaGVscGVyLmFzeW5jU3RhY2tUcmFjZUhlbHBlciwKICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltuZXcgVmFyaWFibGVHZXQobmVzdGVkQ2xvc3VyZVZhcmlhYmxlKV0pKTsKICAgIGZpbmFsIHN0YWNrVHJhY2VBc3NpZ24gPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICBuZXcgVmFyaWFibGVTZXQoc3RhY2tUcmFjZVZhcmlhYmxlLCBzdGFja1RyYWNlKSk7CiAgICBzdGF0ZW1lbnRzLmFkZChzdGFja1RyYWNlQXNzaWduKTsKCiAgICAvLyA6YXN5bmNfb3BfdGhlbiA9IF9hc3luY1RoZW5XcmFwcGVySGVscGVyKGFzeW5jQm9keSk7CiAgICBmaW5hbCBib3VuZFRoZW5DbG9zdXJlID0gbmV3IFN0YXRpY0ludm9jYXRpb24oaGVscGVyLmFzeW5jVGhlbldyYXBwZXIsCiAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bbmV3IFZhcmlhYmxlR2V0KG5lc3RlZENsb3N1cmVWYXJpYWJsZSldKSk7CiAgICBmaW5hbCB0aGVuQ2xvc3VyZVZhcmlhYmxlQXNzaWduID0gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgbmV3IFZhcmlhYmxlU2V0KHRoZW5Db250aW51YXRpb25WYXJpYWJsZSwgYm91bmRUaGVuQ2xvc3VyZSkpOwogICAgc3RhdGVtZW50cy5hZGQodGhlbkNsb3N1cmVWYXJpYWJsZUFzc2lnbik7CgogICAgLy8gOmFzeW5jX29wX2Vycm9yID0gX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKGFzeW5jQm9keSk7CiAgICBmaW5hbCBib3VuZENhdGNoRXJyb3JDbG9zdXJlID0gbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgaGVscGVyLmFzeW5jRXJyb3JXcmFwcGVyLAogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W25ldyBWYXJpYWJsZUdldChuZXN0ZWRDbG9zdXJlVmFyaWFibGUpXSkpOwogICAgZmluYWwgY2F0Y2hFcnJvckNsb3N1cmVWYXJpYWJsZUFzc2lnbiA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgIG5ldyBWYXJpYWJsZVNldCgKICAgICAgICAgICAgY2F0Y2hFcnJvckNvbnRpbnVhdGlvblZhcmlhYmxlLCBib3VuZENhdGNoRXJyb3JDbG9zdXJlKSk7CiAgICBzdGF0ZW1lbnRzLmFkZChjYXRjaEVycm9yQ2xvc3VyZVZhcmlhYmxlQXNzaWduKTsKICB9CgogIFN0YXRlbWVudCBidWlsZFdyYXBwZWRCb2R5KCkgewogICAgKytjdXJyZW50VHJ5RGVwdGg7CiAgICBsYWJlbGVkQm9keSA9IG5ldyBMYWJlbGVkU3RhdGVtZW50KG51bGwpOwogICAgbGFiZWxlZEJvZHkuYm9keSA9IHZpc2l0RGVsaW1pdGVkKGVuY2xvc2luZ0Z1bmN0aW9uLmJvZHkpCiAgICAgIC4ucGFyZW50ID0gbGFiZWxlZEJvZHk7CiAgICAtLWN1cnJlbnRUcnlEZXB0aDsKCiAgICB2YXIgZXhjZXB0aW9uVmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigiOmV4Y2VwdGlvbiIpOwogICAgdmFyIHN0YWNrVHJhY2VWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCI6c3RhY2tfdHJhY2UiKTsKCiAgICByZXR1cm4gbmV3IFRyeUNhdGNoKAogICAgICBidWlsZFJldHVybihsYWJlbGVkQm9keSksCiAgICAgIDxDYXRjaD5bCiAgICAgICAgbmV3IENhdGNoKAogICAgICAgICAgICBleGNlcHRpb25WYXJpYWJsZSwKICAgICAgICAgICAgbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+WwogICAgICAgICAgICAgIGJ1aWxkQ2F0Y2hCb2R5KGV4Y2VwdGlvblZhcmlhYmxlLCBzdGFja1RyYWNlVmFyaWFibGUpCiAgICAgICAgICAgIF0pLAogICAgICAgICAgICBzdGFja1RyYWNlOiBzdGFja1RyYWNlVmFyaWFibGUpCiAgICAgIF0sCiAgICAgIGlzU3ludGhldGljOiB0cnVlLAogICAgKTsKICB9CgogIFN0YXRlbWVudCBidWlsZENhdGNoQm9keSgKICAgICAgU3RhdGVtZW50IGV4Y2VwdGlvblZhcmlhYmxlLCBTdGF0ZW1lbnQgc3RhY2tUcmFjZVZhcmlhYmxlKTsKCiAgU3RhdGVtZW50IGJ1aWxkUmV0dXJuKFN0YXRlbWVudCBib2R5KTsKCiAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwoKICBUcmVlTm9kZSB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBzdG10KSB7CiAgICBzdG10LmV4cHJlc3Npb24gPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZShzdG10LmV4cHJlc3Npb24sIHN0YXRlbWVudHMpCiAgICAgIC4ucGFyZW50ID0gc3RtdDsKICAgIHN0YXRlbWVudHMuYWRkKHN0bXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdEJsb2NrKEJsb2NrIHN0bXQpIHsKICAgIHZhciBzYXZlZCA9IHN0YXRlbWVudHM7CiAgICBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgIGZvciAodmFyIHN0YXRlbWVudCBpbiBzdG10LnN0YXRlbWVudHMpIHsKICAgICAgc3RhdGVtZW50LmFjY2VwdDxUcmVlTm9kZT4odGhpcyk7CiAgICB9CiAgICBzYXZlZC5hZGQobmV3IEJsb2NrKHN0YXRlbWVudHMpKTsKICAgIHN0YXRlbWVudHMgPSBzYXZlZDsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRFbXB0eVN0YXRlbWVudChFbXB0eVN0YXRlbWVudCBzdG10KSB7CiAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBzdG10KSB7CiAgICB2YXIgc2F2ZWQgPSBzdGF0ZW1lbnRzOwogICAgc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICBmb3IgKHZhciBzdGF0ZW1lbnQgaW4gc3RtdC5zdGF0ZW1lbnRzKSB7CiAgICAgIHN0YXRlbWVudC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgfQogICAgc2F2ZWQuYWRkKG5ldyBCbG9jayhzdGF0ZW1lbnRzKSk7CiAgICBzdGF0ZW1lbnRzID0gc2F2ZWQ7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFRyZWVOb2RlIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBzdG10KSB7CiAgICB2YXIgY29uZEVmZmVjdHMgPSA8U3RhdGVtZW50PltdOwogICAgdmFyIGNvbmQgPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZShzdG10LmNvbmRpdGlvbiwgY29uZEVmZmVjdHMpOwogICAgaWYgKHN0bXQubWVzc2FnZSA9PSBudWxsKSB7CiAgICAgIHN0bXQuY29uZGl0aW9uID0gY29uZC4ucGFyZW50ID0gc3RtdDsKICAgICAgLy8gSWYgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBjb25kaXRpb24gcHJvZHVjZWQgYSBub24tZW1wdHkgbGlzdCBvZgogICAgICAvLyBzdGF0ZW1lbnRzLCBlbnN1cmUgdGhleSBhcmUgZ3VhcmRlZCBieSB3aGV0aGVyIGFzc2VydHMgYXJlIGVuYWJsZWQuCiAgICAgIHN0YXRlbWVudHMuYWRkKAogICAgICAgICAgY29uZEVmZmVjdHMuaXNFbXB0eSA/IHN0bXQgOiBuZXcgQXNzZXJ0QmxvY2soY29uZEVmZmVjdHMuLmFkZChzdG10KSkpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBUaGUgdHJhbnNsYXRpb24gZGVwZW5kcyBvbiB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGJ5IGNhc2VzLgogICAgU3RhdGVtZW50IHJlc3VsdDsKICAgIHZhciBtc2dFZmZlY3RzID0gPFN0YXRlbWVudD5bXTsKICAgIHN0bXQubWVzc2FnZSA9IGV4cHJlc3Npb25SZXdyaXRlci5yZXdyaXRlKHN0bXQubWVzc2FnZSwgbXNnRWZmZWN0cykKICAgICAgLi5wYXJlbnQgPSBzdG10OwogICAgaWYgKGNvbmRFZmZlY3RzLmlzRW1wdHkpIHsKICAgICAgaWYgKG1zZ0VmZmVjdHMuaXNFbXB0eSkgewogICAgICAgIC8vIFRoZSBjb25kaXRpb24gcmV3cm90ZSB0byAoW10sIEMpIGFuZCB0aGUgbWVzc2FnZSByZXdyb3RlIHRvIChbXSwgTSkuCiAgICAgICAgLy8gVGhlIHJlc3VsdCBpcwogICAgICAgIC8vCiAgICAgICAgLy8gYXNzZXJ0KEMsIE0pCiAgICAgICAgc3RtdC5jb25kaXRpb24gPSBjb25kLi5wYXJlbnQgPSBzdG10OwogICAgICAgIHJlc3VsdCA9IHN0bXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIGNvbmRpdGlvbiByZXdyb3RlIHRvIChbXSwgQykgYW5kIHRoZSBtZXNzYWdlIHJld3JvdGUgdG8gKFMqLCBNKQogICAgICAgIC8vIHdoZXJlIFMqIGlzIG5vbi1lbXB0eS4gIFRoZSByZXN1bHQgaXMKICAgICAgICAvLwogICAgICAgIC8vIGFzc2VydCB7IGlmIChDKSB7fSBlbHNlIHsgUyo7IGFzc2VydChmYWxzZSwgTSk7IH19CiAgICAgICAgc3RtdC5jb25kaXRpb24gPSBuZXcgQm9vbExpdGVyYWwoZmFsc2UpLi5wYXJlbnQgPSBzdG10OwogICAgICAgIHJlc3VsdCA9IG5ldyBBc3NlcnRCbG9jayhbCiAgICAgICAgICBuZXcgSWZTdGF0ZW1lbnQoCiAgICAgICAgICAgICAgY29uZCwgbmV3IEVtcHR5U3RhdGVtZW50KCksIG5ldyBCbG9jayhtc2dFZmZlY3RzLi5hZGQoc3RtdCkpKQogICAgICAgIF0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobXNnRWZmZWN0cy5pc0VtcHR5KSB7CiAgICAgICAgLy8gVGhlIGNvbmRpdGlvbiByZXdyb3RlIHRvIChTKiwgQykgd2hlcmUgUyogaXMgbm9uLWVtcHR5IGFuZCB0aGUKICAgICAgICAvLyBtZXNzYWdlIHJld3JvdGUgdG8gKFtdLCBNKS4gIFRoZSByZXN1bHQgaXMKICAgICAgICAvLwogICAgICAgIC8vIGFzc2VydCB7IFMqOyBhc3NlcnQoQywgTSk7IH0KICAgICAgICBzdG10LmNvbmRpdGlvbiA9IGNvbmQuLnBhcmVudCA9IHN0bXQ7CiAgICAgICAgY29uZEVmZmVjdHMuYWRkKHN0bXQpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSBjb25kaXRpb24gcmV3cm90ZSB0byAoUzAqLCBDKSBhbmQgdGhlIG1lc3NhZ2UgcmV3cm90ZSB0byAoUzEqLCBNKQogICAgICAgIC8vIHdoZXJlIGJvdGggUzAqIGFuZCBTMSogYXJlIG5vbi1lbXB0eS4gIFRoZSByZXN1bHQgaXMKICAgICAgICAvLwogICAgICAgIC8vIGFzc2VydCB7IFMwKjsgaWYgKEMpIHt9IGVsc2UgeyBTMSo7IGFzc2VydChmYWxzZSwgTSk7IH19CiAgICAgICAgc3RtdC5jb25kaXRpb24gPSBuZXcgQm9vbExpdGVyYWwoZmFsc2UpLi5wYXJlbnQgPSBzdG10OwogICAgICAgIGNvbmRFZmZlY3RzLmFkZChuZXcgSWZTdGF0ZW1lbnQoCiAgICAgICAgICAgIGNvbmQsIG5ldyBFbXB0eVN0YXRlbWVudCgpLCBuZXcgQmxvY2sobXNnRWZmZWN0cy4uYWRkKHN0bXQpKSkpOwogICAgICB9CiAgICAgIHJlc3VsdCA9IG5ldyBBc3NlcnRCbG9jayhjb25kRWZmZWN0cyk7CiAgICB9CiAgICBzdGF0ZW1lbnRzLmFkZChyZXN1bHQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBTdGF0ZW1lbnQgdmlzaXREZWxpbWl0ZWQoU3RhdGVtZW50IHN0bXQpIHsKICAgIHZhciBzYXZlZCA9IHN0YXRlbWVudHM7CiAgICBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgIHN0bXQuYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKICAgIFN0YXRlbWVudCByZXN1bHQgPQogICAgICAgIHN0YXRlbWVudHMubGVuZ3RoID09IDEgPyBzdGF0ZW1lbnRzLmZpcnN0IDogbmV3IEJsb2NrKHN0YXRlbWVudHMpOwogICAgc3RhdGVtZW50cyA9IHNhdmVkOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0YXRlbWVudCB2aXNpdExhYmVsZWRTdGF0ZW1lbnQoTGFiZWxlZFN0YXRlbWVudCBzdG10KSB7CiAgICBzdG10LmJvZHkgPSB2aXNpdERlbGltaXRlZChzdG10LmJvZHkpLi5wYXJlbnQgPSBzdG10OwogICAgc3RhdGVtZW50cy5hZGQoc3RtdCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFN0YXRlbWVudCB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IHN0bXQpIHsKICAgIHN0YXRlbWVudHMuYWRkKHN0bXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IHN0bXQpIHsKICAgIFN0YXRlbWVudCBib2R5ID0gdmlzaXREZWxpbWl0ZWQoc3RtdC5ib2R5KTsKICAgIExpc3Q8U3RhdGVtZW50PiBlZmZlY3RzID0gPFN0YXRlbWVudD5bXTsKICAgIEV4cHJlc3Npb24gY29uZCA9IGV4cHJlc3Npb25SZXdyaXRlci5yZXdyaXRlKHN0bXQuY29uZGl0aW9uLCBlZmZlY3RzKTsKICAgIGlmIChlZmZlY3RzLmlzRW1wdHkpIHsKICAgICAgc3RtdC5jb25kaXRpb24gPSBjb25kLi5wYXJlbnQgPSBzdG10OwogICAgICBzdG10LmJvZHkgPSBib2R5Li5wYXJlbnQgPSBzdG10OwogICAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoZSBjb25kaXRpb24gcmV3cm90ZSB0byBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIFMqIGFuZAogICAgICAvLyB2YWx1ZSBWLiAgUmV3cml0ZSB0aGUgbG9vcCB0bzoKICAgICAgLy8KICAgICAgLy8gTDogd2hpbGUgKHRydWUpIHsKICAgICAgLy8gICBTKgogICAgICAvLyAgIGlmIChWKSB7CiAgICAgIC8vICAgICBbYm9keV0KICAgICAgLy8gICBlbHNlIHsKICAgICAgLy8gICAgIGJyZWFrIEw7CiAgICAgIC8vICAgfQogICAgICAvLyB9CiAgICAgIExhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZCA9IG5ldyBMYWJlbGVkU3RhdGVtZW50KHN0bXQpOwogICAgICBzdG10LmNvbmRpdGlvbiA9IG5ldyBCb29sTGl0ZXJhbCh0cnVlKS4ucGFyZW50ID0gc3RtdDsKICAgICAgZWZmZWN0cy5hZGQobmV3IElmU3RhdGVtZW50KGNvbmQsIGJvZHksIG5ldyBCcmVha1N0YXRlbWVudChsYWJlbGVkKSkpOwogICAgICBzdG10LmJvZHkgPSBuZXcgQmxvY2soZWZmZWN0cykuLnBhcmVudCA9IHN0bXQ7CiAgICAgIHN0YXRlbWVudHMuYWRkKGxhYmVsZWQpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IHN0bXQpIHsKICAgIFN0YXRlbWVudCBib2R5ID0gdmlzaXREZWxpbWl0ZWQoc3RtdC5ib2R5KTsKICAgIExpc3Q8U3RhdGVtZW50PiBlZmZlY3RzID0gPFN0YXRlbWVudD5bXTsKICAgIHN0bXQuY29uZGl0aW9uID0gZXhwcmVzc2lvblJld3JpdGVyLnJld3JpdGUoc3RtdC5jb25kaXRpb24sIGVmZmVjdHMpCiAgICAgIC4ucGFyZW50ID0gc3RtdDsKICAgIGlmIChlZmZlY3RzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gVGhlIGNvbmRpdGlvbiByZXdyb3RlIHRvIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgUyogYW5kCiAgICAgIC8vIHZhbHVlIFYuICBBZGQgdGhlIHN0YXRlbWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgbG9vcCBib2R5LgogICAgICBCbG9jayBibG9jayA9IGJvZHkgaXMgQmxvY2sgPyBib2R5IDogYm9keSA9IG5ldyBCbG9jayg8U3RhdGVtZW50Pltib2R5XSk7CiAgICAgIGZvciAodmFyIGVmZmVjdCBpbiBlZmZlY3RzKSB7CiAgICAgICAgYmxvY2suc3RhdGVtZW50cy5hZGQoZWZmZWN0KTsKICAgICAgICBlZmZlY3QucGFyZW50ID0gYm9keTsKICAgICAgfQogICAgfQogICAgc3RtdC5ib2R5ID0gYm9keS4ucGFyZW50ID0gc3RtdDsKICAgIHN0YXRlbWVudHMuYWRkKHN0bXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgc3RtdCkgewogICAgLy8gQmVjYXVzZSBvZiBmb3ItbG9vcCBzY29waW5nIGFuZCB2YXJpYWJsZSBjYXB0dXJlLCBpdCBpcyB0cmlja3kgdG8gZGVhbAogICAgLy8gd2l0aCBhd2FpdCBpbiB0aGUgbG9vcCdzIHZhcmlhYmxlIGluaXRpYWxpemVycyBvciB1cGRhdGUgZXhwcmVzc2lvbnMuCiAgICBib29sIGlzU2ltcGxlID0gdHJ1ZTsKICAgIGludCBsZW5ndGggPSBzdG10LnZhcmlhYmxlcy5sZW5ndGg7CiAgICBMaXN0PExpc3Q8U3RhdGVtZW50Pj4gaW5pdEVmZmVjdHMgPSBuZXcgTGlzdDxMaXN0PFN0YXRlbWVudD4+KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbCA9IHN0bXQudmFyaWFibGVzW2ldOwogICAgICBpbml0RWZmZWN0c1tpXSA9IDxTdGF0ZW1lbnQ+W107CiAgICAgIGlmIChkZWNsLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBkZWNsLmluaXRpYWxpemVyID0gZXhwcmVzc2lvblJld3JpdGVyLnJld3JpdGUoCiAgICAgICAgICAgIGRlY2wuaW5pdGlhbGl6ZXIsIGluaXRFZmZlY3RzW2ldKQogICAgICAgICAgLi5wYXJlbnQgPSBkZWNsOwogICAgICB9CiAgICAgIGlzU2ltcGxlID0gaXNTaW1wbGUgJiYgaW5pdEVmZmVjdHNbaV0uaXNFbXB0eTsKICAgIH0KCiAgICBsZW5ndGggPSBzdG10LnVwZGF0ZXMubGVuZ3RoOwogICAgTGlzdDxMaXN0PFN0YXRlbWVudD4+IHVwZGF0ZUVmZmVjdHMgPSBuZXcgTGlzdDxMaXN0PFN0YXRlbWVudD4+KGxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHVwZGF0ZUVmZmVjdHNbaV0gPSA8U3RhdGVtZW50PltdOwogICAgICBzdG10LnVwZGF0ZXNbaV0gPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZSgKICAgICAgICAgIHN0bXQudXBkYXRlc1tpXSwgdXBkYXRlRWZmZWN0c1tpXSkKICAgICAgICAuLnBhcmVudCA9IHN0bXQ7CiAgICAgIGlzU2ltcGxlID0gaXNTaW1wbGUgJiYgdXBkYXRlRWZmZWN0c1tpXS5pc0VtcHR5OwogICAgfQoKICAgIFN0YXRlbWVudCBib2R5ID0gdmlzaXREZWxpbWl0ZWQoc3RtdC5ib2R5KTsKICAgIEV4cHJlc3Npb24gY29uZCA9IHN0bXQuY29uZGl0aW9uOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGNvbmRFZmZlY3RzOwogICAgaWYgKGNvbmQgIT0gbnVsbCkgewogICAgICBjb25kRWZmZWN0cyA9IDxTdGF0ZW1lbnQ+W107CiAgICAgIGNvbmQgPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZShzdG10LmNvbmRpdGlvbiwgY29uZEVmZmVjdHMpOwogICAgfQoKICAgIGlmIChpc1NpbXBsZSkgewogICAgICAvLyBJZiB0aGUgY29uZGl0aW9uIGNvbnRhaW5zIGF3YWl0LCB3ZSB1c2UgYSB0cmFuc2xhdGlvbiBsaWtlIHRoZSBvbmUgZm9yCiAgICAgIC8vIHdoaWxlIGxvb3BzLCBidXQgbGVhdmluZyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCB0aGUgdXBkYXRlCiAgICAgIC8vIGV4cHJlc3Npb25zIGluIHBsYWNlLgogICAgICBpZiAoY29uZEVmZmVjdHMgPT0gbnVsbCB8fCBjb25kRWZmZWN0cy5pc0VtcHR5KSB7CiAgICAgICAgaWYgKGNvbmQgIT0gbnVsbCkgc3RtdC5jb25kaXRpb24gPSBjb25kLi5wYXJlbnQgPSBzdG10OwogICAgICAgIHN0bXQuYm9keSA9IGJvZHkuLnBhcmVudCA9IHN0bXQ7CiAgICAgICAgc3RhdGVtZW50cy5hZGQoc3RtdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTGFiZWxlZFN0YXRlbWVudCBsYWJlbGVkID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQoc3RtdCk7CiAgICAgICAgLy8gTm8gY29uZGl0aW9uIGluIGEgZm9yIGxvb3AgaXMgdGhlIHNhbWUgYXMgdHJ1ZS4KICAgICAgICBzdG10LmNvbmRpdGlvbiA9IG51bGw7CiAgICAgICAgY29uZEVmZmVjdHMKICAgICAgICAgICAgLmFkZChuZXcgSWZTdGF0ZW1lbnQoY29uZCwgYm9keSwgbmV3IEJyZWFrU3RhdGVtZW50KGxhYmVsZWQpKSk7CiAgICAgICAgc3RtdC5ib2R5ID0gbmV3IEJsb2NrKGNvbmRFZmZlY3RzKS4ucGFyZW50ID0gc3RtdDsKICAgICAgICBzdGF0ZW1lbnRzLmFkZChsYWJlbGVkKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBJZiB0aGUgcmV3cml0ZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb3IgdXBkYXRlIGV4cHJlc3Npb25zIHByb2R1Y2VzIGEKICAgIC8vIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIHRoZW4gdGhlIGxvb3AgaXMgZGVzdWdhcmVkLiAgSWYgdGhlIGxvb3AKICAgIC8vIGhhcyB0aGUgZm9ybToKICAgIC8vCiAgICAvLyBsYWJlbDogZm9yIChUeXBlIHggPSBpbml0OyBjb25kOyB1cGRhdGUpIGJvZHkKICAgIC8vCiAgICAvLyBpdCBpcyB0cmFuc2xhdGVkIGFzIGlmIGl0IHdlcmU6CiAgICAvLwogICAgLy8gewogICAgLy8gICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIC8vICAgVHlwZSB0ZW1wOwogICAgLy8gICBsYWJlbDogd2hpbGUgKHRydWUpIHsKICAgIC8vICAgICBUeXBlIHg7CiAgICAvLyAgICAgaWYgKGZpcnN0KSB7CiAgICAvLyAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgLy8gICAgICAgeCA9IGluaXQ7CiAgICAvLyAgICAgfSBlbHNlIHsKICAgIC8vICAgICAgIHggPSB0ZW1wOwogICAgLy8gICAgICAgdXBkYXRlOwogICAgLy8gICAgIH0KICAgIC8vICAgICBpZiAoY29uZCkgewogICAgLy8gICAgICAgYm9keTsKICAgIC8vICAgICAgIHRlbXAgPSB4OwogICAgLy8gICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICBicmVhazsKICAgIC8vICAgICB9CiAgICAvLyAgIH0KICAgIC8vIH0KCiAgICAvLyBQbGFjZSB0aGUgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYm9keQogICAgLy8gc3RhdGVtZW50cyBhbmQgbW92ZSB0aGVpciBpbml0aWFsaXplcnMgdG8gYSBndWFyZGVkIGxpc3Qgb2Ygc3RhdGVtZW50cy4KICAgIC8vIEFkZCBhc3NpZ25tZW50cyB0byB0aGUgbG9vcCB2YXJpYWJsZXMgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0aW9ucyB0ZW1wCiAgICAvLyB2YXJpYWJsZXMgYmVmb3JlIHRoZSB1cGRhdGVzLgogICAgLy8KICAgIC8vIHRlbXBzLmZpcnN0IGlzIHRoZSBmbGFnICdmaXJzdCcuCiAgICAvLyBUT0RPKGttaWxsaWtpbikgYm9vbCB0eXBlIGZvciBmaXJzdC4KICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdGVtcHMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bCiAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKG5ldyBCb29sTGl0ZXJhbCh0cnVlKSwgaXNGaW5hbDogZmFsc2UpCiAgICBdOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGxvb3BCb2R5ID0gPFN0YXRlbWVudD5bXTsKICAgIExpc3Q8U3RhdGVtZW50PiBpbml0aWFsaXplcnMgPSA8U3RhdGVtZW50PlsKICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICBuZXcgVmFyaWFibGVTZXQodGVtcHMuZmlyc3QsIG5ldyBCb29sTGl0ZXJhbChmYWxzZSkpKQogICAgXTsKICAgIExpc3Q8U3RhdGVtZW50PiB1cGRhdGVzID0gPFN0YXRlbWVudD5bXTsKICAgIExpc3Q8U3RhdGVtZW50PiBuZXdCb2R5ID0gPFN0YXRlbWVudD5bYm9keV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0bXQudmFyaWFibGVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbCA9IHN0bXQudmFyaWFibGVzW2ldOwogICAgICB0ZW1wcy5hZGQobmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obnVsbCwgdHlwZTogZGVjbC50eXBlKSk7CiAgICAgIGxvb3BCb2R5LmFkZChkZWNsKTsKICAgICAgaWYgKGRlY2wuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIGluaXRpYWxpemVycy5hZGRBbGwoaW5pdEVmZmVjdHNbaV0pOwogICAgICAgIGluaXRpYWxpemVycy5hZGQoCiAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBWYXJpYWJsZVNldChkZWNsLCBkZWNsLmluaXRpYWxpemVyKSkpOwogICAgICAgIGRlY2wuaW5pdGlhbGl6ZXIgPSBudWxsOwogICAgICB9CiAgICAgIHVwZGF0ZXMuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgbmV3IFZhcmlhYmxlU2V0KGRlY2wsIG5ldyBWYXJpYWJsZUdldCh0ZW1wcy5sYXN0KSkpKTsKICAgICAgbmV3Qm9keS5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICBuZXcgVmFyaWFibGVTZXQodGVtcHMubGFzdCwgbmV3IFZhcmlhYmxlR2V0KGRlY2wpKSkpOwogICAgfQogICAgLy8gQWRkIHRoZSB1cGRhdGVzIHRvIHRoZWlyIGd1YXJkZWQgbGlzdCBvZiBzdGF0ZW1lbnRzLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG10LnVwZGF0ZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdXBkYXRlcy5hZGRBbGwodXBkYXRlRWZmZWN0c1tpXSk7CiAgICAgIHVwZGF0ZXMuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHN0bXQudXBkYXRlc1tpXSkpOwogICAgfQogICAgLy8gSW5pdGlhbGl6ZXJzIG9yIHVwZGF0ZXMgY291bGQgYmUgZW1wdHkuCiAgICBsb29wQm9keS5hZGQobmV3IElmU3RhdGVtZW50KG5ldyBWYXJpYWJsZUdldCh0ZW1wcy5maXJzdCksCiAgICAgICAgbmV3IEJsb2NrKGluaXRpYWxpemVycyksIG5ldyBCbG9jayh1cGRhdGVzKSkpOwoKICAgIExhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZCA9IG5ldyBMYWJlbGVkU3RhdGVtZW50KG51bGwpOwogICAgaWYgKGNvbmQgIT0gbnVsbCkgewogICAgICBsb29wQm9keS5hZGRBbGwoY29uZEVmZmVjdHMpOwogICAgfSBlbHNlIHsKICAgICAgY29uZCA9IG5ldyBCb29sTGl0ZXJhbCh0cnVlKTsKICAgIH0KICAgIGxvb3BCb2R5LmFkZCgKICAgICAgICBuZXcgSWZTdGF0ZW1lbnQoY29uZCwgbmV3IEJsb2NrKG5ld0JvZHkpLCBuZXcgQnJlYWtTdGF0ZW1lbnQobGFiZWxlZCkpKTsKICAgIGxhYmVsZWQuYm9keSA9CiAgICAgICAgbmV3IFdoaWxlU3RhdGVtZW50KG5ldyBCb29sTGl0ZXJhbCh0cnVlKSwgbmV3IEJsb2NrKGxvb3BCb2R5KSkKICAgICAgICAgIC4ucGFyZW50ID0gbGFiZWxlZDsKICAgIHN0YXRlbWVudHMuYWRkKG5ldyBCbG9jayg8U3RhdGVtZW50PltdCiAgICAgIC4uYWRkQWxsKHRlbXBzKQogICAgICAuLmFkZChsYWJlbGVkKSkpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IHN0bXQpIHsKICAgIGlmIChzdG10LmlzQXN5bmMpIHsKICAgICAgLy8gVHJhbnNmb3JtCiAgICAgIC8vCiAgICAgIC8vICAgYXdhaXQgZm9yIChUIHZhcmlhYmxlIGluIDxzdHJlYW0tZXhwcmVzc2lvbj4pIHsgLi4uIH0KICAgICAgLy8KICAgICAgLy8gVG8gKGluIHByb2R1Y3QgbW9kZSk6CiAgICAgIC8vCiAgICAgIC8vICAgewogICAgICAvLyAgICAgOnN0cmVhbSA9IDxzdHJlYW0tZXhwcmVzc2lvbj47CiAgICAgIC8vICAgICBfYXN5bmNTdGFyTGlzdGVuSGVscGVyKDpzdHJlYW0sIDphc3luY19vcCk7CiAgICAgIC8vICAgICBfU3RyZWFtSXRlcmF0b3I8VD4gOmZvci1pdGVyYXRvciA9IG5ldyBfU3RyZWFtSXRlcmF0b3I8VD4oOnN0cmVhbSk7CiAgICAgIC8vICAgICB0cnkgewogICAgICAvLyAgICAgICB3aGlsZSAoYXdhaXQgOmZvci1pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIC8vICAgICAgICAgVCA8dmFyaWFibGU+ID0gOmZvci1pdGVyYXRvci5jdXJyZW50OwogICAgICAvLyAgICAgICAgIC4uLgogICAgICAvLyAgICAgICB9CiAgICAgIC8vICAgICB9IGZpbmFsbHkgewogICAgICAvLyAgICAgICBpZiAoOmZvci1pdGVyYXRvci5fc3Vic2NyaXB0aW9uICE9IG51bGwpCiAgICAgIC8vICAgICAgICAgICBhd2FpdCA6Zm9yLWl0ZXJhdG9yLmNhbmNlbCgpOwogICAgICAvLyAgICAgfQogICAgICAvLyAgIH0KICAgICAgLy8KICAgICAgLy8gT3IgKGluIG5vbi1wcm9kdWN0IG1vZGUpOgogICAgICAvLwogICAgICAvLyAgIHsKICAgICAgLy8gICAgIDpzdHJlYW0gPSA8c3RyZWFtLWV4cHJlc3Npb24+OwogICAgICAvLyAgICAgX2FzeW5jU3Rhckxpc3RlbkhlbHBlcig6c3RyZWFtLCA6YXN5bmNfb3ApOwogICAgICAvLyAgICAgX1N0cmVhbUl0ZXJhdG9yPFQ+IDpmb3ItaXRlcmF0b3IgPSBuZXcgX1N0cmVhbUl0ZXJhdG9yPFQ+KDpzdHJlYW0pOwogICAgICAvLyAgICAgdHJ5IHsKICAgICAgLy8gICAgICAgd2hpbGUgKGxldCBfID0gX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyKDpzdHJlYW0pIGluCiAgICAgIC8vICAgICAgICAgICBhd2FpdCA6Zm9yLWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgLy8gICAgICAgICBUIDx2YXJpYWJsZT4gPSA6Zm9yLWl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgIC8vICAgICAgICAgLi4uCiAgICAgIC8vICAgICAgIH0KICAgICAgLy8gICAgIH0gZmluYWxseSB7CiAgICAgIC8vICAgICAgIGlmICg6Zm9yLWl0ZXJhdG9yLl9zdWJzY3JpcHRpb24gIT0gbnVsbCkKICAgICAgLy8gICAgICAgICAgIGF3YWl0IDpmb3ItaXRlcmF0b3IuY2FuY2VsKCk7CiAgICAgIC8vICAgICB9CiAgICAgIC8vICAgfQogICAgICB2YXIgdmFsdWVWYXJpYWJsZSA9IHN0bXQudmFyaWFibGU7CgogICAgICB2YXIgc3RyZWFtVmFyaWFibGUgPQogICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oJzpzdHJlYW0nLCBpbml0aWFsaXplcjogc3RtdC5pdGVyYWJsZSk7CgogICAgICB2YXIgYXN5bmNTdGFyTGlzdGVuSGVscGVyID0gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICBoZWxwZXIuYXN5bmNTdGFyTGlzdGVuSGVscGVyLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyhbCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChzdHJlYW1WYXJpYWJsZSksCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChuZXN0ZWRDbG9zdXJlVmFyaWFibGUpCiAgICAgICAgICBdKSkpOwoKICAgICAgdmFyIGl0ZXJhdG9yVmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignOmZvci1pdGVyYXRvcicsCiAgICAgICAgICBpbml0aWFsaXplcjogbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBoZWxwZXIuc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvciwKICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltuZXcgVmFyaWFibGVHZXQoc3RyZWFtVmFyaWFibGUpXSwKICAgICAgICAgICAgICAgICAgdHlwZXM6IFt2YWx1ZVZhcmlhYmxlLnR5cGVdKSksCiAgICAgICAgICB0eXBlOiBuZXcgSW50ZXJmYWNlVHlwZShoZWxwZXIuc3RyZWFtSXRlcmF0b3JDbGFzcywKICAgICAgICAgICAgICBzdGF0aWNUeXBlQ29udGV4dC5udWxsYWJsZSwgW3ZhbHVlVmFyaWFibGUudHlwZV0pKTsKCiAgICAgIC8vIGF3YWl0IDpmb3ItaXRlcmF0b3IubW92ZU5leHQoKQogICAgICB2YXIgY29uZGl0aW9uID0gbmV3IEF3YWl0RXhwcmVzc2lvbihuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChpdGVyYXRvclZhcmlhYmxlKSwKICAgICAgICAgIG5ldyBOYW1lKCdtb3ZlTmV4dCcpLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bXSksCiAgICAgICAgICBoZWxwZXIuc3RyZWFtSXRlcmF0b3JNb3ZlTmV4dCkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3RtdC5maWxlT2Zmc2V0OwoKICAgICAgRXhwcmVzc2lvbiB3aGlsZUNvbmRpdGlvbjsKICAgICAgaWYgKGhlbHBlci5wcm9kdWN0TW9kZSkgewogICAgICAgIHdoaWxlQ29uZGl0aW9uID0gY29uZGl0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIF9hc3luY1N0YXJNb3ZlTmV4dEhlbHBlcig6c3RyZWFtKQogICAgICAgIHZhciBhc3luY1N0YXJNb3ZlTmV4dENhbGwgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgaGVscGVyLmFzeW5jU3Rhck1vdmVOZXh0SGVscGVyLAogICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtuZXcgVmFyaWFibGVHZXQoc3RyZWFtVmFyaWFibGUpXSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBzdG10LmZpbGVPZmZzZXQ7CgogICAgICAgIC8vIGxldCBfID0gYXN5bmNTdGFyTW92ZU5leHRDYWxsIGluIChjb25kaXRpb24pCiAgICAgICAgd2hpbGVDb25kaXRpb24gPSBuZXcgTGV0KAogICAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsLCBpbml0aWFsaXplcjogYXN5bmNTdGFyTW92ZU5leHRDYWxsKSwKICAgICAgICAgICAgY29uZGl0aW9uKTsKICAgICAgfQoKICAgICAgLy8gVCA8dmFyaWFibGU+ID0gOmZvci1pdGVyYXRvci5jdXJyZW50OwogICAgICB2YWx1ZVZhcmlhYmxlLmluaXRpYWxpemVyID0gbmV3IFByb3BlcnR5R2V0KAogICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGl0ZXJhdG9yVmFyaWFibGUpLAogICAgICAgICAgbmV3IE5hbWUoJ2N1cnJlbnQnKSwKICAgICAgICAgIGhlbHBlci5zdHJlYW1JdGVyYXRvckN1cnJlbnQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3RtdC5ib2R5T2Zmc2V0OwogICAgICB2YWx1ZVZhcmlhYmxlLmluaXRpYWxpemVyLnBhcmVudCA9IHZhbHVlVmFyaWFibGU7CgogICAgICB2YXIgd2hpbGVCb2R5ID0gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+W3ZhbHVlVmFyaWFibGUsIHN0bXQuYm9keV0pOwogICAgICB2YXIgdHJ5Qm9keSA9IG5ldyBXaGlsZVN0YXRlbWVudCh3aGlsZUNvbmRpdGlvbiwgd2hpbGVCb2R5KTsKCiAgICAgIC8vIGlmICg6Zm9yLWl0ZXJhdG9yLl9zdWJzY3JpcHRpb24gIT0gbnVsbCkgYXdhaXQgOmZvci1pdGVyYXRvci5jYW5jZWwoKTsKICAgICAgdmFyIHRyeUZpbmFsaXplciA9IG5ldyBJZlN0YXRlbWVudCgKICAgICAgICAgIG5ldyBOb3QobmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICAgICAgbmV3IFByb3BlcnR5R2V0KAogICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoaXRlcmF0b3JWYXJpYWJsZSksCiAgICAgICAgICAgICAgICAgIG5ldyBOYW1lKCJfc3Vic2NyaXB0aW9uIiwgaGVscGVyLmFzeW5jTGlicmFyeSksCiAgICAgICAgICAgICAgICAgIGhlbHBlci5jb3JlVHlwZXMuc3RyZWFtSXRlcmF0b3JTdWJzY3JpcHRpb24pLAogICAgICAgICAgICAgIG5ldyBOYW1lKCI9PSIpLAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpXSksCiAgICAgICAgICAgICAgaGVscGVyLmNvcmVUeXBlcy5vYmplY3RFcXVhbHMpKSwKICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBBd2FpdEV4cHJlc3Npb24obmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGl0ZXJhdG9yVmFyaWFibGUpLAogICAgICAgICAgICAgIG5ldyBOYW1lKCdjYW5jZWwnKSwKICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltdKSwKICAgICAgICAgICAgICBoZWxwZXIuc3RyZWFtSXRlcmF0b3JDYW5jZWwpKSksCiAgICAgICAgICBudWxsKTsKCiAgICAgIHZhciB0cnlGaW5hbGx5ID0gbmV3IFRyeUZpbmFsbHkodHJ5Qm9keSwgdHJ5RmluYWxpemVyKTsKCiAgICAgIHZhciBibG9jayA9IG5ldyBCbG9jayg8U3RhdGVtZW50PlsKICAgICAgICBzdHJlYW1WYXJpYWJsZSwKICAgICAgICBhc3luY1N0YXJMaXN0ZW5IZWxwZXIsCiAgICAgICAgaXRlcmF0b3JWYXJpYWJsZSwKICAgICAgICB0cnlGaW5hbGx5CiAgICAgIF0pOwogICAgICBibG9jay5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnZpc2l0Rm9ySW5TdGF0ZW1lbnQoc3RtdCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgVHJlZU5vZGUgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IHN0bXQpIHsKICAgIHN0bXQuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25SZXdyaXRlci5yZXdyaXRlKHN0bXQuZXhwcmVzc2lvbiwgc3RhdGVtZW50cykKICAgICAgLi5wYXJlbnQgPSBzdG10OwogICAgZm9yICh2YXIgc3dpdGNoQ2FzZSBpbiBzdG10LmNhc2VzKSB7CiAgICAgIC8vIEV4cHJlc3Npb25zIGluIHN3aXRjaCBjYXNlcyBjYW5ub3QgY29udGFpbiBhd2FpdCBzbyB0aGV5IGRvIG5vdCBuZWVkIHRvCiAgICAgIC8vIGJlIHRyYW5zbGF0ZWQuCiAgICAgIHN3aXRjaENhc2UuYm9keSA9IHZpc2l0RGVsaW1pdGVkKHN3aXRjaENhc2UuYm9keSkuLnBhcmVudCA9IHN3aXRjaENhc2U7CiAgICB9CiAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBzdG10KSB7CiAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBzdG10KSB7CiAgICBzdG10LmNvbmRpdGlvbiA9IGV4cHJlc3Npb25SZXdyaXRlci5yZXdyaXRlKHN0bXQuY29uZGl0aW9uLCBzdGF0ZW1lbnRzKQogICAgICAuLnBhcmVudCA9IHN0bXQ7CiAgICBzdG10LnRoZW4gPSB2aXNpdERlbGltaXRlZChzdG10LnRoZW4pLi5wYXJlbnQgPSBzdG10OwogICAgaWYgKHN0bXQub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgc3RtdC5vdGhlcndpc2UgPSB2aXNpdERlbGltaXRlZChzdG10Lm90aGVyd2lzZSkuLnBhcmVudCA9IHN0bXQ7CiAgICB9CiAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBzdG10KSB7CiAgICArK2N1cnJlbnRUcnlEZXB0aDsKICAgIHN0bXQuYm9keSA9IHZpc2l0RGVsaW1pdGVkKHN0bXQuYm9keSkuLnBhcmVudCA9IHN0bXQ7CiAgICAtLWN1cnJlbnRUcnlEZXB0aDsKCiAgICArK2N1cnJlbnRDYXRjaERlcHRoOwogICAgZm9yICh2YXIgY2xhdXNlIGluIHN0bXQuY2F0Y2hlcykgewogICAgICBjbGF1c2UuYm9keSA9IHZpc2l0RGVsaW1pdGVkKGNsYXVzZS5ib2R5KS4ucGFyZW50ID0gY2xhdXNlOwogICAgfQogICAgLS1jdXJyZW50Q2F0Y2hEZXB0aDsKICAgIHN0YXRlbWVudHMuYWRkKHN0bXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdFRyeUZpbmFsbHkoVHJ5RmluYWxseSBzdG10KSB7CiAgICArK2N1cnJlbnRUcnlEZXB0aDsKICAgIHN0bXQuYm9keSA9IHZpc2l0RGVsaW1pdGVkKHN0bXQuYm9keSkuLnBhcmVudCA9IHN0bXQ7CiAgICAtLWN1cnJlbnRUcnlEZXB0aDsKICAgICsrY3VycmVudENhdGNoRGVwdGg7CiAgICBzdG10LmZpbmFsaXplciA9IHZpc2l0RGVsaW1pdGVkKHN0bXQuZmluYWxpemVyKS4ucGFyZW50ID0gc3RtdDsKICAgIC0tY3VycmVudENhdGNoRGVwdGg7CiAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBzdG10KSB7CiAgICBzdG10LmV4cHJlc3Npb24gPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZShzdG10LmV4cHJlc3Npb24sIHN0YXRlbWVudHMpCiAgICAgIC4ucGFyZW50ID0gc3RtdDsKICAgIHN0YXRlbWVudHMuYWRkKHN0bXQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBUcmVlTm9kZSB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBzdG10KSB7CiAgICBpZiAoc3RtdC5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIHN0bXQuaW5pdGlhbGl6ZXIgPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZSgKICAgICAgICAgIHN0bXQuaW5pdGlhbGl6ZXIsIHN0YXRlbWVudHMpCiAgICAgICAgLi5wYXJlbnQgPSBzdG10OwogICAgfQogICAgc3RhdGVtZW50cy5hZGQoc3RtdCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIFRyZWVOb2RlIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIHN0bXQpIHsKICAgIHN0bXQuZnVuY3Rpb24gPSBzdG10LmZ1bmN0aW9uLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IHN0bXQ7CiAgICBzdGF0ZW1lbnRzLmFkZChzdG10KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgZGVmYXVsdEV4cHJlc3Npb24oVHJlZU5vZGUgbm9kZSkgPT4gdGhyb3cgJ3VucmVhY2hhYmxlJzsKfQoKY2xhc3MgQXN5bmNTdGFyRnVuY3Rpb25SZXdyaXRlciBleHRlbmRzIEFzeW5jUmV3cml0ZXJCYXNlIHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIGNvbnRyb2xsZXJWYXJpYWJsZTsKCiAgQXN5bmNTdGFyRnVuY3Rpb25SZXdyaXRlcihIZWxwZXJOb2RlcyBoZWxwZXIsIEZ1bmN0aW9uTm9kZSBlbmNsb3NpbmdGdW5jdGlvbiwKICAgICAgU3RhdGljVHlwZUNvbnRleHQgc3RhdGljVHlwZUNvbnRleHQpCiAgICAgIDogc3VwZXIoaGVscGVyLCBlbmNsb3NpbmdGdW5jdGlvbiwgc3RhdGljVHlwZUNvbnRleHQpOwoKICBGdW5jdGlvbk5vZGUgcmV3cml0ZSgpIHsKICAgIHZhciBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKCiAgICBmaW5hbCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlRnJvbVJldHVyblR5cGUoaGVscGVyLnN0cmVhbUNsYXNzKTsKCiAgICAvLyBfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcjxUPiA6Y29udHJvbGxlcjsKICAgIGNvbnRyb2xsZXJWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICAgIENvbnRpbnVhdGlvblZhcmlhYmxlcy5jb250cm9sbGVyLAogICAgICAgIHR5cGU6IG5ldyBJbnRlcmZhY2VUeXBlKGhlbHBlci5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xhc3MsCiAgICAgICAgICAgIHN0YXRpY1R5cGVDb250ZXh0Lm51bGxhYmxlLCBbZWxlbWVudFR5cGVdKSk7CiAgICBzdGF0ZW1lbnRzLmFkZChjb250cm9sbGVyVmFyaWFibGUpOwoKICAgIC8vIGR5bmFtaWMgOmNvbnRyb2xsZXJfc3RyZWFtOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBjb250cm9sbGVyU3RyZWFtVmFyaWFibGUgPQogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKENvbnRpbnVhdGlvblZhcmlhYmxlcy5jb250cm9sbGVyU3RyZWFtVmFyKTsKICAgIHN0YXRlbWVudHMuYWRkKGNvbnRyb2xsZXJTdHJlYW1WYXJpYWJsZSk7CgogICAgc2V0dXBBc3luY0NvbnRpbnVhdGlvbnMoc3RhdGVtZW50cyk7CgogICAgLy8gOmNvbnRyb2xsZXIgPSBuZXcgX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXI8VD4oOmFzeW5jX29wKTsKICAgIHZhciBhcmd1bWVudHMgPSBuZXcgQXJndW1lbnRzKAogICAgICAgIDxFeHByZXNzaW9uPltuZXcgVmFyaWFibGVHZXQobmVzdGVkQ2xvc3VyZVZhcmlhYmxlKV0sCiAgICAgICAgdHlwZXM6IFtlbGVtZW50VHlwZV0pOwogICAgdmFyIGJ1aWxkQ29udHJvbGxlciA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgICAgaGVscGVyLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDb25zdHJ1Y3RvciwgYXJndW1lbnRzKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbmNsb3NpbmdGdW5jdGlvbi5maWxlT2Zmc2V0OwogICAgdmFyIHNldENvbnRyb2xsZXIgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICBuZXcgVmFyaWFibGVTZXQoY29udHJvbGxlclZhcmlhYmxlLCBidWlsZENvbnRyb2xsZXIpKTsKICAgIHN0YXRlbWVudHMuYWRkKHNldENvbnRyb2xsZXIpOwoKICAgIC8vIDpjb250cm9sbGVyX3N0cmVhbSA9IDpjb250cm9sbGVyLnN0cmVhbTsKICAgIHZhciBjb21wbGV0ZXJHZXQgPSBuZXcgVmFyaWFibGVHZXQoY29udHJvbGxlclZhcmlhYmxlKTsKICAgIHN0YXRlbWVudHMuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBWYXJpYWJsZVNldCgKICAgICAgICBjb250cm9sbGVyU3RyZWFtVmFyaWFibGUsCiAgICAgICAgbmV3IFByb3BlcnR5R2V0KGNvbXBsZXRlckdldCwgbmV3IE5hbWUoJ3N0cmVhbScsIGhlbHBlci5hc3luY0xpYnJhcnkpLAogICAgICAgICAgICBoZWxwZXIuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlclN0cmVhbSkpKSk7CgogICAgLy8gcmV0dXJuIDpjb250cm9sbGVyX3N0cmVhbTsKICAgIHZhciByZXR1cm5TdGF0ZW1lbnQgPQogICAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlR2V0KGNvbnRyb2xsZXJTdHJlYW1WYXJpYWJsZSkpOwogICAgc3RhdGVtZW50cy5hZGQocmV0dXJuU3RhdGVtZW50KTsKCiAgICBlbmNsb3NpbmdGdW5jdGlvbi5ib2R5ID0gbmV3IEJsb2NrKHN0YXRlbWVudHMpOwogICAgZW5jbG9zaW5nRnVuY3Rpb24uYm9keS5wYXJlbnQgPSBlbmNsb3NpbmdGdW5jdGlvbjsKICAgIGVuY2xvc2luZ0Z1bmN0aW9uLmFzeW5jTWFya2VyID0gQXN5bmNNYXJrZXIuU3luYzsKICAgIHJldHVybiBlbmNsb3NpbmdGdW5jdGlvbjsKICB9CgogIFN0YXRlbWVudCBidWlsZFdyYXBwZWRCb2R5KCkgewogICAgKytjdXJyZW50VHJ5RGVwdGg7CiAgICBTdGF0ZW1lbnQgYm9keSA9IHN1cGVyLmJ1aWxkV3JhcHBlZEJvZHkoKTsKICAgIC0tY3VycmVudFRyeURlcHRoOwoKICAgIHZhciBmaW5hbGx5Qm9keSA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgIG5ldyBWYXJpYWJsZUdldChjb250cm9sbGVyVmFyaWFibGUpLAogICAgICAgIG5ldyBOYW1lKCJjbG9zZSIpLAogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W10pLAogICAgICAgIGhlbHBlci5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xvc2UpKTsKCiAgICB2YXIgdHJ5RmluYWxseSA9IG5ldyBUcnlGaW5hbGx5KGJvZHksIG5ldyBCbG9jayg8U3RhdGVtZW50PltmaW5hbGx5Qm9keV0pKTsKICAgIHJldHVybiB0cnlGaW5hbGx5OwogIH0KCiAgU3RhdGVtZW50IGJ1aWxkQ2F0Y2hCb2R5KGV4Y2VwdGlvblZhcmlhYmxlLCBzdGFja1RyYWNlVmFyaWFibGUpIHsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBuZXcgVmFyaWFibGVHZXQoY29udHJvbGxlclZhcmlhYmxlKSwKICAgICAgICBuZXcgTmFtZSgiYWRkRXJyb3IiKSwKICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChleGNlcHRpb25WYXJpYWJsZSksCiAgICAgICAgICBuZXcgVmFyaWFibGVHZXQoc3RhY2tUcmFjZVZhcmlhYmxlKQogICAgICAgIF0pLAogICAgICAgIGhlbHBlci5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkRXJyb3IpKTsKICB9CgogIFN0YXRlbWVudCBidWlsZFJldHVybihTdGF0ZW1lbnQgYm9keSkgewogICAgLy8gQXN5bmMqIGZ1bmN0aW9ucyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuICBUaGUgcmV0dXJucyBmcm9tIHRoZSBmdW5jdGlvbgogICAgLy8gaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgaW50byBicmVha3MgZnJvbSB0aGUgbGFiZWxlZCBib2R5LgogICAgcmV0dXJuIG5ldyBCbG9jayg8U3RhdGVtZW50PlsKICAgICAgYm9keSwKICAgICAgbmV3IFJldHVyblN0YXRlbWVudCgpLi5maWxlT2Zmc2V0ID0gZW5jbG9zaW5nRnVuY3Rpb24uZmlsZUVuZE9mZnNldCwKICAgIF0pOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBzdG10KSB7CiAgICBFeHByZXNzaW9uIGV4cHIgPSBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZShzdG10LmV4cHJlc3Npb24sIHN0YXRlbWVudHMpOwoKICAgIHZhciBhZGRFeHByZXNzaW9uID0gbmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGNvbnRyb2xsZXJWYXJpYWJsZSksCiAgICAgICAgbmV3IE5hbWUoc3RtdC5pc1lpZWxkU3RhciA/ICdhZGRTdHJlYW0nIDogJ2FkZCcsIGhlbHBlci5hc3luY0xpYnJhcnkpLAogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W2V4cHJdKSwKICAgICAgICBzdG10LmlzWWllbGRTdGFyCiAgICAgICAgICAgID8gaGVscGVyLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW0KICAgICAgICAgICAgOiBoZWxwZXIuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gc3RtdC5maWxlT2Zmc2V0OwoKICAgIHN0YXRlbWVudHMuYWRkKG5ldyBJZlN0YXRlbWVudCgKICAgICAgICBhZGRFeHByZXNzaW9uLAogICAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQobmV3IE51bGxMaXRlcmFsKCkpLAogICAgICAgIGNyZWF0ZUNvbnRpbnVhdGlvblBvaW50KCkuLmZpbGVPZmZzZXQgPSBzdG10LmZpbGVPZmZzZXQpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKICAgIC8vIEFzeW5jKiBmdW5jdGlvbnMgY2Fubm90IHJldHVybiBhIHZhbHVlLgogICAgYXNzZXJ0KG5vZGUuZXhwcmVzc2lvbiA9PSBudWxsIHx8IG5vZGUuZXhwcmVzc2lvbiBpcyBOdWxsTGl0ZXJhbCk7CiAgICBzdGF0ZW1lbnRzCiAgICAgICAgLmFkZChuZXcgQnJlYWtTdGF0ZW1lbnQobGFiZWxlZEJvZHkpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KTsKICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgQXN5bmNGdW5jdGlvblJld3JpdGVyIGV4dGVuZHMgQXN5bmNSZXdyaXRlckJhc2UgewogIFZhcmlhYmxlRGVjbGFyYXRpb24gY29tcGxldGVyVmFyaWFibGU7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5WYXJpYWJsZTsKCiAgQXN5bmNGdW5jdGlvblJld3JpdGVyKEhlbHBlck5vZGVzIGhlbHBlciwgRnVuY3Rpb25Ob2RlIGVuY2xvc2luZ0Z1bmN0aW9uLAogICAgICBTdGF0aWNUeXBlQ29udGV4dCBzdGF0aWNUeXBlQ29udGV4dCkKICAgICAgOiBzdXBlcihoZWxwZXIsIGVuY2xvc2luZ0Z1bmN0aW9uLCBzdGF0aWNUeXBlQ29udGV4dCk7CgogIEZ1bmN0aW9uTm9kZSByZXdyaXRlKCkgewogICAgdmFyIHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwoKICAgIC8vIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiByZXR1cm4gdHlwZSBzaG91bGQgYmUgRnV0dXJlPFQ+IG9yIEZ1dHVyZU9yPFQ+CiAgICAvLyBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyBhc3luYy4gSWYgaXQgd2FzLCB3ZSBtYWtlIGEgQ29tcGxldGVyPFQ+LAogICAgLy8gb3RoZXJ3aXNlIHdlIG1ha2UgYSBtYWxmb3JtZWQgdHlwZS4gIEluIGEgIkZ1dHVyZTxUPiBmb28oKSBhc3luYyB7fSIKICAgIC8vIGZ1bmN0aW9uIHRoZSBib2R5IGNhbiBlaXRoZXIgcmV0dXJuIGEgIlQiIG9yIGEgIkZ1dHVyZTxUPiIgPT4gYQogICAgLy8gIkZ1dHVyZU9yPFQ+Ii4KICAgIERhcnRUeXBlIHZhbHVlVHlwZSA9IGVsZW1lbnRUeXBlRnJvbVJldHVyblR5cGUoaGVscGVyLmZ1dHVyZUNsYXNzKTsKICAgIGlmICh2YWx1ZVR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICB2YWx1ZVR5cGUgPSBlbGVtZW50VHlwZUZyb21SZXR1cm5UeXBlKGhlbHBlci5mdXR1cmVPckNsYXNzKTsKICAgIH0KICAgIGZpbmFsIERhcnRUeXBlIHJldHVyblR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShoZWxwZXIuZnV0dXJlT3JDbGFzcywKICAgICAgICBzdGF0aWNUeXBlQ29udGV4dC5udWxsYWJsZSwgPERhcnRUeXBlPlt2YWx1ZVR5cGVdKTsKICAgIHZhciBjb21wbGV0ZXJUeXBlQXJndW1lbnRzID0gPERhcnRUeXBlPlt2YWx1ZVR5cGVdOwoKICAgIGZpbmFsIGNvbXBsZXRlclR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShoZWxwZXIuYXN5bmNBd2FpdENvbXBsZXRlckNsYXNzLAogICAgICAgIHN0YXRpY1R5cGVDb250ZXh0Lm5vbk51bGxhYmxlLCBjb21wbGV0ZXJUeXBlQXJndW1lbnRzKTsKICAgIC8vIGZpbmFsIENvbXBsZXRlcjxUPiA6YXN5bmNfY29tcGxldGVyID0gbmV3IF9Bc3luY0F3YWl0Q29tcGxldGVyPFQ+KCk7CiAgICBjb21wbGV0ZXJWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCI6YXN5bmNfY29tcGxldGVyIiwKICAgICAgICBpbml0aWFsaXplcjogbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgaGVscGVyLmFzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3RvciwKICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyhbXSwgdHlwZXM6IGNvbXBsZXRlclR5cGVBcmd1bWVudHMpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZW5jbG9zaW5nRnVuY3Rpb24uYm9keT8uZmlsZU9mZnNldCA/PyAtMSwKICAgICAgICBpc0ZpbmFsOiB0cnVlLAogICAgICAgIHR5cGU6IGNvbXBsZXRlclR5cGUpOwogICAgc3RhdGVtZW50cy5hZGQoY29tcGxldGVyVmFyaWFibGUpOwoKICAgIHJldHVyblZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oIjpyZXR1cm5fdmFsdWUiLCB0eXBlOiByZXR1cm5UeXBlKTsKICAgIHN0YXRlbWVudHMuYWRkKHJldHVyblZhcmlhYmxlKTsKCiAgICBzZXR1cEFzeW5jQ29udGludWF0aW9ucyhzdGF0ZW1lbnRzKTsKCiAgICAvLyA6YXN5bmNfY29tcGxldGVyLnN0YXJ0KDphc3luY19vcCk7CiAgICB2YXIgc3RhcnRTdGF0ZW1lbnQgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBuZXcgVmFyaWFibGVHZXQoY29tcGxldGVyVmFyaWFibGUpLAogICAgICAgIG5ldyBOYW1lKCdzdGFydCcpLAogICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBWYXJpYWJsZUdldChuZXN0ZWRDbG9zdXJlVmFyaWFibGUpXSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0Z1bmN0aW9uLmZpbGVPZmZzZXQpOwogICAgc3RhdGVtZW50cy5hZGQoc3RhcnRTdGF0ZW1lbnQpOwogICAgLy8gcmV0dXJuIDphc3luY19jb21wbGV0ZXIuZnV0dXJlOwogICAgdmFyIGNvbXBsZXRlckdldCA9IG5ldyBWYXJpYWJsZUdldChjb21wbGV0ZXJWYXJpYWJsZSk7CiAgICB2YXIgcmV0dXJuU3RhdGVtZW50ID0gbmV3IFJldHVyblN0YXRlbWVudChuZXcgUHJvcGVydHlHZXQoY29tcGxldGVyR2V0LAogICAgICAgIG5ldyBOYW1lKCdmdXR1cmUnLCBoZWxwZXIuYXN5bmNMaWJyYXJ5KSwgaGVscGVyLmNvbXBsZXRlckZ1dHVyZSkpOwogICAgc3RhdGVtZW50cy5hZGQocmV0dXJuU3RhdGVtZW50KTsKCiAgICBlbmNsb3NpbmdGdW5jdGlvbi5ib2R5ID0gbmV3IEJsb2NrKHN0YXRlbWVudHMpOwogICAgZW5jbG9zaW5nRnVuY3Rpb24uYm9keS5wYXJlbnQgPSBlbmNsb3NpbmdGdW5jdGlvbjsKICAgIGVuY2xvc2luZ0Z1bmN0aW9uLmFzeW5jTWFya2VyID0gQXN5bmNNYXJrZXIuU3luYzsKICAgIHJldHVybiBlbmNsb3NpbmdGdW5jdGlvbjsKICB9CgogIFN0YXRlbWVudCBidWlsZENhdGNoQm9keShleGNlcHRpb25WYXJpYWJsZSwgc3RhY2tUcmFjZVZhcmlhYmxlKSB7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGNvbXBsZXRlclZhcmlhYmxlKSwKICAgICAgICBuZXcgTmFtZSgiY29tcGxldGVFcnJvciIpLAogICAgICAgIG5ldyBBcmd1bWVudHMoWwogICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KGV4Y2VwdGlvblZhcmlhYmxlKSwKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChzdGFja1RyYWNlVmFyaWFibGUpCiAgICAgICAgXSksCiAgICAgICAgaGVscGVyLmNvbXBsZXRlckNvbXBsZXRlRXJyb3IpKTsKICB9CgogIFN0YXRlbWVudCBidWlsZFJldHVybihTdGF0ZW1lbnQgYm9keSkgewogICAgLy8gUmV0dXJucyBmcm9tIHRoZSBib2R5IGhhdmUgYWxsIGJlZW4gdHJhbnNsYXRlZCBpbnRvIGFzc2lnbm1lbnRzIHRvIHRoZQogICAgLy8gcmV0dXJuIHZhbHVlIHZhcmlhYmxlIGZvbGxvd2VkIGJ5IGEgYnJlYWsgZnJvbSB0aGUgbGFiZWxlZCBib2R5LgogICAgcmV0dXJuIG5ldyBCbG9jayg8U3RhdGVtZW50PlsKICAgICAgYm9keSwKICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICBoZWxwZXIuY29tcGxldGVPbkFzeW5jUmV0dXJuLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyhbCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb21wbGV0ZXJWYXJpYWJsZSksCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChyZXR1cm5WYXJpYWJsZSkKICAgICAgICAgIF0pKSksCiAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQoKS4uZmlsZU9mZnNldCA9IGVuY2xvc2luZ0Z1bmN0aW9uLmZpbGVFbmRPZmZzZXQKICAgIF0pOwogIH0KCiAgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKICAgIHZhciBleHByID0gbm9kZS5leHByZXNzaW9uID09IG51bGwKICAgICAgICA/IG5ldyBOdWxsTGl0ZXJhbCgpCiAgICAgICAgOiBleHByZXNzaW9uUmV3cml0ZXIucmV3cml0ZShub2RlLmV4cHJlc3Npb24sIHN0YXRlbWVudHMpOwogICAgc3RhdGVtZW50cy5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgbmV3IFZhcmlhYmxlU2V0KHJldHVyblZhcmlhYmxlLCBleHByKS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCkpOwogICAgc3RhdGVtZW50cy5hZGQobmV3IEJyZWFrU3RhdGVtZW50KGxhYmVsZWRCb2R5KSk7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmNsYXNzIEhlbHBlck5vZGVzIHsKICBmaW5hbCBQcm9jZWR1cmUgYXN5bmNFcnJvcldyYXBwZXI7CiAgZmluYWwgTGlicmFyeSBhc3luY0xpYnJhcnk7CiAgZmluYWwgUHJvY2VkdXJlIGFzeW5jU3RhY2tUcmFjZUhlbHBlcjsKICBmaW5hbCBNZW1iZXIgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZDsKICBmaW5hbCBNZW1iZXIgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZEVycm9yOwogIGZpbmFsIE1lbWJlciBhc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtOwogIGZpbmFsIENsYXNzIGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDbGFzczsKICBmaW5hbCBNZW1iZXIgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckNsb3NlOwogIGZpbmFsIENvbnN0cnVjdG9yIGFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDb25zdHJ1Y3RvcjsKICBmaW5hbCBNZW1iZXIgYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlclN0cmVhbTsKICBmaW5hbCBNZW1iZXIgYXN5bmNTdGFyTGlzdGVuSGVscGVyOwogIGZpbmFsIE1lbWJlciBhc3luY1N0YXJNb3ZlTmV4dEhlbHBlcjsKICBmaW5hbCBQcm9jZWR1cmUgYXN5bmNUaGVuV3JhcHBlcjsKICBmaW5hbCBQcm9jZWR1cmUgYXdhaXRIZWxwZXI7CiAgZmluYWwgQ2xhc3MgYXN5bmNBd2FpdENvbXBsZXRlckNsYXNzOwogIGZpbmFsIE1lbWJlciBjb21wbGV0ZXJDb21wbGV0ZUVycm9yOwogIGZpbmFsIE1lbWJlciBhc3luY0F3YWl0Q29tcGxldGVyQ29uc3RydWN0b3I7CiAgZmluYWwgTWVtYmVyIGNvbXBsZXRlT25Bc3luY1JldHVybjsKICBmaW5hbCBNZW1iZXIgY29tcGxldGVyRnV0dXJlOwogIGZpbmFsIExpYnJhcnkgY29yZUxpYnJhcnk7CiAgZmluYWwgQ29yZVR5cGVzIGNvcmVUeXBlczsKICBmaW5hbCBDbGFzcyBmdXR1cmVDbGFzczsKICBmaW5hbCBDbGFzcyBmdXR1cmVPckNsYXNzOwogIGZpbmFsIENsYXNzIGl0ZXJhYmxlQ2xhc3M7CiAgZmluYWwgQ2xhc3Mgc3RyZWFtQ2xhc3M7CiAgZmluYWwgTWVtYmVyIHN0cmVhbUl0ZXJhdG9yQ2FuY2VsOwogIGZpbmFsIENsYXNzIHN0cmVhbUl0ZXJhdG9yQ2xhc3M7CiAgZmluYWwgQ29uc3RydWN0b3Igc3RyZWFtSXRlcmF0b3JDb25zdHJ1Y3RvcjsKICBmaW5hbCBNZW1iZXIgc3RyZWFtSXRlcmF0b3JDdXJyZW50OwogIGZpbmFsIE1lbWJlciBzdHJlYW1JdGVyYXRvck1vdmVOZXh0OwogIGZpbmFsIENvbnN0cnVjdG9yIHN5bmNJdGVyYWJsZUNvbnN0cnVjdG9yOwogIGZpbmFsIENsYXNzIHN5bmNJdGVyYXRvckNsYXNzOwogIGZpbmFsIE1lbWJlciBzeW5jSXRlcmF0b3JDdXJyZW50OwogIGZpbmFsIE1lbWJlciBzeW5jSXRlcmF0b3JZaWVsZEVhY2hJdGVyYWJsZTsKICBmaW5hbCBDbGFzcyBib29sQ2xhc3M7CiAgZmluYWwgUHJvY2VkdXJlIHVuc2FmZUNhc3Q7CgogIGJvb2wgcHJvZHVjdE1vZGU7CgogIEhlbHBlck5vZGVzLl8oCiAgICAgIHRoaXMuYXN5bmNFcnJvcldyYXBwZXIsCiAgICAgIHRoaXMuYXN5bmNMaWJyYXJ5LAogICAgICB0aGlzLmFzeW5jU3RhY2tUcmFjZUhlbHBlciwKICAgICAgdGhpcy5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkLAogICAgICB0aGlzLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJBZGRFcnJvciwKICAgICAgdGhpcy5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtLAogICAgICB0aGlzLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDbGFzcywKICAgICAgdGhpcy5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xvc2UsCiAgICAgIHRoaXMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckNvbnN0cnVjdG9yLAogICAgICB0aGlzLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJTdHJlYW0sCiAgICAgIHRoaXMuYXN5bmNTdGFyTGlzdGVuSGVscGVyLAogICAgICB0aGlzLmFzeW5jU3Rhck1vdmVOZXh0SGVscGVyLAogICAgICB0aGlzLmFzeW5jVGhlbldyYXBwZXIsCiAgICAgIHRoaXMuYXdhaXRIZWxwZXIsCiAgICAgIHRoaXMuYXN5bmNBd2FpdENvbXBsZXRlckNsYXNzLAogICAgICB0aGlzLmNvbXBsZXRlckNvbXBsZXRlRXJyb3IsCiAgICAgIHRoaXMuYXN5bmNBd2FpdENvbXBsZXRlckNvbnN0cnVjdG9yLAogICAgICB0aGlzLmNvbXBsZXRlT25Bc3luY1JldHVybiwKICAgICAgdGhpcy5jb21wbGV0ZXJGdXR1cmUsCiAgICAgIHRoaXMuY29yZUxpYnJhcnksCiAgICAgIHRoaXMuY29yZVR5cGVzLAogICAgICB0aGlzLmZ1dHVyZUNsYXNzLAogICAgICB0aGlzLmZ1dHVyZU9yQ2xhc3MsCiAgICAgIHRoaXMuaXRlcmFibGVDbGFzcywKICAgICAgdGhpcy5zdHJlYW1DbGFzcywKICAgICAgdGhpcy5zdHJlYW1JdGVyYXRvckNhbmNlbCwKICAgICAgdGhpcy5zdHJlYW1JdGVyYXRvckNsYXNzLAogICAgICB0aGlzLnN0cmVhbUl0ZXJhdG9yQ29uc3RydWN0b3IsCiAgICAgIHRoaXMuc3RyZWFtSXRlcmF0b3JDdXJyZW50LAogICAgICB0aGlzLnN0cmVhbUl0ZXJhdG9yTW92ZU5leHQsCiAgICAgIHRoaXMuc3luY0l0ZXJhYmxlQ29uc3RydWN0b3IsCiAgICAgIHRoaXMuc3luY0l0ZXJhdG9yQ2xhc3MsCiAgICAgIHRoaXMuc3luY0l0ZXJhdG9yQ3VycmVudCwKICAgICAgdGhpcy5zeW5jSXRlcmF0b3JZaWVsZEVhY2hJdGVyYWJsZSwKICAgICAgdGhpcy5ib29sQ2xhc3MsCiAgICAgIHRoaXMucHJvZHVjdE1vZGUsCiAgICAgIHRoaXMudW5zYWZlQ2FzdCk7CgogIGZhY3RvcnkgSGVscGVyTm9kZXMuZnJvbUNvcmVUeXBlcyhDb3JlVHlwZXMgY29yZVR5cGVzLCBib29sIHByb2R1Y3RNb2RlKSB7CiAgICByZXR1cm4gbmV3IEhlbHBlck5vZGVzLl8oCiAgICAgICAgY29yZVR5cGVzLmFzeW5jRXJyb3JXcmFwcGVySGVscGVyUHJvY2VkdXJlLAogICAgICAgIGNvcmVUeXBlcy5hc3luY0xpYnJhcnksCiAgICAgICAgY29yZVR5cGVzLmFzeW5jU3RhY2tUcmFjZUhlbHBlclByb2NlZHVyZSwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZCwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZEVycm9yLAogICAgICAgIGNvcmVUeXBlcy5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtLAogICAgICAgIGNvcmVUeXBlcy5hc3luY1N0YXJTdHJlYW1Db250cm9sbGVyQ2xhc3MsCiAgICAgICAgY29yZVR5cGVzLmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDbG9zZSwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckRlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlclN0cmVhbSwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNTdGFyTGlzdGVuSGVscGVyLAogICAgICAgIGNvcmVUeXBlcy5hc3luY1N0YXJNb3ZlTmV4dEhlbHBlciwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNUaGVuV3JhcHBlckhlbHBlclByb2NlZHVyZSwKICAgICAgICBjb3JlVHlwZXMuYXdhaXRIZWxwZXJQcm9jZWR1cmUsCiAgICAgICAgY29yZVR5cGVzLmFzeW5jQXdhaXRDb21wbGV0ZXJDbGFzcywKICAgICAgICBjb3JlVHlwZXMuY29tcGxldGVyQ29tcGxldGVFcnJvciwKICAgICAgICBjb3JlVHlwZXMuYXN5bmNBd2FpdENvbXBsZXRlckNvbnN0cnVjdG9yLAogICAgICAgIGNvcmVUeXBlcy5jb21wbGV0ZU9uQXN5bmNSZXR1cm4sCiAgICAgICAgY29yZVR5cGVzLmNvbXBsZXRlckZ1dHVyZSwKICAgICAgICBjb3JlVHlwZXMuY29yZUxpYnJhcnksCiAgICAgICAgY29yZVR5cGVzLAogICAgICAgIGNvcmVUeXBlcy5mdXR1cmVDbGFzcywKICAgICAgICBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcywKICAgICAgICBjb3JlVHlwZXMuaXRlcmFibGVDbGFzcywKICAgICAgICBjb3JlVHlwZXMuc3RyZWFtQ2xhc3MsCiAgICAgICAgY29yZVR5cGVzLnN0cmVhbUl0ZXJhdG9yQ2FuY2VsLAogICAgICAgIGNvcmVUeXBlcy5zdHJlYW1JdGVyYXRvckNsYXNzLAogICAgICAgIGNvcmVUeXBlcy5zdHJlYW1JdGVyYXRvckRlZmF1bHRDb25zdHJ1Y3RvciwKICAgICAgICBjb3JlVHlwZXMuc3RyZWFtSXRlcmF0b3JDdXJyZW50LAogICAgICAgIGNvcmVUeXBl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cm1hdGlvbnMvdHJhY2tfd2lkZ2V0X2NvbnN0cnVjdG9yX2xvY2F0aW9ucy5kYXJ0wABQZC8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGtlcm5lbC50cmFuc2Zvcm1hdGlvbnMudHJhY2tfd2lkZ2V0X2NvbnN0cnVjdG9yX2xvY2F0aW9uczsKCmltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKCi8vIFBhcmFtZXRlciBuYW1lIHVzZWQgdG8gdHJhY2sgd2VyZSB3aWRnZXQgY29uc3RydWN0b3IgY2FsbHMgd2VyZSBtYWRlIGZyb20uCi8vCi8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBjb250YWlucyBhIHJhbmRvbWx5IGdlbmVyYXRlIGhleCBzdHJpbmcgdG8gYXZvaWQgY29sbGlzaW9uCi8vIHdpdGggdXNlciBnZW5lcmF0ZWQgcGFyYW1ldGVycy4KY29uc3QgU3RyaW5nIF9jcmVhdGlvbkxvY2F0aW9uUGFyYW1ldGVyTmFtZSA9CiAgICByJyRjcmVhdGlvbkxvY2F0aW9uZF8wZGVhMTEyYjA5MDA3MzMxN2Q0JzsKCi8vLyBOYW1lIG9mIHByaXZhdGUgZmllbGQgYWRkZWQgdG8gdGhlIFdpZGdldCBjbGFzcyBhbmQgYW55IG90aGVyIGNsYXNzZXMgdGhhdAovLy8gaW1wbGVtZW50IFdpZGdldC4KLy8vCi8vLyBSZWdhcmRsZXNzIG9mIHdoYXQgbGlicmFyeSBhIGNsYXNzIGltcGxlbWVudGluZyBXaWRnZXQgaXMgZGVmaW5lZCBpbiwgdGhlCi8vLyBwcml2YXRlIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHdpZGdldF9pbnNwZWN0b3IKLy8vIGxpYnJhcnkgZW5zdXJpbmcgbm8gbmFtZSBjb25mbGljdHMgd2l0aCByZWd1bGFyIGZpZWxkcy4KY29uc3QgU3RyaW5nIF9sb2NhdGlvbkZpZWxkTmFtZSA9IHInX2xvY2F0aW9uJzsKCmJvb2wgX2hhc05hbWVkUGFyYW1ldGVyKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgU3RyaW5nIG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzCiAgICAgIC5hbnkoKFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIubmFtZSA9PSBuYW1lKTsKfQoKYm9vbCBfaGFzTmFtZWRBcmd1bWVudChBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmcgYXJndW1lbnROYW1lKSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5uYW1lZAogICAgICAuYW55KChOYW1lZEV4cHJlc3Npb24gYXJndW1lbnQpID0+IGFyZ3VtZW50Lm5hbWUgPT0gYXJndW1lbnROYW1lKTsKfQoKVmFyaWFibGVEZWNsYXJhdGlvbiBfZ2V0TmFtZWRQYXJhbWV0ZXIoCiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogIFN0cmluZyBwYXJhbWV0ZXJOYW1lLAopIHsKICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgaWYgKHBhcmFtZXRlci5uYW1lID09IHBhcmFtZXRlck5hbWUpIHsKICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCi8vIFRPRE8oamFjb2JyKTogZmluZCBhIHNvbHV0aW9uIHRoYXQgc3VwcG9ydHMgb3B0aW9uYWwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgovLy8gQWRkIHRoZSBjcmVhdGlvbiBsb2NhdGlvbiB0byB0aGUgYXJndW1lbnRzIGxpc3QgaWYgcG9zc2libGUuCi8vLwovLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBjcmVhdGlvbiBsb2NhdGlvbiBhcmd1bWVudCBjb3VsZCBiZSBhZGRlZC4gV2UgY2Fubm90Ci8vLyBjdXJyZW50bHkgYWRkIHRoZSBuYW1lZCBhcmd1bWVudCBmb3IgZnVuY3Rpb25zIHdpdGggb3B0aW9uYWwgcG9zaXRpb25hbAovLy8gcGFyYW1ldGVycyBhcyB0aGUgY3VycmVudCBzY2hlbWUgcmVxdWlyZXMgYWRkaW5nIHRoZSBjcmVhdGlvbiBsb2NhdGlvbiBhcyBhCi8vLyBuYW1lZCBwYXJhbWV0ZXIuIEZvcnR1bmF0ZWx5IHRoYXQgaXMgbm90IGEgc2lnbmlmaWNhbnQgaXNzdWUgaW4gcHJhY3RpY2UgYXMKLy8vIG5vIFdpZGdldCBjbGFzc2VzIGluIHBhY2thZ2U6Zmx1dHRlciBoYXZlIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KLy8vIFRoaXMgY29kZSBkZWdyYWRlcyBncmFjZWZ1bGx5IGZvciBjb25zdHJ1Y3RvcnMgd2l0aCBvcHRpb25hbCBwb3NpdGlvbmFsCi8vLyBwYXJhbWV0ZXJzIGJ5IHNraXBwaW5nIGFkZGluZyB0aGUgY3JlYXRpb24gbG9jYXRpb24gYXJndW1lbnQgcmF0aGVyIHRoYW4KLy8vIGZhaWxpbmcuCnZvaWQgX21heWJlQWRkQ3JlYXRpb25Mb2NhdGlvbkFyZ3VtZW50KAogIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogIEV4cHJlc3Npb24gY3JlYXRpb25Mb2NhdGlvbiwKICBDbGFzcyBsb2NhdGlvbkNsYXNzLAopIHsKICBpZiAoX2hhc05hbWVkQXJndW1lbnQoYXJndW1lbnRzLCBfY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlck5hbWUpKSB7CiAgICByZXR1cm47CiAgfQogIGlmICghX2hhc05hbWVkUGFyYW1ldGVyKGZ1bmN0aW9uLCBfY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlck5hbWUpKSB7CiAgICAvLyBUT0RPKGpha2VtYWMpOiBXZSBkb24ndCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gZGVwZW5kZW5jaWVzIGtlcm5lbAogICAgLy8gb3V0bGluZXMsIHNvIGluc3RlYWQgd2UganVzdCBhc3N1bWUgdGhlIG5hbWVkIHBhcmFtZXRlciBleGlzdHMuCiAgICAvLwogICAgLy8gVGhlIG9ubHkgY2FzZSBpbiB3aGljaCBpdCBzaG91bGRuJ3QgZXhpc3QgaXMgaWYgdGhlIGZ1bmN0aW9uIGhhcyBvcHRpb25hbAogICAgLy8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHNvIGl0IGNhbm5vdCBoYXZlIG9wdGlvbmFsIG5hbWVkIHBhcmFtZXRlcnMuCiAgICBpZiAoZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPQogICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXR1cm47CiAgICB9CiAgfQoKICBmaW5hbCBOYW1lZEV4cHJlc3Npb24gbmFtZWRBcmd1bWVudCA9CiAgICAgIG5ldyBOYW1lZEV4cHJlc3Npb24oX2NyZWF0aW9uTG9jYXRpb25QYXJhbWV0ZXJOYW1lLCBjcmVhdGlvbkxvY2F0aW9uKTsKICBuYW1lZEFyZ3VtZW50LnBhcmVudCA9IGFyZ3VtZW50czsKICBhcmd1bWVudHMubmFtZWQuYWRkKG5hbWVkQXJndW1lbnQpOwp9CgovLy8gQWRkcyBhIG5hbWVkIHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBhbHJlYWR5IGhhdmUKLy8vIGEgbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgb3Igb3B0aW9uYWwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgpib29sIF9tYXliZUFkZE5hbWVkUGFyYW1ldGVyKAogIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAopIHsKICBpZiAoX2hhc05hbWVkUGFyYW1ldGVyKGZ1bmN0aW9uLCBfY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlck5hbWUpKSB7CiAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSBmdW5jdGlvbiB0aGF0IGhhcyBhbHJlYWR5CiAgICAvLyBiZWVuIHRyYW5zZm9ybWVkLgogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvLyBGdW5jdGlvbiBoYXMgb3B0aW9uYWwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHNvIGNhbm5vdCBoYXZlIG9wdGlvbmFsIG5hbWVkCiAgLy8gcGFyYW1ldGVycy4KICBpZiAoZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgdmFyaWFibGUucGFyZW50ID0gZnVuY3Rpb247CiAgZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmFkZCh2YXJpYWJsZSk7CiAgcmV0dXJuIHRydWU7Cn0KCi8vLyBUcmFuc2Zvcm1lciB0aGF0IG1vZGlmaWVzIGFsbCBjYWxscyB0byBXaWRnZXQgY29uc3RydWN0b3JzIHRvIGluY2x1ZGUKLy8vIGEgW0RlYnVnTG9jYXRpb25dIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29uc3RydWN0b3IKLy8vIGNhbGwgd2FzIG1hZGUuCi8vLwovLy8gVGhpcyB0cmFuc2Zvcm1lciByZXF1aXJlcyB0aGF0IGFsbCBXaWRnZXQgY29uc3RydWN0b3JzIGhhdmUgYWxyZWFkeSBiZWVuCi8vLyB0cmFuc2Zvcm1lZCB0byBoYXZlIGEgbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGJ5Ci8vLyBgX2xvY2F0aW9uUGFyYW1ldGVyTmFtZWAuCmNsYXNzIF9XaWRnZXRDYWxsU2l0ZVRyYW5zZm9ybWVyIGV4dGVuZHMgVHJhbnNmb3JtZXIgewogIC8vLyBUaGUgW1dpZGdldF0gY2xhc3MgZGVmaW5lZCBpbiB0aGUgYHBhY2thZ2U6Zmx1dHRlcmAgbGlicmFyeS4KICAvLy8KICAvLy8gVXNlZCB0byBwZXJmb3JtIGluc3RhbmNlb2YgY2hlY2tzIHRvIGRldGVybWluZSB3aGV0aGVyIERhcnQgY29uc3RydWN0b3IKICAvLy8gY2FsbHMgYXJlIGNyZWF0aW5nIFtXaWRnZXRdIG9iamVjdHMuCiAgQ2xhc3MgX3dpZGdldENsYXNzOwoKICAvLy8gVGhlIFtEZWJ1Z0xvY2F0aW9uXSBjbGFzcyBkZWZpbmVkIGluIHRoZSBgcGFja2FnZTpmbHV0dGVyYCBsaWJyYXJ5LgogIENsYXNzIF9sb2NhdGlvbkNsYXNzOwoKICAvLy8gQ3VycmVudCBmYWN0b3J5IGNvbnN0cnVjdG9yIHRoYXQgbm9kZSBiZWluZyB0cmFuc2Zvcm1lZCBpcyBpbnNpZGUuCiAgLy8vCiAgLy8vIFVzZWQgdG8gZmxvdyB0aGUgbG9jYXRpb24gcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmYWN0b3J5IHRvIHRoZQogIC8vLyBhY3R1YWwgY29uc3RydWN0b3IgY2FsbCB3aXRoaW4gdGhlIGZhY3RvcnkuCiAgUHJvY2VkdXJlIF9jdXJyZW50RmFjdG9yeTsKCiAgV2lkZ2V0Q3JlYXRvclRyYWNrZXIgX3RyYWNrZXI7CgogIC8vLyBMaWJyYXJ5IHRoYXQgY29udGFpbnMgdGhlIHRyYW5zZm9ybWVkIGNhbGwgc2l0ZXMuCiAgLy8vCiAgLy8vIFRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgY2FsbCBzaXRlcyBpcyBhZmZlY3RlZCBieSB0aGUgTk5CRCBvcHQtaW4gc3RhdHVzCiAgLy8vIG9mIHRoZSBsaWJyYXJ5LgogIExpYnJhcnkgX2N1cnJlbnRMaWJyYXJ5OwoKICBfV2lkZ2V0Q2FsbFNpdGVUcmFuc2Zvcm1lcigKICAgICAge0ByZXF1aXJlZCBDbGFzcyB3aWRnZXRDbGFzcywKICAgICAgQHJlcXVpcmVkIENsYXNzIGxvY2F0aW9uQ2xhc3MsCiAgICAgIEByZXF1aXJlZCBXaWRnZXRDcmVhdG9yVHJhY2tlciB0cmFja2VyfSkKICAgICAgOiBfd2lkZ2V0Q2xhc3MgPSB3aWRnZXRDbGFzcywKICAgICAgICBfbG9jYXRpb25DbGFzcyA9IGxvY2F0aW9uQ2xhc3MsCiAgICAgICAgX3RyYWNrZXIgPSB0cmFja2VyOwoKICAvLy8gQnVpbGRzIGEgY2FsbCB0byB0aGUgY29uc3QgY29uc3RydWN0b3Igb2YgdGhlIFtEZWJ1Z0xvY2F0aW9uXQogIC8vLyBvYmplY3Qgc3BlY2lmeWluZyB0aGUgbG9jYXRpb24gd2hlcmUgYSBjb25zdHJ1Y3RvciBjYWxsIHdhcyBtYWRlIGFuZAogIC8vLyBvcHRpb25hbGx5IHRoZSBsb2NhdGlvbnMgZm9yIGFsbCBwYXJhbWV0ZXJzIHBhc3NlZCBpbi4KICAvLy8KICAvLy8gU3BlY2lmeWluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuIFdpdGgKICAvLy8gYWNjZXNzIHRvIHRoZSBzb3VyY2UgY29kZSBvZiBhbiBhcHBsaWNhdGlvbiB5b3UgY291bGQgZGV0ZXJtaW5lIHRoZQogIC8vLyBsb2NhdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIGluIGZyb20gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUKICAvLy8gY29uc3RydWN0b3IgY2FsbCBidXQgaXQgaXMgY29udmVuaWVudCB0byBidW5kbGUgdGhlIGxvY2F0aW9uIGFuZCBuYW1lcwogIC8vLyBvZiB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW4gc28gdGhhdCB0b29scyBjYW4gc2hvdyBwYXJhbWV0ZXIgbG9jYXRpb25zCiAgLy8vIHdpdGhvdXQgcmUtcGFyc2luZyB0aGUgc291cmNlIGNvZGUuCiAgQ29uc3RydWN0b3JJbnZvY2F0aW9uIF9jb25zdHJ1Y3RMb2NhdGlvbigKICAgIExvY2F0aW9uIGxvY2F0aW9uLCB7CiAgICBTdHJpbmcgbmFtZSwKICAgIExpc3RMaXRlcmFsIHBhcmFtZXRlckxvY2F0aW9ucywKICAgIGJvb2wgc2hvd0ZpbGU6IHRydWUsCiAgfSkgewogICAgZmluYWwgTGlzdDxOYW1lZEV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IDxOYW1lZEV4cHJlc3Npb24+WwogICAgICBuZXcgTmFtZWRFeHByZXNzaW9uKCdsaW5lJywgbmV3IEludExpdGVyYWwobG9jYXRpb24ubGluZSkpLAogICAgICBuZXcgTmFtZWRFeHByZXNzaW9uKCdjb2x1bW4nLCBuZXcgSW50TGl0ZXJhbChsb2NhdGlvbi5jb2x1bW4pKSwKICAgIF07CiAgICBpZiAoc2hvd0ZpbGUpIHsKICAgICAgYXJndW1lbnRzLmFkZChuZXcgTmFtZWRFeHByZXNzaW9uKAogICAgICAgICAgJ2ZpbGUnLCBuZXcgU3RyaW5nTGl0ZXJhbChsb2NhdGlvbi5maWxlLnRvU3RyaW5nKCkpKSk7CiAgICB9CiAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgIGFyZ3VtZW50cy5hZGQobmV3IE5hbWVkRXhwcmVzc2lvbignbmFtZScsIG5ldyBTdHJpbmdMaXRlcmFsKG5hbWUpKSk7CiAgICB9CiAgICBpZiAocGFyYW1ldGVyTG9jYXRpb25zICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzCiAgICAgICAgICAuYWRkKG5ldyBOYW1lZEV4cHJlc3Npb24oJ3BhcmFtZXRlckxvY2F0aW9ucycsIHBhcmFtZXRlckxvY2F0aW9ucykpOwogICAgfQogICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIF9sb2NhdGlvbkNsYXNzLmNvbnN0cnVjdG9ycy5maXJzdCwKICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bXSwgbmFtZWQ6IGFyZ3VtZW50cyksCiAgICAgIGlzQ29uc3Q6IHRydWUsCiAgICApOwogIH0KCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBpZiAobm9kZS5pc0ZhY3RvcnkpIHsKICAgICAgX2N1cnJlbnRGYWN0b3J5ID0gbm9kZTsKICAgICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgICAgX2N1cnJlbnRGYWN0b3J5ID0gbnVsbDsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICByZXR1cm4gZGVmYXVsdFRyZWVOb2RlKG5vZGUpOwogIH0KCiAgYm9vbCBfaXNTdWJjbGFzc09mV2lkZ2V0KENsYXNzIGNsYXp6KSB7CiAgICByZXR1cm4gX3RyYWNrZXIuX2lzU3ViY2xhc3NPZihjbGF6eiwgX3dpZGdldENsYXNzKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRpY0ludm9jYXRpb24gdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgbm9kZS50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIGZpbmFsIFByb2NlZHVyZSB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIGlmICghdGFyZ2V0LmlzRmFjdG9yeSkgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIGZpbmFsIENsYXNzIGNvbnN0cnVjdGVkQ2xhc3MgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoIV9pc1N1YmNsYXNzT2ZXaWRnZXQoY29uc3RydWN0ZWRDbGFzcykpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgX2FkZExvY2F0aW9uQXJndW1lbnQobm9kZSwgdGFyZ2V0LmZ1bmN0aW9uLCBjb25zdHJ1Y3RlZENsYXNzKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgdm9pZCBfYWRkTG9jYXRpb25Bcmd1bWVudChJbnZvY2F0aW9uRXhwcmVzc2lvbiBub2RlLCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24sCiAgICAgIENsYXNzIGNvbnN0cnVjdGVkQ2xhc3MpIHsKICAgIF9tYXliZUFkZENyZWF0aW9uTG9jYXRpb25Bcmd1bWVudCgKICAgICAgbm9kZS5hcmd1bWVudHMsCiAgICAgIGZ1bmN0aW9uLAogICAgICBfY29tcHV0ZUxvY2F0aW9uKG5vZGUsIGZ1bmN0aW9uLCBjb25zdHJ1Y3RlZENsYXNzKSwKICAgICAgX2xvY2F0aW9uQ2xhc3MsCiAgICApOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JJbnZvY2F0aW9uIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKHRoaXMpOwoKICAgIGZpbmFsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbm9kZS50YXJnZXQ7CiAgICBmaW5hbCBDbGFzcyBjb25zdHJ1Y3RlZENsYXNzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICBpZiAoIV9pc1N1YmNsYXNzT2ZXaWRnZXQoY29uc3RydWN0ZWRDbGFzcykpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgX2FkZExvY2F0aW9uQXJndW1lbnQobm9kZSwgY29uc3RydWN0b3IuZnVuY3Rpb24sIGNvbnN0cnVjdGVkQ2xhc3MpOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBFeHByZXNzaW9uIF9jb21wdXRlTG9jYXRpb24oSW52b2NhdGlvbkV4cHJlc3Npb24gbm9kZSwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLAogICAgICBDbGFzcyBjb25zdHJ1Y3RlZENsYXNzKSB7CiAgICAvLyBGb3IgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgd2UgbmVlZCB0byB1c2UgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBhcyBhbgogICAgLy8gYXJndW1lbnQgdG8gdGhlIGZhY3RvcnkgY29uc3RydWN0b3IgcmF0aGVyIHRoYW4gdGhlIGxvY2F0aW9uCiAgICBpZiAoX2N1cnJlbnRGYWN0b3J5ICE9IG51bGwgJiYKICAgICAgICBfdHJhY2tlci5faXNTdWJjbGFzc09mKAogICAgICAgICAgICBjb25zdHJ1Y3RlZENsYXNzLCBfY3VycmVudEZhY3RvcnkuZW5jbG9zaW5nQ2xhc3MpKSB7CiAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlciA9IF9nZXROYW1lZFBhcmFtZXRlcigKICAgICAgICBfY3VycmVudEZhY3RvcnkuZnVuY3Rpb24sCiAgICAgICAgX2NyZWF0aW9uTG9jYXRpb25QYXJhbWV0ZXJOYW1lLAogICAgICApOwogICAgICBpZiAoY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlciAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldChjcmVhdGlvbkxvY2F0aW9uUGFyYW1ldGVyKTsKICAgICAgfQogICAgfQoKICAgIGZpbmFsIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50czsKICAgIGZpbmFsIExvY2F0aW9uIGxvY2F0aW9uID0gbm9kZS5sb2NhdGlvbjsKICAgIGZpbmFsIExpc3Q8Q29uc3RydWN0b3JJbnZvY2F0aW9uPiBwYXJhbWV0ZXJMb2NhdGlvbnMgPQogICAgICAgIDxDb25zdHJ1Y3Rvckludm9jYXRpb24+W107CiAgICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoOyArK2kpIHsKICAgICAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXJndW1lbnRzLnBvc2l0aW9uYWxbaV07CiAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKICAgICAgcGFyYW1ldGVyTG9jYXRpb25zLmFkZChfY29uc3RydWN0TG9jYXRpb24oCiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbiwKICAgICAgICBuYW1lOiBwYXJhbWV0ZXIubmFtZSwKICAgICAgICBzaG93RmlsZTogZmFsc2UsCiAgICAgICkpOwogICAgfQogICAgZm9yIChOYW1lZEV4cHJlc3Npb24gZXhwcmVzc2lvbiBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgcGFyYW1ldGVyTG9jYXRpb25zLmFkZChfY29uc3RydWN0TG9jYXRpb24oCiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbiwKICAgICAgICBuYW1lOiBleHByZXNzaW9uLm5hbWUsCiAgICAgICAgc2hvd0ZpbGU6IGZhbHNlLAogICAgICApKTsKICAgIH0KICAgIHJldHVybiBfY29uc3RydWN0TG9jYXRpb24oCiAgICAgIGxvY2F0aW9uLAogICAgICBwYXJhbWV0ZXJMb2NhdGlvbnM6IG5ldyBMaXN0TGl0ZXJhbCgKICAgICAgICBwYXJhbWV0ZXJMb2NhdGlvbnMsCiAgICAgICAgdHlwZUFyZ3VtZW50OgogICAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShfbG9jYXRpb25DbGFzcywgX2N1cnJlbnRMaWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICBpc0NvbnN0OiB0cnVlLAogICAgICApLAogICAgKTsKICB9CgogIHZvaWQgZW50ZXJMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgYXNzZXJ0KAogICAgICAgIF9jdXJyZW50TGlicmFyeSA9PSBudWxsLAogICAgICAgICJBdHRlbXB0aW5nIHRvIGVudGVyIGxpYnJhcnkgJyR7bGlicmFyeS5maWxlVXJpfScgIgogICAgICAgICJ3aXRob3V0IGhhdmluZyBleGl0ZWQgbGlicmFyeSAnJHtfY3VycmVudExpYnJhcnkuZmlsZVVyaX0nLiIpOwogICAgX2N1cnJlbnRMaWJyYXJ5ID0gbGlicmFyeTsKICB9CgogIHZvaWQgZXhpdExpYnJhcnkoKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRMaWJyYXJ5ICE9IG51bGwsCiAgICAgICAgIkF0dGVtcHRpbmcgdG8gZXhpdCBhIGxpYnJhcnkgd2l0aG91dCBoYXZpbmcgZW50ZXJlZCBvbmUuIik7CiAgICBfY3VycmVudExpYnJhcnkgPSBudWxsOwogIH0KfQoKLy8vIFJld3JpdGVzIGFsbCB3aWRnZXQgY29uc3RydWN0b3JzIGFuZCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucyB0byBhZGQgYQovLy8gcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIHRoZSBjb25zdHJ1Y3RvciB3YXMgY2FsbGVkIGZyb20uCi8vLwovLy8gVGhlIGNyZWF0aW9uIGxvY2F0aW9uIGlzIHN0b3JlZCBhcyBhIHByaXZhdGUgZmllbGQgbmFtZWQgYF9sb2NhdGlvbmAKLy8vIG9uIHRoZSBiYXNlIHdpZGdldCBjbGFzcyBhbmQgZmxvd2VkIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9ycyB1c2luZyBhIG5hbWVkCi8vLyBwYXJhbWV0ZXIuCmNsYXNzIFdpZGdldENyZWF0b3JUcmFja2VyIHsKICBDbGFzcyBfd2lkZ2V0Q2xhc3M7CiAgQ2xhc3MgX2xvY2F0aW9uQ2xhc3M7CgogIC8vLyBNYXJrZXIgaW50ZXJmYWNlIGluZGljYXRpbmcgdGhhdCBhIHByaXZhdGUgX2xvY2F0aW9uIGZpZWxkIGlzCiAgLy8vIGF2YWlsYWJsZS4KICBDbGFzcyBfaGFzQ3JlYXRpb25Mb2NhdGlvbkNsYXNzOwoKICBXaWRnZXRDcmVhdG9yVHJhY2tlcigpOwoKICB2b2lkIF9yZXNvbHZlRmx1dHRlckNsYXNzZXMoSXRlcmFibGU8TGlicmFyeT4gbGlicmFyaWVzKSB7CiAgICAvLyBJZiB0aGUgV2lkZ2V0IG9yIERlYnVnIGxvY2F0aW9uIGNsYXNzZXMgaGF2ZSBiZWVuIHVwZGF0ZWQgd2UgbmVlZCB0byBnZXQKICAgIC8vIHRoZSBsYXRlc3QgdmVyc2lvbgogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGZpbmFsIFVyaSBpbXBvcnRVcmkgPSBsaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgaWYgKGltcG9ydFVyaSAhPSBudWxsICYmIGltcG9ydFVyaS5zY2hlbWUgPT0gJ3BhY2thZ2UnKSB7CiAgICAgICAgaWYgKGltcG9ydFVyaS5wYXRoID09ICdmbHV0dGVyL3NyYy93aWRnZXRzL2ZyYW1ld29yay5kYXJ0JyB8fAogICAgICAgICAgICBpbXBvcnRVcmkucGF0aCA9PSAnZmx1dHRlcl93ZWIvc3JjL3dpZGdldHMvZnJhbWV3b3JrLmRhcnQnKSB7CiAgICAgICAgICBmb3IgKENsYXNzIGNsYXNzXyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICAgICAgaWYgKGNsYXNzXy5uYW1lID09ICdXaWRnZXQnKSB7CiAgICAgICAgICAgICAgX3dpZGdldENsYXNzID0gY2xhc3NfOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChpbXBvcnRVcmkucGF0aCA9PSAnZmx1dHRlci9zcmMvd2lkZ2V0cy93aWRnZXRfaW5zcGVjdG9yLmRhcnQnIHx8CiAgICAgICAgICAgICAgaW1wb3J0VXJpLnBhdGggPT0KICAgICAgICAgICAgICAgICAgJ2ZsdXR0ZXJfd2ViL3NyYy93aWRnZXRzL3dpZGdldF9pbnNwZWN0b3IuZGFydCcpIHsKICAgICAgICAgICAgZm9yIChDbGFzcyBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgICAgICAgaWYgKGNsYXNzXy5uYW1lID09ICdfSGFzQ3JlYXRpb25Mb2NhdGlvbicpIHsKICAgICAgICAgICAgICAgIF9oYXNDcmVhdGlvbkxvY2F0aW9uQ2xhc3MgPSBjbGFzc187CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc18ubmFtZSA9PSAnX0xvY2F0aW9uJykgewogICAgICAgICAgICAgICAgX2xvY2F0aW9uQ2xhc3MgPSBjbGFzc187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gTW9kaWZ5IFtjbGF6el0gdG8gYWRkIGEgZmllbGQgbmFtZWQgW19sb2NhdGlvbkZpZWxkTmFtZV0gdGhhdCBpcyB0aGUKICAvLy8gZmlyc3QgcGFyYW1ldGVyIG9mIGFsbCBjb25zdHJ1Y3RvcnMgb2YgdGhlIGNsYXNzLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgYnV0IGRvIG5vdAogIC8vLyBleHRlbmQgW1dpZGdldF0uCiAgdm9pZCBfdHJhbnNmb3JtQ2xhc3NJbXBsZW1lbnRpbmdXaWRnZXQoQ2xhc3MgY2xhenopIHsKICAgIGlmIChjbGF6ei5maWVsZHMKICAgICAgICAuYW55KChGaWVsZCBmaWVsZCkgPT4gZmllbGQubmFtZS5uYW1lID09IF9sb2NhdGlvbkZpZWxkTmFtZSkpIHsKICAgICAgLy8gVGhpcyBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIHRyYW5zZm9ybWVkLiBTa2lwCiAgICAgIHJldHVybjsKICAgIH0KICAgIGNsYXp6LmltcGxlbWVudGVkVHlwZXMKICAgICAgICAuYWRkKG5ldyBTdXBlcnR5cGUoX2hhc0NyZWF0aW9uTG9jYXRpb25DbGFzcywgPERhcnRUeXBlPltdKSk7CiAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHVzZSB0aGUgbGlicmFyeSBjb250ZXh0IG9mIHRoZSBfSGFzQ3JlYXRpb25Mb2NhdGlvbgogICAgLy8gY2xhc3MgZm9yIHRoZSBwcml2YXRlIGZpZWxkIGV2ZW4gaWYgW2NsYXp6XSBpcyBpbiBhIGRpZmZlcmVudCBsaWJyYXJ5CiAgICAvLyBzbyB0aGF0IGFsbCBjbGFzc2VzIGltcGxlbWVudGluZyBXaWRnZXQgYmVoYXZlIGNvbnNpc3RlbnRseS4KICAgIGZpbmFsIE5hbWUgZmllbGROYW1lID0gbmV3IE5hbWUoCiAgICAgIF9sb2NhdGlvbkZpZWxkTmFtZSwKICAgICAgX2hhc0NyZWF0aW9uTG9jYXRpb25DbGFzcy5lbmNsb3NpbmdMaWJyYXJ5LAogICAgKTsKICAgIGZpbmFsIEZpZWxkIGxvY2F0aW9uRmllbGQgPSBuZXcgRmllbGQoZmllbGROYW1lLAogICAgICAgIHR5cGU6IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBfbG9jYXRpb25DbGFzcywgY2xhenouZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgaXNGaW5hbDogdHJ1ZSwKICAgICAgICByZWZlcmVuY2U6IGNsYXp6LnJlZmVyZW5jZS5jYW5vbmljYWxOYW1lCiAgICAgICAgICAgID8uZ2V0Q2hpbGRGcm9tRmllbGRXaXRoTmFtZShmaWVsZE5hbWUpCiAgICAgICAgICAgID8ucmVmZXJlbmNlKTsKICAgIGNsYXp6LmFkZE1lbWJlcihsb2NhdGlvbkZpZWxkKTsKCiAgICBmaW5hbCBTZXQ8Q29uc3RydWN0b3I+IF9oYW5kbGVkQ29uc3RydWN0b3JzID0KICAgICAgICBuZXcgU2V0PENvbnN0cnVjdG9yPi5pZGVudGl0eSgpOwoKICAgIHZvaWQgaGFuZGxlQ29uc3RydWN0b3IoQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFfaGFuZGxlZENvbnN0cnVjdG9ycy5hZGQoY29uc3RydWN0b3IpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGFzc2VydCghX2hhc05hbWVkUGFyYW1ldGVyKAogICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLAogICAgICAgIF9jcmVhdGlvbkxvY2F0aW9uUGFyYW1ldGVyTmFtZSwKICAgICAgKSk7CiAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgICBfY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlck5hbWUsCiAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIF9sb2NhdGlvbkNsYXNzLCBjbGF6ei5lbmNsb3NpbmdMaWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgKTsKICAgICAgaWYgKCFfbWF5YmVBZGROYW1lZFBhcmFtZXRlcihjb25zdHJ1Y3Rvci5mdW5jdGlvbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBib29sIGhhc1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgICAgZm9yIChJbml0aWFsaXplciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgaXMgUmVkaXJlY3RpbmdJbml0aWFsaXplcikgewogICAgICAgICAgaWYgKGluaXRpYWxpemVyLnRhcmdldC5lbmNsb3NpbmdDbGFzcyA9PSBjbGF6eikgewogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGlzIGNvbnN0cnVjdG9yIGZpcnN0IG9yIHRoZSBjYWxsIHRvCiAgICAgICAgICAgIC8vIGFkZERlYnVnTG9jYXRpb25Bcmd1bWVudCBiZWxsb3cgd2lsbCBmYWlsIGR1ZSB0byB0aGUgbmFtZWQKICAgICAgICAgICAgLy8gcGFyYW1ldGVyIG5vdCB5ZXQgZXhpc3Rpbmcgb24gdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAgICBoYW5kbGVDb25zdHJ1Y3Rvcihpbml0aWFsaXplci50YXJnZXQpOwogICAgICAgICAgfQogICAgICAgICAgX21heWJlQWRkQ3JlYXRpb25Mb2NhdGlvbkFyZ3VtZW50KAogICAgICAgICAgICBpbml0aWFsaXplci5hcmd1bWVudHMsCiAgICAgICAgICAgIGluaXRpYWxpemVyLnRhcmdldC5mdW5jdGlvbiwKICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSwKICAgICAgICAgICAgX2xvY2F0aW9uQ2xhc3MsCiAgICAgICAgICApOwogICAgICAgICAgaGFzUmVkaXJlY3RpbmdJbml0aWFsaXplciA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFoYXNSZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmFkZChuZXcgRmllbGRJbml0aWFsaXplcigKICAgICAgICAgIGxvY2F0aW9uRmllbGQsCiAgICAgICAgICBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpLAogICAgICAgICkpOwogICAgICAgIC8vIFRPRE8oamFjb2JyKTogYWRkIGFuIGFzc2VydCB2ZXJpZnlpbmcgdGhlIGxvY2F0aW9uRmllbGQgaXMgbm90CiAgICAgICAgLy8gbnVsbC4gQ3VycmVudGx5LCB3ZSBjYW5ub3Qgc2FmZWx5IGFkZCB0aGlzIGFzc2VydCBiZWNhdXNlIHdlIGRvIG5vdAogICAgICAgIC8vIGhhbmRsZSBXaWRnZXQgY2xhc3NlcyB3aXRoIG9wdGlvbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzLiBUaGVyZSBhcmUKICAgICAgICAvLyBubyBXaWRnZXQgY2xhc3NlcyBpbiB0aGUgZmx1dHRlciByZXBvIHdpdGggb3B0aW9uYWwgcG9zaXRpb25hbAogICAgICAgIC8vIGFyZ3VtZW50cyBidXQgaXQgaXMgcG9zc2libGUgdXNlcnMgY291bGQgYWRkIGNsYXNzZXMgd2l0aCBvcHRpb25hbAogICAgICAgIC8vIHBvc2l0aW9uYWwgYXJndW1lbnRzLgogICAgICAgIC8vCiAgICAgICAgLy8gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmFkZChuZXcgQXNzZXJ0SW5pdGlhbGl6ZXIobmV3IEFzc2VydFN0YXRlbWVudCgKICAgICAgICAvLyAgIG5ldyBJc0V4cHJlc3Npb24oCiAgICAgICAgLy8gICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSwgX2xvY2F0aW9uQ2xhc3MudGhpc1R5cGUpLAogICAgICAgIC8vICAgY29uZGl0aW9uU3RhcnRPZmZzZXQ6IGNvbnN0cnVjdG9yLmZpbGVPZmZzZXQsCiAgICAgICAgLy8gICBjb25kaXRpb25FbmRPZmZzZXQ6IGNvbnN0cnVjdG9yLmZpbGVPZmZzZXQsCiAgICAgICAgLy8gKSkpOwogICAgICB9CiAgICB9CgogICAgLy8gQWRkIG5hbWVkIHBhcmFtZXRlcnMgdG8gYWxsIGNvbnN0cnVjdG9ycy4KICAgIGNsYXp6LmNvbnN0cnVjdG9ycy5mb3JFYWNoKGhhbmRsZUNvbnN0cnVjdG9yKTsKICB9CgogIC8vLyBUcmFuc2Zvcm0gdGhlIGdpdmVuIFtsaWJyYXJpZXNdLgogIHZvaWQgdHJhbnNmb3JtKENvbXBvbmVudCBtb2R1bGUsIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzKSB7CiAgICBpZiAobGlicmFyaWVzLmlzRW1wdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIF9yZXNvbHZlRmx1dHRlckNsYXNzZXMobW9kdWxlLmxpYnJhcmllcyk7CgogICAgaWYgKF93aWRnZXRDbGFzcyA9PSBudWxsKSB7CiAgICAgIC8vIFRoaXMgYXBwbGljYXRpb24gZG9lc24ndCBhY3R1YWxseSB1c2UgdGhlIHBhY2thZ2U6Zmx1dHRlciBsaWJyYXJ5LgogICAgICByZXR1cm47CiAgICB9CgogICAgZmluYWwgU2V0PENsYXNzPiB0cmFuc2Zvcm1lZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzPi5pZGVudGl0eSgpOwogICAgZmluYWwgU2V0PExpYnJhcnk+IGxpYnJhcmllc1RvVHJhbnNmb3JtID0gbmV3IFNldDxMaWJyYXJ5Pi5pZGVudGl0eSgpCiAgICAgIC4uYWRkQWxsKGxpYnJhcmllcyk7CgogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGZvciAoQ2xhc3MgY2xhc3NfIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgIF90cmFuc2Zvcm1XaWRnZXRDb25zdHJ1Y3RvcnMoCiAgICAgICAgICBsaWJyYXJpZXNUb1RyYW5zZm9ybSwKICAgICAgICAgIHRyYW5zZm9ybWVkQ2xhc3NlcywKICAgICAgICAgIGNsYXNzXywKICAgICAgICApOwogICAgICB9CiAgICB9CgogICAgLy8gVHJhbnNmb3JtIGNhbGwgc2l0ZXMgdG8gcGFzcyB0aGUgbG9jYXRpb24gcGFyYW1ldGVyLgogICAgZmluYWwgX1dpZGdldENhbGxTaXRlVHJhbnNmb3JtZXIgY2FsbHNpdGVUcmFuc2Zvcm1lciA9CiAgICAgICAgbmV3IF9XaWRnZXRDYWxsU2l0ZVRyYW5zZm9ybWVyKAogICAgICAgICAgICB3aWRnZXRDbGFzczogX3dpZGdldENsYXNzLAogICAgICAgICAgICBsb2NhdGlvbkNsYXNzOiBfbG9jYXRpb25DbGFzcywKICAgICAgICAgICAgdHJhY2tlcjogdGhpcyk7CgogICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGNhbGxzaXRlVHJhbnNmb3JtZXIuZW50ZXJMaWJyYXJ5KGxpYnJhcnkpOwogICAgICBsaWJyYXJ5LnRyYW5zZm9ybUNoaWxkcmVuKGNhbGxzaXRlVHJhbnNmb3JtZXIpOwogICAgICBjYWxsc2l0ZVRyYW5zZm9ybWVyLmV4aXRMaWJyYXJ5KCk7CiAgICB9CiAgfQoKICBib29sIF9pc1N1YmNsYXNzT2ZXaWRnZXQoQ2xhc3MgY2xhenopID0+IF9pc1N1YmNsYXNzT2YoY2xhenosIF93aWRnZXRDbGFzcyk7CgogIGJvb2wgX2lzU3ViY2xhc3NPZihDbGFzcyBhLCBDbGFzcyBiKSB7CiAgICAvLyBUT0RPKGFza2VzYyk6IENhY2hlIHJlc3VsdHMuCiAgICAvLyBUT0RPKGFza2VzYyk6IFRlc3QgZm9yIHN1YnR5cGUgcmF0aGVyIHRoYW4gc3ViY2xhc3MuCiAgICBDbGFzcyBjdXJyZW50ID0gYTsKICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgaWYgKGN1cnJlbnQgPT0gYikgcmV0dXJuIHRydWU7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnN1cGVyY2xhc3M7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIF90cmFuc2Zvcm1XaWRnZXRDb25zdHJ1Y3RvcnMoU2V0PExpYnJhcnk+IGxpYnJhcmllc1RvQmVUcmFuc2Zvcm1lZCwKICAgICAgU2V0PENsYXNzPiB0cmFuc2Zvcm1lZENsYXNzZXMsIENsYXNzIGNsYXp6KSB7CiAgICBpZiAoIV9pc1N1YmNsYXNzT2ZXaWRnZXQoY2xhenopIHx8CiAgICAgICAgIWxpYnJhcmllc1RvQmVUcmFuc2Zvcm1lZC5jb250YWlucyhjbGF6ei5lbmNsb3NpbmdMaWJyYXJ5KSB8fAogICAgICAgICF0cmFuc2Zvcm1lZENsYXNzZXMuYWRkKGNsYXp6KSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gRW5zdXJlIHN1cGVyIGNsYXNzZXMgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkIGJlZm9yZSB0aGlzIGNsYXNzLgogICAgaWYgKGNsYXp6LnN1cGVyY2xhc3MgIT0gbnVsbCAmJgogICAgICAgICF0cmFuc2Zvcm1lZENsYXNzZXMuY29udGFpbnMoY2xhenouc3VwZXJjbGFzcykpIHsKICAgICAgX3RyYW5zZm9ybVdpZGdldENvbnN0cnVjdG9ycygKICAgICAgICBsaWJyYXJpZXNUb0JlVHJhbnNmb3JtZWQsCiAgICAgICAgdHJhbnNmb3JtZWRDbGFzc2VzLAogICAgICAgIGNsYXp6LnN1cGVyY2xhc3MsCiAgICAgICk7CiAgICB9CgogICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGNsYXp6LnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2NlZHVyZS5pc0ZhY3RvcnkpIHsKICAgICAgICBfbWF5YmVBZGROYW1lZFBhcmFtZXRlcigKICAgICAgICAgIHByb2NlZHVyZS5mdW5jdGlvbiwKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKF9jcmVhdGlvbkxvY2F0aW9uUGFyYW1ldGVyTmFtZSwKICAgICAgICAgICAgICB0eXBlOiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgICAgX2xvY2F0aW9uQ2xhc3MsIGNsYXp6LmVuY2xvc2luZ0xpYnJhcnkubm9uTnVsbGFibGUpLAogICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGNsYXp6LmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgKTsKICAgICAgfQogICAgfQoKICAgIC8vIEhhbmRsZSB0aGUgd2lkZ2V0IGNsYXNzIGFuZCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IGJ1dCBkbyBub3QgZXh0ZW5kIHRoZQogICAgLy8gd2lkZ2V0IGNsYXNzLgogICAgaWYgKCFfaXNTdWJjbGFzc09mV2lkZ2V0KGNsYXp6LnN1cGVyY2xhc3MpKSB7CiAgICAgIF90cmFuc2Zvcm1DbGFzc0ltcGxlbWVudGluZ1dpZGdldChjbGF6eik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBTZXQ8Q29uc3RydWN0b3I+IF9oYW5kbGVkQ29uc3RydWN0b3JzID0KICAgICAgICBuZXcgU2V0PENvbnN0cnVjdG9yPi5pZGVudGl0eSgpOwoKICAgIHZvaWQgaGFuZGxlQ29uc3RydWN0b3IoQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFfaGFuZGxlZENvbnN0cnVjdG9ycy5hZGQoY29uc3RydWN0b3IpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oCiAgICAgICAgICBfY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlck5hbWUsCiAgICAgICAgICB0eXBlOiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICBfbG9jYXRpb25DbGFzcywgY2xhenouZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgICBpc1JlcXVpcmVkOiBjbGF6ei5lbmNsb3NpbmdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgICBpZiAoX2hhc05hbWVkUGFyYW1ldGVyKAogICAgICAgICAgY29uc3RydWN0b3IuZnVuY3Rpb24sIF9jcmVhdGlvbkxvY2F0aW9uUGFyYW1ldGVyTmFtZSkpIHsKICAgICAgICAvLyBDb25zdHJ1Y3RvciB3YXMgYWxyZWFkeSByZXdyaXR0ZW4uIFRPRE8oamFjb2JyKTogaXMgdGhpcyBjYXNlIGFjdHVhbGx5IGhpdD8KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFfbWF5YmVBZGROYW1lZFBhcmFtZXRlcihjb25zdHJ1Y3Rvci5mdW5jdGlvbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgaW4gY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgaWYgKGluaXRpYWxpemVyIGlzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIpIHsKICAgICAgICAgIGlmIChpbml0aWFsaXplci50YXJnZXQuZW5jbG9zaW5nQ2xhc3MgPT0gY2xhenopIHsKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgdGhpcyBjb25zdHJ1Y3RvciBmaXJzdCBvciB0aGUgY2FsbCB0bwogICAgICAgICAgICAvLyBhZGREZWJ1Z0xvY2F0aW9uQXJndW1lbnQgY291bGQgZmFpbCBkdWUgdG8gdGhlIG5hbWVkIHBhcmFtZXRlcgogICAgICAgICAgICAvLyBub3QgZXhpc3RpbmcuCiAgICAgICAgICAgIGhhbmRsZUNvbnN0cnVjdG9yKGluaXRpYWxpemVyLnRhcmdldCk7CiAgICAgICAgICB9CgogICAgICAgICAgX21heWJlQWRkQ3JlYXRpb25Mb2NhdGlvbkFyZ3VtZW50KAogICAgICAgICAgICBpbml0aWFsaXplci5hcmd1bWVudHMsCiAgICAgICAgICAgIGluaXRpYWxpemVyLnRhcmdldC5mdW5jdGlvbiwKICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKSwKICAgICAgICAgICAgX2xvY2F0aW9uQ2xhc3MsCiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXIgaXMgU3VwZXJJbml0aWFsaXplciAmJgogICAgICAgICAgICBfaXNTdWJjbGFzc09mV2lkZ2V0KGluaXRpYWxpemVyLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpIHsKICAgICAgICAgIF9tYXliZUFkZENyZWF0aW9uTG9jYXRpb25Bcmd1bWVudCgKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuYXJndW1lbnRzLAogICAgICAgICAgICBpbml0aWFsaXplci50YXJnZXQuZnVuY3Rpb24sCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSksCiAgICAgICAgICAgIF9sb2NhdGlvbkNsYXNzLAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjbGF6ei5jb25zdHJ1Y3RvcnMuZm9yRWFjaChoYW5kbGVDb25zdHJ1Y3Rvcik7CiAgfQp9CoJIAE5OPAFDASEBFgFOA1EjLi8BTxYETlA8MAE+IkcCAUMZSQIBKBkYBEQrGAYEDwIBT0EETUxQUE5MTQ0oFxkfFwRGDARHT0cHUUorMA4GBAEoTSQmAgFPRx4ZIARGURkSBE8RURIEHioPAgFKThMETUUeN0MGTisWAUoYAUkGTzIdASEBOAZRFhsBHiQlLyQoHAFESz0GS0pMTU0qLBkRJBkHP0JGBxQpQQYYSwYmEE8GJik3FQcEAQwtGh4kHhMGIgQBKjgEAQxCIiodEwY6MhMGAUMRBAFOICcWEDoWBwQBDFEiATE/MhMGAUgRBAFQIExEIyBBUCIoCS87CAYBMC07I1A8PTsxHR4ZCgY6MR0fGQoGHxArHBZMFwkHBAEnDCE8SB8EARckRRwEAgFKRwRJTw8dFhgBRBEjARoBPVAaKS9ARkoyKyUODBFPIEU0OzQ3KRAODAoIBgQBSzgGThc4FUg3DgYbRkxNRCUaMgc1IUEXMTMaJAEyKQE2NBAIIh4oCkQoIUEJRhAIAS5CNTxHSj4zDC0jKSccDSwRCggoOxklDEpPT0pOIQtTH0Y7ORAIBgExMwQBJz4dDgYBLgEgTA4GAUVKGwEpLiYgHhILCAYBPDsoJyscASkxNikGBAFPASkkPBceJSQGEgQBSzQnRioOBgFFJDokIhwaCQYBNCEhHkInR0oLCAYBUBUyMA4GATIpATY0EAgBRCojQ0YeQ1cQCEYQCEI1PEdOHTMMAS0jKSccDTZGLSMpJxwNCggGATMEAgFGcGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL3RyYWNrX3dpZGdldF9jb25zdHJ1Y3Rvcl9sb2NhdGlvbnMuZGFydGVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9rZXJuZWwvbGliL3RyYW5zZm9ybWF0aW9ucy9taXhpbl9mdWxsX3Jlc29sdXRpb24uZGFydL5YLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBrZXJuZWwudHJhbnNmb3JtYXRpb25zLm1peGluX2Z1bGxfcmVzb2x1dGlvbjsKCmltcG9ydCAnLi4vYXN0LmRhcnQnOwppbXBvcnQgJy4uL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICcuLi9jbG9uZS5kYXJ0JzsKaW1wb3J0ICcuLi9jb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJy4uL3JlZmVyZW5jZV9mcm9tX2luZGV4LmRhcnQnOwppbXBvcnQgJy4uL3RhcmdldC90YXJnZXRzLmRhcnQnIHNob3cgVGFyZ2V0OwppbXBvcnQgJy4uL3R5cGVfYWxnZWJyYS5kYXJ0JzsKCi8vLyBUcmFuc2Zvcm1zIHRoZSBsaWJyYXJpZXMgaW4gW2xpYnJhcmllc10uCi8vLyBOb3RlIHRoYXQgW3JlZmVyZW5jZUZyb21JbmRleF0gY2FuIGJlIG51bGwsIGFuZCBpcyBnZW5lcmFsbHkgb25seSBuZWVkZWQKLy8vIHdoZW4gKHVsdGltYXRlbHkpIGNhbGxlZCBmcm9tIHRoZSBpbmNyZW1lbnRhbCBjb21waWxlci4Kdm9pZCB0cmFuc2Zvcm1MaWJyYXJpZXMoCiAgICBUYXJnZXQgdGFyZ2V0SW5mbywKICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgIFJlZmVyZW5jZUZyb21JbmRleCByZWZlcmVuY2VGcm9tSW5kZXgsCiAgICB7Ym9vbCBkb1N1cGVyUmVzb2x1dGlvbjogdHJ1ZX0pIHsKICBuZXcgTWl4aW5GdWxsUmVzb2x1dGlvbih0YXJnZXRJbmZvLCBjb3JlVHlwZXMsIGhpZXJhcmNoeSwKICAgICAgICAgIGRvU3VwZXJSZXNvbHV0aW9uOiBkb1N1cGVyUmVzb2x1dGlvbikKICAgICAgLnRyYW5zZm9ybShsaWJyYXJpZXMsIHJlZmVyZW5jZUZyb21JbmRleCk7Cn0KCi8vLyBSZXBsYWNlcyBhbGwgbWl4aW4gYXBwbGljYXRpb25zIHdpdGggcmVndWxhciBjbGFzc2VzLCBjbG9uaW5nIGFsbCBmaWVsZHMKLy8vIGFuZCBwcm9jZWR1cmVzIGZyb20gdGhlIG1peGVkLWluIGNsYXNzLCBjbG9uaW5nIGFsbCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUKLy8vIGJhc2UgY2xhc3MuCi8vLwovLy8gV2hlbiBbZG9TdXBlclJlc29sdXRpb25dIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBpcyBbdHJ1ZV0sIHN1cGVyIGNhbGxzCi8vLyAoYXMgd2VsbCBhcyBzdXBlciBpbml0aWFsaXplciBpbnZvY2F0aW9ucykgYXJlIGFsc28gcmVzb2x2ZWQgdG8gdGhlaXIKLy8vIHRhcmdldHMgaW4gdGhpcyBwYXNzLgpjbGFzcyBNaXhpbkZ1bGxSZXNvbHV0aW9uIHsKICBmaW5hbCBUYXJnZXQgdGFyZ2V0SW5mbzsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICAvLy8gVGhlIFtDbGFzc0hpZXJhcmNoeV0gdGhhdCBzaG91bGQgYmUgdXNlZCBhZnRlciBhcHBseWluZyB0aGlzIHRyYW5zZm9ybWVyLgogIC8vLyBJZiBhbnkgY2xhc3Mgd2FzIHVwZGF0ZWQsIGluIGdlbmVyYWwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcKICAvLy8gW0NsYXNzSGllcmFyY2h5XSBpbnN0YW5jZSwgd2l0aCBuZXcgZGlzcGF0Y2ggdGFyZ2V0czsgb3IgYXQgbGVhc3QgbGV0CiAgLy8vIHRoZSBleGlzdGluZyBpbnN0YW5jZSBrbm93IHRoYXQgc29tZSBvZiBpdHMgZGlzcGF0Y2ggdGFibGVzIGFyZSBub3QKICAvLy8gdmFsaWQgYW55bW9yZS4KICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CgogIC8vIFRoaXMgZW5hYmxlcyBgc3VwZXJgIHJlc29sdXRpb24gdHJhbnNmb3JtYXRpb24sIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlCiAgLy8gd2l0aCBEYXJ0IFZNJ3MgcmVxdWlyZW1lbnRzIGFyb3VuZCBpbmNyZW1lbnRhbCBjb21waWxhdGlvbiBhbmQgaGFzIGJlZW4KICAvLyBtb3ZlZCB0byBEYXJ0IFZNIGl0c2VsZi4KICBmaW5hbCBib29sIGRvU3VwZXJSZXNvbHV0aW9uOwoKICBNaXhpbkZ1bGxSZXNvbHV0aW9uKHRoaXMudGFyZ2V0SW5mbywgdGhpcy5jb3JlVHlwZXMsIHRoaXMuaGllcmFyY2h5LAogICAgICB7dGhpcy5kb1N1cGVyUmVzb2x1dGlvbjogdHJ1ZX0pOwoKICAvLy8gVHJhbnNmb3JtIHRoZSBnaXZlbiBuZXcgW2xpYnJhcmllc10uICBJdCBpcyBleHBlY3RlZCB0aGF0IGFsbCBvdGhlcgogIC8vLyBsaWJyYXJpZXMgaGF2ZSBhbHJlYWR5IGJlZW4gdHJhbnNmb3JtZWQuCiAgdm9pZCB0cmFuc2Zvcm0oCiAgICAgIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLCBSZWZlcmVuY2VGcm9tSW5kZXggcmVmZXJlbmNlRnJvbUluZGV4KSB7CiAgICBpZiAobGlicmFyaWVzLmlzRW1wdHkpIHJldHVybjsKCiAgICB2YXIgdHJhbnNmb3JtZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzcz4oKTsKCiAgICAvLyBEZXN1Z2FyIGFsbCBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzc2VzIGJ5IGNvcHlpbmcgaW4gZmllbGRzL21ldGhvZHMgZnJvbQogICAgLy8gdGhlIG1peGluIGFuZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgYmFzZSBjbGFzcy4KICAgIHZhciBwcm9jZXNzZWRDbGFzc2VzID0gbmV3IFNldDxDbGFzcz4oKTsKICAgIGZvciAodmFyIGxpYnJhcnkgaW4gbGlicmFyaWVzKSB7CiAgICAgIGZvciAodmFyIGNsYXNzXyBpbiBsaWJyYXJ5LmNsYXNzZXMpIHsKICAgICAgICB0cmFuc2Zvcm1DbGFzcyhsaWJyYXJpZXMsIHByb2Nlc3NlZENsYXNzZXMsIHRyYW5zZm9ybWVkQ2xhc3NlcywgY2xhc3NfLAogICAgICAgICAgICByZWZlcmVuY2VGcm9tSW5kZXgpOwogICAgICB9CiAgICB9CgogICAgLy8gV2UgbWlnaHQgbmVlZCB0byB1cGRhdGUgdGhlIGNsYXNzIGhpZXJhcmNoeS4KICAgIGhpZXJhcmNoeSA9CiAgICAgICAgaGllcmFyY2h5LmFwcGx5TWVtYmVyQ2hhbmdlcyh0cmFuc2Zvcm1lZENsYXNzZXMsIGZpbmREZXNjZW5kYW50czogdHJ1ZSk7CgogICAgaWYgKCFkb1N1cGVyUmVzb2x1dGlvbikgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZXNvbHZlIGFsbCBzdXBlciBjYWxsIGV4cHJlc3Npb25zIGFuZCBzdXBlciBpbml0aWFsaXplcnMuCiAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGxpYnJhcmllcykgewogICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgZm9yICh2YXIgcHJvY2VkdXJlIGluIGNsYXNzXy5wcm9jZWR1cmVzKSB7CiAgICAgICAgICBpZiAocHJvY2VkdXJlLmNvbnRhaW5zU3VwZXJDYWxscykgewogICAgICAgICAgICBuZXcgU3VwZXJDYWxsUmVzb2x1dGlvblRyYW5zZm9ybWVyKAogICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeSwgY29yZVR5cGVzLCBjbGFzc18uc3VwZXJjbGFzcywgdGFyZ2V0SW5mbykKICAgICAgICAgICAgICAgIC52aXNpdChwcm9jZWR1cmUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdHJhbnNmb3JtQ2xhc3MoCiAgICAgIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzVG9CZVRyYW5zZm9ybWVkLAogICAgICBTZXQ8Q2xhc3M+IHByb2Nlc3NlZENsYXNzZXMsCiAgICAgIFNldDxDbGFzcz4gdHJhbnNmb3JtZWRDbGFzc2VzLAogICAgICBDbGFzcyBjbGFzc18sCiAgICAgIFJlZmVyZW5jZUZyb21JbmRleCByZWZlcmVuY2VGcm9tSW5kZXgpIHsKICAgIC8vIElmIHRoaXMgY2xhc3Mgd2FzIGFscmVhZHkgaGFuZGxlZCB0aGVuIHNvIHdlcmUgYWxsIGNsYXNzZXMgdXAgdG8gdGhlCiAgICAvLyBbT2JqZWN0XSBjbGFzcy4KICAgIGlmICghcHJvY2Vzc2VkQ2xhc3Nlcy5hZGQoY2xhc3NfKSkgcmV0dXJuOwoKICAgIExpYnJhcnkgZW5jbG9zaW5nTGlicmFyeSA9IGNsYXNzXy5lbmNsb3NpbmdMaWJyYXJ5OwoKICAgIGlmICghbGlicmFyaWVzVG9CZVRyYW5zZm9ybWVkLmNvbnRhaW5zKGVuY2xvc2luZ0xpYnJhcnkpICYmCiAgICAgICAgZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk/LnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgLy8gSWYgd2UncmUgbm90IGFza2VkIHRvIHRyYW5zZm9ybSB0aGUgcGxhdGZvcm0gbGlicmFyaWVzIHRoZW4gd2UgZXhwZWN0CiAgICAgIC8vIHRoYXQgdGhleSB3aWxsIGJlIGFscmVhZHkgdHJhbnNmb3JtZWQuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBFbnN1cmUgc3VwZXIgY2xhc3NlcyBoYXZlIGJlZW4gdHJhbnNmb3JtZWQgYmVmb3JlIHRoaXMgY2xhc3MuCiAgICBpZiAoY2xhc3NfLnN1cGVyY2xhc3MgIT0gbnVsbCAmJgogICAgICAgIGNsYXNzXy5zdXBlcmNsYXNzLmxldmVsLmluZGV4ID49IENsYXNzTGV2ZWwuTWl4aW4uaW5kZXgpIHsKICAgICAgdHJhbnNmb3JtQ2xhc3MobGlicmFyaWVzVG9CZVRyYW5zZm9ybWVkLCBwcm9jZXNzZWRDbGFzc2VzLAogICAgICAgICAgdHJhbnNmb3JtZWRDbGFzc2VzLCBjbGFzc18uc3VwZXJjbGFzcywgcmVmZXJlbmNlRnJvbUluZGV4KTsKICAgIH0KCiAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG1peGluIGFwcGxpY2F0aW9uIHdlIGRvbid0IG5lZWQgdG8gbWFrZSBmb3J3YXJkaW5nCiAgICAvLyBjb25zdHJ1Y3RvcnMgaW4gdGhpcyBjbGFzcy4KICAgIGlmICghY2xhc3NfLmlzTWl4aW5BcHBsaWNhdGlvbikgcmV0dXJuOwogICAgYXNzZXJ0KGxpYnJhcmllc1RvQmVUcmFuc2Zvcm1lZC5jb250YWlucyhlbmNsb3NpbmdMaWJyYXJ5KSk7CgogICAgaWYgKGNsYXNzXy5taXhlZEluQ2xhc3MubGV2ZWwuaW5kZXggPCBDbGFzc0xldmVsLk1peGluLmluZGV4KSB7CiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCiAgICAgICAgICAnQ2xhc3MgIiR7Y2xhc3NfLm5hbWV9IiBtaXhlcyBpbiAiJHtjbGFzc18ubWl4ZWRJbkNsYXNzLm5hbWV9IiBmcm9tJwogICAgICAgICAgJyBhbiBleHRlcm5hbCBsaWJyYXJ5LiAgRGlkIHlvdSBmb3JnZXQgLS1saW5rPycpOwogICAgfQoKICAgIHRyYW5zZm9ybWVkQ2xhc3Nlcy5hZGQoY2xhc3NfKTsKCiAgICAvLyBDbG9uZSBmaWVsZHMgYW5kIG1ldGhvZHMgZnJvbSB0aGUgbWl4aW4gY2xhc3MuCiAgICB2YXIgc3Vic3RpdHV0aW9uID0gZ2V0U3Vic3RpdHV0aW9uTWFwKGNsYXNzXy5taXhlZEluVHlwZSk7CiAgICB2YXIgY2xvbmVyID0gbmV3IENsb25lVmlzaXRvcldpdGhNZW1iZXJzKHR5cGVTdWJzdGl0dXRpb246IHN1YnN0aXR1dGlvbik7CgogICAgLy8gV2hlbiB3ZSBjb3B5IGEgZmllbGQgZnJvbSB0aGUgbWl4ZWQgaW4gY2xhc3MsIHdlIHJlbW92ZSBhbnkKICAgIC8vIGZvcndhcmRpbmctc3R1YiBnZXR0ZXJzL3NldHRlcnMgZnJvbSB0aGUgc3VwZXJjbGFzcywgYnV0IGNvcHkgdGhlaXIKICAgIC8vIGNvdmFyaWFuY2UtYml0cyBvbnRvIHRoZSBuZXcgZmllbGQuCiAgICB2YXIgbm9uU2V0dGVycyA9IDxOYW1lLCBQcm9jZWR1cmU+e307CiAgICB2YXIgc2V0dGVycyA9IDxOYW1lLCBQcm9jZWR1cmU+e307CiAgICBmb3IgKHZhciBwcm9jZWR1cmUgaW4gY2xhc3NfLnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2NlZHVyZS5pc1NldHRlcikgewogICAgICAgIHNldHRlcnNbcHJvY2VkdXJlLm5hbWVdID0gcHJvY2VkdXJlOwogICAgICB9IGVsc2UgewogICAgICAgIG5vblNldHRlcnNbcHJvY2VkdXJlLm5hbWVdID0gcHJvY2VkdXJlOwogICAgICB9CiAgICB9CgogICAgSW5kZXhlZExpYnJhcnkgaW5kZXhlZExpYnJhcnkgPQogICAgICAgIHJlZmVyZW5jZUZyb21JbmRleD8ubG9va3VwTGlicmFyeShlbmNsb3NpbmdMaWJyYXJ5KTsKICAgIEluZGV4ZWRDbGFzcyBpbmRleGVkQ2xhc3MgPSBpbmRleGVkTGlicmFyeT8ubG9va3VwSW5kZXhlZENsYXNzKGNsYXNzXy5uYW1lKTsKCiAgICBmb3IgKHZhciBmaWVsZCBpbiBjbGFzc18ubWl4aW4uZmllbGRzKSB7CiAgICAgIEZpZWxkIGNsb25lID0KICAgICAgICAgIGNsb25lci5jbG9uZUZpZWxkKGZpZWxkLCBpbmRleGVkQ2xhc3M/Lmxvb2t1cEZpZWxkKGZpZWxkLm5hbWUubmFtZSkpOwogICAgICBQcm9jZWR1cmUgc2V0dGVyID0gc2V0dGVyc1tmaWVsZC5uYW1lXTsKICAgICAgaWYgKHNldHRlciAhPSBudWxsKSB7CiAgICAgICAgc2V0dGVycy5yZW1vdmUoZmllbGQubmFtZSk7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPQogICAgICAgICAgICBzZXR0ZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuZmlyc3Q7CiAgICAgICAgY2xvbmUuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogICAgICB9CiAgICAgIG5vblNldHRlcnMucmVtb3ZlKGZpZWxkLm5hbWUpOwogICAgICBjbGFzc18uYWRkTWVtYmVyKGNsb25lKTsKICAgIH0KICAgIGNsYXNzXy5wcm9jZWR1cmVzLmNsZWFyKCk7CiAgICBjbGFzc18ucHJvY2VkdXJlcy4uYWRkQWxsKG5vblNldHRlcnMudmFsdWVzKS4uYWRkQWxsKHNldHRlcnMudmFsdWVzKTsKCiAgICAvLyBFeGlzdGluZyBwcm9jZWR1cmVzIGluIHRoZSBjbGFzcyBzaG91bGQgb25seSBiZSBmb3J3YXJkaW5nIHN0dWJzLgogICAgLy8gUmVwbGFjZSB0aGVtIHdpdGggbWV0aG9kcyBmcm9tIHRoZSBtaXhpbiBjbGFzcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUKICAgIC8vIG5hbWUsIGJ1dCBrZWVwIHRoZWlyIHBhcmFtZXRlciBmbGFncy4KICAgIGludCBvcmlnaW5hbExlbmd0aCA9IGNsYXNzXy5wcm9jZWR1cmVzLmxlbmd0aDsKICAgIG91dGVyOgogICAgZm9yICh2YXIgcHJvY2VkdXJlIGluIGNsYXNzXy5taXhpbi5wcm9jZWR1cmVzKSB7CiAgICAgIC8vIEZvcndhcmRpbmcgc3R1YnMgaW4gdGhlIG1peGluIGNsYXNzIGFyZSB1c2VkIHdoZW4gY2FsbGluZyB0aHJvdWdoIHRoZQogICAgICAvLyBtaXhpbiBjbGFzcydzIGludGVyZmFjZSwgbm90IHdoZW4gY2FsbGluZyB0aHJvdWdoIHRoZSBtaXhpbgogICAgICAvLyBhcHBsaWNhdGlvbi4gIFRoZXkgc2hvdWxkIG5vdCBiZSBjb3BpZWQuCiAgICAgIGlmIChwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU3R1YikgY29udGludWU7CgogICAgICAvLyBGYWN0b3J5IGNvbnN0cnVjdG9ycyBhcmUgbm90IGNsb25lZC4KICAgICAgaWYgKHByb2NlZHVyZS5pc0ZhY3RvcnkpIGNvbnRpbnVlOwoKICAgICAgLy8gTm9TdWNoTWV0aG9kIGZvcndhcmRlcnMgYXJlbid0IGNsb25lZC4KICAgICAgaWYgKHByb2NlZHVyZS5pc05vU3VjaE1ldGhvZEZvcndhcmRlcikgY29udGludWU7CgogICAgICBQcm9jZWR1cmUgcmVmZXJlbmNlRnJvbTsKICAgICAgaWYgKHByb2NlZHVyZS5pc1NldHRlcikgewogICAgICAgIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICBpbmRleGVkQ2xhc3M/Lmxvb2t1cFByb2NlZHVyZVNldHRlcihwcm9jZWR1cmUubmFtZS5uYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWZlcmVuY2VGcm9tID0KICAgICAgICAgICAgaW5kZXhlZENsYXNzPy5sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIocHJvY2VkdXJlLm5hbWUubmFtZSk7CiAgICAgIH0KICAgICAgUHJvY2VkdXJlIGNsb25lID0gY2xvbmVyLmNsb25lUHJvY2VkdXJlKHByb2NlZHVyZSwgcmVmZXJlbmNlRnJvbSk7CiAgICAgIC8vIExpbmVhciBzZWFyY2ggZm9yIGEgZm9yd2FyZGluZyBzdHViIHdpdGggdGhlIHNhbWUgbmFtZS4KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnaW5hbExlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIG9yaWdpbmFsUHJvY2VkdXJlID0gY2xhc3NfLnByb2NlZHVyZXNbaV07CiAgICAgICAgaWYgKG9yaWdpbmFsUHJvY2VkdXJlLm5hbWUgPT0gY2xvbmUubmFtZSAmJgogICAgICAgICAgICBvcmlnaW5hbFByb2NlZHVyZS5raW5kID09IGNsb25lLmtpbmQpIHsKICAgICAgICAgIEZ1bmN0aW9uTm9kZSBzcmMgPSBvcmlnaW5hbFByb2NlZHVyZS5mdW5jdGlvbjsKICAgICAgICAgIEZ1bmN0aW9uTm9kZSBkc3QgPSBjbG9uZS5mdW5jdGlvbjsKCiAgICAgICAgICBpZiAoc3JjLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPQogICAgICAgICAgICAgICAgICBkc3QucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICAgICAgc3JjLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggIT0gZHN0Lm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gQSBjb21waWxlIHRpbWUgZXJyb3IgaGFzIGFscmVhZHkgb2NjdXJyZWQsIGJ1dCBkb24ndCBjcmFzaCBiZWxvdywKICAgICAgICAgICAgLy8gYW5kIGRvbid0IGFkZCBzZXZlcmFsIHByb2NlZHVyZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIHRoZSBjbGFzcy4KICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CiAgICAgICAgICB9CgogICAgICAgICAgYXNzZXJ0KHNyYy50eXBlUGFyYW1ldGVycy5sZW5ndGggPT0gZHN0LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraikgewogICAgICAgICAgICBkc3QudHlwZVBhcmFtZXRlcnNbal0uZmxhZ3MgPSBzcmMudHlwZVBhcmFtZXRlcnNbal0uZmxhZ3M7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraikgewogICAgICAgICAgICBkc3QucG9zaXRpb25hbFBhcmFtZXRlcnNbal0uZmxhZ3MgPQogICAgICAgICAgICAgICAgc3JjLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdLmZsYWdzOwogICAgICAgICAgfQogICAgICAgICAgLy8gVE9ETyhrZXJuZWwgdGVhbSk6IFRoZSBuYW1lZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc29ydGVkLAogICAgICAgICAgLy8gdGhpcyBtaWdodCBub3QgYmUgY29ycmVjdC4KICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraikgewogICAgICAgICAgICBkc3QubmFtZWRQYXJhbWV0ZXJzW2pdLmZsYWdzID0gc3JjLm5hbWVkUGFyYW1ldGVyc1tqXS5mbGFnczsKICAgICAgICAgIH0KCiAgICAgICAgICBvcmlnaW5hbFByb2NlZHVyZS5jYW5vbmljYWxOYW1lPy51bmJpbmQoKTsKICAgICAgICAgIGNsYXNzXy5wcm9jZWR1cmVzW2ldID0gY2xvbmU7CiAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xhc3NfLmFkZE1lbWJlcihjbG9uZSk7CiAgICB9CiAgICBhc3NlcnQoY2xhc3NfLmNvbnN0cnVjdG9ycy5pc05vdEVtcHR5KTsKCiAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG1peGluIHR5cGUuIEFsc28sIGJhY2tlbmRzIHJlbHkgb24gdGhlIGZhY3QKICAgIC8vIHRoYXQgZWxpbWluYXRlZCBtaXhpbiBpcyBhcHBlbmRlZCBpbnRvIHRoZSBlbmQgb2YgaW50ZXJmYWNlcyBsaXN0LgogICAgY2xhc3NfLmltcGxlbWVudGVkVHlwZXMuYWRkKGNsYXNzXy5taXhlZEluVHlwZSk7CgogICAgLy8gVGhpcyBjbGFzcyBpcyBub3cgYSBub3JtYWwgY2xhc3MuCiAgICBjbGFzc18ubWl4ZWRJblR5cGUgPSBudWxsOwoKICAgIC8vIExlYXZlIGJyZWFkY3J1bWJzIGZvciBiYWNrZW5kcyAoZS5nLiBmb3IgZGFydDptaXJyb3JzIGltcGxlbWVudGF0aW9uKS4KICAgIGNsYXNzXy5pc0VsaW1pbmF0ZWRNaXhpbiA9IHRydWU7CiAgfQp9CgpjbGFzcyBTdXBlckNhbGxSZXNvbHV0aW9uVHJhbnNmb3JtZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgQ2xhc3MgbG9va3VwQ2xhc3M7CiAgZmluYWwgVGFyZ2V0IHRhcmdldEluZm87CgogIFN1cGVyQ2FsbFJlc29sdXRpb25UcmFuc2Zvcm1lcigKICAgICAgdGhpcy5oaWVyYXJjaHksIHRoaXMuY29yZVR5cGVzLCB0aGlzLmxvb2t1cENsYXNzLCB0aGlzLnRhcmdldEluZm8pOwoKICBUcmVlTm9kZSB2aXNpdChUcmVlTm9kZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgTWVtYmVyIHRhcmdldCA9IGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldChsb29rdXBDbGFzcywgbm9kZS5uYW1lKTsKICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5R2V0KG5ldyBUaGlzRXhwcmVzc2lvbigpLCB0YXJnZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9jYWxsTm9TdWNoTWV0aG9kKG5vZGUubmFtZS5uYW1lLCBuZXcgQXJndW1lbnRzLmVtcHR5KCksIG5vZGUsCiAgICAgICAgICBpc0dldHRlcjogdHJ1ZSwgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgfQoKICB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBNZW1iZXIgdGFyZ2V0ID0KICAgICAgICBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQobG9va3VwQ2xhc3MsIG5vZGUubmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IERpcmVjdFByb3BlcnR5U2V0KAogICAgICAgICAgbmV3IFRoaXNFeHByZXNzaW9uKCksIHRhcmdldCwgdmlzaXQobm9kZS52YWx1ZSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgLy8gQ2FsbCBoYXMgdG8gcmV0dXJuIHJpZ2h0LWhhbmQtc2lkZS4KICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByaWdodEhhbmRTaWRlID0KICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKHZpc2l0KG5vZGUudmFsdWUpKTsKICAgICAgRXhwcmVzc2lvbiByZXN1bHQgPSBfY2FsbE5vU3VjaE1ldGhvZCgKICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCBuZXcgQXJndW1lbnRzKFtuZXcgVmFyaWFibGVHZXQocmlnaHRIYW5kU2lkZSldKSwgbm9kZSwKICAgICAgICAgIGlzU2V0dGVyOiB0cnVlLCBpc1N1cGVyOiB0cnVlKTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBjYWxsID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUocmVzdWx0KTsKICAgICAgcmV0dXJuIG5ldyBMZXQoCiAgICAgICAgICByaWdodEhhbmRTaWRlLCBuZXcgTGV0KGNhbGwsIG5ldyBWYXJpYWJsZUdldChyaWdodEhhbmRTaWRlKSkpOwogICAgfQogIH0KCiAgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIE1lbWJlciB0YXJnZXQgPSBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQobG9va3VwQ2xhc3MsIG5vZGUubmFtZSk7CiAgICBBcmd1bWVudHMgdmlzaXRlZEFyZ3VtZW50cyA9IHZpc2l0KG5vZGUuYXJndW1lbnRzKTsKICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgIXRhcmdldC5pc0FjY2Vzc29yICYmCiAgICAgICAgX2NhbGxJc0xlZ2FsKHRhcmdldC5mdW5jdGlvbiwgdmlzaXRlZEFyZ3VtZW50cykpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgbmV3IFRoaXNFeHByZXNzaW9uKCksIHRhcmdldCwgdmlzaXRlZEFyZ3VtZW50cykKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBudWxsIHx8ICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmICF0YXJnZXQuaXNBY2Nlc3NvcikpIHsKICAgICAgLy8gVGFyZ2V0IG5vdCBmb3VuZCBhdCBhbGwsIG9yIGNhbGwgd2FzIGlsbGVnYWwuCiAgICAgIHJldHVybiBfY2FsbE5vU3VjaE1ldGhvZChub2RlLm5hbWUubmFtZSwgdmlzaXRlZEFyZ3VtZW50cywgbm9kZSwKICAgICAgICAgIGlzU3VwZXI6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgbmV3IERpcmVjdFByb3BlcnR5R2V0KG5ldyBUaGlzRXhwcmVzc2lvbigpLCB0YXJnZXQpLAogICAgICAgICAgbmV3IE5hbWUoJ2NhbGwnKSwKICAgICAgICAgIHZpc2l0ZWRBcmd1bWVudHMpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIGNhbGwgdG8gbm8gc3VjaCBtZXRob2QuCiAgRXhwcmVzc2lvbiBfY2FsbE5vU3VjaE1ldGhvZCgKICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIEFyZ3VtZW50cyBtZXRob2RBcmd1bWVudHMsIFRyZWVOb2RlIG5vZGUsCiAgICAgIHtpc1N1cGVyOiBmYWxzZSwgaXNHZXR0ZXI6IGZhbHNlLCBpc1NldHRlcjogZmFsc2V9KSB7CiAgICBNZW1iZXIgbm9TdWNoTWV0aG9kID0KICAgICAgICBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQobG9va3VwQ2xhc3MsIG5ldyBOYW1lKCJub1N1Y2hNZXRob2QiKSk7CiAgICBTdHJpbmcgbWV0aG9kTmFtZVVzZWQgPSAoaXNHZXR0ZXIpCiAgICAgICAgPyAiZ2V0OiRtZXRob2ROYW1lIgogICAgICAgIDogKGlzU2V0dGVyKSA/ICJzZXQ6JG1ldGhvZE5hbWUiIDogbWV0aG9kTmFtZTsKICAgIGlmIChub1N1Y2hNZXRob2QgIT0gbnVsbCAmJgogICAgICAgIG5vU3VjaE1ldGhvZC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggPT0gMSAmJgogICAgICAgIG5vU3VjaE1ldGhvZC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAvLyBXZSBoYXZlIGEgY29ycmVjdCBub1N1Y2hNZXRob2QgbWV0aG9kLgogICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gaW52b2NhdGlvbiA9IF9jcmVhdGVJbnZvY2F0aW9uKAogICAgICAgICAgbWV0aG9kTmFtZVVzZWQsIG1ldGhvZEFyZ3VtZW50cywgaXNTdXBlciwgbmV3IFRoaXNFeHByZXNzaW9uKCkpOwogICAgICByZXR1cm4gbmV3IERpcmVjdE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBuZXcgVGhpc0V4cHJlc3Npb24oKSwgbm9TdWNoTWV0aG9kLCBuZXcgQXJndW1lbnRzKFtpbnZvY2F0aW9uXSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgLy8gSW5jb3JyZWN0IG5vU3VjaE1ldGhvZCBtZXRob2Q6IENhbGwgbm9TdWNoTWV0aG9kIG9uIE9iamVjdAogICAgICAvLyB3aXRoIEludm9jYXRpb24gb2Ygbm9TdWNoTWV0aG9kIGFzIHRoZSBtZXRob2QgdGhhdCBkaWQgbm90IGV4aXN0LgogICAgICBub1N1Y2hNZXRob2QgPSBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQoCiAgICAgICAgICBjb3JlVHlwZXMub2JqZWN0Q2xhc3MsIG5ldyBOYW1lKCJub1N1Y2hNZXRob2QiKSk7CiAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiBpbnZvY2F0aW9uID0gX2NyZWF0ZUludm9jYXRpb24oCiAgICAgICAgICBtZXRob2ROYW1lVXNlZCwgbWV0aG9kQXJndW1lbnRzLCBpc1N1cGVyLCBuZXcgVGhpc0V4cHJlc3Npb24oKSk7CiAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiBpbnZvY2F0aW9uUHJpbWUgPSBfY3JlYXRlSW52b2NhdGlvbigibm9TdWNoTWV0aG9kIiwKICAgICAgICAgIG5ldyBBcmd1bWVudHMoW2ludm9jYXRpb25dKSwgZmFsc2UsIG5ldyBUaGlzRXhwcmVzc2lvbigpKTsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgbmV3IFRoaXNFeHByZXNzaW9uKCksIG5vU3VjaE1ldGhvZCwgbmV3IEFyZ3VtZW50cyhbaW52b2NhdGlvblByaW1lXSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfQogIH0KCiAgLy8vIENyZWF0ZXMgYW4gIm5ldyBfSW52b2NhdGlvbk1pcnJvciguLi4pIiBpbnZvY2F0aW9uLgogIENvbnN0cnVjdG9ySW52b2NhdGlvbiBfY3JlYXRlSW52b2NhdGlvbihTdHJpbmcgbWV0aG9kTmFtZSwKICAgICAgQXJndW1lbnRzIGNhbGxBcmd1bWVudHMsIGJvb2wgaXNTdXBlckludm9jYXRpb24sIEV4cHJlc3Npb24gcmVjZWl2ZXIpIHsKICAgIHJldHVybiB0YXJnZXRJbmZvLmluc3RhbnRpYXRlSW52b2NhdGlvbigKICAgICAgICBjb3JlVHlwZXMsIHJlY2VpdmVyLCBtZXRob2ROYW1lLCBjYWxsQXJndW1lbnRzLCAtMSwgaXNTdXBlckludm9jYXRpb24pOwogIH0KCiAgLy8vIENoZWNrIHRoYXQgYSBjYWxsIHRvIHRoZSB0YXJnZXRGdW5jdGlvbiBpcyBsZWdhbCBnaXZlbiB0aGUgYXJndW1lbnRzLgogIC8vLwogIC8vLyBJLmUuIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgYW5kIHRoZSBuYW1lcyBvZiB0aGUKICAvLy8gZ2l2ZW4gbmFtZWQgcGFyYW1ldGVycyByZXByZXNlbnRzIGEgdmFsaWQgY2FsbCB0byB0aGUgZnVuY3Rpb24uCiAgYm9vbCBfY2FsbElzTGVnYWwoRnVuY3Rpb25Ob2RlIHRhcmdldEZ1bmN0aW9uLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBpZiAoKHRhcmdldEZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGgpIHx8CiAgICAgICAgKHRhcmdldEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA8CiAgICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCkpIHsKICAgICAgLy8gR2l2ZW4gdG9vIGZldyBvciB0b28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gRG8gd2UgZ2l2ZSBuYW1lZCB0aGF0IHdlIGRvbid0IHRha2U/CiAgICBTZXQ8U3RyaW5nPiBnaXZlbk5hbWVkID0gYXJndW1lbnRzLm5hbWVkLm1hcCgodikgPT4gdi5uYW1lKS50b1NldCgpOwogICAgU2V0PFN0cmluZz4gdGFrZW5OYW1lZCA9CiAgICAgICAgdGFyZ2V0RnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLm1hcCgodikgPT4gdi5uYW1lKS50b1NldCgpOwogICAgZ2l2ZW5OYW1lZC5yZW1vdmVBbGwodGFrZW5OYW1lZCk7CiAgICByZXR1cm4gZ2l2ZW5OYW1lZC5pc0VtcHR5OwogIH0KfQoKY2xhc3MgU3VwZXJJbml0aWFsaXplclJlc29sdXRpb25UcmFuc2Zvcm1lciBleHRlbmRzIEluaXRpYWxpemVyVmlzaXRvciB7CiAgZmluYWwgQ2xhc3MgbG9va3VwQ2xhc3M7CgogIFN1cGVySW5pdGlhbGl6ZXJSZXNvbHV0aW9uVHJhbnNmb3JtZXIodGhpcy5sb29rdXBDbGFzcyk7CgogIHRyYW5zZm9ybUluaXRpYWxpemVycyhMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMpIHsKICAgIGZvciAodmFyIGluaXRpYWxpemVyIGluIGluaXRpYWxpemVycykgewogICAgICBpbml0aWFsaXplci5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG5vZGUudGFyZ2V0OwogICAgaWYgKGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzICE9IGxvb2t1cENsYXNzKSB7CiAgICAgIC8vIElmIFtub2RlXSByZWZlcnMgdG8gYSBjb25zdHJ1Y3RvciB0YXJnZXQgd2hpY2ggaXMgbm90IGRpcmVjdGx5IHRoZQogICAgICAvLyBzdXBlcmNsYXNzIGJ1dCBzb21lIGluZGlyZWN0IGJhc2UgY2xhc3MgdGhlbiB0aGlzIGlzIGJlY2F1c2UgY2xhc3NlcyBpbgogICAgICAvLyB0aGUgbWlkZGxlIGFyZSBtaXhpbiBhcHBsaWNhdGlvbnMuICBUaGVzZSBtaXhpbiBhcHBsaWNhdGlvbnMgd2lsbCBoYXZlCiAgICAgIC8vIHJlY2VpdmVkIGEgZm9yd2FyZGluZyBjb25zdHJ1Y3RvciB3aGljaCB3ZSBhcmUgcmVxdWlyZWQgdG8gdXNlIGluc3RlYWQuCiAgICAgIGZvciAodmFyIHJlcGxhY2VtZW50IGluIGxvb2t1cENsYXNzLmNvbnN0cnVjdG9ycykgewogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5uYW1lID09IHJlcGxhY2VtZW50Lm5hbWUpIHsKICAgICAgICAgIG5vZGUudGFyZ2V0ID0gcmVwbGFjZW1lbnQ7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCiAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIG5hbWVkICIke2NvbnN0cnVjdG9yLm5hbWV9IiAnCiAgICAgICAgICAnaW4gbG9va3VwIGNsYXNzICIke2xvb2t1cENsYXNzLm5hbWV9IiEnKTsKICAgIH0KICB9Cn0KgZQATk48NgEWIhgdJy0fAS1NPBkXGR4dKyY8MDECAU1OEARKShocGx0BUENMShUcAU1NHiABRycBSi8SSCMBLwFPNy0lLFAhCAYBNBBRAR4OBkIlLDMuMEkjDAoIBgQBEi4jJRQvTBcvATgBQDhPMA4GAUUlQ0FGBgFLIyxBAUQbTzwGASQBNj9OAUNLKyonLyAtDzAIBgEkPVEBLRRQLhwkKDhJCCUfBh9KAUlMLTMLNU9FMjABLikBMDcBHyAYRg8YSQhJQTE2NDQ5LQExNUpRURwMAUpARwxGMDMMRShBSQwBNSgaCggfBiwBTUo1ASkfAU4lBAIBOyIdGxsBIkoBNgExSRpBKA1MKgYEATEUSxokOygNLSo/LVEqSxZJBgQBO0k4Hx47KTooUDdHGg0jPxwcKAYEAScgQzwaTCccNyBCOTA8SylLKA1ESzI8PEtQRSlQKAYEATo9Ti1QBAFMBk9GSFE2LDgUBgEsSR1DJh8EAgFJGwE7ATosIAYEATErNUxRUFE6NCUXCggBG1E1BgQCATlwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvbWl4aW5fZnVsbF9yZXNvbHV0aW9uLmRhcnRbZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi92bS9jb25zdGFudHNfbmF0aXZlX2VmZmVjdHMuZGFydIfKLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0uY29uc3RhbnRzX25hdGl2ZV9lZmZlY3RzOwoKaW1wb3J0ICcuLi9hc3QuZGFydCc7CmltcG9ydCAnLi4vdGFyZ2V0L3RhcmdldHMuZGFydCc7CmltcG9ydCAnLi4vY29yZV90eXBlcy5kYXJ0JzsKCmNsYXNzIFZtQ29uc3RhbnRzQmFja2VuZCBleHRlbmRzIENvbnN0YW50c0JhY2tlbmQgewogIGZpbmFsIENsYXNzIGltbXV0YWJsZU1hcENsYXNzOwoKICBWbUNvbnN0YW50c0JhY2tlbmQuXyh0aGlzLmltbXV0YWJsZU1hcENsYXNzKTsKCiAgLy8vIElmIFtkZWZpbmVzXSBpcyBub3QgYG51bGxgIGl0IHdpbGwgYmUgdXNlZCBmb3IgaGFuZGxpbmcKICAvLy8gYGNvbnN0IHtib29sLC4uLn0uZnJvbUVudmlyb25tZW50KClgIG90aGVyd2lzZSB0aGUgY3VycmVudCBWTSdzIHZhbHVlcwogIC8vLyB3aWxsIGJlIHVzZWQuCiAgZmFjdG9yeSBWbUNvbnN0YW50c0JhY2tlbmQoQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgZmluYWwgTGlicmFyeSBjb3JlTGlicmFyeSA9IGNvcmVUeXBlcy5jb3JlTGlicmFyeTsKICAgIGZpbmFsIENsYXNzIGltbXV0YWJsZU1hcENsYXNzID0gY29yZUxpYnJhcnkuY2xhc3NlcwogICAgICAgIC5maXJzdFdoZXJlKChDbGFzcyBrbGFzcykgPT4ga2xhc3MubmFtZSA9PSAnX0ltbXV0YWJsZU1hcCcpOwogICAgYXNzZXJ0KGltbXV0YWJsZU1hcENsYXNzICE9IG51bGwpOwoKICAgIHJldHVybiBuZXcgVm1Db25zdGFudHNCYWNrZW5kLl8oaW1tdXRhYmxlTWFwQ2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgbG93ZXJNYXBDb25zdGFudChNYXBDb25zdGFudCBjb25zdGFudCkgewogICAgLy8gVGhlIF9JbW11dGFibGVNYXAgY2xhc3MgaXMgaW1wbGVtZW50ZWQgdmlhIG9uZSBmaWVsZCBwb2ludGluZyB0byBhIGxpc3QKICAgIC8vIG9mIGtleS92YWx1ZSBwYWlycyAtLSBzZWUgcnVudGltZS9saWIvaW1tdXRhYmxlX21hcC5kYXJ0IQogICAgZmluYWwgTGlzdDxDb25zdGFudD4ga3ZMaXN0UGFpcnMgPQogICAgICAgIG5ldyBMaXN0PENvbnN0YW50PigyICogY29uc3RhbnQuZW50cmllcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdGFudC5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZpbmFsIENvbnN0YW50TWFwRW50cnkgZW50cnkgPSBjb25zdGFudC5lbnRyaWVzW2ldOwogICAgICBrdkxpc3RQYWlyc1syICogaV0gPSBlbnRyeS5rZXk7CiAgICAgIGt2TGlzdFBhaXJzWzIgKiBpICsgMV0gPSBlbnRyeS52YWx1ZTsKICAgIH0KICAgIC8vIFRoaXMgaXMgYSBiaXQgZmlzaHksIHNpbmNlIHdlIG1lcmdlIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSB0eXBlIGJ5CiAgICAvLyBwdXR0aW5nIGJvdGggaW50byB0aGUgc2FtZSBsaXN0LgogICAgZmluYWwga3ZMaXN0Q29uc3RhbnQgPSBuZXcgTGlzdENvbnN0YW50KGNvbnN0IER5bmFtaWNUeXBlKCksIGt2TGlzdFBhaXJzKTsKICAgIGFzc2VydChpbW11dGFibGVNYXBDbGFzcy5maWVsZHMubGVuZ3RoID09IDEpOwogICAgZmluYWwgRmllbGQga3ZQYWlyTGlzdEZpZWxkID0gaW1tdXRhYmxlTWFwQ2xhc3MuZmllbGRzWzBdOwogICAgcmV0dXJuIG5ldyBJbnN0YW5jZUNvbnN0YW50KGltbXV0YWJsZU1hcENsYXNzLnJlZmVyZW5jZSwgPERhcnRUeXBlPlsKICAgICAgY29uc3RhbnQua2V5VHlwZSwKICAgICAgY29uc3RhbnQudmFsdWVUeXBlLAogICAgXSwgPFJlZmVyZW5jZSwgQ29uc3RhbnQ+ewogICAgICBrdlBhaXJMaXN0RmllbGQucmVmZXJlbmNlOiBrdkxpc3RDb25zdGFudCwKICAgIH0pOwogIH0KfQo1AE5OPAElARYhHQE0IQEwAT5NFDQ3OEUnATgEAQw0T0EnOTg6JiwGSShPMj9JGBoeMQgEAgEvcGFja2FnZTprZXJuZWwvdm0vY29uc3RhbnRzX25hdGl2ZV9lZmZlY3RzLmRhcnRRZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL21ldGFkYXRhL2JpbmFyeV9jYWNoZS5kYXJ0hFMvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bS5tZXRhZGF0YS5iaW5hcnlfY2FjaGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBCaW5hcnlTaW5rLCBCaW5hcnlTb3VyY2UsIE1ldGFkYXRhUmVwb3NpdG9yeSwgTm9kZSwgVHJlZU5vZGU7CgpjbGFzcyBCaW5hcnlDYWNoZU1ldGFkYXRhUmVwb3NpdG9yeSBleHRlbmRzIE1ldGFkYXRhUmVwb3NpdG9yeTxMaXN0PGludD4+IHsKICBzdGF0aWMgY29uc3QgcmVwb3NpdG9yeVRhZyA9ICd2bS5iaW5hcnlfY2FjaGUnOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IHRhZyA9PiByZXBvc2l0b3J5VGFnOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBNYXA8VHJlZU5vZGUsIExpc3Q8aW50Pj4gbWFwcGluZyA9IDxUcmVlTm9kZSwgTGlzdDxpbnQ+Pnt9OwoKICBAb3ZlcnJpZGUKICB2b2lkIHdyaXRlVG9CaW5hcnkoTGlzdDxpbnQ+IG1ldGFkYXRhLCBOb2RlIG5vZGUsIEJpbmFyeVNpbmsgc2luaykgewogICAgc2luay53cml0ZUJ5dGVMaXN0KG1ldGFkYXRhKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8aW50PiByZWFkRnJvbUJpbmFyeShOb2RlIG5vZGUsIEJpbmFyeVNvdXJjZSBzb3VyY2UpIHsKICAgIExpc3Q8aW50PiByZXN1bHQgPSBzb3VyY2UucmVhZEJ5dGVMaXN0KCk7CiAgICBfd2Vha01hcFtub2RlXSA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgTGlzdDxpbnQ+IGxvb2t1cChOb2RlIG5vZGUpID0+IF93ZWFrTWFwW25vZGVdOwogIHN0YXRpYyB2b2lkIGluc2VydChOb2RlIG5vZGUsIExpc3Q8aW50PiBtZXRhZGF0YSkgewogICAgX3dlYWtNYXBbbm9kZV0gPSBtZXRhZGF0YTsKICB9CgogIHN0YXRpYyBmaW5hbCBfd2Vha01hcCA9IG5ldyBFeHBhbmRvPExpc3Q8aW50Pj4oKTsKfQonAE5OPAEiASFHAUwyAQwjAQxEAQxHIgQBDD0uHRMEATg2HwQBNAIBJXBhY2thZ2U6dm0vbWV0YWRhdGEvYmluYXJ5X2NhY2hlLmRhcnRlZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9sYXRlX3Zhcl9pbml0X3RyYW5zZm9ybWVyLmRhcnSK6y8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCi8vLyBXcmFwcyB0aGUgaW5pdGlhbGl6ZXJzIG9mIGxhdGUgbG9jYWwgdmFyaWFibGVzIGluIGNsb3N1cmVzLgp2b2lkIHRyYW5zZm9ybUxpYnJhcmllcyhMaXN0PExpYnJhcnk+IGxpYnJhcmllcykgewogIGNvbnN0IHRyYW5zZm9ybWVyID0gX0xhdGVWYXJJbml0VHJhbnNmb3JtZXIoKTsKICBsaWJyYXJpZXMuZm9yRWFjaCh0cmFuc2Zvcm1lci52aXNpdExpYnJhcnkpOwp9CgpjbGFzcyBfTGF0ZVZhckluaXRUcmFuc2Zvcm1lciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBjb25zdCBfTGF0ZVZhckluaXRUcmFuc2Zvcm1lcigpOwoKICBib29sIF9zaG91bGRBcHBseVRyYW5zZm9ybShTdGF0ZW1lbnQgcykgewogICAgaWYgKHMgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICAvLyBUaGlzIHRyYW5zZm9ybSBvbmx5IGFwcGxpZXMgdG8gbGF0ZSB2YXJpYWJsZXMuCiAgICAgIGlmICghcy5pc0xhdGUpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIENvbnN0IHZhcmlhYmxlcyBhcmUgaWdub3JlZC4KICAgICAgaWYgKHMuaXNDb25zdCkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gVmFyaWFibGVzIHdpdGggbm8gaW5pdGlhbGl6ZXIgb3IgYSB0cml2aWFsIGluaXRpYWxpemVyIGFyZSBpZ25vcmVkLgogICAgICBpZiAocy5pbml0aWFsaXplciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGZpbmFsIEV4cHJlc3Npb24gaW5pdCA9IHMuaW5pdGlhbGl6ZXI7CiAgICAgIGlmIChpbml0IGlzIFN0cmluZ0xpdGVyYWwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGluaXQgaXMgQm9vbExpdGVyYWwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGluaXQgaXMgSW50TGl0ZXJhbCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoaW5pdCBpcyBEb3VibGVMaXRlcmFsKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChpbml0IGlzIE51bGxMaXRlcmFsKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChpbml0IGlzIENvbnN0YW50RXhwcmVzc2lvbiAmJiBpbml0LmNvbnN0YW50IGlzIFByaW1pdGl2ZUNvbnN0YW50KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIExpc3Q8U3RhdGVtZW50PiBfdHJhbnNmb3JtVmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGZpbmFsIGZuTm9kZSA9CiAgICAgICAgRnVuY3Rpb25Ob2RlKFJldHVyblN0YXRlbWVudChub2RlLmluaXRpYWxpemVyKSwgcmV0dXJuVHlwZTogbm9kZS50eXBlKTsKICAgIGZpbmFsIGZuID0gRnVuY3Rpb25EZWNsYXJhdGlvbigKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uKCIjJHtub2RlLm5hbWV9I2luaXRpYWxpemVyIiwKICAgICAgICAgICAgdHlwZTogZm5Ob2RlLmNvbXB1dGVUaGlzRnVuY3Rpb25UeXBlKE51bGxhYmlsaXR5LmxlZ2FjeSkpLAogICAgICAgIGZuTm9kZSk7CiAgICBub2RlLmluaXRpYWxpemVyID0KICAgICAgICBNZXRob2RJbnZvY2F0aW9uKFZhcmlhYmxlR2V0KGZuLnZhcmlhYmxlKSwgTmFtZSgiY2FsbCIpLCBBcmd1bWVudHMoW10pKQogICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwoKICAgIHJldHVybiBbZm4sIG5vZGVdOwogIH0KCiAgTGlzdDxTdGF0ZW1lbnQ+IF90cmFuc2Zvcm1TdGF0ZW1lbnRzKExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSB7CiAgICBpZiAoIXN0YXRlbWVudHMuYW55KChzKSA9PiBfc2hvdWxkQXBwbHlUcmFuc2Zvcm0ocykpKSByZXR1cm4gbnVsbDsKICAgIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBuZXdTdGF0ZW1lbnRzID0gTGlzdDxTdGF0ZW1lbnQ+KCk7CiAgICBmb3IgKFN0YXRlbWVudCBzIGluIHN0YXRlbWVudHMpIHsKICAgICAgaWYgKF9zaG91bGRBcHBseVRyYW5zZm9ybShzKSkgewogICAgICAgIG5ld1N0YXRlbWVudHMuYWRkQWxsKF90cmFuc2Zvcm1WYXJpYWJsZURlY2xhcmF0aW9uKHMpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdTdGF0ZW1lbnRzLmFkZChzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ld1N0YXRlbWVudHM7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIHN1cGVyLnZpc2l0QmxvY2sobm9kZSk7CiAgICBmaW5hbCBzdGF0ZW1lbnRzID0gX3RyYW5zZm9ybVN0YXRlbWVudHMobm9kZS5zdGF0ZW1lbnRzKTsKICAgIGlmIChzdGF0ZW1lbnRzID09IG51bGwpIHJldHVybiBub2RlOwogICAgcmV0dXJuIEJsb2NrKHN0YXRlbWVudHMpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICBzdXBlci52aXNpdEFzc2VydEJsb2NrKG5vZGUpOwogICAgZmluYWwgc3RhdGVtZW50cyA9IF90cmFuc2Zvcm1TdGF0ZW1lbnRzKG5vZGUuc3RhdGVtZW50cyk7CiAgICBpZiAoc3RhdGVtZW50cyA9PSBudWxsKSByZXR1cm4gbm9kZTsKICAgIHJldHVybiBBc3NlcnRCbG9jayhzdGF0ZW1lbnRzKS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICB9Cn0KVQBOTjwBIgFAMzEvAgE0IwEsJDgjASYjAU0vLS8tLC8tThYIARMGEgQBTBNQJDlHERdQGwEXBAFFRz0mJkAPHggGGgQBDBscPik8BAEMJyI+KUIEAgE5cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvbGF0ZV92YXJfaW5pdF90cmFuc2Zvcm1lci5kYXJ0ZGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvbGlzdF9mYWN0b3J5X3NwZWNpYWxpemVyLmRhcnSHOi8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLnRyYW5zZm9ybWF0aW9ucy5saXN0X2ZhY3Rvcnlfc3BlY2lhbGl6ZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKLy8vIFJlcGxhY2VzIG5ldyBMaXN0KCkgYW5kIG5ldyBMaXN0KG4pIHdpdGggVk0tc3BlY2lmaWMKLy8vIG5ldyBfR3Jvd2FibGVMaXN0KDApIGFuZCBuZXcgX0xpc3QobikuCnZvaWQgdHJhbnNmb3JtTGlicmFyaWVzKExpc3Q8TGlicmFyeT4gbGlicmFyaWVzLCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgZmluYWwgdHJhbnNmb3JtZXIgPSBuZXcgX0xpc3RGYWN0b3J5U3BlY2lhbGl6ZXIoY29yZVR5cGVzKTsKICBsaWJyYXJpZXMuZm9yRWFjaCh0cmFuc2Zvcm1lci52aXNpdExpYnJhcnkpOwp9CgpjbGFzcyBfTGlzdEZhY3RvcnlTcGVjaWFsaXplciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBQcm9jZWR1cmUgX2xpc3RGYWN0b3J5OwogIGZpbmFsIFByb2NlZHVyZSBfZ3Jvd2FibGVMaXN0RmFjdG9yeTsKICBmaW5hbCBQcm9jZWR1cmUgX2ZpeGVkTGlzdEZhY3Rvcnk7CgogIF9MaXN0RmFjdG9yeVNwZWNpYWxpemVyKENvcmVUeXBlcyBjb3JlVHlwZXMpCiAgICAgIDogX2xpc3RGYWN0b3J5ID0gY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ0xpc3QnLCAnJyksCiAgICAgICAgX2dyb3dhYmxlTGlzdEZhY3RvcnkgPQogICAgICAgICAgICBjb3JlVHlwZXMuaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnX0dyb3dhYmxlTGlzdCcsICcnKSwKICAgICAgICBfZml4ZWRMaXN0RmFjdG9yeSA9CiAgICAgICAgICAgIGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdfTGlzdCcsICcnKSB7CiAgICBhc3NlcnQoX2xpc3RGYWN0b3J5LmlzRmFjdG9yeSk7CiAgICBhc3NlcnQoX2dyb3dhYmxlTGlzdEZhY3RvcnkuaXNGYWN0b3J5KTsKICAgIGFzc2VydChfZml4ZWRMaXN0RmFjdG9yeS5pc0ZhY3RvcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgc3VwZXIudmlzaXRTdGF0aWNJbnZvY2F0aW9uKG5vZGUpOwoKICAgIGlmIChub2RlLnRhcmdldCA9PSBfbGlzdEZhY3RvcnkpIHsKICAgICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuaXNFbXB0eSkgewogICAgICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbihfZ3Jvd2FibGVMaXN0RmFjdG9yeSwKICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyhbbmV3IEludExpdGVyYWwoMCldLCB0eXBlczogbm9kZS5hcmd1bWVudHMudHlwZXMpKQogICAgICAgICAgLi5wYXJlbnQgPSBub2RlLnBhcmVudAogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbihfZml4ZWRMaXN0RmFjdG9yeSwgbm9kZS5hcmd1bWVudHMpCiAgICAgICAgICAuLnBhcmVudCA9IG5vZGUucGFyZW50CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9Cn0KNgBOTjwBNQEiOAE5K0g+LwIBNCAoJQEvSx9JHEIkLCkEAQwxJwEnLzpNISoPRyEqCAYBEQQCAThwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9saXN0X2ZhY3Rvcnlfc3BlY2lhbGl6ZXIuZGFydE9maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL2ZmaS5kYXJ0sckvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGxvZ2ljIHdoaWNoIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBmZmlfZGVmaW5pdGlvbiBhbmQKLy8gZmZpX3VzZV9zaXRlIHRyYW5zZm9ybWVycy4KCmxpYnJhcnkgdm0udHJhbnNmb3JtYXRpb25zLmZmaTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvbGlicmFyeV9pbmRleC5kYXJ0JyBzaG93IExpYnJhcnlJbmRleDsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9yZWZlcmVuY2VfZnJvbV9pbmRleC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IERpYWdub3N0aWNSZXBvcnRlcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwoKLy8vIFJlcHJlc2VudHMgdGhlIChpbnN0YW50aWF0ZWQpIGZmaS5OYXRpdmVUeXBlLgplbnVtIE5hdGl2ZVR5cGUgewogIGtOYXRpdmVUeXBlLAogIGtOYXRpdmVJbnRlZ2VyLAogIGtOYXRpdmVEb3VibGUsCiAga1BvaW50ZXIsCiAga05hdGl2ZUZ1bmN0aW9uLAogIGtJbnQ4LAogIGtJbnQxNiwKICBrSW50MzIsCiAga0ludDY0LAogIGtVaW50OCwKICBrVWludDE2LAogIGtVaW50MzIsCiAga1VuaXQ2NCwKICBrSW50cHRyLAogIGtGbG9hdCwKICBrRG91YmxlLAogIGtWb2lkLAogIGtTdHJ1Y3QKfQoKY29uc3QgTmF0aXZlVHlwZSBrTmF0aXZlVHlwZUludFN0YXJ0ID0gTmF0aXZlVHlwZS5rSW50ODsKY29uc3QgTmF0aXZlVHlwZSBrTmF0aXZlVHlwZUludEVuZCA9IE5hdGl2ZVR5cGUua0ludHB0cjsKCi8vLyBUaGUgW05hdGl2ZVR5cGVdIGNsYXNzIG5hbWVzLCBpbmRleGVkIGJ5IFtOYXRpdmVUeXBlXS4KY29uc3QgTGlzdDxTdHJpbmc+IG5hdGl2ZVR5cGVDbGFzc05hbWVzID0gWwogICdOYXRpdmVUeXBlJywKICAnX05hdGl2ZUludGVnZXInLAogICdfTmF0aXZlRG91YmxlJywKICAnUG9pbnRlcicsCiAgJ05hdGl2ZUZ1bmN0aW9uJywKICAnSW50OCcsCiAgJ0ludDE2JywKICAnSW50MzInLAogICdJbnQ2NCcsCiAgJ1VpbnQ4JywKICAnVWludDE2JywKICAnVWludDMyJywKICAnVWludDY0JywKICAnSW50UHRyJywKICAnRmxvYXQnLAogICdEb3VibGUnLAogICdWb2lkJywKICAnU3RydWN0JwpdOwoKY29uc3QgaW50IFVOS05PV04gPSAwOwpjb25zdCBpbnQgV09SRF9TSVpFID0gLTE7CgovLy8gVGhlIFtOYXRpdmVUeXBlXSBzaXplcyBpbiBieXRlcywgaW5kZXhlZCBieSBbTmF0aXZlVHlwZV0uCmNvbnN0IExpc3Q8aW50PiBuYXRpdmVUeXBlU2l6ZXMgPSBbCiAgVU5LTk9XTiwgLy8gTmF0aXZlVHlwZQogIFVOS05PV04sIC8vIE5hdGl2ZUludGVnZXIKICBVTktOT1dOLCAvLyBOYXRpdmVEb3VibGUKICBXT1JEX1NJWkUsIC8vIFBvaW50ZXIKICBVTktOT1dOLCAvLyBOYXRpdmVGdW5jdGlvbgogIDEsIC8vIEludDgKICAyLCAvLyBJbnQxNgogIDQsIC8vIEludDMyCiAgOCwgLy8gSW50NjQKICAxLCAvLyBVaW50OAogIDIsIC8vIFVpbnQxNgogIDQsIC8vIFVpbnQzMgogIDgsIC8vIFVpbnQ2NAogIFdPUkRfU0laRSwgLy8gSW50UHRyCiAgNCwgLy8gRmxvYXQKICA4LCAvLyBEb3VibGUKICBVTktOT1dOLCAvLyBWb2lkCiAgVU5LTk9XTiwgLy8gU3RydWN0Cl07CgovLy8gVGhlIHN0cnVjdCBsYXlvdXQgaW4gdmFyaW91cyBBQklzLgovLy8KLy8vIEFCSXMgZGlmZmVyIHBlciBhcmNoaXRlY3R1cmVzIGFuZCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMuCi8vLyBXZSBwaWNrIHRoZSBkZWZhdWx0IHN0cnVjdCBsYXlvdXQgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgT1MuCi8vLwovLy8gQ29tcGlsZXJzIF9jYW5fIGRldmlhdGUgZnJvbSB0aGUgZGVmYXVsdCBsYXlvdXQsIGJ1dCB0aGlzIHByZXZlbnRzCi8vLyBleGVjdXRhYmxlcyBmcm9tIG1ha2luZyBzeXN0ZW0gY2FsbHMuIFNvIHRoaXMgc2VlbXMgcmF0aGVyIHVuY29tbW9uLgovLy8KLy8vIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IHN1cHBvcnQgY3VzdG9tIHN0cnVjdCBsYXlvdXRzLiBGb3IgbW9yZSBpbmZvIHNlZQovLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1NzY4LgplbnVtIEFiaSB7CiAgLy8vIExheW91dCBpbiBhbGwgNjRiaXQgQUJJcyAoeDY0IGFuZCBhcm02NCkuCiAgd29yZFNpemU2NCwKCiAgLy8vIExheW91dCBpbiBTeXN0ZW0gViBBQkkgZm9yIHgzODYgKGlhMzIgb24gTGludXgpIGFuZCBpbiBpT1MgQXJtIDMyIGJpdC4KICB3b3JkU2l6ZTMyQWxpZ24zMiwKCiAgLy8vIExheW91dCBpbiBib3RoIHRoZSBBcm0gMzIgYml0IEFCSSBhbmQgdGhlIFdpbmRvd3MgaWEzMiBBQkkuCiAgd29yZFNpemUzMkFsaWduNjQsCn0KCi8vLyBXT1JEX1NJWkUgaW4gYnl0ZXMuCmNvbnN0IHdvcmRTaXplID0gPEFiaSwgaW50PnsKICBBYmkud29yZFNpemU2NDogOCwKICBBYmkud29yZFNpemUzMkFsaWduMzI6IDQsCiAgQWJpLndvcmRTaXplMzJBbGlnbjY0OiA0LAp9OwoKLy8vIEVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhbGlnbmVkIHRvIHRoZWlyIHNpemUuCi8vLwovLy8gSGFzIGFuIGVudHJ5IGZvciBhbGwgQWJpcy4gRW1wdHkgZW50cmllcyBkb2N1bWVudCB0aGF0IGV2ZXJ5IG5hdGl2ZQovLy8gdHlwZSBpcyBhbGlnbmVkIHRvIGl0J3Mgb3duIHNpemUgaW4gdGhpcyBBQkkuCi8vLwovLy8gU2VlIHJ1bnRpbWUvdm0vZmZpL2FiaS5jYyBmb3IgYXNzZXJ0cyBpbiB0aGUgVk0gdGhhdCB2ZXJpZnkgdGhlc2UKLy8vIGFsaWdubWVudHMuCi8vLwovLy8gVE9ETygzNzQ3MCk6IEFkZCB1bmNvbW1vbiBwcmltaXRpdmUgZGF0YSB0eXBlcyB3aGVuIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGVtLgpjb25zdCBub25TaXplQWxpZ25tZW50ID0gPEFiaSwgTWFwPE5hdGl2ZVR5cGUsIGludD4+ewogIEFiaS53b3JkU2l6ZTY0OiB7fSwKCiAgLy8geDg2IFN5c3RlbSBWIEFCSToKICAvLyA+IHVpbnQ2NF90IHwgc2l6ZSA4IHwgYWxpZ25tZW50IDQKICAvLyA+IGRvdWJsZSAgIHwgc2l6ZSA4IHwgYWxpZ25tZW50IDQKICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGpsLXRvb2xzL3g4Ni1wc0FCSS93aWtpL2ludGVsMzg2LXBzQUJJLTEuMS5wZGYgcGFnZSA4LgogIC8vCiAgLy8gaU9TIDMyIGJpdCBhbGlnbm1lbnQ6CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vdWlraXQvYXBwX2FuZF9lbnZpcm9ubWVudC91cGRhdGluZ195b3VyX2FwcF9mcm9tXzMyLWJpdF90b182NC1iaXRfYXJjaGl0ZWN0dXJlL3VwZGF0aW5nX2RhdGFfc3RydWN0dXJlcwogIEFiaS53b3JkU2l6ZTMyQWxpZ24zMjoge05hdGl2ZVR5cGUua0RvdWJsZTogNCwgTmF0aXZlVHlwZS5rSW50NjQ6IDR9LAoKICAvLyBUaGUgZGVmYXVsdCBmb3IgTVNWQyB4ODY6CiAgLy8gPiBUaGUgYWxpZ25tZW50LXJlcXVpcmVtZW50IGZvciBhbGwgZGF0YSBleGNlcHQgc3RydWN0dXJlcywgdW5pb25zLCBhbmQKICAvLyA+IGFycmF5cyBpcyBlaXRoZXIgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBvciB0aGUgY3VycmVudCBwYWNraW5nIHNpemUKICAvLyA+IChzcGVjaWZpZWQgd2l0aCBlaXRoZXIgL1pwIG9yIHRoZSBwYWNrIHByYWdtYSwgd2hpY2hldmVyIGlzIGxlc3MpLgogIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2NwcC9jLWxhbmd1YWdlL3BhZGRpbmctYW5kLWFsaWdubWVudC1vZi1zdHJ1Y3R1cmUtbWVtYmVycz92aWV3PXZzLTIwMTkKICAvLwogIC8vIEdDQyBfY2FuXyBjb21waWxlIG9uIExpbnV4IHRvIHRoaXMgYWxpZ25tZW50IHdpdGggLW1hbGlnbi1kb3VibGUsIGJ1dCBkb2VzCiAgLy8gbm90IGRvIHNvIGJ5IGRlZmF1bHQ6CiAgLy8gPiBXYXJuaW5nOiBpZiB5b3UgdXNlIHRoZSAtbWFsaWduLWRvdWJsZSBzd2l0Y2gsIHN0cnVjdHVyZXMgY29udGFpbmluZyB0aGUKICAvLyA+IGFib3ZlIHR5cGVzIGFyZSBhbGlnbmVkIGRpZmZlcmVudGx5IHRoYW4gdGhlIHB1Ymxpc2hlZCBhcHBsaWNhdGlvbgogIC8vID4gYmluYXJ5IGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIHg4Ni0zMiBhbmQgYXJlIG5vdCBiaW5hcnkKICAvLyA+IGNvbXBhdGlibGUgd2l0aCBzdHJ1Y3R1cmVzIGluIGNvZGUgY29tcGlsZWQgd2l0aG91dCB0aGF0IHN3aXRjaC4KICAvLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL3g4Ni1PcHRpb25zLmh0bWwKICAvLwogIC8vIEFybSBhbHdheXMgcmVxdWlyZXMgOCBieXRlIGFsaWdubWVudCBmb3IgOCBieXRlIHZhbHVlczoKICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuaWhpMDA0MmQvSUhJMDA0MkRfYWFwY3MucGRmIDQuMSBGdW5kYW1lbnRhbCBEYXRhIFR5cGVzCiAgQWJpLndvcmRTaXplMzJBbGlnbjY0OiB7fSwKfTsKCi8vLyBMb2FkLCBzdG9yZSwgYW5kIGVsZW1lbnRBdCBhcmUgcmV3aXJlZCB0byB0aGVpciBzdGF0aWMgdHlwZSBmb3IgdGhlc2UgdHlwZXMuCmNvbnN0IExpc3Q8TmF0aXZlVHlwZT4gb3B0aW1pemVkVHlwZXMgPSBbCiAgTmF0aXZlVHlwZS5rSW50OCwKICBOYXRpdmVUeXBlLmtJbnQxNiwKICBOYXRpdmVUeXBlLmtJbnQzMiwKICBOYXRpdmVUeXBlLmtJbnQ2NCwKICBOYXRpdmVUeXBlLmtVaW50OCwKICBOYXRpdmVUeXBlLmtVaW50MTYsCiAgTmF0aXZlVHlwZS5rVWludDMyLAogIE5hdGl2ZVR5cGUua1VuaXQ2NCwKICBOYXRpdmVUeXBlLmtJbnRwdHIsCiAgTmF0aXZlVHlwZS5rRmxvYXQsCiAgTmF0aXZlVHlwZS5rRG91YmxlLAogIE5hdGl2ZVR5cGUua1BvaW50ZXIsCl07CgovLy8gW0ZmaVRyYW5zZm9ybWVyXSBjb250YWlucyBsb2dpYyB3aGljaCBpcyBzaGFyZWQgYmV0d2VlbgovLy8gX0ZmaVVzZVNpdGVUcmFuc2Zvcm1lciBhbmQgX0ZmaURlZmluaXRpb25UcmFuc2Zvcm1lci4KY2xhc3MgRmZpVHJhbnNmb3JtZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IGVudjsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwogIGZpbmFsIExpYnJhcnlJbmRleCBpbmRleDsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CiAgZmluYWwgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlcjsKICBmaW5hbCBSZWZlcmVuY2VGcm9tSW5kZXggcmVmZXJlbmNlRnJvbUluZGV4OwoKICBmaW5hbCBDbGFzcyBpbnRDbGFzczsKICBmaW5hbCBDbGFzcyBkb3VibGVDbGFzczsKICBmaW5hbCBDbGFzcyBsaXN0Q2xhc3M7CiAgZmluYWwgQ2xhc3MgcHJhZ21hQ2xhc3M7CiAgZmluYWwgRmllbGQgcHJhZ21hTmFtZTsKICBmaW5hbCBGaWVsZCBwcmFnbWFPcHRpb25zOwogIGZpbmFsIFByb2NlZHVyZSBsaXN0RWxlbWVudEF0OwoKICBmaW5hbCBMaWJyYXJ5IGZmaUxpYnJhcnk7CiAgZmluYWwgQ2xhc3MgbmF0aXZlRnVuY3Rpb25DbGFzczsKICBmaW5hbCBDbGFzcyBwb2ludGVyQ2xhc3M7CiAgZmluYWwgQ2xhc3Mgc3RydWN0Q2xhc3M7CiAgZmluYWwgUHJvY2VkdXJlIGNhc3RNZXRob2Q7CiAgZmluYWwgUHJvY2VkdXJlIG9mZnNldEJ5TWV0aG9kOwogIGZpbmFsIFByb2NlZHVyZSBlbGVtZW50QXRNZXRob2Q7CiAgZmluYWwgUHJvY2VkdXJlIGFzRnVuY3Rpb25NZXRob2Q7CiAgZmluYWwgUHJvY2VkdXJlIGFzRnVuY3Rpb25JbnRlcm5hbDsKICBmaW5hbCBQcm9jZWR1cmUgbG9va3VwRnVuY3Rpb25NZXRob2Q7CiAgZmluYWwgUHJvY2VkdXJlIGZyb21GdW5jdGlvbk1ldGhvZDsKICBmaW5hbCBGaWVsZCBhZGRyZXNzT2ZGaWVsZDsKICBmaW5hbCBDb25zdHJ1Y3RvciBzdHJ1Y3RGcm9tUG9pbnRlcjsKICBmaW5hbCBQcm9jZWR1cmUgbGlicmFyeUxvb2t1cE1ldGhvZDsKICBmaW5hbCBQcm9jZWR1cmUgYWJpTWV0aG9kOwogIGZpbmFsIFByb2NlZHVyZSBwb2ludGVyRnJvbUZ1bmN0aW9uUHJvY2VkdXJlOwogIGZpbmFsIFByb2NlZHVyZSBuYXRpdmVDYWxsYmFja0Z1bmN0aW9uUHJvY2VkdXJlOwogIGZpbmFsIE1hcDxOYXRpdmVUeXBlLCBQcm9jZWR1cmU+IGxvYWRNZXRob2RzOwogIGZpbmFsIE1hcDxOYXRpdmVUeXBlLCBQcm9jZWR1cmU+IHN0b3JlTWV0aG9kczsKICBmaW5hbCBNYXA8TmF0aXZlVHlwZSwgUHJvY2VkdXJlPiBlbGVtZW50QXRNZXRob2RzOwogIGZpbmFsIFByb2NlZHVyZSBsb2FkU3RydWN0TWV0aG9kOwoKICAvLy8gQ2xhc3NlcyBjb3JyZXNwb25kaW5nIHRvIFtOYXRpdmVUeXBlXSwgaW5kZXhlZCBieSBbTmF0aXZlVHlwZV0uCiAgZmluYWwgTGlzdDxDbGFzcz4gbmF0aXZlVHlwZXNDbGFzc2VzOwoKICBGZmlUcmFuc2Zvcm1lcih0aGlzLmluZGV4LCB0aGlzLmNvcmVUeXBlcywgdGhpcy5oaWVyYXJjaHksCiAgICAgIHRoaXMuZGlhZ25vc3RpY1JlcG9ydGVyLCB0aGlzLnJlZmVyZW5jZUZyb21JbmRleCkKICAgICAgOiBlbnYgPSBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KSwKICAgICAgICBpbnRDbGFzcyA9IGNvcmVUeXBlcy5pbnRDbGFzcywKICAgICAgICBkb3VibGVDbGFzcyA9IGNvcmVUeXBlcy5kb3VibGVDbGFzcywKICAgICAgICBsaXN0Q2xhc3MgPSBjb3JlVHlwZXMubGlzdENsYXNzLAogICAgICAgIHByYWdtYUNsYXNzID0gY29yZVR5cGVzLnByYWdtYUNsYXNzLAogICAgICAgIHByYWdtYU5hbWUgPSBjb3JlVHlwZXMucHJhZ21hTmFtZSwKICAgICAgICBwcmFnbWFPcHRpb25zID0gY29yZVR5cGVzLnByYWdtYU9wdGlvbnMsCiAgICAgICAgbGlzdEVsZW1lbnRBdCA9IGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ1tdJyksCiAgICAgICAgZmZpTGlicmFyeSA9IGluZGV4LmdldExpYnJhcnkoJ2RhcnQ6ZmZpJyksCiAgICAgICAgbmF0aXZlRnVuY3Rpb25DbGFzcyA9IGluZGV4LmdldENsYXNzKCdkYXJ0OmZmaScsICdOYXRpdmVGdW5jdGlvbicpLAogICAgICAgIHBvaW50ZXJDbGFzcyA9IGluZGV4LmdldENsYXNzKCdkYXJ0OmZmaScsICdQb2ludGVyJyksCiAgICAgICAgc3RydWN0Q2xhc3MgPSBpbmRleC5nZXRDbGFzcygnZGFydDpmZmknLCAnU3RydWN0JyksCiAgICAgICAgY2FzdE1ldGhvZCA9IGluZGV4LmdldE1lbWJlcignZGFydDpmZmknLCAnUG9pbnRlcicsICdjYXN0JyksCiAgICAgICAgb2Zmc2V0QnlNZXRob2QgPSBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6ZmZpJywgJ1BvaW50ZXInLCAnX29mZnNldEJ5JyksCiAgICAgICAgZWxlbWVudEF0TWV0aG9kID0gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmZmaScsICdQb2ludGVyJywgJ2VsZW1lbnRBdCcpLAogICAgICAgIGFkZHJlc3NPZkZpZWxkID0gaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmZmaScsICdTdHJ1Y3QnLCAnX2FkZHJlc3NPZicpLAogICAgICAgIHN0cnVjdEZyb21Qb2ludGVyID0KICAgICAgICAgICAgaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmZmaScsICdTdHJ1Y3QnLCAnX2Zyb21Qb2ludGVyJyksCiAgICAgICAgYXNGdW5jdGlvbk1ldGhvZCA9IGluZGV4LmdldE1lbWJlcignZGFydDpmZmknLCAnUG9pbnRlcicsICdhc0Z1bmN0aW9uJyksCiAgICAgICAgYXNGdW5jdGlvbkludGVybmFsID0KICAgICAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6ZmZpJywgJ19hc0Z1bmN0aW9uSW50ZXJuYWwnKSwKICAgICAgICBsb29rdXBGdW5jdGlvbk1ldGhvZCA9CiAgICAgICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpmZmknLCAnRHluYW1pY0xpYnJhcnknLCAnbG9va3VwRnVuY3Rpb24nKSwKICAgICAgICBmcm9tRnVuY3Rpb25NZXRob2QgPQogICAgICAgICAgICBpbmRleC5nZXRNZW1iZXIoJ2RhcnQ6ZmZpJywgJ1BvaW50ZXInLCAnZnJvbUZ1bmN0aW9uJyksCiAgICAgICAgbGlicmFyeUxvb2t1cE1ldGhvZCA9CiAgICAgICAgICAgIGluZGV4LmdldE1lbWJlcignZGFydDpmZmknLCAnRHluYW1pY0xpYnJhcnknLCAnbG9va3VwJyksCiAgICAgICAgYWJpTWV0aG9kID0gaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6ZmZpJywgJ19hYmknKSwKICAgICAgICBwb2ludGVyRnJvbUZ1bmN0aW9uUHJvY2VkdXJlID0KICAgICAgICAgICAgaW5kZXguZ2V0VG9wTGV2ZWxNZW1iZXIoJ2RhcnQ6ZmZpJywgJ19wb2ludGVyRnJvbUZ1bmN0aW9uJyksCiAgICAgICAgbmF0aXZlQ2FsbGJhY2tGdW5jdGlvblByb2NlZHVyZSA9CiAgICAgICAgICAgIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmZmaScsICdfbmF0aXZlQ2FsbGJhY2tGdW5jdGlvbicpLAogICAgICAgIG5hdGl2ZVR5cGVzQ2xhc3NlcyA9IG5hdGl2ZVR5cGVDbGFzc05hbWVzCiAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IGluZGV4LmdldENsYXNzKCdkYXJ0OmZmaScsIG5hbWUpKQogICAgICAgICAgICAudG9MaXN0KCksCiAgICAgICAgbG9hZE1ldGhvZHMgPSBNYXAuZnJvbUl0ZXJhYmxlKG9wdGltaXplZFR5cGVzLCB2YWx1ZTogKHQpIHsKICAgICAgICAgIGZpbmFsIG5hbWUgPSBuYXRpdmVUeXBlQ2xhc3NOYW1lc1t0LmluZGV4XTsKICAgICAgICAgIHJldHVybiBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDpmZmknLCAiX2xvYWQkbmFtZSIpOwogICAgICAgIH0pLAogICAgICAgIHN0b3JlTWV0aG9kcyA9IE1hcC5mcm9tSXRlcmFibGUob3B0aW1pemVkVHlwZXMsIHZhbHVlOiAodCkgewogICAgICAgICAgZmluYWwgbmFtZSA9IG5hdGl2ZVR5cGVDbGFzc05hbWVzW3QuaW5kZXhdOwogICAgICAgICAgcmV0dXJuIGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmZmaScsICJfc3RvcmUkbmFtZSIpOwogICAgICAgIH0pLAogICAgICAgIGVsZW1lbnRBdE1ldGhvZHMgPSBNYXAuZnJvbUl0ZXJhYmxlKG9wdGltaXplZFR5cGVzLCB2YWx1ZTogKHQpIHsKICAgICAgICAgIGZpbmFsIG5hbWUgPSBuYXRpdmVUeXBlQ2xhc3NOYW1lc1t0LmluZGV4XTsKICAgICAgICAgIHJldHVybiBpbmRleC5nZXRUb3BMZXZlbE1lbWJlcignZGFydDpmZmknLCAiX2VsZW1lbnRBdCRuYW1lIik7CiAgICAgICAgfSksCiAgICAgICAgbG9hZFN0cnVjdE1ldGhvZCA9IGluZGV4LmdldFRvcExldmVsTWVtYmVyKCdkYXJ0OmZmaScsICdfbG9hZFN0cnVjdCcpOwoKICAvLy8gQ29tcHV0ZXMgdGhlIERhcnQgdHlwZSBjb3JyZXNwb25kaW5nIHRvIGEgZmZpLltOYXRpdmVUeXBlXSwgcmV0dXJucyBudWxsCiAgLy8vIGlmIGl0IGlzIG5vdCBhIHZhbGlkIE5hdGl2ZVR5cGUuCiAgLy8vCiAgLy8vIFtJbnQ4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbSW50MTZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0ludDMyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtJbnQ2NF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbVWludDhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW1VpbnQxNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtVaW50MzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbVWludDY0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0ludFB0cl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtEb3VibGVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbZG91YmxlXQogIC8vLyBbRmxvYXRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2RvdWJsZV0KICAvLy8gW1ZvaWRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFt2b2lkXQogIC8vLyBbUG9pbnRlcl08VD4gICAgICAgICAgICAgICAgICAgICAgICAgLT4gW1BvaW50ZXJdPFQ+CiAgLy8vIFQgZXh0ZW5kcyBbUG9pbnRlcl0gICAgICAgICAgICAgICAgICAtPiBUCiAgLy8vIFtOYXRpdmVGdW5jdGlvbl08VDEgRnVuY3Rpb24oVDIsIFQzKSAtPiBTMSBGdW5jdGlvbihTMiwgUzMpCiAgLy8vICAgIHdoZXJlIERhcnRSZXByZXNlbnRhdGlvbk9mKFRuKSAtPiBTbgogIERhcnRUeXBlIGNvbnZlcnROYXRpdmVUeXBlVG9EYXJ0VHlwZShEYXJ0VHlwZSBuYXRpdmVUeXBlLCBib29sIGFsbG93U3RydWN0cykgewogICAgaWYgKG5hdGl2ZVR5cGUgaXMhIEludGVyZmFjZVR5cGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmaW5hbCBJbnRlcmZhY2VUeXBlIG5hdGl2ZSA9IG5hdGl2ZVR5cGU7CiAgICBmaW5hbCBDbGFzcyBuYXRpdmVDbGFzcyA9IG5hdGl2ZS5jbGFzc05vZGU7CiAgICBmaW5hbCBOYXRpdmVUeXBlIG5hdGl2ZVR5cGVfID0gZ2V0VHlwZShuYXRpdmVDbGFzcyk7CgogICAgaWYgKGhpZXJhcmNoeS5pc1N1YmNsYXNzT2YobmF0aXZlQ2xhc3MsIHN0cnVjdENsYXNzKSkgewogICAgICByZXR1cm4gYWxsb3dTdHJ1Y3RzID8gbmF0aXZlVHlwZSA6IG51bGw7CiAgICB9CiAgICBpZiAobmF0aXZlVHlwZV8gPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChuYXRpdmVUeXBlXyA9PSBOYXRpdmVUeXBlLmtQb2ludGVyKSB7CiAgICAgIHJldHVybiBuYXRpdmVUeXBlOwogICAgfQogICAgaWYgKGtOYXRpdmVUeXBlSW50U3RhcnQuaW5kZXggPD0gbmF0aXZlVHlwZV8uaW5kZXggJiYKICAgICAgICBuYXRpdmVUeXBlXy5pbmRleCA8PSBrTmF0aXZlVHlwZUludEVuZC5pbmRleCkgewogICAgICByZXR1cm4gSW50ZXJmYWNlVHlwZShpbnRDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5KTsKICAgIH0KICAgIGlmIChuYXRpdmVUeXBlXyA9PSBOYXRpdmVUeXBlLmtGbG9hdCB8fCBuYXRpdmVUeXBlXyA9PSBOYXRpdmVUeXBlLmtEb3VibGUpIHsKICAgICAgcmV0dXJuIEludGVyZmFjZVR5cGUoZG91YmxlQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSk7CiAgICB9CiAgICBpZiAobmF0aXZlVHlwZV8gPT0gTmF0aXZlVHlwZS5rVm9pZCkgewogICAgICByZXR1cm4gVm9pZFR5cGUoKTsKICAgIH0KICAgIGlmIChuYXRpdmVUeXBlXyAhPSBOYXRpdmVUeXBlLmtOYXRpdmVGdW5jdGlvbiB8fAogICAgICAgIG5hdGl2ZS50eXBlQXJndW1lbnRzWzBdIGlzISBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZmluYWwgRnVuY3Rpb25UeXBlIGZ1biA9IG5hdGl2ZS50eXBlQXJndW1lbnRzWzBdOwogICAgaWYgKGZ1bi5uYW1lZFBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgcmV0dXJuIG51bGw7CiAgICBpZiAoZnVuLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPSBmdW4ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChmdW4udHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IDApIHJldHVybiBudWxsOwogICAgLy8gVE9ETygzNjczMCk6IFN0cnVjdHMgY2Fubm90IGFwcGVhciBpbiBuYXRpdmUgZnVuY3Rpb24gc2lnbmF0dXJlcy4KICAgIGZpbmFsIERhcnRUeXBlIHJldHVyblR5cGUgPQogICAgICAgIGNvbnZlcnROYXRpdmVUeXBlVG9EYXJ0VHlwZShmdW4ucmV0dXJuVHlwZSwgLyphbGxvd1N0cnVjdHM9Ki8gZmFsc2UpOwogICAgaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBmaW5hbCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudFR5cGVzID0gZnVuLnBvc2l0aW9uYWxQYXJhbWV0ZXJzCiAgICAgICAgLm1hcCgodCkgPT4gY29udmVydE5hdGl2ZVR5cGVUb0RhcnRUeXBlKHQsIC8qYWxsb3dTdHJ1Y3RzPSovIGZhbHNlKSkKICAgICAgICAudG9MaXN0KCk7CiAgICBpZiAoYXJndW1lbnRUeXBlcy5jb250YWlucyhudWxsKSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gRnVuY3Rpb25UeXBlKGFyZ3VtZW50VHlwZXMsIHJldHVyblR5cGUsIE51bGxhYmlsaXR5LmxlZ2FjeSk7CiAgfQoKICBOYXRpdmVUeXBlIGdldFR5cGUoQ2xhc3MgYykgewogICAgZmluYWwgaW50IGluZGV4ID0gbmF0aXZlVHlwZXNDbGFzc2VzLmluZGV4T2YoYyk7CiAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gTmF0aXZlVHlwZS52YWx1ZXNbaW5kZXhdOwogIH0KfQoKLy8vIENvbnRhaW5zIHJlcGxhY2VkIG1lbWJlcnMsIG9mIHdoaWNoIGFsbCB0aGUgY2FsbCBzaXRlcyBuZWVkIHRvIGJlIHJlcGxhY2VkLgovLy8KLy8vIFtSZXBsYWNlZE1lbWJlcnNdIGlzIHBvcHVsYXRlZCBieSBfRmZpRGVmaW5pdGlvblRyYW5zZm9ybWVyIGFuZCBjb25zdW1lZCBieQovLy8gX0ZmaVVzZVNpdGVUcmFuc2Zvcm1lci4KY2xhc3MgUmVwbGFjZWRNZW1iZXJzIHsKICBmaW5hbCBNYXA8RmllbGQsIFByb2NlZHVyZT4gcmVwbGFjZWRHZXR0ZXJzOwogIGZpbmFsIE1hcDxGaWVsZCwgUHJvY2VkdXJlPiByZXBsYWNlZFNldHRlcnM7CiAgUmVwbGFjZWRNZW1iZXJzKHRoaXMucmVwbGFjZWRHZXR0ZXJzLCB0aGlzLnJlcGxhY2VkU2V0dGVycyk7Cn0KgWMATk48AUseASABIkIpPjNFRAEyEg8SEQwTCQoKCgoLCwsLCgsJCgIBOTkBOywQFBMNFAoLCwsLDAwMDAsMCgsDARcaAT4kGRwbGB0NDg4ODg8PDxcODxMVAwEnBEBIBEdJBE0zCzAOAU0VAUIVAgEYHRUcHAMBMQRIMgRGEARRNhYBFycnUAUbgJdIAR9NS0ptBVAbUEpJSDkFPW0dAwFRKhQVFRUVFhYWFhUWFwMBPDorHR0cIi8vARgbGRsaHSEBHCMcGx4iIyQmKCYeJycdMDMwMTUkAUYoAT04OSctKS0rMU4zTD48RU5PThxDUR1IH00dRB5FQSdJKkwyPRdENkQMRTZFDEk2SQxPAU8nBjQ0NDQ0NDQ0NDc3NTswQi5RKBMGLTA5ATwvBh8TBi4ZBjo4OgZRPQYrGQY1NBMGATY1SRMGNUkgTilCTRMzSAQBIDUXEwYlBAIBUARQHBgvLz8CASNwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9mZmkuZGFydFtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL2ZmaV9kZWZpbml0aW9ucy5kYXJ0wABEEi8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IHZtLnRyYW5zZm9ybWF0aW9ucy5mZmlfZGVmaW5pdGlvbnM7CgppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS92bS5kYXJ0JwogICAgc2hvdwogICAgICAgIHRlbXBsYXRlRmZpRmllbGRBbm5vdGF0aW9uLAogICAgICAgIHRlbXBsYXRlRmZpRmllbGROb0Fubm90YXRpb24sCiAgICAgICAgdGVtcGxhdGVGZmlUeXBlTWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVGZmlGaWVsZEluaXRpYWxpemVyLAogICAgICAgIHRlbXBsYXRlRmZpU3RydWN0R2VuZXJpYzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9saWJyYXJ5X2luZGV4LmRhcnQnIHNob3cgTGlicmFyeUluZGV4OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3JlZmVyZW5jZV9mcm9tX2luZGV4LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC9jaGFuZ2VkX3N0cnVjdHVyZV9ub3RpZmllci5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IERpYWdub3N0aWNSZXBvcnRlcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgU3VidHlwZUNoZWNrTW9kZTsKCmltcG9ydCAnZmZpLmRhcnQnOwoKLy8vIENoZWNrcyBhbmQgZWxhYm9yYXRlcyB0aGUgZGFydDpmZmkgc3RydWN0cyBhbmQgZmllbGRzLgovLy8KLy8vIElucHV0OgovLy8gY2xhc3MgQ29vcmQgZXh0ZW5kcyBTdHJ1Y3QgewovLy8gICBARG91YmxlKCkKLy8vICAgZG91YmxlIHg7Ci8vLwovLy8gICBARG91YmxlKCkKLy8vICAgZG91YmxlIHk7Ci8vLwovLy8gICBDb29yZCBuZXh0OwovLy8gfQovLy8KLy8vIE91dHB1dDoKLy8vIGNsYXNzIENvb3JkIGV4dGVuZHMgU3RydWN0IHsKLy8vICAgQ29vcmQuI2Zyb21Qb2ludGVyKFBvaW50ZXI8Q29vcmQ+IGNvb3JkKSA6IHN1cGVyLl8oY29vcmQpOwovLy8KLy8vICAgUG9pbnRlcjxEb3VibGU+IGdldCBfeFB0ciA9PiBhZGRyZXNzT2YuY2FzdCgpOwovLy8gICBzZXQgeChkb3VibGUgdikgPT4gX3hQdHIuc3RvcmUodik7Ci8vLyAgIGRvdWJsZSBnZXQgeCA9PiBfeFB0ci5sb2FkKCk7Ci8vLwovLy8gICBQb2ludGVyPERvdWJsZT4gZ2V0IF95UHRyID0+IGFkZHJlc3NPZi5vZmZzZXRCeSguLi4pLmNhc3QoKTsKLy8vICAgc2V0IHkoZG91YmxlIHYpID0+IF95UHRyLnN0b3JlKHYpOwovLy8gICBkb3VibGUgZ2V0IHkgPT4gX3lQdHIubG9hZCgpOwovLy8KLy8vICAgZmZpLlBvaW50ZXI8Q29vcmRpbmF0ZT4gZ2V0IF9uZXh0UHRyID0+IGFkZHJlc3NvZi5vZmZzZXRCeSguLi4pLmNhc3QoKTsKLy8vICAgc2V0IG5leHQoQ29vcmRpbmF0ZSB2KSA9PiBfbmV4dFB0ci5zdG9yZSh2KTsKLy8vICAgQ29vcmRpbmF0ZSBnZXQgbmV4dCA9PiBfbmV4dFB0ci5sb2FkKCk7Ci8vLwovLy8gICBzdGF0aWMgZmluYWwgaW50ICNzaXplT2YgPSAyNDsKLy8vIH0KUmVwbGFjZWRNZW1iZXJzIHRyYW5zZm9ybUxpYnJhcmllcygKICAgIENvbXBvbmVudCBjb21wb25lbnQsCiAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgUmVmZXJlbmNlRnJvbUluZGV4IHJlZmVyZW5jZUZyb21JbmRleCwKICAgIENoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllciBjaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIpIHsKICBmaW5hbCBMaWJyYXJ5SW5kZXggaW5kZXggPQogICAgICBMaWJyYXJ5SW5kZXgoY29tcG9uZW50LCBjb25zdCBbImRhcnQ6ZmZpIiwgImRhcnQ6Y29yZSJdKTsKICBpZiAoIWluZGV4LmNvbnRhaW5zTGlicmFyeSgiZGFydDpmZmkiKSkgewogICAgLy8gSWYgZGFydDpmZmkgaXMgbm90IGxvYWRlZCwgZG8gbm90IGRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KICAgIHJldHVybiBSZXBsYWNlZE1lbWJlcnMoe30sIHt9KTsKICB9CiAgZmluYWwgdHJhbnNmb3JtZXIgPSBuZXcgX0ZmaURlZmluaXRpb25UcmFuc2Zvcm1lcihpbmRleCwgY29yZVR5cGVzLCBoaWVyYXJjaHksCiAgICAgIGRpYWdub3N0aWNSZXBvcnRlciwgcmVmZXJlbmNlRnJvbUluZGV4LCBjaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIpOwogIGxpYnJhcmllcy5mb3JFYWNoKHRyYW5zZm9ybWVyLnZpc2l0TGlicmFyeSk7CiAgcmV0dXJuIFJlcGxhY2VkTWVtYmVycygKICAgICAgdHJhbnNmb3JtZXIucmVwbGFjZWRHZXR0ZXJzLCB0cmFuc2Zvcm1lci5yZXBsYWNlZFNldHRlcnMpOwp9CgovLy8gQ2hlY2tzIGFuZCBlbGFib3JhdGVzIHRoZSBkYXJ0OmZmaSBzdHJ1Y3RzIGFuZCBmaWVsZHMuCmNsYXNzIF9GZmlEZWZpbml0aW9uVHJhbnNmb3JtZXIgZXh0ZW5kcyBGZmlUcmFuc2Zvcm1lciB7CiAgZmluYWwgTGlicmFyeUluZGV4IGluZGV4OwoKICBNYXA8RmllbGQsIFByb2NlZHVyZT4gcmVwbGFjZWRHZXR0ZXJzID0ge307CiAgTWFwPEZpZWxkLCBQcm9jZWR1cmU+IHJlcGxhY2VkU2V0dGVycyA9IHt9OwoKICBDaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyOwoKICBJbmRleGVkTGlicmFyeSBjdXJyZW50TGlicmFyeUluZGV4OwoKICBfRmZpRGVmaW5pdGlvblRyYW5zZm9ybWVyKAogICAgICB0aGlzLmluZGV4LAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIERpYWdub3N0aWNSZXBvcnRlciBkaWFnbm9zdGljUmVwb3J0ZXIsCiAgICAgIFJlZmVyZW5jZUZyb21JbmRleCByZWZlcmVuY2VGcm9tSW5kZXgsCiAgICAgIHRoaXMuY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyKQogICAgICA6IHN1cGVyKGluZGV4LCBjb3JlVHlwZXMsIGhpZXJhcmNoeSwgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgICAgICAgICByZWZlcmVuY2VGcm9tSW5kZXgpIHt9CgogIEBvdmVycmlkZQogIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIGN1cnJlbnRMaWJyYXJ5SW5kZXggPSByZWZlcmVuY2VGcm9tSW5kZXg/Lmxvb2t1cExpYnJhcnkobm9kZSk7CiAgICByZXR1cm4gc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRFeHRlbnNpb24oRXh0ZW5zaW9uIG5vZGUpIHsKICAgIC8vIFRoZSBleHRlbnNpb24gYW5kIGl0J3MgbWVtYmVycyBhcmUgb25seSBtZXRhZGF0YS4KICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBpZiAoIWhpZXJhcmNoeS5pc1N1YmNsYXNzT2Yobm9kZSwgc3RydWN0Q2xhc3MpIHx8IG5vZGUgPT0gc3RydWN0Q2xhc3MpIHsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgX2NoZWNrU3RydWN0Q2xhc3Mobm9kZSk7CgogICAgLy8gU3RydWN0IG9iamVjdHMgYXJlIG1hbnVmYWN0dXJlZCBpbiB0aGUgVk0gYnkgJ2FsbG9jYXRlJyBhbmQgJ2xvYWQnLgogICAgX21ha2VFbnRyeVBvaW50KG5vZGUpOwoKICAgIHZhciBpbmRleGVkQ2xhc3MgPSBjdXJyZW50TGlicmFyeUluZGV4Py5sb29rdXBJbmRleGVkQ2xhc3Mobm9kZS5uYW1lKTsKICAgIF9jaGVja0NvbnN0cnVjdG9ycyhub2RlLCBpbmRleGVkQ2xhc3MpOwogICAgZmluYWwgYm9vbCBmaWVsZHNWYWxpZCA9IF9jaGVja0ZpZWxkQW5ub3RhdGlvbnMobm9kZSk7CgogICAgaWYgKGZpZWxkc1ZhbGlkKSB7CiAgICAgIGZpbmFsIHN0cnVjdFNpemUgPSBfcmVwbGFjZUZpZWxkcyhub2RlLCBpbmRleGVkQ2xhc3MpOwogICAgICBfcmVwbGFjZVNpemVPZk1ldGhvZChub2RlLCBzdHJ1Y3RTaXplLCBpbmRleGVkQ2xhc3MpOwogICAgICBjaGFuZ2VkU3RydWN0dXJlTm90aWZpZXI/LmZvckNsYXNzKG5vZGUpOwogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgdm9pZCBfY2hlY2tTdHJ1Y3RDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIGRpYWdub3N0aWNSZXBvcnRlci5yZXBvcnQoCiAgICAgICAgICB0ZW1wbGF0ZUZmaVN0cnVjdEdlbmVyaWMud2l0aEFyZ3VtZW50cyhub2RlLm5hbWUpLAogICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgMSwKICAgICAgICAgIG5vZGUubG9jYXRpb24uZmlsZSk7CiAgICB9CgogICAgaWYgKG5vZGUuc3VwZXJ0eXBlPy5jbGFzc05vZGUgIT0gc3RydWN0Q2xhc3MpIHsKICAgICAgLy8gTm90IGEgc3RydWN0LCBidXQgZXh0ZW5kcyBhIHN0cnVjdC4gVGhlIGVycm9yIHdpbGwgYmUgZW1pdHRlZCBieQogICAgICAvLyBfRmZpVXNlU2l0ZVRyYW5zZm9ybWVyLgogICAgICByZXR1cm47CiAgICB9CiAgfQoKICBib29sIF9pc1BvaW50ZXJUeXBlKEZpZWxkIGZpZWxkKSB7CiAgICByZXR1cm4gZW52LmlzU3VidHlwZU9mKAogICAgICAgIGZpZWxkLnR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZShwb2ludGVyQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwgWwogICAgICAgICAgSW50ZXJmYWNlVHlwZShuYXRpdmVUeXBlc0NsYXNzZXNbTmF0aXZlVHlwZS5rTmF0aXZlVHlwZS5pbmRleF0sCiAgICAgICAgICAgICAgTnVsbGFiaWxpdHkubGVnYWN5KQogICAgICAgIF0pLAogICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKICB9CgogIGJvb2wgX2NoZWNrRmllbGRBbm5vdGF0aW9ucyhDbGFzcyBub2RlKSB7CiAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwogICAgZm9yIChmaW5hbCBGaWVsZCBmIGluIG5vZGUuZmllbGRzKSB7CiAgICAgIGlmIChmLmluaXRpYWxpemVyIGlzISBOdWxsTGl0ZXJhbCkgewogICAgICAgIGRpYWdub3N0aWNSZXBvcnRlci5yZXBvcnQoCiAgICAgICAgICAgIHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplci53aXRoQXJndW1lbnRzKGYubmFtZS5uYW1lKSwKICAgICAgICAgICAgZi5maWxlT2Zmc2V0LAogICAgICAgICAgICBmLm5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICAgIGYuZmlsZVVyaSk7CiAgICAgIH0KICAgICAgZmluYWwgbmF0aXZlVHlwZUFubm9zID0gX2dldE5hdGl2ZVR5cGVBbm5vdGF0aW9ucyhmKS50b0xpc3QoKTsKICAgICAgaWYgKF9pc1BvaW50ZXJUeXBlKGYpKSB7CiAgICAgICAgaWYgKG5hdGl2ZVR5cGVBbm5vcy5sZW5ndGggIT0gMCkgewogICAgICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLnJlcG9ydCgKICAgICAgICAgICAgICB0ZW1wbGF0ZUZmaUZpZWxkTm9Bbm5vdGF0aW9uLndpdGhBcmd1bWVudHMoZi5uYW1lLm5hbWUpLAogICAgICAgICAgICAgIGYuZmlsZU9mZnNldCwKICAgICAgICAgICAgICBmLm5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgZi5maWxlVXJpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobmF0aXZlVHlwZUFubm9zLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLnJlcG9ydCgKICAgICAgICAgICAgdGVtcGxhdGVGZmlGaWVsZEFubm90YXRpb24ud2l0aEFyZ3VtZW50cyhmLm5hbWUubmFtZSksCiAgICAgICAgICAgIGYuZmlsZU9mZnNldCwKICAgICAgICAgICAgZi5uYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgICBmLmZpbGVVcmkpOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsIERhcnRUeXBlIGRhcnRUeXBlID0gZi50eXBlOwogICAgICAgIGZpbmFsIERhcnRUeXBlIG5hdGl2ZVR5cGUgPSBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBuYXRpdmVUeXBlc0NsYXNzZXNbbmF0aXZlVHlwZUFubm9zLmZpcnN0LmluZGV4XSwKICAgICAgICAgICAgTnVsbGFiaWxpdHkubGVnYWN5KTsKICAgICAgICAvLyBUT0RPKDM2NzMwKTogU3VwcG9ydCBzdHJ1Y3RzIGluc2lkZSBzdHJ1Y3RzLgogICAgICAgIGZpbmFsIERhcnRUeXBlIHNob3VsZEJlRGFydFR5cGUgPQogICAgICAgICAgICBjb252ZXJ0TmF0aXZlVHlwZVRvRGFydFR5cGUobmF0aXZlVHlwZSwgLyphbGxvd1N0cnVjdHM9Ki8gZmFsc2UpOwogICAgICAgIGlmIChzaG91bGRCZURhcnRUeXBlID09IG51bGwgfHwKICAgICAgICAgICAgIWVudi5pc1N1YnR5cGVPZihkYXJ0VHlwZSwgc2hvdWxkQmVEYXJ0VHlwZSwKICAgICAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLnJlcG9ydCgKICAgICAgICAgICAgICB0ZW1wbGF0ZUZmaVR5cGVNaXNtYXRjaC53aXRoQXJndW1lbnRzKGRhcnRUeXBlLCBzaG91bGRCZURhcnRUeXBlLAogICAgICAgICAgICAgICAgICBuYXRpdmVUeXBlLCBub2RlLmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgZi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgZi5sb2NhdGlvbi5maWxlKTsKICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdWNjZXNzOwogIH0KCiAgdm9pZCBfY2hlY2tDb25zdHJ1Y3RvcnMoQ2xhc3Mgbm9kZSwgSW5kZXhlZENsYXNzIGluZGV4ZWRDbGFzcykgewogICAgZmluYWwgdG9SZW1vdmUgPSA8SW5pdGlhbGl6ZXI+W107CgogICAgLy8gQ29uc3RydWN0b3JzIGNhbm5vdCBoYXZlIGluaXRpYWxpemVycyBiZWNhdXNlIGluaXRpYWxpemVycyByZWZlciB0bwogICAgLy8gZmllbGRzLCBhbmQgdGhlIGZpZWxkcyB3ZXJlIHJlcGxhY2VkIHdpdGggZ2V0dGVyL3NldHRlciBwYWlycy4KICAgIGZvciAoZmluYWwgQ29uc3RydWN0b3IgYyBpbiBub2RlLmNvbnN0cnVjdG9ycykgewogICAgICBmb3IgKGZpbmFsIEluaXRpYWxpemVyIGkgaW4gYy5pbml0aWFsaXplcnMpIHsKICAgICAgICBpZiAoaSBpcyBGaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgICB0b1JlbW92ZS5hZGQoaSk7CiAgICAgICAgICBkaWFnbm9zdGljUmVwb3J0ZXIucmVwb3J0KAogICAgICAgICAgICAgIHRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplci53aXRoQXJndW1lbnRzKGkuZmllbGQubmFtZS5uYW1lKSwKICAgICAgICAgICAgICBpLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICBpLmxvY2F0aW9uLmZpbGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gUmVtb3ZlIGluaXRpYWxpemVycyByZWZlcnJpbmcgdG8gZmllbGRzIHRvIHByZXZlbnQgY2FzY2FkaW5nIGVycm9ycy4KICAgIGZvciAoZmluYWwgSW5pdGlhbGl6ZXIgaSBpbiB0b1JlbW92ZSkgewogICAgICBpLnJlbW92ZSgpOwogICAgfQoKICAgIC8vIEFkZCBhIGNvbnN0cnVjdG9yIHdoaWNoICdsb2FkJyBjYW4gdXNlLgogICAgLy8gQy4jZnJvbVBvaW50ZXIoUG9pbnRlcjxWb2lkPiBhZGRyZXNzKSA6IHN1cGVyLmZyb21Qb2ludGVyKGFkZHJlc3MpOwogICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiBwb2ludGVyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oIiNwb2ludGVyIik7CiAgICBmaW5hbCBuYW1lID0gTmFtZSgiI2Zyb21Qb2ludGVyIik7CiAgICBmaW5hbCByZWZlcmVuY2VGcm9tID0gaW5kZXhlZENsYXNzPy5sb29rdXBDb25zdHJ1Y3RvcihuYW1lLm5hbWUpOwogICAgZmluYWwgQ29uc3RydWN0b3IgY3RvciA9IENvbnN0cnVjdG9yKAogICAgICAgIEZ1bmN0aW9uTm9kZShFbXB0eVN0YXRlbWVudCgpLCBwb3NpdGlvbmFsUGFyYW1ldGVyczogW3BvaW50ZXJdKSwKICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgIGluaXRpYWxpemVyczogWwogICAgICAgICAgU3VwZXJJbml0aWFsaXplcihzdHJ1Y3RGcm9tUG9pbnRlciwgQXJndW1lbnRzKFtWYXJpYWJsZUdldChwb2ludGVyKV0pKQogICAgICAgIF0sCiAgICAgICAgZmlsZVVyaTogbm9kZS5maWxlVXJpLAogICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlRnJvbT8ucmVmZXJlbmNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQKICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CiAgICBfbWFrZUVudHJ5UG9pbnQoY3Rvcik7CiAgICBub2RlLmFkZE1lbWJlcihjdG9yKTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgZmllbGQgb2Zmc2V0cyAoZm9yIGFsbCBBQklzKSBpbiB0aGUgc3RydWN0IGFuZCByZXBsYWNlcyB0aGUKICAvLy8gZmllbGRzIHdpdGggZ2V0dGVycyBhbmQgc2V0dGVycyB1c2luZyB0aGVzZSBvZmZzZXRzLgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzdHJ1Y3QgKGZvciBhbGwgQUJJcykuCiAgTWFwPEFiaSwgaW50PiBfcmVwbGFjZUZpZWxkcyhDbGFzcyBub2RlLCBJbmRleGVkQ2xhc3MgaW5kZXhlZENsYXNzKSB7CiAgICBmaW5hbCBmaWVsZHMgPSA8RmllbGQ+W107CiAgICBmaW5hbCB0eXBlcyA9IDxOYXRpdmVUeXBlPltdOwoKICAgIGZvciAoZmluYWwgRmllbGQgZiBpbiBub2RlLmZpZWxkcykgewogICAgICBpZiAoX2lzUG9pbnRlclR5cGUoZikpIHsKICAgICAgICBmaWVsZHMuYWRkKGYpOwogICAgICAgIHR5cGVzLmFkZChOYXRpdmVUeXBlLmtQb2ludGVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaW5hbCBuYXRpdmVUeXBlQW5ub3MgPSBfZ2V0TmF0aXZlVHlwZUFubm90YXRpb25zKGYpLnRvTGlzdCgpOwogICAgICAgIGlmIChuYXRpdmVUeXBlQW5ub3MubGVuZ3RoID09IDEpIHsKICAgICAgICAgIGZpbmFsIE5hdGl2ZVR5cGUgdCA9IG5hdGl2ZVR5cGVBbm5vcy5maXJzdDsKICAgICAgICAgIGZpZWxkcy5hZGQoZik7CiAgICAgICAgICB0eXBlcy5hZGQodCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZmluYWwgc2l6ZUFuZE9mZnNldHMgPSA8QWJpLCBTaXplQW5kT2Zmc2V0cz57fTsKICAgIGZvciAoZmluYWwgQWJpIGFiaSBpbiBBYmkudmFsdWVzKSB7CiAgICAgIHNpemVBbmRPZmZzZXRzW2FiaV0gPSBfY2FsY3VsYXRlU2l6ZUFuZE9mZnNldHModHlwZXMsIGFiaSk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgZmluYWwgZmllbGRPZmZzZXRzID0gc2l6ZUFuZE9mZnNldHMKICAgICAgICAgIC5tYXAoKEFiaSBhYmksIFNpemVBbmRPZmZzZXRzIHYpID0+IE1hcEVudHJ5KGFiaSwgdi5vZmZzZXRzW2ldKSk7CiAgICAgIGZpbmFsIG1ldGhvZHMgPSBfZ2VuZXJhdGVNZXRob2RzRm9yRmllbGQoCiAgICAgICAgICBmaWVsZHNbaV0sIHR5cGVzW2ldLCBmaWVsZE9mZnNldHMsIGluZGV4ZWRDbGFzcyk7CiAgICAgIG1ldGhvZHMuZm9yRWFjaCgocCkgPT4gbm9kZS5hZGRNZW1iZXIocCkpOwogICAgfQoKICAgIGZvciAoZmluYWwgRmllbGQgZiBpbiBmaWVsZHMpIHsKICAgICAgZi5yZW1vdmUoKTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZUFuZE9mZnNldHMubWFwKChrLCB2KSA9PiBNYXBFbnRyeShrLCB2LnNpemUpKTsKICB9CgogIC8vLyBFeHByZXNzaW9uIHRoYXQgcXVlcmllcyBWTSBpbnRlcm5hbHMgYXQgcnVudGltZSB0byBmaWd1cmUgb3V0IG9uIHdoaWNoIEFCSQogIC8vLyB3ZSBhcmUuCiAgRXhwcmVzc2lvbiBfcnVudGltZUJyYW5jaE9uTGF5b3V0KE1hcDxBYmksIGludD4gdmFsdWVzKSB7CiAgICByZXR1cm4gTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24oCiAgICAgICAgICAgIExpc3RDb25zdGFudChJbnRlcmZhY2VUeXBlKGludENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3kpLCBbCiAgICAgICAgICAgICAgSW50Q29uc3RhbnQodmFsdWVzW0FiaS53b3JkU2l6ZTY0XSksCiAgICAgICAgICAgICAgSW50Q29uc3RhbnQodmFsdWVzW0FiaS53b3JkU2l6ZTMyQWxpZ24zMl0pLAogICAgICAgICAgICAgIEludENvbnN0YW50KHZhbHVlc1tBYmkud29yZFNpemUzMkFsaWduNjRdKQogICAgICAgICAgICBdKSwKICAgICAgICAgICAgSW50ZXJmYWNlVHlwZShsaXN0Q2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwKICAgICAgICAgICAgICAgIFtJbnRlcmZhY2VUeXBlKGludENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3kpXSkpLAogICAgICAgIE5hbWUoIltdIiksCiAgICAgICAgQXJndW1lbnRzKFtTdGF0aWNJbnZvY2F0aW9uKGFiaU1ldGhvZCwgQXJndW1lbnRzKFtdKSldKSwKICAgICAgICBsaXN0RWxlbWVudEF0KTsKICB9CgogIC8vLyBTYW1wbGUgb3V0cHV0OgogIC8vLyBmZmkuUG9pbnRlcjxmZmkuRG91YmxlPiBnZXQgX3hQdHIgPT4gYWRkcmVzc09mLmNhc3QoKTsKICAvLy8gZG91YmxlIGdldCB4ID0+IF94UHRyLmxvYWQoKTsKICAvLy8gc2V0IHgoZG91YmxlIHYpID0+IF94UHRyLnN0b3JlKHYpOwogIExpc3Q8UHJvY2VkdXJlPiBfZ2VuZXJhdGVNZXRob2RzRm9yRmllbGQoRmllbGQgZmllbGQsIE5hdGl2ZVR5cGUgdHlwZSwKICAgICAgTWFwPEFiaSwgaW50PiBvZmZzZXRzLCBJbmRleGVkQ2xhc3MgaW5kZXhlZENsYXNzKSB7CiAgICBmaW5hbCBEYXJ0VHlwZSBuYXRpdmVUeXBlID0gdHlwZSA9PSBOYXRpdmVUeXBlLmtQb2ludGVyCiAgICAgICAgPyBmaWVsZC50eXBlCiAgICAgICAgOiBJbnRlcmZhY2VUeXBlKG5hdGl2ZVR5cGVzQ2xhc3Nlc1t0eXBlLmluZGV4XSwgTnVsbGFiaWxpdHkubGVnYWN5KTsKICAgIGZpbmFsIERhcnRUeXBlIHBvaW50ZXJUeXBlID0KICAgICAgICBJbnRlcmZhY2VUeXBlKHBvaW50ZXJDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBbbmF0aXZlVHlwZV0pOwogICAgZmluYWwgTmFtZSBwb2ludGVyTmFtZSA9IE5hbWUoJyNfcHRyXyR7ZmllbGQubmFtZS5uYW1lfScpOwoKICAgIC8vIFNhbXBsZSBvdXRwdXQ6CiAgICAvLyBmZmkuUG9pbnRlcjxmZmkuRG91YmxlPiBnZXQgX3hQdHIgPT4gYWRkcmVzc09mLm9mZnNldEJ5KC4uLikuY2FzdDxmZmkuUG9pbnRlcjxmZmkuRG91YmxlPj4oKTsKICAgIEV4cHJlc3Npb24gcG9pbnRlciA9CiAgICAgICAgUHJvcGVydHlHZXQoVGhpc0V4cHJlc3Npb24oKSwgYWRkcmVzc09mRmllbGQubmFtZSwgYWRkcmVzc09mRmllbGQpOwogICAgZmluYWwgaGFzTm9uWmVybyA9IG9mZnNldHMudmFsdWVzLnNraXBXaGlsZSgoaSkgPT4gaSA9PSAwKS5pc05vdEVtcHR5OwogICAgaWYgKGhhc05vblplcm8pIHsKICAgICAgcG9pbnRlciA9IE1ldGhvZEludm9jYXRpb24ocG9pbnRlciwgb2Zmc2V0QnlNZXRob2QubmFtZSwKICAgICAgICAgIEFyZ3VtZW50cyhbX3J1bnRpbWVCcmFuY2hPbkxheW91dChvZmZzZXRzKV0pLCBvZmZzZXRCeU1ldGhvZCk7CiAgICB9CgogICAgZmluYWwgQ2xhc3MgbmF0aXZlQ2xhc3MgPSAobmF0aXZlVHlwZSBhcyBJbnRlcmZhY2VUeXBlKS5jbGFzc05vZGU7CiAgICBmaW5hbCBOYXRpdmVUeXBlIG50ID0gZ2V0VHlwZShuYXRpdmVDbGFzcyk7CiAgICBmaW5hbCB0eXBlQXJndW1lbnRzID0gWwogICAgICBpZiAobnQgPT0gTmF0aXZlVHlwZS5rUG9pbnRlciAmJiBwb2ludGVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlKQogICAgICAgIHBvaW50ZXJUeXBlLnR5cGVBcmd1bWVudHNbMF0KICAgIF07CgogICAgZmluYWwgUHJvY2VkdXJlIHBvaW50ZXJHZXR0ZXIgPSBQcm9jZWR1cmUoCiAgICAgICAgcG9pbnRlck5hbWUsCiAgICAgICAgUHJvY2VkdXJlS2luZC5HZXR0ZXIsCiAgICAgICAgRnVuY3Rpb25Ob2RlKAogICAgICAgICAgICBSZXR1cm5TdGF0ZW1lbnQoTWV0aG9kSW52b2NhdGlvbihwb2ludGVyLCBjYXN0TWV0aG9kLm5hbWUsCiAgICAgICAgICAgICAgICBBcmd1bWVudHMoW10sIHR5cGVzOiBbbmF0aXZlVHlwZV0pLCBjYXN0TWV0aG9kKSksCiAgICAgICAgICAgIHJldHVyblR5cGU6IHBvaW50ZXJUeXBlKSwKICAgICAgICBmaWxlVXJpOiBmaWVsZC5maWxlVXJpLAogICAgICAgIHJlZmVyZW5jZToKICAgICAgICAgICAgaW5kZXhlZENsYXNzPy5sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIocG9pbnRlck5hbWUubmFtZSk/LnJlZmVyZW5jZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmllbGQuZmlsZU9mZnNldAogICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBmaWVsZC5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwoKICAgIC8vIFNhbXBsZSBvdXRwdXQ6CiAgICAvLyBkb3VibGUgZ2V0IHggPT4gX3hQdHIudmFsdWU7CiAgICBmaW5hbCBsb2FkTWV0aG9kID0KICAgICAgICBvcHRpbWl6ZWRUeXBlcy5jb250YWlucyhudCkgPyBsb2FkTWV0aG9kc1tudF0gOiBsb2FkU3RydWN0TWV0aG9kOwogICAgZmluYWwgUHJvY2VkdXJlIGdldHRlciA9IFByb2NlZHVyZSgKICAgICAgICBmaWVsZC5uYW1lLAogICAgICAgIFByb2NlZHVyZUtpbmQuR2V0dGVyLAogICAgICAgIEZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgUmV0dXJuU3RhdGVtZW50KFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgICBsb2FkTWV0aG9kLAogICAgICAgICAgICAgICAgQXJndW1lbnRzKFsKICAgICAgICAgICAgICAgICAgUHJvcGVydHlHZXQoVGhpc0V4cHJlc3Npb24oKSwgcG9pbnRlck5hbWUsIHBvaW50ZXJHZXR0ZXIpLAogICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24oSW50Q29uc3RhbnQoMCksCiAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VUeXBlKGludENsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3kpKQogICAgICAgICAgICAgICAgXSwgdHlwZXM6IHR5cGVBcmd1bWVudHMpKSksCiAgICAgICAgICAgIHJldHVyblR5cGU6IGZpZWxkLnR5cGUpLAogICAgICAgIGZpbGVVcmk6IGZpZWxkLmZpbGVVcmksCiAgICAgICAgcmVmZXJlbmNlOgogICAgICAgICAgICBpbmRleGVkQ2xhc3M/Lmxvb2t1cFByb2NlZHVyZU5vdFNldHRlcihmaWVsZC5uYW1lLm5hbWUpPy5yZWZlcmVuY2UpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpZWxkLmZpbGVPZmZzZXQKICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0gZmllbGQuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKCiAgICAvLyBTYW1wbGUgb3V0cHV0OgogICAgLy8gc2V0IHgoZG91YmxlIHYpIHsgX3hQdHIudmFsdWUgPSB2OyB9OwogICAgZmluYWwgc3RvcmVNZXRob2QgPSBzdG9yZU1ldGhvZHNbbnRdOwogICAgUHJvY2VkdXJlIHNldHRlciA9IG51bGw7CiAgICBpZiAoIWZpZWxkLmlzRmluYWwpIHsKICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiBhcmd1bWVudCA9CiAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uKCcjdicsIHR5cGU6IGZpZWxkLnR5cGUpOwogICAgICBzZXR0ZXIgPSBQcm9jZWR1cmUoCiAgICAgICAgICBmaWVsZC5uYW1lLAogICAgICAgICAgUHJvY2VkdXJlS2luZC5TZXR0ZXIsCiAgICAgICAgICBGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgICAgUmV0dXJuU3RhdGVtZW50KFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgICAgIHN0b3JlTWV0aG9kLAogICAgICAgICAgICAgICAgICBBcmd1bWVudHMoWwogICAgICAgICAgICAgICAgICAgIFByb3BlcnR5R2V0KFRoaXNFeHByZXNzaW9uKCksIHBvaW50ZXJOYW1lLCBwb2ludGVyR2V0dGVyKSwKICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24oSW50Q29uc3RhbnQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZVR5cGUoaW50Q2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSkpLAogICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlR2V0KGFyZ3VtZW50KQogICAgICAgICAgICAgICAgICBdLCB0eXBlczogdHlwZUFyZ3VtZW50cykpKSwKICAgICAgICAgICAgICByZXR1cm5UeXBlOiBWb2lkVHlwZSgpLAogICAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBbYXJndW1lbnRdKSwKICAgICAgICAgIGZpbGVVcmk6IGZpZWxkLmZpbGVVcmksCiAgICAgICAgICByZWZlcmVuY2U6CiAgICAgICAgICAgICAgaW5kZXhlZENsYXNzPy5sb29rdXBQcm9jZWR1cmVTZXR0ZXIoZmllbGQubmFtZS5uYW1lKT8ucmVmZXJlbmNlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpZWxkLmZpbGVPZmZzZXQKICAgICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBmaWVsZC5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwogICAgfQoKICAgIHJlcGxhY2VkR2V0dGVyc1tmaWVsZF0gPSBnZXR0ZXI7CiAgICByZXBsYWNlZFNldHRlcnNbZmllbGRdID0gc2V0dGVyOwoKICAgIHJldHVybiBbcG9pbnRlckdldHRlciwgZ2V0dGVyLCBpZiAoc2V0dGVyICE9IG51bGwpIHNldHRlcl07CiAgfQoKICAvLy8gU2FtcGxlIG91dHB1dDoKICAvLy8gc3RhdGljIGludCAjc2l6ZU9mKCkgPT4gMjQ7CiAgdm9pZCBfcmVwbGFjZVNpemVPZk1ldGhvZCgKICAgICAgQ2xhc3Mgc3RydWN0LCBNYXA8QWJpLCBpbnQ+IHNpemVzLCBJbmRleGVkQ2xhc3MgaW5kZXhlZENsYXNzKSB7CiAgICB2YXIgbmFtZSA9IE5hbWUoIiNzaXplT2YiKTsKICAgIGZpbmFsIEZpZWxkIHNpemVPZiA9IEZpZWxkKG5hbWUsCiAgICAgICAgaXNTdGF0aWM6IHRydWUsCiAgICAgICAgaXNGaW5hbDogdHJ1ZSwKICAgICAgICBpbml0aWFsaXplcjogX3J1bnRpbWVCcmFuY2hPbkxheW91dChzaXplcyksCiAgICAgICAgdHlwZTogSW50ZXJmYWNlVHlwZShpbnRDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5KSwKICAgICAgICBmaWxlVXJpOiBzdHJ1Y3QuZmlsZVVyaSwKICAgICAgICByZWZlcmVuY2U6IGluZGV4ZWRDbGFzcz8ubG9va3VwRmllbGQobmFtZS5uYW1lKT8ucmVmZXJlbmNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBzdHJ1Y3QuZmlsZU9mZnNldDsKICAgIF9tYWtlRW50cnlQb2ludChzaXplT2YpOwogICAgc3RydWN0LmFkZE1lbWJlcihzaXplT2YpOwogIH0KCiAgaW50IF9zaXplSW5CeXRlcyhOYXRpdmVUeXBlIHR5cGUsIEFiaSBhYmkpIHsKICAgIGZpbmFsIGludCBzaXplID0gbmF0aXZlVHlwZVNpemVzW3R5cGUuaW5kZXhdOwogICAgaWYgKHNpemUgPT0gV09SRF9TSVpFKSB7CiAgICAgIHJldHVybiB3b3JkU2l6ZVthYmldOwogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQoKICBpbnQgX2FsaWdubWVudE9mKE5hdGl2ZVR5cGUgdHlwZSwgQWJpIGFiaSkgewogICAgZmluYWwgaW50IGFsaWdubWVudCA9IG5vblNpemVBbGlnbm1lbnRbYWJpXVt0eXBlXTsKICAgIGlmIChhbGlnbm1lbnQgIT0gbnVsbCkgcmV0dXJuIGFsaWdubWVudDsKICAgIHJldHVybiBfc2l6ZUluQnl0ZXModHlwZSwgYWJpKTsKICB9CgogIGludCBfYWxpZ25PZmZzZXQoaW50IG9mZnNldCwgaW50IGFsaWdubWVudCkgewogICAgZmluYWwgaW50IHJlbWFpbmRlciA9IG9mZnNldCAlIGFsaWdubWVudDsKICAgIGlmIChyZW1haW5kZXIgIT0gMCkgewogICAgICBvZmZzZXQgLT0gcmVtYWluZGVyOwogICAgICBvZmZzZXQgKz0gYWxpZ25tZW50OwogICAgfQogICAgcmV0dXJuIG9mZnNldDsKICB9CgogIC8vIFRPRE8oMzcyNzEpOiBTdXBwb3J0IG5lc3RlZCBzdHJ1Y3RzLgogIFNpemVBbmRPZmZzZXRzIF9jYWxjdWxhdGVTaXplQW5kT2Zmc2V0cyhMaXN0PE5hdGl2ZVR5cGU+IHR5cGVzLCBBYmkgYWJpKSB7CiAgICBpbnQgb2Zmc2V0ID0gMDsKICAgIGZpbmFsIG9mZnNldHMgPSA8aW50PltdOwogICAgZm9yIChmaW5hbCBOYXRpdmVUeXBlIHQgaW4gdHlwZXMpIHsKICAgICAgZmluYWwgaW50IHNpemUgPSBfc2l6ZUluQnl0ZXModCwgYWJpKTsKICAgICAgZmluYWwgaW50IGFsaWdubWVudCA9IF9hbGlnbm1lbnRPZih0LCBhYmkpOwogICAgICBvZmZzZXQgPSBfYWxpZ25PZmZzZXQob2Zmc2V0LCBhbGlnbm1lbnQpOwogICAgICBvZmZzZXRzLmFkZChvZmZzZXQpOwogICAgICBvZmZzZXQgKz0gc2l6ZTsKICAgIH0KICAgIGZpbmFsIGludCBtaW5pbXVtQWxpZ25tZW50ID0gMTsKICAgIGZpbmFsIHNpemVBbGlnbm1lbnQgPSB0eXBlcwogICAgICAgIC5tYXAoKHQpID0+IF9hbGlnbm1lbnRPZih0LCBhYmkpKQogICAgICAgIC5mb2xsb3dlZEJ5KFttaW5pbXVtQWxpZ25tZW50XSkucmVkdWNlKG1hdGgubWF4KTsKICAgIGZpbmFsIGludCBzaXplID0gX2FsaWduT2Zmc2V0KG9mZnNldCwgc2l6ZUFsaWdubWVudCk7CiAgICByZXR1cm4gU2l6ZUFuZE9mZnNldHMoc2l6ZSwgb2Zmc2V0cyk7CiAgfQoKICB2b2lkIF9tYWtlRW50cnlQb2ludChBbm5vdGF0YWJsZSBub2RlKSB7CiAgICBub2RlLmFkZEFubm90YXRpb24oQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIEluc3RhbmNlQ29uc3RhbnQocHJhZ21hQ2xhc3MucmVmZXJlbmNlLCBbXSwgewogICAgICAgICAgcHJhZ21hTmFtZS5yZWZlcmVuY2U6IFN0cmluZ0NvbnN0YW50KCJ2bTplbnRyeS1wb2ludCIpLAogICAgICAgICAgcHJhZ21hT3B0aW9ucy5yZWZlcmVuY2U6IE51bGxDb25zdGFudCgpCiAgICAgICAgfSksCiAgICAgICAgSW50ZXJmYWNlVHlwZShwcmFnbWFDbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBbXSkpKTsKICB9CgogIE5hdGl2ZVR5cGUgX2dldEZpZWxkVHlwZShDbGFzcyBjKSB7CiAgICBmaW5hbCBmaWVsZFR5cGUgPSBnZXRUeXBlKGMpOwoKICAgIGlmIChmaWVsZFR5cGUgPT0gTmF0aXZlVHlwZS5rVm9pZCkgewogICAgICAvLyBGaWVsZHMgY2Fubm90IGhhdmUgVm9pZCB0eXBlcy4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZmllbGRUeXBlOwogIH0KCiAgSXRlcmFibGU8TmF0aXZlVHlwZT4gX2dldE5hdGl2ZVR5cGVBbm5vdGF0aW9ucyhGaWVsZCBub2RlKSB7CiAgICByZXR1cm4gbm9kZS5hbm5vdGF0aW9ucwogICAgICAgIC53aGVyZVR5cGU8Q29uc3RhbnRFeHByZXNzaW9uPigpCiAgICAgICAgLm1hcCgoZXhwcikgPT4gZXhwci5jb25zdGFudCkKICAgICAgICAud2hlcmVUeXBlPEluc3RhbmNlQ29uc3RhbnQ+KCkKICAgICAgICAubWFwKChjb25zdGFudCkgPT4gY29uc3RhbnQuY2xhc3NOb2RlKQogICAgICAgIC5tYXAoKGtsYXNzKSA9PiBfZ2V0RmllbGRUeXBlKGtsYXNzKSkKICAgICAgICAud2hlcmUoKHR5cGUpID0+IHR5cGUgIT0gbnVsbCk7CiAgfQp9CgpjbGFzcyBTaXplQW5kT2Zmc2V0cyB7CiAgLy8vIFNpemUgb2YgdGhlIGVudGlyZSBzdHJ1Y3QuCiAgZmluYWwgaW50IHNpemU7CgogIC8vLyBPZmZzZXQgaW4gYnl0ZXMgZm9yIGVhY2ggZmllbGQsIGluZGV4ZWQgYnkgZmllbGQgbnVtYmVyLgogIGZpbmFsIExpc3Q8aW50PiBvZmZzZXRzOwoKICBTaXplQW5kT2Zmc2V0cyh0aGlzLnNpemUsIHRoaXMub2Zmc2V0cyk7Cn0Kgf4ATk48ASwBHAE0CSQmISUiATBCKT4zQEVFARMBOwQLIRAQBBAQBBIGBAwhQQQ1KSQEQykkBE4zLgQlBiQZGR4dKys5HUAsQCQEUUkvGkECATs5HAEuLgE1ASYBHRIbIC0tJT8jAQwfQyUEAQwjOREEAQwbTRMGAR0BSxsBSyw7ARc9PDAGAREEAScqIT0bDR8GATRKIQ4GBAElHBQ6SiIMMQQBLBkpKyNEGiAYCEUfKyVHHCIaCjAjQxogGA8qMz0hOCpOKDk7JVBNHBEgGwoIBhQEAUMmAUtGNTQlGyVMHBEgCggGTCwSBgEvS00nRipJFBhRCx8tJU8bGgQBTzsGO0geIgEpHxcoD0crNhkYCggGATQoQgYBLipMMDwxBgEkEgYBPgQBUQ48HRxIMzo5EDlBFEEYBAEVPSQpSTo8FU0hRz8BFmUZTEsWP0kGAUcwHEUlBwEvFR4WR0ImIBNRJj8BFiQXSigUHhYuHBxNNUMsJSATUCY/ARYtKh0aKzcaFiAYMB8eTzdGKi4mMSIVTyhBBgElJQFABAEVIh1GICUYFzQ7IUQoHR4EAS8yHRwGEQQBLzctJAQBMC4aGxsGEwQBKk0UHSgtMjAbFgYkICo6OioEASsrNkIyDD4EASYiASkoEwYWBAE/HCkmJy8uKAQCARchEgE/GwErAgEvcGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvZmZpX2RlZmluaXRpb25zLmRhcnRZZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9mZmlfdXNlX3NpdGVzLmRhcnTAAENjLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgdm0udHJhbnNmb3JtYXRpb25zLmZmaV91c2Vfc2l0ZXM7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfdW5zdGFibGUvdm0uZGFydCcKICAgIHNob3cKICAgICAgICBtZXNzYWdlRmZpRXhjZXB0aW9uYWxSZXR1cm5OdWxsLAogICAgICAgIG1lc3NhZ2VGZmlFeHBlY3RlZENvbnN0YW50LAogICAgICAgIHRlbXBsYXRlRmZpRGFydFR5cGVNaXNtYXRjaCwKICAgICAgICB0ZW1wbGF0ZUZmaUV4cGVjdGVkRXhjZXB0aW9uYWxSZXR1cm4sCiAgICAgICAgdGVtcGxhdGVGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm4sCiAgICAgICAgdGVtcGxhdGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MsCiAgICAgICAgdGVtcGxhdGVGZmlOb3RTdGF0aWMsCiAgICAgICAgdGVtcGxhdGVGZmlUeXBlSW52YWxpZCwKICAgICAgICB0ZW1wbGF0ZUZmaVR5cGVNaXNtYXRjaDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvbGlicmFyeV9pbmRleC5kYXJ0JyBzaG93IExpYnJhcnlJbmRleDsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9yZWZlcmVuY2VfZnJvbV9pbmRleC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IERpYWdub3N0aWNSZXBvcnRlcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwoKaW1wb3J0ICdmZmkuZGFydCcKICAgIHNob3cgUmVwbGFjZWRNZW1iZXJzLCBOYXRpdmVUeXBlLCBGZmlUcmFuc2Zvcm1lciwgb3B0aW1pemVkVHlwZXM7CgovLy8gQ2hlY2tzIGFuZCByZXBsYWNlcyBjYWxscyB0byBkYXJ0OmZmaSBzdHJ1Y3QgZmllbGRzIGFuZCBtZXRob2RzLgp2b2lkIHRyYW5zZm9ybUxpYnJhcmllcygKICAgIENvbXBvbmVudCBjb21wb25lbnQsCiAgICBDb3JlVHlwZXMgY29yZVR5cGVzLAogICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LAogICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsCiAgICBEaWFnbm9zdGljUmVwb3J0ZXIgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgUmVwbGFjZWRNZW1iZXJzIHJlcGxhY2VkRmllbGRzLAogICAgUmVmZXJlbmNlRnJvbUluZGV4IHJlZmVyZW5jZUZyb21JbmRleCkgewogIGZpbmFsIGluZGV4ID0gbmV3IExpYnJhcnlJbmRleChjb21wb25lbnQsIFsiZGFydDpmZmkiXSk7CiAgaWYgKCFpbmRleC5jb250YWluc0xpYnJhcnkoImRhcnQ6ZmZpIikpIHsKICAgIC8vIElmIGRhcnQ6ZmZpIGlzIG5vdCBsb2FkZWQsIGRvIG5vdCBkbyB0aGUgdHJhbnNmb3JtYXRpb24uCiAgICByZXR1cm47CiAgfQogIGZpbmFsIHRyYW5zZm9ybWVyID0gbmV3IF9GZmlVc2VTaXRlVHJhbnNmb3JtZXIoCiAgICAgIGluZGV4LAogICAgICBjb3JlVHlwZXMsCiAgICAgIGhpZXJhcmNoeSwKICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgICByZWZlcmVuY2VGcm9tSW5kZXgsCiAgICAgIHJlcGxhY2VkRmllbGRzLnJlcGxhY2VkR2V0dGVycywKICAgICAgcmVwbGFjZWRGaWVsZHMucmVwbGFjZWRTZXR0ZXJzKTsKICBsaWJyYXJpZXMuZm9yRWFjaCh0cmFuc2Zvcm1lci52aXNpdExpYnJhcnkpOwp9CgovLy8gQ2hlY2tzIGFuZCByZXBsYWNlcyBjYWxscyB0byBkYXJ0OmZmaSBzdHJ1Y3QgZmllbGRzIGFuZCBtZXRob2RzLgpjbGFzcyBfRmZpVXNlU2l0ZVRyYW5zZm9ybWVyIGV4dGVuZHMgRmZpVHJhbnNmb3JtZXIgewogIGZpbmFsIE1hcDxGaWVsZCwgUHJvY2VkdXJlPiByZXBsYWNlZEdldHRlcnM7CiAgZmluYWwgTWFwPEZpZWxkLCBQcm9jZWR1cmU+IHJlcGxhY2VkU2V0dGVyczsKICBTdGF0aWNUeXBlQ29udGV4dCBfc3RhdGljVHlwZUNvbnRleHQ7CgogIExpYnJhcnkgY3VycmVudExpYnJhcnk7CiAgYm9vbCBnZXQgaXNGZmlMaWJyYXJ5ID0+IGN1cnJlbnRMaWJyYXJ5ID09IGZmaUxpYnJhcnk7CiAgSW5kZXhlZExpYnJhcnkgY3VycmVudExpYnJhcnlJbmRleDsKCiAgLy8gVXNlZCB0byBjcmVhdGUgcHJpdmF0ZSB0b3AtbGV2ZWwgZmllbGRzIHdpdGggdW5pcXVlIG5hbWVzIGZvciBlYWNoCiAgLy8gY2FsbGJhY2suCiAgaW50IGNhbGxiYWNrQ291bnQgPSAwOwoKICBfRmZpVXNlU2l0ZVRyYW5zZm9ybWVyKAogICAgICBMaWJyYXJ5SW5kZXggaW5kZXgsCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwKICAgICAgRGlhZ25vc3RpY1JlcG9ydGVyIGRpYWdub3N0aWNSZXBvcnRlciwKICAgICAgUmVmZXJlbmNlRnJvbUluZGV4IHJlZmVyZW5jZUZyb21JbmRleCwKICAgICAgdGhpcy5yZXBsYWNlZEdldHRlcnMsCiAgICAgIHRoaXMucmVwbGFjZWRTZXR0ZXJzKQogICAgICA6IHN1cGVyKGluZGV4LCBjb3JlVHlwZXMsIGhpZXJhcmNoeSwgZGlhZ25vc3RpY1JlcG9ydGVyLAogICAgICAgICAgICByZWZlcmVuY2VGcm9tSW5kZXgpIHt9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIGN1cnJlbnRMaWJyYXJ5ID0gbm9kZTsKICAgIGN1cnJlbnRMaWJyYXJ5SW5kZXggPSByZWZlcmVuY2VGcm9tSW5kZXg/Lmxvb2t1cExpYnJhcnkobm9kZSk7CiAgICBjYWxsYmFja0NvdW50ID0gMDsKICAgIHJldHVybiBzdXBlci52aXNpdExpYnJhcnkobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIHRyeSB7CiAgICAgIF9lbnN1cmVOb3RFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3Mobm9kZSk7CiAgICAgIHJldHVybiBzdXBlci52aXNpdENsYXNzKG5vZGUpOwogICAgfSBvbiBfRmZpU3RhdGljVHlwZUVycm9yIHsKICAgICAgLy8gSXQncyBPSyB0byBzd2FsbG93IHRoZSBleGNlcHRpb24gYmVjYXVzZSB0aGUgZGlhZ25vc3RpY3MgaXNzdWVkIHdpbGwKICAgICAgLy8gY2F1c2UgY29tcGlsYXRpb24gdG8gZmFpbC4gQnkgY29udGludWluZywgd2UgY2FuIHJlcG9ydCBtb3JlCiAgICAgIC8vIGRpYWdub3N0aWNzIGJlZm9yZSBjb21waWxhdGlvbiBlbmRzLgogICAgICByZXR1cm4gc3VwZXIudmlzaXRDbGFzcyhub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RmllbGQoRmllbGQgbm9kZSkgewogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbmV3IFN0YXRpY1R5cGVDb250ZXh0KG5vZGUsIGVudik7CiAgICB2YXIgcmVzdWx0ID0gc3VwZXIudmlzaXRGaWVsZChub2RlKTsKICAgIF9zdGF0aWNUeXBlQ29udGV4dCA9IG51bGw7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPSBuZXcgU3RhdGljVHlwZUNvbnRleHQobm9kZSwgZW52KTsKICAgIHZhciByZXN1bHQgPSBzdXBlci52aXNpdENvbnN0cnVjdG9yKG5vZGUpOwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbmV3IFN0YXRpY1R5cGVDb250ZXh0KG5vZGUsIGVudik7CiAgICB2YXIgcmVzdWx0ID0gc3VwZXIudmlzaXRQcm9jZWR1cmUobm9kZSk7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPSBudWxsOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvcGVydHlHZXQoUHJvcGVydHlHZXQgbm9kZSkgewogICAgc3VwZXIudmlzaXRQcm9wZXJ0eUdldChub2RlKTsKCiAgICBmaW5hbCBQcm9jZWR1cmUgcmVwbGFjZWRXaXRoID0gcmVwbGFjZWRHZXR0ZXJzW25vZGUuaW50ZXJmYWNlVGFyZ2V0XTsKICAgIGlmIChyZXBsYWNlZFdpdGggIT0gbnVsbCkgewogICAgICBub2RlID0gUHJvcGVydHlHZXQobm9kZS5yZWNlaXZlciwgcmVwbGFjZWRXaXRoLm5hbWUsIHJlcGxhY2VkV2l0aCk7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb3BlcnR5U2V0KFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHN1cGVyLnZpc2l0UHJvcGVydHlTZXQobm9kZSk7CgogICAgZmluYWwgUHJvY2VkdXJlIHJlcGxhY2VkV2l0aCA9IHJlcGxhY2VkU2V0dGVyc1tub2RlLmludGVyZmFjZVRhcmdldF07CiAgICBpZiAocmVwbGFjZWRXaXRoICE9IG51bGwpIHsKICAgICAgbm9kZSA9IFByb3BlcnR5U2V0KAogICAgICAgICAgbm9kZS5yZWNlaXZlciwgcmVwbGFjZWRXaXRoLm5hbWUsIG5vZGUudmFsdWUsIHJlcGxhY2VkV2l0aCk7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CiAgICBzdXBlci52aXNpdFN0YXRpY0ludm9jYXRpb24obm9kZSk7CgogICAgZmluYWwgTWVtYmVyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgdHJ5IHsKICAgICAgaWYgKHRhcmdldCA9PSBmcm9tRnVuY3Rpb25NZXRob2QpIHsKICAgICAgICBmaW5hbCBEYXJ0VHlwZSBuYXRpdmVUeXBlID0gSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgbmF0aXZlRnVuY3Rpb25DbGFzcywgTnVsbGFiaWxpdHkubGVnYWN5LCBbbm9kZS5hcmd1bWVudHMudHlwZXNbMF1dKTsKICAgICAgICBmaW5hbCBFeHByZXNzaW9uIGZ1bmMgPSBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzBdOwogICAgICAgIGZpbmFsIERhcnRUeXBlIGRhcnRUeXBlID0gZnVuYy5nZXRTdGF0aWNUeXBlKF9zdGF0aWNUeXBlQ29udGV4dCk7CgogICAgICAgIF9lbnN1cmVJc1N0YXRpY0Z1bmN0aW9uKGZ1bmMpOwoKICAgICAgICAvLyBUT0RPKDM2NzMwKTogQWxsb3cgcGFzc2luZy9yZXR1cm5pbmcgc3RydWN0cyBieSB2YWx1ZS4KICAgICAgICBfZW5zdXJlTmF0aXZlVHlwZVZhbGlkKG5hdGl2ZVR5cGUsIG5vZGUpOwogICAgICAgIF9lbnN1cmVOYXRpdmVUeXBlVG9EYXJ0VHlwZShuYXRpdmVUeXBlLCBkYXJ0VHlwZSwgbm9kZSk7CgogICAgICAgIC8vIENoZWNrIGBleGNlcHRpb25hbFJldHVybmAncyB0eXBlLgogICAgICAgIGZpbmFsIEZ1bmN0aW9uVHlwZSBmdW5jVHlwZSA9IGRhcnRUeXBlOwogICAgICAgIGZpbmFsIE5hdGl2ZVR5cGUgZXhwZWN0ZWRSZXR1cm4gPSBnZXRUeXBlKAogICAgICAgICAgICAoKG5vZGUuYXJndW1lbnRzLnR5cGVzWzBdIGFzIEZ1bmN0aW9uVHlwZSkucmV0dXJuVHlwZQogICAgICAgICAgICAgICAgICAgIGFzIEludGVyZmFjZVR5cGUpCiAgICAgICAgICAgICAgICAuY2xhc3NOb2RlKTsKCiAgICAgICAgaWYgKGV4cGVjdGVkUmV0dXJuID09IE5hdGl2ZVR5cGUua1ZvaWQgfHwKICAgICAgICAgICAgZXhwZWN0ZWRSZXR1cm4gPT0gTmF0aXZlVHlwZS5rUG9pbnRlcikgewogICAgICAgICAgaWYgKG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID4gMSkgewogICAgICAgICAgICBkaWFnbm9zdGljUmVwb3J0ZXIucmVwb3J0KAogICAgICAgICAgICAgICAgdGVtcGxhdGVGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm4ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBmdW5jVHlwZS5yZXR1cm5UeXBlLCBjdXJyZW50TGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICBub2RlLmxvY2F0aW9uLmZpbGUpOwogICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgIH0KICAgICAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuYWRkKE51bGxMaXRlcmFsKCkuLnBhcmVudCA9IG5vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUaGUgZXhjZXB0aW9uYWwgcmV0dXJuIHZhbHVlIGlzIG5vdCBvcHRpb25hbCBmb3Igb3RoZXIgcmV0dXJuCiAgICAgICAgICAvLyB0eXBlcy4KICAgICAgICAgIGlmIChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLnJlcG9ydCgKICAgICAgICAgICAgICAgIHRlbXBsYXRlRmZpRXhwZWN0ZWRFeGNlcHRpb25hbFJldHVybi53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGZ1bmNUeXBlLnJldHVyblR5cGUsIGN1cnJlbnRMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgIG5vZGUubG9jYXRpb24uZmlsZSk7CiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgICAgfQoKICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZXhjZXB0aW9uYWxSZXR1cm4gPSBub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsWzFdOwoKICAgICAgICAgIC8vIFRoZSBleGNlcHRpb25hbCByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIGNvbnN0YW50IHNvIHRoYXQgaXQgYmUKICAgICAgICAgIC8vIHJlZmVyZW5jZWQgYnkgcHJlY29tcGlsZWQgdHJhbXBvbGluZSdzIG9iamVjdCBwb29sLgogICAgICAgICAgaWYgKGV4Y2VwdGlvbmFsUmV0dXJuIGlzISBCYXNpY0xpdGVyYWwgJiYKICAgICAgICAgICAgICAhKGV4Y2VwdGlvbmFsUmV0dXJuIGlzIENvbnN0YW50RXhwcmVzc2lvbiAmJgogICAgICAgICAgICAgICAgICBleGNlcHRpb25hbFJldHVybi5jb25zdGFudCBpcyBQcmltaXRpdmVDb25zdGFudCkpIHsKICAgICAgICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLnJlcG9ydChtZXNzYWdlRmZpRXhwZWN0ZWRDb25zdGFudCwKICAgICAgICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwgMSwgbm9kZS5sb2NhdGlvbi5maWxlKTsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gTW9yZW92ZXIgaXQgbWF5IG5vdCBiZSBudWxsLgogICAgICAgICAgaWYgKGV4Y2VwdGlvbmFsUmV0dXJuIGlzIE51bGxMaXRlcmFsIHx8CiAgICAgICAgICAgICAgKGV4Y2VwdGlvbmFsUmV0dXJuIGlzIENvbnN0YW50RXhwcmVzc2lvbiAmJgogICAgICAgICAgICAgICAgICBleGNlcHRpb25hbFJldHVybi5jb25zdGFudCBpcyBOdWxsQ29uc3RhbnQpKSB7CiAgICAgICAgICAgIGRpYWdub3N0aWNSZXBvcnRlci5yZXBvcnQobWVzc2FnZUZmaUV4Y2VwdGlvbmFsUmV0dXJuTnVsbCwKICAgICAgICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwgMSwgbm9kZS5sb2NhdGlvbi5maWxlKTsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICB9CgogICAgICAgICAgZmluYWwgRGFydFR5cGUgcmV0dXJuVHlwZSA9CiAgICAgICAgICAgICAgZXhjZXB0aW9uYWxSZXR1cm4uZ2V0U3RhdGljVHlwZShfc3RhdGljVHlwZUNvbnRleHQpOwoKICAgICAgICAgIGlmICghZW52LmlzU3VidHlwZU9mKHJldHVyblR5cGUsIGZ1bmNUeXBlLnJldHVyblR5cGUsCiAgICAgICAgICAgICAgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgICAgICAgIGRpYWdub3N0aWNSZXBvcnRlci5yZXBvcnQoCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZmaURhcnRUeXBlTWlzbWF0Y2gud2l0aEFyZ3VtZW50cyhyZXR1cm5UeXBlLAogICAgICAgICAgICAgICAgICAgIGZ1bmNUeXBlLnJldHVyblR5cGUsIGN1cnJlbnRMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgZXhjZXB0aW9uYWxSZXR1cm4uZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICBleGNlcHRpb25hbFJldHVybi5sb2NhdGlvbi5maWxlKTsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBfcmVwbGFjZUZyb21GdW5jdGlvbihub2RlKTsKICAgICAgfQogICAgfSBvbiBfRmZpU3RhdGljVHlwZUVycm9yIHsKICAgICAgLy8gSXQncyBPSyB0byBzd2FsbG93IHRoZSBleGNlcHRpb24gYmVjYXVzZSB0aGUgZGlhZ25vc3RpY3MgaXNzdWVkIHdpbGwKICAgICAgLy8gY2F1c2UgY29tcGlsYXRpb24gdG8gZmFpbC4gQnkgY29udGludWluZywgd2UgY2FuIHJlcG9ydCBtb3JlCiAgICAgIC8vIGRpYWdub3N0aWNzIGJlZm9yZSBjb21waWxhdGlvbiBlbmRzLgogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gV2UgbmVlZCB0byByZXBsYWNlIGNhbGxzIHRvICdEeW5hbWljTGlicmFyeS5sb29rdXBGdW5jdGlvbicgd2l0aCBleHBsaWNpdAogIC8vIEtlcm5lbCwgYmVjYXVzZSB3ZSBjYW5ub3QgaGF2ZSBhIGdlbmVyaWMgY2FsbCB0byAnYXNGdW5jdGlvbicgaW4gaXRzIGJvZHkuCiAgLy8KICAvLyBCZWxvdywgaW4gJ3Zpc2l0TWV0aG9kSW52b2NhdGlvbicsIHdlIGVuc3VyZSB0aGF0IHRoZSB0eXBlIGFyZ3VtZW50cyB0bwogIC8vICdsb29rdXBGdW5jdGlvbicgYXJlIGNvbnN0YW50cywgc28gYnkgaW5saW5pbmcgdGhlIGNhbGwgdG8gJ2FzRnVuY3Rpb24nIGF0CiAgLy8gdGhlIGNhbGwtc2l0ZSwgd2UgZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGdlbmVyaWMgY2FsbHMgdG8gJ2FzRnVuY3Rpb24nLgogIC8vCiAgLy8gV2Ugd2lsbCBub3QgZGV0ZWN0IGR5bmFtaWMgaW52b2NhdGlvbnMgb2YgJ2FzRnVuY3Rpb24nIGFuZAogIC8vICdsb29rdXBGdW5jdGlvbic6IHRoZXNlIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdHVicyBpbiAnZmZpX3BhdGNoLmRhcnQnIGFuZAogIC8vICdkeW5hbWljX2xpYnJhcnlfcGF0Y2guZGFydCcuIER5bmFtaWMgaW52b2NhdGlvbnMgb2YgJ2xvb2t1cEZ1bmN0aW9uJyAoYW5kCiAgLy8gJ2FzRnVuY3Rpb24nKSBhcmUgbm90IGxlZ2FsIGFuZCB0aHJvdyBhIHJ1bnRpbWUgZXhjZXB0aW9uLgogIEV4cHJlc3Npb24gX3JlcGxhY2VMb29rdXBGdW5jdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIC8vIFRoZSBnZW5lcmF0ZWQgY29kZSBsb29rcyBsaWtlOgogICAgLy8KICAgIC8vIF9hc0Z1bmN0aW9uSW50ZXJuYWw8RFMsIE5TPihsb29rdXA8TmF0aXZlRnVuY3Rpb248TlM+PihzeW1ib2xOYW1lKSkKCiAgICBmaW5hbCBEYXJ0VHlwZSBuYXRpdmVTaWduYXR1cmUgPSBub2RlLmFyZ3VtZW50cy50eXBlc1swXTsKICAgIGZpbmFsIERhcnRUeXBlIGRhcnRTaWduYXR1cmUgPSBub2RlLmFyZ3VtZW50cy50eXBlc1sxXTsKCiAgICBmaW5hbCBBcmd1bWVudHMgYXJncyA9IEFyZ3VtZW50cyhbCiAgICAgIG5vZGUuYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlCiAgICBdLCB0eXBlczogWwogICAgICBJbnRlcmZhY2VUeXBlKG5hdGl2ZUZ1bmN0aW9uQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwgW25hdGl2ZVNpZ25hdHVyZV0pCiAgICBdKTsKCiAgICBmaW5hbCBFeHByZXNzaW9uIGxvb2t1cFJlc3VsdCA9IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgbm9kZS5yZWNlaXZlciwgTmFtZSgibG9va3VwIiksIGFyZ3MsIGxpYnJhcnlMb29rdXBNZXRob2QpOwoKICAgIHJldHVybiBTdGF0aWNJbnZvY2F0aW9uKGFzRnVuY3Rpb25JbnRlcm5hbCwKICAgICAgICBBcmd1bWVudHMoW2xvb2t1cFJlc3VsdF0sIHR5cGVzOiBbZGFydFNpZ25hdHVyZSwgbmF0aXZlU2lnbmF0dXJlXSkpOwogIH0KCiAgLy8gV2UgbmVlZCB0byByZXdyaXRlIGNhbGxzIHRvICdmcm9tRnVuY3Rpb24nIGludG8gdHdvIGNhbGxzLCByZXByZXNlbnRpbmcgdGhlCiAgLy8gY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBhc3BlY3RzIG9mIGNyZWF0aW5nIHRoZSBjbG9zdXJlOgogIC8vCiAgLy8gZmluYWwgZHluYW1pYyBfI2ZmaUNhbGxiYWNrMCA9IFBvaW50ZXIuZnJvbUZ1bmN0aW9uPFQ+KGYsIGUpID0+CiAgLy8gICBfcG9pbnRlckZyb21GdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjxUPj4oCiAgLy8gICAgIF9uYXRpdmVDYWxsYmFja0Z1bmN0aW9uPFQ+KGYsIGUpKTsKICAvLwogIC8vICAuLi4gXyNmZmlDYWxsYmFjazAgLi4uCiAgLy8KICAvLyBXZSBtdXN0IGltcGxlbWVudCB0aGlzIGFzIGEgS2VybmVsIHJld3JpdGUgYmVjYXVzZSA8VD4gbXVzdCBiZSBhCiAgLy8gY29tcGlsZS10aW1lIGNvbnN0YW50IHRvIGFueSBpbnZvY2F0aW9uIG9mICdfbmF0aXZlQ2FsbGJhY2tGdW5jdGlvbicuCiAgLy8KICAvLyBDcmVhdGluZyB0aGlzIGNsb3N1cmUgcmVxdWlyZXMgYSBydW50aW1lIGNhbGwsIHNvIHdlIHNhdmUgdGhlIHJlc3VsdCBpbiBhCiAgLy8gc3ludGhldGljIHRvcC1sZXZlbCBmaWVsZCB0byBhdm9pZCByZWNvbXB1dGluZyBpdC4KICBFeHByZXNzaW9uIF9yZXBsYWNlRnJvbUZ1bmN0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgZmluYWwgbmF0aXZlRnVuY3Rpb25UeXBlID0gSW50ZXJmYWNlVHlwZSgKICAgICAgICBuYXRpdmVGdW5jdGlvbkNsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIG5vZGUuYXJndW1lbnRzLnR5cGVzKTsKICAgIHZhciBuYW1lID0gTmFtZSgiXyNmZmlDYWxsYmFjayR7Y2FsbGJhY2tDb3VudCsrfSIsIGN1cnJlbnRMaWJyYXJ5KTsKICAgIGZpbmFsIEZpZWxkIGZpZWxkID0gRmllbGQobmFtZSwKICAgICAgICB0eXBlOiBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBwb2ludGVyQ2xhc3MsIE51bGxhYmlsaXR5LmxlZ2FjeSwgW25hdGl2ZUZ1bmN0aW9uVHlwZV0pLAogICAgICAgIGluaXRpYWxpemVyOiBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICBwb2ludGVyRnJvbUZ1bmN0aW9uUHJvY2VkdXJlLAogICAgICAgICAgICBBcmd1bWVudHMoWwogICAgICAgICAgICAgIFN0YXRpY0ludm9jYXRpb24obmF0aXZlQ2FsbGJhY2tGdW5jdGlvblByb2NlZHVyZSwgbm9kZS5hcmd1bWVudHMpCiAgICAgICAgICAgIF0sIHR5cGVzOiBbCiAgICAgICAgICAgICAgbmF0aXZlRnVuY3Rpb25UeXBlCiAgICAgICAgICAgIF0pKSwKICAgICAgICBpc1N0YXRpYzogdHJ1ZSwKICAgICAgICBpc0ZpbmFsOiB0cnVlLAogICAgICAgIGZpbGVVcmk6IGN1cnJlbnRMaWJyYXJ5LmZpbGVVcmksCiAgICAgICAgcmVmZXJlbmNlOiBjdXJyZW50TGlicmFyeUluZGV4Py5sb29rdXBGaWVsZChuYW1lLm5hbWUpPy5yZWZlcmVuY2UpCiAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIGN1cnJlbnRMaWJyYXJ5LmFkZE1lbWJlcihmaWVsZCk7CiAgICByZXR1cm4gU3RhdGljR2V0KGZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHN1cGVyLnZpc2l0TWV0aG9kSW52b2NhdGlvbihub2RlKTsKCiAgICBmaW5hbCBNZW1iZXIgdGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICB0cnkgewogICAgICAvLyBXZSB3aWxsIG5vdCBkZXRlY3QgZHluYW1pYyBpbnZvY2F0aW9ucyBvZiAnYXNGdW5jdGlvbicgYW5kCiAgICAgIC8vICdsb29rdXBGdW5jdGlvbicgLS0gdGhlc2UgYXJlIGhhbmRsZWQgYnkgdGhlICdhc0Z1bmN0aW9uSW50ZXJuYWwnIHN0dWIKICAgICAgLy8gaW4gJ2R5bmFtaWNfbGlicmFyeV9wYXRjaC5kYXJ0Jy4gRHluYW1pYyBpbnZvY2F0aW9ucyBvZiAnYXNGdW5jdGlvbicKICAgICAgLy8gYW5kICdsb29rdXBGdW5jdGlvbicgYXJlIG5vdCBsZWdhbCBhbmQgdGhyb3cgYSBydW50aW1lIGV4Y2VwdGlvbi4KICAgICAgaWYgKHRhcmdldCA9PSBsb29rdXBGdW5jdGlvbk1ldGhvZCkgewogICAgICAgIGZpbmFsIERhcnRUeXBlIG5hdGl2ZVR5cGUgPSBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBuYXRpdmVGdW5jdGlvbkNsYXNzLCBOdWxsYWJpbGl0eS5sZWdhY3ksIFtub2RlLmFyZ3VtZW50cy50eXBlc1swXV0pOwogICAgICAgIGZpbmFsIERhcnRUeXBlIGRhcnRUeXBlID0gbm9kZS5hcmd1bWVudHMudHlwZXNbMV07CgogICAgICAgIF9lbnN1cmVOYXRpdmVUeXBlVmFsaWQobmF0aXZlVHlwZSwgbm9kZSk7CiAgICAgICAgX2Vuc3VyZU5hdGl2ZVR5cGVUb0RhcnRUeXBlKG5hdGl2ZVR5cGUsIGRhcnRUeXBlLCBub2RlKTsKICAgICAgICByZXR1cm4gX3JlcGxhY2VMb29rdXBGdW5jdGlvbihub2RlKTsKICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT0gYXNGdW5jdGlvbk1ldGhvZCkgewogICAgICAgIGZpbmFsIERhcnRUeXBlIGRhcnRUeXBlID0gbm9kZS5hcmd1bWVudHMudHlwZXNbMF07CiAgICAgICAgZmluYWwgRGFydFR5cGUgcG9pbnRlclR5cGUgPQogICAgICAgICAgICBub2RlLnJlY2VpdmVyLmdldFN0YXRpY1R5cGUoX3N0YXRpY1R5cGVDb250ZXh0KTsKICAgICAgICBmaW5hbCBEYXJ0VHlwZSBuYXRpdmVUeXBlID0gX3BvaW50ZXJUeXBlR2V0VHlwZUFyZyhwb2ludGVyVHlwZSk7CgogICAgICAgIF9lbnN1cmVOYXRpdmVUeXBlVmFsaWQocG9pbnRlclR5cGUsIG5vZGUpOwogICAgICAgIF9lbnN1cmVOYXRpdmVUeXBlVmFsaWQobmF0aXZlVHlwZSwgbm9kZSk7CiAgICAgICAgX2Vuc3VyZU5hdGl2ZVR5cGVUb0RhcnRUeXBlKG5hdGl2ZVR5cGUsIGRhcnRUeXBlLCBub2RlKTsKCiAgICAgICAgZmluYWwgRGFydFR5cGUgbmF0aXZlU2lnbmF0dXJlID0KICAgICAgICAgICAgKG5hdGl2ZVR5cGUgYXMgSW50ZXJmYWNlVHlwZSkudHlwZUFyZ3VtZW50c1swXTsKICAgICAgICByZXR1cm4gU3RhdGljSW52b2NhdGlvbihhc0Z1bmN0aW9uSW50ZXJuYWwsCiAgICAgICAgICAgIEFyZ3VtZW50cyhbbm9kZS5yZWNlaXZlcl0sIHR5cGVzOiBbZGFydFR5cGUsIG5hdGl2ZVNpZ25hdHVyZV0pKTsKICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT0gZWxlbWVudEF0TWV0aG9kKSB7CiAgICAgICAgLy8gVE9ETygzNzc3Myk6IFdoZW4gbW92aW5nIHRvIGV4dGVuc2lvbiBtZXRob2RzIHdlIGNhbiBnZXQgcmlkIG9mCiAgICAgICAgLy8gdGhpcyByZXdpcmluZy4KICAgICAgICBmaW5hbCBEYXJ0VHlwZSBwb2ludGVyVHlwZSA9CiAgICAgICAgICAgIG5vZGUucmVjZWl2ZXIuZ2V0U3RhdGljVHlwZShfc3RhdGljVHlwZUNvbnRleHQpOwogICAgICAgIGZpbmFsIERhcnRUeXBlIG5hdGl2ZVR5cGUgPSBfcG9pbnRlclR5cGVHZXRUeXBlQXJnKHBvaW50ZXJUeXBlKTsKICAgICAgICBpZiAobmF0aXZlVHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgICAgLy8gRG8gbm90IHJld2lyZSBnZW5lcmljIGludm9jYXRpb25zLgogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICAgIGZpbmFsIENsYXNzIG5hdGl2ZUNsYXNzID0gKG5hdGl2ZVR5cGUgYXMgSW50ZXJmYWNlVHlwZSkuY2xhc3NOb2RlOwogICAgICAgIGZpbmFsIE5hdGl2ZVR5cGUgbnQgPSBnZXRUeXBlKG5hdGl2ZUNsYXNzKTsKICAgICAgICBpZiAob3B0aW1pemVkVHlwZXMuY29udGFpbnMobnQpKSB7CiAgICAgICAgICBmaW5hbCB0eXBlQXJndW1lbnRzID0gWwogICAgICAgICAgICBpZiAobnQgPT0gTmF0aXZlVHlwZS5rUG9pbnRlcikgX3BvaW50ZXJUeXBlR2V0VHlwZUFyZyhuYXRpdmVUeXBlKQogICAgICAgICAgXTsKICAgICAgICAgIHJldHVybiBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICAgIGVsZW1lbnRBdE1ldGhvZHNbbnRdLAogICAgICAgICAgICAgIEFyZ3VtZW50cyhbbm9kZS5yZWNlaXZlciwgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbFswXV0sCiAgICAgICAgICAgICAgICAgIHR5cGVzOiB0eXBlQXJndW1lbnRzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IG9uIF9GZmlTdGF0aWNUeXBlRXJyb3IgewogICAgICAvLyBJdCdzIE9LIHRvIHN3YWxsb3cgdGhlIGV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBkaWFnbm9zdGljcyBpc3N1ZWQgd2lsbAogICAgICAvLyBjYXVzZSBjb21waWxhdGlvbiB0byBmYWlsLiBCeSBjb250aW51aW5nLCB3ZSBjYW4gcmVwb3J0IG1vcmUKICAgICAgLy8gZGlhZ25vc3RpY3MgYmVmb3JlIGNvbXBpbGF0aW9uIGVuZHMuCiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBEYXJ0VHlwZSBfcG9pbnRlclR5cGVHZXRUeXBlQXJnKERhcnRUeXBlIHBvaW50ZXJUeXBlKSB7CiAgICByZXR1cm4gcG9pbnRlclR5cGUgaXMgSW50ZXJmYWNlVHlwZSA/IHBvaW50ZXJUeXBlLnR5cGVBcmd1bWVudHNbMF0gOiBudWxsOwogIH0KCiAgdm9pZCBfZW5zdXJlTmF0aXZlVHlwZVRvRGFydFR5cGUoCiAgICAgIERhcnRUeXBlIG5hdGl2ZVR5cGUsIERhcnRUeXBlIGRhcnRUeXBlLCBFeHByZXNzaW9uIG5vZGUsCiAgICAgIHtib29sIGFsbG93U3RydWN0czogZmFsc2V9KSB7CiAgICBmaW5hbCBEYXJ0VHlwZSBjb3JyZXNwb25kaW5nRGFydFR5cGUgPQogICAgICAgIGNvbnZlcnROYXRpdmVUeXBlVG9EYXJ0VHlwZShuYXRpdmVUeXBlLCBhbGxvd1N0cnVjdHMpOwogICAgaWYgKGRhcnRUeXBlID09IGNvcnJlc3BvbmRpbmdEYXJ0VHlwZSkgcmV0dXJuOwogICAgaWYgKGVudi5pc1N1YnR5cGVPZihjb3JyZXNwb25kaW5nRGFydFR5cGUsIGRhcnRUeXBlLAogICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBkaWFnbm9zdGljUmVwb3J0ZXIucmVwb3J0KAogICAgICAgIHRlbXBsYXRlRmZpVHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoZGFydFR5cGUsIGNvcnJlc3BvbmRpbmdEYXJ0VHlwZSwKICAgICAgICAgICAgbmF0aXZlVHlwZSwgY3VycmVudExpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIDEsCiAgICAgICAgbm9kZS5sb2NhdGlvbi5maWxlKTsKICAgIHRocm93IF9GZmlTdGF0aWNUeXBlRXJyb3IoKTsKICB9CgogIHZvaWQgX2Vuc3VyZU5hdGl2ZVR5cGVWYWxpZChEYXJ0VHlwZSBuYXRpdmVUeXBlLCBFeHByZXNzaW9uIG5vZGUsCiAgICAgIHtib29sIGFsbG93U3RydWN0czogZmFsc2V9KSB7CiAgICBpZiAoIV9uYXRpdmVUeXBlVmFsaWQobmF0aXZlVHlwZSwgYWxsb3dTdHJ1Y3RzOiBhbGxvd1N0cnVjdHMpKSB7CiAgICAgIGRpYWdub3N0aWNSZXBvcnRlci5yZXBvcnQoCiAgICAgICAgICB0ZW1wbGF0ZUZmaVR5cGVJbnZhbGlkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgbmF0aXZlVHlwZSwgY3VycmVudExpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAxLAogICAgICAgICAgbm9kZS5sb2NhdGlvbi5maWxlKTsKICAgICAgdGhyb3cgX0ZmaVN0YXRpY1R5cGVFcnJvcigpOwogICAgfQogIH0KCiAgLy8vIFRoZSBEYXJ0IHR5cGUgc3lzdGVtIGRvZXMgbm90IGVuZm9yY2UgdGhhdCBOYXRpdmVGdW5jdGlvbiByZXR1cm4gYW5kCiAgLy8vIHBhcmFtZXRlciB0eXBlcyBhcmUgb25seSBOYXRpdmVUeXBlcywgc28gd2UgbmVlZCB0byBjaGVjayB0aGlzLgogIGJvb2wgX25hdGl2ZVR5cGVWYWxpZChEYXJ0VHlwZSBuYXRpdmVUeXBlLCB7Ym9vbCBhbGxvd1N0cnVjdHM6IGZhbHNlfSkgewogICAgcmV0dXJuIGNvbnZlcnROYXRpdmVUeXBlVG9EYXJ0VHlwZShuYXRpdmVUeXBlLCBhbGxvd1N0cnVjdHMpICE9IG51bGw7CiAgfQoKICB2b2lkIF9lbnN1cmVJc1N0YXRpY0Z1bmN0aW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKChub2RlIGlzIFN0YXRpY0dldCAmJiBub2RlLnRhcmdldCBpcyBQcm9jZWR1cmUpIHx8CiAgICAgICAgKG5vZGUgaXMgQ29uc3RhbnRFeHByZXNzaW9uICYmIG5vZGUuY29uc3RhbnQgaXMgVGVhck9mZkNvbnN0YW50KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBkaWFnbm9zdGljUmVwb3J0ZXIucmVwb3J0KAogICAgICAgIHRlbXBsYXRlRmZpTm90U3RhdGljLndpdGhBcmd1bWVudHMoZnJvbUZ1bmN0aW9uTWV0aG9kLm5hbWUubmFtZSksCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIDEsCiAgICAgICAgbm9kZS5sb2NhdGlvbi5maWxlKTsKICAgIHRocm93IF9GZmlTdGF0aWNUeXBlRXJyb3IoKTsKICB9CgogIENsYXNzIF9leHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MoQ2xhc3Mga2xhc3MpIHsKICAgIGZpbmFsIENsYXNzIHN1cGVyQ2xhc3MgPSBrbGFzcy5zdXBlcnR5cGU/LmNsYXNzTm9kZTsKCiAgICAvLyBUaGUgU3RydWN0IGNsYXNzIGNhbiBiZSBleHRlbmRlZCwgYnV0IHN1YmNsYXNzZXMgb2YgU3RydWN0IGNhbm5vdCBiZSAobm9yCiAgICAvLyBpbXBsZW1lbnRlZCkuCiAgICBpZiAoa2xhc3MgIT0gc3RydWN0Q2xhc3MgJiYgaGllcmFyY2h5LmlzU3VidHlwZU9mKGtsYXNzLCBzdHJ1Y3RDbGFzcykpIHsKICAgICAgcmV0dXJuIHN1cGVyQ2xhc3MgIT0gc3RydWN0Q2xhc3MgPyBzdXBlckNsYXNzIDogbnVsbDsKICAgIH0KCiAgICBpZiAoIW5hdGl2ZVR5cGVzQ2xhc3Nlcy5jb250YWlucyhrbGFzcykpIHsKICAgICAgZm9yIChmaW5hbCBwYXJlbnQgaW4gbmF0aXZlVHlwZXNDbGFzc2VzKSB7CiAgICAgICAgaWYgKGhpZXJhcmNoeS5pc1N1YnR5cGVPZihrbGFzcywgcGFyZW50KSkgewogICAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBfZW5zdXJlTm90RXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzKENsYXNzIGtsYXNzKSB7CiAgICBmaW5hbCBDbGFzcyBleHRlbmRlZCA9IF9leHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3Moa2xhc3MpOwogICAgaWYgKGV4dGVuZGVkICE9IG51bGwpIHsKICAgICAgZGlhZ25vc3RpY1JlcG9ydGVyLnJlcG9ydCgKICAgICAgICAgIHRlbXBsYXRlRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzCiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZXh0ZW5kZWQubmFtZSksCiAgICAgICAgICBrbGFzcy5maWxlT2Zmc2V0LAogICAgICAgICAgMSwKICAgICAgICAgIGtsYXNzLmxvY2F0aW9uLmZpbGUpOwogICAgICB0aHJvdyBfRmZpU3RhdGljVHlwZUVycm9yKCk7CiAgICB9CiAgfQp9CgovLy8gVXNlZCBpbnRlcm5hbGx5IGZvciBhYm5vcm1hbCBjb250cm9sIGZsb3cgdG8gcHJldmVudCBjYXNjYWRpbmcgZXJyb3IKLy8vIG1lc3NhZ2VzLgpjbGFzcyBfRmZpU3RhdGljVHlwZUVycm9yIGltcGxlbWVudHMgRXhjZXB0aW9uIHt9CoHWAE5OPAEqATQJKSQlLjAzHiAhASJCKT4zRS8BEkYBRRkZGR4dKyQtOyxADAQyDRERGhomJy8CAUU2Ly8oARo5JgFIDxkBGhobIC0tHBw/IwEMKBtDFyUEAQwbCjYlH05GLiUGBAEMGzspHxMEAQwnOy8fEwQBDCM7LR8TBAEMJyIBSiBKBgERBAEMJyIBSiAaRwYBEQQBDDEnAScKKjNRPkoBJwFCMkEBLTAzQiYdATI1NidGUSETJRkMRxFLFDYnRFEhEyUZDAFNAUtBNDtGQjkZDAEqMjpBRzkZDAEmQwFAOSdGUS4TMhkMCisIH05GLgYBEQQBT1AFTVBPBUBOUEA9JgdLAT48AScnEFAIATZDATBNBAFRQAVFMCwFHQVGSwVPODsuSEgkHUUnKhhQGCERGBcpSyYlHQQBDDEnATAKRFBOSywzUTsBMkEtLzslPUkBMzJBASk8NE0uSxolPUkvMBcKSzQrIk4NIyRHKgoIH05GLgYBEQQBOk8EASQ/JCs/MzkzDgYfT0AZCx0hBAFEJEUhMEIbDR8jBgQBS0ZLSgQBMjtMDgYfShkLHSEEATc5AVEVTTwGAS8xNBkKCAYRBAE/QxwhNC0cDSAjBgQCAUkOMgEtcGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvZmZpX3VzZV9zaXRlcy5kYXJ0YWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L25hdGl2ZV9jb2RlLmRhcnSjSS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gSGFuZGxpbmcgb2YgbmF0aXZlIGNvZGUgYW5kIGVudHJ5IHBvaW50cy4KbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMudHlwZV9mbG93Lm5hdGl2ZV9jb2RlOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2xpYnJhcnlfaW5kZXguZGFydCcgc2hvdyBMaWJyYXJ5SW5kZXg7CgppbXBvcnQgJ2NhbGxzLmRhcnQnOwppbXBvcnQgJ3R5cGVzLmRhcnQnOwppbXBvcnQgJ3V0aWxzLmRhcnQnOwppbXBvcnQgJy4uL3ByYWdtYS5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEVudHJ5UG9pbnRzTGlzdGVuZXIgewogIC8vLyBBZGQgY2FsbCBieSB0aGUgZ2l2ZW4gc2VsZWN0b3Igd2l0aCBhcmJpdHJhcnkgKCdyYXcnKSBhcmd1bWVudHMuCiAgdm9pZCBhZGRSYXdDYWxsKFNlbGVjdG9yIHNlbGVjdG9yKTsKCiAgLy8vIFNldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIGZpZWxkLgogIHZvaWQgYWRkRGlyZWN0RmllbGRBY2Nlc3MoRmllbGQgZmllbGQsIFR5cGUgdmFsdWUpOwoKICAvLy8gQWRkIGluc3RhbnRpYXRpb24gb2YgdGhlIGdpdmVuIGNsYXNzLgogIENvbmNyZXRlVHlwZSBhZGRBbGxvY2F0ZWRDbGFzcyhDbGFzcyBjKTsKCiAgLy8vIFJlY29yZCB0aGUgZmFjdCB0aGF0IGdpdmVuIG1lbWJlciBpcyBjYWxsZWQgdmlhIGludGVyZmFjZSBzZWxlY3RvcgogIC8vLyAobm90IGR5bmFtaWNhbGx5LCBhbmQgbm90IGZyb20gYHRoaXNgKS4KICB2b2lkIHJlY29yZE1lbWJlckNhbGxlZFZpYUludGVyZmFjZVNlbGVjdG9yKE1lbWJlciB0YXJnZXQpOwoKICAvLy8gUmVjb3JkIHRoZSBmYWN0IHRoYXQgZ2l2ZW4gbWVtYmVyIGlzIGNhbGxlZCBmcm9tIHRoaXMuCiAgdm9pZCByZWNvcmRNZW1iZXJDYWxsZWRWaWFUaGlzKE1lbWJlciB0YXJnZXQpOwp9CgpjbGFzcyBQcmFnbWFFbnRyeVBvaW50c1Zpc2l0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yIHsKICBmaW5hbCBFbnRyeVBvaW50c0xpc3RlbmVyIGVudHJ5UG9pbnRzOwogIGZpbmFsIE5hdGl2ZUNvZGVPcmFjbGUgbmF0aXZlQ29kZU9yYWNsZTsKICBmaW5hbCBQcmFnbWFBbm5vdGF0aW9uUGFyc2VyIG1hdGNoZXI7CiAgQ2xhc3MgY3VycmVudENsYXNzID0gbnVsbDsKCiAgUHJhZ21hRW50cnlQb2ludHNWaXNpdG9yKAogICAgICB0aGlzLmVudHJ5UG9pbnRzLCB0aGlzLm5hdGl2ZUNvZGVPcmFjbGUsIHRoaXMubWF0Y2hlcikgewogICAgYXNzZXJ0eChtYXRjaGVyICE9IG51bGwpOwogIH0KCiAgUHJhZ21hRW50cnlQb2ludFR5cGUgX2Fubm90YXRpb25zRGVmaW5lUm9vdChMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBmb3IgKHZhciBhbm5vdGF0aW9uIGluIGFubm90YXRpb25zKSB7CiAgICAgIFBhcnNlZFByYWdtYSBwcmFnbWEgPSBtYXRjaGVyLnBhcnNlUHJhZ21hKGFubm90YXRpb24pOwogICAgICBpZiAocHJhZ21hID09IG51bGwpIGNvbnRpbnVlOwogICAgICBpZiAocHJhZ21hIGlzIFBhcnNlZEVudHJ5UG9pbnRQcmFnbWEpIHJldHVybiBwcmFnbWEudHlwZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDbGFzcyhDbGFzcyBrbGFzcykgewogICAgZmluYWwgdHlwZSA9IF9hbm5vdGF0aW9uc0RlZmluZVJvb3Qoa2xhc3MuYW5ub3RhdGlvbnMpOwogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICBpZiAodHlwZSAhPSBQcmFnbWFFbnRyeVBvaW50VHlwZS5EZWZhdWx0KSB7CiAgICAgICAgdGhyb3cgIkVycm9yOiBwcmFnbWEgZW50cnktcG9pbnQgZGVmaW5pdGlvbiBvbiBhIGNsYXNzIG11c3QgZXZhbHVhdGUgIgogICAgICAgICAgICAidG8gbnVsbCwgdHJ1ZSBvciBmYWxzZS4gU2VlIGVudHJ5X3BvaW50c19wcmFnbWEubWQuIjsKICAgICAgfQogICAgICBpZiAoIWtsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgICBlbnRyeVBvaW50cy5hZGRBbGxvY2F0ZWRDbGFzcyhrbGFzcyk7CiAgICAgIH0KICAgICAgbmF0aXZlQ29kZU9yYWNsZS5hZGRDbGFzc1JlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZShrbGFzcyk7CiAgICB9CiAgICBjdXJyZW50Q2xhc3MgPSBrbGFzczsKICAgIGtsYXNzLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgcHJvYykgewogICAgdmFyIHR5cGUgPSBfYW5ub3RhdGlvbnNEZWZpbmVSb290KHByb2MuYW5ub3RhdGlvbnMpOwogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICB2b2lkIGFkZFNlbGVjdG9yKENhbGxLaW5kIGNrKSB7CiAgICAgICAgZW50cnlQb2ludHMuYWRkUmF3Q2FsbChwcm9jLmlzSW5zdGFuY2VNZW1iZXIKICAgICAgICAgICAgPyBuZXcgSW50ZXJmYWNlU2VsZWN0b3IocHJvYywgY2FsbEtpbmQ6IGNrKQogICAgICAgICAgICA6IG5ldyBEaXJlY3RTZWxlY3Rvcihwcm9jLCBjYWxsS2luZDogY2spKTsKICAgICAgfQoKICAgICAgZmluYWwgZGVmYXVsdENhbGxLaW5kID0gcHJvYy5pc0dldHRlcgogICAgICAgICAgPyBDYWxsS2luZC5Qcm9wZXJ0eUdldAogICAgICAgICAgOiAocHJvYy5pc1NldHRlciA/IENhbGxLaW5kLlByb3BlcnR5U2V0IDogQ2FsbEtpbmQuTWV0aG9kKTsKCiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgUHJhZ21hRW50cnlQb2ludFR5cGUuQ2FsbE9ubHk6CiAgICAgICAgICBhZGRTZWxlY3RvcihkZWZhdWx0Q2FsbEtpbmQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQcmFnbWFFbnRyeVBvaW50VHlwZS5TZXR0ZXJPbmx5OgogICAgICAgICAgaWYgKCFwcm9jLmlzU2V0dGVyKSB7CiAgICAgICAgICAgIHRocm93ICJFcnJvcjogY2Fubm90IGdlbmVyYXRlIGEgc2V0dGVyIGZvciBhIG1ldGhvZCBvciBnZXR0ZXIgKCRwcm9jKS4iOwogICAgICAgICAgfQogICAgICAgICAgYWRkU2VsZWN0b3IoQ2FsbEtpbmQuUHJvcGVydHlTZXQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQcmFnbWFFbnRyeVBvaW50VHlwZS5HZXR0ZXJPbmx5OgogICAgICAgICAgaWYgKHByb2MuaXNTZXR0ZXIpIHsKICAgICAgICAgICAgdGhyb3cgIkVycm9yOiBjYW5ub3QgY2xvc3VyaXplIGEgc2V0dGVyICgkcHJvYykuIjsKICAgICAgICAgIH0KICAgICAgICAgIGFkZFNlbGVjdG9yKENhbGxLaW5kLlByb3BlcnR5R2V0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUHJhZ21hRW50cnlQb2ludFR5cGUuRGVmYXVsdDoKICAgICAgICAgIGFkZFNlbGVjdG9yKGRlZmF1bHRDYWxsS2luZCk7CiAgICAgICAgICBpZiAoIXByb2MuaXNTZXR0ZXIgJiYgIXByb2MuaXNHZXR0ZXIpIHsKICAgICAgICAgICAgYWRkU2VsZWN0b3IoQ2FsbEtpbmQuUHJvcGVydHlHZXQpOwogICAgICAgICAgfQogICAgICB9CgogICAgICBuYXRpdmVDb2RlT3JhY2xlLnNldE1lbWJlclJlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZShwcm9jKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3IgY3RvcikgewogICAgdmFyIHR5cGUgPSBfYW5ub3RhdGlvbnNEZWZpbmVSb290KGN0b3IuYW5ub3RhdGlvbnMpOwogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICBpZiAodHlwZSAhPSBQcmFnbWFFbnRyeVBvaW50VHlwZS5EZWZhdWx0ICYmCiAgICAgICAgICB0eXBlICE9IFByYWdtYUVudHJ5UG9pbnRUeXBlLkNhbGxPbmx5KSB7CiAgICAgICAgdGhyb3cgIkVycm9yOiBwcmFnbWEgZW50cnktcG9pbnQgZGVmaW5pdGlvbiBvbiBhIGNvbnN0cnVjdG9yICgkY3RvcikgbXVzdCIKICAgICAgICAgICAgImV2YWx1YXRlIHRvIG51bGwsIHRydWUsIGZhbHNlIG9yICdjYWxsJy4gU2VlIGVudHJ5X3BvaW50c19wcmFnbWEubWQuIjsKICAgICAgfQogICAgICBlbnRyeVBvaW50cwogICAgICAgICAgLmFkZFJhd0NhbGwobmV3IERpcmVjdFNlbGVjdG9yKGN0b3IsIGNhbGxLaW5kOiBDYWxsS2luZC5NZXRob2QpKTsKICAgICAgZW50cnlQb2ludHMuYWRkQWxsb2NhdGVkQ2xhc3MoY3VycmVudENsYXNzKTsKICAgICAgbmF0aXZlQ29kZU9yYWNsZS5zZXRNZW1iZXJSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoY3Rvcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZpZWxkKEZpZWxkIGZpZWxkKSB7CiAgICB2YXIgdHlwZSA9IF9hbm5vdGF0aW9uc0RlZmluZVJvb3QoZmllbGQuYW5ub3RhdGlvbnMpOwogICAgaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZvaWQgYWRkU2VsZWN0b3IoQ2FsbEtpbmQgY2spIHsKICAgICAgZW50cnlQb2ludHMuYWRkUmF3Q2FsbChmaWVsZC5pc0luc3RhbmNlTWVtYmVyCiAgICAgICAgICA/IG5ldyBJbnRlcmZhY2VTZWxlY3RvcihmaWVsZCwgY2FsbEtpbmQ6IGNrKQogICAgICAgICAgOiBuZXcgRGlyZWN0U2VsZWN0b3IoZmllbGQsIGNhbGxLaW5kOiBjaykpOwogICAgfQoKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIFByYWdtYUVudHJ5UG9pbnRUeXBlLkdldHRlck9ubHk6CiAgICAgICAgYWRkU2VsZWN0b3IoQ2FsbEtpbmQuUHJvcGVydHlHZXQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFByYWdtYUVudHJ5UG9pbnRUeXBlLlNldHRlck9ubHk6CiAgICAgICAgaWYgKGZpZWxkLmlzRmluYWwpIHsKICAgICAgICAgIHRocm93ICJFcnJvcjogY2FuJ3QgdXNlICdzZXQnIGluIGVudHJ5LXBvaW50IHByYWdtYSBmb3IgZmluYWwgZmllbGQgIgogICAgICAgICAgICAgICIkZmllbGQiOwogICAgICAgIH0KICAgICAgICBhZGRTZWxlY3RvcihDYWxsS2luZC5Qcm9wZXJ0eVNldCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUHJhZ21hRW50cnlQb2ludFR5cGUuRGVmYXVsdDoKICAgICAgICBhZGRTZWxlY3RvcihDYWxsS2luZC5Qcm9wZXJ0eUdldCk7CiAgICAgICAgaWYgKCFmaWVsZC5pc0ZpbmFsKSB7CiAgICAgICAgICBhZGRTZWxlY3RvcihDYWxsS2luZC5Qcm9wZXJ0eVNldCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFByYWdtYUVudHJ5UG9pbnRUeXBlLkNhbGxPbmx5OgogICAgICAgIHRocm93ICJFcnJvcjogY2FuJ3QgZ2VuZXJhdGUgaW52b2NhdGlvbiBkaXNwYXRjaGVyIGZvciBmaWVsZCAkZmllbGQiCiAgICAgICAgICAgICJ0aHJvdWdoIEBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykiOwogICAgfQoKICAgIG5hdGl2ZUNvZGVPcmFjbGUuc2V0TWVtYmVyUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlKGZpZWxkKTsKICB9Cn0KCi8vLyBQcm92aWRlcyBpbnNpZ2h0cyBpbnRvIHRoZSBiZWhhdmlvciBvZiBuYXRpdmUgY29kZS4KY2xhc3MgTmF0aXZlQ29kZU9yYWNsZSB7CiAgZmluYWwgTGlicmFyeUluZGV4IF9saWJyYXJ5SW5kZXg7CiAgZmluYWwgU2V0PE1lbWJlcj4gX21lbWJlcnNSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUgPSBuZXcgU2V0PE1lbWJlcj4oKTsKICBmaW5hbCBTZXQ8Q2xhc3M+IF9jbGFzc2VzUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlID0gbmV3IFNldDxDbGFzcz4oKTsKICBmaW5hbCBQcmFnbWFBbm5vdGF0aW9uUGFyc2VyIF9tYXRjaGVyOwoKICBOYXRpdmVDb2RlT3JhY2xlKHRoaXMuX2xpYnJhcnlJbmRleCwgdGhpcy5fbWF0Y2hlcikgewogICAgYXNzZXJ0eChfbWF0Y2hlciAhPSBudWxsKTsKICB9CgogIHZvaWQgYWRkQ2xhc3NSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoQ2xhc3Mga2xhc3MpIHsKICAgIF9jbGFzc2VzUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlLmFkZChrbGFzcyk7CiAgfQoKICBib29sIGlzQ2xhc3NSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoQ2xhc3Mga2xhc3MpID0+CiAgICAgIF9jbGFzc2VzUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlLmNvbnRhaW5zKGtsYXNzKTsKCiAgdm9pZCBzZXRNZW1iZXJSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUoTWVtYmVyIG1lbWJlcikgewogICAgX21lbWJlcnNSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGUuYWRkKG1lbWJlcik7CiAgfQoKICBib29sIGlzTWVtYmVyUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlKE1lbWJlciBtZW1iZXIpID0+CiAgICAgIF9tZW1iZXJzUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlLmNvbnRhaW5zKG1lbWJlcik7CgogIC8vLyBTaW11bGF0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgbmF0aXZlIG1ldGhvZCBieSBhZGRpbmcgaXRzIGVudHJ5IHBvaW50cwogIC8vLyB1c2luZyBbZW50cnlQb2ludHNMaXN0ZW5lcl0uIFJldHVybnMgcmVzdWx0IHR5cGUgb2YgdGhlIG5hdGl2ZSBtZXRob2QuCiAgVHlwZUV4cHIgaGFuZGxlTmF0aXZlUHJvY2VkdXJlKAogICAgICBNZW1iZXIgbWVtYmVyLAogICAgICBFbnRyeVBvaW50c0xpc3RlbmVyIGVudHJ5UG9pbnRzTGlzdGVuZXIsCiAgICAgIFR5cGVzQnVpbGRlciB0eXBlc0J1aWxkZXIsCiAgICAgIFJ1bnRpbWVUeXBlVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7CiAgICBUeXBlRXhwciByZXR1cm5UeXBlID0gbnVsbDsKICAgIGJvb2wgbnVsbGFibGUgPSBudWxsOwoKICAgIGZvciAodmFyIGFubm90YXRpb24gaW4gbWVtYmVyLmFubm90YXRpb25zKSB7CiAgICAgIFBhcnNlZFByYWdtYSBwcmFnbWEgPSBfbWF0Y2hlci5wYXJzZVByYWdtYShhbm5vdGF0aW9uKTsKICAgICAgaWYgKHByYWdtYSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgaWYgKHByYWdtYSBpcyBQYXJzZWRSZXN1bHRUeXBlQnlUeXBlUHJhZ21hIHx8CiAgICAgICAgICBwcmFnbWEgaXMgUGFyc2VkUmVzdWx0VHlwZUJ5UGF0aFByYWdtYSB8fAogICAgICAgICAgcHJhZ21hIGlzIFBhcnNlZE5vbk51bGxhYmxlUmVzdWx0VHlwZSkgewogICAgICAgIC8vIFdlIGNhbiBvbmx5IHVzZSB0aGUgJ3ZtOmV4YWN0LXJlc3VsdC10eXBlJyBwcmFnbWEgb24gbWV0aG9kcyBpbiBjb3JlCiAgICAgICAgLy8gbGlicmFyaWVzIGZvciBzYWZldHkgcmVhc29ucy4gU2VlICdyZXN1bHRfdHlwZV9wcmFnbWEubWQnLCBkZXRhaWwgMS4yCiAgICAgICAgLy8gZm9yIGV4cGxhbmF0aW9uLgogICAgICAgIGlmIChtZW1iZXIuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lICE9ICJkYXJ0IikgewogICAgICAgICAgdGhyb3cgIkVSUk9SOiBDYW5ub3QgdXNlICRrRXhhY3RSZXN1bHRUeXBlUHJhZ21hTmFtZSAiCiAgICAgICAgICAgICAgIm91dHNpZGUgY29yZSBsaWJyYXJpZXMuIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHByYWdtYSBpcyBQYXJzZWRSZXN1bHRUeXBlQnlUeXBlUHJhZ21hKSB7CiAgICAgICAgdmFyIHR5cGUgPSBwcmFnbWEudHlwZTsKICAgICAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICByZXR1cm5UeXBlID0gZW50cnlQb2ludHNMaXN0ZW5lci5hZGRBbGxvY2F0ZWRDbGFzcyh0eXBlLmNsYXNzTm9kZSk7CiAgICAgICAgICBpZiAocHJhZ21hLnJlc3VsdFR5cGVVc2VzUGFzc2VkVHlwZUFyZ3VtZW50cykgewogICAgICAgICAgICByZXR1cm5UeXBlID0gdHJhbnNsYXRvci5pbnN0YW50aWF0ZUNvbmNyZXRlVHlwZSgKICAgICAgICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICAgICAgICBtZW1iZXIuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAubWFwKCh0KSA9PiBUeXBlUGFyYW1ldGVyVHlwZSh0LCBOdWxsYWJpbGl0eS5sZWdhY3kpKQogICAgICAgICAgICAgICAgICAgIC50b0xpc3QoKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgIkVSUk9SOiBJbnZhbGlkIHJldHVybiB0eXBlIGZvciBuYXRpdmUgbWV0aG9kOiAke3ByYWdtYS50eXBlfSI7CiAgICAgIH0gZWxzZSBpZiAocHJhZ21hIGlzIFBhcnNlZFJlc3VsdFR5cGVCeVBhdGhQcmFnbWEpIHsKICAgICAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBwcmFnbWEucGF0aC5zcGxpdCgiIyIpOwogICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gMikgewogICAgICAgICAgdGhyb3cgIkVSUk9SOiBDb3VsZCBub3QgcGFyc2UgbmF0aXZlIG1ldGhvZCByZXR1cm4gdHlwZTogJHtwcmFnbWEucGF0aH0iOwogICAgICAgIH0KCiAgICAgICAgU3RyaW5nIGxpYk5hbWUgPSBwYXJ0c1swXTsKICAgICAgICBTdHJpbmcga2xhc3NOYW1lID0gcGFydHNbMV07CgogICAgICAgIC8vIEVycm9yIGlzIHRocm93biBvbiB0aGUgbmV4dCBsaW5lIGlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQuCiAgICAgICAgQ2xhc3Mga2xhc3MgPSBfbGlicmFyeUluZGV4LmdldENsYXNzKGxpYk5hbWUsIGtsYXNzTmFtZSk7CiAgICAgICAgVHlwZSBjb25jcmV0ZUNsYXNzID0gZW50cnlQb2ludHNMaXN0ZW5lci5hZGRBbGxvY2F0ZWRDbGFzcyhrbGFzcyk7CiAgICAgICAgcmV0dXJuVHlwZSA9IGNvbmNyZXRlQ2xhc3M7CiAgICAgIH0gZWxzZSBpZiAocHJhZ21hIGlzIFBhcnNlZE5vbk51bGxhYmxlUmVzdWx0VHlwZSkgewogICAgICAgIG51bGxhYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocmV0dXJuVHlwZSAhPSBudWxsICYmIG51bGxhYmxlICE9IG51bGwpIHsKICAgICAgdGhyb3cgJ0VSUk9SOiBDYW5ub3QgaGF2ZSBib3RoLCBAcHJhZ21hKCIka0V4YWN0UmVzdWx0VHlwZVByYWdtYU5hbWUiKSAnCiAgICAgICAgICAnYW5kIEBwcmFnbWEoIiRrTm9uTnVsbGFibGVSZXN1bHRUeXBlIiksIGFubm90YXRpbmcgdGhlIHNhbWUgbWVtYmVyLic7CiAgICB9CgogICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICByZXR1cm4gcmV0dXJuVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0eXBlc0J1aWxkZXIuZnJvbVN0YXRpY1R5cGUoCiAgICAgICAgICBtZW1iZXIuZnVuY3Rpb24ucmV0dXJuVHlwZSwgbnVsbGFibGUgPz8gdHJ1ZSk7CiAgICB9CiAgfQp9CoEGAE5OPAEuMgEeASI+ARUVFRkBJUcmASg2ASwrAUkuPgE9MQIBOikrKB0BHD8eBAFOKj0kQAYRBAEMHDwYMk9DCB8uCEAGGh8EAQwjORgmNTg3CAEsIUYBFiwoES4gVQwtES4fPwwtESsoMi8MCAFABgQBDCc5GDIzU1QIEkwzQAYEAQwcOh4BJDQ3NgYBFCwrDywdUBgKKw8pKx4tCg8qTTEGAT8EAgE4GSRKSCkBOB8EATcxBAE3OAE6MgQBOjkBS00iFS8hKiAaATE+JDQ0M1BRHEJBKQoINCAlTjo9HC9KIAwUCk47NSFUCgEjJQFHQkskOhoIBgEyT1EGAR4ZDSo5BgQCATVwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvbmF0aXZlX2NvZGUuZGFydGdmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9zdW1tYXJ5X2NvbGxlY3Rvci5kYXJ0wAEw4y8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQ3JlYXRpb24gb2YgdHlwZSBmbG93IHN1bW1hcmllcyBvdXQgb2Yga2VybmVsIEFTVC4KbGlicmFyeSB2bS50cmFuc2Zvcm1hdGlvbnMudHlwZV9mbG93LnN1bW1hcnlfY29sbGVjdG9yOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgU3RhdGVtZW50LCBTdGF0ZW1lbnRWaXNpdG9yOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyBhc3Qgc2hvdyBTdGF0ZW1lbnQsIFN0YXRlbWVudFZpc2l0b3I7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnCiAgICBzaG93IENsYXNzSGllcmFyY2h5LCBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcKICAgIHNob3cgU3RhdGljVHlwZUNvbnRleHQsIFN1YnR5cGVDaGVja01vZGUsIFR5cGVFbnZpcm9ubWVudDsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ2NhbGxzLmRhcnQnOwppbXBvcnQgJ25hdGl2ZV9jb2RlLmRhcnQnOwppbXBvcnQgJ3N1bW1hcnkuZGFydCc7CmltcG9ydCAndHlwZXMuZGFydCc7CmltcG9ydCAndXRpbHMuZGFydCc7CgovLy8gU3VtbWFyeSBjb2xsZWN0b3IgcmVsaWVzIG9uIGVpdGhlciBmdWxsIG9yIHBhcnRpYWwgbWl4aW4gcmVzb2x1dGlvbi4KLy8vIEN1cnJlbnRseSBWbVRhcmdldC5wZXJmb3JtTW9kdWxhclRyYW5zZm9ybWF0aW9uc09uTGlicmFyaWVzIHBlcmZvcm1zCi8vLyBwYXJ0aWFsIG1peGluIHJlc29sdXRpb24uCmNvbnN0IGJvb2wga1BhcnRpYWxNaXhpblJlc29sdXRpb24gPSB0cnVlOwoKLy8vIE5vcm1hbGl6ZXMgYW5kIG9wdGltaXplcyBzdW1tYXJ5IGFmdGVyIGl0IGlzIGNyZWF0ZWQuCi8vLyBNb3JlIHNwZWNpZmljYWxseToKLy8vICogQnJlYWtzIGxvb3BzIGJldHdlZW4gc3RhdGVtZW50cy4KLy8vICogUmVtb3ZlcyB1bnVzZWQgc3RhdGVtZW50cyAoZXhjZXB0IHBhcmFtZXRlcnMgYW5kIGNhbGxzKS4KLy8vICogRWxpbWluYXRlcyBqb2lucyB3aXRoIGEgc2luZ2xlIGlucHV0LgpjbGFzcyBfU3VtbWFyeU5vcm1hbGl6ZXIgZXh0ZW5kcyBTdGF0ZW1lbnRWaXNpdG9yIHsKICBmaW5hbCBTdW1tYXJ5IF9zdW1tYXJ5OwogIGZpbmFsIFR5cGVzQnVpbGRlciBfdHlwZXNCdWlsZGVyOwogIFNldDxTdGF0ZW1lbnQ+IF9wcm9jZXNzZWQgPSBuZXcgU2V0PFN0YXRlbWVudD4oKTsKICBTZXQ8U3RhdGVtZW50PiBfcGVuZGluZyA9IG5ldyBTZXQ8U3RhdGVtZW50PigpOwogIGJvb2wgX2luTG9vcCA9IGZhbHNlOwoKICBfU3VtbWFyeU5vcm1hbGl6ZXIodGhpcy5fc3VtbWFyeSwgdGhpcy5fdHlwZXNCdWlsZGVyKTsKCiAgdm9pZCBub3JtYWxpemUoKSB7CiAgICBmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IF9zdW1tYXJ5LnN0YXRlbWVudHM7CiAgICBfc3VtbWFyeS5yZXNldCgpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3N1bW1hcnkucG9zaXRpb25hbFBhcmFtZXRlckNvdW50OyBpKyspIHsKICAgICAgX3Byb2Nlc3NlZC5hZGQoc3RhdGVtZW50c1tpXSk7CiAgICAgIF9zdW1tYXJ5LmFkZChzdGF0ZW1lbnRzW2ldKTsKICAgIH0KCiAgICAvLyBTb3J0IG5hbWVkIHBhcmFtZXRlcnMuCiAgICAvLyBUT0RPKGRhcnRidWcuY29tLzMyMjkyKTogbWFrZSBzdXJlIHBhcmFtZXRlcnMgYXJlIHNvcnRlZCBpbiBrZXJuZWwgQVNUCiAgICAvLyBhbmQgcmVtb3ZlIHRoaXMgc29ydGluZy4KICAgIGlmIChfc3VtbWFyeS5wb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQgPCBfc3VtbWFyeS5wYXJhbWV0ZXJDb3VudCkgewogICAgICBMaXN0PFN0YXRlbWVudD4gbmFtZWRQYXJhbXMgPSBzdGF0ZW1lbnRzLnN1Ymxpc3QoCiAgICAgICAgICBfc3VtbWFyeS5wb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQsIF9zdW1tYXJ5LnBhcmFtZXRlckNvdW50KTsKICAgICAgbmFtZWRQYXJhbXMuc29ydCgoU3RhdGVtZW50IHMxLCBTdGF0ZW1lbnQgczIpID0+CiAgICAgICAgICAoczEgYXMgUGFyYW1ldGVyKS5uYW1lLmNvbXBhcmVUbygoczIgYXMgUGFyYW1ldGVyKS5uYW1lKSk7CiAgICAgIG5hbWVkUGFyYW1zLmZvckVhY2goKFN0YXRlbWVudCBzdCkgewogICAgICAgIF9wcm9jZXNzZWQuYWRkKHN0KTsKICAgICAgICBfc3VtbWFyeS5hZGQoc3QpOwogICAgICB9KTsKICAgIH0KCiAgICBmb3IgKFN0YXRlbWVudCBzdCBpbiBzdGF0ZW1lbnRzKSB7CiAgICAgIGlmIChzdCBpcyBDYWxsIHx8IHN0IGlzIFR5cGVDaGVjaykgewogICAgICAgIF9ub3JtYWxpemVFeHByKHN0LCBmYWxzZSk7CiAgICAgIH0gZWxzZSBpZiAoc3QgaXMgVXNlKSB7CiAgICAgICAgX25vcm1hbGl6ZUV4cHIoc3QuYXJnLCB0cnVlKTsKICAgICAgfQogICAgfQoKICAgIF9zdW1tYXJ5LnJlc3VsdCA9IF9ub3JtYWxpemVFeHByKF9zdW1tYXJ5LnJlc3VsdCwgdHJ1ZSk7CiAgfQoKICBUeXBlRXhwciBfbm9ybWFsaXplRXhwcihUeXBlRXhwciBzdCwgYm9vbCBpc1Jlc3VsdFVzZWQpIHsKICAgIGFzc2VydHgoIV9pbkxvb3ApOwogICAgYXNzZXJ0eChzdCBpcyEgVXNlKTsKICAgIGlmIChzdCBpcyBTdGF0ZW1lbnQpIHsKICAgICAgaWYgKGlzUmVzdWx0VXNlZCAmJiAoc3QgaXMgQ2FsbCkpIHsKICAgICAgICBzdC5zZXRSZXN1bHRVc2VkKCk7CiAgICAgIH0KICAgICAgaWYgKF9wcm9jZXNzZWQuY29udGFpbnMoc3QpKSB7CiAgICAgICAgcmV0dXJuIHN0OwogICAgICB9CiAgICAgIGlmIChfcGVuZGluZy5hZGQoc3QpKSB7CiAgICAgICAgc3QuYWNjZXB0KHRoaXMpOwogICAgICAgIF9wZW5kaW5nLnJlbW92ZShzdCk7CgogICAgICAgIGlmIChfaW5Mb29wKSB7CiAgICAgICAgICByZXR1cm4gX2hhbmRsZUxvb3Aoc3QpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0IGlzIEpvaW4pIHsKICAgICAgICAgIGZpbmFsIG4gPSBzdC52YWx1ZXMubGVuZ3RoOwogICAgICAgICAgaWYgKG4gPT0gMCkgewogICAgICAgICAgICByZXR1cm4gY29uc3QgRW1wdHlUeXBlKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMSkgewogICAgICAgICAgICByZXR1cm4gc3QudmFsdWVzLnNpbmdsZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZpbmFsIGZpcnN0ID0gc3QudmFsdWVzLmZpcnN0OwogICAgICAgICAgICBpZiAoZmlyc3QgaXMgVHlwZSkgewogICAgICAgICAgICAgIGJvb2wgYWxsTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgIT0gc3QudmFsdWVzW2ldKSB7CiAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0IGlzIE5hcnJvdykgewogICAgICAgICAgLy8gVGhpcyBwYXR0ZXJuIG1heSBhcHBlYXIgYWZ0ZXIgYXBwcm94aW1hdGlvbnMgZHVyaW5nIHN1bW1hcnkKICAgICAgICAgIC8vIG5vcm1hbGl6YXRpb24gKHNvIGl0J3Mgbm90IGVub3VnaCB0byBoYW5kbGUgaXQgaW4gX21ha2VOYXJyb3cpLgogICAgICAgICAgZmluYWwgYXJnID0gc3QuYXJnOwogICAgICAgICAgaWYgKGFyZyBpcyBUeXBlICYmIHN0LnR5cGUgPT0gY29uc3QgQW55VHlwZSgpKSB7CiAgICAgICAgICAgIHJldHVybiAoYXJnIGlzIE51bGxhYmxlVHlwZSkgPyBhcmcuYmFzZVR5cGUgOiBhcmc7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBfcHJvY2Vzc2VkLmFkZChzdCk7CiAgICAgICAgX3N1bW1hcnkuYWRkKHN0KTsKICAgICAgICByZXR1cm4gc3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQ3ljbGljIGV4cHJlc3Npb24uCiAgICAgICAgcmV0dXJuIF9oYW5kbGVMb29wKHN0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0eChzdCBpcyBUeXBlKTsKICAgICAgcmV0dXJuIHN0OwogICAgfQogIH0KCiAgVHlwZUV4cHIgX2hhbmRsZUxvb3AoU3RhdGVtZW50IHN0KSB7CiAgICBpZiAoc3QgaXMgSm9pbikgewogICAgICAvLyBBcHByb3hpbWF0ZSBKb2luIHdpdGggc3RhdGljIHR5cGUuCiAgICAgIF9pbkxvb3AgPSBmYWxzZTsKICAgICAgZGVidWdQcmludCgiQXBwcm94aW1hdGVkICR7c3R9IHdpdGggJHtzdC5zdGF0aWNUeXBlfSIpOwogICAgICBTdGF0aXN0aWNzLmpvaW5zQXBwcm94aW1hdGVkVG9CcmVha0xvb3BzKys7CiAgICAgIHJldHVybiBfdHlwZXNCdWlsZGVyLmZyb21TdGF0aWNUeXBlKHN0LnN0YXRpY1R5cGUsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gU3RlcCBiYWNrIHVudGlsIEpvaW4gaXMgZm91bmQuCiAgICAgIF9pbkxvb3AgPSB0cnVlOwogICAgICByZXR1cm4gc3Q7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFycm93KE5hcnJvdyBleHByKSB7CiAgICBleHByLmFyZyA9IF9ub3JtYWxpemVFeHByKGV4cHIuYXJnLCB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRKb2luKEpvaW4gZXhwcikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHByLnZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBleHByLnZhbHVlc1tpXSA9IF9ub3JtYWxpemVFeHByKGV4cHIudmFsdWVzW2ldLCB0cnVlKTsKCiAgICAgIGlmIChfaW5Mb29wKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VXNlKFVzZSBleHByKSB7CiAgICB0aHJvdyAnXCdVc2VcJyBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkOiAkZXhwcic7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2FsbChDYWxsIGV4cHIpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwci5hcmdzLnZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICBleHByLmFyZ3MudmFsdWVzW2ldID0gX25vcm1hbGl6ZUV4cHIoZXhwci5hcmdzLnZhbHVlc1tpXSwgdHJ1ZSk7CgogICAgICBpZiAoX2luTG9vcCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENyZWF0ZUNvbmNyZXRlVHlwZShDcmVhdGVDb25jcmV0ZVR5cGUgZXhwcikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHByLmZsYXR0ZW5lZFR5cGVBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGV4cHIuZmxhdHRlbmVkVHlwZUFyZ3NbaV0gPQogICAgICAgICAgX25vcm1hbGl6ZUV4cHIoZXhwci5mbGF0dGVuZWRUeXBlQXJnc1tpXSwgdHJ1ZSk7CiAgICAgIGlmIChfaW5Mb29wKSByZXR1cm47CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q3JlYXRlUnVudGltZVR5cGUoQ3JlYXRlUnVudGltZVR5cGUgZXhwcikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHByLmZsYXR0ZW5lZFR5cGVBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGV4cHIuZmxhdHRlbmVkVHlwZUFyZ3NbaV0gPQogICAgICAgICAgX25vcm1hbGl6ZUV4cHIoZXhwci5mbGF0dGVuZWRUeXBlQXJnc1tpXSwgdHJ1ZSk7CiAgICAgIGlmIChfaW5Mb29wKSByZXR1cm47CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUNoZWNrKFR5cGVDaGVjayBleHByKSB7CiAgICBleHByLmFyZyA9IF9ub3JtYWxpemVFeHByKGV4cHIuYXJnLCB0cnVlKTsKICAgIGlmIChfaW5Mb29wKSByZXR1cm47CiAgICBleHByLnR5cGUgPSBfbm9ybWFsaXplRXhwcihleHByLnR5cGUsIHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEV4dHJhY3QoRXh0cmFjdCBleHByKSB7CiAgICBleHByLmFyZyA9IF9ub3JtYWxpemVFeHByKGV4cHIuYXJnLCB0cnVlKTsKICB9Cn0KCi8vLyBEZXRlY3RzIHdoZXRoZXIgdGhlIGNvbnRyb2wgZmxvdyBjYW4gcGFzcyB0aHJvdWdoIHRoZSBmdW5jdGlvbiBib2R5IGFuZAovLy8gcmVhY2ggaXRzIGVuZC4gUmV0dXJucyAnZmFsc2UnIGlmIGl0IGNhbiBwcm92ZSB0aGF0IGNvbnRyb2wgbmV2ZXIgcmVhY2hlcwovLy8gdGhlIGVuZC4gT3RoZXJ3aXNlLCBjb25zZXJ2YXRpdmVseSByZXR1cm5zICd0cnVlJy4KY2xhc3MgX0ZhbGx0aHJvdWdoRGV0ZWN0b3IgZXh0ZW5kcyBhc3QuU3RhdGVtZW50VmlzaXRvcjxib29sPiB7CiAgLy8gVGhpcyBmYWxsdGhyb3VnaCBkZXRlY3RvciBkb2VzIG5vdCBidWlsZCBjb250cm9sIGZsb3cgZ3JhcGggbm9yIGRldGVjdCBpZgogIC8vIGEgZnVuY3Rpb24gaGFzIHVucmVhY2hhYmxlIGNvZGUuIEZvciBzaW1wbGljaXR5LCBpdCBhc3N1bWVzIHRoYXQgYWxsCiAgLy8gc3RhdGVtZW50cyBhcmUgcmVhY2hhYmxlLCBzbyBpdCBqdXN0IGluc3BlY3RzIHRoZSBsYXN0IHN0YXRlbWVudHMgb2YgYQogIC8vIGZ1bmN0aW9uIGFuZCBjaGVja3MgaWYgY29udHJvbCBjYW4gZmFsbCB0aHJvdWdoIHRoZW0gb3Igbm90LgoKICBib29sIGNvbnRyb2xDYW5GYWxsVGhyb3VnaChGdW5jdGlvbk5vZGUgZnVuY3Rpb24pIHsKICAgIHJldHVybiBmdW5jdGlvbi5ib2R5LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdFN0YXRlbWVudChhc3QuU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIHRocm93ICJVbmV4cGVjdGVkIHN0YXRlbWVudCBvZiB0eXBlICR7bm9kZS5ydW50aW1lVHlwZX0iOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpID0+CiAgICAgIChub2RlLmV4cHJlc3Npb24gaXMhIFRocm93KSAmJiAobm9kZS5leHByZXNzaW9uIGlzISBSZXRocm93KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpID0+CiAgICAgIG5vZGUuc3RhdGVtZW50cy5pc0VtcHR5IHx8IG5vZGUuc3RhdGVtZW50cy5sYXN0LmFjY2VwdCh0aGlzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEVtcHR5U3RhdGVtZW50KEVtcHR5U3RhdGVtZW50IG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRGb3JJblN0YXRlbWVudChGb3JJblN0YXRlbWVudCBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0U3dpdGNoU3RhdGVtZW50KFN3aXRjaFN0YXRlbWVudCBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSA9PgogICAgICBub2RlLnRoZW4gPT0gbnVsbCB8fAogICAgICBub2RlLm90aGVyd2lzZSA9PSBudWxsIHx8CiAgICAgIG5vZGUudGhlbi5hY2NlcHQodGhpcykgfHwKICAgICAgbm9kZS5vdGhlcndpc2UuYWNjZXB0KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlKSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUpID0+CiAgICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcykgfHwKICAgICAgbm9kZS5jYXRjaGVzLmFueSgoQ2F0Y2ggY2F0Y2hfKSA9PiBjYXRjaF8uYm9keS5hY2NlcHQodGhpcykpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpID0+CiAgICAgIG5vZGUuYm9keS5hY2NlcHQodGhpcykgJiYgbm9kZS5maW5hbGl6ZXIuYWNjZXB0KHRoaXMpOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpID0+IHRydWU7Cn0KCi8vLyBDb2xsZWN0cyBzZXRzIG9mIGNhcHR1cmVkIHZhcmlhYmxlcywgYXMgd2VsbCBhcyB2YXJpYWJsZXMKLy8vIG1vZGlmaWVkIGluIGxvb3BzIGFuZCB0cnkgYmxvY2tzLgpjbGFzcyBfVmFyaWFibGVzSW5mb0NvbGxlY3RvciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3I8TnVsbD4gewogIC8vLyBNYXBzIGRlY2xhcmVkIHZhcmlhYmxlcyB0byB0aGVpciBkZWNsYXJhdGlvbiBpbmRleC4KICBmaW5hbCBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgaW50PiB2YXJJbmRleCA9IDxWYXJpYWJsZURlY2xhcmF0aW9uLCBpbnQ+e307CgogIC8vLyBWYXJpYWJsZSBkZWNsYXJhdGlvbnMuCiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJEZWNsYXJhdGlvbnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKCiAgLy8vIFNldCBvZiBjYXB0dXJlZCB2YXJpYWJsZXMuCiAgU2V0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGNhcHR1cmVkOwoKICAvLy8gU2V0IG9mIHZhcmlhYmxlcyB3aGljaCB3ZXJlIG1vZGlmaWVkIGZvciBlYWNoIGxvb3AsIHN3aXRjaCBzdGF0ZW1lbnQKICAvLy8gYW5kIHRyeSBibG9jayBzdGF0ZW1lbnQuIERvZXNuJ3QgaW5jbHVkZSBjYXB0dXJlZCB2YXJpYWJsZXMgYW5kCiAgLy8vIHZhcmlhYmxlcyBkZWNsYXJlZCBpbnNpZGUgdGhlIHN0YXRlbWVudCdzIGJvZHkuCiAgZmluYWwgTWFwPGFzdC5TdGF0ZW1lbnQsIFNldDxpbnQ+PiBtb2RpZmllZFNldHMgPSA8YXN0LlN0YXRlbWVudCwgU2V0PGludD4+e307CgogIC8vLyBOdW1iZXIgb2YgdmFyaWFibGVzIGF0IGZ1bmN0aW9uIGVudHJ5LgogIGludCBudW1WYXJpYWJsZXNBdEZ1bmN0aW9uRW50cnkgPSAwOwoKICAvLy8gQWN0aXZlIGxvb3BzLCBzd2l0Y2ggc3RhdGVtZW50cyBhbmQgdHJ5IGJsb2Nrcy4KICBMaXN0PGFzdC5TdGF0ZW1lbnQ+IGFjdGl2ZVN0YXRlbWVudHM7CgogIC8vLyBOdW1iZXIgb2YgdmFyaWFibGVzIGF0IGVudHJ5IG9mIGFjdGl2ZSBzdGF0ZW1lbnRzLgogIExpc3Q8aW50PiBudW1WYXJpYWJsZXNBdEFjdGl2ZVN0YXRlbWVudHM7CgogIF9WYXJpYWJsZXNJbmZvQ29sbGVjdG9yKE1lbWJlciBtZW1iZXIpIHsKICAgIG1lbWJlci5hY2NlcHQodGhpcyk7CiAgfQoKICBpbnQgZ2V0IG51bVZhcmlhYmxlcyA9PiB2YXJEZWNsYXJhdGlvbnMubGVuZ3RoOwoKICBib29sIGlzQ2FwdHVyZWQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgPT4KICAgICAgY2FwdHVyZWQgIT0gbnVsbCAmJiBjYXB0dXJlZC5jb250YWlucyh2YXJpYWJsZSk7CgogIFNldDxpbnQ+IGdldE1vZGlmaWVkVmFyaWFibGVzKGFzdC5TdGF0ZW1lbnQgc3QpIHsKICAgIHJldHVybiBtb2RpZmllZFNldHNbc3RdID8/IGNvbnN0IDxpbnQ+e307CiAgfQoKICB2b2lkIF92aXNpdEZ1bmN0aW9uKExvY2FsRnVuY3Rpb24gbm9kZSkgewogICAgZmluYWwgc2F2ZWRBY3RpdmVTdGF0ZW1lbnRzID0gYWN0aXZlU3RhdGVtZW50czsKICAgIGFjdGl2ZVN0YXRlbWVudHMgPSBudWxsOwogICAgZmluYWwgc2F2ZWROdW1WYXJpYWJsZXNBdEFjdGl2ZVN0YXRlbWVudHMgPSBudW1WYXJpYWJsZXNBdEFjdGl2ZVN0YXRlbWVudHM7CiAgICBudW1WYXJpYWJsZXNBdEFjdGl2ZVN0YXRlbWVudHMgPSBudWxsOwogICAgZmluYWwgc2F2ZWROdW1WYXJpYWJsZXNBdEZ1bmN0aW9uRW50cnkgPSBudW1WYXJpYWJsZXNBdEZ1bmN0aW9uRW50cnk7CiAgICBudW1WYXJpYWJsZXNBdEZ1bmN0aW9uRW50cnkgPSBudW1WYXJpYWJsZXM7CgogICAgbm9kZS5mdW5jdGlvbi5hY2NlcHQodGhpcyk7CgogICAgYWN0aXZlU3RhdGVtZW50cyA9IHNhdmVkQWN0aXZlU3RhdGVtZW50czsKICAgIG51bVZhcmlhYmxlc0F0QWN0aXZlU3RhdGVtZW50cyA9IHNhdmVkTnVtVmFyaWFibGVzQXRBY3RpdmVTdGF0ZW1lbnRzOwogICAgbnVtVmFyaWFibGVzQXRGdW5jdGlvbkVudHJ5ID0gc2F2ZWROdW1WYXJpYWJsZXNBdEZ1bmN0aW9uRW50cnk7CiAgfQoKICBib29sIF9pc0RlY2xhcmVkQmVmb3JlKGludCB2YXJpYWJsZUluZGV4LCBpbnQgZW50cnlEZWNsYXJhdGlvbkNvdW50ZXIpID0+CiAgICAgIHZhcmlhYmxlSW5kZXggPCBlbnRyeURlY2xhcmF0aW9uQ291bnRlcjsKCiAgdm9pZCBfdXNlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgYm9vbCBpc1ZhckFzc2lnbm1lbnQpIHsKICAgIGZpbmFsIGluZGV4ID0gdmFySW5kZXhbdmFyaWFibGVdOwogICAgaWYgKF9pc0RlY2xhcmVkQmVmb3JlKGluZGV4LCBudW1WYXJpYWJsZXNBdEZ1bmN0aW9uRW50cnkpKSB7CiAgICAgIChjYXB0dXJlZCA/Pz0gPFZhcmlhYmxlRGVjbGFyYXRpb24+e30pLmFkZCh2YXJpYWJsZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpc1ZhckFzc2lnbm1lbnQgJiYgYWN0aXZlU3RhdGVtZW50cyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSBhY3RpdmVTdGF0ZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgaWYgKF9pc0RlY2xhcmVkQmVmb3JlKGluZGV4LCBudW1WYXJpYWJsZXNBdEFjdGl2ZVN0YXRlbWVudHNbaV0pKSB7CiAgICAgICAgICBmaW5hbCBzdCA9IGFjdGl2ZVN0YXRlbWVudHNbaV07CiAgICAgICAgICAobW9kaWZpZWRTZXRzW3N0XSA/Pz0gPGludD57fSkuYWRkKGluZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9zdGFydENvbGxlY3RpbmdNb2RpZmllZFZhcmlhYmxlcyhhc3QuU3RhdGVtZW50IG5vZGUpIHsKICAgIChhY3RpdmVTdGF0ZW1lbnRzID8/PSA8YXN0LlN0YXRlbWVudD5bXSkuYWRkKG5vZGUpOwogICAgKG51bVZhcmlhYmxlc0F0QWN0aXZlU3RhdGVtZW50cyA/Pz0gPGludD5bXSkuYWRkKG51bVZhcmlhYmxlcyk7CiAgfQoKICB2b2lkIF9lbmRDb2xsZWN0aW5nTW9kaWZpZWRWYXJpYWJsZXMoKSB7CiAgICBhY3RpdmVTdGF0ZW1lbnRzLnJlbW92ZUxhc3QoKTsKICAgIG51bVZhcmlhYmxlc0F0QWN0aXZlU3RhdGVtZW50cy5yZW1vdmVMYXN0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIC8vIE5lZWQgdG8gdmlzaXQgcGFyYW1ldGVycyBiZWZvcmUgaW5pdGlhbGl6ZXJzLgogICAgdmlzaXRMaXN0KG5vZGUuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLCB0aGlzKTsKICAgIHZpc2l0TGlzdChub2RlLmluaXRpYWxpemVycywgdGhpcyk7CiAgICBub2RlLmZ1bmN0aW9uLmJvZHk/LmFjY2VwdCh0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIG5vZGUudmFyaWFibGUuYWNjZXB0KHRoaXMpOwogICAgX3Zpc2l0RnVuY3Rpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgX3Zpc2l0RnVuY3Rpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBmaW5hbCBpbnQgaW5kZXggPSBudW1WYXJpYWJsZXM7CiAgICB2YXJEZWNsYXJhdGlvbnMuYWRkKG5vZGUpOwogICAgdmFySW5kZXhbbm9kZV0gPSBpbmRleDsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgX3VzZVZhcmlhYmxlKG5vZGUudmFyaWFibGUsIGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0VmFyaWFibGVTZXQoVmFyaWFibGVTZXQgbm9kZSkgewogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgX3VzZVZhcmlhYmxlKG5vZGUudmFyaWFibGUsIHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICBfc3RhcnRDb2xsZWN0aW5nTW9kaWZpZWRWYXJpYWJsZXMobm9kZSk7CiAgICBub2RlLmJvZHk/LmFjY2VwdCh0aGlzKTsKICAgIF9lbmRDb2xsZWN0aW5nTW9kaWZpZWRWYXJpYWJsZXMoKTsKICAgIHZpc2l0TGlzdChub2RlLmNhdGNoZXMsIHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSkgewogICAgX3N0YXJ0Q29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKG5vZGUpOwogICAgbm9kZS5ib2R5Py5hY2NlcHQodGhpcyk7CiAgICBfZW5kQ29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKCk7CiAgICBub2RlLmZpbmFsaXplcj8uYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBfc3RhcnRDb2xsZWN0aW5nTW9kaWZpZWRWYXJpYWJsZXMobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBfZW5kQ29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgIF9zdGFydENvbGxlY3RpbmdNb2RpZmllZFZhcmlhYmxlcyhub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIF9lbmRDb2xsZWN0aW5nTW9kaWZpZWRWYXJpYWJsZXMoKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Rm9yU3RhdGVtZW50KEZvclN0YXRlbWVudCBub2RlKSB7CiAgICB2aXNpdExpc3Qobm9kZS52YXJpYWJsZXMsIHRoaXMpOwogICAgX3N0YXJ0Q29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKG5vZGUpOwogICAgbm9kZS5jb25kaXRpb24/LmFjY2VwdCh0aGlzKTsKICAgIG5vZGUuYm9keT8uYWNjZXB0KHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUudXBkYXRlcywgdGhpcyk7CiAgICBfZW5kQ29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIG5vZGUuaXRlcmFibGUuYWNjZXB0KHRoaXMpOwogICAgX3N0YXJ0Q29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKG5vZGUpOwogICAgbm9kZS52YXJpYWJsZS5hY2NlcHQodGhpcyk7CiAgICBub2RlLmJvZHkuYWNjZXB0KHRoaXMpOwogICAgX2VuZENvbGxlY3RpbmdNb2RpZmllZFZhcmlhYmxlcygpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIG5vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcyk7CiAgICBfc3RhcnRDb2xsZWN0aW5nTW9kaWZpZWRWYXJpYWJsZXMobm9kZSk7CiAgICB2aXNpdExpc3Qobm9kZS5jYXNlcywgdGhpcyk7CiAgICBfZW5kQ29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzKCk7CiAgfQp9CgpJdGVyYWJsZTxOYW1lPiBnZXRTZWxlY3RvcnMoQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBDbGFzcyBjbHMsCiAgICAgICAge2Jvb2wgc2V0dGVycyA9IGZhbHNlfSkgPT4KICAgIGhpZXJhcmNoeQogICAgICAgIC5nZXRJbnRlcmZhY2VNZW1iZXJzKGNscywgc2V0dGVyczogc2V0dGVycykKICAgICAgICAubWFwKChNZW1iZXIgbSkgPT4gbS5uYW1lKTsKCmVudW0gRmllbGRTdW1tYXJ5VHlwZSB7IGtGaWVsZEd1YXJkLCBrSW5pdGlhbGl6ZXIgfQoKLy8vIENyZWF0ZSBhIHR5cGUgZmxvdyBzdW1tYXJ5IGZvciBhIG1lbWJlciBmcm9tIHRoZSBrZXJuZWwgQVNULgpjbGFzcyBTdW1tYXJ5Q29sbGVjdG9yIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvcjxUeXBlRXhwcj4gewogIGZpbmFsIFRhcmdldCB0YXJnZXQ7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IF9lbnZpcm9ubWVudDsKICBmaW5hbCBDbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5IF9oaWVyYXJjaHk7CiAgZmluYWwgRW50cnlQb2ludHNMaXN0ZW5lciBfZW50cnlQb2ludHNMaXN0ZW5lcjsKICBmaW5hbCBUeXBlc0J1aWxkZXIgX3R5cGVzQnVpbGRlcjsKICBmaW5hbCBOYXRpdmVDb2RlT3JhY2xlIF9uYXRpdmVDb2RlT3JhY2xlOwogIGZpbmFsIEdlbmVyaWNJbnRlcmZhY2VzSW5mbyBfZ2VuZXJpY0ludGVyZmFjZXNJbmZvOwoKICBmaW5hbCBNYXA8VHJlZU5vZGUsIENhbGw+IGNhbGxTaXRlcyA9IDxUcmVlTm9kZSwgQ2FsbD57fTsKICBmaW5hbCBNYXA8QXNFeHByZXNzaW9uLCBUeXBlQ2hlY2s+IGV4cGxpY2l0Q2FzdHMgPQogICAgICA8QXNFeHByZXNzaW9uLCBUeXBlQ2hlY2s+e307CiAgZmluYWwgX0ZhbGx0aHJvdWdoRGV0ZWN0b3IgX2ZhbGx0aHJvdWdoRGV0ZWN0b3IgPSBuZXcgX0ZhbGx0aHJvdWdoRGV0ZWN0b3IoKTsKICBmaW5hbCBTZXQ8TmFtZT4gX251bGxNZXRob2RzQW5kR2V0dGVycyA9IDxOYW1lPnt9OwogIGZpbmFsIFNldDxOYW1lPiBfbnVsbFNldHRlcnMgPSA8TmFtZT57fTsKCiAgU3VtbWFyeSBfc3VtbWFyeTsKICBfVmFyaWFibGVzSW5mb0NvbGxlY3RvciBfdmFyaWFibGVzSW5mbzsKCiAgLy8gQ3VycmVudCB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlLiBNYXkgY29udGFpbiBudWxsIGlmIHZhcmlhYmxlIGlzIG5vdAogIC8vIGRlY2xhcmVkIHlldCwgb3IgRW1wdHlUeXBlIGlmIGN1cnJlbnQgbG9jYXRpb24gaXMgdW5yZWFjaGFibGUKICAvLyAoZS5nLiBhZnRlciByZXR1cm4gb3IgdGhyb3cpLgogIExpc3Q8VHlwZUV4cHI+IF92YXJpYWJsZVZhbHVlczsKCiAgLy8gQ29udGFpbnMgSm9pbnMgd2hpY2ggYWNjdW11bGF0ZSBhbGwgdmFsdWVzIG9mIGNlcnRhaW4gdmFyaWFibGVzLgogIC8vIFVzZWQgb25seSB3aGVuIGFsbCB2YXJpYWJsZSB2YWx1ZXMgc2hvdWxkIGJlIG1lcmdlZCByZWdhcmRsZXNzIG9mIGNvbnRyb2wKICAvLyBmbG93LiBTdWNoIGFjY3VtdWxhdGluZyBqb2lucyBhcmUgdXNlZCBmb3IKICAvLyAxLiBjYXB0dXJlZCB2YXJpYWJsZXMsIGFzIGNsb3N1cmVzIG1heSBwb3RlbnRpYWxseSBzZWUgYW55IHZhbHVlOwogIC8vIDIuIHZhcmlhYmxlcyBtb2RpZmllZCBpbnNpZGUgdHJ5IGJsb2NrcyAod2hpbGUgaW4gdGhlIHRyeSBibG9jayksIGFzCiAgLy8gY2F0Y2ggY2FuIHBvdGVudGlhbGx5IHNlZSBhbnkgdmFsdWUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBpbnNpZGUgdHJ5CiAgLy8gYmxvY2suCiAgLy8gSWYgX3ZhcmlhYmxlQ2VsbHNbaV0gIT0gbnVsbCwgdGhlbiBhbGwgdmFsdWVzIGFyZSBhY2N1bXVsYXRlZCBpbiB0aGUKICAvLyBfdmFyaWFibGVDZWxsc1tpXS4gX3ZhcmlhYmxlVmFsdWVzW2ldIGRvZXMgbm90IGNoYW5nZSBhbmQgcmVtYWlucyBlcXVhbAogIC8vIHRvIF92YXJpYWJsZUNlbGxzW2ldLgogIExpc3Q8Sm9pbj4gX3ZhcmlhYmxlQ2VsbHM7CgogIC8vIENvdW50cyBudW1iZXIgb2YgSm9pbnMgaW5zZXJ0ZWQgZm9yIGVhY2ggdmFyaWFibGUuIE9ubHkgdXNlZCB0byBzZXQKICAvLyByZWFkYWJsZSBuYW1lcyBmb3Igc3VjaCBqb2lucyAoZm9vXzAsIGZvb18xIGV0Yy4pCiAgTGlzdDxpbnQ+IF92YXJpYWJsZVZlcnNpb25zOwoKICAvLyBTdGF0ZSBvZiB2YXJpYWJsZXMgYWZ0ZXIgY29ycmVzcG9uZGluZyBMYWJlbGVkU3RhdGVtZW50LgogIC8vIFVzZWQgdG8gY29sbGVjdCBzdGF0ZXMgZnJvbSBCcmVha1N0YXRlbWVudHMuCiAgTWFwPExhYmVsZWRTdGF0ZW1lbnQsIExpc3Q8VHlwZUV4cHI+PiBfdmFyaWFibGVWYWx1ZXNBZnRlckxhYmVsZWRTdGF0ZW1lbnRzOwoKICAvLyBKb2lucyBjb3JyZXNwb25kaW5nIHRvIHZhcmlhYmxlcyBvbiBlbnRyeSB0byBzd2l0Y2ggY2FzZXMuCiAgLy8gVXNlZCB0byBwcm9wYWdhdGUgc3RhdGUgZnJvbSBDb250aW51ZVN3aXRjaFN0YXRlbWVudCB0byBhIHRhcmdldCBjYXNlLgogIE1hcDxTd2l0Y2hDYXNlLCBMaXN0PEpvaW4+PiBfam9pbnNBdFN3aXRjaENhc2VzOwoKICAvLyBKb2luIHdoaWNoIGFjY3VtdWxhdGVzIGFsbCByZXR1cm4gdmFsdWVzLgogIEpvaW4gX3JldHVyblZhbHVlOwoKICBQYXJhbWV0ZXIgX3JlY2VpdmVyOwogIENvbnN0YW50QWxsb2NhdGlvbkNvbGxlY3RvciBjb25zdGFudEFsbG9jYXRpb25Db2xsZWN0b3I7CiAgUnVudGltZVR5cGVUcmFuc2xhdG9ySW1wbCBfdHJhbnNsYXRvcjsKICBTdGF0aWNUeXBlQ29udGV4dCBfc3RhdGljVHlwZUNvbnRleHQ7CgogIC8vIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIGZhY3RvcnkgY29uc3RydWN0b3JzLgogIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlRXhwcj4gX2ZuVHlwZVZhcmlhYmxlczsKCiAgU3VtbWFyeUNvbGxlY3RvcigKICAgICAgdGhpcy50YXJnZXQsCiAgICAgIHRoaXMuX2Vudmlyb25tZW50LAogICAgICB0aGlzLl9oaWVyYXJjaHksCiAgICAgIHRoaXMuX2VudHJ5UG9pbnRzTGlzdGVuZXIsCiAgICAgIHRoaXMuX3R5cGVzQnVpbGRlciwKICAgICAgdGhpcy5fbmF0aXZlQ29kZU9yYWNsZSwKICAgICAgdGhpcy5fZ2VuZXJpY0ludGVyZmFjZXNJbmZvKSB7CiAgICBhc3NlcnR4KF9nZW5lcmljSW50ZXJmYWNlc0luZm8gIT0gbnVsbCk7CiAgICBjb25zdGFudEFsbG9jYXRpb25Db2xsZWN0b3IgPSBuZXcgQ29uc3RhbnRBbGxvY2F0aW9uQ29sbGVjdG9yKHRoaXMpOwogICAgX251bGxNZXRob2RzQW5kR2V0dGVycy5hZGRBbGwoZ2V0U2VsZWN0b3JzKAogICAgICAgIF9oaWVyYXJjaHksIF9lbnZpcm9ubWVudC5jb3JlVHlwZXMubnVsbENsYXNzLAogICAgICAgIHNldHRlcnM6IGZhbHNlKSk7CiAgICBfbnVsbFNldHRlcnMuYWRkQWxsKGdldFNlbGVjdG9ycygKICAgICAgICBfaGllcmFyY2h5LCBfZW52aXJvbm1lbnQuY29yZVR5cGVzLm51bGxDbGFzcywKICAgICAgICBzZXR0ZXJzOiB0cnVlKSk7CiAgfQoKICBTdW1tYXJ5IGNyZWF0ZVN1bW1hcnkoTWVtYmVyIG1lbWJlciwKICAgICAge2ZpZWxkU3VtbWFyeVR5cGU6IEZpZWxkU3VtbWFyeVR5cGUua0luaXRpYWxpemVyfSkgewogICAgZGVidWdQcmludCgiPT09PT0gJHttZW1iZXJ9ID09PT09Iik7CiAgICBhc3NlcnR4KCFtZW1iZXIuaXNBYnN0cmFjdCk7CgogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbmV3IFN0YXRpY1R5cGVDb250ZXh0KG1lbWJlciwgX2Vudmlyb25tZW50KTsKICAgIF92YXJpYWJsZXNJbmZvID0gbmV3IF9WYXJpYWJsZXNJbmZvQ29sbGVjdG9yKG1lbWJlcik7CiAgICBfdmFyaWFibGVWYWx1ZXMgPSBuZXcgTGlzdDxUeXBlRXhwcj4oX3ZhcmlhYmxlc0luZm8ubnVtVmFyaWFibGVzKTsKICAgIF92YXJpYWJsZUNlbGxzID0gbmV3IExpc3Q8Sm9pbj4oX3ZhcmlhYmxlc0luZm8ubnVtVmFyaWFibGVzKTsKICAgIF92YXJpYWJsZVZlcnNpb25zID0gbmV3IExpc3Q8aW50Pi5maWxsZWQoX3ZhcmlhYmxlc0luZm8ubnVtVmFyaWFibGVzLCAwKTsKICAgIF92YXJpYWJsZVZhbHVlc0FmdGVyTGFiZWxlZFN0YXRlbWVudHMgPSBudWxsOwogICAgX2pvaW5zQXRTd2l0Y2hDYXNlcyA9IG51bGw7CiAgICBfcmV0dXJuVmFsdWUgPSBudWxsOwogICAgX3JlY2VpdmVyID0gbnVsbDsKCiAgICBmaW5hbCBoYXNSZWNlaXZlciA9IGhhc1JlY2VpdmVyQXJnKG1lbWJlcik7CgogICAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgICBpZiAoaGFzUmVjZWl2ZXIpIHsKICAgICAgICBmaW5hbCBpbnQgbnVtQXJncyA9CiAgICAgICAgICAgIGZpZWxkU3VtbWFyeVR5cGUgPT0gRmllbGRTdW1tYXJ5VHlwZS5rSW5pdGlhbGl6ZXIgPyAxIDogMjsKICAgICAgICBfc3VtbWFyeSA9IG5ldyBTdW1tYXJ5KAogICAgICAgICAgICBwYXJhbWV0ZXJDb3VudDogbnVtQXJncywgcG9zaXRpb25hbFBhcmFtZXRlckNvdW50OiBudW1BcmdzKTsKICAgICAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBzdWJjbGFzcyBjb25lCiAgICAgICAgX3JlY2VpdmVyID0gX2RlY2xhcmVQYXJhbWV0ZXIoInRoaXMiLAogICAgICAgICAgICBfZW52aXJvbm1lbnQuY29yZVR5cGVzLmxlZ2FjeVJhd1R5cGUobWVtYmVyLmVuY2xvc2luZ0NsYXNzKSwgbnVsbCwKICAgICAgICAgICAgaXNSZWNlaXZlcjogdHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3N1bW1hcnkgPSBuZXcgU3VtbWFyeSgpOwogICAgICB9CgogICAgICBfdHJhbnNsYXRvciA9IG5ldyBSdW50aW1lVHlwZVRyYW5zbGF0b3JJbXBsKAogICAgICAgICAgX3N1bW1hcnksIF9yZWNlaXZlciwgbnVsbCwgX2dlbmVyaWNJbnRlcmZhY2VzSW5mbyk7CgogICAgICBpZiAoZmllbGRTdW1tYXJ5VHlwZSA9PSBGaWVsZFN1bW1hcnlUeXBlLmtJbml0aWFsaXplcikgewogICAgICAgIGFzc2VydHgobWVtYmVyLmluaXRpYWxpemVyICE9IG51bGwpOwogICAgICAgIF9zdW1tYXJ5LnJlc3VsdCA9IF92aXNpdChtZW1iZXIuaW5pdGlhbGl6ZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsIFBhcmFtZXRlciB2YWx1ZVBhcmFtID0KICAgICAgICAgICAgX2RlY2xhcmVQYXJhbWV0ZXIoInZhbHVlIiwgbWVtYmVyLnR5cGUsIG51bGwpOwogICAgICAgIF9zdW1tYXJ5LnJlc3VsdCA9IF90eXBlQ2hlY2sodmFsdWVQYXJhbSwgbWVtYmVyLnR5cGUsIG1lbWJlcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IG1lbWJlci5mdW5jdGlvbjsKCiAgICAgIGZpbmFsIG51bVR5cGVQYXJhbWV0ZXJzID0gbnVtVHlwZVBhcmFtcyhtZW1iZXIpOwogICAgICBmaW5hbCBmaXJzdFBhcmFtSW5kZXggPSAoaGFzUmVjZWl2ZXIgPyAxIDogMCkgKyBudW1UeXBlUGFyYW1ldGVyczsKCiAgICAgIF9zdW1tYXJ5ID0gbmV3IFN1bW1hcnkoCiAgICAgICAgICBwYXJhbWV0ZXJDb3VudDogZmlyc3RQYXJhbUluZGV4ICsKICAgICAgICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggKwogICAgICAgICAgICAgIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQ6CiAgICAgICAgICAgICAgZmlyc3RQYXJhbUluZGV4ICsgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDoKICAgICAgICAgICAgICBmaXJzdFBhcmFtSW5kZXggKyBmdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKCiAgICAgIGlmIChudW1UeXBlUGFyYW1ldGVycyA+IDApIHsKICAgICAgICBfZm5UeXBlVmFyaWFibGVzID0gPFR5cGVQYXJhbWV0ZXIsIFR5cGVFeHByPnt9OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVHlwZVBhcmFtZXRlcnM7ICsraSkgewogICAgICAgICAgX2ZuVHlwZVZhcmlhYmxlc1tmdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgICAgIF9kZWNsYXJlUGFyYW1ldGVyKGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldLm5hbWUsIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGhhc1JlY2VpdmVyKSB7CiAgICAgICAgLy8gVE9ETyhhbGV4bWFya292KTogc3ViY2xhc3MgY29uZQogICAgICAgIF9yZWNlaXZlciA9IF9kZWNsYXJlUGFyYW1ldGVyKCJ0aGlzIiwKICAgICAgICAgICAgX2Vudmlyb25tZW50LmNvcmVUeXBlcy5sZWdhY3lSYXdUeXBlKG1lbWJlci5lbmNsb3NpbmdDbGFzcyksIG51bGwsCiAgICAgICAgICAgIGlzUmVjZWl2ZXI6IHRydWUpOwogICAgICB9CgogICAgICBfdHJhbnNsYXRvciA9IG5ldyBSdW50aW1lVHlwZVRyYW5zbGF0b3JJbXBsKAogICAgICAgICAgX3N1bW1hcnksIF9yZWNlaXZlciwgX2ZuVHlwZVZhcmlhYmxlcywgX2dlbmVyaWNJbnRlcmZhY2VzSW5mbyk7CgogICAgICAvLyBIYW5kbGUgZm9yd2FyZGluZyBzdHVicy4gV2UgbmVlZCB0byBjaGVjayB0eXBlcyBhZ2FpbnN0IHRoZSB0eXBlcyBvZgogICAgICAvLyB0aGUgZm9yd2FyZGluZyBzdHViJ3MgdGFyZ2V0LCBbbWVtYmVyLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRdLgogICAgICBGdW5jdGlvbk5vZGUgdXNlVHlwZXNGcm9tID0gbWVtYmVyLmZ1bmN0aW9uOwogICAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgbWVtYmVyLmlzRm9yd2FyZGluZ1N0dWIgJiYKICAgICAgICAgIG1lbWJlci5mb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICBmaW5hbCB0YXJnZXQgPSBtZW1iZXIuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldDsKICAgICAgICBpZiAodGFyZ2V0IGlzIEZpZWxkKSB7CiAgICAgICAgICB1c2VUeXBlc0Zyb20gPSBGdW5jdGlvbk5vZGUobnVsbCwgcG9zaXRpb25hbFBhcmFtZXRlcnM6IFsKICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbigidmFsdWUiLCB0eXBlOiB0YXJnZXQudHlwZSkKICAgICAgICAgIF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1c2VUeXBlc0Zyb20gPSBtZW1iZXIuZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldC5mdW5jdGlvbjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBmaW5hbCBkZWNsID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgX2RlY2xhcmVQYXJhbWV0ZXIoCiAgICAgICAgICAgIGRlY2wubmFtZSwKICAgICAgICAgICAgX3VzZVR5cGVDaGVja0ZvclBhcmFtZXRlcihkZWNsKQogICAgICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgICAgICA6IHVzZVR5cGVzRnJvbS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS50eXBlLAogICAgICAgICAgICBkZWNsLmluaXRpYWxpemVyKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGZpbmFsIGRlY2wgPSBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgICAgX2RlY2xhcmVQYXJhbWV0ZXIoCiAgICAgICAgICAgIGRlY2wubmFtZSwKICAgICAgICAgICAgX3VzZVR5cGVDaGVja0ZvclBhcmFtZXRlcihkZWNsKQogICAgICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgICAgICA6IHVzZVR5cGVzRnJvbS5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZSwKICAgICAgICAgICAgZGVjbC5pbml0aWFsaXplcik7CiAgICAgIH0KCiAgICAgIGludCBjb3VudCA9IGZpcnN0UGFyYW1JbmRleDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGZpbmFsIGRlY2wgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBmaW5hbCB0eXBlID0gdXNlVHlwZXNGcm9tLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLnR5cGU7CiAgICAgICAgVHlwZUV4cHIgcGFyYW0gPSBfc3VtbWFyeS5zdGF0ZW1lbnRzW2NvdW50KytdOwogICAgICAgIGlmIChfdXNlVHlwZUNoZWNrRm9yUGFyYW1ldGVyKGRlY2wpKSB7CiAgICAgICAgICBwYXJhbSA9IF90eXBlQ2hlY2socGFyYW0sIHR5cGUsIGRlY2wpOwogICAgICAgIH0KICAgICAgICBfZGVjbGFyZVZhcmlhYmxlKGRlY2wsIHBhcmFtKTsKICAgICAgfQogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGZpbmFsIGRlY2wgPSBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgICAgZmluYWwgdHlwZSA9IHVzZVR5cGVzRnJvbS5uYW1lZFBhcmFtZXRlcnNbaV0udHlwZTsKICAgICAgICBUeXBlRXhwciBwYXJhbSA9IF9zdW1tYXJ5LnN0YXRlbWVudHNbY291bnQrK107CiAgICAgICAgaWYgKF91c2VUeXBlQ2hlY2tGb3JQYXJhbWV0ZXIoZGVjbCkpIHsKICAgICAgICAgIHBhcmFtID0gX3R5cGVDaGVjayhwYXJhbSwgdHlwZSwgZGVjbCk7CiAgICAgICAgfQogICAgICAgIF9kZWNsYXJlVmFyaWFibGUoZGVjbCwgcGFyYW0pOwogICAgICB9CiAgICAgIGFzc2VydHgoY291bnQgPT0gX3N1bW1hcnkucGFyYW1ldGVyQ291bnQpOwoKICAgICAgX3JldHVyblZhbHVlID0gbmV3IEpvaW4oIiVyZXN1bHQiLCBmdW5jdGlvbi5yZXR1cm5UeXBlKTsKICAgICAgX3N1bW1hcnkuYWRkKF9yZXR1cm5WYWx1ZSk7CgogICAgICBpZiAobWVtYmVyIGlzIENvbnN0cnVjdG9yKSB7CiAgICAgICAgLy8gTWFrZSBzdXJlIGluc3RhbmNlIGZpZWxkIGluaXRpYWxpemVycyBhcmUgdmlzaXRlZC4KICAgICAgICBmb3IgKHZhciBmIGluIG1lbWJlci5lbmNsb3NpbmdDbGFzcy5tZW1iZXJzKSB7CiAgICAgICAgICBpZiAoKGYgaXMgRmllbGQpICYmICFmLmlzU3RhdGljICYmIChmLmluaXRpYWxpemVyICE9IG51bGwpKSB7CiAgICAgICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLmFkZFJhd0NhbGwoCiAgICAgICAgICAgICAgICBuZXcgRGlyZWN0U2VsZWN0b3IoZiwgY2FsbEtpbmQ6IENhbGxLaW5kLkZpZWxkSW5pdGlhbGl6ZXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbWVtYmVyLmluaXRpYWxpemVycy5mb3JFYWNoKF92aXNpdCk7CiAgICAgIH0KCiAgICAgIGlmIChmdW5jdGlvbi5ib2R5ID09IG51bGwpIHsKICAgICAgICBUeXBlRXhwciB0eXBlID0gX25hdGl2ZUNvZGVPcmFjbGUuaGFuZGxlTmF0aXZlUHJvY2VkdXJlKAogICAgICAgICAgICBtZW1iZXIsIF9lbnRyeVBvaW50c0xpc3RlbmVyLCBfdHlwZXNCdWlsZGVyLCBfdHJhbnNsYXRvcik7CiAgICAgICAgaWYgKHR5cGUgaXMhIENvbmNyZXRlVHlwZSAmJiB0eXBlIGlzISBTdGF0ZW1lbnQpIHsKICAgICAgICAgIC8vIFJ1bnRpbWUgdHlwZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UgdGhhbiBzdGF0aWMgdHlwZSwgc28KICAgICAgICAgIC8vIGNhbGN1bGF0ZSBpbnRlcnNlY3Rpb24uCiAgICAgICAgICBmaW5hbCB0eXBlQ2hlY2sgPSBfdHlwZUNoZWNrKHR5cGUsIGZ1bmN0aW9uLnJldHVyblR5cGUsIGZ1bmN0aW9uKTsKICAgICAgICAgIF9yZXR1cm5WYWx1ZS52YWx1ZXMuYWRkKHR5cGVDaGVjayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9yZXR1cm5WYWx1ZS52YWx1ZXMuYWRkKHR5cGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBfdmlzaXQoZnVuY3Rpb24uYm9keSk7CgogICAgICAgIGlmIChfZmFsbHRocm91Z2hEZXRlY3Rvci5jb250cm9sQ2FuRmFsbFRocm91Z2goZnVuY3Rpb24pKSB7CiAgICAgICAgICBfcmV0dXJuVmFsdWUudmFsdWVzLmFkZChfbnVsbFR5cGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3N1bW1hcnkucmVzdWx0ID0gX3JldHVyblZhbHVlOwogICAgfQoKICAgIF9zdGF0aWNUeXBlQ29udGV4dCA9IG51bGw7CgogICAgZGVidWdQcmludCgiLS0tLS0tLS0tLS0tIFNVTU1BUlkgLS0tLS0tLS0tLS0tIik7CiAgICBkZWJ1Z1ByaW50KF9zdW1tYXJ5KTsKICAgIGRlYnVnUHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoKICAgIG5ldyBfU3VtbWFyeU5vcm1hbGl6ZXIoX3N1bW1hcnksIF90eXBlc0J1aWxkZXIpLm5vcm1hbGl6ZSgpOwoKICAgIGRlYnVnUHJpbnQoIi0tLS0tLS0tLS0gTk9STSBTVU1NQVJZIC0tLS0tLS0tLSIpOwogICAgZGVidWdQcmludChfc3VtbWFyeSk7CiAgICBkZWJ1Z1ByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCiAgICBTdGF0aXN0aWNzLnN1bW1hcmllc0NyZWF0ZWQrKzsKCiAgICByZXR1cm4gX3N1bW1hcnk7CiAgfQoKICBib29sIF91c2VUeXBlQ2hlY2tGb3JQYXJhbWV0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsKSB7CiAgICByZXR1cm4gZGVjbC5pc0NvdmFyaWFudCB8fCBkZWNsLmlzR2VuZXJpY0NvdmFyaWFudEltcGw7CiAgfQoKICBBcmdzPFR5cGU+IHJhd0FyZ3VtZW50cyhTZWxlY3RvciBzZWxlY3RvcikgewogICAgZmluYWwgbWVtYmVyID0gc2VsZWN0b3IubWVtYmVyOwogICAgYXNzZXJ0eChtZW1iZXIgIT0gbnVsbCk7CgogICAgZmluYWwgTGlzdDxUeXBlPiBhcmdzID0gPFR5cGU+W107CiAgICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXMgPSA8U3RyaW5nPltdOwoKICAgIGZpbmFsIG51bVR5cGVQYXJhbWV0ZXJzID0gbnVtVHlwZVBhcmFtcyhtZW1iZXIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UeXBlUGFyYW1ldGVyczsgKytpKSB7CiAgICAgIGFyZ3MuYWRkKGNvbnN0IEFueVR5cGUoKSk7CiAgICB9CgogICAgaWYgKGhhc1JlY2VpdmVyQXJnKG1lbWJlcikpIHsKICAgICAgYXNzZXJ0eChtZW1iZXIuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCk7CiAgICAgIGZpbmFsIHJlY2VpdmVyID0KICAgICAgICAgIG5ldyBDb25lVHlwZShfdHlwZXNCdWlsZGVyLmdldFRGQ2xhc3MobWVtYmVyLmVuY2xvc2luZ0NsYXNzKSk7CiAgICAgIGFyZ3MuYWRkKHJlY2VpdmVyKTsKICAgIH0KCiAgICBzd2l0Y2ggKHNlbGVjdG9yLmNhbGxLaW5kKSB7CiAgICAgIGNhc2UgQ2FsbEtpbmQuTWV0aG9kOgogICAgICAgIGlmIChtZW1iZXIgaXMhIEZpZWxkKSB7CiAgICAgICAgICBmaW5hbCBmdW5jdGlvbiA9IG1lbWJlci5mdW5jdGlvbjsKICAgICAgICAgIGFzc2VydHgoZnVuY3Rpb24gIT0gbnVsbCk7CgogICAgICAgICAgZmluYWwgaW50IHBhcmFtQ291bnQgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggKwogICAgICAgICAgICAgIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5sZW5ndGg7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgewogICAgICAgICAgICBhcmdzLmFkZChuZXcgVHlwZS5udWxsYWJsZUFueSgpKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgZm9yICh2YXIgcGFyYW0gaW4gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgbmFtZXMuYWRkKHBhcmFtLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRPRE8oZGFydGJ1Zy5jb20vMzIyOTIpOiBtYWtlIHN1cmUgcGFyYW1ldGVycyBhcmUgc29ydGVkIGluCiAgICAgICAgICAgIC8vIGtlcm5lbCBBU1QgYW5kIHJlbW92ZSB0aGlzIHNvcnRpbmcuCiAgICAgICAgICAgIG5hbWVzLnNvcnQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENhbGxLaW5kLlByb3BlcnR5R2V0OgogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDYWxsS2luZC5Qcm9wZXJ0eVNldDoKICAgICAgY2FzZSBDYWxsS2luZC5TZXRGaWVsZEluQ29uc3RydWN0b3I6CiAgICAgICAgYXJncy5hZGQobmV3IFR5cGUubnVsbGFibGVBbnkoKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENhbGxLaW5kLkZpZWxkSW5pdGlhbGl6ZXI6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5ldyBBcmdzPFR5cGU+KGFyZ3MsIG5hbWVzOiBuYW1lcyk7CiAgfQoKICBUeXBlRXhwciBfdmlzaXQoVHJlZU5vZGUgbm9kZSkgPT4gbm9kZS5hY2NlcHQodGhpcyk7CgogIEFyZ3M8VHlwZUV4cHI+IF92aXNpdEFyZ3VtZW50cyhUeXBlRXhwciByZWNlaXZlciwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgcGFzc1R5cGVBcmd1bWVudHM6IGZhbHNlfSkgewogICAgZmluYWwgYXJncyA9IDxUeXBlRXhwcj5bXTsKICAgIGlmIChwYXNzVHlwZUFyZ3VtZW50cykgewogICAgICBmb3IgKHZhciB0eXBlIGluIGFyZ3VtZW50cy50eXBlcykgewogICAgICAgIGFyZ3MuYWRkKF90cmFuc2xhdG9yLnRyYW5zbGF0ZSh0eXBlKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIGFyZ3MuYWRkKHJlY2VpdmVyKTsKICAgIH0KICAgIGZvciAoRXhwcmVzc2lvbiBhcmcgaW4gYXJndW1lbnRzLnBvc2l0aW9uYWwpIHsKICAgICAgYXJncy5hZGQoX3Zpc2l0KGFyZykpOwogICAgfQogICAgaWYgKGFyZ3VtZW50cy5uYW1lZC5pc05vdEVtcHR5KSB7CiAgICAgIGZpbmFsIG5hbWVzID0gPFN0cmluZz5bXTsKICAgICAgZmluYWwgbWFwID0gPFN0cmluZywgVHlwZUV4cHI+e307CiAgICAgIGZvciAoTmFtZWRFeHByZXNzaW9uIGFyZyBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgICBmaW5hbCBuYW1lID0gYXJnLm5hbWU7CiAgICAgICAgbmFtZXMuYWRkKG5hbWUpOwogICAgICAgIG1hcFtuYW1lXSA9IF92aXNpdChhcmcudmFsdWUpOwogICAgICB9CiAgICAgIG5hbWVzLnNvcnQoKTsKICAgICAgZm9yICh2YXIgbmFtZSBpbiBuYW1lcykgewogICAgICAgIGFyZ3MuYWRkKG1hcFtuYW1lXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBBcmdzPFR5cGVFeHByPihhcmdzLCBuYW1lczogbmFtZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBBcmdzPFR5cGVFeHByPihhcmdzKTsKICAgIH0KICB9CgogIFBhcmFtZXRlciBfZGVjbGFyZVBhcmFtZXRlcigKICAgICAgU3RyaW5nIG5hbWUsIERhcnRUeXBlIHR5cGUsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsCiAgICAgIHtib29sIGlzUmVjZWl2ZXI6IGZhbHNlfSkgewogICAgVHlwZSBzdGF0aWNUeXBlOwogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICBzdGF0aWNUeXBlID0gX3R5cGVzQnVpbGRlci5mcm9tU3RhdGljVHlwZSh0eXBlLCAhaXNSZWNlaXZlcik7CiAgICB9CiAgICBmaW5hbCBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIobmFtZSwgc3RhdGljVHlwZSk7CiAgICBfc3VtbWFyeS5hZGQocGFyYW0pOwogICAgYXNzZXJ0eChwYXJhbS5pbmRleCA8IF9zdW1tYXJ5LnBhcmFtZXRlckNvdW50KTsKICAgIGlmIChwYXJhbS5pbmRleCA+PSBfc3VtbWFyeS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIGlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgaWYgKGluaXRpYWxpemVyIGlzIENvbnN0YW50RXhwcmVzc2lvbikgewogICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlID0KICAgICAgICAgICAgICBjb25zdGFudEFsbG9jYXRpb25Db2xsZWN0b3IudHlwZUZvcihpbml0aWFsaXplci5jb25zdGFudCk7CiAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBCYXNpY0xpdGVyYWwgfHwKICAgICAgICAgICAgaW5pdGlhbGl6ZXIgaXMgU3ltYm9sTGl0ZXJhbCB8fAogICAgICAgICAgICBpbml0aWFsaXplciBpcyBUeXBlTGl0ZXJhbCkgewogICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlID0gX3Zpc2l0KGluaXRpYWxpemVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgJ1VuZXhwZWN0ZWQgcGFyYW1ldGVyICRuYW1lIGRlZmF1bHQgdmFsdWUgJHtpbml0aWFsaXplci5ydW50aW1lVHlwZX0gJGluaXRpYWxpemVyJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlID0gX251bGxUeXBlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhc3NlcnR4KGluaXRpYWxpemVyID09IG51bGwpOwogICAgfQogICAgcmV0dXJuIHBhcmFtOwogIH0KCiAgdm9pZCBfZGVjbGFyZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbCwgVHlwZUV4cHIgaW5pdGlhbFZhbHVlKSB7CiAgICBmaW5hbCBpbnQgdmFySW5kZXggPSBfdmFyaWFibGVzSW5mby52YXJJbmRleFtkZWNsXTsKICAgIGFzc2VydHgodmFySW5kZXggIT0gbnVsbCk7CiAgICBhc3NlcnR4KF92YXJpYWJsZXNJbmZvLnZhckRlY2xhcmF0aW9uc1t2YXJJbmRleF0gPT0gZGVjbCk7CiAgICBhc3NlcnR4KF92YXJpYWJsZVZhbHVlc1t2YXJJbmRleF0gPT0gbnVsbCk7CiAgICBpZiAoX3ZhcmlhYmxlc0luZm8uaXNDYXB0dXJlZChkZWNsKSkgewogICAgICBmaW5hbCBqb2luID0gX21ha2VKb2luKHZhckluZGV4LCBpbml0aWFsVmFsdWUpOwogICAgICBfdmFyaWFibGVDZWxsc1t2YXJJbmRleF0gPSBqb2luOwogICAgICBfdmFyaWFibGVWYWx1ZXNbdmFySW5kZXhdID0gam9pbjsKICAgIH0gZWxzZSB7CiAgICAgIF92YXJpYWJsZVZhbHVlc1t2YXJJbmRleF0gPSBpbml0aWFsVmFsdWU7CiAgICB9CiAgfQoKICB2b2lkIF93cml0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIFR5cGVFeHByIHZhbHVlKSB7CiAgICBmaW5hbCBpbnQgdmFySW5kZXggPSBfdmFyaWFibGVzSW5mby52YXJJbmRleFt2YXJpYWJsZV07CiAgICBmaW5hbCBKb2luIGpvaW4gPSBfdmFyaWFibGVDZWxsc1t2YXJJbmRleF07CiAgICBpZiAoam9pbiAhPSBudWxsKSB7CiAgICAgIGpvaW4udmFsdWVzLmFkZCh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBfdmFyaWFibGVWYWx1ZXNbdmFySW5kZXhdID0gdmFsdWU7CiAgICB9CiAgfQoKICBMaXN0PFR5cGVFeHByPiBfY2xvbmVWYXJpYWJsZVZhbHVlcyhMaXN0PFR5cGVFeHByPiB2YWx1ZXMpID0+CiAgICAgIG5ldyBMaXN0PFR5cGVFeHByPi5mcm9tKHZhbHVlcyk7CgogIExpc3Q8VHlwZUV4cHI+IF9tYWtlRW1wdHlWYXJpYWJsZVZhbHVlcygpIHsKICAgIGZpbmFsIHZhbHVlcyA9IG5ldyBMaXN0PFR5cGVFeHByPihfdmFyaWFibGVzSW5mby5udW1WYXJpYWJsZXMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKF92YXJpYWJsZUNlbGxzW2ldICE9IG51bGwpIHsKICAgICAgICB2YWx1ZXNbaV0gPSBfdmFyaWFibGVWYWx1ZXNbaV07CiAgICAgIH0gZWxzZSBpZiAoX3ZhcmlhYmxlVmFsdWVzW2ldICE9IG51bGwpIHsKICAgICAgICB2YWx1ZXNbaV0gPSBjb25zdCBFbXB0eVR5cGUoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlczsKICB9CgogIEpvaW4gX21ha2VKb2luKGludCB2YXJJbmRleCwgVHlwZUV4cHIgdmFsdWUpIHsKICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgIF92YXJpYWJsZXNJbmZvLnZhckRlY2xhcmF0aW9uc1t2YXJJbmRleF07CiAgICBmaW5hbCBuYW1lID0gJyR7dmFyaWFibGUubmFtZX1fJHtfdmFyaWFibGVWZXJzaW9uc1t2YXJJbmRleF0rK30nOwogICAgZmluYWwgSm9pbiBqb2luID0gbmV3IEpvaW4obmFtZSwgdmFyaWFibGUudHlwZSk7CiAgICBfc3VtbWFyeS5hZGQoam9pbik7CiAgICBqb2luLnZhbHVlcy5hZGQodmFsdWUpOwogICAgcmV0dXJuIGpvaW47CiAgfQoKICB2b2lkIF9tZXJnZVZhcmlhYmxlVmFsdWVzKExpc3Q8VHlwZUV4cHI+IGRzdCwgTGlzdDxUeXBlRXhwcj4gc3JjKSB7CiAgICBhc3NlcnR4KGRzdC5sZW5ndGggPT0gc3JjLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRzdC5sZW5ndGg7ICsraSkgewogICAgICBmaW5hbCBUeXBlRXhwciBkc3RWYWx1ZSA9IGRzdFtpXTsKICAgICAgZmluYWwgVHlwZUV4cHIgc3JjVmFsdWUgPSBzcmNbaV07CiAgICAgIGlmIChpZGVudGljYWwoZHN0VmFsdWUsIHNyY1ZhbHVlKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChkc3RWYWx1ZSA9PSBudWxsIHx8IHNyY1ZhbHVlID09IG51bGwpIHsKICAgICAgICBkc3RbaV0gPSBudWxsOwogICAgICB9IGVsc2UgaWYgKGRzdFZhbHVlIGlzIEVtcHR5VHlwZSkgewogICAgICAgIGRzdFtpXSA9IHNyY1ZhbHVlOwogICAgICB9IGVsc2UgaWYgKGRzdFZhbHVlIGlzIEpvaW4gJiYgZHN0VmFsdWUudmFsdWVzLmNvbnRhaW5zKHNyY1ZhbHVlKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKHNyY1ZhbHVlIGlzIEVtcHR5VHlwZSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKHNyY1ZhbHVlIGlzIEpvaW4gJiYgc3JjVmFsdWUudmFsdWVzLmNvbnRhaW5zKGRzdFZhbHVlKSkgewogICAgICAgIGRzdFtpXSA9IHNyY1ZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsIEpvaW4gam9pbiA9IF9tYWtlSm9pbihpLCBkc3RbaV0pOwogICAgICAgIGpvaW4udmFsdWVzLmFkZChzcmNbaV0pOwogICAgICAgIGRzdFtpXSA9IGpvaW47CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2NvcHlWYXJpYWJsZVZhbHVlcyhMaXN0PFR5cGVFeHByPiBkc3QsIExpc3Q8VHlwZUV4cHI+IHNyYykgewogICAgYXNzZXJ0eChkc3QubGVuZ3RoID09IHNyYy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkc3QubGVuZ3RoOyArK2kpIHsKICAgICAgZHN0W2ldID0gc3JjW2ldOwogICAgfQogIH0KCiAgYm9vbCBfaXNJZGVudGljYWxTdGF0ZShMaXN0PFR5cGVFeHByPiBzdGF0ZTEsIExpc3Q8VHlwZUV4cHI+IHN0YXRlMikgewogICAgYXNzZXJ0eChzdGF0ZTEubGVuZ3RoID09IHN0YXRlMi5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZTEubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKCFpZGVudGljYWwoc3RhdGUxW2ldLCBzdGF0ZTJbaV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIExpc3Q8Sm9pbj4gX2luc2VydEpvaW5zRm9yTW9kaWZpZWRWYXJpYWJsZXMoVHJlZU5vZGUgbm9kZSwgYm9vbCBpc1RyeSkgewogICAgZmluYWwgTGlzdDxKb2luPiBqb2lucyA9IG5ldyBMaXN0PEpvaW4+KF92YXJpYWJsZXNJbmZvLm51bVZhcmlhYmxlcyk7CiAgICBmb3IgKHZhciBpIGluIF92YXJpYWJsZXNJbmZvLmdldE1vZGlmaWVkVmFyaWFibGVzKG5vZGUpKSB7CiAgICAgIGlmIChfdmFyaWFibGVDZWxsc1tpXSAhPSBudWxsKSB7CiAgICAgICAgYXNzZXJ0eChfdmFyaWFibGVDZWxsc1tpXSA9PSBfdmFyaWFibGVWYWx1ZXNbaV0pOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsIGpvaW4gPSBfbWFrZUpvaW4oaSwgX3ZhcmlhYmxlVmFsdWVzW2ldKTsKICAgICAgICBqb2luc1tpXSA9IGpvaW47CiAgICAgICAgX3ZhcmlhYmxlVmFsdWVzW2ldID0gam9pbjsKICAgICAgICBpZiAoaXNUcnkpIHsKICAgICAgICAgIC8vIEluc2lkZSB0cnkgYmxvY2tzIGFsbCB2YWx1ZXMgb2YgbW9kaWZpZWQgdmFyaWFibGVzIGFyZSBtZXJnZWQsCiAgICAgICAgICAvLyBhcyBjYXRjaCBjYW4gcG90ZW50aWFsbHkgc2VlIGFueSB2YWx1ZSAoaW4gY2FzZSBleGNlcHRpb24KICAgICAgICAgIC8vIGlzIHRocm93biBhZnRlciBlYWNoIGFzc2lnbm1lbnQpLgogICAgICAgICAgX3ZhcmlhYmxlQ2VsbHNbaV0gPSBqb2luOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGpvaW5zOwogIH0KCiAgLy8vIFN0b3BzIGFjY3VtdWxhdGluZyB2YWx1ZXMgaW4gW2pvaW5zXSBieSByZW1vdmluZyB0aGVtIGZyb20KICAvLy8gX3ZhcmlhYmxlQ2VsbHMuCiAgdm9pZCBfcmVzdG9yZVZhcmlhYmxlQ2VsbHNBZnRlclRyeShMaXN0PEpvaW4+IGpvaW5zKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGpvaW5zLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChqb2luc1tpXSAhPSBudWxsKSB7CiAgICAgICAgYXNzZXJ0eChfdmFyaWFibGVDZWxsc1tpXSA9PSBqb2luc1tpXSk7CiAgICAgICAgX3ZhcmlhYmxlQ2VsbHNbaV0gPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIF9tZXJnZVZhcmlhYmxlVmFsdWVzVG9Kb2lucyhMaXN0PFR5cGVFeHByPiB2YWx1ZXMsIExpc3Q8Sm9pbj4gam9pbnMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyArK2kpIHsKICAgICAgZmluYWwgam9pbiA9IGpvaW5zW2ldOwogICAgICBmaW5hbCB2YWx1ZSA9IHZhbHVlc1tpXTsKICAgICAgaWYgKGpvaW4gIT0gbnVsbCAmJgogICAgICAgICAgIWlkZW50aWNhbChqb2luLCB2YWx1ZSkgJiYKICAgICAgICAgICFpZGVudGljYWwoam9pbi52YWx1ZXMuZmlyc3QsIHZhbHVlKSkgewogICAgICAgIGpvaW4udmFsdWVzLmFkZCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIFR5cGVDaGVjayBfdHlwZUNoZWNrKFR5cGVFeHByIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBUcmVlTm9kZSBub2RlKSB7CiAgICBmaW5hbCBUeXBlRXhwciBydW50aW1lVHlwZSA9IF90cmFuc2xhdG9yLnRyYW5zbGF0ZSh0eXBlKTsKICAgIGZpbmFsIHR5cGVDaGVjayA9IG5ldyBUeXBlQ2hlY2soCiAgICAgICAgdmFsdWUsIHJ1bnRpbWVUeXBlLCBub2RlLCBfdHlwZXNCdWlsZGVyLmZyb21TdGF0aWNUeXBlKHR5cGUsIHRydWUpKTsKICAgIF9zdW1tYXJ5LmFkZCh0eXBlQ2hlY2spOwogICAgcmV0dXJuIHR5cGVDaGVjazsKICB9CgogIC8vIFRPRE8oYWxleG1hcmtvdik6IEF2b2lkIGRlY2xhcmluZyB2YXJpYWJsZXMgd2l0aCBzdGF0aWMgdHlwZXMuCiAgdm9pZCBfZGVjbGFyZVZhcmlhYmxlV2l0aFN0YXRpY1R5cGUoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsKSB7CiAgICBpZiAoZGVjbC5pbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgIF92aXNpdChkZWNsLmluaXRpYWxpemVyKTsKICAgIH0KICAgIF9kZWNsYXJlVmFyaWFibGUoZGVjbCwgX3R5cGVzQnVpbGRlci5mcm9tU3RhdGljVHlwZShkZWNsLnR5cGUsIHRydWUpKTsKICB9CgogIENhbGwgX21ha2VDYWxsKFRyZWVOb2RlIG5vZGUsIFNlbGVjdG9yIHNlbGVjdG9yLCBBcmdzPFR5cGVFeHByPiBhcmdzKSB7CiAgICBUeXBlIHN0YXRpY1Jlc3VsdFR5cGUgPSBudWxsOwogICAgTWVtYmVyIHRhcmdldDsKICAgIGlmIChzZWxlY3RvciBpcyBEaXJlY3RTZWxlY3RvcikgewogICAgICB0YXJnZXQgPSBzZWxlY3Rvci5tZW1iZXI7CiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yIGlzIEludGVyZmFjZVNlbGVjdG9yKSB7CiAgICAgIHRhcmdldCA9IHNlbGVjdG9yLm1lbWJlcjsKICAgIH0KICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBub2RlIGlzIEV4cHJlc3Npb24pIHsKICAgICAgc3RhdGljUmVzdWx0VHlwZSA9IF9zdGF0aWNUeXBlKG5vZGUpOwogICAgfQogICAgQ2FsbCBjYWxsID0gbmV3IENhbGwoc2VsZWN0b3IsIGFyZ3MsIHN0YXRpY1Jlc3VsdFR5cGUpOwogICAgX3N1bW1hcnkuYWRkKGNhbGwpOwogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICBjYWxsU2l0ZXNbbm9kZV0gPSBjYWxsOwogICAgfQogICAgcmV0dXJuIGNhbGw7CiAgfQoKICBUeXBlRXhwciBfbWFrZU5hcnJvdyhUeXBlRXhwciBhcmcsIFR5cGUgdHlwZSkgewogICAgaWYgKGFyZyBpcyBOYXJyb3cpIHsKICAgICAgaWYgKGFyZy50eXBlID09IHR5cGUpIHsKICAgICAgICByZXR1cm4gYXJnOwogICAgICB9CiAgICAgIGlmICh0eXBlID09IGNvbnN0IEFueVR5cGUoKSAmJiBhcmcudHlwZSBpcyEgTnVsbGFibGVUeXBlKSB7CiAgICAgICAgcmV0dXJuIGFyZzsKICAgICAgfQogICAgfSBlbHNlIGlmIChhcmcgaXMgVHlwZSkgewogICAgICBpZiAoKGFyZyBpcyBOdWxsYWJsZVR5cGUpICYmIChhcmcuYmFzZVR5cGUgPT0gY29uc3QgQW55VHlwZSgpKSkgewogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICAgIGlmICh0eXBlID09IGNvbnN0IEFueVR5cGUoKSkgewogICAgICAgIHJldHVybiAoYXJnIGlzIE51bGxhYmxlVHlwZSkgPyBhcmcuYmFzZVR5cGUgOiBhcmc7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlIGlzIE51bGxhYmxlVHlwZSAmJiB0eXBlLmJhc2VUeXBlID09IGNvbnN0IEFueVR5cGUoKSkgewogICAgICByZXR1cm4gYXJnOwogICAgfQogICAgTmFycm93IG5hcnJvdyA9IG5ldyBOYXJyb3coYXJnLCB0eXBlKTsKICAgIF9zdW1tYXJ5LmFkZChuYXJyb3cpOwogICAgcmV0dXJuIG5hcnJvdzsKICB9CgogIC8vIEFkZCBhbiBhcnRpZmljaWFsIHVzZSBvZiBnaXZlbiBleHByZXNzaW9uIGluIG9yZGVyIHRvIG1ha2UgaXQgcG9zc2libGUgdG8KICAvLyBpbmZlciBpdHMgdHlwZSBldmVuIGlmIGl0IGlzIG5vdCB1c2VkIGluIGEgc3VtbWFyeS4KICB2b2lkIF9hZGRVc2UoVHlwZUV4cHIgYXJnKSB7CiAgICBpZiAoYXJnIGlzIE5hcnJvdykgewogICAgICBfYWRkVXNlKGFyZy5hcmcpOwogICAgfSBlbHNlIGlmIChhcmcgaXMgSm9pbiB8fCBhcmcgaXMgQ2FsbCB8fCBhcmcgaXMgVHlwZUNoZWNrKSB7CiAgICAgIF9zdW1tYXJ5LmFkZChuZXcgVXNlKGFyZykpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0eChhcmcgaXMgVHlwZSB8fCBhcmcgaXMgUGFyYW1ldGVyKTsKICAgIH0KICB9CgogIERhcnRUeXBlIF9zdGF0aWNEYXJ0VHlwZShFeHByZXNzaW9uIG5vZGUpID0+CiAgICAgIG5vZGUuZ2V0U3RhdGljVHlwZShfc3RhdGljVHlwZUNvbnRleHQpOwoKICBUeXBlIF9zdGF0aWNUeXBlKEV4cHJlc3Npb24gbm9kZSkgPT4KICAgICAgX3R5cGVzQnVpbGRlci5mcm9tU3RhdGljVHlwZShfc3RhdGljRGFydFR5cGUobm9kZSksIHRydWUpOwoKICBDb25jcmV0ZVR5cGUgX2NhY2hlZEJvb2xUeXBlOwogIENvbmNyZXRlVHlwZSBnZXQgX2Jvb2xUeXBlID0+IF9jYWNoZWRCb29sVHlwZSA/Pz0KICAgICAgX2VudHJ5UG9pbnRzTGlzdGVuZXIuYWRkQWxsb2NhdGVkQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcy5ib29sQ2xhc3MpOwoKICBDb25jcmV0ZVR5cGUgX2NhY2hlZEJvb2xUcnVlOwogIENvbmNyZXRlVHlwZSBnZXQgX2Jvb2xUcnVlID0+IF9jYWNoZWRCb29sVHJ1ZSA/Pz0KICAgICAgbmV3IENvbmNyZXRlVHlwZShfYm9vbFR5cGUuY2xzLCBudWxsLCBCb29sQ29uc3RhbnQodHJ1ZSkpOwoKICBDb25jcmV0ZVR5cGUgX2NhY2hlZEJvb2xGYWxzZTsKICBDb25jcmV0ZVR5cGUgZ2V0IF9ib29sRmFsc2UgPT4gX2NhY2hlZEJvb2xGYWxzZSA/Pz0KICAgICAgbmV3IENvbmNyZXRlVHlwZShfYm9vbFR5cGUuY2xzLCBudWxsLCBCb29sQ29uc3RhbnQoZmFsc2UpKTsKCiAgVHlwZSBfY2FjaGVkRG91YmxlVHlwZTsKICBUeXBlIGdldCBfZG91YmxlVHlwZSA9PiBfY2FjaGVkRG91YmxlVHlwZSA/Pz0gbmV3IENvbmVUeXBlKAogICAgICBfdHlwZXNCdWlsZGVyLmdldFRGQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcy5kb3VibGVDbGFzcykpOwoKICBUeXBlIF9jYWNoZWRJbnRUeXBlOwogIFR5cGUgZ2V0IF9pbnRUeXBlID0+IF9jYWNoZWRJbnRUeXBlID8/PQogICAgICBuZXcgQ29uZVR5cGUoX3R5cGVzQnVpbGRlci5nZXRURkNsYXNzKF9lbnZpcm9ubWVudC5jb3JlVHlwZXMuaW50Q2xhc3MpKTsKCiAgVHlwZSBfY2FjaGVkU3RyaW5nVHlwZTsKICBUeXBlIGdldCBfc3RyaW5nVHlwZSA9PiBfY2FjaGVkU3RyaW5nVHlwZSA/Pz0gbmV3IENvbmVUeXBlKAogICAgICBfdHlwZXNCdWlsZGVyLmdldFRGQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcy5zdHJpbmdDbGFzcykpOwoKICBUeXBlIF9jYWNoZWRTeW1ib2xUeXBlOwogIFR5cGUgZ2V0IF9zeW1ib2xUeXBlID0+IF9jYWNoZWRTeW1ib2xUeXBlID8/PSBuZXcgQ29uZVR5cGUoCiAgICAgIF90eXBlc0J1aWxkZXIuZ2V0VEZDbGFzcyhfZW52aXJvbm1lbnQuY29yZVR5cGVzLnN5bWJvbENsYXNzKSk7CgogIFR5cGUgX2NhY2hlZFR5cGVUeXBlOwogIFR5cGUgZ2V0IF90eXBlVHlwZSA9PiBfY2FjaGVkVHlwZVR5cGUgPz89CiAgICAgIG5ldyBDb25lVHlwZShfdHlwZXNCdWlsZGVyLmdldFRGQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcy50eXBlQ2xhc3MpKTsKCiAgVHlwZSBfY2FjaGVkTnVsbFR5cGU7CiAgVHlwZSBnZXQgX251bGxUeXBlID0+CiAgICAgIF9jYWNoZWROdWxsVHlwZSA/Pz0gbmV3IFR5cGUubnVsbGFibGUoY29uc3QgRW1wdHlUeXBlKCkpOwoKICBDbGFzcyBnZXQgX3N1cGVyY2xhc3MgPT4gX3N0YXRpY1R5cGVDb250ZXh0LnRoaXNUeXBlLmNsYXNzTm9kZS5zdXBlcmNsYXNzOwoKICBUeXBlIF9ib29sTGl0ZXJhbFR5cGUoYm9vbCB2YWx1ZSkgPT4gdmFsdWUgPyBfYm9vbFRydWUgOiBfYm9vbEZhbHNlOwoKICBUeXBlIF9pbnRMaXRlcmFsVHlwZShpbnQgdmFsdWUsIENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBmaW5hbCBDbGFzcyBjb25jcmV0ZUNsYXNzID0KICAgICAgICB0YXJnZXQuY29uY3JldGVJbnRMaXRlcmFsQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcywgdmFsdWUpOwogICAgaWYgKGNvbmNyZXRlQ2xhc3MgIT0gbnVsbCkgewogICAgICBjb25zdGFudCA/Pz0gSW50Q29uc3RhbnQodmFsdWUpOwogICAgICByZXR1cm4gbmV3IENvbmNyZXRlVHlwZSgKICAgICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLmFkZEFsbG9jYXRlZENsYXNzKGNvbmNyZXRlQ2xhc3MpLmNscywKICAgICAgICAgIG51bGwsCiAgICAgICAgICBjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gX2ludFR5cGU7CiAgfQoKICBUeXBlIF9kb3VibGVMaXRlcmFsVHlwZShkb3VibGUgdmFsdWUsIENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBmaW5hbCBDbGFzcyBjb25jcmV0ZUNsYXNzID0KICAgICAgICB0YXJnZXQuY29uY3JldGVEb3VibGVMaXRlcmFsQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcywgdmFsdWUpOwogICAgaWYgKGNvbmNyZXRlQ2xhc3MgIT0gbnVsbCkgewogICAgICBjb25zdGFudCA/Pz0gRG91YmxlQ29uc3RhbnQodmFsdWUpOwogICAgICByZXR1cm4gbmV3IENvbmNyZXRlVHlwZSgKICAgICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLmFkZEFsbG9jYXRlZENsYXNzKGNvbmNyZXRlQ2xhc3MpLmNscywKICAgICAgICAgIG51bGwsCiAgICAgICAgICBjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gX2RvdWJsZVR5cGU7CiAgfQoKICBUeXBlIF9zdHJpbmdMaXRlcmFsVHlwZShTdHJpbmcgdmFsdWUsIENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBmaW5hbCBDbGFzcyBjb25jcmV0ZUNsYXNzID0KICAgICAgICB0YXJnZXQuY29uY3JldGVTdHJpbmdMaXRlcmFsQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcywgdmFsdWUpOwogICAgaWYgKGNvbmNyZXRlQ2xhc3MgIT0gbnVsbCkgewogICAgICBjb25zdGFudCA/Pz0gU3RyaW5nQ29uc3RhbnQodmFsdWUpOwogICAgICByZXR1cm4gbmV3IENvbmNyZXRlVHlwZSgKICAgICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLmFkZEFsbG9jYXRlZENsYXNzKGNvbmNyZXRlQ2xhc3MpLmNscywKICAgICAgICAgIG51bGwsCiAgICAgICAgICBjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gX3N0cmluZ1R5cGU7CiAgfQoKICB2b2lkIF9oYW5kbGVOZXN0ZWRGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUpIHsKICAgIGZpbmFsIHNhdmVkUmV0dXJuID0gX3JldHVyblZhbHVlOwogICAgX3JldHVyblZhbHVlID0gbnVsbDsKICAgIGZpbmFsIHNhdmVkVmFyaWFibGVWYWx1ZXMgPSBfdmFyaWFibGVWYWx1ZXM7CiAgICBfdmFyaWFibGVWYWx1ZXMgPSBfbWFrZUVtcHR5VmFyaWFibGVWYWx1ZXMoKTsKCiAgICAvLyBBcHByb3hpbWF0ZSBwYXJhbWV0ZXJzIG9mIG5lc3RlZCBmdW5jdGlvbnMgd2l0aCBzdGF0aWMgdHlwZXMuCiAgICAvLyBUT0RPKHNqaW5kZWwvdGZhKTogVXNlIFR5cGVDaGVjayBmb3IgY2xvc3VyZSBwYXJhbWV0ZXJzLgogICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5mb3JFYWNoKF9kZWNsYXJlVmFyaWFibGVXaXRoU3RhdGljVHlwZSk7CiAgICBub2RlLm5hbWVkUGFyYW1ldGVycy5mb3JFYWNoKF9kZWNsYXJlVmFyaWFibGVXaXRoU3RhdGljVHlwZSk7CgogICAgX3Zpc2l0KG5vZGUuYm9keSk7CgogICAgX3ZhcmlhYmxlVmFsdWVzID0gc2F2ZWRWYXJpYWJsZVZhbHVlczsKICAgIF9yZXR1cm5WYWx1ZSA9IHNhdmVkUmV0dXJuOwogIH0KCiAgLy8gVGVzdHMgc3VidHlwZXMgaWdub3JpbmcgYW55IG51bGxhYmlsaXRpZXMuCiAgYm9vbCBfaXNTdWJ0eXBlKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgPT4gX2Vudmlyb25tZW50CiAgICAgIC5pc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKCiAgc3RhdGljIGZpbmFsIE5hbWUgX2VxdWFsc05hbWUgPSBuZXcgTmFtZSgnPT0nKTsKICBmaW5hbCBfY2FjaGVkSGFzT3ZlcnJpZGRlbkVxdWFscyA9IDxDbGFzcywgYm9vbD57fTsKCiAgYm9vbCBfaGFzT3ZlcnJpZGRlbkVxdWFscyhEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGZpbmFsIENsYXNzIGNscyA9IHR5cGUuY2xhc3NOb2RlOwogICAgICBmaW5hbCBjYWNoZWRSZXN1bHQgPSBfY2FjaGVkSGFzT3ZlcnJpZGRlbkVxdWFsc1tjbHNdOwogICAgICBpZiAoY2FjaGVkUmVzdWx0ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0OwogICAgICB9CiAgICAgIGZvciAoQ2xhc3MgYwogICAgICAgICAgaW4gX2hpZXJhcmNoeS5jb21wdXRlU3VidHlwZXNJbmZvcm1hdGlvbigpLmdldFN1YnR5cGVzT2YoY2xzKSkgewogICAgICAgIGlmICghYy5pc0Fic3RyYWN0KSB7CiAgICAgICAgICBmaW5hbCBjYW5kaWRhdGUgPSBfaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGMsIF9lcXVhbHNOYW1lKTsKICAgICAgICAgIGFzc2VydHgoY2FuZGlkYXRlICE9IG51bGwpOwogICAgICAgICAgYXNzZXJ0eCghY2FuZGlkYXRlLmlzQWJzdHJhY3QpOwogICAgICAgICAgaWYgKGNhbmRpZGF0ZSAhPSBfZW52aXJvbm1lbnQuY29yZVR5cGVzLm9iamVjdEVxdWFscykgewogICAgICAgICAgICBfY2FjaGVkSGFzT3ZlcnJpZGRlbkVxdWFsc1tjbHNdID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIF9jYWNoZWRIYXNPdmVycmlkZGVuRXF1YWxzW2Nsc10gPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBWaXNpdHMgYm9vbCBleHByZXNzaW9uIGFuZCB1cGRhdGVzIHRydWVTdGF0ZSBhbmQgZmFsc2VTdGF0ZSB3aXRoCiAgLy8gdmFyaWFibGUgdmFsdWVzIGluIGNhc2Ugb2YgYHRydWVgIGFuZCBgZmFsc2VgIG91dGNvbWVzLgogIC8vIE9uIGVudHJ5IF92YXJpYWJsZVZhbHVlcywgdHJ1ZVN0YXRlIGFuZCBmYWxzZVN0YXRlIHNob3VsZCBiZSB0aGUgc2FtZS4KICAvLyBPbiBleGl0IF92YXJpYWJsZVZhbHVlcyBpcyBudWxsLCBzbyBjYWxsZXIgc2hvdWxkIGV4cGxpY2l0bHkgcGljawogIC8vIGVpdGhlciB0cnVlU3RhdGUgb3IgZmFsc2VTdGF0ZS4KICB2b2lkIF92aXNpdENvbmRpdGlvbigKICAgICAgRXhwcmVzc2lvbiBub2RlLCBMaXN0PFR5cGVFeHByPiB0cnVlU3RhdGUsIExpc3Q8VHlwZUV4cHI+IGZhbHNlU3RhdGUpIHsKICAgIGFzc2VydHgoX2lzSWRlbnRpY2FsU3RhdGUoX3ZhcmlhYmxlVmFsdWVzLCB0cnVlU3RhdGUpKTsKICAgIGFzc2VydHgoX2lzSWRlbnRpY2FsU3RhdGUoX3ZhcmlhYmxlVmFsdWVzLCBmYWxzZVN0YXRlKSk7CiAgICBpZiAobm9kZSBpcyBOb3QpIHsKICAgICAgX3Zpc2l0Q29uZGl0aW9uKG5vZGUub3BlcmFuZCwgZmFsc2VTdGF0ZSwgdHJ1ZVN0YXRlKTsKICAgICAgX3ZhcmlhYmxlVmFsdWVzID0gbnVsbDsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChub2RlIGlzIExvZ2ljYWxFeHByZXNzaW9uKSB7CiAgICAgIGFzc2VydHgobm9kZS5vcGVyYXRvciA9PSAnfHwnIHx8IG5vZGUub3BlcmF0b3IgPT0gJyYmJyk7CiAgICAgIGZpbmFsIGlzT1IgPSAobm9kZS5vcGVyYXRvciA9PSAnfHwnKTsKICAgICAgX3Zpc2l0Q29uZGl0aW9uKG5vZGUubGVmdCwgdHJ1ZVN0YXRlLCBmYWxzZVN0YXRlKTsKICAgICAgaWYgKGlzT1IpIHsKICAgICAgICAvLyBleHByMSB8fCBleHByMgogICAgICAgIF92YXJpYWJsZVZhbHVlcyA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKGZhbHNlU3RhdGUpOwogICAgICAgIGZpbmFsIHRydWVTdGF0ZUFmdGVyUkhTID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzKTsKICAgICAgICBfdmlzaXRDb25kaXRpb24obm9kZS5yaWdodCwgdHJ1ZVN0YXRlQWZ0ZXJSSFMsIGZhbHNlU3RhdGUpOwogICAgICAgIF9tZXJnZVZhcmlhYmxlVmFsdWVzKHRydWVTdGF0ZSwgdHJ1ZVN0YXRlQWZ0ZXJSSFMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGV4cHIxICYmIGV4cHIyCiAgICAgICAgX3ZhcmlhYmxlVmFsdWVzID0gX2Nsb25lVmFyaWFibGVWYWx1ZXModHJ1ZVN0YXRlKTsKICAgICAgICBmaW5hbCBmYWxzZVN0YXRlQWZ0ZXJSSFMgPSBfY2xvbmVWYXJpYWJsZVZhbHVlcyhfdmFyaWFibGVWYWx1ZXMpOwogICAgICAgIF92aXNpdENvbmRpdGlvbihub2RlLnJpZ2h0LCB0cnVlU3RhdGUsIGZhbHNlU3RhdGVBZnRlclJIUyk7CiAgICAgICAgX21lcmdlVmFyaWFibGVWYWx1ZXMoZmFsc2VTdGF0ZSwgZmFsc2VTdGF0ZUFmdGVyUkhTKTsKICAgICAgfQogICAgICBfdmFyaWFibGVWYWx1ZXMgPSBudWxsOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKG5vZGUgaXMgVmFyaWFibGVHZXQgfHwKICAgICAgICAobm9kZSBpcyBBc0V4cHJlc3Npb24gJiYgbm9kZS5vcGVyYW5kIGlzIFZhcmlhYmxlR2V0KSkgewogICAgICAvLyAneCcgb3IgJ3ggYXN7VHlwZUVycm9yfSBjb3JlOjpib29sJywgd2hlcmUgeCBpcyBhIHZhcmlhYmxlLgogICAgICBfYWRkVXNlKF92aXNpdChub2RlKSk7CiAgICAgIGZpbmFsIHZhcmlhYmxlR2V0ID0KICAgICAgICAgIChub2RlIGlzIEFzRXhwcmVzc2lvbiA/IG5vZGUub3BlcmFuZCA6IG5vZGUpIGFzIFZhcmlhYmxlR2V0OwogICAgICBmaW5hbCBpbnQgdmFySW5kZXggPSBfdmFyaWFibGVzSW5mby52YXJJbmRleFt2YXJpYWJsZUdldC52YXJpYWJsZV07CiAgICAgIGlmIChfdmFyaWFibGVDZWxsc1t2YXJJbmRleF0gPT0gbnVsbCkgewogICAgICAgIHRydWVTdGF0ZVt2YXJJbmRleF0gPSBfYm9vbFRydWU7CiAgICAgICAgZmFsc2VTdGF0ZVt2YXJJbmRleF0gPSBfYm9vbEZhbHNlOwogICAgICB9CiAgICAgIF92YXJpYWJsZVZhbHVlcyA9IG51bGw7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAobm9kZSBpcyBNZXRob2RJbnZvY2F0aW9uICYmCiAgICAgICAgbm9kZS5yZWNlaXZlciBpcyBWYXJpYWJsZUdldCAmJgogICAgICAgIG5vZGUubmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgYXNzZXJ0eChub2RlLmFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA9PSAxICYmCiAgICAgICAgICBub2RlLmFyZ3VtZW50cy50eXBlcy5pc0VtcHR5ICYmCiAgICAgICAgICBub2RlLmFyZ3VtZW50cy5uYW1lZC5pc0VtcHR5KTsKICAgICAgZmluYWwgbGhzID0gbm9kZS5yZWNlaXZlciBhcyBWYXJpYWJsZUdldDsKICAgICAgZmluYWwgcmhzID0gbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5zaW5nbGU7CiAgICAgIGlmIChyaHMgaXMgTnVsbExpdGVyYWwpIHsKICAgICAgICAvLyAneCA9PSBudWxsJywgd2hlcmUgeCBpcyBhIHZhcmlhYmxlLgogICAgICAgIF9hZGRVc2UoX3Zpc2l0KG5vZGUpKTsKICAgICAgICBmaW5hbCBpbnQgdmFySW5kZXggPSBfdmFyaWFibGVzSW5mby52YXJJbmRleFtsaHMudmFyaWFibGVdOwogICAgICAgIGlmIChfdmFyaWFibGVDZWxsc1t2YXJJbmRleF0gPT0gbnVsbCkgewogICAgICAgICAgdHJ1ZVN0YXRlW3ZhckluZGV4XSA9IF9udWxsVHlwZTsKICAgICAgICAgIGZhbHNlU3RhdGVbdmFySW5kZXhdID0gX21ha2VOYXJyb3coX3Zpc2l0KGxocyksIGNvbnN0IEFueVR5cGUoKSk7CiAgICAgICAgfQogICAgICAgIF92YXJpYWJsZVZhbHVlcyA9IG51bGw7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKChyaHMgaXMgSW50TGl0ZXJhbCAmJgogICAgICAgICAgICAgIF9pc1N1YnR5cGUobGhzLnZhcmlhYmxlLnR5cGUsCiAgICAgICAgICAgICAgICAgIF9lbnZpcm9ubWVudC5jb3JlVHlwZXMuaW50TGVnYWN5UmF3VHlwZSkpIHx8CiAgICAgICAgICAocmhzIGlzIFN0cmluZ0xpdGVyYWwgJiYKICAgICAgICAgICAgICBfaXNTdWJ0eXBlKGxocy52YXJpYWJsZS50eXBlLAogICAgICAgICAgICAgICAgICBfZW52aXJvbm1lbnQuY29yZVR5cGVzLnN0cmluZ0xlZ2FjeVJhd1R5cGUpKSB8fAogICAgICAgICAgKHJocyBpcyBDb25zdGFudEV4cHJlc3Npb24gJiYKICAgICAgICAgICAgICAhX2hhc092ZXJyaWRkZW5FcXVhbHMobGhzLnZhcmlhYmxlLnR5cGUpKSkgewogICAgICAgIC8vICd4ID09IGMnLCB3aGVyZSB4IGlzIGEgdmFyaWFibGUgYW5kIGMgaXMgYSBjb25zdGFudC4KICAgICAgICBfYWRkVXNlKF92aXNpdChub2RlKSk7CiAgICAgICAgZmluYWwgaW50IHZhckluZGV4ID0gX3ZhcmlhYmxlc0luZm8udmFySW5kZXhbbGhzLnZhcmlhYmxlXTsKICAgICAgICBpZiAoX3ZhcmlhYmxlQ2VsbHNbdmFySW5kZXhdID09IG51bGwpIHsKICAgICAgICAgIHRydWVTdGF0ZVt2YXJJbmRleF0gPSBfdmlzaXQocmhzKTsKICAgICAgICB9CiAgICAgICAgX3ZhcmlhYmxlVmFsdWVzID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZSBpcyBJc0V4cHJlc3Npb24gJiYgbm9kZS5vcGVyYW5kIGlzIFZhcmlhYmxlR2V0KSB7CiAgICAgIC8vIEhhbmRsZSAneCBpcyBUJywgd2hlcmUgeCBpcyBhIHZhcmlhYmxlLgogICAgICBmaW5hbCBvcGVyYW5kID0gbm9kZS5vcGVyYW5kIGFzIFZhcmlhYmxlR2V0OwogICAgICBfYWRkVXNlKF92aXNpdChvcGVyYW5kKSk7CiAgICAgIGZpbmFsIGludCB2YXJJbmRleCA9IF92YXJpYWJsZXNJbmZvLnZhckluZGV4W29wZXJhbmQudmFyaWFibGVdOwogICAgICBpZiAoX3ZhcmlhYmxlQ2VsbHNbdmFySW5kZXhdID09IG51bGwpIHsKICAgICAgICB0cnVlU3RhdGVbdmFySW5kZXhdID0gX21ha2VOYXJyb3coCiAgICAgICAgICAgIF92aXNpdChvcGVyYW5kKSwgX3R5cGVzQnVpbGRlci5mcm9tU3RhdGljVHlwZShub2RlLnR5cGUsIGZhbHNlKSk7CiAgICAgIH0KICAgICAgX3ZhcmlhYmxlVmFsdWVzID0gbnVsbDsKICAgICAgcmV0dXJuOwogICAgfQogICAgX2FkZFVzZShfdmlzaXQobm9kZSkpOwogICAgX2NvcHlWYXJpYWJsZVZhbHVlcyh0cnVlU3RhdGUsIF92YXJpYWJsZVZhbHVlcyk7CiAgICBfY29weVZhcmlhYmxlVmFsdWVzKGZhbHNlU3RhdGUsIF92YXJpYWJsZVZhbHVlcyk7CiAgICBfdmFyaWFibGVWYWx1ZXMgPSBudWxsOwogIH0KCiAgdm9pZCBfdXBkYXRlUmVjZWl2ZXJBZnRlckNhbGwoCiAgICAgIFRyZWVOb2RlIHJlY2VpdmVyTm9kZSwgVHlwZUV4cHIgcmVjZWl2ZXJWYWx1ZSwgTmFtZSBzZWxlY3RvciwKICAgICAge2Jvb2wgaXNTZXR0ZXIgPSBmYWxzZX0pIHsKICAgIGlmIChyZWNlaXZlck5vZGUgaXMgVmFyaWFibGVHZXQpIHsKICAgICAgZmluYWwgbnVsbFNlbGVjdG9ycyA9IGlzU2V0dGVyID8gX251bGxTZXR0ZXJzIDogX251bGxNZXRob2RzQW5kR2V0dGVyczsKICAgICAgaWYgKCFudWxsU2VsZWN0b3JzLmNvbnRhaW5zKHNlbGVjdG9yKSkgewogICAgICAgIGZpbmFsIGludCB2YXJJbmRleCA9IF92YXJpYWJsZXNJbmZvLnZhckluZGV4W3JlY2VpdmVyTm9kZS52YXJpYWJsZV07CiAgICAgICAgaWYgKF92YXJpYWJsZUNlbGxzW3ZhckluZGV4XSA9PSBudWxsKSB7CiAgICAgICAgICBfdmFyaWFibGVWYWx1ZXNbdmFySW5kZXhdID0KICAgICAgICAgICAgICBfbWFrZU5hcnJvdyhyZWNlaXZlclZhbHVlLCBjb25zdCBBbnlUeXBlKCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdFRyZWVOb2RlKFRyZWVOb2RlIG5vZGUpID0+CiAgICAgIHRocm93ICdVbmV4cGVjdGVkIG5vZGUgJHtub2RlLnJ1bnRpbWVUeXBlfTogJG5vZGUgYXQgJHtub2RlLmxvY2F0aW9ufSc7CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0QXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBvcGVyYW5kTm9kZSA9IG5vZGUub3BlcmFuZDsKICAgIGZpbmFsIFR5cGVFeHByIG9wZXJhbmQgPSBfdmlzaXQob3BlcmFuZE5vZGUpOwogICAgZmluYWwgVHlwZUV4cHIgcmVzdWx0ID0gX3R5cGVDaGVjayhvcGVyYW5kLCBub2RlLnR5cGUsIG5vZGUpOwogICAgZXhwbGljaXRDYXN0c1tub2RlXSA9IHJlc3VsdDsKICAgIGlmIChvcGVyYW5kTm9kZSBpcyBWYXJpYWJsZUdldCkgewogICAgICBmaW5hbCBpbnQgdmFySW5kZXggPSBfdmFyaWFibGVzSW5mby52YXJJbmRleFtvcGVyYW5kTm9kZS52YXJpYWJsZV07CiAgICAgIGlmIChfdmFyaWFibGVDZWxsc1t2YXJJbmRleF0gPT0gbnVsbCkgewogICAgICAgIF92YXJpYWJsZVZhbHVlc1t2YXJJbmRleF0gPSByZXN1bHQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBfYm9vbExpdGVyYWxUeXBlKG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRJbnRMaXRlcmFsKEludExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIF9pbnRMaXRlcmFsVHlwZShub2RlLnZhbHVlLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBfZG91YmxlTGl0ZXJhbFR5cGUobm9kZS52YWx1ZSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgZmluYWwgdHJ1ZVN0YXRlID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzKTsKICAgIGZpbmFsIGZhbHNlU3RhdGUgPSBfY2xvbmVWYXJpYWJsZVZhbHVlcyhfdmFyaWFibGVWYWx1ZXMpOwogICAgX3Zpc2l0Q29uZGl0aW9uKG5vZGUuY29uZGl0aW9uLCB0cnVlU3RhdGUsIGZhbHNlU3RhdGUpOwoKICAgIGZpbmFsIEpvaW4gdiA9IG5ldyBKb2luKG51bGwsIF9zdGF0aWNEYXJ0VHlwZShub2RlKSk7CiAgICBfc3VtbWFyeS5hZGQodik7CgogICAgX3ZhcmlhYmxlVmFsdWVzID0gdHJ1ZVN0YXRlOwogICAgdi52YWx1ZXMuYWRkKF92aXNpdChub2RlLnRoZW4pKTsKICAgIGZpbmFsIHN0YXRlQWZ0ZXIgPSBfdmFyaWFibGVWYWx1ZXM7CgogICAgX3ZhcmlhYmxlVmFsdWVzID0gZmFsc2VTdGF0ZTsKICAgIHYudmFsdWVzLmFkZChfdmlzaXQobm9kZS5vdGhlcndpc2UpKTsKCiAgICBfbWVyZ2VWYXJpYWJsZVZhbHVlcyhzdGF0ZUFmdGVyLCBfdmFyaWFibGVWYWx1ZXMpOwogICAgX3ZhcmlhYmxlVmFsdWVzID0gc3RhdGVBZnRlcjsKICAgIHJldHVybiBfbWFrZU5hcnJvdyh2LCBfc3RhdGljVHlwZShub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgQ29uY3JldGVUeXBlIGtsYXNzID0KICAgICAgICBfZW50cnlQb2ludHNMaXN0ZW5lci5hZGRBbGxvY2F0ZWRDbGFzcyhub2RlLmNvbnN0cnVjdGVkVHlwZS5jbGFzc05vZGUpOwogICAgVHlwZUV4cHIgcmVjZWl2ZXIgPQogICAgICAgIF90cmFuc2xhdG9yLmluc3RhbnRpYXRlQ29uY3JldGVUeXBlKGtsYXNzLCBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgICBmaW5hbCBhcmdzID0gX3Zpc2l0QXJndW1lbnRzKHJlY2VpdmVyLCBub2RlLmFyZ3VtZW50cyk7CiAgICBfbWFrZUNhbGwobm9kZSwgbmV3IERpcmVjdFNlbGVjdG9yKG5vZGUudGFyZ2V0KSwgYXJncyk7CiAgICByZXR1cm4gcmVjZWl2ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBmaW5hbCByZWNlaXZlciA9IF92aXNpdChub2RlLnJlY2VpdmVyKTsKICAgIGZpbmFsIGFyZ3MgPSBfdmlzaXRBcmd1bWVudHMocmVjZWl2ZXIsIG5vZGUuYXJndW1lbnRzKTsKICAgIGZpbmFsIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgYXNzZXJ0eCh0YXJnZXQgaXMhIEZpZWxkKTsKICAgIGFzc2VydHgoIXRhcmdldC5pc0dldHRlciAmJiAhdGFyZ2V0LmlzU2V0dGVyKTsKICAgIGlmIChyZWNlaXZlciBpcyBUaGlzRXhwcmVzc2lvbikgewogICAgICBfZW50cnlQb2ludHNMaXN0ZW5lci5yZWNvcmRNZW1iZXJDYWxsZWRWaWFUaGlzKHRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBDb25zZXJ2YXRpdmVseSByZWNvcmQgZGlyZWN0IGludm9jYXRpb25zIHdpdGggbm9uLXRoaXMgcmVjZWl2ZXIKICAgICAgLy8gYXMgYmVpbmcgZG9uZSB2aWEgaW50ZXJmYWNlIHNlbGVjdG9ycy4KICAgICAgX2VudHJ5UG9pbnRzTGlzdGVuZXIucmVjb3JkTWVtYmVyQ2FsbGVkVmlhSW50ZXJmYWNlU2VsZWN0b3IodGFyZ2V0KTsKICAgIH0KICAgIHJldHVybiBfbWFrZUNhbGwobm9kZSwgbmV3IERpcmVjdFNlbGVjdG9yKHRhcmdldCksIGFyZ3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBmaW5hbCByZWNlaXZlciA9IF92aXNpdChub2RlLnJlY2VpdmVyKTsKICAgIGZpbmFsIGFyZ3MgPSBuZXcgQXJnczxUeXBlRXhwcj4oW3JlY2VpdmVyXSk7CiAgICBmaW5hbCB0YXJnZXQgPSBub2RlLnRhcmdldDsKICAgIC8vIE5vIG5lZWQgdG8gcmVjb3JkIHRoaXMgaW52b2NhdGlvbiBhcyBwZXJmb3JtZWQgdmlhIHRoaXMgb3IgdmlhIGludGVyZmFjZQogICAgLy8gc2VsZWN0b3IgYXMgUHJvcGVydHlHZXQgaW52b2NhdGlvbnMgYXJlIG5vdCB0cmFja2VkIGF0IGFsbC4KICAgIHJldHVybiBfbWFrZUNhbGwoCiAgICAgICAgbm9kZSwgbmV3IERpcmVjdFNlbGVjdG9yKHRhcmdldCwgY2FsbEtpbmQ6IENhbGxLaW5kLlByb3BlcnR5R2V0KSwgYXJncyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGZpbmFsIHJlY2VpdmVyID0gX3Zpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgZmluYWwgdmFsdWUgPSBfdmlzaXQobm9kZS52YWx1ZSk7CiAgICBmaW5hbCBhcmdzID0gbmV3IEFyZ3M8VHlwZUV4cHI+KFtyZWNlaXZlciwgdmFsdWVdKTsKICAgIGZpbmFsIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgYXNzZXJ0eCgodGFyZ2V0IGlzIEZpZWxkKSB8fCAoKHRhcmdldCBpcyBQcm9jZWR1cmUpICYmIHRhcmdldC5pc1NldHRlcikpOwogICAgaWYgKHJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLnJlY29yZE1lbWJlckNhbGxlZFZpYVRoaXModGFyZ2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIENvbnNlcnZhdGl2ZWx5IHJlY29yZCBkaXJlY3QgaW52b2NhdGlvbnMgd2l0aCBub24tdGhpcyByZWNlaXZlcgogICAgICAvLyBhcyBiZWluZyBkb25lIHZpYSBpbnRlcmZhY2Ugc2VsZWN0b3JzLgogICAgICBfZW50cnlQb2ludHNMaXN0ZW5lci5yZWNvcmRNZW1iZXJDYWxsZWRWaWFJbnRlcmZhY2VTZWxlY3Rvcih0YXJnZXQpOwogICAgfQogICAgX21ha2VDYWxsKAogICAgICAgIG5vZGUsIG5ldyBEaXJlY3RTZWxlY3Rvcih0YXJnZXQsIGNhbGxLaW5kOiBDYWxsS2luZC5Qcm9wZXJ0eVNldCksIGFyZ3MpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIF9oYW5kbGVOZXN0ZWRGdW5jdGlvbk5vZGUobm9kZS5mdW5jdGlvbik7CiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBzdXBwb3J0IGZ1bmN0aW9uIHR5cGVzLgogICAgLy8gcmV0dXJuIF9jb25jcmV0ZVR5cGUobm9kZS5mdW5jdGlvbi5mdW5jdGlvblR5cGUpOwogICAgcmV0dXJuIF9zdGF0aWNUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgewogICAgX3Zpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICAvLyBUT0RPKGFsZXhtYXJrb3YpOiBzdXBwb3J0IGdlbmVyaWMgJiBmdW5jdGlvbiB0eXBlcy4KICAgIHJldHVybiBfc3RhdGljVHlwZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIGNvbnN0IEVtcHR5VHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIF92aXNpdChub2RlLm9wZXJhbmQpOwogICAgcmV0dXJuIF9ib29sVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0TGV0KExldCBub2RlKSB7CiAgICBfZGVjbGFyZVZhcmlhYmxlKG5vZGUudmFyaWFibGUsIF92aXNpdChub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyKSk7CiAgICByZXR1cm4gX3Zpc2l0KG5vZGUuYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdEJsb2NrRXhwcmVzc2lvbihCbG9ja0V4cHJlc3Npb24gbm9kZSkgewogICAgX3Zpc2l0KG5vZGUuYm9keSk7CiAgICByZXR1cm4gX3Zpc2l0KG5vZGUudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBub2RlLmV4cHJlc3Npb25zLmZvckVhY2goX3Zpc2l0KTsKICAgIENsYXNzIGNvbmNyZXRlQ2xhc3MgPQogICAgICAgIHRhcmdldC5jb25jcmV0ZUxpc3RMaXRlcmFsQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcyk7CiAgICBpZiAoY29uY3JldGVDbGFzcyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfdHJhbnNsYXRvci5pbnN0YW50aWF0ZUNvbmNyZXRlVHlwZSgKICAgICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLmFkZEFsbG9jYXRlZENsYXNzKGNvbmNyZXRlQ2xhc3MpLAogICAgICAgICAgW25vZGUudHlwZUFyZ3VtZW50XSk7CiAgICB9CiAgICByZXR1cm4gX3N0YXRpY1R5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIGZpbmFsIHRydWVTdGF0ZSA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBmaW5hbCBmYWxzZVN0YXRlID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzKTsKICAgIF92aXNpdENvbmRpdGlvbihub2RlLCB0cnVlU3RhdGUsIGZhbHNlU3RhdGUpOwogICAgX3ZhcmlhYmxlVmFsdWVzID0gdHJ1ZVN0YXRlOwogICAgX21lcmdlVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzLCBmYWxzZVN0YXRlKTsKICAgIHJldHVybiBfYm9vbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICBmb3IgKHZhciBlbnRyeSBpbiBub2RlLmVudHJpZXMpIHsKICAgICAgX3Zpc2l0KGVudHJ5LmtleSk7CiAgICAgIF92aXNpdChlbnRyeS52YWx1ZSk7CiAgICB9CiAgICBDbGFzcyBjb25jcmV0ZUNsYXNzID0KICAgICAgICB0YXJnZXQuY29uY3JldGVNYXBMaXRlcmFsQ2xhc3MoX2Vudmlyb25tZW50LmNvcmVUeXBlcyk7CiAgICBpZiAoY29uY3JldGVDbGFzcyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBfdHJhbnNsYXRvci5pbnN0YW50aWF0ZUNvbmNyZXRlVHlwZSgKICAgICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLmFkZEFsbG9jYXRlZENsYXNzKGNvbmNyZXRlQ2xhc3MpLAogICAgICAgICAgW25vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGVdKTsKICAgIH0KICAgIHJldHVybiBfc3RhdGljVHlwZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGZpbmFsIHJlY2VpdmVyTm9kZSA9IG5vZGUucmVjZWl2ZXI7CiAgICBmaW5hbCByZWNlaXZlciA9IF92aXNpdChyZWNlaXZlck5vZGUpOwogICAgZmluYWwgYXJncyA9IF92aXNpdEFyZ3VtZW50cyhyZWNlaXZlciwgbm9kZS5hcmd1bWVudHMpOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAocmVjZWl2ZXJOb2RlIGlzIENvbnN0YW50RXhwcmVzc2lvbiAmJiBub2RlLm5hbWUubmFtZSA9PSAnW10nKSB7CiAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gcmVjZWl2ZXJOb2RlLmNvbnN0YW50OwogICAgICBpZiAoY29uc3RhbnQgaXMgTGlzdENvbnN0YW50KSB7CiAgICAgICAgcmV0dXJuIF9oYW5kbGVJbmRleGluZ0ludG9MaXN0Q29uc3RhbnQoY29uc3RhbnQpOwogICAgICB9CiAgICB9CiAgICBUeXBlRXhwciByZXN1bHQ7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgaWYgKG5vZGUubmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgICBhc3NlcnR4KGFyZ3MudmFsdWVzLmxlbmd0aCA9PSAyKTsKICAgICAgICBpZiAoKGFyZ3MudmFsdWVzWzBdID09IF9udWxsVHlwZSkgfHwgKGFyZ3MudmFsdWVzWzFdID09IF9udWxsVHlwZSkpIHsKICAgICAgICAgIHJldHVybiBfYm9vbFR5cGU7CiAgICAgICAgfQogICAgICAgIF9tYWtlQ2FsbChub2RlLCBuZXcgRHluYW1pY1NlbGVjdG9yKENhbGxLaW5kLk1ldGhvZCwgbm9kZS5uYW1lKSwgYXJncyk7CiAgICAgICAgcmV0dXJuIG5ldyBUeXBlLm51bGxhYmxlKF9ib29sVHlwZSk7CiAgICAgIH0KICAgICAgaWYgKG5vZGUubmFtZS5uYW1lID09ICdjYWxsJykgewogICAgICAgIGZpbmFsIHJlY3ZUeXBlID0gX3N0YXRpY0RhcnRUeXBlKG5vZGUucmVjZWl2ZXIpOwogICAgICAgIGlmICgocmVjdlR5cGUgaXMgRnVuY3Rpb25UeXBlKSB8fAogICAgICAgICAgICAocmVjdlR5cGUgPT0gX2Vudmlyb25tZW50LmZ1bmN0aW9uTGVnYWN5UmF3VHlwZSkpIHsKICAgICAgICAgIC8vIENhbGwgdG8gYSBGdW5jdGlvbi4KICAgICAgICAgIHJldHVybiBfc3RhdGljVHlwZShub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0ID0gX21ha2VDYWxsKAogICAgICAgICAgbm9kZSwgbmV3IER5bmFtaWNTZWxlY3RvcihDYWxsS2luZC5NZXRob2QsIG5vZGUubmFtZSksIGFyZ3MpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhkYXJ0YnVnLmNvbS8zNDQ5Nyk6IE9uY2UgZnJvbnQtZW5kIGRlc3VnYXJzIGNhbGxzIHZpYQogICAgICAvLyBmaWVsZHMvZ2V0dGVycywgaGFuZGxpbmcgb2YgZmllbGQgYW5kIGdldHRlciB0YXJnZXRzIGhlcmUKICAgICAgLy8gY2FuIGJlIHR1cm5lZCBpbnRvIGFzc2VydGlvbnMuCiAgICAgIGlmICgodGFyZ2V0IGlzIEZpZWxkKSB8fCAoKHRhcmdldCBpcyBQcm9jZWR1cmUpICYmIHRhcmdldC5pc0dldHRlcikpIHsKICAgICAgICAvLyBDYWxsIHZpYSBmaWVsZC9nZXR0ZXIuCiAgICAgICAgZmluYWwgdmFsdWUgPSBfbWFrZUNhbGwoCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIChyZWNlaXZlck5vZGUgaXMgVGhpc0V4cHJlc3Npb24pCiAgICAgICAgICAgICAgICA/IG5ldyBWaXJ0dWFsU2VsZWN0b3IodGFyZ2V0LCBjYWxsS2luZDogQ2FsbEtpbmQuUHJvcGVydHlHZXQpCiAgICAgICAgICAgICAgICA6IG5ldyBJbnRlcmZhY2VTZWxlY3Rvcih0YXJnZXQsIGNhbGxLaW5kOiBDYWxsS2luZC5Qcm9wZXJ0eUdldCksCiAgICAgICAgICAgIG5ldyBBcmdzPFR5cGVFeHByPihbcmVjZWl2ZXJdKSk7CiAgICAgICAgX21ha2VDYWxsKAogICAgICAgICAgICBudWxsLCBEeW5hbWljU2VsZWN0b3Iua0NhbGwsIG5ldyBBcmdzLndpdGhSZWNlaXZlcihhcmdzLCB2YWx1ZSkpOwogICAgICAgIHJlc3VsdCA9IF9zdGF0aWNUeXBlKG5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IG92ZXJsb2FkZWQgYXJpdGhtZXRpYyBvcGVyYXRvcnMKICAgICAgICByZXN1bHQgPSBfbWFrZUNhbGwoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIChub2RlLnJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKQogICAgICAgICAgICAgICAgPyBuZXcgVmlydHVhbFNlbGVjdG9yKHRhcmdldCkKICAgICAgICAgICAgICAgIDogbmV3IEludGVyZmFjZVNlbGVjdG9yKHRhcmdldCksCiAgICAgICAgICAgIGFyZ3MpOwogICAgICB9CiAgICB9CiAgICBfdXBkYXRlUmVjZWl2ZXJBZnRlckNhbGwocmVjZWl2ZXJOb2RlLCByZWNlaXZlciwgbm9kZS5uYW1lKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBUeXBlRXhwciBfaGFuZGxlSW5kZXhpbmdJbnRvTGlzdENvbnN0YW50KExpc3RDb25zdGFudCBsaXN0KSB7CiAgICBmaW5hbCBlbGVtZW50VHlwZXMgPSBuZXcgU2V0PFR5cGU+KCk7CiAgICBmb3IgKHZhciBlbGVtZW50IGluIGxpc3QuZW50cmllcykgewogICAgICBlbGVtZW50VHlwZXMuYWRkKGNvbnN0YW50QWxsb2NhdGlvbkNvbGxlY3Rvci50eXBlRm9yKGVsZW1lbnQpKTsKICAgIH0KICAgIHN3aXRjaCAoZWxlbWVudFR5cGVzLmxlbmd0aCkgewogICAgICBjYXNlIDA6CiAgICAgICAgcmV0dXJuIGNvbnN0IEVtcHR5VHlwZSgpOwogICAgICBjYXNlIDE6CiAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlcy5zaW5nbGU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZmluYWwgam9pbiA9IG5ldyBKb2luKG51bGwsIGxpc3QudHlwZUFyZ3VtZW50KTsKICAgICAgICBqb2luLnZhbHVlcy5hZGRBbGwoZWxlbWVudFR5cGVzKTsKICAgICAgICBfc3VtbWFyeS5hZGQoam9pbik7CiAgICAgICAgcmV0dXJuIGpvaW47CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHZhciByZWNlaXZlciA9IF92aXNpdChub2RlLnJlY2VpdmVyKTsKICAgIHZhciBhcmdzID0gbmV3IEFyZ3M8VHlwZUV4cHI+KFtyZWNlaXZlcl0pOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICBUeXBlRXhwciByZXN1bHQ7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmVzdWx0ID0gX21ha2VDYWxsKAogICAgICAgICAgbm9kZSwgbmV3IER5bmFtaWNTZWxlY3RvcihDYWxsS2luZC5Qcm9wZXJ0eUdldCwgbm9kZS5uYW1lKSwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBfbWFrZUNhbGwoCiAgICAgICAgICBub2RlLAogICAgICAgICAgKG5vZGUucmVjZWl2ZXIgaXMgVGhpc0V4cHJlc3Npb24pCiAgICAgICAgICAgICAgPyBuZXcgVmlydHVhbFNlbGVjdG9yKHRhcmdldCwgY2FsbEtpbmQ6IENhbGxLaW5kLlByb3BlcnR5R2V0KQogICAgICAgICAgICAgIDogbmV3IEludGVyZmFjZVNlbGVjdG9yKHRhcmdldCwgY2FsbEtpbmQ6IENhbGxLaW5kLlByb3BlcnR5R2V0KSwKICAgICAgICAgIGFyZ3MpOwogICAgfQogICAgX3VwZGF0ZVJlY2VpdmVyQWZ0ZXJDYWxsKG5vZGUucmVjZWl2ZXIsIHJlY2VpdmVyLCBub2RlLm5hbWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgdmFyIHJlY2VpdmVyID0gX3Zpc2l0KG5vZGUucmVjZWl2ZXIpOwogICAgdmFyIHZhbHVlID0gX3Zpc2l0KG5vZGUudmFsdWUpOwogICAgdmFyIGFyZ3MgPSBuZXcgQXJnczxUeXBlRXhwcj4oW3JlY2VpdmVyLCB2YWx1ZV0pOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS5pbnRlcmZhY2VUYXJnZXQ7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgX21ha2VDYWxsKAogICAgICAgICAgbm9kZSwgbmV3IER5bmFtaWNTZWxlY3RvcihDYWxsS2luZC5Qcm9wZXJ0eVNldCwgbm9kZS5uYW1lKSwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnR4KCh0YXJnZXQgaXMgRmllbGQpIHx8ICgodGFyZ2V0IGlzIFByb2NlZHVyZSkgJiYgdGFyZ2V0LmlzU2V0dGVyKSk7CiAgICAgIF9tYWtlQ2FsbCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAobm9kZS5yZWNlaXZlciBpcyBUaGlzRXhwcmVzc2lvbikKICAgICAgICAgICAgICA/IG5ldyBWaXJ0dWFsU2VsZWN0b3IodGFyZ2V0LCBjYWxsS2luZDogQ2FsbEtpbmQuUHJvcGVydHlTZXQpCiAgICAgICAgICAgICAgOiBuZXcgSW50ZXJmYWNlU2VsZWN0b3IodGFyZ2V0LCBjYWxsS2luZDogQ2FsbEtpbmQuUHJvcGVydHlTZXQpLAogICAgICAgICAgYXJncyk7CiAgICB9CiAgICBfdXBkYXRlUmVjZWl2ZXJBZnRlckNhbGwobm9kZS5yZWNlaXZlciwgcmVjZWl2ZXIsIG5vZGUubmFtZSwKICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdFN1cGVyTWV0aG9kSW52b2NhdGlvbihTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgYXNzZXJ0eChrUGFydGlhbE1peGluUmVzb2x1dGlvbik7CiAgICBhc3NlcnR4KF9yZWNlaXZlciAhPSBudWxsLCBkZXRhaWxzOiBub2RlKTsKICAgIGZpbmFsIGFyZ3MgPSBfdmlzaXRBcmd1bWVudHMoX3JlY2VpdmVyLCBub2RlLmFyZ3VtZW50cyk7CiAgICAvLyBSZS1yZXNvbHZlIHRhcmdldCBkdWUgdG8gcGFydGlhbCBtaXhpbiByZXNvbHV0aW9uLgogICAgZmluYWwgdGFyZ2V0ID0gX2hpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldChfc3VwZXJjbGFzcywgbm9kZS5uYW1lKTsKICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICByZXR1cm4gY29uc3QgRW1wdHlUeXBlKCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoKHRhcmdldCBpcyBGaWVsZCkgfHwgKCh0YXJnZXQgaXMgUHJvY2VkdXJlKSAmJiB0YXJnZXQuaXNHZXR0ZXIpKSB7CiAgICAgICAgLy8gQ2FsbCB2aWEgZmllbGQvZ2V0dGVyLgogICAgICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IENvbnNpZGVyIGNsZWFuaW5nIHVwIHRoaXMgY29kZSBhcyBpdCBkdXBsaWNhdGVzCiAgICAgICAgLy8gcHJvY2Vzc2luZyBpbiBEaXJlY3RJbnZvY2F0aW9uLgogICAgICAgIGZpbmFsIGZpZWxkVmFsdWUgPSBfbWFrZUNhbGwoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIG5ldyBEaXJlY3RTZWxlY3Rvcih0YXJnZXQsIGNhbGxLaW5kOiBDYWxsS2luZC5Qcm9wZXJ0eUdldCksCiAgICAgICAgICAgIG5ldyBBcmdzPFR5cGVFeHByPihbX3JlY2VpdmVyXSkpOwogICAgICAgIF9tYWtlQ2FsbChudWxsLCBEeW5hbWljU2VsZWN0b3Iua0NhbGwsCiAgICAgICAgICAgIG5ldyBBcmdzLndpdGhSZWNlaXZlcihhcmdzLCBmaWVsZFZhbHVlKSk7CiAgICAgICAgcmV0dXJuIF9zdGF0aWNUeXBlKG5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIF9lbnRyeVBvaW50c0xpc3RlbmVyLnJlY29yZE1lbWJlckNhbGxlZFZpYVRoaXModGFyZ2V0KTsKICAgICAgICByZXR1cm4gX21ha2VDYWxsKG5vZGUsIG5ldyBEaXJlY3RTZWxlY3Rvcih0YXJnZXQpLCBhcmdzKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgYXNzZXJ0eChrUGFydGlhbE1peGluUmVzb2x1dGlvbik7CiAgICBhc3NlcnR4KF9yZWNlaXZlciAhPSBudWxsLCBkZXRhaWxzOiBub2RlKTsKICAgIGZpbmFsIGFyZ3MgPSBuZXcgQXJnczxUeXBlRXhwcj4oW19yZWNlaXZlcl0pOwogICAgLy8gUmUtcmVzb2x2ZSB0YXJnZXQgZHVlIHRvIHBhcnRpYWwgbWl4aW4gcmVzb2x1dGlvbi4KICAgIGZpbmFsIHRhcmdldCA9IF9oaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQoX3N1cGVyY2xhc3MsIG5vZGUubmFtZSk7CiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbnN0IEVtcHR5VHlwZSgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9tYWtlQ2FsbChub2RlLAogICAgICAgICAgbmV3IERpcmVjdFNlbGVjdG9yKHRhcmdldCwgY2FsbEtpbmQ6IENhbGxLaW5kLlByb3BlcnR5R2V0KSwgYXJncyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdFN1cGVyUHJvcGVydHlTZXQoU3VwZXJQcm9wZXJ0eVNldCBub2RlKSB7CiAgICBhc3NlcnR4KGtQYXJ0aWFsTWl4aW5SZXNvbHV0aW9uKTsKICAgIGFzc2VydHgoX3JlY2VpdmVyICE9IG51bGwsIGRldGFpbHM6IG5vZGUpOwogICAgZmluYWwgdmFsdWUgPSBfdmlzaXQobm9kZS52YWx1ZSk7CiAgICBmaW5hbCBhcmdzID0gbmV3IEFyZ3M8VHlwZUV4cHI+KFtfcmVjZWl2ZXIsIHZhbHVlXSk7CiAgICAvLyBSZS1yZXNvbHZlIHRhcmdldCBkdWUgdG8gcGFydGlhbCBtaXhpbiByZXNvbHV0aW9uLgogICAgZmluYWwgdGFyZ2V0ID0KICAgICAgICBfaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KF9zdXBlcmNsYXNzLCBub2RlLm5hbWUsIHNldHRlcjogdHJ1ZSk7CiAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKICAgICAgYXNzZXJ0eCgodGFyZ2V0IGlzIEZpZWxkKSB8fCAoKHRhcmdldCBpcyBQcm9jZWR1cmUpICYmIHRhcmdldC5pc1NldHRlcikpOwogICAgICBfZW50cnlQb2ludHNMaXN0ZW5lci5yZWNvcmRNZW1iZXJDYWxsZWRWaWFUaGlzKHRhcmdldCk7CiAgICAgIF9tYWtlQ2FsbChub2RlLAogICAgICAgICAgbmV3IERpcmVjdFNlbGVjdG9yKHRhcmdldCwgY2FsbEtpbmQ6IENhbGxLaW5kLlByb3BlcnR5U2V0KSwgYXJncyk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdE5vdChOb3Qgbm9kZSkgewogICAgX2FkZFVzZShfdmlzaXQobm9kZS5vcGVyYW5kKSk7CiAgICByZXR1cm4gX2Jvb2xUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gX251bGxUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgX3ZhcmlhYmxlVmFsdWVzID0gX21ha2VFbXB0eVZhcmlhYmxlVmFsdWVzKCk7CiAgICByZXR1cm4gY29uc3QgRW1wdHlUeXBlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgZmluYWwgYXJncyA9IG5ldyBBcmdzPFR5cGVFeHByPihjb25zdCA8VHlwZUV4cHI+W10pOwogICAgZmluYWwgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICByZXR1cm4gX21ha2VDYWxsKAogICAgICAgIG5vZGUsIG5ldyBEaXJlY3RTZWxlY3Rvcih0YXJnZXQsIGNhbGxLaW5kOiBDYWxsS2luZC5Qcm9wZXJ0eUdldCksIGFyZ3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgZmluYWwgYXJncyA9IF92aXNpdEFyZ3VtZW50cyhudWxsLCBub2RlLmFyZ3VtZW50cywKICAgICAgICBwYXNzVHlwZUFyZ3VtZW50czogbm9kZS50YXJnZXQuaXNGYWN0b3J5KTsKICAgIGZpbmFsIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgYXNzZXJ0eCgodGFyZ2V0IGlzISBGaWVsZCkgJiYgIXRhcmdldC5pc0dldHRlciAmJiAhdGFyZ2V0LmlzU2V0dGVyKTsKICAgIHJldHVybiBfbWFrZUNhbGwobm9kZSwgbmV3IERpcmVjdFNlbGVjdG9yKHRhcmdldCksIGFyZ3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IG5vZGUpIHsKICAgIGZpbmFsIHZhbHVlID0gX3Zpc2l0KG5vZGUudmFsdWUpOwogICAgZmluYWwgYXJncyA9IG5ldyBBcmdzPFR5cGVFeHByPihbdmFsdWVdKTsKICAgIGZpbmFsIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgYXNzZXJ0eCgodGFyZ2V0IGlzIEZpZWxkKSB8fCAodGFyZ2V0IGlzIFByb2NlZHVyZSkgJiYgdGFyZ2V0LmlzU2V0dGVyKTsKICAgIF9tYWtlQ2FsbCgKICAgICAgICBub2RlLCBuZXcgRGlyZWN0U2VsZWN0b3IodGFyZ2V0LCBjYWxsS2luZDogQ2FsbEtpbmQuUHJvcGVydHlTZXQpLCBhcmdzKTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0U3RyaW5nQ29uY2F0ZW5hdGlvbihTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIG5vZGUuZXhwcmVzc2lvbnMuZm9yRWFjaChfdmlzaXQpOwogICAgcmV0dXJuIF9zdHJpbmdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIF9zdHJpbmdMaXRlcmFsVHlwZShub2RlLnZhbHVlLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBfc3RhdGljVHlwZShub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgYXNzZXJ0eChfcmVjZWl2ZXIgIT0gbnVsbCwgZGV0YWlsczogbm9kZSk7CiAgICByZXR1cm4gX3JlY2VpdmVyOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRUaHJvdyhUaHJvdyBub2RlKSB7CiAgICBfdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIF92YXJpYWJsZVZhbHVlcyA9IF9tYWtlRW1wdHlWYXJpYWJsZVZhbHVlcygpOwogICAgcmV0dXJuIGNvbnN0IEVtcHR5VHlwZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSB7CiAgICByZXR1cm4gX3R5cGVUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRWYXJpYWJsZUdldChWYXJpYWJsZUdldCBub2RlKSB7CiAgICBmaW5hbCB2ID0gX3ZhcmlhYmxlVmFsdWVzW192YXJpYWJsZXNJbmZvLnZhckluZGV4W25vZGUudmFyaWFibGVdXTsKICAgIGlmICh2ID09IG51bGwpIHsKICAgICAgdGhyb3cgJ1VuYWJsZSB0byBmaW5kIHZhcmlhYmxlICR7bm9kZS52YXJpYWJsZX0gYXQgJHtub2RlLmxvY2F0aW9ufSc7CiAgICB9CgogICAgaWYgKChub2RlLnByb21vdGVkVHlwZSAhPSBudWxsKSAmJgogICAgICAgIChub2RlLnByb21vdGVkVHlwZSAhPSBjb25zdCBEeW5hbWljVHlwZSgpKSkgewogICAgICByZXR1cm4gX21ha2VOYXJyb3coCiAgICAgICAgICB2LCBfdHlwZXNCdWlsZGVyLmZyb21TdGF0aWNUeXBlKG5vZGUucHJvbW90ZWRUeXBlLCBmYWxzZSkpOwogICAgfQoKICAgIHJldHVybiB2OwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICBmaW5hbCBUeXBlRXhwciB2YWx1ZSA9IF92aXNpdChub2RlLnZhbHVlKTsKICAgIF93cml0ZVZhcmlhYmxlKG5vZGUudmFyaWFibGUsIHZhbHVlKTsKICAgIHJldHVybiB2YWx1ZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0TG9hZExpYnJhcnkoTG9hZExpYnJhcnkgbm9kZSkgewogICAgcmV0dXJuIF9zdGF0aWNUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICByZXR1cm4gX3N0YXRpY1R5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgaWYgKCFrUmVtb3ZlQXNzZXJ0cykgewogICAgICBfYWRkVXNlKF92aXNpdChub2RlLmNvbmRpdGlvbikpOwogICAgICBpZiAobm9kZS5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgICBfdmlzaXQobm9kZS5tZXNzYWdlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIG5vZGUuc3RhdGVtZW50cy5mb3JFYWNoKF92aXNpdCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgewogICAgaWYgKCFrUmVtb3ZlQXNzZXJ0cykgewogICAgICBub2RlLnN0YXRlbWVudHMuZm9yRWFjaChfdmlzaXQpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKICAgIF92YXJpYWJsZVZhbHVlc0FmdGVyTGFiZWxlZFN0YXRlbWVudHMgPz89CiAgICAgICAgPExhYmVsZWRTdGF0ZW1lbnQsIExpc3Q8VHlwZUV4cHI+Pnt9OwogICAgZmluYWwgc3RhdGUgPSBfdmFyaWFibGVWYWx1ZXNBZnRlckxhYmVsZWRTdGF0ZW1lbnRzW25vZGUudGFyZ2V0XTsKICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CiAgICAgIF9tZXJnZVZhcmlhYmxlVmFsdWVzKHN0YXRlLCBfdmFyaWFibGVWYWx1ZXMpOwogICAgfSBlbHNlIHsKICAgICAgX3ZhcmlhYmxlVmFsdWVzQWZ0ZXJMYWJlbGVkU3RhdGVtZW50c1tub2RlLnRhcmdldF0gPSBfdmFyaWFibGVWYWx1ZXM7CiAgICB9CiAgICBfdmFyaWFibGVWYWx1ZXMgPSBfbWFrZUVtcHR5VmFyaWFibGVWYWx1ZXMoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBfbWVyZ2VWYXJpYWJsZVZhbHVlc1RvSm9pbnMoCiAgICAgICAgX3ZhcmlhYmxlVmFsdWVzLCBfam9pbnNBdFN3aXRjaENhc2VzW25vZGUudGFyZ2V0XSk7CiAgICBfdmFyaWFibGVWYWx1ZXMgPSBfbWFrZUVtcHR5VmFyaWFibGVWYWx1ZXMoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXREb1N0YXRlbWVudChEb1N0YXRlbWVudCBub2RlKSB7CiAgICBmaW5hbCBMaXN0PEpvaW4+IGpvaW5zID0gX2luc2VydEpvaW5zRm9yTW9kaWZpZWRWYXJpYWJsZXMobm9kZSwgZmFsc2UpOwogICAgX3Zpc2l0KG5vZGUuYm9keSk7CiAgICBmaW5hbCB0cnVlU3RhdGUgPSBfY2xvbmVWYXJpYWJsZVZhbHVlcyhfdmFyaWFibGVWYWx1ZXMpOwogICAgZmluYWwgZmFsc2VTdGF0ZSA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBfdmlzaXRDb25kaXRpb24obm9kZS5jb25kaXRpb24sIHRydWVTdGF0ZSwgZmFsc2VTdGF0ZSk7CiAgICBfbWVyZ2VWYXJpYWJsZVZhbHVlc1RvSm9pbnModHJ1ZVN0YXRlLCBqb2lucyk7CiAgICAvLyBLZXJuZWwgcmVwcmVzZW50cyAnYnJlYWs7JyBhcyBhIEJyZWFrU3RhdGVtZW50IHJlZmVycmluZyB0byBhCiAgICAvLyBMYWJlbGVkU3RhdGVtZW50LiBXZSBhcmUgdGhlcmVmb3JlIGd1YXJhbnRlZWQgdG8gYWx3YXlzIGhhdmUgdGhlCiAgICAvLyBjb25kaXRpb24gYmUgZmFsc2UgYWZ0ZXIgdGhlICdkby93aGlsZScuCiAgICAvLyBBbnkgYnJlYWsgd291bGQganVtcCB0byB0aGUgTGFiZWxlZFN0YXRlbWVudCBvdXRzaWRlIHRoZSBkby93aGlsZS4KICAgIF92YXJpYWJsZVZhbHVlcyA9IGZhbHNlU3RhdGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgX3Zpc2l0KG5vZGUuZXhwcmVzc2lvbik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0Rm9ySW5TdGF0ZW1lbnQoRm9ySW5TdGF0ZW1lbnQgbm9kZSkgewogICAgX3Zpc2l0KG5vZGUuaXRlcmFibGUpOwogICAgLy8gVE9ETyhhbGV4bWFya292KTogdHJ5IHRvIGluZmVyIG1vcmUgcHJlY2lzZSB0eXBlIGZyb20gJ2l0ZXJhYmxlJwogICAgX2RlY2xhcmVWYXJpYWJsZVdpdGhTdGF0aWNUeXBlKG5vZGUudmFyaWFibGUpOwoKICAgIGZpbmFsIExpc3Q8Sm9pbj4gam9pbnMgPSBfaW5zZXJ0Sm9pbnNGb3JNb2RpZmllZFZhcmlhYmxlcyhub2RlLCBmYWxzZSk7CiAgICBmaW5hbCBzdGF0ZUFmdGVyTG9vcCA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBfdmlzaXQobm9kZS5ib2R5KTsKICAgIF9tZXJnZVZhcmlhYmxlVmFsdWVzVG9Kb2lucyhfdmFyaWFibGVWYWx1ZXMsIGpvaW5zKTsKICAgIF92YXJpYWJsZVZhbHVlcyA9IHN0YXRlQWZ0ZXJMb29wOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgbm9kZS52YXJpYWJsZXMuZm9yRWFjaCh2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgZmluYWwgTGlzdDxKb2luPiBqb2lucyA9IF9pbnNlcnRKb2luc0Zvck1vZGlmaWVkVmFyaWFibGVzKG5vZGUsIGZhbHNlKTsKICAgIGZpbmFsIHRydWVTdGF0ZSA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBmaW5hbCBmYWxzZVN0YXRlID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzKTsKICAgIGlmIChub2RlLmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgIF92aXNpdENvbmRpdGlvbihub2RlLmNvbmRpdGlvbiwgdHJ1ZVN0YXRlLCBmYWxzZVN0YXRlKTsKICAgIH0KICAgIF92YXJpYWJsZVZhbHVlcyA9IHRydWVTdGF0ZTsKICAgIF92aXNpdChub2RlLmJvZHkpOwogICAgbm9kZS51cGRhdGVzLmZvckVhY2goX3Zpc2l0KTsKICAgIF9tZXJnZVZhcmlhYmxlVmFsdWVzVG9Kb2lucyhfdmFyaWFibGVWYWx1ZXMsIGpvaW5zKTsKICAgIC8vIEtlcm5lbCByZXByZXNlbnRzICdicmVhazsnIGFzIGEgQnJlYWtTdGF0ZW1lbnQgcmVmZXJyaW5nIHRvIGEKICAgIC8vIExhYmVsZWRTdGF0ZW1lbnQuIFdlIGFyZSB0aGVyZWZvcmUgZ3VhcmFudGVlZCB0byBhbHdheXMgaGF2ZSB0aGUKICAgIC8vIGNvbmRpdGlvbiBiZSBmYWxzZSBhZnRlciB0aGUgJ2ZvcicuCiAgICAvLyBBbnkgYnJlYWsgd291bGQganVtcCB0byB0aGUgTGFiZWxlZFN0YXRlbWVudCBvdXRzaWRlIHRoZSAnZm9yJy4KICAgIF92YXJpYWJsZVZhbHVlcyA9IGZhbHNlU3RhdGU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIC8vIFRPRE8oYWxleG1hcmtvdik6IHN1cHBvcnQgZnVuY3Rpb24gdHlwZXMuCiAgICBfZGVjbGFyZVZhcmlhYmxlV2l0aFN0YXRpY1R5cGUobm9kZS52YXJpYWJsZSk7CiAgICBfaGFuZGxlTmVzdGVkRnVuY3Rpb25Ob2RlKG5vZGUuZnVuY3Rpb24pOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdElmU3RhdGVtZW50KElmU3RhdGVtZW50IG5vZGUpIHsKICAgIGZpbmFsIHRydWVTdGF0ZSA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBmaW5hbCBmYWxzZVN0YXRlID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzKTsKICAgIF92aXNpdENvbmRpdGlvbihub2RlLmNvbmRpdGlvbiwgdHJ1ZVN0YXRlLCBmYWxzZVN0YXRlKTsKCiAgICBfdmFyaWFibGVWYWx1ZXMgPSB0cnVlU3RhdGU7CiAgICBfdmlzaXQobm9kZS50aGVuKTsKICAgIGZpbmFsIHN0YXRlQWZ0ZXIgPSBfdmFyaWFibGVWYWx1ZXM7CgogICAgX3ZhcmlhYmxlVmFsdWVzID0gZmFsc2VTdGF0ZTsKICAgIGlmIChub2RlLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIF92aXNpdChub2RlLm90aGVyd2lzZSk7CiAgICB9CgogICAgX21lcmdlVmFyaWFibGVWYWx1ZXMoc3RhdGVBZnRlciwgX3ZhcmlhYmxlVmFsdWVzKTsKICAgIF92YXJpYWJsZVZhbHVlcyA9IHN0YXRlQWZ0ZXI7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIF92aXNpdChub2RlLmJvZHkpOwogICAgZmluYWwgc3RhdGUgPSBfdmFyaWFibGVWYWx1ZXNBZnRlckxhYmVsZWRTdGF0ZW1lbnRzPy5yZW1vdmUobm9kZSk7CiAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewogICAgICBfbWVyZ2VWYXJpYWJsZVZhbHVlcyhfdmFyaWFibGVWYWx1ZXMsIHN0YXRlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKICAgIFR5cGVFeHByIHJldCA9CiAgICAgICAgKG5vZGUuZXhwcmVzc2lvbiAhPSBudWxsKSA/IF92aXNpdChub2RlLmV4cHJlc3Npb24pIDogX251bGxUeXBlOwogICAgaWYgKF9yZXR1cm5WYWx1ZSAhPSBudWxsKSB7CiAgICAgIF9yZXR1cm5WYWx1ZS52YWx1ZXMuYWRkKHJldCk7CiAgICB9CiAgICBfdmFyaWFibGVWYWx1ZXMgPSBfbWFrZUVtcHR5VmFyaWFibGVWYWx1ZXMoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIF92aXNpdChub2RlLmV4cHJlc3Npb24pOwogICAgLy8gSW5zZXJ0IGpvaW5zIGF0IGVhY2ggY2FzZSBpbiBjYXNlIHRoZXJlIGFyZSAnY29udGludWUnIHN0YXRlbWVudHMuCiAgICBmaW5hbCBzdGF0ZU9uRW50cnkgPSBfdmFyaWFibGVWYWx1ZXM7CiAgICBmaW5hbCB2YXJpYWJsZVZhbHVlc0F0Q2FzZUVudHJ5ID0gPFN3aXRjaENhc2UsIExpc3Q8VHlwZUV4cHI+Pnt9OwogICAgX2pvaW5zQXRTd2l0Y2hDYXNlcyA/Pz0gPFN3aXRjaENhc2UsIExpc3Q8Sm9pbj4+e307CiAgICBmb3IgKHZhciBzd2l0Y2hDYXNlIGluIG5vZGUuY2FzZXMpIHsKICAgICAgX3ZhcmlhYmxlVmFsdWVzID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoc3RhdGVPbkVudHJ5KTsKICAgICAgX2pvaW5zQXRTd2l0Y2hDYXNlc1tzd2l0Y2hDYXNlXSA9CiAgICAgICAgICBfaW5zZXJ0Sm9pbnNGb3JNb2RpZmllZFZhcmlhYmxlcyhub2RlLCBmYWxzZSk7CiAgICAgIHZhcmlhYmxlVmFsdWVzQXRDYXNlRW50cnlbc3dpdGNoQ2FzZV0gPSBfdmFyaWFibGVWYWx1ZXM7CiAgICB9CiAgICBib29sIGhhc0RlZmF1bHQgPSBmYWxzZTsKICAgIGZvciAodmFyIHN3aXRjaENhc2UgaW4gbm9kZS5jYXNlcykgewogICAgICBfdmFyaWFibGVWYWx1ZXMgPSB2YXJpYWJsZVZhbHVlc0F0Q2FzZUVudHJ5W3N3aXRjaENhc2VdOwogICAgICBzd2l0Y2hDYXNlLmV4cHJlc3Npb25zLmZvckVhY2goX3Zpc2l0KTsKICAgICAgX3Zpc2l0KHN3aXRjaENhc2UuYm9keSk7CiAgICAgIGhhc0RlZmF1bHQgPSBoYXNEZWZhdWx0IHx8IHN3aXRjaENhc2UuaXNEZWZhdWx0OwogICAgfQogICAgaWYgKCFoYXNEZWZhdWx0KSB7CiAgICAgIF9tZXJnZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcywgc3RhdGVPbkVudHJ5KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRUcnlDYXRjaChUcnlDYXRjaCBub2RlKSB7CiAgICBmaW5hbCBqb2lucyA9IF9pbnNlcnRKb2luc0Zvck1vZGlmaWVkVmFyaWFibGVzKG5vZGUsIHRydWUpOwogICAgZmluYWwgc3RhdGVBZnRlclRyeSA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBfdmlzaXQobm9kZS5ib2R5KTsKICAgIF9yZXN0b3JlVmFyaWFibGVDZWxsc0FmdGVyVHJ5KGpvaW5zKTsKICAgIExpc3Q8VHlwZUV4cHI+IHN0YXRlQWZ0ZXJDYXRjaDsKICAgIGZvciAodmFyIGNhdGNoQ2xhdXNlIGluIG5vZGUuY2F0Y2hlcykgewogICAgICBfdmFyaWFibGVWYWx1ZXMgPSBfY2xvbmVWYXJpYWJsZVZhbHVlcyhzdGF0ZUFmdGVyVHJ5KTsKICAgICAgaWYgKGNhdGNoQ2xhdXNlLmV4Y2VwdGlvbiAhPSBudWxsKSB7CiAgICAgICAgX2RlY2xhcmVWYXJpYWJsZVdpdGhTdGF0aWNUeXBlKGNhdGNoQ2xhdXNlLmV4Y2VwdGlvbik7CiAgICAgIH0KICAgICAgaWYgKGNhdGNoQ2xhdXNlLnN0YWNrVHJhY2UgIT0gbnVsbCkgewogICAgICAgIF9kZWNsYXJlVmFyaWFibGVXaXRoU3RhdGljVHlwZShjYXRjaENsYXVzZS5zdGFja1RyYWNlKTsKICAgICAgfQogICAgICBfdmlzaXQoY2F0Y2hDbGF1c2UuYm9keSk7CiAgICAgIGlmIChzdGF0ZUFmdGVyQ2F0Y2ggPT0gbnVsbCkgewogICAgICAgIHN0YXRlQWZ0ZXJDYXRjaCA9IF92YXJpYWJsZVZhbHVlczsKICAgICAgfSBlbHNlIHsKICAgICAgICBfbWVyZ2VWYXJpYWJsZVZhbHVlcyhzdGF0ZUFmdGVyQ2F0Y2gsIF92YXJpYWJsZVZhbHVlcyk7CiAgICAgIH0KICAgIH0KICAgIF92YXJpYWJsZVZhbHVlcyA9IHN0YXRlQWZ0ZXJUcnk7CiAgICBfbWVyZ2VWYXJpYWJsZVZhbHVlcyhfdmFyaWFibGVWYWx1ZXMsIHN0YXRlQWZ0ZXJDYXRjaCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpIHsKICAgIGZpbmFsIGpvaW5zID0gX2luc2VydEpvaW5zRm9yTW9kaWZpZWRWYXJpYWJsZXMobm9kZSwgdHJ1ZSk7CiAgICBmaW5hbCBzdGF0ZUFmdGVyVHJ5ID0gX2Nsb25lVmFyaWFibGVWYWx1ZXMoX3ZhcmlhYmxlVmFsdWVzKTsKICAgIF92aXNpdChub2RlLmJvZHkpOwogICAgX3Jlc3RvcmVWYXJpYWJsZUNlbGxzQWZ0ZXJUcnkoam9pbnMpOwogICAgX3ZhcmlhYmxlVmFsdWVzID0gc3RhdGVBZnRlclRyeTsKICAgIF92aXNpdChub2RlLmZpbmFsaXplcik7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIGZpbmFsIFR5cGVFeHByIGluaXRpYWxWYWx1ZSA9CiAgICAgICAgbm9kZS5pbml0aWFsaXplciA9PSBudWxsID8gX251bGxUeXBlIDogX3Zpc2l0KG5vZGUuaW5pdGlhbGl6ZXIpOwogICAgX2RlY2xhcmVWYXJpYWJsZShub2RlLCBpbml0aWFsVmFsdWUpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlRXhwciB2aXNpdFdoaWxlU3RhdGVtZW50KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKICAgIGZpbmFsIExpc3Q8Sm9pbj4gam9pbnMgPSBfaW5zZXJ0Sm9pbnNGb3JNb2RpZmllZFZhcmlhYmxlcyhub2RlLCBmYWxzZSk7CiAgICBmaW5hbCB0cnVlU3RhdGUgPSBfY2xvbmVWYXJpYWJsZVZhbHVlcyhfdmFyaWFibGVWYWx1ZXMpOwogICAgZmluYWwgZmFsc2VTdGF0ZSA9IF9jbG9uZVZhcmlhYmxlVmFsdWVzKF92YXJpYWJsZVZhbHVlcyk7CiAgICBfdmlzaXRDb25kaXRpb24obm9kZS5jb25kaXRpb24sIHRydWVTdGF0ZSwgZmFsc2VTdGF0ZSk7CiAgICBfdmFyaWFibGVWYWx1ZXMgPSB0cnVlU3RhdGU7CiAgICBfdmlzaXQobm9kZS5ib2R5KTsKICAgIF9tZXJnZVZhcmlhYmxlVmFsdWVzVG9Kb2lucyhfdmFyaWFibGVWYWx1ZXMsIGpvaW5zKTsKICAgIC8vIEtlcm5lbCByZXByZXNlbnRzICdicmVhazsnIGFzIGEgQnJlYWtTdGF0ZW1lbnQgcmVmZXJyaW5nIHRvIGEKICAgIC8vIExhYmVsZWRTdGF0ZW1lbnQuIFdlIGFyZSB0aGVyZWZvcmUgZ3VhcmFudGVlZCB0byBhbHdheXMgaGF2ZSB0aGUKICAgIC8vIGNvbmRpdGlvbiBiZSBmYWxzZSBhZnRlciB0aGUgJ3doaWxlJy4KICAgIC8vIEFueSBicmVhayB3b3VsZCBqdW1wIHRvIHRoZSBMYWJlbGVkU3RhdGVtZW50IG91dHNpZGUgdGhlIHdoaWxlLgogICAgX3ZhcmlhYmxlVmFsdWVzID0gZmFsc2VTdGF0ZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICBfdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRGaWVsZEluaXRpYWxpemVyKEZpZWxkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgZmluYWwgdmFsdWUgPSBfdmlzaXQobm9kZS52YWx1ZSk7CiAgICBmaW5hbCBhcmdzID0gbmV3IEFyZ3M8VHlwZUV4cHI+KFtfcmVjZWl2ZXIsIHZhbHVlXSk7CiAgICBfbWFrZUNhbGwoCiAgICAgICAgbm9kZSwKICAgICAgICBuZXcgRGlyZWN0U2VsZWN0b3Iobm9kZS5maWVsZCwKICAgICAgICAgICAgY2FsbEtpbmQ6IENhbGxLaW5kLlNldEZpZWxkSW5Db25zdHJ1Y3RvciksCiAgICAgICAgYXJncyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcihSZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUpIHsKICAgIGZpbmFsIGFyZ3MgPSBfdmlzaXRBcmd1bWVudHMoX3JlY2VpdmVyLCBub2RlLmFyZ3VtZW50cyk7CiAgICBfbWFrZUNhbGwobm9kZSwgbmV3IERpcmVjdFNlbGVjdG9yKG5vZGUudGFyZ2V0KSwgYXJncyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0U3VwZXJJbml0aWFsaXplcihTdXBlckluaXRpYWxpemVyIG5vZGUpIHsKICAgIGZpbmFsIGFyZ3MgPSBfdmlzaXRBcmd1bWVudHMoX3JlY2VpdmVyLCBub2RlLmFyZ3VtZW50cyk7CgogICAgQ29uc3RydWN0b3IgdGFyZ2V0ID0gbnVsbDsKICAgIGlmIChrUGFydGlhbE1peGluUmVzb2x1dGlvbikgewogICAgICAvLyBSZS1yZXNvbHZlIHRhcmdldCBkdWUgdG8gcGFydGlhbCBtaXhpbiByZXNvbHV0aW9uLgogICAgICBmb3IgKHZhciByZXBsYWNlbWVudCBpbiBfc3VwZXJjbGFzcy5jb25zdHJ1Y3RvcnMpIHsKICAgICAgICBpZiAobm9kZS50YXJnZXQubmFtZSA9PSByZXBsYWNlbWVudC5uYW1lKSB7CiAgICAgICAgICB0YXJnZXQgPSByZXBsYWNlbWVudDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICB9CiAgICBhc3NlcnR4KHRhcmdldCAhPSBudWxsKTsKICAgIF9tYWtlQ2FsbChub2RlLCBuZXcgRGlyZWN0U2VsZWN0b3IodGFyZ2V0KSwgYXJncyk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0TG9jYWxJbml0aWFsaXplcihMb2NhbEluaXRpYWxpemVyIG5vZGUpIHsKICAgIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlLnZhcmlhYmxlKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICBpZiAoIWtSZW1vdmVBc3NlcnRzKSB7CiAgICAgIF92aXNpdChub2RlLnN0YXRlbWVudCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0SW52YWxpZEluaXRpYWxpemVyKEludmFsaWRJbml0aWFsaXplciBub2RlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gY29uc3RhbnRBbGxvY2F0aW9uQ29sbGVjdG9yLnR5cGVGb3Iobm9kZS5jb25zdGFudCk7CiAgfQp9CgpjbGFzcyBSdW50aW1lVHlwZVRyYW5zbGF0b3JJbXBsIGV4dGVuZHMgRGFydFR5cGVWaXNpdG9yPFR5cGVFeHByPgogICAgaW1wbGVtZW50cyBSdW50aW1lVHlwZVRyYW5zbGF0b3IgewogIGZpbmFsIFN1bW1hcnkgc3VtbWFyeTsKICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZUV4cHI+IGZ1bmN0aW9uVHlwZVZhcmlhYmxlczsKICBmaW5hbCBNYXA8RGFydFR5cGUsIFR5cGVFeHByPiB0eXBlc0NhY2hlID0gPERhcnRUeXBlLCBUeXBlRXhwcj57fTsKICBmaW5hbCBUeXBlRXhwciByZWNlaXZlcjsKICBmaW5hbCBHZW5lcmljSW50ZXJmYWNlc0luZm8gZ2VuZXJpY0ludGVyZmFjZXNJbmZvOwoKICBSdW50aW1lVHlwZVRyYW5zbGF0b3JJbXBsKHRoaXMuc3VtbWFyeSwgdGhpcy5yZWNlaXZlciwKICAgICAgdGhpcy5mdW5jdGlvblR5cGVWYXJpYWJsZXMsIHRoaXMuZ2VuZXJpY0ludGVyZmFjZXNJbmZvKSB7fQoKICAvLyBDcmVhdGUgYSB0eXBlIHRyYW5zbGF0b3Igd2hpY2ggY2FuIGJlIHVzZWQgb25seSBmb3IgdHlwZXMgd2l0aCBubyBmcmVlIHR5cGUKICAvLyB2YXJpYWJsZXMuCiAgUnVudGltZVR5cGVUcmFuc2xhdG9ySW1wbC5mb3JDbG9zZWRUeXBlcyh0aGlzLmdlbmVyaWNJbnRlcmZhY2VzSW5mbykKICAgICAgOiBzdW1tYXJ5ID0gbnVsbCwKICAgICAgICBmdW5jdGlvblR5cGVWYXJpYWJsZXMgPSBudWxsLAogICAgICAgIHJlY2VpdmVyID0gbnVsbCB7fQoKICBUeXBlRXhwciBpbnN0YW50aWF0ZUNvbmNyZXRlVHlwZShDb25jcmV0ZVR5cGUgdHlwZSwgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3MpIHsKICAgIGlmICh0eXBlQXJncy5pc0VtcHR5KSByZXR1cm4gdHlwZTsKCiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgc2ltaWxhciB0byAndmlzaXRJbnRlcmZhY2VUeXBlJywgYnV0IHdpdGgKICAgIC8vIG1hbnkgc21hbGwgZGlmZmVyZW5jZXMuCiAgICBmaW5hbCBrbGFzcyA9IHR5cGUuY2xzLmNsYXNzTm9kZTsKICAgIGZpbmFsIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoa2xhc3MudHlwZVBhcmFtZXRlcnMsIHR5cGVBcmdzKTsKICAgIGZpbmFsIGZsYXR0ZW5lZFR5cGVBcmdzID0KICAgICAgICBnZW5lcmljSW50ZXJmYWNlc0luZm8uZmxhdHRlbmVkVHlwZUFyZ3VtZW50c0ZvcihrbGFzcyk7CiAgICBmaW5hbCBmbGF0dGVuZWRUeXBlRXhwcnMgPSBuZXcgTGlzdDxUeXBlRXhwcj4oZmxhdHRlbmVkVHlwZUFyZ3MubGVuZ3RoKTsKCiAgICBib29sIGNyZWF0ZUNvbmNyZXRlVHlwZSA9IHRydWU7CiAgICBib29sIGFsbEFueVR5cGUgPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbGF0dGVuZWRUeXBlQXJncy5sZW5ndGg7ICsraSkgewogICAgICBmaW5hbCB0eXBlRXhwciA9CiAgICAgICAgICB0cmFuc2xhdGUoc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZsYXR0ZW5lZFR5cGVBcmdzW2ldKSk7CiAgICAgIGlmICh0eXBlRXhwciAhPSBjb25zdCBBbnlUeXBlKCkpIGFsbEFueVR5cGUgPSBmYWxzZTsKICAgICAgaWYgKHR5cGVFeHByIGlzIFN0YXRlbWVudCkgY3JlYXRlQ29uY3JldGVUeXBlID0gZmFsc2U7CiAgICAgIGZsYXR0ZW5lZFR5cGVFeHByc1tpXSA9IHR5cGVFeHByOwogICAgfQoKICAgIGlmIChhbGxBbnlUeXBlKSByZXR1cm4gdHlwZTsKCiAgICBpZiAoY3JlYXRlQ29uY3JldGVUeXBlKSB7CiAgICAgIHJldHVybiBuZXcgQ29uY3JldGVUeXBlKAogICAgICAgICAgdHlwZS5jbHMsIG5ldyBMaXN0PFR5cGU+LmZyb20oZmxhdHRlbmVkVHlwZUV4cHJzKSk7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBpbnN0YW50aWF0ZSA9IG5ldyBDcmVhdGVDb25jcmV0ZVR5cGUodHlwZS5jbHMsIGZsYXR0ZW5lZFR5cGVFeHBycyk7CiAgICAgIHN1bW1hcnkuYWRkKGluc3RhbnRpYXRlKTsKICAgICAgcmV0dXJuIGluc3RhbnRpYXRlOwogICAgfQogIH0KCiAgLy8gQ3JlYXRlcyBhIFR5cGVFeHByIHJlcHJlc2VudGluZyB0aGUgc2V0IG9mIHR5cGVzIHdoaWNoIGNhbiBmbG93IHRocm91Z2ggYQogIC8vIGdpdmVuIERhcnRUeXBlLgogIC8vCiAgLy8gV2lsbCByZXR1cm4gQW55VHlwZSwgUnVudGltZVR5cGUgb3IgU3RhdGVtZW50LgogIFR5cGVFeHByIHRyYW5zbGF0ZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBmaW5hbCBjYWNoZWQgPSB0eXBlc0NhY2hlW3R5cGVdOwogICAgaWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4gY2FjaGVkOwoKICAgIC8vIER1cmluZyB0eXBlIHRyYW5zbGF0aW9uLCBsb29wcyBjYW4gYXJpc2UgdmlhIHN1cGVyLWJvdW5kZWQgdHlwZXM6CiAgICAvLwogICAgLy8gICBjbGFzcyBBPFQ+IGV4dGVuZHMgQ29tcGFyYWJsZTxBPFQ+PiB7fQogICAgLy8KICAgIC8vIENyZWF0aW5nIHRoZSBmYWN0b3JlZCB0eXBlIGFyZ3VtZW50cyBvZiBBIHdpbGwgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLgogICAgLy8gV2UgYnJlYWsgc3VjaCBsb29wcyBieSBpbnNlcnRpbmcgYW4gJ0FueVR5cGUnIGluIHBsYWNlIG9mIHRoZSBjdXJyZW50bHkKICAgIC8vIHByb2Nlc3NlZCB0eXBlLCBlbnN1cmluZyB3ZSB0cnkgdG8gYnVpbGQgJ0E8VD4nIGluIHRoZSBwcm9jZXNzIG9mCiAgICAvLyBidWlsZGluZyAnQTxUPicuCiAgICB0eXBlc0NhY2hlW3R5cGVdID0gY29uc3QgQW55VHlwZSgpOwogICAgZmluYWwgcmVzdWx0ID0gdHlwZS5hY2NlcHQodGhpcyk7CiAgICBhc3NlcnR4KHJlc3VsdCBpcyBBbnlUeXBlIHx8IHJlc3VsdCBpcyBSdW50aW1lVHlwZSB8fCByZXN1bHQgaXMgU3RhdGVtZW50KTsKICAgIHR5cGVzQ2FjaGVbdHlwZV0gPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IGNvbnN0IEFueVR5cGUoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSB0eXBlKSA9PiBuZXcgUnVudGltZVR5cGUodHlwZSwgbnVsbCk7CiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSB0eXBlKSA9PiBuZXcgUnVudGltZVR5cGUodHlwZSwgbnVsbCk7CiAgQG92ZXJyaWRlCiAgVHlwZUV4cHIgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgdHlwZSkgPT4gbmV3IFJ1bnRpbWVUeXBlKHR5cGUsIG51bGwpOwogIEBvdmVycmlkZQogIFR5cGVFeHByIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSB0eXBlKSA9PiBuZXcgUnVudGltZVR5cGUodHlwZSwgbnVsbCk7CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgPT4gdHJhbnNsYXRlKG5vZGUudW5hbGlhcyk7CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgcmV0dXJuIG5ldyBSdW50aW1lVHlwZSh0eXBlLCBudWxsKTsKCiAgICBmaW5hbCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgIHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCB0eXBlLnR5cGVBcmd1bWVudHMpOwogICAgZmluYWwgZmxhdHRlbmVkVHlwZUFyZ3MgPQogICAgICAgIGdlbmVyaWNJbnRlcmZhY2VzSW5mby5mbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yKHR5cGUuY2xhc3NOb2RlKTsKICAgIGZpbmFsIGZsYXR0ZW5lZFR5cGVFeHBycyA9IG5ldyBMaXN0PFR5cGVFeHByPihmbGF0dGVuZWRUeXBlQXJncy5sZW5ndGgpOwoKICAgIGJvb2wgY3JlYXRlUnVudGltZVR5cGUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGF0dGVuZWRUeXBlQXJncy5sZW5ndGg7ICsraSkgewogICAgICBmaW5hbCB0eXBlRXhwciA9CiAgICAgICAgICB0cmFuc2xhdGUoc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZsYXR0ZW5lZFR5cGVBcmdzW2ldKSk7CiAgICAgIGlmICh0eXBlRXhwciA9PSBjb25zdCBBbnlUeXBlKCkpIHJldHVybiBjb25zdCBBbnlUeXBlKCk7CiAgICAgIGlmICh0eXBlRXhwciBpcyEgUnVudGltZVR5cGUpIGNyZWF0ZVJ1bnRpbWVUeXBlID0gZmFsc2U7CiAgICAgIGZsYXR0ZW5lZFR5cGVFeHByc1tpXSA9IHR5cGVFeHByOwogICAgfQoKICAgIGlmIChjcmVhdGVSdW50aW1lVHlwZSkgewogICAgICByZXR1cm4gbmV3IFJ1bnRpbWVUeXBlKAogICAgICAgICAgbmV3IEludGVyZmFjZVR5cGUodHlwZS5jbGFzc05vZGUsIE51bGxhYmlsaXR5LmxlZ2FjeSksCiAgICAgICAgICBuZXcgTGlzdDxSdW50aW1lVHlwZT4uZnJvbShmbGF0dGVuZWRUeXBlRXhwcnMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGZpbmFsIGluc3RhbnRpYXRlID0KICAgICAgICAgIG5ldyBDcmVhdGVSdW50aW1lVHlwZSh0eXBlLmNsYXNzTm9kZSwgZmxhdHRlbmVkVHlwZUV4cHJzKTsKICAgICAgc3VtbWFyeS5hZGQoaW5zdGFudGlhdGUpOwogICAgICByZXR1cm4gaW5zdGFudGlhdGU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUpIHsKICAgIGlmIChmdW5jdGlvblR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmaW5hbCByZXN1bHQgPSBmdW5jdGlvblR5cGVWYXJpYWJsZXNbdHlwZS5wYXJhbWV0ZXJdOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAodHlwZS5wYXJhbWV0ZXIucGFyZW50IGlzISBDbGFzcykgcmV0dXJuIGNvbnN0IEFueVR5cGUoKTsKICAgIGZpbmFsIGludGVyZmFjZUNsYXNzID0gdHlwZS5wYXJhbWV0ZXIucGFyZW50IGFzIENsYXNzOwogICAgYXNzZXJ0eChyZWNlaXZlciAhPSBudWxsKTsKICAgIGZpbmFsIGV4dHJhY3QgPSBuZXcgRXh0cmFjdChyZWNlaXZlciwgaW50ZXJmYWNlQ2xhc3MsCiAgICAgICAgaW50ZXJmYWNlQ2xhc3MudHlwZVBhcmFtZXRlcnMuaW5kZXhPZih0eXBlLnBhcmFtZXRlcikpOwogICAgc3VtbWFyeS5hZGQoZXh0cmFjdCk7CiAgICByZXR1cm4gZXh0cmFjdDsKICB9Cn0KCmNsYXNzIENvbnN0YW50QWxsb2NhdGlvbkNvbGxlY3RvciBleHRlbmRzIENvbnN0YW50VmlzaXRvcjxUeXBlPiB7CiAgZmluYWwgU3VtbWFyeUNvbGxlY3RvciBzdW1tYXJ5Q29sbGVjdG9yOwoKICBmaW5hbCBNYXA8Q29uc3RhbnQsIFR5cGU+IGNvbnN0YW50cyA9IDxDb25zdGFudCwgVHlwZT57fTsKCiAgQ29uc3RhbnRBbGxvY2F0aW9uQ29sbGVjdG9yKHRoaXMuc3VtbWFyeUNvbGxlY3Rvcik7CgogIC8vIEVuc3VyZXMgdGhlIHRyYW5zdGl2ZSBncmFwaCBvZiBbY29uc3RhbnRdIGdvdCBzY2FubmVkIGZvciBwb3RlbnRpYWwKICAvLyBhbGxvY2F0aW9ucyBhbmQgZmllbGQgdHlwZXMuICBSZXR1cm5zIHRoZSBbVHlwZV0gb2YgdGhpcyBjb25zdGFudC4KICBUeXBlIHR5cGVGb3IoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHJldHVybiBjb25zdGFudHMucHV0SWZBYnNlbnQoY29uc3RhbnQsICgpID0+IGNvbnN0YW50LmFjY2VwdCh0aGlzKSk7CiAgfQoKICBUeXBlIF9nZXRTdGF0aWNUeXBlKENvbnN0YW50IGNvbnN0YW50KSA9PgogICAgICBzdW1tYXJ5Q29sbGVjdG9yLl90eXBlc0J1aWxkZXIuZnJvbVN0YXRpY1R5cGUoCiAgICAgICAgICBjb25zdGFudC5nZXRUeXBlKHN1bW1hcnlDb2xsZWN0b3IuX3N0YXRpY1R5cGVDb250ZXh0KSwgZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHRocm93ICdUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBjb25zdGFudCAiJGNvbnN0YW50IiBpbiBURkEgeWV0ISc7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBjb25zdGFudCkgewogICAgcmV0dXJuIHN1bW1hcnlDb2xsZWN0b3IuX251bGxUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSB2aXNpdEJvb2xDb25zdGFudChCb29sQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHJldHVybiBzdW1tYXJ5Q29sbGVjdG9yLl9ib29sTGl0ZXJhbFR5cGUoY29uc3RhbnQudmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IGNvbnN0YW50KSB7CiAgICByZXR1cm4gc3VtbWFyeUNvbGxlY3Rvci5faW50TGl0ZXJhbFR5cGUoY29uc3RhbnQudmFsdWUsIGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBjb25zdGFudCkgewogICAgcmV0dXJuIHN1bW1hcnlDb2xsZWN0b3IuX2RvdWJsZUxpdGVyYWxUeXBlKGNvbnN0YW50LnZhbHVlLCBjb25zdGFudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHJldHVybiBzdW1tYXJ5Q29sbGVjdG9yLl9zdHJpbmdMaXRlcmFsVHlwZShjb25zdGFudC52YWx1ZSwgY29uc3RhbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTeW1ib2xDb25zdGFudChTeW1ib2xDb25zdGFudCBjb25zdGFudCkgewogICAgcmV0dXJuIHN1bW1hcnlDb2xsZWN0b3IuX3N5bWJvbFR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgdGhyb3cgJ1RoZSBrZXJuZWwya2VybmVsIGNvbnN0YW50cyB0cmFuc2Zvcm1hdGlvbiBkZXN1Z2FycyBjb25zdCBtYXBzISc7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBjb25zdGFudCkgewogICAgZm9yIChmaW5hbCBDb25zdGFudCBlbnRyeSBpbiBjb25zdGFudC5lbnRyaWVzKSB7CiAgICAgIHR5cGVGb3IoZW50cnkpOwogICAgfQogICAgZmluYWwgQ2xhc3MgY29uY3JldGVDbGFzcyA9IHN1bW1hcnlDb2xsZWN0b3IudGFyZ2V0CiAgICAgICAgLmNvbmNyZXRlQ29uc3RMaXN0TGl0ZXJhbENsYXNzKHN1bW1hcnlDb2xsZWN0b3IuX2Vudmlyb25tZW50LmNvcmVUeXBlcyk7CiAgICBpZiAoY29uY3JldGVDbGFzcyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgQ29uY3JldGVUeXBlKAogICAgICAgICAgc3VtbWFyeUNvbGxlY3Rvci5fZW50cnlQb2ludHNMaXN0ZW5lcgogICAgICAgICAgICAgIC5hZGRBbGxvY2F0ZWRDbGFzcyhjb25jcmV0ZUNsYXNzKQogICAgICAgICAgICAgIC5jbHMsCiAgICAgICAgICBudWxsLAogICAgICAgICAgY29uc3RhbnQpOwogICAgfQogICAgcmV0dXJuIF9nZXRTdGF0aWNUeXBlKGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgdmlzaXRJbnN0YW5jZUNvbnN0YW50KEluc3RhbmNlQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGZpbmFsIHJlc3VsdENsYXNzID0gc3VtbWFyeUNvbGxlY3Rvci5fZW50cnlQb2ludHNMaXN0ZW5lcgogICAgICAgIC5hZGRBbGxvY2F0ZWRDbGFzcyhjb25zdGFudC5jbGFzc05vZGUpOwogICAgY29uc3RhbnQuZmllbGRWYWx1ZXMuZm9yRWFjaCgoUmVmZXJlbmNlIGZpZWxkUmVmZXJlbmNlLCBDb25zdGFudCB2YWx1ZSkgewogICAgICBzdW1tYXJ5Q29sbGVjdG9yLl9lbnRyeVBvaW50c0xpc3RlbmVyCiAgICAgICAgICAuYWRkRGlyZWN0RmllbGRBY2Nlc3MoZmllbGRSZWZlcmVuY2UuYXNGaWVsZCwgdHlwZUZvcih2YWx1ZSkpOwogICAgfSk7CiAgICByZXR1cm4gbmV3IENvbmNyZXRlVHlwZShyZXN1bHRDbGFzcy5jbHMsIG51bGwsIGNvbnN0YW50KTsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoVGVhck9mZkNvbnN0YW50IGNvbnN0YW50KSB7CiAgICBmaW5hbCBQcm9jZWR1cmUgcHJvY2VkdXJlID0gY29u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SD8/KAYBHR5BOw0aRSAaBgQBDDMpPCkGQTsfOkAaFAQCAUIrATwBNgFJSCRJBAEsNUkBDCdGBAEMMicEAQwyPgQBDDBHBAEMNkoEAQw2SgQBDDEpBAEMLE0EAQwyNRYGOFEhHzAwFBAVBiUEAQw6PjBOLEkIPgQBDDg0KjQlBAEMKi8rJQQBDEAnBAIBO3BhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9zdW1tYXJ5X2NvbGxlY3Rvci5kYXJ0UWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb2xsZWN0aW9uL2xpYi9zcmMvdXRpbHMuZGFydIHwLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBBIHBhaXIgb2YgdmFsdWVzLgpjbGFzcyBQYWlyPEUsIEY+IHsKICBFIGZpcnN0OwogIEYgbGFzdDsKCiAgUGFpcih0aGlzLmZpcnN0LCB0aGlzLmxhc3QpOwp9CgovLy8gUmV0dXJucyBhIFtDb21wYXJhdG9yXSB0aGF0IGFzc2VydHMgdGhhdCBpdHMgZmlyc3QgYXJndW1lbnQgaXMgY29tcGFyYWJsZS4KQ29tcGFyYXRvcjxUPiBkZWZhdWx0Q29tcGFyZTxUPigpID0+CiAgICAodmFsdWUxLCB2YWx1ZTIpID0+ICh2YWx1ZTEgYXMgQ29tcGFyYWJsZSkuY29tcGFyZVRvKHZhbHVlMik7ChEATk48ARYTCwoBHwIBTyVCASFwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3V0aWxzLmRhcnRiZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbGxlY3Rpb24vbGliL3NyYy9lbXB0eV91bm1vZGlmaWFibGVfc2V0LmRhcnSHLS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ3VubW9kaWZpYWJsZV93cmFwcGVycy5kYXJ0JzsKCi8vIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHVzZSBVbm1vZGlmaWFibGVTZXRNaXhpbiBoZXJlLCBzaW5jZSBjb25zdCBjbGFzc2VzCi8vIGNhbid0IHVzZSBtaXhpbnMuCi8vLyBBbiB1bm1vZGlmaWFibGUsIGVtcHR5IHNldCB0aGF0IGNhbiBoYXZlIGEgY29uc3QgY29uc3RydWN0b3IuCmNsYXNzIEVtcHR5VW5tb2RpZmlhYmxlU2V0PEU+IGV4dGVuZHMgSXRlcmFibGVCYXNlPEU+CiAgICBpbXBsZW1lbnRzIFVubW9kaWZpYWJsZVNldFZpZXc8RT4gewogIHN0YXRpYyBUIF90aHJvdzxUPigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBTZXQiKTsKICB9CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBuZXcgSXRlcmFibGU8RT4uZW1wdHkoKS5pdGVyYXRvcjsKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwoKICBjb25zdCBFbXB0eVVubW9kaWZpYWJsZVNldCgpOwoKICBFbXB0eVVubW9kaWZpYWJsZVNldDxUPiBjYXN0PFQ+KCkgPT4gbmV3IEVtcHR5VW5tb2RpZmlhYmxlU2V0PFQ+KCk7CiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgPT4gZmFsc2U7CiAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBvdGhlci5pc0VtcHR5OwogIEl0ZXJhYmxlPEU+IGZvbGxvd2VkQnkoSXRlcmFibGU8RT4gb3RoZXIpID0+IG5ldyBTZXQuZnJvbShvdGhlcik7CiAgRSBsb29rdXAoT2JqZWN0IGVsZW1lbnQpID0+IG51bGw7CiAgQGRlcHJlY2F0ZWQKICBFbXB0eVVubW9kaWZpYWJsZVNldDxUPiByZXR5cGU8VD4oKSA9PiBuZXcgRW1wdHlVbm1vZGlmaWFibGVTZXQ8VD4oKTsKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pID0+IHN1cGVyLnNpbmdsZVdoZXJlKHRlc3QpOwogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBFbXB0eVVubW9kaWZpYWJsZVNldDxUPigpOwogIFNldDxFPiB0b1NldCgpID0+IG5ldyBTZXQoKTsKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSA9PiBuZXcgU2V0LmZyb20ob3RoZXIpOwogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpID0+IG5ldyBTZXQoKTsKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgPT4gbmV3IFNldCgpOwoKICBib29sIGFkZChFIHZhbHVlKSA9PiBfdGhyb3coKTsKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbGVtZW50cykgPT4gX3Rocm93KCk7CiAgdm9pZCBjbGVhcigpID0+IF90aHJvdygpOwogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSA9PiBfdGhyb3coKTsKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBfdGhyb3coKTsKICB2b2lkIHJldGFpbkFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSA9PiBfdGhyb3coKTsKfQovAE5OPAEaASUBThVCNigZRQQBQBcBIAFGKj1EJA5IUD8fNTc1ASExHCs5NjY5AgEycGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lbXB0eV91bm1vZGlmaWFibGVfc2V0LmRhcnRUZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbnZlcnQvbGliL3NyYy9oZXgvZW5jb2Rlci5kYXJ0i4kvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBjb252ZXJ0LmhleC5lbmNvZGVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgppbXBvcnQgJ3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCc7CgovLy8gVGhlIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiBbSGV4RW5jb2Rlcl0uCmNvbnN0IGhleEVuY29kZXIgPSBjb25zdCBIZXhFbmNvZGVyLl8oKTsKCi8vLyBBIGNvbnZlcnRlciB0aGF0IGVuY29kZXMgYnl0ZSBhcnJheXMgaW50byBoZXhhZGVjaW1hbCBzdHJpbmdzLgovLy8KLy8vIFRoaXMgd2lsbCB0aHJvdyBhIFtSYW5nZUVycm9yXSBpZiB0aGUgYnl0ZSBhcnJheSBoYXMgYW55IGRpZ2l0cyB0aGF0IGRvbid0Ci8vLyBmaXQgaW4gdGhlIGdhbXV0IG9mIGEgYnl0ZS4KY2xhc3MgSGV4RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGNvbnN0IEhleEVuY29kZXIuXygpOwoKICBTdHJpbmcgY29udmVydChMaXN0PGludD4gYnl0ZXMpID0+IF9jb252ZXJ0KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgPT4KICAgICAgbmV3IF9IZXhFbmNvZGVyU2luayhzaW5rKTsKfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIGhleGFkZWNpbWFsIGVuY29kaW5nLgpjbGFzcyBfSGV4RW5jb2RlclNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIHVuZGVybHlpbmcgc2luayB0byB3aGljaCBkZWNvZGVkIGJ5dGUgYXJyYXlzIHdpbGwgYmUgcGFzc2VkLgogIGZpbmFsIFNpbms8U3RyaW5nPiBfc2luazsKCiAgX0hleEVuY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspIHsKICAgIF9zaW5rLmFkZChfY29udmVydChjaHVuaywgMCwgY2h1bmsubGVuZ3RoKSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY2h1bmsubGVuZ3RoKTsKICAgIF9zaW5rLmFkZChfY29udmVydChjaHVuaywgc3RhcnQsIGVuZCkpOwogICAgaWYgKGlzTGFzdCkgX3NpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKU3RyaW5nIF9jb252ZXJ0KExpc3Q8aW50PiBieXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgLy8gQSBVaW50OExpc3QgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBhIFN0cmluZ0J1ZmZlciBnaXZlbiB0aGF0IHdlIGtub3cgdGhhdAogIC8vIHdlJ3JlIG9ubHkgZW1pdHRpbmcgQVNDSUktY29tcGF0aWJsZSBjaGFyYWN0ZXJzLCBhbmQgdGhhdCB3ZSBrbm93IHRoZQogIC8vIGxlbmd0aCBhaGVhZCBvZiB0aW1lLgogIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KChlbmQgLSBzdGFydCkgKiAyKTsKICB2YXIgYnVmZmVySW5kZXggPSAwOwoKICAvLyBBIGJpdHdpc2UgT1Igb2YgYWxsIGJ5dGVzIGluIFtieXRlc10uIFRoaXMgYWxsb3dzIHVzIHRvIGNoZWNrIGZvcgogIC8vIG91dC1vZi1yYW5nZSBieXRlcyB3aXRob3V0IGFkZGluZyBtb3JlIGJyYW5jaGVzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZQogIC8vIGNvcmUgbG9vcC4KICB2YXIgYnl0ZU9yID0gMDsKICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGJ5dGVPciB8PSBieXRlOwoKICAgIC8vIFRoZSBiaXR3aXNlIGFyaXRobWV0aWMgaGVyZSBpcyBlcXVpdmFsZW50IHRvIGBieXRlIH4vIDE2YCBhbmQgYGJ5dGUgJSAxNmAKICAgIC8vIGZvciB2YWxpZCBieXRlIHZhbHVlcywgYnV0IGlzIGVhc2llciBmb3IgZGFydDJqcyB0byBvcHRpbWl6ZSBnaXZlbiB0aGF0CiAgICAvLyBpdCBjYW4ndCBwcm92ZSB0aGF0IFtieXRlXSB3aWxsIGFsd2F5cyBiZSBwb3NpdGl2ZS4KICAgIGJ1ZmZlcltidWZmZXJJbmRleCsrXSA9IF9jb2RlVW5pdEZvckRpZ2l0KChieXRlICYgMHhGMCkgPj4gNCk7CiAgICBidWZmZXJbYnVmZmVySW5kZXgrK10gPSBfY29kZVVuaXRGb3JEaWdpdChieXRlICYgMHgwRik7CiAgfQoKICBpZiAoYnl0ZU9yID49IDAgJiYgYnl0ZU9yIDw9IDI1NSkgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhidWZmZXIpOwoKICAvLyBJZiB0aGVyZSB3YXMgYW4gaW52YWxpZCBieXRlLCBmaW5kIGl0IGFuZCB0aHJvdyBhbiBleGNlcHRpb24uCiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIHZhciBieXRlID0gYnl0ZXNbaV07CiAgICBpZiAoYnl0ZSA+PSAwICYmIGJ5dGUgPD0gMHhmZikgY29udGludWU7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICJJbnZhbGlkIGJ5dGUgJHtieXRlIDwgMCA/ICItIiA6ICIifTB4JHtieXRlLmFicygpLnRvUmFkaXhTdHJpbmcoMTYpfS4iLAogICAgICAgIGJ5dGVzLAogICAgICAgIGkpOwogIH0KCiAgdGhyb3cgJ3VucmVhY2hhYmxlJzsKfQoKLy8vIFJldHVybnMgdGhlIEFTQ0lJL1VuaWNvZGUgY29kZSB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhleGFkZWNpbWFsIGRpZ2l0Ci8vLyBbZGlnaXRdLgppbnQgX2NvZGVVbml0Rm9yRGlnaXQoaW50IGRpZ2l0KSA9PiBkaWdpdCA8IDEwID8gZGlnaXQgKyAkMCA6IGRpZ2l0ICsgJGEgLSAxMDsKWwBOTjwBHQEXGgEmASwpAUMETyA4GAFHAUIhAgE4N0ccAR8BHjEEAUQ6LB8EARETBAIBN09LGzEXAUdLEBImGRQBUU87QzwEAU0BQyYZLR9RDwwEARcCAU8NTwEkcGFja2FnZTpjb252ZXJ0L3NyYy9oZXgvZW5jb2Rlci5kYXJ0VGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb252ZXJ0L2xpYi9zcmMvaGV4L2RlY29kZXIuZGFydJT9Ly8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC5oZXguZGVjb2RlcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKaW1wb3J0ICcuLi91dGlscy5kYXJ0JzsKCi8vLyBUaGUgY2Fub25pY2FsIGluc3RhbmNlIG9mIFtIZXhEZWNvZGVyXS4KY29uc3QgaGV4RGVjb2RlciA9IGNvbnN0IEhleERlY29kZXIuXygpOwoKLy8vIEEgY29udmVydGVyIHRoYXQgZGVjb2RlcyBoZXhhZGVjaW1hbCBzdHJpbmdzIGludG8gYnl0ZSBhcnJheXMuCi8vLwovLy8gQmVjYXVzZSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgYnl0ZSwgdGhpcyB3aWxsIHRocm93Ci8vLyBhIFtGb3JtYXRFeGNlcHRpb25dIGlmIGdpdmVuIGFuIG9kZC1sZW5ndGggc3RyaW5nLiBJdCB3aWxsIGFsc28gdGhyb3cgYQovLy8gW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgZ2l2ZW4gYSBzdHJpbmcgY29udGFpbmluZyBub24taGV4YWRlY2ltYWwgY29kZSB1bml0cy4KY2xhc3MgSGV4RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gewogIGNvbnN0IEhleERlY29kZXIuXygpOwoKICBMaXN0PGludD4gY29udmVydChTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoIXN0cmluZy5sZW5ndGguaXNFdmVuKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBpbnB1dCBsZW5ndGgsIG11c3QgYmUgZXZlbi4iLCBzdHJpbmcsIHN0cmluZy5sZW5ndGgpOwogICAgfQoKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OExpc3Qoc3RyaW5nLmxlbmd0aCB+LyAyKTsKICAgIF9kZWNvZGUoc3RyaW5nLmNvZGVVbml0cywgMCwgc3RyaW5nLmxlbmd0aCwgYnl0ZXMsIDApOwogICAgcmV0dXJuIGJ5dGVzOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgPT4KICAgICAgbmV3IF9IZXhEZWNvZGVyU2luayhzaW5rKTsKfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIGhleGFkZWNpbWFsIGRlY29kaW5nLgpjbGFzcyBfSGV4RGVjb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgdW5kZXJseWluZyBzaW5rIHRvIHdoaWNoIGRlY29kZWQgYnl0ZSBhcnJheXMgd2lsbCBiZSBwYXNzZWQuCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwoKICAvLy8gVGhlIHRyYWlsaW5nIGRpZ2l0IGZyb20gdGhlIHByZXZpb3VzIHN0cmluZy4KICAvLy8KICAvLy8gVGhpcyB3aWxsIGJlIG5vbi1gbnVsbGAgaWYgdGhlIG1vc3QgcmVjZW50IHN0cmluZyBoYWQgYW4gb2RkIG51bWJlciBvZgogIC8vLyBoZXhhZGVjaW1hbCBkaWdpdHMuIFNpbmNlIGl0J3MgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIGl0J3MgYWx3YXlzIGEKICAvLy8gbXVsdGlwbGUgb2YgMTYuCiAgaW50IF9sYXN0RGlnaXQ7CgogIF9IZXhEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzdHJpbmcubGVuZ3RoKTsKCiAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgIGlmIChpc0xhc3QpIF9jbG9zZShzdHJpbmcsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgY29kZVVuaXRzID0gc3RyaW5nLmNvZGVVbml0czsKICAgIFVpbnQ4TGlzdCBieXRlczsKICAgIGludCBieXRlc1N0YXJ0OwogICAgaWYgKF9sYXN0RGlnaXQgPT0gbnVsbCkgewogICAgICBieXRlcyA9IG5ldyBVaW50OExpc3QoKGVuZCAtIHN0YXJ0KSB+LyAyKTsKICAgICAgYnl0ZXNTdGFydCA9IDA7CiAgICB9IGVsc2UgewogICAgICB2YXIgaGV4UGFpcnMgPSAoZW5kIC0gc3RhcnQgLSAxKSB+LyAyOwogICAgICBieXRlcyA9IG5ldyBVaW50OExpc3QoMSArIGhleFBhaXJzKTsKICAgICAgYnl0ZXNbMF0gPSBfbGFzdERpZ2l0ICsgZGlnaXRGb3JDb2RlVW5pdChjb2RlVW5pdHMsIHN0YXJ0KTsKICAgICAgc3RhcnQrKzsKICAgICAgYnl0ZXNTdGFydCA9IDE7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY29kZVVuaXRzLCBzdGFydCwgZW5kLCBieXRlcywgYnl0ZXNTdGFydCk7CgogICAgX3NpbmsuYWRkKGJ5dGVzKTsKICAgIGlmIChpc0xhc3QpIF9jbG9zZShzdHJpbmcsIGVuZCk7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgYXNVdGY4U2luayhib29sIGFsbG93TWFsZm9ybWVkKSA9PgogICAgICBuZXcgX0hleERlY29kZXJCeXRlU2luayhfc2luayk7CgogIHZvaWQgY2xvc2UoKSA9PiBfY2xvc2UoKTsKCiAgLy8vIExpa2UgW2Nsb3NlXSwgYnV0IGluY2x1ZGVzIFtzdHJpbmddIGFuZCBbaW5kZXhdIGluIHRoZSBbRm9ybWF0RXhjZXB0aW9uXQogIC8vLyBpZiBvbmUgaXMgdGhyb3duLgogIHZvaWQgX2Nsb3NlKFtTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXhdKSB7CiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBzdHJpbmcsIGluZGV4KTsKICAgIH0KCiAgICBfc2luay5jbG9zZSgpOwogIH0KfQoKLy8vIEEgY29udmVyc2lvbiBzaW5rIGZvciBjaHVua2VkIGhleGFkZWNpbWFsIGRlY29kaW5nIGZyb20gVVRGLTggYnl0ZXMuCmNsYXNzIF9IZXhEZWNvZGVyQnl0ZVNpbmsgZXh0ZW5kcyBCeXRlQ29udmVyc2lvblNpbmtCYXNlIHsKICAvLy8gVGhlIHVuZGVybHlpbmcgc2luayB0byB3aGljaCBkZWNvZGVkIGJ5dGUgYXJyYXlzIHdpbGwgYmUgcGFzc2VkLgogIGZpbmFsIFNpbms8TGlzdDxpbnQ+PiBfc2luazsKCiAgLy8vIFRoZSB0cmFpbGluZyBkaWdpdCBmcm9tIHRoZSBwcmV2aW91cyBzdHJpbmcuCiAgLy8vCiAgLy8vIFRoaXMgd2lsbCBiZSBub24tYG51bGxgIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgaGFkIGFuIG9kZCBudW1iZXIgb2YKICAvLy8gaGV4YWRlY2ltYWwgZGlnaXRzLiBTaW5jZSBpdCdzIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0LCBpdCdzIGFsd2F5cyBhCiAgLy8vIG11bHRpcGxlIG9mIDE2LgogIGludCBfbGFzdERpZ2l0OwoKICBfSGV4RGVjb2RlckJ5dGVTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspID0+IGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNodW5rLmxlbmd0aCk7CgogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICBpZiAoaXNMYXN0KSBfY2xvc2UoY2h1bmssIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBVaW50OExpc3QgYnl0ZXM7CiAgICBpbnQgYnl0ZXNTdGFydDsKICAgIGlmIChfbGFzdERpZ2l0ID09IG51bGwpIHsKICAgICAgYnl0ZXMgPSBuZXcgVWludDhMaXN0KChlbmQgLSBzdGFydCkgfi8gMik7CiAgICAgIGJ5dGVzU3RhcnQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGhleFBhaXJzID0gKGVuZCAtIHN0YXJ0IC0gMSkgfi8gMjsKICAgICAgYnl0ZXMgPSBuZXcgVWludDhMaXN0KDEgKyBoZXhQYWlycyk7CiAgICAgIGJ5dGVzWzBdID0gX2xhc3REaWdpdCArIGRpZ2l0Rm9yQ29kZVVuaXQoY2h1bmssIHN0YXJ0KTsKICAgICAgc3RhcnQrKzsKICAgICAgYnl0ZXNTdGFydCA9IDE7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY2h1bmssIHN0YXJ0LCBlbmQsIGJ5dGVzLCBieXRlc1N0YXJ0KTsKCiAgICBfc2luay5hZGQoYnl0ZXMpOwogICAgaWYgKGlzTGFzdCkgX2Nsb3NlKGNodW5rLCBlbmQpOwogIH0KCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW2NodW5rXSBhbmQgW2luZGV4XSBpbiB0aGUgW0Zvcm1hdEV4Y2VwdGlvbl0KICAvLy8gaWYgb25lIGlzIHRocm93bi4KICB2b2lkIF9jbG9zZShbTGlzdDxpbnQ+IGNodW5rLCBpbnQgaW5kZXhdKSB7CiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBjaHVuaywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gRGVjb2RlcyBbY29kZVVuaXRzXSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dLgovLy8KLy8vIFRoaXMgcmVhZHMgZnJvbSBbY29kZVVuaXRzXSBiZXR3ZWVuIFtzb3VyY2VTdGFydF0gYW5kIFtzb3VyY2VFbmRdLiBJdCB3cml0ZXMKLy8vIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dIHN0YXJ0aW5nIGF0IFtkZXN0aW5hdGlvblN0YXJ0XS4KLy8vCi8vLyBJZiB0aGVyZSdzIGEgbGVmdG92ZXIgZGlnaXQgYXQgdGhlIGVuZCBvZiB0aGUgZGVjb2RpbmcsIHRoaXMgcmV0dXJucyB0aGF0Ci8vLyBkaWdpdC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYG51bGxgLgppbnQgX2RlY29kZShMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQsCiAgICBMaXN0PGludD4gZGVzdGluYXRpb24sIGludCBkZXN0aW5hdGlvblN0YXJ0KSB7CiAgdmFyIGRlc3RpbmF0aW9uSW5kZXggPSBkZXN0aW5hdGlvblN0YXJ0OwogIGZvciAodmFyIGkgPSBzb3VyY2VTdGFydDsgaSA8IHNvdXJjZUVuZCAtIDE7IGkgKz0gMikgewogICAgdmFyIGZpcnN0RGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSk7CiAgICB2YXIgc2Vjb25kRGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSArIDEpOwogICAgZGVzdGluYXRpb25bZGVzdGluYXRpb25JbmRleCsrXSA9IDE2ICogZmlyc3REaWdpdCArIHNlY29uZERpZ2l0OwogIH0KCiAgaWYgKChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCkuaXNFdmVuKSByZXR1cm4gbnVsbDsKICByZXR1cm4gMTYgKiBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgc291cmNlRW5kIC0gMSk7Cn0KgK4ATk48AR0BFxoBGAEsKQFDBFBMTzgYASUhIUkGATM7EgQBRyECATg5Rx8BMwZNTxYSAR8BQjsBGCcOBgEmFRQeMRYNLStCDxYGAUQBFiUEATgmARwBTxgsHiFHBgETBAIBSTtHHwEzBk1PFhIBIwFIAUQ6ARgmDgYBFRQeMRYNLSs+DxYGAUABFiQEARwBThguHiFGBgETBAIBQgRRQgROKEEzKzk1OkUEATU6AgEkcGFja2FnZTpjb252ZXJ0L3NyYy9oZXgvZGVjb2Rlci5kYXJ0WGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb252ZXJ0L2xpYi9zcmMvcGVyY2VudC9lbmNvZGVyLmRhcnSOJi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGNvbnZlcnQucGVyY2VudC5lbmNvZGVyOwoKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmNoYXJjb2RlL2FzY2lpLmRhcnQnOwoKLy8vIFRoZSBjYW5vbmljYWwgaW5zdGFuY2Ugb2YgW1BlcmNlbnRFbmNvZGVyXS4KY29uc3QgcGVyY2VudEVuY29kZXIgPSBjb25zdCBQZXJjZW50RW5jb2Rlci5fKCk7CgovLy8gQSBjb252ZXJ0ZXIgdGhhdCBlbmNvZGVzIGJ5dGUgYXJyYXlzIGludG8gcGVyY2VudC1lbmNvZGVkIHN0cmluZ3MuCi8vLwovLy8gW2VuY29kZXJdIGVuY29kZXMgYWxsIGJ5dGVzIG90aGVyIHRoYW4gQVNDSUkgbGV0dGVycywgZGVjaW1hbCBkaWdpdHMsIG9yIG9uZQovLy8gb2YgYC0uX35gLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIFtVcmkuZW5jb2RlUXVlcnlDb21wb25lbnRdIGV4Y2VwdAovLy8gdGhhdCBpdCBkb2Vzbid0IGVuY29kZSBgMHgyMGAgYnl0ZXMgdG8gdGhlIGArYCBjaGFyYWN0ZXIuCi8vLwovLy8gVGhpcyB3aWxsIHRocm93IGEgW1JhbmdlRXJyb3JdIGlmIHRoZSBieXRlIGFycmF5IGhhcyBhbnkgZGlnaXRzIHRoYXQgZG9uJ3QKLy8vIGZpdCBpbiB0aGUgZ2FtdXQgb2YgYSBieXRlLgpjbGFzcyBQZXJjZW50RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGNvbnN0IFBlcmNlbnRFbmNvZGVyLl8oKTsKCiAgU3RyaW5nIGNvbnZlcnQoTGlzdDxpbnQ+IGJ5dGVzKSA9PiBfY29udmVydChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspID0+CiAgICAgIG5ldyBfUGVyY2VudEVuY29kZXJTaW5rKHNpbmspOwp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgcGVyY2VudGFkZWNpbWFsIGVuY29kaW5nLgpjbGFzcyBfUGVyY2VudEVuY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSB1bmRlcmx5aW5nIHNpbmsgdG8gd2hpY2ggZGVjb2RlZCBieXRlIGFycmF5cyB3aWxsIGJlIHBhc3NlZC4KICBmaW5hbCBTaW5rPFN0cmluZz4gX3Npbms7CgogIF9QZXJjZW50RW5jb2RlclNpbmsodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBjaHVuaykgewogICAgX3NpbmsuYWRkKF9jb252ZXJ0KGNodW5rLCAwLCBjaHVuay5sZW5ndGgpKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBjaHVuay5sZW5ndGgpOwogICAgX3NpbmsuYWRkKF9jb252ZXJ0KGNodW5rLCBzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBfc2luay5jbG9zZSgpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgpTdHJpbmcgX2NvbnZlcnQoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICB2YXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKICAvLyBBIGJpdHdpc2UgT1Igb2YgYWxsIGJ5dGVzIGluIFtieXRlc10uIFRoaXMgYWxsb3dzIHVzIHRvIGNoZWNrIGZvcgogIC8vIG91dC1vZi1yYW5nZSBieXRlcyB3aXRob3V0IGFkZGluZyBtb3JlIGJyYW5jaGVzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZQogIC8vIGNvcmUgbG9vcC4KICB2YXIgYnl0ZU9yID0gMDsKICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGJ5dGVPciB8PSBieXRlOwoKICAgIC8vIElmIHRoZSBieXRlIGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGNvbnZlcnQgaXQgdG8gbG93ZXJjYXNlIHRvIGNoZWNrIGlmCiAgICAvLyBpdCdzIHVucmVzZXJ2ZWQuIFRoaXMgd29ya3MgYmVjYXVzZSB1cHBlcmNhc2UgbGV0dGVycyBpbiBBU0NJSSBhcmUKICAgIC8vIGV4YWN0bHkgYDBiMTAwMDAwID0gMHgyMGAgbGVzcyB0aGFuIGxvd2VyY2FzZSBsZXR0ZXJzLCBzbyBpZiB3ZSBlbnN1cmUKICAgIC8vIHRoYXQgdGhhdCBiaXQgaXMgMSB3ZSBlbnN1cmUgdGhhdCB0aGUgbGV0dGVyIGlzIGxvd2VyY2FzZS4KICAgIHZhciBsZXR0ZXIgPSAweDIwIHwgYnl0ZTsKICAgIGlmICgobGV0dGVyID49ICRhICYmIGxldHRlciA8PSAkeikgfHwKICAgICAgICAoYnl0ZSA+PSAkMCAmJiBieXRlIDw9ICQ5KSB8fAogICAgICAgIGJ5dGUgPT0gJGRhc2ggfHwKICAgICAgICBieXRlID09ICRkb3QgfHwKICAgICAgICBieXRlID09ICR1bmRlcnNjb3JlIHx8CiAgICAgICAgYnl0ZSA9PSAkdGlsZGUpIHsKICAgICAgLy8gVW5yZXNlcnZlZCBjaGFyYWN0ZXJzIGFyZSBzYWZlIHRvIHdyaXRlIGFzLWlzLgogICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShieXRlKTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoJHBlcmNlbnQpOwoKICAgIC8vIFRoZSBiaXR3aXNlIGFyaXRobWV0aWMgaGVyZSBpcyBlcXVpdmFsZW50IHRvIGBieXRlIH4vIDE2YCBhbmQgYGJ5dGUgJSAxNmAKICAgIC8vIGZvciB2YWxpZCBieXRlIHZhbHVlcywgYnV0IGlzIGVhc2llciBmb3IgZGFydDJqcyB0byBvcHRpbWl6ZSBnaXZlbiB0aGF0CiAgICAvLyBpdCBjYW4ndCBwcm92ZSB0aGF0IFtieXRlXSB3aWxsIGFsd2F5cyBiZSBwb3NpdGl2ZS4KICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKF9jb2RlVW5pdEZvckRpZ2l0KChieXRlICYgMHhGMCkgPj4gNCkpOwogICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoX2NvZGVVbml0Rm9yRGlnaXQoYnl0ZSAmIDB4MEYpKTsKICB9CgogIGlmIChieXRlT3IgPj0gMCAmJiBieXRlT3IgPD0gMjU1KSByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CgogIC8vIElmIHRoZXJlIHdhcyBhbiBpbnZhbGlkIGJ5dGUsIGZpbmQgaXQgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4KICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgIGlmIChieXRlID49IDAgJiYgYnl0ZSA8PSAweGZmKSBjb250aW51ZTsKICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgIkludmFsaWQgYnl0ZSAke2J5dGUgPCAwID8gIi0iIDogIiJ9MHgke2J5dGUuYWJzKCkudG9SYWRpeFN0cmluZygxNil9LiIsCiAgICAgICAgYnl0ZXMsCiAgICAgICAgaSk7CiAgfQoKICB0aHJvdyAndW5yZWFjaGFibGUnOwp9CgovLy8gUmV0dXJucyB0aGUgQVNDSUkvVW5pY29kZSBjb2RlIHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGUgaGV4YWRlY2ltYWwgZGlnaXQKLy8vIFtkaWdpdF0uCmludCBfY29kZVVuaXRGb3JEaWdpdChpbnQgZGlnaXQpID0+IGRpZ2l0IDwgMTAgPyBkaWdpdCArICQwIDogZGlnaXQgKyAkQSAtIDEwOwpsAE5OPAEhARcBJgEwMQFHBFFOPgRPIDwcAUcBQiUCATw7RxwBIwEeMQQBRDosHwQBERMEAgE3IwFHSxASJhkUAU9KTkIeKiYZGB8aOCIQBgEkAVFPO0E6BAE+AUMmGS0fUQ8MBAEXAgFPDU8BKHBhY2thZ2U6Y29udmVydC9zcmMvcGVyY2VudC9lbmNvZGVyLmRhcnRYZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NvbnZlcnQvbGliL3NyYy9wZXJjZW50L2RlY29kZXIuZGFydJ3sLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC5wZXJjZW50LmRlY29kZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CgppbXBvcnQgJ3BhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydCc7CmltcG9ydCAncGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydCc7CgppbXBvcnQgJy4uL3V0aWxzLmRhcnQnOwoKLy8vIFRoZSBjYW5vbmljYWwgaW5zdGFuY2Ugb2YgW1BlcmNlbnREZWNvZGVyXS4KY29uc3QgcGVyY2VudERlY29kZXIgPSBjb25zdCBQZXJjZW50RGVjb2Rlci5fKCk7Cgpjb25zdCBfbGFzdFBlcmNlbnQgPSAtMTsKCi8vLyBBIGNvbnZlcnRlciB0aGF0IGRlY29kZXMgcGVyY2VudC1lbmNvZGVkIHN0cmluZ3MgaW50byBieXRlIGFycmF5cy4KLy8vCi8vLyBUbyBiZSBtYXhpbWFsbHkgZmxleGlibGUsIHRoaXMgd2lsbCBkZWNvZGUgYW55IHBlcmNlbnQtZW5jb2RlZCBieXRlIGFuZAovLy8gd2lsbCBhbGxvdyBhbnkgbm9uLXBlcmNlbnQtZW5jb2RlZCBieXRlIG90aGVyIHRoYW4gYCVgLiBCeSBkZWZhdWx0LCBpdAovLy8gaW50ZXJwcmV0cyBgK2AgYXMgYDB4MkJgIHJhdGhlciB0aGFuIGAweDIwYCBhcyBlbWl0dGVkIGJ5Ci8vLyBbVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50XS4KLy8vCi8vLyBUaGlzIHdpbGwgdGhyb3cgYSBbRm9ybWF0RXhjZXB0aW9uXSBpZiB0aGUgaW5wdXQgc3RyaW5nIGhhcyBhbiBpbmNvbXBsZXRlCi8vLyBwZXJjZW50LWVuY29kaW5nLCBvciBpZiBpdCBjb250YWlucyBub24tQVNDSUkgY29kZSB1bml0cy4KY2xhc3MgUGVyY2VudERlY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IHsKICBjb25zdCBQZXJjZW50RGVjb2Rlci5fKCk7CgogIExpc3Q8aW50PiBjb252ZXJ0KFN0cmluZyBzdHJpbmcpIHsKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhCdWZmZXIoKTsKICAgIHZhciBsYXN0RGlnaXQgPSBfZGVjb2RlKHN0cmluZy5jb2RlVW5pdHMsIDAsIHN0cmluZy5sZW5ndGgsIGJ1ZmZlcik7CgogICAgaWYgKGxhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBzdHJpbmcsIHN0cmluZy5sZW5ndGgpOwogICAgfQoKICAgIHJldHVybiBidWZmZXIuYnVmZmVyLmFzVWludDhMaXN0KDAsIGJ1ZmZlci5sZW5ndGgpOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgPT4KICAgICAgbmV3IF9QZXJjZW50RGVjb2RlclNpbmsoc2luayk7Cn0KCi8vLyBBIGNvbnZlcnNpb24gc2luayBmb3IgY2h1bmtlZCBwZXJjZW50LWVuY29kZWQgZGVjb2RpbmcuCmNsYXNzIF9QZXJjZW50RGVjb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIC8vLyBUaGUgdW5kZXJseWluZyBzaW5rIHRvIHdoaWNoIGRlY29kZWQgYnl0ZSBhcnJheXMgd2lsbCBiZSBwYXNzZWQuCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwoKICAvLy8gVGhlIHRyYWlsaW5nIGRpZ2l0IGZyb20gdGhlIHByZXZpb3VzIHN0cmluZy4KICAvLy8KICAvLy8gVGhpcyBpcyBgbnVsbGAgaWYgdGhlIHByZXZpb3VzIHN0cmluZyBlbmRlZCB3aXRoIGEgY29tcGxldGUKICAvLy8gcGVyY2VudC1lbmNvZGVkIGJ5dGUgb3IgYSBsaXRlcmFsIGNoYXJhY3Rlci4gSXQncyBbX2xhc3RQZXJjZW50XSBpZiB0aGUKICAvLy8gbW9zdCByZWNlbnQgc3RyaW5nIGVuZGVkIHdpdGggYCVgLiBPdGhlcndpc2UsIHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgZW5kZWQKICAvLy8gd2l0aCBhIGAlYCBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIGRpZ2l0LCBhbmQgdGhpcyBpcyB0aGF0IGRpZ2l0LiBTaW5jZQogIC8vLyBpdCdzIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0LCBpdCdzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDE2LgogIGludCBfbGFzdERpZ2l0OwoKICBfUGVyY2VudERlY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZy5sZW5ndGgpOwoKICAgIGlmIChzdGFydCA9PSBlbmQpIHsKICAgICAgaWYgKGlzTGFzdCkgX2Nsb3NlKHN0cmluZywgZW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhCdWZmZXIoKTsKICAgIHZhciBjb2RlVW5pdHMgPSBzdHJpbmcuY29kZVVuaXRzOwogICAgaWYgKF9sYXN0RGlnaXQgPT0gX2xhc3RQZXJjZW50KSB7CiAgICAgIF9sYXN0RGlnaXQgPSAxNiAqIGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBzdGFydCk7CiAgICAgIHN0YXJ0Kys7CgogICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgaWYgKGlzTGFzdCkgX2Nsb3NlKHN0cmluZywgZW5kKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIGJ1ZmZlci5hZGQoX2xhc3REaWdpdCArIGRpZ2l0Rm9yQ29kZVVuaXQoY29kZVVuaXRzLCBzdGFydCkpOwogICAgICBzdGFydCsrOwogICAgfQoKICAgIF9sYXN0RGlnaXQgPSBfZGVjb2RlKGNvZGVVbml0cywgc3RhcnQsIGVuZCwgYnVmZmVyKTsKCiAgICBfc2luay5hZGQoYnVmZmVyLmJ1ZmZlci5hc1VpbnQ4TGlzdCgwLCBidWZmZXIubGVuZ3RoKSk7CiAgICBpZiAoaXNMYXN0KSBfY2xvc2Uoc3RyaW5nLCBlbmQpOwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIGFzVXRmOFNpbmsoYm9vbCBhbGxvd01hbGZvcm1lZCkgPT4KICAgICAgbmV3IF9QZXJjZW50RGVjb2RlckJ5dGVTaW5rKF9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW3N0cmluZ10gYW5kIFtpbmRleF0gaW4gdGhlIFtGb3JtYXRFeGNlcHRpb25dCiAgLy8vIGlmIG9uZSBpcyB0aHJvd24uCiAgdm9pZCBfY2xvc2UoW1N0cmluZyBzdHJpbmcsIGludCBpbmRleF0pIHsKICAgIGlmIChfbGFzdERpZ2l0ICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICJJbnB1dCBlbmRlZCB3aXRoIGluY29tcGxldGUgZW5jb2RlZCBieXRlLiIsIHN0cmluZywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gQSBjb252ZXJzaW9uIHNpbmsgZm9yIGNodW5rZWQgcGVyY2VudC1lbmNvZGVkIGRlY29kaW5nIGZyb20gVVRGLTggYnl0ZXMuCmNsYXNzIF9QZXJjZW50RGVjb2RlckJ5dGVTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIFRoZSB1bmRlcmx5aW5nIHNpbmsgdG8gd2hpY2ggZGVjb2RlZCBieXRlIGFycmF5cyB3aWxsIGJlIHBhc3NlZC4KICBmaW5hbCBTaW5rPExpc3Q8aW50Pj4gX3Npbms7CgogIC8vLyBUaGUgdHJhaWxpbmcgZGlnaXQgZnJvbSB0aGUgcHJldmlvdXMgc3RyaW5nLgogIC8vLwogIC8vLyBUaGlzIGlzIGBudWxsYCBpZiB0aGUgcHJldmlvdXMgc3RyaW5nIGVuZGVkIHdpdGggYSBjb21wbGV0ZQogIC8vLyBwZXJjZW50LWVuY29kZWQgYnl0ZSBvciBhIGxpdGVyYWwgY2hhcmFjdGVyLiBJdCdzIFtfbGFzdFBlcmNlbnRdIGlmIHRoZQogIC8vLyBtb3N0IHJlY2VudCBzdHJpbmcgZW5kZWQgd2l0aCBgJWAuIE90aGVyd2lzZSwgdGhlIG1vc3QgcmVjZW50IHN0cmluZyBlbmRlZAogIC8vLyB3aXRoIGEgYCVgIGZvbGxvd2VkIGJ5IGEgaGV4YWRlY2ltYWwgZGlnaXQsIGFuZCB0aGlzIGlzIHRoYXQgZGlnaXQuIFNpbmNlCiAgLy8vIGl0J3MgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIGl0J3MgYWx3YXlzIGEgbXVsdGlwbGUgb2YgMTYuCiAgaW50IF9sYXN0RGlnaXQ7CgogIF9QZXJjZW50RGVjb2RlckJ5dGVTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspID0+IGFkZFNsaWNlKGNodW5rLCAwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTsKCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGNodW5rLmxlbmd0aCk7CgogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICBpZiAoaXNMYXN0KSBfY2xvc2UoY2h1bmssIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QnVmZmVyKCk7CiAgICBpZiAoX2xhc3REaWdpdCA9PSBfbGFzdFBlcmNlbnQpIHsKICAgICAgX2xhc3REaWdpdCA9IDE2ICogZGlnaXRGb3JDb2RlVW5pdChjaHVuaywgc3RhcnQpOwogICAgICBzdGFydCsrOwoKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICAgIGlmIChpc0xhc3QpIF9jbG9zZShjaHVuaywgZW5kKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIGJ1ZmZlci5hZGQoX2xhc3REaWdpdCArIGRpZ2l0Rm9yQ29kZVVuaXQoY2h1bmssIHN0YXJ0KSk7CiAgICAgIHN0YXJ0Kys7CiAgICB9CgogICAgX2xhc3REaWdpdCA9IF9kZWNvZGUoY2h1bmssIHN0YXJ0LCBlbmQsIGJ1ZmZlcik7CgogICAgX3NpbmsuYWRkKGJ1ZmZlci5idWZmZXIuYXNVaW50OExpc3QoMCwgYnVmZmVyLmxlbmd0aCkpOwogICAgaWYgKGlzTGFzdCkgX2Nsb3NlKGNodW5rLCBlbmQpOwogIH0KCiAgdm9pZCBjbG9zZSgpID0+IF9jbG9zZSgpOwoKICAvLy8gTGlrZSBbY2xvc2VdLCBidXQgaW5jbHVkZXMgW2NodW5rXSBhbmQgW2luZGV4XSBpbiB0aGUgW0Zvcm1hdEV4Y2VwdGlvbl0KICAvLy8gaWYgb25lIGlzIHRocm93bi4KICB2b2lkIF9jbG9zZShbTGlzdDxpbnQ+IGNodW5rLCBpbnQgaW5kZXhdKSB7CiAgICBpZiAoX2xhc3REaWdpdCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW5wdXQgZW5kZWQgd2l0aCBpbmNvbXBsZXRlIGVuY29kZWQgYnl0ZS4iLCBjaHVuaywgaW5kZXgpOwogICAgfQoKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgovLy8gRGVjb2RlcyBbY29kZVVuaXRzXSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dLgovLy8KLy8vIFRoaXMgcmVhZHMgZnJvbSBbY29kZVVuaXRzXSBiZXR3ZWVuIFtzb3VyY2VTdGFydF0gYW5kIFtzb3VyY2VFbmRdLiBJdCB3cml0ZXMKLy8vIHRoZSByZXN1bHQgaW50byBbZGVzdGluYXRpb25dIHN0YXJ0aW5nIGF0IFtkZXN0aW5hdGlvblN0YXJ0XS4KLy8vCi8vLyBJZiB0aGVyZSdzIGEgbGVmdG92ZXIgZGlnaXQgYXQgdGhlIGVuZCBvZiB0aGUgZGVjb2RpbmcsIHRoaXMgcmV0dXJucyB0aGF0Ci8vLyBkaWdpdC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYG51bGxgLgppbnQgX2RlY29kZShMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc3RhcnQsIGludCBlbmQsIFVpbnQ4QnVmZmVyIGJ1ZmZlcikgewogIC8vIEEgYml0d2lzZSBPUiBvZiBhbGwgY29kZSB1bml0cyBpbiBbY29kZVVuaXRzXS4gVGhpcyBhbGxvd3MgdXMgdG8gY2hlY2sgZm9yCiAgLy8gb3V0LW9mLXJhbmdlIGNvZGUgdW5pdHMgd2l0aG91dCBhZGRpbmcgbW9yZSBicmFuY2hlcyB0aGFuIG5lY2Vzc2FyeSB0byB0aGUKICAvLyBjb3JlIGxvb3AuCiAgdmFyIGNvZGVVbml0T3IgPSAwOwoKICAvLyBUaGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IHNsaWNlIG9mIGFkamFjZW50IG5vbi0lIGNoYXJhY3RlcnMuIFdlIGNhbiBhZGQKICAvLyBhbGwgb2YgdGhlc2UgdG8gdGhlIGJ1ZmZlciBhdCBvbmNlLgogIHZhciBzbGljZVN0YXJ0ID0gc3RhcnQ7CiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIC8vIEZpcnN0LCBsb29wIHRocm91Z2ggbm9uLSUgY2hhcmFjdGVycy4KICAgIHZhciBjb2RlVW5pdCA9IGNvZGVVbml0c1tpXTsKICAgIGlmIChjb2RlVW5pdHNbaV0gIT0gJHBlcmNlbnQpIHsKICAgICAgY29kZVVuaXRPciB8PSBjb2RlVW5pdDsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gV2UgZm91bmQgYSAlLiBUaGUgc2xpY2UgZnJvbSBgc2xpY2VTdGFydGAgdG8gYGlgIHJlcHJlc2VudHMgY2hhcmFjdGVycwogICAgLy8gdGhhbiBjYW4gYmUgY29waWVkIHRvIHRoZSBidWZmZXIgYXMtaXMuCiAgICBpZiAoaSA+IHNsaWNlU3RhcnQpIHsKICAgICAgX2NoZWNrRm9ySW52YWxpZENvZGVVbml0KGNvZGVVbml0T3IsIGNvZGVVbml0cywgc2xpY2VTdGFydCwgaSk7CiAgICAgIGJ1ZmZlci5hZGRBbGwoY29kZVVuaXRzLCBzbGljZVN0YXJ0LCBpKTsKICAgIH0KCiAgICAvLyBOb3cgZGVjb2RlIHRoZSBwZXJjZW50LWVuY29kZWQgYnl0ZSBhbmQgYWRkIGl0IGFzIHdlbGwuCiAgICBpKys7CiAgICBpZiAoaSA+PSBlbmQpIHJldHVybiBfbGFzdFBlcmNlbnQ7CgogICAgdmFyIGZpcnN0RGlnaXQgPSBkaWdpdEZvckNvZGVVbml0KGNvZGVVbml0cywgaSk7CiAgICBpKys7CiAgICBpZiAoaSA+PSBlbmQpIHJldHVybiAxNiAqIGZpcnN0RGlnaXQ7CgogICAgdmFyIHNlY29uZERpZ2l0ID0gZGlnaXRGb3JDb2RlVW5pdChjb2RlVW5pdHMsIGkpOwogICAgYnVmZmVyLmFkZCgxNiAqIGZpcnN0RGlnaXQgKyBzZWNvbmREaWdpdCk7CgogICAgLy8gVGhlIG5leHQgaXRlcmF0aW9uIHdpbGwgbG9vayBmb3Igbm9uLSUgY2hhcmFjdGVycyBhZ2Fpbi4KICAgIHNsaWNlU3RhcnQgPSBpICsgMTsKICB9CgogIGlmIChlbmQgPiBzbGljZVN0YXJ0KSB7CiAgICBfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXQoY29kZVVuaXRPciwgY29kZVVuaXRzLCBzbGljZVN0YXJ0LCBlbmQpOwogICAgaWYgKHN0YXJ0ID09IHNsaWNlU3RhcnQpIHsKICAgICAgYnVmZmVyLmFkZEFsbChjb2RlVW5pdHMpOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLmFkZEFsbChjb2RlVW5pdHMsIHNsaWNlU3RhcnQsIGVuZCk7CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKdm9pZCBfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXQoCiAgICBpbnQgY29kZVVuaXRPciwgTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgaWYgKGNvZGVVbml0T3IgPj0gMCAmJiBjb2RlVW5pdE9yIDw9IDB4N2YpIHJldHVybjsKCiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIHZhciBjb2RlVW5pdCA9IGNvZGVVbml0c1tpXTsKICAgIGlmIChjb2RlVW5pdCA+PSAwICYmIGNvZGVVbml0IDw9IDB4N2YpIGNvbnRpbnVlOwogICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAiTm9uLUFTQ0lJIGNvZGUgdW5pdCAiCiAgICAgICAgIlUrJHtjb2RlVW5pdC50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJyl9IiwKICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgaSk7CiAgfQp9CoD2AE5OPAEhARcBJi0BGAEwMQEZAUcETEs+IAROPjwcASUkSQEdIU8GATgEAUclAgE8PUcfATMGQk5RUEUSASMBQjsBGCcOBgEkJiY8DwEaKRAIBgEeQw8GATkBPCUEATgqARwBTxgsHiFHBgETBAIBTT9HHwEzBkJOUVBFEgEnAUgBRDoBGCYOBgEkJjgPARooEAgGAR4/DwYBNQE8JAQBHAFOGC4eIUYGARMEAgFCBFFCBE4oS1BQEBYBUSkaJi0hJB4QBgFOLxpGLwYBPwknATUJKgE2LwFAGAQBGkYfIA0xBgQBDwIBHz81ASYhNR8fOxMMBAIBKHBhY2thZ2U6Y29udmVydC9zcmMvcGVyY2VudC9kZWNvZGVyLmRhcnRVZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL3R5cGVkX2RhdGEvbGliL3R5cGVkX2J1ZmZlcnMuZGFydLPPLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBHcm93YWJsZSB0eXBlZC1kYXRhIGxpc3RzLgovLy8KLy8vIFRoZXNlIGxpc3RzIHdvcmtzIGp1c3QgYXMgYSB0eXBlZC1kYXRhIGxpc3QsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGdyb3dhYmxlLgovLy8gVGhleSB1c2UgYW4gdW5kZXJseWluZyBidWZmZXIsIGFuZCB3aGVuIHRoYXQgYnVmZmVyIGJlY29tZXMgdG9vIHNtYWxsLCBpdAovLy8gaXMgcmVwbGFjZWQgYnkgYSBuZXcgYnVmZmVyLgovLy8KLy8vIFRoYXQgbWVhbnMgdGhhdCB1c2luZyB0aGUgW1R5cGVkRGF0YVZpZXcuYnVmZmVyXSBnZXR0ZXIgaXMgbm90IGd1YXJhbnRlZWQKLy8vIHRvIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZWFjaCB0aW1lIGl0IGlzIHVzZWQsIGFuZCB0aGF0IHRoZSBidWZmZXIgbWF5Ci8vLyBiZSBsYXJnZXIgdGhhbiB3aGF0IHRoZSBsaXN0IGlzIHVzaW5nLgpsaWJyYXJ5IHR5cGVkX2RhdGEudHlwZWRfYnVmZmVyczsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IExpc3RCYXNlOwppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSI7CgphYnN0cmFjdCBjbGFzcyBfVHlwZWREYXRhQnVmZmVyPEU+IGV4dGVuZHMgTGlzdEJhc2U8RT4gewogIHN0YXRpYyBjb25zdCBpbnQgSU5JVElBTF9MRU5HVEggPSA4OwoKICAvLy8gVGhlIHVuZGVybHlpbmcgZGF0YSBidWZmZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYWx3YXlzIGJvdGggYSBMaXN0PEU+IGFuZCBhIFR5cGVkRGF0YSwgd2hpY2ggd2UgZG9uJ3QgaGF2ZSBhIHR5cGUKICAvLy8gZm9yIGhlcmUuIEZvciBleGFtcGxlLCBmb3IgYSBgVWludDhCdWZmZXJgLCB0aGlzIGlzIGEgYFVpbnQ4TGlzdGAuCiAgTGlzdDxFPiBfYnVmZmVyOwoKICAvLy8gUmV0dXJucyBhIHZpZXcgb2YgW19idWZmZXJdIGFzIGEgW1R5cGVkRGF0YV0uCiAgVHlwZWREYXRhIGdldCBfdHlwZWRCdWZmZXIgPT4gX2J1ZmZlciBhcyBUeXBlZERhdGE7CgogIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJlaW5nIGJ1aWx0LgogIGludCBfbGVuZ3RoOwoKICBfVHlwZWREYXRhQnVmZmVyKExpc3Q8RT4gYnVmZmVyKQogICAgICA6IHRoaXMuX2J1ZmZlciA9IGJ1ZmZlciwKICAgICAgICB0aGlzLl9sZW5ndGggPSBidWZmZXIubGVuZ3RoOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcyk7CiAgICByZXR1cm4gX2J1ZmZlcltpbmRleF07CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzKTsKICAgIF9idWZmZXJbaW5kZXhdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCkgewogICAgaWYgKG5ld0xlbmd0aCA8IF9sZW5ndGgpIHsKICAgICAgRSBkZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlOwogICAgICBmb3IgKGludCBpID0gbmV3TGVuZ3RoOyBpIDwgX2xlbmd0aDsgaSsrKSB7CiAgICAgICAgX2J1ZmZlcltpXSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChuZXdMZW5ndGggPiBfYnVmZmVyLmxlbmd0aCkgewogICAgICBMaXN0PEU+IG5ld0J1ZmZlcjsKICAgICAgaWYgKF9idWZmZXIubGVuZ3RoID09IDApIHsKICAgICAgICBuZXdCdWZmZXIgPSBfY3JlYXRlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3QnVmZmVyID0gX2NyZWF0ZUJpZ2dlckJ1ZmZlcihuZXdMZW5ndGgpOwogICAgICB9CiAgICAgIG5ld0J1ZmZlci5zZXRSYW5nZSgwLCBfbGVuZ3RoLCBfYnVmZmVyKTsKICAgICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICAgIH0KICAgIF9sZW5ndGggPSBuZXdMZW5ndGg7CiAgfQoKICB2b2lkIF9hZGQoRSB2YWx1ZSkgewogICAgaWYgKF9sZW5ndGggPT0gX2J1ZmZlci5sZW5ndGgpIF9ncm93KF9sZW5ndGgpOwogICAgX2J1ZmZlcltfbGVuZ3RoKytdID0gdmFsdWU7CiAgfQoKICAvLyBXZSBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgYWRkYCBiZWNhdXNlIGl0IGdyb3dzIHRoZSBsaXN0CiAgLy8gYnkgc2V0dGluZyB0aGUgbGVuZ3RoIGluIGluY3JlbWVudHMgb2Ygb25lLiBXZSB3YW50IHRvIGdyb3cgYnkgZG91YmxpbmcKICAvLyBjYXBhY2l0eSBpbiBtb3N0IGNhc2VzLgogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIF9hZGQodmFsdWUpOwogIH0KCiAgLy8vIEFwcGVuZHMgYWxsIG9iamVjdHMgb2YgW3ZhbHVlc10gdG8gdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlci4KICAvLy8KICAvLy8gVGhpcyBhZGRzIHZhbHVlcyBmcm9tIFtzdGFydF0gKGluY2x1c2l2ZSkgdG8gW2VuZF0gKGV4Y2x1c2l2ZSkgaW4KICAvLy8gW3ZhbHVlc10uIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGFkZGluZyBhbGwgZWxlbWVudHMgb2YKICAvLy8gW3ZhbHVlc10gYWZ0ZXIgW3N0YXJ0XS4KICAvLy8KICAvLy8gVGhlIFtzdGFydF0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUuIFRoZSBbdmFsdWVzXSBpdGVyYWJsZSBtdXN0IGhhdmUgYXQKICAvLy8gbGVhc3QgW3N0YXJ0XSBlbGVtZW50cywgYW5kIGlmIFtlbmRdIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4KICAvLy8gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgW3ZhbHVlc10gbXVzdCBoYXZlIGF0IGxlYXN0IFtlbmRdIGVsZW1lbnRzLgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IHZhbHVlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoc3RhcnQsICJzdGFydCIpOwogICAgaWYgKGVuZCAhPSBudWxsICYmIHN0YXJ0ID4gZW5kKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIG51bGwsICJlbmQiKTsKICAgIH0KCiAgICBfYWRkQWxsKHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgfQoKICAvLy8gSW5zZXJ0cyBhbGwgb2JqZWN0cyBvZiBbdmFsdWVzXSBhdCBwb3NpdGlvbiBbaW5kZXhdIGluIHRoaXMgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBhZGRzIHZhbHVlcyBmcm9tIFtzdGFydF0gKGluY2x1c2l2ZSkgdG8gW2VuZF0gKGV4Y2x1c2l2ZSkgaW4KICAvLy8gW3ZhbHVlc10uIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGFkZGluZyBhbGwgZWxlbWVudHMgb2YKICAvLy8gW3ZhbHVlc10gYWZ0ZXIgW3N0YXJ0XS4KICAvLy8KICAvLy8gVGhlIFtzdGFydF0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUuIFRoZSBbdmFsdWVzXSBpdGVyYWJsZSBtdXN0IGhhdmUgYXQKICAvLy8gbGVhc3QgW3N0YXJ0XSBlbGVtZW50cywgYW5kIGlmIFtlbmRdIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBncmVhdGVyIHRoYW4KICAvLy8gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgW3ZhbHVlc10gbXVzdCBoYXZlIGF0IGxlYXN0IFtlbmRdIGVsZW1lbnRzLgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RT4gdmFsdWVzLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBfbGVuZ3RoICsgMSk7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoc3RhcnQsICJzdGFydCIpOwogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIGlmIChzdGFydCA+IGVuZCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIG51bGwsICJlbmQiKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm47CiAgICB9CgogICAgLy8gSWYgd2UncmUgYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW55d2F5LCB1c2UgW19hZGRBbGxdLiBUaGlzIGxldHMKICAgIC8vIHVzIGF2b2lkIGNvbnZlcnRpbmcgW3ZhbHVlc10gaW50byBhIGxpc3QgZXZlbiBpZiBbZW5kXSBpcyBudWxsLCBzaW5jZSB3ZQogICAgLy8gY2FuIGFkZCB2YWx1ZXMgaXRlcmF0aXZlbHkgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gV2UgY2FuJ3QgZG8gc28gaW4gdGhlCiAgICAvLyBjZW50ZXIgYmVjYXVzZSBjb3B5aW5nIHRoZSB0cmFpbGluZyBlbGVtZW50cyBldmVyeSB0aW1lIGlzIG5vbi1saW5lYXIuCiAgICBpZiAoaW5kZXggPT0gX2xlbmd0aCkgewogICAgICBfYWRkQWxsKHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZW5kID09IG51bGwgJiYgdmFsdWVzIGlzIExpc3QpIHsKICAgICAgZW5kID0gdmFsdWVzLmxlbmd0aDsKICAgIH0KICAgIGlmIChlbmQgIT0gbnVsbCkgewogICAgICBfaW5zZXJ0S25vd25MZW5ndGgoaW5kZXgsIHZhbHVlcywgc3RhcnQsIGVuZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBBZGQgZWxlbWVudHMgYXQgZW5kLCBncm93aW5nIGFzIGFwcHJvcHJpYXRlLCB0aGVuIHB1dCB0aGVtIGJhY2sgYXQKICAgIC8vIHBvc2l0aW9uIFtpbmRleF0gdXNpbmcgZmxpcC1ieS1kb3VibGUtcmV2ZXJzZS4KICAgIHZhciB3cml0ZUluZGV4ID0gX2xlbmd0aDsKICAgIHZhciBza2lwQ291bnQgPSBzdGFydDsKICAgIGZvciAodmFyIHZhbHVlIGluIHZhbHVlcykgewogICAgICBpZiAoc2tpcENvdW50ID4gMCkgewogICAgICAgIHNraXBDb3VudC0tOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh3cml0ZUluZGV4ID09IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgICAgX2dyb3cod3JpdGVJbmRleCk7CiAgICAgIH0KICAgICAgX2J1ZmZlclt3cml0ZUluZGV4KytdID0gdmFsdWU7CiAgICB9CgogICAgaWYgKHNraXBDb3VudCA+IDApIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlRvbyBmZXcgZWxlbWVudHMiKTsKICAgIH0KICAgIGlmIChlbmQgIT0gbnVsbCAmJiB3cml0ZUluZGV4IDwgZW5kKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIHdyaXRlSW5kZXgsICJlbmQiKTsKICAgIH0KCiAgICAvLyBTd2FwIFtpbmRleC4uX2xlbmd0aCkgYW5kIFtfbGVuZ3RoLi53cml0ZUluZGV4KSBieSBkb3VibGUtcmV2ZXJzaW5nLgogICAgX3JldmVyc2UoX2J1ZmZlciwgaW5kZXgsIF9sZW5ndGgpOwogICAgX3JldmVyc2UoX2J1ZmZlciwgX2xlbmd0aCwgd3JpdGVJbmRleCk7CiAgICBfcmV2ZXJzZShfYnVmZmVyLCBpbmRleCwgd3JpdGVJbmRleCk7CiAgICBfbGVuZ3RoID0gd3JpdGVJbmRleDsKICAgIHJldHVybjsKICB9CgogIC8vIFJldmVyc2VzIHRoZSByYW5nZSBbc3RhcnQuLmVuZCkgb2YgYnVmZmVyLgogIHN0YXRpYyB2b2lkIF9yZXZlcnNlKExpc3QgYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGVuZC0tOyAvLyBQb2ludCB0byBsYXN0IGVsZW1lbnQsIG5vdCBhZnRlciBsYXN0IGVsZW1lbnQuCiAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgdmFyIGZpcnN0ID0gYnVmZmVyW3N0YXJ0XTsKICAgICAgdmFyIGxhc3QgPSBidWZmZXJbZW5kXTsKICAgICAgYnVmZmVyW2VuZF0gPSBmaXJzdDsKICAgICAgYnVmZmVyW3N0YXJ0XSA9IGxhc3Q7CiAgICAgIHN0YXJ0Kys7CiAgICAgIGVuZC0tOwogICAgfQogIH0KCiAgLy8vIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgW2FkZEFsbF0uCiAgLy8vCiAgLy8vIFRoaXMgYWxsb3dzIFthZGRBbGxdIGFuZCBbaW5zZXJ0QWxsXSB0byBzaGFyZSBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IGEKICAvLy8gc3ViY2xhc3MgdW5leHBlY3RlZGx5IG92ZXJyaWRpbmcgYm90aCB3aGVuIGl0IGludGVuZGVkIHRvIG9ubHkgb3ZlcnJpZGUKICAvLy8gW2FkZEFsbF0uCiAgdm9pZCBfYWRkQWxsKEl0ZXJhYmxlPEU+IHZhbHVlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBpZiAodmFsdWVzIGlzIExpc3QpIGVuZCA/Pz0gdmFsdWVzLmxlbmd0aDsKCiAgICAvLyBJZiB3ZSBrbm93IHRoZSBsZW5ndGggb2YgdGhlIHNlZ21lbnQgdG8gYWRkLCBkbyBzbyB3aXRoIFthZGRSYW5nZV0uIFRoaXMKICAgIC8vIHdheSB3ZSBrbm93IGhvdyBtdWNoIHRvIGdyb3cgdGhlIGJ1ZmZlciBpbiBhZHZhbmNlLCBhbmQgaXQgbWF5IGJlIGV2ZW4KICAgIC8vIG1vcmUgZWZmaWNpZW50IGZvciB0eXBlZCBkYXRhIGlucHV0LgogICAgaWYgKGVuZCAhPSBudWxsKSB7CiAgICAgIF9pbnNlcnRLbm93bkxlbmd0aChfbGVuZ3RoLCB2YWx1ZXMsIHN0YXJ0LCBlbmQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFkZCB2YWx1ZXMgb25lIGF0IGEgdGltZS4KICAgIHZhciBpID0gMDsKICAgIGZvciAodmFyIHZhbHVlIGluIHZhbHVlcykgewogICAgICBpZiAoaSA+PSBzdGFydCkgYWRkKHZhbHVlKTsKICAgICAgaSsrOwogICAgfQogICAgaWYgKGkgPCBzdGFydCkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlRvbyBmZXcgZWxlbWVudHMiKTsKICB9CgogIC8vLyBMaWtlIFtpbnNlcnRBbGxdLCBidXQgd2l0aCBhIGd1YXJhbnRlZWQgbm9uLWBudWxsYCBbc3RhcnRdIGFuZCBbZW5kXS4KICB2b2lkIF9pbnNlcnRLbm93bkxlbmd0aChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IHZhbHVlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAodmFsdWVzIGlzIExpc3QpIHsKICAgICAgZW5kID8/PSB2YWx1ZXMubGVuZ3RoOwogICAgICBpZiAoc3RhcnQgPiB2YWx1ZXMubGVuZ3RoIHx8IGVuZCA+IHZhbHVlcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVG9vIGZldyBlbGVtZW50cyIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgfQoKICAgIHZhciB2YWx1ZXNMZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIHZhciBuZXdMZW5ndGggPSBfbGVuZ3RoICsgdmFsdWVzTGVuZ3RoOwogICAgX2Vuc3VyZUNhcGFjaXR5KG5ld0xlbmd0aCk7CgogICAgX2J1ZmZlci5zZXRSYW5nZSgKICAgICAgICBpbmRleCArIHZhbHVlc0xlbmd0aCwgX2xlbmd0aCArIHZhbHVlc0xlbmd0aCwgX2J1ZmZlciwgaW5kZXgpOwogICAgX2J1ZmZlci5zZXRSYW5nZShpbmRleCwgaW5kZXggKyB2YWx1ZXNMZW5ndGgsIHZhbHVlcywgc3RhcnQpOwogICAgX2xlbmd0aCA9IG5ld0xlbmd0aDsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gX2xlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgX2xlbmd0aCk7CiAgICB9CiAgICBpZiAoX2xlbmd0aCA8IF9idWZmZXIubGVuZ3RoKSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2UoaW5kZXggKyAxLCBfbGVuZ3RoICsgMSwgX2J1ZmZlciwgaW5kZXgpOwogICAgICBfYnVmZmVyW2luZGV4XSA9IGVsZW1lbnQ7CiAgICAgIF9sZW5ndGgrKzsKICAgICAgcmV0dXJuOwogICAgfQogICAgTGlzdDxFPiBuZXdCdWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKG51bGwpOwogICAgbmV3QnVmZmVyLnNldFJhbmdlKDAsIGluZGV4LCBfYnVmZmVyKTsKICAgIG5ld0J1ZmZlci5zZXRSYW5nZShpbmRleCArIDEsIF9sZW5ndGggKyAxLCBfYnVmZmVyLCBpbmRleCk7CiAgICBuZXdCdWZmZXJbaW5kZXhdID0gZWxlbWVudDsKICAgIF9sZW5ndGgrKzsKICAgIF9idWZmZXIgPSBuZXdCdWZmZXI7CiAgfQoKICAvLy8gRW5zdXJlcyB0aGF0IFtfYnVmZmVyXSBpcyBhdCBsZWFzdCBbcmVxdWlyZWRDYXBhY2l0eV0gbG9uZywKICAvLy8KICAvLy8gR3Jvd3MgdGhlIGJ1ZmZlciBpZiBuZWNlc3NhcnksIHByZXNlcnZpbmcgZXhpc3RpbmcgZGF0YS4KICB2b2lkIF9lbnN1cmVDYXBhY2l0eShpbnQgcmVxdWlyZWRDYXBhY2l0eSkgewogICAgaWYgKHJlcXVpcmVkQ2FwYWNpdHkgPD0gX2J1ZmZlci5sZW5ndGgpIHJldHVybjsKICAgIHZhciBuZXdCdWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKHJlcXVpcmVkQ2FwYWNpdHkpOwogICAgbmV3QnVmZmVyLnNldFJhbmdlKDAsIF9sZW5ndGgsIF9idWZmZXIpOwogICAgX2J1ZmZlciA9IG5ld0J1ZmZlcjsKICB9CgogIC8vLyBDcmVhdGUgYSBiaWdnZXIgYnVmZmVyLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIGhvdyBtdWNoIGJpZ2dlciBhIGJpZ2dlciBidWZmZXIgc2hvdWxkCiAgLy8vIGJlLiBJZiBbcmVxdWlyZWRDYXBhY2l0eV0gaXMgbm90IG51bGwsIGl0IHdpbGwgYmUgYXQgbGVhc3QgdGhhdAogIC8vLyBzaXplLiBJdCB3aWxsIGFsd2F5cyBoYXZlIGF0IGxlYXN0IGhhdmUgZG91YmxlIHRoZSBjYXBhY2l0eSBvZgogIC8vLyB0aGUgY3VycmVudCBidWZmZXIuCiAgTGlzdDxFPiBfY3JlYXRlQmlnZ2VyQnVmZmVyKGludCByZXF1aXJlZENhcGFjaXR5KSB7CiAgICBpbnQgbmV3TGVuZ3RoID0gX2J1ZmZlci5sZW5ndGggKiAyOwogICAgaWYgKHJlcXVpcmVkQ2FwYWNpdHkgIT0gbnVsbCAmJiBuZXdMZW5ndGggPCByZXF1aXJlZENhcGFjaXR5KSB7CiAgICAgIG5ld0xlbmd0aCA9IHJlcXVpcmVkQ2FwYWNpdHk7CiAgICB9IGVsc2UgaWYgKG5ld0xlbmd0aCA8IElOSVRJQUxfTEVOR1RIKSB7CiAgICAgIG5ld0xlbmd0aCA9IElOSVRJQUxfTEVOR1RIOwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVCdWZmZXIobmV3TGVuZ3RoKTsKICB9CgogIC8vLyBHcm93cyB0aGUgYnVmZmVyLgogIC8vLwogIC8vLyBUaGlzIGNvcGllcyB0aGUgZmlyc3QgW2xlbmd0aF0gZWxlbWVudHMgaW50byB0aGUgbmV3IGJ1ZmZlci4KICB2b2lkIF9ncm93KGludCBsZW5ndGgpIHsKICAgIF9idWZmZXIgPSBfY3JlYXRlQmlnZ2VyQnVmZmVyKG51bGwpLi5zZXRSYW5nZSgwLCBsZW5ndGgsIF9idWZmZXIpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IHNvdXJjZSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgaWYgKGVuZCA+IF9sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgMCwgX2xlbmd0aCk7CiAgICBfc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLCBza2lwQ291bnQpOwogIH0KCiAgLy8vIExpa2UgW3NldFJhbmdlXSwgYnV0IHdpdGggbm8gYm91bmRzIGNoZWNraW5nLgogIHZvaWQgX3NldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gc291cmNlLCBpbnQgc2tpcENvdW50KSB7CiAgICBpZiAoc291cmNlIGlzIF9UeXBlZERhdGFCdWZmZXI8RT4pIHsKICAgICAgX2J1ZmZlci5zZXRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UuX2J1ZmZlciwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIF9idWZmZXIuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gVHlwZWREYXRhLgoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyA9PiBfdHlwZWRCdWZmZXIuZWxlbWVudFNpemVJbkJ5dGVzOwoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX2xlbmd0aCAqIF90eXBlZEJ1ZmZlci5lbGVtZW50U2l6ZUluQnl0ZXM7CgogIGludCBnZXQgb2Zmc2V0SW5CeXRlcyA9PiBfdHlwZWRCdWZmZXIub2Zmc2V0SW5CeXRlczsKCiAgLy8vIFJldHVybnMgdGhlIHVuZGVybHlpbmcgW0J5dGVCdWZmZXJdLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgYnVmZmVyIG1heSBiZSByZXBsYWNlZCBieSBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBbbGVuZ3RoXQogIC8vLyBvZiB0aGlzIGxpc3QuCiAgLy8vCiAgLy8vIFRoZSBidWZmZXIgbWF5IGJlIGxhcmdlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXSBieXRlcywgYnV0IG5ldmVyIHNtYWxsZXIuCiAgQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyID0+IF90eXBlZEJ1ZmZlci5idWZmZXI7CgogIC8vIFNwZWNpYWxpemF0aW9uIGZvciB0aGUgc3BlY2lmaWMgdHlwZS4KCiAgLy8gUmV0dXJuIHplcm8gZm9yIGludGVnZXJzLCAwLjAgZm9yIGZsb2F0cywgZXRjLgogIC8vIFVzZWQgdG8gZmlsbCBidWZmZXIgd2hlbiBjaGFuZ2luZyBsZW5ndGguCiAgRSBnZXQgX2RlZmF1bHRWYWx1ZTsKCiAgLy8gQ3JlYXRlIGEgbmV3IHR5cGVkIGxpc3QgdG8gdXNlIGFzIGJ1ZmZlci4KICBMaXN0PEU+IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpOwp9CgphYnN0cmFjdCBjbGFzcyBfSW50QnVmZmVyIGV4dGVuZHMgX1R5cGVkRGF0YUJ1ZmZlcjxpbnQ+IHsKICBfSW50QnVmZmVyKExpc3Q8aW50PiBidWZmZXIpIDogc3VwZXIoYnVmZmVyKTsKCiAgaW50IGdldCBfZGVmYXVsdFZhbHVlID0+IDA7Cn0KCmFic3RyYWN0IGNsYXNzIF9GbG9hdEJ1ZmZlciBleHRlbmRzIF9UeXBlZERhdGFCdWZmZXI8ZG91YmxlPiB7CiAgX0Zsb2F0QnVmZmVyKExpc3Q8ZG91YmxlPiBidWZmZXIpIDogc3VwZXIoYnVmZmVyKTsKCiAgZG91YmxlIGdldCBfZGVmYXVsdFZhbHVlID0+IDAuMDsKfQoKY2xhc3MgVWludDhCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBVaW50OEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgVWludDhMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBVaW50OExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IFVpbnQ4TGlzdChzaXplKTsKfQoKY2xhc3MgSW50OEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIEludDhCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IEludDhMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBJbnQ4TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgSW50OExpc3Qoc2l6ZSk7Cn0KCmNsYXNzIFVpbnQ4Q2xhbXBlZEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIFVpbnQ4Q2xhbXBlZEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgVWludDhDbGFtcGVkTGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgVWludDhDbGFtcGVkTGlzdChzaXplKTsKfQoKY2xhc3MgVWludDE2QnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgVWludDE2QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBVaW50MTZMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBVaW50MTZMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBVaW50MTZMaXN0KHNpemUpOwp9CgpjbGFzcyBJbnQxNkJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIEludDE2QnVmZmVyKFtpbnQgaW5pdGlhbExlbmd0aCA9IDBdKSA6IHN1cGVyKG5ldyBJbnQxNkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIEludDE2TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgSW50MTZMaXN0KHNpemUpOwp9CgpjbGFzcyBVaW50MzJCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBVaW50MzJCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IFVpbnQzMkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIFVpbnQzMkxpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IFVpbnQzMkxpc3Qoc2l6ZSk7Cn0KCmNsYXNzIEludDMyQnVmZmVyIGV4dGVuZHMgX0ludEJ1ZmZlciB7CiAgSW50MzJCdWZmZXIoW2ludCBpbml0aWFsTGVuZ3RoID0gMF0pIDogc3VwZXIobmV3IEludDMyTGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgSW50MzJMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBJbnQzMkxpc3Qoc2l6ZSk7Cn0KCmNsYXNzIFVpbnQ2NEJ1ZmZlciBleHRlbmRzIF9JbnRCdWZmZXIgewogIFVpbnQ2NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgVWludDY0TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgVWludDY0TGlzdCBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBuZXcgVWludDY0TGlzdChzaXplKTsKfQoKY2xhc3MgSW50NjRCdWZmZXIgZXh0ZW5kcyBfSW50QnVmZmVyIHsKICBJbnQ2NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkgOiBzdXBlcihuZXcgSW50NjRMaXN0KGluaXRpYWxMZW5ndGgpKTsKICBJbnQ2NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEludDY0TGlzdChzaXplKTsKfQoKY2xhc3MgRmxvYXQzMkJ1ZmZlciBleHRlbmRzIF9GbG9hdEJ1ZmZlciB7CiAgRmxvYXQzMkJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgRmxvYXQzMkxpc3QoaW5pdGlhbExlbmd0aCkpOwogIEZsb2F0MzJMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBGbG9hdDMyTGlzdChzaXplKTsKfQoKY2xhc3MgRmxvYXQ2NEJ1ZmZlciBleHRlbmRzIF9GbG9hdEJ1ZmZlciB7CiAgRmxvYXQ2NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgRmxvYXQ2NExpc3QoaW5pdGlhbExlbmd0aCkpOwogIEZsb2F0NjRMaXN0IF9jcmVhdGVCdWZmZXIoaW50IHNpemUpID0+IG5ldyBGbG9hdDY0TGlzdChzaXplKTsKfQoKY2xhc3MgSW50MzJ4NEJ1ZmZlciBleHRlbmRzIF9UeXBlZERhdGFCdWZmZXI8SW50MzJ4ND4gewogIHN0YXRpYyBJbnQzMng0IF96ZXJvID0gbmV3IEludDMyeDQoMCwgMCwgMCwgMCk7CiAgSW50MzJ4NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgSW50MzJ4NExpc3QoaW5pdGlhbExlbmd0aCkpOwogIEludDMyeDQgZ2V0IF9kZWZhdWx0VmFsdWUgPT4gX3plcm87CiAgSW50MzJ4NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEludDMyeDRMaXN0KHNpemUpOwp9CgpjbGFzcyBGbG9hdDMyeDRCdWZmZXIgZXh0ZW5kcyBfVHlwZWREYXRhQnVmZmVyPEZsb2F0MzJ4ND4gewogIEZsb2F0MzJ4NEJ1ZmZlcihbaW50IGluaXRpYWxMZW5ndGggPSAwXSkKICAgICAgOiBzdXBlcihuZXcgRmxvYXQzMng0TGlzdChpbml0aWFsTGVuZ3RoKSk7CiAgRmxvYXQzMng0IGdldCBfZGVmYXVsdFZhbHVlID0+IG5ldyBGbG9hdDMyeDQuemVybygpOwogIEZsb2F0MzJ4NExpc3QgX2NyZWF0ZUJ1ZmZlcihpbnQgc2l6ZSkgPT4gbmV3IEZsb2F0MzJ4NExpc3Qoc2l6ZSk7Cn0KgY8ATk48AR8EUE4hBE5MKyIBKBoBOScBIgZQSRMBNDYBKg8BIx8mAR0dQhsEASpCHAQBIx8mMiMILRkhLg80CC8bBhkEARczIAQBT00dFhEEAUEGSEseBlFRSj4xJjsGASEEAUgGSEseBlFRSkxDMRcZPQggBgFPUFBOHCMOBgEpGwYXNQ4GAUo2HhsgGxUSCCobCCUGARkwBitBBgFMJywqGgwEATA6PRohHhscDw0GBAEnBk1OED8vAVBOLBc3DgYBMQ8gIgsGPQQBTE8aHToyCA0bBgEkLCABFkdCGQQBJig1BiRAIBEOBjMrQCAPGQQBQgY/LzQ7LRkEAR4GREZFGjYoRCQtIgYlBAEYBkMbRwQBT0QuBAE0Sik/DTcGBAEQAUEBRgE3ASsGURQGTjABKwE0LxcBLyMCATowAR4CAT81ASMCASdOPAIBJkw6AgEuLjRKAgEoUD4CASdOPAIBKFA+AgEnTjwCAShQPgIBJ048AgErKS9AAgErKS9AAgE4MikvJkACATwrMTdEAgElcGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2J1ZmZlcnMuZGFydGlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvc2Nhbm5lci9hYnN0cmFjdF9zY2FubmVyLmRhcnTAAOguLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC5zY2FubmVyLmFic3RyYWN0X3NjYW5uZXI7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBMaXN0TWl4aW47CgppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50MTZMaXN0LCBVaW50MzJMaXN0OwoKaW1wb3J0ICd0b2tlbi5kYXJ0JwogICAgc2hvdyBCZWdpblRva2VuLCBLZXl3b3JkLCBLZXl3b3JkVG9rZW4sIFN5bnRoZXRpY1Rva2VuLCBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBhcyBhbmFseXplciBzaG93IFN0cmluZ1Rva2VuOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIG1lc3NhZ2VFeHBlY3RlZEhleERpZ2l0LAogICAgICAgIG1lc3NhZ2VNaXNzaW5nRXhwb25lbnQsCiAgICAgICAgbWVzc2FnZVVuZXhwZWN0ZWREb2xsYXJJblN0cmluZywKICAgICAgICBtZXNzYWdlVW50ZXJtaW5hdGVkQ29tbWVudDsKCmltcG9ydCAnLi4vdXRpbC9saW5rLmRhcnQnIHNob3cgTGluazsKCmltcG9ydCAnY2hhcmFjdGVycy5kYXJ0JzsKCmltcG9ydCAnZXJyb3JfdG9rZW4uZGFydCcKICAgIHNob3cKICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJUb2tlbiwKICAgICAgICBVbm1hdGNoZWRUb2tlbiwKICAgICAgICBVbnN1cHBvcnRlZE9wZXJhdG9yLAogICAgICAgIFVudGVybWluYXRlZFN0cmluZywKICAgICAgICBVbnRlcm1pbmF0ZWRUb2tlbjsKCmltcG9ydCAna2V5d29yZF9zdGF0ZS5kYXJ0JyBzaG93IEtleXdvcmRTdGF0ZTsKCmltcG9ydCAndG9rZW5faW1wbC5kYXJ0JwogICAgc2hvdyBDb21tZW50VG9rZW4sIERhcnREb2NUb2tlbiwgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4sIFN0cmluZ1Rva2VuOwoKaW1wb3J0ICd0b2tlbl9jb25zdGFudHMuZGFydCc7CgppbXBvcnQgJ3NjYW5uZXIuZGFydCcKICAgIHNob3cgRXJyb3JUb2tlbiwgS2V5d29yZCwgU2Nhbm5lciwgYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW47Cgp0eXBlZGVmIHZvaWQgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCgKICAgIFNjYW5uZXIgc2Nhbm5lciwgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gbGFuZ3VhZ2VWZXJzaW9uKTsKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2Nhbm5lciBpbXBsZW1lbnRzIFNjYW5uZXIgewogIC8qKgogICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgY2hhcmFjdGVyIHNlcXVlbmNlcyBgJiY9YCBhbmQgYHx8PWAKICAgKiBzaG91bGQgYmUgdG9rZW5pemVkIGFzIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9ycwogICAqIFtBTVBFUlNBTkRfQU1QRVJTQU5EX0VRX1RPS0VOXSBhbmQgW0JBUl9CQVJfRVFfVE9LRU5dIHJlc3BlY3RpdmVseS4KICAgKiBTZWUgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMwMzQwCiAgICovCiAgc3RhdGljIGNvbnN0IGJvb2wgTEFaWV9BU1NJR05NRU5UX0VOQUJMRUQgPSBmYWxzZTsKCiAgZmluYWwgYm9vbCBpbmNsdWRlQ29tbWVudHM7CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgc2Nhbm5lciBkZXRlY3RzIGEgbGFuZ3VhZ2UgdmVyc2lvbiBjb21tZW50CiAgLy8vIHNvIHRoYXQgdGhlIGxpc3RlbmVyIGNhbiB1cGRhdGUgdGhlIHNjYW5uZXIgY29uZmlndXJhdGlvbgogIC8vLyBiYXNlZCB1cG9uIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgdmVyc2lvbi4KICBmaW5hbCBMYW5ndWFnZVZlcnNpb25DaGFuZ2VkIGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQ7CgogIC8vLyBFeHBlcmltZW50YWwgZmxhZyBmb3IgZW5hYmxpbmcgc2Nhbm5pbmcgb2YgdGhlIGBleHRlbnNpb25gIHRva2VuLgogIGJvb2wgX2VuYWJsZUV4dGVuc2lvbk1ldGhvZHMgPSBmYWxzZTsKCiAgLy8vIEV4cGVyaW1lbnRhbCBmbGFnIGZvciBlbmFibGluZyBzY2FubmluZyBvZiBOTkJEIHRva2VucwogIC8vLyBzdWNoIGFzICdyZXF1aXJlZCcgYW5kICdsYXRlJy4KICBib29sIF9lbmFibGVOb25OdWxsYWJsZSA9IGZhbHNlOwoKICAvLy8gRXhwZXJpbWVudGFsIGZsYWcgZm9yIGVuYWJsaW5nIHNjYW5uaW5nIG9mIGA+Pj5gLgogIC8vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9pc3N1ZXMvNjEKICAvLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzYwCiAgYm9vbCBfZW5hYmxlVHJpcGxlU2hpZnQgPSBmYWxzZTsKCiAgLyoqCiAgICogVGhlIHN0cmluZyBvZmZzZXQgZm9yIHRoZSBuZXh0IHRva2VuIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgogICAqCiAgICogTm90ZSB0aGF0IGluIHRoZSBbVXRmOEJ5dGVzU2Nhbm5lcl0sIFtzdHJpbmdPZmZzZXRdIGFuZCBbc2Nhbk9mZnNldF0gdmFsdWVzCiAgICogYXJlIGRpZmZlcmVudC4gT25lIHN0cmluZyBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdXNpbmcgbXVsdGlwbGUgVVRGLTgKICAgKiBieXRlcy4KICAgKi8KICBpbnQgdG9rZW5TdGFydCA9IC0xOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIHRva2VuIHN0cmVhbSBjcmVhdGVkIGJ5IHRoaXMgc2Nhbm5lci4gVGhlIGZpcnN0IHRva2VuCiAgICogaXMgYSBzcGVjaWFsIHRva2VuIGFuZCBub3QgcGFydCBvZiB0aGUgc291cmNlIGZpbGUuIFRoaXMgaXMgYW4KICAgKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdG8gYXZvaWRzIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHNjYW5uZXIuIFRoaXMgdG9rZW4KICAgKiBpcyBub3QgZXhwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBzY2FubmVyLCB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gaW52b2tlCiAgICogW2ZpcnN0VG9rZW5dIHRvIGFjY2VzcyB0aGUgdG9rZW4gc3RyZWFtLgogICAqLwogIGZpbmFsIFRva2VuIHRva2VucyA9IG5ldyBUb2tlbi5lb2YoLTEpOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3Qgc2Nhbm5lZCB0b2tlbi4KICAgKi8KICBUb2tlbiB0YWlsOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3QgcHJlcGVuZGVkIGVycm9yIHRva2VuLgogICAqLwogIFRva2VuIGVycm9yVGFpbDsKCiAgYm9vbCBoYXNFcnJvcnMgPSBmYWxzZTsKCiAgLyoqCiAgICogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2YgY29tbWVudCB0b2tlbnMgY3JlYXRlZCBieSB0aGlzIHNjYW5uZXIKICAgKiBiZWZvcmUgdGhleSBhcmUgYXNzaWduZWQgdG8gdGhlIFtUb2tlbl0gcHJlY2VkaW5nQ29tbWVudHMgZmllbGQKICAgKiBvZiBhIG5vbi1jb21tZW50IHRva2VuLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgbm8gY29tbWVudCB0b2tlbnMuCiAgICovCiAgQ29tbWVudFRva2VuIGNvbW1lbnRzOwoKICAvKioKICAgKiBBIHBvaW50ZXIgdG8gdGhlIGxhc3Qgc2Nhbm5lZCBjb21tZW50IHRva2VuIG9yIGBudWxsYCBpZiBub25lLgogICAqLwogIFRva2VuIGNvbW1lbnRzVGFpbDsKCiAgZmluYWwgTGlzdDxpbnQ+IGxpbmVTdGFydHM7CgogIC8qKgogICAqIFRoZSBzdGFjayBvZiBvcGVuIGdyb3VwcywgZS5nIFs6IHsgLi4uICggLi4gOl0KICAgKiBFYWNoIEJlZ2luVG9rZW4gaGFzIGEgcG9pbnRlciB0byB0aGUgdG9rZW4gd2hlcmUgdGhlIGdyb3VwCiAgICogZW5kcy4gVGhpcyBmaWVsZCBpcyBzZXQgd2hlbiBzY2FubmluZyB0aGUgZW5kIGdyb3VwIHRva2VuLgogICAqLwogIExpbms8QmVnaW5Ub2tlbj4gZ3JvdXBpbmdTdGFjayA9IGNvbnN0IExpbms8QmVnaW5Ub2tlbj4oKTsKCiAgQWJzdHJhY3RTY2FubmVyKFNjYW5uZXJDb25maWd1cmF0aW9uIGNvbmZpZywgdGhpcy5pbmNsdWRlQ29tbWVudHMsCiAgICAgIHRoaXMubGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCwKICAgICAge2ludCBudW1iZXJPZkJ5dGVzSGludH0pCiAgICAgIDogbGluZVN0YXJ0cyA9IG5ldyBMaW5lU3RhcnRzKG51bWJlck9mQnl0ZXNIaW50KSB7CiAgICB0aGlzLnRhaWwgPSB0aGlzLnRva2VuczsKICAgIHRoaXMuZXJyb3JUYWlsID0gdGhpcy50b2tlbnM7CiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWc7CiAgfQoKICBAb3ZlcnJpZGUKICBzZXQgY29uZmlndXJhdGlvbihTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgIGlmIChjb25maWcgIT0gbnVsbCkgewogICAgICBfZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcyA9IGNvbmZpZy5lbmFibGVFeHRlbnNpb25NZXRob2RzOwogICAgICBfZW5hYmxlTm9uTnVsbGFibGUgPSBjb25maWcuZW5hYmxlTm9uTnVsbGFibGU7CiAgICAgIF9lbmFibGVUcmlwbGVTaGlmdCA9IGNvbmZpZy5lbmFibGVUcmlwbGVTaGlmdDsKICAgIH0KICB9CgogIC8qKgogICAqIEFkdmFuY2VzIGFuZCByZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3Rlci4KICAgKgogICAqIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBub24tQVNDSUksIHRoZW4gdGhlIHJldHVybmVkIHZhbHVlIGRlcGVuZHMgb24gdGhlCiAgICogc2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gVGhlIFtVdGY4Qnl0ZXNTY2FubmVyXSByZXR1cm5zIGEgVVRGLTggYnl0ZSwgd2hpbGUKICAgKiB0aGUgW1N0cmluZ1NjYW5uZXJdIHJldHVybnMgYSBVVEYtMTYgY29kZSB1bml0LgogICAqCiAgICogVGhlIHNjYW5uZXIgZW5zdXJlcyB0aGF0IFthZHZhbmNlXSBpcyBub3QgaW52b2tlZCBhZnRlciBpdCByZXR1cm5lZCBbJEVPRl0uCiAgICogVGhpcyBhbGxvd3MgaW1wbGVtZW50YXRpb25zIHRvIG9taXQgYm91bmQgY2hlY2tzIGlmIHRoZSBkYXRhIHN0cnVjdHVyZSBlbmRzCiAgICogd2l0aCAnMCcuCiAgICovCiAgaW50IGFkdmFuY2UoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY3VycmVudCB1bmljb2RlIGNoYXJhY3Rlci4KICAgKgogICAqIElmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBBU0NJSSwgdGhlbiBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCiAgICoKICAgKiBUaGUgW1V0ZjhCeXRlc1NjYW5uZXJdIGRlY29kZXMgdGhlIG5leHQgdW5pY29kZSBjb2RlIHBvaW50IHN0YXJ0aW5nIGF0IHRoZQogICAqIGN1cnJlbnQgcG9zaXRpb24uIE5vdGUgdGhhdCBldmVyeSB1bmljb2RlIGNoYXJhY3RlciBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZQogICAqIGNvZGUgcG9pbnQsIHRoYXQgaXMsIGZvciAnXHV7MWQxMWV9JyBpdCByZXR1cm5zIDExOTA3MCwgYW5kIHRoZSBmb2xsb3dpbmcKICAgKiBbYWR2YW5jZV0gcmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIuCiAgICoKICAgKiBUaGUgW1N0cmluZ1NjYW5uZXJdIHJldHVybnMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHVuY2hhbmdlZCwgd2hpY2ggbWlnaHQKICAgKiBiZSBhIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIuIEluIHRoZSBjYXNlIG9mICdcdXsxZDExZX0nLCBpdCByZXR1cm5zIHRoZSBmaXJzdAogICAqIGNvZGUgdW5pdCA1NTM0OCwgYW5kIHRoZSBmb2xsb3dpbmcgW2FkdmFuY2VdIHJldHVybnMgdGhlIHNlY29uZCBjb2RlIHVuaXQKICAgKiA1NjYwNi4KICAgKgogICAqIEludm9raW5nIFtjdXJyZW50QXNVbmljb2RlXSBtdWx0aXBsZSB0aW1lcyBpcyBzYWZlLCBpLmUuLAogICAqIFs6Y3VycmVudEFzVW5pY29kZShuZXh0KSA9PSBjdXJyZW50QXNVbmljb2RlKGN1cnJlbnRBc1VuaWNvZGUobmV4dCkpOl0uCiAgICovCiAgaW50IGN1cnJlbnRBc1VuaWNvZGUoaW50IG5leHQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIG5leHQgcG9zaXRpb24uIExpa2UgaW4gW2FkdmFuY2VdLCB0aGUKICAgKiBbVXRmOEJ5dGVzU2Nhbm5lcl0gcmV0dXJucyBhIFVURi04IGJ5dGUsIHdoaWxlIHRoZSBbU3RyaW5nU2Nhbm5lcl0gcmV0dXJucwogICAqIGEgVVRGLTE2IGNvZGUgdW5pdC4KICAgKi8KICBpbnQgcGVlaygpOwoKICAvKioKICAgKiBOb3RpZmllcyB0aGUgc2Nhbm5lciB0aGF0IHVuaWNvZGUgY2hhcmFjdGVycyB3ZXJlIGRldGVjdGVkIGluIGVpdGhlciBhCiAgICogY29tbWVudCBvciBhIHN0cmluZyBsaXRlcmFsIGJldHdlZW4gW3N0YXJ0U2Nhbk9mZnNldF0gYW5kIHRoZSBjdXJyZW50CiAgICogc2NhbiBvZmZzZXQuCiAgICovCiAgdm9pZCBoYW5kbGVVbmljb2RlKGludCBzdGFydFNjYW5PZmZzZXQpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNjYW4gb2Zmc2V0LgogICAqCiAgICogSW4gdGhlIFtVdGY4Qnl0ZXNTY2FubmVyXSB0aGlzIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYnl0ZSBsaXN0LCBpbiB0aGUKICAgKiBbU3RyaW5nU2Nhbm5lcl0gdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHN0cmluZy4KICAgKi8KICBpbnQgZ2V0IHNjYW5PZmZzZXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RyaW5nIG9mZnNldC4KICAgKgogICAqIEluIHRoZSBbU3RyaW5nU2Nhbm5lcl0gdGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFtzY2FuT2Zmc2V0XS4gSW4gdGhlCiAgICogW1V0ZjhCeXRlc1NjYW5uZXJdIGl0IGlzIGNvbXB1dGVkIGJhc2VkIG9uIGVuY291bnRlcmVkIFVURi04IGNoYXJhY3RlcnMuCiAgICovCiAgaW50IGdldCBzdHJpbmdPZmZzZXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IHRva2VuIHNjYW5uZWQgYnkgdGhpcyBbU2Nhbm5lcl0uCiAgICovCiAgVG9rZW4gZmlyc3RUb2tlbigpID0+IHRva2Vucy5uZXh0OwoKICAvKioKICAgKiBOb3RpZmllcyB0aGF0IGEgbmV3IHRva2VuIHN0YXJ0cyBhdCBjdXJyZW50IG9mZnNldC4KICAgKi8KICB2b2lkIGJlZ2luVG9rZW4oKSB7CiAgICB0b2tlblN0YXJ0ID0gc3RyaW5nT2Zmc2V0OwogIH0KCiAgLyoqCiAgICogQXBwZW5kcyBhIHN1YnN0cmluZyBmcm9tIHRoZSBzY2FuIG9mZnNldCBbOnN0YXJ0Ol0gdG8gdGhlIGN1cnJlbnQKICAgKiBbOnNjYW5PZmZzZXQ6XSBwbHVzIHRoZSBbOmV4dHJhT2Zmc2V0Ol0uIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudAogICAqIHNjYW5PZmZzZXQgaXMgMTAsIHRoZW4gWzphcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSk6XSB3aWxsIGFwcGVuZCB0aGUKICAgKiBzdWJzdHJpbmcgc3RyaW5nIFs1LDkpLgogICAqCiAgICogTm90ZSB0aGF0IFtleHRyYU9mZnNldF0gY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgY292ZXJlZCBjaGFyYWN0ZXIocykgYXJlCiAgICoga25vd24gdG8gYmUgQVNDSUkuCiAgICovCiAgdm9pZCBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUgdHlwZSwgaW50IHN0YXJ0LCBib29sIGFzY2lpT25seSwKICAgICAgW2ludCBleHRyYU9mZnNldCA9IDBdKSB7CiAgICBhcHBlbmRUb2tlbihjcmVhdGVTdWJzdHJpbmdUb2tlbih0eXBlLCBzdGFydCwgYXNjaWlPbmx5LCBleHRyYU9mZnNldCkpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBzdWJzdHJpbmcgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIHRoZSBbZXh0cmFPZmZzZXRdLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQKICAgKiBzY2FuT2Zmc2V0IGlzIDEwLCB0aGVuIFthcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSldIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICBhbmFseXplci5TdHJpbmdUb2tlbiBjcmVhdGVTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksCiAgICAgIFtpbnQgZXh0cmFPZmZzZXQgPSAwXSk7CgogIC8qKgogICAqIEFwcGVuZHMgYSBzdWJzdHJpbmcgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIFtzeW50aGV0aWNDaGFyc10uIFRoZSBhZGRpdGlvbmFsIGNoYXIocykgd2lsbCBiZSBhZGRlZAogICAqIHRvIHRoZSB1bnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwncyBsZXhlbWUgYnV0IHRoZSByZXR1cm5lZAogICAqIHRva2VuJ3MgbGVuZ3RoIHdpbGwgKm5vdCogaW5jbHVkZSB0aG9zZSBhZGRpdGlvbmFsIGNoYXIocykKICAgKiBzbyBhcyB0byBiZSB0cnVlIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICovCiAgdm9pZCBhcHBlbmRTeW50aGV0aWNTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksIFN0cmluZyBzeW50aGV0aWNDaGFycykgewogICAgYXBwZW5kVG9rZW4oCiAgICAgICAgY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4odHlwZSwgc3RhcnQsIGFzY2lpT25seSwgc3ludGhldGljQ2hhcnMpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgc3ludGhldGljIHN1YnN0cmluZyBmcm9tIHRoZSBzY2FuIG9mZnNldCBbc3RhcnRdCiAgICogdG8gdGhlIGN1cnJlbnQgW3NjYW5PZmZzZXRdIHBsdXMgdGhlIFtzeW50aGV0aWNDaGFyc10uCiAgICogVGhlIFtzeW50aGV0aWNDaGFyc10gYXJlIGFwcGVuZGVkIHRvIHRoZSB1bnRlcm1pbmF0ZWQgc3RyaW5nCiAgICogbGl0ZXJhbCdzIGxleGVtZSBidXQgdGhlIHJldHVybmVkIHRva2VuJ3MgbGVuZ3RoIHdpbGwgKm5vdCogaW5jbHVkZQogICAqIHRob3NlIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBzbyBhcyB0byBiZSB0cnVlIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UuCiAgICovCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3ludGhldGljU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LCBTdHJpbmcgc3ludGhldGljQ2hhcnMpOwogIC8qKgogICAqIEFwcGVuZHMgYSBmaXhlZCB0b2tlbiB3aG9zZSBraW5kIGFuZCBjb250ZW50IGlzIGRldGVybWluZWQgYnkgW3R5cGVdLgogICAqIEFwcGVuZHMgYW4gKm9wZXJhdG9yKiB0b2tlbiBmcm9tIFt0eXBlXS4KICAgKgogICAqIEFuIG9wZXJhdG9yIHRva2VuIHJlcHJlc2VudCBvcGVyYXRvcnMgbGlrZSAnOicsICcuJywgJzsnLCAnJiYnLCAnPT0nLCAnLS0nLAogICAqICc9PicsIGV0Yy4KICAgKi8KICB2b2lkIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUgdHlwZSkgewogICAgYXBwZW5kVG9rZW4obmV3IFRva2VuKHR5cGUsIHRva2VuU3RhcnQsIGNvbW1lbnRzKSk7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgZml4ZWQgdG9rZW4gYmFzZWQgb24gd2hldGhlciB0aGUgY3VycmVudCBjaGFyIGlzIFtjaG9pY2VdIG9yIG5vdC4KICAgKiBJZiB0aGUgY3VycmVudCBjaGFyIGlzIFtjaG9pY2VdIGEgZml4ZWQgdG9rZW4gd2hvc2Uga2luZCBhbmQgY29udGVudAogICAqIGlzIGRldGVybWluZWQgYnkgW3llc10gaXMgYXBwZW5kZWQsIG90aGVyd2lzZSBhIGZpeGVkIHRva2VuIHdob3NlIGtpbmQKICAgKiBhbmQgY29udGVudCBpcyBkZXRlcm1pbmVkIGJ5IFtub10gaXMgYXBwZW5kZWQuCiAgICovCiAgaW50IHNlbGVjdChpbnQgY2hvaWNlLCBUb2tlblR5cGUgeWVzLCBUb2tlblR5cGUgbm8pIHsKICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCBjaG9pY2UpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbih5ZXMpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKG5vKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEga2V5d29yZCB0b2tlbiB3aG9zZSBraW5kIGlzIGRldGVybWluZWQgYnkgW2tleXdvcmRdLgogICAqLwogIHZvaWQgYXBwZW5kS2V5d29yZFRva2VuKEtleXdvcmQga2V5d29yZCkgewogICAgU3RyaW5nIHN5bnRheCA9IGtleXdvcmQubGV4ZW1lOwogICAgLy8gVHlwZSBwYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgY2Fubm90IGNvbnRhaW4gJ3RoaXMnLgogICAgaWYgKGlkZW50aWNhbChzeW50YXgsICd0aGlzJykpIHsKICAgICAgZGlzY2FyZE9wZW5MdCgpOwogICAgfQogICAgYXBwZW5kVG9rZW4obmV3IEtleXdvcmRUb2tlbihrZXl3b3JkLCB0b2tlblN0YXJ0LCBjb21tZW50cykpOwogIH0KCiAgdm9pZCBhcHBlbmRFb2ZUb2tlbigpIHsKICAgIGJlZ2luVG9rZW4oKTsKICAgIGRpc2NhcmRPcGVuTHQoKTsKICAgIHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSB7CiAgICAgIHVubWF0Y2hlZEJlZ2luR3JvdXAoZ3JvdXBpbmdTdGFjay5oZWFkKTsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIH0KICAgIGFwcGVuZFRva2VuKG5ldyBUb2tlbi5lb2YodG9rZW5TdGFydCwgY29tbWVudHMpKTsKICB9CgogIC8qKgogICAqIE5vdGlmaWVzIHNjYW5uaW5nIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuIE5vdGUgdGhhdCBbYXBwZW5kV2hpdGVTcGFjZV0gaXMKICAgKiBub3QgYWx3YXlzIGludm9rZWQgZm9yIFskU1BBQ0VdIGNoYXJhY3RlcnMuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBzY2FubmVycyB0byB0cmFjayBsaW5lIGJyZWFrcyBhbmQgY3JlYXRlIHRoZQogICAqIFtsaW5lU3RhcnRzXSBtYXAuCiAgICovCiAgdm9pZCBhcHBlbmRXaGl0ZVNwYWNlKGludCBuZXh0KSB7CiAgICBpZiAobmV4dCA9PSAkTEYpIHsKICAgICAgbGluZVN0YXJ0cy5hZGQoc3RyaW5nT2Zmc2V0ICsgMSk7IC8vICsxLCB0aGUgbGluZSBzdGFydHMgYWZ0ZXIgdGhlICRMRi4KICAgIH0KICB9CgogIC8qKgogICAqIE5vdGlmaWVzIG9uIFskTEZdIGNoYXJhY3RlcnMgaW4gbXVsdGktbGluZSBjb21tZW50cyBvciBzdHJpbmdzLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgc2Nhbm5lcnMgdG8gdHJhY2sgbGluZSBicmVha3MgYW5kIGNyZWF0ZSB0aGUKICAgKiBbbGluZVN0YXJ0c10gbWFwLgogICAqLwogIHZvaWQgbGluZUZlZWRJbk11bHRpbGluZSgpIHsKICAgIGxpbmVTdGFydHMuYWRkKHN0cmluZ09mZnNldCArIDEpOwogIH0KCiAgLyoqCiAgICogQXBwZW5kcyBhIHRva2VuIHRoYXQgYmVnaW5zIGEgbmV3IGdyb3VwLCByZXByZXNlbnRlZCBieSBbdHlwZV0uCiAgICogR3JvdXAgYmVnaW4gdG9rZW5zIGFyZSAneycsICcoJywgJ1snLCAnPCcgYW5kICckeycuCiAgICovCiAgdm9pZCBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZSB0eXBlKSB7CiAgICBUb2tlbiB0b2tlbiA9IG5ldyBCZWdpblRva2VuKHR5cGUsIHRva2VuU3RhcnQsIGNvbW1lbnRzKTsKICAgIGFwcGVuZFRva2VuKHRva2VuKTsKCiAgICAvLyB7IFsgJHsgY2Fubm90IGFwcGVhciBpbnNpZGUgYSB0eXBlIHBhcmFtZXRlcnMgLyBhcmd1bWVudHMuCiAgICBpZiAoIWlkZW50aWNhbCh0eXBlLmtpbmQsIExUX1RPS0VOKSAmJgogICAgICAgICFpZGVudGljYWwodHlwZS5raW5kLCBPUEVOX1BBUkVOX1RPS0VOKSkgewogICAgICBkaXNjYXJkT3Blbkx0KCk7CiAgICB9CiAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay5wcmVwZW5kKHRva2VuKTsKICB9CgogIC8qKgogICAqIEFwcGVuZHMgYSB0b2tlbiB0aGF0IGJlZ2lucyBhbiBlbmQgZ3JvdXAsIHJlcHJlc2VudGVkIGJ5IFt0eXBlXS4KICAgKiBJdCBoYW5kbGVzIHRoZSBncm91cCBlbmQgdG9rZW5zICd9JywgJyknIGFuZCAnXScuIFRoZSB0b2tlbnMgJz4nIGFuZAogICAqICc+PicgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBieSBbYXBwZW5kR3RdIGFuZCBbYXBwZW5kR3RHdF0uCiAgICovCiAgaW50IGFwcGVuZEVuZEdyb3VwKFRva2VuVHlwZSB0eXBlLCBpbnQgb3BlbktpbmQpIHsKICAgIGFzc2VydCghaWRlbnRpY2FsKG9wZW5LaW5kLCBMVF9UT0tFTikpOyAvLyBvcGVuS2luZCBpcyA8IGZvciA+IGFuZCA+PgogICAgaWYgKCFkaXNjYXJkQmVnaW5Hcm91cFVudGlsKG9wZW5LaW5kKSkgewogICAgICAvLyBObyBiZWdpbiBncm91cCBmb3VuZC4gSnVzdCBjb250aW51ZS4KICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKHR5cGUpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKHR5cGUpOwogICAgVG9rZW4gY2xvc2UgPSB0YWlsOwogICAgQmVnaW5Ub2tlbiBiZWdpbiA9IGdyb3VwaW5nU3RhY2suaGVhZDsKICAgIGlmICghaWRlbnRpY2FsKGJlZ2luLmtpbmQsIG9wZW5LaW5kKSAmJgogICAgICAgICEoYmVnaW4ua2luZCA9PSBRVUVTVElPTl9QRVJJT0RfT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiAmJgogICAgICAgICAgICBvcGVuS2luZCA9PSBPUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOKSkgewogICAgICBhc3NlcnQoYmVnaW4ua2luZCA9PSBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTiAmJgogICAgICAgICAgb3BlbktpbmQgPT0gT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKTsKICAgICAgLy8gV2UncmUgZW5kaW5nIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uLgogICAgICBiZWdpbi5lbmRHcm91cCA9IGNsb3NlOwogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgICAvLyBVc2luZyAic3RhcnQtb2YtdGV4dCIgdG8gc2lnbmFsIHRoYXQgd2UncmUgYmFjayBpbiBzdHJpbmcKICAgICAgLy8gc2Nhbm5pbmcgbW9kZS4KICAgICAgcmV0dXJuICRTVFg7CiAgICB9CiAgICBiZWdpbi5lbmRHcm91cCA9IGNsb3NlOwogICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIHJldHVybiBhZHZhbmNlKCk7CiAgfQoKICAvKioKICAgKiBBcHBlbmRzIGEgdG9rZW4gZm9yICc+Jy4KICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBpc3N1ZSB1bm1hdGNoZWQgZXJyb3JzLCBiZWNhdXNlID4gaXMgYWxzbyB0aGUKICAgKiBncmVhdGVyLXRoYW4gb3BlcmF0b3IuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gY2xvc2UgYSBncm91cC4KICAgKi8KICB2b2lkIGFwcGVuZEd0KFRva2VuVHlwZSB0eXBlKSB7CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4odHlwZSk7CiAgICBpZiAoZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSByZXR1cm47CiAgICBpZiAoaWRlbnRpY2FsKGdyb3VwaW5nU3RhY2suaGVhZC5raW5kLCBMVF9UT0tFTikpIHsKICAgICAgZ3JvdXBpbmdTdGFjay5oZWFkLmVuZEdyb3VwID0gdGFpbDsKICAgICAgZ3JvdXBpbmdTdGFjayA9IGdyb3VwaW5nU3RhY2sudGFpbDsKICAgIH0KICB9CgogIC8qKgogICAqIEFwcGVuZHMgYSB0b2tlbiBmb3IgJz4+Jy4KICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBpc3N1ZSB1bm1hdGNoZWQgZXJyb3JzLCBiZWNhdXNlID4+IGlzIGFsc28gdGhlCiAgICogc2hpZnQgb3BlcmF0b3IuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gY2xvc2UgYSBncm91cC4KICAgKi8KICB2b2lkIGFwcGVuZEd0R3QoVG9rZW5UeXBlIHR5cGUpIHsKICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbih0eXBlKTsKICAgIGlmIChncm91cGluZ1N0YWNrLmlzRW1wdHkpIHJldHVybjsKICAgIGlmIChpZGVudGljYWwoZ3JvdXBpbmdTdGFjay5oZWFkLmtpbmQsIExUX1RPS0VOKSkgewogICAgICAvLyBEb24ndCBhc3NpZ24gZW5kR3JvdXA6IGluICJUPFU8Vj4+IiwgdGhlICc+PicgdG9rZW4gY2xvc2VzIHRoZSBvdXRlcgogICAgICAvLyAnPCcsIHRoZSBpbm5lciAnPCcgaXMgbGVmdCB3aXRob3V0IGVuZEdyb3VwLgogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgfQogICAgaWYgKGdyb3VwaW5nU3RhY2suaXNFbXB0eSkgcmV0dXJuOwogICAgaWYgKGlkZW50aWNhbChncm91cGluZ1N0YWNrLmhlYWQua2luZCwgTFRfVE9LRU4pKSB7CiAgICAgIGdyb3VwaW5nU3RhY2suaGVhZC5lbmRHcm91cCA9IHRhaWw7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9CiAgfQoKICAvLy8gUHJlcGVuZCBbdG9rZW5dIHRvIHRoZSB0b2tlbiBzdHJlYW0uCiAgdm9pZCBwcmVwZW5kRXJyb3JUb2tlbihFcnJvclRva2VuIHRva2VuKSB7CiAgICBoYXNFcnJvcnMgPSB0cnVlOwogICAgaWYgKGVycm9yVGFpbCA9PSB0YWlsKSB7CiAgICAgIGFwcGVuZFRva2VuKHRva2VuKTsKICAgICAgZXJyb3JUYWlsID0gdGFpbDsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuLm5leHQgPSBlcnJvclRhaWwubmV4dDsKICAgICAgdG9rZW4ubmV4dC5wcmV2aW91cyA9IHRva2VuOwogICAgICBlcnJvclRhaWwubmV4dCA9IHRva2VuOwogICAgICB0b2tlbi5wcmV2aW91cyA9IGVycm9yVGFpbDsKICAgICAgZXJyb3JUYWlsID0gZXJyb3JUYWlsLm5leHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGNvbW1lbnQgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIHRoZSBbZXh0cmFPZmZzZXRdLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQKICAgKiBzY2FuT2Zmc2V0IGlzIDEwLCB0aGVuIFthcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSldIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICBDb21tZW50VG9rZW4gY3JlYXRlQ29tbWVudFRva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGRhcnRkb2MgZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XSB0byB0aGUgY3VycmVudAogICAqIFtzY2FuT2Zmc2V0XSBwbHVzIHRoZSBbZXh0cmFPZmZzZXRdLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQKICAgKiBzY2FuT2Zmc2V0IGlzIDEwLCB0aGVuIFthcHBlbmRTdWJzdHJpbmdUb2tlbig1LCAtMSldIHdpbGwgYXBwZW5kIHRoZQogICAqIHN1YnN0cmluZyBzdHJpbmcgWzUsOSkuCiAgICoKICAgKiBOb3RlIHRoYXQgW2V4dHJhT2Zmc2V0XSBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3ZlcmVkIGNoYXJhY3RlcihzKSBhcmUKICAgKiBrbm93biB0byBiZSBBU0NJSS4KICAgKi8KICBEYXJ0RG9jVG9rZW4gY3JlYXRlRGFydERvY1Rva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IGxhbmd1YWdlIHZlcnNpb24gdG9rZW4gZnJvbSB0aGUgc2NhbiBvZmZzZXQgW3N0YXJ0XQogICAqIHRvIHRoZSBjdXJyZW50IFtzY2FuT2Zmc2V0XSBzaW1pbGFyIHRvIGNyZWF0ZUNvbW1lbnRUb2tlbi4KICAgKi8KICBMYW5ndWFnZVZlcnNpb25Ub2tlbiBjcmVhdGVMYW5ndWFnZVZlcnNpb25Ub2tlbigKICAgICAgaW50IHN0YXJ0LCBpbnQgbWFqb3IsIGludCBtaW5vcik7CgogIC8qKgogICAqIElmIGEgYmVnaW4gZ3JvdXAgdG9rZW4gbWF0Y2hlcyBbb3BlbktpbmRdLAogICAqIHRoZW4gZGlzY2FyZCBiZWdpbiBncm91cCB0b2tlbnMgdXAgdG8gdGhhdCBtYXRjaCBhbmQgcmV0dXJuIGB0cnVlYCwKICAgKiBvdGhlcndpc2UgcmV0dXJuIGBmYWxzZWAuCiAgICogVGhpcyByZWNvdmVycyBuaWNlbHkgZnJvbSBmcm9tIHNpdHVhdGlvbnMgbGlrZSAie1t9IiBhbmQgIntmb28oKSk7fSIsCiAgICogYnV0IG5vdCAiZm9vKCgpIHtiYXIoKSk7fSk7CiAgICovCiAgYm9vbCBkaXNjYXJkQmVnaW5Hcm91cFVudGlsKGludCBvcGVuS2luZCkgewogICAgTGluazxCZWdpblRva2VuPiBvcmlnaW5hbFN0YWNrID0gZ3JvdXBpbmdTdGFjazsKCiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGRvIHsKICAgICAgLy8gRG9uJ3QgcmVwb3J0IHVubWF0Y2hlZCBlcnJvcnMgZm9yIDw7IGl0IGlzIGFsc28gdGhlIGxlc3MtdGhhbiBvcGVyYXRvci4KICAgICAgZGlzY2FyZE9wZW5MdCgpOwogICAgICBpZiAoZ3JvdXBpbmdTdGFjay5pc0VtcHR5KSBicmVhazsgLy8gcmVjb3ZlcgogICAgICBCZWdpblRva2VuIGJlZ2luID0gZ3JvdXBpbmdTdGFjay5oZWFkOwogICAgICBpZiAob3BlbktpbmQgPT0gYmVnaW4ua2luZCB8fAogICAgICAgICAgKG9wZW5LaW5kID09IE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTiAmJgogICAgICAgICAgICAgIGJlZ2luLmtpbmQgPT0gU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4pIHx8CiAgICAgICAgICAob3BlbktpbmQgPT0gT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiAmJgogICAgICAgICAgICAgIGJlZ2luLmtpbmQgPT0gUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4pKSB7CiAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAvLyBJZiB0aGUgZXhwZWN0ZWQgb3BlbmVyIGhhcyBiZWVuIGZvdW5kIG9uIHRoZSBmaXJzdCBwYXNzCiAgICAgICAgICAvLyB0aGVuIG5vIHJlY292ZXJ5IG5lY2Vzc2FyeS4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBicmVhazsgLy8gcmVjb3ZlcgogICAgICB9CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICB9IHdoaWxlICghZ3JvdXBpbmdTdGFjay5pc0VtcHR5KTsKCiAgICAvLyBJZiB0aGUgc3RhY2sgZG9lcyBub3QgaGF2ZSBhbnkgb3BlbmVyIG9mIHRoZSBnaXZlbiB0eXBlLAogICAgLy8gdGhlbiByZXR1cm4gd2l0aG91dCBkaXNjYXJkaW5nIGFueXRoaW5nLgogICAgLy8gVGhpcyByZWNvdmVycyBuaWNlbHkgZnJvbSBmcm9tIHNpdHVhdGlvbnMgbGlrZSAie2ZvbygpKTt9Ii4KICAgIGlmIChncm91cGluZ1N0YWNrLmlzRW1wdHkpIHsKICAgICAgZ3JvdXBpbmdTdGFjayA9IG9yaWdpbmFsU3RhY2s7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBJbnNlcnQgc3ludGhldGljIGNsb3NlcnMgYW5kIHJlcG9ydCBlcnJvcnMgZm9yIGFueSB1bmJhbGFuY2VkIG9wZW5lcnMuCiAgICAvLyBUaGlzIHJlY292ZXJzIG5pY2VseSBmcm9tIGZyb20gc2l0dWF0aW9ucyBsaWtlICJ7W30iLgogICAgd2hpbGUgKCFpZGVudGljYWwob3JpZ2luYWxTdGFjaywgZ3JvdXBpbmdTdGFjaykpIHsKICAgICAgLy8gRG9uJ3QgcmVwb3J0IHVubWF0Y2hlZCBlcnJvcnMgZm9yIDw7IGl0IGlzIGFsc28gdGhlIGxlc3MtdGhhbiBvcGVyYXRvci4KICAgICAgaWYgKCFpZGVudGljYWwoZ3JvdXBpbmdTdGFjay5oZWFkLmtpbmQsIExUX1RPS0VOKSkgewogICAgICAgIHVubWF0Y2hlZEJlZ2luR3JvdXAob3JpZ2luYWxTdGFjay5oZWFkKTsKICAgICAgfQogICAgICBvcmlnaW5hbFN0YWNrID0gb3JpZ2luYWxTdGFjay50YWlsOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKioKICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gZGlzY2FyZCAnPCcgZnJvbSB0aGUgImdyb3VwaW5nIiBzdGFjay4KICAgKgogICAqIFtQYXJ0aWFsUGFyc2VyLnNraXBFeHByZXNzaW9uXSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB3ZSBkbyBub3QKICAgKiBjcmVhdGUgZ3JvdXBzIGZvciBzdHVmZiBsaWtlOgogICAqIFs6YSA9IGIgPCBjLCBkID0gZSA+IGY6XS4KICAgKgogICAqIEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgc2Nhbm5lciByZWNvZ25pemVzCiAgICogc29tZXRoaW5nIHdoaWNoIGNhbm5vdCBwb3NzaWJseSBiZSBwYXJ0IG9mIGEgdHlwZSBwYXJhbWV0ZXIvYXJndW1lbnQKICAgKiBsaXN0LCBsaWtlIHRoZSAnPScgaW4gdGhlIGFib3ZlIGV4YW1wbGUuCiAgICovCiAgdm9pZCBkaXNjYXJkT3Blbkx0KCkgewogICAgd2hpbGUgKCFncm91cGluZ1N0YWNrLmlzRW1wdHkgJiYKICAgICAgICBpZGVudGljYWwoZ3JvdXBpbmdTdGFjay5oZWFkLmtpbmQsIExUX1RPS0VOKSkgewogICAgICBncm91cGluZ1N0YWNrID0gZ3JvdXBpbmdTdGFjay50YWlsOwogICAgfQogIH0KCiAgLyoqCiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGRpc2NhcmQgJyR7JyBmcm9tIHRoZSAiZ3JvdXBpbmciIHN0YWNrLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNjYW5uZXIgZmluZHMgYW4gdW50ZXJtaW5hdGVkCiAgICogaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uLgogICAqLwogIHZvaWQgZGlzY2FyZEludGVycG9sYXRpb24oKSB7CiAgICB3aGlsZSAoIWdyb3VwaW5nU3RhY2suaXNFbXB0eSkgewogICAgICBCZWdpblRva2VuIGJlZ2luVG9rZW4gPSBncm91cGluZ1N0YWNrLmhlYWQ7CiAgICAgIHVubWF0Y2hlZEJlZ2luR3JvdXAoYmVnaW5Ub2tlbik7CiAgICAgIGdyb3VwaW5nU3RhY2sgPSBncm91cGluZ1N0YWNrLnRhaWw7CiAgICAgIGlmIChpZGVudGljYWwoYmVnaW5Ub2tlbi5raW5kLCBTVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTikpIGJyZWFrOwogICAgfQogIH0KCiAgdm9pZCB1bm1hdGNoZWRCZWdpbkdyb3VwKEJlZ2luVG9rZW4gYmVnaW4pIHsKICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdW5tYXRjaGVkIEJlZ2luVG9rZW5zIGFyZSByZXBvcnRlZCBhcwogICAgLy8gZXJyb3JzLiAgSG93ZXZlciwgdGhlIGRpZXQgcGFyc2VyIGFzc3VtZXMgdGhhdCBncm91cHMgYXJlIHdlbGwtYmFsYW5jZWQKICAgIC8vIGFuZCB3aWxsIG5ldmVyIGxvb2sgYXQgdGhlIGVuZEdyb3VwIHRva2VuLiAgVGhpcyBpcyBhIG5pY2UgcHJvcGVydHkgdGhhdAogICAgLy8gYWxsb3dzIHVzIHRvIHNraXAgcXVpY2tseSBvdmVyIGNvcnJlY3QgY29kZS4gQnkgaW5zZXJ0aW5nIGFuIGFkZGl0aW9uYWwKICAgIC8vIHN5bnRoZXRpYyB0b2tlbiBpbiB0aGUgc3RyZWFtLCB3ZSBjYW4ga2VlcCBpZ25vcmluZyBlbmRHcm91cCB0b2tlbnMuCiAgICAvLwogICAgLy8gW2JlZ2luXSAtLW5leHQtLT4gW3RhaWxdCiAgICAvLyBbYmVnaW5dIC0tZW5kRy0tPiBbc3ludGhldGljXSAtLW5leHQtLT4gW25leHRdIC0tbmV4dC0tPiBbdGFpbF0KICAgIC8vCiAgICAvLyBUaGlzIGFsbG93cyB0aGUgZGlldCBwYXJzZXIgdG8gc2tpcCBmcm9tIFtiZWdpbl0gdmlhIGVuZEdyb3VwIHRvCiAgICAvLyBbc3ludGhldGljXSBhbmQgaWdub3JlIHRoZSBbc3ludGhldGljXSB0b2tlbiAoYXNzdW1pbmcgaXQncyBjb3JyZWN0KSwKICAgIC8vIHRoZW4gdGhlIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiBwYXJzaW5nIHRoZSBbbmV4dF0gdG9rZW4uCiAgICAvLwogICAgLy8gRm9yIGV4YW1wbGUsIHRva2VuaXplKCJ7WzF9OyIpIHByb2R1Y2VzOgogICAgLy8KICAgIC8vIFN5bWJvbFRva2VuKHspIC0tZW5kR3JvdXAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgIG5leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyBTeW1ib2xUb2tlbihbKSAtLWVuZEdyb3VwLS0rICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICBuZXh0ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHYgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gU3RyaW5nVG9rZW4oMSkgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgbmV4dCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB2ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIFN5bWJvbFRva2VuKF0pPC0tLS0tLS0tLS0tLSsgPC0tIFN5bnRoZXRpYyB0b2tlbiB8CiAgICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgIG5leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyBVbm1hdGNoZWRUb2tlbihbKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vICAgICBuZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gU3ltYm9sVG9rZW4ofSk8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgIC8vICAgICAgfAogICAgLy8gICAgIG5leHQKICAgIC8vICAgICAgdgogICAgLy8gU3ltYm9sVG9rZW4oOykKICAgIC8vICAgICAgfAogICAgLy8gICAgIG5leHQKICAgIC8vICAgICAgdgogICAgLy8gICAgIEVPRgogICAgVG9rZW5UeXBlIHR5cGUgPSBjbG9zZUJyYWNlSW5mb0ZvcihiZWdpbik7CiAgICBhcHBlbmRUb2tlbihuZXcgU3ludGhldGljVG9rZW4odHlwZSwgdG9rZW5TdGFydCkuLmJlZm9yZVN5bnRoZXRpYyA9IHRhaWwpOwogICAgYmVnaW4uZW5kR3JvdXAgPSB0YWlsOwogICAgcHJlcGVuZEVycm9yVG9rZW4obmV3IFVubWF0Y2hlZFRva2VuKGJlZ2luKSk7CiAgfQoKICAvLy8gUmV0dXJuIHRydWUgd2hlbiBhdCBFT0YuCiAgYm9vbCBhdEVuZE9mRmlsZSgpOwoKICBUb2tlbiB0b2tlbml6ZSgpIHsKICAgIHdoaWxlICghYXRFbmRPZkZpbGUoKSkgewogICAgICBpbnQgbmV4dCA9IGFkdmFuY2UoKTsKCiAgICAgIC8vIFNjYW4gdGhlIGhlYWRlciBsb29raW5nIGZvciBhIGxhbmd1YWdlIHZlcnNpb24KICAgICAgaWYgKCFpZGVudGljYWwobmV4dCwgJEVPRikpIHsKICAgICAgICBUb2tlbiBvbGRUYWlsID0gdGFpbDsKICAgICAgICBuZXh0ID0gYmlnSGVhZGVyU3dpdGNoKG5leHQpOwogICAgICAgIGlmICghaWRlbnRpY2FsKG5leHQsICRFT0YpICYmIHRhaWwua2luZCA9PSBTQ1JJUFRfVE9LRU4pIHsKICAgICAgICAgIG9sZFRhaWwgPSB0YWlsOwogICAgICAgICAgbmV4dCA9IGJpZ0hlYWRlclN3aXRjaChuZXh0KTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikgJiYgdGFpbCA9PSBvbGRUYWlsKSB7CiAgICAgICAgICBuZXh0ID0gYmlnSGVhZGVyU3dpdGNoKG5leHQpOwogICAgICAgIH0KICAgICAgICBuZXh0ID0gbmV4dDsKICAgICAgfQoKICAgICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikpIHsKICAgICAgICBuZXh0ID0gYmlnU3dpdGNoKG5leHQpOwogICAgICB9CiAgICAgIGlmIChhdEVuZE9mRmlsZSgpKSB7CiAgICAgICAgYXBwZW5kRW9mVG9rZW4oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1bmV4cGVjdGVkKCRFT0YpOwogICAgICB9CiAgICB9CgogICAgLy8gQWx3YXlzIHByZXRlbmQgdGhhdCB0aGVyZSdzIGEgbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgogICAgbGluZVN0YXJ0cy5hZGQoc3RyaW5nT2Zmc2V0ICsgMSk7CgogICAgcmV0dXJuIGZpcnN0VG9rZW4oKTsKICB9CgogIGludCBiaWdIZWFkZXJTd2l0Y2goaW50IG5leHQpIHsKICAgIGlmICghaWRlbnRpY2FsKG5leHQsICRTTEFTSCkpIHsKICAgICAgcmV0dXJuIGJpZ1N3aXRjaChuZXh0KTsKICAgIH0KICAgIGJlZ2luVG9rZW4oKTsKICAgIGlmICghaWRlbnRpY2FsKCRTTEFTSCwgcGVlaygpKSkgewogICAgICByZXR1cm4gdG9rZW5pemVTbGFzaE9yQ29tbWVudChuZXh0KTsKICAgIH0KICAgIHJldHVybiB0b2tlbml6ZUxhbmd1YWdlVmVyc2lvbk9yU2luZ2xlTGluZUNvbW1lbnQobmV4dCk7CiAgfQoKICBpbnQgYmlnU3dpdGNoKGludCBuZXh0KSB7CiAgICBiZWdpblRva2VuKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRTUEFDRSkgfHwKICAgICAgICBpZGVudGljYWwobmV4dCwgJFRBQikgfHwKICAgICAgICBpZGVudGljYWwobmV4dCwgJExGKSB8fAogICAgICAgIGlkZW50aWNhbChuZXh0LCAkQ1IpKSB7CiAgICAgIGFwcGVuZFdoaXRlU3BhY2UobmV4dCk7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIC8vIFNlcXVlbmNlcyBvZiBzcGFjZXMgYXJlIGNvbW1vbiwgc28gYWR2YW5jZSB0aHJvdWdoIHRoZW0gZmFzdC4KICAgICAgd2hpbGUgKGlkZW50aWNhbChuZXh0LCAkU1BBQ0UpKSB7CiAgICAgICAgLy8gV2UgZG9uJ3QgaW52b2tlIFs6YXBwZW5kV2hpdGVTcGFjZShuZXh0KTpdIGhlcmUgZm9yIGVmZmljaWVuY3ksCiAgICAgICAgLy8gYXNzdW1pbmcgdGhhdCBpdCBkb2VzIG5vdCBkbyBhbnl0aGluZyBmb3Igc3BhY2UgY2hhcmFjdGVycy4KICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIGludCBuZXh0TG93ZXIgPSBuZXh0IHwgMHgyMDsKCiAgICBpZiAoJGEgPD0gbmV4dExvd2VyICYmIG5leHRMb3dlciA8PSAkeikgewogICAgICBpZiAoaWRlbnRpY2FsKCRyLCBuZXh0KSkgewogICAgICAgIHJldHVybiB0b2tlbml6ZVJhd1N0cmluZ0tleXdvcmRPcklkZW50aWZpZXIobmV4dCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCB0cnVlKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDTE9TRV9QQVJFTikpIHsKICAgICAgcmV0dXJuIGFwcGVuZEVuZEdyb3VwKFRva2VuVHlwZS5DTE9TRV9QQVJFTiwgT1BFTl9QQVJFTl9UT0tFTik7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkT1BFTl9QQVJFTikpIHsKICAgICAgYXBwZW5kQmVnaW5Hcm91cChUb2tlblR5cGUuT1BFTl9QQVJFTik7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkU0VNSUNPTE9OKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlNFTUlDT0xPTik7CiAgICAgIC8vIFR5cGUgcGFyYW1ldGVycyBhbmQgYXJndW1lbnRzIGNhbm5vdCBjb250YWluIHNlbWljb2xvbi4KICAgICAgZGlzY2FyZE9wZW5MdCgpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBFUklPRCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplRG90c09yTnVtYmVyKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENPTU1BKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkNPTU1BKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplRXF1YWxzKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJENMT1NFX0NVUkxZX0JSQUNLRVQpKSB7CiAgICAgIHJldHVybiBhcHBlbmRFbmRHcm91cCgKICAgICAgICAgIFRva2VuVHlwZS5DTE9TRV9DVVJMWV9CUkFDS0VULCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFNMQVNIKSkgewogICAgICByZXR1cm4gdG9rZW5pemVTbGFzaE9yQ29tbWVudChuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRPUEVOX0NVUkxZX0JSQUNLRVQpKSB7CiAgICAgIGFwcGVuZEJlZ2luR3JvdXAoVG9rZW5UeXBlLk9QRU5fQ1VSTFlfQlJBQ0tFVCk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRFEpIHx8IGlkZW50aWNhbChuZXh0LCAkU1EpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVN0cmluZyhuZXh0LCBzY2FuT2Zmc2V0LCBmYWxzZSk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkXykpIHsKICAgICAgcmV0dXJuIHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCB0cnVlKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDT0xPTikpIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5DT0xPTik7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkTFQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUxlc3NUaGFuKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEdUKSkgewogICAgICByZXR1cm4gdG9rZW5pemVHcmVhdGVyVGhhbihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQU5HKSkgewogICAgICByZXR1cm4gdG9rZW5pemVFeGNsYW1hdGlvbihuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRPUEVOX1NRVUFSRV9CUkFDS0VUKSkgewogICAgICByZXR1cm4gdG9rZW5pemVPcGVuU3F1YXJlQnJhY2tldChuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRDTE9TRV9TUVVBUkVfQlJBQ0tFVCkpIHsKICAgICAgcmV0dXJuIGFwcGVuZEVuZEdyb3VwKAogICAgICAgICAgVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULCBPUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRBVCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplQXQobmV4dCk7CiAgICB9CgogICAgaWYgKG5leHQgPj0gJDEgJiYgbmV4dCA8PSAkOSkgewogICAgICByZXR1cm4gdG9rZW5pemVOdW1iZXIobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQU1QRVJTQU5EKSkgewogICAgICByZXR1cm4gdG9rZW5pemVBbXBlcnNhbmQobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkMCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSGV4T3JOdW1iZXIobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUVVFU1RJT04pKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVF1ZXN0aW9uKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEJBUikpIHsKICAgICAgcmV0dXJuIHRva2VuaXplQmFyKG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBMVVMpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVBsdXMobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkJCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplS2V5d29yZE9ySWRlbnRpZmllcihuZXh0LCB0cnVlKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRNSU5VUykpIHsKICAgICAgcmV0dXJuIHRva2VuaXplTWludXMobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkU1RBUikpIHsKICAgICAgcmV0dXJuIHRva2VuaXplTXVsdGlwbHkobmV4dCk7CiAgICB9CgogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ0FSRVQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUNhcmV0KG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFRJTERFKSkgewogICAgICByZXR1cm4gdG9rZW5pemVUaWxkZShuZXh0KTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRQRVJDRU5UKSkgewogICAgICByZXR1cm4gdG9rZW5pemVQZXJjZW50KG5leHQpOwogICAgfQoKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEJBQ0tQSU5HKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBQ0tQSU5HKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQUNLU0xBU0gpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFDS1NMQVNIKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0KCiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRIQVNIKSkgewogICAgICByZXR1cm4gdG9rZW5pemVUYWcobmV4dCk7CiAgICB9CgogICAgaWYgKG5leHQgPCAweDFmKSB7CiAgICAgIHJldHVybiB1bmV4cGVjdGVkKG5leHQpOwogICAgfQoKICAgIG5leHQgPSBjdXJyZW50QXNVbmljb2RlKG5leHQpOwoKICAgIHJldHVybiB1bmV4cGVjdGVkKG5leHQpOwogIH0KCiAgaW50IHRva2VuaXplVGFnKGludCBuZXh0KSB7CiAgICAvLyAjIG9yICMhLipbXG5ccl0KICAgIGlmIChzY2FuT2Zmc2V0ID09IDApIHsKICAgICAgaWYgKGlkZW50aWNhbChwZWVrKCksICRCQU5HKSkgewogICAgICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICAgICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgICAgIGRvIHsKICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICBpZiAobmV4dCA+IDEyNykgYXNjaWlPbmx5ID0gZmFsc2U7CiAgICAgICAgfSB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkTEYpICYmCiAgICAgICAgICAgICFpZGVudGljYWwobmV4dCwgJENSKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKG5leHQsICRFT0YpKTsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShzdGFydCk7CiAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNDUklQVF9UQUcsIHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkhBU0gpOwogICAgcmV0dXJuIGFkdmFuY2UoKTsKICB9CgogIGludCB0b2tlbml6ZVRpbGRlKGludCBuZXh0KSB7CiAgICAvLyB+IH4vIH4vPQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJFNMQVNIKSkgewogICAgICByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLlRJTERFX1NMQVNIX0VRLCBUb2tlblR5cGUuVElMREVfU0xBU0gpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5USUxERSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplT3BlblNxdWFyZUJyYWNrZXQoaW50IG5leHQpIHsKICAgIC8vIFsgW10gW109CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQ0xPU0VfU1FVQVJFX0JSQUNLRVQpKSB7CiAgICAgIHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuSU5ERVhfRVEsIFRva2VuVHlwZS5JTkRFWCk7CiAgICB9CiAgICBhcHBlbmRCZWdpbkdyb3VwKFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VUKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplQ2FyZXQoaW50IG5leHQpIHsKICAgIC8vIF4gXj0KICAgIHJldHVybiBzZWxlY3QoJEVRLCBUb2tlblR5cGUuQ0FSRVRfRVEsIFRva2VuVHlwZS5DQVJFVCk7CiAgfQoKICBpbnQgdG9rZW5pemVRdWVzdGlvbihpbnQgbmV4dCkgewogICAgLy8gPyA/LiA/Li4gPz8gPz89CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkUVVFU1RJT04pKSB7CiAgICAgIHJldHVybiBzZWxlY3QoCiAgICAgICAgICAkRVEsIFRva2VuVHlwZS5RVUVTVElPTl9RVUVTVElPTl9FUSwgVG9rZW5UeXBlLlFVRVNUSU9OX1FVRVNUSU9OKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRQRVJJT0QpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChfZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKCRQRVJJT0QsIG5leHQpKSB7CiAgICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRF9QRVJJT0QpOwogICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlkZW50aWNhbCgkT1BFTl9TUVVBUkVfQlJBQ0tFVCwgbmV4dCkpIHsKICAgICAgICAgIGFwcGVuZEJlZ2luR3JvdXAoVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUKTsKICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9EKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlFVRVNUSU9OKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVCYXIoaW50IG5leHQpIHsKICAgIC8vIHwgfHwgfD0gfHw9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFSKSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoTEFaWV9BU1NJR05NRU5UX0VOQUJMRUQgJiYgaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBUl9CQVJfRVEpOwogICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgIH0KICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQVJfQkFSKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFSX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQkFSKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVBbXBlcnNhbmQoaW50IG5leHQpIHsKICAgIC8vICYmICY9ICYgJiY9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQU1QRVJTQU5EKSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoTEFaWV9BU1NJR05NRU5UX0VOQUJMRUQgJiYgaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkFNUEVSU0FORF9BTVBFUlNBTkRfRVEpOwogICAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICAgIH0KICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5BTVBFUlNBTkRfQU1QRVJTQU5EKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQU1QRVJTQU5EX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuQU1QRVJTQU5EKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVQZXJjZW50KGludCBuZXh0KSB7CiAgICAvLyAlICU9CiAgICByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLlBFUkNFTlRfRVEsIFRva2VuVHlwZS5QRVJDRU5UKTsKICB9CgogIGludCB0b2tlbml6ZU11bHRpcGx5KGludCBuZXh0KSB7CiAgICAvLyAqICo9CiAgICByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLlNUQVJfRVEsIFRva2VuVHlwZS5TVEFSKTsKICB9CgogIGludCB0b2tlbml6ZU1pbnVzKGludCBuZXh0KSB7CiAgICAvLyAtIC0tIC09CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkTUlOVVMpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuTUlOVVNfTUlOVVMpOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLk1JTlVTX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuTUlOVVMpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZVBsdXMoaW50IG5leHQpIHsKICAgIC8vICsgKysgKz0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKCRQTFVTLCBuZXh0KSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBMVVNfUExVUyk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuUExVU19FUSk7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBMVVMpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZUV4Y2xhbWF0aW9uKGludCBuZXh0KSB7CiAgICAvLyAhICE9CiAgICAvLyAhPT0gaXMga2VwdCBmb3IgdXNlci1mcmllbmRseSBlcnJvciByZXBvcnRpbmcuCgogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICAvL3dhcyBgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5CQU5HX0VRX0VRLCBUb2tlblR5cGUuQkFOR19FUSk7YAogICAgICBpbnQgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRVEpKSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5CQU5HX0VRX0VRKTsKICAgICAgICBwcmVwZW5kRXJyb3JUb2tlbihuZXcgVW5zdXBwb3J0ZWRPcGVyYXRvcih0YWlsLCB0b2tlblN0YXJ0KSk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBTkdfRVEpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkJBTkcpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVFcXVhbHMoaW50IG5leHQpIHsKICAgIC8vID0gPT0gPT4KICAgIC8vID09PSBpcyBrZXB0IGZvciB1c2VyLWZyaWVuZGx5IGVycm9yIHJlcG9ydGluZy4KCiAgICAvLyBUeXBlIHBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyBjYW5ub3QgY29udGFpbiBhbnkgdG9rZW4gdGhhdAogICAgLy8gc3RhcnRzIHdpdGggJz0nLgogICAgZGlzY2FyZE9wZW5MdCgpOwoKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFUSkpIHsKICAgICAgLy8gd2FzIGByZXR1cm4gc2VsZWN0KCRFUSwgVG9rZW5UeXBlLkVRX0VRX0VRLCBUb2tlblR5cGUuRVFfRVEpO2AKICAgICAgaW50IG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJEVRKSkgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuRVFfRVFfRVEpOwogICAgICAgIHByZXBlbmRFcnJvclRva2VuKG5ldyBVbnN1cHBvcnRlZE9wZXJhdG9yKHRhaWwsIHRva2VuU3RhcnQpKTsKICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuRVFfRVEpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChuZXh0LCAkR1QpKSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuRlVOQ1RJT04pOwogICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgfQogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5FUSk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIGludCB0b2tlbml6ZUdyZWF0ZXJUaGFuKGludCBuZXh0KSB7CiAgICAvLyA+ID49ID4+ID4+PSA+Pj4gPj4+PQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkdUX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRHVCwgbmV4dCkpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKGlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5HVF9HVF9FUSk7CiAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIGlmIChfZW5hYmxlVHJpcGxlU2hpZnQgJiYgaWRlbnRpY2FsKCRHVCwgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChfZW5hYmxlVHJpcGxlU2hpZnQgJiYgaWRlbnRpY2FsKCRFUSwgbmV4dCkpIHsKICAgICAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuR1RfR1RfR1RfRVEpOwogICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgICAgICB9CiAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5HVF9HVF9HVCk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwZW5kR3RHdChUb2tlblR5cGUuR1RfR1QpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRHdChUb2tlblR5cGUuR1QpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZUxlc3NUaGFuKGludCBuZXh0KSB7CiAgICAvLyA8IDw9IDw8IDw8PQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmIChpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLkxUX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRMVCwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHNlbGVjdCgkRVEsIFRva2VuVHlwZS5MVF9MVF9FUSwgVG9rZW5UeXBlLkxUX0xUKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZEJlZ2luR3JvdXAoVG9rZW5UeXBlLkxUKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgfQoKICBpbnQgdG9rZW5pemVOdW1iZXIoaW50IG5leHQpIHsKICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRlKSB8fCBpZGVudGljYWwobmV4dCwgJEUpKSB7CiAgICAgICAgcmV0dXJuIHRva2VuaXplRnJhY3Rpb25QYXJ0KG5leHQsIHN0YXJ0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRQRVJJT0QpKSB7CiAgICAgICAgICBpbnQgbmV4dG5leHQgPSBwZWVrKCk7CiAgICAgICAgICBpZiAoJDAgPD0gbmV4dG5leHQgJiYgbmV4dG5leHQgPD0gJDkpIHsKICAgICAgICAgICAgcmV0dXJuIHRva2VuaXplRnJhY3Rpb25QYXJ0KGFkdmFuY2UoKSwgc3RhcnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuSU5ULCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICB9CgogIGludCB0b2tlbml6ZUhleE9yTnVtYmVyKGludCBuZXh0KSB7CiAgICBpbnQgeCA9IHBlZWsoKTsKICAgIGlmIChpZGVudGljYWwoeCwgJHgpIHx8IGlkZW50aWNhbCh4LCAkWCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSGV4KG5leHQpOwogICAgfQogICAgcmV0dXJuIHRva2VuaXplTnVtYmVyKG5leHQpOwogIH0KCiAgaW50IHRva2VuaXplSGV4KGludCBuZXh0KSB7CiAgICBpbnQgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgbmV4dCA9IGFkdmFuY2UoKTsgLy8gQWR2YW5jZSBwYXN0IHRoZSAkeCBvciAkWC4KICAgIGJvb2wgaGFzRGlnaXRzID0gZmFsc2U7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICBpZiAoKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkgfHwKICAgICAgICAgICgkQSA8PSBuZXh0ICYmIG5leHQgPD0gJEYpIHx8CiAgICAgICAgICAoJGEgPD0gbmV4dCAmJiBuZXh0IDw9ICRmKSkgewogICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFoYXNEaWdpdHMpIHsKICAgICAgICAgIHByZXBlbmRFcnJvclRva2VuKG5ldyBVbnRlcm1pbmF0ZWRUb2tlbigKICAgICAgICAgICAgICBtZXNzYWdlRXhwZWN0ZWRIZXhEaWdpdCwgc3RhcnQsIHN0cmluZ09mZnNldCkpOwogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIGFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKAogICAgICAgICAgICAgIFRva2VuVHlwZS5IRVhBREVDSU1BTCwgc3RhcnQsIHRydWUsICIwIik7CiAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICB9CiAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLkhFWEFERUNJTUFMLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICB9CgogIGludCB0b2tlbml6ZURvdHNPck51bWJlcihpbnQgbmV4dCkgewogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoKCQwIDw9IG5leHQgJiYgbmV4dCA8PSAkOSkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplRnJhY3Rpb25QYXJ0KG5leHQsIHN0YXJ0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRQRVJJT0QsIG5leHQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBFUklPRCkpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFFVRVNUSU9OKSkgewogICAgICAgICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EX1BFUklPRF9RVUVTVElPTik7CiAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRF9QRVJJT0RfUEVSSU9EKTsKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRF9QRVJJT0QpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplRnJhY3Rpb25QYXJ0KGludCBuZXh0LCBpbnQgc3RhcnQpIHsKICAgIGJvb2wgZG9uZSA9IGZhbHNlOwogICAgYm9vbCBoYXNEaWdpdCA9IGZhbHNlOwogICAgTE9PUDoKICAgIHdoaWxlICghZG9uZSkgewogICAgICBpZiAoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB7CiAgICAgICAgaGFzRGlnaXQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgkZSwgbmV4dCkgfHwgaWRlbnRpY2FsKCRFLCBuZXh0KSkgewogICAgICAgIGhhc0RpZ2l0ID0gdHJ1ZTsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJFBMVVMpIHx8IGlkZW50aWNhbChuZXh0LCAkTUlOVVMpKSB7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIH0KICAgICAgICBib29sIGhhc0V4cG9uZW50RGlnaXRzID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGlmICgkMCA8PSBuZXh0ICYmIG5leHQgPD0gJDkpIHsKICAgICAgICAgICAgaGFzRXhwb25lbnREaWdpdHMgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFoYXNFeHBvbmVudERpZ2l0cykgewogICAgICAgICAgICAgIGFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5ET1VCTEUsIHN0YXJ0LCB0cnVlLCAnMCcpOwogICAgICAgICAgICAgIHByZXBlbmRFcnJvclRva2VuKG5ldyBVbnRlcm1pbmF0ZWRUb2tlbigKICAgICAgICAgICAgICAgICAgbWVzc2FnZU1pc3NpbmdFeHBvbmVudCwgdG9rZW5TdGFydCwgc3RyaW5nT2Zmc2V0KSk7CiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIH0KCiAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgY29udGludWUgTE9PUDsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICBjb250aW51ZSBMT09QOwogICAgICB9CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoIWhhc0RpZ2l0KSB7CiAgICAgIC8vIFJlZHVjZSBvZmZzZXQsIHdlIGFscmVhZHkgYWR2YW5jZWQgdG8gdGhlIHRva2VuIHBhc3QgdGhlIHBlcmlvZC4KICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLklOVCwgc3RhcnQsIHRydWUsIC0xKTsKCiAgICAgIC8vIFRPRE8oYWhlKTogV3Jvbmcgb2Zmc2V0IGZvciB0aGUgcGVyaW9kLiBDYW5ub3QgY2FsbCBiZWdpblRva2VuIGJlY2F1c2UKICAgICAgLy8gdGhlIHNjYW5uZXIgYWxyZWFkeSBhZHZhbmNlZCBwYXN0IHRoZSBwZXJpb2QuCiAgICAgIGlmIChpZGVudGljYWwoJFBFUklPRCwgbmV4dCkpIHsKICAgICAgICByZXR1cm4gc2VsZWN0KAogICAgICAgICAgICAkUEVSSU9ELCBUb2tlblR5cGUuUEVSSU9EX1BFUklPRF9QRVJJT0QsIFRva2VuVHlwZS5QRVJJT0RfUEVSSU9EKTsKICAgICAgfQogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlBFUklPRCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLkRPVUJMRSwgc3RhcnQsIHRydWUpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVTbGFzaE9yQ29tbWVudChpbnQgbmV4dCkgewogICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKCRTVEFSLCBuZXh0KSkgewogICAgICByZXR1cm4gdG9rZW5pemVNdWx0aUxpbmVDb21tZW50KG5leHQsIHN0YXJ0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRTTEFTSCwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnQobmV4dCwgc3RhcnQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoJEVRLCBuZXh0KSkgewogICAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlNMQVNIX0VRKTsKICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGVuZFByZWNlZGVuY2VUb2tlbihUb2tlblR5cGUuU0xBU0gpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZUxhbmd1YWdlVmVyc2lvbk9yU2luZ2xlTGluZUNvbW1lbnQoaW50IG5leHQpIHsKICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICBuZXh0ID0gYWR2YW5jZSgpOwoKICAgIC8vIERhcnQgZG9jCiAgICBpZiAoaWRlbnRpY2FsKCRTTEFTSCwgcGVlaygpKSkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudChuZXh0LCBzdGFydCk7CiAgICB9CgogICAgLy8gIkBkYXJ0IgogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIHdoaWxlIChpZGVudGljYWwoJFNQQUNFLCBuZXh0KSkgewogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKCFpZGVudGljYWwoJEFULCBuZXh0KSkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGZhbHNlKTsKICAgIH0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoIWlkZW50aWNhbCgkZCwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaWYgKCFpZGVudGljYWwoJGEsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGlmICghaWRlbnRpY2FsKCRyLCBuZXh0KSkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGZhbHNlKTsKICAgIH0KICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoIWlkZW50aWNhbCgkdCwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwoKICAgIC8vICI9IgogICAgd2hpbGUgKGlkZW50aWNhbCgkU1BBQ0UsIG5leHQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoIWlkZW50aWNhbCgkRVEsIG5leHQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50UmVzdChuZXh0LCBzdGFydCwgZmFsc2UpOwogICAgfQogICAgbmV4dCA9IGFkdmFuY2UoKTsKCiAgICAvLyBtYWpvcgogICAgd2hpbGUgKGlkZW50aWNhbCgkU1BBQ0UsIG5leHQpKSB7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpbnQgbWFqb3IgPSAwOwogICAgaW50IG1ham9yU3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgd2hpbGUgKGlzRGlnaXQobmV4dCkpIHsKICAgICAgbWFqb3IgPSBtYWpvciAqIDEwICsgbmV4dCAtICQwOwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKHNjYW5PZmZzZXQgPT0gbWFqb3JTdGFydCkgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGZhbHNlKTsKICAgIH0KCiAgICAvLyBtaW5vcgogICAgaWYgKCFpZGVudGljYWwoJFBFUklPRCwgbmV4dCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgaW50IG1pbm9yID0gMDsKICAgIGludCBtaW5vclN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgIHdoaWxlIChpc0RpZ2l0KG5leHQpKSB7CiAgICAgIG1pbm9yID0gbWlub3IgKiAxMCArIG5leHQgLSAkMDsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIGlmIChzY2FuT2Zmc2V0ID09IG1pbm9yU3RhcnQpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CgogICAgLy8gdHJhaWxpbmcgc3BhY2VzCiAgICB3aGlsZSAoaWRlbnRpY2FsKCRTUEFDRSwgbmV4dCkpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIGlmIChuZXh0ICE9ICRMRiAmJiBuZXh0ICE9ICRDUiAmJiBuZXh0ICE9ICRFT0YpIHsKICAgICAgcmV0dXJuIHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KG5leHQsIHN0YXJ0LCBmYWxzZSk7CiAgICB9CgogICAgTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gbGFuZ3VhZ2VWZXJzaW9uID0KICAgICAgICBjcmVhdGVMYW5ndWFnZVZlcnNpb25Ub2tlbihzdGFydCwgbWFqb3IsIG1pbm9yKTsKICAgIGlmIChsYW5ndWFnZVZlcnNpb25DaGFuZ2VkICE9IG51bGwpIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IG1ha2UgdGhpcyByZXF1aXJlZCBhbmQgcmVtb3ZlIHRoZSBsYW5ndWFnZVZlcnNpb24gZmllbGQKICAgICAgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCh0aGlzLCBsYW5ndWFnZVZlcnNpb24pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlbW92ZSB0aGlzIGhhY2sgYW5kIHJlcXVpcmUgbGlzdGVuZXIgdG8gdXBkYXRlCiAgICAgIC8vIHRoZSBzY2FubmVyJ3MgY29uZmlndXJhdGlvbi4KICAgICAgY29uZmlndXJhdGlvbiA9IFNjYW5uZXJDb25maWd1cmF0aW9uLmNsYXNzaWM7CiAgICB9CiAgICBpZiAoaW5jbHVkZUNvbW1lbnRzKSB7CiAgICAgIF9hcHBlbmRUb0NvbW1lbnRTdHJlYW0obGFuZ3VhZ2VWZXJzaW9uKTsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnQoaW50IG5leHQsIGludCBzdGFydCkgewogICAgYm9vbCBkYXJ0ZG9jID0gaWRlbnRpY2FsKCRTTEFTSCwgcGVlaygpKTsKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3QobmV4dCwgc3RhcnQsIGRhcnRkb2MpOwogIH0KCiAgaW50IHRva2VuaXplU2luZ2xlTGluZUNvbW1lbnRSZXN0KGludCBuZXh0LCBpbnQgc3RhcnQsIGJvb2wgZGFydGRvYykgewogICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKG5leHQgPiAxMjcpIGFzY2lpT25seSA9IGZhbHNlOwogICAgICBpZiAoaWRlbnRpY2FsKCRMRiwgbmV4dCkgfHwKICAgICAgICAgIGlkZW50aWNhbCgkQ1IsIG5leHQpIHx8CiAgICAgICAgICBpZGVudGljYWwoJEVPRiwgbmV4dCkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShzdGFydCk7CiAgICAgICAgaWYgKGRhcnRkb2MpIHsKICAgICAgICAgIGFwcGVuZERhcnREb2Moc3RhcnQsIFRva2VuVHlwZS5TSU5HTEVfTElORV9DT01NRU5ULCBhc2NpaU9ubHkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcHBlbmRDb21tZW50KHN0YXJ0LCBUb2tlblR5cGUuU0lOR0xFX0xJTkVfQ09NTUVOVCwgYXNjaWlPbmx5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICB9CgogIGludCB0b2tlbml6ZU11bHRpTGluZUNvbW1lbnQoaW50IG5leHQsIGludCBzdGFydCkgewogICAgYm9vbCBhc2NpaU9ubHlDb21tZW50ID0gdHJ1ZTsgLy8gVHJhY2sgaWYgdGhlIGVudGlyZSBjb21tZW50IGlzIEFTQ0lJLgogICAgYm9vbCBhc2NpaU9ubHlMaW5lcyA9IHRydWU7IC8vIFRyYWNrIEFTQ0lJIHNpbmNlIHRoZSBsYXN0IGhhbmRsZVVuaWNvZGUuCiAgICBpbnQgdW5pY29kZVN0YXJ0ID0gc3RhcnQ7CiAgICBpbnQgbmVzdGluZyA9IDE7CiAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgYm9vbCBkYXJ0ZG9jID0gaWRlbnRpY2FsKCRTVEFSLCBuZXh0KTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChpZGVudGljYWwoJEVPRiwgbmV4dCkpIHsKICAgICAgICBpZiAoIWFzY2lpT25seUxpbmVzKSBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgcHJlcGVuZEVycm9yVG9rZW4obmV3IFVudGVybWluYXRlZFRva2VuKAogICAgICAgICAgICBtZXNzYWdlVW50ZXJtaW5hdGVkQ29tbWVudCwgdG9rZW5TdGFydCwgc3RyaW5nT2Zmc2V0KSk7CiAgICAgICAgYWR2YW5jZUFmdGVyRXJyb3IodHJ1ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRTVEFSLCBuZXh0KSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGlkZW50aWNhbCgkU0xBU0gsIG5leHQpKSB7CiAgICAgICAgICAtLW5lc3Rpbmc7CiAgICAgICAgICBpZiAoMCA9PSBuZXN0aW5nKSB7CiAgICAgICAgICAgIGlmICghYXNjaWlPbmx5TGluZXMpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgICAgaWYgKGRhcnRkb2MpIHsKICAgICAgICAgICAgICBhcHBlbmREYXJ0RG9jKAogICAgICAgICAgICAgICAgICBzdGFydCwgVG9rZW5UeXBlLk1VTFRJX0xJTkVfQ09NTUVOVCwgYXNjaWlPbmx5Q29tbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYXBwZW5kQ29tbWVudCgKICAgICAgICAgICAgICAgICAgc3RhcnQsIFRva2VuVHlwZS5NVUxUSV9MSU5FX0NPTU1FTlQsIGFzY2lpT25seUNvbW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCRTTEFTSCwgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwoJFNUQVIsIG5leHQpKSB7CiAgICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgICAgKytuZXN0aW5nOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dCwgJExGKSkgewogICAgICAgIGlmICghYXNjaWlPbmx5TGluZXMpIHsKICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRoZSBzdHJpbmcgb2Zmc2V0IGluIHRoZSB1dGY4IHNjYW5uZXIuCiAgICAgICAgICBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICBhc2NpaU9ubHlMaW5lcyA9IHRydWU7CiAgICAgICAgICB1bmljb2RlU3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBsaW5lRmVlZEluTXVsdGlsaW5lKCk7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAobmV4dCA+IDEyNykgewogICAgICAgICAgYXNjaWlPbmx5TGluZXMgPSBmYWxzZTsKICAgICAgICAgIGFzY2lpT25seUNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICB2b2lkIGFwcGVuZENvbW1lbnQoaW50IHN0YXJ0LCBUb2tlblR5cGUgdHlwZSwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIGlmICghaW5jbHVkZUNvbW1lbnRzKSByZXR1cm47CiAgICBDb21tZW50VG9rZW4gbmV3Q29tbWVudCA9IGNyZWF0ZUNvbW1lbnRUb2tlbih0eXBlLCBzdGFydCwgYXNjaWlPbmx5KTsKICAgIF9hcHBlbmRUb0NvbW1lbnRTdHJlYW0obmV3Q29tbWVudCk7CiAgfQoKICB2b2lkIGFwcGVuZERhcnREb2MoaW50IHN0YXJ0LCBUb2tlblR5cGUgdHlwZSwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIGlmICghaW5jbHVkZUNvbW1lbnRzKSByZXR1cm47CiAgICBUb2tlbiBuZXdDb21tZW50ID0gY3JlYXRlRGFydERvY1Rva2VuKHR5cGUsIHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgX2FwcGVuZFRvQ29tbWVudFN0cmVhbShuZXdDb21tZW50KTsKICB9CgogIC8qKgogICAqIEFwcGVuZCB0aGUgZ2l2ZW4gdG9rZW4gdG8gdGhlIFt0YWlsXSBvZiB0aGUgY3VycmVudCBzdHJlYW0gb2YgdG9rZW5zLgogICAqLwogIHZvaWQgYXBwZW5kVG9rZW4oVG9rZW4gdG9rZW4pIHsKICAgIHRhaWwubmV4dCA9IHRva2VuOwogICAgdG9rZW4ucHJldmlvdXMgPSB0YWlsOwogICAgdGFpbCA9IHRva2VuOwogICAgaWYgKGNvbW1lbnRzICE9IG51bGwgJiYgY29tbWVudHMgPT0gdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpIHsKICAgICAgY29tbWVudHMgPSBudWxsOwogICAgICBjb21tZW50c1RhaWwgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgLy8gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gY29uc3RydWN0IHRoZSB0b2tlbgogICAgICAvLyBiZWluZyBhcHBlbmRlZCB3aXRoIHByZWNlZGluZyBjb21tZW50cyBpZiBhbnkKICAgICAgYXNzZXJ0KGNvbW1lbnRzID09IG51bGwgfHwgdG9rZW4uaXNTeW50aGV0aWMgfHwgdG9rZW4gaXMgRXJyb3JUb2tlbik7CiAgICB9CiAgfQoKICB2b2lkIF9hcHBlbmRUb0NvbW1lbnRTdHJlYW0oVG9rZW4gbmV3Q29tbWVudCkgewogICAgaWYgKGNvbW1lbnRzID09IG51bGwpIHsKICAgICAgY29tbWVudHMgPSBuZXdDb21tZW50OwogICAgICBjb21tZW50c1RhaWwgPSBjb21tZW50czsKICAgIH0gZWxzZSB7CiAgICAgIGNvbW1lbnRzVGFpbC5uZXh0ID0gbmV3Q29tbWVudDsKICAgICAgY29tbWVudHNUYWlsLm5leHQucHJldmlvdXMgPSBjb21tZW50c1RhaWw7CiAgICAgIGNvbW1lbnRzVGFpbCA9IGNvbW1lbnRzVGFpbC5uZXh0OwogICAgfQogIH0KCiAgaW50IHRva2VuaXplUmF3U3RyaW5nS2V5d29yZE9ySWRlbnRpZmllcihpbnQgbmV4dCkgewogICAgLy8gW25leHRdIGlzICRyLgogICAgaW50IG5leHRuZXh0ID0gcGVlaygpOwogICAgaWYgKGlkZW50aWNhbChuZXh0bmV4dCwgJERRKSB8fCBpZGVudGljYWwobmV4dG5leHQsICRTUSkpIHsKICAgICAgaW50IHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgcmV0dXJuIHRva2VuaXplU3RyaW5nKG5leHQsIHN0YXJ0LCB0cnVlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIobmV4dCwgdHJ1ZSk7CiAgfQoKICBpbnQgdG9rZW5pemVLZXl3b3JkT3JJZGVudGlmaWVyKGludCBuZXh0LCBib29sIGFsbG93RG9sbGFyKSB7CiAgICBLZXl3b3JkU3RhdGUgc3RhdGUgPSBLZXl3b3JkU3RhdGUuS0VZV09SRF9TVEFURTsKICAgIGludCBzdGFydCA9IHNjYW5PZmZzZXQ7CiAgICAvLyBXZSBhbGxvdyBhIGxlYWRpbmcgY2FwaXRhbCBjaGFyYWN0ZXIuCiAgICBpZiAoJEEgPD0gbmV4dCAmJiBuZXh0IDw9ICRaKSB7CiAgICAgIHN0YXRlID0gc3RhdGUubmV4dENhcGl0YWwobmV4dCk7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9IGVsc2UgaWYgKCRhIDw9IG5leHQgJiYgbmV4dCA8PSAkeikgewogICAgICAvLyBEbyB0aGUgZmlyc3QgbmV4dCBjYWxsIG91dHNpZGUgdGhlIGxvb3AgdG8gYXZvaWQgYW4gYWRkaXRpb25hbCB0ZXN0CiAgICAgIC8vIGFuZCB0byBtYWtlIHRoZSBsb29wIG1vbm9tb3JwaGljLgogICAgICBzdGF0ZSA9IHN0YXRlLm5leHQobmV4dCk7CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICB3aGlsZSAoc3RhdGUgIT0gbnVsbCAmJiAkYSA8PSBuZXh0ICYmIG5leHQgPD0gJHopIHsKICAgICAgc3RhdGUgPSBzdGF0ZS5uZXh0KG5leHQpOwogICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgfQogICAgaWYgKHN0YXRlID09IG51bGwgfHwgc3RhdGUua2V5d29yZCA9PSBudWxsKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUlkZW50aWZpZXIobmV4dCwgc3RhcnQsIGFsbG93RG9sbGFyKTsKICAgIH0KICAgIGlmICghX2VuYWJsZUV4dGVuc2lvbk1ldGhvZHMgJiYgc3RhdGUua2V5d29yZCA9PSBLZXl3b3JkLkVYVEVOU0lPTikgewogICAgICByZXR1cm4gdG9rZW5pemVJZGVudGlmaWVyKG5leHQsIHN0YXJ0LCBhbGxvd0RvbGxhcik7CiAgICB9CiAgICBpZiAoIV9lbmFibGVOb25OdWxsYWJsZSAmJgogICAgICAgIChzdGF0ZS5rZXl3b3JkID09IEtleXdvcmQuTEFURSB8fCBzdGF0ZS5rZXl3b3JkID09IEtleXdvcmQuUkVRVUlSRUQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUlkZW50aWZpZXIobmV4dCwgc3RhcnQsIGFsbG93RG9sbGFyKTsKICAgIH0KICAgIGlmICgoJEEgPD0gbmV4dCAmJiBuZXh0IDw9ICRaKSB8fAogICAgICAgICgkMCA8PSBuZXh0ICYmIG5leHQgPD0gJDkpIHx8CiAgICAgICAgaWRlbnRpY2FsKG5leHQsICRfKSB8fAogICAgICAgIGlkZW50aWNhbChuZXh0LCAkJCkpIHsKICAgICAgcmV0dXJuIHRva2VuaXplSWRlbnRpZmllcihuZXh0LCBzdGFydCwgYWxsb3dEb2xsYXIpOwogICAgfSBlbHNlIHsKICAgICAgYXBwZW5kS2V5d29yZFRva2VuKHN0YXRlLmtleXdvcmQpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICB9CgogIC8qKgogICAqIFthbGxvd0RvbGxhcl0gY2FuIGV4Y2x1ZGUgJyQnLCB3aGljaCBpcyBub3QgYWxsb3dlZCBhcyBwYXJ0IG9mIGEgc3RyaW5nCiAgICogaW50ZXJwb2xhdGlvbiBpZGVudGlmaWVyLgogICAqLwogIGludCB0b2tlbml6ZUlkZW50aWZpZXIoaW50IG5leHQsIGludCBzdGFydCwgYm9vbCBhbGxvd0RvbGxhcikgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKF9pc0lkZW50aWZpZXJDaGFyKG5leHQsIGFsbG93RG9sbGFyKSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSWRlbnRpZmllciBlbmRzIGhlcmUuCiAgICAgICAgaWYgKHN0YXJ0ID09IHNjYW5PZmZzZXQpIHsKICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKG5leHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuSURFTlRJRklFUiwgc3RhcnQsIHRydWUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVBdChpbnQgbmV4dCkgewogICAgYXBwZW5kUHJlY2VkZW5jZVRva2VuKFRva2VuVHlwZS5BVCk7CiAgICByZXR1cm4gYWR2YW5jZSgpOwogIH0KCiAgaW50IHRva2VuaXplU3RyaW5nKGludCBuZXh0LCBpbnQgc3RhcnQsIGJvb2wgcmF3KSB7CiAgICBpbnQgcXVvdGVDaGFyID0gbmV4dDsKICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKHF1b3RlQ2hhciwgbmV4dCkpIHsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgaWYgKGlkZW50aWNhbChxdW90ZUNoYXIsIG5leHQpKSB7CiAgICAgICAgLy8gTXVsdGlsaW5lIHN0cmluZy4KICAgICAgICByZXR1cm4gdG9rZW5pemVNdWx0aUxpbmVTdHJpbmcocXVvdGVDaGFyLCBzdGFydCwgcmF3KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFbXB0eSBzdHJpbmcuCiAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIHRydWUpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICB9CiAgICBpZiAocmF3KSB7CiAgICAgIHJldHVybiB0b2tlbml6ZVNpbmdsZUxpbmVSYXdTdHJpbmcobmV4dCwgcXVvdGVDaGFyLCBzdGFydCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdG9rZW5pemVTaW5nbGVMaW5lU3RyaW5nKG5leHQsIHF1b3RlQ2hhciwgc3RhcnQpOwogICAgfQogIH0KCiAgLyoqCiAgICogW25leHRdIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHF1b3RlLgogICAqIFtxdW90ZVN0YXJ0XSBpcyB0aGUgc2Nhbk9mZnNldCBvZiB0aGUgcXVvdGUuCiAgICoKICAgKiBUaGUgdG9rZW4gY29udGFpbnMgYSBzdWJzdHJpbmcgb2YgdGhlIHNvdXJjZSBmaWxlLCBpbmNsdWRpbmcgdGhlCiAgICogc3RyaW5nIHF1b3RlcywgYmFja3NsYXNoZXMgZm9yIGVzY2FwaW5nLiBGb3IgaW50ZXJwb2xhdGVkIHN0cmluZ3MsCiAgICogdGhlIHBhcnRzIGJlZm9yZSBhbmQgYWZ0ZXIgYXJlIHNlcGFyYXRlIHRva2Vucy4KICAgKgogICAqICAgImEgJGIgYyIKICAgKgogICAqIGdpdmVzIFN0cmluZ1Rva2VuKCJhICQpLCBTdHJpbmdUb2tlbihiKSBhbmQgU3RyaW5nVG9rZW4oIGMiKS4KICAgKi8KICBpbnQgdG9rZW5pemVTaW5nbGVMaW5lU3RyaW5nKGludCBuZXh0LCBpbnQgcXVvdGVDaGFyLCBpbnQgcXVvdGVTdGFydCkgewogICAgaW50IHN0YXJ0ID0gcXVvdGVTdGFydDsKICAgIGJvb2wgYXNjaWlPbmx5ID0gdHJ1ZTsKICAgIHdoaWxlICghaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkQkFDS1NMQVNIKSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICQkKSkgewogICAgICAgIGlmICghYXNjaWlPbmx5KSBoYW5kbGVVbmljb2RlKHN0YXJ0KTsKICAgICAgICBuZXh0ID0gdG9rZW5pemVTdHJpbmdJbnRlcnBvbGF0aW9uKHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgICAgIHN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgICAgICBhc2NpaU9ubHkgPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChuZXh0IDw9ICRDUiAmJgogICAgICAgICAgKGlkZW50aWNhbChuZXh0LCAkTEYpIHx8CiAgICAgICAgICAgICAgaWRlbnRpY2FsKG5leHQsICRDUikgfHwKICAgICAgICAgICAgICBpZGVudGljYWwobmV4dCwgJEVPRikpKSB7CiAgICAgICAgaWYgKCFhc2NpaU9ubHkpIGhhbmRsZVVuaWNvZGUoc3RhcnQpOwogICAgICAgIHVudGVybWluYXRlZFN0cmluZyhxdW90ZUNoYXIsIHF1b3RlU3RhcnQsIHN0YXJ0LAogICAgICAgICAgICBhc2NpaU9ubHk6IGFzY2lpT25seSwgaXNNdWx0aUxpbmU6IGZhbHNlLCBpc1JhdzogZmFsc2UpOwogICAgICAgIHJldHVybiBuZXh0OwogICAgICB9CiAgICAgIGlmIChuZXh0ID4gMTI3KSBhc2NpaU9ubHkgPSBmYWxzZTsKICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIH0KICAgIGlmICghYXNjaWlPbmx5KSBoYW5kbGVVbmljb2RlKHN0YXJ0KTsKICAgIC8vIEFkdmFuY2UgcGFzdCB0aGUgcXVvdGUgY2hhcmFjdGVyLgogICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVTdHJpbmdJbnRlcnBvbGF0aW9uKGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHN0YXJ0LCBhc2NpaU9ubHkpOwogICAgYmVnaW5Ub2tlbigpOyAvLyAkIHN0YXJ0cyBoZXJlLgogICAgaW50IG5leHQgPSBhZHZhbmNlKCk7CiAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRPUEVOX0NVUkxZX0JSQUNLRVQpKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZUludGVycG9sYXRlZEV4cHJlc3Npb24obmV4dCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdG9rZW5pemVJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKG5leHQpOwogICAgfQogIH0KCiAgaW50IHRva2VuaXplSW50ZXJwb2xhdGVkRXhwcmVzc2lvbihpbnQgbmV4dCkgewogICAgYXBwZW5kQmVnaW5Hcm91cChUb2tlblR5cGUuU1RSSU5HX0lOVEVSUE9MQVRJT05fRVhQUkVTU0lPTik7CiAgICBiZWdpblRva2VuKCk7IC8vIFRoZSBleHByZXNzaW9uIHN0YXJ0cyBoZXJlLgogICAgbmV4dCA9IGFkdmFuY2UoKTsgLy8gTW92ZSBwYXN0IHRoZSBjdXJseSBicmFja2V0LgogICAgd2hpbGUgKCFpZGVudGljYWwobmV4dCwgJEVPRikgJiYgIWlkZW50aWNhbChuZXh0LCAkU1RYKSkgewogICAgICBuZXh0ID0gYmlnU3dpdGNoKG5leHQpOwogICAgfQogICAgaWYgKGlkZW50aWNhbChuZXh0LCAkRU9GKSkgewogICAgICBiZWdpblRva2VuKCk7CiAgICAgIGRpc2NhcmRJbnRlcnBvbGF0aW9uKCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgbmV4dCA9IGFkdmFuY2UoKTsgLy8gTW92ZSBwYXN0IHRoZSAkU1RYLgogICAgYmVnaW5Ub2tlbigpOyAvLyBUaGUgc3RyaW5nIGludGVycG9sYXRpb24gc3VmZml4IHN0YXJ0cyBoZXJlLgogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKGludCBuZXh0KSB7CiAgICBhcHBlbmRQcmVjZWRlbmNlVG9rZW4oVG9rZW5UeXBlLlNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVIpOwoKICAgIGlmICgkYSA8PSBuZXh0ICYmIG5leHQgPD0gJHogfHwKICAgICAgICAkQSA8PSBuZXh0ICYmIG5leHQgPD0gJFogfHwKICAgICAgICBpZGVudGljYWwobmV4dCwgJF8pKSB7CiAgICAgIGJlZ2luVG9rZW4oKTsgLy8gVGhlIGlkZW50aWZpZXIgc3RhcnRzIGhlcmUuCiAgICAgIG5leHQgPSB0b2tlbml6ZUtleXdvcmRPcklkZW50aWZpZXIobmV4dCwgZmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgYmVnaW5Ub2tlbigpOyAvLyBUaGUgc3ludGhldGljIGlkZW50aWZpZXIgc3RhcnRzIGhlcmUuCiAgICAgIGFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCBzY2FuT2Zmc2V0LCB0cnVlLCAnJyk7CiAgICAgIHByZXBlbmRFcnJvclRva2VuKG5ldyBVbnRlcm1pbmF0ZWRUb2tlbigKICAgICAgICAgIG1lc3NhZ2VVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmcsIHRva2VuU3RhcnQsIHN0cmluZ09mZnNldCkpOwogICAgfQogICAgYmVnaW5Ub2tlbigpOyAvLyBUaGUgc3RyaW5nIGludGVycG9sYXRpb24gc3VmZml4IHN0YXJ0cyBoZXJlLgogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVTaW5nbGVMaW5lUmF3U3RyaW5nKGludCBuZXh0LCBpbnQgcXVvdGVDaGFyLCBpbnQgcXVvdGVTdGFydCkgewogICAgYm9vbCBhc2NpaU9ubHkgPSB0cnVlOwogICAgd2hpbGUgKG5leHQgIT0gJEVPRikgewogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShxdW90ZVN0YXJ0KTsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGFwcGVuZFN1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHF1b3RlU3RhcnQsIGFzY2lpT25seSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG5leHQsICRMRikgfHwgaWRlbnRpY2FsKG5leHQsICRDUikpIHsKICAgICAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShxdW90ZVN0YXJ0KTsKICAgICAgICB1bnRlcm1pbmF0ZWRTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0LCBxdW90ZVN0YXJ0LAogICAgICAgICAgICBhc2NpaU9ubHk6IGFzY2lpT25seSwgaXNNdWx0aUxpbmU6IGZhbHNlLCBpc1JhdzogdHJ1ZSk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0gZWxzZSBpZiAobmV4dCA+IDEyNykgewogICAgICAgIGFzY2lpT25seSA9IGZhbHNlOwogICAgICB9CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoIWFzY2lpT25seSkgaGFuZGxlVW5pY29kZShxdW90ZVN0YXJ0KTsKICAgIHVudGVybWluYXRlZFN0cmluZyhxdW90ZUNoYXIsIHF1b3RlU3RhcnQsIHF1b3RlU3RhcnQsCiAgICAgICAgYXNjaWlPbmx5OiBhc2NpaU9ubHksIGlzTXVsdGlMaW5lOiBmYWxzZSwgaXNSYXc6IHRydWUpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVNdWx0aUxpbmVSYXdTdHJpbmcoaW50IHF1b3RlQ2hhciwgaW50IHF1b3RlU3RhcnQpIHsKICAgIGJvb2wgYXNjaWlPbmx5U3RyaW5nID0gdHJ1ZTsKICAgIGJvb2wgYXNjaWlPbmx5TGluZSA9IHRydWU7CiAgICBpbnQgdW5pY29kZVN0YXJ0ID0gcXVvdGVTdGFydDsKICAgIGludCBuZXh0ID0gYWR2YW5jZSgpOyAvLyBBZHZhbmNlIHBhc3QgdGhlIChsYXN0KSBxdW90ZSAob2YgdGhyZWUpLgogICAgb3V0ZXI6CiAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSkgewogICAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCBxdW90ZUNoYXIpKSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCAkTEYpKSB7CiAgICAgICAgICBpZiAoIWFzY2lpT25seUxpbmUpIHsKICAgICAgICAgICAgLy8gU3luY2hyb25pemUgdGhlIHN0cmluZyBvZmZzZXQgaW4gdGhlIHV0Zjggc2Nhbm5lci4KICAgICAgICAgICAgaGFuZGxlVW5pY29kZSh1bmljb2RlU3RhcnQpOwogICAgICAgICAgICBhc2NpaU9ubHlMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgdW5pY29kZVN0YXJ0ID0gc2Nhbk9mZnNldDsKICAgICAgICAgIH0KICAgICAgICAgIGxpbmVGZWVkSW5NdWx0aWxpbmUoKTsKICAgICAgICB9IGVsc2UgaWYgKG5leHQgPiAxMjcpIHsKICAgICAgICAgIGFzY2lpT25seUxpbmUgPSBmYWxzZTsKICAgICAgICAgIGFzY2lpT25seVN0cmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgJEVPRikpIGJyZWFrIG91dGVyOwogICAgICB9CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgIGlmIChpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBxdW90ZUNoYXIpKSB7CiAgICAgICAgICBpZiAoIWFzY2lpT25seUxpbmUpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICAgICAgICBhcHBlbmRTdWJzdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCBxdW90ZVN0YXJ0LCBhc2NpaU9ubHlTdHJpbmcpOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIWFzY2lpT25seUxpbmUpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgIHVudGVybWluYXRlZFN0cmluZyhxdW90ZUNoYXIsIHF1b3RlU3RhcnQsIHF1b3RlU3RhcnQsCiAgICAgICAgYXNjaWlPbmx5OiBhc2NpaU9ubHlMaW5lLCBpc011bHRpTGluZTogdHJ1ZSwgaXNSYXc6IHRydWUpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBpbnQgdG9rZW5pemVNdWx0aUxpbmVTdHJpbmcoaW50IHF1b3RlQ2hhciwgaW50IHF1b3RlU3RhcnQsIGJvb2wgcmF3KSB7CiAgICBpZiAocmF3KSByZXR1cm4gdG9rZW5pemVNdWx0aUxpbmVSYXdTdHJpbmcocXVvdGVDaGFyLCBxdW90ZVN0YXJ0KTsKICAgIGludCBzdGFydCA9IHF1b3RlU3RhcnQ7CiAgICBib29sIGFzY2lpT25seVN0cmluZyA9IHRydWU7CiAgICBib29sIGFzY2lpT25seUxpbmUgPSB0cnVlOwogICAgaW50IHVuaWNvZGVTdGFydCA9IHN0YXJ0OwogICAgaW50IG5leHQgPSBhZHZhbmNlKCk7IC8vIEFkdmFuY2UgcGFzdCB0aGUgKGxhc3QpIHF1b3RlIChvZiB0aHJlZSkuCiAgICB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCAkRU9GKSkgewogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICQkKSkgewogICAgICAgIGlmICghYXNjaWlPbmx5TGluZSkgaGFuZGxlVW5pY29kZSh1bmljb2RlU3RhcnQpOwogICAgICAgIG5leHQgPSB0b2tlbml6ZVN0cmluZ0ludGVycG9sYXRpb24oc3RhcnQsIGFzY2lpT25seVN0cmluZyk7CiAgICAgICAgc3RhcnQgPSBzY2FuT2Zmc2V0OwogICAgICAgIHVuaWNvZGVTdGFydCA9IHN0YXJ0OwogICAgICAgIGFzY2lpT25seVN0cmluZyA9IHRydWU7IC8vIEEgbmV3IHN0cmluZyB0b2tlbiBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdC4KICAgICAgICBhc2NpaU9ubHlMaW5lID0gdHJ1ZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsIHF1b3RlQ2hhcikpIHsKICAgICAgICBuZXh0ID0gYWR2YW5jZSgpOwogICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgIGlmIChpZGVudGljYWwobmV4dCwgcXVvdGVDaGFyKSkgewogICAgICAgICAgICBpZiAoIWFzY2lpT25seUxpbmUpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICAgICAgYXBwZW5kU3Vic3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgc3RhcnQsIGFzY2lpT25seVN0cmluZyk7CiAgICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRCQUNLU0xBU0gpKSB7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRFT0YpKSBicmVhazsKICAgICAgfQogICAgICBpZiAoaWRlbnRpY2FsKG5leHQsICRMRikpIHsKICAgICAgICBpZiAoIWFzY2lpT25seUxpbmUpIHsKICAgICAgICAgIC8vIFN5bmNocm9uaXplIHRoZSBzdHJpbmcgb2Zmc2V0IGluIHRoZSB1dGY4IHNjYW5uZXIuCiAgICAgICAgICBoYW5kbGVVbmljb2RlKHVuaWNvZGVTdGFydCk7CiAgICAgICAgICBhc2NpaU9ubHlMaW5lID0gdHJ1ZTsKICAgICAgICAgIHVuaWNvZGVTdGFydCA9IHNjYW5PZmZzZXQ7CiAgICAgICAgfQogICAgICAgIGxpbmVGZWVkSW5NdWx0aWxpbmUoKTsKICAgICAgfSBlbHNlIGlmIChuZXh0ID4gMTI3KSB7CiAgICAgICAgYXNjaWlPbmx5U3RyaW5nID0gZmFsc2U7CiAgICAgICAgYXNjaWlPbmx5TGluZSA9IGZhbHNlOwogICAgICB9CiAgICAgIG5leHQgPSBhZHZhbmNlKCk7CiAgICB9CiAgICBpZiAoIWFzY2lpT25seUxpbmUpIGhhbmRsZVVuaWNvZGUodW5pY29kZVN0YXJ0KTsKICAgIHVudGVybWluYXRlZFN0cmluZyhxdW90ZUNoYXIsIHF1b3RlU3RhcnQsIHN0YXJ0LAogICAgICAgIGFzY2lpT25seTogYXNjaWlPbmx5U3RyaW5nLCBpc011bHRpTGluZTogdHJ1ZSwgaXNSYXc6IGZhbHNlKTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgaW50IHVuZXhwZWN0ZWQoaW50IGNoYXJhY3RlcikgewogICAgRXJyb3JUb2tlbiBlcnJvclRva2VuID0KICAgICAgICBidWlsZFVuZXhwZWN0ZWRDaGFyYWN0ZXJUb2tlbihjaGFyYWN0ZXIsIHRva2VuU3RhcnQpOwogICAgaWYgKGVycm9yVG9rZW4gaXMgTm9uQXNjaWlJZGVudGlmaWVyVG9rZW4pIHsKICAgICAgaW50IGNoYXJPZmZzZXQ7CiAgICAgIExpc3Q8aW50PiBjb2RlVW5pdHMgPSA8aW50PltdOwogICAgICBpZiAodGFpbC50eXBlID09IFRva2VuVHlwZS5JREVOVElGSUVSICYmIHRhaWwuY2hhckVuZCA9PSB0b2tlblN0YXJ0KSB7CiAgICAgICAgY2hhck9mZnNldCA9IHRhaWwuY2hhck9mZnNldDsKICAgICAgICBjb2RlVW5pdHMuYWRkQWxsKHRhaWwubGV4ZW1lLmNvZGVVbml0cyk7CiAgICAgICAgdGFpbCA9IHRhaWwucHJldmlvdXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2hhck9mZnNldCA9IGVycm9yVG9rZW4uY2hhck9mZnNldDsKICAgICAgfQogICAgICBjb2RlVW5pdHMuYWRkKGVycm9yVG9rZW4uY2hhcmFjdGVyKTsKICAgICAgcHJlcGVuZEVycm9yVG9rZW4oZXJyb3JUb2tlbik7CiAgICAgIGludCBuZXh0ID0gYWR2YW5jZUFmdGVyRXJyb3IodHJ1ZSk7CiAgICAgIHdoaWxlIChfaXNJZGVudGlmaWVyQ2hhcihuZXh0LCB0cnVlKSkgewogICAgICAgIGNvZGVVbml0cy5hZGQobmV4dCk7CiAgICAgICAgbmV4dCA9IGFkdmFuY2UoKTsKICAgICAgfQogICAgICBhcHBlbmRUb2tlbihuZXcgU3RyaW5nVG9rZW4uZnJvbVN0cmluZyhUb2tlblR5cGUuSURFTlRJRklFUiwKICAgICAgICAgIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpLCBjaGFyT2Zmc2V0KSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgcHJlcGVuZEVycm9yVG9rZW4oZXJyb3JUb2tlbik7CiAgICAgIHJldHVybiBhZHZhbmNlQWZ0ZXJFcnJvcih0cnVlKTsKICAgIH0KICB9CgogIHZvaWQgdW50ZXJtaW5hdGVkU3RyaW5nKGludCBxdW90ZUNoYXIsIGludCBxdW90ZVN0YXJ0LCBpbnQgc3RhcnQsCiAgICAgIHtib29sIGFzY2lpT25seSwgYm9vbCBpc011bHRpTGluZSwgYm9vbCBpc1Jhd30pIHsKICAgIFN0cmluZyBzdWZmaXggPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoCiAgICAgICAgaXNNdWx0aUxpbmUgPyBbcXVvdGVDaGFyLCBxdW90ZUNoYXIsIHF1b3RlQ2hhcl0gOiBbcXVvdGVDaGFyXSk7CiAgICBTdHJpbmcgcHJlZml4ID0gaXNSYXcgPyAnciRzdWZmaXgnIDogc3VmZml4OwoKICAgIGFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuKFRva2VuVHlwZS5TVFJJTkcsIHN0YXJ0LCBhc2NpaU9ubHksIHN1ZmZpeCk7CiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgb24gYSB2aXNpYmxlIHRva2VuCiAgICBpbnQgZXJyb3JTdGFydCA9IHRva2VuU3RhcnQgPCBzdHJpbmdPZmZzZXQgPyB0b2tlblN0YXJ0IDogcXVvdGVTdGFydDsKICAgIHByZXBlbmRFcnJvclRva2VuKG5ldyBVbnRlcm1pbmF0ZWRTdHJpbmcocHJlZml4LCBlcnJvclN0YXJ0LCBzdHJpbmdPZmZzZXQpKTsKICB9CgogIGludCBhZHZhbmNlQWZ0ZXJFcnJvcihib29sIHNob3VsZEFkdmFuY2UpIHsKICAgIGlmIChhdEVuZE9mRmlsZSgpKSByZXR1cm4gJEVPRjsKICAgIGlmIChzaG91bGRBZHZhbmNlKSB7CiAgICAgIHJldHVybiBhZHZhbmNlKCk7IC8vIEVuc3VyZSBwcm9ncmVzcy4KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9Cn0KClRva2VuVHlwZSBjbG9zZUJyYWNlSW5mb0ZvcihCZWdpblRva2VuIGJlZ2luKSB7CiAgcmV0dXJuIGNvbnN0IHsKICAgICcoJzogVG9rZW5UeXBlLkNMT1NFX1BBUkVOLAogICAgJ1snOiBUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsCiAgICAneyc6IFRva2VuVHlwZS5DTE9TRV9DVVJMWV9CUkFDS0VULAogICAgJzwnOiBUb2tlblR5cGUuR1QsCiAgICByJyR7JzogVG9rZW5UeXBlLkNMT1NFX0NVUkxZX0JSQUNLRVQsCiAgICAnPy5bJzogVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULAogIH1bYmVnaW4ubGV4ZW1lXTsKfQoKY2xhc3MgTGluZVN0YXJ0cyBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxpbnQ+IHsKICBMaXN0PGludD4gYXJyYXk7CiAgaW50IGFycmF5TGVuZ3RoID0gMDsKCiAgTGluZVN0YXJ0cyhpbnQgbnVtYmVyT2ZCeXRlc0hpbnQpIHsKICAgIC8vIExldCdzIGFzc3VtZSB0aGUgYXZlcmFnZSBEYXJ0IGZpbGUgaXMgMzAwIGJ5dGVzLgogICAgaWYgKG51bWJlck9mQnl0ZXNIaW50ID09IG51bGwpIG51bWJlck9mQnl0ZXNIaW50ID0gMzAwOwoKICAgIC8vIExldCdzIGFzc3VtZSB3ZSBoYXZlIG9uIGF2ZXJhZ2UgMjIgYnl0ZXMgcGVyIGxpbmUuCiAgICBmaW5hbCBpbnQgZXhwZWN0ZWROdW1iZXJPZkxpbmVzID0gMSArIChudW1iZXJPZkJ5dGVzSGludCB+LyAyMik7CgogICAgaWYgKG51bWJlck9mQnl0ZXNIaW50ID4gNjU1MzUpIHsKICAgICAgYXJyYXkgPSBuZXcgVWludDMyTGlzdChleHBlY3RlZE51bWJlck9mTGluZXMpOwogICAgfSBlbHNlIHsKICAgICAgYXJyYXkgPSBuZXcgVWludDE2TGlzdChleHBlY3RlZE51bWJlck9mTGluZXMpOwogICAgfQoKICAgIC8vIFRoZSBmaXJzdCBsaW5lIHN0YXJ0cyBhdCBjaGFyYWN0ZXIgb2Zmc2V0IDAuCiAgICBhZGQoMCk7CiAgfQoKICAvLyBJbXBsZW1lbnQgYWJzdHJhY3QgbWVtYmVycyB1c2VkIGJ5IFtMaXN0TWl4aW5dCgogIGludCBnZXQgbGVuZ3RoID0+IGFycmF5TGVuZ3RoOwoKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBhc3NlcnQoaW5kZXggPCBhcnJheUxlbmd0aCk7CiAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwogIH0KCiAgdm9pZCBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKICAgIGlmIChuZXdMZW5ndGggPiBhcnJheS5sZW5ndGgpIHsKICAgICAgZ3JvdyhuZXdMZW5ndGgpOwogICAgfQogICAgYXJyYXlMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID4gNjU1MzUgJiYgYXJyYXkgaXMhIFVpbnQzMkxpc3QpIHsKICAgICAgc3dpdGNoVG9VaW50MzIoYXJyYXkubGVuZ3RoKTsKICAgIH0KICAgIGFycmF5W2luZGV4XSA9IHZhbHVlOwogIH0KCiAgLy8gU3BlY2lhbGl6ZSBtZXRob2RzIGZyb20gW0xpc3RNaXhpbl0uCiAgdm9pZCBhZGQoaW50IHZhbHVlKSB7CiAgICBpZiAoYXJyYXlMZW5ndGggPj0gYXJyYXkubGVuZ3RoKSB7CiAgICAgIGdyb3coMCk7CiAgICB9CiAgICBpZiAodmFsdWUgPiA2NTUzNSAmJiBhcnJheSBpcyEgVWludDMyTGlzdCkgewogICAgICBzd2l0Y2hUb1VpbnQzMihhcnJheS5sZW5ndGgpOwogICAgfQogICAgYXJyYXlbYXJyYXlMZW5ndGgrK10gPSB2YWx1ZTsKICB9CgogIC8vIEhlbHBlciBtZXRob2RzLgoKICB2b2lkIGdyb3coaW50IG5ld0xlbmd0aE1pbmltdW0pIHsKICAgIGludCBuZXdMZW5ndGggPSBhcnJheS5sZW5ndGggKiAyOwogICAgaWYgKG5ld0xlbmd0aCA8IG5ld0xlbmd0aE1pbmltdW0pIG5ld0xlbmd0aCA9IG5ld0xlbmd0aE1pbmltdW07CgogICAgaWYgKGFycmF5IGlzIFVpbnQxNkxpc3QpIHsKICAgICAgZmluYWwgVWludDE2TGlzdCBuZXdBcnJheSA9IG5ldyBVaW50MTZMaXN0KG5ld0xlbmd0aCk7CiAgICAgIG5ld0FycmF5LnNldFJhbmdlKDAsIGFycmF5TGVuZ3RoLCBhcnJheSk7CiAgICAgIGFycmF5ID0gbmV3QXJyYXk7CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2hUb1VpbnQzMihuZXdMZW5ndGgpOwogICAgfQogIH0KCiAgdm9pZCBzd2l0Y2hUb1VpbnQzMihpbnQgbmV3TGVuZ3RoKSB7CiAgICBmaW5hbCBVaW50MzJMaXN0IG5ld0FycmF5ID0gbmV3IFVpbnQzMkxpc3QobmV3TGVuZ3RoKTsKICAgIG5ld0FycmF5LnNldFJhbmdlKDAsIGFycmF5TGVuZ3RoLCBhcnJheSk7CiAgICBhcnJheSA9IG5ld0FycmF5OwogIH0KfQoKLy8vIFtTY2FubmVyQ29uZmlndXJhdGlvbl0gY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGNvbmZpZ3VyaW5nIHdoaWNoIHRva2VucwovLy8gdGhlIHNjYW5uZXIgcHJvZHVjZXMgYmFzZWQgdXBvbiB0aGUgRGFydCBsYW5ndWFnZSBsZXZlbC4KY2xhc3MgU2Nhbm5lckNvbmZpZ3VyYXRpb24gewogIHN0YXRpYyBjb25zdCBTY2FubmVyQ29uZmlndXJhdGlvbiBjbGFzc2ljID0gY29uc3QgU2Nhbm5lckNvbmZpZ3VyYXRpb24oKTsKICBzdGF0aWMgY29uc3QgU2Nhbm5lckNvbmZpZ3VyYXRpb24gbm9uTnVsbGFibGUgPQogICAgICBjb25zdCBTY2FubmVyQ29uZmlndXJhdGlvbihlbmFibGVOb25OdWxsYWJsZTogdHJ1ZSk7CgogIC8vLyBFeHBlcmltZW50YWwgZmxhZyBmb3IgZW5hYmxpbmcgc2Nhbm5pbmcgb2YgdGhlIGBleHRlbnNpb25gIGtleXdvcmQuCiAgZmluYWwgYm9vbCBlbmFibGVFeHRlbnNpb25NZXRob2RzOwoKICAvLy8gRXhwZXJpbWVudGFsIGZsYWcgZm9yIGVuYWJsaW5nIHNjYW5uaW5nIG9mIE5OQkQgdG9rZW5zCiAgLy8vIHN1Y2ggYXMgJ3JlcXVpcmVkJyBhbmQgJ2xhdGUnCiAgZmluYWwgYm9vbCBlbmFibGVOb25OdWxsYWJsZTsKCiAgLy8vIEV4cGVyaW1lbnRhbCBmbGFnIGZvciBlbmFibGluZyBzY2FubmluZyBvZiBgPj4+YC4KICAvLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzYxCiAgLy8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2lzc3Vlcy82MAogIGZpbmFsIGJvb2wgZW5hYmxlVHJpcGxlU2hpZnQ7CgogIGNvbnN0IFNjYW5uZXJDb25maWd1cmF0aW9uKHsKICAgIGJvb2wgZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcywKICAgIGJvb2wgZW5hYmxlTm9uTnVsbGFibGUsCiAgICBib29sIGVuYWJsZVRyaXBsZVNoaWZ0LAogIH0pICA6IHRoaXMuZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcyA9IGVuYWJsZUV4dGVuc2lvbk1ldGhvZHMgPz8gZmFsc2UsCiAgICAgICAgdGhpcy5lbmFibGVOb25OdWxsYWJsZSA9IGVuYWJsZU5vbk51bGxhYmxlID8/IGZhbHNlLAogICAgICAgIHRoaXMuZW5hYmxlVHJpcGxlU2hpZnQgPSBlbmFibGVUcmlwbGVTaGlmdCA/PyBmYWxzZTsKfQoKYm9vbCBfaXNJZGVudGlmaWVyQ2hhcihpbnQgbmV4dCwgYm9vbCBhbGxvd0RvbGxhcikgewogIHJldHVybiAoJGEgPD0gbmV4dCAmJiBuZXh0IDw9ICR6KSB8fAogICAgICAoJEEgPD0gbmV4dCAmJiBuZXh0IDw9ICRaKSB8fAogICAgICAoJDAgPD0gbmV4dCAmJiBuZXh0IDw9ICQ5KSB8fAogICAgICBpZGVudGljYWwobmV4dCwgJF8pIHx8CiAgICAgIChpZGVudGljYWwobmV4dCwgJCQpICYmIGFsbG93RG9sbGFyKTsKfQqHhwBOTjwBNgEpATYBFE4BMgEgCSEgKSQBJgEaARoJIRgdHBsBLwEZSAEfARZGASU8ATQGQzVJPQY1AR4BQUAxNwFIKAE9JSMBODo6IwEGQAVRTQwGFwEGTEROTC4GKgEGKgYOAQYyBhMBGgEGR0VMBhkBBkQGFgEeAQY0QEAGPQFFIx85HSIhBAEMMxo/NTUGBAEGLgVQUDUFUVEPBhEBBiwFRwVQUU8rBU5QTwwFP00GIgEGSFAZBg4BBkxLEgYrAQYmBU02BhYBBigFSk4GGAEGOAYlAQY5BhYfBAEGR0pMHQVOGAZHH0wEAQZJRkodBU4YBi0xHgEGRU5CQC4GJkoRUAQBBkQ8QklKBjZJBksuBVEQBi84BAEGUUpMNAY4GiMiGA0hEwYEAQZEBi0kPCUXBkIEARoSFSUvKgY2BAEGTzEFTRcGJBdOBgQBBkUFTRcGHyYEAQZFOQYqPhgBQiszFwYyBAEGRkpBBjVKLS4jGAYhGCssRTY5MTIeKkMYEwYcKBYEAQYeSEsGIiEnOCoqBgQBBh9JRAYkISc4TjYqBic4KioGBAErLRYdGhgNIyMeIiIGBAEGR0ZKHQVOGAZNHgEGR0ZKHQVOGAZNHgEGR0AGMygBBjBJH0shBi40ARcJURczLSQzOzRKFUUpFwoaCBUqJgFAMEMhJRQGAU49N1E7MQgqBhEEAQZFBUYjHwVHSi4GGSU4KgYEAQZGBUIfBiAlMicqSQYEAS9ET1BPTAcgRwdITUYHMAc6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoOEA4WDhAODy9PGzIEAR8WARUdHAE4JB4mQxooCjwoChUIAScgCBsaDxoIBgFCJgEZBAEiJB4GEiYrBj0EARwSIyEgIB4YRyhLRxoIEwYBIQEuITsINgYBKUYGASguGAYBJzJBFxgGASQpBgEjLhgGASAjBgExHUQGASMrBgEwNhgGATg2BgEfNgYBIy4YBgEgJQYBICgGASIoBgExLgYBMh1GBgEgHwYBJCMGAScmBgEfKAYBJiUGASEgBgEiIQYBHzYGASMiBgEiJQYBIyIGASMiBgElJAYBJjEYBgEnMhgGASIgBgEXHwYBIwEdBAEeFxsmIB8NHC0qJSUuRhUIBisWBAEgEBYjSw0uEwYEASwQFjI/BjURBAEgDD0EASMXFiYVTSsYIChDHAo1SxwKCDgTDTETBgQBHhMWIRg9NRoIMBMnLxgNLBMGBAEkExYnGD1BGgg8Eyc1GA0yEwYEASIMQQQBIww7BAEgDxYjNBgnMRgNLhMGBAEfDxYiMhgnMBgNLRMGBAEmDDYBFiBLHCI1RhoPMhUIBisRBAEhDzYBQxgVARYgSBwiM0YaDzAVCCcxGAYpEQQBJhwWIC4YJxgiMxo/Gjo4HAozFQ8lFQgNHhMGBAEjExYgLhgnPw0mEwYEASEcExgmEj8yDyghMjsMCjoVCAYEASYUMCAGIQQBHhw0HBMYKCgoGg8aMz4WKTgXCkIVCAYEASccFiYwKxgmGipKHBFBFwoPOBUIDS8TBgQBMhcbChQmGT8ZGkEcCigXKiYTJlE3RhsOEwwcCgEVFw8VFwgYBhVKPAFQNyYXTwgvEwY5EQQBKRwWIjQqNScxGA0uEwYEAT0cFgEQJTUGAQ8WJhgGIUAGFiBABhYgQAYWIEAGFiBABhYBCyYYBiFABhYBDSYYBhMhHCYYBiRABgENJUAGFhMhHCYYBiRABgEXJhgGNkAGASs5KlE1DUkmNAYbLwYRBAE3LhZABAFJGxMpIiIjLhdKEUoKFQgYBgQBNktNHhUWKxMjOjFEIQ8rGicVHj4eGx1KFR1KDhMTHgwKLBomHBUKKR9AJyElCh8aDxoiJAoaCAYRBAFCIkooBAFCIkMoBAEGSwYiFxsSQxcbDUc3TAYEATIcHR8NJjEoBgQBNxUbQB4YMAY0BAFANRwtJCcYK00rIBgGOCAYBjI7Bko7Bh9QOwYmJh8fOw0pEwYEAQZNHwZCEzIaDyEjIxFDCg8IBhEEAR0pFgQBNhoWJhgoHT8PGT0VCAYPQg0/BgQBBjQyBUZINQUQBUMGShwbKikaKC4+HBoSCBkjJiguOUUVCCkYBiopFj4RBAE/PiQaMDMNMwYEATFBMTY/HgYhFB4TBi1CEQQBMUYBJCQfMzcNPVEvRwZCEQQBTRsbKDMaRxVBMz5EFR8bCBgGLzpAEQQBQiEfI0cLJSwkIEIpIicMISEhIwoaMAgYKBoqOxxPFwoIBjU6QxEEAUlHHCEfHkclITlEHB5PHhIIKBoqHCw9HkwZDAoSCCkaKggiHkAnICUKHx8hHwgYBjU1RhEEASIcPjEWJU0mMR4PLAgrJSouHRoIQz0TDSUmBgQBRDguSDEBTzxKUQQBLiQZLA0RBgQCATARICkoFyorEwIBNhMXASY4PAE6RQElNQ01BgE0DAQBNAEhAR8hGQQBIyQXBh0EASwxJAYaBAEqGCcPBjEkBiIEARUBJCZEAR89MBgNIQYEASc7LhYEAgFNPR1MMjsBSiUBPSQgATg6OiABHyEcHEc9PQIBNSckJB0sAgE9cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL2Fic3RyYWN0X3NjYW5uZXIuZGFydGRmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvc2Nhbm5lci9lcnJvcl90b2tlbi5kYXJ0maYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBkYXJ0X3NjYW5uZXIuZXJyb3JfdG9rZW47CgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29kZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VFbmNvZGluZywKICAgICAgICB0ZW1wbGF0ZUFzY2lpQ29udHJvbENoYXJhY3RlciwKICAgICAgICB0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllciwKICAgICAgICB0ZW1wbGF0ZU5vbkFzY2lpV2hpdGVzcGFjZSwKICAgICAgICB0ZW1wbGF0ZVVubWF0Y2hlZFRva2VuLAogICAgICAgIHRlbXBsYXRlVW5zdXBwb3J0ZWRPcGVyYXRvciwKICAgICAgICB0ZW1wbGF0ZVVudGVybWluYXRlZFN0cmluZzsKCmltcG9ydCAncmVjb3Zlci5kYXJ0JyBzaG93IGNsb3NlQnJhY2VGb3IsIGNsb3NlUXVvdGVGb3I7CgppbXBvcnQgJ3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbiwgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBzaG93IEJlZ2luVG9rZW4sIFNpbXBsZVRva2VuLCBUb2tlblR5cGU7CgpFcnJvclRva2VuIGJ1aWxkVW5leHBlY3RlZENoYXJhY3RlclRva2VuKGludCBjaGFyYWN0ZXIsIGludCBjaGFyT2Zmc2V0KSB7CiAgaWYgKGNoYXJhY3RlciA8IDB4MWYpIHsKICAgIHJldHVybiBuZXcgQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW4oY2hhcmFjdGVyLCBjaGFyT2Zmc2V0KTsKICB9CiAgc3dpdGNoIChjaGFyYWN0ZXIpIHsKICAgIGNhc2UgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOgogICAgICByZXR1cm4gbmV3IEVuY29kaW5nRXJyb3JUb2tlbihjaGFyT2Zmc2V0KTsKCiAgICAvLy8gU2VlIFtHZW5lcmFsIFB1bmN0dWF0aW9uXQogICAgLy8vIChodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTIwMDAucGRmKS4KICAgIGNhc2UgMHgwMEEwOiAvLyBOby1icmVhayBzcGFjZS4KICAgIGNhc2UgMHgxNjgwOiAvLyBPZ2hhbSBzcGFjZSBtYXJrLgogICAgY2FzZSAweDE4MEU6IC8vIE1vbmdvbGlhbiB2b3dlbCBzZXBhcmF0b3IuCiAgICBjYXNlIDB4MjAwMDogLy8gRW4gcXVhZC4KICAgIGNhc2UgMHgyMDAxOiAvLyBFbSBxdWFkLgogICAgY2FzZSAweDIwMDI6IC8vIEVuIHNwYWNlLgogICAgY2FzZSAweDIwMDM6IC8vIEVtIHNwYWNlLgogICAgY2FzZSAweDIwMDQ6IC8vIFRocmVlLXBlci1lbSBzcGFjZS4KICAgIGNhc2UgMHgyMDA1OiAvLyBGb3VyLXBlci1lbSBzcGFjZS4KICAgIGNhc2UgMHgyMDA2OiAvLyBTaXgtcGVyLWVtIHNwYWNlLgogICAgY2FzZSAweDIwMDc6IC8vIEZpZ3VyZSBzcGFjZS4KICAgIGNhc2UgMHgyMDA4OiAvLyBQdW5jdHVhdGlvbiBzcGFjZS4KICAgIGNhc2UgMHgyMDA5OiAvLyBUaGluIHNwYWNlLgogICAgY2FzZSAweDIwMEE6IC8vIEhhaXIgc3BhY2UuCiAgICBjYXNlIDB4MjAwQjogLy8gWmVybyB3aWR0aCBzcGFjZS4KICAgIGNhc2UgMHgyMDI4OiAvLyBMaW5lIHNlcGFyYXRvci4KICAgIGNhc2UgMHgyMDI5OiAvLyBQYXJhZ3JhcGggc2VwYXJhdG9yLgogICAgY2FzZSAweDIwMkY6IC8vIE5hcnJvdyBuby1icmVhayBzcGFjZS4KICAgIGNhc2UgMHgyMDVGOiAvLyBNZWRpdW0gbWF0aGVtYXRpY2FsIHNwYWNlLgogICAgY2FzZSAweDMwMDA6IC8vIElkZW9ncmFwaGljIHNwYWNlLgogICAgY2FzZSAweEZFRkY6IC8vIFplcm8gd2lkdGggbm8tYnJlYWsgc3BhY2UuCiAgICAgIHJldHVybiBuZXcgTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW4oY2hhcmFjdGVyLCBjaGFyT2Zmc2V0KTsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbmV3IE5vbkFzY2lpSWRlbnRpZmllclRva2VuKGNoYXJhY3RlciwgY2hhck9mZnNldCk7CiAgfQp9CgovLy8gQ29tbW9uIHN1cGVyY2xhc3MgZm9yIGFsbCBlcnJvciB0b2tlbnMuCi8vLwovLy8gSXQncyBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGVycm9yIHRvIGFjY2VzcyBbbGV4ZW1lXSBvZiBhbgovLy8gW0Vycm9yVG9rZW5dLgphYnN0cmFjdCBjbGFzcyBFcnJvclRva2VuIGV4dGVuZHMgU2ltcGxlVG9rZW4gewogIEVycm9yVG9rZW4oaW50IG9mZnNldCkgOiBzdXBlcihUb2tlblR5cGUuQkFEX0lOUFVULCBvZmZzZXQsIG51bGwpOwoKICAvLy8gVGhpcyBpcyBhIHRva2VuIHRoYXQgd3JhcHMgYXJvdW5kIGFuIGVycm9yIG1lc3NhZ2UuIFJldHVybiAxCiAgLy8vIGluc3RlYWQgb2YgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiAxOwoKICBTdHJpbmcgZ2V0IGxleGVtZSB7CiAgICBTdHJpbmcgZXJyb3JNc2cgPSBhc3NlcnRpb25NZXNzYWdlLm1lc3NhZ2U7CgogICAgLy8gQXR0ZW1wdCB0byBpbmNsdWRlIHRoZSBsb2NhdGlvbiB3aGljaCBpcyBjYWxsaW5nIHRoZSBwYXJzZXIKICAgIC8vIGluIGFuIGVmZm9ydCB0byBkZWJ1ZyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzc1MjgKICAgIFJlZ0V4cCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgnXiNbMC05XSogKlBhcnNlcicpOwogICAgTGlzdDxTdHJpbmc+IHRyYWNlTGluZXMgPSBTdGFja1RyYWNlLmN1cnJlbnQudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsKICAgIGZvciAoaW50IGluZGV4ID0gdHJhY2VMaW5lcy5sZW5ndGggLSAyOyBpbmRleCA+PSAwOyAtLWluZGV4KSB7CiAgICAgIFN0cmluZyBsaW5lID0gdHJhY2VMaW5lc1tpbmRleF07CiAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgocGF0dGVybikpIHsKICAgICAgICBlcnJvck1zZyA9ICckZXJyb3JNc2cgLSAke3RyYWNlTGluZXNbaW5kZXggKyAxXX0nOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgdGhyb3cgZXJyb3JNc2c7CiAgfQoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlOwoKICBDb2RlPGR5bmFtaWM+IGdldCBlcnJvckNvZGUgPT4gYXNzZXJ0aW9uTWVzc2FnZS5jb2RlOwoKICBpbnQgZ2V0IGNoYXJhY3RlciA9PiBudWxsOwoKICBTdHJpbmcgZ2V0IHN0YXJ0ID0+IG51bGw7CgogIGludCBnZXQgZW5kT2Zmc2V0ID0+IG51bGw7CgogIEJlZ2luVG9rZW4gZ2V0IGJlZ2luID0+IG51bGw7CgogIEBvdmVycmlkZQogIFRva2VuIGNvcHkoKSB7CiAgICB0aHJvdyAndW5zdXBwb3J0ZWQgb3BlcmF0aW9uJzsKICB9Cn0KCi8vLyBSZXByZXNlbnRzIGFuIGVuY29kaW5nIGVycm9yLgpjbGFzcyBFbmNvZGluZ0Vycm9yVG9rZW4gZXh0ZW5kcyBFcnJvclRva2VuIHsKICBFbmNvZGluZ0Vycm9yVG9rZW4oaW50IGNoYXJPZmZzZXQpIDogc3VwZXIoY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJFbmNvZGluZ0Vycm9yVG9rZW4oKSI7CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4gbWVzc2FnZUVuY29kaW5nOwp9CgovLy8gUmVwcmVzZW50cyBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIgb3V0c2lkZSBhIHN0cmluZyBvciBjb21tZW50LgpjbGFzcyBOb25Bc2NpaUlkZW50aWZpZXJUb2tlbiBleHRlbmRzIEVycm9yVG9rZW4gewogIGZpbmFsIGludCBjaGFyYWN0ZXI7CgogIE5vbkFzY2lpSWRlbnRpZmllclRva2VuKHRoaXMuY2hhcmFjdGVyLCBpbnQgY2hhck9mZnNldCkgOiBzdXBlcihjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIk5vbkFzY2lpSWRlbnRpZmllclRva2VuKCRjaGFyYWN0ZXIpIjsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PiB0ZW1wbGF0ZU5vbkFzY2lpSWRlbnRpZmllci53aXRoQXJndW1lbnRzKAogICAgICBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoW2NoYXJhY3Rlcl0pLCBjaGFyYWN0ZXIpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5vbi1BU0NJSSB3aGl0ZXNwYWNlIG91dHNpZGUgYSBzdHJpbmcgb3IgY29tbWVudC4KY2xhc3MgTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW4gZXh0ZW5kcyBFcnJvclRva2VuIHsKICBmaW5hbCBpbnQgY2hhcmFjdGVyOwoKICBOb25Bc2NpaVdoaXRlc3BhY2VUb2tlbih0aGlzLmNoYXJhY3RlciwgaW50IGNoYXJPZmZzZXQpIDogc3VwZXIoY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJOb25Bc2NpaVdoaXRlc3BhY2VUb2tlbigkY2hhcmFjdGVyKSI7CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4KICAgICAgdGVtcGxhdGVOb25Bc2NpaVdoaXRlc3BhY2Uud2l0aEFyZ3VtZW50cyhjaGFyYWN0ZXIpOwp9CgovLy8gUmVwcmVzZW50cyBhbiBBU0NJSSBjb250cm9sIGNoYXJhY3RlciBvdXRzaWRlIGEgc3RyaW5nIG9yIGNvbW1lbnQuCmNsYXNzIEFzY2lpQ29udHJvbENoYXJhY3RlclRva2VuIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgZmluYWwgaW50IGNoYXJhY3RlcjsKCiAgQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW4odGhpcy5jaGFyYWN0ZXIsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKGNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW4oJGNoYXJhY3RlcikiOwoKICBNZXNzYWdlIGdldCBhc3NlcnRpb25NZXNzYWdlID0+CiAgICAgIHRlbXBsYXRlQXNjaWlDb250cm9sQ2hhcmFjdGVyLndpdGhBcmd1bWVudHMoY2hhcmFjdGVyKTsKfQoKLy8vIERlbm90ZXMgYW4gb3BlcmF0b3IgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBEYXJ0IGxhbmd1YWdlLgpjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdG9yIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgVG9rZW4gdG9rZW47CgogIFVuc3VwcG9ydGVkT3BlcmF0b3IodGhpcy50b2tlbiwgaW50IGNoYXJPZmZzZXQpIDogc3VwZXIoY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4KICAgICAgdGVtcGxhdGVVbnN1cHBvcnRlZE9wZXJhdG9yLndpdGhBcmd1bWVudHModG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW5zdXBwb3J0ZWRPcGVyYXRvcigke3Rva2VuLmxleGVtZX0pIjsKfQoKLy8vIFJlcHJlc2VudHMgYW4gdW50ZXJtaW5hdGVkIHN0cmluZy4KY2xhc3MgVW50ZXJtaW5hdGVkU3RyaW5nIGV4dGVuZHMgRXJyb3JUb2tlbiB7CiAgZmluYWwgU3RyaW5nIHN0YXJ0OwogIGZpbmFsIGludCBlbmRPZmZzZXQ7CgogIFVudGVybWluYXRlZFN0cmluZyh0aGlzLnN0YXJ0LCBpbnQgY2hhck9mZnNldCwgdGhpcy5lbmRPZmZzZXQpCiAgICAgIDogc3VwZXIoY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJVbnRlcm1pbmF0ZWRTdHJpbmcoJHN0YXJ0KSI7CgogIGludCBnZXQgY2hhckNvdW50ID0+IGVuZE9mZnNldCAtIGNoYXJPZmZzZXQ7CgogIGludCBnZXQgbGVuZ3RoID0+IGNoYXJDb3VudDsKCiAgTWVzc2FnZSBnZXQgYXNzZXJ0aW9uTWVzc2FnZSA9PgogICAgICB0ZW1wbGF0ZVVudGVybWluYXRlZFN0cmluZy53aXRoQXJndW1lbnRzKHN0YXJ0LCBjbG9zZVF1b3RlRm9yKHN0YXJ0KSk7Cn0KCi8vLyBSZXByZXNlbnRzIGFuIHVudGVybWluYXRlZCB0b2tlbi4KY2xhc3MgVW50ZXJtaW5hdGVkVG9rZW4gZXh0ZW5kcyBFcnJvclRva2VuIHsKICBmaW5hbCBNZXNzYWdlIGFzc2VydGlvbk1lc3NhZ2U7CiAgZmluYWwgaW50IGVuZE9mZnNldDsKCiAgVW50ZXJtaW5hdGVkVG9rZW4odGhpcy5hc3NlcnRpb25NZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgdGhpcy5lbmRPZmZzZXQpCiAgICAgIDogc3VwZXIoY2hhck9mZnNldCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJVbnRlcm1pbmF0ZWRUb2tlbigke2Fzc2VydGlvbk1lc3NhZ2UuY29kZS5uYW1lfSkiOwoKICBpbnQgZ2V0IGNoYXJDb3VudCA9PiBlbmRPZmZzZXQgLSBjaGFyT2Zmc2V0Owp9CgovLy8gUmVwcmVzZW50cyBhbiBvcGVuIGJyYWNlIHdpdGhvdXQgYSBtYXRjaGluZyBjbG9zZSBicmFjZS4KLy8vCi8vLyBJbiB0aGlzIGNhc2UsIGJyYWNlIG1lYW5zIGFueSBvZiBgKGAsIGB7YCwgYFtgLCBhbmQgYDxgLCBwYXJlbnRoZXNpcywgY3VybHkKLy8vIGJyYWNlLCBzcXVhcmUgYnJhY2UsIGFuZCBhbmdsZSBicmFjZSwgcmVzcGVjdGl2ZWx5LgpjbGFzcyBVbm1hdGNoZWRUb2tlbiBleHRlbmRzIEVycm9yVG9rZW4gewogIGZpbmFsIEJlZ2luVG9rZW4gYmVnaW47CgogIFVubWF0Y2hlZFRva2VuKEJlZ2luVG9rZW4gYmVnaW4pCiAgICAgIDogdGhpcy5iZWdpbiA9IGJlZ2luLAogICAgICAgIHN1cGVyKGJlZ2luLmNoYXJPZmZzZXQpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW5tYXRjaGVkVG9rZW4oJHtiZWdpbi5sZXhlbWV9KSI7CgogIE1lc3NhZ2UgZ2V0IGFzc2VydGlvbk1lc3NhZ2UgPT4KICAgICAgdGVtcGxhdGVVbm1hdGNoZWRUb2tlbi53aXRoQXJndW1lbnRzKGNsb3NlQnJhY2VGb3IoYmVnaW4ubGV4ZW1lKSwgYmVnaW4pOwp9CoDbAE5OPAEiASAJDhEZJyQkICUkATkBPwE9AUoaQgQXJjEBIjckJi8dHR4eKCcmIicgICYkKSsvJy9BAQ1BBAIBLARFEjBFAUM+DBcBFjABQ0s1SUMnJjsPCAYBFAQBIAE4AR0BHAEdASABDBEjBAIBIi46AS8BMwIBQjMXAU8BPgFMOQIBQzMXAU8BPgEiOwIBRzYXAT0bAUEBIj4CAUQvDwFHAQwiOAEMPwIBJy4WFwFBGwE1AS8BHwEiTQIBJi0iFwFLGwFLAS8CAT0EUDgqGgEjHCEBOgEiUAIBOHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9lcnJvcl90b2tlbi5kYXJ0XGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbGRlci5kYXJ0nLMvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bnN1cHBvcnRlZDsKCmFic3RyYWN0IGNsYXNzIEJ1aWxkZXIgewogIC8vLyBVc2VkIHdoZW4gbXVsdGlwbGUgdGhpbmdzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgZGVjbGFyZWQgd2l0aGluIHRoZSBzYW1lCiAgLy8vIHBhcmVudC4gT25seSB1c2VkIGZvciB0b3AtbGV2ZWwgYW5kIGNsYXNzLW1lbWJlciBkZWNsYXJhdGlvbnMsIG5vdCBmb3IKICAvLy8gYmxvY2sgc2NvcGVzLgogIEJ1aWxkZXIgbmV4dDsKCiAgQnVpbGRlciBnZXQgcGFyZW50OwoKICBVcmkgZ2V0IGZpbGVVcmk7CgogIGludCBnZXQgY2hhck9mZnNldDsKCiAgQnVpbGRlciBnZXQgb3JpZ2luOwoKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzOwoKICBib29sIGdldCBoYXNQcm9ibGVtOwoKICBib29sIGdldCBpc0NvbnN0OwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yOwoKICBib29sIGdldCBpc0ZhY3Rvcnk7CgogIGJvb2wgZ2V0IGlzRmllbGQ7CgogIGJvb2wgZ2V0IGlzRmluYWw7CgogIGJvb2wgZ2V0IGlzR2V0dGVyOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBidWlsZGVyIGlzIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBCYCBpbjoKICAvLy8KICAvLy8gICAgY2xhc3MgQSB7fQogIC8vLyAgICBleHRlbnNpb24gQiBvbiBBIHt9CiAgLy8vCiAgYm9vbCBnZXQgaXNFeHRlbnNpb247CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJ1aWxkZXIgaXMgYSBtZW1iZXIgb2YgYSBjbGFzcywgbWl4aW4sIG9yIGV4dGVuc2lvbgogIC8vLyBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBBLmNvbnN0cnVjdG9yYCwgYG1ldGhvZDFhYCwgYG1ldGhvZDFiYCwgYG1ldGhvZDJhYCwKICAvLy8gYG1ldGhvZDJiYCwgYG1ldGhvZDNhYCwgYW5kIGBtZXRob2QzYmAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHsKICAvLy8gICAgICAgQS5jb25zdHJ1Y3RvcigpOwogIC8vLyAgICAgICBtZXRob2QxYSgpIHt9CiAgLy8vICAgICAgIHN0YXRpYyBtZXRob2QxYigpIHt9CiAgLy8vICAgICB9CiAgLy8vICAgICBtaXhpbiBCIHsKICAvLy8gICAgICAgbWV0aG9kMmEoKSB7fQogIC8vLyAgICAgICBzdGF0aWMgbWV0aG9kMmIoKSB7fQogIC8vLyAgICAgfQogIC8vLyAgICAgZXh0ZW5kcyBDIG9uIEEgewogIC8vLyAgICAgICBtZXRob2QzYSgpIHt9CiAgLy8vICAgICAgIHN0YXRpYyBtZXRob2QzYigpIHt9CiAgLy8vICAgICB9CiAgLy8vCiAgYm9vbCBnZXQgaXNEZWNsYXJhdGlvbk1lbWJlcjsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYnVpbGRlciBpcyBhIG1lbWJlciBvZiBhIGNsYXNzIG9yIG1peGluCiAgLy8vIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYEEuY29uc3RydWN0b3JgLCBgbWV0aG9kMWFgLCBgbWV0aG9kMWJgLCBgbWV0aG9kMmFgIGFuZAogIC8vLyBgbWV0aG9kMmJgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7CiAgLy8vICAgICAgIEEuY29uc3RydWN0b3IoKTsKICAvLy8gICAgICAgbWV0aG9kMWEoKSB7fQogIC8vLyAgICAgICBzdGF0aWMgbWV0aG9kMWIoKSB7fQogIC8vLyAgICAgfQogIC8vLyAgICAgbWl4aW4gQiB7CiAgLy8vICAgICAgIG1ldGhvZDJhKCkge30KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDJiKCkge30KICAvLy8gICAgIH0KICAvLy8gICAgIGV4dGVuZHMgQyBvbiBBIHsKICAvLy8gICAgICAgbWV0aG9kM2EoKSB7fSAgICAgICAgLy8gTm90IGEgY2xhc3MgbWVtYmVyLgogIC8vLyAgICAgICBzdGF0aWMgbWV0aG9kM2IoKSB7fSAvLyBOb3QgYSBjbGFzcyBtZW1iZXIuCiAgLy8vICAgICB9CiAgLy8vCiAgYm9vbCBnZXQgaXNDbGFzc01lbWJlcjsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYnVpbGRlciBpcyBhIG1lbWJlciBvZiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgbWV0aG9kM2FgIGFuZCBgbWV0aG9kM2JgIGluOgogIC8vLwogIC8vLyAgICAgY2xhc3MgQSB7CiAgLy8vICAgICAgIEEuY29uc3RydWN0b3IoKTsgICAgIC8vIE5vdCBhbiBleHRlbnNpb24gbWVtYmVyLgogIC8vLyAgICAgICBtZXRob2QxYSgpIHt9ICAgICAgICAvLyBOb3QgYW4gZXh0ZW5zaW9uIG1lbWJlci4KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDFiKCkge30gLy8gTm90IGFuIGV4dGVuc2lvbiBtZW1iZXIuCiAgLy8vICAgICB9CiAgLy8vICAgICBtaXhpbiBCIHsKICAvLy8gICAgICAgbWV0aG9kMmEoKSB7fSAgICAgICAgLy8gTm90IGFuIGV4dGVuc2lvbiBtZW1iZXIuCiAgLy8vICAgICAgIHN0YXRpYyBtZXRob2QyYigpIHt9IC8vIE5vdCBhbiBleHRlbnNpb24gbWVtYmVyLgogIC8vLyAgICAgfQogIC8vLyAgICAgZXh0ZW5kcyBDIG9uIEEgewogIC8vLyAgICAgICBtZXRob2QzYSgpIHt9CiAgLy8vICAgICAgIHN0YXRpYyBtZXRob2QzYigpIHt9CiAgLy8vICAgICB9CiAgLy8vCiAgYm9vbCBnZXQgaXNFeHRlbnNpb25NZW1iZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJ1aWxkZXIgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIG9mIGEgY2xhc3MsIG1peGluLCBvcgogIC8vLyBleHRlbnNpb24gZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBgbWV0aG9kMWFgLCBgbWV0aG9kMmFgLCBhbmQgYG1ldGhvZDNhYCBpbjoKICAvLy8KICAvLy8gICAgIGNsYXNzIEEgewogIC8vLyAgICAgICBBLmNvbnN0cnVjdG9yKCk7ICAgICAvLyBOb3QgYSBkZWNsYXJhdGlvbiBpbnN0YW5jZSBtZW1iZXIuCiAgLy8vICAgICAgIG1ldGhvZDFhKCkge30KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDFiKCkge30gLy8gTm90IGEgZGVjbGFyYXRpb24gaW5zdGFuY2UgbWVtYmVyLgogIC8vLyAgICAgfQogIC8vLyAgICAgbWl4aW4gQiB7CiAgLy8vICAgICAgIG1ldGhvZDJhKCkge30KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDJiKCkge30gLy8gTm90IGEgZGVjbGFyYXRpb24gaW5zdGFuY2UgbWVtYmVyLgogIC8vLyAgICAgfQogIC8vLyAgICAgZXh0ZW5kcyBDIG9uIEEgewogIC8vLyAgICAgICBtZXRob2QzYSgpIHt9CiAgLy8vICAgICAgIHN0YXRpYyBtZXRob2QzYigpIHt9IC8vIE5vdCBhIGRlY2xhcmF0aW9uIGluc3RhbmNlIG1lbWJlci4KICAvLy8gICAgIH0KICAvLy8KICBib29sIGdldCBpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJ1aWxkZXIgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIG9mIGEgY2xhc3Mgb3IgbWl4aW4KICAvLy8gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgYG1ldGhvZDFhYCBhbmQgYG1ldGhvZDJhYCBpbjoKICAvLy8KICAvLy8gICAgIGNsYXNzIEEgewogIC8vLyAgICAgICBBLmNvbnN0cnVjdG9yKCk7ICAgICAvLyBOb3QgYSBjbGFzcyBpbnN0YW5jZSBtZW1iZXIuCiAgLy8vICAgICAgIG1ldGhvZDFhKCkge30KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDFiKCkge30gLy8gTm90IGEgY2xhc3MgaW5zdGFuY2UgbWVtYmVyLgogIC8vLyAgICAgfQogIC8vLyAgICAgbWl4aW4gQiB7CiAgLy8vICAgICAgIG1ldGhvZDJhKCkge30KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDJiKCkge30gLy8gTm90IGEgY2xhc3MgaW5zdGFuY2UgbWVtYmVyLgogIC8vLyAgICAgfQogIC8vLyAgICAgZXh0ZW5kcyBDIG9uIEEgewogIC8vLyAgICAgICBtZXRob2QzYSgpIHt9ICAgICAgICAvLyBOb3QgYSBjbGFzcyBpbnN0YW5jZSBtZW1iZXIuCiAgLy8vICAgICAgIHN0YXRpYyBtZXRob2QzYigpIHt9IC8vIE5vdCBhIGNsYXNzIGluc3RhbmNlIG1lbWJlci4KICAvLy8gICAgIH0KICAvLy8KICBib29sIGdldCBpc0NsYXNzSW5zdGFuY2VNZW1iZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJ1aWxkZXIgaXMgYW4gaW5zdGFuY2UgbWVtYmVyIG9mIGFuIGV4dGVuc2lvbgogIC8vLyBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlIGBtZXRob2QzYWAgaW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBBIHsKICAvLy8gICAgICAgQS5jb25zdHJ1Y3RvcigpOyAgICAgLy8gTm90IGFuIGV4dGVuc2lvbiBpbnN0YW5jZSBtZW1iZXIuCiAgLy8vICAgICAgIG1ldGhvZDFhKCkge30gICAgICAgIC8vIE5vdCBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWVtYmVyLgogIC8vLyAgICAgICBzdGF0aWMgbWV0aG9kMWIoKSB7fSAvLyBOb3QgYW4gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlci4KICAvLy8gICAgIH0KICAvLy8gICAgIG1peGluIEIgewogIC8vLyAgICAgICBtZXRob2QyYSgpIHt9ICAgICAgICAvLyBOb3QgYW4gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlci4KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDJiKCkge30gLy8gTm90IGFuIGV4dGVuc2lvbiBpbnN0YW5jZSBtZW1iZXIuCiAgLy8vICAgICB9CiAgLy8vICAgICBleHRlbmRzIEMgb24gQSB7CiAgLy8vICAgICAgIG1ldGhvZDNhKCkge30KICAvLy8gICAgICAgc3RhdGljIG1ldGhvZDNiKCkge30gLy8gTm90IGFuIGV4dGVuc2lvbiBpbnN0YW5jZSBtZW1iZXIuCiAgLy8vICAgICB9CiAgLy8vCiAgYm9vbCBnZXQgaXNFeHRlbnNpb25JbnN0YW5jZU1lbWJlcjsKCiAgYm9vbCBnZXQgaXNMb2NhbDsKCiAgYm9vbCBnZXQgaXNQYXRjaDsKCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kOwoKICBib29sIGdldCBpc09wZXJhdG9yOwoKICBib29sIGdldCBpc1NldHRlcjsKCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIGJvb2wgZ2V0IGlzU3ludGhldGljOwoKICBib29sIGdldCBpc1RvcExldmVsOwoKICBib29sIGdldCBpc1R5cGVEZWNsYXJhdGlvbjsKCiAgYm9vbCBnZXQgaXNUeXBlVmFyaWFibGU7CgogIC8vLyBBcHBsaWVzIFtwYXRjaF0gdG8gdGhpcyBkZWNsYXJhdGlvbi4KICB2b2lkIGFwcGx5UGF0Y2goQnVpbGRlciBwYXRjaCk7CgogIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGF0Y2hlcyB0aGF0IHdhcyBmaW5pc2hlZC4KICBpbnQgZmluaXNoUGF0Y2goKTsKCiAgLy8vIFJlc29sdmUgY29uc3RydWN0b3JzIChsb29rdXAgbmFtZXMgaW4gc2NvcGUpIHJlY29yZGVkIGluIHRoaXMgYnVpbGRlciBhbmQKICAvLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgY29uc3RydWN0b3JzIHJlc29sdmVkLgogIGludCByZXNvbHZlQ29uc3RydWN0b3JzKGNvdmFyaWFudCBCdWlsZGVyIHBhcmVudCk7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgYnVpbGRlciBpcyBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIHdpdGggdGhlIHNhbWUKICAvLy8gbmFtZS4gVGhpcyBpcyBgZmFsc2VgIGZvciB0aGUgYnVpbGRlciBmaXJzdCBkZWNsYXJlZCBhbW9uZ3N0IGR1cGxpY2F0ZXMuCiAgYm9vbCBnZXQgaXNEdXBsaWNhdGU7Cn0KCmFic3RyYWN0IGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQnVpbGRlciB7CiAgQG92ZXJyaWRlCiAgQnVpbGRlciBuZXh0OwoKICBCdWlsZGVySW1wbCgpOwoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIGdldCBvcmlnaW4gPT4gdGhpczsKCiAgYm9vbCBnZXQgaGFzUHJvYmxlbSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGYWN0b3J5ID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpbmFsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dldHRlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeHRlbnNpb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRGVjbGFyYXRpb25NZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2xhc3NNZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXh0ZW5zaW9uTWVtYmVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQ2xhc3NJbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeHRlbnNpb25JbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNQYXRjaCA9PiB0aGlzICE9IG9yaWdpbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc09wZXJhdG9yID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldHRlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1R5cGVEZWNsYXJhdGlvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUeXBlVmFyaWFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaChCdWlsZGVyIHBhdGNoKSB7CiAgICB1bnN1cHBvcnRlZCgiJHtydW50aW1lVHlwZX0uYXBwbHlQYXRjaCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFBhdGNoKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm4gMDsKICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5maW5pc2hQYXRjaCIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgcmV0dXJuIDA7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgcmVzb2x2ZUNvbnN0cnVjdG9ycyhjb3ZhcmlhbnQgQnVpbGRlciBwYXJlbnQpID0+IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRHVwbGljYXRlID0+IG5leHQgIT0gbnVsbDsKfQqBNQBOTjwBGwEsARlQTRQQARYBEwEWARYBIAEXARQBGgEWARQBFAEVAUIGGwYUHQYYAVETBkgxBhQdGiEMFBohDBsaIQwGIAFFEwZLFQYUHRohDBQaIQwbODgMBhoBTgYxBhQ9PT0MFD09DBsaIQwGHgFRHQY+BhRHGkcMFBpHDBsaRwwGKAFPHQYxBhRBGkEMFBpBDBtBQQwGIgFLEwYiBhRGRkYMFEZGDBsaRgwGJgEUARQBHAEXARUBFQEYARcBHgEbASsiATcVAVAyNQFMTxgCATAMEAERAQweASABDB0BDCMBDB8BDB0BDB0BDB4BDCEBDCkBDCMBDCcBDDEBDCsBDC8BDB0BDCYBDCUBDCABDB4BDB4BDCEBDCABDCcBDCQBDCNDBAEMFhxEDgQBDDoBDCgCATBwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9idWlsZGVyLmRhcnRiZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnTAAQg9Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY2xhc3NfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEFzRXhwcmVzc2lvbiwKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBOYW1lLAogICAgICAgIE51bGxhYmlsaXR5LAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yLAogICAgICAgIFJldHVyblN0YXRlbWVudCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVGhpc0V4cHJlc3Npb24sCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhbmNlLAogICAgICAgIFZvaWRUeXBlLAogICAgICAgIGdldEFzVHlwZUFyZ3VtZW50czsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnQnCiAgICBzaG93CiAgICAgICAgVHlwZUFyZ3VtZW50SXNzdWUsCiAgICAgICAgY29tcHV0ZVZhcmlhbmNlLAogICAgICAgIGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMsCiAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvbGVnYWN5X2VyYXN1cmUuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RleHQvdGV4dF9zZXJpYWxpemF0aW9uX3ZlcmlmaWVyLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb24sIHN1YnN0aXR1dGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcKICAgIHNob3cgU3VidHlwZUNoZWNrTW9kZSwgVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICcuLi8uLi9iYXNlL2NvbW1vbi5kYXJ0JzsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX21lbWJlcl9idWlsZGVyLmRhcnQnIHNob3cgRGlsbE1lbWJlckJ1aWxkZXI7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnOwoKaW1wb3J0ICcuLi9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlcy5kYXJ0JyBzaG93IFR5cGVzOwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JzsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcgc2hvdyBub1N1Y2hNZXRob2ROYW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbSwgdW5oYW5kbGVkLCB1bmltcGxlbWVudGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZTsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdkZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2ZpZWxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnZnVuY3Rpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbWV0YWRhdGFfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICduYW1lZF90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbmV2ZXJfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAncHJvY2VkdXJlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3ZvaWRfdHlwZV9idWlsZGVyLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgQ2xhc3NCdWlsZGVyIGltcGxlbWVudHMgRGVjbGFyYXRpb25CdWlsZGVyIHsKICAvLy8gVGhlIHR5cGUgdmFyaWFibGVzIGRlY2xhcmVkIG9uIGEgY2xhc3MsIGV4dGVuc2lvbiBvciBtaXhpbiBkZWNsYXJhdGlvbi4KICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CgogIC8vLyBUaGUgdHlwZSBpbiB0aGUgYGV4dGVuZHNgIGNsYXVzZSBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBDdXJyZW50bHkgdGhpcyBhbHNvIGhvbGRzIHRoZSBzeW50aGVzaXplZCBzdXBlciBjbGFzcyBmb3IgYSBtaXhpbgogIC8vLyBkZWNsYXJhdGlvbi4KICBUeXBlQnVpbGRlciBzdXBlcnR5cGU7CgogIC8vLyBUaGUgdHlwZSBpbiB0aGUgYGltcGxlbWVudHNgIGNsYXVzZSBvZiBhIGNsYXNzIG9yIG1peGluIGRlY2xhcmF0aW9uLgogIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXM7CgogIC8vLyBUaGUgdHlwZXMgaW4gdGhlIGBvbmAgY2xhdXNlIG9mIGFuIGV4dGVuc2lvbiBvciBtaXhpbiBkZWNsYXJhdGlvbi4KICBMaXN0PFR5cGVCdWlsZGVyPiBvblR5cGVzOwoKICBDb25zdHJ1Y3RvclNjb3BlIGdldCBjb25zdHJ1Y3RvcnM7CgogIENvbnN0cnVjdG9yU2NvcGVCdWlsZGVyIGdldCBjb25zdHJ1Y3RvclNjb3BlQnVpbGRlcjsKCiAgTWFwPFN0cmluZywgQ29uc3RydWN0b3JSZWRpcmVjdGlvbj4gcmVkaXJlY3RpbmdDb25zdHJ1Y3RvcnM7CgogIENsYXNzQnVpbGRlciBhY3R1YWxPcmlnaW47CgogIENsYXNzQnVpbGRlciBwYXRjaEZvclRlc3Rpbmc7CgogIGJvb2wgZ2V0IGlzQWJzdHJhY3Q7CgogIGJvb2wgZ2V0IGhhc0NvbnN0Q29uc3RydWN0b3I7CgogIGJvb2wgZ2V0IGlzTWl4aW47CgogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbjsKCiAgYm9vbCBnZXQgaXNBbm9ueW1vdXNNaXhpbkFwcGxpY2F0aW9uOwoKICBUeXBlQnVpbGRlciBnZXQgbWl4ZWRJblR5cGU7CgogIHZvaWQgc2V0IG1peGVkSW5UeXBlKFR5cGVCdWlsZGVyIG1peGluKTsKCiAgTGlzdDxDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI+IGdldCBjb25zdHJ1Y3RvclJlZmVyZW5jZXM7CgogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcyk7CgogIC8vLyBSZWdpc3RlcnMgYSBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiBmb3IgdGhpcyBjbGFzcyBhbmQgcmV0dXJucyB0cnVlIGlmCiAgLy8vIHRoaXMgcmVkaXJlY3Rpb24gZ2l2ZXMgcmlzZSB0byBhIGN5Y2xlIHRoYXQgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIGJlZm9yZS4KICBib29sIGNoZWNrQ29uc3RydWN0b3JDeWNsaWMoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCk7CgogIE1lbWJlckJ1aWxkZXIgZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KAogICAgICBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGFjY2Vzc2luZ0xpYnJhcnkpOwoKICB2b2lkIGZvckVhY2godm9pZCBmKFN0cmluZyBuYW1lLCBCdWlsZGVyIGJ1aWxkZXIpKTsKCiAgLy8vIEZpbmQgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGlzIGNsYXNzIHdpdGggW25hbWVdLiBUaGlzIG1ldGhvZCBpc24ndAogIC8vLyBzdWl0YWJsZSBmb3Igc2NvcGUgbG9va3VwcyBhcyBpdCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBuYW1lIGlzbid0CiAgLy8vIGRlY2xhcmVkLiBUaGUgW3Njb3BlXSBzaG91bGQgYmUgdXNlZCBmb3IgdGhhdC4gVGhpcyBtZXRob2QgaXMgdXNlZCB0bwogIC8vLyBmaW5kIGEgbWVtYmVyIHRoYXQgaXMga25vd24gdG8gZXhpc3QgYW5kIGl0IHdpbGwgcGljayB0aGUgZmlyc3QKICAvLy8gZGVjbGFyYXRpb24gaWYgdGhlIG5hbWUgaXMgYW1iaWd1b3VzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBtZXRob2QgaXMgY29udmVuaWVudCBmb3IgdXNlIHdoZW4gYnVpbGRpbmcgc3ludGhldGljCiAgLy8vIG1lbWJlcnMsIHN1Y2ggYXMgdGhvc2Ugb2YgYW4gZW51bS4KICBNZW1iZXJCdWlsZGVyIGZpcnN0TWVtYmVyTmFtZWQoU3RyaW5nIG5hbWUpOwoKICAvLy8gVGhlIFtDbGFzc10gYnVpbHQgYnkgdGhpcyBidWlsZGVyLgogIC8vLwogIC8vLyBGb3IgYSBwYXRjaCBjbGFzcyB0aGUgb3JpZ2luIGNsYXNzIGlzIHJldHVybmVkLgogIENsYXNzIGdldCBjbHM7CgogIEBvdmVycmlkZQogIENsYXNzQnVpbGRlciBnZXQgb3JpZ2luOwoKICBDbGFzcyBnZXQgYWN0dWFsQ2xzOwoKICBib29sIGlzTnVsbENsYXNzOwoKICBJbnRlcmZhY2VUeXBlIGdldCBsZWdhY3lSYXdUeXBlOwoKICBJbnRlcmZhY2VUeXBlIGdldCBudWxsYWJsZVJhd1R5cGU7CgogIEludGVyZmFjZVR5cGUgZ2V0IG5vbk51bGxhYmxlUmF3VHlwZTsKCiAgSW50ZXJmYWNlVHlwZSByYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KTsKCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpOwoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKTsKCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cyk7CgogIHZvaWQgY2hlY2tTdXBlcnR5cGVzKENvcmVUeXBlcyBjb3JlVHlwZXMpOwoKICB2b2lkIGNoZWNrQm91bmRzSW5TdXBlcnR5cGUoCiAgICAgIFN1cGVydHlwZSBzdXBlcnR5cGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpOwoKICB2b2lkIGNoZWNrVHlwZXNJbk91dGxpbmUoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCk7CgogIHZvaWQgaGFuZGxlU2VlbkNvdmFyaWFudCgKICAgICAgVHlwZXMgdHlwZXMsCiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciwKICAgICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSk7CgogIHZvaWQgY2hlY2tPdmVycmlkZSgKICAgICAgVHlwZXMgdHlwZXMsCiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciwKICAgICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSwKICAgICAge2Jvb2wgaXNJbnRlcmZhY2VDaGVjayA9IGZhbHNlfSk7CgogIGJvb2wgaGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QoCiAgICAgIENsYXNzIGtsYXNzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIENsYXNzIG9iamVjdENsYXNzKTsKCiAgLy8vIFJldHVybnMgd2hldGhlciBhIGNvdmFyaWFudCBwYXJhbWV0ZXIgd2FzIHNlZW4gYW5kIG1vcmUgbWV0aG9kcyB0aHVzIGhhdmUKICAvLy8gdG8gYmUgY2hlY2tlZC4KICBib29sIGNoZWNrTWV0aG9kT3ZlcnJpZGUoVHlwZXMgdHlwZXMsIFByb2NlZHVyZSBkZWNsYXJlZE1lbWJlciwKICAgICAgUHJvY2VkdXJlIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc0ludGVyZmFjZUNoZWNrKTsKCiAgdm9pZCBjaGVja0dldHRlck92ZXJyaWRlKFR5cGVzIHR5cGVzLCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNJbnRlcmZhY2VDaGVjayk7CgogIC8vLyBSZXR1cm5zIHdoZXRoZXIgYSBjb3ZhcmlhbnQgcGFyYW1ldGVyIHdhcyBzZWVuIGFuZCBtb3JlIG1ldGhvZHMgdGh1cyBoYXZlCiAgLy8vIHRvIGJlIGNoZWNrZWQuCiAgYm9vbCBjaGVja1NldHRlck92ZXJyaWRlKFR5cGVzIHR5cGVzLCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNJbnRlcmZhY2VDaGVjayk7CgogIC8vIFdoZW4gdGhlIG92ZXJyaWRpbmcgbWVtYmVyIGlzIGluaGVyaXRlZCwgcmVwb3J0IHRoZSBjbGFzcyBjb250YWluaW5nCiAgLy8gdGhlIGNvbmZsaWN0IGFzIHRoZSBtYWluIGVycm9yLgogIHZvaWQgcmVwb3J0SW52YWxpZE92ZXJyaWRlKGJvb2wgaXNJbnRlcmZhY2VDaGVjaywgTWVtYmVyIGRlY2xhcmVkTWVtYmVyLAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBmaWxlT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwoKICB2b2lkIGNoZWNrTWl4aW5BcHBsaWNhdGlvbihDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIENvcmVUeXBlcyBjb3JlVHlwZXMpOwoKICAvLyBDb21wdXRlcyB0aGUgZnVuY3Rpb24gdHlwZSBvZiBhIGdpdmVuIHJlZGlyZWN0aW9uIHRhcmdldC4gUmV0dXJucyBbbnVsbF0gaWYKICAvLyB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IGNvdWxkIG5vdCBiZSBjb21wdXRlZC4KICBGdW5jdGlvblR5cGUgY29tcHV0ZVJlZGlyZWN0ZWVUeXBlKAogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyIGZhY3RvcnksIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpOwoKICBTdHJpbmcgY29tcHV0ZVJlZGlyZWN0ZWVOYW1lKENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldCk7CgogIHZvaWQgY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcnkoCiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIgZmFjdG9yeSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCk7CgogIHZvaWQgY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcmllcyhUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KTsKCiAgLy8vIFJldHVybnMgYSBtYXAgd2hpY2ggbWFwcyB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgW3N1cGVyY2xhc3NdIHRvIHRoZWlyCiAgLy8vIHJlc3BlY3RpdmUgdmFsdWVzIGFzIGRlZmluZWQgYnkgdGhlIHN1cGVyY2xhc3MgY2xhdXNlIG9mIHRoaXMgY2xhc3MgKGFuZAogIC8vLyBpdHMgc3VwZXJjbGFzc2VzKS4KICAvLy8KICAvLy8gSXQncyBhc3N1bWVkIHRoYXQgW3N1cGVyY2xhc3NdIGlzIGEgc3VwZXJjbGFzcyBvZiB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW46CiAgLy8vCiAgLy8vICAgICBjbGFzcyBCb3g8VD4ge30KICAvLy8gICAgIGNsYXNzIEJlYXRCb3ggZXh0ZW5kcyBCb3g8QmVhdD4ge30KICAvLy8gICAgIGNsYXNzIEJlYXQge30KICAvLy8KICAvLy8gV2UgaGF2ZToKICAvLy8KICAvLy8gICAgIFtbQmVhdEJveF1dLmdldFN1YnN0aXR1dGlvbk1hcChbW0JveF1dKSAtPiB7W1tCb3g6OlRdXTogQmVhdF1dfS4KICAvLy8KICAvLy8gSXQncyBhbiBlcnJvciBpZiBbc3VwZXJjbGFzc10gaXNuJ3QgYSBzdXBlcmNsYXNzLgogIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gZ2V0U3Vic3RpdHV0aW9uTWFwKENsYXNzIHN1cGVyY2xhc3MpOwoKICAvLy8gTG9va3MgdXAgdGhlIG1lbWJlciBieSBbbmFtZV0gb24gdGhlIGNsYXNzIGJ1aWx0IGJ5IHRoaXMgY2xhc3MgYnVpbGRlci4KICAvLy8KICAvLy8gSWYgW2lzU2V0dGVyXSBpcyBgZmFsc2VgLCBvbmx5IGZpZWxkcywgbWV0aG9kcywgYW5kIGdldHRlcnMgd2l0aCB0aGF0IG5hbWUKICAvLy8gd2lsbCBiZSBmb3VuZC4gIElmIFtpc1NldHRlcl0gaXMgYHRydWVgLCBvbmx5IG5vbi1maW5hbCBmaWVsZHMgYW5kIHNldHRlcnMKICAvLy8gd2lsbCBiZSBmb3VuZC4KICAvLy8KICAvLy8gSWYgW2lzU3VwZXJdIGlzIGBmYWxzZWAsIHRoZSBtZW1iZXIgaXMgZm91bmQgYW1vbmcgdGhlIGludGVyZmFjZSBtZW1iZXJzCiAgLy8vIHRoZSBjbGFzcyBidWlsdCBieSB0aGlzIGNsYXNzIGJ1aWxkZXIuIElmIFtpc1N1cGVyXSBpcyBgdHJ1ZWAsIHRoZSBtZW1iZXIKICAvLy8gaXMgZm91bmQgYW1vbmcgdGhlIGNsYXNzIG1lbWJlcnMgb2YgdGhlIHN1cGVyY2xhc3MuCiAgLy8vCiAgLy8vIElmIHRoaXMgY2xhc3MgYnVpbGRlciBpcyBhIHBhdGNoLCBpbnRlcmZhY2UgbWVtYmVycyBkZWNsYXJlZCBpbiB0aGlzCiAgLy8vIHBhdGNoIGFyZSBzZWFyY2hlZCBiZWZvcmUgc2VhcmNoaW5nIHRoZSBpbnRlcmZhY2UgbWVtYmVycyBpbiB0aGUgb3JpZ2luCiAgLy8vIGNsYXNzLgogIE1lbWJlciBsb29rdXBJbnN0YW5jZU1lbWJlcihDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIE5hbWUgbmFtZSwKICAgICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlLCBib29sIGlzU3VwZXI6IGZhbHNlfSk7CgogIC8vLyBMb29rcyB1cCB0aGUgY29uc3RydWN0b3IgYnkgW25hbWVdIG9uIHRoZSB0aGUgY2xhc3MgYnVpbHQgYnkgdGhpcyBjbGFzcwogIC8vLyBidWlsZGVyLgogIC8vLwogIC8vLyBJZiBbaXNTdXBlcl0gaXMgYHRydWVgLCBjb25zdHJ1Y3RvcnMgaW4gdGhlIHN1cGVyY2xhc3MgYXJlIHNlYXJjaGVkLgogIENvbnN0cnVjdG9yIGxvb2t1cENvbnN0cnVjdG9yKE5hbWUgbmFtZSwge2Jvb2wgaXNTdXBlcjogZmFsc2V9KTsKfQoKYWJzdHJhY3QgY2xhc3MgQ2xhc3NCdWlsZGVySW1wbCBleHRlbmRzIERlY2xhcmF0aW9uQnVpbGRlckltcGwKICAgIGltcGxlbWVudHMgQ2xhc3NCdWlsZGVyIHsKICBAb3ZlcnJpZGUKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CgogIEBvdmVycmlkZQogIFR5cGVCdWlsZGVyIHN1cGVydHlwZTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlczsKCiAgQG92ZXJyaWRlCiAgTGlzdDxUeXBlQnVpbGRlcj4gb25UeXBlczsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQ29uc3RydWN0b3JTY29wZSBjb25zdHJ1Y3RvcnM7CgogIEBvdmVycmlkZQogIGZpbmFsIENvbnN0cnVjdG9yU2NvcGVCdWlsZGVyIGNvbnN0cnVjdG9yU2NvcGVCdWlsZGVyOwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBDb25zdHJ1Y3RvclJlZGlyZWN0aW9uPiByZWRpcmVjdGluZ0NvbnN0cnVjdG9yczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NCdWlsZGVyIGFjdHVhbE9yaWdpbjsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NCdWlsZGVyIHBhdGNoRm9yVGVzdGluZzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc051bGxDbGFzcyA9IGZhbHNlOwoKICBJbnRlcmZhY2VUeXBlIF9sZWdhY3lSYXdUeXBlOwogIEludGVyZmFjZVR5cGUgX251bGxhYmxlUmF3VHlwZTsKICBJbnRlcmZhY2VUeXBlIF9ub25OdWxsYWJsZVJhd1R5cGU7CiAgSW50ZXJmYWNlVHlwZSBfdGhpc1R5cGU7CgogIENsYXNzQnVpbGRlckltcGwoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIHRoaXMudHlwZVZhcmlhYmxlcywKICAgICAgdGhpcy5zdXBlcnR5cGUsCiAgICAgIHRoaXMuaW50ZXJmYWNlcywKICAgICAgdGhpcy5vblR5cGVzLAogICAgICBTY29wZSBzY29wZSwKICAgICAgdGhpcy5jb25zdHJ1Y3RvcnMsCiAgICAgIExpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgICAgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogY29uc3RydWN0b3JTY29wZUJ1aWxkZXIgPSBuZXcgQ29uc3RydWN0b3JTY29wZUJ1aWxkZXIoY29uc3RydWN0b3JzKSwKICAgICAgICBzdXBlcihtZXRhZGF0YSwgbW9kaWZpZXJzLCBuYW1lLCBwYXJlbnQsIGNoYXJPZmZzZXQsIHNjb3BlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkNsYXNzQnVpbGRlciI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQWJzdHJhY3QgPT4gKG1vZGlmaWVycyAmIGFic3RyYWN0TWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNNaXhpbiA9PiAobW9kaWZpZXJzICYgbWl4aW5EZWNsYXJhdGlvbk1hc2spICE9IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTWl4aW5BcHBsaWNhdGlvbiA9PiBtaXhlZEluVHlwZSAhPSBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbiB7CiAgICByZXR1cm4gaXNNaXhpbkFwcGxpY2F0aW9uICYmIChtb2RpZmllcnMgJiBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrKSAhPSAwOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBbm9ueW1vdXNNaXhpbkFwcGxpY2F0aW9uIHsKICAgIHJldHVybiBpc01peGluQXBwbGljYXRpb24gJiYgIWlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uOwogIH0KCiAgYm9vbCBnZXQgaGFzQ29uc3RDb25zdHJ1Y3RvciA9PiAobW9kaWZpZXJzICYgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2spICE9IDA7CgogIEBvdmVycmlkZQogIExpc3Q8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPiBnZXQgY29uc3RydWN0b3JSZWZlcmVuY2VzID0+IG51bGw7CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgdm9pZCBidWlsZChTdHJpbmcgaWdub3JlLCBCdWlsZGVyIGRlY2xhcmF0aW9uKSB7CiAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyID0gZGVjbGFyYXRpb247CiAgICAgIG1lbWJlci5idWlsZE91dGxpbmVFeHByZXNzaW9ucyhsaWJyYXJ5LCBjb3JlVHlwZXMpOwogICAgfQoKICAgIE1ldGFkYXRhQnVpbGRlci5idWlsZEFubm90YXRpb25zKAogICAgICAgIGlzUGF0Y2ggPyBvcmlnaW4uY2xzIDogY2xzLCBtZXRhZGF0YSwgbGlicmFyeSwgdGhpcywgbnVsbCk7CiAgICBjb25zdHJ1Y3RvcnMuZm9yRWFjaChidWlsZCk7CiAgICBzY29wZS5mb3JFYWNoKGJ1aWxkKTsKICB9CgogIC8vLyBSZWdpc3RlcnMgYSBjb25zdHJ1Y3RvciByZWRpcmVjdGlvbiBmb3IgdGhpcyBjbGFzcyBhbmQgcmV0dXJucyB0cnVlIGlmCiAgLy8vIHRoaXMgcmVkaXJlY3Rpb24gZ2l2ZXMgcmlzZSB0byBhIGN5Y2xlIHRoYXQgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIGJlZm9yZS4KICBib29sIGNoZWNrQ29uc3RydWN0b3JDeWNsaWMoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewogICAgQ29uc3RydWN0b3JSZWRpcmVjdGlvbiByZWRpcmVjdCA9IG5ldyBDb25zdHJ1Y3RvclJlZGlyZWN0aW9uKHRhcmdldCk7CiAgICByZWRpcmVjdGluZ0NvbnN0cnVjdG9ycyA/Pz0gPFN0cmluZywgQ29uc3RydWN0b3JSZWRpcmVjdGlvbj57fTsKICAgIHJlZGlyZWN0aW5nQ29uc3RydWN0b3JzW3NvdXJjZV0gPSByZWRpcmVjdDsKICAgIHdoaWxlIChyZWRpcmVjdCAhPSBudWxsKSB7CiAgICAgIGlmIChyZWRpcmVjdC5jeWNsZVJlcG9ydGVkKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChyZWRpcmVjdC50YXJnZXQgPT0gc291cmNlKSB7CiAgICAgICAgcmVkaXJlY3QuY3ljbGVSZXBvcnRlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmVkaXJlY3QgPSByZWRpcmVjdGluZ0NvbnN0cnVjdG9yc1tyZWRpcmVjdC50YXJnZXRdOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBmaW5kU3RhdGljQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzaW5nTGlicmFyeSwKICAgICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlfSkgewogICAgaWYgKGFjY2Vzc2luZ0xpYnJhcnkub3JpZ2luICE9IGxpYnJhcnkub3JpZ2luICYmIG5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IGlzU2V0dGVyCiAgICAgICAgPyBzY29wZS5sb29rdXBTZXR0ZXIobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgaXNJbnN0YW5jZVNjb3BlOiBmYWxzZSkKICAgICAgICA6IHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBpc0luc3RhbmNlU2NvcGU6IGZhbHNlKTsKICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsICYmIGlzUGF0Y2gpIHsKICAgICAgcmV0dXJuIG9yaWdpbi5maW5kU3RhdGljQnVpbGRlcigKICAgICAgICAgIG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGFjY2Vzc2luZ0xpYnJhcnksCiAgICAgICAgICBpc1NldHRlcjogaXNTZXR0ZXIpOwogICAgfQogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyQnVpbGRlciBmaW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzaW5nTGlicmFyeSkgewogICAgaWYgKGFjY2Vzc2luZ0xpYnJhcnkub3JpZ2luICE9IGxpYnJhcnkub3JpZ2luICYmIG5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgTWVtYmVyQnVpbGRlciBkZWNsYXJhdGlvbiA9IGNvbnN0cnVjdG9ycy5sb29rdXAobmFtZSwgY2hhck9mZnNldCwgdXJpKTsKICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsICYmIGlzUGF0Y2gpIHsKICAgICAgcmV0dXJuIG9yaWdpbi5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgICAgICBuYW1lLCBjaGFyT2Zmc2V0LCB1cmksIGFjY2Vzc2luZ0xpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihTdHJpbmcgbmFtZSwgQnVpbGRlciBidWlsZGVyKSkgewogICAgc2NvcGUuZm9yRWFjaChmKTsKICB9CgogIEBvdmVycmlkZQogIEJ1aWxkZXIgbG9va3VwTG9jYWxNZW1iZXIoU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgQnVpbGRlciBidWlsZGVyID0gc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCAmJiBpc1BhdGNoKSB7CiAgICAgIGJ1aWxkZXIgPSBvcmlnaW4uc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgfQogICAgaWYgKHJlcXVpcmVkICYmIGJ1aWxkZXIgPT0gbnVsbCkgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW4ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICBuYW1lLCBmdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAtMSwKICAgICAgICAgIG51bGwpOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXJCdWlsZGVyIGZpcnN0TWVtYmVyTmFtZWQoU3RyaW5nIG5hbWUpIHsKICAgIEJ1aWxkZXIgZGVjbGFyYXRpb24gPSBsb29rdXBMb2NhbE1lbWJlcihuYW1lLCByZXF1aXJlZDogdHJ1ZSk7CiAgICB3aGlsZSAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgIH0KICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzQnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZSB7CiAgICByZXR1cm4gX3RoaXNUeXBlID8/PSBuZXcgSW50ZXJmYWNlVHlwZShjbHMsIGxpYnJhcnkubm9uTnVsbGFibGUsCiAgICAgICAgZ2V0QXNUeXBlQXJndW1lbnRzKGNscy50eXBlUGFyYW1ldGVycywgbGlicmFyeS5saWJyYXJ5KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBsZWdhY3lSYXdUeXBlIHsKICAgIHJldHVybiBfbGVnYWN5UmF3VHlwZSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoY2xzLCBOdWxsYWJpbGl0eS5sZWdhY3ksCiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlVmFyaWFibGVzQ291bnQsIGNvbnN0IER5bmFtaWNUeXBlKCkpKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IG51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gX251bGxhYmxlUmF3VHlwZSA/Pz0gbmV3IEludGVyZmFjZVR5cGUoY2xzLCBOdWxsYWJpbGl0eS5udWxsYWJsZSwKICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKHR5cGVWYXJpYWJsZXNDb3VudCwgY29uc3QgRHluYW1pY1R5cGUoKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgbm9uTnVsbGFibGVSYXdUeXBlIHsKICAgIHJldHVybiBfbm9uTnVsbGFibGVSYXdUeXBlID8/PSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjbHMsCiAgICAgICAgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsCiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlVmFyaWFibGVzQ291bnQsIGNvbnN0IER5bmFtaWNUeXBlKCkpKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgcmF3VHlwZShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgc3dpdGNoIChudWxsYWJpbGl0eSkgewogICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICByZXR1cm4gbGVnYWN5UmF3VHlwZTsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gbnVsbGFibGVSYXdUeXBlOwogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICAgIHJldHVybiBub25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiB1bmhhbmRsZWQoIiRudWxsYWJpbGl0eSIsICJyYXdUeXBlIiwgbm9PZmZzZXQsIG5vVXJpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSwgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzKSB7CiAgICBhc3NlcnQoYXJndW1lbnRzID09IG51bGwgfHwgY2xzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBhcmd1bWVudHMubGVuZ3RoKTsKICAgIGlmIChpc051bGxDbGFzcykgewogICAgICBudWxsYWJpbGl0eSA9IE51bGxhYmlsaXR5Lm51bGxhYmxlOwogICAgfQogICAgcmV0dXJuIGFyZ3VtZW50cyA9PSBudWxsCiAgICAgICAgPyByYXdUeXBlKG51bGxhYmlsaXR5KQogICAgICAgIDogbmV3IEludGVyZmFjZVR5cGUoY2xzLCBudWxsYWJpbGl0eSwgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZVZhcmlhYmxlc0NvdW50ID0+IHR5cGVWYXJpYWJsZXM/Lmxlbmd0aCA/PyAwOwoKICBAb3ZlcnJpZGUKICBMaXN0PERhcnRUeXBlPiBidWlsZFR5cGVBcmd1bWVudHMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsICYmIHR5cGVWYXJpYWJsZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gPERhcnRUeXBlPltdOwogICAgfQoKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCAmJiB0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQodHlwZVZhcmlhYmxlcy5sZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgICByZXN1bHRbaV0gPSB0eXBlVmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlLmJ1aWxkKGxpYnJhcnkpOwogICAgICB9CiAgICAgIGlmIChsaWJyYXJ5IGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgbGlicmFyeS5pbmZlcnJlZFR5cGVzLmFkZEFsbChyZXN1bHQpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGggIT0gdHlwZVZhcmlhYmxlc0NvdW50KSB7CiAgICAgIC8vIFRoYXQgc2hvdWxkIGJlIGNhdWdodCBhbmQgcmVwb3J0ZWQgYXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZWFybGllci4KICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlVmFyaWFibGVzQ291bnQpCiAgICAgICAgICAgICAgLm1lc3NhZ2UsCiAgICAgICAgICAiYnVpbGRUeXBlQXJndW1lbnRzIiwKICAgICAgICAgIC0xLAogICAgICAgICAgbnVsbCk7CiAgICB9CgogICAgLy8gYXJndW1lbnRzLmxlbmd0aCA9PSB0eXBlVmFyaWFibGVzLmxlbmd0aAogICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGFyZ3VtZW50cy5sZW5ndGgsIG51bGwsIGdyb3dhYmxlOiB0cnVlKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGFyZ3VtZW50c1tpXS5idWlsZChsaWJyYXJ5KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGJ1aWxkVHlwZShMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBOdWxsYWJpbGl0eUJ1aWxkZXIgbnVsbGFiaWxpdHlCdWlsZGVyLCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIHJldHVybiBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKAogICAgICAgIGxpYnJhcnksCiAgICAgICAgbnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnkpLAogICAgICAgIGJ1aWxkVHlwZUFyZ3VtZW50cyhsaWJyYXJ5LCBhcmd1bWVudHMpKTsKICB9CgogIEBvdmVycmlkZQogIFN1cGVydHlwZSBidWlsZFN1cGVydHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICBDbGFzcyBjbHMgPSBpc1BhdGNoID8gb3JpZ2luLmNscyA6IHRoaXMuY2xzOwogICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUoY2xzLCBidWlsZFR5cGVBcmd1bWVudHMobGlicmFyeSwgYXJndW1lbnRzKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgYnVpbGRNaXhlZEluVHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICBDbGFzcyBjbHMgPSBpc1BhdGNoID8gb3JpZ2luLmNscyA6IHRoaXMuY2xzOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgU3VwZXJ0eXBlKGNscywgYnVpbGRUeXBlQXJndW1lbnRzKGxpYnJhcnksIGFyZ3VtZW50cykpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBTdXBlcnR5cGUoCiAgICAgICAgICBjbHMsCiAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgIGNscy50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgICAgICAgZ3Jvd2FibGU6IHRydWUpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgY2hlY2tTdXBlcnR5cGVzKENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIC8vIFRoaXMgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciB0aGUgY2xhc3MgKHRoYXQncyBiZWluZyBidWlsdCkgaXRzIHN1cGVyCiAgICAvLyBjbGFzcyBhcHBlYXJzIGJvdGggaW4gJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcyBhbmQgd2hldGhlciBhbnkKICAgIC8vIGludGVyZmFjZSBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZSAnaW1wbGVtZW50cycgY2xhdXNlLgogICAgLy8gTW9yZW92ZXIsIGl0IGNoZWNrcyB0aGF0IGBGdXR1cmVPcmAgYW5kIGB2b2lkYCBhcmUgbm90IGFtb25nIHRoZQogICAgLy8gc3VwZXJ0eXBlcy4KCiAgICB2b2lkIGZhaWwoTmFtZWRUeXBlQnVpbGRlciB0YXJnZXQsIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICBpbnQgbmFtZU9mZnNldCA9IHRhcmdldC5uYW1lT2Zmc2V0OwogICAgICBpbnQgbmFtZUxlbmd0aCA9IHRhcmdldC5uYW1lTGVuZ3RoOwogICAgICAvLyBUT0RPKGVlcm5zdCk6IG5hbWVPZmZzZXQgbm90IGZ1bGx5IGltcGxlbWVudGVkOyB1c2UgYmFja3VwLgogICAgICBpZiAobmFtZU9mZnNldCA9PSAtMSkgewogICAgICAgIG5hbWVPZmZzZXQgPSB0aGlzLmNoYXJPZmZzZXQ7CiAgICAgICAgbmFtZUxlbmd0aCA9IG5vTGVuZ3RoOwogICAgICB9CiAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgbmFtZU9mZnNldCwgbmFtZUxlbmd0aCk7CiAgICB9CgogICAgLy8gRXh0cmFjdCBhbmQgY2hlY2sgc3VwZXJjbGFzcyAoaWYgaXQgZXhpc3RzKS4KICAgIENsYXNzQnVpbGRlciBzdXBlckNsYXNzOwogICAgVHlwZUJ1aWxkZXIgc3VwZXJDbGFzc1R5cGUgPSBzdXBlcnR5cGU7CiAgICBpZiAoc3VwZXJDbGFzc1R5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2wgPSBzdXBlckNsYXNzVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2wgaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgIFR5cGVBbGlhc0J1aWxkZXIgYWxpYXNCdWlsZGVyID0gZGVjbDsKICAgICAgICBkZWNsID0gYWxpYXNCdWlsZGVyLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgICAgfQogICAgICAvLyBUT0RPKGVlcm5zdCk6IFNob3VsZCBnYXRoZXIgJ3Jlc3RyaWN0ZWQgc3VwZXJ0eXBlJyBjaGVja3MgaW4gb25lIHBsYWNlLAogICAgICAvLyBlLmcuLCBkeW5hbWljL2ludC9TdHJpbmcvTnVsbCBhbmQgbW9yZSBhcmUgY2hlY2tlZCBlbHNld2hlcmUuCiAgICAgIGlmIChkZWNsIGlzIFZvaWRUeXBlQnVpbGRlcikgewogICAgICAgIGZhaWwoc3VwZXJDbGFzc1R5cGUsIG1lc3NhZ2VFeHRlbmRzVm9pZCk7CiAgICAgIH0gZWxzZSBpZiAoZGVjbCBpcyBOZXZlclR5cGVCdWlsZGVyKSB7CiAgICAgICAgZmFpbChzdXBlckNsYXNzVHlwZSwgbWVzc2FnZUV4dGVuZHNOZXZlcik7CiAgICAgIH0gZWxzZSBpZiAoZGVjbCBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICBpZiAoZGVjbC5jbHMgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAgIGZhaWwoc3VwZXJDbGFzc1R5cGUsIG1lc3NhZ2VFeHRlbmRzRnV0dXJlT3IpOwogICAgICAgIH0KICAgICAgICBzdXBlckNsYXNzID0gZGVjbDsKICAgICAgfQogICAgfQogICAgaWYgKGludGVyZmFjZXMgPT0gbnVsbCkgcmV0dXJuOwoKICAgIC8vIFZhbGlkYXRlIGludGVyZmFjZXMuCiAgICBNYXA8Q2xhc3NCdWlsZGVyLCBpbnQ+IHByb2JsZW1zOwogICAgTWFwPENsYXNzQnVpbGRlciwgaW50PiBwcm9ibGVtc09mZnNldHM7CiAgICBTZXQ8Q2xhc3NCdWlsZGVyPiBpbXBsZW1lbnRlZCA9IG5ldyBTZXQ8Q2xhc3NCdWlsZGVyPigpOwogICAgZm9yIChUeXBlQnVpbGRlciB0eXBlIGluIGludGVyZmFjZXMpIHsKICAgICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgIGludCBjaGFyT2Zmc2V0ID0gLTE7IC8vIFRPRE8oYWhlKTogR2V0IG9mZnNldCBmcm9tIHR5cGUuCiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciB0eXBlRGVjbGFyYXRpb24gPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbCA9IHR5cGVEZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyCiAgICAgICAgICAgID8gdHlwZURlY2xhcmF0aW9uLnVuYWxpYXNEZWNsYXJhdGlvbgogICAgICAgICAgICA6IHR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBpZiAoZGVjbCBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIENsYXNzQnVpbGRlciBpbnRlcmZhY2UgPSBkZWNsOwogICAgICAgICAgaWYgKHN1cGVyQ2xhc3MgPT0gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUltcGxlbWVudHNTdXBlckNsYXNzLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlLm5hbWUpLAogICAgICAgICAgICAgICAgdGhpcy5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgICAgfSBlbHNlIGlmIChpbXBsZW1lbnRlZC5jb250YWlucyhpbnRlcmZhY2UpKSB7CiAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSByZXBldGl0aW9ucy4KICAgICAgICAgICAgcHJvYmxlbXMgPz89IG5ldyBNYXA8Q2xhc3NCdWlsZGVyLCBpbnQ+KCk7CiAgICAgICAgICAgIHByb2JsZW1zW2ludGVyZmFjZV0gPz89IDA7CiAgICAgICAgICAgIHByb2JsZW1zW2ludGVyZmFjZV0gKz0gMTsKICAgICAgICAgICAgcHJvYmxlbXNPZmZzZXRzID8/PSBuZXcgTWFwPENsYXNzQnVpbGRlciwgaW50PigpOwogICAgICAgICAgICBwcm9ibGVtc09mZnNldHNbaW50ZXJmYWNlXSA/Pz0gY2hhck9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlLmNscyA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykgewogICAgICAgICAgICBmYWlsKHR5cGUsIG1lc3NhZ2VJbXBsZW1lbnRzRnV0dXJlT3IpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW1wbGVtZW50ZWQuYWRkKGludGVyZmFjZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkZWNsICE9IHN1cGVyQ2xhc3MpIHsKICAgICAgICAgIC8vIFRPRE8oZWVybnN0KTogSGF2ZSBhbGwgJ3Jlc3RyaWN0ZWQgc3VwZXJ0eXBlJyBjaGVja3MgaW4gb25lIHBsYWNlLgogICAgICAgICAgaWYgKGRlY2wgaXMgVm9pZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgICAgIGZhaWwodHlwZSwgbWVzc2FnZUltcGxlbWVudHNWb2lkKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZGVjbCBpcyBOZXZlclR5cGVCdWlsZGVyKSB7CiAgICAgICAgICAgIGZhaWwodHlwZSwgbWVzc2FnZUltcGxlbWVudHNOZXZlcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAocHJvYmxlbXMgIT0gbnVsbCkgewogICAgICBwcm9ibGVtcy5mb3JFYWNoKChDbGFzc0J1aWxkZXIgaW50ZXJmYWNlLCBpbnQgcmVwZXRpdGlvbnMpIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUltcGxlbWVudHNSZXBlYXRlZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgaW50ZXJmYWNlLm5hbWUsIHJlcGV0aXRpb25zKSwKICAgICAgICAgICAgcHJvYmxlbXNPZmZzZXRzW2ludGVyZmFjZV0sCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrQm91bmRzSW5TdXBlcnR5cGUoCiAgICAgIFN1cGVydHlwZSBzdXBlcnR5cGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSB0aGlzLmxpYnJhcnk7CgogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3VlcygKICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZSwgbGlicmFyeS5ub25OdWxsYWJsZSwgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHMpLAogICAgICAgIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogZmFsc2UpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZUFyZ3VtZW50SXNzdWUgaXNzdWUgaW4gaXNzdWVzKSB7CiAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwogICAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gaXNzdWUuYXJndW1lbnQ7CiAgICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gaXNzdWUudHlwZVBhcmFtZXRlcjsKICAgICAgICBib29sIGluZmVycmVkID0gbGlicmFyeS5pbmZlcnJlZFR5cGVzLmNvbnRhaW5zKGFyZ3VtZW50KTsKICAgICAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChpbmZlcnJlZCkgewogICAgICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudAogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYXJndW1lbnQsIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQ7CiAgICAgICAgICB9CiAgICAgICAgICB0eXBlUGFyYW1ldGVyID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGluZmVycmVkKSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPQogICAgICAgICAgICAgICAgdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lKGlzc3VlLmVuY2xvc2luZ1R5cGUpLAogICAgICAgICAgICAgICAgICAgIHN1cGVydHlwZS5jbGFzc05vZGUubmFtZSwKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lKGlzc3VlLmVuY2xvc2luZ1R5cGUpLAogICAgICAgICAgICAgICAgc3VwZXJ0eXBlLmNsYXNzTm9kZS5uYW1lLAogICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBsaWJyYXJ5LnJlcG9ydFR5cGVBcmd1bWVudElzc3VlKAogICAgICAgICAgICBtZXNzYWdlLCBmaWxlVXJpLCBjaGFyT2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja1R5cGVzSW5PdXRsaW5lKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSB0aGlzLmxpYnJhcnk7CgogICAgLy8gQ2hlY2sgaW4gYm91bmRzIG9mIG93biB0eXBlIHZhcmlhYmxlcy4KICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gY2xzLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGlzc3VlcyA9IGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoCiAgICAgICAgICBwYXJhbWV0ZXIuYm91bmQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChUeXBlQXJndW1lbnRJc3N1ZSBpc3N1ZSBpbiBpc3N1ZXMpIHsKICAgICAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gaXNzdWUuYXJndW1lbnQ7CiAgICAgICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBpc3N1ZS50eXBlUGFyYW1ldGVyOwogICAgICAgICAgaWYgKGxpYnJhcnkuaW5mZXJyZWRUeXBlcy5jb250YWlucyhhcmd1bWVudCkpIHsKICAgICAgICAgICAgLy8gSW5mZXJlbmNlIGluIHR5cGUgZXhwcmVzc2lvbnMgaW4gdGhlIHN1cGVydHlwZXMgYm9pbHMgZG93biB0bwogICAgICAgICAgICAvLyBpbnN0YW50aWF0ZS10by1ib3VuZCB3aGljaCBzaG91bGRuJ3QgcHJvZHVjZSBhbnl0aGluZyB0aGF0IGJyZWFrcwogICAgICAgICAgICAvLyB0aGUgYm91bmRzIGFmdGVyIHRoZSBub24tc2ltcGxpY2l0eSBjaGVja3MgYXJlIGRvbmUuICBTbywgYW55CiAgICAgICAgICAgIC8vIHZpb2xhdGlvbiBoZXJlIGlzIHRoZSByZXN1bHQgb2Ygbm9uLXNpbXBsZSBib3VuZHMsIGFuZCB0aGUgZXJyb3IKICAgICAgICAgICAgLy8gaXMgcmVwb3J0ZWQgZWxzZXdoZXJlLgogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICAgICAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50OwogICAgICAgICAgICB0eXBlUGFyYW1ldGVyID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lKGlzc3VlLmVuY2xvc2luZ1R5cGUpLAogICAgICAgICAgICAgICAgbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBsaWJyYXJ5LnJlcG9ydFR5cGVBcmd1bWVudElzc3VlKAogICAgICAgICAgICAgIG1lc3NhZ2UsIGZpbGVVcmksIHBhcmFtZXRlci5maWxlT2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBDaGVjayBpbiBzdXBlcnMuCiAgICBpZiAoY2xzLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIGNoZWNrQm91bmRzSW5TdXBlcnR5cGUoY2xzLnN1cGVydHlwZSwgdHlwZUVudmlyb25tZW50KTsKICAgIH0KICAgIGlmIChjbHMubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBjaGVja0JvdW5kc0luU3VwZXJ0eXBlKGNscy5taXhlZEluVHlwZSwgdHlwZUVudmlyb25tZW50KTsKICAgIH0KICAgIGlmIChjbHMuaW1wbGVtZW50ZWRUeXBlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoU3VwZXJ0eXBlIHN1cGVydHlwZSBpbiBjbHMuaW1wbGVtZW50ZWRUeXBlcykgewogICAgICAgIGNoZWNrQm91bmRzSW5TdXBlcnR5cGUoc3VwZXJ0eXBlLCB0eXBlRW52aXJvbm1lbnQpOwogICAgICB9CiAgICB9CgogICAgLy8gQ2hlY2sgaW4gbWVtYmVycy4KICAgIGZvciAoUHJvY2VkdXJlIHByb2NlZHVyZSBpbiBjbHMucHJvY2VkdXJlcykgewogICAgICBjaGVja1ZhcmlhbmNlSW5GdW5jdGlvbihwcm9jZWR1cmUsIHR5cGVFbnZpcm9ubWVudCwgY2xzLnR5cGVQYXJhbWV0ZXJzKTsKICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlKAogICAgICAgICAgcHJvY2VkdXJlLmZ1bmN0aW9uLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmkpOwogICAgfQogICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBjbHMuY29uc3RydWN0b3JzKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZSgKICAgICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmkpOwogICAgfQogICAgZm9yIChSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciByZWRpcmVjdGluZwogICAgICAgIGluIGNscy5yZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnMpIHsKICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlUGFydHMoCiAgICAgICAgICB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIHJlZGlyZWN0aW5nLmZpbGVPZmZzZXQsCiAgICAgICAgICB0eXBlUGFyYW1ldGVyczogcmVkaXJlY3RpbmcudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogcmVkaXJlY3RpbmcucG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IHJlZGlyZWN0aW5nLm5hbWVkUGFyYW1ldGVycyk7CiAgICB9CgogICAgZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgYnVpbGRlcikgewogICAgICAvLyBDaGVjayBmaWVsZHMuCiAgICAgIGlmIChidWlsZGVyIGlzIEZpZWxkQnVpbGRlcikgewogICAgICAgIGNoZWNrVmFyaWFuY2VJbkZpZWxkKAogICAgICAgICAgICBidWlsZGVyLmZpZWxkLCB0eXBlRW52aXJvbm1lbnQsIGNscy50eXBlUGFyYW1ldGVycyk7CiAgICAgICAgbGlicmFyeS5jaGVja1R5cGVzSW5GaWVsZChidWlsZGVyLCB0eXBlRW52aXJvbm1lbnQpOwogICAgICB9CgogICAgICAvLyBDaGVjayBpbml0aWFsaXplcnMuCiAgICAgIGlmIChidWlsZGVyIGlzIEZ1bmN0aW9uQnVpbGRlciAmJgogICAgICAgICAgIWJ1aWxkZXIuaXNBYnN0cmFjdCAmJgogICAgICAgICAgYnVpbGRlci5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrSW5pdGlhbGl6ZXJzSW5Gb3JtYWxzKGJ1aWxkZXIuZm9ybWFscyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBjaGVja1ZhcmlhbmNlSW5GaWVsZChGaWVsZCBmaWVsZCwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgaW50IGZpZWxkVmFyaWFuY2UgPSBjb21wdXRlVmFyaWFuY2UodHlwZVBhcmFtZXRlciwgZmllbGQudHlwZSk7CiAgICAgIGlmIChmaWVsZC5oYXNJbXBsaWNpdEdldHRlcikgewogICAgICAgIHJlcG9ydFZhcmlhbmNlUG9zaXRpb25JZkludmFsaWQoCiAgICAgICAgICAgIGZpZWxkVmFyaWFuY2UsIHR5cGVQYXJhbWV0ZXIsIGZpZWxkLmZpbGVVcmksIGZpZWxkLmZpbGVPZmZzZXQpOwogICAgICB9CiAgICAgIGlmIChmaWVsZC5oYXNJbXBsaWNpdFNldHRlciAmJiAhZmllbGQuaXNDb3ZhcmlhbnQpIHsKICAgICAgICBmaWVsZFZhcmlhbmNlID0gVmFyaWFuY2UuY29tYmluZShWYXJpYW5jZS5jb250cmF2YXJpYW50LCBmaWVsZFZhcmlhbmNlKTsKICAgICAgICByZXBvcnRWYXJpYW5jZVBvc2l0aW9uSWZJbnZhbGlkKAogICAgICAgICAgICBmaWVsZFZhcmlhbmNlLCB0eXBlUGFyYW1ldGVyLCBmaWVsZC5maWxlVXJpLCBmaWVsZC5maWxlT2Zmc2V0KTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjaGVja1ZhcmlhbmNlSW5GdW5jdGlvbihQcm9jZWR1cmUgcHJvY2VkdXJlLAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMgPQogICAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBwcm9jZWR1cmUuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzOwogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IHByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlOwoKICAgIGlmIChmdW5jdGlvblR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIGZ1bmN0aW9uUGFyYW1ldGVyIGluIGZ1bmN0aW9uVHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgaW50IHR5cGVWYXJpYW5jZSA9IFZhcmlhbmNlLmNvbWJpbmUoVmFyaWFuY2UuaW52YXJpYW50LAogICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh0eXBlUGFyYW1ldGVyLCBmdW5jdGlvblBhcmFtZXRlci5ib3VuZCkpOwogICAgICAgICAgcmVwb3J0VmFyaWFuY2VQb3NpdGlvbklmSW52YWxpZCh0eXBlVmFyaWFuY2UsIHR5cGVQYXJhbWV0ZXIsIGZpbGVVcmksCiAgICAgICAgICAgICAgZnVuY3Rpb25QYXJhbWV0ZXIuZmlsZU9mZnNldCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAocG9zaXRpb25hbFBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsIGluIHBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKCFmb3JtYWwuaXNDb3ZhcmlhbnQpIHsKICAgICAgICAgIGZvciAoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIHR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIGludCBmb3JtYWxWYXJpYW5jZSA9IFZhcmlhbmNlLmNvbWJpbmUoVmFyaWFuY2UuY29udHJhdmFyaWFudCwKICAgICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh0eXBlUGFyYW1ldGVyLCBmb3JtYWwudHlwZSkpOwogICAgICAgICAgICByZXBvcnRWYXJpYW5jZVBvc2l0aW9uSWZJbnZhbGlkKAogICAgICAgICAgICAgICAgZm9ybWFsVmFyaWFuY2UsIHR5cGVQYXJhbWV0ZXIsIGZpbGVVcmksIGZvcm1hbC5maWxlT2Zmc2V0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChuYW1lZFBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gbmFtZWQgaW4gbmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgIGludCBuYW1lZFZhcmlhbmNlID0gVmFyaWFuY2UuY29tYmluZShWYXJpYW5jZS5jb250cmF2YXJpYW50LAogICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh0eXBlUGFyYW1ldGVyLCBuYW1lZC50eXBlKSk7CiAgICAgICAgICByZXBvcnRWYXJpYW5jZVBvc2l0aW9uSWZJbnZhbGlkKAogICAgICAgICAgICAgIG5hbWVkVmFyaWFuY2UsIHR5cGVQYXJhbWV0ZXIsIGZpbGVVcmksIG5hbWVkLmZpbGVPZmZzZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgIGludCByZXR1cm5UeXBlVmFyaWFuY2UgPSBjb21wdXRlVmFyaWFuY2UodHlwZVBhcmFtZXRlciwgcmV0dXJuVHlwZSk7CiAgICAgICAgcmVwb3J0VmFyaWFuY2VQb3NpdGlvbklmSW52YWxpZChyZXR1cm5UeXBlVmFyaWFuY2UsIHR5cGVQYXJhbWV0ZXIsCiAgICAgICAgICAgIGZpbGVVcmksIHByb2NlZHVyZS5mdW5jdGlvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBpc1JldHVyblR5cGU6IHRydWUpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydFZhcmlhbmNlUG9zaXRpb25JZkludmFsaWQoCiAgICAgIGludCB2YXJpYW5jZSwgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyLCBVcmkgZmlsZVVyaSwgaW50IGZpbGVPZmZzZXQsCiAgICAgIHtib29sIGlzUmV0dXJuVHlwZTogZmFsc2V9KSB7CiAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gdGhpcy5saWJyYXJ5OwogICAgaWYgKCF0eXBlUGFyYW1ldGVyLmlzTGVnYWN5Q292YXJpYW50ICYmCiAgICAgICAgIVZhcmlhbmNlLmdyZWF0ZXJUaGFuT3JFcXVhbCh2YXJpYW5jZSwgdHlwZVBhcmFtZXRlci52YXJpYW5jZSkpIHsKICAgICAgTWVzc2FnZSBtZXNzYWdlOwogICAgICBpZiAoaXNSZXR1cm5UeXBlKSB7CiAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JblJldHVyblR5cGUKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoVmFyaWFuY2Uua2V5d29yZFN0cmluZyh0eXBlUGFyYW1ldGVyLnZhcmlhbmNlKSwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwgVmFyaWFuY2Uua2V5d29yZFN0cmluZyh2YXJpYW5jZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUludmFsaWRUeXBlVmFyaWFibGVWYXJpYW5jZVBvc2l0aW9uLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIFZhcmlhbmNlLmtleXdvcmRTdHJpbmcodHlwZVBhcmFtZXRlci52YXJpYW5jZSksCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgVmFyaWFuY2Uua2V5d29yZFN0cmluZyh2YXJpYW5jZSkpOwogICAgICB9CiAgICAgIGxpYnJhcnkucmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUoCiAgICAgICAgICBtZXNzYWdlLCBmaWxlVXJpLCBmaWxlT2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2VlbkNvdmFyaWFudCgKICAgICAgVHlwZXMgdHlwZXMsCiAgICAgIE1lbWJlciBkZWNsYXJlZE1lbWJlciwKICAgICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgY2FsbGJhY2soTWVtYmVyIGRlY2xhcmVkTWVtYmVyLCBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyLCBib29sIGlzU2V0dGVyKSkgewogICAgLy8gV2hlbiBhIHBhcmFtZXRlciBpcyBjb3ZhcmlhbnQgd2UgaGF2ZSB0byBjaGVjayB0aGF0IHdlIGFsc28KICAgIC8vIG92ZXJyaWRlIHRoZSBzYW1lIG1lbWJlciBpbiBhbGwgcGFyZW50cy4KICAgIGZvciAoU3VwZXJ0eXBlIHN1cGVydHlwZSBpbiBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3Muc3VwZXJzKSB7CiAgICAgIE1lbWJlciBtID0gdHlwZXMuaGllcmFyY2h5LmdldEludGVyZmFjZU1lbWJlcktlcm5lbCgKICAgICAgICAgIHN1cGVydHlwZS5jbGFzc05vZGUsIGludGVyZmFjZU1lbWJlci5uYW1lLCBpc1NldHRlcik7CiAgICAgIGlmIChtICE9IG51bGwpIHsKICAgICAgICBjYWxsYmFjayhkZWNsYXJlZE1lbWJlciwgbSwgaXNTZXR0ZXIpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrT3ZlcnJpZGUoCiAgICAgIFR5cGVzIHR5cGVzLAogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIGJvb2wgaXNTZXR0ZXIsCiAgICAgIGNhbGxiYWNrKE1lbWJlciBkZWNsYXJlZE1lbWJlciwgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc1NldHRlciksCiAgICAgIHtib29sIGlzSW50ZXJmYWNlQ2hlY2sgPSBmYWxzZX0pIHsKICAgIGlmIChkZWNsYXJlZE1lbWJlciA9PSBpbnRlcmZhY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRlY2xhcmVkTWVtYmVyIGlzIENvbnN0cnVjdG9yIHx8IGludGVyZmFjZU1lbWJlciBpcyBDb25zdHJ1Y3RvcikgewogICAgICB1bmltcGxlbWVudGVkKAogICAgICAgICAgIkNvbnN0cnVjdG9yIGluIG92ZXJyaWRlIGNoZWNrLiIsIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKGRlY2xhcmVkTWVtYmVyIGlzIFByb2NlZHVyZSAmJiBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIGlmIChkZWNsYXJlZE1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kICYmCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICAgIGJvb2wgc2VlbkNvdmFyaWFudCA9IGNoZWNrTWV0aG9kT3ZlcnJpZGUoCiAgICAgICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc0ludGVyZmFjZUNoZWNrKTsKICAgICAgICBpZiAoc2VlbkNvdmFyaWFudCkgewogICAgICAgICAgaGFuZGxlU2VlbkNvdmFyaWFudCgKICAgICAgICAgICAgICB0eXBlcywgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNTZXR0ZXIsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIgJiYKICAgICAgICAgIGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuR2V0dGVyKSB7CiAgICAgICAgY2hlY2tHZXR0ZXJPdmVycmlkZSgKICAgICAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICB9CiAgICAgIGlmIChkZWNsYXJlZE1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyICYmCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgIGJvb2wgc2VlbkNvdmFyaWFudCA9IGNoZWNrU2V0dGVyT3ZlcnJpZGUoCiAgICAgICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc0ludGVyZmFjZUNoZWNrKTsKICAgICAgICBpZiAoc2VlbkNvdmFyaWFudCkgewogICAgICAgICAgaGFuZGxlU2VlbkNvdmFyaWFudCgKICAgICAgICAgICAgICB0eXBlcywgZGVjbGFyZWRNZW1iZXIsIGludGVyZmFjZU1lbWJlciwgaXNTZXR0ZXIsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJvb2wgZGVjbGFyZWRNZW1iZXJIYXNHZXR0ZXIgPSBkZWNsYXJlZE1lbWJlciBpcyBGaWVsZCB8fAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGRlY2xhcmVkTWVtYmVyLmlzR2V0dGVyOwogICAgICBib29sIGludGVyZmFjZU1lbWJlckhhc0dldHRlciA9IGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCB8fAogICAgICAgICAgaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSAmJiBpbnRlcmZhY2VNZW1iZXIuaXNHZXR0ZXI7CiAgICAgIGJvb2wgZGVjbGFyZWRNZW1iZXJIYXNTZXR0ZXIgPSAoZGVjbGFyZWRNZW1iZXIgaXMgRmllbGQgJiYKICAgICAgICAgICAgICAhZGVjbGFyZWRNZW1iZXIuaXNGaW5hbCAmJgogICAgICAgICAgICAgICFkZWNsYXJlZE1lbWJlci5pc0NvbnN0KSB8fAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGRlY2xhcmVkTWVtYmVyLmlzU2V0dGVyOwogICAgICBib29sIGludGVyZmFjZU1lbWJlckhhc1NldHRlciA9IChpbnRlcmZhY2VNZW1iZXIgaXMgRmllbGQgJiYKICAgICAgICAgICAgICAhaW50ZXJmYWNlTWVtYmVyLmlzRmluYWwgJiYKICAgICAgICAgICAgICAhaW50ZXJmYWNlTWVtYmVyLmlzQ29uc3QpIHx8CiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGludGVyZmFjZU1lbWJlci5pc1NldHRlcjsKICAgICAgaWYgKGRlY2xhcmVkTWVtYmVySGFzR2V0dGVyICYmIGludGVyZmFjZU1lbWJlckhhc0dldHRlcikgewogICAgICAgIGNoZWNrR2V0dGVyT3ZlcnJpZGUoCiAgICAgICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc0ludGVyZmFjZUNoZWNrKTsKICAgICAgfQogICAgICBpZiAoZGVjbGFyZWRNZW1iZXJIYXNTZXR0ZXIgJiYgaW50ZXJmYWNlTWVtYmVySGFzU2V0dGVyKSB7CiAgICAgICAgYm9vbCBzZWVuQ292YXJpYW50ID0gY2hlY2tTZXR0ZXJPdmVycmlkZSgKICAgICAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICAgIGlmIChzZWVuQ292YXJpYW50KSB7CiAgICAgICAgICBoYW5kbGVTZWVuQ292YXJpYW50KAogICAgICAgICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBpc1NldHRlciwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gVE9ETyhhaGUpOiBIYW5kbGUgb3RoZXIgY2FzZXM6IGFjY2Vzc29ycywgb3BlcmF0b3JzLCBhbmQgZmllbGRzLgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBoYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCgKICAgICAgQ2xhc3Mga2xhc3MsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSwgQ2xhc3Mgb2JqZWN0Q2xhc3MpIHsKICAgIE1lbWJlciBub1N1Y2hNZXRob2QgPSBoaWVyYXJjaHkuZ2V0RGlzcGF0Y2hUYXJnZXQoa2xhc3MsIG5vU3VjaE1ldGhvZE5hbWUpOwogICAgcmV0dXJuIG5vU3VjaE1ldGhvZCAhPSBudWxsICYmIG5vU3VjaE1ldGhvZC5lbmNsb3NpbmdDbGFzcyAhPSBvYmplY3RDbGFzczsKICB9CgogIHZvaWQgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIoCiAgICAgIE1lbWJlciBub1N1Y2hNZXRob2RJbnRlcmZhY2UsIEtlcm5lbFRhcmdldCB0YXJnZXQsIFByb2NlZHVyZSBwcm9jZWR1cmUpIHsKICAgIFN0cmluZyBwcmVmaXggPQogICAgICAgIHByb2NlZHVyZS5pc0dldHRlciA/ICdnZXQ6JyA6IHByb2NlZHVyZS5pc1NldHRlciA/ICdzZXQ6JyA6ICcnOwogICAgRXhwcmVzc2lvbiBpbnZvY2F0aW9uID0gdGFyZ2V0LmJhY2tlbmRUYXJnZXQuaW5zdGFudGlhdGVJbnZvY2F0aW9uKAogICAgICAgIHRhcmdldC5sb2FkZXIuY29yZVR5cGVzLAogICAgICAgIG5ldyBUaGlzRXhwcmVzc2lvbigpLAogICAgICAgIHByZWZpeCArIHByb2NlZHVyZS5uYW1lLm5hbWUsCiAgICAgICAgbmV3IEFyZ3VtZW50cy5mb3J3YXJkZWQocHJvY2VkdXJlLmZ1bmN0aW9uLCBsaWJyYXJ5LmxpYnJhcnkpLAogICAgICAgIHByb2NlZHVyZS5maWxlT2Zmc2V0LAogICAgICAgIC8qaXNTdXBlcj0qLyBmYWxzZSk7CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKG5ldyBUaGlzRXhwcmVzc2lvbigpLAogICAgICAgIG5vU3VjaE1ldGhvZE5hbWUsIG5ldyBBcmd1bWVudHMoW2ludm9jYXRpb25dKSwgbm9TdWNoTWV0aG9kSW50ZXJmYWNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldDsKICAgIGlmIChwcm9jZWR1cmUuZnVuY3Rpb24ucmV0dXJuVHlwZSBpcyEgVm9pZFR5cGUpIHsKICAgICAgcmVzdWx0ID0gbmV3IEFzRXhwcmVzc2lvbihyZXN1bHQsIHByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlKQogICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgLi5pc0ZvckR5bmFtaWMgPSB0cnVlCiAgICAgICAgLi5pc0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0ID0gbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgLi5maWxlT2Zmc2V0ID0gcHJvY2VkdXJlLmZpbGVPZmZzZXQ7CiAgICB9CiAgICBwcm9jZWR1cmUuZnVuY3Rpb24uYm9keSA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQocmVzdWx0KQogICAgICAuLmZpbGVPZmZzZXQgPSBwcm9jZWR1cmUuZmlsZU9mZnNldDsKICAgIHByb2NlZHVyZS5mdW5jdGlvbi5ib2R5LnBhcmVudCA9IHByb2NlZHVyZS5mdW5jdGlvbjsKCiAgICBwcm9jZWR1cmUuaXNBYnN0cmFjdCA9IGZhbHNlOwogICAgcHJvY2VkdXJlLmlzTm9TdWNoTWV0aG9kRm9yd2FyZGVyID0gdHJ1ZTsKICAgIHByb2NlZHVyZS5pc0ZvcndhcmRpbmdTdHViID0gZmFsc2U7CiAgICBwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU2VtaVN0dWIgPSBmYWxzZTsKICB9CgogIFVyaSBfZ2V0TWVtYmVyVXJpKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHJldHVybiBtZW1iZXIuZmlsZVVyaTsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSByZXR1cm4gbWVtYmVyLmZpbGVVcmk7CiAgICAvLyBPdGhlciBtZW1iZXIgdHlwZXMgd29uJ3QgYmUgc2VlbiBiZWNhdXNlIGNvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZQogICAgLy8gaW4gb3ZlcnJpZGUgcmVsYXRpb25zaGlwcwogICAgcmV0dXJuIHVuaGFuZGxlZCgnJHttZW1iZXIucnVudGltZVR5cGV9JywgJ19nZXRNZW1iZXJVcmknLCAtMSwgbnVsbCk7CiAgfQoKICBTdWJzdGl0dXRpb24gX2NvbXB1dGVJbnRlcmZhY2VTdWJzdGl0dXRpb24oCiAgICAgIFR5cGVzIHR5cGVzLAogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIEZ1bmN0aW9uTm9kZSBkZWNsYXJlZEZ1bmN0aW9uLAogICAgICBGdW5jdGlvbk5vZGUgaW50ZXJmYWNlRnVuY3Rpb24sCiAgICAgIGJvb2wgaXNJbnRlcmZhY2VDaGVjaykgewogICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5lbXB0eTsKICAgIGlmIChpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBDbGFzcyBlbmNsb3NpbmdDbGFzcyA9IGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgdHlwZXMuaGllcmFyY2h5CiAgICAgICAgICAgICAgLmdldEtlcm5lbFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodGhpc1R5cGUsIGVuY2xvc2luZ0NsYXNzKSk7CiAgICB9CgogICAgaWYgKGRlY2xhcmVkRnVuY3Rpb24/LnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggIT0KICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbj8udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCkgewogICAgICByZXBvcnRJbnZhbGlkT3ZlcnJpZGUoCiAgICAgICAgICBpc0ludGVyZmFjZUNoZWNrLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWV9IiwKICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lfSIpLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oX2dldE1lbWJlclVyaShpbnRlcmZhY2VNZW1iZXIpLAogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgIF0pOwogICAgfSBlbHNlIGlmIChkZWNsYXJlZEZ1bmN0aW9uPy50eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0KICAgICAgICAgIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJlZEZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgc3Vic3RpdHV0aW9uTWFwW2ludGVyZmFjZUZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldXSA9CiAgICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV0sCiAgICAgICAgICAgICAgICBkZWNsYXJlZEZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgfQogICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21NYXAoc3Vic3RpdHV0aW9uTWFwKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJlZEZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgVHlwZVBhcmFtZXRlciBkZWNsYXJlZFBhcmFtZXRlciA9IGRlY2xhcmVkRnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV07CiAgICAgICAgVHlwZVBhcmFtZXRlciBpbnRlcmZhY2VQYXJhbWV0ZXIgPSBpbnRlcmZhY2VGdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoIWludGVyZmFjZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBEYXJ0VHlwZSBkZWNsYXJlZEJvdW5kID0gZGVjbGFyZWRQYXJhbWV0ZXIuYm91bmQ7CiAgICAgICAgICBEYXJ0VHlwZSBpbnRlcmZhY2VCb3VuZCA9IGludGVyZmFjZVBhcmFtZXRlci5ib3VuZDsKICAgICAgICAgIGlmIChpbnRlcmZhY2VTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgICAgICBkZWNsYXJlZEJvdW5kID0gaW50ZXJmYWNlU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGRlY2xhcmVkQm91bmQpOwogICAgICAgICAgICBpbnRlcmZhY2VCb3VuZCA9CiAgICAgICAgICAgICAgICBpbnRlcmZhY2VTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoaW50ZXJmYWNlQm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgRGFydFR5cGUgY29tcHV0ZWRCb3VuZCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShpbnRlcmZhY2VCb3VuZCk7CiAgICAgICAgICBpZiAoIXR5cGVzCiAgICAgICAgICAgICAgLmlzU2FtZVR5cGVLZXJuZWwoZGVjbGFyZWRCb3VuZCwgY29tcHV0ZWRCb3VuZCkKICAgICAgICAgICAgICAuaXNTdWJ0eXBlV2hlblVzaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgICAgICAgIHJlcG9ydEludmFsaWRPdmVycmlkZSgKICAgICAgICAgICAgICAgIGlzSW50ZXJmYWNlQ2hlY2ssCiAgICAgICAgICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGVUeXBlVmFyaWFibGVzQm91bmRNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkQm91bmQsCiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLm5hbWUubmFtZX0iLAogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkQm91bmQsCiAgICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iLAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgICBkZWNsYXJlZE1lbWJlci5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlT3ZlcnJpZGRlbk1ldGhvZENhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihfZ2V0TWVtYmVyVXJpKGludGVyZmFjZU1lbWJlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uY29tYmluZShpbnRlcmZhY2VTdWJzdGl0dXRpb24sIHN1YnN0aXR1dGlvbik7CiAgICB9CiAgICByZXR1cm4gaW50ZXJmYWNlU3Vic3RpdHV0aW9uOwogIH0KCiAgU3Vic3RpdHV0aW9uIF9jb21wdXRlRGVjbGFyZWRTdWJzdGl0dXRpb24oCiAgICAgIFR5cGVzIHR5cGVzLCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIpIHsKICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5lbXB0eTsKICAgIGlmIChkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIENsYXNzIGVuY2xvc2luZ0NsYXNzID0gZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgdHlwZXMuaGllcmFyY2h5CiAgICAgICAgICAgICAgLmdldEtlcm5lbFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodGhpc1R5cGUsIGVuY2xvc2luZ0NsYXNzKSk7CiAgICB9CiAgICByZXR1cm4gZGVjbGFyZWRTdWJzdGl0dXRpb247CiAgfQoKICB2b2lkIF9jaGVja1R5cGVzKAogICAgICBUeXBlcyB0eXBlcywKICAgICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiwKICAgICAgU3Vic3RpdHV0aW9uIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsCiAgICAgIERhcnRUeXBlIGRlY2xhcmVkVHlwZSwKICAgICAgRGFydFR5cGUgaW50ZXJmYWNlVHlwZSwKICAgICAgYm9vbCBpc0NvdmFyaWFudCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgYm9vbCBpc0ludGVyZmFjZUNoZWNrLAogICAgICB7Ym9vbCBhc0lmRGVjbGFyZWRQYXJhbWV0ZXIgPSBmYWxzZX0pIHsKICAgIGlmIChpbnRlcmZhY2VTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBpbnRlcmZhY2VUeXBlID0gaW50ZXJmYWNlU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGludGVyZmFjZVR5cGUpOwogICAgfQogICAgaWYgKGRlY2xhcmVkU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgZGVjbGFyZWRUeXBlID0gZGVjbGFyZWRTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZGVjbGFyZWRUeXBlKTsKICAgIH0KCiAgICBpZiAoIWRlY2xhcmVkTWVtYmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICBpbnRlcmZhY2VNZW1iZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBpbnRlcmZhY2VUeXBlID0gbGVnYWN5RXJhc3VyZSh0eXBlcy5oaWVyYXJjaHkuY29yZVR5cGVzLCBpbnRlcmZhY2VUeXBlKTsKICAgIH0KCiAgICBib29sIGluUGFyYW1ldGVyID0gZGVjbGFyZWRQYXJhbWV0ZXIgIT0gbnVsbCB8fCBhc0lmRGVjbGFyZWRQYXJhbWV0ZXI7CiAgICBEYXJ0VHlwZSBzdWJ0eXBlID0gaW5QYXJhbWV0ZXIgPyBpbnRlcmZhY2VUeXBlIDogZGVjbGFyZWRUeXBlOwogICAgRGFydFR5cGUgc3VwZXJ0eXBlID0gaW5QYXJhbWV0ZXIgPyBkZWNsYXJlZFR5cGUgOiBpbnRlcmZhY2VUeXBlOwoKICAgIGlmICh0eXBlcy5pc1N1YnR5cGVPZktlcm5lbCgKICAgICAgICBzdWJ0eXBlLCBzdXBlcnR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAvLyBObyBwcm9ibGVtLS10aGUgcHJvcGVyIHN1YnR5cGluZyByZWxhdGlvbiBpcyBzYXRpc2ZpZWQuCiAgICB9IGVsc2UgaWYgKGlzQ292YXJpYW50ICYmCiAgICAgICAgdHlwZXMuaXNTdWJ0eXBlT2ZLZXJuZWwoCiAgICAgICAgICAgIHN1cGVydHlwZSwgc3VidHlwZSwgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgIC8vIE5vIHByb2JsZW0tLXRoZSBvdmVycmlkaW5nIHBhcmFtZXRlciBpcyBtYXJrZWQgImNvdmFyaWFudCIgYW5kIGhhcwogICAgICAvLyBhIHR5cGUgd2hpY2ggaXMgYSBzdWJ0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgaXQgb3ZlcnJpZGVzLgogICAgfSBlbHNlIGlmIChzdWJ0eXBlIGlzIEludmFsaWRUeXBlIHx8IHN1cGVydHlwZSBpcyBJbnZhbGlkVHlwZSkgewogICAgICAvLyBEb24ndCByZXBvcnQgYSBwcm9ibGVtIGFzIHNvbWV0aGluZyBlbHNlIGlzIHdyb25nIHRoYXQgaGFzIGFscmVhZHkKICAgICAgLy8gYmVlbiByZXBvcnRlZC4KICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlcG9ydCBhbiBlcnJvci4KICAgICAgU3RyaW5nIGRlY2xhcmVkTWVtYmVyTmFtZSA9CiAgICAgICAgICAnJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4ke2RlY2xhcmVkTWVtYmVyLm5hbWUubmFtZX0nOwogICAgICBTdHJpbmcgaW50ZXJmYWNlTWVtYmVyTmFtZSA9CiAgICAgICAgICAnJHtpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uJHtpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lfSc7CiAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKICAgICAgaW50IGZpbGVPZmZzZXQ7CiAgICAgIGlmIChkZWNsYXJlZFBhcmFtZXRlciA9PSBudWxsKSB7CiAgICAgICAgaWYgKGFzSWZEZWNsYXJlZFBhcmFtZXRlcikgewogICAgICAgICAgLy8gU2V0dGVyIG92ZXJyaWRkZW4gYnkgZmllbGQKICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZU92ZXJyaWRlVHlwZU1pc21hdGNoU2V0dGVyLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXJOYW1lLAogICAgICAgICAgICAgIGRlY2xhcmVkVHlwZSwKICAgICAgICAgICAgICBpbnRlcmZhY2VUeXBlLAogICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlck5hbWUsCiAgICAgICAgICAgICAgbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXJOYW1lLAogICAgICAgICAgICAgIGRlY2xhcmVkVHlwZSwKICAgICAgICAgICAgICBpbnRlcmZhY2VUeXBlLAogICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlck5hbWUsCiAgICAgICAgICAgICAgbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICAgICAgICB9CiAgICAgICAgZmlsZU9mZnNldCA9IGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXIud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXJOYW1lLAogICAgICAgICAgICBkZWNsYXJlZFR5cGUsCiAgICAgICAgICAgIGludGVyZmFjZVR5cGUsCiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlck5hbWUsCiAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgZmlsZU9mZnNldCA9IGRlY2xhcmVkUGFyYW1ldGVyLmZpbGVPZmZzZXQ7CiAgICAgIH0KICAgICAgcmVwb3J0SW52YWxpZE92ZXJyaWRlKAogICAgICAgICAgaXNJbnRlcmZhY2VDaGVjaywgZGVjbGFyZWRNZW1iZXIsIG1lc3NhZ2UsIGZpbGVPZmZzZXQsIG5vTGVuZ3RoLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oX2dldE1lbWJlclVyaShpbnRlcmZhY2VNZW1iZXIpLAogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgIF0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja01ldGhvZE92ZXJyaWRlKFR5cGVzIHR5cGVzLCBQcm9jZWR1cmUgZGVjbGFyZWRNZW1iZXIsCiAgICAgIFByb2NlZHVyZSBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNJbnRlcmZhY2VDaGVjaykgewogICAgYXNzZXJ0KGRlY2xhcmVkTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpOwogICAgYXNzZXJ0KGludGVyZmFjZU1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKTsKICAgIGJvb2wgc2VlbkNvdmFyaWFudCA9IGZhbHNlOwogICAgRnVuY3Rpb25Ob2RlIGRlY2xhcmVkRnVuY3Rpb24gPSBkZWNsYXJlZE1lbWJlci5mdW5jdGlvbjsKICAgIEZ1bmN0aW9uTm9kZSBpbnRlcmZhY2VGdW5jdGlvbiA9IGludGVyZmFjZU1lbWJlci5mdW5jdGlvbjsKCiAgICBTdWJzdGl0dXRpb24gaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0gX2NvbXB1dGVJbnRlcmZhY2VTdWJzdGl0dXRpb24oCiAgICAgICAgdHlwZXMsCiAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgIGRlY2xhcmVkRnVuY3Rpb24sCiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24sCiAgICAgICAgaXNJbnRlcmZhY2VDaGVjayk7CgogICAgU3Vic3RpdHV0aW9uIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0KICAgICAgICBfY29tcHV0ZURlY2xhcmVkU3Vic3RpdHV0aW9uKHR5cGVzLCBkZWNsYXJlZE1lbWJlcik7CgogICAgX2NoZWNrVHlwZXMoCiAgICAgICAgdHlwZXMsCiAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICBkZWNsYXJlZEZ1bmN0aW9uLnJldHVyblR5cGUsCiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24ucmV0dXJuVHlwZSwKICAgICAgICBmYWxzZSwKICAgICAgICBudWxsLAogICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgaWYgKGRlY2xhcmVkRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIDwKICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmVwb3J0SW52YWxpZE92ZXJyaWRlKAogICAgICAgICAgaXNJbnRlcmZhY2VDaGVjaywKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgICAgdGVtcGxhdGVPdmVycmlkZUZld2VyUG9zaXRpb25hbEFyZ3VtZW50cy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGludGVyZmFjZU1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgIF0pOwogICAgfQogICAgaWYgKGludGVyZmFjZUZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPAogICAgICAgIGRlY2xhcmVkRnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICByZXBvcnRJbnZhbGlkT3ZlcnJpZGUoCiAgICAgICAgICBpc0ludGVyZmFjZUNoZWNrLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTW9yZVJlcXVpcmVkQXJndW1lbnRzLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWV9IiwKICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3MubmFtZX0uIgogICAgICAgICAgICAgICAgICAiJHtpbnRlcmZhY2VNZW1iZXIubmFtZS5uYW1lfSIpLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oaW50ZXJmYWNlTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgXSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsKICAgICAgICBpIDwgZGVjbGFyZWRGdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggJiYKICAgICAgICAgICAgaSA8IGludGVyZmFjZUZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICBpKyspIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJlZFBhcmFtZXRlciA9CiAgICAgICAgICBkZWNsYXJlZEZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGludGVyZmFjZVBhcmFtZXRlciA9CiAgICAgICAgICBpbnRlcmZhY2VGdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgX2NoZWNrVHlwZXMoCiAgICAgICAgICB0eXBlcywKICAgICAgICAgIGludGVyZmFjZVN1YnN0aXR1dGlvbiwKICAgICAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIsCiAgICAgICAgICBkZWNsYXJlZFBhcmFtZXRlci50eXBlLAogICAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0udHlwZSwKICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLmlzQ292YXJpYW50IHx8IGludGVyZmFjZVBhcmFtZXRlci5pc0NvdmFyaWFudCwKICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLAogICAgICAgICAgaXNJbnRlcmZhY2VDaGVjayk7CiAgICAgIGlmIChkZWNsYXJlZFBhcmFtZXRlci5pc0NvdmFyaWFudCkgc2VlbkNvdmFyaWFudCA9IHRydWU7CiAgICB9CiAgICBpZiAoZGVjbGFyZWRGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMuaXNFbXB0eSAmJgogICAgICAgIGludGVyZmFjZUZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycy5pc0VtcHR5KSB7CiAgICAgIHJldHVybiBzZWVuQ292YXJpYW50OwogICAgfQogICAgaWYgKGRlY2xhcmVkRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCA8CiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXBvcnRJbnZhbGlkT3ZlcnJpZGUoCiAgICAgICAgICBpc0ludGVyZmFjZUNoZWNrLAogICAgICAgICAgZGVjbGFyZWRNZW1iZXIsCiAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlRmV3ZXJOYW1lZEFyZ3VtZW50cy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIke2RlY2xhcmVkTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7ZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lfSIsCiAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLm5hbWUubmFtZX0iKSwKICAgICAgICAgIGRlY2xhcmVkTWVtYmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2UKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGludGVyZmFjZU1lbWJlci5maWxlVXJpLAogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgIF0pOwogICAgfQogICAgaW50IGNvbXBhcmVOYW1lZFBhcmFtZXRlcnMoVmFyaWFibGVEZWNsYXJhdGlvbiBwMCwgVmFyaWFibGVEZWNsYXJhdGlvbiBwMSkgewogICAgICByZXR1cm4gcDAubmFtZS5jb21wYXJlVG8ocDEubmFtZSk7CiAgICB9CgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBzb3J0ZWRGcm9tRGVjbGFyZWQgPQogICAgICAgIG5ldyBMaXN0LmZyb20oZGVjbGFyZWRGdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpCiAgICAgICAgICAuLnNvcnQoY29tcGFyZU5hbWVkUGFyYW1ldGVycyk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHNvcnRlZEZyb21JbnRlcmZhY2UgPQogICAgICAgIG5ldyBMaXN0LmZyb20oaW50ZXJmYWNlRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKQogICAgICAgICAgLi5zb3J0KGNvbXBhcmVOYW1lZFBhcmFtZXRlcnMpOwogICAgSXRlcmF0b3I8VmFyaWFibGVEZWNsYXJhdGlvbj4gZGVjbGFyZWROYW1lZFBhcmFtZXRlcnMgPQogICAgICAgIHNvcnRlZEZyb21EZWNsYXJlZC5pdGVyYXRvcjsKICAgIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRpb24+IGludGVyZmFjZU5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgc29ydGVkRnJvbUludGVyZmFjZS5pdGVyYXRvcjsKICAgIG91dGVyOgogICAgd2hpbGUgKGRlY2xhcmVkTmFtZWRQYXJhbWV0ZXJzLm1vdmVOZXh0KCkgJiYKICAgICAgICBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMubW92ZU5leHQoKSkgewogICAgICB3aGlsZSAoZGVjbGFyZWROYW1lZFBhcmFtZXRlcnMuY3VycmVudC5uYW1lICE9CiAgICAgICAgICBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMuY3VycmVudC5uYW1lKSB7CiAgICAgICAgaWYgKCFkZWNsYXJlZE5hbWVkUGFyYW1ldGVycy5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICByZXBvcnRJbnZhbGlkT3ZlcnJpZGUoCiAgICAgICAgICAgICAgaXNJbnRlcmZhY2VDaGVjaywKICAgICAgICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlci53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5lbmNsb3NpbmdDbGFzcy5uYW1lfS4iCiAgICAgICAgICAgICAgICAgICAgICAiJHtkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWV9IiwKICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZWRQYXJhbWV0ZXJzLmN1cnJlbnQubmFtZSwKICAgICAgICAgICAgICAgICAgIiR7aW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLm5hbWV9LiIKICAgICAgICAgICAgICAgICAgICAgICIke2ludGVyZmFjZU1lbWJlci5uYW1lLm5hbWV9IiksCiAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU92ZXJyaWRkZW5NZXRob2RDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZU1lbWJlci5uYW1lLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihpbnRlcmZhY2VNZW1iZXIuZmlsZVVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgICAgYnJlYWsgb3V0ZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyZWRQYXJhbWV0ZXIgPSBkZWNsYXJlZE5hbWVkUGFyYW1ldGVycy5jdXJyZW50OwogICAgICBfY2hlY2tUeXBlcygKICAgICAgICAgIHR5cGVzLAogICAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgICAgZGVjbGFyZWRTdWJzdGl0dXRpb24sCiAgICAgICAgICBkZWNsYXJlZE1lbWJlciwKICAgICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICAgIGRlY2xhcmVkUGFyYW1ldGVyLnR5cGUsCiAgICAgICAgICBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMuY3VycmVudC50eXBlLAogICAgICAgICAgZGVjbGFyZWRQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQsCiAgICAgICAgICBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgICBpZiAoZGVjbGFyZWRQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHNlZW5Db3ZhcmlhbnQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHNlZW5Db3ZhcmlhbnQ7CiAgfQoKICB2b2lkIGNoZWNrR2V0dGVyT3ZlcnJpZGUoVHlwZXMgdHlwZXMsIE1lbWJlciBkZWNsYXJlZE1lbWJlciwKICAgICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciwgYm9vbCBpc0ludGVyZmFjZUNoZWNrKSB7CiAgICBTdWJzdGl0dXRpb24gaW50ZXJmYWNlU3Vic3RpdHV0aW9uID0gX2NvbXB1dGVJbnRlcmZhY2VTdWJzdGl0dXRpb24oCiAgICAgICAgdHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIG51bGwsIG51bGwsIGlzSW50ZXJmYWNlQ2hlY2spOwogICAgU3Vic3RpdHV0aW9uIGRlY2xhcmVkU3Vic3RpdHV0aW9uID0KICAgICAgICBfY29tcHV0ZURlY2xhcmVkU3Vic3RpdHV0aW9uKHR5cGVzLCBkZWNsYXJlZE1lbWJlcik7CiAgICBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUgPSBkZWNsYXJlZE1lbWJlci5nZXR0ZXJUeXBlOwogICAgRGFydFR5cGUgaW50ZXJmYWNlVHlwZSA9IGludGVyZmFjZU1lbWJlci5nZXR0ZXJUeXBlOwogICAgX2NoZWNrVHlwZXMoCiAgICAgICAgdHlwZXMsCiAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICBkZWNsYXJlZFR5cGUsCiAgICAgICAgaW50ZXJmYWNlVHlwZSwKICAgICAgICBmYWxzZSwKICAgICAgICBudWxsLAogICAgICAgIGlzSW50ZXJmYWNlQ2hlY2spOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja1NldHRlck92ZXJyaWRlKFR5cGVzIHR5cGVzLCBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNJbnRlcmZhY2VDaGVjaykgewogICAgU3Vic3RpdHV0aW9uIGludGVyZmFjZVN1YnN0aXR1dGlvbiA9IF9jb21wdXRlSW50ZXJmYWNlU3Vic3RpdHV0aW9uKAogICAgICAgIHR5cGVzLCBkZWNsYXJlZE1lbWJlciwgaW50ZXJmYWNlTWVtYmVyLCBudWxsLCBudWxsLCBpc0ludGVyZmFjZUNoZWNrKTsKICAgIFN1YnN0aXR1dGlvbiBkZWNsYXJlZFN1YnN0aXR1dGlvbiA9CiAgICAgICAgX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbih0eXBlcywgZGVjbGFyZWRNZW1iZXIpOwogICAgRGFydFR5cGUgZGVjbGFyZWRUeXBlID0gZGVjbGFyZWRNZW1iZXIuc2V0dGVyVHlwZTsKICAgIERhcnRUeXBlIGludGVyZmFjZVR5cGUgPSBpbnRlcmZhY2VNZW1iZXIuc2V0dGVyVHlwZTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyZWRQYXJhbWV0ZXIgPQogICAgICAgIGRlY2xhcmVkTWVtYmVyLmZ1bmN0aW9uPy5wb3NpdGlvbmFsUGFyYW1ldGVycz8uZWxlbWVudEF0KDApOwogICAgYm9vbCBpc0NvdmFyaWFudCA9IGRlY2xhcmVkUGFyYW1ldGVyPy5pc0NvdmFyaWFudCA/PyBmYWxzZTsKICAgIGlmICghaXNDb3ZhcmlhbnQgJiYgZGVjbGFyZWRNZW1iZXIgaXMgRmllbGQpIHsKICAgICAgaXNDb3ZhcmlhbnQgPSBkZWNsYXJlZE1lbWJlci5pc0NvdmFyaWFudDsKICAgIH0KICAgIGlmICghaXNDb3ZhcmlhbnQgJiYgaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIGlzQ292YXJpYW50ID0gaW50ZXJmYWNlTWVtYmVyLmlzQ292YXJpYW50OwogICAgfQogICAgX2NoZWNrVHlwZXMoCiAgICAgICAgdHlwZXMsCiAgICAgICAgaW50ZXJmYWNlU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkU3Vic3RpdHV0aW9uLAogICAgICAgIGRlY2xhcmVkTWVtYmVyLAogICAgICAgIGludGVyZmFjZU1lbWJlciwKICAgICAgICBkZWNsYXJlZFR5cGUsCiAgICAgICAgaW50ZXJmYWNlVHlwZSwKICAgICAgICBpc0NvdmFyaWFudCwKICAgICAgICBkZWNsYXJlZFBhcmFtZXRlciwKICAgICAgICBpc0ludGVyZmFjZUNoZWNrLAogICAgICAgIGFzSWZEZWNsYXJlZFBhcmFtZXRlcjogdHJ1ZSk7CiAgICByZXR1cm4gaXNDb3ZhcmlhbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydEludmFsaWRPdmVycmlkZShib29sIGlzSW50ZXJmYWNlQ2hlY2ssIE1lbWJlciBkZWNsYXJlZE1lbWJlciwKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBpbnQgZmlsZU9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBpZiAoZGVjbGFyZWRNZW1iZXIuZW5jbG9zaW5nQ2xhc3MgPT0gY2xzKSB7CiAgICAgIC8vIE9yZGluYXJ5IG92ZXJyaWRlCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBmaWxlT2Zmc2V0LCBsZW5ndGgsIGRlY2xhcmVkTWVtYmVyLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRleHQgPSBbCiAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZGVjbGFyZWRNZW1iZXIuZmlsZVVyaSwgZmlsZU9mZnNldCwgbGVuZ3RoKSwKICAgICAgICAuLi4/Y29udGV4dAogICAgICBdOwogICAgICBpZiAoaXNJbnRlcmZhY2VDaGVjaykgewogICAgICAgIC8vIEludGVyZmFjZSBjaGVjawogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVJbnRlcmZhY2VDaGVjay53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lLCBjbHMubmFtZSksCiAgICAgICAgICAgIGNscy5maWxlT2Zmc2V0LAogICAgICAgICAgICBjbHMubmFtZS5sZW5ndGgsCiAgICAgICAgICAgIGNscy5maWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY2xzLmlzQW5vbnltb3VzTWl4aW4pIHsKICAgICAgICAgIC8vIEltcGxpY2l0IG1peGluIGFwcGxpY2F0aW9uIGNsYXNzCiAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBjbHMuc3VwZXJjbGFzcy5kZW1hbmdsZWROYW1lOwogICAgICAgICAgU3RyaW5nIG1peGluTmFtZSA9IGNscy5taXhlZEluQ2xhc3MubmFtZTsKICAgICAgICAgIGludCBjbGFzc05hbWVMZW5ndGggPSBjbHMubmFtZUFzTWl4aW5BcHBsaWNhdGlvblN1YmNsYXNzLmxlbmd0aDsKICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0TWl4aW5PdmVycmlkZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBtaXhpbk5hbWUsIGJhc2VOYW1lLCBkZWNsYXJlZE1lbWJlci5uYW1lLm5hbWUpLAogICAgICAgICAgICAgIGNscy5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIGNsYXNzTmFtZUxlbmd0aCwKICAgICAgICAgICAgICBjbHMuZmlsZVVyaSwKICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTmFtZWQgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MKICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZU5hbWVkTWl4aW5PdmVycmlkZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBjbHMubmFtZSwgZGVjbGFyZWRNZW1iZXIubmFtZS5uYW1lKSwKICAgICAgICAgICAgICBjbHMuZmlsZU9mZnNldCwKICAgICAgICAgICAgICBjbHMubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgY2xzLmZpbGVVcmksCiAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzIHsKICAgIHJldHVybiBpc01peGluQXBwbGljYXRpb24gJiYgIWlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uCiAgICAgICAgPyAiJHtzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnN9IHdpdGggJHttaXhlZEluVHlwZS5mdWxsTmFtZUZvckVycm9yc30iCiAgICAgICAgOiBuYW1lOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja01peGluQXBwbGljYXRpb24oQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5LCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICAvLyBBIG1peGluIGRlY2xhcmF0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYWxsCiAgICAvLyB0aGUgZGVjbGFyYXRpb24ncyBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzLgogICAgSW50ZXJmYWNlVHlwZSBzdXBlcnR5cGUgPSBjbHMuc3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZTsKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShjbHMubWl4ZWRJblR5cGUpOwogICAgZm9yIChTdXBlcnR5cGUgY29uc3RyYWludCBpbiBjbHMubWl4ZWRJbkNsYXNzLnN1cGVyY2xhc3NDb25zdHJhaW50cygpKSB7CiAgICAgIEludGVyZmFjZVR5cGUgaW50ZXJmYWNlID0KICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKGNvbnN0cmFpbnQpLmFzSW50ZXJmYWNlVHlwZTsKICAgICAgaWYgKGhpZXJhcmNoeS5nZXRUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgICAgICAgIHN1cGVydHlwZSwgaW50ZXJmYWNlLmNsYXNzTm9kZSwgbGlicmFyeS5saWJyYXJ5LCBjb3JlVHlwZXMpICE9CiAgICAgICAgICBpbnRlcmZhY2UpIHsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgc3VwZXJ0eXBlLAogICAgICAgICAgICAgICAgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgY2xzLm1peGVkSW5UeXBlLmFzSW50ZXJmYWNlVHlwZSwKICAgICAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgIGNscy5maWxlT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgY2xzLmZpbGVVcmkpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5UGF0Y2goQnVpbGRlciBwYXRjaCkgewogICAgaWYgKHBhdGNoIGlzIENsYXNzQnVpbGRlcikgewogICAgICBwYXRjaC5hY3R1YWxPcmlnaW4gPSB0aGlzOwogICAgICBpZiAocmV0YWluRGF0YUZvclRlc3RpbmcpIHsKICAgICAgICBwYXRjaEZvclRlc3RpbmcgPSBwYXRjaDsKICAgICAgfQogICAgICAvLyBUT0RPKGFoZSk6IENvbXBsYWluIGlmIGBwYXRjaC5zdXBlcnR5cGVgIGlzbid0IG51bGwuCiAgICAgIHNjb3BlLmZvckVhY2hMb2NhbE1lbWJlcigoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgICAgQnVpbGRlciBtZW1iZXJQYXRjaCA9CiAgICAgICAgICAgIHBhdGNoLnNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKG5hbWUsIHNldHRlcjogZmFsc2UpOwogICAgICAgIGlmIChtZW1iZXJQYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICBtZW1iZXIuYXBwbHlQYXRjaChtZW1iZXJQYXRjaCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgc2NvcGUuZm9yRWFjaExvY2FsU2V0dGVyKChTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIHsKICAgICAgICBCdWlsZGVyIG1lbWJlclBhdGNoID0gcGF0Y2guc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgICAgICBpZiAobWVtYmVyUGF0Y2ggIT0gbnVsbCkgewogICAgICAgICAgbWVtYmVyLmFwcGx5UGF0Y2gobWVtYmVyUGF0Y2gpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGNvbnN0cnVjdG9ycy5sb2NhbC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIHsKICAgICAgICBCdWlsZGVyIG1lbWJlclBhdGNoID0gcGF0Y2guY29uc3RydWN0b3JzLmxvY2FsW25hbWVdOwogICAgICAgIGlmIChtZW1iZXJQYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICBtZW1iZXIuYXBwbHlQYXRjaChtZW1iZXJQYXRjaCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGludCBvcmlnaW5MZW5ndGggPSB0eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMDsKICAgICAgaW50IHBhdGNoTGVuZ3RoID0gcGF0Y2gudHlwZVZhcmlhYmxlcz8ubGVuZ3RoID8/IDA7CiAgICAgIGlmIChvcmlnaW5MZW5ndGggIT0gcGF0Y2hMZW5ndGgpIHsKICAgICAgICBwYXRjaC5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaENsYXNzVHlwZVZhcmlhYmxlc01pc21hdGNoLAogICAgICAgICAgICBwYXRjaC5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgY29udGV4dDogWwogICAgICAgICAgbWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW4ud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgIF0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHQgaW4gcGF0Y2gudHlwZVZhcmlhYmxlcykgewogICAgICAgICAgdHlwZVZhcmlhYmxlc1tjb3VudCsrXS5hcHBseVBhdGNoKHQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsIHBhdGNoLmNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwgcGF0Y2guZmlsZVVyaSwgY29udGV4dDogWwogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgIF0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25UeXBlIGNvbXB1dGVSZWRpcmVjdGVlVHlwZSgKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlciBmYWN0b3J5LCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50KSB7CiAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQgPSBmYWN0b3J5LnJlZGlyZWN0aW9uVGFyZ2V0OwogICAgRnVuY3Rpb25Ob2RlIHRhcmdldDsKICAgIGlmIChyZWRpcmVjdGlvblRhcmdldC50YXJnZXQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAocmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0IGlzIEZ1bmN0aW9uQnVpbGRlcikgewogICAgICBGdW5jdGlvbkJ1aWxkZXIgdGFyZ2V0QnVpbGRlciA9IHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldDsKICAgICAgdGFyZ2V0ID0gdGFyZ2V0QnVpbGRlci5mdW5jdGlvbjsKICAgIH0gZWxzZSBpZiAocmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0IGlzIERpbGxNZW1iZXJCdWlsZGVyICYmCiAgICAgICAgKHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldC5pc0NvbnN0cnVjdG9yIHx8CiAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldC5pc0ZhY3RvcnkpKSB7CiAgICAgIERpbGxNZW1iZXJCdWlsZGVyIHRhcmdldEJ1aWxkZXIgPSByZWRpcmVjdGlvblRhcmdldC50YXJnZXQ7CiAgICAgIC8vIEl0IHNlZW1zIHRoYXQgdGhlIFtyZWRpcmVjdGlvblRhcmdldC50YXJnZXRdIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgIC8vIFtEaWxsTWVtYmVyQnVpbGRlcl0gd2hlbmV2ZXIgdGhlIHJlZGlyZWN0ZWUgaXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IsCiAgICAgIC8vIGUuZy4KICAgICAgLy8KICAgICAgLy8gICBjbGFzcyBBIHsKICAgICAgLy8gICAgIGZhY3RvcnkgQSgpID0gQjsKICAgICAgLy8gICB9CiAgICAgIC8vICAgY2xhc3MgQiBpbXBsZW1lbnRzIEEge30KICAgICAgLy8KICAgICAgdGFyZ2V0ID0gdGFyZ2V0QnVpbGRlci5tZW1iZXIuZnVuY3Rpb247CiAgICB9IGVsc2UgaWYgKHJlZGlyZWN0aW9uVGFyZ2V0LnRhcmdldCBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgIC8vIE11bHRpcGxlIGRlZmluaXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZTogQW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbgogICAgICAvLyBpc3N1ZWQuCiAgICAgIC8vIFRPRE8oaHR0cDovL2RhcnRidWcuY29tLzM1Mjk0KTogVW5mb3J0dW5hdGUgZXJyb3I7IHNlZSBhbHNvCiAgICAgIC8vIGh0dHBzOi8vZGFydC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS9jL3Nkay8rLzg1MzkwLy4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7cmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0fSIsICJjb21wdXRlUmVkaXJlY3RlZVR5cGUiLAogICAgICAgICAgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CgogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShmYWN0b3J5LnByb2NlZHVyZSkudHlwZUFyZ3VtZW50czsKICAgIEZ1bmN0aW9uVHlwZSB0YXJnZXRGdW5jdGlvblR5cGUgPQogICAgICAgIHRhcmdldC5jb21wdXRlRnVuY3Rpb25UeXBlKGxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJgogICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gdHlwZUFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0YXJnZXRGdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKSwKICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIHN1YnN0aXR1dGlvbiBvZiB0aGUgdGFyZ2V0IGNsYXNzIHR5cGUgcGFyYW1ldGVycyBpZgogICAgLy8gW3JlZGlyZWN0aW9uVGFyZ2V0XSBoYXMgYW55IHR5cGUgYXJndW1lbnRzLgogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKICAgIGJvb2wgaGFzUHJvYmxlbSA9IGZhbHNlOwogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCAmJiB0eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdGFyZ2V0RnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIERhcnRUeXBlIHR5cGVQYXJhbWV0ZXJCb3VuZCA9CiAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0eXBlUGFyYW1ldGVyLmJvdW5kKTsKICAgICAgICBEYXJ0VHlwZSB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOwogICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIFt0eXBlQXJndW1lbnRdIHJlc3BlY3RzIHRoZSBib3VuZHMgb2YKICAgICAgICAvLyBbdHlwZVBhcmFtZXRlcl0uCiAgICAgICAgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YodHlwZUFyZ3VtZW50LCB0eXBlUGFyYW1ldGVyQm91bmQsCiAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZGlyZWN0aW5nRmFjdG9yeUluY29tcGF0aWJsZVR5cGVBcmd1bWVudC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJCb3VuZCwKICAgICAgICAgICAgICAgICAgbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICByZWRpcmVjdGlvblRhcmdldC5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgICAgIGhhc1Byb2JsZW0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlQXJndW1lbnRzID09IG51bGwgJiYKICAgICAgICB0YXJnZXRGdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewogICAgICAvLyBUT0RPKGhpbGxlcnN0cm9tKTogSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHBlcmZvcm0gdHlwZSBpbmZlcmVuY2Ugb24KICAgICAgLy8gdGhlIHJlZGlyZWN0ZWUgdG8gb2J0YWluIGFjdHVhbCB0eXBlIGFyZ3VtZW50cyB3aGljaCB3b3VsZCBhbGxvdyB0aGUKICAgICAgLy8gZm9sbG93aW5nIHByb2dyYW0gdG8gdHlwZSBjaGVjazoKICAgICAgLy8KICAgICAgLy8gICAgY2xhc3MgQTxUPiB7CiAgICAgIC8vICAgICAgIGZhY3RvcnkgQSgpID0gQjsKICAgICAgLy8gICAgfQogICAgICAvLyAgICBjbGFzcyBCPFQ+IGltcGxlbWVudHMgQTxUPiB7CiAgICAgIC8vICAgICAgIEIoKTsKICAgICAgLy8gICAgfQogICAgICAvLwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBTdWJzdGl0dXRlIGlmIG5lY2Vzc2FyeS4KICAgIHRhcmdldEZ1bmN0aW9uVHlwZSA9IHN1YnN0aXR1dGlvbiA9PSBudWxsCiAgICAgICAgPyB0YXJnZXRGdW5jdGlvblR5cGUKICAgICAgICA6IChzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodGFyZ2V0RnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVycykKICAgICAgICAgICAgYXMgRnVuY3Rpb25UeXBlKTsKCiAgICByZXR1cm4gaGFzUHJvYmxlbSA/IG51bGwgOiB0YXJnZXRGdW5jdGlvblR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgY29tcHV0ZVJlZGlyZWN0ZWVOYW1lKENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldCkgewogICAgU3RyaW5nIHRhcmdldE5hbWUgPSByZWRpcmVjdGlvblRhcmdldC5mdWxsTmFtZUZvckVycm9yczsKICAgIGlmICh0YXJnZXROYW1lID09ICIiKSB7CiAgICAgIHJldHVybiByZWRpcmVjdGlvblRhcmdldC50YXJnZXQucGFyZW50LmZ1bGxOYW1lRm9yRXJyb3JzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRhcmdldE5hbWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrUmVkaXJlY3RpbmdGYWN0b3J5KAogICAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyIGZhY3RvcnksIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIC8vIFRoZSBmYWN0b3J5IHR5cGUgY2Fubm90IGNvbnRhaW4gYW55IHR5cGUgcGFyYW1ldGVycyBvdGhlciB0aGFuIHRob3NlIG9mCiAgICAvLyBpdHMgZW5jbG9zaW5nIGNsYXNzLCBiZWNhdXNlIGNvbnN0cnVjdG9ycyBjYW5ub3Qgc3BlY2lmeSB0eXBlIHBhcmFtZXRlcnMKICAgIC8vIG9mIHRoZWlyIG93bi4KICAgIEZ1bmN0aW9uVHlwZSBmYWN0b3J5VHlwZSA9IGZhY3RvcnkucHJvY2VkdXJlLmZ1bmN0aW9uCiAgICAgICAgLmNvbXB1dGVUaGlzRnVuY3Rpb25UeXBlKGxpYnJhcnkubm9uTnVsbGFibGUpCiAgICAgICAgLndpdGhvdXRUeXBlUGFyYW1ldGVyczsKICAgIEZ1bmN0aW9uVHlwZSByZWRpcmVjdGVlVHlwZSA9CiAgICAgICAgY29tcHV0ZVJlZGlyZWN0ZWVUeXBlKGZhY3RvcnksIHR5cGVFbnZpcm9ubWVudCk7CgogICAgLy8gVE9ETyhoaWxsZXJzdHJvbSk6IEl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8ga25vdyB3aGV0aGVyIGEgZmFpbHVyZQogICAgLy8gaGFwcGVuZWQgZHVyaW5nIFtfY29tcHV0ZVJlZGlyZWN0ZWVUeXBlXS4KICAgIGlmIChyZWRpcmVjdGVlVHlwZSA9PSBudWxsKSByZXR1cm47CgogICAgLy8gQ2hlY2sgd2hldGhlciBbcmVkaXJlY3RlZVR5cGVdIDw6IFtmYWN0b3J5VHlwZV0uCiAgICBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICByZWRpcmVjdGVlVHlwZSwgZmFjdG9yeVR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbmNvbXBhdGlibGVSZWRpcmVjdGVlRnVuY3Rpb25UeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgcmVkaXJlY3RlZVR5cGUsIGZhY3RvcnlUeXBlLCBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgZmFjdG9yeS5yZWRpcmVjdGlvblRhcmdldC5jaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjaGVja1JlZGlyZWN0aW5nRmFjdG9yaWVzKFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQpIHsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IHRoaXMuY29uc3RydWN0b3JzLmxvY2FsOwogICAgSXRlcmFibGU8U3RyaW5nPiBuYW1lcyA9IGNvbnN0cnVjdG9ycy5rZXlzOwogICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lcykgewogICAgICBCdWlsZGVyIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JzW25hbWVdOwogICAgICBkbyB7CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yIGlzIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIpIHsKICAgICAgICAgIGNoZWNrUmVkaXJlY3RpbmdGYWN0b3J5KGNvbnN0cnVjdG9yLCB0eXBlRW52aXJvbm1lbnQpOwogICAgICAgIH0KICAgICAgICBjb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yLm5leHQ7CiAgICAgIH0gd2hpbGUgKGNvbnN0cnVjdG9yICE9IG51bGwpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBnZXRTdWJzdGl0dXRpb25NYXAoQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgU3VwZXJ0eXBlIHN1cGVydHlwZSA9IGNscy5zdXBlcnR5cGU7CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbk1hcCA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50czsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdmFyaWFibGVzOwogICAgQ2xhc3MgY2xhc3NOb2RlOwoKICAgIHdoaWxlIChjbGFzc05vZGUgIT0gc3VwZXJjbGFzcykgewogICAgICBjbGFzc05vZGUgPSBzdXBlcnR5cGUuY2xhc3NOb2RlOwogICAgICBhcmd1bWVudHMgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50czsKICAgICAgdmFyaWFibGVzID0gY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzOwogICAgICBzdXBlcnR5cGUgPSBjbGFzc05vZGUuc3VwZXJ0eXBlOwogICAgICBpZiAodmFyaWFibGVzLmlzTm90RW1wdHkpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGRpcmVjdFN1YnN0aXR1dGlvbk1hcCA9CiAgICAgICAgICAgIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgRGFydFR5cGUgYXJndW1lbnQgPQogICAgICAgICAgICAgIGkgPCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzW2ldIDogY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25NYXAgIT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IEludmVzdGlnYXRlIGlmIHJlcXVpcmluZyB0aGUgY2FsbGVyIHRvIHVzZQogICAgICAgICAgICAvLyBgc3Vic3RpdHV0ZURlZXBgIGZyb20gYHBhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0YCBpbnN0ZWFkCiAgICAgICAgICAgIC8vIG9mIGBzdWJzdGl0dXRlYCBpcyBmYXN0ZXIuIElmIHNvLCB3ZSBjYW4gc2ltcGx5IHRoaXMgY29kZS4KICAgICAgICAgICAgYXJndW1lbnQgPSBzdWJzdGl0dXRlKGFyZ3VtZW50LCBzdWJzdGl0dXRpb25NYXApOwogICAgICAgICAgfQogICAgICAgICAgZGlyZWN0U3Vic3RpdHV0aW9uTWFwW3ZhcmlhYmxlc1tpXV0gPSBhcmd1bWVudDsKICAgICAgICB9CiAgICAgICAgc3Vic3RpdHV0aW9uTWFwID0gZGlyZWN0U3Vic3RpdHV0aW9uTWFwOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHN1YnN0aXR1dGlvbk1hcDsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBsb29rdXBJbnN0YW5jZU1lbWJlcihDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksIE5hbWUgbmFtZSwKICAgICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlLCBib29sIGlzU3VwZXI6IGZhbHNlfSkgewogICAgQ2xhc3MgaW5zdGFuY2VDbGFzcyA9IGNsczsKICAgIGlmIChpc1BhdGNoKSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoaW5zdGFuY2VDbGFzcywgb3JpZ2luLmNscyksCiAgICAgICAgICAiRm91bmQgJHtvcmlnaW4uY2xzfSBleHBlY3RlZCAkaW5zdGFuY2VDbGFzcyIpOwogICAgICBpZiAoaXNTdXBlcikgewogICAgICAgIC8vIFRoZSBzdXBlciBjbGFzcyBpcyBvbmx5IGNvcnJlY3RseSBmb3VuZCB0aHJvdWdoIHRoZSBvcmlnaW4gY2xhc3MuCiAgICAgICAgaW5zdGFuY2VDbGFzcyA9IG9yaWdpbi5jbHM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTWVtYmVyIG1lbWJlciA9CiAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoaW5zdGFuY2VDbGFzcywgbmFtZSwgc2V0dGVyOiBpc1NldHRlcik7CiAgICAgICAgaWYgKG1lbWJlcj8ucGFyZW50ID09IGluc3RhbmNlQ2xhc3MpIHsKICAgICAgICAgIC8vIE9ubHkgaWYgdGhlIG1lbWJlciBpcyBmb3VuZCBpbiB0aGUgcGF0Y2ggY2FuIHdlIHVzZSBpdC4KICAgICAgICAgIHJldHVybiBtZW1iZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBrZWVwIHNlYXJjaGluZyBpbiB0aGUgb3JpZ2luIGNsYXNzLgogICAgICAgICAgaW5zdGFuY2VDbGFzcyA9IG9yaWdpbi5jbHM7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGlzU3VwZXIpIHsKICAgICAgaW5zdGFuY2VDbGFzcyA9IGluc3RhbmNlQ2xhc3Muc3VwZXJjbGFzczsKICAgICAgaWYgKGluc3RhbmNlQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICB9CiAgICBNZW1iZXIgdGFyZ2V0ID0gaXNTdXBlcgogICAgICAgID8gaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0KGluc3RhbmNlQ2xhc3MsIG5hbWUsIHNldHRlcjogaXNTZXR0ZXIpCiAgICAgICAgOiBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKGluc3RhbmNlQ2xhc3MsIG5hbWUsIHNldHRlcjogaXNTZXR0ZXIpOwogICAgaWYgKGlzU3VwZXIgJiYgdGFyZ2V0ID09IG51bGwpIHsKICAgICAgaWYgKGNscy5pc01peGluRGVjbGFyYXRpb24gfHwKICAgICAgICAgIChsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5lbmFibGVTdXBlck1peGlucyAmJgogICAgICAgICAgICAgIHRoaXMuaXNBYnN0cmFjdCkpIHsKICAgICAgICB0YXJnZXQgPQogICAgICAgICAgICBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKGluc3RhbmNlQ2xhc3MsIG5hbWUsIHNldHRlcjogaXNTZXR0ZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3IgbG9va3VwQ29uc3RydWN0b3IoTmFtZSBuYW1lLCB7Ym9vbCBpc1N1cGVyOiBmYWxzZX0pIHsKICAgIENsYXNzIGluc3RhbmNlQ2xhc3MgPSBjbHM7CiAgICBpZiAoaXNTdXBlcikgewogICAgICBpbnN0YW5jZUNsYXNzID0gaW5zdGFuY2VDbGFzcy5zdXBlcmNsYXNzOwogICAgfQogICAgaWYgKGluc3RhbmNlQ2xhc3MgIT0gbnVsbCkgewogICAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIGluc3RhbmNlQ2xhc3MuY29uc3RydWN0b3JzKSB7CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGNvbnN0cnVjdG9yOwogICAgICB9CiAgICB9CgogICAgLy8vIFBlcmZvcm1zIGEgc2ltaWxhciBsb29rdXAgdG8gW2xvb2t1cENvbnN0cnVjdG9yXSwgYnV0IHVzaW5nIGEgc2xvd2VyCiAgICAvLy8gaW1wbGVtZW50YXRpb24uCiAgICBDb25zdHJ1Y3RvciBsb29rdXBDb25zdHJ1Y3RvcldpdGhQYXRjaGVzKE5hbWUgbmFtZSwgYm9vbCBpc1N1cGVyKSB7CiAgICAgIENsYXNzQnVpbGRlciBidWlsZGVyID0gdGhpcy5vcmlnaW47CgogICAgICBDbGFzc0J1aWxkZXIgZ2V0U3VwZXJjbGFzcyhDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgICAgIC8vIFRoaXMgd2F5IG9mIGNvbXB1dGluZyB0aGUgc3VwZXJjbGFzcyBpcyBzbG93ZXIgdGhhbiB1c2luZyB0aGUga2VybmVsCiAgICAgICAgLy8gb2JqZWN0cyBkaXJlY3RseS4KICAgICAgICBPYmplY3Qgc3VwZXJ0eXBlID0gYnVpbGRlci5zdXBlcnR5cGU7CiAgICAgICAgaWYgKHN1cGVydHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgICAgICBPYmplY3QgYnVpbGRlciA9IHN1cGVydHlwZS5kZWNsYXJhdGlvbjsKICAgICAgICAgIGlmIChidWlsZGVyIGlzIENsYXNzQnVpbGRlcikgcmV0dXJuIGJ1aWxkZXI7CiAgICAgICAgICBpZiAoYnVpbGRlciBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb25CdWlsZGVyID0KICAgICAgICAgICAgICAgIGJ1aWxkZXIudW5hbGlhc0RlY2xhcmF0aW9uOwogICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25CdWlsZGVyIGlzIENsYXNzQnVpbGRlcikgcmV0dXJuIGRlY2xhcmF0aW9uQnVpbGRlcjsKICAgICAgICAgIH0KICAg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aXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5saWJyYXJ5X2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTGlicmFyeSwgTnVsbGFiaWxpdHk7CgppbXBvcnQgJy4uL2NvbWJpbmF0b3IuZGFydCcgc2hvdyBDb21iaW5hdG9yOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbSwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvcm1hdHRlZE1lc3NhZ2UsCiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmQsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2ZpZWxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbW9kaWZpZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICduYW1lX2l0ZXJhdG9yLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAncHJlZml4X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIExpYnJhcnlCdWlsZGVyIGltcGxlbWVudHMgTW9kaWZpZXJCdWlsZGVyIHsKICBTY29wZSBnZXQgc2NvcGU7CgogIFNjb3BlIGdldCBleHBvcnRTY29wZTsKCiAgU2NvcGVCdWlsZGVyIGdldCBzY29wZUJ1aWxkZXI7CgogIFNjb3BlQnVpbGRlciBnZXQgZXhwb3J0U2NvcGVCdWlsZGVyOwoKICBMaXN0PEV4cG9ydD4gZ2V0IGV4cG9ydGVyczsKCiAgTGlicmFyeUJ1aWxkZXIgcGFydE9mTGlicmFyeTsKCiAgYm9vbCBtYXlJbXBsZW1lbnRSZXN0cmljdGVkVHlwZXM7CgogIC8vLyBTZXQgdGhlIGxhbmd1YWdlIHZlcnNpb24gdG8gYSBzcGVjaWZpYyBub24tbnVsbCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbi4KICAvLy8KICAvLy8gSWYgdGhlIGxhbmd1YWdlIHZlcnNpb24gaGFzIHByZXZpb3VzbHkgYmVlbiBleHBsaWNpdGx5IHNldCBzZXQgKGkuZS4gd2l0aAogIC8vLyBbZXhwbGljaXRdIHNldCB0byB0cnVlKSwgYW55IHN1YnNlcXVlbnQgY2FsbCAoZXhwbGljaXQgb3Igbm90KSBzaG91bGQgYmUKICAvLy8gaWdub3JlZC4KICAvLy8gTXVsdGlwbGUgY2FsbHMgd2l0aCBbZXhwbGljaXRdIHNldCB0byBmYWxzZSBzaG91bGQgYmUgYWxsb3dlZCB0aG91Z2guCiAgLy8vCiAgLy8vIFRoZSBtYWluIGlkZWEgaXMgdGhhdCB0aGUgLnBhY2thZ2VzIGZpbGUgc3BlY2lmaWVzIGEgZGVmYXVsdCBsYW5ndWFnZQogIC8vLyB2ZXJzaW9uLCBidXQgdGhhdCB0aGUgbGlicmFyeSBjYW4gaGF2ZSBzb3VyY2UgY29kZSB0aGF0IHNwZWNpZmllcyBhbm90aGVyCiAgLy8vIG9uZSB3aGljaCBzaG91bGQgYmUgc3VwcG9ydGVkLCBidXQgc3BlY2lmeWluZyBzZXZlcmFsIGluIGNvZGUgc2hvdWxkIG5vdAogIC8vLyBjaGFuZ2UgYW55dGhpbmcuCiAgLy8vCiAgLy8vIFtvZmZzZXRdIGFuZCBbbGVuZ3RoXSByZWZlcnMgdG8gdGhlIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgY29kZQogIC8vLyBzcGVjaWZ5aW5nIHRoZSBsYW5ndWFnZSB2ZXJzaW9uLgogIHZvaWQgc2V0TGFuZ3VhZ2VWZXJzaW9uKGludCBtYWpvciwgaW50IG1pbm9yLAogICAgICB7aW50IG9mZnNldDogMCwgaW50IGxlbmd0aCwgYm9vbCBleHBsaWNpdH0pOwoKICBib29sIGdldCBpc1BhcnQ7CgogIExvYWRlciBnZXQgbG9hZGVyOwoKICAvLy8gUmV0dXJucyB0aGUgW0xpYnJhcnldIGJ1aWx0IGJ5IHRoaXMgYnVpbGRlci4KICBMaWJyYXJ5IGdldCBsaWJyYXJ5OwoKICAvLy8gUmV0dXJucyB0aGUgaW1wb3J0IHVyaSBmb3IgdGhlIGxpYnJhcnkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCB1cmkgZm9yIHRoZSBsaWJyYXJ5LCBmb3IgaW5zdGFuY2UgJ2RhcnQ6Y29yZScuCiAgVXJpIGdldCBpbXBvcnRVcmk7CgogIEl0ZXJhdG9yPEJ1aWxkZXI+IGdldCBpdGVyYXRvcjsKCiAgTmFtZUl0ZXJhdG9yIGdldCBuYW1lSXRlcmF0b3I7CgogIEJ1aWxkZXIgYWRkQnVpbGRlcihTdHJpbmcgbmFtZSwgQnVpbGRlciBkZWNsYXJhdGlvbiwgaW50IGNoYXJPZmZzZXQpOwoKICB2b2lkIGFkZEV4cG9ydGVyKAogICAgICBMaWJyYXJ5QnVpbGRlciBleHBvcnRlciwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywgaW50IGNoYXJPZmZzZXQpOwoKICAvLy8gQWRkIGEgcHJvYmxlbSB3aXRoIGEgc2V2ZXJpdHkgZGV0ZXJtaW5lZCBieSB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCiAgLy8vCiAgLy8vIElmIFtmaWxlVXJpXSBpcyBudWxsLCBpdCBkZWZhdWx0cyB0byBgdGhpcy5maWxlVXJpYC4KICAvLy8KICAvLy8gU2VlIGBMb2FkZXIuYWRkTWVzc2FnZWAgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZQogIC8vLyBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLgogIEZvcm1hdHRlZE1lc3NhZ2UgYWRkUHJvYmxlbSgKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLAogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0LAogICAgICBTZXZlcml0eSBzZXZlcml0eSwKICAgICAgYm9vbCBwcm9ibGVtT25MaWJyYXJ5OiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBleHBvcnQgc2NvcGUgd2FzIG1vZGlmaWVkLgogIGJvb2wgYWRkVG9FeHBvcnRTY29wZShTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIsIFtpbnQgY2hhck9mZnNldCA9IC0xXSk7CgogIHZvaWQgYWRkVG9TY29wZShTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIsIGludCBjaGFyT2Zmc2V0LCBib29sIGlzSW1wb3J0KTsKCiAgQnVpbGRlciBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBCdWlsZGVyIGRlY2xhcmF0aW9uLCBCdWlsZGVyIG90aGVyLCBpbnQgY2hhck9mZnNldCwKICAgICAge2Jvb2wgaXNFeHBvcnQ6IGZhbHNlLCBib29sIGlzSW1wb3J0OiBmYWxzZX0pOwoKICBpbnQgZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKTsKCiAgaW50IGZpbmlzaEZvcndhcmRlcnMoKTsKCiAgaW50IGZpbmlzaE5hdGl2ZU1ldGhvZHMoKTsKCiAgaW50IGZpbmlzaFBhdGNoTWV0aG9kcygpOwoKICAvLy8gTG9va3MgdXAgW2NvbnN0cnVjdG9yTmFtZV0gaW4gdGhlIGNsYXNzIG5hbWVkIFtjbGFzc05hbWVdLgogIC8vLwogIC8vLyBUaGUgY2xhc3MgaXMgbG9va2VkIHVwIGluIHRoaXMgbGlicmFyeSdzIGV4cG9ydCBzY29wZSB1bmxlc3MKICAvLy8gW2J5cGFzc0xpYnJhcnlQcml2YWN5XSBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGl0IGlzIGxvb2tlZCB1cCBpbiB0aGUKICAvLy8gbGlicmFyeSBzY29wZSBvZiB0aGlzIGxpYnJhcnkuCiAgLy8vCiAgLy8vIEl0IGlzIGFuIGVycm9yIGlmIG5vIHN1Y2ggY2xhc3MgaXMgZm91bmQsIG9yIGlmIHRoZSBjbGFzcyBkb2Vzbid0IGhhdmUgYQogIC8vLyBtYXRjaGluZyBjb25zdHJ1Y3RvciAob3IgZmFjdG9yeSkuCiAgLy8vCiAgLy8vIElmIFtjb25zdHJ1Y3Rvck5hbWVdIGlzIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZywgaXQncyBhc3N1bWVkIHRvIGJlIGFuCiAgLy8vIHVubmFtZWQgY29uc3RydWN0b3IuIGl0J3MgYW4gZXJyb3IgaWYgW2NvbnN0cnVjdG9yTmFtZV0gc3RhcnRzIHdpdGgKICAvLy8gYCJfImAsIGFuZCBbYnlwYXNzTGlicmFyeVByaXZhY3ldIGlzIGZhbHNlLgogIE1lbWJlckJ1aWxkZXIgZ2V0Q29uc3RydWN0b3IoU3RyaW5nIGNsYXNzTmFtZSwKICAgICAge1N0cmluZyBjb25zdHJ1Y3Rvck5hbWUsIGJvb2wgYnlwYXNzTGlicmFyeVByaXZhY3k6IGZhbHNlfSk7CgogIGludCBmaW5pc2hUeXBlVmFyaWFibGVzKENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKTsKCiAgLy8vIENvbXB1dGVzIHZhcmlhbmNlcyBvZiB0eXBlIHBhcmFtZXRlcnMgb24gdHlwZWRlZnMuCiAgLy8vCiAgLy8vIFRoZSB2YXJpYW5jZSBwcm9wZXJ0eSBvZiB0eXBlIHBhcmFtZXRlcnMgb24gdHlwZWRlZnMgaXMgY29tcHV0ZWQgZnJvbSB0aGUKICAvLy8gdXNlIG9mIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIHR5cGVkZWYgZGVmaW5pdGlvbi4KICBpbnQgY29tcHV0ZVZhcmlhbmNlcygpID0+IDA7CgogIC8vLyBUaGlzIG1ldGhvZCBpbnN0YW50aWF0ZXMgdHlwZSBwYXJhbWV0ZXJzIHRvIHRoZWlyIGJvdW5kcyBpbiBzb21lIGNhc2VzCiAgLy8vIHdoZXJlIHRoZXkgd2VyZSBvbWl0dGVkIGJ5IHRoZSBwcm9ncmFtbWVyIGFuZCBub3QgcHJvdmlkZWQgYnkgdGhlIHR5cGUKICAvLy8gaW5mZXJlbmNlLiAgVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdHlwZSB2YXJpYWJsZXMKICAvLy8gdGhhdCB3ZXJlIGluc3RhbnRpYXRlZCBpbiB0aGlzIGxpYnJhcnkuCiAgaW50IGNvbXB1dGVEZWZhdWx0VHlwZXMoVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUsCiAgICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcyk7CgogIHZvaWQgYmVjb21lQ29yZUxpYnJhcnkoKTsKCiAgdm9pZCBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mRHluYW1pYygpOwoKICB2b2lkIGFkZFN5bnRoZXRpY0RlY2xhcmF0aW9uT2ZOZXZlcigpOwoKICAvLy8gTG9va3VwcyB0aGUgbWVtYmVyIFtuYW1lXSBkZWNsYXJlZCBpbiB0aGlzIGxpYnJhcnkuCiAgLy8vCiAgLy8vIElmIFtyZXF1aXJlZF0gaXMgYHRydWVgIGFuZCBubyBtZW1iZXIgaXMgZm91bmQgYW4gaW50ZXJuYWwgcHJvYmxlbSBpcwogIC8vLyByZXBvcnRlZC4KICBCdWlsZGVyIGxvb2t1cExvY2FsTWVtYmVyKFN0cmluZyBuYW1lLCB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KTsKCiAgQnVpbGRlciBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSk7CgogIC8vLyBJZiB0aGlzIGlzIGEgcGF0Y2ggbGlicmFyeSwgYXBwbHkgaXRzIHBhdGNoZXMgdG8gW29yaWdpbl0uCiAgdm9pZCBhcHBseVBhdGNoZXMoKTsKCiAgdm9pZCByZWNvcmRBY2Nlc3MoaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpKTsKCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucygpOwoKICBMaXN0PEZpZWxkQnVpbGRlcj4gdGFrZUltcGxpY2l0bHlUeXBlZEZpZWxkcygpOwoKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0OwoKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFibGU7CgogIE51bGxhYmlsaXR5IGdldCBub25OdWxsYWJsZTsKCiAgTnVsbGFiaWxpdHkgbnVsbGFibGVJZlRydWUoYm9vbCBpc051bGxhYmxlKTsKCiAgTnVsbGFiaWxpdHlCdWlsZGVyIGdldCBudWxsYWJsZUJ1aWxkZXI7CgogIE51bGxhYmlsaXR5QnVpbGRlciBnZXQgbm9uTnVsbGFibGVCdWlsZGVyOwoKICBOdWxsYWJpbGl0eUJ1aWxkZXIgbnVsbGFibGVCdWlsZGVySWZUcnVlKGJvb2wgaXNOdWxsYWJsZSk7Cn0KCmFic3RyYWN0IGNsYXNzIExpYnJhcnlCdWlsZGVySW1wbCBleHRlbmRzIE1vZGlmaWVyQnVpbGRlckltcGwKICAgIGltcGxlbWVudHMgTGlicmFyeUJ1aWxkZXIgewogIEBvdmVycmlkZQogIGZpbmFsIFNjb3BlIHNjb3BlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTY29wZSBleHBvcnRTY29wZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2NvcGVCdWlsZGVyIHNjb3BlQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2NvcGVCdWlsZGVyIGV4cG9ydFNjb3BlQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxFeHBvcnQ+IGV4cG9ydGVycyA9IDxFeHBvcnQ+W107CgogIEBvdmVycmlkZQogIExpYnJhcnlCdWlsZGVyIHBhcnRPZkxpYnJhcnk7CgogIEBvdmVycmlkZQogIGJvb2wgbWF5SW1wbGVtZW50UmVzdHJpY3RlZFR5cGVzID0gZmFsc2U7CgogIExpYnJhcnlCdWlsZGVySW1wbChVcmkgZmlsZVVyaSwgdGhpcy5zY29wZSwgdGhpcy5leHBvcnRTY29wZSkKICAgICAgOiBzY29wZUJ1aWxkZXIgPSBuZXcgU2NvcGVCdWlsZGVyKHNjb3BlKSwKICAgICAgICBleHBvcnRTY29wZUJ1aWxkZXIgPSBuZXcgU2NvcGVCdWlsZGVyKGV4cG9ydFNjb3BlKSwKICAgICAgICBzdXBlcihudWxsLCAtMSwgZmlsZVVyaSk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGZhbHNlOwoKICAvLy8gU2V0IHRoZSBsYW5ndWFnZSB2ZXJzaW9uIHRvIGEgc3BlY2lmaWMgbm9uLW51bGwgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24uCiAgLy8vCiAgLy8vIElmIHRoZSBsYW5ndWFnZSB2ZXJzaW9uIGhhcyBwcmV2aW91c2x5IGJlZW4gZXhwbGljaXRseSBzZXQgc2V0IChpLmUuIHdpdGgKICAvLy8gW2V4cGxpY2l0XSBzZXQgdG8gdHJ1ZSksIGFueSBzdWJzZXF1ZW50IGNhbGwgKGV4cGxpY2l0IG9yIG5vdCkgc2hvdWxkIGJlCiAgLy8vIGlnbm9yZWQuCiAgLy8vIE11bHRpcGxlIGNhbGxzIHdpdGggW2V4cGxpY2l0XSBzZXQgdG8gZmFsc2Ugc2hvdWxkIGJlIGFsbG93ZWQgdGhvdWdoLgogIC8vLwogIC8vLyBUaGUgbWFpbiBpZGVhIGlzIHRoYXQgdGhlIC5wYWNrYWdlcyBmaWxlIHNwZWNpZmllcyBhIGRlZmF1bHQgbGFuZ3VhZ2UKICAvLy8gdmVyc2lvbiwgYnV0IHRoYXQgdGhlIGxpYnJhcnkgY2FuIGhhdmUgc291cmNlIGNvZGUgdGhhdCBzcGVjaWZpZXMgYW5vdGhlcgogIC8vLyBvbmUgd2hpY2ggc2hvdWxkIGJlIHN1cHBvcnRlZCwgYnV0IHNwZWNpZnlpbmcgc2V2ZXJhbCBpbiBjb2RlIHNob3VsZCBub3QKICAvLy8gY2hhbmdlIGFueXRoaW5nLgogIC8vLwogIC8vLyBbb2Zmc2V0XSBhbmQgW2xlbmd0aF0gcmVmZXJzIHRvIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgc291cmNlIGNvZGUKICAvLy8gc3BlY2lmeWluZyB0aGUgbGFuZ3VhZ2UgdmVyc2lvbi4KICBAb3ZlcnJpZGUKICB2b2lkIHNldExhbmd1YWdlVmVyc2lvbihpbnQgbWFqb3IsIGludCBtaW5vciwKICAgICAge2ludCBvZmZzZXQ6IDAsIGludCBsZW5ndGgsIGJvb2wgZXhwbGljaXR9KTsKCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBnZXQgcGFyZW50ID0+IG51bGw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUGFydCA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkxpYnJhcnlCdWlsZGVyIjsKCiAgQG92ZXJyaWRlCiAgTG9hZGVyIGdldCBsb2FkZXI7CgogIEBvdmVycmlkZQogIGludCBnZXQgbW9kaWZpZXJzID0+IDA7CgogIEBvdmVycmlkZQogIFVyaSBnZXQgaW1wb3J0VXJpOwoKICBAb3ZlcnJpZGUKICBJdGVyYXRvcjxCdWlsZGVyPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgTmFtZUl0ZXJhdG9yIGdldCBuYW1lSXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkRXhwb3J0ZXIoCiAgICAgIExpYnJhcnlCdWlsZGVyIGV4cG9ydGVyLCBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLCBpbnQgY2hhck9mZnNldCkgewogICAgZXhwb3J0ZXJzLmFkZChuZXcgRXhwb3J0KGV4cG9ydGVyLCB0aGlzLCBjb21iaW5hdG9ycywgY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LAogICAgICBib29sIHByb2JsZW1PbkxpYnJhcnk6IGZhbHNlfSkgewogICAgZmlsZVVyaSA/Pz0gdGhpcy5maWxlVXJpOwoKICAgIHJldHVybiBsb2FkZXIuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBzZXZlcml0eSwKICAgICAgICBwcm9ibGVtT25MaWJyYXJ5OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgYWRkVG9FeHBvcnRTY29wZShTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIsIFtpbnQgY2hhck9mZnNldCA9IC0xXSkgewogICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAobWVtYmVyIGlzIFByZWZpeEJ1aWxkZXIpIHJldHVybiBmYWxzZTsKICAgIEJ1aWxkZXIgZXhpc3RpbmcgPQogICAgICAgIGV4cG9ydFNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKG5hbWUsIHNldHRlcjogbWVtYmVyLmlzU2V0dGVyKTsKICAgIGlmIChleGlzdGluZyA9PSBtZW1iZXIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIEJ1aWxkZXIgcmVzdWx0ID0gY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICAgICAgbmFtZSwgZXhpc3RpbmcsIG1lbWJlciwgY2hhck9mZnNldCwKICAgICAgICAgIGlzRXhwb3J0OiB0cnVlKTsKICAgICAgZXhwb3J0U2NvcGUuYWRkTG9jYWxNZW1iZXIobmFtZSwgcmVzdWx0LCBzZXR0ZXI6IG1lbWJlci5pc1NldHRlcik7CiAgICAgIHJldHVybiByZXN1bHQgIT0gZXhpc3Rpbmc7CiAgICB9IGVsc2UgewogICAgICBleHBvcnRTY29wZS5hZGRMb2NhbE1lbWJlcihuYW1lLCBtZW1iZXIsIHNldHRlcjogbWVtYmVyLmlzU2V0dGVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKSA9PiAwOwoKICBAb3ZlcnJpZGUKICBpbnQgZmluaXNoRm9yd2FyZGVycygpID0+IDA7CgogIEBvdmVycmlkZQogIGludCBmaW5pc2hOYXRpdmVNZXRob2RzKCkgPT4gMDsKCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFBhdGNoTWV0aG9kcygpID0+IDA7CgogIEBvdmVycmlkZQogIE1lbWJlckJ1aWxkZXIgZ2V0Q29uc3RydWN0b3IoU3RyaW5nIGNsYXNzTmFtZSwKICAgICAge1N0cmluZyBjb25zdHJ1Y3Rvck5hbWUsIGJvb2wgYnlwYXNzTGlicmFyeVByaXZhY3k6IGZhbHNlfSkgewogICAgY29uc3RydWN0b3JOYW1lID8/PSAiIjsKICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUuc3RhcnRzV2l0aCgiXyIpICYmICFieXBhc3NMaWJyYXJ5UHJpdmFjeSkgewogICAgICByZXR1cm4gaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhjb25zdHJ1Y3Rvck5hbWUpLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KICAgIEJ1aWxkZXIgY2xzID0gKGJ5cGFzc0xpYnJhcnlQcml2YWN5ID8gc2NvcGUgOiBleHBvcnRTY29wZSkKICAgICAgICAubG9va3VwKGNsYXNzTmFtZSwgLTEsIG51bGwpOwogICAgaWYgKGNscyBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIFR5cGVBbGlhc0J1aWxkZXIgYWxpYXNCdWlsZGVyID0gY2xzOwogICAgICBjbHMgPSBhbGlhc0J1aWxkZXIudW5hbGlhc0RlY2xhcmF0aW9uOwogICAgfQogICAgaWYgKGNscyBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGNvZGUgaXMgc2ltaWxhciB0byBjb2RlIGluIGBlbmROZXdFeHByZXNzaW9uYCBpbgogICAgICAvLyBgYm9keV9idWlsZGVyLmRhcnRgLCB0cnkgdG8gc2hhcmUgaXQuCiAgICAgIE1lbWJlckJ1aWxkZXIgY29uc3RydWN0b3IgPQogICAgICAgICAgY2xzLmZpbmRDb25zdHJ1Y3Rvck9yRmFjdG9yeShjb25zdHJ1Y3Rvck5hbWUsIC0xLCBudWxsLCB0aGlzKTsKICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgICAvLyBGYWxsLXRocm91Z2ggdG8gaW50ZXJuYWwgZXJyb3IgYmVsb3cuCiAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcikgewogICAgICAgIGlmICghY2xzLmlzQWJzdHJhY3QpIHsKICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0b3IuaXNGYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICIkY2xhc3NOYW1lLiRjb25zdHJ1Y3Rvck5hbWUiLCBpbXBvcnRVcmkpLAogICAgICAgIC0xLAogICAgICAgIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFR5cGVWYXJpYWJsZXMoQ2xhc3NCdWlsZGVyIG9iamVjdCwgVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUpID0+IDA7CgogIEBvdmVycmlkZQogIGludCBjb21wdXRlVmFyaWFuY2VzKCkgPT4gMDsKCiAgQG92ZXJyaWRlCiAgaW50IGNvbXB1dGVEZWZhdWx0VHlwZXMoVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUsCiAgICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgcmV0dXJuIDA7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlY29tZUNvcmVMaWJyYXJ5KCkgewogICAgaWYgKHNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKCJkeW5hbWljIiwgc2V0dGVyOiBmYWxzZSkgPT0gbnVsbCkgewogICAgICBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mRHluYW1pYygpOwogICAgfQogICAgaWYgKHNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKCJOZXZlciIsIHNldHRlcjogZmFsc2UpID09IG51bGwpIHsKICAgICAgYWRkU3ludGhldGljRGVjbGFyYXRpb25PZk5ldmVyKCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIGxvb2t1cExvY2FsTWVtYmVyKFN0cmluZyBuYW1lLCB7Ym9vbCByZXF1aXJlZDogZmFsc2V9KSB7CiAgICBCdWlsZGVyIGJ1aWxkZXIgPSBzY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IGZhbHNlKTsKICAgIGlmIChyZXF1aXJlZCAmJiBidWlsZGVyID09IG51bGwpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgbmFtZSwgZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaGVzKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm47CiAgICB1bnN1cHBvcnRlZCgiJHtydW50aW1lVHlwZX0uYXBwbHlQYXRjaGVzIiwgLTEsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRBY2Nlc3MoaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKCkge30KCiAgQG92ZXJyaWRlCiAgTGlzdDxGaWVsZEJ1aWxkZXI+IHRha2VJbXBsaWNpdGx5VHlwZWRGaWVsZHMoKSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFibGUgewogICAgcmV0dXJuIGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPyBOdWxsYWJpbGl0eS5udWxsYWJsZSA6IE51bGxhYmlsaXR5LmxlZ2FjeTsKICB9CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IGdldCBub25OdWxsYWJsZSB7CiAgICByZXR1cm4gaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgID8gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUKICAgICAgICA6IE51bGxhYmlsaXR5LmxlZ2FjeTsKICB9CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IG51bGxhYmxlSWZUcnVlKGJvb2wgaXNOdWxsYWJsZSkgewogICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmV0dXJuIGlzTnVsbGFibGUgPyBOdWxsYWJpbGl0eS5udWxsYWJsZSA6IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOwogICAgfQogICAgcmV0dXJuIE51bGxhYmlsaXR5LmxlZ2FjeTsKICB9CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5QnVpbGRlciBnZXQgbnVsbGFibGVCdWlsZGVyIHsKICAgIHJldHVybiBpc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgPyBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKQogICAgICAgIDogY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKTsKICB9CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5QnVpbGRlciBnZXQgbm9uTnVsbGFibGVCdWlsZGVyIHsKICAgIHJldHVybiBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmxlQnVpbGRlcklmVHJ1ZShib29sIGlzTnVsbGFibGUpIHsKICAgIHJldHVybiBpc051bGxhYmxlCiAgICAgICAgPyBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKQogICAgICAgIDogY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKTsKICB9Cn0KCmNsYXNzIExpYnJhcnlMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxCdWlsZGVyPiB7CiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKICBmaW5hbCBJdGVyYXRvcjxCdWlsZGVyPiBpdGVyYXRvcjsKCiAgTGlicmFyeUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvcih0aGlzLmxpYnJhcnkpCiAgICAgIDogaXRlcmF0b3IgPSBsaWJyYXJ5LnNjb3BlLml0ZXJhdG9yOwoKICBCdWlsZGVyIGdldCBjdXJyZW50ID0+IGl0ZXJhdG9yLmN1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBpZiAoY3VycmVudC5wYXJlbnQgPT0gbGlicmFyeSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CgpjbGFzcyBMaWJyYXJ5TG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvciBpbXBsZW1lbnRzIE5hbWVJdGVyYXRvciB7CiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKICBmaW5hbCBOYW1lSXRlcmF0b3IgaXRlcmF0b3I7CgogIExpYnJhcnlMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yKHRoaXMubGlicmFyeSkKICAgICAgOiBpdGVyYXRvciA9IGxpYnJhcnkuc2NvcGUubmFtZUl0ZXJhdG9yOwoKICBCdWlsZGVyIGdldCBjdXJyZW50ID0+IGl0ZXJhdG9yLmN1cnJlbnQ7CgogIFN0cmluZyBnZXQgbmFtZSA9PiBpdGVyYXRvci5uYW1lOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgaWYgKGN1cnJlbnQucGFyZW50ID09IGxpYnJhcnkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqB7QBOTjwBHwFPATwBLQE9ASUBJQEaCRoYETQrOQEYARcdHR4gHSMeIhwBOxMBGQEhAScBHgEgASQBTwZQTw9MBkxQTxcGTycwMwETARUBMxcBLgZLFQEiASEBSAEUTgFPBjsGOCcfQB8kGSYBNU0BTwEnRzUBJAEaAR0BHAFBBkNLJQZPKQZOSjIxQwFJATkGUE4fAU1NSy5LIQEcASsBKQE6BkwQQgE8AUEXAT4BIgEyASMBHAEfAS8BKgEtAT0CAT4gDBUBDBsBDCMBDCkBDC0BDCABDCwBQDA8IgEMIQFPBlBPD0wGTFBPFwZPJwwwMwEMHgEMHAEMLAEMFQEMGgEMFQEMIzYEAQwiOgQBDBRPSAQBDB9AHyQZJx4BQyAaHCEEAQxOLC8XRh4UIzQuG0khDUkTBgQBDCkBDB8BDCIBDCEBDDFEHEQeOi8OEQY/JiMrLQYfSi8iSSExLh8eCiocCAYbQjcMDwQBDE4BDB8BDEsiDgQBDB1FKgZDKAYEAQxDRCcXOygOEQYUBAEMPTQEAQwYGj0EAQxAAQwkAQw6AQwdTwQBDCAiIh4EAQwwIkoGHwQBDCsiLi4EAQwuLwQBDD4WLi4EAgFFICQBMCsBKwEUIjIGEgQCAUQgHwE0LwErASQBFCIyBhIEAgE4cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnRiZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9uYW1lX2l0ZXJhdG9yLmRhcnSBXy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm5hbWVfaXRlcmF0b3I7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBOYW1lSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxCdWlsZGVyPiB7CiAgU3RyaW5nIGdldCBuYW1lOwp9Cg0ATk48AR0BFwE7EwIBNnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL25hbWVfaXRlcmF0b3IuZGFydGFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0iWcvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IERhcnRUeXBlLCBTdXBlcnR5cGUsIFR5cGVkZWZUeXBlOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbnVsbGFiaWxpdHlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgVHlwZUJ1aWxkZXIgewogIGNvbnN0IFR5cGVCdWlsZGVyKCk7CgogIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZ2V0IGRlY2xhcmF0aW9uID0+IG51bGw7CgogIHZvaWQgcmVzb2x2ZUluKAogICAgICBTY29wZSBzY29wZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7fQoKICAvLy8gU2VlIGBVbnJlc29sdmVkVHlwZS5jaGVja1R5cGVgLgogIHZvaWQgY2hlY2soTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7fQoKICB2b2lkIGJpbmQoVHlwZURlY2xhcmF0aW9uQnVpbGRlciBidWlsZGVyKSB7fQoKICAvLy8gTWF5IHJldHVybiBudWxsLCBmb3IgZXhhbXBsZSwgZm9yIG1peGluIGFwcGxpY2F0aW9ucy4KICBPYmplY3QgZ2V0IG5hbWU7CgogIE51bGxhYmlsaXR5QnVpbGRlciBnZXQgbnVsbGFiaWxpdHlCdWlsZGVyOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZTsKCiAgU3RyaW5nQnVmZmVyIHByaW50T24oU3RyaW5nQnVmZmVyIGJ1ZmZlcik7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIkZGVidWdOYW1lKCR7cHJpbnRPbihuZXcgU3RyaW5nQnVmZmVyKCkpfSkiOwoKICAvLy8gUmV0dXJucyB0aGUgW1R5cGVCdWlsZGVyXSBmb3IgdGhpcyB0eXBlIGluIHdoaWNoIFtUeXBlVmFyaWFibGVCdWlsZGVyXXMKICAvLy8gaW4gW3N1YnN0aXR1dGlvbl0gaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIFtUeXBlQnVpbGRlcl1zLgogIC8vLwogIC8vLyBJZiBbdW5ib3VuZFR5cGVzXSBpcyBwcm92aWRlZCwgY3JlYXRlZCB0eXBlIGJ1aWxkZXJzIHRoYXQgYXJlIG5vdCBib3VuZAogIC8vLyBhcmUgYWRkZWQgdG8gW3VuYm91bmRUeXBlc10uIE90aGVyd2lzZSwgY3JlYXRpbmcgYW4gdW5ib3VuZCB0eXBlIGJ1aWxkZXIKICAvLy8gdGhyb3dzIGFuIGVycm9yLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSBbTmFtZWRUeXBlQnVpbGRlcl0gdG8gaG9sZCB0aGUKICAvLyBbVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlcl0gc2hvdWxkIHJlc29sdmUgaXQsIHNvIHRoYXQgd2UgY2Fubm90IGNyZWF0ZQogIC8vIFtOYW1lZFR5cGVCdWlsZGVyXXMgdGhhdCBhcmUgb3JwaGFuZWQuCiAgVHlwZUJ1aWxkZXIgc3Vic3QoTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24pID0+IHRoaXM7CgogIC8vLyBDbG9uZXMgdGhlIHR5cGUgYnVpbGRlciByZWN1cnNpdmVseSB3aXRob3V0IGJpbmRpbmcgdGhlIHN1YnRlcm1zIHRvCiAgLy8vIGV4aXN0aW5nIGRlY2xhcmF0aW9uIG9yIHR5cGUgdmFyaWFibGUgYnVpbGRlcnMuICBBbGwgbmV3bHkgYnVpbHQgdHlwZXMKICAvLy8gYXJlIGFkZGVkIHRvIFtuZXdUeXBlc10sIHNvIHRoYXQgdGhleSBjYW4gYmUgYWRkZWQgdG8gYSBwcm9wZXIgc2NvcGUgYW5kCiAgLy8vIHJlc29sdmVkIGxhdGVyLgogIFR5cGVCdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKTsKCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiAiJHtwcmludE9uKG5ldyBTdHJpbmdCdWZmZXIoKSl9IjsKCiAgRGFydFR5cGUgYnVpbGQoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgW1R5cGVkZWZUeXBlIG9yaWdpbl0pOwoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKTsKCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSk7CgogIFR5cGVCdWlsZGVyIHdpdGhOdWxsYWJpbGl0eUJ1aWxkZXIoTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlcik7Cn0KRABOTjwBHAFIARgfIyglAR0XATIBEksBJkUBLwE8EwEtARgBLQFFAU5QBk5PF0BNLFEBSk1PFjEBRAFAAVEBHjwBTQIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0bWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnSGfC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnR5cGVfZGVjbGFyYXRpb25fYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIE51bGxhYmlsaXR5OwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21vZGlmaWVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbnVsbGFiaWxpdHlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGltcGxlbWVudHMgTW9kaWZpZXJCdWlsZGVyIHsKICBib29sIGdldCBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbjsKCiAgdm9pZCBzZXQgcGFyZW50KEJ1aWxkZXIgdmFsdWUpOwoKICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gZ2V0IG1ldGFkYXRhOwoKICBpbnQgZ2V0IHR5cGVWYXJpYWJsZXNDb3VudCA9PiAwOwoKICBEYXJ0VHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKTsKCiAgLy8vIFthcmd1bWVudHNdIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyk7Cn0KCmFic3RyYWN0IGNsYXNzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXJJbXBsIGV4dGVuZHMgTW9kaWZpZXJCdWlsZGVySW1wbAogICAgaW1wbGVtZW50cyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGE7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBtb2RpZmllcnM7CgogIEBvdmVycmlkZQogIGZpbmFsIFN0cmluZyBuYW1lOwoKICBUeXBlRGVjbGFyYXRpb25CdWlsZGVySW1wbCgKICAgICAgdGhpcy5tZXRhZGF0YSwgdGhpcy5tb2RpZmllcnMsIHRoaXMubmFtZSwgQnVpbGRlciBwYXJlbnQsIGludCBjaGFyT2Zmc2V0LAogICAgICBbVXJpIGZpbGVVcmldKQogICAgICA6IGFzc2VydChtb2RpZmllcnMgIT0gbnVsbCksCiAgICAgICAgc3VwZXIocGFyZW50LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOYW1lZE1peGluQXBwbGljYXRpb24gPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzVHlwZURlY2xhcmF0aW9uID0+IHRydWU7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gbmFtZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQgPT4gMDsKfQo/AE5OPAEoAT0BFx8gICMcAUMkASIBJgEjAS1LAStAOgIBRigMKAEMFwEMFQEeUBUjLAEMLQEMJgEMKAEMIwIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0WmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXJfZ3JhcGguZGFydIibLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuYnVpbGRlcl9ncmFwaDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwva2VybmVsLmRhcnQnIHNob3cgTGlicmFyeURlcGVuZGVuY3ksIExpYnJhcnlQYXJ0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC91dGlsL2dyYXBoLmRhcnQnIHNob3cgR3JhcGg7CgppbXBvcnQgJ2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICdleHBvcnQuZGFydCcgc2hvdyBFeHBvcnQ7CgppbXBvcnQgJ2ltcG9ydC5kYXJ0JyBzaG93IEltcG9ydDsKCmltcG9ydCAnZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnaW5jcmVtZW50YWxfY29tcGlsZXIuZGFydCcgc2hvdyBnZXRQYXJ0VXJpOwoKY2xhc3MgQnVpbGRlckdyYXBoIGltcGxlbWVudHMgR3JhcGg8VXJpPiB7CiAgZmluYWwgTWFwPFVyaSwgTGlicmFyeUJ1aWxkZXI+IGJ1aWxkZXJzOwoKICBCdWlsZGVyR3JhcGgodGhpcy5idWlsZGVycyk7CgogIEl0ZXJhYmxlPFVyaT4gZ2V0IHZlcnRpY2VzID0+IGJ1aWxkZXJzLmtleXM7CgogIEl0ZXJhYmxlPFVyaT4gbmVpZ2hib3JzT2YoVXJpIHZlcnRleCkgc3luYyogewogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW3ZlcnRleF07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJMaWJyYXJ5IG5vdCBmb3VuZDogJHZlcnRleCI7CiAgICB9CiAgICBpZiAobGlicmFyeSBpcyBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gbGlicmFyeS5pbXBvcnRzKSB7CiAgICAgICAgLy8gJ2ltcG9ydGVkJyBjYW4gYmUgbnVsbCBmb3IgZmFrZSBpbXBvcnRzLCBzdWNoIGFzIGRhcnQtZXh0Oi4KICAgICAgICBpZiAoaW1wb3J0LmltcG9ydGVkICE9IG51bGwpIHsKICAgICAgICAgIFVyaSB1cmkgPSBpbXBvcnQuaW1wb3J0ZWQuaW1wb3J0VXJpOwogICAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgICAgeWllbGQgdXJpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gbGlicmFyeS5leHBvcnRzKSB7CiAgICAgICAgVXJpIHVyaSA9IGV4cG9ydC5leHBvcnRlZC5pbXBvcnRVcmk7CiAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgIHlpZWxkIHVyaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBwYXJ0IGluIGxpYnJhcnkucGFydHMpIHsKICAgICAgICBVcmkgdXJpID0gcGFydC5pbXBvcnRVcmk7CiAgICAgICAgaWYgKGJ1aWxkZXJzLmNvbnRhaW5zS2V5KHVyaSkpIHsKICAgICAgICAgIHlpZWxkIHVyaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobGlicmFyeSBpcyBEaWxsTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgLy8gSW1wb3J0cyBhbmQgZXhwb3J0cwogICAgICBmb3IgKExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgaW4gbGlicmFyeS5saWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICAgIFVyaSB1cmkgPSBkZXBlbmRlbmN5LnRhcmdldExpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgIGlmIChidWlsZGVycy5jb250YWluc0tleSh1cmkpKSB7CiAgICAgICAgICB5aWVsZCB1cmk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQYXJ0cwogICAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5saWJyYXJ5LnBhcnRzKSB7CiAgICAgICAgVXJpIHVyaSA9IGdldFBhcnRVcmkobGlicmFyeS5pbXBvcnRVcmksIHBhcnQpOwogICAgICAgIGlmIChidWlsZGVycy5jb250YWluc0tleSh1cmkpKSB7CiAgICAgICAgICB5aWVsZCB1cmk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Ck0ATk48AR0BSQE0AScBIgEiAUEBRwE0ASsrAR8BLwEwLxsqBisvRycvKxcMCggvLSkVCgg5IikVCggwHUs2KRUKCAEPODcpFQoIBgQCAS5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlcl9ncmFwaC5kYXJ0V2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2NvbWJpbmF0b3IuZGFydIK7Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY29tYmluYXRvcjsKCmNsYXNzIENvbWJpbmF0b3IgewogIGZpbmFsIGJvb2wgaXNTaG93OwoKICBmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lczsKCiAgQ29tYmluYXRvcih0aGlzLmlzU2hvdywgdGhpcy5uYW1lcywgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKTsKCiAgQ29tYmluYXRvci5zaG93KEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkKICAgICAgOiB0aGlzKHRydWUsIG5ldyBTZXQ8U3RyaW5nPi5mcm9tKG5hbWVzKSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIENvbWJpbmF0b3IuaGlkZShJdGVyYWJsZTxTdHJpbmc+IG5hbWVzLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpCiAgICAgIDogdGhpcyhmYWxzZSwgbmV3IFNldDxTdHJpbmc+LmZyb20obmFtZXMpLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKCiAgYm9vbCBnZXQgaXNIaWRlID0+ICFpc1Nob3c7Cn0KFwBOTjwBGgETFQEbAUQBR0YBR0cBHgIBK3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb21iaW5hdG9yLmRhcnRkZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX2NsYXNzX2J1aWxkZXIuZGFydJSFLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF9jbGFzc19idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQ2xhc3MsIERhcnRUeXBlLCBNZW1iZXIsIFN1cGVydHlwZSwgVHlwZVBhcmFtZXRlcjsKCmltcG9ydCAnLi4vYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaW1wbGVtZW50ZWQ7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnIHNob3cgYWJzdHJhY3RNYXNrLCBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrOwoKaW1wb3J0ICdkaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxNZW1iZXJCdWlsZGVyOwoKY2xhc3MgRGlsbENsYXNzQnVpbGRlciBleHRlbmRzIENsYXNzQnVpbGRlckltcGwgewogIGZpbmFsIENsYXNzIGNsczsKCiAgRGlsbENsYXNzQnVpbGRlcihDbGFzcyBjbHMsIERpbGxMaWJyYXJ5QnVpbGRlciBwYXJlbnQpCiAgICAgIDogY2xzID0gY2xzLAogICAgICAgIHN1cGVyKAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBjb21wdXRlTW9kaWZpZXJzKGNscyksCiAgICAgICAgICAgIGNscy5uYW1lLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBuZXcgU2NvcGUoCiAgICAgICAgICAgICAgICBsb2NhbDogPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwKICAgICAgICAgICAgICAgIHNldHRlcnM6IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudC5zY29wZSwKICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogImNsYXNzICR7Y2xzLm5hbWV9IiwKICAgICAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpLAogICAgICAgICAgICBuZXcgQ29uc3RydWN0b3JTY29wZShjbHMubmFtZSwgPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSksCiAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgY2xzLmZpbGVPZmZzZXQpOwoKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGdldCB0eXBlVmFyaWFibGVzIHsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHN1cGVyLnR5cGVWYXJpYWJsZXM7CiAgICBpZiAodHlwZVZhcmlhYmxlcyA9PSBudWxsICYmIGNscy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBzdXBlci50eXBlVmFyaWFibGVzID0KICAgICAgICAgIGNvbXB1dGVUeXBlVmFyaWFibGVCdWlsZGVycyhsaWJyYXJ5LCBjbHMudHlwZVBhcmFtZXRlcnMpOwogICAgfQogICAgcmV0dXJuIHR5cGVWYXJpYWJsZXM7CiAgfQoKICBVcmkgZ2V0IGZpbGVVcmkgPT4gY2xzLmZpbGVVcmk7CgogIFR5cGVCdWlsZGVyIGdldCBzdXBlcnR5cGUgewogICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gc3VwZXIuc3VwZXJ0eXBlOwogICAgaWYgKHN1cGVydHlwZSA9PSBudWxsKSB7CiAgICAgIFN1cGVydHlwZSB0YXJnZXRTdXBlcnR5cGUgPSBjbHMuc3VwZXJ0eXBlOwogICAgICBpZiAodGFyZ2V0U3VwZXJ0eXBlID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBzdXBlci5zdXBlcnR5cGUgPQogICAgICAgICAgc3VwZXJ0eXBlID0gY29tcHV0ZVR5cGVCdWlsZGVyKGxpYnJhcnksIHRhcmdldFN1cGVydHlwZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXJ0eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IGFjdHVhbENscyA9PiBjbHM7CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIERpbGxNZW1iZXJCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRGlsbE1lbWJlckJ1aWxkZXIobWVtYmVyLCB0aGlzKTsKICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICAgIGlmIChidWlsZGVyLmlzQ29uc3RydWN0b3IgfHwgYnVpbGRlci5pc0ZhY3RvcnkpIHsKICAgICAgY29uc3RydWN0b3JTY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIGJ1aWxkZXIpOwogICAgfSBlbHNlIGlmIChidWlsZGVyLmlzU2V0dGVyKSB7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRTZXR0ZXIobmFtZSwgYnVpbGRlcik7CiAgICB9IGVsc2UgewogICAgICBzY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIGJ1aWxkZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQgPT4gY2xzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBbdHlwZVZhcmlhYmxlc10gYXJlbid0IHJlc3RvcmVkIGZyb20gW3RhcmdldF0uCiAgICAvLyBTbywgaWYgW2FyZ3VtZW50c10gaXMgbnVsbCwgdGhlIGRlZmF1bHQgdHlwZXMgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tCiAgICAvLyBbY2xzLnR5cGVQYXJhbWV0ZXJzXS4KICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgY2xzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgbnVsbCwKICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgICByZXN1bHRbaV0gPSBjbHMudHlwZVBhcmFtZXRlcnNbaV0uZGVmYXVsdFR5cGU7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvLyBbYXJndW1lbnRzXSAhPSBudWxsCiAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoYXJndW1lbnRzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gYXJndW1lbnRzW2ldLmJ1aWxkKGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjbGFzcyBpcyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGEgbWl4aW4gdG8gaXRzCiAgLy8vIHN1cGVyY2xhc3MuCiAgYm9vbCBnZXQgaXNNaXhpbkFwcGxpY2F0aW9uID0+IGNscy5pc01peGluQXBwbGljYXRpb247CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0NvbnN0Q29uc3RydWN0b3IgPT4gY2xzLmhhc0NvbnN0Q29uc3RydWN0b3I7CgogIFR5cGVCdWlsZGVyIGdldCBtaXhlZEluVHlwZSB7CiAgICByZXR1cm4gY29tcHV0ZVR5cGVCdWlsZGVyKGxpYnJhcnksIGNscy5taXhlZEluVHlwZSk7CiAgfQoKICBMaXN0PFR5cGVCdWlsZGVyPiBnZXQgaW50ZXJmYWNlcyB7CiAgICBpZiAoY2xzLmltcGxlbWVudGVkVHlwZXMuaXNFbXB0eSkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3VwZXIuaW50ZXJmYWNlcyA9PSBudWxsKSB7CiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IHJlc3VsdCA9CiAgICAgICAgICBuZXcgTGlzdDxUeXBlQnVpbGRlcj4oY2xzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN1bHRbaV0gPSBjb21wdXRlVHlwZUJ1aWxkZXIobGlicmFyeSwgY2xzLmltcGxlbWVudGVkVHlwZXNbaV0pOwogICAgICB9CiAgICAgIHN1cGVyLmludGVyZmFjZXMgPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuaW50ZXJmYWNlczsKICB9CgogIHZvaWQgc2V0IG1peGVkSW5UeXBlKFR5cGVCdWlsZGVyIG1peGluKSB7CiAgICB1bmltcGxlbWVudGVkKCJtaXhlZEluVHlwZT0iLCAtMSwgbnVsbCk7CiAgfQp9CgppbnQgY29tcHV0ZU1vZGlmaWVycyhDbGFzcyBjbHMpIHsKICBpbnQgbW9kaWZpZXJzID0gMDsKICBpZiAoY2xzLmlzQWJzdHJhY3QpIHsKICAgIG1vZGlmaWVycyB8PSBhYnN0cmFjdE1hc2s7CiAgfQogIGlmIChjbHMuaXNNaXhpbkFwcGxpY2F0aW9uICYmIGNscy5uYW1lICE9IG51bGwpIHsKICAgIG1vZGlmaWVycyB8PSBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrOwogIH0KICByZXR1cm4gbW9kaWZpZXJzOwp9CgpUeXBlQnVpbGRlciBjb21wdXRlVHlwZUJ1aWxkZXIoCiAgICBEaWxsTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgU3VwZXJ0eXBlIHN1cGVydHlwZSkgewogIHJldHVybiBzdXBlcnR5cGUgPT0gbnVsbAogICAgICA/IG51bGwKICAgICAgOiBsaWJyYXJ5LmxvYWRlci5jb21wdXRlVHlwZUJ1aWxkZXIoc3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZSk7Cn0KCkxpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gY29tcHV0ZVR5cGVWYXJpYWJsZUJ1aWxkZXJzKAogICAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKICBpZiAodHlwZVBhcmFtZXRlcnMgPT0gbnVsbCB8fCB0eXBlUGFyYW1ldGVycy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiByZXN1bHQgPQogICAgICBuZXcgTGlzdC5maWxsZWQodHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBudWxsKTsKICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewogICAgcmVzdWx0W2ldID0gbmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIuZnJvbUtlcm5lbCh0eXBlUGFyYW1ldGVyc1tpXSwgbGlicmFyeSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KgKwATk48ASIBITwBKCopJzABGAEuAUgBPAE6ATITATkTDxIjFhISEhIXMjQmMCZHFB0BMENCLEQGGgQBIgEeLR0xMBhEBhYEAQweASJFJDY4Iy0NLQYEAQw7AQwlPU9OHR05KxswNwgVBgEbHEsuLwYTBAFKEjkBDDsBIDkEASUzJCE+MEoIIQYdBAEsLQQCASIVGB8ENCwEFAIBIDcbDUYCATdGSSU0LFAEEQIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0ZmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydK/LLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlsbF9saWJyYXJ5X2J1aWxkZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRGVjb2RlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24sCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRXh0ZW5zaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIExpc3RMaXRlcmFsLAogICAgICAgIE1lbWJlciwKICAgICAgICBOYW1lZE5vZGUsCiAgICAgICAgTmV2ZXJUeXBlLAogICAgICAgIE51bGxhYmlsaXR5LAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBSZWZlcmVuY2UsCiAgICAgICAgU3RhdGljR2V0LAogICAgICAgIFN0cmluZ0NvbnN0YW50LAogICAgICAgIFN0cmluZ0xpdGVyYWwsCiAgICAgICAgVHlwZWRlZjsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZXh0ZW5zaW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbmV2ZXJfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvaW52YWxpZF90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBNZXNzYWdlLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLAogICAgICAgIHRlbXBsYXRlVHlwZU5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlVW5zcGVjaWZpZWQ7CgppbXBvcnQgJy4uL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcKICAgIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSwgaXNSZWRpcmVjdGluZ0ZhY3RvcnlGaWVsZDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuaGFuZGxlZCwgdW5pbXBsZW1lbnRlZDsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCc7CgppbXBvcnQgJ2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxDbGFzc0J1aWxkZXI7CgppbXBvcnQgJ2RpbGxfZXh0ZW5zaW9uX2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJ2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsTWVtYmVyQnVpbGRlcjsKCmltcG9ydCAnZGlsbF9sb2FkZXIuZGFydCcgc2hvdyBEaWxsTG9hZGVyOwoKaW1wb3J0ICdkaWxsX3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxUeXBlQWxpYXNCdWlsZGVyOwoKY2xhc3MgTGF6eUxpYnJhcnlTY29wZSBleHRlbmRzIExhenlTY29wZSB7CiAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyOwoKICBMYXp5TGlicmFyeVNjb3BlLnRvcCh7Ym9vbCBpc01vZGlmaWFibGU6IGZhbHNlfSkKICAgICAgOiBzdXBlcig8U3RyaW5nLCBCdWlsZGVyPnt9LCA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LCBudWxsLCAidG9wIiwKICAgICAgICAgICAgaXNNb2RpZmlhYmxlOiBpc01vZGlmaWFibGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGVuc3VyZVNjb3BlKCkgewogICAgaWYgKGxpYnJhcnlCdWlsZGVyID09IG51bGwpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJObyBsaWJyYXJ5IGJ1aWxkZXIuIik7CiAgICBsaWJyYXJ5QnVpbGRlci5lbnN1cmVMb2FkZWQoKTsKICB9Cn0KCmNsYXNzIERpbGxMaWJyYXJ5QnVpbGRlciBleHRlbmRzIExpYnJhcnlCdWlsZGVySW1wbCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlicmFyeSBsaWJyYXJ5OwoKICBEaWxsTG9hZGVyIGxvYWRlcjsKCiAgLy8vIEV4cG9ydHMgdGhhdCBjYW4ndCBiZSBzZXJpYWxpemVkLgogIC8vLwogIC8vLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBtYXAgYXJlIGRvY3VtZW50ZWQgaW4KICAvLy8gWy4uL2tlcm5lbC9rZXJuZWxfbGlicmFyeV9idWlsZGVyLmRhcnRdLgogIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5zZXJpYWxpemFibGVFeHBvcnRzOwoKICAvLyBUT0RPKGplbnNqKTogVGhlc2UgNSBib29sZWFucyBjb3VsZCBwb3RlbnRpYWxseSBiZSBtZXJnZWQgaW50byBhIHNpbmdsZQogIC8vIHN0YXRlIGZpZWxkLgogIGJvb2wgaXNSZWFkeVRvQnVpbGQgPSBmYWxzZTsKICBib29sIGlzUmVhZHlUb0ZpbmFsaXplRXhwb3J0cyA9IGZhbHNlOwogIGJvb2wgc3VwcHJlc3NGaW5hbGl6YXRpb25FcnJvcnMgPSBmYWxzZTsKICBib29sIGlzQnVpbHQgPSBmYWxzZTsKICBib29sIGlzQnVpbHRBbmRNYXJrZWQgPSBmYWxzZTsKCiAgRGlsbExpYnJhcnlCdWlsZGVyKHRoaXMubGlicmFyeSwgdGhpcy5sb2FkZXIpCiAgICAgIDogc3VwZXIobGlicmFyeS5maWxlVXJpLCBuZXcgTGF6eUxpYnJhcnlTY29wZS50b3AoKSwKICAgICAgICAgICAgbmV3IExhenlMaWJyYXJ5U2NvcGUudG9wKCkpIHsKICAgIExhenlMaWJyYXJ5U2NvcGUgbGF6eVNjb3BlID0gc2NvcGU7CiAgICBsYXp5U2NvcGUubGlicmFyeUJ1aWxkZXIgPSB0aGlzOwogICAgTGF6eUxpYnJhcnlTY29wZSBsYXp5RXhwb3J0U2NvcGUgPSBleHBvcnRTY29wZTsKICAgIGxhenlFeHBvcnRTY29wZS5saWJyYXJ5QnVpbGRlciA9IHRoaXM7CiAgfQoKICB2b2lkIGVuc3VyZUxvYWRlZCgpIHsKICAgIGlmICghaXNSZWFkeVRvQnVpbGQpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJOb3QgcmVhZHkgdG8gYnVpbGQuIik7CiAgICBpZiAoaXNCdWlsdCAmJiAhaXNCdWlsdEFuZE1hcmtlZCkgewogICAgICBpc0J1aWx0QW5kTWFya2VkID0gdHJ1ZTsKICAgICAgZmluYWxpemVFeHBvcnRzKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlzQnVpbHRBbmRNYXJrZWQgPSB0cnVlOwogICAgaWYgKGlzQnVpbHQpIHJldHVybjsKICAgIGlzQnVpbHQgPSB0cnVlOwogICAgbGlicmFyeS5jbGFzc2VzLmZvckVhY2goYWRkQ2xhc3MpOwogICAgbGlicmFyeS5leHRlbnNpb25zLmZvckVhY2goYWRkRXh0ZW5zaW9uKTsKICAgIGxpYnJhcnkucHJvY2VkdXJlcy5mb3JFYWNoKGFkZE1lbWJlcik7CiAgICBsaWJyYXJ5LnR5cGVkZWZzLmZvckVhY2goYWRkVHlwZWRlZik7CiAgICBsaWJyYXJ5LmZpZWxkcy5mb3JFYWNoKGFkZE1lbWJlcik7CgogICAgaWYgKGlzUmVhZHlUb0ZpbmFsaXplRXhwb3J0cykgewogICAgICBmaW5hbGl6ZUV4cG9ydHMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJOb3QgcmVhZHkgdG8gZmluYWxpemUgZXhwb3J0cy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGxpYnJhcnkuaXNTeW50aGV0aWM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPT4gbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHNldExhbmd1YWdlVmVyc2lvbihpbnQgbWFqb3IsIGludCBtaW5vciwKICAgICAge2ludCBvZmZzZXQ6IDAsIGludCBsZW5ndGgsIGJvb2wgZXhwbGljaXR9KSB7fQoKICBVcmkgZ2V0IGltcG9ydFVyaSA9PiBsaWJyYXJ5LmltcG9ydFVyaTsKCiAgVXJpIGdldCBmaWxlVXJpID0+IGxpYnJhcnkuZmlsZVVyaTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBuYW1lID0+IGxpYnJhcnkubmFtZTsKCiAgdm9pZCBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mRHluYW1pYygpIHsKICAgIGFkZEJ1aWxkZXIoCiAgICAgICAgImR5bmFtaWMiLCBuZXcgRHluYW1pY1R5cGVCdWlsZGVyKGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMsIC0xKSwgLTEpOwogIH0KCiAgdm9pZCBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mTmV2ZXIoKSB7CiAgICBhZGRCdWlsZGVyKAogICAgICAgICJOZXZlciIsCiAgICAgICAgbmV3IE5ldmVyVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgIGNvbnN0IE5ldmVyVHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSksIHRoaXMsIC0xKSwKICAgICAgICAtMSk7CiAgfQoKICB2b2lkIGFkZENsYXNzKENsYXNzIGNscykgewogICAgRGlsbENsYXNzQnVpbGRlciBjbGFzc0J1bGRlciA9IG5ldyBEaWxsQ2xhc3NCdWlsZGVyKGNscywgdGhpcyk7CiAgICBhZGRCdWlsZGVyKGNscy5uYW1lLCBjbGFzc0J1bGRlciwgY2xzLmZpbGVPZmZzZXQpOwogICAgY2xzLnByb2NlZHVyZXMuZm9yRWFjaChjbGFzc0J1bGRlci5hZGRNZW1iZXIpOwogICAgY2xzLmNvbnN0cnVjdG9ycy5mb3JFYWNoKGNsYXNzQnVsZGVyLmFkZE1lbWJlcik7CiAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGNscy5maWVsZHMpIHsKICAgICAgaWYgKGlzUmVkaXJlY3RpbmdGYWN0b3J5RmllbGQoZmllbGQpKSB7CiAgICAgICAgTGlzdExpdGVyYWwgaW5pdGlhbGl6ZXIgPSBmaWVsZC5pbml0aWFsaXplcjsKICAgICAgICBmb3IgKFN0YXRpY0dldCBnZXQgaW4gaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMpIHsKICAgICAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkucmVzdG9yZUZyb21EaWxsKGdldC50YXJnZXQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjbGFzc0J1bGRlci5hZGRNZW1iZXIoZmllbGQpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uKSB7CiAgICBEaWxsRXh0ZW5zaW9uQnVpbGRlciBleHRlbnNpb25CdWlsZGVyID0KICAgICAgICBuZXcgRGlsbEV4dGVuc2lvbkJ1aWxkZXIoZXh0ZW5zaW9uLCB0aGlzKTsKICAgIGFkZEJ1aWxkZXIoZXh0ZW5zaW9uLm5hbWUsIGV4dGVuc2lvbkJ1aWxkZXIsIGV4dGVuc2lvbi5maWxlT2Zmc2V0KTsKICB9CgogIHZvaWQgYWRkTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIFN0cmluZyBuYW1lID0gbWVtYmVyLm5hbWUubmFtZTsKICAgIGlmIChuYW1lID09ICJfZXhwb3J0cyMiKSB7CiAgICAgIEZpZWxkIGZpZWxkID0gbWVtYmVyOwogICAgICBTdHJpbmcgc3RyaW5nVmFsdWU7CiAgICAgIGlmIChmaWVsZC5pbml0aWFsaXplciBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnRFeHByZXNzaW9uID0gZmllbGQuaW5pdGlhbGl6ZXI7CiAgICAgICAgU3RyaW5nQ29uc3RhbnQgc3RyaW5nID0gY29uc3RhbnRFeHByZXNzaW9uLmNvbnN0YW50OwogICAgICAgIHN0cmluZ1ZhbHVlID0gc3RyaW5nLnZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nID0gZmllbGQuaW5pdGlhbGl6ZXI7CiAgICAgICAgc3RyaW5nVmFsdWUgPSBzdHJpbmcudmFsdWU7CiAgICAgIH0KICAgICAgTWFwPGR5bmFtaWMsIGR5bmFtaWM+IGpzb24gPSBqc29uRGVjb2RlKHN0cmluZ1ZhbHVlKTsKICAgICAgdW5zZXJpYWxpemFibGVFeHBvcnRzID0KICAgICAgICAgIGpzb24gIT0gbnVsbCA/IG5ldyBNYXA8U3RyaW5nLCBTdHJpbmc+LmZyb20oanNvbikgOiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgYWRkQnVpbGRlcihuYW1lLCBuZXcgRGlsbE1lbWJlckJ1aWxkZXIobWVtYmVyLCB0aGlzKSwgbWVtYmVyLmZpbGVPZmZzZXQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBhZGRCdWlsZGVyKFN0cmluZyBuYW1lLCBCdWlsZGVyIGRlY2xhcmF0aW9uLCBpbnQgY2hhck9mZnNldCkgewogICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmlzRW1wdHkpIHJldHVybiBudWxsOwogICAgYm9vbCBpc1NldHRlciA9IGRlY2xhcmF0aW9uLmlzU2V0dGVyOwogICAgaWYgKGlzU2V0dGVyKSB7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRTZXR0ZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24uaXNFeHRlbnNpb24pIHsKICAgICAgc2NvcGVCdWlsZGVyLmFkZEV4dGVuc2lvbihkZWNsYXJhdGlvbik7CiAgICB9CiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIGlmIChpc1NldHRlcikgewogICAgICAgIGV4cG9ydFNjb3BlQnVpbGRlci5hZGRTZXR0ZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIGV4cG9ydFNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgfQoKICB2b2lkIGFkZFR5cGVkZWYoVHlwZWRlZiB0eXBlZGVmKSB7CiAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZWRlZi50eXBlOwogICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUudHlwZWRlZlR5cGUgPT0gbnVsbCkgewogICAgICB1bmhhbmRsZWQoIm51bGwiLCAiYWRkVHlwZWRlZiIsIHR5cGVkZWYuZmlsZU9mZnNldCwgdHlwZWRlZi5maWxlVXJpKTsKICAgIH0KICAgIGFkZEJ1aWxkZXIodHlwZWRlZi5uYW1lLCBuZXcgRGlsbFR5cGVBbGlhc0J1aWxkZXIodHlwZWRlZiwgdGhpcyksCiAgICAgICAgdHlwZWRlZi5maWxlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkVG9TY29wZShTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIsIGludCBjaGFyT2Zmc2V0LCBib29sIGlzSW1wb3J0KSB7CiAgICB1bmltcGxlbWVudGVkKCJhZGRUb1Njb3BlIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgU3RyaW5nIG5hbWUsIEJ1aWxkZXIgYnVpbGRlciwgQnVpbGRlciBvdGhlciwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzRXhwb3J0OiBmYWxzZSwgYm9vbCBpc0ltcG9ydDogZmFsc2V9KSB7CiAgICBpZiAoYnVpbGRlciA9PSBvdGhlcikgcmV0dXJuIGJ1aWxkZXI7CiAgICBpZiAoYnVpbGRlciBpcyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcikgcmV0dXJuIGJ1aWxkZXI7CiAgICBpZiAob3RoZXIgaXMgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHJldHVybiBvdGhlcjsKICAgIC8vIEZvciBlYWNoIGVudHJ5IG1hcHBpbmcga2V5IGBrYCB0byBkZWNsYXJhdGlvbiBgZGAgaW4gYE5TYCBhbiBlbnRyeQogICAgLy8gbWFwcGluZyBga2AgdG8gYGRgIGlzIGFkZGVkIHRvIHRoZSBleHBvcnRlZCBuYW1lc3BhY2Ugb2YgYExgIHVubGVzcyBhCiAgICAvLyB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gd2l0aCB0aGUgbmFtZSBga2AgZXhpc3RzIGluIGBMYC4KICAgIGlmIChidWlsZGVyLnBhcmVudCA9PSB0aGlzKSByZXR1cm4gYnVpbGRlcjsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uLndpdGhBcmd1bWVudHMobmFtZSk7CiAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLCBmaWxlVXJpKTsKICAgIHJldHVybiBuZXcgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgICAgbmFtZSwgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgewogICAgcmV0dXJuIGxpYnJhcnkubmFtZSA/PyAiPGxpYnJhcnkgJyR7bGlicmFyeS5maWxlVXJpfSc+IjsKICB9CgogIHZvaWQgbWFya0FzUmVhZHlUb0J1aWxkKCkgewogICAgaXNSZWFkeVRvQnVpbGQgPSB0cnVlOwogIH0KCiAgdm9pZCBtYXJrQXNSZWFkeVRvRmluYWxpemVFeHBvcnRzKHtib29sIHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiBmYWxzZX0pIHsKICAgIGlzUmVhZHlUb0ZpbmFsaXplRXhwb3J0cyA9IHRydWU7CiAgICB0aGlzLnN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzID0gc3VwcHJlc3NGaW5hbGl6YXRpb25FcnJvcnM7CiAgfQoKICB2b2lkIGZpbmFsaXplRXhwb3J0cygpIHsKICAgIHVuc2VyaWFsaXphYmxlRXhwb3J0cz8uZm9yRWFjaCgoU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlVGV4dCkgewogICAgICBCdWlsZGVyIGRlY2xhcmF0aW9uOwogICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICBjYXNlICJkeW5hbWljIjoKICAgICAgICBjYXNlICJ2b2lkIjoKICAgICAgICAgIC8vIFRPRE8oYWhlKTogSXQncyBsaWtlbHkgdGhhdCB3ZSBzaG91bGRuJ3QgYmUgZXhwb3J0aW5nIHRoZXNlIHR5cGVzCiAgICAgICAgICAvLyBmcm9tIGRhcnQ6Y29yZSwgYW5kIHRoaXMgY2FzZSBjYW4gYmUgcmVtb3ZlZC4KICAgICAgICAgIGRlY2xhcmF0aW9uID0gbG9hZGVyLmNvcmVMaWJyYXJ5LmV4cG9ydFNjb3BlQnVpbGRlcltuYW1lXTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZVRleHQgPT0gbnVsbAogICAgICAgICAgICAgID8gdGVtcGxhdGVUeXBlTm90Rm91bmQud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAgIDogdGVtcGxhdGVVbnNwZWNpZmllZC53aXRoQXJndW1lbnRzKG1lc3NhZ2VUZXh0KTsKICAgICAgICAgIGlmICghc3VwcHJlc3NGaW5hbGl6YXRpb25FcnJvcnMpIHsKICAgICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlLCAtMSwgbm9MZW5ndGgsIG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgZGVjbGFyYXRpb24gPSBuZXcgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgICAgICAgICAgbmFtZSwgbWVzc2FnZS53aXRob3V0TG9jYXRpb24oKSk7CiAgICAgIH0KICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICB9KTsKCiAgICBNYXA8UmVmZXJlbmNlLCBCdWlsZGVyPiBzb3VyY2VCdWlsZGVyc01hcCA9CiAgICAgICAgbG9hZGVyLmN1cnJlbnRTb3VyY2VMb2FkZXI/LmJ1aWxkZXJzQ3JlYXRlZFdpdGhSZWZlcmVuY2VzOwogICAgZm9yIChSZWZlcmVuY2UgcmVmZXJlbmNlIGluIGxpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHMpIHsKICAgICAgTmFtZWROb2RlIG5vZGUgPSByZWZlcmVuY2Uubm9kZTsKICAgICAgQnVpbGRlciBkZWNsYXJhdGlvbjsKICAgICAgU3RyaW5nIG5hbWU7CiAgICAgIGlmIChzb3VyY2VCdWlsZGVyc01hcD8uY29udGFpbnNLZXkocmVmZXJlbmNlKSA9PSB0cnVlKSB7CiAgICAgICAgZGVjbGFyYXRpb24gPSBzb3VyY2VCdWlsZGVyc01hcFtyZWZlcmVuY2VdOwogICAgICAgIGFzc2VydChkZWNsYXJhdGlvbiAhPSBudWxsKTsKICAgICAgICBpZiAoZGVjbGFyYXRpb24gaXMgTW9kaWZpZXJCdWlsZGVyKSB7CiAgICAgICAgICBuYW1lID0gZGVjbGFyYXRpb24ubmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQ6ICRkZWNsYXJhdGlvbiAoJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iKTsKICAgICAgICB9CgogICAgICAgIGlmIChkZWNsYXJhdGlvbi5pc1NldHRlcikgewogICAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZFNldHRlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4cG9ydFNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgZGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBVcmkgbGlicmFyeVVyaTsKICAgICAgICBib29sIGlzU2V0dGVyID0gZmFsc2U7CiAgICAgICAgaWYgKG5vZGUgaXMgQ2xhc3MpIHsKICAgICAgICAgIGxpYnJhcnlVcmkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgICAgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgICBsaWJyYXJ5VXJpID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgICAgIG5hbWUgPSBub2RlLm5hbWUubmFtZTsKICAgICAgICAgIGlzU2V0dGVyID0gbm9kZS5pc1NldHRlcjsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgTWVtYmVyKSB7CiAgICAgICAgICBsaWJyYXJ5VXJpID0gbm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgICAgIG5hbWUgPSBub2RlLm5hbWUubmFtZTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgVHlwZWRlZikgewogICAgICAgICAgbGlicmFyeVVyaSA9IG5vZGUuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmk7CiAgICAgICAgICBuYW1lID0gbm9kZS5uYW1lOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBFeHRlbnNpb24pIHsKICAgICAgICAgIGxpYnJhcnlVcmkgPSBub2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICAgICAgbmFtZSA9IG5vZGUubmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgImZpbmFsaXplRXhwb3J0cyIsIC0xLCBmaWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5idWlsZGVyc1tsaWJyYXJ5VXJpXTsKICAgICAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVVbnNwZWNpZmllZAogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygiTm8gYnVpbGRlciBmb3IgJyRsaWJyYXJ5VXJpJy4iKSwKICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzU2V0dGVyKSB7CiAgICAgICAgICBkZWNsYXJhdGlvbiA9CiAgICAgICAgICAgICAgbGlicmFyeS5leHBvcnRTY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IHRydWUpOwogICAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZFNldHRlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlY2xhcmF0aW9uID0KICAgICAgICAgICAgICBsaWJyYXJ5LmV4cG9ydFNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKG5hbWUsIHNldHRlcjogZmFsc2UpOwogICAgICAgICAgZXhwb3J0U2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBkZWNsYXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmIChkZWNsYXJhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVVbnNwZWNpZmllZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAiRXhwb3J0ZWQgZWxlbWVudCAnJG5hbWUnIG5vdCBmb3VuZCBpbiAnJGxpYnJhcnlVcmknLiIpLAogICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgYXNzZXJ0KAogICAgICAgICAgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciAmJiBub2RlID09IGRlY2xhcmF0aW9uLmNscykgfHwKICAgICAgICAgICAgICAoZGVjbGFyYXRpb24gaXMgVHlwZUFsaWFzQnVpbGRlciAmJgogICAgICAgICAgICAgICAgICBub2RlID09IGRlY2xhcmF0aW9uLnR5cGVkZWYpIHx8CiAgICAgICAgICAgICAgKGRlY2xhcmF0aW9uIGlzIE1lbWJlckJ1aWxkZXIgJiYgbm9kZSA9PSBkZWNsYXJhdGlvbi5tZW1iZXIpIHx8CiAgICAgICAgICAgICAgKGRlY2xhcmF0aW9uIGlzIEV4dGVuc2lvbkJ1aWxkZXIgJiYKICAgICAgICAgICAgICAgICAgbm9kZSA9PSBkZWNsYXJhdGlvbi5leHRlbnNpb24pLAogICAgICAgICAgIlVuZXhwZWN0ZWQgZGVjbGFyYXRpb24gJHtkZWNsYXJhdGlvbn0gKCR7ZGVjbGFyYXRpb24ucnVudGltZVR5cGV9KSAiCiAgICAgICAgICAiZm9yIG5vZGUgJHtub2RlfSAoJHtub2RlLnJ1bnRpbWVUeXBlfSkuIik7CiAgICB9CiAgfQp9CoF8AE5OPAEkAScBIQkPHBIVEw8WERUQExMVExMTGBcRASIoLywrLTsqKS0BHQkREiceHQExPAFKARgBOAEmAToBKwFBASslATNLKQEMF00jBAIBNgwZARUBKAYxLy0BTRIfKSsYIQEwOyooJTQrBAEYRigfGQ4GHRkUJy4rKicBJBkNPgYEAQwvAQxFAQwwNQEqASYBDCMBLBBPBAEqEBEeQQ0EAR1ENzM1Ji41OT4KDyYIBgQBKywzSAQBIiQfHBo1Qz0kDzIkCDweRA1QBgQBDEkzKhQxDTEGIy4GIRY5DzkIBhgEASUiPEwGRh0EAQxQNgQBDCdDNipCPkpNPjBJOy5HBAEMIT0EAR4bBAFQJUIEARtHGxYYFU87RREBETA5QC01DDswCDcIATBDPScbEz80JS4jESBHCgEkOxE7Cg8YHx04HCg4ISQlOCEmOBwoOBwRTAo+HxsiQxIYChgYSTsRGEo7CiMbMUsSGAoIAQ5GMjJOMjJQNgYEAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9saWJyYXJ5X2J1aWxkZXIuZGFydF1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9kaWxsL2RpbGxfdGFyZ2V0LmRhcnSJnC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmRpbGxfdGFyZ2V0OwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnCiAgICBzaG93IExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IFRhcmdldDsKCmltcG9ydCAnLi4vYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydCcgc2hvdyBUYXJnZXRJbXBsZW1lbnRhdGlvbjsKCmltcG9ydCAnLi4vdGlja2VyLmRhcnQnIHNob3cgVGlja2VyOwoKaW1wb3J0ICcuLi91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX2xvYWRlci5kYXJ0JyBzaG93IERpbGxMb2FkZXI7CgpjbGFzcyBEaWxsVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0SW1wbGVtZW50YXRpb24gewogIGZpbmFsIE1hcDxVcmksIERpbGxMaWJyYXJ5QnVpbGRlcj4gbGlicmFyeUJ1aWxkZXJzID0KICAgICAgPFVyaSwgRGlsbExpYnJhcnlCdWlsZGVyPnt9OwoKICBib29sIGlzTG9hZGVkID0gZmFsc2U7CgogIERpbGxMb2FkZXIgbG9hZGVyOwoKICBEaWxsVGFyZ2V0KFRpY2tlciB0aWNrZXIsIFVyaVRyYW5zbGF0b3IgdXJpVHJhbnNsYXRvciwgVGFyZ2V0IGJhY2tlbmRUYXJnZXQpCiAgICAgIDogc3VwZXIodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBiYWNrZW5kVGFyZ2V0KSB7CiAgICBsb2FkZXIgPSBuZXcgRGlsbExvYWRlcih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgIFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpLCBMaXN0PGludD4gbGluZVN0YXJ0cywgTGlzdDxpbnQ+IHNvdXJjZUNvZGUpIHsKICAgIHVuc3VwcG9ydGVkKCJhZGRTb3VyY2VJbmZvcm1hdGlvbiIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxOdWxsPiBidWlsZENvbXBvbmVudCgpIHsKICAgIHJldHVybiBuZXcgRnV0dXJlPE51bGw+LnN5bmMoKCkgPT4gdW5zdXBwb3J0ZWQoImJ1aWxkQ29tcG9uZW50IiwgLTEsIG51bGwpKTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxOdWxsPiBidWlsZE91dGxpbmVzKHtib29sIHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiBmYWxzZX0pIGFzeW5jIHsKICAgIGlmIChsb2FkZXIubGlicmFyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgYXdhaXQgbG9hZGVyLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgbG9hZGVyLmZpbmFsaXplRXhwb3J0cygKICAgICAgICAgIHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiBzdXBwcmVzc0ZpbmFsaXphdGlvbkVycm9ycyk7CiAgICB9CiAgICBpc0xvYWRlZCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBEaWxsTGlicmFyeUJ1aWxkZXIgY3JlYXRlTGlicmFyeUJ1aWxkZXIoCiAgICAgIFVyaSB1cmksCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBMaWJyYXJ5QnVpbGRlciBvcmlnaW4sCiAgICAgIExpYnJhcnkgcmVmZXJlbmNlc0Zyb20sCiAgICAgIGJvb2wgcmVmZXJlbmNlSXNQYXJ0T3duZXIpIHsKICAgIGFzc2VydChvcmlnaW4gPT0gbnVsbCk7CiAgICBhc3NlcnQocmVmZXJlbmNlc0Zyb20gPT0gbnVsbCk7CiAgICBEaWxsTGlicmFyeUJ1aWxkZXIgbGlicmFyeUJ1aWxkZXIgPSBsaWJyYXJ5QnVpbGRlcnMucmVtb3ZlKHVyaSk7CiAgICBhc3NlcnQobGlicmFyeUJ1aWxkZXIgIT0gbnVsbCwgIk5vIGxpYnJhcnkgZm91bmQgZm9yICR1cmkuIik7CiAgICByZXR1cm4gbGlicmFyeUJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJyZWFrQ3ljbGUoQ2xhc3NCdWlsZGVyIGNscykge30KCiAgdm9pZCBhZGRMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgbGlicmFyeUJ1aWxkZXJzW2xpYnJhcnkuaW1wb3J0VXJpXSA9CiAgICAgICAgbmV3IERpbGxMaWJyYXJ5QnVpbGRlcihsaWJyYXJ5LCBsb2FkZXIpOwogIH0KCiAgdm9pZCByZWxlYXNlQW5jaWxsYXJ5UmVzb3VyY2VzKCkgewogICAgbGlicmFyeUJ1aWxkZXJzLmNsZWFyKCk7CiAgfQp9ClsATk48ARsBIQFCGQEvATkBKAEsAUIBJQE0ATwBKwEwNyMBGQEVAU82IwQBDB1QMwQBDCJRBAEMTyckHkMGFQQBDCsPEx0eIxwkRUIbBAEMJwElKTEEASUdBAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfdGFyZ2V0LmRhcnRTZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZXhwb3J0LmRhcnSEMy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmV4cG9ydDsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICdjb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmNsYXNzIEV4cG9ydCB7CiAgLy8vIFRoZSBsaWJyYXJ5IHRoYXQgaXMgZXhwb3J0aW5nIFtleHBvcnRlZF07CiAgZmluYWwgTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZXI7CgogIC8vLyBUaGUgbGlicmFyeSBiZWluZyBleHBvcnRlZC4KICBMaWJyYXJ5QnVpbGRlciBleHBvcnRlZDsKCiAgZmluYWwgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9yczsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIEV4cG9ydCh0aGlzLmV4cG9ydGVyLCB0aGlzLmV4cG9ydGVkLCB0aGlzLmNvbWJpbmF0b3JzLCB0aGlzLmNoYXJPZmZzZXQpOwoKICBVcmkgZ2V0IGZpbGVVcmkgPT4gZXhwb3J0ZXIuZmlsZVVyaTsKCiAgYm9vbCBhZGRUb0V4cG9ydFNjb3BlKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgaWYgKGNvbWJpbmF0b3JzICE9IG51bGwpIHsKICAgICAgZm9yIChDb21iaW5hdG9yIGNvbWJpbmF0b3IgaW4gY29tYmluYXRvcnMpIHsKICAgICAgICBpZiAoY29tYmluYXRvci5pc1Nob3cgJiYgIWNvbWJpbmF0b3IubmFtZXMuY29udGFpbnMobmFtZSkpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoY29tYmluYXRvci5pc0hpZGUgJiYgY29tYmluYXRvci5uYW1lcy5jb250YWlucyhuYW1lKSkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZXhwb3J0ZXIuYWRkVG9FeHBvcnRTY29wZShuYW1lLCBtZW1iZXIsIGNoYXJPZmZzZXQpOwogIH0KfQomAE5OPAEWAR8nASoBDzAhASIbASYBGAFLAScBNx8zUVAIBkAEAgEncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2V4cG9ydC5kYXJ0U2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2ltcG9ydC5kYXJ0jGEvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5pbXBvcnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IExpYnJhcnlEZXBlbmRlbmN5OwoKaW1wb3J0ICdidWlsZGVyL2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAna2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgdG9LZXJuZWxDb21iaW5hdG9yczsKCmltcG9ydCAnY29tYmluYXRvci5kYXJ0JyBzaG93IENvbWJpbmF0b3I7CgppbXBvcnQgJ2NvbmZpZ3VyYXRpb24uZGFydCcgc2hvdyBDb25maWd1cmF0aW9uOwoKY2xhc3MgSW1wb3J0IHsKICAvLy8gVGhlIGxpYnJhcnkgdGhhdCBpcyBpbXBvcnRpbmcgW2ltcG9ydGVkXTsKICBmaW5hbCBMaWJyYXJ5QnVpbGRlciBpbXBvcnRlcjsKCiAgLy8vIFRoZSBsaWJyYXJ5IGJlaW5nIGltcG9ydGVkLgogIExpYnJhcnlCdWlsZGVyIGltcG9ydGVkOwoKICBmaW5hbCBQcmVmaXhCdWlsZGVyIHByZWZpeEJ1aWxkZXI7CgogIGZpbmFsIGJvb2wgZGVmZXJyZWQ7CgogIGZpbmFsIFN0cmluZyBwcmVmaXg7CgogIGZpbmFsIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnM7CgogIGZpbmFsIExpc3Q8Q29uZmlndXJhdGlvbj4gY29uZmlndXJhdGlvbnM7CgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBpbnQgcHJlZml4Q2hhck9mZnNldDsKCiAgLy8gVGhlIExpYnJhcnlCdWlsZGVyIGZvciB0aGUgaW1wb3J0ZWQgbGlicmFyeSAoJ2ltcG9ydGVkJykgbWF5IGJlIG51bGwgd2hlbgogIC8vIHRoaXMgZmllbGQgaXMgc2V0LgogIGZpbmFsIFN0cmluZyBuYXRpdmVJbXBvcnRQYXRoOwoKICBJbXBvcnQoCiAgICAgIHRoaXMuaW1wb3J0ZXIsCiAgICAgIHRoaXMuaW1wb3J0ZWQsCiAgICAgIHRoaXMuZGVmZXJyZWQsCiAgICAgIHRoaXMucHJlZml4LAogICAgICB0aGlzLmNvbWJpbmF0b3JzLAogICAgICB0aGlzLmNvbmZpZ3VyYXRpb25zLAogICAgICB0aGlzLmNoYXJPZmZzZXQsCiAgICAgIHRoaXMucHJlZml4Q2hhck9mZnNldCwKICAgICAgaW50IGltcG9ydEluZGV4LAogICAgICB7dGhpcy5uYXRpdmVJbXBvcnRQYXRofSkKICAgICAgOiBwcmVmaXhCdWlsZGVyID0gY3JlYXRlUHJlZml4QnVpbGRlcihwcmVmaXgsIGltcG9ydGVyLCBpbXBvcnRlZCwKICAgICAgICAgICAgY29tYmluYXRvcnMsIGRlZmVycmVkLCBjaGFyT2Zmc2V0LCBwcmVmaXhDaGFyT2Zmc2V0LCBpbXBvcnRJbmRleCk7CgogIFVyaSBnZXQgZmlsZVVyaSA9PiBpbXBvcnRlci5maWxlVXJpOwoKICB2b2lkIGZpbmFsaXplSW1wb3J0cyhMaWJyYXJ5QnVpbGRlciBpbXBvcnRlcikgewogICAgaWYgKG5hdGl2ZUltcG9ydFBhdGggIT0gbnVsbCkgcmV0dXJuOwogICAgdm9pZCBGdW5jdGlvbihTdHJpbmcsIEJ1aWxkZXIpIGFkZDsKICAgIGlmIChwcmVmaXhCdWlsZGVyID09IG51bGwpIHsKICAgICAgYWRkID0gKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgICAgIGltcG9ydGVyLmFkZFRvU2NvcGUobmFtZSwgbWVtYmVyLCBjaGFyT2Zmc2V0LCB0cnVlKTsKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZCA9IChTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIHsKICAgICAgICBwcmVmaXhCdWlsZGVyLmFkZFRvRXhwb3J0U2NvcGUobmFtZSwgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICAgICAgfTsKICAgIH0KICAgIGltcG9ydGVkLmV4cG9ydFNjb3BlLmZvckVhY2goKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgICBpZiAoY29tYmluYXRvcnMgIT0gbnVsbCkgewogICAgICAgIGZvciAoQ29tYmluYXRvciBjb21iaW5hdG9yIGluIGNvbWJpbmF0b3JzKSB7CiAgICAgICAgICBpZiAoY29tYmluYXRvci5pc1Nob3cgJiYgIWNvbWJpbmF0b3IubmFtZXMuY29udGFpbnMobmFtZSkpIHJldHVybjsKICAgICAgICAgIGlmIChjb21iaW5hdG9yLmlzSGlkZSAmJiBjb21iaW5hdG9yLm5hbWVzLmNvbnRhaW5zKG5hbWUpKSByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZChuYW1lLCBtZW1iZXIpOwogICAgfSk7CiAgICBpZiAocHJlZml4QnVpbGRlciAhPSBudWxsKSB7CiAgICAgIEJ1aWxkZXIgZXhpc3RpbmcgPQogICAgICAgICAgaW1wb3J0ZXIuYWRkQnVpbGRlcihwcmVmaXgsIHByZWZpeEJ1aWxkZXIsIHByZWZpeENoYXJPZmZzZXQpOwogICAgICBpZiAoZXhpc3RpbmcgPT0gcHJlZml4QnVpbGRlcikgewogICAgICAgIGltcG9ydGVyLmFkZFRvU2NvcGUocHJlZml4LCBwcmVmaXhCdWlsZGVyLCBwcmVmaXhDaGFyT2Zmc2V0LCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KfQoKUHJlZml4QnVpbGRlciBjcmVhdGVQcmVmaXhCdWlsZGVyKAogICAgU3RyaW5nIHByZWZpeCwKICAgIExpYnJhcnlCdWlsZGVyIGltcG9ydGVyLAogICAgTGlicmFyeUJ1aWxkZXIgaW1wb3J0ZWQsCiAgICBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzLAogICAgYm9vbCBkZWZlcnJlZCwKICAgIGludCBjaGFyT2Zmc2V0LAogICAgaW50IHByZWZpeENoYXJPZmZzZXQsCiAgICBpbnQgaW1wb3J0SW5kZXgpIHsKICBpZiAocHJlZml4ID09IG51bGwpIHJldHVybiBudWxsOwogIExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBudWxsOwogIGlmIChkZWZlcnJlZCkgewogICAgZGVwZW5kZW5jeSA9IG5ldyBMaWJyYXJ5RGVwZW5kZW5jeS5kZWZlcnJlZEltcG9ydChpbXBvcnRlZC5saWJyYXJ5LCBwcmVmaXgsCiAgICAgICAgY29tYmluYXRvcnM6IHRvS2VybmVsQ29tYmluYXRvcnMoY29tYmluYXRvcnMpKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogIH0KICByZXR1cm4gbmV3IFByZWZpeEJ1aWxkZXIoCiAgICAgIHByZWZpeCwgZGVmZXJyZWQsIGltcG9ydGVyLCBkZXBlbmRlbmN5LCBwcmVmaXhDaGFyT2Zmc2V0LCBpbXBvcnRJbmRleCk7Cn0KbwBOTjwBFgE5AR8nJgE+ASoBMAEPMCEBIhsBJQEXARcBJgEsARgBHgFPGCEBChUVFRMYGxcdFx9ITwEnATIqKCEsPQkNLEIJBkEhNU1MCggZCCEZSCdMCAYEAgEjEx0dIhMUGhcjJxJQNyEEHE4CASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaW1wb3J0LmRhcnRSZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc2NvcGUuZGFydMAAVr0vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY29wZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAnYnVpbGRlci9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdidWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9uYW1lX2l0ZXJhdG9yLmRhcnQnOwppbXBvcnQgJ2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBKdW1wVGFyZ2V0OwppbXBvcnQgJ2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyOwoKaW1wb3J0ICdmYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlLAogICAgICAgIHRlbXBsYXRlQWNjZXNzRXJyb3IsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2U7CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bnN1cHBvcnRlZDsKCmNsYXNzIE11dGFibGVTY29wZSB7CiAgLy8vIE5hbWVzIGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuCiAgTWFwPFN0cmluZywgQnVpbGRlcj4gX2xvY2FsOwoKICAvLy8gU2V0dGVycyBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLgogIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IF9zZXR0ZXJzOwoKICAvLy8gVGhlIGV4dGVuc2lvbnMgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS4KICAvLy8KICAvLy8gVGhpcyBpbmNsdWRlcyBhbGwgYXZhaWxhYmxlIGV4dGVuc2lvbnMgZXZlbiBpZiB0aGUgZXh0ZW5zaW9ucyBhcmUgbm90CiAgLy8vIGFjY2Vzc2libGUgYnkgbmFtZSBiZWNhdXNlIG9mIGR1cGxpY2F0ZSBpbXBvcnRzLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2U6CiAgLy8vCiAgLy8vICAgbGliMS5kYXJ0OgogIC8vLyAgICAgZXh0ZW5zaW9uIEV4dGVuc2lvbiBvbiBTdHJpbmcgewogIC8vLyAgICAgICBtZXRob2QxKCkge30KICAvLy8gICAgICAgc3RhdGljTWV0aG9kMSgpIHt9CiAgLy8vICAgICB9CiAgLy8vICAgbGliMi5kYXJ0OgogIC8vLyAgICAgZXh0ZW5zaW9uIEV4dGVuc2lvbiBvbiBTdHJpbmcgewogIC8vLyAgICAgICBtZXRob2QyKCkge30KICAvLy8gICAgICAgc3RhdGljTWV0aG9kMigpIHt9CiAgLy8vICAgICB9CiAgLy8vICAgbWFpbi5kYXJ0OgogIC8vLyAgICAgaW1wb3J0ICdsaWIxLmRhcnQnOwogIC8vLyAgICAgaW1wb3J0ICdsaWIyLmRhcnQnOwogIC8vLwogIC8vLyAgICAgbWFpbigpIHsKICAvLy8gICAgICAgJ2ZvbycubWV0aG9kMSgpOyAvLyBUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUuCiAgLy8vICAgICAgICdmb28nLm1ldGhvZDIoKTsgLy8gVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlLgogIC8vLyAgICAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBub3QgYXZhaWxhYmxlIGJlY2F1c2UgRXh0ZW5zaW9uIGlzIGFtYmlndW91czoKICAvLy8gICAgICAgRXh0ZW5zaW9uLnN0YXRpY01ldGhvZDEoKTsKICAvLy8gICAgICAgRXh0ZW5zaW9uLnN0YXRpY01ldGhvZDIoKTsKICAvLy8gICAgIH0KICAvLy8KICBTZXQ8RXh0ZW5zaW9uQnVpbGRlcj4gX2V4dGVuc2lvbnM7CgogIC8vLyBUaGUgc2NvcGUgdGhhdCB0aGlzIHNjb3BlIGlzIG5lc3RlZCB3aXRoaW4sIG9yIGBudWxsYCBpZiB0aGlzIGlzIHRoZSB0b3AKICAvLy8gbGV2ZWwgc2NvcGUuCiAgU2NvcGUgX3BhcmVudDsKCiAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZU9yRGVidWdOYW1lOwoKICBNdXRhYmxlU2NvcGUodGhpcy5fbG9jYWwsIHRoaXMuX3NldHRlcnMsIHRoaXMuX2V4dGVuc2lvbnMsIHRoaXMuX3BhcmVudCwKICAgICAgdGhpcy5jbGFzc05hbWVPckRlYnVnTmFtZSkgewogICAgYXNzZXJ0KGNsYXNzTmFtZU9yRGVidWdOYW1lICE9IG51bGwpOwogIH0KCiAgU2NvcGUgZ2V0IHBhcmVudCA9PiBfcGFyZW50OwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiU2NvcGUoJGNsYXNzTmFtZU9yRGVidWdOYW1lLCAke19sb2NhbC5rZXlzfSkiOwp9CgpjbGFzcyBTY29wZSBleHRlbmRzIE11dGFibGVTY29wZSB7CiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIGFuIGF0dGVtcHQgdG8gZGVjbGFyZSBuZXcgbmFtZXMgaW4gdGhpcyBzY29wZSBzaG91bGQKICAvLy8gc3VjY2VlZC4KICBmaW5hbCBib29sIGlzTW9kaWZpYWJsZTsKCiAgTWFwPFN0cmluZywgSnVtcFRhcmdldD4gbGFiZWxzOwoKICBNYXA8U3RyaW5nLCBKdW1wVGFyZ2V0PiBmb3J3YXJkRGVjbGFyZWRMYWJlbHM7CgogIE1hcDxTdHJpbmcsIGludD4gdXNlZE5hbWVzOwoKICBTY29wZSgKICAgICAge01hcDxTdHJpbmcsIEJ1aWxkZXI+IGxvY2FsLAogICAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBzZXR0ZXJzLAogICAgICBTZXQ8RXh0ZW5zaW9uQnVpbGRlcj4gZXh0ZW5zaW9ucywKICAgICAgU2NvcGUgcGFyZW50LAogICAgICBTdHJpbmcgZGVidWdOYW1lLAogICAgICB0aGlzLmlzTW9kaWZpYWJsZTogdHJ1ZX0pCiAgICAgIDogc3VwZXIobG9jYWwsIHNldHRlcnMgPSBzZXR0ZXJzID8/IGNvbnN0IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgIGV4dGVuc2lvbnMsIHBhcmVudCwgZGVidWdOYW1lKTsKCiAgU2NvcGUudG9wKHtib29sIGlzTW9kaWZpYWJsZTogZmFsc2V9KQogICAgICA6IHRoaXMoCiAgICAgICAgICAgIGxvY2FsOiA8U3RyaW5nLCBCdWlsZGVyPnt9LAogICAgICAgICAgICBzZXR0ZXJzOiA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LAogICAgICAgICAgICBkZWJ1Z05hbWU6ICJ0b3AiLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSk7CgogIFNjb3BlLmltbXV0YWJsZSgpCiAgICAgIDogdGhpcygKICAgICAgICAgICAgbG9jYWw6IGNvbnN0IDxTdHJpbmcsIEJ1aWxkZXI+e30sCiAgICAgICAgICAgIHNldHRlcnM6IGNvbnN0IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgIGRlYnVnTmFtZTogImltbXV0YWJsZSIsCiAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwoKICBTY29wZS5uZXN0ZWQoU2NvcGUgcGFyZW50LCBTdHJpbmcgZGVidWdOYW1lLCB7Ym9vbCBpc01vZGlmaWFibGU6IHRydWV9KQogICAgICA6IHRoaXMoCiAgICAgICAgICAgIGxvY2FsOiA8U3RyaW5nLCBCdWlsZGVyPnt9LAogICAgICAgICAgICBzZXR0ZXJzOiA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LAogICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICAgICAgZGVidWdOYW1lOiBkZWJ1Z05hbWUsCiAgICAgICAgICAgIGlzTW9kaWZpYWJsZTogaXNNb2RpZmlhYmxlKTsKCiAgSXRlcmF0b3I8QnVpbGRlcj4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgU2NvcGVMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IodGhpcyk7CiAgfQoKICBOYW1lSXRlcmF0b3IgZ2V0IG5hbWVJdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFNjb3BlTG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcih0aGlzKTsKICB9CgogIHZvaWQgZGVidWcoKSB7CiAgICBwcmludCgiTG9jYWxzOiIpOwogICAgX2xvY2FsLmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgcHJpbnQoIiAgJGtleTogJHZhbHVlICgke2lkZW50aXR5SGFzaENvZGUodmFsdWUpfSkgKCR7dmFsdWUucGFyZW50fSkiKTsKICAgIH0pOwogICAgcHJpbnQoIlNldHRlcnM6Iik7CiAgICBfc2V0dGVycy5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIHByaW50KCIgICRrZXk6ICR2YWx1ZSAoJHtpZGVudGl0eUhhc2hDb2RlKHZhbHVlKX0pICgke3ZhbHVlLnBhcmVudH0pIik7CiAgICB9KTsKICAgIHByaW50KCJFeHRlbnNpb25zOiIpOwogICAgX2V4dGVuc2lvbnM/LmZvckVhY2goKHYpIHsKICAgICAgcHJpbnQoIiAgJHYiKTsKICAgIH0pOwogIH0KCiAgLy8vIFBhdGNoIHVwIHRoZSBzY29wZSwgdXNpbmcgdGhlIHR3byByZXBsYWNlbWVudCBtYXBzIHRvIHJlcGxhY2UgYnVpbGRlcnMgaW4KICAvLy8gc2NvcGUuIFRoZSByZXBsYWNlbWVudCBtYXBzIG1hcHMgZnJvbSBvbGQgTGlicmFyeUJ1aWxkZXIgdG8gbWFwLCBtYXBwaW5nCiAgLy8vIGZyb20gbmFtZSB0byBuZXcgKHJlcGxhY2VtZW50KSBidWlsZGVyLgogIHZvaWQgcGF0Y2hVcFNjb3BlKE1hcDxMaWJyYXJ5QnVpbGRlciwgTWFwPFN0cmluZywgQnVpbGRlcj4+IHJlcGxhY2VtZW50TWFwLAogICAgICBNYXA8TGlicmFyeUJ1aWxkZXIsIE1hcDxTdHJpbmcsIEJ1aWxkZXI+PiByZXBsYWNlbWVudE1hcFNldHRlcnMpIHsKICAgIF9sb2NhbC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChyZXBsYWNlbWVudE1hcC5jb250YWluc0tleSh2YWx1ZS5wYXJlbnQpKSB7CiAgICAgICAgX2xvY2FsW2tleV0gPSByZXBsYWNlbWVudE1hcFt2YWx1ZS5wYXJlbnRdW2tleV07CiAgICAgIH0KICAgIH0pOwogICAgX3NldHRlcnMuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAocmVwbGFjZW1lbnRNYXBTZXR0ZXJzLmNvbnRhaW5zS2V5KHZhbHVlLnBhcmVudCkpIHsKICAgICAgICBfc2V0dGVyc1trZXldID0gcmVwbGFjZW1lbnRNYXBTZXR0ZXJzW3ZhbHVlLnBhcmVudF1ba2V5XTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoX2V4dGVuc2lvbnMgIT0gbnVsbCkgewogICAgICBib29sIG5lZWRzUGF0Y2hpbmcgPSBmYWxzZTsKICAgICAgZm9yIChFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXIgaW4gX2V4dGVuc2lvbnMpIHsKICAgICAgICBpZiAocmVwbGFjZW1lbnRNYXAuY29udGFpbnNLZXkoZXh0ZW5zaW9uQnVpbGRlci5wYXJlbnQpKSB7CiAgICAgICAgICBuZWVkc1BhdGNoaW5nID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmVlZHNQYXRjaGluZykgewogICAgICAgIFNldDxFeHRlbnNpb25CdWlsZGVyPiBleHRlbnNpb25zUmVwbGFjZW1lbnQgPQogICAgICAgICAgICBuZXcgU2V0PEV4dGVuc2lvbkJ1aWxkZXI+KCk7CiAgICAgICAgZm9yIChFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXIgaW4gX2V4dGVuc2lvbnMpIHsKICAgICAgICAgIGlmIChyZXBsYWNlbWVudE1hcC5jb250YWluc0tleShleHRlbnNpb25CdWlsZGVyLnBhcmVudCkpIHsKICAgICAgICAgICAgYXNzZXJ0KHJlcGxhY2VtZW50TWFwW2V4dGVuc2lvbkJ1aWxkZXIucGFyZW50XQogICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25CdWlsZGVyLm5hbWVdICE9CiAgICAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgICAgZXh0ZW5zaW9uc1JlcGxhY2VtZW50LmFkZCgKICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50TWFwW2V4dGVuc2lvbkJ1aWxkZXIucGFyZW50XVtleHRlbnNpb25CdWlsZGVyLm5hbWVdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBleHRlbnNpb25zUmVwbGFjZW1lbnQuYWRkKGV4dGVuc2lvbkJ1aWxkZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfZXh0ZW5zaW9ucy5jbGVhcigpOwogICAgICAgIGV4dGVuc2lvbnNSZXBsYWNlbWVudC5hZGRBbGwoZXh0ZW5zaW9uc1JlcGxhY2VtZW50KTsKICAgICAgfQogICAgfQogIH0KCiAgU2NvcGUgY29weVdpdGhQYXJlbnQoU2NvcGUgcGFyZW50LCBTdHJpbmcgZGVidWdOYW1lKSB7CiAgICByZXR1cm4gbmV3IFNjb3BlKAogICAgICAgIGxvY2FsOiBzdXBlci5fbG9jYWwsCiAgICAgICAgc2V0dGVyczogc3VwZXIuX3NldHRlcnMsCiAgICAgICAgZXh0ZW5zaW9uczogX2V4dGVuc2lvbnMsCiAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgZGVidWdOYW1lOiBkZWJ1Z05hbWUsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBpc01vZGlmaWFibGUpOwogIH0KCiAgLy8vIERvbid0IHVzZSB0aGlzLiBVc2UgW2JlY29tZVBhcnRPZl0gaW5zdGVhZC4KICB2b2lkIHNldCBwYXJlbnQoXykgPT4gdW5zdXBwb3J0ZWQoInBhcmVudD0iLCAtMSwgbnVsbCk7CgogIC8vLyBUaGlzIHNjb3BlIGJlY29tZXMgZXF1aXZhbGVudCB0byBbc2NvcGVdLiBUaGlzIGlzIHVzZWQgZm9yIHBhcnRzIHRvCiAgLy8vIGJlY29tZSBwYXJ0IG9mIHRoZWlyIGxpYnJhcnkncyBzY29wZS4KICB2b2lkIGJlY29tZVBhcnRPZihTY29wZSBzY29wZSkgewogICAgYXNzZXJ0KF9wYXJlbnQuX3BhcmVudCA9PSBudWxsKTsKICAgIGFzc2VydChzY29wZS5fcGFyZW50Ll9wYXJlbnQgPT0gbnVsbCk7CiAgICBzdXBlci5fbG9jYWwgPSBzY29wZS5fbG9jYWw7CiAgICBzdXBlci5fc2V0dGVycyA9IHNjb3BlLl9zZXR0ZXJzOwogICAgc3VwZXIuX3BhcmVudCA9IHNjb3BlLl9wYXJlbnQ7CiAgICBzdXBlci5fZXh0ZW5zaW9ucyA9IHNjb3BlLl9leHRlbnNpb25zOwogIH0KCiAgU2NvcGUgY3JlYXRlTmVzdGVkU2NvcGUoU3RyaW5nIGRlYnVnTmFtZSwge2Jvb2wgaXNNb2RpZmlhYmxlOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBTY29wZS5uZXN0ZWQodGhpcywgZGVidWdOYW1lLCBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSk7CiAgfQoKICBTY29wZSB3aXRoVHlwZVZhcmlhYmxlcyhMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwpIHJldHVybiB0aGlzOwogICAgU2NvcGUgbmV3U2NvcGUgPQogICAgICAgIG5ldyBTY29wZS5uZXN0ZWQodGhpcywgInR5cGUgdmFyaWFibGVzIiwgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdCBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgIG5ld1Njb3BlLl9sb2NhbFt0Lm5hbWVdID0gdDsKICAgIH0KICAgIHJldHVybiBuZXdTY29wZTsKICB9CgogIC8vLyBDcmVhdGUgYSBzcGVjaWFsIHNjb3BlIGZvciB1c2UgYnkgbGFiZWxlZCBzdGF0ZW1lbnRzLiBUaGlzIHNjb3BlIGRvZXNuJ3QKICAvLy8gaW50cm9kdWNlIGEgbmV3IHNjb3BlIGZvciBsb2NhbCB2YXJpYWJsZXMsIG9ubHkgZm9yIGxhYmVscy4gVGhpcyBkZWFscwogIC8vLyB3aXRoIGNvcm5lciBjYXNlcyBsaWtlIHRoaXM6CiAgLy8vCiAgLy8vICAgICBMOiB2YXIgeDsKICAvLy8gICAgIHggPSA0MjsKICAvLy8gICAgIHByaW50KCJUaGUgYW5zd2VyIGlzICR4LiIpOwogIFNjb3BlIGNyZWF0ZU5lc3RlZExhYmVsU2NvcGUoKSB7CiAgICByZXR1cm4gbmV3IFNjb3BlKAogICAgICAgIGxvY2FsOiBfbG9jYWwsCiAgICAgICAgc2V0dGVyczogX3NldHRlcnMsCiAgICAgICAgZXh0ZW5zaW9uczogX2V4dGVuc2lvbnMsCiAgICAgICAgcGFyZW50OiBfcGFyZW50LAogICAgICAgIGRlYnVnTmFtZTogImxhYmVsIiwKICAgICAgICBpc01vZGlmaWFibGU6IHRydWUpOwogIH0KCiAgdm9pZCByZWNvcmRVc2UoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgaWYgKGlzTW9kaWZpYWJsZSkgewogICAgICB1c2VkTmFtZXMgPz89IDxTdHJpbmcsIGludD57fTsKICAgICAgdXNlZE5hbWVzLnB1dElmQWJzZW50KG5hbWUsICgpID0+IGNoYXJPZmZzZXQpOwogICAgfQogIH0KCiAgQnVpbGRlciBsb29rdXBJbihTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpLAogICAgICBNYXA8U3RyaW5nLCBCdWlsZGVyPiBtYXAsIGJvb2wgaXNJbnN0YW5jZVNjb3BlKSB7CiAgICBCdWlsZGVyIGJ1aWxkZXIgPSBtYXBbbmFtZV07CiAgICBpZiAoYnVpbGRlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChidWlsZGVyLm5leHQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IEFtYmlndW91c0J1aWxkZXIobmFtZS5pc0VtcHR5ID8gY2xhc3NOYW1lT3JEZWJ1Z05hbWUgOiBuYW1lLAogICAgICAgICAgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9IGVsc2UgaWYgKCFpc0luc3RhbmNlU2NvcGUgJiYgYnVpbGRlci5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYnVpbGRlcjsKICAgIH0KICB9CgogIEJ1aWxkZXIgbG9va3VwKFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGlzSW5zdGFuY2VTY29wZTogdHJ1ZX0pIHsKICAgIHJlY29yZFVzZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIEJ1aWxkZXIgYnVpbGRlciA9CiAgICAgICAgbG9va3VwSW4obmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgX2xvY2FsLCBpc0luc3RhbmNlU2NvcGUpOwogICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgcmV0dXJuIGJ1aWxkZXI7CiAgICBidWlsZGVyID0gbG9va3VwSW4obmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgX3NldHRlcnMsIGlzSW5zdGFuY2VTY29wZSk7CiAgICBpZiAoYnVpbGRlciAhPSBudWxsICYmICFidWlsZGVyLmhhc1Byb2JsZW0pIHsKICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NFcnJvckJ1aWxkZXIobmFtZSwgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAoIWlzSW5zdGFuY2VTY29wZSkgewogICAgICAvLyBGb3Igc3RhdGljIGxvb2t1cCwgZG8gbm90IHNlYXJjaCB0aGUgcGFyZW50IHNjb3BlLgogICAgICByZXR1cm4gYnVpbGRlcjsKICAgIH0KICAgIHJldHVybiBidWlsZGVyID8/IF9wYXJlbnQ/Lmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEJ1aWxkZXIgbG9va3VwU2V0dGVyKFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGlzSW5zdGFuY2VTY29wZTogdHJ1ZX0pIHsKICAgIHJlY29yZFVzZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIEJ1aWxkZXIgYnVpbGRlciA9CiAgICAgICAgbG9va3VwSW4obmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgX3NldHRlcnMsIGlzSW5zdGFuY2VTY29wZSk7CiAgICBpZiAoYnVpbGRlciAhPSBudWxsKSByZXR1cm4gYnVpbGRlcjsKICAgIGJ1aWxkZXIgPSBsb29rdXBJbihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBfbG9jYWwsIGlzSW5zdGFuY2VTY29wZSk7CiAgICBpZiAoYnVpbGRlciAhPSBudWxsICYmICFidWlsZGVyLmhhc1Byb2JsZW0pIHsKICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NFcnJvckJ1aWxkZXIobmFtZSwgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgICBpZiAoIWlzSW5zdGFuY2VTY29wZSkgewogICAgICAvLyBGb3Igc3RhdGljIGxvb2t1cCwgZG8gbm90IHNlYXJjaCB0aGUgcGFyZW50IHNjb3BlLgogICAgICByZXR1cm4gYnVpbGRlcjsKICAgIH0KICAgIHJldHVybiBidWlsZGVyID8/IF9wYXJlbnQ/Lmxvb2t1cFNldHRlcihuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEJ1aWxkZXIgbG9va3VwTG9jYWxNZW1iZXIoU3RyaW5nIG5hbWUsIHtib29sIHNldHRlcn0pIHsKICAgIHJldHVybiBzZXR0ZXIgPyBfc2V0dGVyc1tuYW1lXSA6IF9sb2NhbFtuYW1lXTsKICB9CgogIHZvaWQgYWRkTG9jYWxNZW1iZXIoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyLCB7Ym9vbCBzZXR0ZXJ9KSB7CiAgICBpZiAoc2V0dGVyKSB7CiAgICAgIF9zZXR0ZXJzW25hbWVdID0gbWVtYmVyOwogICAgfSBlbHNlIHsKICAgICAgX2xvY2FsW25hbWVdID0gbWVtYmVyOwogICAgfQogIH0KCiAgdm9pZCBmb3JFYWNoTG9jYWxNZW1iZXIodm9pZCBGdW5jdGlvbihTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIGYpIHsKICAgIF9sb2NhbC5mb3JFYWNoKGYpOwogIH0KCiAgdm9pZCBmb3JFYWNoTG9jYWxTZXR0ZXIodm9pZCBGdW5jdGlvbihTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBtZW1iZXIpIGYpIHsKICAgIF9zZXR0ZXJzLmZvckVhY2goZik7CiAgfQoKICBJdGVyYWJsZTxCdWlsZGVyPiBnZXQgbG9jYWxNZW1iZXJzID0+IF9sb2NhbC52YWx1ZXM7CgogIEl0ZXJhYmxlPE1lbWJlckJ1aWxkZXI+IGdldCBsb2NhbFNldHRlcnMgPT4gX3NldHRlcnMudmFsdWVzOwoKICBib29sIGhhc0xvY2FsTGFiZWwoU3RyaW5nIG5hbWUpID0+IGxhYmVscyAhPSBudWxsICYmIGxhYmVscy5jb250YWluc0tleShuYW1lKTsKCiAgdm9pZCBkZWNsYXJlTGFiZWwoU3RyaW5nIG5hbWUsIEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICBpZiAoaXNNb2RpZmlhYmxlKSB7CiAgICAgIGxhYmVscyA/Pz0gPFN0cmluZywgSnVtcFRhcmdldD57fTsKICAgICAgbGFiZWxzW25hbWVdID0gdGFyZ2V0OwogICAgfSBlbHNlIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlLCAtMSwgbnVsbCk7CiAgICB9CiAgfQoKICB2b2lkIGZvcndhcmREZWNsYXJlTGFiZWwoU3RyaW5nIG5hbWUsIEp1bXBUYXJnZXQgdGFyZ2V0KSB7CiAgICBkZWNsYXJlTGFiZWwobmFtZSwgdGFyZ2V0KTsKICAgIGZvcndhcmREZWNsYXJlZExhYmVscyA/Pz0gPFN0cmluZywgSnVtcFRhcmdldD57fTsKICAgIGZvcndhcmREZWNsYXJlZExhYmVsc1tuYW1lXSA9IHRhcmdldDsKICB9CgogIGJvb2wgY2xhaW1MYWJlbChTdHJpbmcgbmFtZSkgewogICAgaWYgKGZvcndhcmREZWNsYXJlZExhYmVscyA9PSBudWxsIHx8CiAgICAgICAgZm9yd2FyZERlY2xhcmVkTGFiZWxzLnJlbW92ZShuYW1lKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZm9yd2FyZERlY2xhcmVkTGFiZWxzLmxlbmd0aCA9PSAwKSB7CiAgICAgIGZvcndhcmREZWNsYXJlZExhYmVscyA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIE1hcDxTdHJpbmcsIEp1bXBUYXJnZXQ+IGdldCB1bmNsYWltZWRGb3J3YXJkRGVjbGFyYXRpb25zIHsKICAgIHJldHVybiBmb3J3YXJkRGVjbGFyZWRMYWJlbHM7CiAgfQoKICBCdWlsZGVyIGxvb2t1cExhYmVsKFN0cmluZyBuYW1lKSB7CiAgICByZXR1cm4gKGxhYmVscyA9PSBudWxsID8gbnVsbCA6IGxhYmVsc1tuYW1lXSkgPz8gX3BhcmVudD8ubG9va3VwTGFiZWwobmFtZSk7CiAgfQoKICAvLy8gRGVjbGFyZXMgdGhhdCB0aGUgbWVhbmluZyBvZiBbbmFtZV0gaW4gdGhpcyBzY29wZSBpcyBbYnVpbGRlcl0uCiAgLy8vCiAgLy8vIElmIG5hbWUgd2FzIHVzZWQgcHJldmlvdXNseSBpbiB0aGlzIHNjb3BlLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbWVzc2FnZQogIC8vLyB0aGF0IGNhbiBiZSB1c2VkIGFzIGNvbnRleHQgZm9yIHJlcG9ydGluZyBhIGNvbXBpbGUtdGltZSBlcnJvciBhYm91dAogIC8vLyBbbmFtZV0gYmVpbmcgdXNlZCBiZWZvcmUgaXRzIGRlY2xhcmVkLiBbZmlsZVVyaV0gaXMgdXNlZCB0byBiaW5kIHRoZQogIC8vLyBsb2NhdGlvbiBvZiB0aGlzIG1lc3NhZ2UuCiAgTG9jYXRlZE1lc3NhZ2UgZGVjbGFyZShTdHJpbmcgbmFtZSwgQnVpbGRlciBidWlsZGVyLCBVcmkgZmlsZVVyaSkgewogICAgaWYgKGlzTW9kaWZpYWJsZSkgewogICAgICBpZiAodXNlZE5hbWVzPy5jb250YWluc0tleShuYW1lKSA/PyBmYWxzZSkgewogICAgICAgIHJldHVybiB0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZQogICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpbGVVcmksIHVzZWROYW1lc1tuYW1lXSwgbmFtZS5sZW5ndGgpOwogICAgICB9CiAgICAgIF9sb2NhbFtuYW1lXSA9IGJ1aWxkZXI7CiAgICB9IGVsc2UgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGUsIC0xLCBudWxsKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIEFkZHMgW2J1aWxkZXJdIHRvIHRoZSBleHRlbnNpb25zIGluIHRoaXMgc2NvcGUuCiAgdm9pZCBhZGRFeHRlbnNpb24oRXh0ZW5zaW9uQnVpbGRlciBidWlsZGVyKSB7CiAgICBfZXh0ZW5zaW9ucyA/Pz0gPEV4dGVuc2lvbkJ1aWxkZXI+e307CiAgICBfZXh0ZW5zaW9ucy5hZGQoYnVpbGRlcik7CiAgfQoKICAvLy8gQ2FsbHMgW2ZdIGZvciBlYWNoIGV4dGVuc2lvbiBpbiB0aGlzIHNjb3BlIGFuZCBwYXJlbnQgc2NvcGVzLgogIHZvaWQgZm9yRWFjaEV4dGVuc2lvbih2b2lkIEZ1bmN0aW9uKEV4dGVuc2lvbkJ1aWxkZXIpIGYpIHsKICAgIF9leHRlbnNpb25zPy5mb3JFYWNoKGYpOwogICAgX3BhcmVudD8uZm9yRWFjaEV4dGVuc2lvbihmKTsKICB9CgogIHZvaWQgbWVyZ2UoCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBCdWlsZGVyIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgICAgIFN0cmluZyBuYW1lLCBCdWlsZGVyIGV4aXN0aW5nLCBCdWlsZGVyIG1lbWJlcikpIHsKICAgIE1hcDxTdHJpbmcsIEJ1aWxkZXI+IG1hcCA9IF9sb2NhbDsKCiAgICB2b2lkIG1lcmdlTWVtYmVyKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgICBCdWlsZGVyIGV4aXN0aW5nID0gbWFwW25hbWVdOwogICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAgIGlmIChleGlzdGluZyAhPSBtZW1iZXIpIHsKICAgICAgICAgIG1lbWJlciA9IGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbihuYW1lLCBleGlzdGluZywgbWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWFwW25hbWVdID0gbWVtYmVyOwogICAgfQoKICAgIHNjb3BlLl9sb2NhbC5mb3JFYWNoKG1lcmdlTWVtYmVyKTsKICAgIG1hcCA9IF9zZXR0ZXJzOwogICAgc2NvcGUuX3NldHRlcnMuZm9yRWFjaChtZXJnZU1lbWJlcik7CiAgfQoKICB2b2lkIGZvckVhY2goZihTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpKSB7CiAgICBfbG9jYWwuZm9yRWFjaChmKTsKICAgIF9zZXR0ZXJzLmZvckVhY2goZik7CiAgfQoKICBTdHJpbmcgZ2V0IGRlYnVnU3RyaW5nIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBpbnQgbmVzdGluZ0xldmVsID0gd3JpdGVPbihidWZmZXIpOwogICAgZm9yIChpbnQgaSA9IG5lc3RpbmdMZXZlbDsgaSA+PSAwOyBpLS0pIHsKICAgICAgYnVmZmVyLndyaXRlbG4oIiR7JyAgJyAqIGl9fSIpOwogICAgfQogICAgcmV0dXJuICIkYnVmZmVyIjsKICB9CgogIGludCB3cml0ZU9uKFN0cmluZ1Npbmsgc2luaykgewogICAgaW50IG5lc3RpbmdMZXZlbCA9IChfcGFyZW50Py53cml0ZU9uKHNpbmspID8/IC0xKSArIDE7CiAgICBTdHJpbmcgaW5kZW50ID0gIiAgIiAqIG5lc3RpbmdMZXZlbDsKICAgIHNpbmsud3JpdGVsbigiJGluZGVudHsiKTsKICAgIF9sb2NhbC5mb3JFYWNoKChTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIHsKICAgICAgc2luay53cml0ZWxuKCIkaW5kZW50ICAkbmFtZSIpOwogICAgfSk7CiAgICBfc2V0dGVycy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIHsKICAgICAgc2luay53cml0ZWxuKCIkaW5kZW50ICAkbmFtZT0iKTsKICAgIH0pOwogICAgcmV0dXJuIG5lc3RpbmdMZXZlbDsKICB9CgogIFNjb3BlIGNvbXB1dGVNaXhpblNjb3BlKCkgewogICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gdGhpcy5fbG9jYWwua2V5cy50b0xpc3QoKTsKICAgIE1hcDxTdHJpbmcsIEJ1aWxkZXI+IGxvY2FsID0gPFN0cmluZywgQnVpbGRlcj57fTsKICAgIGJvb2wgbmVlZHNDb3B5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07CiAgICAgIEJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0aGlzLl9sb2NhbFtuYW1lXTsKICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzU3RhdGljKSB7CiAgICAgICAgbmVlZHNDb3B5ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFtuYW1lXSA9IGRlY2xhcmF0aW9uOwogICAgICB9CiAgICB9CiAgICBuYW1lcyA9IHRoaXMuX3NldHRlcnMua2V5cy50b0xpc3QoKTsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IHNldHRlcnMgPSA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewogICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwogICAgICBNZW1iZXJCdWlsZGVyIGRlY2xhcmF0aW9uID0gdGhpcy5fc2V0dGVyc1tuYW1lXTsKICAgICAgaWYgKGRlY2xhcmF0aW9uLmlzU3RhdGljKSB7CiAgICAgICAgbmVlZHNDb3B5ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXR0ZXJzW25hbWVdID0gZGVjbGFyYXRpb247CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkc0NvcHkKICAgICAgICA/IG5ldyBTY29wZSgKICAgICAgICAgICAgbG9jYWw6IGxvY2FsLAogICAgICAgICAgICBzZXR0ZXJzOiBzZXR0ZXJzLAogICAgICAgICAgICBleHRlbnNpb25zOiBfZXh0ZW5zaW9ucywKICAgICAgICAgICAgcGFyZW50OiBfcGFyZW50LAogICAgICAgICAgICBkZWJ1Z05hbWU6IGNsYXNzTmFtZU9yRGVidWdOYW1lLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSkKICAgICAgICA6IHRoaXM7CiAgfQp9CgpjbGFzcyBDb25zdHJ1Y3RvclNjb3BlIHsKICAvLy8gQ29uc3RydWN0b3JzIGRlY2xhcmVkIGluIHRoaXMgc2NvcGUuCiAgZmluYWwgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gbG9jYWw7CgogIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7CgogIENvbnN0cnVjdG9yU2NvcGUodGhpcy5jbGFzc05hbWUsIHRoaXMubG9jYWwpOwoKICB2b2lkIGZvckVhY2goZihTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBtZW1iZXIpKSB7CiAgICBsb2NhbC5mb3JFYWNoKGYpOwogIH0KCiAgQnVpbGRlciBsb29rdXAoU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgQnVpbGRlciBidWlsZGVyID0gbG9jYWxbbmFtZV07CiAgICBpZiAoYnVpbGRlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChidWlsZGVyLm5leHQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IEFtYmlndW91c01lbWJlckJ1aWxkZXIoCiAgICAgICAgICBuYW1lLmlzRW1wdHkgPyBjbGFzc05hbWUgOiBuYW1lLCBidWlsZGVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBidWlsZGVyOwogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkNvbnN0cnVjdG9yU2NvcGUoJGNsYXNzTmFtZSwgJHtsb2NhbC5rZXlzfSkiOwp9CgphYnN0cmFjdCBjbGFzcyBMYXp5U2NvcGUgZXh0ZW5kcyBTY29wZSB7CiAgTGF6eVNjb3BlKE1hcDxTdHJpbmcsIEJ1aWxkZXI+IGxvY2FsLCBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBzZXR0ZXJzLAogICAgICBTY29wZSBwYXJlbnQsIFN0cmluZyBkZWJ1Z05hbWUsIHtib29sIGlzTW9kaWZpYWJsZTogdHJ1ZX0pCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIGxvY2FsOiBsb2NhbCwKICAgICAgICAgICAgc2V0dGVyczogc2V0dGVycywKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGRlYnVnTmFtZTogZGVidWdOYW1lLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGlzTW9kaWZpYWJsZSk7CgogIC8vLyBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBsYXppbHkgcG9wdWxhdGUgdGhlIHNjb3BlIGJlZm9yZSBhY2Nlc3MuCiAgdm9pZCBlbnN1cmVTY29wZSgpOwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBCdWlsZGVyPiBnZXQgX2xvY2FsIHsKICAgIGVuc3VyZVNjb3BlKCk7CiAgICByZXR1cm4gc3VwZXIuX2xvY2FsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gZ2V0IF9zZXR0ZXJzIHsKICAgIGVuc3VyZVNjb3BlKCk7CiAgICByZXR1cm4gc3VwZXIuX3NldHRlcnM7CiAgfQoKICBAb3ZlcnJpZGUKICBTZXQ8RXh0ZW5zaW9uQnVpbGRlcj4gZ2V0IF9leHRlbnNpb25zIHsKICAgIGVuc3VyZVNjb3BlKCk7CiAgICByZXR1cm4gc3VwZXIuX2V4dGVuc2lvbnM7CiAgfQp9CgpjbGFzcyBTY29wZUJ1aWxkZXIgewogIGZpbmFsIFNjb3BlIHNjb3BlOwoKICBTY29wZUJ1aWxkZXIodGhpcy5zY29wZSk7CgogIHZvaWQgYWRkTWVtYmVyKFN0cmluZyBuYW1lLCBCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIHNjb3BlLl9sb2NhbFtuYW1lXSA9IGJ1aWxkZXI7CiAgfQoKICB2b2lkIGFkZFNldHRlcihTdHJpbmcgbmFtZSwgQnVpbGRlciBidWlsZGVyKSB7CiAgICBzY29wZS5fc2V0dGVyc1tuYW1lXSA9IGJ1aWxkZXI7CiAgfQoKICB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb25CdWlsZGVyIGJ1aWxkZXIpIHsKICAgIHNjb3BlLmFkZEV4dGVuc2lvbihidWlsZGVyKTsKICB9CgogIEJ1aWxkZXIgb3BlcmF0b3IgW10oU3RyaW5nIG5hbWUpID0+IHNjb3BlLl9sb2NhbFtuYW1lXTsKfQoKY2xhc3MgQ29uc3RydWN0b3JTY29wZUJ1aWxkZXIgewogIGZpbmFsIENvbnN0cnVjdG9yU2NvcGUgc2NvcGU7CgogIENvbnN0cnVjdG9yU2NvcGVCdWlsZGVyKHRoaXMuc2NvcGUpOwoKICB2b2lkIGFkZE1lbWJlcihTdHJpbmcgbmFtZSwgQnVpbGRlciBidWlsZGVyKSB7CiAgICBzY29wZS5sb2NhbFtuYW1lXSA9IGJ1aWxkZXI7CiAgfQoKICBNZW1iZXJCdWlsZGVyIG9wZXJhdG9yIFtdKFN0cmluZyBuYW1lKSA9PiBzY29wZS5sb2NhbFtuYW1lXTsKfQoKYWJzdHJhY3QgY2xhc3MgUHJvYmxlbUJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVySW1wbCB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGZpbmFsIEJ1aWxkZXIgYnVpbGRlcjsKCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBQcm9ibGVtQnVpbGRlcih0aGlzLm5hbWUsIHRoaXMuYnVpbGRlciwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmZpbGVVcmkpOwoKICBnZXQgdGFyZ2V0ID0+IG51bGw7CgogIGJvb2wgZ2V0IGhhc1Byb2JsZW0gPT4gdHJ1ZTsKCiAgTWVzc2FnZSBnZXQgbWVzc2FnZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiBuYW1lOwp9CgovLy8gUmVwcmVzZW50cyBhIFtidWlsZGVyXSB0aGF0J3MgYmVpbmcgYWNjZXNzZWQgaW5jb3JyZWN0bHkuIEZvciBleGFtcGxlLCBhbgovLy8gYXR0ZW1wdCB0byB3cml0ZSB0byBhIGZpbmFsIGZpZWxkLCBvciB0byByZWFkIGZyb20gYSBzZXR0ZXIuCmNsYXNzIEFjY2Vzc0Vycm9yQnVpbGRlciBleHRlbmRzIFByb2JsZW1CdWlsZGVyIHsKICBBY2Nlc3NFcnJvckJ1aWxkZXIoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgYnVpbGRlciwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKQogICAgICA6IHN1cGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIGdldCBwYXJlbnQgPT4gYnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNGaW5hbCA9PiBidWlsZGVyLmlzRmluYWw7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmllbGQgPT4gYnVpbGRlci5pc0ZpZWxkOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1JlZ3VsYXJNZXRob2QgPT4gYnVpbGRlci5pc1JlZ3VsYXJNZXRob2Q7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzR2V0dGVyID0+ICFidWlsZGVyLmlzR2V0dGVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldHRlciA9PiAhYnVpbGRlci5pc1NldHRlcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyID0+IGJ1aWxkZXIuaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NsYXNzSW5zdGFuY2VNZW1iZXIgPT4gYnVpbGRlci5pc0NsYXNzSW5zdGFuY2VNZW1iZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXh0ZW5zaW9uSW5zdGFuY2VNZW1iZXIgPT4gYnVpbGRlci5pc0V4dGVuc2lvbkluc3RhbmNlTWVtYmVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1N0YXRpYyA9PiBidWlsZGVyLmlzU3RhdGljOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+IGJ1aWxkZXIuaXNUb3BMZXZlbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNUeXBlRGVjbGFyYXRpb24gPT4gYnVpbGRlci5pc1R5cGVEZWNsYXJhdGlvbjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiBidWlsZGVyLmlzTG9jYWw7CgogIEBvdmVycmlkZQogIE1lc3NhZ2UgZ2V0IG1lc3NhZ2UgPT4gdGVtcGxhdGVBY2Nlc3NFcnJvci53aXRoQXJndW1lbnRzKG5hbWUpOwp9CgpjbGFzcyBBbWJpZ3VvdXNCdWlsZGVyIGV4dGVuZHMgUHJvYmxlbUJ1aWxkZXIgewogIEFtYmlndW91c0J1aWxkZXIoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgYnVpbGRlciwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKQogICAgICA6IHN1cGVyKG5hbWUsIGJ1aWxkZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIGdldCBwYXJlbnQgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgTWVzc2FnZSBnZXQgbWVzc2FnZSA9PiB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvblVzZS53aXRoQXJndW1lbnRzKG5hbWUpOwoKICAvLyBUT0RPKGFoZSk6IEFsc28gcHJvdmlkZSBjb250ZXh0LgoKICBCdWlsZGVyIGdldEZpcnN0RGVjbGFyYXRpb24oKSB7CiAgICBCdWlsZGVyIGRlY2xhcmF0aW9uID0gYnVpbGRlcjsKICAgIHdoaWxlIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgfQogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KfQoKbWl4aW4gRXJyb25lb3VzTWVtYmVyQnVpbGRlck1peGluIGltcGxlbWVudHMgTWVtYmVyQnVpbGRlciB7CiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCBtZW1iZXIgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCByZWFkVGFyZ2V0ID0+IG51bGw7CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXQgd3JpdGVUYXJnZXQgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCBpbnZva2VUYXJnZXQgPT4gbnVsbDsKCiAgYm9vbCBnZXQgaXNOYXRpdmUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3NCdWlsZGVyIGdldCBjbGFzc0J1aWxkZXIgPT4gcGFyZW50IGlzIENsYXNzQnVpbGRlciA/IHBhcmVudCA6IG51bGw7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IHBhcmVudChCdWlsZGVyIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQW1iaWd1b3VzTWVtYmVyQnVpbGRlci5wYXJlbnQ9Jyk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQW1iaWd1b3VzTWVtYmVyQnVpbGRlci5wYXJlbnQ9Jyk7CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBhbmQgY3JlYXRlIGEgW1Byb2NlZHVyZUJ1aWxkZXJdIGludGVyZmFjZS4KICBAb3ZlcnJpZGUKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kID0+IG51bGw7CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgJ0FtYmlndW91c01lbWJlckJ1aWxkZXIuYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMnKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8Q2xhc3NNZW1iZXI+IGdldCBsb2NhbE1lbWJlcnMgPT4gY29uc3QgPENsYXNzTWVtYmVyPltdOwoKICBAb3ZlcnJpZGUKICBMaXN0PENsYXNzTWVtYmVyPiBnZXQgbG9jYWxTZXR0ZXJzID0+IGNvbnN0IDxDbGFzc01lbWJlcj5bXTsKfQoKY2xhc3MgQW1iaWd1b3VzTWVtYmVyQnVpbGRlciBleHRlbmRzIEFtYmlndW91c0J1aWxkZXIKICAgIHdpdGggRXJyb25lb3VzTWVtYmVyQnVpbGRlck1peGluIHsKICBBbWJpZ3VvdXNNZW1iZXJCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgQnVpbGRlciBidWlsZGVyLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpCiAgICAgIDogc3VwZXIobmFtZSwgYnVpbGRlciwgY2hhck9mZnNldCwgZmlsZVVyaSk7Cn0KCmNsYXNzIFNjb3BlTG9jYWxEZWNsYXJhdGlvbkl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8QnVpbGRlcj4gewogIEl0ZXJhdG9yPEJ1aWxkZXI+IGxvY2FsOwogIGZpbmFsIEl0ZXJhdG9yPEJ1aWxkZXI+IHNldHRlcnM7CgogIEBvdmVycmlkZQogIEJ1aWxkZXIgY3VycmVudDsKCiAgU2NvcGVMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IoU2NvcGUgc2NvcGUpCiAgICAgIDogbG9jYWwgPSBzY29wZS5fbG9jYWwudmFsdWVzLml0ZXJhdG9yLAogICAgICAgIHNldHRlcnMgPSBzY29wZS5fc2V0dGVycy52YWx1ZXMuaXRlcmF0b3I7CgogIEBvdmVycmlkZQogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBCdWlsZGVyIG5leHQgPSBjdXJyZW50Py5uZXh0OwogICAgaWYgKG5leHQgIT0gbnVsbCkgewogICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAobG9jYWwgIT0gbnVsbCkgewogICAgICBpZiAobG9jYWwubW92ZU5leHQoKSkgewogICAgICAgIGN1cnJlbnQgPSBsb2NhbC5jdXJyZW50OwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxvY2FsID0gbnVsbDsKICAgIH0KICAgIGlmIChzZXR0ZXJzLm1vdmVOZXh0KCkpIHsKICAgICAgY3VycmVudCA9IHNldHRlcnMuY3VycmVudDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICBjdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KfQoKY2xhc3MgU2NvcGVMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yIGV4dGVuZHMgU2NvcGVMb2NhbERlY2xhcmF0aW9uSXRlcmF0b3IKICAgIGltcGxlbWVudHMgTmFtZUl0ZXJhdG9yIHsKICBJdGVyYXRvcjxTdHJpbmc+IGxvY2FsTmFtZXM7CiAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBzZXR0ZXJOYW1lczsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIG5hbWU7CgogIFNjb3BlTG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcihTY29wZSBzY29wZSkKICAgICAgOiBsb2NhbE5hbWVzID0gc2NvcGUuX2xvY2FsLmtleXMuaXRlcmF0b3IsCiAgICAgICAgc2V0dGVyTmFtZXMgPSBzY29wZS5fc2V0dGVycy5rZXlzLml0ZXJhdG9yLAogICAgICAgIHN1cGVyKHNjb3BlKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIEJ1aWxkZXIgbmV4dCA9IGN1cnJlbnQ/Lm5leHQ7CiAgICBpZiAobmV4dCAhPSBudWxsKSB7CiAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChsb2NhbCAhPSBudWxsKSB7CiAgICAgIGlmIChsb2NhbC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgbG9jYWxOYW1lcy5tb3ZlTmV4dCgpOwogICAgICAgIGN1cnJlbnQgPSBsb2NhbC5jdXJyZW50OwogICAgICAgIG5hbWUgPSBsb2NhbE5hbWVzLmN1cnJlbnQ7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgbG9jYWxOYW1lcyA9IG51bGw7CiAgICB9CiAgICBpZiAoc2V0dGVycy5tb3ZlTmV4dCgpKSB7CiAgICAgIHNldHRlck5hbWVzLm1vdmVOZXh0KCk7CiAgICAgIGN1cnJlbnQgPSBzZXR0ZXJzLmN1cnJlbnQ7CiAgICAgIG5hbWUgPSBzZXR0ZXJOYW1lcy5jdXJyZW50OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CoMZAE5OPAEVATApAR8lKScmJS0zPwEaCRgROh0qMwE6ARUkHwEmJwEtBkw3BhQGEyoZHwwTKhkfDBMeHgYTOjpPJycMBiUBTxMRASUBSyMqBAEfAUcCASNNDxsBIgExAR4BCSMqKBQYIEssASgOKDAeKQEUDi42JCIBSg4oMBwiKQEjNAQBIjgEAREWIk4IFyROCBofFQgEAVBPLk5JIjY5CAgkPUIICB8iP0MgEQoIGzYpQUU7LxcnURMTOQwKHT0IBgQBORYdISEYHiUEATI6AUosIyUrISUjKwQBSUoEAUUsFUczIwYVBAFPTSMGFBImIxYXGyEZHB0EAT0YJTUGBAE9OCEmIE4pShMNFgYEATsmKhZGKU4ySQYcPBYGQgQBQSYqFkgpTDJJBhw8FgZIBAE6MwQBRBIfDR0GBAFKFwQBUBkEATcBPwFRATYYKR0NF0cGBAE9IDYqBAEhKUItJAYRBAE9IgQBJVEEAUYGT0tLIEYYMzkhQggeDRdHBhEEATYwKh4EAUQ9HSIEAQ4TKzwnATQkHiJICggaBgEnFCkEATEXGQQBGy4oLiYGFgQBITspHjMmCDUnCBkEAR40NhwtHi8iGg8jCAYpRC0eNyIaDyUIBhUVGh4lHS0oEAQCARkrKgEaATABNxYEAT0jJiApSg0WBgQBRgIBKUxBDxoeHCIpAUcWAQwkExkEAQwsExsEAQwqEx4EAgEVFQEcATEiBAExJAQBMCEEAToCASAgAScBMSEEAT8CATQVARkBGAEVAUoBFgEfARcBDCgCAU5BMlAzAQwhAQwnAQwnAQw3AQwqAQwqAQxPAQxDAQxLAQwpAQwtAQw7AQwnAQxCAgEwTjMBDB4BDE8BJgEiIycmBhgEAgE9DB0BDCEBDCIBDCMBHgEMIgEMSwEMI0IEAQwfQgQBUQwiAQxOIDsEAQw/AQw/AgE2JxpBMwIBQxsjAQwTAS0uMgEMFCIYFhMGGR4hFQgUBh4hEw0WFAYEAgFOHh8mAQwPATExNBYBDBQiGBYTBhkeHyEjFQgZBh4eISITDRYUBgQCASZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc2NvcGUuZGFydGhmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2NsYXNzX2J1aWxkZXIuZGFydMAAe9gvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zb3VyY2VfY2xhc3NfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBNZW1iZXIsCiAgICAgICAgU3RhdGljR2V0LAogICAgICAgIFN1cGVydHlwZSwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgTmFtZSwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgUHJvY2VkdXJlS2luZCwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVmFyaWFuY2UsCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JyBzaG93IENsb25lUHJvY2VkdXJlV2l0aG91dEJvZHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3JlZmVyZW5jZV9mcm9tX2luZGV4LmRhcnQnIHNob3cgSW5kZXhlZENsYXNzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBhcyB0eXBlX2FsZ2VicmEKICAgIHNob3cgZ2V0U3Vic3RpdHV0aW9uTWFwOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9mdW5jdGlvbl9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL2ludmFsaWRfdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9udWxsYWJpbGl0eV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL3Byb2NlZHVyZV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX21lbWJlcl9idWlsZGVyLmRhcnQnIHNob3cgRGlsbE1lbWJlckJ1aWxkZXI7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTWVzc2FnZSwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5LAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGUsCiAgICAgICAgdGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVXaXRoVmFyaWFuY2UsCiAgICAgICAgdGVtcGxhdGVSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kLAogICAgICAgIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsOwoKaW1wb3J0ICcuLi9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgcmVkaXJlY3RpbmdOYW1lOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcgc2hvdyBjb21wYXJlUHJvY2VkdXJlczsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJy4uL2tlcm5lbC9yZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcgc2hvdyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5OwoKaW1wb3J0ICcuLi9rZXJuZWwvdHlwZV9hbGdvcml0aG1zLmRhcnQnIHNob3cgVmFyaWFuY2UsIGNvbXB1dGVWYXJpYW5jZTsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcgc2hvdyBub1N1Y2hNZXRob2ROYW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuZXhwZWN0ZWQsIHVuaGFuZGxlZDsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCc7CgppbXBvcnQgJ3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCkNsYXNzIGluaXRpYWxpemVDbGFzcygKICAgIENsYXNzIGNscywKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgIFN0cmluZyBuYW1lLAogICAgU291cmNlTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgIGludCBjaGFyT2Zmc2V0LAogICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICBDbGFzcyByZWZlcmVuY2VzRnJvbSkgewogIGNscyA/Pz0gbmV3IENsYXNzKAogICAgICBuYW1lOiBuYW1lLAogICAgICB0eXBlUGFyYW1ldGVyczoKICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIudHlwZVBhcmFtZXRlcnNGcm9tQnVpbGRlcnModHlwZVZhcmlhYmxlcyksCiAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlc0Zyb20/LnJlZmVyZW5jZSk7CiAgY2xzLmZpbGVVcmkgPz89IHBhcmVudC5maWxlVXJpOwogIGlmIChjbHMuc3RhcnRGaWxlT2Zmc2V0ID09IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICBjbHMuc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRDaGFyT2Zmc2V0OwogIH0KICBpZiAoY2xzLmZpbGVPZmZzZXQgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgIGNscy5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICB9CiAgaWYgKGNscy5maWxlRW5kT2Zmc2V0ID09IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICBjbHMuZmlsZUVuZE9mZnNldCA9IGNoYXJFbmRPZmZzZXQ7CiAgfQoKICByZXR1cm4gY2xzOwp9CgpjbGFzcyBTb3VyY2VDbGFzc0J1aWxkZXIgZXh0ZW5kcyBDbGFzc0J1aWxkZXJJbXBsCiAgICBpbXBsZW1lbnRzIENvbXBhcmFibGU8U291cmNlQ2xhc3NCdWlsZGVyPiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgQ2xhc3MgYWN0dWFsQ2xzOwoKICBmaW5hbCBMaXN0PENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcj4gY29uc3RydWN0b3JSZWZlcmVuY2VzOwoKICBUeXBlQnVpbGRlciBtaXhlZEluVHlwZTsKCiAgYm9vbCBpc01peGluRGVjbGFyYXRpb247CgogIGZpbmFsIENsYXNzIHJlZmVyZW5jZXNGcm9tOwogIGZpbmFsIEluZGV4ZWRDbGFzcyByZWZlcmVuY2VzRnJvbUluZGV4ZWQ7CgogIFNvdXJjZUNsYXNzQnVpbGRlcigKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgIGludCBtb2RpZmllcnMsCiAgICBTdHJpbmcgbmFtZSwKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgIFR5cGVCdWlsZGVyIHN1cGVydHlwZSwKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICBMaXN0PFR5cGVCdWlsZGVyPiBvblR5cGVzLAogICAgU2NvcGUgc2NvcGUsCiAgICBDb25zdHJ1Y3RvclNjb3BlIGNvbnN0cnVjdG9ycywKICAgIExpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgIHRoaXMuY29uc3RydWN0b3JSZWZlcmVuY2VzLAogICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgIGludCBuYW1lT2Zmc2V0LAogICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICBDbGFzcyByZWZlcmVuY2VzRnJvbSwKICAgIEluZGV4ZWRDbGFzcyByZWZlcmVuY2VzRnJvbUluZGV4ZWQsIHsKICAgIENsYXNzIGNscywKICAgIHRoaXMubWl4ZWRJblR5cGUsCiAgICB0aGlzLmlzTWl4aW5EZWNsYXJhdGlvbiA9IGZhbHNlLAogIH0pICA6IGFjdHVhbENscyA9IGluaXRpYWxpemVDbGFzcyhjbHMsIHR5cGVWYXJpYWJsZXMsIG5hbWUsIHBhcmVudCwKICAgICAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LCBuYW1lT2Zmc2V0LCBjaGFyRW5kT2Zmc2V0LCByZWZlcmVuY2VzRnJvbSksCiAgICAgICAgcmVmZXJlbmNlc0Zyb20gPSByZWZlcmVuY2VzRnJvbSwKICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWQgPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQsCiAgICAgICAgc3VwZXIobWV0YWRhdGEsIG1vZGlmaWVycywgbmFtZSwgdHlwZVZhcmlhYmxlcywgc3VwZXJ0eXBlLCBpbnRlcmZhY2VzLAogICAgICAgICAgICBvblR5cGVzLCBzY29wZSwgY29uc3RydWN0b3JzLCBwYXJlbnQsIG5hbWVPZmZzZXQpIHsKICAgIGFjdHVhbENscy5oYXNDb25zdENvbnN0cnVjdG9yID0gaGFzQ29uc3RDb25zdHJ1Y3RvcjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBjbHMgPT4gb3JpZ2luLmFjdHVhbENsczsKCiAgQG92ZXJyaWRlCiAgU291cmNlTGlicmFyeUJ1aWxkZXIgZ2V0IGxpYnJhcnkgPT4gc3VwZXIubGlicmFyeTsKCiAgQ2xhc3MgYnVpbGQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlicmFyeUJ1aWxkZXIgY29yZUxpYnJhcnkpIHsKICAgIHZvaWQgYnVpbGRCdWlsZGVycyhTdHJpbmcgbmFtZSwgQnVpbGRlciBkZWNsYXJhdGlvbikgewogICAgICBkbyB7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnBhcmVudCAhPSB0aGlzKSB7CiAgICAgICAgICBpZiAoZmlsZVVyaSAhPSBkZWNsYXJhdGlvbi5wYXJlbnQuZmlsZVVyaSkgewogICAgICAgICAgICB1bmV4cGVjdGVkKCIkZmlsZVVyaSIsICIke2RlY2xhcmF0aW9uLnBhcmVudC5maWxlVXJpfSIsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVuZXhwZWN0ZWQoZnVsbE5hbWVGb3JFcnJvcnMsIGRlY2xhcmF0aW9uLnBhcmVudD8uZnVsbE5hbWVGb3JFcnJvcnMsCiAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIE1lbWJlckJ1aWxkZXJJbXBsKSB7CiAgICAgICAgICBNZW1iZXJCdWlsZGVySW1wbCBtZW1iZXJCdWlsZGVyID0gZGVjbGFyYXRpb247CiAgICAgICAgICBtZW1iZXJCdWlsZGVyLmJ1aWxkTWVtYmVycyhsaWJyYXJ5LAogICAgICAgICAgICAgIChNZW1iZXIgbWVtYmVyLCBCdWlsdE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgICAgICAgICBtZW1iZXIucGFyZW50ID0gY2xzOwogICAgICAgICAgICBpZiAoIW1lbWJlckJ1aWxkZXIuaXNQYXRjaCAmJiAhbWVtYmVyQnVpbGRlci5pc0R1cGxpY2F0ZSkgewogICAgICAgICAgICAgIGNscy5hZGRNZW1iZXIobWVtYmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVuaGFuZGxlZCgiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iLCAiYnVpbGRCdWlsZGVycyIsCiAgICAgICAgICAgICAgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgICAgfQogICAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgICAgfSB3aGlsZSAoZGVjbGFyYXRpb24gIT0gbnVsbCk7CiAgICB9CgogICAgc2NvcGUuZm9yRWFjaChidWlsZEJ1aWxkZXJzKTsKICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKGJ1aWxkQnVpbGRlcnMpOwogICAgc3VwZXJ0eXBlID0gY2hlY2tTdXBlcnR5cGUoc3VwZXJ0eXBlKTsKICAgIGFjdHVhbENscy5zdXBlcnR5cGUgPQogICAgICAgIHN1cGVydHlwZT8uYnVpbGRTdXBlcnR5cGUobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICBpZiAoIWlzTWl4aW5EZWNsYXJhdGlvbiAmJgogICAgICAgIGFjdHVhbENscy5zdXBlcnR5cGUgIT0gbnVsbCAmJgogICAgICAgIGFjdHVhbENscy5zdXBlcmNsYXNzLmlzTWl4aW5EZWNsYXJhdGlvbikgewogICAgICAvLyBEZWNsYXJlZCBtaXhpbnMgaGF2ZSBpbnRlcmZhY2VzIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkLCBidXQgdGhleQogICAgICAvLyBjYW5ub3QgYmUgZXh0ZW5kZWQuICBIb3dldmVyLCBhIG1peGluIGRlY2xhcmF0aW9uIHdpdGggYSBzaW5nbGUKICAgICAgLy8gc3VwZXJjbGFzcyBjb25zdHJhaW50IGlzIGVuY29kZWQgd2l0aCB0aGUgY29uc3RyYWludCBhcyB0aGUgc3VwZXJ0eXBlLAogICAgICAvLyBhbmQgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGEgbWl4aW4ncyBpbnRlcmZhY2UuCiAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlU3VwZXJ0eXBlSXNJbGxlZ2FsLndpdGhBcmd1bWVudHMoYWN0dWFsQ2xzLnN1cGVyY2xhc3MubmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgICAgYWN0dWFsQ2xzLnN1cGVydHlwZSA9IG51bGw7CiAgICB9CiAgICBpZiAoYWN0dWFsQ2xzLnN1cGVydHlwZSA9PSBudWxsICYmIHN1cGVydHlwZSBpcyEgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICBzdXBlcnR5cGUgPSBudWxsOwogICAgfQogICAgbWl4ZWRJblR5cGUgPSBjaGVja1N1cGVydHlwZShtaXhlZEluVHlwZSk7CiAgICBhY3R1YWxDbHMubWl4ZWRJblR5cGUgPQogICAgICAgIG1peGVkSW5UeXBlPy5idWlsZE1peGVkSW5UeXBlKGxpYnJhcnksIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgaWYgKGFjdHVhbENscy5taXhlZEluVHlwZSA9PSBudWxsICYmIG1peGVkSW5UeXBlIGlzISBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgIG1peGVkSW5UeXBlID0gbnVsbDsKICAgIH0KICAgIGFjdHVhbENscy5pc01peGluRGVjbGFyYXRpb24gPSBpc01peGluRGVjbGFyYXRpb247CiAgICAvLyBUT0RPKGFoZSk6IElmIGBjbHMuc3VwZXJ0eXBlYCBpcyBudWxsLCBhbmQgdGhpcyBpc24ndCBPYmplY3QsIHJlcG9ydCBhCiAgICAvLyBjb21waWxlLXRpbWUgZXJyb3IuCiAgICBjbHMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CiAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkgewogICAgICAgIGludGVyZmFjZXNbaV0gPSBjaGVja1N1cGVydHlwZShpbnRlcmZhY2VzW2ldKTsKICAgICAgICBTdXBlcnR5cGUgc3VwZXJ0eXBlID0KICAgICAgICAgICAgaW50ZXJmYWNlc1tpXS5idWlsZFN1cGVydHlwZShsaWJyYXJ5LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgICBpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE8oYWhlKTogUmVwb3J0IGFuIGVycm9yIGlmIHN1cGVydHlwZSBpcyBudWxsLgogICAgICAgICAgYWN0dWFsQ2xzLmltcGxlbWVudGVkVHlwZXMuYWRkKHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY29uc3RydWN0b3JzLmZvckVhY2goKFN0cmluZyBuYW1lLCBCdWlsZGVyIGNvbnN0cnVjdG9yKSB7CiAgICAgIEJ1aWxkZXIgbWVtYmVyID0gc2NvcGVCdWlsZGVyW25hbWVdOwogICAgICBpZiAobWVtYmVyID09IG51bGwpIHJldHVybjsKICAgICAgaWYgKCFtZW1iZXIuaXNTdGF0aWMpIHJldHVybjsKICAgICAgLy8gVE9ETyhhaGUpOiBSZXZpc2l0IHRoZXNlIG1lc3NhZ2VzLiBJdCBzZWVtcyBsaWtlIHRoZSBsYXN0IHR3byBzaG91bGQKICAgICAgLy8gYmUgYGNvbnRleHRgIHBhcmFtZXRlciB0byB0aGlzIG1lc3NhZ2UuCiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBjb25zdHJ1Y3Rvci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0ZhY3RvcnkpIHsKICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhGYWN0b3J5LndpdGhBcmd1bWVudHMoIiR7dGhpcy5uYW1lfS4ke25hbWV9IiksCiAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3IKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKCIke3RoaXMubmFtZX0uJHtuYW1lfSIpLAogICAgICAgICAgICBtZW1iZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICB9CiAgICB9KTsKCiAgICBzY29wZS5mb3JFYWNoTG9jYWxTZXR0ZXIoKFN0cmluZyBuYW1lLCBCdWlsZGVyIHNldHRlcikgewogICAgICBCdWlsZGVyIG1lbWJlciA9IHNjb3BlQnVpbGRlcltuYW1lXTsKICAgICAgaWYgKG1lbWJlciA9PSBudWxsIHx8CiAgICAgICAgICAhKG1lbWJlci5pc0ZpZWxkICYmICFtZW1iZXIuaXNGaW5hbCAmJiAhbWVtYmVyLmlzQ29uc3QgfHwKICAgICAgICAgICAgICBtZW1iZXIuaXNSZWd1bGFyTWV0aG9kICYmIG1lbWJlci5pc1N0YXRpYyAmJiBzZXR0ZXIuaXNTdGF0aWMpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICBzZXR0ZXIuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAvLyBUT0RPKGFoZSk6IENvbnRleHQgYXJndW1lbnQgdG8gcHJldmlvdXMgbWVzc2FnZT8KICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICB9KTsKCiAgICBzY29wZS5mb3JFYWNoTG9jYWxTZXR0ZXIoKFN0cmluZyBuYW1lLCBCdWlsZGVyIHNldHRlcikgewogICAgICBCdWlsZGVyIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JTY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsIHx8ICFzZXR0ZXIuaXNTdGF0aWMpIHJldHVybjsKICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhDb25zdHJ1Y3Rvci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgc2V0dGVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGNvbnN0cnVjdG9yLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0pOwoKICAgIGNscy5wcm9jZWR1cmVzLnNvcnQoY29tcGFyZVByb2NlZHVyZXMpOwogICAgcmV0dXJuIGNsczsKICB9CgogIFR5cGVCdWlsZGVyIGNoZWNrU3VwZXJ0eXBlKFR5cGVCdWlsZGVyIHN1cGVydHlwZSkgewogICAgaWYgKHR5cGVWYXJpYWJsZXMgPT0gbnVsbCB8fCBzdXBlcnR5cGUgPT0gbnVsbCkgcmV0dXJuIHN1cGVydHlwZTsKICAgIE1lc3NhZ2UgbWVzc2FnZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7ICsraSkgewogICAgICBpbnQgdmFyaWFuY2UgPSBjb21wdXRlVmFyaWFuY2UodHlwZVZhcmlhYmxlc1tpXSwgc3VwZXJ0eXBlLCBsaWJyYXJ5KTsKICAgICAgaWYgKCFWYXJpYW5jZS5ncmVhdGVyVGhhbk9yRXF1YWwodmFyaWFuY2UsIHR5cGVWYXJpYWJsZXNbaV0udmFyaWFuY2UpKSB7CiAgICAgICAgaWYgKHR5cGVWYXJpYWJsZXNbaV0ucGFyYW1ldGVyLmlzTGVnYWN5Q292YXJpYW50KSB7CiAgICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICB0eXBlVmFyaWFibGVzW2ldLm5hbWUsCiAgICAgICAgICAgICAgVmFyaWFuY2Uua2V5d29yZFN0cmluZyh2YXJpYW5jZSksCiAgICAgICAgICAgICAgc3VwZXJ0eXBlLm5hbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXNzYWdlID0KICAgICAgICAgICAgICB0ZW1wbGF0ZUludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZVdpdGhWYXJpYW5jZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBWYXJpYW5jZS5rZXl3b3JkU3RyaW5nKHR5cGVWYXJpYWJsZXNbaV0udmFyaWFuY2UpLAogICAgICAgICAgICAgICAgICB0eXBlVmFyaWFibGVzW2ldLm5hbWUsCiAgICAgICAgICAgICAgICAgIFZhcmlhbmNlLmtleXdvcmRTdHJpbmcodmFyaWFuY2UpLAogICAgICAgICAgICAgICAgICBzdXBlcnR5cGUubmFtZSk7CiAgICAgICAgfQogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBOYW1lZFR5cGVCdWlsZGVyKAogICAgICAgICAgc3VwZXJ0eXBlLm5hbWUsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCksIG51bGwpCiAgICAgICAgLi5iaW5kKG5ldyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcihzdXBlcnR5cGUubmFtZSwKICAgICAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpKSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXJ0eXBlOwogIH0KCiAgdm9pZCBhZGRTeW50aGV0aWNDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgewogICAgU3RyaW5nIG5hbWUgPSBjb25zdHJ1Y3Rvci5uYW1lLm5hbWU7CiAgICBjbHMuY29uc3RydWN0b3JzLmFkZChjb25zdHJ1Y3Rvcik7CiAgICBjb25zdHJ1Y3Rvci5wYXJlbnQgPSBjbHM7CiAgICBEaWxsTWVtYmVyQnVpbGRlciBtZW1iZXJCdWlsZGVyID0gbmV3IERpbGxNZW1iZXJCdWlsZGVyKGNvbnN0cnVjdG9yLCB0aGlzKTsKICAgIG1lbWJlckJ1aWxkZXIubmV4dCA9IGNvbnN0cnVjdG9yU2NvcGVCdWlsZGVyW25hbWVdOwogICAgY29uc3RydWN0b3JTY29wZUJ1aWxkZXIuYWRkTWVtYmVyKG5hbWUsIG1lbWJlckJ1aWxkZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFBhdGNoKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm4gMDsKCiAgICAvLyBUT0RPKGFoZSk6IHJlc3RvcmUgZmlsZS1vZmZzZXQgb25jZSB3ZSB0cmFjayBib3RoIG9yaWdpbiBhbmQgcGF0Y2ggZmlsZQogICAgLy8gVVJJcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMTU3OQogICAgY2xzLmFubm90YXRpb25zLmZvckVhY2goKG0pID0+IG0uZmlsZU9mZnNldCA9IG9yaWdpbi5jbHMuZmlsZU9mZnNldCk7CgogICAgaW50IGNvdW50ID0gMDsKICAgIHNjb3BlLmZvckVhY2goKFN0cmluZyBuYW1lLCBCdWlsZGVyIGRlY2xhcmF0aW9uKSB7CiAgICAgIGNvdW50ICs9IGRlY2xhcmF0aW9uLmZpbmlzaFBhdGNoKCk7CiAgICB9KTsKICAgIGNvbnN0cnVjdG9ycy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgQnVpbGRlciBkZWNsYXJhdGlvbikgewogICAgICBjb3VudCArPSBkZWNsYXJhdGlvbi5maW5pc2hQYXRjaCgpOwogICAgfSk7CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBMaXN0PEJ1aWxkZXI+IGNvbXB1dGVEaXJlY3RTdXBlcnR5cGVzKENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgZmluYWwgTGlzdDxCdWlsZGVyPiByZXN1bHQgPSA8QnVpbGRlcj5bXTsKICAgIGZpbmFsIFR5cGVCdWlsZGVyIHN1cGVydHlwZSA9IHRoaXMuc3VwZXJ0eXBlOwogICAgaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb25CdWlsZGVyID0gc3VwZXJ0eXBlLmRlY2xhcmF0aW9uOwogICAgICBpZiAoZGVjbGFyYXRpb25CdWlsZGVyIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgICBUeXBlQWxpYXNCdWlsZGVyIGFsaWFzQnVpbGRlciA9IGRlY2xhcmF0aW9uQnVpbGRlcjsKICAgICAgICBkZWNsYXJhdGlvbkJ1aWxkZXIgPSBhbGlhc0J1aWxkZXIudW5hbGlhc0RlY2xhcmF0aW9uOwogICAgICB9CiAgICAgIHJlc3VsdC5hZGQoZGVjbGFyYXRpb25CdWlsZGVyKTsKICAgIH0gZWxzZSBpZiAob2JqZWN0Q2xhc3MgIT0gdGhpcykgewogICAgICByZXN1bHQuYWRkKG9iamVjdENsYXNzKTsKICAgIH0KICAgIGZpbmFsIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMgPSB0aGlzLmludGVyZmFjZXM7CiAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIFR5cGVCdWlsZGVyIGludGVyZmFjZSA9IGludGVyZmFjZXNbaV07CiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbkJ1aWxkZXIgPSBpbnRlcmZhY2UuZGVjbGFyYXRpb247CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uQnVpbGRlciBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgICBUeXBlQWxpYXNCdWlsZGVyIGFsaWFzQnVpbGRlciA9IGRlY2xhcmF0aW9uQnVpbGRlcjsKICAgICAgICAgIGRlY2xhcmF0aW9uQnVpbGRlciA9IGFsaWFzQnVpbGRlci51bmFsaWFzRGVjbGFyYXRpb247CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5hZGQoZGVjbGFyYXRpb25CdWlsZGVyKTsKICAgICAgfQogICAgfQogICAgZmluYWwgVHlwZUJ1aWxkZXIgbWl4ZWRJblR5cGUgPSB0aGlzLm1peGVkSW5UeXBlOwogICAgaWYgKG1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbkJ1aWxkZXIgPSBtaXhlZEluVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2xhcmF0aW9uQnVpbGRlciBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgVHlwZUFsaWFzQnVpbGRlciBhbGlhc0J1aWxkZXIgPSBkZWNsYXJhdGlvbkJ1aWxkZXI7CiAgICAgICAgZGVjbGFyYXRpb25CdWlsZGVyID0gYWxpYXNCdWlsZGVyLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgICAgfQogICAgICByZXN1bHQuYWRkKGRlY2xhcmF0aW9uQnVpbGRlcik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGNvbXBhcmVUbyhTb3VyY2VDbGFzc0J1aWxkZXIgb3RoZXIpIHsKICAgIGludCByZXN1bHQgPSAiJGZpbGVVcmkiLmNvbXBhcmVUbygiJHtvdGhlci5maWxlVXJpfSIpOwogICAgaWYgKHJlc3VsdCAhPSAwKSByZXR1cm4gcmVzdWx0OwogICAgcmV0dXJuIGNoYXJPZmZzZXQuY29tcGFyZVRvKG90aGVyLmNoYXJPZmZzZXQpOwogIH0KCiAgdm9pZCBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJGb3JQcm9jZWR1cmUoTWVtYmVyIG5vU3VjaE1ldGhvZCwKICAgICAgS2VybmVsVGFyZ2V0IHRhcmdldCwgUHJvY2VkdXJlIHByb2NlZHVyZSwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICBQcm9jZWR1cmUgcmVmZXJlbmNlRnJvbTsKICAgIGlmIChyZWZlcmVuY2VzRnJvbUluZGV4ZWQgIT0gbnVsbCkgewogICAgICBpZiAocHJvY2VkdXJlLmlzU2V0dGVyKSB7CiAgICAgICAgcmVmZXJlbmNlRnJvbSA9CiAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBQcm9jZWR1cmVTZXR0ZXIocHJvY2VkdXJlLm5hbWUubmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVmZXJlbmNlRnJvbSA9CiAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIocHJvY2VkdXJlLm5hbWUubmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICBDbG9uZVByb2NlZHVyZVdpdGhvdXRCb2R5IGNsb25lciA9IG5ldyBDbG9uZVByb2NlZHVyZVdpdGhvdXRCb2R5KAogICAgICAgIHR5cGVTdWJzdGl0dXRpb246IHR5cGVfYWxnZWJyYS5nZXRTdWJzdGl0dXRpb25NYXAoCiAgICAgICAgICAgIGhpZXJhcmNoeS5nZXRDbGFzc0FzSW5zdGFuY2VPZihjbHMsIHByb2NlZHVyZS5lbmNsb3NpbmdDbGFzcykpLAogICAgICAgIGNsb25lQW5ub3RhdGlvbnM6IGZhbHNlKTsKICAgIFByb2NlZHVyZSBjbG9uZWQgPSBjbG9uZXIuY2xvbmVQcm9jZWR1cmUocHJvY2VkdXJlLCByZWZlcmVuY2VGcm9tKQogICAgICAuLmlzRXh0ZXJuYWwgPSBmYWxzZTsKICAgIHRyYW5zZm9ybVByb2NlZHVyZVRvTm9TdWNoTWV0aG9kRm9yd2FyZGVyKG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBjbG9uZWQpOwogICAgY2xzLnByb2NlZHVyZXMuYWRkKGNsb25lZCk7CiAgICBjbG9uZWQucGFyZW50ID0gY2xzOwoKICAgIGxpYnJhcnkuZm9yd2FyZGVyc09yaWdpbnMuYWRkKGNsb25lZCk7CiAgICBsaWJyYXJ5LmZvcndhcmRlcnNPcmlnaW5zLmFkZChwcm9jZWR1cmUpOwogIH0KCiAgdm9pZCBhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJHZXR0ZXJGb3JGaWVsZCgKICAgICAgRmllbGQgZmllbGQsIE1lbWJlciBub1N1Y2hNZXRob2QsIEtlcm5lbFRhcmdldCB0YXJnZXQpIHsKICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSA9IHRhcmdldC5sb2FkZXIuaGllcmFyY2h5OwogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tU3VwZXJ0eXBlKAogICAgICAgIGhpZXJhcmNoeS5nZXRDbGFzc0FzSW5zdGFuY2VPZihjbHMsIGZpZWxkLmVuY2xvc2luZ0NsYXNzKSk7CgogICAgUHJvY2VkdXJlIHJlZmVyZW5jZUZyb207CiAgICBpZiAocmVmZXJlbmNlc0Zyb21JbmRleGVkICE9IG51bGwpIHsKICAgICAgcmVmZXJlbmNlRnJvbSA9CiAgICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwUHJvY2VkdXJlTm90U2V0dGVyKGZpZWxkLm5hbWUubmFtZSk7CiAgICB9CiAgICBQcm9jZWR1cmUgZ2V0dGVyID0gbmV3IFByb2NlZHVyZSgKICAgICAgICBmaWVsZC5uYW1lLAogICAgICAgIFByb2NlZHVyZUtpbmQuR2V0dGVyLAogICAgICAgIG5ldyBGdW5jdGlvbk5vZGUobnVsbCwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+W10sCiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+W10sCiAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IDAsCiAgICAgICAgICAgIHJldHVyblR5cGU6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShmaWVsZC50eXBlKSksCiAgICAgICAgZmlsZVVyaTogZmllbGQuZmlsZVVyaSwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmllbGQuZmlsZU9mZnNldAogICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBjbHMuZW5jbG9zaW5nTGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwogICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIobm9TdWNoTWV0aG9kLCB0YXJnZXQsIGdldHRlcik7CiAgICBjbHMucHJvY2VkdXJlcy5hZGQoZ2V0dGVyKTsKICAgIGdldHRlci5wYXJlbnQgPSBjbHM7CiAgfQoKICB2b2lkIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlclNldHRlckZvckZpZWxkKAogICAgICBGaWVsZCBmaWVsZCwgTWVtYmVyIG5vU3VjaE1ldGhvZCwgS2VybmVsVGFyZ2V0IHRhcmdldCkgewogICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5ID0gdGFyZ2V0LmxvYWRlci5oaWVyYXJjaHk7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoCiAgICAgICAgaGllcmFyY2h5LmdldENsYXNzQXNJbnN0YW5jZU9mKGNscywgZmllbGQuZW5jbG9zaW5nQ2xhc3MpKTsKCiAgICBQcm9jZWR1cmUgcmVmZXJlbmNlRnJvbTsKICAgIGlmIChyZWZlcmVuY2VzRnJvbUluZGV4ZWQgIT0gbnVsbCkgewogICAgICByZWZlcmVuY2VGcm9tID0KICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBQcm9jZWR1cmVTZXR0ZXIoZmllbGQubmFtZS5uYW1lKTsKICAgIH0KCiAgICBQcm9jZWR1cmUgc2V0dGVyID0gbmV3IFByb2NlZHVyZSgKICAgICAgICBmaWVsZC5uYW1lLAogICAgICAgIFByb2NlZHVyZUtpbmQuU2V0dGVyLAogICAgICAgIG5ldyBGdW5jdGlvbk5vZGUobnVsbCwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IDxUeXBlUGFyYW1ldGVyPltdLAogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+WwogICAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCJ2YWx1ZSIsCiAgICAgICAgICAgICAgICAgIHR5cGU6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShmaWVsZC50eXBlKSkKICAgICAgICAgICAgXSwKICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXSwKICAgICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogMSwKICAgICAgICAgICAgcmV0dXJuVHlwZTogY29uc3QgVm9pZFR5cGUoKSksCiAgICAgICAgZmlsZVVyaTogZmllbGQuZmlsZVVyaSwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmllbGQuZmlsZU9mZnNldAogICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBjbHMuZW5jbG9zaW5nTGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwogICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIobm9TdWNoTWV0aG9kLCB0YXJnZXQsIHNldHRlcik7CiAgICBjbHMucHJvY2VkdXJlcy5hZGQoc2V0dGVyKTsKICAgIHNldHRlci5wYXJlbnQgPSBjbHM7CiAgfQoKICBib29sIF9hZGRNaXNzaW5nTm9TdWNoTWV0aG9kRm9yd2FyZGVycygKICAgICAgS2VybmVsVGFyZ2V0IHRhcmdldCwgU2V0PE1lbWJlcj4gZXhpc3RpbmdGb3J3YXJkZXJzLAogICAgICB7Ym9vbCBmb3JTZXR0ZXJzfSkgewogICAgYXNzZXJ0KGZvclNldHRlcnMgIT0gbnVsbCk7CgogICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5ID0gdGFyZ2V0LmxvYWRlci5oaWVyYXJjaHk7CiAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50ID0KICAgICAgICB0YXJnZXQubG9hZGVyLnR5cGVJbmZlcmVuY2VFbmdpbmUudHlwZVNjaGVtYUVudmlyb25tZW50OwoKICAgIExpc3Q8TWVtYmVyPiBhbGxNZW1iZXJzID0KICAgICAgICBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVycyhjbHMsIHNldHRlcnM6IGZvclNldHRlcnMpOwogICAgTGlzdDxNZW1iZXI+IGNvbmNyZXRlTWVtYmVycyA9CiAgICAgICAgaGllcmFyY2h5LmdldERpc3BhdGNoVGFyZ2V0cyhjbHMsIHNldHRlcnM6IGZvclNldHRlcnMpOwogICAgTGlzdDxNZW1iZXI+IGRlY2xhcmVkTWVtYmVycyA9CiAgICAgICAgaGllcmFyY2h5LmdldERlY2xhcmVkTWVtYmVycyhjbHMsIHNldHRlcnM6IGZvclNldHRlcnMpOwoKICAgIE1lbWJlciBub1N1Y2hNZXRob2QgPSBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKAogICAgICAgIGhpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXJzKGNscyksIG5vU3VjaE1ldGhvZE5hbWUpOwogICAgYm9vbCBjbHNIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCA9CiAgICAgICAgaGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QoY2xzLCBoaWVyYXJjaHksIHRhcmdldC5vYmplY3RDbGFzcyk7CgogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CgogICAgLy8gSXQncyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGFic3RyYWN0IG1lbWJlcnMgd2l0aCB0aGUgc2FtZSBuYW1lIC0tIGFzCiAgICAvLyBsb25nIGFzIHRoZXJlJ3Mgb25lIHdpdGggZnVuY3Rpb24gdHlwZSB0aGF0J3MgYSBzdWJ0eXBlIG9mIGZ1bmN0aW9uIHR5cGVzCiAgICAvLyBvZiBhbGwgb3RoZXIgbWVtYmVycy4gIFN1Y2ggbWVtYmVyIGlzIGNhbGxlZCAiYmVzdCIgaW4gdGhlIGNvZGUgYmVsb3cuCiAgICAvLyBNZW1iZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgcHV0IGludG8gZ3JvdXBzLCBhbmQgImJlc3QiIGlzIHNlYXJjaGVkCiAgICAvLyBmb3IgaW4gZWFjaCBncm91cC4KICAgIE1hcDxOYW1lLCBMaXN0PE1lbWJlcj4+IHNhbWVOYW1lTWVtYmVycyA9IHt9OwogICAgZm9yIChNZW1iZXIgbWVtYmVyIGluIGFsbE1lbWJlcnMpIHsKICAgICAgKHNhbWVOYW1lTWVtYmVyc1ttZW1iZXIubmFtZV0gPz89IFtdKS5hZGQobWVtYmVyKTsKICAgIH0KICAgIGZvciAoTmFtZSBuYW1lIGluIHNhbWVOYW1lTWVtYmVycy5rZXlzKSB7CiAgICAgIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0gc2FtZU5hbWVNZW1iZXJzW25hbWVdOwogICAgICBhc3NlcnQobWVtYmVycy5pc05vdEVtcHR5KTsKICAgICAgTGlzdDxEYXJ0VHlwZT4gbWVtYmVyVHlwZXMgPSBbXTsKCiAgICAgIC8vIFRoZSBtb3N0IHNwZWNpZmljIG1lbWJlciBoYXMgdGhlIHR5cGUgdGhhdCBpcyBzdWJ0eXBlIG9mIHRoZSB0eXBlcyBvZgogICAgICAvLyBhbGwgb3RoZXIgbWVtYmVycy4KICAgICAgTWVtYmVyIGJlc3RTb0ZhciA9IG1lbWJlcnMuZmlyc3Q7CiAgICAgIERhcnRUeXBlIGJlc3RTb0ZhclR5cGUgPQogICAgICAgICAgZm9yU2V0dGVycyA/IGJlc3RTb0Zhci5zZXR0ZXJUeXBlIDogYmVzdFNvRmFyLmdldHRlclR5cGU7CiAgICAgIGJlc3RTb0ZhclR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZSgKICAgICAgICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoY2xzLCBiZXN0U29GYXIuZW5jbG9zaW5nQ2xhc3MpKQogICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGJlc3RTb0ZhclR5cGUpOwogICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1lbWJlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBNZW1iZXIgY2FuZGlkYXRlID0gbWVtYmVyc1tpXTsKICAgICAgICBEYXJ0VHlwZSBjYW5kaWRhdGVUeXBlID0KICAgICAgICAgICAgZm9yU2V0dGVycyA/IGNhbmRpZGF0ZS5zZXR0ZXJUeXBlIDogY2FuZGlkYXRlLmdldHRlclR5cGU7CiAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tU3VwZXJ0eXBlKAogICAgICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoY2xzLCBjYW5kaWRhdGUuZW5jbG9zaW5nQ2xhc3MpKTsKICAgICAgICBjYW5kaWRhdGVUeXBlID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGNhbmRpZGF0ZVR5cGUpOwogICAgICAgIG1lbWJlclR5cGVzLmFkZChjYW5kaWRhdGVUeXBlKTsKICAgICAgICBib29sIGlzTW9yZVNwZWNpZmljID0gZm9yU2V0dGVycwogICAgICAgICAgICA/IHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihiZXN0U29GYXJUeXBlLCBjYW5kaWRhdGVUeXBlLAogICAgICAgICAgICAgICAgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykKICAgICAgICAgICAgOiB0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoY2FuZGlkYXRlVHlwZSwgYmVzdFNvRmFyVHlwZSwKICAgICAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUud2l0aE51bGxhYmlsaXRpZXMpOwogICAgICAgIGlmIChpc01vcmVTcGVjaWZpYykgewogICAgICAgICAgYmVzdFNvRmFyID0gY2FuZGlkYXRlOwogICAgICAgICAgYmVzdFNvRmFyVHlwZSA9IGNhbmRpZGF0ZVR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFNpbmNlIGlzU3VidHlwZU9mIGlzbid0IGEgbGluZWFyIG9yZGVyIG9uIHR5cGVzLCB3ZSBuZWVkIHRvIGNoZWNrIG9uY2UKICAgICAgLy8gYWdhaW4gdGhhdCB0aGUgZm91bmQgbWVtYmVyIGlzIGluZGVlZCB0aGUgbW9zdCBzcGVjaWZpYyBvbmUuCiAgICAgIGJvb2wgaXNBY3R1YWxseUJlc3RTb0ZhciA9IHRydWU7CiAgICAgIGZvciAoRGFydFR5cGUgbWVtYmVyVHlwZSBpbiBtZW1iZXJUeXBlcykgewogICAgICAgIGJvb2wgaXNNb3JlU3BlY2lmaWMgPSBmb3JTZXR0ZXJzCiAgICAgICAgICAgID8gdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgICAgICAgICAgbWVtYmVyVHlwZSwgYmVzdFNvRmFyVHlwZSwgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykKICAgICAgICAgICAgOiB0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgICAgICBiZXN0U29GYXJUeXBlLCBtZW1iZXJUeXBlLCBTdWJ0eXBlQ2hlY2tNb2RlLndpdGhOdWxsYWJpbGl0aWVzKTsKICAgICAgICBpZiAoIWlzTW9yZVNwZWNpZmljKSB7CiAgICAgICAgICBpc0FjdHVhbGx5QmVzdFNvRmFyID0gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFpc0FjdHVhbGx5QmVzdFNvRmFyKSB7CiAgICAgICAgLy8gSXQncyBhIG1lbWJlciBjb25mbGljdCB0aGF0IGlzIHJlcG9ydGVkIGVsc2V3aGVyZS4KICAgICAgfSBlbHNlIHsKICAgICAgICBNZW1iZXIgbWVtYmVyID0gYmVzdFNvRmFyOwoKICAgICAgICBpZiAoX2lzRm9yd2FyZGVyUmVxdWlyZWQoCiAgICAgICAgICAgICAgICBjbHNIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCwgbWVtYmVyLCBjbHMsIGNvbmNyZXRlTWVtYmVycywKICAgICAgICAgICAgICAgIGlzUGF0Y2g6IG1lbWJlci5maWxlVXJpICE9IG1lbWJlci5lbmNsb3NpbmdDbGFzcy5maWxlVXJpKSAmJgogICAgICAgICAgICAhZXhpc3RpbmdGb3J3YXJkZXJzLmNvbnRhaW5zKG1lbWJlcikpIHsKICAgICAgICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBkZWNsYXJlZCBtZW1iZXIgd2l0aCBzdWNoIG5hbWUsIHRoZW4gaXQncyBhYnN0cmFjdAogICAgICAgICAgICAvLyAtLSB0cmFuc2Zvcm0gaXQgaW50byBhIG5vU3VjaE1ldGhvZCBmb3J3YXJkZXIuCiAgICAgICAgICAgIGlmIChDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGRlY2xhcmVkTWVtYmVycywgbWVtYmVyLm5hbWUpICE9CiAgICAgICAgICAgICAgICBudWxsKSB7CiAgICAgICAgICAgICAgdHJhbnNmb3JtUHJvY2VkdXJlVG9Ob1N1Y2hNZXRob2RGb3J3YXJkZXIoCiAgICAgICAgICAgICAgICAgIG5vU3VjaE1ldGhvZCwgdGFyZ2V0LCBtZW1iZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlckZvclByb2NlZHVyZSgKICAgICAgICAgICAgICAgICAgbm9TdWNoTWV0aG9kLCB0YXJnZXQsIG1lbWJlciwgaGllcmFyY2h5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgICAgICAgIC8vIEN1cnJlbnQgY2xhc3MgaXNuJ3QgYWJzdHJhY3QsIHNvIGl0IGNhbid0IGhhdmUgYW4gYWJzdHJhY3QgZmllbGQKICAgICAgICAgICAgLy8gd2l0aCB0aGUgc2FtZSBuYW1lIC0tIGp1c3QgaW5zZXJ0IHRoZSBmb3J3YXJkZXIuCiAgICAgICAgICAgIGlmIChmb3JTZXR0ZXJzKSB7CiAgICAgICAgICAgICAgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyU2V0dGVyRm9yRmllbGQoCiAgICAgICAgICAgICAgICAgIG1lbWJlciwgbm9TdWNoTWV0aG9kLCB0YXJnZXQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFkZE5vU3VjaE1ldGhvZEZvcndhcmRlckdldHRlckZvckZpZWxkKAogICAgICAgICAgICAgICAgICBtZW1iZXIsIG5vU3VjaE1ldGhvZCwgdGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICAgICAgICAiJHttZW1iZXIucnVudGltZVR5cGV9IiwKICAgICAgICAgICAgICAgICJhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJzIiwKICAgICAgICAgICAgICAgIGNscy5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgY2xzLmVuY2xvc2luZ0xpYnJhcnkuZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNoYW5nZWQ7CiAgfQoKICAvLy8gQWRkcyBub1N1Y2hNZXRob2QgZm9yd2FyZGluZyBzdHVicyB0byB0aGlzIGNsYXNzLgogIC8vLwogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2xhc3Mgd2FzIG1vZGlmaWVkLgogIGJvb2wgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVycygKICAgICAgS2VybmVsVGFyZ2V0IHRhcmdldCwgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5KSB7CiAgICAvLyBEb24ndCBpbnN0YWxsIGZvcndhcmRlcnMgaW4gc3VwZXJjbGFzc2VzLgogICAgaWYgKGNscy5pc0Fic3RyYWN0KSByZXR1cm4gZmFsc2U7CgogICAgLy8gQ29tcHV0ZSBzaWduYXR1cmVzIG9mIGV4aXN0aW5nIG5vU3VjaE1ldGhvZCBmb3J3YXJkZXJzIGluIHN1cGVyY2xhc3Nlcy4KICAgIFNldDxNZW1iZXI+IGV4aXN0aW5nRm9yd2FyZGVycyA9IG5ldyBTZXQ8TWVtYmVyPi5pZGVudGl0eSgpOwogICAgU2V0PE1lbWJlcj4gZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzID0gbmV3IFNldDxNZW1iZXI+LmlkZW50aXR5KCk7CiAgICB7CiAgICAgIENsYXNzIG5lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3MgPSBjbHMuc3VwZXJjbGFzczsKICAgICAgd2hpbGUgKG5lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3MgIT0gbnVsbCAmJgogICAgICAgICAgbmVhcmVzdENvbmNyZXRlU3VwZXJjbGFzcy5pc0Fic3RyYWN0KSB7CiAgICAgICAgbmVhcmVzdENvbmNyZXRlU3VwZXJjbGFzcyA9IG5lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3Muc3VwZXJjbGFzczsKICAgICAgfQogICAgICBpZiAobmVhcmVzdENvbmNyZXRlU3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICAgICAgYm9vbCBzdXBlckhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kID0gaGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QoCiAgICAgICAgICAgIG5lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3MsIGhpZXJhcmNoeSwgdGFyZ2V0Lm9iamVjdENsYXNzKTsKICAgICAgICB7CiAgICAgICAgICBMaXN0PE1lbWJlcj4gY29uY3JldGUgPQogICAgICAgICAgICAgIGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldHMobmVhcmVzdENvbmNyZXRlU3VwZXJjbGFzcyk7CiAgICAgICAgICBmb3IgKE1lbWJlciBtZW1iZXIKICAgICAgICAgICAgICBpbiBoaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVycyhuZWFyZXN0Q29uY3JldGVTdXBlcmNsYXNzKSkgewogICAgICAgICAgICBpZiAoX2lzRm9yd2FyZGVyUmVxdWlyZWQoc3VwZXJIYXNVc2VyRGVmaW5lZE5vU3VjaE1ldGhvZCwgbWVtYmVyLAogICAgICAgICAgICAgICAgbmVhcmVzdENvbmNyZXRlU3VwZXJjbGFzcywgY29uY3JldGUsCiAgICAgICAgICAgICAgICBpc1BhdGNoOiBtZW1iZXIuZmlsZVVyaSAhPSBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MuZmlsZVVyaSkpIHsKICAgICAgICAgICAgICBleGlzdGluZ0ZvcndhcmRlcnMuYWRkKG1lbWJlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsKICAgICAgICAgIExpc3Q8TWVtYmVyPiBjb25jcmV0ZVNldHRlcnMgPSBoaWVyYXJjaHkKICAgICAgICAgICAgICAuZ2V0RGlzcGF0Y2hUYXJnZXRzKG5lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3MsIHNldHRlcnM6IHRydWUpOwogICAgICAgICAgZm9yIChNZW1iZXIgbWVtYmVyIGluIGhpZXJhcmNoeQogICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2VNZW1iZXJzKG5lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3MsIHNldHRlcnM6IHRydWUpKSB7CiAgICAgICAgICAgIGlmIChfaXNGb3J3YXJkZXJSZXF1aXJlZChzdXBlckhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kLCBtZW1iZXIsCiAgICAgICAgICAgICAgICBuZWFyZXN0Q29uY3JldGVTdXBlcmNsYXNzLCBjb25jcmV0ZVNldHRlcnMpKSB7CiAgICAgICAgICAgICAgZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzLmFkZChtZW1iZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CgogICAgLy8gSW5zdGFsbCBub1N1Y2hNZXRob2QgZm9yd2FyZGVycyBmb3IgbWV0aG9kcyBhbmQgZ2V0dGVycy4KICAgIGNoYW5nZWQgPSBfYWRkTWlzc2luZ05vU3VjaE1ldGhvZEZvcndhcmRlcnModGFyZ2V0LCBleGlzdGluZ0ZvcndhcmRlcnMsCiAgICAgICAgICAgIGZvclNldHRlcnM6IGZhbHNlKSB8fAogICAgICAgIGNoYW5nZWQ7CgogICAgLy8gSW5zdGFsbCBub1N1Y2hNZXRob2QgZm9yd2FyZGVycyBmb3Igc2V0dGVycy4KICAgIGNoYW5nZWQgPSBfYWRkTWlzc2luZ05vU3VjaE1ldGhvZEZvcndhcmRlcnMoCiAgICAgICAgICAgIHRhcmdldCwgZXhpc3RpbmdTZXR0ZXJGb3J3YXJkZXJzLAogICAgICAgICAgICBmb3JTZXR0ZXJzOiB0cnVlKSB8fAogICAgICAgIGNoYW5nZWQ7CgogICAgcmV0dXJuIGNoYW5nZWQ7CiAgfQoKICAvLy8gVGVsbHMgaWYgYSBub1N1Y2hNZXRob2QgZm9yd2FyZGVyIGlzIHJlcXVpcmVkIGZvciBbbWVtYmVyXSBpbiBbY2xzXS4KICBib29sIF9pc0ZvcndhcmRlclJlcXVpcmVkKGJvb2wgaGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2QsIE1lbWJlciBtZW1iZXIsCiAgICAgIENsYXNzIGNscywgTGlzdDxNZW1iZXI+IGNvbmNyZXRlTWVtYmVycywKICAgICAge2Jvb2wgaXNQYXRjaCA9IGZhbHNlfSkgewogICAgLy8gQSBub1N1Y2hNZXRob2QgZm9yd2FyZGVyIGlzIGFsbG93ZWQgZm9yIGFuIGFic3RyYWN0IG1lbWJlciBpZiB0aGUgY2xhc3MKICAgIC8vIGhhcyBhIHVzZXItZGVmaW5lZCBub1N1Y2hNZXRob2Qgb3IgaWYgdGhlIG1lbWJlciBpcyBwcml2YXRlIGFuZCBpcwogICAgLy8gZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBsaWJyYXJ5LiAgUHJpdmF0ZSBtZW1iZXJzIGluIHBhdGNoZXMgYXJlIGFzc3VtZWQKICAgIC8vIHRvIGJlIHZpc2libGUgb25seSB0byBwYXRjaGVzLCBzbyB0aGV5IGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBmcm9tCiAgICAvLyBhbm90aGVyIGxpYnJhcnkuCiAgICBib29sIGlzRm9yd2FyZGVyQWxsb3dlZCA9IGhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kIHx8CiAgICAgICAgKG1lbWJlci5uYW1lLmlzUHJpdmF0ZSAmJgogICAgICAgICAgICBjbHMuZW5jbG9zaW5nTGlicmFyeS5jb21wYXJlVG8obWVtYmVyLmVuY2xvc2luZ0xpYnJhcnkpICE9IDApIHx8CiAgICAgICAgKG1lbWJlci5uYW1lLmlzUHJpdmF0ZSAmJiBpc1BhdGNoKTsKICAgIC8vIEEgbm9TdWNoTWV0aG9kIGZvcndhcmRlciBpcyByZXF1aXJlZCBpZiBpdCdzIGFsbG93ZWQgYW5kIGlmIHRoZXJlJ3Mgbm8KICAgIC8vIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9yIGEgZm9yd2FyZGVyIGFscmVhZHkuCiAgICBib29sIGlzRm9yd2FyZGVyUmVxdWlyZWQgPSBpc0ZvcndhcmRlckFsbG93ZWQgJiYKICAgICAgICBDbGFzc0hpZXJhcmNoeS5maW5kTWVtYmVyQnlOYW1lKGNvbmNyZXRlTWVtYmVycywgbWVtYmVyLm5hbWUpID09IG51bGw7CiAgICByZXR1cm4gaXNGb3J3YXJkZXJSZXF1aXJlZDsKICB9CgogIHZvaWQgYWRkUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcihQcm9jZWR1cmVCdWlsZGVyIGNvbnN0cnVjdG9yQnVpbGRlciwKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgRmllbGQgcmVmZXJlbmNlRnJvbSkgewogICAgLy8gQWRkIGEgbmV3IHN5bnRoZXRpYyBmaWVsZCB0byB0aGlzIGNsYXNzIGZvciByZXByZXNlbnRpbmcgZmFjdG9yeQogICAgLy8gY29uc3RydWN0b3JzLiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCByZXNvbHZpbmcgc3VjaCBjb25zdHJ1Y3RvcnMgaW4KICAgIC8vIHNvdXJjZSBjb2RlLgogICAgLy8KICAgIC8vIFRoZSBzeW50aGV0aWMgZmllbGQgbG9va3MgbGlrZSB0aGlzOgogICAgLy8KICAgIC8vICAgICBmaW5hbCBfcmVkaXJlY3RpbmcjID0gW2MxLCAuLi4sIGNuXTsKICAgIC8vCiAgICAvLyBXaGVyZSBlYWNoIGMxIC4uLiBjbiBhcmUgYW4gaW5zdGFuY2Ugb2YgW1N0YXRpY0dldF0gd2hvc2UgdGFyZ2V0IGlzCiAgICAvLyBbY29uc3RydWN0b3IudGFyZ2V0XS4KICAgIC8vCiAgICAvLyBUT0RPKGFoZSk6IEFkZCBhIGtlcm5lbCBub2RlIHRvIHJlcHJlc2VudCByZWRpcmVjdGluZyBmYWN0b3J5IGJvZGllcy4KICAgIERpbGxNZW1iZXJCdWlsZGVyIGNvbnN0cnVjdG9yc0ZpZWxkID0KICAgICAgICBvcmlnaW4uc2NvcGUubG9va3VwTG9jYWxNZW1iZXIocmVkaXJlY3RpbmdOYW1lLCBzZXR0ZXI6IGZhbHNlKTsKICAgIGlmIChjb25zdHJ1Y3RvcnNGaWVsZCA9PSBudWxsKSB7CiAgICAgIExpc3RMaXRlcmFsIGxpdGVyYWwgPSBuZXcgTGlzdExpdGVyYWwoPEV4cHJlc3Npb24+W10pOwogICAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZShyZWRpcmVjdGluZ05hbWUsIGxpYnJhcnkubGlicmFyeSk7CiAgICAgIEZpZWxkIGZpZWxkID0gbmV3IEZpZWxkKG5hbWUsCiAgICAgICAgICBpc1N0YXRpYzogdHJ1ZSwKICAgICAgICAgIGluaXRpYWxpemVyOiBsaXRlcmFsLAogICAgICAgICAgZmlsZVVyaTogY2xzLmZpbGVVcmksCiAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBjbHMuZmlsZU9mZnNldDsKICAgICAgY2xzLmFkZE1lbWJlcihmaWVsZCk7CiAgICAgIGNvbnN0cnVjdG9yc0ZpZWxkID0gbmV3IERpbGxNZW1iZXJCdWlsZGVyKGZpZWxkLCB0aGlzKTsKICAgICAgb3JpZ2luLnNjb3BlCiAgICAgICAgICAuYWRkTG9jYWxNZW1iZXIocmVkaXJlY3RpbmdOYW1lLCBjb25zdHJ1Y3RvcnNGaWVsZCwgc2V0dGVyOiBmYWxzZSk7CiAgICB9CiAgICBGaWVsZCBmaWVsZCA9IGNvbnN0cnVjdG9yc0ZpZWxkLm1lbWJlcjsKICAgIExpc3RMaXRlcmFsIGxpdGVyYWwgPSBmaWVsZC5pbml0aWFsaXplcjsKICAgIGxpdGVyYWwuZXhwcmVzc2lvbnMKICAgICAgICAuYWRkKG5ldyBTdGF0aWNHZXQoY29uc3RydWN0b3JCdWlsZGVyLnByb2NlZHVyZSkuLnBhcmVudCA9IGxpdGVyYWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHJlc29sdmVDb25zdHJ1Y3RvcnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgaWYgKGNvbnN0cnVjdG9yUmVmZXJlbmNlcyA9PSBudWxsKSByZXR1cm4gMDsKICAgIGZvciAoQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZiBpbiBjb25zdHJ1Y3RvclJlZmVyZW5jZXMpIHsKICAgICAgcmVmLnJlc29sdmVJbihzY29wZSwgbGlicmFyeSk7CiAgICB9CiAgICBpbnQgY291bnQgPSBjb25zdHJ1Y3RvclJlZmVyZW5jZXMubGVuZ3RoOwogICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gY29uc3RydWN0b3JzID0gdGhpcy5jb25zdHJ1Y3RvcnMubG9jYWw7CiAgICAgIC8vIENvcHkga2V5cyB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBlcnJvci4KICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gY29uc3RydWN0b3JzLmtleXMudG9MaXN0KCk7CiAgICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gbmFtZXMpIHsKICAgICAgICBCdWlsZGVyIGRlY2xhcmF0aW9uID0gY29uc3RydWN0b3JzW25hbWVdOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5wYXJlbnQgIT0gdGhpcykgewogICAgICAgICAgICB1bmV4cGVjdGVkKCIkZmlsZVVyaSIsICIke2RlY2xhcmF0aW9uLnBhcmVudC5maWxlVXJpfSIsIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKSB7CiAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGltbWVkaWF0ZSByZWRpcmVjdGlvbiB0YXJnZXQsIG5vdCB0aGUgZWZmZWN0aXZlLgogICAgICAgICAgICBDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXIgcmVkaXJlY3Rpb25UYXJnZXQgPQogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24ucmVkaXJlY3Rpb25UYXJnZXQ7CiAgICAgICAgICAgIGlmIChyZWRpcmVjdGlvblRhcmdldCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgQnVpbGRlciB0YXJnZXRCdWlsZGVyID0gcmVkaXJlY3Rpb25UYXJnZXQudGFyZ2V0OwogICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IG9uZSAodGhhdCBpcywgdGhlIGxhc3Qgb24gaW4gdGhlIGxpbmtlZCBsaXN0KQogICAgICAgICAgICAgICAgLy8gaXMgYWN0dWFsbHkgaW4gdGhlIGtlcm5lbCB0cmVlLiBUaGlzIGNhbGwgY3JlYXRlcyBhIFN0YXRpY0dldAogICAgICAgICAgICAgICAgLy8gdG8gW2RlY2xhcmF0aW9uLnRhcmdldF0gaW4gYSBmaWVsZCBgX3JlZGlyZWN0aW5nI2Agd2hpY2ggaXMKICAgICAgICAgICAgICAgIC8vIG9ubHkgbGVnYWwgdG8gZG8gdG8gdGhpbmdzIGluIHRoZSBrZXJuZWwgdHJlZS4KICAgICAgICAgICAgICAgIEZpZWxkIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZD8ubG9va3VwRmllbGQoIl9yZWRpcmVjdGluZyMiKTsKICAgICAgICAgICAgICAgIGFkZFJlZGlyZWN0aW5nQ29uc3RydWN0b3IoZGVjbGFyYXRpb24sIGxpYnJhcnksIHJlZmVyZW5jZUZyb20pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodGFyZ2V0QnVpbGRlciBpcyBGdW5jdGlvbkJ1aWxkZXIpIHsKICAgICAgICAgICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBkZWNsYXJhdGlvbi50eXBlQXJndW1lbnRzOwogICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAvLyBUT0RPKDMyMDQ5KSBJZiB0eXBlIGFyZ3VtZW50cyBhcmVuJ3Qgc3BlY2lmaWVkLCB0aGV5IHNob3VsZAogICAgICAgICAgICAgICAgICAvLyBiZSBpbmZlcnJlZC4gIEN1cnJlbnRseSwgdGhlIGluZmVyZW5jZSBpcyBub3QgcGVyZm9ybWVkLgogICAgICAgICAgICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBhIHdvcmthcm91bmQuCiAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnVpbGRlci5tZW1iZXIuZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgIGdyb3dhYmxlOiB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnNldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnVpbGRlci5tZW1iZXIsIHR5cGVBcmd1bWVudHMpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0QnVpbGRlciBpcyBEaWxsTWVtYmVyQnVpbGRlcikgewogICAgICAgICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGRlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHM7CiAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vIFRPRE8oMzIwNDkpIElmIHR5cGUgYXJndW1lbnRzIGFyZW4ndCBzcGVjaWZpZWQsIHRoZXkgc2hvdWxkCiAgICAgICAgICAgICAgICAgIC8vIGJlIGluZmVycmVkLiAgQ3VycmVudGx5LCB0aGUgaW5mZXJlbmNlIGlzIG5vdCBwZXJmb3JtZWQuCiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGEgd29ya2Fyb3VuZC4KICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCdWlsZGVyLm1lbWJlci5lbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgZ3Jvd2FibGU6IHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSgKICAgICAgICAgICAgICAgICAgICB0YXJnZXRCdWlsZGVyLm1lbWJlciwgdHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRCdWlsZGVyIGlzIEFtYmlndW91c0J1aWxkZXIpIHsKICAgICAgICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UKICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMocmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgICAgICAgICAgLy8gQ29yZVR5cGVzIGFyZW4ndCBjb21wdXRlZCB5ZXQsIGFuZCB0aGlzIGlzIHRoZSBvdXRsaW5lCiAgICAgICAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgY2FuJ3QgYW5kIHNob3VsZG4ndCBjcmVhdGUgYSBtZXRob2QgYm9keS4KICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmJvZHkgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS51bnJlc29sdmVkKAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMocmVkaXJlY3Rpb25UYXJnZXQuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgICAgICAgICAgLy8gQ29yZVR5cGVzIGFyZW4ndCBjb21wdXRlZCB5ZXQsIGFuZCB0aGlzIGlzIHRoZSBvdXRsaW5lCiAgICAgICAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgY2FuJ3QgYW5kIHNob3VsZG4ndCBjcmVhdGUgYSBtZXRob2QgYm9keS4KICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmJvZHkgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keS51bnJlc29sdmVkKAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ubmV4dDsKICAgICAgICB9IHdoaWxlIChkZWNsYXJhdGlvbiAhPSBudWxsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KfQqDOwBOTjwBJAEhCQ8VFBUQExMSEhUPFg4TFxcdEhIBQgFDAUUBPQE6HQEvASIBKAE4ASsBOwEqASkBKwEtAS4BLAEtAScBMwEwAUIBHQkREiomJSUqMDwrJAFHAT8BOQFOAUgBLgE2ARgBQAEXDy0RIRkUFxwVEhZJLSIyKwQtIQQwJwQBDgIBMjAMGQFBARsBGwEeLAEWJBMRLRsiHxEjGyAZFBcaKg8WJUZJKTdPQDkEAQwlAQw1AUo7Cyo3UBoTUSYMNzkuPCFIJQ4OEUM8CiglBgEiKSsaQR8nM0tJUDgaTxYUFCIGSRgGLxxFTRoGN04bIR40Nx5IIT41CggGAT4rIiROMUItIxRQHxcPFC04HxcICAE9KxxETxAIQig6QigIAT07O0coQi0IASwQBAE2RhU1TE88SiUwHxEUUEUpNCMKRAgGGyNEQUMGFgQBOiknHlA4PAQBDBYcAU8/SgETNyoIPioIEgQBRC4yHUk0PD4IJiYfBjoeNC9LNj5ACigIBjYfSzQ8PggmBhMEAQwsOyQzBAFBTB0pIBhODxhRCAYBRjtMIkccTSAZASsuBAEvPzg8RAEdKRZLBiYUHh8vOzYnQiAtJk5NIBkEAS8/ODxEAR0pFkgGASYUHh8vOS9BDzYnKyAtJk5NIBkEASo7GyABOCZBAR5BI0AjQAE7PylIARoBUFFOThoyKDkGLjQiJwFPHCgfRDJNKjEnIUZATEQoKUg0SDUeISkKCFBGJzEpK08rUB8nEQoIIj4PIwEiTU00JU8+URg5MRU0PA4cKFBAHjYxFTYxDhwTHiktIC8MCggGARQEATgGMCI3MSYBT0FHBjgyMkoIL0tHCiJHHU1ONU0uDgwKAQozTSpQTj80DgwKCAYBGgFATCIRATQxLiERARQEAUtMLyBPSk9PGDwiTSxONzVPIAQBRjtITBQHLAcwB0sdB00qSCU9PiQaICAvJxw+E04GLC0YTQQBDDQxRSUGLhZJOzcjMg0sUBoMOkw8Ly1ALlBRT0ImSVAQNkotUU41PVErJxI3Oj9KLVFONT1RKycSNzo+HDVNMh9KSko6Fxw2TTIfSkpKOhAODConCAYSBAIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2NsYXNzX2J1aWxkZXIuZGFydGxmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS91dGlsL2Vycm9yX3JlcG9ydGVyX2ZpbGVfY29waWVyLmRhcnSC5S8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6aW8nIHNob3cgRGlyZWN0b3J5LCBGaWxlLCBHWmlwQ29kZWM7CgpVcmkgc2F2ZUFzR3ppcChMaXN0PGludD4gZGF0YSwgU3RyaW5nIGZpbGVuYW1lKSB7CiAgLy8gVE9ETyhqZW5zaik6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIHRoZSBGaWxlU3lzdGVtIGluc3RlYWQsIGJ1dCBpdAogIC8vIGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgd3JpdGluZy4KICBHWmlwQ29kZWMgZ1ppcENvZGVjID0gbmV3IEdaaXBDb2RlYygpOwogIExpc3Q8aW50PiBnemlwcGVkSW5pdGlhbGl6ZWRGcm9tRGF0YSA9IGdaaXBDb2RlYy5lbmNvZGUoZGF0YSk7CiAgRGlyZWN0b3J5IHRlbXBEaXIgPSBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygiJGZpbGVuYW1lIik7CiAgRmlsZSBmaWxlID0gbmV3IEZpbGUoIiR7dGVtcERpci5wYXRofS8ke2ZpbGVuYW1lfS5neiIpOwogIGZpbGUud3JpdGVBc0J5dGVzU3luYyhnemlwcGVkSW5pdGlhbGl6ZWRGcm9tRGF0YSk7CiAgcmV0dXJuIGZpbGUudXJpOwp9ChIATk48ATIBMkkoKUFIOjUTAgFAcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydGFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS91dGlsL3RleHR1YWxfb3V0bGluZS5kYXJ0jycvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OwoKaW1wb3J0ICdkYXJ0OmlvJyBzaG93IEZpbGU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2NsYXNzX21lbWJlcl9wYXJzZXIuZGFydCcKICAgIHNob3cgQ2xhc3NNZW1iZXJQYXJzZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2RlY2xhcmF0aW9uX2tpbmQuZGFydCcKICAgIHNob3cgRGVjbGFyYXRpb25LaW5kOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc2Nhbm5lci5kYXJ0JwogICAgc2hvdyBFcnJvclRva2VuLCBMYW5ndWFnZVZlcnNpb25Ub2tlbiwgU2Nhbm5lcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3V0ZjhfYnl0ZXNfc2Nhbm5lci5kYXJ0JwogICAgc2hvdyBVdGY4Qnl0ZXNTY2FubmVyOwoKaW1wb3J0ICcuLi8uLi9mYXN0YS9zb3VyY2UvZGlyZWN0aXZlX2xpc3RlbmVyLmRhcnQnIHNob3cgRGlyZWN0aXZlTGlzdGVuZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKU3RyaW5nIHRleHR1YWxPdXRsaW5lKExpc3Q8aW50PiByYXdCeXRlcywge2Jvb2wgbWFrZU1vcmVSZWFkYWJsZTogZmFsc2V9KSB7CiAgLy8gVE9ETyhqZW5zaik6IFdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgc2Nhbm5lciBzZXR0aW5ncyB0byBtYXRjaCB0aGF0IG9mIHRoZQogIC8vIGNvbXBpbGVyIQogIFVpbnQ4TGlzdCBieXRlcyA9IG5ldyBVaW50OExpc3QocmF3Qnl0ZXMubGVuZ3RoICsgMSk7CiAgYnl0ZXMuc2V0UmFuZ2UoMCwgcmF3Qnl0ZXMubGVuZ3RoLCByYXdCeXRlcyk7CgogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCiAgVXRmOEJ5dGVzU2Nhbm5lciBzY2FubmVyID0gbmV3IFV0ZjhCeXRlc1NjYW5uZXIoYnl0ZXMsIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICAgIGxhbmd1YWdlVmVyc2lvbkNoYW5nZWQ6CiAgICAgICAgICAoU2Nhbm5lciBzY2FubmVyLCBMYW5ndWFnZVZlcnNpb25Ub2tlbiBsYW5ndWFnZVZlcnNpb24pIHsKICAgIHNiLndyaXRlbG4oIi8vIEBkYXJ0ID0gJHtsYW5ndWFnZVZlcnNpb24ubWFqb3J9LiR7bGFuZ3VhZ2VWZXJzaW9uLm1pbm9yfSIpOwogIH0pOwogIFRva2VuIGZpcnN0VG9rZW4gPSBzY2FubmVyLnRva2VuaXplKCk7CiAgaWYgKGZpcnN0VG9rZW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgVG9rZW4gdG9rZW4gPSBmaXJzdFRva2VuOwoKICBFbmRPZmZzZXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFbmRPZmZzZXRMaXN0ZW5lcigpOwogIENsYXNzTWVtYmVyUGFyc2VyIGNsYXNzTWVtYmVyUGFyc2VyID0gbmV3IENsYXNzTWVtYmVyUGFyc2VyKGxpc3RlbmVyKTsKICBjbGFzc01lbWJlclBhcnNlci5wYXJzZVVuaXQoZmlyc3RUb2tlbik7CgogIGJvb2wgcHJpbnRlZCA9IGZhbHNlOwogIGludCBlbmRPZkxhc3QgPSAtMTsKICBib29sIGFkZExpbmVicmVhayA9IGZhbHNlOwogIHdoaWxlICh0b2tlbiAhPSBudWxsKSB7CiAgICBpZiAodG9rZW4gaXMgRXJyb3JUb2tlbikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChhZGRMaW5lYnJlYWspIHsKICAgICAgc2Iud3JpdGUoIlxuIik7CiAgICB9IGVsc2UgaWYgKHByaW50ZWQgJiYgdG9rZW4ub2Zmc2V0ID4gZW5kT2ZMYXN0KSB7CiAgICAgIHNiLndyaXRlKCIgIik7CiAgICB9CiAgICBhZGRMaW5lYnJlYWsgPSBmYWxzZTsKCiAgICBzYi53cml0ZSh0b2tlbi5sZXhlbWUpOwogICAgcHJpbnRlZCA9IHRydWU7CiAgICBlbmRPZkxhc3QgPSB0b2tlbi5lbmQ7CiAgICBpZiAobWFrZU1vcmVSZWFkYWJsZSkgewogICAgICBpZiAodG9rZW4ubGV4ZW1lID09ICI7IikgewogICAgICAgIGFkZExpbmVicmVhayA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodG9rZW4uZW5kR3JvdXAgIT0gbnVsbCAmJgogICAgICAgICAgKGxpc3RlbmVyLm5vbkNsYXNzRW5kT2Zmc2V0cy5jb250YWlucyh0b2tlbi5lbmRHcm91cC5vZmZzZXQpIHx8CiAgICAgICAgICAgICAgbGlzdGVuZXIuY2xhc3NFbmRPZmZzZXRzLmNvbnRhaW5zKHRva2VuLmVuZEdyb3VwLm9mZnNldCkpKSB7CiAgICAgICAgYWRkTGluZWJyZWFrID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lci5ub25DbGFzc0VuZE9mZnNldHMuY29udGFpbnModG9rZW4ub2Zmc2V0KSB8fAogICAgICAgICAgbGlzdGVuZXIuY2xhc3NFbmRPZmZzZXRzLmNvbnRhaW5zKHRva2VuLm9mZnNldCkpIHsKICAgICAgICBhZGRMaW5lYnJlYWsgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgaWYgKHRva2VuLmlzRW9mKSBicmVhazsKCiAgICBpZiAodG9rZW4uZW5kR3JvdXAgIT0gbnVsbCAmJgogICAgICAgIGxpc3RlbmVyLm5vbkNsYXNzRW5kT2Zmc2V0cy5jb250YWlucyh0b2tlbi5lbmRHcm91cC5vZmZzZXQpKSB7CiAgICAgIHRva2VuID0gdG9rZW4uZW5kR3JvdXA7CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgfQoKICByZXR1cm4gc2IudG9TdHJpbmcoKTsKfQoKbWFpbihMaXN0PFN0cmluZz4gYXJncykgewogIEZpbGUgZiA9IG5ldyBGaWxlKGFyZ3NbMF0pOwogIHByaW50KHRleHR1YWxPdXRsaW5lKGYucmVhZEFzQnl0ZXNTeW5jKCksIG1ha2VNb3JlUmVhZGFibGU6IHRydWUpKTsKfQoKY2xhc3MgRW5kT2Zmc2V0TGlzdGVuZXIgZXh0ZW5kcyBEaXJlY3RpdmVMaXN0ZW5lciB7CiAgU2V0PGludD4gbm9uQ2xhc3NFbmRPZmZzZXRzID0gbmV3IFNldDxpbnQ+KCk7CiAgU2V0PGludD4gY2xhc3NFbmRPZmZzZXRzID0gbmV3IFNldDxpbnQ+KCk7CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NNZXRob2QoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sCiAgICAgIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgbm9uQ2xhc3NFbmRPZmZzZXRzLmFkZChlbmRUb2tlbi5vZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbE1ldGhvZChUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBnZXRPclNldCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIG5vbkNsYXNzRW5kT2Zmc2V0cy5hZGQoZW5kVG9rZW4ub2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIG5vbkNsYXNzRW5kT2Zmc2V0cy5hZGQoZW5kVG9rZW4ub2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NPck1peGluQm9keSgKICAgICAgRGVjbGFyYXRpb25LaW5kIGtpbmQsIGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGNsYXNzRW5kT2Zmc2V0cy5hZGQoZW5kVG9rZW4ub2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICAvLyBBbGxvdyBuYXRpdmUgZnVuY3Rpb25zLgogIH0KfQp/AE5OPAEpARwBSRwBRhoBPjQBSRsBTAFIAUxPDzgwASgBUR5EUAYpJxwBOEkrARgWHRofEwYYFjYVBhoBHBQbHCEdK0pLHUc9HQgGARwBIkceDRoGBAEYAgEaHkYCATQwLQEMSjEtBAEMTS0EAQweQC0EAQwcUSoEAQxNHwQCATVwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdXRpbC90ZXh0dWFsX291dGxpbmUuZGFydGJmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydIcaLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbWJpbmF0b3IsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgSW5pdGlhbGl6ZXIsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXI7CgppbXBvcnQgJy4uL2NvbWJpbmF0b3IuZGFydCcgYXMgZmFzdGE7CgpleHBvcnQgJ2NsYXNzX2hpZXJhcmNoeV9idWlsZGVyLmRhcnQnCiAgICBzaG93IENsYXNzSGllcmFyY2h5QnVpbGRlciwgRGVsYXllZE1lbWJlciwgRGVsYXllZE92ZXJyaWRlQ2hlY2s7CgpleHBvcnQgJ2ltcGxpY2l0X2ZpZWxkX3R5cGUuZGFydCcgc2hvdyBJbXBsaWNpdEZpZWxkVHlwZTsKCmV4cG9ydCAna2VybmVsX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCcgc2hvdyBWYXJpYWJsZUJ1aWxkZXJJbXBsOwoKZXhwb3J0ICdsb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IExvYWRMaWJyYXJ5QnVpbGRlcjsKCmludCBjb21wYXJlUHJvY2VkdXJlcyhQcm9jZWR1cmUgYSwgUHJvY2VkdXJlIGIpIHsKICBpbnQgaSA9ICIke2EuZmlsZVVyaX0iLmNvbXBhcmVUbygiJHtiLmZpbGVVcml9Iik7CiAgaWYgKGkgIT0gMCkgcmV0dXJuIGk7CiAgcmV0dXJuIGEuZmlsZU9mZnNldC5jb21wYXJlVG8oYi5maWxlT2Zmc2V0KTsKfQoKYm9vbCBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb24oQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHsKICBMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMgPSBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnM7CiAgcmV0dXJuIGluaXRpYWxpemVycy5sZW5ndGggPT0gMSAmJgogICAgICBpbml0aWFsaXplcnMuc2luZ2xlIGlzIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXI7Cn0KCkxpc3Q8Q29tYmluYXRvcj4gdG9LZXJuZWxDb21iaW5hdG9ycyhMaXN0PGZhc3RhLkNvbWJpbmF0b3I+IGZhc3RhQ29tYmluYXRvcnMpIHsKICBpZiAoZmFzdGFDb21iaW5hdG9ycyA9PSBudWxsKSB7CiAgICAvLyBOb3RlOiBpdCdzIHNhZmUgdG8gcmV0dXJuIG51bGwgaGVyZSBhcyBLZXJuZWwncyBMaWJyYXJ5RGVwZW5kZW5jeSB3aWxsCiAgICAvLyBjb252ZXJ0IG51bGwgdG8gYW4gZW1wdHkgbGlzdC4KICAgIHJldHVybiBudWxsOwogIH0KCiAgTGlzdDxDb21iaW5hdG9yPiByZXN1bHQgPSBuZXcgTGlzdDxDb21iaW5hdG9yPi5maWxsZWQoCiAgICAgIGZhc3RhQ29tYmluYXRvcnMubGVuZ3RoLCBudWxsLAogICAgICBncm93YWJsZTogdHJ1ZSk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXN0YUNvbWJpbmF0b3JzLmxlbmd0aDsgaSsrKSB7CiAgICBmYXN0YS5Db21iaW5hdG9yIGNvbWJpbmF0b3IgPSBmYXN0YUNvbWJpbmF0b3JzW2ldOwogICAgTGlzdDxTdHJpbmc+IG5hbWVMaXN0ID0gY29tYmluYXRvci5uYW1lcy50b0xpc3QoKTsKICAgIHJlc3VsdFtpXSA9IGNvbWJpbmF0b3IuaXNTaG93CiAgICAgICAgPyBuZXcgQ29tYmluYXRvci5zaG93KG5hbWVMaXN0KQogICAgICAgIDogbmV3IENvbWJpbmF0b3IuaGlkZShuYW1lTGlzdCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KOgBOTjwBHgEhCRQVFRMgASYBJkUBOgFAATwBMjQYLwIBUT0lNQIBUCJOJhEEATklFzY3NyIoKQQRAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0YGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbnRlcm5hbF9hc3QuZGFydMABXBgvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBhICJzaGFkb3cgaGllcmFyY2h5IiBvZiBjb25jcmV0ZSBjbGFzc2VzIHdoaWNoIGV4dGVuZAovLy8gdGhlIGtlcm5lbCBjbGFzcyBoaWVyYXJjaHksIGFkZGluZyBtZXRob2RzIGFuZCBmaWVsZHMgbmVlZGVkIGJ5IHRoZQovLy8gQm9keUJ1aWxkZXIuCi8vLwovLy8gSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgbWF5IGJlIGNyZWF0ZWQgdXNpbmcgdGhlIGZhY3RvcnkgbWV0aG9kcyBpbgovLy8gYGFzdF9mYWN0b3J5LmRhcnRgLgovLy8KLy8vIE5vdGUgdGhhdCB0aGVzZSBjbGFzc2VzIHJlcHJlc2VudCB0aGUgRGFydCBsYW5ndWFnZSBwcmlvciB0byBkZXN1Z2FyaW5nLgovLy8gV2hlbiBhIHNpbmdsZSBEYXJ0IGNvbnN0cnVjdCBkZXN1Z2FycyB0byBhIHRyZWUgY29udGFpbmluZyBtdWx0aXBsZSBrZXJuZWwKLy8vIEFTVCBub2RlcywgdGhlIHNoYWRvdyBjbGFzcyBleHRlbmRzIHRoZSBrZXJuZWwgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhlCi8vLyBkZXN1Z2FyZWQgdHJlZS4KLy8vCi8vLyBUaGlzIG1lYW5zIHRoYXQgaW4gc29tZSBjYXNlcyBtdWx0aXBsZSBzaGFkb3cgY2xhc3NlcyBtYXkgZXh0ZW5kIHRoZSBzYW1lCi8vLyBrZXJuZWwgY2xhc3MsIGJlY2F1c2UgbXVsdGlwbGUgY29uc3RydWN0cyBpbiBEYXJ0IG1heSBkZXN1Z2FyIHRvIGEgdHJlZQovLy8gd2l0aCB0aGUgc2FtZSBraW5kIG9mIHJvb3Qgbm9kZS4KCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGV4dC9hc3RfdG9fdGV4dC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBub0xlbmd0aCwgdGVtcGxhdGVXZWJMaXRlcmFsQ2Fubm90QmVSZXByZXNlbnRlZEV4YWN0bHk7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VDbGFzc0J1aWxkZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JzsKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0JwogICAgc2hvdyBUeXBlUHJvbW90ZXIsIFR5cGVQcm9tb3RlckltcGwsIFR5cGVQcm9tb3Rpb25GYWN0LCBUeXBlUHJvbW90aW9uU2NvcGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IFR5cGVTY2hlbWFFbnZpcm9ubWVudDsKCmltcG9ydCAnaW5mZXJlbmNlX3Zpc2l0b3IuZGFydCc7CgovLy8gQ29tcHV0ZXMgdGhlIHJldHVybiB0eXBlIG9mIGEgKHBvc3NpYmx5IGZhY3RvcnkpIGNvbnN0cnVjdG9yLgpJbnRlcmZhY2VUeXBlIGNvbXB1dGVDb25zdHJ1Y3RvclJldHVyblR5cGUoCiAgICBNZW1iZXIgY29uc3RydWN0b3IsIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICBpZiAoY29uc3RydWN0b3IgaXMgQ29uc3RydWN0b3IpIHsKICAgIHJldHVybiBjb3JlVHlwZXMudGhpc0ludGVyZmFjZVR5cGUoCiAgICAgICAgY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3MsIGNvbnN0cnVjdG9yLmVuY2xvc2luZ0xpYnJhcnkubm9uTnVsbGFibGUpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gY29uc3RydWN0b3IuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICB9Cn0KCmludCBnZXRFeHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQoQXJndW1lbnRzIGFyZ3VtZW50cykgewogIGlmIChhcmd1bWVudHMgaXMgQXJndW1lbnRzSW1wbCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5fZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50OwogIH0gZWxzZSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBwYXRoIG9yIGFzc2VydCB3aHkgaXQgaXMgYWNjZXB0ZWQuCiAgICByZXR1cm4gMDsKICB9Cn0KCmludCBnZXRFeHRlbnNpb25UeXBlQXJndW1lbnRDb3VudChBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgaWYgKGFyZ3VtZW50cyBpcyBBcmd1bWVudHNJbXBsKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLl9leHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudENvdW50OwogIH0gZWxzZSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBwYXRoIG9yIGFzc2VydCB3aHkgaXQgaXMgYWNjZXB0ZWQuCiAgICByZXR1cm4gMDsKICB9Cn0KCkxpc3Q8RGFydFR5cGU+IGdldEV4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgaWYgKGFyZ3VtZW50cyBpcyBBcmd1bWVudHNJbXBsKSB7CiAgICBpZiAoYXJndW1lbnRzLl9leHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudENvdW50ID09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYXJndW1lbnRzLnR5cGVzCiAgICAgICAgICAudGFrZShhcmd1bWVudHMuX2V4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50Q291bnQpCiAgICAgICAgICAudG9MaXN0KCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIHBhdGggb3IgYXNzZXJ0IHdoeSBpdCBpcyBhY2NlcHRlZC4KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIEluZm9ybWF0aW9uIGFib3V0IGV4cGxpY2l0L2ltcGxpY2l0IHR5cGUgYXJndW1lbnRzIHVzZWQgZm9yIGVycm9yCi8vLyByZXBvcnRpbmcuCmFic3RyYWN0IGNsYXNzIFR5cGVBcmd1bWVudHNJbmZvIHsKICBjb25zdCBUeXBlQXJndW1lbnRzSW5mbygpOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFtpbmRleF10aCB0eXBlIGFyZ3VtZW50IHdhcyBpbmZlcnJlZC4KICBib29sIGlzSW5mZXJyZWQoaW50IGluZGV4KTsKCiAgLy8vIFJldHVybnMgdGhlIG9mZnNldCB0byB1c2Ugd2hlbiByZXBvcnRpbmcgYW4gZXJyb3Igb24gdGhlIFtpbmRleF10aCB0eXBlCiAgLy8vIGFyZ3VtZW50cywgdXNpbmcgW29mZnNldF0gYXMgdGhlIGRlZmF1bHQgb2Zmc2V0LgogIGludCBnZXRPZmZzZXRGb3JJbmRleChpbnQgaW5kZXgsIGludCBvZmZzZXQpID0+IG9mZnNldDsKfQoKY2xhc3MgQWxsSW5mZXJyZWRUeXBlQXJndW1lbnRzSW5mbyBleHRlbmRzIFR5cGVBcmd1bWVudHNJbmZvIHsKICBjb25zdCBBbGxJbmZlcnJlZFR5cGVBcmd1bWVudHNJbmZvKCk7CgogIGJvb2wgaXNJbmZlcnJlZChpbnQgaW5kZXgpID0+IHRydWU7Cn0KCmNsYXNzIE5vbmVJbmZlcnJlZFR5cGVBcmd1bWVudHNJbmZvIGV4dGVuZHMgVHlwZUFyZ3VtZW50c0luZm8gewogIGNvbnN0IE5vbmVJbmZlcnJlZFR5cGVBcmd1bWVudHNJbmZvKCk7CgogIGJvb2wgaXNJbmZlcnJlZChpbnQgaW5kZXgpID0+IGZhbHNlOwp9CgpjbGFzcyBFeHRlbnNpb25NZXRob2RUeXBlQXJndW1lbnRzSW5mbyBpbXBsZW1lbnRzIFR5cGVBcmd1bWVudHNJbmZvIHsKICBmaW5hbCBBcmd1bWVudHNJbXBsIGFyZ3VtZW50czsKCiAgRXh0ZW5zaW9uTWV0aG9kVHlwZUFyZ3VtZW50c0luZm8odGhpcy5hcmd1bWVudHMpOwoKICBib29sIGlzSW5mZXJyZWQoaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCBhcmd1bWVudHMuX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCkgewogICAgICAvLyBUaGUgaW5kZXggcmVmZXJzIHRvIGEgdHlwZSBhcmd1bWVudCBmb3IgYSB0eXBlIHBhcmFtZXRlciBkZWNsYXJlZCBvbgogICAgICAvLyB0aGUgZXh0ZW5zaW9uLiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgZW5vdWdoIGV4cGxpY2l0IGV4dGVuc2lvbiB0eXBlCiAgICAgIC8vIGFyZ3VtZW50cy4KICAgICAgcmV0dXJuIGluZGV4ID49IGFyZ3VtZW50cy5fZXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRDb3VudDsKICAgIH0KICAgIC8vIFRoZSBpbmRleCByZWZlcnMgdG8gYSB0eXBlIGFyZ3VtZW50IGZvciBhIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmVkIG9uCiAgICAvLyB0aGUgbWV0aG9kLiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgZW5vdWdoIGV4cGxpY2l0IHJlZ3VsYXIgdHlwZSBhcmd1bWVudHMuCiAgICByZXR1cm4gaW5kZXggLSBhcmd1bWVudHMuX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCA+PQogICAgICAgIGFyZ3VtZW50cy5fZXhwbGljaXRUeXBlQXJndW1lbnRDb3VudDsKICB9CgogIGludCBnZXRPZmZzZXRGb3JJbmRleChpbnQgaW5kZXgsIGludCBvZmZzZXQpIHsKICAgIGlmIChpbmRleCA8IGFyZ3VtZW50cy5fZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMuX2V4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldCA/PyBvZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gb2Zmc2V0OwogIH0KfQoKVHlwZUFyZ3VtZW50c0luZm8gZ2V0VHlwZUFyZ3VtZW50c0luZm8oQXJndW1lbnRzIGFyZ3VtZW50cykgewogIGlmIChhcmd1bWVudHMgaXMgQXJndW1lbnRzSW1wbCkgewogICAgaWYgKGFyZ3VtZW50cy5fZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5fZXhwbGljaXRUeXBlQXJndW1lbnRDb3VudCA9PSAwCiAgICAgICAgICA/IGNvbnN0IEFsbEluZmVycmVkVHlwZUFyZ3VtZW50c0luZm8oKQogICAgICAgICAgOiBjb25zdCBOb25lSW5mZXJyZWRUeXBlQXJndW1lbnRzSW5mbygpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25NZXRob2RUeXBlQXJndW1lbnRzSW5mbyhhcmd1bWVudHMpOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBUaGlzIGNvZGUgcGF0aCBzaG91bGQgb25seSBiZSB0YWtlbiBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXJlIGFyZSBubwogICAgLy8gdHlwZSBhcmd1bWVudHMgYXQgYWxsLCBlLmcuIGNhbGxpbmcgYSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvci4KICAgIGFzc2VydChhcmd1bWVudHMudHlwZXMuaXNFbXB0eSk7CiAgICByZXR1cm4gY29uc3QgTm9uZUluZmVycmVkVHlwZUFyZ3VtZW50c0luZm8oKTsKICB9Cn0KCkxpc3Q8RGFydFR5cGU+IGdldEV4cGxpY2l0VHlwZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgaWYgKGFyZ3VtZW50cyBpcyBBcmd1bWVudHNJbXBsKSB7CiAgICBpZiAoYXJndW1lbnRzLl9leHBsaWNpdFR5cGVBcmd1bWVudENvdW50ID09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5fZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy50eXBlczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMudHlwZXMKICAgICAgICAgIC5za2lwKGFyZ3VtZW50cy5fZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50KQogICAgICAgICAgLnRvTGlzdCgpOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBUaGlzIGNvZGUgcGF0aCBzaG91bGQgb25seSBiZSB0YWtlbiBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXJlIGFyZSBubwogICAgLy8gdHlwZSBhcmd1bWVudHMgYXQgYWxsLCBlLmcuIGNhbGxpbmcgYSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvci4KICAgIGFzc2VydChhcmd1bWVudHMudHlwZXMuaXNFbXB0eSk7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcyBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCmNsYXNzIENsYXNzSW5mZXJlbmNlSW5mbyB7CiAgLy8vIFRoZSBidWlsZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzLgogIGZpbmFsIFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyOwoKICAvLy8gVGhlIHZpc2l0b3IgZm9yIGRldGVybWluaW5nIGlmIGEgZ2l2ZW4gdHlwZSBtYWtlcyBjb3ZhcmlhbnQgdXNlIG9mIG9uZSBvZgogIC8vLyB0aGUgY2xhc3MncyBnZW5lcmljIHBhcmFtZXRlcnMsIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXMgY292YXJpYW50IGNoZWNrcy4KICBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkgbmVlZHNDaGVja1Zpc2l0b3I7CgogIC8vLyBHZXR0ZXJzIGFuZCBtZXRob2RzIGluIHRoZSBjbGFzcydzIEFQSS4gIE1heSBpbmNsdWRlIGZvcndhcmRpbmcgbm9kZXMuCiAgZmluYWwgZ2V0dGVyc0FuZE1ldGhvZHMgPSA8TWVtYmVyPltdOwoKICAvLy8gU2V0dGVycyBpbiB0aGUgY2xhc3MncyBBUEkuICBNYXkgaW5jbHVkZSBmb3J3YXJkaW5nIG5vZGVzLgogIGZpbmFsIHNldHRlcnMgPSA8TWVtYmVyPltdOwoKICBDbGFzc0luZmVyZW5jZUluZm8odGhpcy5idWlsZGVyKTsKfQoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBpbnRlcm5hbCBzdGF0ZW1lbnRzLgphYnN0cmFjdCBjbGFzcyBJbnRlcm5hbFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8Uj4oU3RhdGVtZW50VmlzaXRvcjxSPiB2aXNpdG9yKSB7CiAgICBpZiAodmlzaXRvciBpcyBQcmludGVyIHx8IHZpc2l0b3IgaXMgUHJlY2VkZW5jZSkgewogICAgICAvLyBBbGxvdyB2aXNpdG9ycyBuZWVkZWQgZm9yIHRvU3RyaW5nLgogICAgICByZXR1cm4gdmlzaXRvci5kZWZhdWx0U3RhdGVtZW50KHRoaXMpOwogICAgfQogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5hY2NlcHQiLCAtMSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oU3RhdGVtZW50VmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5hY2NlcHQxIiwgLTEsIG51bGwpOwoKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcik7Cn0KCmNsYXNzIEZvckluU3RhdGVtZW50V2l0aFN5bnRoZXNpemVkVmFyaWFibGUgZXh0ZW5kcyBJbnRlcm5hbFN0YXRlbWVudCB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICBFeHByZXNzaW9uIGl0ZXJhYmxlOwogIEV4cHJlc3Npb24gc3ludGhldGljQXNzaWdubWVudDsKICBTdGF0ZW1lbnQgZXhwcmVzc2lvbkVmZmVjdHM7CiAgU3RhdGVtZW50IGJvZHk7CiAgZmluYWwgYm9vbCBpc0FzeW5jOwogIGZpbmFsIGJvb2wgaGFzUHJvYmxlbTsKICBpbnQgYm9keU9mZnNldDsKCiAgRm9ySW5TdGF0ZW1lbnRXaXRoU3ludGhlc2l6ZWRWYXJpYWJsZSh0aGlzLnZhcmlhYmxlLCB0aGlzLml0ZXJhYmxlLAogICAgICB0aGlzLnN5bnRoZXRpY0Fzc2lnbm1lbnQsIHRoaXMuZXhwcmVzc2lvbkVmZmVjdHMsIHRoaXMuYm9keSwKICAgICAge3RoaXMuaXNBc3luYywgdGhpcy5oYXNQcm9ibGVtfSkKICAgICAgOiBhc3NlcnQoaXNBc3luYyAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoaGFzUHJvYmxlbSAhPSBudWxsKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgc3ludGhldGljQXNzaWdubWVudD8ucGFyZW50ID0gdGhpczsKICAgIGV4cHJlc3Npb25FZmZlY3RzPy5wYXJlbnQgPSB0aGlzOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEZvckluU3RhdGVtZW50V2l0aFN5bnRoZXNpemVkVmFyaWFibGUodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgaXRlcmFibGU/LmFjY2VwdCh2KTsKICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQ/LmFjY2VwdCh2KTsKICAgIGV4cHJlc3Npb25FZmZlY3RzPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaXRlcmFibGUgIT0gbnVsbCkgewogICAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICBzeW50aGV0aWNBc3NpZ25tZW50ID0gc3ludGhldGljQXNzaWdubWVudC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBzeW50aGV0aWNBc3NpZ25tZW50Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGV4cHJlc3Npb25FZmZlY3RzICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbkVmZmVjdHMgPSBleHByZXNzaW9uRWZmZWN0cy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBleHByZXNzaW9uRWZmZWN0cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCmNsYXNzIFRyeVN0YXRlbWVudCBleHRlbmRzIEludGVybmFsU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgdHJ5QmxvY2s7CiAgTGlzdDxDYXRjaD4gY2F0Y2hCbG9ja3M7CiAgU3RhdGVtZW50IGZpbmFsbHlCbG9jazsKCiAgVHJ5U3RhdGVtZW50KHRoaXMudHJ5QmxvY2ssIHRoaXMuY2F0Y2hCbG9ja3MsIHRoaXMuZmluYWxseUJsb2NrKSB7CiAgICB0cnlCbG9jaz8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHMoY2F0Y2hCbG9ja3MsIHRoaXMpOwogICAgZmluYWxseUJsb2NrPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZShJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VHJ5U3RhdGVtZW50KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgdHJ5QmxvY2s/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdChjYXRjaEJsb2Nrcywgdik7CiAgICBmaW5hbGx5QmxvY2s/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHRyeUJsb2NrICE9IG51bGwpIHsKICAgICAgdHJ5QmxvY2sgPSB0cnlCbG9jay5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB0cnlCbG9jaz8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QoY2F0Y2hCbG9ja3MsIHYsIHRoaXMpOwogICAgaWYgKGZpbmFsbHlCbG9jayAhPSBudWxsKSB7CiAgICAgIGZpbmFsbHlCbG9jayA9IGZpbmFsbHlCbG9jay5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBmaW5hbGx5QmxvY2s/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgpjbGFzcyBTd2l0Y2hDYXNlSW1wbCBleHRlbmRzIFN3aXRjaENhc2UgewogIGZpbmFsIGJvb2wgaGFzTGFiZWw7CgogIFN3aXRjaENhc2VJbXBsKAogICAgICBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zLCBMaXN0PGludD4gZXhwcmVzc2lvbk9mZnNldHMsIFN0YXRlbWVudCBib2R5LAogICAgICB7Ym9vbCBpc0RlZmF1bHQ6IGZhbHNlLCB0aGlzLmhhc0xhYmVsfSkKICAgICAgOiBhc3NlcnQoaGFzTGFiZWwgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoZXhwcmVzc2lvbnMsIGV4cHJlc3Npb25PZmZzZXRzLCBib2R5LCBpc0RlZmF1bHQ6IGlzRGVmYXVsdCk7Cn0KCmNsYXNzIEJyZWFrU3RhdGVtZW50SW1wbCBleHRlbmRzIEJyZWFrU3RhdGVtZW50IHsKICBTdGF0ZW1lbnQgdGFyZ2V0U3RhdGVtZW50OwogIGZpbmFsIGJvb2wgaXNDb250aW51ZTsKCiAgQnJlYWtTdGF0ZW1lbnRJbXBsKHt0aGlzLmlzQ29udGludWV9KQogICAgICA6IGFzc2VydChpc0NvbnRpbnVlICE9IG51bGwpLAogICAgICAgIHN1cGVyKG51bGwpOwp9CgplbnVtIEludGVybmFsRXhwcmVzc2lvbktpbmQgewogIEJpbmFyeSwKICBDYXNjYWRlLAogIENvbXBvdW5kRXh0ZW5zaW9uSW5kZXhTZXQsCiAgQ29tcG91bmRFeHRlbnNpb25TZXQsCiAgQ29tcG91bmRJbmRleFNldCwKICBDb21wb3VuZFByb3BlcnR5U2V0LAogIENvbXBvdW5kU3VwZXJJbmRleFNldCwKICBEZWZlcnJlZENoZWNrLAogIEVxdWFscywKICBFeHByZXNzaW9uSW52b2NhdGlvbiwKICBFeHRlbnNpb25JbmRleFNldCwKICBFeHRlbnNpb25UZWFyT2ZmLAogIEV4dGVuc2lvblNldCwKICBJZk51bGwsCiAgSWZOdWxsRXh0ZW5zaW9uSW5kZXhTZXQsCiAgSWZOdWxsSW5kZXhTZXQsCiAgSWZOdWxsUHJvcGVydHlTZXQsCiAgSWZOdWxsU2V0LAogIElmTnVsbFN1cGVySW5kZXhTZXQsCiAgSW5kZXhHZXQsCiAgSW5kZXhTZXQsCiAgTG9hZExpYnJhcnlUZWFyT2ZmLAogIExvY2FsUG9zdEluY0RlYywKICBOdWxsQXdhcmVDb21wb3VuZFNldCwKICBOdWxsQXdhcmVFeHRlbnNpb24sCiAgTnVsbEF3YXJlSWZOdWxsU2V0LAogIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24sCiAgTnVsbEF3YXJlUHJvcGVydHlHZXQsCiAgTnVsbEF3YXJlUHJvcGVydHlTZXQsCiAgUGFyZW50aGVzaXplZCwKICBQcm9wZXJ0eVBvc3RJbmNEZWMsCiAgU3RhdGljUG9zdEluY0RlYywKICBTdXBlckluZGV4U2V0LAogIFN1cGVyUG9zdEluY0RlYywKICBVbmFyeSwKfQoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBpbnRlcm5hbCBleHByZXNzaW9ucy4KYWJzdHJhY3QgY2xhc3MgSW50ZXJuYWxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZDsKCiAgQG92ZXJyaWRlCiAgUiBhY2NlcHQ8Uj4oRXhwcmVzc2lvblZpc2l0b3I8Uj4gdmlzaXRvcikgewogICAgaWYgKHZpc2l0b3IgaXMgUHJpbnRlciB8fCB2aXNpdG9yIGlzIFByZWNlZGVuY2UpIHsKICAgICAgLy8gQWxsb3cgdmlzaXRvcnMgbmVlZGVkIGZvciB0b1N0cmluZy4KICAgICAgcmV0dXJuIHZpc2l0b3IuZGVmYXVsdEV4cHJlc3Npb24odGhpcyk7CiAgICB9CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoIiR7cnVudGltZVR5cGV9LmFjY2VwdCIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdmlzaXRvciwgQSBhcmcpID0+CiAgICAgIHVuc3VwcG9ydGVkKCIke3J1bnRpbWVUeXBlfS5hY2NlcHQxIiwgLTEsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKHR5cGVzKSA9PgogICAgICB1bnN1cHBvcnRlZCgiJHtydW50aW1lVHlwZX0uZ2V0U3RhdGljVHlwZSIsIC0xLCBudWxsKTsKCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpOwp9CgovLy8gRnJvbnQgZW5kIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIFtBcmd1bWVudF0uCmNsYXNzIEFyZ3VtZW50c0ltcGwgZXh0ZW5kcyBBcmd1bWVudHMgewogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1vdmUgdGhpcyB0byB0aGUgc3RhdGljIGludm9jYXRpb24gaW5zdGVhZC4KICBmaW5hbCBpbnQgX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudDsKCiAgZmluYWwgaW50IF9leHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudENvdW50OwoKICBmaW5hbCBpbnQgX2V4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldDsKCiAgaW50IF9leHBsaWNpdFR5cGVBcmd1bWVudENvdW50OwoKICBBcmd1bWVudHNJbXBsKExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCwKICAgICAge0xpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWR9KQogICAgICA6IF9leHBsaWNpdFR5cGVBcmd1bWVudENvdW50ID0gdHlwZXM/Lmxlbmd0aCA/PyAwLAogICAgICAgIF9leHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQgPSAwLAogICAgICAgIF9leHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudENvdW50ID0gMCwKICAgICAgICAvLyBUaGUgb2Zmc2V0IGlzIHVudXNlZCBpbiB0aGlzIGNhc2UuCiAgICAgICAgX2V4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldCA9IG51bGwsCiAgICAgICAgc3VwZXIocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVzLCBuYW1lZDogbmFtZWQpOwoKICBBcmd1bWVudHNJbXBsLmZvckV4dGVuc2lvbk1ldGhvZChpbnQgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50LAogICAgICBpbnQgdHlwZVBhcmFtZXRlckNvdW50LCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICB7TGlzdDxEYXJ0VHlwZT4gZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgaW50IGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldCwKICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxEYXJ0VHlwZT5bXSwKICAgICAgTGlzdDxFeHByZXNzaW9uPiBwb3NpdGlvbmFsQXJndW1lbnRzID0gY29uc3QgPEV4cHJlc3Npb24+W10sCiAgICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiBuYW1lZEFyZ3VtZW50cyA9IGNvbnN0IDxOYW1lZEV4cHJlc3Npb24+W119KQogICAgICA6IF9leHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQgPSBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsCiAgICAgICAgX2V4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50Q291bnQgPSBleHRlbnNpb25UeXBlQXJndW1lbnRzLmxlbmd0aCwKICAgICAgICBfZXhwbGljaXRUeXBlQXJndW1lbnRDb3VudCA9IHR5cGVBcmd1bWVudHMubGVuZ3RoLAogICAgICAgIF9leHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQgPSBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQsCiAgICAgICAgYXNzZXJ0KAogICAgICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRzLmlzRW1wdHkgfHwKICAgICAgICAgICAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudHMubGVuZ3RoID09IGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgIkV4dGVuc2lvbiB0eXBlIGFyZ3VtZW50cyBtdXN0IGJlIGVtcHR5IG9yIGNvbXBsZXRlLiIpLAogICAgICAgIHN1cGVyKDxFeHByZXNzaW9uPltyZWNlaXZlcl0uLmFkZEFsbChwb3NpdGlvbmFsQXJndW1lbnRzKSwKICAgICAgICAgICAgbmFtZWQ6IG5hbWVkQXJndW1lbnRzLAogICAgICAgICAgICB0eXBlczogPERhcnRUeXBlPltdCiAgICAgICAgICAgICAgLi5hZGRBbGwoX25vcm1hbGl6ZVR5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cykpCiAgICAgICAgICAgICAgLi5hZGRBbGwoCiAgICAgICAgICAgICAgICAgIF9ub3JtYWxpemVUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJDb3VudCwgdHlwZUFyZ3VtZW50cykpKTsKCiAgc3RhdGljIExpc3Q8RGFydFR5cGU+IF9ub3JtYWxpemVUeXBlQXJndW1lbnRzKAogICAgICBpbnQgbGVuZ3RoLCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMuaXNFbXB0eSAmJiBsZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKGxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICB9CiAgICByZXR1cm4gYXJndW1lbnRzOwogIH0KCiAgc3RhdGljIHZvaWQgc2V0Tm9uSW5mZXJyYWJsZUFyZ3VtZW50VHlwZXMoCiAgICAgIEFyZ3VtZW50c0ltcGwgYXJndW1lbnRzLCBMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgYXJndW1lbnRzLnR5cGVzLmNsZWFyKCk7CiAgICBhcmd1bWVudHMudHlwZXMuYWRkQWxsKHR5cGVzKTsKICAgIGFyZ3VtZW50cy5fZXhwbGljaXRUeXBlQXJndW1lbnRDb3VudCA9IHR5cGVzLmxlbmd0aDsKICB9CgogIHN0YXRpYyB2b2lkIHJlbW92ZU5vbkluZmVycmFibGVBcmd1bWVudFR5cGVzKEFyZ3VtZW50c0ltcGwgYXJndW1lbnRzKSB7CiAgICBhcmd1bWVudHMudHlwZXMuY2xlYXIoKTsKICAgIGFyZ3VtZW50cy5fZXhwbGljaXRUeXBlQXJndW1lbnRDb3VudCA9IDA7CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBjYXNjYWRlIGV4cHJlc3Npb24uCi8vLwovLy8gQSBjYXNjYWRlIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYGEuLmIoKS4uYygpYCBpcyByZXByZXNlbnRlZCBhcyB0aGUga2VybmVsCi8vLyBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdiA9IGEgaW4KLy8vICAgICAgICAgbGV0IF8gPSB2LmIoKSBpbgovLy8gICAgICAgICAgICAgbGV0IF8gPSB2LmMoKSBpbgovLy8gICAgICAgICAgICAgICAgIHYKLy8vCi8vLyBJbiB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGZvbGxvd3MsIGB2YCBpcyByZWZlcnJlZCB0byBhcyB0aGUgImNhc2NhZGUKLy8vIHZhcmlhYmxlIi0tdGhpcyBpcyB0aGUgdmFyaWFibGUgdGhhdCByZW1lbWJlcnMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCi8vLyBwcmVjZWRpbmcgdGhlIGZpcnN0IGAuLmAgd2hpbGUgdGhlIGNhc2NhZGVzIGFyZSBiZWluZyBldmFsdWF0ZWQuCmNsYXNzIENhc2NhZGUgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGhvbGRpbmcgdGhlIGNhc2NhZGUgcmVjZWl2ZXIgZXhwcmVzc2lvbiBpbiBpdHMKICAvLy8gaW5pdGlhbGl6ZXI7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgZmluYWwgYm9vbCBpc051bGxBd2FyZTsKCiAgLy8vIFRoZSBleHByZXNzaW9ucyBwZXJmb3JtZWQgb24gW3ZhcmlhYmxlXS4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gPEV4cHJlc3Npb24+W107CgogIC8vLyBDcmVhdGVzIGEgW0Nhc2NhZGVdIHVzaW5nIFt2YXJpYWJsZV0gYXMgdGhlIGNhc2NhZGUKICAvLy8gdmFyaWFibGUuICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgW3ZhcmlhYmxlXSdzCiAgLy8vIGluaXRpYWxpemVyIGlzIHRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgZmlyc3QgYC4uYCBvZiB0aGUgY2FzY2FkZQogIC8vLyBleHByZXNzaW9uLgogIENhc2NhZGUodGhpcy52YXJpYWJsZSwge3RoaXMuaXNOdWxsQXdhcmV9KSA6IGFzc2VydChpc051bGxBd2FyZSAhPSBudWxsKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdENhc2NhZGUodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkNhc2NhZGU7CgogIC8vLyBBZGRzIFtleHByZXNzaW9uXSB0byB0aGUgbGlzdCBvZiBbZXhwcmVzc2lvbnNdIHBlcmZvcm1lZCBvbiBbdmFyaWFibGVdLgogIHZvaWQgYWRkQ2FzY2FkZUV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBleHByZXNzaW9ucy5hZGQoZXhwcmVzc2lvbik7CiAgICBleHByZXNzaW9uLnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgdmlzaXRMaXN0KGV4cHJlc3Npb25zLCB2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QoZXhwcmVzc2lvbnMsIHYsIHRoaXMpOwogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgZGVmZXJyZWQgY2hlY2suCi8vIFRPRE8oam9obm5pd2ludGhlcik6IENoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gdG8gYmUgZGlyZWN0IGFuZCBwZXJmb3JtCi8vIHRoZSBbTGV0XSBlbmNvZGluZyBpbiB0aGUgcmVwbGFjZW1lbnQuCmNsYXNzIERlZmVycmVkQ2hlY2sgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBEZWZlcnJlZENoZWNrKHRoaXMudmFyaWFibGUsIHRoaXMuZXhwcmVzc2lvbikgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RGVmZXJyZWRDaGVjayh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuRGVmZXJyZWRDaGVjazsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgdmFyaWFibGU/LmFjY2VwdCh2KTsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBDb21tb24gYmFzZSBjbGFzcyBmb3Igc2hhZG93IG9iamVjdHMgcmVwcmVzZW50aW5nIGV4cHJlc3Npb25zIGluIGtlcm5lbAovLy8gZm9ybS4KYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbkp1ZGdtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAgLy8vIENhbGxzIGJhY2sgdG8gW2luZmVycmVyXSB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlIGZvciB3aGF0ZXZlciBjb25jcmV0ZQogIC8vLyB0eXBlIG9mIFtFeHByZXNzaW9uXSB0aGlzIGlzLgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KTsKfQoKLy8vIFNoYWRvdyBvYmplY3QgZm9yIFtTdGF0aWNJbnZvY2F0aW9uXSB3aGVuIHRoZSBwcm9jZWR1cmUgYmVpbmcgaW52b2tlZCBpcyBhCi8vLyBmYWN0b3J5IGNvbnN0cnVjdG9yLgpjbGFzcyBGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQgZXh0ZW5kcyBTdGF0aWNJbnZvY2F0aW9uCiAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25KdWRnbWVudCB7CiAgYm9vbCBoYXNCZWVuSW5mZXJyZWQgPSBmYWxzZTsKCiAgRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50KAogICAgICBQcm9jZWR1cmUgdGFyZ2V0LCBBcmd1bWVudHNJbXBsIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNDb25zdDogZmFsc2V9KQogICAgICA6IHN1cGVyKHRhcmdldCwgYXJndW1lbnRzLCBpc0NvbnN0OiBpc0NvbnN0KTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9Cn0KCi8vLyBGcm9udCBlbmQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgW0Z1bmN0aW9uRGVjbGFyYXRpb25dLgpjbGFzcyBGdW5jdGlvbkRlY2xhcmF0aW9uSW1wbCBleHRlbmRzIEZ1bmN0aW9uRGVjbGFyYXRpb24gewogIGJvb2wgaGFzSW1wbGljaXRSZXR1cm5UeXBlID0gZmFsc2U7CgogIEZ1bmN0aW9uRGVjbGFyYXRpb25JbXBsKAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCB2YXJpYWJsZSwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKQogICAgICA6IHN1cGVyKHZhcmlhYmxlLCBmdW5jdGlvbik7CgogIHN0YXRpYyB2b2lkIHNldEhhc0ltcGxpY2l0UmV0dXJuVHlwZSgKICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbkltcGwgZGVjbGFyYXRpb24sIGJvb2wgaGFzSW1wbGljaXRSZXR1cm5UeXBlKSB7CiAgICBkZWNsYXJhdGlvbi5oYXNJbXBsaWNpdFJldHVyblR5cGUgPSBoYXNJbXBsaWNpdFJldHVyblR5cGU7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYSBzdXBlciBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCBleHRlbmRzIExvY2FsSW5pdGlhbGl6ZXIKICAgIGltcGxlbWVudHMgSW5pdGlhbGl6ZXJKdWRnbWVudCB7CiAgZmluYWwgQ29uc3RydWN0b3IgdGFyZ2V0OwogIGZpbmFsIEFyZ3VtZW50c0ltcGwgYXJndW1lbnRzSnVkZ21lbnQ7CgogIEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQoCiAgICAgIHRoaXMudGFyZ2V0LCB0aGlzLmFyZ3VtZW50c0p1ZGdtZW50LCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnQodGhpcyk7CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gaWYtbnVsbCBleHByZXNzaW9uLgovLy8KLy8vIEFuIGlmLW51bGwgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgYSA/PyBiYCBpcyBlbmNvZGVkIGFzOgovLy8KLy8vICAgICBsZXQgdiA9IGEgaW4gdiA9PSBudWxsID8gYiA6IHYKLy8vCmNsYXNzIElmTnVsbEV4cHJlc3Npb24gZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gbGVmdDsKICBFeHByZXNzaW9uIHJpZ2h0OwoKICBJZk51bGxFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5yaWdodCkgewogICAgbGVmdD8ucGFyZW50ID0gdGhpczsKICAgIHJpZ2h0Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SWZOdWxsRXhwcmVzc2lvbih0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuSWZOdWxsOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICBsZWZ0Py5hY2NlcHQodik7CiAgICByaWdodD8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAobGVmdCAhPSBudWxsKSB7CiAgICAgIGxlZnQgPSBsZWZ0LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGxlZnQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocmlnaHQgIT0gbnVsbCkgewogICAgICByaWdodCA9IHJpZ2h0LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJpZ2h0Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBzaGFkb3cgb2JqZWN0cyByZXByZXNlbnRpbmcgaW5pdGlhbGl6ZXJzIGluIGtlcm5lbAovLy8gZm9ybS4KYWJzdHJhY3QgY2xhc3MgSW5pdGlhbGl6ZXJKdWRnbWVudCBpbXBsZW1lbnRzIEluaXRpYWxpemVyIHsKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2UgZm9yIHdoYXRldmVyIGNvbmNyZXRlIHR5cGUgb2YKICAvLy8gW0luaXRpYWxpemVySnVkZ21lbnRdIHRoaXMgaXMuCiAgdm9pZCBhY2NlcHRJbmZlcmVuY2UoSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yKTsKfQoKRXhwcmVzc2lvbiBjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3QoCiAgICBUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBpbnQgdmFsdWUsIFN0cmluZyBsaXRlcmFsLCBpbnQgY2hhck9mZnNldCkgewogIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9ICgxIDw8IDUzKSkgcmV0dXJuIG51bGw7CiAgaWYgKGluZmVycmVyLmlzVG9wTGV2ZWwpIHJldHVybiBudWxsOwogIGlmICghaW5mZXJyZXIubGlicmFyeS5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQKICAgICAgLmVycm9yT25VbmV4YWN0V2ViSW50TGl0ZXJhbHMpIHJldHVybiBudWxsOwogIEJpZ0ludCBhc0ludCA9IG5ldyBCaWdJbnQuZnJvbSh2YWx1ZSkudG9VbnNpZ25lZCg2NCk7CiAgQmlnSW50IGFzRG91YmxlID0gbmV3IEJpZ0ludC5mcm9tKGFzSW50LnRvRG91YmxlKCkpOwogIGlmIChhc0ludCA9PSBhc0RvdWJsZSkgcmV0dXJuIG51bGw7CiAgU3RyaW5nIHRleHQgPSBsaXRlcmFsID8/IHZhbHVlLnRvU3RyaW5nKCk7CiAgU3RyaW5nIG5lYXJlc3QgPSB0ZXh0LnN0YXJ0c1dpdGgoJzB4JykgfHwgdGV4dC5zdGFydHNXaXRoKCcwWCcpCiAgICAgID8gJzB4JHthc0RvdWJsZS50b1JhZGl4U3RyaW5nKDE2KX0nCiAgICAgIDogYXNEb3VibGUudG9TdHJpbmcoKTsKICBpbnQgbGVuZ3RoID0gbGl0ZXJhbD8ubGVuZ3RoID8/IG5vTGVuZ3RoOwogIHJldHVybiBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICB0ZW1wbGF0ZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseS53aXRoQXJndW1lbnRzKHRleHQsIG5lYXJlc3QpLAogICAgICBjaGFyT2Zmc2V0LAogICAgICBsZW5ndGgpOwp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW50ZWdlciBsaXRlcmFsIGluIGtlcm5lbCBmb3JtLgpjbGFzcyBJbnRKdWRnbWVudCBleHRlbmRzIEludExpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uSnVkZ21lbnQgewogIGZpbmFsIFN0cmluZyBsaXRlcmFsOwoKICBJbnRKdWRnbWVudChpbnQgdmFsdWUsIHRoaXMubGl0ZXJhbCkgOiBzdXBlcih2YWx1ZSk7CgogIGRvdWJsZSBhc0RvdWJsZSh7Ym9vbCBuZWdhdGVkOiBmYWxzZX0pIHsKICAgIGlmICh2YWx1ZSA9PSAwICYmIG5lZ2F0ZWQpIHJldHVybiAtMC4wOwogICAgQmlnSW50IGludFZhbHVlID0gbmV3IEJpZ0ludC5mcm9tKG5lZ2F0ZWQgPyAtdmFsdWUgOiB2YWx1ZSk7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBpbnRWYWx1ZS50b0RvdWJsZSgpOwogICAgcmV0dXJuIGludFZhbHVlID09IG5ldyBCaWdJbnQuZnJvbShkb3VibGVWYWx1ZSkgPyBkb3VibGVWYWx1ZSA6IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnRKdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgpjbGFzcyBTaGFkb3dMYXJnZUludExpdGVyYWwgZXh0ZW5kcyBJbnRMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKICBmaW5hbCBpbnQgZmlsZU9mZnNldDsKICBib29sIGlzUGFyZW50aGVzaXplZCA9IGZhbHNlOwoKICBTaGFkb3dMYXJnZUludExpdGVyYWwodGhpcy5saXRlcmFsLCB0aGlzLmZpbGVPZmZzZXQpIDogc3VwZXIoMCk7CgogIGRvdWJsZSBhc0RvdWJsZSh7Ym9vbCBuZWdhdGVkOiBmYWxzZX0pIHsKICAgIEJpZ0ludCBpbnRWYWx1ZSA9IEJpZ0ludC50cnlQYXJzZShuZWdhdGVkID8gJy0ke2xpdGVyYWx9JyA6IGxpdGVyYWwpOwogICAgaWYgKGludFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwogICAgZG91YmxlIGRvdWJsZVZhbHVlID0gaW50VmFsdWUudG9Eb3VibGUoKTsKICAgIHJldHVybiAhZG91YmxlVmFsdWUuaXNOYU4gJiYKICAgICAgICAgICAgIWRvdWJsZVZhbHVlLmlzSW5maW5pdGUgJiYKICAgICAgICAgICAgaW50VmFsdWUgPT0gbmV3IEJpZ0ludC5mcm9tKGRvdWJsZVZhbHVlKQogICAgICAgID8gZG91YmxlVmFsdWUKICAgICAgICA6IG51bGw7CiAgfQoKICBpbnQgYXNJbnQ2NCh7Ym9vbCBuZWdhdGVkOiBmYWxzZX0pIHsKICAgIHJldHVybiBpbnQudHJ5UGFyc2UobmVnYXRlZCA/ICctJHtsaXRlcmFsfScgOiBsaXRlcmFsKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFNoYWRvd0xhcmdlSW50TGl0ZXJhbCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW52YWxpZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93SW52YWxpZEluaXRpYWxpemVyIGV4dGVuZHMgTG9jYWxJbml0aWFsaXplcgogICAgaW1wbGVtZW50cyBJbml0aWFsaXplckp1ZGdtZW50IHsKICBTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgOiBzdXBlcih2YXJpYWJsZSk7CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXIodGhpcyk7CiAgfQp9CgovLy8gQ29uY3JldGUgc2hhZG93IG9iamVjdCByZXByZXNlbnRpbmcgYW4gaW52YWxpZCBpbml0aWFsaXplciBpbiBrZXJuZWwgZm9ybS4KY2xhc3MgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBMb2NhbEluaXRpYWxpemVyCiAgICBpbXBsZW1lbnRzIEluaXRpYWxpemVySnVkZ21lbnQgewogIEZpZWxkIGZpZWxkOwogIEV4cHJlc3Npb24gdmFsdWU7CgogIFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKAogICAgICB0aGlzLmZpZWxkLCB0aGlzLnZhbHVlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlKSB7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYWNjZXB0SW5mZXJlbmNlKEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvcikgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTaGFkb3dJbnZhbGlkRmllbGRJbml0aWFsaXplcih0aGlzKTsKICB9Cn0KCmNsYXNzIEV4cHJlc3Npb25JbnZvY2F0aW9uIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgRXhwcmVzc2lvbkludm9jYXRpb24odGhpcy5leHByZXNzaW9uLCB0aGlzLmFyZ3VtZW50cykgewogICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEV4cHJlc3Npb25JbnZvY2F0aW9uKHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4KICAgICAgSW50ZXJuYWxFeHByZXNzaW9uS2luZC5FeHByZXNzaW9uSW52b2NhdGlvbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogICAgYXJndW1lbnRzPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHMgPSBhcmd1bWVudHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYXJndW1lbnRzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIENvbmNyZXRlIHNoYWRvdyBvYmplY3QgcmVwcmVzZW50aW5nIGEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbi4KLy8vCi8vLyBOYW1lZCBmdW5jdGlvbiBleHByZXNzaW9ucyBhcmUgbm90IGxlZ2FsIGluIERhcnQsIGJ1dCB0aGV5IGFyZSBhY2NlcHRlZCBieQovLy8gdGhlIHBhcnNlciBhbmQgQm9keUJ1aWxkZXIgZm9yIGVycm9yIHJlY292ZXJ5IHB1cnBvc2VzLgovLy8KLy8vIEEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgZigpIHsgLi4uIH1gIGlzIHJlcHJlc2VudGVkIGFzIHRoZQovLy8ga2VybmVsIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCBmID0gKCkgeyAuLi4gfSBpbiBmCmNsYXNzIE5hbWVkRnVuY3Rpb25FeHByZXNzaW9uSnVkZ21lbnQgZXh0ZW5kcyBMZXQKICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkp1ZGdtZW50IHsKICBOYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbkp1ZGdtZW50KFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsIHZhcmlhYmxlKQogICAgICA6IHN1cGVyKHZhcmlhYmxlLCBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBudWxsLWF3YXJlIG1ldGhvZCBpbnZvY2F0aW9uLgovLy8KLy8vIEEgbnVsbC1hd2FyZSBtZXRob2QgaW52b2NhdGlvbiBvZiB0aGUgZm9ybSBgYT8uYiguLi4pYCBpcyBlbmNvZGVkIGFzOgovLy8KLy8vICAgICBsZXQgdiA9IGEgaW4gdiA9PSBudWxsID8gbnVsbCA6IHYuYiguLi4pCi8vLwpjbGFzcyBOdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIHN5bnRoZXRpYyB2YXJpYWJsZSB3aG9zZSBpbml0aWFsaXplciBob2xkIHRoZSByZWNlaXZlci4KICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwoKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2Qgb24gW3ZhcmlhYmxlXS4KICBFeHByZXNzaW9uIGludm9jYXRpb247CgogIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24odGhpcy52YXJpYWJsZSwgdGhpcy5pbnZvY2F0aW9uKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGludm9jYXRpb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uKHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4KICAgICAgSW50ZXJuYWxFeHByZXNzaW9uS2luZC5OdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgaW52b2NhdGlvbj8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChpbnZvY2F0aW9uICE9IG51bGwpIHsKICAgICAgaW52b2NhdGlvbiA9IGludm9jYXRpb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgaW52b2NhdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIG51bGwtYXdhcmUgcmVhZCBmcm9tIGEgcHJvcGVydHkuCi8vLwovLy8gQSBudWxsLWF3YXJlIHByb3BlcnR5IGdldCBvZiB0aGUgZm9ybSBgYT8uYmAgaXMgZW5jb2RlZCBhczoKLy8vCi8vLyAgICAgbGV0IHYgPSBhIGluIHYgPT0gbnVsbCA/IG51bGwgOiB2LmIKLy8vCmNsYXNzIE51bGxBd2FyZVByb3BlcnR5R2V0IGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIHN5bnRoZXRpYyB2YXJpYWJsZSB3aG9zZSBpbml0aWFsaXplciBob2xkIHRoZSByZWNlaXZlci4KICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwoKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgcHJvcGVydHkgZnJvbSBbdmFyaWFibGVdLgogIEV4cHJlc3Npb24gcmVhZDsKCiAgTnVsbEF3YXJlUHJvcGVydHlHZXQodGhpcy52YXJpYWJsZSwgdGhpcy5yZWFkKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIHJlYWQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROdWxsQXdhcmVQcm9wZXJ0eUdldCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+CiAgICAgIEludGVybmFsRXhwcmVzc2lvbktpbmQuTnVsbEF3YXJlUHJvcGVydHlHZXQ7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIHZhcmlhYmxlPy5hY2NlcHQodik7CiAgICByZWFkPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHJlYWQgIT0gbnVsbCkgewogICAgICByZWFkID0gcmVhZC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByZWFkPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgbnVsbC1hd2FyZSByZWFkIGZyb20gYSBwcm9wZXJ0eS4KLy8vCi8vLyBBIG51bGwtYXdhcmUgcHJvcGVydHkgZ2V0IG9mIHRoZSBmb3JtIGBhPy5iID0gY2AgaXMgZW5jb2RlZCBhczoKLy8vCi8vLyAgICAgbGV0IHYgPSBhIGluIHYgPT0gbnVsbCA/IG51bGwgOiB2LmIgPSBjCi8vLwpjbGFzcyBOdWxsQXdhcmVQcm9wZXJ0eVNldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSBzeW50aGV0aWMgdmFyaWFibGUgd2hvc2UgaW5pdGlhbGl6ZXIgaG9sZCB0aGUgcmVjZWl2ZXIuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgd3JpdGVzIHRoZSB2YWx1ZSB0byB0aGUgcHJvcGVydHkgaW4gW3ZhcmlhYmxlXS4KICBFeHByZXNzaW9uIHdyaXRlOwoKICBOdWxsQXdhcmVQcm9wZXJ0eVNldCh0aGlzLnZhcmlhYmxlLCB0aGlzLndyaXRlKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TnVsbEF3YXJlUHJvcGVydHlTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PgogICAgICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLk51bGxBd2FyZVByb3BlcnR5U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgd3JpdGU/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAod3JpdGUgIT0gbnVsbCkgewogICAgICB3cml0ZSA9IHdyaXRlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEZyb250IGVuZCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBbUmV0dXJuU3RhdGVtZW50XS4KY2xhc3MgUmV0dXJuU3RhdGVtZW50SW1wbCBleHRlbmRzIFJldHVyblN0YXRlbWVudCB7CiAgZmluYWwgYm9vbCBpc0Fycm93OwoKICBSZXR1cm5TdGF0ZW1lbnRJbXBsKHRoaXMuaXNBcnJvdywgW0V4cHJlc3Npb24gZXhwcmVzc2lvbl0pCiAgICAgIDogc3VwZXIoZXhwcmVzc2lvbik7Cn0KCi8vLyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbVHlwZVByb21vdGVyXSBzcGVjaWFsaXplZCB0byB3b3JrIHdpdGgga2VybmVsCi8vLyBvYmplY3RzLgpjbGFzcyBTaGFkb3dUeXBlUHJvbW90ZXIgZXh0ZW5kcyBUeXBlUHJvbW90ZXJJbXBsIHsKICBTaGFkb3dUeXBlUHJvbW90ZXIucHJpdmF0ZShUeXBlU2NoZW1hRW52aXJvbm1lbnQgdHlwZVNjaGVtYUVudmlyb25tZW50KQogICAgICA6IHN1cGVyLnByaXZhdGUodHlwZVNjaGVtYUVudmlyb25tZW50KTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldFZhcmlhYmxlRnVuY3Rpb25OZXN0aW5nTGV2ZWwoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsKSB7CiAgICAgIHJldHVybiB2YXJpYWJsZS5mdW5jdGlvbk5lc3RpbmdMZXZlbDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEhhY2sgdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgQm9keUJ1aWxkZXIgc3RpbGwgY3JlYXRlcyByYXcKICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBvYmplY3RzIHNvbWV0aW1lcy4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBnZXQgcmlkIG9mIHRoaXMgb25jZSB0aGUgdHlwZSBwYXJhbWV0ZXIgaXMKICAgICAgLy8gS2VybmVsVmFyaWFibGVEZWNsYXJhdGlvbi4KICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzUHJvbW90aW9uQ2FuZGlkYXRlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGFzc2VydCh2YXJpYWJsZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCBrZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uID0gdmFyaWFibGU7CiAgICByZXR1cm4gIWtlcm5lbFZhcmlhYmxlRGVjbGFyYXRpb24uaXNMb2NhbEZ1bmN0aW9uOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBzYW1lRXhwcmVzc2lvbnMoRXhwcmVzc2lvbiBhLCBFeHByZXNzaW9uIGIpIHsKICAgIHJldHVybiBpZGVudGljYWwoYSwgYik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHNldFZhcmlhYmxlTXV0YXRlZEFueXdoZXJlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIGlmICh2YXJpYWJsZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCkgewogICAgICB2YXJpYWJsZS5tdXRhdGVkQW55d2hlcmUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGFjayB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBCb2R5QnVpbGRlciBzdGlsbCBjcmVhdGVzIHJhdwogICAgICAvLyBWYXJpYWJsZURlY2xhcmF0aW9uIG9iamVjdHMgc29tZXRpbWVzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGdldCByaWQgb2YgdGhpcyBvbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBpcwogICAgICAvLyBLZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRWYXJpYWJsZU11dGF0ZWRJbkNsb3N1cmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsKSB7CiAgICAgIHZhcmlhYmxlLm11dGF0ZWRJbkNsb3N1cmUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gSGFjayB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBCb2R5QnVpbGRlciBzdGlsbCBjcmVhdGVzIHJhdwogICAgICAvLyBWYXJpYWJsZURlY2xhcmF0aW9uIG9iamVjdHMgc29tZXRpbWVzLgogICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGdldCByaWQgb2YgdGhpcyBvbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBpcwogICAgICAvLyBLZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB3YXNWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgICBpZiAodmFyaWFibGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkltcGwpIHsKICAgICAgcmV0dXJuIHZhcmlhYmxlLm11dGF0ZWRBbnl3aGVyZTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEhhY2sgdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgQm9keUJ1aWxkZXIgc3RpbGwgY3JlYXRlcyByYXcKICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdGlvbiBvYmplY3RzIHNvbWV0aW1lcy4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBnZXQgcmlkIG9mIHRoaXMgb25jZSB0aGUgdHlwZSBwYXJhbWV0ZXIgaXMKICAgICAgLy8gS2VybmVsVmFyaWFibGVEZWNsYXJhdGlvbi4KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQp9CgovLy8gRnJvbnQgZW5kIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIFtWYXJpYWJsZURlY2xhcmF0aW9uXS4KY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBWYXJpYWJsZURlY2xhcmF0aW9uIHsKICBmaW5hbCBib29sIGZvclN5bnRoZXRpY1Rva2VuOwoKICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIFtWYXJpYWJsZURlY2xhcmF0aW9uSW1wbF0gaGFkIGFuIGltcGxpY2l0CiAgLy8vIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgc3RhdGljIHRvIGF2b2lkIGludHJvZHVjaW5nIGEgbWV0aG9kIHRoYXQgd291bGQgYmUgdmlzaWJsZSB0bwogIC8vLyB0aGUga2VybmVsLgogIGZpbmFsIGJvb2wgaXNJbXBsaWNpdGx5VHlwZWQ7CgogIC8vLyBUcnVlIGlmIHRoZSBpbml0aWFsaXplciB3YXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm9ncmFtbWVyLgogIGZpbmFsIGJvb2wgaGFzRGVjbGFyZWRJbml0aWFsaXplcjsKCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBmaWVsZC4gV2UgY2FuIGdldCByaWQgb2YgaXQgYnkgcmVjb3JkaW5nIGNsb3N1cmUKICAvLyBtdXRhdGlvbiBpbiBbQm9keUJ1aWxkZXJdLgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBmaWVsZC4gSXQncyBvbmx5IHVzZWQgbG9jYWxseSB3aGVuIGNvbXBpbGluZyBhCiAgLy8gbWV0aG9kLCBhbmQgdGhpcyBjYW4gdGh1cyBiZSB0cmFja2VkIGluIGEgW1NldF0gKGFjdHVhbGx5LCB0cmFja2luZyB0aGlzCiAgLy8gaW5mb3JtYXRpb24gaW4gYSBbTGlzdF0gaXMgcHJvYmFibHkgZXZlbiBmYXN0ZXIgYXMgdGhlIGF2ZXJhZ2Ugc2l6ZSB3aWxsCiAgLy8gYmUgY2xvc2UgdG8gemVybykuCiAgYm9vbCBtdXRhdGVkSW5DbG9zdXJlID0gZmFsc2U7CgogIC8vIFRPRE8oYWhlKTogSW52ZXN0aWdhdGUgaWYgdGhpcyBjYW4gYmUgcmVtb3ZlZC4KICBib29sIG11dGF0ZWRBbnl3aGVyZSA9IGZhbHNlOwoKICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBbVmFyaWFibGVEZWNsYXJhdGlvbkltcGxdIHJlcHJlc2VudHMgYQogIC8vLyBsb2NhbCBmdW5jdGlvbi4KICAvLy8KICAvLy8gVGhpcyBpcyBzdGF0aWMgdG8gYXZvaWQgaW50cm9kdWNpbmcgYSBtZXRob2QgdGhhdCB3b3VsZCBiZSB2aXNpYmxlIHRvIHRoZQogIC8vLyBrZXJuZWwuCiAgLy8gVE9ETyhhaGUpOiBJbnZlc3RpZ2F0ZSBpZiB0aGlzIGNhbiBiZSByZW1vdmVkLgogIGZpbmFsIGJvb2wgaXNMb2NhbEZ1bmN0aW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbmFtZSwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCwKICAgICAge3RoaXMuZm9yU3ludGhldGljVG9rZW46IGZhbHNlLAogICAgICB0aGlzLmhhc0RlY2xhcmVkSW5pdGlhbGl6ZXI6IGZhbHNlLAogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyLAogICAgICBEYXJ0VHlwZSB0eXBlLAogICAgICBib29sIGlzRmluYWw6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzRmllbGRGb3JtYWw6IGZhbHNlLAogICAgICBib29sIGlzQ292YXJpYW50OiBmYWxzZSwKICAgICAgYm9vbCBpc0xvY2FsRnVuY3Rpb246IGZhbHNlLAogICAgICBib29sIGlzTGF0ZTogZmFsc2UsCiAgICAgIGJvb2wgaXNSZXF1aXJlZDogZmFsc2V9KQogICAgICA6IGlzSW1wbGljaXRseVR5cGVkID0gdHlwZSA9PSBudWxsLAogICAgICAgIGlzTG9jYWxGdW5jdGlvbiA9IGlzTG9jYWxGdW5jdGlvbiwKICAgICAgICBzdXBlcihuYW1lLAogICAgICAgICAgICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsCiAgICAgICAgICAgIHR5cGU6IHR5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgaXNGaW5hbDogaXNGaW5hbCwKICAgICAgICAgICAgaXNDb25zdDogaXNDb25zdCwKICAgICAgICAgICAgaXNGaWVsZEZvcm1hbDogaXNGaWVsZEZvcm1hbCwKICAgICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50LAogICAgICAgICAgICBpc0xhdGU6IGlzTGF0ZSwKICAgICAgICAgICAgaXNSZXF1aXJlZDogaXNSZXF1aXJlZCk7CgogIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsLmZvckVmZmVjdChFeHByZXNzaW9uIGluaXRpYWxpemVyKQogICAgICA6IGZvclN5bnRoZXRpY1Rva2VuID0gZmFsc2UsCiAgICAgICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPSAwLAogICAgICAgIGlzSW1wbGljaXRseVR5cGVkID0gZmFsc2UsCiAgICAgICAgaXNMb2NhbEZ1bmN0aW9uID0gZmFsc2UsCiAgICAgICAgaGFzRGVjbGFyZWRJbml0aWFsaXplciA9IHRydWUsCiAgICAgICAgc3VwZXIuZm9yVmFsdWUoaW5pdGlhbGl6ZXIpOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbC5mb3JWYWx1ZShFeHByZXNzaW9uIGluaXRpYWxpemVyKQogICAgICA6IGZvclN5bnRoZXRpY1Rva2VuID0gZmFsc2UsCiAgICAgICAgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPSAwLAogICAgICAgIGlzSW1wbGljaXRseVR5cGVkID0gdHJ1ZSwKICAgICAgICBpc0xvY2FsRnVuY3Rpb24gPSBmYWxzZSwKICAgICAgICBoYXNEZWNsYXJlZEluaXRpYWxpemVyID0gdHJ1ZSwKICAgICAgICBzdXBlci5mb3JWYWx1ZShpbml0aWFsaXplcik7CgogIC8vIFRoZSBzeW50aGVzaXplZCBsb2NhbCBnZXR0ZXIgZnVuY3Rpb24gZm9yIGEgbG93ZXJlZCBsYXRlIHZhcmlhYmxlLgogIC8vCiAgLy8gVGhpcyBpcyBzZXQgaW4gYEluZmVyZW5jZVZpc2l0b3IudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uYCB3aGVuIGxhdGUKICAvLyBsb3dlcmluZyBpcyBlbmFibGVkLgogIFZhcmlhYmxlRGVjbGFyYXRpb24gbGF0ZUdldHRlcjsKCiAgLy8gVGhlIHN5bnRoZXNpemVkIGxvY2FsIHNldHRlciBmdW5jdGlvbiBmb3IgYW4gYXNzaWduYWJsZSBsb3dlcmVkIGxhdGUKICAvLyB2YXJpYWJsZS4KICAvLwogIC8vIFRoaXMgaXMgc2V0IGluIGBJbmZlcmVuY2VWaXNpdG9yLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbmAgd2hlbiBsYXRlCiAgLy8gbG93ZXJpbmcgaXMgZW5hYmxlZC4KICBWYXJpYWJsZURlY2xhcmF0aW9uIGxhdGVTZXR0ZXI7CgogIC8vIFRoZSBvcmlnaW5hbCB0eXBlIChkZWNsYXJlZCBvciBpbmZlcnJlZCkgb2YgYSBsb3dlcmVkIGxhdGUgdmFyaWFibGUuCiAgLy8KICAvLyBUaGlzIGlzIHNldCBpbiBgSW5mZXJlbmNlVmlzaXRvci52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb25gIHdoZW4gbGF0ZQogIC8vIGxvd2VyaW5nIGlzIGVuYWJsZWQuCiAgRGFydFR5cGUgbGF0ZVR5cGU7Cn0KCi8vLyBGcm9udCBlbmQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgW1ZhcmlhYmxlR2V0XS4KY2xhc3MgVmFyaWFibGVHZXRJbXBsIGV4dGVuZHMgVmFyaWFibGVHZXQgewogIGZpbmFsIFR5cGVQcm9tb3Rpb25GYWN0IGZhY3Q7CgogIGZpbmFsIFR5cGVQcm9tb3Rpb25TY29wZSBzY29wZTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoZSBuZWVkIGZvciB0aGlzIGJ5IGVuY29kaW5nIGFsbCBudWxsIGF3YXJlCiAgLy8gZXhwcmVzc2lvbnMgZXhwbGljaXRseS4KICBmaW5hbCBib29sIGZvck51bGxHdWFyZGVkQWNjZXNzOwoKICBWYXJpYWJsZUdldEltcGwoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgdGhpcy5mYWN0LCB0aGlzLnNjb3BlLAogICAgICB7dGhpcy5mb3JOdWxsR3VhcmRlZEFjY2Vzc30pCiAgICAgIDogYXNzZXJ0KGZvck51bGxHdWFyZGVkQWNjZXNzICE9IG51bGwpLAogICAgICAgIHN1cGVyKHZhcmlhYmxlKTsKfQoKLy8vIEZyb250IGVuZCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBbTG9hZExpYnJhcnldLgpjbGFzcyBMb2FkTGlicmFyeUltcGwgZXh0ZW5kcyBMb2FkTGlicmFyeSB7CiAgZmluYWwgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgTG9hZExpYnJhcnlJbXBsKExpYnJhcnlEZXBlbmRlbmN5IGltcG9ydCwgdGhpcy5hcmd1bWVudHMpIDogc3VwZXIoaW1wb3J0KTsKfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgdGVhci1vZmYgb2YgYSBgbG9hZExpYnJhcnlgIGZ1bmN0aW9uLgpjbGFzcyBMb2FkTGlicmFyeVRlYXJPZmYgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIExpYnJhcnlEZXBlbmRlbmN5IGltcG9ydDsKICBQcm9jZWR1cmUgdGFyZ2V0OwoKICBMb2FkTGlicmFyeVRlYXJPZmYodGhpcy5pbXBvcnQsIHRoaXMudGFyZ2V0KTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TG9hZExpYnJhcnlUZWFyT2ZmKHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5Mb2FkTGlicmFyeVRlYXJPZmY7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIGltcG9ydD8uYWNjZXB0KHYpOwogICAgdGFyZ2V0Py5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChpbXBvcnQgIT0gbnVsbCkgewogICAgICBpbXBvcnQgPSBpbXBvcnQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgIH0KICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICB0YXJnZXQgPSB0YXJnZXQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhbiBpZi1udWxsIHByb3BlcnR5IHNldC4KLy8vCi8vLyBBbiBpZi1udWxsIHByb3BlcnR5IHNldCBvZiB0aGUgZm9ybSBgby5hID8/PSBiYCBpcywgaWYgdXNlZCBmb3IgdmFsdWUsCi8vLyBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdjEgPSBvIGluIGxldCB2MiA9IHYxLmEgaW4gdjIgPT0gbnVsbCA/IHYxLmEgPSBiIDogdjIKLy8vCi8vLyBhbmQsIGlmIHVzZWQgZm9yIGVmZmVjdCwgZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYxID0gbyBpbiB2MS5hID09IG51bGwgPyB2MS5hID0gYiA6IG51bGwKLy8vCmNsYXNzIElmTnVsbFByb3BlcnR5U2V0IGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIHN5bnRoZXRpYyB2YXJpYWJsZSB3aG9zZSBpbml0aWFsaXplciBob2xkIHRoZSByZWNlaXZlci4KICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwoKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgcHJvcGVydHkgZnJvbSBbdmFyaWFibGVdLgogIEV4cHJlc3Npb24gcmVhZDsKCiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgd3JpdGVzIHRoZSB2YWx1ZSB0byB0aGUgcHJvcGVydHkgb24gW3ZhcmlhYmxlXS4KICBFeHByZXNzaW9uIHdyaXRlOwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBvbmx5IG5lZWQgZm9yIGVmZmVjdCBhbmQgbm90IGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCBmb3JFZmZlY3Q7CgogIElmTnVsbFByb3BlcnR5U2V0KHRoaXMudmFyaWFibGUsIHRoaXMucmVhZCwgdGhpcy53cml0ZSwge3RoaXMuZm9yRWZmZWN0fSkKICAgICAgOiBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpIHsKICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgcmVhZD8ucGFyZW50ID0gdGhpczsKICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SWZOdWxsUHJvcGVydHlTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLklmTnVsbFByb3BlcnR5U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgcmVhZD8uYWNjZXB0KHYpOwogICAgd3JpdGU/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChyZWFkICE9IG51bGwpIHsKICAgICAgcmVhZCA9IHJlYWQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVhZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh3cml0ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlID0gd3JpdGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgd3JpdGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gaWYtbnVsbCBhc3NpZ25tZW50LgovLy8KLy8vIEFuIGlmLW51bGwgYXNzaWdubWVudCBvZiB0aGUgZm9ybSBgYSA/Pz0gYmAgaXMsIGlmIHVzZWQgZm9yIHZhbHVlLAovLy8gZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYxID0gYSBpbiB2MSA9PSBudWxsID8gYSA9IGIgOiB2MQovLy8KLy8vIGFuZCwgaWYgdXNlZCBmb3IgZWZmZWN0LCBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBhID09IG51bGwgPyBhID0gYiA6IG51bGwKLy8vCmNsYXNzIElmTnVsbFNldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgcmVhZHMgdGhlIHByb3BlcnR5IGZyb20gW3ZhcmlhYmxlXS4KICBFeHByZXNzaW9uIHJlYWQ7CgogIC8vLyBUaGUgZXhwcmVzc2lvbiB0aGF0IHdyaXRlcyB0aGUgdmFsdWUgdG8gdGhlIHByb3BlcnR5IG9uIFt2YXJpYWJsZV0uCiAgRXhwcmVzc2lvbiB3cml0ZTsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIGV4cHJlc3Npb24gaXMgb25seSBuZWVkIGZvciBlZmZlY3QgYW5kIG5vdCBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgZm9yRWZmZWN0OwoKICBJZk51bGxTZXQodGhpcy5yZWFkLCB0aGlzLndyaXRlLCB7dGhpcy5mb3JFZmZlY3R9KQogICAgICA6IGFzc2VydChmb3JFZmZlY3QgIT0gbnVsbCkgewogICAgcmVhZD8ucGFyZW50ID0gdGhpczsKICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SWZOdWxsU2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5JZk51bGxTZXQ7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIHJlYWQ/LmFjY2VwdCh2KTsKICAgIHdyaXRlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWFkICE9IG51bGwpIHsKICAgICAgcmVhZCA9IHJlYWQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVhZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh3cml0ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlID0gd3JpdGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgd3JpdGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gY29tcG91bmQgZXh0ZW5zaW9uIGFzc2lnbm1lbnQuCi8vLwovLy8gQW4gY29tcG91bmQgZXh0ZW5zaW9uIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0KLy8vCi8vLyAgICAgRXh0ZW5zaW9uKHJlY2VpdmVyKS5wcm9wZXJ0eU5hbWUgKz0gcmhzCi8vLwovLy8gaXMsIGlmIHVzZWQgZm9yIHZhbHVlLCBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IHJlY2VpdmVyIGluCi8vLyAgICAgICBsZXQgdmFsdWVWYXJpYWJsZSA9Ci8vLyAgICAgICAgICAgRXh0ZW5zaW9ufGdldCNwcm9wZXJ0eU5hbWUocmVjZWl2ZXJWYXJpYWJsZSkgKyByaHMpIGluCi8vLyAgICAgICAgIGxldCB3cml0ZVZhcmlhYmxlID0KLy8vICAgICAgICAgICAgIEV4dGVuc2lvbnxzZXQjcHJvcGVydHlOYW1lKHJlY2VpdmVyVmFyaWFibGUsIHZhbHVlVmFyaWFibGUpIGluCi8vLyAgICAgICAgICAgdmFsdWVWYXJpYWJsZQovLy8KLy8vIGFuZCBpZiB1c2VkIGZvciBlZmZlY3QgYXM6Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgICAgRXh0ZW5zaW9ufHNldCNwcm9wZXJ0eU5hbWUocmVjZWl2ZXJWYXJpYWJsZSwKLy8vICAgICAgICAgICBFeHRlbnNpb258Z2V0I3Byb3BlcnR5TmFtZShyZWNlaXZlclZhcmlhYmxlKSArIHJocykKLy8vCi8vLyBJZiBbcmVhZE9ubHlSZWNlaXZlcl0gaXMgYHRydWVgIHRoZSBbcmVjZWl2ZXJWYXJpYWJsZV0gaXMgbm90IGNyZWF0ZWQKLy8vIGFuZCB0aGUgW3JlY2VpdmVyXSBpcyB1c2VkIGRpcmVjdGx5LgpjbGFzcyBDb21wb3VuZEV4dGVuc2lvblNldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSBleHRlbnNpb24gaW4gd2hpY2ggdGhlIFtzZXR0ZXJdIGlzIGRlY2xhcmVkLgogIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb247CgogIC8vLyBUaGUgZXhwbGljaXQgdHlwZSBhcmd1bWVudHMgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4KICAvLy8gW2V4dGVuc2lvbl0uCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gZXhwbGljaXRUeXBlQXJndW1lbnRzOwoKICAvLy8gVGhlIHJlY2VpdmVyIHVzZWQgZm9yIHRoZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhY2Nlc3NlZCBieSB0aGUgcmVhZC93cml0ZSBvcGVyYXRpb25zLgogIGZpbmFsIE5hbWUgcHJvcGVydHlOYW1lOwoKICAvLy8gVGhlIG1lbWJlciB1c2VkIGZvciB0aGUgcmVhZCBvcGVyYXRpb24uCiAgZmluYWwgTWVtYmVyIGdldHRlcjsKCiAgLy8vIFRoZSBiaW5hcnkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGUgZ2V0dGVyIHJlc3VsdCBhbmQgW3Joc10uCiAgZmluYWwgTmFtZSBiaW5hcnlOYW1lOwoKICAvLy8gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgYmluYXJ5IG9wZXJhdGlvbi4KICBFeHByZXNzaW9uIHJoczsKCiAgLy8vIFRoZSBtZW1iZXIgdXNlZCBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbi4KICBmaW5hbCBNZW1iZXIgc2V0dGVyOwoKICAvLy8gSWYgYHRydWVgLCB0aGUgcmVjZWl2ZXIgaXMgcmVhZC1vbmx5IGFuZCB0aGVyZWZvcmUgZG9lc24ndCBuZWVkIGEKICAvLy8gdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCByZWFkT25seVJlY2VpdmVyOwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBvbmx5IG5lZWQgZm9yIGVmZmVjdCBhbmQgbm90IGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCBmb3JFZmZlY3Q7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSByZWFkIG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgcmVhZE9mZnNldDsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGJpbmFyeSBvcGVyYXRpb24uCiAgZmluYWwgaW50IGJpbmFyeU9mZnNldDsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgd3JpdGVPZmZzZXQ7CgogIENvbXBvdW5kRXh0ZW5zaW9uU2V0KAogICAgICB0aGlzLmV4dGVuc2lvbiwKICAgICAgdGhpcy5leHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgIHRoaXMucmVjZWl2ZXIsCiAgICAgIHRoaXMucHJvcGVydHlOYW1lLAogICAgICB0aGlzLmdldHRlciwKICAgICAgdGhpcy5iaW5hcnlOYW1lLAogICAgICB0aGlzLnJocywKICAgICAgdGhpcy5zZXR0ZXIsCiAgICAgIHt0aGlzLnJlYWRPbmx5UmVjZWl2ZXIsCiAgICAgIHRoaXMuZm9yRWZmZWN0LAogICAgICB0aGlzLnJlYWRPZmZzZXQsCiAgICAgIHRoaXMuYmluYXJ5T2Zmc2V0LAogICAgICB0aGlzLndyaXRlT2Zmc2V0fSkKICAgICAgOiBhc3NlcnQocmVhZE9ubHlSZWNlaXZlciAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWFkT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChiaW5hcnlPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHdyaXRlT2Zmc2V0ICE9IG51bGwpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgcmhzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29tcG91bmRFeHRlbnNpb25TZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PgogICAgICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkNvbXBvdW5kRXh0ZW5zaW9uU2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgcmhzPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocmhzICE9IG51bGwpIHsKICAgICAgcmhzID0gcmhzLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJocz8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhbiBjb21wb3VuZCBwcm9wZXJ0eSBhc3NpZ25tZW50LgovLy8KLy8vIEFuIGNvbXBvdW5kIHByb3BlcnR5IGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0KLy8vCi8vLyAgICAgcmVjZWl2ZXIucHJvcGVydHlOYW1lICs9IHJocwovLy8KLy8vIGlzIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUucHJvcGVydHlOYW1lID0gcmVjZWl2ZXJWYXJpYWJsZS5wcm9wZXJ0eU5hbWUgKyByaHMKLy8vCmNsYXNzIENvbXBvdW5kUHJvcGVydHlTZXQgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgcmVjZWl2ZXIgdXNlZCBmb3IgdGhlIHJlYWQvd3JpdGUgb3BlcmF0aW9ucy4KICBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFjY2Vzc2VkIGJ5IHRoZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCiAgZmluYWwgTmFtZSBwcm9wZXJ0eU5hbWU7CgogIC8vLyBUaGUgYmluYXJ5IG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGdldHRlciByZXN1bHQgYW5kIFtyaHNdLgogIGZpbmFsIE5hbWUgYmluYXJ5TmFtZTsKCiAgLy8vIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGJpbmFyeSBvcGVyYXRpb24uCiAgRXhwcmVzc2lvbiByaHM7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoZSBleHByZXNzaW9uIGlzIG9ubHkgbmVlZCBmb3IgZWZmZWN0IGFuZCBub3QgZm9yIGl0cyB2YWx1ZS4KICBmaW5hbCBib29sIGZvckVmZmVjdDsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIHJlY2VpdmVyIGlzIHJlYWQtb25seSBhbmQgdGhlcmVmb3JlIGRvZXNuJ3QgbmVlZCBhCiAgLy8vIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uLgogIGZpbmFsIGludCByZWFkT2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgYmluYXJ5IG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgYmluYXJ5T2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uLgogIGZpbmFsIGludCB3cml0ZU9mZnNldDsKCiAgQ29tcG91bmRQcm9wZXJ0eVNldCgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy5wcm9wZXJ0eU5hbWUsIHRoaXMuYmluYXJ5TmFtZSwgdGhpcy5yaHMsCiAgICAgIHt0aGlzLmZvckVmZmVjdCwKICAgICAgdGhpcy5yZWFkT25seVJlY2VpdmVyLAogICAgICB0aGlzLnJlYWRPZmZzZXQsCiAgICAgIHRoaXMuYmluYXJ5T2Zmc2V0LAogICAgICB0aGlzLndyaXRlT2Zmc2V0fSkKICAgICAgOiBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWFkT25seVJlY2VpdmVyICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWFkT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChiaW5hcnlPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHdyaXRlT2Zmc2V0ICE9IG51bGwpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgcmhzPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29tcG91bmRQcm9wZXJ0eVNldCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuQ29tcG91bmRQcm9wZXJ0eVNldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIHJocz8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHJocyAhPSBudWxsKSB7CiAgICAgIHJocyA9IHJocy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByaHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gY29tcG91bmQgcHJvcGVydHkgYXNzaWdubWVudC4KLy8vCi8vLyBBbiBjb21wb3VuZCBwcm9wZXJ0eSBhc3NpZ25tZW50IG9mIHRoZSBmb3JtIGBvLmErK2AgaXMgZW5jb2RlZCBhcyB0aGUKLy8vIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IG8gaW4gbGV0IHYyID0gdjEuYSBpbiBsZXQgdjMgPSB2MS5hID0gdjIgKyAxIGluIHYyCi8vLwpjbGFzcyBQcm9wZXJ0eVBvc3RJbmNEZWMgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgc3ludGhldGljIHZhcmlhYmxlIHdob3NlIGluaXRpYWxpemVyIGhvbGQgdGhlIHJlY2VpdmVyLgogIC8vLwogIC8vLyBUaGlzIGlzIGBudWxsYCBpZiB0aGUgcmVjZWl2ZXIgaXMgcmVhZC1vbmx5IGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgbmVlZCB0bwogIC8vLyBiZSBzdG9yZWQgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgcmVhZHMgdGhlIHByb3BlcnR5IG9uIFt2YXJpYWJsZV0uCiAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFkOwoKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCB3cml0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgYmluYXJ5IG9wZXJhdGlvbiB0byB0aGUKICAvLy8gcHJvcGVydHkgb24gW3ZhcmlhYmxlXS4KICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlOwoKICBQcm9wZXJ0eVBvc3RJbmNEZWModGhpcy52YXJpYWJsZSwgdGhpcy5yZWFkLCB0aGlzLndyaXRlKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIHJlYWQ/LnBhcmVudCA9IHRoaXM7CiAgICB3cml0ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIFByb3BlcnR5UG9zdEluY0RlYy5vblJlYWRPbmx5KAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWQsIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGUpCiAgICAgIDogdGhpcyhudWxsLCByZWFkLCB3cml0ZSk7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFByb3BlcnR5UG9zdEluY0RlYyh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuUHJvcGVydHlQb3N0SW5jRGVjOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgcmVhZD8uYWNjZXB0KHYpOwogICAgd3JpdGU/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh3cml0ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlID0gd3JpdGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgd3JpdGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gbG9jYWwgdmFyaWFibGUgcG9zdCBpbmMvZGVjIGV4cHJlc3Npb24uCi8vLwovLy8gQW4gbG9jYWwgdmFyaWFibGUgcG9zdCBpbmMvZGVjIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYGErK2AgaXMgZW5jb2RlZCBhcwovLy8gdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IGEgaW4gbGV0IHYyID0gYSA9IHYxICsgMSBpbiB2MQovLy8KY2xhc3MgTG9jYWxQb3N0SW5jRGVjIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgbG9jYWwgdmFyaWFibGUuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFkOwoKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCB3cml0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgYmluYXJ5IG9wZXJhdGlvbiB0byB0aGUKICAvLy8gbG9jYWwgdmFyaWFibGUuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiB3cml0ZTsKCiAgTG9jYWxQb3N0SW5jRGVjKHRoaXMucmVhZCwgdGhpcy53cml0ZSkgewogICAgcmVhZD8ucGFyZW50ID0gdGhpczsKICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TG9jYWxQb3N0SW5jRGVjKHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5Mb2NhbFBvc3RJbmNEZWM7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIHJlYWQ/LmFjY2VwdCh2KTsKICAgIHdyaXRlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWFkICE9IG51bGwpIHsKICAgICAgcmVhZCA9IHJlYWQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVhZD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh3cml0ZSAhPSBudWxsKSB7CiAgICAgIHdyaXRlID0gd3JpdGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgd3JpdGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gc3RhdGljIG1lbWJlciBwb3N0IGluYy9kZWMgZXhwcmVzc2lvbi4KLy8vCi8vLyBBbiBsb2NhbCB2YXJpYWJsZSBwb3N0IGluYy9kZWMgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgYSsrYCBpcyBlbmNvZGVkIGFzCi8vLyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYxID0gYSBpbiBsZXQgdjIgPSBhID0gdjEgKyAxIGluIHYxCi8vLwpjbGFzcyBTdGF0aWNQb3N0SW5jRGVjIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgc3RhdGljIG1lbWJlci4KICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWQ7CgogIC8vLyBUaGUgZXhwcmVzc2lvbiB0aGF0IHdyaXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHRvIHRoZQogIC8vLyBzdGF0aWMgbWVtYmVyLgogIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGU7CgogIFN0YXRpY1Bvc3RJbmNEZWModGhpcy5yZWFkLCB0aGlzLndyaXRlKSB7CiAgICByZWFkPy5wYXJlbnQgPSB0aGlzOwogICAgd3JpdGU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdGF0aWNQb3N0SW5jRGVjKHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5TdGF0aWNQb3N0SW5jRGVjOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWFkPy5hY2NlcHQodik7CiAgICB3cml0ZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVhZCAhPSBudWxsKSB7CiAgICAgIHJlYWQgPSByZWFkLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlYWQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAod3JpdGUgIT0gbnVsbCkgewogICAgICB3cml0ZSA9IHdyaXRlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIHN0YXRpYyBtZW1iZXIgcG9zdCBpbmMvZGVjIGV4cHJlc3Npb24uCi8vLwovLy8gQW4gbG9jYWwgdmFyaWFibGUgcG9zdCBpbmMvZGVjIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYHN1cGVyLmErK2AgaXMgZW5jb2RlZAovLy8gYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IHN1cGVyLmEgaW4gbGV0IHYyID0gc3VwZXIuYSA9IHYxICsgMSBpbiB2MQovLy8KY2xhc3MgU3VwZXJQb3N0SW5jRGVjIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgc3RhdGljIG1lbWJlci4KICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWQ7CgogIC8vLyBUaGUgZXhwcmVzc2lvbiB0aGF0IHdyaXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHRvIHRoZQogIC8vLyBzdGF0aWMgbWVtYmVyLgogIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGU7CgogIFN1cGVyUG9zdEluY0RlYyh0aGlzLnJlYWQsIHRoaXMud3JpdGUpIHsKICAgIHJlYWQ/LnBhcmVudCA9IHRoaXM7CiAgICB3cml0ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdFN1cGVyUG9zdEluY0RlYyh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuU3VwZXJQb3N0SW5jRGVjOwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWFkPy5hY2NlcHQodik7CiAgICB3cml0ZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVhZCAhPSBudWxsKSB7CiAgICAgIHJlYWQgPSByZWFkLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlYWQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAod3JpdGUgIT0gbnVsbCkgewogICAgICB3cml0ZSA9IHdyaXRlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHdyaXRlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIGluZGV4IGdldCBleHByZXNzaW9uLgpjbGFzcyBJbmRleEdldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSByZWNlaXZlciBvbiB3aGljaCB0aGUgaW5kZXggc2V0IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBpbmRleCBleHByZXNzaW9uIG9mIHRoZSBvcGVyYXRpb24uCiAgRXhwcmVzc2lvbiBpbmRleDsKCiAgSW5kZXhHZXQodGhpcy5yZWNlaXZlciwgdGhpcy5pbmRleCkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEluZGV4R2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5JbmRleEdldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIGluZGV4Py5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBpbmRleCA9IGluZGV4LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIGluZGV4IHNldCBleHByZXNzaW9uLgovLy8KLy8vIEFuIGluZGV4IHNldCBleHByZXNzaW9uIG9mIHRoZSBmb3JtIGBvW2FdID0gYmAgdXNlZCBmb3IgdmFsdWUgaXMgZW5jb2RlZCBhcwovLy8gdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IG8gaW4gbGV0IHYyID0gYSBpbiBsZXQgdjMgPSBiIGluIGxldCBfID0gby5bXT0odjIsIHYzKSBpbiB2MwovLy8KLy8vIEFuIGluZGV4IHNldCBleHByZXNzaW9uIHVzZWQgZm9yIGVmZmVjdCBpcyBlbmNvZGVkIGFzCi8vLwovLy8gICAgby5bXT0oYSwgYikKLy8vCi8vLyB1c2luZyBbTWV0aG9kSW52b2NhdGlvbkltcGxdLgovLy8KY2xhc3MgSW5kZXhTZXQgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgcmVjZWl2ZXIgb24gd2hpY2ggdGhlIGluZGV4IHNldCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBUaGUgaW5kZXggZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgdmFsdWUgZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gdmFsdWU7CgogIGZpbmFsIGJvb2wgZm9yRWZmZWN0OwoKICBmaW5hbCBib29sIHJlYWRPbmx5UmVjZWl2ZXI7CgogIEluZGV4U2V0KHRoaXMucmVjZWl2ZXIsIHRoaXMuaW5kZXgsIHRoaXMudmFsdWUsCiAgICAgIHt0aGlzLmZvckVmZmVjdCwgdGhpcy5yZWFkT25seVJlY2VpdmVyfSkKICAgICAgOiBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWFkT25seVJlY2VpdmVyICE9IG51bGwpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgaW5kZXg/LnBhcmVudCA9IHRoaXM7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEluZGV4U2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5JbmRleFNldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIGluZGV4Py5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGluZGV4ICE9IG51bGwpIHsKICAgICAgaW5kZXggPSBpbmRleC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSAgc3VwZXIgaW5kZXggc2V0IGV4cHJlc3Npb24uCi8vLwovLy8gQSBzdXBlciBpbmRleCBzZXQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgc3VwZXJbYV0gPSBiYCB1c2VkIGZvciB2YWx1ZSBpcwovLy8gZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYxID0gYSBpbiBsZXQgdjIgPSBiIGluIGxldCBfID0gc3VwZXIuW109KHYxLCB2MikgaW4gdjIKLy8vCi8vLyBBbiBpbmRleCBzZXQgZXhwcmVzc2lvbiB1c2VkIGZvciBlZmZlY3QgaXMgZW5jb2RlZCBhcwovLy8KLy8vICAgIHN1cGVyLltdPShhLCBiKQovLy8KLy8vIHVzaW5nIFtTdXBlck1ldGhvZEludm9jYXRpb25dLgovLy8KY2xhc3MgU3VwZXJJbmRleFNldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSBbXT0gbWVtYmVyLgogIE1lbWJlciBzZXR0ZXI7CgogIC8vLyBUaGUgaW5kZXggZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgdmFsdWUgZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gdmFsdWU7CgogIFN1cGVySW5kZXhTZXQodGhpcy5zZXR0ZXIsIHRoaXMuaW5kZXgsIHRoaXMudmFsdWUpIHsKICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdXBlckluZGV4U2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5TdXBlckluZGV4U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICBpbmRleD8uYWNjZXB0KHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGluZGV4ICE9IG51bGwpIHsKICAgICAgaW5kZXggPSBpbmRleC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gZXh0ZW5zaW9uIGluZGV4IHNldCBleHByZXNzaW9uLgovLy8KLy8vIEFuIGV4dGVuc2lvbiBpbmRleCBzZXQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgRXh0ZW5zaW9uKG8pW2FdID0gYmAgdXNlZAovLy8gZm9yIHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gbwovLy8gICAgIGxldCBpbmRleFZhcmlhYmxlID0gYSBpbgovLy8gICAgIGxldCB2YWx1ZVZhcmlhYmxlID0gYiBpbiAnCi8vLyAgICAgbGV0IHdyaXRlVmFyaWFibGUgPQovLy8gICAgICAgICByZWNlaXZlclZhcmlhYmxlLltdPShpbmRleFZhcmlhYmxlLCB2YWx1ZVZhcmlhYmxlKSBpbgovLy8gICAgICAgICAgIHZhbHVlVmFyaWFibGUKLy8vCi8vLyBBbiBleHRlbnNpb24gaW5kZXggc2V0IGV4cHJlc3Npb24gdXNlZCBmb3IgZWZmZWN0IGlzIGVuY29kZWQgYXMKLy8vCi8vLyAgICBvLltdPShhLCBiKQovLy8KLy8vIHVzaW5nIFtTdGF0aWNJbnZvY2F0aW9uXS4KLy8vCmNsYXNzIEV4dGVuc2lvbkluZGV4U2V0IGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIGV4dGVuc2lvbiBpbiB3aGljaCB0aGUgW3NldHRlcl0gaXMgZGVjbGFyZWQuCiAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbjsKCiAgLy8vIFRoZSBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cyBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBpbgogIC8vLyBbZXh0ZW5zaW9uXS4KICBmaW5hbCBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHM7CgogIC8vLyBUaGUgcmVjZWl2ZXIgb2YgdGhlIGV4dGVuc2lvbiBhY2Nlc3MuCiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBbXT0gbWVtYmVyLgogIE1lbWJlciBzZXR0ZXI7CgogIC8vLyBUaGUgaW5kZXggZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgdmFsdWUgZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gdmFsdWU7CgogIEV4dGVuc2lvbkluZGV4U2V0KHRoaXMuZXh0ZW5zaW9uLCB0aGlzLmV4cGxpY2l0VHlwZUFyZ3VtZW50cywgdGhpcy5yZWNlaXZlciwKICAgICAgdGhpcy5zZXR0ZXIsIHRoaXMuaW5kZXgsIHRoaXMudmFsdWUpCiAgICAgIDogYXNzZXJ0KGV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9PSBudWxsIHx8CiAgICAgICAgICAgIGV4cGxpY2l0VHlwZUFyZ3VtZW50cy5sZW5ndGggPT0gZXh0ZW5zaW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RXh0ZW5zaW9uSW5kZXhTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkV4dGVuc2lvbkluZGV4U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgaW5kZXg/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBpbmRleCA9IGluZGV4LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhbiBpZi1udWxsIGluZGV4IGFzc2lnbm1lbnQuCi8vLwovLy8gQW4gaWYtbnVsbCBpbmRleCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtIGBvW2FdID8/PSBiYCBpcywgaWYgdXNlZCBmb3IgdmFsdWUsCi8vLyBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdjEgPSBvIGluCi8vLyAgICAgbGV0IHYyID0gYSBpbgovLy8gICAgIGxldCB2MyA9IHYxW3YyXSBpbgovLy8gICAgICAgdjMgPT0gbnVsbAovLy8gICAgICAgID8gKGxldCB2NCA9IGIgaW4KLy8vICAgICAgICAgICBsZXQgXyA9IHYxLltdPSh2MiwgdjQpIGluCi8vLyAgICAgICAgICAgdjQpCi8vLyAgICAgICAgOiB2MwovLy8KLy8vIGFuZCwgaWYgdXNlZCBmb3IgZWZmZWN0LCBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdjEgPSBvIGluCi8vLyAgICAgbGV0IHYyID0gYSBpbgovLy8gICAgIGxldCB2MyA9IHYxW3YyXSBpbgovLy8gICAgICAgIHYzID09IG51bGwgPyB2MS5bXT0odjIsIGIpIDogbnVsbAovLy8KLy8vIElmIHRoZSBbcmVhZE9ubHlSZWNlaXZlcl0gaXMgdHJ1ZSwgbm8gdGVtcG9yYXJ5IHZhcmlhYmxlIGlzIGNyZWF0ZWQgZm9yIHRoZQovLy8gcmVjZWl2ZXIgYW5kIGl0cyB1c2UgaXMgaW5saW5lZC4KY2xhc3MgSWZOdWxsSW5kZXhTZXQgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgcmVjZWl2ZXIgb24gd2hpY2ggdGhlIGluZGV4IHNldCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBUaGUgaW5kZXggZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgdmFsdWUgZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gdmFsdWU7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHJlYWRPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSA9PSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHRlc3RPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXT0gb3BlcmF0aW9uLgogIGZpbmFsIGludCB3cml0ZU9mZnNldDsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIGV4cHJlc3Npb24gaXMgb25seSBuZWVkIGZvciBlZmZlY3QgYW5kIG5vdCBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgZm9yRWZmZWN0OwoKICAvLy8gSWYgYHRydWVgLCB0aGUgcmVjZWl2ZXIgaXMgcmVhZC1vbmx5IGFuZCB0aGVyZWZvcmUgZG9lc24ndCBuZWVkIGEKICAvLy8gdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCByZWFkT25seVJlY2VpdmVyOwoKICBJZk51bGxJbmRleFNldCh0aGlzLnJlY2VpdmVyLCB0aGlzLmluZGV4LCB0aGlzLnZhbHVlLAogICAgICB7dGhpcy5yZWFkT2Zmc2V0LAogICAgICB0aGlzLnRlc3RPZmZzZXQsCiAgICAgIHRoaXMud3JpdGVPZmZzZXQsCiAgICAgIHRoaXMuZm9yRWZmZWN0LAogICAgICB0aGlzLnJlYWRPbmx5UmVjZWl2ZXI6IGZhbHNlfSkKICAgICAgOiBhc3NlcnQocmVhZE9mZnNldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQodGVzdE9mZnNldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQod3JpdGVPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KGZvckVmZmVjdCAhPSBudWxsKSB7CiAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJZk51bGxJbmRleFNldCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuSWZOdWxsSW5kZXhTZXQ7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIHJlY2VpdmVyPy5hY2NlcHQodik7CiAgICBpbmRleD8uYWNjZXB0KHYpOwogICAgdmFsdWU/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHJlY2VpdmVyICE9IG51bGwpIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByZWNlaXZlcj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChpbmRleCAhPSBudWxsKSB7CiAgICAgIGluZGV4ID0gaW5kZXguYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgaW5kZXg/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIGlmLW51bGwgc3VwZXIgaW5kZXggc2V0IGV4cHJlc3Npb24uCi8vLwovLy8gQW4gaWYtbnVsbCBzdXBlciBpbmRleCBzZXQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgc3VwZXJbYV0gPz89IGJgIGlzLCBpZgovLy8gdXNlZCBmb3IgdmFsdWUsIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IGEgaW4KLy8vICAgICBsZXQgdjIgPSBzdXBlci5bXSh2MSkgaW4KLy8vICAgICAgIHYyID09IG51bGwKLy8vICAgICAgICA/IChsZXQgdjMgPSBiIGluCi8vLyAgICAgICAgICAgbGV0IF8gPSBzdXBlci5bXT0odjEsIHYzKSBpbgovLy8gICAgICAgICAgIHYzKQovLy8gICAgICAgIDogdjIKLy8vCi8vLyBhbmQsIGlmIHVzZWQgZm9yIGVmZmVjdCwgZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYxID0gYSBpbgovLy8gICAgIGxldCB2MiA9IHN1cGVyLltdKHYxKSBpbgovLy8gICAgICAgIHYyID09IG51bGwgPyBzdXBlci5bXT0odjEsIGIpIDogbnVsbAovLy8KY2xhc3MgSWZOdWxsU3VwZXJJbmRleFNldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSBbXSBtZW1iZXI7CiAgTWVtYmVyIGdldHRlcjsKCiAgLy8vIFRoZSBbXT0gbWVtYmVyOwogIE1lbWJlciBzZXR0ZXI7CgogIC8vLyBUaGUgaW5kZXggZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgdmFsdWUgZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gdmFsdWU7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHJlYWRPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSA9PSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHRlc3RPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXT0gb3BlcmF0aW9uLgogIGZpbmFsIGludCB3cml0ZU9mZnNldDsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIGV4cHJlc3Npb24gaXMgb25seSBuZWVkIGZvciBlZmZlY3QgYW5kIG5vdCBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgZm9yRWZmZWN0OwoKICBJZk51bGxTdXBlckluZGV4U2V0KHRoaXMuZ2V0dGVyLCB0aGlzLnNldHRlciwgdGhpcy5pbmRleCwgdGhpcy52YWx1ZSwKICAgICAge3RoaXMucmVhZE9mZnNldCwgdGhpcy50ZXN0T2Zmc2V0LCB0aGlzLndyaXRlT2Zmc2V0LCB0aGlzLmZvckVmZmVjdH0pCiAgICAgIDogYXNzZXJ0KHJlYWRPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHRlc3RPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHdyaXRlT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChmb3JFZmZlY3QgIT0gbnVsbCkgewogICAgaW5kZXg/LnBhcmVudCA9IHRoaXM7CiAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdElmTnVsbFN1cGVySW5kZXhTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLklmTnVsbFN1cGVySW5kZXhTZXQ7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIGluZGV4Py5hY2NlcHQodik7CiAgICB2YWx1ZT8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBpbmRleCA9IGluZGV4LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhbiBpZi1udWxsIHN1cGVyIGluZGV4IHNldCBleHByZXNzaW9uLgovLy8KLy8vIEFuIGlmLW51bGwgc3VwZXIgaW5kZXggc2V0IGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYHN1cGVyW2FdID8/PSBiYCBpcywgaWYKLy8vIHVzZWQgZm9yIHZhbHVlLCBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgdjEgPSBhIGluCi8vLyAgICAgbGV0IHYyID0gc3VwZXIuW10odjEpIGluCi8vLyAgICAgICB2MiA9PSBudWxsCi8vLyAgICAgICAgPyAobGV0IHYzID0gYiBpbgovLy8gICAgICAgICAgIGxldCBfID0gc3VwZXIuW109KHYxLCB2MykgaW4KLy8vICAgICAgICAgICB2MykKLy8vICAgICAgICA6IHYyCi8vLwovLy8gYW5kLCBpZiB1c2VkIGZvciBlZmZlY3QsIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IGEgaW4KLy8vICAgICBsZXQgdjIgPSBzdXBlci5bXSh2MSkgaW4KLy8vICAgICAgICB2MiA9PSBudWxsID8gc3VwZXIuW109KHYxLCBiKSA6IG51bGwKLy8vCmNsYXNzIElmTnVsbEV4dGVuc2lvbkluZGV4U2V0IGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICBmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uOwoKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHM7CgogIC8vLyBUaGUgZXh0ZW5zaW9uIHJlY2VpdmVyOwogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBUaGUgW10gbWVtYmVyOwogIE1lbWJlciBnZXR0ZXI7CgogIC8vLyBUaGUgW109IG1lbWJlcjsKICBNZW1iZXIgc2V0dGVyOwoKICAvLy8gVGhlIGluZGV4IGV4cHJlc3Npb24gb2YgdGhlIG9wZXJhdGlvbi4KICBFeHByZXNzaW9uIGluZGV4OwoKICAvLy8gVGhlIHZhbHVlIGV4cHJlc3Npb24gb2YgdGhlIG9wZXJhdGlvbi4KICBFeHByZXNzaW9uIHZhbHVlOwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgW10gb3BlcmF0aW9uLgogIGZpbmFsIGludCByZWFkT2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgPT0gb3BlcmF0aW9uLgogIGZpbmFsIGludCB0ZXN0T2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgW109IG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgd3JpdGVPZmZzZXQ7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoZSBleHByZXNzaW9uIGlzIG9ubHkgbmVlZCBmb3IgZWZmZWN0IGFuZCBub3QgZm9yIGl0cyB2YWx1ZS4KICBmaW5hbCBib29sIGZvckVmZmVjdDsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIHJlY2VpdmVyIGlzIHJlYWQtb25seSBhbmQgdGhlcmVmb3JlIGRvZXNuJ3QgbmVlZCBhCiAgLy8vIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKCiAgSWZOdWxsRXh0ZW5zaW9uSW5kZXhTZXQodGhpcy5leHRlbnNpb24sIHRoaXMuZXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLnJlY2VpdmVyLCB0aGlzLmdldHRlciwgdGhpcy5zZXR0ZXIsIHRoaXMuaW5kZXgsIHRoaXMudmFsdWUsCiAgICAgIHt0aGlzLnJlYWRPZmZzZXQsCiAgICAgIHRoaXMudGVzdE9mZnNldCwKICAgICAgdGhpcy53cml0ZU9mZnNldCwKICAgICAgdGhpcy5mb3JFZmZlY3QsCiAgICAgIHRoaXMucmVhZE9ubHlSZWNlaXZlcn0pCiAgICAgIDogYXNzZXJ0KGV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9PSBudWxsIHx8CiAgICAgICAgICAgIGV4cGxpY2l0VHlwZUFyZ3VtZW50cy5sZW5ndGggPT0gZXh0ZW5zaW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCksCiAgICAgICAgYXNzZXJ0KHJlYWRPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHRlc3RPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHdyaXRlT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChmb3JFZmZlY3QgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHJlYWRPbmx5UmVjZWl2ZXIgIT0gbnVsbCkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SWZOdWxsRXh0ZW5zaW9uSW5kZXhTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PgogICAgICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLklmTnVsbEV4dGVuc2lvbkluZGV4U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgaW5kZXg/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBpbmRleCA9IGluZGV4LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YWx1ZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIGNvbXBvdW5kIGluZGV4IGFzc2lnbm1lbnQuCi8vLwovLy8gQW4gaWYtbnVsbCBpbmRleCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtIGBvW2FdICs9IGJgIGlzLCBpZiB1c2VkIGZvciB2YWx1ZSwKLy8vIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IG8gaW4KLy8vICAgICBsZXQgdjIgPSBhIGluCi8vLyAgICAgbGV0IHYzID0gdjEuW10odjIpICsgYgovLy8gICAgIGxldCB2NCA9IHYxLltdPSh2MiwgYzMpIGluIHYzCi8vLwovLy8gYW5kLCBpZiB1c2VkIGZvciBlZmZlY3QsIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IG8gaW4gbGV0IHYyID0gYSBpbiB2MS5bXT0odjIsIHYxLltdKHYyKSArIGIpCi8vLwpjbGFzcyBDb21wb3VuZEluZGV4U2V0IGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIHJlY2VpdmVyIG9uIHdoaWNoIHRoZSBpbmRleCBzZXQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KICBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICAvLy8gVGhlIGluZGV4IGV4cHJlc3Npb24gb2YgdGhlIG9wZXJhdGlvbi4KICBFeHByZXNzaW9uIGluZGV4OwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGJpbmFyeSBvcGVyYXRpb24uCiAgTmFtZSBiaW5hcnlOYW1lOwoKICAvLy8gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgYmluYXJ5IGV4cHJlc3Npb24uCiAgRXhwcmVzc2lvbiByaHM7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHJlYWRPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXT0gb3BlcmF0aW9uLgogIGZpbmFsIGludCB3cml0ZU9mZnNldDsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGJpbmFyeSBvcGVyYXRpb24uCiAgZmluYWwgaW50IGJpbmFyeU9mZnNldDsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIGV4cHJlc3Npb24gaXMgb25seSBuZWVkIGZvciBlZmZlY3QgYW5kIG5vdCBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgZm9yRWZmZWN0OwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBhIHBvc3QtZml4IGluYy9kZWMgZXhwcmVzc2lvbi4KICBmaW5hbCBib29sIGZvclBvc3RJbmNEZWM7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoZSByZWNlaXZlciBpcyByZWFkLW9ubHkgYW5kIHRoZXJlZm9yZSBkb2Vzbid0IG5lZWQgYQogIC8vLyB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIGl0cyB2YWx1ZS4KICBmaW5hbCBib29sIHJlYWRPbmx5UmVjZWl2ZXI7CgogIENvbXBvdW5kSW5kZXhTZXQodGhpcy5yZWNlaXZlciwgdGhpcy5pbmRleCwgdGhpcy5iaW5hcnlOYW1lLCB0aGlzLnJocywKICAgICAge3RoaXMucmVhZE9mZnNldCwKICAgICAgdGhpcy5iaW5hcnlPZmZzZXQsCiAgICAgIHRoaXMud3JpdGVPZmZzZXQsCiAgICAgIHRoaXMuZm9yRWZmZWN0LAogICAgICB0aGlzLmZvclBvc3RJbmNEZWMsCiAgICAgIHRoaXMucmVhZE9ubHlSZWNlaXZlcjogZmFsc2V9KQogICAgICA6IGFzc2VydChmb3JFZmZlY3QgIT0gbnVsbCkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIHJocz8ucGFyZW50ID0gdGhpczsKICAgIGZpbGVPZmZzZXQgPSBiaW5hcnlPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb21wb3VuZEluZGV4U2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4gSW50ZXJuYWxFeHByZXNzaW9uS2luZC5Db21wb3VuZEluZGV4U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgaW5kZXg/LmFjY2VwdCh2KTsKICAgIHJocz8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGluZGV4ICE9IG51bGwpIHsKICAgICAgaW5kZXggPSBpbmRleC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChyaHMgIT0gbnVsbCkgewogICAgICByaHMgPSByaHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmhzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgbnVsbC1hd2FyZSBjb21wb3VuZCBhc3NpZ25tZW50LgovLy8KLy8vIEEgbnVsbC1hd2FyZSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtCi8vLwovLy8gICAgIHJlY2VpdmVyPy5wcm9wZXJ0eSBiaW5hcnlOYW1lPSByaHMKLy8vCi8vLyBpcywgaWYgdXNlZCBmb3IgdmFsdWUgYXMgYSBub3JtYWwgY29tcG91bmQgb3IgcHJlZml4IG9wZXJhdGlvbiwgZW5jb2RlZCBhcwovLy8gdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUgPT0gbnVsbCA/IG51bGwgOgovLy8gICAgICAgICBsZXQgbGVmdFZhcmlhYmxlID0gcmVjZWl2ZXJWYXJpYWJsZS5wcm9wZXJ0eU5hbWUgaW4KLy8vICAgICAgICAgICBsZXQgdmFsdWVWYXJpYWJsZSA9IGxlZnRWYXJpYWJsZSBiaW5hcnlOYW1lIHJocyBpbgovLy8gICAgICAgICAgICAgbGV0IHdyaXRlVmFyaWFibGUgPQovLy8gICAgICAgICAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUucHJvcGVydHlOYW1lID0gdmFsdWVWYXJpYWJsZSBpbgovLy8gICAgICAgICAgICAgICB2YWx1ZVZhcmlhYmxlCi8vLwovLy8gYW5kLCBpZiB1c2VkIGZvciB2YWx1ZSBhcyBhIHBvc3RmaXggb3BlcmF0aW9uLCBlbmNvZGVkIGFzCi8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUgPT0gbnVsbCA/IG51bGwgOgovLy8gICAgICAgICBsZXQgbGVmdFZhcmlhYmxlID0gcmVjZWl2ZXJWYXJpYWJsZS5wcm9wZXJ0eU5hbWUgaW4KLy8vICAgICAgICAgICBsZXQgd3JpdGVWYXJpYWJsZSA9Ci8vLyAgICAgICAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUucHJvcGVydHlOYW1lID0KLy8vICAgICAgICAgICAgICAgICAgIGxlZnRWYXJpYWJsZSBiaW5hcnlOYW1lIHJocyBpbgovLy8gICAgICAgICAgICAgbGVmdFZhcmlhYmxlCi8vLwovLy8gYW5kLCBpZiB1c2VkIGZvciBlZmZlY3QsIGVuY29kZWQgYXM6Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUgPT0gbnVsbCA/IG51bGwgOgovLy8gICAgICAgICByZWNlaXZlclZhcmlhYmxlLnByb3BlcnR5TmFtZSA9IHJlY2VpdmVyVmFyaWFibGUucHJvcGVydHlOYW1lICsgcmhzCi8vLwpjbGFzcyBOdWxsQXdhcmVDb21wb3VuZFNldCBleHRlbmRzIEludGVybmFsRXhwcmVzc2lvbiB7CiAgLy8vIFRoZSByZWNlaXZlciBvbiB3aGljaCB0aGUgbnVsbCBhd2FyZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgogIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgbnVsbC1hd2FyZSBwcm9wZXJ0eS4KICBOYW1lIHByb3BlcnR5TmFtZTsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBiaW5hcnkgb3BlcmF0aW9uLgogIE5hbWUgYmluYXJ5TmFtZTsKCiAgLy8vIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGJpbmFyeSBleHByZXNzaW9uLgogIEV4cHJlc3Npb24gcmhzOwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgcmVhZCBvcGVyYXRpb24uCiAgZmluYWwgaW50IHJlYWRPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHdyaXRlT2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgYmluYXJ5IG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgYmluYXJ5T2Zmc2V0OwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBvbmx5IG5lZWQgZm9yIGVmZmVjdCBhbmQgbm90IGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCBmb3JFZmZlY3Q7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoZSBleHByZXNzaW9uIGlzIGEgcG9zdGZpeCBpbmMvZGVjIGV4cHJlc3Npb24uCiAgZmluYWwgYm9vbCBmb3JQb3N0SW5jRGVjOwoKICBOdWxsQXdhcmVDb21wb3VuZFNldCgKICAgICAgdGhpcy5yZWNlaXZlciwgdGhpcy5wcm9wZXJ0eU5hbWUsIHRoaXMuYmluYXJ5TmFtZSwgdGhpcy5yaHMsCiAgICAgIHt0aGlzLnJlYWRPZmZzZXQsCiAgICAgIHRoaXMuYmluYXJ5T2Zmc2V0LAogICAgICB0aGlzLndyaXRlT2Zmc2V0LAogICAgICB0aGlzLmZvckVmZmVjdCwKICAgICAgdGhpcy5mb3JQb3N0SW5jRGVjfSkKICAgICAgOiBhc3NlcnQocmVhZE9mZnNldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoYmluYXJ5T2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydCh3cml0ZU9mZnNldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChmb3JQb3N0SW5jRGVjICE9IG51bGwpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgcmhzPy5wYXJlbnQgPSB0aGlzOwogICAgZmlsZU9mZnNldCA9IGJpbmFyeU9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdE51bGxBd2FyZUNvbXBvdW5kU2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4KICAgICAgSW50ZXJuYWxFeHByZXNzaW9uS2luZC5OdWxsQXdhcmVDb21wb3VuZFNldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIHJocz8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHJocyAhPSBudWxsKSB7CiAgICAgIHJocyA9IHJocy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByaHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gbnVsbC1hd2FyZSBpZi1udWxsIHByb3BlcnR5IHNldC4KLy8vCi8vLyBBIG51bGwtYXdhcmUgaWYtbnVsbCBwcm9wZXJ0eSBzZXQgb2YgdGhlIGZvcm0KLy8vCi8vLyAgICByZWNlaXZlcj8ubmFtZSA/Pz0gdmFsdWUKLy8vCi8vLyBpcywgaWYgdXNlZCBmb3IgdmFsdWUsIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUgPT0gbnVsbCA/IG51bGwgOgovLy8gICAgICAgICAobGV0IHJlYWRWYXJpYWJsZSA9IHJlY2VpdmVyVmFyaWFibGUubmFtZSBpbgovLy8gICAgICAgICAgIHJlYWRWYXJpYWJsZSA9PSBudWxsID8KLy8vICAgICAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUubmFtZSA9IHZhbHVlIDogcmVhZFZhcmlhYmxlKQovLy8KLy8vIGFuZCwgaWYgdXNlZCBmb3IgZWZmZWN0LCBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IHJlY2VpdmVyIGluCi8vLyAgICAgICByZWNlaXZlclZhcmlhYmxlID09IG51bGwgPyBudWxsIDoKLy8vICAgICAgICAgKHJlY2VpdmVyVmFyaWFibGUubmFtZSA9PSBudWxsID8KLy8vICAgICAgICAgICByZWNlaXZlclZhcmlhYmxlLm5hbWUgPSB2YWx1ZSA6IG51bGwpCi8vLwovLy8KY2xhc3MgTnVsbEF3YXJlSWZOdWxsU2V0IGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICAvLy8gVGhlIHN5bnRoZXRpYyB2YXJpYWJsZSB3aG9zZSBpbml0aWFsaXplciBob2xkIHRoZSByZWNlaXZlci4KICBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICAvLy8gVGhlIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgcHJvcGVydHkgZnJvbSBbdmFyaWFibGVdLgogIE5hbWUgbmFtZTsKCiAgLy8vIFRoZSBleHByZXNzaW9uIHRoYXQgd3JpdGVzIHRoZSB2YWx1ZSB0byB0aGUgcHJvcGVydHkgb24gW3ZhcmlhYmxlXS4KICBFeHByZXNzaW9uIHZhbHVlOwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgcmVhZCBvcGVyYXRpb24uCiAgZmluYWwgaW50IHJlYWRPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHdyaXRlT2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgPT0gb3BlcmF0aW9uLgogIGZpbmFsIGludCB0ZXN0T2Zmc2V0OwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBvbmx5IG5lZWQgZm9yIGVmZmVjdCBhbmQgbm90IGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCBmb3JFZmZlY3Q7CgogIE51bGxBd2FyZUlmTnVsbFNldCh0aGlzLnJlY2VpdmVyLCB0aGlzLm5hbWUsIHRoaXMudmFsdWUsCiAgICAgIHt0aGlzLnJlYWRPZmZzZXQsIHRoaXMud3JpdGVPZmZzZXQsIHRoaXMudGVzdE9mZnNldCwgdGhpcy5mb3JFZmZlY3R9KQogICAgICA6IGFzc2VydChyZWFkT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydCh3cml0ZU9mZnNldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQodGVzdE9mZnNldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROdWxsQXdhcmVJZk51bGxTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLk51bGxBd2FyZUlmTnVsbFNldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgY29tcG91bmQgc3VwZXIgaW5kZXggYXNzaWdubWVudC4KLy8vCi8vLyBBbiBpZi1udWxsIGluZGV4IGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gYHN1cGVyW2FdICs9IGJgIGlzLCBpZiB1c2VkIGZvcgovLy8gdmFsdWUsIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCB2MSA9IGEgaW4KLy8vICAgICBsZXQgdjIgPSBzdXBlci5bXSh2MSkgKyBiCi8vLyAgICAgbGV0IHYzID0gc3VwZXIuW109KHYxLCB2MikgaW4gdjIKLy8vCi8vLyBhbmQsIGlmIHVzZWQgZm9yIGVmZmVjdCwgZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHYxID0gYSBpbiBzdXBlci5bXT0odjIsIHN1cGVyLltdKHYyKSArIGIpCi8vLwpjbGFzcyBDb21wb3VuZFN1cGVySW5kZXhTZXQgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgW10gbWVtYmVyLgogIE1lbWJlciBnZXR0ZXI7CgogIC8vLyBUaGUgW109IG1lbWJlci4KICBNZW1iZXIgc2V0dGVyOwoKICAvLy8gVGhlIGluZGV4IGV4cHJlc3Npb24gb2YgdGhlIG9wZXJhdGlvbi4KICBFeHByZXNzaW9uIGluZGV4OwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIGJpbmFyeSBvcGVyYXRpb24uCiAgTmFtZSBiaW5hcnlOYW1lOwoKICAvLy8gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgYmluYXJ5IGV4cHJlc3Npb24uCiAgRXhwcmVzc2lvbiByaHM7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHJlYWRPZmZzZXQ7CgogIC8vLyBUaGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBbXT0gb3BlcmF0aW9uLgogIGZpbmFsIGludCB3cml0ZU9mZnNldDsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGJpbmFyeSBvcGVyYXRpb24uCiAgZmluYWwgaW50IGJpbmFyeU9mZnNldDsKCiAgLy8vIElmIGB0cnVlYCwgdGhlIGV4cHJlc3Npb24gaXMgb25seSBuZWVkIGZvciBlZmZlY3QgYW5kIG5vdCBmb3IgaXRzIHZhbHVlLgogIGZpbmFsIGJvb2wgZm9yRWZmZWN0OwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBhIHBvc3QtZml4IGluYy9kZWMgZXhwcmVzc2lvbi4KICBmaW5hbCBib29sIGZvclBvc3RJbmNEZWM7CgogIENvbXBvdW5kU3VwZXJJbmRleFNldCgKICAgICAgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyLCB0aGlzLmluZGV4LCB0aGlzLmJpbmFyeU5hbWUsIHRoaXMucmhzLAogICAgICB7dGhpcy5yZWFkT2Zmc2V0LAogICAgICB0aGlzLmJpbmFyeU9mZnNldCwKICAgICAgdGhpcy53cml0ZU9mZnNldCwKICAgICAgdGhpcy5mb3JFZmZlY3QsCiAgICAgIHRoaXMuZm9yUG9zdEluY0RlY30pCiAgICAgIDogYXNzZXJ0KGZvckVmZmVjdCAhPSBudWxsKSB7CiAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIHJocz8ucGFyZW50ID0gdGhpczsKICAgIGZpbGVPZmZzZXQgPSBiaW5hcnlPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb21wb3VuZFN1cGVySW5kZXhTZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PgogICAgICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkNvbXBvdW5kU3VwZXJJbmRleFNldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgaW5kZXg/LmFjY2VwdCh2KTsKICAgIHJocz8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBpbmRleCA9IGluZGV4LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGluZGV4Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHJocyAhPSBudWxsKSB7CiAgICAgIHJocyA9IHJocy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByaHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gSW50ZXJuYWwgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBjb21wb3VuZCBleHRlbnNpb24gaW5kZXggYXNzaWdubWVudC4KLy8vCi8vLyBBbiBjb21wb3VuZCBleHRlbnNpb24gaW5kZXggYXNzaWdubWVudCBvZiB0aGUgZm9ybSBgRXh0ZW5zaW9uKG8pW2FdICs9IGJgCi8vLyBpcywgaWYgdXNlZCBmb3IgdmFsdWUsIGVuY29kZWQgYXMgdGhlIGV4cHJlc3Npb246Ci8vLwovLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gbzsKLy8vICAgICBsZXQgaW5kZXhWYXJpYWJsZSA9IGEgaW4KLy8vICAgICBsZXQgdmFsdWVWYXJpYWJsZSA9IHJlY2VpdmVyVmFyaWFibGUuW10oaW5kZXhWYXJpYWJsZSkgKyBiCi8vLyAgICAgbGV0IHdyaXRlVmFyaWFibGUgPQovLy8gICAgICAgcmVjZWl2ZXJWYXJpYWJsZS5bXT0oaW5kZXhWYXJpYWJsZSwgdmFsdWVWYXJpYWJsZSkgaW4KLy8vICAgICAgICAgdmFsdWVWYXJpYWJsZQovLy8KLy8vIGFuZCwgaWYgdXNlZCBmb3IgZWZmZWN0LCBlbmNvZGVkIGFzIHRoZSBleHByZXNzaW9uOgovLy8KLy8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IG87Ci8vLyAgICAgbGV0IGluZGV4VmFyaWFibGUgPSBhIGluCi8vLyAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUuW109KGluZGV4VmFyaWFibGUsCi8vLyAgICAgICAgICAgICByZWNlaXZlclZhcmlhYmxlLltdKGluZGV4VmFyaWFibGUpICsgYikKLy8vCmNsYXNzIENvbXBvdW5kRXh0ZW5zaW9uSW5kZXhTZXQgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb247CgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IGV4cGxpY2l0VHlwZUFyZ3VtZW50czsKCiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBbXSBtZW1iZXIuCiAgTWVtYmVyIGdldHRlcjsKCiAgLy8vIFRoZSBbXT0gbWVtYmVyLgogIE1lbWJlciBzZXR0ZXI7CgogIC8vLyBUaGUgaW5kZXggZXhwcmVzc2lvbiBvZiB0aGUgb3BlcmF0aW9uLgogIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgYmluYXJ5IG9wZXJhdGlvbi4KICBOYW1lIGJpbmFyeU5hbWU7CgogIC8vLyBUaGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBiaW5hcnkgZXhwcmVzc2lvbi4KICBFeHByZXNzaW9uIHJoczsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIFtdIG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgcmVhZE9mZnNldDsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIFtdPSBvcGVyYXRpb24uCiAgZmluYWwgaW50IHdyaXRlT2Zmc2V0OwoKICAvLy8gVGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgYmluYXJ5IG9wZXJhdGlvbi4KICBmaW5hbCBpbnQgYmluYXJ5T2Zmc2V0OwoKICAvLy8gSWYgYHRydWVgLCB0aGUgZXhwcmVzc2lvbiBpcyBvbmx5IG5lZWQgZm9yIGVmZmVjdCBhbmQgbm90IGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCBmb3JFZmZlY3Q7CgogIC8vLyBJZiBgdHJ1ZWAsIHRoZSBleHByZXNzaW9uIGlzIGEgcG9zdC1maXggaW5jL2RlYyBleHByZXNzaW9uLgogIGZpbmFsIGJvb2wgZm9yUG9zdEluY0RlYzsKCiAgLy8vIElmIGB0cnVlYCB0aGUgcmVjZWl2ZXIgY2FuIGJlIGNsb25lZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgdGVtcG9yYXJ5CiAgLy8vIHZhcmlhYmxlLgogIGZpbmFsIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKCiAgQ29tcG91bmRFeHRlbnNpb25JbmRleFNldCgKICAgICAgdGhpcy5leHRlbnNpb24sCiAgICAgIHRoaXMuZXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLnJlY2VpdmVyLAogICAgICB0aGlzLmdldHRlciwKICAgICAgdGhpcy5zZXR0ZXIsCiAgICAgIHRoaXMuaW5kZXgsCiAgICAgIHRoaXMuYmluYXJ5TmFtZSwKICAgICAgdGhpcy5yaHMsCiAgICAgIHt0aGlzLnJlYWRPZmZzZXQsCiAgICAgIHRoaXMuYmluYXJ5T2Zmc2V0LAogICAgICB0aGlzLndyaXRlT2Zmc2V0LAogICAgICB0aGlzLmZvckVmZmVjdCwKICAgICAgdGhpcy5mb3JQb3N0SW5jRGVjLAogICAgICB0aGlzLnJlYWRPbmx5UmVjZWl2ZXJ9KQogICAgICA6IGFzc2VydChleHBsaWNpdFR5cGVBcmd1bWVudHMgPT0gbnVsbCB8fAogICAgICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMubGVuZ3RoID09IGV4dGVuc2lvbi50eXBlUGFyYW1ldGVycy5sZW5ndGgpLAogICAgICAgIGFzc2VydChyZWFkT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChiaW5hcnlPZmZzZXQgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHdyaXRlT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChmb3JFZmZlY3QgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KGZvclBvc3RJbmNEZWMgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KHJlYWRPbmx5UmVjZWl2ZXIgIT0gbnVsbCkgewogICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIHJocz8ucGFyZW50ID0gdGhpczsKICAgIGZpbGVPZmZzZXQgPSBiaW5hcnlPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb21wb3VuZEV4dGVuc2lvbkluZGV4U2V0KHRoaXMsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEludGVybmFsRXhwcmVzc2lvbktpbmQgZ2V0IGtpbmQgPT4KICAgICAgSW50ZXJuYWxFeHByZXNzaW9uS2luZC5Db21wb3VuZEV4dGVuc2lvbkluZGV4U2V0OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICByZWNlaXZlcj8uYWNjZXB0KHYpOwogICAgaW5kZXg/LmFjY2VwdCh2KTsKICAgIHJocz8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGluZGV4ICE9IG51bGwpIHsKICAgICAgaW5kZXggPSBpbmRleC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBpbmRleD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChyaHMgIT0gbnVsbCkgewogICAgICByaHMgPSByaHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmhzPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIGFzc2lnbm1lbnQgdG8gYW4gZXh0ZW5zaW9uIHNldHRlci4KLy8vCi8vLyBBbiBleHRlbnNpb24gc2V0IG9mIHRoZSBmb3JtIGByZWNlaXZlci50YXJnZXQgPSB2YWx1ZWAgaXMsIGlmIHVzZWQgZm9yCi8vLyB2YWx1ZSwgZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHJlY2VpdmVyVmFyaWFibGUgPSByZWNlaXZlciBpbgovLy8gICAgIGxldCB2YWx1ZVZhcmlhYmxlID0gdmFsdWUgaW4KLy8vICAgICBsZXQgd3JpdGVWYXJpYWJsZSA9IHRhcmdldChyZWNlaXZlclZhcmlhYmxlLCB2YWx1ZVZhcmlhYmxlKSBpbgovLy8gICAgICAgIHZhbHVlVmFyaWFibGUKLy8vCi8vLyBvciBpZiB0aGUgcmVjZWl2ZXIgaXMgcmVhZC1vbmx5LCBsaWtlIGB0aGlzYCBvciBhIGZpbmFsIHZhcmlhYmxlLAovLy8KLy8vICAgICBsZXQgdmFsdWVWYXJpYWJsZSA9IHZhbHVlIGluCi8vLyAgICAgbGV0IHdyaXRlVmFyaWFibGUgPSB0YXJnZXQocmVjZWl2ZXIsIHZhbHVlVmFyaWFibGUpIGluCi8vLyAgICAgICAgdmFsdWVWYXJpYWJsZQovLy8KLy8vIGFuZCwgaWYgdXNlZCBmb3IgZWZmZWN0LCBlbmNvZGVkIGFzIGEgW1N0YXRpY0ludm9jYXRpb25dOgovLy8KLy8vICAgICB0YXJnZXQocmVjZWl2ZXIsIHZhbHVlKQovLy8KLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVuYW1lIHJlYWQtb25seSB0byBzaWRlLWVmZmVjdC1mcmVlLgpjbGFzcyBFeHRlbnNpb25TZXQgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb247CgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IGV4cGxpY2l0VHlwZUFyZ3VtZW50czsKCiAgLy8vIFRoZSByZWNlaXZlciBmb3IgdGhlIGFzc2lnbm1lbnQuCiAgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBleHRlbnNpb24gbWVtYmVyIGNhbGxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCiAgTWVtYmVyIHRhcmdldDsKCiAgLy8vIFRoZSByaWdodC1oYW5kIHNpZGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQuCiAgRXhwcmVzc2lvbiB2YWx1ZTsKCiAgLy8vIElmIGB0cnVlYCB0aGUgYXNzaWdubWVudCBpcyBvbmx5IG5lZWRlZCBmb3IgZWZmZWN0IGFuZCBub3QgaXRzIHJlc3VsdAogIC8vLyB2YWx1ZS4KICBmaW5hbCBib29sIGZvckVmZmVjdDsKCiAgLy8vIElmIGB0cnVlYCB0aGUgcmVjZWl2ZXIgY2FuIGJlIGNsb25lZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgdGVtcG9yYXJ5CiAgLy8vIHZhcmlhYmxlLgogIGZpbmFsIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKCiAgRXh0ZW5zaW9uU2V0KHRoaXMuZXh0ZW5zaW9uLCB0aGlzLmV4cGxpY2l0VHlwZUFyZ3VtZW50cywgdGhpcy5yZWNlaXZlciwKICAgICAgdGhpcy50YXJnZXQsIHRoaXMudmFsdWUsCiAgICAgIHt0aGlzLnJlYWRPbmx5UmVjZWl2ZXIsIHRoaXMuZm9yRWZmZWN0fSkKICAgICAgOiBhc3NlcnQoZXhwbGljaXRUeXBlQXJndW1lbnRzID09IG51bGwgfHwKICAgICAgICAgICAgZXhwbGljaXRUeXBlQXJndW1lbnRzLmxlbmd0aCA9PSBleHRlbnNpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoKSwKICAgICAgICBhc3NlcnQocmVhZE9ubHlSZWNlaXZlciAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpIHsKICAgIHJlY2VpdmVyPy5wYXJlbnQgPSB0aGlzOwogICAgdmFsdWU/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFeHRlbnNpb25TZXQodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkV4dGVuc2lvblNldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgcmVjZWl2ZXI/LmFjY2VwdCh2KTsKICAgIHZhbHVlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChyZWNlaXZlciAhPSBudWxsKSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcmVjZWl2ZXI/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhbHVlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIG51bGwtYXdhcmUgZXh0ZW5zaW9uIGV4cHJlc3Npb24uCi8vLwovLy8gQW4gbnVsbC1hd2FyZSBleHRlbnNpb24gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgRXh0ZW5zaW9uKHJlY2VpdmVyKT8udGFyZ2V0YAovLy8gaXMgZW5jb2RlZCBhcyB0aGUgZXhwcmVzc2lvbjoKLy8vCi8vLyAgICAgbGV0IHZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KLy8vICAgICAgIHZhcmlhYmxlID09IG51bGwgPyBudWxsIDogZXhwcmVzc2lvbgovLy8KLy8vIHdoZXJlIGBleHByZXNzaW9uYCBpcyBhbiBlbmNvZGluZyBvZiBgcmVjZWl2ZXJWYXJpYWJsZS50YXJnZXRgLgpjbGFzcyBOdWxsQXdhcmVFeHRlbnNpb24gZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBOdWxsQXdhcmVFeHRlbnNpb24odGhpcy52YXJpYWJsZSwgdGhpcy5leHByZXNzaW9uKSB7CiAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXROdWxsQXdhcmVFeHRlbnNpb24odGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLk51bGxBd2FyZUV4dGVuc2lvbjsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgdmFyaWFibGU/LmFjY2VwdCh2KTsKICAgIGV4cHJlc3Npb24/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB2YXJpYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBGcm9udCBlbmQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgW1Byb3BlcnR5U2V0XS4KY2xhc3MgUHJvcGVydHlTZXRJbXBsIGV4dGVuZHMgUHJvcGVydHlTZXQgewogIC8vLyBJZiBgdHJ1ZWAgdGhlIGFzc2lnbm1lbnQgaXMgbmVlZCBmb3IgaXRzIGVmZmVjdCBhbmQgbm90IGZvciBpdHMgdmFsdWUuCiAgZmluYWwgYm9vbCBmb3JFZmZlY3Q7CgogIC8vLyBJZiBgdHJ1ZWAgdGhlIHJlY2VpdmVyIGNhbiBiZSBjbG9uZWQgYW5kIGRvZXNuJ3QgbmVlZCBhIHRlbXBvcmFyeSB2YXJpYWJsZQogIC8vLyBmb3IgbXVsdGlwbGUgcmVhZHMuCiAgZmluYWwgYm9vbCByZWFkT25seVJlY2VpdmVyOwoKICBQcm9wZXJ0eVNldEltcGwoRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7TWVtYmVyIGludGVyZmFjZVRhcmdldCwgdGhpcy5mb3JFZmZlY3QsIHRoaXMucmVhZE9ubHlSZWNlaXZlcn0pCiAgICAgIDogYXNzZXJ0KGZvckVmZmVjdCAhPSBudWxsKSwKICAgICAgICBzdXBlcihyZWNlaXZlciwgbmFtZSwgdmFsdWUsIGludGVyZmFjZVRhcmdldCk7Cn0KCi8vLyBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIHJlYWQgb2YgYW4gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlci4KLy8vCi8vLyBBIHJlYWQgb2YgYW4gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlciBgby5mb29gIGlzIGVuY29kZWQgYXMgdGhlCi8vLyBbU3RhdGljSW52b2NhdGlvbl0KLy8vCi8vLyAgICAgZXh0ZW5zaW9ufGZvbyhvKQovLy8KLy8vIHdoZXJlIGBleHRlbnNpb258Zm9vYCBpcyB0aGUgdG9wIGxldmVsIG1ldGhvZCBjcmVhdGVkIGZvciByZWFkaW5nIHRoZQovLy8gYGZvb2AgbWVtYmVyLiBJZiBgZm9vYCBpcyBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWV0aG9kLCB0aGVuIGBleHRlbnNpb258Zm9vYAovLy8gdGhlIHNwZWNpYWwgdGVhci1vZmYgZnVuY3Rpb24gY3JlYXRlZCBmb3IgZXh0ZW5zaW9uIGluc3RhbmNlIG1ldGhvZHMuCi8vLyBPdGhlcndpc2UgYGV4dGVuc2lvbnxmb29gIGlzIHRoZSB0b3AgbGV2ZWwgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi8vLyBleHRlbnNpb24gaW5zdGFuY2UgZ2V0dGVyIGJlaW5nIHJlYWQuCmNsYXNzIEV4dGVuc2lvblRlYXJPZmYgZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIC8vLyBUaGUgdG9wLWxldmVsIG1ldGhvZCB0aGF0IGlzIHRoYXQgdGFyZ2V0IGZvciB0aGUgcmVhZCBvcGVyYXRpb24uCiAgTWVtYmVyIHRhcmdldDsKCiAgLy8vIFRoZSBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIHRvcC1sZXZlbCBtZXRob2QuCiAgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgRXh0ZW5zaW9uVGVhck9mZih0aGlzLnRhcmdldCwgdGhpcy5hcmd1bWVudHMpIHsKICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEV4dGVuc2lvblRlYXJPZmYodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkV4dGVuc2lvblRlYXJPZmY7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHsKICAgIGFyZ3VtZW50cz8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgYXJndW1lbnRzID0gYXJndW1lbnRzLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGFyZ3VtZW50cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIGZvciBhbiBlcXVhbHMgb3Igbm90LWVxdWFscyBleHByZXNzaW9uLgpjbGFzcyBFcXVhbHNFeHByZXNzaW9uIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGxlZnQ7CiAgRXhwcmVzc2lvbiByaWdodDsKICBib29sIGlzTm90OwoKICBFcXVhbHNFeHByZXNzaW9uKHRoaXMubGVmdCwgdGhpcy5yaWdodCwge3RoaXMuaXNOb3R9KQogICAgICA6IGFzc2VydChpc05vdCAhPSBudWxsKSB7CiAgICBsZWZ0Py5wYXJlbnQgPSB0aGlzOwogICAgcmlnaHQ/LnBhcmVudCA9IHRoaXM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGFjY2VwdEluZmVyZW5jZSgKICAgICAgSW5mZXJlbmNlVmlzaXRvciB2aXNpdG9yLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFcXVhbHModGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkVxdWFsczsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgbGVmdD8uYWNjZXB0KHYpOwogICAgcmlnaHQ/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGxlZnQgIT0gbnVsbCkgewogICAgICBsZWZ0ID0gbGVmdC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBsZWZ0Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHJpZ2h0ICE9IG51bGwpIHsKICAgICAgcmlnaHQgPSByaWdodC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICByaWdodD8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIGZvciBhIGJpbmFyeSBleHByZXNzaW9uLgpjbGFzcyBCaW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICBFeHByZXNzaW9uIGxlZnQ7CiAgTmFtZSBiaW5hcnlOYW1lOwogIEV4cHJlc3Npb24gcmlnaHQ7CgogIEJpbmFyeUV4cHJlc3Npb24odGhpcy5sZWZ0LCB0aGlzLmJpbmFyeU5hbWUsIHRoaXMucmlnaHQpIHsKICAgIGxlZnQ/LnBhcmVudCA9IHRoaXM7CiAgICByaWdodD8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYWNjZXB0SW5mZXJlbmNlKAogICAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJpbmFyeSh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuQmluYXJ5OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICBsZWZ0Py5hY2NlcHQodik7CiAgICByaWdodD8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAobGVmdCAhPSBudWxsKSB7CiAgICAgIGxlZnQgPSBsZWZ0LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGxlZnQ/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocmlnaHQgIT0gbnVsbCkgewogICAgICByaWdodCA9IHJpZ2h0LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHJpZ2h0Py5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEludGVybmFsIGV4cHJlc3Npb24gZm9yIGEgdW5hcnkgZXhwcmVzc2lvbi4KY2xhc3MgVW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgSW50ZXJuYWxFeHByZXNzaW9uIHsKICBOYW1lIHVuYXJ5TmFtZTsKICBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIFVuYXJ5RXhwcmVzc2lvbih0aGlzLnVuYXJ5TmFtZSwgdGhpcy5leHByZXNzaW9uKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5hcnkodGhpcywgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJuYWxFeHByZXNzaW9uS2luZCBnZXQga2luZCA9PiBJbnRlcm5hbEV4cHJlc3Npb25LaW5kLlVuYXJ5OwoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxkeW5hbWljPiB2KSB7CiAgICBleHByZXNzaW9uPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBJbnRlcm5hbCBleHByZXNzaW9uIGZvciBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KY2xhc3MgUGFyZW50aGVzaXplZEV4cHJlc3Npb24gZXh0ZW5kcyBJbnRlcm5hbEV4cHJlc3Npb24gewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKCiAgUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGhpcy5leHByZXNzaW9uKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBhY2NlcHRJbmZlcmVuY2UoCiAgICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UGFyZW50aGVzaXplZCh0aGlzLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcm5hbEV4cHJlc3Npb25LaW5kIGdldCBraW5kID0+IEludGVybmFsRXhwcmVzc2lvbktpbmQuUGFyZW50aGVzaXplZDsKCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoaWxkcmVuKFZpc2l0b3I8ZHluYW1pYz4gdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGV4cHJlc3Npb24/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQ3JlYXRlcyBhIFtMZXRdIG9mIFt2YXJpYWJsZV0gd2l0aCB0aGUgZ2l2ZW4gW2JvZHldIHVzaW5nCi8vLyBgdmFyaWFibGUuZmlsZU9mZnNldGAgYXMgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgbGV0LgovLy8KLy8vIFRoaXMgaXMgdXNlZnVsIGZvciBjcmVhdGUgbGV0IGV4cHJlc3Npb25zIGluIHJlcGxhY2VtZW50IGNvZGUuCkxldCBjcmVhdGVMZXQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRXhwcmVzc2lvbiBib2R5KSB7CiAgcmV0dXJuIG5ldyBMZXQodmFyaWFibGUsIGJvZHkpLi5maWxlT2Zmc2V0ID0gdmFyaWFibGUuZmlsZU9mZnNldDsKfQoKLy8vIENyZWF0ZXMgYSBbVmFyaWFibGVEZWNsYXJhdGlvbl0gZm9yIFtleHByZXNzaW9uXSB3aXRoIHRoZSBzdGF0aWMgW3R5cGVdCi8vLyB1c2luZyBgZXhwcmVzc2lvbi5maWxlT2Zmc2V0YCBhcyB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBkZWNsYXJhdGlvbi4KLy8vCi8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgbGV0IHZhcmlhYmxlcyBmb3IgZXhwcmVzc2lvbnMgaW4gcmVwbGFjZW1lbnQKLy8vIGNvZGUuClZhcmlhYmxlRGVjbGFyYXRpb24gY3JlYXRlVmFyaWFibGUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGV4cHJlc3Npb24sIHR5cGU6IHR5cGUpCiAgICAuLmZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7Cn0KCi8vLyBDcmVhdGVzIGEgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIGZvciB0aGUgZXhwcmVzc2lvbiBpbmZlcmVuY2UgW3Jlc3VsdF0KLy8vIHVzaW5nIGByZXN1bHQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0YCBhcyB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBkZWNsYXJhdGlvbi4KLy8vCi8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgbGV0IHZhcmlhYmxlcyBmb3IgZXhwcmVzc2lvbnMgaW4gcmVwbGFjZW1lbnQKLy8vIGNvZGUuClZhcmlhYmxlRGVjbGFyYXRpb24gY3JlYXRlVmFyaWFibGVGb3JSZXN1bHQoRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQpIHsKICByZXR1cm4gY3JlYXRlVmFyaWFibGUocmVzdWx0LmV4cHJlc3Npb24sIHJlc3VsdC5pbmZlcnJlZFR5cGUpOwp9CgovLy8gQ3JlYXRlcyBhIFtWYXJpYWJsZUdldF0gb2YgW3ZhcmlhYmxlXSB1c2luZyBgdmFyaWFibGUuZmlsZU9mZnNldGAgYXMgdGhlCi8vLyBmaWxlIG9mZnNldCBmb3IgdGhlIGV4cHJlc3Npb24uCi8vLwovLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHJlZmVyZW5jaW5nIGxldCB2YXJpYWJsZXMgZm9yIGV4cHJlc3Npb25zIGluIHJlcGxhY2VtZW50Ci8vLyBjb2RlLgpWYXJpYWJsZUdldCBjcmVhdGVWYXJpYWJsZUdldChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CiAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSkuLmZpbGVPZmZzZXQgPSB2YXJpYWJsZS5maWxlT2Zmc2V0Owp9CgovLy8gQ3JlYXRlcyBhIGBlID09IG51bGxgIHRlc3QgZm9yIHRoZSBleHByZXNzaW9uIFtsZWZ0XSB1c2luZyB0aGUgW2ZpbGVPZmZzZXRdCi8vLyBhcyBmaWxlIG9mZnNldCBmb3IgdGhlIGNyZWF0ZWQgbm9kZXMgYW5kIFtlcXVhbHNNZW1iZXJdIGFzIHRoZSBpbnRlcmZhY2UKLy8vIHRhcmdldCBvZiB0aGUgY3JlYXRlZCBtZXRob2QgaW52b2NhdGlvbi4KTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVFcXVhbHNOdWxsKAogICAgaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gbGVmdCwgTWVtYmVyIGVxdWFsc01lbWJlcikgewogIHJldHVybiBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgbGVmdCwKICAgICAgZXF1YWxzTmFtZSwKICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0XSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldAogICAgLi5pbnRlcmZhY2VUYXJnZXQgPSBlcXVhbHNNZW1iZXI7Cn0KCkV4cHJlc3Npb25TdGF0ZW1lbnQgY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9u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ZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX3RhcmdldDsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDYW5vbmljYWxOYW1lLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFbXB0eVN0YXRlbWVudCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEluaXRpYWxpemVyLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIsCiAgICAgICAgU291cmNlLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgU3VwZXJ0eXBlLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBWYXJpYWJsZUdldDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnIHNob3cgQ2xvbmVWaXNpdG9yTm90TWVtYmVyczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvcmVmZXJlbmNlX2Zyb21faW5kZXguZGFydCcgc2hvdyBJbmRleGVkQ2xhc3M7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IHN1YnN0aXR1dGU7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L2NoYW5nZWRfc3RydWN0dXJlX25vdGlmaWVyLmRhcnQnCiAgICBzaG93IENoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0JyBzaG93IERpYWdub3N0aWNSZXBvcnRlcjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUVudmlyb25tZW50OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3ZlcmlmaWVyLmRhcnQnIHNob3cgdmVyaWZ5R2V0U3RhdGljVHlwZTsKCmltcG9ydCAnLi4vLi4vYXBpX3Byb3RvdHlwZS9maWxlX3N5c3RlbS5kYXJ0JyBzaG93IEZpbGVTeXN0ZW07CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2ZpZWxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9pbnZhbGlkX3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25ldmVyX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9jb21waWxlcl9jb250ZXh0LmRhcnQnIHNob3cgQ29tcGlsZXJDb250ZXh0OwoKaW1wb3J0ICcuLi9jcmFzaC5kYXJ0JyBzaG93IHdpdGhDcmFzaFJlcG9ydGluZzsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgppbXBvcnQgJy4uL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxNZW1iZXJCdWlsZGVyOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IE1lc3NhZ2UsIExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93CiAgICAgICAgRm9ybWF0dGVkTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkQ2F1c2UsCiAgICAgICAgbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZEVycm9yLAogICAgICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRXYXJuaW5nLAogICAgICAgIG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZCwKICAgICAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGRDYXVzZSwKICAgICAgICBtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdCwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JFcnJvciwKICAgICAgICB0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JXYXJuaW5nLAogICAgICAgIHRlbXBsYXRlRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yLAogICAgICAgIHRlbXBsYXRlRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWQsCiAgICAgICAgdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yLAogICAgICAgIHRlbXBsYXRlSW5mZXJyZWRQYWNrYWdlVXJpLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3I7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JyBzaG93IEFtYmlndW91c0J1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJy4uL3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0JyBzaG93IFRhcmdldEltcGxlbWVudGF0aW9uOwoKaW1wb3J0ICcuLi91cmlfdHJhbnNsYXRvci5kYXJ0JyBzaG93IFVyaVRyYW5zbGF0b3I7CgppbXBvcnQgJ2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0JyBhcyBjb25zdGFudHMKICAgIHNob3cgRXZhbHVhdGlvbk1vZGUsIHRyYW5zZm9ybUxpYnJhcmllczsKCmltcG9ydCAna2VybmVsX2NvbnN0YW50cy5kYXJ0JyBzaG93IEtlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlcjsKCmltcG9ydCAnbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQnIHNob3cgTWV0YWRhdGFDb2xsZWN0b3I7CgppbXBvcnQgJ3ZlcmlmaWVyLmRhcnQnIHNob3cgdmVyaWZ5Q29tcG9uZW50OwoKY2xhc3MgS2VybmVsVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0SW1wbGVtZW50YXRpb24gewogIC8vLyBUaGUgW0ZpbGVTeXN0ZW1dIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGFjY2VzcyBmaWxlcy4KICBmaW5hbCBGaWxlU3lzdGVtIGZpbGVTeXN0ZW07CgogIC8vLyBXaGV0aGVyIGNvbW1lbnRzIHNob3VsZCBiZSBzY2FubmVkIGFuZCBwYXJzZWQuCiAgZmluYWwgYm9vbCBpbmNsdWRlQ29tbWVudHM7CgogIGZpbmFsIERpbGxUYXJnZXQgZGlsbFRhcmdldDsKCiAgLy8vIFRoZSBbTWV0YWRhdGFDb2xsZWN0b3JdIHRvIHdyaXRlIG1ldGFkYXRhIHRvLgogIGZpbmFsIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yOwoKICBTb3VyY2VMb2FkZXIgbG9hZGVyOwoKICBDb21wb25lbnQgY29tcG9uZW50OwoKICAvLyAnZHluYW1pYycgaXMgYWx3YXlzIG51bGxhYmxlLgogIGZpbmFsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoCiAgICAgICJkeW5hbWljIiwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm51bGxhYmxlKCksIG51bGwpOwoKICBmaW5hbCBOYW1lZFR5cGVCdWlsZGVyIG9iamVjdFR5cGUgPQogICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcigiT2JqZWN0IiwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSwgbnVsbCk7CgogIC8vIE51bGwgaXMgYWx3YXlzIG51bGxhYmxlLgogIGZpbmFsIFR5cGVCdWlsZGVyIGJvdHRvbVR5cGUgPQogICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcigiTnVsbCIsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5udWxsYWJsZSgpLCBudWxsKTsKCiAgZmluYWwgYm9vbCBleGNsdWRlU291cmNlID0gIUNvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuZW1iZWRTb3VyY2VUZXh0OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lcyA9CiAgICAgIENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMuZW52aXJvbm1lbnREZWZpbmVzOwoKICBmaW5hbCBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50ID0KICAgICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucy5lcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudDsKCiAgZmluYWwgTGlzdDxPYmplY3Q+IGNsb25lZEZvcm1hbHMgPSA8T2JqZWN0PltdOwoKICBLZXJuZWxUYXJnZXQodGhpcy5maWxlU3lzdGVtLCB0aGlzLmluY2x1ZGVDb21tZW50cywgRGlsbFRhcmdldCBkaWxsVGFyZ2V0LAogICAgICBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3IsCiAgICAgIHtNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3Rvcn0pCiAgICAgIDogZGlsbFRhcmdldCA9IGRpbGxUYXJnZXQsCiAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IgPSBtZXRhZGF0YUNvbGxlY3RvciwKICAgICAgICBzdXBlcihkaWxsVGFyZ2V0LnRpY2tlciwgdXJpVHJhbnNsYXRvciwgZGlsbFRhcmdldC5iYWNrZW5kVGFyZ2V0KSB7CiAgICBsb2FkZXIgPSBjcmVhdGVMb2FkZXIoKTsKICB9CgogIFNvdXJjZUxvYWRlciBjcmVhdGVMb2FkZXIoKSA9PgogICAgICBuZXcgU291cmNlTG9hZGVyKGZpbGVTeXN0ZW0sIGluY2x1ZGVDb21tZW50cywgdGhpcyk7CgogIHZvaWQgYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgIFVyaSBpbXBvcnRVcmksIFVyaSBmaWxlVXJpLCBMaXN0PGludD4gbGluZVN0YXJ0cywgTGlzdDxpbnQ+IHNvdXJjZUNvZGUpIHsKICAgIHVyaVRvU291cmNlW2ZpbGVVcmldID0KICAgICAgICBuZXcgU291cmNlKGxpbmVTdGFydHMsIHNvdXJjZUNvZGUsIGltcG9ydFVyaSwgZmlsZVVyaSk7CiAgfQoKICAvLy8gUmV0dXJuIGxpc3Qgb2Ygc2FtZSBzaXplIGFzIGlucHV0IHdpdGggcG9zc2libHkgdHJhbnNsYXRlZCB1cmlzLgogIExpc3Q8VXJpPiBzZXRFbnRyeVBvaW50cyhMaXN0PFVyaT4gZW50cnlQb2ludHMpIHsKICAgIE1hcDxTdHJpbmcsIFVyaT4gcGFja2FnZXNNYXA7CiAgICBMaXN0PFVyaT4gcmVzdWx0ID0gbmV3IExpc3Q8VXJpPigpOwogICAgZm9yIChVcmkgZW50cnlQb2ludCBpbiBlbnRyeVBvaW50cykgewogICAgICBwYWNrYWdlc01hcCA/Pz0gdXJpVHJhbnNsYXRvci5wYWNrYWdlcy5hc01hcCgpOwogICAgICBVcmkgdHJhbnNsYXRlZEVudHJ5UG9pbnQgPSBnZXRFbnRyeVBvaW50VXJpKGVudHJ5UG9pbnQsCiAgICAgICAgICBwYWNrYWdlc01hcDogcGFja2FnZXNNYXAsIGlzc3VlUHJvYmxlbTogdHJ1ZSk7CiAgICAgIHJlc3VsdC5hZGQodHJhbnNsYXRlZEVudHJ5UG9pbnQpOwogICAgICBsb2FkZXIucmVhZCh0cmFuc2xhdGVkRW50cnlQb2ludCwgLTEsCiAgICAgICAgICBhY2Nlc3NvcjogbG9hZGVyLmZpcnN0LAogICAgICAgICAgZmlsZVVyaTogdHJhbnNsYXRlZEVudHJ5UG9pbnQgIT0gZW50cnlQb2ludCA/IGVudHJ5UG9pbnQgOiBudWxsKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmV0dXJuIGxpc3Qgb2Ygc2FtZSBzaXplIGFzIGlucHV0IHdpdGggcG9zc2libHkgdHJhbnNsYXRlZCB1cmlzLgogIFVyaSBnZXRFbnRyeVBvaW50VXJpKFVyaSBlbnRyeVBvaW50LAogICAgICB7TWFwPFN0cmluZywgVXJpPiBwYWNrYWdlc01hcCwgYm9vbCBpc3N1ZVByb2JsZW06IGZhbHNlfSkgewogICAgU3RyaW5nIHNjaGVtZSA9IGVudHJ5UG9pbnQuc2NoZW1lOwogICAgc3dpdGNoIChzY2hlbWUpIHsKICAgICAgY2FzZSAicGFja2FnZSI6CiAgICAgIGNhc2UgImRhcnQiOgogICAgICBjYXNlICJkYXRhIjoKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICAvLyBBdHRlbXB0IHRvIHJldmVyc2UtbG9va3VwIFtlbnRyeVBvaW50XSBpbiBwYWNrYWdlIGNvbmZpZy4KICAgICAgICBTdHJpbmcgYXNTdHJpbmcgPSAiJGVudHJ5UG9pbnQiOwogICAgICAgIHBhY2thZ2VzTWFwID8/PSB1cmlUcmFuc2xhdG9yLnBhY2thZ2VzLmFzTWFwKCk7CiAgICAgICAgZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgaW4gcGFja2FnZXNNYXAua2V5cykgewogICAgICAgICAgVXJpIHBhY2thZ2VVcmkgPSBwYWNrYWdlc01hcFtwYWNrYWdlTmFtZV07CiAgICAgICAgICBpZiAocGFja2FnZVVyaT8uaGFzRnJhZ21lbnQgPT0gdHJ1ZSkgewogICAgICAgICAgICBwYWNrYWdlVXJpID0gcGFja2FnZVVyaS5yZW1vdmVGcmFnbWVudCgpOwogICAgICAgICAgfQogICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIke3BhY2thZ2VVcml9IjsKICAgICAgICAgIGlmIChhc1N0cmluZy5zdGFydHNXaXRoKHByZWZpeCkpIHsKICAgICAgICAgICAgVXJpIHJldmVyc2VkID0gVXJpLnBhcnNlKAogICAgICAgICAgICAgICAgInBhY2thZ2U6JHBhY2thZ2VOYW1lLyR7YXNTdHJpbmcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpfSIpOwogICAgICAgICAgICBpZiAoZW50cnlQb2ludCA9PSB1cmlUcmFuc2xhdG9yLnRyYW5zbGF0ZShyZXZlcnNlZCkpIHsKICAgICAgICAgICAgICBpZiAoaXNzdWVQcm9ibGVtKSB7CiAgICAgICAgICAgICAgICBsb2FkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluZmVycmVkUGFja2FnZVVyaS53aXRoQXJndW1lbnRzKHJldmVyc2VkKSwKICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbnRyeVBvaW50ID0gcmV2ZXJzZWQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZW50cnlQb2ludDsKICB9CgogIEBvdmVycmlkZQogIExpYnJhcnlCdWlsZGVyIGNyZWF0ZUxpYnJhcnlCdWlsZGVyKAogICAgICBVcmkgdXJpLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgb3JpZ2luLAogICAgICBMaWJyYXJ5IHJlZmVyZW5jZXNGcm9tLAogICAgICBib29sIHJlZmVyZW5jZUlzUGFydE93bmVyKSB7CiAgICBpZiAoZGlsbFRhcmdldC5pc0xvYWRlZCkgewogICAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0gZGlsbFRhcmdldC5sb2FkZXIuYnVpbGRlcnNbdXJpXTsKICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBidWlsZGVyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNvdXJjZUxpYnJhcnlCdWlsZGVyKHVyaSwgZmlsZVVyaSwgbG9hZGVyLCBvcmlnaW4sCiAgICAgICAgcmVmZXJlbmNlc0Zyb206IHJlZmVyZW5jZXNGcm9tLAogICAgICAgIHJlZmVyZW5jZUlzUGFydE93bmVyOiByZWZlcmVuY2VJc1BhcnRPd25lcik7CiAgfQoKICAvLy8gUmV0dXJucyBjbGFzc2VzIGRlZmluZWQgaW4gbGlicmFyaWVzIGluIFtsb2FkZXJdLgogIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBjb2xsZWN0TXlDbGFzc2VzKCkgewogICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHJlc3VsdCA9IDxTb3VyY2VDbGFzc0J1aWxkZXI+W107CiAgICBsb2FkZXIuYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gbG9hZGVyKSB7CiAgICAgICAgSXRlcmF0b3I8QnVpbGRlcj4gaXRlcmF0b3IgPSBsaWJyYXJ5Lml0ZXJhdG9yOwogICAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICBCdWlsZGVyIG1lbWJlciA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgICAgICBpZiAobWVtYmVyIGlzIFNvdXJjZUNsYXNzQnVpbGRlciAmJiAhbWVtYmVyLmlzUGF0Y2gpIHsKICAgICAgICAgICAgcmVzdWx0LmFkZChtZW1iZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBicmVha0N5Y2xlKENsYXNzQnVpbGRlciBidWlsZGVyKSB7CiAgICBDbGFzcyBjbHMgPSBidWlsZGVyLmNsczsKICAgIGNscy5pbXBsZW1lbnRlZFR5cGVzLmNsZWFyKCk7CiAgICBjbHMuc3VwZXJ0eXBlID0gbnVsbDsKICAgIGNscy5taXhlZEluVHlwZSA9IG51bGw7CiAgICBidWlsZGVyLnN1cGVydHlwZSA9CiAgICAgICAgbmV3IE5hbWVkVHlwZUJ1aWxkZXIoIk9iamVjdCIsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCksIG51bGwpCiAgICAgICAgICAuLmJpbmQob2JqZWN0Q2xhc3NCdWlsZGVyKTsKICAgIGJ1aWxkZXIuaW50ZXJmYWNlcyA9IG51bGw7CiAgICBidWlsZGVyLm1peGVkSW5UeXBlID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxDb21wb25lbnQ+IGJ1aWxkT3V0bGluZXMoe0Nhbm9uaWNhbE5hbWUgbmFtZVJvb3R9KSBhc3luYyB7CiAgICBpZiAobG9hZGVyLmZpcnN0ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHdpdGhDcmFzaFJlcG9ydGluZzxDb21wb25lbnQ+KCgpIGFzeW5jIHsKICAgICAgYXdhaXQgbG9hZGVyLmJ1aWxkT3V0bGluZXMoKTsKICAgICAgbG9hZGVyLmNyZWF0ZVR5cGVJbmZlcmVuY2VFbmdpbmUoKTsKICAgICAgbG9hZGVyLmNvcmVMaWJyYXJ5LmJlY29tZUNvcmVMaWJyYXJ5KCk7CiAgICAgIGR5bmFtaWNUeXBlLmJpbmQoCiAgICAgICAgICBsb2FkZXIuY29yZUxpYnJhcnkubG9va3VwTG9jYWxNZW1iZXIoImR5bmFtaWMiLCByZXF1aXJlZDogdHJ1ZSkpOwogICAgICBsb2FkZXIucmVzb2x2ZVBhcnRzKCk7CiAgICAgIGxvYWRlci5jb21wdXRlTGlicmFyeVNjb3BlcygpOwogICAgICBzZXR1cFRvcEFuZEJvdHRvbVR5cGVzKCk7CiAgICAgIGxvYWRlci5yZXNvbHZlVHlwZXMoKTsKICAgICAgbG9hZGVyLmNvbXB1dGVWYXJpYW5jZXMoKTsKICAgICAgbG9hZGVyLmNvbXB1dGVEZWZhdWx0VHlwZXMoZHluYW1pY1R5cGUsIGJvdHRvbVR5cGUsIG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBteUNsYXNzZXMgPQogICAgICAgICAgbG9hZGVyLmNoZWNrU2VtYW50aWNzKG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgIGxvYWRlci5maW5pc2hUeXBlVmFyaWFibGVzKG9iamVjdENsYXNzQnVpbGRlciwgZHluYW1pY1R5cGUpOwogICAgICBsb2FkZXIuYnVpbGRDb21wb25lbnQoKTsKICAgICAgaW5zdGFsbERlZmF1bHRTdXBlcnR5cGVzKCk7CiAgICAgIGluc3RhbGxTeW50aGV0aWNDb25zdHJ1Y3RvcnMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLnJlc29sdmVDb25zdHJ1Y3RvcnMoKTsKICAgICAgY29tcG9uZW50ID0KICAgICAgICAgIGxpbmsobmV3IExpc3Q8TGlicmFyeT4uZnJvbShsb2FkZXIubGlicmFyaWVzKSwgbmFtZVJvb3Q6IG5hbWVSb290KTsKICAgICAgY29tcHV0ZUNvcmVUeXBlcygpOwogICAgICBsb2FkZXIuYnVpbGRDbGFzc0hpZXJhcmNoeShteUNsYXNzZXMsIG9iamVjdENsYXNzQnVpbGRlcik7CiAgICAgIGxvYWRlci5jb21wdXRlSGllcmFyY2h5KCk7CiAgICAgIGxvYWRlci5wZXJmb3JtVG9wTGV2ZWxJbmZlcmVuY2UobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmNoZWNrU3VwZXJ0eXBlcyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuY2hlY2tUeXBlcygpOwogICAgICBsb2FkZXIuY2hlY2tPdmVycmlkZXMobXlDbGFzc2VzKTsKICAgICAgbG9hZGVyLmNoZWNrQWJzdHJhY3RNZW1iZXJzKG15Q2xhc3Nlcyk7CiAgICAgIGxvYWRlci5jaGVja1JlZGlyZWN0aW5nRmFjdG9yaWVzKG15Q2xhc3Nlcyk7CiAgICAgIGxvYWRlci5hZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJzKG15Q2xhc3Nlcyk7CiAgICAgIGxvYWRlci5jaGVja01peGlucyhteUNsYXNzZXMpOwogICAgICBsb2FkZXIuYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMobG9hZGVyLmNvcmVUeXBlcyk7CiAgICAgIF91cGRhdGVEZWxheWVkUGFyYW1ldGVyVHlwZXMoKTsKICAgICAgaW5zdGFsbEFsbENvbXBvbmVudFByb2JsZW1zKGxvYWRlci5hbGxDb21wb25lbnRQcm9ibGVtcyk7CiAgICAgIGxvYWRlci5hbGxDb21wb25lbnRQcm9ibGVtcy5jbGVhcigpOwogICAgICByZXR1cm4gY29tcG9uZW50OwogICAgfSwgKCkgPT4gbG9hZGVyPy5jdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcpOwogIH0KCiAgLy8vIEJ1aWxkIHRoZSBrZXJuZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbXBvbmVudCBsb2FkZWQgYnkgdGhpcwogIC8vLyB0YXJnZXQuIFRoZSBjb21wb25lbnQgd2lsbCBjb250YWluIGZ1bGwgYm9kaWVzIGZvciB0aGUgY29kZSBsb2FkZWQgZnJvbQogIC8vLyBzb3VyY2VzLCBhbmQgb25seSByZWZlcmVuY2VzIHRvIHRoZSBjb2RlIGxvYWRlZCBieSB0aGUgW0RpbGxUYXJnZXRdLAogIC8vLyB3aGljaCBtYXkgb3IgbWF5IG5vdCBpbmNsdWRlIG1ldGhvZCBib2RpZXMgKGRlcGVuZGluZyBvbiB3aGF0IHdhcyBsb2FkZWQKICAvLy8gaW50byB0aGF0IHRhcmdldCwgYW4gb3V0bGluZSBvciBhIGZ1bGwga2VybmVsIGNvbXBvbmVudCkuCiAgLy8vCiAgLy8vIElmIFt2ZXJpZnldLCBydW4gdGhlIGRlZmF1bHQga2VybmVsIHZlcmlmaWNhdGlvbiBvbiB0aGUgcmVzdWx0aW5nCiAgLy8vIGNvbXBvbmVudC4KICBAb3ZlcnJpZGUKICBGdXR1cmU8Q29tcG9uZW50PiBidWlsZENvbXBvbmVudCh7Ym9vbCB2ZXJpZnk6IGZhbHNlfSkgYXN5bmMgewogICAgaWYgKGxvYWRlci5maXJzdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB3aXRoQ3Jhc2hSZXBvcnRpbmc8Q29tcG9uZW50PigoKSBhc3luYyB7CiAgICAgIHRpY2tlci5sb2dNcygiQnVpbGRpbmcgY29tcG9uZW50Iik7CiAgICAgIGF3YWl0IGxvYWRlci5idWlsZEJvZGllcygpOwogICAgICBmaW5pc2hDbG9uZWRQYXJhbWV0ZXJzKCk7CiAgICAgIGxvYWRlci5maW5pc2hEZWZlcnJlZExvYWRUZWFyb2ZmcygpOwogICAgICBsb2FkZXIuZmluaXNoTm9TdWNoTWV0aG9kRm9yd2FyZGVycygpOwogICAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gbXlDbGFzc2VzID0gY29sbGVjdE15Q2xhc3NlcygpOwogICAgICBsb2FkZXIuZmluaXNoTmF0aXZlTWV0aG9kcygpOwogICAgICBsb2FkZXIuZmluaXNoUGF0Y2hNZXRob2RzKCk7CiAgICAgIGZpbmlzaEFsbENvbnN0cnVjdG9ycyhteUNsYXNzZXMpOwogICAgICBydW5CdWlsZFRyYW5zZm9ybWF0aW9ucygpOwoKICAgICAgaWYgKHZlcmlmeSkgdGhpcy52ZXJpZnkoKTsKICAgICAgaW5zdGFsbEFsbENvbXBvbmVudFByb2JsZW1zKGxvYWRlci5hbGxDb21wb25lbnRQcm9ibGVtcyk7CiAgICAgIHJldHVybiBjb21wb25lbnQ7CiAgICB9LCAoKSA9PiBsb2FkZXI/LmN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZyk7CiAgfQoKICB2b2lkIGluc3RhbGxBbGxDb21wb25lbnRQcm9ibGVtcygKICAgICAgTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiBhbGxDb21wb25lbnRQcm9ibGVtcykgewogICAgaWYgKGFsbENvbXBvbmVudFByb2JsZW1zLmlzTm90RW1wdHkpIHsKICAgICAgY29tcG9uZW50LnByb2JsZW1zQXNKc29uID8/PSA8U3RyaW5nPltdOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDb21wb25lbnRQcm9ibGVtcy5sZW5ndGg7IGkrKykgewogICAgICBGb3JtYXR0ZWRNZXNzYWdlIGZvcm1hdHRlZE1lc3NhZ2UgPSBhbGxDb21wb25lbnRQcm9ibGVtc1tpXTsKICAgICAgY29tcG9uZW50LnByb2JsZW1zQXNKc29uLmFkZChmb3JtYXR0ZWRNZXNzYWdlLnRvSnNvblN0cmluZygpKTsKICAgIH0KICB9CgogIC8vLyBDcmVhdGVzIGEgY29tcG9uZW50IGJ5IGNvbWJpbmluZyBbbGlicmFyaWVzXSB3aXRoIHRoZSBsaWJyYXJpZXMgb2YKICAvLy8gYGRpbGxUYXJnZXQubG9hZGVyLmNvbXBvbmVudGAuCiAgQ29tcG9uZW50IGxpbmsoTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMsIHtDYW5vbmljYWxOYW1lIG5hbWVSb290fSkgewogICAgbGlicmFyaWVzLmFkZEFsbChkaWxsVGFyZ2V0LmxvYWRlci5saWJyYXJpZXMpOwoKICAgIE1hcDxVcmksIFNvdXJjZT4gdXJpVG9Tb3VyY2UgPSBuZXcgTWFwPFVyaSwgU291cmNlPigpOwogICAgdm9pZCBjb3B5U291cmNlKFVyaSB1cmksIFNvdXJjZSBzb3VyY2UpIHsKICAgICAgdXJpVG9Tb3VyY2VbdXJpXSA9IGV4Y2x1ZGVTb3VyY2UKICAgICAgICAgID8gbmV3IFNvdXJjZShzb3VyY2UubGluZVN0YXJ0cywgY29uc3QgPGludD5bXSwgc291cmNlLmltcG9ydFVyaSwKICAgICAgICAgICAgICBzb3VyY2UuZmlsZVVyaSkKICAgICAgICAgIDogc291cmNlOwogICAgfQoKICAgIHRoaXMudXJpVG9Tb3VyY2UuZm9yRWFjaChjb3B5U291cmNlKTsKCiAgICBDb21wb25lbnQgY29tcG9uZW50ID0gYmFja2VuZFRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudCgKICAgICAgICBuYW1lUm9vdDogbmFtZVJvb3QsIGxpYnJhcmllczogbGlicmFyaWVzLCB1cmlUb1NvdXJjZTogdXJpVG9Tb3VyY2UpKTsKICAgIGlmIChsb2FkZXIuZmlyc3QgIT0gbnVsbCkgewogICAgICAvLyBUT0RPKHNpZ211bmQpOiBkbyBvbmx5IGZvciBmdWxsIHByb2dyYW0KICAgICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IGxvYWRlci5maXJzdC5leHBvcnRTY29wZS5sb29rdXAoIm1haW4iLCAtMSwgbnVsbCk7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBBbWJpZ3VvdXNCdWlsZGVyKSB7CiAgICAgICAgQW1iaWd1b3VzQnVpbGRlciBwcm9ibGVtID0gZGVjbGFyYXRpb247CiAgICAgICAgZGVjbGFyYXRpb24gPSBwcm9ibGVtLmdldEZpcnN0RGVjbGFyYXRpb24oKTsKICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICAgIGNvbXBvbmVudC5tYWluTWV0aG9kID0gZGVjbGFyYXRpb24uYWN0dWFsUHJvY2VkdXJlOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIERpbGxNZW1iZXJCdWlsZGVyKSB7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLm1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICAgIGNvbXBvbmVudC5tYWluTWV0aG9kID0gZGVjbGFyYXRpb24ubWVtYmVyOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChtZXRhZGF0YUNvbGxlY3RvciAhPSBudWxsKSB7CiAgICAgIGNvbXBvbmVudC5hZGRNZXRhZGF0YVJlcG9zaXRvcnkobWV0YWRhdGFDb2xsZWN0b3IucmVwb3NpdG9yeSk7CiAgICB9CgogICAgdGlja2VyLmxvZ01zKCJMaW5rZWQgY29tcG9uZW50Iik7CiAgICByZXR1cm4gY29tcG9uZW50OwogIH0KCiAgdm9pZCBpbnN0YWxsRGVmYXVsdFN1cGVydHlwZXMoKSB7CiAgICBDbGFzcyBvYmplY3RDbGFzcyA9IHRoaXMub2JqZWN0Q2xhc3M7CiAgICBsb2FkZXIuYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gbG9hZGVyKSB7CiAgICAgICAgSXRlcmF0b3I8QnVpbGRlcj4gaXRlcmF0b3IgPSBsaWJyYXJ5Lml0ZXJhdG9yOwogICAgICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICBCdWlsZGVyIGRlY2xhcmF0aW9uID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBTb3VyY2VDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgICAgQ2xhc3MgY2xzID0gZGVjbGFyYXRpb24uY2xzOwogICAgICAgICAgICBpZiAoY2xzICE9IG9iamVjdENsYXNzKSB7CiAgICAgICAgICAgICAgY2xzLnN1cGVydHlwZSA/Pz0gb2JqZWN0Q2xhc3MuYXNSYXdTdXBlcnR5cGU7CiAgICAgICAgICAgICAgZGVjbGFyYXRpb24uc3VwZXJ0eXBlID8/PSBuZXcgTmFtZWRUeXBlQnVpbGRlcigKICAgICAgICAgICAgICAgICAgIk9iamVjdCIsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCksIG51bGwpCiAgICAgICAgICAgICAgICAuLmJpbmQob2JqZWN0Q2xhc3NCdWlsZGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICAgICAgY2xzLm1peGVkSW5UeXBlID0gZGVjbGFyYXRpb24ubWl4ZWRJblR5cGUuYnVpbGRNaXhlZEluVHlwZSgKICAgICAgICAgICAgICAgICAgbGlicmFyeSwgZGVjbGFyYXRpb24uY2hhck9mZnNldCwgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJJbnN0YWxsZWQgT2JqZWN0IGFzIGltcGxpY2l0IHN1cGVyY2xhc3MiKTsKICB9CgogIHZvaWQgaW5zdGFsbFN5bnRoZXRpY0NvbnN0cnVjdG9ycyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gYnVpbGRlcnMpIHsKICAgIENsYXNzIG9iamVjdENsYXNzID0gdGhpcy5vYmplY3RDbGFzczsKICAgIGZvciAoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgaW4gYnVpbGRlcnMpIHsKICAgICAgaWYgKGJ1aWxkZXIuY2xzICE9IG9iamVjdENsYXNzICYmICFidWlsZGVyLmlzUGF0Y2gpIHsKICAgICAgICBpZiAoYnVpbGRlci5pc1BhdGNoIHx8CiAgICAgICAgICAgIGJ1aWxkZXIuaXNNaXhpbkRlY2xhcmF0aW9uIHx8CiAgICAgICAgICAgIGJ1aWxkZXIuaXNFeHRlbnNpb24pIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYnVpbGRlci5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgIGluc3RhbGxGb3J3YXJkaW5nQ29uc3RydWN0b3JzKGJ1aWxkZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnN0YWxsRGVmYXVsdENvbnN0cnVjdG9yKGJ1aWxkZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGlja2VyLmxvZ01zKCJJbnN0YWxsZWQgc3ludGhldGljIGNvbnN0cnVjdG9ycyIpOwogIH0KCiAgTGlzdDxEZWxheWVkUGFyYW1ldGVyVHlwZT4gX2RlbGF5ZWRQYXJhbWV0ZXJUeXBlcyA9IDxEZWxheWVkUGFyYW1ldGVyVHlwZT5bXTsKCiAgLy8vIFVwZGF0ZSB0aGUgdHlwZSBvZiBwYXJhbWV0ZXJzIGNsb25lZCBmcm9tIHBhcmFtZXRlcnMgd2l0aCBpbmZlcnJlZAogIC8vLyBwYXJhbWV0ZXIgdHlwZXMuCiAgdm9pZCBfdXBkYXRlRGVsYXllZFBhcmFtZXRlclR5cGVzKCkgewogICAgZm9yIChEZWxheWVkUGFyYW1ldGVyVHlwZSBkZWxheWVkUGFyYW1ldGVyVHlwZSBpbiBfZGVsYXllZFBhcmFtZXRlclR5cGVzKSB7CiAgICAgIGRlbGF5ZWRQYXJhbWV0ZXJUeXBlLnVwZGF0ZVR5cGUoKTsKICAgIH0KICAgIF9kZWxheWVkUGFyYW1ldGVyVHlwZXMuY2xlYXIoKTsKICB9CgogIENsYXNzQnVpbGRlciBnZXQgb2JqZWN0Q2xhc3NCdWlsZGVyID0+IG9iamVjdFR5cGUuZGVjbGFyYXRpb247CgogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBvYmplY3RDbGFzc0J1aWxkZXIuY2xzOwoKICAvLy8gSWYgW2J1aWxkZXJdIGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9ycywgaW5zdGFsbCB0aGUgZGVmYXVsdHMuCiAgdm9pZCBpbnN0YWxsRGVmYXVsdENvbnN0cnVjdG9yKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyKSB7CiAgICBhc3NlcnQoIWJ1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKTsKICAgIGFzc2VydCghYnVpbGRlci5pc0V4dGVuc2lvbik7CiAgICAvLyBUT0RPKGFza2VzYyk6IE1ha2UgdGhpcyBjaGVjayBsaWdodC13ZWlnaHQgaW4gdGhlIGFic2VuY2Ugb2YgcGF0Y2hlcy4KICAgIGlmIChidWlsZGVyLmNscy5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSkgcmV0dXJuOwogICAgaWYgKGJ1aWxkZXIuY2xzLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycy5pc05vdEVtcHR5KSByZXR1cm47CiAgICBmb3IgKFByb2NlZHVyZSBwcm9jIGluIGJ1aWxkZXIuY2xzLnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2MuaXNGYWN0b3J5KSByZXR1cm47CiAgICB9CgogICAgSW5kZXhlZENsYXNzIGluZGV4ZWRDbGFzcyA9IGJ1aWxkZXIucmVmZXJlbmNlc0Zyb21JbmRleGVkOwogICAgQ29uc3RydWN0b3IgcmVmZXJlbmNlRnJvbTsKICAgIGlmIChpbmRleGVkQ2xhc3MgIT0gbnVsbCkgewogICAgICByZWZlcmVuY2VGcm9tID0gaW5kZXhlZENsYXNzLmxvb2t1cENvbnN0cnVjdG9yKCIiKTsKICAgIH0KCiAgICAvLy8gRnJvbSBbRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCA0dGggRWRpdGlvbl0oCiAgICAvLy8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VDTUEtNDA4LnBkZik6CiAgICAvLy8gPklmZiBubyBjb25zdHJ1Y3RvciBpcyBzcGVjaWZpZWQgZm9yIGEgY2xhc3MgQywgaXQgaW1wbGljaXRseSBoYXMgYQogICAgLy8vID5kZWZhdWx0IGNvbnN0cnVjdG9yIEMoKSA6IHN1cGVyKCkge30sIHVubGVzcyBDIGlzIGNsYXNzIE9iamVjdC4KICAgIC8vIFRoZSBzdXBlcmluaXRpYWxpemVyIGlzIGluc3RhbGxlZCBiZWxvdyBpbiBbZmluaXNoQ29uc3RydWN0b3JzXS4KICAgIGJ1aWxkZXIuYWRkU3ludGhldGljQ29uc3RydWN0b3IoCiAgICAgICAgbWFrZURlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyLmNscywgcmVmZXJlbmNlRnJvbSkpOwogIH0KCiAgdm9pZCBpbnN0YWxsRm9yd2FyZGluZ0NvbnN0cnVjdG9ycyhTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgYXNzZXJ0KGJ1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKTsKICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyICE9IGxvYWRlcikgcmV0dXJuOwogICAgaWYgKGJ1aWxkZXIuY2xzLmNvbnN0cnVjdG9ycy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIFRoZXNlIHdlcmUgaW5zdGFsbGVkIGJ5IGEgc3ViY2xhc3MgaW4gdGhlIHJlY3Vyc2l2ZSBjYWxsIGJlbG93LgogICAgICByZXR1cm47CiAgICB9CgogICAgLy8vIEZyb20gW0RhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgNHRoIEVkaXRpb25dKAogICAgLy8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTQwOC5wZGYpOgogICAgLy8vID5BIG1peGluIGFwcGxpY2F0aW9uIG9mIHRoZSBmb3JtIFMgd2l0aCBNOyBkZWZpbmVzIGEgY2xhc3MgQyB3aXRoCiAgICAvLy8gPnN1cGVyY2xhc3MgUy4KICAgIC8vLyA+Li4uCgogICAgLy8vID5MZXQgTE0gYmUgdGhlIGxpYnJhcnkgaW4gd2hpY2ggTSBpcyBkZWNsYXJlZC4gRm9yIGVhY2ggZ2VuZXJhdGl2ZQogICAgLy8vID5jb25zdHJ1Y3RvciBuYW1lZCBxaShUaTEgYWkxLCAuIC4gLiAsIFRpa2kgYWlraSksIGkgaW4gMS4ubiBvZiBTCiAgICAvLy8gPnRoYXQgaXMgYWNjZXNzaWJsZSB0byBMTSAsIEMgaGFzIGFuIGltcGxpY2l0bHkgZGVjbGFyZWQgY29uc3RydWN0b3IKICAgIC8vLyA+bmFtZWQgcSdpID0gW0MvU11xaSBvZiB0aGUgZm9ybSBxJ2koYWkxLC4uLixhaWtpKSA6CiAgICAvLy8gPnN1cGVyKGFpMSwuLi4sYWlraSk7LgogICAgVHlwZUJ1aWxkZXIgdHlwZSA9IGJ1aWxkZXIuc3VwZXJ0eXBlOwogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBzdXBlcnR5cGU7CiAgICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICAgIHN1cGVydHlwZSA9IHR5cGUuZGVjbGFyYXRpb247CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7dHlwZS5ydW50aW1lVHlwZX0iLCAiaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMiLAogICAgICAgICAgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLmZpbGVVcmkpOwogICAgfQogICAgaWYgKHN1cGVydHlwZSBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIFR5cGVBbGlhc0J1aWxkZXIgYWxpYXNCdWlsZGVyID0gc3VwZXJ0eXBlOwogICAgICBzdXBlcnR5cGUgPSBhbGlhc0J1aWxkZXIudW5hbGlhc0RlY2xhcmF0aW9uOwogICAgfQogICAgaWYgKHN1cGVydHlwZSBpcyBTb3VyY2VDbGFzc0J1aWxkZXIgJiYgc3VwZXJ0eXBlLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICBpbnN0YWxsRm9yd2FyZGluZ0NvbnN0cnVjdG9ycyhzdXBlcnR5cGUpOwogICAgfQoKICAgIEluZGV4ZWRDbGFzcyBpbmRleGVkQ2xhc3MgPSBidWlsZGVyLnJlZmVyZW5jZXNGcm9tSW5kZXhlZDsKICAgIENvbnN0cnVjdG9yIHJlZmVyZW5jZUZyb207CiAgICBpZiAoaW5kZXhlZENsYXNzICE9IG51bGwpIHsKICAgICAgcmVmZXJlbmNlRnJvbSA9IGluZGV4ZWRDbGFzcy5sb29rdXBDb25zdHJ1Y3RvcigiIik7CiAgICB9CgogICAgaWYgKHN1cGVydHlwZSBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgaWYgKHN1cGVydHlwZS5jbHMuY29uc3RydWN0b3JzLmlzRW1wdHkpIHsKICAgICAgICBidWlsZGVyLmFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yKAogICAgICAgICAgICBtYWtlRGVmYXVsdENvbnN0cnVjdG9yKGJ1aWxkZXIuY2xzLCByZWZlcmVuY2VGcm9tKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXAgPQogICAgICAgICAgICBidWlsZGVyLmdldFN1YnN0aXR1dGlvbk1hcChzdXBlcnR5cGUuY2xzKTsKICAgICAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIHN1cGVydHlwZS5jbHMuY29uc3RydWN0b3JzKSB7CiAgICAgICAgICBDb25zdHJ1Y3RvciByZWZlcmVuY2VGcm9tID0KICAgICAgICAgICAgICBpbmRleGVkQ2xhc3M/Lmxvb2t1cENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yLm5hbWUubmFtZSk7CgogICAgICAgICAgYnVpbGRlci5hZGRTeW50aGV0aWNDb25zdHJ1Y3RvcihtYWtlTWl4aW5BcHBsaWNhdGlvbkNvbnN0cnVjdG9yKAogICAgICAgICAgICAgIGJ1aWxkZXIuY2xzLAogICAgICAgICAgICAgIGJ1aWxkZXIuY2xzLm1peGluLAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgIHN1YnN0aXR1dGlvbk1hcCwKICAgICAgICAgICAgICByZWZlcmVuY2VGcm9tKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHN1cGVydHlwZSBpcyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlciB8fAogICAgICAgIHN1cGVydHlwZSBpcyBUeXBlVmFyaWFibGVCdWlsZGVyIHx8CiAgICAgICAgc3VwZXJ0eXBlIGlzIER5bmFtaWNUeXBlQnVpbGRlciB8fAogICAgICAgIHN1cGVydHlwZSBpcyBWb2lkVHlwZUJ1aWxkZXIgfHwKICAgICAgICBzdXBlcnR5cGUgaXMgTmV2ZXJUeXBlQnVpbGRlcikgewogICAgICBidWlsZGVyLmFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yKAogICAgICAgICAgbWFrZURlZmF1bHRDb25zdHJ1Y3RvcihidWlsZGVyLmNscywgcmVmZXJlbmNlRnJvbSkpOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke3N1cGVydHlwZS5ydW50aW1lVHlwZX0iLCAiaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnMiLAogICAgICAgICAgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLmZpbGVVcmkpOwogICAgfQogIH0KCiAgQ29uc3RydWN0b3IgbWFrZU1peGluQXBwbGljYXRpb25Db25zdHJ1Y3RvcigKICAgICAgQ2xhc3MgY2xzLAogICAgICBDbGFzcyBtaXhpbiwKICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IsCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwLAogICAgICBDb25zdHJ1Y3RvciByZWZlcmVuY2VGcm9tKSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNvcHlGb3JtYWwoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwpIHsKICAgICAgLy8gVE9ETyhhaGUpOiBIYW5kbGUgaW5pdGlhbGl6ZXJzLgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNvcHkgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihmb3JtYWwubmFtZSwKICAgICAgICAgIGlzRmluYWw6IGZvcm1hbC5pc0ZpbmFsLCBpc0NvbnN0OiBmb3JtYWwuaXNDb25zdCk7CiAgICAgIGlmIChmb3JtYWwudHlwZSAhPSBudWxsKSB7CiAgICAgICAgY29weS50eXBlID0gc3Vic3RpdHV0ZShmb3JtYWwudHlwZSwgc3Vic3RpdHV0aW9uTWFwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfZGVsYXllZFBhcmFtZXRlclR5cGVzCiAgICAgICAgICAgIC5hZGQobmV3IERlbGF5ZWRQYXJhbWV0ZXJUeXBlKGZvcm1hbCwgY29weSwgc3Vic3RpdHV0aW9uTWFwKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBuYW1lZFBhcmFtZXRlcnMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCA9IDxFeHByZXNzaW9uPltdOwogICAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkID0gPE5hbWVkRXhwcmVzc2lvbj5bXTsKICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwKICAgICAgICBpbiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQoY29weUZvcm1hbChmb3JtYWwpKTsKICAgICAgcG9zaXRpb25hbC5hZGQobmV3IFZhcmlhYmxlR2V0KHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxhc3QpKTsKICAgIH0KICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBmb3JtYWwgaW4gY29uc3RydWN0b3IuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY2xvbmUgPSBjb3B5Rm9ybWFsKGZvcm1hbCk7CiAgICAgIGNsb25lZEZvcm1hbHMuLmFkZChmb3JtYWwpLi5hZGQoY2xvbmUpLi5hZGQoc3Vic3RpdHV0aW9uTWFwKTsKICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChjbG9uZSk7CiAgICAgIG5hbWVkLmFkZChuZXcgTmFtZWRFeHByZXNzaW9uKAogICAgICAgICAgZm9ybWFsLm5hbWUsIG5ldyBWYXJpYWJsZUdldChuYW1lZFBhcmFtZXRlcnMubGFzdCkpKTsKICAgIH0KICAgIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUobmV3IEVtcHR5U3RhdGVtZW50KCksCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgICAgcmV0dXJuVHlwZTogbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShjbHMpKTsKICAgIFN1cGVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgU3VwZXJJbml0aWFsaXplcigKICAgICAgICBjb25zdHJ1Y3RvciwgbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsLCBuYW1lZDogbmFtZWQpKTsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24sCiAgICAgICAgbmFtZTogY29uc3RydWN0b3IubmFtZSwKICAgICAgICBpbml0aWFsaXplcnM6IDxJbml0aWFsaXplcj5baW5pdGlhbGl6ZXJdLAogICAgICAgIGlzU3ludGhldGljOiB0cnVlLAogICAgICAgIGlzQ29uc3Q6IGNvbnN0cnVjdG9yLmlzQ29uc3QgJiYgbWl4aW4uZmllbGRzLmlzRW1wdHksCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgIC4uaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGNscy5lbmNsb3NpbmdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CiAgfQoKICB2b2lkIGZpbmlzaENsb25lZFBhcmFtZXRlcnMoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsb25lZEZvcm1hbHMubGVuZ3RoOyBpICs9IDMpIHsKICAgICAgLy8gTm90ZSB0aGF0IFtvcmlnaW5hbF0gbWF5IGl0c2VsZiBiZSBjbG9uZS4gSWYgc28sIGl0IHdhcyBhZGRlZCB0bwogICAgICAvLyBbY2xvbmVkRm9ybWFsc10gYmVmb3JlIFtjbG9uZV0sIHNvIGl0J3MgaW5pdGlhbGl6ZXJzIGFyZSBhbHJlYWR5IGluCiAgICAgIC8vIHBsYWNlLgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIG9yaWdpbmFsID0gY2xvbmVkRm9ybWFsc1tpXTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBjbG9uZSA9IGNsb25lZEZvcm1hbHNbaSArIDFdOwogICAgICBpZiAob3JpZ2luYWwuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oYWhlKTogSXQgaXMgdW5jbGVhciBpZiBpdCBpcyBsZWdhbCB0byB1c2UgdHlwZSB2YXJpYWJsZXMgaW4KICAgICAgICAvLyBkZWZhdWx0IHZhbHVlcywgYnV0IEZhc3RhIGlzIGN1cnJlbnRseSBhbGxvd2luZyBpdCwgYW5kIHRoZSBWTQogICAgICAgIC8vIGFjY2VwdHMgaXQuIElmIGl0IGlzbid0IGxlZ2FsLCB0aGUgd2UgY2FuIHNwZWVkIHRoaXMgdXAgYnkgdXNpbmcgYQogICAgICAgIC8vIHNpbmdsZSBjbG9uZXIgd2l0aG91dCBzdWJzdGl0dXRpb24uCiAgICAgICAgQ2xvbmVWaXNpdG9yTm90TWVtYmVycyBjbG9uZXIgPQogICAgICAgICAgICBuZXcgQ2xvbmVWaXNpdG9yTm90TWVtYmVycyh0eXBlU3Vic3RpdHV0aW9uOiBjbG9uZWRGb3JtYWxzW2kgKyAyXSk7CiAgICAgICAgY2xvbmUuaW5pdGlhbGl6ZXIgPSBjbG9uZXIuY2xvbmUob3JpZ2luYWwuaW5pdGlhbGl6ZXIpLi5wYXJlbnQgPSBjbG9uZTsKICAgICAgfQogICAgfQogICAgY2xvbmVkRm9ybWFscy5jbGVhcigpOwogICAgdGlja2VyLmxvZ01zKCJDbG9uZWQgZGVmYXVsdCB2YWx1ZXMgb2YgZm9ybWFscyIpOwogIH0KCiAgQ29uc3RydWN0b3IgbWFrZURlZmF1bHRDb25zdHJ1Y3RvcigKICAgICAgQ2xhc3MgZW5jbG9zaW5nQ2xhc3MsIENvbnN0cnVjdG9yIHJlZmVyZW5jZUZyb20pIHsKICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoCiAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShuZXcgRW1wdHlTdGF0ZW1lbnQoKSwKICAgICAgICAgICAgcmV0dXJuVHlwZTogbWFrZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShlbmNsb3NpbmdDbGFzcykpLAogICAgICAgIG5hbWU6IG5ldyBOYW1lKCIiKSwKICAgICAgICBpc1N5bnRoZXRpYzogdHJ1ZSwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0KICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKICB9CgogIERhcnRUeXBlIG1ha2VDb25zdHJ1Y3RvclJldHVyblR5cGUoQ2xhc3MgZW5jbG9zaW5nQ2xhc3MpIHsKICAgIExpc3Q8RGFydFR5cGU+IHR5cGVQYXJhbWV0ZXJUeXBlcyA9IG5ldyBMaXN0PERhcnRUeXBlPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgdHlwZVBhcmFtZXRlclR5cGVzLmFkZCgKICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS53aXRoRGVmYXVsdE51bGxhYmlsaXR5Rm9yTGlicmFyeSgKICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLCBlbmNsb3NpbmdDbGFzcy5lbmNsb3NpbmdMaWJyYXJ5KSk7CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgZW5jbG9zaW5nQ2xhc3MuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSwgdHlwZVBhcmFtZXRlclR5cGVzKTsKICB9CgogIHZvaWQgc2V0dXBUb3BBbmRCb3R0b21UeXBlcygpIHsKICAgIG9iamVjdFR5cGUKICAgICAgICAuYmluZChsb2FkZXIuY29yZUxpYnJhcnkubG9va3VwTG9jYWxNZW1iZXIoIk9iamVjdCIsIHJlcXVpcmVkOiB0cnVlKSk7CgogICAgQ2xhc3NCdWlsZGVyIG51bGxDbGFzc0J1aWxkZXIgPQogICAgICAgIGxvYWRlci5jb3JlTGlicmFyeS5sb29rdXBMb2NhbE1lbWJlcigiTnVsbCIsIHJlcXVpcmVkOiB0cnVlKTsKICAgIG51bGxDbGFzc0J1aWxkZXIuaXNOdWxsQ2xhc3MgPSB0cnVlOwogICAgYm90dG9tVHlwZS5iaW5kKG51bGxDbGFzc0J1aWxkZXIpOwogIH0KCiAgdm9pZCBjb21wdXRlQ29yZVR5cGVzKCkgewogICAgTGlzdDxMaWJyYXJ5PiBsaWJyYXJpZXMgPSA8TGlicmFyeT5bXTsKICAgIGZvciAoU3RyaW5nIHBsYXRmb3JtTGlicmFyeSBpbiBbCiAgICAgICJkYXJ0Ol9pbnRlcm5hbCIsCiAgICAgICJkYXJ0OmFzeW5jIiwKICAgICAgImRhcnQ6Y29yZSIsCiAgICAgICJkYXJ0Om1pcnJvcnMiLAogICAgICAuLi5iYWNrZW5kVGFyZ2V0LmV4dHJhSW5kZXhlZExpYnJhcmllcwogICAgXSkgewogICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHBsYXRmb3JtTGlicmFyeSk7CiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyID0gbG9hZGVyLmJ1aWxkZXJzW3VyaV07CiAgICAgIGlmIChsaWJyYXJ5QnVpbGRlciA9PSBudWxsKSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGtlcm5lbF9kcml2ZXJfdGVzdCBvcgogICAgICAgIC8vIGtlcm5lbF9kcml2ZXIuCiAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGZvciAoTGlicmFyeSB0YXJnZXQgaW4gZGlsbFRhcmdldC5sb2FkZXIubGlicmFyaWVzKSB7CiAgICAgICAgICBpZiAodGFyZ2V0LmltcG9ydFVyaSA9PSB1cmkpIHsKICAgICAgICAgICAgbGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWZvdW5kICYmIHVyaS5wYXRoICE9ICJtaXJyb3JzIikgewogICAgICAgICAgLy8gZGFydDptaXJyb3JzIGlzIG9wdGlvbmFsLgogICAgICAgICAgdGhyb3cgIkNhbid0IGZpbmQgJHVyaSI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICAgIH0KICAgIH0KICAgIENvbXBvbmVudCBwbGF0Zm9ybUxpYnJhcmllcyA9CiAgICAgICAgYmFja2VuZFRhcmdldC5jb25maWd1cmVDb21wb25lbnQobmV3IENvbXBvbmVudCgpKTsKICAgIC8vIEFkZCBsaWJyYXJpZXMgZGlyZWN0bHkgdG8gcHJldmVudCB0aGF0IHRoZWlyIHBhcmVudHMgYXJlIGNoYW5nZWQuCiAgICBwbGF0Zm9ybUxpYnJhcmllcy5saWJyYXJpZXMuYWRkQWxsKGxpYnJhcmllcyk7CiAgICBsb2FkZXIuY29tcHV0ZUNvcmVUeXBlcyhwbGF0Zm9ybUxpYnJhcmllcyk7CiAgfQoKICB2b2lkIGZpbmlzaEFsbENvbnN0cnVjdG9ycyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gYnVpbGRlcnMpIHsKICAgIENsYXNzIG9iamVjdENsYXNzID0gdGhpcy5vYmplY3RDbGFzczsKICAgIGZvciAoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgaW4gYnVpbGRlcnMpIHsKICAgICAgQ2xhc3MgY2xzID0gYnVpbGRlci5jbHM7CiAgICAgIGlmIChjbHMgIT0gb2JqZWN0Q2xhc3MpIHsKICAgICAgICBmaW5pc2hDb25zdHJ1Y3RvcnMoYnVpbGRlcik7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiRmluaXNoZWQgY29uc3RydWN0b3JzIik7CiAgfQoKICAvLy8gRW5zdXJlIGNvbnN0cnVjdG9ycyBvZiBbYnVpbGRlcl0gaGF2ZSB0aGUgY29ycmVjdCBpbml0aWFsaXplcnMgYW5kIG90aGVyCiAgLy8vIHJlcXVpcmVtZW50cy4KICB2b2lkIGZpbmlzaENvbnN0cnVjdG9ycyhTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlcikgewogICAgaWYgKGJ1aWxkZXIuaXNQYXRjaCkgcmV0dXJuOwogICAgQ2xhc3MgY2xzID0gYnVpbGRlci5jbHM7CgogICAgLy8vIFF1b3RlcyBiZWxvdyBhcmUgZnJvbSBbRGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCA0dGgKICAgIC8vLyBFZGl0aW9uXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS00MDgucGRmKToKICAgIExpc3Q8RmllbGQ+IHVuaW5pdGlhbGl6ZWRGaWVsZHMgPSA8RmllbGQ+W107CiAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGNscy5maWVsZHMpIHsKICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVyID09IG51bGwpIHsKICAgICAgICB1bmluaXRpYWxpemVkRmllbGRzLmFkZChmaWVsZCk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8RmllbGRCdWlsZGVyPiBub25GaW5hbEZpZWxkcyA9IDxGaWVsZEJ1aWxkZXI+W107CiAgICBMaXN0PEZpZWxkQnVpbGRlcj4gbGF0ZUZpbmFsRmllbGRzID0gPEZpZWxkQnVpbGRlcj5bXTsKICAgIGJ1aWxkZXIuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgZmllbGRCdWlsZGVyKSB7CiAgICAgIGlmIChmaWVsZEJ1aWxkZXIgaXMgRmllbGRCdWlsZGVyKSB7CiAgICAgICAgaWYgKGZpZWxkQnVpbGRlci5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIgJiYgIWZpZWxkQnVpbGRlci5pc0ZpbmFsKSB7CiAgICAgICAgICBub25GaW5hbEZpZWxkcy5hZGQoZmllbGRCdWlsZGVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpZWxkQnVpbGRlci5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgICAgZmllbGRCdWlsZGVyLmlzTGF0ZSAmJgogICAgICAgICAgICBmaWVsZEJ1aWxkZXIuaXNGaW5hbCkgewogICAgICAgICAgbGF0ZUZpbmFsRmllbGRzLmFkZChmaWVsZEJ1aWxkZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBNYXA8Q29uc3RydWN0b3IsIFNldDxGaWVsZD4+IGNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRGaWVsZHMgPQogICAgICAgIDxDb25zdHJ1Y3RvciwgU2V0PEZpZWxkPj57fTsKICAgIENvbnN0cnVjdG9yIHN1cGVyVGFyZ2V0OwogICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBpbiBjbHMuY29uc3RydWN0b3JzKSB7CiAgICAgIGJvb2wgaXNSZWRpcmVjdGluZyA9IGZhbHNlOwogICAgICBmb3IgKEluaXRpYWxpemVyIGluaXRpYWxpemVyIGluIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycykgewogICAgICAgIGlmIChpbml0aWFsaXplciBpcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgICAgICBpZiAoY29uc3RydWN0b3IuaXNDb25zdCAmJiAhaW5pdGlhbGl6ZXIudGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgICAgICAgYnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0LAogICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaW5pdGlhbGl6ZXIudGFyZ2V0Lm5hbWUubmFtZS5sZW5ndGgpOwogICAgICAgICAgfQogICAgICAgICAgaXNSZWRpcmVjdGluZyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFpc1JlZGlyZWN0aW5nKSB7CiAgICAgICAgLy8vID5JZiBubyBzdXBlcmluaXRpYWxpemVyIGlzIHByb3ZpZGVkLCBhbiBpbXBsaWNpdCBzdXBlcmluaXRpYWxpemVyCiAgICAgICAgLy8vID5vZiB0aGUgZm9ybSBzdXBlcigpIGlzIGFkZGVkIGF0IHRoZSBlbmQgb2Yga+KAmXMgaW5pdGlhbGl6ZXIgbGlzdCwKICAgICAgICAvLy8gPnVubGVzcyB0aGUgZW5jbG9zaW5nIGNsYXNzIGlzIGNsYXNzIE9iamVjdC4KICAgICAgICBpZiAoY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmlzRW1wdHkpIHsKICAgICAgICAgIHN1cGVyVGFyZ2V0ID8/PSBkZWZhdWx0U3VwZXJDb25zdHJ1Y3RvcihjbHMpOwogICAgICAgICAgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXI7CiAgICAgICAgICBpZiAoc3VwZXJUYXJnZXQgPT0gbnVsbCkgewogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gY29uc3RydWN0b3IuZmlsZU9mZnNldDsKICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBjb25zdHJ1Y3Rvci5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAgIG9mZnNldCA9IGNscy5maWxlT2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoY2xzLnN1cGVyY2xhc3MubmFtZSksCiAgICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgICAgIGluaXRpYWxpemVyID0gbmV3IEludmFsaWRJbml0aWFsaXplcigpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5pdGlhbGl6ZXIgPQogICAgICAgICAgICAgICAgbmV3IFN1cGVySW5pdGlhbGl6ZXIoc3VwZXJUYXJnZXQsIG5ldyBBcmd1bWVudHMuZW1wdHkoKSkKICAgICAgICAgICAgICAgICAgLi5pc1N5bnRoZXRpYyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKGluaXRpYWxpemVyKTsKICAgICAgICAgIGluaXRpYWxpemVyLnBhcmVudCA9IGNvbnN0cnVjdG9yOwogICAgICAgIH0KICAgICAgICBpZiAoY29uc3RydWN0b3IuZnVuY3Rpb24uYm9keSA9PSBudWxsKSB7CiAgICAgICAgICAvLy8gPklmIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBjIGlzIG5vdCBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yCiAgICAgICAgICAvLy8gPmFuZCBubyBib2R5IGlzIHByb3ZpZGVkLCB0aGVuIGMgaW1wbGljaXRseSBoYXMgYW4gZW1wdHkgYm9keSB7fS4KICAgICAgICAgIC8vLyBXZSB1c2UgYW4gZW1wdHkgc3RhdGVtZW50IGluc3RlYWQuCiAgICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ID0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5LnBhcmVudCA9IGNvbnN0cnVjdG9yLmZ1bmN0aW9uOwogICAgICAgIH0KCiAgICAgICAgU2V0PEZpZWxkPiBteUluaXRpYWxpemVkRmllbGRzID0gbmV3IFNldDxGaWVsZD4oKTsKICAgICAgICBmb3IgKEluaXRpYWxpemVyIGluaXRpYWxpemVyIGluIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycykgewogICAgICAgICAgaWYgKGluaXRpYWxpemVyIGlzIEZpZWxkSW5pdGlhbGl6ZXIpIHsKICAgICAgICAgICAgbXlJbml0aWFsaXplZEZpZWxkcy5hZGQoaW5pdGlhbGl6ZXIuZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsCiAgICAgICAgICAgIGluIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgICAgICBpZiAoZm9ybWFsLmlzRmllbGRGb3JtYWwpIHsKICAgICAgICAgICAgQnVpbGRlciBmaWVsZEJ1aWxkZXIgPQogICAgICAgICAgICAgICAgYnVpbGRlci5zY29wZS5sb29rdXBMb2NhbE1lbWJlcihmb3JtYWwubmFtZSwgc2V0dGVyOiBmYWxzZSkgPz8KICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm9yaWdpbi5zY29wZQogICAgICAgICAgICAgICAgICAgICAgICAubG9va3VwTG9jYWxNZW1iZXIoZm9ybWFsLm5hbWUsIHNldHRlcjogZmFsc2UpOwogICAgICAgICAgICAvLyBJZiBuZXh0IGlzIG5vdCBudWxsIGl0J3MgYSBkdXBsaWNhdGVkIGZpZWxkLAogICAgICAgICAgICAvLyBhbmQgaXQgZG9lc24ndCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIG51bGwgYmVsb3cKICAgICAgICAgICAgLy8gKGFuZCBkb2luZyBpdCB3aWxsIGNyYXNoIHNlcmlhbGl6YXRpb24pLgogICAgICAgICAgICBpZiAoZmllbGRCdWlsZGVyPy5uZXh0ID09IG51bGwgJiYgZmllbGRCdWlsZGVyIGlzIEZpZWxkQnVpbGRlcikgewogICAgICAgICAgICAgIG15SW5pdGlhbGl6ZWRGaWVsZHMuYWRkKGZpZWxkQnVpbGRlci5maWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3RydWN0b3JJbml0aWFsaXplZEZpZWxkc1tjb25zdHJ1Y3Rvcl0gPSBteUluaXRpYWxpemVkRmllbGRzOwogICAgICAgIGlmIChjb25zdHJ1Y3Rvci5pc0NvbnN0ICYmIG5vbkZpbmFsRmllbGRzLmlzTm90RW1wdHkpIHsKICAgICAgICAgIGJ1aWxkZXIuYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGQsCiAgICAgICAgICAgICAgY29uc3RydWN0b3IuZmlsZU9mZnNldCwgbm9MZW5ndGgsCiAgICAgICAgICAgICAgY29udGV4dDogbm9uRmluYWxGaWVsZHMKICAgICAgICAgICAgICAgICAgLm1hcCgoZmllbGQpID0+IG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGZpZWxkLmZpbGVVcmksIGZpZWxkLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgLnRvTGlzdCgpKTsKICAgICAgICAgIG5vbkZpbmFsRmllbGRzLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBidWlsZGVyLmxpYnJhcnk7CiAgICAgICAgaWYgKGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci5wZXJmb3JtTm5iZENoZWNrcykgewogICAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3QgJiYgbGF0ZUZpbmFsRmllbGRzLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgaWYgKGxpYnJhcnkubG9hZGVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICAgICAgYnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRFcnJvciwKICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuZmlsZU9mZnNldCwgbm9MZW5ndGgsCiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxhdGVGaW5hbEZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZmllbGQpID0+IG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRDYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbGVVcmksIGZpZWxkLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICAgIC50b0xpc3QoKSk7CiAgICAgICAgICAgICAgbGF0ZUZpbmFsRmllbGRzLmNsZWFyKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRXYXJuaW5nLAogICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5maWxlT2Zmc2V0LCBub0xlbmd0aCwKICAgICAgICAgICAgICAgICAgY29udGV4dDogbGF0ZUZpbmFsRmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAubWFwKChmaWVsZCkgPT4gbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZENhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsZVVyaSwgZmllbGQuY2hhck9mZnNldCwgbm9MZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgLnRvTGlzdCgpKTsKICAgICAgICAgICAgICBsYXRlRmluYWxGaWVsZHMuY2xlYXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgU2V0PEZpZWxkPiBpbml0aWFsaXplZEZpZWxkczsKICAgIGNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRGaWVsZHMKICAgICAgICAuZm9yRWFjaCgoQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIFNldDxGaWVsZD4gZmllbGRzKSB7CiAgICAgIGlmIChpbml0aWFsaXplZEZpZWxkcyA9PSBudWxsKSB7CiAgICAgICAgaW5pdGlhbGl6ZWRGaWVsZHMgPSBuZXcgU2V0PEZpZWxkPi5mcm9tKGZpZWxkcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5pdGlhbGl6ZWRGaWVsZHMuYWRkQWxsKGZpZWxkcyk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIFJ1biB0aHJvdWdoIGFsbCBmaWVsZHMgdGhhdCBhcmVuJ3QgaW5pdGlhbGl6ZWQgYnkgYW55IGNvbnN0cnVjdG9yLCBhbmQKICAgIC8vIHNldCB0aGVpciBpbml0aWFsaXplciB0byBgbnVsbGAuCiAgICBmb3IgKEZpZWxkIGZpZWxkIGluIHVuaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgICAgaWYgKGluaXRpYWxpemVkRmllbGRzID09IG51bGwgfHwgIWluaXRpYWxpemVkRmllbGRzLmNvbnRhaW5zKGZpZWxkKSkgewogICAgICAgIGlmICghZmllbGQuaXNMYXRlKSB7CiAgICAgICAgICBmaWVsZC5pbml0aWFsaXplciA9IG5ldyBOdWxsTGl0ZXJhbCgpLi5wYXJlbnQgPSBmaWVsZDsKICAgICAgICAgIGlmIChmaWVsZC5pc0ZpbmFsICYmCiAgICAgICAgICAgICAgKGNscy5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSB8fCBjbHMuaXNNaXhpbkRlY2xhcmF0aW9uKSkgewogICAgICAgICAgICBTdHJpbmcgdXJpID0gJyR7ZmllbGQuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcml9JzsKICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWVsZC5maWxlVXJpLnBhdGhTZWdtZW50cy5sYXN0OwogICAgICAgICAgICBpZiAodXJpID09ICdkYXJ0Omh0bWwnIHx8CiAgICAgICAgICAgICAgICB1cmkgPT0gJ2RhcnQ6c3ZnJyB8fAogICAgICAgICAgICAgICAgdXJpID09ICdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YScgfHwKICAgICAgICAgICAgICAgIHVyaSA9PSAnZGFydDpfaW50ZXJjZXB0b3JzJyAmJiBmaWxlID09ICdqc19zdHJpbmcuZGFydCcpIHsKICAgICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgZXh0ZXJuYWwgZ2V0dGVycyBpbnN0ZWFkIG9mIGZpbmFsCiAgICAgICAgICAgICAgLy8gZmllbGRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMzNzYyCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnVpbGRlci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUpLAogICAgICAgICAgICAgICAgICBmaWVsZC5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgICBmaWVsZC5maWxlVXJpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlIGlzISBJbnZhbGlkVHlwZSAmJgogICAgICAgICAgICAgIGZpZWxkLnR5cGUuaXNQb3RlbnRpYWxseU5vbk51bGxhYmxlICYmCiAgICAgICAgICAgICAgKGNscy5jb25zdHJ1Y3RvcnMuaXNOb3RFbXB0eSB8fCBjbHMuaXNNaXhpbkRlY2xhcmF0aW9uKSkgewogICAgICAgICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gYnVpbGRlci5saWJyYXJ5OwogICAgICAgICAgICBpZiAobGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmCiAgICAgICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci5wZXJmb3JtTm5iZENoZWNrcykgewogICAgICAgICAgICAgIGlmIChsaWJyYXJ5LmxvYWRlci5ubmJkU3Ryb25nTW9kZSkgewogICAgICAgICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZpZWxkLm5hbWUubmFtZSwgZmllbGQudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuZmlsZVVyaSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJXYXJuaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZpZWxkLm5hbWUubmFtZSwgZmllbGQudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGxpYnJhcnkuZmlsZVVyaSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gUnVuIHRocm91Z2ggYWxsIGZpZWxkcyB0aGF0IGFyZSBpbml0aWFsaXplZCBieSBzb21lIGNvbnN0cnVjdG9yLCBhbmQKICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCBvdGhlciBjb25zdHJ1Y3RvcnMgYWxzbyBpbml0aWFsaXplIHRoZW0uCiAgICBjb25zdHJ1Y3RvckluaXRpYWxpemVkRmllbGRzCiAgICAgICAgLmZvckVhY2goKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBTZXQ8RmllbGQ+IGZpZWxkcykgewogICAgICBmb3IgKEZpZWxkIGZpZWxkIGluIGluaXRpYWxpemVkRmllbGRzLmRpZmZlcmVuY2UoZmllbGRzKSkgewogICAgICAgIGlmIChmaWVsZC5pbml0aWFsaXplciA9PSBudWxsKSB7CiAgICAgICAgICBGaWVsZEluaXRpYWxpemVyIGluaXRpYWxpemVyID0KICAgICAgICAgICAgICBuZXcgRmllbGRJbml0aWFsaXplcihmaWVsZCwgbmV3IE51bGxMaXRlcmFsKCkpCiAgICAgICAgICAgICAgICAuLmlzU3ludGhldGljID0gdHJ1ZTsKICAgICAgICAgIGluaXRpYWxpemVyLnBhcmVudCA9IGNvbnN0cnVjdG9yOwogICAgICAgICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmluc2VydCgwLCBpbml0aWFsaXplcik7CiAgICAgICAgICBpZiAoZmllbGQuaXNGaW5hbCkgewogICAgICAgICAgICBidWlsZGVyLmxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZpZWxkLm5hbWUubmFtZSksCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgY29uc3RydWN0b3IubmFtZS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmZpbGVVcmksCiAgICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZpZWxkLm5hbWUubmFtZSkKICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oZmllbGQuZmlsZVVyaSwgZmllbGQuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLm5hbWUubGVuZ3RoKQogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgaXMhIEludmFsaWRUeXBlICYmCiAgICAgICAgICAgICAgZmllbGQudHlwZS5pc1BvdGVudGlhbGx5Tm9uTnVsbGFibGUpIHsKICAgICAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXIubGlicmFyeTsKICAgICAgICAgICAgaWYgKGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgICAgICAgICBpZiAobGlicmFyeS5sb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JFcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUsIGZpZWxkLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LmZpbGVVcmkpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmaWVsZC5uYW1lLm5hbWUsIGZpZWxkLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LmZpbGVVcmkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICAvLy8gUnVuIGFsbCB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBhcmUgbmVlZGVkIHdoZW4gYnVpbGRpbmcgYSBidW5kbGUgb2YKICAvLy8gbGlicmFyaWVzIGZvciB0aGUgZmlyc3QgdGltZS4KICB2b2lkIHJ1bkJ1aWxkVHJhbnNmb3JtYXRpb25zKCkgewogICAgYmFja2VuZFRhcmdldC5wZXJmb3JtUHJlQ29uc3RhbnRFdmFsdWF0aW9uVHJhbnNmb3JtYXRpb25zKAogICAgICAgIGNvbXBvbmVudCwKICAgICAgICBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIGxvYWRlci5saWJyYXJpZXMsCiAgICAgICAgbmV3IEtlcm5lbERpYWdub3N0aWNSZXBvcnRlcihsb2FkZXIpLAogICAgICAgIGxvZ2dlcjogKFN0cmluZyBtc2cpID0+IHRpY2tlci5sb2dNcyhtc2cpKTsKCiAgICBUeXBlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPQogICAgICAgIG5ldyBUeXBlRW52aXJvbm1lbnQobG9hZGVyLmNvcmVUeXBlcywgbG9hZGVyLmhpZXJhcmNoeSk7CiAgICBjb25zdGFudHMuRXZhbHVhdGlvbk1vZGUgZXZhbHVhdGlvbk1vZGU7CiAgICBpZiAoZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgaWYgKGxvYWRlci5ubmJkU3Ryb25nTW9kZSkgewogICAgICAgIGV2YWx1YXRpb25Nb2RlID0gY29uc3RhbnRzLkV2YWx1YXRpb25Nb2RlLnN0cm9uZzsKICAgICAgfSBlbHNlIHsKICAgICAgICBldmFsdWF0aW9uTW9kZSA9IGNvbnN0YW50cy5FdmFsdWF0aW9uTW9kZS53ZWFrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBldmFsdWF0aW9uTW9kZSA9IGNvbnN0YW50cy5FdmFsdWF0aW9uTW9kZS5sZWdhY3k7CiAgICB9CgogICAgY29uc3RhbnRzLnRyYW5zZm9ybUxpYnJhcmllcygKICAgICAgICBsb2FkZXIubGlicmFyaWVzLAogICAgICAgIGJhY2tlbmRUYXJnZXQuY29uc3RhbnRzQmFja2VuZChsb2FkZXIuY29yZVR5cGVzKSwKICAgICAgICBlbnZpcm9ubWVudERlZmluZXMsCiAgICAgICAgZW52aXJvbm1lbnQsCiAgICAgICAgbmV3IEtlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlcihsb2FkZXIpLAogICAgICAgIGV2YWx1YXRpb25Nb2RlLAogICAgICAgIGRlc3VnYXJTZXRzOiAhYmFja2VuZFRhcmdldC5zdXBwb3J0c1NldExpdGVyYWxzLAogICAgICAgIGVuYWJsZVRyaXBsZVNoaWZ0OiBlbmFibGVUcmlwbGVTaGlmdCwKICAgICAgICBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudDogZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQpOwogICAgdGlja2VyLmxvZ01zKCJFdmFsdWF0ZWQgY29uc3RhbnRzIik7CgogICAgYmFja2VuZFRhcmdldC5wZXJmb3JtTW9kdWxhclRyYW5zZm9ybWF0aW9uc09uTGlicmFyaWVzKAogICAgICAgIGNvbXBvbmVudCwKICAgICAgICBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIGxvYWRlci5oaWVyYXJjaHksCiAgICAgICAgbG9hZGVyLmxpYnJhcmllcywKICAgICAgICBlbnZpcm9ubWVudERlZmluZXMsCiAgICAgICAgbmV3IEtlcm5lbERpYWdub3N0aWNSZXBvcnRlcihsb2FkZXIpLAogICAgICAgIGxvYWRlci5yZWZlcmVuY2VGcm9tSW5kZXgsCiAgICAgICAgbG9nZ2VyOiAoU3RyaW5nIG1zZykgPT4gdGlja2VyLmxvZ01zKG1zZyksCiAgICAgICAgY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyOiBjaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIpOwogIH0KCiAgQ2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVyIGdldCBjaGFuZ2VkU3RydWN0dXJlTm90aWZpZXIgPT4gbnVsbDsKCiAgdm9pZCBydW5Qcm9jZWR1cmVUcmFuc2Zvcm1hdGlvbnMoUHJvY2VkdXJlIHByb2NlZHVyZSkgewogICAgYmFja2VuZFRhcmdldC5wZXJmb3JtVHJhbnNmb3JtYXRpb25zT25Qcm9jZWR1cmUoCiAgICAgICAgbG9hZGVyLmNvcmVUeXBlcywgbG9hZGVyLmhpZXJhcmNoeSwgcHJvY2VkdXJlLAogICAgICAgIGxvZ2dlcjogKFN0cmluZyBtc2cpID0+IHRpY2tlci5sb2dNcyhtc2cpKTsKICB9CgogIHZvaWQgdmVyaWZ5KCkgewogICAgLy8gVE9ETyhhaGUpOiBIb3cgdG8gaGFuZGxlIGVycm9ycy4KICAgIHZlcmlmeUNvbXBvbmVudChjb21wb25lbnQpOwogICAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5ID0KICAgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHkoY29tcG9uZW50LCBuZXcgQ29yZVR5cGVzKGNvbXBvbmVudCksCiAgICAgICAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlczogKENsYXNzIGNscywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgICAgIC8vIEFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCiAgICB9KTsKICAgIHZlcmlmeUdldFN0YXRpY1R5cGUoCiAgICAgICAgbmV3IFR5cGVFbnZpcm9ubWVudChsb2FkZXIuY29yZVR5cGVzLCBoaWVyYXJjaHkpLCBjb21wb25lbnQpOwogICAgdGlja2VyLmxvZ01zKCJWZXJpZmllZCBjb21wb25lbnQiKTsKICB9CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbbGlicmFyeV0gd2FzIGJ1aWx0IGJ5IHRoaXMgW0tlcm5lbFRhcmdldF0KICAvLy8gZnJvbSBzb3VyY2VzLCBhbmQgbm90IGxvYWRlZCBmcm9tIGEgW0RpbGxUYXJnZXRdLgogIGJvb2wgaXNTb3VyY2VMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgcmV0dXJuIGxvYWRlci5saWJyYXJpZXMuY29udGFpbnMobGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlYWRQYXRjaEZpbGVzKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIGFzc2VydChsaWJyYXJ5LmltcG9ydFVyaS5zY2hlbWUgPT0gImRhcnQiKTsKICAgIExpc3Q8VXJpPiBwYXRjaGVzID0gdXJpVHJhbnNsYXRvci5nZXREYXJ0UGF0Y2hlcyhsaWJyYXJ5LmltcG9ydFVyaS5wYXRoKTsKICAgIGlmIChwYXRjaGVzICE9IG51bGwpIHsKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgZmlyc3Q7CiAgICAgIGZvciAoVXJpIHBhdGNoIGluIHBhdGNoZXMpIHsKICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewogICAgICAgICAgZmlyc3QgPSBsaWJyYXJ5LmxvYWRlci5yZWFkKHBhdGNoLCAtMSwKICAgICAgICAgICAgICBmaWxlVXJpOiBwYXRjaCwgb3JpZ2luOiBsaWJyYXJ5LCBhY2Nlc3NvcjogbGlicmFyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBwYXRjaCBmaWxlLCBpdCdzIGludGVycHJldGVkIGFzIGEgcGFydCBvZgogICAgICAgICAgLy8gdGhlIHBhdGNoIGxpYnJhcnkuCiAgICAgICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBwYXJ0ID0gbGlicmFyeS5sb2FkZXIucmVhZChwYXRjaCwgLTEsCiAgICAgICAgICAgICAgb3JpZ2luOiBsaWJyYXJ5LCBmaWxlVXJpOiBwYXRjaCwgYWNjZXNzb3I6IGxpYnJhcnkpOwogICAgICAgICAgZmlyc3QucGFydHMuYWRkKHBhcnQpOwogICAgICAgICAgZmlyc3QucGFydE9mZnNldHMuYWRkKC0xKTsKICAgICAgICAgIHBhcnQucGFydE9mVXJpID0gZmlyc3QuaW1wb3J0VXJpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZWxlYXNlQW5jaWxsYXJ5UmVzb3VyY2VzKCkgewogICAgY29tcG9uZW50ID0gbnVsbDsKICB9Cn0KCi8vLyBMb29rcyBmb3IgYSBjb25zdHJ1Y3RvciBjYWxsIHRoYXQgbWF0Y2hlcyBgc3VwZXIoKWAgZnJvbSBhIGNvbnN0cnVjdG9yIGluCi8vLyBbY2xzXS4gU3VjaCBhIGNvbnN0cnVjdG9yIG1heSBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cywgYnV0IG5vIHJlcXVpcmVkCi8vLyBhcmd1bWVudHMuCkNvbnN0cnVjdG9yIGRlZmF1bHRTdXBlckNvbnN0cnVjdG9yKENsYXNzIGNscykgewogIENsYXNzIHN1cGVyY2xhc3MgPSBjbHMuc3VwZXJjbGFzczsKICBpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CiAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIGluIHN1cGVyY2xhc3MuY29uc3RydWN0b3JzKSB7CiAgICAgIGlmIChjb25zdHJ1Y3Rvci5uYW1lLm5hbWUuaXNFbXB0eSkgewogICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50ID09IDAKICAgICAgICAgICAgPyBjb25zdHJ1Y3RvcgogICAgICAgICAgICA6IG51bGw7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCmNsYXNzIEtlcm5lbERpYWdub3N0aWNSZXBvcnRlcgogICAgZXh0ZW5kcyBEaWFnbm9zdGljUmVwb3J0ZXI8TWVzc2FnZSwgTG9jYXRlZE1lc3NhZ2U+IHsKICBmaW5hbCBMb2FkZXIgbG9hZGVyOwoKICBLZXJuZWxEaWFnbm9zdGljUmVwb3J0ZXIodGhpcy5sb2FkZXIpOwoKICB2b2lkIHJlcG9ydChNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBsb2FkZXIuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSwgY29udGV4dDogY29udGV4dCk7CiAgfQp9CgovLy8gRGF0YSBmb3IgdXBkYXRpbmcgY2xvbmVkIHBhcmFtZXRlcnMgb2YgcGFyYW1ldGVycyB3aXRoIGluZmVycmVkIHBhcmFtZXRlcgovLy8gdHlwZXMuCi8vLwovLy8gVGhlIHR5cGUgb2YgW3NvdXJjZV0gaXMgbm90IGRlY2xhcmVkIHNvIHRoZSB0eXBlIG9mIFt0YXJnZXRdIG5lZWRzIHRvIGJlCi8vLyB1cGRhdGVkIHdoZW4gdGhlIHR5cGUgb2YgW3NvdXJjZV0gaGFzIGJlZW4gaW5mZXJyZWQuCmNsYXNzIERlbGF5ZWRQYXJhbWV0ZXJUeXBlIHsKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHNvdXJjZTsKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHRhcmdldDsKICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbk1hcDsKCiAgRGVsYXllZFBhcmFtZXRlclR5cGUodGhpcy5zb3VyY2UsIHRoaXMudGFyZ2V0LCB0aGlzLnN1YnN0aXR1dGlvbk1hcCk7CgogIHZvaWQgdXBkYXRlVHlwZSgpIHsKICAgIGFzc2VydChzb3VyY2UudHlwZSAhPSBudWxsLCAiTm8gdHlwZSBjb21wdXRlZCBmb3IgJHNvdXJjZS4iKTsKICAgIHRhcmdldC50eXBlID0gc3Vic3RpdHV0ZShzb3VyY2UudHlwZSwgc3Vic3RpdHV0aW9uTWFwKTsKICB9Cn0KhGIATk48AR0BIQEhCRMXDxMVEhgUDxoWFRccFREOGRUTIBAaExcbHRUBQgFAASkBRQE7PyNFREABPwEiKC8oOyotLS4sLSczMCwBOAEwATMBQgE7ASUBGgkaNDQ2LjM2EkJEOTsqNyQsMwEqAS4BRgFKATkBQgE0AS4tAUEBOQEtATI9HwE1HgEfATQtARcBFwEjOD0BJlABHiFPAU8BMToBKkIBMQFNIy0hL0wdBAEhOwEdUBtABAFHNCIoKjY+OSgsIkwGEwQBRydCJxYWExMPD0UpODc1MTYMKy0mTkMiI0gYFyEQJRUODAoGFwQBDCcPEyMeIx9AHRgIBkIoNQQBODA+QCY3Ji1BIAwKCAgTBAEqHSIaHBhRJh8gBAEMRCs0JCouGEwdJSAdIU8rNUMfIi8kEk4aQSEyKRsoLjMzJTgmQCsYMwQBRk5LT0AGSBEMQSs0KiIgKy0/JCMoIQEhQBgzBAEkNSsvBjxDRQYEAUklRjMBOy4nSx4UBgEqAUpOIDFPLTA1CC08NS81CggGASVFBgEmFgQBJCpAJjcmMjMpJjw+RiwOMkpJDgwKCAg9BAFJKjM8HyojFAoqMhEuCggGNgQBUAFJFyhQKQYkBAFBATMBRj8pIk01RzUiBgE/HyA6BgFFUUxJSCU9BAFDKDIvSQ4GAUVRShcNAUtKTT0fKiYkJA1IMAYpMTMGSzAGAT8fIDoGASUwKUEPNzdGJkYBSxshGx8fCgg9LCsoKSc/DU0wBgQBLxETHzQjQSlGPSE+Dx9LCBMGAU5JMjckODRCBk82RCIlQAZDNCpNNTk/JSAyGz4tTgQBIjhKTRA3OCpMSk4vKFBQCAYbNgQBJjkcL0QcGy0hQgQBPT5FRh5CQAYtSgQBIg9PASRGKScEARwrJRgUExYtCSw8JEwaHD4pIxoTDAovJyMKDy8IBiI7STMwBAFCKjMfICUIBisEAU8UOCEdAUxdMSYnKAgGOjs6KlEsCjgjJC0KCAhAJR04IkI1RE1ODCARCggcTk45MDgjJTE7Jw4gOjkYGzQTGkkoDDUsCjFOUDE8QwoBO0QxOAwKKDwmI08pSDxDOE47DgwKSUBDMCZMUB4iCjguMEMxTTQrUSlKIicVTzQrUSlKIicODAoIBiIhQCc5DyoICAFOKC9NHUEfSUA7JiU0S0xLFSozNyQqIg4zNUk8MjQzJEREPSYsJhckRkQ9JiwmEA4MCggGAUxDIUBCKSk9Jiw7Hyg+NSguJRs1NkUyFDM1PDI0MyRNRD0mLCYXJE9EPSYsJhAODAoICAQBSCQjPxMaGi40ASJBLR0jOg84CA04BgEiGjocFTEYOS5BKQE8ExoaGhwuIzM9BAFBATo1NzQEARIoIB9ASy0IGUYoBAFMOCovBAEMNjBOGyIjHTFDEVAgRUMhJSwKCAYEASUWBAIBTksPMSUcPytAGhQIBgQPAgEfOhcBKQFIKFEEAgFOCwRNOR0kJDYBSAEWQjwEAgE1cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdGFyZ2V0LmRhcnRaZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvbGlicmFyeV9ncmFwaC5kYXJ0hmovLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5saWJyYXJ5X2dyYXBoOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9rZXJuZWwuZGFydCcKICAgIHNob3cgTGlicmFyeSwgTGlicmFyeURlcGVuZGVuY3ksIExpYnJhcnlQYXJ0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC91dGlsL2dyYXBoLmRhcnQnIHNob3cgR3JhcGg7CgppbXBvcnQgJ2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnQnIHNob3cgZ2V0UGFydFVyaTsKCmNsYXNzIExpYnJhcnlHcmFwaCBpbXBsZW1lbnRzIEdyYXBoPFVyaT4gewogIGZpbmFsIE1hcDxVcmksIExpYnJhcnk+IGxpYnJhcmllczsKCiAgTGlicmFyeUdyYXBoKHRoaXMubGlicmFyaWVzKTsKCiAgSXRlcmFibGU8VXJpPiBnZXQgdmVydGljZXMgPT4gbGlicmFyaWVzLmtleXM7CgogIEl0ZXJhYmxlPFVyaT4gbmVpZ2hib3JzT2YoVXJpIHZlcnRleCkgc3luYyogewogICAgTGlicmFyeSBsaWJyYXJ5ID0gbGlicmFyaWVzW3ZlcnRleF07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHRocm93ICJMaWJyYXJ5IG5vdCBmb3VuZDogJHZlcnRleCI7CiAgICB9CgogICAgLy8gSW1wb3J0cyBhbmQgZXhwb3J0cy4KICAgIGZvciAoTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSBpbiBsaWJyYXJ5LmRlcGVuZGVuY2llcykgewogICAgICBVcmkgdXJpMSA9IGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeS5pbXBvcnRVcmk7CiAgICAgIFVyaSB1cmkyID0gZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5LmZpbGVVcmk7CiAgICAgIGlmIChsaWJyYXJpZXMuY29udGFpbnNLZXkodXJpMSkpIHsKICAgICAgICB5aWVsZCB1cmkxOwogICAgICB9IGVsc2UgaWYgKHVyaTIgIT0gbnVsbCkgewogICAgICAgIGlmIChsaWJyYXJpZXMuY29udGFpbnNLZXkodXJpMikpIHsKICAgICAgICAgIHlpZWxkIHVyaTI7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gUGFydHMuCiAgICAvLyBOb3JtYWxseSB0aGVyZSB3b24ndCBiZSBsaWJyYXJpZXMgZm9yIHRoZXNlLCBidXQgaWYsIGZvciBpbnN0YW5jZSwKICAgIC8vIHRoZSBwYXJ0IGRpZG4ndCBleGlzdCB0aGVyZSB3aWxsIGJlIGEgc3ludGhldGljIGxpYnJhcnkuCiAgICBmb3IgKExpYnJhcnlQYXJ0IHBhcnQgaW4gbGlicmFyeS5wYXJ0cykgewogICAgICBVcmkgcGFydFVyaSA9IGdldFBhcnRVcmkobGlicmFyeS5pbXBvcnRVcmksIHBhcnQpOwogICAgICBVcmkgZmlsZVVyaSA9IGdldFBhcnRVcmkobGlicmFyeS5maWxlVXJpLCBwYXJ0KTsKICAgICAgaWYgKGxpYnJhcmllcy5jb250YWluc0tleShwYXJ0VXJpKSkgewogICAgICAgIHlpZWxkIHBhcnRVcmk7CiAgICAgIH0gZWxzZSBpZiAoZmlsZVVyaSAhPSBwYXJ0VXJpICYmIGxpYnJhcmllcy5jb250YWluc0tleShmaWxlVXJpKSkgewogICAgICAgIHlpZWxkIGZpbGVVcmk7CiAgICAgIH0KICAgIH0KICB9Cn0KNwBOTjwBHQEkMgE0ATQBKyUBIAEwATApGyoGARxBNTMpFCErFgoIBgEOSkAuOTcsF0kXCAYEAgEucGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2xpYnJhcnlfZ3JhcGguZGFydGpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0wAISdi8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnNvdXJjZV9saWJyYXJ5X2J1aWxkZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRW5jb2RlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvcmVzb2x2ZV9yZWxhdGl2ZV91cmkuZGFydCcKICAgIHNob3cgcmVzb2x2ZVJlbGF0aXZlVXJpOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRXh0ZW5zaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIExpYnJhcnlEZXBlbmRlbmN5LAogICAgICAgIExpYnJhcnlQYXJ0LAogICAgICAgIExpc3RMaXRlcmFsLAogICAgICAgIE1hcExpdGVyYWwsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgTmV2ZXJUeXBlLAogICAgICAgIE51bGxhYmlsaXR5LAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJlZmVyZW5jZSwKICAgICAgICBTZXRMaXRlcmFsLAogICAgICAgIFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgU3RyaW5nTGl0ZXJhbCwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JyBzaG93IENsb25lVmlzaXRvck5vdE1lbWJlcnM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3JlZmVyZW5jZV9mcm9tX2luZGV4LmRhcnQnCiAgICBzaG93IEluZGV4ZWRDbGFzcywgSW5kZXhlZExpYnJhcnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnQnCiAgICBzaG93CiAgICAgICAgVHlwZUFyZ3VtZW50SXNzdWUsCiAgICAgICAgZmluZFR5cGVBcmd1bWVudElzc3VlcywKICAgICAgICBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzRm9ySW52b2NhdGlvbiwKICAgICAgICBnZXRHZW5lcmljVHlwZU5hbWU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IHN1YnN0aXR1dGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2NvbnN0cnVjdG9yX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZW51bV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZXh0ZW5zaW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZnVuY3Rpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2ludmFsaWRfdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWl4aW5fYXBwbGljYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVfaXRlcmF0b3IuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9uZXZlcl90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9udWxsYWJpbGl0eV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvcHJlZml4X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3ZvaWRfdHlwZV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9jb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnLi4vY29uZmlndXJhdGlvbi5kYXJ0JyBzaG93IENvbmZpZ3VyYXRpb247CgppbXBvcnQgJy4uL2V4cG9ydC5kYXJ0JyBzaG93IEV4cG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCc7CgppbXBvcnQgJy4uL2lkZW50aWZpZXJzLmRhcnQnIHNob3cgUXVhbGlmaWVkTmFtZSwgZmxhdHRlbk5hbWU7CgppbXBvcnQgJy4uL2ltcG9ydC5kYXJ0JyBzaG93IEltcG9ydDsKCmltcG9ydCAnLi4va2VybmVsL2ludGVybmFsX2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF9idWlsZGVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgSW1wbGljaXRGaWVsZFR5cGUsCiAgICAgICAgTG9hZExpYnJhcnlCdWlsZGVyLAogICAgICAgIGNvbXBhcmVQcm9jZWR1cmVzLAogICAgICAgIHRvS2VybmVsQ29tYmluYXRvcnM7CgppbXBvcnQgJy4uL2tlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydCc7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlX2FsZ29yaXRobXMuZGFydCcKICAgIHNob3cKICAgICAgICBjYWxjdWxhdGVCb3VuZHMsCiAgICAgICAgY29tcHV0ZVZhcmlhbmNlLAogICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcywKICAgICAgICBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb24sCiAgICAgICAgZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvclR5cGVWYXJpYWJsZXMsCiAgICAgICAgcGVuZGluZ1ZhcmlhbmNlOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgYWJzdHJhY3RNYXNrLAogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBmaW5hbE1hc2ssCiAgICAgICAgaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2ssCiAgICAgICAgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgbGF0ZU1hc2ssCiAgICAgICAgbWl4aW5EZWNsYXJhdGlvbk1hc2ssCiAgICAgICAgbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzaywKICAgICAgICBzdGF0aWNNYXNrOwoKaW1wb3J0ICcuLi9uYW1lcy5kYXJ0JyBzaG93IGluZGV4U2V0TmFtZTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmV4cGVjdGVkLCB1bmhhbmRsZWQ7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnIHNob3cgVHlwZUluZmVycmVySW1wbDsKCmltcG9ydCAnc291cmNlX2NsYXNzX2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VDbGFzc0J1aWxkZXI7CgppbXBvcnQgJ3NvdXJjZV9leHRlbnNpb25fYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUV4dGVuc2lvbkJ1aWxkZXI7CgppbXBvcnQgJ3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIsamVuc2opOiBSZXBsYWNlIHRoaXMgd2l0aCB0aGUgY29ycmVjdCBzY2hlbWUuCmNvbnN0IGludCBlbmFibGVOb25OdWxsYWJsZURlZmF1bHRNYWpvclZlcnNpb24gPSAyOwpjb25zdCBpbnQgZW5hYmxlTm9uTnVsbGFibGVEZWZhdWx0TWlub3JWZXJzaW9uID0gNzsKCmNsYXNzIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGV4dGVuZHMgTGlicmFyeUJ1aWxkZXJJbXBsIHsKICBzdGF0aWMgY29uc3QgU3RyaW5nIE1BTEZPUk1FRF9VUklfU0NIRU1FID0gIm9yZy1kYXJ0bGFuZy1tYWxmb3JtZWQtdXJpIjsKCiAgZmluYWwgU291cmNlTG9hZGVyIGxvYWRlcjsKCiAgZmluYWwgVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciBsaWJyYXJ5RGVjbGFyYXRpb247CgogIGZpbmFsIExpc3Q8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPiBjb25zdHJ1Y3RvclJlZmVyZW5jZXMgPQogICAgICA8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPltdOwoKICBmaW5hbCBMaXN0PFNvdXJjZUxpYnJhcnlCdWlsZGVyPiBwYXJ0cyA9IDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj5bXTsKCiAgLy8gQ2FuIEkgdXNlIGxpYnJhcnkucGFydHMgaW5zdGVhZD8gU2VlIFNvdXJjZUxpYnJhcnlCdWlsZGVyLmFkZFBhcnQuCiAgZmluYWwgTGlzdDxpbnQ+IHBhcnRPZmZzZXRzID0gPGludD5bXTsKCiAgZmluYWwgTGlzdDxJbXBvcnQ+IGltcG9ydHMgPSA8SW1wb3J0PltdOwoKICBmaW5hbCBMaXN0PEV4cG9ydD4gZXhwb3J0cyA9IDxFeHBvcnQ+W107CgogIGZpbmFsIFNjb3BlIGltcG9ydFNjb3BlOwoKICBmaW5hbCBVcmkgZmlsZVVyaTsKCiAgZmluYWwgTGlzdDxJbXBsZW1lbnRhdGlvbkluZm8+IGltcGxlbWVudGF0aW9uQnVpbGRlcnMgPQogICAgICA8SW1wbGVtZW50YXRpb25JbmZvPltdOwoKICBmaW5hbCBMaXN0PE9iamVjdD4gYWNjZXNzb3JzID0gPE9iamVjdD5bXTsKCiAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50OwoKICBTdHJpbmcgbmFtZTsKCiAgU3RyaW5nIHBhcnRPZk5hbWU7CgogIFVyaSBwYXJ0T2ZVcmk7CgogIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKCiAgLy8vIFRoZSBjdXJyZW50IGRlY2xhcmF0aW9uIHRoYXQgaXMgYmVpbmcgYnVpbHQuIFdoZW4gd2Ugc3RhcnQgcGFyc2luZyBhCiAgLy8vIGRlY2xhcmF0aW9uIChjbGFzcywgbWV0aG9kLCBhbmQgc28gb24pLCB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbgogIC8vLyB0byBjcmVhdGUgYSBidWlsZGVyIGFuZCB0aGlzIG9iamVjdCByZWNvcmRzIGl0cyBtZW1iZXJzIGFuZCB0eXBlcyB1bnRpbCwKICAvLy8gZm9yIGV4YW1wbGUsIFthZGRDbGFzc10gaXMgY2FsbGVkLgogIFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXI7CgogIGJvb2wgY2FuQWRkSW1wbGVtZW50YXRpb25CdWlsZGVycyA9IGZhbHNlOwoKICAvLy8gTm9uLW51bGwgaWYgdGhpcyBsaWJyYXJ5IGNhdXNlcyBhbiBlcnJvciB1cG9uIGFjY2VzcywgdGhhdCBpcywgdGhlcmUgd2FzCiAgLy8vIGFuIGVycm9yIHJlYWRpbmcgaXRzIHNvdXJjZS4KICBNZXNzYWdlIGFjY2Vzc1Byb2JsZW07CgogIEBvdmVycmlkZQogIGZpbmFsIExpYnJhcnkgbGlicmFyeTsKCiAgZmluYWwgU291cmNlTGlicmFyeUJ1aWxkZXIgYWN0dWFsT3JpZ2luOwoKICBmaW5hbCBMaXN0PEZ1bmN0aW9uQnVpbGRlcj4gbmF0aXZlTWV0aG9kcyA9IDxGdW5jdGlvbkJ1aWxkZXI+W107CgogIGZpbmFsIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gYm91bmRsZXNzVHlwZVZhcmlhYmxlcyA9CiAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyPltdOwoKICAvLyBBIGxpc3Qgb2YgYWx0ZXJuYXRpbmcgZm9yd2FyZGVycyBhbmQgdGhlIHByb2NlZHVyZXMgdGhleSB3ZXJlIGdlbmVyYXRlZAogIC8vIGZvci4gIE5vdGUgdGhhdCBpdCBtYXkgbm90IGluY2x1ZGUgYSBmb3J3YXJkZXItb3JpZ2luIHBhaXIgaW4gY2FzZXMgd2hlbgogIC8vIHRoZSBmb3JtZXIgZG9lcyBub3QgbmVlZCB0byBiZSB1cGRhdGVkIGFmdGVyIHRoZSBib2R5IG9mIHRoZSBsYXR0ZXIgd2FzCiAgLy8gYnVpbHQuCiAgZmluYWwgTGlzdDxQcm9jZWR1cmU+IGZvcndhcmRlcnNPcmlnaW5zID0gPFByb2NlZHVyZT5bXTsKCiAgLy8gTGlzdCBvZiB0eXBlcyBpbmZlcnJlZCBpbiB0aGUgb3V0bGluZS4gIEVycm9ycyBpbiB0aGVzZSBzaG91bGQgYmUgcmVwb3J0ZWQKICAvLyBkaWZmZXJlbnRseSB0aGFuIGZvciBzcGVjaWZpZWQgdHlwZXMuCiAgLy8gVE9ETyhkbWl0cnlhcyk6ICBGaW5kIGEgd2F5IHRvIG1hcmsgaW5mZXJyZWQgdHlwZXMuCiAgZmluYWwgU2V0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzID0gbmV3IFNldDxEYXJ0VHlwZT4uaWRlbnRpdHkoKTsKCiAgLy8gV2hpbGUgdGhlIGJvdW5kcyBvZiB0eXBlIHBhcmFtZXRlcnMgYXJlbid0IGNvbXBpbGVkIHlldCwgd2UgY2FuJ3QgdGVsbCB0aGUKICAvLyBkZWZhdWx0IG51bGxhYmlsaXR5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUtcGFyYW1ldGVyIHR5cGVzLiAgVGhpcyBsaXN0CiAgLy8gaXMgdXNlZCB0byBjb2xsZWN0IHN1Y2ggdHlwZS1wYXJhbWV0ZXIgdHlwZXMgaW4gb3JkZXIgdG8gc2V0IHRoZQogIC8vIG51bGxhYmlsaXR5IGFmdGVyIHRoZSBib3VuZHMgYXJlIGJ1aWx0LgogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlclR5cGU+IHBlbmRpbmdOdWxsYWJpbGl0aWVzID0KICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlclR5cGU+KCk7CgogIC8vIEEgbGlicmFyeSB0byB1c2UgZm9yIE5hbWVzIGdlbmVyYXRlZCB3aGVuIGNvbXBpbGluZyBjb2RlIGluIHRoaXMgbGlicmFyeS4KICAvLyBUaGlzIGFsbG93cyBjb2RlIGdlbmVyYXRlZCBpbiBvbmUgbGlicmFyeSB0byB1c2UgdGhlIHByaXZhdGUgbmFtZXNwYWNlIG9mCiAgLy8gYW5vdGhlciwgZm9yIGV4YW1wbGUgZHVyaW5nIGV4cHJlc3Npb24gY29tcGlsYXRpb24gKGRlYnVnZ2luZykuCiAgTGlicmFyeSBnZXQgbmFtZU9yaWdpbiA9PiBfbmFtZU9yaWdpbiA/PyBsaWJyYXJ5OwogIGZpbmFsIExpYnJhcnkgX25hbWVPcmlnaW47CgogIGZpbmFsIExpYnJhcnkgcmVmZXJlbmNlc0Zyb207CiAgZmluYWwgSW5kZXhlZExpYnJhcnkgcmVmZXJlbmNlc0Zyb21JbmRleGVkOwogIEluZGV4ZWRDbGFzcyBfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkOwoKICAvLy8gRXhwb3J0cyB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQuCiAgLy8vCiAgLy8vIFRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydGVkIG1lbWJlci4KICAvLy8KICAvLy8gSWYgdGhlIG5hbWUgaXMgYGR5bmFtaWNgIG9yIGB2b2lkYCwgdGhpcyBsaWJyYXJ5IHJlZXhwb3J0cyB0aGUKICAvLy8gY29ycmVzcG9uZGluZyB0eXBlIGZyb20gYGRhcnQ6Y29yZWAsIGFuZCB0aGUgdmFsdWUgaXMgbnVsbC4KICAvLy8KICAvLy8gT3RoZXJ3aXNlLCB0aGlzIHJlcHJlc2VudHMgYW4gZXJyb3IgKGFuIGFtYmlndW91cyBleHBvcnQpLiBJbiB0aGlzIGNhc2UsCiAgLy8vIHRoZSBlcnJvciBtZXNzYWdlIGlzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBtYXAuCiAgTWFwPFN0cmluZywgU3RyaW5nPiB1bnNlcmlhbGl6YWJsZUV4cG9ydHM7CgogIExpc3Q8RmllbGRCdWlsZGVyPiBfaW1wbGljaXRseVR5cGVkRmllbGRzOwoKICBMYW5ndWFnZVZlcnNpb24gX2xhbmd1YWdlVmVyc2lvbiA9IGNvbnN0IEltcGxpY2l0TGFuZ3VhZ2VWZXJzaW9uKCk7CgogIGJvb2wgcG9zdHBvbmVkUHJvYmxlbXNJc3N1ZWQgPSBmYWxzZTsKICBMaXN0PFBvc3Rwb25lZFByb2JsZW0+IHBvc3Rwb25lZFByb2JsZW1zOwoKICAvLy8gTGlzdCBvZiBbUHJlZml4QnVpbGRlcl1zIGZvciBpbXBvcnRzIHdpdGggcHJlZml4ZXMuCiAgTGlzdDxQcmVmaXhCdWlsZGVyPiBfcHJlZml4QnVpbGRlcnM7CgogIC8vLyBTZXQgb2YgZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucyBpbiBzY29wZS4gVGhpcyBpcyBjb21wdXRlZCBsYXppbHkgaW4KICAvLy8gW2ZvckVhY2hFeHRlbnNpb25JblNjb3BlXS4KICBTZXQ8RXh0ZW5zaW9uQnVpbGRlcj4gX2V4dGVuc2lvbnNJblNjb3BlOwoKICBTb3VyY2VMaWJyYXJ5QnVpbGRlci5pbnRlcm5hbCgKICAgICAgU291cmNlTG9hZGVyIGxvYWRlciwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBhY3R1YWxPcmlnaW4sCiAgICAgIExpYnJhcnkgbGlicmFyeSwKICAgICAgTGlicmFyeSBuYW1lT3JpZ2luLAogICAgICBMaWJyYXJ5IHJlZmVyZW5jZXNGcm9tLAogICAgICBib29sIHJlZmVyZW5jZUlzUGFydE93bmVyKQogICAgICA6IHRoaXMuZnJvbVNjb3BlcygKICAgICAgICAgICAgbG9hZGVyLAogICAgICAgICAgICBmaWxlVXJpLAogICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5saWJyYXJ5KCksCiAgICAgICAgICAgIHNjb3BlID8/IG5ldyBTY29wZS50b3AoKSwKICAgICAgICAgICAgYWN0dWFsT3JpZ2luLAogICAgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICBuYW1lT3JpZ2luLAogICAgICAgICAgICByZWZlcmVuY2VzRnJvbSk7CgogIFNvdXJjZUxpYnJhcnlCdWlsZGVyLmZyb21TY29wZXMoCiAgICAgIHRoaXMubG9hZGVyLAogICAgICB0aGlzLmZpbGVVcmksCiAgICAgIHRoaXMubGlicmFyeURlY2xhcmF0aW9uLAogICAgICB0aGlzLmltcG9ydFNjb3BlLAogICAgICB0aGlzLmFjdHVhbE9yaWdpbiwKICAgICAgdGhpcy5saWJyYXJ5LAogICAgICB0aGlzLl9uYW1lT3JpZ2luLAogICAgICB0aGlzLnJlZmVyZW5jZXNGcm9tKQogICAgICA6IGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyID0gbGlicmFyeURlY2xhcmF0aW9uLAogICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZCA9CiAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tID09IG51bGwgPyBudWxsIDogbmV3IEluZGV4ZWRMaWJyYXJ5KHJlZmVyZW5jZXNGcm9tKSwKICAgICAgICBzdXBlcigKICAgICAgICAgICAgZmlsZVVyaSwgbGlicmFyeURlY2xhcmF0aW9uLnRvU2NvcGUoaW1wb3J0U2NvcGUpLCBuZXcgU2NvcGUudG9wKCkpIHsKICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CiAgfQoKICBTb3VyY2VMaWJyYXJ5QnVpbGRlcigKICAgICAgVXJpIHVyaSwgVXJpIGZpbGVVcmksIExvYWRlciBsb2FkZXIsIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGFjdHVhbE9yaWdpbiwKICAgICAge1Njb3BlIHNjb3BlLAogICAgICBMaWJyYXJ5IHRhcmdldCwKICAgICAgTGlicmFyeSBuYW1lT3JpZ2luLAogICAgICBMaWJyYXJ5IHJlZmVyZW5jZXNGcm9tLAogICAgICBib29sIHJlZmVyZW5jZUlzUGFydE93bmVyfSkKICAgICAgOiB0aGlzLmludGVybmFsKAogICAgICAgICAgICBsb2FkZXIsCiAgICAgICAgICAgIGZpbGVVcmksCiAgICAgICAgICAgIHNjb3BlLAogICAgICAgICAgICBhY3R1YWxPcmlnaW4sCiAgICAgICAgICAgIHRhcmdldCA/PwogICAgICAgICAgICAgICAgKGFjdHVhbE9yaWdpbj8ubGlicmFyeSA/PwogICAgICAgICAgICAgICAgICAgIG5ldyBMaWJyYXJ5KHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVyaTogZmlsZVVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VJc1BhcnRPd25lciA9PSB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmZXJlbmNlc0Zyb20/LnJlZmVyZW5jZSkKICAgICAgICAgICAgICAgICAgLi5zZXRMYW5ndWFnZVZlcnNpb24obG9hZGVyLnRhcmdldC5jdXJyZW50U2RrVmVyc2lvbk1ham9yLAogICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnRhcmdldC5jdXJyZW50U2RrVmVyc2lvbk1pbm9yKSksCiAgICAgICAgICAgIG5hbWVPcmlnaW4sCiAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tLAogICAgICAgICAgICByZWZlcmVuY2VJc1BhcnRPd25lcik7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUGFydCA9PiBwYXJ0T2ZOYW1lICE9IG51bGwgfHwgcGFydE9mVXJpICE9IG51bGw7CgogIExpc3Q8VW5yZXNvbHZlZFR5cGU+IGdldCB0eXBlcyA9PiBsaWJyYXJ5RGVjbGFyYXRpb24udHlwZXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU3ludGhldGljID0+IGFjY2Vzc1Byb2JsZW0gIT0gbnVsbDsKCiAgVHlwZUJ1aWxkZXIgYWRkVHlwZShUeXBlQnVpbGRlciB0eXBlLCBpbnQgY2hhck9mZnNldCkgewogICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIKICAgICAgICAuYWRkVHlwZShuZXcgVW5yZXNvbHZlZFR5cGUodHlwZSwgY2hhck9mZnNldCwgZmlsZVVyaSkpOwogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+CiAgICAgIGxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUgJiYKICAgICAgbGFuZ3VhZ2VWZXJzaW9uLm1ham9yID49IGVuYWJsZU5vbk51bGxhYmxlRGVmYXVsdE1ham9yVmVyc2lvbiAmJgogICAgICBsYW5ndWFnZVZlcnNpb24ubWlub3IgPj0gZW5hYmxlTm9uTnVsbGFibGVEZWZhdWx0TWlub3JWZXJzaW9uICYmCiAgICAgICFpc09wdE91dFBhY2thZ2UobGlicmFyeS5pbXBvcnRVcmkpICYmCiAgICAgICFpc09wdE91dFRlc3QobGlicmFyeS5pbXBvcnRVcmkpOwoKICBib29sIGlzT3B0T3V0UGFja2FnZShVcmkgdXJpKSB7CiAgICBpZiAoIXVyaS5pc1NjaGVtZSgncGFja2FnZScpKSByZXR1cm4gZmFsc2U7CiAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB1cmkucGF0aFNlZ21lbnRzLmZpcnN0OwogICAgcmV0dXJuIG9wdE91dFBhY2thZ2VzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKTsKICB9CgogIGJvb2wgaXNPcHRPdXRUZXN0KFVyaSB1cmkpIHsKICAgIFN0cmluZyBwYXRoID0gdXJpLnBhdGg7CiAgICBmb3IgKFN0cmluZyB0ZXN0RGlyIGluIFsnL3Rlc3RzLycsICcvZ2VuZXJhdGVkX3Rlc3RzLyddKSB7CiAgICAgIGludCBzdGFydCA9IHBhdGguaW5kZXhPZih0ZXN0RGlyKTsKICAgICAgaWYgKHN0YXJ0ID09IC0xKSBjb250aW51ZTsKICAgICAgaW50IGVuZCA9IHBhdGguaW5kZXhPZignLycsIHN0YXJ0ICsgdGVzdERpci5sZW5ndGggKyAxKTsKICAgICAgaWYgKGVuZCA9PSAtMSkgY29udGludWU7CiAgICAgIHJldHVybiBvcHRPdXRUZXN0UGF0aHMuY29udGFpbnMocGF0aC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogcmVtb3ZlIHRoaXMgbG9naWMuIE9wdGVkIG91dCBwYWNrYWdlcyBzaG91bGQgYmUKICAvLyBjb21wdXRlZCB1c2luZyBsYW5ndWFnZSB2ZXJzaW9uaW5nIGFuZCAucGFja2FnZXMuanNvbi4KICBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gb3B0T3V0UGFja2FnZXMgPSB7CiAgICAnX2ZlX2FuYWx5emVyX3NoYXJlZCcsCiAgICAnYW5hbHlzaXNfc2VydmVyJywKICAgICdhbmFseXNpc19zZXJ2ZXJfY2xpZW50JywKICAgICdhbmFseXNpc190b29sJywKICAgICdhbmFseXplcicsCiAgICAnYW5hbHl6ZXJfY2xpJywKICAgICdhbmFseXplcl9mZV9jb21wYXJpc29uJywKICAgICdhbmFseXplcl9wbHVnaW4nLAogICAgJ2FyZ3MnLAogICAgJ2FzeW5jJywKICAgICdhc3luY19oZWxwZXInLAogICAgJ2JhemVsX3dvcmtlcicsCiAgICAnYmVuY2htYXJrX2hhcm5lc3MnLAogICAgJ2Jvb2xlYW5fc2VsZWN0b3InLAogICAgJ2J1aWxkX2ludGVncmF0aW9uJywKICAgICdjaGFyY29kZScsCiAgICAnY2xpX3V0aWwnLAogICAgJ2NvbGxlY3Rpb24nLAogICAgJ2NvbXBpbGVyJywKICAgICdjb252ZXJ0JywKICAgICdjcnlwdG8nLAogICAgJ2Nzc2xpYicsCiAgICAnZGFydDJqc19pbmZvJywKICAgICdkYXJ0MmpzX3Rvb2xzJywKICAgICdkYXJ0Mm5hdGl2ZScsCiAgICAnZGFydF9pbnRlcm5hbCcsCiAgICAnZGFydF9zdHlsZScsCiAgICAnZGFydGRvYycsCiAgICAnZGFydGZpeCcsCiAgICAnZGV2X2NvbXBpbGVyJywKICAgICdkaWFnbm9zdGljJywKICAgICdleHBlY3QnLAogICAgJ2ZmaScsCiAgICAnZml4bnVtJywKICAgICdmcm9udGVuZF9zZXJ2ZXInLAogICAgJ2Zyb250X2VuZCcsCiAgICAnZ2FyZGVuaW5nJywKICAgICdnbG9iJywKICAgICdodG1sJywKICAgICdodHRwJywKICAgICdodHRwX2lvJywKICAgICdodHRwX211bHRpX3NlcnZlcicsCiAgICAnaHR0cF9wYXJzZXInLAogICAgJ2h0dHBfcmV0cnknLAogICAgJ2h0dHBfdGhyb3R0bGUnLAogICAgJ2ludGwnLAogICAgJ2pzJywKICAgICdqc19hc3QnLAogICAgJ2pzX3J1bnRpbWUnLAogICAgJ2pzb25fcnBjXzInLAogICAgJ2tlcm5lbCcsCiAgICAnbGludGVyJywKICAgICdsb2dnaW5nJywKICAgICdtYXJrZG93bicsCiAgICAnbWF0Y2hlcicsCiAgICAnbWV0YScsCiAgICAnbWltZScsCiAgICAnbW9ja2l0bycsCiAgICAnbW9kdWxhcl90ZXN0JywKICAgICdtdXN0YWNoZScsCiAgICAnbmF0aXZlX3N0YWNrX3RyYWNlcycsCiAgICAnbm5iZF9taWdyYXRpb24nLAogICAgJ29hdXRoMicsCiAgICAnb2JzZXJ2YXRvcnknLAogICAgJ29ic2VydmF0b3J5X3Rlc3RfcGFja2FnZScsCiAgICAncGFja2FnZV9jb25maWcnLAogICAgJ3BhY2thZ2VfcmVzb2x2ZXInLAogICAgJ3BhdGgnLAogICAgJ3BlZGFudGljJywKICAgICdwb29sJywKICAgICdwcm90b2J1ZicsCiAgICAncHViJywKICAgICdwdWJfc2VtdmVyJywKICAgICdxdWl2ZXInLAogICAgJ3Jlc291cmNlJywKICAgICdzZGtfbGlicmFyeV9tZXRhZGF0YScsCiAgICAnc2hlbGYnLAogICAgJ3NoZWxmX3BhY2thZ2VzX2hhbmRsZXInLAogICAgJ3NoZWxmX3N0YXRpYycsCiAgICAnc2hlbGZfd2ViX3NvY2tldCcsCiAgICAnc21pdGgnLAogICAgJ3NvdXJjZV9tYXBfc3RhY2tfdHJhY2UnLAogICAgJ3NvdXJjZW1hcF90ZXN0aW5nJywKICAgICdzb3VyY2VfbWFwcycsCiAgICAnc291cmNlX3NwYW4nLAogICAgJ3N0YWNrX3RyYWNlJywKICAgICdzdGF0dXNfZmlsZScsCiAgICAnc3RyZWFtX2NoYW5uZWwnLAogICAgJ3N0cmluZ19zY2FubmVyJywKICAgICd0ZWxlbWV0cnknLAogICAgJ3Rlcm1fZ2x5cGgnLAogICAgJ3Rlc3QnLAogICAgJ3Rlc3RfYXBpJywKICAgICd0ZXN0X2NvcmUnLAogICAgJ3Rlc3RfZGVzY3JpcHRvcicsCiAgICAndGVzdF9wcm9jZXNzJywKICAgICd0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyJywKICAgICd0ZXN0X3J1bm5lcicsCiAgICAndGVzdGluZycsCiAgICAndGZsaXRlX25hdGl2ZScsCiAgICAndHlwZWRfZGF0YScsCiAgICAndW5pdHRlc3QnLAogICAgJ3VzYWdlJywKICAgICd2bScsCiAgICAndm1fc2VydmljZScsCiAgICAnd2F0Y2hlcicsCiAgICAnd2ViX2NvbXBvbmVudHMnLAogICAgJ3dlYl9zb2NrZXRfY2hhbm5lbCcsCiAgICAneWFtbCcsCiAgfTsKCiAgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IG9wdE91dFRlc3RQYXRocyA9IHsKICAgICcvdGVzdHMvY28xOV8yJywKICAgICcvdGVzdHMvY29yZWxpYl8yJywKICAgICcvdGVzdHMvbGFuZ3VhZ2VfMicsCiAgICAnL3Rlc3RzL2xpYl8yJywKICAgICcvdGVzdHMvc3RhbmRhbG9uZV8yJywKICAgICcvZ2VuZXJhdGVkX3Rlc3RzL2NvMTlfMicsCiAgICAnL2dlbmVyYXRlZF90ZXN0cy9jb3JlbGliXzInLAogICAgJy9nZW5lcmF0ZWRfdGVzdHMvbGFuZ3VhZ2VfMicsCiAgICAnL2dlbmVyYXRlZF90ZXN0cy9saWJfMicsCiAgICAnL2dlbmVyYXRlZF90ZXN0cy9zdGFuZGFsb25lXzInLAogIH07CgogIExhbmd1YWdlVmVyc2lvbiBnZXQgbGFuZ3VhZ2VWZXJzaW9uID0+IF9sYW5ndWFnZVZlcnNpb247CgogIEBvdmVycmlkZQogIHZvaWQgc2V0TGFuZ3VhZ2VWZXJzaW9uKGludCBtYWpvciwgaW50IG1pbm9yLAogICAgICB7aW50IG9mZnNldDogMCwgaW50IGxlbmd0aDogbm9MZW5ndGgsIGJvb2wgZXhwbGljaXQ6IGZhbHNlfSkgewogICAgaWYgKGxhbmd1YWdlVmVyc2lvbi5pc0V4cGxpY2l0KSByZXR1cm47CiAgICBfbGFuZ3VhZ2VWZXJzaW9uID0KICAgICAgICBuZXcgTGFuZ3VhZ2VWZXJzaW9uKG1ham9yLCBtaW5vciwgZmlsZVVyaSwgb2Zmc2V0LCBsZW5ndGgsIGV4cGxpY2l0KTsKCiAgICBpZiAobWFqb3IgPT0gbnVsbCB8fCBtaW5vciA9PSBudWxsKSB7CiAgICAgIGFkZFBvc3Rwb25lZFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uSW52YWxpZEluRG90UGFja2FnZXMsIG9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIElmIHRyeWluZyB0byBzZXQgYSBsYW5ndWFnZSB2ZXJzaW9uIHRoYXQgaXMgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnQgc2RrCiAgICAvLyB2ZXJzaW9uIGl0J3MgYW4gZXJyb3IuCiAgICBpZiAobWFqb3IgPiBsb2FkZXIudGFyZ2V0LmN1cnJlbnRTZGtWZXJzaW9uTWFqb3IgfHwKICAgICAgICAobWFqb3IgPT0gbG9hZGVyLnRhcmdldC5jdXJyZW50U2RrVmVyc2lvbk1ham9yICYmCiAgICAgICAgICAgIG1pbm9yID4gbG9hZGVyLnRhcmdldC5jdXJyZW50U2RrVmVyc2lvbk1pbm9yKSkgewogICAgICBhZGRQb3N0cG9uZWRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVMYW5ndWFnZVZlcnNpb25Ub29IaWdoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgbG9hZGVyLnRhcmdldC5jdXJyZW50U2RrVmVyc2lvbk1ham9yLAogICAgICAgICAgICAgIGxvYWRlci50YXJnZXQuY3VycmVudFNka1ZlcnNpb25NaW5vciksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBsZW5ndGgsCiAgICAgICAgICBmaWxlVXJpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGlicmFyeS5zZXRMYW5ndWFnZVZlcnNpb24obWFqb3IsIG1pbm9yKTsKICB9CgogIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciBhZGRDb25zdHJ1Y3RvclJlZmVyZW5jZShPYmplY3QgbmFtZSwKICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gdHlwZUFyZ3VtZW50cywgU3RyaW5nIHN1ZmZpeCwgaW50IGNoYXJPZmZzZXQpIHsKICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWYgPSBuZXcgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyKAogICAgICAgIG5hbWUsIHR5cGVBcmd1bWVudHMsIHN1ZmZpeCwgdGhpcywgY2hhck9mZnNldCk7CiAgICBjb25zdHJ1Y3RvclJlZmVyZW5jZXMuYWRkKHJlZik7CiAgICByZXR1cm4gcmVmOwogIH0KCiAgdm9pZCBiZWdpbk5lc3RlZERlY2xhcmF0aW9uKFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQga2luZCwgU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIGhhc01lbWJlcnM6IHRydWV9KSB7CiAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciA9CiAgICAgICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIuY3JlYXRlTmVzdGVkKGtpbmQsIG5hbWUsIGhhc01lbWJlcnMpOwogIH0KCiAgVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciBlbmROZXN0ZWREZWNsYXJhdGlvbigKICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZCBraW5kLCBTdHJpbmcgbmFtZSkgewogICAgYXNzZXJ0KAogICAgICAgIGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLmtpbmQgPT0ga2luZCwKICAgICAgICAiVW5leHBlY3RlZCBkZWNsYXJhdGlvbi4gIgogICAgICAgICJUcnlpbmcgdG8gZW5kIGEgJHtjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5raW5kfSBhcyBhICRraW5kLiIpOwogICAgYXNzZXJ0KAogICAgICAgIChuYW1lPy5zdGFydHNXaXRoKGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWUpID8/CiAgICAgICAgICAgICAgICAobmFtZSA9PSBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5uYW1lKSkgfHwKICAgICAgICAgICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIubmFtZSA9PSAib3BlcmF0b3IiIHx8CiAgICAgICAgICAgIGlkZW50aWNhbChuYW1lLCAiPHN5bnRheC1lcnJvcj4iKSwKICAgICAgICAiJHtuYW1lfSAhPSAke2N1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWV9Iik7CiAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIHByZXZpb3VzID0gY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXI7CiAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciA9IGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLnBhcmVudDsKICAgIHJldHVybiBwcmV2aW91czsKICB9CgogIGJvb2wgdXJpSXNWYWxpZChVcmkgdXJpKSA9PiB1cmkuc2NoZW1lICE9IE1BTEZPUk1FRF9VUklfU0NIRU1FOwoKICBVcmkgcmVzb2x2ZShVcmkgYmFzZVVyaSwgU3RyaW5nIHVyaSwgaW50IHVyaU9mZnNldCwge2lzUGFydDogZmFsc2V9KSB7CiAgICBpZiAodXJpID09IG51bGwpIHsKICAgICAgYWRkUHJvYmxlbShtZXNzYWdlRXhwZWN0ZWRVcmksIHVyaU9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICByZXR1cm4gbmV3IFVyaShzY2hlbWU6IE1BTEZPUk1FRF9VUklfU0NIRU1FKTsKICAgIH0KICAgIFVyaSBwYXJzZWRVcmk7CiAgICB0cnkgewogICAgICBwYXJzZWRVcmkgPSBVcmkucGFyc2UodXJpKTsKICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChlKSB7CiAgICAgIC8vIFBvaW50IHRvIHBvc2l0aW9uIGluIHN0cmluZyBpbmRpY2F0ZWQgYnkgdGhlIGV4Y2VwdGlvbiwKICAgICAgLy8gb3IgdG8gdGhlIGluaXRpYWwgcXVvdGUgaWYgbm8gcG9zaXRpb24gaXMgZ2l2ZW4uCiAgICAgIC8vIChBc3N1bWVzIHRoZSBkaXJlY3RpdmUgaXMgdXNpbmcgYSBzaW5nbGUtbGluZSBzdHJpbmcuKQogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ291bGROb3RQYXJzZVVyaS53aXRoQXJndW1lbnRzKHVyaSwgZS5tZXNzYWdlKSwKICAgICAgICAgIHVyaU9mZnNldCArIDEgKyAoZS5vZmZzZXQgPz8gLTEpLCAxLCBmaWxlVXJpKTsKICAgICAgcmV0dXJuIG5ldyBVcmkoCiAgICAgICAgICBzY2hlbWU6IE1BTEZPUk1FRF9VUklfU0NIRU1FLCBxdWVyeTogVXJpLmVuY29kZVF1ZXJ5Q29tcG9uZW50KHVyaSkpOwogICAgfQogICAgaWYgKGlzUGFydCAmJiBiYXNlVXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgLy8gUmVzb2x2ZSB1c2luZyBzcGVjaWFsIHJ1bGVzIGZvciBkYXJ0OiBVUklzCiAgICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVVcmkoYmFzZVVyaSwgcGFyc2VkVXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBiYXNlVXJpLnJlc29sdmVVcmkocGFyc2VkVXJpKTsKICAgIH0KICB9CgogIFN0cmluZyBjb21wdXRlQW5kVmFsaWRhdGVDb25zdHJ1Y3Rvck5hbWUoT2JqZWN0IG5hbWUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7aXNGYWN0b3J5OiBmYWxzZX0pIHsKICAgIFN0cmluZyBjbGFzc05hbWUgPSBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5uYW1lOwogICAgU3RyaW5nIHByZWZpeDsKICAgIFN0cmluZyBzdWZmaXg7CiAgICBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIHByZWZpeCA9IG5hbWUucXVhbGlmaWVyOwogICAgICBzdWZmaXggPSBuYW1lLm5hbWU7CiAgICB9IGVsc2UgewogICAgICBwcmVmaXggPSBuYW1lOwogICAgICBzdWZmaXggPSBudWxsOwogICAgfQogICAgaWYgKHByZWZpeCA9PSBjbGFzc05hbWUpIHsKICAgICAgcmV0dXJuIHN1ZmZpeCA/PyAiIjsKICAgIH0KICAgIGlmIChzdWZmaXggPT0gbnVsbCAmJiAhaXNGYWN0b3J5KSB7CiAgICAgIC8vIEEgbGVnYWwgbmFtZSBmb3IgYSByZWd1bGFyIG1ldGhvZCwgYnV0IG5vdCBmb3IgYSBjb25zdHJ1Y3Rvci4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgYWRkUHJvYmxlbSgKICAgICAgICBtZXNzYWdlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lLCBjaGFyT2Zmc2V0LCBwcmVmaXgubGVuZ3RoLCBmaWxlVXJpLAogICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgIHRlbXBsYXRlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWUpCiAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgaW1wb3J0VXJpLAogICAgICAgICAgICAgICAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5uYW1lLmxlbmd0aCkKICAgICAgICBdKTsKCiAgICByZXR1cm4gc3VmZml4OwogIH0KCiAgdm9pZCBhZGRFeHBvcnQoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucywKICAgICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycywKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCB1cmlPZmZzZXQpIHsKICAgIGlmIChjb25maWd1cmF0aW9ucyAhPSBudWxsKSB7CiAgICAgIGZvciAoQ29uZmlndXJhdGlvbiBjb25maWcgaW4gY29uZmlndXJhdGlvbnMpIHsKICAgICAgICBpZiAobG9va3VwSW1wb3J0Q29uZGl0aW9uKGNvbmZpZy5kb3R0ZWROYW1lKSA9PSBjb25maWcuY29uZGl0aW9uKSB7CiAgICAgICAgICB1cmkgPSBjb25maWcuaW1wb3J0VXJpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZWRMaWJyYXJ5ID0gbG9hZGVyLnJlYWQoCiAgICAgICAgcmVzb2x2ZSh0aGlzLmltcG9ydFVyaSwgdXJpLCB1cmlPZmZzZXQpLCBjaGFyT2Zmc2V0LAogICAgICAgIGFjY2Vzc29yOiB0aGlzKTsKICAgIGV4cG9ydGVkTGlicmFyeS5hZGRFeHBvcnRlcih0aGlzLCBjb21iaW5hdG9ycywgY2hhck9mZnNldCk7CiAgICBleHBvcnRzLmFkZChuZXcgRXhwb3J0KHRoaXMsIGV4cG9ydGVkTGlicmFyeSwgY29tYmluYXRvcnMsIGNoYXJPZmZzZXQpKTsKICB9CgogIFN0cmluZyBsb29rdXBJbXBvcnRDb25kaXRpb24oU3RyaW5nIGRvdHRlZE5hbWUpIHsKICAgIGNvbnN0IFN0cmluZyBwcmVmaXggPSAiZGFydC5saWJyYXJ5LiI7CiAgICBpZiAoIWRvdHRlZE5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gIiI7CiAgICBkb3R0ZWROYW1lID0gZG90dGVkTmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7CiAgICBpZiAoIWxvYWRlci50YXJnZXQudXJpVHJhbnNsYXRvci5pc0xpYnJhcnlTdXBwb3J0ZWQoZG90dGVkTmFtZSkpIHJldHVybiAiIjsKCiAgICBMaWJyYXJ5QnVpbGRlciBpbXBvcnRlZCA9CiAgICAgICAgbG9hZGVyLmJ1aWxkZXJzW25ldyBVcmkoc2NoZW1lOiAiZGFydCIsIHBhdGg6IGRvdHRlZE5hbWUpXTsKCiAgICBpZiAoaW1wb3J0ZWQgPT0gbnVsbCkgewogICAgICBMaWJyYXJ5QnVpbGRlciBjb3JlTGlicmFyeSA9IGxvYWRlci5yZWFkKAogICAgICAgICAgcmVzb2x2ZSh0aGlzLmltcG9ydFVyaSwKICAgICAgICAgICAgICBuZXcgVXJpKHNjaGVtZTogImRhcnQiLCBwYXRoOiAiY29yZSIpLnRvU3RyaW5nKCksIC0xKSwKICAgICAgICAgIC0xKTsKICAgICAgaW1wb3J0ZWQgPSBjb3JlTGlicmFyeQogICAgICAgICAgLmxvYWRlci5idWlsZGVyc1tuZXcgVXJpKHNjaGVtZTogJ2RhcnQnLCBwYXRoOiBkb3R0ZWROYW1lKV07CiAgICB9CiAgICByZXR1cm4gaW1wb3J0ZWQgIT0gbnVsbCAmJiAhaW1wb3J0ZWQuaXNTeW50aGV0aWMgPyAidHJ1ZSIgOiAiIjsKICB9CgogIHZvaWQgYWRkSW1wb3J0KAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyB1cmksCiAgICAgIExpc3Q8Q29uZmlndXJhdGlvbj4gY29uZmlndXJhdGlvbnMsCiAgICAgIFN0cmluZyBwcmVmaXgsCiAgICAgIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMsCiAgICAgIGJvb2wgZGVmZXJyZWQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgcHJlZml4Q2hhck9mZnNldCwKICAgICAgaW50IHVyaU9mZnNldCwKICAgICAgaW50IGltcG9ydEluZGV4KSB7CiAgICBpZiAoY29uZmlndXJhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKENvbmZpZ3VyYXRpb24gY29uZmlnIGluIGNvbmZpZ3VyYXRpb25zKSB7CiAgICAgICAgaWYgKGxvb2t1cEltcG9ydENvbmRpdGlvbihjb25maWcuZG90dGVkTmFtZSkgPT0gY29uZmlnLmNvbmRpdGlvbikgewogICAgICAgICAgdXJpID0gY29uZmlnLmltcG9ydFVyaTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwoKICAgIFVyaSByZXNvbHZlZFVyaTsKICAgIFN0cmluZyBuYXRpdmVQYXRoOwogICAgY29uc3QgU3RyaW5nIG5hdGl2ZUV4dGVuc2lvblNjaGVtZSA9ICJkYXJ0LWV4dDoiOwogICAgaWYgKHVyaS5zdGFydHNXaXRoKG5hdGl2ZUV4dGVuc2lvblNjaGVtZSkpIHsKICAgICAgU3RyaW5nIHN0cmlwcGVkVXJpID0gdXJpLnN1YnN0cmluZyhuYXRpdmVFeHRlbnNpb25TY2hlbWUubGVuZ3RoKTsKICAgICAgaWYgKHN0cmlwcGVkVXJpLnN0YXJ0c1dpdGgoInBhY2thZ2UiKSkgewogICAgICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLmltcG9ydFVyaSwgc3RyaXBwZWRVcmksCiAgICAgICAgICAgIHVyaU9mZnNldCArIG5hdGl2ZUV4dGVuc2lvblNjaGVtZS5sZW5ndGgpOwogICAgICAgIHJlc29sdmVkVXJpID0gbG9hZGVyLnRhcmdldC50cmFuc2xhdGVVcmkocmVzb2x2ZWRVcmkpOwogICAgICAgIG5hdGl2ZVBhdGggPSByZXNvbHZlZFVyaS50b1N0cmluZygpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdmVkVXJpID0gbmV3IFVyaShzY2hlbWU6ICJkYXJ0LWV4dCIsIHBhdGhTZWdtZW50czogW3VyaV0pOwogICAgICAgIG5hdGl2ZVBhdGggPSB1cmk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLmltcG9ydFVyaSwgdXJpLCB1cmlPZmZzZXQpOwogICAgICBidWlsZGVyID0gbG9hZGVyLnJlYWQocmVzb2x2ZWRVcmksIHVyaU9mZnNldCwgYWNjZXNzb3I6IHRoaXMpOwogICAgfQoKICAgIGltcG9ydHMuYWRkKG5ldyBJbXBvcnQodGhpcywgYnVpbGRlciwgZGVmZXJyZWQsIHByZWZpeCwgY29tYmluYXRvcnMsCiAgICAgICAgY29uZmlndXJhdGlvbnMsIGNoYXJPZmZzZXQsIHByZWZpeENoYXJPZmZzZXQsIGltcG9ydEluZGV4LAogICAgICAgIG5hdGl2ZUltcG9ydFBhdGg6IG5hdGl2ZVBhdGgpKTsKICB9CgogIHZvaWQgYWRkUGFydChMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsIFN0cmluZyB1cmksIGludCBjaGFyT2Zmc2V0KSB7CiAgICBVcmkgcmVzb2x2ZWRVcmk7CiAgICBVcmkgbmV3RmlsZVVyaTsKICAgIHJlc29sdmVkVXJpID0gcmVzb2x2ZSh0aGlzLmltcG9ydFVyaSwgdXJpLCBjaGFyT2Zmc2V0LCBpc1BhcnQ6IHRydWUpOwogICAgbmV3RmlsZVVyaSA9IHJlc29sdmUoZmlsZVVyaSwgdXJpLCBjaGFyT2Zmc2V0KTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFkZCBhIExpYnJhcnlQYXJ0QnVpbGRlciBpbnN0ZWFkIG9mIHVzaW5nCiAgICAvLyBbTGlicmFyeUJ1aWxkZXJdIHRvIHJlcHJlc2VudCBib3RoIGxpYnJhcmllcyBhbmQgcGFydHMuCiAgICBwYXJ0cy5hZGQobG9hZGVyLnJlYWQocmVzb2x2ZWRVcmksIGNoYXJPZmZzZXQsCiAgICAgICAgZmlsZVVyaTogbmV3RmlsZVVyaSwgYWNjZXNzb3I6IHRoaXMpKTsKICAgIHBhcnRPZmZzZXRzLmFkZChjaGFyT2Zmc2V0KTsKCiAgICAvLyBUT0RPKGFoZSk6IFttZXRhZGF0YV0gc2hvdWxkIGJlIHN0b3JlZCwgZXZhbHVhdGVkLCBhbmQgYWRkZWQgdG8gW3BhcnRdLgogICAgTGlicmFyeVBhcnQgcGFydCA9IG5ldyBMaWJyYXJ5UGFydCg8RXhwcmVzc2lvbj5bXSwgdXJpKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0OwogICAgbGlicmFyeS5hZGRQYXJ0KHBhcnQpOwogIH0KCiAgdm9pZCBhZGRQYXJ0T2YoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwgU3RyaW5nIG5hbWUsIFN0cmluZyB1cmksIGludCB1cmlPZmZzZXQpIHsKICAgIHBhcnRPZk5hbWUgPSBuYW1lOwogICAgaWYgKHVyaSAhPSBudWxsKSB7CiAgICAgIHBhcnRPZlVyaSA9IHJlc29sdmUodGhpcy5pbXBvcnRVcmksIHVyaSwgdXJpT2Zmc2V0KTsKICAgICAgVXJpIG5ld0ZpbGVVcmkgPSByZXNvbHZlKGZpbGVVcmksIHVyaSwgdXJpT2Zmc2V0KTsKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5yZWFkKHBhcnRPZlVyaSwgdXJpT2Zmc2V0LAogICAgICAgICAgZmlsZVVyaTogbmV3RmlsZVVyaSwgYWNjZXNzb3I6IHRoaXMpOwogICAgICBpZiAobG9hZGVyLmZpcnN0ID09IHRoaXMpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgcGFydCwgYW5kIGl0IHdhcyB0aGUgZmlyc3QgaW5wdXQuIExldCB0aGUgbG9hZGVyIGtub3cKICAgICAgICAvLyBhYm91dCB0aGF0LgogICAgICAgIGxvYWRlci5maXJzdCA9IGxpYnJhcnk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgYWRkRmllbGRzKFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLCBUeXBlQnVpbGRlciB0eXBlLCBMaXN0PEZpZWxkSW5mbz4gZmllbGRJbmZvcykgewogICAgZm9yIChGaWVsZEluZm8gaW5mbyBpbiBmaWVsZEluZm9zKSB7CiAgICAgIGJvb2wgaXNDb25zdCA9IG1vZGlmaWVycyAmIGNvbnN0TWFzayAhPSAwOwogICAgICBib29sIGlzRmluYWwgPSBtb2RpZmllcnMgJiBmaW5hbE1hc2sgIT0gMDsKICAgICAgYm9vbCBwb3RlbnRpYWxseU5lZWRJbml0aWFsaXplckluT3V0bGluZSA9IGlzQ29uc3QgfHwgaXNGaW5hbDsKICAgICAgVG9rZW4gc3RhcnRUb2tlbjsKICAgICAgaWYgKHBvdGVudGlhbGx5TmVlZEluaXRpYWxpemVySW5PdXRsaW5lIHx8IHR5cGUgPT0gbnVsbCkgewogICAgICAgIHN0YXJ0VG9rZW4gPSBpbmZvLmluaXRpYWxpemVyVG9rZW47CiAgICAgIH0KICAgICAgaWYgKHN0YXJ0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIC8vIEV4dHJhY3Qgb25seSB0aGUgdG9rZW5zIGZvciB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBmcm9tIHRoZQogICAgICAgIC8vIHRva2VuIHN0cmVhbS4KICAgICAgICBUb2tlbiBlbmRUb2tlbiA9IGluZm8uYmVmb3JlTGFzdDsKICAgICAgICBlbmRUb2tlbi5zZXROZXh0KG5ldyBUb2tlbi5lb2YoZW5kVG9rZW4ubmV4dC5vZmZzZXQpKTsKICAgICAgICBuZXcgVG9rZW4uZW9mKHN0YXJ0VG9rZW4ucHJldmlvdXMub2Zmc2V0KS5zZXROZXh0KHN0YXJ0VG9rZW4pOwogICAgICB9CiAgICAgIGJvb2wgaGFzSW5pdGlhbGl6ZXIgPSBpbmZvLmluaXRpYWxpemVyVG9rZW4gIT0gbnVsbDsKICAgICAgYWRkRmllbGQoZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGUsIGluZm8ubmFtZSwKICAgICAgICAgIGluZm8uY2hhck9mZnNldCwgaW5mby5jaGFyRW5kT2Zmc2V0LCBzdGFydFRva2VuLCBoYXNJbml0aWFsaXplciwKICAgICAgICAgIGNvbnN0SW5pdGlhbGl6ZXJUb2tlbjoKICAgICAgICAgICAgICBwb3RlbnRpYWxseU5lZWRJbml0aWFsaXplckluT3V0bGluZSA/IHN0YXJ0VG9rZW4gOiBudWxsKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEJ1aWxkZXIgYWRkQnVpbGRlcihTdHJpbmcgbmFtZSwgQnVpbGRlciBkZWNsYXJhdGlvbiwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtSZWZlcmVuY2UgcmVmZXJlbmNlfSkgewogICAgLy8gVE9ETyhhaGUpOiBTZXQgdGhlIHBhcmVudCBjb3JyZWN0bHkgaGVyZS4gQ291bGQgdGhlbiBjaGFuZ2UgdGhlCiAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBNZW1iZXJCdWlsZGVyLmlzVG9wTGV2ZWwgdG8gdGVzdCBleHBsaWNpdGx5IGZvciBhCiAgICAvLyBMaWJyYXJ5QnVpbGRlci4KICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCJudWxsIiwgIm5hbWUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICAgIGlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewogICAgICBsb2FkZXIuYnVpbGRlcnNDcmVhdGVkV2l0aFJlZmVyZW5jZXNbcmVmZXJlbmNlXSA9IGRlY2xhcmF0aW9uOwogICAgfQogICAgaWYgKGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyID09IGxpYnJhcnlEZWNsYXJhdGlvbikgewogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgTWVtYmVyQnVpbGRlcikgewogICAgICAgIGRlY2xhcmF0aW9uLnBhcmVudCA9IHRoaXM7CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgVHlwZURlY2xhcmF0aW9uQnVpbGRlcikgewogICAgICAgIGRlY2xhcmF0aW9uLnBhcmVudCA9IHRoaXM7CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlcikgewogICAgICAgIGFzc2VydChkZWNsYXJhdGlvbi5wYXJlbnQgPT0gdGhpcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICAgIiR7ZGVjbGFyYXRpb24ucnVudGltZVR5cGV9IiwgImFkZEJ1aWxkZXIiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLnBhcmVudCA9PSBsaWJyYXJ5RGVjbGFyYXRpb24pOwogICAgfQogICAgYm9vbCBpc0NvbnN0cnVjdG9yID0gZGVjbGFyYXRpb24gaXMgRnVuY3Rpb25CdWlsZGVyICYmCiAgICAgICAgKGRlY2xhcmF0aW9uLmlzQ29uc3RydWN0b3IgfHwgZGVjbGFyYXRpb24uaXNGYWN0b3J5KTsKICAgIGlmICghaXNDb25zdHJ1Y3RvciAmJiBuYW1lID09IGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWUpIHsKICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgIG1lc3NhZ2VNZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzLCBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICB9CiAgICBNYXA8U3RyaW5nLCBCdWlsZGVyPiBtZW1iZXJzID0gaXNDb25zdHJ1Y3RvcgogICAgICAgID8gY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIuY29uc3RydWN0b3JzCiAgICAgICAgOiAoZGVjbGFyYXRpb24uaXNTZXR0ZXIKICAgICAgICAgICAgPyBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5zZXR0ZXJzCiAgICAgICAgICAgIDogY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIubWVtYmVycyk7CiAgICBCdWlsZGVyIGV4aXN0aW5nID0gbWVtYmVyc1tuYW1lXTsKCiAgICBpZiAoZXhpc3RpbmcgPT0gZGVjbGFyYXRpb24pIHJldHVybiBleGlzdGluZzsKCiAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsICYmIGRlY2xhcmF0aW9uLm5leHQgIT0gZXhpc3RpbmcpIHsKICAgICAgdW5leHBlY3RlZCgKICAgICAgICAgICIke2RlY2xhcmF0aW9uLm5leHQuZmlsZVVyaX1AJHtkZWNsYXJhdGlvbi5uZXh0LmNoYXJPZmZzZXR9IiwKICAgICAgICAgICIke2V4aXN0aW5nPy5maWxlVXJpfUAke2V4aXN0aW5nPy5jaGFyT2Zmc2V0fSIsCiAgICAgICAgICBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICB9CiAgICBkZWNsYXJhdGlvbi5uZXh0ID0gZXhpc3Rpbmc7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlciAmJiBleGlzdGluZyBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgIGFzc2VydChleGlzdGluZy5uZXh0IGlzISBQcmVmaXhCdWlsZGVyKTsKICAgICAgQnVpbGRlciBkZWZlcnJlZDsKICAgICAgQnVpbGRlciBvdGhlcjsKICAgICAgaWYgKGRlY2xhcmF0aW9uLmRlZmVycmVkKSB7CiAgICAgICAgZGVmZXJyZWQgPSBkZWNsYXJhdGlvbjsKICAgICAgICBvdGhlciA9IGV4aXN0aW5nOwogICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nLmRlZmVycmVkKSB7CiAgICAgICAgZGVmZXJyZWQgPSBleGlzdGluZzsKICAgICAgICBvdGhlciA9IGRlY2xhcmF0aW9uOwogICAgICB9CiAgICAgIGlmIChkZWZlcnJlZCAhPSBudWxsKSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZURlZmVycmVkUHJlZml4RHVwbGljYXRlZC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBkZWZlcnJlZC5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSwKICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgIHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihmaWxlVXJpLCBvdGhlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgICAgICAgXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGV4aXN0aW5nCiAgICAgICAgLi5leHBvcnRTY29wZS5tZXJnZShkZWNsYXJhdGlvbi5leHBvcnRTY29wZSwKICAgICAgICAgICAgKFN0cmluZyBuYW1lLCBCdWlsZGVyIGV4aXN0aW5nLCBCdWlsZGVyIG1lbWJlcikgewogICAgICAgICAgcmV0dXJuIGNvbXB1dGVBbWJpZ3VvdXNEZWNsYXJhdGlvbigKICAgICAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0KTsKICAgICAgICB9KTsKICAgIH0gZWxzZSBpZiAoaXNEdXBsaWNhdGVkRGVjbGFyYXRpb24oZXhpc3RpbmcsIGRlY2xhcmF0aW9uKSkgewogICAgICBTdHJpbmcgZnVsbE5hbWUgPSBuYW1lOwogICAgICBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICAgIGlmIChuYW1lLmlzRW1wdHkpIHsKICAgICAgICAgIGZ1bGxOYW1lID0gY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIubmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZnVsbE5hbWUgPSAiJHtjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5uYW1lfS4kbmFtZSI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhmdWxsTmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LCBmdWxsTmFtZS5sZW5ndGgsIGRlY2xhcmF0aW9uLmZpbGVVcmksCiAgICAgICAgICBjb250ZXh0OiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlCiAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdWxsTmFtZSkKICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgZnVsbE5hbWUubGVuZ3RoKQogICAgICAgICAgXSk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLmlzRXh0ZW5zaW9uKSB7CiAgICAgIC8vIFdlIGFkZCB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIHRvIHRoZSBleHRlbnNpb24gc2NvcGUgb25seSBpZiBpdHMKICAgICAgLy8gbmFtZSBpcyB1bmlxdWUuIE9ubHkgdGhlIGZpcnN0IG9mIGR1cGxpY2F0ZSBleHRlbnNpb25zIGlzIGFjY2Vzc2libGUKICAgICAgLy8gYnkgbmFtZSBvciBieSByZXNvbHV0aW9uIGFuZCB0aGUgcmVtYWluaW5nIGFyZSBkcm9wcGVkIGZvciB0aGUgb3V0cHV0LgogICAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5leHRlbnNpb25zLmFkZChkZWNsYXJhdGlvbik7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlcikgewogICAgICBfcHJlZml4QnVpbGRlcnMgPz89IDxQcmVmaXhCdWlsZGVyPltdOwogICAgICBfcHJlZml4QnVpbGRlcnMuYWRkKGRlY2xhcmF0aW9uKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXJzW25hbWVdID0gZGVjbGFyYXRpb247CiAgfQoKICBib29sIGlzRHVwbGljYXRlZERlY2xhcmF0aW9uKEJ1aWxkZXIgZXhpc3RpbmcsIEJ1aWxkZXIgb3RoZXIpIHsKICAgIGlmIChleGlzdGluZyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBCdWlsZGVyIG5leHQgPSBleGlzdGluZy5uZXh0OwogICAgaWYgKG5leHQgPT0gbnVsbCkgewogICAgICBpZiAoZXhpc3RpbmcuaXNHZXR0ZXIgJiYgb3RoZXIuaXNTZXR0ZXIpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGV4aXN0aW5nLmlzU2V0dGVyICYmIG90aGVyLmlzR2V0dGVyKSByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAobmV4dCBpcyBDbGFzc0J1aWxkZXIgJiYgIW5leHQuaXNNaXhpbkFwcGxpY2F0aW9uKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKG5leHQgaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgYWxpYXNlZEJ1aWxkZXIgPSBuZXh0LnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgICAgICBpZiAoYWxpYXNlZEJ1aWxkZXIgaXMgQ2xhc3NCdWlsZGVyICYmCiAgICAgICAgICAgICFhbGlhc2VkQnVpbGRlci5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGV4aXN0aW5nIGlzIENsYXNzQnVpbGRlciAmJiBvdGhlciBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgLy8gV2UgYWxsb3cgbXVsdGlwbGUgbWl4aW4gYXBwbGljYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4gQW4KICAgICAgLy8gYWx0ZXJuYXRpdmUgaXMgdG8gc2hhcmUgdGhlc2UgbWl4aW4gYXBwbGljYXRpb25zLiBUaGlzIHNpdHVhdGlvbiBjYW4KICAgICAgLy8gaGFwcGVuIGlmIHlvdSBoYXZlIGBjbGFzcyBBIGV4dGVuZHMgT2JqZWN0IHdpdGggTWl4aW4ge31gIGFuZCBgY2xhc3MgQgogICAgICAvLyBleHRlbmRzIE9iamVjdCB3aXRoIE1peGluIHt9YCBpbiB0aGUgc2FtZSBsaWJyYXJ5LgogICAgICByZXR1cm4gIWV4aXN0aW5nLmlzTWl4aW5BcHBsaWNhdGlvbiB8fCAhb3RoZXIuaXNNaXhpbkFwcGxpY2F0aW9uOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBMaWJyYXJ5IGJ1aWxkKExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5LCB7Ym9vbCBtb2RpZnlUYXJnZXR9KSB7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb25CdWlsZGVycy5pc0VtcHR5KTsKICAgIGNhbkFkZEltcGxlbWVudGF0aW9uQnVpbGRlcnMgPSB0cnVlOwogICAgSXRlcmF0b3I8QnVpbGRlcj4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgYnVpbGRCdWlsZGVyKGl0ZXJhdG9yLmN1cnJlbnQsIGNvcmVMaWJyYXJ5KTsKICAgIH0KICAgIGZvciAoSW1wbGVtZW50YXRpb25JbmZvIGluZm8gaW4gaW1wbGVtZW50YXRpb25CdWlsZGVycykgewogICAgICBTdHJpbmcgbmFtZSA9IGluZm8ubmFtZTsKICAgICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IGluZm8uZGVjbGFyYXRpb247CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gaW5mby5jaGFyT2Zmc2V0OwogICAgICBhZGRCdWlsZGVyKG5hbWUsIGRlY2xhcmF0aW9uLCBjaGFyT2Zmc2V0KTsKICAgICAgYnVpbGRCdWlsZGVyKGRlY2xhcmF0aW9uLCBjb3JlTGlicmFyeSk7CiAgICB9CiAgICBjYW5BZGRJbXBsZW1lbnRhdGlvbkJ1aWxkZXJzID0gZmFsc2U7CgogICAgc2NvcGUuZm9yRWFjaExvY2FsU2V0dGVyKChTdHJpbmcgbmFtZSwgQnVpbGRlciBzZXR0ZXIpIHsKICAgICAgQnVpbGRlciBtZW1iZXIgPSBzY29wZUJ1aWxkZXJbbmFtZV07CiAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCB8fAogICAgICAgICAgIW1lbWJlci5pc0ZpZWxkIHx8CiAgICAgICAgICBtZW1iZXIuaXNGaW5hbCB8fAogICAgICAgICAgbWVtYmVyLmlzQ29uc3QpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIHNldHRlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIC8vIFRPRE8oYWhlKTogQ29udGV4dCB0byBwcmV2aW91cyBtZXNzYWdlPwogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlQ29uZmxpY3RzV2l0aFNldHRlci53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIH0pOwoKICAgIGlmIChtb2RpZnlUYXJnZXQgPT0gZmFsc2UpIHJldHVybiBsaWJyYXJ5OwoKICAgIGxpYnJhcnkuaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYzsKICAgIGFkZERlcGVuZGVuY2llcyhsaWJyYXJ5LCBuZXcgU2V0PFNvdXJjZUxpYnJhcnlCdWlsZGVyPigpKTsKCiAgICBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yCiAgICAgICAgPy5zZXREb2N1bWVudGF0aW9uQ29tbWVudChsaWJyYXJ5LCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CgogICAgbGlicmFyeS5uYW1lID0gbmFtZTsKICAgIGxpYnJhcnkucHJvY2VkdXJlcy5zb3J0KGNvbXBhcmVQcm9jZWR1cmVzKTsKCiAgICBpZiAodW5zZXJpYWxpemFibGVFeHBvcnRzICE9IG51bGwpIHsKICAgICAgRmllbGQgcmVmZXJlbmNlRnJvbSA9IHJlZmVyZW5jZXNGcm9tSW5kZXhlZD8ubG9va3VwRmllbGQoIl9leHBvcnRzIyIpOwogICAgICBsaWJyYXJ5LmFkZE1lbWJlcihuZXcgRmllbGQobmV3IE5hbWUoIl9leHBvcnRzIyIsIGxpYnJhcnkpLAogICAgICAgICAgaW5pdGlhbGl6ZXI6IG5ldyBTdHJpbmdMaXRlcmFsKGpzb25FbmNvZGUodW5zZXJpYWxpemFibGVFeHBvcnRzKSksCiAgICAgICAgICBpc1N0YXRpYzogdHJ1ZSwKICAgICAgICAgIGlzQ29uc3Q6IHRydWUsCiAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkpOwogICAgfQoKICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CgogICAgcmV0dXJuIGxpYnJhcnk7CiAgfQoKICAvLy8gVXNlZCB0byBhZGQgaW1wbGVtZW50YXRpb24gYnVpbGRlciBkdXJpbmcgdGhlIGNhbGwgdG8gW2J1aWxkXSBhYm92ZS4KICAvLy8gQ3VycmVudGx5LCBvbmx5IGFub255bW91cyBtaXhpbnMgYXJlIHVzaW5nIGltcGxlbWVudGF0aW9uIGJ1aWxkZXJzIChzZWUKICAvLy8gW01peGluQXBwbGljYXRpb25CdWlsZGVyXQogIC8vLyAoLi4va2VybmVsL2tlcm5lbF9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnQpKS4KICB2b2lkIGFkZEltcGxlbWVudGF0aW9uQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIEJ1aWxkZXIgZGVjbGFyYXRpb24sIGludCBjaGFyT2Zmc2V0KSB7CiAgICBhc3NlcnQoY2FuQWRkSW1wbGVtZW50YXRpb25CdWlsZGVycywgIiRpbXBvcnRVcmkiKTsKICAgIGltcGxlbWVudGF0aW9uQnVpbGRlcnMKICAgICAgICAuYWRkKG5ldyBJbXBsZW1lbnRhdGlvbkluZm8obmFtZSwgZGVjbGFyYXRpb24sIGNoYXJPZmZzZXQpKTsKICB9CgogIHZvaWQgdmFsaWRhdGVQYXJ0KFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksIFNldDxVcmk+IHVzZWRQYXJ0cykgewogICAgaWYgKGxpYnJhcnkgIT0gbnVsbCAmJiBwYXJ0cy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIElmIFtsaWJyYXJ5XSBpcyBudWxsLCB3ZSBoYXZlIGFscmVhZHkgcmVwb3J0ZWQgYSBwcm9ibGVtIHRoYXQgdGhpcwogICAgICAvLyBwYXJ0IGlzIG9ycGhhbmVkLgogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBtZXNzYWdlUGFydEluUGFydExpYnJhcnlDb250ZXh0LndpdGhMb2NhdGlvbihsaWJyYXJ5LmZpbGVVcmksIC0xLCAxKSwKICAgICAgXTsKICAgICAgZm9yIChpbnQgb2Zmc2V0IGluIHBhcnRPZmZzZXRzKSB7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlUGFydEluUGFydCwgb2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICAgIH0KICAgICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBwYXJ0IGluIHBhcnRzKSB7CiAgICAgICAgLy8gTWFyayB0aGlzIHBhcnQgYXMgdXNlZCBzbyB3ZSBkb24ndCByZXBvcnQgaXQgYXMgb3JwaGFuZWQuCiAgICAgICAgdXNlZFBhcnRzLmFkZChwYXJ0LmltcG9ydFVyaSk7CiAgICAgIH0KICAgIH0KICAgIHBhcnRzLmNsZWFyKCk7CiAgICBpZiAoZXhwb3J0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bCiAgICAgICAgbWVzc2FnZVBhcnRFeHBvcnRDb250ZXh0LndpdGhMb2NhdGlvbihmaWxlVXJpLCAtMSwgMSksCiAgICAgIF07CiAgICAgIGZvciAoRXhwb3J0IGV4cG9ydCBpbiBleHBvcnRlcnMpIHsKICAgICAgICBleHBvcnQuZXhwb3J0ZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZVBhcnRFeHBvcnQsIGV4cG9ydC5jaGFyT2Zmc2V0LCAiZXhwb3J0Ii5sZW5ndGgsIG51bGwsCiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGluY2x1ZGVQYXJ0cyhTZXQ8VXJpPiB1c2VkUGFydHMpIHsKICAgIFNldDxVcmk+IHNlZW5QYXJ0cyA9IG5ldyBTZXQ8VXJpPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGludCBwYXJ0T2Zmc2V0ID0gcGFydE9mZnNldHNbaV07CiAgICAgIGlmIChwYXJ0ID09IHRoaXMpIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VQYXJ0T2ZTZWxmLCAtMSwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICB9IGVsc2UgaWYgKHNlZW5QYXJ0cy5hZGQocGFydC5maWxlVXJpKSkgewogICAgICAgIGlmIChwYXJ0LnBhcnRPZkxpYnJhcnkgIT0gbnVsbCkgewogICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlUGFydE9mVHdvTGlicmFyaWVzLCAtMSwgbm9MZW5ndGgsIHBhcnQuZmlsZVVyaSwKICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICBtZXNzYWdlUGFydE9mVHdvTGlicmFyaWVzQ29udGV4dC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgcGFydC5wYXJ0T2ZMaWJyYXJ5LmZpbGVVcmksIC0xLCBub0xlbmd0aCksCiAgICAgICAgICAgICAgICBtZXNzYWdlUGFydE9mVHdvTGlicmFyaWVzQ29udGV4dC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlVXJpLCAtMSwgbm9MZW5ndGgpCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChpc1BhdGNoKSB7CiAgICAgICAgICAgIHVzZWRQYXJ0cy5hZGQocGFydC5maWxlVXJpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVzZWRQYXJ0cy5hZGQocGFydC5pbXBvcnRVcmkpOwogICAgICAgICAgfQogICAgICAgICAgaW5jbHVkZVBhcnQocGFydCwgdXNlZFBhcnRzLCBwYXJ0T2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZVBhcnRUd2ljZS53aXRoQXJndW1lbnRzKHBhcnQuZmlsZVVyaSksIC0xLCBub0xlbmd0aCwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgaW5jbHVkZVBhcnQoCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQsIFNldDxVcmk+IHVzZWRQYXJ0cywgaW50IHBhcnRPZmZzZXQpIHsKICAgIGlmIChwYXJ0LnBhcnRPZlVyaSAhPSBudWxsKSB7CiAgICAgIGlmICh1cmlJc1ZhbGlkKHBhcnQucGFydE9mVXJpKSAmJiBwYXJ0LnBhcnRPZlVyaSAhPSBpbXBvcnRVcmkpIHsKICAgICAgICAvLyBUaGlzIGlzIGFuIGVycm9yLCBidXQgdGhlIHBhcnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwYXJ0cywKICAgICAgICAvLyBzbyB0aGF0IG1ldGFkYXRhIGFubm90YXRpb25zIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVQYXJ0T2ZVcmlNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgcGFydC5maWxlVXJpLCBpbXBvcnRVcmksIHBhcnQucGFydE9mVXJpKSwKICAgICAgICAgICAgcGFydE9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXJ0LnBhcnRPZk5hbWUgIT0gbnVsbCkgewogICAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgaWYgKHBhcnQucGFydE9mTmFtZSAhPSBuYW1lKSB7CiAgICAgICAgICAvLyBUaGlzIGlzIGFuIGVycm9yLCBidXQgdGhlIHBhcnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZgogICAgICAgICAgLy8gcGFydHMsIHNvIHRoYXQgbWV0YWRhdGEgYW5ub3RhdGlvbnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIHBhcnQuZmlsZVVyaSwgbmFtZSwgcGFydC5wYXJ0T2ZOYW1lKSwKICAgICAgICAgICAgICBwYXJ0T2Zmc2V0LAogICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGlzIGFuIGVycm9yLCBidXQgdGhlIHBhcnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwYXJ0cywKICAgICAgICAvLyBzbyB0aGF0IG1ldGFkYXRhIGFubm90YXRpb25zIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVQYXJ0T2ZVc2VVcmkud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIHBhcnQuZmlsZVVyaSwgZmlsZVVyaSwgcGFydC5wYXJ0T2ZOYW1lKSwKICAgICAgICAgICAgcGFydE9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHRoZSBwYXJ0IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcGFydHMsCiAgICAgIC8vIHNvIHRoYXQgbWV0YWRhdGEgYW5ub3RhdGlvbnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgYXNzZXJ0KCFwYXJ0LmlzUGFydCk7CiAgICAgIGlmICh1cmlJc1ZhbGlkKHBhcnQuZmlsZVVyaSkpIHsKICAgICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlTWlzc2luZ1BhcnRPZi53aXRoQXJndW1lbnRzKHBhcnQuZmlsZVVyaSksCiAgICAgICAgICAgIHBhcnRPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSB0byBtYXRjaC4KICAgIGlmIChsYW5ndWFnZVZlcnNpb24gIT0gcGFydC5sYW5ndWFnZVZlcnNpb24pIHsKICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvciwgYnV0IHRoZSBwYXJ0IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YKICAgICAgLy8gcGFydHMsIHNvIHRoYXQgbWV0YWRhdGEgYW5ub3RhdGlvbnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKICAgICAgaWYgKGxhbmd1YWdlVmVyc2lvbi5pc0V4cGxpY2l0KSB7CiAgICAgICAgY29udGV4dC5hZGQobWVzc2FnZUxhbmd1YWdlVmVyc2lvbkxpYnJhcnlDb250ZXh0LndpdGhMb2NhdGlvbigKICAgICAgICAgICAgbGFuZ3VhZ2VWZXJzaW9uLmZpbGVVcmksCiAgICAgICAgICAgIGxhbmd1YWdlVmVyc2lvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICBsYW5ndWFnZVZlcnNpb24uY2hhckNvdW50KSk7CiAgICAgIH0KICAgICAgaWYgKHBhcnQubGFuZ3VhZ2VWZXJzaW9uLmlzRXhwbGljaXQpIHsKICAgICAgICBjb250ZXh0LmFkZChtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uUGFydENvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICBwYXJ0Lmxhbmd1YWdlVmVyc2lvbi5maWxlVXJpLAogICAgICAgICAgICBwYXJ0Lmxhbmd1YWdlVmVyc2lvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICBwYXJ0Lmxhbmd1YWdlVmVyc2lvbi5jaGFyQ291bnQpKTsKICAgICAgfQogICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZUxhbmd1YWdlVmVyc2lvbk1pc21hdGNoSW5QYXJ0LCBwYXJ0T2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSwKICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgfQoKICAgIHBhcnQudmFsaWRhdGVQYXJ0KHRoaXMsIHVzZWRQYXJ0cyk7CiAgICBOYW1lSXRlcmF0b3IgcGFydERlY2xhcmF0aW9ucyA9IHBhcnQubmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKHBhcnREZWNsYXJhdGlvbnMubW92ZU5leHQoKSkgewogICAgICBTdHJpbmcgbmFtZSA9IHBhcnREZWNsYXJhdGlvbnMubmFtZTsKICAgICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IHBhcnREZWNsYXJhdGlvbnMuY3VycmVudDsKCiAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgICBMaXN0PEJ1aWxkZXI+IGR1cGxpY2F0ZWQgPSA8QnVpbGRlcj5bXTsKICAgICAgICB3aGlsZSAoZGVjbGFyYXRpb24ubmV4dCAhPSBudWxsKSB7CiAgICAgICAgICBkdXBsaWNhdGVkLmFkZChkZWNsYXJhdGlvbik7CiAgICAgICAgICBwYXJ0RGVjbGFyYXRpb25zLm1vdmVOZXh0KCk7CiAgICAgICAgICBkZWNsYXJhdGlvbiA9IHBhcnREZWNsYXJhdGlvbnMuY3VycmVudDsKICAgICAgICB9CiAgICAgICAgZHVwbGljYXRlZC5hZGQoZGVjbGFyYXRpb24pOwogICAgICAgIC8vIEhhbmRsZSBkdXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBpbiB0aGUgcGFydC4KICAgICAgICAvLwogICAgICAgIC8vIER1cGxpY2F0ZWQgZGVjbGFyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IGNyZWF0aW5nIGEgbGlua2VkIGxpc3QgdXNpbmcKICAgICAgICAvLyB0aGUgYG5leHRgIGZpZWxkLiBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIG1ha2luZyBhbGwgc2NvcGUgZW50cmllcyBiZQogICAgICAgIC8vIGEgYExpc3Q8RGVjbGFyYXRpb24+YC4KICAgICAgICAvLwogICAgICAgIC8vIFdlIG1haW50YWluIHRoZSBsaW5rZWQgbGlzdCBzbyB0aGF0IHRoZSBsYXN0IGVudHJ5IGlzIGVhc3kgdG8KICAgICAgICAvLyByZWNvZ25pemUgKGl0J3MgYG5leHRgIGZpZWxkIGlzIG51bGwpLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKICAgICAgICAvLyByZXZlcnNlZCB3aXRoIHJlc3BlY3QgdG8gc291cmNlIGNvZGUgb3JkZXIuIFNpbmNlIGtlcm5lbCBkb2Vzbid0CiAgICAgICAgLy8gYWxsb3cgZHVwbGljYXRlZCBkZWNsYXJhdGlvbnMsIHdlIGVuc3VyZSB0aGF0IHdlIG9ubHkgYWRkIHRoZSBmaXJzdAogICAgICAgIC8vIGRlY2xhcmF0aW9uIHRvIHRoZSBrZXJuZWwgdHJlZS4KICAgICAgICAvLwogICAgICAgIC8vIFNpbmNlIHRoZSBkdXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIsIHdlCiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZW0gaW4gcmV2ZXJzZSBvcmRlciBhcyB0aGlzIGlzIHNpbXBsZXIgYW5kIG5vcm1hbGx5CiAgICAgICAgLy8gbm90IGEgcHJvYmxlbS4gSG93ZXZlciwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY2FsbCBbYWRkQnVpbGRlcl0gaW4KICAgICAgICAvLyBzb3VyY2Ugb3JkZXIgYXMgaXQgd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSBjeWNsZXMuCiAgICAgICAgLy8KICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCBwcmVzZXJ2aW5nIHRoZSBvcmRlciBvZiB0aGUgbGlua3MuIFRoZQogICAgICAgIC8vIHBhcnQgbGlicmFyeSBzdGlsbCBrZWVwcyB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gaXRzIHNjb3BlIHNvIHRoYXQKICAgICAgICAvLyBEaWV0TGlzdGVuZXIgY2FuIGZpbmQgdGhlbS4KICAgICAgICBmb3IgKGludCBpID0gZHVwbGljYXRlZC5sZW5ndGg7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIEJ1aWxkZXIgZGVjbGFyYXRpb24gPSBkdXBsaWNhdGVkW2kgLSAxXTsKICAgICAgICAgIC8vIE5vIHJlZmVyZW5jZTogVGhlcmUgc2hvdWxkIGJlIG5vIGR1cGxpY2F0ZXMgd2hlbiB1c2luZyByZWZlcmVuY2VzLgogICAgICAgICAgYWRkQnVpbGRlcihuYW1lLCBkZWNsYXJhdGlvbiwgZGVjbGFyYXRpb24uY2hhck9mZnNldCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIE5vIHJlZmVyZW5jZTogVGhlIHBhcnQgaXMgaW4gdGhlIHNhbWUgbG9hZGVyIHNvIHRoZSByZWZlcmVuY2UKICAgICAgICAvLyAtIGlmIG5lZWRlZCAtIHdhcyBhbHJlYWR5IGFkZGVkLgogICAgICAgIGFkZEJ1aWxkZXIobmFtZSwgZGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQpOwogICAgICB9CiAgICB9CiAgICB0eXBlcy5hZGRBbGwocGFydC50eXBlcyk7CiAgICBjb25zdHJ1Y3RvclJlZmVyZW5jZXMuYWRkQWxsKHBhcnQuY29uc3RydWN0b3JSZWZlcmVuY2VzKTsKICAgIHBhcnQucGFydE9mTGlicmFyeSA9IHRoaXM7CiAgICBwYXJ0LnNjb3BlLmJlY29tZVBhcnRPZihzY29wZSk7CiAgICAvLyBUT0RPKGFoZSk6IEluY2x1ZGUgbWV0YWRhdGEgZnJvbSBwYXJ0PwoKICAgIG5hdGl2ZU1ldGhvZHMuYWRkQWxsKHBhcnQubmF0aXZlTWV0aG9kcyk7CiAgICBib3VuZGxlc3NUeXBlVmFyaWFibGVzLmFkZEFsbChwYXJ0LmJvdW5kbGVzc1R5cGVWYXJpYWJsZXMpOwogICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0cyBhcmUgZGlmZmVyZW50LiBUaGlzIGlzIG5vdCBub3JtYWxseSBhIHByb2JsZW0KICAgIC8vIGJ1dCBpcyBmb3IgcGF0Y2ggZmlsZXMuCiAgICBpZiAobGlicmFyeSAhPSBwYXJ0LmxpYnJhcnkgJiYgcGFydC5saWJyYXJ5LnByb2JsZW1zQXNKc29uICE9IG51bGwpIHsKICAgICAgbGlicmFyeS5wcm9ibGVtc0FzSnNvbiA/Pz0gPFN0cmluZz5bXTsKICAgICAgbGlicmFyeS5wcm9ibGVtc0FzSnNvbi5hZGRBbGwocGFydC5saWJyYXJ5LnByb2JsZW1zQXNKc29uKTsKICAgIH0KICAgIExpc3Q8RmllbGRCdWlsZGVyPiBwYXJ0SW1wbGljaXRseVR5cGVkRmllbGRzID0KICAgICAgICBwYXJ0LnRha2VJbXBsaWNpdGx5VHlwZWRGaWVsZHMoKTsKICAgIGlmIChwYXJ0SW1wbGljaXRseVR5cGVkRmllbGRzICE9IG51bGwpIHsKICAgICAgaWYgKF9pbXBsaWNpdGx5VHlwZWRGaWVsZHMgPT0gbnVsbCkgewogICAgICAgIF9pbXBsaWNpdGx5VHlwZWRGaWVsZHMgPSBwYXJ0SW1wbGljaXRseVR5cGVkRmllbGRzOwogICAgICB9IGVsc2UgewogICAgICAgIF9pbXBsaWNpdGx5VHlwZWRGaWVsZHMuYWRkQWxsKHBhcnRJbXBsaWNpdGx5VHlwZWRGaWVsZHMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHZvaWQgYnVpbGRJbml0aWFsU2NvcGVzKCkgewogICAgTmFtZUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgYWRkVG9FeHBvcnRTY29wZShpdGVyYXRvci5uYW1lLCBpdGVyYXRvci5jdXJyZW50KTsKICAgIH0KICB9CgogIHZvaWQgYWRkSW1wb3J0c1RvU2NvcGUoKSB7CiAgICBib29sIGV4cGxpY2l0Q29yZUltcG9ydCA9IHRoaXMgPT0gbG9hZGVyLmNvcmVMaWJyYXJ5OwogICAgZm9yIChJbXBvcnQgaW1wb3J0IGluIGltcG9ydHMpIHsKICAgICAgaWYgKGltcG9ydC5pbXBvcnRlZCA9PSBsb2FkZXIuY29yZUxpYnJhcnkpIHsKICAgICAgICBleHBsaWNpdENvcmVJbXBvcnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChpbXBvcnQuaW1wb3J0ZWQ/LmlzUGFydCA/PyBmYWxzZSkgewogICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5LndpdGhBcmd1bWVudHMoaW1wb3J0LmltcG9ydGVkLmZpbGVVcmkpLAogICAgICAgICAgICBpbXBvcnQuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICB9CiAgICAgIGltcG9ydC5maW5hbGl6ZUltcG9ydHModGhpcyk7CiAgICB9CiAgICBpZiAoIWV4cGxpY2l0Q29yZUltcG9ydCkgewogICAgICBsb2FkZXIuY29yZUxpYnJhcnkuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgICAgYWRkVG9TY29wZShuYW1lLCBtZW1iZXIsIC0xLCB0cnVlKTsKICAgICAgfSk7CiAgICB9CgogICAgZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgIGlmIChtZW1iZXIucGFyZW50ICE9IHRoaXMpIHsKICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgIGNhc2UgImR5bmFtaWMiOgogICAgICAgICAgY2FzZSAidm9pZCI6CiAgICAgICAgICBjYXNlICJOZXZlciI6CiAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlRXhwb3J0cyA/Pz0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgICAgICAgICB1bnNlcmlhbGl6YWJsZUV4cG9ydHNbbmFtZV0gPSBudWxsOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAobWVtYmVyIGlzIEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKSB7CiAgICAgICAgICAgICAgdW5zZXJpYWxpemFibGVFeHBvcnRzID8/PSA8U3RyaW5nLCBTdHJpbmc+e307CiAgICAgICAgICAgICAgdW5zZXJpYWxpemFibGVFeHBvcnRzW25hbWVdID0gbWVtYmVyLm1lc3NhZ2UubWVzc2FnZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBFdmVudHVhbGx5IChpbiAjYnVpbGRCdWlsZGVyKSBtZW1iZXJzIGFyZW4ndCBhZGRlZCB0byB0aGUKICAgICAgICAgICAgICAvLyBsaWJyYXJ5IGlmIHRoZSBoYXZlICduZXh0JyBwb2ludGVycywgc28gZG9uJ3QgYWRkIHRoZW0gYXMKICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsRXhwb3J0cyBlaXRoZXIuIEFkZCB0aGUgbGFzdCBvbmUgb25seSAodGhlIG9uZSB0aGF0CiAgICAgICAgICAgICAgLy8gd2lsbCBldmVudHVhbGx5IGJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5KS4KICAgICAgICAgICAgICBCdWlsZGVyIG1lbWJlckxhc3QgPSBtZW1iZXI7CiAgICAgICAgICAgICAgd2hpbGUgKG1lbWJlckxhc3QubmV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtZW1iZXJMYXN0ID0gbWVtYmVyTGFzdC5uZXh0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobWVtYmVyTGFzdCBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgICAgICAgIGxpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHMuYWRkKG1lbWJlckxhc3QuY2xzLnJlZmVyZW5jZSk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1iZXJMYXN0IGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgICAgICAgICAgIGxpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHMuYWRkKG1lbWJlckxhc3QudHlwZWRlZi5yZWZlcmVuY2UpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyTGFzdCBpcyBFeHRlbnNpb25CdWlsZGVyKSB7CiAgICAgICAgICAgICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLmFkZChtZW1iZXJMYXN0LmV4dGVuc2lvbi5yZWZlcmVuY2UpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyTGFzdCBpcyBNZW1iZXJCdWlsZGVyKSB7CiAgICAgICAgICAgICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLmFkZChtZW1iZXJMYXN0Lm1lbWJlci5yZWZlcmVuY2UpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bmhhbmRsZWQoJ21lbWJlcicsICdleHBvcnRTY29wZScsIG1lbWJlckxhc3QuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICBtZW1iZXJMYXN0LmZpbGVVcmkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFRvU2NvcGUoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyLCBpbnQgY2hhck9mZnNldCwgYm9vbCBpc0ltcG9ydCkgewogICAgQnVpbGRlciBleGlzdGluZyA9CiAgICAgICAgaW1wb3J0U2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBtZW1iZXIuaXNTZXR0ZXIpOwogICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKICAgICAgaWYgKGV4aXN0aW5nICE9IG1lbWJlcikgewogICAgICAgIGltcG9ydFNjb3BlLmFkZExvY2FsTWVtYmVyKAogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24obmFtZSwgZXhpc3RpbmcsIG1lbWJlciwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGlzSW1wb3J0OiBpc0ltcG9ydCksCiAgICAgICAgICAgIHNldHRlcjogbWVtYmVyLmlzU2V0dGVyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaW1wb3J0U2NvcGUuYWRkTG9jYWxNZW1iZXIobmFtZSwgbWVtYmVyLCBzZXR0ZXI6IG1lbWJlci5pc1NldHRlcik7CiAgICB9CiAgICBpZiAobWVtYmVyLmlzRXh0ZW5zaW9uKSB7CiAgICAgIGltcG9ydFNjb3BlLmFkZEV4dGVuc2lvbihtZW1iZXIpOwogICAgfQogIH0KCiAgLy8vIFJlc29sdmVzIGFsbCB1bnJlc29sdmVkIHR5cGVzIGluIFt0eXBlc10uIFRoZSBsaXN0IG9mIHR5cGVzIGlzIGNsZWFyZWQKICAvLy8gd2hlbiBkb25lLgogIGludCByZXNvbHZlVHlwZXMoKSB7CiAgICBpbnQgdHlwZUNvdW50ID0gdHlwZXMubGVuZ3RoOwogICAgZm9yIChVbnJlc29sdmVkVHlwZSB0IGluIHR5cGVzKSB7CiAgICAgIHQucmVzb2x2ZUluKHNjb3BlLCB0aGlzKTsKICAgICAgdC5jaGVja1R5cGUodGhpcyk7CiAgICB9CiAgICB0eXBlcy5jbGVhcigpOwogICAgcmV0dXJuIHR5cGVDb3VudDsKICB9CgogIEBvdmVycmlkZQogIGludCByZXNvbHZlQ29uc3RydWN0b3JzKF8pIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBJdGVyYXRvcjxCdWlsZGVyPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICBjb3VudCArPSBpdGVyYXRvci5jdXJyZW50LnJlc29sdmVDb25zdHJ1Y3RvcnModGhpcyk7CiAgICB9CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzIHsKICAgIC8vIFRPRE8oYWhlKTogQ29uc2lkZXIgaWYgd2Ugc2hvdWxkIHVzZSByZWxhdGl2aXplVXJpIGhlcmUuIFRoZSBkb3duc2lkZSB0bwogICAgLy8gZG9pbmcgdGhhdCBpcyB0aGF0IHRoaXMgVVJJIG1heSBiZSB1c2VkIGluIGFuIGVycm9yIG1lc3NhZ2UuIElkZWFsbHksIHdlCiAgICAvLyBzaG91bGQgY3JlYXRlIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHF1YWxpZmllZCBuYW1lcyB0aGF0IHdlIGNhbgogICAgLy8gcmVsYXRpdml6ZSB3aGVuIHByaW50aW5nIGEgbWVzc2FnZSwgYnV0IHN0aWxsIHN0b3JlIHRoZSBmdWxsIFVSSSBpbgogICAgLy8gLmRpbGwgZmlsZXMuCiAgICByZXR1cm4gbmFtZSA/PyAiPGxpYnJhcnkgJyRmaWxlVXJpJz4iOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCByZWNvcmRBY2Nlc3MoaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsIFVyaSBmaWxlVXJpKSB7CiAgICBhY2Nlc3NvcnMuYWRkKGZpbGVVcmkpOwogICAgYWNjZXNzb3JzLmFkZChjaGFyT2Zmc2V0KTsKICAgIGFjY2Vzc29ycy5hZGQobGVuZ3RoKTsKICAgIGlmIChhY2Nlc3NQcm9ibGVtICE9IG51bGwpIHsKICAgICAgYWRkUHJvYmxlbShhY2Nlc3NQcm9ibGVtLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmkpOwogICAgfQogIH0KCiAgdm9pZCBhZGRQcm9ibGVtQXRBY2Nlc3NvcnMoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBpZiAoYWNjZXNzUHJvYmxlbSA9PSBudWxsKSB7CiAgICAgIGlmIChhY2Nlc3NvcnMuaXNFbXB0eSAmJiB0aGlzID09IGxvYWRlci5maXJzdCkgewogICAgICAgIC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGxpYnJhcnksIGFuZCBub2JvZHkgYWNjZXNzIGl0IGRpcmVjdGx5LiBTbwogICAgICAgIC8vIHdlIG5lZWQgdG8gcmVwb3J0IGEgcHJvYmxlbS4KICAgICAgICBsb2FkZXIuYWRkUHJvYmxlbShtZXNzYWdlLCAtMSwgMSwgbnVsbCk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2Nlc3NvcnMubGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICBVcmkgYWNjZXNzb3IgPSBhY2Nlc3NvcnNbaV07CiAgICAgICAgaW50IGNoYXJPZmZzZXQgPSBhY2Nlc3NvcnNbaSArIDFdOwogICAgICAgIGludCBsZW5ndGggPSBhY2Nlc3NvcnNbaSArIDJdOwogICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBhY2Nlc3Nvcik7CiAgICAgIH0KICAgICAgYWNjZXNzUHJvYmxlbSA9IG1lc3NhZ2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBnZXQgb3JpZ2luID0+IGFjdHVhbE9yaWdpbiA/PyB0aGlzOwoKICBVcmkgZ2V0IGltcG9ydFVyaSA9PiBsaWJyYXJ5LmltcG9ydFVyaTsKCiAgdm9pZCBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mRHluYW1pYygpIHsKICAgIGFkZEJ1aWxkZXIoCiAgICAgICAgImR5bmFtaWMiLCBuZXcgRHluYW1pY1R5cGVCdWlsZGVyKGNvbnN0IER5bmFtaWNUeXBlKCksIHRoaXMsIC0xKSwgLTEpOwogIH0KCiAgdm9pZCBhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mTmV2ZXIoKSB7CiAgICBhZGRCdWlsZGVyKAogICAgICAgICJOZXZlciIsCiAgICAgICAgbmV3IE5ldmVyVHlwZUJ1aWxkZXIoCiAgICAgICAgICAgIGNvbnN0IE5ldmVyVHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSksIHRoaXMsIC0xKSwKICAgICAgICAtMSk7CiAgfQoKICBUeXBlQnVpbGRlciBhZGROYW1lZFR5cGUoT2JqZWN0IG5hbWUsIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIsCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cywgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBhZGRUeXBlKAogICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIG51bGxhYmlsaXR5QnVpbGRlciwgYXJndW1lbnRzKSwgY2hhck9mZnNldCk7CiAgfQoKICBUeXBlQnVpbGRlciBhZGRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUsIExpc3Q8VHlwZUJ1aWxkZXI+IG1peGlucywgaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBhZGRUeXBlKG5ldyBNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcihzdXBlcnR5cGUsIG1peGlucyksIGNoYXJPZmZzZXQpOwogIH0KCiAgVHlwZUJ1aWxkZXIgYWRkVm9pZFR5cGUoaW50IGNoYXJPZmZzZXQpIHsKICAgIC8vICd2b2lkJyBpcyBhbHdheXMgbnVsbGFibGUuCiAgICByZXR1cm4gYWRkTmFtZWRUeXBlKAogICAgICAgICJ2b2lkIiwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm51bGxhYmxlKCksIG51bGwsIGNoYXJPZmZzZXQpCiAgICAgIC4uYmluZChuZXcgVm9pZFR5cGVCdWlsZGVyKGNvbnN0IFZvaWRUeXBlKCksIHRoaXMsIGNoYXJPZmZzZXQpKTsKICB9CgogIC8vLyBBZGQgYSBwcm9ibGVtIHRoYXQgbWlnaHQgbm90IGJlIHJlcG9ydGVkIGltbWVkaWF0ZWx5LgogIC8vLwogIC8vLyBQcm9ibGVtcyB3aWxsIGJlIGlzc3VlZCBhZnRlciBzb3VyY2UgaW5mb3JtYXRpb24gaGFzIGJlZW4gYWRkZWQuCiAgLy8vIE9uY2UgdGhlIHByb2JsZW1zIGhhcyBiZWVuIGlzc3VlZCwgYWRkaW5nIGEgbmV3ICJwb3N0cG9uZWQiIHByb2JsZW0gd2lsbAogIC8vLyBiZSBpc3N1ZWQgaW1tZWRpYXRlbHkuCiAgdm9pZCBhZGRQb3N0cG9uZWRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSkgewogICAgaWYgKHBvc3Rwb25lZFByb2JsZW1zSXNzdWVkKSB7CiAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3Rwb25lZFByb2JsZW1zID8/PSA8UG9zdHBvbmVkUHJvYmxlbT5bXTsKICAgICAgcG9zdHBvbmVkUHJvYmxlbXMKICAgICAgICAgIC5hZGQobmV3IFBvc3Rwb25lZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpKSk7CiAgICB9CiAgfQoKICB2b2lkIGlzc3VlUG9zdHBvbmVkUHJvYmxlbXMoKSB7CiAgICBwb3N0cG9uZWRQcm9ibGVtc0lzc3VlZCA9IHRydWU7CiAgICBpZiAocG9zdHBvbmVkUHJvYmxlbXMgPT0gbnVsbCkgcmV0dXJuOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3N0cG9uZWRQcm9ibGVtcy5sZW5ndGg7ICsraSkgewogICAgICBQb3N0cG9uZWRQcm9ibGVtIHBvc3Rwb25lZFByb2JsZW0gPSBwb3N0cG9uZWRQcm9ibGVtc1tpXTsKICAgICAgYWRkUHJvYmxlbShwb3N0cG9uZWRQcm9ibGVtLm1lc3NhZ2UsIHBvc3Rwb25lZFByb2JsZW0uY2hhck9mZnNldCwKICAgICAgICAgIHBvc3Rwb25lZFByb2JsZW0ubGVuZ3RoLCBwb3N0cG9uZWRQcm9ibGVtLmZpbGVVcmkpOwogICAgfQogICAgcG9zdHBvbmVkUHJvYmxlbXMgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LAogICAgICBib29sIHByb2JsZW1PbkxpYnJhcnk6IGZhbHNlfSkgewogICAgRm9ybWF0dGVkTWVzc2FnZSBmb3JtYXR0ZWRNZXNzYWdlID0gc3VwZXIuYWRkUHJvYmxlbSgKICAgICAgICBtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksCiAgICAgICAgd2FzSGFuZGxlZDogd2FzSGFuZGxlZCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIHNldmVyaXR5OiBzZXZlcml0eSwKICAgICAgICBwcm9ibGVtT25MaWJyYXJ5OiB0cnVlKTsKICAgIGlmIChmb3JtYXR0ZWRNZXNzYWdlICE9IG51bGwpIHsKICAgICAgbGlicmFyeS5wcm9ibGVtc0FzSnNvbiA/Pz0gPFN0cmluZz5bXTsKICAgICAgbGlicmFyeS5wcm9ibGVtc0FzSnNvbi5hZGQoZm9ybWF0dGVkTWVzc2FnZS50b0pzb25TdHJpbmcoKSk7CiAgICB9CiAgICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZTsKICB9CgogIHZvaWQgYWRkQ2xhc3MoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBTdHJpbmcgY2xhc3NOYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIFR5cGVCdWlsZGVyIHN1cGVydHlwZSwKICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gaW50ZXJmYWNlcywKICAgICAgaW50IHN0YXJ0T2Zmc2V0LAogICAgICBpbnQgbmFtZU9mZnNldCwKICAgICAgaW50IGVuZE9mZnNldCwKICAgICAgaW50IHN1cGVydHlwZU9mZnNldCkgewogICAgX2FkZENsYXNzKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NEZWNsYXJhdGlvbiwKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgY2xhc3NOYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgc3VwZXJ0eXBlLAogICAgICAgIGludGVyZmFjZXMsCiAgICAgICAgc3RhcnRPZmZzZXQsCiAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICBlbmRPZmZzZXQsCiAgICAgICAgc3VwZXJ0eXBlT2Zmc2V0KTsKICB9CgogIHZvaWQgYWRkTWl4aW5EZWNsYXJhdGlvbigKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFN0cmluZyBjbGFzc05hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlLAogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzLAogICAgICBpbnQgc3RhcnRPZmZzZXQsCiAgICAgIGludCBuYW1lT2Zmc2V0LAogICAgICBpbnQgZW5kT2Zmc2V0LAogICAgICBpbnQgc3VwZXJ0eXBlT2Zmc2V0KSB7CiAgICBfYWRkQ2xhc3MoCiAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5taXhpbkRlY2xhcmF0aW9uLAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG1vZGlmaWVycywKICAgICAgICBjbGFzc05hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBzdXBlcnR5cGUsCiAgICAgICAgaW50ZXJmYWNlcywKICAgICAgICBzdGFydE9mZnNldCwKICAgICAgICBuYW1lT2Zmc2V0LAogICAgICAgIGVuZE9mZnNldCwKICAgICAgICBzdXBlcnR5cGVPZmZzZXQpOwogIH0KCiAgdm9pZCBfYWRkQ2xhc3MoCiAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQga2luZCwKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFN0cmluZyBjbGFzc05hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlLAogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzLAogICAgICBpbnQgc3RhcnRPZmZzZXQsCiAgICAgIGludCBuYW1lT2Zmc2V0LAogICAgICBpbnQgZW5kT2Zmc2V0LAogICAgICBpbnQgc3VwZXJ0eXBlT2Zmc2V0KSB7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luQ2xhc3NEZWNsYXJhdGlvbmAuCiAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGRlY2xhcmF0aW9uID0KICAgICAgICBlbmROZXN0ZWREZWNsYXJhdGlvbihraW5kLCBjbGFzc05hbWUpCiAgICAgICAgICAuLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCB0aGlzKTsKICAgIGFzc2VydChkZWNsYXJhdGlvbi5wYXJlbnQgPT0gbGlicmFyeURlY2xhcmF0aW9uKTsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IG1lbWJlcnMgPSBkZWNsYXJhdGlvbi5tZW1iZXJzOwogICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gY29uc3RydWN0b3JzID0gZGVjbGFyYXRpb24uY29uc3RydWN0b3JzOwogICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gc2V0dGVycyA9IGRlY2xhcmF0aW9uLnNldHRlcnM7CgogICAgU2NvcGUgY2xhc3NTY29wZSA9IG5ldyBTY29wZSgKICAgICAgICBsb2NhbDogbWVtYmVycywKICAgICAgICBzZXR0ZXJzOiBzZXR0ZXJzLAogICAgICAgIHBhcmVudDogc2NvcGUud2l0aFR5cGVWYXJpYWJsZXModHlwZVZhcmlhYmxlcyksCiAgICAgICAgZGVidWdOYW1lOiAiY2xhc3MgJGNsYXNzTmFtZSIsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CgogICAgLy8gV2hlbiBsb29raW5nIHVwIGEgY29uc3RydWN0b3IsIHdlIGRvbid0IGNvbnNpZGVyIHR5cGUgdmFyaWFibGVzIG9yIHRoZQogICAgLy8gbGlicmFyeSBzY29wZS4KICAgIENvbnN0cnVjdG9yU2NvcGUgY29uc3RydWN0b3JTY29wZSA9CiAgICAgICAgbmV3IENvbnN0cnVjdG9yU2NvcGUoY2xhc3NOYW1lLCBjb25zdHJ1Y3RvcnMpOwogICAgYm9vbCBpc01peGluRGVjbGFyYXRpb24gPSBmYWxzZTsKICAgIGlmIChtb2RpZmllcnMgJiBtaXhpbkRlY2xhcmF0aW9uTWFzayAhPSAwKSB7CiAgICAgIGlzTWl4aW5EZWNsYXJhdGlvbiA9IHRydWU7CiAgICAgIG1vZGlmaWVycyA9IChtb2RpZmllcnMgJiB+bWl4aW5EZWNsYXJhdGlvbk1hc2spIHwgYWJzdHJhY3RNYXNrOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uLmhhc0NvbnN0Q29uc3RydWN0b3IpIHsKICAgICAgbW9kaWZpZXJzIHw9IGhhc0NvbnN0Q29uc3RydWN0b3JNYXNrOwogICAgfQogICAgQ2xhc3MgcmVmZXJlbmNlc0Zyb21DbGFzczsKICAgIGlmIChyZWZlcmVuY2VzRnJvbSAhPSBudWxsKSB7CiAgICAgIHJlZmVyZW5jZXNGcm9tQ2xhc3MgPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwQ2xhc3MoY2xhc3NOYW1lKTsKICAgICAgYXNzZXJ0KHJlZmVyZW5jZXNGcm9tQ2xhc3MgPT0gbnVsbCB8fAogICAgICAgICAgX2N1cnJlbnRDbGFzc1JlZmVyZW5jZXNGcm9tSW5kZXhlZCAhPSBudWxsKTsKICAgIH0KICAgIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIgPSBuZXcgU291cmNlQ2xhc3NCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG1vZGlmaWVycywKICAgICAgICBjbGFzc05hbWUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBhcHBseU1peGlucyhzdXBlcnR5cGUsIHN0YXJ0T2Zmc2V0LCBuYW1lT2Zmc2V0LCBlbmRPZmZzZXQsIGNsYXNzTmFtZSwKICAgICAgICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uLAogICAgICAgICAgICB0eXBlVmFyaWFibGVzOiB0eXBlVmFyaWFibGVzKSwKICAgICAgICBpbnRlcmZhY2VzLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFkZCB0aGUgYG9uYCBjbGF1c2UgdHlwZXMgb2YgYSBtaXhpbiBkZWNsYXJhdGlvbgogICAgICAgIC8vIGhlcmUuCiAgICAgICAgbnVsbCwKICAgICAgICBjbGFzc1Njb3BlLAogICAgICAgIGNvbnN0cnVjdG9yU2NvcGUsCiAgICAgICAgdGhpcywKICAgICAgICBuZXcgTGlzdDxDb25zdHJ1Y3RvclJlZmVyZW5jZUJ1aWxkZXI+LmZyb20oY29uc3RydWN0b3JSZWZlcmVuY2VzKSwKICAgICAgICBzdGFydE9mZnNldCwKICAgICAgICBuYW1lT2Zmc2V0LAogICAgICAgIGVuZE9mZnNldCwKICAgICAgICByZWZlcmVuY2VzRnJvbUNsYXNzLAogICAgICAgIF9jdXJyZW50Q2xhc3NSZWZlcmVuY2VzRnJvbUluZGV4ZWQsCiAgICAgICAgaXNNaXhpbkRlY2xhcmF0aW9uOiBpc01peGluRGVjbGFyYXRpb24pOwogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoY2xhc3NCdWlsZGVyLmNscywgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwoKICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlcy5jbGVhcigpOwogICAgTWFwPFN0cmluZywgVHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlc0J5TmFtZSA9CiAgICAgICAgY2hlY2tUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIGNsYXNzQnVpbGRlcik7CiAgICB2b2lkIHNldFBhcmVudChTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgICAgd2hpbGUgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgbWVtYmVyLnBhcmVudCA9IGNsYXNzQnVpbGRlcjsKICAgICAgICBtZW1iZXIgPSBtZW1iZXIubmV4dDsKICAgICAgfQogICAgfQoKICAgIHZvaWQgc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lICE9IG51bGwpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR2ID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtuYW1lXTsKICAgICAgICBpZiAodHYgIT0gbnVsbCkgewogICAgICAgICAgY2xhc3NCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgbWVzc2FnZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgdHYuZmlsZVVyaSwgdHYuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldFBhcmVudChuYW1lLCBtZW1iZXIpOwogICAgfQoKICAgIG1lbWJlcnMuZm9yRWFjaChzZXRQYXJlbnRBbmRDaGVja0NvbmZsaWN0cyk7CiAgICBjb25zdHJ1Y3RvcnMuZm9yRWFjaChzZXRQYXJlbnRBbmRDaGVja0NvbmZsaWN0cyk7CiAgICBzZXR0ZXJzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgYWRkQnVpbGRlcihjbGFzc05hbWUsIGNsYXNzQnVpbGRlciwgbmFtZU9mZnNldCwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZXNGcm9tQ2xhc3M/LnJlZmVyZW5jZSk7CiAgfQoKICBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPiBjaGVja1R5cGVWYXJpYWJsZXMoCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywgQnVpbGRlciBvd25lcikgewogICAgaWYgKHR5cGVWYXJpYWJsZXM/LmlzRW1wdHkgPz8gdHJ1ZSkgcmV0dXJuIG51bGw7CiAgICBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzQnlOYW1lID0KICAgICAgICA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPnt9OwogICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR2IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBleGlzdGluZyA9IHR5cGVWYXJpYWJsZXNCeU5hbWVbdHYubmFtZV07CiAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGV4aXN0aW5nLmlzRXh0ZW5zaW9uVHlwZVBhcmFtZXRlcikgewogICAgICAgICAgLy8gVGhlIHR5cGUgcGFyYW1ldGVyIGZyb20gdGhlIGV4dGVuc2lvbiBpcyBzaGFkb3dlZCBieSB0aGUgdHlwZQogICAgICAgICAgLy8gcGFyYW1ldGVyIGZyb20gdGhlIG1lbWJlci4gUmVuYW1lIHRoZSBzaGFkb3dlZCB0eXBlIHBhcmFtZXRlci4KICAgICAgICAgIGV4aXN0aW5nLnBhcmFtZXRlci5uYW1lID0gJyMke2V4aXN0aW5nLm5hbWV9JzsKICAgICAgICAgIHR5cGVWYXJpYWJsZXNCeU5hbWVbdHYubmFtZV0gPSB0djsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWUsIHR2LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgdHYubmFtZS5sZW5ndGgsIGZpbGVVcmksCiAgICAgICAgICAgICAgY29udGV4dDogWwogICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHYubmFtZSkKICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlVXJpLCBleGlzdGluZy5jaGFyT2Zmc2V0LCBleGlzdGluZy5uYW1lLmxlbmd0aCkKICAgICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZVZhcmlhYmxlc0J5TmFtZVt0di5uYW1lXSA9IHR2OwogICAgICAgIGlmIChvd25lciBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIC8vIE9ubHkgY2xhc3NlcyBhbmQgdHlwZSB2YXJpYWJsZXMgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lLiBTZWUKICAgICAgICAgIC8vIFsjMjk1NTVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTU1NSkuCiAgICAgICAgICBpZiAodHYubmFtZSA9PSBvd25lci5uYW1lKSB7CiAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZVR5cGVWYXJpYWJsZVNhbWVOYW1lQXNFbmNsb3NpbmcsIHR2LmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICB0di5uYW1lLmxlbmd0aCwgZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZVZhcmlhYmxlc0J5TmFtZTsKICB9CgogIHZvaWQgYWRkRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBTdHJpbmcgZXh0ZW5zaW9uTmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBUeXBlQnVpbGRlciB0eXBlLAogICAgICBpbnQgc3RhcnRPZmZzZXQsCiAgICAgIGludCBuYW1lT2Zmc2V0LAogICAgICBpbnQgZW5kT2Zmc2V0KSB7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25gLgogICAgVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciBkZWNsYXJhdGlvbiA9IGVuZE5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZXh0ZW5zaW9uRGVjbGFyYXRpb24sIGV4dGVuc2lvbk5hbWUpCiAgICAgIC4ucmVzb2x2ZVR5cGVzKHR5cGVWYXJpYWJsZXMsIHRoaXMpOwogICAgYXNzZXJ0KGRlY2xhcmF0aW9uLnBhcmVudCA9PSBsaWJyYXJ5RGVjbGFyYXRpb24pOwogICAgTWFwPFN0cmluZywgTWVtYmVyQnVpbGRlcj4gbWVtYmVycyA9IGRlY2xhcmF0aW9uLm1lbWJlcnM7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBjb25zdHJ1Y3RvcnMgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvcnM7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBzZXR0ZXJzID0gZGVjbGFyYXRpb24uc2V0dGVyczsKCiAgICBTY29wZSBjbGFzc1Njb3BlID0gbmV3IFNjb3BlKAogICAgICAgIGxvY2FsOiBtZW1iZXJzLAogICAgICAgIHNldHRlcnM6IHNldHRlcnMsCiAgICAgICAgcGFyZW50OiBzY29wZS53aXRoVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzKSwKICAgICAgICBkZWJ1Z05hbWU6ICJleHRlbnNpb24gJGV4dGVuc2lvbk5hbWUiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwoKICAgIEV4dGVuc2lvbiByZWZlcmVuY2VGcm9tID0KICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWQ/Lmxvb2t1cEV4dGVuc2lvbihleHRlbnNpb25OYW1lKTsKCiAgICBFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXIgPSBuZXcgU291cmNlRXh0ZW5zaW9uQnVpbGRlcigKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgZXh0ZW5zaW9uTmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIHR5cGUsCiAgICAgICAgY2xhc3NTY29wZSwKICAgICAgICB0aGlzLAogICAgICAgIHN0YXJ0T2Zmc2V0LAogICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgZW5kT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZUZyb20pOwogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci5leHRlbnNpb24sIGRvY3VtZW50YXRpb25Db21tZW50KTsKCiAgICBjb25zdHJ1Y3RvclJlZmVyZW5jZXMuY2xlYXIoKTsKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXNCeU5hbWUgPQogICAgICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBleHRlbnNpb25CdWlsZGVyKTsKICAgIHZvaWQgc2V0UGFyZW50KFN0cmluZyBuYW1lLCBNZW1iZXJCdWlsZGVyIG1lbWJlcikgewogICAgICB3aGlsZSAobWVtYmVyICE9IG51bGwpIHsKICAgICAgICBtZW1iZXIucGFyZW50ID0gZXh0ZW5zaW9uQnVpbGRlcjsKICAgICAgICBtZW1iZXIgPSBtZW1iZXIubmV4dDsKICAgICAgfQogICAgfQoKICAgIHZvaWQgc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lICE9IG51bGwpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR2ID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtuYW1lXTsKICAgICAgICBpZiAodHYgIT0gbnVsbCkgewogICAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZS53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgIG5hbWUubGVuZ3RoLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIG1lc3NhZ2VDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ2F1c2Uud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHR2LmZpbGVVcmksIHR2LmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKQogICAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXRQYXJlbnQobmFtZSwgbWVtYmVyKTsKICAgIH0KCiAgICBtZW1iZXJzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgY29uc3RydWN0b3JzLmZvckVhY2goc2V0UGFyZW50QW5kQ2hlY2tDb25mbGljdHMpOwogICAgc2V0dGVycy5mb3JFYWNoKHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzKTsKICAgIGFkZEJ1aWxkZXIoZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uQnVpbGRlciwgbmFtZU9mZnNldCwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSk7CiAgfQoKICBUeXBlQnVpbGRlciBhcHBseU1peGlucyhUeXBlQnVpbGRlciB0eXBlLCBpbnQgc3RhcnRDaGFyT2Zmc2V0LCBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsIFN0cmluZyBzdWJjbGFzc05hbWUsIGJvb2wgaXNNaXhpbkRlY2xhcmF0aW9uLAogICAgICB7U3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXN9KSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBuYW1lZAogICAgICAvLyBtaXhpbiBhcHBsaWNhdGlvbi4KICAgICAgaWYgKGRvY3VtZW50YXRpb25Db21tZW50ICE9IG51bGwpIHsKICAgICAgICB1bmhhbmRsZWQoImRvY3VtZW50YXRpb25Db21tZW50IiwgInVubmFtZWQgbWl4aW4gYXBwbGljYXRpb24iLAogICAgICAgICAgICBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgICAgdW5oYW5kbGVkKCJtZXRhZGF0YSIsICJ1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgdW5oYW5kbGVkKAogICAgICAgICAgICAiaW50ZXJmYWNlcyIsICJ1bm5hbWVkIG1peGluIGFwcGxpY2F0aW9uIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlIGlzIE1peGluQXBwbGljYXRpb25CdWlsZGVyKSB7CiAgICAgIC8vIERvY3VtZW50YXRpb24gYmVsb3cgYXNzdW1lcyB0aGUgZ2l2ZW4gbWl4aW4gYXBwbGljYXRpb24gaXMgaW4gb25lIG9mCiAgICAgIC8vIHRoZXNlIGZvcm1zOgogICAgICAvLwogICAgICAvLyAgICAgY2xhc3MgQyBleHRlbmRzIFMgd2l0aCBNMSwgTTIsIE0zOwogICAgICAvLyAgICAgY2xhc3MgTmFtZWQgPSBTIHdpdGggTTEsIE0yLCBNMzsKICAgICAgLy8KICAgICAgLy8gV2hlbiB3ZSByZWZlciB0byB0aGUgc3ViY2xhc3MsIHdlIG1lYW4gYENgIG9yIGBOYW1lZGAuCgogICAgICAvLy8gVGhlIGN1cnJlbnQgc3VwZXJ0eXBlLgogICAgICAvLy8KICAgICAgLy8vIFN0YXJ0cyBvdXQgaGF2aW5nIHRoZSB2YWx1ZSBgU2AgYW5kIG9uIGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBsb29wCiAgICAgIC8vLyBiZWxvdywgaXQgd2lsbCB0YWtlIG9uIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvOgogICAgICAvLy8KICAgICAgLy8vIDEuIGBTIHdpdGggTTFgLgogICAgICAvLy8gMi4gYChTIHdpdGggTTEpIHdpdGggTTJgLgogICAgICAvLy8gMy4gYCgoUyB3aXRoIE0xKSB3aXRoIE0yKSB3aXRoIE0zYC4KICAgICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlID0gdHlwZS5zdXBlcnR5cGUgPz8gbG9hZGVyLnRhcmdldC5vYmplY3RUeXBlOwoKICAgICAgLy8vIFRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSBtaXhpbiBhcHBsaWNhdGlvbidzIHN5bnRoZXRpYyBuYW1lLiBJdAogICAgICAvLy8gc3RhcnRzIG91dCBhcyB0aGUgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcywgYnV0IGlzIG9ubHkgdXNlZCBhZnRlciBpdAogICAgICAvLy8gaGFzIGJlZW4gY29tYmluZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBtaXhpbi4gSW4gdGhlIGV4YW1wbGVzCiAgICAgIC8vLyBmcm9tIGFib3ZlLCBpdCB3aWxsIHRha2UgdGhlc2UgdmFsdWVzOgogICAgICAvLy8KICAgICAgLy8vIDEuIGBTJk0xYAogICAgICAvLy8gMi4gYFMmTTEmTTJgCiAgICAgIC8vLyAzLiBgUyZNMSZNMiZNM2AuCiAgICAgIC8vLwogICAgICAvLy8gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgbWl4aW4gYXBwbGljYXRpb24gaXMgb2J0YWluZWQgYnkgcHJlcGVuZGluZyB0aGUKICAgICAgLy8vIG5hbWUgb2YgdGhlIHN1YmNsYXNzIChgQ2Agb3IgYE5hbWVkYCBpbiB0aGUgYWJvdmUgZXhhbXBsZXMpIHRvIHRoZQogICAgICAvLy8gcnVubmluZyBuYW1lLiBGb3IgdGhlIGV4YW1wbGUgYENgLCB0aGF0IGxlYWRzIHRvIHRoZXNlIGZ1bGwgbmFtZXM6CiAgICAgIC8vLwogICAgICAvLy8gMS4gYF9DJlMmTTFgCiAgICAgIC8vLyAyLiBgX0MmUyZNMSZNMmAKICAgICAgLy8vIDMuIGBfQyZTJk0xJk0yJk0zYC4KICAgICAgLy8vCiAgICAgIC8vLyBGb3IgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiwgdGhlIGxhc3QgbmFtZSBoYXMgYmVlbiBnaXZlbiBieSB0aGUKICAgICAgLy8vIHByb2dyYW1tZXIsIHNvIGZvciB0aGUgZXhhbXBsZSBgTmFtZWRgIHdlIHNlZSB0aGVzZSBmdWxsIG5hbWVzOgogICAgICAvLy8KICAgICAgLy8vIDEuIGBfTmFtZWQmUyZNMWAKICAgICAgLy8vIDIuIGBfTmFtZWQmUyZNMSZNMmAKICAgICAgLy8vIDMuIGBOYW1lZGAuCiAgICAgIFN0cmluZyBydW5uaW5nTmFtZSA9IGV4dHJhY3ROYW1lKHN1cGVydHlwZS5uYW1lKTsKCiAgICAgIC8vLyBUcnVlIHdoZW4gd2UncmUgYnVpbGRpbmcgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbi4gTm90aWNlIHRoYXQgZm9yCiAgICAgIC8vLyB0aGUgYE5hbWVkYCBleGFtcGxlIGFib3ZlLCB0aGlzIGlzIG9ubHkgdHJ1ZSBvbiB0aGUgbGFzdAogICAgICAvLy8gaXRlcmF0aW9uIGJlY2F1c2Ugb25seSB0aGUgZnVsbCBtaXhpbiBhcHBsaWNhdGlvbiBpcyBuYW1lZC4KICAgICAgYm9vbCBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbjsKCiAgICAgIC8vLyBUaGUgbmFtZXMgb2YgdGhlIHR5cGUgdmFyaWFibGVzIG9mIHRoZSBzdWJjbGFzcy4KICAgICAgU2V0PFN0cmluZz4gdHlwZVZhcmlhYmxlTmFtZXM7CiAgICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICB0eXBlVmFyaWFibGVOYW1lcyA9IG5ldyBTZXQ8U3RyaW5nPigpOwogICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0eXBlVmFyaWFibGUgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgICAgdHlwZVZhcmlhYmxlTmFtZXMuYWRkKHR5cGVWYXJpYWJsZS5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB0cnVlYCBpZiBhIHR5cGUgdmFyaWFibGUgd2l0aCBhIG5hbWUKICAgICAgLy8vIGZyb20gW3R5cGVWYXJpYWJsZU5hbWVzXSBpcyByZWZlcmVuY2VkIGluIFt0eXBlXS4KICAgICAgYm9vbCB1c2VzVHlwZVZhcmlhYmxlcyhUeXBlQnVpbGRlciB0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgICAgaWYgKHR5cGUuZGVjbGFyYXRpb24gaXMgVHlwZVZhcmlhYmxlQnVpbGRlcikgewogICAgICAgICAgICByZXR1cm4gdHlwZVZhcmlhYmxlTmFtZXMuY29udGFpbnModHlwZS5kZWNsYXJhdGlvbi5uYW1lKTsKICAgICAgICAgIH0KCiAgICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiB0eXBlQXJndW1lbnRzID0gdHlwZS5hcmd1bWVudHM7CiAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsICYmIHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIGFyZ3VtZW50IGluIHR5cGVBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBpZiAodXNlc1R5cGVWYXJpYWJsZXMoYXJndW1lbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgICAgaWYgKHR5cGUuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgICAgICAgaWYgKHVzZXNUeXBlVmFyaWFibGVzKGZvcm1hbC50eXBlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSB0eXBlLnR5cGVWYXJpYWJsZXM7CiAgICAgICAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgICAgaWYgKHVzZXNUeXBlVmFyaWFibGVzKHZhcmlhYmxlLmJvdW5kKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdXNlc1R5cGVWYXJpYWJsZXModHlwZS5yZXR1cm5UeXBlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLy8gSXRlcmF0ZSBvdmVyIHRoZSBtaXhpbnMgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBBdCB0aGUgZW5kIG9mIGVhY2gKICAgICAgLy8vIGl0ZXJhdGlvbiwgYSBuZXcgW3N1cGVydHlwZV0gaXMgY29tcHV0ZWQgdGhhdCBpcyB0aGUgbWl4aW4KICAgICAgLy8vIGFwcGxpY2F0aW9uIG9mIFtzdXBlcnR5cGVdIHdpdGggdGhlIGN1cnJlbnQgbWl4aW4uCiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5taXhpbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBUeXBlQnVpbGRlciBtaXhpbiA9IHR5cGUubWl4aW5zW2ldOwogICAgICAgIGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uID0gbmFtZSAhPSBudWxsICYmIG1peGluID09IHR5cGUubWl4aW5zLmxhc3Q7CiAgICAgICAgYm9vbCBpc0dlbmVyaWMgPSBmYWxzZTsKICAgICAgICBpZiAoIWlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgICBpZiAoc3VwZXJ0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgICAgaXNHZW5lcmljID0gaXNHZW5lcmljIHx8IHVzZXNUeXBlVmFyaWFibGVzKHN1cGVydHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWl4aW4gaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgICAgICAgICBydW5uaW5nTmFtZSArPSAiJiR7ZXh0cmFjdE5hbWUobWl4aW4ubmFtZSl9IjsKICAgICAgICAgICAgaXNHZW5lcmljID0gaXNHZW5lcmljIHx8IHVzZXNUeXBlVmFyaWFibGVzKG1peGluKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU3RyaW5nIGZ1bGxuYW1lID0KICAgICAgICAgICAgaXNOYW1lZE1peGluQXBwbGljYXRpb24gPyBuYW1lIDogIl8kc3ViY2xhc3NOYW1lJiRydW5uaW5nTmFtZSI7CiAgICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBhcHBsaWNhdGlvblR5cGVWYXJpYWJsZXM7CiAgICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gYXBwbGljYXRpb25UeXBlQXJndW1lbnRzOwogICAgICAgIGlmIChpc05hbWVkTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLCBpdCBtdXN0IGJlIGdpdmVuIGFsbCB0aGUKICAgICAgICAgIC8vIGRlY2xhcmF0ZWQgdHlwZSB2YXJpYWJsZXMuCiAgICAgICAgICBhcHBsaWNhdGlvblR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHBhc3MgdGhlIGZyZXNoIHR5cGUgdmFyaWFibGVzIHRvIHRoZSBtaXhpbgogICAgICAgICAgLy8gYXBwbGljYXRpb24gaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSdyZSBkZWNsYXJlZCBvbiB0aGUgc3ViY2xhc3MuCiAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7CiAgICAgICAgICAgIHRoaXMuYmVnaW5OZXN0ZWREZWNsYXJhdGlvbigKICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQudW5uYW1lZE1peGluQXBwbGljYXRpb24sCiAgICAgICAgICAgICAgICAibWl4aW4gYXBwbGljYXRpb24iKTsKCiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlcyA9IGNvcHlUeXBlVmFyaWFibGVzKAogICAgICAgICAgICAgICAgdHlwZVZhcmlhYmxlcywgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIpOwoKICAgICAgICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMgPSA8VHlwZUJ1aWxkZXI+W107CiAgICAgICAgICAgIGlmIChzdXBlcnR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlciAmJiBzdXBlcnR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZS5hcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHN1cGVydHlwZS5hcmd1bWVudHNbaV0gPSBzdXBlcnR5cGUuYXJndW1lbnRzW2ldLmNsb25lKG5ld1R5cGVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1peGluIGlzIE5hbWVkVHlwZUJ1aWxkZXIgJiYgbWl4aW4uYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1peGluLmFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgbWl4aW4uYXJndW1lbnRzW2ldID0gbWl4aW4uYXJndW1lbnRzW2ldLmNsb25lKG5ld1R5cGVzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChUeXBlQnVpbGRlciBuZXdUeXBlIGluIG5ld1R5cGVzKSB7CiAgICAgICAgICAgICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIKICAgICAgICAgICAgICAgICAgLmFkZFR5cGUobmV3IFVucmVzb2x2ZWRUeXBlKG5ld1R5cGUsIC0xLCBudWxsKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIgbWl4aW5EZWNsYXJhdGlvbiA9IHRoaXMKICAgICAgICAgICAgICAgIC5lbmROZXN0ZWREZWNsYXJhdGlvbigKICAgICAgICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLnVubmFtZWRNaXhpbkFwcGxpY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICJtaXhpbiBhcHBsaWNhdGlvbiIpOwogICAgICAgICAgICBtaXhpbkRlY2xhcmF0aW9uLnJlc29sdmVUeXBlcyhhcHBsaWNhdGlvblR5cGVWYXJpYWJsZXMsIHRoaXMpOwoKICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlQXJndW1lbnRzID0gPFR5cGVCdWlsZGVyPltdOwogICAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHlwZVZhcmlhYmxlIGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgICAgICBhcHBsaWNhdGlvblR5cGVBcmd1bWVudHMuYWRkKGFkZE5hbWVkVHlwZSh0eXBlVmFyaWFibGUubmFtZSwKICAgICAgICAgICAgICAgICAgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSwgbnVsbCwgY2hhck9mZnNldCkKICAgICAgICAgICAgICAgIC4uYmluZCgKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHlwZSB2YXJpYWJsZSB0eXBlcyBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyaWMgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBhbm9ueW1vdXMgbWl4aW4KICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBzaG91bGQgcmVmZXIgYmFjayB0byB0aGUgdHlwZSB2YXJpYWJsZXMgb2YKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2xhc3MgdGhhdCBleHRlbmQgdGhlIGFub255bW91cyBtaXhpbiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICB0eXBlVmFyaWFibGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaW5hbCBpbnQgY29tcHV0ZWRTdGFydENoYXJPZmZzZXQgPQogICAgICAgICAgICAoaXNOYW1lZE1peGluQXBwbGljYXRpb24gPyBtZXRhZGF0YSA6IG51bGwpID09IG51bGwKICAgICAgICAgICAgICAgID8gc3RhcnRDaGFyT2Zmc2V0CiAgICAgICAgICAgICAgICA6IG1ldGFkYXRhLmZpcnN0LmNoYXJPZmZzZXQ7CgogICAgICAgIENsYXNzIHJlZmVyZW5jZXNGcm9tQ2xhc3M7CiAgICAgICAgSW5kZXhlZENsYXNzIHJlZmVyZW5jZXNGcm9tSW5kZXhlZENsYXNzOwogICAgICAgIGlmIChyZWZlcmVuY2VzRnJvbSAhPSBudWxsKSB7CiAgICAgICAgICByZWZlcmVuY2VzRnJvbUNsYXNzID0gcmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cENsYXNzKGZ1bGxuYW1lKTsKICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZENsYXNzID0KICAgICAgICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwSW5kZXhlZENsYXNzKGZ1bGxuYW1lKTsKICAgICAgICB9CgogICAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBhcHBsaWNhdGlvbiA9IG5ldyBTb3VyY2VDbGFzc0J1aWxkZXIoCiAgICAgICAgICBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbiA/IG1ldGFkYXRhIDogbnVsbCwKICAgICAgICAgIGlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uCiAgICAgICAgICAgICAgPyBtb2RpZmllcnMgfCBuYW1lZE1peGluQXBwbGljYXRpb25NYXNrCiAgICAgICAgICAgICAgOiBhYnN0cmFjdE1hc2ssCiAgICAgICAgICBmdWxsbmFtZSwKICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZVZhcmlhYmxlcywKICAgICAgICAgIGlzTWl4aW5EZWNsYXJhdGlvbiA/IG51bGwgOiBzdXBlcnR5cGUsCiAgICAgICAgICBpc05hbWVkTWl4aW5BcHBsaWNhdGlvbgogICAgICAgICAgICAgID8gaW50ZXJmYWNlcwogICAgICAgICAgICAgIDogaXNNaXhpbkRlY2xhcmF0aW9uID8gW3N1cGVydHlwZSwgbWl4aW5dIDogbnVsbCwKICAgICAgICAgIG51bGwsIC8vIE5vIGBvbmAgY2xhdXNlIHR5cGVzLgogICAgICAgICAgbmV3IFNjb3BlKAogICAgICAgICAgICAgIGxvY2FsOiA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LAogICAgICAgICAgICAgIHNldHRlcnM6IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgICAgcGFyZW50OiBzY29wZS53aXRoVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzKSwKICAgICAgICAgICAgICBkZWJ1Z05hbWU6ICJtaXhpbiAkZnVsbG5hbWUgIiwKICAgICAgICAgICAgICBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICAgIG5ldyBDb25zdHJ1Y3RvclNjb3BlKGZ1bGxuYW1lLCA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9KSwKICAgICAgICAgIHRoaXMsCiAgICAgICAgICA8Q29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyPltdLAogICAgICAgICAgY29tcHV0ZWRTdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgIHJlZmVyZW5jZXNGcm9tQ2xhc3MsCiAgICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWRDbGFzcywKICAgICAgICAgIG1peGVkSW5UeXBlOiBpc01peGluRGVjbGFyYXRpb24gPyBudWxsIDogbWl4aW4sCiAgICAgICAgKTsKICAgICAgICBpZiAoaXNOYW1lZE1peGluQXBwbGljYXRpb24pIHsKICAgICAgICAgIGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3IKICAgICAgICAgICAgICA/LnNldERvY3VtZW50YXRpb25Db21tZW50KGFwcGxpY2F0aW9uLmNscywgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGFoZSwga21pbGxpa2luKTogU2hvdWxkIGFsd2F5cyBiZSB0cnVlPwogICAgICAgIC8vIHBrZy9hbmFseXplci90ZXN0L3NyYy9zdW1tYXJ5L3Jlc3ludGhlc2l6ZV9rZXJuZWxfdGVzdC5kYXJ0IGNhbid0CiAgICAgICAgLy8gaGFuZGxlIHRoYXQgOigKICAgICAgICBhcHBsaWNhdGlvbi5jbHMuaXNBbm9ueW1vdXNNaXhpbiA9ICFpc05hbWVkTWl4aW5BcHBsaWNhdGlvbjsKICAgICAgICBhZGRCdWlsZGVyKGZ1bGxuYW1lLCBhcHBsaWNhdGlvbiwgY2hhck9mZnNldCwKICAgICAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VzRnJvbUNsYXNzPy5yZWZlcmVuY2UpOwogICAgICAgIHN1cGVydHlwZSA9IGFkZE5hbWVkVHlwZShmdWxsbmFtZSwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSwKICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlQXJndW1lbnRzLCBjaGFyT2Zmc2V0KTsKICAgICAgfQogICAgICByZXR1cm4gc3VwZXJ0eXBlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgfQoKICB2b2lkIGFkZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIG1peGluQXBwbGljYXRpb24sCiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkgewogICAgLy8gTmVzdGVkIGRlY2xhcmF0aW9uIGJlZ2FuIGluIGBPdXRsaW5lQnVpbGRlci5iZWdpbk5hbWVkTWl4aW5BcHBsaWNhdGlvbmAuCiAgICBlbmROZXN0ZWREZWNsYXJhdGlvbihUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLm5hbWVkTWl4aW5BcHBsaWNhdGlvbiwgbmFtZSkKICAgICAgICAucmVzb2x2ZVR5cGVzKHR5cGVWYXJpYWJsZXMsIHRoaXMpOwogICAgTmFtZWRUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBhcHBseU1peGlucyhtaXhpbkFwcGxpY2F0aW9uLCBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwgY2hhckVuZE9mZnNldCwgbmFtZSwgZmFsc2UsCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQ6IGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSwKICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXM6IHR5cGVWYXJpYWJsZXMsCiAgICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMsCiAgICAgICAgaW50ZXJmYWNlczogaW50ZXJmYWNlcyk7CiAgICBjaGVja1R5cGVWYXJpYWJsZXModHlwZVZhcmlhYmxlcywgc3VwZXJ0eXBlLmRlY2xhcmF0aW9uKTsKICB9CgogIHZvaWQgYWRkRmllbGQoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBUeXBlQnVpbGRlciB0eXBlLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBUb2tlbiBpbml0aWFsaXplclRva2VuLAogICAgICBib29sIGhhc0luaXRpYWxpemVyLAogICAgICB7VG9rZW4gY29uc3RJbml0aWFsaXplclRva2VufSkgewogICAgaWYgKGhhc0luaXRpYWxpemVyKSB7CiAgICAgIG1vZGlmaWVycyB8PSBoYXNJbml0aWFsaXplck1hc2s7CiAgICB9CiAgICBGaWVsZCByZWZlcmVuY2VGcm9tOwogICAgRmllbGQgbGF0ZUlzU2V0UmVmZXJlbmNlRnJvbTsKICAgIFByb2NlZHVyZSBnZXR0ZXJSZWZlcmVuY2VGcm9tOwogICAgUHJvY2VkdXJlIHNldHRlclJlZmVyZW5jZUZyb207CiAgICBmaW5hbCBib29sIGZpZWxkSXNMYXRlV2l0aExvd2VyaW5nID0gKG1vZGlmaWVycyAmIGxhdGVNYXNrKSAhPSAwICYmCiAgICAgICAgIWxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5zdXBwb3J0c0xhdGVGaWVsZHM7CiAgICBmaW5hbCBib29sIGlzSW5zdGFuY2VNZW1iZXIgPSBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5raW5kID09CiAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NEZWNsYXJhdGlvbiAmJgogICAgICAgIChtb2RpZmllcnMgJiBzdGF0aWNNYXNrKSA9PSAwOwogICAgU3RyaW5nIGNsYXNzTmFtZTsKICAgIGlmIChpc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIGNsYXNzTmFtZSA9IGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWU7CiAgICB9CiAgICBmaW5hbCBib29sIGlzRXh0ZW5zaW9uID0gY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIua2luZCA9PQogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZXh0ZW5zaW9uRGVjbGFyYXRpb247CiAgICBTdHJpbmcgZXh0ZW5zaW9uTmFtZTsKICAgIGlmIChpc0V4dGVuc2lvbikgewogICAgICBleHRlbnNpb25OYW1lID0gY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIubmFtZTsKICAgIH0KICAgIGlmIChyZWZlcmVuY2VzRnJvbSAhPSBudWxsKSB7CiAgICAgIFN0cmluZyBuYW1lVG9Mb29rdXAgPSBTb3VyY2VGaWVsZEJ1aWxkZXIuY3JlYXRlRmllbGROYW1lKAogICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgIGNsYXNzTmFtZSwKICAgICAgICAgIGlzRXh0ZW5zaW9uLAogICAgICAgICAgZXh0ZW5zaW9uTmFtZSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBmaWVsZElzTGF0ZVdpdGhMb3dlcmluZywKICAgICAgICAgIEZpZWxkTmFtZVR5cGUuRmllbGQpOwoKICAgICAgaWYgKF9jdXJyZW50Q2xhc3NSZWZlcmVuY2VzRnJvbUluZGV4ZWQgIT0gbnVsbCkgewogICAgICAgIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICBfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cEZpZWxkKG5hbWVUb0xvb2t1cCk7CiAgICAgICAgaWYgKGZpZWxkSXNMYXRlV2l0aExvd2VyaW5nKSB7CiAgICAgICAgICBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tID0gX2N1cnJlbnRDbGFzc1JlZmVyZW5jZXNGcm9tSW5kZXhlZAogICAgICAgICAgICAgIC5sb29rdXBGaWVsZChTb3VyY2VGaWVsZEJ1aWxkZXIuY3JlYXRlRmllbGROYW1lKAogICAgICAgICAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lLAogICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICBmaWVsZElzTGF0ZVdpdGhMb3dlcmluZywKICAgICAgICAgICAgICAgICAgRmllbGROYW1lVHlwZS5Jc1NldEZpZWxkKSk7CiAgICAgICAgICBnZXR0ZXJSZWZlcmVuY2VGcm9tID0gX2N1cnJlbnRDbGFzc1JlZmVyZW5jZXNGcm9tSW5kZXhlZAogICAgICAgICAgICAgIC5sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIoU291cmNlRmllbGRCdWlsZGVyLmNyZWF0ZUZpZWxkTmFtZSgKICAgICAgICAgICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICBpc0V4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uTmFtZSwKICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgZmllbGRJc0xhdGVXaXRoTG93ZXJpbmcsCiAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZVR5cGUuR2V0dGVyKSk7CiAgICAgICAgICBzZXR0ZXJSZWZlcmVuY2VGcm9tID0gX2N1cnJlbnRDbGFzc1JlZmVyZW5jZXNGcm9tSW5kZXhlZAogICAgICAgICAgICAgIC5sb29rdXBQcm9jZWR1cmVTZXR0ZXIoU291cmNlRmllbGRCdWlsZGVyLmNyZWF0ZUZpZWxkTmFtZSgKICAgICAgICAgICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICBpc0V4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uTmFtZSwKICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgZmllbGRJc0xhdGVXaXRoTG93ZXJpbmcsCiAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZVR5cGUuU2V0dGVyKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlZmVyZW5jZUZyb20gPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwRmllbGQobmFtZVRvTG9va3VwKTsKICAgICAgICBpZiAoZmllbGRJc0xhdGVXaXRoTG93ZXJpbmcpIHsKICAgICAgICAgIGxhdGVJc1NldFJlZmVyZW5jZUZyb20gPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwRmllbGQoCiAgICAgICAgICAgICAgU291cmNlRmllbGRCdWlsZGVyLmNyZWF0ZUZpZWxkTmFtZSgKICAgICAgICAgICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICBpc0V4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uTmFtZSwKICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgZmllbGRJc0xhdGVXaXRoTG93ZXJpbmcsCiAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZVR5cGUuSXNTZXRGaWVsZCkpOwogICAgICAgICAgZ2V0dGVyUmVmZXJlbmNlRnJvbSA9IHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIoCiAgICAgICAgICAgICAgU291cmNlRmllbGRCdWlsZGVyLmNyZWF0ZUZpZWxkTmFtZSgKICAgICAgICAgICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICBpc0V4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uTmFtZSwKICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgZmllbGRJc0xhdGVXaXRoTG93ZXJpbmcsCiAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZVR5cGUuR2V0dGVyKSk7CiAgICAgICAgICBzZXR0ZXJSZWZlcmVuY2VGcm9tID0gcmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZVNldHRlcigKICAgICAgICAgICAgICBTb3VyY2VGaWVsZEJ1aWxkZXIuY3JlYXRlRmllbGROYW1lKAogICAgICAgICAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lLAogICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICBmaWVsZElzTGF0ZVdpdGhMb3dlcmluZywKICAgICAgICAgICAgICAgICAgRmllbGROYW1lVHlwZS5TZXR0ZXIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFNvdXJjZUZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIgPSBuZXcgU291cmNlRmllbGRCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIHR5cGUsCiAgICAgICAgbmFtZSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgdGhpcywKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgcmVmZXJlbmNlRnJvbSwKICAgICAgICBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tLAogICAgICAgIGdldHRlclJlZmVyZW5jZUZyb20sCiAgICAgICAgc2V0dGVyUmVmZXJlbmNlRnJvbSk7CiAgICBmaWVsZEJ1aWxkZXIuY29uc3RJbml0aWFsaXplclRva2VuID0gY29uc3RJbml0aWFsaXplclRva2VuOwogICAgYWRkQnVpbGRlcihuYW1lLCBmaWVsZEJ1aWxkZXIsIGNoYXJPZmZzZXQsCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpOwogICAgaWYgKHR5cGUgPT0gbnVsbCAmJiBmaWVsZEJ1aWxkZXIubmV4dCA9PSBudWxsKSB7CiAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IG9uZSAodGhlIGxhc3Qgb25lIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBuZXh0IHBvaW50ZXJzKQogICAgICAvLyBhcmUgYWRkZWQgdG8gdGhlIHRyZWUsIGhhZCBwYXJlbnQgcG9pbnRlcnMgYW5kIGNhbiBpbmZlciBjb3JyZWN0bHkuCiAgICAgIGlmIChpbml0aWFsaXplclRva2VuID09IG51bGwgJiYgZmllbGRCdWlsZGVyLmlzU3RhdGljKSB7CiAgICAgICAgLy8gQSBzdGF0aWMgZmllbGQgd2l0aG91dCB0eXBlIGFuZCBpbml0aWFsaXplciB3aWxsIGFsd2F5cyBiZSBpbmZlcnJlZAogICAgICAgIC8vIHRvIGhhdmUgdHlwZSBgZHluYW1pY2AuCiAgICAgICAgZmllbGRCdWlsZGVyLmZpZWxkVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQSBmaWVsZCB3aXRoIG5vIHR5cGUgYW5kIGluaXRpYWxpemVyIG9yIGFuIGluc3RhbmNlIGZpZWxkIHdpdGhvdXQKICAgICAgICAvLyB0eXBlIGFuZCBpbml0aWFsaXplciBuZWVkIHRvIGhhdmUgdGhlIHR5cGUgaW5mZXJyZWQuCiAgICAgICAgZmllbGRCdWlsZGVyLmZpZWxkVHlwZSA9CiAgICAgICAgICAgIG5ldyBJbXBsaWNpdEZpZWxkVHlwZShmaWVsZEJ1aWxkZXIsIGluaXRpYWxpemVyVG9rZW4pOwogICAgICAgIHJlZ2lzdGVySW1wbGljaXRseVR5cGVkRmllbGQoZmllbGRCdWlsZGVyKTsKICAgICAgfQogICAgfQogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoZmllbGRCdWlsZGVyLmZpZWxkLCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CiAgfQoKICB2b2lkIGFkZENvbnN0cnVjdG9yKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgZmluYWwgT2JqZWN0IG5hbWUsCiAgICAgIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSwKICAgICAge1Rva2VuIGJlZ2luSW5pdGlhbGl6ZXJzfSkgewogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgQ29uc3RydWN0b3IgcmVmZXJlbmNlRnJvbTsKICAgIGlmIChfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkICE9IG51bGwpIHsKICAgICAgcmVmZXJlbmNlRnJvbSA9CiAgICAgICAgICBfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yTmFtZSk7CiAgICB9CiAgICBDb25zdHJ1Y3RvckJ1aWxkZXIgY29uc3RydWN0b3JCdWlsZGVyID0gbmV3IENvbnN0cnVjdG9yQnVpbGRlckltcGwoCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzICYgfmFic3RyYWN0TWFzaywKICAgICAgICByZXR1cm5UeXBlLAogICAgICAgIGNvbnN0cnVjdG9yTmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIGZvcm1hbHMsCiAgICAgICAgdGhpcywKICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgcmVmZXJlbmNlRnJvbSwKICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXREb2N1bWVudGF0aW9uQ29tbWVudCgKICAgICAgICBjb25zdHJ1Y3RvckJ1aWxkZXIuY29uc3RydWN0b3IsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXQoCiAgICAgICAgY29uc3RydWN0b3JCdWlsZGVyLmNvbnN0cnVjdG9yLCBuYW1lKTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBjb25zdHJ1Y3RvckJ1aWxkZXIpOwogICAgYWRkQnVpbGRlcihjb25zdHJ1Y3Rvck5hbWUsIGNvbnN0cnVjdG9yQnVpbGRlciwgY2hhck9mZnNldCwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSk7CiAgICBpZiAobmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgIGFkZE5hdGl2ZU1ldGhvZChjb25zdHJ1Y3RvckJ1aWxkZXIpOwogICAgfQogICAgaWYgKGNvbnN0cnVjdG9yQnVpbGRlci5pc0NvbnN0KSB7CiAgICAgIGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyPy5oYXNDb25zdENvbnN0cnVjdG9yID0gdHJ1ZTsKICAgICAgLy8gY29uc3QgY29uc3RydWN0b3JzIHdpbGwgaGF2ZSB0aGVpciBpbml0aWFsaXplcnMgY29tcGlsZWQgYW5kIHdyaXR0ZW4KICAgICAgLy8gaW50byB0aGUgb3V0bGluZS4KICAgICAgY29uc3RydWN0b3JCdWlsZGVyLmJlZ2luSW5pdGlhbGl6ZXJzID0KICAgICAgICAgIGJlZ2luSW5pdGlhbGl6ZXJzID8/IG5ldyBUb2tlbi5lb2YoLTEpOwogICAgfQogIH0KCiAgdm9pZCBhZGRQcm9jZWR1cmUoCiAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIFByb2NlZHVyZUtpbmQga2luZCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgIHtib29sIGlzVG9wTGV2ZWx9KSB7CiAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciA9IGxvYWRlci50YXJnZXQubWV0YWRhdGFDb2xsZWN0b3I7CiAgICBpZiAocmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIGlmIChraW5kID09IFByb2NlZHVyZUtpbmQuT3BlcmF0b3IgJiYKICAgICAgICAgIGlkZW50aWNhbChuYW1lLCBpbmRleFNldE5hbWUubmFtZSkpIHsKICAgICAgICByZXR1cm5UeXBlID0gYWRkVm9pZFR5cGUoY2hhck9mZnNldCk7CiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgIHJldHVyblR5cGUgPSBhZGRWb2lkVHlwZShjaGFyT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgUHJvY2VkdXJlIHJlZmVyZW5jZUZyb207CiAgICBQcm9jZWR1cmUgdGVhck9mZlJlZmVyZW5jZUZyb207CiAgICBpZiAocmVmZXJlbmNlc0Zyb20gIT0gbnVsbCkgewogICAgICBpZiAoX2N1cnJlbnRDbGFzc1JlZmVyZW5jZXNGcm9tSW5kZXhlZCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpIHsKICAgICAgICAgIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICAgIF9jdXJyZW50Q2xhc3NSZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwUHJvY2VkdXJlU2V0dGVyKG5hbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWZlcmVuY2VGcm9tID0KICAgICAgICAgICAgICBfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZU5vdFNldHRlcihuYW1lKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLmtpbmQgPT0KICAgICAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5leHRlbnNpb25EZWNsYXJhdGlvbikgewogICAgICAgICAgYm9vbCBleHRlbnNpb25Jc1N0YXRpYyA9IChtb2RpZmllcnMgJiBzdGF0aWNNYXNrKSAhPSAwOwogICAgICAgICAgU3RyaW5nIG5hbWVUb0xvb2t1cCA9IFByb2NlZHVyZUJ1aWxkZXJJbXBsLmNyZWF0ZVByb2NlZHVyZU5hbWUoCiAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICBleHRlbnNpb25Jc1N0YXRpYywKICAgICAgICAgICAgICBraW5kLAogICAgICAgICAgICAgIGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWUsCiAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICBpZiAoZXh0ZW5zaW9uSXNTdGF0aWMgJiYga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgICAgICByZWZlcmVuY2VGcm9tID0KICAgICAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBQcm9jZWR1cmVTZXR0ZXIobmFtZVRvTG9va3VwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICAgICAgcmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZU5vdFNldHRlcihuYW1lVG9Mb29rdXApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICAgICAgU3RyaW5nIHRlYXJPZmZOYW1lVG9Mb29rdXAgPQogICAgICAgICAgICAgICAgUHJvY2VkdXJlQnVpbGRlckltcGwuY3JlYXRlUHJvY2VkdXJlTmFtZSgKICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIFByb2NlZHVyZUtpbmQuR2V0dGVyLAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgIHRlYXJPZmZSZWZlcmVuY2VGcm9tID0gcmVmZXJlbmNlc0Zyb21JbmRleGVkCiAgICAgICAgICAgICAgICAubG9va3VwUHJvY2VkdXJlTm90U2V0dGVyKHRlYXJPZmZOYW1lVG9Mb29rdXApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoa2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgICAgICByZWZlcmVuY2VGcm9tID0gcmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZVNldHRlcihuYW1lKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICAgICAgcmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZU5vdFNldHRlcihuYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFByb2NlZHVyZUJ1aWxkZXIgcHJvY2VkdXJlQnVpbGRlciA9IG5ldyBQcm9jZWR1cmVCdWlsZGVySW1wbCgKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgZm9ybWFscywKICAgICAgICBraW5kLAogICAgICAgIHRoaXMsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZUZyb20sCiAgICAgICAgdGVhck9mZlJlZmVyZW5jZUZyb20sCiAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSk7CiAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgcHJvY2VkdXJlQnVpbGRlci5wcm9jZWR1cmUsIGRvY3VtZW50YXRpb25Db21tZW50KTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBwcm9jZWR1cmVCdWlsZGVyKTsKICAgIGFkZEJ1aWxkZXIobmFtZSwgcHJvY2VkdXJlQnVpbGRlciwgY2hhck9mZnNldCwKICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSk7CiAgICBpZiAobmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsKSB7CiAgICAgIGFkZE5hdGl2ZU1ldGhvZChwcm9jZWR1cmVCdWlsZGVyKTsKICAgIH0KICB9CgogIHZvaWQgYWRkRmFjdG9yeU1ldGhvZCgKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIE9iamVjdCBuYW1lLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlciByZWRpcmVjdGlvblRhcmdldCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUpIHsKICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBhZGROYW1lZFR5cGUoCiAgICAgICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIucGFyZW50Lm5hbWUsCiAgICAgICAgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSwKICAgICAgICA8VHlwZUJ1aWxkZXI+W10sCiAgICAgICAgY2hhck9mZnNldCk7CiAgICAvLyBOZXN0ZWQgZGVjbGFyYXRpb24gYmVnYW4gaW4gYE91dGxpbmVCdWlsZGVyLmJlZ2luRmFjdG9yeU1ldGhvZGAuCiAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGZhY3RvcnlEZWNsYXJhdGlvbiA9IGVuZE5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZmFjdG9yeU1ldGhvZCwgIiNmYWN0b3J5X21ldGhvZCIpOwoKICAgIC8vIFByZXBhcmUgdGhlIHNpbXBsZSBwcm9jZWR1cmUgbmFtZS4KICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lOwogICAgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSA9CiAgICAgICAgY29tcHV0ZUFuZFZhbGlkYXRlQ29uc3RydWN0b3JOYW1lKG5hbWUsIGNoYXJPZmZzZXQsIGlzRmFjdG9yeTogdHJ1ZSk7CiAgICBpZiAoY29uc3RydWN0b3JOYW1lICE9IG51bGwpIHsKICAgICAgcHJvY2VkdXJlTmFtZSA9IGNvbnN0cnVjdG9yTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIHByb2NlZHVyZU5hbWUgPSBuYW1lOwogICAgfQoKICAgIFByb2NlZHVyZSByZWZlcmVuY2VGcm9tID0gX2N1cnJlbnRDbGFzc1JlZmVyZW5jZXNGcm9tSW5kZXhlZAogICAgICAgID8ubG9va3VwUHJvY2VkdXJlTm90U2V0dGVyKHByb2NlZHVyZU5hbWUpOwoKICAgIFByb2NlZHVyZUJ1aWxkZXIgcHJvY2VkdXJlQnVpbGRlcjsKICAgIGlmIChyZWRpcmVjdGlvblRhcmdldCAhPSBudWxsKSB7CiAgICAgIHByb2NlZHVyZUJ1aWxkZXIgPSBuZXcgUmVkaXJlY3RpbmdGYWN0b3J5QnVpbGRlcigKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgc3RhdGljTWFzayB8IG1vZGlmaWVycywKICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICBwcm9jZWR1cmVOYW1lLAogICAgICAgICAgY29weVR5cGVWYXJpYWJsZXMoCiAgICAgICAgICAgICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIudHlwZVZhcmlhYmxlcyA/PwogICAgICAgICAgICAgICAgICBjb25zdCA8VHlwZVZhcmlhYmxlQnVpbGRlcj5bXSwKICAgICAgICAgICAgICBmYWN0b3J5RGVjbGFyYXRpb24pLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICByZWZlcmVuY2VGcm9tLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgICAgICByZWRpcmVjdGlvblRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICBwcm9jZWR1cmVCdWlsZGVyID0gbmV3IFByb2NlZHVyZUJ1aWxkZXJJbXBsKAogICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICBzdGF0aWNNYXNrIHwgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIHByb2NlZHVyZU5hbWUsCiAgICAgICAgICBjb3B5VHlwZVZhcmlhYmxlcygKICAgICAgICAgICAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci50eXBlVmFyaWFibGVzID8/CiAgICAgICAgICAgICAgICAgIGNvbnN0IDxUeXBlVmFyaWFibGVCdWlsZGVyPltdLAogICAgICAgICAgICAgIGZhY3RvcnlEZWNsYXJhdGlvbiksCiAgICAgICAgICBmb3JtYWxzLAogICAgICAgICAgUHJvY2VkdXJlS2luZC5GYWN0b3J5LAogICAgICAgICAgdGhpcywKICAgICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgIHJlZmVyZW5jZUZyb20sCiAgICAgICAgICBudWxsLAogICAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSk7CiAgICB9CgogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgbWV0YWRhdGFDb2xsZWN0b3I/LnNldERvY3VtZW50YXRpb25Db21tZW50KAogICAgICAgIHByb2NlZHVyZUJ1aWxkZXIucHJvY2VkdXJlLCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CiAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0Q29uc3RydWN0b3JOYW1lT2Zmc2V0KAogICAgICAgIHByb2NlZHVyZUJ1aWxkZXIucHJvY2VkdXJlLCBuYW1lKTsKCiAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIHNhdmVkRGVjbGFyYXRpb24gPQogICAgICAgIGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyOwogICAgY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIgPSBmYWN0b3J5RGVjbGFyYXRpb247CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHYgaW4gcHJvY2VkdXJlQnVpbGRlci50eXBlVmFyaWFibGVzKSB7CiAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgdCA9IHByb2NlZHVyZUJ1aWxkZXIucmV0dXJuVHlwZTsKICAgICAgdC5hcmd1bWVudHMuYWRkKGFkZE5hbWVkVHlwZSh0di5uYW1lLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLAogICAgICAgICAgbnVsbCwgcHJvY2VkdXJlQnVpbGRlci5jaGFyT2Zmc2V0KSk7CiAgICB9CiAgICBjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciA9IHNhdmVkRGVjbGFyYXRpb247CgogICAgZmFjdG9yeURlY2xhcmF0aW9uLnJlc29sdmVUeXBlcyhwcm9jZWR1cmVCdWlsZGVyLnR5cGVWYXJpYWJsZXMsIHRoaXMpOwogICAgYWRkQnVpbGRlcihwcm9jZWR1cmVOYW1lLCBwcm9jZWR1cmVCdWlsZGVyLCBjaGFyT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlRnJvbT8ucmVmZXJlbmNlKTsKICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgYWRkTmF0aXZlTWV0aG9kKHByb2NlZHVyZUJ1aWxkZXIpOwogICAgfQogIH0KCiAgdm9pZCBhZGRFbnVtKAogICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZW51bUNvbnN0YW50SW5mb3MsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCkgewogICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgQ2xhc3MgcmVmZXJlbmNlc0Zyb21DbGFzczsKICAgIEluZGV4ZWRDbGFzcyByZWZlcmVuY2VzRnJvbUluZGV4ZWRDbGFzczsKICAgIGlmIChyZWZlcmVuY2VzRnJvbSAhPSBudWxsKSB7CiAgICAgIHJlZmVyZW5jZXNGcm9tQ2xhc3MgPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwQ2xhc3MobmFtZSk7CiAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZENsYXNzID0KICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBJbmRleGVkQ2xhc3MobmFtZSk7CiAgICB9CiAgICBFbnVtQnVpbGRlciBidWlsZGVyID0gbmV3IEVudW1CdWlsZGVyKAogICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG5hbWUsCiAgICAgICAgZW51bUNvbnN0YW50SW5mb3MsCiAgICAgICAgdGhpcywKICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZXNGcm9tQ2xhc3MsCiAgICAgICAgcmVmZXJlbmNlc0Zyb21JbmRleGVkQ2xhc3MpOwogICAgYWRkQnVpbGRlcihuYW1lLCBidWlsZGVyLCBjaGFyT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlc0Zyb21DbGFzcz8ucmVmZXJlbmNlKTsKICAgIG1ldGFkYXRhQ29sbGVjdG9yPy5zZXREb2N1bWVudGF0aW9uQ29tbWVudCgKICAgICAgICBidWlsZGVyLmNscywgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogIH0KCiAgdm9pZCBhZGRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0eXBlVmFyaWFibGUgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgIHR5cGVWYXJpYWJsZS52YXJpYW5jZSA9IHBlbmRpbmdWYXJpYW5jZTsKICAgICAgfQogICAgfQogICAgVHlwZWRlZiByZWZlcmVuY2VGcm9tID0gcmVmZXJlbmNlc0Zyb21JbmRleGVkPy5sb29rdXBUeXBlZGVmKG5hbWUpOwogICAgVHlwZUFsaWFzQnVpbGRlciB0eXBlZGVmQnVpbGRlciA9IG5ldyBUeXBlQWxpYXNCdWlsZGVyKAogICAgICAgIG1ldGFkYXRhLCBuYW1lLCB0eXBlVmFyaWFibGVzLCB0eXBlLCB0aGlzLCBjaGFyT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZUZyb206IHJlZmVyZW5jZUZyb20pOwogICAgbG9hZGVyLnRhcmdldC5tZXRhZGF0YUNvbGxlY3RvcgogICAgICAgID8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQodHlwZWRlZkJ1aWxkZXIudHlwZWRlZiwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgY2hlY2tUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMsIHR5cGVkZWZCdWlsZGVyKTsKICAgIC8vIE5lc3RlZCBkZWNsYXJhdGlvbiBiZWdhbiBpbiBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVBbGlhc2AuCiAgICBlbmROZXN0ZWREZWNsYXJhdGlvbihUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLnR5cGVkZWYsICIjdHlwZWRlZiIpCiAgICAgICAgLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCB0aGlzKTsKICAgIGFkZEJ1aWxkZXIobmFtZSwgdHlwZWRlZkJ1aWxkZXIsIGNoYXJPZmZzZXQsCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpOwogIH0KCiAgRnVuY3Rpb25UeXBlQnVpbGRlciBhZGRGdW5jdGlvblR5cGUoCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBOdWxsYWJpbGl0eUJ1aWxkZXIgbnVsbGFiaWxpdHlCdWlsZGVyLAogICAgICBpbnQgY2hhck9mZnNldCkgewogICAgRnVuY3Rpb25UeXBlQnVpbGRlciBidWlsZGVyID0gbmV3IEZ1bmN0aW9uVHlwZUJ1aWxkZXIoCiAgICAgICAgcmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscywgbnVsbGFiaWxpdHlCdWlsZGVyKTsKICAgIGNoZWNrVHlwZVZhcmlhYmxlcyh0eXBlVmFyaWFibGVzLCBudWxsKTsKICAgIC8vIE5lc3RlZCBkZWNsYXJhdGlvbiBiZWdhbiBpbiBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVgIG9yCiAgICAvLyBgT3V0bGluZUJ1aWxkZXIuYmVnaW5GdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyYC4KICAgIGVuZE5lc3RlZERlY2xhcmF0aW9uKFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZnVuY3Rpb25UeXBlLCAiI2Z1bmN0aW9uX3R5cGUiKQogICAgICAgIC5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgdGhpcyk7CiAgICByZXR1cm4gYWRkVHlwZShidWlsZGVyLCBjaGFyT2Zmc2V0KTsKICB9CgogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgYWRkRm9ybWFsUGFyYW1ldGVyKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBib29sIGhhc1RoaXMsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBUb2tlbiBpbml0aWFsaXplclRva2VuKSB7CiAgICBpZiAoaGFzVGhpcykgewogICAgICBtb2RpZmllcnMgfD0gaW5pdGlhbGl6aW5nRm9ybWFsTWFzazsKICAgIH0KICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsID0gbmV3IEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIoCiAgICAgICAgbWV0YWRhdGEsIG1vZGlmaWVycywgdHlwZSwgbmFtZSwgdGhpcywgY2hhck9mZnNldCwgaW1wb3J0VXJpKQogICAgICAuLmluaXRpYWxpemVyVG9rZW4gPSBpbml0aWFsaXplclRva2VuCiAgICAgIC4uaGFzRGVjbGFyZWRJbml0aWFsaXplciA9IChpbml0aWFsaXplclRva2VuICE9IG51bGwpOwogICAgcmV0dXJuIGZvcm1hbDsKICB9CgogIFR5cGVWYXJpYWJsZUJ1aWxkZXIgYWRkVHlwZVZhcmlhYmxlKAogICAgICBTdHJpbmcgbmFtZSwgVHlwZUJ1aWxkZXIgYm91bmQsIGludCBjaGFyT2Zmc2V0KSB7CiAgICBUeXBlVmFyaWFibGVCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIG5ldyBUeXBlVmFyaWFibGVCdWlsZGVyKG5hbWUsIHRoaXMsIGNoYXJPZmZzZXQsIGJvdW5kOiBib3VuZCk7CiAgICBib3VuZGxlc3NUeXBlVmFyaWFibGVzLmFkZChidWlsZGVyKTsKICAgIHJldHVybiBidWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucygpIHsKICAgIE1ldGFkYXRhQnVpbGRlci5idWlsZEFubm90YXRpb25zKGxpYnJhcnksIG1ldGFkYXRhLCB0aGlzLCBudWxsLCBudWxsKTsKICB9CgogIHZvaWQgYnVpbGRCdWlsZGVyKEJ1aWxkZXIgZGVjbGFyYXRpb24sIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5KSB7CiAgICBTdHJpbmcgZmluZER1cGxpY2F0ZVN1ZmZpeChCdWlsZGVyIGRlY2xhcmF0aW9uKSB7CiAgICAgIGlmIChkZWNsYXJhdGlvbi5uZXh0ICE9IG51bGwpIHsKICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgIEJ1aWxkZXIgY3VycmVudCA9IGRlY2xhcmF0aW9uLm5leHQ7CiAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgICAgY291bnQrKzsKICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiAiIyRjb3VudCI7CiAgICAgIH0KICAgICAgcmV0dXJuICIiOwogICAgfQoKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBTb3VyY2VDbGFzc0J1aWxkZXIpIHsKICAgICAgQ2xhc3MgY2xzID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcywgY29yZUxpYnJhcnkpOwogICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzUGF0Y2gpIHsKICAgICAgICBjbHMubmFtZSArPSBmaW5kRHVwbGljYXRlU3VmZml4KGRlY2xhcmF0aW9uKTsKICAgICAgICBsaWJyYXJ5LmFkZENsYXNzKGNscyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgU291cmNlRXh0ZW5zaW9uQnVpbGRlcikgewogICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcywgY29yZUxpYnJhcnksCiAgICAgICAgICBhZGRNZW1iZXJzVG9MaWJyYXJ5OiAhZGVjbGFyYXRpb24uaXNEdXBsaWNhdGUpOwogICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzUGF0Y2ggJiYgIWRlY2xhcmF0aW9uLmlzRHVwbGljYXRlKSB7CiAgICAgICAgbGlicmFyeS5hZGRFeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBNZW1iZXJCdWlsZGVySW1wbCkgewogICAgICBkZWNsYXJhdGlvbi5idWlsZE1lbWJlcnModGhpcywKICAgICAgICAgIChNZW1iZXIgbWVtYmVyLCBCdWlsdE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgICAgIG1lbWJlci5pc1N0YXRpYyA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgICBtZW1iZXIuaXNTdGF0aWMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzUGF0Y2ggJiYgIWRlY2xhcmF0aW9uLmlzRHVwbGljYXRlKSB7CiAgICAgICAgICBsaWJyYXJ5LmFkZE1lbWJlcihtZW1iZXIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgVHlwZWRlZiB0eXBlZGVmID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcyk7CiAgICAgIGlmICghZGVjbGFyYXRpb24uaXNQYXRjaCAmJiAhZGVjbGFyYXRpb24uaXNEdXBsaWNhdGUpIHsKICAgICAgICBsaWJyYXJ5LmFkZFR5cGVkZWYodHlwZWRlZik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgRW51bUJ1aWxkZXIpIHsKICAgICAgQ2xhc3MgY2xzID0gZGVjbGFyYXRpb24uYnVpbGQodGhpcywgY29yZUxpYnJhcnkpOwogICAgICBpZiAoIWRlY2xhcmF0aW9uLmlzUGF0Y2gpIHsKICAgICAgICBjbHMubmFtZSArPSBmaW5kRHVwbGljYXRlU3VmZml4KGRlY2xhcmF0aW9uKTsKICAgICAgICBsaWJyYXJ5LmFkZENsYXNzKGNscyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlcikgewogICAgICAvLyBJZ25vcmVkLiBLZXJuZWwgZG9lc24ndCByZXByZXNlbnQgcHJlZml4ZXMuCiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgQnVpbHRpblR5cGVCdWlsZGVyKSB7CiAgICAgIC8vIE5vdGhpbmcgbmVlZGVkLgogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICB1bmhhbmRsZWQoIiR7ZGVjbGFyYXRpb24ucnVudGltZVR5cGV9IiwgImJ1aWxkQnVpbGRlciIsCiAgICAgICAgICBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgdm9pZCBhZGROYXRpdmVEZXBlbmRlbmN5KFN0cmluZyBuYXRpdmVJbXBvcnRQYXRoKSB7CiAgICBNZW1iZXJCdWlsZGVyIGNvbnN0cnVjdG9yID0gbG9hZGVyLmdldE5hdGl2ZUFubm90YXRpb24oKTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPQogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W25ldyBTdHJpbmdMaXRlcmFsKG5hdGl2ZUltcG9ydFBhdGgpXSk7CiAgICBFeHByZXNzaW9uIGFubm90YXRpb247CiAgICBpZiAoY29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcikgewogICAgICBhbm5vdGF0aW9uID0gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbihjb25zdHJ1Y3Rvci5tZW1iZXIsIGFyZ3VtZW50cykKICAgICAgICAuLmlzQ29uc3QgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgYW5ub3RhdGlvbiA9IG5ldyBTdGF0aWNJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLm1lbWJlciwgYXJndW1lbnRzKQogICAgICAgIC4uaXNDb25zdCA9IHRydWU7CiAgICB9CiAgICBsaWJyYXJ5LmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CiAgfQoKICB2b2lkIGFkZERlcGVuZGVuY2llcyhMaWJyYXJ5IGxpYnJhcnksIFNldDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj4gc2VlbikgewogICAgaWYgKCFzZWVuLmFkZCh0aGlzKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gTWVyZ2UgaW1wb3J0IGFuZCBleHBvcnQgbGlzdHMgdG8gaGF2ZSB0aGUgZGVwZW5kZW5jaWVzIGluIHNvdXJjZSBvcmRlci4KICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBEaWV0TGlzdGVuZXIgdG8gY29ycmVjdGx5IG1hdGNoIHVwIG1ldGFkYXRhLgogICAgaW50IGltcG9ydEluZGV4ID0gMDsKICAgIGludCBleHBvcnRJbmRleCA9IDA7CiAgICB3aGlsZSAoaW1wb3J0SW5kZXggPCBpbXBvcnRzLmxlbmd0aCB8fCBleHBvcnRJbmRleCA8IGV4cG9ydHMubGVuZ3RoKSB7CiAgICAgIGlmIChleHBvcnRJbmRleCA+PSBleHBvcnRzLmxlbmd0aCB8fAogICAgICAgICAgKGltcG9ydEluZGV4IDwgaW1wb3J0cy5sZW5ndGggJiYKICAgICAgICAgICAgICBpbXBvcnRzW2ltcG9ydEluZGV4XS5jaGFyT2Zmc2V0IDwKICAgICAgICAgICAgICAgICAgZXhwb3J0c1tleHBvcnRJbmRleF0uY2hhck9mZnNldCkpIHsKICAgICAgICAvLyBBZGQgaW1wb3J0CiAgICAgICAgSW1wb3J0IGltcG9ydCA9IGltcG9ydHNbaW1wb3J0SW5kZXgrK107CgogICAgICAgIC8vIFJhdGhlciB0aGFuIGFkZCBhIExpYnJhcnlEZXBlbmRlbmN5LCB3ZSBhdHRhY2ggYW4gYW5ub3RhdGlvbi4KICAgICAgICBpZiAoaW1wb3J0Lm5hdGl2ZUltcG9ydFBhdGggIT0gbnVsbCkgewogICAgICAgICAgYWRkTmF0aXZlRGVwZW5kZW5jeShpbXBvcnQubmF0aXZlSW1wb3J0UGF0aCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChpbXBvcnQuZGVmZXJyZWQgJiYgaW1wb3J0LnByZWZpeEJ1aWxkZXI/LmRlcGVuZGVuY3kgIT0gbnVsbCkgewogICAgICAgICAgbGlicmFyeS5hZGREZXBlbmRlbmN5KGltcG9ydC5wcmVmaXhCdWlsZGVyLmRlcGVuZGVuY3kpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaWJyYXJ5LmFkZERlcGVuZGVuY3kobmV3IExpYnJhcnlEZXBlbmRlbmN5LmltcG9ydCgKICAgICAgICAgICAgICBpbXBvcnQuaW1wb3J0ZWQubGlicmFyeSwKICAgICAgICAgICAgICBuYW1lOiBpbXBvcnQucHJlZml4LAogICAgICAgICAgICAgIGNvbWJpbmF0b3JzOiB0b0tlcm5lbENvbWJpbmF0b3JzKGltcG9ydC5jb21iaW5hdG9ycykpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGltcG9ydC5jaGFyT2Zmc2V0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWRkIGV4cG9ydAogICAgICAgIEV4cG9ydCBleHBvcnQgPSBleHBvcnRzW2V4cG9ydEluZGV4KytdOwogICAgICAgIGxpYnJhcnkuYWRkRGVwZW5kZW5jeShuZXcgTGlicmFyeURlcGVuZGVuY3kuZXhwb3J0KAogICAgICAgICAgICBleHBvcnQuZXhwb3J0ZWQubGlicmFyeSwKICAgICAgICAgICAgY29tYmluYXRvcnM6IHRvS2VybmVsQ29tYmluYXRvcnMoZXhwb3J0LmNvbWJpbmF0b3JzKSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGV4cG9ydC5jaGFyT2Zmc2V0KTsKICAgICAgfQogICAgfQoKICAgIGZvciAoU291cmNlTGlicmFyeUJ1aWxkZXIgcGFydCBpbiBwYXJ0cykgewogICAgICBwYXJ0LmFkZERlcGVuZGVuY2llcyhsaWJyYXJ5LCBzZWVuKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEJ1aWxkZXIgY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICBTdHJpbmcgbmFtZSwgQnVpbGRlciBkZWNsYXJhdGlvbiwgQnVpbGRlciBvdGhlciwgaW50IGNoYXJPZmZzZXQsCiAgICAgIHtib29sIGlzRXhwb3J0OiBmYWxzZSwgYm9vbCBpc0ltcG9ydDogZmFsc2V9KSB7CiAgICAvLyBUT0RPKGFoZSk6IENhbiBJIG1vdmUgdGhpcyB0byBTY29wZSBvciBQcmVmaXg/CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gb3RoZXIpIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcikgcmV0dXJuIGRlY2xhcmF0aW9uOwogICAgaWYgKG90aGVyIGlzIEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKSByZXR1cm4gb3RoZXI7CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciBlcnJvciA9IGRlY2xhcmF0aW9uOwogICAgICBkZWNsYXJhdGlvbiA9IGVycm9yLmJ1aWxkZXI7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciBlcnJvciA9IG90aGVyOwogICAgICBvdGhlciA9IGVycm9yLmJ1aWxkZXI7CiAgICB9CiAgICBib29sIGlzTG9jYWwgPSBmYWxzZTsKICAgIGJvb2wgaXNMb2FkTGlicmFyeSA9IGZhbHNlOwogICAgQnVpbGRlciBwcmVmZXJyZWQ7CiAgICBVcmkgdXJpOwogICAgVXJpIG90aGVyVXJpOwogICAgVXJpIHByZWZlcnJlZFVyaTsKICAgIFVyaSBoaWRkZW5Vcmk7CiAgICBpZiAoc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBmYWxzZSkgPT0gZGVjbGFyYXRpb24pIHsKICAgICAgaXNMb2NhbCA9IHRydWU7CiAgICAgIHByZWZlcnJlZCA9IGRlY2xhcmF0aW9uOwogICAgICBoaWRkZW5VcmkgPSBjb21wdXRlTGlicmFyeVVyaShvdGhlcik7CiAgICB9IGVsc2UgewogICAgICB1cmkgPSBjb21wdXRlTGlicmFyeVVyaShkZWNsYXJhdGlvbik7CiAgICAgIG90aGVyVXJpID0gY29tcHV0ZUxpYnJhcnlVcmkob3RoZXIpOwogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgTG9hZExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgaXNMb2FkTGlicmFyeSA9IHRydWU7CiAgICAgICAgcHJlZmVycmVkID0gZGVjbGFyYXRpb247CiAgICAgICAgcHJlZmVycmVkVXJpID0gb3RoZXJVcmk7CiAgICAgIH0gZWxzZSBpZiAob3RoZXIgaXMgTG9hZExpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgaXNMb2FkTGlicmFyeSA9IHRydWU7CiAgICAgICAgcHJlZmVycmVkID0gb3RoZXI7CiAgICAgICAgcHJlZmVycmVkVXJpID0gdXJpOwogICAgICB9IGVsc2UgaWYgKG90aGVyVXJpPy5zY2hlbWUgPT0gImRhcnQiICYmIHVyaT8uc2NoZW1lICE9ICJkYXJ0IikgewogICAgICAgIHByZWZlcnJlZCA9IGRlY2xhcmF0aW9uOwogICAgICAgIHByZWZlcnJlZFVyaSA9IHVyaTsKICAgICAgICBoaWRkZW5VcmkgPSBvdGhlclVyaTsKICAgICAgfSBlbHNlIGlmICh1cmk/LnNjaGVtZSA9PSAiZGFydCIgJiYgb3RoZXJVcmk/LnNjaGVtZSAhPSAiZGFydCIpIHsKICAgICAgICBwcmVmZXJyZWQgPSBvdGhlcjsKICAgICAgICBwcmVmZXJyZWRVcmkgPSBvdGhlclVyaTsKICAgICAgICBoaWRkZW5VcmkgPSB1cmk7CiAgICAgIH0KICAgIH0KICAgIGlmIChwcmVmZXJyZWQgIT0gbnVsbCkgewogICAgICBpZiAoaXNMb2NhbCkgewogICAgICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmkpPiB0ZW1wbGF0ZSA9IGlzRXhwb3J0CiAgICAgICAgICAgID8gdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydAogICAgICAgICAgICA6IHRlbXBsYXRlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQ7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUsIGhpZGRlblVyaSksIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChpc0xvYWRMaWJyYXJ5KSB7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUxvYWRMaWJyYXJ5SGlkZXNNZW1iZXIud2l0aEFyZ3VtZW50cyhwcmVmZXJyZWRVcmkpLAogICAgICAgICAgICBjaGFyT2Zmc2V0LCBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSwgVXJpIHVyaSwgVXJpIHVyaTIpPiB0ZW1wbGF0ZSA9CiAgICAgICAgICAgIGlzRXhwb3J0ID8gdGVtcGxhdGVFeHBvcnRIaWRlc0V4cG9ydCA6IHRlbXBsYXRlSW1wb3J0SGlkZXNJbXBvcnQ7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUsIHByZWZlcnJlZFVyaSwgaGlkZGVuVXJpKSwKICAgICAgICAgICAgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICB9CiAgICAgIHJldHVybiBwcmVmZXJyZWQ7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24ubmV4dCA9PSBudWxsICYmIG90aGVyLm5leHQgPT0gbnVsbCkgewogICAgICBpZiAoaXNJbXBvcnQgJiYgZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlciAmJiBvdGhlciBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgICAgLy8gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUgc2FtZSBwcmVmaXggaXMgdXNlZCBmb3IgZGlmZmVyZW50CiAgICAgICAgLy8gaW1wb3J0cy4KICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24KICAgICAgICAgIC4uZXhwb3J0U2NvcGUubWVyZ2Uob3RoZXIuZXhwb3J0U2NvcGUsCiAgICAgICAgICAgICAgKFN0cmluZyBuYW1lLCBCdWlsZGVyIGV4aXN0aW5nLCBCdWlsZGVyIG1lbWJlcikgewogICAgICAgICAgICByZXR1cm4gY29tcHV0ZUFtYmlndW91c0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgICAgbmFtZSwgZXhpc3RpbmcsIG1lbWJlciwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGlzRXhwb3J0OiBpc0V4cG9ydCwgaXNJbXBvcnQ6IGlzSW1wb3J0KTsKICAgICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBVcmkgdXJpLCBVcmkgdXJpMik+IHRlbXBsYXRlID0KICAgICAgICBpc0V4cG9ydCA/IHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydCA6IHRlbXBsYXRlRHVwbGljYXRlZEltcG9ydDsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlLndpdGhBcmd1bWVudHMobmFtZSwgdXJpLCBvdGhlclVyaSk7CiAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFVyaSB1cmksIFVyaSB1cmkyKT4gYnVpbGRlclRlbXBsYXRlID0KICAgICAgICBpc0V4cG9ydAogICAgICAgICAgICA/IHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZQogICAgICAgICAgICA6IHRlbXBsYXRlRHVwbGljYXRlZEltcG9ydEluVHlwZTsKICAgIG1lc3NhZ2UgPSBidWlsZGVyVGVtcGxhdGUud2l0aEFyZ3VtZW50cygKICAgICAgICBuYW1lLAogICAgICAgIC8vIFRPRE8oYWhlKTogV2Ugc2hvdWxkIHByb2JhYmx5IHVzZSBhIGNvbnRleHQgb2JqZWN0IGhlcmUKICAgICAgICAvLyBpbnN0ZWFkIG9mIGluY2x1ZGluZyBVUklzIGluIHRoaXMgbWVzc2FnZS4KICAgICAgICB1cmksCiAgICAgICAgb3RoZXJVcmkpOwogICAgLy8gV2UgcmVwb3J0IHRoZSBlcnJvciBsYXppbHkgKHNldHRpbmcgc3VwcHJlc3NNZXNzYWdlIHRvIGZhbHNlKSBiZWNhdXNlIHRoZQogICAgLy8gc3BlYyAxOC4xIHN0YXRlcyB0aGF0ICdJdCBpcyBub3QgYW4gZXJyb3IgaWYgTiBpcyBpbnRyb2R1Y2VkIGJ5IHR3byBvcgogICAgLy8gbW9yZSBpbXBvcnRzIGJ1dCBuZXZlciByZWZlcnJlZCB0by4nCiAgICByZXR1cm4gbmV3IEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICAgIG5hbWUsIG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKSwKICAgICAgICBzdXBwcmVzc01lc3NhZ2U6IGZhbHNlKTsKICB9CgogIGludCBmaW5pc2hEZWZlcnJlZExvYWRUZWFyb2ZmcygpIHsKICAgIGludCB0b3RhbCA9IDA7CiAgICBmb3IgKEltcG9ydCBpbXBvcnQgaW4gaW1wb3J0cykgewogICAgICBpZiAoaW1wb3J0LmRlZmVycmVkKSB7CiAgICAgICAgUHJvY2VkdXJlIHRlYXJvZmYgPSBpbXBvcnQucHJlZml4QnVpbGRlci5sb2FkTGlicmFyeUJ1aWxkZXIudGVhcm9mZjsKICAgICAgICBpZiAodGVhcm9mZiAhPSBudWxsKSBsaWJyYXJ5LmFkZE1lbWJlcih0ZWFyb2ZmKTsKICAgICAgICB0b3RhbCsrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG90YWw7CiAgfQoKICBpbnQgZmluaXNoRm9yd2FyZGVycygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBDbG9uZVZpc2l0b3JOb3RNZW1iZXJzIGNsb25lciA9IG5ldyBDbG9uZVZpc2l0b3JOb3RNZW1iZXJzKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcndhcmRlcnNPcmlnaW5zLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIFByb2NlZHVyZSBmb3J3YXJkZXIgPSBmb3J3YXJkZXJzT3JpZ2luc1tpXTsKICAgICAgUHJvY2VkdXJlIG9yaWdpbiA9IGZvcndhcmRlcnNPcmlnaW5zW2kgKyAxXTsKCiAgICAgIGludCBwb3NpdGlvbmFsQ291bnQgPSBvcmlnaW4uZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICBpZiAoZm9yd2FyZGVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCAhPSBwb3NpdGlvbmFsQ291bnQpIHsKICAgICAgICByZXR1cm4gdW5leHBlY3RlZCgKICAgICAgICAgICAgIiRwb3NpdGlvbmFsQ291bnQiLAogICAgICAgICAgICAiJHtmb3J3YXJkZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RofSIsCiAgICAgICAgICAgIG9yaWdpbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBvcmlnaW4uZmlsZVVyaSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwb3NpdGlvbmFsQ291bnQ7ICsraikgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZm9yd2FyZGVyUGFyYW1ldGVyID0KICAgICAgICAgICAgZm9yd2FyZGVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdOwogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gb3JpZ2luUGFyYW1ldGVyID0KICAgICAgICAgICAgb3JpZ2luLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2pdOwogICAgICAgIGlmIChvcmlnaW5QYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgZm9yd2FyZGVyUGFyYW1ldGVyLmluaXRpYWxpemVyID0KICAgICAgICAgICAgICBjbG9uZXIuY2xvbmUob3JpZ2luUGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGZvcndhcmRlclBhcmFtZXRlci5pbml0aWFsaXplci5wYXJlbnQgPSBmb3J3YXJkZXJQYXJhbWV0ZXI7CiAgICAgICAgfQogICAgICB9CgogICAgICBNYXA8U3RyaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uPiBvcmlnaW5OYW1lZE1hcCA9CiAgICAgICAgICA8U3RyaW5nLCBWYXJpYWJsZURlY2xhcmF0aW9uPnt9OwogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gb3JpZ2luTmFtZWQgaW4gb3JpZ2luLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgIG9yaWdpbk5hbWVkTWFwW29yaWdpbk5hbWVkLm5hbWVdID0gb3JpZ2luTmFtZWQ7CiAgICAgIH0KICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGZvcndhcmRlck5hbWVkCiAgICAgICAgICBpbiBmb3J3YXJkZXIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvcmlnaW5OYW1lZCA9IG9yaWdpbk5hbWVkTWFwW2ZvcndhcmRlck5hbWVkLm5hbWVdOwogICAgICAgIGlmIChvcmlnaW5OYW1lZCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgICAgICJudWxsIiwgZm9yd2FyZGVyLm5hbWUubmFtZSwgb3JpZ2luLmZpbGVPZmZzZXQsIG9yaWdpbi5maWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9yaWdpbk5hbWVkLmluaXRpYWxpemVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGZvcndhcmRlck5hbWVkLmluaXRpYWxpemVyID0gY2xvbmVyLmNsb25lKG9yaWdpbk5hbWVkLmluaXRpYWxpemVyKTsKICAgICAgICBmb3J3YXJkZXJOYW1lZC5pbml0aWFsaXplci5wYXJlbnQgPSBmb3J3YXJkZXJOYW1lZDsKICAgICAgfQoKICAgICAgKytjb3VudDsKICAgIH0KICAgIGZvcndhcmRlcnNPcmlnaW5zLmNsZWFyKCk7CiAgICByZXR1cm4gY291bnQ7CiAgfQoKICB2b2lkIGFkZE5hdGl2ZU1ldGhvZChGdW5jdGlvbkJ1aWxkZXIgbWV0aG9kKSB7CiAgICBuYXRpdmVNZXRob2RzLmFkZChtZXRob2QpOwogIH0KCiAgaW50IGZpbmlzaE5hdGl2ZU1ldGhvZHMoKSB7CiAgICBmb3IgKEZ1bmN0aW9uQnVpbGRlciBtZXRob2QgaW4gbmF0aXZlTWV0aG9kcykgewogICAgICBtZXRob2QuYmVjb21lTmF0aXZlKGxvYWRlcik7CiAgICB9CiAgICByZXR1cm4gbmF0aXZlTWV0aG9kcy5sZW5ndGg7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGNvcHkgb2YgW29yaWdpbmFsXSBpbnRvIHRoZSBzY29wZSBvZiBbZGVjbGFyYXRpb25dLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGFkZGluZyBjb3BpZXMgb2YgY2xhc3MgdHlwZSBwYXJhbWV0ZXJzIHRvIGZhY3RvcnkKICAvLy8gbWV0aG9kcyBhbmQgdW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbnMsIGFuZCBmb3IgYWRkaW5nIGNvcGllcyBvZgogIC8vLyBleHRlbnNpb24gdHlwZSBwYXJhbWV0ZXJzIHRvIGV4dGVuc2lvbiBpbnN0YW5jZSBtZXRob2RzLgogIC8vLwogIC8vLyBJZiBbc3ludGhlc2l6ZVR5cGVQYXJhbWV0ZXJOYW1lc10gaXMgYHRydWVgIHRoZSBuYW1lcyBvZiB0aGUKICAvLy8gW1R5cGVQYXJhbWV0ZXJdIGFyZSBwcmVmaXggd2l0aCAnIycgdG8gaW5kaWNhdGUgdGhhdCB0aGVpciBzeW50aGVzaXplZC4KICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNvcHlUeXBlVmFyaWFibGVzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IG9yaWdpbmFsLCBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGRlY2xhcmF0aW9uLAogICAgICB7Ym9vbCBpc0V4dGVuc2lvblR5cGVQYXJhbWV0ZXI6IGZhbHNlfSkgewogICAgTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMgPSA8VHlwZUJ1aWxkZXI+W107CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGNvcHkgPSA8VHlwZVZhcmlhYmxlQnVpbGRlcj5bXTsKICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiBvcmlnaW5hbCkgewogICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIG5ld1ZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIoCiAgICAgICAgICB2YXJpYWJsZS5uYW1lLCB0aGlzLCB2YXJpYWJsZS5jaGFyT2Zmc2V0LAogICAgICAgICAgYm91bmQ6IHZhcmlhYmxlLmJvdW5kPy5jbG9uZShuZXdUeXBlcyksCiAgICAgICAgICBpc0V4dGVuc2lvblR5cGVQYXJhbWV0ZXI6IGlzRXh0ZW5zaW9uVHlwZVBhcmFtZXRlciwKICAgICAgICAgIHZhcmlhYmxlVmFyaWFuY2U6CiAgICAgICAgICAgICAgdmFyaWFibGUucGFyYW1ldGVyLmlzTGVnYWN5Q292YXJpYW50ID8gbnVsbCA6IHZhcmlhYmxlLnZhcmlhbmNlKTsKICAgICAgY29weS5hZGQobmV3VmFyaWFibGUpOwogICAgICBib3VuZGxlc3NUeXBlVmFyaWFibGVzLmFkZChuZXdWYXJpYWJsZSk7CiAgICB9CiAgICBmb3IgKFR5cGVCdWlsZGVyIG5ld1R5cGUgaW4gbmV3VHlwZXMpIHsKICAgICAgZGVjbGFyYXRpb24uYWRkVHlwZShuZXcgVW5yZXNvbHZlZFR5cGUobmV3VHlwZSwgLTEsIG51bGwpKTsKICAgIH0KICAgIHJldHVybiBjb3B5OwogIH0KCiAgaW50IGZpbmlzaFR5cGVWYXJpYWJsZXMoQ2xhc3NCdWlsZGVyIG9iamVjdCwgVHlwZUJ1aWxkZXIgZHluYW1pY1R5cGUpIHsKICAgIGludCBjb3VudCA9IGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMubGVuZ3RoOwogICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIGJ1aWxkZXIgaW4gYm91bmRsZXNzVHlwZVZhcmlhYmxlcykgewogICAgICBidWlsZGVyLmZpbmlzaCh0aGlzLCBvYmplY3QsIGR5bmFtaWNUeXBlKTsKICAgIH0KICAgIGJvdW5kbGVzc1R5cGVWYXJpYWJsZXMuY2xlYXIoKTsKCiAgICBUeXBlVmFyaWFibGVCdWlsZGVyLmZpbmlzaE51bGxhYmlsaXRpZXModGhpcywgcGVuZGluZ051bGxhYmlsaXRpZXMpOwogICAgcGVuZGluZ051bGxhYmlsaXRpZXMuY2xlYXIoKTsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBpbnQgY29tcHV0ZVZhcmlhbmNlcygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBmb3IgKEJ1aWxkZXIgZGVjbGFyYXRpb24gaW4gbGlicmFyeURlY2xhcmF0aW9uLm1lbWJlcnMudmFsdWVzKSB7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyICYmCiAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQgPiAwKSB7CiAgICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVQYXJhbWV0ZXIgaW4gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcykgewogICAgICAgICAgdHlwZVBhcmFtZXRlci52YXJpYW5jZSA9CiAgICAgICAgICAgICAgY29tcHV0ZVZhcmlhbmNlKHR5cGVQYXJhbWV0ZXIsIGRlY2xhcmF0aW9uLnR5cGUsIHRoaXMpOwogICAgICAgICAgKytjb3VudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKICB9CgogIGludCBjb21wdXRlRGVmYXVsdFR5cGVzKFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlLCBUeXBlQnVpbGRlciBib3R0b21UeXBlLAogICAgICBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3MpIHsKICAgIGludCBjb3VudCA9IDA7CgogICAgaW50IGNvbXB1dGVEZWZhdWx0VHlwZXNGb3JWYXJpYWJsZXMoTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXMsCiAgICAgICAge2Jvb2wgaW5FcnJvclJlY292ZXJ5fSkgewogICAgICBpZiAodmFyaWFibGVzID09IG51bGwpIHJldHVybiAwOwoKICAgICAgYm9vbCBoYXZlRXJyb25lb3VzQm91bmRzID0gZmFsc2U7CiAgICAgIGlmICghaW5FcnJvclJlY292ZXJ5KSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSB2YXJpYWJsZXNbaV07CiAgICAgICAgICBMaXN0PFR5cGVCdWlsZGVyPiBnZW5lcmljRnVuY3Rpb25UeXBlcyA9IDxUeXBlQnVpbGRlcj5bXTsKICAgICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh2YXJpYWJsZS5ib3VuZCwKICAgICAgICAgICAgICByZXN1bHQ6IGdlbmVyaWNGdW5jdGlvblR5cGVzKTsKICAgICAgICAgIGlmIChnZW5lcmljRnVuY3Rpb25UeXBlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGhhdmVFcnJvbmVvdXNCb3VuZHMgPSB0cnVlOwogICAgICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZCwgdmFyaWFibGUuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUubGVuZ3RoLCB2YXJpYWJsZS5maWxlVXJpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghaGF2ZUVycm9uZW91c0JvdW5kcykgewogICAgICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gY2FsY3VsYXRlZEJvdW5kcyA9CiAgICAgICAgICAgICAgY2FsY3VsYXRlQm91bmRzKHZhcmlhYmxlcywgZHluYW1pY1R5cGUsIGJvdHRvbVR5cGUsIG9iamVjdENsYXNzKTsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIHZhcmlhYmxlc1tpXS5kZWZhdWx0VHlwZSA9IGNhbGN1bGF0ZWRCb3VuZHNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoaW5FcnJvclJlY292ZXJ5IHx8IGhhdmVFcnJvbmVvdXNCb3VuZHMpIHsKICAgICAgICAvLyBVc2UgZHluYW1pYyBpbiBjYXNlIG9mIGVycm9ycy4KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgdmFyaWFibGVzW2ldLmRlZmF1bHRUeXBlID0gZHluYW1pY1R5cGU7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdmFyaWFibGVzLmxlbmd0aDsKICAgIH0KCiAgICB2b2lkIHJlcG9ydElzc3VlcyhMaXN0PE9iamVjdD4gaXNzdWVzKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXNzdWVzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IGlzc3Vlc1tpXTsKICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpc3N1ZXNbaSArIDFdOwogICAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBpc3N1ZXNbaSArIDJdOwoKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2UsIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIGRlY2xhcmF0aW9uLm5hbWUubGVuZ3RoLAogICAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfQogICAgfQoKICAgIGZvciAoQnVpbGRlciBkZWNsYXJhdGlvbiBpbiBsaWJyYXJ5RGVjbGFyYXRpb24ubWVtYmVycy52YWx1ZXMpIHsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIHsKICAgICAgICAgIExpc3Q8T2JqZWN0PiBpc3N1ZXMgPSBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgZGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgcGVyZm9ybUVycm9yUmVjb3Zlcnk6IHRydWUpOwogICAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgICBjb3VudCArPSBjb21wdXRlRGVmYXVsdFR5cGVzRm9yVmFyaWFibGVzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMsCiAgICAgICAgICAgICAgaW5FcnJvclJlY292ZXJ5OiBpc3N1ZXMuaXNOb3RFbXB0eSk7CiAgICAgICAgfQogICAgICAgIGRlY2xhcmF0aW9uLmZvckVhY2goKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgICAgICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmVCdWlsZGVyKSB7CiAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBpc3N1ZXMgPQogICAgICAgICAgICAgICAgZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvclR5cGVWYXJpYWJsZXMobWVtYmVyLnR5cGVWYXJpYWJsZXMpOwogICAgICAgICAgICByZXBvcnRJc3N1ZXMoaXNzdWVzKTsKICAgICAgICAgICAgY291bnQgKz0gY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcyhtZW1iZXIudHlwZVZhcmlhYmxlcywKICAgICAgICAgICAgICAgIGluRXJyb3JSZWNvdmVyeTogaXNzdWVzLmlzTm90RW1wdHkpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgICBMaXN0PE9iamVjdD4gaXNzdWVzID0gZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvckRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLAogICAgICAgICAgICBwZXJmb3JtRXJyb3JSZWNvdmVyeTogdHJ1ZSk7CiAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgY291bnQgKz0gY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzLAogICAgICAgICAgICBpbkVycm9yUmVjb3Zlcnk6IGlzc3Vlcy5pc05vdEVtcHR5KTsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBGdW5jdGlvbkJ1aWxkZXIpIHsKICAgICAgICBMaXN0PE9iamVjdD4gaXNzdWVzID0KICAgICAgICAgICAgZ2V0Tm9uU2ltcGxpY2l0eUlzc3Vlc0ZvclR5cGVWYXJpYWJsZXMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyk7CiAgICAgICAgcmVwb3J0SXNzdWVzKGlzc3Vlcyk7CiAgICAgICAgY291bnQgKz0gY29tcHV0ZURlZmF1bHRUeXBlc0ZvclZhcmlhYmxlcyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzLAogICAgICAgICAgICBpbkVycm9yUmVjb3Zlcnk6IGlzc3Vlcy5pc05vdEVtcHR5KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBjb3VudDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaGVzKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm47CgogICAgaWYgKGxhbmd1YWdlVmVyc2lvbiAhPSBvcmlnaW4ubGFuZ3VhZ2VWZXJzaW9uKSB7CiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+W107CiAgICAgIGlmIChvcmlnaW4ubGFuZ3VhZ2VWZXJzaW9uLmlzRXhwbGljaXQpIHsKICAgICAgICBjb250ZXh0LmFkZChtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uTGlicmFyeUNvbnRleHQud2l0aExvY2F0aW9uKAogICAgICAgICAgICBvcmlnaW4ubGFuZ3VhZ2VWZXJzaW9uLmZpbGVVcmksCiAgICAgICAgICAgIG9yaWdpbi5sYW5ndWFnZVZlcnNpb24uY2hhck9mZnNldCwKICAgICAgICAgICAgb3JpZ2luLmxhbmd1YWdlVmVyc2lvbi5jaGFyQ291bnQpKTsKICAgICAgfQoKICAgICAgaWYgKGxhbmd1YWdlVmVyc2lvbi5pc0V4cGxpY2l0KSB7CiAgICAgICAgYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZUxhbmd1YWdlVmVyc2lvbk1pc21hdGNoSW5QYXRjaCwKICAgICAgICAgICAgbGFuZ3VhZ2VWZXJzaW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIGxhbmd1YWdlVmVyc2lvbi5jaGFyQ291bnQsCiAgICAgICAgICAgIGxhbmd1YWdlVmVyc2lvbi5maWxlVXJpLAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VMYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGF0Y2gsIC0xLCBub0xlbmd0aCwgZmlsZVVyaSwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICAgIH0KICAgIH0KCiAgICBOYW1lSXRlcmF0b3Igb3JpZ2luRGVjbGFyYXRpb25zID0gb3JpZ2luLm5hbWVJdGVyYXRvcjsKICAgIHdoaWxlIChvcmlnaW5EZWNsYXJhdGlvbnMubW92ZU5leHQoKSkgewogICAgICBTdHJpbmcgbmFtZSA9IG9yaWdpbkRlY2xhcmF0aW9ucy5uYW1lOwogICAgICBCdWlsZGVyIG1lbWJlciA9IG9yaWdpbkRlY2xhcmF0aW9ucy5jdXJyZW50OwogICAgICBib29sIGlzU2V0dGVyID0gbWVtYmVyLmlzU2V0dGVyOwogICAgICBCdWlsZGVyIHBhdGNoID0gc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBpc1NldHRlcik7CiAgICAgIGlmIChwYXRjaCAhPSBudWxsKSB7CiAgICAgICAgLy8gW3BhdGNoXSBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIFttZW1iZXJdIGluIFtvcmlnaW5dIGxpYnJhcnksIHNvIGl0CiAgICAgICAgLy8gbXVzdCBiZSBhIHBhdGNoIHRvIFttZW1iZXJdLgogICAgICAgIG1lbWJlci5hcHBseVBhdGNoKHBhdGNoKTsKICAgICAgICAvLyBUT0RPKGFoZSk6IFZlcmlmeSB0aGF0IHBhdGNoIGhhcyB0aGUgQHBhdGNoIGFubm90YXRpb24uCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm8gbWVtYmVyIHdpdGggW25hbWVdIGV4aXN0cyBpbiB0aGlzIGxpYnJhcnkgYWxyZWFkeS4gU28gd2UgbmVlZCB0bwogICAgICAgIC8vIGltcG9ydCBpdCBpbnRvIHRoZSBwYXRjaCBsaWJyYXJ5LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luCiAgICAgICAgLy8gbGlicmFyeSBpcyBpbiBzY29wZSBvZiB0aGUgcGF0Y2ggbGlicmFyeS4KICAgICAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgICAgIHNjb3BlQnVpbGRlci5hZGRTZXR0ZXIobmFtZSwgbWVtYmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2NvcGVCdWlsZGVyLmFkZE1lbWJlcihuYW1lLCBtZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgTmFtZUl0ZXJhdG9yIHBhdGNoRGVjbGFyYXRpb25zID0gbmFtZUl0ZXJhdG9yOwogICAgd2hpbGUgKHBhdGNoRGVjbGFyYXRpb25zLm1vdmVOZXh0KCkpIHsKICAgICAgU3RyaW5nIG5hbWUgPSBwYXRjaERlY2xhcmF0aW9ucy5uYW1lOwogICAgICBCdWlsZGVyIG1lbWJlciA9IHBhdGNoRGVjbGFyYXRpb25zLmN1cnJlbnQ7CiAgICAgIC8vIFdlIG5lZWQgdG8gaW5qZWN0IGFsbCBub24tcGF0Y2ggbWVtYmVycyBpbnRvIHRoZSBvcmlnaW4gbGlicmFyeS4gVGhpcwogICAgICAvLyBzaG91bGQgb25seSBhcHBseSB0byBwcml2YXRlIG1lbWJlcnMuCiAgICAgIGlmIChtZW1iZXIuaXNQYXRjaCkgewogICAgICAgIC8vIElnbm9yZSBwYXRjaGVzLgogICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgICAgb3JpZ2luLmluamVjdE1lbWJlckZyb21QYXRjaChuYW1lLCBtZW1iZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIG9yaWdpbi5leHBvcnRNZW1iZXJGcm9tUGF0Y2gobmFtZSwgbWVtYmVyKTsKICAgICAgfQogICAgfQogIH0KCiAgaW50IGZpbmlzaFBhdGNoTWV0aG9kcygpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuIDA7CiAgICBpbnQgY291bnQgPSAwOwogICAgSXRlcmF0b3I8QnVpbGRlcj4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgY291bnQgKz0gaXRlcmF0b3IuY3VycmVudC5maW5pc2hQYXRjaCgpOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgdm9pZCBpbmplY3RNZW1iZXJGcm9tUGF0Y2goU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyLmlzU2V0dGVyKSB7CiAgICAgIGFzc2VydChzY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IHRydWUpID09IG51bGwpOwogICAgICBzY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUsIG1lbWJlcik7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBmYWxzZSkgPT0gbnVsbCk7CiAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZSwgbWVtYmVyKTsKICAgIH0KICB9CgogIHZvaWQgZXhwb3J0TWVtYmVyRnJvbVBhdGNoKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgaWYgKGltcG9ydFVyaS5zY2hlbWUgIT0gImRhcnQiIHx8ICFpbXBvcnRVcmkucGF0aC5zdGFydHNXaXRoKCJfIikpIHsKICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZVBhdGNoSW5qZWN0aW9uRmFpbGVkLndpdGhBcmd1bWVudHMobmFtZSwgaW1wb3J0VXJpKSwKICAgICAgICAgIG1lbWJlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgbWVtYmVyLmZpbGVVcmkpOwogICAgfQogICAgLy8gUGxhdGZvcm0tcHJpdmF0ZSBsaWJyYXJpZXMsIHN1Y2ggYXMgImRhcnQ6X2ludGVybmFsIiBoYXZlIHNwZWNpYWwKICAgIC8vIHNlbWFudGljczogcHVibGljIG1lbWJlcnMgYXJlIGluamVjdGVkIGludG8gdGhlIG9yaWdpbiBsaWJyYXJ5LgogICAgLy8gVE9ETyhhaGUpOiBTZWUgaWYgd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZS4KCiAgICAvLyBJZiB0aGlzIG1lbWJlciBhbHJlYWR5IGV4aXN0IGluIHRoZSBvcmlnaW4gbGlicmFyeSBzY29wZSwgaXQgc2hvdWxkCiAgICAvLyBoYXZlIGJlZW4gbWFya2VkIGFzIHBhdGNoLgogICAgYXNzZXJ0KChtZW1iZXIuaXNTZXR0ZXIgJiYKICAgICAgICAgICAgc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiB0cnVlKSA9PSBudWxsKSB8fAogICAgICAgICghbWVtYmVyLmlzU2V0dGVyICYmCiAgICAgICAgICAgIHNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKG5hbWUsIHNldHRlcjogZmFsc2UpID09IG51bGwpKTsKICAgIGFkZFRvRXhwb3J0U2NvcGUobmFtZSwgbWVtYmVyKTsKICB9CgogIHZvaWQgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMsIFVyaSBmaWxlVXJpLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpbmZlcnJlZCwKICAgICAgVHlwZUFyZ3VtZW50c0luZm8gdHlwZUFyZ3VtZW50c0luZm8sCiAgICAgIERhcnRUeXBlIHRhcmdldFJlY2VpdmVyLAogICAgICBTdHJpbmcgdGFyZ2V0TmFtZX0pIHsKICAgIGZvciAoVHlwZUFyZ3VtZW50SXNzdWUgaXNzdWUgaW4gaXNzdWVzKSB7CiAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gaXNzdWUuYXJndW1lbnQ7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CgogICAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICAgIGJvb2wgaXNzdWVJbmZlcnJlZCA9IGluZmVycmVkID8/CiAgICAgICAgICB0eXBlQXJndW1lbnRzSW5mbz8uaXNJbmZlcnJlZChpc3N1ZS5pbmRleCkgPz8KICAgICAgICAgIGluZmVycmVkVHlwZXMuY29udGFpbnMoYXJndW1lbnQpOwogICAgICBvZmZzZXQgPQogICAgICAgICAgdHlwZUFyZ3VtZW50c0luZm8/LmdldE9mZnNldEZvckluZGV4KGlzc3VlLmluZGV4LCBvZmZzZXQpID8/IG9mZnNldDsKICAgICAgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgaWYgKGlzc3VlSW5mZXJyZWQpIHsKICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUdlbmVyaWNGdW5jdGlvblR5cGVJbmZlcnJlZEFzQWN0dWFsVHlwZUFyZ3VtZW50CiAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYXJndW1lbnQsIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZUdlbmVyaWNGdW5jdGlvblR5cGVVc2VkQXNBY3R1YWxUeXBlQXJndW1lbnQ7CiAgICAgICAgfQogICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpc3N1ZS5lbmNsb3NpbmdUeXBlID09IG51bGwgJiYgdGFyZ2V0UmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGlzc3VlSW5mZXJyZWQpIHsKICAgICAgICAgICAgbWVzc2FnZSA9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVjZWl2ZXIsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICAgICAgdGFyZ2V0UmVjZWl2ZXIsCiAgICAgICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN0cmluZyBlbmNsb3NpbmdOYW1lID0gaXNzdWUuZW5jbG9zaW5nVHlwZSA9PSBudWxsCiAgICAgICAgICAgICAgPyB0YXJnZXROYW1lCiAgICAgICAgICAgICAgOiBnZXRHZW5lcmljVHlwZU5hbWUoaXNzdWUuZW5jbG9zaW5nVHlwZSk7CiAgICAgICAgICBhc3NlcnQoZW5jbG9zaW5nTmFtZSAhPSBudWxsKTsKICAgICAgICAgIGlmIChpc3N1ZUluZmVycmVkKSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBhcmd1bWVudCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYm91bmQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICAgICAgICBlbmNsb3NpbmdOYW1lLAogICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXNzYWdlID0gdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5ib3VuZCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSwKICAgICAgICAgICAgICAgIGVuY2xvc2luZ05hbWUsCiAgICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJlcG9ydFR5cGVBcmd1bWVudElzc3VlKG1lc3NhZ2UsIGZpbGVVcmksIG9mZnNldCwgdHlwZVBhcmFtZXRlcik7CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydFR5cGVBcmd1bWVudElzc3VlKE1lc3NhZ2UgbWVzc2FnZSwgVXJpIGZpbGVVcmksIGludCBmaWxlT2Zmc2V0LAogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIpIHsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CiAgICBpZiAodHlwZVBhcmFtZXRlciAhPSBudWxsICYmIHR5cGVQYXJhbWV0ZXIuZmlsZU9mZnNldCAhPSAtMSkgewogICAgICAvLyBJdCBsb29rcyBsaWtlIHdoZW4gcGFyYW1ldGVycyBjb21lIGZyb20gcGF0Y2ggZmlsZXMsIHRoZXkgZG9uJ3QKICAgICAgLy8gaGF2ZSBhIHJlcG9ydGFibGUgbG9jYXRpb24uCiAgICAgIGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgIG1lc3NhZ2VJbmNvcnJlY3RUeXBlQXJndW1lbnRWYXJpYWJsZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIubG9jYXRpb24uZmlsZSwgdHlwZVBhcmFtZXRlci5maWxlT2Zmc2V0LCBub0xlbmd0aCkKICAgICAgXTsKICAgIH0KICAgIGFkZFByb2JsZW0obWVzc2FnZSwgZmlsZU9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmksIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgdm9pZCBjaGVja1R5cGVzSW5GaWVsZCgKICAgICAgRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlciwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgLy8gQ2hlY2sgdGhlIGJvdW5kcyBpbiB0aGUgZmllbGQncyB0eXBlLgogICAgY2hlY2tCb3VuZHNJblR5cGUoZmllbGRCdWlsZGVyLmZpZWxkLnR5cGUsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBmaWVsZEJ1aWxkZXIuZmlsZVVyaSwgZmllbGRCdWlsZGVyLmZpZWxkLmZpbGVPZmZzZXQsCiAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwoKICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpZWxkIGhhcyBhbiBpbml0aWFsaXplciBpZiBpdHMgdHlwZSBpcyBwb3RlbnRpYWxseQogICAgLy8gbm9uLW51bGxhYmxlLgogICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgbG9hZGVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIC8vIE9ubHkgc3RhdGljIGFuZCB0b3AtbGV2ZWwgZmllbGRzIGFyZSBjaGVja2VkIGhlcmUuICBJbnN0YW5jZSBmaWVsZHMgYXJlCiAgICAgIC8vIGNoZWNrZWQgZWxzZXdoZXJlLgogICAgICBEYXJ0VHlwZSBmaWVsZFR5cGUgPSBmaWVsZEJ1aWxkZXIuZmllbGQudHlwZTsKICAgICAgaWYgKCFmaWVsZEJ1aWxkZXIuaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICAhZmllbGRCdWlsZGVyLmZpZWxkLmlzTGF0ZSAmJgogICAgICAgICAgZmllbGRUeXBlIGlzISBJbnZhbGlkVHlwZSAmJgogICAgICAgICAgZmllbGRUeXBlLmlzUG90ZW50aWFsbHlOb25OdWxsYWJsZSAmJgogICAgICAgICAgIWZpZWxkQnVpbGRlci5oYXNJbml0aWFsaXplcikgewogICAgICAgIGlmIChsb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3Iud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgZmllbGRCdWlsZGVyLm5hbWUsCiAgICAgICAgICAgICAgICAgIGZpZWxkQnVpbGRlci5maWVsZC50eXBlLAogICAgICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICBmaWVsZEJ1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgICBmaWVsZEJ1aWxkZXIubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBmaWVsZEJ1aWxkZXIubmFtZSwKICAgICAgICAgICAgICAgICAgZmllbGRCdWlsZGVyLmZpZWxkLnR5cGUsCiAgICAgICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgIGZpZWxkQnVpbGRlci5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgIGZpZWxkQnVpbGRlci5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICBmaWxlVXJpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tJbml0aWFsaXplcnNJbkZvcm1hbHMoTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzKSB7CiAgICBib29sIHBlcmZvcm1Jbml0aWFsaXplckNoZWNrcyA9CiAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJiBsb2FkZXIucGVyZm9ybU5uYmRDaGVja3M7CiAgICBpZiAoIXBlcmZvcm1Jbml0aWFsaXplckNoZWNrcykgcmV0dXJuOwoKICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICBib29sIGlzT3B0aW9uYWxQb3NpdGlvbmFsID0gZm9ybWFsLmlzT3B0aW9uYWwgJiYgZm9ybWFsLmlzUG9zaXRpb25hbDsKICAgICAgYm9vbCBpc09wdGlvbmFsTmFtZWQgPSAhZm9ybWFsLmlzTmFtZWRSZXF1aXJlZCAmJiBmb3JtYWwuaXNOYW1lZDsKICAgICAgYm9vbCBpc09wdGlvbmFsID0gaXNPcHRpb25hbFBvc2l0aW9uYWwgfHwgaXNPcHRpb25hbE5hbWVkOwogICAgICBpZiAoaXNPcHRpb25hbCAmJgogICAgICAgICAgZm9ybWFsLnZhcmlhYmxlLnR5cGUuaXNQb3RlbnRpYWxseU5vbk51bGxhYmxlICYmCiAgICAgICAgICAhZm9ybWFsLmhhc0RlY2xhcmVkSW5pdGlhbGl6ZXIpIHsKICAgICAgICBpZiAobG9hZGVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGZvcm1hbC5uYW1lLCBmb3JtYWwudmFyaWFibGUudHlwZSwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9ybWFsLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZm9ybWFsLm5hbWUsIGZvcm1hbC52YXJpYWJsZS50eXBlLAogICAgICAgICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9ybWFsLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlUGFydHMoCiAgICAgIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIFVyaSBmaWxlVXJpLCBpbnQgZmlsZU9mZnNldCwKICAgICAge0xpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gcG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gbmFtZWRQYXJhbWV0ZXJzLAogICAgICBEYXJ0VHlwZSByZXR1cm5UeXBlLAogICAgICBpbnQgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudH0pIHsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICAgICAgcGFyYW1ldGVyLmJvdW5kLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIHBhcmFtZXRlci5maWxlT2Zmc2V0LAogICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChwb3NpdGlvbmFsUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAgIGNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgICAgICBwYXJhbWV0ZXIudHlwZSwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCBwYXJhbWV0ZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgICB9CiAgICB9CiAgICBpZiAobmFtZWRQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIG5hbWVkID0gbmFtZWRQYXJhbWV0ZXJzW2ldOwogICAgICAgIGNoZWNrQm91bmRzSW5UeXBlKAogICAgICAgICAgICBuYW1lZC50eXBlLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIG5hbWVkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgICAgICAgcmV0dXJuVHlwZSwgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogICAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICBmb3IgKFR5cGVBcmd1bWVudElzc3VlIGlzc3VlIGluIGlzc3VlcykgewogICAgICAgICAgRGFydFR5cGUgYXJndW1lbnQgPSBpc3N1ZS5hcmd1bWVudDsKICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGlzc3VlLnR5cGVQYXJhbWV0ZXI7CgogICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBbYXJndW1lbnRdIHdhcyBpbmZlcnJlZCBvciBzcGVjaWZpZWQKICAgICAgICAgIC8vIGhlcmUsIGJlY2F1c2UgaW5mZXJlbmNlIGluIHJldHVybiB0eXBlcyBib2lscyBkb3duIHRvIGluc3RhbnRpYXRlLQogICAgICAgICAgLy8gLXRvLWJvdW5kLCBhbmQgaXQgY2FuJ3QgcHJvdmlkZSBhIHR5cGUgdGhhdCB2aW9sYXRlcyB0aGUgYm91bmQuCiAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CiAgICAgICAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50OwogICAgICAgICAgICB0eXBlUGFyYW1ldGVyID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgYXJndW1lbnQsCiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5uYW1lLAogICAgICAgICAgICAgICAgZ2V0R2VuZXJpY1R5cGVOYW1lKGlzc3VlLmVuY2xvc2luZ1R5cGUpLAogICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICAgICAgICB9CgogICAgICAgICAgcmVwb3J0VHlwZUFyZ3VtZW50SXNzdWUobWVzc2FnZSwgZmlsZVVyaSwgb2Zmc2V0LCB0eXBlUGFyYW1ldGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZSgKICAgICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSkgewogICAgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZVBhcnRzKAogICAgICAgIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgZnVuY3Rpb24uZmlsZU9mZnNldCwKICAgICAgICB0eXBlUGFyYW1ldGVyczogZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJldHVyblR5cGU6IGZ1bmN0aW9uLnJldHVyblR5cGUsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5MaXN0TGl0ZXJhbCgKICAgICAgTGlzdExpdGVyYWwgbm9kZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGluZmVycmVkID0gZmFsc2V9KSB7CiAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICBub2RlLnR5cGVBcmd1bWVudCwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5TZXRMaXRlcmFsKAogICAgICBTZXRMaXRlcmFsIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgY2hlY2tCb3VuZHNJblR5cGUoCiAgICAgICAgbm9kZS50eXBlQXJndW1lbnQsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luTWFwTGl0ZXJhbCgKICAgICAgTWFwTGl0ZXJhbCBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGNoZWNrQm91bmRzSW5UeXBlKG5vZGUua2V5VHlwZSwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICBjaGVja0JvdW5kc0luVHlwZShub2RlLnZhbHVlVHlwZSwgdHlwZUVudmlyb25tZW50LCBmaWxlVXJpLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZWQ6IGluZmVycmVkLCBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5UeXBlKAogICAgICBEYXJ0VHlwZSB0eXBlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgaW5mZXJyZWQsIGJvb2wgYWxsb3dTdXBlckJvdW5kZWQgPSB0cnVlfSkgewogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3VlcygKICAgICAgICB0eXBlLCB0eXBlRW52aXJvbm1lbnQsCiAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IGFsbG93U3VwZXJCb3VuZGVkKTsKICAgIGlmIChpc3N1ZXMgIT0gbnVsbCkgewogICAgICByZXBvcnRUeXBlQXJndW1lbnRJc3N1ZXMoaXNzdWVzLCBmaWxlVXJpLCBvZmZzZXQsIGluZmVycmVkOiBpbmZlcnJlZCk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5WYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQsIFVyaSBmaWxlVXJpLAogICAgICB7Ym9vbCBpbmZlcnJlZCA9IGZhbHNlfSkgewogICAgaWYgKG5vZGUudHlwZSA9PSBudWxsKSByZXR1cm47CiAgICBjaGVja0JvdW5kc0luVHlwZShub2RlLnR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpOwogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgVXJpIGZpbGVVcmksCiAgICAgIHtib29sIGluZmVycmVkID0gZmFsc2V9KSB7CiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNFbXB0eSkgcmV0dXJuOwogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBub2RlLnRhcmdldDsKICAgIENsYXNzIGtsYXNzID0gY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3M7CiAgICBEYXJ0VHlwZSBjb25zdHJ1Y3RlZFR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBrbGFzcywga2xhc3MuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSwgbm9kZS5hcmd1bWVudHMudHlwZXMpOwogICAgY2hlY2tCb3VuZHNJblR5cGUoCiAgICAgICAgY29uc3RydWN0ZWRUeXBlLCB0eXBlRW52aXJvbm1lbnQsIGZpbGVVcmksIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBpbmZlcnJlZDogaW5mZXJyZWQsIGFsbG93U3VwZXJCb3VuZGVkOiBmYWxzZSk7CiAgfQoKICB2b2lkIGNoZWNrQm91bmRzSW5GYWN0b3J5SW52b2NhdGlvbigKICAgICAgU3RhdGljSW52b2NhdGlvbiBub2RlLCBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgaW5mZXJyZWQgPSBmYWxzZX0pIHsKICAgIGlmIChub2RlLmFyZ3VtZW50cy50eXBlcy5pc0VtcHR5KSByZXR1cm47CiAgICBQcm9jZWR1cmUgZmFjdG9yeSA9IG5vZGUudGFyZ2V0OwogICAgYXNzZXJ0KGZhY3RvcnkuaXNGYWN0b3J5KTsKICAgIENsYXNzIGtsYXNzID0gZmFjdG9yeS5lbmNsb3NpbmdDbGFzczsKICAgIERhcnRUeXBlIGNvbnN0cnVjdGVkVHlwZSA9IG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGtsYXNzLCBrbGFzcy5lbmNsb3NpbmdMaWJyYXJ5Lm5vbk51bGxhYmxlLCBub2RlLmFyZ3VtZW50cy50eXBlcyk7CiAgICBjaGVja0JvdW5kc0luVHlwZSgKICAgICAgICBjb25zdHJ1Y3RlZFR5cGUsIHR5cGVFbnZpcm9ubWVudCwgZmlsZVVyaSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIGluZmVycmVkOiBpbmZlcnJlZCwgYWxsb3dTdXBlckJvdW5kZWQ6IGZhbHNlKTsKICB9CgogIHZvaWQgY2hlY2tCb3VuZHNJblN0YXRpY0ludm9jYXRpb24oCiAgICAgIFN0YXRpY0ludm9jYXRpb24gbm9kZSwKICAgICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIFR5cGVBcmd1bWVudHNJbmZvIHR5cGVBcmd1bWVudHNJbmZvKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgcGFydGlhbGx5IGluZmVycmVkIHR5cGUgYXJndW1lbnRzIGluCiAgICAvLyBleHRlbnNpb24gbWV0aG9kIGNhbGxzLiBDdXJyZW50bHkgYWxsIGFyZSBjb25zaWRlcmVkIGluZmVycmVkIGluIHRoZQogICAgLy8gZXJyb3IgbWVzc2FnZXMuCiAgICBpZiAobm9kZS5hcmd1bWVudHMudHlwZXMuaXNFbXB0eSkgcmV0dXJuOwogICAgQ2xhc3Mga2xhc3MgPSBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzczsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG5vZGUudGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzID0gbm9kZS5hcmd1bWVudHMudHlwZXM7CiAgICAvLyBUaGUgZm9sbG93aW5nIGVycm9yIGlzIHRvIGJlIHJlcG9ydGVkIGVsc2V3aGVyZS4KICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAhPSBhcmd1bWVudHMubGVuZ3RoKSByZXR1cm47CiAgICBMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBpc3N1ZXMgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzRm9ySW52b2NhdGlvbigKICAgICAgICBwYXJhbWV0ZXJzLCBhcmd1bWVudHMsIHR5cGVFbnZpcm9ubWVudCk7CiAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgRGFydFR5cGUgdGFyZ2V0UmVjZWl2ZXI7CiAgICAgIGlmIChrbGFzcyAhPSBudWxsKSB7CiAgICAgICAgdGFyZ2V0UmVjZWl2ZXIgPQogICAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShrbGFzcywga2xhc3MuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgIH0KICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBub2RlLnRhcmdldC5uYW1lLm5hbWU7CiAgICAgIHJlcG9ydFR5cGVBcmd1bWVudElzc3Vlcyhpc3N1ZXMsIGZpbGVVcmksIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgIHR5cGVBcmd1bWVudHNJbmZvOiB0eXBlQXJndW1lbnRzSW5mbywKICAgICAgICAgIHRhcmdldFJlY2VpdmVyOiB0YXJnZXRSZWNlaXZlciwKICAgICAgICAgIHRhcmdldE5hbWU6IHRhcmdldE5hbWUpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0JvdW5kc0luTWV0aG9kSW52b2NhdGlvbigKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAgICBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHksCiAgICAgIFR5cGVJbmZlcnJlckltcGwgdHlwZUluZmVycmVyLAogICAgICBOYW1lIG5hbWUsCiAgICAgIE1lbWJlciBpbnRlcmZhY2VUYXJnZXQsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBpbnQgb2Zmc2V0KSB7CiAgICBpZiAoYXJndW1lbnRzLnR5cGVzLmlzRW1wdHkpIHJldHVybjsKICAgIENsYXNzIGtsYXNzOwogICAgTGlzdDxEYXJ0VHlwZT4gcmVjZWl2ZXJUeXBlQXJndW1lbnRzOwogICAgaWYgKHJlY2VpdmVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIGtsYXNzID0gcmVjZWl2ZXJUeXBlLmNsYXNzTm9kZTsKICAgICAgcmVjZWl2ZXJUeXBlQXJndW1lbnRzID0gcmVjZWl2ZXJUeXBlLnR5cGVBcmd1bWVudHM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmluZCBhIGJldHRlciB3YXkgdGhhbiByZWx5aW5nIG9uIFtpbnRlcmZhY2VUYXJnZXRdLgogICAgTWVtYmVyIG1ldGhvZCA9IGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldChrbGFzcywgbmFtZSkgPz8gaW50ZXJmYWNlVGFyZ2V0OwogICAgaWYgKG1ldGhvZCA9PSBudWxsIHx8IG1ldGhvZCBpcyEgUHJvY2VkdXJlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChrbGFzcyAhPSBtZXRob2QuZW5jbG9zaW5nQ2xhc3MpIHsKICAgICAgU3VwZXJ0eXBlIHBhcmVudCA9CiAgICAgICAgICBoaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2Yoa2xhc3MsIG1ldGhvZC5lbmNsb3NpbmdDbGFzcyk7CiAgICAgIGtsYXNzID0gbWV0aG9kLmVuY2xvc2luZ0NsYXNzOwogICAgICByZWNlaXZlclR5cGVBcmd1bWVudHMgPSBwYXJlbnQudHlwZUFyZ3VtZW50czsKICAgIH0KICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNlaXZlclR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgc3Vic3RpdHV0aW9uTWFwW2tsYXNzLnR5cGVQYXJhbWV0ZXJzW2ldXSA9IHJlY2VpdmVyVHlwZUFyZ3VtZW50c1tpXTsKICAgIH0KICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gbWV0aG9kUGFyYW1ldGVycyA9IG1ldGhvZC5mdW5jdGlvbi50eXBlUGFyYW1ldGVyczsKICAgIC8vIFRoZSBlcnJvciBpcyB0byBiZSByZXBvcnRlZCBlbHNld2hlcmUuCiAgICBpZiAobWV0aG9kUGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRzLnR5cGVzLmxlbmd0aCkgcmV0dXJuOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPi5maWxsZWQobWV0aG9kUGFyYW1ldGVycy5sZW5ndGgsIG51bGwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnNbaV0gPQogICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXIobWV0aG9kUGFyYW1ldGVyc1tpXS5uYW1lKTsKICAgICAgc3Vic3RpdHV0aW9uTWFwW21ldGhvZFBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICAgIG1ldGhvZFBhcmFtZXRlcnNbaV0sIGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnNbaV0pOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGluc3RhbnRpYXRlZE1ldGhvZFBhcmFtZXRlcnNbaV0uYm91bmQgPQogICAgICAgICAgc3Vic3RpdHV0ZShtZXRob2RQYXJhbWV0ZXJzW2ldLmJvdW5kLCBzdWJzdGl0dXRpb25NYXApOwogICAgfQogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24oCiAgICAgICAgaW5zdGFudGlhdGVkTWV0aG9kUGFyYW1ldGVycywgYXJndW1lbnRzLnR5cGVzLCB0eXBlRW52aXJvbm1lbnQpOwogICAgaWYgKGlzc3VlcyAhPSBudWxsKSB7CiAgICAgIHJlcG9ydFR5cGVBcmd1bWVudElzc3Vlcyhpc3N1ZXMsIGZpbGVVcmksIG9mZnNldCwKICAgICAgICAgIHR5cGVBcmd1bWVudHNJbmZvOiBnZXRUeXBlQXJndW1lbnRzSW5mbyhhcmd1bWVudHMpLAogICAgICAgICAgdGFyZ2V0UmVjZWl2ZXI6IHJlY2VpdmVyVHlwZSwKICAgICAgICAgIHRhcmdldE5hbWU6IG5hbWUubmFtZSk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrVHlwZXNJbk91dGxpbmUoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCkgewogICAgSXRlcmF0b3I8QnVpbGRlcj4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBGaWVsZEJ1aWxkZXIpIHsKICAgICAgICBjaGVja1R5cGVzSW5GaWVsZChkZWNsYXJhdGlvbiwgdHlwZUVudmlyb25tZW50KTsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBQcm9jZWR1cmVCdWlsZGVyKSB7CiAgICAgICAgY2hlY2tCb3VuZHNJbkZ1bmN0aW9uTm9kZShkZWNsYXJhdGlvbi5wcm9jZWR1cmUuZnVuY3Rpb24sCiAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgICAgY2hlY2tJbml0aWFsaXplcnNJbkZvcm1hbHMoZGVjbGFyYXRpb24uZm9ybWFscyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIGRlY2xhcmF0aW9uLmNoZWNrVHlwZXNJbk91dGxpbmUodHlwZUVudmlyb25tZW50KTsKICAgICAgfQogICAgfQogICAgaW5mZXJyZWRUeXBlcy5jbGVhcigpOwogIH0KCiAgdm9pZCByZWdpc3RlckltcGxpY2l0bHlUeXBlZEZpZWxkKEZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIpIHsKICAgIChfaW1wbGljaXRseVR5cGVkRmllbGRzID8/PSA8RmllbGRCdWlsZGVyPltdKS5hZGQoZmllbGRCdWlsZGVyKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RmllbGRCdWlsZGVyPiB0YWtlSW1wbGljaXRseVR5cGVkRmllbGRzKCkgewogICAgTGlzdDxGaWVsZEJ1aWxkZXI+IHJlc3VsdCA9IF9pbXBsaWNpdGx5VHlwZWRGaWVsZHM7CiAgICBfaW1wbGljaXRseVR5cGVkRmllbGRzID0gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGZvckVhY2hFeHRlbnNpb25JblNjb3BlKHZvaWQgRnVuY3Rpb24oRXh0ZW5zaW9uQnVpbGRlcikgZikgewogICAgaWYgKF9leHRlbnNpb25zSW5TY29wZSA9PSBudWxsKSB7CiAgICAgIF9leHRlbnNpb25zSW5TY29wZSA9IDxFeHRlbnNpb25CdWlsZGVyPnt9OwogICAgICBzY29wZS5mb3JFYWNoRXh0ZW5zaW9uKF9leHRlbnNpb25zSW5TY29wZS5hZGQpOwogICAgICBpZiAoX3ByZWZpeEJ1aWxkZXJzICE9IG51bGwpIHsKICAgICAgICBmb3IgKFByZWZpeEJ1aWxkZXIgcHJlZml4IGluIF9wcmVmaXhCdWlsZGVycykgewogICAgICAgICAgcHJlZml4LmV4cG9ydFNjb3BlLmZvckVhY2hFeHRlbnNpb24oX2V4dGVuc2lvbnNJblNjb3BlLmFkZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBfZXh0ZW5zaW9uc0luU2NvcGUuZm9yRWFjaChmKTsKICB9CgogIHZvaWQgY2xlYXJFeHRlbnNpb25zSW5TY29wZUNhY2hlKCkgewogICAgX2V4dGVuc2lvbnNJblNjb3BlID0gbnVsbDsKICB9CgogIC8vLyBTZXQgdG8gc29tZSBub24tbnVsbCBuYW1lIHdoZW4gZW50ZXJpbmcgYSBjbGFzczsgc2V0IHRvIG51bGwgd2hlbiBsZWF2aW5nCiAgLy8vIHRoZSBjbGFzcy4KICAvLy8KICAvLy8gQ2FsbGVkIGluIE91dGxpbmVCdWlsZGVyLmJlZ2luQ2xhc3NEZWNsYXJhdGlvbiwKICAvLy8gT3V0bGluZUJ1aWxkZXIuZW5kQ2xhc3NEZWNsYXJhdGlvbiwKICAvLy8gT3V0bGluZUJ1aWxkZXIuYmVnaW5NaXhpbkRlY2xhcmF0aW9uLAogIC8vLyBPdXRsaW5lQnVpbGRlci5lbmRNaXhpbkRlY2xhcmF0aW9uLgogIHZvaWQgc2V0Q3VycmVudENsYXNzTmFtZShTdHJpbmcgbmFtZSkgewogICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICBfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkID0gbnVsbDsKICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlc0Zyb20gIT0gbnVsbCkgewogICAgICBfY3VycmVudENsYXNzUmVmZXJlbmNlc0Zyb21JbmRleGVkID0KICAgICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBJbmRleGVkQ2xhc3MobmFtZSk7CiAgICB9CiAgfQoKICBQcm9jZWR1cmUgbG9va3VwTGlicmFyeVJlZmVyZW5jZVByb2NlZHVyZShTdHJpbmcgbmFtZSwgYm9vbCBzZXR0ZXIpIHsKICAgIGlmIChyZWZlcmVuY2VzRnJvbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChzZXR0ZXIpIHsKICAgICAgcmV0dXJuIHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBQcm9jZWR1cmVTZXR0ZXIobmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZU5vdFNldHRlcihuYW1lKTsKICAgIH0KICB9Cn0KCi8vIFRoZSBraW5kIG9mIHR5cGUgcGFyYW1ldGVyIHNjb3BlIGJ1aWx0IGJ5IGEgW1R5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXJdCi8vIG9iamVjdC4KZW51bSBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kIHsKICBsaWJyYXJ5LAogIGNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24sCiAgY2xhc3NEZWNsYXJhdGlvbiwKICBtaXhpbkRlY2xhcmF0aW9uLAogIHVubmFtZWRNaXhpbkFwcGxpY2F0aW9uLAogIG5hbWVkTWl4aW5BcHBsaWNhdGlvbiwKICBleHRlbnNpb25EZWNsYXJhdGlvbiwKICB0eXBlZGVmLAogIHN0YXRpY09ySW5zdGFuY2VNZXRob2RPckNvbnN0cnVjdG9yLAogIHRvcExldmVsTWV0aG9kLAogIGZhY3RvcnlNZXRob2QsCiAgZnVuY3Rpb25UeXBlLAp9CgovLy8gQSBidWlsZGVyIG9iamVjdCBwcmVwYXJpbmcgZm9yIGJ1aWxkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGNhbiBpbnRyb2R1Y2UgdHlwZQovLy8gcGFyYW1ldGVyIGFuZC9vciBtZW1iZXJzLgovLy8KLy8vIFVubGlrZSBbU2NvcGVdLCB0aGlzIHNjb3BlIGlzIHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiBidWlsZGVycyB0bwovLy8gZW5zdXJlIHR5cGVzIGFuZCBtZW1iZXJzIGFyZSBhZGRlZCB0byBhbmQgcmVzb2x2ZWQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCmNsYXNzIFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIgewogIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQgX2tpbmQ7CgogIGZpbmFsIFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBCdWlsZGVyPiBtZW1iZXJzOwoKICBmaW5hbCBNYXA8U3RyaW5nLCBCdWlsZGVyPiBjb25zdHJ1Y3RvcnM7CgogIGZpbmFsIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IHNldHRlcnM7CgogIGZpbmFsIFNldDxFeHRlbnNpb25CdWlsZGVyPiBleHRlbnNpb25zOwoKICBmaW5hbCBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlcyA9IDxVbnJlc29sdmVkVHlwZT5bXTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3RvcCB1c2luZyBbX25hbWVdIGZvciBkZXRlcm1pbmluZyB0aGUgZGVjbGFyYXRpb24KICAvLyBraW5kLgogIFN0cmluZyBfbmFtZTsKCiAgLy8vIE9mZnNldCBvZiBuYW1lIHRva2VuLCB1cGRhdGVkIGJ5IHRoZSBvdXRsaW5lIGJ1aWxkZXIgYWxvbmcKICAvLy8gd2l0aCB0aGUgbmFtZSBhcyB0aGUgY3VycmVudCBkZWNsYXJhdGlvbiBjaGFuZ2VzLgogIGludCBfY2hhck9mZnNldDsKCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBfdHlwZVZhcmlhYmxlczsKCiAgLy8vIFRoZSB0eXBlIG9mIGB0aGlzYCBpbiBpbnN0YW5jZSBtZXRob2RzIGRlY2xhcmVkIGluIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnMuCiAgLy8vCiAgLy8vIEluc3RhbmNlIG1ldGhvZHMgZGVjbGFyZWQgaW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucyBtZXRob2RzIGFyZSBleHRlbmRlZAogIC8vLyB3aXRoIGEgc3ludGhlc2l6ZWQgcGFyYW1ldGVyIG9mIHRoaXMgdHlwZS4KICBUeXBlQnVpbGRlciBfZXh0ZW5zaW9uVGhpc1R5cGU7CgogIGJvb2wgaGFzQ29uc3RDb25zdHJ1Y3RvciA9IGZhbHNlOwoKICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyKAogICAgICB0aGlzLl9raW5kLAogICAgICB0aGlzLm1lbWJlcnMsCiAgICAgIHRoaXMuc2V0dGVycywKICAgICAgdGhpcy5jb25zdHJ1Y3RvcnMsCiAgICAgIHRoaXMuZXh0ZW5zaW9ucywKICAgICAgdGhpcy5fbmFtZSwKICAgICAgdGhpcy5fY2hhck9mZnNldCwKICAgICAgdGhpcy5wYXJlbnQpIHsKICAgIGFzc2VydChfbmFtZSAhPSBudWxsKTsKICB9CgogIFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIubGlicmFyeSgpCiAgICAgIDogdGhpcygKICAgICAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5saWJyYXJ5LAogICAgICAgICAgICA8U3RyaW5nLCBCdWlsZGVyPnt9LAogICAgICAgICAgICA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9LAogICAgICAgICAgICBudWxsLCAvLyBObyBzdXBwb3J0IGZvciBjb25zdHJ1Y3RvcnMgaW4gbGlicmFyeSBzY29wZXMuCiAgICAgICAgICAgIDxFeHRlbnNpb25CdWlsZGVyPnt9LAogICAgICAgICAgICAiPGxpYnJhcnk+IiwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIG51bGwpOwoKICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGNyZWF0ZU5lc3RlZCgKICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZCBraW5kLCBTdHJpbmcgbmFtZSwgYm9vbCBoYXNNZW1iZXJzKSB7CiAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIoCiAgICAgICAga2luZCwKICAgICAgICBoYXNNZW1iZXJzID8gPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSA6IG51bGwsCiAgICAgICAgaGFzTWVtYmVycyA/IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30gOiBudWxsLAogICAgICAgIGhhc01lbWJlcnMgPyA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPnt9IDogbnVsbCwKICAgICAgICBudWxsLCAvLyBObyBzdXBwb3J0IGZvciBleHRlbnNpb25zIGluIG5lc3RlZCBzY29wZXMuCiAgICAgICAgbmFtZSwKICAgICAgICAtMSwKICAgICAgICB0aGlzKTsKICB9CgogIC8vLyBSZWdpc3RlcnMgdGhhdCB0aGlzIGJ1aWxkZXIgaXMgcHJlcGFyaW5nIGZvciBhIGNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlCiAgLy8vIGdpdmVuIFtuYW1lXSBhbmQgW3R5cGVWYXJpYWJsZXNdIGxvY2F0ZWQgW2NoYXJPZmZzZXRdLgogIHZvaWQgbWFya0FzQ2xhc3NEZWNsYXJhdGlvbigKICAgICAgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMpIHsKICAgIGFzc2VydChfa2luZCA9PSBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb24sCiAgICAgICAgIlVuZXhwZWN0ZWQgZGVjbGFyYXRpb24ga2luZDogJF9raW5kIik7CiAgICBfa2luZCA9IFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NEZWNsYXJhdGlvbjsKICAgIF9uYW1lID0gbmFtZTsKICAgIF9jaGFyT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIF90eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlczsKICB9CgogIC8vLyBSZWdpc3RlcnMgdGhhdCB0aGlzIGJ1aWxkZXIgaXMgcHJlcGFyaW5nIGZvciBhIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uCiAgLy8vIHdpdGggdGhlIGdpdmVuIFtuYW1lXSBhbmQgW3R5cGVWYXJpYWJsZXNdIGxvY2F0ZWQgW2NoYXJPZmZzZXRdLgogIHZvaWQgbWFya0FzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBTdHJpbmcgbmFtZSwgaW50IGNoYXJPZmZzZXQsIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcykgewogICAgYXNzZXJ0KF9raW5kID09IFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbiwKICAgICAgICAiVW5leHBlY3RlZCBkZWNsYXJhdGlvbiBraW5kOiAkX2tpbmQiKTsKICAgIF9raW5kID0gVHlwZVBhcmFtZXRlclNjb3BlS2luZC5uYW1lZE1peGluQXBwbGljYXRpb247CiAgICBfbmFtZSA9IG5hbWU7CiAgICBfY2hhck9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICBfdHlwZVZhcmlhYmxlcyA9IHR5cGVWYXJpYWJsZXM7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgdGhpcyBidWlsZGVyIGlzIHByZXBhcmluZyBmb3IgYSBtaXhpbiBkZWNsYXJhdGlvbiB3aXRoIHRoZQogIC8vLyBnaXZlbiBbbmFtZV0gYW5kIFt0eXBlVmFyaWFibGVzXSBsb2NhdGVkIFtjaGFyT2Zmc2V0XS4KICB2b2lkIG1hcmtBc01peGluRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB1c2luZyAnY2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbicgZm9yIG1peGluCiAgICAvLyBkZWNsYXJhdGlvbi4gVGhlc2UgYXJlIHN5bnRhY3RpY2FsbHkgZGlzdGluY3Qgc28gd2UgZG9uJ3QgbmVlZCB0aGUKICAgIC8vIHRyYW5zaXRpb24uCiAgICBhc3NlcnQoX2tpbmQgPT0gVHlwZVBhcmFtZXRlclNjb3BlS2luZC5jbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uLAogICAgICAgICJVbmV4cGVjdGVkIGRlY2xhcmF0aW9uIGtpbmQ6ICRfa2luZCIpOwogICAgX2tpbmQgPSBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLm1peGluRGVjbGFyYXRpb247CiAgICBfbmFtZSA9IG5hbWU7CiAgICBfY2hhck9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICBfdHlwZVZhcmlhYmxlcyA9IHR5cGVWYXJpYWJsZXM7CiAgfQoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgdGhpcyBidWlsZGVyIGlzIHByZXBhcmluZyBmb3IgYW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIHdpdGgKICAvLy8gdGhlIGdpdmVuIFtuYW1lXSBhbmQgW3R5cGVWYXJpYWJsZXNdIGxvY2F0ZWQgW2NoYXJPZmZzZXRdLgogIHZvaWQgbWFya0FzRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzKSB7CiAgICBhc3NlcnQoX2tpbmQgPT0gVHlwZVBhcmFtZXRlclNjb3BlS2luZC5leHRlbnNpb25EZWNsYXJhdGlvbiwKICAgICAgICAiVW5leHBlY3RlZCBkZWNsYXJhdGlvbiBraW5kOiAkX2tpbmQiKTsKICAgIF9uYW1lID0gbmFtZTsKICAgIF9jaGFyT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIF90eXBlVmFyaWFibGVzID0gdHlwZVZhcmlhYmxlczsKICB9CgogIC8vLyBSZWdpc3RlcnMgdGhlICdleHRlbnNpb24gdGhpcyB0eXBlJyBvZiB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIHByZXBhcmVkCiAgLy8vIGZvciBieSB0aGlzIGJ1aWxkZXIuCiAgLy8vCiAgLy8vIFNlZSBbZXh0ZW5zaW9uVGhpc1R5cGVdIGZvciB0ZXJtaW5vbG9neS4KICB2b2lkIHJlZ2lzdGVyRXh0ZW5zaW9uVGhpc1R5cGUoVHlwZUJ1aWxkZXIgdHlwZSkgewogICAgYXNzZXJ0KF9raW5kID09IFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZXh0ZW5zaW9uRGVjbGFyYXRpb24sCiAgICAgICAgIkRlY2xhcmF0aW9uQnVpbGRlci5yZWdpc3RlckV4dGVuc2lvblRoaXNUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgJF9raW5kIik7CiAgICBhc3NlcnQoX2V4dGVuc2lvblRoaXNUeXBlID09IG51bGwsCiAgICAgICAgIkV4dGVuc2lvbiB0aGlzIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBzZXQuIik7CiAgICBfZXh0ZW5zaW9uVGhpc1R5cGUgPSB0eXBlOwogIH0KCiAgLy8vIFJldHVybnMgd2hhdCBraW5kIG9mIGRlY2xhcmF0aW9uIHRoaXMgW1R5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXJdIGlzCiAgLy8vIHByZXBhcmluZyBmb3IuCiAgLy8vCiAgLy8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdHJhbnNpZW50IGZvciBzb21lIGRlY2xhcmF0aW9ucy4gSW4gcGFydGljdWxhcgogIC8vLyBjbGFzc2VzIGFuZCBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbnMgYXJlIGluaXRpYWxseSBjcmVhdGVkIHdpdGggdGhlIGtpbmQKICAvLy8gW1R5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbl0gYmVmb3JlIGEgY2FsbCB0bwogIC8vLyBlaXRoZXIgW21hcmtBc0NsYXNzRGVjbGFyYXRpb25dIG9yIFttYXJrQXNOYW1lZE1peGluQXBwbGljYXRpb25dIHNldHMgdGhlCiAgLy8vIHZhbHVlIHRvIGl0cyBhY3R1YWwga2luZC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBBdm9pZCB0aGUgdHJhbnNpdGlvbiBjdXJyZW50bHkgdXNlZCBvbiBtaXhpbgogIC8vIGRlY2xhcmF0aW9ucy4KICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kIGdldCBraW5kID0+IF9raW5kOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gX25hbWU7CgogIGludCBnZXQgY2hhck9mZnNldCA9PiBfY2hhck9mZnNldDsKCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBnZXQgdHlwZVZhcmlhYmxlcyA9PiBfdHlwZVZhcmlhYmxlczsKCiAgLy8vIFJldHVybnMgdGhlICdleHRlbnNpb24gdGhpcyB0eXBlJyBvZiB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIHByZXBhcmVkCiAgLy8vIGZvciBieSB0aGlzIGJ1aWxkZXIuCiAgLy8vCiAgLy8vIFRoZSAnZXh0ZW5zaW9uIHRoaXMgdHlwZScgaXMgdGhlIHR5cGUgbWVudGlvbmVkIGluIHRoZSBvbi1jbGF1c2Ugb2YgdGhlCiAgLy8vIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi4gRm9yIGluc3RhbmNlIGBCYCBpbiB0aGlzIGV4dGVuc2lvbiBkZWNsYXJhdGlvbjoKICAvLy8KICAvLy8gICAgIGV4dGVuc2lvbiBBIG9uIEIgewogIC8vLyAgICAgICBCIG1ldGhvZCgpID0+IHRoaXM7CiAgLy8vICAgICB9CiAgLy8vCiAgLy8vIFRoZSAnZXh0ZW5zaW9uIHRoaXMgdHlwZScgaXMgdGhlIHR5cGUgaWYgYHRoaXNgIGV4cHJlc3Npb24gaW4gaW5zdGFuY2UKICAvLy8gbWV0aG9kcyBkZWNsYXJlZCBpbiBleHRlbnNpb24gZGVjbGFyYXRpb25zLgogIFR5cGVCdWlsZGVyIGdldCBleHRlbnNpb25UaGlzVHlwZSB7CiAgICBhc3NlcnQoa2luZCA9PSBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmV4dGVuc2lvbkRlY2xhcmF0aW9uLAogICAgICAgICJEZWNsYXJhdGlvbkJ1aWxkZXIuZXh0ZW5zaW9uVGhpc1R5cGUgbm90IHN1cHBvcnRlZCBvbiAka2luZC4iKTsKICAgIGFzc2VydChfZXh0ZW5zaW9uVGhpc1R5cGUgIT0gbnVsbCwKICAgICAgICAiRGVjbGFyYXRpb25CdWlsZGVyLmV4dGVuc2lvblRoaXNUeXBlIGhhcyBub3QgYmVlbiBzZXQgb24gJHRoaXMuIik7CiAgICByZXR1cm4gX2V4dGVuc2lvblRoaXNUeXBlOwogIH0KCiAgLy8vIEFkZHMgdGhlIHlldCB1bnJlc29sdmVkIFt0eXBlXSB0byB0aGlzIHNjb3BlIGJ1aWxkZXIuCiAgLy8vCiAgLy8vIFVucmVzb2x2ZWQgdHlwZSB3aWxsIGJlIHJlc29sdmVkIHRocm91Z2ggW3Jlc29sdmVUeXBlc10gd2hlbiB0aGUgc2NvcGUKICAvLy8gaXMgZnVsbHkgYnVpbHQuIFRoaXMgYWxsb3dzIGZvciByZXNvbHZpbmcgc2VsZi1yZWZlcmVuY2luZyB0eXBlcywgbGlrZQogIC8vLyB0eXBlIHBhcmFtZXRlciB1c2VkIGluIHRoZWlyIG93biBib3VuZCwgZm9yIGluc3RhbmNlIGA8VCBleHRlbmRzIEE8VD4+YC4KICB2b2lkIGFkZFR5cGUoVW5yZXNvbHZlZFR5cGUgdHlwZSkgewogICAgdHlwZXMuYWRkKHR5cGUpOwogIH0KCiAgLy8vIFJlc29sdmVzIHR5cGUgdmFyaWFibGVzIGluIFt0eXBlc10gYW5kIHByb3BhZ2F0ZSBvdGhlciB0eXBlcyB0byBbcGFyZW50XS4KICB2b2lkIHJlc29sdmVUeXBlcygKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLCBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPiBtYXA7CiAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIG1hcCA9IDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+e307CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciBidWlsZGVyIGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBtYXBbYnVpbGRlci5uYW1lXSA9IGJ1aWxkZXI7CiAgICAgIH0KICAgIH0KICAgIFNjb3BlIHNjb3BlOwogICAgZm9yIChVbnJlc29sdmVkVHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIE9iamVjdCBuYW1lT3JRdWFsaWZpZWQgPSB0eXBlLmJ1aWxkZXIubmFtZTsKICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lT3JRdWFsaWZpZWQgaXMgUXVhbGlmaWVkTmFtZQogICAgICAgICAgPyBuYW1lT3JRdWFsaWZpZWQucXVhbGlmaWVyCiAgICAgICAgICA6IG5hbWVPclF1YWxpZmllZDsKICAgICAgQnVpbGRlciBkZWNsYXJhdGlvbjsKICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgIGlmIChtZW1iZXJzICE9IG51bGwpIHsKICAgICAgICAgIGRlY2xhcmF0aW9uID0gbWVtYmVyc1tuYW1lXTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uID09IG51bGwgJiYgbWFwICE9IG51bGwpIHsKICAgICAgICAgIGRlY2xhcmF0aW9uID0gbWFwW25hbWVdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICAgIC8vIFNpbmNlIG5hbWUgZGlkbid0IHJlc29sdmUgaW4gdGhpcyBzY29wZSwgcHJvcGFnYXRlIGl0IHRvIHRoZQogICAgICAgIC8vIHBhcmVudCBkZWNsYXJhdGlvbi4KICAgICAgICBwYXJlbnQuYWRkVHlwZSh0eXBlKTsKICAgICAgfSBlbHNlIGlmIChuYW1lT3JRdWFsaWZpZWQgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgYnVpbGRlciA9IHR5cGUuYnVpbGRlcjsKICAgICAgICAvLyBBdHRlbXB0IHRvIHVzZSBhIG1lbWJlciBvciB0eXBlIHZhcmlhYmxlIGFzIGEgcHJlZml4LgogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgZmxhdHRlbk5hbWUoCiAgICAgICAgICAgICAgICBuYW1lT3JRdWFsaWZpZWQucXVhbGlmaWVyLCB0eXBlLmNoYXJPZmZzZXQsIHR5cGUuZmlsZVVyaSksCiAgICAgICAgICAgIG5hbWVPclF1YWxpZmllZC5uYW1lKTsKICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgdHlwZS5jaGFyT2Zmc2V0LAogICAgICAgICAgICBuYW1lT3JRdWFsaWZpZWQuZW5kQ2hhck9mZnNldCAtIHR5cGUuY2hhck9mZnNldCwgdHlwZS5maWxlVXJpKTsKICAgICAgICBidWlsZGVyLmJpbmQoYnVpbGRlci5idWlsZEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICAgICAgICBtZXNzYWdlLndpdGhMb2NhdGlvbih0eXBlLmZpbGVVcmksIHR5cGUuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIG5hbWVPclF1YWxpZmllZC5lbmRDaGFyT2Zmc2V0IC0gdHlwZS5jaGFyT2Zmc2V0KSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHNjb3BlID8/PSB0b1Njb3BlKG51bGwpLndpdGhUeXBlVmFyaWFibGVzKHR5cGVWYXJpYWJsZXMpOwogICAgICAgIHR5cGUucmVzb2x2ZUluKHNjb3BlLCBsaWJyYXJ5KTsKICAgICAgfQogICAgfQogICAgdHlwZXMuY2xlYXIoKTsKICB9CgogIFNjb3BlIHRvU2NvcGUoU2NvcGUgcGFyZW50KSB7CiAgICByZXR1cm4gbmV3IFNjb3BlKAogICAgICAgIGxvY2FsOiBtZW1iZXJzLAogICAgICAgIHNldHRlcnM6IHNldHRlcnMsCiAgICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucywKICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICBkZWJ1Z05hbWU6IG5hbWUsCiAgICAgICAgaXNNb2RpZmlhYmxlOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRGVjbGFyYXRpb25CdWlsZGVyKCR7aGFzaENvZGV9OmtpbmQ9JGtpbmQsbmFtZT0kbmFtZSknOwp9CgpjbGFzcyBGaWVsZEluZm8gewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwogIGZpbmFsIFRva2VuIGluaXRpYWxpemVyVG9rZW47CiAgZmluYWwgVG9rZW4gYmVmb3JlTGFzdDsKICBmaW5hbCBpbnQgY2hhckVuZE9mZnNldDsKCiAgY29uc3QgRmllbGRJbmZvKHRoaXMubmFtZSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmluaXRpYWxpemVyVG9rZW4sCiAgICAgIHRoaXMuYmVmb3JlTGFzdCwgdGhpcy5jaGFyRW5kT2Zmc2V0KTsKfQoKY2xhc3MgSW1wbGVtZW50YXRpb25JbmZvIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBCdWlsZGVyIGRlY2xhcmF0aW9uOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBjb25zdCBJbXBsZW1lbnRhdGlvbkluZm8odGhpcy5uYW1lLCB0aGlzLmRlY2xhcmF0aW9uLCB0aGlzLmNoYXJPZmZzZXQpOwp9CgpVcmkgY29tcHV0ZUxpYnJhcnlVcmkoQnVpbGRlciBkZWNsYXJhdGlvbikgewogIEJ1aWxkZXIgY3VycmVudCA9IGRlY2xhcmF0aW9uOwogIGRvIHsKICAgIGlmIChjdXJyZW50IGlzIExpYnJhcnlCdWlsZGVyKSByZXR1cm4gY3VycmVudC5pbXBvcnRVcmk7CiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CiAgfSB3aGlsZSAoY3VycmVudCAhPSBudWxsKTsKICByZXR1cm4gdW5oYW5kbGVkKCJubyBsaWJyYXJ5IHBhcmVudCIsICIke2RlY2xhcmF0aW9uLnJ1bnRpbWVUeXBlfSIsCiAgICAgIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIGRlY2xhcmF0aW9uLmZpbGVVcmkpOwp9CgpTdHJpbmcgZXh0cmFjdE5hbWUobmFtZSkgPT4gbmFtZSBpcyBRdWFsaWZpZWROYW1lID8gbmFtZS5uYW1lIDogbmFtZTsKCmNsYXNzIFBvc3Rwb25lZFByb2JsZW0gewogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKICBmaW5hbCBpbnQgbGVuZ3RoOwogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBQb3N0cG9uZWRQcm9ibGVtKHRoaXMubWVzc2FnZSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmxlbmd0aCwgdGhpcy5maWxlVXJpKTsKfQoKY2xhc3MgTGFuZ3VhZ2VWZXJzaW9uIHsKICBmaW5hbCBpbnQgbWFqb3I7CiAgZmluYWwgaW50IG1pbm9yOwogIGZpbmFsIFVyaSBmaWxlVXJpOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwogIGZpbmFsIGludCBjaGFyQ291bnQ7CiAgZmluYWwgYm9vbCBpc0V4cGxpY2l0OwoKICBMYW5ndWFnZVZlcnNpb24odGhpcy5tYWpvciwgdGhpcy5taW5vciwgdGhpcy5maWxlVXJpLCB0aGlzLmNoYXJPZmZzZXQsCiAgICAgIHRoaXMuY2hhckNvdW50LCB0aGlzLmlzRXhwbGljaXQpOwoKICBpbnQgZ2V0IGhhc2hDb2RlID0+CiAgICAgIG1ham9yLmhhc2hDb2RlICogMTMgKyBtaW5vci5oYXNoQ29kZSAqIDE3ICsgaXNFeHBsaWNpdC5oYXNoQ29kZSAqIDE5OwoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG90aGVyIGlzIExhbmd1YWdlVmVyc2lvbiAmJgogICAgICAgIG1ham9yID09IG90aGVyLm1ham9yICYmCiAgICAgICAgbWlub3IgPT0gb3RoZXIubWlub3IgJiYKICAgICAgICBpc0V4cGxpY2l0ID09IG90aGVyLmlzRXhwbGljaXQ7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gJ0xhbmd1YWdlVmVyc2lvbihtYWpvcj0kbWFqb3IsbWlub3I9JG1pbm9yLGlzRXhwbGljaXQ9JGlzRXhwbGljaXQsJwogICAgICAgICdmaWxlVXJpPSRmaWxlVXJpLGNoYXJPZmZzZXQ9JGNoYXJPZmZzZXQsY2hhckNvdW50PSRjaGFyQ291bnQpJzsKICB9Cn0KCmNsYXNzIEltcGxpY2l0TGFuZ3VhZ2VWZXJzaW9uIGltcGxlbWVudHMgTGFuZ3VhZ2VWZXJzaW9uIHsKICBjb25zdCBJbXBsaWNpdExhbmd1YWdlVmVyc2lvbigpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG1ham9yID0+IExpYnJhcnkuZGVmYXVsdExhbmd1YWdlVmVyc2lvbk1ham9yOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IG1pbm9yID0+IExpYnJh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c3luYycgc2hvdyBGdXR1cmU7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBqc29uRW5jb2RlOwoKaW1wb3J0ICdkYXJ0OmlvJwogICAgc2hvdyBDb250ZW50VHlwZSwgSHR0cENsaWVudCwgSHR0cENsaWVudFJlcXVlc3QsIFNvY2tldEV4Y2VwdGlvbiwgc3RkZXJyOwoKaW1wb3J0ICdwcm9ibGVtcy5kYXJ0JyBzaG93IERlYnVnQWJvcnQ7Cgpjb25zdCBTdHJpbmcgZGVmYXVsdFNlcnZlckFkZHJlc3MgPSAiaHR0cDovLzEyNy4wLjAuMTo1OTQxMC8iOwoKLy8vIFRyYWNrcyBpZiB0aGVyZSBoYXMgYmVlbiBhIGNyYXNoIHJlcG9ydGVkIHRocm91Z2ggW3JlcG9ydENyYXNoXS4gU2hvdWxkIGJlCi8vLyByZXNldCBiZXR3ZWVuIGVhY2ggY29tcGlsYXRpb24gYnkgY2FsbGluZyBbcmVzZXRDcmFzaFJlcG9ydGluZ10uCmJvb2wgaGFzQ3Jhc2hlZCA9IGZhbHNlOwoKLy8vIFRyYWNrcyB0aGUgZmlyc3Qgc291cmNlIFVSSSB0aGF0IGhhcyBiZWVuIHJlYWQgYW5kIGlzIHVzZWQgYXMgYSBmYWxsLWJhY2sKLy8vIGZvciBbcmVwb3J0Q3Jhc2hdLiBTaG91bGQgYmUgcmVzZXQgYmV0d2VlbiBlYWNoIGNvbXBpbGF0aW9uIGJ5IGNhbGxpbmcKLy8vIFtyZXNldENyYXNoUmVwb3J0aW5nXS4KVXJpIGZpcnN0U291cmNlVXJpOwoKY2xhc3MgQ3Jhc2ggewogIGZpbmFsIFVyaSB1cmk7CgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBPYmplY3QgZXJyb3I7CgogIGZpbmFsIFN0YWNrVHJhY2UgdHJhY2U7CgogIENyYXNoKHRoaXMudXJpLCB0aGlzLmNoYXJPZmZzZXQsIHRoaXMuZXJyb3IsIHRoaXMudHJhY2UpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIiIiCkNyYXNoIHdoZW4gY29tcGlsaW5nICR1cmksCmF0IGNoYXJhY3RlciBvZmZzZXQgJGNoYXJPZmZzZXQ6CiRlcnJvciR7dHJhY2UgPT0gbnVsbCA/ICcnIDogJ1xuJHRyYWNlJ30KIiIiOwogIH0KfQoKdm9pZCByZXNldENyYXNoUmVwb3J0aW5nKCkgewogIGZpcnN0U291cmNlVXJpID0gbnVsbDsKICBoYXNDcmFzaGVkID0gZmFsc2U7Cn0KCkZ1dHVyZTxUPiByZXBvcnRDcmFzaDxUPihlcnJvciwgU3RhY2tUcmFjZSB0cmFjZSwKICAgIFtVcmkgdXJpLCBpbnQgY2hhck9mZnNldF0pIGFzeW5jIHsKICBub3RlKFN0cmluZyBub3RlKSBhc3luYyB7CiAgICBzdGRlcnIud3JpdGUobm90ZSk7CiAgICBhd2FpdCBzdGRlcnIuZmx1c2goKTsKICB9CgogIGlmIChoYXNDcmFzaGVkKSByZXR1cm4gbmV3IEZ1dHVyZTxUPi5lcnJvcihlcnJvciwgdHJhY2UpOwogIGlmIChlcnJvciBpcyBDcmFzaCkgewogICAgdHJhY2UgPSBlcnJvci50cmFjZSA/PyB0cmFjZTsKICAgIHVyaSA9IGVycm9yLnVyaSA/PyB1cmk7CiAgICBjaGFyT2Zmc2V0ID0gZXJyb3IuY2hhck9mZnNldCA/PyBjaGFyT2Zmc2V0OwogICAgZXJyb3IgPSBlcnJvci5lcnJvcjsKICB9CiAgdXJpID8/PSBmaXJzdFNvdXJjZVVyaTsKICBoYXNDcmFzaGVkID0gdHJ1ZTsKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBkYXRhID0gPFN0cmluZywgZHluYW1pYz57fTsKICBkYXRhWyJ0eXBlIl0gPSAiY3Jhc2giOwogIGRhdGFbImNsaWVudCJdID0gInBhY2thZ2U6ZmFzdGEiOwogIGlmICh1cmkgIT0gbnVsbCkgZGF0YVsidXJpIl0gPSAiJHVyaSI7CiAgaWYgKGNoYXJPZmZzZXQgIT0gbnVsbCkgZGF0YVsib2Zmc2V0Il0gPSBjaGFyT2Zmc2V0OwogIGRhdGFbImVycm9yIl0gPSBzYWZlVG9TdHJpbmcoZXJyb3IpOwogIGRhdGFbInRyYWNlIl0gPSAiJHRyYWNlIjsKICBTdHJpbmcganNvbiA9IGpzb25FbmNvZGUoZGF0YSk7CiAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwogIHRyeSB7CiAgICBVcmkgc2VydmVyVXJpID0gVXJpLnBhcnNlKGRlZmF1bHRTZXJ2ZXJBZGRyZXNzKTsKICAgIEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3Q7CiAgICB0cnkgewogICAgICByZXF1ZXN0ID0gYXdhaXQgY2xpZW50LnBvc3RVcmwoc2VydmVyVXJpKTsKICAgIH0gb24gU29ja2V0RXhjZXB0aW9uIHsKICAgICAgLy8gQXNzdW1lIHRoZSBjcmFzaCBsb2dnZXIgaXNuJ3QgcnVubmluZy4KICAgICAgY2xpZW50LmNsb3NlKGZvcmNlOiB0cnVlKTsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmU8VD4uZXJyb3IoCiAgICAgICAgICBuZXcgQ3Jhc2godXJpLCBjaGFyT2Zmc2V0LCBlcnJvciwgdHJhY2UpLCB0cmFjZSk7CiAgICB9CiAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7CiAgICAgIGF3YWl0IG5vdGUoIlxuU2VuZGluZyBjcmFzaCByZXBvcnQgZGF0YSIpOwogICAgICByZXF1ZXN0LnBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CiAgICAgIHJlcXVlc3QuYnVmZmVyT3V0cHV0ID0gZmFsc2U7CiAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdD8uY29ubmVjdGlvbkluZm8/LnJlbW90ZUFkZHJlc3M/Lmhvc3Q7CiAgICAgIGludCBwb3J0ID0gcmVxdWVzdD8uY29ubmVjdGlvbkluZm8/LnJlbW90ZVBvcnQ7CiAgICAgIGF3YWl0IG5vdGUoIiB0byAkaG9zdDokcG9ydCIpOwogICAgICBhd2FpdCByZXF1ZXN0CiAgICAgICAgLi5oZWFkZXJzLmNvbnRlbnRUeXBlID0gQ29udGVudFR5cGUuanNvbgogICAgICAgIC4ud3JpdGUoanNvbik7CiAgICAgIGF3YWl0IHJlcXVlc3QuY2xvc2UoKTsKICAgICAgYXdhaXQgbm90ZSgiLiIpOwogICAgfQogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIGF3YWl0IG5vdGUoIlxuJHtzYWZlVG9TdHJpbmcoZSl9XG4kc1xuIik7CiAgICBhd2FpdCBub3RlKCJcblxuXG5GRTo6RVJST1I6OiRqc29uXG5cblxuIik7CiAgfQogIGNsaWVudC5jbG9zZShmb3JjZTogdHJ1ZSk7CiAgYXdhaXQgbm90ZSgiXG4iKTsKICByZXR1cm4gbmV3IEZ1dHVyZTxUPi5lcnJvcihlcnJvciwgdHJhY2UpOwp9CgpTdHJpbmcgc2FmZVRvU3RyaW5nKE9iamVjdCBvYmplY3QpIHsKICB0cnkgewogICAgcmV0dXJuICIkb2JqZWN0IjsKICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gIkVycm9yIHdoZW4gY29udmVydGluZyAke29iamVjdC5ydW50aW1lVHlwZX0gdG8gc3RyaW5nLiI7CiAgfQp9CgpGdXR1cmU8VD4gd2l0aENyYXNoUmVwb3J0aW5nPFQ+KAogICAgRnV0dXJlPFQ+IEZ1bmN0aW9uKCkgYWN0aW9uLCBVcmkgRnVuY3Rpb24oKSBjdXJyZW50VXJpKSBhc3luYyB7CiAgcmVzZXRDcmFzaFJlcG9ydGluZygpOwogIHRyeSB7CiAgICByZXR1cm4gYXdhaXQgYWN0aW9uKCk7CiAgfSBvbiBDcmFzaCB7CiAgICByZXRocm93OwogIH0gb24gRGVidWdBYm9ydCB7CiAgICByZXRocm93OwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIHJldHVybiByZXBvcnRDcmFzaChlLCBzLCBjdXJyZW50VXJpKCkpOwogIH0KfQqAhABOTjwBFQEhAScBEU4BKAE/AU9FGQFOSxsUAQ4RARgBFgEaATwBFg8bISkFBAIBHRkWAgEyJxwYGgQBPBgiHDEZBBoVMxokKTcnHCIoCDUfCjEbMCEiPAYbMSwkQjYlFDEXHRcGEy4wBB0ULAIBJQgWEEUEAgEhRBkIGw8NFA0TLAQCASZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY3Jhc2guZGFydF5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FwaS5kYXJ0htYvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgbGlicmFyeSBleHBvcnRzIGFsbCBBUEkgZnJvbSBLZXJuZWwgdGhhdCBjYW4gYmUgdXNlZCB0aHJvdWdob3V0IGZhc3RhLgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9hcGk7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbiwgc3Vic3RpdHV0ZTsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgpleHBvcnQgJ3BhY2thZ2U6a2VybmVsL2Nsb25lLmRhcnQnIHNob3cgQ2xvbmVWaXNpdG9yTm90TWVtYmVyczsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnQnIHNob3cgVHJhbnNmb3JtZXJGbGFnOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC90ZXh0L2FzdF90b190ZXh0LmRhcnQnIHNob3cgTmFtZVN5c3RlbTsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFR5cGVFbnZpcm9ubWVudDsKCmV4cG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2JvdW5kc19jaGVja3MuZGFydCcgc2hvdyBpbnN0YW50aWF0ZVRvQm91bmRzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90ZXh0L2FzdF90b190ZXh0LmRhcnQnIHNob3cgTmFtZVN5c3RlbSwgUHJpbnRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgQ2xhc3MsIE1lbWJlciwgTm9kZTsKCnZvaWQgcHJpbnROb2RlT24oTm9kZSBub2RlLCBTdHJpbmdTaW5rIHNpbmssIHtOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzfSkgewogIGlmIChub2RlID09IG51bGwpIHsKICAgIHNpbmsud3JpdGUoIm51bGwiKTsKICB9IGVsc2UgewogICAgc3ludGhldGljTmFtZXMgPz89IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBuZXcgUHJpbnRlcihzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpLndyaXRlTm9kZShub2RlKTsKICB9Cn0KCnZvaWQgcHJpbnRRdWFsaWZpZWROYW1lT24oTWVtYmVyIG1lbWJlciwgU3RyaW5nU2luayBzaW5rLAogICAge05hbWVTeXN0ZW0gc3ludGhldGljTmFtZXN9KSB7CiAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICBzaW5rLndyaXRlKCJudWxsIik7CiAgfSBlbHNlIHsKICAgIHN5bnRoZXRpY05hbWVzID8/PSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZShtZW1iZXIuZW5jbG9zaW5nTGlicmFyeS5pbXBvcnRVcmkpOwogICAgc2luay53cml0ZSgiOjoiKTsKICAgIENsYXNzIGNscyA9IG1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgIGlmIChjbHMgIT0gbnVsbCkgewogICAgICBzaW5rLndyaXRlKGNscy5uYW1lID8/IHN5bnRoZXRpY05hbWVzLm5hbWVDbGFzcyhjbHMpKTsKICAgICAgc2luay53cml0ZSgiOjoiKTsKICAgIH0KICAgIHNpbmsud3JpdGUobWVtYmVyLm5hbWU/Lm5hbWUgPz8gc3ludGhldGljTmFtZXMubmFtZU1lbWJlcihtZW1iZXIpKTsKICB9Cn0KNgBOTjwBUBoBSQFCAUABOAFJAT8BRAFJAUgBOwFMFhgLKUcEAgE6IxgYCykzFicXPRgGSAQCATJwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9hcGkuZGFydFxmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdmVyaWZpZXIuZGFydJ55Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudmVyaWZpZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29tcG9uZW50LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQsCiAgICAgICAgRmllbGQsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmV2ZXJUeXBlLAogICAgICAgIE51bGxhYmlsaXR5LAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBTdXBlclByb3BlcnR5R2V0LAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL2ZsYWdzLmRhcnQnIHNob3cgVHJhbnNmb3JtZXJGbGFnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92ZXJpZmllci5kYXJ0JyBzaG93IFZlcmlmeWluZ1Zpc2l0b3I7CgppbXBvcnQgJy4uL2NvbXBpbGVyX2NvbnRleHQuZGFydCcgc2hvdyBDb21waWxlckNvbnRleHQ7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93IExvY2F0ZWRNZXNzYWdlLCBub0xlbmd0aCwgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZTsKCmltcG9ydCAncmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnCiAgICBzaG93IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHksIGdldFJlZGlyZWN0aW5nRmFjdG9yeUJvZHk7CgpMaXN0PExvY2F0ZWRNZXNzYWdlPiB2ZXJpZnlDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIHtib29sIGlzT3V0bGluZSwgYm9vbCBhZnRlckNvbnN0LCBib29sIHNraXBQbGF0Zm9ybTogZmFsc2V9KSB7CiAgRmFzdGFWZXJpZnlpbmdWaXNpdG9yIHZlcmlmaWVyID0KICAgICAgbmV3IEZhc3RhVmVyaWZ5aW5nVmlzaXRvcihpc091dGxpbmUsIGFmdGVyQ29uc3QsIHNraXBQbGF0Zm9ybSk7CiAgY29tcG9uZW50LmFjY2VwdCh2ZXJpZmllcik7CiAgcmV0dXJuIHZlcmlmaWVyLmVycm9yczsKfQoKY2xhc3MgRmFzdGFWZXJpZnlpbmdWaXNpdG9yIGV4dGVuZHMgVmVyaWZ5aW5nVmlzaXRvciB7CiAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gZXJyb3JzID0gPExvY2F0ZWRNZXNzYWdlPltdOwogIExpYnJhcnkgY3VycmVudExpYnJhcnkgPSBudWxsOwoKICBVcmkgZmlsZVVyaTsKICBmaW5hbCBib29sIHNraXBQbGF0Zm9ybTsKCiAgRmFzdGFWZXJpZnlpbmdWaXNpdG9yKGJvb2wgaXNPdXRsaW5lLCBib29sIGFmdGVyQ29uc3QsIHRoaXMuc2tpcFBsYXRmb3JtKQogICAgICA6IHN1cGVyKGlzT3V0bGluZTogaXNPdXRsaW5lLCBhZnRlckNvbnN0OiBhZnRlckNvbnN0KTsKCiAgVXJpIGNoZWNrTG9jYXRpb24oVHJlZU5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIFVyaSBmaWxlVXJpKSB7CiAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuY29udGFpbnMoIiMiKSkgewogICAgICAvLyBUT0RPKGFoZSk6IEludmVzdGlnYXRlIGlmIHRoZXNlIGNoZWNrcyBjYW4gYmUgZW5hYmxlZDoKICAgICAgLy8gaWYgKG5vZGUuZmlsZVVyaSAhPSBudWxsICYmIG5vZGUgaXMhIExpYnJhcnkpIHsKICAgICAgLy8gICBwcm9ibGVtKG5vZGUsICJBIHN5bnRoZXRpYyBub2RlIHNob3VsZG4ndCBoYXZlIGEgZmlsZVVyaSIsCiAgICAgIC8vICAgICAgIGNvbnRleHQ6IG5vZGUpOwogICAgICAvLyB9CiAgICAgIC8vIGlmIChub2RlLmZpbGVPZmZzZXQgIT0gLTEpIHsKICAgICAgLy8gICBwcm9ibGVtKG5vZGUsICJBIHN5bnRoZXRpYyBub2RlIHNob3VsZG4ndCBoYXZlIGEgZmlsZU9mZnNldCIsCiAgICAgIC8vICAgICAgIGNvbnRleHQ6IG5vZGUpOwogICAgICAvLyB9CiAgICAgIHJldHVybiBmaWxlVXJpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGZpbGVVcmkgPT0gbnVsbCkgewogICAgICAgIHByb2JsZW0obm9kZSwgIickbmFtZScgaGFzIG5vIGZpbGVVcmkiLCBjb250ZXh0OiBub2RlKTsKICAgICAgICByZXR1cm4gZmlsZVVyaTsKICAgICAgfQogICAgICBpZiAobm9kZS5maWxlT2Zmc2V0ID09IC0xICYmIG5vZGUgaXMhIExpYnJhcnkpIHsKICAgICAgICBwcm9ibGVtKG5vZGUsICInJG5hbWUnIGhhcyBubyBmaWxlT2Zmc2V0IiwgY29udGV4dDogbm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZpbGVVcmk7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrU3VwZXJJbnZvY2F0aW9uKFRyZWVOb2RlIG5vZGUpIHsKICAgIE1lbWJlciBjb250YWluaW5nTWVtYmVyID0gZ2V0Q29udGFpbmluZ01lbWJlcihub2RlKTsKICAgIGlmIChjb250YWluaW5nTWVtYmVyID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAnU3VwZXIgY2FsbCBvdXRzaWRlIG9mIGFueSBtZW1iZXInKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjb250YWluaW5nTWVtYmVyLnRyYW5zZm9ybWVyRmxhZ3MgJiBUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscyA9PSAwKSB7CiAgICAgICAgcHJvYmxlbSgKICAgICAgICAgICAgbm9kZSwgJ1N1cGVyIGNhbGwgaW4gYSBtZW1iZXIgbGFja2luZyBUcmFuc2Zvcm1lckZsYWcuc3VwZXJDYWxscycpOwogICAgICB9CiAgICB9CiAgfQoKICBNZW1iZXIgZ2V0Q29udGFpbmluZ01lbWJlcihUcmVlTm9kZSBub2RlKSB7CiAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CiAgICAgIGlmIChub2RlIGlzIE1lbWJlcikgcmV0dXJuIG5vZGU7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgcHJvYmxlbShUcmVlTm9kZSBub2RlLCBTdHJpbmcgZGV0YWlscywge1RyZWVOb2RlIGNvbnRleHR9KSB7CiAgICBub2RlID8/PSAoY29udGV4dCA/PyB0aGlzLmNvbnRleHQpOwogICAgaW50IG9mZnNldCA9IG5vZGU/LmZpbGVPZmZzZXQgPz8gLTE7CiAgICBVcmkgZmlsZSA9IG5vZGU/LmxvY2F0aW9uPy5maWxlID8/IGZpbGVVcmk7CiAgICBVcmkgdXJpID0gZmlsZSA9PSBudWxsID8gbnVsbCA6IGZpbGU7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvcgogICAgICAgIC53aXRoQXJndW1lbnRzKGRldGFpbHMpCiAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIG9mZnNldCwgbm9MZW5ndGgpOwogICAgQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQucmVwb3J0KG1lc3NhZ2UsIFNldmVyaXR5LmVycm9yKTsKICAgIGVycm9ycy5hZGQobWVzc2FnZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gbm9kZSkgewogICAgc3VwZXIudmlzaXRBc0V4cHJlc3Npb24obm9kZSk7CiAgICBpZiAobm9kZS5maWxlT2Zmc2V0ID09IC0xKSB7CiAgICAgIFRyZWVOb2RlIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKICAgICAgICBpZiAocGFyZW50LmZpbGVPZmZzZXQgIT0gLTEpIGJyZWFrOwogICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgIH0KICAgICAgcHJvYmxlbShwYXJlbnQsICJObyBvZmZzZXQgZm9yICRub2RlIiwgY29udGV4dDogbm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7CiAgICAvLyBCeXBhc3MgdmVyaWZpY2F0aW9uIG9mIHRoZSBbU3RhdGljR2V0XSBpbiBbUmVkaXJlY3RpbmdGYWN0b3J5Qm9keV0gYXMKICAgIC8vIHRoaXMgaXMgYSBzdGF0aWMgZ2V0IHdpdGhvdXQgYSBnZXR0ZXIuCiAgICBpZiAobm9kZSBpcyEgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSkgewogICAgICBzdXBlci52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdExpYnJhcnkoTGlicmFyeSBub2RlKSB7CiAgICAvLyBJc3N1ZShodHRwOi8vZGFydGJ1Zy5jb20vMzI1MzApCiAgICBpZiAoc2tpcFBsYXRmb3JtICYmIG5vZGUuaW1wb3J0VXJpLnNjaGVtZSA9PSAnZGFydCcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZmlsZVVyaSA9IGNoZWNrTG9jYXRpb24obm9kZSwgbm9kZS5uYW1lLCBub2RlLmZpbGVVcmkpOwogICAgY3VycmVudExpYnJhcnkgPSBub2RlOwogICAgc3VwZXIudmlzaXRMaWJyYXJ5KG5vZGUpOwogICAgY3VycmVudExpYnJhcnkgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBmaWxlVXJpID0gY2hlY2tMb2NhdGlvbihub2RlLCBub2RlLm5hbWUsIG5vZGUuZmlsZVVyaSk7CiAgICBzdXBlci52aXNpdENsYXNzKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBmaWxlVXJpID0gY2hlY2tMb2NhdGlvbihub2RlLCBub2RlLm5hbWUubmFtZSwgbm9kZS5maWxlVXJpKTsKICAgIHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFByb2NlZHVyZShQcm9jZWR1cmUgbm9kZSkgewogICAgZmlsZVVyaSA9IGNoZWNrTG9jYXRpb24obm9kZSwgbm9kZS5uYW1lLm5hbWUsIG5vZGUuZmlsZVVyaSk7CiAgICBzdXBlci52aXNpdFByb2NlZHVyZShub2RlKTsKICB9CgogIGJvb2wgaXNOdWxsVHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIFVyaSBpbXBvcnRVcmkgPSBub2RlLmNsYXNzTm9kZS5lbmNsb3NpbmdMaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgcmV0dXJuIG5vZGUuY2xhc3NOb2RlLm5hbWUgPT0gIk51bGwiICYmCiAgICAgICAgICBpbXBvcnRVcmkuc2NoZW1lID09ICJkYXJ0IiAmJgogICAgICAgICAgaW1wb3J0VXJpLnBhdGggPT0gImNvcmUiOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpIHsKICAgIGlmIChub2RlIGlzIFVua25vd25UeXBlKSB7CiAgICAgIC8vIE5vdGU6IHdlIGNhbid0IHBhc3MgW25vZGVdIHRvIFtwcm9ibGVtXSBiZWNhdXNlIGl0J3Mgbm90IGEgW1RyZWVOb2RlXS4KICAgICAgcHJvYmxlbShudWxsLCAiVW5leHBlY3RlZCBhcHBlYXJhbmNlIG9mIHRoZSB1bmtub3duIHR5cGUuIik7CiAgICB9CiAgICBib29sIG5ldmVyTGVnYWN5ID0gaXNOdWxsVHlwZShub2RlKSB8fAogICAgICAgIG5vZGUgaXMgRHluYW1pY1R5cGUgfHwKICAgICAgICBub2RlIGlzIEludmFsaWRUeXBlIHx8CiAgICAgICAgbm9kZSBpcyBWb2lkVHlwZSB8fAogICAgICAgIG5vZGUgaXMgTmV2ZXJUeXBlIHx8CiAgICAgICAgbm9kZSBpcyBCb3R0b21UeXBlOwogICAgYm9vbCBleHBlY3RlZExlZ2FjeSA9CiAgICAgICAgIWN1cnJlbnRMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgIW5ldmVyTGVnYWN5OwogICAgaWYgKGV4cGVjdGVkTGVnYWN5ICYmIG5vZGUubnVsbGFiaWxpdHkgIT0gTnVsbGFiaWxpdHkubGVnYWN5KSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBudWxsLCAiRm91bmQgYSBub24tbGVnYWN5IHR5cGUgJyR7bm9kZX0nIGluIGFuIG9wdGVkLW91dCBsaWJyYXJ5LiIpOwogICAgfQogICAgTnVsbGFiaWxpdHkgbm9kZU51bGxhYmlsaXR5ID0KICAgICAgICBub2RlIGlzIEludmFsaWRUeXBlID8gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkIDogbm9kZS5udWxsYWJpbGl0eTsKICAgIGlmIChjdXJyZW50TGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmCiAgICAgICAgbm9kZU51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgewogICAgICBwcm9ibGVtKG51bGwsICJGb3VuZCBhIGxlZ2FjeSB0eXBlICcke25vZGV9JyBpbiBhbiBvcHRlZC1pbiBsaWJyYXJ5LiIpOwogICAgfQogICAgc3VwZXIuZGVmYXVsdERhcnRUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUpIHsKICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICAgIGlmICh0eXBlUGFyYW1ldGVyLnBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICBwcm9ibGVtKAogICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgIlR5cGUgcGFyYW1ldGVycyBvZiBmdW5jdGlvbiB0eXBlcyBzaG91bGRuJ3QgaGF2ZSBwYXJlbnRzOiAiCiAgICAgICAgICAgICAgIiRub2RlLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc3VwZXIudmlzaXRGdW5jdGlvblR5cGUobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBpZiAoaXNOdWxsVHlwZShub2RlKSAmJiBub2RlLm51bGxhYmlsaXR5ICE9IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgIHByb2JsZW0obnVsbCwgIkZvdW5kIGEgbm90IG51bGxhYmxlIE51bGwgdHlwZTogJHtub2RlfSIpOwogICAgfQogICAgc3VwZXIudmlzaXRJbnRlcmZhY2VUeXBlKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrU3VwZXJJbnZvY2F0aW9uKG5vZGUpOwogICAgc3VwZXIudmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN1cGVyUHJvcGVydHlHZXQoU3VwZXJQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBjaGVja1N1cGVySW52b2NhdGlvbihub2RlKTsKICAgIHN1cGVyLnZpc2l0U3VwZXJQcm9wZXJ0eUdldChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIGNoZWNrU3VwZXJJbnZvY2F0aW9uKG5vZGUpOwogICAgc3VwZXIudmlzaXRTdXBlclByb3BlcnR5U2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgc3VwZXIudmlzaXRTdGF0aWNJbnZvY2F0aW9uKG5vZGUpOwogICAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBib2R5ID0gZ2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShub2RlLnRhcmdldCk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkF0dGVtcHQgdG8gaW52b2tlIHJlZGlyZWN0aW5nIGZhY3RvcnkuIik7CiAgICB9CiAgfQp9CoEIAE5OPAEYAU8BIQkWFA8TEhUdDxYXFREQExUTGh8aGhIXEgFJAT0BOAEdTQE+ASc8ATpDI0YeGgIBNzohAQ8bAUw9AT8uQDlGHwsmSR8LFg0dQBgIN0MIFgYEAS05JDkNURFQCAYEAS4bJxoGEQQBDD8oKTAqRiAuPRkEAQwpIyElHywgCD0GBAEMN00uKywGBAEMHyc7DgY8Gx4bBAEMGzwcBAEMG0EcBAEMI0EgBAEjIUEuKCQGEgQBDCMfUEMGKx8fHB0cGkBED08GIksxMU4GIQQBDCkqQSwTFEsZCggGIwQBDCtIQAYkBAEMOyAsBAEMMSAnBAEMMSAnBAEMMSdKGD8GBAIBMHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdmVyaWZpZXIuZGFydFNmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9sb2FkZXIuZGFydLMCLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubG9hZGVyOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAnZGFydDpjb2xsZWN0aW9uJyBzaG93IFF1ZXVlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IENsYXNzLCBEYXJ0VHlwZSwgTGlicmFyeTsKCmltcG9ydCAnc2NvcGUuZGFydCc7CgppbXBvcnQgJ2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdidWlsZGVyL2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdidWlsZGVyL21vZGlmaWVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJ2NyYXNoLmRhcnQnIHNob3cgZmlyc3RTb3VyY2VVcmk7CgppbXBvcnQgJ2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAnbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JtYXR0ZWRNZXNzYWdlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgU3VtbWFyeVRlbXBsYXRlLAogICAgICAgIFRlbXBsYXRlLAogICAgICAgIG1lc3NhZ2VQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtQ29udGV4dFNldmVyaXR5LAogICAgICAgIHRlbXBsYXRlU291cmNlQm9keVN1bW1hcnk7CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgaW50ZXJuYWxQcm9ibGVtLCB1bmhhbmRsZWQ7CgppbXBvcnQgJ3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0JyBzaG93IFRhcmdldEltcGxlbWVudGF0aW9uOwoKaW1wb3J0ICd0aWNrZXIuZGFydCcgc2hvdyBUaWNrZXI7Cgpjb25zdCBTdHJpbmcgdW50cmFuc2xhdGFibGVVcmlTY2hlbWUgPSAib3JnLWRhcnRsYW5nLXVudHJhbnNsYXRhYmxlLXVyaSI7CgphYnN0cmFjdCBjbGFzcyBMb2FkZXIgewogIGZpbmFsIE1hcDxVcmksIExpYnJhcnlCdWlsZGVyPiBidWlsZGVycyA9IDxVcmksIExpYnJhcnlCdWlsZGVyPnt9OwoKICBmaW5hbCBRdWV1ZTxMaWJyYXJ5QnVpbGRlcj4gdW5wYXJzZWRMaWJyYXJpZXMgPSBuZXcgUXVldWU8TGlicmFyeUJ1aWxkZXI+KCk7CgogIGZpbmFsIExpc3Q8TGlicmFyeT4gbGlicmFyaWVzID0gPExpYnJhcnk+W107CgogIGZpbmFsIFRhcmdldEltcGxlbWVudGF0aW9uIHRhcmdldDsKCiAgLy8vIExpc3Qgb2YgYWxsIGhhbmRsZWQgY29tcGlsZS10aW1lIGVycm9ycyBzZWVuIHNvIGZhciBieSBsaWJyYXJpZXMgbG9hZGVkCiAgLy8vIGJ5IHRoaXMgbG9hZGVyLgogIC8vLwogIC8vLyBBIGhhbmRsZWQgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIEFTVAogIC8vLyBhbHJlYWR5LCBmb3IgZXhhbXBsZSwgYXMgYSB0aHJvdyBleHByZXNzaW9uLgogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGhhbmRsZWRFcnJvcnMgPSA8TG9jYXRlZE1lc3NhZ2U+W107CgogIC8vLyBMaXN0IG9mIGFsbCB1bmhhbmRsZWQgY29tcGlsZS10aW1lIGVycm9ycyBzZWVuIHNvIGZhciBieSBsaWJyYXJpZXMgbG9hZGVkCiAgLy8vIGJ5IHRoaXMgbG9hZGVyLgogIC8vLwogIC8vLyBBbiB1bmhhbmRsZWQgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBoYXNuJ3QgYmVlbiBoYW5kbGVkLCBzZWUKICAvLy8gW2hhbmRsZWRFcnJvcnNdLgogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IHVuaGFuZGxlZEVycm9ycyA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKCiAgLy8vIExpc3Qgb2YgYWxsIHByb2JsZW1zIHNlZW4gc28gZmFyIGJ5IGxpYnJhcmllcyBsb2FkZWQgYnkgdGhpcyBsb2FkZXIgdGhhdAogIC8vLyBkb2VzIG5vdCBiZWxvbmcgZGlyZWN0bHkgdG8gYSBsaWJyYXJ5LgogIGZpbmFsIExpc3Q8Rm9ybWF0dGVkTWVzc2FnZT4gYWxsQ29tcG9uZW50UHJvYmxlbXMgPSA8Rm9ybWF0dGVkTWVzc2FnZT5bXTsKCiAgZmluYWwgU2V0PFN0cmluZz4gc2Vlbk1lc3NhZ2VzID0gbmV3IFNldDxTdHJpbmc+KCk7CgogIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5OwoKICAvLy8gVGhlIGZpcnN0IGxpYnJhcnkgdGhhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGNvbXBpbGUuIFdoZW4gY29tcGlsaW5nIGEKICAvLy8gcHJvZ3JhbSAoYWthIHNjcmlwdCksIHRoaXMgaXMgdGhlIGxpYnJhcnkgdGhhdCBzaG91bGQgaGF2ZSBhIG1haW4gbWV0aG9kLgogIExpYnJhcnlCdWlsZGVyIGZpcnN0OwoKICBpbnQgYnl0ZUNvdW50ID0gMDsKCiAgVXJpIGN1cnJlbnRVcmlGb3JDcmFzaFJlcG9ydGluZzsKCiAgTG9hZGVyKHRoaXMudGFyZ2V0KTsKCiAgVGlja2VyIGdldCB0aWNrZXIgPT4gdGFyZ2V0LnRpY2tlcjsKCiAgVGVtcGxhdGU8U3VtbWFyeVRlbXBsYXRlPiBnZXQgb3V0bGluZVN1bW1hcnlUZW1wbGF0ZTsKCiAgYm9vbCBnZXQgaXNTb3VyY2VMb2FkZXIgPT4gZmFsc2U7CgogIC8vLyBMb29rIHVwIGEgbGlicmFyeSBidWlsZGVyIGJ5IHRoZSBuYW1lIFt1cmldLCBvciBpZiBzdWNoIGRvZXNuJ3QKICAvLy8gZXhpc3QsIGNyZWF0ZSBvbmUuIFRoZSBjYW5vbmljYWwgVVJJIG9mIHRoZSBsaWJyYXJ5IGlzIFt1cmldLCBhbmQgaXRzCiAgLy8vIGFjdHVhbCBsb2NhdGlvbiBpcyBbZmlsZVVyaV0uCiAgLy8vCiAgLy8vIENhbm9uaWNhbCBVUklzIGhhdmUgc2NoZW1lcyBsaWtlICJkYXJ0Iiwgb3IgInBhY2thZ2UiLCBhbmQgdGhlIGFjdHVhbAogIC8vLyBsb2NhdGlvbiBpcyBvZnRlbiBhIGZpbGUgVVJJLgogIC8vLwogIC8vLyBUaGUgW2FjY2Vzc29yXSBpcyB0aGUgbGlicmFyeSB0aGF0J3MgdHJ5aW5nIHRvIGltcG9ydCwgZXhwb3J0LCBvciBpbmNsdWRlCiAgLy8vIGFzIHBhcnQgW3VyaV0sIGFuZCBbY2hhck9mZnNldF0gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nCiAgLy8vIGRpcmVjdGl2ZS4gSWYgW2FjY2Vzc29yXSBpc24ndCBhbGxvd2VkIHRvIGFjY2VzcyBbdXJpXSwgaXQncyBhCiAgLy8vIGNvbXBpbGUtdGltZSBlcnJvci4KICBMaWJyYXJ5QnVpbGRlciByZWFkKFVyaSB1cmksIGludCBjaGFyT2Zmc2V0LAogICAgICB7VXJpIGZpbGVVcmksCiAgICAgIExpYnJhcnlCdWlsZGVyIGFjY2Vzc29yLAogICAgICBMaWJyYXJ5QnVpbGRlciBvcmlnaW4sCiAgICAgIExpYnJhcnkgcmVmZXJlbmNlc0Zyb20sCiAgICAgIGJvb2wgcmVmZXJlbmNlSXNQYXJ0T3duZXJ9KSB7CiAgICBMaWJyYXJ5QnVpbGRlciBidWlsZGVyID0gYnVpbGRlcnMucHV0SWZBYnNlbnQodXJpLCAoKSB7CiAgICAgIGlmIChmaWxlVXJpICE9IG51bGwgJiYKICAgICAgICAgIChmaWxlVXJpLnNjaGVtZSA9PSAiZGFydCIgfHwKICAgICAgICAgICAgICBmaWxlVXJpLnNjaGVtZSA9PSAicGFja2FnZSIgfHwKICAgICAgICAgICAgICBmaWxlVXJpLnNjaGVtZSA9PSAiZGFydC1leHQiKSkgewogICAgICAgIGZpbGVVcmkgPSBudWxsOwogICAgICB9CiAgICAgIFN0cmluZyBwYWNrYWdlRnJhZ21lbnQ7CiAgICAgIGlmIChmaWxlVXJpID09IG51bGwpIHsKICAgICAgICBzd2l0Y2ggKHVyaS5zY2hlbWUpIHsKICAgICAgICAgIGNhc2UgInBhY2thZ2UiOgogICAgICAgICAgY2FzZSAiZGFydCI6CiAgICAgICAgICAgIGZpbGVVcmkgPSB0YXJnZXQudHJhbnNsYXRlVXJpKHVyaSkgPz8KICAgICAgICAgICAgICAgIG5ldyBVcmkoCiAgICAgICAgICAgICAgICAgICAgc2NoZW1lOiB1bnRyYW5zbGF0YWJsZVVyaVNjaGVtZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiBVcmkuZW5jb2RlQ29tcG9uZW50KCIkdXJpIikpOwogICAgICAgICAgICBwYWNrYWdlRnJhZ21lbnQgPSB0YXJnZXQudXJpVHJhbnNsYXRvci5nZXRQYWNrYWdlRnJhZ21lbnQodXJpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZmlsZVVyaSA9IHVyaTsKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVtcHR5IHBhY2thZ2UgbmFtZSBlbnRyeSAocmVkaXJlY3RpbmcgdG8gcGFja2FnZSBuYW1lCiAgICAgICAgICAgIC8vIGZyb20gd2hpY2ggd2Ugc2hvdWxkIGdldCB0aGUgZnJhZ21lbnQgcGFydCkuCiAgICAgICAgICAgIHBhY2thZ2VGcmFnbWVudCA9IHRhcmdldC51cmlUcmFuc2xhdG9yPy5nZXREZWZhdWx0UGFja2FnZUZyYWdtZW50KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBib29sIGhhc1BhY2thZ2VTcGVjaWZpZWRMYW5ndWFnZVZlcnNpb24gPSBmYWxzZTsKICAgICAgaW50IHBhY2thZ2VTcGVjaWZpZWRMYW5ndWFnZVZlcnNpb25NYWpvcjsKICAgICAgaW50IHBhY2thZ2VTcGVjaWZpZWRMYW5ndWFnZVZlcnNpb25NaW5vcjsKICAgICAgaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7CiAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BlcnRpZXMgPSBwYWNrYWdlRnJhZ21lbnQuc3BsaXQoIiYiKTsKICAgICAgICBpbnQgZm91bmRFbnRyaWVzID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07CiAgICAgICAgICBpZiAocHJvcGVydHkuc3RhcnRzV2l0aCgiZGFydD0iKSkgewogICAgICAgICAgICBpZiAoKytmb3VuZEVudHJpZXMgPiAxKSB7CiAgICAgICAgICAgICAgLy8gRm9yY2UgZXJyb3IgdG8gYmUgaXNzdWVkIGlmIG1vcmUgdGhhbiBvbmUgImRhcnQ9IiBlbnRyeS4KICAgICAgICAgICAgICAvLyAoVGhlIGVycm9yIHdpbGwgYmUgaXNzdWVkIGluIGxpYnJhcnkuc2V0TGFuZ3VhZ2VWZXJzaW9uIGJlbG93CiAgICAgICAgICAgICAgLy8gd2hlbiBnaXZpbmcgaXQgYG51bGxgIHZlcnNpb24gbnVtYmVycy4pCiAgICAgICAgICAgICAgcGFja2FnZVNwZWNpZmllZExhbmd1YWdlVmVyc2lvbk1ham9yID0gbnVsbDsKICAgICAgICAgICAgICBwYWNrYWdlU3BlY2lmaWVkTGFuZ3VhZ2VWZXJzaW9uTWlub3IgPSBudWxsOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBoYXNQYWNrYWdlU3BlY2lmaWVkTGFuZ3VhZ2VWZXJzaW9uID0gdHJ1ZTsKICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlVmVyc2lvblN0cmluZyA9IHByb3BlcnR5LnN1YnN0cmluZyg1KTsKCiAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIGlzIHgueVt3aGF0ZXZlcl0KICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRvdFNlcGFyYXRlZFBhcnRzID0gbGFuZ3VhZ2VWZXJzaW9uU3RyaW5nLnNwbGl0KCIuIik7CiAgICAgICAgICAgIGlmIChkb3RTZXBhcmF0ZWRQYXJ0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgIHBhY2thZ2VTcGVjaWZpZWRMYW5ndWFnZVZlcnNpb25NYWpvciA9CiAgICAgICAgICAgICAgICAgIGludC50cnlQYXJzZShkb3RTZXBhcmF0ZWRQYXJ0c1swXSk7CiAgICAgICAgICAgICAgcGFja2FnZVNwZWNpZmllZExhbmd1YWdlVmVyc2lvbk1pbm9yID0KICAgICAgICAgICAgICAgICAgaW50LnRyeVBhcnNlKGRvdFNlcGFyYXRlZFBhcnRzWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gdGFyZ2V0LmNyZWF0ZUxpYnJhcnlCdWlsZGVyKAogICAgICAgICAgdXJpLCBmaWxlVXJpLCBvcmlnaW4sIHJlZmVyZW5jZXNGcm9tLCByZWZlcmVuY2VJc1BhcnRPd25lcik7CiAgICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiY3JlYXRlTGlicmFyeUJ1aWxkZXIgZm9yIHVyaSAkdXJpLCAiCiAgICAgICAgICAgICJmaWxlVXJpICRmaWxlVXJpIHJldHVybmVkIG51bGwuIik7CiAgICAgIH0KCiAgICAgIGlmIChoYXNQYWNrYWdlU3BlY2lmaWVkTGFuZ3VhZ2VWZXJzaW9uKSB7CiAgICAgICAgbGlicmFyeS5zZXRMYW5ndWFnZVZlcnNpb24ocGFja2FnZVNwZWNpZmllZExhbmd1YWdlVmVyc2lvbk1ham9yLAogICAgICAgICAgICBwYWNrYWdlU3BlY2lmaWVkTGFuZ3VhZ2VWZXJzaW9uTWlub3IsCiAgICAgICAgICAgIGV4cGxpY2l0OiBmYWxzZSk7CiAgICAgIH0KICAgICAgaWYgKHVyaS5zY2hlbWUgPT0gImRhcnQiICYmIHVyaS5wYXRoID09ICJjb3JlIikgewogICAgICAgIGNvcmVMaWJyYXJ5ID0gbGlicmFyeTsKICAgICAgfQogICAgICBpZiAobGlicmFyeS5sb2FkZXIgIT0gdGhpcykgewogICAgICAgIGlmIChjb3JlTGlicmFyeSA9PSBsaWJyYXJ5KSB7CiAgICAgICAgICB0YXJnZXQubG9hZEV4dHJhUmVxdWlyZWRMaWJyYXJpZXModGhpcyk7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgbGlicmFyeSBpc24ndCBvd25lZCBieSB0aGlzIGxvYWRlciwgc28gbm90IGZ1cnRoZXIgcHJvY2Vzc2luZwogICAgICAgIC8vIHNob3VsZCBiZSBhdHRlbXB0ZWQuCiAgICAgICAgcmV0dXJuIGxpYnJhcnk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICAvLyBBZGQgYW55IGFkZGl0aW9uYWwgbG9naWMgYWZ0ZXIgdGhpcyBibG9jay4gU2V0dGluZyB0aGUKICAgICAgICAvLyBmaXJzdFNvdXJjZVVyaSBhbmQgZmlyc3QgbGlicmFyeSBzaG91bGQgYmUgZG9uZSBhcyBlYXJseSBhcwogICAgICAgIC8vIHBvc3NpYmxlLgogICAgICAgIGZpcnN0U291cmNlVXJpID8/PSB1cmk7CiAgICAgICAgZmlyc3QgPz89IGxpYnJhcnk7CiAgICAgIH0KICAgICAgaWYgKGNvcmVMaWJyYXJ5ID09IGxpYnJhcnkpIHsKICAgICAgICB0YXJnZXQubG9hZEV4dHJhUmVxdWlyZWRMaWJyYXJpZXModGhpcyk7CiAgICAgIH0KICAgICAgaWYgKHRhcmdldC5iYWNrZW5kVGFyZ2V0CiAgICAgICAgICAubWF5RGVmaW5lUmVzdHJpY3RlZFR5cGUob3JpZ2luPy5pbXBvcnRVcmkgPz8gdXJpKSkgewogICAgICAgIGxpYnJhcnkubWF5SW1wbGVtZW50UmVzdHJpY3RlZFR5cGVzID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAodXJpLnNjaGVtZSA9PSAiZGFydCIpIHsKICAgICAgICB0YXJnZXQucmVhZFBhdGNoRmlsZXMobGlicmFyeSk7CiAgICAgIH0KICAgICAgdW5wYXJzZWRMaWJyYXJpZXMuYWRkTGFzdChsaWJyYXJ5KTsKICAgICAgcmV0dXJuIGxpYnJhcnk7CiAgICB9KTsKICAgIGlmIChhY2Nlc3NvciA9PSBudWxsKSB7CiAgICAgIGlmIChidWlsZGVyLmxvYWRlciA9PSB0aGlzICYmIGZpcnN0ICE9IGJ1aWxkZXIgJiYgaXNTb3VyY2VMb2FkZXIpIHsKICAgICAgICB1bmhhbmRsZWQoIm51bGwiLCAiYWNjZXNzb3IiLCBjaGFyT2Zmc2V0LCB1cmkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBidWlsZGVyLnJlY29yZEFjY2VzcyhjaGFyT2Zmc2V0LCBub0xlbmd0aCwgYWNjZXNzb3IuZmlsZVVyaSk7CiAgICAgIGlmICghYWNjZXNzb3IuaXNQYXRjaCAmJgogICAgICAgICAgIWFjY2Vzc29yLmlzUGFydCAmJgogICAgICAgICAgIXRhcmdldC5iYWNrZW5kVGFyZ2V0CiAgICAgICAgICAgICAgLmFsbG93UGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2VzcyhhY2Nlc3Nvci5pbXBvcnRVcmksIHVyaSkpIHsKICAgICAgICBhY2Nlc3Nvci5hZGRQcm9ibGVtKG1lc3NhZ2VQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCwgYWNjZXNzb3IuZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWlsZGVyOwogIH0KCiAgdm9pZCBlbnN1cmVDb3JlTGlicmFyeSgpIHsKICAgIGlmIChjb3JlTGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHJlYWQoVXJpLnBhcnNlKCJkYXJ0OmNvcmUiKSwgMCwgYWNjZXNzb3I6IGZpcnN0KTsKICAgICAgLy8gVE9ETyhhc2tlc2MpOiBXaGVuIGFsbCBiYWNrZW5kcyBzdXBwb3J0IHNldCBsaXRlcmFscywgd2Ugbm8gbG9uZ2VyCiAgICAgIC8vIG5lZWQgdG8gaW5kZXggZGFydDpjb2xsZWN0aW9uLCBhcyBpdCBpcyBvbmx5IG5lZWRlZCBmb3IgZGVzdWdhcmluZyBvZgogICAgICAvLyBjb25zdCBzZXRzLiBXZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IGF0IHRoYXQgdGltZS4KICAgICAgcmVhZChVcmkucGFyc2UoImRhcnQ6Y29sbGVjdGlvbiIpLCAwLCBhY2Nlc3NvcjogZmlyc3QpOwogICAgICBhc3NlcnQoY29yZUxpYnJhcnkgIT0gbnVsbCk7CiAgICB9CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRCb2RpZXMoKSBhc3luYyB7CiAgICBhc3NlcnQoY29yZUxpYnJhcnkgIT0gbnVsbCk7CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nID0gbGlicmFyeS5pbXBvcnRVcmk7CiAgICAgICAgYXdhaXQgYnVpbGRCb2R5KGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgICBjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcgPSBudWxsOwogICAgbG9nU3VtbWFyeSh0ZW1wbGF0ZVNvdXJjZUJvZHlTdW1tYXJ5KTsKICB9CgogIEZ1dHVyZTxOdWxsPiBidWlsZE91dGxpbmVzKCkgYXN5bmMgewogICAgZW5zdXJlQ29yZUxpYnJhcnkoKTsKICAgIHdoaWxlICh1bnBhcnNlZExpYnJhcmllcy5pc05vdEVtcHR5KSB7CiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSB1bnBhcnNlZExpYnJhcmllcy5yZW1vdmVGaXJzdCgpOwogICAgICBjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmcgPSBsaWJyYXJ5LmltcG9ydFVyaTsKICAgICAgYXdhaXQgYnVpbGRPdXRsaW5lKGxpYnJhcnkpOwogICAgfQogICAgY3VycmVudFVyaUZvckNyYXNoUmVwb3J0aW5nID0gbnVsbDsKICAgIGxvZ1N1bW1hcnkob3V0bGluZVN1bW1hcnlUZW1wbGF0ZSk7CiAgfQoKICB2b2lkIGxvZ1N1bW1hcnkoVGVtcGxhdGU8U3VtbWFyeVRlbXBsYXRlPiB0ZW1wbGF0ZSkgewogICAgdGlja2VyLmxvZygoRHVyYXRpb24gZWxhcHNlZCwgRHVyYXRpb24gc2luY2VTdGFydCkgewogICAgICBpbnQgbGlicmFyeUNvdW50ID0gMDsKICAgICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSBsaWJyYXJ5Q291bnQrKzsKICAgICAgfSk7CiAgICAgIGRvdWJsZSBtcyA9IGVsYXBzZWQuaW5NaWNyb3NlY29uZHMgLyBEdXJhdGlvbi5taWNyb3NlY29uZHNQZXJNaWxsaXNlY29uZDsKICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgIGxpYnJhcnlDb3VudCwgYnl0ZUNvdW50LCBtcywgYnl0ZUNvdW50IC8gbXMsIG1zIC8gbGlicmFyeUNvdW50KTsKICAgICAgcHJpbnQoIiRzaW5jZVN0YXJ0OiAke21lc3NhZ2UubWVzc2FnZX0iKTsKICAgIH0pOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkT3V0bGluZShjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBCdWlsZHMgYWxsIHRoZSBtZXRob2QgYm9kaWVzIGZvdW5kIGluIHRoZSBnaXZlbiBbbGlicmFyeV0uCiAgRnV0dXJlPE51bGw+IGJ1aWxkQm9keShjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIC8vLyBSZWdpc3RlciBbbWVzc2FnZV0gYXMgYSBwcm9ibGVtIHdpdGggYSBzZXZlcml0eSBkZXRlcm1pbmVkIGJ5IHRoZQogIC8vLyBpbnRyaW5zaWMgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRQcm9ibGVtKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLCBVcmkgZmlsZVVyaSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5LAogICAgICBib29sIHByb2JsZW1PbkxpYnJhcnk6IGZhbHNlfSkgewogICAgcmV0dXJuIGFkZE1lc3NhZ2UobWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpLCBzZXZlcml0eSwKICAgICAgICB3YXNIYW5kbGVkOiB3YXNIYW5kbGVkLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgcHJvYmxlbU9uTGlicmFyeTogcHJvYmxlbU9uTGlicmFyeSk7CiAgfQoKICAvLy8gQWxsIG1lc3NhZ2VzIHJlcG9ydGVkIGJ5IHRoZSBjb21waWxlciAoZXJyb3JzLCB3YXJuaW5ncywgZXRjLikgYXJlIHJvdXRlZAogIC8vLyB0aHJvdWdoIHRoaXMgbWV0aG9kLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgRm9ybWF0dGVkTWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBpcyBuZXcsIHRoYXQgaXMsIG5vdCBwcmV2aW91c2x5CiAgLy8vIHJlcG9ydGVkLiBUaGlzIGlzIGltcG9ydGFudCBhcyBzb21lIHBhcnNlciBlcnJvcnMgbWF5IGJlIHJlcG9ydGVkIHVwIHRvCiAgLy8vIHRocmVlIHRpbWVzIGJ5IGBPdXRsaW5lQnVpbGRlcmAsIGBEaWV0TGlzdGVuZXJgLCBhbmQgYEJvZHlCdWlsZGVyYC4KICAvLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbm90IG5ldywgW251bGxdIGlzIHJlcG9ydGVkLgogIC8vLwogIC8vLyBJZiBbc2V2ZXJpdHldIGlzIGBTZXZlcml0eS5lcnJvcmAsIHRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvCiAgLy8vIFtoYW5kbGVkRXJyb3JzXSBpZiBbd2FzSGFuZGxlZF0gaXMgdHJ1ZSBvciB0byBbdW5oYW5kbGVkRXJyb3JzXSBpZgogIC8vLyBbd2FzSGFuZGxlZF0gaXMgZmFsc2UuCiAgRm9ybWF0dGVkTWVzc2FnZSBhZGRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIFVyaSBmaWxlVXJpLCBTZXZlcml0eSBzZXZlcml0eSwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsCiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsCiAgICAgIGJvb2wgcHJvYmxlbU9uTGlicmFyeTogZmFsc2V9KSB7CiAgICBzZXZlcml0eSA9IHRhcmdldC5maXhTZXZlcml0eShzZXZlcml0eSwgbWVzc2FnZSwgZmlsZVVyaSk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuaWdub3JlZCkgcmV0dXJuIG51bGw7CiAgICBTdHJpbmcgdHJhY2UgPSAiIiIKbWVzc2FnZTogJHttZXNzYWdlLm1lc3NhZ2V9CmNoYXJPZmZzZXQ6ICRjaGFyT2Zmc2V0CmZpbGVVcmk6ICRmaWxlVXJpCnNldmVyaXR5OiAkc2V2ZXJpdHkKIiIiOwogICAgaWYgKCFzZWVuTWVzc2FnZXMuYWRkKHRyYWNlKSkgcmV0dXJuIG51bGw7CiAgICBpZiAobWVzc2FnZS5jb2RlLnNldmVyaXR5ID09IFNldmVyaXR5LmNvbnRleHQpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHkKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhtZXNzYWdlLmNvZGUubmFtZSksCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgZmlsZVVyaSk7CiAgICB9CiAgICB0YXJnZXQuY29udGV4dC5yZXBvcnQoCiAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKSwgc2V2ZXJpdHksCiAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICBpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuZXJyb3IpIHsKICAgICAgKHdhc0hhbmRsZWQgPyBoYW5kbGVkRXJyb3JzIDogdW5oYW5kbGVkRXJyb3JzKQogICAgICAgICAgLmFkZChtZXNzYWdlLndpdGhMb2NhdGlvbihmaWxlVXJpLCBjaGFyT2Zmc2V0LCBsZW5ndGgpKTsKICAgIH0KICAgIEZvcm1hdHRlZE1lc3NhZ2UgZm9ybWF0dGVkTWVzc2FnZSA9IHRhcmdldC5jcmVhdGVGb3JtYXR0ZWRNZXNzYWdlKAogICAgICAgIG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgZmlsZVVyaSwgY29udGV4dCwgc2V2ZXJpdHkpOwogICAgaWYgKCFwcm9ibGVtT25MaWJyYXJ5KSB7CiAgICAgIGFsbENvbXBvbmVudFByb2JsZW1zLmFkZChmb3JtYXR0ZWRNZXNzYWdlKTsKICAgIH0KICAgIHJldHVybiBmb3JtYXR0ZWRNZXNzYWdlOwogIH0KCiAgTWVtYmVyQnVpbGRlciBnZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKCkgewogICAgcmV0dXJuIHRhcmdldC5nZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yKHRoaXMpOwogIH0KCiAgTWVtYmVyQnVpbGRlciBnZXRDb21waWxlVGltZUVycm9yKCkgPT4gdGFyZ2V0LmdldENvbXBpbGVUaW1lRXJyb3IodGhpcyk7CgogIE1lbWJlckJ1aWxkZXIgZ2V0RHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcigpIHsKICAgIHJldHVybiB0YXJnZXQuZ2V0RHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcih0aGlzKTsKICB9CgogIE1lbWJlckJ1aWxkZXIgZ2V0TmF0aXZlQW5ub3RhdGlvbigpID0+IHRhcmdldC5nZXROYXRpdmVBbm5vdGF0aW9uKHRoaXMpOwoKICBDbGFzc0J1aWxkZXIgY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhDbGFzcyBjbHMpOwoKICBUeXBlQnVpbGRlciBjb21wdXRlVHlwZUJ1aWxkZXIoRGFydFR5cGUgdHlwZSk7CgogIEJvZHlCdWlsZGVyIGNyZWF0ZUJvZHlCdWlsZGVyRm9yT3V0bGluZUV4cHJlc3Npb24oCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIERlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgIE1vZGlmaWVyQnVpbGRlciBtZW1iZXIsCiAgICAgIFNjb3BlIHNjb3BlLAogICAgICBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIG5ldyBCb2R5QnVpbGRlci5mb3JPdXRsaW5lRXhwcmVzc2lvbigKICAgICAgICBsaWJyYXJ5LCBkZWNsYXJhdGlvbkJ1aWxkZXIsIG1lbWJlciwgc2NvcGUsIGZpbGVVcmkpOwogIH0KfQqBdABOTjwBFgEhASUBTwFAARUBJSsnJigkASkBNAEXCRoYERIZEi0wIwE4AT8BIgFKARhFAU8BLwElAU4WBkszQQFQFgZDF0MBTy1MATYBHgFLUBgBFQEjARcBJgE4ASQBRkwkBkwkBlBLRRovFB8dHiQ8HSctLxgIHh0eGhcyGTU4TBMBExtPPFETCgg3MDAlPh42Ky4mSk85OzsVDgE3QgE4TzE1NjU2DgwKCDxHHUMwCAEwSTIeCDgfCCQmMwpOIBgIAQhCRxUgGwgkMQgfQDQIIigIKhYIHEo4CA1EHx4gTU0pCAYUBAEdHzhMT0M+IwYEASUhNiQ5IggGKCsEAScZK0A3IwYoKAQBODkcOzQKUDBLMAgEAT8BQTwBSCkfQB8kGSdGIBotBAFQGwZQTko1BkFJHUsmHyQnPzMXHBgSFAUvNRcxMRYUBhtFGyY1QwZHQh0yBh0EATc8BAFLATc8BAFLAT4BMQE1Hi0eExUxPgQCASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvbG9hZGVyLmRhcnRLZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC1wa2cvcHViL2NoYXJjb2RlL2xpYi9hc2NpaS5kYXJ0oykvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBEZWNsYXJlIGludGVnZXIgY29uc3RhbnRzIGZvciBlYWNoIEFTQ0lJIGNoYXJhY3Rlci4KLy8vCi8vLyBUaGUgY29uc3RhbnRzIGFsbCBzdGFydCB3aXRoICIkIiB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoIG90aGVyIGNvbnN0YW50cy4KLy8vCi8vLyBGb3IgY2hhcmFjdGVycyB0aGF0IGFyZSB2YWxpZCBpbiBhbiBpZGVudGlmaWVyLCB0aGUgY2hhcmFjdGVyIGl0c2VsZgovLy8gZm9sbG93cyB0aGUgIiQiLiBGb3Igb3RoZXIgY2hhcmFjdGVycywgYSBzeW1ib2xpYyBuYW1lIGlzIHVzZWQuCi8vLyBJbiBzb21lIGNhc2VzLCBtdWx0aXBsZSBhbHRlcm5hdGl2ZSBzeW1ib2xpYyBuYW1lcyBhcmUgcHJvdmlkZWQuCi8vLyBQbGVhc2Ugc3RpY2sgdG8gdXNpbmcgb25lIG5hbWUgcGVyIGNoYXJhY3RlciBpbiB5b3VyIGNvZGUuCi8vLwovLy8gVGhlIHN5bWJvbGljIG5hbWVzIGFyZSwgd2hlcmUgYXBwbGljYWJsZSwgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB3aXRob3V0Ci8vLyBhbnkgIm1hcmsiLCAic3ltYm9sIiAic2lnbiIgb3IgImFjY2VudCIgc3VmZml4LgovLy8gRXhhbXBsZXM6IFskZXhjbGFtYXRpb25dLCBbJHBpcGVdLCBbJGRvbGxhcl0gYW5kIFskZ3JhdmVdLgovLy8gRm9yIGxlc3MgY29tbW9uIHN5bWJvbHMsIGEgc2VsZWN0aW9uIG9mIGNvbW1vbiBuYW1lcyBhcmUgdXNlZC4KLy8vCi8vLyBGb3IgcGFyZW50aGV0aWNhbCBtYXJrZXJzLCB0aGVyZSBpcyBib3RoIGEgc2hvcnQgbmFtZSwgWyRscGFyZW5dL1skcnBhcmVuXSwKLy8vIGFuZCBhIGxvbmcgbmFtZSwgWyRvcGVuX3BhcmVuXS8gWyRjbG9zZV9wYXJlbl0uCi8vLwovLy8gRm9yIGNvbW1vbiBIVE1MIGVudGl0aWVzLCB0aGUgZW50aXR5IG5hbWVzIGFyZSBhbHNvIHVzYWJsZSBhcyBzeW1ib2xpYwovLy8gbmFtZXM6IFskYXBvc10sIFskcXVvdF0sIFskbHRdLCBbJGd0XSwgYW5kIFskYW1wXS4KbGlicmFyeSBjaGFyY29kZS5hc2NpaS5kb2xsYXJfbG93ZXJjYXNlOwoKLy8gQ29udHJvbCBjaGFyYWN0ZXJzLgoKLy8vICJOdWxsIGNoYXJhY3RlciIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkbnVsID0gMHgwMDsKCi8vLyAiU3RhcnQgb2YgSGVhZGVyIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzb2ggPSAweDAxOwoKLy8vICJTdGFydCBvZiBUZXh0IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzdHggPSAweDAyOwoKLy8vICJFbmQgb2YgVGV4dCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZXR4ID0gMHgwMzsKCi8vLyAiRW5kIG9mIFRyYW5zbWlzc2lvbiIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZW90ID0gMHgwNDsKCi8vLyAiRW5xdWlyeSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZW5xID0gMHgwNTsKCi8vLyAiQWNrbm93bGVkZ21lbnQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGFjayA9IDB4MDY7CgovLy8gIkJlbGwiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGJlbCA9IDB4MDc7CgovLy8gIkJhY2tzcGFjZSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkYnMgPSAweDA4OwoKLy8vICJIb3Jpem9udGFsIFRhYiIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkaHQgPSAweDA5OwoKLy8vICJIb3Jpem9udGFsIFRhYiIgY29udHJvbCBjaGFyYWN0ZXIsIGNvbW1vbiBuYW1lLgpjb25zdCBpbnQgJHRhYiA9IDB4MDk7CgovLy8gIkxpbmUgZmVlZCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkbGYgPSAweDBBOwoKLy8vICJWZXJ0aWNhbCBUYWIiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHZ0ID0gMHgwQjsKCi8vLyAiRm9ybSBmZWVkIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRmZiA9IDB4MEM7CgovLy8gIkNhcnJpYWdlIHJldHVybiIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkY3IgPSAweDBEOwoKLy8vICJTaGlmdCBPdXQiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHNvID0gMHgwRTsKCi8vLyAiU2hpZnQgSW4iIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHNpID0gMHgwRjsKCi8vLyAiRGF0YSBMaW5rIEVzY2FwZSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZGxlID0gMHgxMDsKCi8vLyAiRGV2aWNlIENvbnRyb2wgMSIgY29udHJvbCBjaGFyYWN0ZXIgKG9mdC4gWE9OKS4KY29uc3QgaW50ICRkYzEgPSAweDExOwoKLy8vICJEZXZpY2UgQ29udHJvbCAyIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRkYzIgPSAweDEyOwoKLy8vICJEZXZpY2UgQ29udHJvbCAzIiBjb250cm9sIGNoYXJhY3RlciAob2Z0LiBYT0ZGKS4KY29uc3QgaW50ICRkYzMgPSAweDEzOwoKLy8vICJEZXZpY2UgQ29udHJvbCA0IiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRkYzQgPSAweDE0OwoKLy8vICJOZWdhdGl2ZSBBY2tub3dsZWRnbWVudCIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkbmFrID0gMHgxNTsKCi8vLyAiU3luY2hyb25vdXMgaWRsZSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkc3luID0gMHgxNjsKCi8vLyAiRW5kIG9mIFRyYW5zbWlzc2lvbiBCbG9jayIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZXRiID0gMHgxNzsKCi8vLyAiQ2FuY2VsIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRjYW4gPSAweDE4OwoKLy8vICJFbmQgb2YgTWVkaXVtIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRlbSA9IDB4MTk7CgovLy8gIlN1YnN0aXR1dGUiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHN1YiA9IDB4MUE7CgovLy8gIkVzY2FwZSIgY29udHJvbCBjaGFyYWN0ZXIuCmNvbnN0IGludCAkZXNjID0gMHgxQjsKCi8vLyAiRmlsZSBTZXBhcmF0b3IiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJGZzID0gMHgxQzsKCi8vLyAiR3JvdXAgU2VwYXJhdG9yIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRncyA9IDB4MUQ7CgovLy8gIlJlY29yZCBTZXBhcmF0b3IiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHJzID0gMHgxRTsKCi8vLyAiVW5pdCBTZXBhcmF0b3IiIGNvbnRyb2wgY2hhcmFjdGVyLgpjb25zdCBpbnQgJHVzID0gMHgxRjsKCi8vLyAiRGVsZXRlIiBjb250cm9sIGNoYXJhY3Rlci4KY29uc3QgaW50ICRkZWwgPSAweDdGOwoKLy8gVmlzaWJsZSBjaGFyYWN0ZXJzLgoKLy8vIFNwYWNlIGNoYXJhY3Rlci4KY29uc3QgaW50ICRzcGFjZSA9IDB4MjA7CgovLy8gQ2hhcmFjdGVyICchJy4KY29uc3QgaW50ICRleGNsYW1hdGlvbiA9IDB4MjE7CgovLy8gQ2hhcmFjdGVyICciJywgc2hvcnQgbmFtZS4KY29uc3QgaW50ICRxdW90ID0gMHgyMjsKCi8vLyBDaGFyYWN0ZXIgJyInLgpjb25zdCBpbnQgJHF1b3RlID0gMHgyMjsKCi8vLyBDaGFyYWN0ZXIgJyInLgpjb25zdCBpbnQgJGRvdWJsZV9xdW90ZSA9IDB4MjI7CgovLy8gQ2hhcmFjdGVyICciJy4KY29uc3QgaW50ICRxdW90YXRpb24gPSAweDIyOwoKLy8vIENoYXJhY3RlciAnIycuCmNvbnN0IGludCAkaGFzaCA9IDB4MjM7CgovLy8gQ2hhcmFjdGVyICckJy4KY29uc3QgaW50ICQkID0gMHgyNDsKCi8vLyBDaGFyYWN0ZXIgJyQnLgpjb25zdCBpbnQgJGRvbGxhciA9IDB4MjQ7CgovLy8gQ2hhcmFjdGVyICclJy4KY29uc3QgaW50ICRwZXJjZW50ID0gMHgyNTsKCi8vLyBDaGFyYWN0ZXIgJyYnLCBzaG9ydCBuYW1lLgpjb25zdCBpbnQgJGFtcCA9IDB4MjY7CgovLy8gQ2hhcmFjdGVyICcmJy4KY29uc3QgaW50ICRhbXBlcnNhbmQgPSAweDI2OwoKLy8vIENoYXJhY3RlciAiJyIuCmNvbnN0IGludCAkYXBvcyA9IDB4Mjc7CgovLy8gQ2hhcmFjdGVyICcnJy4KY29uc3QgaW50ICRhcG9zdHJvcGhlID0gMHgyNzsKCi8vLyBDaGFyYWN0ZXIgJycnLgpjb25zdCBpbnQgJHNpbmdsZV9xdW90ZSA9IDB4Mjc7CgovLy8gQ2hhcmFjdGVyICcoJy4KY29uc3QgaW50ICRscGFyZW4gPSAweDI4OwoKLy8vIENoYXJhY3RlciAnKCcuCmNvbnN0IGludCAkb3Blbl9wYXJlbiA9IDB4Mjg7CgovLy8gQ2hhcmFjdGVyICcoJy4KY29uc3QgaW50ICRvcGVuX3BhcmVudGhlc2lzID0gMHgyODsKCi8vLyBDaGFyYWN0ZXIgJyknLgpjb25zdCBpbnQgJHJwYXJlbiA9IDB4Mjk7CgovLy8gQ2hhcmFjdGVyICcpJy4KY29uc3QgaW50ICRjbG9zZV9wYXJlbiA9IDB4Mjk7CgovLy8gQ2hhcmFjdGVyICcpJy4KY29uc3QgaW50ICRjbG9zZV9wYXJlbnRoZXNpcyA9IDB4Mjk7CgovLy8gQ2hhcmFjdGVyICcqJy4KY29uc3QgaW50ICRhc3RlcmlzayA9IDB4MkE7CgovLy8gQ2hhcmFjdGVyICcrJy4KY29uc3QgaW50ICRwbHVzID0gMHgyQjsKCi8vLyBDaGFyYWN0ZXIgJywnLgpjb25zdCBpbnQgJGNvbW1hID0gMHgyQzsKCi8vLyBDaGFyYWN0ZXIgJy0nLgpjb25zdCBpbnQgJG1pbnVzID0gMHgyRDsKCi8vLyBDaGFyYWN0ZXIgJy0nLgpjb25zdCBpbnQgJGRhc2ggPSAweDJEOwoKLy8vIENoYXJhY3RlciAnLicuCmNvbnN0IGludCAkZG90ID0gMHgyRTsKCi8vLyBDaGFyYWN0ZXIgJy4nLgpjb25zdCBpbnQgJGZ1bGxzdG9wID0gMHgyRTsKCi8vLyBDaGFyYWN0ZXIgJy8nLgpjb25zdCBpbnQgJHNsYXNoID0gMHgyRjsKCi8vLyBDaGFyYWN0ZXIgJy8nLgpjb25zdCBpbnQgJHNvbGlkdXMgPSAweDJGOwoKLy8vIENoYXJhY3RlciAnLycuCmNvbnN0IGludCAkZGl2aXNpb24gPSAweDJGOwoKLy8vIENoYXJhY3RlciAnMCcuCmNvbnN0IGludCAkMCA9IDB4MzA7CgovLy8gQ2hhcmFjdGVyICcxJy4KY29uc3QgaW50ICQxID0gMHgzMTsKCi8vLyBDaGFyYWN0ZXIgJzInLgpjb25zdCBpbnQgJDIgPSAweDMyOwoKLy8vIENoYXJhY3RlciAnMycuCmNvbnN0IGludCAkMyA9IDB4MzM7CgovLy8gQ2hhcmFjdGVyICc0Jy4KY29uc3QgaW50ICQ0ID0gMHgzNDsKCi8vLyBDaGFyYWN0ZXIgJzUnLgpjb25zdCBpbnQgJDUgPSAweDM1OwoKLy8vIENoYXJhY3RlciAnNicuCmNvbnN0IGludCAkNiA9IDB4MzY7CgovLy8gQ2hhcmFjdGVyICc3Jy4KY29uc3QgaW50ICQ3ID0gMHgzNzsKCi8vLyBDaGFyYWN0ZXIgJzgnLgpjb25zdCBpbnQgJDggPSAweDM4OwoKLy8vIENoYXJhY3RlciAnOScuCmNvbnN0IGludCAkOSA9IDB4Mzk7CgovLy8gQ2hhcmFjdGVyICc6Jy4KY29uc3QgaW50ICRjb2xvbiA9IDB4M0E7CgovLy8gQ2hhcmFjdGVyICc7Jy4KY29uc3QgaW50ICRzZW1pY29sb24gPSAweDNCOwoKLy8vIENoYXJhY3RlciAnPCcuCmNvbnN0IGludCAkbHQgPSAweDNDOwoKLy8vIENoYXJhY3RlciAnPCcuCmNvbnN0IGludCAkbGVzc190aGFuID0gMHgzQzsKCi8vLyBDaGFyYWN0ZXIgJzwnLgpjb25zdCBpbnQgJGxhbmdsZSA9IDB4M0M7CgovLy8gQ2hhcmFjdGVyICc8Jy4KY29uc3QgaW50ICRvcGVuX2FuZ2xlID0gMHgzQzsKCi8vLyBDaGFyYWN0ZXIgJz0nLgpjb25zdCBpbnQgJGVxdWFsID0gMHgzRDsKCi8vLyBDaGFyYWN0ZXIgJz4nLgpjb25zdCBpbnQgJGd0ID0gMHgzRTsKCi8vLyBDaGFyYWN0ZXIgJz4nLgpjb25zdCBpbnQgJGdyZWF0ZXJfdGhhbiA9IDB4M0U7CgovLy8gQ2hhcmFjdGVyICc+Jy4KY29uc3QgaW50ICRyYW5nbGUgPSAweDNFOwoKLy8vIENoYXJhY3RlciAnPicuCmNvbnN0IGludCAkY2xvc2VfYW5nbGUgPSAweDNFOwoKLy8vIENoYXJhY3RlciAnPycuCmNvbnN0IGludCAkcXVlc3Rpb24gPSAweDNGOwoKLy8vIENoYXJhY3RlciAnQCcuCmNvbnN0IGludCAkYXQgPSAweDQwOwoKLy8vIENoYXJhY3RlciAnQScuCmNvbnN0IGludCAkQSA9IDB4NDE7CgovLy8gQ2hhcmFjdGVyICdCJy4KY29uc3QgaW50ICRCID0gMHg0MjsKCi8vLyBDaGFyYWN0ZXIgJ0MnLgpjb25zdCBpbnQgJEMgPSAweDQzOwoKLy8vIENoYXJhY3RlciAnRCcuCmNvbnN0IGludCAkRCA9IDB4NDQ7CgovLy8gQ2hhcmFjdGVyICdFJy4KY29uc3QgaW50ICRFID0gMHg0NTsKCi8vLyBDaGFyYWN0ZXIgJ0YnLgpjb25zdCBpbnQgJEYgPSAweDQ2OwoKLy8vIENoYXJhY3RlciAnRycuCmNvbnN0IGludCAkRyA9IDB4NDc7CgovLy8gQ2hhcmFjdGVyICdIJy4KY29uc3QgaW50ICRIID0gMHg0ODsKCi8vLyBDaGFyYWN0ZXIgJ0knLgpjb25zdCBpbnQgJEkgPSAweDQ5OwoKLy8vIENoYXJhY3RlciAnSicuCmNvbnN0IGludCAkSiA9IDB4NEE7CgovLy8gQ2hhcmFjdGVyICdLJy4KY29uc3QgaW50ICRLID0gMHg0QjsKCi8vLyBDaGFyYWN0ZXIgJ0wnLgpjb25zdCBpbnQgJEwgPSAweDRDOwoKLy8vIENoYXJhY3RlciAnTScuCmNvbnN0IGludCAkTSA9IDB4NEQ7CgovLy8gQ2hhcmFjdGVyICdOJy4KY29uc3QgaW50ICROID0gMHg0RTsKCi8vLyBDaGFyYWN0ZXIgJ08nLgpjb25zdCBpbnQgJE8gPSAweDRGOwoKLy8vIENoYXJhY3RlciAnUCcuCmNvbnN0IGludCAkUCA9IDB4NTA7CgovLy8gQ2hhcmFjdGVyICdRJy4KY29uc3QgaW50ICRRID0gMHg1MTsKCi8vLyBDaGFyYWN0ZXIgJ1InLgpjb25zdCBpbnQgJFIgPSAweDUyOwoKLy8vIENoYXJhY3RlciAnUycuCmNvbnN0IGludCAkUyA9IDB4NTM7CgovLy8gQ2hhcmFjdGVyICdUJy4KY29uc3QgaW50ICRUID0gMHg1NDsKCi8vLyBDaGFyYWN0ZXIgJ1UnLgpjb25zdCBpbnQgJFUgPSAweDU1OwoKLy8vIENoYXJhY3RlciAnVicuCmNvbnN0IGludCAkViA9IDB4NTY7CgovLy8gQ2hhcmFjdGVyICdXJy4KY29uc3QgaW50ICRXID0gMHg1NzsKCi8vLyBDaGFyYWN0ZXIgJ1gnLgpjb25zdCBpbnQgJFggPSAweDU4OwoKLy8vIENoYXJhY3RlciAnWScuCmNvbnN0IGludCAkWSA9IDB4NTk7CgovLy8gQ2hhcmFjdGVyICdaJy4KY29uc3QgaW50ICRaID0gMHg1QTsKCi8vLyBDaGFyYWN0ZXIgJ1snLgpjb25zdCBpbnQgJGxicmFja2V0ID0gMHg1QjsKCi8vLyBDaGFyYWN0ZXIgJ1snLgpjb25zdCBpbnQgJG9wZW5fYnJhY2tldCA9IDB4NUI7CgovLy8gQ2hhcmFjdGVyICdcJy4KY29uc3QgaW50ICRiYWNrc2xhc2ggPSAweDVDOwoKLy8vIENoYXJhY3RlciAnXScuCmNvbnN0IGludCAkcmJyYWNrZXQgPSAweDVEOwoKLy8vIENoYXJhY3RlciAnXScuCmNvbnN0IGludCAkY2xvc2VfYnJhY2tldCA9IDB4NUQ7CgovLy8gQ2hhcmFjdGVyICdeJy4KY29uc3QgaW50ICRjaXJjdW1mbGV4ID0gMHg1RTsKCi8vLyBDaGFyYWN0ZXIgJ14nLgpjb25zdCBpbnQgJGNhcmV0ID0gMHg1RTsKCi8vLyBDaGFyYWN0ZXIgJ14nLgpjb25zdCBpbnQgJGhhdCA9IDB4NUU7CgovLy8gQ2hhcmFjdGVyICdfJy4KY29uc3QgaW50ICRfID0gMHg1RjsKCi8vLyBDaGFyYWN0ZXIgJ18nLgpjb25zdCBpbnQgJHVuZGVyc2NvcmUgPSAweDVGOwoKLy8vIENoYXJhY3RlciAnXycuCmNvbnN0IGludCAkdW5kZXJsaW5lID0gMHg1RjsKCi8vLyBDaGFyYWN0ZXIgJ2AnLgpjb25zdCBpbnQgJGJhY2txdW90ZSA9IDB4NjA7CgovLy8gQ2hhcmFjdGVyICdgJy4KY29uc3QgaW50ICRncmF2ZSA9IDB4NjA7CgovLy8gQ2hhcmFjdGVyICdhJy4KY29uc3QgaW50ICRhID0gMHg2MTsKCi8vLyBDaGFyYWN0ZXIgJ2InLgpjb25zdCBpbnQgJGIgPSAweDYyOwoKLy8vIENoYXJhY3RlciAnYycuCmNvbnN0IGludCAkYyA9IDB4NjM7CgovLy8gQ2hhcmFjdGVyICdkJy4KY29uc3QgaW50ICRkID0gMHg2NDsKCi8vLyBDaGFyYWN0ZXIgJ2UnLgpjb25zdCBpbnQgJGUgPSAweDY1OwoKLy8vIENoYXJhY3RlciAnZicuCmNvbnN0IGludCAkZiA9IDB4NjY7CgovLy8gQ2hhcmFjdGVyICdnJy4KY29uc3QgaW50ICRnID0gMHg2NzsKCi8vLyBDaGFyYWN0ZXIgJ2gnLgpjb25zdCBpbnQgJGggPSAweDY4OwoKLy8vIENoYXJhY3RlciAnaScuCmNvbnN0IGludCAkaSA9IDB4Njk7CgovLy8gQ2hhcmFjdGVyICdqJy4KY29uc3QgaW50ICRqID0gMHg2QTsKCi8vLyBDaGFyYWN0ZXIgJ2snLgpjb25zdCBpbnQgJGsgPSAweDZCOwoKLy8vIENoYXJhY3RlciAnbCcuCmNvbnN0IGludCAkbCA9IDB4NkM7CgovLy8gQ2hhcmFjdGVyICdtJy4KY29uc3QgaW50ICRtID0gMHg2RDsKCi8vLyBDaGFyYWN0ZXIgJ24nLgpjb25zdCBpbnQgJG4gPSAweDZFOwoKLy8vIENoYXJhY3RlciAnbycuCmNvbnN0IGludCAkbyA9IDB4NkY7CgovLy8gQ2hhcmFjdGVyICdwJy4KY29uc3QgaW50ICRwID0gMHg3MDsKCi8vLyBDaGFyYWN0ZXIgJ3EnLgpjb25zdCBpbnQgJHEgPSAweDcxOwoKLy8vIENoYXJhY3RlciAncicuCmNvbnN0IGludCAkciA9IDB4NzI7CgovLy8gQ2hhcmFjdGVyICdzJy4KY29uc3QgaW50ICRzID0gMHg3MzsKCi8vLyBDaGFyYWN0ZXIgJ3QnLgpjb25zdCBpbnQgJHQgPSAweDc0OwoKLy8vIENoYXJhY3RlciAndScuCmNvbnN0IGludCAkdSA9IDB4NzU7CgovLy8gQ2hhcmFjdGVyICd2Jy4KY29uc3QgaW50ICR2ID0gMHg3NjsKCi8vLyBDaGFyYWN0ZXIgJ3cnLgpjb25zdCBpbnQgJHcgPSAweDc3OwoKLy8vIENoYXJhY3RlciAneCcuCmNvbnN0IGludCAkeCA9IDB4Nzg7CgovLy8gQ2hhcmFjdGVyICd5Jy4KY29uc3QgaW50ICR5ID0gMHg3OTsKCi8vLyBDaGFyYWN0ZXIgJ3onLgpjb25zdCBpbnQgJHogPSAweDdBOwoKLy8vIENoYXJhY3RlciAneycuCmNvbnN0IGludCAkbGJyYWNlID0gMHg3QjsKCi8vLyBDaGFyYWN0ZXIgJ3snLgpjb25zdCBpbnQgJG9wZW5fYnJhY2UgPSAweDdCOwoKLy8vIENoYXJhY3RlciAnfCcuCmNvbnN0IGludCAkcGlwZSA9IDB4N0M7CgovLy8gQ2hhcmFjdGVyICd8Jy4KY29uc3QgaW50ICRiYXIgPSAweDdDOwoKLy8vIENoYXJhY3RlciAnfScuCmNvbnN0IGludCAkcmJyYWNlID0gMHg3RDsKCi8vLyBDaGFyYWN0ZXIgJ30nLgpjb25zdCBpbnQgJGNsb3NlX2JyYWNlID0gMHg3RDsKCi8vLyBDaGFyYWN0ZXIgJ34nLgpjb25zdCBpbnQgJHRpbGRlID0gMHg3RTsKgf4ATkk8ATgEUARJREU/BE00P0MEUDQESzcpARcBKBcBKRcBJxcBJRcBLRcBIRcBKBcBHhcBIxYBKBYBNRcBIxYBJhYBIxYBKRYBIxYBIhYBKhcBNRcBKhcBNhcBKhcBMRcBKhcBMxcBIBcBJxYBJBcBIBcBKBYBKRYBKhYBKBYBIBcBFwEVGQETHwEfGAETGQETIAETHQETGAETFQETGgETGwEfFwETHQETGAETHgETIAETGgETHgETJAETGgETHwETJQETHAETGAETGQETGQETGAETFwETHAETGQETGwETHAETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETGQETHQETFgETHQETGgETHgETGQETFgETIAETGgETHwETHAETFgETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETHAETIAETHQETHAETIQETHgETGQETFwETFQETHgETHQETHQETGQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETFQETGgETHgETGAETFwETGgETHwETGQEbcGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0VGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9wYWNrYWdlX2NvbmZpZy9saWIvc3JjL3V0aWwuZGFydI8QLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBVdGlsaXR5IG1ldGhvZHMgdXNlZCBieSBtb3JlIHRoYW4gb25lIGxpYnJhcnkgaW4gdGhlIHBhY2thZ2UuCmxpYnJhcnkgcGFja2FnZV9jb25maWcudXRpbDsKCmltcG9ydCAicGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0IjsKCi8vIEFsbCBBU0NJSSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHZhbGlkIGluIGEgcGFja2FnZSBuYW1lLCB3aXRoIHNwYWNlCi8vIGZvciBhbGwgdGhlIGludmFsaWQgb25lcyAoaW5jbHVkaW5nIHNwYWNlKS4KY29uc3QgU3RyaW5nIF92YWxpZFBhY2thZ2VOYW1lQ2hhcmFjdGVycyA9CiAgICByIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uIDAxMjM0NTY3ODkgOyA9ICAiCiAgICByIkBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAgICBfIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6ICAgfiAiOwoKLy8vIFRlc3RzIHdoZXRoZXIgc29tZXRoaW5nIGlzIGEgdmFsaWQgRGFydCBwYWNrYWdlIG5hbWUuCmJvb2wgaXNWYWxpZFBhY2thZ2VOYW1lKFN0cmluZyBzdHJpbmcpIHsKICByZXR1cm4gX2ZpbmRJbnZhbGlkQ2hhcmFjdGVyKHN0cmluZykgPCAwOwp9CgovLy8gQ2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBwYWNrYWdlIG5hbWUuCi8vLwovLy8gVmFsaWQgcGFja2FnZSBuYW1lcyBjb250YWluIG9ubHkgY2hhcmFjdGVycyBpbiBbX3ZhbGlkUGFja2FnZU5hbWVDaGFyYWN0ZXJzXQovLy8gYW5kIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbm9uLScuJyBjaGFyYWN0ZXIuCi8vLwovLy8gUmV0dXJucyBgLTFgIGlmIHRoZSBzdHJpbmcgaXMgdmFsaWQuCi8vLyBPdGhlcndpc2UgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyLAovLy8gb3IgYHN0cmluZy5sZW5ndGhgIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gbm9uLScuJyBjaGFyYWN0ZXIuCmludCBfZmluZEludmFsaWRDaGFyYWN0ZXIoU3RyaW5nIHN0cmluZykgewogIC8vIEJlY29tZXMgbm9uLXplcm8gaWYgYW55IG5vbi0nLicgY2hhcmFjdGVyIGlzIGVuY291bnRlcmVkLgogIGludCBub25Eb3QgPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYyA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgaWYgKGMgPiAweDdmIHx8IF92YWxpZFBhY2thZ2VOYW1lQ2hhcmFjdGVycy5jb2RlVW5pdEF0KGMpIDw9ICRzcGFjZSkgewogICAgICByZXR1cm4gaTsKICAgIH0KICAgIG5vbkRvdCArPSBjIF4gJGRvdDsKICB9CiAgaWYgKG5vbkRvdCA9PSAwKSByZXR1cm4gc3RyaW5nLmxlbmd0aDsKICByZXR1cm4gLTE7Cn0KCi8vLyBWYWxpZGF0ZSB0aGF0IGEgVXJpIGlzIGEgdmFsaWQgcGFja2FnZTpVUkkuClN0cmluZyBjaGVja1ZhbGlkUGFja2FnZVVyaShVcmkgcGFja2FnZVVyaSkgewogIGlmIChwYWNrYWdlVXJpLnNjaGVtZSAhPSAicGFja2FnZSIpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIk5vdCBhIHBhY2thZ2U6IFVSSSIpOwogIH0KICBpZiAocGFja2FnZVVyaS5oYXNBdXRob3JpdHkpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgVVJJcyBtdXN0IG5vdCBoYXZlIGEgaG9zdCBwYXJ0Iik7CiAgfQogIGlmIChwYWNrYWdlVXJpLmhhc1F1ZXJ5KSB7CiAgICAvLyBBIHF1ZXJ5IG1ha2VzIG5vIHNlbnNlIGlmIHJlc29sdmVkIHRvIGEgZmlsZTogVVJJLgogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgICAgcGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLCAiUGFja2FnZSBVUklzIG11c3Qgbm90IGhhdmUgYSBxdWVyeSBwYXJ0Iik7CiAgfQogIGlmIChwYWNrYWdlVXJpLmhhc0ZyYWdtZW50KSB7CiAgICAvLyBXZSBjb3VsZCBsZWF2ZSB0aGUgZnJhZ21lbnQgYWZ0ZXIgdGhlIFVSTCB3aGVuIHJlc29sdmluZywKICAgIC8vIGJ1dCBpdCB3b3VsZCBiZSBvZGQgaWYgInBhY2thZ2U6Zm9vL2Zvby5kYXJ0IzEiIGFuZAogICAgLy8gInBhY2thZ2U6Zm9vL2Zvby5kYXJ0IzIiIHdlcmUgY29uc2lkZXJlZCBkaWZmZXJlbnQgbGlicmFyaWVzLgogICAgLy8gS2VlcCB0aGUgc3ludGF4IG9wZW4gaW4gY2FzZSB3ZSBldmVyIGdldCBtdWx0aXBsZSBsaWJyYXJpZXMgaW4gb25lIGZpbGUuCiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICJQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIGZyYWdtZW50IHBhcnQiKTsKICB9CiAgaWYgKHBhY2thZ2VVcmkucGF0aC5zdGFydHNXaXRoKCcvJykpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgVVJJcyBtdXN0IG5vdCBzdGFydCB3aXRoIGEgJy8nIik7CiAgfQogIGludCBmaXJzdFNsYXNoID0gcGFja2FnZVVyaS5wYXRoLmluZGV4T2YoJy8nKTsKICBpZiAoZmlyc3RTbGFzaCA9PSAtMSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUocGFja2FnZVVyaSwgInBhY2thZ2VVcmkiLAogICAgICAgICJQYWNrYWdlIFVSSXMgbXVzdCBzdGFydCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgZm9sbG93ZWQgYnkgYSAnLyciKTsKICB9CiAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZVVyaS5wYXRoLnN1YnN0cmluZygwLCBmaXJzdFNsYXNoKTsKICBpbnQgYmFkSW5kZXggPSBfZmluZEludmFsaWRDaGFyYWN0ZXIocGFja2FnZU5hbWUpOwogIGlmIChiYWRJbmRleCA+PSAwKSB7CiAgICBpZiAocGFja2FnZU5hbWUuaXNFbXB0eSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgIHBhY2thZ2VVcmksICJwYWNrYWdlVXJpIiwgIlBhY2thZ2UgbmFtZXMgbXVzIGJlIG5vbi1lbXB0eSIpOwogICAgfQogICAgaWYgKGJhZEluZGV4ID09IHBhY2thZ2VOYW1lLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsCiAgICAgICAgICAiUGFja2FnZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi0nLicgY2hhcmFjdGVyIik7CiAgICB9CiAgICBhc3NlcnQoYmFkSW5kZXggPCBwYWNrYWdlTmFtZS5sZW5ndGgpOwogICAgaW50IGJhZENoYXJDb2RlID0gcGFja2FnZU5hbWUuY29kZVVuaXRBdChiYWRJbmRleCk7CiAgICB2YXIgYmFkQ2hhciA9ICJVKyIgKyBiYWRDaGFyQ29kZS50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJyk7CiAgICBpZiAoYmFkQ2hhckNvZGUgPj0gMHgyMCAmJiBiYWRDaGFyQ29kZSA8PSAweDdlKSB7CiAgICAgIC8vIFByaW50YWJsZSBjaGFyYWN0ZXIuCiAgICAgIGJhZENoYXIgPSAiJyR7cGFja2FnZU5hbWVbYmFkSW5kZXhdfScgKCRiYWRDaGFyKSI7CiAgICB9CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICBwYWNrYWdlVXJpLCAicGFja2FnZVVyaSIsICJQYWNrYWdlIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJGJhZENoYXIiKTsKICB9CiAgcmV0dXJuIHBhY2thZ2VOYW1lOwp9CmMATk48AUIdASYBRS8rSEkBOiksAgEvBFE1BClARCs/EiwiSxAGGAQpDQIBMC4oIzkEISNNBB06I04EIEE7RVAjUQQpI00EMRo8TARBNRcfJUcGKj5IBis4SDYeOQYjTgQWAgEkcGFja2FnZTpwYWNrYWdlX2NvbmZpZy9zcmMvdXRpbC5kYXJ0Y2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9zY2FubmVyL2NoYXJhY3RlcnMuZGFydI18Ly8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC5zY2FubmVyLmNoYXJhY3RlcnM7Cgpjb25zdCBpbnQgJEVPRiA9IDA7CmNvbnN0IGludCAkU1RYID0gMjsKY29uc3QgaW50ICRCUyA9IDg7CmNvbnN0IGludCAkVEFCID0gOTsKY29uc3QgaW50ICRMRiA9IDEwOwpjb25zdCBpbnQgJFZUQUIgPSAxMTsKY29uc3QgaW50ICRGRiA9IDEyOwpjb25zdCBpbnQgJENSID0gMTM7CmNvbnN0IGludCAkU1BBQ0UgPSAzMjsKY29uc3QgaW50ICRCQU5HID0gMzM7CmNvbnN0IGludCAkRFEgPSAzNDsKY29uc3QgaW50ICRIQVNIID0gMzU7CmNvbnN0IGludCAkJCA9IDM2Owpjb25zdCBpbnQgJFBFUkNFTlQgPSAzNzsKY29uc3QgaW50ICRBTVBFUlNBTkQgPSAzODsKY29uc3QgaW50ICRTUSA9IDM5Owpjb25zdCBpbnQgJE9QRU5fUEFSRU4gPSA0MDsKY29uc3QgaW50ICRDTE9TRV9QQVJFTiA9IDQxOwpjb25zdCBpbnQgJFNUQVIgPSA0MjsKY29uc3QgaW50ICRQTFVTID0gNDM7CmNvbnN0IGludCAkQ09NTUEgPSA0NDsKY29uc3QgaW50ICRNSU5VUyA9IDQ1Owpjb25zdCBpbnQgJFBFUklPRCA9IDQ2Owpjb25zdCBpbnQgJFNMQVNIID0gNDc7CmNvbnN0IGludCAkMCA9IDQ4Owpjb25zdCBpbnQgJDEgPSA0OTsKY29uc3QgaW50ICQyID0gNTA7CmNvbnN0IGludCAkMyA9IDUxOwpjb25zdCBpbnQgJDQgPSA1MjsKY29uc3QgaW50ICQ1ID0gNTM7CmNvbnN0IGludCAkNiA9IDU0Owpjb25zdCBpbnQgJDcgPSA1NTsKY29uc3QgaW50ICQ4ID0gNTY7CmNvbnN0IGludCAkOSA9IDU3Owpjb25zdCBpbnQgJENPTE9OID0gNTg7CmNvbnN0IGludCAkU0VNSUNPTE9OID0gNTk7CmNvbnN0IGludCAkTFQgPSA2MDsKY29uc3QgaW50ICRFUSA9IDYxOwpjb25zdCBpbnQgJEdUID0gNjI7CmNvbnN0IGludCAkUVVFU1RJT04gPSA2MzsKY29uc3QgaW50ICRBVCA9IDY0Owpjb25zdCBpbnQgJEEgPSA2NTsKY29uc3QgaW50ICRCID0gNjY7CmNvbnN0IGludCAkQyA9IDY3Owpjb25zdCBpbnQgJEQgPSA2ODsKY29uc3QgaW50ICRFID0gNjk7CmNvbnN0IGludCAkRiA9IDcwOwpjb25zdCBpbnQgJEcgPSA3MTsKY29uc3QgaW50ICRIID0gNzI7CmNvbnN0IGludCAkSSA9IDczOwpjb25zdCBpbnQgJEogPSA3NDsKY29uc3QgaW50ICRLID0gNzU7CmNvbnN0IGludCAkTCA9IDc2Owpjb25zdCBpbnQgJE0gPSA3NzsKY29uc3QgaW50ICROID0gNzg7CmNvbnN0IGludCAkTyA9IDc5Owpjb25zdCBpbnQgJFAgPSA4MDsKY29uc3QgaW50ICRRID0gODE7CmNvbnN0IGludCAkUiA9IDgyOwpjb25zdCBpbnQgJFMgPSA4MzsKY29uc3QgaW50ICRUID0gODQ7CmNvbnN0IGludCAkVSA9IDg1Owpjb25zdCBpbnQgJFYgPSA4NjsKY29uc3QgaW50ICRXID0gODc7CmNvbnN0IGludCAkWCA9IDg4Owpjb25zdCBpbnQgJFkgPSA4OTsKY29uc3QgaW50ICRaID0gOTA7CmNvbnN0IGludCAkT1BFTl9TUVVBUkVfQlJBQ0tFVCA9IDkxOwpjb25zdCBpbnQgJEJBQ0tTTEFTSCA9IDkyOwpjb25zdCBpbnQgJENMT1NFX1NRVUFSRV9CUkFDS0VUID0gOTM7CmNvbnN0IGludCAkQ0FSRVQgPSA5NDsKY29uc3QgaW50ICRfID0gOTU7CmNvbnN0IGludCAkQkFDS1BJTkcgPSA5NjsKY29uc3QgaW50ICRhID0gOTc7CmNvbnN0IGludCAkYiA9IDk4Owpjb25zdCBpbnQgJGMgPSA5OTsKY29uc3QgaW50ICRkID0gMTAwOwpjb25zdCBpbnQgJGUgPSAxMDE7CmNvbnN0IGludCAkZiA9IDEwMjsKY29uc3QgaW50ICRnID0gMTAzOwpjb25zdCBpbnQgJGggPSAxMDQ7CmNvbnN0IGludCAkaSA9IDEwNTsKY29uc3QgaW50ICRqID0gMTA2Owpjb25zdCBpbnQgJGsgPSAxMDc7CmNvbnN0IGludCAkbCA9IDEwODsKY29uc3QgaW50ICRtID0gMTA5Owpjb25zdCBpbnQgJG4gPSAxMTA7CmNvbnN0IGludCAkbyA9IDExMTsKY29uc3QgaW50ICRwID0gMTEyOwpjb25zdCBpbnQgJHEgPSAxMTM7CmNvbnN0IGludCAkciA9IDExNDsKY29uc3QgaW50ICRzID0gMTE1Owpjb25zdCBpbnQgJHQgPSAxMTY7CmNvbnN0IGludCAkdSA9IDExNzsKY29uc3QgaW50ICR2ID0gMTE4Owpjb25zdCBpbnQgJHcgPSAxMTk7CmNvbnN0IGludCAkeCA9IDEyMDsKY29uc3QgaW50ICR5ID0gMTIxOwpjb25zdCBpbnQgJHogPSAxMjI7CmNvbnN0IGludCAkT1BFTl9DVVJMWV9CUkFDS0VUID0gMTIzOwpjb25zdCBpbnQgJEJBUiA9IDEyNDsKY29uc3QgaW50ICRDTE9TRV9DVVJMWV9CUkFDS0VUID0gMTI1Owpjb25zdCBpbnQgJFRJTERFID0gMTI2Owpjb25zdCBpbnQgJERFTCA9IDEyNzsKY29uc3QgaW50ICROQlNQID0gMTYwOwpjb25zdCBpbnQgJExTID0gMHgyMDI4Owpjb25zdCBpbnQgJFBTID0gMHgyMDI5OwoKY29uc3QgaW50ICRGSVJTVF9TVVJST0dBVEUgPSAweGQ4MDA7CmNvbnN0IGludCAkTEFTVF9TVVJST0dBVEUgPSAweGRmZmY7CmNvbnN0IGludCAkTEFTVF9DT0RFX1BPSU5UID0gMHgxMGZmZmY7Cgpib29sIGlzRGlnaXQoaW50IGNoYXJhY3RlckNvZGUpIHsKICByZXR1cm4gJDAgPD0gY2hhcmFjdGVyQ29kZSAmJiBjaGFyYWN0ZXJDb2RlIDw9ICQ5Owp9Cgpib29sIGlzSGV4RGlnaXQoaW50IGNoYXJhY3RlckNvZGUpIHsKICBpZiAoY2hhcmFjdGVyQ29kZSA8PSAkOSkgcmV0dXJuICQwIDw9IGNoYXJhY3RlckNvZGU7CiAgY2hhcmFjdGVyQ29kZSB8PSAkYSBeICRBOwogIHJldHVybiAoJGEgPD0gY2hhcmFjdGVyQ29kZSAmJiBjaGFyYWN0ZXJDb2RlIDw9ICRmKTsKfQoKaW50IGhleERpZ2l0VmFsdWUoaW50IGhleERpZ2l0KSB7CiAgYXNzZXJ0KGlzSGV4RGlnaXQoaGV4RGlnaXQpKTsKICAvLyBoZXhEaWdpdCBpcyBvbmUgb2YgJzAnLi4nOScsICdBJy4uJ0YnIGFuZCAnYScuLidmJy4KICBpZiAoaGV4RGlnaXQgPD0gJDkpIHJldHVybiBoZXhEaWdpdCAtICQwOwogIHJldHVybiAoaGV4RGlnaXQgfCAoJGEgXiAkQSkpIC0gKCRhIC0gMTApOwp9Cgpib29sIGlzVW5pY29kZVNjYWxhclZhbHVlKGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSA8ICRGSVJTVF9TVVJST0dBVEUgfHwKICAgICAgKHZhbHVlID4gJExBU1RfU1VSUk9HQVRFICYmIHZhbHVlIDw9ICRMQVNUX0NPREVfUE9JTlQpOwp9Cgpib29sIGlzVXRmMTZMZWFkU3Vycm9nYXRlKGludCB2YWx1ZSkgewogIHJldHVybiB2YWx1ZSA+PSAweGQ4MDAgJiYgdmFsdWUgPD0gMHhkYmZmOwp9Cgpib29sIGlzVXRmMTZUcmFpbFN1cnJvZ2F0ZShpbnQgdmFsdWUpIHsKICByZXR1cm4gdmFsdWUgPj0gMHhkYzAwICYmIHZhbHVlIDw9IDB4ZGZmZjsKfQqAlQBOTjwBMAEUFBMUFBYUFBcWFBYTGRsUHB0WFhcXGBcTExMTExMTExMTFxsUFBQaFBMTExMTExMTExMTExMTExMTExMTExMTExMTJRsmFxMaExMTFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFiYYFhcYGAElJCcBIjUCASU3HDcCASIgOSwtAgEnJT4CASctAgEoLQIBN3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnRoZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnSP8y8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQuc2Nhbm5lci50b2tlbl9jb25zdGFudHM7CgppbXBvcnQgJ2NoYXJhY3RlcnMuZGFydCc7Cgpjb25zdCBpbnQgRU9GX1RPS0VOID0gMDsKCmNvbnN0IGludCBLRVlXT1JEX1RPS0VOID0gJGs7CmNvbnN0IGludCBJREVOVElGSUVSX1RPS0VOID0gJGE7CmNvbnN0IGludCBTQ1JJUFRfVE9LRU4gPSAkYjsKY29uc3QgaW50IEJBRF9JTlBVVF9UT0tFTiA9ICRYOwpjb25zdCBpbnQgRE9VQkxFX1RPS0VOID0gJGQ7CmNvbnN0IGludCBJTlRfVE9LRU4gPSAkaTsKY29uc3QgaW50IFJFQ09WRVJZX1RPS0VOID0gJHI7CmNvbnN0IGludCBIRVhBREVDSU1BTF9UT0tFTiA9ICR4Owpjb25zdCBpbnQgU1RSSU5HX1RPS0VOID0gJFNROwoKY29uc3QgaW50IEFNUEVSU0FORF9UT0tFTiA9ICRBTVBFUlNBTkQ7CmNvbnN0IGludCBCQUNLUElOR19UT0tFTiA9ICRCQUNLUElORzsKY29uc3QgaW50IEJBQ0tTTEFTSF9UT0tFTiA9ICRCQUNLU0xBU0g7CmNvbnN0IGludCBCQU5HX1RPS0VOID0gJEJBTkc7CmNvbnN0IGludCBCQVJfVE9LRU4gPSAkQkFSOwpjb25zdCBpbnQgQ09MT05fVE9LRU4gPSAkQ09MT047CmNvbnN0IGludCBDT01NQV9UT0tFTiA9ICRDT01NQTsKY29uc3QgaW50IEVRX1RPS0VOID0gJEVROwpjb25zdCBpbnQgR1RfVE9LRU4gPSAkR1Q7CmNvbnN0IGludCBIQVNIX1RPS0VOID0gJEhBU0g7CmNvbnN0IGludCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4gPSAkT1BFTl9DVVJMWV9CUkFDS0VUOwpjb25zdCBpbnQgT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiA9ICRPUEVOX1NRVUFSRV9CUkFDS0VUOwpjb25zdCBpbnQgT1BFTl9QQVJFTl9UT0tFTiA9ICRPUEVOX1BBUkVOOwpjb25zdCBpbnQgTFRfVE9LRU4gPSAkTFQ7CmNvbnN0IGludCBNSU5VU19UT0tFTiA9ICRNSU5VUzsKY29uc3QgaW50IFBFUklPRF9UT0tFTiA9ICRQRVJJT0Q7CmNvbnN0IGludCBQTFVTX1RPS0VOID0gJFBMVVM7CmNvbnN0IGludCBRVUVTVElPTl9UT0tFTiA9ICRRVUVTVElPTjsKY29uc3QgaW50IEFUX1RPS0VOID0gJEFUOwpjb25zdCBpbnQgQ0xPU0VfQ1VSTFlfQlJBQ0tFVF9UT0tFTiA9ICRDTE9TRV9DVVJMWV9CUkFDS0VUOwpjb25zdCBpbnQgQ0xPU0VfU1FVQVJFX0JSQUNLRVRfVE9LRU4gPSAkQ0xPU0VfU1FVQVJFX0JSQUNLRVQ7CmNvbnN0IGludCBDTE9TRV9QQVJFTl9UT0tFTiA9ICRDTE9TRV9QQVJFTjsKY29uc3QgaW50IFNFTUlDT0xPTl9UT0tFTiA9ICRTRU1JQ09MT047CmNvbnN0IGludCBTTEFTSF9UT0tFTiA9ICRTTEFTSDsKY29uc3QgaW50IFRJTERFX1RPS0VOID0gJFRJTERFOwpjb25zdCBpbnQgU1RBUl9UT0tFTiA9ICRTVEFSOwpjb25zdCBpbnQgUEVSQ0VOVF9UT0tFTiA9ICRQRVJDRU5UOwpjb25zdCBpbnQgQ0FSRVRfVE9LRU4gPSAkQ0FSRVQ7Cgpjb25zdCBpbnQgU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4gPSAxMjg7CmNvbnN0IGludCBMVF9FUV9UT0tFTiA9IFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOICsgMTsKY29uc3QgaW50IEZVTkNUSU9OX1RPS0VOID0gTFRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgU0xBU0hfRVFfVE9LRU4gPSBGVU5DVElPTl9UT0tFTiArIDE7CmNvbnN0IGludCBQRVJJT0RfUEVSSU9EX1BFUklPRF9UT0tFTiA9IFNMQVNIX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFBFUklPRF9QRVJJT0RfVE9LRU4gPSBQRVJJT0RfUEVSSU9EX1BFUklPRF9UT0tFTiArIDE7CmNvbnN0IGludCBFUV9FUV9FUV9UT0tFTiA9IFBFUklPRF9QRVJJT0RfVE9LRU4gKyAxOwpjb25zdCBpbnQgRVFfRVFfVE9LRU4gPSBFUV9FUV9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBMVF9MVF9FUV9UT0tFTiA9IEVRX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IExUX0xUX1RPS0VOID0gTFRfTFRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfRVFfVE9LRU4gPSBMVF9MVF9UT0tFTiArIDE7CmNvbnN0IGludCBHVF9HVF9FUV9UT0tFTiA9IEdUX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IElOREVYX0VRX1RPS0VOID0gR1RfR1RfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgSU5ERVhfVE9LRU4gPSBJTkRFWF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBCQU5HX0VRX0VRX1RPS0VOID0gSU5ERVhfVE9LRU4gKyAxOwpjb25zdCBpbnQgQkFOR19FUV9UT0tFTiA9IEJBTkdfRVFfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQU1QRVJTQU5EX0FNUEVSU0FORF9UT0tFTiA9IEJBTkdfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQU1QRVJTQU5EX0FNUEVSU0FORF9FUV9UT0tFTiA9IEFNUEVSU0FORF9BTVBFUlNBTkRfVE9LRU4gKyAxOwpjb25zdCBpbnQgQU1QRVJTQU5EX0VRX1RPS0VOID0gQU1QRVJTQU5EX0FNUEVSU0FORF9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBCQVJfQkFSX1RPS0VOID0gQU1QRVJTQU5EX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IEJBUl9CQVJfRVFfVE9LRU4gPSBCQVJfQkFSX1RPS0VOICsgMTsKY29uc3QgaW50IEJBUl9FUV9UT0tFTiA9IEJBUl9CQVJfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgU1RBUl9FUV9UT0tFTiA9IEJBUl9FUV9UT0tFTiArIDE7CmNvbnN0IGludCBQTFVTX1BMVVNfVE9LRU4gPSBTVEFSX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFBMVVNfRVFfVE9LRU4gPSBQTFVTX1BMVVNfVE9LRU4gKyAxOwpjb25zdCBpbnQgTUlOVVNfTUlOVVNfVE9LRU4gPSBQTFVTX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IE1JTlVTX0VRX1RPS0VOID0gTUlOVVNfTUlOVVNfVE9LRU4gKyAxOwpjb25zdCBpbnQgVElMREVfU0xBU0hfRVFfVE9LRU4gPSBNSU5VU19FUV9UT0tFTiArIDE7CmNvbnN0IGludCBUSUxERV9TTEFTSF9UT0tFTiA9IFRJTERFX1NMQVNIX0VRX1RPS0VOICsgMTsKY29uc3QgaW50IFBFUkNFTlRfRVFfVE9LRU4gPSBUSUxERV9TTEFTSF9UT0tFTiArIDE7CmNvbnN0IGludCBHVF9HVF9UT0tFTiA9IFBFUkNFTlRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgQ0FSRVRfRVFfVE9LRU4gPSBHVF9HVF9UT0tFTiArIDE7CmNvbnN0IGludCBDT01NRU5UX1RPS0VOID0gQ0FSRVRfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTiA9IENPTU1FTlRfVE9LRU4gKyAxOwpjb25zdCBpbnQgUVVFU1RJT05fUEVSSU9EX1RPS0VOID0gU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTiArIDE7CmNvbnN0IGludCBRVUVTVElPTl9RVUVTVElPTl9UT0tFTiA9IFFVRVNUSU9OX1BFUklPRF9UT0tFTiArIDE7CmNvbnN0IGludCBRVUVTVElPTl9RVUVTVElPTl9FUV9UT0tFTiA9IFFVRVNUSU9OX1FVRVNUSU9OX1RPS0VOICsgMTsKY29uc3QgaW50IEdFTkVSSUNfTUVUSE9EX1RZUEVfQVNTSUdOX1RPS0VOID0gUVVFU1RJT05fUVVFU1RJT05fRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgR0VORVJJQ19NRVRIT0RfVFlQRV9MSVNUX1RPS0VOID0gR0VORVJJQ19NRVRIT0RfVFlQRV9BU1NJR05fVE9LRU4gKyAxOwpjb25zdCBpbnQgR1RfR1RfR1RfVE9LRU4gPSBHRU5FUklDX01FVEhPRF9UWVBFX0xJU1RfVE9LRU4gKyAxOwpjb25zdCBpbnQgUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT05fVE9LRU4gPSBHVF9HVF9HVF9UT0tFTiArIDE7CmNvbnN0IGludCBHVF9HVF9HVF9FUV9UT0tFTiA9IFBFUklPRF9QRVJJT0RfUEVSSU9EX1FVRVNUSU9OX1RPS0VOICsgMTsKY29uc3QgaW50IFFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOID0gR1RfR1RfR1RfRVFfVE9LRU4gKyAxOwpjb25zdCBpbnQgUVVFU1RJT05fUEVSSU9EX1BFUklPRF9UT0tFTiA9CiAgICBRVUVTVElPTl9QRVJJT0RfT1BFTl9TUVVBUkVfQlJBQ0tFVF9UT0tFTiArIDE7CmAATk48ATUBGgEZAR4hHSAdGh8iHgEoJigeHCAgGhoeOjwqGiAiHiYaPD4sKCAgHiQgASw4LC87QDQsLCwpLC8sLjA5SEEyMC8sLy8xMjU4NC4sLkVNP0RNUT9ER00pMwE8cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3Rva2VuX2NvbnN0YW50cy5kYXJ0bWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9zY2FubmVyL3N0cmluZ19jYW5vbmljYWxpemVyLmRhcnSMrC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQuc2Nhbm5lci5zdHJpbmdfY2Fub25pY2FsaXplcjsKCmltcG9ydCAnZGFydDpjb252ZXJ0JzsKCmNsYXNzIE5vZGUgewogIGR5bmFtaWMgLyogU3RyaW5nIHwgTGlzdDxpbnQ+ICovIGRhdGE7CiAgaW50IHN0YXJ0OwogIGludCBlbmQ7CiAgU3RyaW5nIHBheWxvYWQ7CiAgTm9kZSBuZXh0OwogIE5vZGUodGhpcy5kYXRhLCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCwgdGhpcy5wYXlsb2FkLCB0aGlzLm5leHQpOwp9CgovLy8gQSBoYXNoIHRhYmxlIGZvciB0cmlwbGVzOgovLy8gKGxpc3Qgb2YgYnl0ZXMsIHN0YXJ0LCBlbmQpIC0tPiBjYW5vbmljYWxpemVkIHN0cmluZwovLy8gVXNpbmcgdHJpcGxlcyBhdm9pZHMgYWxsb2NhdGluZyBzdHJpbmcgc2xpY2VzIGJlZm9yZSBjaGVja2luZyBpZiB0aGV5Ci8vLyBhcmUgY2Fub25pY2FsLgovLy8KLy8vIEdpdmVzIGFib3V0IDMlIHNwZWVkdXAgb24gZGFydDJqcy4KY2xhc3MgU3RyaW5nQ2Fub25pY2FsaXplciB7CiAgLy8vIE1hc2sgYXdheSB0b3AgYml0cyB0byBrZWVwIGhhc2ggY2FsY3VsYXRpb24gd2l0aGluIDMyLWJpdCBTTUkgcmFuZ2UuCiAgc3RhdGljIGNvbnN0IGludCBNQVNLID0gMTYgKiAxMDI0ICogMTAyNCAtIDE7CgogIHN0YXRpYyBjb25zdCBpbnQgSU5JVElBTF9TSVpFID0gOCAqIDEwMjQ7CgogIC8vLyBMaW5lYXIgc2l6ZSBvZiBhIGhhc2ggdGFibGUuCiAgaW50IF9zaXplID0gSU5JVElBTF9TSVpFOwoKICAvLy8gSXRlbXMgaW4gYSBoYXNoIHRhYmxlLgogIGludCBfY291bnQgPSAwOwoKICAvLy8gVGhlIHRhYmxlIGl0c2VsZi4KICBMaXN0PE5vZGU+IF9ub2RlcyA9IG5ldyBMaXN0PE5vZGU+KElOSVRJQUxfU0laRSk7CgogIHN0YXRpYyBTdHJpbmcgZGVjb2RlKExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgYXNjaWlPbmx5KSB7CiAgICBTdHJpbmcgczsKICAgIGlmIChhc2NpaU9ubHkpIHsKICAgICAgcyA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzdGFydCwgZW5kKTsKICAgIH0gZWxzZSB7CiAgICAgIHMgPSBuZXcgVXRmOERlY29kZXIoYWxsb3dNYWxmb3JtZWQ6IHRydWUpLmNvbnZlcnQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICB9CiAgICByZXR1cm4gczsKICB9CgogIHN0YXRpYyBpbnQgaGFzaEJ5dGVzKExpc3Q8aW50PiBkYXRhLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBoID0gNTM4MTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGggPSAoKGggPDwgNSkgKyBoICsgZGF0YVtpXSkgJiBNQVNLOwogICAgfQogICAgcmV0dXJuIGg7CiAgfQoKICBzdGF0aWMgaW50IGhhc2hTdHJpbmcoU3RyaW5nIGRhdGEsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaW50IGggPSA1MzgxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgaCA9ICgoaCA8PCA1KSArIGggKyBkYXRhLmNvZGVVbml0QXQoaSkpICYgTUFTSzsKICAgIH0KICAgIHJldHVybiBoOwogIH0KCiAgcmVoYXNoKCkgewogICAgaW50IG5ld1NpemUgPSBfc2l6ZSAqIDI7CiAgICBMaXN0PE5vZGU+IG5ld05vZGVzID0gbmV3IExpc3Q8Tm9kZT4obmV3U2l6ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zaXplOyBpKyspIHsKICAgICAgTm9kZSB0ID0gX25vZGVzW2ldOwogICAgICB3aGlsZSAodCAhPSBudWxsKSB7CiAgICAgICAgTm9kZSBuID0gdC5uZXh0OwogICAgICAgIGludCBuZXdJbmRleCA9IHQuZGF0YSBpcyBTdHJpbmcKICAgICAgICAgICAgPyBoYXNoU3RyaW5nKHQuZGF0YSwgdC5zdGFydCwgdC5lbmQpICYgKG5ld1NpemUgLSAxKQogICAgICAgICAgICA6IGhhc2hCeXRlcyh0LmRhdGEsIHQuc3RhcnQsIHQuZW5kKSAmIChuZXdTaXplIC0gMSk7CiAgICAgICAgTm9kZSBzID0gbmV3Tm9kZXNbbmV3SW5kZXhdOwogICAgICAgIHQubmV4dCA9IHM7CiAgICAgICAgbmV3Tm9kZXNbbmV3SW5kZXhdID0gdDsKICAgICAgICB0ID0gbjsKICAgICAgfQogICAgfQogICAgX3NpemUgPSBuZXdTaXplOwogICAgX25vZGVzID0gbmV3Tm9kZXM7CiAgfQoKICBTdHJpbmcgY2Fub25pY2FsaXplKGRhdGEsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBhc2NpaU9ubHkpIHsKICAgIGlmIChfY291bnQgPiBfc2l6ZSkgcmVoYXNoKCk7CiAgICBpbnQgaW5kZXggPSBkYXRhIGlzIFN0cmluZwogICAgICAgID8gaGFzaFN0cmluZyhkYXRhLCBzdGFydCwgZW5kKQogICAgICAgIDogaGFzaEJ5dGVzKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgaW5kZXggPSBpbmRleCAmIChfc2l6ZSAtIDEpOwogICAgTm9kZSBzID0gX25vZGVzW2luZGV4XTsKICAgIE5vZGUgdCA9IHM7CiAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CiAgICB3aGlsZSAodCAhPSBudWxsKSB7CiAgICAgIGlmICh0LmVuZCAtIHQuc3RhcnQgPT0gbGVuKSB7CiAgICAgICAgaW50IGkgPSBzdGFydCwgaiA9IHQuc3RhcnQ7CiAgICAgICAgd2hpbGUgKGkgPCBlbmQgJiYgZGF0YVtpXSA9PSB0LmRhdGFbal0pIHsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT0gZW5kKSB7CiAgICAgICAgICByZXR1cm4gdC5wYXlsb2FkOwogICAgICAgIH0KICAgICAgfQogICAgICB0ID0gdC5uZXh0OwogICAgfQogICAgU3RyaW5nIHBheWxvYWQ7CiAgICBpZiAoZGF0YSBpcyBTdHJpbmcpIHsKICAgICAgcGF5bG9hZCA9IGRhdGEuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgfSBlbHNlIHsKICAgICAgcGF5bG9hZCA9IGRlY29kZShkYXRhLCBzdGFydCwgZW5kLCBhc2NpaU9ubHkpOwogICAgfQogICAgX25vZGVzW2luZGV4XSA9IG5ldyBOb2RlKGRhdGEsIHN0YXJ0LCBlbmQsIHBheWxvYWQsIHMpOwogICAgX2NvdW50Kys7CiAgICByZXR1cm4gcGF5bG9hZDsKICB9CgogIGNsZWFyKCkgewogICAgX3NpemUgPSBJTklUSUFMX1NJWkU7CiAgICBfbm9kZXMgPSBuZXcgTGlzdDxOb2RlPihfc2l6ZSk7CiAgICBfY291bnQgPSAwOwogIH0KfQp9AE5OPAE6ARcBDSkNCxINQgIBHjlKEwQnHEswASwBIxwBHRIBGDQBTQ4VNg1LBg4EAT0SKCsGDgQBOxIoNgYOBAENHTMmGhoZKEFBJRQgDwgGFRcEAUIiHycnIRwQGxgkJDIPDwoYHAoIEgYUGiwNNQY8DhQEAQwaJBAEAgFBcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3N0cmluZ19jYW5vbmljYWxpemVyLmRhcnRgZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYmxhY2tsaXN0ZWRfY2xhc3Nlcy5kYXJ0gYkvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gTGlzdCBvZiBzcGVjaWFsIGNsYXNzZXMgaW4gZGFydDpjb3JlIHRoYXQgY2FuJ3QgYmUgc3ViY2xhc3NlZC4KY29uc3QgTGlzdDxTdHJpbmc+IGJsYWNrbGlzdGVkQ29yZUNsYXNzZXMgPSBbCiAgImJvb2wiLAogICJpbnQiLAogICJudW0iLAogICJkb3VibGUiLAogICJTdHJpbmciLAogICJOdWxsIgpdOwoPAE5OPAFCLgoJCQwMCQMBNHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9ibGFja2xpc3RlZF9jbGFzc2VzLmRhcnRsZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL2Zsb3dfYW5hbHlzaXMvZmxvd19hbmFseXNpcy5kYXJ0wAGRey8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CgovLy8gW0Fzc2lnbmVkVmFyaWFibGVzXSBpcyBhIGhlbHBlciBjbGFzcyBjYXBhYmxlIG9mIGNvbXB1dGluZyB0aGUgc2V0IG9mCi8vLyB2YXJpYWJsZXMgdGhhdCBhcmUgcG90ZW50aWFsbHkgd3JpdHRlbiB0bywgYW5kIHBvdGVudGlhbGx5IGNhcHR1cmVkIGJ5Ci8vLyBjbG9zdXJlcywgYXQgdmFyaW91cyBsb2NhdGlvbnMgaW5zaWRlIHRoZSBjb2RlIGJlaW5nIGFuYWx5emVkLiAgVGhpcyBjbGFzcwovLy8gc2hvdWxkIGJlIHVzZWQgcHJpb3IgdG8gcnVubmluZyBmbG93IGFuYWx5c2lzLCB0byBjb21wdXRlIHRoZSBzZXRzIG9mCi8vLyB2YXJpYWJsZXMgdG8gcGFzcyBpbiB0byBmbG93IGFuYWx5c2lzLgovLy8KLy8vIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0d28gcGhhc2VzLiAgSW4gdGhlIGZpcnN0IHBoYXNlLCB0aGUKLy8vIGNsaWVudCBzaG91bGQgdHJhdmVyc2UgdGhlIHNvdXJjZSBjb2RlIHJlY3Vyc2l2ZWx5LCBtYWtpbmcgY2FsbHMgdG8KLy8vIFtiZWdpbk5vZGVdIGFuZCBbZW5kTm9kZV0gdG8gaW5kaWNhdGUgdGhlIGNvbnN0cnVjdHMgaW4gd2hpY2ggd3JpdGVzIHNob3VsZAovLy8gYmUgdHJhY2tlZCwgYW5kIGNhbGxzIHRvIFt3cml0ZV0gdG8gaW5kaWNhdGUgd2hlbiBhIHdyaXRlIGlzIGVuY291bnRlcmVkLgovLy8gVGhlIG9yZGVyIG9mIHZpc2l0aW5nIGlzIG5vdCBpbXBvcnRhbnQgcHJvdmlkZWQgdGhhdCBuZXN0aW5nIGlzIHJlc3BlY3RlZC4KLy8vIFRoaXMgcGhhc2UgaXMgY2FsbGVkIHRoZSAicHJlLXRyYXZlcnNhbCIgYmVjYXVzZSBpdCBzaG91bGQgaGFwcGVuIHByaW9yIHRvCi8vLyBmbG93IGFuYWx5c2lzLgovLy8KLy8vIFRoZW4sIGluIHRoZSBzZWNvbmQgcGhhc2UsIHRoZSBjbGllbnQgbWF5IG1ha2UgcXVlcmllcyB1c2luZwovLy8gW2NhcHR1cmVkQW55d2hlcmVdLCBbd3JpdHRlbkluTm9kZV0sIGFuZCBbY2FwdHVyZWRJbk5vZGVdLgovLy8KLy8vIFdlIHVzZSB0aGUgdGVybSAibm9kZSIgdG8gcmVmZXIgZ2VuZXJhbGx5IHRvIGEgbG9vcCBzdGF0ZW1lbnQsIHN3aXRjaAovLy8gc3RhdGVtZW50LCB0cnkgc3RhdGVtZW50LCBsb29wIGNvbGxlY3Rpb24gZWxlbWVudCwgbG9jYWwgZnVuY3Rpb24sIG9yCi8vLyBjbG9zdXJlLgpjbGFzcyBBc3NpZ25lZFZhcmlhYmxlczxOb2RlLCBWYXJpYWJsZT4gewogIC8vLyBNYXBwaW5nIGZyb20gYSBub2RlIHRvIHRoZSBpbmZvIGZvciB0aGF0IG5vZGUuCiAgZmluYWwgTWFwPE5vZGUsIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+PiBfaW5mbyA9CiAgICAgIG5ldyBNYXA8Tm9kZSwgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4+LmlkZW50aXR5KCk7CgogIC8vLyBJbmZvIGZvciB0aGUgdmFyaWFibGVzIHdyaXR0ZW4gb3IgY2FwdHVyZWQgYW55d2hlcmUgaW4gdGhlIGNvZGUgYmVpbmcKICAvLy8gYW5hbHl6ZWQuCiAgZmluYWwgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4gX2FueXdoZXJlID0KICAgICAgbmV3IEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+KCk7CgogIC8vLyBTdGFjayBvZiBpbmZvIGZvciBub2RlcyB0aGF0IGhhdmUgYmVlbiBlbnRlcmVkIGJ1dCBub3QgeWV0IGxlZnQuCiAgZmluYWwgTGlzdDxBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPj4gX3N0YWNrID0gWwogICAgbmV3IEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+KCkKICBdOwoKICAvLy8gV2hlbiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCB0aGUgc2V0IG9mIGluZm8gb2JqZWN0cyB0aGF0IGhhdmUgYmVlbgogIC8vLyByZXRyaWV2ZWQgYnkgW2RlZmVyTm9kZV0gYnV0IG5vdCB5ZXQgc2VudCB0byBbc3RvcmVOb2RlXS4KICBmaW5hbCBTZXQ8QXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4+IF9kZWZlcnJlZEluZm9zID0KICAgICAgbmV3IFNldDxBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPj4uaWRlbnRpdHkoKTsKCiAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHByZS10cmF2ZXJzYWwsIHRvIG1hcmsgdGhlIHN0YXJ0IG9mIGEKICAvLy8gbG9vcCBzdGF0ZW1lbnQsIHN3aXRjaCBzdGF0ZW1lbnQsIHRyeSBzdGF0ZW1lbnQsIGxvb3AgY29sbGVjdGlvbiBlbGVtZW50LAogIC8vLyBsb2NhbCBmdW5jdGlvbiwgb3IgY2xvc3VyZSB3aGljaCBtaWdodCBuZWVkIHRvIGJlIHF1ZXJpZWQgbGF0ZXIuCiAgLy8vCiAgLy8vIFtpc0Nsb3N1cmVdIHNob3VsZCBiZSB0cnVlIGlmIHRoZSBub2RlIGlzIGEgbG9jYWwgZnVuY3Rpb24gb3IgY2xvc3VyZS4KICAvLy8KICAvLy8gVGhlIHNwYW4gYmV0d2VlbiB0aGUgY2FsbCB0byBbYmVnaW5Ob2RlXSBhbmQgW2VuZE5vZGVdIHNob3VsZCBjb3ZlciBhbnkKICAvLy8gc3RhdGVtZW50cyBhbmQgZXhwcmVzc2lvbnMgdGhhdCBtaWdodCBiZSBjcm9zc2VkIGJ5IGEgYmFja3dhcmRzIGp1bXAuICBTbwogIC8vLyBmb3IgaW5zdGFuY2UsIGluIGEgImZvciIgbG9vcCwgdGhlIGNvbmRpdGlvbiwgdXBkYXRlcnMsIGFuZCBib2R5IHNob3VsZCBiZQogIC8vLyBjb3ZlcmVkLCBidXQgdGhlIGluaXRpYWxpemVycyBzaG91bGQgbm90LiAgU2ltaWxhcmx5LCBpbiBhIHN3aXRjaAogIC8vLyBzdGF0ZW1lbnQsIHRoZSBib2R5IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHNob3VsZCBiZSBjb3ZlcmVkLCBidXQgdGhlCiAgLy8vIHN3aXRjaCBleHByZXNzaW9uIHNob3VsZCBub3QuCiAgdm9pZCBiZWdpbk5vZGUoKSB7CiAgICBfc3RhY2suYWRkKG5ldyBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPigpKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBwcmUtdHJhdmVyc2FsLCB0byBpbmRpY2F0ZSB0aGF0IHRoZQogIC8vLyBkZWNsYXJhdGlvbiBvZiBhIHZhcmlhYmxlIGhhcyBiZWVuIGZvdW5kLgogIC8vLwogIC8vLyBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiB0byBiZSBzZWVuIHByaW9yIHRvIGl0cyB1c2UgKHRoaXMKICAvLy8gaXMgdG8gYWxsb3cgZm9yIGVycm9yIHJlY292ZXJ5IGluIHRoZSBhbmFseXplcikuCiAgdm9pZCBkZWNsYXJlKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICBfc3RhY2subGFzdC5fZGVjbGFyZWQuYWRkKHZhcmlhYmxlKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGR1cmluZyBwcmUtdHJhdmVyc2FsLCB0byBtYXJrIHRoZSBlbmQgb2YgYQogIC8vLyBsb29wIHN0YXRlbWVudCwgc3dpdGNoIHN0YXRlbWVudCwgdHJ5IHN0YXRlbWVudCwgbG9vcCBjb2xsZWN0aW9uIGVsZW1lbnQsCiAgLy8vIGxvY2FsIGZ1bmN0aW9uLCBvciBjbG9zdXJlIHdoaWNoIG1pZ2h0IG5lZWQgdG8gYmUgcXVlcmllZCBsYXRlci4KICAvLy8KICAvLy8gW2lzQ2xvc3VyZV0gc2hvdWxkIGJlIHRydWUgaWYgdGhlIG5vZGUgaXMgYSBsb2NhbCBmdW5jdGlvbiBvciBjbG9zdXJlLgogIC8vLwogIC8vLyBJbiBjb250cmFzdCB0byBbZW5kTm9kZV0sIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc3RvcmUgdGhlIGRhdGEgZ2F0aGVyZWQgZm9yCiAgLy8vIHRoZSBub2RlIGZvciBsYXRlciB1c2U7IGluc3RlYWQgaXQgcmV0dXJucyBpdCB0byB0aGUgY2FsbGVyLiAgQXQgYSBsYXRlcgogIC8vLyB0aW1lLCB0aGUgY2FsbGVyIHNob3VsZCBwYXNzIHRoZSByZXR1cm5lZCBkYXRhIHRvIFtzdG9yZU5vZGVJbmZvXS4KICAvLy8KICAvLy8gU2VlIFtiZWdpbk5vZGVdIGZvciBtb3JlIGRldGFpbHMuCiAgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4gZGVmZXJOb2RlKHtib29sIGlzQ2xvc3VyZTogZmFsc2V9KSB7CiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0gX3N0YWNrLnJlbW92ZUxhc3QoKTsKICAgIGluZm8uX3dyaXR0ZW4ucmVtb3ZlQWxsKGluZm8uX2RlY2xhcmVkKTsKICAgIGluZm8uX2NhcHR1cmVkLnJlbW92ZUFsbChpbmZvLl9kZWNsYXJlZCk7CiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBsYXN0ID0gX3N0YWNrLmxhc3Q7CiAgICBsYXN0Ll93cml0dGVuLmFkZEFsbChpbmZvLl93cml0dGVuKTsKICAgIGxhc3QuX2NhcHR1cmVkLmFkZEFsbChpbmZvLl9jYXB0dXJlZCk7CiAgICBpZiAoaXNDbG9zdXJlKSB7CiAgICAgIGxhc3QuX2NhcHR1cmVkLmFkZEFsbChpbmZvLl93cml0dGVuKTsKICAgICAgX2FueXdoZXJlLl9jYXB0dXJlZC5hZGRBbGwoaW5mby5fd3JpdHRlbik7CiAgICB9CiAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgZGVmZXJyZWQgdGhpcyBpbmZvLCBzb21ldGhpbmcgaGFzIGdvbmUgaG9ycmlibHkgd3JvbmcuCiAgICBhc3NlcnQoX2RlZmVycmVkSW5mb3MuYWRkKGluZm8pKTsKICAgIHJldHVybiBpbmZvOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgZHVyaW5nIHByZS10cmF2ZXJzYWwsIHRvIGRpc2NhcmQgdGhlIGVmZmVjdHMgb2YKICAvLy8gdGhlIG1vc3QgcmVjZW50IHVubWF0Y2hlZCBjYWxsIHRvIFtiZWdpbk5vZGVdLgogIC8vLwogIC8vLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRyeS9jYXRjaC9maW5hbGx5IG5lZWRzIHRvIGJlIGRlc3VnYXJlZCBpbnRvCiAgLy8vIGEgdHJ5L2NhdGNoIG5lc3RlZCBpbnNpZGUgYSB0cnkvZmluYWxseSwgaG93ZXZlciB0aGUgcHJlLXRyYXZlcnNhbCBwaGFzZQogIC8vLyBvZiB0aGUgZnJvbnQgZW5kIGhhcHBlbnMgZHVyaW5nIHBhcnNpbmcsIHNvIHdoZW4gYSBgdHJ5YCBpcyBlbmNvdW50ZXJlZCwKICAvLy8gaXQgaXMgbm90IGtub3duIHdoZXRoZXIgaXQgd2lsbCBuZWVkIHRvIGJlIGRlc3VnYXJlZCBpbnRvIHR3byBuZXN0ZWQKICAvLy8gYHRyeWBzLiAgVG8gY29wZSB3aXRoIHRoaXMsIHRoZSBmcm9udCBlbmQgbWF5IGNhbGwgW2JlZ2luTm9kZV0gdHdpY2UgdXBvbgogIC8vLyBzZWVpbmcgdGhlIHR3byBgdHJ5YHMsIGFuZCBsYXRlciBpZiBpdCB0dXJucyBvdXQgdGhhdCBubyBkZXN1Z2FyaW5nIHdhcwogIC8vLyBuZWVkZWQsIHVzZSBbZGlzY2FyZE5vZGVdIHRvIGRpc2NhcmQgdGhlIGVmZmVjdHMgb2Ygb25lIG9mIHRoZSBbYmVnaW5Ob2RlXQogIC8vLyBjYWxscy4KICB2b2lkIGRpc2NhcmROb2RlKCkgewogICAgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4gZGlzY2FyZGVkID0gX3N0YWNrLnJlbW92ZUxhc3QoKTsKICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IGxhc3QgPSBfc3RhY2subGFzdDsKICAgIGxhc3QuX2RlY2xhcmVkLmFkZEFsbChkaXNjYXJkZWQuX2RlY2xhcmVkKTsKICAgIGxhc3QuX3dyaXR0ZW4uYWRkQWxsKGRpc2NhcmRlZC5fd3JpdHRlbik7CiAgICBsYXN0Ll9jYXB0dXJlZC5hZGRBbGwoZGlzY2FyZGVkLl9jYXB0dXJlZCk7CiAgfQoKICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgcHJlLXRyYXZlcnNhbCwgdG8gbWFyayB0aGUgZW5kIG9mIGEKICAvLy8gbG9vcCBzdGF0ZW1lbnQsIHN3aXRjaCBzdGF0ZW1lbnQsIHRyeSBzdGF0ZW1lbnQsIGxvb3AgY29sbGVjdGlvbiBlbGVtZW50LAogIC8vLyBsb2NhbCBmdW5jdGlvbiwgb3IgY2xvc3VyZSB3aGljaCBtaWdodCBuZWVkIHRvIGJlIHF1ZXJpZWQgbGF0ZXIuCiAgLy8vCiAgLy8vIFtpc0Nsb3N1cmVdIHNob3VsZCBiZSB0cnVlIGlmIHRoZSBub2RlIGlzIGEgbG9jYWwgZnVuY3Rpb24gb3IgY2xvc3VyZS4KICAvLy8KICAvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB0byBbZGVmZXJOb2RlXSBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSBhIGNhbGwKICAvLy8gdG8gW3N0b3JlSW5mb10uCiAgLy8vCiAgLy8vIFNlZSBbYmVnaW5Ob2RlXSBmb3IgbW9yZSBkZXRhaWxzLgogIHZvaWQgZW5kTm9kZShOb2RlIG5vZGUsIHtib29sIGlzQ2xvc3VyZTogZmFsc2V9KSB7CiAgICBzdG9yZUluZm8obm9kZSwgZGVmZXJOb2RlKGlzQ2xvc3VyZTogaXNDbG9zdXJlKSk7CiAgfQoKICAvLy8gQ2FsbCB0aGlzIGFmdGVyIHZpc2l0aW5nIHRoZSBjb2RlIHRvIGJlIGFuYWx5emVkLCB0byBjaGVjayBpbnZhcmlhbnRzLgogIHZvaWQgZmluaXNoKCkgewogICAgYXNzZXJ0KCgpIHsKICAgICAgYXNzZXJ0KAogICAgICAgICAgX2RlZmVycmVkSW5mb3MuaXNFbXB0eSwgIkRlZmVycmVkIGluZm9zIG5vdCBzdG9yZWQ6ICRfZGVmZXJyZWRJbmZvcyIpOwogICAgICBhc3NlcnQoX3N0YWNrLmxlbmd0aCA9PSAxLCAiVW5leHBlY3RlZCBzdGFjazogJF9zdGFjayIpOwogICAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBsYXN0ID0gX3N0YWNrLmxhc3Q7CiAgICAgIFNldDxWYXJpYWJsZT4gdW5kZWNsYXJlZFdyaXRlcyA9IGxhc3QuX3dyaXR0ZW4uZGlmZmVyZW5jZShsYXN0Ll9kZWNsYXJlZCk7CiAgICAgIGFzc2VydCh1bmRlY2xhcmVkV3JpdGVzLmlzRW1wdHksCiAgICAgICAgICAnVmFyaWFibGVzIHdyaXR0ZW4gdG8gYnV0IG5vdCBkZWNsYXJlZDogJHVuZGVjbGFyZWRXcml0ZXMnKTsKICAgICAgU2V0PFZhcmlhYmxlPiB1bmRlY2xhcmVkQ2FwdHVyZXMgPQogICAgICAgICAgbGFzdC5fY2FwdHVyZWQuZGlmZmVyZW5jZShsYXN0Ll9kZWNsYXJlZCk7CiAgICAgIGFzc2VydCh1bmRlY2xhcmVkQ2FwdHVyZXMuaXNFbXB0eSwKICAgICAgICAgICdWYXJpYWJsZXMgY2FwdHVyZWQgYnV0IG5vdCBkZWNsYXJlZDogJHVuZGVjbGFyZWRDYXB0dXJlcycpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0oKSk7CiAgfQoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0aGF0IHRoZSBub2RlIFtmcm9tXSBmb3Igd2hpY2ggaW5mb3JtYXRpb24KICAvLy8gaGFzIGJlZW4gc3RvcmVkIGlzIHJlcGxhY2VkIGJ5IHRoZSBub2RlIFt0b10uCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVtb3ZlIHRoaXMgd2hlbiB1bmlmaWVkIGNvbGxlY3Rpb25zIGFyZSBlbmNvZGVkIGFzCiAgLy8gZ2VuZXJhbCBlbGVtZW50cyBpbiB0aGUgZnJvbnQtZW5kLgogIHZvaWQgcmVhc3NpZ25JbmZvKE5vZGUgZnJvbSwgTm9kZSB0bykgewogICAgYXNzZXJ0KCFfaW5mby5jb250YWluc0tleSh0byksICJOb2RlICR0byBhbHJlYWR5IGhhcyBpbmZvOiAke19pbmZvW3RvXX0iKTsKICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IGluZm8gPSBfaW5mby5yZW1vdmUoZnJvbSk7CiAgICBhc3NlcnQoCiAgICAgICAgaW5mbyAhPSBudWxsLAogICAgICAgICdObyBpbmZvcm1hdGlvbiBmb3IgJGZyb20gKCR7ZnJvbS5oYXNoQ29kZX0pIGluICcKICAgICAgICAneyR7X2luZm8ua2V5cy5tYXAoKGspID0+ICckayAoJHtrLmhhc2hDb2RlfSknKS5qb2luKCcsJyl9fScpOwoKICAgIF9pbmZvW3RvXSA9IGluZm87CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhdCBhbnkgdGltZSBiZXR3ZWVuIGEgY2FsbCB0byBbZGVmZXJOb2RlXSBhbmQKICAvLy8gdGhlIGNhbGwgdG8gW2ZpbmlzaF0sIHRvIHN0b3JlIGFzc2lnbmVkIHZhcmlhYmxlIGluZm8gZm9yIHRoZSBub2RlLgogIHZvaWQgc3RvcmVJbmZvKE5vZGUgbm9kZSwgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4gaW5mbykgewogICAgLy8gQ2FsbGVyIHNob3VsZCBub3QgdHJ5IHRvIHN0b3JlIHRoZSBzYW1lIHBpZWNlIG9mIGluZm8gbW9yZSB0aGFuIG9uY2UuCiAgICBhc3NlcnQoX2RlZmVycmVkSW5mb3MucmVtb3ZlKGluZm8pKTsKICAgIF9pbmZvW25vZGVdID0gaW5mbzsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdBc3NpZ25lZFZhcmlhYmxlcygnKTsKICAgIF9wcmludE9uKHNiKTsKICAgIHNiLndyaXRlKCcpJyk7CiAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBwcmUtdHJhdmVyc2FsLCB0byBtYXJrIGEgd3JpdGUgdG8gYQogIC8vLyB2YXJpYWJsZS4KICB2b2lkIHdyaXRlKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICBfc3RhY2subGFzdC5fd3JpdHRlbi5hZGQodmFyaWFibGUpOwogICAgX2FueXdoZXJlLl93cml0dGVuLmFkZCh2YXJpYWJsZSk7CiAgfQoKICAvLy8gUXVlcmllcyB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGZvciB0aGUgZ2l2ZW4gW25vZGVdLgogIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IF9nZXRJbmZvRm9yTm9kZShOb2RlIG5vZGUpIHsKICAgIHJldHVybiBfaW5mb1tub2RlXSA/PwogICAgICAgICh0aHJvdyBuZXcgU3RhdGVFcnJvcignTm8gaW5mb3JtYXRpb24gZm9yICRub2RlICgke25vZGUuaGFzaENvZGV9KSBpbiAnCiAgICAgICAgICAgICd7JHtfaW5mby5rZXlzLm1hcCgoaykgPT4gJyRrICgke2suaGFzaENvZGV9KScpLmpvaW4oJywnKX19JykpOwogIH0KCiAgdm9pZCBfcHJpbnRPbihTdHJpbmdCdWZmZXIgc2IpIHsKICAgIHNiLndyaXRlKCdfaW5mbz0kX2luZm8sJyk7CiAgICBzYi53cml0ZSgnX3N0YWNrPSRfc3RhY2ssJyk7CiAgICBzYi53cml0ZSgnX2FueXdoZXJlPSRfYW55d2hlcmUnKTsKICB9Cn0KCi8vLyBFeHRlbnNpb24gb2YgW0Fzc2lnbmVkVmFyaWFibGVzXSBpbnRlbmRlZCBmb3IgdXNlIGluIHRlc3RzLiAgVGhpcyBjbGFzcwovLy8gZXhwb3NlcyB0aGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMgc28gdGhhdCB0aGV5IGNhbiBiZSB0ZXN0ZWQgZGlyZWN0bHkuCi8vLyBOb3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjbGllbnRzIG9mIGZsb3cgYW5hbHlzaXMuCmNsYXNzIEFzc2lnbmVkVmFyaWFibGVzRm9yVGVzdGluZzxOb2RlLCBWYXJpYWJsZT4KICAgIGV4dGVuZHMgQXNzaWduZWRWYXJpYWJsZXM8Tm9kZSwgVmFyaWFibGU+IHsKICBTZXQ8VmFyaWFibGU+IGdldCBjYXB0dXJlZEFueXdoZXJlID0+IF9hbnl3aGVyZS5fY2FwdHVyZWQ7CgogIFNldDxWYXJpYWJsZT4gZ2V0IGRlY2xhcmVkQXRUb3BMZXZlbCA9PiBfc3RhY2suZmlyc3QuX2RlY2xhcmVkOwoKICBTZXQ8VmFyaWFibGU+IGdldCB3cml0dGVuQW55d2hlcmUgPT4gX2FueXdoZXJlLl93cml0dGVuOwoKICBTZXQ8VmFyaWFibGU+IGNhcHR1cmVkSW5Ob2RlKE5vZGUgbm9kZSkgPT4gX2dldEluZm9Gb3JOb2RlKG5vZGUpLl9jYXB0dXJlZDsKCiAgU2V0PFZhcmlhYmxlPiBkZWNsYXJlZEluTm9kZShOb2RlIG5vZGUpID0+IF9nZXRJbmZvRm9yTm9kZShub2RlKS5fZGVjbGFyZWQ7CgogIGJvb2wgaXNUcmFja2VkKE5vZGUgbm9kZSkgPT4gX2luZm8uY29udGFpbnNLZXkobm9kZSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHNiLndyaXRlKCdBc3NpZ25lZFZhcmlhYmxlc0ZvclRlc3RpbmcoJyk7CiAgICBfcHJpbnRPbihzYik7CiAgICBzYi53cml0ZSgnKScpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBTZXQ8VmFyaWFibGU+IHdyaXR0ZW5Jbk5vZGUoTm9kZSBub2RlKSA9PiBfZ2V0SW5mb0Zvck5vZGUobm9kZSkuX3dyaXR0ZW47Cn0KCi8vLyBJbmZvcm1hdGlvbiB0cmFja2VkIGJ5IFtBc3NpZ25lZFZhcmlhYmxlc10gZm9yIGEgc2luZ2xlIG5vZGUuCmNsYXNzIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IHsKICBmaW5hbCBTZXQ8VmFyaWFibGU+IF93cml0dGVuID0gbmV3IFNldDxWYXJpYWJsZT4uaWRlbnRpdHkoKTsKCiAgLy8gVGhlIHNldCBvZiBsb2NhbCB2YXJpYWJsZXMgdGhhdCBhcmUgcG90ZW50aWFsbHkgd3JpdHRlbiBpbiB0aGUgbm9kZS4KICBmaW5hbCBTZXQ8VmFyaWFibGU+IF9jYXB0dXJlZCA9IG5ldyBTZXQ8VmFyaWFibGU+LmlkZW50aXR5KCk7CgogIC8vIFRoZSBzZXQgb2YgbG9jYWwgdmFyaWFibGVzIGZvciB3aGljaCBhIHBvdGVudGlhbCB3cml0ZSBpcyBjYXB0dXJlZCBieSBhCiAgLy8gbG9jYWwgZnVuY3Rpb24gb3IgY2xvc3VyZSBpbnNpZGUgdGhlIG5vZGUuCiAgZmluYWwgU2V0PFZhcmlhYmxlPiBfZGVjbGFyZWQgPSBuZXcgU2V0PFZhcmlhYmxlPi5pZGVudGl0eSgpOwoKICAvLyBUaGUgc2V0IG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWNsYXJlZCBpbiB0aGUgbm9kZS4KICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbyhfd3JpdHRlbj0kX3dyaXR0ZW4sIF9jYXB0dXJlZD0kX2NhcHR1cmVkLCAnCiAgICAgICdfZGVjbGFyZWQ9JF9kZWNsYXJlZCknOwp9CgovLy8gQSBjb2xsZWN0aW9uIG9mIGZsb3cgbW9kZWxzIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgb3V0Y29tZXMgb2YgZXZhbHVhdGluZwovLy8gYW4gZXhwcmVzc2lvbiB0aGF0IGFyZSByZWxldmFudCB0byBmbG93IGFuYWx5c2lzLgpjbGFzcyBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gewogIC8vLyBUaGUgc3RhdGUgYWZ0ZXIgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzLCBpZiB3ZSBkb24ndCBjYXJlIHdoYXQgaXQKICAvLy8gZXZhbHVhdGVzIHRvLgogIGZpbmFsIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gYWZ0ZXI7CgogIC8vLyBUaGUgc3RhdGUgYWZ0ZXIgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzLCBpZiBpdCBldmFsdWF0ZXMgdG8gYHRydWVgLgogIGZpbmFsIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gaWZUcnVlOwoKICAvLy8gVGhlIHN0YXRlIGFmdGVyIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcywgaWYgaXQgZXZhbHVhdGVzIHRvIGBmYWxzZWAuCiAgZmluYWwgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBpZkZhbHNlOwoKICBFeHByZXNzaW9uSW5mbyh0aGlzLmFmdGVyLCB0aGlzLmlmVHJ1ZSwgdGhpcy5pZkZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ0V4cHJlc3Npb25JbmZvKGFmdGVyOiAkYWZ0ZXIsIF9pZlRydWU6ICRpZlRydWUsIGlmRmFsc2U6ICRpZkZhbHNlKSc7CgogIC8vLyBDb21wdXRlIGEgbmV3IFtFeHByZXNzaW9uSW5mb10gYmFzZWQgb24gdGhpcyBvbmUsIGJ1dCB3aXRoIHRoZSByb2xlcyBvZgogIC8vLyBbaWZUcnVlXSBhbmQgW2lmRmFsc2VdIHJldmVyc2VkLgogIHN0YXRpYyBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gaW52ZXJ0PFZhcmlhYmxlLCBUeXBlPigKICAgICAgICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBpbmZvKSA9PgogICAgICBuZXcgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+KGluZm8uYWZ0ZXIsIGluZm8uaWZGYWxzZSwgaW5mby5pZlRydWUpOwp9CgovLy8gSW1wbGVtZW50YXRpb24gb2YgZmxvdyBhbmFseXNpcyB0byBiZSBzaGFyZWQgYmV0d2VlbiB0aGUgYW5hbHl6ZXIgYW5kIHRoZQovLy8gZnJvbnQgZW5kLgovLy8KLy8vIFRoZSBjbGllbnQgc2hvdWxkIGNyZWF0ZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkgbWV0aG9kLCBmaWVsZCwKLy8vIG9yIHRvcCBsZXZlbCB2YXJpYWJsZSB0byBiZSBhbmFseXplZCwgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZHMKLy8vIHdoaWxlIHZpc2l0aW5nIHRoZSBjb2RlIGZvciB0eXBlIGluZmVyZW5jZS4KYWJzdHJhY3QgY2xhc3MgRmxvd0FuYWx5c2lzPE5vZGUsIFN0YXRlbWVudCBleHRlbmRzIE5vZGUsIEV4cHJlc3Npb24sIFZhcmlhYmxlLAogICAgVHlwZT4gewogIGZhY3RvcnkgRmxvd0FuYWx5c2lzKFR5cGVPcGVyYXRpb25zPFZhcmlhYmxlLCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgICAgQXNzaWduZWRWYXJpYWJsZXM8Tm9kZSwgVmFyaWFibGU+IGFzc2lnbmVkVmFyaWFibGVzKSB7CiAgICByZXR1cm4gbmV3IF9GbG93QW5hbHlzaXNJbXBsKHR5cGVPcGVyYXRpb25zLCBhc3NpZ25lZFZhcmlhYmxlcyk7CiAgfQoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyByZWFjaGFibGUuCiAgYm9vbCBnZXQgaXNSZWFjaGFibGU7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIGFuICJhcyIgZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gW3N1YkV4cHJlc3Npb25dIHNob3VsZCBiZSB0aGUgZXhwcmVzc2lvbiB0byB3aGljaCB0aGUgImFzIiBjaGVjayB3YXMKICAvLy8gYXBwbGllZC4gIFt0eXBlXSBzaG91bGQgYmUgdGhlIHR5cGUgYmVpbmcgY2hlY2tlZC4KICB2b2lkIGFzRXhwcmVzc2lvbl9lbmQoRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uLCBUeXBlIHR5cGUpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBhZnRlciB2aXNpdGluZyB0aGUgY29uZGl0aW9uIHBhcnQgb2YgYW4gYXNzZXJ0IHN0YXRlbWVudAogIC8vLyAob3IgYXNzZXJ0IGluaXRpYWxpemVyKS4KICAvLy8KICAvLy8gW2NvbmRpdGlvbl0gc2hvdWxkIGJlIHRoZSBhc3NlcnQgc3RhdGVtZW50J3MgY29uZGl0aW9uLgogIC8vLwogIC8vLyBTZWUgW2Fzc2VydF9iZWdpbl0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgdm9pZCBhc3NlcnRfYWZ0ZXJDb25kaXRpb24oRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdmlzaXRpbmcgdGhlIGNvbmRpdGlvbiBwYXJ0IG9mIGFuIGFzc2VydCBzdGF0ZW1lbnQKICAvLy8gKG9yIGFzc2VydCBpbml0aWFsaXplcikuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiB2aXNpdGluZyBhbiBhc3NlcnQgc3RhdGVtZW50IHdpdGggbm8gIm1lc3NhZ2UiIHBhcnQgc2hvdWxkCiAgLy8vIGJlOgogIC8vLyAtIENhbGwgW2Fzc2VydF9iZWdpbl0KICAvLy8gLSBWaXNpdCB0aGUgY29uZGl0aW9uCiAgLy8vIC0gQ2FsbCBbYXNzZXJ0X2FmdGVyQ29uZGl0aW9uXQogIC8vLyAtIENhbGwgW2Fzc2VydF9lbmRdCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiB2aXNpdGluZyBhbiBhc3NlcnQgc3RhdGVtZW50IHdpdGggYSAibWVzc2FnZSIgcGFydCBzaG91bGQgYmU6CiAgLy8vIC0gQ2FsbCBbYXNzZXJ0X2JlZ2luXQogIC8vLyAtIFZpc2l0IHRoZSBjb25kaXRpb24KICAvLy8gLSBDYWxsIFthc3NlcnRfYWZ0ZXJDb25kaXRpb25dCiAgLy8vIC0gVmlzaXQgdGhlIG1lc3NhZ2UKICAvLy8gLSBDYWxsIFthc3NlcnRfZW5kXQogIHZvaWQgYXNzZXJ0X2JlZ2luKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIGFuIGFzc2VydCBzdGF0ZW1lbnQgKG9yIGFzc2VydAogIC8vLyBpbml0aWFsaXplcikuCiAgLy8vCiAgLy8vIFNlZSBbYXNzZXJ0X2JlZ2luXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICB2b2lkIGFzc2VydF9lbmQoKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2Qgd2hlbiB2aXNpdGluZyBhIGJvb2xlYW4gbGl0ZXJhbCBleHByZXNzaW9uLgogIHZvaWQgYm9vbGVhbkxpdGVyYWwoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBib29sIHZhbHVlKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QgdXBvbiByZWFjaGluZyB0aGUgIjoiIHBhcnQgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uCiAgLy8vICgiPzoiKS4gIFt0aGVuRXhwcmVzc2lvbl0gc2hvdWxkIGJlIHRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgIjoiLgogIHZvaWQgY29uZGl0aW9uYWxfZWxzZUJlZ2luKEV4cHJlc3Npb24gdGhlbkV4cHJlc3Npb24pOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIGZpbmlzaGluZyB0aGUgdmlzaXQgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uCiAgLy8vICgiPzoiKS4gIFtlbHNlRXhwcmVzc2lvbl0gc2hvdWxkIGJlIHRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgIjoiLCBhbmQKICAvLy8gW2NvbmRpdGlvbmFsRXhwcmVzc2lvbl0gc2hvdWxkIGJlIHRoZSB3aG9sZSBjb25kaXRpb25hbCBleHByZXNzaW9uLgogIHZvaWQgY29uZGl0aW9uYWxfZW5kKAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBlbHNlRXhwcmVzc2lvbik7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIHVwb24gcmVhY2hpbmcgdGhlICI/IiBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbgogIC8vLyAoIj86IikuICBbY29uZGl0aW9uXSBzaG91bGQgYmUgdGhlIGV4cHJlc3Npb24gcHJlY2VkaW5nIHRoZSAiPyIuCiAgdm9pZCBjb25kaXRpb25hbF90aGVuQmVnaW4oRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdmlzaXRpbmcgdGhlIGJvZHkgb2YgYSAiZG8td2hpbGUiIHN0YXRlbWVudC4KICAvLy8gW2RvU3RhdGVtZW50XSBzaG91bGQgYmUgdGhlIHNhbWUgbm9kZSB0aGF0IHdhcyBwYXNzZWQgdG8KICAvLy8gW0Fzc2lnbmVkVmFyaWFibGVzLmVuZE5vZGVdIGZvciB0aGUgZG8td2hpbGUgc3RhdGVtZW50LgogIHZvaWQgZG9TdGF0ZW1lbnRfYm9keUJlZ2luKFN0YXRlbWVudCBkb1N0YXRlbWVudCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIHRoZSBib2R5IG9mIGEgImRvLXdoaWxlIiBzdGF0ZW1lbnQsIGFuZAogIC8vLyBiZWZvcmUgdmlzaXRpbmcgaXRzIGNvbmRpdGlvbi4KICB2b2lkIGRvU3RhdGVtZW50X2NvbmRpdGlvbkJlZ2luKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIHRoZSBjb25kaXRpb24gb2YgYSAiZG8td2hpbGUiIHN0YXRlbWVudC4KICAvLy8gW2NvbmRpdGlvbl0gc2hvdWxkIGJlIHRoZSBjb25kaXRpb24gb2YgdGhlIGxvb3AuCiAgdm9pZCBkb1N0YXRlbWVudF9lbmQoRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGFmdGVyIHZpc2l0aW5nIGEgYmluYXJ5IGA9PWAgb3IgYCE9YCBleHByZXNzaW9uLgogIHZvaWQgZXF1YWxpdHlPcF9lbmQoRXhwcmVzc2lvbiB3aG9sZUV4cHJlc3Npb24sIEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kLAogICAgICB7Ym9vbCBub3RFcXVhbCA9IGZhbHNlfSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYWZ0ZXIgdmlzaXRpbmcgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIGEgYmluYXJ5IGA9PWAKICAvLy8gb3IgYCE9YCBleHByZXNzaW9uLgogIHZvaWQgZXF1YWxpdHlPcF9yaWdodEJlZ2luKEV4cHJlc3Npb24gbGVmdE9wZXJhbmQpOwoKICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgY29uY2x1c2lvbiBvZiBmbG93IGFuYWx5c2lzIGZvciBhIHRvcAogIC8vLyBsZXZlbCBmdW5jdGlvbiBvciBtZXRob2QuICBQZXJmb3JtcyBhc3NlcnRpb24gY2hlY2tzLgogIHZvaWQgZmluaXNoKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIHZpc2l0aW5nIHRoZSBib2R5IG9mIGEgY29udmVudGlvbmFsICJmb3IiCiAgLy8vIHN0YXRlbWVudCBvciBjb2xsZWN0aW9uIGVsZW1lbnQuICBTZWUgW2Zvcl9jb25kaXRpb25CZWdpbl0gZm9yIGRldGFpbHMuCiAgLy8vCiAgLy8vIElmIGEgImZvciIgc3RhdGVtZW50IGlzIGJlaW5nIGVudGVyZWQsIFtub2RlXSBpcyBhbiBvcGFxdWUgcmVwcmVzZW50YXRpb24KICAvLy8gb2YgdGhlIGxvb3AsIGZvciB1c2UgYXMgdGhlIHRhcmdldCBvZiBmdXR1cmUgY2FsbHMgdG8gW2hhbmRsZUJyZWFrXSBvcgogIC8vLyBbaGFuZGxlQ29udGludWVdLiAgSWYgYSAiZm9yIiBjb2xsZWN0aW9uIGVsZW1lbnQgaXMgYmVpbmcgZW50ZXJlZCwgW25vZGVdCiAgLy8vIHNob3VsZCBiZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFtjb25kaXRpb25dIGlzIGFuIG9wYXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbG9vcCBjb25kaXRpb247IGl0IGlzCiAgLy8vIG1hdGNoZWQgYWdhaW5zdCBleHByZXNzaW9ucyBwYXNzZWQgdG8gcHJldmlvdXMgY2FsbHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKICAvLy8gdGhlIGxvb3AgY29uZGl0aW9uIHNob3VsZCBjYXVzZSBhbnkgcHJvbW90aW9ucyB0byBvY2N1ci4gIElmIFtjb25kaXRpb25dCiAgLy8vIGlzIG51bGwsIHRoZSBjb25kaXRpb24gaXMgdW5kZXJzdG9vZCB0byBiZSBlbXB0eSAoZXF1aXZhbGVudCB0byBhCiAgLy8vIGNvbmRpdGlvbiBvZiBgdHJ1ZWApLgogIHZvaWQgZm9yX2JvZHlCZWdpbihTdGF0ZW1lbnQgbm9kZSwgRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGJlZm9yZSB2aXNpdGluZyB0aGUgY29uZGl0aW9uIG9mIGEgY29udmVudGlvbmFsCiAgLy8vICJmb3IiIHN0YXRlbWVudCBvciBjb2xsZWN0aW9uIGVsZW1lbnQuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBhIGNvbnZlbnRpb25hbCAiZm9yIiBzdGF0ZW1lbnQgaXMgYSBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0KICAvLy8gYGZvciAoaW5pdGlhbGl6ZXJzOyBjb25kaXRpb247IHVwZGF0ZXJzKSBib2R5YC4gIFN0YXRlbWVudHMgb2YgdGhlIGZvcm0KICAvLy8gYGZvciAodmFyaWFibGUgaW4gaXRlcmFibGUpIGJvZHlgIHNob3VsZCB1c2UgW2ZvckVhY2hfYm9keUJlZ2luXS4gIFNpbWlsYXIKICAvLy8gZm9yICJmb3IiIGNvbGxlY3Rpb24gZWxlbWVudHMuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiB2aXNpdGluZyBhICJmb3IiIHN0YXRlbWVudCBvciBjb2xsZWN0aW9uIGVsZW1lbnQgc2hvdWxkIGJlOgogIC8vLyAtIFZpc2l0IHRoZSBpbml0aWFsaXplcnMuCiAgLy8vIC0gQ2FsbCBbZm9yX2NvbmRpdGlvbkJlZ2luXS4KICAvLy8gLSBWaXNpdCB0aGUgY29uZGl0aW9uLgogIC8vLyAtIENhbGwgW2Zvcl9ib2R5QmVnaW5dLgogIC8vLyAtIFZpc2l0IHRoZSBib2R5LgogIC8vLyAtIENhbGwgW2Zvcl91cGRhdGVyQmVnaW5dLgogIC8vLyAtIFZpc2l0IHRoZSB1cGRhdGVycy4KICAvLy8gLSBDYWxsIFtmb3JfZW5kXS4KICAvLy8KICAvLy8gW25vZGVdIHNob3VsZCBiZSB0aGUgc2FtZSBub2RlIHRoYXQgd2FzIHBhc3NlZCB0bwogIC8vLyBbQXNzaWduZWRWYXJpYWJsZXMuZW5kTm9kZV0gZm9yIHRoZSBmb3Igc3RhdGVtZW50LgogIHZvaWQgZm9yX2NvbmRpdGlvbkJlZ2luKE5vZGUgbm9kZSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYWZ0ZXIgdmlzaXRpbmcgdGhlIHVwZGF0ZXJzIG9mIGEgY29udmVudGlvbmFsICJmb3IiCiAgLy8vIHN0YXRlbWVudCBvciBjb2xsZWN0aW9uIGVsZW1lbnQuICBTZWUgW2Zvcl9jb25kaXRpb25CZWdpbl0gZm9yIGRldGFpbHMuCiAgdm9pZCBmb3JfZW5kKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIHZpc2l0aW5nIHRoZSB1cGRhdGVycyBvZiBhIGNvbnZlbnRpb25hbCAiZm9yIgogIC8vLyBzdGF0ZW1lbnQgb3IgY29sbGVjdGlvbiBlbGVtZW50LiAgU2VlIFtmb3JfY29uZGl0aW9uQmVnaW5dIGZvciBkZXRhaWxzLgogIHZvaWQgZm9yX3VwZGF0ZXJCZWdpbigpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGJlZm9yZSB2aXNpdGluZyB0aGUgYm9keSBvZiBhICJmb3ItaW4iIHN0YXRlbWVudCBvcgogIC8vLyBjb2xsZWN0aW9uIGVsZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiB2aXNpdGluZyBhICJmb3ItaW4iIHN0YXRlbWVudCBvciBjb2xsZWN0aW9uIGVsZW1lbnQgc2hvdWxkCiAgLy8vIGJlOgogIC8vLyAtIFZpc2l0IHRoZSBpdGVyYWJsZSBleHByZXNzaW9uLgogIC8vLyAtIENhbGwgW2ZvckVhY2hfYm9keUJlZ2luXS4KICAvLy8gLSBWaXNpdCB0aGUgYm9keS4KICAvLy8gLSBDYWxsIFtmb3JFYWNoX2VuZF0uCiAgLy8vCiAgLy8vIFtub2RlXSBzaG91bGQgYmUgdGhlIHNhbWUgbm9kZSB0aGF0IHdhcyBwYXNzZWQgdG8KICAvLy8gW0Fzc2lnbmVkVmFyaWFibGVzLmVuZE5vZGVdIGZvciB0aGUgZm9yIHN0YXRlbWVudC4gIFtsb29wVmFyaWFibGVdIHNob3VsZAogIC8vLyBiZSB0aGUgdmFyaWFibGUgYXNzaWduZWQgdG8gYnkgdGhlIGxvb3AgKGlmIGl0IGlzIHByb21vdGFibGUsIG90aGVyd2lzZQogIC8vLyBudWxsKS4gIFt3cml0dGVuVHlwZV0gc2hvdWxkIGJlIHRoZSB0eXBlIHdyaXR0ZW4gdG8gdGhhdCB2YXJpYWJsZSAoaS5lLgogIC8vLyBpZiB0aGUgbG9vcCBpdGVyYXRlcyBvdmVyIGBMaXN0PEZvbz5gLCBpdCBzaG91bGQgYmUgYEZvb2ApLgogIHZvaWQgZm9yRWFjaF9ib2R5QmVnaW4oTm9kZSBub2RlLCBWYXJpYWJsZSBsb29wVmFyaWFibGUsIFR5cGUgd3JpdHRlblR5cGUpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGJlZm9yZSB2aXNpdGluZyB0aGUgYm9keSBvZiBhICJmb3ItaW4iIHN0YXRlbWVudCBvcgogIC8vLyBjb2xsZWN0aW9uIGVsZW1lbnQuICBTZWUgW2ZvckVhY2hfYm9keUJlZ2luXSBmb3IgZGV0YWlscy4KICB2b2lkIGZvckVhY2hfZW5kKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIHZpc2l0aW5nIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiBvcgogIC8vLyBsb2NhbCBmdW5jdGlvbi4KICAvLy8KICAvLy8gW25vZGVdIHNob3VsZCBiZSB0aGUgc2FtZSBub2RlIHRoYXQgd2FzIHBhc3NlZCB0bwogIC8vLyBbQXNzaWduZWRWYXJpYWJsZXMuZW5kTm9kZV0gZm9yIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uLgogIHZvaWQgZnVuY3Rpb25FeHByZXNzaW9uX2JlZ2luKE5vZGUgbm9kZSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYWZ0ZXIgdmlzaXRpbmcgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBleHByZXNzaW9uIG9yCiAgLy8vIGxvY2FsIGZ1bmN0aW9uLgogIHZvaWQgZnVuY3Rpb25FeHByZXNzaW9uX2VuZCgpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIHZpc2l0aW5nIGEgYnJlYWsgc3RhdGVtZW50LiAgW3RhcmdldF0gc2hvdWxkIGJlIHRoZQogIC8vLyBzdGF0ZW1lbnQgdGFyZ2V0ZWQgYnkgdGhlIGJyZWFrLgogIHZvaWQgaGFuZGxlQnJlYWsoU3RhdGVtZW50IHRhcmdldCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIHdoZW4gdmlzaXRpbmcgYSBjb250aW51ZSBzdGF0ZW1lbnQuICBbdGFyZ2V0XSBzaG91bGQgYmUKICAvLy8gdGhlIHN0YXRlbWVudCB0YXJnZXRlZCBieSB0aGUgY29udGludWUuCiAgdm9pZCBoYW5kbGVDb250aW51ZShTdGF0ZW1lbnQgdGFyZ2V0KTsKCiAgLy8vIFJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgc3RhdGUgZGVmaW5pdGVseSBleGlzdHMsIGUuZy4gcmV0dXJucwogIC8vLyBmcm9tIHRoZSBib2R5LCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBldGMuCiAgLy8vCiAgLy8vIFNob3VsZCBhbHNvIGJlIGNhbGxlZCBpZiBhIHN1YmV4cHJlc3Npb24ncyB0eXBlIGlzIE5ldmVyLgogIHZvaWQgaGFuZGxlRXhpdCgpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBhZnRlciB2aXNpdGluZyB0aGUgUkhTIG9mIGFuIGlmLW51bGwgZXhwcmVzc2lvbiAoIj8/IikKICAvLy8gb3IgaWYtbnVsbCBhc3NpZ25tZW50ICgiPz89IikuCiAgLy8vCiAgLy8vIE5vdGU6IGZvciBhbiBpZi1udWxsIGFzc2lnbm1lbnQsIHRoZSBjYWxsIHRvIFt3cml0ZV0gc2hvdWxkIG9jY3VyIGJlZm9yZQogIC8vLyB0aGUgY2FsbCB0byBbaWZOdWxsRXhwcmVzc2lvbl9lbmRdIChzaW5jZSB0aGUgd3JpdGUgb25seSBvY2N1cnMgaWYgdGhlCiAgLy8vIHJlYWQgcmVzdWx0ZWQgaW4gYSBudWxsIHZhbHVlKS4KICB2b2lkIGlmTnVsbEV4cHJlc3Npb25fZW5kKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIHRoZSBMSFMgb2YgYW4gaWYtbnVsbCBleHByZXNzaW9uICgiPz8iKQogIC8vLyBvciBpZi1udWxsIGFzc2lnbm1lbnQgKCI/Pz0iKS4KICB2b2lkIGlmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbihFeHByZXNzaW9uIGxlZnRIYW5kU2lkZSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIHRoZSAidGhlbiIgcGFydCBvZiBhbiBpZiBzdGF0ZW1lbnQsIGFuZAogIC8vLyBiZWZvcmUgdmlzaXRpbmcgdGhlICJlbHNlIiBwYXJ0LgogIHZvaWQgaWZTdGF0ZW1lbnRfZWxzZUJlZ2luKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIGFuIGlmIHN0YXRlbWVudC4KICB2b2lkIGlmU3RhdGVtZW50X2VuZChib29sIGhhc0Vsc2UpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBhZnRlciB2aXNpdGluZyB0aGUgY29uZGl0aW9uIHBhcnQgb2YgYW4gaWYgc3RhdGVtZW50LgogIC8vLyBbY29uZGl0aW9uXSBzaG91bGQgYmUgdGhlIGlmIHN0YXRlbWVudCdzIGNvbmRpdGlvbi4KICAvLy8KICAvLy8gVGhlIG9yZGVyIG9mIHZpc2l0aW5nIGFuIGlmIHN0YXRlbWVudCB3aXRoIG5vICJlbHNlIiBwYXJ0IHNob3VsZCBiZToKICAvLy8gLSBWaXNpdCB0aGUgY29uZGl0aW9uCiAgLy8vIC0gQ2FsbCBbaWZTdGF0ZW1lbnRfdGhlbkJlZ2luXQogIC8vLyAtIFZpc2l0IHRoZSAidGhlbiIgc3RhdGVtZW50CiAgLy8vIC0gQ2FsbCBbaWZTdGF0ZW1lbnRfZW5kXSwgcGFzc2luZyBgZmFsc2VgIGZvciBgaGFzRWxzZWAuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiB2aXNpdGluZyBhbiBpZiBzdGF0ZW1lbnQgd2l0aCBhbiAiZWxzZSIgcGFydCBzaG91bGQgYmU6CiAgLy8vIC0gVmlzaXQgdGhlIGNvbmRpdGlvbgogIC8vLyAtIENhbGwgW2lmU3RhdGVtZW50X3RoZW5CZWdpbl0KICAvLy8gLSBWaXNpdCB0aGUgInRoZW4iIHN0YXRlbWVudAogIC8vLyAtIENhbGwgW2lmU3RhdGVtZW50X2Vsc2VCZWdpbl0KICAvLy8gLSBWaXNpdCB0aGUgImVsc2UiIHN0YXRlbWVudAogIC8vLyAtIENhbGwgW2lmU3RhdGVtZW50X2VuZF0sIHBhc3NpbmcgYHRydWVgIGZvciBgaGFzRWxzZWAuCiAgdm9pZCBpZlN0YXRlbWVudF90aGVuQmVnaW4oRXhwcmVzc2lvbiBjb25kaXRpb24pOwoKICAvLy8gUmVnaXN0ZXIgYW4gaW5pdGlhbGl6ZWQgZGVjbGFyYXRpb24gb2YgdGhlIGdpdmVuIFt2YXJpYWJsZV0gaW4gdGhlIGN1cnJlbnQKICAvLy8gc3RhdGUuICBTaG91bGQgYWxzbyBiZSBjYWxsZWQgZm9yIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCiAgdm9pZCBpbml0aWFsaXplKFZhcmlhYmxlIHZhcmlhYmxlKTsKCiAgLy8vIFJldHVybiB3aGV0aGVyIHRoZSBbdmFyaWFibGVdIGlzIGRlZmluaXRlbHkgYXNzaWduZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUuCiAgYm9vbCBpc0Fzc2lnbmVkKFZhcmlhYmxlIHZhcmlhYmxlKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdmlzaXRpbmcgdGhlIExIUyBvZiBhbiAiaXMiIGV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIFtpc0V4cHJlc3Npb25dIHNob3VsZCBiZSB0aGUgY29tcGxldGUgZXhwcmVzc2lvbi4gIFtzdWJFeHByZXNzaW9uXSBzaG91bGQKICAvLy8gYmUgdGhlIGV4cHJlc3Npb24gdG8gd2hpY2ggdGhlICJpcyIgY2hlY2sgd2FzIGFwcGxpZWQuICBbaXNOb3RdIHNob3VsZCBiZQogIC8vLyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgYW4gImlzIiBvciBhbiAiaXMhIiBleHByZXNzaW9uLgogIC8vLyBbdHlwZV0gc2hvdWxkIGJlIHRoZSB0eXBlIGJlaW5nIGNoZWNrZWQuCiAgdm9pZCBpc0V4cHJlc3Npb25fZW5kKAogICAgICBFeHByZXNzaW9uIGlzRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uLCBib29sIGlzTm90LCBUeXBlIHR5cGUpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBhZnRlciB2aXNpdGluZyB0aGUgUkhTIG9mIGEgbG9naWNhbCBiaW5hcnkgb3BlcmF0aW9uCiAgLy8vICgifHwiIG9yICImJiIpLgogIC8vLyBbd2hvbGVFeHByZXNzaW9uXSBzaG91bGQgYmUgdGhlIHdob2xlIGxvZ2ljYWwgYmluYXJ5IGV4cHJlc3Npb24uCiAgLy8vIFtyaWdodE9wZXJhbmRdIHNob3VsZCBiZSB0aGUgUkhTLiAgW2lzQW5kXSBzaG91bGQgaW5kaWNhdGUgd2hldGhlciB0aGUKICAvLy8gbG9naWNhbCBvcGVyYXRvciBpcyAiJiYiIG9yICJ8fCIuCiAgdm9pZCBsb2dpY2FsQmluYXJ5T3BfZW5kKEV4cHJlc3Npb24gd2hvbGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCwKICAgICAge0ByZXF1aXJlZCBib29sIGlzQW5kfSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIHRoZSBMSFMgb2YgYSBsb2dpY2FsIGJpbmFyeSBvcGVyYXRpb24KICAvLy8gKCJ8fCIgb3IgIiYmIikuCiAgLy8vIFtyaWdodE9wZXJhbmRdIHNob3VsZCBiZSB0aGUgTEhTLiAgW2lzQW5kXSBzaG91bGQgaW5kaWNhdGUgd2hldGhlciB0aGUKICAvLy8gbG9naWNhbCBvcGVyYXRvciBpcyAiJiYiIG9yICJ8fCIuCiAgdm9pZCBsb2dpY2FsQmluYXJ5T3BfcmlnaHRCZWdpbihFeHByZXNzaW9uIGxlZnRPcGVyYW5kLAogICAgICB7QHJlcXVpcmVkIGJvb2wgaXNBbmR9KTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdmlzaXRpbmcgYSBsb2dpY2FsIG5vdCAoIiEiKSBleHByZXNzaW9uLgogIC8vLyBbbm90RXhwcmVzc2lvbl0gc2hvdWxkIGJlIHRoZSBjb21wbGV0ZSBleHByZXNzaW9uLiAgW29wZXJhbmRdIHNob3VsZCBiZQogIC8vLyB0aGUgc3ViZXhwcmVzc2lvbiB3aG9zZSBsb2dpY2FsIHZhbHVlIGlzIGJlaW5nIG5lZ2F0ZWQuCiAgdm9pZCBsb2dpY2FsTm90X2VuZChFeHByZXNzaW9uIG5vdEV4cHJlc3Npb24sIEV4cHJlc3Npb24gb3BlcmFuZCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYWZ0ZXIgdmlzaXRpbmcgYSBub24tbnVsbCBhc3NlcnRpb24gKGB4IWApCiAgLy8vIGV4cHJlc3Npb24uCiAgdm9pZCBub25OdWxsQXNzZXJ0X2VuZChFeHByZXNzaW9uIG9wZXJhbmQpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBhZnRlciB2aXNpdGluZyBhbiBleHByZXNzaW9uIHVzaW5nIGA/LmAuCiAgdm9pZCBudWxsQXdhcmVBY2Nlc3NfZW5kKCk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIGEgbnVsbC1hd2FyZSBvcGVyYXRvciBzdWNoIGFzIGA/LmAsCiAgLy8vIGA/Li5gLCBgPy5bYCwgb3IgYD8uLltgLgogIC8vLwogIC8vLyBbdGFyZ2V0XSBzaG91bGQgYmUgdGhlIGV4cHJlc3Npb24ganVzdCBiZWZvcmUgdGhlIG51bGwtYXdhcmUgb3BlcmF0b3IsIG9yCiAgLy8vIGBudWxsYCBpZiB0aGUgbnVsbC1hd2FyZSBhY2Nlc3Mgc3RhcnRzIGEgY2FzY2FkZSBzZWN0aW9uLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgW251bGxBd2FyZUFjY2Vzc19lbmRdIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNvbmNsdXNpb24KICAvLy8gb2YgYW55IG51bGwtc2hvcnRpbmcgdGhhdCBpcyBjYXVzZWQgYnkgdGhlIGA/LmAuICBTbywgZm9yIGV4YW1wbGUsIGlmIHRoZQogIC8vLyBjb2RlIGJlaW5nIGFuYWx5emVkIGlzIGB4Py55Py56KHgpYCwgW251bGxBd2FyZUFjY2Vzc19yaWdodEJlZ2luXSBzaG91bGQKICAvLy8gYmUgY2FsbGVkIG9uY2UgdXBvbiByZWFjaGluZyBlYWNoIGA/LmAsIGJ1dCBbbnVsbEF3YXJlQWNjZXNzX2VuZF0gc2hvdWxkCiAgLy8vIG5vdCBiZSBjYWxsZWQgdW50aWwgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgbWV0aG9kIGNhbGwgdG8gYHooeClgLgogIHZvaWQgbnVsbEF3YXJlQWNjZXNzX3JpZ2h0QmVnaW4oRXhwcmVzc2lvbiB0YXJnZXQpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIGVuY291bnRlcmluZyBhbiBleHByZXNzaW9uIHRoYXQgaXMgYSBgbnVsbGAgbGl0ZXJhbC4KICB2b2lkIG51bGxMaXRlcmFsKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYWZ0ZXIgdmlzaXRpbmcgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYSBkaWZmZXJlbnQgW0V4cHJlc3Npb25dCiAgLy8vIG9iamVjdCB0byByZXByZXNlbnQgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gYW5kIGl0cyBjb250ZW50cy4KICB2b2lkIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKAogICAgICBFeHByZXNzaW9uIG91dGVyRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBpbm5lckV4cHJlc3Npb24pOwoKICAvLy8gUmV0cmlldmVzIHRoZSB0eXBlIHRoYXQgdGhlIFt2YXJpYWJsZV0gaXMgcHJvbW90ZWQgdG8sIGlmIHRoZSBbdmFyaWFibGVdCiAgLy8vIGlzIGN1cnJlbnRseSBwcm9tb3RlZC4gIE90aGVyd2lzZSByZXR1cm5zIGBudWxsYC4KICAvLy8KICAvLy8gRm9yIHRlc3Rpbmcgb25seS4gIFBsZWFzZSB1c2UgW3ZhcmlhYmxlUmVhZF0gaW5zdGVhZC4KICBAdmlzaWJsZUZvclRlc3RpbmcKICBUeXBlIHByb21vdGVkVHlwZShWYXJpYWJsZSB2YXJpYWJsZSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIHZpc2l0aW5nIG9uZSBvZiB0aGUgY2FzZXMgaW4gdGhlIGJvZHkgb2YgYQogIC8vLyBzd2l0Y2ggc3RhdGVtZW50LiAgU2VlIFtzd2l0Y2hTdGF0ZW1lbnRfZXhwcmVzc2lvbkVuZF0gZm9yIGRldGFpbHMuCiAgLy8vCiAgLy8vIFtoYXNMYWJlbF0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhc2UgaGFzIGFueSBsYWJlbHMuCiAgLy8vCiAgLy8vIFtub2RlXSBzaG91bGQgYmUgdGhlIHNhbWUgbm9kZSB0aGF0IHdhcyBwYXNzZWQgdG8KICAvLy8gW0Fzc2lnbmVkVmFyaWFibGVzLmVuZE5vZGVdIGZvciB0aGUgc3dpdGNoIHN0YXRlbWVudC4KICB2b2lkIHN3aXRjaFN0YXRlbWVudF9iZWdpbkNhc2UoYm9vbCBoYXNMYWJlbCwgTm9kZSBub2RlKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QganVzdCBhZnRlciB2aXNpdGluZyB0aGUgYm9keSBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQuICBTZWUKICAvLy8gW3N3aXRjaFN0YXRlbWVudF9leHByZXNzaW9uRW5kXSBmb3IgZGV0YWlscy4KICAvLy8KICAvLy8gW2lzRXhoYXVzdGl2ZV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgaGFkIGEgImRlZmF1bHQiCiAgLy8vIGNhc2UsIG9yIGlzIGJhc2VkIG9uIGFuIGVudW1lcmF0aW9uIGFuZCBhbGwgdGhlIGVudW1lcmF0aW9uIGNvbnN0YW50cwogIC8vLyB3ZXJlIGxpc3RlZCBpbiBjYXNlcy4KICB2b2lkIHN3aXRjaFN0YXRlbWVudF9lbmQoYm9vbCBpc0V4aGF1c3RpdmUpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGFmdGVyIHZpc2l0aW5nIHRoZSBleHByZXNzaW9uIHBhcnQgb2YgYSBzd2l0Y2gKICAvLy8gc3RhdGVtZW50LgogIC8vLwogIC8vLyBUaGUgb3JkZXIgb2YgdmlzaXRpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IHNob3VsZCBiZToKICAvLy8gLSBWaXNpdCB0aGUgc3dpdGNoIGV4cHJlc3Npb24uCiAgLy8vIC0gQ2FsbCBbc3dpdGNoU3RhdGVtZW50X2V4cHJlc3Npb25FbmRdLgogIC8vLyAtIEZvciBlYWNoIHN3aXRjaCBjYXNlIChpbmNsdWRpbmcgdGhlIGRlZmF1bHQgY2FzZSwgaWYgYW55KToKICAvLy8gICAtIENhbGwgW3N3aXRjaFN0YXRlbWVudF9iZWdpbkNhc2VdLgogIC8vLyAgIC0gVmlzaXQgdGhlIGNhc2UuCiAgLy8vIC0gQ2FsbCBbc3dpdGNoU3RhdGVtZW50X2VuZF0uCiAgdm9pZCBzd2l0Y2hTdGF0ZW1lbnRfZXhwcmVzc2lvbkVuZChTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QganVzdCBiZWZvcmUgdmlzaXRpbmcgdGhlIGJvZHkgb2YgYSAidHJ5L2NhdGNoIiBzdGF0ZW1lbnQuCiAgLy8vCiAgLy8vIFRoZSBvcmRlciBvZiB2aXNpdGluZyBhICJ0cnkvY2F0Y2giIHN0YXRlbWVudCBzaG91bGQgYmU6CiAgLy8vIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfYm9keUJlZ2luXQogIC8vLyAtIFZpc2l0IHRoZSB0cnkgYmxvY2sKICAvLy8gLSBDYWxsIFt0cnlDYXRjaFN0YXRlbWVudF9ib2R5RW5kXQogIC8vLyAtIEZvciBlYWNoIGNhdGNoIGJsb2NrOgogIC8vLyAgIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hCZWdpbl0KICAvLy8gICAtIENhbGwgW2luaXRpYWxpemVdIGZvciB0aGUgZXhjZXB0aW9uIGFuZCBzdGFjayB0cmFjZSB2YXJpYWJsZXMKICAvLy8gICAtIFZpc2l0IHRoZSBjYXRjaCBibG9jawogIC8vLyAgIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hFbmRdCiAgLy8vIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfZW5kXQogIC8vLwogIC8vLyBUaGUgb3JkZXIgb2YgdmlzaXRpbmcgYSAidHJ5L2NhdGNoL2ZpbmFsbHkiIHN0YXRlbWVudCBzaG91bGQgYmU6CiAgLy8vIC0gQ2FsbCBbdHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW5dCiAgLy8vIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfYm9keUJlZ2luXQogIC8vLyAtIFZpc2l0IHRoZSB0cnkgYmxvY2sKICAvLy8gLSBDYWxsIFt0cnlDYXRjaFN0YXRlbWVudF9ib2R5RW5kXQogIC8vLyAtIEZvciBlYWNoIGNhdGNoIGJsb2NrOgogIC8vLyAgIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hCZWdpbl0KICAvLy8gICAtIENhbGwgW2luaXRpYWxpemVdIGZvciB0aGUgZXhjZXB0aW9uIGFuZCBzdGFjayB0cmFjZSB2YXJpYWJsZXMKICAvLy8gICAtIFZpc2l0IHRoZSBjYXRjaCBibG9jawogIC8vLyAgIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hFbmRdCiAgLy8vIC0gQ2FsbCBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfZW5kXQogIC8vLyAtIENhbGwgW3RyeUZpbmFsbHlTdGF0ZW1lbnRfZmluYWxseUJlZ2luXQogIC8vLyAtIFZpc2l0IHRoZSBmaW5hbGx5IGJsb2NrCiAgLy8vIC0gQ2FsbCBbdHJ5RmluYWxseVN0YXRlbWVudF9lbmRdCiAgdm9pZCB0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW4oKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QganVzdCBhZnRlciB2aXNpdGluZyB0aGUgYm9keSBvZiBhICJ0cnkvY2F0Y2giIHN0YXRlbWVudC4KICAvLy8gU2VlIFt0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW5dIGZvciBkZXRhaWxzLgogIC8vLwogIC8vLyBbYm9keV0gc2hvdWxkIGJlIHRoZSBzYW1lIG5vZGUgdGhhdCB3YXMgcGFzc2VkIHRvCiAgLy8vIFtBc3NpZ25lZFZhcmlhYmxlcy5lbmROb2RlXSBmb3IgdGhlICJ0cnkiIHBhcnQgb2YgdGhlIHRyeS9jYXRjaCBzdGF0ZW1lbnQuCiAgdm9pZCB0cnlDYXRjaFN0YXRlbWVudF9ib2R5RW5kKE5vZGUgYm9keSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIHZpc2l0aW5nIGEgY2F0Y2ggY2xhdXNlIG9mIGEgInRyeS9jYXRjaCIKICAvLy8gc3RhdGVtZW50LiAgU2VlIFt0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW5dIGZvciBkZXRhaWxzLgogIC8vLwogIC8vLyBbZXhjZXB0aW9uVmFyaWFibGVdIHNob3VsZCBiZSB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGRlY2xhcmVkIGJ5IHRoZSBjYXRjaAogIC8vLyBjbGF1c2UsIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBleGNlcHRpb24gdmFyaWFibGUuICBTaW1pbGFyIGZvcgogIC8vLyBbc3RhY2tUcmFjZVZhcmlhYmxlXS4KICB2b2lkIHRyeUNhdGNoU3RhdGVtZW50X2NhdGNoQmVnaW4oCiAgICAgIFZhcmlhYmxlIGV4Y2VwdGlvblZhcmlhYmxlLCBWYXJpYWJsZSBzdGFja1RyYWNlVmFyaWFibGUpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGFmdGVyIHZpc2l0aW5nIGEgY2F0Y2ggY2xhdXNlIG9mIGEgInRyeS9jYXRjaCIKICAvLy8gc3RhdGVtZW50LiAgU2VlIFt0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW5dIGZvciBkZXRhaWxzLgogIHZvaWQgdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hFbmQoKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QganVzdCBhZnRlciB2aXNpdGluZyBhICJ0cnkvY2F0Y2giIHN0YXRlbWVudC4gIFNlZQogIC8vLyBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfYm9keUJlZ2luXSBmb3IgZGV0YWlscy4KICB2b2lkIHRyeUNhdGNoU3RhdGVtZW50X2VuZCgpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGJlZm9yZSB2aXNpdGluZyB0aGUgYm9keSBvZiBhICJ0cnkvZmluYWxseSIKICAvLy8gc3RhdGVtZW50LgogIC8vLwogIC8vLyBUaGUgb3JkZXIgb2YgdmlzaXRpbmcgYSAidHJ5L2ZpbmFsbHkiIHN0YXRlbWVudCBzaG91bGQgYmU6CiAgLy8vIC0gQ2FsbCBbdHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW5dCiAgLy8vIC0gVmlzaXQgdGhlIHRyeSBibG9jawogIC8vLyAtIENhbGwgW3RyeUZpbmFsbHlTdGF0ZW1lbnRfZmluYWxseUJlZ2luXQogIC8vLyAtIFZpc2l0IHRoZSBmaW5hbGx5IGJsb2NrCiAgLy8vIC0gQ2FsbCBbdHJ5RmluYWxseVN0YXRlbWVudF9lbmRdCiAgLy8vCiAgLy8vIFNlZSBbdHJ5Q2F0Y2hTdGF0ZW1lbnRfYm9keUJlZ2luXSBmb3IgdGhlIG9yZGVyIG9mIHZpc2l0aW5nIGEKICAvLy8gInRyeS9jYXRjaC9maW5hbGx5IiBzdGF0ZW1lbnQuCiAgdm9pZCB0cnlGaW5hbGx5U3RhdGVtZW50X2JvZHlCZWdpbigpOwoKICAvLy8gQ2FsbCB0aGlzIG1ldGhvZCBqdXN0IGFmdGVyIHZpc2l0aW5nIGEgInRyeS9maW5hbGx5IiBzdGF0ZW1lbnQuCiAgLy8vIFNlZSBbdHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW5dIGZvciBkZXRhaWxzLgogIC8vLwogIC8vLyBbZmluYWxseUJsb2NrXSBzaG91bGQgYmUgdGhlIHNhbWUgbm9kZSB0aGF0IHdhcyBwYXNzZWQgdG8KICAvLy8gW0Fzc2lnbmVkVmFyaWFibGVzLmVuZE5vZGVdIGZvciB0aGUgImZpbmFsbHkiIHBhcnQgb2YgdGhlIHRyeS9maW5hbGx5CiAgLy8vIHN0YXRlbWVudC4KICB2b2lkIHRyeUZpbmFsbHlTdGF0ZW1lbnRfZW5kKE5vZGUgZmluYWxseUJsb2NrKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QganVzdCBiZWZvcmUgdmlzaXRpbmcgdGhlIGZpbmFsbHkgYmxvY2sgb2YgYSAidHJ5L2ZpbmFsbHkiCiAgLy8vIHN0YXRlbWVudC4gIFNlZSBbdHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW5dIGZvciBkZXRhaWxzLgogIC8vLwogIC8vLyBbYm9keV0gc2hvdWxkIGJlIHRoZSBzYW1lIG5vZGUgdGhhdCB3YXMgcGFzc2VkIHRvCiAgLy8vIFtBc3NpZ25lZFZhcmlhYmxlcy5lbmROb2RlXSBmb3IgdGhlICJ0cnkiIHBhcnQgb2YgdGhlIHRyeS9maW5hbGx5CiAgLy8vIHN0YXRlbWVudC4KICB2b2lkIHRyeUZpbmFsbHlTdGF0ZW1lbnRfZmluYWxseUJlZ2luKE5vZGUgYm9keSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIHdoZW4gZW5jb3VudGVyaW5nIGFuIGV4cHJlc3Npb24gdGhhdCByZWFkcyB0aGUgdmFsdWUgb2YKICAvLy8gYSB2YXJpYWJsZS4KICAvLy8KICAvLy8gSWYgdGhlIHZhcmlhYmxlJ3MgdHlwZSBpcyBjdXJyZW50bHkgcHJvbW90ZWQsIHRoZSBwcm9tb3RlZCB0eXBlIGlzCiAgLy8vIHJldHVybmVkLiAgT3RoZXJ3aXNlIGBudWxsYCBpcyByZXR1cm5lZC4KICBUeXBlIHZhcmlhYmxlUmVhZChFeHByZXNzaW9uIGV4cHJlc3Npb24sIFZhcmlhYmxlIHZhcmlhYmxlKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdmlzaXRpbmcgdGhlIGNvbmRpdGlvbiBwYXJ0IG9mIGEgIndoaWxlIiBzdGF0ZW1lbnQuCiAgLy8vIFt3aGlsZVN0YXRlbWVudF0gc2hvdWxkIGJlIHRoZSBmdWxsIHdoaWxlIHN0YXRlbWVudC4gIFtjb25kaXRpb25dIHNob3VsZAogIC8vLyBiZSB0aGUgY29uZGl0aW9uIHBhcnQgb2YgdGhlIHdoaWxlIHN0YXRlbWVudC4KICB2b2lkIHdoaWxlU3RhdGVtZW50X2JvZHlCZWdpbihTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQsIEV4cHJlc3Npb24gY29uZGl0aW9uKTsKCiAgLy8vIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHZpc2l0aW5nIHRoZSBjb25kaXRpb24gcGFydCBvZiBhICJ3aGlsZSIKICAvLy8gc3RhdGVtZW50LgogIC8vLwogIC8vLyBbbm9kZV0gc2hvdWxkIGJlIHRoZSBzYW1lIG5vZGUgdGhhdCB3YXMgcGFzc2VkIHRvCiAgLy8vIFtBc3NpZ25lZFZhcmlhYmxlcy5lbmROb2RlXSBmb3IgdGhlIHdoaWxlIHN0YXRlbWVudC4KICB2b2lkIHdoaWxlU3RhdGVtZW50X2NvbmRpdGlvbkJlZ2luKE5vZGUgbm9kZSk7CgogIC8vLyBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHZpc2l0aW5nIGEgIndoaWxlIiBzdGF0ZW1lbnQuCiAgdm9pZCB3aGlsZVN0YXRlbWVudF9lbmQoKTsKCiAgLy8vIFJlZ2lzdGVyIHdyaXRlIG9mIHRoZSBnaXZlbiBbdmFyaWFibGVdIGluIHRoZSBjdXJyZW50IHN0YXRlLgogIC8vLyBbd3JpdHRlblR5cGVdIHNob3VsZCBiZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbi4KICB2b2lkIHdyaXRlKFZhcmlhYmxlIHZhcmlhYmxlLCBUeXBlIHdyaXR0ZW5UeXBlKTsKfQoKLy8vIEFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBbRmxvd0FuYWx5c2lzXSB0aGF0IHByaW50cyBvdXQgaW5wdXRzIGFuZCBvdXRwdXQKLy8vIGF0IHRoZSBBUEkgYm91bmRhcnksIGZvciBhc3Npc3RhbmNlIGluIGRlYnVnZ2luZy4KY2xhc3MgRmxvd0FuYWx5c2lzRGVidWc8Tm9kZSwgU3RhdGVtZW50IGV4dGVuZHMgTm9kZSwgRXhwcmVzc2lvbiwgVmFyaWFibGUsCiAgICBUeXBlPiBpbXBsZW1lbnRzIEZsb3dBbmFseXNpczxOb2RlLCBTdGF0ZW1lbnQsIEV4cHJlc3Npb24sIFZhcmlhYmxlLCBUeXBlPiB7CiAgX0Zsb3dBbmFseXNpc0ltcGw8Tm9kZSwgU3RhdGVtZW50LCBFeHByZXNzaW9uLCBWYXJpYWJsZSwgVHlwZT4gX3dyYXBwZWQ7CgogIGJvb2wgX2V4Y2VwdGlvbk9jY3VycmVkID0gZmFsc2U7CgogIGZhY3RvcnkgRmxvd0FuYWx5c2lzRGVidWcoVHlwZU9wZXJhdGlvbnM8VmFyaWFibGUsIFR5cGU+IHR5cGVPcGVyYXRpb25zLAogICAgICBBc3NpZ25lZFZhcmlhYmxlczxOb2RlLCBWYXJpYWJsZT4gYXNzaWduZWRWYXJpYWJsZXMpIHsKICAgIHByaW50KCdGbG93QW5hbHlzaXNEZWJ1ZygpJyk7CiAgICByZXR1cm4gbmV3IEZsb3dBbmFseXNpc0RlYnVnLl8oCiAgICAgICAgbmV3IF9GbG93QW5hbHlzaXNJbXBsKHR5cGVPcGVyYXRpb25zLCBhc3NpZ25lZFZhcmlhYmxlcykpOwogIH0KCiAgRmxvd0FuYWx5c2lzRGVidWcuXyh0aGlzLl93cmFwcGVkKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNSZWFjaGFibGUgPT4KICAgICAgX3dyYXAoJ2lzUmVhY2hhYmxlJywgKCkgPT4gX3dyYXBwZWQuaXNSZWFjaGFibGUsIGlzUXVlcnk6IHRydWUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFzRXhwcmVzc2lvbl9lbmQoRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uLCBUeXBlIHR5cGUpIHsKICAgIF93cmFwKCdhc0V4cHJlc3Npb25fZW5kKCRzdWJFeHByZXNzaW9uLCAkdHlwZSknLAogICAgICAgICgpID0+IF93cmFwcGVkLmFzRXhwcmVzc2lvbl9lbmQoc3ViRXhwcmVzc2lvbiwgdHlwZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhc3NlcnRfYWZ0ZXJDb25kaXRpb24oRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIF93cmFwKCdhc3NlcnRfYWZ0ZXJDb25kaXRpb24oJGNvbmRpdGlvbiknLAogICAgICAgICgpID0+IF93cmFwcGVkLmFzc2VydF9hZnRlckNvbmRpdGlvbihjb25kaXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXNzZXJ0X2JlZ2luKCkgewogICAgX3dyYXAoJ2Fzc2VydF9iZWdpbigpJywgKCkgPT4gX3dyYXBwZWQuYXNzZXJ0X2JlZ2luKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhc3NlcnRfZW5kKCkgewogICAgX3dyYXAoJ2Fzc2VydF9lbmQoKScsICgpID0+IF93cmFwcGVkLmFzc2VydF9lbmQoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJvb2xlYW5MaXRlcmFsKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgYm9vbCB2YWx1ZSkgewogICAgX3dyYXAoJ2Jvb2xlYW5MaXRlcmFsKCRleHByZXNzaW9uLCAkdmFsdWUpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5ib29sZWFuTGl0ZXJhbChleHByZXNzaW9uLCB2YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjb25kaXRpb25hbF9lbHNlQmVnaW4oRXhwcmVzc2lvbiB0aGVuRXhwcmVzc2lvbikgewogICAgX3dyYXAoJ2NvbmRpdGlvbmFsX2Vsc2VCZWdpbigkdGhlbkV4cHJlc3Npb24nLAogICAgICAgICgpID0+IF93cmFwcGVkLmNvbmRpdGlvbmFsX2Vsc2VCZWdpbih0aGVuRXhwcmVzc2lvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjb25kaXRpb25hbF9lbmQoCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uYWxFeHByZXNzaW9uLCBFeHByZXNzaW9uIGVsc2VFeHByZXNzaW9uKSB7CiAgICBfd3JhcCgnY29uZGl0aW9uYWxfZW5kKCRjb25kaXRpb25hbEV4cHJlc3Npb24sICRlbHNlRXhwcmVzc2lvbicsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQuY29uZGl0aW9uYWxfZW5kKGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwgZWxzZUV4cHJlc3Npb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY29uZGl0aW9uYWxfdGhlbkJlZ2luKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICBfd3JhcCgnY29uZGl0aW9uYWxfdGhlbkJlZ2luKCRjb25kaXRpb24pJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5jb25kaXRpb25hbF90aGVuQmVnaW4oY29uZGl0aW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRvU3RhdGVtZW50X2JvZHlCZWdpbihTdGF0ZW1lbnQgZG9TdGF0ZW1lbnQpIHsKICAgIHJldHVybiBfd3JhcCgnZG9TdGF0ZW1lbnRfYm9keUJlZ2luKCRkb1N0YXRlbWVudCknLAogICAgICAgICgpID0+IF93cmFwcGVkLmRvU3RhdGVtZW50X2JvZHlCZWdpbihkb1N0YXRlbWVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkb1N0YXRlbWVudF9jb25kaXRpb25CZWdpbigpIHsKICAgIHJldHVybiBfd3JhcCgnZG9TdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW4oKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQuZG9TdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW4oKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRvU3RhdGVtZW50X2VuZChFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgcmV0dXJuIF93cmFwKCdkb1N0YXRlbWVudF9lbmQoJGNvbmRpdGlvbiknLAogICAgICAgICgpID0+IF93cmFwcGVkLmRvU3RhdGVtZW50X2VuZChjb25kaXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXF1YWxpdHlPcF9lbmQoRXhwcmVzc2lvbiB3aG9sZUV4cHJlc3Npb24sIEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kLAogICAgICB7Ym9vbCBub3RFcXVhbCA9IGZhbHNlfSkgewogICAgX3dyYXAoCiAgICAgICAgJ2VxdWFsaXR5T3BfZW5kKCR3aG9sZUV4cHJlc3Npb24sICRyaWdodE9wZXJhbmQsIG5vdEVxdWFsOiAkbm90RXF1YWwpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5lcXVhbGl0eU9wX2VuZCh3aG9sZUV4cHJlc3Npb24sIHJpZ2h0T3BlcmFuZCwKICAgICAgICAgICAgbm90RXF1YWw6IG5vdEVxdWFsKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVxdWFsaXR5T3BfcmlnaHRCZWdpbihFeHByZXNzaW9uIGxlZnRPcGVyYW5kKSB7CiAgICBfd3JhcCgnZXF1YWxpdHlPcF9yaWdodEJlZ2luKCRsZWZ0T3BlcmFuZCknLAogICAgICAgICgpID0+IF93cmFwcGVkLmVxdWFsaXR5T3BfcmlnaHRCZWdpbihsZWZ0T3BlcmFuZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5pc2goKSB7CiAgICBpZiAoX2V4Y2VwdGlvbk9jY3VycmVkKSB7CiAgICAgIF93cmFwKCdmaW5pc2goKSAoc2tpcHBlZCknLCAoKSB7fSwgaXNQdXJlOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIF93cmFwKCdmaW5pc2goKScsICgpID0+IF93cmFwcGVkLmZpbmlzaCgpLCBpc1B1cmU6IHRydWUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JfYm9keUJlZ2luKFN0YXRlbWVudCBub2RlLCBFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgX3dyYXAoJ2Zvcl9ib2R5QmVnaW4oJG5vZGUsICRjb25kaXRpb24pJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5mb3JfYm9keUJlZ2luKG5vZGUsIGNvbmRpdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JfY29uZGl0aW9uQmVnaW4oTm9kZSBub2RlKSB7CiAgICBfd3JhcCgnZm9yX2NvbmRpdGlvbkJlZ2luKCRub2RlKScsICgpID0+IF93cmFwcGVkLmZvcl9jb25kaXRpb25CZWdpbihub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvcl9lbmQoKSB7CiAgICBfd3JhcCgnZm9yX2VuZCgpJywgKCkgPT4gX3dyYXBwZWQuZm9yX2VuZCgpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yX3VwZGF0ZXJCZWdpbigpIHsKICAgIF93cmFwKCdmb3JfdXBkYXRlckJlZ2luKCknLCAoKSA9PiBfd3JhcHBlZC5mb3JfdXBkYXRlckJlZ2luKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoX2JvZHlCZWdpbihOb2RlIG5vZGUsIFZhcmlhYmxlIGxvb3BWYXJpYWJsZSwgVHlwZSB3cml0dGVuVHlwZSkgewogICAgcmV0dXJuIF93cmFwKCdmb3JFYWNoX2JvZHlCZWdpbigkbm9kZSwgJGxvb3BWYXJpYWJsZSwgJHdyaXR0ZW5UeXBlKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQuZm9yRWFjaF9ib2R5QmVnaW4obm9kZSwgbG9vcFZhcmlhYmxlLCB3cml0dGVuVHlwZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoX2VuZCgpIHsKICAgIHJldHVybiBfd3JhcCgnZm9yRWFjaF9lbmQoKScsICgpID0+IF93cmFwcGVkLmZvckVhY2hfZW5kKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmdW5jdGlvbkV4cHJlc3Npb25fYmVnaW4oTm9kZSBub2RlKSB7CiAgICBfd3JhcCgnZnVuY3Rpb25FeHByZXNzaW9uX2JlZ2luKCRub2RlKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQuZnVuY3Rpb25FeHByZXNzaW9uX2JlZ2luKG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZnVuY3Rpb25FeHByZXNzaW9uX2VuZCgpIHsKICAgIF93cmFwKCdmdW5jdGlvbkV4cHJlc3Npb25fZW5kKCknLCAoKSA9PiBfd3JhcHBlZC5mdW5jdGlvbkV4cHJlc3Npb25fZW5kKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVCcmVhayhTdGF0ZW1lbnQgdGFyZ2V0KSB7CiAgICBfd3JhcCgnaGFuZGxlQnJlYWsoJHRhcmdldCknLCAoKSA9PiBfd3JhcHBlZC5oYW5kbGVCcmVhayh0YXJnZXQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29udGludWUoU3RhdGVtZW50IHRhcmdldCkgewogICAgX3dyYXAoJ2hhbmRsZUNvbnRpbnVlKCR0YXJnZXQpJywgKCkgPT4gX3dyYXBwZWQuaGFuZGxlQ29udGludWUodGFyZ2V0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUV4aXQoKSB7CiAgICBfd3JhcCgnaGFuZGxlRXhpdCgpJywgKCkgPT4gX3dyYXBwZWQuaGFuZGxlRXhpdCgpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaWZOdWxsRXhwcmVzc2lvbl9lbmQoKSB7CiAgICByZXR1cm4gX3dyYXAoCiAgICAgICAgJ2lmTnVsbEV4cHJlc3Npb25fZW5kKCknLCAoKSA9PiBfd3JhcHBlZC5pZk51bGxFeHByZXNzaW9uX2VuZCgpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaWZOdWxsRXhwcmVzc2lvbl9yaWdodEJlZ2luKEV4cHJlc3Npb24gbGVmdEhhbmRTaWRlKSB7CiAgICByZXR1cm4gX3dyYXAoJ2lmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbigkbGVmdEhhbmRTaWRlKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQuaWZOdWxsRXhwcmVzc2lvbl9yaWdodEJlZ2luKGxlZnRIYW5kU2lkZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpZlN0YXRlbWVudF9lbHNlQmVnaW4oKSB7CiAgICByZXR1cm4gX3dyYXAoCiAgICAgICAgJ2lmU3RhdGVtZW50X2Vsc2VCZWdpbigpJywgKCkgPT4gX3dyYXBwZWQuaWZTdGF0ZW1lbnRfZWxzZUJlZ2luKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpZlN0YXRlbWVudF9lbmQoYm9vbCBoYXNFbHNlKSB7CiAgICBfd3JhcCgnaWZTdGF0ZW1lbnRfZW5kKCRoYXNFbHNlKScsICgpID0+IF93cmFwcGVkLmlmU3RhdGVtZW50X2VuZChoYXNFbHNlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGlmU3RhdGVtZW50X3RoZW5CZWdpbihFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgX3dyYXAoJ2lmU3RhdGVtZW50X3RoZW5CZWdpbigkY29uZGl0aW9uKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQuaWZTdGF0ZW1lbnRfdGhlbkJlZ2luKGNvbmRpdGlvbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbml0aWFsaXplKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICBfd3JhcCgnaW5pdGlhbGl6ZSgkdmFyaWFibGUpJywgKCkgPT4gX3dyYXBwZWQuaW5pdGlhbGl6ZSh2YXJpYWJsZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0Fzc2lnbmVkKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICByZXR1cm4gX3dyYXAoJ2lzQXNzaWduZWQoJHZhcmlhYmxlKScsICgpID0+IF93cmFwcGVkLmlzQXNzaWduZWQodmFyaWFibGUpLAogICAgICAgIGlzUXVlcnk6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpc0V4cHJlc3Npb25fZW5kKEV4cHJlc3Npb24gaXNFeHByZXNzaW9uLCBFeHByZXNzaW9uIHN1YkV4cHJlc3Npb24sCiAgICAgIGJvb2wgaXNOb3QsIFR5cGUgdHlwZSkgewogICAgX3dyYXAoCiAgICAgICAgJ2lzRXhwcmVzc2lvbl9lbmQoJGlzRXhwcmVzc2lvbiwgJHN1YkV4cHJlc3Npb24sICRpc05vdCwgJHR5cGUpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5pc0V4cHJlc3Npb25fZW5kKAogICAgICAgICAgICBpc0V4cHJlc3Npb24sIHN1YkV4cHJlc3Npb24sIGlzTm90LCB0eXBlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ2ljYWxCaW5hcnlPcF9lbmQoRXhwcmVzc2lvbiB3aG9sZUV4cHJlc3Npb24sIEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kLAogICAgICB7QHJlcXVpcmVkIGJvb2wgaXNBbmR9KSB7CiAgICBfd3JhcCgKICAgICAgICAnbG9naWNhbEJpbmFyeU9wX2VuZCgkd2hvbGVFeHByZXNzaW9uLCAkcmlnaHRPcGVyYW5kLCBpc0FuZDogJGlzQW5kKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQubG9naWNhbEJpbmFyeU9wX2VuZCh3aG9sZUV4cHJlc3Npb24sIHJpZ2h0T3BlcmFuZCwKICAgICAgICAgICAgaXNBbmQ6IGlzQW5kKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ2ljYWxCaW5hcnlPcF9yaWdodEJlZ2luKEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsCiAgICAgIHtAcmVxdWlyZWQgYm9vbCBpc0FuZH0pIHsKICAgIF93cmFwKCdsb2dpY2FsQmluYXJ5T3BfcmlnaHRCZWdpbigkbGVmdE9wZXJhbmQsIGlzQW5kOiAkaXNBbmQpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5sb2dpY2FsQmluYXJ5T3BfcmlnaHRCZWdpbihsZWZ0T3BlcmFuZCwgaXNBbmQ6IGlzQW5kKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ2ljYWxOb3RfZW5kKEV4cHJlc3Npb24gbm90RXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBvcGVyYW5kKSB7CiAgICByZXR1cm4gX3dyYXAoJ2xvZ2ljYWxOb3RfZW5kKCRub3RFeHByZXNzaW9uLCAkb3BlcmFuZCknLAogICAgICAgICgpID0+IF93cmFwcGVkLmxvZ2ljYWxOb3RfZW5kKG5vdEV4cHJlc3Npb24sIG9wZXJhbmQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgbm9uTnVsbEFzc2VydF9lbmQoRXhwcmVzc2lvbiBvcGVyYW5kKSB7CiAgICByZXR1cm4gX3dyYXAoJ25vbk51bGxBc3NlcnRfZW5kKCRvcGVyYW5kKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQubm9uTnVsbEFzc2VydF9lbmQob3BlcmFuZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBudWxsQXdhcmVBY2Nlc3NfZW5kKCkgewogICAgX3dyYXAoJ251bGxBd2FyZUFjY2Vzc19lbmQoKScsICgpID0+IF93cmFwcGVkLm51bGxBd2FyZUFjY2Vzc19lbmQoKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG51bGxBd2FyZUFjY2Vzc19yaWdodEJlZ2luKEV4cHJlc3Npb24gdGFyZ2V0KSB7CiAgICBfd3JhcCgnbnVsbEF3YXJlQWNjZXNzX3JpZ2h0QmVnaW4oJHRhcmdldCknLAogICAgICAgICgpID0+IF93cmFwcGVkLm51bGxBd2FyZUFjY2Vzc19yaWdodEJlZ2luKHRhcmdldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBudWxsTGl0ZXJhbChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIF93cmFwKCdudWxsTGl0ZXJhbCgkZXhwcmVzc2lvbiknLCAoKSA9PiBfd3JhcHBlZC5udWxsTGl0ZXJhbChleHByZXNzaW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKAogICAgICBFeHByZXNzaW9uIG91dGVyRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBpbm5lckV4cHJlc3Npb24pIHsKICAgIF93cmFwKAogICAgICAgICdwYXJlbnRoZXNpemVkRXhwcmVzc2lvbigkb3V0ZXJFeHByZXNzaW9uLCAkaW5uZXJFeHByZXNzaW9uKScsCiAgICAgICAgKCkgPT4KICAgICAgICAgICAgX3dyYXBwZWQucGFyZW50aGVzaXplZEV4cHJlc3Npb24ob3V0ZXJFeHByZXNzaW9uLCBpbm5lckV4cHJlc3Npb24pKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgcHJvbW90ZWRUeXBlKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICByZXR1cm4gX3dyYXAoCiAgICAgICAgJ3Byb21vdGVkVHlwZSgkdmFyaWFibGUpJywgKCkgPT4gX3dyYXBwZWQucHJvbW90ZWRUeXBlKHZhcmlhYmxlKSwKICAgICAgICBpc1F1ZXJ5OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc3dpdGNoU3RhdGVtZW50X2JlZ2luQ2FzZShib29sIGhhc0xhYmVsLCBOb2RlIG5vZGUpIHsKICAgIF93cmFwKCdzd2l0Y2hTdGF0ZW1lbnRfYmVnaW5DYXNlKCRoYXNMYWJlbCwgJG5vZGUpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5zd2l0Y2hTdGF0ZW1lbnRfYmVnaW5DYXNlKGhhc0xhYmVsLCBub2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHN3aXRjaFN0YXRlbWVudF9lbmQoYm9vbCBpc0V4aGF1c3RpdmUpIHsKICAgIF93cmFwKCdzd2l0Y2hTdGF0ZW1lbnRfZW5kKCRpc0V4aGF1c3RpdmUpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC5zd2l0Y2hTdGF0ZW1lbnRfZW5kKGlzRXhoYXVzdGl2ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzd2l0Y2hTdGF0ZW1lbnRfZXhwcmVzc2lvbkVuZChTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAgICBfd3JhcCgnc3dpdGNoU3RhdGVtZW50X2V4cHJlc3Npb25FbmQoJHN3aXRjaFN0YXRlbWVudCknLAogICAgICAgICgpID0+IF93cmFwcGVkLnN3aXRjaFN0YXRlbWVudF9leHByZXNzaW9uRW5kKHN3aXRjaFN0YXRlbWVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW4oKSB7CiAgICByZXR1cm4gX3dyYXAoJ3RyeUNhdGNoU3RhdGVtZW50X2JvZHlCZWdpbigpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC50cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW4oKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyeUNhdGNoU3RhdGVtZW50X2JvZHlFbmQoTm9kZSBib2R5KSB7CiAgICByZXR1cm4gX3dyYXAoJ3RyeUNhdGNoU3RhdGVtZW50X2JvZHlFbmQoJGJvZHkpJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC50cnlDYXRjaFN0YXRlbWVudF9ib2R5RW5kKGJvZHkpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hCZWdpbigKICAgICAgVmFyaWFibGUgZXhjZXB0aW9uVmFyaWFibGUsIFZhcmlhYmxlIHN0YWNrVHJhY2VWYXJpYWJsZSkgewogICAgcmV0dXJuIF93cmFwKAogICAgICAgICd0cnlDYXRjaFN0YXRlbWVudF9jYXRjaEJlZ2luKCRleGNlcHRpb25WYXJpYWJsZSwgJHN0YWNrVHJhY2VWYXJpYWJsZSknLAogICAgICAgICgpID0+IF93cmFwcGVkLnRyeUNhdGNoU3RhdGVtZW50X2NhdGNoQmVnaW4oCiAgICAgICAgICAgIGV4Y2VwdGlvblZhcmlhYmxlLCBzdGFja1RyYWNlVmFyaWFibGUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hFbmQoKSB7CiAgICByZXR1cm4gX3dyYXAoJ3RyeUNhdGNoU3RhdGVtZW50X2NhdGNoRW5kKCknLAogICAgICAgICgpID0+IF93cmFwcGVkLnRyeUNhdGNoU3RhdGVtZW50X2NhdGNoRW5kKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cnlDYXRjaFN0YXRlbWVudF9lbmQoKSB7CiAgICByZXR1cm4gX3dyYXAoCiAgICAgICAgJ3RyeUNhdGNoU3RhdGVtZW50X2VuZCgpJywgKCkgPT4gX3dyYXBwZWQudHJ5Q2F0Y2hTdGF0ZW1lbnRfZW5kKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cnlGaW5hbGx5U3RhdGVtZW50X2JvZHlCZWdpbigpIHsKICAgIHJldHVybiBfd3JhcCgndHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW4oKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQudHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW4oKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyeUZpbmFsbHlTdGF0ZW1lbnRfZW5kKE5vZGUgZmluYWxseUJsb2NrKSB7CiAgICByZXR1cm4gX3dyYXAoJ3RyeUZpbmFsbHlTdGF0ZW1lbnRfZW5kKCRmaW5hbGx5QmxvY2spJywKICAgICAgICAoKSA9PiBfd3JhcHBlZC50cnlGaW5hbGx5U3RhdGVtZW50X2VuZChmaW5hbGx5QmxvY2spKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJ5RmluYWxseVN0YXRlbWVudF9maW5hbGx5QmVnaW4oTm9kZSBib2R5KSB7CiAgICByZXR1cm4gX3dyYXAoJ3RyeUZpbmFsbHlTdGF0ZW1lbnRfZmluYWxseUJlZ2luKCRib2R5KScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQudHJ5RmluYWxseVN0YXRlbWVudF9maW5hbGx5QmVnaW4oYm9keSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZSB2YXJpYWJsZVJlYWQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBWYXJpYWJsZSB2YXJpYWJsZSkgewogICAgcmV0dXJuIF93cmFwKCd2YXJpYWJsZVJlYWQoJGV4cHJlc3Npb24sICR2YXJpYWJsZSknLAogICAgICAgICgpID0+IF93cmFwcGVkLnZhcmlhYmxlUmVhZChleHByZXNzaW9uLCB2YXJpYWJsZSksCiAgICAgICAgaXNRdWVyeTogdHJ1ZSwgaXNQdXJlOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHdoaWxlU3RhdGVtZW50X2JvZHlCZWdpbigKICAgICAgU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50LCBFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgcmV0dXJuIF93cmFwKCd3aGlsZVN0YXRlbWVudF9ib2R5QmVnaW4oJHdoaWxlU3RhdGVtZW50LCAkY29uZGl0aW9uKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQud2hpbGVTdGF0ZW1lbnRfYm9keUJlZ2luKHdoaWxlU3RhdGVtZW50LCBjb25kaXRpb24pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd2hpbGVTdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW4oTm9kZSBub2RlKSB7CiAgICByZXR1cm4gX3dyYXAoJ3doaWxlU3RhdGVtZW50X2NvbmRpdGlvbkJlZ2luKCRub2RlKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQud2hpbGVTdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW4obm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3aGlsZVN0YXRlbWVudF9lbmQoKSB7CiAgICByZXR1cm4gX3dyYXAoJ3doaWxlU3RhdGVtZW50X2VuZCgpJywgKCkgPT4gX3dyYXBwZWQud2hpbGVTdGF0ZW1lbnRfZW5kKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3cml0ZShWYXJpYWJsZSB2YXJpYWJsZSwgVHlwZSB3cml0dGVuVHlwZSkgewogICAgX3dyYXAoJ3dyaXRlKCR2YXJpYWJsZSwgJHdyaXR0ZW5UeXBlKScsCiAgICAgICAgKCkgPT4gX3dyYXBwZWQud3JpdGUodmFyaWFibGUsIHdyaXR0ZW5UeXBlKSk7CiAgfQoKICBUIF93cmFwPFQ+KFN0cmluZyBkZXNjcmlwdGlvbiwgVCBjYWxsYmFjaygpLAogICAgICB7Ym9vbCBpc1F1ZXJ5OiBmYWxzZSwgYm9vbCBpc1B1cmV9KSB7CiAgICBpc1B1cmUgPz89IGlzUXVlcnk7CiAgICBwcmludChkZXNjcmlwdGlvbik7CiAgICBUIHJlc3VsdDsKICAgIHRyeSB7CiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7CiAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICBwcmludCgnICA9PiBFWENFUFRJT04gJGUnKTsKICAgICAgcHJpbnQoJyAgICAnICsgc3QudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCdcbicsICdcbiAgICAnKSk7CiAgICAgIF9leGNlcHRpb25PY2N1cnJlZCA9IHRydWU7CiAgICAgIHJldGhyb3c7CiAgICB9CiAgICBpZiAoIWlzUHVyZSkgewogICAgICBfd3JhcHBlZC5fZHVtcFN0YXRlKCk7CiAgICB9CiAgICBpZiAoaXNRdWVyeSkgewogICAgICBwcmludCgnICA9PiAkcmVzdWx0Jyk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLy8vIEFuIGluc3RhbmNlIG9mIHRoZSBbRmxvd01vZGVsXSBjbGFzcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBieQovLy8gZmxvdyBhbmFseXNpcyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aGUgY29udHJvbCBmbG93IG9mIHRoZSBmdW5jdGlvbiBvcgovLy8gbWV0aG9kIGJlaW5nIGFuYWx5emVkLgovLy8KLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBpbW11dGFibGUsIHNvIHRoZSBtZXRob2RzIGJlbG93IHRoYXQgInVwZGF0ZSIKLy8vIHRoZSBzdGF0ZSBhY3R1YWxseSBsZWF2ZSBgdGhpc2AgdW5jaGFuZ2VkIGFuZCByZXR1cm4gYSBuZXcgc3RhdGUgb2JqZWN0LgpAdmlzaWJsZUZvclRlc3RpbmcKY2xhc3MgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiB7CiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcG9pbnQgaW4gdGhlIGNvbnRyb2wgZmxvdyBpcyByZWFjaGFibGUuCiAgZmluYWwgYm9vbCByZWFjaGFibGU7CgogIC8vLyBGb3IgZWFjaCB2YXJpYWJsZSBiZWluZyB0cmFja2VkIGJ5IGZsb3cgYW5hbHlzaXMsIHRoZSB2YXJpYWJsZSdzIG1vZGVsLgogIC8vLwogIC8vLyBGbG93IGFuYWx5c2lzIGhhcyBubyBhd2FyZW5lc3Mgb2Ygc2NvcGUsIHNvIHZhcmlhYmxlcyB0aGF0IGFyZSBvdXQgb2YKICAvLy8gc2NvcGUgYXJlIHJldGFpbmVkIGluIHRoZSBtYXAgdW50aWwgc3VjaCB0aW1lIGFzIHRoZWlyIGRlY2xhcmF0aW9uIG5vCiAgLy8vIGxvbmdlciBkb21pbmF0ZXMgdGhlIGNvbnRyb2wgZmxvdy4gIFNvLCBmb3IgZXhhbXBsZSwgaWYgYSB2YXJpYWJsZSBpcwogIC8vLyBkZWNsYXJlZCBpbnNpZGUgdGhlIGB0aGVuYCBicmFuY2ggb2YgYW4gYGlmYCBzdGF0ZW1lbnQsIGFuZCB0aGUgYGVsc2VgCiAgLy8vIGJyYW5jaCBvZiB0aGUgYGlmYCBzdGF0ZW1lbnQgZW5kcyBpbiBhIGByZXR1cm5gIHN0YXRlbWVudCwgdGhlbiB0aGUKICAvLy8gdmFyaWFibGUgcmVtYWlucyBpbiB0aGUgbWFwIGFmdGVyIHRoZSBgaWZgIHN0YXRlbWVudCBlbmRzLCBldmVuIHRob3VnaCB0aGUKICAvLy8gdmFyaWFibGUgaXMgbm90IGluIHNjb3BlIGFueW1vcmUuICBUaGlzIHNob3VsZCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uCiAgLy8vIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGVycm9yLWZyZWUgY29kZSwgYmVjYXVzZSBpdCBpcyBhbiBlcnJvciB0byByZWZlciB0byBhCiAgLy8vIHZhcmlhYmxlIHRoYXQgaXMgbm8gbG9uZ2VyIGluIHNjb3BlLgogIGZpbmFsIE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPiAvKiEqLyA+IHZhcmlhYmxlSW5mbzsKCiAgLy8vIFZhcmlhYmxlIG1vZGVsIGZvciB2YXJpYWJsZXMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gc2VlbiBiZWZvcmUuCiAgZmluYWwgVmFyaWFibGVNb2RlbDxUeXBlPiBfZnJlc2hWYXJpYWJsZUluZm87CgogIC8vLyBDcmVhdGVzIGEgc3RhdGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIFtyZWFjaGFibGVdIHN0YXR1cy4gIEFsbCB2YXJpYWJsZXMKICAvLy8gYXJlIGFzc3VtZWQgdG8gYmUgdW5wcm9tb3RlZCBhbmQgYWxyZWFkeSBhc3NpZ25lZCwgc28gam9pbmluZyBhbm90aGVyCiAgLy8vIHN0YXRlIHdpdGggdGhpcyBvbmUgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiBpdC4KICBGbG93TW9kZWwoYm9vbCByZWFjaGFibGUpCiAgICAgIDogdGhpcy5fKAogICAgICAgICAgcmVhY2hhYmxlLAogICAgICAgICAgY29uc3Qge30sCiAgICAgICAgKTsKCiAgRmxvd01vZGVsLl8odGhpcy5yZWFjaGFibGUsIHRoaXMudmFyaWFibGVJbmZvKQogICAgICA6IF9mcmVzaFZhcmlhYmxlSW5mbyA9IG5ldyBWYXJpYWJsZU1vZGVsLmZyZXNoKCkgewogICAgYXNzZXJ0KCgpIHsKICAgICAgZm9yIChWYXJpYWJsZU1vZGVsPFR5cGU+IHZhbHVlIGluIHZhcmlhYmxlSW5mby52YWx1ZXMpIHsKICAgICAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KCkpOwogIH0KCiAgLy8vIEdldHMgdGhlIGluZm8gZm9yIHRoZSBnaXZlbiBbdmFyaWFibGVdLCBjcmVhdGluZyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgogIFZhcmlhYmxlTW9kZWw8VHlwZT4gaW5mb0ZvcihWYXJpYWJsZSB2YXJpYWJsZSkgPT4KICAgICAgdmFyaWFibGVJbmZvW3ZhcmlhYmxlXSA/PyBfZnJlc2hWYXJpYWJsZUluZm87CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBnaXZlbiBbdmFyaWFibGVdIHdhcyBpbml0aWFsaXplZC4KICAvLy8gVGhlIHZhcmlhYmxlIGlzIG1hcmtlZCBhcyBkZWZpbml0ZWx5IGFzc2lnbmVkLCBhbmQgYW55IHByZXZpb3VzIHR5cGUKICAvLy8gcHJvbW90aW9uIGlzIHJlbW92ZWQuCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBpbml0aWFsaXplKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IGluZm9Gb3JWYXIgPSBpbmZvRm9yKHZhcmlhYmxlKTsKICAgIFZhcmlhYmxlTW9kZWw8VHlwZT4gbmV3SW5mb0ZvclZhciA9IGluZm9Gb3JWYXIuaW5pdGlhbGl6ZSgpOwogICAgaWYgKGlkZW50aWNhbChuZXdJbmZvRm9yVmFyLCBpbmZvRm9yVmFyKSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gX3VwZGF0ZVZhcmlhYmxlSW5mbyh2YXJpYWJsZSwgbmV3SW5mb0ZvclZhcik7CiAgfQoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gW3dyaXR0ZW5WYXJpYWJsZXNdIGFyZSBubwogIC8vLyBsb25nZXIgcHJvbW90ZWQ7IHRoZXkgYXJlIHByZXN1bWVkIHRvIGhhdmUgdGhlaXIgZGVjbGFyZWQgdHlwZXMuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCBhdCB0aGUgdG9wIG9mIGxvb3BzIHRvIGNvbnNlcnZhdGl2ZWx5IGNhbmNlbCB0aGUgcHJvbW90aW9uIG9mCiAgLy8vIHZhcmlhYmxlcyB0aGF0IGFyZSBtb2RpZmllZCB3aXRoaW4gdGhlIGxvb3AsIHNvIHRoYXQgd2UgY29ycmVjdGx5IGFuYWx5emUKICAvLy8gY29kZSBsaWtlIHRoZSBmb2xsb3dpbmc6CiAgLy8vCiAgLy8vICAgICBpZiAoeCBpcyBpbnQpIHsKICAvLy8gICAgICAgeC5pc0V2ZW47IC8vIE9LLCBwcm9tb3RlZCB0byBpbnQKICAvLy8gICAgICAgd2hpbGUgKHRydWUpIHsKICAvLy8gICAgICAgICB4LmlzRXZlbjsgLy8gRVJST1I6IHByb21vdGlvbiBsb3N0CiAgLy8vICAgICAgICAgeCA9ICdmb28nOwogIC8vLyAgICAgICB9CiAgLy8vICAgICB9CiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBhIG1vcmUgYWNjdXJhdGUgYW5hbHlzaXMgd291bGQgYmUgdG8gaXRlcmF0ZSB0byBhIGZpeGVkIHBvaW50LAogIC8vLyBhbmQgb25seSByZW1vdmUgcHJvbW90aW9ucyBpZiBpdCBjYW4gYmUgc2hvd24gdGhhdCB0aGV5IGFyZW4ndCByZXN0b3JlZAogIC8vLyBsYXRlciBpbiB0aGUgbG9vcCBib2R5LiAgSWYgd2Ugc3dpdGNoIHRvIGEgZml4ZWQgcG9pbnQgYW5hbHlzaXMsIHdlIHNob3VsZAogIC8vLyBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIG1ldGhvZC4KICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IHJlbW92ZVByb21vdGVkQWxsKAogICAgICBJdGVyYWJsZTxWYXJpYWJsZT4gd3JpdHRlblZhcmlhYmxlcywKICAgICAgSXRlcmFibGU8VmFyaWFibGU+IGNhcHR1cmVkVmFyaWFibGVzKSB7CiAgICBNYXA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VHlwZT4+IG5ld1ZhcmlhYmxlSW5mbzsKICAgIGZvciAoVmFyaWFibGUgdmFyaWFibGUgaW4gd3JpdHRlblZhcmlhYmxlcykgewogICAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IGluZm8gPSBpbmZvRm9yKHZhcmlhYmxlKTsKICAgICAgaWYgKGluZm8ucHJvbW90ZWRUeXBlcyAhPSBudWxsKSB7CiAgICAgICAgKG5ld1ZhcmlhYmxlSW5mbyA/Pz0gbmV3IE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4uZnJvbSgKICAgICAgICAgICAgdmFyaWFibGVJbmZvKSlbdmFyaWFibGVdID0gaW5mby5kaXNjYXJkUHJvbW90aW9ucygpOwogICAgICB9CiAgICB9CiAgICBmb3IgKFZhcmlhYmxlIHZhcmlhYmxlIGluIGNhcHR1cmVkVmFyaWFibGVzKSB7CiAgICAgIFZhcmlhYmxlTW9kZWw8VHlwZT4gaW5mbyA9IHZhcmlhYmxlSW5mb1t2YXJpYWJsZV07CiAgICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgICAobmV3VmFyaWFibGVJbmZvID8/PSBuZXcgTWFwPFZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFR5cGU+Pi5mcm9tKAogICAgICAgICAgICAgICAgdmFyaWFibGVJbmZvKSlbdmFyaWFibGVdID0KICAgICAgICAgICAgbmV3IFZhcmlhYmxlTW9kZWw8VHlwZT4obnVsbCwgY29uc3QgW10sIGZhbHNlLCB0cnVlKTsKICAgICAgfSBlbHNlIGlmICghaW5mby53cml0ZUNhcHR1cmVkKSB7CiAgICAgICAgKG5ld1ZhcmlhYmxlSW5mbyA/Pz0gbmV3IE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4uZnJvbSgKICAgICAgICAgICAgdmFyaWFibGVJbmZvKSlbdmFyaWFibGVdID0gaW5mby53cml0ZUNhcHR1cmUoKTsKICAgICAgfQogICAgfQogICAgaWYgKG5ld1ZhcmlhYmxlSW5mbyA9PSBudWxsKSByZXR1cm4gdGhpczsKICAgIHJldHVybiBuZXcgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPi5fKHJlYWNoYWJsZSwgbmV3VmFyaWFibGVJbmZvKTsKICB9CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IGEgY29udHJvbCBwYXRoIHRoYXQgaXMga25vd24gdG8gaGF2ZQogIC8vLyBwcmV2aW91c2x5IHBhc3NlZCB0aHJvdWdoIHNvbWUgW290aGVyXSBzdGF0ZS4KICAvLy8KICAvLy8gQXBwcm94aW1hdGVseSwgdGhpcyBtZXRob2QgZm9ybXMgdGhlIHVuaW9uIG9mIHRoZSBkZWZpbml0ZSBhc3NpZ25tZW50cyBhbmQKICAvLy8gcHJvbW90aW9ucyBpbiBgdGhpc2Agc3RhdGUgYW5kIHRoZSBbb3RoZXJdIHN0YXRlLiAgTW9yZSBwcmVjaXNlbHk6CiAgLy8vCiAgLy8vIFRoZSBjb250cm9sIGZsb3cgcGF0aCBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZSBpZiBib3RoIHRoaXMgc3RhdGUgYW5kIHRoZQogIC8vLyBvdGhlciBzdGF0ZSBhcmUgcmVhY2hhYmxlLiAgVmFyaWFibGVzIGFyZSBjb25zaWRlcmVkIGRlZmluaXRlbHkgYXNzaWduZWQKICAvLy8gaWYgdGhleSB3ZXJlIGRlZmluaXRlbHkgYXNzaWduZWQgaW4gZWl0aGVyIHRoaXMgc3RhdGUgb3IgdGhlIG90aGVyIHN0YXRlLgogIC8vLyBWYXJpYWJsZSB0eXBlIHByb21vdGlvbnMgYXJlIHRha2VuIGZyb20gdGhpcyBzdGF0ZSwgdW5sZXNzIHRoZSBwcm9tb3Rpb24KICAvLy8gaW4gdGhlIG90aGVyIHN0YXRlIGlzIG1vcmUgc3BlY2lmaWMsIGFuZCB0aGUgdmFyaWFibGUgaXMgInNhZmUiLiAgQQogIC8vLyB2YXJpYWJsZSBpcyBjb25zaWRlcmVkIHNhZmUgaWYgdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgaXQgd2FzIGFzc2lnbmVkCiAgLy8vIG1vcmUgcmVjZW50bHkgdGhhbiB0aGUgIm90aGVyIiBzdGF0ZS4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIGFmdGVyIGEgYHRyeS9maW5hbGx5YCBzdGF0ZW1lbnQgdG8gY29tYmluZSB0aGUgcHJvbW90aW9ucyBhbmQKICAvLy8gZGVmaW5pdGUgYXNzaWdubWVudHMgdGhhdCBvY2N1cnJlZCBpbiB0aGUgYHRyeWAgYW5kIGBmaW5hbGx5YCBibG9ja3MKICAvLy8gKHdoZXJlIGB0aGlzYCBpcyB0aGUgc3RhdGUgZnJvbSB0aGUgYGZpbmFsbHlgIGJsb2NrIGFuZCBgb3RoZXJgIGlzIHRoZQogIC8vLyBzdGF0ZSBmcm9tIHRoZSBgdHJ5YCBibG9jaykuICBWYXJpYWJsZXMgdGhhdCBhcmUgYXNzaWduZWQgaW4gdGhlIGBmaW5hbGx5YAogIC8vLyBibG9jayBhcmUgY29uc2lkZXJlZCAidW5zYWZlIiBiZWNhdXNlIHRoZSBhc3NpZ25tZW50IG1pZ2h0IGhhdmUgY2FuY2VsbGVkCiAgLy8vIHRoZSBlZmZlY3Qgb2YgYW55IHByb21vdGlvbiB0aGF0IG9jY3VycmVkIGluc2lkZSB0aGUgYHRyeWAgYmxvY2suCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiByZXN0cmljdCgKICAgICAgVHlwZU9wZXJhdGlvbnM8VmFyaWFibGUsIFR5cGU+IHR5cGVPcGVyYXRpb25zLAogICAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IG90aGVyLAogICAgICBTZXQ8VmFyaWFibGU+IHVuc2FmZSkgewogICAgYm9vbCBuZXdSZWFjaGFibGUgPSByZWFjaGFibGUgJiYgb3RoZXIucmVhY2hhYmxlOwoKICAgIE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4gbmV3VmFyaWFibGVJbmZvID0KICAgICAgICA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VHlwZT4+e307CiAgICBib29sIHZhcmlhYmxlSW5mb01hdGNoZXNUaGlzID0gdHJ1ZTsKICAgIGJvb2wgdmFyaWFibGVJbmZvTWF0Y2hlc090aGVyID0gdHJ1ZTsKICAgIGZvciAoTWFwRW50cnk8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VHlwZT4+IGVudHJ5CiAgICAgICAgaW4gdmFyaWFibGVJbmZvLmVudHJpZXMpIHsKICAgICAgVmFyaWFibGUgdmFyaWFibGUgPSBlbnRyeS5rZXk7CiAgICAgIFZhcmlhYmxlTW9kZWw8VHlwZT4gdGhpc01vZGVsID0gZW50cnkudmFsdWU7CiAgICAgIFZhcmlhYmxlTW9kZWw8VHlwZT4gb3RoZXJNb2RlbCA9IG90aGVyLmluZm9Gb3IodmFyaWFibGUpOwogICAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IHJlc3RyaWN0ZWQgPSB0aGlzTW9kZWwucmVzdHJpY3QoCiAgICAgICAgICB0eXBlT3BlcmF0aW9ucywgb3RoZXJNb2RlbCwgdW5zYWZlLmNvbnRhaW5zKHZhcmlhYmxlKSk7CiAgICAgIGlmICghaWRlbnRpY2FsKHJlc3RyaWN0ZWQsIF9mcmVzaFZhcmlhYmxlSW5mbykpIHsKICAgICAgICBuZXdWYXJpYWJsZUluZm9bdmFyaWFibGVdID0gcmVzdHJpY3RlZDsKICAgICAgfQogICAgICBpZiAoIWlkZW50aWNhbChyZXN0cmljdGVkLCB0aGlzTW9kZWwpKSB2YXJpYWJsZUluZm9NYXRjaGVzVGhpcyA9IGZhbHNlOwogICAgICBpZiAoIWlkZW50aWNhbChyZXN0cmljdGVkLCBvdGhlck1vZGVsKSkgdmFyaWFibGVJbmZvTWF0Y2hlc090aGVyID0gZmFsc2U7CiAgICB9CiAgICBmb3IgKE1hcEVudHJ5PFZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFR5cGU+PiBlbnRyeQogICAgICAgIGluIG90aGVyLnZhcmlhYmxlSW5mby5lbnRyaWVzKSB7CiAgICAgIFZhcmlhYmxlIHZhcmlhYmxlID0gZW50cnkua2V5OwogICAgICBpZiAodmFyaWFibGVJbmZvLmNvbnRhaW5zS2V5KHZhcmlhYmxlKSkgY29udGludWU7CiAgICAgIFZhcmlhYmxlTW9kZWw8VHlwZT4gdGhpc01vZGVsID0gX2ZyZXNoVmFyaWFibGVJbmZvOwogICAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IG90aGVyTW9kZWwgPSBlbnRyeS52YWx1ZTsKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiByZXN0cmljdGVkID0gdGhpc01vZGVsLnJlc3RyaWN0KAogICAgICAgICAgdHlwZU9wZXJhdGlvbnMsIG90aGVyTW9kZWwsIHVuc2FmZS5jb250YWlucyh2YXJpYWJsZSkpOwogICAgICBpZiAoIWlkZW50aWNhbChyZXN0cmljdGVkLCBfZnJlc2hWYXJpYWJsZUluZm8pKSB7CiAgICAgICAgbmV3VmFyaWFibGVJbmZvW3ZhcmlhYmxlXSA9IHJlc3RyaWN0ZWQ7CiAgICAgIH0KICAgICAgaWYgKCFpZGVudGljYWwocmVzdHJpY3RlZCwgdGhpc01vZGVsKSkgdmFyaWFibGVJbmZvTWF0Y2hlc1RoaXMgPSBmYWxzZTsKICAgICAgaWYgKCFpZGVudGljYWwocmVzdHJpY3RlZCwgb3RoZXJNb2RlbCkpIHZhcmlhYmxlSW5mb01hdGNoZXNPdGhlciA9IGZhbHNlOwogICAgfQogICAgYXNzZXJ0KHZhcmlhYmxlSW5mb01hdGNoZXNUaGlzID09CiAgICAgICAgX3ZhcmlhYmxlSW5mb3NFcXVhbChuZXdWYXJpYWJsZUluZm8sIHZhcmlhYmxlSW5mbykpOwogICAgYXNzZXJ0KHZhcmlhYmxlSW5mb01hdGNoZXNPdGhlciA9PQogICAgICAgIF92YXJpYWJsZUluZm9zRXF1YWwobmV3VmFyaWFibGVJbmZvLCBvdGhlci52YXJpYWJsZUluZm8pKTsKICAgIGlmICh2YXJpYWJsZUluZm9NYXRjaGVzVGhpcykgewogICAgICBuZXdWYXJpYWJsZUluZm8gPSB2YXJpYWJsZUluZm87CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlSW5mb01hdGNoZXNPdGhlcikgewogICAgICBuZXdWYXJpYWJsZUluZm8gPSBvdGhlci52YXJpYWJsZUluZm87CiAgICB9CgogICAgcmV0dXJuIF9pZGVudGljYWxPck5ldyh0aGlzLCBvdGhlciwgbmV3UmVhY2hhYmxlLCBuZXdWYXJpYWJsZUluZm8pOwogIH0KCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGNvbnRyb2wgZmxvdyBwYXRoIGlzCiAgLy8vIFtyZWFjaGFibGVdLgogIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gc2V0UmVhY2hhYmxlKGJvb2wgcmVhY2hhYmxlKSB7CiAgICBpZiAodGhpcy5yZWFjaGFibGUgPT0gcmVhY2hhYmxlKSByZXR1cm4gdGhpczsKCiAgICByZXR1cm4gbmV3IEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4uXyhyZWFjaGFibGUsIHZhcmlhYmxlSW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnKCRyZWFjaGFibGUsICR2YXJpYWJsZUluZm8pJzsKCiAgLy8vIFJldHVybnMgYW4gW0V4cHJlc3Npb25JbmZvXSBpbmRpY2F0aW5nIHRoZSByZXN1bHQgb2YgY2hlY2tpbmcgd2hldGhlciB0aGUKICAvLy8gZ2l2ZW4gW3ZhcmlhYmxlXSBpcyBub24tbnVsbC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoZSBzdGF0ZSBpcyBvbmx5IGNoYW5nZWQgaWYgdGhlIHByZXZpb3VzIHR5cGUgb2YgW3ZhcmlhYmxlXSB3YXMKICAvLy8gcG90ZW50aWFsbHkgbnVsbGFibGUuCiAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IHRyeU1hcmtOb25OdWxsYWJsZSgKICAgICAgVHlwZU9wZXJhdGlvbnM8VmFyaWFibGUsIFR5cGU+IHR5cGVPcGVyYXRpb25zLCBWYXJpYWJsZSB2YXJpYWJsZSkgewogICAgVmFyaWFibGVNb2RlbDxUeXBlPiBpbmZvID0gaW5mb0Zvcih2YXJpYWJsZSk7CiAgICBpZiAoaW5mby53cml0ZUNhcHR1cmVkKSB7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+KHRoaXMsIHRoaXMsIHRoaXMpOwogICAgfQogICAgVHlwZSBwcmV2aW91c1R5cGUgPSBpbmZvLnByb21vdGVkVHlwZXM/Lmxhc3Q7CiAgICBwcmV2aW91c1R5cGUgPz89IHR5cGVPcGVyYXRpb25zLnZhcmlhYmxlVHlwZSh2YXJpYWJsZSk7CiAgICBUeXBlIHR5cGUgPSB0eXBlT3BlcmF0aW9ucy5wcm9tb3RlVG9Ob25OdWxsKHByZXZpb3VzVHlwZSk7CiAgICBpZiAodHlwZU9wZXJhdGlvbnMuaXNTYW1lVHlwZSh0eXBlLCBwcmV2aW91c1R5cGUpKSB7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+KHRoaXMsIHRoaXMsIHRoaXMpOwogICAgfQogICAgYXNzZXJ0KHR5cGVPcGVyYXRpb25zLmlzU3VidHlwZU9mKHR5cGUsIHByZXZpb3VzVHlwZSkpOwogICAgcmV0dXJuIF9maW5pc2hUeXBlVGVzdCh0eXBlT3BlcmF0aW9ucywgdmFyaWFibGUsIGluZm8sIHR5cGUpOwogIH0KCiAgLy8vIFJldHVybnMgYW4gW0V4cHJlc3Npb25JbmZvXSBpbmRpY2F0aW5nIHRoZSByZXN1bHQgb2YgY2hlY2tpbmcgd2hldGhlciB0aGUKICAvLy8gZ2l2ZW4gW3ZhcmlhYmxlXSBzYXRpc2ZpZXMgdGhlIGdpdmVuIFt0eXBlXSwgZS5nLiBhcyBhIGNvbnNlcXVlbmNlIG9mIGFuCiAgLy8vIGBpc2AgZXhwcmVzc2lvbiBhcyB0aGUgY29uZGl0aW9uIG9mIGFuIGBpZmAgc3RhdGVtZW50LgogIC8vLwogIC8vLyBOb3RlIHRoYXQgdGhlIHN0YXRlIGlzIG9ubHkgY2hhbmdlZCBpZiBbdHlwZV0gaXMgYSBzdWJ0eXBlIG9mIHRoZQogIC8vLyB2YXJpYWJsZSdzIHByZXZpb3VzIChwb3NzaWJseSBwcm9tb3RlZCkgdHlwZS4KICAvLy8KICAvLy8gVE9ETyhwYXVsYmVycnkpOiBpZiB0aGUgdHlwZSBpcyBub24tbnVsbGFibGUsIHNob3VsZCB0aGlzIG1ldGhvZCBtYXJrIHRoZQogIC8vLyB2YXJpYWJsZSBhcyBkZWZpbml0ZWx5IGFzc2lnbmVkPyAgRG9lcyBpdCBtYXR0ZXI/CiAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IHRyeVByb21vdGUoCiAgICAgIFR5cGVPcGVyYXRpb25zPFZhcmlhYmxlLCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgICAgVmFyaWFibGUgdmFyaWFibGUsCiAgICAgIFR5cGUgdHlwZSkgewogICAgVmFyaWFibGVNb2RlbDxUeXBlPiBpbmZvID0gaW5mb0Zvcih2YXJpYWJsZSk7CiAgICBpZiAoaW5mby53cml0ZUNhcHR1cmVkKSB7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+KHRoaXMsIHRoaXMsIHRoaXMpOwogICAgfQogICAgVHlwZSBwcmV2aW91c1R5cGUgPSBpbmZvLnByb21vdGVkVHlwZXM/Lmxhc3Q7CiAgICBwcmV2aW91c1R5cGUgPz89IHR5cGVPcGVyYXRpb25zLnZhcmlhYmxlVHlwZSh2YXJpYWJsZSk7CgogICAgVHlwZSBuZXdUeXBlID0gdHlwZU9wZXJhdGlvbnMudHJ5UHJvbW90ZVRvVHlwZSh0eXBlLCBwcmV2aW91c1R5cGUpOwogICAgaWYgKG5ld1R5cGUgPT0gbnVsbCB8fCB0eXBlT3BlcmF0aW9ucy5pc1NhbWVUeXBlKG5ld1R5cGUsIHByZXZpb3VzVHlwZSkpIHsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4odGhpcywgdGhpcywgdGhpcyk7CiAgICB9CiAgICBhc3NlcnQodHlwZU9wZXJhdGlvbnMuaXNTdWJ0eXBlT2YobmV3VHlwZSwgcHJldmlvdXNUeXBlKSwKICAgICAgICAiRXhwZWN0ZWQgJG5ld1R5cGUgdG8gYmUgYSBzdWJ0eXBlIG9mICRwcmV2aW91c1R5cGUuIik7CiAgICByZXR1cm4gX2ZpbmlzaFR5cGVUZXN0KHR5cGVPcGVyYXRpb25zLCB2YXJpYWJsZSwgaW5mbywgbmV3VHlwZSk7CiAgfQoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3NpZ25tZW50IHdhcyBtYWRlIHRvIHRoZSBnaXZlbgogIC8vLyBbdmFyaWFibGVdLiAgVGhlIHZhcmlhYmxlIGlzIG1hcmtlZCBhcyBkZWZpbml0ZWx5IGFzc2lnbmVkLCBhbmQgYW55CiAgLy8vIHByZXZpb3VzIHR5cGUgcHJvbW90aW9uIGlzIHJlbW92ZWQuCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiB3cml0ZShWYXJpYWJsZSB2YXJpYWJsZSwgVHlwZSB3cml0dGVuVHlwZSwKICAgICAgVHlwZU9wZXJhdGlvbnM8VmFyaWFibGUsIFR5cGU+IHR5cGVPcGVyYXRpb25zKSB7CiAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IGluZm9Gb3JWYXIgPSBpbmZvRm9yKHZhcmlhYmxlKTsKICAgIFZhcmlhYmxlTW9kZWw8VHlwZT4gbmV3SW5mb0ZvclZhciA9CiAgICAgICAgaW5mb0ZvclZhci53cml0ZSh3cml0dGVuVHlwZSwgdHlwZU9wZXJhdGlvbnMpOwogICAgaWYgKGlkZW50aWNhbChuZXdJbmZvRm9yVmFyLCBpbmZvRm9yVmFyKSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gX3VwZGF0ZVZhcmlhYmxlSW5mbyh2YXJpYWJsZSwgbmV3SW5mb0ZvclZhcik7CiAgfQoKICAvLy8gQ29tbW9uIGFsZ29yaXRobSBmb3IgW3RyeU1hcmtOb25OdWxsYWJsZV0gYW5kIFt0cnlQcm9tb3RlXS4gIEJ1aWxkcyBhbgogIC8vLyBbRXhwcmVzc2lvbkluZm9dIG9iamVjdCBkZXNjcmliaW5nIHRoZSBlZmZlY3Qgb2YgdHJ5aW5nIHRvIHByb21vdGUKICAvLy8gW3ZhcmlhYmxlXSB0byBbdGVzdGVkVHlwZV0sIHVuZGVyIHRoZSBmb2xsb3dpbmcgcHJlY29uZGl0aW9uczoKICAvLy8gLSBbaW5mb10gc2hvdWxkIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgaW5mb0Zvcih2YXJpYWJsZSlgCiAgLy8vIC0gW3Rlc3RlZFR5cGVdIHNob3VsZCBiZSBhIHN1YnR5cGUgb2YgdGhlIGN1cnJlbnRseS1wcm9tb3RlZCB0eXBlIChpLmUuCiAgLy8vICAgbm8gcmVkdW5kYW50IG9yIHNpZGUtcHJvbW90aW9ucykKICAvLy8gLSBUaGUgdmFyaWFibGUgc2hvdWxkIG5vdCBiZSB3cml0ZS1jYXB0dXJlZC4KICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gX2ZpbmlzaFR5cGVUZXN0KAogICAgICBUeXBlT3BlcmF0aW9uczxWYXJpYWJsZSwgVHlwZT4gdHlwZU9wZXJhdGlvbnMsCiAgICAgIFZhcmlhYmxlIHZhcmlhYmxlLAogICAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IGluZm8sCiAgICAgIFR5cGUgdGVzdGVkVHlwZSkgewogICAgTGlzdDxUeXBlPiBuZXdQcm9tb3RlZFR5cGVzID0KICAgICAgICBWYXJpYWJsZU1vZGVsLl9hZGRUb1Byb21vdGVkVHlwZXMoaW5mby5wcm9tb3RlZFR5cGVzLCB0ZXN0ZWRUeXBlKTsKICAgIExpc3Q8VHlwZT4gbmV3VGVzdGVkID0gVmFyaWFibGVNb2RlbC5fYWRkVHlwZVRvVW5pcXVlTGlzdCgKICAgICAgICBpbmZvLnRlc3RlZCwgdGVzdGVkVHlwZSwgdHlwZU9wZXJhdGlvbnMpOwogICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBtb2RlbElmRmFpbGVkID0gaWRlbnRpY2FsKG5ld1Rlc3RlZCwgaW5mby50ZXN0ZWQpCiAgICAgICAgPyB0aGlzCiAgICAgICAgOiBfdXBkYXRlVmFyaWFibGVJbmZvKAogICAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgICAgbmV3IFZhcmlhYmxlTW9kZWw8VHlwZT4oaW5mby5wcm9tb3RlZFR5cGVzLCBuZXdUZXN0ZWQsCiAgICAgICAgICAgICAgICBpbmZvLmFzc2lnbmVkLCBpbmZvLndyaXRlQ2FwdHVyZWQpKTsKICAgIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gbW9kZWxJZlN1Y2Nlc3NmdWwgPQogICAgICAgIGlkZW50aWNhbChuZXdQcm9tb3RlZFR5cGVzLCBpbmZvLnByb21vdGVkVHlwZXMpICYmCiAgICAgICAgICAgICAgICBpZGVudGljYWwobmV3VGVzdGVkLCBpbmZvLnRlc3RlZCkKICAgICAgICAgICAgPyB0aGlzCiAgICAgICAgICAgIDogX3VwZGF0ZVZhcmlhYmxlSW5mbygKICAgICAgICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlTW9kZWw8VHlwZT4obmV3UHJvbW90ZWRUeXBlcywgbmV3VGVzdGVkLAogICAgICAgICAgICAgICAgICAgIGluZm8uYXNzaWduZWQsIGluZm8ud3JpdGVDYXB0dXJlZCkpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4oCiAgICAgICAgdGhpcywgbW9kZWxJZlN1Y2Nlc3NmdWwsIG1vZGVsSWZGYWlsZWQpOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb3dNb2RlbF0gd2hlcmUgdGhlIGluZm9ybWF0aW9uIGZvciBbdmFyaWFibGVdIGlzIHJlcGxhY2VkCiAgLy8vIHdpdGggW21vZGVsXS4KICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IF91cGRhdGVWYXJpYWJsZUluZm8oCiAgICAgIFZhcmlhYmxlIHZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFR5cGU+IG1vZGVsKSB7CiAgICBNYXA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VHlwZT4+IG5ld1ZhcmlhYmxlSW5mbyA9CiAgICAgICAgbmV3IE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4uZnJvbSh2YXJpYWJsZUluZm8pOwogICAgbmV3VmFyaWFibGVJbmZvW3ZhcmlhYmxlXSA9IG1vZGVsOwogICAgcmV0dXJuIG5ldyBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+Ll8ocmVhY2hhYmxlLCBuZXdWYXJpYWJsZUluZm8pOwogIH0KCiAgLy8vIEZvcm1zIGEgbmV3IHN0YXRlIHRvIHJlZmxlY3QgYSBjb250cm9sIGZsb3cgcGF0aCB0aGF0IG1pZ2h0IGhhdmUgY29tZSBmcm9tCiAgLy8vIGVpdGhlciBgdGhpc2Agb3IgdGhlIFtvdGhlcl0gc3RhdGUuCiAgLy8vCiAgLy8vIFRoZSBjb250cm9sIGZsb3cgcGF0aCBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZSBpZiBlaXRoZXIgb2YgdGhlIGlucHV0CiAgLy8vIHN0YXRlcyBpcyByZWFjaGFibGUuICBWYXJpYWJsZXMgYXJlIGNvbnNpZGVyZWQgZGVmaW5pdGVseSBhc3NpZ25lZCBpZiB0aGV5CiAgLy8vIHdlcmUgZGVmaW5pdGVseSBhc3NpZ25lZCBpbiBib3RoIG9mIHRoZSBpbnB1dCBzdGF0ZXMuICBWYXJpYWJsZSBwcm9tb3Rpb25zCiAgLy8vIGFyZSBrZXB0IG9ubHkgaWYgdGhleSBhcmUgY29tbW9uIHRvIGJvdGggaW5wdXQgc3RhdGVzOyBpZiBhIHZhcmlhYmxlIGlzCiAgLy8vIHByb21vdGVkIHRvIG9uZSB0eXBlIGluIG9uZSBzdGF0ZSBhbmQgYSBzdWJ0eXBlIGluIHRoZSBvdGhlciBzdGF0ZSwgdGhlCiAgLy8vIGxlc3Mgc3BlY2lmaWMgdHlwZSBwcm9tb3Rpb24gaXMga2VwdC4KICBzdGF0aWMgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBqb2luPFZhcmlhYmxlLCBUeXBlPigKICAgIFR5cGVPcGVyYXRpb25zPFZhcmlhYmxlLCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gZmlyc3QsCiAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IHNlY29uZCwKICApIHsKICAgIGlmIChmaXJzdCA9PSBudWxsKSByZXR1cm4gc2Vjb25kOwogICAgaWYgKHNlY29uZCA9PSBudWxsKSByZXR1cm4gZmlyc3Q7CgogICAgaWYgKGZpcnN0LnJlYWNoYWJsZSAmJiAhc2Vjb25kLnJlYWNoYWJsZSkgcmV0dXJuIGZpcnN0OwogICAgaWYgKCFmaXJzdC5yZWFjaGFibGUgJiYgc2Vjb25kLnJlYWNoYWJsZSkgcmV0dXJuIHNlY29uZDsKCiAgICBib29sIG5ld1JlYWNoYWJsZSA9IGZpcnN0LnJlYWNoYWJsZSB8fCBzZWNvbmQucmVhY2hhYmxlOwogICAgTWFwPFZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFR5cGU+PiBuZXdWYXJpYWJsZUluZm8gPQogICAgICAgIEZsb3dNb2RlbC5qb2luVmFyaWFibGVJbmZvKAogICAgICAgICAgICB0eXBlT3BlcmF0aW9ucywgZmlyc3QudmFyaWFibGVJbmZvLCBzZWNvbmQudmFyaWFibGVJbmZvKTsKCiAgICByZXR1cm4gRmxvd01vZGVsLl9pZGVudGljYWxPck5ldygKICAgICAgICBmaXJzdCwgc2Vjb25kLCBuZXdSZWFjaGFibGUsIG5ld1ZhcmlhYmxlSW5mbyk7CiAgfQoKICAvLy8gSm9pbnMgdHdvICJ2YXJpYWJsZSBpbmZvIiBtYXBzLiAgU2VlIFtqb2luXSBmb3IgZGV0YWlscy4KICBAdmlzaWJsZUZvclRlc3RpbmcKICBzdGF0aWMgTWFwPFZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFR5cGU+PiBqb2luVmFyaWFibGVJbmZvPFZhcmlhYmxlLCBUeXBlPigKICAgIFR5cGVPcGVyYXRpb25zPFZhcmlhYmxlLCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgIE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4gZmlyc3QsCiAgICBNYXA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VHlwZT4+IHNlY29uZCwKICApIHsKICAgIGlmIChpZGVudGljYWwoZmlyc3QsIHNlY29uZCkpIHJldHVybiBmaXJzdDsKICAgIGlmIChmaXJzdC5pc0VtcHR5IHx8IHNlY29uZC5pc0VtcHR5KSByZXR1cm4gY29uc3Qge307CgogICAgTWFwPFZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFR5cGU+PiByZXN1bHQgPQogICAgICAgIDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj57fTsKICAgIGJvb2wgYWx3YXlzRmlyc3QgPSB0cnVlOwogICAgYm9vbCBhbHdheXNTZWNvbmQgPSB0cnVlOwogICAgZm9yIChNYXBFbnRyeTxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4gZW50cnkgaW4gZmlyc3QuZW50cmllcykgewogICAgICBWYXJpYWJsZSB2YXJpYWJsZSA9IGVudHJ5LmtleTsKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBzZWNvbmRNb2RlbCA9IHNlY29uZFt2YXJpYWJsZV07CiAgICAgIGlmIChzZWNvbmRNb2RlbCA9PSBudWxsKSB7CiAgICAgICAgYWx3YXlzRmlyc3QgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IGpvaW5lZCA9CiAgICAgICAgICAgIFZhcmlhYmxlTW9kZWwuam9pbjxUeXBlPih0eXBlT3BlcmF0aW9ucywgZW50cnkudmFsdWUsIHNlY29uZE1vZGVsKTsKICAgICAgICByZXN1bHRbdmFyaWFibGVdID0gam9pbmVkOwogICAgICAgIGlmICghaWRlbnRpY2FsKGpvaW5lZCwgZW50cnkudmFsdWUpKSBhbHdheXNGaXJzdCA9IGZhbHNlOwogICAgICAgIGlmICghaWRlbnRpY2FsKGpvaW5lZCwgc2Vjb25kTW9kZWwpKSBhbHdheXNTZWNvbmQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChhbHdheXNGaXJzdCkgcmV0dXJuIGZpcnN0OwogICAgaWYgKGFsd2F5c1NlY29uZCAmJiByZXN1bHQubGVuZ3RoID09IHNlY29uZC5sZW5ndGgpIHJldHVybiBzZWNvbmQ7CiAgICBpZiAocmVzdWx0LmlzRW1wdHkpIHJldHVybiBjb25zdCB7fTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbRmxvd01vZGVsXSBvYmplY3QsIHVubGVzcyBpdCBpcyBlcXVpdmFsZW50IHRvIGVpdGhlcgogIC8vLyBbZmlyc3RdIG9yIFtzZWNvbmRdLCBpbiB3aGljaCBjYXNlIG9uZSBvZiB0aG9zZSBvYmplY3RzIGlzIHJlLXVzZWQuCiAgc3RhdGljIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gX2lkZW50aWNhbE9yTmV3PFZhcmlhYmxlLCBUeXBlPigKICAgICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBmaXJzdCwKICAgICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBzZWNvbmQsCiAgICAgIGJvb2wgbmV3UmVhY2hhYmxlLAogICAgICBNYXA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VHlwZT4+IG5ld1ZhcmlhYmxlSW5mbykgewogICAgaWYgKGZpcnN0LnJlYWNoYWJsZSA9PSBuZXdSZWFjaGFibGUgJiYKICAgICAgICBpZGVudGljYWwoZmlyc3QudmFyaWFibGVJbmZvLCBuZXdWYXJpYWJsZUluZm8pKSB7CiAgICAgIHJldHVybiBmaXJzdDsKICAgIH0KICAgIGlmIChzZWNvbmQucmVhY2hhYmxlID09IG5ld1JlYWNoYWJsZSAmJgogICAgICAgIGlkZW50aWNhbChzZWNvbmQudmFyaWFibGVJbmZvLCBuZXdWYXJpYWJsZUluZm8pKSB7CiAgICAgIHJldHVybiBzZWNvbmQ7CiAgICB9CgogICAgcmV0dXJuIG5ldyBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+Ll8obmV3UmVhY2hhYmxlLCBuZXdWYXJpYWJsZUluZm8pOwogIH0KCiAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gInZhcmlhYmxlSW5mbyIgbWFwcyBhcmUgZXF1aXZhbGVudC4KICAvLy8KICAvLy8gVGhlIGVxdWl2YWxlbmNlIGNoZWNrIGlzIHNoYWxsb3c7IGlmIHR3byB2YXJpYWJsZXMnIG1vZGVscyBhcmUgbm90CiAgLy8vIGlkZW50aWNhbCwgd2UgcmV0dXJuIGBmYWxzZWAuCiAgc3RhdGljIGJvb2wgX3ZhcmlhYmxlSW5mb3NFcXVhbDxWYXJpYWJsZSwgVHlwZT4oCiAgICAgIE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4gcDEsCiAgICAgIE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4gcDIpIHsKICAgIGlmIChwMS5sZW5ndGggIT0gcDIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIXAxLmtleXMudG9TZXQoKS5jb250YWluc0FsbChwMi5rZXlzKSkgcmV0dXJuIGZhbHNlOwogICAgZm9yIChNYXBFbnRyeTxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxUeXBlPj4gZW50cnkgaW4gcDEuZW50cmllcykgewogICAgICBWYXJpYWJsZU1vZGVsPFR5cGU+IHAxVmFsdWUgPSBlbnRyeS52YWx1ZTsKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBwMlZhbHVlID0gcDJbZW50cnkua2V5XTsKICAgICAgaWYgKCFpZGVudGljYWwocDFWYWx1ZSwgcDJWYWx1ZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIE9wZXJhdGlvbnMgb24gdHlwZXMsIGFic3RyYWN0ZWQgZnJvbSBjb25jcmV0ZSB0eXBlIGludGVyZmFjZXMuCmFic3RyYWN0IGNsYXNzIFR5cGVPcGVyYXRpb25zPFZhcmlhYmxlLCBUeXBlPiB7CiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFt0eXBlMV0gYW5kIFt0eXBlMl0gYXJlIHRoZSBzYW1lIHR5cGUuCiAgYm9vbCBpc1NhbWVUeXBlKFR5cGUgdHlwZTEsIFR5cGUgdHlwZTIpOwoKICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2xlZnRUeXBlXSBpcyBhIHN1YnR5cGUgb2YgdGhlIFtyaWdodFR5cGVdLgogIGJvb2wgaXNTdWJ0eXBlT2YoVHlwZSBsZWZ0VHlwZSwgVHlwZSByaWdodFR5cGUpOwoKICAvLy8gUmV0dXJucyB0aGUgbm9uLW51bGwgcHJvbW90ZWQgdmVyc2lvbiBvZiBbdHlwZV0uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBzb21lIHR5cGVzIGRvbid0IGhhdmUgYSBub24tbnVsbGFibGUgdmVyc2lvbiAoZS5nLgogIC8vLyBgRnV0dXJlT3I8aW50Pz5gKSwgc28gW3R5cGVdIG1heSBiZSByZXR1cm5lZCBldmVuIGlmIGl0IGlzIG51bGxhYmxlLgogIFR5cGUgLyohKi8gcHJvbW90ZVRvTm9uTnVsbChUeXBlIHR5cGUpOwoKICAvLy8gVHJpZXMgdG8gcHJvbW90ZSB0byB0aGUgZmlyc3QgdHlwZSBmcm9tIHRoZSBzZWNvbmQgdHlwZSwgYW5kIHJldHVybnMgdGhlCiAgLy8vIHByb21vdGVkIHR5cGUgaWYgaXQgc3VjY2VlZHMsIG90aGVyd2lzZSBudWxsLgogIFR5cGUgdHJ5UHJvbW90ZVRvVHlwZShUeXBlIHRvLCBUeXBlIGZyb20pOwoKICAvLy8gUmV0dXJuIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZ2l2ZW4gW3ZhcmlhYmxlXS4KICBUeXBlIHZhcmlhYmxlVHlwZShWYXJpYWJsZSB2YXJpYWJsZSk7Cn0KCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgW1ZhcmlhYmxlTW9kZWxdIGNsYXNzIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkCi8vLyBieSBmbG93IGFuYWx5c2lzIGZvciBhIHNpbmdsZSB2YXJpYWJsZSBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aGUgY29udHJvbCBmbG93Ci8vLyBvZiB0aGUgZnVuY3Rpb24gb3IgbWV0aG9kIGJlaW5nIGFuYWx5emVkLgovLy8KLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBpbW11dGFibGUsIHNvIHRoZSBtZXRob2RzIGJlbG93IHRoYXQgInVwZGF0ZSIKLy8vIHRoZSBzdGF0ZSBhY3R1YWxseSBsZWF2ZSBgdGhpc2AgdW5jaGFuZ2VkIGFuZCByZXR1cm4gYSBuZXcgc3RhdGUgb2JqZWN0LgpAdmlzaWJsZUZvclRlc3RpbmcKY2xhc3MgVmFyaWFibGVNb2RlbDxUeXBlPiB7CiAgLy8vIFNlcXVlbmNlIG9mIHR5cGVzIHRoYXQgdGhlIHZhcmlhYmxlIGhhcyBiZWVuIHByb21vdGVkIHRvLCB3aGVyZSBlYWNoCiAgLy8vIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIGlzIGEgc3VidHlwZSBvZiB0aGUgcHJldmlvdXMuICBOdWxsIGlmIHRoZQogIC8vLyB2YXJpYWJsZSBoYXNuJ3QgYmVlbiBwcm9tb3RlZC4KICBmaW5hbCBMaXN0PFR5cGU+IHByb21vdGVkVHlwZXM7CgogIC8vLyBMaXN0IG9mIHR5cGVzIHRoYXQgdGhlIHZhcmlhYmxlIGhhcyBiZWVuIHRlc3RlZCBhZ2FpbnN0IGluIGFsbCBjb2RlIHBhdGhzCiAgLy8vIGxlYWRpbmcgdG8gdGhlIGdpdmVuIHBvaW50IGluIHRoZSBzb3VyY2UgY29kZS4KICBmaW5hbCBMaXN0PFR5cGU+IHRlc3RlZDsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2YXJpYWJsZSBoYXMgZGVmaW5pdGVseSBiZWVuIGFzc2lnbmVkLgogIGZpbmFsIGJvb2wgYXNzaWduZWQ7CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmFyaWFibGUgaGFzIGJlZW4gd3JpdGUgY2FwdHVyZWQuCiAgZmluYWwgYm9vbCB3cml0ZUNhcHR1cmVkOwoKICBWYXJpYWJsZU1vZGVsKAogICAgICB0aGlzLnByb21vdGVkVHlwZXMsIHRoaXMudGVzdGVkLCB0aGlzLmFzc2lnbmVkLCB0aGlzLndyaXRlQ2FwdHVyZWQpIHsKICAgIGFzc2VydChwcm9tb3RlZFR5cGVzID09IG51bGwgfHwgcHJvbW90ZWRUeXBlcy5pc05vdEVtcHR5KTsKICAgIGFzc2VydCghd3JpdGVDYXB0dXJlZCB8fCBwcm9tb3RlZFR5cGVzID09IG51bGwsCiAgICAgICAgIldyaXRlLWNhcHR1cmVkIHZhcmlhYmxlcyBjYW4ndCBiZSBwcm9tb3RlZCIpOwogICAgYXNzZXJ0KHRlc3RlZCAhPSBudWxsKTsKICB9CgogIC8vLyBDcmVhdGVzIGEgW1ZhcmlhYmxlTW9kZWxdIHJlcHJlc2VudGluZyBhIHZhcmlhYmxlIHRoYXQncyBuZXZlciBiZWVuIHNlZW4KICAvLy8gYmVmb3JlLgogIFZhcmlhYmxlTW9kZWwuZnJlc2goKQogICAgICA6IHByb21vdGVkVHlwZXMgPSBudWxsLAogICAgICAgIHRlc3RlZCA9IGNvbnN0IFtdLAogICAgICAgIGFzc2lnbmVkID0gZmFsc2UsCiAgICAgICAgd3JpdGVDYXB0dXJlZCA9IGZhbHNlOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbVmFyaWFibGVNb2RlbF0gaW4gd2hpY2ggYW55IHByb21vdGlvbnMgcHJlc2VudCBoYXZlIGJlZW4KICAvLy8gZHJvcHBlZC4KICBWYXJpYWJsZU1vZGVsPFR5cGU+IGRpc2NhcmRQcm9tb3Rpb25zKCkgewogICAgYXNzZXJ0KHByb21vdGVkVHlwZXMgIT0gbnVsbCwgJ05vIHByb21vdGlvbnMgdG8gZGlzY2FyZCcpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZU1vZGVsPFR5cGU+KG51bGwsIHRlc3RlZCwgYXNzaWduZWQsIHdyaXRlQ2FwdHVyZWQpOwogIH0KCiAgLy8vIFJldHVybnMgYSBuZXcgW1ZhcmlhYmxlTW9kZWxdIHJlZmxlY3RpbmcgdGhlIGZhY3QgdGhhdCB0aGUgdmFyaWFibGUgd2FzCiAgLy8vIGp1c3QgaW5pdGlhbGl6ZWQuCiAgVmFyaWFibGVNb2RlbDxUeXBlPiBpbml0aWFsaXplKCkgewogICAgaWYgKHByb21vdGVkVHlwZXMgPT0gbnVsbCAmJiB0ZXN0ZWQuaXNFbXB0eSAmJiBhc3NpZ25lZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBuZXcgVmFyaWFibGVNb2RlbDxUeXBlPihudWxsLCBjb25zdCBbXSwgdHJ1ZSwgd3JpdGVDYXB0dXJlZCk7CiAgfQoKICAvLy8gUmV0dXJucyBhbiB1cGRhdGVkIG1vZGVsIHJlZmxlY3QgYSBjb250cm9sIHBhdGggdGhhdCBpcyBrbm93biB0byBoYXZlCiAgLy8vIHByZXZpb3VzbHkgcGFzc2VkIHRocm91Z2ggc29tZSBbb3RoZXJdIHN0YXRlLiAgU2VlIFtGbG93TW9kZWwucmVzdHJpY3RdCiAgLy8vIGZvciBkZXRhaWxzLgogIFZhcmlhYmxlTW9kZWw8VHlwZT4gcmVzdHJpY3QoVHlwZU9wZXJhdGlvbnM8T2JqZWN0LCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBvdGhlck1vZGVsLCBib29sIHVuc2FmZSkgewogICAgTGlzdDxUeXBlPiB0aGlzUHJvbW90ZWRUeXBlcyA9IHByb21vdGVkVHlwZXM7CiAgICBMaXN0PFR5cGU+IG90aGVyUHJvbW90ZWRUeXBlcyA9IG90aGVyTW9kZWwucHJvbW90ZWRUeXBlczsKICAgIGJvb2wgbmV3QXNzaWduZWQgPSBhc3NpZ25lZCB8fCBvdGhlck1vZGVsLmFzc2lnbmVkOwogICAgYm9vbCBuZXdXcml0ZUNhcHR1cmVkID0gd3JpdGVDYXB0dXJlZCB8fCBvdGhlck1vZGVsLndyaXRlQ2FwdHVyZWQ7CiAgICBMaXN0PFR5cGU+IG5ld1Byb21vdGVkVHlwZXM7CiAgICBpZiAodW5zYWZlKSB7CiAgICAgIC8vIFRoZXJlIHdhcyBhbiBhc3NpZ25tZW50IHRvIHRoZSB2YXJpYWJsZSBpbiB0aGUgInRoaXMiIHBhdGgsIHNvIG5vbmUgb2YKICAgICAgLy8gdGhlIHByb21vdGlvbnMgZnJvbSB0aGUgIm90aGVyIiBwYXRoIGNhbiBiZSB1c2VkLgogICAgICBuZXdQcm9tb3RlZFR5cGVzID0gdGhpc1Byb21vdGVkVHlwZXM7CiAgICB9IGVsc2UgaWYgKG90aGVyUHJvbW90ZWRUeXBlcyA9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBvdGhlciBwcm9tb3Rpb24gY2hhaW4gY29udHJpYnV0ZXMgbm90aGluZyBzbyB3ZSBqdXN0IHVzZSB0aGlzCiAgICAgIC8vIHByb21vdGlvbiBjaGFpbiBkaXJlY3RseS4KICAgICAgbmV3UHJvbW90ZWRUeXBlcyA9IHRoaXNQcm9tb3RlZFR5cGVzOwogICAgfSBlbHNlIGlmICh0aGlzUHJvbW90ZWRUeXBlcyA9PSBudWxsKSB7CiAgICAgIC8vIFRoaXMgcHJvbW90aW9uIGNoYWluIGNvbnRyaWJ1dGVzIG5vdGhpbmcgc28gd2UganVzdCB1c2UgdGhlIG90aGVyCiAgICAgIC8vIHByb21vdGlvbiBjaGFpbiBkaXJlY3RseS4KICAgICAgbmV3UHJvbW90ZWRUeXBlcyA9IG90aGVyUHJvbW90ZWRUeXBlczsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFN0YXJ0IHdpdGggb3RoZXJQcm9tb3RlZFR5cGVzIGFuZCBhcHBseSBlYWNoIG9mIHRoZSBwcm9tb3Rpb25zIGluCiAgICAgIC8vIHRoaXNQcm9tb3RlZFR5cGVzIChkaXNjYXJkaW5nIGFueSB0aGF0IGRvbid0IGZvbGxvdyB0aGUgb3JkZXJpbmcKICAgICAgLy8gaW52YXJpYW50KQogICAgICBuZXdQcm9tb3RlZFR5cGVzID0gb3RoZXJQcm9tb3RlZFR5cGVzOwogICAgICBUeXBlIG90aGVyUHJvbW90ZWRUeXBlID0gb3RoZXJQcm9tb3RlZFR5cGVzLmxhc3Q7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpc1Byb21vdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBUeXBlIG5leHRUeXBlID0gdGhpc1Byb21vdGVkVHlwZXNbaV07CiAgICAgICAgaWYgKHR5cGVPcGVyYXRpb25zLmlzU3VidHlwZU9mKG5leHRUeXBlLCBvdGhlclByb21vdGVkVHlwZSkgJiYKICAgICAgICAgICAgIXR5cGVPcGVyYXRpb25zLmlzU2FtZVR5cGUobmV4dFR5cGUsIG90aGVyUHJvbW90ZWRUeXBlKSkgewogICAgICAgICAgbmV3UHJvbW90ZWRUeXBlcyA9IG90aGVyUHJvbW90ZWRUeXBlcy50b0xpc3QoKQogICAgICAgICAgICAuLmFkZEFsbCh0aGlzUHJvbW90ZWRUeXBlcy5za2lwKGkpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIF9pZGVudGljYWxPck5ldyh0aGlzLCBvdGhlck1vZGVsLCBuZXdQcm9tb3RlZFR5cGVzLCB0ZXN0ZWQsCiAgICAgICAgbmV3QXNzaWduZWQsIG5ld1dyaXRlQ2FwdHVyZWQpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgTGlzdDxTdHJpbmc+IHBhcnRzID0gW107CiAgICBpZiAocHJvbW90ZWRUeXBlcyAhPSBudWxsKSB7CiAgICAgIHBhcnRzLmFkZCgncHJvbW90ZWRUeXBlczogJHByb21vdGVkVHlwZXMnKTsKICAgIH0KICAgIGlmICh0ZXN0ZWQuaXNOb3RFbXB0eSkgewogICAgICBwYXJ0cy5hZGQoJ3Rlc3RlZDogJHRlc3RlZCcpOwogICAgfQogICAgaWYgKGFzc2lnbmVkKSB7CiAgICAgIHBhcnRzLmFkZCgnYXNzaWduZWQ6IHRydWUnKTsKICAgIH0KICAgIGlmICh3cml0ZUNhcHR1cmVkKSB7CiAgICAgIHBhcnRzLmFkZCgnd3JpdGVDYXB0dXJlZDogdHJ1ZScpOwogICAgfQogICAgcmV0dXJuICdWYXJpYWJsZU1vZGVsKCR7cGFydHMuam9pbignLCAnKX0pJzsKICB9CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtWYXJpYWJsZU1vZGVsXSByZWZsZWN0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIHZhcmlhYmxlIHdhcwogIC8vLyBqdXN0IHdyaXR0ZW4gdG8uCiAgVmFyaWFibGVNb2RlbDxUeXBlPiB3cml0ZSgKICAgICAgVHlwZSB3cml0dGVuVHlwZSwgVHlwZU9wZXJhdGlvbnM8T2JqZWN0LCBUeXBlPiB0eXBlT3BlcmF0aW9ucykgewogICAgTGlzdDxUeXBlPiBuZXdQcm9tb3RlZFR5cGVzOwogICAgaWYgKHByb21vdGVkVHlwZXMgPT0gbnVsbCkgewogICAgICBuZXdQcm9tb3RlZFR5cGVzID0gbnVsbDsKICAgIH0gZWxzZSBpZiAodHlwZU9wZXJhdGlvbnMuaXNTdWJ0eXBlT2Yod3JpdHRlblR5cGUsIHByb21vdGVkVHlwZXMubGFzdCkpIHsKICAgICAgbmV3UHJvbW90ZWRUeXBlcyA9IHByb21vdGVkVHlwZXM7CiAgICB9IGVsc2UgewogICAgICBpbnQgbnVtQ2hhaW5FbGVtZW50c1RvS2VlcCA9IHByb21vdGVkVHlwZXMubGVuZ3RoIC0gMTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAobnVtQ2hhaW5FbGVtZW50c1RvS2VlcCA9PSAwKSB7CiAgICAgICAgICBuZXdQcm9tb3RlZFR5cGVzID0gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAodHlwZU9wZXJhdGlvbnMuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgIHdyaXR0ZW5UeXBlLCBwcm9tb3RlZFR5cGVzW251bUNoYWluRWxlbWVudHNUb0tlZXAgLSAxXSkpIHsKICAgICAgICAgIG5ld1Byb21vdGVkVHlwZXMgPSBwcm9tb3RlZFR5cGVzLnN1Ymxpc3QoMCwgbnVtQ2hhaW5FbGVtZW50c1RvS2VlcCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbnVtQ2hhaW5FbGVtZW50c1RvS2VlcC0tOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbmV3UHJvbW90ZWRUeXBlcyA9IF90cnlQcm9tb3RlVG9UeXBlT2ZJbnRlcmVzdCgKICAgICAgICB0eXBlT3BlcmF0aW9ucywgbmV3UHJvbW90ZWRUeXBlcywgd3JpdHRlblR5cGUpOwogICAgaWYgKGlkZW50aWNhbChwcm9tb3RlZFR5cGVzLCBuZXdQcm9tb3RlZFR5cGVzKSAmJiBhc3NpZ25lZCkgcmV0dXJuIHRoaXM7CiAgICBMaXN0PFR5cGU+IG5ld1Rlc3RlZDsKICAgIGlmIChuZXdQcm9tb3RlZFR5cGVzID09IG51bGwgJiYgcHJvbW90ZWRUeXBlcyAhPSBudWxsKSB7CiAgICAgIG5ld1Rlc3RlZCA9IGNvbnN0IFtdOwogICAgfSBlbHNlIHsKICAgICAgbmV3VGVzdGVkID0gdGVzdGVkOwogICAgfQogICAgcmV0dXJuIG5ldyBWYXJpYWJsZU1vZGVsPFR5cGU+KAogICAgICAgIG5ld1Byb21vdGVkVHlwZXMsIG5ld1Rlc3RlZCwgdHJ1ZSwgd3JpdGVDYXB0dXJlZCk7CiAgfQoKICAvLy8gUmV0dXJucyBhIG5ldyBbVmFyaWFibGVNb2RlbF0gcmVmbGVjdGluZyB0aGUgZmFjdCB0aGF0IHRoZSB2YXJpYWJsZSBoYXMKICAvLy8gYmVlbiB3cml0ZS1jYXB0dXJlZC4KICBWYXJpYWJsZU1vZGVsPFR5cGU+IHdyaXRlQ2FwdHVyZSgpIHsKICAgIHJldHVybiBuZXcgVmFyaWFibGVNb2RlbDxUeXBlPihudWxsLCBjb25zdCBbXSwgYXNzaWduZWQsIHRydWUpOwogIH0KCiAgLy8vIERldGVybWluZXMgd2hldGhlciBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIFtwcm9tb3RlZFR5cGVzXSBzaG91bGQgYmUKICAvLy8gcHJvbW90ZWQgdG8gW3dyaXR0ZW5UeXBlXSBiYXNlZCBvbiB0eXBlcyBvZiBpbnRlcmVzdC4gIElmIGl0IHNob3VsZCwKICAvLy8gcmV0dXJucyBhbiB1cGRhdGVkIHByb21vdGlvbiBjaGFpbjsgb3RoZXJ3aXNlIHJldHVybnMgW3Byb21vdGVkVHlwZXNdCiAgLy8vIHVuY2hhbmdlZC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHNpbmNlIHByb21vdGlvbnMgY2hhaW5zIGFyZSBjb25zaWRlcmVkIGltbXV0YWJsZSwgaWYgcHJvbW90aW9uCiAgLy8vIGlzIHJlcXVpcmVkLCBhIG5ldyBwcm9tb3Rpb24gY2hhaW4gd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC4KICBMaXN0PFR5cGU+IF90cnlQcm9tb3RlVG9UeXBlT2ZJbnRlcmVzdCgKICAgICAgVHlwZU9wZXJhdGlvbnM8T2JqZWN0LCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgICAgTGlzdDxUeXBlPiBwcm9tb3RlZFR5cGVzLAogICAgICBUeXBlIHdyaXR0ZW5UeXBlKSB7CiAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIGhhdmUgYW55IHByb21vdGlvbiBjYW5kaWRhdGVzICh0eXBlcyB0aGF0IGFyZSBhCiAgICAvLyBzdXBlcnR5cGUgb2Ygd3JpdHRlblR5cGUgYW5kIGEgcHJvcGVyIHN1YnR5cGUgb2YgdGhlIGN1cnJlbnRseS1wcm9tb3RlZAogICAgLy8gdHlwZSkuICBJZiBhdCBhbnkgcG9pbnQgd2UgZmluZCBhbiBleGFjdCBtYXRjaCwgd2UgdGFrZSBpdCBpbW1lZGlhdGVseS4KICAgIFR5cGUgY3VycmVudGx5UHJvbW90ZWRUeXBlID0gcHJvbW90ZWRUeXBlcz8ubGFzdDsKICAgIExpc3Q8VHlwZT4gY2FuZGlkYXRlcyA9IG51bGw7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RlZC5sZW5ndGg7IGkrKykgewogICAgICBUeXBlIHR5cGUgPSB0ZXN0ZWRbaV07CiAgICAgIGlmICghdHlwZU9wZXJhdGlvbnMuaXNTdWJ0eXBlT2Yod3JpdHRlblR5cGUsIHR5cGUpKSB7CiAgICAgICAgLy8gQ2FuJ3QgcHJvbW90ZSB0byB0aGlzIHR5cGU7IHRoZSB0eXBlIHdyaXR0ZW4gaXMgbm90IGEgc3VidHlwZSBvZgogICAgICAgIC8vIGl0LgogICAgICB9IGVsc2UgaWYgKGN1cnJlbnRseVByb21vdGVkVHlwZSAhPSBudWxsICYmCiAgICAgICAgICAhdHlwZU9wZXJhdGlvbnMuaXNTdWJ0eXBlT2YodHlwZSwgY3VycmVudGx5UHJvbW90ZWRUeXBlKSkgewogICAgICAgIC8vIENhbid0IHByb21vdGUgdG8gdGhpcyB0eXBlOyBpdCdzIGxlc3Mgc3BlY2lmaWMgdGhhbiB0aGUgY3VycmVudGx5CiAgICAgICAgLy8gcHJvbW90ZWQgdHlwZS4KICAgICAgfSBlbHNlIGlmIChjdXJyZW50bHlQcm9tb3RlZFR5cGUgIT0gbnVsbCAmJgogICAgICAgICAgdHlwZU9wZXJhdGlvbnMuaXNTYW1lVHlwZSh0eXBlLCBjdXJyZW50bHlQcm9tb3RlZFR5cGUpKSB7CiAgICAgICAgLy8gQ2FuJ3QgcHJvbW90ZSB0byB0aGlzIHR5cGU7IGl0J3MgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRseQogICAgICAgIC8vIHByb21vdGVkIHR5cGUuCiAgICAgIH0gZWxzZSBpZiAodHlwZU9wZXJhdGlvbnMuaXNTYW1lVHlwZSh0eXBlLCB3cml0dGVuVHlwZSkpIHsKICAgICAgICAvLyBUaGlzIGlzIHByZWNpc2VseSB0aGUgdHlwZSB3ZSB3YW50IHRvIHByb21vdGUgdG87IHRha2UgaXQuCiAgICAgICAgcmV0dXJuIF9hZGRUb1Byb21vdGVkVHlwZXMocHJvbW90ZWRUeXBlcywgd3JpdHRlblR5cGUpOwogICAgICB9IGVsc2UgewogICAgICAgIChjYW5kaWRhdGVzID8/PSBbXSkuYWRkKHR5cGUpOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FuZGlkYXRlcyAhPSBudWxsKSB7CiAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgaGF2ZSBhIHVuaXF1ZSBwcm9tb3Rpb24gY2FuZGlkYXRlIHRoYXQncyBhIHN1YnR5cGUKICAgICAgLy8gb2YgYWxsIHRoZSBvdGhlcnMuCiAgICAgIFR5cGUgcHJvbW90ZWQ7CiAgICAgIG91dGVyOgogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChqID09IGkpIGNvbnRpbnVlOwogICAgICAgICAgaWYgKCF0eXBlT3BlcmF0aW9ucy5pc1N1YnR5cGVPZihjYW5kaWRhdGVzW2ldLCBjYW5kaWRhdGVzW2pdKSkgewogICAgICAgICAgICAvLyBOb3QgYSBzdWJ0eXBlIG9mIGFsbCB0aGUgb3RoZXJzLgogICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHByb21vdGVkICE9IG51bGwpIHsKICAgICAgICAgIC8vIE5vdCB1bmlxdWUuICBEbyBub3QgcHJvbW90ZS4KICAgICAgICAgIHJldHVybiBwcm9tb3RlZFR5cGVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9tb3RlZCA9IGNhbmRpZGF0ZXNbaV07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9tb3RlZCAhPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIF9hZGRUb1Byb21vdGVkVHlwZXMocHJvbW90ZWRUeXBlcywgcHJvbW90ZWQpOwogICAgICB9CiAgICB9CiAgICAvLyBObyBzdWl0YWJsZSBwcm9tb3Rpb24gZm91bmQuCiAgICByZXR1cm4gcHJvbW90ZWRUeXBlczsKICB9CgogIC8vLyBKb2lucyB0d28gdmFyaWFibGUgbW9kZWxzLiAgU2VlIFtGbG93TW9kZWwuam9pbl0gZm9yIGRldGFpbHMuCiAgc3RhdGljIFZhcmlhYmxlTW9kZWw8VHlwZT4gam9pbjxUeXBlPigKICAgICAgVHlwZU9wZXJhdGlvbnM8T2JqZWN0LCBUeXBlPiB0eXBlT3BlcmF0aW9ucywKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBmaXJzdCwKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBzZWNvbmQpIHsKICAgIExpc3Q8VHlwZT4gbmV3UHJvbW90ZWRUeXBlcyA9IGpvaW5Qcm9tb3RlZFR5cGVzKAogICAgICAgIGZpcnN0LnByb21vdGVkVHlwZXMsIHNlY29uZC5wcm9tb3RlZFR5cGVzLCB0eXBlT3BlcmF0aW9ucyk7CiAgICBib29sIG5ld0Fzc2lnbmVkID0gZmlyc3QuYXNzaWduZWQgJiYgc2Vjb25kLmFzc2lnbmVkOwogICAgYm9vbCBuZXdXcml0ZUNhcHR1cmVkID0gZmlyc3Qud3JpdGVDYXB0dXJlZCB8fCBzZWNvbmQud3JpdGVDYXB0dXJlZDsKICAgIExpc3Q8VHlwZT4gbmV3VGVzdGVkID0gbmV3V3JpdGVDYXB0dXJlZAogICAgICAgID8gY29uc3QgW10KICAgICAgICA6IGpvaW5UZXN0ZWQoZmlyc3QudGVzdGVkLCBzZWNvbmQudGVzdGVkLCB0eXBlT3BlcmF0aW9ucyk7CiAgICByZXR1cm4gX2lkZW50aWNhbE9yTmV3KGZpcnN0LCBzZWNvbmQsIG5ld1Byb21vdGVkVHlwZXMsIG5ld1Rlc3RlZCwKICAgICAgICBuZXdBc3NpZ25lZCwgbmV3V3JpdGVDYXB0dXJlZCk7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIHBvcnRpb24gb2YgdGhlICJqb2luIiBhbGdvcml0aG0gdGhhdCBhcHBsaWVzIHRvIHByb21vdGlvbgogIC8vLyBjaGFpbnMuICBCcmllZmx5LCB3ZSBpbnRlcnNlY3QgZ2l2ZW4gY2hhaW5zLiAgVGhlIGNoYWlucyBhcmUgdG90YWxseQogIC8vLyBvcmRlcmVkIHN1YnNldHMgb2YgYSBnbG9iYWwgcGFydGlhbCBvcmRlci4gIFRoZWlyIGludGVyc2VjdGlvbiBpcyBhCiAgLy8vIHN1YnNldCBvZiBlYWNoLCBhbmQgYXMgc3VjaCBpcyBhbHNvIHRvdGFsbHkgb3JkZXJlZC4KICBzdGF0aWMgTGlzdDxUeXBlPiBqb2luUHJvbW90ZWRUeXBlczxUeXBlPihMaXN0PFR5cGU+IGNoYWluMSwKICAgICAgTGlzdDxUeXBlPiBjaGFpbjIsIFR5cGVPcGVyYXRpb25zPE9iamVjdCwgVHlwZT4gdHlwZU9wZXJhdGlvbnMpIHsKICAgIGlmIChjaGFpbjEgPT0gbnVsbCkgcmV0dXJuIGNoYWluMTsKICAgIGlmIChjaGFpbjIgPT0gbnVsbCkgcmV0dXJuIGNoYWluMjsKCiAgICBpbnQgaW5kZXgxID0gMDsKICAgIGludCBpbmRleDIgPSAwOwogICAgYm9vbCBza2lwcGVkMSA9IGZhbHNlOwogICAgYm9vbCBza2lwcGVkMiA9IGZhbHNlOwogICAgTGlzdDxUeXBlPiByZXN1bHQ7CiAgICB3aGlsZSAoaW5kZXgxIDwgY2hhaW4xLmxlbmd0aCAmJiBpbmRleDIgPCBjaGFpbjIubGVuZ3RoKSB7CiAgICAgIHZhciB0eXBlMSA9IGNoYWluMVtpbmRleDFdOwogICAgICB2YXIgdHlwZTIgPSBjaGFpbjJbaW5kZXgyXTsKICAgICAgaWYgKHR5cGVPcGVyYXRpb25zLmlzU2FtZVR5cGUodHlwZTEsIHR5cGUyKSkgewogICAgICAgIHJlc3VsdCA/Pz0gPFR5cGU+W107CiAgICAgICAgcmVzdWx0LmFkZCh0eXBlMSk7CiAgICAgICAgaW5kZXgxKys7CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0gZWxzZSBpZiAodHlwZU9wZXJhdGlvbnMuaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxKSkgewogICAgICAgIGluZGV4MSsrOwogICAgICAgIHNraXBwZWQxID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh0eXBlT3BlcmF0aW9ucy5pc1N1YnR5cGVPZih0eXBlMSwgdHlwZTIpKSB7CiAgICAgICAgaW5kZXgyKys7CiAgICAgICAgc2tpcHBlZDIgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHNraXBwZWQxID0gdHJ1ZTsKICAgICAgICBza2lwcGVkMiA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5kZXgxID09IGNoYWluMS5sZW5ndGggJiYgIXNraXBwZWQxKSByZXR1cm4gY2hhaW4xOwogICAgaWYgKGluZGV4MiA9PSBjaGFpbjIubGVuZ3RoICYmICFza2lwcGVkMikgcmV0dXJuIGNoYWluMjsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIHBvcnRpb24gb2YgdGhlICJqb2luIiBhbGdvcml0aG0gdGhhdCBhcHBsaWVzIHRvIHByb21vdGlvbgogIC8vLyBjaGFpbnMuICBFc3NlbnRpYWxseSB0aGlzIHBlcmZvcm1zIGEgc2V0IHVuaW9uLCB3aXRoIHRoZSBmb2xsb3dpbmcKICAvLy8gY2F2ZWF0czoKICAvLy8gLSBUaGUgInNldHMiIGFyZSByZXByZXNlbnRlZCBhcyBsaXN0cyAoc2luY2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgdmVyeQogIC8vLyAgIHNtYWxsIGluIHJlYWwtd29ybGQgY2FzZXMpCiAgLy8vIC0gVGhlIHNlbnNlIG9mIGVxdWFsaXR5IGZvciB0aGUgdW5pb24gb3BlcmF0aW9uIGlzIGRldGVybWluZWQgYnkKICAvLy8gICBbVHlwZU9wZXJhdGlvbnMuaXNTYW1lVHlwZV0uCiAgLy8vIC0gVGhlIHR5cGVzIG9mIGludGVyZXN0cyBsaXN0cyBhcmUgY29uc2lkZXJlZCBpbW11dGFibGUuCiAgc3RhdGljIExpc3Q8VHlwZT4gam9pblRlc3RlZDxUeXBlPihMaXN0PFR5cGU+IHR5cGVzMSwgTGlzdDxUeXBlPiB0eXBlczIsCiAgICAgIFR5cGVPcGVyYXRpb25zPE9iamVjdCwgVHlwZT4gdHlwZU9wZXJhdGlvbnMpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHR5cGVzMSBpcyB0aGUgc2hvcnRlciBsaXN0LgogICAgaWYgKHR5cGVzMS5sZW5ndGggPiB0eXBlczIubGVuZ3RoKSB7CiAgICAgIExpc3Q8VHlwZT4gdG1wID0gdHlwZXMxOwogICAgICB0eXBlczEgPSB0eXBlczI7CiAgICAgIHR5cGVzMiA9IHRtcDsKICAgIH0KICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHRoZSB0d28gbGlzdHMgc2hhcmUuCiAgICBpbnQgc2hhcmVkID0gMDsKICAgIGZvciAoOyBzaGFyZWQgPCB0eXBlczEubGVuZ3RoOyBzaGFyZWQrKykgewogICAgICBpZiAoIXR5cGVPcGVyYXRpb25zLmlzU2FtZVR5cGUodHlwZXMxW3NoYXJlZF0sIHR5cGVzMltzaGFyZWRdKSkgYnJlYWs7CiAgICB9CiAgICAvLyBVc2UgdHlwZXMyIGFzIGEgc3RhcnRpbmcgcG9pbnQgYW5kIGFkZCBhbnkgZW50cmllcyBmcm9tIHR5cGVzMSB0aGF0IGFyZQogICAgLy8gbm90IHByZXNlbnQgaW4gaXQuCiAgICBmb3IgKGludCBpID0gc2hhcmVkOyBpIDwgdHlwZXMxLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGUgdHlwZVRvQWRkID0gdHlwZXMxW2ldOwogICAgICBpZiAoX3R5cGVMaXN0Q29udGFpbnModHlwZU9wZXJhdGlvbnMsIHR5cGVzMiwgdHlwZVRvQWRkKSkgY29udGludWU7CiAgICAgIExpc3Q8VHlwZT4gcmVzdWx0ID0gdHlwZXMyLnRvTGlzdCgpLi5hZGQodHlwZVRvQWRkKTsKICAgICAgZm9yIChpKys7IGkgPCB0eXBlczEubGVuZ3RoOyBpKyspIHsKICAgICAgICB0eXBlVG9BZGQgPSB0eXBlczFbaV07CiAgICAgICAgaWYgKF90eXBlTGlzdENvbnRhaW5zKHR5cGVPcGVyYXRpb25zLCB0eXBlczIsIHR5cGVUb0FkZCkpIGNvbnRpbnVlOwogICAgICAgIHJlc3VsdC5hZGQodHlwZVRvQWRkKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gTm8gdHlwZXMgbmVlZGVkIHRvIGJlIGFkZGVkLgogICAgcmV0dXJuIHR5cGVzMjsKICB9CgogIHN0YXRpYyBMaXN0PFR5cGU+IF9hZGRUb1Byb21vdGVkVHlwZXM8VHlwZT4oCiAgICAgICAgICBMaXN0PFR5cGU+IHByb21vdGVkVHlwZXMsIFR5cGUgcHJvbW90ZWQpID0+CiAgICAgIHByb21vdGVkVHlwZXMgPT0gbnVsbAogICAgICAgICAgPyBbcHJvbW90ZWRdCiAgICAgICAgICA6IChwcm9tb3RlZFR5cGVzLnRvTGlzdCgpLi5hZGQocHJvbW90ZWQpKTsKCiAgc3RhdGljIExpc3Q8VHlwZT4gX2FkZFR5cGVUb1VuaXF1ZUxpc3Q8VHlwZT4oTGlzdDxUeXBlPiB0eXBlcywgVHlwZSBuZXdUeXBlLAogICAgICBUeXBlT3BlcmF0aW9uczxPYmplY3QsIFR5cGU+IHR5cGVPcGVyYXRpb25zKSB7CiAgICBpZiAoX3R5cGVMaXN0Q29udGFpbnModHlwZU9wZXJhdGlvbnMsIHR5cGVzLCBuZXdUeXBlKSkgcmV0dXJuIHR5cGVzOwogICAgcmV0dXJuIG5ldyBMaXN0PFR5cGU+LmZyb20odHlwZXMpLi5hZGQobmV3VHlwZSk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbVmFyaWFibGVNb2RlbF0gb2JqZWN0LCB1bmxlc3MgaXQgaXMgZXF1aXZhbGVudCB0byBlaXRoZXIKICAvLy8gW2ZpcnN0XSBvciBbc2Vjb25kXSwgaW4gd2hpY2ggY2FzZSBvbmUgb2YgdGhvc2Ugb2JqZWN0cyBpcyByZS11c2VkLgogIHN0YXRpYyBWYXJpYWJsZU1vZGVsPFR5cGU+IF9pZGVudGljYWxPck5ldzxUeXBlPigKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBmaXJzdCwKICAgICAgVmFyaWFibGVNb2RlbDxUeXBlPiBzZWNvbmQsCiAgICAgIExpc3Q8VHlwZT4gbmV3UHJvbW90ZWRUeXBlcywKICAgICAgTGlzdDxUeXBlPiBuZXdUZXN0ZWQsCiAgICAgIGJvb2wgbmV3QXNzaWduZWQsCiAgICAgIGJvb2wgbmV3V3JpdGVDYXB0dXJlZCkgewogICAgaWYgKGlkZW50aWNhbChmaXJzdC5wcm9tb3RlZFR5cGVzLCBuZXdQcm9tb3RlZFR5cGVzKSAmJgogICAgICAgIGlkZW50aWNhbChmaXJzdC50ZXN0ZWQsIG5ld1Rlc3RlZCkgJiYKICAgICAgICBmaXJzdC5hc3NpZ25lZCA9PSBuZXdBc3NpZ25lZCAmJgogICAgICAgIGZpcnN0LndyaXRlQ2FwdHVyZWQgPT0gbmV3V3JpdGVDYXB0dXJlZCkgewogICAgICByZXR1cm4gZmlyc3Q7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChzZWNvbmQucHJvbW90ZWRUeXBlcywgbmV3UHJvbW90ZWRUeXBlcykgJiYKICAgICAgICBpZGVudGljYWwoc2Vjb25kLnRlc3RlZCwgbmV3VGVzdGVkKSAmJgogICAgICAgIHNlY29uZC5hc3NpZ25lZCA9PSBuZXdBc3NpZ25lZCAmJgogICAgICAgIHNlY29uZC53cml0ZUNhcHR1cmVkID09IG5ld1dyaXRlQ2FwdHVyZWQpIHsKICAgICAgcmV0dXJuIHNlY29uZDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVmFyaWFibGVNb2RlbDxUeXBlPigKICAgICAgICAgIG5ld1Byb21vdGVkVHlwZXMsIG5ld1Rlc3RlZCwgbmV3QXNzaWduZWQsIG5ld1dyaXRlQ2FwdHVyZWQpOwogICAgfQogIH0KCiAgc3RhdGljIGJvb2wgX3R5cGVMaXN0Q29udGFpbnM8VHlwZT4oCiAgICAgIFR5cGVPcGVyYXRpb25zPE9iamVjdCwgVHlwZT4gdHlwZU9wZXJhdGlvbnMsCiAgICAgIExpc3Q8VHlwZT4gbGlzdCwKICAgICAgVHlwZSBzZWFyY2hUeXBlKSB7CiAgICBmb3IgKFR5cGUgdHlwZSBpbiBsaXN0KSB7CiAgICAgIGlmICh0eXBlT3BlcmF0aW9ucy5pc1NhbWVUeXBlKHR5cGUsIHNlYXJjaFR5cGUpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCi8vLyBbX0Zsb3dDb250ZXh0XSByZXByZXNlbnRpbmcgYW4gYXNzZXJ0IHN0YXRlbWVudCBvciBhc3NlcnQgaW5pdGlhbGl6ZXIuCmNsYXNzIF9Bc3NlcnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBleHRlbmRzIF9TaW1wbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiB7CiAgLy8vIEZsb3cgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZGl0aW9uIGJlaW5nIGFzc2VydGVkLgogIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBfY29uZGl0aW9uSW5mbzsKCiAgX0Fzc2VydENvbnRleHQoRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBwcmV2aW91cykgOiBzdXBlcihwcmV2aW91cyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdfQXNzZXJ0Q29udGV4dChwcmV2aW91czogJF9wcmV2aW91cywgY29uZGl0aW9uSW5mbzogJF9jb25kaXRpb25JbmZvKSc7Cn0KCi8vLyBbX0Zsb3dDb250ZXh0XSByZXByZXNlbnRpbmcgYSBsYW5ndWFnZSBjb25zdHJ1Y3QgdGhhdCBicmFuY2hlcyBvbiBhIGJvb2xlYW4KLy8vIGNvbmRpdGlvbiwgc3VjaCBhcyBhbiBgaWZgIHN0YXRlbWVudCwgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiwgb3IgYSBsb2dpY2FsCi8vLyBiaW5hcnkgb3BlcmF0b3IuCmNsYXNzIF9CcmFuY2hDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBleHRlbmRzIF9GbG93Q29udGV4dCB7CiAgLy8vIEZsb3cgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZGl0aW9uIGJlaW5nIGJyYW5jaGVkIG9uLgogIGZpbmFsIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBfY29uZGl0aW9uSW5mbzsKCiAgX0JyYW5jaENvbnRleHQodGhpcy5fY29uZGl0aW9uSW5mbyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdfQnJhbmNoQ29udGV4dChjb25kaXRpb25JbmZvOiAkX2NvbmRpdGlvbkluZm8pJzsKfQoKLy8vIFtfRmxvd0NvbnRleHRdIHJlcHJlc2VudGluZyBhIGxhbmd1YWdlIGNvbnN0cnVjdCB0aGF0IGNhbiBiZSB0YXJnZXRlZCBieQovLy8gYGJyZWFrYCBvciBgY29udGludWVgIHN0YXRlbWVudHMsIHN1Y2ggYXMgYSBsb29wIG9yIHN3aXRjaCBzdGF0ZW1lbnQuCmNsYXNzIF9CcmFuY2hUYXJnZXRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBleHRlbmRzIF9GbG93Q29udGV4dCB7CiAgLy8vIEFjY3VtdWxhdGVkIGZsb3cgbW9kZWwgZm9yIGFsbCBgYnJlYWtgIHN0YXRlbWVudHMgc2VlbiBzbyBmYXIsIG9yIGBudWxsYAogIC8vLyBpZiBubyBgYnJlYWtgIHN0YXRlbWVudHMgaGF2ZSBiZWVuIHNlZW4geWV0LgogIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gX2JyZWFrTW9kZWw7CgogIC8vLyBBY2N1bXVsYXRlZCBmbG93IG1vZGVsIGZvciBhbGwgYGNvbnRpbnVlYCBzdGF0ZW1lbnRzIHNlZW4gc28gZmFyLCBvcgogIC8vLyBgbnVsbGAgaWYgbm8gYGNvbnRpbnVlYCBzdGF0ZW1lbnRzIGhhdmUgYmVlbiBzZWVuIHlldC4KICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IF9jb250aW51ZU1vZGVsOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnX0JyYW5jaFRhcmdldENvbnRleHQoYnJlYWtNb2RlbDogJF9icmVha01vZGVsLCAnCiAgICAgICdjb250aW51ZU1vZGVsOiAkX2NvbnRpbnVlTW9kZWwpJzsKfQoKLy8vIFtfRmxvd0NvbnRleHRdIHJlcHJlc2VudGluZyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCmNsYXNzIF9Db25kaXRpb25hbENvbnRleHQ8VmFyaWFibGUsIFR5cGU+CiAgICBleHRlbmRzIF9CcmFuY2hDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiB7CiAgLy8vIEZsb3cgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaW4gdGhlCiAgLy8vIGNpcmN1bXN0YW5jZSB3aGVyZSB0aGUgInRoZW4iIGJyYW5jaCBpcyB0YWtlbi4KICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gX3RoZW5JbmZvOwoKICBfQ29uZGl0aW9uYWxDb250ZXh0KEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBjb25kaXRpb25JbmZvKQogICAgICA6IHN1cGVyKGNvbmRpdGlvbkluZm8pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnX0NvbmRpdGlvbmFsQ29udGV4dChjb25kaXRpb25JbmZvOiAkX2NvbmRpdGlvbkluZm8sICcKICAgICAgJ3RoZW5JbmZvOiAkX3RoZW5JbmZvKSc7Cn0KCmNsYXNzIF9GbG93QW5hbHlzaXNJbXBsPE5vZGUsIFN0YXRlbWVudCBleHRlbmRzIE5vZGUsIEV4cHJlc3Npb24sIFZhcmlhYmxlLAogICAgVHlwZT4gaW1wbGVtZW50cyBGbG93QW5hbHlzaXM8Tm9kZSwgU3RhdGVtZW50LCBFeHByZXNzaW9uLCBWYXJpYWJsZSwgVHlwZT4gewogIC8vLyBUaGUgW1R5cGVPcGVyYXRpb25zXSwgdXNlZCB0byBhY2Nlc3MgdHlwZXMsIGFuZCBjaGVjayBzdWJ0eXBpbmcuCiAgZmluYWwgVHlwZU9wZXJhdGlvbnM8VmFyaWFibGUsIFR5cGU+IHR5cGVPcGVyYXRpb25zOwoKICAvLy8gU3RhY2sgb2YgW19GbG93Q29udGV4dF0gb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHN0YXRlbWVudHMgYW5kCiAgLy8vIGV4cHJlc3Npb25zIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkLgogIGZpbmFsIExpc3Q8X0Zsb3dDb250ZXh0PiBfc3RhY2sgPSBbXTsKCiAgLy8vIFRoZSBtYXBwaW5nIGZyb20gW1N0YXRlbWVudF1zIHRoYXQgY2FuIGFjdCBhcyB0YXJnZXRzIGZvciBgYnJlYWtgIGFuZAogIC8vLyBgY29udGludWVgIHN0YXRlbWVudHMgKGkuZS4gbG9vcHMgYW5kIHN3aXRjaCBzdGF0ZW1lbnRzKSB0byB0aGUgdG8gdGhlaXIKICAvLy8gY29udGV4dCBpbmZvcm1hdGlvbi4KICBmaW5hbCBNYXA8U3RhdGVtZW50LCBfQnJhbmNoVGFyZ2V0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4+CiAgICAgIF9zdGF0ZW1lbnRUb0NvbnRleHQgPSB7fTsKCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBfY3VycmVudDsKCiAgLy8vIFRoZSBtb3N0IHJlY2VudGx5IHZpc2l0ZWQgZXhwcmVzc2lvbiBmb3Igd2hpY2ggYW4gW0V4cHJlc3Npb25JbmZvXSBvYmplY3QKICAvLy8gZXhpc3RzLCBvciBgbnVsbGAgaWYgbm8gZXhwcmVzc2lvbiBoYXMgYmVlbiB2aXNpdGVkIHRoYXQgaGFzIGEKICAvLy8gY29ycmVzcG9uZGluZyBbRXhwcmVzc2lvbkluZm9dIG9iamVjdC4KICBFeHByZXNzaW9uIF9leHByZXNzaW9uV2l0aEluZm87CgogIC8vLyBJZiBbX2V4cHJlc3Npb25XaXRoSW5mb10gaXMgbm90IGBudWxsYCwgdGhlIFtFeHByZXNzaW9uSW5mb10gb2JqZWN0CiAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gaXQuICBPdGhlcndpc2UgYG51bGxgLgogIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBfZXhwcmVzc2lvbkluZm87CgogIGludCBfZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPSAwOwoKICBmaW5hbCBBc3NpZ25lZFZhcmlhYmxlczxOb2RlLCBWYXJpYWJsZT4gX2Fzc2lnbmVkVmFyaWFibGVzOwoKICBfRmxvd0FuYWx5c2lzSW1wbCh0aGlzLnR5cGVPcGVyYXRpb25zLCB0aGlzLl9hc3NpZ25lZFZhcmlhYmxlcykgewogICAgX2N1cnJlbnQgPSBuZXcgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPih0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzUmVhY2hhYmxlID0+IF9jdXJyZW50LnJlYWNoYWJsZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhc0V4cHJlc3Npb25fZW5kKEV4cHJlc3Npb24gc3ViRXhwcmVzc2lvbiwgVHlwZSB0eXBlKSB7CiAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gc3ViRXhwcmVzc2lvbkluZm8gPQogICAgICAgIF9nZXRFeHByZXNzaW9uSW5mbyhzdWJFeHByZXNzaW9uKTsKICAgIFZhcmlhYmxlIHZhcmlhYmxlOwogICAgaWYgKHN1YkV4cHJlc3Npb25JbmZvIGlzIF9WYXJpYWJsZVJlYWRJbmZvPFZhcmlhYmxlLCBUeXBlPikgewogICAgICB2YXJpYWJsZSA9IHN1YkV4cHJlc3Npb25JbmZvLl92YXJpYWJsZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9jdXJyZW50ID0gX2N1cnJlbnQudHJ5UHJvbW90ZSh0eXBlT3BlcmF0aW9ucywgdmFyaWFibGUsIHR5cGUpLmlmVHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXNzZXJ0X2FmdGVyQ29uZGl0aW9uKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICBfQXNzZXJ0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLmxhc3QgYXMgX0Fzc2VydENvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGNvbmRpdGlvbkluZm8gPSBfZXhwcmVzc2lvbkVuZChjb25kaXRpb24pOwogICAgY29udGV4dC5fY29uZGl0aW9uSW5mbyA9IGNvbmRpdGlvbkluZm87CiAgICBfY3VycmVudCA9IGNvbmRpdGlvbkluZm8uaWZGYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXNzZXJ0X2JlZ2luKCkgewogICAgX3N0YWNrLmFkZChuZXcgX0Fzc2VydENvbnRleHQ8VmFyaWFibGUsIFR5cGU+KF9jdXJyZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFzc2VydF9lbmQoKSB7CiAgICBfQXNzZXJ0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfQXNzZXJ0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IF9qb2luKGNvbnRleHQuX3ByZXZpb3VzLCBjb250ZXh0Ll9jb25kaXRpb25JbmZvLmlmVHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJvb2xlYW5MaXRlcmFsKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgYm9vbCB2YWx1ZSkgewogICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiB1bnJlYWNoYWJsZSA9IF9jdXJyZW50LnNldFJlYWNoYWJsZShmYWxzZSk7CiAgICBfc3RvcmVFeHByZXNzaW9uSW5mbygKICAgICAgICBleHByZXNzaW9uLAogICAgICAgIHZhbHVlCiAgICAgICAgICAgID8gbmV3IEV4cHJlc3Npb25JbmZvKF9jdXJyZW50LCBfY3VycmVudCwgdW5yZWFjaGFibGUpCiAgICAgICAgICAgIDogbmV3IEV4cHJlc3Npb25JbmZvKF9jdXJyZW50LCB1bnJlYWNoYWJsZSwgX2N1cnJlbnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY29uZGl0aW9uYWxfZWxzZUJlZ2luKEV4cHJlc3Npb24gdGhlbkV4cHJlc3Npb24pIHsKICAgIF9Db25kaXRpb25hbENvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIF9zdGFjay5sYXN0IGFzIF9Db25kaXRpb25hbENvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgY29udGV4dC5fdGhlbkluZm8gPSBfZXhwcmVzc2lvbkVuZCh0aGVuRXhwcmVzc2lvbik7CiAgICBfY3VycmVudCA9IGNvbnRleHQuX2NvbmRpdGlvbkluZm8uaWZGYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgY29uZGl0aW9uYWxfZW5kKAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBlbHNlRXhwcmVzc2lvbikgewogICAgX0NvbmRpdGlvbmFsQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfQ29uZGl0aW9uYWxDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiB0aGVuSW5mbyA9IGNvbnRleHQuX3RoZW5JbmZvOwogICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGVsc2VJbmZvID0gX2V4cHJlc3Npb25FbmQoZWxzZUV4cHJlc3Npb24pOwogICAgX3N0b3JlRXhwcmVzc2lvbkluZm8oCiAgICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uLAogICAgICAgIG5ldyBFeHByZXNzaW9uSW5mbygKICAgICAgICAgICAgX2pvaW4odGhlbkluZm8uYWZ0ZXIsIGVsc2VJbmZvLmFmdGVyKSwKICAgICAgICAgICAgX2pvaW4odGhlbkluZm8uaWZUcnVlLCBlbHNlSW5mby5pZlRydWUpLAogICAgICAgICAgICBfam9pbih0aGVuSW5mby5pZkZhbHNlLCBlbHNlSW5mby5pZkZhbHNlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjb25kaXRpb25hbF90aGVuQmVnaW4oRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBjb25kaXRpb25JbmZvID0gX2V4cHJlc3Npb25FbmQoY29uZGl0aW9uKTsKICAgIF9zdGFjay5hZGQobmV3IF9Db25kaXRpb25hbENvbnRleHQoY29uZGl0aW9uSW5mbykpOwogICAgX2N1cnJlbnQgPSBjb25kaXRpb25JbmZvLmlmVHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZG9TdGF0ZW1lbnRfYm9keUJlZ2luKFN0YXRlbWVudCBkb1N0YXRlbWVudCkgewogICAgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4gaW5mbyA9CiAgICAgICAgX2Fzc2lnbmVkVmFyaWFibGVzLl9nZXRJbmZvRm9yTm9kZShkb1N0YXRlbWVudCk7CiAgICBfQnJhbmNoVGFyZ2V0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgbmV3IF9CcmFuY2hUYXJnZXRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPigpOwogICAgX3N0YWNrLmFkZChjb250ZXh0KTsKICAgIF9jdXJyZW50ID0gX2N1cnJlbnQucmVtb3ZlUHJvbW90ZWRBbGwoaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpOwogICAgX3N0YXRlbWVudFRvQ29udGV4dFtkb1N0YXRlbWVudF0gPSBjb250ZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkb1N0YXRlbWVudF9jb25kaXRpb25CZWdpbigpIHsKICAgIF9CcmFuY2hUYXJnZXRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2subGFzdCBhcyBfQnJhbmNoVGFyZ2V0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IF9qb2luKF9jdXJyZW50LCBjb250ZXh0Ll9jb250aW51ZU1vZGVsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZG9TdGF0ZW1lbnRfZW5kKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICBfQnJhbmNoVGFyZ2V0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfQnJhbmNoVGFyZ2V0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IF9qb2luKF9leHByZXNzaW9uRW5kKGNvbmRpdGlvbikuaWZGYWxzZSwgY29udGV4dC5fYnJlYWtNb2RlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVxdWFsaXR5T3BfZW5kKEV4cHJlc3Npb24gd2hvbGVFeHByZXNzaW9uLCBFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCwKICAgICAge2Jvb2wgbm90RXF1YWwgPSBmYWxzZX0pIHsKICAgIF9CcmFuY2hDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2sucmVtb3ZlTGFzdCgpIGFzIF9CcmFuY2hDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBsaHNJbmZvID0gY29udGV4dC5fY29uZGl0aW9uSW5mbzsKICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiByaHNJbmZvID0gX2dldEV4cHJlc3Npb25JbmZvKHJpZ2h0T3BlcmFuZCk7CiAgICBWYXJpYWJsZSB2YXJpYWJsZTsKICAgIGlmIChsaHNJbmZvIGlzIF9OdWxsSW5mbzxWYXJpYWJsZSwgVHlwZT4gJiYKICAgICAgICByaHNJbmZvIGlzIF9WYXJpYWJsZVJlYWRJbmZvPFZhcmlhYmxlLCBUeXBlPikgewogICAgICB2YXJpYWJsZSA9IHJoc0luZm8uX3ZhcmlhYmxlOwogICAgfSBlbHNlIGlmIChyaHNJbmZvIGlzIF9OdWxsSW5mbzxWYXJpYWJsZSwgVHlwZT4gJiYKICAgICAgICBsaHNJbmZvIGlzIF9WYXJpYWJsZVJlYWRJbmZvPFZhcmlhYmxlLCBUeXBlPikgewogICAgICB2YXJpYWJsZSA9IGxoc0luZm8uX3ZhcmlhYmxlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGV4cHJlc3Npb25JbmZvID0KICAgICAgICBfY3VycmVudC50cnlNYXJrTm9uTnVsbGFibGUodHlwZU9wZXJhdGlvbnMsIHZhcmlhYmxlKTsKICAgIF9zdG9yZUV4cHJlc3Npb25JbmZvKHdob2xlRXhwcmVzc2lvbiwKICAgICAgICBub3RFcXVhbCA/IGV4cHJlc3Npb25JbmZvIDogRXhwcmVzc2lvbkluZm8uaW52ZXJ0KGV4cHJlc3Npb25JbmZvKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVxdWFsaXR5T3BfcmlnaHRCZWdpbihFeHByZXNzaW9uIGxlZnRPcGVyYW5kKSB7CiAgICBfc3RhY2suYWRkKAogICAgICAgIG5ldyBfQnJhbmNoQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4oX2dldEV4cHJlc3Npb25JbmZvKGxlZnRPcGVyYW5kKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmaW5pc2goKSB7CiAgICBhc3NlcnQoX3N0YWNrLmlzRW1wdHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JfYm9keUJlZ2luKFN0YXRlbWVudCBub2RlLCBFeHByZXNzaW9uIGNvbmRpdGlvbikgewogICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGNvbmRpdGlvbkluZm8gPSBjb25kaXRpb24gPT0gbnVsbAogICAgICAgID8gbmV3IEV4cHJlc3Npb25JbmZvKF9jdXJyZW50LCBfY3VycmVudCwgX2N1cnJlbnQuc2V0UmVhY2hhYmxlKGZhbHNlKSkKICAgICAgICA6IF9leHByZXNzaW9uRW5kKGNvbmRpdGlvbik7CiAgICBfV2hpbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBuZXcgX1doaWxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4oY29uZGl0aW9uSW5mbyk7CiAgICBfc3RhY2suYWRkKGNvbnRleHQpOwogICAgaWYgKG5vZGUgIT0gbnVsbCkgewogICAgICBfc3RhdGVtZW50VG9Db250ZXh0W25vZGVdID0gY29udGV4dDsKICAgIH0KICAgIF9jdXJyZW50ID0gY29uZGl0aW9uSW5mby5pZlRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvcl9jb25kaXRpb25CZWdpbihOb2RlIG5vZGUpIHsKICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IGluZm8gPQogICAgICAgIF9hc3NpZ25lZFZhcmlhYmxlcy5fZ2V0SW5mb0Zvck5vZGUobm9kZSk7CiAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yX2VuZCgpIHsKICAgIF9XaGlsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIF9zdGFjay5yZW1vdmVMYXN0KCkgYXMgX1doaWxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICAvLyBUYWlsIG9mIHRoZSBzdGFjazogZmFsc2VDb25kaXRpb24sIGJyZWFrCiAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGJyZWFrU3RhdGUgPSBjb250ZXh0Ll9icmVha01vZGVsOwogICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBmYWxzZUNvbmRpdGlvbiA9IGNvbnRleHQuX2NvbmRpdGlvbkluZm8uaWZGYWxzZTsKCiAgICBfY3VycmVudCA9IF9qb2luKGZhbHNlQ29uZGl0aW9uLCBicmVha1N0YXRlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZm9yX3VwZGF0ZXJCZWdpbigpIHsKICAgIF9XaGlsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIF9zdGFjay5sYXN0IGFzIF9XaGlsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgX2N1cnJlbnQgPSBfam9pbihfY3VycmVudCwgY29udGV4dC5fY29udGludWVNb2RlbCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGZvckVhY2hfYm9keUJlZ2luKE5vZGUgbm9kZSwgVmFyaWFibGUgbG9vcFZhcmlhYmxlLCBUeXBlIHdyaXR0ZW5UeXBlKSB7CiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICBfYXNzaWduZWRWYXJpYWJsZXMuX2dldEluZm9Gb3JOb2RlKG5vZGUpOwogICAgX1NpbXBsZVN0YXRlbWVudENvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIG5ldyBfU2ltcGxlU3RhdGVtZW50Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4oX2N1cnJlbnQpOwogICAgX3N0YWNrLmFkZChjb250ZXh0KTsKICAgIF9jdXJyZW50ID0gX2N1cnJlbnQucmVtb3ZlUHJvbW90ZWRBbGwoaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpOwogICAgaWYgKGxvb3BWYXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIF9jdXJyZW50ID0gX2N1cnJlbnQud3JpdGUobG9vcFZhcmlhYmxlLCB3cml0dGVuVHlwZSwgdHlwZU9wZXJhdGlvbnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBmb3JFYWNoX2VuZCgpIHsKICAgIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2sucmVtb3ZlTGFzdCgpIGFzIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIF9jdXJyZW50ID0gX2pvaW4oX2N1cnJlbnQsIGNvbnRleHQuX3ByZXZpb3VzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZnVuY3Rpb25FeHByZXNzaW9uX2JlZ2luKE5vZGUgbm9kZSkgewogICAgQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mbzxWYXJpYWJsZT4gaW5mbyA9CiAgICAgICAgX2Fzc2lnbmVkVmFyaWFibGVzLl9nZXRJbmZvRm9yTm9kZShub2RlKTsKICAgICsrX2Z1bmN0aW9uTmVzdGluZ0xldmVsOwogICAgX2N1cnJlbnQgPSBfY3VycmVudC5yZW1vdmVQcm9tb3RlZEFsbChjb25zdCBbXSwgaW5mby5fd3JpdHRlbik7CiAgICBfc3RhY2suYWRkKG5ldyBfU2ltcGxlQ29udGV4dChfY3VycmVudCkpOwogICAgX2N1cnJlbnQgPSBfY3VycmVudC5yZW1vdmVQcm9tb3RlZEFsbChfYXNzaWduZWRWYXJpYWJsZXMuX2FueXdoZXJlLl93cml0dGVuLAogICAgICAgIF9hc3NpZ25lZFZhcmlhYmxlcy5fYW55d2hlcmUuX2NhcHR1cmVkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZnVuY3Rpb25FeHByZXNzaW9uX2VuZCgpIHsKICAgIC0tX2Z1bmN0aW9uTmVzdGluZ0xldmVsOwogICAgYXNzZXJ0KF9mdW5jdGlvbk5lc3RpbmdMZXZlbCA+PSAwKTsKICAgIF9TaW1wbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2sucmVtb3ZlTGFzdCgpIGFzIF9TaW1wbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIF9jdXJyZW50ID0gY29udGV4dC5fcHJldmlvdXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUJyZWFrKFN0YXRlbWVudCB0YXJnZXQpIHsKICAgIF9CcmFuY2hUYXJnZXRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0gX3N0YXRlbWVudFRvQ29udGV4dFt0YXJnZXRdOwogICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICBjb250ZXh0Ll9icmVha01vZGVsID0gX2pvaW4oY29udGV4dC5fYnJlYWtNb2RlbCwgX2N1cnJlbnQpOwogICAgfQogICAgX2N1cnJlbnQgPSBfY3VycmVudC5zZXRSZWFjaGFibGUoZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDb250aW51ZShTdGF0ZW1lbnQgdGFyZ2V0KSB7CiAgICBfQnJhbmNoVGFyZ2V0Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9IF9zdGF0ZW1lbnRUb0NvbnRleHRbdGFyZ2V0XTsKICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKICAgICAgY29udGV4dC5fY29udGludWVNb2RlbCA9IF9qb2luKGNvbnRleHQuX2NvbnRpbnVlTW9kZWwsIF9jdXJyZW50KTsKICAgIH0KICAgIF9jdXJyZW50ID0gX2N1cnJlbnQuc2V0UmVhY2hhYmxlKGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXhpdCgpIHsKICAgIF9jdXJyZW50ID0gX2N1cnJlbnQuc2V0UmVhY2hhYmxlKGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaWZOdWxsRXhwcmVzc2lvbl9lbmQoKSB7CiAgICBfU2ltcGxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfU2ltcGxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IF9qb2luKF9jdXJyZW50LCBjb250ZXh0Ll9wcmV2aW91cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGlmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbihFeHByZXNzaW9uIGxlZnRIYW5kU2lkZSkgewogICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGxoc0luZm8gPSBfZ2V0RXhwcmVzc2lvbkluZm8obGVmdEhhbmRTaWRlKTsKICAgIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gcHJvbW90ZWQ7CiAgICBpZiAobGhzSW5mbyBpcyBfVmFyaWFibGVSZWFkSW5mbzxWYXJpYWJsZSwgVHlwZT4pIHsKICAgICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IHByb21vdGlvbkluZm8gPQogICAgICAgICAgX2N1cnJlbnQudHJ5TWFya05vbk51bGxhYmxlKHR5cGVPcGVyYXRpb25zLCBsaHNJbmZvLl92YXJpYWJsZSk7CiAgICAgIF9jdXJyZW50ID0gcHJvbW90aW9uSW5mby5pZkZhbHNlOwogICAgICBwcm9tb3RlZCA9IHByb21vdGlvbkluZm8uaWZUcnVlOwogICAgfSBlbHNlIHsKICAgICAgcHJvbW90ZWQgPSBfY3VycmVudDsKICAgIH0KICAgIF9zdGFjay5hZGQobmV3IF9TaW1wbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPihwcm9tb3RlZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpZlN0YXRlbWVudF9lbHNlQmVnaW4oKSB7CiAgICBfSWZDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2subGFzdCBhcyBfSWZDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIGNvbnRleHQuX2FmdGVyVGhlbiA9IF9jdXJyZW50OwogICAgX2N1cnJlbnQgPSBjb250ZXh0Ll9jb25kaXRpb25JbmZvLmlmRmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGlmU3RhdGVtZW50X2VuZChib29sIGhhc0Vsc2UpIHsKICAgIF9JZkNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIF9zdGFjay5yZW1vdmVMYXN0KCkgYXMgX0lmQ29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGFmdGVyVGhlbjsKICAgIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gYWZ0ZXJFbHNlOwogICAgaWYgKGhhc0Vsc2UpIHsKICAgICAgYWZ0ZXJUaGVuID0gY29udGV4dC5fYWZ0ZXJUaGVuOwogICAgICBhZnRlckVsc2UgPSBfY3VycmVudDsKICAgIH0gZWxzZSB7CiAgICAgIGFmdGVyVGhlbiA9IF9jdXJyZW50OyAvLyBubyBgZWxzZWAsIHNvIGB0aGVuYCBpcyBzdGlsbCBjdXJyZW50CiAgICAgIGFmdGVyRWxzZSA9IGNvbnRleHQuX2NvbmRpdGlvbkluZm8uaWZGYWxzZTsKICAgIH0KICAgIF9jdXJyZW50ID0gX2pvaW4oYWZ0ZXJUaGVuLCBhZnRlckVsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpZlN0YXRlbWVudF90aGVuQmVnaW4oRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBjb25kaXRpb25JbmZvID0gX2V4cHJlc3Npb25FbmQoY29uZGl0aW9uKTsKICAgIF9zdGFjay5hZGQobmV3IF9JZkNvbnRleHQoY29uZGl0aW9uSW5mbykpOwogICAgX2N1cnJlbnQgPSBjb25kaXRpb25JbmZvLmlmVHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaW5pdGlhbGl6ZShWYXJpYWJsZSB2YXJpYWJsZSkgewogICAgX2N1cnJlbnQgPSBfY3VycmVudC5pbml0aWFsaXplKHZhcmlhYmxlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNBc3NpZ25lZChWYXJpYWJsZSB2YXJpYWJsZSkgewogICAgcmV0dXJuIF9jdXJyZW50LmluZm9Gb3IodmFyaWFibGUpLmFzc2lnbmVkOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpc0V4cHJlc3Npb25fZW5kKEV4cHJlc3Npb24gaXNFeHByZXNzaW9uLCBFeHByZXNzaW9uIHN1YkV4cHJlc3Npb24sCiAgICAgIGJvb2wgaXNOb3QsIFR5cGUgdHlwZSkgewogICAgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IHN1YkV4cHJlc3Npb25JbmZvID0KICAgICAgICBfZ2V0RXhwcmVzc2lvbkluZm8oc3ViRXhwcmVzc2lvbik7CiAgICBWYXJpYWJsZSB2YXJpYWJsZTsKICAgIGlmIChzdWJFeHByZXNzaW9uSW5mbyBpcyBfVmFyaWFibGVSZWFkSW5mbzxWYXJpYWJsZSwgVHlwZT4pIHsKICAgICAgdmFyaWFibGUgPSBzdWJFeHByZXNzaW9uSW5mby5fdmFyaWFibGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm47CiAgICB9CiAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gZXhwcmVzc2lvbkluZm8gPQogICAgICAgIF9jdXJyZW50LnRyeVByb21vdGUodHlwZU9wZXJhdGlvbnMsIHZhcmlhYmxlLCB0eXBlKTsKICAgIF9zdG9yZUV4cHJlc3Npb25JbmZvKGlzRXhwcmVzc2lvbiwKICAgICAgICBpc05vdCA/IEV4cHJlc3Npb25JbmZvLmludmVydChleHByZXNzaW9uSW5mbykgOiBleHByZXNzaW9uSW5mbyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ2ljYWxCaW5hcnlPcF9lbmQoRXhwcmVzc2lvbiB3aG9sZUV4cHJlc3Npb24sIEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kLAogICAgICB7QHJlcXVpcmVkIGJvb2wgaXNBbmR9KSB7CiAgICBfQnJhbmNoQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfQnJhbmNoQ29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gcmhzSW5mbyA9IF9leHByZXNzaW9uRW5kKHJpZ2h0T3BlcmFuZCk7CgogICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiB0cnVlUmVzdWx0OwogICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBmYWxzZVJlc3VsdDsKICAgIGlmIChpc0FuZCkgewogICAgICB0cnVlUmVzdWx0ID0gcmhzSW5mby5pZlRydWU7CiAgICAgIGZhbHNlUmVzdWx0ID0gX2pvaW4oY29udGV4dC5fY29uZGl0aW9uSW5mby5pZkZhbHNlLCByaHNJbmZvLmlmRmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgdHJ1ZVJlc3VsdCA9IF9qb2luKGNvbnRleHQuX2NvbmRpdGlvbkluZm8uaWZUcnVlLCByaHNJbmZvLmlmVHJ1ZSk7CiAgICAgIGZhbHNlUmVzdWx0ID0gcmhzSW5mby5pZkZhbHNlOwogICAgfQogICAgX3N0b3JlRXhwcmVzc2lvbkluZm8oCiAgICAgICAgd2hvbGVFeHByZXNzaW9uLAogICAgICAgIG5ldyBFeHByZXNzaW9uSW5mbygKICAgICAgICAgICAgX2pvaW4odHJ1ZVJlc3VsdCwgZmFsc2VSZXN1bHQpLCB0cnVlUmVzdWx0LCBmYWxzZVJlc3VsdCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dpY2FsQmluYXJ5T3BfcmlnaHRCZWdpbihFeHByZXNzaW9uIGxlZnRPcGVyYW5kLAogICAgICB7QHJlcXVpcmVkIGJvb2wgaXNBbmR9KSB7CiAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gY29uZGl0aW9uSW5mbyA9IF9leHByZXNzaW9uRW5kKGxlZnRPcGVyYW5kKTsKICAgIF9zdGFjay5hZGQobmV3IF9CcmFuY2hDb250ZXh0PFZhcmlhYmxlLCBUeXBlPihjb25kaXRpb25JbmZvKSk7CiAgICBfY3VycmVudCA9IGlzQW5kID8gY29uZGl0aW9uSW5mby5pZlRydWUgOiBjb25kaXRpb25JbmZvLmlmRmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGxvZ2ljYWxOb3RfZW5kKEV4cHJlc3Npb24gbm90RXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBvcGVyYW5kKSB7CiAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gY29uZGl0aW9uSW5mbyA9IF9leHByZXNzaW9uRW5kKG9wZXJhbmQpOwogICAgX3N0b3JlRXhwcmVzc2lvbkluZm8obm90RXhwcmVzc2lvbiwgRXhwcmVzc2lvbkluZm8uaW52ZXJ0KGNvbmRpdGlvbkluZm8pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgbm9uTnVsbEFzc2VydF9lbmQoRXhwcmVzc2lvbiBvcGVyYW5kKSB7CiAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gb3BlcmFuZEluZm8gPSBfZ2V0RXhwcmVzc2lvbkluZm8ob3BlcmFuZCk7CiAgICBpZiAob3BlcmFuZEluZm8gaXMgX1ZhcmlhYmxlUmVhZEluZm88VmFyaWFibGUsIFR5cGU+KSB7CiAgICAgIF9jdXJyZW50ID0gX2N1cnJlbnQKICAgICAgICAgIC50cnlNYXJrTm9uTnVsbGFibGUodHlwZU9wZXJhdGlvbnMsIG9wZXJhbmRJbmZvLl92YXJpYWJsZSkKICAgICAgICAgIC5pZlRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG51bGxBd2FyZUFjY2Vzc19lbmQoKSB7CiAgICBfU2ltcGxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfU2ltcGxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IF9qb2luKF9jdXJyZW50LCBjb250ZXh0Ll9wcmV2aW91cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG51bGxBd2FyZUFjY2Vzc19yaWdodEJlZ2luKEV4cHJlc3Npb24gdGFyZ2V0KSB7CiAgICBfc3RhY2suYWRkKG5ldyBfU2ltcGxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4oX2N1cnJlbnQpKTsKICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgewogICAgICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gdGFyZ2V0SW5mbyA9IF9nZXRFeHByZXNzaW9uSW5mbyh0YXJnZXQpOwogICAgICBpZiAodGFyZ2V0SW5mbyBpcyBfVmFyaWFibGVSZWFkSW5mbzxWYXJpYWJsZSwgVHlwZT4pIHsKICAgICAgICBfY3VycmVudCA9IF9jdXJyZW50CiAgICAgICAgICAgIC50cnlNYXJrTm9uTnVsbGFibGUodHlwZU9wZXJhdGlvbnMsIHRhcmdldEluZm8uX3ZhcmlhYmxlKQogICAgICAgICAgICAuaWZUcnVlOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIG51bGxMaXRlcmFsKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgX3N0b3JlRXhwcmVzc2lvbkluZm8oZXhwcmVzc2lvbiwgbmV3IF9OdWxsSW5mbyhfY3VycmVudCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbigKICAgICAgRXhwcmVzc2lvbiBvdXRlckV4cHJlc3Npb24sIEV4cHJlc3Npb24gaW5uZXJFeHByZXNzaW9uKSB7CiAgICBpZiAoaWRlbnRpY2FsKF9leHByZXNzaW9uV2l0aEluZm8sIGlubmVyRXhwcmVzc2lvbikpIHsKICAgICAgX2V4cHJlc3Npb25XaXRoSW5mbyA9IG91dGVyRXhwcmVzc2lvbjsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFR5cGUgcHJvbW90ZWRUeXBlKFZhcmlhYmxlIHZhcmlhYmxlKSB7CiAgICByZXR1cm4gX2N1cnJlbnQuaW5mb0Zvcih2YXJpYWJsZSkucHJvbW90ZWRUeXBlcz8ubGFzdDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc3dpdGNoU3RhdGVtZW50X2JlZ2luQ2FzZShib29sIGhhc0xhYmVsLCBOb2RlIG5vZGUpIHsKICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IGluZm8gPQogICAgICAgIF9hc3NpZ25lZFZhcmlhYmxlcy5fZ2V0SW5mb0Zvck5vZGUobm9kZSk7CiAgICBfU2ltcGxlU3RhdGVtZW50Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLmxhc3QgYXMgX1NpbXBsZVN0YXRlbWVudENvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgaWYgKGhhc0xhYmVsKSB7CiAgICAgIF9jdXJyZW50ID0KICAgICAgICAgIGNvbnRleHQuX3ByZXZpb3VzLnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKICAgIH0gZWxzZSB7CiAgICAgIF9jdXJyZW50ID0gY29udGV4dC5fcHJldmlvdXM7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHN3aXRjaFN0YXRlbWVudF9lbmQoYm9vbCBpc0V4aGF1c3RpdmUpIHsKICAgIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2sucmVtb3ZlTGFzdCgpIGFzIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gYnJlYWtTdGF0ZSA9IGNvbnRleHQuX2JyZWFrTW9kZWw7CgogICAgLy8gSXQgaXMgYWxsb3dlZCB0byAiZmFsbCBvZmYiIHRoZSBlbmQgb2YgYSBzd2l0Y2ggc3RhdGVtZW50LCBzbyBqb2luIHRoZQogICAgLy8gY3VycmVudCBzdGF0ZSB0byBhbnkgYnJlYWtzIHRoYXQgd2VyZSBmb3VuZCBwcmV2aW91c2x5LgogICAgYnJlYWtTdGF0ZSA9IF9qb2luKGJyZWFrU3RhdGUsIF9jdXJyZW50KTsKCiAgICAvLyBBbmQsIGlmIHRoZXJlIGlzIGFuIGltcGxpY2l0IGZhbGwtdGhyb3VnaCBkZWZhdWx0LCBqb2luIGl0IHRvIGFueSBicmVha3MuCiAgICBpZiAoIWlzRXhoYXVzdGl2ZSkgYnJlYWtTdGF0ZSA9IF9qb2luKGJyZWFrU3RhdGUsIGNvbnRleHQuX3ByZXZpb3VzKTsKCiAgICBfY3VycmVudCA9IGJyZWFrU3RhdGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHN3aXRjaFN0YXRlbWVudF9leHByZXNzaW9uRW5kKFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKICAgIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBuZXcgX1NpbXBsZVN0YXRlbWVudENvbnRleHQ8VmFyaWFibGUsIFR5cGU+KF9jdXJyZW50KTsKICAgIF9zdGFjay5hZGQoY29udGV4dCk7CiAgICBfc3RhdGVtZW50VG9Db250ZXh0W3N3aXRjaFN0YXRlbWVudF0gPSBjb250ZXh0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW4oKSB7CiAgICBfc3RhY2suYWRkKG5ldyBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4oX2N1cnJlbnQpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJ5Q2F0Y2hTdGF0ZW1lbnRfYm9keUVuZChOb2RlIGJvZHkpIHsKICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IGluZm8gPQogICAgICAgIF9hc3NpZ25lZFZhcmlhYmxlcy5fZ2V0SW5mb0Zvck5vZGUoYm9keSk7CiAgICBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLmxhc3QgYXMgX1RyeUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBiZWZvcmVCb2R5ID0gY29udGV4dC5fcHJldmlvdXM7CiAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGJlZm9yZUNhdGNoID0KICAgICAgICBiZWZvcmVCb2R5LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKICAgIGNvbnRleHQuX2JlZm9yZUNhdGNoID0gYmVmb3JlQ2F0Y2g7CiAgICBjb250ZXh0Ll9hZnRlckJvZHlBbmRDYXRjaGVzID0gX2N1cnJlbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyeUNhdGNoU3RhdGVtZW50X2NhdGNoQmVnaW4oCiAgICAgIFZhcmlhYmxlIGV4Y2VwdGlvblZhcmlhYmxlLCBWYXJpYWJsZSBzdGFja1RyYWNlVmFyaWFibGUpIHsKICAgIF9UcnlDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICBfc3RhY2subGFzdCBhcyBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IGNvbnRleHQuX2JlZm9yZUNhdGNoOwogICAgaWYgKGV4Y2VwdGlvblZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnQgPSBfY3VycmVudC5pbml0aWFsaXplKGV4Y2VwdGlvblZhcmlhYmxlKTsKICAgIH0KICAgIGlmIChzdGFja1RyYWNlVmFyaWFibGUgIT0gbnVsbCkgewogICAgICBfY3VycmVudCA9IF9jdXJyZW50LmluaXRpYWxpemUoc3RhY2tUcmFjZVZhcmlhYmxlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hFbmQoKSB7CiAgICBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLmxhc3QgYXMgX1RyeUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgY29udGV4dC5fYWZ0ZXJCb2R5QW5kQ2F0Y2hlcyA9CiAgICAgICAgX2pvaW4oY29udGV4dC5fYWZ0ZXJCb2R5QW5kQ2F0Y2hlcywgX2N1cnJlbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB0cnlDYXRjaFN0YXRlbWVudF9lbmQoKSB7CiAgICBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IGNvbnRleHQuX2FmdGVyQm9keUFuZENhdGNoZXM7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyeUZpbmFsbHlTdGF0ZW1lbnRfYm9keUJlZ2luKCkgewogICAgX3N0YWNrLmFkZChuZXcgX1RyeUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+KF9jdXJyZW50KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHRyeUZpbmFsbHlTdGF0ZW1lbnRfZW5kKE5vZGUgZmluYWxseUJsb2NrKSB7CiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICBfYXNzaWduZWRWYXJpYWJsZXMuX2dldEluZm9Gb3JOb2RlKGZpbmFsbHlCbG9jayk7CiAgICBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlc3RyaWN0KAogICAgICAgIHR5cGVPcGVyYXRpb25zLCBjb250ZXh0Ll9hZnRlckJvZHlBbmRDYXRjaGVzLCBpbmZvLl93cml0dGVuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdHJ5RmluYWxseVN0YXRlbWVudF9maW5hbGx5QmVnaW4oTm9kZSBib2R5KSB7CiAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICBfYXNzaWduZWRWYXJpYWJsZXMuX2dldEluZm9Gb3JOb2RlKGJvZHkpOwogICAgX1RyeUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIF9zdGFjay5sYXN0IGFzIF9UcnlDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIGNvbnRleHQuX2FmdGVyQm9keUFuZENhdGNoZXMgPSBfY3VycmVudDsKICAgIF9jdXJyZW50ID0gX2pvaW4oX2N1cnJlbnQsCiAgICAgICAgY29udGV4dC5fcHJldmlvdXMucmVtb3ZlUHJvbW90ZWRBbGwoaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGUgdmFyaWFibGVSZWFkKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVmFyaWFibGUgdmFyaWFibGUpIHsKICAgIF9zdG9yZUV4cHJlc3Npb25JbmZvKGV4cHJlc3Npb24sIG5ldyBfVmFyaWFibGVSZWFkSW5mbyhfY3VycmVudCwgdmFyaWFibGUpKTsKICAgIHJldHVybiBfY3VycmVudC5pbmZvRm9yKHZhcmlhYmxlKS5wcm9tb3RlZFR5cGVzPy5sYXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3aGlsZVN0YXRlbWVudF9ib2R5QmVnaW4oCiAgICAgIFN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBjb25kaXRpb25JbmZvID0gX2V4cHJlc3Npb25FbmQoY29uZGl0aW9uKTsKICAgIF9XaGlsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgIG5ldyBfV2hpbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPihjb25kaXRpb25JbmZvKTsKICAgIF9zdGFjay5hZGQoY29udGV4dCk7CiAgICBfc3RhdGVtZW50VG9Db250ZXh0W3doaWxlU3RhdGVtZW50XSA9IGNvbnRleHQ7CiAgICBfY3VycmVudCA9IGNvbmRpdGlvbkluZm8uaWZUcnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB3aGlsZVN0YXRlbWVudF9jb25kaXRpb25CZWdpbihOb2RlIG5vZGUpIHsKICAgIEFzc2lnbmVkVmFyaWFibGVzTm9kZUluZm88VmFyaWFibGU+IGluZm8gPQogICAgICAgIF9hc3NpZ25lZFZhcmlhYmxlcy5fZ2V0SW5mb0Zvck5vZGUobm9kZSk7CiAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd2hpbGVTdGF0ZW1lbnRfZW5kKCkgewogICAgX1doaWxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgX3N0YWNrLnJlbW92ZUxhc3QoKSBhcyBfV2hpbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgIF9jdXJyZW50ID0gX2pvaW4oY29udGV4dC5fY29uZGl0aW9uSW5mby5pZkZhbHNlLCBjb250ZXh0Ll9icmVha01vZGVsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgd3JpdGUoVmFyaWFibGUgdmFyaWFibGUsIFR5cGUgd3JpdHRlblR5cGUpIHsKICAgIGFzc2VydCgKICAgICAgICBfYXNzaWduZWRWYXJpYWJsZXMuX2FueXdoZXJlLl93cml0dGVuLmNvbnRhaW5zKHZhcmlhYmxlKSwKICAgICAgICAiVmFyaWFibGUgaXMgd3JpdHRlbiB0bywgYnV0IHdhcyBub3QgaW5jbHVkZWQgaW4gIgogICAgICAgICJfdmFyaWFibGVzV3JpdHRlbkFueXdoZXJlOiAkdmFyaWFibGUiKTsKICAgIF9jdXJyZW50ID0gX2N1cnJlbnQud3JpdGUodmFyaWFibGUsIHdyaXR0ZW5UeXBlLCB0eXBlT3BlcmF0aW9ucyk7CiAgfQoKICB2b2lkIF9kdW1wU3RhdGUoKSB7CiAgICBwcmludCgnICBjdXJyZW50OiAkX2N1cnJlbnQnKTsKICAgIHByaW50KCcgIGV4cHJlc3Npb25XaXRoSW5mbzogJF9leHByZXNzaW9uV2l0aEluZm8nKTsKICAgIHByaW50KCcgIGV4cHJlc3Npb25JbmZvOiAkX2V4cHJlc3Npb25JbmZvJyk7CiAgICBwcmludCgnICBzdGFjazonKTsKICAgIGZvciAoX0Zsb3dDb250ZXh0IHN0YWNrRW50cnkgaW4gX3N0YWNrLnJldmVyc2VkKSB7CiAgICAgIHByaW50KCcgICAgJHN0YWNrRW50cnknKTsKICAgIH0KICB9CgogIC8vLyBHZXRzIHRoZSBbRXhwcmVzc2lvbkluZm9dIGFzc29jaWF0ZWQgd2l0aCB0aGUgW2V4cHJlc3Npb25dICh3aGljaCBzaG91bGQKICAvLy8gYmUgdGhlIGxhc3QgZXhwcmVzc2lvbiB0aGF0IHdhcyB0cmF2ZXJzZWQpLiAgSWYgdGhlcmUgaXMgbm8KICAvLy8gW0V4cHJlc3Npb25JbmZvXSBhc3NvY2lhdGVkIHdpdGggdGhlIFtleHByZXNzaW9uXSwgdGhlbiBhIGZyZXNoCiAgLy8vIFtFeHByZXNzaW9uSW5mb10gaXMgY3JlYXRlZCByZWNvcmRpbmcgdGhlIGN1cnJlbnQgZmxvdyBhbmFseXNpcyBzdGF0ZS4KICBFeHByZXNzaW9uSW5mbzxWYXJpYWJsZSwgVHlwZT4gX2V4cHJlc3Npb25FbmQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSA9PgogICAgICBfZ2V0RXhwcmVzc2lvbkluZm8oZXhwcmVzc2lvbikgPz8KICAgICAgbmV3IEV4cHJlc3Npb25JbmZvKF9jdXJyZW50LCBfY3VycmVudCwgX2N1cnJlbnQpOwoKICAvLy8gR2V0cyB0aGUgW0V4cHJlc3Npb25JbmZvXSBhc3NvY2lhdGVkIHdpdGggdGhlIFtleHByZXNzaW9uXSAod2hpY2ggc2hvdWxkCiAgLy8vIGJlIHRoZSBsYXN0IGV4cHJlc3Npb24gdGhhdCB3YXMgdHJhdmVyc2VkKS4gIElmIHRoZXJlIGlzIG5vCiAgLy8vIFtFeHByZXNzaW9uSW5mb10gYXNzb2NpYXRlZCB3aXRoIHRoZSBbZXhwcmVzc2lvbl0sIHRoZW4gYG51bGxgIGlzCiAgLy8vIHJldHVybmVkLgogIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBfZ2V0RXhwcmVzc2lvbkluZm8oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBpZiAoaWRlbnRpY2FsKGV4cHJlc3Npb24sIF9leHByZXNzaW9uV2l0aEluZm8pKSB7CiAgICAgIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiBleHByZXNzaW9uSW5mbyA9IF9leHByZXNzaW9uSW5mbzsKICAgICAgX2V4cHJlc3Npb25JbmZvID0gbnVsbDsKICAgICAgcmV0dXJuIGV4cHJlc3Npb25JbmZvOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IF9qb2luKAogICAgICAgICAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBmaXJzdCwgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBzZWNvbmQpID0+CiAgICAgIEZsb3dNb2RlbC5qb2luKHR5cGVPcGVyYXRpb25zLCBmaXJzdCwgc2Vjb25kKTsKCiAgLy8vIEFzc29jaWF0ZXMgW2V4cHJlc3Npb25dLCB3aGljaCBzaG91bGQgYmUgdGhlIG1vc3QgcmVjZW50bHkgdmlzaXRlZAogIC8vLyBleHByZXNzaW9uLCB3aXRoIHRoZSBnaXZlbiBbZXhwcmVzc2lvbkluZm9dIG9iamVjdCwgYW5kIHVwZGF0ZXMgdGhlCiAgLy8vIGN1cnJlbnQgZmxvdyBtb2RlbCBzdGF0ZSB0byBjb3JyZXNwb25kIHRvIGl0LgogIHZvaWQgX3N0b3JlRXhwcmVzc2lvbkluZm8oCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGV4cHJlc3Npb25JbmZvKSB7CiAgICBfZXhwcmVzc2lvbldpdGhJbmZvID0gZXhwcmVzc2lvbjsKICAgIF9leHByZXNzaW9uSW5mbyA9IGV4cHJlc3Npb25JbmZvOwogICAgX2N1cnJlbnQgPSBleHByZXNzaW9uSW5mby5hZnRlcjsKICB9Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBvYmplY3RzIHJlcHJlc2VudGluZyBjb25zdHJ1Y3RzIGluIHRoZSBEYXJ0IHByb2dyYW1taW5nCi8vLyBsYW5ndWFnZSBmb3Igd2hpY2ggZmxvdyBhbmFseXNpcyBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSB0cmFja2VkLgphYnN0cmFjdCBjbGFzcyBfRmxvd0NvbnRleHQge30KCi8vLyBbX0Zsb3dDb250ZXh0XSByZXByZXNlbnRpbmcgYW4gYGlmYCBzdGF0ZW1lbnQuCmNsYXNzIF9JZkNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGV4dGVuZHMgX0JyYW5jaENvbnRleHQ8VmFyaWFibGUsIFR5cGU+IHsKICAvLy8gRmxvdyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXRlIG9mIHByb2dyYW0gZXhlY3V0aW9uIGFmdGVyIHRoZSBgaWZgCiAgLy8vIHN0YXRlbWVudCBleGVjdXRlcywgaW4gdGhlIGNpcmN1bXN0YW5jZSB3aGVyZSB0aGUgInRoZW4iIGJyYW5jaCBpcyB0YWtlbi4KICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IF9hZnRlclRoZW47CgogIF9JZkNvbnRleHQoRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IGNvbmRpdGlvbkluZm8pCiAgICAgIDogc3VwZXIoY29uZGl0aW9uSW5mbyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdfSWZDb250ZXh0KGNvbmRpdGlvbkluZm86ICRfY29uZGl0aW9uSW5mbywgYWZ0ZXJUaGVuOiAkX2FmdGVyVGhlbiknOwp9CgovLy8gW0V4cHJlc3Npb25JbmZvXSByZXByZXNlbnRpbmcgYSBgbnVsbGAgbGl0ZXJhbC4KY2xhc3MgX051bGxJbmZvPFZhcmlhYmxlLCBUeXBlPiBpbXBsZW1lbnRzIEV4cHJlc3Npb25JbmZvPFZhcmlhYmxlLCBUeXBlPiB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBhZnRlcjsKCiAgX051bGxJbmZvKHRoaXMuYWZ0ZXIpOwoKICBAb3ZlcnJpZGUKICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGdldCBpZkZhbHNlID0+IGFmdGVyOwoKICBAb3ZlcnJpZGUKICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGdldCBpZlRydWUgPT4gYWZ0ZXI7Cn0KCi8vLyBbX0Zsb3dDb250ZXh0XSByZXByZXNlbnRpbmcgYSBsYW5ndWFnZSBjb25zdHJ1Y3QgZm9yIHdoaWNoIGZsb3cgYW5hbHlzaXMKLy8vIG11c3Qgc3RvcmUgYSBmbG93IG1vZGVsIHN0YXRlIHRvIGJlIHJldHJpZXZlZCBsYXRlciwgc3VjaCBhcyBhIGB0cnlgCi8vLyBzdGF0ZW1lbnQsIGZ1bmN0aW9uIGV4cHJlc3Npb24sIG9yICJpZi1udWxsIiAoYD8/YCkgZXhwcmVzc2lvbi4KY2xhc3MgX1NpbXBsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGV4dGVuZHMgX0Zsb3dDb250ZXh0IHsKICAvLy8gVGhlIHN0b3JlZCBzdGF0ZS4gIEZvciBhIGB0cnlgIHN0YXRlbWVudCwgdGhpcyBpcyB0aGUgc3RhdGUgZnJvbSB0aGUKICAvLy8gYmVnaW5uaW5nIG9mIHRoZSBgdHJ5YCBibG9jay4gIEZvciBhIGZ1bmN0aW9uIGV4cHJlc3Npb24sIHRoaXMgaXMgdGhlCiAgLy8vIHN0YXRlIGF0IHRoZSBwb2ludCB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB3YXMgY3JlYXRlZC4gIEZvciBhbiAiaWYtbnVsbCIKICAvLy8gZXhwcmVzc2lvbiwgdGhpcyBpcyB0aGUgc3RhdGUgYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoZSBleHByZXNzaW9uIGJlZm9yZSB0aGUKICAvLy8gYD8/YC4KICBmaW5hbCBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IF9wcmV2aW91czsKCiAgX1NpbXBsZUNvbnRleHQodGhpcy5fcHJldmlvdXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnX1NpbXBsZUNvbnRleHQocHJldmlvdXM6ICRfcHJldmlvdXMpJzsKfQoKLy8vIFtfRmxvd0NvbnRleHRdIHJlcHJlc2VudGluZyBhIGxhbmd1YWdlIGNvbnN0cnVjdCB0aGF0IGNhbiBiZSB0YXJnZXRlZCBieQovLy8gYGJyZWFrYCBvciBgY29udGludWVgIHN0YXRlbWVudHMsIGFuZCBmb3Igd2hpY2ggZmxvdyBhbmFseXNpcyBtdXN0IHN0b3JlIGEKLy8vIGZsb3cgbW9kZWwgc3RhdGUgdG8gYmUgcmV0cmlldmVkIGxhdGVyLiAgRXhhbXBsZXMgaW5jbHVkZSAiZm9yIGVhY2giIGFuZAovLy8gYHN3aXRjaGAgc3RhdGVtZW50cy4KY2xhc3MgX1NpbXBsZVN0YXRlbWVudENvbnRleHQ8VmFyaWFibGUsIFR5cGU+CiAgICBleHRlbmRzIF9CcmFuY2hUYXJnZXRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiB7CiAgLy8vIFRoZSBzdG9yZWQgc3RhdGUuICBGb3IgYSAiZm9yIGVhY2giIHN0YXRlbWVudCwgdGhpcyBpcyB0aGUgc3RhdGUgYWZ0ZXIKICAvLy8gZXZhbHVhdGlvbiBvZiB0aGUgaXRlcmFibGUuICBGb3IgYSBgc3dpdGNoYCBzdGF0ZW1lbnQsIHRoaXMgaXMgdGhlIHN0YXRlCiAgLy8vIGFmdGVyIGV2YWx1YXRpb24gb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uLgogIGZpbmFsIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gX3ByZXZpb3VzOwoKICBfU2ltcGxlU3RhdGVtZW50Q29udGV4dCh0aGlzLl9wcmV2aW91cyk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdfU2ltcGxlU3RhdGVtZW50Q29udGV4dChicmVha01vZGVsOiAkX2JyZWFrTW9kZWwsICcKICAgICAgJ2NvbnRpbnVlTW9kZWw6ICRfY29udGludWVNb2RlbCwgcHJldmlvdXM6ICRfcHJldmlvdXMpJzsKfQoKLy8vIFtfRmxvd0NvbnRleHRdIHJlcHJlc2VudGluZyBhIHRyeSBzdGF0ZW1lbnQuCmNsYXNzIF9UcnlDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBleHRlbmRzIF9TaW1wbGVDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiB7CiAgLy8vIElmIHRoZSBzdGF0ZW1lbnQgaXMgYSAidHJ5L2NhdGNoIiBzdGF0ZW1lbnQsIHRoZSBmbG93IG1vZGVsIHJlcHJlc2VudGluZwogIC8vLyBwcm9ncmFtIHN0YXRlIGF0IHRoZSB0b3Agb2YgYW55IGBjYXRjaGAgYmxvY2suCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBfYmVmb3JlQ2F0Y2g7CgogIC8vLyBJZiB0aGUgc3RhdGVtZW50IGlzIGEgInRyeS9jYXRjaCIgc3RhdGVtZW50LCB0aGUgYWNjdW11bGF0ZWQgZmxvdyBtb2RlbAogIC8vLyByZXByZXNlbnRpbmcgcHJvZ3JhbSBzdGF0ZSBhZnRlciB0aGUgYHRyeWAgYmxvY2sgb3Igb25lIG9mIHRoZSBgY2F0Y2hgCiAgLy8vIGJsb2NrcyBoYXMgZmluaXNoZWQgZXhlY3V0aW5nLiAgSWYgdGhlIHN0YXRlbWVudCBpcyBhICJ0cnkvZmluYWxseSIKICAvLy8gc3RhdGVtZW50LCB0aGUgZmxvdyBtb2RlbCByZXByZXNlbnRpbmcgcHJvZ3JhbSBzdGF0ZSBhZnRlciB0aGUgYHRyeWAgYmxvY2sKICAvLy8gaGFzIGZpbmlzaGVkIGV4ZWN1dGluZy4KICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IF9hZnRlckJvZHlBbmRDYXRjaGVzOwoKICBfVHJ5Q29udGV4dChGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IHByZXZpb3VzKSA6IHN1cGVyKHByZXZpb3VzKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ19UcnlDb250ZXh0KHByZXZpb3VzOiAkX3ByZXZpb3VzLCBiZWZvcmVDYXRjaDogJF9iZWZvcmVDYXRjaCwgJwogICAgICAnYWZ0ZXJCb2R5QW5kQ2F0Y2hlczogJF9hZnRlckJvZHlBbmRDYXRjaGVzKSc7Cn0KCi8vLyBbRXhwcmVzc2lvbkluZm9dIHJlcHJlc2VudGluZyBhbiBleHByZXNzaW9uIHRoYXQgcmVhZHMgdGhlIHZhbHVlIG9mIGEKLy8vIHZhcmlhYmxlLgpjbGFzcyBfVmFyaWFibGVSZWFkSW5mbzxWYXJpYWJsZSwgVHlwZT4KICAgIGltcGxlbWVudHMgRXhwcmVzc2lvbkluZm88VmFyaWFibGUsIFR5cGU+IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGFmdGVyOwoKICAvLy8gVGhlIHZhcmlhYmxlIHRoYXQgaXMgYmVpbmcgcmVhZC4KICBmaW5hbCBWYXJpYWJsZSBfdmFyaWFibGU7CgogIF9WYXJpYWJsZVJlYWRJbmZvKHRoaXMuYWZ0ZXIsIHRoaXMuX3ZhcmlhYmxlKTsKCiAgQG92ZXJyaWRlCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBnZXQgaWZGYWxzZSA9PiBhZnRlcjsKCiAgQG92ZXJyaWRlCiAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBnZXQgaWZUcnVlID0+IGFmdGVyOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnX1ZhcmlhYmxlUmVhZEluZm8oYWZ0ZXI6ICRhZnRlciwgdmFyaWFibGU6ICRfdmFyaWFibGUpJzsKfQoKLy8vIFtfRmxvd0NvbnRleHRdIHJlcHJlc2VudGluZyBhIGB3aGlsZWAgbG9vcCAob3IgYSBDLXN0eWxlIGBmb3JgIGxvb3AsIHdoaWNoCi8vLyBpcyBmdW5jdGlvbmFsbHkgc2ltaWxhcikuCmNsYXNzIF9XaGlsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+CiAgICBleHRlbmRzIF9CcmFuY2hUYXJnZXRDb250ZXh0PFZhcmlh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LzI2QBQRTg0kBgQBDDA2SEABTj8uAVFKARsEAQxCNj8ZNAQBDCc7BAEMLi8yKjQ+LEUoLQQBDCVBKjQlJTkGJjoGBAEMJio0IzcEAQwhKjwtBAEMKTsEAQw0LzoqPCJGBAEMNS8yKjQtH00EAQxAUTsEAQwhOE4sOhkzJQQBDDIvMkoEAQweLD5LBAEMNAxCOzFGBAEWIzkxFzcgBgQBT0JGTUooOAFPQkgQTTZHHh0NEwYEASNQNQFJSjQdTiYmJQQCAUtGHwEzSk9QKAE7HgEMF0wCATRMDCkBGQEMMgEMMQIBTUlEPEtMUFEMLQEiAQw/AgFNT00ZLjNNTzEtASsBDEw/AgExS081KgFOTUpRHjIBRQEMF0c1AgFKDigwDCkBJxwBMQEMMgEMMQEMUQIBTx4kMzY3ASYBDEJJAgFAcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9mbG93X2FuYWx5c2lzL2Zsb3dfYW5hbHlzaXMuZGFydF5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL3BhcnNlci5kYXJ0hwAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgppbXBvcnQgJ3BhcnNlcl9pbXBsLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICdwYXJzZXJfZXJyb3IuZGFydCcgc2hvdyBQYXJzZXJFcnJvcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMvY29kZXMuZGFydCcKICAgIHNob3cgTWVzc2FnZSwgbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbjsKCmV4cG9ydCAnYXNzZXJ0LmRhcnQnIHNob3cgQXNzZXJ0OwoKZXhwb3J0ICdibG9ja19raW5kLmRhcnQnIHNob3cgQmxvY2tLaW5kOwoKZXhwb3J0ICdjbGFzc19tZW1iZXJfcGFyc2VyLmRhcnQnIHNob3cgQ2xhc3NNZW1iZXJQYXJzZXI7CgpleHBvcnQgJ2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0JyBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgpleHBvcnQgJ2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JyBzaG93IElkZW50aWZpZXJDb250ZXh0OwoKZXhwb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKZXhwb3J0ICdkZWNsYXJhdGlvbl9raW5kLmRhcnQnIHNob3cgRGVjbGFyYXRpb25LaW5kOwoKZXhwb3J0ICdtZW1iZXJfa2luZC5kYXJ0JyBzaG93IE1lbWJlcktpbmQ7CgpleHBvcnQgJ3BhcnNlcl9pbXBsLmRhcnQnIHNob3cgUGFyc2VyOwoKZXhwb3J0ICdwYXJzZXJfZXJyb3IuZGFydCcgc2hvdyBQYXJzZXJFcnJvcjsKCmV4cG9ydCAndG9wX2xldmVsX3BhcnNlci5kYXJ0JyBzaG93IFRvcExldmVsUGFyc2VyOwoKZXhwb3J0ICd1dGlsLmRhcnQnIHNob3cgbGVuZ3RoRm9yVG9rZW4sIGxlbmd0aE9mU3Bhbiwgb3B0aW9uYWw7CgpjbGFzcyBFcnJvckNvbGxlY3RpbmdMaXN0ZW5lciBleHRlbmRzIExpc3RlbmVyIHsKICBmaW5hbCBMaXN0PFBhcnNlckVycm9yPiByZWNvdmVyYWJsZUVycm9ycyA9IDxQYXJzZXJFcnJvcj5bXTsKCiAgdm9pZCBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIHN0YXJ0VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICAvLy8gVE9ETyhkYW5ydWJlbCk6IElnbm9yZSB0aGlzIGVycm9yIHVudGlsIHdlIGRlcHJlY2F0ZSBgbmF0aXZlYCBzdXBwb3J0LgogICAgaWYgKG1lc3NhZ2UgPT0gbWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbikgewogICAgICByZXR1cm47CiAgICB9CiAgICByZWNvdmVyYWJsZUVycm9ycwogICAgICAgIC5hZGQobmV3IFBhcnNlckVycm9yLmZyb21Ub2tlbnMoc3RhcnRUb2tlbiwgZW5kVG9rZW4sIG1lc3NhZ2UpKTsKICB9Cn0KCkxpc3Q8UGFyc2VyRXJyb3I+IHBhcnNlKFRva2VuIHRva2VucykgewogIEVycm9yQ29sbGVjdGluZ0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yQ29sbGVjdGluZ0xpc3RlbmVyKCk7CiAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobGlzdGVuZXIpOwogIHBhcnNlci5wYXJzZVVuaXQodG9rZW5zKTsKICByZXR1cm4gbGlzdGVuZXIucmVjb3ZlcmFibGVFcnJvcnM7Cn0KPwBNTj8BJAErASYBJwEtASA5ASIBKQE6AT4BOQEmATUBKwEnAS0BNAFAATE/AR87TzwOBhZJBAIBKEQoHCUCATJwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydF1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL3F1b3RlLmRhcnSl7C8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnF1b3RlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBVbmVzY2FwZUVycm9yTGlzdGVuZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnQnCiAgICBzaG93CiAgICAgICAgJEJBQ0tTTEFTSCwKICAgICAgICAkQlMsCiAgICAgICAgJENMT1NFX0NVUkxZX0JSQUNLRVQsCiAgICAgICAgJENSLAogICAgICAgICRGRiwKICAgICAgICAkTEYsCiAgICAgICAgJE9QRU5fQ1VSTFlfQlJBQ0tFVCwKICAgICAgICAkU1BBQ0UsCiAgICAgICAgJFRBQiwKICAgICAgICAkVlRBQiwKICAgICAgICAkYiwKICAgICAgICAkZiwKICAgICAgICAkbiwKICAgICAgICAkciwKICAgICAgICAkdCwKICAgICAgICAkdSwKICAgICAgICAkdiwKICAgICAgICAkeCwKICAgICAgICBoZXhEaWdpdFZhbHVlLAogICAgICAgIGlzSGV4RGlnaXQ7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvY29kZXMuZGFydCcgYXMgY29kZXM7CgplbnVtIFF1b3RlIHsKICBTaW5nbGUsCiAgRG91YmxlLAogIE11bHRpTGluZVNpbmdsZSwKICBNdWx0aUxpbmVEb3VibGUsCiAgUmF3U2luZ2xlLAogIFJhd0RvdWJsZSwKICBSYXdNdWx0aUxpbmVTaW5nbGUsCiAgUmF3TXVsdGlMaW5lRG91YmxlLAp9CgpRdW90ZSBhbmFseXplUXVvdGUoU3RyaW5nIGZpcnN0KSB7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJyIiIicpKSByZXR1cm4gUXVvdGUuTXVsdGlMaW5lRG91YmxlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCdyIiIiJykpIHJldHVybiBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoIicnJyIpKSByZXR1cm4gUXVvdGUuTXVsdGlMaW5lU2luZ2xlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCJyJycnIikpIHJldHVybiBRdW90ZS5SYXdNdWx0aUxpbmVTaW5nbGU7CiAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJyInKSkgcmV0dXJuIFF1b3RlLkRvdWJsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgnciInKSkgcmV0dXJuIFF1b3RlLlJhd0RvdWJsZTsKICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgiJyIpKSByZXR1cm4gUXVvdGUuU2luZ2xlOwogIGlmIChmaXJzdC5zdGFydHNXaXRoKCJyJyIpKSByZXR1cm4gUXVvdGUuUmF3U2luZ2xlOwogIHJldHVybiB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCInJGZpcnN0JyBpbiBhbmFseXplUXVvdGUiKTsKfQoKLy8gTm90ZTogYmFzZWQgb24gW1N0cmluZ1ZhbGlkYXRvci5xdW90aW5nRnJvbVN0cmluZ10KLy8gKHBrZy9jb21waWxlci9saWIvc3JjL3N0cmluZ192YWxpZGF0b3IuZGFydCkuCmludCBsZW5ndGhPZk9wdGlvbmFsV2hpdGVzcGFjZVByZWZpeChTdHJpbmcgZmlyc3QsIGludCBzdGFydCkgewogIExpc3Q8aW50PiBjb2RlVW5pdHMgPSBmaXJzdC5jb2RlVW5pdHM7CiAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgY29kZVVuaXRzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnQgY29kZSA9IGNvZGVVbml0c1tpXTsKICAgIGlmIChjb2RlID09ICRCQUNLU0xBU0gpIHsKICAgICAgaSsrOwogICAgICBpZiAoaSA8IGNvZGVVbml0cy5sZW5ndGgpIHsKICAgICAgICBjb2RlID0gY29kZVVuaXRzW2ldOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoY29kZSA9PSAkVEFCIHx8IGNvZGUgPT0gJFNQQUNFKSBjb250aW51ZTsKICAgIGlmIChjb2RlID09ICRDUikgewogICAgICBpZiAoaSArIDEgPCBjb2RlVW5pdHMubGVuZ3RoICYmIGNvZGVVbml0c1tpICsgMV0gPT0gJExGKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHJldHVybiBpICsgMTsKICAgIH0KICAgIGlmIChjb2RlID09ICRMRikgewogICAgICByZXR1cm4gaSArIDE7CiAgICB9CiAgICBicmVhazsgLy8gTm90IGEgd2hpdGUtc3BhY2UgY2hhcmFjdGVyLgogIH0KICByZXR1cm4gc3RhcnQ7Cn0KCmludCBmaXJzdFF1b3RlTGVuZ3RoKFN0cmluZyBmaXJzdCwgUXVvdGUgcXVvdGUpIHsKICBzd2l0Y2ggKHF1b3RlKSB7CiAgICBjYXNlIFF1b3RlLlNpbmdsZToKICAgIGNhc2UgUXVvdGUuRG91YmxlOgogICAgICByZXR1cm4gMTsKCiAgICBjYXNlIFF1b3RlLk11bHRpTGluZVNpbmdsZToKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lRG91YmxlOgogICAgICByZXR1cm4gbGVuZ3RoT2ZPcHRpb25hbFdoaXRlc3BhY2VQcmVmaXgoZmlyc3QsIDMpOwoKICAgIGNhc2UgUXVvdGUuUmF3U2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdEb3VibGU6CiAgICAgIHJldHVybiAyOwoKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiBsZW5ndGhPZk9wdGlvbmFsV2hpdGVzcGFjZVByZWZpeChmaXJzdCwgNCk7CiAgfQogIHJldHVybiB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCInJHF1b3RlJyBpbiAgZmlyc3RRdW90ZUxlbmd0aCIpOwp9CgppbnQgbGFzdFF1b3RlTGVuZ3RoKFF1b3RlIHF1b3RlKSB7CiAgc3dpdGNoIChxdW90ZSkgewogICAgY2FzZSBRdW90ZS5TaW5nbGU6CiAgICBjYXNlIFF1b3RlLkRvdWJsZToKICAgIGNhc2UgUXVvdGUuUmF3U2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdEb3VibGU6CiAgICAgIHJldHVybiAxOwoKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5NdWx0aUxpbmVEb3VibGU6CiAgICBjYXNlIFF1b3RlLlJhd011bHRpTGluZVNpbmdsZToKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lRG91YmxlOgogICAgICByZXR1cm4gMzsKICB9CiAgcmV0dXJuIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIickcXVvdGUnIGluIGxhc3RRdW90ZUxlbmd0aCIpOwp9CgpTdHJpbmcgdW5lc2NhcGVGaXJzdFN0cmluZ1BhcnQoU3RyaW5nIGZpcnN0LCBRdW90ZSBxdW90ZSwgT2JqZWN0IGxvY2F0aW9uLAogICAgVW5lc2NhcGVFcnJvckxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgcmV0dXJuIHVuZXNjYXBlKGZpcnN0LnN1YnN0cmluZyhmaXJzdFF1b3RlTGVuZ3RoKGZpcnN0LCBxdW90ZSkpLCBxdW90ZSwKICAgICAgbG9jYXRpb24sIGxpc3RlbmVyKTsKfQoKU3RyaW5nIHVuZXNjYXBlTGFzdFN0cmluZ1BhcnQoU3RyaW5nIGxhc3QsIFF1b3RlIHF1b3RlLCBPYmplY3QgbG9jYXRpb24sCiAgICBib29sIGlzTGFzdFF1b3RlU3ludGhldGljLCBVbmVzY2FwZUVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICBpbnQgZW5kID0gbGFzdC5sZW5ndGggLSAoaXNMYXN0UXVvdGVTeW50aGV0aWMgPyAwIDogbGFzdFF1b3RlTGVuZ3RoKHF1b3RlKSk7CiAgcmV0dXJuIHVuZXNjYXBlKGxhc3Quc3Vic3RyaW5nKDAsIGVuZCksIHF1b3RlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwp9CgpTdHJpbmcgdW5lc2NhcGVTdHJpbmcoCiAgICBTdHJpbmcgc3RyaW5nLCBPYmplY3QgbG9jYXRpb24sIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgewogIFF1b3RlIHF1b3RlID0gYW5hbHl6ZVF1b3RlKHN0cmluZyk7CiAgaW50IHN0YXJ0SW5kZXggPSBmaXJzdFF1b3RlTGVuZ3RoKHN0cmluZywgcXVvdGUpOwogIGludCBlbmRJbmRleCA9IHN0cmluZy5sZW5ndGggLSBsYXN0UXVvdGVMZW5ndGgocXVvdGUpOwogIGlmIChzdGFydEluZGV4ID4gZW5kSW5kZXgpIHsKICAgIC8vIEFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmFsZWQuCiAgICByZXR1cm4gIiI7CiAgfQogIHJldHVybiB1bmVzY2FwZSgKICAgICAgc3RyaW5nLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCksIHF1b3RlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwp9CgpTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIHN0cmluZywgUXVvdGUgcXVvdGUsIE9iamVjdCBsb2NhdGlvbiwKICAgIFVuZXNjYXBlRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgewogIHN3aXRjaCAocXVvdGUpIHsKICAgIGNhc2UgUXVvdGUuU2luZ2xlOgogICAgY2FzZSBRdW90ZS5Eb3VibGU6CiAgICAgIHJldHVybiAhc3RyaW5nLmNvbnRhaW5zKCJcXCIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCBmYWxzZSwgbG9jYXRpb24sIGxpc3RlbmVyKTsKCiAgICBjYXNlIFF1b3RlLk11bHRpTGluZVNpbmdsZToKICAgIGNhc2UgUXVvdGUuTXVsdGlMaW5lRG91YmxlOgogICAgICByZXR1cm4gIXN0cmluZy5jb250YWlucygiXFwiKSAmJiAhc3RyaW5nLmNvbnRhaW5zKCJcciIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCBmYWxzZSwgbG9jYXRpb24sIGxpc3RlbmVyKTsKCiAgICBjYXNlIFF1b3RlLlJhd1NpbmdsZToKICAgIGNhc2UgUXVvdGUuUmF3RG91YmxlOgogICAgICByZXR1cm4gc3RyaW5nOwoKICAgIGNhc2UgUXVvdGUuUmF3TXVsdGlMaW5lU2luZ2xlOgogICAgY2FzZSBRdW90ZS5SYXdNdWx0aUxpbmVEb3VibGU6CiAgICAgIHJldHVybiAhc3RyaW5nLmNvbnRhaW5zKCJcciIpCiAgICAgICAgICA/IHN0cmluZwogICAgICAgICAgOiB1bmVzY2FwZUNvZGVVbml0cyhzdHJpbmcuY29kZVVuaXRzLCB0cnVlLCBsb2NhdGlvbiwgbGlzdGVuZXIpOwogIH0KICByZXR1cm4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIickcXVvdGUnIGluIHVuZXNjYXBlIik7Cn0KCi8vIE5vdGU6IGJhc2VkIG9uCi8vIFtTdHJpbmdWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmddKHBrZy9jb21waWxlci9saWIvc3JjL3N0cmluZ192YWxpZGF0b3IuZGFydCkuClN0cmluZyB1bmVzY2FwZUNvZGVVbml0cyhMaXN0PGludD4gY29kZVVuaXRzLCBib29sIGlzUmF3LCBPYmplY3QgbG9jYXRpb24sCiAgICBVbmVzY2FwZUVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAvLyBDYW4ndCB1c2UgVWludDhMaXN0IG9yIFVpbnQxNkxpc3QgaGVyZSwgdGhlIGNvZGUgdW5pdHMgbWF5IGJlIGxhcmdlci4KICBMaXN0PGludD4gcmVzdWx0ID0gbmV3IExpc3Q8aW50Pihjb2RlVW5pdHMubGVuZ3RoKTsKICBpbnQgcmVzdWx0T2Zmc2V0ID0gMDsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlVW5pdHMubGVuZ3RoOyBpKyspIHsKICAgIGludCBjb2RlID0gY29kZVVuaXRzW2ldOwogICAgaWYgKGNvZGUgPT0gJENSKSB7CiAgICAgIGlmIChpICsgMSA8IGNvZGVVbml0cy5sZW5ndGggJiYgY29kZVVuaXRzW2kgKyAxXSA9PSAkTEYpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgY29kZSA9ICRMRjsKICAgIH0gZWxzZSBpZiAoIWlzUmF3ICYmIGNvZGUgPT0gJEJBQ0tTTEFTSCkgewogICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA9PSArK2kpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICAgICAgICBjb2Rlcy5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsIGxvY2F0aW9uLCBpLCAxKTsKICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgIH0KICAgICAgY29kZSA9IGNvZGVVbml0c1tpXTsKCiAgICAgIC8vLyBgXG5gIGZvciBuZXdsaW5lLCBlcXVpdmFsZW50IHRvIGBceDBBYC4KICAgICAgLy8vIGBccmAgZm9yIGNhcnJpYWdlIHJldHVybiwgZXF1aXZhbGVudCB0byBgXHgwRGAuCiAgICAgIC8vLyBgXGZgIGZvciBmb3JtIGZlZWQsIGVxdWl2YWxlbnQgdG8gYFx4MENgLgogICAgICAvLy8gYFxiYCBmb3IgYmFja3NwYWNlLCBlcXVpdmFsZW50IHRvIGBceDA4YC4KICAgICAgLy8vIGBcdGAgZm9yIHRhYiwgZXF1aXZhbGVudCB0byBgXHgwOWAuCiAgICAgIC8vLyBgXHZgIGZvciB2ZXJ0aWNhbCB0YWIsIGVxdWl2YWxlbnQgdG8gYFx4MEJgLgogICAgICAvLy8gYFx4WFhgIGZvciBoZXggZXNjYXBlLgogICAgICAvLy8gYFx1WFhYWGAgb3IgYFx1e1hYP1g/WD9YP1g/fWAgZm9yIFVuaWNvZGUgaGV4IGVzY2FwZS4KICAgICAgaWYgKGNvZGUgPT0gJG4pIHsKICAgICAgICBjb2RlID0gJExGOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHIpIHsKICAgICAgICBjb2RlID0gJENSOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJGYpIHsKICAgICAgICBjb2RlID0gJEZGOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJGIpIHsKICAgICAgICBjb2RlID0gJEJTOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHQpIHsKICAgICAgICBjb2RlID0gJFRBQjsKICAgICAgfSBlbHNlIGlmIChjb2RlID09ICR2KSB7CiAgICAgICAgY29kZSA9ICRWVEFCOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHgpIHsKICAgICAgICAvLyBFeHBlY3QgZXhhY3RseSAyIGhleCBkaWdpdHMuCiAgICAgICAgaW50IGJlZ2luID0gaTsKICAgICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA8PSBpICsgMikgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihjb2Rlcy5tZXNzYWdlSW52YWxpZEhleEVzY2FwZSwgbG9jYXRpb24sCiAgICAgICAgICAgICAgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgICBjb2RlID0gMDsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewogICAgICAgICAgaW50IGRpZ2l0ID0gY29kZVVuaXRzWysraV07CiAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgICAgICAgICAgICBjb2Rlcy5tZXNzYWdlSW52YWxpZEhleEVzY2FwZSwgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgaGV4RGlnaXRWYWx1ZShkaWdpdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gJHUpIHsKICAgICAgICBpbnQgYmVnaW4gPSBpOwogICAgICAgIGlmIChjb2RlVW5pdHMubGVuZ3RoID09IGkgKyAxKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKGNvZGVzLm1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSwKICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgICBjb2RlID0gY29kZVVuaXRzW2kgKyAxXTsKICAgICAgICBpZiAoY29kZSA9PSAkT1BFTl9DVVJMWV9CUkFDS0VUKSB7CiAgICAgICAgICAvLyBFeHBlY3QgMS02IGhleCBkaWdpdHMgZm9sbG93ZWQgYnkgJ30nLgogICAgICAgICAgaWYgKGNvZGVVbml0cy5sZW5ndGggPT0gKytpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoY29kZXMubWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlLAogICAgICAgICAgICAgICAgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgfQogICAgICAgICAgY29kZSA9IDA7CiAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7IGorKykgewogICAgICAgICAgICBpZiAoY29kZVVuaXRzLmxlbmd0aCA9PSArK2kpIHsKICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKGNvZGVzLm1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZSwKICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGJlZ2luLCBpICsgMSAtIGJlZ2luKTsKICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGRpZ2l0ID0gY29kZVVuaXRzW2ldOwogICAgICAgICAgICBpZiAoaiAhPSAwICYmIGRpZ2l0ID09ICRDTE9TRV9DVVJMWV9CUkFDS0VUKSBicmVhazsKICAgICAgICAgICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0KSkgewogICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuZXNjYXBlRXJyb3IoY29kZXMubWVzc2FnZUludmFsaWRVbmljb2RlRXNjYXBlLAogICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGkgKyAyIC0gYmVnaW4pOwogICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBoZXhEaWdpdFZhbHVlKGRpZ2l0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRXhwZWN0IGV4YWN0bHkgNCBoZXggZGlnaXRzLgogICAgICAgICAgaWYgKGNvZGVVbml0cy5sZW5ndGggPD0gaSArIDQpIHsKICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihjb2Rlcy5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYmVnaW4sIGNvZGVVbml0cy5sZW5ndGggKyAxIC0gYmVnaW4pOwogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGVVbml0cyk7CiAgICAgICAgICB9CiAgICAgICAgICBjb2RlID0gMDsKICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CiAgICAgICAgICAgIGludCBkaWdpdCA9IGNvZGVVbml0c1srK2ldOwogICAgICAgICAgICBpZiAoIWlzSGV4RGlnaXQoZGlnaXQpKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlVW5lc2NhcGVFcnJvcihjb2Rlcy5tZXNzYWdlSW52YWxpZFVuaWNvZGVFc2NhcGUsCiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBiZWdpbiwgaSArIDEgLSBiZWdpbik7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGhleERpZ2l0VmFsdWUoZGlnaXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29kZSA+IDB4MTBGRkZGKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVVbmVzY2FwZUVycm9yKAogICAgICAgICAgICAgIGNvZGVzLm1lc3NhZ2VJbnZhbGlkQ29kZVBvaW50LCBsb2NhdGlvbiwgYmVnaW4sIGkgKyAxIC0gYmVnaW4pOwogICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2Rlcyhjb2RlVW5pdHMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3RoaW5nLCBlc2NhcGVkIGNoYXJhY3RlciBpcyBwYXNzZWQgdGhyb3VnaDsKICAgICAgfQogICAgfQogICAgcmVzdWx0W3Jlc3VsdE9mZnNldCsrXSA9IGNvZGU7CiAgfQogIHJldHVybiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMocmVzdWx0LCAwLCByZXN1bHRPZmZzZXQpOwp9CoEuAE5OPAEVAT4gAUEJFA0eDQ0NHRAODwwMDAwMDAwMFxQBRwENCgoTEw0NFhYCASM9QT1BMjYyNj0CATYxQCkzHR4LIh0PDwgGMhdBDQgUBhcUBisEEAIBMhMXFxABICA5ARoaEAEjIzkEQgIBIxMXFxoaEAEgICMjEARAAgFLJkobAgFJQU9GAgEXRiY0OR8rDwQTSgIBPSYTFxckE0wBICA+E0wBGhoVASMjJBNLBD0CARJRSyZLNhgBLx0XQQ0IEi8lJkA0CBsBMjo0NC43IUAYFB8UHxQfFB8VHxYfKBcpUDQ2ChImJiQqUDgMNQofFylKPjYKISs0KUwxOAwUKCtOMzoOJkAmTjM6DjcMESorTEA4DBQoKCZOMzoONwwKHyhONgoPOQgGIwQ8AgExcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvcXVvdGUuZGFydGJmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL3ZhbHVlX2tpbmQuZGFydIfwLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnc3RhY2tfbGlzdGVuZXIuZGFydCcgc2hvdyBOdWxsVmFsdWU7CgovLy8gW1ZhbHVlS2luZF0gaXMgdXNlZCBpbiBbU3RhY2tMaXN0ZW5lci5jaGVja1N0YXRlXSB0byBkb2N1bWVudCBhbmQgY2hlY2sgdGhlCi8vLyBleHBlY3RlZCB2YWx1ZXMgb2YgdGhlIHN0YWNrLgovLy8KLy8vIEFkZCBuZXcgdmFsdWUga2luZHMgYXMgbmVlZGVkIGZvciBkb2N1bWVudGluZyBhbmQgY2hlY2tpbmcgdGhlIHZhcmlvdXMgc3RhY2sKLy8vIGxpc3RlbmVyIGltcGxlbWVudGF0aW9ucy4KYWJzdHJhY3QgY2xhc3MgVmFsdWVLaW5kIHsKICBjb25zdCBWYWx1ZUtpbmQoKTsKCiAgLy8vIENoZWNrcyB0aGUgW3ZhbHVlXSBhbiByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgb2YgdGhlIGV4cGVjdGVkIGtpbmQuCiAgYm9vbCBjaGVjayhPYmplY3QgdmFsdWUpOwp9CgovLy8gQSBbVmFsdWVLaW5kXSBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgW1RdLCBvcHRpb25hbGx5IHdpdGggYSByZWNvZ25pemVkCi8vLyBbTnVsbFZhbHVlXS4KY2xhc3MgU2luZ2xlVmFsdWVLaW5kPFQ+IGltcGxlbWVudHMgVmFsdWVLaW5kIHsKICBmaW5hbCBOdWxsVmFsdWUgbnVsbFZhbHVlOwoKICBjb25zdCBTaW5nbGVWYWx1ZUtpbmQoW3RoaXMubnVsbFZhbHVlXSk7CgogIEBvdmVycmlkZQogIGJvb2wgY2hlY2soT2JqZWN0IHZhbHVlKSB7CiAgICBpZiAobnVsbFZhbHVlICE9IG51bGwgJiYgdmFsdWUgPT0gbnVsbFZhbHVlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHZhbHVlIGlzIFQ7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAobnVsbFZhbHVlICE9IG51bGwpIHsKICAgICAgcmV0dXJuICckVCBvciAkbnVsbFZhbHVlJzsKICAgIH0KICAgIHJldHVybiAnJFQnOwogIH0KfQoKLy8vIEEgW1ZhbHVlS2luZF0gZm9yIHRoZSB1bmlvbiBvZiBhIGxpc3Qgb2YgW1ZhbHVlS2luZF1zLgpjbGFzcyBVbmlvblZhbHVlS2luZCBpbXBsZW1lbnRzIFZhbHVlS2luZCB7CiAgZmluYWwgTGlzdDxWYWx1ZUtpbmQ+IGtpbmRzOwoKICBjb25zdCBVbmlvblZhbHVlS2luZCh0aGlzLmtpbmRzKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVjayhPYmplY3QgdmFsdWUpIHsKICAgIGZvciAoVmFsdWVLaW5kIGtpbmQgaW4ga2luZHMpIHsKICAgICAgaWYgKGtpbmQuY2hlY2sodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIFN0cmluZyBvciA9ICcnOwogICAgZm9yIChWYWx1ZUtpbmQga2luZCBpbiBraW5kcykgewogICAgICBzYi53cml0ZShvcik7CiAgICAgIHNiLndyaXRlKGtpbmQpOwogICAgICBvciA9ICcgb3IgJzsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKLy8vIEhlbHBlciBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbGlzdCBvZiBbVmFsdWVLaW5kXXMgb2YgdGhlIGdpdmVuIGxlbmd0aAovLy8gW2NvdW50XS4KTGlzdDxWYWx1ZUtpbmQ+IHJlcGVhdGVkS2luZHMoVmFsdWVLaW5kIGtpbmQsIGludCBjb3VudCkgewogIHJldHVybiBuZXcgTGlzdC5nZW5lcmF0ZShjb3VudCwgKF8pID0+IGtpbmQpOwp9CgovLy8gSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSB1bmlvbiBvZiBhIGxpc3Qgb2YgW1ZhbHVlS2luZF1zLgpWYWx1ZUtpbmQgdW5pb25PZktpbmRzKExpc3Q8VmFsdWVLaW5kPiBraW5kcykgewogIHJldHVybiBuZXcgVW5pb25WYWx1ZUtpbmQoa2luZHMpOwp9ClEATk48AS0BUCIEUR4bFQFRHAIBShEwHQErAQwdMxMGFwQBFh0hBhEEAgE7LB8BJAEMHSQfFQgGEgQBFioUJBQWEwYaBAIBSg07MAIBQjAkAgE2cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdmFsdWVfa2luZC5kYXJ0YGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydIx2Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnNjYW5uZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lLCB1dGY4OwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdhYnN0cmFjdF9zY2FubmVyLmRhcnQnCiAgICBzaG93IExhbmd1YWdlVmVyc2lvbkNoYW5nZWQsIFNjYW5uZXJDb25maWd1cmF0aW9uOwoKaW1wb3J0ICdzdHJpbmdfc2Nhbm5lci5kYXJ0JyBzaG93IFN0cmluZ1NjYW5uZXI7CgppbXBvcnQgJ3V0ZjhfYnl0ZXNfc2Nhbm5lci5kYXJ0JyBzaG93IFV0ZjhCeXRlc1NjYW5uZXI7CgppbXBvcnQgJ3JlY292ZXIuZGFydCcgc2hvdyBzY2FubmVyUmVjb3Zlcnk7CgpleHBvcnQgJ2Fic3RyYWN0X3NjYW5uZXIuZGFydCcKICAgIHNob3cgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCwgU2Nhbm5lckNvbmZpZ3VyYXRpb247CgpleHBvcnQgJ3Rva2VuX2ltcGwuZGFydCcKICAgIHNob3cKICAgICAgICBMYW5ndWFnZVZlcnNpb25Ub2tlbiwKICAgICAgICBTdHJpbmdUb2tlbiwKICAgICAgICBpc0JpbmFyeU9wZXJhdG9yLAogICAgICAgIGlzTWludXNPcGVyYXRvciwKICAgICAgICBpc1Rlcm5hcnlPcGVyYXRvciwKICAgICAgICBpc1VuYXJ5T3BlcmF0b3IsCiAgICAgICAgaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3I7CgpleHBvcnQgJ2Vycm9yX3Rva2VuLmRhcnQnIHNob3cgRXJyb3JUb2tlbiwgYnVpbGRVbmV4cGVjdGVkQ2hhcmFjdGVyVG9rZW47CgpleHBvcnQgJ3Rva2VuX2ltcGwuZGFydCcgc2hvdyBMYW5ndWFnZVZlcnNpb25Ub2tlbjsKCmV4cG9ydCAndG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgRU9GX1RPS0VOOwoKZXhwb3J0ICd1dGY4X2J5dGVzX3NjYW5uZXIuZGFydCcgc2hvdyBVdGY4Qnl0ZXNTY2FubmVyOwoKZXhwb3J0ICdzdHJpbmdfc2Nhbm5lci5kYXJ0JyBzaG93IFN0cmluZ1NjYW5uZXI7CgpleHBvcnQgJ3Rva2VuLmRhcnQnIHNob3cgS2V5d29yZCwgVG9rZW47Cgpjb25zdCBpbnQgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyID0gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZTsKCnR5cGVkZWYgVG9rZW4gUmVjb3ZlcihMaXN0PGludD4gYnl0ZXMsIFRva2VuIHRva2VucywgTGlzdDxpbnQ+IGxpbmVTdGFydHMpOwoKYWJzdHJhY3QgY2xhc3MgU2Nhbm5lciB7CiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgW3Rva2VuaXplXS4KICBib29sIGdldCBoYXNFcnJvcnM7CgogIExpc3Q8aW50PiBnZXQgbGluZVN0YXJ0czsKCiAgLy8vIENvbmZpZ3VyZSB3aGljaCB0b2tlbnMgYXJlIHByb2R1Y2VkLgogIHNldCBjb25maWd1cmF0aW9uKFNjYW5uZXJDb25maWd1cmF0aW9uIGNvbmZpZyk7CgogIFRva2VuIHRva2VuaXplKCk7Cn0KCmNsYXNzIFNjYW5uZXJSZXN1bHQgewogIGZpbmFsIFRva2VuIHRva2VuczsKICBmaW5hbCBMaXN0PGludD4gbGluZVN0YXJ0czsKICBmaW5hbCBib29sIGhhc0Vycm9yczsKCiAgU2Nhbm5lclJlc3VsdCh0aGlzLnRva2VucywgdGhpcy5saW5lU3RhcnRzLCB0aGlzLmhhc0Vycm9ycyk7Cn0KCi8vLyBTY2FuL3Rva2VuaXplIHRoZSBnaXZlbiBVVEY4IFtieXRlc10uClNjYW5uZXJSZXN1bHQgc2NhbihMaXN0PGludD4gYnl0ZXMsCiAgICB7U2Nhbm5lckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKICAgIGJvb2wgaW5jbHVkZUNvbW1lbnRzOiBmYWxzZSwKICAgIExhbmd1YWdlVmVyc2lvbkNoYW5nZWQgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZH0pIHsKICBpZiAoYnl0ZXMubGFzdCAhPSAwKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiW2J5dGVzXTogdGhlIGxhc3QgYnl0ZSBtdXN0IGJlIG51bGwuIik7CiAgfQogIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBVdGY4Qnl0ZXNTY2FubmVyKGJ5dGVzLAogICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLAogICAgICBpbmNsdWRlQ29tbWVudHM6IGluY2x1ZGVDb21tZW50cywKICAgICAgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZDogbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCk7CiAgcmV0dXJuIF90b2tlbml6ZUFuZFJlY292ZXIoc2Nhbm5lciwgYnl0ZXM6IGJ5dGVzKTsKfQoKLy8vIFNjYW4vdG9rZW5pemUgdGhlIGdpdmVuIFtzb3VyY2VdLgpTY2FubmVyUmVzdWx0IHNjYW5TdHJpbmcoU3RyaW5nIHNvdXJjZSwKICAgIHtTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAogICAgYm9vbCBpbmNsdWRlQ29tbWVudHM6IGZhbHNlLAogICAgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCBsYW5ndWFnZVZlcnNpb25DaGFuZ2VkfSkgewogIGFzc2VydChzb3VyY2UgIT0gbnVsbCwgJ3NvdXJjZSBtdXN0IG5vdCBiZSBudWxsJyk7CiAgU3RyaW5nU2Nhbm5lciBzY2FubmVyID0gbmV3IFN0cmluZ1NjYW5uZXIoc291cmNlLAogICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLAogICAgICBpbmNsdWRlQ29tbWVudHM6IGluY2x1ZGVDb21tZW50cywKICAgICAgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZDogbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCk7CiAgcmV0dXJuIF90b2tlbml6ZUFuZFJlY292ZXIoc2Nhbm5lciwgc291cmNlOiBzb3VyY2UpOwp9CgpTY2FubmVyUmVzdWx0IF90b2tlbml6ZUFuZFJlY292ZXIoU2Nhbm5lciBzY2FubmVyLAogICAge0xpc3Q8aW50PiBieXRlcywgU3RyaW5nIHNvdXJjZX0pIHsKICBUb2tlbiB0b2tlbnMgPSBzY2FubmVyLnRva2VuaXplKCk7CiAgaWYgKHNjYW5uZXIuaGFzRXJyb3JzKSB7CiAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgYnl0ZXMgPSB1dGY4LmVuY29kZShzb3VyY2UpOwogICAgdG9rZW5zID0gc2Nhbm5lclJlY292ZXJ5KGJ5dGVzLCB0b2tlbnMsIHNjYW5uZXIubGluZVN0YXJ0cyk7CiAgfQogIHJldHVybiBuZXcgU2Nhbm5lclJlc3VsdCh0b2tlbnMsIHNjYW5uZXIubGluZVN0YXJ0cywgc2Nhbm5lci5oYXNFcnJvcnMpOwp9CmsATU4/ASUBQgEgAR83ATEBOAEsAR83ARkJHhUaGRsZIQFKATQBLgE4ATEBKQFJAUwBGTsWARwBKzIBFAIBFhYeGAE/AgEqJCkhNhlFBDAkKDc1AgEmKCkhNjU0JCg3NwIBMyglGzRBBEsCATRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc2Nhbm5lci5kYXJ0WmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy91dGlsL2xpbmsuZGFydJTxLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC51dGlsLmxpbms7CgppbXBvcnQgJ2xpbmtfaW1wbGVtZW50YXRpb24uZGFydCcKICAgIHNob3cgTGlua0J1aWxkZXJJbXBsZW1lbnRhdGlvbiwgTGlua0VudHJ5LCBMaW5rSXRlcmF0b3IsIE1hcHBlZExpbmtJdGVyYWJsZTsKCmNsYXNzIExpbms8VD4gaW1wbGVtZW50cyBJdGVyYWJsZTxUPiB7CiAgVCBnZXQgaGVhZCA9PiB0aHJvdyBuZXcgU3RhdGVFcnJvcigibm8gZWxlbWVudHMiKTsKICBMaW5rPFQ+IGdldCB0YWlsID0+IG51bGw7CgogIGNvbnN0IExpbmsoKTsKCiAgTGluazxUPiBwcmVwZW5kKFQgZWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBMaW5rRW50cnk8VD4oZWxlbWVudCwgdGhpcyk7CiAgfQoKICBJdGVyYXRvcjxUPiBnZXQgaXRlcmF0b3IgPT4gbmV3IExpbmtJdGVyYXRvcjxUPih0aGlzKTsKCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIsIFtzZXBhcmF0ZWRCeV0pIHt9CgogIExpc3Q8VD4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgTGlzdDxUPiByZXN1bHQ7CiAgICBpZiAoIWdyb3dhYmxlKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0PFQ+KHNsb3dMZW5ndGgoKSk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBuZXcgTGlzdDxUPigpOwogICAgICByZXN1bHQubGVuZ3RoID0gc2xvd0xlbmd0aCgpOwogICAgfQogICAgaW50IGkgPSAwOwogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyAhbGluay5pc0VtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIHJlc3VsdFtpKytdID0gbGluay5oZWFkOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBMYXppbHkgbWFwcyBvdmVyIHRoaXMgbGlua2VkIGxpc3QsIHJldHVybmluZyBhbiBbSXRlcmFibGVdLgogIEl0ZXJhYmxlPEs+IG1hcDxLPihLIGZuKFQgaXRlbSkpIHsKICAgIHJldHVybiBuZXcgTWFwcGVkTGlua0l0ZXJhYmxlPFQsIEs+KHRoaXMsIGZuKTsKICB9CgogIC8vLyBJbnZva2VzIGBmbmAgZm9yIGV2ZXJ5IGl0ZW0gaW4gdGhlIGxpbmtlZCBsaXN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzCiAgLy8vIGluIGEgW0xpc3RdLgogIExpc3Q8RT4gbWFwVG9MaXN0PEU+KEUgZm4oVCBpdGVtKSwge2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICBMaXN0PEU+IHJlc3VsdDsKICAgIGlmICghZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gbmV3IExpc3Q8RT4oc2xvd0xlbmd0aCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0PEU+KCk7CiAgICAgIHJlc3VsdC5sZW5ndGggPSBzbG93TGVuZ3RoKCk7CiAgICB9CiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKExpbms8VD4gbGluayA9IHRoaXM7ICFsaW5rLmlzRW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgcmVzdWx0W2krK10gPSBmbihsaW5rLmhlYWQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IGZhbHNlOwoKICBMaW5rPFQ+IHJldmVyc2UoTGluazxUPiB0YWlsKSA9PiB0aGlzOwoKICBMaW5rPFQ+IHJldmVyc2VQcmVwZW5kQWxsKExpbms8VD4gZnJvbSkgewogICAgaWYgKGZyb20uaXNFbXB0eSkgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gdGhpcy5wcmVwZW5kKGZyb20uaGVhZCkucmV2ZXJzZVByZXBlbmRBbGwoZnJvbS50YWlsKTsKICB9CgogIExpbms8VD4gc2tpcChpbnQgbikgewogICAgaWYgKG4gPT0gMCkgcmV0dXJuIHRoaXM7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggJG4gb3V0IG9mIHJhbmdlJyk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKFQgZWxlbWVudCkpIHt9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyEgTGluazxUPikgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG90aGVyLmlzRW1wdHk7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdMaW5rLmhhc2hDb2RlJyk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJbXSI7CgogIGdldCBsZW5ndGggewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ2dldDpsZW5ndGgnKTsKICB9CgogIGludCBzbG93TGVuZ3RoKCkgPT4gMDsKCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBtZXRob2Q/CiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyAhbGluay5pc0VtcHR5OyBsaW5rID0gbGluay50YWlsKSB7CiAgICAgIGlmIChsaW5rLmhlYWQgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZD8KICBUIGdldCBzaW5nbGUgewogICAgaWYgKGlzRW1wdHkpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdObyBlbGVtZW50cycpOwogICAgaWYgKCF0YWlsLmlzRW1wdHkpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdNb3JlIHRoYW4gb25lIGVsZW1lbnQnKTsKICAgIHJldHVybiBoZWFkOwogIH0KCiAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhpcyBtZXRob2Q/CiAgVCBnZXQgZmlyc3QgewogICAgaWYgKGlzRW1wdHkpIHRocm93IG5ldyBTdGF0ZUVycm9yKCdObyBlbGVtZW50cycpOwogICAgcmV0dXJuIGhlYWQ7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIGYgcmV0dXJucyB0cnVlIGZvciBhbGwgZWxlbWVudHMgb2YgdGhpcyBsaXN0LgogIC8vLwogIC8vLyBSZXR1cm5zIHRydWUgZm9yIHRoZSBlbXB0eSBsaXN0LgogIGJvb2wgZXZlcnkoYm9vbCBmKFQgZSkpIHsKICAgIGZvciAoTGluazxUPiBsaW5rID0gdGhpczsgIWxpbmsuaXNFbXB0eTsgbGluayA9IGxpbmsudGFpbCkgewogICAgICBpZiAoIWYobGluay5oZWFkKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLwogIC8vIFVuc3VwcG9ydGVkIEl0ZXJhYmxlPFQ+IG1ldGhvZHMuCiAgLy8KICBib29sIGFueShib29sIGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCdhbnknKTsKICBJdGVyYWJsZTxUPiBjYXN0PFQ+KCkgPT4gX3Vuc3VwcG9ydGVkKCdjYXN0Jyk7CiAgVCBlbGVtZW50QXQoaW50IGkpID0+IF91bnN1cHBvcnRlZCgnZWxlbWVudEF0Jyk7CiAgSXRlcmFibGU8Sz4gZXhwYW5kPEs+KEl0ZXJhYmxlPEs+IGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCdleHBhbmQnKTsKICBUIGZpcnN0V2hlcmUoYm9vbCBmKFQgZSksIHtUIG9yRWxzZSgpfSkgPT4gX3Vuc3VwcG9ydGVkKCdmaXJzdFdoZXJlJyk7CiAgSyBmb2xkPEs+KEsgaW5pdGlhbFZhbHVlLCBLIGNvbWJpbmUoSyB2YWx1ZSwgVCBlbGVtZW50KSkgewogICAgcmV0dXJuIF91bnN1cHBvcnRlZCgnZm9sZCcpOwogIH0KCiAgSXRlcmFibGU8VD4gZm9sbG93ZWRCeShJdGVyYWJsZTxUPiBvdGhlcikgPT4gX3Vuc3VwcG9ydGVkKCdmb2xsb3dlZEJ5Jyk7CiAgVCBnZXQgbGFzdCA9PiBfdW5zdXBwb3J0ZWQoJ2dldDpsYXN0Jyk7CiAgVCBsYXN0V2hlcmUoYm9vbCBmKFQgZSksIHtUIG9yRWxzZSgpfSkgPT4gX3Vuc3VwcG9ydGVkKCdsYXN0V2hlcmUnKTsKICBTdHJpbmcgam9pbihbc2VwYXJhdG9yID0gJyddKSA9PiBfdW5zdXBwb3J0ZWQoJ2pvaW4nKTsKICBUIHJlZHVjZShUIGNvbWJpbmUoVCBhLCBUIGIpKSA9PiBfdW5zdXBwb3J0ZWQoJ3JlZHVjZScpOwogIEl0ZXJhYmxlPFQ+IHJldHlwZTxUPigpID0+IF91bnN1cHBvcnRlZCgncmV0eXBlJyk7CiAgVCBzaW5nbGVXaGVyZShib29sIGYoVCBlKSwge1Qgb3JFbHNlKCl9KSA9PiBfdW5zdXBwb3J0ZWQoJ3NpbmdsZVdoZXJlJyk7CiAgSXRlcmFibGU8VD4gc2tpcFdoaWxlKGJvb2wgZihUIGUpKSA9PiBfdW5zdXBwb3J0ZWQoJ3NraXBXaGlsZScpOwogIEl0ZXJhYmxlPFQ+IHRha2UoaW50IG4pID0+IF91bnN1cHBvcnRlZCgndGFrZScpOwogIEl0ZXJhYmxlPFQ+IHRha2VXaGlsZShib29sIGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCd0YWtlV2hpbGUnKTsKICBTZXQ8VD4gdG9TZXQoKSA9PiBfdW5zdXBwb3J0ZWQoJ3RvU2V0Jyk7CiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gX3Vuc3VwcG9ydGVkKCd3aGVyZVR5cGUnKTsKICBJdGVyYWJsZTxUPiB3aGVyZShib29sIGYoVCBlKSkgPT4gX3Vuc3VwcG9ydGVkKCd3aGVyZScpOwoKICBfdW5zdXBwb3J0ZWQoU3RyaW5nIG1ldGhvZCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IobWV0aG9kKTsKfQoKLy8vIEJ1aWxkZXIgb2JqZWN0IGZvciBjcmVhdGluZyBsaW5rZWQgbGlzdHMgdXNpbmcgW0xpbmtdIG9yIGZpeGVkLWxlbmd0aCBbTGlzdF0KLy8vIG9iamVjdHMuCmFic3RyYWN0IGNsYXNzIExpbmtCdWlsZGVyPFQ+IHsKICBmYWN0b3J5IExpbmtCdWlsZGVyKCkgPSBMaW5rQnVpbGRlckltcGxlbWVudGF0aW9uPFQ+OwoKICAvLy8gUHJlcGVuZHMgYWxsIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSBidWlsZGVyIHRvIFt0YWlsXS4gVGhlIHJlc3VsdGluZyBsaXN0CiAgLy8vIGlzIHJldHVybmVkIGFuZCB0aGUgYnVpbGRlciBpcyBjbGVhcmVkLgogIExpbms8VD4gdG9MaW5rKExpbms8VD4gdGFpbCk7CgogIC8vLyBDcmVhdGVzIGEgbmV3IGZpeGVkIGxlbmd0aCBjb250YWluaW5nIGFsbCBhZGRlZCBlbGVtZW50cy4gVGhlCiAgLy8vIHJlc3VsdGluZyBsaXN0IGlzIHJldHVybmVkIGFuZCB0aGUgYnVpbGRlciBpcyBjbGVhcmVkLgogIExpc3Q8VD4gdG9MaXN0KCk7CgogIC8vLyBBZGRzIHRoZSBlbGVtZW50IFt0XSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGJlaW5nIGJ1aWx0LgogIExpbms8VD4gYWRkTGFzdChUIHQpOwoKICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdCBiZWluZyBidWlsdC4KICBUIGdldCBmaXJzdDsKCiAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBiZWluZyBidWlsdC4KICBmaW5hbCBpbnQgbGVuZ3RoOwoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGxpc3QgYmVpbmcgYnVpbHQgaXMgZW1wdHkuCiAgZmluYWwgYm9vbCBpc0VtcHR5OwoKICAvLy8gUmVtb3ZlcyBhbGwgYWRkZWQgZWxlbWVudHMgYW5kIHJlc2V0cyB0aGUgYnVpbGRlci4KICB2b2lkIGNsZWFyKCk7Cn0KgLYATk48AScBIlEBJzUcARABHywEATkBNgEqFBUqDR4kBg9BHwYTBAFCJTMEAU0TPhQVKg0eJAYPQSMGEwQBHCABKQEsI0EEARgdMwQBJQEcKRoEAUMBHQEPLgQBGQEkIkEtBhIEASQRNkYRBAEkEDYRBAFEBiccQScGEQQBBSYFMDEzR0k9IQQBSypHOTs1S0MzQys7OwFFAgFRDSA4AU8uIAFEPRQBPxgBOQ8BPhQBNxYBORACAS5wYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvbGluay5kYXJ0aGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvY29uc3RydWN0b3JfYnVpbGRlci5kYXJ0rp4vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4va2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IEJvZHlCdWlsZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwvZXhwcmVzc2lvbl9nZW5lcmF0b3JfaGVscGVyLmRhcnQnCiAgICBzaG93IEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdyBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb247CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIsCiAgICAgICAgbWVzc2FnZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0LAogICAgICAgIG1lc3NhZ2VUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZSwKICAgICAgICBub0xlbmd0aDsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdmdW5jdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBDb25zdHJ1Y3RvckJ1aWxkZXIgaW1wbGVtZW50cyBGdW5jdGlvbkJ1aWxkZXIgewogIGludCBnZXQgY2hhck9wZW5QYXJlbk9mZnNldDsKCiAgYm9vbCBoYXNNb3ZlZFN1cGVySW5pdGlhbGl6ZXI7CgogIFN1cGVySW5pdGlhbGl6ZXIgc3VwZXJJbml0aWFsaXplcjsKCiAgUmVkaXJlY3RpbmdJbml0aWFsaXplciByZWRpcmVjdGluZ0luaXRpYWxpemVyOwoKICBUb2tlbiBiZWdpbkluaXRpYWxpemVyczsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JCdWlsZGVyIGdldCBhY3R1YWxPcmlnaW47CgogIENvbnN0cnVjdG9yQnVpbGRlciBnZXQgcGF0Y2hGb3JUZXN0aW5nOwoKICBDb25zdHJ1Y3RvciBnZXQgYWN0dWFsQ29uc3RydWN0b3I7CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yQnVpbGRlciBnZXQgb3JpZ2luOwoKICBib29sIGdldCBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9yOwoKICAvLy8gVGhlIFtDb25zdHJ1Y3Rvcl0gYnVpbHQgYnkgdGhpcyBidWlsZGVyLgogIENvbnN0cnVjdG9yIGdldCBjb25zdHJ1Y3RvcjsKCiAgdm9pZCBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKTsKCiAgdm9pZCBhZGRJbml0aWFsaXplcigKICAgICAgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKTsKCiAgdm9pZCBwcmVwYXJlSW5pdGlhbGl6ZXJzKCk7CgogIC8vLyBJbmZlcnMgdGhlIHR5cGVzIG9mIGFueSB1bnR5cGVkIGluaXRpYWxpemluZyBmb3JtYWxzLgogIHZvaWQgaW5mZXJGb3JtYWxUeXBlcygpOwp9CgpjbGFzcyBDb25zdHJ1Y3RvckJ1aWxkZXJJbXBsIGV4dGVuZHMgRnVuY3Rpb25CdWlsZGVySW1wbAogICAgaW1wbGVtZW50cyBDb25zdHJ1Y3RvckJ1aWxkZXIgewogIGZpbmFsIENvbnN0cnVjdG9yIF9jb25zdHJ1Y3RvcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQ7CgogIEBvdmVycmlkZQogIGJvb2wgaGFzTW92ZWRTdXBlckluaXRpYWxpemVyID0gZmFsc2U7CgogIEBvdmVycmlkZQogIFN1cGVySW5pdGlhbGl6ZXIgc3VwZXJJbml0aWFsaXplcjsKCiAgQG92ZXJyaWRlCiAgUmVkaXJlY3RpbmdJbml0aWFsaXplciByZWRpcmVjdGluZ0luaXRpYWxpemVyOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBiZWdpbkluaXRpYWxpemVyczsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JCdWlsZGVyIGFjdHVhbE9yaWdpbjsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3IgZ2V0IGFjdHVhbENvbnN0cnVjdG9yID0+IF9jb25zdHJ1Y3RvcjsKCiAgQ29uc3RydWN0b3JCdWlsZGVySW1wbCgKICAgICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhLAogICAgICBpbnQgbW9kaWZpZXJzLAogICAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzLAogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHMsCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIHRoaXMuY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIENvbnN0cnVjdG9yIHJlZmVyZW5jZUZyb20sCiAgICAgIFtTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZV0pCiAgICAgIDogX2NvbnN0cnVjdG9yID0gbmV3IENvbnN0cnVjdG9yKG51bGwsCiAgICAgICAgICAgIGZpbGVVcmk6IGNvbXBpbGF0aW9uVW5pdC5maWxlVXJpLAogICAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gc3RhcnRDaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0CiAgICAgICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBjb21waWxhdGlvblVuaXQuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCwKICAgICAgICBzdXBlcihtZXRhZGF0YSwgbW9kaWZpZXJzLCByZXR1cm5UeXBlLCBuYW1lLCB0eXBlVmFyaWFibGVzLCBmb3JtYWxzLAogICAgICAgICAgICBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQsIG5hdGl2ZU1ldGhvZE5hbWUpOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IHJlYWRUYXJnZXQgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCB3cml0ZVRhcmdldCA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IGludm9rZVRhcmdldCA9PiBjb25zdHJ1Y3RvcjsKCiAgQG92ZXJyaWRlCiAgQ29uc3RydWN0b3JCdWlsZGVyIGdldCBvcmlnaW4gPT4gYWN0dWFsT3JpZ2luID8/IHRoaXM7CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yQnVpbGRlciBnZXQgcGF0Y2hGb3JUZXN0aW5nID0+IGRhdGFGb3JUZXN0aW5nPy5wYXRjaEZvclRlc3Rpbmc7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbGFzc0luc3RhbmNlTWVtYmVyID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0cnVjdG9yID0+IHRydWU7CgogIEBvdmVycmlkZQogIEFzeW5jTWFya2VyIGdldCBhc3luY01vZGlmaWVyID0+IEFzeW5jTWFya2VyLlN5bmM7CgogIEBvdmVycmlkZQogIFByb2NlZHVyZUtpbmQgZ2V0IGtpbmQgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvciB7CiAgICByZXR1cm4gaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvckltcGxlbWVudGF0aW9uKF9jb25zdHJ1Y3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJ1aWxkTWVtYmVycygKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgdm9pZCBGdW5jdGlvbihNZW1iZXIsIEJ1aWx0TWVtYmVyS2luZCkgZikgewogICAgTWVtYmVyIG1lbWJlciA9IGJ1aWxkKGxpYnJhcnkpOwogICAgZihtZW1iZXIsIEJ1aWx0TWVtYmVyS2luZC5Db25zdHJ1Y3Rvcik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvciBidWlsZChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcikgewogICAgaWYgKF9jb25zdHJ1Y3Rvci5uYW1lID09IG51bGwpIHsKICAgICAgX2NvbnN0cnVjdG9yLmZ1bmN0aW9uID0gYnVpbGRGdW5jdGlvbihsaWJyYXJ5QnVpbGRlcik7CiAgICAgIF9jb25zdHJ1Y3Rvci5mdW5jdGlvbi5wYXJlbnQgPSBfY29uc3RydWN0b3I7CiAgICAgIF9jb25zdHJ1Y3Rvci5mdW5jdGlvbi5maWxlT2Zmc2V0ID0gY2hhck9wZW5QYXJlbk9mZnNldDsKICAgICAgX2NvbnN0cnVjdG9yLmZ1bmN0aW9uLmZpbGVFbmRPZmZzZXQgPSBfY29uc3RydWN0b3IuZmlsZUVuZE9mZnNldDsKICAgICAgX2NvbnN0cnVjdG9yLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzID0gY29uc3QgPFR5cGVQYXJhbWV0ZXI+W107CiAgICAgIF9jb25zdHJ1Y3Rvci5pc0NvbnN0ID0gaXNDb25zdDsKICAgICAgX2NvbnN0cnVjdG9yLmlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsOwogICAgICBfY29uc3RydWN0b3IubmFtZSA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpOwogICAgfQogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBib29sIG5lZWRzSW5mZXJlbmNlID0gZmFsc2U7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgIGlmIChmb3JtYWwudHlwZSA9PSBudWxsICYmIGZvcm1hbC5pc0luaXRpYWxpemluZ0Zvcm1hbCkgewogICAgICAgICAgZm9ybWFsLnZhcmlhYmxlLnR5cGUgPSBudWxsOwogICAgICAgICAgbmVlZHNJbmZlcmVuY2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmVlZHNJbmZlcmVuY2UpIHsKICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgIGxpYnJhcnkgPT0gbGlicmFyeUJ1aWxkZXIsCiAgICAgICAgICAgICJVbmV4cGVjdGVkIGxpYnJhcnkgYnVpbGRlciAke2xpYnJhcnlCdWlsZGVyfSBmb3IiCiAgICAgICAgICAgICIgY29uc3RydWN0b3IgJHRoaXMgaW4gJHtsaWJyYXJ5fS4iKTsKICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIudHlwZUluZmVyZW5jZUVuZ2luZS50b0JlSW5mZXJyZWRbX2NvbnN0cnVjdG9yXSA9CiAgICAgICAgICAgIHRoaXM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfY29uc3RydWN0b3I7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVyRm9ybWFsVHlwZXMoKSB7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgIGlmIChmb3JtYWwudHlwZSA9PSBudWxsICYmIGZvcm1hbC5pc0luaXRpYWxpemluZ0Zvcm1hbCkgewogICAgICAgICAgZm9ybWFsLmZpbmFsaXplSW5pdGlhbGl6aW5nRm9ybWFsKGNsYXNzQnVpbGRlcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIHN1cGVyLmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKGxpYnJhcnksIGNvcmVUeXBlcyk7CgogICAgLy8gRm9yIG1vZHVsYXIgY29tcGlsYXRpb24gcHVycG9zZXMgd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycwogICAgLy8gZm9yIGNvbnN0IGNvbnN0cnVjdG9ycyBpbnRvIHRoZSBvdXRsaW5lLgogICAgaWYgKGlzQ29uc3QgJiYgYmVnaW5Jbml0aWFsaXplcnMgIT0gbnVsbCkgewogICAgICBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyID0gcGFyZW50OwogICAgICBCb2R5QnVpbGRlciBib2R5QnVpbGRlciA9IGxpYnJhcnkubG9hZGVyCiAgICAgICAgICAuY3JlYXRlQm9keUJ1aWxkZXJGb3JPdXRsaW5lRXhwcmVzc2lvbigKICAgICAgICAgICAgICBsaWJyYXJ5LCBjbGFzc0J1aWxkZXIsIHRoaXMsIGNsYXNzQnVpbGRlci5zY29wZSwgZmlsZVVyaSk7CiAgICAgIGJvZHlCdWlsZGVyLmNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5yZXF1aXJlZDsKICAgICAgYm9keUJ1aWxkZXIucGFyc2VJbml0aWFsaXplcnMoYmVnaW5Jbml0aWFsaXplcnMpOwogICAgICBib2R5QnVpbGRlci5yZXNvbHZlUmVkaXJlY3RpbmdGYWN0b3J5VGFyZ2V0cygpOwogICAgfQogICAgYmVnaW5Jbml0aWFsaXplcnMgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25Ob2RlIGJ1aWxkRnVuY3Rpb24oU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIMKnOS4zIHRoZSByZXR1cm4gdHlwZSBvZiBhIGNvbnN0cnVjdG9yCiAgICAvLyBmdW5jdGlvbiBpcyBpdHMgZW5jbG9zaW5nIGNsYXNzLgogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uTm9kZSA9IHN1cGVyLmJ1aWxkRnVuY3Rpb24obGlicmFyeSk7CiAgICBDbGFzc0J1aWxkZXIgZW5jbG9zaW5nQ2xhc3NCdWlsZGVyID0gcGFyZW50OwogICAgQ2xhc3MgZW5jbG9zaW5nQ2xhc3MgPSBlbmNsb3NpbmdDbGFzc0J1aWxkZXIuY2xzOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVBhcmFtZXRlclR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICB0eXBlUGFyYW1ldGVyVHlwZXMuYWRkKAogICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLndpdGhEZWZhdWx0TnVsbGFiaWxpdHlGb3JMaWJyYXJ5KAogICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIsIGxpYnJhcnkubGlicmFyeSkpOwogICAgfQogICAgZnVuY3Rpb25Ob2RlLnJldHVyblR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBlbmNsb3NpbmdDbGFzcywgbGlicmFyeS5ub25OdWxsYWJsZSwgdHlwZVBhcmFtZXRlclR5cGVzKTsKICAgIHJldHVybiBmdW5jdGlvbk5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdHJ1Y3RvciBnZXQgY29uc3RydWN0b3IgPT4gaXNQYXRjaCA/IG9yaWdpbi5jb25zdHJ1Y3RvciA6IF9jb25zdHJ1Y3RvcjsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCBtZW1iZXIgPT4gY29uc3RydWN0b3I7CgogIEBvdmVycmlkZQogIHZvaWQgaW5qZWN0SW52YWxpZEluaXRpYWxpemVyKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlcikgewogICAgTGlzdDxJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzID0gX2NvbnN0cnVjdG9yLmluaXRpYWxpemVyczsKICAgIEluaXRpYWxpemVyIGxhc3RJbml0aWFsaXplciA9IGluaXRpYWxpemVycy5yZW1vdmVMYXN0KCk7CiAgICBhc3NlcnQobGFzdEluaXRpYWxpemVyID09IHN1cGVySW5pdGlhbGl6ZXIgfHwKICAgICAgICBsYXN0SW5pdGlhbGl6ZXIgPT0gcmVkaXJlY3RpbmdJbml0aWFsaXplcik7CiAgICBJbml0aWFsaXplciBlcnJvciA9IGhlbHBlci5idWlsZEludmFsaWRJbml0aWFsaXplcigKICAgICAgICBoZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKSk7CiAgICBpbml0aWFsaXplcnMuYWRkKGVycm9yLi5wYXJlbnQgPSBfY29uc3RydWN0b3IpOwogICAgaW5pdGlhbGl6ZXJzLmFkZChsYXN0SW5pdGlhbGl6ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRJbml0aWFsaXplcigKICAgICAgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyKSB7CiAgICBMaXN0PEluaXRpYWxpemVyPiBpbml0aWFsaXplcnMgPSBfY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzOwogICAgaWYgKGluaXRpYWxpemVyIGlzIFN1cGVySW5pdGlhbGl6ZXIpIHsKICAgICAgaWYgKHN1cGVySW5pdGlhbGl6ZXIgIT0gbnVsbCB8fCByZWRpcmVjdGluZ0luaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIobWVzc2FnZU1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplciwKICAgICAgICAgICAgaW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaGVscGVyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0aWFsaXplcnMuYWRkKGluaXRpYWxpemVyLi5wYXJlbnQgPSBfY29uc3RydWN0b3IpOwogICAgICAgIHN1cGVySW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKICAgICAgfQogICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBSZWRpcmVjdGluZ0luaXRpYWxpemVyKSB7CiAgICAgIGlmIChzdXBlckluaXRpYWxpemVyICE9IG51bGwgfHwgcmVkaXJlY3RpbmdJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgaW5qZWN0SW52YWxpZEluaXRpYWxpemVyKG1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXIsCiAgICAgICAgICAgIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsIGhlbHBlcik7CiAgICAgIH0gZWxzZSBpZiAoX2NvbnN0cnVjdG9yLmluaXRpYWxpemVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgSW5pdGlhbGl6ZXIgZmlyc3QgPSBfY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmZpcnN0OwogICAgICAgIEluaXRpYWxpemVyIGVycm9yID0gaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZSwgZmlyc3QuZmlsZU9mZnNldCwgbm9MZW5ndGgpKTsKICAgICAgICBpbml0aWFsaXplcnMuYWRkKGVycm9yLi5wYXJlbnQgPSBfY29uc3RydWN0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIuLnBhcmVudCA9IF9jb25zdHJ1Y3Rvcik7CiAgICAgICAgcmVkaXJlY3RpbmdJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmUsIGluaXRpYWxpemVyLmZpbGVPZmZzZXQsIGhlbHBlcik7CiAgICB9IGVsc2UgaWYgKHN1cGVySW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpbmplY3RJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBtZXNzYWdlU3VwZXJJbml0aWFsaXplck5vdExhc3QsIHN1cGVySW5pdGlhbGl6ZXIuZmlsZU9mZnNldCwgaGVscGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIuLnBhcmVudCA9IF9jb25zdHJ1Y3Rvcik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZmluaXNoUGF0Y2goKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybiAwOwoKICAgIC8vIFRPRE8oYWhlKTogcmVzdG9yZSBmaWxlLW9mZnNldCBvbmNlIHdlIHRyYWNrIGJvdGggb3JpZ2luIGFuZCBwYXRjaCBmaWxlCiAgICAvLyBVUklzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMxNTc5CiAgICBvcmlnaW4uY29uc3RydWN0b3IuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICBvcmlnaW4uY29uc3RydWN0b3Iuc3RhcnRGaWxlT2Zmc2V0ID0gX2NvbnN0cnVjdG9yLnN0YXJ0RmlsZU9mZnNldDsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5maWxlT2Zmc2V0ID0gX2NvbnN0cnVjdG9yLmZpbGVPZmZzZXQ7CiAgICBvcmlnaW4uY29uc3RydWN0b3IuZmlsZUVuZE9mZnNldCA9IF9jb25zdHJ1Y3Rvci5maWxlRW5kT2Zmc2V0OwogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmFubm90YXRpb25zCiAgICAgICAgLmZvckVhY2goKG0pID0+IG0uZmlsZU9mZnNldCA9IF9jb25zdHJ1Y3Rvci5maWxlT2Zmc2V0KTsKCiAgICBvcmlnaW4uY29uc3RydWN0b3IuaXNFeHRlcm5hbCA9IF9jb25zdHJ1Y3Rvci5pc0V4dGVybmFsOwogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmZ1bmN0aW9uID0gX2NvbnN0cnVjdG9yLmZ1bmN0aW9uOwogICAgb3JpZ2luLmNvbnN0cnVjdG9yLmZ1bmN0aW9uLnBhcmVudCA9IG9yaWdpbi5jb25zdHJ1Y3RvcjsKICAgIG9yaWdpbi5jb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMgPSBfY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzOwogICAgc2V0UGFyZW50cyhvcmlnaW4uY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLCBvcmlnaW4uY29uc3RydWN0b3IpOwogICAgcmV0dXJuIDE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlY29tZU5hdGl2ZShMb2FkZXIgbG9hZGVyKSB7CiAgICBfY29uc3RydWN0b3IuaXNFeHRlcm5hbCA9IHRydWU7CiAgICBzdXBlci5iZWNvbWVOYXRpdmUobG9hZGVyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaChCdWlsZGVyIHBhdGNoKSB7CiAgICBpZiAocGF0Y2ggaXMgQ29uc3RydWN0b3JCdWlsZGVySW1wbCkgewogICAgICBpZiAoY2hlY2tQYXRjaChwYXRjaCkpIHsKICAgICAgICBwYXRjaC5hY3R1YWxPcmlnaW4gPSB0aGlzOwogICAgICAgIGRhdGFGb3JUZXN0aW5nPy5wYXRjaEZvclRlc3RpbmcgPSBwYXRjaDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0UGF0Y2hNaXNtYXRjaChwYXRjaCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByZXBhcmVJbml0aWFsaXplcnMoKSB7CiAgICAvLyBGb3IgY29uc3QgY29uc3RydWN0b3JzIHdlIHBhcnNlIGluaXRpYWxpemVycyBhbHJlYWR5IGF0IHRoZSBvdXRsaW5pbmcKICAgIC8vIHN0YWdlLCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBtYWtlIGJvZHkgYnVpbGRpbmcgc3RhZ2Ugc2tpcCBpbml0aWFsaXplcgogICAgLy8gcGFyc2luZywgc28gd2Ugc2ltcGx5IGNsZWFyIHBhcnNlZCBpbml0aWFsaXplcnMgYW5kIHJlYnVpbGQgdGhlbQogICAgLy8gYWdhaW4uCiAgICAvLyBGb3Igd2hlbiBkb2luZyBhbiBleHBlcmltZW50YWwgaW5jcmVtZW50YWwgY29tcGlsYXRpb24gdGhleSBhcmUgYWxzbwogICAgLy8gcG90ZW50aWFsbHkgZG9uZSBtb3JlIHRoYW4gb25jZSAoYmVjYXVzZSBpdCByZWJ1aWxkcyB0aGUgYm9kaWVzIG9mIGFuIG9sZAogICAgLy8gY29tcGlsZSksIGFuZCBzbyB3ZSBhbHNvIGNsZWFyIHRoZW0uCiAgICAvLyBOb3RlOiB0aGlzIG1ldGhvZCBjbGVhcnMgYm90aCBpbml0aWFsaXplcnMgZnJvbSB0aGUgdGFyZ2V0IEtlcm5lbCBub2RlCiAgICAvLyBhbmQgaW50ZXJuYWwgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHBhcnNpbmcgaW5pdGlhbGl6ZXJzLgogICAgX2NvbnN0cnVjdG9yLmluaXRpYWxpemVycy5sZW5ndGggPSAwOwogICAgcmVkaXJlY3RpbmdJbml0aWFsaXplciA9IG51bGw7CiAgICBzdXBlckluaXRpYWxpemVyID0gbnVsbDsKICAgIGhhc01vdmVkU3VwZXJJbml0aWFsaXplciA9IGZhbHNlOwogIH0KfQqBbQBOTjwBIgFIASIpATgBNwE0JAEnOwElARoJETIoKBIBSgEXHSggHx4gHCUBPx8BIQElATEBGwEMJwEqASUBDCEBLwEvHwEhSgEXQgEeATwbAgE5JCIBDCEBDCkBDCUBDDEBDBsBDCMBDDUBGiYVHhMvLCwbFiAZISEtLjEuJCpNTTwBDCEBDCIBDCoBDDkBDE0BDDEBDCsBDCIBDDUBDCIBDDBLBAEMFUokLAQBDDslPTM+SEYmLEIGGyM3QichCggcECc/Mk8SCAYZBAEMHBs3QjsKCAYEAQxONwFIMDAqLzJJPjg2Bh4EAQw9TCg+MTY+RUYeQjAGMUIZBAEMTgEMJAEMIUtAPTI0OD00JwQBDBdDQCtISy0PPigIOEhLLTk9UEo4Dz4uCDEgSysgUA08BgQBDBYcAU8/Kkc9QyNBAT05PUFFDgQBDCUkIAQBDCMrHyMxCA0iBgQBDB9NUEgOTFEsTkAqIx0mBAIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NvbnN0cnVjdG9yX2J1aWxkZXIuZGFydGhmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydIkaLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnOwppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIERlY2xhcmF0aW9uQnVpbGRlciBpbXBsZW1lbnRzIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgewogIFNjb3BlIGdldCBzY29wZTsKCiAgU2NvcGVCdWlsZGVyIGdldCBzY29wZUJ1aWxkZXI7CgogIExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5OwoKICAvLy8gTG9va3VwIGEgbWVtYmVyIGFjY2Vzc2VkIHN0YXRpY2FsbHkgdGhyb3VnaCB0aGlzIGRlY2xhcmF0aW9uLgogIEJ1aWxkZXIgZmluZFN0YXRpY0J1aWxkZXIoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmksIExpYnJhcnlCdWlsZGVyIGFjY2Vzc2luZ0xpYnJhcnksCiAgICAgIHtib29sIGlzU2V0dGVyOiBmYWxzZX0pOwoKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KTsKCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgYHRoaXNgIGluIGFuIGluc3RhbmNlIG9mIHRoaXMgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFRoaXMgaXMgbm9uLW51bGwgZm9yIGNsYXNzIGFuZCBtaXhpbiBkZWNsYXJhdGlvbnMgYW5kIGBudWxsYCBmb3IKICAvLy8gZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucy4KICBJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZTsKCiAgLy8vIExvb2t1cHMgdGhlIG1lbWJlciBbbmFtZV0gZGVjbGFyZWQgaW4gdGhpcyBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gSWYgW3NldHRlcl0gaXMgYHRydWVgIHRoZSBzb3VnaHQgbWVtYmVyIGlzIGEgc2V0dGVyIG9yIGFzc2lnbmFibGUgZmllbGQuCiAgLy8vIElmIFtyZXF1aXJlZF0gaXMgYHRydWVgIGFuZCBubyBtZW1iZXIgaXMgZm91bmQgYW4gaW50ZXJuYWwgcHJvYmxlbSBpcwogIC8vLyByZXBvcnRlZC4KICBCdWlsZGVyIGxvb2t1cExvY2FsTWVtYmVyKFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlLCBib29sIHJlcXVpcmVkOiBmYWxzZX0pOwp9CgphYnN0cmFjdCBjbGFzcyBEZWNsYXJhdGlvbkJ1aWxkZXJJbXBsIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlckltcGwKICAgIGltcGxlbWVudHMgRGVjbGFyYXRpb25CdWlsZGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTY29wZSBzY29wZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU2NvcGVCdWlsZGVyIHNjb3BlQnVpbGRlcjsKCiAgRGVjbGFyYXRpb25CdWlsZGVySW1wbChMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsIGludCBtb2RpZmllcnMsCiAgICAgIFN0cmluZyBuYW1lLCBMaWJyYXJ5QnVpbGRlciBwYXJlbnQsIGludCBjaGFyT2Zmc2V0LCB0aGlzLnNjb3BlKQogICAgICA6IHNjb3BlQnVpbGRlciA9IG5ldyBTY29wZUJ1aWxkZXIoc2NvcGUpLAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIG5hbWUsIHBhcmVudCwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIExpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5IHsKICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBwYXJlbnQ7CiAgICByZXR1cm4gbGlicmFyeS5wYXJ0T2ZMaWJyYXJ5ID8/IGxpYnJhcnk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZSwgY2hhck9mZnNldCwgbGVuZ3RoLCBmaWxlVXJpLAogICAgICAgIHdhc0hhbmRsZWQ6IHdhc0hhbmRsZWQsIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KfQpKAE5OPAEiASIBGxgBFx8gKAFGEwEhAR4BRB1RHwE/PwFFBkceHgE+Bk9MECkzAgFJJAwVAQwjAUhGMD4BDB8lLQQBDD9APTMEAgE8cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0YWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZW51bV9idWlsZGVyLmRhcnS62y8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmVudW1fYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIENsYXNzLAogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBEaXJlY3RQcm9wZXJ0eUdldCwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgSW50TGl0ZXJhbCwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpc3RMaXRlcmFsLAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJldHVyblN0YXRlbWVudCwKICAgICAgICBTdGF0aWNHZXQsCiAgICAgICAgU3RyaW5nTGl0ZXJhbCwKICAgICAgICBTdXBlckluaXRpYWxpemVyLAogICAgICAgIFRoaXNFeHByZXNzaW9uLAogICAgICAgIFZhcmlhYmxlR2V0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9yZWZlcmVuY2VfZnJvbV9pbmRleC5kYXJ0JyBzaG93IEluZGV4ZWRDbGFzczsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBtZXNzYWdlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdCwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nOwoKaW1wb3J0ICcuLi9rZXJuZWwvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnQnOwoKaW1wb3J0ICcuLi9tb2RpZmllci5kYXJ0JwogICAgc2hvdwogICAgICAgIGNvbnN0TWFzaywKICAgICAgICBmaW5hbE1hc2ssCiAgICAgICAgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIGluaXRpYWxpemluZ0Zvcm1hbE1hc2ssCiAgICAgICAgc3RhdGljTWFzazsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCc7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2NvbnN0cnVjdG9yX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnZmllbGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21lbWJlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21ldGFkYXRhX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbmFtZWRfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAncHJvY2VkdXJlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwoKY2xhc3MgRW51bUJ1aWxkZXIgZXh0ZW5kcyBTb3VyY2VDbGFzc0J1aWxkZXIgewogIGZpbmFsIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZW51bUNvbnN0YW50SW5mb3M7CgogIGZpbmFsIE5hbWVkVHlwZUJ1aWxkZXIgaW50VHlwZTsKCiAgZmluYWwgTmFtZWRUeXBlQnVpbGRlciBzdHJpbmdUeXBlOwoKICBmaW5hbCBOYW1lZFR5cGVCdWlsZGVyIG9iamVjdFR5cGU7CgogIGZpbmFsIE5hbWVkVHlwZUJ1aWxkZXIgbGlzdFR5cGU7CgogIEVudW1CdWlsZGVyLmludGVybmFsKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBTY29wZSBzY29wZSwKICAgICAgQ29uc3RydWN0b3JTY29wZSBjb25zdHJ1Y3RvcnMsCiAgICAgIENsYXNzIGNscywKICAgICAgdGhpcy5lbnVtQ29uc3RhbnRJbmZvcywKICAgICAgdGhpcy5pbnRUeXBlLAogICAgICB0aGlzLmxpc3RUeXBlLAogICAgICB0aGlzLm9iamVjdFR5cGUsCiAgICAgIHRoaXMuc3RyaW5nVHlwZSwKICAgICAgTGlicmFyeUJ1aWxkZXIgcGFyZW50LAogICAgICBpbnQgc3RhcnRDaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIENsYXNzIHJlZmVyZW5jZXNGcm9tLAogICAgICBJbmRleGVkQ2xhc3MgcmVmZXJlbmNlc0Zyb21JbmRleGVkKQogICAgICA6IHN1cGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgc2NvcGUsCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgcGFyZW50LAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICAgIHJlZmVyZW5jZXNGcm9tLAogICAgICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWQsCiAgICAgICAgICAgIGNsczogY2xzKTsKCiAgZmFjdG9yeSBFbnVtQnVpbGRlcigKICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8RW51bUNvbnN0YW50SW5mbz4gZW51bUNvbnN0YW50SW5mb3MsCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgICAgaW50IHN0YXJ0Q2hhck9mZnNldCwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBDbGFzcyByZWZlcmVuY2VzRnJvbSwKICAgICAgSW5kZXhlZENsYXNzIHJlZmVyZW5jZXNGcm9tSW5kZXhlZCkgewogICAgYXNzZXJ0KGVudW1Db25zdGFudEluZm9zID09IG51bGwgfHwgZW51bUNvbnN0YW50SW5mb3MuaXNOb3RFbXB0eSk7CiAgICAvLyBUT0RPKGFoZSk6IFRoZXNlIHR5cGVzIHNob3VsZG4ndCBiZSBsb29rZWQgdXAgaW4gc2NvcGUsIHRoZXkgY29tZQogICAgLy8gZGlyZWN0bHkgZnJvbSBkYXJ0OmNvcmUuCiAgICBUeXBlQnVpbGRlciBpbnRUeXBlID0KICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcigiaW50IiwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSwgbnVsbCk7CiAgICBUeXBlQnVpbGRlciBzdHJpbmdUeXBlID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoCiAgICAgICAgIlN0cmluZyIsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCksIG51bGwpOwogICAgTmFtZWRUeXBlQnVpbGRlciBvYmplY3RUeXBlID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoCiAgICAgICAgIk9iamVjdCIsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCksIG51bGwpOwogICAgQ2xhc3MgY2xzID0gbmV3IENsYXNzKG5hbWU6IG5hbWUsIHJlZmVyZW5jZTogcmVmZXJlbmNlc0Zyb20/LnJlZmVyZW5jZSk7CiAgICBNYXA8U3RyaW5nLCBNZW1iZXJCdWlsZGVyPiBtZW1iZXJzID0gPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fTsKICAgIE1hcDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+IGNvbnN0cnVjdG9ycyA9IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e307CiAgICBOYW1lZFR5cGVCdWlsZGVyIHNlbGZUeXBlID0KICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLCBudWxsKTsKICAgIFR5cGVCdWlsZGVyIGxpc3RUeXBlID0gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoCiAgICAgICAgIkxpc3QiLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLCA8VHlwZUJ1aWxkZXI+W3NlbGZUeXBlXSk7CgogICAgLy8vIG1ldGFkYXRhIGNsYXNzIEUgewogICAgLy8vICAgZmluYWwgaW50IGluZGV4OwogICAgLy8vICAgZmluYWwgU3RyaW5nIF9uYW1lOwogICAgLy8vICAgY29uc3QgRSh0aGlzLmluZGV4LCB0aGlzLl9uYW1lKTsKICAgIC8vLyAgIHN0YXRpYyBjb25zdCBFIGlkMCA9IGNvbnN0IEUoMCwgJ0UuaWQwJyk7CiAgICAvLy8gICAuLi4KICAgIC8vLyAgIHN0YXRpYyBjb25zdCBFIGlkbi0xID0gY29uc3QgRShuIC0gMSwgJ0UuaWRuLTEnKTsKICAgIC8vLyAgIHN0YXRpYyBjb25zdCBMaXN0PEU+IHZhbHVlcyA9IGNvbnN0IDxFPltpZDAsIC4uLiwgaWRuLTFdOwogICAgLy8vICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX25hbWU7CiAgICAvLy8gfQogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3JSZWZlcmVuY2U7CiAgICBQcm9jZWR1cmUgdG9TdHJpbmdSZWZlcmVuY2U7CiAgICBGaWVsZCBpbmRleFJlZmVyZW5jZTsKICAgIEZpZWxkIF9uYW1lUmVmZXJlbmNlOwogICAgRmllbGQgdmFsdWVzUmVmZXJlbmNlOwogICAgaWYgKHJlZmVyZW5jZXNGcm9tICE9IG51bGwpIHsKICAgICAgY29uc3RydWN0b3JSZWZlcmVuY2UgPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwQ29uc3RydWN0b3IoIiIpOwogICAgICB0b1N0cmluZ1JlZmVyZW5jZSA9CiAgICAgICAgICByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwUHJvY2VkdXJlTm90U2V0dGVyKCJ0b1N0cmluZyIpOwogICAgICBpbmRleFJlZmVyZW5jZSA9IHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBGaWVsZCgiaW5kZXgiKTsKICAgICAgX25hbWVSZWZlcmVuY2UgPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwRmllbGQoIl9uYW1lIik7CiAgICAgIHZhbHVlc1JlZmVyZW5jZSA9IHJlZmVyZW5jZXNGcm9tSW5kZXhlZC5sb29rdXBGaWVsZCgidmFsdWVzIik7CiAgICB9CgogICAgbWVtYmVyc1siaW5kZXgiXSA9IG5ldyBTb3VyY2VGaWVsZEJ1aWxkZXIoCiAgICAgICAgbnVsbCwKICAgICAgICBpbnRUeXBlLAogICAgICAgICJpbmRleCIsCiAgICAgICAgZmluYWxNYXNrIHwgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgaW5kZXhSZWZlcmVuY2UsCiAgICAgICAgbnVsbCwKICAgICAgICBudWxsLAogICAgICAgIG51bGwpOwogICAgbWVtYmVyc1siX25hbWUiXSA9IG5ldyBTb3VyY2VGaWVsZEJ1aWxkZXIoCiAgICAgICAgbnVsbCwKICAgICAgICBzdHJpbmdUeXBlLAogICAgICAgICJfbmFtZSIsCiAgICAgICAgZmluYWxNYXNrIHwgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgX25hbWVSZWZlcmVuY2UsCiAgICAgICAgbnVsbCwKICAgICAgICBudWxsLAogICAgICAgIG51bGwpOwogICAgQ29uc3RydWN0b3JCdWlsZGVyIGNvbnN0cnVjdG9yQnVpbGRlciA9IG5ldyBDb25zdHJ1Y3RvckJ1aWxkZXJJbXBsKAogICAgICAgIG51bGwsCiAgICAgICAgY29uc3RNYXNrLAogICAgICAgIG51bGwsCiAgICAgICAgIiIsCiAgICAgICAgbnVsbCwKICAgICAgICA8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj5bCiAgICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCBpbml0aWFsaXppbmdGb3JtYWxNYXNrLCBpbnRUeXBlLAogICAgICAgICAgICAgICJpbmRleCIsIHBhcmVudCwgY2hhck9mZnNldCksCiAgICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCBpbml0aWFsaXppbmdGb3JtYWxNYXNrLCBzdHJpbmdUeXBlLAogICAgICAgICAgICAgICJfbmFtZSIsIHBhcmVudCwgY2hhck9mZnNldCkKICAgICAgICBdLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlKTsKICAgIGNvbnN0cnVjdG9yc1siIl0gPSBjb25zdHJ1Y3RvckJ1aWxkZXI7CiAgICBGaWVsZEJ1aWxkZXIgdmFsdWVzQnVpbGRlciA9IG5ldyBTb3VyY2VGaWVsZEJ1aWxkZXIoCiAgICAgICAgbnVsbCwKICAgICAgICBsaXN0VHlwZSwKICAgICAgICAidmFsdWVzIiwKICAgICAgICBjb25zdE1hc2sgfCBzdGF0aWNNYXNrIHwgaGFzSW5pdGlhbGl6ZXJNYXNrLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgdmFsdWVzUmVmZXJlbmNlLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBudWxsKTsKICAgIG1lbWJlcnNbInZhbHVlcyJdID0gdmFsdWVzQnVpbGRlcjsKICAgIFByb2NlZHVyZUJ1aWxkZXIgdG9TdHJpbmdCdWlsZGVyID0gbmV3IFByb2NlZHVyZUJ1aWxkZXJJbXBsKAogICAgICAgIG51bGwsCiAgICAgICAgMCwKICAgICAgICBzdHJpbmdUeXBlLAogICAgICAgICJ0b1N0cmluZyIsCiAgICAgICAgbnVsbCwKICAgICAgICBudWxsLAogICAgICAgIFByb2NlZHVyZUtpbmQuTWV0aG9kLAogICAgICAgIHBhcmVudCwKICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHRvU3RyaW5nUmVmZXJlbmNlLAogICAgICAgIG51bGwpOwogICAgbWVtYmVyc1sidG9TdHJpbmciXSA9IHRvU3RyaW5nQnVpbGRlcjsKICAgIFN0cmluZyBjbGFzc05hbWUgPSBuYW1lOwogICAgaWYgKGVudW1Db25zdGFudEluZm9zICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtQ29uc3RhbnRJbmZvcy5sZW5ndGg7IGkrKykgewogICAgICAgIEVudW1Db25zdGFudEluZm8gZW51bUNvbnN0YW50SW5mbyA9IGVudW1Db25zdGFudEluZm9zW2ldOwogICAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IGVudW1Db25zdGFudEluZm8ubWV0YWRhdGE7CiAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnVtQ29uc3RhbnRJbmZvLm5hbWU7CiAgICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZW51bUNvbnN0YW50SW5mby5kb2N1bWVudGF0aW9uQ29tbWVudDsKICAgICAgICBNZW1iZXJCdWlsZGVyIGV4aXN0aW5nID0gbWVtYmVyc1tuYW1lXTsKICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewogICAgICAgICAgLy8gVGhlIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIHN5bnRoZXRpYyBpZiBpdCBoYXMgdGhlIHNhbWUKICAgICAgICAgIC8vIGNoYXJPZmZzZXQgYXMgdGhlIGVuY2xvc2luZyBlbnVtLgogICAgICAgICAgYm9vbCBpc1N5bnRoZXRpYyA9IGV4aXN0aW5nLmNoYXJPZmZzZXQgPT0gY2hhck9mZnNldDsKICAgICAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBpc1N5bnRoZXRpYwogICAgICAgICAgICAgID8gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZQogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmZpbGVVcmksIGNoYXJPZmZzZXQsIGNsYXNzTmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgOiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZmlsZVVyaSwgZXhpc3RpbmcuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgcGFyZW50LmFkZFByb2JsZW0odGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24ud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBlbnVtQ29uc3RhbnRJbmZvLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoLCBwYXJlbnQuZmlsZVVyaSwKICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgICAgIGVudW1Db25zdGFudEluZm9zW2ldID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gY2xhc3NOYW1lKSB7CiAgICAgICAgICBwYXJlbnQuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3Npbmcud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBlbnVtQ29uc3RhbnRJbmZvLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgbmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgcGFyZW50LmZpbGVVcmkpOwogICAgICAgIH0KICAgICAgICBGaWVsZCBmaWVsZFJlZmVyZW5jZTsKICAgICAgICBpZiAocmVmZXJlbmNlc0Zyb20gIT0gbnVsbCkgewogICAgICAgICAgZmllbGRSZWZlcmVuY2UgPSByZWZlcmVuY2VzRnJvbUluZGV4ZWQubG9va3VwRmllbGQobmFtZSk7CiAgICAgICAgfQogICAgICAgIEZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIgPSBuZXcgU291cmNlRmllbGRCdWlsZGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgc2VsZlR5cGUsCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIGNvbnN0TWFzayB8IHN0YXRpY01hc2sgfCBoYXNJbml0aWFsaXplck1hc2ssCiAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgZW51bUNvbnN0YW50SW5mby5jaGFyT2Zmc2V0LAogICAgICAgICAgICBlbnVtQ29uc3RhbnRJbmZvLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIGZpZWxkUmVmZXJlbmNlLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBudWxsKTsKICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgICAgIGZpZWxkQnVpbGRlci5maWVsZCwgZG9jdW1lbnRhdGlvbkNvbW1lbnQpOwogICAgICAgIG1lbWJlcnNbbmFtZV0gPSBmaWVsZEJ1aWxkZXIuLm5leHQgPSBleGlzdGluZzsKICAgICAgfQogICAgfQogICAgZmluYWwgaW50IHN0YXJ0Q2hhck9mZnNldENvbXB1dGVkID0KICAgICAgICBtZXRhZGF0YSA9PSBudWxsID8gc3RhcnRDaGFyT2Zmc2V0IDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKICAgIEVudW1CdWlsZGVyIGVudW1CdWlsZGVyID0gbmV3IEVudW1CdWlsZGVyLmludGVybmFsKAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG5hbWUsCiAgICAgICAgbmV3IFNjb3BlKAogICAgICAgICAgICBsb2NhbDogbWVtYmVycywKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQuc2NvcGUsCiAgICAgICAgICAgIGRlYnVnTmFtZTogImVudW0gJG5hbWUiLAogICAgICAgICAgICBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICBuZXcgQ29uc3RydWN0b3JTY29wZShuYW1lLCBjb25zdHJ1Y3RvcnMpLAogICAgICAgIGNscywKICAgICAgICBlbnVtQ29uc3RhbnRJbmZvcywKICAgICAgICBpbnRUeXBlLAogICAgICAgIGxpc3RUeXBlLAogICAgICAgIG9iamVjdFR5cGUsCiAgICAgICAgc3RyaW5nVHlwZSwKICAgICAgICBwYXJlbnQsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0Q29tcHV0ZWQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgIHJlZmVyZW5jZXNGcm9tLAogICAgICAgIHJlZmVyZW5jZXNGcm9tSW5kZXhlZCk7CiAgICB2b2lkIHNldFBhcmVudChTdHJpbmcgbmFtZSwgTWVtYmVyQnVpbGRlciBidWlsZGVyKSB7CiAgICAgIGRvIHsKICAgICAgICBidWlsZGVyLnBhcmVudCA9IGVudW1CdWlsZGVyOwogICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLm5leHQ7CiAgICAgIH0gd2hpbGUgKGJ1aWxkZXIgIT0gbnVsbCk7CiAgICB9CgogICAgbWVtYmVycy5mb3JFYWNoKHNldFBhcmVudCk7CiAgICBjb25zdHJ1Y3RvcnMuZm9yRWFjaChzZXRQYXJlbnQpOwogICAgc2VsZlR5cGUuYmluZChlbnVtQnVpbGRlcik7CiAgICByZXR1cm4gZW51bUJ1aWxkZXI7CiAgfQoKICBUeXBlQnVpbGRlciBnZXQgbWl4ZWRJblR5cGUgPT4gbnVsbDsKCiAgSW50ZXJmYWNlVHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gcmF3VHlwZShudWxsYWJpbGl0eUJ1aWxkZXIuYnVpbGQobGlicmFyeSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3MgYnVpbGQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeUJ1aWxkZXIsIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5KSB7CiAgICBjbHMuaXNFbnVtID0gdHJ1ZTsKICAgIGludFR5cGUucmVzb2x2ZUluKGNvcmVMaWJyYXJ5LnNjb3BlLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBsaWJyYXJ5QnVpbGRlcik7CiAgICBzdHJpbmdUeXBlLnJlc29sdmVJbigKICAgICAgICBjb3JlTGlicmFyeS5zY29wZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgbGlicmFyeUJ1aWxkZXIpOwogICAgb2JqZWN0VHlwZS5yZXNvbHZlSW4oCiAgICAgICAgY29yZUxpYnJhcnkuc2NvcGUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgIGxpc3RUeXBlLnJlc29sdmVJbihjb3JlTGlicmFyeS5zY29wZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgbGlicmFyeUJ1aWxkZXIpOwoKICAgIFNvdXJjZUZpZWxkQnVpbGRlciBpbmRleEZpZWxkQnVpbGRlciA9IGZpcnN0TWVtYmVyTmFtZWQoImluZGV4Iik7CiAgICBpbmRleEZpZWxkQnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcik7CiAgICBGaWVsZCBpbmRleEZpZWxkID0gaW5kZXhGaWVsZEJ1aWxkZXIuZmllbGQ7CiAgICBTb3VyY2VGaWVsZEJ1aWxkZXIgbmFtZUZpZWxkQnVpbGRlciA9IGZpcnN0TWVtYmVyTmFtZWQoIl9uYW1lIik7CiAgICBuYW1lRmllbGRCdWlsZGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKICAgIEZpZWxkIG5hbWVGaWVsZCA9IG5hbWVGaWVsZEJ1aWxkZXIuZmllbGQ7CiAgICBQcm9jZWR1cmVCdWlsZGVyIHRvU3RyaW5nQnVpbGRlciA9IGZpcnN0TWVtYmVyTmFtZWQoInRvU3RyaW5nIik7CiAgICB0b1N0cmluZ0J1aWxkZXIuYm9keSA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQoCiAgICAgICAgbmV3IERpcmVjdFByb3BlcnR5R2V0KG5ldyBUaGlzRXhwcmVzc2lvbigpLCBuYW1lRmllbGQpKTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzID0gPEV4cHJlc3Npb24+W107CiAgICBpZiAoZW51bUNvbnN0YW50SW5mb3MgIT0gbnVsbCkgewogICAgICBmb3IgKEVudW1Db25zdGFudEluZm8gZW51bUNvbnN0YW50SW5mbyBpbiBlbnVtQ29uc3RhbnRJbmZvcykgewogICAgICAgIGlmIChlbnVtQ29uc3RhbnRJbmZvICE9IG51bGwpIHsKICAgICAgICAgIEJ1aWxkZXIgZGVjbGFyYXRpb24gPSBmaXJzdE1lbWJlck5hbWVkKGVudW1Db25zdGFudEluZm8ubmFtZSk7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaXNGaWVsZCkgewogICAgICAgICAgICBTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyID0gZGVjbGFyYXRpb247CiAgICAgICAgICAgIGZpZWxkQnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcik7CiAgICAgICAgICAgIHZhbHVlcy5hZGQobmV3IFN0YXRpY0dldChmaWVsZEJ1aWxkZXIuZmllbGQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFNvdXJjZUZpZWxkQnVpbGRlciB2YWx1ZXNCdWlsZGVyID0gZmlyc3RNZW1iZXJOYW1lZCgidmFsdWVzIik7CiAgICB2YWx1ZXNCdWlsZGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKICAgIHZhbHVlc0J1aWxkZXIuYnVpbGRCb2R5KAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENyZWF0ZSB0aGUgYm9kaWVzIG9ubHkgd2hlbiB3ZSBoYXZlIGNvcmUgdHlwZXMuCiAgICAgICAgbnVsbCwKICAgICAgICBuZXcgTGlzdExpdGVyYWwodmFsdWVzLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IHJhd1R5cGUobGlicmFyeS5ub25OdWxsYWJsZSksIGlzQ29uc3Q6IHRydWUpKTsKICAgIENvbnN0cnVjdG9yQnVpbGRlckltcGwgY29uc3RydWN0b3JCdWlsZGVyID0gY29uc3RydWN0b3JTY29wZUJ1aWxkZXJbIiJdOwogICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvckJ1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpOwogICAgY29uc3RydWN0b3IuaW5pdGlhbGl6ZXJzLmluc2VydCgKICAgICAgICAwLAogICAgICAgIG5ldyBGaWVsZEluaXRpYWxpemVyKGluZGV4RmllbGQsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1swXSkpCiAgICAgICAgICAuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycy5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBuZXcgRmllbGRJbml0aWFsaXplcihuYW1lRmllbGQsCiAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1sxXSkpCiAgICAgICAgICAuLnBhcmVudCA9IGNvbnN0cnVjdG9yKTsKICAgIENsYXNzQnVpbGRlciBvYmplY3RDbGFzcyA9IG9iamVjdFR5cGUuZGVjbGFyYXRpb247CiAgICBNZW1iZXJCdWlsZGVyIHN1cGVyQ29uc3RydWN0b3IgPSBvYmplY3RDbGFzcy5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgICAgIiIsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnlCdWlsZGVyKTsKICAgIGlmIChzdXBlckNvbnN0cnVjdG9yID09IG51bGwgfHwgIXN1cGVyQ29uc3RydWN0b3IuaXNDb25zdHJ1Y3RvcikgewogICAgICAvLyBUT0RPKGFoZSk6IElkZWFsbHksIHdlIHdvdWxkIGFsc28gd2FudCB0byBjaGVjayB0aGF0IFtPYmplY3RdJ3MKICAgICAgLy8gdW5uYW1lZCBjb25zdHJ1Y3RvciByZXF1aXJlcyBubyBhcmd1bWVudHMuIEJ1dCB0aGF0IGluZm9ybWF0aW9uIGlzbid0CiAgICAgIC8vIGFsd2F5cyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCwgYW5kIGl0J3Mgbm90IHJlYWxseSBhIHNpdHVhdGlvbiB0aGF0CiAgICAgIC8vIGNhbiBoYXBwZW4gdW5sZXNzIHlvdSBzdGFydCBtb2RpZnlpbmcgdGhlIFNESyBzb3VyY2VzLgogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZU5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3QsCiAgICAgICAgICBvYmplY3RDbGFzcy5jaGFyT2Zmc2V0LCBvYmplY3RDbGFzcy5uYW1lLmxlbmd0aCwgb2JqZWN0Q2xhc3MuZmlsZVVyaSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMuYWRkKAogICAgICAgICAgbmV3IFN1cGVySW5pdGlhbGl6ZXIoc3VwZXJDb25zdHJ1Y3Rvci5tZW1iZXIsIG5ldyBBcmd1bWVudHMuZW1wdHkoKSkKICAgICAgICAgICAgLi5wYXJlbnQgPSBjb25zdHJ1Y3Rvcik7CiAgICB9CiAgICBpbnQgaW5kZXggPSAwOwogICAgaWYgKGVudW1Db25zdGFudEluZm9zICE9IG51bGwpIHsKICAgICAgZm9yIChFbnVtQ29uc3RhbnRJbmZvIGVudW1Db25zdGFudEluZm8gaW4gZW51bUNvbnN0YW50SW5mb3MpIHsKICAgICAgICBpZiAoZW51bUNvbnN0YW50SW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBTdHJpbmcgY29uc3RhbnQgPSBlbnVtQ29uc3RhbnRJbmZvLm5hbWU7CiAgICAgICAgICBCdWlsZGVyIGRlY2xhcmF0aW9uID0gZmlyc3RNZW1iZXJOYW1lZChjb25zdGFudCk7CiAgICAgICAgICBGaWVsZEJ1aWxkZXIgZmllbGQ7CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaXNGaWVsZCkgewogICAgICAgICAgICBmaWVsZCA9IGRlY2xhcmF0aW9uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICAgIG5ldyBJbnRMaXRlcmFsKGluZGV4KyspLAogICAgICAgICAgICBuZXcgU3RyaW5nTGl0ZXJhbCgiJG5hbWUuJGNvbnN0YW50IikKICAgICAgICAgIF0pOwogICAgICAgICAgZmllbGQuYnVpbGRCb2R5KAogICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENyZWF0ZSB0aGUgYm9kaWVzIG9ubHkgd2hlbiB3ZSBoYXZlIGNvcmUKICAgICAgICAgICAgICAvLyAgdHlwZXMuCiAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLCBhcmd1bWVudHMsIGlzQ29uc3Q6IHRydWUpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdXBlci5idWlsZChsaWJyYXJ5QnVpbGRlciwgY29yZUxpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyQnVpbGRlciBmaW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgIFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpjbGFzcyBFbnVtQ29uc3RhbnRJbmZvIHsKICBmaW5hbCBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGE7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50OwogIGNvbnN0IEVudW1Db25zdGFudEluZm8oCiAgICAgIHRoaXMubWV0YWRhdGEsIHRoaXMubmFtZSwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmRvY3VtZW50YXRpb25Db21tZW50KTsKfQqBwQBOTjwBHAEhCRMPFR8bFA8aFBcVExcZExcaGBUBRQEdCRgtJyw1MQEsARoJExMcIBQBGAFGAUoBFx0jHSgfHiAiIyEcAS8yASIBJQElASMBGCYTEyURHhQVFxcdGxYZHCoPFg8SEhISEhMaFBIdGBscIxcBFysmEzAjGxYZHCxHSSAaTzM9OD1NREkgTjFOARsbHis0DjxEJgomIRoaGyJKGkZDQ0UGAS8OEREoEBQUGA4ODy8OFBEoEBQUGA4OD0gOEw4MDiJMLE8rCxAUFBQXHys5DhISNRAUFBkODg8nQQ4LFBQODh4QFBQUFxsPKx0lO0JELU0wIEYvQDUiPislSBIiNSslTBNPSCEnKB1LKxsfCh4mRAo8FhYSORQpKRwSEhM0NzcIBihIOBIOExwiJSIyDRsREhQUECEUFxggOQsmICEGASAlIBgEAScBMkw3BAEMURdPGkEaQVABRi0wRSwuRTBBLiVFKEklOzA7DAoIBkMpHVAOIElNSCULKUsjJQsoSyM3SzJHSU9OQD5RDSRPJQYTJUUoMzweJSETFgw8JTEOG08ZFFEKCAY1BAEMKkYRBAIBGSgVGCUaTQIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0ZmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZXh0ZW5zaW9uX2J1aWxkZXIuZGFydJDnLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbU5vdEZvdW5kSW47CmltcG9ydCAnLi4vc2NvcGUuZGFydCc7CmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCc7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21lbWJlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21ldGFkYXRhX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbnVsbGFiaWxpdHlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBFeHRlbnNpb25CdWlsZGVyIGltcGxlbWVudHMgRGVjbGFyYXRpb25CdWlsZGVyIHsKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGdldCB0eXBlUGFyYW1ldGVyczsKICBUeXBlQnVpbGRlciBnZXQgb25UeXBlOwoKICAvLy8gUmV0dXJuIHRoZSBbRXh0ZW5zaW9uXSBidWlsdCBieSB0aGlzIGJ1aWxkZXIuCiAgRXh0ZW5zaW9uIGdldCBleHRlbnNpb247CgogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcyk7CgogIC8vLyBMb29rcyB1cCBleHRlbnNpb24gbWVtYmVyIGJ5IFtuYW1lXSB0YWtpbmcgcHJpdmFjeSBpbnRvIGFjY291bnQuCiAgLy8vCiAgLy8vIElmIFtzZXR0ZXJdIGlzIGB0cnVlYCB0aGUgc291Z2h0IG1lbWJlciBpcyBhIHNldHRlciBvciBhc3NpZ25hYmxlIGZpZWxkLgogIC8vLyBJZiBbcmVxdWlyZWRdIGlzIGB0cnVlYCBhbmQgbm8gbWVtYmVyIGlzIGZvdW5kIGFuIGludGVybmFsIHByb2JsZW0gaXMKICAvLy8gcmVwb3J0ZWQuCiAgQnVpbGRlciBsb29rdXBMb2NhbE1lbWJlckJ5TmFtZShOYW1lIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSk7Cn0KCmFic3RyYWN0IGNsYXNzIEV4dGVuc2lvbkJ1aWxkZXJJbXBsIGV4dGVuZHMgRGVjbGFyYXRpb25CdWlsZGVySW1wbAogICAgaW1wbGVtZW50cyBFeHRlbnNpb25CdWlsZGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlQnVpbGRlciBvblR5cGU7CgogIEV4dGVuc2lvbkJ1aWxkZXJJbXBsKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaWJyYXJ5QnVpbGRlciBwYXJlbnQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBTY29wZSBzY29wZSwKICAgICAgdGhpcy50eXBlUGFyYW1ldGVycywKICAgICAgdGhpcy5vblR5cGUpCiAgICAgIDogc3VwZXIobWV0YWRhdGEsIG1vZGlmaWVycywgbmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0LCBzY29wZSk7CgogIC8vLyBMb29rdXAgYSBzdGF0aWMgbWVtYmVyIG9mIHRoaXMgZGVjbGFyYXRpb24uCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBmaW5kU3RhdGljQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwgTGlicmFyeUJ1aWxkZXIgYWNjZXNzaW5nTGlicmFyeSwKICAgICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlfSkgewogICAgaWYgKGFjY2Vzc2luZ0xpYnJhcnkub3JpZ2luICE9IGxpYnJhcnkub3JpZ2luICYmIG5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgQnVpbGRlciBkZWNsYXJhdGlvbiA9IGlzU2V0dGVyCiAgICAgICAgPyBzY29wZS5sb29rdXBTZXR0ZXIobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSwgaXNJbnN0YW5jZVNjb3BlOiBmYWxzZSkKICAgICAgICA6IHNjb3BlLmxvb2t1cChuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpLCBpc0luc3RhbmNlU2NvcGU6IGZhbHNlKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSBwYXRjaGVkIGV4dGVuc2lvbnMuCiAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiRXh0ZW5zaW9uQnVpbGRlci5idWlsZFR5cGUgaXMgbm90IHN1cHBvcnRlZC4iKTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkV4dGVuc2lvbkJ1aWxkZXIuYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cyAiCiAgICAgICAgImlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4dGVuc2lvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCB0aGlzVHlwZSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIGxvb2t1cExvY2FsTWVtYmVyKFN0cmluZyBuYW1lLAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlLCBib29sIHJlcXVpcmVkOiBmYWxzZX0pIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgcGF0Y2hpbmcgb24gZXh0ZW5zaW9ucy4KICAgIEJ1aWxkZXIgYnVpbGRlciA9IHNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICAgIGlmIChyZXF1aXJlZCAmJiBidWlsZGVyID09IG51bGwpIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZEluLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgbmFtZSwgZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBsb29rdXBMb2NhbE1lbWJlckJ5TmFtZShOYW1lIG5hbWUsCiAgICAgIHtib29sIHNldHRlcjogZmFsc2UsIGJvb2wgcmVxdWlyZWQ6IGZhbHNlfSkgewogICAgQnVpbGRlciBidWlsZGVyID0KICAgICAgICBsb29rdXBMb2NhbE1lbWJlcihuYW1lLm5hbWUsIHNldHRlcjogc2V0dGVyLCByZXF1aXJlZDogcmVxdWlyZWQpOwogICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCAmJiBuYW1lLmlzUHJpdmF0ZSAmJiBsaWJyYXJ5LmxpYnJhcnkgIT0gbmFtZS5saWJyYXJ5KSB7CiAgICAgIGJ1aWxkZXIgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRXh0ZW5zaW9uQnVpbGRlciI7CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgdm9pZCBidWlsZChTdHJpbmcgaWdub3JlLCBCdWlsZGVyIGRlY2xhcmF0aW9uKSB7CiAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyID0gZGVjbGFyYXRpb247CiAgICAgIG1lbWJlci5idWlsZE91dGxpbmVFeHByZXNzaW9ucyhsaWJyYXJ5LCBjb3JlVHlwZXMpOwogICAgfQoKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEhhbmRsZSBhbm5vdGF0aW9ucyBvbiB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgogICAgLy9NZXRhZGF0YUJ1aWxkZXIuYnVpbGRBbm5vdGF0aW9ucygKICAgIC8vICAgIGlzUGF0Y2ggPyBvcmlnaW4uZXh0ZW5zaW9uIDogZXh0ZW5zaW9uLAogICAgLy8gICAgbWV0YWRhdGEsIGxpYnJhcnksIHRoaXMsIG51bGwpOwogICAgc2NvcGUuZm9yRWFjaChidWlsZCk7CiAgfQp9CoCKAE5OPAEiASIpAUUYGwEXHx4gIxwlIwFAMBoBNBsBTQFHBk9MEC0zAgFDIgwyAQwcARgmFRMdFhMbE0UBMgwdUSBNEwYjUEs3GAQBDC1MUAQBDEA7UB4EAQwgAQwmAQwpNDxFJxc7KA4RBhQEAQwtNBZKUBYGFAQBDC4BDE41KjoGAU0oMioaBAIBOnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnRiZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnTAAIZ1Ly8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZmllbGRfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvbGVnYWN5X2VyYXN1cmUuZGFydCc7CgppbXBvcnQgJy4uL2NvbnN0YW50X2NvbnRleHQuZGFydCcgc2hvdyBDb25zdGFudENvbnRleHQ7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZDsKCmltcG9ydCAnLi4va2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IEJvZHlCdWlsZGVyOwppbXBvcnQgJy4uL2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyOwppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IEltcGxpY2l0RmllbGRUeXBlOwppbXBvcnQgJy4uL2tlcm5lbC9sYXRlX2xvd2VyaW5nLmRhcnQnIGFzIGxhdGVfbG93ZXJpbmc7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnIHNob3cgY292YXJpYW50TWFzaywgaGFzSW5pdGlhbGl6ZXJNYXNrLCBsYXRlTWFzazsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyBpbnRlcm5hbFByb2JsZW07CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnQnIHNob3cgU291cmNlTG9hZGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydCcKICAgIHNob3cgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5OwoKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEZpZWxkQnVpbGRlciBpbXBsZW1lbnRzIE1lbWJlckJ1aWxkZXIgewogIEZpZWxkIGdldCBmaWVsZDsKCiAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IGdldCBtZXRhZGF0YTsKCiAgVHlwZUJ1aWxkZXIgZ2V0IHR5cGU7CgogIFRva2VuIGdldCBjb25zdEluaXRpYWxpemVyVG9rZW47CgogIGJvb2wgaGFkVHlwZXNJbmZlcnJlZDsKCiAgYm9vbCBnZXQgaXNDb3ZhcmlhbnQ7CgogIGJvb2wgZ2V0IGlzTGF0ZTsKCiAgYm9vbCBnZXQgaGFzSW5pdGlhbGl6ZXI7CgogIC8vLyBXaGV0aGVyIHRoZSBib2R5IG9mIHRoaXMgZmllbGQgaGFzIGJlZW4gYnVpbHQuCiAgLy8vCiAgLy8vIENvbnN0YW50IGZpZWxkcyBoYXZlIHRoZWlyIGluaXRpYWxpemVyIGJ1aWx0IGluIHRoZSBvdXRsaW5lIHNvIHdlIGF2b2lkCiAgLy8vIGJ1aWxkaW5nIHRoZW0gdHdpY2UgYXMgcGFydCBvZiB0aGUgbm9uLW91dGxpbmUgYnVpbGQuCiAgYm9vbCBnZXQgaGFzQm9keUJlZW5CdWlsdDsKCiAgLy8vIEJ1aWxkcyB0aGUgYm9keSBvZiB0aGlzIGZpZWxkIHVzaW5nIFtpbml0aWFsaXplcl0gYXMgdGhlIGluaXRpYWxpemVyCiAgLy8vIGV4cHJlc3Npb24uCiAgdm9pZCBidWlsZEJvZHkoQ29yZVR5cGVzIGNvcmVUeXBlcywgRXhwcmVzc2lvbiBpbml0aWFsaXplcik7CgogIC8vLyBCdWlsZHMgdGhlIGZpZWxkIGluaXRpYWxpemVycyBmb3IgZWFjaCBmaWVsZCB1c2VkIHRvIGVuY29kZSB0aGlzIGZpZWxkCiAgLy8vIHVzaW5nIHRoZSBbZmlsZU9mZnNldF0gZm9yIHRoZSBjcmVhdGVkIG5vZGVzIGFuZCBbdmFsdWVdIGFzIHRoZSBpbml0aWFsCiAgLy8vIGZpZWxkIHZhbHVlLgogIExpc3Q8SW5pdGlhbGl6ZXI+IGJ1aWxkSW5pdGlhbGl6ZXIoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtib29sIGlzU3ludGhldGljfSk7CgogIGJvb2wgZ2V0IGlzRWxpZ2libGVGb3JJbmZlcmVuY2U7CgogIERhcnRUeXBlIGdldCBidWlsdFR5cGU7CgogIERhcnRUeXBlIGluZmVyVHlwZSgpOwoKICBEYXJ0VHlwZSBmaWVsZFR5cGU7Cn0KCmNsYXNzIFNvdXJjZUZpZWxkQnVpbGRlciBleHRlbmRzIE1lbWJlckJ1aWxkZXJJbXBsIGltcGxlbWVudHMgRmllbGRCdWlsZGVyIHsKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IG1vZGlmaWVyczsKCiAgRmllbGRFbmNvZGluZyBfZmllbGRFbmNvZGluZzsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlQnVpbGRlciB0eXBlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBjb25zdEluaXRpYWxpemVyVG9rZW47CgogIGJvb2wgaGFkVHlwZXNJbmZlcnJlZCA9IGZhbHNlOwoKICBib29sIGhhc0JvZHlCZWVuQnVpbHQgPSBmYWxzZTsKCiAgU291cmNlRmllbGRCdWlsZGVyKAogICAgICB0aGlzLm1ldGFkYXRhLAogICAgICB0aGlzLnR5cGUsCiAgICAgIHRoaXMubmFtZSwKICAgICAgdGhpcy5tb2RpZmllcnMsCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIEZpZWxkIHJlZmVyZW5jZSwKICAgICAgRmllbGQgbGF0ZUlzU2V0UmVmZXJlbmNlRnJvbSwKICAgICAgUHJvY2VkdXJlIGdldHRlclJlZmVyZW5jZUZyb20sCiAgICAgIFByb2NlZHVyZSBzZXR0ZXJSZWZlcmVuY2VGcm9tKQogICAgICA6IHN1cGVyKGxpYnJhcnlCdWlsZGVyLCBjaGFyT2Zmc2V0KSB7CiAgICBVcmkgZmlsZVVyaSA9IGxpYnJhcnlCdWlsZGVyPy5maWxlVXJpOwogICAgaWYgKGlzTGF0ZSAmJgogICAgICAgICFsaWJyYXJ5QnVpbGRlci5sb2FkZXIudGFyZ2V0LmJhY2tlbmRUYXJnZXQuc3VwcG9ydHNMYXRlRmllbGRzKSB7CiAgICAgIGlmIChoYXNJbml0aWFsaXplcikgewogICAgICAgIGlmIChpc0ZpbmFsKSB7CiAgICAgICAgICBfZmllbGRFbmNvZGluZyA9IG5ldyBMYXRlRmluYWxGaWVsZFdpdGhJbml0aWFsaXplckVuY29kaW5nKAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgZmlsZVVyaSwKICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICAgICAgcmVmZXJlbmNlLAogICAgICAgICAgICAgIGxhdGVJc1NldFJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgICAgZ2V0dGVyUmVmZXJlbmNlRnJvbSwKICAgICAgICAgICAgICBzZXR0ZXJSZWZlcmVuY2VGcm9tKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2ZpZWxkRW5jb2RpbmcgPSBuZXcgTGF0ZUZpZWxkV2l0aEluaXRpYWxpemVyRW5jb2RpbmcoCiAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICBmaWxlVXJpLAogICAgICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgICAgICByZWZlcmVuY2UsCiAgICAgICAgICAgICAgbGF0ZUlzU2V0UmVmZXJlbmNlRnJvbSwKICAgICAgICAgICAgICBnZXR0ZXJSZWZlcmVuY2VGcm9tLAogICAgICAgICAgICAgIHNldHRlclJlZmVyZW5jZUZyb20pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNGaW5hbCkgewogICAgICAgICAgX2ZpZWxkRW5jb2RpbmcgPSBuZXcgTGF0ZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJFbmNvZGluZygKICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgIGZpbGVVcmksCiAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgICAgIHJlZmVyZW5jZSwKICAgICAgICAgICAgICBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tLAogICAgICAgICAgICAgIGdldHRlclJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgICAgc2V0dGVyUmVmZXJlbmNlRnJvbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9maWVsZEVuY29kaW5nID0gbmV3IExhdGVGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nKAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgZmlsZVVyaSwKICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICAgICAgcmVmZXJlbmNlLAogICAgICAgICAgICAgIGxhdGVJc1NldFJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgICAgZ2V0dGVyUmVmZXJlbmNlRnJvbSwKICAgICAgICAgICAgICBzZXR0ZXJSZWZlcmVuY2VGcm9tKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChsYXRlSXNTZXRSZWZlcmVuY2VGcm9tID09IG51bGwpOwogICAgICBhc3NlcnQoZ2V0dGVyUmVmZXJlbmNlRnJvbSA9PSBudWxsKTsKICAgICAgYXNzZXJ0KHNldHRlclJlZmVyZW5jZUZyb20gPT0gbnVsbCk7CiAgICAgIF9maWVsZEVuY29kaW5nID0gbmV3IFJlZ3VsYXJGaWVsZEVuY29kaW5nKGZpbGVVcmksIGNoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyRW5kT2Zmc2V0LCByZWZlcmVuY2UsIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAgICB9CiAgfQoKICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeSA9PiBzdXBlci5saWJyYXJ5OwoKICBNZW1iZXIgZ2V0IG1lbWJlciA9PiBfZmllbGRFbmNvZGluZy5maWVsZDsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkZpZWxkQnVpbGRlciI7CgogIGJvb2wgZ2V0IGlzRmllbGQgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNMYXRlID0+IChtb2RpZmllcnMgJiBsYXRlTWFzaykgIT0gMDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb3ZhcmlhbnQgPT4gKG1vZGlmaWVycyAmIGNvdmFyaWFudE1hc2spICE9IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGhhc0luaXRpYWxpemVyID0+IChtb2RpZmllcnMgJiBoYXNJbml0aWFsaXplck1hc2spICE9IDA7CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRCb2R5KENvcmVUeXBlcyBjb3JlVHlwZXMsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKICAgIGFzc2VydCghaGFzQm9keUJlZW5CdWlsdCk7CiAgICBoYXNCb2R5QmVlbkJ1aWx0ID0gdHJ1ZTsKICAgIGlmICghaGFzSW5pdGlhbGl6ZXIgJiYKICAgICAgICBpbml0aWFsaXplciAhPSBudWxsICYmCiAgICAgICAgaW5pdGlhbGl6ZXIgaXMhIE51bGxMaXRlcmFsICYmCiAgICAgICAgIWlzQ29uc3QgJiYKICAgICAgICAhaXNGaW5hbCkgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQWxyZWFkeUluaXRpYWxpemVkLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICAgIF9maWVsZEVuY29kaW5nLmNyZWF0ZUJvZGllcyhjb3JlVHlwZXMsIGluaXRpYWxpemVyKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8SW5pdGlhbGl6ZXI+IGJ1aWxkSW5pdGlhbGl6ZXIoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtib29sIGlzU3ludGhldGljfSkgewogICAgcmV0dXJuIF9maWVsZEVuY29kaW5nLmNyZWF0ZUluaXRpYWxpemVyKGZpbGVPZmZzZXQsIHZhbHVlLAogICAgICAgIGlzU3ludGhldGljOiBpc1N5bnRoZXRpYyk7CiAgfQoKICBib29sIGdldCBpc0VsaWdpYmxlRm9ySW5mZXJlbmNlIHsKICAgIHJldHVybiB0eXBlID09IG51bGwgJiYgKGhhc0luaXRpYWxpemVyIHx8IGlzQ2xhc3NJbnN0YW5jZU1lbWJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Fzc2lnbmFibGUgewogICAgaWYgKGlzQ29uc3QpIHJldHVybiBmYWxzZTsKICAgIGlmIChpc0ZpbmFsKSB7CiAgICAgIGlmIChpc0xhdGUpIHsKICAgICAgICByZXR1cm4gIWhhc0luaXRpYWxpemVyOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgRmllbGQgZ2V0IGZpZWxkID0+IF9maWVsZEVuY29kaW5nLmZpZWxkOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IHJlYWRUYXJnZXQgPT4gX2ZpZWxkRW5jb2RpbmcucmVhZFRhcmdldDsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCB3cml0ZVRhcmdldCB7CiAgICByZXR1cm4gaXNBc3NpZ25hYmxlID8gX2ZpZWxkRW5jb2Rpbmcud3JpdGVUYXJnZXQgOiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCBpbnZva2VUYXJnZXQgPT4gcmVhZFRhcmdldDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE1lbWJlcnMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHZvaWQgRnVuY3Rpb24oTWVtYmVyLCBCdWlsdE1lbWJlcktpbmQpIGYpIHsKICAgIGJ1aWxkKGxpYnJhcnkpOwogICAgX2ZpZWxkRW5jb2RpbmcucmVnaXN0ZXJNZW1iZXJzKGxpYnJhcnksIHRoaXMsIGYpOwogIH0KCiAgdm9pZCBidWlsZChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcikgewogICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICBmaWVsZFR5cGUgPSB0eXBlLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKICAgIH0KICAgIF9maWVsZEVuY29kaW5nLmJ1aWxkKGxpYnJhcnlCdWlsZGVyLCB0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgX2ZpZWxkRW5jb2RpbmcuY29tcGxldGVTaWduYXR1cmUoY29yZVR5cGVzKTsKCiAgICBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyID0gaXNDbGFzc01lbWJlciA/IHBhcmVudCA6IG51bGw7CiAgICBNZXRhZGF0YUJ1aWxkZXIuYnVpbGRBbm5vdGF0aW9ucygKICAgICAgICBfZmllbGRFbmNvZGluZy5maWVsZCwgbWV0YWRhdGEsIGxpYnJhcnksIGNsYXNzQnVpbGRlciwgdGhpcyk7CgogICAgLy8gRm9yIG1vZHVsYXIgY29tcGlsYXRpb24gd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycyBvZiBhbGwgY29uc3QKICAgIC8vIGZpZWxkcyBhbmQgYWxsIG5vbi1zdGF0aWMgZmluYWwgZmllbGRzIGluIGNsYXNzZXMgd2l0aCBjb25zdCBjb25zdHJ1Y3RvcnMKICAgIC8vIGludG8gdGhlIG91dGxpbmUuCiAgICBpZiAoKGlzQ29uc3QgfHwKICAgICAgICAgICAgKGlzRmluYWwgJiYKICAgICAgICAgICAgICAgICFpc1N0YXRpYyAmJgogICAgICAgICAgICAgICAgaXNDbGFzc01lbWJlciAmJgogICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmhhc0NvbnN0Q29uc3RydWN0b3IpKSAmJgogICAgICAgIGNvbnN0SW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIFNjb3BlIHNjb3BlID0gY2xhc3NCdWlsZGVyPy5zY29wZSA/PyBsaWJyYXJ5LnNjb3BlOwogICAgICBCb2R5QnVpbGRlciBib2R5QnVpbGRlciA9IGxpYnJhcnkubG9hZGVyCiAgICAgICAgICAuY3JlYXRlQm9keUJ1aWxkZXJGb3JPdXRsaW5lRXhwcmVzc2lvbigKICAgICAgICAgICAgICBsaWJyYXJ5LCBjbGFzc0J1aWxkZXIsIHRoaXMsIHNjb3BlLCBmaWxlVXJpKTsKICAgICAgYm9keUJ1aWxkZXIuY29uc3RhbnRDb250ZXh0ID0KICAgICAgICAgIGlzQ29uc3QgPyBDb25zdGFudENvbnRleHQuaW5mZXJyZWQgOiBDb25zdGFudENvbnRleHQucmVxdWlyZWQ7CiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBib2R5QnVpbGRlci50eXBlSW5mZXJyZXI/LmluZmVyRmllbGRJbml0aWFsaXplcigKICAgICAgICAgIGJvZHlCdWlsZGVyLAogICAgICAgICAgZmllbGRUeXBlLAogICAgICAgICAgYm9keUJ1aWxkZXIucGFyc2VGaWVsZEluaXRpYWxpemVyKGNvbnN0SW5pdGlhbGl6ZXJUb2tlbikpOwogICAgICBpZiAobGlicmFyeS5sb2FkZXIgaXMgU291cmNlTG9hZGVyICYmCiAgICAgICAgICAoYm9keUJ1aWxkZXIudHJhbnNmb3JtU2V0TGl0ZXJhbHMgfHwKICAgICAgICAgICAgICBib2R5QnVpbGRlci50cmFuc2Zvcm1Db2xsZWN0aW9ucykpIHsKICAgICAgICAvLyBXcmFwIHRoZSBpbml0aWFsaXplciBpbiBhIHRlbXBvcmFyeSBwYXJlbnQgZXhwcmVzc2lvbjsgdGhlCiAgICAgICAgLy8gdHJhbnNmb3JtYXRpb25zIG5lZWQgYSBwYXJlbnQgcmVsYXRpb24uCiAgICAgICAgTm90IHdyYXBwZXIgPSBuZXcgTm90KGluaXRpYWxpemVyKTsKICAgICAgICBTb3VyY2VMb2FkZXIgbG9hZGVyID0gbGlicmFyeS5sb2FkZXI7CiAgICAgICAgbG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2Uod3JhcHBlciwgYm9keUJ1aWxkZXIudHJhbnNmb3JtU2V0TGl0ZXJhbHMsCiAgICAgICAgICAgIGJvZHlCdWlsZGVyLnRyYW5zZm9ybUNvbGxlY3Rpb25zLCBsaWJyYXJ5LmxpYnJhcnkpOwogICAgICAgIGluaXRpYWxpemVyID0gd3JhcHBlci5vcGVyYW5kOwogICAgICB9CiAgICAgIGJ1aWxkQm9keShjb3JlVHlwZXMsIGluaXRpYWxpemVyKTsKICAgICAgYm9keUJ1aWxkZXIucmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICAgIH0KICAgIGNvbnN0SW5pdGlhbGl6ZXJUb2tlbiA9IG51bGw7CiAgfQoKICBEYXJ0VHlwZSBnZXQgZmllbGRUeXBlID0+IF9maWVsZEVuY29kaW5nLnR5cGU7CgogIHZvaWQgc2V0IGZpZWxkVHlwZShEYXJ0VHlwZSB2YWx1ZSkgewogICAgX2ZpZWxkRW5jb2RpbmcudHlwZSA9IHZhbHVlOwogICAgaWYgKCFpc0ZpbmFsICYmICFpc0NvbnN0ICYmIHBhcmVudCBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgQ2xhc3NCdWlsZGVyIGVuY2xvc2luZ0NsYXNzQnVpbGRlciA9IHBhcmVudDsKICAgICAgQ2xhc3MgZW5jbG9zaW5nQ2xhc3MgPSBlbmNsb3NpbmdDbGFzc0J1aWxkZXIuY2xzOwogICAgICBpZiAoZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBuZWVkc0NoZWNrVmlzaXRvciA9CiAgICAgICAgICAgIG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjaGVja2luZyB0aGUgZmllbGQgdHlwZSBhcyBpZiBpdCBpcyB0aGUgdHlwZSBvZiB0aGUKICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBvZiB0aGUgaW1wbGljaXQgc2V0dGVyIGFuZCB0aGlzIGlzIGEgY29udHJhdmFyaWFudAogICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uCiAgICAgICAgICAgICAgICBpbml0aWFsVmFyaWFuY2U6IFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQpOwogICAgICAgIGlmICh2YWx1ZS5hY2NlcHQobmVlZHNDaGVja1Zpc2l0b3IpKSB7CiAgICAgICAgICBfZmllbGRFbmNvZGluZy5zZXRHZW5lcmljQ292YXJpYW50SW1wbCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgaW5mZXJUeXBlKCkgewogICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IHRoaXMubGlicmFyeTsKICAgIGlmIChmaWVsZFR5cGUgaXMhIEltcGxpY2l0RmllbGRUeXBlKSB7CiAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBpbmZlcnJlZCBhIHR5cGUuCiAgICAgIHJldHVybiBmaWVsZFR5cGU7CiAgICB9CgogICAgSW1wbGljaXRGaWVsZFR5cGUgaW1wbGljaXRGaWVsZFR5cGUgPSBmaWVsZFR5cGU7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbXBsaWNpdEZpZWxkVHlwZS5jb21wdXRlVHlwZSgpOwogICAgaWYgKGZpZWxkVHlwZSBpcyBJbXBsaWNpdEZpZWxkVHlwZSkgewogICAgICAvLyBgZmllbGRUeXBlYCBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGEgY2lyY3VsYXJpdHkgd2FzIGRldGVjdGVkIHdoZW4KICAgICAgLy8gW2luZmVycmVkVHlwZV0gd2FzIGNvbXB1dGVkLgogICAgICBpZiAoIWxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgIGluZmVycmVkVHlwZSA9IGxlZ2FjeUVyYXN1cmUoCiAgICAgICAgICAgIGxpYnJhcnkubG9hZGVyLnR5cGVJbmZlcmVuY2VFbmdpbmUuY29yZVR5cGVzLCBpbmZlcnJlZFR5cGUpOwogICAgICB9CiAgICAgIGZpZWxkVHlwZSA9IGltcGxpY2l0RmllbGRUeXBlLmNoZWNrSW5mZXJyZWQoaW5mZXJyZWRUeXBlKTsKCiAgICAgIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBuZWVkc0NoZWNrVmlzaXRvcjsKICAgICAgaWYgKHBhcmVudCBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICBDbGFzc0J1aWxkZXIgZW5jbG9zaW5nQ2xhc3NCdWlsZGVyID0gcGFyZW50OwogICAgICAgIENsYXNzIGVuY2xvc2luZ0NsYXNzID0gZW5jbG9zaW5nQ2xhc3NCdWlsZGVyLmNsczsKICAgICAgICBpZiAoZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAgICAgbmVlZHNDaGVja1Zpc2l0b3IgPSBuZXcgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5KAogICAgICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAgIC8vIFdlIGFyZSBjaGVja2luZyB0aGUgZmllbGQgdHlwZSBhcyBpZiBpdCBpcyB0aGUgdHlwZSBvZiB0aGUKICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgb2YgdGhlIGltcGxpY2l0IHNldHRlciBhbmQgdGhpcyBpcyBhIGNvbnRyYXZhcmlhbnQKICAgICAgICAgICAgICAvLyBwb3NpdGlvbi4KICAgICAgICAgICAgICBpbml0aWFsVmFyaWFuY2U6IFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmVlZHNDaGVja1Zpc2l0b3IgIT0gbnVsbCkgewogICAgICAgIGlmIChmaWVsZFR5cGUuYWNjZXB0KG5lZWRzQ2hlY2tWaXNpdG9yKSkgewogICAgICAgICAgZmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmllbGRUeXBlOwogIH0KCiAgRGFydFR5cGUgZ2V0IGJ1aWx0VHlwZSA9PiBmaWVsZFR5cGU7CgogIEBvdmVycmlkZQogIExpc3Q8Q2xhc3NNZW1iZXI+IGdldCBsb2NhbE1lbWJlcnMgPT4gX2ZpZWxkRW5jb2RpbmcuZ2V0TG9jYWxNZW1iZXJzKHRoaXMpOwoKICBAb3ZlcnJpZGUKICBMaXN0PENsYXNzTWVtYmVyPiBnZXQgbG9jYWxTZXR0ZXJzID0+IF9maWVsZEVuY29kaW5nLmdldExvY2FsU2V0dGVycyh0aGlzKTsKCiAgc3RhdGljIFN0cmluZyBjcmVhdGVGaWVsZE5hbWUoCiAgICAgIGJvb2wgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKICAgICAgYm9vbCBpc0V4dGVuc2lvbk1ldGhvZCwKICAgICAgU3RyaW5nIGV4dGVuc2lvbk5hbWUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBib29sIGlzTGF0ZVdpdGhMb3dlcmluZywKICAgICAgRmllbGROYW1lVHlwZSB0eXBlKSB7CiAgICBTdHJpbmcgYmFzZU5hbWU7CiAgICBpZiAoIWlzRXh0ZW5zaW9uTWV0aG9kKSB7CiAgICAgIGJhc2VOYW1lID0gbmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIGJhc2VOYW1lID0gIiR7ZXh0ZW5zaW9uTmFtZX18JHtuYW1lfSI7CiAgICB9CgogICAgaWYgKCFpc0xhdGVXaXRoTG93ZXJpbmcpIHsKICAgICAgYXNzZXJ0KHR5cGUgPT0gRmllbGROYW1lVHlwZS5GaWVsZCk7CiAgICAgIHJldHVybiBiYXNlTmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBuYW1lUHJlZml4ID0gJ18jJzsKICAgICAgaWYgKGlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBuYW1lUHJlZml4ID0gJyRuYW1lUHJlZml4JHtjbGFzc05hbWV9Iyc7CiAgICAgIH0KICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBGaWVsZE5hbWVUeXBlLkZpZWxkOgogICAgICAgICAgcmV0dXJuICIkbmFtZVByZWZpeCRiYXNlTmFtZSI7CiAgICAgICAgY2FzZSBGaWVsZE5hbWVUeXBlLkdldHRlcjoKICAgICAgICAgIHJldHVybiBiYXNlTmFtZTsKICAgICAgICBjYXNlIEZpZWxkTmFtZVR5cGUuU2V0dGVyOgogICAgICAgICAgcmV0dXJuIGJhc2VOYW1lOwogICAgICAgIGNhc2UgRmllbGROYW1lVHlwZS5Jc1NldEZpZWxkOgogICAgICAgICAgcmV0dXJuICIkbmFtZVByZWZpeCRiYXNlTmFtZSNpc1NldCI7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbmhhbmRsZWQgY2FzZSBmb3IgZmllbGQgbmFtZS4iKTsKICB9Cn0KCmVudW0gRmllbGROYW1lVHlwZSB7IEZpZWxkLCBHZXR0ZXIsIFNldHRlciwgSXNTZXRGaWVsZCB9CgovLy8gU3RyYXRlZ3kgcGF0dGVybiBmb3IgY3JlYXRpbmcgZGlmZmVyZW50IGVuY29kaW5ncyBvZiBhIGRlY2xhcmVkIGZpZWxkLgovLy8KLy8vIFRoaXMgaXMgdXNlZCB0byBwcm92aWRlIGxvd2VyaW5ncyBmb3IgbGF0ZSBmaWVsZHMgdXNpbmcgc3ludGhlc2l6ZWQgZ2V0dGVycwovLy8gYW5kIHNldHRlcnMuCmFic3RyYWN0IGNsYXNzIEZpZWxkRW5jb2RpbmcgewogIC8vLyBUaGUgdHlwZSBvZiB0aGUgZGVjbGFyZWQgZmllbGQuCiAgRGFydFR5cGUgdHlwZTsKCiAgLy8vIENyZWF0ZXMgdGhlIGJvZGllcyBuZWVkZWQgZm9yIHRoZSBmaWVsZCBlbmNvZGluZyB1c2luZyBbaW5pdGlhbGl6ZXJdIGFzCiAgLy8vIHRoZSBkZWNsYXJlZCBpbml0aWFsaXplciBleHByZXNzaW9uLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZvciBmaWVsZHMgaW4gb3V0bGluZXMgdW5sZXNzIHRoZWlyIGFyZSBjb25zdGFudAogIC8vLyBvciBwYXJ0IG9mIGEgY29uc3QgY29uc3RydWN0b3IuCiAgdm9pZCBjcmVhdGVCb2RpZXMoQ29yZVR5cGVzIGNvcmVUeXBlcywgRXhwcmVzc2lvbiBpbml0aWFsaXplcik7CgogIExpc3Q8SW5pdGlhbGl6ZXI+IGNyZWF0ZUluaXRpYWxpemVyKGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7Ym9vbCBpc1N5bnRoZXRpY30pOwoKICAvLy8gUmVnaXN0ZXJzIHRoYXQgdGhlIChpbXBsaWNpdCkgc2V0dGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZWxkIG5lZWRzIHRvCiAgLy8vIGNvbnRhaW4gYSBydW50aW1lIHR5cGUgY2hlY2sgdG8gZGVhbCB3aXRoIGdlbmVyaWMgY292YXJpYW5jZS4KICB2b2lkIHNldEdlbmVyaWNDb3ZhcmlhbnRJbXBsKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBmaWVsZCB2YWx1ZSBhdCBydW50aW1lLgogIEZpZWxkIGdldCBmaWVsZDsKCiAgLy8vIFJldHVybnMgdGhlIG1lbWJlciB1c2VkIHRvIHJlYWQgdGhlIGZpZWxkIHZhbHVlLgogIE1lbWJlciBnZXQgcmVhZFRhcmdldDsKCiAgLy8vIFJldHVybnMgdGhlIG1lbWJlciB1c2VkIHRvIHdyaXRlIHRvIHRoZSBmaWVsZC4KICBNZW1iZXIgZ2V0IHdyaXRlVGFyZ2V0OwoKICAvLy8gQ3JlYXRlcyB0aGUgbWVtYmVycyBuZWNlc3NhcnkgZm9yIHRoaXMgZmllbGQgZW5jb2RpbmcuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgYm90aCBvdXRsaW5lIGFuZCBmdWxsIGNvbXBpbGF0aW9uIHNvIHRoZSBjcmVhdGVkCiAgLy8vIG1lbWJlcnMgc2hvdWxkIGJlIHdpdGhvdXQgYm9keS4gVGhlIG1lbWJlciBib2RpZXMgYXJlIGNyZWF0ZWQgdGhyb3VnaAogIC8vLyBbY3JlYXRlQm9kaWVzXS4KICB2b2lkIGJ1aWxkKAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciwgU291cmNlRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlcik7CgogIC8vLyBDYWxscyBbZl0gZm9yIGVhY2ggbWVtYmVyIG5lZWRlZCBmb3IgdGhpcyBmaWVsZCBlbmNvZGluZy4KICB2b2lkIHJlZ2lzdGVyTWVtYmVycygKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgU291cmNlRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlciwKICAgICAgdm9pZCBGdW5jdGlvbihNZW1iZXIsIEJ1aWx0TWVtYmVyS2luZCkgZik7CgogIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZmllbGQsIGdldHRlcnMgYW5kIG1ldGhvZHMgY3JlYXRlZCBieSB0aGlzIGZpZWxkCiAgLy8vIGVuY29kaW5nLgogIExpc3Q8Q2xhc3NNZW1iZXI+IGdldExvY2FsTWVtYmVycyhTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyKTsKCiAgLy8vIFJldHVybnMgYSBsaXN0IG9mIHRoZSBzZXR0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBmaWVsZCBlbmNvZGluZy4KICBMaXN0PENsYXNzTWVtYmVyPiBnZXRMb2NhbFNldHRlcnMoU291cmNlRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlcik7CgogIC8vLyBFbnN1cmVzIHRoYXQgdGhlIHNpZ25hdHVyZXMgYWxsIG1lbWJlcnMgY3JlYXRlZCBieSB0aGlzIGZpZWxkIGVuY29kaW5nCiAgLy8vIGFyZSBmdWxseSB0eXBlZC4KICB2b2lkIGNvbXBsZXRlU2lnbmF0dXJlKENvcmVUeXBlcyBjb3JlVHlwZXMpOwp9CgpjbGFzcyBSZWd1bGFyRmllbGRFbmNvZGluZyBpbXBsZW1lbnRzIEZpZWxkRW5jb2RpbmcgewogIEZpZWxkIF9maWVsZDsKCiAgUmVndWxhckZpZWxkRW5jb2RpbmcoVXJpIGZpbGVVcmksIGludCBjaGFyT2Zmc2V0LCBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgRmllbGQgcmVmZXJlbmNlLCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgIF9maWVsZCA9IG5ldyBGaWVsZChudWxsLCBmaWxlVXJpOiBmaWxlVXJpLCByZWZlcmVuY2U6IHJlZmVyZW5jZT8ucmVmZXJlbmNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGNoYXJFbmRPZmZzZXQKICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0gaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGdldCB0eXBlID0+IF9maWVsZC50eXBlOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNldCB0eXBlKERhcnRUeXBlIHZhbHVlKSB7CiAgICBfZmllbGQudHlwZSA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBjb21wbGV0ZVNpZ25hdHVyZShDb3JlVHlwZXMgY29yZVR5cGVzKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGNyZWF0ZUJvZGllcyhDb3JlVHlwZXMgY29yZVR5cGVzLCBFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CiAgICBpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBfZmllbGQuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci4ucGFyZW50ID0gX2ZpZWxkOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxJbml0aWFsaXplcj4gY3JlYXRlSW5pdGlhbGl6ZXIoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtib29sIGlzU3ludGhldGljfSkgewogICAgcmV0dXJuIDxJbml0aWFsaXplcj5bCiAgICAgIG5ldyBGaWVsZEluaXRpYWxpemVyKF9maWVsZCwgdmFsdWUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldAogICAgICAgIC4uaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYwogICAgXTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGQoCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyLCBTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyKSB7CiAgICBfZmllbGQKICAgICAgLi5pc0NvdmFyaWFudCA9IGZpZWxkQnVpbGRlci5pc0NvdmFyaWFudAogICAgICAuLmlzRmluYWwgPSBmaWVsZEJ1aWxkZXIuaXNGaW5hbAogICAgICAuLmlzQ29uc3QgPSBmaWVsZEJ1aWxkZXIuaXNDb25zdDsKICAgIFN0cmluZyBmaWVsZE5hbWU7CiAgICBpZiAoZmllbGRCdWlsZGVyLmlzRXh0ZW5zaW9uTWVtYmVyKSB7CiAgICAgIEV4dGVuc2lvbkJ1aWxkZXIgZXh0ZW5zaW9uID0gZmllbGRCdWlsZGVyLnBhcmVudDsKICAgICAgZmllbGROYW1lID0gU291cmNlRmllbGRCdWlsZGVyLmNyZWF0ZUZpZWxkTmFtZShmYWxzZSwgbnVsbCwgdHJ1ZSwKICAgICAgICAgIGV4dGVuc2lvbi5uYW1lLCBmaWVsZEJ1aWxkZXIubmFtZSwgZmFsc2UsIEZpZWxkTmFtZVR5cGUuRmllbGQpOwogICAgICBfZmllbGQKICAgICAgICAuLmhhc0ltcGxpY2l0R2V0dGVyID0gZmFsc2UKICAgICAgICAuLmhhc0ltcGxpY2l0U2V0dGVyID0gZmFsc2UKICAgICAgICAuLmlzU3RhdGljID0gdHJ1ZQogICAgICAgIC4uaXNFeHRlbnNpb25NZW1iZXIgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgYm9vbCBpc0luc3RhbmNlTWVtYmVyID0KICAgICAgICAgICFmaWVsZEJ1aWxkZXIuaXNTdGF0aWMgJiYgIWZpZWxkQnVpbGRlci5pc1RvcExldmVsOwogICAgICBTdHJpbmcgY2xhc3NOYW1lID0KICAgICAgICAgIGlzSW5zdGFuY2VNZW1iZXIgPyBmaWVsZEJ1aWxkZXIuY2xhc3NCdWlsZGVyLm5hbWUgOiBudWxsOwogICAgICBmaWVsZE5hbWUgPSBTb3VyY2VGaWVsZEJ1aWxkZXIuY3JlYXRlRmllbGROYW1lKAogICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciwKICAgICAgICAgIGNsYXNzTmFtZSwKICAgICAgICAgIGZhbHNlLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIGZpZWxkQnVpbGRlci5uYW1lLAogICAgICAgICAgZmFsc2UsCiAgICAgICAgICBGaWVsZE5hbWVUeXBlLkZpZWxkKTsKICAgICAgX2ZpZWxkCiAgICAgICAgLi5oYXNJbXBsaWNpdEdldHRlciA9IGlzSW5zdGFuY2VNZW1iZXIKICAgICAgICAuLmhhc0ltcGxpY2l0U2V0dGVyID0KICAgICAgICAgICAgaXNJbnN0YW5jZU1lbWJlciAmJiAhZmllbGRCdWlsZGVyLmlzQ29uc3QgJiYgIWZpZWxkQnVpbGRlci5pc0ZpbmFsCiAgICAgICAgLi5pc1N0YXRpYyA9ICFpc0luc3RhbmNlTWVtYmVyCiAgICAgICAgLi5pc0V4dGVuc2lvbk1lbWJlciA9IGZhbHNlOwogICAgfQogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSG93IGNhbiB0aGUgbmFtZSBhbHJlYWR5IGhhdmUgYmVlbiBjb21wdXRlZD8KICAgIF9maWVsZC5uYW1lID8/PSBuZXcgTmFtZShmaWVsZE5hbWUsIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpOwogICAgX2ZpZWxkLmlzTGF0ZSA9IGZpZWxkQnVpbGRlci5pc0xhdGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlZ2lzdGVyTWVtYmVycygKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgU291cmNlRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlciwKICAgICAgdm9pZCBGdW5jdGlvbihNZW1iZXIsIEJ1aWx0TWVtYmVyS2luZCkgZikgewogICAgZigKICAgICAgICBfZmllbGQsCiAgICAgICAgZmllbGRCdWlsZGVyLmlzRXh0ZW5zaW9uTWVtYmVyCiAgICAgICAgICAgID8gQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvbkZpZWxkCiAgICAgICAgICAgIDogQnVpbHRNZW1iZXJLaW5kLkZpZWxkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0R2VuZXJpY0NvdmFyaWFudEltcGwoKSB7CiAgICBfZmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBGaWVsZCBnZXQgZmllbGQgPT4gX2ZpZWxkOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IHJlYWRUYXJnZXQgPT4gX2ZpZWxkOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IHdyaXRlVGFyZ2V0ID0+IF9maWVsZDsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0TG9jYWxNZW1iZXJzKFNvdXJjZUZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIpID0+CiAgICAgIDxDbGFzc01lbWJlcj5bZmllbGRCdWlsZGVyXTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0TG9jYWxTZXR0ZXJzKFNvdXJjZUZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIpID0+CiAgICAgIGNvbnN0IDxDbGFzc01lbWJlcj5bXTsKfQoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMYXRlRmllbGRFbmNvZGluZyBpbXBsZW1lbnRzIEZpZWxkRW5jb2RpbmcgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGludCBmaWxlT2Zmc2V0OwogIERhcnRUeXBlIF90eXBlOwogIEZpZWxkIF9maWVsZDsKICBGaWVsZCBfbGF0ZUlzU2V0RmllbGQ7CiAgUHJvY2VkdXJlIF9sYXRlR2V0dGVyOwogIFByb2NlZHVyZSBfbGF0ZVNldHRlcjsKCiAgQWJzdHJhY3RMYXRlRmllbGRFbmNvZGluZygKICAgICAgdGhpcy5uYW1lLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBGaWVsZCByZWZlcmVuY2VGcm9tLAogICAgICBGaWVsZCBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tLAogICAgICBQcm9jZWR1cmUgZ2V0dGVyUmVmZXJlbmNlRnJvbSwKICAgICAgUHJvY2VkdXJlIHNldHRlclJlZmVyZW5jZUZyb20pCiAgICAgIDogZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQgewogICAgX2ZpZWxkID0KICAgICAgICBuZXcgRmllbGQobnVsbCwgZmlsZVVyaTogZmlsZVVyaSwgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLmZpbGVFbmRPZmZzZXQgPSBjaGFyRW5kT2Zmc2V0CiAgICAgICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSB0cnVlOwogICAgX2xhdGVJc1NldEZpZWxkID0gbmV3IEZpZWxkKG51bGwsCiAgICAgICAgZmlsZVVyaTogZmlsZVVyaSwgcmVmZXJlbmNlOiBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQKICAgICAgLi5maWxlRW5kT2Zmc2V0ID0gY2hhckVuZE9mZnNldAogICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSB0cnVlOwogICAgX2xhdGVHZXR0ZXIgPSBuZXcgUHJvY2VkdXJlKAogICAgICAgIG51bGwsIFByb2NlZHVyZUtpbmQuR2V0dGVyLCBuZXcgRnVuY3Rpb25Ob2RlKG51bGwpLAogICAgICAgIGZpbGVVcmk6IGZpbGVVcmksIHJlZmVyZW5jZTogZ2V0dGVyUmVmZXJlbmNlRnJvbT8ucmVmZXJlbmNlKQogICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgIC4uaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IHRydWU7CiAgICBfbGF0ZVNldHRlciA9IF9jcmVhdGVTZXR0ZXIobmFtZSwgZmlsZVVyaSwgY2hhck9mZnNldCwgc2V0dGVyUmVmZXJlbmNlRnJvbSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNvbXBsZXRlU2lnbmF0dXJlKENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIGlmIChfbGF0ZUlzU2V0RmllbGQgIT0gbnVsbCkgewogICAgICBfbGF0ZUlzU2V0RmllbGQudHlwZSA9IGNvcmVUeXBlcy5ib29sUmF3VHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNyZWF0ZUJvZGllcyhDb3JlVHlwZXMgY29yZVR5cGVzLCBFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CiAgICBhc3NlcnQoX3R5cGUgIT0gbnVsbCwgIlR5cGUgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIGZvciBmaWVsZCAkbmFtZS4iKTsKICAgIF9maWVsZC5pbml0aWFsaXplciA9IG5ldyBOdWxsTGl0ZXJhbCgpLi5wYXJlbnQgPSBfZmllbGQ7CiAgICBpZiAoX3R5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAgIF9sYXRlSXNTZXRGaWVsZC5pbml0aWFsaXplciA9IG5ldyBCb29sTGl0ZXJhbChmYWxzZSkKICAgICAgICAuLnBhcmVudCA9IF9sYXRlSXNTZXRGaWVsZDsKICAgIH0KICAgIF9sYXRlR2V0dGVyLmZ1bmN0aW9uLmJvZHkgPSBfY3JlYXRlR2V0dGVyQm9keShjb3JlVHlwZXMsIG5hbWUsIGluaXRpYWxpemVyKQogICAgICAuLnBhcmVudCA9IF9sYXRlR2V0dGVyLmZ1bmN0aW9uOwogICAgaWYgKF9sYXRlU2V0dGVyICE9IG51bGwpIHsKICAgICAgX2xhdGVTZXR0ZXIuZnVuY3Rpb24uYm9keSA9IF9jcmVhdGVTZXR0ZXJCb2R5KAogICAgICAgICAgY29yZVR5cGVzLCBuYW1lLCBfbGF0ZVNldHRlci5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5maXJzdCkKICAgICAgICAuLnBhcmVudCA9IF9sYXRlU2V0dGVyLmZ1bmN0aW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxJbml0aWFsaXplcj4gY3JlYXRlSW5pdGlhbGl6ZXIoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtib29sIGlzU3ludGhldGljfSkgewogICAgTGlzdDxJbml0aWFsaXplcj4gaW5pdGlhbGl6ZXJzID0gPEluaXRpYWxpemVyPltdOwogICAgaWYgKF9sYXRlSXNTZXRGaWVsZCAhPSBudWxsKSB7CiAgICAgIGluaXRpYWxpemVycy5hZGQobmV3IEZpZWxkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBfbGF0ZUlzU2V0RmllbGQsIG5ldyBCb29sTGl0ZXJhbCh0cnVlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldAogICAgICAgIC4uaXNTeW50aGV0aWMgPSBpc1N5bnRoZXRpYyk7CiAgICB9CiAgICBpbml0aWFsaXplcnMuYWRkKG5ldyBGaWVsZEluaXRpYWxpemVyKF9maWVsZCwgdmFsdWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQKICAgICAgLi5pc1N5bnRoZXRpYyA9IGlzU3ludGhldGljKTsKICAgIHJldHVybiBpbml0aWFsaXplcnM7CiAgfQoKICAvLy8gQ3JlYXRlcyBhbiBbRXhwcmVzc2lvbl0gdGhhdCByZWFkcyBbX2ZpZWxkXS4KICAvLy8KICAvLy8gSWYgW25lZWRzUHJvbW90aW9uXSBpcyBgdHJ1ZWAsIHRoZSBmaWVsZCB3aWxsIGJlIHJlYWQgdGhyb3VnaCBhIGBsZXRgCiAgLy8vIGV4cHJlc3Npb24gdGhhdCBwcm9tb3RlcyB0aGUgZXhwcmVzc2lvbiB0byBbX3R5cGVdLiBUaGlzIGlzIG5lZWRlZCBmb3IgYQogIC8vLyBzb3VuZCBlbmNvZGluZyBvZiBmaWVsZHMgd2l0aCB0eXBlIHZhcmlhYmxlIHR5cGUgb2YgdW5kZXRlcm1pbmVkCiAgLy8vIG51bGxhYmlsaXR5LgogIEV4cHJlc3Npb24gX2NyZWF0ZUZpZWxkUmVhZCh7Ym9vbCBuZWVkc1Byb21vdGlvbjogZmFsc2V9KSB7CiAgICBpZiAobmVlZHNQcm9tb3Rpb24pIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgICAgX2NyZWF0ZUZpZWxkR2V0KF9maWVsZCksCiAgICAgICAgICB0eXBlOiBfdHlwZS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubnVsbGFibGUpKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIHJldHVybiBuZXcgTGV0KAogICAgICAgICAgdmFyaWFibGUsIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSwgX3R5cGUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2NyZWF0ZUZpZWxkR2V0KF9maWVsZCk7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhbiBbRXhwcmVzc2lvbl0gdGhhdCByZWFkcyBbZmllbGRdLgogIEV4cHJlc3Npb24gX2NyZWF0ZUZpZWxkR2V0KEZpZWxkIGZpZWxkKSB7CiAgICBpZiAoZmllbGQuaXNTdGF0aWMpIHsKICAgICAgcmV0dXJuIG5ldyBTdGF0aWNHZXQoZmllbGQpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlHZXQoCiAgICAgICAgICBuZXcgVGhpc0V4cHJlc3Npb24oKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsIGZpZWxkLm5hbWUsIGZpZWxkKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhbiBbRXhwcmVzc2lvbl0gdGhhdCB3cml0ZXMgW3ZhbHVlXSB0byBbZmllbGRdLgogIEV4cHJlc3Npb24gX2NyZWF0ZUZpZWxkU2V0KEZpZWxkIGZpZWxkLCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICBpZiAoZmllbGQuaXNTdGF0aWMpIHsKICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTZXQoZmllbGQsIHZhbHVlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFByb3BlcnR5U2V0KG5ldyBUaGlzRXhwcmVzc2lvbigpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgIGZpZWxkLm5hbWUsIHZhbHVlLCBmaWVsZCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfQogIH0KCiAgU3RhdGVtZW50IF9jcmVhdGVHZXR0ZXJCb2R5KAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBpbml0aWFsaXplcik7CgogIFByb2NlZHVyZSBfY3JlYXRlU2V0dGVyKAogICAgICBTdHJpbmcgbmFtZSwgVXJpIGZpbGVVcmksIGludCBjaGFyT2Zmc2V0LCBQcm9jZWR1cmUgcmVmZXJlbmNlRnJvbSkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbihudWxsKTsKICAgIHJldHVybiBuZXcgUHJvY2VkdXJlKAogICAgICAgIG51bGwsCiAgICAgICAgUHJvY2VkdXJlS2luZC5TZXR0ZXIsCiAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShudWxsLAogICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogW3BhcmFtZXRlcl0sIHJldHVyblR5cGU6IGNvbnN0IFZvaWRUeXBlKCkpLAogICAgICAgIGZpbGVVcmk6IGZpbGVVcmksCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQKICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0gdHJ1ZTsKICB9CgogIFN0YXRlbWVudCBfY3JlYXRlU2V0dGVyQm9keSgKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywgU3RyaW5nIG5hbWUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKTsKCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0IHR5cGUgPT4gX3R5cGU7CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IHR5cGUoRGFydFR5cGUgdmFsdWUpIHsKICAgIGFzc2VydChfdHlwZSA9PSBudWxsIHx8IF90eXBlIGlzIEltcGxpY2l0RmllbGRUeXBlLAogICAgICAgICJUeXBlIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQgZm9yIGZpZWxkICRuYW1lLiIpOwogICAgX3R5cGUgPSB2YWx1ZTsKICAgIGlmICh2YWx1ZSBpcyEgSW1wbGljaXRGaWVsZFR5cGUpIHsKICAgICAgX2ZpZWxkLnR5cGUgPSB2YWx1ZS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubnVsbGFibGUpOwogICAgICBfbGF0ZUdldHRlci5mdW5jdGlvbi5yZXR1cm5UeXBlID0gdmFsdWU7CiAgICAgIGlmIChfbGF0ZVNldHRlciAhPSBudWxsKSB7CiAgICAgICAgX2xhdGVTZXR0ZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuc2luZ2xlLnR5cGUgPSB2YWx1ZTsKICAgICAgfQogICAgICBpZiAoIV90eXBlLmlzUG90ZW50aWFsbHlOdWxsYWJsZSkgewogICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0aGUgaXMtc2V0IGZpZWxkIGlmIHRoZSBmaWVsZCBpcyBwb3RlbnRpYWxseSBudWxsYWJsZS4KICAgICAgICAvLyAgT3RoZXJ3aXNlIHdlIHVzZSBgbnVsbGAgdG8gc2lnbmFsIHRoYXQgdGhlIGZpZWxkIGlzIHVuaW5pdGlhbGl6ZWQuCiAgICAgICAgX2xhdGVJc1NldEZpZWxkID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRHZW5lcmljQ292YXJpYW50SW1wbCgpIHsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IElzIHRoaXMgY29ycmVjdD8gU2hvdWxkIHRoZSBbX2xhdGVTZXR0ZXJdIGJlCiAgICAvLyAgYW5ub3RhdGVkIGluc3RlYWQ/CiAgICBfZmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBGaWVsZCBnZXQgZmllbGQgPT4gX2ZpZWxkOwoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IHJlYWRUYXJnZXQgPT4gX2xhdGVHZXR0ZXI7CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXQgd3JpdGVUYXJnZXQgPT4gX2xhdGVTZXR0ZXI7CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGQoCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyLCBTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyKSB7CiAgICBfZmllbGQuLmlzQ292YXJpYW50ID0gZmllbGRCdWlsZGVyLmlzQ292YXJpYW50OwogICAgYm9vbCBpc0luc3RhbmNlTWVtYmVyOwogICAgU3RyaW5nIGNsYXNzTmFtZTsKICAgIGJvb2wgaXNFeHRlbnNpb25NZW1iZXIgPSBmaWVsZEJ1aWxkZXIuaXNFeHRlbnNpb25NZW1iZXI7CiAgICBTdHJpbmcgZXh0ZW5zaW9uTmFtZTsKICAgIGlmIChpc0V4dGVuc2lvbk1lbWJlcikgewogICAgICBFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbiA9IGZpZWxkQnVpbGRlci5wYXJlbnQ7CiAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb24ubmFtZTsKICAgICAgX2ZpZWxkCiAgICAgICAgLi5oYXNJbXBsaWNpdEdldHRlciA9IGZhbHNlCiAgICAgICAgLi5oYXNJbXBsaWNpdFNldHRlciA9IGZhbHNlCiAgICAgICAgLi5pc1N0YXRpYyA9IHRydWUKICAgICAgICAuLmlzRXh0ZW5zaW9uTWVtYmVyID0gaXNFeHRlbnNpb25NZW1iZXI7CiAgICAgIGlzSW5zdGFuY2VNZW1iZXIgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIGlzSW5zdGFuY2VNZW1iZXIgPSAhZmllbGRCdWlsZGVyLmlzU3RhdGljICYmICFmaWVsZEJ1aWxkZXIuaXNUb3BMZXZlbDsKICAgICAgX2ZpZWxkCiAgICAgICAgLi5oYXNJbXBsaWNpdEdldHRlciA9IGlzSW5zdGFuY2VNZW1iZXIKICAgICAgICAuLmhhc0ltcGxpY2l0U2V0dGVyID0gaXNJbnN0YW5jZU1lbWJlcgogICAgICAgIC4uaXNTdGF0aWMgPSAhaXNJbnN0YW5jZU1lbWJlcgogICAgICAgIC4uaXNFeHRlbnNpb25NZW1iZXIgPSBmYWxzZTsKICAgICAgaWYgKGlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBjbGFzc05hbWUgPSBmaWVsZEJ1aWxkZXIuY2xhc3NCdWlsZGVyLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIF9maWVsZC5uYW1lID8/PSBuZXcgTmFtZSgKICAgICAgICBTb3VyY2VGaWVsZEJ1aWxkZXIuY3JlYXRlRmllbGROYW1lKAogICAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICBjbGFzc05hbWUsCiAgICAgICAgICAgIGlzRXh0ZW5zaW9uTWVtYmVyLAogICAgICAgICAgICBleHRlbnNpb25OYW1lLAogICAgICAgICAgICBmaWVsZEJ1aWxkZXIubmFtZSwKICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgRmllbGROYW1lVHlwZS5GaWVsZCksCiAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICBpZiAoX2xhdGVJc1NldEZpZWxkICE9IG51bGwpIHsKICAgICAgX2xhdGVJc1NldEZpZWxkCiAgICAgICAgLi5uYW1lID0gbmV3IE5hbWUoCiAgICAgICAgICAgIFNvdXJjZUZpZWxkQnVpbGRlci5jcmVhdGVGaWVsZE5hbWUoCiAgICAgICAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICAgICAgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgaXNFeHRlbnNpb25NZW1iZXIsCiAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lLAogICAgICAgICAgICAgICAgZmllbGRCdWlsZGVyLm5hbWUsCiAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgRmllbGROYW1lVHlwZS5Jc1NldEZpZWxkKSwKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeSkKICAgICAgICAuLmlzU3RhdGljID0gIWlzSW5zdGFuY2VNZW1iZXIKICAgICAgICAuLmhhc0ltcGxpY2l0R2V0dGVyID0gaXNJbnN0YW5jZU1lbWJlcgogICAgICAgIC4uaGFzSW1wbGljaXRTZXR0ZXIgPSBpc0luc3RhbmNlTWVtYmVyCiAgICAgICAgLi5pc1N0YXRpYyA9IF9maWVsZC5pc1N0YXRpYwogICAgICAgIC4uaXNFeHRlbnNpb25NZW1iZXIgPSBpc0V4dGVuc2lvbk1lbWJlcjsKICAgIH0KICAgIF9sYXRlR2V0dGVyCiAgICAgIC4ubmFtZSA9IG5ldyBOYW1lKAogICAgICAgICAgU291cmNlRmllbGRCdWlsZGVyLmNyZWF0ZUZpZWxkTmFtZSgKICAgICAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICAgIGNsYXNzTmFtZSwKICAgICAgICAgICAgICBpc0V4dGVuc2lvbk1lbWJlciwKICAgICAgICAgICAgICBleHRlbnNpb25OYW1lLAogICAgICAgICAgICAgIGZpZWxkQnVpbGRlci5uYW1lLAogICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgRmllbGROYW1lVHlwZS5HZXR0ZXIpLAogICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeSkKICAgICAgLi5pc1N0YXRpYyA9ICFpc0luc3RhbmNlTWVtYmVyCiAgICAgIC4uaXNFeHRlbnNpb25NZW1iZXIgPSBpc0V4dGVuc2lvbk1lbWJlcjsKICAgIGlmIChfbGF0ZVNldHRlciAhPSBudWxsKSB7CiAgICAgIF9sYXRlU2V0dGVyCiAgICAgICAgLi5uYW1lID0gbmV3IE5hbWUoCiAgICAgICAgICAgIFNvdXJjZUZpZWxkQnVpbGRlci5jcmVhdGVGaWVsZE5hbWUoCiAgICAgICAgICAgICAgICBpc0luc3RhbmNlTWVtYmVyLAogICAgICAgICAgICAgICAgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgaXNFeHRlbnNpb25NZW1iZXIsCiAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lLAogICAgICAgICAgICAgICAgZmllbGRCdWlsZGVyLm5hbWUsCiAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgRmllbGROYW1lVHlwZS5TZXR0ZXIpLAogICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5saWJyYXJ5KQogICAgICAgIC4uaXNTdGF0aWMgPSAhaXNJbnN0YW5jZU1lbWJlcgogICAgICAgIC4uaXNFeHRlbnNpb25NZW1iZXIgPSBpc0V4dGVuc2lvbk1lbWJlcjsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVnaXN0ZXJNZW1iZXJzKAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyLAogICAgICB2b2lkIEZ1bmN0aW9uKE1lbWJlciwgQnVpbHRNZW1iZXJLaW5kKSBmKSB7CiAgICBmKAogICAgICAgIF9maWVsZCwKICAgICAgICBmaWVsZEJ1aWxkZXIuaXNFeHRlbnNpb25NZW1iZXIKICAgICAgICAgICAgPyBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uRmllbGQKICAgICAgICAgICAgOiBCdWlsdE1lbWJlcktpbmQuRmllbGQpOwogICAgaWYgKF9sYXRlSXNTZXRGaWVsZCAhPSBudWxsKSB7CiAgICAgIGYoX2xhdGVJc1NldEZpZWxkLCBCdWlsdE1lbWJlcktpbmQuTGF0ZUlzU2V0RmllbGQpOwogICAgfQogICAgZihfbGF0ZUdldHRlciwgQnVpbHRNZW1iZXJLaW5kLkxhdGVHZXR0ZXIpOwogICAgaWYgKF9sYXRlU2V0dGVyICE9IG51bGwpIHsKICAgICAgZihfbGF0ZVNldHRlciwgQnVpbHRNZW1iZXJLaW5kLkxhdGVTZXR0ZXIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0TG9jYWxNZW1iZXJzKFNvdXJjZUZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIpIHsKICAgIExpc3Q8Q2xhc3NNZW1iZXI+IGxpc3QgPSA8Q2xhc3NNZW1iZXI+WwogICAgICBuZXcgX0NsYXNzTWVtYmVyKGZpZWxkQnVpbGRlciwgZmllbGQpLAogICAgICBuZXcgX0NsYXNzTWVtYmVyKGZpZWxkQnVpbGRlciwgX2xhdGVHZXR0ZXIpCiAgICBdOwogICAgaWYgKF9sYXRlSXNTZXRGaWVsZCAhPSBudWxsKSB7CiAgICAgIGxpc3QuYWRkKG5ldyBfQ2xhc3NNZW1iZXIoZmllbGRCdWlsZGVyLCBfbGF0ZUlzU2V0RmllbGQpKTsKICAgIH0KICAgIHJldHVybiBsaXN0OwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0TG9jYWxTZXR0ZXJzKFNvdXJjZUZpZWxkQnVpbGRlciBmaWVsZEJ1aWxkZXIpIHsKICAgIHJldHVybiBfbGF0ZVNldHRlciA9PSBudWxsCiAgICAgICAgPyBjb25zdCA8Q2xhc3NNZW1iZXI+W10KICAgICAgICA6IDxDbGFzc01lbWJlcj5bbmV3IF9DbGFzc01lbWJlcihmaWVsZEJ1aWxkZXIsIF9sYXRlU2V0dGVyKV07CiAgfQp9CgptaXhpbiBOb25GaW5hbExhdGUgb24gQWJzdHJhY3RMYXRlRmllbGRFbmNvZGluZyB7CiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IF9jcmVhdGVTZXR0ZXJCb2R5KAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBTdHJpbmcgbmFtZSwgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIpIHsKICAgIGFzc2VydChfdHlwZSAhPSBudWxsLCAiVHlwZSBoYXMgbm90IGJlZW4gY29tcHV0ZWQgZm9yIGZpZWxkICRuYW1lLiIpOwogICAgcmV0dXJuIGxhdGVfbG93ZXJpbmcuY3JlYXRlU2V0dGVyQm9keShmaWxlT2Zmc2V0LCBuYW1lLCBwYXJhbWV0ZXIsIF90eXBlLAogICAgICAgIHNob3VsZFJldHVyblZhbHVlOiBmYWxzZSwKICAgICAgICBjcmVhdGVWYXJpYWJsZVdyaXRlOiAoRXhwcmVzc2lvbiB2YWx1ZSkgPT4KICAgICAgICAgICAgX2NyZWF0ZUZpZWxkU2V0KF9maWVsZCwgdmFsdWUpLAogICAgICAgIGNyZWF0ZUlzU2V0V3JpdGU6IChFeHByZXNzaW9uIHZhbHVlKSA9PgogICAgICAgICAgICBfY3JlYXRlRmllbGRTZXQoX2xhdGVJc1NldEZpZWxkLCB2YWx1ZSkpOwogIH0KfQoKbWl4aW4gTGF0ZVdpdGhvdXRJbml0aWFsaXplciBvbiBBYnN0cmFjdExhdGVGaWVsZEVuY29kaW5nIHsKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgX2NyZWF0ZUdldHRlckJvZHkoCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsIFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CiAgICBhc3NlcnQoX3R5cGUgIT0gbnVsbCwgIlR5cGUgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIGZvciBmaWVsZCAkbmFtZS4iKTsKICAgIHJldHVybiBsYXRlX2xvd2VyaW5nLmNyZWF0ZUdldHRlckJvZHlXaXRob3V0SW5pdGlhbGl6ZXIoCiAgICAgICAgY29yZVR5cGVzLCBmaWxlT2Zmc2V0LCBuYW1lLCB0eXBlLCAnRmllbGQnLAogICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZDogX2NyZWF0ZUZpZWxkUmVhZCwKICAgICAgICBjcmVhdGVJc1NldFJlYWQ6ICgpID0+IF9jcmVhdGVGaWVsZEdldChfbGF0ZUlzU2V0RmllbGQpKTsKICB9Cn0KCmNsYXNzIExhdGVGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nIGV4dGVuZHMgQWJzdHJhY3RMYXRlRmllbGRFbmNvZGluZwogICAgd2l0aCBOb25GaW5hbExhdGUsIExhdGVXaXRob3V0SW5pdGlhbGl6ZXIgewogIExhdGVGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nKAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgRmllbGQgcmVmZXJlbmNlRnJvbSwKICAgICAgRmllbGQgbGF0ZUlzU2V0UmVmZXJlbmNlRnJvbSwKICAgICAgUHJvY2VkdXJlIGdldHRlclJlZmVyZW5jZUZyb20sCiAgICAgIFByb2NlZHVyZSBzZXR0ZXJSZWZlcmVuY2VGcm9tKQogICAgICA6IHN1cGVyKG5hbWUsIGZpbGVVcmksIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQsIHJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgIGxhdGVJc1NldFJlZmVyZW5jZUZyb20sIGdldHRlclJlZmVyZW5jZUZyb20sIHNldHRlclJlZmVyZW5jZUZyb20pOwp9CgpjbGFzcyBMYXRlRmllbGRXaXRoSW5pdGlhbGl6ZXJFbmNvZGluZyBleHRlbmRzIEFic3RyYWN0TGF0ZUZpZWxkRW5jb2RpbmcKICAgIHdpdGggTm9uRmluYWxMYXRlIHsKICBMYXRlRmllbGRXaXRoSW5pdGlhbGl6ZXJFbmNvZGluZygKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIFVyaSBmaWxlVXJpLAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIEZpZWxkIHJlZmVyZW5jZUZyb20sCiAgICAgIEZpZWxkIGxhdGVJc1NldFJlZmVyZW5jZUZyb20sCiAgICAgIFByb2NlZHVyZSBnZXR0ZXJSZWZlcmVuY2VGcm9tLAogICAgICBQcm9jZWR1cmUgc2V0dGVyUmVmZXJlbmNlRnJvbSkKICAgICAgOiBzdXBlcihuYW1lLCBmaWxlVXJpLCBjaGFyT2Zmc2V0LCBjaGFyRW5kT2Zmc2V0LCByZWZlcmVuY2VGcm9tLAogICAgICAgICAgICBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tLCBnZXR0ZXJSZWZlcmVuY2VGcm9tLCBzZXR0ZXJSZWZlcmVuY2VGcm9tKTsKCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IF9jcmVhdGVHZXR0ZXJCb2R5KAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBpbml0aWFsaXplcikgewogICAgYXNzZXJ0KF90eXBlICE9IG51bGwsICJUeXBlIGhhcyBub3QgYmVlbiBjb21wdXRlZCBmb3IgZmllbGQgJG5hbWUuIik7CiAgICByZXR1cm4gbGF0ZV9sb3dlcmluZy5jcmVhdGVHZXR0ZXJXaXRoSW5pdGlhbGl6ZXIoCiAgICAgICAgZmlsZU9mZnNldCwgbmFtZSwgX3R5cGUsIGluaXRpYWxpemVyLAogICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZDogX2NyZWF0ZUZpZWxkUmVhZCwKICAgICAgICBjcmVhdGVWYXJpYWJsZVdyaXRlOiAoRXhwcmVzc2lvbiB2YWx1ZSkgPT4KICAgICAgICAgICAgX2NyZWF0ZUZpZWxkU2V0KF9maWVsZCwgdmFsdWUpLAogICAgICAgIGNyZWF0ZUlzU2V0UmVhZDogKCkgPT4gX2NyZWF0ZUZpZWxkR2V0KF9sYXRlSXNTZXRGaWVsZCksCiAgICAgICAgY3JlYXRlSXNTZXRXcml0ZTogKEV4cHJlc3Npb24gdmFsdWUpID0+CiAgICAgICAgICAgIF9jcmVhdGVGaWVsZFNldChfbGF0ZUlzU2V0RmllbGQsIHZhbHVlKSk7CiAgfQp9CgpjbGFzcyBMYXRlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nIGV4dGVuZHMgQWJzdHJhY3RMYXRlRmllbGRFbmNvZGluZwogICAgd2l0aCBMYXRlV2l0aG91dEluaXRpYWxpemVyIHsKICBMYXRlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nKAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgRmllbGQgcmVmZXJlbmNlRnJvbSwKICAgICAgRmllbGQgbGF0ZUlzU2V0UmVmZXJlbmNlRnJvbSwKICAgICAgUHJvY2VkdXJlIGdldHRlclJlZmVyZW5jZUZyb20sCiAgICAgIFByb2NlZHVyZSBzZXR0ZXJSZWZlcmVuY2VGcm9tKQogICAgICA6IHN1cGVyKG5hbWUsIGZpbGVVcmksIGNoYXJPZmZzZXQsIGNoYXJFbmRPZmZzZXQsIHJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgIGxhdGVJc1NldFJlZmVyZW5jZUZyb20sIGdldHRlclJlZmVyZW5jZUZyb20sIHNldHRlclJlZmVyZW5jZUZyb20pOwoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgX2NyZWF0ZVNldHRlckJvZHkoCiAgICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsIFN0cmluZyBuYW1lLCBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlcikgewogICAgYXNzZXJ0KF90eXBlICE9IG51bGwsICJUeXBlIGhhcyBub3QgYmVlbiBjb21wdXRlZCBmb3IgZmllbGQgJG5hbWUuIik7CiAgICByZXR1cm4gbGF0ZV9sb3dlcmluZy5jcmVhdGVTZXR0ZXJCb2R5RmluYWwoCiAgICAgICAgY29yZVR5cGVzLCBmaWxlT2Zmc2V0LCBuYW1lLCBwYXJhbWV0ZXIsIHR5cGUsICdGaWVsZCcsCiAgICAgICAgc2hvdWxkUmV0dXJuVmFsdWU6IGZhbHNlLAogICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZDogKCkgPT4gX2NyZWF0ZUZpZWxkR2V0KF9maWVsZCksCiAgICAgICAgY3JlYXRlVmFyaWFibGVXcml0ZTogKEV4cHJlc3Npb24gdmFsdWUpID0+CiAgICAgICAgICAgIF9jcmVhdGVGaWVsZFNldChfZmllbGQsIHZhbHVlKSwKICAgICAgICBjcmVhdGVJc1NldFJlYWQ6ICgpID0+IF9jcmVhdGVGaWVsZEdldChfbGF0ZUlzU2V0RmllbGQpLAogICAgICAgIGNyZWF0ZUlzU2V0V3JpdGU6IChFeHByZXNzaW9uIHZhbHVlKSA9PgogICAgICAgICAgICBfY3JlYXRlRmllbGRTZXQoX2xhdGVJc1NldEZpZWxkLCB2YWx1ZSkpOwogIH0KfQoKY2xhc3MgTGF0ZUZpbmFsRmllbGRXaXRoSW5pdGlhbGl6ZXJFbmNvZGluZyBleHRlbmRzIEFic3RyYWN0TGF0ZUZpZWxkRW5jb2RpbmcgewogIExhdGVGaW5hbEZpZWxkV2l0aEluaXRpYWxpemVyRW5jb2RpbmcoCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBGaWVsZCByZWZlcmVuY2VGcm9tLAogICAgICBGaWVsZCBsYXRlSXNTZXRSZWZlcmVuY2VGcm9tLAogICAgICBQcm9jZWR1cmUgZ2V0dGVyUmVmZXJlbmNlRnJvbSwKICAgICAgUHJvY2VkdXJlIHNldHRlclJlZmVyZW5jZUZyb20pCiAgICAgIDogc3VwZXIobmFtZSwgZmlsZVVyaSwgY2hhck9mZnNldCwgY2hhckVuZE9mZnNldCwgcmVmZXJlbmNlRnJvbSwKICAgICAgICAgICAgbGF0ZUlzU2V0UmVmZXJlbmNlRnJvbSwgZ2V0dGVyUmVmZXJlbmNlRnJvbSwgc2V0dGVyUmVmZXJlbmNlRnJvbSk7CiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IF9jcmVhdGVHZXR0ZXJCb2R5KAogICAgICBDb3JlVHlwZXMgY29yZVR5cGVzLCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBpbml0aWFsaXplcikgewogICAgYXNzZXJ0KF90eXBlICE9IG51bGwsICJUeXBlIGhhcyBub3QgYmVlbiBjb21wdXRlZCBmb3IgZmllbGQgJG5hbWUuIik7CiAgICByZXR1cm4gbGF0ZV9sb3dlcmluZy5jcmVhdGVHZXR0ZXJXaXRoSW5pdGlhbGl6ZXJXaXRoUmVjaGVjaygKICAgICAgICBjb3JlVHlwZXMsIGZpbGVPZmZzZXQsIG5hbWUsIF90eXBlLCAnRmllbGQnLCBpbml0aWFsaXplciwKICAgICAgICBjcmVhdGVWYXJpYWJsZVJlYWQ6IF9jcmVhdGVGaWVsZFJlYWQsCiAgICAgICAgY3JlYXRlVmFyaWFibGVXcml0ZTogKEV4cHJlc3Npb24gdmFsdWUpID0+CiAgICAgICAgICAgIF9jcmVhdGVGaWVsZFNldChfZmllbGQsIHZhbHVlKSwKICAgICAgICBjcmVhdGVJc1NldFJlYWQ6ICgpID0+IF9jcmVhdGVGaWVsZEdldChfbGF0ZUlzU2V0RmllbGQpLAogICAgICAgIGNyZWF0ZUlzU2V0V3JpdGU6IChFeHByZXNzaW9uIHZhbHVlKSA9PgogICAgICAgICAgICBfY3JlYXRlRmllbGRTZXQoX2xhdGVJc1NldEZpZWxkLCB2YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlIF9jcmVhdGVTZXR0ZXIoCiAgICAgICAgICBTdHJpbmcgbmFtZSwgVXJpIGZpbGVVcmksIGludCBjaGFyT2Zmc2V0LCBQcm9jZWR1cmUgcmVmZXJlbmNlRnJvbSkgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IF9jcmVhdGVTZXR0ZXJCb2R5KAogICAgICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywgU3RyaW5nIG5hbWUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyKSA9PgogICAgICBudWxsOwp9CgpjbGFzcyBfQ2xhc3NNZW1iZXIgaW1wbGVtZW50cyBDbGFzc01lbWJlciB7CiAgZmluYWwgU291cmNlRmllbGRCdWlsZGVyIGZpZWxkQnVpbGRlcjsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTWVtYmVyIG1lbWJlcjsKCiAgX0NsYXNzTWVtYmVyKHRoaXMuZmllbGRCdWlsZGVyLCB0aGlzLm1lbWJlcik7CgogIEBvdmVycmlkZQogIENsYXNzQnVpbGRlciBnZXQgY2xhc3NCdWlsZGVyID0+IGZpZWxkQnVpbGRlci5jbGFzc0J1aWxkZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRHVwbGljYXRlID0+IGZpZWxkQnVpbGRlci5pc0R1cGxpY2F0ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gZmllbGRCdWlsZGVyLmlzU3RhdGljOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpZWxkID0+IG1lbWJlciBpcyBGaWVsZDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlIHsKICAgIE1lbWJlciBmaWVsZCA9IG1lbWJlcjsKICAgIHJldHVybiBmaWVsZCBpcyBGaWVsZCAmJiBmaWVsZC5oYXNTZXR0ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1NldHRlciB7CiAgICBNZW1iZXIgcHJvY2VkdXJlID0gbWVtYmVyOwogICAgcmV0dXJuIHByb2NlZHVyZSBpcyBQcm9jZWR1cmUgJiYgcHJvY2VkdXJlLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0dldHRlciB7CiAgICBNZW1iZXIgcHJvY2VkdXJlID0gbWVtYmVyOwogICAgcmV0dXJuIHByb2NlZHVyZSBpcyBQcm9jZWR1cmUgJiYgcHJvY2VkdXJlLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0ZpbmFsIHsKICAgIE1lbWJlciBmaWVsZCA9IG1lbWJlcjsKICAgIHJldHVybiBmaWVsZCBpcyBGaWVsZCAmJiBmaWVsZC5pc0ZpbmFsOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdCB7CiAgICBNZW1iZXIgZmllbGQgPSBtZW1iZXI7CiAgICByZXR1cm4gZmllbGQgaXMgRmllbGQgJiYgZmllbGQuaXNDb25zdDsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gZmllbGRC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a2luZC5kYXJ0JwogICAgc2hvdwogICAgICAgIGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZCwKICAgICAgICBpc09wdGlvbmFsTmFtZWRGb3JtYWxQYXJhbWV0ZXJLaW5kLAogICAgICAgIGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZDsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvcGFyc2VyLmRhcnQnCiAgICBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdyBEeW5hbWljVHlwZSwgRXhwcmVzc2lvbiwgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCc7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnQnIHNob3cgU291cmNlTG9hZGVyOwoKaW1wb3J0ICcuLi9rZXJuZWwvYm9keV9idWlsZGVyLmRhcnQnIHNob3cgQm9keUJ1aWxkZXI7CgppbXBvcnQgJy4uL2tlcm5lbC9pbnRlcm5hbF9hc3QuZGFydCcgc2hvdyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbDsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2NvbnN0cnVjdG9yX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnZmllbGRfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbWV0YWRhdGFfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtb2RpZmllcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd2YXJpYWJsZV9idWlsZGVyLmRhcnQnOwoKLy8vIEEgYnVpbGRlciBmb3IgYSBmb3JtYWwgcGFyYW1ldGVyLCBpLmUuIGEgcGFyYW1ldGVyIG9uIGEgbWV0aG9kIG9yCi8vLyBjb25zdHJ1Y3Rvci4KY2xhc3MgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBleHRlbmRzIE1vZGlmaWVyQnVpbGRlckltcGwKICAgIGltcGxlbWVudHMgVmFyaWFibGVCdWlsZGVyIHsKICAvLy8gTGlzdCBvZiBtZXRhZGF0YSBidWlsZGVycyBmb3IgdGhlIG1ldGFkYXRhIGRlY2xhcmVkIG9uIHRoaXMgcGFyYW1ldGVyLgogIGZpbmFsIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YTsKCiAgZmluYWwgaW50IG1vZGlmaWVyczsKCiAgZmluYWwgVHlwZUJ1aWxkZXIgdHlwZTsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUga2luZCBvZiB0aGlzIHBhcmFtZXRlciwgaS5lLiBpZiBpdCdzIHJlcXVpcmVkLCBwb3NpdGlvbmFsIG9wdGlvbmFsLAogIC8vLyBvciBuYW1lZCBvcHRpb25hbC4KICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQgPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeTsKCiAgLy8vIFRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBjcmVhdGVkIGZvciB0aGlzIGZvcm1hbCBwYXJhbWV0ZXIuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKCiAgLy8vIFRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgYW55LgogIC8vLwogIC8vLyBUaGlzIGlzIHN0b3JlZCB1bnRpbCBvdXRsaW5lcyBoYXZlIGJlZW4gYnVpbHQgdGhyb3VnaAogIC8vLyBbYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnNdLgogIFRva2VuIGluaXRpYWxpemVyVG9rZW47CgogIGJvb2wgaW5pdGlhbGl6ZXJXYXNJbmZlcnJlZCA9IGZhbHNlOwoKICAvLy8gVHJ1ZSBpZiB0aGUgaW5pdGlhbGl6ZXIgd2FzIGRlY2xhcmVkIGJ5IHRoZSBwcm9ncmFtbWVyLgogIGJvb2wgaGFzRGVjbGFyZWRJbml0aWFsaXplciA9IGZhbHNlOwoKICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKHRoaXMubWV0YWRhdGEsIHRoaXMubW9kaWZpZXJzLCB0aGlzLnR5cGUsIHRoaXMubmFtZSwKICAgICAgTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCwKICAgICAgW1VyaSBmaWxlVXJpXSkKICAgICAgOiBzdXBlcihjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiRm9ybWFsUGFyYW1ldGVyQnVpbGRlciI7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENsZWFudXAgYGlzUmVxdWlyZWRgIHNlbWFudGljcyBpbiBmYWNlIG9mIHJlcXVpcmVkCiAgLy8gbmFtZWQgcGFyYW1ldGVycy4KICBib29sIGdldCBpc1JlcXVpcmVkID0+IGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZChraW5kKTsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVuYW1lIHRvIGBpc1JlcXVpcmVkYC4KICBib29sIGdldCBpc05hbWVkUmVxdWlyZWQgPT4gKG1vZGlmaWVycyAmIHJlcXVpcmVkTWFzaykgIT0gMDsKCiAgYm9vbCBnZXQgaXNQb3NpdGlvbmFsIHsKICAgIHJldHVybiBpc09wdGlvbmFsUG9zaXRpb25hbEZvcm1hbFBhcmFtZXRlcktpbmQoa2luZCkgfHwKICAgICAgICBpc01hbmRhdG9yeUZvcm1hbFBhcmFtZXRlcktpbmQoa2luZCk7CiAgfQoKICBib29sIGdldCBpc05hbWVkID0+IGlzT3B0aW9uYWxOYW1lZEZvcm1hbFBhcmFtZXRlcktpbmQoa2luZCk7CgogIGJvb2wgZ2V0IGlzT3B0aW9uYWwgPT4gIWlzUmVxdWlyZWQ7CgogIGJvb2wgZ2V0IGlzTG9jYWwgPT4gdHJ1ZTsKCiAgYm9vbCBnZXQgaXNJbml0aWFsaXppbmdGb3JtYWwgPT4gKG1vZGlmaWVycyAmIGluaXRpYWxpemluZ0Zvcm1hbE1hc2spICE9IDA7CgogIGJvb2wgZ2V0IGlzQ292YXJpYW50ID0+IChtb2RpZmllcnMgJiBjb3ZhcmlhbnRNYXNrKSAhPSAwOwoKICAvLyBBbiBpbml0aWFsaXppbmcgZm9ybWFsIHBhcmFtZXRlciBtaWdodCBiZSBmaW5hbCB3aXRob3V0IGl0cwogIC8vIFZhcmlhYmxlRGVjbGFyYXRpb24gYmVpbmcgZmluYWwuIFNlZQogIC8vIFtQcm9jZWR1cmVCdWlsZGVyLmNvbXB1dGVGb3JtYWxQYXJhbWV0ZXJJbml0aWFsaXplclNjb3BlXS4uCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlID0+IHZhcmlhYmxlLmlzQXNzaWduYWJsZSAmJiAhaXNJbml0aWFsaXppbmdGb3JtYWw7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gbmFtZTsKCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBidWlsZCgKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICBpZiAodmFyaWFibGUgPT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbChuYW1lLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwKICAgICAgICAgIHR5cGU6IHR5cGU/LmJ1aWxkKGxpYnJhcnkpLAogICAgICAgICAgaXNGaW5hbDogaXNGaW5hbCwKICAgICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgICBpc0ZpZWxkRm9ybWFsOiBpc0luaXRpYWxpemluZ0Zvcm1hbCwKICAgICAgICAgIGlzQ292YXJpYW50OiBpc0NvdmFyaWFudCwKICAgICAgICAgIGlzUmVxdWlyZWQ6IGlzTmFtZWRSZXF1aXJlZCwKICAgICAgICAgIGhhc0RlY2xhcmVkSW5pdGlhbGl6ZXI6IGhhc0RlY2xhcmVkSW5pdGlhbGl6ZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgIH0KICAgIHJldHVybiB2YXJpYWJsZTsKICB9CgogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiAgSXQncyBub3QgY2xlYXIgaG93IFttZXRhZGF0YV0gaXMgdXNlZCBjdXJyZW50bHksIGFuZAogICAgLy8gaG93IGl0IHNob3VsZCBiZSBjbG9uZWQuICBDb25zaWRlciBjbG9uaW5nIGl0IGluc3RlYWQgb2YgcmV1c2luZyBpdC4KICAgIHJldHVybiBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihtZXRhZGF0YSwgbW9kaWZpZXJzLAogICAgICAgIHR5cGU/LmNsb25lKG5ld1R5cGVzKSwgbmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKQogICAgICAuLmtpbmQgPSBraW5kOwogIH0KCiAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JGb3JtYWxQYXJhbWV0ZXJJbml0aWFsaXplclNjb3BlKCkgewogICAgYXNzZXJ0KHZhcmlhYmxlICE9IG51bGwpOwogICAgcmV0dXJuICFpc0luaXRpYWxpemluZ0Zvcm1hbAogICAgICAgID8gdGhpcwogICAgICAgIDogKG5ldyBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyKAogICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgbW9kaWZpZXJzIHwgZmluYWxNYXNrIHwgaW5pdGlhbGl6aW5nRm9ybWFsTWFzaywKICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgZmlsZVVyaSkKICAgICAgICAgIC4ucGFyZW50ID0gcGFyZW50CiAgICAgICAgICAuLnZhcmlhYmxlID0gdmFyaWFibGUpOwogIH0KCiAgdm9pZCBmaW5hbGl6ZUluaXRpYWxpemluZ0Zvcm1hbChDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyKSB7CiAgICBhc3NlcnQodmFyaWFibGUudHlwZSA9PSBudWxsKTsKICAgIEJ1aWxkZXIgZmllbGRCdWlsZGVyID0gY2xhc3NCdWlsZGVyLmxvb2t1cExvY2FsTWVtYmVyKG5hbWUpOwogICAgaWYgKGZpZWxkQnVpbGRlciBpcyBGaWVsZEJ1aWxkZXIpIHsKICAgICAgdmFyaWFibGUudHlwZSA9IGZpZWxkQnVpbGRlci5pbmZlclR5cGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhcmlhYmxlLnR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogIH0KCiAgLy8vIEJ1aWxkcyB0aGUgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoaXMgW2luaXRpYWxpemVyVG9rZW5dIGlmIHRoaXMgaXMgYQogIC8vLyBmb3JtYWwgcGFyYW1ldGVyIG9uIGEgY29uc3QgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgbWV0aG9kLgogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgLy8gRm9yIG1vZHVsYXIgY29tcGlsYXRpb24gd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycyBmb3Igb3B0aW9uYWwKICAgIC8vIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIG9mIGNvbnN0IGNvbnN0cnVjdG9ycyBpbnRvIHRoZSBvdXRsaW5lIC0gdG8gZW5hYmxlCiAgICAvLyBjb25zdGFudCBldmFsdWF0aW9uLiBTaW1pbGFybHkgd2UgbmVlZCB0byBpbmNsdWRlIGluaXRpYWxpemVycyBmb3IKICAgIC8vIG9wdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIG9mIGluc3RhbmNlIG1ldGhvZHMgYmVjYXVzZSB0aGVzZSBtaWdodCBiZQogICAgLy8gbmVlZGVkIHRvIGdlbmVyYXRlZCBub1N1Y2hNZXRob2QgZm9yd2FyZGVycy4KICAgIGJvb2wgaXNDb25zdENvbnN0cnVjdG9yUGFyYW1ldGVyID0gZmFsc2U7CiAgICBpZiAocGFyZW50IGlzIENvbnN0cnVjdG9yQnVpbGRlcikgewogICAgICBDb25zdHJ1Y3RvckJ1aWxkZXIgY29uc3RydWN0b3JCdWlsZGVyID0gcGFyZW50OwogICAgICBpc0NvbnN0Q29uc3RydWN0b3JQYXJhbWV0ZXIgPSBjb25zdHJ1Y3RvckJ1aWxkZXIuY29uc3RydWN0b3IuaXNDb25zdDsKICAgIH0KICAgIGlmICgoaXNDb25zdENvbnN0cnVjdG9yUGFyYW1ldGVyIHx8IHBhcmVudC5pc0NsYXNzSW5zdGFuY2VNZW1iZXIpICYmCiAgICAgICAgaW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIGZpbmFsIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIgPSBwYXJlbnQucGFyZW50OwogICAgICBTY29wZSBzY29wZSA9IGNsYXNzQnVpbGRlci5zY29wZTsKICAgICAgQm9keUJ1aWxkZXIgYm9keUJ1aWxkZXIgPSBsaWJyYXJ5LmxvYWRlcgogICAgICAgICAgLmNyZWF0ZUJvZHlCdWlsZGVyRm9yT3V0bGluZUV4cHJlc3Npb24oCiAgICAgICAgICAgICAgbGlicmFyeSwgY2xhc3NCdWlsZGVyLCB0aGlzLCBzY29wZSwgZmlsZVVyaSk7CiAgICAgIGJvZHlCdWlsZGVyLmNvbnN0YW50Q29udGV4dCA9IENvbnN0YW50Q29udGV4dC5yZXF1aXJlZDsKICAgICAgYXNzZXJ0KCFpbml0aWFsaXplcldhc0luZmVycmVkKTsKICAgICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9CiAgICAgICAgICBib2R5QnVpbGRlci5wYXJzZUZpZWxkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXJUb2tlbik7CiAgICAgIGluaXRpYWxpemVyID0gYm9keUJ1aWxkZXIudHlwZUluZmVycmVyPy5pbmZlclBhcmFtZXRlckluaXRpYWxpemVyKAogICAgICAgICAgYm9keUJ1aWxkZXIsIGluaXRpYWxpemVyLCB2YXJpYWJsZS50eXBlLCBoYXNEZWNsYXJlZEluaXRpYWxpemVyKTsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciBpcyBTb3VyY2VMb2FkZXIpIHsKICAgICAgICBTb3VyY2VMb2FkZXIgbG9hZGVyID0gbGlicmFyeS5sb2FkZXI7CiAgICAgICAgbG9hZGVyLnRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoCiAgICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgICBib2R5QnVpbGRlci50cmFuc2Zvcm1TZXRMaXRlcmFscywKICAgICAgICAgICAgYm9keUJ1aWxkZXIudHJhbnNmb3JtQ29sbGVjdGlvbnMsCiAgICAgICAgICAgIGxpYnJhcnkubGlicmFyeSk7CiAgICAgIH0KICAgICAgaW5pdGlhbGl6ZXJXYXNJbmZlcnJlZCA9IHRydWU7CiAgICAgIGJvZHlCdWlsZGVyLnJlc29sdmVSZWRpcmVjdGluZ0ZhY3RvcnlUYXJnZXRzKCk7CiAgICB9CiAgICBpbml0aWFsaXplclRva2VuID0gbnVsbDsKICB9Cn0KgM0ATk48ASgBSwkoLDEBPB4BSgEhNwE4ARsBIwFKATkBNwFDARcdIx0fICAcIAFGETkhTSgBFwEaARUBThk8AUIgATQGPCEaAScBPicBTjYVNQE0AU0XPwEyPwEaPC4EAUABJgEcAU4BPAFBKkFLAQwoAR1AHEkmHBwvJCc6IwYVBAE9TUw7QhUEAUAeIQ8nFjwSEhIYFRwiBAE/I0EoMA0rBgQBSUI5TE9KUDQuKDZMBkkkNygvMjw+Jx8/SUw9LC4nFi4uHgglNgYdBAIBQXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0ZWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZnVuY3Rpb25fYnVpbGRlci5kYXJ0wABICC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnByb2NlZHVyZV9idWlsZGVyOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FwaS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKCmltcG9ydCAnLi4vaWRlbnRpZmllcnMuZGFydCc7CmltcG9ydCAnLi4vc2NvcGUuZGFydCc7CgppbXBvcnQgJy4uL2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyOwppbXBvcnQgJy4uL2tlcm5lbC9pbnRlcm5hbF9hc3QuZGFydCcgc2hvdyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbDsKaW1wb3J0ICcuLi9rZXJuZWwvcmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JwogICAgc2hvdwogICAgICAgIG1lc3NhZ2VOb25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZSwKICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoLAogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLAogICAgICAgIG1lc3NhZ2VQYXRjaE5vbkV4dGVybmFsLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZUVycm9yLAogICAgICAgIHRlbXBsYXRlUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZVdhcm5pbmc7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuZXhwZWN0ZWQ7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHk7CgppbXBvcnQgJ2J1aWxkZXIuZGFydCc7CmltcG9ydCAnY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdleHRlbnNpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21lbWJlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21ldGFkYXRhX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCi8vLyBDb21tb24gYmFzZSBjbGFzcyBmb3IgY29uc3RydWN0b3IgYW5kIHByb2NlZHVyZSBidWlsZGVycy4KYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25CdWlsZGVyIGltcGxlbWVudHMgTWVtYmVyQnVpbGRlciB7CiAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IGdldCBtZXRhZGF0YTsKCiAgVHlwZUJ1aWxkZXIgZ2V0IHJldHVyblR5cGU7CgogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gZ2V0IHR5cGVWYXJpYWJsZXM7CgogIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZ2V0IGZvcm1hbHM7CgogIEFzeW5jTWFya2VyIGdldCBhc3luY01vZGlmaWVyOwoKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kOwoKICBib29sIGdldCBpc0Fic3RyYWN0OwoKICBib29sIGdldCBpc0V4dGVybmFsOwoKICBib29sIGdldCBpc0NvbnN0cnVjdG9yOwoKICBib29sIGdldCBpc1JlZ3VsYXJNZXRob2Q7CgogIGJvb2wgZ2V0IGlzR2V0dGVyOwoKICBib29sIGdldCBpc1NldHRlcjsKCiAgYm9vbCBnZXQgaXNPcGVyYXRvcjsKCiAgYm9vbCBnZXQgaXNGYWN0b3J5OwoKICAvLy8gVGhpcyBpcyB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZSBhcyBzcGVjaWZpZWQgaW4gdGhlIERhcnQgUHJvZ3JhbW1pbmcKICAvLy8gTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgNHRoIGVkLCBzZWN0aW9uIDkuMi4KICBTY29wZSBjb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUoU2NvcGUgcGFyZW50KTsKCiAgU2NvcGUgY29tcHV0ZUZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGUoU2NvcGUgcGFyZW50KTsKCiAgLy8vIFRoaXMgc2NvcGUgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFueSBzY29wZSBzcGVjaWZpZWQgaW4gdGhlIERhcnQKICAvLy8gUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgNHRoIGVkLiBJdCdzIGFuIHVuc3BlY2lmaWVkIGV4dGVuc2lvbgogIC8vLyB0byBzdXBwb3J0IGdlbmVyaWMgbWV0aG9kcy4KICBTY29wZSBjb21wdXRlVHlwZVBhcmFtZXRlclNjb3BlKFNjb3BlIHBhcmVudCk7CgogIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZ2V0Rm9ybWFsKElkZW50aWZpZXIgaWRlbnRpZmllcik7CgogIFN0cmluZyBnZXQgbmF0aXZlTWV0aG9kTmFtZTsKCiAgRnVuY3Rpb25Ob2RlIGdldCBmdW5jdGlvbjsKCiAgRnVuY3Rpb25CdWlsZGVyIGdldCBhY3R1YWxPcmlnaW47CgogIFN0YXRlbWVudCBnZXQgYm9keTsKCiAgdm9pZCBzZXQgYm9keShTdGF0ZW1lbnQgbmV3Qm9keSk7CgogIHZvaWQgc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShNZW1iZXIgdGFyZ2V0LCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKTsKCiAgYm9vbCBnZXQgaXNOYXRpdmU7CgogIC8vLyBSZXR1cm5zIHRoZSBbaW5kZXhddGggcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoZSBpbmRleCBpcyB0aGUgc3ludGFjdGljYWwgaW5kZXgsIGluY2x1ZGluZyBib3RoIHBvc2l0aW9uYWwgYW5kIG5hbWVkCiAgLy8vIHBhcmFtZXRlciBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQsIGFuZCBleGNsdWRpbmcgdGhlIHN5bnRoZXNpemVkCiAgLy8vIHRoaXMgcGFyYW1ldGVyIG9uIGV4dGVuc2lvbiBpbnN0YW5jZSBtZW1iZXJzLgogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0Rm9ybWFsUGFyYW1ldGVyKGludCBpbmRleCk7CgogIC8vLyBJZiB0aGlzIGlzIGFuIGV4dGVuc2lvbiBpbnN0YW5jZSBtZXRob2QsIHRoZSB0ZWFyIG9mZiBjbG9zdXJlIHBhcmFtZXRlcgogIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBbaW5kZXhddGggcGFyYW1ldGVyIG9uIHRoZSBpbnN0YW5jZSBtZXRob2QgaXMKICAvLy8gcmV0dXJuZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjbG9zdXJlIHBhcmFtZXRlciB3aGVuCiAgLy8vIGl0IGhhcyBiZWVuIGNvbXB1dGVkIGZvciB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyLgogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0RXh0ZW5zaW9uVGVhck9mZlBhcmFtZXRlcihpbnQgaW5kZXgpOwoKICAvLy8gUmV0dXJucyB0aGUgcGFyYW1ldGVyIGZvciAndGhpcycgc3ludGhldGljYWxseSBhZGRlZCB0byBleHRlbnNpb24KICAvLy8gaW5zdGFuY2UgbWVtYmVycy4KICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldCBleHRlbnNpb25UaGlzOwoKICAvLy8gUmV0dXJucyBhIGxpc3Qgb2Ygc3ludGhldGljIHR5cGUgcGFyYW1ldGVycyBhZGRlZCB0byBleHRlbnNpb24gaW5zdGFuY2UKICAvLy8gbWVtYmVycy4KICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGdldCBleHRlbnNpb25UeXBlUGFyYW1ldGVyczsKCiAgdm9pZCBiZWNvbWVOYXRpdmUoTG9hZGVyIGxvYWRlcik7CgogIGJvb2wgY2hlY2tQYXRjaChGdW5jdGlvbkJ1aWxkZXIgcGF0Y2gpOwoKICB2b2lkIHJlcG9ydFBhdGNoTWlzbWF0Y2goQnVpbGRlciBwYXRjaCk7Cn0KCi8vLyBDb21tb24gYmFzZSBjbGFzcyBmb3IgY29uc3RydWN0b3IgYW5kIHByb2NlZHVyZSBidWlsZGVycy4KYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25CdWlsZGVySW1wbCBleHRlbmRzIE1lbWJlckJ1aWxkZXJJbXBsCiAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uQnVpbGRlciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBpbnQgbW9kaWZpZXJzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBUeXBlQnVpbGRlciByZXR1cm5UeXBlOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHM7CgogIC8vLyBJZiB0aGlzIHByb2NlZHVyZSBpcyBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWVtYmVyLCBbX2V4dGVuc2lvblRoaXNdIGhvbGRzCiAgLy8vIHRoZSBzeW50aGV0aWNhbGx5IGFkZGVkIGB0aGlzYCBwYXJhbWV0ZXIuCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBfZXh0ZW5zaW9uVGhpczsKCiAgLy8vIElmIHRoaXMgcHJvY2VkdXJlIGlzIGFuIGV4dGVuc2lvbiBpbnN0YW5jZSBtZW1iZXIsCiAgLy8vIFtfZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnNdIGhvbGRzIHRoZSB0eXBlIHBhcmFtZXRlcnMgY29waWVkIGZyb20gdGhlCiAgLy8vIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi4KICBMaXN0PFR5cGVQYXJhbWV0ZXI+IF9leHRlbnNpb25UeXBlUGFyYW1ldGVyczsKCiAgRnVuY3Rpb25CdWlsZGVySW1wbCgKICAgICAgdGhpcy5tZXRhZGF0YSwKICAgICAgdGhpcy5tb2RpZmllcnMsCiAgICAgIHRoaXMucmV0dXJuVHlwZSwKICAgICAgdGhpcy5uYW1lLAogICAgICB0aGlzLnR5cGVWYXJpYWJsZXMsCiAgICAgIHRoaXMuZm9ybWFscywKICAgICAgTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LAogICAgICBpbnQgY2hhck9mZnNldCwKICAgICAgdGhpcy5uYXRpdmVNZXRob2ROYW1lKQogICAgICA6IHN1cGVyKGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCkgewogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBmb3JtYWxzW2ldLnBhcmVudCA9IHRoaXM7CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJGdW5jdGlvbkJ1aWxkZXIiOwoKICBAb3ZlcnJpZGUKICBBc3luY01hcmtlciBnZXQgYXN5bmNNb2RpZmllcjsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBYnN0cmFjdCA9PiAobW9kaWZpZXJzICYgYWJzdHJhY3RNYXNrKSAhPSAwOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1JlZ3VsYXJNZXRob2QgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuTWV0aG9kLCBraW5kKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuR2V0dGVyLCBraW5kKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTZXR0ZXIgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuU2V0dGVyLCBraW5kKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNPcGVyYXRvciA9PiBpZGVudGljYWwoUHJvY2VkdXJlS2luZC5PcGVyYXRvciwga2luZCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmFjdG9yeSA9PiBpZGVudGljYWwoUHJvY2VkdXJlS2luZC5GYWN0b3J5LCBraW5kKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeHRlcm5hbCA9PiAobW9kaWZpZXJzICYgZXh0ZXJuYWxNYXNrKSAhPSAwOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0Fzc2lnbmFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFNjb3BlIGNvbXB1dGVGb3JtYWxQYXJhbWV0ZXJTY29wZShTY29wZSBwYXJlbnQpIHsKICAgIGlmIChmb3JtYWxzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBCdWlsZGVyPiBsb2NhbCA9IDxTdHJpbmcsIEJ1aWxkZXI+e307CiAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgaWYgKCFpc0NvbnN0cnVjdG9yIHx8ICFmb3JtYWwuaXNJbml0aWFsaXppbmdGb3JtYWwpIHsKICAgICAgICBsb2NhbFtmb3JtYWwubmFtZV0gPSBmb3JtYWw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2NvcGUoCiAgICAgICAgbG9jYWw6IGxvY2FsLAogICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgIGRlYnVnTmFtZTogImZvcm1hbCBwYXJhbWV0ZXIiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2NvcGUgY29tcHV0ZUZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGUoU2NvcGUgcGFyZW50KSB7CiAgICAvLyBGcm9tCiAgICAvLyBbZGFydExhbmdTcGVjLnRleF0oLi4vLi4vLi4vLi4vLi4vLi4vZG9jcy9sYW5ndWFnZS9kYXJ0TGFuZ1NwZWMudGV4KSBhdAogICAgLy8gcmV2aXNpb24gOTRiMjNkM2IxMjVlOWQyNDZlMDdhMmI0M2I2MTc0MDc1OWEwZGFjZToKICAgIC8vCiAgICAvLyBXaGVuIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3Qgb2YgYSBub24tcmVkaXJlY3RpbmcgZ2VuZXJhdGl2ZQogICAgLy8gY29uc3RydWN0b3IgY29udGFpbnMgYW55IGluaXRpYWxpemluZyBmb3JtYWxzLCBhIG5ldyBzY29wZSBpcwogICAgLy8gaW50cm9kdWNlZCwgdGhlIF9mb3JtYWwgcGFyYW1ldGVyIGluaXRpYWxpemVyIHNjb3BlXywgd2hpY2ggaXMgdGhlCiAgICAvLyBjdXJyZW50IHNjb3BlIG9mIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHdoaWNoIGlzCiAgICAvLyBlbmNsb3NlZCBpbiB0aGUgc2NvcGUgd2hlcmUgdGhlIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkLiAgRWFjaAogICAgLy8gaW5pdGlhbGl6aW5nIGZvcm1hbCBpbiB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IGludHJvZHVjZXMgYSBmaW5hbAogICAgLy8gbG9jYWwgdmFyaWFibGUgaW50byB0aGUgZm9ybWFsIHBhcmFtZXRlciBpbml0aWFsaXplciBzY29wZSwgYnV0IG5vdCBpbnRvCiAgICAvLyB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZTsgZXZlcnkgb3RoZXIgZm9ybWFsIHBhcmFtZXRlciBpbnRyb2R1Y2VzIGEKICAgIC8vIGxvY2FsIHZhcmlhYmxlIGludG8gYm90aCB0aGUgZm9ybWFsIHBhcmFtZXRlciBzY29wZSBhbmQgdGhlIGZvcm1hbAogICAgLy8gcGFyYW1ldGVyIGluaXRpYWxpemVyIHNjb3BlLgoKICAgIGlmIChmb3JtYWxzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBCdWlsZGVyPiBsb2NhbCA9IDxTdHJpbmcsIEJ1aWxkZXI+e307CiAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgbG9jYWxbZm9ybWFsLm5hbWVdID0gZm9ybWFsLmZvckZvcm1hbFBhcmFtZXRlckluaXRpYWxpemVyU2NvcGUoKTsKICAgIH0KICAgIHJldHVybiBuZXcgU2NvcGUoCiAgICAgICAgbG9jYWw6IGxvY2FsLAogICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgIGRlYnVnTmFtZTogImZvcm1hbCBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgU2NvcGUgY29tcHV0ZVR5cGVQYXJhbWV0ZXJTY29wZShTY29wZSBwYXJlbnQpIHsKICAgIGlmICh0eXBlVmFyaWFibGVzID09IG51bGwpIHJldHVybiBwYXJlbnQ7CiAgICBNYXA8U3RyaW5nLCBCdWlsZGVyPiBsb2NhbCA9IDxTdHJpbmcsIEJ1aWxkZXI+e307CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICBsb2NhbFt2YXJpYWJsZS5uYW1lXSA9IHZhcmlhYmxlOwogICAgfQogICAgcmV0dXJuIG5ldyBTY29wZSgKICAgICAgICBsb2NhbDogbG9jYWwsCiAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgZGVidWdOYW1lOiAidHlwZSBwYXJhbWV0ZXIiLAogICAgICAgIGlzTW9kaWZpYWJsZTogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBnZXRGb3JtYWwoSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgIGlmIChmb3JtYWwubmFtZSA9PSBpZGVudGlmaWVyLm5hbWUgJiYKICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQgPT0gaWRlbnRpZmllci5jaGFyT2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gZm9ybWFsOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBJZiB3ZSBoYXZlIGFueSBmb3JtYWxzIHdlIHNob3VsZCBmaW5kIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IuCiAgICAgIGFzc2VydChmYWxzZSwgIiRpZGVudGlmaWVyIG5vdCBmb3VuZCBpbiAkZm9ybWFscyIpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBmaW5hbCBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZTsKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uOwoKICBTdGF0ZW1lbnQgYm9keUludGVybmFsOwoKICBAb3ZlcnJpZGUKICB2b2lkIHNldCBib2R5KFN0YXRlbWVudCBuZXdCb2R5KSB7Ci8vICAgIGlmIChuZXdCb2R5ICE9IG51bGwpIHsKLy8gICAgICBpZiAoaXNBYnN0cmFjdCkgewovLyAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IElzIHRoaXMgY2hlY2sgbmVlZGVkPwovLyAgICAgICAgcmV0dXJuIGludGVybmFsUHJvYmxlbShtZXNzYWdlSW50ZXJuYWxQcm9ibGVtQm9keU9uQWJzdHJhY3RNZXRob2QsCi8vICAgICAgICAgICAgbmV3Qm9keS5maWxlT2Zmc2V0LCBmaWxlVXJpKTsKLy8gICAgICB9Ci8vICAgIH0KICAgIGJvZHlJbnRlcm5hbCA9IG5ld0JvZHk7CiAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewogICAgICAvLyBBIGZvcndhcmRpbmcgc2VtaS1zdHViIGlzIGEgbWV0aG9kIHRoYXQgaXMgYWJzdHJhY3QgaW4gdGhlIHNvdXJjZSBjb2RlLAogICAgICAvLyBidXQgd2hpY2ggbmVlZHMgdG8gaGF2ZSBhIGZvcndhcmRpbmcgc3R1YiBib2R5IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0CiAgICAgIC8vIGNvdmFyaWFuY2UgY2hlY2tzIG9jY3VyLiAgV2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIHRoZSBmb3J3YXJkaW5nIHN0dWIKICAgICAgLy8gYm9keSB3aXRoIG51bGwuCiAgICAgIFRyZWVOb2RlIHBhcmVudCA9IGZ1bmN0aW9uLnBhcmVudDsKICAgICAgaWYgKCEobmV3Qm9keSA9PSBudWxsICYmCiAgICAgICAgICBwYXJlbnQgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICBwYXJlbnQuaXNGb3J3YXJkaW5nU2VtaVN0dWIpKSB7CiAgICAgICAgZnVuY3Rpb24uYm9keSA9IG5ld0JvZHk7CiAgICAgICAgbmV3Qm9keT8ucGFyZW50ID0gZnVuY3Rpb247CiAgICAgIH0KICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keShNZW1iZXIgdGFyZ2V0LCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBpZiAoYm9keUludGVybmFsICE9IG51bGwpIHsKICAgICAgdW5leHBlY3RlZCgibnVsbCIsICIke2JvZHlJbnRlcm5hbC5ydW50aW1lVHlwZX0iLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KICAgIGJvZHlJbnRlcm5hbCA9IG5ldyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRhcmdldCwgdHlwZUFyZ3VtZW50cyk7CiAgICBmdW5jdGlvbi5ib2R5ID0gYm9keUludGVybmFsOwogICAgYm9keUludGVybmFsPy5wYXJlbnQgPSBmdW5jdGlvbjsKICAgIGlmIChpc1BhdGNoKSB7CiAgICAgIGFjdHVhbE9yaWdpbi5zZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KHRhcmdldCwgdHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgZ2V0IGJvZHkgPT4gYm9keUludGVybmFsID8/PSBuZXcgRW1wdHlTdGF0ZW1lbnQoKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOYXRpdmUgPT4gbmF0aXZlTWV0aG9kTmFtZSAhPSBudWxsOwoKICBGdW5jdGlvbk5vZGUgYnVpbGRGdW5jdGlvbihTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBhc3NlcnQoZnVuY3Rpb24gPT0gbnVsbCk7CiAgICBGdW5jdGlvbk5vZGUgcmVzdWx0ID0gbmV3IEZ1bmN0aW9uTm9kZShib2R5LCBhc3luY01hcmtlcjogYXN5bmNNb2RpZmllcik7CiAgICBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkgbmVlZHNDaGVja1Zpc2l0b3I7CiAgICBpZiAoIWlzQ29uc3RydWN0b3IgJiYgIWlzRmFjdG9yeSAmJiBwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIENsYXNzQnVpbGRlciBlbmNsb3NpbmdDbGFzc0J1aWxkZXIgPSBwYXJlbnQ7CiAgICAgIENsYXNzIGVuY2xvc2luZ0NsYXNzID0gZW5jbG9zaW5nQ2xhc3NCdWlsZGVyLmNsczsKICAgICAgaWYgKGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBuZWVkc0NoZWNrVmlzaXRvciA9IG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAvLyBXZSBhcmUgY2hlY2tpbmcgdGhlIHBhcmFtZXRlciB0eXBlcyB3aGljaCBhcmUgaW4gYQogICAgICAgICAgICAvLyBjb250cmF2YXJpYW50IHBvc2l0aW9uLgogICAgICAgICAgICBpbml0aWFsVmFyaWFuY2U6IFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAodHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0IGluIHR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciA9IHQucGFyYW1ldGVyOwogICAgICAgIHJlc3VsdC50eXBlUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICBpZiAobmVlZHNDaGVja1Zpc2l0b3IgIT0gbnVsbCkgewogICAgICAgICAgaWYgKHBhcmFtZXRlci5ib3VuZC5hY2NlcHQobmVlZHNDaGVja1Zpc2l0b3IpKSB7CiAgICAgICAgICAgIHBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0UGFyZW50cyhyZXN1bHQudHlwZVBhcmFtZXRlcnMsIHJlc3VsdCk7CiAgICB9CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gZm9ybWFsLmJ1aWxkKGxpYnJhcnksIDApOwogICAgICAgIGlmIChuZWVkc0NoZWNrVmlzaXRvciAhPSBudWxsKSB7CiAgICAgICAgICBpZiAocGFyYW1ldGVyLnR5cGUuYWNjZXB0KG5lZWRzQ2hlY2tWaXNpdG9yKSkgewogICAgICAgICAgICBwYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChmb3JtYWwuaXNOYW1lZCkgewogICAgICAgICAgcmVzdWx0Lm5hbWVkUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgIH0KICAgICAgICBwYXJhbWV0ZXIucGFyZW50ID0gcmVzdWx0OwogICAgICAgIGlmIChmb3JtYWwuaXNSZXF1aXJlZCkgewogICAgICAgICAgcmVzdWx0LnJlcXVpcmVkUGFyYW1ldGVyQ291bnQrKzsKICAgICAgICB9CgogICAgICAgIGlmIChsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICAgICAgbGlicmFyeS5sb2FkZXIudGFyZ2V0LnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgICAgICAvLyBSZXF1aXJlZCBuYW1lZCBwYXJhbWV0ZXJzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgICBpZiAoZm9ybWFsLmlzTmFtZWRSZXF1aXJlZCAmJiBmb3JtYWwuaW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChsaWJyYXJ5LmxvYWRlci5ubmJkU3Ryb25nTW9kZSkgewogICAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3IKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZvcm1hbC5uYW1lKSwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGZvcm1hbC5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgZm9ybWFsLmZpbGVVcmkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZm9ybWFsLm5hbWUpLAogICAgICAgICAgICAgICAgICBmb3JtYWwuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgZm9ybWFsLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgICBmb3JtYWwuZmlsZVVyaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghaXNFeHRlbnNpb25JbnN0YW5jZU1lbWJlciAmJgogICAgICAgIGlzU2V0dGVyICYmCiAgICAgICAgKGZvcm1hbHM/Lmxlbmd0aCAhPSAxIHx8IGZvcm1hbHNbMF0uaXNPcHRpb25hbCkpIHsKICAgICAgLy8gUmVwbGFjZSBpbGxlZ2FsIHBhcmFtZXRlcnMgYnkgc2luZ2xlIGR1bW15IHBhcmFtZXRlci4KICAgICAgLy8gRG8gdGhpcyBhZnRlciBidWlsZGluZyB0aGUgcGFyYW1ldGVycywgc2luY2UgdGhlIGRpZXQgbGlzdGVuZXIKICAgICAgLy8gYXNzdW1lcyB0aGF0IHBhcmFtZXRlcnMgYXJlIGJ1aWx0LCBldmVuIGlmIGlsbGVnYWwgaW4gbnVtYmVyLgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkltcGwoIiNzeW50aGV0aWMiLCAwKTsKICAgICAgcmVzdWx0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmNsZWFyKCk7CiAgICAgIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKICAgICAgcGFyYW1ldGVyLnBhcmVudCA9IHJlc3VsdDsKICAgICAgcmVzdWx0Lm5hbWVkUGFyYW1ldGVycy5jbGVhcigpOwogICAgICByZXN1bHQucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA9IDE7CiAgICB9CiAgICBpZiAocmV0dXJuVHlwZSAhPSBudWxsKSB7CiAgICAgIHJlc3VsdC5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZS5idWlsZChsaWJyYXJ5KTsKICAgIH0KICAgIGlmICghaXNDb25zdHJ1Y3RvciAmJgogICAgICAgICFpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICBwYXJlbnQgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIENsYXNzQnVpbGRlciBlbmNsb3NpbmdDbGFzc0J1aWxkZXIgPSBwYXJlbnQ7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgZW5jbG9zaW5nQ2xhc3NCdWlsZGVyLmNscy50eXBlUGFyYW1ldGVyczsKICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbjsKICAgICAgICBEYXJ0VHlwZSByZW1vdmVUeXBlVmFyaWFibGVzKERhcnRUeXBlIHR5cGUpIHsKICAgICAgICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICBzdWJzdGl0dXRpb24gPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgICAgICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gdHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICBzdWJzdGl0dXRpb25bcGFyYW1ldGVyXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICBtZXNzYWdlTm9uSW5zdGFuY2VUeXBlVmFyaWFibGVVc2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRlKHR5cGUsIHN1YnN0aXR1dGlvbik7CiAgICAgICAgfQoKICAgICAgICBTZXQ8VHlwZVBhcmFtZXRlcj4gc2V0ID0gdHlwZVBhcmFtZXRlcnMudG9TZXQoKTsKICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIHJlc3VsdC5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgICAgaWYgKGNvbnRhaW5zVHlwZVZhcmlhYmxlKHBhcmFtZXRlci50eXBlLCBzZXQpKSB7CiAgICAgICAgICAgIHBhcmFtZXRlci50eXBlID0gcmVtb3ZlVHlwZVZhcmlhYmxlcyhwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgaW4gcmVzdWx0Lm5hbWVkUGFyYW1ldGVycykgewogICAgICAgICAgaWYgKGNvbnRhaW5zVHlwZVZhcmlhYmxlKHBhcmFtZXRlci50eXBlLCBzZXQpKSB7CiAgICAgICAgICAgIHBhcmFtZXRlci50eXBlID0gcmVtb3ZlVHlwZVZhcmlhYmxlcyhwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZShyZXN1bHQucmV0dXJuVHlwZSwgc2V0KSkgewogICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSByZW1vdmVUeXBlVmFyaWFibGVzKHJlc3VsdC5yZXR1cm5UeXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChpc0V4dGVuc2lvbkluc3RhbmNlTWVtYmVyKSB7CiAgICAgIEV4dGVuc2lvbkJ1aWxkZXIgZXh0ZW5zaW9uQnVpbGRlciA9IHBhcmVudDsKICAgICAgX2V4dGVuc2lvblRoaXMgPSByZXN1bHQucG9zaXRpb25hbFBhcmFtZXRlcnMuZmlyc3Q7CiAgICAgIGlmIChleHRlbnNpb25CdWlsZGVyLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICBpbnQgY291bnQgPSBleHRlbnNpb25CdWlsZGVyLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICBfZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMgPSBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPihjb3VudCk7CiAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICBfZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnNbaW5kZXhdID0gcmVzdWx0LnR5cGVQYXJhbWV0ZXJzW2luZGV4XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiA9IHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0Rm9ybWFsUGFyYW1ldGVyKGludCBpbmRleCkgewogICAgaWYgKGlzRXh0ZW5zaW9uSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcmV0dXJuIGZvcm1hbHNbaW5kZXggKyAxXS52YXJpYWJsZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmb3JtYWxzW2luZGV4XS52YXJpYWJsZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0RXh0ZW5zaW9uVGVhck9mZlBhcmFtZXRlcihpbnQgaW5kZXgpID0+IG51bGw7CgogIEBvdmVycmlkZQogIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0IGV4dGVuc2lvblRoaXMgewogICAgYXNzZXJ0KF9leHRlbnNpb25UaGlzICE9IG51bGwgfHwgIWlzRXh0ZW5zaW9uSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgIlByb2NlZHVyZUJ1aWxkZXIuZXh0ZW5zaW9uVGhpcyBoYXMgbm90IGJlZW4gc2V0LiIpOwogICAgcmV0dXJuIF9leHRlbnNpb25UaGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxUeXBlUGFyYW1ldGVyPiBnZXQgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMgewogICAgLy8gVXNlIFtfZXh0ZW5zaW9uVGhpc10gYXMgbWFya2VyIGZvciB3aGV0aGVyIGV4dGVuc2lvbiB0eXBlIHBhcmFtZXRlcnMgaGF2ZQogICAgLy8gYmVlbiBjb21wdXRlZC4KICAgIGFzc2VydChfZXh0ZW5zaW9uVGhpcyAhPSBudWxsIHx8ICFpc0V4dGVuc2lvbkluc3RhbmNlTWVtYmVyLAogICAgICAgICJQcm9jZWR1cmVCdWlsZGVyLmV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzIGhhcyBub3QgYmVlbiBzZXQuIik7CiAgICByZXR1cm4gX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE91dGxpbmVFeHByZXNzaW9ucyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICBNZXRhZGF0YUJ1aWxkZXIuYnVpbGRBbm5vdGF0aW9ucygKICAgICAgICBtZW1iZXIsIG1ldGFkYXRhLCBsaWJyYXJ5LCBpc0NsYXNzTWVtYmVyID8gcGFyZW50IDogbnVsbCwgdGhpcyk7CgogICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICAvLyBGb3IgY29uc3QgY29uc3RydWN0b3JzIHdlIG5lZWQgdG8gaW5jbHVkZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMKICAgICAgLy8gaW50byB0aGUgb3V0bGluZS4gRm9yIGFsbCBvdGhlciBmb3JtYWxzIHdlIG5lZWQgdG8gY2FsbAogICAgICAvLyBidWlsZE91dGxpbmVFeHByZXNzaW9ucyB0byBjbGVhciBpbml0aWFsaXplclRva2VuIHRvIHByZXZlbnQKICAgICAgLy8gY29uc3VtaW5nIHRvbyBtdWNoIG1lbW9yeS4KICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgZm9ybWFsLmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKGxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgfQoKICBNZW1iZXIgYnVpbGQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSk7CgogIEBvdmVycmlkZQogIHZvaWQgYmVjb21lTmF0aXZlKExvYWRlciBsb2FkZXIpIHsKICAgIE1lbWJlckJ1aWxkZXIgY29uc3RydWN0b3IgPSBsb2FkZXIuZ2V0TmF0aXZlQW5ub3RhdGlvbigpOwogICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9CiAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bbmV3IFN0cmluZ0xpdGVyYWwobmF0aXZlTWV0aG9kTmFtZSldKTsKICAgIEV4cHJlc3Npb24gYW5ub3RhdGlvbjsKICAgIGlmIChjb25zdHJ1Y3Rvci5pc0NvbnN0cnVjdG9yKSB7CiAgICAgIGFubm90YXRpb24gPSBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKGNvbnN0cnVjdG9yLm1lbWJlciwgYXJndW1lbnRzKQogICAgICAgIC4uaXNDb25zdCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBhbm5vdGF0aW9uID0gbmV3IFN0YXRpY0ludm9jYXRpb24oY29uc3RydWN0b3IubWVtYmVyLCBhcmd1bWVudHMpCiAgICAgICAgLi5pc0NvbnN0ID0gdHJ1ZTsKICAgIH0KICAgIG1lbWJlci5hZGRBbm5vdGF0aW9uKGFubm90YXRpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBjaGVja1BhdGNoKEZ1bmN0aW9uQnVpbGRlciBwYXRjaCkgewogICAgaWYgKCFpc0V4dGVybmFsKSB7CiAgICAgIHBhdGNoLmxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIG1lc3NhZ2VQYXRjaE5vbkV4dGVybmFsLCBwYXRjaC5jaGFyT2Zmc2V0LCBub0xlbmd0aCwgcGF0Y2guZmlsZVVyaSwKICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4ud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgICAgICBdKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydFBhdGNoTWlzbWF0Y2goQnVpbGRlciBwYXRjaCkgewogICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsIHBhdGNoLmNoYXJPZmZzZXQsCiAgICAgICAgbm9MZW5ndGgsIHBhdGNoLmZpbGVVcmksIGNvbnRleHQ6IFsKICAgICAgbWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW4ud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXN0PENsYXNzTWVtYmVyPiBnZXQgbG9jYWxNZW1iZXJzID0+CiAgICAgIGlzU2V0dGVyID8gY29uc3QgPENsYXNzTWVtYmVyPltdIDogPENsYXNzTWVtYmVyPlt0aGlzXTsKCiAgQG92ZXJyaWRlCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0IGxvY2FsU2V0dGVycyA9PgogICAgICBpc1NldHRlciA/IDxDbGFzc01lbWJlcj5bdGhpc10gOiBjb25zdCA8Q2xhc3NNZW1iZXI+W107Cn0Kgj4ATk48ASEBIgE9IgErAR4YAUJDTgElARoJKyknIRI8PgEbASsBSgE2LwEXHSEoHx4gHCUBPjomAR4BLwEsASEBGgEXARcBGgEcARUBFQEXARYBTjMzAT4BR1AiMQE7AR8BHQEkARYBJAFPARUBOAZOTjQ1AU5JEAZONz8BSBgpAU4PMwEkASoBKwIBPj0hDCgBDBcBDCABDBUBDDEBDC4BUDAmATlLHTABFxUWFxEaFCYWHS0bMSIIBgQBDC0BDCEBDCMBDDoBDEUBDD4BDD4BDEIBDEABDDoBDCIBDDQoNjU8JQgGFhYYJx4EAQw/DE86B0ZFSk5GS1BNSiQBKDY1SAYWFhgzHgQBDDIuNjonBhYWGCUeBAEMPBs3LjoZCghKOgYRBAEMIQEMGQEaAQwlHRozTSwKCBwcUVBQGSkfISohJAgGBAEMUCBOBkYiJRNFBgQBDD8BDDEBPR5OPEIzODZGK0InNggGITUvLik7NQwKCDEGGzdCKTo1DAoeMRE2CiMhKwoBLjdCSzEiRTMlJiMVIkczJSYjDgwKCAYmFDs/SEcmOCsyISYpBh41BhooIjMrNCczNiY4Pj0ODB5RMQoBOU07QgwKSDtCDAo8RgoIBiUyOjU8QzZKCggGHgQBDDYlKg0mBgQBDEcBDCpBPRsEAQw0URZBRyUEAQxOJkkBG0xBRiQ3MQgGBAEuAQwlPhpKGyVMGg1HGgYmBAEMKxcgThU4Lw4UBhEEAQwsSixQCAQBDCg+AQwoPgIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Z1bmN0aW9uX2J1aWxkZXIuZGFydGpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0kuMvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mdW5jdGlvbl90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgU3VwZXJ0eXBlLAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZWRlZlR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgbWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb24sIG5vTGVuZ3RoOwoKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgZXh0ZW5kcyBUeXBlQnVpbGRlciB7CiAgZmluYWwgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZTsKICBmaW5hbCBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CiAgZmluYWwgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzOwogIGZpbmFsIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXI7CgogIEZ1bmN0aW9uVHlwZUJ1aWxkZXIodGhpcy5yZXR1cm5UeXBlLCB0aGlzLnR5cGVWYXJpYWJsZXMsIHRoaXMuZm9ybWFscywKICAgICAgdGhpcy5udWxsYWJpbGl0eUJ1aWxkZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IG5hbWUgPT4gbnVsbDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkZ1bmN0aW9uIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nQnVmZmVyIHByaW50T24oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBidWZmZXIud3JpdGUoIjwiKTsKICAgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHQgaW4gdHlwZVZhcmlhYmxlcykgewogICAgICAgIGlmICghaXNGaXJzdCkgewogICAgICAgICAgYnVmZmVyLndyaXRlKCIsICIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci53cml0ZSh0Lm5hbWUpOwogICAgICB9CiAgICAgIGJ1ZmZlci53cml0ZSgiPiIpOwogICAgfQogICAgYnVmZmVyLndyaXRlKCIoIik7CiAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGJvb2wgaXNGaXJzdCA9IHRydWU7CiAgICAgIGZvciAoZHluYW1pYyB0IGluIGZvcm1hbHMpIHsKICAgICAgICBpZiAoIWlzRmlyc3QpIHsKICAgICAgICAgIGJ1ZmZlci53cml0ZSgiLCAiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBidWZmZXIud3JpdGUodD8uZnVsbE5hbWVGb3JFcnJvcnMpOwogICAgICB9CiAgICB9CiAgICBidWZmZXIud3JpdGUoIikgLT4iKTsKICAgIG51bGxhYmlsaXR5QnVpbGRlci53cml0ZU51bGxhYmlsaXR5T24oYnVmZmVyKTsKICAgIGJ1ZmZlci53cml0ZSgiICIpOwogICAgYnVmZmVyLndyaXRlKHJldHVyblR5cGU/LmZ1bGxOYW1lRm9yRXJyb3JzKTsKICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBGdW5jdGlvblR5cGUgYnVpbGQoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgW1R5cGVkZWZUeXBlIG9yaWdpbl0pIHsKICAgIERhcnRUeXBlIGJ1aWx0UmV0dXJuVHlwZSA9CiAgICAgICAgcmV0dXJuVHlwZT8uYnVpbGQobGlicmFyeSkgPz8gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gPERhcnRUeXBlPltdOwogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVyczsKICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gMDsKICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbCBpbiBmb3JtYWxzKSB7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IGZvcm1hbC50eXBlPy5idWlsZChsaWJyYXJ5KSA/PyBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICAgIGlmIChmb3JtYWwuaXNQb3NpdGlvbmFsKSB7CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5hZGQodHlwZSk7CiAgICAgICAgICBpZiAoZm9ybWFsLmlzUmVxdWlyZWQpIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQrKzsKICAgICAgICB9IGVsc2UgaWYgKGZvcm1hbC5pc05hbWVkKSB7CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMgPz89IDxOYW1lZFR5cGU+W107CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKG5ldyBOYW1lZFR5cGUoZm9ybWFsLm5hbWUsIHR5cGUsCiAgICAgICAgICAgICAgaXNSZXF1aXJlZDogZm9ybWFsLmlzTmFtZWRSZXF1aXJlZCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmFtZWRQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICBuYW1lZFBhcmFtZXRlcnMuc29ydCgpOwogICAgICB9CiAgICB9CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICB0eXBlUGFyYW1ldGVycyA9IDxUeXBlUGFyYW1ldGVyPltdOwogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdCBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgdHlwZVBhcmFtZXRlcnMuYWRkKHQucGFyYW1ldGVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocG9zaXRpb25hbFBhcmFtZXRlcnMsIGJ1aWx0UmV0dXJuVHlwZSwKICAgICAgICBudWxsYWJpbGl0eUJ1aWxkZXIuYnVpbGQobGlicmFyeSksCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMgPz8gY29uc3QgPE5hbWVkVHlwZT5bXSwKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMgPz8gY29uc3QgPFR5cGVQYXJhbWV0ZXI+W10sCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgICB0eXBlZGVmVHlwZTogb3JpZ2luKTsKICB9CgogIFN1cGVydHlwZSBidWlsZFN1cGVydHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb24sIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIGJ1aWxkU3VwZXJ0eXBlKGxpYnJhcnksIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgRnVuY3Rpb25UeXBlQnVpbGRlciBjbG9uZShMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcykgewogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBjbG9uZWRUeXBlVmFyaWFibGVzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBjbG9uZWRUeXBlVmFyaWFibGVzID0gbmV3IExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4odHlwZVZhcmlhYmxlcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsb25lZFR5cGVWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRUeXBlVmFyaWFibGVzW2ldID0gdHlwZVZhcmlhYmxlc1tpXS5jbG9uZShuZXdUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gY2xvbmVkRm9ybWFsczsKICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgY2xvbmVkRm9ybWFscyA9IG5ldyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KGZvcm1hbHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRGb3JtYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBmb3JtYWxzW2ldOwogICAgICAgIGNsb25lZEZvcm1hbHNbaV0gPSBmb3JtYWwuY2xvbmUobmV3VHlwZXMpOwogICAgICB9CiAgICB9CiAgICBGdW5jdGlvblR5cGVCdWlsZGVyIG5ld1R5cGUgPSBuZXcgRnVuY3Rpb25UeXBlQnVpbGRlcigKICAgICAgICByZXR1cm5UeXBlPy5jbG9uZShuZXdUeXBlcyksCiAgICAgICAgY2xvbmVkVHlwZVZhcmlhYmxlcywKICAgICAgICBjbG9uZWRGb3JtYWxzLAogICAgICAgIG51bGxhYmlsaXR5QnVpbGRlcik7CiAgICBuZXdUeXBlcy5hZGQobmV3VHlwZSk7CiAgICByZXR1cm4gbmV3VHlwZTsKICB9CgogIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgd2l0aE51bGxhYmlsaXR5QnVpbGRlcigKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlcikgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGVCdWlsZGVyKAogICAgICAgIHJldHVyblR5cGUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMsIG51bGxhYmlsaXR5QnVpbGRlcik7CiAgfQp9CoCbAE5OPAElASEJEhUWExMXFQFIASgfIxwlATAgMS4vAUkgAQwbAQwmAQwuIRkbNRgeERsKHggZBhcbGyMYHhEbCiwIBhozFzETBAFFHzs4JSQbN0wjKjslLT80CgglIAgGKCEqNSkIBkMrQUM4HgQBHD0YRBEEAR49OQQBOjMhUT1DCAYwG0g3NDMIBjslHRcdGxQEAS4vJEEEAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnR1ZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9pbnZhbGlkX3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0hgYvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5pbnZhbGlkX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIEludmFsaWRUeXBlLCBOdWxsYWJpbGl0eTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcgc2hvdyBMb2NhdGVkTWVzc2FnZTsKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKCmNsYXNzIEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlckltcGwKICAgIHdpdGggRXJyb25lb3VzTWVtYmVyQnVpbGRlck1peGluIHsKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiSW52YWxpZFR5cGVCdWlsZGVyIjsKCiAgZmluYWwgTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZTsKCiAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dDsKCiAgZmluYWwgYm9vbCBzdXBwcmVzc01lc3NhZ2U7CgogIEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKFN0cmluZyBuYW1lLCB0aGlzLm1lc3NhZ2UsCiAgICAgIHt0aGlzLmNvbnRleHQsIHRoaXMuc3VwcHJlc3NNZXNzYWdlOiB0cnVlfSkKICAgICAgOiBzdXBlcihudWxsLCAwLCBuYW1lLCBudWxsLCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UudXJpKTsKCiAgRGFydFR5cGUgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIsIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgcmV0dXJuIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMobGlicmFyeSwgbnVsbCwgbnVsbCk7CiAgfQoKICAvLy8gW0FyZ3VtZW50c10gaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQuCiAgRGFydFR5cGUgYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSwgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzKSB7CiAgICBpZiAoIXN1cHByZXNzTWVzc2FnZSkgewogICAgICBsaWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZS5tZXNzYWdlT2JqZWN0LCBtZXNzYWdlLmNoYXJPZmZzZXQsCiAgICAgICAgICBtZXNzYWdlLmxlbmd0aCwgbWVzc2FnZS51cmksCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgIH0KICAgIHJldHVybiBjb25zdCBJbnZhbGlkVHlwZSgpOwogIH0KfQowAE5OPAEkAUoBMhgBHyMcKAFHJzABIAEmAR4BOzJFAS1MPgQBK0A7HEQnHQYgBAIBSXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2ludmFsaWRfdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnRjZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0lC8vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5tZW1iZXJfYnVpbGRlcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAnLi4vLi4vYmFzZS9jb21tb24uZGFydCc7CgppbXBvcnQgJy4uL2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuc3VwcG9ydGVkOwppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmZlcmVuY2VEYXRhRm9yVGVzdGluZzsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnZXh0ZW5zaW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21vZGlmaWVyX2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBNZW1iZXJCdWlsZGVyIGltcGxlbWVudHMgTW9kaWZpZXJCdWlsZGVyLCBDbGFzc01lbWJlciB7CiAgdm9pZCBzZXQgcGFyZW50KEJ1aWxkZXIgdmFsdWUpOwoKICBMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeTsKCiAgLy8vIFRoZSBbTWVtYmVyXSBidWlsdCBieSB0aGlzIGJ1aWxkZXI7CiAgTWVtYmVyIGdldCBtZW1iZXI7CgogIC8vLyBUaGUgW01lbWJlcl0gdG8gdXNlIHdoZW4gcmVhZGluZyBmcm9tIHRoaXMgbWVtYmVyIGJ1aWxkZXIuCiAgLy8vCiAgLy8vIEZvciBhIGZpZWxkLCBhIGdldHRlciBvciBhIHJlZ3VsYXIgbWV0aG9kIHRoaXMgaXMgdGhlIFttZW1iZXJdIGl0c2VsZi4KICAvLy8gRm9yIGFuIGluc3RhbmNlIGV4dGVuc2lvbiBtZXRob2QgdGhpcyBpcyBzcGVjaWFsIHRlYXItb2ZmIGZ1bmN0aW9uLiBGb3IKICAvLy8gYSBjb25zdHJ1Y3RvciwgYW4gb3BlcmF0b3IsIGEgZmFjdG9yeSBvciBhIHNldHRlciB0aGlzIGlzIGBudWxsYC4KICBNZW1iZXIgZ2V0IHJlYWRUYXJnZXQ7CgogIC8vLyBUaGUgW01lbWJlcl0gdG8gdXNlIHdoZW4gd3JpdGUgdG8gdGhpcyBtZW1iZXIgYnVpbGRlci4KICAvLy8KICAvLy8gRm9yIGFuIGFzc2lnbmFibGUgZmllbGQgb3IgYSBzZXR0ZXIgdGhpcyBpcyB0aGUgW21lbWJlcl0gaXRzZWxmLiBGb3IKICAvLy8gYSBjb25zdHJ1Y3RvciwgYSBub24tYXNzaWduYWJsZSBmaWVsZCwgYSBnZXR0ZXIsIGFuIG9wZXJhdG9yIG9yIGEgcmVndWxhcgogIC8vLyBtZXRob2QgdGhpcyBpcyBgbnVsbGAuCiAgTWVtYmVyIGdldCB3cml0ZVRhcmdldDsKCiAgLy8vIFRoZSBbTWVtYmVyXSB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGlzIG1lbWJlciBidWlsZGVyLgogIC8vLwogIC8vLyBGb3IgYSBjb25zdHJ1Y3RvciwgYSBmaWVsZCwgYSByZWd1bGFyIG1ldGhvZCwgYSBnZXR0ZXIgYW4gb3BlcmF0b3Igb3IKICAvLy8gYSBmYWN0b3J5IHRoaXMgaXMgdGhlIFttZW1iZXJdIGl0c2VsZi4gRm9yIGEgc2V0dGVyIHRoaXMgaXMgYG51bGxgLgogIE1lbWJlciBnZXQgaW52b2tlVGFyZ2V0OwoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBhbmQgY3JlYXRlIGEgW1Byb2NlZHVyZUJ1aWxkZXJdIGludGVyZmFjZS4KICBQcm9jZWR1cmVLaW5kIGdldCBraW5kOwoKICB2b2lkIGJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIENvcmVUeXBlcyBjb3JlVHlwZXMpOwoKICAvLy8gUmV0dXJucyB0aGUgW0NsYXNzTWVtYmVyXXMgZm9yIHRoZSBub24tc2V0dGVyIG1lbWJlcnMgY3JlYXRlZCBmb3IgdGhpcwogIC8vLyBtZW1iZXIgYnVpbGRlci4KICAvLy8KICAvLy8gVGhpcyBpcyBub3JtYWxseSB0aGUgbWVtYmVyIGl0c2VsZiwgaWYgbm90IGEgc2V0dGVyLCBidXQgZm9yIGluc3RhbmNlIGZvcgogIC8vLyBsb3dlcmVkIGxhdGUgZmllbGRzIHRoaXMgY2FuIGJlIHN5bnRoZXNpemVkIG1lbWJlcnMuCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0IGxvY2FsTWVtYmVyczsKCiAgLy8vIFJldHVybnMgdGhlIFtDbGFzc01lbWJlcl1zIGZvciB0aGUgc2V0dGVycyBjcmVhdGVkIGZvciB0aGlzIG1lbWJlcgogIC8vLyBidWlsZGVyLgogIC8vLwogIC8vLyBUaGlzIGlzIG5vcm1hbGx5IHRoZSBtZW1iZXIgaXRzZWxmLCBpZiBhIHNldHRlciwgYnV0IGZvciBpbnN0YW5jZQogIC8vLyBsb3dlcmVkIGxhdGUgZmllbGRzIHRoaXMgY2FuIGJlIHN5bnRoZXNpemVkIHNldHRlcnMuCiAgTGlzdDxDbGFzc01lbWJlcj4gZ2V0IGxvY2FsU2V0dGVyczsKfQoKYWJzdHJhY3QgY2xhc3MgTWVtYmVyQnVpbGRlckltcGwgZXh0ZW5kcyBNb2RpZmllckJ1aWxkZXJJbXBsCiAgICBpbXBsZW1lbnRzIE1lbWJlckJ1aWxkZXIgewogIC8vLyBGb3IgdG9wLWxldmVsIG1lbWJlcnMsIHRoZSBwYXJlbnQgaXMgc2V0IGNvcnJlY3RseSBkdXJpbmcKICAvLy8gY29uc3RydWN0aW9uLiBIb3dldmVyLCBmb3IgY2xhc3MgbWVtYmVycywgdGhlIHBhcmVudCBpcyBpbml0aWFsbHkgdGhlCiAgLy8vIGxpYnJhcnkgYW5kIHVwZGF0ZWQgbGF0ZXIuCiAgQG92ZXJyaWRlCiAgQnVpbGRlciBwYXJlbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZTsKCiAgTWVtYmVyRGF0YUZvclRlc3RpbmcgZGF0YUZvclRlc3Rpbmc7CgogIE1lbWJlckJ1aWxkZXJJbXBsKHRoaXMucGFyZW50LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBkYXRhRm9yVGVzdGluZyA9CiAgICAgICAgICAgIHJldGFpbkRhdGFGb3JUZXN0aW5nID8gbmV3IE1lbWJlckRhdGFGb3JUZXN0aW5nKCkgOiBudWxsLAogICAgICAgIHN1cGVyKHBhcmVudCwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlciA9PiBpc0RlY2xhcmF0aW9uTWVtYmVyICYmICFpc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNDbGFzc0luc3RhbmNlTWVtYmVyID0+IGlzQ2xhc3NNZW1iZXIgJiYgIWlzU3RhdGljOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0V4dGVuc2lvbkluc3RhbmNlTWVtYmVyID0+IGlzRXh0ZW5zaW9uTWVtYmVyICYmICFpc1N0YXRpYzsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNEZWNsYXJhdGlvbk1lbWJlciA9PiBwYXJlbnQgaXMgRGVjbGFyYXRpb25CdWlsZGVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NsYXNzTWVtYmVyID0+IHBhcmVudCBpcyBDbGFzc0J1aWxkZXI7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRXh0ZW5zaW9uTWVtYmVyID0+IHBhcmVudCBpcyBFeHRlbnNpb25CdWlsZGVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc1RvcExldmVsID0+ICFpc0RlY2xhcmF0aW9uTWVtYmVyOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc05hdGl2ZSA9PiBmYWxzZTsKCiAgYm9vbCBnZXQgaXNSZWRpcmVjdGluZ0dlbmVyYXRpdmVDb25zdHJ1Y3RvciA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgTGlicmFyeUJ1aWxkZXIgZ2V0IGxpYnJhcnkgewogICAgaWYgKHBhcmVudCBpcyBMaWJyYXJ5QnVpbGRlcikgewogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gcGFyZW50OwogICAgICByZXR1cm4gbGlicmFyeS5wYXJ0T2ZMaWJyYXJ5ID8/IGxpYnJhcnk7CiAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBFeHRlbnNpb25CdWlsZGVyKSB7CiAgICAgIEV4dGVuc2lvbkJ1aWxkZXIgZXh0ZW5zaW9uID0gcGFyZW50OwogICAgICByZXR1cm4gZXh0ZW5zaW9uLmxpYnJhcnk7CiAgICB9IGVsc2UgewogICAgICBDbGFzc0J1aWxkZXIgY2xzID0gcGFyZW50OwogICAgICByZXR1cm4gY2xzLmxpYnJhcnk7CiAgICB9CiAgfQoKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcyBhbmQgY3JlYXRlIGEgW1Byb2NlZHVyZUJ1aWxkZXJdIGludGVyZmFjZS4KICBAb3ZlcnJpZGUKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kID0+IHVuc3VwcG9ydGVkKCJraW5kIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CgogIEBvdmVycmlkZQogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykge30KCiAgdm9pZCBidWlsZE1lbWJlcnMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHZvaWQgRnVuY3Rpb24oTWVtYmVyLCBCdWlsdE1lbWJlcktpbmQpIGYpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IG5hbWU7CgogIEBvdmVycmlkZQogIFN0cmluZ0J1ZmZlciBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgIGlmIChpc0NsYXNzTWVtYmVyKSB7CiAgICAgIGJ1ZmZlci53cml0ZShjbGFzc0J1aWxkZXIubmFtZSk7CiAgICAgIGJ1ZmZlci53cml0ZSgnLicpOwogICAgfQogICAgYnVmZmVyLndyaXRlKG5hbWUpOwogICAgcmV0dXJuIGJ1ZmZlcjsKICB9CgogIEBvdmVycmlkZQogIENsYXNzQnVpbGRlciBnZXQgY2xhc3NCdWlsZGVyID0+IHBhcmVudCBpcyBDbGFzc0J1aWxkZXIgPyBwYXJlbnQgOiBudWxsOwp9CgplbnVtIEJ1aWx0TWVtYmVyS2luZCB7CiAgQ29uc3RydWN0b3IsCiAgUmVkaXJlY3RpbmdGYWN0b3J5LAogIEZpZWxkLAogIE1ldGhvZCwKICBFeHRlbnNpb25GaWVsZCwKICBFeHRlbnNpb25NZXRob2QsCiAgRXh0ZW5zaW9uR2V0dGVyLAogIEV4dGVuc2lvblNldHRlciwKICBFeHRlbnNpb25PcGVyYXRvciwKICBFeHRlbnNpb25UZWFyT2ZmLAogIExhdGVJc1NldEZpZWxkLAogIExhdGVHZXR0ZXIsCiAgTGF0ZVNldHRlciwKfQoKY2xhc3MgTWVtYmVyRGF0YUZvclRlc3RpbmcgewogIGZpbmFsIEluZmVyZW5jZURhdGFGb3JUZXN0aW5nIGluZmVyZW5jZURhdGEgPSBuZXcgSW5mZXJlbmNlRGF0YUZvclRlc3RpbmcoKTsKCiAgTWVtYmVyQnVpbGRlciBwYXRjaEZvclRlc3Rpbmc7Cn0KgLUATk48AR4BIgEiKQEhATEsNiIBFx0jIR8gAUciAR4BKhUBQQZNTkgZAT0GS1AdGgE9BkxKGwFRGgFNAU0WBlA7JgFJDwZIOyYCAT0fQEwhDBIBDBMBJwExGUYjAQxMAQxAAQxIAQxAAQw0AQw8AQwvAQweATgBDB8kJy8tKyANIRoGBAFRDEYBDE8BFUkBDCgBDC4ZJxkGGBMEAQxLAgEXDxYJChITExMVFBIODgIBHU8BIQIBN3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnRlZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnSEuC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLm1vZGlmaWVyX2J1aWxkZXI7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgTW9kaWZpZXJCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7CiAgU3RyaW5nIGdldCBuYW1lOwoKICBib29sIGdldCBpc05hdGl2ZTsKfQoKYWJzdHJhY3QgY2xhc3MgTW9kaWZpZXJCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJJbXBsCiAgICBpbXBsZW1lbnRzIE1vZGlmaWVyQnVpbGRlciB7CiAgaW50IGdldCBtb2RpZmllcnM7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lOwoKICBAb3ZlcnJpZGUKICBCdWlsZGVyIHBhcmVudDsKCiAgQG92ZXJyaWRlCiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CgogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBNb2RpZmllckJ1aWxkZXJJbXBsKHRoaXMucGFyZW50LCB0aGlzLmNoYXJPZmZzZXQsIFtVcmkgZmlsZVVyaV0pCiAgICAgIDogZmlsZVVyaSA9IGZpbGVVcmkgPz8gcGFyZW50Py5maWxlVXJpOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0ID0+IChtb2RpZmllcnMgJiBjb25zdE1hc2spICE9IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmluYWwgPT4gKG1vZGlmaWVycyAmIGZpbmFsTWFzaykgIT0gMDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gKG1vZGlmaWVycyAmIHN0YXRpY01hc2spICE9IDA7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTmF0aXZlID0+IGZhbHNlOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICByZXR1cm4gYnVmZmVyLi53cml0ZShuYW1lID8/IGZ1bGxOYW1lRm9yRXJyb3JzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICIke2lzUGF0Y2ggPyAncGF0Y2ggJyA6ICcnfSRkZWJ1Z05hbWUoJHtwcmludE9uKG5ldyBTdHJpbmdCdWZmZXIoKSl9KSI7Cn0KOABOTjwBIAEbARcBNBMBFQIBNyEVARgBDBIBDBgBDBUBQy4BDDQBDDQBDDYBDB4BLjUEAQwXTgIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL21vZGlmaWVyX2J1aWxkZXIuZGFydGdmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0qhwvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5uYW1lZF90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydCcgc2hvdyBTZXZlcml0eTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIFN1cGVydHlwZSwgVHlwZWRlZlR5cGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTWVzc2FnZSwKICAgICAgICBUZW1wbGF0ZSwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgbWVzc2FnZU5vdEFUeXBlQ29udGV4dCwKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICB0ZW1wbGF0ZU5vdEFUeXBlLAogICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2gsCiAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUsCiAgICAgICAgdGVtcGxhdGVUeXBlTm90Rm91bmQ7CgppbXBvcnQgJy4uL2lkZW50aWZpZXJzLmRhcnQnIHNob3cgSWRlbnRpZmllciwgUXVhbGlmaWVkTmFtZSwgZmxhdHRlbk5hbWU7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93IG5vTGVuZ3RoLCB0ZW1wbGF0ZVN1cGVydHlwZUlzSWxsZWdhbCwgdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnOwppbXBvcnQgJ2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnaW52YWxpZF90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAncHJlZml4X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwoKY2xhc3MgTmFtZWRUeXBlQnVpbGRlciBleHRlbmRzIFR5cGVCdWlsZGVyIHsKICBmaW5hbCBPYmplY3QgbmFtZTsKCiAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzOwoKICBmaW5hbCBOdWxsYWJpbGl0eUJ1aWxkZXIgbnVsbGFiaWxpdHlCdWlsZGVyOwoKICBAb3ZlcnJpZGUKICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uOwoKICBOYW1lZFR5cGVCdWlsZGVyKHRoaXMubmFtZSwgdGhpcy5udWxsYWJpbGl0eUJ1aWxkZXIsIHRoaXMuYXJndW1lbnRzKTsKCiAgTmFtZWRUeXBlQnVpbGRlci5mcm9tVHlwZURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgdGhpcy5kZWNsYXJhdGlvbiwgdGhpcy5udWxsYWJpbGl0eUJ1aWxkZXIsCiAgICAgIFt0aGlzLmFyZ3VtZW50c10pCiAgICAgIDogdGhpcy5uYW1lID0gZGVjbGFyYXRpb24ubmFtZTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBiaW5kKFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24pIHsKICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbj8ub3JpZ2luOwogIH0KCiAgaW50IGdldCBuYW1lT2Zmc2V0IHsKICAgIGlmIChuYW1lIGlzIElkZW50aWZpZXIpIHsKICAgICAgSWRlbnRpZmllciBpZGVudGlmaWVyID0gbmFtZTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXIuY2hhck9mZnNldDsKICAgIH0KICAgIHJldHVybiAtMTsgLy8gVE9ETyhlZXJuc3QpOiBtYWtlIGl0IHBvc3NpYmxlIHRvIGdldCBvZmZzZXQuCiAgfQoKICBpbnQgZ2V0IG5hbWVMZW5ndGggewogICAgaWYgKG5hbWUgaXMgSWRlbnRpZmllcikgewogICAgICBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBuYW1lOwogICAgICByZXR1cm4gaWRlbnRpZmllci5uYW1lLmxlbmd0aDsKICAgIH0gZWxzZSBpZiAobmFtZSBpcyBTdHJpbmcpIHsKICAgICAgU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lOwogICAgICByZXR1cm4gbmFtZVN0cmluZy5sZW5ndGg7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbm9MZW5ndGg7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlc29sdmVJbigKICAgICAgU2NvcGUgc2NvcGUsIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHJldHVybjsKICAgIGZpbmFsIE9iamVjdCBuYW1lID0gdGhpcy5uYW1lOwogICAgQnVpbGRlciBtZW1iZXI7CiAgICBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIE9iamVjdCBxdWFsaWZpZXIgPSBuYW1lLnF1YWxpZmllcjsKICAgICAgU3RyaW5nIHByZWZpeE5hbWUgPSBmbGF0dGVuTmFtZShxdWFsaWZpZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICBCdWlsZGVyIHByZWZpeCA9IHNjb3BlLmxvb2t1cChwcmVmaXhOYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgaWYgKHByZWZpeCBpcyBQcmVmaXhCdWlsZGVyKSB7CiAgICAgICAgbWVtYmVyID0gcHJlZml4Lmxvb2t1cChuYW1lLm5hbWUsIG5hbWUuY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobmFtZSBpcyBTdHJpbmcpIHsKICAgICAgbWVtYmVyID0gc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke25hbWUucnVudGltZVR5cGV9IiwgInJlc29sdmVJbiIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKG1lbWJlciBpcyBUeXBlVmFyaWFibGVCdWlsZGVyKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gbWVtYmVyLm9yaWdpbjsKICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgU3RyaW5nIHR5cGVOYW1lOwogICAgICAgIGludCB0eXBlTmFtZU9mZnNldDsKICAgICAgICBpZiAobmFtZSBpcyBJZGVudGlmaWVyKSB7CiAgICAgICAgICB0eXBlTmFtZSA9IG5hbWUubmFtZTsKICAgICAgICAgIHR5cGVOYW1lT2Zmc2V0ID0gbmFtZS5jaGFyT2Zmc2V0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlTmFtZSA9IG5hbWU7CiAgICAgICAgICB0eXBlTmFtZU9mZnNldCA9IGNoYXJPZmZzZXQ7CiAgICAgICAgfQogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9CiAgICAgICAgICAgIHRlbXBsYXRlVHlwZUFyZ3VtZW50c09uVHlwZVZhcmlhYmxlLndpdGhBcmd1bWVudHModHlwZU5hbWUpOwogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCB0eXBlTmFtZU9mZnNldCwgdHlwZU5hbWUubGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgICBkZWNsYXJhdGlvbiA9IGJ1aWxkSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgICAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIHR5cGVOYW1lT2Zmc2V0LCB0eXBlTmFtZS5sZW5ndGgpKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKG1lbWJlciBpcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVyKSB7CiAgICAgIGRlY2xhcmF0aW9uID0gbWVtYmVyLm9yaWdpbjsKICAgICAgaWYgKCFkZWNsYXJhdGlvbi5pc0V4dGVuc2lvbikgewogICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCAmJiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQgIT0gMCkgewogICAgICAgICAgU3RyaW5nIHR5cGVOYW1lOwogICAgICAgICAgaW50IHR5cGVOYW1lT2Zmc2V0OwogICAgICAgICAgaWYgKG5hbWUgaXMgSWRlbnRpZmllcikgewogICAgICAgICAgICB0eXBlTmFtZSA9IG5hbWUubmFtZTsKICAgICAgICAgICAgdHlwZU5hbWVPZmZzZXQgPSBuYW1lLmNoYXJPZmZzZXQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0eXBlTmFtZSA9IG5hbWU7CiAgICAgICAgICAgIHR5cGVOYW1lT2Zmc2V0ID0gY2hhck9mZnNldDsKICAgICAgICAgIH0KICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50KSwKICAgICAgICAgICAgICB0eXBlTmFtZU9mZnNldCwKICAgICAgICAgICAgICB0eXBlTmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcgbmFtZSk+IHRlbXBsYXRlID0KICAgICAgICBtZW1iZXIgPT0gbnVsbCA/IHRlbXBsYXRlVHlwZU5vdEZvdW5kIDogdGVtcGxhdGVOb3RBVHlwZTsKICAgIFN0cmluZyBmbGF0TmFtZSA9IGZsYXR0ZW5OYW1lKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dDsKICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgewogICAgICBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBtZXNzYWdlTm90QVR5cGVDb250ZXh0LndpdGhMb2NhdGlvbihtZW1iZXIuZmlsZVVyaSwgbWVtYmVyLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5hbWUgaXMgSWRlbnRpZmllciA/IG5hbWUubmFtZS5sZW5ndGggOiAiJG5hbWUiLmxlbmd0aCkKICAgICAgXTsKICAgIH0KICAgIGludCBsZW5ndGggPQogICAgICAgIG5hbWUgaXMgSWRlbnRpZmllciA/IG5hbWUuZW5kQ2hhck9mZnNldCAtIGNoYXJPZmZzZXQgOiBmbGF0TmFtZS5sZW5ndGg7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKGZsYXROYW1lKTsKICAgIGxpYnJhcnkuYWRkUHJvYmxlbShtZXNzYWdlLCBjaGFyT2Zmc2V0LCBsZW5ndGgsIGZpbGVVcmksIGNvbnRleHQ6IGNvbnRleHQpOwogICAgZGVjbGFyYXRpb24gPSBidWlsZEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICAgIG1lc3NhZ2Uud2l0aExvY2F0aW9uKGZpbGVVcmksIGNoYXJPZmZzZXQsIGxlbmd0aCksCiAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGNoZWNrKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmCiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpIHsKICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaAogICAgICAgICAgLndpdGhBcmd1bWVudHMoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50KTsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgICAgZGVjbGFyYXRpb24gPSBidWlsZEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpKTsKICAgIH0KICB9CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJOYW1lZFR5cGVCdWlsZGVyIjsKCiAgU3RyaW5nQnVmZmVyIHByaW50T24oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogICAgYnVmZmVyLndyaXRlKG5hbWUpOwogICAgaWYgKGFyZ3VtZW50cz8uaXNFbXB0eSA/PyB0cnVlKSByZXR1cm4gYnVmZmVyOwogICAgYnVmZmVyLndyaXRlKCI8Iik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoVHlwZUJ1aWxkZXIgdCBpbiBhcmd1bWVudHMpIHsKICAgICAgaWYgKCFmaXJzdCkgYnVmZmVyLndyaXRlKCIsICIpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB0LnByaW50T24oYnVmZmVyKTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgiPiIpOwogICAgbnVsbGFiaWxpdHlCdWlsZGVyLndyaXRlTnVsbGFiaWxpdHlPbihidWZmZXIpOwogICAgcmV0dXJuIGJ1ZmZlcjsKICB9CgogIEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGJ1aWxkSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgIExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgLy8gVE9ETyhhaGUpOiBDb25zaWRlciBpZiBpdCBtYWtlcyBzZW5zZSB0byBwYXNzIGEgUXVhbGlmaWVkTmFtZSB0bwogICAgLy8gSW52YWxpZFR5cGVCdWlsZGVyPwogICAgcmV0dXJuIG5ldyBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgICBmbGF0dGVuTmFtZShuYW1lLCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UudXJpKSwgbWVzc2FnZSwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIFN1cGVydHlwZSBoYW5kbGVJbnZhbGlkU3VwZXJ0eXBlKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oU3RyaW5nIG5hbWUpPiB0ZW1wbGF0ZSA9CiAgICAgICAgZGVjbGFyYXRpb24uaXNUeXBlVmFyaWFibGUKICAgICAgICAgICAgPyB0ZW1wbGF0ZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlCiAgICAgICAgICAgIDogdGVtcGxhdGVTdXBlcnR5cGVJc0lsbGVnYWw7CiAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGUud2l0aEFyZ3VtZW50cyhmbGF0dGVuTmFtZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKSksCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBub0xlbmd0aCwKICAgICAgICBmaWxlVXJpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU3RvcmUgW29yaWdpbl0gb24gdGhlIGJ1aWx0IHR5cGUuCiAgRGFydFR5cGUgYnVpbGQoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgW1R5cGVkZWZUeXBlIG9yaWdpbl0pIHsKICAgIGFzc2VydChkZWNsYXJhdGlvbiAhPSBudWxsLCAiRGVjbGFyYXRpb24gaGFzIG5vdCBiZWVuIHJlc29sdmVkIG9uICR0aGlzLiIpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uLmJ1aWxkVHlwZShsaWJyYXJ5LCBudWxsYWJpbGl0eUJ1aWxkZXIsIGFyZ3VtZW50cyk7CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICBpZiAoZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5idWlsZFN1cGVydHlwZShsaWJyYXJ5LCBhcmd1bWVudHMpOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb25CdWlsZGVyID0KICAgICAgICAgIGRlY2xhcmF0aW9uLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgICAgaWYgKGRlY2xhcmF0aW9uQnVpbGRlciBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25CdWlsZGVyLmJ1aWxkU3VwZXJ0eXBlKGxpYnJhcnksIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5tZXNzYWdlT2JqZWN0LAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5jaGFyT2Zmc2V0LAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5sZW5ndGgsCiAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLnVyaSwKICAgICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGhhbmRsZUludmFsaWRTdXBlcnR5cGUobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBTdXBlcnR5cGUgYnVpbGRNaXhlZEluVHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uID0gdGhpcy5kZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIFR5cGVBbGlhc0J1aWxkZXIgYWxpYXNCdWlsZGVyID0gZGVjbGFyYXRpb247CiAgICAgIGRlY2xhcmF0aW9uID0gYWxpYXNCdWlsZGVyLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uLmJ1aWxkTWl4ZWRJblR5cGUobGlicmFyeSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5tZXNzYWdlT2JqZWN0LAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5jaGFyT2Zmc2V0LAogICAgICAgICAgZGVjbGFyYXRpb24ubWVzc2FnZS5sZW5ndGgsCiAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLnVyaSwKICAgICAgICAgIHNldmVyaXR5OiBTZXZlcml0eS5lcnJvcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhhbmRsZUludmFsaWRTdXBlcnR5cGUobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgICB9CiAgfQoKICBUeXBlQnVpbGRlciBzdWJzdChNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IHN1YnN0aXR1dGlvbikgewogICAgVHlwZUJ1aWxkZXIgcmVzdWx0ID0gc3Vic3RpdHV0aW9uW2RlY2xhcmF0aW9uXTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICBhc3NlcnQoZGVjbGFyYXRpb24gaXMgVHlwZVZhcmlhYmxlQnVpbGRlcik7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50czsKICAgICAgaW50IGkgPSAwOwogICAgICBmb3IgKFR5cGVCdWlsZGVyIGFyZ3VtZW50IGluIHRoaXMuYXJndW1lbnRzKSB7CiAgICAgICAgVHlwZUJ1aWxkZXIgdHlwZSA9IGFyZ3VtZW50LnN1YnN0KHN1YnN0aXR1dGlvbik7CiAgICAgICAgaWYgKHR5cGUgIT0gYXJndW1lbnQpIHsKICAgICAgICAgIGFyZ3VtZW50cyA/Pz0gdGhpcy5hcmd1bWVudHMudG9MaXN0KCk7CiAgICAgICAgICBhcmd1bWVudHNbaV0gPSB0eXBlOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICAgIH0KICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPQogICAgICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsYWJpbGl0eUJ1aWxkZXIsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKICAgICAgICAgIHJlc3VsdC5iaW5kKGRlY2xhcmF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuYm91bmQgdHlwZSBpbiBzdWJzdGl0dXRpb246ICRyZXN1bHQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgTmFtZWRUeXBlQnVpbGRlciBjbG9uZShMaXN0PFR5cGVCdWlsZGVyPiBuZXdUeXBlcykgewogICAgTGlzdDxUeXBlQnVpbGRlcj4gY2xvbmVkQXJndW1lbnRzOwogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGNsb25lZEFyZ3VtZW50cyA9IG5ldyBMaXN0PFR5cGVCdWlsZGVyPihhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRBcmd1bWVudHNbaV0gPSBhcmd1bWVudHNbaV0uY2xvbmUobmV3VHlwZXMpOwogICAgICB9CiAgICB9CiAgICBOYW1lZFR5cGVCdWlsZGVyIG5ld1R5cGUgPQogICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyKG5hbWUsIG51bGxhYmlsaXR5QnVpbGRlciwgY2xvbmVkQXJndW1lbnRzKTsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBCdWlsdGluVHlwZUJ1aWxkZXIpIHsKICAgICAgbmV3VHlwZS5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwogICAgfSBlbHNlIHsKICAgICAgbmV3VHlwZXMuYWRkKG5ld1R5cGUpOwogICAgfQogICAgcmV0dXJuIG5ld1R5cGU7CiAgfQoKICBOYW1lZFR5cGVCdWlsZGVyIHdpdGhOdWxsYWJpbGl0eUJ1aWxkZXIoCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIpIHsKICAgIHJldHVybiBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsYWJpbGl0eUJ1aWxkZXIsIGFyZ3VtZW50cykKICAgICAgLi5iaW5kKGRlY2xhcmF0aW9uKTsKICB9Cn0KgUUATk48ASIBTwFIAR0JERISLiAYGiYtHgFKARpQASoBGAEXJB0wHyMeIhwoJQEtFQEfAS8BDCYBSAEvMRgmAQwyLAQBFx4kJAZABAEXHiQlISAgDRcGBAEMEkolIxQhKUdGJUUIITgNSgYpIx8ZHCIgLBEbJwoaSU86TQgOMyMmSBseJCIuEx0pDB4zQh4fGAoQCAY3Qj4iGiJPRAkGEVA4UDY7GwQBDEQdPjU6QjhABgQBLgEuGDMXFycmFRkGFzMTBAFEHihIGy5FGwQBJD03Iy4qGEgUEhIRBAE8QVBKBAEcPTsnPTIyKjBGCD8aLSomIyUTBkEEAR49OyszNQYnPz8aLSomIyUTDUMGBAFKNBoyFSQjETU5IDEfCg0IHyJHIyQRUAoXCAYRBAE3Jx1BOTsIBh9JLSkNHQYUBAErL0UbBAIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0aGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvbnVsbGFiaWxpdHlfYnVpbGRlci5kYXJ0ix0vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4va2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JzsKCmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwoKLy8vIFJlcHJlc2VudHMgdGhlIG51bGxhYmlsaXR5IG1vZGlmaWVycyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIHRoZSB0eXBlcy4KLy8vCi8vLyBUaGUgc3ludGFjdGljIG51bGxhYmlsaXR5IG5lZWRzIHRvIGJlIGludGVycHJldGVkLCB0aGF0IGlzLCBidWlsdCwgaW50byB0aGUKLy8vIHNlbWFudGljIG51bGxhYmlsaXR5IHVzZWQgb24gW0RhcnRUeXBlXXMgb2YgS2VybmVsLgplbnVtIFN5bnRhY3RpY051bGxhYmlsaXR5IHsKICAvLy8gVXNlZCB3aGVuIHRoZSB0eXBlIGlzIGRlY2xhcmVkIHdpdGggJz8nIHN1ZmZpeCBhZnRlciBpdC4KICBudWxsYWJsZSwKCiAgLy8vIFVzZWQgd2hlbiB0aGUgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbiBvcHRlZC1vdXQgbGlicmFyeS4KICBsZWdhY3ksCgogIC8vLyBVc2VkIHdoZW4gdGhlIHR5cGUgaXMgZGVjbGFyZWQgd2l0aG91dCBhbnkgbnVsbGFiaWxpdHkgc3VmZml4ZXMuCiAgb21pdHRlZCwKfQoKY2xhc3MgTnVsbGFiaWxpdHlCdWlsZGVyIHsKICBmaW5hbCBTeW50YWN0aWNOdWxsYWJpbGl0eSBfc3ludGFjdGljTnVsbGFiaWxpdHk7CgogIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5udWxsYWJsZSgpCiAgICAgIDogX3N5bnRhY3RpY051bGxhYmlsaXR5ID0gU3ludGFjdGljTnVsbGFiaWxpdHkubnVsbGFibGU7CgogIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCkKICAgICAgOiBfc3ludGFjdGljTnVsbGFiaWxpdHkgPSBTeW50YWN0aWNOdWxsYWJpbGl0eS5vbWl0dGVkOwoKICBmYWN0b3J5IE51bGxhYmlsaXR5QnVpbGRlci5mcm9tTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICByZXR1cm4gY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm51bGxhYmxlKCk7CiAgICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICBjYXNlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOgogICAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKTsKICAgIH0KICB9CgogIE51bGxhYmlsaXR5IGJ1aWxkKExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyLCB7TnVsbGFiaWxpdHkgaWZPbWl0dGVkfSkgewogICAgLy8gVE9ETyhkbWl0cnlhcyk6IEVuc3VyZSB0aGF0IGVpdGhlciBpZk9taXR0ZWQgaXMgc2V0IG9yIGxpYnJhcnlCdWlsZGVyIGlzCiAgICAvLyBwcm92aWRlZDsKICAgIC8vYXNzZXJ0KGxpYnJhcnlCdWlsZGVyICE9IG51bGwgfHwgaWZPbWl0dGVkICE9IG51bGwpOwogICAgaWZPbWl0dGVkID8/PSAobGlicmFyeUJ1aWxkZXIgPT0gbnVsbCA/IE51bGxhYmlsaXR5LmxlZ2FjeSA6IG51bGwpOwoKICAgIGlmT21pdHRlZCA/Pz0gbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgID8gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUKICAgICAgICA6IE51bGxhYmlsaXR5LmxlZ2FjeTsKICAgIHN3aXRjaCAoX3N5bnRhY3RpY051bGxhYmlsaXR5KSB7CiAgICAgIGNhc2UgU3ludGFjdGljTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICAgIHJldHVybiBOdWxsYWJpbGl0eS5sZWdhY3k7CiAgICAgIGNhc2UgU3ludGFjdGljTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgICAgcmV0dXJuIE51bGxhYmlsaXR5Lm51bGxhYmxlOwogICAgICBjYXNlIFN5bnRhY3RpY051bGxhYmlsaXR5Lm9taXR0ZWQ6CiAgICAgICAgcmV0dXJuIGlmT21pdHRlZDsKICAgIH0KICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgIiRfc3ludGFjdGljTnVsbGFiaWxpdHkiLCAiYnVpbGROdWxsYWJpbGl0eSIsIG5vTG9jYXRpb24sIG51bGwpOwogIH0KCiAgdm9pZCB3cml0ZU51bGxhYmlsaXR5T24oU3RyaW5nQnVmZmVyIHNiKSB7CiAgICBzd2l0Y2ggKF9zeW50YWN0aWNOdWxsYWJpbGl0eSkgewogICAgICBjYXNlIFN5bnRhY3RpY051bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICBzYi53cml0ZSgiKiIpOwogICAgICAgIHJldHVybjsKICAgICAgY2FzZSBTeW50YWN0aWNOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICBzYi53cml0ZSgiPyIpOwogICAgICAgIHJldHVybjsKICAgICAgY2FzZSBTeW50YWN0aWNOdWxsYWJpbGl0eS5vbWl0dGVkOgogICAgICAgIC8vIERvIG5vdGhpbmcuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdW5oYW5kbGVkKCIkX3N5bnRhY3RpY051bGxhYmlsaXR5IiwgIndyaXRlTnVsbGFiaWxpdHlPbiIsIG5vTG9jYXRpb24sIG51bGwpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIHdyaXRlTnVsbGFiaWxpdHlPbihidWZmZXIpOwogICAgcmV0dXJuICIkYnVmZmVyIjsKICB9Cn0KXQBOTjwBIgEiASYbAR8BTgRQOBw/DAE+CgFHCwIBGzQBJj8BJT4BSBshNB8kJQ8zBgQBTlARO0gBOCIeJSgjKiUpGgYWSQQBLSUoFxAqFxApFxAGUQQBFi4gFgQCATxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9udWxsYWJpbGl0eV9idWlsZGVyLmRhcnRjZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0iBcvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5wcmVmaXhfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTGlicmFyeURlcGVuZGVuY3k7CgppbXBvcnQgJy4uL2tlcm5lbC9sb2FkX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IExvYWRMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCc7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnOwppbXBvcnQgJ2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIFByZWZpeEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVySW1wbCB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIGZpbmFsIFNjb3BlIGV4cG9ydFNjb3BlID0gbmV3IFNjb3BlLnRvcCgpOwoKICBmaW5hbCBMaWJyYXJ5QnVpbGRlciBwYXJlbnQ7CgogIGZpbmFsIGJvb2wgZGVmZXJyZWQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBmaW5hbCBpbnQgaW1wb3J0SW5kZXg7CgogIGZpbmFsIExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3k7CgogIExvYWRMaWJyYXJ5QnVpbGRlciBsb2FkTGlicmFyeUJ1aWxkZXI7CgogIFByZWZpeEJ1aWxkZXIodGhpcy5uYW1lLCB0aGlzLmRlZmVycmVkLCB0aGlzLnBhcmVudCwgdGhpcy5kZXBlbmRlbmN5LAogICAgICB0aGlzLmNoYXJPZmZzZXQsIHRoaXMuaW1wb3J0SW5kZXgpIHsKICAgIGlmIChkZWZlcnJlZCkgewogICAgICBsb2FkTGlicmFyeUJ1aWxkZXIgPQogICAgICAgICAgbmV3IExvYWRMaWJyYXJ5QnVpbGRlcihwYXJlbnQsIGRlcGVuZGVuY3ksIGNoYXJPZmZzZXQpOwogICAgICBhZGRUb0V4cG9ydFNjb3BlKCdsb2FkTGlicmFyeScsIGxvYWRMaWJyYXJ5QnVpbGRlciwgY2hhck9mZnNldCk7CiAgICB9CiAgfQoKICBVcmkgZ2V0IGZpbGVVcmkgPT4gcGFyZW50LmZpbGVVcmk7CgogIEJ1aWxkZXIgbG9va3VwKFN0cmluZyBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICAgIHJldHVybiBleHBvcnRTY29wZS5sb29rdXAobmFtZSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICB2b2lkIGFkZFRvRXhwb3J0U2NvcGUoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyLCBpbnQgY2hhck9mZnNldCkgewogICAgaWYgKGRlZmVycmVkICYmIG1lbWJlciBpcyBFeHRlbnNpb25CdWlsZGVyKSB7CiAgICAgIHBhcmVudC5hZGRQcm9ibGVtKHRlbXBsYXRlRGVmZXJyZWRFeHRlbnNpb25JbXBvcnQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGNoYXJPZmZzZXQsIG5vTGVuZ3RoLCBmaWxlVXJpKTsKICAgIH0KCiAgICBCdWlsZGVyIGV4aXN0aW5nID0KICAgICAgICBleHBvcnRTY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IG1lbWJlci5pc1NldHRlcik7CiAgICBCdWlsZGVyIHJlc3VsdDsKICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IHBhcmVudC5jb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb24oCiAgICAgICAgICBuYW1lLCBleGlzdGluZywgbWVtYmVyLCBjaGFyT2Zmc2V0LAogICAgICAgICAgaXNFeHBvcnQ6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbWVtYmVyOwogICAgfQogICAgZXhwb3J0U2NvcGUuYWRkTG9jYWxNZW1iZXIobmFtZSwgcmVzdWx0LCBzZXR0ZXI6IG1lbWJlci5pc1NldHRlcik7CiAgICBpZiAocmVzdWx0IGlzIEV4dGVuc2lvbkJ1aWxkZXIpIHsKICAgICAgZXhwb3J0U2NvcGUuYWRkRXh0ZW5zaW9uKHJlc3VsdCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzID0+IG5hbWU7Cn0KTgBOTjwBHgE5AUYBHgEYARchHwEqFQEtAR8BFwEMGAEZASYBKQFIKxQbQkcGBAElAT06BAFHMk0qBgEXRhQcMy4bDRcGRyYoBgQBDCgCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0ZmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvcHJvY2VkdXJlX2J1aWxkZXIuZGFydMAATd8vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FwaS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKCmltcG9ydCAnLi4va2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0JyBzaG93IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHk7CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcKICAgIHNob3cgbWVzc2FnZUNvbnN0RmFjdG9yeVJlZGlyZWN0aW9uVG9Ob25Db25zdCwgbm9MZW5ndGg7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5leHBlY3RlZCwgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdidWlsZGVyLmRhcnQnOwppbXBvcnQgJ2NvbnN0cnVjdG9yX3JlZmVyZW5jZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdmdW5jdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21lbWJlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ21ldGFkYXRhX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBQcm9jZWR1cmVCdWlsZGVyIGltcGxlbWVudHMgRnVuY3Rpb25CdWlsZGVyIHsKICBpbnQgZ2V0IGNoYXJPcGVuUGFyZW5PZmZzZXQ7CgogIFByb2NlZHVyZUJ1aWxkZXIgZ2V0IHBhdGNoRm9yVGVzdGluZzsKCiAgQXN5bmNNYXJrZXIgYWN0dWFsQXN5bmNNb2RpZmllcjsKCiAgUHJvY2VkdXJlIGdldCBwcm9jZWR1cmU7CgogIFByb2NlZHVyZUtpbmQgZ2V0IGtpbmQ7CgogIFByb2NlZHVyZSBnZXQgYWN0dWFsUHJvY2VkdXJlOwoKICBib29sIGhhZFR5cGVzSW5mZXJyZWQ7CgogIEBvdmVycmlkZQogIFByb2NlZHVyZUJ1aWxkZXIgZ2V0IG9yaWdpbjsKCiAgdm9pZCBzZXQgYXN5bmNNb2RpZmllcihBc3luY01hcmtlciBuZXdNb2RpZmllcik7CgogIGJvb2wgZ2V0IGlzRWxpZ2libGVGb3JUb3BMZXZlbEluZmVyZW5jZTsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcHJvY2VkdXJlIGlzIGRlY2xhcmVkIGluIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi4KICBib29sIGdldCBpc0V4dGVuc2lvbk1ldGhvZDsKfQoKY2xhc3MgUHJvY2VkdXJlQnVpbGRlckltcGwgZXh0ZW5kcyBGdW5jdGlvbkJ1aWxkZXJJbXBsCiAgICBpbXBsZW1lbnRzIFByb2NlZHVyZUJ1aWxkZXIgewogIGZpbmFsIFByb2NlZHVyZSBfcHJvY2VkdXJlOwogIGZpbmFsIFByb2NlZHVyZSBfdGVhck9mZlJlZmVyZW5jZUZyb207CgogIEBvdmVycmlkZQogIGZpbmFsIGludCBjaGFyT3BlblBhcmVuT2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBmaW5hbCBQcm9jZWR1cmVLaW5kIGtpbmQ7CgogIEBvdmVycmlkZQogIEFzeW5jTWFya2VyIGFjdHVhbEFzeW5jTW9kaWZpZXIgPSBBc3luY01hcmtlci5TeW5jOwoKICBAb3ZlcnJpZGUKICBQcm9jZWR1cmVCdWlsZGVyIGFjdHVhbE9yaWdpbjsKCiAgQG92ZXJyaWRlCiAgUHJvY2VkdXJlIGdldCBhY3R1YWxQcm9jZWR1cmUgPT4gX3Byb2NlZHVyZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBoYWRUeXBlc0luZmVycmVkID0gZmFsc2U7CgogIC8vLyBJZiB0aGlzIGlzIGFuIGV4dGVuc2lvbiBpbnN0YW5jZSBtZXRob2QgdGhlbiBbX2V4dGVuc2lvblRlYXJPZmZdIGhvbGRzCiAgLy8vIHRoZSBzeW50aGV0aWNhbGx5IGNyZWF0ZWQgdGVhciBvZmYgZnVuY3Rpb24uCiAgUHJvY2VkdXJlIF9leHRlbnNpb25UZWFyT2ZmOwoKICAvLy8gSWYgdGhpcyBpcyBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWV0aG9kIHRoZW4KICAvLy8gW19leHRlbnNpb25UZWFyT2ZmUGFyYW1ldGVyTWFwXSBob2xkcyBhIG1hcCBmcm9tIHRoZSBwYXJhbWV0ZXJzIG9mCiAgLy8vIHRoZSBtZXRob2RzIHRvIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGNsb3N1cmUgcmV0dXJuZWQgaW4gdGhlIHRlYXItb2ZmLgogIC8vLwogIC8vLyBUaGlzIG1hcCBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgb24gdGhlIGNsb3N1cmUgcGFyYW1ldGVycyB3aGVuCiAgLy8vIHRoZXNlIGhhdmUgYmVlbiBidWlsdC4KICBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbj4gX2V4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXJNYXA7CgogIFByb2NlZHVyZUJ1aWxkZXJJbXBsKAogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEsCiAgICAgIGludCBtb2RpZmllcnMsCiAgICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMsCiAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscywKICAgICAgdGhpcy5raW5kLAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICB0aGlzLmNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICBQcm9jZWR1cmUgcmVmZXJlbmNlRnJvbSwKICAgICAgdGhpcy5fdGVhck9mZlJlZmVyZW5jZUZyb20sCiAgICAgIFtTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZV0pCiAgICAgIDogX3Byb2NlZHVyZSA9IG5ldyBQcm9jZWR1cmUobnVsbCwga2luZCwgbnVsbCwKICAgICAgICAgICAgZmlsZVVyaTogY29tcGlsYXRpb25Vbml0LmZpbGVVcmksCiAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlRnJvbT8ucmVmZXJlbmNlKQogICAgICAgICAgLi5zdGFydEZpbGVPZmZzZXQgPSBzdGFydENoYXJPZmZzZXQKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGNoYXJPZmZzZXQKICAgICAgICAgIC4uZmlsZUVuZE9mZnNldCA9IGNoYXJFbmRPZmZzZXQKICAgICAgICAgIC4uaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGNvbXBpbGF0aW9uVW5pdC5pc05vbk51bGxhYmxlQnlEZWZhdWx0LAogICAgICAgIHN1cGVyKG1ldGFkYXRhLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIG5hbWUsIHR5cGVWYXJpYWJsZXMsIGZvcm1hbHMsCiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwgY2hhck9mZnNldCwgbmF0aXZlTWV0aG9kTmFtZSk7CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXQgcmVhZFRhcmdldCB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgICByZXR1cm4gZXh0ZW5zaW9uVGVhck9mZiA/PyBwcm9jZWR1cmU7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgcmV0dXJuIHByb2NlZHVyZTsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuRmFjdG9yeToKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRocm93IHVuaGFuZGxlZCgnUHJvY2VkdXJlS2luZCcsICcka2luZCcsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCB3cml0ZVRhcmdldCB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICByZXR1cm4gcHJvY2VkdXJlOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhyb3cgdW5oYW5kbGVkKCdQcm9jZWR1cmVLaW5kJywgJyRraW5kJywgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IGludm9rZVRhcmdldCB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuRmFjdG9yeToKICAgICAgICByZXR1cm4gcHJvY2VkdXJlOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhyb3cgdW5oYW5kbGVkKCdQcm9jZWR1cmVLaW5kJywgJyRraW5kJywgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBQcm9jZWR1cmVCdWlsZGVyIGdldCBvcmlnaW4gPT4gYWN0dWFsT3JpZ2luID8/IHRoaXM7CgogIEBvdmVycmlkZQogIFByb2NlZHVyZUJ1aWxkZXIgZ2V0IHBhdGNoRm9yVGVzdGluZyA9PiBkYXRhRm9yVGVzdGluZz8ucGF0Y2hGb3JUZXN0aW5nOwoKICBAb3ZlcnJpZGUKICBBc3luY01hcmtlciBnZXQgYXN5bmNNb2RpZmllciA9PiBhY3R1YWxBc3luY01vZGlmaWVyOwoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnQgZ2V0IGJvZHkgewogICAgaWYgKGJvZHlJbnRlcm5hbCA9PSBudWxsICYmICFpc0Fic3RyYWN0ICYmICFpc0V4dGVybmFsKSB7CiAgICAgIGJvZHlJbnRlcm5hbCA9IG5ldyBFbXB0eVN0YXRlbWVudCgpOwogICAgfQogICAgcmV0dXJuIGJvZHlJbnRlcm5hbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGFzeW5jTW9kaWZpZXIoQXN5bmNNYXJrZXIgbmV3TW9kaWZpZXIpIHsKICAgIGFjdHVhbEFzeW5jTW9kaWZpZXIgPSBuZXdNb2RpZmllcjsKICAgIGlmIChmdW5jdGlvbiAhPSBudWxsKSB7CiAgICAgIC8vIE5vIHBhcmVudCwgaXQncyBhbiBlbnVtLgogICAgICBmdW5jdGlvbi5hc3luY01hcmtlciA9IGFjdHVhbEFzeW5jTW9kaWZpZXI7CiAgICAgIGZ1bmN0aW9uLmRhcnRBc3luY01hcmtlciA9IGFjdHVhbEFzeW5jTW9kaWZpZXI7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0VsaWdpYmxlRm9yVG9wTGV2ZWxJbmZlcmVuY2UgewogICAgaWYgKGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcikgewogICAgICBpZiAocmV0dXJuVHlwZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gZm9ybWFscykgewogICAgICAgICAgaWYgKGZvcm1hbC50eXBlID09IG51bGwpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNFeHRlbnNpb25NZXRob2QgewogICAgcmV0dXJuIHBhcmVudCBpcyBFeHRlbnNpb25CdWlsZGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE1lbWJlcnMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHZvaWQgRnVuY3Rpb24oTWVtYmVyLCBCdWlsdE1lbWJlcktpbmQpIGYpIHsKICAgIE1lbWJlciBtZW1iZXIgPSBidWlsZChsaWJyYXJ5KTsKICAgIGlmIChpc0V4dGVuc2lvbk1ldGhvZCkgewogICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICAgICAgZihtZW1iZXIsIEJ1aWx0TWVtYmVyS2luZC5FeHRlbnNpb25NZXRob2QpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgICAgIGYobWVtYmVyLCBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uR2V0dGVyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgICBmKG1lbWJlciwgQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvblNldHRlcik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgICAgICBmKG1lbWJlciwgQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvbk9wZXJhdG9yKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZXh0ZW5zaW9uIG1ldGhvZCBraW5kICR7a2luZH0nKTsKICAgICAgfQogICAgICBpZiAoZXh0ZW5zaW9uVGVhck9mZiAhPSBudWxsKSB7CiAgICAgICAgZihleHRlbnNpb25UZWFyT2ZmLCBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uVGVhck9mZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGYobWVtYmVyLCBCdWlsdE1lbWJlcktpbmQuTWV0aG9kKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFByb2NlZHVyZSBidWlsZChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcikgewogICAgLy8gVE9ETyhhaGUpOiBJIHRoaW5rIHdlIG1heSBjYWxsIHRoaXMgdHdpY2Ugb24gcGFydHMuIEludmVzdGlnYXRlLgogICAgaWYgKF9wcm9jZWR1cmUubmFtZSA9PSBudWxsKSB7CiAgICAgIF9wcm9jZWR1cmUuZnVuY3Rpb24gPSBidWlsZEZ1bmN0aW9uKGxpYnJhcnlCdWlsZGVyKTsKICAgICAgX3Byb2NlZHVyZS5mdW5jdGlvbi5wYXJlbnQgPSBfcHJvY2VkdXJlOwogICAgICBfcHJvY2VkdXJlLmZ1bmN0aW9uLmZpbGVPZmZzZXQgPSBjaGFyT3BlblBhcmVuT2Zmc2V0OwogICAgICBfcHJvY2VkdXJlLmZ1bmN0aW9uLmZpbGVFbmRPZmZzZXQgPSBfcHJvY2VkdXJlLmZpbGVFbmRPZmZzZXQ7CiAgICAgIF9wcm9jZWR1cmUuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CiAgICAgIF9wcm9jZWR1cmUuaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWw7CiAgICAgIF9wcm9jZWR1cmUuaXNDb25zdCA9IGlzQ29uc3Q7CiAgICAgIGlmIChpc0V4dGVuc2lvbk1ldGhvZCkgewogICAgICAgIEV4dGVuc2lvbkJ1aWxkZXIgZXh0ZW5zaW9uQnVpbGRlciA9IHBhcmVudDsKICAgICAgICBfcHJvY2VkdXJlLmlzRXh0ZW5zaW9uTWVtYmVyID0gdHJ1ZTsKICAgICAgICBfcHJvY2VkdXJlLmlzU3RhdGljID0gdHJ1ZTsKICAgICAgICBpZiAoaXNFeHRlbnNpb25JbnN0YW5jZU1lbWJlcikgewogICAgICAgICAgX3Byb2NlZHVyZS5raW5kID0gUHJvY2VkdXJlS2luZC5NZXRob2Q7CiAgICAgICAgfQogICAgICAgIF9wcm9jZWR1cmUubmFtZSA9IG5ldyBOYW1lKAogICAgICAgICAgICBjcmVhdGVQcm9jZWR1cmVOYW1lKHRydWUsICFpc0V4dGVuc2lvbkluc3RhbmNlTWVtYmVyLCBraW5kLAogICAgICAgICAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci5uYW1lLCBuYW1lKSwKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3Byb2NlZHVyZS5pc1N0YXRpYyA9IGlzU3RhdGljOwogICAgICAgIF9wcm9jZWR1cmUubmFtZSA9IG5ldyBOYW1lKG5hbWUsIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpOwogICAgICB9CiAgICAgIGlmIChleHRlbnNpb25UZWFyT2ZmICE9IG51bGwpIHsKICAgICAgICBfYnVpbGRFeHRlbnNpb25UZWFyT2ZmKGxpYnJhcnlCdWlsZGVyLCBwYXJlbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gX3Byb2NlZHVyZTsKICB9CgogIHN0YXRpYyBTdHJpbmcgY3JlYXRlUHJvY2VkdXJlTmFtZShib29sIGlzRXh0ZW5zaW9uTWV0aG9kLCBib29sIGlzU3RhdGljLAogICAgICBQcm9jZWR1cmVLaW5kIGtpbmQsIFN0cmluZyBleHRlbnNpb25OYW1lLCBTdHJpbmcgbmFtZSkgewogICAgaWYgKGlzRXh0ZW5zaW9uTWV0aG9kKSB7CiAgICAgIFN0cmluZyBraW5kSW5maXggPSAnJzsKICAgICAgaWYgKCFpc1N0YXRpYykgewogICAgICAgIC8vIEluc3RhbmNlIGdldHRlciBhbmQgc2V0dGVyIGFyZSBjb252ZXJ0ZWQgdG8gbWV0aG9kcyBzbyB3ZSB1c2UgYW4KICAgICAgICAvLyBpbmZpeCB0byBtYWtlIHRoZWlyIG5hbWVzIHVuaXF1ZS4KICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgICAgIGtpbmRJbmZpeCA9ICdnZXQjJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgICAgICBraW5kSW5maXggPSAnc2V0Iyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgICAgICAga2luZEluZml4ID0gJyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkZhY3Rvcnk6CiAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZXh0ZW5zaW9uIG1ldGhvZCBraW5kICR7a2luZH0nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICcke2V4dGVuc2lvbk5hbWV9fCR7a2luZEluZml4fSR7bmFtZX0nOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgfQoKICAvLy8gQ3JlYXRlcyBhIHRvcCBsZXZlbCBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSB0ZWFyIG9mZiBvZiBhbiBleHRlbnNpb24KICAvLy8gaW5zdGFuY2UgbWV0aG9kLgogIC8vLwogIC8vLyBGb3IgdGhpcyBkZWNsYXJhdGlvbgogIC8vLwogIC8vLyAgICAgZXh0ZW5zaW9uIEU8VD4gb24gQTxUPiB7CiAgLy8vICAgICAgIFggbWV0aG9kPFM+KFMgcywgWSB5KSB7fQogIC8vLyAgICAgfQogIC8vLwogIC8vLyB3ZSBjcmVhdGUgdGhlIHRvcCBsZXZlbCBmdW5jdGlvbgogIC8vLwogIC8vLyAgICAgWCBFfG1ldGhvZDxULCBTPihBPFQ+ICN0aGlzLCBTIHMsIFkgeSkge30KICAvLy8KICAvLy8gYW5kIHRoZSB0ZWFyIG9mZiBmdW5jdGlvbgogIC8vLwogIC8vLyAgICAgWCBGdW5jdGlvbjxTPihTLCBZKSBFfGdldCNtZXRob2Q8VD4oQTxUPiAjdGhpcykgewogIC8vLyAgICAgICByZXR1cm4gKFMgcywgWSB5KSA9PiBFfG1ldGhvZDxULCBTPigjdGhpcywgcywgeSk7CiAgLy8vICAgICB9CiAgLy8vCiAgdm9pZCBfYnVpbGRFeHRlbnNpb25UZWFyT2ZmKAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciwgRXh0ZW5zaW9uQnVpbGRlciBleHRlbnNpb25CdWlsZGVyKSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2V4dGVuc2lvblRlYXJPZmYgIT0gbnVsbCwgIk5vIGV4dGVuc2lvbiB0ZWFyIG9mZiBjcmVhdGVkIGZvciAkdGhpcy4iKTsKICAgIGlmIChfZXh0ZW5zaW9uVGVhck9mZi5uYW1lICE9IG51bGwpIHJldHVybjsKCiAgICBfZXh0ZW5zaW9uVGVhck9mZlBhcmFtZXRlck1hcCA9IHt9OwoKICAgIGludCBmaWxlT2Zmc2V0ID0gX3Byb2NlZHVyZS5maWxlT2Zmc2V0OwoKICAgIGludCBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQgPQogICAgICAgIGV4dGVuc2lvbkJ1aWxkZXIudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwOwoKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSA8VHlwZVBhcmFtZXRlcj5bXTsKCiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbk1hcCA9IHt9OwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IDxEYXJ0VHlwZT5bXTsKICAgIGZvciAoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgbmV3VHlwZVBhcmFtZXRlciA9IG5ldyBUeXBlUGFyYW1ldGVyKHR5cGVQYXJhbWV0ZXIubmFtZSk7CiAgICAgIHR5cGVQYXJhbWV0ZXJzLmFkZChuZXdUeXBlUGFyYW1ldGVyKTsKICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoc3Vic3RpdHV0aW9uTWFwW3R5cGVQYXJhbWV0ZXJdID0KICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIsIG5ld1R5cGVQYXJhbWV0ZXIpKTsKICAgIH0KCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHRlYXJPZmZUeXBlUGFyYW1ldGVycyA9IDxUeXBlUGFyYW1ldGVyPltdOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBjbG9zdXJlVHlwZVBhcmFtZXRlcnMgPSA8VHlwZVBhcmFtZXRlcj5bXTsKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICBUeXBlUGFyYW1ldGVyIG5ld1R5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpbmRleF07CiAgICAgIG5ld1R5cGVQYXJhbWV0ZXIuYm91bmQgPQogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2luZGV4XS5ib3VuZCk7CiAgICAgIG5ld1R5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGUgPSBmdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpbmRleF0uZGVmYXVsdFR5cGU7CiAgICAgIGlmIChpbmRleCA8IGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCkgewogICAgICAgIHRlYXJPZmZUeXBlUGFyYW1ldGVycy5hZGQobmV3VHlwZVBhcmFtZXRlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xvc3VyZVR5cGVQYXJhbWV0ZXJzLmFkZChuZXdUeXBlUGFyYW1ldGVyKTsKICAgICAgfQogICAgfQoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY29weVBhcmFtZXRlcigKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciwgRGFydFR5cGUgdHlwZSwKICAgICAgICB7Ym9vbCBpc09wdGlvbmFsfSkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIG5ld1BhcmFtZXRlciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKHBhcmFtZXRlci5uYW1lLAogICAgICAgICAgdHlwZTogdHlwZSwgaXNGaW5hbDogcGFyYW1ldGVyLmlzRmluYWwpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gcGFyYW1ldGVyLmZpbGVPZmZzZXQ7CiAgICAgIF9leHRlbnNpb25UZWFyT2ZmUGFyYW1ldGVyTWFwW3BhcmFtZXRlcl0gPSBuZXdQYXJhbWV0ZXI7CiAgICAgIHJldHVybiBuZXdQYXJhbWV0ZXI7CiAgICB9CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbnNpb25UaGlzID0gY29weVBhcmFtZXRlcigKICAgICAgICBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5maXJzdCwKICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuZmlyc3QudHlwZSksCiAgICAgICAgaXNPcHRpb25hbDogZmFsc2UpOwoKICAgIERhcnRUeXBlIGNsb3N1cmVSZXR1cm5UeXBlID0KICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZnVuY3Rpb24ucmV0dXJuVHlwZSk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGNsb3N1cmVQb3NpdGlvbmFsUGFyYW1ldGVycyA9IFtdOwogICAgTGlzdDxFeHByZXNzaW9uPiBjbG9zdXJlUG9zaXRpb25hbEFyZ3VtZW50cyA9IFtdOwoKICAgIGZvciAoaW50IHBvc2l0aW9uID0gMDsKICAgICAgICBwb3NpdGlvbiA8IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICBwb3NpdGlvbisrKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbcG9zaXRpb25dOwogICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgIC8vLyBQYXNzIGB0aGlzYCBhcyBhIGNhcHR1cmVkIHZhcmlhYmxlLgogICAgICAgIGNsb3N1cmVQb3NpdGlvbmFsQXJndW1lbnRzCiAgICAgICAgICAgIC5hZGQobmV3IFZhcmlhYmxlR2V0KGV4dGVuc2lvblRoaXMpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgRGFydFR5cGUgdHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBuZXdQYXJhbWV0ZXIgPSBjb3B5UGFyYW1ldGVyKHBhcmFtZXRlciwgdHlwZSwKICAgICAgICAgICAgaXNPcHRpb25hbDogcG9zaXRpb24gPj0gZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgICAgICAgY2xvc3VyZVBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFkZChuZXdQYXJhbWV0ZXIpOwogICAgICAgIGNsb3N1cmVQb3NpdGlvbmFsQXJndW1lbnRzCiAgICAgICAgICAgIC5hZGQobmV3IFZhcmlhYmxlR2V0KG5ld1BhcmFtZXRlcikuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBjbG9zdXJlTmFtZWRQYXJhbWV0ZXJzID0gW107CiAgICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gY2xvc3VyZU5hbWVkQXJndW1lbnRzID0gW107CiAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICBEYXJ0VHlwZSB0eXBlID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHBhcmFtZXRlci50eXBlKTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBuZXdQYXJhbWV0ZXIgPQogICAgICAgICAgY29weVBhcmFtZXRlcihwYXJhbWV0ZXIsIHR5cGUsIGlzT3B0aW9uYWw6IHRydWUpOwogICAgICBjbG9zdXJlTmFtZWRQYXJhbWV0ZXJzLmFkZChuZXdQYXJhbWV0ZXIpOwogICAgICBjbG9zdXJlTmFtZWRBcmd1bWVudHMuYWRkKG5ldyBOYW1lZEV4cHJlc3Npb24ocGFyYW1ldGVyLm5hbWUsCiAgICAgICAgICBuZXcgVmFyaWFibGVHZXQobmV3UGFyYW1ldGVyKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpKTsKICAgIH0KCiAgICBTdGF0ZW1lbnQgY2xvc3VyZUJvZHkgPSBuZXcgUmV0dXJuU3RhdGVtZW50KAogICAgICAgIG5ldyBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICBfcHJvY2VkdXJlLAogICAgICAgICAgICBuZXcgQXJndW1lbnRzKGNsb3N1cmVQb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgICAgICAgdHlwZXM6IHR5cGVBcmd1bWVudHMsIG5hbWVkOiBjbG9zdXJlTmFtZWRBcmd1bWVudHMpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKCiAgICBGdW5jdGlvbkV4cHJlc3Npb24gY2xvc3VyZSA9IG5ldyBGdW5jdGlvbkV4cHJlc3Npb24obmV3IEZ1bmN0aW9uTm9kZSgKICAgICAgICBjbG9zdXJlQm9keSwKICAgICAgICB0eXBlUGFyYW1ldGVyczogY2xvc3VyZVR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBjbG9zdXJlUG9zaXRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBjbG9zdXJlTmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IF9wcm9jZWR1cmUuZnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAtIDEsCiAgICAgICAgcmV0dXJuVHlwZTogY2xvc3VyZVJldHVyblR5cGUsCiAgICAgICAgYXN5bmNNYXJrZXI6IF9wcm9jZWR1cmUuZnVuY3Rpb24uYXN5bmNNYXJrZXIsCiAgICAgICAgZGFydEFzeW5jTWFya2VyOiBfcHJvY2VkdXJlLmZ1bmN0aW9uLmRhcnRBc3luY01hcmtlcikpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CgogICAgX2V4dGVuc2lvblRlYXJPZmYKICAgICAgLi5uYW1lID0gbmV3IE5hbWUoCiAgICAgICAgICAnJHtleHRlbnNpb25CdWlsZGVyLm5hbWV9fGdldCMke25hbWV9JywgbGlicmFyeUJ1aWxkZXIubGlicmFyeSkKICAgICAgLi5mdW5jdGlvbiA9IG5ldyBGdW5jdGlvbk5vZGUoCiAgICAgICAgICBuZXcgUmV0dXJuU3RhdGVtZW50KGNsb3N1cmUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0ZWFyT2ZmVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogW2V4dGVuc2lvblRoaXNdLAogICAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogMSwKICAgICAgICAgIHJldHVyblR5cGU6IGNsb3N1cmUuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShsaWJyYXJ5Lm5vbk51bGxhYmxlKSkKICAgICAgLi5maWxlVXJpID0gZmlsZVVyaQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgX2V4dGVuc2lvblRlYXJPZmYuZnVuY3Rpb24ucGFyZW50ID0gX2V4dGVuc2lvblRlYXJPZmY7CiAgfQoKICBAb3ZlcnJpZGUKICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldEV4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXIoaW50IGluZGV4KSB7CiAgICBpZiAoX2V4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXJNYXAgIT0gbnVsbCkgewogICAgICByZXR1cm4gX2V4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXJNYXBbZ2V0Rm9ybWFsUGFyYW1ldGVyKGluZGV4KV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIFByb2NlZHVyZSBnZXQgcHJvY2VkdXJlID0+IGlzUGF0Y2ggPyBvcmlnaW4ucHJvY2VkdXJlIDogX3Byb2NlZHVyZTsKCiAgUHJvY2VkdXJlIGdldCBleHRlbnNpb25UZWFyT2ZmIHsKICAgIGlmIChpc0V4dGVuc2lvbkluc3RhbmNlTWVtYmVyICYmIGtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgX2V4dGVuc2lvblRlYXJPZmYgPz89IG5ldyBQcm9jZWR1cmUobnVsbCwgUHJvY2VkdXJlS2luZC5NZXRob2QsIG51bGwsCiAgICAgICAgICBpc1N0YXRpYzogdHJ1ZSwKICAgICAgICAgIGlzRXh0ZW5zaW9uTWVtYmVyOiB0cnVlLAogICAgICAgICAgcmVmZXJlbmNlOiBfdGVhck9mZlJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CiAgICB9CiAgICByZXR1cm4gX2V4dGVuc2lvblRlYXJPZmY7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IG1lbWJlciA9PiBwcm9jZWR1cmU7CgogIEBvdmVycmlkZQogIGludCBmaW5pc2hQYXRjaCgpIHsKICAgIGlmICghaXNQYXRjaCkgcmV0dXJuIDA7CgogICAgLy8gVE9ETyhhaGUpOiByZXN0b3JlIGZpbGUtb2Zmc2V0IG9uY2Ugd2UgdHJhY2sgYm90aCBvcmlnaW4gYW5kIHBhdGNoIGZpbGUKICAgIC8vIFVSSXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzE1NzkKICAgIG9yaWdpbi5wcm9jZWR1cmUuZmlsZVVyaSA9IGZpbGVVcmk7CiAgICBvcmlnaW4ucHJvY2VkdXJlLnN0YXJ0RmlsZU9mZnNldCA9IF9wcm9jZWR1cmUuc3RhcnRGaWxlT2Zmc2V0OwogICAgb3JpZ2luLnByb2NlZHVyZS5maWxlT2Zmc2V0ID0gX3Byb2NlZHVyZS5maWxlT2Zmc2V0OwogICAgb3JpZ2luLnByb2NlZHVyZS5maWxlRW5kT2Zmc2V0ID0gX3Byb2NlZHVyZS5maWxlRW5kT2Zmc2V0OwogICAgb3JpZ2luLnByb2NlZHVyZS5hbm5vdGF0aW9ucwogICAgICAgIC5mb3JFYWNoKChtKSA9PiBtLmZpbGVPZmZzZXQgPSBfcHJvY2VkdXJlLmZpbGVPZmZzZXQpOwoKICAgIG9yaWdpbi5wcm9jZWR1cmUuaXNBYnN0cmFjdCA9IF9wcm9jZWR1cmUuaXNBYnN0cmFjdDsKICAgIG9yaWdpbi5wcm9jZWR1cmUuaXNFeHRlcm5hbCA9IF9wcm9jZWR1cmUuaXNFeHRlcm5hbDsKICAgIG9yaWdpbi5wcm9jZWR1cmUuZnVuY3Rpb24gPSBfcHJvY2VkdXJlLmZ1bmN0aW9uOwogICAgb3JpZ2luLnByb2NlZHVyZS5mdW5jdGlvbi5wYXJlbnQgPSBvcmlnaW4ucHJvY2VkdXJlOwogICAgcmV0dXJuIDE7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlY29tZU5hdGl2ZShMb2FkZXIgbG9hZGVyKSB7CiAgICBfcHJvY2VkdXJlLmlzRXh0ZXJuYWwgPSB0cnVlOwogICAgc3VwZXIuYmVjb21lTmF0aXZlKGxvYWRlcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFwcGx5UGF0Y2goQnVpbGRlciBwYXRjaCkgewogICAgaWYgKHBhdGNoIGlzIFByb2NlZHVyZUJ1aWxkZXJJbXBsKSB7CiAgICAgIGlmIChjaGVja1BhdGNoKHBhdGNoKSkgewogICAgICAgIHBhdGNoLmFjdHVhbE9yaWdpbiA9IHRoaXM7CiAgICAgICAgZGF0YUZvclRlc3Rpbmc/LnBhdGNoRm9yVGVzdGluZyA9IHBhdGNoOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBvcnRQYXRjaE1pc21hdGNoKHBhdGNoKTsKICAgIH0KICB9Cn0KCmNsYXNzIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIgZXh0ZW5kcyBQcm9jZWR1cmVCdWlsZGVySW1wbCB7CiAgZmluYWwgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZGlyZWN0aW9uVGFyZ2V0OwogIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CgogIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSwKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcywKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzLAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsCiAgICAgIGludCBzdGFydENoYXJPZmZzZXQsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgaW50IGNoYXJFbmRPZmZzZXQsCiAgICAgIFByb2NlZHVyZSByZWZlcmVuY2VGcm9tLAogICAgICBQcm9jZWR1cmUgdGVhck9mZlJlZmVyZW5jZUZyb20sCiAgICAgIFtTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZSwKICAgICAgdGhpcy5yZWRpcmVjdGlvblRhcmdldF0pCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgICAgIGZvcm1hbHMsCiAgICAgICAgICAgIFByb2NlZHVyZUtpbmQuRmFjdG9yeSwKICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LAogICAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICAgIGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgICAgIHJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgIHRlYXJPZmZSZWZlcmVuY2VGcm9tLAogICAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50IGdldCBib2R5ID0+IGJvZHlJbnRlcm5hbDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KE1lbWJlciB0YXJnZXQsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKICAgIGlmIChib2R5SW50ZXJuYWwgIT0gbnVsbCkgewogICAgICB1bmV4cGVjdGVkKCJudWxsIiwgIiR7Ym9keUludGVybmFsLnJ1bnRpbWVUeXBlfSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQoKICAgIC8vIEVuc3VyZSB0aGF0IGNvbnN0YW50IGZhY3RvcmllcyBvbmx5IGhhdmUgY29uc3RhbnQgdGFyZ2V0cy9ib2RpZXMuCiAgICBpZiAoaXNDb25zdCAmJiAhdGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3QsIGNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwgZmlsZVVyaSk7CiAgICB9CgogICAgYm9keUludGVybmFsID0gbmV3IFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodGFyZ2V0LCB0eXBlQXJndW1lbnRzKTsKICAgIGZ1bmN0aW9uLmJvZHkgPSBib2R5SW50ZXJuYWw7CiAgICBib2R5SW50ZXJuYWw/LnBhcmVudCA9IGZ1bmN0aW9uOwogICAgaWYgKGlzUGF0Y2gpIHsKICAgICAgaWYgKGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdWJzdGl0dXRpb25bZnVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV1dID0KICAgICAgICAgICAgICBuZXcgVHlwZVBhcmFtZXRlclR5cGUud2l0aERlZmF1bHROdWxsYWJpbGl0eUZvckxpYnJhcnkoCiAgICAgICAgICAgICAgICAgIGFjdHVhbE9yaWdpbi5mdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXSwgbGlicmFyeS5saWJyYXJ5KTsKICAgICAgICB9CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gbmV3VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPih0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gc3Vic3RpdHV0ZSh0eXBlQXJndW1lbnRzW2ldLCBzdWJzdGl0dXRpb24pOwogICAgICAgIH0KICAgICAgICB0eXBlQXJndW1lbnRzID0gbmV3VHlwZUFyZ3VtZW50czsKICAgICAgfQogICAgICBhY3R1YWxPcmlnaW4uc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0YXJnZXQsIHR5cGVBcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE1lbWJlcnMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHZvaWQgRnVuY3Rpb24oTWVtYmVyLCBCdWlsdE1lbWJlcktpbmQpIGYpIHsKICAgIE1lbWJlciBtZW1iZXIgPSBidWlsZChsaWJyYXJ5KTsKICAgIGYobWVtYmVyLCBCdWlsdE1lbWJlcktpbmQuUmVkaXJlY3RpbmdGYWN0b3J5KTsKICB9CgogIEBvdmVycmlkZQogIFByb2NlZHVyZSBidWlsZChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICBQcm9jZWR1cmUgcmVzdWx0ID0gc3VwZXIuYnVpbGQobGlicmFyeSk7CiAgICByZXN1bHQuaXNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciA9IHRydWU7CiAgICBpZiAocmVkaXJlY3Rpb25UYXJnZXQudHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+KHJlZGlyZWN0aW9uVGFyZ2V0LnR5cGVBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdHlwZUFyZ3VtZW50c1tpXSA9IHJlZGlyZWN0aW9uVGFyZ2V0LnR5cGVBcmd1bWVudHNbaV0uYnVpbGQobGlicmFyeSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZmluaXNoUGF0Y2goKSB7CiAgICBpZiAoIWlzUGF0Y2gpIHJldHVybiAwOwoKICAgIHN1cGVyLmZpbmlzaFBhdGNoKCk7CgogICAgaWYgKG9yaWdpbiBpcyBSZWRpcmVjdGluZ0ZhY3RvcnlCdWlsZGVyKSB7CiAgICAgIFJlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXIgcmVkaXJlY3RpbmdPcmlnaW4gPSBvcmlnaW47CiAgICAgIHJlZGlyZWN0aW5nT3JpZ2luLnR5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOwogICAgfQoKICAgIHJldHVybiAxOwogIH0KfQqCZwBOTjwBIgE9IgErAU4BJQEaPQE2AUoBFy0hKCAeIB8cJQE9HwEoASMBGwEaASEBGQEMHwEzASsBUB4CATciHikBDCEBDBwBDDYBDCEBDC8BDCEBTTMfATNJTAZQHU8BGCYVHhMvLBEsGxYgGR8iITUuMS4kKk1NPAEMGhQhLiEaIyEiFQZEBAEMGxQhGiEhIyIVBkQEAQwcFCEhIyIaIRUGRAQBDDcBDEsBDDgBDBc+KwYZBAEMNCccIjI2BgQBDCwnKx05MAoIBhIEAQwfJwQBDBVKJB0WIzYRIzYRIzYRJTgRJCY7CCY/CA0pBgQBDDlIIzsvPEQqKiQfNC0kKTIKJEguJQ8oQggmOAgGFwQBSz8dHRdMLRglIBMlIBMlJxwTJig9Cgg1DRMGBAFLFwYbBiMlDAYnBjQGIAY8PgwGH1AMUDABKAEsASY2ATwBNzFDTiw5MjEGAUNDR0I+H01RMTUPNQgGASc2HVEyLT8bBgE3LU8cASE6QDYBGzkWTxswI0sPRUpGNyNKCAY7NkZDKTwwREQGATEeGDZFJSEBShUvOzFQJzY/IQEWGUolQTExJVEaITsEAQxAMUcGEQQBDEYBI0VMGiM3QwYeBAEMIgEMFhwBTz8oQzk/IT8BOTk1OQ4EAQwlIiAEAQwjKR8jMQgNIgYEAgE/NyABHSYVHhMvLCwbFh8ZHyYgHw8WFxgSGxUjHR0YIRsbIh8BDCYBDFAgTgYBSSZPHgYBRiIlEy1RQzVGTQoqNjxMCioIRQYEAQwVSiQzBAEMMi0zMxZGN04IBhMEAQwWHAEZAS88NwYBDgQCATpwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0Z2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnSn/i8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmZ1bmN0aW9uX3R5cGVfYWxpYXNfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZml4ZWRfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBOdWxsYWJpbGl0eSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVkZWYsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBnZXRBc1R5cGVBcmd1bWVudHM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JwogICAgc2hvdyBGcmVzaFR5cGVQYXJhbWV0ZXJzLCBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzLCBzdWJzdGl0dXRlOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JwogICAgc2hvdyBub0xlbmd0aCwgdGVtcGxhdGVDeWNsaWNUeXBlZGVmLCB0ZW1wbGF0ZVR5cGVBcmd1bWVudE1pc21hdGNoOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdtZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCc7CgpjbGFzcyBUeXBlQWxpYXNCdWlsZGVyIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlckltcGwgewogIGZpbmFsIFR5cGVCdWlsZGVyIHR5cGU7CgogIGZpbmFsIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gX3R5cGVWYXJpYWJsZXM7CgogIC8vLyBUaGUgW1R5cGVkZWZdIGJ1aWx0IGJ5IHRoaXMgYnVpbGRlci4KICBmaW5hbCBUeXBlZGVmIHR5cGVkZWY7CgogIERhcnRUeXBlIHRoaXNUeXBlOwoKICBUeXBlQWxpYXNCdWlsZGVyKExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwgU3RyaW5nIG5hbWUsCiAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZXMsIHRoaXMudHlwZSwgTGlicmFyeUJ1aWxkZXIgcGFyZW50LCBpbnQgY2hhck9mZnNldCwKICAgICAge1R5cGVkZWYgdHlwZWRlZiwgVHlwZWRlZiByZWZlcmVuY2VGcm9tfSkKICAgICAgOiB0eXBlZGVmID0gdHlwZWRlZiA/PwogICAgICAgICAgICAobmV3IFR5cGVkZWYobmFtZSwgbnVsbCwKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBUeXBlVmFyaWFibGVCdWlsZGVyLnR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzKAogICAgICAgICAgICAgICAgICAgIF90eXBlVmFyaWFibGVzKSwKICAgICAgICAgICAgICAgIGZpbGVVcmk6IHBhcmVudC5saWJyYXJ5LmZpbGVVcmksCiAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0KSwKICAgICAgICBzdXBlcihtZXRhZGF0YSwgMCwgbmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlR5cGVBbGlhc0J1aWxkZXIiOwoKICBMaWJyYXJ5QnVpbGRlciBnZXQgcGFyZW50ID0+IHN1cGVyLnBhcmVudDsKCiAgLy8gVE9ETyhDRkUgVEVBTSk6IFNvbWUgb2YgdGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kLgogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gZ2V0IHR5cGVWYXJpYWJsZXMgPT4gX3R5cGVWYXJpYWJsZXM7CiAgaW50IHZhcmlhbmNlQXQoaW50IGluZGV4KSA9PiB0eXBlVmFyaWFibGVzW2luZGV4XS5wYXJhbWV0ZXIudmFyaWFuY2U7CiAgYm9vbCBnZXQgZnJvbURpbGwgPT4gZmFsc2U7CgogIFR5cGVkZWYgYnVpbGQoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeUJ1aWxkZXIpIHsKICAgIHR5cGVkZWYuLnR5cGUgPz89IGJ1aWxkVGhpc1R5cGUobGlicmFyeUJ1aWxkZXIpOwoKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSB0aGlzLnR5cGU7CiAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4odHlwZS50eXBlVmFyaWFibGVzPy5sZW5ndGggPz8gMCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSA9IHR5cGUudHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICB0eXBlUGFyYW1ldGVyc1tpXSA9IHR5cGVWYXJpYWJsZS5wYXJhbWV0ZXI7CiAgICAgIH0KICAgICAgRnJlc2hUeXBlUGFyYW1ldGVycyBmcmVzaFR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgIGdldEZyZXNoVHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOwogICAgICB0eXBlZGVmLnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUKICAgICAgICAgIC5hZGRBbGwoZnJlc2hUeXBlUGFyYW1ldGVycy5mcmVzaFR5cGVQYXJhbWV0ZXJzKTsKCiAgICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGZvcm1hbC5idWlsZChsaWJyYXJ5QnVpbGRlciwgMCk7CiAgICAgICAgICBwYXJhbWV0ZXIudHlwZSA9IGZyZXNoVHlwZVBhcmFtZXRlcnMuc3Vic3RpdHV0ZShwYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgICBpZiAoZm9ybWFsLmlzTmFtZWQpIHsKICAgICAgICAgICAgdHlwZWRlZi5uYW1lZFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0eXBlZGVmLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIgfHwgdHlwZSBpcyBGaXhlZFR5cGVCdWlsZGVyKSB7CiAgICAgIC8vIE5vIGVycm9yLCBidXQgYWxzbyBubyBhZGRpdGlvbmFsIHNldHVwIHdvcmsuCiAgICB9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICB1bmhhbmRsZWQoIiR7dHlwZS5mdWxsTmFtZUZvckVycm9yc30iLCAiYnVpbGQiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgIH0KCiAgICByZXR1cm4gdHlwZWRlZjsKICB9CgogIFR5cGVkZWZUeXBlIHRoaXNUeXBlZGVmVHlwZShUeXBlZGVmIHR5cGVkZWYsIExpYnJhcnlCdWlsZGVyIGNsaWVudExpYnJhcnkpIHsKICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGJvdW5kcyBvZiBgdHlwZWRlZi50eXBlUGFyYW1ldGVyc2AgbWF5IG5vdCBiZSBhc3NpZ25lZAogICAgLy8geWV0LCBzbyBbZ2V0QXNUeXBlQXJndW1lbnRzXSBtYXkgY3Jhc2ggdHJ5aW5nIHRvIGNvbXB1dGUgdGhlIG51bGxhYmlsaXR5CiAgICAvLyBvZiB0aGUgY3JlYXRlZCB0eXBlcyBmcm9tIHRoZSBib3VuZHMuICBUbyBhdm9pZCB0aGF0LCB3ZSB1c2UgImR5bmFtaWMiCiAgICAvLyBmb3IgdGhlIGJvdW5kIG9mIGFsbCBib3VuZGxlc3MgdmFyaWFibGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgbGlzdCBmb3IKICAgIC8vIGJlaW5nIHJlY29tcHV0ZWQgbGF0ZXIsIHdoZW4gdGhlIGJvdW5kcyBhcmUgYXNzaWduZWQuCiAgICBMaXN0PERhcnRUeXBlPiBib3VuZHMgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQodHlwZWRlZi50eXBlUGFyYW1ldGVycy5sZW5ndGgsIG51bGwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZHMubGVuZ3RoOyArK2kpIHsKICAgICAgYm91bmRzW2ldID0gdHlwZWRlZi50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZDsKICAgICAgaWYgKGJvdW5kc1tpXSA9PSBudWxsKSB7CiAgICAgICAgdHlwZWRlZi50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8RGFydFR5cGU+IGFzVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0QXNUeXBlQXJndW1lbnRzKHR5cGVkZWYudHlwZVBhcmFtZXRlcnMsIGNsaWVudExpYnJhcnkubGlicmFyeSk7CiAgICBUeXBlZGVmVHlwZSByZXN1bHQgPQogICAgICAgIG5ldyBUeXBlZGVmVHlwZSh0eXBlZGVmLCBjbGllbnRMaWJyYXJ5Lm5vbk51bGxhYmxlLCBhc1R5cGVBcmd1bWVudHMpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZHMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGJvdW5kc1tpXSA9PSBudWxsKSB7CiAgICAgICAgLy8gSWYgdGhlIGJvdW5kIGlzIG5vdCBhc3NpZ25lZCB5ZXQsIHB1dCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgIC8vIHR5cGUtcGFyYW1ldGVyIHR5cGUgaW50byB0aGUgbGlzdCBmb3IgdGhlIG51bGxhYmlsaXR5IHJlLWNvbXB1dGF0aW9uLgogICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIFtwYXJlbnRdIHNob3VsZCBiZSBhIFtTb3VyY2VMaWJyYXJ5QnVpbGRlcl0gYmVjYXVzZQogICAgICAgIC8vIG90aGVyd2lzZSBpdCdzIGEgY29tcGlsZWQgbGlicmFyeSBsb2FkZWQgZnJvbSBhIGRpbGwgZmlsZSwgYW5kIHRoZQogICAgICAgIC8vIGJvdW5kcyBzaG91bGQgaGF2ZSBiZWVuIGFzc2lnbmVkLgogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcmVudExpYnJhcnkgPSBwYXJlbnQ7CiAgICAgICAgcGFyZW50TGlicmFyeS5wZW5kaW5nTnVsbGFiaWxpdGllcy5hZGQoYXNUeXBlQXJndW1lbnRzW2ldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIERhcnRUeXBlIGJ1aWxkVGhpc1R5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgaWYgKHRoaXNUeXBlICE9IG51bGwpIHsKICAgICAgaWYgKGlkZW50aWNhbCh0aGlzVHlwZSwgY3ljbGljVHlwZUFsaWFzTWFya2VyKSkgewogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSh0ZW1wbGF0ZUN5Y2xpY1R5cGVkZWYud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgY2hhck9mZnNldCwgbm9MZW5ndGgsIGZpbGVVcmkpOwogICAgICAgIHJldHVybiBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzVHlwZTsKICAgIH0KICAgIC8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhbiBhbGlhcyAodHlwZWRlZikgdG8gcmVmZXIgdG8gaXRzZWxmLiBXZQogICAgLy8gZGV0ZWN0IGN5Y2xlcyBieSBkZXRlY3RpbmcgcmVjdXJzaXZlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIHVzaW5nIGFuCiAgICAvLyBpbnN0YW5jZSBvZiBJbnZhbGlkVHlwZSB0aGF0IGlzbid0IGlkZW50aWNhbCB0byBgY29uc3QgSW52YWxpZFR5cGUoKWAuCiAgICB0aGlzVHlwZSA9IGN5Y2xpY1R5cGVBbGlhc01hcmtlcjsKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSB0aGlzLnR5cGU7CiAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgIERhcnRUeXBlIGJ1aWx0VHlwZSA9CiAgICAgICAgICB0eXBlLmJ1aWxkKGxpYnJhcnksIHRoaXNUeXBlZGVmVHlwZSh0eXBlZGVmLCBsaWJyYXJ5KSk7CiAgICAgIGlmIChidWlsdFR5cGUgIT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0diBpbiB0eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgIC8vIEZvbGxvdyBib3VuZCBpbiBvcmRlciB0byBmaW5kIGFsbCBjeWNsZXMKICAgICAgICAgICAgdHYuYm91bmQ/LmJ1aWxkKGxpYnJhcnkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpc1R5cGUgPSBidWlsdFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXNUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXNUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICB9CgogIC8vLyBbYXJndW1lbnRzXSBoYXZlIGFscmVhZHkgYmVlbiBidWlsdC4KICBEYXJ0VHlwZSBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5LCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMpIHsKICAgIERhcnRUeXBlIHRoaXNUeXBlID0gYnVpbGRUaGlzVHlwZShsaWJyYXJ5KTsKICAgIGlmIChjb25zdCBEeW5hbWljVHlwZSgpID09IHRoaXNUeXBlKSByZXR1cm4gdGhpc1R5cGU7CiAgICBEYXJ0VHlwZSByZXN1bHQgPSB0aGlzVHlwZS53aXRoTnVsbGFiaWxpdHkobnVsbGFiaWxpdHkpOwogICAgaWYgKHR5cGVkZWYudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSAmJiBhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlZGVmLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHN1YnN0aXR1dGlvblt0eXBlZGVmLnR5cGVQYXJhbWV0ZXJzW2ldXSA9IGFyZ3VtZW50c1tpXTsKICAgIH0KICAgIHJldHVybiBzdWJzdGl0dXRlKHJlc3VsdCwgc3Vic3RpdHV0aW9uKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IGJ1aWxkVHlwZUFyZ3VtZW50cygKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICBpZiAoYXJndW1lbnRzID09IG51bGwgJiYgdHlwZVZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiA8RGFydFR5cGU+W107CiAgICB9CgogICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsICYmIHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCh0eXBlVmFyaWFibGVzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICAgIHJlc3VsdFtpXSA9IHR5cGVWYXJpYWJsZXNbaV0uZGVmYXVsdFR5cGUuYnVpbGQobGlicmFyeSk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkgaXMgU291cmNlTGlicmFyeUJ1aWxkZXIpIHsKICAgICAgICBsaWJyYXJ5LmluZmVycmVkVHlwZXMuYWRkQWxsKHJlc3VsdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCAhPSB0eXBlVmFyaWFibGVzQ291bnQpIHsKICAgICAgLy8gVGhhdCBzaG91bGQgYmUgY2F1Z2h0IGFuZCByZXBvcnRlZCBhcyBhIGNvbXBpbGUtdGltZSBlcnJvciBlYXJsaWVyLgogICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRNaXNtYXRjaAogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGVWYXJpYWJsZXNDb3VudCkKICAgICAgICAgICAgICAubWVzc2FnZSwKICAgICAgICAgICJidWlsZFR5cGVBcmd1bWVudHMiLAogICAgICAgICAgLTEsCiAgICAgICAgICBudWxsKTsKICAgIH0KCiAgICAvLyBhcmd1bWVudHMubGVuZ3RoID09IHR5cGVWYXJpYWJsZXMubGVuZ3RoCiAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoYXJndW1lbnRzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gYXJndW1lbnRzW2ldLmJ1aWxkKGxpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBJZiBbYXJndW1lbnRzXSBhcmUgbnVsbCwgdGhlIGRlZmF1bHQgdHlwZXMgZm9yIHRoZSB2YXJpYWJsZXMgYXJlIHVzZWQuCiAgQG92ZXJyaWRlCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQgPT4gdHlwZVZhcmlhYmxlcz8ubGVuZ3RoID8/IDA7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHR5cGVkZWYgaXMgYW4gYWxpYXMgb2YgdGhlIGBOdWxsYCB0eXBlLgogIGJvb2wgZ2V0IGlzTnVsbEFsaWFzIHsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgdHlwZURlY2xhcmF0aW9uQnVpbGRlciA9IHR5cGUuZGVjbGFyYXRpb247CiAgICByZXR1cm4gdHlwZURlY2xhcmF0aW9uQnVpbGRlciBpcyBDbGFzc0J1aWxkZXIgJiYKICAgICAgICB0eXBlRGVjbGFyYXRpb25CdWlsZGVyLmlzTnVsbENsYXNzOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgYnVpbGRUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIsIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cykgewogICAgRGFydFR5cGUgdGhpc1R5cGUgPSBidWlsZFRoaXNUeXBlKGxpYnJhcnkpOwogICAgaWYgKHRoaXNUeXBlIGlzIEludmFsaWRUeXBlKSByZXR1cm4gdGhpc1R5cGU7CiAgICBpZiAodHlwZWRlZi50eXBlUGFyYW1ldGVycy5pc0VtcHR5ICYmIGFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5ID0gaXNOdWxsQWxpYXMKICAgICAgICAgID8gTnVsbGFiaWxpdHkubnVsbGFibGUKICAgICAgICAgIDogbnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnkpOwogICAgICByZXR1cm4gdGhpc1R5cGUud2l0aE51bGxhYmlsaXR5KG51bGxhYmlsaXR5KTsKICAgIH0KICAgIC8vIE90aGVyd2lzZSwgc3Vic3RpdHV0ZS4KICAgIHJldHVybiBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKAogICAgICAgIGxpYnJhcnksCiAgICAgICAgbnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnkpLAogICAgICAgIGJ1aWxkVHlwZUFyZ3VtZW50cyhsaWJyYXJ5LCBhcmd1bWVudHMpKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbVHlwZURlY2xhcmF0aW9uQnVpbGRlcl0gZm9yIHRoZSBhbGlhc2VkIHR5cGUuCiAgLy8vCiAgLy8vIFRoYXQgaXMsIGl0IHJlY3Vyc2l2ZWx5IGxvb2tzIHVwIGB0eXBlLmRlY2xhcmF0aW9uYCBhbmQgcmV0dXJucyB0aGUgZmlyc3QKICAvLy8gb25lIHdoaWNoIGlzIG5vdCBhIGBUeXBlQWxpYXNCdWlsZGVyYCwgb3IgdGhlIGxhc3Qgb25lIGlmIG5vbmUgZXhpc3QuCiAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBnZXQgdW5hbGlhc0RlY2xhcmF0aW9uIHsKICAgIFNldDxUeXBlRGVjbGFyYXRpb25CdWlsZGVyPiBidWlsZGVycyA9IHt0aGlzfTsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgY3VycmVudCA9IHRoaXM7CiAgICB3aGlsZSAoY3VycmVudCBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIFR5cGVBbGlhc0J1aWxkZXIgY3VycmVudEFsaWFzQnVpbGRlciA9IGN1cnJlbnQ7CiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgbmV4dCA9IGN1cnJlbnRBbGlhc0J1aWxkZXIudHlwZT8uZGVjbGFyYXRpb247CiAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKICAgICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBpZiAoYnVpbGRlcnMuY29udGFpbnMoY3VycmVudCkpIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIGN1cnJlbnQ7CiAgfQp9CgpmaW5hbCBJbnZhbGlkVHlwZSBjeWNsaWNUeXBlQWxpYXNNYXJrZXIgPSBuZXcgSW52YWxpZFR5cGUoKTsKgRQATk48ASsBRkYhCRIVFRUXERUdHAEqQgEdSAEqAUoBHSglHyAjHCglATwaATIBKxkBFQFATTAdJVAlMTUqNgEuAS0BPUFIHgE3NQEiJytEOEI0CDAyKzwBIj5LSyA0EzkMCghHNh9MBgEUBAFPUFBOTT0cSC4zHz8IBiVLGU4uH0NRTk4tNUQIBhMEATMcOEYsJAgXBlBKTiYiGBtCHyU6OCYMCiUPLwgGKwQBK0A7MDo9TE0+PgYtBAElPTYbBgE2HlEwQQgtLggVBgFHTRgnMRggDhEGATAcSy4vBhMEAU0MPAFFGUY1LAQBDC1MMDI/LCEvNAYeKRErMQQBQQZQTDIzKyo2SxoYDxUIMwYUBAIBPQE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnRqZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydKQdLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudHlwZV92YXJpYWJsZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgRGFydFR5cGUsIE51bGxhYmlsaXR5LCBUeXBlUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyVHlwZTsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICB0ZW1wbGF0ZUN5Y2xlSW5UeXBlVmFyaWFibGVzLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVW5maW5pc2hlZFR5cGVWYXJpYWJsZSwKICAgICAgICB0ZW1wbGF0ZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZTsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbmFtZWRfdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKCmNsYXNzIFR5cGVWYXJpYWJsZUJ1aWxkZXIgZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb25CdWlsZGVySW1wbCB7CiAgVHlwZUJ1aWxkZXIgYm91bmQ7CgogIFR5cGVCdWlsZGVyIGRlZmF1bHRUeXBlOwoKICBmaW5hbCBUeXBlUGFyYW1ldGVyIGFjdHVhbFBhcmFtZXRlcjsKCiAgVHlwZVZhcmlhYmxlQnVpbGRlciBhY3R1YWxPcmlnaW47CgogIGZpbmFsIGJvb2wgaXNFeHRlbnNpb25UeXBlUGFyYW1ldGVyOwoKICBUeXBlVmFyaWFibGVCdWlsZGVyKAogICAgICBTdHJpbmcgbmFtZSwgU291cmNlTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCwKICAgICAge3RoaXMuYm91bmQsIHRoaXMuaXNFeHRlbnNpb25UeXBlUGFyYW1ldGVyOiBmYWxzZSwgaW50IHZhcmlhYmxlVmFyaWFuY2V9KQogICAgICA6IGFjdHVhbFBhcmFtZXRlciA9IG5ldyBUeXBlUGFyYW1ldGVyKG5hbWUsIG51bGwpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBjaGFyT2Zmc2V0CiAgICAgICAgICAuLnZhcmlhbmNlID0gdmFyaWFibGVWYXJpYW5jZSwKICAgICAgICBzdXBlcihudWxsLCAwLCBuYW1lLCBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBUeXBlVmFyaWFibGVCdWlsZGVyLmZyb21LZXJuZWwoCiAgICAgIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQpCiAgICAgIDogYWN0dWFsUGFyYW1ldGVyID0gcGFyYW1ldGVyLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IERvIHdlIG5lZWQgdG8gc3VwcG9ydCBzeW50aGVzaXplZCB0eXBlCiAgICAgICAgLy8gIHBhcmFtZXRlcnMgZnJvbSBrZXJuZWw/CiAgICAgICAgdGhpcy5pc0V4dGVuc2lvblR5cGVQYXJhbWV0ZXIgPSBmYWxzZSwKICAgICAgICBzdXBlcihudWxsLCAwLCBwYXJhbWV0ZXIubmFtZSwgY29tcGlsYXRpb25Vbml0LCBwYXJhbWV0ZXIuZmlsZU9mZnNldCk7CgogIGJvb2wgZ2V0IGlzVHlwZVZhcmlhYmxlID0+IHRydWU7CgogIFN0cmluZyBnZXQgZGVidWdOYW1lID0+ICJUeXBlVmFyaWFibGVCdWlsZGVyIjsKCiAgU3RyaW5nQnVmZmVyIHByaW50T24oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogICAgYnVmZmVyLndyaXRlKG5hbWUpOwogICAgaWYgKGJvdW5kICE9IG51bGwpIHsKICAgICAgYnVmZmVyLndyaXRlKCIgZXh0ZW5kcyAiKTsKICAgICAgYm91bmQucHJpbnRPbihidWZmZXIpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlcjsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIke3ByaW50T24obmV3IFN0cmluZ0J1ZmZlcigpKX0iOwoKICBUeXBlVmFyaWFibGVCdWlsZGVyIGdldCBvcmlnaW4gPT4gYWN0dWFsT3JpZ2luID8/IHRoaXM7CgogIC8vLyBUaGUgW1R5cGVQYXJhbWV0ZXJdIGJ1aWx0IGJ5IHRoaXMgYnVpbGRlci4KICBUeXBlUGFyYW1ldGVyIGdldCBwYXJhbWV0ZXIgPT4gb3JpZ2luLmFjdHVhbFBhcmFtZXRlcjsKCiAgaW50IGdldCB2YXJpYW5jZSA9PiBwYXJhbWV0ZXIudmFyaWFuY2U7CgogIHZvaWQgc2V0IHZhcmlhbmNlKGludCB2YWx1ZSkgewogICAgcGFyYW1ldGVyLnZhcmlhbmNlID0gdmFsdWU7CiAgfQoKICBEYXJ0VHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaW50IGNoYXJPZmZzZXQgPSAtMTsgLy8gVE9ETyhhaGUpOiBQcm92aWRlIHRoZXNlLgogICAgICBVcmkgZmlsZVVyaSA9IG51bGw7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgIGZpbGVVcmkpOwogICAgfQogICAgLy8gSWYgdGhlIGJvdW5kIGlzIG5vdCBzZXQgeWV0LCB0aGUgYWN0dWFsIHZhbHVlIGlzIG5vdCBpbXBvcnRhbnQgeWV0IGFzIGl0CiAgICAvLyB3aWxsIGJlIHNldCBsYXRlci4KICAgIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5SWZPbWl0dGVkID0gcGFyYW1ldGVyLmJvdW5kICE9IG51bGwgJiYKICAgICAgICAgICAgbGlicmFyeSAhPSBudWxsICYmCiAgICAgICAgICAgIGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgID8gVHlwZVBhcmFtZXRlclR5cGUuY29tcHV0ZU51bGxhYmlsaXR5RnJvbUJvdW5kKHBhcmFtZXRlcikKICAgICAgICA6IE51bGxhYmlsaXR5LmxlZ2FjeTsKICAgIERhcnRUeXBlIHR5cGUgPSBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKAogICAgICAgIGxpYnJhcnksCiAgICAgICAgbnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnksIGlmT21pdHRlZDogbnVsbGFiaWxpdHlJZk9taXR0ZWQpLAogICAgICAgIG51bGwpOwogICAgaWYgKHBhcmFtZXRlci5ib3VuZCA9PSBudWxsKSB7CiAgICAgIGlmIChsaWJyYXJ5IGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgbGlicmFyeS5wZW5kaW5nTnVsbGFiaWxpdGllcy5hZGQodHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuZmluaXNoZWRUeXBlVmFyaWFibGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIG5hbWUsIGxpYnJhcnk/LmltcG9ydFVyaSksCiAgICAgICAgICAgIHBhcmFtZXRlci5maWxlT2Zmc2V0LAogICAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgZmlsZVVyaSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KCiAgRGFydFR5cGUgYnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50cyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LAogICAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSwgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzKSB7CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaW50IGNoYXJPZmZzZXQgPSAtMTsgLy8gVE9ETyhhaGUpOiBQcm92aWRlIHRoZXNlLgogICAgICBVcmkgZmlsZVVyaSA9IG51bGw7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGUud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgIGZpbGVVcmkpOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyVHlwZShwYXJhbWV0ZXIsIG51bGxhYmlsaXR5KTsKICB9CgogIFR5cGVCdWlsZGVyIGFzVHlwZUJ1aWxkZXIoKSB7CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIobmFtZSwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSwgbnVsbCkKICAgICAgLi5iaW5kKHRoaXMpOwogIH0KCiAgdm9pZCBmaW5pc2goCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKSB7CiAgICBpZiAoaXNQYXRjaCkgcmV0dXJuOwogICAgRGFydFR5cGUgb2JqZWN0VHlwZSA9CiAgICAgICAgb2JqZWN0LmJ1aWxkVHlwZShsaWJyYXJ5LCBsaWJyYXJ5Lm51bGxhYmxlQnVpbGRlciwgbnVsbCk7CiAgICBwYXJhbWV0ZXIuYm91bmQgPz89IGJvdW5kPy5idWlsZChsaWJyYXJ5KSA/PyBvYmplY3RUeXBlOwogICAgLy8gSWYgZGVmYXVsdFR5cGUgaXMgbm90IHNldCwgaW5pdGlhbGl6ZSBpdCB0byBkeW5hbWljLCB1bmxlc3MgdGhlIGJvdW5kIGlzCiAgICAvLyBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBPYmplY3QsIGluIHdoaWNoIGNhc2UgZGVmYXVsdFR5cGUgc2hvdWxkIGFsc28gYmUKICAgIC8vIE9iamVjdC4gVGhpcyBtYWtlcyBzdXJlIGluc3RhbnRpYXRpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyB3aXRoIGFuCiAgICAvLyBleHBsaWNpdCBPYmplY3QgYm91bmQgcmVzdWx0cyBpbiBPYmplY3QgYXMgdGhlIGluc3RhbnRpYXRlZCB0eXBlLgogICAgcGFyYW1ldGVyLmRlZmF1bHRUeXBlID8/PSBkZWZhdWx0VHlwZT8uYnVpbGQobGlicmFyeSkgPz8KICAgICAgICAoYm91bmQgIT0gbnVsbCAmJiBwYXJhbWV0ZXIuYm91bmQgPT0gb2JqZWN0VHlwZQogICAgICAgICAgICA/IG9iamVjdFR5cGUKICAgICAgICAgICAgOiBkeW5hbWljVHlwZS5idWlsZChsaWJyYXJ5KSk7CiAgfQoKICAvLy8gQXNzaWducyBudWxsYWJpbGl0aWVzIHRvIHR5cGVzIGluIFtwZW5kaW5nTnVsbGFiaWxpdGllc10uCiAgLy8vCiAgLy8vIEl0J3MgYSBoZWxwZXIgZnVuY3Rpb24gdG8gYXNzaWduIHRoZSBudWxsYWJpbGl0aWVzIHRvIHR5cGUtcGFyYW1ldGVyIHR5cGVzCiAgLy8vIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgcGFyYW1ldGVycyBoYXZlIHRoZWlyIGJvdW5kcyBzZXQgb3IgY2hhbmdlZC4KICAvLy8gVGhlIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGF0IHNvbWUgb2YgdGhlIHR5cGVzIGluIHRoZSBpbnB1dCBsaXN0CiAgLy8vIG1heSBiZSBib3VuZHMgdG8gc29tZSBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIG90aGVyIHR5cGVzIGZyb20gdGhlIGlucHV0CiAgLy8vIGxpc3QuCiAgc3RhdGljIHZvaWQgZmluaXNoTnVsbGFiaWxpdGllcyhMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlciwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyVHlwZT4gcGVuZGluZ051bGxhYmlsaXRpZXMpIHsKICAgIC8vIFRoZSBib3VuZHMgb2YgdHlwZSBwYXJhbWV0ZXJzIG1heSBiZSB0eXBlLXBhcmFtZXRlciB0eXBlcyBvZiBvdGhlcgogICAgLy8gcGFyYW1ldGVycyBmcm9tIHRoZSBzYW1lIGRlY2xhcmF0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gc2V0IHRoZQogICAgLy8gbnVsbGFiaWxpdHkgZm9yIHRoZW0gZmlyc3QuICBUbyBwcmVzZXJ2ZSB0aGUgb3JkZXJpbmcsIHdlIGltcGxlbWVudCBhCiAgICAvLyBkZXB0aC1maXJzdCBzZWFyY2ggb3ZlciB0aGUgdHlwZXMuICBXZSB1c2UgdGhlIGZhY3QgdGhhdCBhIG51bGxhYmlsaXR5CiAgICAvLyBvZiBhIHR5cGUgcGFyYW1ldGVyIHR5cGUgY2FuJ3QgZXZlciBiZSAnbnVsbGFibGUnIGlmIGNvbXB1dGVkIGZyb20gdGhlCiAgICAvLyBib3VuZC4gSXQgYWxsb3dzIHVzIHRvIHVzZSAnbnVsbGFibGUnIG51bGxhYmlsaXR5IGFzIHRoZSBtYXJrZXIgaW4gdGhlCiAgICAvLyBERlMgaW1wbGVtZW50YXRpb24uCiAgICBOdWxsYWJpbGl0eSBtYXJrZXIgPSBOdWxsYWJpbGl0eS5udWxsYWJsZTsKICAgIExpc3Q8VHlwZVBhcmFtZXRlclR5cGU+IHN0YWNrID0KICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyVHlwZT4uZmlsbGVkKHBlbmRpbmdOdWxsYWJpbGl0aWVzLmxlbmd0aCwgbnVsbCk7CiAgICBpbnQgc3RhY2tUb3AgPSAwOwogICAgZm9yIChUeXBlUGFyYW1ldGVyVHlwZSB0eXBlIGluIHBlbmRpbmdOdWxsYWJpbGl0aWVzKSB7CiAgICAgIHR5cGUudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSA9IG51bGw7CiAgICB9CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXJUeXBlIHR5cGUgaW4gcGVuZGluZ051bGxhYmlsaXRpZXMpIHsKICAgICAgaWYgKHR5cGUudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSAhPSBudWxsKSB7CiAgICAgICAgLy8gTnVsbGFiaWxpdHkgZm9yIFt0eXBlXSB3YXMgYWxyZWFkeSBjb21wdXRlZCBvbiBvbmUgb2YgdGhlIGJyYW5jaGVzCiAgICAgICAgLy8gb2YgdGhlIGRlcHRoLWZpcnN0IHNlYXJjaC4gIENvbnRpbnVlIHRvIHRoZSBuZXh0IG9uZS4KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodHlwZS5wYXJhbWV0ZXIuYm91bmQgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSBjdXJyZW50ID0gdHlwZTsKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSBuZXh0ID0gY3VycmVudC5wYXJhbWV0ZXIuYm91bmQ7CiAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPT0gbnVsbCkgewogICAgICAgICAgc3RhY2tbc3RhY2tUb3ArK10gPSBjdXJyZW50OwogICAgICAgICAgY3VycmVudC50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5ID0gbWFya2VyOwoKICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgICAgaWYgKGN1cnJlbnQucGFyYW1ldGVyLmJvdW5kIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICAgIG5leHQgPSBjdXJyZW50LnBhcmFtZXRlci5ib3VuZDsKICAgICAgICAgICAgaWYgKG5leHQudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSA9PSBtYXJrZXIpIHsKICAgICAgICAgICAgICBuZXh0LnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ7CiAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgbmV4dC5wYXJhbWV0ZXIubmFtZSwgY3VycmVudC5wYXJhbWV0ZXIubmFtZSksCiAgICAgICAgICAgICAgICAgIG5leHQucGFyYW1ldGVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5leHQucGFyYW1ldGVyLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgICBuZXh0LnBhcmFtZXRlci5sb2NhdGlvbi5maWxlKTsKICAgICAgICAgICAgICBuZXh0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV4dCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQudHlwZVBhcmFtZXRlclR5cGVOdWxsYWJpbGl0eSA9CiAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLmNvbXB1dGVOdWxsYWJpbGl0eUZyb21Cb3VuZChjdXJyZW50LnBhcmFtZXRlcik7CiAgICAgICAgd2hpbGUgKHN0YWNrVG9wICE9IDApIHsKICAgICAgICAgIC0tc3RhY2tUb3A7CiAgICAgICAgICBjdXJyZW50ID0gc3RhY2tbc3RhY2tUb3BdOwogICAgICAgICAgY3VycmVudC50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5ID0KICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZS5jb21wdXRlTnVsbGFiaWxpdHlGcm9tQm91bmQoY3VycmVudC5wYXJhbWV0ZXIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0eXBlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkgPQogICAgICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZS5jb21wdXRlTnVsbGFiaWxpdHlGcm9tQm91bmQodHlwZS5wYXJhbWV0ZXIpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFwcGx5UGF0Y2goY292YXJpYW50IFR5cGVWYXJpYWJsZUJ1aWxkZXIgcGF0Y2gpIHsKICAgIHBhdGNoLmFjdHVhbE9yaWdpbiA9IHRoaXM7CiAgfQoKICBUeXBlVmFyaWFibGVCdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKSB7CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmlndXJlIG91dCBpZiB1c2luZyBbY2hhck9mZnNldF0gaGVyZSBpcyBhIGdvb2QgaWRlYS4KICAgIC8vIEFuIGFsdGVybmF0aXZlIGlzIHRvIHVzZSB0aGUgb2Zmc2V0IG9mIHRoZSBub2RlIHRoZSBjbG9uZWQgdHlwZSB2YXJpYWJsZQogICAgLy8gaXMgZGVjbGFyZWQgb24uCiAgICByZXR1cm4gbmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIobmFtZSwgcGFyZW50LCBjaGFyT2Zmc2V0LAogICAgICAgIGJvdW5kOiBib3VuZC5jbG9uZShuZXdUeXBlcyksIHZhcmlhYmxlVmFyaWFuY2U6IHZhcmlhbmNlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgaXMgVHlwZVZhcmlhYmxlQnVpbGRlciAmJiBwYXJhbWV0ZXIgPT0gb3RoZXIucGFyYW1ldGVyOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGdldCBoYXNoQ29kZSA9PiBwYXJhbWV0ZXIuaGFzaENvZGU7CgogIHN0YXRpYyBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzKAogICAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IGJ1aWxkZXJzKSB7CiAgICBpZiAoYnVpbGRlcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8VHlwZVBhcmFtZXRlcj4uZmlsbGVkKGJ1aWxkZXJzLmxlbmd0aCwgbnVsbCwgZ3Jvd2FibGU6IHRydWUpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRbaV0gPSBidWlsZGVyc1tpXS5wYXJhbWV0ZXI7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQqA+gBOTjwBJQEhQgEdCSY3LQFKAR0fIiMcKAE/FQEbAScBJAEnARdJUDgkKTsBIj8lRyQvTwEjATEBLhgZIR0GEwQBOQE6ATE5ASoBISAEAS1MHTg3GkMWFxQGUBpCHytDHjIRTA8jLTAPHEkrIhkWCAYRBAFAOx04NxpDFhcUBjoEASBQFAQBD04ZGkI9UFBPST04GSsEAUAGUVBPUQxBNkpOTU5OThsvJE8WOzAGOzdOQRIINyo6TCc5ARo+LD9MKT5ELS4xGw4TGQwKL04gFiUxUAoPLEsIBgQBOR8EATpNUBc9QwQBDCNJBAEMKgE5LCchTzApBhMEAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnRkZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci91bnJlc29sdmVkX3R5cGUuZGFydIOCLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudW5yZXNvbHZlZF90eXBlOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKCi8vLyBBIHdyYXBwZXIgYXJvdW5kIGEgdHlwZSB0aGF0IGlzIHlldCB0byBiZSByZXNvbHZlZC4KY2xhc3MgVW5yZXNvbHZlZFR5cGUgewogIGZpbmFsIFR5cGVCdWlsZGVyIGJ1aWxkZXI7CiAgZmluYWwgaW50IGNoYXJPZmZzZXQ7CiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIFVucmVzb2x2ZWRUeXBlKHRoaXMuYnVpbGRlciwgdGhpcy5jaGFyT2Zmc2V0LCB0aGlzLmZpbGVVcmkpOwoKICB2b2lkIHJlc29sdmVJbihTY29wZSBzY29wZSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgPT4KICAgICAgYnVpbGRlci5yZXNvbHZlSW4oc2NvcGUsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGxpYnJhcnkpOwoKICAvLy8gUGVyZm9ybXMgY2hlY2tzIG9uIHRoZSB0eXBlIGFmdGVyIGl0J3MgcmVzb2x2ZWQuCiAgdm9pZCBjaGVja1R5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIGJ1aWxkZXIuY2hlY2sobGlicmFyeSwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiVW5yZXNvbHZlZFR5cGUoQCRjaGFyT2Zmc2V0LCAkYnVpbGRlcikiOwp9Ch8ATk48AR8BGAEfHAE4Fx0YFQE/ATk+ATcrOAQBQQIBOHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0ZWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdmFyaWFibGVfYnVpbGRlci5kYXJ0gdQvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfdmFyaWFibGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXQgdmFyaWFibGU7CgogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZTsKfQoRAE5OPAEnATsBIgE0JAEZAgE5cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdmFyaWFibGVfYnVpbGRlci5kYXJ0ZmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvdm9pZF90eXBlX2J1aWxkZXIuZGFydIJeLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEudm9pZF90eXBlX2J1aWxkZXI7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IERhcnRUeXBlOwoKaW1wb3J0ICdidWlsdGluX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2J1aWxkZXIuZGFydCc7CgpjbGFzcyBWb2lkVHlwZUJ1aWxkZXIgZXh0ZW5kcyBCdWlsdGluVHlwZUJ1aWxkZXIgewogIFZvaWRUeXBlQnVpbGRlcihEYXJ0VHlwZSB0eXBlLCBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKCJ2b2lkIiwgdHlwZSwgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIlZvaWRUeXBlQnVpbGRlciI7Cn0KEwBOTjwBIQEwASQfATNROgEtAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdm9pZF90eXBlX2J1aWxkZXIuZGFydF1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9jb25zdGFudF9jb250ZXh0LmRhcnSE4S8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNvbnN0YW50X2NvbnRleHQ7CgplbnVtIENvbnN0YW50Q29udGV4dCB7CiAgLy8vIE5vdCBpbiBhIGNvbnN0YW50IGNvbnRleHQuCiAgLy8vCiAgLy8vIFRoaXMgbWVhbnMgdGhhdCBgT2JqZWN0KClgIGFuZCBgW11gIGFyZSBlcXVpdmFsZW50IHRvIGBuZXcgT2JqZWN0KClgIGFuZAogIC8vLyBgW11gIHJlc3BlY3RpdmVseS4gYG5ldyBPYmplY3QoKWAgaXMgKipub3QqKiBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAvLy8KICAvLy8gVE9ETyhhaGUpOiBVcGRhdGUgdGhlIGFib3ZlIHNwZWNpZmljYXRpb24gYW5kIGNvcnJlc3BvbmRpbmcKICAvLy8gaW1wbGVtZW50YXRpb24gYmVjYXVzZSBgT2JqZWN0KClgIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiBTZWUgW21hZ2ljCiAgLy8vIGNvbnN0XSgKICAvLy8gLi4vLi4vLi4vLi4vLi4vLi4vZG9jcy9sYW5ndWFnZS9pbmZvcm1hbC9kb2NzL2xhbmd1YWdlL2luZm9ybWFsL2ltcGxpY2l0LWNyZWF0aW9uLm1kCiAgLy8vICkuCiAgbm9uZSwKCiAgLy8vIEluIGEgY29udGV4dCB3aGVyZSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgcmVxdWlyZWQsIGFuZCBgY29uc3RgIG1heSBiZQogIC8vLyBpbmZlcnJlZC4KICAvLy8KICAvLy8gVGhpcyBtZWFucyB0aGF0IGBPYmplY3QoKWAgYW5kIGBbXWAgYXJlIGVxdWl2YWxlbnQgdG8gYGNvbnN0IE9iamVjdCgpYCBhbmQKICAvLy8gYGNvbnN0IFtdYCByZXNwZWN0aXZlbHkuIGBuZXcgT2JqZWN0KClgIGlzIGEgY29tcGlsZS10aW1lIGVycm9yLgogIGluZmVycmVkLAoKICAvLy8gSW4gYSBjb250ZXh0IHdoZXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSByZXF1aXJlZCwgYnV0IGBjb25zdGAgaXMgbm90CiAgLy8vIGluZmVycmVkLiBUaGlzIGluY2x1ZGVzIGRlZmF1bHQgdmFsdWVzIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMgYW5kCiAgLy8vIGluaXRpYWxpemluZyBleHByZXNzaW9ucyBvbiBmaWVsZHMgaW4gY2xhc3NlcyB3aXRoIGEgYGNvbnN0YCBjb25zdHJ1Y3Rvci4KICByZXF1aXJlZCwKfQohAE5OPAEgARchBk9JBkJPDlsJCAFPEAZRRwwBT0hQDAIBMXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb25zdGFudF9jb250ZXh0LmRhcnRYZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvaWRlbnRpZmllcnMuZGFydI9tLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEucXVhbGlmaWVkX25hbWU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBzaG93IEV4cHJlc3Npb247CgppbXBvcnQgJ3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkLCB1bnN1cHBvcnRlZDsKCmNsYXNzIElkZW50aWZpZXIgewogIGZpbmFsIFN0cmluZyBuYW1lOwogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICBJZGVudGlmaWVyKFRva2VuIHRva2VuKQogICAgICA6IG5hbWUgPSB0b2tlbi5sZXhlbWUsCiAgICAgICAgY2hhck9mZnNldCA9IHRva2VuLmNoYXJPZmZzZXQ7CgogIElkZW50aWZpZXIuXyh0aGlzLm5hbWUsIHRoaXMuY2hhck9mZnNldCk7CgogIGZhY3RvcnkgSWRlbnRpZmllci5wcmVzZXJ2ZVRva2VuKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gbmV3IF9Ub2tlbklkZW50aWZpZXIodG9rZW4pOwogIH0KCiAgRXhwcmVzc2lvbiBnZXQgaW5pdGlhbGl6ZXIgPT4gbnVsbDsKCiAgaW50IGdldCBlbmRDaGFyT2Zmc2V0ID0+IGNoYXJPZmZzZXQgKyBuYW1lLmxlbmd0aDsKCiAgUXVhbGlmaWVkTmFtZSB3aXRoUXVhbGlmaWVyKE9iamVjdCBxdWFsaWZpZXIpIHsKICAgIHJldHVybiBuZXcgUXVhbGlmaWVkTmFtZS5fKHF1YWxpZmllciwgbmFtZSwgY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiaWRlbnRpZmllcigkbmFtZSkiOwp9CgpjbGFzcyBfVG9rZW5JZGVudGlmaWVyIGltcGxlbWVudHMgSWRlbnRpZmllciB7CiAgZmluYWwgVG9rZW4gdG9rZW47CgogIF9Ub2tlbklkZW50aWZpZXIodGhpcy50b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgbmFtZSA9PiB0b2tlbi5sZXhlbWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgY2hhck9mZnNldCA9PiB0b2tlbi5jaGFyT2Zmc2V0OwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGdldCBpbml0aWFsaXplciA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGVuZENoYXJPZmZzZXQgPT4gY2hhck9mZnNldCArIG5hbWUubGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBRdWFsaWZpZWROYW1lIHdpdGhRdWFsaWZpZXIoT2JqZWN0IHF1YWxpZmllcikgewogICAgcmV0dXJuIG5ldyBfVG9rZW5RdWFsaWZpZWROYW1lKHF1YWxpZmllciwgdG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gInRva2VuLWlkZW50aWZpZXIoJG5hbWUpIjsKfQoKY2xhc3MgSW5pdGlhbGl6ZWRJZGVudGlmaWVyIGV4dGVuZHMgX1Rva2VuSWRlbnRpZmllciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsKCiAgSW5pdGlhbGl6ZWRJZGVudGlmaWVyKF9Ub2tlbklkZW50aWZpZXIgaWRlbnRpZmllciwgdGhpcy5pbml0aWFsaXplcikKICAgICAgOiBzdXBlcihpZGVudGlmaWVyLnRva2VuKTsKCiAgQG92ZXJyaWRlCiAgUXVhbGlmaWVkTmFtZSB3aXRoUXVhbGlmaWVyKE9iamVjdCBxdWFsaWZpZXIpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgid2l0aFF1YWxpZmllciIsIGNoYXJPZmZzZXQsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gImluaXRpYWxpemVkLWlkZW50aWZpZXIoJG5hbWUsICRpbml0aWFsaXplcikiOwp9CgpjbGFzcyBRdWFsaWZpZWROYW1lIGV4dGVuZHMgSWRlbnRpZmllciB7CiAgZmluYWwgT2JqZWN0IHF1YWxpZmllcjsKCiAgUXVhbGlmaWVkTmFtZSh0aGlzLnF1YWxpZmllciwgVG9rZW4gc3VmZml4KSA6IHN1cGVyKHN1ZmZpeCk7CgogIFF1YWxpZmllZE5hbWUuXyh0aGlzLnF1YWxpZmllciwgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyLl8obmFtZSwgY2hhck9mZnNldCk7CgogIEBvdmVycmlkZQogIFF1YWxpZmllZE5hbWUgd2l0aFF1YWxpZmllcihPYmplY3QgcXVhbGlmaWVyKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoIndpdGhRdWFsaWZpZXIiLCBjaGFyT2Zmc2V0LCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICJxdWFsaWZpZWQtbmFtZSgkcXVhbGlmaWVyLCAkbmFtZSkiOwp9CgpjbGFzcyBfVG9rZW5RdWFsaWZpZWROYW1lIGV4dGVuZHMgX1Rva2VuSWRlbnRpZmllciBpbXBsZW1lbnRzIFF1YWxpZmllZE5hbWUgewogIEBvdmVycmlkZQogIGZpbmFsIE9iamVjdCBxdWFsaWZpZXI7CgogIF9Ub2tlblF1YWxpZmllZE5hbWUodGhpcy5xdWFsaWZpZXIsIFRva2VuIHN1ZmZpeCkKICAgICAgOiBhc3NlcnQocXVhbGlmaWVyIGlzISBJZGVudGlmaWVyIHx8IHF1YWxpZmllciBpcyBfVG9rZW5JZGVudGlmaWVyKSwKICAgICAgICBzdXBlcihzdWZmaXgpOwoKICBAb3ZlcnJpZGUKICBRdWFsaWZpZWROYW1lIHdpdGhRdWFsaWZpZXIoT2JqZWN0IHF1YWxpZmllcikgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJ3aXRoUXVhbGlmaWVyIiwgY2hhck9mZnNldCwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAidG9rZW4tcXVhbGlmaWVkLW5hbWUoJHF1YWxpZmllciwgJG5hbWUpIjsKfQoKdm9pZCBmbGF0dGVuUXVhbGlmaWVkTmFtZU9uKAogICAgUXVhbGlmaWVkTmFtZSBuYW1lLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICBmaW5hbCBPYmplY3QgcXVhbGlmaWVyID0gbmFtZS5xdWFsaWZpZXI7CiAgaWYgKHF1YWxpZmllciBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICBmbGF0dGVuUXVhbGlmaWVkTmFtZU9uKHF1YWxpZmllciwgYnVmZmVyLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9IGVsc2UgaWYgKHF1YWxpZmllciBpcyBJZGVudGlmaWVyKSB7CiAgICBidWZmZXIud3JpdGUocXVhbGlmaWVyLm5hbWUpOwogIH0gZWxzZSBpZiAocXVhbGlmaWVyIGlzIFN0cmluZykgewogICAgYnVmZmVyLndyaXRlKHF1YWxpZmllcik7CiAgfSBlbHNlIHsKICAgIHVuaGFuZGxlZCgiJHtxdWFsaWZpZXIucnVudGltZVR5cGV9IiwgImZsYXR0ZW5RdWFsaWZpZWROYW1lT24iLCBjaGFyT2Zmc2V0LAogICAgICAgIGZpbGVVcmkpOwogIH0KICBidWZmZXIud3JpdGUoIi4iKTsKICBidWZmZXIud3JpdGUobmFtZS5uYW1lKTsKfQoKU3RyaW5nIGZsYXR0ZW5OYW1lKE9iamVjdCBuYW1lLCBpbnQgY2hhck9mZnNldCwgVXJpIGZpbGVVcmkpIHsKICBpZiAobmFtZSBpcyBTdHJpbmcpIHsKICAgIHJldHVybiBuYW1lOwogIH0gZWxzZSBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgZmxhdHRlblF1YWxpZmllZE5hbWVPbihuYW1lLCBidWZmZXIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgcmV0dXJuICIkYnVmZmVyIjsKICB9IGVsc2UgaWYgKG5hbWUgaXMgSWRlbnRpZmllcikgewogICAgcmV0dXJuIG5hbWUubmFtZTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtuYW1lLnJ1bnRpbWVUeXBlfSIsICJmbGF0dGVuTmFtZSIsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KfQoKVG9rZW4gZGVwcmVjYXRlZF9leHRyYWN0VG9rZW4oSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CiAgX1Rva2VuSWRlbnRpZmllciB0b2tlbklkZW50aWZpZXIgPSBpZGVudGlmaWVyOwogIHJldHVybiB0b2tlbklkZW50aWZpZXI/LnRva2VuOwp9CoCXAE5OPAEeAUoBMgE0ARMVGAEaHScBLAEyKAQBJgE1ATI9BAEMLAIBLxUBIAEMIwEMKgEMJgEMNQEMMjYEAQwyAgE3DCABRyEBDDI7BAEMRgIBKRoBPwE/IwEMMjsEAQw8AgFODBoBNEsXAQwyOwQBDEICAR1MKyREKCIkHQtQEgQVGwIBPxgRJi4/FiMWC1EEAgE3MSECASxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaWRlbnRpZmllcnMuZGFydFVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9tb2RpZmllci5kYXJ0jVYvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5tb2RpZmllcjsKCmltcG9ydCAncHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgplbnVtIE1vZGlmaWVyRW51bSB7CiAgQWJzdHJhY3QsCiAgQ29uc3QsCiAgQ292YXJpYW50LAogIEV4dGVybmFsLAogIEZpbmFsLAogIFN0YXRpYywKCiAgLy8gTm90IGEgcmVhbCBtb2RpZmllci4KICBWYXIsCn0KCmNvbnN0IGludCBhYnN0cmFjdE1hc2sgPSAxOwoKY29uc3QgaW50IGNvbnN0TWFzayA9IGFic3RyYWN0TWFzayA8PCAxOwoKY29uc3QgaW50IGNvdmFyaWFudE1hc2sgPSBjb25zdE1hc2sgPDwgMTsKCmNvbnN0IGludCBleHRlcm5hbE1hc2sgPSBjb3ZhcmlhbnRNYXNrIDw8IDE7Cgpjb25zdCBpbnQgZmluYWxNYXNrID0gZXh0ZXJuYWxNYXNrIDw8IDE7Cgpjb25zdCBpbnQgc3RhdGljTWFzayA9IGZpbmFsTWFzayA8PCAxOwoKY29uc3QgaW50IGxhdGVNYXNrID0gc3RhdGljTWFzayA8PCAxOwoKY29uc3QgaW50IHJlcXVpcmVkTWFzayA9IGxhdGVNYXNrIDw8IDE7Cgpjb25zdCBpbnQgbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzayA9IHJlcXVpcmVkTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGZvciBtaXhpbnMgZGVjbGFyZWQgZXhwbGljaXRseSBieSB1c2luZyB0aGUgYG1peGluYAovLy8ga2V5d29yZC4KY29uc3QgaW50IG1peGluRGVjbGFyYXRpb25NYXNrID0gbmFtZWRNaXhpbkFwcGxpY2F0aW9uTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGJ5IGZpZWxkcyB0byB0cmFjayBpZiB0aGV5IGhhdmUgYW4gaW5pdGlhbGl6ZXIuCmNvbnN0IGludCBoYXNJbml0aWFsaXplck1hc2sgPSBtaXhpbkRlY2xhcmF0aW9uTWFzayA8PCAxOwoKLy8vIE5vdCBhIG1vZGlmaWVyLCB1c2VkIGJ5IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRyYWNrIGlmIHRoZXkgYXJlIGluaXRpYWxpemluZy4KY29uc3QgaW50IGluaXRpYWxpemluZ0Zvcm1hbE1hc2sgPSBoYXNJbml0aWFsaXplck1hc2sgPDwgMTsKCi8vLyBOb3QgYSBtb2RpZmllciwgdXNlZCBieSBjbGFzc2VzIHRvIHRyYWNrIGlmIHRoZSBjbGFzcyBoYXMgYSBjb25zdAovLy8gY29uc3RydWN0b3IuCmNvbnN0IGludCBoYXNDb25zdENvbnN0cnVjdG9yTWFzayA9IGluaXRpYWxpemluZ0Zvcm1hbE1hc2sgPDwgMTsKCi8vLyBOb3QgYSByZWFsIG1vZGlmaWVyLCBhbmQgYnkgc2V0dGluZyBpdCB0byB6ZXJvLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGlnbm9yZWQKLy8vIGJ5IFtNb2RpZmllci52YWxpZGF0ZV0gYmVsb3cuCmNvbnN0IGludCB2YXJNYXNrID0gMDsKCmNvbnN0IE1vZGlmaWVyIEFic3RyYWN0ID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkFic3RyYWN0LCBhYnN0cmFjdE1hc2spOwoKY29uc3QgTW9kaWZpZXIgQ29uc3QgPSBjb25zdCBNb2RpZmllcihNb2RpZmllckVudW0uQ29uc3QsIGNvbnN0TWFzayk7Cgpjb25zdCBNb2RpZmllciBDb3ZhcmlhbnQgPQogICAgY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkNvdmFyaWFudCwgY292YXJpYW50TWFzayk7Cgpjb25zdCBNb2RpZmllciBFeHRlcm5hbCA9IGNvbnN0IE1vZGlmaWVyKE1vZGlmaWVyRW51bS5FeHRlcm5hbCwgZXh0ZXJuYWxNYXNrKTsKCmNvbnN0IE1vZGlmaWVyIEZpbmFsID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLkZpbmFsLCBmaW5hbE1hc2spOwoKY29uc3QgTW9kaWZpZXIgU3RhdGljID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLlN0YXRpYywgc3RhdGljTWFzayk7CgovLy8gTm90IGEgcmVhbCBtb2RpZmllci4KY29uc3QgTW9kaWZpZXIgVmFyID0gY29uc3QgTW9kaWZpZXIoTW9kaWZpZXJFbnVtLlZhciwgdmFyTWFzayk7CgpjbGFzcyBNb2RpZmllciB7CiAgZmluYWwgTW9kaWZpZXJFbnVtIGtpbmQ7CgogIGZpbmFsIGludCBtYXNrOwoKICBjb25zdCBNb2RpZmllcih0aGlzLmtpbmQsIHRoaXMubWFzayk7CgogIGZhY3RvcnkgTW9kaWZpZXIuZnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoaWRlbnRpY2FsKCdhYnN0cmFjdCcsIHN0cmluZykpIHJldHVybiBBYnN0cmFjdDsKICAgIGlmIChpZGVudGljYWwoJ2NvbnN0Jywgc3RyaW5nKSkgcmV0dXJuIENvbnN0OwogICAgaWYgKGlkZW50aWNhbCgnY292YXJpYW50Jywgc3RyaW5nKSkgcmV0dXJuIENvdmFyaWFudDsKICAgIGlmIChpZGVudGljYWwoJ2V4dGVybmFsJywgc3RyaW5nKSkgcmV0dXJuIEV4dGVybmFsOwogICAgaWYgKGlkZW50aWNhbCgnZmluYWwnLCBzdHJpbmcpKSByZXR1cm4gRmluYWw7CiAgICBpZiAoaWRlbnRpY2FsKCdzdGF0aWMnLCBzdHJpbmcpKSByZXR1cm4gU3RhdGljOwogICAgaWYgKGlkZW50aWNhbCgndmFyJywgc3RyaW5nKSkgcmV0dXJuIFZhcjsKICAgIHJldHVybiB1bmhhbmRsZWQoc3RyaW5nLCAiTW9kaWZpZXIuZnJvbVN0cmluZyIsIC0xLCBudWxsKTsKICB9CgogIHRvU3RyaW5nKCkgPT4gIm1vZGlmaWVyKCR7JyRraW5kJy5zdWJzdHJpbmcoJ01vZGlmaWVyRW51bS4nLmxlbmd0aCl9KSI7CgogIHN0YXRpYyBpbnQgdmFsaWRhdGUoTGlzdDxNb2RpZmllcj4gbW9kaWZpZXJzLCB7Ym9vbCBpc0Fic3RyYWN0OiBmYWxzZX0pIHsKICAgIC8vIFRPRE8oYWhlKTogUmVuYW1lIHRoaXMgbWV0aG9kLCB2YWxpZGF0aW9uIGlzIG5vdyB0YWtlbiBjYXJlIG9mIGJ5IHRoZQogICAgLy8gcGFyc2VyLgogICAgaW50IHJlc3VsdCA9IGlzQWJzdHJhY3QgPyBhYnN0cmFjdE1hc2sgOiAwOwogICAgaWYgKG1vZGlmaWVycyA9PSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgZm9yIChNb2RpZmllciBtb2RpZmllciBpbiBtb2RpZmllcnMpIHsKICAgICAgcmVzdWx0IHw9IG1vZGlmaWVyLm1hc2s7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGludCB2YWxpZGF0ZVZhckZpbmFsT3JDb25zdChTdHJpbmcgbGV4ZW1lKSB7CiAgICBpZiAobGV4ZW1lID09IG51bGwpIHJldHVybiAwOwogICAgaWYgKGlkZW50aWNhbCgnY29uc3QnLCBsZXhlbWUpKSByZXR1cm4gQ29uc3QubWFzazsKICAgIGlmIChpZGVudGljYWwoJ2ZpbmFsJywgbGV4ZW1lKSkgcmV0dXJuIEZpbmFsLm1hc2s7CiAgICBpZiAoaWRlbnRpY2FsKCd2YXInLCBsZXhlbWUpKSByZXR1cm4gVmFyLm1hc2s7CiAgICByZXR1cm4gdW5oYW5kbGVkKGxleGVtZSwgIk1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0IiwgLTEsIG51bGwpOwogIH0KfQpxAE5OPAEYAScBFAwJDQwJCgEaBwIBHAEpASoBLQEpAScBJgEoATkBTQ1BAUk6AVE8AUYRQQFQIhcBTwFGARs7AU8BRgFJARlAAREbARIBKAEvODI6ODI0Lj8EAUoBTE0PMCorHwYTBAE2Ijc3M0wEAgEpcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL21vZGlmaWVyLmRhcnRSZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvbmFtZXMuZGFydIbvLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZnJvbnRfZW5kLnNyYy5mYXN0YS5uYW1lczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgTmFtZTsKCmZpbmFsIE5hbWUgYW1wZXJzYW5kTmFtZSA9IG5ldyBOYW1lKCImIik7CgpmaW5hbCBOYW1lIGJhck5hbWUgPSBuZXcgTmFtZSgifCIpOwoKZmluYWwgTmFtZSBjYWxsTmFtZSA9IG5ldyBOYW1lKCJjYWxsIik7CgpmaW5hbCBOYW1lIGNhcmV0TmFtZSA9IG5ldyBOYW1lKCJeIik7CgpmaW5hbCBOYW1lIGRpdmlzaW9uTmFtZSA9IG5ldyBOYW1lKCIvIik7CgpmaW5hbCBOYW1lIGRvdWJsZUFtcGVyc2FuZE5hbWUgPSBuZXcgTmFtZSgiJiYiKTsKCmZpbmFsIE5hbWUgZG91YmxlQmFyTmFtZSA9IG5ldyBOYW1lKCJ8fCIpOwoKZmluYWwgTmFtZSBkb3VibGVRdWVzdGlvbk5hbWUgPSBuZXcgTmFtZSgiPz8iKTsKCmZpbmFsIE5hbWUgZW1wdHlOYW1lID0gbmV3IE5hbWUoIiIpOwoKZmluYWwgTmFtZSBlcXVhbHNOYW1lID0gbmV3IE5hbWUoJz09Jyk7CgpmaW5hbCBOYW1lIGdyZWF0ZXJUaGFuTmFtZSA9IG5ldyBOYW1lKCI+Iik7CgpmaW5hbCBOYW1lIGdyZWF0ZXJUaGFuT3JFcXVhbHNOYW1lID0gbmV3IE5hbWUoIj49Iik7CgpmaW5hbCBOYW1lIGlkZW50aWNhbE5hbWUgPSBuZXcgTmFtZSgiaWRlbnRpY2FsIik7CgpmaW5hbCBOYW1lIGluZGV4R2V0TmFtZSA9IG5ldyBOYW1lKCJbXSIpOwoKZmluYWwgTmFtZSBpbmRleFNldE5hbWUgPSBuZXcgTmFtZSgiW109Iik7CgpmaW5hbCBOYW1lIGxlZnRTaGlmdE5hbWUgPSBuZXcgTmFtZSgiPDwiKTsKCmZpbmFsIE5hbWUgbGVuZ3RoTmFtZSA9IG5ldyBOYW1lKCJsZW5ndGgiKTsKCmZpbmFsIE5hbWUgbGVzc1RoYW5OYW1lID0gbmV3IE5hbWUoIjwiKTsKCmZpbmFsIE5hbWUgbGVzc1RoYW5PckVxdWFsc05hbWUgPSBuZXcgTmFtZSgiPD0iKTsKCmZpbmFsIE5hbWUgbWludXNOYW1lID0gbmV3IE5hbWUoIi0iKTsKCmZpbmFsIE5hbWUgbXVsdGlwbHlOYW1lID0gbmV3IE5hbWUoIioiKTsKCmZpbmFsIE5hbWUgbXVzdGFjaGVOYW1lID0gbmV3IE5hbWUoIn4vIik7CgpmaW5hbCBOYW1lIG5lZ2F0aW9uTmFtZSA9IG5ldyBOYW1lKCIhIik7CgpmaW5hbCBOYW1lIG5vU3VjaE1ldGhvZE5hbWUgPSBuZXcgTmFtZSgibm9TdWNoTWV0aG9kIik7CgpmaW5hbCBOYW1lIHBlcmNlbnROYW1lID0gbmV3IE5hbWUoIiUiKTsKCmZpbmFsIE5hbWUgcGx1c05hbWUgPSBuZXcgTmFtZSgiKyIpOwoKZmluYWwgTmFtZSByaWdodFNoaWZ0TmFtZSA9IG5ldyBOYW1lKCI+PiIpOwoKZmluYWwgTmFtZSB0cmlwbGVTaGlmdE5hbWUgPSBuZXcgTmFtZSgiPj4+Iik7CgpmaW5hbCBOYW1lIHRpbGRlTmFtZSA9IG5ldyBOYW1lKCJ+Iik7CgpmaW5hbCBOYW1lIHVuYXJ5TWludXNOYW1lID0gbmV3IE5hbWUoInVuYXJ5LSIpOwoKZmluYWwgTmFtZSBoYXNoQ29kZU5hbWUgPSBuZXcgTmFtZSgiaGFzaENvZGUiKTsKCmZpbmFsIE5hbWUgdG9TdHJpbmdOYW1lID0gbmV3IE5hbWUoInRvU3RyaW5nIik7CgpmaW5hbCBOYW1lIHJ1bnRpbWVUeXBlTmFtZSA9IG5ldyBOYW1lKCJydW50aW1lVHlwZSIpOwpLAE5OPAEjASwBKgEkASgBJgEpATEBKwEwASUBKAEsATUBMgEqASsBKwEsASkBMgEmASkBKgEpATgBKAElASwBLgEmATABMAEwATYBJnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9uYW1lcy5kYXJ0YmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zY29wZV9saXN0ZW5lci5kYXJ0k94vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5zY29wZV9saXN0ZW5lcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvYmxvY2tfa2luZC5kYXJ0JyBzaG93IEJsb2NrS2luZDsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvc3RhY2tfbGlzdGVuZXIuZGFydCcKICAgIHNob3cgTnVsbFZhbHVlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCcgc2hvdyBTY29wZTsKaW1wb3J0ICdzdGFja19saXN0ZW5lcl9pbXBsLmRhcnQnOwoKZXhwb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9zdGFja19saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBGaXhlZE51bGxhYmxlTGlzdCwgR3Jvd2FibGVMaXN0LCBOdWxsVmFsdWUsIFBhcnNlclJlY292ZXJ5OwoKZW51bSBKdW1wVGFyZ2V0S2luZCB7CiAgQnJlYWssCiAgQ29udGludWUsCiAgR290bywgLy8gQ29udGludWUgbGFiZWwgaW4gc3dpdGNoLgp9CgphYnN0cmFjdCBjbGFzcyBTY29wZUxpc3RlbmVyPEo+IGV4dGVuZHMgU3RhY2tMaXN0ZW5lckltcGwgewogIFNjb3BlIHNjb3BlOwoKICBKIGJyZWFrVGFyZ2V0OwoKICBKIGNvbnRpbnVlVGFyZ2V0OwoKICBTY29wZUxpc3RlbmVyKFNjb3BlIHNjb3BlKSA6IHNjb3BlID0gc2NvcGUgPz8gbmV3IFNjb3BlLmltbXV0YWJsZSgpOwoKICBKIGNyZWF0ZUp1bXBUYXJnZXQoSnVtcFRhcmdldEtpbmQga2luZCwgaW50IGNoYXJPZmZzZXQpOwoKICBKIGNyZWF0ZUJyZWFrVGFyZ2V0KGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gY3JlYXRlSnVtcFRhcmdldChKdW1wVGFyZ2V0S2luZC5CcmVhaywgY2hhck9mZnNldCk7CiAgfQoKICBKIGNyZWF0ZUNvbnRpbnVlVGFyZ2V0KGludCBjaGFyT2Zmc2V0KSB7CiAgICByZXR1cm4gY3JlYXRlSnVtcFRhcmdldChKdW1wVGFyZ2V0S2luZC5Db250aW51ZSwgY2hhck9mZnNldCk7CiAgfQoKICBKIGNyZWF0ZUdvdG9UYXJnZXQoaW50IGNoYXJPZmZzZXQpIHsKICAgIHJldHVybiBjcmVhdGVKdW1wVGFyZ2V0KEp1bXBUYXJnZXRLaW5kLkdvdG8sIGNoYXJPZmZzZXQpOwogIH0KCiAgdm9pZCBlbnRlckxvY2FsU2NvcGUoU3RyaW5nIGRlYnVnTmFtZSwgW1Njb3BlIG5ld1Njb3BlXSkgewogICAgcHVzaChzY29wZSk7CiAgICBzY29wZSA9IG5ld1Njb3BlID8/IHNjb3BlLmNyZWF0ZU5lc3RlZFNjb3BlKGRlYnVnTmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGV4aXRMb2NhbFNjb3BlKCkgewogICAgc2NvcGUgPSBwb3AoKTsKICAgIGFzc2VydChzY29wZSAhPSBudWxsKTsKICB9CgogIHZvaWQgZW50ZXJCcmVha1RhcmdldChpbnQgY2hhck9mZnNldCwgW0ogdGFyZ2V0XSkgewogICAgcHVzaChicmVha1RhcmdldCA/PyBOdWxsVmFsdWUuQnJlYWtUYXJnZXQpOwogICAgYnJlYWtUYXJnZXQgPSB0YXJnZXQgPz8gY3JlYXRlQnJlYWtUYXJnZXQoY2hhck9mZnNldCk7CiAgfQoKICB2b2lkIGVudGVyQ29udGludWVUYXJnZXQoaW50IGNoYXJPZmZzZXQsIFtKIHRhcmdldF0pIHsKICAgIHB1c2goY29udGludWVUYXJnZXQgPz8gTnVsbFZhbHVlLkNvbnRpbnVlVGFyZ2V0KTsKICAgIGNvbnRpbnVlVGFyZ2V0ID0gdGFyZ2V0ID8/IGNyZWF0ZUNvbnRpbnVlVGFyZ2V0KGNoYXJPZmZzZXQpOwogIH0KCiAgSiBleGl0QnJlYWtUYXJnZXQoKSB7CiAgICBKIGN1cnJlbnQgPSBicmVha1RhcmdldDsKICAgIGJyZWFrVGFyZ2V0ID0gcG9wKCk7CiAgICByZXR1cm4gY3VycmVudDsKICB9CgogIEogZXhpdENvbnRpbnVlVGFyZ2V0KCkgewogICAgSiBjdXJyZW50ID0gY29udGludWVUYXJnZXQ7CiAgICBjb250aW51ZVRhcmdldCA9IHBvcCgpOwogICAgcmV0dXJuIGN1cnJlbnQ7CiAgfQoKICB2b2lkIGVudGVyTG9vcChpbnQgY2hhck9mZnNldCkgewogICAgZW50ZXJCcmVha1RhcmdldChjaGFyT2Zmc2V0KTsKICAgIGVudGVyQ29udGludWVUYXJnZXQoY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW4gYmVnaW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luQmxvY2tGdW5jdGlvbkJvZHkiKTsKICAgIGVudGVyTG9jYWxTY29wZSgiYmxvY2sgZnVuY3Rpb24gYm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvclN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5Gb3JTdGF0ZW1lbnQiKTsKICAgIGVudGVyTG9vcCh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIGVudGVyTG9jYWxTY29wZSgiZm9yIHN0YXRlbWVudCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvckNvbnRyb2xGbG93KFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZvckNvbnRyb2xGbG93Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoImZvciBpbiBhIGNvbGxlY3Rpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5CbG9jayhUb2tlbiB0b2tlbiwgQmxvY2tLaW5kIGJsb2NrS2luZCkgewogICAgZGVidWdFdmVudCgiYmVnaW5CbG9jayIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJibG9jayIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpblN3aXRjaEJsb2NrIik7CiAgICBlbnRlckxvY2FsU2NvcGUoInN3aXRjaCBibG9jayIpOwogICAgZW50ZXJCcmVha1RhcmdldCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Eb1doaWxlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkRvV2hpbGVTdGF0ZW1lbnQiKTsKICAgIGVudGVyTG9vcCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5XaGlsZVN0YXRlbWVudCIpOwogICAgZW50ZXJMb29wKHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkRvV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoImRvLXdoaWxlIHN0YXRlbWVudCBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZERvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmREb1doaWxlU3RhdGVtZW50Qm9keSIpOwogICAgT2JqZWN0IGJvZHkgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKGJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbldoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkiKTsKICAgIGVudGVyTG9jYWxTY29wZSgid2hpbGUgc3RhdGVtZW50IGJvZHkiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRXaGlsZVN0YXRlbWVudEJvZHkiKTsKICAgIE9iamVjdCBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkZvclN0YXRlbWVudEJvZHkiKTsKICAgIGVudGVyTG9jYWxTY29wZSgiZm9yIHN0YXRlbWVudCBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvclN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEZvclN0YXRlbWVudEJvZHkiKTsKICAgIE9iamVjdCBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRm9ySW5Cb2R5Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoImZvci1pbiBib2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluQm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kRm9ySW5Cb2R5Iik7CiAgICBPYmplY3QgYm9keSA9IHBvcCgpOwogICAgZXhpdExvY2FsU2NvcGUoKTsKICAgIHB1c2goYm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5UaGVuU3RhdGVtZW50Iik7CiAgICBlbnRlckxvY2FsU2NvcGUoInRoZW4iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiZW5kVGhlblN0YXRlbWVudCIpOwogICAgT2JqZWN0IGJvZHkgPSBwb3AoKTsKICAgIGV4aXRMb2NhbFNjb3BlKCk7CiAgICBwdXNoKGJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkVsc2VTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRWxzZVN0YXRlbWVudCIpOwogICAgZW50ZXJMb2NhbFNjb3BlKCJlbHNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEVsc2VTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEVsc2VTdGF0ZW1lbnQiKTsKICAgIE9iamVjdCBib2R5ID0gcG9wKCk7CiAgICBleGl0TG9jYWxTY29wZSgpOwogICAgcHVzaChib2R5KTsKICB9Cn0KgNgATk48AR4BUAFEFAFIASMjAURFARYJDCUCATwPAREBFAFHATsBKD8EAStCBAEnPgQBPRE8BAEMGhMbBAE2MDsEATk2QQQBGB0ZFAQBGyAcFAQBIyIlBAEMLSosBAEMKCUhJgQBDD8nLAQBDDYeHgQBDCckJSgEAQwsKSEEAQwqJyEEAQwwLTAEAQwuKxkWEAQBDC4rLQQBDCwpGRYQBAEMLCkrBAEMKicZFhAEAQwlIiQEAQwjIBkWEAQBDCkmHQQBDCckGRYQBAEMKSYdBAEMJyQZFhAEAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zY29wZV9saXN0ZW5lci5kYXJ0Z2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lcl9pbXBsLmRhcnSPxC8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnN0YWNrX2xpc3RlbmVyX2ltcGw7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvY29kZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydCcgc2hvdyBQYXJzZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3N0YWNrX2xpc3RlbmVyLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQXN5bmNNYXJrZXIsIEV4cHJlc3Npb24sIEZ1bmN0aW9uTm9kZSwgVHJlZU5vZGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBhcyBwcm9ibGVtcwogICAgc2hvdyBpbnRlcm5hbFByb2JsZW0sIHVuaGFuZGxlZCwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJ3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBTdGFja0xpc3RlbmVySW1wbCBleHRlbmRzIFN0YWNrTGlzdGVuZXIgewogIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGdldCBsaWJyYXJ5QnVpbGRlcjsKCiAgLy8gVE9ETyhhaGUpOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuIE9ubHkgaW1wbGVtZW50ZWQgYnkgYm9keV9idWlsZGVyLmRhcnQKICAvLyBhbmQgYXN0X2J1aWxkZXIuZGFydC4KICB2b2lkIGZpbmlzaEZ1bmN0aW9uKAogICAgICBjb3ZhcmlhbnQgZm9ybWFscywgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciwgY292YXJpYW50IGJvZHkpIHsKICAgIHJldHVybiBwcm9ibGVtcy51bnN1cHBvcnRlZCgiZmluaXNoRnVuY3Rpb24iLCAtMSwgdXJpKTsKICB9CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgLy8gYW5kIGFzdF9idWlsZGVyLmRhcnQuCiAgZHluYW1pYyBmaW5pc2hGaWVsZHMoKSB7CiAgICByZXR1cm4gcHJvYmxlbXMudW5zdXBwb3J0ZWQoImZpbmlzaEZpZWxkcyIsIC0xLCB1cmkpOwogIH0KCiAgLy8gVE9ETyhhaGUpOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuIE9ubHkgaW1wbGVtZW50ZWQgYnkgYm9keV9idWlsZGVyLmRhcnQKICAvLyBhbmQgYXN0X2J1aWxkZXIuZGFydC4KICBMaXN0PEV4cHJlc3Npb24+IGZpbmlzaE1ldGFkYXRhKFRyZWVOb2RlIHBhcmVudCkgewogICAgcmV0dXJuIHByb2JsZW1zLnVuc3VwcG9ydGVkKCJmaW5pc2hNZXRhZGF0YSIsIC0xLCB1cmkpOwogIH0KCiAgLy8gVE9ETyhhaGUpOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuIE9ubHkgaW1wbGVtZW50ZWQgYnkgYm9keV9idWlsZGVyLmRhcnQKICAvLyBhbmQgYXN0X2J1aWxkZXIuZGFydC4KICB2b2lkIGV4aXRMb2NhbFNjb3BlKCkgPT4gcHJvYmxlbXMudW5zdXBwb3J0ZWQoImV4aXRMb2NhbFNjb3BlIiwgLTEsIHVyaSk7CgogIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0LgogIGR5bmFtaWMgcGFyc2VTaW5nbGVFeHByZXNzaW9uKAogICAgICBQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbiwgRnVuY3Rpb25Ob2RlIHBhcmFtZXRlcnMpIHsKICAgIHJldHVybiBwcm9ibGVtcy51bnN1cHBvcnRlZCgiZmluaXNoU2luZ2xlRXhwcmVzc2lvbiIsIC0xLCB1cmkpOwogIH0KCiAgLy8vIFVzZWQgdG8gcmVwb3J0IGFuIGludGVybmFsIGVycm9yIGVuY291bnRlcmVkIGluIHRoZSBzdGFjayBsaXN0ZW5lci4KICBkeW5hbWljIGludGVybmFsUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgICByZXR1cm4gcHJvYmxlbXMuaW50ZXJuYWxQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIHVyaSk7CiAgfQoKICAvLy8gVXNlZCB0byByZXBvcnQgYW4gdW5leHBlY3RlZCBzaXR1YXRpb24gZW5jb3VudGVyZWQgaW4gdGhlIHN0YWNrCiAgLy8vIGxpc3RlbmVyLgogIGR5bmFtaWMgdW5oYW5kbGVkKFN0cmluZyB3aGF0LCBTdHJpbmcgd2hlcmUsIGludCBjaGFyT2Zmc2V0LCBVcmkgdXJpKSB7CiAgICByZXR1cm4gcHJvYmxlbXMudW5oYW5kbGVkKHdoYXQsIHdoZXJlLCBjaGFyT2Zmc2V0LCB1cmkpOwogIH0KCiAgdm9pZCByZXBvcnRNaXNzaW5nTm9uTnVsbGFibGVTdXBwb3J0KFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQoIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgYXNzZXJ0KHRva2VuICE9IG51bGwpOwogICAgaWYgKGxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQuZW5hYmxlTm9uTnVsbGFibGUpIHsKICAgICAgaWYgKGxpYnJhcnlCdWlsZGVyLmxhbmd1YWdlVmVyc2lvbi5pc0V4cGxpY2l0KSB7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlTm9uTnVsbGFibGVPcHRPdXQsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLmNoYXJDb3VudCwKICAgICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICBtZXNzYWdlTm9uTnVsbGFibGVPcHRPdXRDb21tZW50LndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIubGFuZ3VhZ2VWZXJzaW9uLmZpbGVVcmksCiAgICAgICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxhbmd1YWdlVmVyc2lvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5sYW5ndWFnZVZlcnNpb24uY2hhckNvdW50KQogICAgICAgICAgICBdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcmludChsaWJyYXJ5QnVpbGRlci5sYW5ndWFnZVZlcnNpb24pOwogICAgICAgIGFkZFByb2JsZW0obWVzc2FnZU5vbk51bGxhYmxlT3B0T3V0LCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5jaGFyQ291bnQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhZGRQcm9ibGVtKHRlbXBsYXRlRXhwZXJpbWVudE5vdEVuYWJsZWQud2l0aEFyZ3VtZW50cygnbm9uLW51bGxhYmxlJyksCiAgICAgICAgICB0b2tlbi5vZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0KICB9CgogIHZvaWQgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGlmIChxdWVzdGlvbk1hcmsgIT0gbnVsbCkgewogICAgICByZXBvcnRNaXNzaW5nTm9uTnVsbGFibGVTdXBwb3J0KHF1ZXN0aW9uTWFyayk7CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydE5vbk51bGxhYmxlTW9kaWZpZXJFcnJvcihUb2tlbiBtb2RpZmllclRva2VuKSB7CiAgICBhc3NlcnQoIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgaWYgKG1vZGlmaWVyVG9rZW4gIT0gbnVsbCkgewogICAgICByZXBvcnRNaXNzaW5nTm9uTnVsbGFibGVTdXBwb3J0KG1vZGlmaWVyVG9rZW4pOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbk5vdEVuYWJsZWQoVG9rZW4gYmFuZykgewogICAgcmVwb3J0TWlzc2luZ05vbk51bGxhYmxlU3VwcG9ydChiYW5nKTsKICB9Cn0KCi8vLyBBIG51bGwtYXdhcmUgYWx0ZXJuYXRpdmUgdG8gYHRva2VuLm9mZnNldGAuICBJZiBbdG9rZW5dIGlzIGBudWxsYCwgcmV0dXJucwovLy8gYFRyZWVOb2RlLm5vT2Zmc2V0YC4KaW50IG9mZnNldEZvclRva2VuKFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIHRva2VuID09IG51bGwgPyBUcmVlTm9kZS5ub09mZnNldCA6IHRva2VuLm9mZnNldDsKfQpyAE5OPAEjAUsBSQFFAUoBIToBHgEmMgEmATkrAVAbF0Y8BAFQGxs6BAFQGzU8BAFQG0wBUSE9RAQBSkY/BAFGEEo9BAE2NBs6N1AnPDo9PBAPL1EIDU0jBgQBNyA1BgQBPTQhNgYEAT0rBAIBTxkiOwIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc3RhY2tfbGlzdGVuZXJfaW1wbC5kYXJ0X2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS92YWx1ZV9raW5kcy5kYXJ0lKkvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9zdGFja19saXN0ZW5lci5kYXJ0JwogICAgc2hvdyBOdWxsVmFsdWU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3N0YWNrX2xpc3RlbmVyLmRhcnQnIGFzIHR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3ZhbHVlX2tpbmQuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zY2FubmVyLmRhcnQnIGFzIHR5cGUKICAgIHNob3cgVG9rZW47CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBhcyB0eXBlOwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0JyBhcyB0eXBlOwppbXBvcnQgJy4uL2J1aWxkZXIvZHluYW1pY190eXBlX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0JyBhcyB0eXBlOwppbXBvcnQgJy4uL2J1aWxkZXIvZmllbGRfYnVpbGRlci5kYXJ0JyBhcyB0eXBlOwppbXBvcnQgJy4uL2J1aWxkZXIvZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9mdW5jdGlvbl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL2ludmFsaWRfdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9uYW1lX2l0ZXJhdG9yLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL3ByZWZpeF9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2FsaWFzX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JyBhcyB0eXBlOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnIGFzIHR5cGU7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKaW1wb3J0ICcuLi9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0JyBhcyB0eXBlOwppbXBvcnQgJy4uL2J1aWxkZXIvdm9pZF90eXBlX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKCmltcG9ydCAnLi4vaWRlbnRpZmllcnMuZGFydCcgYXMgdHlwZTsKCmltcG9ydCAnLi4va2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnQnIGFzIHR5cGU7CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnIGFzIHR5cGU7CgppbXBvcnQgJy4uL29wZXJhdG9yLmRhcnQnIGFzIHR5cGU7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIGFzIHR5cGU7CgppbXBvcnQgJy4uL3NvdXJjZS9vdXRsaW5lX2J1aWxkZXIuZGFydCcgYXMgdHlwZTsKCmNsYXNzIFZhbHVlS2luZHMgewogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgQXJndW1lbnRzID0gY29uc3QgU2luZ2xlVmFsdWVLaW5kPHR5cGUuQXJndW1lbnRzPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgQXJndW1lbnRzT3JOdWxsID0KICAgICAgY29uc3QgU2luZ2xlVmFsdWVLaW5kPHR5cGUuQXJndW1lbnRzPihOdWxsVmFsdWUuQXJndW1lbnRzKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIEV4cHJlc3Npb24gPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5FeHByZXNzaW9uPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgRXhwcmVzc2lvbk9yTnVsbCA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLkV4cHJlc3Npb24+KE51bGxWYWx1ZS5FeHByZXNzaW9uKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIElkZW50aWZpZXIgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5JZGVudGlmaWVyPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgSWRlbnRpZmllck9yTnVsbCA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLklkZW50aWZpZXI+KE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIEludGVnZXIgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8aW50PigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgRm9ybWFscyA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDxMaXN0PHR5cGUuRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBGb3JtYWxzT3JOdWxsID0KICAgICAgY29uc3QgU2luZ2xlVmFsdWVLaW5kPExpc3Q8dHlwZS5Gb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPj4oCiAgICAgICAgICBOdWxsVmFsdWUuRm9ybWFsUGFyYW1ldGVycyk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBHZW5lcmF0b3IgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5HZW5lcmF0b3I+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBJbml0aWFsaXplciA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLkluaXRpYWxpemVyPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgTWV0aG9kQm9keSA9IGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLk1ldGhvZEJvZHk+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBNb2RpZmllcnMgPQogICAgICBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8TGlzdDx0eXBlLk1vZGlmaWVyPj4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIE1vZGlmaWVyc09yTnVsbCA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDxMaXN0PHR5cGUuTW9kaWZpZXI+PihOdWxsVmFsdWUuTW9kaWZpZXJzKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIE5hbWUgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8U3RyaW5nPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgTmFtZU9yTnVsbCA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDxTdHJpbmc+KE51bGxWYWx1ZS5OYW1lKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIE5hbWVPck9wZXJhdG9yID0KICAgICAgY29uc3QgVW5pb25WYWx1ZUtpbmQoW05hbWUsIE9wZXJhdG9yXSk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBOYW1lT3JRdWFsaWZpZWROYW1lT3JPcGVyYXRvciA9CiAgICAgIGNvbnN0IFVuaW9uVmFsdWVLaW5kKFtOYW1lLCBRdWFsaWZpZWROYW1lLCBPcGVyYXRvcl0pOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgTmFtZU9yUGFyc2VyUmVjb3ZlcnkgPQogICAgICBjb25zdCBVbmlvblZhbHVlS2luZChbTmFtZSwgUGFyc2VyUmVjb3ZlcnldKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIE1ldGFkYXRhTGlzdE9yTnVsbCA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDxMaXN0PHR5cGUuTWV0YWRhdGFCdWlsZGVyPj4oTnVsbFZhbHVlLk1ldGFkYXRhKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIE9iamVjdExpc3QgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8TGlzdDxPYmplY3Q+PigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgT3BlcmF0b3IgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5PcGVyYXRvcj4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIFBhcnNlclJlY292ZXJ5ID0KICAgICAgY29uc3QgU2luZ2xlVmFsdWVLaW5kPHR5cGUuUGFyc2VyUmVjb3Zlcnk+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBQcm9ibGVtQnVpbGRlciA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLlByb2JsZW1CdWlsZGVyPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgUXVhbGlmaWVkTmFtZSA9CiAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLlF1YWxpZmllZE5hbWU+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBTdGF0ZW1lbnQgPSBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5TdGF0ZW1lbnQ+KCk7CiAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBUb2tlbiA9IGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLlRva2VuPigpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgVG9rZW5Pck51bGwgPQogICAgICBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5Ub2tlbj4oTnVsbFZhbHVlLlRva2VuKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIFR5cGVBcmd1bWVudHNPck51bGwgPQogICAgICBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8TGlzdDx0eXBlLlVucmVzb2x2ZWRUeXBlPj4oTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIHN0YXRpYyBjb25zdCBWYWx1ZUtpbmQgVHlwZUJ1aWxkZXIgPQogICAgICBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8dHlwZS5UeXBlQnVpbGRlcj4oKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIFR5cGVCdWlsZGVyT3JOdWxsID0KICAgICAgY29uc3QgU2luZ2xlVmFsdWVLaW5kPHR5cGUuVHlwZUJ1aWxkZXI+KE51bGxWYWx1ZS5UeXBlKTsKICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIFR5cGVWYXJpYWJsZUxpc3RPck51bGwgPQogICAgICBjb25zdCBTaW5nbGVWYWx1ZUtpbmQ8TGlzdDx0eXBlLlR5cGVWYXJpYWJsZUJ1aWxkZXI+PigKICAgICAgICAgIE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKfQpyAE5OPAFEFAFNAUEBRhABKgEqNzBANy8wOzM4QzIxMzwzMDU2MTUvOzgyNAEmATYBIwEjASABMQETTitCUCxEUCxEQSNCKUAnTicxUCU0K0dBJjUqLjk9MDQuTU1MKjQqNCkzTkYnOi9RJzEtPzI9JAIBM3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2UvdmFsdWVfa2luZHMuZGFydGlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnTAAorWLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvZmxvd19hbmFseXNpcy9mbG93X2FuYWx5c2lzLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvbGluay5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbnRlcm5hbF9hc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfZGVtb3Rpb24uZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2JvdW5kc19jaGVja3MuZGFydCcgc2hvdyBjYWxjdWxhdGVCb3VuZHM7CgppbXBvcnQgJy4uLy4uL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnQnCiAgICBzaG93CiAgICAgICAgSW5zdHJ1bWVudGF0aW9uLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSwKICAgICAgICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzOwoKaW1wb3J0ICcuLi9idWlsZGVyL2NvbnN0cnVjdG9yX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9leHRlbnNpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JzsKCmltcG9ydCAnLi4va2VybmVsL2ludGVybmFsX2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsLAogICAgICAgIGdldEV4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICBnZXRFeHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQ7CgppbXBvcnQgJy4uL2tlcm5lbC9pbmZlcmVuY2VfdmlzaXRvci5kYXJ0JzsKCmltcG9ydCAnLi4va2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0JyBzaG93IGhhc0FueVR5cGVWYXJpYWJsZXM7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbSwgdW5leHBlY3RlZCwgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdpbmZlcmVuY2VfaGVscGVyLmRhcnQnIHNob3cgSW5mZXJlbmNlSGVscGVyOwoKaW1wb3J0ICd0eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydCcgc2hvdyBUeXBlQ29uc3RyYWludEdhdGhlcmVyOwoKaW1wb3J0ICd0eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydCc7CgppbXBvcnQgJ3R5cGVfcHJvbW90aW9uLmRhcnQnIHNob3cgVHlwZVByb21vdGVyOwoKaW1wb3J0ICd0eXBlX3NjaGVtYS5kYXJ0JyBzaG93IGlzS25vd24sIFVua25vd25UeXBlOwoKaW1wb3J0ICd0eXBlX3NjaGVtYV9lbGltaW5hdGlvbi5kYXJ0JyBzaG93IGdyZWF0ZXN0Q2xvc3VyZTsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCcKICAgIHNob3cKICAgICAgICBnZXROYW1lZFBhcmFtZXRlclR5cGUsCiAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGUsCiAgICAgICAgVHlwZUNvbnN0cmFpbnQsCiAgICAgICAgVHlwZVZhcmlhYmxlRWxpbWluYXRvciwKICAgICAgICBUeXBlU2NoZW1hRW52aXJvbm1lbnQ7CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25Ob2RlXSwgZ2V0cyB0aGUgbmFtZWQgcGFyYW1ldGVyIGlkZW50aWZpZWQgYnkgW25hbWVdLCBvcgovLy8gYG51bGxgIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgpWYXJpYWJsZURlY2xhcmF0aW9uIGdldE5hbWVkRm9ybWFsKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgU3RyaW5nIG5hbWUpIHsKICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZm9ybWFsIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgaWYgKGZvcm1hbC5uYW1lID09IG5hbWUpIHJldHVybiBmb3JtYWw7CiAgfQogIHJldHVybiBudWxsOwp9CgovLy8gR2l2ZW4gYSBbRnVuY3Rpb25Ob2RlXSwgZ2V0cyB0aGUgW2lddGggcG9zaXRpb25hbCBmb3JtYWwgcGFyYW1ldGVyLCBvcgovLy8gYG51bGxgIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciB3aXRoIHRoYXQgaW5kZXguClZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0UG9zaXRpb25hbEZvcm1hbChGdW5jdGlvbk5vZGUgZnVuY3Rpb24sIGludCBpKSB7CiAgaWYgKGkgPCBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgIHJldHVybiBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICB9IGVsc2UgewogICAgcmV0dXJuIG51bGw7CiAgfQp9Cgpib29sIGlzT3ZlcmxvYWRhYmxlQXJpdGhtZXRpY09wZXJhdG9yKFN0cmluZyBuYW1lKSB7CiAgcmV0dXJuIGlkZW50aWNhbChuYW1lLCAnKycpIHx8CiAgICAgIGlkZW50aWNhbChuYW1lLCAnLScpIHx8CiAgICAgIGlkZW50aWNhbChuYW1lLCAnKicpIHx8CiAgICAgIGlkZW50aWNhbChuYW1lLCAnJScpOwp9CgovLy8gS2VlcHMgdHJhY2sgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlubmVybW9zdCBmdW5jdGlvbiBvciBjbG9zdXJlIGJlaW5nCi8vLyBpbmZlcnJlZC4KY2xhc3MgQ2xvc3VyZUNvbnRleHQgewogIGZpbmFsIGJvb2wgaXNBc3luYzsKCiAgZmluYWwgYm9vbCBpc0dlbmVyYXRvcjsKCiAgLy8vIFRoZSB0eXBpbmcgZXhwZWN0YXRpb24gZm9yIHRoZSBzdWJleHByZXNzaW9uIG9mIGEgYHJldHVybmAgb3IgYHlpZWxkYAogIC8vLyBzdGF0ZW1lbnQgaW5zaWRlIHRoZSBmdW5jdGlvbi4KICAvLy8KICAvLy8gRm9yIG5vbi1nZW5lcmF0b3IgYXN5bmMgZnVuY3Rpb25zLCB0aGlzIHdpbGwgYmUgYSAiRnV0dXJlT3IiIHR5cGUgKHNpbmNlCiAgLy8vIGl0IGlzIHBlcm1pc3NpYmxlIGZvciBzdWNoIGEgZnVuY3Rpb24gdG8gcmV0dXJuIGVpdGhlciBhIGRpcmVjdCB2YWx1ZSBvcgogIC8vLyBhIGZ1dHVyZSkuCiAgLy8vCiAgLy8vIEZvciBnZW5lcmF0b3IgZnVuY3Rpb25zIGNvbnRhaW5pbmcgYSBgeWllbGQqYCBzdGF0ZW1lbnQsIHRoZSBleHBlY3RlZCB0eXBlCiAgLy8vIGZvciB0aGUgc3ViZXhwcmVzc2lvbiBvZiB0aGUgYHlpZWxkKmAgc3RhdGVtZW50IGlzIHRoZSByZXN1bHQgb2Ygd3JhcHBpbmcKICAvLy8gdGhpcyB0eXBpbmcgZXhwZWN0YXRpb24gaW4gYFN0cmVhbWAgb3IgYEl0ZXJhdG9yYCwgYXMgYXBwcm9wcmlhdGUuCiAgZmluYWwgRGFydFR5cGUgcmV0dXJuT3JZaWVsZENvbnRleHQ7CgogIGZpbmFsIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZTsKCiAgZmluYWwgYm9vbCBfbmVlZFRvSW5mZXJSZXR1cm5UeXBlOwoKICAvLy8gVGhlIHR5cGUgdGhhdCBhY3R1YWxseSBhcHBlYXJlZCBhcyB0aGUgc3ViZXhwcmVzc2lvbiBvZiBgcmV0dXJuYCBvcgogIC8vLyBgeWllbGRgIHN0YXRlbWVudHMgaW5zaWRlIHRoZSBmdW5jdGlvbi4KICAvLy8KICAvLy8gRm9yIG5vbi1nZW5lcmF0b3IgYXN5bmMgZnVuY3Rpb25zLCB0aGlzIGlzIHRoZSAidW53cmFwcGVkIiB0eXBlIChlLmcuIGlmCiAgLy8vIHRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byByZXR1cm4gYEZ1dHVyZTxpbnQ+YCwgdGhpcyBpcyBgaW50YCkuCiAgLy8vCiAgLy8vIEZvciBnZW5lcmF0b3IgZnVuY3Rpb25zIGNvbnRhaW5pbmcgYSBgeWllbGQqYCBzdGF0ZW1lbnQsIHRoZSB0eXBlIHRoYXQKICAvLy8gYXBwZWFyZWQgYXMgdGhlIHN1YmV4cHJlc3Npb24gb2YgdGhlIGB5aWVsZCpgIHN0YXRlbWVudCB3YXMgdGhlIHJlc3VsdCBvZgogIC8vLyB3cmFwcGluZyB0aGlzIHR5cGUgaW4gYFN0cmVhbWAgb3IgYEl0ZXJhdG9yYCwgYXMgYXBwcm9wcmlhdGUuCiAgRGFydFR5cGUgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGU7CgogIC8vLyBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBhbiBhcnJvdyBmdW5jdGlvbi4KICBib29sIGlzQXJyb3c7CgogIC8vLyBBIGxpc3Qgb2YgcmV0dXJuIHN0YXRlbWVudHMgaW4gZnVuY3Rpb25zIHdob3NlIHJldHVybiB0eXBlIGlzIGJlaW5nCiAgLy8vIGluZmVycmVkLgogIC8vLwogIC8vLyBUaGUgcmV0dXJucyBhcmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIGlzIGluZmVycmVkLgogIExpc3Q8UmV0dXJuU3RhdGVtZW50PiByZXR1cm5TdGF0ZW1lbnRzOwoKICAvLy8gQSBsaXN0IG9mIHJldHVybiBleHByZXNzaW9uIHR5cGVzIGluIGZ1bmN0aW9ucyB3aG9zZSByZXR1cm4gdHlwZSBpcwogIC8vLyBiZWluZyBpbmZlcnJlZC4KICBMaXN0PERhcnRUeXBlPiByZXR1cm5FeHByZXNzaW9uVHlwZXM7CgogIGZhY3RvcnkgQ2xvc3VyZUNvbnRleHQoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXIsCiAgICAgIERhcnRUeXBlIHJldHVybkNvbnRleHQsIGJvb2wgbmVlZFRvSW5mZXJSZXR1cm5UeXBlKSB7CiAgICBhc3NlcnQocmV0dXJuQ29udGV4dCAhPSBudWxsKTsKICAgIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZSA9CiAgICAgICAgZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgcmV0dXJuQ29udGV4dCk7CiAgICBib29sIGlzQXN5bmMgPSBhc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luYyB8fAogICAgICAgIGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcjsKICAgIGJvb2wgaXNHZW5lcmF0b3IgPSBhc3luY01hcmtlciA9PSBBc3luY01hcmtlci5TeW5jU3RhciB8fAogICAgICAgIGFzeW5jTWFya2VyID09IEFzeW5jTWFya2VyLkFzeW5jU3RhcjsKICAgIGlmIChpc0dlbmVyYXRvcikgewogICAgICBpZiAoaXNBc3luYykgewogICAgICAgIHJldHVybkNvbnRleHQgPSBpbmZlcnJlci5nZXRUeXBlQXJndW1lbnRPZigKICAgICAgICAgICAgcmV0dXJuQ29udGV4dCwgaW5mZXJyZXIuY29yZVR5cGVzLnN0cmVhbUNsYXNzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm5Db250ZXh0ID0gaW5mZXJyZXIuZ2V0VHlwZUFyZ3VtZW50T2YoCiAgICAgICAgICAgIHJldHVybkNvbnRleHQsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0FzeW5jKSB7CiAgICAgIHJldHVybkNvbnRleHQgPSBpbmZlcnJlci53cmFwRnV0dXJlT3JUeXBlKAogICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShyZXR1cm5Db250ZXh0KSk7CiAgICB9CiAgICByZXR1cm4gbmV3IENsb3N1cmVDb250ZXh0Ll8oaXNBc3luYywgaXNHZW5lcmF0b3IsIHJldHVybkNvbnRleHQsCiAgICAgICAgZGVjbGFyZWRSZXR1cm5UeXBlLCBuZWVkVG9JbmZlclJldHVyblR5cGUpOwogIH0KCiAgQ2xvc3VyZUNvbnRleHQuXyh0aGlzLmlzQXN5bmMsIHRoaXMuaXNHZW5lcmF0b3IsIHRoaXMucmV0dXJuT3JZaWVsZENvbnRleHQsCiAgICAgIHRoaXMuZGVjbGFyZWRSZXR1cm5UeXBlLCB0aGlzLl9uZWVkVG9JbmZlclJldHVyblR5cGUpIHsKICAgIGlmIChfbmVlZFRvSW5mZXJSZXR1cm5UeXBlKSB7CiAgICAgIHJldHVyblN0YXRlbWVudHMgPSBbXTsKICAgICAgcmV0dXJuRXhwcmVzc2lvblR5cGVzID0gW107CiAgICB9CiAgfQoKICBib29sIGNoZWNrVmFsaWRSZXR1cm4oVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgRGFydFR5cGUgcmV0dXJuVHlwZSwKICAgICAgUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCwgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUpIHsKICAgIC8vIFRoZSBydWxlcyBmb3IgdmFsaWQgcmV0dXJucyBmb3IgZnVuY3Rpb25zIHdpdGggcmV0dXJuIHR5cGUgVCBhbmQgcG9zc2libHkKICAgIC8vIGEgcmV0dXJuIGV4cHJlc3Npb24gd2l0aCBzdGF0aWMgdHlwZSBTLgogICAgRGFydFR5cGUgZmxhdHRlbmVkUmV0dXJuVHlwZSA9IGlzQXN5bmMKICAgICAgICA/IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUocmV0dXJuVHlwZSkKICAgICAgICA6IHJldHVyblR5cGU7CiAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24gPT0gbnVsbCkgewogICAgICAvLyBTeW5jOiByZXR1cm47IGlzIGEgdmFsaWQgcmV0dXJuIGlmIFQgaXMgdm9pZCwgZHluYW1pYywgb3IgTnVsbC4KICAgICAgLy8gQXN5bmM6IHJldHVybjsgaXMgYSB2YWxpZCByZXR1cm4gaWYgZmxhdHRlbihUKSBpcyB2b2lkLCBkeW5hbWljLCBvcgogICAgICAvLyBOdWxsLgogICAgICBpZiAoZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyBWb2lkVHlwZSB8fAogICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyBEeW5hbWljVHlwZSB8fAogICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbFR5cGUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbiwKICAgICAgICAgIG5vTGVuZ3RoKQogICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gQXJyb3cgZnVuY3Rpb25zIGFyZSB2YWxpZCBpZjoKICAgIC8vIFN5bmM6IFQgaXMgdm9pZCBvciByZXR1cm4gZXhwOyBpcyBhIHZhbGlkIGZvciBhIGJsb2NrLWJvZGllZCBmdW5jdGlvbi4KICAgIC8vIEFzeW5jOiBmbGF0dGVuKFQpIGlzIHZvaWQgb3IgcmV0dXJuIGV4cDsgaXMgdmFsaWQgZm9yIGEgYmxvY2stYm9kaWVkCiAgICAvLyBmdW5jdGlvbi4KICAgIGlmIChpc0Fycm93ICYmIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHJldHVybiB0cnVlOwoKICAgIC8vIFN5bmM6IGludmFsaWQgaWYgVCBpcyB2b2lkIGFuZCBTIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsCiAgICAvLyBBc3luYzogaW52YWxpZCBpZiBUIGlzIHZvaWQgYW5kIGZsYXR0ZW4oUykgaXMgbm90IHZvaWQsIGR5bmFtaWMsIG9yIE51bGwuCiAgICBEYXJ0VHlwZSBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSA9IGlzQXN5bmMKICAgICAgICA/IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUoZXhwcmVzc2lvblR5cGUpCiAgICAgICAgOiBleHByZXNzaW9uVHlwZTsKICAgIGlmIChyZXR1cm5UeXBlIGlzIFZvaWRUeXBlICYmCiAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIFZvaWRUeXBlICYmCiAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIER5bmFtaWNUeXBlICYmCiAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgIT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7CiAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCiAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb24sIG5vTGVuZ3RoKQogICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gU3luYzogaW52YWxpZCBpZiBTIGlzIHZvaWQgYW5kIFQgaXMgbm90IHZvaWQsIGR5bmFtaWMsIG9yIE51bGwuCiAgICAvLyBBc3luYzogaW52YWxpZCBpZiBmbGF0dGVuKFMpIGlzIHZvaWQgYW5kIGZsYXR0ZW4oVCkgaXMgbm90IHZvaWQsIGR5bmFtaWMsCiAgICAvLyBvciBOdWxsLgogICAgaWYgKGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlIGlzIFZvaWRUeXBlICYmCiAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyEgVm9pZFR5cGUgJiYKICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlIGlzISBEeW5hbWljVHlwZSAmJgogICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgIT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7CiAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyCiAgICAgICAgICAud3JhcEluUHJvYmxlbShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgbWVzc2FnZVZvaWRFeHByZXNzaW9uLCBub0xlbmd0aCkKICAgICAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBUaGUgY2FsbGVyIHdpbGwgY2hlY2sgdGhhdCB0aGUgcmV0dXJuIGV4cHJlc3Npb24gaXMgYXNzaWduYWJsZSB0byB0aGUKICAgIC8vIHJldHVybiB0eXBlLgogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8gVXBkYXRlcyB0aGUgaW5mZXJyZWQgcmV0dXJuIHR5cGUgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgcmV0dXJuCiAgLy8vIHN0YXRlbWVudCByZXR1cm5pbmcgdGhlIGdpdmVuIFt0eXBlXS4KICB2b2lkIGhhbmRsZVJldHVybihUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50LAogICAgICBEYXJ0VHlwZSB0eXBlLCBib29sIGlzQXJyb3cpIHsKICAgIGlmIChpc0dlbmVyYXRvcikgcmV0dXJuOwogICAgLy8gVGhlIGZpcnN0IHJldHVybiB3ZSBzZWUgdGVsbHMgdXMgaWYgd2UgaGF2ZSBhbiBhcnJvdyBmdW5jdGlvbi4KICAgIGlmICh0aGlzLmlzQXJyb3cgPT0gbnVsbCkgewogICAgICB0aGlzLmlzQXJyb3cgPSBpc0Fycm93OwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHRoaXMuaXNBcnJvdyA9PSBpc0Fycm93KTsKICAgIH0KCiAgICBpZiAoX25lZWRUb0luZmVyUmV0dXJuVHlwZSkgewogICAgICAvLyBBZGQgdGhlIHJldHVybiB0byBhIGxpc3QgdG8gYmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgYWZ0ZXIgd2UndmUKICAgICAgLy8gaW5mZXJyZWQgdGhlIHJldHVybiB0eXBlLgogICAgICByZXR1cm5TdGF0ZW1lbnRzLmFkZChzdGF0ZW1lbnQpOwogICAgICByZXR1cm5FeHByZXNzaW9uVHlwZXMuYWRkKHR5cGUpOwoKICAgICAgLy8gVGhlIHJldHVybiBleHByZXNzaW9uIGhhcyB0byBiZSBhc3NpZ25hYmxlIHRvIHRoZSByZXR1cm4gdHlwZQogICAgICAvLyBleHBlY3RhdGlvbiBmcm9tIHRoZSBkb3dud2FyZHMgaW5mZXJlbmNlIGNvbnRleHQuCiAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgICAgcmV0dXJuT3JZaWVsZENvbnRleHQsIHR5cGUsIHN0YXRlbWVudC5leHByZXNzaW9uLAogICAgICAgICAgICBmaWxlT2Zmc2V0OiBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKICAgICAgICAgICAgaXNSZXR1cm5Gcm9tQXN5bmM6IGlzQXN5bmMsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICAgIGlmICghaWRlbnRpY2FsKHN0YXRlbWVudC5leHByZXNzaW9uLCBleHByZXNzaW9uKSkgewogICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBleHByZXNzaW9uLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CiAgICAgICAgICAvLyBOb3QgYXNzaWduYWJsZSwgdXNlIHRoZSBleHBlY3RhdGlvbi4KICAgICAgICAgIHR5cGUgPSBncmVhdGVzdENsb3N1cmUoaW5mZXJyZXIuY29yZVR5cGVzLCByZXR1cm5PcllpZWxkQ29udGV4dCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIERhcnRUeXBlIHVud3JhcHBlZFR5cGUgPSB0eXBlOwogICAgICBpZiAoaXNBc3luYykgewogICAgICAgIHVud3JhcHBlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHR5cGUpOwogICAgICB9CiAgICAgIGlmIChfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSA9PSBudWxsKSB7CiAgICAgICAgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUgPSB1bndyYXBwZWRUeXBlOwogICAgICB9IGVsc2UgewogICAgICAgIF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQoX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUsCiAgICAgICAgICAgICAgICB1bndyYXBwZWRUeXBlLCBpbmZlcnJlci5saWJyYXJ5LmxpYnJhcnkpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBJZiB3ZSBhcmUgbm90IGluZmVycmluZyBhIHR5cGUgd2UgY2FuIGltbWVkaWF0ZWx5IGNoZWNrIHRoYXQgdGhlIHJldHVybgogICAgLy8gaXMgdmFsaWQuCiAgICBpZiAoY2hlY2tWYWxpZFJldHVybihpbmZlcnJlciwgZGVjbGFyZWRSZXR1cm5UeXBlLCBzdGF0ZW1lbnQsIHR5cGUpICYmCiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgICAgcmV0dXJuT3JZaWVsZENvbnRleHQsIHR5cGUsIHN0YXRlbWVudC5leHByZXNzaW9uLAogICAgICAgICAgZmlsZU9mZnNldDogc3RhdGVtZW50LmZpbGVPZmZzZXQsCiAgICAgICAgICBpc1JldHVybkZyb21Bc3luYzogaXNBc3luYywKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uLnBhcmVudCA9IHN0YXRlbWVudDsKICAgIH0KICB9CgogIHZvaWQgaGFuZGxlWWllbGQoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgWWllbGRTdGF0ZW1lbnQgbm9kZSwKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBleHByZXNzaW9uUmVzdWx0KSB7CiAgICBpZiAoIWlzR2VuZXJhdG9yKSB7CiAgICAgIG5vZGUuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25SZXN1bHQuZXhwcmVzc2lvbi4ucGFyZW50ID0gbm9kZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgRGFydFR5cGUgZXhwZWN0ZWRUeXBlID0gbm9kZS5pc1lpZWxkU3RhcgogICAgICAgID8gX3dyYXBBc3luY09yR2VuZXJhdG9yKAogICAgICAgICAgICBpbmZlcnJlciwgcmV0dXJuT3JZaWVsZENvbnRleHQsIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpCiAgICAgICAgOiByZXR1cm5PcllpZWxkQ29udGV4dDsKICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoCiAgICAgICAgZXhwZWN0ZWRUeXBlLCBleHByZXNzaW9uUmVzdWx0LAogICAgICAgIGZpbGVPZmZzZXQ6IG5vZGUuZmlsZU9mZnNldCwgaXNSZXR1cm5Gcm9tQXN5bmM6IGlzQXN5bmMpOwogICAgbm9kZS5leHByZXNzaW9uID0gZXhwcmVzc2lvbi4ucGFyZW50ID0gbm9kZTsKICAgIERhcnRUeXBlIHR5cGUgPSBleHByZXNzaW9uUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIGlmICghaWRlbnRpY2FsKGV4cHJlc3Npb25SZXN1bHQuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbikpIHsKICAgICAgdHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShpbmZlcnJlci5jb3JlVHlwZXMsIGV4cGVjdGVkVHlwZSk7CiAgICB9CiAgICBpZiAoX25lZWRUb0luZmVyUmV0dXJuVHlwZSkgewogICAgICBEYXJ0VHlwZSB1bndyYXBwZWRUeXBlID0gdHlwZTsKICAgICAgaWYgKG5vZGUuaXNZaWVsZFN0YXIpIHsKICAgICAgICB1bndyYXBwZWRUeXBlID0gaW5mZXJyZXIuZ2V0RGVyaXZlZFR5cGVBcmd1bWVudE9mKAogICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgIGlzQXN5bmMKICAgICAgICAgICAgICAgICAgICA/IGluZmVycmVyLmNvcmVUeXBlcy5zdHJlYW1DbGFzcwogICAgICAgICAgICAgICAgICAgIDogaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MpID8/CiAgICAgICAgICAgIHR5cGU7CiAgICAgIH0KICAgICAgaWYgKF9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlID09IG51bGwpIHsKICAgICAgICBfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSA9IHVud3JhcHBlZFR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2luZmVycmVkVW53cmFwcGVkUmV0dXJuT3JZaWVsZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZChfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSwKICAgICAgICAgICAgICAgIHVud3JhcHBlZFR5cGUsIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CiAgICAgIH0KICAgIH0KICB9CgogIERhcnRUeXBlIGluZmVyUmV0dXJuVHlwZShUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSB7CiAgICBhc3NlcnQoX25lZWRUb0luZmVyUmV0dXJuVHlwZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPQogICAgICAgIGluZmVycmVyLmluZmVyUmV0dXJuVHlwZShfaW5mZXJyZWRVbndyYXBwZWRSZXR1cm5PcllpZWxkVHlwZSk7CiAgICBpZiAoIWluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihpbmZlcnJlZFR5cGUsCiAgICAgICAgcmV0dXJuT3JZaWVsZENvbnRleHQsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAvLyBJZiB0aGUgaW5mZXJyZWQgcmV0dXJuIHR5cGUgaXNuJ3QgYSBzdWJ0eXBlIG9mIHRoZSBjb250ZXh0LCB3ZSB1c2UgdGhlCiAgICAgIC8vIGNvbnRleHQuCiAgICAgIGluZmVycmVkVHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShpbmZlcnJlci5jb3JlVHlwZXMsIHJldHVybk9yWWllbGRDb250ZXh0KTsKICAgIH0KCiAgICBpbmZlcnJlZFR5cGUgPSBfd3JhcEFzeW5jT3JHZW5lcmF0b3IoCiAgICAgICAgaW5mZXJyZXIsIGluZmVycmVkVHlwZSwgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldHVyblN0YXRlbWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgY2hlY2tWYWxpZFJldHVybihpbmZlcnJlciwgaW5mZXJyZWRUeXBlLCByZXR1cm5TdGF0ZW1lbnRzW2ldLAogICAgICAgICAgcmV0dXJuRXhwcmVzc2lvblR5cGVzW2ldKTsKICAgIH0KCiAgICByZXR1cm4gZGVtb3RlVHlwZUluTGlicmFyeShpbmZlcnJlZFR5cGUsIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CiAgfQoKICBEYXJ0VHlwZSBfd3JhcEFzeW5jT3JHZW5lcmF0b3IoCiAgICAgIFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIsIERhcnRUeXBlIHR5cGUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICBpZiAoaXNHZW5lcmF0b3IpIHsKICAgICAgaWYgKGlzQXN5bmMpIHsKICAgICAgICByZXR1cm4gaW5mZXJyZXIud3JhcFR5cGUoCiAgICAgICAgICAgIHR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5zdHJlYW1DbGFzcywgbnVsbGFiaWxpdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBpbmZlcnJlci53cmFwVHlwZSgKICAgICAgICAgICAgdHlwZSwgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MsIG51bGxhYmlsaXR5KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0FzeW5jKSB7CiAgICAgIHJldHVybiBpbmZlcnJlci53cmFwRnV0dXJlVHlwZSh0eXBlLCBudWxsYWJpbGl0eSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICB9Cn0KCi8vLyBFbnVtIGRlbm90aW5nIHRoZSBraW5kcyBvZiBjb250cmF2YXJpYW5jZSBjaGVjayB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUKLy8vIGluc2VydGVkIGZvciBhIG1ldGhvZCBjYWxsLgplbnVtIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kIHsKICAvLy8gTm8gY29udHJhdmFyaWFuY2UgY2hlY2sgaXMgbmVlZGVkLgogIG5vbmUsCgogIC8vLyBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBjYWxsIG5lZWRzIHRvIGJlIGNoZWNrZWQuCiAgY2hlY2tNZXRob2RSZXR1cm4sCgogIC8vLyBUaGUgbWV0aG9kIGNhbGwgbmVlZHMgdG8gYmUgZGVzdWdhcmVkIGludG8gYSBnZXR0ZXIgY2FsbCwgZm9sbG93ZWQgYnkgYW4KICAvLy8gImFzIiBjaGVjaywgZm9sbG93ZWQgYnkgYW4gaW52b2NhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIG9iamVjdC4KICBjaGVja0dldHRlclJldHVybiwKfQoKLy8vIEtlZXBzIHRyYWNrIG9mIHRoZSBsb2NhbCBzdGF0ZSBmb3IgdGhlIHR5cGUgaW5mZXJlbmNlIHRoYXQgb2NjdXJzIGR1cmluZwovLy8gY29tcGlsYXRpb24gb2YgYSBzaW5nbGUgbWV0aG9kIGJvZHkgb3IgdG9wIGxldmVsIGluaXRpYWxpemVyLgovLy8KLy8vIFRoaXMgY2xhc3MgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgZm9yIHVzZSBieSBjbGllbnRzIG9mIHR5cGUgaW5mZXJlbmNlCi8vLyAoZS5nLiBCb2R5QnVpbGRlcikuICBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGRlcml2ZSBmcm9tIFtUeXBlSW5mZXJyZXJJbXBsXS4KYWJzdHJhY3QgY2xhc3MgVHlwZUluZmVycmVyIHsKICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeTsKCiAgLy8vIEdldHMgdGhlIFtUeXBlUHJvbW90ZXJdIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIHByb21vdGlvbiB3aXRoaW4KICAvLy8gdGhpcyBtZXRob2QgYm9keSBvciBpbml0aWFsaXplci4KICBUeXBlUHJvbW90ZXIgZ2V0IHR5cGVQcm9tb3RlcjsKCiAgLy8vIEdldHMgdGhlIFtUeXBlU2NoZW1hRW52aXJvbm1lbnRdIGJlaW5nIHVzZWQgZm9yIHR5cGUgaW5mZXJlbmNlLgogIFR5cGVTY2hlbWFFbnZpcm9ubWVudCBnZXQgdHlwZVNjaGVtYUVudmlyb25tZW50OwoKICAvLy8gUmV0dXJucyB0aGUgW0Zsb3dBbmFseXNpc10gdXNlZCBkdXJpbmcgaW5mZXJlbmNlLgogIEZsb3dBbmFseXNpczxUcmVlTm9kZSwgU3RhdGVtZW50LCBFeHByZXNzaW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uLCBEYXJ0VHlwZT4KICAgICAgZ2V0IGZsb3dBbmFseXNpczsKCiAgLy8vIFRoZSBVUkkgb2YgdGhlIGNvZGUgZm9yIHdoaWNoIHR5cGUgaW5mZXJlbmNlIGlzIGN1cnJlbnRseSBiZWluZwogIC8vLyBwZXJmb3JtZWQtLXRoaXMgaXMgdXNlZCBmb3IgdGVzdGluZy4KICBVcmkgZ2V0IHVyaUZvckluc3RydW1lbnRhdGlvbjsKCiAgQXNzaWduZWRWYXJpYWJsZXM8VHJlZU5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb24+IGdldCBhc3NpZ25lZFZhcmlhYmxlczsKCiAgLy8vIFBlcmZvcm1zIGZ1bGwgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIGZpZWxkIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gaW5mZXJGaWVsZEluaXRpYWxpemVyKAogICAgICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyLCBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpOwoKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIGZ1bmN0aW9uIGJvZHkuCiAgU3RhdGVtZW50IGluZmVyRnVuY3Rpb25Cb2R5KEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIERhcnRUeXBlIHJldHVyblR5cGUsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyLCBTdGF0ZW1lbnQgYm9keSk7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIuCiAgdm9pZCBpbmZlckluaXRpYWxpemVyKEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIEluaXRpYWxpemVyIGluaXRpYWxpemVyKTsKCiAgLy8vIFBlcmZvcm1zIHR5cGUgaW5mZXJlbmNlIG9uIHRoZSBnaXZlbiBtZXRhZGF0YSBhbm5vdGF0aW9ucy4KICB2b2lkIGluZmVyTWV0YWRhdGEoCiAgICAgIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsIFRyZWVOb2RlIHBhcmVudCwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyk7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gbWV0YWRhdGEgYW5ub3RhdGlvbnMga2VlcGluZyB0aGUKICAvLy8gZXhpc3RpbmcgaGVscGVyIGlmIHBvc3NpYmxlLgogIHZvaWQgaW5mZXJNZXRhZGF0YUtlZXBpbmdIZWxwZXIoCiAgICAgIFRyZWVOb2RlIHBhcmVudCwgTGlzdDxFeHByZXNzaW9uPiBhbm5vdGF0aW9ucyk7CgogIC8vLyBQZXJmb3JtcyB0eXBlIGluZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcGFyYW1ldGVyIGluaXRpYWxpemVyCiAgLy8vIGV4cHJlc3Npb24uCiAgRXhwcmVzc2lvbiBpbmZlclBhcmFtZXRlckluaXRpYWxpemVyKAogICAgICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyLAogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyLAogICAgICBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUsCiAgICAgIGJvb2wgaGFzRGVjbGFyZWRJbml0aWFsaXplcik7CgogIC8vLyBFbnN1cmVzIHRoYXQgYWxsIHBhcmFtZXRlciB0eXBlcyBvZiBbY29uc3RydWN0b3JdIGhhdmUgYmVlbiBpbmZlcnJlZC4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBXZSBhcmUgc3RpbGwgcGFyYW1ldGVycyBvbiBzeW50aGVzaXplZCBtaXhpbgogIC8vICBhcHBsaWNhdGlvbiBjb25zdHJ1Y3RvcnMuCiAgdm9pZCBpbmZlckNvbnN0cnVjdG9yUGFyYW1ldGVyVHlwZXMoQ29uc3RydWN0b3IgY29uc3RydWN0b3IpOwp9CgovLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW1R5cGVJbmZlcnJlcl0gc3BlY2lhbGl6ZWQgdG8gd29yayB3aXRoIGtlcm5lbAovLy8gb2JqZWN0cy4KY2xhc3MgVHlwZUluZmVycmVySW1wbCBpbXBsZW1lbnRzIFR5cGVJbmZlcnJlciB7CiAgLy8vIE1hcmtlciBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBhIGZ1bmN0aW9uIHRha2VzIGFuIHVua25vd24gbnVtYmVyCiAgLy8vIG9mIGFyZ3VtZW50cy4KICBmaW5hbCBGdW5jdGlvblR5cGUgdW5rbm93bkZ1bmN0aW9uOwoKICBmaW5hbCBUeXBlSW5mZXJlbmNlRW5naW5lIGVuZ2luZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgVHlwZVByb21vdGVyIHR5cGVQcm9tb3RlcjsKCiAgZmluYWwgRmxvd0FuYWx5c2lzPFRyZWVOb2RlLCBTdGF0ZW1lbnQsIEV4cHJlc3Npb24sIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgIERhcnRUeXBlPiBmbG93QW5hbHlzaXM7CgogIGZpbmFsIEFzc2lnbmVkVmFyaWFibGVzPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPiBhc3NpZ25lZFZhcmlhYmxlczsKCiAgZmluYWwgSW5mZXJlbmNlRGF0YUZvclRlc3RpbmcgZGF0YUZvclRlc3Rpbmc7CgogIEBvdmVycmlkZQogIGZpbmFsIFVyaSB1cmlGb3JJbnN0cnVtZW50YXRpb247CgogIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29uc3RydWN0IHdlIGFyZSBjdXJyZW50bHkgcGVyZm9ybWluZyBpbmZlcmVuY2UgZm9yCiAgLy8vIGlzIG91dHNpZGUgb2YgYSBtZXRob2QgYm9keSwgYW5kIGhlbmNlIHRvcCBsZXZlbCB0eXBlIGluZmVyZW5jZSBydWxlcwogIC8vLyBzaG91bGQgYXBwbHkuCiAgZmluYWwgYm9vbCBpc1RvcExldmVsOwoKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeTsKCiAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbjsKCiAgZmluYWwgVHlwZVNjaGVtYUVudmlyb25tZW50IHR5cGVTY2hlbWFFbnZpcm9ubWVudDsKCiAgZmluYWwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeTsKCiAgSW5mZXJlbmNlSGVscGVyIGhlbHBlcjsKCiAgLy8vIENvbnRleHQgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNsb3N1cmUsIG9yIGBudWxsYCBpZiB3ZSBhcmUgbm90CiAgLy8vIGluc2lkZSBhIGNsb3N1cmUuCiAgQ2xvc3VyZUNvbnRleHQgY2xvc3VyZUNvbnRleHQ7CgogIC8vLyBUaGUgW1N1YnN0aXR1dGlvbl0gaW5mZXJyZWQgYnkgdGhlIGxhc3QgW2luZmVySW52b2NhdGlvbl0sIG9yIGBudWxsYCBpZgogIC8vLyB0aGUgbGFzdCBpbnZvY2F0aW9uIGRpZG4ndCByZXF1aXJlIGFueSBpbmZlcmVuY2UuCiAgU3Vic3RpdHV0aW9uIGxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbjsKCiAgLy8vIFRoZSBbRnVuY3Rpb25UeXBlXSBvZiB0aGUgY2FsbGVlIGluIHRoZSBsYXN0IFtpbmZlckludm9jYXRpb25dLCBvciBgbnVsbGAKICAvLy8gaWYgdGhlIGxhc3QgaW52b2NhdGlvbiBkaWRuJ3QgcmVxdWlyZSBhbnkgaW5mZXJlbmNlLgogIEZ1bmN0aW9uVHlwZSBsYXN0Q2FsbGVlVHlwZTsKCiAgVHlwZUluZmVycmVySW1wbCh0aGlzLmVuZ2luZSwgdGhpcy51cmlGb3JJbnN0cnVtZW50YXRpb24sIGJvb2wgdG9wTGV2ZWwsCiAgICAgIHRoaXMudGhpc1R5cGUsIHRoaXMubGlicmFyeSwgdGhpcy5hc3NpZ25lZFZhcmlhYmxlcywgdGhpcy5kYXRhRm9yVGVzdGluZykKICAgICAgOiBhc3NlcnQobGlicmFyeSAhPSBudWxsKSwKICAgICAgICB1bmtub3duRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgICAgICBjb25zdCBbXSwgY29uc3QgRHluYW1pY1R5cGUoKSwgbGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgY2xhc3NIaWVyYXJjaHkgPSBlbmdpbmUuY2xhc3NIaWVyYXJjaHksCiAgICAgICAgaW5zdHJ1bWVudGF0aW9uID0gdG9wTGV2ZWwgPyBudWxsIDogZW5naW5lLmluc3RydW1lbnRhdGlvbiwKICAgICAgICB0eXBlU2NoZW1hRW52aXJvbm1lbnQgPSBlbmdpbmUudHlwZVNjaGVtYUVudmlyb25tZW50LAogICAgICAgIGlzVG9wTGV2ZWwgPSB0b3BMZXZlbCwKICAgICAgICB0eXBlUHJvbW90ZXIgPSBuZXcgVHlwZVByb21vdGVyKGVuZ2luZS50eXBlU2NoZW1hRW52aXJvbm1lbnQpLAogICAgICAgIGZsb3dBbmFseXNpcyA9IG5ldyBGbG93QW5hbHlzaXMoCiAgICAgICAgICAgIG5ldyBUeXBlT3BlcmF0aW9uc0NmZShlbmdpbmUudHlwZVNjaGVtYUVudmlyb25tZW50KSwKICAgICAgICAgICAgYXNzaWduZWRWYXJpYWJsZXMpOwoKICBDb3JlVHlwZXMgZ2V0IGNvcmVUeXBlcyA9PiBlbmdpbmUuY29yZVR5cGVzOwoKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+IGxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKCiAgYm9vbCBnZXQgbm5iZFN0cm9uZ01vZGUgPT4gbGlicmFyeS5sb2FkZXIubm5iZFN0cm9uZ01vZGU7CgogIGJvb2wgZ2V0IHBlcmZvcm1ObmJkQ2hlY2tzIHsKICAgIHJldHVybiAhaXNUb3BMZXZlbCAmJgogICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICBsaWJyYXJ5LmxvYWRlci5wZXJmb3JtTm5iZENoZWNrczsKICB9CgogIERhcnRUeXBlIGNvbXB1dGVOdWxsYWJsZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSA9PSBjb3JlVHlwZXMubnVsbFR5cGUgfHwgdHlwZSBpcyBOZXZlclR5cGUpIHsKICAgICAgcmV0dXJuIGNvcmVUeXBlcy5udWxsVHlwZTsKICAgIH0KICAgIHJldHVybiB0eXBlLndpdGhOdWxsYWJpbGl0eShsaWJyYXJ5Lm51bGxhYmxlKTsKICB9CgogIERhcnRUeXBlIGNvbXB1dGVOb25OdWxsYWJsZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAodHlwZSA9PSBjb3JlVHlwZXMubnVsbFR5cGUpIHsKICAgICAgcmV0dXJuIGlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAgID8gY29uc3QgTmV2ZXJUeXBlKE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKQogICAgICAgICAgOiB0eXBlOwogICAgfQogICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYgdHlwZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyVHlwZSh0eXBlLnBhcmFtZXRlciwgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsCiAgICAgICAgICBjb21wdXRlTm9uTnVsbGFibGUodHlwZS5wcm9tb3RlZEJvdW5kKSk7CiAgICB9CiAgICByZXR1cm4gdHlwZS53aXRoTnVsbGFiaWxpdHkobGlicmFyeS5ub25OdWxsYWJsZSk7CiAgfQoKICB2b2lkIHJlZ2lzdGVySWZVbnJlYWNoYWJsZUZvclRlc3RpbmcoVHJlZU5vZGUgbm9kZSwge2Jvb2wgaXNSZWFjaGFibGV9KSB7CiAgICBpZiAoZGF0YUZvclRlc3RpbmcgPT0gbnVsbCkgcmV0dXJuOwogICAgaXNSZWFjaGFibGUgPz89IGZsb3dBbmFseXNpcy5pc1JlYWNoYWJsZTsKICAgIGlmICghaXNSZWFjaGFibGUpIHsKICAgICAgZGF0YUZvclRlc3RpbmcuZmxvd0FuYWx5c2lzUmVzdWx0LnVucmVhY2hhYmxlTm9kZXMuYWRkKG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbmZlckNvbnN0cnVjdG9yUGFyYW1ldGVyVHlwZXMoQ29uc3RydWN0b3IgdGFyZ2V0KSB7CiAgICBDb25zdHJ1Y3RvckJ1aWxkZXIgY29uc3RydWN0b3IgPSBlbmdpbmUuYmVpbmdJbmZlcnJlZFt0YXJnZXRdOwogICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgLy8gVGhlcmUgaXMgYSBjeWNsaWMgZGVwZW5kZW5jeSB3aGVyZSBpbmZlcnJpbmcgdGhlIHR5cGVzIG9mIHRoZQogICAgICAvLyBpbml0aWFsaXppbmcgZm9ybWFscyBvZiBhIGNvbnN0cnVjdG9yIHJlcXVpcmVkIHVzIHRvIGluZmVyIHRoZQogICAgICAvLyBjb3JyZXNwb25kaW5nIGZpZWxkIHR5cGUgd2hpY2ggcmVxdWlyZWQgdXMgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUKICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgIFN0cmluZyBuYW1lID0gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWU7CiAgICAgIGlmICh0YXJnZXQubmFtZS5uYW1lLmlzTm90RW1wdHkpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IFVzZSBgaW5mZXJyZXIuaGVscGVyLmNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzYAogICAgICAgIC8vIGluc3RlYWQuIEhvd2V2ZXIsIGBpbmZlcnJlci5oZWxwZXJgIG1heSBiZSBudWxsLgogICAgICAgIG5hbWUgKz0gIi4ke3RhcmdldC5uYW1lLm5hbWV9IjsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5LndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICB0YXJnZXQuZmlsZU9mZnNldCwKICAgICAgICAgIG5hbWUubGVuZ3RoLAogICAgICAgICAgdGFyZ2V0LmZpbGVVcmkpOwogICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24KICAgICAgICAgIGluIHRhcmdldC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPz89IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgIH0KICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIGluIHRhcmdldC5mdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBkZWNsYXJhdGlvbi50eXBlID8/PSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKChjb25zdHJ1Y3RvciA9IGVuZ2luZS50b0JlSW5mZXJyZWRbdGFyZ2V0XSkgIT0gbnVsbCkgewogICAgICBlbmdpbmUudG9CZUluZmVycmVkLnJlbW92ZSh0YXJnZXQpOwogICAgICBlbmdpbmUuYmVpbmdJbmZlcnJlZFt0YXJnZXRdID0gY29uc3RydWN0b3I7CiAgICAgIGNvbnN0cnVjdG9yLmluZmVyRm9ybWFsVHlwZXMoKTsKICAgICAgZW5naW5lLmJlaW5nSW5mZXJyZWQucmVtb3ZlKHRhcmdldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGluZmVySW5pdGlhbGl6ZXIoSW5mZXJlbmNlSGVscGVyIGhlbHBlciwgSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgLy8gVXNlIHBvbHltb3JwaGljIGRpc3BhdGNoIG9uIFtLZXJuZWxJbml0aWFsaXplcl0gdG8gcGVyZm9ybSB3aGF0ZXZlcgogICAgLy8ga2luZCBvZiB0eXBlIGluZmVyZW5jZSBpcyBjb3JyZWN0IGZvciB0aGlzIGtpbmQgb2YgaW5pdGlhbGl6ZXIuCiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGV4cGVyaW1lbnQgdG8gc2VlIGlmIGR5bmFtaWMgZGlzcGF0Y2ggd291bGQgYmUgYmV0dGVyLAogICAgLy8gc28gdGhhdCB0aGUgdHlwZSBoaWVyYXJjaHkgd2lsbCBiZSBzaW1wbGVyICh3aGljaCBtYXkgc3BlZWQgdXAgImlzIgogICAgLy8gY2hlY2tzKS4KICAgIGlmIChpbml0aWFsaXplciBpcyBJbml0aWFsaXplckp1ZGdtZW50KSB7CiAgICAgIGluaXRpYWxpemVyLmFjY2VwdEluZmVyZW5jZShuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKSk7CiAgICB9IGVsc2UgewogICAgICBpbml0aWFsaXplci5hY2NlcHQobmV3IEluZmVyZW5jZVZpc2l0b3IodGhpcykpOwogICAgfQogICAgdGhpcy5oZWxwZXIgPSBudWxsOwogIH0KCiAgYm9vbCBpc0RvdWJsZUNvbnRleHQoRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIC8vIEEgY29udGV4dCBpcyBhIGRvdWJsZSBjb250ZXh0IGlmIGRvdWJsZSBpcyBhc3NpZ25hYmxlIHRvIGl0IGJ1dCBpbnQgaXMKICAgIC8vIG5vdC4gIFRoYXQgaXMgdGhlIHR5cGUgY29udGV4dCBpcyBhIGRvdWJsZSBjb250ZXh0IGlmIGl0IGlzOgogICAgLy8gICAqIGRvdWJsZQogICAgLy8gICAqIEZ1dHVyZU9yPFQ+IHdoZXJlIFQgaXMgYSBkb3VibGUgY29udGV4dAogICAgLy8KICAgIC8vIFdlIGNoZWNrIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyBpc0Fzc2lnbmFibGUgYmVjYXVzZSBpdCdzIHNpbXBsZXIuCiAgICB3aGlsZSAodHlwZUNvbnRleHQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGVDb250ZXh0LmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcyAmJgogICAgICAgIHR5cGVDb250ZXh0LnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUgPSB0eXBlQ29udGV4dDsKICAgICAgdHlwZUNvbnRleHQgPSB0eXBlLnR5cGVBcmd1bWVudHMuZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gdHlwZUNvbnRleHQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGVDb250ZXh0LmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZG91YmxlQ2xhc3M7CiAgfQoKICBib29sIGlzQXNzaWduYWJsZShEYXJ0VHlwZSBjb250ZXh0VHlwZSwgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUsCiAgICAgIHtib29sIGlzU3Ryb25nTnVsbGFiaWxpdHlNb2RlfSkgewogICAgaXNTdHJvbmdOdWxsYWJpbGl0eU1vZGUgPz89IGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgbm5iZFN0cm9uZ01vZGU7CiAgICBpZiAoaXNTdHJvbmdOdWxsYWJpbGl0eU1vZGUpIHsKICAgICAgaWYgKGV4cHJlc3Npb25UeXBlIGlzIER5bmFtaWNUeXBlKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIHR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKGV4cHJlc3Npb25UeXBlLCBjb250ZXh0VHlwZSkKICAgICAgICAgIC5pc1N1YnR5cGVXaGVuVXNpbmdOdWxsYWJpbGl0aWVzKCk7CiAgICB9CiAgICByZXR1cm4gdHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKGV4cHJlc3Npb25UeXBlLCBjb250ZXh0VHlwZSkKICAgICAgICAub3JTdWJ0eXBlQ2hlY2tGb3IoY29udGV4dFR5cGUsIGV4cHJlc3Npb25UeXBlLCB0eXBlU2NoZW1hRW52aXJvbm1lbnQpCiAgICAgICAgLmlzU3VidHlwZVdoZW5JZ25vcmluZ051bGxhYmlsaXRpZXMoKTsKICB9CgogIEV4cHJlc3Npb24gZW5zdXJlQXNzaWduYWJsZVJlc3VsdCgKICAgICAgRGFydFR5cGUgZXhwZWN0ZWRUeXBlLCBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCwKICAgICAge2ludCBmaWxlT2Zmc2V0LAogICAgICBib29sIGlzVm9pZEFsbG93ZWQ6IGZhbHNlLAogICAgICBib29sIGlzUmV0dXJuRnJvbUFzeW5jOiBmYWxzZX0pIHsKICAgIHJldHVybiBlbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGV4cGVjdGVkVHlwZSwgcmVzdWx0LmluZmVycmVkVHlwZSwgcmVzdWx0LmV4cHJlc3Npb24sCiAgICAgICAgZmlsZU9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpc1ZvaWRBbGxvd2VkLAogICAgICAgIGlzUmV0dXJuRnJvbUFzeW5jOiBpc1JldHVybkZyb21Bc3luYyk7CiAgfQoKICAvLy8gRW5zdXJlcyB0aGF0IFtleHByZXNzaW9uVHlwZV0gaXMgYXNzaWduYWJsZSB0byBbY29udGV4dFR5cGVdLgogIC8vLwogIC8vLyBDaGVja3Mgd2hldGhlciBbZXhwcmVzc2lvblR5cGVdIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZgogIC8vLyBbY29udGV4dFR5cGVdLCBhbmQgaW5zZXJ0cyBhbiBpbXBsaWNpdCBkb3duY2FzdCwgaW5zZXJ0cyBhIHRlYXItb2ZmLCBvcgogIC8vLyByZXBvcnRzIGFuIGVycm9yIGlmIGFwcHJvcHJpYXRlLgogIEV4cHJlc3Npb24gZW5zdXJlQXNzaWduYWJsZSgKICAgICAgRGFydFR5cGUgY29udGV4dFR5cGUsIERhcnRUeXBlIGV4cHJlc3Npb25UeXBlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtpbnQgZmlsZU9mZnNldCwKICAgICAgYm9vbCBpc1JldHVybkZyb21Bc3luYzogZmFsc2UsCiAgICAgIGJvb2wgaXNWb2lkQWxsb3dlZDogZmFsc2UsCiAgICAgIFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oRGFydFR5cGUsIERhcnRUeXBlLCBib29sKT4gZXJyb3JUZW1wbGF0ZSwKICAgICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihEYXJ0VHlwZSwgRGFydFR5cGUsIGJvb2wpPiB3YXJuaW5nVGVtcGxhdGV9KSB7CiAgICBhc3NlcnQoY29udGV4dFR5cGUgIT0gbnVsbCk7CgogICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBpbnNlcnQgYXNzaWduYWJpbGl0eSBjaGVja3Mgd2hlbiBkb2luZyB0b3AgbGV2ZWwgdHlwZQogICAgLy8gaW5mZXJlbmNlIHNpbmNlIHRvcCBsZXZlbCB0eXBlIGluZmVyZW5jZSBvbmx5IGNhcmVzIGFib3V0IHRoZSB0eXBlIHRoYXQKICAgIC8vIGlzIGluZmVycmVkICh0aGUga2VybmVsIGNvZGUgaXMgZGlzY2FyZGVkKS4KICAgIGlmIChpc1RvcExldmVsKSByZXR1cm4gZXhwcmVzc2lvbjsKCiAgICBmaWxlT2Zmc2V0ID8/PSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICBjb250ZXh0VHlwZSA9IGdyZWF0ZXN0Q2xvc3VyZShjb3JlVHlwZXMsIGNvbnRleHRUeXBlKTsKCiAgICBEYXJ0VHlwZSBpbml0aWFsQ29udGV4dFR5cGUgPSBjb250ZXh0VHlwZTsKICAgIGlmIChpc1JldHVybkZyb21Bc3luYyAmJgogICAgICAgICFpc0Fzc2lnbmFibGUoaW5pdGlhbENvbnRleHRUeXBlLCBleHByZXNzaW9uVHlwZSkpIHsKICAgICAgLy8gSWYgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIGlzIGFzeW5jLCB0aGUgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgaGFzIHRoZQogICAgICAvLyBzaGFwZSBGdXR1cmVPcjxUPi4gIFdlIGNoZWNrIGJvdGggYnJhbmNoZXMgZm9yIEZ1dHVyZU9yIGhlcmU6IGJvdGggVAogICAgICAvLyBhbmQgRnV0dXJlPFQ+LgogICAgICBEYXJ0VHlwZSB1bmZ1dHVyZWRFeHBlY3RlZFR5cGUgPQogICAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShjb250ZXh0VHlwZSk7CiAgICAgIERhcnRUeXBlIGZ1dHVyZWRFeHBlY3RlZFR5cGUgPQogICAgICAgICAgd3JhcEZ1dHVyZVR5cGUodW5mdXR1cmVkRXhwZWN0ZWRUeXBlLCBsaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgaWYgKGlzQXNzaWduYWJsZSh1bmZ1dHVyZWRFeHBlY3RlZFR5cGUsIGV4cHJlc3Npb25UeXBlKSkgewogICAgICAgIGNvbnRleHRUeXBlID0gdW5mdXR1cmVkRXhwZWN0ZWRUeXBlOwogICAgICB9IGVsc2UgaWYgKGlzQXNzaWduYWJsZShmdXR1cmVkRXhwZWN0ZWRUeXBlLCBleHByZXNzaW9uVHlwZSkpIHsKICAgICAgICBjb250ZXh0VHlwZSA9IGZ1dHVyZWRFeHBlY3RlZFR5cGU7CiAgICAgIH0KICAgIH0KCiAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlLCBEYXJ0VHlwZSwgYm9vbCk+CiAgICAgICAgcHJlY2lzZVR5cGVFcnJvclRlbXBsYXRlID0gX2dldFByZWNpc2VUeXBlRXJyb3JUZW1wbGF0ZShleHByZXNzaW9uKTsKICAgIEFzc2lnbmFiaWxpdHlLaW5kIGtpbmQgPSBfY29tcHV0ZUFzc2lnbmFiaWxpdHlLaW5kKAogICAgICAgIGNvbnRleHRUeXBlLCBleHByZXNzaW9uVHlwZSwKICAgICAgICBpc1N0cm9uZ051bGxhYmlsaXR5TW9kZToKICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJiBwZXJmb3JtTm5iZENoZWNrcyAmJiBubmJkU3Ryb25nTW9kZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpc1ZvaWRBbGxvd2VkLAogICAgICAgIGlzRXhwcmVzc2lvblR5cGVQcmVjaXNlOiBwcmVjaXNlVHlwZUVycm9yVGVtcGxhdGUgIT0gbnVsbCk7CgogICAgRXhwcmVzc2lvbiByZXN1bHQ7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBBc3NpZ25hYmlsaXR5S2luZC5hc3NpZ25hYmxlOgogICAgICAgIHJlc3VsdCA9IGV4cHJlc3Npb247CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZUNhc3Q6CiAgICAgICAgLy8gSW5zZXJ0IGFuIGltcGxpY2l0IGRvd25jYXN0LgogICAgICAgIHJlc3VsdCA9IG5ldyBBc0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgaW5pdGlhbENvbnRleHRUeXBlKQogICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgIC4uaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAgIC4uaXNGb3JEeW5hbWljID0gZXhwcmVzc2lvblR5cGUgaXMgRHluYW1pY1R5cGUKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZVRlYXJvZmY6CiAgICAgICAgcmVzdWx0ID0gX3RlYXJPZmZDYWxsKGV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCBmaWxlT2Zmc2V0KS50ZWFyb2ZmOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEFzc2lnbmFiaWxpdHlLaW5kLmFzc2lnbmFibGVUZWFyb2ZmQ2FzdDoKICAgICAgICByZXN1bHQgPSBuZXcgQXNFeHByZXNzaW9uKAogICAgICAgICAgICBfdGVhck9mZkNhbGwoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIGZpbGVPZmZzZXQpLnRlYXJvZmYsCiAgICAgICAgICAgIGluaXRpYWxDb250ZXh0VHlwZSkKICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSBpc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZToKICAgICAgICAvLyBFcnJvcjogbm90IGFzc2lnbmFibGUuICBQZXJmb3JtIGVycm9yIHJlY292ZXJ5LgogICAgICAgIHJlc3VsdCA9IF93cmFwVW5hc3NpZ25hYmxlRXhwcmVzc2lvbigKICAgICAgICAgICAgZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIGNvbnRleHRUeXBlLCBlcnJvclRlbXBsYXRlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVWb2lkOgogICAgICAgIC8vIEVycm9yOiBub3QgYXNzaWduYWJsZS4gIFBlcmZvcm0gZXJyb3IgcmVjb3ZlcnkuCiAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgaGVscGVyLndyYXBJblByb2JsZW0oZXhwcmVzc2lvbiwgbWVzc2FnZVZvaWRFeHByZXNzaW9uLCBub0xlbmd0aCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlUHJlY2lzZToKICAgICAgICAvLyBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biBwcmVjaXNlbHksIHNvIGFuIGltcGxpY2l0CiAgICAgICAgLy8gZG93bmNhc3QgaXMgZ3VhcmFudGVlZCB0byBmYWlsLiAgSW5zZXJ0IGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgICAgIHJlc3VsdCA9IGhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgICBleHByZXNzaW9uLAogICAgICAgICAgICBwcmVjaXNlVHlwZUVycm9yVGVtcGxhdGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlLCBjb250ZXh0VHlwZSwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVUZWFyb2ZmOgogICAgICAgIFR5cGVkVGVhcm9mZiB0eXBlZFRlYXJvZmYgPQogICAgICAgICAgICBfdGVhck9mZkNhbGwoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIGZpbGVPZmZzZXQpOwogICAgICAgIHJlc3VsdCA9IF93cmFwVW5hc3NpZ25hYmxlRXhwcmVzc2lvbih0eXBlZFRlYXJvZmYudGVhcm9mZiwKICAgICAgICAgICAgdHlwZWRUZWFyb2ZmLnRlYXJvZmZUeXBlLCBjb250ZXh0VHlwZSwgZXJyb3JUZW1wbGF0ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlQ2FudFRlYXJvZmY6CiAgICAgICAgLy8gVGhlIGZpcnN0IGNhbGwgdG8gX2NvbXB1dGVBc3NpZ25hYmlsaXR5S2luZCBpcyBkb25lIGZvciB0aGUgcHVycG9zZQogICAgICAgIC8vIG9mIGNvZGUgZ2VuZXJhdGlvbiwgYW5kIHRoZSBpbmFiaWxpdHkgdG8gdGVhciBvZmYgZnJvbSBhCiAgICAgICAgLy8gcG90ZW50aWFsbHkgbnVsbGFibGUgcmVjZWl2ZXIgc2hvdWxkbid0IGFyaXNlIGFzIGFuIGlzc3VlIGluIGFueQogICAgICAgIC8vIG1vZGUgb3RoZXIgdGhhbiB0aGUgc3Ryb25nIG1vZGUuCiAgICAgICAgYXNzZXJ0KGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgcGVyZm9ybU5uYmRDaGVja3MgJiYgbm5iZFN0cm9uZ01vZGUpOwoKICAgICAgICByZXN1bHQgPSBfd3JhcFRlYXJvZmZFcnJvckV4cHJlc3Npb24oCiAgICAgICAgICAgIGV4cHJlc3Npb24sIGNvbnRleHRUeXBlLCB0ZW1wbGF0ZU51bGxhYmxlVGVhcm9mZkVycm9yKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gdW5oYW5kbGVkKCIke2tpbmR9IiwgImVuc3VyZUFzc2lnbmFibGUiLCBmaWxlT2Zmc2V0LCBoZWxwZXIudXJpKTsKICAgIH0KCiAgICAvLyBSZXBvcnQgd2FybmluZ3MgaW4gd2VhayBtb2RlLgogICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgcGVyZm9ybU5uYmRDaGVja3MgJiYgIW5uYmRTdHJvbmdNb2RlKSB7CiAgICAgIEFzc2lnbmFiaWxpdHlLaW5kIHdlYWtLaW5kID0gX2NvbXB1dGVBc3NpZ25hYmlsaXR5S2luZCgKICAgICAgICAgIGNvbnRleHRUeXBlLCBleHByZXNzaW9uVHlwZSwKICAgICAgICAgIGlzU3Ryb25nTnVsbGFiaWxpdHlNb2RlOiB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogaXNWb2lkQWxsb3dlZCwKICAgICAgICAgIGlzRXhwcmVzc2lvblR5cGVQcmVjaXNlOiBwcmVjaXNlVHlwZUVycm9yVGVtcGxhdGUgIT0gbnVsbCk7CiAgICAgIHN3aXRjaCAod2Vha0tpbmQpIHsKICAgICAgICBjYXNlIEFzc2lnbmFiaWxpdHlLaW5kLmFzc2lnbmFibGU6CiAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGFuIGVycm9yIHdvdWxkbid0IGJlIHJlcG9ydGVkIGluIHRoZSBzdHJvbmcgbW9kZS4KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZUNhc3Q6CiAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGFuIGVycm9yIHdvdWxkbid0IGJlIHJlcG9ydGVkIGluIHRoZSBzdHJvbmcgbW9kZS4KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZVRlYXJvZmY6CiAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGFuIGVycm9yIHdvdWxkbid0IGJlIHJlcG9ydGVkIGluIHRoZSBzdHJvbmcgbW9kZS4KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZVRlYXJvZmZDYXN0OgogICAgICAgICAgLy8gRG8gbm90aGluZyBpZiBhbiBlcnJvciB3b3VsZG4ndCBiZSByZXBvcnRlZCBpbiB0aGUgc3Ryb25nIG1vZGUuCiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZToKICAgICAgICAgIC8vIERvbid0IHJlcG9ydCB0aGUgc2FtZSBwcm9ibGVtIHR3aWNlLgogICAgICAgICAgaWYgKGtpbmQgPT0gQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlKSBicmVhazsKICAgICAgICAgIGlmIChjb250ZXh0VHlwZSBpcyEgSW52YWxpZFR5cGUgJiYgZXhwcmVzc2lvblR5cGUgaXMhIEludmFsaWRUeXBlKSB7CiAgICAgICAgICAgIGhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgKHdhcm5pbmdUZW1wbGF0ZSA/PyB0ZW1wbGF0ZUludmFsaWRBc3NpZ25tZW50V2FybmluZykKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvblR5cGUsIGNvbnRleHRUeXBlLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZVZvaWQ6CiAgICAgICAgICAvLyBUaGUgTk5CRCBmZWF0dXJlIGNhbid0IGNhdXNlIHRoaXMgY2FzZS4uCiAgICAgICAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgICAgICAgICIke2tpbmR9IiwgImVuc3VyZUFzc2lnbmFibGU6d2VhayIsIGZpbGVPZmZzZXQsIGhlbHBlci51cmkpOwogICAgICAgIGNhc2UgQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlUHJlY2lzZToKICAgICAgICAgIC8vIFRoZSBOTkJEIGZlYXR1cmUgY2FuJ3QgY2F1c2UgdGhpcyBjYXNlLi4KICAgICAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICAgICAgIiR7a2luZH0iLCAiZW5zdXJlQXNzaWduYWJsZTp3ZWFrIiwgZmlsZU9mZnNldCwgaGVscGVyLnVyaSk7CiAgICAgICAgY2FzZSBBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVUZWFyb2ZmOgogICAgICAgICAgLy8gRG9uJ3QgcmVwb3J0IHRoZSBzYW1lIHByb2JsZW0gdHdpY2UuCiAgICAgICAgICBpZiAoa2luZCA9PSBBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVUZWFyb2ZmKSBicmVhazsKCiAgICAgICAgICAvLyBUaGUgZmlyc3QgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHNob3VsZCBoYXZlIGhhcHBlbmVkIGluIHRoZSBzdHJvbmcKICAgICAgICAgIC8vIG1vZGUuCiAgICAgICAgICBhc3NlcnQoIW5uYmRTdHJvbmdNb2RlKTsKCiAgICAgICAgICBpZiAoY29udGV4dFR5cGUgaXMhIEludmFsaWRUeXBlICYmIGV4cHJlc3Npb25UeXBlIGlzISBJbnZhbGlkVHlwZSkgewogICAgICAgICAgICBUeXBlZFRlYXJvZmYgdHlwZWRUZWFyb2ZmID0KICAgICAgICAgICAgICAgIF90ZWFyT2ZmQ2FsbChleHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSwgZmlsZU9mZnNldCk7CiAgICAgICAgICAgIGhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgKHdhcm5pbmdUZW1wbGF0ZSA/PyB0ZW1wbGF0ZUludmFsaWRBc3NpZ25tZW50V2FybmluZykKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh0eXBlZFRlYXJvZmYudGVhcm9mZlR5cGUsIGNvbnRleHRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZUNhbnRUZWFyb2ZmOgogICAgICAgICAgLy8gRG9uJ3QgcmVwb3J0IHRoZSBzYW1lIHByb2JsZW0gdHdpY2UuCiAgICAgICAgICBpZiAoa2luZCA9PSBBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVDYW50VGVhcm9mZikgYnJlYWs7CgogICAgICAgICAgLy8gVGhlIGZpcnN0IGhhbmRsaW5nIG9mIHRoZSBlcnJvciBzaG91bGQgaGF2ZSBoYXBwZW5lZCBpbiB0aGUgc3Ryb25nCiAgICAgICAgICAvLyBtb2RlLgogICAgICAgICAgYXNzZXJ0KCFubmJkU3Ryb25nTW9kZSk7CgogICAgICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgcGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgICAgICAgcmVzdWx0ID0gX3dyYXBUZWFyb2ZmRXJyb3JFeHByZXNzaW9uKAogICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgY29udGV4dFR5cGUsIHRlbXBsYXRlTnVsbGFibGVUZWFyb2ZmV2FybmluZyk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICAgICAiJHtraW5kfSIsICJlbnN1cmVBc3NpZ25hYmxlOndlYWsiLCBmaWxlT2Zmc2V0LCBoZWxwZXIudXJpKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFeHByZXNzaW9uIF93cmFwVGVhcm9mZkVycm9yRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIERhcnRUeXBlIGNvbnRleHRUeXBlLCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyk+IHRlbXBsYXRlKSB7CiAgICBhc3NlcnQodGVtcGxhdGUgIT0gbnVsbCk7CiAgICBFeHByZXNzaW9uIGVycm9yTm9kZSA9IG5ldyBBc0V4cHJlc3Npb24oCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAvLyBUT0RPKGFoZSk6IFRoZSBvdXRsaW5lIHBoYXNlIGRvZXNuJ3QgY29ycmVjdGx5IHJlbW92ZSBpbnZhbGlkCiAgICAgICAgLy8gdXNlcyBvZiB0eXBlIHZhcmlhYmxlcywgZm9yIGV4YW1wbGUsIG9uIHN0YXRpYyBtZW1iZXJzLiBPbmNlCiAgICAgICAgLy8gdGhhdCBoYXMgYmVlbiBmaXhlZCwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHVzZQogICAgICAgIC8vIFtjb250ZXh0VHlwZV0gZGlyZWN0bHkgaGVyZS4KICAgICAgICBoYXNBbnlUeXBlVmFyaWFibGVzKGNvbnRleHRUeXBlKSA/IGNvbnN0IEJvdHRvbVR5cGUoKSA6IGNvbnRleHRUeXBlKQogICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAuLmZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICBpZiAoY29udGV4dFR5cGUgaXMhIEludmFsaWRUeXBlKSB7CiAgICAgIGVycm9yTm9kZSA9IGhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgZXJyb3JOb2RlLCB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKGNhbGxOYW1lLm5hbWUpLCBub0xlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gZXJyb3JOb2RlOwogIH0KCiAgRXhwcmVzc2lvbiBfd3JhcFVuYXNzaWduYWJsZUV4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUsCiAgICAgIERhcnRUeXBlIGNvbnRleHRUeXBlLAogICAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlLCBEYXJ0VHlwZSwgYm9vbCk+IHRlbXBsYXRlKSB7CiAgICBFeHByZXNzaW9uIGVycm9yTm9kZSA9IG5ldyBBc0V4cHJlc3Npb24oCiAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAvLyBUT0RPKGFoZSk6IFRoZSBvdXRsaW5lIHBoYXNlIGRvZXNuJ3QgY29ycmVjdGx5IHJlbW92ZSBpbnZhbGlkCiAgICAgICAgLy8gdXNlcyBvZiB0eXBlIHZhcmlhYmxlcywgZm9yIGV4YW1wbGUsIG9uIHN0YXRpYyBtZW1iZXJzLiBPbmNlCiAgICAgICAgLy8gdGhhdCBoYXMgYmVlbiBmaXhlZCwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHVzZQogICAgICAgIC8vIFtjb250ZXh0VHlwZV0gZGlyZWN0bHkgaGVyZS4KICAgICAgICBoYXNBbnlUeXBlVmFyaWFibGVzKGNvbnRleHRUeXBlKSA/IGNvbnN0IEJvdHRvbVR5cGUoKSA6IGNvbnRleHRUeXBlKQogICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSBpc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgIC4uZmlsZU9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgIGlmIChjb250ZXh0VHlwZSBpcyEgSW52YWxpZFR5cGUgJiYgZXhwcmVzc2lvblR5cGUgaXMhIEludmFsaWRUeXBlKSB7CiAgICAgIGVycm9yTm9kZSA9IGhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgZXJyb3JOb2RlLAogICAgICAgICAgKHRlbXBsYXRlID8/IHRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnRFcnJvcikud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICBleHByZXNzaW9uVHlwZSwgY29udGV4dFR5cGUsIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQogICAgcmV0dXJuIGVycm9yTm9kZTsKICB9CgogIFR5cGVkVGVhcm9mZiBfdGVhck9mZkNhbGwoCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSW50ZXJmYWNlVHlwZSBleHByZXNzaW9uVHlwZSwgaW50IGZpbGVPZmZzZXQpIHsKICAgIENsYXNzIGNsYXNzTm9kZSA9IGV4cHJlc3Npb25UeXBlLmNsYXNzTm9kZTsKICAgIE1lbWJlciBjYWxsTWVtYmVyID0gY2xhc3NIaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKGNsYXNzTm9kZSwgY2FsbE5hbWUpOwogICAgYXNzZXJ0KGNhbGxNZW1iZXIgaXMgUHJvY2VkdXJlICYmIGNhbGxNZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCk7CgogICAgLy8gUmVwbGFjZSBleHByZXNzaW9uIHdpdGg6CiAgICAvLyBgbGV0IHQgPSBleHByZXNzaW9uIGluIHQgPT0gbnVsbCA/IG51bGwgOiB0LmNhbGxgCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHQgPQogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGV4cHJlc3Npb24sIHR5cGU6IGV4cHJlc3Npb25UeXBlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIEV4cHJlc3Npb24gbnVsbENoZWNrID0gbmV3IE1ldGhvZEludm9jYXRpb24obmV3IFZhcmlhYmxlR2V0KHQpLCBlcXVhbHNOYW1lLAogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W25ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldF0pKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgUHJvcGVydHlHZXQgdGVhck9mZiA9CiAgICAgICAgbmV3IFByb3BlcnR5R2V0KG5ldyBWYXJpYWJsZUdldCh0KSwgY2FsbE5hbWUsIGNhbGxNZW1iZXIpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgRGFydFR5cGUgdGVhcm9mZlR5cGUgPQogICAgICAgIGdldEdldHRlclR5cGVGb3JNZW1iZXJUYXJnZXQoY2FsbE1lbWJlciwgZXhwcmVzc2lvblR5cGUpCiAgICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoZXhwcmVzc2lvblR5cGUubnVsbGFiaWxpdHkpOwogICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihudWxsQ2hlY2ssCiAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LCB0ZWFyT2ZmLCB0ZWFyb2ZmVHlwZSk7CiAgICByZXR1cm4gbmV3IFR5cGVkVGVhcm9mZigKICAgICAgICB0ZWFyb2ZmVHlwZSwgbmV3IExldCh0LCBjb25kaXRpb25hbCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgYXNzaWduYWJpbGl0eSBraW5kIG9mIFtleHByZXNzaW9uVHlwZV0gdG8gW2NvbnRleHRUeXBlXS4KICAvLy8KICAvLy8gVGhlIGNvbXB1dGF0aW9uIGlzIHNpZGUtZWZmZWN0IGZyZWUuCiAgQXNzaWduYWJpbGl0eUtpbmQgX2NvbXB1dGVBc3NpZ25hYmlsaXR5S2luZCgKICAgICAgRGFydFR5cGUgY29udGV4dFR5cGUsIERhcnRUeXBlIGV4cHJlc3Npb25UeXBlLAogICAgICB7Ym9vbCBpc1N0cm9uZ051bGxhYmlsaXR5TW9kZSwKICAgICAgYm9vbCBpc1ZvaWRBbGxvd2VkLAogICAgICBib29sIGlzRXhwcmVzc2lvblR5cGVQcmVjaXNlfSkgewogICAgYXNzZXJ0KGlzU3Ryb25nTnVsbGFiaWxpdHlNb2RlICE9IG51bGwpOwogICAgYXNzZXJ0KGlzVm9pZEFsbG93ZWQgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNFeHByZXNzaW9uVHlwZVByZWNpc2UgIT0gbnVsbCk7CgogICAgLy8gSWYgYW4gaW50ZXJmYWNlIHR5cGUgaXMgYmVpbmcgYXNzaWduZWQgdG8gYSBmdW5jdGlvbiB0eXBlLCBzZWUgaWYgd2UKICAgIC8vIHNob3VsZCB0ZWFyIG9mZiBgLmNhbGxgLgogICAgLy8gVE9ETyhwYXVsYmVycnkpOiB1c2UgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIuICBTZWUgZmluZEludGVyZmFjZU1lbWJlci4KICAgIGJvb2wgbmVlZHNUZWFyb2ZmID0gZmFsc2U7CiAgICBpZiAoZXhwcmVzc2lvblR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBDbGFzcyBjbGFzc05vZGUgPSAoZXhwcmVzc2lvblR5cGUgYXMgSW50ZXJmYWNlVHlwZSkuY2xhc3NOb2RlOwogICAgICBNZW1iZXIgY2FsbE1lbWJlciA9CiAgICAgICAgICBjbGFzc0hpZXJhcmNoeS5nZXRJbnRlcmZhY2VNZW1iZXIoY2xhc3NOb2RlLCBjYWxsTmFtZSk7CiAgICAgIGlmIChjYWxsTWVtYmVyIGlzIFByb2NlZHVyZSAmJiBjYWxsTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICBpZiAoX3Nob3VsZFRlYXJPZmZDYWxsKGNvbnRleHRUeXBlLCBleHByZXNzaW9uVHlwZSkpIHsKICAgICAgICAgIG5lZWRzVGVhcm9mZiA9IHRydWU7CiAgICAgICAgICBpZiAoaXNTdHJvbmdOdWxsYWJpbGl0eU1vZGUgJiYgZXhwcmVzc2lvblR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAgICAgICAgIHJldHVybiBBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVDYW50VGVhcm9mZjsKICAgICAgICAgIH0KICAgICAgICAgIGV4cHJlc3Npb25UeXBlID0KICAgICAgICAgICAgICBnZXRHZXR0ZXJUeXBlRm9yTWVtYmVyVGFyZ2V0KGNhbGxNZW1iZXIsIGV4cHJlc3Npb25UeXBlKQogICAgICAgICAgICAgICAgICAud2l0aE51bGxhYmlsaXR5KGV4cHJlc3Npb25UeXBlLm51bGxhYmlsaXR5KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZXhwcmVzc2lvblR5cGUgaXMgVm9pZFR5cGUgJiYgIWlzVm9pZEFsbG93ZWQpIHsKICAgICAgcmV0dXJuIEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZVZvaWQ7CiAgICB9CgogICAgewogICAgICBJc1N1YnR5cGVPZiByZXN1bHQgPSB0eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgIC5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhleHByZXNzaW9uVHlwZSwgY29udGV4dFR5cGUpOwogICAgICBib29sIGlzRGlyZWN0bHlBc3NpZ25hYmxlID0gaXNTdHJvbmdOdWxsYWJpbGl0eU1vZGUKICAgICAgICAgID8gcmVzdWx0LmlzU3VidHlwZVdoZW5Vc2luZ051bGxhYmlsaXRpZXMoKQogICAgICAgICAgOiByZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpOwogICAgICBpZiAoaXNEaXJlY3RseUFzc2lnbmFibGUpIHsKICAgICAgICByZXR1cm4gbmVlZHNUZWFyb2ZmCiAgICAgICAgICAgID8gQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZVRlYXJvZmYKICAgICAgICAgICAgOiBBc3NpZ25hYmlsaXR5S2luZC5hc3NpZ25hYmxlOwogICAgICB9CiAgICB9CgogICAgYm9vbCBpc0luZGlyZWN0bHlBc3NpZ25hYmxlID0gaXNTdHJvbmdOdWxsYWJpbGl0eU1vZGUKICAgICAgICA/IGV4cHJlc3Npb25UeXBlIGlzIER5bmFtaWNUeXBlCiAgICAgICAgOiB0eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKGNvbnRleHRUeXBlLCBleHByZXNzaW9uVHlwZSkKICAgICAgICAgICAgLmlzU3VidHlwZVdoZW5JZ25vcmluZ051bGxhYmlsaXRpZXMoKTsKICAgIGlmICghaXNJbmRpcmVjdGx5QXNzaWduYWJsZSkgewogICAgICByZXR1cm4gbmVlZHNUZWFyb2ZmCiAgICAgICAgICA/IEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZVRlYXJvZmYKICAgICAgICAgIDogQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlOwogICAgfQogICAgaWYgKGlzRXhwcmVzc2lvblR5cGVQcmVjaXNlKSB7CiAgICAgIC8vIFRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGlzIGtub3duIHByZWNpc2VseSwgc28gYW4gaW1wbGljaXQKICAgICAgLy8gZG93bmNhc3QgaXMgZ3VhcmFudGVlZCB0byBmYWlsLiAgSW5zZXJ0IGEgY29tcGlsZS10aW1lIGVycm9yLgogICAgICByZXR1cm4gQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlUHJlY2lzZTsKICAgIH0KICAgIC8vIEluc2VydCBhbiBpbXBsaWNpdCBkb3duY2FzdC4KICAgIHJldHVybiBuZWVkc1RlYXJvZmYKICAgICAgICA/IEFzc2lnbmFiaWxpdHlLaW5kLmFzc2lnbmFibGVUZWFyb2ZmQ2FzdAogICAgICAgIDogQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZUNhc3Q7CiAgfQoKICBib29sIGlzTnVsbChEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5udWxsQ2xhc3M7CiAgfQoKICAvLy8gQ29tcHV0ZXMgdGhlIHR5cGUgYXJndW1lbnRzIGZvciBhbiBhY2Nlc3MgdG8gYW4gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlcgogIC8vLyBvbiBbZXh0ZW5zaW9uXSB3aXRoIHRoZSBzdGF0aWMgW3JlY2VpdmVyVHlwZV0uIElmIFtleHBsaWNpdFR5cGVBcmd1bWVudHNdCiAgLy8vIGFyZSBwcm92aWRlZCwgdGhlc2UgYXJlIHJldHVybmVkLCBvdGhlcndpc2UgdHlwZSBhcmd1bWVudHMgYXJlIGluZmVycmVkCiAgLy8vIHVzaW5nIFtyZWNlaXZlclR5cGVdLgogIExpc3Q8RGFydFR5cGU+IGNvbXB1dGVFeHRlbnNpb25UeXBlQXJndW1lbnQoRXh0ZW5zaW9uIGV4dGVuc2lvbiwKICAgICAgTGlzdDxEYXJ0VHlwZT4gZXhwbGljaXRUeXBlQXJndW1lbnRzLCBEYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIGlmIChleHBsaWNpdFR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhc3NlcnQoZXhwbGljaXRUeXBlQXJndW1lbnRzLmxlbmd0aCA9PSBleHRlbnNpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoKTsKICAgICAgcmV0dXJuIGV4cGxpY2l0VHlwZUFyZ3VtZW50czsKICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KGV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9PSBudWxsKTsKICAgICAgcmV0dXJuIGNvbnN0IDxEYXJ0VHlwZT5bXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbmZlckV4dGVuc2lvblR5cGVBcmd1bWVudHMoZXh0ZW5zaW9uLCByZWNlaXZlclR5cGUpOwogICAgfQogIH0KCiAgLy8vIEluZmVycyB0aGUgdHlwZSBhcmd1bWVudHMgZm9yIGFuIGFjY2VzcyB0byBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWVtYmVyCiAgLy8vIG9uIFtleHRlbnNpb25dIHdpdGggdGhlIHN0YXRpYyBbcmVjZWl2ZXJUeXBlXS4KICBMaXN0PERhcnRUeXBlPiBpbmZlckV4dGVuc2lvblR5cGVBcmd1bWVudHMoCiAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24sIERhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGV4dGVuc2lvbi50eXBlUGFyYW1ldGVyczsKICAgIERhcnRUeXBlIG9uVHlwZSA9IGV4dGVuc2lvbi5vblR5cGU7CiAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICB0eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUobnVsbCwgdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgW29uVHlwZV0sIFtyZWNlaXZlclR5cGVdLCBudWxsLCBpbmZlcnJlZFR5cGVzLCBsaWJyYXJ5LmxpYnJhcnkpOwogICAgcmV0dXJuIGluZmVycmVkVHlwZXM7CiAgfQoKICAvLy8gRmluZHMgYSBtZW1iZXIgb2YgW3JlY2VpdmVyVHlwZV0gY2FsbGVkIFtuYW1lXSwgYW5kIGlmIGl0IGlzIGZvdW5kLAogIC8vLyByZXBvcnRzIGl0IHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uIHVzaW5nIFtmaWxlT2Zmc2V0XS4KICAvLy8KICAvLy8gRm9yIHRoZSBjYXNlIHdoZXJlIFtyZWNlaXZlclR5cGVdIGlzIGEgW0Z1bmN0aW9uVHlwZV0sIGFuZCB0aGUgbmFtZQogIC8vLyBpcyBgY2FsbGAsIHRoZSBzdHJpbmcgJ2NhbGwnIGlzIHJldHVybmVkIGFzIGEgc2VudGluZWwgb2JqZWN0LgogIC8vLwogIC8vLyBGb3IgdGhlIGNhc2Ugd2hlcmUgW3JlY2VpdmVyVHlwZV0gaXMgYGR5bmFtaWNgLCBhbmQgdGhlIG5hbWUgaXMgZGVjbGFyZWQKICAvLy8gaW4gT2JqZWN0LCB0aGUgbWVtYmVyIGZyb20gT2JqZWN0IGlzIHJldHVybmVkIHRob3VnaCB0aGUgY2FsbCBtYXkgbm90IGVuZAogIC8vLyB1cCB0YXJnZXRpbmcgaXQgaWYgdGhlIGFyZ3VtZW50cyBkbyBub3QgbWF0Y2ggKHRoZSBiYXNpYyBwcmluY2lwbGUgaXMgdGhhdAogIC8vLyB0aGUgT2JqZWN0IG1lbWJlciBpcyB1c2VkIGZvciBpbmZlcnJpbmcgdHlwZXMgb25seSBpZiBub1N1Y2hNZXRob2QgY2Fubm90CiAgLy8vIGJlIHRhcmdldGVkIGR1ZSB0bywgZS5nLiwgYW4gaW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50KS4KICBPYmplY3RBY2Nlc3NUYXJnZXQgZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBOYW1lIG5hbWUsIGludCBmaWxlT2Zmc2V0LAogICAgICB7Ym9vbCBzZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGluc3RydW1lbnRlZDogdHJ1ZSwKICAgICAgYm9vbCBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogZmFsc2V9KSB7CiAgICBhc3NlcnQocmVjZWl2ZXJUeXBlICE9IG51bGwgJiYgaXNLbm93bihyZWNlaXZlclR5cGUpKTsKCiAgICByZWNlaXZlclR5cGUgPSByZXNvbHZlVHlwZVBhcmFtZXRlcihyZWNlaXZlclR5cGUpOwoKICAgIGlmIChyZWNlaXZlclR5cGUgaXMgRnVuY3Rpb25UeXBlICYmIG5hbWUgPT0gY2FsbE5hbWUpIHsKICAgICAgcmV0dXJuIGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5jYWxsRnVuY3Rpb24oKTsKICAgIH0KCiAgICBDbGFzcyBjbGFzc05vZGUgPSByZWNlaXZlclR5cGUgaXMgSW50ZXJmYWNlVHlwZQogICAgICAgID8gcmVjZWl2ZXJUeXBlLmNsYXNzTm9kZQogICAgICAgIDogY29yZVR5cGVzLm9iamVjdENsYXNzOwogICAgTWVtYmVyIGludGVyZmFjZU1lbWJlciA9CiAgICAgICAgX2dldEludGVyZmFjZU1lbWJlcihjbGFzc05vZGUsIG5hbWUsIHNldHRlciwgZmlsZU9mZnNldCk7CiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0OwogICAgaWYgKGludGVyZmFjZU1lbWJlciAhPSBudWxsKSB7CiAgICAgIHRhcmdldCA9IG5ldyBPYmplY3RBY2Nlc3NUYXJnZXQuaW50ZXJmYWNlTWVtYmVyKGludGVyZmFjZU1lbWJlcik7CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyVHlwZSBpcyBEeW5hbWljVHlwZSkgewogICAgICB0YXJnZXQgPSBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQuZHluYW1pYygpOwogICAgfSBlbHNlIGlmIChyZWNlaXZlclR5cGUgaXMgTmV2ZXJUeXBlKSB7CiAgICAgIHN3aXRjaCAocmVjZWl2ZXJUeXBlLm51bGxhYmlsaXR5KSB7CiAgICAgICAgY2FzZSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZToKICAgICAgICAgIHRhcmdldCA9IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5uZXZlcigpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOdWxsYWJpbGl0eS5udWxsYWJsZToKICAgICAgICBjYXNlIE51bGxhYmlsaXR5LmxlZ2FjeToKICAgICAgICAgIC8vIE5ldmVyPyBhbmQgTmV2ZXIqIGFyZSBlcXVpdmFsZW50IHRvIE51bGwuCiAgICAgICAgICByZXR1cm4gZmluZEludGVyZmFjZU1lbWJlcihjb3JlVHlwZXMubnVsbFR5cGUsIG5hbWUsIGZpbGVPZmZzZXQpOwogICAgICAgIGNhc2UgTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkOgogICAgICAgICAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkTnVsbGFiaWxpdHkud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgIiR7cmVjZWl2ZXJUeXBlLm51bGxhYmlsaXR5fSIsCiAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICBsaWJyYXJ5LmZpbGVVcmkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyVHlwZSBpcyBJbnZhbGlkVHlwZSkgewogICAgICB0YXJnZXQgPSBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQuaW52YWxpZCgpOwogICAgfSBlbHNlIGlmIChyZWNlaXZlclR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHJlY2VpdmVyVHlwZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MgJiYKICAgICAgICBuYW1lID09IGNhbGxOYW1lKSB7CiAgICAgIHRhcmdldCA9IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5jYWxsRnVuY3Rpb24oKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldCA9IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5taXNzaW5nKCk7CiAgICB9CiAgICBpZiAoaW5zdHJ1bWVudGVkICYmCiAgICAgICAgcmVjZWl2ZXJUeXBlICE9IGNvbnN0IER5bmFtaWNUeXBlKCkgJiYKICAgICAgICB0YXJnZXQuaXNJbnN0YW5jZU1lbWJlcikgewogICAgICBpbnN0cnVtZW50YXRpb24/LnJlY29yZCh1cmlGb3JJbnN0cnVtZW50YXRpb24sIGZpbGVPZmZzZXQsICd0YXJnZXQnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKHRhcmdldC5tZW1iZXIpKTsKICAgIH0KCiAgICBpZiAodGFyZ2V0LmlzVW5yZXNvbHZlZCAmJgogICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kcykgewogICAgICBOYW1lIG90aGVyTmFtZSA9IG5hbWU7CiAgICAgIGJvb2wgb3RoZXJJc1NldHRlcjsKICAgICAgaWYgKG5hbWUgPT0gaW5kZXhHZXROYW1lKSB7CiAgICAgICAgLy8gW10gbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgW109LgogICAgICAgIG90aGVyTmFtZSA9IGluZGV4U2V0TmFtZTsKICAgICAgICBvdGhlcklzU2V0dGVyID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBpbmRleFNldE5hbWUpIHsKICAgICAgICAvLyBbXT0gbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgW10uCiAgICAgICAgb3RoZXJOYW1lID0gaW5kZXhHZXROYW1lOwogICAgICAgIG90aGVySXNTZXR0ZXIgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdGhlck5hbWUgPSBuYW1lOwogICAgICAgIG90aGVySXNTZXR0ZXIgPSAhc2V0dGVyOwogICAgICB9CgogICAgICBNZW1iZXIgb3RoZXJNZW1iZXIgPQogICAgICAgICAgX2dldEludGVyZmFjZU1lbWJlcihjbGFzc05vZGUsIG90aGVyTmFtZSwgb3RoZXJJc1NldHRlciwgZmlsZU9mZnNldCk7CiAgICAgIGlmIChvdGhlck1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgLy8gSWYgd2UncmUgbG9va2luZyBmb3IgYGZvb2AgYW5kIGBmb289YCBjYW4gYmUgZm91bmQgb3IgdmljZS12ZXJzYSB0aGVuCiAgICAgICAgLy8gZXh0ZW5zaW9uIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBmb3VuZC4KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICBFeHRlbnNpb25BY2Nlc3NDYW5kaWRhdGUgYmVzdFNvRmFyOwogICAgICBMaXN0PEV4dGVuc2lvbkFjY2Vzc0NhbmRpZGF0ZT4gbm9uZU1vcmVTcGVjaWZpYyA9IFtdOwogICAgICBsaWJyYXJ5LmZvckVhY2hFeHRlbnNpb25JblNjb3BlKChFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXIpIHsKICAgICAgICBNZW1iZXJCdWlsZGVyIHRoaXNCdWlsZGVyID0KICAgICAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci5sb29rdXBMb2NhbE1lbWJlckJ5TmFtZShuYW1lLCBzZXR0ZXI6IHNldHRlcik7CiAgICAgICAgTWVtYmVyQnVpbGRlciBvdGhlckJ1aWxkZXIgPSBleHRlbnNpb25CdWlsZGVyCiAgICAgICAgICAgIC5sb29rdXBMb2NhbE1lbWJlckJ5TmFtZShvdGhlck5hbWUsIHNldHRlcjogb3RoZXJJc1NldHRlcik7CiAgICAgICAgaWYgKCh0aGlzQnVpbGRlciAhPSBudWxsICYmICF0aGlzQnVpbGRlci5pc1N0YXRpYykgfHwKICAgICAgICAgICAgKG90aGVyQnVpbGRlciAhPSBudWxsICYmICFvdGhlckJ1aWxkZXIuaXNTdGF0aWMpKSB7CiAgICAgICAgICBEYXJ0VHlwZSBvblR5cGU7CiAgICAgICAgICBEYXJ0VHlwZSBvblR5cGVJbnN0YW50aWF0ZVRvQm91bmRzOwogICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlQXJndW1lbnRzOwogICAgICAgICAgaWYgKGV4dGVuc2lvbkJ1aWxkZXIuZXh0ZW5zaW9uLnR5cGVQYXJhbWV0ZXJzLmlzRW1wdHkpIHsKICAgICAgICAgICAgb25UeXBlSW5zdGFudGlhdGVUb0JvdW5kcyA9CiAgICAgICAgICAgICAgICBvblR5cGUgPSBleHRlbnNpb25CdWlsZGVyLmV4dGVuc2lvbi5vblR5cGU7CiAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxEYXJ0VHlwZT5bXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci5leHRlbnNpb24udHlwZVBhcmFtZXRlcnM7CiAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50cyA9IGluZmVyRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cygKICAgICAgICAgICAgICAgIGV4dGVuc2lvbkJ1aWxkZXIuZXh0ZW5zaW9uLCByZWNlaXZlclR5cGUpOwogICAgICAgICAgICBTdWJzdGl0dXRpb24gaW5mZXJyZWRTdWJzdGl0dXRpb24gPQogICAgICAgICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyh0eXBlUGFyYW1ldGVycywgaW5mZXJyZWRUeXBlQXJndW1lbnRzKTsKCiAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpbmRleF07CiAgICAgICAgICAgICAgRGFydFR5cGUgdHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlQXJndW1lbnRzW2luZGV4XTsKICAgICAgICAgICAgICBEYXJ0VHlwZSBib3VuZCA9CiAgICAgICAgICAgICAgICAgIGluZmVycmVkU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHR5cGVQYXJhbWV0ZXIuYm91bmQpOwogICAgICAgICAgICAgIGlmICghdHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKHR5cGVBcmd1bWVudCwgYm91bmQsCiAgICAgICAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvblR5cGUgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbgogICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKGV4dGVuc2lvbkJ1aWxkZXIuZXh0ZW5zaW9uLm9uVHlwZSk7CiAgICAgICAgICAgIExpc3Q8RGFydFR5cGU+IGluc3RhbnRpYXRlVG9Cb3VuZFR5cGVBcmd1bWVudHMgPQogICAgICAgICAgICAgICAgY2FsY3VsYXRlQm91bmRzKHR5cGVQYXJhbWV0ZXJzLCBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpOwogICAgICAgICAgICBTdWJzdGl0dXRpb24gaW5zdGFudGlhdGVUb0JvdW5kc1N1YnN0aXR1dGlvbiA9CiAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLCBpbnN0YW50aWF0ZVRvQm91bmRUeXBlQXJndW1lbnRzKTsKICAgICAgICAgICAgb25UeXBlSW5zdGFudGlhdGVUb0JvdW5kcyA9IGluc3RhbnRpYXRlVG9Cb3VuZHNTdWJzdGl0dXRpb24KICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShleHRlbnNpb25CdWlsZGVyLmV4dGVuc2lvbi5vblR5cGUpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmICh0eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCBvblR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgICBFeHRlbnNpb25BY2Nlc3NDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IEV4dGVuc2lvbkFjY2Vzc0NhbmRpZGF0ZSgKICAgICAgICAgICAgICAgIG9uVHlwZSwKICAgICAgICAgICAgICAgIG9uVHlwZUluc3RhbnRpYXRlVG9Cb3VuZHMsCiAgICAgICAgICAgICAgICB0aGlzQnVpbGRlciAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzQnVpbGRlci5pc0ZpZWxkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzQnVpbGRlci5pc1N0YXRpYwogICAgICAgICAgICAgICAgICAgID8gbmV3IE9iamVjdEFjY2Vzc1RhcmdldC5leHRlbnNpb25NZW1iZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzQnVpbGRlci53cml0ZVRhcmdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzQnVpbGRlci5pbnZva2VUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNCdWlsZGVyLnJlYWRUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNCdWlsZGVyLmtpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgICAgICAgICA6IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5taXNzaW5nKCksCiAgICAgICAgICAgICAgICBpc1BsYXRmb3JtOgogICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkJ1aWxkZXIubGlicmFyeS5pbXBvcnRVcmkuc2NoZW1lID09ICdkYXJ0Jyk7CiAgICAgICAgICAgIGlmIChub25lTW9yZVNwZWNpZmljLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgICBib29sIGlzTW9zdFNwZWNpZmljID0gdHJ1ZTsKICAgICAgICAgICAgICBmb3IgKEV4dGVuc2lvbkFjY2Vzc0NhbmRpZGF0ZSBvdGhlciBpbiBub25lTW9yZVNwZWNpZmljKSB7CiAgICAgICAgICAgICAgICBib29sIGlzTW9yZVNwZWNpZmljID0KICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUuaXNNb3JlU3BlY2lmaWNUaGFuKHR5cGVTY2hlbWFFbnZpcm9ubWVudCwgb3RoZXIpOwogICAgICAgICAgICAgICAgaWYgKGlzTW9yZVNwZWNpZmljICE9IHRydWUpIHsKICAgICAgICAgICAgICAgICAgaXNNb3N0U3BlY2lmaWMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChpc01vc3RTcGVjaWZpYykgewogICAgICAgICAgICAgICAgYmVzdFNvRmFyID0gY2FuZGlkYXRlOwogICAgICAgICAgICAgICAgbm9uZU1vcmVTcGVjaWZpYy5jbGVhcigpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub25lTW9yZVNwZWNpZmljLmFkZChjYW5kaWRhdGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChiZXN0U29GYXIgPT0gbnVsbCkgewogICAgICAgICAgICAgIGJlc3RTb0ZhciA9IGNhbmRpZGF0ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBib29sIGlzTW9yZVNwZWNpZmljID0gY2FuZGlkYXRlLmlzTW9yZVNwZWNpZmljVGhhbigKICAgICAgICAgICAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LCBiZXN0U29GYXIpOwogICAgICAgICAgICAgIGlmIChpc01vcmVTcGVjaWZpYyA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBiZXN0U29GYXIgPSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc01vcmVTcGVjaWZpYyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBub25lTW9yZVNwZWNpZmljLmFkZChiZXN0U29GYXIpOwogICAgICAgICAgICAgICAgbm9uZU1vcmVTcGVjaWZpYy5hZGQoY2FuZGlkYXRlKTsKICAgICAgICAgICAgICAgIGJlc3RTb0ZhciA9IG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKGJlc3RTb0ZhciAhPSBudWxsKSB7CiAgICAgICAgdGFyZ2V0ID0gYmVzdFNvRmFyLnRhcmdldDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBvcnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIG1vcmUgdGhhbgogICAgICAgIC8vIG9uZSBwb3RlbnRpYWwgdGFyZ2V0cyB3ZXJlIGZvdW5kLgogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgLy8vIFRydWUgaWYgW09iamVjdF0ncyBtZW1iZXIgY2FsbGVkIFtuYW1lXSBjYW4gYmUgY2FsbGVkIHdpdGggdGhlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gQ2hlY2tzIGZvciB0aGUgYXJpdHkgYW5kIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGFuZCB0ZWxscyBpZiBhbgogIC8vLyBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kIFtuYW1lXSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCBzdGF0aWMgdHlwZSBbT2JqZWN0XQogIC8vLyBkb2Vzbid0IGxlYWQgdG8gYSBjb21waWxlLXRpbWUgZXJyb3IuCiAgYm9vbCBtYXRjaGVzT2JqZWN0TWVtYmVyQ2FsbCgKICAgICAgTmFtZSBuYW1lLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PERhcnRUeXBlPiBwb3NpdGlvbmFsQXJndW1lbnRUeXBlcywKICAgICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkQXJndW1lbnRUeXBlcykgewogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgY29yZVR5cGVzLm9iamVjdE5vbk51bGxhYmxlUmF3VHlwZSwgbmFtZSwgLTEsCiAgICAgICAgaW5zdHJ1bWVudGVkOiBmYWxzZSk7CiAgICBpZiAodGFyZ2V0LmlzVW5yZXNvbHZlZCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG1hdGNoZXNNZW1iZXJDYWxsKHRhcmdldC5tZW1iZXIsIHR5cGVBcmd1bWVudHMgPz8gY29uc3QgW10sCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50VHlwZXMgPz8gY29uc3QgW10sIG5hbWVkQXJndW1lbnRUeXBlcyA/PyBjb25zdCBbXSk7CiAgfQoKICAvLy8gVHJ1ZSBpZiBbbWVtYmVyXSBjYW4gYmUgY2FsbGVkIHdpdGggdGhlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gQ2hlY2tzIGZvciB0aGUgYXJpdHkgYW5kIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGFuZCB0ZWxscyBpZiBhbgogIC8vLyBpbnZvY2F0aW9uIG9mIFttZW1iZXJdIGRvZXNuJ3QgbGVhZCB0byBhIGNvbXBpbGUtdGltZSBlcnJvci4KICBib29sIG1hdGNoZXNNZW1iZXJDYWxsKAogICAgICBNZW1iZXIgbWVtYmVyLAogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0PERhcnRUeXBlPiBwb3NpdGlvbmFsQXJndW1lbnRUeXBlcywKICAgICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkQXJndW1lbnRUeXBlcykgewogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gbWVtYmVyLmZ1bmN0aW9uOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9IGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyczsKICAgIGlmICh0eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gdHlwZUFyZ3VtZW50cy5sZW5ndGggfHwKICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggPCBwb3NpdGlvbmFsQXJndW1lbnRUeXBlcy5sZW5ndGggfHwKICAgICAgICBuYW1lZFBhcmFtZXRlcnMubGVuZ3RoIDwgbmFtZWRBcmd1bWVudFR5cGVzLmxlbmd0aCkgewogICAgICAvLyBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpc24ndCBjb21wYXRpYmxlLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gQXNzdW1lIHRoYXQgYm90aCBuYW1lZCBwYXJhbWV0ZXJzIGFuZCBuYW1lZCBhcmd1bWVudHMgYXJlIHNvcnRlZAogICAgLy8gbGV4aWNvZ3JhcGhpY2FsbHkuCiAgICBhc3NlcnQobmFtZWRQYXJhbWV0ZXJzLmlzRW1wdHkgfHwKICAgICAgICBuYW1lZFBhcmFtZXRlcnMuc2tpcCgxKS5mb2xkKAogICAgICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzWzBdLAogICAgICAgICAgICAgICAgKHAsIG4pID0+CiAgICAgICAgICAgICAgICAgICAgcCAhPSBudWxsICYmIHAubmFtZS5jb21wYXJlVG8obi5uYW1lKSA8PSAwID8gbiA6IG51bGwpICE9CiAgICAgICAgICAgIG51bGwpOwogICAgYXNzZXJ0KG5hbWVkQXJndW1lbnRUeXBlcy5pc0VtcHR5IHx8CiAgICAgICAgbmFtZWRBcmd1bWVudFR5cGVzLnNraXAoMSkuZm9sZCgKICAgICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRUeXBlc1swXSwKICAgICAgICAgICAgICAgIChwLCBuKSA9PgogICAgICAgICAgICAgICAgICAgIHAgIT0gbnVsbCAmJiBwLm5hbWUuY29tcGFyZVRvKG4ubmFtZSkgPD0gMCA/IG4gOiBudWxsKSAhPQogICAgICAgICAgICBudWxsKTsKCiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gdHlwZVBhcmFtZXRlcnMuaXNFbXB0eQogICAgICAgID8gU3Vic3RpdHV0aW9uLmVtcHR5CiAgICAgICAgOiBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKTsKCiAgICB7CiAgICAgIGludCBwYXJhbWV0ZXJJbmRleCA9IDA7CiAgICAgIGludCBhcmd1bWVudEluZGV4ID0gMDsKICAgICAgd2hpbGUgKHBhcmFtZXRlckluZGV4IDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAmJgogICAgICAgICAgYXJndW1lbnRJbmRleCA8IG5hbWVkQXJndW1lbnRUeXBlcy5sZW5ndGgpIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IG5hbWVkUGFyYW1ldGVyc1twYXJhbWV0ZXJJbmRleF07CiAgICAgICAgTmFtZWRUeXBlIGFyZ3VtZW50ID0gbmFtZWRBcmd1bWVudFR5cGVzW2FyZ3VtZW50SW5kZXhdOwogICAgICAgIGludCBjb21wYXJlUmVzdWx0ID0gcGFyYW1ldGVyLm5hbWUuY29tcGFyZVRvKGFyZ3VtZW50Lm5hbWUpOwogICAgICAgIGlmIChjb21wYXJlUmVzdWx0ID09IDApIHsKICAgICAgICAgIGlmICghaXNBc3NpZ25hYmxlKAogICAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShwYXJhbWV0ZXIudHlwZSksIGFyZ3VtZW50LnR5cGUpKSB7CiAgICAgICAgICAgIC8vIFR5cGVzIGFyZW4ndCBjb21wYXRpYmxlLgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICArK3BhcmFtZXRlckluZGV4OwogICAgICAgICAgKythcmd1bWVudEluZGV4OwogICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZVJlc3VsdCA8IDApIHsKICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaXNSZXF1aXJlZCkgewogICAgICAgICAgICAvLyBBIHJlcXVpcmVkIHBhcmFtZXRlciBpcyBza2lwcGVkLgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICArK3BhcmFtZXRlckluZGV4OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoY29tcGFyZVJlc3VsdCA+IDApOwogICAgICAgICAgLy8gRXh0cmEgYXJndW1lbnQuCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxBcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gcG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gcG9zaXRpb25hbEFyZ3VtZW50VHlwZXNbaV07CiAgICAgIGlmICghaXNBc3NpZ25hYmxlKAogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHBhcmFtZXRlci50eXBlKSwgYXJndW1lbnQpKSB7CiAgICAgICAgLy8gVHlwZXMgYXJlbid0IGNvbXBhdGlibGUuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgRGFydFR5cGUgYXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOwogICAgICBpZiAoIXR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICAgIGFyZ3VtZW50LAogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHBhcmFtZXRlci5ib3VuZCksCiAgICAgICAgICBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAgICAgICA/IFN1YnR5cGVDaGVja01vZGUud2l0aE51bGxhYmlsaXRpZXMKICAgICAgICAgICAgICA6IFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgIC8vIFRoZSB0eXBlIGFyZ3VtZW50IGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBJZiB0YXJnZXQgaXMgbWlzc2luZyBvbiBhIG5vbi1keW5hbWljIHJlY2VpdmVyLCBhbiBlcnJvciBpcyByZXBvcnRlZAogIC8vLyB1c2luZyBbZXJyb3JUZW1wbGF0ZV0gYW5kIGFuIGludmFsaWQgZXhwcmVzc2lvbiBpcyByZXR1cm5lZC4KICBFeHByZXNzaW9uIHJlcG9ydE1pc3NpbmdJbnRlcmZhY2VNZW1iZXIoCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgTmFtZSBuYW1lLAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcsIERhcnRUeXBlLCBib29sKT4gZXJyb3JUZW1wbGF0ZSkgewogICAgYXNzZXJ0KHJlY2VpdmVyVHlwZSAhPSBudWxsICYmIGlzS25vd24ocmVjZWl2ZXJUeXBlKSk7CiAgICBpZiAoIWlzVG9wTGV2ZWwgJiYgdGFyZ2V0LmlzTWlzc2luZyAmJiBlcnJvclRlbXBsYXRlICE9IG51bGwpIHsKICAgICAgaW50IGxlbmd0aCA9IG5hbWUubmFtZS5sZW5ndGg7CiAgICAgIGlmIChpZGVudGljYWwobmFtZS5uYW1lLCBjYWxsTmFtZS5uYW1lKSB8fAogICAgICAgICAgaWRlbnRpY2FsKG5hbWUubmFtZSwgdW5hcnlNaW51c05hbWUubmFtZSkpIHsKICAgICAgICBsZW5ndGggPSAxOwogICAgICB9CiAgICAgIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgZXJyb3JUZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUubmFtZSwKICAgICAgICAgICAgICByZXNvbHZlVHlwZVBhcmFtZXRlcihyZWNlaXZlclR5cGUpLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBsZW5ndGgpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBbdGFyZ2V0XSB3aGVuIGFjY2Vzc2VkIGFzIGEgZ2V0dGVyIG9uIFtyZWNlaXZlclR5cGVdLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UKICAvLy8KICAvLy8gICAgY2xhc3MgQ2xhc3M8VD4gewogIC8vLyAgICAgIFQgbWV0aG9kKCkge30KICAvLy8gICAgICBUIGdldHRlciA9PiBudWxsOwogIC8vLyAgICB9CiAgLy8vCiAgLy8vICAgIENsYXNzPGludD4gYyA9IC4uLgogIC8vLyAgICBjLm1ldGhvZDsgLy8gVGhlIGdldHRlciB0eXBlIGlzIGBpbnQgRnVuY3Rpb24oKWAuCiAgLy8vICAgIGMuZ2V0dGVyOyAvLyBUaGUgZ2V0dGVyIHR5cGUgaXMgYGludGAuCiAgLy8vCiAgRGFydFR5cGUgZ2V0R2V0dGVyVHlwZShPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0LCBEYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIHN3aXRjaCAodGFyZ2V0LmtpbmQpIHsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmNhbGxGdW5jdGlvbjoKICAgICAgICByZXR1cm4gcmVjZWl2ZXJUeXBlOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQudW5yZXNvbHZlZDoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmR5bmFtaWM6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnZhbGlkOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubWlzc2luZzoKICAgICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm5ldmVyOgogICAgICAgIHJldHVybiBjb25zdCBOZXZlclR5cGUoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW5zdGFuY2VNZW1iZXI6CiAgICAgICAgcmV0dXJuIGdldEdldHRlclR5cGVGb3JNZW1iZXJUYXJnZXQodGFyZ2V0Lm1lbWJlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmV4dGVuc2lvbk1lbWJlcjoKICAgICAgICBzd2l0Y2ggKHRhcmdldC5leHRlbnNpb25NZXRob2RLaW5kKSB7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgICAgICAgIHRhcmdldC5tZW1iZXIuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShsaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBleHRlbnNpb25UeXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uVHlwZQogICAgICAgICAgICAgICAgLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAudGFrZSh0YXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzLmxlbmd0aCkKICAgICAgICAgICAgICAgIC50b0xpc3QoKTsKICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgICBleHRlbnNpb25UeXBlUGFyYW1ldGVycywgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUobmV3IEZ1bmN0aW9uVHlwZSgKICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5za2lwKDEpLnRvTGlzdCgpLAogICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlLnJldHVyblR5cGUsCiAgICAgICAgICAgICAgICBsaWJyYXJ5Lm5vbk51bGxhYmxlLAogICAgICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBmdW5jdGlvblR5cGUubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IGZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycwogICAgICAgICAgICAgICAgICAgIC5za2lwKHRhcmdldC5pbmZlcnJlZEV4dGVuc2lvblR5cGVBcmd1bWVudHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIC50b0xpc3QoKSwKICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgLSAxKSk7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgICAgICAgIHRhcmdldC5tZW1iZXIuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShsaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBleHRlbnNpb25UeXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uVHlwZQogICAgICAgICAgICAgICAgLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAudGFrZSh0YXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzLmxlbmd0aCkKICAgICAgICAgICAgICAgIC50b0xpc3QoKTsKICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgICBleHRlbnNpb25UeXBlUGFyYW1ldGVycywgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZnVuY3Rpb25UeXBlLnJldHVyblR5cGUpOwogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyB1bmhhbmRsZWQoJyR0YXJnZXQnLCAnZ2V0R2V0dGVyVHlwZScsIG51bGwsIG51bGwpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIGdldHRlciB0eXBlIG9mIFtpbnRlcmZhY2VNZW1iZXJdIG9uIGEgcmVjZWl2ZXIgb2YgdHlwZQogIC8vLyBbcmVjZWl2ZXJUeXBlXS4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlCiAgLy8vCiAgLy8vICAgIGNsYXNzIENsYXNzPFQ+IHsKICAvLy8gICAgICBUIG1ldGhvZCgpIHt9CiAgLy8vICAgICAgVCBnZXR0ZXIgPT4gbnVsbDsKICAvLy8gICAgfQogIC8vLwogIC8vLyAgICBDbGFzczxpbnQ+IGMgPSAuLi4KICAvLy8gICAgYy5tZXRob2Q7IC8vIFRoZSBnZXR0ZXIgdHlwZSBpcyBgaW50IEZ1bmN0aW9uKClgLgogIC8vLyAgICBjLmdldHRlcjsgLy8gVGhlIGdldHRlciB0eXBlIGlzIGBpbnRgLgogIC8vLwogIERhcnRUeXBlIGdldEdldHRlclR5cGVGb3JNZW1iZXJUYXJnZXQoCiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIERhcnRUeXBlIHJlY2VpdmVyVHlwZSkgewogICAgQ2xhc3MgbWVtYmVyQ2xhc3MgPSBpbnRlcmZhY2VNZW1iZXIuZW5jbG9zaW5nQ2xhc3M7CiAgICBhc3NlcnQoaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkIHx8IGludGVyZmFjZU1lbWJlciBpcyBQcm9jZWR1cmUsCiAgICAgICAgIlVuZXhwZWN0ZWQgaW50ZXJmYWNlIG1lbWJlciAkaW50ZXJmYWNlTWVtYmVyLiIpOwogICAgRGFydFR5cGUgY2FsbGVlVHlwZSA9IGludGVyZmFjZU1lbWJlci5nZXR0ZXJUeXBlOwogICAgaWYgKG1lbWJlckNsYXNzLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgcmVjZWl2ZXJUeXBlID0gcmVzb2x2ZVR5cGVQYXJhbWV0ZXIocmVjZWl2ZXJUeXBlKTsKICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gY2FzdGVkVHlwZUFyZ3VtZW50cyA9IGNsYXNzSGllcmFyY2h5CiAgICAgICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKHJlY2VpdmVyVHlwZSwgbWVtYmVyQ2xhc3MpOwogICAgICAgIGNhbGxlZVR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgbWVtYmVyQ2xhc3MudHlwZVBhcmFtZXRlcnMsIGNhc3RlZFR5cGVBcmd1bWVudHMpCiAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShjYWxsZWVUeXBlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhbGxlZVR5cGU7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBbdGFyZ2V0XSB3aGVuIGFjY2Vzc2VkIGFzIGFuIGludm9jYXRpb24gb24KICAvLy8gW3JlY2VpdmVyVHlwZV0uCiAgLy8vCiAgLy8vIElmIHRoZSB0YXJnZXQgaXMga25vd24gbm90IHRvIGJlIGludm9rYWJsZSBbdW5rbm93bkZ1bmN0aW9uXSBpcyByZXR1cm5lZC4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlCiAgLy8vCiAgLy8vICAgIGNsYXNzIENsYXNzPFQ+IHsKICAvLy8gICAgICBUIG1ldGhvZCgpIHt9CiAgLy8vICAgICAgVCBGdW5jdGlvbigpIGdldHRlcjEgPT4gbnVsbDsKICAvLy8gICAgICBUIGdldHRlcjIgPT4gbnVsbDsKICAvLy8gICAgfQogIC8vLwogIC8vLyAgICBDbGFzczxpbnQ+IGMgPSAuLi4KICAvLy8gICAgYy5tZXRob2Q7IC8vIFRoZSBnZXR0ZXIgdHlwZSBpcyBgaW50IEZ1bmN0aW9uKClgLgogIC8vLyAgICBjLmdldHRlcjE7IC8vIFRoZSBnZXR0ZXIgdHlwZSBpcyBgaW50IEZ1bmN0aW9uKClgLgogIC8vLyAgICBjLmdldHRlcjI7IC8vIFRoZSBnZXR0ZXIgdHlwZSBpcyBbdW5rbm93bkZ1bmN0aW9uXS4KICAvLy8KICBGdW5jdGlvblR5cGUgZ2V0RnVuY3Rpb25UeXBlKAogICAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0LCBEYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIHN3aXRjaCAodGFyZ2V0LmtpbmQpIHsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmNhbGxGdW5jdGlvbjoKICAgICAgICByZXR1cm4gX2dldEZ1bmN0aW9uVHlwZShyZWNlaXZlclR5cGUpOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQudW5yZXNvbHZlZDoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmR5bmFtaWM6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5uZXZlcjoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmludmFsaWQ6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5taXNzaW5nOgogICAgICAgIHJldHVybiB1bmtub3duRnVuY3Rpb247CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlcjoKICAgICAgICByZXR1cm4gX2dldEZ1bmN0aW9uVHlwZSgKICAgICAgICAgICAgZ2V0R2V0dGVyVHlwZUZvck1lbWJlclRhcmdldCh0YXJnZXQubWVtYmVyLCByZWNlaXZlclR5cGUpKTsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmV4dGVuc2lvbk1lbWJlcjoKICAgICAgICBzd2l0Y2ggKHRhcmdldC5leHRlbnNpb25NZXRob2RLaW5kKSB7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm1lbWJlci5mdW5jdGlvbgogICAgICAgICAgICAgICAgLmNvbXB1dGVGdW5jdGlvblR5cGUobGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBIYW5kbGUgaW1wbGljaXQgLmNhbGwgb24gZXh0ZW5zaW9uIGdldHRlci4KICAgICAgICAgICAgcmV0dXJuIF9nZXRGdW5jdGlvblR5cGUodGFyZ2V0Lm1lbWJlci5mdW5jdGlvbi5yZXR1cm5UeXBlKTsKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuRmFjdG9yeToKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgdW5oYW5kbGVkKCckdGFyZ2V0JywgJ2dldEZ1bmN0aW9uVHlwZScsIG51bGwsIG51bGwpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGFyZ3VtZW50IGluIGFuIGFjY2VzcyB0byBhbiBleHRlbnNpb24KICAvLy8gbWVtYmVyIG9uIFtleHRlbnNpb25dIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbiBbdHlwZUFyZ3VtZW50c10uCiAgRGFydFR5cGUgZ2V0RXh0ZW5zaW9uUmVjZWl2ZXJUeXBlKAogICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uLCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzKSB7CiAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBleHRlbnNpb24ub25UeXBlOwogICAgaWYgKGV4dGVuc2lvbi50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhleHRlbnNpb24udHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOwogICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHJlY2VpdmVyVHlwZSk7CiAgICB9CiAgICByZXR1cm4gcmVjZWl2ZXJUeXBlOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBpbnZvY2F0aW9uIG9mIFt0YXJnZXRdIG9uIFtyZWNlaXZlclR5cGVdLgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENsZWFudXAgW2dldEZ1bmN0aW9uVHlwZV0sIFtnZXRSZXR1cm5UeXBlXSwKICAvLyBbZ2V0SW5kZXhLZXlUeXBlXSBhbmQgW2dldEluZGV4U2V0VmFsdWVUeXBlXS4gV2Ugc2hvdWxkbid0IG5lZWQgdGhhdCBtYW55LgogIERhcnRUeXBlIGdldFJldHVyblR5cGUoT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICBzd2l0Y2ggKHRhcmdldC5raW5kKSB7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlcjoKICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gX2dldEZ1bmN0aW9uVHlwZSgKICAgICAgICAgICAgZ2V0R2V0dGVyVHlwZUZvck1lbWJlclRhcmdldCh0YXJnZXQubWVtYmVyLCByZWNlaXZlclR5cGUpKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb25UeXBlLnJldHVyblR5cGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5leHRlbnNpb25NZW1iZXI6CiAgICAgICAgc3dpdGNoICh0YXJnZXQuZXh0ZW5zaW9uTWV0aG9kS2luZCkgewogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgICAgICAgIHRhcmdldC5tZW1iZXIuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShsaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICAgICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IGZ1bmN0aW9uVHlwZS5yZXR1cm5UeXBlOwogICAgICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICB0YXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKTsKICAgICAgICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHJldHVyblR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgdW5oYW5kbGVkKCckdGFyZ2V0JywgJ2dldEZ1bmN0aW9uVHlwZScsIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm5ldmVyOgogICAgICAgIHJldHVybiBjb25zdCBOZXZlclR5cGUoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuY2FsbEZ1bmN0aW9uOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQudW5yZXNvbHZlZDoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmR5bmFtaWM6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnZhbGlkOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubWlzc2luZzoKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgRGFydFR5cGUgZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGVGb3JUYXJnZXQoCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwgaW50IGluZGV4KSB7CiAgICBzd2l0Y2ggKHRhcmdldC5raW5kKSB7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlcjoKICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gX2dldEZ1bmN0aW9uVHlwZSgKICAgICAgICAgICAgZ2V0R2V0dGVyVHlwZUZvck1lbWJlclRhcmdldCh0YXJnZXQubWVtYmVyLCByZWNlaXZlclR5cGUpKTsKICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+IGluZGV4KSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5leHRlbnNpb25NZW1iZXI6CiAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgIHRhcmdldC5tZW1iZXIuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShsaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+IGluZGV4ICsgMSkgewogICAgICAgICAgRGFydFR5cGUga2V5VHlwZSA9IGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpbmRleCArIDFdOwogICAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoa2V5VHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4ga2V5VHlwZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5jYWxsRnVuY3Rpb246CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC51bnJlc29sdmVkOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuZHluYW1pYzoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm5ldmVyOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW52YWxpZDoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm1pc3Npbmc6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSAna2V5JyBwYXJhbWV0ZXIgaW4gYW4gW10gb3IgW109IGltcGxlbWVudGF0aW9uLgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UKICAvLy8KICAvLy8gICAgY2xhc3MgQ2xhc3M8SywgVj4gewogIC8vLyAgICAgIFYgb3BlcmF0b3IgW10oSyBrZXkpID0+IG51bGw7CiAgLy8vICAgICAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHt9CiAgLy8vICAgIH0KICAvLy8KICAvLy8gICAgZXh0ZW5zaW9uIEV4dGVuc2lvbjxLLCBWPiBvbiBDbGFzczxLLCBWPiB7CiAgLy8vICAgICAgViBvcGVyYXRvciBbXShLIGtleSkgPT4gbnVsbDsKICAvLy8gICAgICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkge30KICAvLy8gICAgfQogIC8vLwogIC8vLyAgICBuZXcgQ2xhc3M8aW50LCBTdHJpbmc+KClbMF07ICAgICAgICAgICAgIC8vIFRoZSBrZXkgdHlwZSBpcyBgaW50YC4KICAvLy8gICAgbmV3IENsYXNzPGludCwgU3RyaW5nPigpWzBdID0gJ2Zvbyc7ICAgICAvLyBUaGUga2V5IHR5cGUgaXMgYGludGAuCiAgLy8vICAgIEV4dGVuc2lvbjxpbnQsIFN0cmluZz4obnVsbClbMF07ICAgICAgICAgLy8gVGhlIGtleSB0eXBlIGlzIGBpbnRgLgogIC8vLyAgICBFeHRlbnNpb248aW50LCBTdHJpbmc+KG51bGwpWzBdID0gJ2Zvbyc7IC8vIFRoZSBrZXkgdHlwZSBpcyBgaW50YC4KICAvLy8KICBEYXJ0VHlwZSBnZXRJbmRleEtleVR5cGUoT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICBzd2l0Y2ggKHRhcmdldC5raW5kKSB7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlcjoKICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gX2dldEZ1bmN0aW9uVHlwZSgKICAgICAgICAgICAgZ2V0R2V0dGVyVHlwZUZvck1lbWJlclRhcmdldCh0YXJnZXQubWVtYmVyLCByZWNlaXZlclR5cGUpKTsKICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+PSAxKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzWzBdOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmV4dGVuc2lvbk1lbWJlcjoKICAgICAgICBzd2l0Y2ggKHRhcmdldC5leHRlbnNpb25NZXRob2RLaW5kKSB7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgICAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPQogICAgICAgICAgICAgICAgdGFyZ2V0Lm1lbWJlci5mdW5jdGlvbi5jb21wdXRlRnVuY3Rpb25UeXBlKGxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgRGFydFR5cGUga2V5VHlwZSA9IGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1sxXTsKICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoa2V5VHlwZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBrZXlUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgdW5oYW5kbGVkKCckdGFyZ2V0JywgJ2dldEZ1bmN0aW9uVHlwZScsIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmNhbGxGdW5jdGlvbjoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLnVucmVzb2x2ZWQ6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5keW5hbWljOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubmV2ZXI6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnZhbGlkOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubWlzc2luZzoKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlICd2YWx1ZScgcGFyYW1ldGVyIGluIGFuIFtdPSBpbXBsZW1lbnRhdGlvbi4KICAvLy8KICAvLy8gRm9yIGluc3RhbmNlCiAgLy8vCiAgLy8vICAgIGNsYXNzIENsYXNzPEssIFY+IHsKICAvLy8gICAgICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkge30KICAvLy8gICAgfQogIC8vLwogIC8vLyAgICBleHRlbnNpb24gRXh0ZW5zaW9uPEssIFY+IG9uIENsYXNzPEssIFY+IHsKICAvLy8gICAgICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkge30KICAvLy8gICAgfQogIC8vLwogIC8vLyAgICBuZXcgQ2xhc3M8aW50LCBTdHJpbmc+KClbMF0gPSAnZm9vJzsgICAgIC8vIFRoZSB2YWx1ZSB0eXBlIGlzIGBTdHJpbmdgLgogIC8vLyAgICBFeHRlbnNpb248aW50LCBTdHJpbmc+KG51bGwpWzBdID0gJ2Zvbyc7IC8vIFRoZSB2YWx1ZSB0eXBlIGlzIGBTdHJpbmdgLgogIC8vLwogIERhcnRUeXBlIGdldEluZGV4U2V0VmFsdWVUeXBlKAogICAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0LCBEYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIHN3aXRjaCAodGFyZ2V0LmtpbmQpIHsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmluc3RhbmNlTWVtYmVyOgogICAgICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBfZ2V0RnVuY3Rpb25UeXBlKAogICAgICAgICAgICBnZXRHZXR0ZXJUeXBlRm9yTWVtYmVyVGFyZ2V0KHRhcmdldC5tZW1iZXIsIHJlY2VpdmVyVHlwZSkpOwogICAgICAgIGlmIChmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoID49IDIpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbMV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuZXh0ZW5zaW9uTWVtYmVyOgogICAgICAgIHN3aXRjaCAodGFyZ2V0LmV4dGVuc2lvbk1ldGhvZEtpbmQpIHsKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgICAgICAgICAgICB0YXJnZXQubWVtYmVyLmZ1bmN0aW9uLmNvbXB1dGVGdW5jdGlvblR5cGUobGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgICAgICAgIGlmIChmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoID49IDMpIHsKICAgICAgICAgICAgICBEYXJ0VHlwZSBpbmRleFR5cGUgPSBmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbMl07CiAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZS50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGluZGV4VHlwZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpbmRleFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyB1bmhhbmRsZWQoJyR0YXJnZXQnLCAnZ2V0RnVuY3Rpb25UeXBlJywgbnVsbCwgbnVsbCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuY2FsbEZ1bmN0aW9uOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQudW5yZXNvbHZlZDoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmR5bmFtaWM6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5uZXZlcjoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmludmFsaWQ6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5taXNzaW5nOgogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQoKICBGdW5jdGlvblR5cGUgX2dldEZ1bmN0aW9uVHlwZShEYXJ0VHlwZSBjYWxsZWVUeXBlKSB7CiAgICBpZiAoY2FsbGVlVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIGNhbGxlZVR5cGU7CiAgICB9CiAgICByZXR1cm4gdW5rbm93bkZ1bmN0aW9uOwogIH0KCiAgRnVuY3Rpb25UeXBlIGdldEZ1bmN0aW9uVHlwZUZvckltcGxpY2l0Q2FsbChEYXJ0VHlwZSBjYWxsZWVUeXBlKSB7CiAgICBpZiAoY2FsbGVlVHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIGNhbGxlZVR5cGU7CiAgICB9IGVsc2UgaWYgKGNhbGxlZVR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBNZW1iZXIgbWVtYmVyID0KICAgICAgICAgIF9nZXRJbnRlcmZhY2VNZW1iZXIoY2FsbGVlVHlwZS5jbGFzc05vZGUsIGNhbGxOYW1lLCBmYWxzZSwgLTEpOwogICAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKICAgICAgICBEYXJ0VHlwZSBjYWxsVHlwZSA9IGdldEdldHRlclR5cGVGb3JNZW1iZXJUYXJnZXQobWVtYmVyLCBjYWxsZWVUeXBlKTsKICAgICAgICBpZiAoY2FsbFR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gY2FsbFR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdW5rbm93bkZ1bmN0aW9uOwogIH0KCiAgRGFydFR5cGUgZ2V0RGVyaXZlZFR5cGVBcmd1bWVudE9mKERhcnRUeXBlIHR5cGUsIENsYXNzIGNsYXNzXykgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mQ2xhc3MgPQogICAgICAgICAgY2xhc3NIaWVyYXJjaHkuZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZih0eXBlLCBjbGFzc18pOwogICAgICBpZiAodHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZkNsYXNzICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZkNsYXNzWzBdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBJZiB0aGUgW21lbWJlcl0gaXMgYSBmb3J3YXJkaW5nIHN0dWIsIHJldHVybiB0aGUgdGFyZ2V0IGl0IGZvcndhcmRzIHRvLgogIC8vLyBPdGhlcndpc2UgcmV0dXJuIHRoZSBnaXZlbiBbbWVtYmVyXS4KICBNZW1iZXIgZ2V0UmVhbFRhcmdldChNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIuaXNGb3J3YXJkaW5nU3R1YikgewogICAgICByZXR1cm4gbWVtYmVyLmZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0OwogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIERhcnRUeXBlIGdldFNldHRlclR5cGUoT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICBzd2l0Y2ggKHRhcmdldC5raW5kKSB7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC51bnJlc29sdmVkOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuZHluYW1pYzoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm5ldmVyOgogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW52YWxpZDoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm1pc3Npbmc6CiAgICAgICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlcjoKICAgICAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyID0gdGFyZ2V0Lm1lbWJlcjsKICAgICAgICBDbGFzcyBtZW1iZXJDbGFzcyA9IGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzczsKICAgICAgICBEYXJ0VHlwZSBzZXR0ZXJUeXBlOwogICAgICAgIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgICBhc3NlcnQoaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpOwogICAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBzZXR0ZXJQYXJhbWV0ZXJzID0KICAgICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICAgICAgICBzZXR0ZXJUeXBlID0gc2V0dGVyUGFyYW1ldGVycy5sZW5ndGggPiAwCiAgICAgICAgICAgICAgPyBzZXR0ZXJQYXJhbWV0ZXJzWzBdLnR5cGUKICAgICAgICAgICAgICA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VNZW1iZXIgaXMgRmllbGQpIHsKICAgICAgICAgIHNldHRlclR5cGUgPSBpbnRlcmZhY2VNZW1iZXIudHlwZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgdW5oYW5kbGVkKGludGVyZmFjZU1lbWJlci5ydW50aW1lVHlwZS50b1N0cmluZygpLAogICAgICAgICAgICAgICdnZXRTZXR0ZXJUeXBlJywgbnVsbCwgbnVsbCk7CiAgICAgICAgfQogICAgICAgIGlmIChtZW1iZXJDbGFzcy50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgICByZWNlaXZlclR5cGUgPSByZXNvbHZlVHlwZVBhcmFtZXRlcihyZWNlaXZlclR5cGUpOwogICAgICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICAgIHNldHRlclR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAogICAgICAgICAgICAgICAgICAgIG1lbWJlckNsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICAgIGNsYXNzSGllcmFyY2h5LmdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwgbWVtYmVyQ2xhc3MpKQogICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHNldHRlclR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0dGVyVHlwZTsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmV4dGVuc2lvbk1lbWJlcjoKICAgICAgICBzd2l0Y2ggKHRhcmdldC5leHRlbnNpb25NZXRob2RLaW5kKSB7CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0KICAgICAgICAgICAgICAgIHRhcmdldC5tZW1iZXIuZnVuY3Rpb24uY29tcHV0ZUZ1bmN0aW9uVHlwZShsaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBleHRlbnNpb25UeXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uVHlwZQogICAgICAgICAgICAgICAgLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAudGFrZSh0YXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzLmxlbmd0aCkKICAgICAgICAgICAgICAgIC50b0xpc3QoKTsKICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgICAgICAgICBleHRlbnNpb25UeXBlUGFyYW1ldGVycywgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CiAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24KICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShmdW5jdGlvblR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbMV0pOwogICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuRmFjdG9yeToKICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENvbXB1dGUgdGhlIHJpZ2h0IHNldHRlciB0eXBlLgogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuY2FsbEZ1bmN0aW9uOgogICAgICAgIGJyZWFrOwogICAgfQogICAgdGhyb3cgdW5oYW5kbGVkKHRhcmdldC5ydW50aW1lVHlwZS50b1N0cmluZygpLCAnZ2V0U2V0dGVyVHlwZScsIG51bGwsIG51bGwpOwogIH0KCiAgRGFydFR5cGUgZ2V0VHlwZUFyZ3VtZW50T2YoRGFydFR5cGUgdHlwZSwgQ2xhc3MgY2xhc3NfKSB7CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIGlkZW50aWNhbCh0eXBlLmNsYXNzTm9kZSwgY2xhc3NfKSkgewogICAgICByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbnN0IFVua25vd25UeXBlKCk7CiAgICB9CiAgfQoKICAvLy8gQWRkcyBhbiAiYXMiIGNoZWNrIHRvIGEgW01ldGhvZEludm9jYXRpb25dIGlmIG5lY2Vzc2FyeSBkdWUgdG8KICAvLy8gY29udHJhdmFyaWFuY2UuCiAgLy8vCiAgLy8vIFRoZSByZXR1cm5lZCBleHByZXNzaW9uIGlzIHRoZSBbQXNFeHByZXNzaW9uXSwgaWYgb25lIHdhcyBhZGRlZDsgb3RoZXJ3aXNlCiAgLy8vIGl0IGlzIHRoZSBbTWV0aG9kSW52b2NhdGlvbl0uCiAgRXhwcmVzc2lvbiBoYW5kbGVJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UoCiAgICAgIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kIGNoZWNrS2luZCwKICAgICAgTWV0aG9kSW52b2NhdGlvbiBkZXN1Z2FyZWRJbnZvY2F0aW9uLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSwKICAgICAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSwKICAgICAgaW50IGZpbGVPZmZzZXQpIHsKICAgIHN3aXRjaCAoY2hlY2tLaW5kKSB7CiAgICAgIGNhc2UgTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQuY2hlY2tNZXRob2RSZXR1cm46CiAgICAgICAgQXNFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbmV3IEFzRXhwcmVzc2lvbihleHByZXNzaW9uLCBpbmZlcnJlZFR5cGUpCiAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgLi5pc0NvdmFyaWFuY2VDaGVjayA9IHRydWUKICAgICAgICAgIC4uaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXJndW1lbnRzLmZpbGVPZmZzZXQgPT0gLTEKICAgICAgICAgICAgICA/IGV4cHJlc3Npb24uZmlsZU9mZnNldAogICAgICAgICAgICAgIDogYXJndW1lbnRzLmZpbGVPZmZzZXQ7CiAgICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaUZvckluc3RydW1lbnRhdGlvbiwgb2Zmc2V0LCAnY2hlY2tSZXR1cm4nLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKICAgICAgY2FzZSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja0dldHRlclJldHVybjoKICAgICAgICBQcm9wZXJ0eUdldCBwcm9wZXJ0eUdldCA9IG5ldyBQcm9wZXJ0eUdldChkZXN1Z2FyZWRJbnZvY2F0aW9uLnJlY2VpdmVyLAogICAgICAgICAgICBkZXN1Z2FyZWRJbnZvY2F0aW9uLm5hbWUsIGRlc3VnYXJlZEludm9jYXRpb24uaW50ZXJmYWNlVGFyZ2V0KTsKICAgICAgICBBc0V4cHJlc3Npb24gYXNFeHByZXNzaW9uID0gbmV3IEFzRXhwcmVzc2lvbihwcm9wZXJ0eUdldCwgZnVuY3Rpb25UeXBlKQogICAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAgIC4uaXNDb3ZhcmlhbmNlQ2hlY2sgPSB0cnVlCiAgICAgICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSBpc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgIE1ldGhvZEludm9jYXRpb24gcmVwbGFjZW1lbnQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgICAgYXNFeHByZXNzaW9uLCBjYWxsTmFtZSwgZGVzdWdhcmVkSW52b2NhdGlvbi5hcmd1bWVudHMpOwogICAgICAgIGlmIChpbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW50IG9mZnNldCA9IGFyZ3VtZW50cy5maWxlT2Zmc2V0ID09IC0xCiAgICAgICAgICAgICAgPyBleHByZXNzaW9uLmZpbGVPZmZzZXQKICAgICAgICAgICAgICA6IGFyZ3VtZW50cy5maWxlT2Zmc2V0OwogICAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCgKICAgICAgICAgICAgICB1cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICdjaGVja0dldHRlclJldHVybicsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShmdW5jdGlvblR5cGUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgICBjYXNlIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLm5vbmU6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIC8vLyBNb2RpZmllcyBhIHR5cGUgYXMgYXBwcm9wcmlhdGUgd2hlbiBpbmZlcnJpbmcgYSBkZWNsYXJlZCB2YXJpYWJsZSdzIHR5cGUuCiAgRGFydFR5cGUgaW5mZXJEZWNsYXJhdGlvblR5cGUoRGFydFR5cGUgaW5pdGlhbGl6ZXJUeXBlLAogICAgICB7Ym9vbCBmb3JTeW50aGV0aWNWYXJpYWJsZTogZmFsc2V9KSB7CiAgICBpZiAoaW5pdGlhbGl6ZXJUeXBlIGlzIEJvdHRvbVR5cGUgfHwKICAgICAgICAoaW5pdGlhbGl6ZXJUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgICAgaW5pdGlhbGl6ZXJUeXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMubnVsbENsYXNzKSkgewogICAgICAvLyBJZiB0aGUgaW5pdGlhbGl6ZXIgdHlwZSBpcyBOdWxsIG9yIGJvdHRvbSwgdGhlIGluZmVycmVkIHR5cGUgaXMKICAgICAgLy8gZHluYW1pYy4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiB0aGlzIHJ1bGUgaXMgaW5oZXJpdGVkIGZyb20gYW5hbHl6ZXIgYmVoYXZpb3IgYnV0IGlzCiAgICAgIC8vIG5vdCBzcGVjJ2VkIGFueXdoZXJlLgogICAgICByZXR1cm4gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIGlmIChmb3JTeW50aGV0aWNWYXJpYWJsZSkgewogICAgICByZXR1cm4gbm9uTnVsbGlmeUluTGlicmFyeShpbml0aWFsaXplclR5cGUsIGxpYnJhcnkubGlicmFyeSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZGVtb3RlVHlwZUluTGlicmFyeShpbml0aWFsaXplclR5cGUsIGxpYnJhcnkubGlicmFyeSk7CiAgICB9CiAgfQoKICB2b2lkIGluZmVyU3ludGhldGljVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbkltcGwgdmFyaWFibGUpIHsKICAgIGFzc2VydCh2YXJpYWJsZS5pc0ltcGxpY2l0bHlUeXBlZCk7CiAgICBhc3NlcnQodmFyaWFibGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCk7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVyRXhwcmVzc2lvbigKICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gcmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IHZhcmlhYmxlOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0KICAgICAgICBpbmZlckRlY2xhcmF0aW9uVHlwZShyZXN1bHQuaW5mZXJyZWRUeXBlLCBmb3JTeW50aGV0aWNWYXJpYWJsZTogdHJ1ZSk7CiAgICBpbnN0cnVtZW50YXRpb24/LnJlY29yZCh1cmlGb3JJbnN0cnVtZW50YXRpb24sIHZhcmlhYmxlLmZpbGVPZmZzZXQsICd0eXBlJywKICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkVHlwZSkpOwogICAgdmFyaWFibGUudHlwZSA9IGluZmVycmVkVHlwZTsKICB9CgogIExpbms8TnVsbEF3YXJlR3VhcmQ+IGluZmVyU3ludGhldGljVmFyaWFibGVOdWxsQXdhcmUoCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsIHZhcmlhYmxlKSB7CiAgICBhc3NlcnQodmFyaWFibGUuaXNJbXBsaWNpdGx5VHlwZWQpOwogICAgYXNzZXJ0KHZhcmlhYmxlLmluaXRpYWxpemVyICE9IG51bGwpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZHM7CiAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IHJlc3VsdC5udWxsQXdhcmVBY3Rpb24uLnBhcmVudCA9IHZhcmlhYmxlOwogICAgICBudWxsQXdhcmVHdWFyZHMgPSByZXN1bHQubnVsbEF3YXJlR3VhcmRzOwogICAgfSBlbHNlIHsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSByZXN1bHQuZXhwcmVzc2lvbi4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgIG51bGxBd2FyZUd1YXJkcyA9IGNvbnN0IExpbms8TnVsbEF3YXJlR3VhcmQ+KCk7CiAgICB9CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPQogICAgICAgIGluZmVyRGVjbGFyYXRpb25UeXBlKHJlc3VsdC5pbmZlcnJlZFR5cGUsIGZvclN5bnRoZXRpY1ZhcmlhYmxlOiB0cnVlKTsKICAgIGluc3RydW1lbnRhdGlvbj8ucmVjb3JkKHVyaUZvckluc3RydW1lbnRhdGlvbiwgdmFyaWFibGUuZmlsZU9mZnNldCwgJ3R5cGUnLAogICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICB2YXJpYWJsZS50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgcmV0dXJuIG51bGxBd2FyZUd1YXJkczsKICB9CgogIE51bGxBd2FyZUd1YXJkIGNyZWF0ZU51bGxBd2FyZUd1YXJkKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIE1lbWJlciBlcXVhbHNNZW1iZXIgPQogICAgICAgIGZpbmRJbnRlcmZhY2VNZW1iZXIodmFyaWFibGUudHlwZSwgZXF1YWxzTmFtZSwgdmFyaWFibGUuZmlsZU9mZnNldCkKICAgICAgICAgICAgLm1lbWJlcjsKICAgIHJldHVybiBuZXcgTnVsbEF3YXJlR3VhcmQoCiAgICAgICAgdmFyaWFibGUsIHZhcmlhYmxlLmZpbGVPZmZzZXQsIGVxdWFsc01lbWJlciwgdGhpcyk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSwKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZHMpIHsKICAgIGlmIChudWxsQXdhcmVHdWFyZHMgIT0gbnVsbCAmJiBudWxsQXdhcmVHdWFyZHMuaXNOb3RFbXB0eSkgewogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICBjb21wdXRlTnVsbGFibGUoaW5mZXJyZWRUeXBlKSwKICAgICAgICAgIGluZmVycmVkVHlwZSwKICAgICAgICAgIG51bGxBd2FyZUd1YXJkcywKICAgICAgICAgIGV4cHJlc3Npb24pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgZXhwcmVzc2lvbik7CiAgICB9CiAgfQoKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIFtleHByZXNzaW9uXS4KICAvLy8KICAvLy8gW3R5cGVDb250ZXh0XSBpcyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiwgYmFzZWQgb24gc3Vycm91bmRpbmcKICAvLy8gY29kZS4gIFt0eXBlTmVlZGVkXSBpbmRpY2F0ZXMgd2hldGhlciBpdCBpcyBuZWNlc3NhcnkgdG8gY29tcHV0ZSB0aGUKICAvLy8gYWN0dWFsIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uICBJZiBbdHlwZU5lZWRlZF0gaXMgYHRydWVgLAogIC8vLyBbRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdC5pbmZlcnJlZFR5cGVdIGlzIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUKICAvLy8gZXhwcmVzc2lvbjsgb3RoZXJ3aXNlIGBudWxsYC4KICAvLy8KICAvLy8gRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aXRoIGxvZ2ljIHRoYXQgZGlzcGF0Y2hlcyBvbgogIC8vLyB0aGUgZXhwcmVzc2lvbiB0eXBlIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgc3BlY2lhbGl6ZWQgImluZmVyIiBtZXRob2QuCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmZlckV4cHJlc3Npb24oCiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZUNvbnRleHQsIGJvb2wgdHlwZU5lZWRlZCwKICAgICAge2Jvb2wgaXNWb2lkQWxsb3dlZDogZmFsc2V9KSB7CiAgICByZWdpc3RlcklmVW5yZWFjaGFibGVGb3JUZXN0aW5nKGV4cHJlc3Npb24pOwoKICAgIC8vIGBudWxsYCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBhcyB0aGUgdHlwZSBjb250ZXh0LiAgQW4gaW5zdGFuY2Ugb2YKICAgIC8vIGBVbmtub3duVHlwZWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KICAgIGFzc2VydCh0eXBlQ29udGV4dCAhPSBudWxsKTsKCiAgICAvLyBGb3IgZnVsbCAobm9uLXRvcCBsZXZlbCkgaW5mZXJlbmNlLCB3ZSBuZWVkIGFjY2VzcyB0byB0aGUKICAgIC8vIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgc28gdGhhdCB3ZSBjYW4gcGVyZm9ybSBlcnJvciByZWNvdmVyeS4KICAgIGFzc2VydChpc1RvcExldmVsIHx8IGhlbHBlciAhPSBudWxsKTsKCiAgICAvLyBXaGVuIGRvaW5nIHRvcCBsZXZlbCBpbmZlcmVuY2UsIHdlIHNraXAgc3ViZXhwcmVzc2lvbnMgd2hvc2UgdHlwZSBpc24ndAogICAgLy8gbmVlZGVkIHNvIHRoYXQgd2UgZG9uJ3QgaW5kdWNlIGJvZ3VzIGRlcGVuZGVuY2llcyBvbiBmaWVsZHMgbWVudGlvbmVkIGluCiAgICAvLyB0aG9zZSBzdWJleHByZXNzaW9ucy4KICAgIGlmICghdHlwZU5lZWRlZCkgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KG51bGwsIGV4cHJlc3Npb24pOwoKICAgIEluZmVyZW5jZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJbmZlcmVuY2VWaXNpdG9yKHRoaXMpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQ7CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBFeHByZXNzaW9uSnVkZ21lbnQpIHsKICAgICAgcmVzdWx0ID0gZXhwcmVzc2lvbi5hY2NlcHRJbmZlcmVuY2UodmlzaXRvciwgdHlwZUNvbnRleHQpOwogICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGlzIEludGVybmFsRXhwcmVzc2lvbikgewogICAgICByZXN1bHQgPSBleHByZXNzaW9uLmFjY2VwdEluZmVyZW5jZSh2aXNpdG9yLCB0eXBlQ29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBleHByZXNzaW9uLmFjY2VwdDEodmlzaXRvciwgdHlwZUNvbnRleHQpOwogICAgfQogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gcmVzdWx0LmluZmVycmVkVHlwZTsKICAgIGFzc2VydChpbmZlcnJlZFR5cGUgIT0gbnVsbCwKICAgICAgICAiTm8gdHlwZSBpbmZlcnJlZCBmb3IgJGV4cHJlc3Npb24gKCR7ZXhwcmVzc2lvbi5ydW50aW1lVHlwZX0pLiIpOwogICAgaWYgKGluZmVycmVkVHlwZSBpcyBWb2lkVHlwZSAmJiAhaXNWb2lkQWxsb3dlZCkgewogICAgICBpZiAoZXhwcmVzc2lvbi5wYXJlbnQgaXMhIEFyZ3VtZW50c0ltcGwpIHsKICAgICAgICBoZWxwZXI/LmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwgZXhwcmVzc2lvbi5maWxlT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZXN1bHQuaW5mZXJyZWRUeXBlIGlzIE5ldmVyVHlwZSkgewogICAgICBmbG93QW5hbHlzaXMuaGFuZGxlRXhpdCgpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW5mZXJGaWVsZEluaXRpYWxpemVyKAogICAgSW5mZXJlbmNlSGVscGVyIGhlbHBlciwKICAgIERhcnRUeXBlIGNvbnRleHQsCiAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyLAogICkgewogICAgYXNzZXJ0KGNsb3N1cmVDb250ZXh0ID09IG51bGwpOwogICAgYXNzZXJ0KCFpc1RvcExldmVsKTsKICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbml0aWFsaXplclJlc3VsdCA9CiAgICAgICAgaW5mZXJFeHByZXNzaW9uKGluaXRpYWxpemVyLCBjb250ZXh0LCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIGluaXRpYWxpemVyID0gZW5zdXJlQXNzaWduYWJsZVJlc3VsdChjb250ZXh0LCBpbml0aWFsaXplclJlc3VsdCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBjb250ZXh0IGlzIFZvaWRUeXBlKTsKICAgIHRoaXMuaGVscGVyID0gbnVsbDsKICAgIHJldHVybiBpbml0aWFsaXplcjsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudCBpbmZlckZ1bmN0aW9uQm9keShJbmZlcmVuY2VIZWxwZXIgaGVscGVyLCBEYXJ0VHlwZSByZXR1cm5UeXBlLAogICAgICBBc3luY01hcmtlciBhc3luY01hcmtlciwgU3RhdGVtZW50IGJvZHkpIHsKICAgIGFzc2VydChib2R5ICE9IG51bGwpOwogICAgYXNzZXJ0KGNsb3N1cmVDb250ZXh0ID09IG51bGwpOwogICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICBjbG9zdXJlQ29udGV4dCA9IG5ldyBDbG9zdXJlQ29udGV4dCh0aGlzLCBhc3luY01hcmtlciwgcmV0dXJuVHlwZSwgZmFsc2UpOwogICAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVyU3RhdGVtZW50KGJvZHkpOwogICAgY2xvc3VyZUNvbnRleHQgPSBudWxsOwogICAgdGhpcy5oZWxwZXIgPSBudWxsOwogICAgaWYgKGRhdGFGb3JUZXN0aW5nICE9IG51bGwpIHsKICAgICAgaWYgKCFmbG93QW5hbHlzaXMuaXNSZWFjaGFibGUpIHsKICAgICAgICBkYXRhRm9yVGVzdGluZy5mbG93QW5hbHlzaXNSZXN1bHQuZnVuY3Rpb25Cb2RpZXNUaGF0RG9udENvbXBsZXRlCiAgICAgICAgICAgIC5hZGQoYm9keSk7CiAgICAgIH0KICAgIH0KICAgIGZsb3dBbmFseXNpcy5maW5pc2goKTsKICAgIHJldHVybiByZXN1bHQuaGFzQ2hhbmdlZCA/IHJlc3VsdC5zdGF0ZW1lbnQgOiBib2R5OwogIH0KCiAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCBpbmZlckludm9jYXRpb24oRGFydFR5cGUgdHlwZUNvbnRleHQsIGludCBvZmZzZXQsCiAgICAgIEZ1bmN0aW9uVHlwZSBjYWxsZWVUeXBlLCBBcmd1bWVudHMgYXJndW1lbnRzLCBOYW1lIHRhcmdldE5hbWUsCiAgICAgIHtib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogZmFsc2UsCiAgICAgIERhcnRUeXBlIHJldHVyblR5cGUsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgYm9vbCBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ltcGxpY2l0RXh0ZW5zaW9uTWVtYmVyOiBmYWxzZX0pIHsKICAgIGFzc2VydCgKICAgICAgICByZXR1cm5UeXBlID09IG51bGwgfHwgIWNvbnRhaW5zRnJlZUZ1bmN0aW9uVHlwZVZhcmlhYmxlcyhyZXR1cm5UeXBlKSwKICAgICAgICAiUmV0dXJuIHR5cGUgJHJldHVyblR5cGUgY29udGFpbnMgZnJlZSB2YXJpYWJsZXMuIgogICAgICAgICJQcm92aWRlZCBmdW5jdGlvbiB0eXBlOiAkY2FsbGVlVHlwZS4iKTsKICAgIGludCBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQgPSBnZXRFeHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQoYXJndW1lbnRzKTsKICAgIGlmIChleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQgIT0gMCkgewogICAgICBhc3NlcnQocmV0dXJuVHlwZSA9PSBudWxsLAogICAgICAgICAgIlVuZXhwZWN0ZWQgZXhwbGljaXQgcmV0dXJuIHR5cGUgZm9yIGV4dGVuc2lvbiBtZXRob2QgaW52b2NhdGlvbi4iKTsKICAgICAgcmV0dXJuIF9pbmZlckdlbmVyaWNFeHRlbnNpb25NZXRob2RJbnZvY2F0aW9uKGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgIHR5cGVDb250ZXh0LCBvZmZzZXQsIGNhbGxlZVR5cGUsIGFyZ3VtZW50cywgdGFyZ2V0TmFtZSwKICAgICAgICAgIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yLAogICAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUsCiAgICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlLAogICAgICAgICAgaXNDb25zdDogaXNDb25zdCwKICAgICAgICAgIGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXI6IGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXIpOwogICAgfQogICAgcmV0dXJuIF9pbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsIG9mZnNldCwgY2FsbGVlVHlwZSwgYXJndW1lbnRzLCB0YXJnZXROYW1lLAogICAgICAgIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yLAogICAgICAgIHJlY2VpdmVyVHlwZTogcmVjZWl2ZXJUeXBlLAogICAgICAgIHJldHVyblR5cGU6IHJldHVyblR5cGUsCiAgICAgICAgc2tpcFR5cGVBcmd1bWVudEluZmVyZW5jZTogc2tpcFR5cGVBcmd1bWVudEluZmVyZW5jZSwKICAgICAgICBpc0NvbnN0OiBpc0NvbnN0LAogICAgICAgIGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXI6IGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXIpOwogIH0KCiAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCBfaW5mZXJHZW5lcmljRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbigKICAgICAgaW50IGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgRGFydFR5cGUgdHlwZUNvbnRleHQsCiAgICAgIGludCBvZmZzZXQsCiAgICAgIEZ1bmN0aW9uVHlwZSBjYWxsZWVUeXBlLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBOb2RlIHRhcmdldE5hbWUsCiAgICAgIHtib29sIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogZmFsc2UsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgYm9vbCBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ltcGxpY2l0RXh0ZW5zaW9uTWVtYmVyOiBmYWxzZX0pIHsKICAgIEZ1bmN0aW9uVHlwZSBleHRlbnNpb25GdW5jdGlvblR5cGUgPSBuZXcgRnVuY3Rpb25UeXBlKAogICAgICAgIFtjYWxsZWVUeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmZpcnN0XSwKICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLAogICAgICAgIGxpYnJhcnkubm9uTnVsbGFibGUsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogMSwKICAgICAgICB0eXBlUGFyYW1ldGVyczogY2FsbGVlVHlwZS50eXBlUGFyYW1ldGVycwogICAgICAgICAgICAudGFrZShleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQpCiAgICAgICAgICAgIC50b0xpc3QoKSk7CiAgICBBcmd1bWVudHMgZXh0ZW5zaW9uQXJndW1lbnRzID0gZW5naW5lLmZvcmVzdC5jcmVhdGVBcmd1bWVudHMoCiAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQsIFthcmd1bWVudHMucG9zaXRpb25hbC5maXJzdF0sCiAgICAgICAgdHlwZXM6IGdldEV4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpKTsKICAgIF9pbmZlckludm9jYXRpb24oY29uc3QgVW5rbm93blR5cGUoKSwgb2Zmc2V0LCBleHRlbnNpb25GdW5jdGlvblR5cGUsCiAgICAgICAgZXh0ZW5zaW9uQXJndW1lbnRzLCB0YXJnZXROYW1lLAogICAgICAgIHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2U6IHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2UsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUsCiAgICAgICAgaXNJbXBsaWNpdEV4dGVuc2lvbk1lbWJlcjogaXNJbXBsaWNpdEV4dGVuc2lvbk1lbWJlcik7CiAgICBTdWJzdGl0dXRpb24gZXh0ZW5zaW9uU3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICBleHRlbnNpb25GdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnMsIGV4dGVuc2lvbkFyZ3VtZW50cy50eXBlcyk7CgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0YXJnZXRUeXBlUGFyYW1ldGVycyA9IGNvbnN0IDxUeXBlUGFyYW1ldGVyPltdOwogICAgaWYgKGNhbGxlZVR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50KSB7CiAgICAgIHRhcmdldFR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgIGNhbGxlZVR5cGUudHlwZVBhcmFtZXRlcnMuc2tpcChleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQpLnRvTGlzdCgpOwogICAgfQogICAgRnVuY3Rpb25UeXBlIHRhcmdldEZ1bmN0aW9uVHlwZSA9IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgY2FsbGVlVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5za2lwKDEpLnRvTGlzdCgpLAogICAgICAgIGNhbGxlZVR5cGUucmV0dXJuVHlwZSwKICAgICAgICBsaWJyYXJ5Lm5vbk51bGxhYmxlLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IGNhbGxlZVR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAtIDEsCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBjYWxsZWVUeXBlLm5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogdGFyZ2V0VHlwZVBhcmFtZXRlcnMpOwogICAgdGFyZ2V0RnVuY3Rpb25UeXBlID0KICAgICAgICBleHRlbnNpb25TdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodGFyZ2V0RnVuY3Rpb25UeXBlKTsKICAgIEFyZ3VtZW50cyB0YXJnZXRBcmd1bWVudHMgPSBlbmdpbmUuZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cygKICAgICAgICBhcmd1bWVudHMuZmlsZU9mZnNldCwgYXJndW1lbnRzLnBvc2l0aW9uYWwuc2tpcCgxKS50b0xpc3QoKSwKICAgICAgICBuYW1lZDogYXJndW1lbnRzLm5hbWVkLCB0eXBlczogZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykpOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBfaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIHR5cGVDb250ZXh0LCBvZmZzZXQsIHRhcmdldEZ1bmN0aW9uVHlwZSwgdGFyZ2V0QXJndW1lbnRzLCB0YXJnZXROYW1lLAogICAgICAgIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcjogaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yLAogICAgICAgIHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2U6IHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2UsCiAgICAgICAgaXNDb25zdDogaXNDb25zdCk7CiAgICBhcmd1bWVudHMucG9zaXRpb25hbC5jbGVhcigpOwogICAgYXJndW1lbnRzLnBvc2l0aW9uYWwuYWRkQWxsKGV4dGVuc2lvbkFyZ3VtZW50cy5wb3NpdGlvbmFsKTsKICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmFkZEFsbCh0YXJnZXRBcmd1bWVudHMucG9zaXRpb25hbCk7CiAgICBzZXRQYXJlbnRzKGFyZ3VtZW50cy5wb3NpdGlvbmFsLCBhcmd1bWVudHMpOwogICAgLy8gVGhlIGB0YXJnZXRBcmd1bWVudHMubmFtZWRgIGlzIHRoZSBzYW1lIGxpc3QgYXMgYGFyZ3VtZW50cy5uYW1lZGAgc28KICAgIC8vIHdlIGp1c3QgbmVlZCB0byBlbnN1cmUgdGhhdCBwYXJlbnQgcmVsYXRpb25zIGFyZSByZWFsaWduZWQuCiAgICBzZXRQYXJlbnRzKGFyZ3VtZW50cy5uYW1lZCwgYXJndW1lbnRzKTsKICAgIGFyZ3VtZW50cy50eXBlcy5jbGVhcigpOwogICAgYXJndW1lbnRzLnR5cGVzLmFkZEFsbChleHRlbnNpb25Bcmd1bWVudHMudHlwZXMpOwogICAgYXJndW1lbnRzLnR5cGVzLmFkZEFsbCh0YXJnZXRBcmd1bWVudHMudHlwZXMpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBQZXJmb3JtcyB0aGUgdHlwZSBpbmZlcmVuY2Ugc3RlcHMgdGhhdCBhcmUgc2hhcmVkIGJ5IGFsbCBraW5kcyBvZgogIC8vLyBpbnZvY2F0aW9ucyAoY29uc3RydWN0b3JzLCBpbnN0YW5jZSBtZXRob2RzLCBhbmQgc3RhdGljIG1ldGhvZHMpLgogIEludm9jYXRpb25JbmZlcmVuY2VSZXN1bHQgX2luZmVySW52b2NhdGlvbihEYXJ0VHlwZSB0eXBlQ29udGV4dCwgaW50IG9mZnNldCwKICAgICAgRnVuY3Rpb25UeXBlIGNhbGxlZVR5cGUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIE5hbWUgdGFyZ2V0TmFtZSwKICAgICAge2Jvb2wgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yOiBmYWxzZSwKICAgICAgYm9vbCBpc0JpbmFyeU9wZXJhdG9yOiBmYWxzZSwKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBEYXJ0VHlwZSByZXR1cm5UeXBlLAogICAgICBib29sIHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2U6IGZhbHNlLAogICAgICBib29sIGlzQ29uc3Q6IGZhbHNlLAogICAgICBib29sIGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXI6IGZhbHNlfSkgewogICAgYXNzZXJ0KAogICAgICAgIHJldHVyblR5cGUgPT0gbnVsbCB8fCAhY29udGFpbnNGcmVlRnVuY3Rpb25UeXBlVmFyaWFibGVzKHJldHVyblR5cGUpLAogICAgICAgICJSZXR1cm4gdHlwZSAkcmV0dXJuVHlwZSBjb250YWlucyBmcmVlIHZhcmlhYmxlcy4iCiAgICAgICAgIlByb3ZpZGVkIGZ1bmN0aW9uIHR5cGU6ICRjYWxsZWVUeXBlLiIpOwogICAgbGFzdEluZmVycmVkU3Vic3RpdHV0aW9uID0gbnVsbDsKICAgIGxhc3RDYWxsZWVUeXBlID0gbnVsbDsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gY2FsbGVlVHlwZVBhcmFtZXRlcnMgPSBjYWxsZWVUeXBlLnR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IG9uZSBvZiB0aGUgY2FsbGVlIHR5cGUgcGFyYW1ldGVycyBtaWdodCBtYXRjaCBhIHR5cGUKICAgICAgLy8gdGhhdCBhbHJlYWR5IGV4aXN0cyBhcyBwYXJ0IG9mIGluZmVyZW5jZSAoZS5nLiB0aGUgdHlwZSBvZiBhbgogICAgICAvLyBhcmd1bWVudCkuICBUaGlzIG1pZ2h0IGhhcHBlbiwgZm9yIGluc3RhbmNlLCBpbiB0aGUgY2FzZSB3aGVyZSBhCiAgICAgIC8vIGZ1bmN0aW9uIG9yIG1ldGhvZCBtYWtlcyBhIHJlY3Vyc2l2ZSBjYWxsIHRvIGl0c2VsZi4gIFRvIGF2b2lkIHRoZQogICAgICAvLyBjYWxsZWUgdHlwZSBwYXJhbWV0ZXJzIGFjY2lkZW50YWxseSBtYXRjaGluZyBhIHR5cGUgdGhhdCBhbHJlYWR5CiAgICAgIC8vIGV4aXN0cywgYW5kIGNyZWF0aW5nIGludmFsaWQgaW5mZXJlbmNlIHJlc3VsdHMsIHdlIG5lZWQgdG8gY3JlYXRlIGZyZXNoCiAgICAgIC8vIHR5cGUgcGFyYW1ldGVycyBmb3IgdGhlIGNhbGxlZSAoc2VlIGRhcnRidWcuY29tLzMxNzU5KS4KICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpcyBpdCBwb3NzaWJsZSB0byBmaW5kIGEgbmFycm93ZXIgc2V0IG9mIGNpcmN1bXN0YW5jZXMKICAgICAgLy8gaW4gd2hpY2ggbWUgbXVzdCBkbyB0aGlzLCB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24/CiAgICAgIEZyZXNoVHlwZVBhcmFtZXRlcnMgZnJlc2ggPSBnZXRGcmVzaFR5cGVQYXJhbWV0ZXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzKTsKICAgICAgY2FsbGVlVHlwZSA9IGZyZXNoLmFwcGx5VG9GdW5jdGlvblR5cGUoY2FsbGVlVHlwZSk7CiAgICAgIGlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKICAgICAgICByZXR1cm5UeXBlID0gZnJlc2guc3Vic3RpdHV0ZShyZXR1cm5UeXBlKTsKICAgICAgfQogICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycyA9IGZyZXNoLmZyZXNoVHlwZVBhcmFtZXRlcnM7CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHMgPSBnZXRFeHBsaWNpdFR5cGVBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gIXNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2UgJiYKICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMgPT0gbnVsbCAmJgogICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHk7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaXNUb3BMZXZlbDsKICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXM7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3JtYWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlcyA9IFtdOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpZiAoaXNDb25zdCAmJiB0eXBlQ29udGV4dCAhPSBudWxsKSB7CiAgICAgICAgdHlwZUNvbnRleHQgPQogICAgICAgICAgICBuZXcgVHlwZVZhcmlhYmxlRWxpbWluYXRvcihjb3JlVHlwZXMpLnN1YnN0aXR1dGVUeXBlKHR5cGVDb250ZXh0KTsKICAgICAgfQogICAgICBpbmZlcnJlZFR5cGVzID0gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIHJldHVyblR5cGUgPz8gY2FsbGVlVHlwZS5yZXR1cm5UeXBlLAogICAgICAgICAgY2FsbGVlVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBudWxsLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGxpYnJhcnkubGlicmFyeSk7CiAgICAgIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzLCBpbmZlcnJlZFR5cGVzKTsKICAgIH0gZWxzZSBpZiAoZXhwbGljaXRUeXBlQXJndW1lbnRzICE9IG51bGwgJiYKICAgICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycy5sZW5ndGggPT0gZXhwbGljaXRUeXBlQXJndW1lbnRzLmxlbmd0aCkgewogICAgICBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhjYWxsZWVUeXBlUGFyYW1ldGVycywgZXhwbGljaXRUeXBlQXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAoY2FsbGVlVHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IDApIHsKICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycygKICAgICAgICAgIGNhbGxlZVR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvbnN0IER5bmFtaWNUeXBlKCkpKTsKICAgIH0KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogaWYgd2UgYXJlIGRvaW5nIHRvcCBsZXZlbCBpbmZlcmVuY2UgYW5kIHR5cGUgYXJndW1lbnRzCiAgICAvLyB3ZXJlIG9taXR0ZWQsIHJlcG9ydCBhbiBlcnJvci4KICAgIGZvciAoaW50IHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7IHBvc2l0aW9uKyspIHsKICAgICAgRGFydFR5cGUgZm9ybWFsVHlwZSA9IGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlKGNhbGxlZVR5cGUsIHBvc2l0aW9uKTsKICAgICAgRGFydFR5cGUgaW5mZXJyZWRGb3JtYWxUeXBlID0gc3Vic3RpdHV0aW9uICE9IG51bGwKICAgICAgICAgID8gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGZvcm1hbFR5cGUpCiAgICAgICAgICA6IGZvcm1hbFR5cGU7CiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgICAgaWYgKGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXIgJiYgcG9zaXRpb24gPT0gMCkgewogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgcmVjZWl2ZXJUeXBlICE9IG51bGwsCiAgICAgICAgICAgICJObyByZWNlaXZlciB0eXBlIHByb3ZpZGVkIGZvciBpbXBsaWNpdCBleHRlbnNpb24gbWVtYmVyICIKICAgICAgICAgICAgImludm9jYXRpb24uIik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsW3Bvc2l0aW9uXSwKICAgICAgICAgICAgaW5mZXJyZWRGb3JtYWxUeXBlLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwKICAgICAgICAgICAgICAgIGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvciB8fAogICAgICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWxbcG9zaXRpb25dID0gcmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IGFyZ3VtZW50czsKICAgICAgICBpbmZlcnJlZFR5cGUgPSByZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgICB9CiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICAgIGZvcm1hbFR5cGVzLmFkZChmb3JtYWxUeXBlKTsKICAgICAgICBhY3R1YWxUeXBlcy5hZGQoaW5mZXJyZWRUeXBlKTsKICAgICAgfQogICAgICBpZiAoaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKSB7CiAgICAgICAgcmV0dXJuVHlwZSA9IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5nZXRUeXBlT2ZPdmVybG9hZGVkQXJpdGhtZXRpYygKICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCBpbmZlcnJlZFR5cGUpOwogICAgICB9CiAgICB9CiAgICBmb3IgKE5hbWVkRXhwcmVzc2lvbiBuYW1lZEFyZ3VtZW50IGluIGFyZ3VtZW50cy5uYW1lZCkgewogICAgICBEYXJ0VHlwZSBmb3JtYWxUeXBlID0KICAgICAgICAgIGdldE5hbWVkUGFyYW1ldGVyVHlwZShjYWxsZWVUeXBlLCBuYW1lZEFyZ3VtZW50Lm5hbWUpOwogICAgICBEYXJ0VHlwZSBpbmZlcnJlZEZvcm1hbFR5cGUgPSBzdWJzdGl0dXRpb24gIT0gbnVsbAogICAgICAgICAgPyBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZm9ybWFsVHlwZSkKICAgICAgICAgIDogZm9ybWFsVHlwZTsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBuYW1lZEFyZ3VtZW50LnZhbHVlLAogICAgICAgICAgaW5mZXJyZWRGb3JtYWxUeXBlLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8CiAgICAgICAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yIHx8CiAgICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgIG5hbWVkQXJndW1lbnQudmFsdWUgPSByZXN1bHQuZXhwcmVzc2lvbi4ucGFyZW50ID0gbmFtZWRBcmd1bWVudDsKICAgICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gcmVzdWx0LmluZmVycmVkVHlwZTsKICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgICAgZm9ybWFsVHlwZXMuYWRkKGZvcm1hbFR5cGUpOwogICAgICAgIGFjdHVhbFR5cGVzLmFkZChpbmZlcnJlZFR5cGUpOwogICAgICB9CiAgICB9CgogICAgLy8gQ2hlY2sgZm9yIGFuZCByZW1vdmUgZHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudHMuCiAgICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWQgPSBhcmd1bWVudHMubmFtZWQ7CiAgICBpZiAobmFtZWQubGVuZ3RoID09IDIpIHsKICAgICAgaWYgKG5hbWVkWzBdLm5hbWUgPT0gbmFtZWRbMV0ubmFtZSkgewogICAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRbMV0ubmFtZTsKICAgICAgICBFeHByZXNzaW9uIGVycm9yID0gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICBuYW1lZFsxXS5maWxlT2Zmc2V0LAogICAgICAgICAgICBuYW1lLmxlbmd0aCk7CiAgICAgICAgYXJndW1lbnRzLm5hbWVkID0gW25ldyBOYW1lZEV4cHJlc3Npb24obmFtZWRbMV0ubmFtZSwgZXJyb3IpXTsKICAgICAgICBmb3JtYWxUeXBlcy5yZW1vdmVMYXN0KCk7CiAgICAgICAgYWN0dWFsVHlwZXMucmVtb3ZlTGFzdCgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG5hbWVkLmxlbmd0aCA+IDIpIHsKICAgICAgTWFwPFN0cmluZywgTmFtZWRFeHByZXNzaW9uPiBzZWVuTmFtZXMgPSA8U3RyaW5nLCBOYW1lZEV4cHJlc3Npb24+e307CiAgICAgIGJvb2wgaGFzUHJvYmxlbSA9IGZhbHNlOwogICAgICBpbnQgbmFtZWRUeXBlSW5kZXggPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7CiAgICAgIExpc3Q8TmFtZWRFeHByZXNzaW9uPiB1bmlxdWVOYW1lZCA9IDxOYW1lZEV4cHJlc3Npb24+W107CiAgICAgIGZvciAoTmFtZWRFeHByZXNzaW9uIGV4cHJlc3Npb24gaW4gbmFtZWQpIHsKICAgICAgICBTdHJpbmcgbmFtZSA9IGV4cHJlc3Npb24ubmFtZTsKICAgICAgICBpZiAoc2Vlbk5hbWVzLmNvbnRhaW5zS2V5KG5hbWUpKSB7CiAgICAgICAgICBoYXNQcm9ibGVtID0gdHJ1ZTsKICAgICAgICAgIE5hbWVkRXhwcmVzc2lvbiBwcmV2TmFtZWRFeHByZXNzaW9uID0gc2Vlbk5hbWVzW25hbWVdOwogICAgICAgICAgcHJldk5hbWVkRXhwcmVzc2lvbi52YWx1ZSA9IGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICBuYW1lLmxlbmd0aCkKICAgICAgICAgICAgLi5wYXJlbnQgPSBwcmV2TmFtZWRFeHByZXNzaW9uOwogICAgICAgICAgZm9ybWFsVHlwZXMucmVtb3ZlQXQobmFtZWRUeXBlSW5kZXgpOwogICAgICAgICAgYWN0dWFsVHlwZXMucmVtb3ZlQXQobmFtZWRUeXBlSW5kZXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZWVuTmFtZXNbbmFtZV0gPSBleHByZXNzaW9uOwogICAgICAgICAgdW5pcXVlTmFtZWQuYWRkKGV4cHJlc3Npb24pOwogICAgICAgICAgbmFtZWRUeXBlSW5kZXgrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGhhc1Byb2JsZW0pIHsKICAgICAgICBhcmd1bWVudHMubmFtZWQgPSB1bmlxdWVOYW1lZDsKICAgICAgfQogICAgfQoKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKAogICAgICAgICAgcmV0dXJuVHlwZSA/PyBjYWxsZWVUeXBlLnJldHVyblR5cGUsCiAgICAgICAgICBjYWxsZWVUeXBlUGFyYW1ldGVycywKICAgICAgICAgIGZvcm1hbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgIGluZmVycmVkVHlwZXMsCiAgICAgICAgICBsaWJyYXJ5LmxpYnJhcnkpOwogICAgICBhc3NlcnQoaW5mZXJyZWRUeXBlcy5ldmVyeSgodHlwZSkgPT4gaXNLbm93bih0eXBlKSksCiAgICAgICAgICAiVW5rbm93biB0eXBlKHMpIGluIGluZmVycmVkIHR5cGVzOiAkaW5mZXJyZWRUeXBlcy4iKTsKICAgICAgYXNzZXJ0KGluZmVycmVkVHlwZXMuZXZlcnkoKHR5cGUpID0+ICFoYXNQcm9tb3RlZFR5cGVWYXJpYWJsZSh0eXBlKSksCiAgICAgICAgICAiUHJvbW90ZWQgdHlwZSB2YXJpYWJsZShzKSBpbiBpbmZlcnJlZCB0eXBlczogJGluZmVycmVkVHlwZXMuIik7CiAgICAgIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGNhbGxlZVR5cGVQYXJhbWV0ZXJzLCBpbmZlcnJlZFR5cGVzKTsKICAgICAgaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQodXJpRm9ySW5zdHJ1bWVudGF0aW9uLCBvZmZzZXQsICd0eXBlQXJncycsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyhpbmZlcnJlZFR5cGVzKSk7CiAgICAgIGFyZ3VtZW50cy50eXBlcy5jbGVhcigpOwogICAgICBhcmd1bWVudHMudHlwZXMuYWRkQWxsKGluZmVycmVkVHlwZXMpOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbEFyZ3VtZW50VHlwZXMgPSBbXTsKICAgIExpc3Q8TmFtZWRUeXBlPiBuYW1lZEFyZ3VtZW50VHlwZXMgPSBbXTsKICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkICYmICFpZGVudGljYWwoY2FsbGVlVHlwZSwgdW5rbm93bkZ1bmN0aW9uKSkgewogICAgICBMb2NhdGVkTWVzc2FnZSBhcmdNZXNzYWdlID0KICAgICAgICAgIGhlbHBlci5jaGVja0FyZ3VtZW50c0ZvclR5cGUoY2FsbGVlVHlwZSwgYXJndW1lbnRzLCBvZmZzZXQpOwogICAgICBpZiAoYXJnTWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIGFyZ01lc3NhZ2UubWVzc2FnZU9iamVjdCwgYXJnTWVzc2FnZS5jaGFyT2Zmc2V0LCBhcmdNZXNzYWdlLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQXJndW1lbnQgY291bnRzIGFuZCBuYW1lcyBtYXRjaC4gQ29tcGFyZSB0eXBlcy4KICAgICAgICBpbnQgbnVtUG9zaXRpb25hbEFyZ3MgPSBhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGg7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgRGFydFR5cGUgZm9ybWFsVHlwZSA9IGZvcm1hbFR5cGVzW2ldOwogICAgICAgICAgRGFydFR5cGUgZXhwZWN0ZWRUeXBlID0gc3Vic3RpdHV0aW9uICE9IG51bGwKICAgICAgICAgICAgICA/IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShmb3JtYWxUeXBlKQogICAgICAgICAgICAgIDogZm9ybWFsVHlwZTsKICAgICAgICAgIERhcnRUeXBlIGFjdHVhbFR5cGUgPSBhY3R1YWxUeXBlc1tpXTsKICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKICAgICAgICAgIE5hbWVkRXhwcmVzc2lvbiBuYW1lZEV4cHJlc3Npb247CiAgICAgICAgICBpZiAoaSA8IG51bVBvc2l0aW9uYWxBcmdzKSB7CiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBhcmd1bWVudHMucG9zaXRpb25hbFtpXTsKICAgICAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50VHlwZXMuYWRkKGFjdHVhbFR5cGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZWRFeHByZXNzaW9uID0gYXJndW1lbnRzLm5hbWVkW2kgLSBudW1Qb3NpdGlvbmFsQXJnc107CiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuYW1lZEV4cHJlc3Npb24udmFsdWU7CiAgICAgICAgICAgIG5hbWVkQXJndW1lbnRUeXBlcwogICAgICAgICAgICAgICAgLmFkZChuZXcgTmFtZWRUeXBlKG5hbWVkRXhwcmVzc2lvbi5uYW1lLCBhY3R1YWxUeXBlKSk7CiAgICAgICAgICB9CiAgICAgICAgICBleHByZXNzaW9uID0gZW5zdXJlQXNzaWduYWJsZShleHBlY3RlZFR5cGUsIGFjdHVhbFR5cGUsIGV4cHJlc3Npb24sCiAgICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogZXhwZWN0ZWRUeXBlIGlzIFZvaWRUeXBlLAogICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwZWNpYWxpemUgbWVzc2FnZSBmb3Igb3BlcmF0b3IKICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucy4KICAgICAgICAgICAgICBlcnJvclRlbXBsYXRlOiB0ZW1wbGF0ZUFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUpOwogICAgICAgICAgaWYgKG5hbWVkRXhwcmVzc2lvbiA9PSBudWxsKSB7CiAgICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsW2ldID0gZXhwcmVzc2lvbi4ucGFyZW50ID0gYXJndW1lbnRzOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmFtZWRFeHByZXNzaW9uLnZhbHVlID0gZXhwcmVzc2lvbi4ucGFyZW50ID0gbmFtZWRFeHByZXNzaW9uOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogICAgbGFzdEluZmVycmVkU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uOwogICAgbGFzdENhbGxlZVR5cGUgPSBjYWxsZWVUeXBlOwogICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICBpbmZlcnJlZFR5cGUgPSBzdWJzdGl0dXRpb24gPT0gbnVsbAogICAgICAgICAgPyByZXR1cm5UeXBlCiAgICAgICAgICA6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShyZXR1cm5UeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgIGNhbGxlZVR5cGUgPQogICAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoY2FsbGVlVHlwZS53aXRob3V0VHlwZVBhcmFtZXRlcnMpOwogICAgICB9CiAgICAgIGluZmVycmVkVHlwZSA9IGNhbGxlZVR5cGUucmV0dXJuVHlwZTsKICAgIH0KICAgIGFzc2VydCgKICAgICAgICAhY29udGFpbnNGcmVlRnVuY3Rpb25UeXBlVmFyaWFibGVzKGluZmVycmVkVHlwZSksCiAgICAgICAgIkluZmVycmVkIHJldHVybiB0eXBlICRpbmZlcnJlZFR5cGUgY29udGFpbnMgZnJlZSB2YXJpYWJsZXMuIgogICAgICAgICJJbmZlcnJlZCBmdW5jdGlvbiB0eXBlOiAkY2FsbGVlVHlwZS4iKTsKCiAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJiBwZXJmb3JtTm5iZENoZWNrcykgewogICAgICBpZiAocmVjZWl2ZXJUeXBlICE9IG51bGwgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUgJiYKICAgICAgICAgICFtYXRjaGVzT2JqZWN0TWVtYmVyQ2FsbCh0YXJnZXROYW1lLCBpbmZlcnJlZFR5cGVzLAogICAgICAgICAgICAgIHBvc2l0aW9uYWxBcmd1bWVudFR5cGVzLCBuYW1lZEFyZ3VtZW50VHlwZXMpKSB7CiAgICAgICAgLy8gVXNlIGxlbmd0aCAxIGZvciAuY2FsbCAtLSBpbiBtb3N0IGNhc2VzIGl0cyBuYW1lIGlzIHNraXBwZWQuCiAgICAgICAgaW50IGVycm9yU3Bhbkxlbmd0aCA9CiAgICAgICAgICAgIHRhcmdldE5hbWUgPT0gY2FsbE5hbWUgPyBub0xlbmd0aCA6IHRhcmdldE5hbWUubmFtZS5sZW5ndGg7CiAgICAgICAgaWYgKG5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFdyYXBJblByb2JsZW1JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICAgICAgaW5mZXJyZWRUeXBlLAogICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVNZXRob2RDYWxsRXJyb3Iud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZS5uYW1lLCByZWNlaXZlclR5cGUsIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgIGVycm9yU3Bhbkxlbmd0aCwKICAgICAgICAgICAgICBoZWxwZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlTWV0aG9kQ2FsbFdhcm5pbmcud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZS5uYW1lLCByZWNlaXZlclR5cGUsIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICBlcnJvclNwYW5MZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXcgU3VjY2Vzc2Z1bEluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUpOwogIH0KCiAgRGFydFR5cGUgaW5mZXJMb2NhbEZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwgRGFydFR5cGUgdHlwZUNvbnRleHQsCiAgICAgIGludCBmaWxlT2Zmc2V0LCBEYXJ0VHlwZSByZXR1cm5Db250ZXh0KSB7CiAgICBib29sIGhhc0ltcGxpY2l0UmV0dXJuVHlwZSA9IGZhbHNlOwogICAgaWYgKHJldHVybkNvbnRleHQgPT0gbnVsbCkgewogICAgICBoYXNJbXBsaWNpdFJldHVyblR5cGUgPSB0cnVlOwogICAgICByZXR1cm5Db250ZXh0ID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICAgIGlmICghaXNUb3BMZXZlbCkgewogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICAgIGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBmbG93QW5hbHlzaXMuaW5pdGlhbGl6ZShwYXJhbWV0ZXIpOwogICAgICAgIGluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKHBhcmFtZXRlciwgcGFyYW1ldGVyLmFubm90YXRpb25zKTsKICAgICAgICBpZiAocGFyYW1ldGVyLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5pdGlhbGl6ZXJSZXN1bHQgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgICAgcGFyYW1ldGVyLmluaXRpYWxpemVyLCBwYXJhbWV0ZXIudHlwZSwgIWlzVG9wTGV2ZWwpOwogICAgICAgICAgcGFyYW1ldGVyLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXJSZXN1bHQuZXhwcmVzc2lvbgogICAgICAgICAgICAuLnBhcmVudCA9IHBhcmFtZXRlcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciBpbiBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBmbG93QW5hbHlzaXMuaW5pdGlhbGl6ZShwYXJhbWV0ZXIpOwogICAgICAgIGluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKHBhcmFtZXRlciwgcGFyYW1ldGVyLmFubm90YXRpb25zKTsKICAgICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluaXRpYWxpemVyUmVzdWx0ID0KICAgICAgICAgICAgaW5mZXJFeHByZXNzaW9uKHBhcmFtZXRlci5pbml0aWFsaXplciwgcGFyYW1ldGVyLnR5cGUsICFpc1RvcExldmVsKTsKICAgICAgICBwYXJhbWV0ZXIuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplclJlc3VsdC5leHByZXNzaW9uCiAgICAgICAgICAuLnBhcmVudCA9IHBhcmFtZXRlcjsKICAgICAgfQogICAgfQoKICAgIC8vIExldCBgPFQwLCAuLi4sIFRuPmAgYmUgdGhlIHNldCBvZiB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGNsb3N1cmUgKHdpdGgKICAgIC8vIGBuYD0wIGlmIHRoZXJlIGFyZSBubyB0eXBlIHBhcmFtZXRlcnMpLgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwoKICAgIC8vIExldCBgKFAwIHgwLCAuLi4sIFBtIHhtKWAgYmUgdGhlIHNldCBvZiBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgY2xvc3VyZQogICAgLy8gKGluY2x1ZGluZyByZXF1aXJlZCwgcG9zaXRpb25hbCBvcHRpb25hbCwgYW5kIG5hbWVkIG9wdGlvbmFsIHBhcmFtZXRlcnMpLgogICAgLy8gSWYgYW55IHR5cGUgYFBpYCBpcyBtaXNzaW5nLCBkZW5vdGUgaXQgYXMgYF9gLgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBmb3JtYWxzID0gZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMudG9MaXN0KCkKICAgICAgLi5hZGRBbGwoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKTsKCiAgICAvLyBMZXQgYEJgIGRlbm90ZSB0aGUgY2xvc3VyZSBib2R5LiAgSWYgYEJgIGlzIGFuIGV4cHJlc3Npb24gZnVuY3Rpb24gYm9keQogICAgLy8gKGA9PiBlYCksIHRyZWF0IGl0IGFzIGVxdWl2YWxlbnQgdG8gYSBibG9jayBmdW5jdGlvbiBib2R5IGNvbnRhaW5pbmcgYQogICAgLy8gc2luZ2xlIGByZXR1cm5gIHN0YXRlbWVudCAoYHsgcmV0dXJuIGU7IH1gKS4KCiAgICAvLyBBdHRlbXB0IHRvIG1hdGNoIGBLYCBhcyBhIGZ1bmN0aW9uIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBjbG9zdXJlICh0aGF0CiAgICAvLyBpcywgb25lIGhhdmluZyBuIHR5cGUgcGFyYW1ldGVycyBhbmQgYSBjb21wYXRpYmxlIHNldCBvZiBmb3JtYWwKICAgIC8vIHBhcmFtZXRlcnMpLiAgSWYgdGhlcmUgaXMgYSBzdWNjZXNzZnVsIG1hdGNoLCBsZXQgYDxTMCwgLi4uLCBTbj5gIGJlIHRoZQogICAgLy8gc2V0IG9mIG1hdGNoZWQgdHlwZSBwYXJhbWV0ZXJzIGFuZCBgKFEwLCAuLi4sIFFtKWAgYmUgdGhlIHNldCBvZiBtYXRjaGVkCiAgICAvLyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgbGV0IGBOYCBiZSB0aGUgcmV0dXJuIHR5cGUuCiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXNGcm9tQ29udGV4dCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChmb3JtYWxzLmxlbmd0aCwgbnVsbCk7CiAgICBpZiAodHlwZUNvbnRleHQgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpIDwgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICBmb3JtYWxUeXBlc0Zyb21Db250ZXh0W2ldID0KICAgICAgICAgICAgICBnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZSh0eXBlQ29udGV4dCwgaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0gPQogICAgICAgICAgICAgIGdldE5hbWVkUGFyYW1ldGVyVHlwZSh0eXBlQ29udGV4dCwgZm9ybWFsc1tpXS5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuQ29udGV4dCA9IHR5cGVDb250ZXh0LnJldHVyblR5cGU7CgogICAgICAvLyBMZXQgYFtUL1NdYCBkZW5vdGUgdGhlIHR5cGUgc3Vic3RpdHV0aW9uIHdoZXJlIGVhY2ggYFNpYCBpcyByZXBsYWNlZAogICAgICAvLyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBUaWAuCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0KICAgICAgICAgIDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQ29udGV4dC50eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHN1YnN0aXR1dGlvbk1hcFt0eXBlQ29udGV4dC50eXBlUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgICBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoCiAgICAgICAgICAgICAgICA/IG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICAgICAgICAgIHR5cGVDb250ZXh0LnR5cGVQYXJhbWV0ZXJzW2ldLCB0eXBlUGFyYW1ldGVyc1tpXSkKICAgICAgICAgICAgICAgIDogY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgfQogICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogICAgfSBlbHNlIHsKICAgICAgLy8gSWYgdGhlIG1hdGNoIGlzIG5vdCBzdWNjZXNzZnVsIGJlY2F1c2UgIGBLYCBpcyBgX2AsIGxldCBhbGwgYFNpYCwgYWxsCiAgICAgIC8vIGBRaWAsIGFuZCBgTmAgYWxsIGJlIGBfYC4KCiAgICAgIC8vIElmIHRoZSBtYXRjaCBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYW55IG90aGVyIHJlYXNvbiwgdGhpcyB3aWxsIHJlc3VsdAogICAgICAvLyBpbiBhIHR5cGUgZXJyb3IsIHNvIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIGNob29zZSB0aGUgYmVzdAogICAgICAvLyBlcnJvciByZWNvdmVyeSBwYXRoLgogICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZW1wdHk7CiAgICB9CgogICAgLy8gRGVmaW5lIGBSaWAgYXMgZm9sbG93czogaWYgYFBpYCBpcyBub3QgYF9gLCBsZXQgYFJpYCBiZSBgUGlgLgogICAgLy8gT3RoZXJ3aXNlLCBpZiBgUWlgIGlzIG5vdCBgX2AsIGxldCBgUmlgIGJlIHRoZSBncmVhdGVzdCBjbG9zdXJlIG9mCiAgICAvLyBgUWlbVC9TXWAgd2l0aCByZXNwZWN0IHRvIGA/YC4gIE90aGVyd2lzZSwgbGV0IGBSaWAgYmUgYGR5bmFtaWNgLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsIGZvcm1hbCA9IGZvcm1hbHNbaV07CiAgICAgIGlmIChmb3JtYWwuaXNJbXBsaWNpdGx5VHlwZWQpIHsKICAgICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CiAgICAgICAgaWYgKGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0gPT0gY29yZVR5cGVzLm51bGxUeXBlKSB7CiAgICAgICAgICBpbmZlcnJlZFR5cGUgPSBjb3JlVHlwZXMub2JqZWN0UmF3VHlwZShsaWJyYXJ5Lm51bGxhYmxlKTsKICAgICAgICB9IGVsc2UgaWYgKGZvcm1hbFR5cGVzRnJvbUNvbnRleHRbaV0gIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gZ3JlYXRlc3RDbG9zdXJlKGNvcmVUeXBlcywKICAgICAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZm9ybWFsVHlwZXNGcm9tQ29udGV4dFtpXSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmZlcnJlZFR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICAgIH0KICAgICAgICBpbnN0cnVtZW50YXRpb24/LnJlY29yZCh1cmlGb3JJbnN0cnVtZW50YXRpb24sIGZvcm1hbC5maWxlT2Zmc2V0LAogICAgICAgICAgICAndHlwZScsIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoaW5mZXJyZWRUeXBlKSk7CiAgICAgICAgZm9ybWFsLnR5cGUgPSBkZW1vdGVUeXBlSW5MaWJyYXJ5KGluZmVycmVkVHlwZSwgbGlicmFyeS5saWJyYXJ5KTsKICAgICAgfQoKICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgcGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgICAvLyBJZiBhIHBhcmFtZXRlciBpcyBhIHBvc2l0aW9uYWwgb3IgbmFtZWQgb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCBpdHMKICAgICAgICAvLyB0eXBlIGlzIHBvdGVudGlhbGx5IG5vbi1udWxsYWJsZSwgaXQgc2hvdWxkIGhhdmUgYW4gaW5pdGlhbGl6ZXIuCiAgICAgICAgYm9vbCBpc09wdGlvbmFsUG9zaXRpb25hbCA9IGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPD0gaSAmJgogICAgICAgICAgICBpIDwgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgICAgIGJvb2wgaXNPcHRpb25hbE5hbWVkID0KICAgICAgICAgICAgaSA+PSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggJiYgIWZvcm1hbC5pc1JlcXVpcmVkOwogICAgICAgIGlmICgoaXNPcHRpb25hbFBvc2l0aW9uYWwgfHwgaXNPcHRpb25hbE5hbWVkKSAmJgogICAgICAgICAgICBmb3JtYWwudHlwZS5pc1BvdGVudGlhbGx5Tm9uTnVsbGFibGUgJiYKICAgICAgICAgICAgIWZvcm1hbC5oYXNEZWNsYXJlZEluaXRpYWxpemVyKSB7CiAgICAgICAgICBpZiAobm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWFsLm5hbWUsIGZvcm1hbC50eXBlLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgIGZvcm1hbC5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgZm9ybWFsLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgbGlicmFyeS5pbXBvcnRVcmkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZwogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWwubmFtZSwgZm9ybWFsLnR5cGUsIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgZm9ybWFsLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgICBsaWJyYXJ5LmltcG9ydFVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgcGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCBmb3JtYWwgaW4gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgLy8gUmVxdWlyZWQgbmFtZWQgcGFyYW1ldGVycyBzaG91bGRuJ3QgaGF2ZSBpbml0aWFsaXplcnMuCiAgICAgICAgaWYgKGZvcm1hbC5pc1JlcXVpcmVkICYmIGZvcm1hbC5oYXNEZWNsYXJlZEluaXRpYWxpemVyKSB7CiAgICAgICAgICBpZiAobm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmb3JtYWwubmFtZSksCiAgICAgICAgICAgICAgICBmb3JtYWwuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIGZvcm1hbC5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpYnJhcnkuaW1wb3J0VXJpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZVdhcm5pbmcKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmb3JtYWwubmFtZSksCiAgICAgICAgICAgICAgICBmb3JtYWwuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIGZvcm1hbC5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgIGxpYnJhcnkuaW1wb3J0VXJpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBMZXQgYE4nYCBiZSBgTltUL1NdYC4gIFRoZSBbQ2xvc3VyZUNvbnRleHRdIGNvbnN0cnVjdG9yIHdpbGwgYWRqdXN0CiAgICAvLyBhY2NvcmRpbmdseSBpZiB0aGUgY2xvc3VyZSBpcyBkZWNsYXJlZCB3aXRoIGBhc3luY2AsIGBhc3luYypgLCBvcgogICAgLy8gYHN5bmMqYC4KICAgIGlmIChyZXR1cm5Db250ZXh0IGlzISBVbmtub3duVHlwZSkgewogICAgICByZXR1cm5Db250ZXh0ID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHJldHVybkNvbnRleHQpOwogICAgfQoKICAgIC8vIEFwcGx5IHR5cGUgaW5mZXJlbmNlIHRvIGBCYCBpbiByZXR1cm4gY29udGV4dCBgTuKAmWAsIHdpdGggYW55IHJlZmVyZW5jZXMKICAgIC8vIHRvIGB4aWAgaW4gYEJgIGhhdmluZyB0eXBlIGBQaWAuICBUaGlzIHByb2R1Y2VzIGBC4oCZYC4KICAgIGJvb2wgbmVlZFRvU2V0UmV0dXJuVHlwZSA9IGhhc0ltcGxpY2l0UmV0dXJuVHlwZTsKICAgIENsb3N1cmVDb250ZXh0IG9sZENsb3N1cmVDb250ZXh0ID0gdGhpcy5jbG9zdXJlQ29udGV4dDsKICAgIENsb3N1cmVDb250ZXh0IGNsb3N1cmVDb250ZXh0ID0gbmV3IENsb3N1cmVDb250ZXh0KAogICAgICAgIHRoaXMsIGZ1bmN0aW9uLmFzeW5jTWFya2VyLCByZXR1cm5Db250ZXh0LCBuZWVkVG9TZXRSZXR1cm5UeXBlKTsKICAgIHRoaXMuY2xvc3VyZUNvbnRleHQgPSBjbG9zdXJlQ29udGV4dDsKICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0gaW5mZXJTdGF0ZW1lbnQoZnVuY3Rpb24uYm9keSk7CiAgICBpZiAoYm9keVJlc3VsdC5oYXNDaGFuZ2VkKSB7CiAgICAgIGZ1bmN0aW9uLmJvZHkgPSBib2R5UmVzdWx0LnN0YXRlbWVudC4ucGFyZW50ID0gZnVuY3Rpb247CiAgICB9CgogICAgLy8gSWYgdGhlIGNsb3N1cmUgaXMgZGVjbGFyZWQgd2l0aCBgYXN5bmMqYCBvciBgc3luYypgLCBsZXQgYE1gIGJlIHRoZQogICAgLy8gbGVhc3QgdXBwZXIgYm91bmQgb2YgdGhlIHR5cGVzIG9mIHRoZSBgeWllbGRgIGV4cHJlc3Npb25zIGluIGBC4oCZYCwgb3IKICAgIC8vIGB2b2lkYCBpZiBgQuKAmWAgY29udGFpbnMgbm8gYHlpZWxkYCBleHByZXNzaW9ucy4gIE90aGVyd2lzZSwgbGV0IGBNYCBiZQogICAgLy8gdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIHRoZSB0eXBlcyBvZiB0aGUgYHJldHVybmAgZXhwcmVzc2lvbnMgaW4gYELigJlgLAogICAgLy8gb3IgYHZvaWRgIGlmIGBC4oCZYCBjb250YWlucyBubyBgcmV0dXJuYCBleHByZXNzaW9ucy4KICAgIERhcnRUeXBlIGluZmVycmVkUmV0dXJuVHlwZTsKICAgIGlmIChuZWVkVG9TZXRSZXR1cm5UeXBlKSB7CiAgICAgIGluZmVycmVkUmV0dXJuVHlwZSA9IGNsb3N1cmVDb250ZXh0LmluZmVyUmV0dXJuVHlwZSh0aGlzKTsKICAgIH0KCiAgICAvLyBUaGVuIHRoZSByZXN1bHQgb2YgaW5mZXJlbmNlIGlzIGA8VDAsIC4uLiwgVG4+KFIwIHgwLCAuLi4sIFJuIHhuKSBCYCB3aXRoCiAgICAvLyB0eXBlIGA8VDAsIC4uLiwgVG4+KFIwLCAuLi4sIFJuKSAtPiBN4oCZYCAod2l0aCBzb21lIG9mIHRoZSBgUmlgIGFuZCBgeGlgCiAgICAvLyBkZW5vdGVkIGFzIG9wdGlvbmFsIG9yIG5hbWVkIHBhcmFtZXRlcnMsIGlmIGFwcHJvcHJpYXRlKS4KICAgIGlmIChuZWVkVG9TZXRSZXR1cm5UeXBlKSB7CiAgICAgIGluc3RydW1lbnRhdGlvbj8ucmVjb3JkKHVyaUZvckluc3RydW1lbnRhdGlvbiwgZmlsZU9mZnNldCwgJ3JldHVyblR5cGUnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShpbmZlcnJlZFJldHVyblR5cGUpKTsKICAgICAgZnVuY3Rpb24ucmV0dXJuVHlwZSA9IGluZmVycmVkUmV0dXJuVHlwZTsKICAgIH0KICAgIHRoaXMuY2xvc3VyZUNvbnRleHQgPSBvbGRDbG9zdXJlQ29udGV4dDsKICAgIHJldHVybiBmdW5jdGlvbi5jb21wdXRlRnVuY3Rpb25UeXBlKGxpYnJhcnkubm9uTnVsbGFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbmZlck1ldGFkYXRhKAogICAgICBJbmZlcmVuY2VIZWxwZXIgaGVscGVyLCBUcmVlTm9kZSBwYXJlbnQsIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMpIHsKICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CiAgICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgICBpbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcihwYXJlbnQsIGFubm90YXRpb25zKTsKICAgICAgdGhpcy5oZWxwZXIgPSBudWxsOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBpbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcigKICAgICAgVHJlZU5vZGUgcGFyZW50LCBMaXN0PEV4cHJlc3Npb24+IGFubm90YXRpb25zKSB7CiAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYW5ub3RhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgIGFubm90YXRpb25zW2luZGV4XSwgY29uc3QgVW5rbm93blR5cGUoKSwgIWlzVG9wTGV2ZWwpOwogICAgICAgIGFubm90YXRpb25zW2luZGV4XSA9IHJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIH0KICAgIH0KICB9CgogIFN0YXRpY0ludm9jYXRpb24gdHJhbnNmb3JtRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbihpbnQgZmlsZU9mZnNldCwKICAgICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCwgRXhwcmVzc2lvbiByZWNlaXZlciwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgYXNzZXJ0KHRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcik7CiAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gdGFyZ2V0Lm1lbWJlcjsKICAgIHJldHVybiBlbmdpbmUuZm9yZXN0LmNyZWF0ZVN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICB0YXJnZXQubWVtYmVyLAogICAgICAgIGVuZ2luZS5mb3Jlc3QuY3JlYXRlQXJndW1lbnRzRm9yRXh0ZW5zaW9uTWV0aG9kKAogICAgICAgICAgICBhcmd1bWVudHMuZmlsZU9mZnNldCwKICAgICAgICAgICAgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgICAgIHByb2NlZHVyZS5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGggLQogICAgICAgICAgICAgICAgdGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgICAgIHJlY2VpdmVyLAogICAgICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRzOiB0YXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzLAogICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzOiBhcmd1bWVudHMucG9zaXRpb25hbCwKICAgICAgICAgICAgbmFtZWRBcmd1bWVudHM6IGFyZ3VtZW50cy5uYW1lZCwKICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogYXJndW1lbnRzLnR5cGVzKSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IF9pbmZlckR5bmFtaWNJbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBOYW1lIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBJbnZvY2F0aW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwgZmlsZU9mZnNldCwgdW5rbm93bkZ1bmN0aW9uLCBhcmd1bWVudHMsIG5hbWUsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiBjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgIGFzc2VydChuYW1lICE9IGVxdWFsc05hbWUpOwogICAgcmV0dXJuIGNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgcmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICByZXN1bHQuYXBwbHlSZXN1bHQobmV3IE1ldGhvZEludm9jYXRpb24ocmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cykKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpLAogICAgICAgIG51bGxBd2FyZUd1YXJkcyk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IF9pbmZlck5ldmVySW52b2NhdGlvbigKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcywKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgTmV2ZXJUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgTmFtZSBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsIGZpbGVPZmZzZXQsIHVua25vd25GdW5jdGlvbiwgYXJndW1lbnRzLCBuYW1lLAogICAgICAgIHJlY2VpdmVyVHlwZTogcmVjZWl2ZXJUeXBlKTsKICAgIGFzc2VydChuYW1lICE9IGVxdWFsc05hbWUpOwogICAgcmV0dXJuIGNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgcmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICByZXN1bHQuYXBwbHlSZXN1bHQobmV3IE1ldGhvZEludm9jYXRpb24ocmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cykKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpLAogICAgICAgIG51bGxBd2FyZUd1YXJkcyk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IF9pbmZlck1pc3NpbmdJbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsCiAgICAgIE5hbWUgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgRGFydFR5cGUgdHlwZUNvbnRleHQsCiAgICAgIHtib29sIGlzRXhwcmVzc2lvbkludm9jYXRpb259KSB7CiAgICBhc3NlcnQoaXNFeHByZXNzaW9uSW52b2NhdGlvbiAhPSBudWxsKTsKICAgIEV4cHJlc3Npb24gZXJyb3IgPSBjcmVhdGVNaXNzaW5nTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBmaWxlT2Zmc2V0LCByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCBuYW1lLCBhcmd1bWVudHMsCiAgICAgICAgaXNFeHByZXNzaW9uSW52b2NhdGlvbjogaXNFeHByZXNzaW9uSW52b2NhdGlvbik7CiAgICBpbmZlckludm9jYXRpb24odHlwZUNvbnRleHQsIGZpbGVPZmZzZXQsIHVua25vd25GdW5jdGlvbiwgYXJndW1lbnRzLCBuYW1lLAogICAgICAgIHJlY2VpdmVyVHlwZTogcmVjZWl2ZXJUeXBlKTsKICAgIGFzc2VydChuYW1lICE9IGVxdWFsc05hbWUpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIEludmFsaWRUeXBlIGluc3RlYWQuCiAgICByZXR1cm4gY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLCBlcnJvciwgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgX2luZmVyRXh0ZW5zaW9uSW52b2NhdGlvbigKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcywKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0LAogICAgICBOYW1lIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBhc3NlcnQodGFyZ2V0LmlzRXh0ZW5zaW9uTWVtYmVyKTsKICAgIERhcnRUeXBlIGNhbGxlZVR5cGUgPSBnZXRHZXR0ZXJUeXBlKHRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUodGFyZ2V0LCByZWNlaXZlclR5cGUpOwoKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IERpc2FsbG93IGFsbCBpbXBsaWNpdCBub24tZnVuY3Rpb24gY2FsbHM/CiAgICBpZiAoY2FsbGVlVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAhKGNhbGxlZVR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICBjYWxsZWVUeXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzcykgJiYKICAgICAgICBpZGVudGljYWwoZnVuY3Rpb25UeXBlLCB1bmtub3duRnVuY3Rpb24pKSB7CiAgICAgIEV4cHJlc3Npb24gZXJyb3IgPSBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIGEgZGlmZmVyZW50IG1lc3NhZ2UgZm9yIGltcGxpY2l0IC5jYWxsLgogICAgICAgICAgdGVtcGxhdGVJbnZva2VOb25GdW5jdGlvbi53aXRoQXJndW1lbnRzKG5hbWUubmFtZSksCiAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgRHluYW1pY1R5cGUoKSwgZXJyb3IpOwogICAgfQogICAgU3RhdGljSW52b2NhdGlvbiBzdGF0aWNJbnZvY2F0aW9uID0gdHJhbnNmb3JtRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBmaWxlT2Zmc2V0LCB0YXJnZXQsIHJlY2VpdmVyLCBhcmd1bWVudHMpOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsIGZpbGVPZmZzZXQsIGZ1bmN0aW9uVHlwZSwgc3RhdGljSW52b2NhdGlvbi5hcmd1bWVudHMsIG5hbWUsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUsIGlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXI6IHRydWUpOwogICAgaWYgKCFpc1RvcExldmVsKSB7CiAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJblN0YXRpY0ludm9jYXRpb24oc3RhdGljSW52b2NhdGlvbiwKICAgICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudCwgaGVscGVyLnVyaSwgZ2V0VHlwZUFyZ3VtZW50c0luZm8oYXJndW1lbnRzKSk7CiAgICB9CiAgICByZXR1cm4gY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChyZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgIHJlc3VsdC5hcHBseVJlc3VsdChzdGF0aWNJbnZvY2F0aW9uKSwgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgX2luZmVyRnVuY3Rpb25JbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBhc3NlcnQodGFyZ2V0LmlzQ2FsbEZ1bmN0aW9uKTsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUodGFyZ2V0LCByZWNlaXZlclR5cGUpOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsIGZpbGVPZmZzZXQsIGZ1bmN0aW9uVHlwZSwgYXJndW1lbnRzLCBjYWxsTmFtZSwKICAgICAgICByZWNlaXZlclR5cGU6IHJlY2VpdmVyVHlwZSk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBDaGVjayB0aGF0IHR5cGUgYXJndW1lbnRzIGFnYWluc3QgdGhlIGJvdW5kcy4KICAgIHJldHVybiBjcmVhdGVOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHJlc3VsdC5pbmZlcnJlZFR5cGUsCiAgICAgICAgcmVzdWx0LmFwcGx5UmVzdWx0KG5ldyBNZXRob2RJbnZvY2F0aW9uKHJlY2VpdmVyLCBjYWxsTmFtZSwgYXJndW1lbnRzKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCksCiAgICAgICAgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgX2luZmVySW5zdGFuY2VNZXRob2RJbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBhc3NlcnQodGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgUHJvY2VkdXJlIG1ldGhvZCA9IHRhcmdldC5tZW1iZXI7CiAgICBhc3NlcnQobWV0aG9kLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QsCiAgICAgICAgIlVuZXhwZWN0ZWQgaW5zdGFuY2UgbWV0aG9kICRtZXRob2QiKTsKICAgIE5hbWUgbWV0aG9kTmFtZSA9IG1ldGhvZC5uYW1lOwoKICAgIGlmIChyZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICBGdW5jdGlvbk5vZGUgc2lnbmF0dXJlID0gbWV0aG9kLmZ1bmN0aW9uOwogICAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoIDwgc2lnbmF0dXJlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgfHwKICAgICAgICAgIGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+IHNpZ25hdHVyZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICB0YXJnZXQgPSBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQudW5yZXNvbHZlZCgpOwogICAgICAgIG1ldGhvZCA9IG51bGw7CiAgICAgIH0KICAgICAgZm9yIChOYW1lZEV4cHJlc3Npb24gYXJndW1lbnQgaW4gYXJndW1lbnRzLm5hbWVkKSB7CiAgICAgICAgaWYgKCFzaWduYXR1cmUubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgICAgIC5hbnkoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5uYW1lID09IGFyZ3VtZW50Lm5hbWUpKSB7CiAgICAgICAgICB0YXJnZXQgPSBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQudW5yZXNvbHZlZCgpOwogICAgICAgICAgbWV0aG9kID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmIG1ldGhvZCAhPSBudWxsKSB7CiAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmlGb3JJbnN0cnVtZW50YXRpb24sIGZpbGVPZmZzZXQsICd0YXJnZXQnLAogICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JNZW1iZXIobWV0aG9kKSk7CiAgICAgIH0KICAgIH0KCiAgICBEYXJ0VHlwZSBjYWxsZWVUeXBlID0gZ2V0R2V0dGVyVHlwZSh0YXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gZ2V0RnVuY3Rpb25UeXBlKHRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKCiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWZhY3RvciB0byBhdm9pZCB0aGlzIHRlc3QgaW4gbXVsdGlwbGUgcGxhY2VzLAogICAgLy8gZWl0aGVyIGJ5IHByb3ZpZGluZyBhIHNoYXJlZCBoZWxwZXIgbWV0aG9kIG9yIGF2b2lkaW5nIHRoZSBjYWxsZWVUeXBlLwogICAgLy8gZnVuY3Rpb25UeXBlIGRpc3RpbmN0aW9uIGFsdG9nZXRoZXIuCiAgICBpZiAoIXRhcmdldC5pc1VucmVzb2x2ZWQgJiYKICAgICAgICBjYWxsZWVUeXBlIGlzISBEeW5hbWljVHlwZSAmJgogICAgICAgICEoY2FsbGVlVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgIGNhbGxlZVR5cGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzKSAmJgogICAgICAgIGlkZW50aWNhbChmdW5jdGlvblR5cGUsIHVua25vd25GdW5jdGlvbikpIHsKICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uLndpdGhBcmd1bWVudHMobWV0aG9kTmFtZS5uYW1lKSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChjb25zdCBEeW5hbWljVHlwZSgpLCBlcnJvcik7CiAgICB9CiAgICBib29sIGNvbnRyYXZhcmlhbnRDaGVjayA9IGZhbHNlOwogICAgaWYgKHJlY2VpdmVyIGlzISBUaGlzRXhwcmVzc2lvbiAmJgogICAgICAgIG1ldGhvZCAhPSBudWxsICYmCiAgICAgICAgcmV0dXJuZWRUeXBlUGFyYW1ldGVyc09jY3VyTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgIG1ldGhvZC5lbmNsb3NpbmdDbGFzcywgbWV0aG9kLmZ1bmN0aW9uLnJldHVyblR5cGUpKSB7CiAgICAgIGNvbnRyYXZhcmlhbnRDaGVjayA9IHRydWU7CiAgICB9CiAgICBJbnZvY2F0aW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwgZmlsZU9mZnNldCwgZnVuY3Rpb25UeXBlLCBhcmd1bWVudHMsIHRhcmdldC5tZW1iZXI/Lm5hbWUsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQ7CiAgICBpZiAoY29udHJhdmFyaWFudENoZWNrKSB7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1lcmdlIHdpdGggdGhlIHJlcGxhY2VtZW50IGNvbXB1dGF0aW9uIGJlbG93LgogICAgICByZXBsYWNlbWVudCA9IG5ldyBBc0V4cHJlc3Npb24oCiAgICAgICAgICBuZXcgTWV0aG9kSW52b2NhdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgYXJndW1lbnRzLCBtZXRob2QpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICByZXN1bHQuaW5mZXJyZWRUeXBlKQogICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgLi5pc0NvdmFyaWFuY2VDaGVjayA9IHRydWUKICAgICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSBpc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgaWYgKGluc3RydW1lbnRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgaW50IG9mZnNldCA9CiAgICAgICAgICAgIGFyZ3VtZW50cy5maWxlT2Zmc2V0ID09IC0xID8gZmlsZU9mZnNldCA6IGFyZ3VtZW50cy5maWxlT2Zmc2V0OwogICAgICAgIGluc3RydW1lbnRhdGlvbi5yZWNvcmQodXJpRm9ySW5zdHJ1bWVudGF0aW9uLCBvZmZzZXQsICdjaGVja1JldHVybicsCiAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUocmVzdWx0LmluZmVycmVkVHlwZSkpOwogICAgICB9CiAgICB9CgogICAgX2NoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9uKAogICAgICAgIHRhcmdldCwgcmVjZWl2ZXJUeXBlLCBjYWxsZWVUeXBlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGZpbGVPZmZzZXQpOwoKICAgIHJlcGxhY2VtZW50ID8/PQogICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIG1ldGhvZCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CgogICAgcmV0dXJuIGNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgcmVzdWx0LmluZmVycmVkVHlwZSwgcmVzdWx0LmFwcGx5UmVzdWx0KHJlcGxhY2VtZW50KSwgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgX2luZmVySW5zdGFuY2VHZXR0ZXJJbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0LAogICAgICB7Ym9vbCBpc0V4cHJlc3Npb25JbnZvY2F0aW9ufSkgewogICAgYXNzZXJ0KGlzRXhwcmVzc2lvbkludm9jYXRpb24gIT0gbnVsbCk7CiAgICBhc3NlcnQodGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgUHJvY2VkdXJlIGdldHRlciA9IHRhcmdldC5tZW1iZXI7CiAgICBhc3NlcnQoZ2V0dGVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpOwoKICAgIGlmIChyZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSAmJiBnZXR0ZXIgaXMgUHJvY2VkdXJlKSB7CiAgICAgIEZ1bmN0aW9uTm9kZSBzaWduYXR1cmUgPSBnZXR0ZXIuZnVuY3Rpb247CiAgICAgIGlmIChhcmd1bWVudHMucG9zaXRpb25hbC5sZW5ndGggPCBzaWduYXR1cmUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCB8fAogICAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoID4gc2lnbmF0dXJlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgIHRhcmdldCA9IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC51bnJlc29sdmVkKCk7CiAgICAgICAgZ2V0dGVyID0gbnVsbDsKICAgICAgfQogICAgICBmb3IgKE5hbWVkRXhwcmVzc2lvbiBhcmd1bWVudCBpbiBhcmd1bWVudHMubmFtZWQpIHsKICAgICAgICBpZiAoIXNpZ25hdHVyZS5uYW1lZFBhcmFtZXRlcnMKICAgICAgICAgICAgLmFueSgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLm5hbWUgPT0gYXJndW1lbnQubmFtZSkpIHsKICAgICAgICAgIHRhcmdldCA9IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC51bnJlc29sdmVkKCk7CiAgICAgICAgICBnZXR0ZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uICE9IG51bGwgJiYgZ2V0dGVyICE9IG51bGwpIHsKICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaUZvckluc3RydW1lbnRhdGlvbiwgZmlsZU9mZnNldCwgJ3RhcmdldCcsCiAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihnZXR0ZXIpKTsKICAgICAgfQogICAgfQoKICAgIERhcnRUeXBlIGNhbGxlZVR5cGUgPSBnZXRHZXR0ZXJUeXBlKHRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGVGb3JJbXBsaWNpdENhbGwoY2FsbGVlVHlwZSk7CgogICAgaWYgKCF0YXJnZXQuaXNVbnJlc29sdmVkICYmCiAgICAgICAgY2FsbGVlVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAhKGNhbGxlZVR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgICBjYWxsZWVUeXBlLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzcykgJiYKICAgICAgICBpZGVudGljYWwoZnVuY3Rpb25UeXBlLCB1bmtub3duRnVuY3Rpb24pKSB7CiAgICAgIEV4cHJlc3Npb24gZXJyb3IgPSBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnZva2VOb25GdW5jdGlvbi53aXRoQXJndW1lbnRzKGdldHRlci5uYW1lLm5hbWUpLAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGNvbnN0IER5bmFtaWNUeXBlKCksIGVycm9yKTsKICAgIH0KICAgIGJvb2wgY29udHJhdmFyaWFudENoZWNrID0gZmFsc2U7CiAgICBpZiAoY2FsbGVlVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICByZWNlaXZlciBpcyEgVGhpc0V4cHJlc3Npb24gJiYKICAgICAgICByZXR1cm5lZFR5cGVQYXJhbWV0ZXJzT2NjdXJOb25Db3ZhcmlhbnRseSgKICAgICAgICAgICAgZ2V0dGVyLmVuY2xvc2luZ0NsYXNzLCBnZXR0ZXIuZnVuY3Rpb24ucmV0dXJuVHlwZSkpIHsKICAgICAgY29udHJhdmFyaWFudENoZWNrID0gdHJ1ZTsKICAgIH0KCiAgICBJbnZvY2F0aW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwgZmlsZU9mZnNldCwgZnVuY3Rpb25UeXBlLCBhcmd1bWVudHMsIHRhcmdldC5tZW1iZXIubmFtZSwKICAgICAgICByZWNlaXZlclR5cGU6IHJlY2VpdmVyVHlwZSk7CgogICAgaWYgKGlzRXhwcmVzc2lvbkludm9jYXRpb24pIHsKICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChjb25zdCBEeW5hbWljVHlwZSgpLCBlcnJvcik7CiAgICB9CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChjb250cmF2YXJpYW50Q2hlY2spIHsKICAgICAgUHJvcGVydHlHZXQgcHJvcGVydHlHZXQgPSBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXIsIGdldHRlci5uYW1lLCBnZXR0ZXIpOwogICAgICBBc0V4cHJlc3Npb24gYXNFeHByZXNzaW9uID0gbmV3IEFzRXhwcmVzc2lvbihwcm9wZXJ0eUdldCwgZnVuY3Rpb25UeXBlKQogICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgLi5pc0NvdmFyaWFuY2VDaGVjayA9IHRydWUKICAgICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSBpc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTWV0aG9kSW52b2NhdGlvbihhc0V4cHJlc3Npb24sIGNhbGxOYW1lLCBhcmd1bWVudHMpOwogICAgICBpZiAoaW5zdHJ1bWVudGF0aW9uICE9IG51bGwpIHsKICAgICAgICBpbnQgb2Zmc2V0ID0KICAgICAgICAgICAgYXJndW1lbnRzLmZpbGVPZmZzZXQgPT0gLTEgPyBmaWxlT2Zmc2V0IDogYXJndW1lbnRzLmZpbGVPZmZzZXQ7CiAgICAgICAgaW5zdHJ1bWVudGF0aW9uLnJlY29yZCh1cmlGb3JJbnN0cnVtZW50YXRpb24sIG9mZnNldCwKICAgICAgICAgICAgJ2NoZWNrR2V0dGVyUmV0dXJuJywgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShmdW5jdGlvblR5cGUpKTsKICAgICAgfQogICAgfQoKICAgIF9jaGVja0JvdW5kc0luTWV0aG9kSW52b2NhdGlvbigKICAgICAgICB0YXJnZXQsIHJlY2VpdmVyVHlwZSwgY2FsbGVlVHlwZSwgZ2V0dGVyLm5hbWUsIGFyZ3VtZW50cywgZmlsZU9mZnNldCk7CgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQWx3YXlzIGVuY29kZSB0aGUgY2FsbCBhcyBhbiBleHBsaWNpdCAuY2FsbCBhbmQKICAgIC8vIHNldCB0aGUgY29ycmVjdCBtZW1iZXIgb24gdGhlIGludm9jYXRpb24uCiAgICByZXBsYWNlbWVudCA/Pz0KICAgICAgICBuZXcgTWV0aG9kSW52b2NhdGlvbihyZWNlaXZlciwgZ2V0dGVyLm5hbWUsIGFyZ3VtZW50cywgZ2V0dGVyKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKCiAgICByZXR1cm4gY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICByZXN1bHQuaW5mZXJyZWRUeXBlLCByZXN1bHQuYXBwbHlSZXN1bHQocmVwbGFjZW1lbnQpLCBudWxsQXdhcmVHdWFyZHMpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBfaW5mZXJJbnN0YW5jZUZpZWxkSW52b2NhdGlvbigKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcywKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLAogICAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0LAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCwKICAgICAge2Jvb2wgaXNFeHByZXNzaW9uSW52b2NhdGlvbn0pIHsKICAgIGFzc2VydChpc0V4cHJlc3Npb25JbnZvY2F0aW9uICE9IG51bGwpOwogICAgYXNzZXJ0KHRhcmdldC5pc0luc3RhbmNlTWVtYmVyKTsKICAgIEZpZWxkIGZpZWxkID0gdGFyZ2V0Lm1lbWJlcjsKCiAgICBEYXJ0VHlwZSBjYWxsZWVUeXBlID0gZ2V0R2V0dGVyVHlwZSh0YXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gZ2V0RnVuY3Rpb25UeXBlRm9ySW1wbGljaXRDYWxsKGNhbGxlZVR5cGUpOwoKICAgIGlmIChjYWxsZWVUeXBlIGlzISBEeW5hbWljVHlwZSAmJgogICAgICAgICEoY2FsbGVlVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgIGNhbGxlZVR5cGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzKSAmJgogICAgICAgIGlkZW50aWNhbChmdW5jdGlvblR5cGUsIHVua25vd25GdW5jdGlvbikpIHsKICAgICAgRXhwcmVzc2lvbiBlcnJvciA9IGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uLndpdGhBcmd1bWVudHModGFyZ2V0Lm1lbWJlci5uYW1lLm5hbWUpLAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGNvbnN0IER5bmFtaWNUeXBlKCksIGVycm9yKTsKICAgIH0KICAgIGJvb2wgY29udHJhdmFyaWFudENoZWNrID0gZmFsc2U7CiAgICBpZiAocmVjZWl2ZXIgaXMhIFRoaXNFeHByZXNzaW9uICYmCiAgICAgICAgY2FsbGVlVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICByZXR1cm5lZFR5cGVQYXJhbWV0ZXJzT2NjdXJOb25Db3ZhcmlhbnRseSgKICAgICAgICAgICAgZmllbGQuZW5jbG9zaW5nQ2xhc3MsIGZpZWxkLnR5cGUpKSB7CiAgICAgIGNvbnRyYXZhcmlhbnRDaGVjayA9IHRydWU7CiAgICB9CgogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsIGZpbGVPZmZzZXQsIGZ1bmN0aW9uVHlwZSwgYXJndW1lbnRzLCB0YXJnZXQubWVtYmVyLm5hbWUsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUpOwoKICAgIGlmIChpc0V4cHJlc3Npb25JbnZvY2F0aW9uKSB7CiAgICAgIEV4cHJlc3Npb24gZXJyb3IgPSBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbXBsaWNpdENhbGxPZk5vbk1ldGhvZC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgRHluYW1pY1R5cGUoKSwgZXJyb3IpOwogICAgfQoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQ7CiAgICBpZiAoY29udHJhdmFyaWFudENoZWNrKSB7CiAgICAgIFByb3BlcnR5R2V0IHByb3BlcnR5R2V0ID0gbmV3IFByb3BlcnR5R2V0KHJlY2VpdmVyLCBmaWVsZC5uYW1lLCBmaWVsZCk7CiAgICAgIEFzRXhwcmVzc2lvbiBhc0V4cHJlc3Npb24gPSBuZXcgQXNFeHByZXNzaW9uKHByb3BlcnR5R2V0LCBmdW5jdGlvblR5cGUpCiAgICAgICAgLi5pc1R5cGVFcnJvciA9IHRydWUKICAgICAgICAuLmlzQ292YXJpYW5jZUNoZWNrID0gdHJ1ZQogICAgICAgIC4uaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICByZXBsYWNlbWVudCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKGFzRXhwcmVzc2lvbiwgY2FsbE5hbWUsIGFyZ3VtZW50cyk7CiAgICAgIGlmIChpbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgIGludCBvZmZzZXQgPQogICAgICAgICAgICBhcmd1bWVudHMuZmlsZU9mZnNldCA9PSAtMSA/IGZpbGVPZmZzZXQgOiBhcmd1bWVudHMuZmlsZU9mZnNldDsKICAgICAgICBpbnN0cnVtZW50YXRpb24ucmVjb3JkKHVyaUZvckluc3RydW1lbnRhdGlvbiwgb2Zmc2V0LAogICAgICAgICAgICAnY2hlY2tHZXR0ZXJSZXR1cm4nLCBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGZ1bmN0aW9uVHlwZSkpOwogICAgICB9CiAgICB9CgogICAgX2NoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9uKAogICAgICAgIHRhcmdldCwgcmVjZWl2ZXJUeXBlLCBjYWxsZWVUeXBlLCBmaWVsZC5uYW1lLCBhcmd1bWVudHMsIGZpbGVPZmZzZXQpOwoKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEFsd2F5cyBlbmNvZGUgdGhlIGNhbGwgYXMgYW4gZXhwbGljaXQgLmNhbGwgYW5kCiAgICAvLyBzZXQgdGhlIGNvcnJlY3QgbWVtYmVyIG9uIHRoZSBpbnZvY2F0aW9uLgogICAgcmVwbGFjZW1lbnQgPz89IG5ldyBNZXRob2RJbnZvY2F0aW9uKHJlY2VpdmVyLCBmaWVsZC5uYW1lLCBhcmd1bWVudHMsIGZpZWxkKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwoKICAgIHJldHVybiBjcmVhdGVOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHJlc3VsdC5pbmZlcnJlZFR5cGUsIHJlc3VsdC5hcHBseVJlc3VsdChyZXBsYWNlbWVudCksIG51bGxBd2FyZUd1YXJkcyk7CiAgfQoKICAvLy8gUGVyZm9ybXMgdGhlIGNvcmUgdHlwZSBpbmZlcmVuY2UgYWxnb3JpdGhtIGZvciBtZXRob2QgaW52b2NhdGlvbnMuCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmZlck1ldGhvZEludm9jYXRpb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZHMsCiAgICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwKICAgICAgTmFtZSBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCwKICAgICAge2Jvb2wgaXNFeHByZXNzaW9uSW52b2NhdGlvbn0pIHsKICAgIGFzc2VydChpc0V4cHJlc3Npb25JbnZvY2F0aW9uICE9IG51bGwpOwogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCA9IGZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgcmVjZWl2ZXJUeXBlLCBuYW1lLCBmaWxlT2Zmc2V0LAogICAgICAgIGluc3RydW1lbnRlZDogdHJ1ZSwgaW5jbHVkZUV4dGVuc2lvbk1ldGhvZHM6IHRydWUpOwogICAgc3dpdGNoICh0YXJnZXQua2luZCkgewogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW5zdGFuY2VNZW1iZXI6CiAgICAgICAgTWVtYmVyIG1lbWJlciA9IHRhcmdldC5tZW1iZXI7CiAgICAgICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKICAgICAgICAgIGlmIChtZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLkdldHRlcikgewogICAgICAgICAgICByZXR1cm4gX2luZmVySW5zdGFuY2VHZXR0ZXJJbnZvY2F0aW9uKGZpbGVPZmZzZXQsIG51bGxBd2FyZUd1YXJkcywKICAgICAgICAgICAgICAgIHJlY2VpdmVyLCByZWNlaXZlclR5cGUsIHRhcmdldCwgYXJndW1lbnRzLCB0eXBlQ29udGV4dCwKICAgICAgICAgICAgICAgIGlzRXhwcmVzc2lvbkludm9jYXRpb246IGlzRXhwcmVzc2lvbkludm9jYXRpb24pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIF9pbmZlckluc3RhbmNlTWV0aG9kSW52b2NhdGlvbihmaWxlT2Zmc2V0LCBudWxsQXdhcmVHdWFyZHMsCiAgICAgICAgICAgICAgICByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCB0YXJnZXQsIGFyZ3VtZW50cywgdHlwZUNvbnRleHQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gX2luZmVySW5zdGFuY2VGaWVsZEludm9jYXRpb24oZmlsZU9mZnNldCwgbnVsbEF3YXJlR3VhcmRzLAogICAgICAgICAgICAgIHJlY2VpdmVyLCByZWNlaXZlclR5cGUsIHRhcmdldCwgYXJndW1lbnRzLCB0eXBlQ29udGV4dCwKICAgICAgICAgICAgICBpc0V4cHJlc3Npb25JbnZvY2F0aW9uOiBpc0V4cHJlc3Npb25JbnZvY2F0aW9uKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5jYWxsRnVuY3Rpb246CiAgICAgICAgcmV0dXJuIF9pbmZlckZ1bmN0aW9uSW52b2NhdGlvbihmaWxlT2Zmc2V0LCBudWxsQXdhcmVHdWFyZHMsIHJlY2VpdmVyLAogICAgICAgICAgICByZWNlaXZlclR5cGUsIHRhcmdldCwgYXJndW1lbnRzLCB0eXBlQ29udGV4dCk7CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5leHRlbnNpb25NZW1iZXI6CiAgICAgICAgcmV0dXJuIF9pbmZlckV4dGVuc2lvbkludm9jYXRpb24oZmlsZU9mZnNldCwgbnVsbEF3YXJlR3VhcmRzLCByZWNlaXZlciwKICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCB0YXJnZXQsIG5hbWUsIGFyZ3VtZW50cywgdHlwZUNvbnRleHQpOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubWlzc2luZzoKICAgICAgICByZXR1cm4gX2luZmVyTWlzc2luZ0ludm9jYXRpb24oZmlsZU9mZnNldCwgbnVsbEF3YXJlR3VhcmRzLCByZWNlaXZlciwKICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCB0YXJnZXQsIG5hbWUsIGFyZ3VtZW50cywgdHlwZUNvbnRleHQsCiAgICAgICAgICAgIGlzRXhwcmVzc2lvbkludm9jYXRpb246IGlzRXhwcmVzc2lvbkludm9jYXRpb24pOwogICAgICBjYXNlIE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuZHluYW1pYzoKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmludmFsaWQ6CiAgICAgIGNhc2UgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC51bnJlc29sdmVkOgogICAgICAgIHJldHVybiBfaW5mZXJEeW5hbWljSW52b2NhdGlvbihmaWxlT2Zmc2V0LCBudWxsQXdhcmVHdWFyZHMsIHJlY2VpdmVyLAogICAgICAgICAgICBuYW1lLCBhcmd1bWVudHMsIHR5cGVDb250ZXh0KTsKICAgICAgY2FzZSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm5ldmVyOgogICAgICAgIHJldHVybiBfaW5mZXJOZXZlckludm9jYXRpb24oZmlsZU9mZnNldCwgbnVsbEF3YXJlR3VhcmRzLCByZWNlaXZlciwKICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCBuYW1lLCBhcmd1bWVudHMsIHR5cGVDb250ZXh0KTsKICAgIH0KICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgJyR0YXJnZXQnLCAnaW5mZXJNZXRob2RJbnZvY2F0aW9uJywgZmlsZU9mZnNldCwgdXJpRm9ySW5zdHJ1bWVudGF0aW9uKTsKICB9CgogIHZvaWQgX2NoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9uKAogICAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0LAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIERhcnRUeXBlIGNhbGxlZVR5cGUsCiAgICAgIE5hbWUgbWV0aG9kTmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgaW50IGZpbGVPZmZzZXQpIHsKICAgIC8vIElmIFthcmd1bWVudHNdIHdlcmUgaW5mZXJyZWQsIGNoZWNrIHRoZW0uCiAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmlndXJlIG91dCB3aHkgW2xpYnJhcnldIGlzIHNvbWV0aW1lcyBudWxsPyBBbnN3ZXI6CiAgICAvLyBiZWNhdXNlIHRvcCBsZXZlbCBpbmZlcmVuY2UgbmV2ZXIgZ290IGEgbGlicmFyeS4gVGhpcyBoYXMgY2hhbmdlZCBzbwogICAgLy8gd2UgYWx3YXlzIGhhdmUgYSBsaWJyYXJ5LiBTaG91bGQgd2Ugc3RpbGwgc2tpcCB0aGlzIGZvciB0b3AgbGV2ZWwKICAgIC8vIGluZmVyZW5jZT8KICAgIGlmICghaXNUb3BMZXZlbCkgewogICAgICAvLyBbYWN0dWFsUmVjZWl2ZXJUeXBlXSwgW2ludGVyZmFjZVRhcmdldF0sIGFuZCBbYWN0dWFsTWV0aG9kTmFtZV0gYmVsb3cKICAgICAgLy8gYXJlIGZvciBhIHdvcmthcm91bmQgZm9yIHRoZSBjYXNlcyBsaWtlIHRoZSBmb2xsb3dpbmc6CiAgICAgIC8vCiAgICAgIC8vICAgICBjbGFzcyBDMSB7IHZhciBmID0gbmV3IEMyKCk7IH0KICAgICAgLy8gICAgIGNsYXNzIEMyIHsgaW50IGNhbGw8WCBleHRlbmRzIG51bT4oWCB4KSA9PiA0MjsgfQogICAgICAvLyAgICAgbWFpbigpIHsgQzEgYyA9IG5ldyBDMSgpOyBjLmYoImZvb2JhciIpOyB9CiAgICAgIERhcnRUeXBlIGFjdHVhbFJlY2VpdmVyVHlwZTsKICAgICAgTWVtYmVyIGludGVyZmFjZVRhcmdldDsKICAgICAgTmFtZSBhY3R1YWxNZXRob2ROYW1lOwogICAgICBpZiAoY2FsbGVlVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgYWN0dWFsUmVjZWl2ZXJUeXBlID0gY2FsbGVlVHlwZTsKICAgICAgICBpbnRlcmZhY2VUYXJnZXQgPSBudWxsOwogICAgICAgIGFjdHVhbE1ldGhvZE5hbWUgPSBjYWxsTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3R1YWxSZWNlaXZlclR5cGUgPSByZWNlaXZlclR5cGU7CiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0ID0gdGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIgPyB0YXJnZXQubWVtYmVyIDogbnVsbDsKICAgICAgICBhY3R1YWxNZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKICAgICAgfQogICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgYWN0dWFsUmVjZWl2ZXJUeXBlLAogICAgICAgICAgdHlwZVNjaGVtYUVudmlyb25tZW50LAogICAgICAgICAgY2xhc3NIaWVyYXJjaHksCiAgICAgICAgICB0aGlzLAogICAgICAgICAgYWN0dWFsTWV0aG9kTmFtZSwKICAgICAgICAgIGludGVyZmFjZVRhcmdldCwKICAgICAgICAgIGFyZ3VtZW50cywKICAgICAgICAgIGhlbHBlci51cmksCiAgICAgICAgICBmaWxlT2Zmc2V0KTsKICAgIH0KICB9CgogIGJvb2wgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yQW5kVHlwZSgKICAgICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCwgRGFydFR5cGUgcmVjZWl2ZXJUeXBlKSB7CiAgICByZXR1cm4gdGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICB0YXJnZXQubWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKAogICAgICAgICAgICB0YXJnZXQubWVtYmVyLCByZWNlaXZlclR5cGUpOwogIH0KCiAgLy8vIFBlcmZvcm1zIHRoZSBjb3JlIHR5cGUgaW5mZXJlbmNlIGFsZ29yaXRobSBmb3Igc3VwZXIgbWV0aG9kIGludm9jYXRpb25zLgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5mZXJTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLAogICAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCwKICAgICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCkgewogICAgaW50IGZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICBOYW1lIG1ldGhvZE5hbWUgPSBleHByZXNzaW9uLm5hbWU7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gZXhwcmVzc2lvbi5hcmd1bWVudHM7CiAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUgPSB0aGlzVHlwZTsKICAgIGJvb2wgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yID0KICAgICAgICBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKHRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIERhcnRUeXBlIGNhbGxlZVR5cGUgPSBnZXRHZXR0ZXJUeXBlKHRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBnZXRGdW5jdGlvblR5cGUodGFyZ2V0LCByZWNlaXZlclR5cGUpOwoKICAgIGlmICghdGFyZ2V0LmlzVW5yZXNvbHZlZCAmJgogICAgICAgIGNhbGxlZVR5cGUgaXMhIER5bmFtaWNUeXBlICYmCiAgICAgICAgIShjYWxsZWVUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgICAgY2FsbGVlVHlwZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MpICYmCiAgICAgICAgaWRlbnRpY2FsKGZ1bmN0aW9uVHlwZSwgdW5rbm93bkZ1bmN0aW9uKSkgewogICAgICBFeHByZXNzaW9uIGVycm9yID0gaGVscGVyLndyYXBJblByb2JsZW0oZXhwcmVzc2lvbiwKICAgICAgICAgIHRlbXBsYXRlSW52b2tlTm9uRnVuY3Rpb24ud2l0aEFyZ3VtZW50cyhtZXRob2ROYW1lLm5hbWUpLCBub0xlbmd0aCk7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChjb25zdCBEeW5hbWljVHlwZSgpLCBlcnJvcik7CiAgICB9CiAgICBJbnZvY2F0aW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVySW52b2NhdGlvbigKICAgICAgICB0eXBlQ29udGV4dCwgZmlsZU9mZnNldCwgZnVuY3Rpb25UeXBlLCBhcmd1bWVudHMsIHRhcmdldC5tZW1iZXI/Lm5hbWUsCiAgICAgICAgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yOiBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3IsCiAgICAgICAgcmVjZWl2ZXJUeXBlOiByZWNlaXZlclR5cGUsCiAgICAgICAgaXNJbXBsaWNpdEV4dGVuc2lvbk1lbWJlcjogdGFyZ2V0LmlzRXh0ZW5zaW9uTWVtYmVyKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IHJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICBpZiAobWV0aG9kTmFtZS5uYW1lID09ICc9PScpIHsKICAgICAgaW5mZXJyZWRUeXBlID0gY29yZVR5cGVzLmJvb2xSYXdUeXBlKGxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgfQogICAgX2NoZWNrQm91bmRzSW5NZXRob2RJbnZvY2F0aW9uKAogICAgICAgIHRhcmdldCwgcmVjZWl2ZXJUeXBlLCBjYWxsZWVUeXBlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGZpbGVPZmZzZXQpOwoKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlZFR5cGUsIHJlc3VsdC5hcHBseVJlc3VsdChleHByZXNzaW9uKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGluZmVyUGFyYW1ldGVySW5pdGlhbGl6ZXIoCiAgICAgIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsCiAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsCiAgICAgIERhcnRUeXBlIGRlY2xhcmVkVHlwZSwKICAgICAgYm9vbCBoYXNEZWNsYXJlZEluaXRpYWxpemVyKSB7CiAgICBhc3NlcnQoY2xvc3VyZUNvbnRleHQgPT0gbnVsbCk7CiAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKICAgIGFzc2VydChkZWNsYXJlZFR5cGUgIT0gbnVsbCk7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9CiAgICAgICAgaW5mZXJFeHByZXNzaW9uKGluaXRpYWxpemVyLCBkZWNsYXJlZFR5cGUsIHRydWUpOwogICAgaWYgKGhhc0RlY2xhcmVkSW5pdGlhbGl6ZXIpIHsKICAgICAgaW5pdGlhbGl6ZXIgPSBlbnN1cmVBc3NpZ25hYmxlUmVzdWx0KGRlY2xhcmVkVHlwZSwgcmVzdWx0KTsKICAgIH0KICAgIHRoaXMuaGVscGVyID0gbnVsbDsKICAgIHJldHVybiBpbml0aWFsaXplcjsKICB9CgogIC8vLyBQZXJmb3JtcyB0aGUgY29yZSB0eXBlIGluZmVyZW5jZSBhbGdvcml0aG0gZm9yIHN1cGVyIHByb3BlcnR5IGdldC4KICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVyU3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IGV4cHJlc3Npb24sCiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0LCBPYmplY3RBY2Nlc3NUYXJnZXQgcmVhZFRhcmdldCkgewogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gdGhpc1R5cGU7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBnZXRHZXR0ZXJUeXBlKHJlYWRUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBpZiAocmVhZFRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIE1lbWJlciBtZW1iZXIgPSByZWFkVGFyZ2V0Lm1lbWJlcjsKICAgICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5NZXRob2QpIHsKICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVUZWFyT2ZmKGluZmVycmVkVHlwZSwgdHlwZUNvbnRleHQsIGV4cHJlc3Npb24pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBleHByZXNzaW9uKTsKICB9CgogIC8vLyBNb2RpZmllcyBhIHR5cGUgYXMgYXBwcm9wcmlhdGUgd2hlbiBpbmZlcnJpbmcgYSBjbG9zdXJlIHJldHVybiB0eXBlLgogIERhcnRUeXBlIGluZmVyUmV0dXJuVHlwZShEYXJ0VHlwZSByZXR1cm5UeXBlKSB7CiAgICByZXR1cm4gcmV0dXJuVHlwZSA/PyB0eXBlU2NoZW1hRW52aXJvbm1lbnQubnVsbFR5cGU7CiAgfQoKICAvLy8gUGVyZm9ybXMgdHlwZSBpbmZlcmVuY2Ugb24gdGhlIGdpdmVuIFtzdGF0ZW1lbnRdLgogIC8vLwogIC8vLyBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggbG9naWMgdGhhdCBkaXNwYXRjaGVzIG9uCiAgLy8vIHRoZSBzdGF0ZW1lbnQgdHlwZSBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemVkICJpbmZlciIgbWV0aG9kLgogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBpbmZlclN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICByZWdpc3RlcklmVW5yZWFjaGFibGVGb3JUZXN0aW5nKHN0YXRlbWVudCk7CgogICAgLy8gRm9yIGZ1bGwgKG5vbi10b3AgbGV2ZWwpIGluZmVyZW5jZSwgd2UgbmVlZCBhY2Nlc3MgdG8gdGhlCiAgICAvLyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIHNvIHRoYXQgd2UgY2FuIHBlcmZvcm0gZXJyb3IgcmVjb3ZlcnkuCiAgICBpZiAoIWlzVG9wTGV2ZWwpIGFzc2VydChoZWxwZXIgIT0gbnVsbCk7CiAgICBJbmZlcmVuY2VWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSW5mZXJlbmNlVmlzaXRvcih0aGlzKTsKICAgIGlmIChzdGF0ZW1lbnQgaXMgSW50ZXJuYWxTdGF0ZW1lbnQpIHsKICAgICAgcmV0dXJuIHN0YXRlbWVudC5hY2NlcHRJbmZlcmVuY2UodmlzaXRvcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3RhdGVtZW50LmFjY2VwdCh2aXNpdG9yKTsKICAgIH0KICB9CgogIC8vLyBQZXJmb3JtcyB0aGUgdHlwZSBpbmZlcmVuY2Ugc3RlcHMgbmVjZXNzYXJ5IHRvIGluc3RhbnRpYXRlIGEgdGVhci1vZmYKICAvLy8gKGlmIG5lY2Vzc2FyeSkuCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbnN0YW50aWF0ZVRlYXJPZmYoCiAgICAgIERhcnRUeXBlIHRlYXJvZmZUeXBlLCBEYXJ0VHlwZSBjb250ZXh0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGlmICh0ZWFyb2ZmVHlwZSBpcyBGdW5jdGlvblR5cGUgJiYKICAgICAgICBjb250ZXh0IGlzIEZ1bmN0aW9uVHlwZSAmJgogICAgICAgIGNvbnRleHQudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gdGVhcm9mZlR5cGU7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBmdW5jdGlvblR5cGUudHlwZVBhcmFtZXRlcnM7CiAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlcyA9IG5ldyBMaXN0PERhcnRUeXBlPi5maWxsZWQoCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgY29uc3QgVW5rbm93blR5cGUoKSk7CiAgICAgICAgRnVuY3Rpb25UeXBlIGluc3RhbnRpYXRlZFR5cGUgPSBmdW5jdGlvblR5cGUud2l0aG91dFR5cGVQYXJhbWV0ZXJzOwogICAgICAgIHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZShpbnN0YW50aWF0ZWRUeXBlLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVycywgW10sIFtdLCBjb250ZXh0LCBpbmZlcnJlZFR5cGVzLCBsaWJyYXJ5LmxpYnJhcnkpOwogICAgICAgIGlmICghaXNUb3BMZXZlbCkgewogICAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBJbnN0YW50aWF0aW9uKGV4cHJlc3Npb24sIGluZmVycmVkVHlwZXMpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgICAgICB9CiAgICAgICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnMsIGluZmVycmVkVHlwZXMpOwogICAgICAgIHRlYXJvZmZUeXBlID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGluc3RhbnRpYXRlZFR5cGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQodGVhcm9mZlR5cGUsIGV4cHJlc3Npb24pOwogIH0KCiAgLy8vIFRydWUgaWYgdGhlIHJldHVybmVkIFt0eXBlXSBoYXMgbm9uLWNvdmFyaWFudCBvY2N1cnJlbmNlcyBvZiBhbnkgb2YKICAvLy8gW2NsYXNzX10ncyB0eXBlIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIEEgbm9uLWNvdmFyaWFudCBvY2N1cnJlbmNlIG9mIGEgdHlwZSBwYXJhbWV0ZXIgaXMgZWl0aGVyIGEgY29udHJhdmFyaWFudAogIC8vLyBvciBhbiBpbnZhcmlhbnQgcG9zaXRpb24uCiAgLy8vCiAgLy8vIEEgY29udHJhdmFyaWFudCBwb3NpdGlvbiBpcyB0byB0aGUgbGVmdCBvZiBhbiBvZGQgbnVtYmVyIG9mIGFycm93cy4gRm9yCiAgLy8vIGV4YW1wbGUsIFQgb2NjdXJzIGNvbnRyYXZhcmlhbnRseSBpbiBUIC0+IFQwLCBUMCAtPiAoVCAtPiBUMSksCiAgLy8vIChUMCAtPiBUKSAtPiBUMSBidXQgbm90IGluIChUIC0+IFQwKSAtPiBUMS4KICAvLy8KICAvLy8gQW4gaW52YXJpYW50IHBvc2l0aW9uIGlzIHdpdGhvdXQgYSBib3VuZCBvZiBhIHR5cGUgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSwKICAvLy8gVCBvY2N1cnMgaW52YXJpYW50bHkgaW4gYFMgRnVuY3Rpb248UyBleHRlbmRzIFQ+KClgIGFuZAogIC8vLyBgdm9pZCBGdW5jdGlvbjxTIGV4dGVuZHMgQzxUPj4oUylgLgogIHN0YXRpYyBib29sIHJldHVybmVkVHlwZVBhcmFtZXRlcnNPY2N1ck5vbkNvdmFyaWFudGx5KAogICAgICBDbGFzcyBjbGFzc18sIERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChjbGFzc18udHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgcmV0dXJuIGZhbHNlOwogICAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5IGNoZWNrZXIgPQogICAgICAgIG5ldyBJbmNsdWRlc1R5cGVQYXJhbWV0ZXJzTm9uQ292YXJpYW50bHkoY2xhc3NfLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAvLyBXZSBhcmUgY2hlY2tpbmcgdGhlIHJldHVybmVkIHR5cGUgKGZpZWxkL2dldHRlciB0eXBlIG9yIHJldHVybgogICAgICAgICAgICAvLyB0eXBlIG9mIGEgbWV0aG9kKSBhbmQgdGhpcyBpcyBhIGNvdmFyaWFudCBwb3NpdGlvbi4KICAgICAgICAgICAgaW5pdGlhbFZhcmlhbmNlOiBWYXJpYW5jZS5jb3ZhcmlhbnQpOwogICAgcmV0dXJuIHR5cGUuYWNjZXB0KGNoZWNrZXIpOwogIH0KCiAgLy8vIERldGVybWluZXMgdGhlIGRpc3BhdGNoIGNhdGVnb3J5IG9mIGEgW01ldGhvZEludm9jYXRpb25dIGFuZCByZXR1cm5zIGEKICAvLy8gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gImFzIiBjaGVjayB3aWxsIG5lZWQgdG8gYmUgYWRkZWQgZHVlIHRvCiAgLy8vIGNvbnRyYXZhcmlhbmNlLgogIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kIHByZUNoZWNrSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlKAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQsCiAgICAgIHtib29sIGlzVGhpc1JlY2VpdmVyfSkgewogICAgYXNzZXJ0KGlzVGhpc1JlY2VpdmVyICE9IG51bGwpOwogICAgaWYgKHRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIgPSB0YXJnZXQubWVtYmVyOwogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkIHx8CiAgICAgICAgICBpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpIHsKICAgICAgICBEYXJ0VHlwZSBnZXRUeXBlID0gZ2V0R2V0dGVyVHlwZSh0YXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICAgICAgaWYgKGdldFR5cGUgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5ub25lOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzVGhpc1JlY2VpdmVyKSB7CiAgICAgICAgICBpZiAoKGludGVyZmFjZU1lbWJlciBpcyBGaWVsZCAmJgogICAgICAgICAgICAgICAgICByZXR1cm5lZFR5cGVQYXJhbWV0ZXJzT2NjdXJOb25Db3ZhcmlhbnRseSgKICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcywgaW50ZXJmYWNlTWVtYmVyLnR5cGUpKSB8fAogICAgICAgICAgICAgIChpbnRlcmZhY2VNZW1iZXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgICAgICAgICAgIHJldHVybmVkVHlwZVBhcmFtZXRlcnNPY2N1ck5vbkNvdmFyaWFudGx5KAogICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGUpKSkgewogICAgICAgICAgICByZXR1cm4gTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQuY2hlY2tHZXR0ZXJSZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFpc1RoaXNSZWNlaXZlciAmJgogICAgICAgICAgaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSAmJgogICAgICAgICAgcmV0dXJuZWRUeXBlUGFyYW1ldGVyc09jY3VyTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLAogICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5mdW5jdGlvbi5yZXR1cm5UeXBlKSkgewogICAgICAgIHJldHVybiBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja01ldGhvZFJldHVybjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLm5vbmU7CiAgfQoKICAvLy8gSWYgdGhlIGdpdmVuIFt0eXBlXSBpcyBhIFtUeXBlUGFyYW1ldGVyVHlwZV0sIHJlc29sdmUgaXQgdG8gaXRzIGJvdW5kLgogIERhcnRUeXBlIHJlc29sdmVUeXBlUGFyYW1ldGVyKERhcnRUeXBlIHR5cGUpIHsKICAgIERhcnRUeXBlIHJlc29sdmVPbmVTdGVwKERhcnRUeXBlIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZS5ib3VuZDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIERhcnRUeXBlIHJlc29sdmVkID0gcmVzb2x2ZU9uZVN0ZXAodHlwZSk7CiAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkgcmV0dXJuIHR5cGU7CgogICAgLy8gRGV0ZWN0IGNpcmN1bGFyaXRpZXMgdXNpbmcgdGhlIHRvcnRvaXNlLWFuZC1oYXJlIGFsZ29yaXRobS4KICAgIHR5cGUgPSByZXNvbHZlZDsKICAgIERhcnRUeXBlIGhhcmUgPSByZXNvbHZlT25lU3RlcCh0eXBlKTsKICAgIGlmIChoYXJlID09IG51bGwpIHJldHVybiB0eXBlOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGlkZW50aWNhbCh0eXBlLCBoYXJlKSkgewogICAgICAgIC8vIFdlIGZvdW5kIGEgY2lyY3VsYXJpdHkuICBHaXZlIHVwIGFuZCByZXR1cm4gYGR5bmFtaWNgLgogICAgICAgIHJldHVybiBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CgogICAgICAvLyBIYXJlIHRha2VzIHR3byBzdGVwcwogICAgICBEYXJ0VHlwZSBzdGVwMSA9IHJlc29sdmVPbmVTdGVwKGhhcmUpOwogICAgICBpZiAoc3RlcDEgPT0gbnVsbCkgcmV0dXJuIGhhcmU7CiAgICAgIERhcnRUeXBlIHN0ZXAyID0gcmVzb2x2ZU9uZVN0ZXAoc3RlcDEpOwogICAgICBpZiAoc3RlcDIgPT0gbnVsbCkgcmV0dXJuIGhhcmU7CiAgICAgIGhhcmUgPSBzdGVwMjsKCiAgICAgIC8vIFRvcnRvaXNlIHRha2VzIG9uZSBzdGVwCiAgICAgIHR5cGUgPSByZXNvbHZlT25lU3RlcCh0eXBlKTsKICAgIH0KICB9CgogIERhcnRUeXBlIHdyYXBGdXR1cmVPclR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbCh0eXBlLmNsYXNzTm9kZSwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBJZiBbdHlwZV0gaXMgYSBzdWJ0eXBlIG9mIGBGdXR1cmVgLCBzaG91bGQgd2UganVzdAogICAgLy8gcmV0dXJuIGl0IHVubW9kaWZpZWQ/CiAgICBpZiAodHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBjb3JlVHlwZXMuZnV0dXJlUmF3VHlwZShsaWJyYXJ5Lm51bGxhYmxlKTsKICAgIH0KICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcywgbGlicmFyeS5ub25OdWxsYWJsZSwgPERhcnRUeXBlPlt0eXBlXSk7CiAgfQoKICBEYXJ0VHlwZSB3cmFwRnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgRGFydFR5cGUgdHlwZVdpdGhvdXRGdXR1cmVPciA9IHR5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MsIG51bGxhYmlsaXR5LCA8RGFydFR5cGU+W3R5cGVXaXRob3V0RnV0dXJlT3JdKTsKICB9CgogIERhcnRUeXBlIHdyYXBUeXBlKERhcnRUeXBlIHR5cGUsIENsYXNzIGNsYXNzXywgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBjbGFzc18sIG51bGxhYmlsaXR5LCA8RGFydFR5cGU+W3R5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKV0pOwogIH0KCiAgTWVtYmVyIF9nZXRJbnRlcmZhY2VNZW1iZXIoCiAgICAgIENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCBib29sIHNldHRlciwgaW50IGNoYXJPZmZzZXQpIHsKICAgIE1lbWJlciBtZW1iZXIgPSBlbmdpbmUuaGllcmFyY2h5QnVpbGRlci5nZXRDb21iaW5lZE1lbWJlclNpZ25hdHVyZUtlcm5lbCgKICAgICAgICBjbGFzc18sIG5hbWUsIHNldHRlciwgY2hhck9mZnNldCwgbGlicmFyeSk7CiAgICBpZiAobWVtYmVyID09IG51bGwgJiYgbGlicmFyeS5pc1BhdGNoKSB7CiAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBIYWNrIGZvciBwYXJ0cy4KICAgICAgbWVtYmVyID8/PQogICAgICAgICAgY2xhc3NIaWVyYXJjaHkuZ2V0SW50ZXJmYWNlTWVtYmVyKGNsYXNzXywgbmFtZSwgc2V0dGVyOiBzZXR0ZXIpOwogICAgfQogICAgcmV0dXJuIFR5cGVJbmZlcmVuY2VFbmdpbmUucmVzb2x2ZUluZmVyZW5jZU5vZGUobWVtYmVyKTsKICB9CgogIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0ncyB0eXBlIGlzIHByZWNpc2VseSBrbm93biBhdCBjb21waWxlCiAgLy8vIHRpbWUuCiAgLy8vCiAgLy8vIElmIGl0IGlzLCBhbiBlcnJvciBtZXNzYWdlIHRlbXBsYXRlIGlzIHJldHVybmVkLCB3aGljaCBjYW4gYmUgdXNlZCBieSB0aGUKICAvLy8gY2FsbGVyIHRvIHJlcG9ydCBhbiBpbnZhbGlkIGNhc3QuICBPdGhlcndpc2UsIGBudWxsYCBpcyByZXR1cm5lZC4KICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKERhcnRUeXBlLCBEYXJ0VHlwZSwgYm9vbCk+CiAgICAgIF9nZXRQcmVjaXNlVHlwZUVycm9yVGVtcGxhdGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBMaXN0TGl0ZXJhbCkgewogICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0OwogICAgfQogICAgaWYgKGV4cHJlc3Npb24gaXMgTWFwTGl0ZXJhbCkgewogICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxNYXA7CiAgICB9CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBTZXRMaXRlcmFsKSB7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbFNldDsKICAgIH0KICAgIGlmIChleHByZXNzaW9uIGlzIEZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwcjsKICAgIH0KICAgIGlmIChleHByZXNzaW9uIGlzIENvbnN0cnVjdG9ySW52b2NhdGlvbikgewogICAgICByZXR1cm4gdGVtcGxhdGVJbnZhbGlkQ2FzdE5ld0V4cHI7CiAgICB9CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBTdGF0aWNHZXQpIHsKICAgICAgTWVtYmVyIHRhcmdldCA9IGV4cHJlc3Npb24udGFyZ2V0OwogICAgICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICAgIGlmICh0YXJnZXQuZW5jbG9zaW5nQ2xhc3MgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIHRlbXBsYXRlSW52YWxpZENhc3RTdGF0aWNNZXRob2Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBWYXJpYWJsZUdldCkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gZXhwcmVzc2lvbi52YXJpYWJsZTsKICAgICAgaWYgKHZhcmlhYmxlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsICYmIHZhcmlhYmxlLmlzTG9jYWxGdW5jdGlvbikgewogICAgICAgIHJldHVybiB0ZW1wbGF0ZUludmFsaWRDYXN0TG9jYWxGdW5jdGlvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIF9zaG91bGRUZWFyT2ZmQ2FsbChEYXJ0VHlwZSBjb250ZXh0VHlwZSwgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUpIHsKICAgIGlmIChjb250ZXh0VHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgY29udGV4dFR5cGUuY2xhc3NOb2RlID09IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5mdXR1cmVPckNsYXNzKSB7CiAgICAgIGNvbnRleHRUeXBlID0gKGNvbnRleHRUeXBlIGFzIEludGVyZmFjZVR5cGUpLnR5cGVBcmd1bWVudHNbMF07CiAgICB9CiAgICBpZiAoY29udGV4dFR5cGUgaXMgRnVuY3Rpb25UeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChjb250ZXh0VHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgY29udGV4dFR5cGUuY2xhc3NOb2RlID09IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5mdW5jdGlvbkNsYXNzKSB7CiAgICAgIGlmICghdHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKGV4cHJlc3Npb25UeXBlLCBjb250ZXh0VHlwZSwKICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZU1pc3NpbmdTdXBlckluZGV4R2V0KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGluZGV4KSB7CiAgICBpZiAoaXNUb3BMZXZlbCkgewogICAgICByZXR1cm4gZW5naW5lLmZvcmVzdC5jcmVhdGVTdXBlck1ldGhvZEludm9jYXRpb24oZmlsZU9mZnNldCwgaW5kZXhHZXROYW1lLAogICAgICAgICAgbnVsbCwgZW5naW5lLmZvcmVzdC5jcmVhdGVBcmd1bWVudHMoZmlsZU9mZnNldCwgPEV4cHJlc3Npb24+W2luZGV4XSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb01ldGhvZC53aXRoQXJndW1lbnRzKGluZGV4R2V0TmFtZS5uYW1lKSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZU1pc3NpbmdTdXBlckluZGV4U2V0KAogICAgICBpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBpbmRleCwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgaWYgKGlzVG9wTGV2ZWwpIHsKICAgICAgcmV0dXJuIGVuZ2luZS5mb3Jlc3QuY3JlYXRlU3VwZXJNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBlbmdpbmUuZm9yZXN0CiAgICAgICAgICAgICAgLmNyZWF0ZUFyZ3VtZW50cyhmaWxlT2Zmc2V0LCA8RXhwcmVzc2lvbj5baW5kZXgsIHZhbHVlXSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb01ldGhvZC53aXRoQXJndW1lbnRzKGluZGV4U2V0TmFtZS5uYW1lKSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZU1pc3NpbmdNZXRob2RJbnZvY2F0aW9uKGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsIE5hbWUgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNFeHByZXNzaW9uSW52b2NhdGlvbn0pIHsKICAgIGFzc2VydChpc0V4cHJlc3Npb25JbnZvY2F0aW9uICE9IG51bGwpOwogICAgaWYgKGlzVG9wTGV2ZWwpIHsKICAgICAgcmV0dXJuIGVuZ2luZS5mb3Jlc3QKICAgICAgICAgIC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKGZpbGVPZmZzZXQsIHJlY2VpdmVyLCBuYW1lLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZVVuZGVmaW5lZE1ldGhvZC53aXRoQXJndW1lbnRzKG5hbWUubmFtZSwKICAgICAgICAgICAgICByZXNvbHZlVHlwZVBhcmFtZXRlcihyZWNlaXZlclR5cGUpLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBpc0V4cHJlc3Npb25JbnZvY2F0aW9uID8gbm9MZW5ndGggOiBuYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gY3JlYXRlTWlzc2luZ1Byb3BlcnR5R2V0KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsIE5hbWUgcHJvcGVydHlOYW1lKSB7CiAgICBpZiAoaXNUb3BMZXZlbCkgewogICAgICByZXR1cm4gZW5naW5lLmZvcmVzdAogICAgICAgICAgLmNyZWF0ZVByb3BlcnR5R2V0KGZpbGVPZmZzZXQsIHJlY2VpdmVyLCBwcm9wZXJ0eU5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZVVuZGVmaW5lZEdldHRlci53aXRoQXJndW1lbnRzKHByb3BlcnR5TmFtZS5uYW1lLAogICAgICAgICAgICAgIHJlc29sdmVUeXBlUGFyYW1ldGVyKHJlY2VpdmVyVHlwZSksIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIHByb3BlcnR5TmFtZS5uYW1lLmxlbmd0aCk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZU1pc3NpbmdQcm9wZXJ0eVNldChpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlLCBOYW1lIHByb3BlcnR5TmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2Jvb2wgZm9yRWZmZWN0fSkgewogICAgYXNzZXJ0KGZvckVmZmVjdCAhPSBudWxsKTsKICAgIGlmIChpc1RvcExldmVsKSB7CiAgICAgIHJldHVybiBlbmdpbmUuZm9yZXN0LmNyZWF0ZVByb3BlcnR5U2V0KAogICAgICAgICAgZmlsZU9mZnNldCwgcmVjZWl2ZXIsIHByb3BlcnR5TmFtZSwgdmFsdWUsCiAgICAgICAgICBmb3JFZmZlY3Q6IGZvckVmZmVjdCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVW5kZWZpbmVkU2V0dGVyLndpdGhBcmd1bWVudHMocHJvcGVydHlOYW1lLm5hbWUsCiAgICAgICAgICAgICAgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIocmVjZWl2ZXJUeXBlKSwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgcHJvcGVydHlOYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gY3JlYXRlTWlzc2luZ0luZGV4R2V0KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsIEV4cHJlc3Npb24gaW5kZXgpIHsKICAgIGlmIChpc1RvcExldmVsKSB7CiAgICAgIHJldHVybiBlbmdpbmUuZm9yZXN0LmNyZWF0ZUluZGV4R2V0KGZpbGVPZmZzZXQsIHJlY2VpdmVyLCBpbmRleCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVW5kZWZpbmVkTWV0aG9kLndpdGhBcmd1bWVudHMoaW5kZXhHZXROYW1lLm5hbWUsCiAgICAgICAgICAgICAgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIocmVjZWl2ZXJUeXBlKSwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQogIH0KCiAgRXhwcmVzc2lvbiBjcmVhdGVNaXNzaW5nSW5kZXhTZXQoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gcmVjZWl2ZXIsCiAgICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSwgRXhwcmVzc2lvbiBpbmRleCwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2Jvb2wgZm9yRWZmZWN0LCBib29sIHJlYWRPbmx5UmVjZWl2ZXJ9KSB7CiAgICBhc3NlcnQoZm9yRWZmZWN0ICE9IG51bGwpOwogICAgYXNzZXJ0KHJlYWRPbmx5UmVjZWl2ZXIgIT0gbnVsbCk7CiAgICBpZiAoaXNUb3BMZXZlbCkgewogICAgICByZXR1cm4gZW5naW5lLmZvcmVzdC5jcmVhdGVJbmRleFNldChmaWxlT2Zmc2V0LCByZWNlaXZlciwgaW5kZXgsIHZhbHVlLAogICAgICAgICAgZm9yRWZmZWN0OiBmb3JFZmZlY3QsIHJlYWRPbmx5UmVjZWl2ZXI6IHJlYWRPbmx5UmVjZWl2ZXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZVVuZGVmaW5lZE1ldGhvZC53aXRoQXJndW1lbnRzKGluZGV4U2V0TmFtZS5uYW1lLAogICAgICAgICAgICAgIHJlc29sdmVUeXBlUGFyYW1ldGVyKHJlY2VpdmVyVHlwZSksIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIG5vTGVuZ3RoKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gY3JlYXRlTWlzc2luZ0JpbmFyeShpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBsZWZ0LAogICAgICBEYXJ0VHlwZSBsZWZ0VHlwZSwgTmFtZSBiaW5hcnlOYW1lLCBFeHByZXNzaW9uIHJpZ2h0KSB7CiAgICBhc3NlcnQoYmluYXJ5TmFtZSAhPSBlcXVhbHNOYW1lKTsKICAgIGlmIChpc1RvcExldmVsKSB7CiAgICAgIHJldHVybiBlbmdpbmUuZm9yZXN0LmNyZWF0ZU1ldGhvZEludm9jYXRpb24oZmlsZU9mZnNldCwgbGVmdCwgYmluYXJ5TmFtZSwKICAgICAgICAgIGVuZ2luZS5mb3Jlc3QuY3JlYXRlQXJndW1lbnRzKGZpbGVPZmZzZXQsIDxFeHByZXNzaW9uPltyaWdodF0pKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRNZXRob2Qud2l0aEFyZ3VtZW50cyhiaW5hcnlOYW1lLm5hbWUsCiAgICAgICAgICAgICAgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIobGVmdFR5cGUpLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBiaW5hcnlOYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gY3JlYXRlTWlzc2luZ1VuYXJ5KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIERhcnRUeXBlIGV4cHJlc3Npb25UeXBlLCBOYW1lIHVuYXJ5TmFtZSkgewogICAgaWYgKGlzVG9wTGV2ZWwpIHsKICAgICAgcmV0dXJuIG5ldyBVbmFyeUV4cHJlc3Npb24odW5hcnlOYW1lLCBleHByZXNzaW9uKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlVW5kZWZpbmVkTWV0aG9kLndpdGhBcmd1bWVudHModW5hcnlOYW1lLm5hbWUsCiAgICAgICAgICAgICAgcmVzb2x2ZVR5cGVQYXJhbWV0ZXIoZXhwcmVzc2lvblR5cGUpLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICB1bmFyeU5hbWUgPT0gdW5hcnlNaW51c05hbWUgPyAxIDogdW5hcnlOYW1lLm5hbWUubGVuZ3RoKTsKICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIE1peGluSW5mZXJyZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgVHlwZUNvbnN0cmFpbnRHYXRoZXJlciBnYXRoZXJlcjsKCiAgTWl4aW5JbmZlcnJlcih0aGlzLmNvcmVUeXBlcywgdGhpcy5nYXRoZXJlcik7CgogIFN1cGVydHlwZSBhc0luc3RhbnRpYXRpb25PZihTdXBlcnR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcyk7CgogIHZvaWQgcmVwb3J0UHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIENsYXNzIGNscyk7CgogIHZvaWQgZ2VuZXJhdGVDb25zdHJhaW50cygKICAgICAgQ2xhc3MgbWl4aW5DbGFzcywgU3VwZXJ0eXBlIGJhc2VUeXBlLCBTdXBlcnR5cGUgbWl4aW5TdXBlcnR5cGUpIHsKICAgIGlmIChtaXhpblN1cGVydHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICAgLy8gVGhlIHN1cGVydHlwZSBjb25zdHJhaW50IGlzbid0IGdlbmVyaWM7IGl0IGRvZXNuJ3QgY29uc3RyYWluIGFueXRoaW5nLgogICAgfSBlbHNlIGlmIChtaXhpblN1cGVydHlwZS5jbGFzc05vZGUuaXNBbm9ueW1vdXNNaXhpbikgewogICAgICAvLyBXZSBoYXZlIGVpdGhlciBhIG1peGluIGRlY2xhcmF0aW9uIGBtaXhpbiBNPFgwLCAuLi4sIFhuPiBvbiBTMCwgUzFgIG9yCiAgICAgIC8vIGEgVk0tc3R5bGUgc3VwZXIgbWl4aW4gYGFic3RyYWN0IGNsYXNzIE08WDAsIC4uLiwgWG4+IGV4dGVuZHMgUzAgd2l0aAogICAgICAvLyBTMWAgd2hlcmUgUzAgYW5kIFMxIGFyZSBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzIHRoYXQgcG9zc2libHkgaGF2ZSB0eXBlCiAgICAgIC8vIGFyZ3VtZW50cy4KICAgICAgLy8KICAgICAgLy8gSXQgaGFzIGJlZW4gY29tcGlsZWQgYnkgbmFtaW5nIHRoZSBzdXBlcmNsYXNzIHRvIGVpdGhlcjoKICAgICAgLy8KICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgUzAmUzE8Li4uPiBleHRlbmRzIE9iamVjdCBpbXBsZW1lbnRzIFMwLCBTMSB7fQogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBNPFgwLCAuLi4sIFhuPiBleHRlbmRzIFMwJlMxPC4uLj4gLi4uCiAgICAgIC8vCiAgICAgIC8vIGZvciBhIG1peGluIGRlY2xhcmF0aW9uLCBvciBlbHNlOgogICAgICAvLwogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBTMCZTMTwuLi4+ID0gUzAgd2l0aCBTMTsKICAgICAgLy8gYWJzdHJhY3QgY2xhc3MgTTxYMCwgLi4uLCBYbj4gZXh0ZW5kcyBTMCZTMTwuLi4+CiAgICAgIC8vCiAgICAgIC8vIGZvciBhIFZNLXN0eWxlIHN1cGVyIG1peGluLiAgVGhlIHR5cGUgcGFyYW1ldGVycyBvZiBTMCZTMSBhcmUgdGhlIFgwLAogICAgICAvLyAuLi4sIFhuIHRoYXQgb2NjdXJyZWQgZnJlZSBpbiBTMCBhbmQgUzEuICBUcmVhdCBTMCBhbmQgUzEgYXMgc2VwYXJhdGUKICAgICAgLy8gc3VwZXJ0eXBlIGNvbnN0cmFpbnRzIGJ5IHJlY3Vyc2l2ZWx5IGNhbGxpbmcgdGhpcyBhbGdvcml0aG0uCiAgICAgIC8vCiAgICAgIC8vIEluIHRoZSBEYXJ0IFZNIHRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzc2VzIHRoZW1zZWx2ZXMgYXJlIGFsbAogICAgICAvLyBlbGltaW5hdGVkIGJ5IHRyYW5zbGF0aW5nIHRoZW0gdG8gbm9ybWFsIGNsYXNzZXMuICBJbiB0aGF0IGNhc2UsIHRoZQogICAgICAvLyBtaXhpbiBhcHBlYXJzIGFzIHRoZSBvbmx5IGludGVyZmFjZSBpbiB0aGUgaW50cm9kdWNlZCBjbGFzcy4gIFdlCiAgICAgIC8vIHN1cHBvcnQgdGhyZWUgZm9ybXMgZm9yIHRoZSBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzOgogICAgICAvLwogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBTMCZTMTwuLi4+IGV4dGVuZHMgT2JqZWN0IGltcGxlbWVudHMgUzAsIFMxIHt9CiAgICAgIC8vIGFic3RyYWN0IGNsYXNzIFMwJlMxPC4uLj4gPSBTMCB3aXRoIFMxOwogICAgICAvLyBhYnN0cmFjdCBjbGFzcyBTMCZTMTwuLi4+IGV4dGVuZHMgUzAgaW1wbGVtZW50cyBTMSB7fQogICAgICBDbGFzcyBtaXhpblN1cGVyY2xhc3MgPSBtaXhpblN1cGVydHlwZS5jbGFzc05vZGU7CiAgICAgIGlmIChtaXhpblN1cGVyY2xhc3MubWl4ZWRJblR5cGUgPT0gbnVsbCAmJgogICAgICAgICAgbWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXMubGVuZ3RoICE9IDEgJiYKICAgICAgICAgIChtaXhpblN1cGVyY2xhc3Muc3VwZXJjbGFzcyAhPSBjb3JlVHlwZXMub2JqZWN0Q2xhc3MgfHwKICAgICAgICAgICAgICBtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggIT0gMikpIHsKICAgICAgICB1bmV4cGVjdGVkKAogICAgICAgICAgICAnQ29tcGlsZXItZ2VuZXJhdGVkIG1peGluIGFwcGxpY2F0aW9ucyBoYXZlIGEgbWl4aW4gb3IgZWxzZSAnCiAgICAgICAgICAgICAgICAnaW1wbGVtZW50IGV4YWN0bHkgb25lIHR5cGUnLAogICAgICAgICAgICAnJG1peGluU3VwZXJjbGFzcyBpbXBsZW1lbnRzICcKICAgICAgICAgICAgICAgICcke21peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmxlbmd0aH0gdHlwZXMnLAogICAgICAgICAgICBtaXhpblN1cGVyY2xhc3MuZmlsZU9mZnNldCwKICAgICAgICAgICAgbWl4aW5TdXBlcmNsYXNzLmZpbGVVcmkpOwogICAgICB9CiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShtaXhpblN1cGVydHlwZSk7CiAgICAgIFN1cGVydHlwZSBzMCwgczE7CiAgICAgIGlmIChtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggPT0gMikgewogICAgICAgIHMwID0gbWl4aW5TdXBlcmNsYXNzLmltcGxlbWVudGVkVHlwZXNbMF07CiAgICAgICAgczEgPSBtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlc1sxXTsKICAgICAgfSBlbHNlIGlmIChtaXhpblN1cGVyY2xhc3MuaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGggPT0gMSkgewogICAgICAgIHMwID0gbWl4aW5TdXBlcmNsYXNzLnN1cGVydHlwZTsKICAgICAgICBzMSA9IG1peGluU3VwZXJjbGFzcy5pbXBsZW1lbnRlZFR5cGVzLmZpcnN0OwogICAgICB9IGVsc2UgewogICAgICAgIHMwID0gbWl4aW5TdXBlcmNsYXNzLnN1cGVydHlwZTsKICAgICAgICBzMSA9IG1peGluU3VwZXJjbGFzcy5taXhlZEluVHlwZTsKICAgICAgfQogICAgICBzMCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlU3VwZXJ0eXBlKHMwKTsKICAgICAgczEgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVN1cGVydHlwZShzMSk7CiAgICAgIGdlbmVyYXRlQ29uc3RyYWludHMobWl4aW5DbGFzcywgYmFzZVR5cGUsIHMwKTsKICAgICAgZ2VuZXJhdGVDb25zdHJhaW50cyhtaXhpbkNsYXNzLCBiYXNlVHlwZSwgczEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRmluZCB0aGUgdHlwZSBVMCB3aGljaCBpcyBiYXNlVHlwZSBhcyBhbiBpbnN0YW5jZSBvZiBtaXhpblN1cGVydHlwZSdzCiAgICAgIC8vIGNsYXNzLgogICAgICBTdXBlcnR5cGUgc3VwZXJ0eXBlID0KICAgICAgICAgIGFzSW5zdGFudGlhdGlvbk9mKGJhc2VUeXBlLCBtaXhpblN1cGVydHlwZS5jbGFzc05vZGUpOwogICAgICBpZiAoc3VwZXJ0eXBlID09IG51bGwpIHsKICAgICAgICByZXBvcnRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBtaXhpbkNsYXNzLm5hbWUsCiAgICAgICAgICAgICAgICBiYXNlVHlwZS5jbGFzc05vZGUubmFtZSwKICAgICAgICAgICAgICAgIG1peGluU3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZSwKICAgICAgICAgICAgICAgIG1peGluQ2xhc3MuZW5jbG9zaW5nTGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgbWl4aW5DbGFzcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIEludGVyZmFjZVR5cGUgdTAgPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZShiYXNlVHlwZSkKICAgICAgICAgIC5zdWJzdGl0dXRlU3VwZXJ0eXBlKHN1cGVydHlwZSkKICAgICAgICAgIC5hc0ludGVyZmFjZVR5cGU7CiAgICAgIC8vIFdlIHdhbnQgdG8gc29sdmUgVTAgPSBTMCB3aGVyZSBTMCBpcyBtaXhpblN1cGVydHlwZSwgYnV0IHdlIG9ubHkgaGF2ZQogICAgICAvLyBhIHN1YnR5cGUgY29uc3RyYWludHMuICBTb2x2ZSBmb3IgZXF1YWxpdHkgYnkgc29sdmluZwogICAgICAvLyBib3RoIFUwIDw6IFMwIGFuZCBTMCA8OiBVMC4KICAgICAgSW50ZXJmYWNlVHlwZSBzMCA9IG1peGluU3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZTsKICAgICAgZ2F0aGVyZXIudHJ5U3VidHlwZU1hdGNoKHUwLCBzMCk7CiAgICAgIGdhdGhlcmVyLnRyeVN1YnR5cGVNYXRjaChzMCwgdTApOwogICAgfQogIH0KCiAgdm9pZCBpbmZlcihDbGFzcyBjbGFzc05vZGUpIHsKICAgIFN1cGVydHlwZSBtaXhlZEluVHlwZSA9IGNsYXNzTm9kZS5taXhlZEluVHlwZTsKICAgIGFzc2VydChtaXhlZEluVHlwZS50eXBlQXJndW1lbnRzLmV2ZXJ5KCh0KSA9PiB0ID09IGNvbnN0IFVua25vd25UeXBlKCkpKTsKICAgIC8vIE5vdGUgdGhhdCB3ZSBoYXZlIG5vIGFub255bW91cyBtaXhpbiBhcHBsaWNhdGlvbnMsIHRoZXkgaGF2ZSBhbGwKICAgIC8vIGJlZW4gbmFtZWQuICBOb3RlIGFsc28gdGhhdCBtaXhpbiBjb21wb3NpdGlvbiBoYXMgYmVlbiB0cmFuc2xhdGVkCiAgICAvLyBzbyB0aGF0IHdlIG9ubHkgaGF2ZSBtaXhpbiBhcHBsaWNhdGlvbnMgb2YgdGhlIGZvcm0gYFMgd2l0aCBNYC4KICAgIFN1cGVydHlwZSBiYXNlVHlwZSA9IGNsYXNzTm9kZS5zdXBlcnR5cGU7CiAgICBDbGFzcyBtaXhpbkNsYXNzID0gbWl4ZWRJblR5cGUuY2xhc3NOb2RlOwogICAgU3VwZXJ0eXBlIG1peGluU3VwZXJ0eXBlID0gbWl4aW5DbGFzcy5zdXBlcnR5cGU7CiAgICAvLyBHZW5lcmF0ZSBjb25zdHJhaW50cyBiYXNlZCBvbiB0aGUgbWl4aW4ncyBzdXBlcnR5cGUuCiAgICBnZW5lcmF0ZUNvbnN0cmFpbnRzKG1peGluQ2xhc3MsIGJhc2VUeXBlLCBtaXhpblN1cGVydHlwZSk7CiAgICAvLyBTb2x2ZSB0aGVtIHRvIGdldCBhIG1hcCBmcm9tIHR5cGUgcGFyYW1ldGVycyB0byB1cHBlciBhbmQgbG93ZXIKICAgIC8vIGJvdW5kcy4KICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD4gcmVzdWx0ID0KICAgICAgICBnYXRoZXJlci5jb21wdXRlQ29uc3RyYWludHMoY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkpOwogICAgLy8gR2VuZXJhdGUgbmV3IHR5cGUgcGFyYW1ldGVycyB3aXRoIHRoZSBzb2x1dGlvbiBhcyBib3VuZHMuCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBtaXhpbkNsYXNzLnR5cGVQYXJhbWV0ZXJzLm1hcCgocCkgewogICAgICBUeXBlQ29uc3RyYWludCBjb25zdHJhaW50ID0gcmVzdWx0W3BdOwogICAgICAvLyBCZWNhdXNlIHdlIHNvbHZlZCBmb3IgZXF1YWxpdHksIGEgdmFsaWQgc29sdXRpb24gaGFzIGEgcGFyYW1ldGVyCiAgICAgIC8vIGVpdGhlciB1bmNvbnN0cmFpbmVkIG9yIGVsc2Ugd2l0aCBpZGVudGljYWwgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcy4KICAgICAgaWYgKGNvbnN0cmFpbnQgIT0gbnVsbCAmJiBjb25zdHJhaW50LnVwcGVyICE9IGNvbnN0cmFpbnQubG93ZXIpIHsKICAgICAgICByZXBvcnRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBtaXhpbkNsYXNzLm5hbWUsCiAgICAgICAgICAgICAgICBiYXNlVHlwZS5jbGFzc05vZGUubmFtZSwKICAgICAgICAgICAgICAgIG1peGluU3VwZXJ0eXBlLmFzSW50ZXJmYWNlVHlwZSwKICAgICAgICAgICAgICAgIG1peGluQ2xhc3MuZW5jbG9zaW5nTGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgbWl4aW5DbGFzcyk7CiAgICAgICAgcmV0dXJuIHA7CiAgICAgIH0KICAgICAgYXNzZXJ0KGNvbnN0cmFpbnQgPT0gbnVsbCB8fCBjb25zdHJhaW50LnVwcGVyID09IGNvbnN0cmFpbnQubG93ZXIpOwogICAgICBib29sIGV4YWN0ID0KICAgICAgICAgIGNvbnN0cmFpbnQgIT0gbnVsbCAmJiBjb25zdHJhaW50LnVwcGVyICE9IGNvbnN0IFVua25vd25UeXBlKCk7CiAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlcigKICAgICAgICAgIHAubmFtZSwgZXhhY3QgPyBjb25zdHJhaW50LnVwcGVyIDogcC5ib3VuZCwgcC5kZWZhdWx0VHlwZSk7CiAgICB9KS50b0xpc3QoKTsKICAgIC8vIEJvdW5kcyBtaWdodCBtZW50aW9uIHRoZSBtaXhpbiBjbGFzcydzIHR5cGUgcGFyYW1ldGVycyBzbyB3ZSBoYXZlIHRvCiAgICAvLyBzdWJzdGl0dXRlIHRoZW0gYmVmb3JlIGNhbGxpbmcgaW5zdGFudGlhdGUgdG8gYm91bmRzLgogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoCiAgICAgICAgbWl4aW5DbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZ2VuZXJhdGUoCiAgICAgICAgICAgIHBhcmFtZXRlcnMubGVuZ3RoLAogICAgICAgICAgICAoaSkgPT4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcoCiAgICAgICAgICAgICAgICBtaXhpbkNsYXNzLnR5cGVQYXJhbWV0ZXJzW2ldLCBwYXJhbWV0ZXJzW2ldKSkpOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIHAgaW4gcGFyYW1ldGVycykgewogICAgICBwLmJvdW5kID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHAuYm91bmQpOwogICAgfQogICAgLy8gVXNlIGluc3RhbnRpYXRlIHRvIGJvdW5kcy4KICAgIExpc3Q8RGFydFR5cGU+IGJvdW5kcyA9IGNhbGN1bGF0ZUJvdW5kcyhwYXJhbWV0ZXJzLCBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaXhlZEluVHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIG1peGVkSW5UeXBlLnR5cGVBcmd1bWVudHNbaV0gPSBib3VuZHNbaV07CiAgICB9CiAgfQp9CgovLy8gVGhlIHJlc3VsdCBvZiBhIHN0YXRlbWVudCBpbmZlcmVuY2UuCmNsYXNzIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB7CiAgY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CgogIGZhY3RvcnkgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0LnNpbmdsZShTdGF0ZW1lbnQgc3RhdGVtZW50KSA9CiAgICAgIFNpbmdsZVN0YXRlbWVudEluZmVyZW5jZVJlc3VsdDsKCiAgZmFjdG9yeSBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQubXVsdGlwbGUoCiAgICAgICAgICBpbnQgZmlsZU9mZnNldCwgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMpID0KICAgICAgTXVsdGlwbGVTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQ7CgogIGJvb2wgZ2V0IGhhc0NoYW5nZWQgPT4gZmFsc2U7CgogIFN0YXRlbWVudCBnZXQgc3RhdGVtZW50ID0+CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQuc3RhdGVtZW50Jyk7CgogIGludCBnZXQgc3RhdGVtZW50Q291bnQgPT4KICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1N0YXRlbWVudEluZmVyZW5jZVJlc3VsdC5zdGF0ZW1lbnRDb3VudCcpOwoKICBMaXN0PFN0YXRlbWVudD4gZ2V0IHN0YXRlbWVudHMgPT4KICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1N0YXRlbWVudEluZmVyZW5jZVJlc3VsdC5zdGF0ZW1lbnRzJyk7Cn0KCmNsYXNzIFNpbmdsZVN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBpbXBsZW1lbnRzIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB7CiAgZmluYWwgU3RhdGVtZW50IHN0YXRlbWVudDsKCiAgU2luZ2xlU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KHRoaXMuc3RhdGVtZW50KTsKCiAgYm9vbCBnZXQgaGFzQ2hhbmdlZCA9PiB0cnVlOwoKICBpbnQgZ2V0IHN0YXRlbWVudENvdW50ID0+IDE7CgogIExpc3Q8U3RhdGVtZW50PiBnZXQgc3RhdGVtZW50cyA9PgogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignU2luZ2xlU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0LnN0YXRlbWVudHMnKTsKfQoKY2xhc3MgTXVsdGlwbGVTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgaW1wbGVtZW50cyBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgewogIGZpbmFsIGludCBmaWxlT2Zmc2V0OwogIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzOwoKICBNdWx0aXBsZVN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCh0aGlzLmZpbGVPZmZzZXQsIHRoaXMuc3RhdGVtZW50cyk7CgogIGJvb2wgZ2V0IGhhc0NoYW5nZWQgPT4gdHJ1ZTsKCiAgU3RhdGVtZW50IGdldCBzdGF0ZW1lbnQgPT4gbmV3IEJsb2NrKHN0YXRlbWVudHMpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKCiAgaW50IGdldCBzdGF0ZW1lbnRDb3VudCA9PiBzdGF0ZW1lbnRzLmxlbmd0aDsKfQoKLy8vIFRlbGxzIHRoZSBpbmZlcnJlZCB0eXBlIGFuZCBob3cgdGhlIGNvZGUgc2hvdWxkIGJlIHRyYW5zZm9ybWVkLgovLy8KLy8vIEl0IGlzIGludGVuZGVkIGZvciB1c2UgYnkgZ2VuZXJhbGl6ZWQgaW5mZXJlbmNlIG1ldGhvZHMsIHN1Y2ggYXMKLy8vIFtUeXBlSW5mZXJyZXJJbXBsLmluZmVySW52b2NhdGlvbl0sIHdoZXJlIHRoZSBpbnB1dCBbRXhwcmVzc2lvbl0gaXNuJ3QKLy8vIGF2YWlsYWJsZSBmb3IgcmV3cml0aW5nLiAgU28sIGluc3RlYWQgb2YgdHJhbnNmb3JtaW5nIHRoZSBjb2RlLCB0aGUgcmVzdWx0Ci8vLyBvZiB0aGUgaW5mZXJlbmNlIHByb3ZpZGVzIGEgd2F5IHRvIHRyYW5zZm9ybSB0aGUgY29kZSBhdCB0aGUgcG9pbnQgb2YKLy8vIGludm9jYXRpb24uCmFic3RyYWN0IGNsYXNzIEludm9jYXRpb25JbmZlcmVuY2VSZXN1bHQgewogIERhcnRUeXBlIGdldCBpbmZlcnJlZFR5cGU7CgogIC8vLyBBcHBsaWVzIHRoZSByZXN1bHQgb2YgdGhlIGluZmVyZW5jZSB0byB0aGUgZXhwcmVzc2lvbiBiZWluZyBpbmZlcnJlZC4KICAvLy8KICAvLy8gQSBzdWNjZXNzZnVsIHJlc3VsdCBsZWF2ZXMgW2V4cHJlc3Npb25dIGludGFjdCwgYW5kIGFuIGVycm9yIGRldGVjdGVkCiAgLy8vIGR1cmluZyBpbmZlcmVuY2Ugd291bGQgd3JhcCB0aGUgZXhwcmVzc2lvbiBpbnRvIGFuIFtJbnZhbGlkRXhwcmVzc2lvbl0uCiAgRXhwcmVzc2lvbiBhcHBseVJlc3VsdChFeHByZXNzaW9uIGV4cHJlc3Npb24pOwp9CgpjbGFzcyBTdWNjZXNzZnVsSW5mZXJlbmNlUmVzdWx0IGltcGxlbWVudHMgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwoKICBTdWNjZXNzZnVsSW5mZXJlbmNlUmVzdWx0KHRoaXMuaW5mZXJyZWRUeXBlKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBhcHBseVJlc3VsdChFeHByZXNzaW9uIGV4cHJlc3Npb24pID0+IGV4cHJlc3Npb247Cn0KCmNsYXNzIFdyYXBJblByb2JsZW1JbmZlcmVuY2VSZXN1bHQgaW1wbGVtZW50cyBJbnZvY2F0aW9uSW5mZXJlbmNlUmVzdWx0IHsKICBAb3ZlcnJpZGUKICBmaW5hbCBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKCiAgZmluYWwgaW50IGxlbmd0aDsKCiAgZmluYWwgSW5mZXJlbmNlSGVscGVyIGhlbHBlcjsKCiAgV3JhcEluUHJvYmxlbUluZmVyZW5jZVJlc3VsdCgKICAgICAgdGhpcy5pbmZlcnJlZFR5cGUsIHRoaXMubWVzc2FnZSwgdGhpcy5sZW5ndGgsIHRoaXMuaGVscGVyKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBhcHBseVJlc3VsdChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIHJldHVybiBoZWxwZXIud3JhcEluUHJvYmxlbShleHByZXNzaW9uLCBtZXNzYWdlLCBsZW5ndGgpOwogIH0KfQoKLy8vIFRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpbmZlcmVuY2UuCmNsYXNzIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgewogIC8vLyBUaGUgaW5mZXJyZWQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4KICBmaW5hbCBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIC8vLyBUaGUgaW5mZXJyZWQgZXhwcmVzc2lvbi4KICBmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb247CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQodGhpcy5pbmZlcnJlZFR5cGUsIHRoaXMuZXhwcmVzc2lvbikKICAgICAgOiBhc3NlcnQoZXhwcmVzc2lvbiAhPSBudWxsKTsKCiAgLy8vIFRoZSBndWFyZHMgdXNlZCBmb3IgbnVsbC1hd2FyZSBhY2Nlc3MgaWYgdGhlIGV4cHJlc3Npb24gaXMgcGFydCBvZiBhCiAgLy8vIG51bGwtc2hvcnRpbmcuCiAgTGluazxOdWxsQXdhcmVHdWFyZD4gZ2V0IG51bGxBd2FyZUd1YXJkcyA9PiBjb25zdCBMaW5rPE51bGxBd2FyZUd1YXJkPigpOwoKICAvLy8gSWYgdGhlIGV4cHJlc3Npb24gaXMgcGFydCBvZiBhIG51bGwtc2hvcnRpbmcsIHRoaXMgaXMgdGhlIGFjdGlvbiBwZXJmb3JtZWQKICAvLy8gb24gdGhlIGd1YXJkZWQgdmFyaWFibGUsIGZvdW5kIGFzIHRoZSBmaXJzdCBndWFyZCBpbiBbbnVsbEF3YXJlR3VhcmRzXS4KICAvLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIFtleHByZXNzaW9uXS4KICBFeHByZXNzaW9uIGdldCBudWxsQXdhcmVBY3Rpb24gPT4gZXhwcmVzc2lvbjsKCiAgRGFydFR5cGUgZ2V0IG51bGxBd2FyZUFjdGlvblR5cGUgPT4gaW5mZXJyZWRUeXBlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgkaW5mZXJyZWRUeXBlLCRleHByZXNzaW9uKSc7Cn0KCi8vLyBBIGd1YXJkIHVzZWQgZm9yIGNyZWF0aW5nIG51bGwtc2hvcnRpbmcgbnVsbC1hd2FyZSBhY3Rpb25zLgpjbGFzcyBOdWxsQXdhcmVHdWFyZCB7CiAgLy8vIFRoZSB2YXJpYWJsZSB1c2VkIHRvIGd1YXJkIHRoZSBudWxsLWF3YXJlIGFjdGlvbi4KICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIF9udWxsQXdhcmVWYXJpYWJsZTsKCiAgLy8vIFRoZSBmaWxlIG9mZnNldCB1c2VkIGZvciB0aGUgbnVsbC10ZXN0LgogIGludCBfbnVsbEF3YXJlRmlsZU9mZnNldDsKCiAgLy8vIFRoZSBbTWVtYmVyXSB1c2VkIGZvciB0aGUgPT0gY2FsbC4KICBmaW5hbCBNZW1iZXIgX251bGxBd2FyZUVxdWFsczsKCiAgZmluYWwgVHlwZUluZmVycmVySW1wbCBfaW5mZXJyZXI7CgogIE51bGxBd2FyZUd1YXJkKHRoaXMuX251bGxBd2FyZVZhcmlhYmxlLCB0aGlzLl9udWxsQXdhcmVGaWxlT2Zmc2V0LAogICAgICB0aGlzLl9udWxsQXdhcmVFcXVhbHMsIHRoaXMuX2luZmVycmVyKQogICAgICA6IGFzc2VydChfbnVsbEF3YXJlVmFyaWFibGUgIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KF9udWxsQXdhcmVGaWxlT2Zmc2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChfbnVsbEF3YXJlRXF1YWxzICE9IG51bGwpLAogICAgICAgIGFzc2VydChfaW5mZXJyZXIgIT0gbnVsbCkgewogICAgLy8gRW5zdXJlIHRoZSBpbml0aWFsaXplciBvZiBbX251bGxBd2FyZVZhcmlhYmxlXSBpcyBwcm9tb3RlZCB0bwogICAgLy8gbm9uLW51bGxhYmxlLgogICAgX2luZmVycmVyLmZsb3dBbmFseXNpcwogICAgICAgIC5udWxsQXdhcmVBY2Nlc3NfcmlnaHRCZWdpbihfbnVsbEF3YXJlVmFyaWFibGUuaW5pdGlhbGl6ZXIpOwogICAgLy8gRW5zdXJlIFtfbnVsbEF3YXJlVmFyaWFibGVdIGlzIHByb21vdGVkIHRvIG5vbi1udWxsYWJsZS4KICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEF2b2lkIGNyZWF0aW5nIGEgW1ZhcmlhYmxlR2V0XSB0byBwcm9tb3RlIHRoZQogICAgLy8gdmFyaWFibGUuCiAgICBWYXJpYWJsZUdldCByZWFkID0gbmV3IFZhcmlhYmxlR2V0KF9udWxsQXdhcmVWYXJpYWJsZSk7CiAgICBfaW5mZXJyZXIuZmxvd0FuYWx5c2lzLnZhcmlhYmxlUmVhZChyZWFkLCBfbnVsbEF3YXJlVmFyaWFibGUpOwogICAgX2luZmVycmVyLmZsb3dBbmFseXNpcy5udWxsQXdhcmVBY2Nlc3NfcmlnaHRCZWdpbihyZWFkKTsKICB9CgogIC8vLyBDcmVhdGVzIHRoZSBudWxsLWd1YXJkZWQgYXBwbGljYXRpb24gb2YgW251bGxBd2FyZUFjdGlvbl0gd2l0aCB0aGUKICAvLy8gW2luZmVycmVkVHlwZV0uCiAgLy8vCiAgLy8vIEZvciBhbiBudWxsLWF3YXJlIGFjdGlvbiBgdi5lYCBvbiB0aGUgW19udWxsQXdhcmVWYXJpYWJsZV0gYHZgIHRoZSBjcmVhdGVkCiAgLy8vIGV4cHJlc3Npb24gaXMKICAvLy8KICAvLy8gICAgIGxldCB2IGluIHYgPT0gbnVsbCA/IG51bGwgOiB2LmUKICAvLy8KICBFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb24oCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSwgRXhwcmVzc2lvbiBudWxsQXdhcmVBY3Rpb24pIHsKICAgIC8vIEVuZCBub24tbnVsbGFibGUgcHJvbW90aW9uIG9mIFtfbnVsbEF3YXJlVmFyaWFibGVdLgogICAgX2luZmVycmVyLmZsb3dBbmFseXNpcy5udWxsQXdhcmVBY2Nlc3NfZW5kKCk7CiAgICAvLyBFbmQgbm9uLW51bGxhYmxlIHByb21vdGlvbiBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgW19udWxsQXdhcmVWYXJpYWJsZV0uCiAgICBfaW5mZXJyZXIuZmxvd0FuYWx5c2lzLm51bGxBd2FyZUFjY2Vzc19lbmQoKTsKICAgIE1ldGhvZEludm9jYXRpb24gZXF1YWxzTnVsbCA9IGNyZWF0ZUVxdWFsc051bGwoX251bGxBd2FyZUZpbGVPZmZzZXQsCiAgICAgICAgY3JlYXRlVmFyaWFibGVHZXQoX251bGxBd2FyZVZhcmlhYmxlKSwgX251bGxBd2FyZUVxdWFscyk7CiAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICBlcXVhbHNOdWxsLAogICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gX251bGxBd2FyZUZpbGVPZmZzZXQsCiAgICAgICAgbnVsbEF3YXJlQWN0aW9uLAogICAgICAgIGluZmVycmVkVHlwZSk7CiAgICByZXR1cm4gbmV3IExldChfbnVsbEF3YXJlVmFyaWFibGUsIGNvbmRpdGlvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gX251bGxBd2FyZUZpbGVPZmZzZXQ7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PgogICAgICAnTnVsbEF3YXJlR3VhcmQoJF9udWxsQXdhcmVWYXJpYWJsZSwkX251bGxBd2FyZUZpbGVPZmZzZXQsJwogICAgICAnJF9udWxsQXdhcmVFcXVhbHMpJzsKfQoKLy8vIFRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpbmZlcmVuY2UgdGhhdCBpcyBndWFyZGVkIHdpdGggYSBudWxsIGF3YXJlCi8vLyB2YXJpYWJsZS4KY2xhc3MgTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbXBsZW1lbnRzIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgewogIC8vLyBUaGUgaW5mZXJyZWQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4KICBmaW5hbCBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CgogIC8vLyBUaGUgaW5mZXJyZWQgdHlwZSBvZiB0aGUgW251bGxBd2FyZUFjdGlvbl0uCiAgZmluYWwgRGFydFR5cGUgbnVsbEF3YXJlQWN0aW9uVHlwZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBFeHByZXNzaW9uIG51bGxBd2FyZUFjdGlvbjsKCiAgRXhwcmVzc2lvbiBfZXhwcmVzc2lvbjsKCiAgTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCh0aGlzLmluZmVycmVkVHlwZSwKICAgICAgdGhpcy5udWxsQXdhcmVBY3Rpb25UeXBlLCB0aGlzLm51bGxBd2FyZUd1YXJkcywgdGhpcy5udWxsQXdhcmVBY3Rpb24pCiAgICAgIDogYXNzZXJ0KG51bGxBd2FyZUd1YXJkcy5pc05vdEVtcHR5KSwKICAgICAgICBhc3NlcnQobnVsbEF3YXJlQWN0aW9uICE9IG51bGwpOwoKICBFeHByZXNzaW9uIGdldCBleHByZXNzaW9uIHsKICAgIGlmIChfZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAgICAgIF9leHByZXNzaW9uID0gbnVsbEF3YXJlQWN0aW9uOwogICAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZCA9IG51bGxBd2FyZUd1YXJkczsKICAgICAgd2hpbGUgKG51bGxBd2FyZUd1YXJkLmlzTm90RW1wdHkpIHsKICAgICAgICBfZXhwcmVzc2lvbiA9CiAgICAgICAgICAgIG51bGxBd2FyZUd1YXJkLmhlYWQuY3JlYXRlRXhwcmVzc2lvbihpbmZlcnJlZFR5cGUsIF9leHByZXNzaW9uKTsKICAgICAgICBudWxsQXdhcmVHdWFyZCA9IG51bGxBd2FyZUd1YXJkLnRhaWw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfZXhwcmVzc2lvbjsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICdOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KCRpbmZlcnJlZFR5cGUsJG51bGxBd2FyZUd1YXJkcywnCiAgICAgICckbnVsbEF3YXJlQWN0aW9uKSc7Cn0KCmVudW0gT2JqZWN0QWNjZXNzVGFyZ2V0S2luZCB7CiAgaW5zdGFuY2VNZW1iZXIsCiAgY2FsbEZ1bmN0aW9uLAogIGV4dGVuc2lvbk1lbWJlciwKICBkeW5hbWljLAogIG5ldmVyLAogIGludmFsaWQsCiAgbWlzc2luZywKICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZW1vdmUgdGhpcy4KICB1bnJlc29sdmVkLAp9CgovLy8gUmVzdWx0IGZvciBwZXJmb3JtaW5nIGFuIGFjY2VzcyBvbiBhbiBvYmplY3QsIGxpa2UgYG8uZm9vYCwgYG8uZm9vKClgIGFuZAovLy8gYG8uZm9vID0gLi4uYC4KY2xhc3MgT2JqZWN0QWNjZXNzVGFyZ2V0IHsKICBmaW5hbCBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kIGtpbmQ7CiAgZmluYWwgTWVtYmVyIG1lbWJlcjsKCiAgY29uc3QgT2JqZWN0QWNjZXNzVGFyZ2V0LmludGVybmFsKHRoaXMua2luZCwgdGhpcy5tZW1iZXIpOwoKICAvLy8gQ3JlYXRlcyBhbiBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIFttZW1iZXJdLgogIGZhY3RvcnkgT2JqZWN0QWNjZXNzVGFyZ2V0LmludGVyZmFjZU1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBhc3NlcnQobWVtYmVyICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBPYmplY3RBY2Nlc3NUYXJnZXQuaW50ZXJuYWwoCiAgICAgICAgT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlciwgbWVtYmVyKTsKICB9CgogIC8vLyBDcmVhdGVzIGFuIGFjY2VzcyB0byB0aGUgZXh0ZW5zaW9uIFttZW1iZXJdLgogIGZhY3RvcnkgT2JqZWN0QWNjZXNzVGFyZ2V0LmV4dGVuc2lvbk1lbWJlcigKICAgICAgTWVtYmVyIG1lbWJlciwKICAgICAgTWVtYmVyIHRlYXJvZmZUYXJnZXQsCiAgICAgIFByb2NlZHVyZUtpbmQga2luZCwKICAgICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlQXJndW1lbnRzKSA9IEV4dGVuc2lvbkFjY2Vzc1RhcmdldDsKCiAgLy8vIENyZWF0ZXMgYW4gYWNjZXNzIHRvIGEgJ2NhbGwnIG1ldGhvZCBvbiBhIGZ1bmN0aW9uLCBpLmUuIGEgZnVuY3Rpb24KICAvLy8gaW52b2NhdGlvbi4KICBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQuY2FsbEZ1bmN0aW9uKCkKICAgICAgOiB0aGlzLmludGVybmFsKE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuY2FsbEZ1bmN0aW9uLCBudWxsKTsKCiAgLy8vIENyZWF0ZXMgYW4gYWNjZXNzIHdpdGggbm8ga25vd24gdGFyZ2V0LgogIGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC51bnJlc29sdmVkKCkKICAgICAgOiB0aGlzLmludGVybmFsKE9iamVjdEFjY2Vzc1RhcmdldEtpbmQudW5yZXNvbHZlZCwgbnVsbCk7CgogIC8vLyBDcmVhdGVzIGFuIGFjY2VzcyBvbiBhIGR5bmFtaWMgcmVjZWl2ZXIgdHlwZSB3aXRoIG5vIGtub3duIHRhcmdldC4KICBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQuZHluYW1pYygpCiAgICAgIDogdGhpcy5pbnRlcm5hbChPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmR5bmFtaWMsIG51bGwpOwoKICAvLy8gQ3JlYXRlcyBhbiBhY2Nlc3Mgb24gYSByZWNlaXZlciBvZiB0eXBlIE5ldmVyIHdpdGggbm8ga25vd24gdGFyZ2V0LgogIGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5uZXZlcigpCiAgICAgIDogdGhpcy5pbnRlcm5hbChPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm5ldmVyLCBudWxsKTsKCiAgLy8vIENyZWF0ZXMgYW4gYWNjZXNzIHdpdGggbm8gdGFyZ2V0IGR1ZSB0byBhbiBpbnZhbGlkIHJlY2VpdmVyIHR5cGUuCiAgLy8vCiAgLy8vIFRoaXMgaXMgbm90IGluIGl0c2VsZiBhbiBlcnJvciBidXQgYSBjb25zZXF1ZW5jZSBvZiBhbm90aGVyIGVycm9yLgogIGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5pbnZhbGlkKCkKICAgICAgOiB0aGlzLmludGVybmFsKE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW52YWxpZCwgbnVsbCk7CgogIC8vLyBDcmVhdGVzIGFuIGFjY2VzcyB3aXRoIG5vIHRhcmdldC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbiBlcnJvciBjYXNlLgogIGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5taXNzaW5nKCkKICAgICAgOiB0aGlzLmludGVybmFsKE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubWlzc2luZywgbnVsbCk7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGFuIGFjY2VzcyB0byBhbiBpbnN0YW5jZSBtZW1iZXIuCiAgYm9vbCBnZXQgaXNJbnN0YW5jZU1lbWJlciA9PiBraW5kID09IE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW5zdGFuY2VNZW1iZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGFuIGFjY2VzcyB0byBhbiBleHRlbnNpb24gbWVtYmVyLgogIGJvb2wgZ2V0IGlzRXh0ZW5zaW9uTWVtYmVyID0+IGtpbmQgPT0gT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5leHRlbnNpb25NZW1iZXI7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGFuIGFjY2VzcyB0byB0aGUgJ2NhbGwnIG1ldGhvZCBvbiBhIGZ1bmN0aW9uLgogIGJvb2wgZ2V0IGlzQ2FsbEZ1bmN0aW9uID0+IGtpbmQgPT0gT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5jYWxsRnVuY3Rpb247CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGFuIGFjY2VzcyB3aXRob3V0IGEga25vd24gdGFyZ2V0LgogIGJvb2wgZ2V0IGlzVW5yZXNvbHZlZCA9PgogICAgICBraW5kID09IE9iamVjdEFjY2Vzc1RhcmdldEtpbmQudW5yZXNvbHZlZCB8fAogICAgICBpc0R5bmFtaWMgfHwKICAgICAgaXNJbnZhbGlkIHx8CiAgICAgIGlzTWlzc2luZzsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgYW4gYWNjZXNzIG9uIGEgZHluYW1pYyByZWNlaXZlciB0eXBlLgogIGJvb2wgZ2V0IGlzRHluYW1pYyA9PiBraW5kID09IE9iamVjdEFjY2Vzc1RhcmdldEtpbmQuZHluYW1pYzsKCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgYW4gYWNjZXNzIG9uIGFuIGludmFsaWQgcmVjZWl2ZXIgdHlwZS4KICBib29sIGdldCBpc0ludmFsaWQgPT4ga2luZCA9PSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmludmFsaWQ7CgogIC8vLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGFuIGFjY2VzcyB3aXRoIG5vIHRhcmdldC4KICBib29sIGdldCBpc01pc3NpbmcgPT4ga2luZCA9PSBPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLm1pc3Npbmc7CgogIC8vLyBSZXR1cm5zIHRoZSBvcmlnaW5hbCBwcm9jZWR1cmUga2luZCwgaWYgdGhpcyBpcyBhbiBleHRlbnNpb24gbWV0aG9kCiAgLy8vIHRhcmdldC4KICAvLy8KICAvLy8gVGhpcyBpcyBuZWVkIGJlY2F1c2UgZ2V0dGVycywgc2V0dGVycywgYW5kIG1ldGhvZHMgYXJlIGNvbnZlcnRlZCBpbnRvCiAgLy8vIHRvcCBsZXZlbCBtZXRob2RzLCBidXQgYWNjZXNzIGFuZCBpbnZvY2F0aW9uIHNob3VsZCBzdGlsbCBiZSB0cmVhdGVkIGFzCiAgLy8vIGlmIHRoZXkgYXJlIHRoZSBvcmlnaW5hbCBwcm9jZWR1cmUga2luZC4KICBQcm9jZWR1cmVLaW5kIGdldCBleHRlbnNpb25NZXRob2RLaW5kID0+CiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdPYmplY3RBY2Nlc3NUYXJnZXQuZXh0ZW5zaW9uTWV0aG9kS2luZCcpOwoKICAvLy8gUmV0dXJucyBpbmZlcnJlZCB0eXBlIGFyZ3VtZW50cyBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBhbiBleHRlbnNpb24KICAvLy8gbWV0aG9kIHRoYXQgY29tZXMgZnJvbSB0aGUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgogIExpc3Q8RGFydFR5cGU+IGdldCBpbmZlcnJlZEV4dGVuc2lvblR5cGVBcmd1bWVudHMgPT4KICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAnT2JqZWN0QWNjZXNzVGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cycpOwoKICAvLy8gUmV0dXJucyB0aGUgbWVtYmVyIHRvIHVzZSBmb3IgYSB0ZWFyb2ZmLgogIC8vLwogIC8vLyBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGZvciBleHRlbnNpb24gbWV0aG9kcy4KICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBOb3JtYWxpemUgdXNlIGJ5IGhhdmluZyBgcmVhZFRhcmdldGAgYW5kCiAgLy8gIGBpbnZva2VUYXJnZXRgPwogIE1lbWJlciBnZXQgdGVhcm9mZlRhcmdldCA9PgogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignT2JqZWN0QWNjZXNzVGFyZ2V0LnRlYXJvZmZUYXJnZXQnKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ09iamVjdEFjY2Vzc1RhcmdldCgka2luZCwkbWVtYmVyKSc7Cn0KCmNsYXNzIEV4dGVuc2lvbkFjY2Vzc1RhcmdldCBleHRlbmRzIE9iamVjdEFjY2Vzc1RhcmdldCB7CiAgZmluYWwgTWVtYmVyIHRlYXJvZmZUYXJnZXQ7CiAgZmluYWwgUHJvY2VkdXJlS2luZCBleHRlbnNpb25NZXRob2RLaW5kOwogIGZpbmFsIExpc3Q8RGFydFR5cGU+IGluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50czsKCiAgRXh0ZW5zaW9uQWNjZXNzVGFyZ2V0KE1lbWJlciBtZW1iZXIsIHRoaXMudGVhcm9mZlRhcmdldCwKICAgICAgdGhpcy5leHRlbnNpb25NZXRob2RLaW5kLCB0aGlzLmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cykKICAgICAgOiBzdXBlci5pbnRlcm5hbChPYmplY3RBY2Nlc3NUYXJnZXRLaW5kLmV4dGVuc2lvbk1lbWJlciwgbWVtYmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgJ0V4dGVuc2lvbkFjY2Vzc1RhcmdldCgka2luZCwkbWVtYmVyLCRleHRlbnNpb25NZXRob2RLaW5kLCcKICAgICAgJyRpbmZlcnJlZEV4dGVuc2lvblR5cGVBcmd1bWVudHMpJzsKfQoKY2xhc3MgRXh0ZW5zaW9uQWNjZXNzQ2FuZGlkYXRlIHsKICBmaW5hbCBib29sIGlzUGxhdGZvcm07CiAgZmluYWwgRGFydFR5cGUgb25UeXBlOwogIGZpbmFsIERhcnRUeXBlIG9uVHlwZUluc3RhbnRpYXRlVG9Cb3VuZHM7CiAgZmluYWwgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldDsKCiAgRXh0ZW5zaW9uQWNjZXNzQ2FuZGlkYXRlKAogICAgICB0aGlzLm9uVHlwZSwgdGhpcy5vblR5cGVJbnN0YW50aWF0ZVRvQm91bmRzLCB0aGlzLnRhcmdldCwKICAgICAge3RoaXMuaXNQbGF0Zm9ybX0pCiAgICAgIDogYXNzZXJ0KGlzUGxhdGZvcm0gIT0gbnVsbCk7CgogIGJvb2wgaXNNb3JlU3BlY2lmaWNUaGFuKFR5cGVTY2hlbWFFbnZpcm9ubWVudCB0eXBlU2NoZW1hRW52aXJvbm1lbnQsCiAgICAgIEV4dGVuc2lvbkFjY2Vzc0NhbmRpZGF0ZSBvdGhlcikgewogICAgaWYgKHRoaXMuaXNQbGF0Zm9ybSA9PSBvdGhlci5pc1BsYXRmb3JtKSB7CiAgICAgIC8vIEJvdGggYXJlIHBsYXRmb3JtIG9yIG5vdCBwbGF0Zm9ybS4KICAgICAgYm9vbCB0aGlzSXNTdWJ0eXBlID0gdHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgICAgdGhpcy5vblR5cGUsIG90aGVyLm9uVHlwZSwgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpOwogICAgICBib29sIHRoaXNJc1N1cGVydHlwZSA9IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICAgIG90aGVyLm9uVHlwZSwgdGhpcy5vblR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKICAgICAgaWYgKHRoaXNJc1N1YnR5cGUgJiYgIXRoaXNJc1N1cGVydHlwZSkgewogICAgICAgIC8vIFRoaXMgaXMgc3VidHlwZSBvZiBvdGhlciBhbmQgbm90IHZpY2UtdmVyc2EuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAodGhpc0lzU3VwZXJ0eXBlICYmICF0aGlzSXNTdWJ0eXBlKSB7CiAgICAgICAgLy8gW290aGVyXSBpcyBzdWJ0eXBlIG9mIHRoaXMgYW5kIG5vdCB2aWNlLXZlcnNhLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmICh0aGlzSXNTdWJ0eXBlIHx8IHRoaXNJc1N1cGVydHlwZSkgewogICAgICAgIHRoaXNJc1N1YnR5cGUgPSB0eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgIHRoaXMub25UeXBlSW5zdGFudGlhdGVUb0JvdW5kcywKICAgICAgICAgICAgb3RoZXIub25UeXBlSW5zdGFudGlhdGVUb0JvdW5kcywKICAgICAgICAgICAgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpOwogICAgICAgIHRoaXNJc1N1cGVydHlwZSA9IHR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICAgICAgb3RoZXIub25UeXBlSW5zdGFudGlhdGVUb0JvdW5kcywKICAgICAgICAgICAgdGhpcy5vblR5cGVJbnN0YW50aWF0ZVRvQm91bmRzLAogICAgICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcyk7CiAgICAgICAgaWYgKHRoaXNJc1N1YnR5cGUgJiYgIXRoaXNJc1N1cGVydHlwZSkgewogICAgICAgICAgLy8gVGhpcyBpcyBzdWJ0eXBlIG9mIG90aGVyIGFuZCBub3QgdmljZS12ZXJzYS4KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGhpc0lzU3VwZXJ0eXBlICYmICF0aGlzSXNTdWJ0eXBlKSB7CiAgICAgICAgICAvLyBbb3RoZXJdIGlzIHN1YnR5cGUgb2YgdGhpcyBhbmQgbm90IHZpY2UtdmVyc2EuCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKG90aGVyLmlzUGxhdGZvcm0pIHsKICAgICAgLy8gVGhpcyBpcyBub3QgcGxhdGZvcm0sIFtvdGhlcl0gaXM6IHRoaXMgIGlzIG1vcmUgc3BlY2lmaWMuCiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBpcyBwbGF0Zm9ybSwgW290aGVyXSBpcyBub3Q6IG90aGVyIGlzIG1vcmUgc3BlY2lmaWMuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vIE5laXRoZXIgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBvdGhlci4KICAgIHJldHVybiBudWxsOwogIH0KfQoKLy8vIERlc2NyaWJlcyBhc3NpZ25hYmlsaXR5IGtpbmQgb2Ygb25lIHR5cGUgdG8gYW5vdGhlci4KZW51bSBBc3NpZ25hYmlsaXR5S2luZCB7CiAgLy8vIFVuY29uZGl0aW9uYWxseSBhc3NpZ25hYmxlLgogIGFzc2lnbmFibGUsCgogIC8vLyBBc3NpZ25hYmxlLCBidXQgbmVlZHMgYW4gaW1wbGljaXQgZG93bmNhc3QuCiAgYXNzaWduYWJsZUNhc3QsCgogIC8vLyBBc3NpZ25hYmxlLCBidXQgbmVlZHMgYSB0ZWFyb2ZmIGR1ZSB0byBhIGZ1bmN0aW9uIGNvbnRleHQuCiAgYXNzaWduYWJsZVRlYXJvZmYsCgogIC8vLyBBc3NpZ25hYmxlLCBidXQgbmVlZHMgYm90aCBhIHRlYXJvZmYgYW5kIGFuIGltcGxpY2l0IGRvd25jYXN0LgogIGFzc2lnbmFibGVUZWFyb2ZmQ2FzdCwKCiAgLy8vIFVuY29uZGl0aW9uYWxseSB1bmFzc2lnbmFibGUuCiAgdW5hc3NpZ25hYmxlLAoKICAvLy8gVHJ5aW5nIHRvIHVzZSB2b2lkIGluIGFuIGluYXBwcm9wcmlhdGUgY29udGV4dC4KICB1bmFzc2lnbmFibGVWb2lkLAoKICAvLy8gVGhlIHJpZ2h0LWhhbmQgc2lkZSB0eXBlIGlzIHByZWNpc2UsIGFuZCB0aGUgZG93bmNhc3Qgd2lsbCBm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RkABR0ABOkABSg4GTE4vK0wBTjg3IkABLwY0QxYeRgEMPAIBOR4rNwE7RUgBDBdCKgIBIRkZLCMBHEAZJAFHKC8sPk5ATi84FTY6FjU7LC01PS0sNTE6Fzg8GAoII0MTDUMUBjARBAIBORkiDgEyEgFBFQFFGQEkEAE2FAFHFwFOFwFQGwIBRhUeHAEwAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJyZXIuZGFydGpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3Byb21vdGlvbi5kYXJ0wABzGy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IERhcnRUeXBlLCBFeHByZXNzaW9uLCBUeXBlUGFyYW1ldGVyVHlwZSwgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFN1YnR5cGVDaGVja01vZGU7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5OwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbTsKCmltcG9ydCAnLi4va2VybmVsL2ludGVybmFsX2FzdC5kYXJ0JyBzaG93IFNoYWRvd1R5cGVQcm9tb3RlcjsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlU2NoZW1hRW52aXJvbm1lbnQ7CgovLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHN0YXRlIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHR5cGUgcHJvbW90aW9uLgovLy8KLy8vIFRoZW9yeSBvZiBvcGVyYXRpb246IGR1cmluZyBwYXJzaW5nLCB0aGUgQm9keUJ1aWxkZXIgY2FsbHMgbWV0aG9kcyBpbiB0aGlzCi8vLyBjbGFzcyB0byBpbmZvcm0gaXQgb2Ygc3ludGFjdGljIGNvbnN0cnVjdHMgdGhhdCBhcmUgZW5jb3VudGVyZWQuICBUaG9zZQovLy8gbWV0aG9kcyBtYWludGFpbiBhIGxpbmtlZCBsaXN0IG9mIFtUeXBlUHJvbW90aW9uRmFjdF0gb2JqZWN0cyB0cmFja2luZyB3aGF0Ci8vLyBpcyBrbm93biBhYm91dCB0aGUgc3RhdGUgb2YgZWFjaCB2YXJpYWJsZSBhdCB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgY29kZSwKLy8vIGFzIHdlbGwgYXMgYSBsaW5rZWQgbGlzdCBvZiBbVHlwZVByb21vdGlvblNjb3BlXSBvYmplY3RzIHRyYWNraW5nIHRoZQovLy8gY29tcG9uZW50J3MgbmVzdGluZyBzdHJ1Y3R1cmUuICBXaGVuZXZlciBhIHZhcmlhYmxlIGlzIHJlYWQsIHRoZSBjdXJyZW50Ci8vLyBbVHlwZVByb21vdGlvbkZhY3RdIGFuZCBbVHlwZVByb21vdGlvblNjb3BlXSBhcmUgcmVjb3JkZWQgZm9yIGxhdGVyIHVzZS4KLy8vCi8vLyBEdXJpbmcgdHlwZSBpbmZlcmVuY2UsIHRoZSBbVHlwZUluZmVycmVyXSBjYWxscyBiYWNrIGludG8gdGhpcyBjbGFzcyB0byBhc2sKLy8vIHdoZXRoZXIgZWFjaCB2YXJpYWJsZSByZWFkIGlzIGEgcHJvbW90ZWQgcmVhZC4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieQovLy8gZXhhbWluaW5nIHRoZSBbVHlwZVByb21vdGlvblNjb3BlXSBhbmQgW1R5cGVQcm9tb3Rpb25GYWN0XSBvYmplY3RzIHRoYXQgd2VyZQovLy8gcmVjb3JkZWQgYXQgdGhlIHRpbWUgdGhlIHZhcmlhYmxlIHJlYWQgd2FzIHBhcnNlZCwgYXMgd2VsbCBhcyBvdGhlciBzdGF0ZQovLy8gdGhhdCBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQgbGF0ZXIgZHVyaW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuCi8vLwovLy8gVGhpcyBjbGFzcyBhYnN0cmFjdHMgYXdheSB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVuZGVybHlpbmcgQVNUIHVzaW5nCi8vLyBnZW5lcmljIHBhcmFtZXRlcnMuICBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIHNldCBFIGFuZCBWIHRvIHRoZSBjbGFzcyB0aGV5Ci8vLyB1c2UgdG8gcmVwcmVzZW50IGV4cHJlc3Npb25zIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMsIHJlc3BlY3RpdmVseS4KYWJzdHJhY3QgY2xhc3MgVHlwZVByb21vdGVyIHsKICBUeXBlUHJvbW90ZXIucHJpdmF0ZSgpOwoKICBmYWN0b3J5IFR5cGVQcm9tb3RlcihUeXBlU2NoZW1hRW52aXJvbm1lbnQgdHlwZVNjaGVtYUVudmlyb25tZW50KSA9CiAgICAgIFNoYWRvd1R5cGVQcm9tb3Rlci5wcml2YXRlOwoKICBmYWN0b3J5IFR5cGVQcm9tb3Rlci5kaXNhYmxlZCgpID0gVHlwZVByb21vdGVyRGlzYWJsZWQucHJpdmF0ZTsKCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdHlwZSBwcm9tb3Rpb24gc2NvcGUuCiAgVHlwZVByb21vdGlvblNjb3BlIGdldCBjdXJyZW50U2NvcGU7CgogIC8vLyBDb21wdXRlcyB0aGUgcHJvbW90ZWQgdHlwZSBvZiBhIHZhcmlhYmxlIHJlYWQgaGF2aW5nIHRoZSBnaXZlbiBbZmFjdF0gYW5kCiAgLy8vIFtzY29wZV0uICBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBubyBwcm9tb3Rpb24uCiAgLy8vCiAgLy8vIFttdXRhdGVkSW5DbG9zdXJlXSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdmFyaWFibGUgd2FzIG11dGF0ZWQgaW4gYSBjbG9zdXJlCiAgLy8vIHNvbWV3aGVyZSBpbiB0aGUgbWV0aG9kLgogIERhcnRUeXBlIGNvbXB1dGVQcm9tb3RlZFR5cGUoCiAgICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QsIFR5cGVQcm9tb3Rpb25TY29wZSBzY29wZSwgYm9vbCBtdXRhdGVkSW5DbG9zdXJlKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgZW50ZXJpbmcgYW4gImVsc2UiCiAgLy8vIGJyYW5jaC4KICB2b2lkIGVudGVyRWxzZSgpOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSBMSFMgb2YgYW4gIiYmIiBvciAifHwiCiAgLy8vIGV4cHJlc3Npb24gaGFzIGp1c3QgYmVlbiBwYXJzZWQsIGFuZCB3ZSBhcmUgZW50ZXJpbmcgdGhlIFJIUy4KICB2b2lkIGVudGVyTG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsaHMsIFN0cmluZyBvcGVyYXRvcik7CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgdGhlICJjb25kaXRpb24iIHBhcnQgb2YgYW4gImlmIgogIC8vLyBzdGF0ZW1lbnQgb3IgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBoYXMganVzdCBiZWVuIHBhcnNlZCwgYW5kIHdlIGFyZQogIC8vLyBlbnRlcmluZyB0aGUgInRoZW4iIGJyYW5jaC4KICB2b2lkIGVudGVyVGhlbihFeHByZXNzaW9uIGNvbmRpdGlvbik7CgogIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSBleGl0ZWQgdGhlICJlbHNlIgogIC8vLyBicmFuY2ggb2YgYW4gImlmIiBzdGF0ZW1lbnQgb3IgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICB2b2lkIGV4aXRDb25kaXRpb25hbCgpOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgZXhpdGVkIHRoZSBSSFMgb2YgYW4KICAvLy8gIiYmIiBvciAifHwiIGV4cHJlc3Npb24uCiAgdm9pZCBleGl0TG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiByaHMsIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24pOwoKICAvLy8gVmVyaWZpZXMgdGhhdCBlbnRlci9leGl0IGNhbGxzIHdlcmUgcHJvcGVybHkgbmVzdGVkLgogIHZvaWQgZmluaXNoZWQoKTsKCiAgLy8vIFJlY29yZHMgdGhhdCB0aGUgZ2l2ZW4gW3ZhcmlhYmxlXSB3YXMgYWNjZXNzZWQgZm9yIHJlYWRpbmcsIGFuZCByZXR1cm5zIGEKICAvLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSBkZXNjcmliaW5nIHRoZSB2YXJpYWJsZSdzIGN1cnJlbnQgdHlwZSBwcm9tb3Rpb24KICAvLy8gc3RhdGUuCiAgLy8vCiAgLy8vIFtmdW5jdGlvbk5lc3RpbmdMZXZlbF0gc2hvdWxkIGJlIHRoZSBjdXJyZW50IG5lc3RpbmcgbGV2ZWwgb2YgY2xvc3VyZXMuCiAgLy8vIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHZhcmlhYmxlIHdhcyBhY2Nlc3NlZCBpbiBhIGNsb3N1cmUuCiAgVHlwZVByb21vdGlvbkZhY3QgZ2V0RmFjdEZvckFjY2VzcygKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKCiAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCBhbiAiaXMiIGNoZWNrIG9mIGEgbG9jYWwKICAvLy8gdmFyaWFibGUgd2FzIGp1c3QgcGFyc2VkLgogIHZvaWQgaGFuZGxlSXNDaGVjayhFeHByZXNzaW9uIGlzRXhwcmVzc2lvbiwgYm9vbCBpc0ludmVydGVkLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSBnaXZlbiBbdmFyaWFibGVdIHdhcwogIC8vLyBtdXRhdGVkLgogIHZvaWQgbXV0YXRlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKfQoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtUeXBlUHJvbW90ZXJdIHdoaWNoIGRvZXNuJ3QgZG8gYW55IHR5cGUgcHJvbW90aW9uLgovLy8KLy8vIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHByb2ZpbGluZywgdG8gZW5zdXJlIHRoYXQgdHlwZSBpbmZlcmVuY2UgYW5kIHR5cGUKLy8vIHByb21vdGlvbiBkbyBub3Qgc2xvdyBkb3duIGNvbXBpbGF0aW9uIHRvbyBtdWNoLgpjbGFzcyBUeXBlUHJvbW90ZXJEaXNhYmxlZCBleHRlbmRzIFR5cGVQcm9tb3RlciB7CiAgVHlwZVByb21vdGVyRGlzYWJsZWQucHJpdmF0ZSgpIDogc3VwZXIucHJpdmF0ZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlUHJvbW90aW9uU2NvcGUgZ2V0IGN1cnJlbnRTY29wZSA9PiBudWxsOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBjb21wdXRlUHJvbW90ZWRUeXBlKFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QsIFR5cGVQcm9tb3Rpb25TY29wZSBzY29wZSwKICAgICAgICAgIGJvb2wgbXV0YXRlZEluQ2xvc3VyZSkgPT4KICAgICAgbnVsbDsKCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlckVsc2UoKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyTG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsaHMsIFN0cmluZyBvcGVyYXRvcikge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlclRoZW4oRXhwcmVzc2lvbiBjb25kaXRpb24pIHt9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdENvbmRpdGlvbmFsKCkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCBleGl0TG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiByaHMsIEV4cHJlc3Npb24gbG9naWNhbEV4cHJlc3Npb24pIHt9CgogIEBvdmVycmlkZQogIHZvaWQgZmluaXNoZWQoKSB7fQoKICBAb3ZlcnJpZGUKICBUeXBlUHJvbW90aW9uRmFjdCBnZXRGYWN0Rm9yQWNjZXNzKAogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSA9PgogICAgICBudWxsOwoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlzQ2hlY2soRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24sIGJvb2wgaXNJbnZlcnRlZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgdHlwZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIG11dGF0ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkge30KfQoKLy8vIERlcml2ZWQgY2xhc3MgY29udGFpbmluZyBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBbVHlwZVByb21vdGVyXS4KLy8vCi8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGFzIG11Y2ggb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR5cGUgcHJvbW90aW9uIGFzCi8vLyBwb3NzaWJsZSB3aXRob3V0IG5lZWRpbmcgYWNjZXNzIHRvIHByaXZhdGUgbWVtYmVycyBvZiBzaGFkb3cgb2JqZWN0cy4gIEl0Ci8vLyBkZWZlcnMgdG8gYWJzdHJhY3QgbWV0aG9kcyBmb3IgZXZlcnl0aGluZyBlbHNlLgphYnN0cmFjdCBjbGFzcyBUeXBlUHJvbW90ZXJJbXBsIGV4dGVuZHMgVHlwZVByb21vdGVyIHsKICBmaW5hbCBUeXBlU2NoZW1hRW52aXJvbm1lbnQgdHlwZVNjaGVtYUVudmlyb25tZW50OwoKICAvLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSByZXByZXNlbnRpbmcgdGhlIGluaXRpYWwgc3RhdGUgKG5vIGZhY3RzIGhhdmUgYmVlbgogIC8vLyBkZXRlcm1pbmVkIHlldCkuCiAgLy8vCiAgLy8vIEFsbCBsaW5rZWQgbGlzdHMgb2YgZmFjdHMgdGVybWluYXRlIGluIHRoaXMgb2JqZWN0LgogIGZpbmFsIF9OdWxsRmFjdCBfbnVsbEZhY3RzOwoKICAvLy8gTWFwIGZyb20gdmFyaWFibGUgZGVjbGFyYXRpb24gdG8gdGhlIG1vc3QgcmVjZW50IFtUeXBlUHJvbW90aW9uRmFjdF0KICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSB2YXJpYWJsZS4KICAvLy8KICAvLy8gW1R5cGVQcm9tb3Rpb25GYWN0XXMgdGhhdCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgdmFyaWFibGUgc2hvdyB1cCBpbgogIC8vLyB0aGlzIG1hcCB1bmRlciB0aGUga2V5IGBudWxsYC4KICBmaW5hbCBfZmFjdENhY2hlID0gPFZhcmlhYmxlRGVjbGFyYXRpb24sIFR5cGVQcm9tb3Rpb25GYWN0Pnt9OwoKICAvLy8gTGlua2VkIGxpc3Qgb2YgW1R5cGVQcm9tb3Rpb25GYWN0XXMgdGhhdCB3YXMgY3VycmVudCBhdCB0aGUgdGltZSB0aGUKICAvLy8gW19mYWN0Q2FjaGVdIHdhcyBsYXN0IHVwZGF0ZWQuCiAgVHlwZVByb21vdGlvbkZhY3QgX2ZhY3RDYWNoZVN0YXRlOwoKICAvLy8gTGlua2VkIGxpc3Qgb2YgW1R5cGVQcm9tb3Rpb25GYWN0XXMgZGVzY3JpYmluZyB3aGF0IGlzIGtub3duIHRvIGJlIHRydWUKICAvLy8gYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoZSBleHByZXNzaW9uIG9yIHN0YXRlbWVudCB0aGF0IHdhcyBtb3N0IHJlY2VudGx5CiAgLy8vIHBhcnNlZC4KICBUeXBlUHJvbW90aW9uRmFjdCBfY3VycmVudEZhY3RzOwoKICAvLy8gVGhlIG1vc3QgcmVjZW50bHkgcGFyc2VkIGV4cHJlc3Npb24gd2hvc2Ugb3V0Y29tZSBwb3RlbnRpYWxseSBhZmZlY3RzIHdoYXQKICAvLy8gaXMga25vd24gdG8gYmUgdHJ1ZSAoZS5nLiBhbiAiaXMiIGNoZWNrIG9yIGEgbG9naWNhbCBleHByZXNzaW9uKS4gIE1heSBiZQogIC8vLyBgbnVsbGAgaWYgbm8gc3VjaCBleHByZXNzaW9uIGhhcyBiZWVuIGVuY291bnRlcmVkIHlldC4KICBFeHByZXNzaW9uIF9wcm9tb3Rpb25FeHByZXNzaW9uOwoKICAvLy8gTGlua2VkIGxpc3Qgb2YgW1R5cGVQcm9tb3Rpb25GYWN0XXMgZGVzY3JpYmluZyB3aGF0IGlzIGtub3duIHRvIGJlIHRydWUKICAvLy8gYWZ0ZXIgZXhlY3V0aW9uIG9mIFtfcHJvbW90aW9uRXhwcmVzc2lvbl0sIGFzc3VtaW5nIHRoYXQKICAvLy8gW19wcm9tb3Rpb25FeHByZXNzaW9uXSBldmFsdWF0ZXMgdG8gYHRydWVgLgogIFR5cGVQcm9tb3Rpb25GYWN0IF90cnVlRmFjdHNGb3JQcm9tb3Rpb25FeHByZXNzaW9uOwoKICAvLy8gTGlua2VkIGxpc3Qgb2YgW1R5cGVQcm9tb3Rpb25TY29wZV1zIGRlc2NyaWJpbmcgdGhlIG5lc3Rpbmcgc3RydWN0dXJlIHRoYXQKICAvLy8gY29udGFpbnMgdGhlIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50IHRoYXQgd2FzIG1vc3QgcmVjZW50bHkgcGFyc2VkLgogIFR5cGVQcm9tb3Rpb25TY29wZSBfY3VycmVudFNjb3BlID0gY29uc3QgX1RvcExldmVsU2NvcGUoKTsKCiAgLy8vIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIFtUeXBlUHJvbW90aW9uRmFjdF0gdGhhdCB3YXMgbW9zdCByZWNlbnRseQogIC8vLyBjcmVhdGVkLgogIGludCBfbGFzdEZhY3RTZXF1ZW5jZU51bWJlciA9IDA7CgogIFR5cGVQcm9tb3RlckltcGwucHJpdmF0ZShUeXBlU2NoZW1hRW52aXJvbm1lbnQgdHlwZVNjaGVtYUVudmlyb25tZW50KQogICAgICA6IHRoaXMuXyh0eXBlU2NoZW1hRW52aXJvbm1lbnQsIG5ldyBfTnVsbEZhY3QoKSk7CgogIFR5cGVQcm9tb3RlckltcGwuXyh0aGlzLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwgX051bGxGYWN0IHRoaXMuX251bGxGYWN0cykKICAgICAgOiBfZmFjdENhY2hlU3RhdGUgPSBfbnVsbEZhY3RzLAogICAgICAgIF9jdXJyZW50RmFjdHMgPSBfbnVsbEZhY3RzLAogICAgICAgIHN1cGVyLnByaXZhdGUoKSB7CiAgICBfZmFjdENhY2hlW251bGxdID0gX251bGxGYWN0czsKICB9CgogIEBvdmVycmlkZQogIFR5cGVQcm9tb3Rpb25TY29wZSBnZXQgY3VycmVudFNjb3BlID0+IF9jdXJyZW50U2NvcGU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGNvbXB1dGVQcm9tb3RlZFR5cGUoCiAgICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QsIFR5cGVQcm9tb3Rpb25TY29wZSBzY29wZSwgYm9vbCBtdXRhdGVkSW5DbG9zdXJlKSB7CiAgICBpZiAobXV0YXRlZEluQ2xvc3VyZSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gZmFjdD8uX2NvbXB1dGVQcm9tb3RlZFR5cGUodGhpcywgc2NvcGUpOwogIH0KCiAgLy8vIEZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgdXNlLCBvcHRpb25hbGx5IHByaW50cyB0aGUgY3VycmVudCBzdGF0ZSBmb2xsb3dlZAogIC8vLyBieSB0aGUgZXZlbnQgbmFtZS4gIFVuY29tbWVudCB0aGUgY2FsbCB0byBbX3ByaW50RXZlbnRdIHRvIHNlZSB0aGUKICAvLy8gc2VxdWVuY2Ugb2YgY2FsbHMgaW50byB0aGUgdHlwZSBwcm9tb3RlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGVzLgogIHZvaWQgZGVidWdFdmVudChTdHJpbmcgbmFtZSkgewogICAgLy8gX3ByaW50RXZlbnQobmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyRWxzZSgpIHsKICAgIGRlYnVnRXZlbnQoJ2VudGVyRWxzZScpOwogICAgX0NvbmRpdGlvbmFsU2NvcGUgc2NvcGUgPSBfY3VycmVudFNjb3BlOwogICAgLy8gUmVjb3JkIHRoZSBjdXJyZW50IGZhY3Qgc3RhdGUgc28gdGhhdCBvbmNlIHdlIGV4aXQgdGhlICJlbHNlIiBicmFuY2gsIHdlCiAgICAvLyBjYW4gbWVyZ2UgZmFjdHMgZnJvbSB0aGUgdHdvIGJyYW5jaGVzLgogICAgc2NvcGUuYWZ0ZXJUcnVlID0gX2N1cnJlbnRGYWN0czsKICAgIC8vIFdoaWxlIHByb2Nlc3NpbmcgdGhlICJlbHNlIiBibG9jaywgYXNzdW1lIHRoZSBjb25kaXRpb24gd2FzIGZhbHNlLgogICAgX2N1cnJlbnRGYWN0cyA9IHNjb3BlLmJlZm9yZUVsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVudGVyTG9naWNhbEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsaHMsIFN0cmluZyBvcGVyYXRvcikgewogICAgZGVidWdFdmVudCgnZW50ZXJMb2dpY2FsRXhwcmVzc2lvbicpOwogICAgLy8gRmlndXJlIG91dCB3aGF0IHRoZSBmYWN0cyBhcmUgYmFzZWQgb24gcG9zc2libGUgTEhTIG91dGNvbWVzLgogICAgVHlwZVByb21vdGlvbkZhY3QgdHJ1ZUZhY3RzID0gX2ZhY3RzV2hlblRydWUobGhzKTsKICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhbHNlRmFjdHMgPSBfZmFjdHNXaGVuRmFsc2UobGhzKTsKICAgIC8vIFJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBlbnRlcmluZyBhIG5ldyBzY29wZSwgYW5kIHNhdmUgdGhlCiAgICAvLyBhcHByb3ByaWF0ZSBmYWN0cyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGV4cHJlc3Npb24gZ2V0cyBzaG9ydC1jdXQuCiAgICBib29sIGlzQW5kID0gaWRlbnRpY2FsKG9wZXJhdG9yLCAnJiYnKTsKICAgIF9jdXJyZW50U2NvcGUgPQogICAgICAgIG5ldyBfTG9naWNhbFNjb3BlKF9jdXJyZW50U2NvcGUsIGlzQW5kLCBpc0FuZCA/IGZhbHNlRmFjdHMgOiB0cnVlRmFjdHMpOwogICAgLy8gV2hpbGUgcHJvY2Vzc2luZyB0aGUgUkhTLCBhc3N1bWUgdGhlIGNvbmRpdGlvbiB3YXMgZmFsc2Ugb3IgdHJ1ZSwKICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBsb2dpY2FsIGV4cHJlc3Npb24uCiAgICBfY3VycmVudEZhY3RzID0gaXNBbmQgPyB0cnVlRmFjdHMgOiBmYWxzZUZhY3RzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbnRlclRoZW4oRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKICAgIGRlYnVnRXZlbnQoJ2VudGVyVGhlbicpOwogICAgLy8gRmlndXJlIG91dCB3aGF0IHRoZSBmYWN0cyBhcmUgYmFzZWQgb24gcG9zc2libGUgY29uZGl0aW9uIG91dGNvbWVzLgogICAgVHlwZVByb21vdGlvbkZhY3QgdHJ1ZUZhY3RzID0gX2ZhY3RzV2hlblRydWUoY29uZGl0aW9uKTsKICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhbHNlRmFjdHMgPSBfZmFjdHNXaGVuRmFsc2UoY29uZGl0aW9uKTsKICAgIC8vIFJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBlbnRlcmluZyBhIG5ldyBzY29wZSwgYW5kIHNhdmUgdGhlICJmYWxzZSIKICAgIC8vIGZhY3RzIGZvciB3aGVuIHdlIGVudGVyIHRoZSAiZWxzZSIgYnJhbmNoLgogICAgX2N1cnJlbnRTY29wZSA9IG5ldyBfQ29uZGl0aW9uYWxTY29wZShfY3VycmVudFNjb3BlLCBmYWxzZUZhY3RzKTsKICAgIC8vIFdoaWxlIHByb2Nlc3NpbmcgdGhlICJ0aGVuIiBibG9jaywgYXNzdW1lIHRoZSBjb25kaXRpb24gd2FzIHRydWUuCiAgICBfY3VycmVudEZhY3RzID0gdHJ1ZUZhY3RzOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBleGl0Q29uZGl0aW9uYWwoKSB7CiAgICBkZWJ1Z0V2ZW50KCdleGl0Q29uZGl0aW9uYWwnKTsKICAgIF9Db25kaXRpb25hbFNjb3BlIHNjb3BlID0gX2N1cnJlbnRTY29wZTsKICAgIF9jdXJyZW50U2NvcGUgPSBfY3VycmVudFNjb3BlLl9lbmNsb3Npbmc7CiAgICBfY3VycmVudEZhY3RzID0gX21lcmdlRmFjdHMoc2NvcGUuYWZ0ZXJUcnVlLCBfY3VycmVudEZhY3RzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZXhpdExvZ2ljYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gcmhzLCBFeHByZXNzaW9uIGxvZ2ljYWxFeHByZXNzaW9uKSB7CiAgICBkZWJ1Z0V2ZW50KCdleGl0TG9naWNhbEV4cHJlc3Npb24nKTsKICAgIF9Mb2dpY2FsU2NvcGUgc2NvcGUgPSBfY3VycmVudFNjb3BlOwogICAgX2N1cnJlbnRTY29wZSA9IF9jdXJyZW50U2NvcGUuX2VuY2xvc2luZzsKICAgIGlmIChzY29wZS5pc0FuZCkgewogICAgICBfcmVjb3JkUHJvbW90aW9uRXhwcmVzc2lvbihsb2dpY2FsRXhwcmVzc2lvbiwgX2ZhY3RzV2hlblRydWUocmhzKSwKICAgICAgICAgIF9tZXJnZUZhY3RzKHNjb3BlLnNob3J0Y3V0RmFjdHMsIF9jdXJyZW50RmFjdHMpKTsKICAgIH0gZWxzZSB7CiAgICAgIF9yZWNvcmRQcm9tb3Rpb25FeHByZXNzaW9uKAogICAgICAgICAgbG9naWNhbEV4cHJlc3Npb24sCiAgICAgICAgICBfbWVyZ2VGYWN0cyhzY29wZS5zaG9ydGN1dEZhY3RzLCBfY3VycmVudEZhY3RzKSwKICAgICAgICAgIF9mYWN0c1doZW5GYWxzZShyaHMpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZmluaXNoZWQoKSB7CiAgICBkZWJ1Z0V2ZW50KCdmaW5pc2hlZCcpOwogICAgaWYgKF9jdXJyZW50U2NvcGUgaXMhIF9Ub3BMZXZlbFNjb3BlKSB7CiAgICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICIkcnVudGltZVR5cGUiLCAiJF9jdXJyZW50U2NvcGUiKSwKICAgICAgICAgIC0xLAogICAgICAgICAgbnVsbCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlUHJvbW90aW9uRmFjdCBnZXRGYWN0Rm9yQWNjZXNzKAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgIGRlYnVnRXZlbnQoJ2dldEZhY3RGb3JBY2Nlc3MnKTsKICAgIFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QgPSBfY29tcHV0ZUN1cnJlbnRGYWN0TWFwKClbdmFyaWFibGVdOwogICAgVHlwZVByb21vdGlvbkZhY3QuX3JlY29yZEFjY2Vzc2VkSW5TY29wZSgKICAgICAgICBmYWN0LCBfY3VycmVudFNjb3BlLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCk7CiAgICByZXR1cm4gZmFjdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBuZXN0aW5nIGxldmVsIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIFt2YXJpYWJsZV0gd2FzIGRlY2xhcmVkLgogIGludCBnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlzQ2hlY2soRXhwcmVzc2lvbiBpc0V4cHJlc3Npb24sIGJvb2wgaXNJbnZlcnRlZCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgRGFydFR5cGUgdHlwZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICBkZWJ1Z0V2ZW50KCdoYW5kbGVJc0NoZWNrJyk7CiAgICBpZiAoIWlzUHJvbW90aW9uQ2FuZGlkYXRlKHZhcmlhYmxlKSkgcmV0dXJuOwogICAgX0lzQ2hlY2sgaXNDaGVjayA9IG5ldyBfSXNDaGVjaygKICAgICAgICArK19sYXN0RmFjdFNlcXVlbmNlTnVtYmVyLAogICAgICAgIHZhcmlhYmxlLAogICAgICAgIF9jdXJyZW50RmFjdHMsCiAgICAgICAgX2NvbXB1dGVDdXJyZW50RmFjdE1hcCgpW3ZhcmlhYmxlXSwKICAgICAgICBmdW5jdGlvbk5lc3RpbmdMZXZlbCwKICAgICAgICB0eXBlKTsKICAgIGlmICghaXNJbnZlcnRlZCkgewogICAgICBfcmVjb3JkUHJvbW90aW9uRXhwcmVzc2lvbihpc0V4cHJlc3Npb24sIGlzQ2hlY2ssIF9jdXJyZW50RmFjdHMpOwogICAgfQogIH0KCiAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIHByb21vdGlvbgogIC8vLyBhdCBhbGwuCiAgLy8vCiAgLy8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4ga2VybmVsLCBbVmFyaWFibGVEZWNsYXJhdGlvbl0gb2JqZWN0cyBhcmUKICAvLy8gc29tZXRpbWVzIHVzZWQgdG8gcmVwcmVzZW50IGxvY2FsIGZ1bmN0aW9ucywgd2hpY2ggYXJlIG5vdCBzdWJqZWN0IHRvCiAgLy8vIHByb21vdGlvbi4KICBib29sIGlzUHJvbW90aW9uQ2FuZGlkYXRlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwoKICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSBnaXZlbiBbdmFyaWFibGVdIHdhcwogIC8vLyBtdXRhdGVkLgogIHZvaWQgbXV0YXRlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICBkZWJ1Z0V2ZW50KCdtdXRhdGVWYXJpYWJsZScpOwogICAgVHlwZVByb21vdGlvbkZhY3QgZmFjdCA9IF9jb21wdXRlQ3VycmVudEZhY3RNYXAoKVt2YXJpYWJsZV07CiAgICBUeXBlUHJvbW90aW9uRmFjdC5fcmVjb3JkTXV0YXRlZEluU2NvcGUoZmFjdCwgX2N1cnJlbnRTY29wZSk7CiAgICBpZiAoZ2V0VmFyaWFibGVGdW5jdGlvbk5lc3RpbmdMZXZlbCh2YXJpYWJsZSkgPCBmdW5jdGlvbk5lc3RpbmdMZXZlbCkgewogICAgICBzZXRWYXJpYWJsZU11dGF0ZWRJbkNsb3N1cmUodmFyaWFibGUpOwogICAgfQogICAgc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmUodmFyaWFibGUpOwogIH0KCiAgLy8vIERldGVybWluZXMgd2hldGhlciBbYV0gYW5kIFtiXSByZXByZXNlbnQgdGhlIHNhbWUgZXhwcmVzc2lvbiwgYWZ0ZXIKICAvLy8gZHJvcHBpbmcgcmVkdW5kYW50IGVuY2xvc2luZyBwYXJlbnRoZXNlcy4KICBib29sIHNhbWVFeHByZXNzaW9ucyhFeHByZXNzaW9uIGEsIEV4cHJlc3Npb24gYik7CgogIC8vLyBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIHZhcmlhYmxlIHdhcyBtdXRhdGVkIHNvbWV3aGVyZSBpbnNpZGUgdGhlIG1ldGhvZC4KICB2b2lkIHNldFZhcmlhYmxlTXV0YXRlZEFueXdoZXJlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwoKICAvLy8gUmVjb3JkcyB0aGF0IHRoZSBnaXZlbiB2YXJpYWJsZSB3YXMgbXV0YXRlZCBpbnNpZGUgYSBjbG9zdXJlLgogIHZvaWQgc2V0VmFyaWFibGVNdXRhdGVkSW5DbG9zdXJlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgW3NldFZhcmlhYmxlTXV0YXRlZEFueXdoZXJlXSBoYXMgYmVlbiBjYWxsZWQgZm9yIHRoZQogIC8vLyBnaXZlbiBbdmFyaWFibGVdLgogIGJvb2wgd2FzVmFyaWFibGVNdXRhdGVkQW55d2hlcmUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSk7CgogIC8vLyBSZXR1cm5zIGEgbWFwIGZyb20gdmFyaWFibGUgZGVjbGFyYXRpb24gdG8gdGhlIG1vc3QgcmVjZW50CiAgLy8vIFtUeXBlUHJvbW90aW9uRmFjdF0gYXNzb2NpYXRlZCB3aXRoIHRoZSB2YXJpYWJsZS4KICBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgVHlwZVByb21vdGlvbkZhY3Q+IF9jb21wdXRlQ3VycmVudEZhY3RNYXAoKSB7CiAgICAvLyBSb2xsIGJhY2sgYW55IG1hcCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBmYWN0cyB0aGF0IGFyZSBubyBsb25nZXIgaW4KICAgIC8vIGVmZmVjdCwgYW5kIHNldCBbY29tbW9uQW5jZXN0b3JdIHRvIHRoZSBmYWN0IHRoYXQgaXMgYW4gYW5jZXN0b3Igb2YKICAgIC8vIHRoZSBjdXJyZW50IHN0YXRlIGFuZCB0aGUgcHJldmlvdXNseSBjYWNoZWQgc3RhdGUuICBUbyBkbyB0aGlzLCB3ZSBzZXQgYQogICAgLy8gdmFyaWFibGUgcG9pbnRpbmcgdG8gW19jdXJyZW50RmFjdHNdLCBhbmQgdGhlbiB3YWxrIGJvdGggaXQgYW5kCiAgICAvLyBbX2ZhY3RDYWNoZVN0YXRlXSBiYWNrIHRvIHRoZWlyIGNvbW1vbiBhbmNlc3RvciwgdXBkYXRpbmcgW19mYWN0Q2FjaGVdIGFzCiAgICAvLyB3ZSBnby4KICAgIFR5cGVQcm9tb3Rpb25GYWN0IGNvbW1vbkFuY2VzdG9yID0gX2N1cnJlbnRGYWN0czsKICAgIHdoaWxlIChjb21tb25BbmNlc3Rvci5zZXF1ZW5jZU51bWJlciAhPSBfZmFjdENhY2hlU3RhdGUuc2VxdWVuY2VOdW1iZXIpIHsKICAgICAgaWYgKGNvbW1vbkFuY2VzdG9yLnNlcXVlbmNlTnVtYmVyID4gX2ZhY3RDYWNoZVN0YXRlLnNlcXVlbmNlTnVtYmVyKSB7CiAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBjYWNoZWQgc3RhdGUgaXMgb2xkZXIgdGhhbiB0aGUgY29tbW9uIGFuY2VzdG9yIGd1ZXNzLAogICAgICAgIC8vIHNvIHRoZSBjb21tb24gYW5jZXN0b3IgZ3Vlc3MgbmVlZHMgdG8gYmUgd2Fsa2VkIGJhY2suCiAgICAgICAgY29tbW9uQW5jZXN0b3IgPSBjb21tb25BbmNlc3Rvci5wcmV2aW91czsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGUgY29tbW9uIGFuY2VzdG9yIGd1ZXNzIGlzIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnRseSBjYWNoZWQgc3RhdGUsCiAgICAgICAgLy8gc28gd2UgbmVlZCB0byByb2xsIGJhY2sgdGhlIG1hcCBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnRseQogICAgICAgIC8vIGNhY2hlZCBzdGF0ZS4KICAgICAgICBfZmFjdENhY2hlW19mYWN0Q2FjaGVTdGF0ZS52YXJpYWJsZV0gPQogICAgICAgICAgICBfZmFjdENhY2hlU3RhdGUucHJldmlvdXNGb3JWYXJpYWJsZTsKICAgICAgICBfZmFjdENhY2hlU3RhdGUgPSBfZmFjdENhY2hlU3RhdGUucHJldmlvdXM7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChpZGVudGljYWwoY29tbW9uQW5jZXN0b3IsIF9mYWN0Q2FjaGVTdGF0ZSkpOwogICAgLy8gUm9sbCBmb3J3YXJkIGFueSBtYXAgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggZmFjdHMgdGhhdCBhcmUgbmV3bHkgaW4KICAgIC8vIGVmZmVjdC4gIFNpbmNlIG5ld2VyIGZhY3RzIGxpbmsgdG8gb2xkZXIgb25lcywgaXQgaXMgZWFzaWVzdCB0byBkbyByb2xsCiAgICAvLyBmb3J3YXJkIHRoZSBtb3N0IHJlY2VudCBmYWN0cyBmaXJzdC4KICAgIGZvciAoVHlwZVByb21vdGlvbkZhY3QgbmV3U3RhdGUgPSBfY3VycmVudEZhY3RzOwogICAgICAgICFpZGVudGljYWwobmV3U3RhdGUsIGNvbW1vbkFuY2VzdG9yKTsKICAgICAgICBuZXdTdGF0ZSA9IG5ld1N0YXRlLnByZXZpb3VzKSB7CiAgICAgIFR5cGVQcm9tb3Rpb25GYWN0IGN1cnJlbnRseUNhY2hlZCA9IF9mYWN0Q2FjaGVbbmV3U3RhdGUudmFyaWFibGVdOwogICAgICAvLyBOb3RlOiBTaW5jZSB3ZSByb2xsIGZvcndhcmQgdGhlIG1vc3QgcmVjZW50IGZhY3RzIGZpcnN0LCB3ZSBuZWVkIHRvIGJlCiAgICAgIC8vIGNhcmVmdWwgbm90IHdyaXRlIGFuIG9sZGVyIGZhY3Qgb3ZlciBhIG5ld2VyIG9uZS4KICAgICAgaWYgKGN1cnJlbnRseUNhY2hlZCA9PSBudWxsIHx8CiAgICAgICAgICBuZXdTdGF0ZS5zZXF1ZW5jZU51bWJlciA+IGN1cnJlbnRseUNhY2hlZC5zZXF1ZW5jZU51bWJlcikgewogICAgICAgIF9mYWN0Q2FjaGVbbmV3U3RhdGUudmFyaWFibGVdID0gbmV3U3RhdGU7CiAgICAgIH0KICAgIH0KICAgIF9mYWN0Q2FjaGVTdGF0ZSA9IF9jdXJyZW50RmFjdHM7CiAgICByZXR1cm4gX2ZhY3RDYWNoZTsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgZmFjdHMga25vd24gdG8gYmUgdHJ1ZSBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIFtlXQogIC8vLyBhc3N1bWluZyBpdCBldmFsdWF0ZXMgdG8gYGZhbHNlYC4KICAvLy8KICAvLy8gW2VdIG11c3QgYmUgdGhlIG1vc3QgcmVjZW50bHkgcGFyc2VkIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50LgogIFR5cGVQcm9tb3Rpb25GYWN0IF9mYWN0c1doZW5GYWxzZShFeHByZXNzaW9uIGUpIHsKICAgIC8vIFR5cGUgcHJvbW90aW9uIGN1cnJlbnRseSBvbmx5IG9jY3VycyB3aGVuIGFuICJpcyIgb3IgbG9naWNhbCBleHByZXNzaW9uCiAgICAvLyBldmFsdWF0ZXMgdG8gYHRydWVgLCBzbyBubyBzcGVjaWFsIGxvZ2ljIGlzIHJlcXVpcmVkOyB3ZSBqdXN0IHVzZQogICAgLy8gW19jdXJyZW50RmFjdHNdLgogICAgLy8KICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZXhwZXJpbWVudCB3aXRoIHN1cHBvcnRpbmcgcHJvbW90aW9uIGluIGNhc2VzIGxpa2UKICAgIC8vIGBpZiAoeCBpcyEgVCkgeyAuLi4gfSBlbHNlIHsgLi4uYWNjZXNzIHguLi4gfWAKICAgIHJldHVybiBfY3VycmVudEZhY3RzOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmYWN0cyBrbm93biB0byBiZSB0cnVlIGFmdGVyIHRoZSBleGVjdXRpb24gb2YgW2VdCiAgLy8vIGFzc3VtaW5nIGl0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCiAgLy8vCiAgLy8vIFtlXSBtdXN0IGJlIHRoZSBtb3N0IHJlY2VudGx5IHBhcnNlZCBleHByZXNzaW9uIG9yIHN0YXRlbWVudC4KICBUeXBlUHJvbW90aW9uRmFjdCBfZmFjdHNXaGVuVHJ1ZShFeHByZXNzaW9uIGUpID0+CiAgICAgIHNhbWVFeHByZXNzaW9ucyhfcHJvbW90aW9uRXhwcmVzc2lvbiwgZSkKICAgICAgICAgID8gX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb24KICAgICAgICAgIDogX2N1cnJlbnRGYWN0czsKCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBmYWN0cyBrbm93biB0byBiZSB0cnVlIGFmdGVyIHR3byBicmFuY2hlcyBvZiBleGVjdXRpb24KICAvLy8gcmVqb2luLgogIFR5cGVQcm9tb3Rpb25GYWN0IF9tZXJnZUZhY3RzKFR5cGVQcm9tb3Rpb25GYWN0IGEsIFR5cGVQcm9tb3Rpb25GYWN0IGIpIHsKICAgIC8vIFR5cGUgcHJvbW90aW9uIGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgYW55IG1lY2hhbmlzbSBmb3IgZmFjdHMgdG8KICAgIC8vIGFjY3VtdWxhdGUgYWxvbmcgYSBzdHJhaWdodC1saW5lIGV4ZWN1dGlvbiBwYXRoICh0aGV5IGNhbiBvbmx5IGFjY3VtdWxhdGUKICAgIC8vIHdoZW4gZW50ZXJpbmcgYSBzY29wZSksIHNvIHdlIGNhbiBzaW1wbHkgZmluZCB0aGUgY29tbW9uIGFuY2VzdG9yIGZhY3QuCiAgICAvLwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBleHBlcmltZW50IHdpdGggc3VwcG9ydGluZyBwcm9tb3Rpb24gaW4gY2FzZXMgbGlrZToKICAgIC8vICAgICBpZiAoLi4uKSB7CiAgICAvLyAgICAgICBpZiAoeCBpcyEgVCkgcmV0dXJuOwogICAgLy8gICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICBpZiAoeCBpcyEgVCkgcmV0dXJuOwogICAgLy8gICAgIH0KICAgIC8vICAgICAuLi5hY2Nlc3MgeC4uLgogICAgd2hpbGUgKGEuc2VxdWVuY2VOdW1iZXIgIT0gYi5zZXF1ZW5jZU51bWJlcikgewogICAgICBpZiAoYS5zZXF1ZW5jZU51bWJlciA+IGIuc2VxdWVuY2VOdW1iZXIpIHsKICAgICAgICBhID0gYS5wcmV2aW91czsKICAgICAgfSBlbHNlIHsKICAgICAgICBiID0gYi5wcmV2aW91czsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGlkZW50aWNhbChhLCBiKSk7CiAgICByZXR1cm4gYTsKICB9CgogIC8vLyBGb3IgaW50ZXJuYWwgZGVidWdnaW5nIHVzZSwgcHJpbnRzIHRoZSBjdXJyZW50IHN0YXRlIGZvbGxvd2VkIGJ5IHRoZSBldmVudAogIC8vLyBuYW1lLgogIC8vIGlnbm9yZTogdW51c2VkX2VsZW1lbnQKICB2b2lkIF9wcmludEV2ZW50KFN0cmluZyBuYW1lKSB7CiAgICBJdGVyYWJsZTxUeXBlUHJvbW90aW9uRmFjdD4gZmFjdENoYWluKFR5cGVQcm9tb3Rpb25GYWN0IGZhY3QpIHN5bmMqIHsKICAgICAgd2hpbGUgKGZhY3QgIT0gbnVsbCkgewogICAgICAgIHlpZWxkIGZhY3Q7CiAgICAgICAgZmFjdCA9IGZhY3QucHJldmlvdXNGb3JWYXJpYWJsZTsKICAgICAgfQogICAgfQoKICAgIF9jb21wdXRlQ3VycmVudEZhY3RNYXAoKS5mb3JFYWNoKCh2YXJpYWJsZSwgZmFjdCkgewogICAgICBpZiAoZmFjdCA9PSBudWxsKSByZXR1cm47CiAgICAgIHByaW50KCcgICR7dmFyaWFibGUgPz8gJyhudWxsKSd9OiAke2ZhY3RDaGFpbihmYWN0KS5qb2luKCcgLT4gJyl9Jyk7CiAgICB9KTsKICAgIGlmIChfcHJvbW90aW9uRXhwcmVzc2lvbiAhPSBudWxsKSB7CiAgICAgIHByaW50KCcgIF9wcm9tb3Rpb25FeHByZXNzaW9uOiAkX3Byb21vdGlvbkV4cHJlc3Npb24nKTsKICAgICAgaWYgKCFpZGVudGljYWwoX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb24sIF9jdXJyZW50RmFjdHMpKSB7CiAgICAgICAgcHJpbnQoJyAgICBpZiB0cnVlOiAkX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb24nKTsKICAgICAgfQogICAgfQogICAgcHJpbnQobmFtZSk7CiAgfQoKICAvLy8gUmVjb3JkcyB0aGF0IGFmdGVyIHRoZSBldmFsdWF0aW9uIG9mIFtleHByZXNzaW9uXSwgdGhlIGZhY3RzIHdpbGwgYmUKICAvLy8gW2lmVHJ1ZV0gb24gYSBicmFuY2ggd2hlcmUgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVkIHRvIGB0cnVlYCwgYW5kCiAgLy8vIFtpZkZhbHNlXSBvbiBhIGJyYW5jaCB3aGVyZSB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZWQgdG8gYGZhbHNlYCAob3Igd2hlcmUKICAvLy8gdGhlIHRydXRoIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGRvZXNuJ3QgbWF0dGVyKS4KICAvLy8KICAvLy8gVE9ETyhwYXVsYmVycnkpOiB3aGVuIHdlIHN0YXJ0IGhhbmRsaW5nIHByb21vdGlvbiBpbiAiZWxzZSIgY2xhdXNlcywgd2UnbGwKICAvLy8gbmVlZCB0byBzcGxpdCBbaWZGYWxzZV0gaW50byB0d28gY2FzZXMsIG9uZSBmb3Igd2hlbiB0aGUgZXhwcmVzc2lvbgogIC8vLyBldmFsdWF0ZWQgdG8gYGZhbHNlYCwgYW5kIG9uZSB3aGVyZSB0aGUgdHJ1dGggdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KICAvLy8gZG9lc24ndCBtYXR0ZXIuCiAgdm9pZCBfcmVjb3JkUHJvbW90aW9uRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIFR5cGVQcm9tb3Rpb25GYWN0IGlmVHJ1ZSwgVHlwZVByb21vdGlvbkZhY3QgaWZGYWxzZSkgewogICAgX3Byb21vdGlvbkV4cHJlc3Npb24gPSBleHByZXNzaW9uOwogICAgX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb24gPSBpZlRydWU7CiAgICBfY3VycmVudEZhY3RzID0gaWZGYWxzZTsKICB9Cn0KCi8vLyBBIHNpbmdsZSBmYWN0IHdoaWNoIGlzIGtub3duIHRvIHRoZSB0eXBlIHByb21vdGlvbiBlbmdpbmUgYWJvdXQgdGhlIHN0YXRlIG9mCi8vLyBhIHZhcmlhYmxlIChvciBhYm91dCB0aGUgZmxvdyBjb250cm9sIG9mIHRoZSBjb21wb25lbnQpLgovLy8KLy8vIFRoZSB0eXBlIGFyZ3VtZW50IFYgcmVwcmVzZW50cyBpcyB0aGUgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyBsb2NhbCB2YXJpYWJsZQovLy8gZGVjbGFyYXRpb25zLgovLy8KLy8vIEZhY3RzIGFyZSBsaW5rZWQgdG9nZXRoZXIgaW50byBsaW5rZWQgbGlzdHMgdmlhIHRoZSBbcHJldmlvdXNdIHBvaW50ZXIgaW50bwovLy8gYSBkYXRhIHN0cnVjdHVyZSBjYWxsZWQgYSAiZmFjdCBjaGFpbiIgKG9yIHNvbWV0aW1lcyBhICJmYWN0IHN0YXRlIiksIHdoaWNoCi8vLyByZXByZXNlbnRzIGFsbCBmYWN0cyB0aGF0IGFyZSBrbm93biB0byBob2xkIGF0IGEgY2VydGFpbiBwb2ludCBpbiB0aGUKLy8vIGNvbXBvbmVudC4KLy8vCi8vLyBUaGUgZmFjdCBpcyBzYWlkIHRvICJhcHBseSIgdG8gYSBnaXZlbiBwb2ludCBpbiB0aGUgZXhlY3V0aW9uIG9mIHRoZQovLy8gY29tcG9uZW50IGlmIHRoZSBmYWN0IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgZmFjdCBzdGF0ZSBhdCB0aGUgcG9pbnQgdGhlCi8vLyBwYXJzZXIgcmVhY2hlcyB0aGF0IHBvaW50IGluIHRoZSBjb21wb25lbnQuCi8vLwovLy8gTm90ZToganVzdCBiZWNhdXNlIGEgZmFjdCAiYXBwbGllcyIgdG8gYSBnaXZlbiBwb2ludCBpbiB0aGUgZXhlY3V0aW9uIG9mCi8vLyB0aGUgY29tcG9uZW50IGRvZXNuJ3QgbWVhbiBhIHR5cGUgd2lsbCBiZSBwcm9tb3RlZC0taXQgc2ltcGx5IG1lYW5zIHRoYXQKLy8vIHRoZSBmYWN0IHdhcyBkZWR1Y2VkIGF0IGEgcHJldmlvdXMgcG9pbnQgaW4gdGhlIHN0cmFpZ2h0IGxpbmUgZXhlY3V0aW9uIG9mCi8vLyB0aGUgY29kZS4gIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgZmFjdCB3aWxsIGJlIG92ZXJzaGFkb3dlZCBieSBhIGxhdGVyCi8vLyBmYWN0LCBvciBpdHMgZWZmZWN0IHdpbGwgYmUgY2FuY2VsbGVkIGJ5IGEgbGF0ZXIgYXNzaWdubWVudC4gIFRoZSBmaW5hbAovLy8gZGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIHByb21vdGlvbiBvY2N1cnMgaXMgbGVmdCB0byBbX2NvbXB1dGVQcm9tb3RlZFR5cGVdLgphYnN0cmFjdCBjbGFzcyBUeXBlUHJvbW90aW9uRmFjdCB7CiAgLy8vIFRoZSB2YXJpYWJsZSB0aGlzIGZhY3QgcmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCwgb3IgYG51bGxgIGlmIHRoaXMgZmFjdAogIC8vLyByZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IGdlbmVyYWwgZmxvdyBjb250cm9sLgogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CgogIC8vLyBUaGUgZmFjdCBjaGFpbiB0aGF0IHdhcyBpbiBlZmZlY3QgcHJpb3IgdG8gZXhlY3V0aW9uIG9mIHRoZSBzdGF0ZW1lbnQgb3IKICAvLy8gZXhwcmVzc2lvbiB0aGF0IGNhdXNlZCB0aGlzIGZhY3QgdG8gYmUgdHJ1ZS4KICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91czsKCiAgLy8vIEludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdC4gIEVhY2ggdGltZSBhIGZhY3QgaXMgY3JlYXRlZCBpdCBpcwogIC8vLyBnaXZlbiBhIHNlcXVlbmNlIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBmYWN0LgogIC8vLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSBmb3IgZmluZGluZyB0aGUgY29tbW9uIGFuY2VzdG9yIG9mIHR3bwogIC8vLyBmYWN0czsgd2UgcmVwZWF0ZWRseSB3YWxrIGJhY2t3YXJkIHRoZSBmYWN0IHdpdGggdGhlIGxhcmdlciBzZXF1ZW5jZQogIC8vLyBudW1iZXIgdW50aWwgdGhlIHNlcXVlbmNlIG51bWJlcnMgYXJlIHRoZSBzYW1lLgogIGZpbmFsIGludCBzZXF1ZW5jZU51bWJlcjsKCiAgLy8vIFRoZSBtb3N0IHJlY2VudCBmYWN0IGFwcGVhcmluZyBpbiB0aGUgZmFjdCBjaGFpbiBbcHJldmlvdXNdIHdob3NlCiAgLy8vIFt2YXJpYWJsZV0gbWF0Y2hlcyB0aGlzIG9uZSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZmFjdC4KICBmaW5hbCBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91c0ZvclZhcmlhYmxlOwoKICAvLy8gVGhlIGZ1bmN0aW9uIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGV4cHJlc3Npb24gdGhhdCBsZWQgdG8gdGhpcyBmYWN0LgogIGZpbmFsIGludCBmdW5jdGlvbk5lc3RpbmdMZXZlbDsKCiAgLy8vIElmIHRoaXMgZmFjdCdzIHZhcmlhYmxlIHdhcyBtdXRhdGVkIHdpdGhpbiBhbnkgc2NvcGVzIHRoZQogIC8vLyBmYWN0IGFwcGxpZXMgdG8sIGEgc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjb3Blcy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIHNpemUgb2YgdGhpcyBzZXQgaXMgcHJvYmFibHkgdmVyeSBzbWFsbCBtb3N0IG9mIHRoZQogIC8vLyB0aW1lLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBhIGxpc3Q/CiAgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4gX211dGF0ZWRJblNjb3BlczsKCiAgLy8vIElmIHRoaXMgZmFjdCdzIHZhcmlhYmxlIHdhcyBhY2Nlc3NlZCBpbnNpZGUgYSBjbG9zdXJlIHdpdGhpbiBhbnkgc2NvcGVzCiAgLy8vIHRoZSBmYWN0IGFwcGxpZXMgdG8sIGEgc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNjb3Blcy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5KTogdGhlIHNpemUgb2YgdGhpcyBzZXQgaXMgcHJvYmFibHkgdmVyeSBzbWFsbCBtb3N0IG9mIHRoZQogIC8vLyB0aW1lLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBhIGxpc3Q/CiAgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4gX2FjY2Vzc2VkSW5DbG9zdXJlSW5TY29wZXM7CgogIFR5cGVQcm9tb3Rpb25GYWN0KHRoaXMuc2VxdWVuY2VOdW1iZXIsIHRoaXMudmFyaWFibGUsIHRoaXMucHJldmlvdXMsCiAgICAgIHRoaXMucHJldmlvdXNGb3JWYXJpYWJsZSwgdGhpcy5mdW5jdGlvbk5lc3RpbmdMZXZlbCk7CgogIC8vLyBDb21wdXRlcyB0aGUgcHJvbW90ZWQgdHlwZSBmb3IgW3ZhcmlhYmxlXSBhdCBhIGxvY2F0aW9uIGluIHRoZSBjb2RlIHdoZXJlCiAgLy8vIHRoaXMgZmFjdCBhcHBsaWVzLgogIC8vLwogIC8vLyBTaG91bGQgbm90IGJlIGNhbGxlZCB1bnRpbCBhZnRlciBwYXJzaW5nIG9mIHRoZSBlbnRpcmUgbWV0aG9kIGlzIGNvbXBsZXRlLgogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXJJbXBsIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpOwoKICAvLy8gUmVjb3JkcyB0aGUgZmFjdCB0aGF0IHRoZSB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5IFtmYWN0XSB3YXMgYWNjZXNzZWQKICAvLy8gd2l0aGluIHRoZSBnaXZlbiBzY29wZSwgYXQgdGhlIGdpdmVuIGZ1bmN0aW9uIG5lc3RpbmcgbGV2ZWwuCiAgLy8vCiAgLy8vIElmIGBudWxsYCBpcyBwYXNzZWQgaW4gZm9yIFtmYWN0XSwgdGhlcmUgaXMgbm8gZWZmZWN0LgogIHN0YXRpYyB2b2lkIF9yZWNvcmRBY2Nlc3NlZEluU2NvcGUoVHlwZVByb21vdGlvbkZhY3QgZmFjdCwKICAgICAgVHlwZVByb21vdGlvblNjb3BlIHNjb3BlLCBpbnQgZnVuY3Rpb25OZXN0aW5nTGV2ZWwpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogbWFrZSBzb21lIGludGVncmF0aW9uIHRlc3QgY2FzZXMgdGhhdCBleGVyY2lzZSB0aGUKICAgIC8vIGJlaGF2aW9ycyBvZiB0aGlzIGZ1bmN0aW9uLiAgSW4gcGFydGljdWxhciB2ZXJpZnkgdGhhdCBpdCdzIGNvcnJlY3QgdG8KICAgIC8vIHRlc3QgZnVuY3Rpb25OZXN0aW5nTGV2ZWwgYWdhaW5zdCBmYWN0LmZ1bmN0aW9uTmVzdGluZ0xldmVsIChhcyBvcHBvc2VkCiAgICAvLyB0byB0ZXN0aW5nIGl0IGFnYWluc3QgZ2V0VmFyaWFibGVGdW5jdGlvbk5lc3RpbmdMZXZlbCh2YXJpYWJsZSkpLgogICAgd2hpbGUgKGZhY3QgIT0gbnVsbCkgewogICAgICBpZiAoZnVuY3Rpb25OZXN0aW5nTGV2ZWwgPiBmYWN0LmZ1bmN0aW9uTmVzdGluZ0xldmVsKSB7CiAgICAgICAgZmFjdC5fYWNjZXNzZWRJbkNsb3N1cmVJblNjb3BlcyA/Pz0KICAgICAgICAgICAgbmV3IFNldDxUeXBlUHJvbW90aW9uU2NvcGU+LmlkZW50aXR5KCk7CiAgICAgICAgaWYgKCFmYWN0Ll9hY2Nlc3NlZEluQ2xvc3VyZUluU2NvcGVzLmFkZChzY29wZSkpIHJldHVybjsKICAgICAgfQogICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgfQogIH0KCiAgLy8vIFJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBieSBbZmFjdF0gd2FzIG11dGF0ZWQKICAvLy8gd2l0aGluIHRoZSBnaXZlbiBzY29wZS4KICAvLy8KICAvLy8gSWYgYG51bGxgIGlzIHBhc3NlZCBpbiBmb3IgW2ZhY3RdLCB0aGVyZSBpcyBubyBlZmZlY3QuCiAgc3RhdGljIHZvaWQgX3JlY29yZE11dGF0ZWRJblNjb3BlKAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBmYWN0LCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIHdoaWxlIChmYWN0ICE9IG51bGwpIHsKICAgICAgZmFjdC5fbXV0YXRlZEluU2NvcGVzID8/PSBuZXcgU2V0PFR5cGVQcm9tb3Rpb25TY29wZT4uaWRlbnRpdHkoKTsKICAgICAgaWYgKCFmYWN0Ll9tdXRhdGVkSW5TY29wZXMuYWRkKHNjb3BlKSkgcmV0dXJuOwogICAgICBmYWN0ID0gZmFjdC5wcmV2aW91c0ZvclZhcmlhYmxlOwogICAgfQogIH0KfQoKLy8vIFJlcHJlc2VudHMgYSBjb250aWd1b3VzIGJsb2NrIG9mIHByb2dyYW0gdGV4dCBpbiB3aGljaCB2YXJpYWJsZXMgbWF5IG9yIG1heQovLy8gbm90IGJlIHByb21vdGVkLiAgQWxzbyB1c2VkIGFzIGEgc3RhY2sgdG8ga2VlcCB0cmFjayBvZiBzdGF0ZSB3aGlsZSB0aGUKLy8vIG1ldGhvZCBpcyBiZWluZyBwYXJzZWQuCmNsYXNzIFR5cGVQcm9tb3Rpb25TY29wZSB7CiAgLy8vIFRoZSBuZXN0aW5nIGRlcHRoIG9mIHRoaXMgc2NvcGUuICBUaGUgb3V0ZXJtb3N0IHNjb3BlIChyZXByZXNlbnRpbmcgdGhlCiAgLy8vIHdob2xlIG1ldGhvZCBib2R5KSBoYXMgYSBkZXB0aCBvZiAwLgogIGZpbmFsIGludCBfZGVwdGg7CgogIC8vLyBUaGUgW1R5cGVQcm9tb3Rpb25TY29wZV0gcmVwcmVzZW50aW5nIHRoZSBzY29wZSBlbmNsb3NpbmcgdGhpcyBvbmUuCiAgZmluYWwgVHlwZVByb21vdGlvblNjb3BlIF9lbmNsb3Npbmc7CgogIFR5cGVQcm9tb3Rpb25TY29wZSh0aGlzLl9lbmNsb3NpbmcpIDogX2RlcHRoID0gX2VuY2xvc2luZy5fZGVwdGggKyAxOwoKICBjb25zdCBUeXBlUHJvbW90aW9uU2NvcGUuX3RvcExldmVsKCkKICAgICAgOiBfZW5jbG9zaW5nID0gbnVsbCwKICAgICAgICBfZGVwdGggPSAwOwoKICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgc2NvcGUgY29tcGxldGVseSBlbmNsb3NlcyAob3IgaXMgdGhlIHNhbWUgYXMpCiAgLy8vIFtvdGhlcl0uCiAgYm9vbCBjb250YWluc1Njb3BlKFR5cGVQcm9tb3Rpb25TY29wZSBvdGhlcikgewogICAgaWYgKHRoaXMuX2RlcHRoID4gb3RoZXIuX2RlcHRoKSB7CiAgICAgIC8vIFdlIGNhbid0IHBvc3NpYmx5IGNvbnRhaW4gYSBzY29wZSBpZiB3ZSBhcmUgYXQgZ3JlYXRlciBuZXN0aW5nIGRlcHRoCiAgICAgIC8vIHRoYW4gaXQgaXMuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHdoaWxlICh0aGlzLl9kZXB0aCA8IG90aGVyLl9kZXB0aCkgewogICAgICBvdGhlciA9IG90aGVyLl9lbmNsb3Npbmc7CiAgICB9CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyKTsKICB9Cn0KCi8vLyBbVHlwZVByb21vdGlvblNjb3BlXSByZXByZXNlbnRpbmcgdGhlICJ0aGVuIiBhbmQgImVsc2UiIGJvZGllcyBvZiBhbiAiaWYiCi8vLyBzdGF0ZW1lbnQgb3IgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KY2xhc3MgX0NvbmRpdGlvbmFsU2NvcGUgZXh0ZW5kcyBUeXBlUHJvbW90aW9uU2NvcGUgewogIC8vLyBUaGUgZmFjdCBzdGF0ZSBpbiBlZmZlY3QgYXQgdGhlIHRvcCBvZiB0aGUgImVsc2UiIGJsb2NrLgogIGZpbmFsIFR5cGVQcm9tb3Rpb25GYWN0IGJlZm9yZUVsc2U7CgogIC8vLyBUaGUgZmFjdCBzdGF0ZSB3aGljaCB3YXMgaW4gZWZmZWN0IGF0IHRoZSBib3R0b20gb2YgdGhlICJ0aGVuIiBibG9jay4KICBUeXBlUHJvbW90aW9uRmFjdCBhZnRlclRydWU7CgogIF9Db25kaXRpb25hbFNjb3BlKFR5cGVQcm9tb3Rpb25TY29wZSBlbmNsb3NpbmcsIHRoaXMuYmVmb3JlRWxzZSkKICAgICAgOiBzdXBlcihlbmNsb3NpbmcpOwp9CgovLy8gW1R5cGVQcm9tb3Rpb25GYWN0XSByZXByZXNlbnRpbmcgYW4gImlzIiBjaGVjayB3aGljaCBzdWNjZWVkZWQuCmNsYXNzIF9Jc0NoZWNrIGV4dGVuZHMgVHlwZVByb21vdGlvbkZhY3QgewogIC8vLyBUaGUgdHlwZSBhcHBlYXJpbmcgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiAiaXMiLgogIGZpbmFsIERhcnRUeXBlIGNoZWNrZWRUeXBlOwoKICBfSXNDaGVjaygKICAgICAgaW50IHNlcXVlbmNlTnVtYmVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBUeXBlUHJvbW90aW9uRmFjdCBwcmV2aW91cywKICAgICAgVHlwZVByb21vdGlvbkZhY3QgcHJldmlvdXNGb3JWYXJpYWJsZSwKICAgICAgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICB0aGlzLmNoZWNrZWRUeXBlKQogICAgICA6IHN1cGVyKHNlcXVlbmNlTnVtYmVyLCB2YXJpYWJsZSwgcHJldmlvdXMsIHByZXZpb3VzRm9yVmFyaWFibGUsCiAgICAgICAgICAgIGZ1bmN0aW9uTmVzdGluZ0xldmVsKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ2lzQ2hlY2soJGNoZWNrZWRUeXBlKSc7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIF9jb21wdXRlUHJvbW90ZWRUeXBlKAogICAgICBUeXBlUHJvbW90ZXJJbXBsIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIERhcnRUeXBlIHByZXZpb3VzUHJvbW90ZWRUeXBlID0KICAgICAgICBwcmV2aW91c0ZvclZhcmlhYmxlPy5fY29tcHV0ZVByb21vdGVkVHlwZShwcm9tb3Rlciwgc2NvcGUpOwoKICAgIC8vIElmIHRoZSB2YXJpYWJsZSB3YXMgbXV0YXRlZCBzb21ld2hlcmUgaW4gdGhlIHNjb3BlIG9mIHRoZSBwb3RlbnRpYWwKICAgIC8vIHByb21vdGlvbiwgcHJvbW90aW9uIGRvZXMgbm90IG9jY3VyLgogICAgaWYgKF9tdXRhdGVkSW5TY29wZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVQcm9tb3Rpb25TY29wZSBhc3NpZ25tZW50U2NvcGUgaW4gX211dGF0ZWRJblNjb3BlcykgewogICAgICAgIGlmIChhc3NpZ25tZW50U2NvcGUuY29udGFpbnNTY29wZShzY29wZSkpIHsKICAgICAgICAgIHJldHVybiBwcmV2aW91c1Byb21vdGVkVHlwZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgdmFyaWFibGUgd2FzIG11dGF0ZWQgYW55d2hlcmUsIGFuZCBpdCB3YXMgYWNjZXNzZWQgaW5zaWRlIGEKICAgIC8vIGNsb3N1cmUgc29tZXdoZXJlIGluIHRoZSBzY29wZSBvZiB0aGUgcG90ZW50aWFsIHByb21vdGlvbiwgcHJvbW90aW9uIGRvZXMKICAgIC8vIG5vdCBvY2N1ci4KICAgIGlmIChwcm9tb3Rlci53YXNWYXJpYWJsZU11dGF0ZWRBbnl3aGVyZSh2YXJpYWJsZSkgJiYKICAgICAgICBfYWNjZXNzZWRJbkNsb3N1cmVJblNjb3BlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVByb21vdGlvblNjb3BlIGFjY2Vzc1Njb3BlIGluIF9hY2Nlc3NlZEluQ2xvc3VyZUluU2NvcGVzKSB7CiAgICAgICAgaWYgKGFjY2Vzc1Njb3BlLmNvbnRhaW5zU2NvcGUoc2NvcGUpKSB7CiAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9tb3RlZFR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gV2hhdCB3ZSBkbyBub3cgZGVwZW5kcyBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgb2YKICAgIC8vIHRoZSB2YXJpYWJsZSBhbmQgdGhlIHR5cGUgd2UgYXJlIGNoZWNraW5nIGFnYWluc3QuCiAgICBEYXJ0VHlwZSBwcmV2aW91c1R5cGUgPSBwcmV2aW91c1Byb21vdGVkVHlwZSA/PyB2YXJpYWJsZS50eXBlOwogICAgaWYgKHByb21vdGVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICBjaGVja2VkVHlwZSwgcHJldmlvdXNUeXBlLCBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpIHsKICAgICAgLy8gVGhlIHR5cGUgd2UgYXJlIGNoZWNraW5nIGFnYWluc3QgaXMgYSBzdWJ0eXBlIG9mIHRoZSBwcmV2aW91cyB0eXBlIG9mCiAgICAgIC8vIHRoZSB2YXJpYWJsZSwgc28gdGhpcyBpcyBhIHJlZmluZW1lbnQ7IHdlIGNhbiBwcm9tb3RlLgogICAgICByZXR1cm4gY2hlY2tlZFR5cGU7CiAgICB9IGVsc2UgaWYgKHByZXZpb3VzVHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJgogICAgICAgIHByb21vdGVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc1N1YnR5cGVPZihjaGVja2VkVHlwZSwKICAgICAgICAgICAgcHJldmlvdXNUeXBlLmJvdW5kLCBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpIHsKICAgICAgLy8gVGhlIHR5cGUgd2UgYXJlIGNoZWNraW5nIGFnYWluc3QgaXMgYSBzdWJ0eXBlIG9mIHRoZSBib3VuZCBvZiB0aGUKICAgICAgLy8gcHJldmlvdXMgdHlwZSBvZiB0aGUgdmFyaWFibGU7IHdlIGNhbiBwcm9tb3RlIHRoZSBib3VuZC4KICAgICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5pbnRlcnNlY3Rpb24oCiAgICAgICAgICBwcmV2aW91c1R5cGUucGFyYW1ldGVyLCBwcmV2aW91c1R5cGUubnVsbGFiaWxpdHksIGNoZWNrZWRUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoZSB0eXBlcyBhcmVuJ3Qgc3VmZmljaWVudGx5IHJlbGF0ZWQ7IHdlIGNhbid0IHByb21vdGUuCiAgICAgIHJldHVybiBwcmV2aW91c1Byb21vdGVkVHlwZTsKICAgIH0KICB9Cn0KCi8vLyBbVHlwZVByb21vdGlvblNjb3BlXSByZXByZXNlbnRpbmcgdGhlIFJIUyBvZiBhIGxvZ2ljYWwgZXhwcmVzc2lvbi4KY2xhc3MgX0xvZ2ljYWxTY29wZSBleHRlbmRzIFR5cGVQcm9tb3Rpb25TY29wZSB7CiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBsb2dpY2FsIG9wZXJhdGlvbiBpcyBhbiBgJiZgIG9yIGFuIGB8fGAuCiAgZmluYWwgYm9vbCBpc0FuZDsKCiAgLy8vIFRoZSBmYWN0IHN0YXRlIGluIGVmZmVjdCBpZiB0aGUgbG9naWNhbCBleHByZXNzaW9uIGdldHMgc2hvcnQtY3V0LgogIGZpbmFsIFR5cGVQcm9tb3Rpb25GYWN0IHNob3J0Y3V0RmFjdHM7CgogIF9Mb2dpY2FsU2NvcGUoVHlwZVByb21vdGlvblNjb3BlIGVuY2xvc2luZywgdGhpcy5pc0FuZCwgdGhpcy5zaG9ydGN1dEZhY3RzKQogICAgICA6IHN1cGVyKGVuY2xvc2luZyk7Cn0KCi8vLyBJbnN0YW5jZSBvZiBbVHlwZVByb21vdGlvbkZhY3RdIHJlcHJlc2VudGluZyB0aGUgZmFjdHMgd2hpY2ggYXJlIGtub3duIG9uCi8vLyBlbnRyeSB0byB0aGUgbWV0aG9kIChpLmUuIG5vdGhpbmcpLgpjbGFzcyBfTnVsbEZhY3QgZXh0ZW5kcyBUeXBlUHJvbW90aW9uRmFjdCB7CiAgX051bGxGYWN0KCkgOiBzdXBlcigwLCBudWxsLCBudWxsLCBudWxsLCAwKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ251bGwnOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBfY29tcHV0ZVByb21vdGVkVHlwZSgKICAgICAgVHlwZVByb21vdGVyIHByb21vdGVyLCBUeXBlUHJvbW90aW9uU2NvcGUgc2NvcGUpIHsKICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCdUcmllZCB0byBjcmVhdGUgcHJvbW90ZWQgdHlwZSBmb3Igbm8gdmFyaWFibGUnKTsKICB9Cn0KCi8vLyBJbnN0YW5jZSBvZiBbVHlwZVByb21vdGlvblNjb3BlXSByZXByZXNlbnRpbmcgdGhlIGVudGlyZSBtZXRob2QgYm9keS4KY2xhc3MgX1RvcExldmVsU2NvcGUgZXh0ZW5kcyBUeXBlUHJvbW90aW9uU2NvcGUgewogIGNvbnN0IF9Ub3BMZXZlbFNjb3BlKCkgOiBzdXBlci5fdG9wTGV2ZWwoKTsKfQqC4wBNTj8BIUcBRQFIATABPgFCAUIET0xQUEpNTQRQSlFOQQRNTkoeGgFGIgFCATAnAVA5BlEfIFABSw4UAUxEQAFRSyIoAUs9GgFOH0wBOxMBUEsNBk5LJj8BSiA/TgFKD08CAUoESzUyNAEMLwEMUSQMAQwWAQxCAQwqAQwcAQxOAQwVAQwmRQwBDD9QAQxRAgFIBEtONDc1AU0XBjoeAUskBlAlQQFLJSUBTkwOIwFRUD0jAU4/MjYBUUo9AUwPIwFIOAFMJiQaIwQBDDgBDCBRJzQEAU9JTSEaBAEMFR0tUC4lSiYEAQxBKkU3OUZLLBRRSTQ0BAEMKR1LPT9OMkZJHwQBDBsjLS5BBAEMTSkpLhdJPA0iHTshBgQBDBQcLBc+MQ4RBgQBDCZAJEEuNBEEAVFFAQw/TyExJSMSFyweDxdIBgQBTw4GSkwROwFKD1AiQUJMLQYqBAFKMDQBT0EBREIBTRhBAUE4SU1LUEdRDjZOTE9BMg9PTxkvMTQIBjhMTyw1LihJUDslRjIIBiUXBAFLKAZENE9JGAdLNhoEAUsnBkQ0Ly0bAVAOTEtRTwdMFiIUIg0aMzEYDxgIBh0OBAFRDBwiSh0UKQgGATggSwgoPklBCAYRBAFLSVA5BlFKTBY5PScvHQQCAVE9BFASBFBQSg8ESU0wBE1NT0tMUSNPNiYBTzMkAUxOS0s2HAFIRy8BSiIBQE0GTy8sAU5RBk8vNgFHPAFQGQZRITwBS0MGPT08S05PSRs+LDRBCCcGBAFKHgY9JTobSDUnBgQCAVBMHBtOKxQBSicBSAEnGxQBTA8xJk4VFAYpIAYjBAIBTik1PyYBTB8BQxoCAUQrOR4BDBokIi0gGEcjAQwwAQwhPSREAUssJEU0JwoIBgFKURI5LkswJwoIBgFPOkM0Tk9AGjRAS0tCMUoNQiMGBAIBRzFFFAFJKQFOGgIBTigsLwEMHwEMITlLBAIBSjIuAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfcHJvbW90aW9uLmRhcnRfZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2NvbGxlY3Rpb25zLmRhcnTAAEaKLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGlicmFyeSBmYXN0YS5jb2xsZWN0aW9uczsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQsCiAgICAgICAgTWFwRW50cnksCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgU3RhdGVtZW50LAogICAgICAgIFRyZWVOb2RlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgc2V0UGFyZW50cywKICAgICAgICB0cmFuc2Zvcm1MaXN0LAogICAgICAgIHZpc2l0TGlzdDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JyBzaG93IFN0YXRpY1R5cGVDb250ZXh0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnCiAgICBzaG93CiAgICAgICAgRXhwcmVzc2lvblZpc2l0b3IsCiAgICAgICAgRXhwcmVzc2lvblZpc2l0b3IxLAogICAgICAgIFRyYW5zZm9ybWVyLAogICAgICAgIFRyZWVWaXNpdG9yLAogICAgICAgIFZpc2l0b3I7CgppbXBvcnQgJy4uL21lc3NhZ2VzLmRhcnQnCiAgICBzaG93IG5vTGVuZ3RoLCB0ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3QsIHRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Q7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgZ2V0RmlsZVVyaSwgdW5zdXBwb3J0ZWQ7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydCcgc2hvdyBJbmZlcmVuY2VIZWxwZXI7CgovLy8gTWl4aW4gZm9yIHNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzLgovLy8KLy8vIFNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzIGFyZSBub3QgdHJ1bHkgZXhwcmVzc2lvbnMgYW5kIHRoZXkgY2Fubm90Ci8vLyBhcHBlYXIgaW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gY29udGV4dHMgaW4gdGhlIEtlcm5lbCBwcm9ncmFtLiAgVGhleSBjYW4KLy8vIG9ubHkgYXBwZWFyIGFzIGVsZW1lbnRzIGluIGxpc3Qgb3Igc2V0IGxpdGVyYWxzLiAgVGhleSBhcmUgdHJhbnNsYXRlZCBpbnRvCi8vLyBhIGxvd2VyLWxldmVsIHJlcHJlc2VudGF0aW9uIGFuZCBuZXZlciBzZXJpYWxpemVkIHRvIC5kaWxsIGZpbGVzLgptaXhpbiBDb250cm9sRmxvd0VsZW1lbnQgb24gRXhwcmVzc2lvbiB7CiAgLy8vIFNwcmVhZCBhbmQgY29udHJvbC1mbG93IGVsZW1lbnRzIGFyZSBub3QgZXhwcmVzc2lvbnMgYW5kIGRvIG5vdCBoYXZlIGEKICAvLy8gc3RhdGljIHR5cGUuCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImdldFN0YXRpY1R5cGUiLCBmaWxlT2Zmc2V0LCBnZXRGaWxlVXJpKHRoaXMpKTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYuZGVmYXVsdEV4cHJlc3Npb24odGhpcyk7CgogIEBvdmVycmlkZQogIFIgYWNjZXB0MTxSLCBBPihFeHByZXNzaW9uVmlzaXRvcjE8UiwgQT4gdiwgQSBhcmcpID0+CiAgICAgIHYuZGVmYXVsdEV4cHJlc3Npb24odGhpcywgYXJnKTsKCiAgLy8vIFJldHVybnMgdGhpcyBjb250cm9sIGZsb3cgZWxlbWVudCBhcyBhIFtNYXBFbnRyeV0sIG9yIGBudWxsYCBpZiB0aGlzCiAgLy8vIGNvbnRyb2wgZmxvdyBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50byBhIFtNYXBFbnRyeV0uCiAgLy8vCiAgLy8vIFtvbkNvbnZlcnRGb3JFbGVtZW50XSBpcyBjYWxsZWQgd2hlbiBhIFtGb3JFbGVtZW50XSBvciBbRm9ySW5FbGVtZW50XSBpcwogIC8vLyBjb252ZXJ0ZWQgdG8gYSBbRm9yTWFwRW50cnldIG9yIFtGb3JJbk1hcEVudHJ5XSwgcmVzcGVjdGl2ZWx5LgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IE1lcmdlIHRoaXMgd2l0aCBbY29udmVydFRvTWFwRW50cnldLgogIE1hcEVudHJ5IHRvTWFwRW50cnkodm9pZCBvbkNvbnZlcnRGb3JFbGVtZW50KFRyZWVOb2RlIGZyb20sIFRyZWVOb2RlIHRvKSk7Cn0KCi8vLyBBIHNwcmVhZCBlbGVtZW50IGluIGEgbGlzdCBvciBzZXQgbGl0ZXJhbC4KY2xhc3MgU3ByZWFkRWxlbWVudCBleHRlbmRzIEV4cHJlc3Npb24gd2l0aCBDb250cm9sRmxvd0VsZW1lbnQgewogIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKICBib29sIGlzTnVsbEF3YXJlOwoKICAvLy8gVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgW2V4cHJlc3Npb25dIGV2YWx1YXRlcyB0by4KICAvLy8KICAvLy8gSXQgaXMgc2V0IGR1cmluZyB0eXBlIGluZmVyZW5jZSBhbmQgaXMgdXNlZCB0byBhZGQgYXBwcm9wcmlhdGUgdHlwZSBjYXN0cwogIC8vLyBkdXJpbmcgdGhlIGRlc3VnYXJpbmcuCiAgRGFydFR5cGUgZWxlbWVudFR5cGU7CgogIFNwcmVhZEVsZW1lbnQodGhpcy5leHByZXNzaW9uLCB0aGlzLmlzTnVsbEF3YXJlKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3ByZWFkTWFwRW50cnkgdG9NYXBFbnRyeSgKICAgICAgdm9pZCBvbkNvbnZlcnRGb3JFbGVtZW50KFRyZWVOb2RlIGZyb20sIFRyZWVOb2RlIHRvKSkgewogICAgcmV0dXJuIG5ldyBTcHJlYWRNYXBFbnRyeShleHByZXNzaW9uLCBpc051bGxBd2FyZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KfQoKLy8vIEFuICdpZicgZWxlbWVudCBpbiBhIGxpc3Qgb3Igc2V0IGxpdGVyYWwuCmNsYXNzIElmRWxlbWVudCBleHRlbmRzIEV4cHJlc3Npb24gd2l0aCBDb250cm9sRmxvd0VsZW1lbnQgewogIEV4cHJlc3Npb24gY29uZGl0aW9uOwogIEV4cHJlc3Npb24gdGhlbjsKICBFeHByZXNzaW9uIG90aGVyd2lzZTsKCiAgSWZFbGVtZW50KHRoaXMuY29uZGl0aW9uLCB0aGlzLnRoZW4sIHRoaXMub3RoZXJ3aXNlKSB7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICB0aGVuPy5hY2NlcHQodik7CiAgICBvdGhlcndpc2U/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHRoZW4gIT0gbnVsbCkgewogICAgICB0aGVuID0gdGhlbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICB0aGVuPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIG90aGVyd2lzZSA9IG90aGVyd2lzZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBvdGhlcndpc2U/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNYXBFbnRyeSB0b01hcEVudHJ5KHZvaWQgb25Db252ZXJ0Rm9yRWxlbWVudChUcmVlTm9kZSBmcm9tLCBUcmVlTm9kZSB0bykpIHsKICAgIE1hcEVudHJ5IHRoZW5FbnRyeTsKICAgIGlmICh0aGVuIGlzIENvbnRyb2xGbG93RWxlbWVudCkgewogICAgICBDb250cm9sRmxvd0VsZW1lbnQgdGhlbkVsZW1lbnQgPSB0aGVuOwogICAgICB0aGVuRW50cnkgPSB0aGVuRWxlbWVudC50b01hcEVudHJ5KG9uQ29udmVydEZvckVsZW1lbnQpOwogICAgfQogICAgaWYgKHRoZW5FbnRyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIE1hcEVudHJ5IG90aGVyd2lzZUVudHJ5OwogICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIGlmIChvdGhlcndpc2UgaXMgQ29udHJvbEZsb3dFbGVtZW50KSB7CiAgICAgICAgQ29udHJvbEZsb3dFbGVtZW50IG90aGVyd2lzZUVsZW1lbnQgPSBvdGhlcndpc2U7CiAgICAgICAgb3RoZXJ3aXNlRW50cnkgPSBvdGhlcndpc2VFbGVtZW50LnRvTWFwRW50cnkob25Db252ZXJ0Rm9yRWxlbWVudCk7CiAgICAgIH0KICAgICAgaWYgKG90aGVyd2lzZUVudHJ5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIG5ldyBJZk1hcEVudHJ5KGNvbmRpdGlvbiwgdGhlbkVudHJ5LCBvdGhlcndpc2VFbnRyeSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9Cn0KCi8vLyBBICdmb3InIGVsZW1lbnQgaW4gYSBsaXN0IG9yIHNldCBsaXRlcmFsLgpjbGFzcyBGb3JFbGVtZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB3aXRoIENvbnRyb2xGbG93RWxlbWVudCB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIEV4cHJlc3Npb24gY29uZGl0aW9uOyAvLyBNYXkgYmUgbnVsbC4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIEV4cHJlc3Npb24gYm9keTsKCiAgRm9yRWxlbWVudCh0aGlzLnZhcmlhYmxlcywgdGhpcy5jb25kaXRpb24sIHRoaXMudXBkYXRlcywgdGhpcy5ib2R5KSB7CiAgICBzZXRQYXJlbnRzKHZhcmlhYmxlcywgdGhpcyk7CiAgICBjb25kaXRpb24/LnBhcmVudCA9IHRoaXM7CiAgICBzZXRQYXJlbnRzKHVwZGF0ZXMsIHRoaXMpOwogICAgYm9keT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHZpc2l0TGlzdCh2YXJpYWJsZXMsIHYpOwogICAgY29uZGl0aW9uPy5hY2NlcHQodik7CiAgICB2aXNpdExpc3QodXBkYXRlcywgdik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICB0cmFuc2Zvcm1MaXN0KHZhcmlhYmxlcywgdiwgdGhpcyk7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRyYW5zZm9ybUxpc3QodXBkYXRlcywgdiwgdGhpcyk7CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNYXBFbnRyeSB0b01hcEVudHJ5KHZvaWQgb25Db252ZXJ0Rm9yRWxlbWVudChUcmVlTm9kZSBmcm9tLCBUcmVlTm9kZSB0bykpIHsKICAgIE1hcEVudHJ5IGJvZHlFbnRyeTsKICAgIGlmIChib2R5IGlzIENvbnRyb2xGbG93RWxlbWVudCkgewogICAgICBDb250cm9sRmxvd0VsZW1lbnQgYm9keUVsZW1lbnQgPSBib2R5OwogICAgICBib2R5RW50cnkgPSBib2R5RWxlbWVudC50b01hcEVudHJ5KG9uQ29udmVydEZvckVsZW1lbnQpOwogICAgfQogICAgaWYgKGJvZHlFbnRyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIEZvck1hcEVudHJ5IHJlc3VsdCA9CiAgICAgICAgbmV3IEZvck1hcEVudHJ5KHZhcmlhYmxlcywgY29uZGl0aW9uLCB1cGRhdGVzLCBib2R5RW50cnkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgb25Db252ZXJ0Rm9yRWxlbWVudCh0aGlzLCByZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBBICdmb3ItaW4nIGVsZW1lbnQgaW4gYSBsaXN0IG9yIHNldCBsaXRlcmFsLgpjbGFzcyBGb3JJbkVsZW1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHdpdGggQ29udHJvbEZsb3dFbGVtZW50IHsKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOyAvLyBIYXMgbm8gaW5pdGlhbGl6ZXIuCiAgRXhwcmVzc2lvbiBpdGVyYWJsZTsKICBFeHByZXNzaW9uIHN5bnRoZXRpY0Fzc2lnbm1lbnQ7IC8vIE1heSBiZSBudWxsLgogIFN0YXRlbWVudCBleHByZXNzaW9uRWZmZWN0czsgLy8gTWF5IGJlIG51bGwuCiAgRXhwcmVzc2lvbiBib2R5OwogIEV4cHJlc3Npb24gcHJvYmxlbTsgLy8gTWF5IGJlIG51bGwuCiAgYm9vbCBpc0FzeW5jOyAvLyBUcnVlIGlmIHRoaXMgaXMgYW4gJ2F3YWl0IGZvcicgbG9vcC4KCiAgRm9ySW5FbGVtZW50KHRoaXMudmFyaWFibGUsIHRoaXMuaXRlcmFibGUsIHRoaXMuc3ludGhldGljQXNzaWdubWVudCwKICAgICAgdGhpcy5leHByZXNzaW9uRWZmZWN0cywgdGhpcy5ib2R5LCB0aGlzLnByb2JsZW0sCiAgICAgIHt0aGlzLmlzQXN5bmM6IGZhbHNlfSkgewogICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQ/LnBhcmVudCA9IHRoaXM7CiAgICBleHByZXNzaW9uRWZmZWN0cz8ucGFyZW50ID0gdGhpczsKICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICBwcm9ibGVtPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgU3RhdGVtZW50IGdldCBwcm9sb2d1ZSA9PiBzeW50aGV0aWNBc3NpZ25tZW50ICE9IG51bGwKICAgICAgPyAobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoc3ludGhldGljQXNzaWdubWVudCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBzeW50aGV0aWNBc3NpZ25tZW50LmZpbGVPZmZzZXQpCiAgICAgIDogZXhwcmVzc2lvbkVmZmVjdHM7CgogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHZhcmlhYmxlPy5hY2NlcHQodik7CiAgICBpdGVyYWJsZT8uYWNjZXB0KHYpOwogICAgc3ludGhldGljQXNzaWdubWVudD8uYWNjZXB0KHYpOwogICAgZXhwcmVzc2lvbkVmZmVjdHM/LmFjY2VwdCh2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICAgIHByb2JsZW0/LmFjY2VwdCh2KTsKICB9CgogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHZhcmlhYmxlID0gdmFyaWFibGUuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdmFyaWFibGU/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoaXRlcmFibGUgIT0gbnVsbCkgewogICAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGl0ZXJhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICBzeW50aGV0aWNBc3NpZ25tZW50ID0gc3ludGhldGljQXNzaWdubWVudC5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBzeW50aGV0aWNBc3NpZ25tZW50Py5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGV4cHJlc3Npb25FZmZlY3RzICE9IG51bGwpIHsKICAgICAgZXhwcmVzc2lvbkVmZmVjdHMgPSBleHByZXNzaW9uRWZmZWN0cy5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBleHByZXNzaW9uRWZmZWN0cz8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChwcm9ibGVtICE9IG51bGwpIHsKICAgICAgcHJvYmxlbSA9IHByb2JsZW0uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgcHJvYmxlbT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIE1hcEVudHJ5IHRvTWFwRW50cnkodm9pZCBvbkNvbnZlcnRGb3JFbGVtZW50KFRyZWVOb2RlIGZyb20sIFRyZWVOb2RlIHRvKSkgewogICAgTWFwRW50cnkgYm9keUVudHJ5OwogICAgaWYgKGJvZHkgaXMgQ29udHJvbEZsb3dFbGVtZW50KSB7CiAgICAgIENvbnRyb2xGbG93RWxlbWVudCBib2R5RWxlbWVudCA9IGJvZHk7CiAgICAgIGJvZHlFbnRyeSA9IGJvZHlFbGVtZW50LnRvTWFwRW50cnkob25Db252ZXJ0Rm9yRWxlbWVudCk7CiAgICB9CiAgICBpZiAoYm9keUVudHJ5ID09IG51bGwpIHJldHVybiBudWxsOwogICAgRm9ySW5NYXBFbnRyeSByZXN1bHQgPSBuZXcgRm9ySW5NYXBFbnRyeSh2YXJpYWJsZSwgaXRlcmFibGUsCiAgICAgICAgc3ludGhldGljQXNzaWdubWVudCwgZXhwcmVzc2lvbkVmZmVjdHMsIGJvZHlFbnRyeSwgcHJvYmxlbSwKICAgICAgICBpc0FzeW5jOiBpc0FzeW5jKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgb25Db252ZXJ0Rm9yRWxlbWVudCh0aGlzLCByZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCm1peGluIENvbnRyb2xGbG93TWFwRW50cnkgaW1wbGVtZW50cyBNYXBFbnRyeSB7CiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBnZXQga2V5IHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdDb250cm9sRmxvd01hcEVudHJ5LmtleSBnZXR0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0IGtleShFeHByZXNzaW9uIGV4cHIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdDb250cm9sRmxvd01hcEVudHJ5LmtleSBzZXR0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZ2V0IHZhbHVlIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdDb250cm9sRmxvd01hcEVudHJ5LnZhbHVlIGdldHRlcicpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBzZXQgdmFsdWUoRXhwcmVzc2lvbiBleHByKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignQ29udHJvbEZsb3dNYXBFbnRyeS52YWx1ZSBzZXR0ZXInKTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KFRyZWVWaXNpdG9yPFI+IHYpID0+IHYuZGVmYXVsdFRyZWVOb2RlKHRoaXMpOwp9CgovLy8gQSBzcHJlYWQgZWxlbWVudCBpbiBhIG1hcCBsaXRlcmFsLgpjbGFzcyBTcHJlYWRNYXBFbnRyeSBleHRlbmRzIFRyZWVOb2RlIHdpdGggQ29udHJvbEZsb3dNYXBFbnRyeSB7CiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwogIGJvb2wgaXNOdWxsQXdhcmU7CgogIC8vLyBUaGUgdHlwZSBvZiB0aGUgbWFwIGVudHJpZXMgb2YgdGhlIG1hcCB0aGF0IFtleHByZXNzaW9uXSBldmFsdWF0ZXMgdG8uCiAgLy8vCiAgLy8vIEl0IGlzIHNldCBkdXJpbmcgdHlwZSBpbmZlcmVuY2UgYW5kIGlzIHVzZWQgdG8gYWRkIGFwcHJvcHJpYXRlIHR5cGUgY2FzdHMKICAvLy8gZHVyaW5nIHRoZSBkZXN1Z2FyaW5nLgogIERhcnRUeXBlIGVudHJ5VHlwZTsKCiAgU3ByZWFkTWFwRW50cnkodGhpcy5leHByZXNzaW9uLCB0aGlzLmlzTnVsbEF3YXJlKSB7CiAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgZXhwcmVzc2lvbj8uYWNjZXB0KHYpOwogIH0KCiAgQG92ZXJyaWRlCiAgdHJhbnNmb3JtQ2hpbGRyZW4oVHJhbnNmb3JtZXIgdikgewogICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgewogICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBleHByZXNzaW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEFuICdpZicgZWxlbWVudCBpbiBhIG1hcCBsaXRlcmFsLgpjbGFzcyBJZk1hcEVudHJ5IGV4dGVuZHMgVHJlZU5vZGUgd2l0aCBDb250cm9sRmxvd01hcEVudHJ5IHsKICBFeHByZXNzaW9uIGNvbmRpdGlvbjsKICBNYXBFbnRyeSB0aGVuOwogIE1hcEVudHJ5IG90aGVyd2lzZTsKCiAgSWZNYXBFbnRyeSh0aGlzLmNvbmRpdGlvbiwgdGhpcy50aGVuLCB0aGlzLm90aGVyd2lzZSkgewogICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIG90aGVyd2lzZT8ucGFyZW50ID0gdGhpczsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIGNvbmRpdGlvbj8uYWNjZXB0KHYpOwogICAgdGhlbj8uYWNjZXB0KHYpOwogICAgb3RoZXJ3aXNlPy5hY2NlcHQodik7CiAgfQoKICBAb3ZlcnJpZGUKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmICh0aGVuICE9IG51bGwpIHsKICAgICAgdGhlbiA9IHRoZW4uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgdGhlbj8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChvdGhlcndpc2UgIT0gbnVsbCkgewogICAgICBvdGhlcndpc2UgPSBvdGhlcndpc2UuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgb3RoZXJ3aXNlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogIH0KfQoKLy8vIEEgJ2ZvcicgZWxlbWVudCBpbiBhIG1hcCBsaXRlcmFsLgpjbGFzcyBGb3JNYXBFbnRyeSBleHRlbmRzIFRyZWVOb2RlIHdpdGggQ29udHJvbEZsb3dNYXBFbnRyeSB7CiAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIEV4cHJlc3Npb24gY29uZGl0aW9uOyAvLyBNYXkgYmUgbnVsbC4KICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXM7IC8vIE1heSBiZSBlbXB0eSwgYnV0IG5vdCBudWxsLgogIE1hcEVudHJ5IGJvZHk7CgogIEZvck1hcEVudHJ5KHRoaXMudmFyaWFibGVzLCB0aGlzLmNvbmRpdGlvbiwgdGhpcy51cGRhdGVzLCB0aGlzLmJvZHkpIHsKICAgIHNldFBhcmVudHModmFyaWFibGVzLCB0aGlzKTsKICAgIGNvbmRpdGlvbj8ucGFyZW50ID0gdGhpczsKICAgIHNldFBhcmVudHModXBkYXRlcywgdGhpcyk7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdmlzaXRMaXN0KHZhcmlhYmxlcywgdik7CiAgICBjb25kaXRpb24/LmFjY2VwdCh2KTsKICAgIHZpc2l0TGlzdCh1cGRhdGVzLCB2KTsKICAgIGJvZHk/LmFjY2VwdCh2KTsKICB9CgogIEBvdmVycmlkZQogIHRyYW5zZm9ybUNoaWxkcmVuKFRyYW5zZm9ybWVyIHYpIHsKICAgIHRyYW5zZm9ybUxpc3QodmFyaWFibGVzLCB2LCB0aGlzKTsKICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgY29uZGl0aW9uPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtTGlzdCh1cGRhdGVzLCB2LCB0aGlzKTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGJvZHkuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgYm9keT8ucGFyZW50ID0gdGhpczsKICAgIH0KICB9Cn0KCi8vLyBBICdmb3ItaW4nIGVsZW1lbnQgaW4gYSBtYXAgbGl0ZXJhbC4KY2xhc3MgRm9ySW5NYXBFbnRyeSBleHRlbmRzIFRyZWVOb2RlIHdpdGggQ29udHJvbEZsb3dNYXBFbnRyeSB7CiAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsgLy8gSGFzIG5vIGluaXRpYWxpemVyLgogIEV4cHJlc3Npb24gaXRlcmFibGU7CiAgRXhwcmVzc2lvbiBzeW50aGV0aWNBc3NpZ25tZW50OyAvLyBNYXkgYmUgbnVsbC4KICBTdGF0ZW1lbnQgZXhwcmVzc2lvbkVmZmVjdHM7IC8vIE1heSBiZSBudWxsLgogIE1hcEVudHJ5IGJvZHk7CiAgRXhwcmVzc2lvbiBwcm9ibGVtOyAvLyBNYXkgYmUgbnVsbC4KICBib29sIGlzQXN5bmM7IC8vIFRydWUgaWYgdGhpcyBpcyBhbiAnYXdhaXQgZm9yJyBsb29wLgoKICBGb3JJbk1hcEVudHJ5KHRoaXMudmFyaWFibGUsIHRoaXMuaXRlcmFibGUsIHRoaXMuc3ludGhldGljQXNzaWdubWVudCwKICAgICAgdGhpcy5leHByZXNzaW9uRWZmZWN0cywgdGhpcy5ib2R5LCB0aGlzLnByb2JsZW0sCiAgICAgIHt0aGlzLmlzQXN5bmN9KQogICAgICA6IGFzc2VydChpc0FzeW5jICE9IG51bGwpIHsKICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgaXRlcmFibGU/LnBhcmVudCA9IHRoaXM7CiAgICBzeW50aGV0aWNBc3NpZ25tZW50Py5wYXJlbnQgPSB0aGlzOwogICAgZXhwcmVzc2lvbkVmZmVjdHM/LnBhcmVudCA9IHRoaXM7CiAgICBib2R5Py5wYXJlbnQgPSB0aGlzOwogICAgcHJvYmxlbT8ucGFyZW50ID0gdGhpczsKICB9CgogIFN0YXRlbWVudCBnZXQgcHJvbG9ndWUgPT4gc3ludGhldGljQXNzaWdubWVudCAhPSBudWxsCiAgICAgID8gKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHN5bnRoZXRpY0Fzc2lnbm1lbnQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3ludGhldGljQXNzaWdubWVudC5maWxlT2Zmc2V0KQogICAgICA6IGV4cHJlc3Npb25FZmZlY3RzOwoKICB2aXNpdENoaWxkcmVuKFZpc2l0b3I8T2JqZWN0PiB2KSB7CiAgICB2YXJpYWJsZT8uYWNjZXB0KHYpOwogICAgaXRlcmFibGU/LmFjY2VwdCh2KTsKICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQ/LmFjY2VwdCh2KTsKICAgIGV4cHJlc3Npb25FZmZlY3RzPy5hY2NlcHQodik7CiAgICBib2R5Py5hY2NlcHQodik7CiAgICBwcm9ibGVtPy5hY2NlcHQodik7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbihUcmFuc2Zvcm1lciB2KSB7CiAgICBpZiAodmFyaWFibGUgIT0gbnVsbCkgewogICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHZhcmlhYmxlPy5wYXJlbnQgPSB0aGlzOwogICAgfQogICAgaWYgKGl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgaXRlcmFibGUgPSBpdGVyYWJsZS5hY2NlcHQ8VHJlZU5vZGU+KHYpOwogICAgICBpdGVyYWJsZT8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChzeW50aGV0aWNBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgc3ludGhldGljQXNzaWdubWVudCA9IHN5bnRoZXRpY0Fzc2lnbm1lbnQuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgc3ludGhldGljQXNzaWdubWVudD8ucGFyZW50ID0gdGhpczsKICAgIH0KICAgIGlmIChleHByZXNzaW9uRWZmZWN0cyAhPSBudWxsKSB7CiAgICAgIGV4cHJlc3Npb25FZmZlY3RzID0gZXhwcmVzc2lvbkVmZmVjdHMuYWNjZXB0PFRyZWVOb2RlPih2KTsKICAgICAgZXhwcmVzc2lvbkVmZmVjdHM/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgIGJvZHkgPSBib2R5LmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIGJvZHk/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgICBpZiAocHJvYmxlbSAhPSBudWxsKSB7CiAgICAgIHByb2JsZW0gPSBwcm9ibGVtLmFjY2VwdDxUcmVlTm9kZT4odik7CiAgICAgIHByb2JsZW0/LnBhcmVudCA9IHRoaXM7CiAgICB9CiAgfQp9CgovLy8gQ29udmVydCBbZW50cnldIHRvIGFuIFtFeHByZXNzaW9uXSwgaWYgcG9zc2libGUuIElmIFtlbnRyeV0gY2Fubm90IGJlCi8vLyBjb252ZXJ0ZWQgYW4gZXJyb3IgcmVwb3J0ZWQgdGhyb3VnaCBbaGVscGVyXSBhbmQgYW4gaW52YWxpZCBleHByZXNzaW9uIGlzCi8vLyByZXR1cm5lZC4KLy8vCi8vLyBbb25Db252ZXJ0Rm9yTWFwRW50cnldIGlzIGNhbGxlZCB3aGVuIGEgW0Zvck1hcEVudHJ5XSBvciBbRm9ySW5NYXBFbnRyeV0gaXMKLy8vIGNvbnZlcnRlZCB0byBhIFtGb3JFbGVtZW50XSBvciBbRm9ySW5FbGVtZW50XSwgcmVzcGVjdGl2ZWx5LgpFeHByZXNzaW9uIGNvbnZlcnRUb0VsZW1lbnQoTWFwRW50cnkgZW50cnksIEluZmVyZW5jZUhlbHBlciBoZWxwZXIsCiAgICB2b2lkIG9uQ29udmVydEZvck1hcEVudHJ5KFRyZWVOb2RlIGZyb20sIFRyZWVOb2RlIHRvKSkgewogIGlmIChlbnRyeSBpcyBTcHJlYWRNYXBFbnRyeSkgewogICAgcmV0dXJuIG5ldyBTcHJlYWRFbGVtZW50KGVudHJ5LmV4cHJlc3Npb24sIGVudHJ5LmlzTnVsbEF3YXJlKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgfQogIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICByZXR1cm4gbmV3IElmRWxlbWVudCgKICAgICAgICBlbnRyeS5jb25kaXRpb24sCiAgICAgICAgY29udmVydFRvRWxlbWVudChlbnRyeS50aGVuLCBoZWxwZXIsIG9uQ29udmVydEZvck1hcEVudHJ5KSwKICAgICAgICBlbnRyeS5vdGhlcndpc2UgPT0gbnVsbAogICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgOiBjb252ZXJ0VG9FbGVtZW50KGVudHJ5Lm90aGVyd2lzZSwgaGVscGVyLCBvbkNvbnZlcnRGb3JNYXBFbnRyeSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgfQogIGlmIChlbnRyeSBpcyBGb3JNYXBFbnRyeSkgewogICAgRm9yRWxlbWVudCByZXN1bHQgPSBuZXcgRm9yRWxlbWVudCgKICAgICAgICBlbnRyeS52YXJpYWJsZXMsCiAgICAgICAgZW50cnkuY29uZGl0aW9uLAogICAgICAgIGVudHJ5LnVwZGF0ZXMsCiAgICAgICAgY29udmVydFRvRWxlbWVudChlbnRyeS5ib2R5LCBoZWxwZXIsIG9uQ29udmVydEZvck1hcEVudHJ5KSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICAgIG9uQ29udmVydEZvck1hcEVudHJ5KGVudHJ5LCByZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgIEZvckluRWxlbWVudCByZXN1bHQgPSBuZXcgRm9ySW5FbGVtZW50KAogICAgICAgIGVudHJ5LnZhcmlhYmxlLAogICAgICAgIGVudHJ5Lml0ZXJhYmxlLAogICAgICAgIGVudHJ5LnN5bnRoZXRpY0Fzc2lnbm1lbnQsCiAgICAgICAgZW50cnkuZXhwcmVzc2lvbkVmZmVjdHMsCiAgICAgICAgY29udmVydFRvRWxlbWVudChlbnRyeS5ib2R5LCBoZWxwZXIsIG9uQ29udmVydEZvck1hcEVudHJ5KSwKICAgICAgICBlbnRyeS5wcm9ibGVtLAogICAgICAgIGlzQXN5bmM6IGVudHJ5LmlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGVudHJ5LmZpbGVPZmZzZXQ7CiAgICBvbkNvbnZlcnRGb3JNYXBFbnRyeShlbnRyeSwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgdGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyksCiAgICBlbnRyeS5maWxlT2Zmc2V0LAogICAgMSwKICApOwp9Cgpib29sIGlzQ29udmVydGlibGVUb01hcEVudHJ5KEV4cHJlc3Npb24gZWxlbWVudCkgewogIGlmIChlbGVtZW50IGlzIFNwcmVhZEVsZW1lbnQpIHJldHVybiB0cnVlOwogIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgcmV0dXJuIGlzQ29udmVydGlibGVUb01hcEVudHJ5KGVsZW1lbnQudGhlbikgJiYKICAgICAgICAoZWxlbWVudC5vdGhlcndpc2UgPT0gbnVsbCB8fAogICAgICAgICAgICBpc0NvbnZlcnRpYmxlVG9NYXBFbnRyeShlbGVtZW50Lm90aGVyd2lzZSkpOwogIH0KICBpZiAoZWxlbWVudCBpcyBGb3JFbGVtZW50KSB7CiAgICByZXR1cm4gaXNDb252ZXJ0aWJsZVRvTWFwRW50cnkoZWxlbWVudC5ib2R5KTsKICB9CiAgaWYgKGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICByZXR1cm4gaXNDb252ZXJ0aWJsZVRvTWFwRW50cnkoZWxlbWVudC5ib2R5KTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gQ29udmVydCBbZWxlbWVudF0gdG8gYSBbTWFwRW50cnldLCBpZiBwb3NzaWJsZS4gSWYgW2VsZW1lbnRdIGNhbm5vdCBiZQovLy8gY29udmVydGVkIGFuIGVycm9yIHJlcG9ydGVkIHRocm91Z2ggW2hlbHBlcl0gYW5kIGEgbWFwIGVudHJ5IGhvbGRpbmcgYW4KLy8vIGludmFsaWQgZXhwcmVzc2lvbiBpcyByZXR1cm5lZC4KLy8vCi8vLyBbb25Db252ZXJ0Rm9yRWxlbWVudF0gaXMgY2FsbGVkIHdoZW4gYSBbRm9yRWxlbWVudF0gb3IgW0ZvckluRWxlbWVudF0gaXMKLy8vIGNvbnZlcnRlZCB0byBhIFtGb3JNYXBFbnRyeV0gb3IgW0ZvckluTWFwRW50cnldLCByZXNwZWN0aXZlbHkuCk1hcEVudHJ5IGNvbnZlcnRUb01hcEVudHJ5KEV4cHJlc3Npb24gZWxlbWVudCwgSW5mZXJlbmNlSGVscGVyIGhlbHBlciwKICAgIHZvaWQgb25Db252ZXJ0Rm9yRWxlbWVudChUcmVlTm9kZSBmcm9tLCBUcmVlTm9kZSB0bykpIHsKICBpZiAoZWxlbWVudCBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IFNwcmVhZE1hcEVudHJ5KGVsZW1lbnQuZXhwcmVzc2lvbiwgZWxlbWVudC5pc051bGxBd2FyZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgfQogIGlmIChlbGVtZW50IGlzIElmRWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBJZk1hcEVudHJ5KAogICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLAogICAgICAgIGNvbnZlcnRUb01hcEVudHJ5KGVsZW1lbnQudGhlbiwgaGVscGVyLCBvbkNvbnZlcnRGb3JFbGVtZW50KSwKICAgICAgICBlbGVtZW50Lm90aGVyd2lzZSA9PSBudWxsCiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICA6IGNvbnZlcnRUb01hcEVudHJ5KGVsZW1lbnQub3RoZXJ3aXNlLCBoZWxwZXIsIG9uQ29udmVydEZvckVsZW1lbnQpKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbGVtZW50LmZpbGVPZmZzZXQ7CiAgfQogIGlmIChlbGVtZW50IGlzIEZvckVsZW1lbnQpIHsKICAgIEZvck1hcEVudHJ5IHJlc3VsdCA9IG5ldyBGb3JNYXBFbnRyeSgKICAgICAgICBlbGVtZW50LnZhcmlhYmxlcywKICAgICAgICBlbGVtZW50LmNvbmRpdGlvbiwKICAgICAgICBlbGVtZW50LnVwZGF0ZXMsCiAgICAgICAgY29udmVydFRvTWFwRW50cnkoZWxlbWVudC5ib2R5LCBoZWxwZXIsIG9uQ29udmVydEZvckVsZW1lbnQpKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbGVtZW50LmZpbGVPZmZzZXQ7CiAgICBvbkNvbnZlcnRGb3JFbGVtZW50KGVsZW1lbnQsIHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBpZiAoZWxlbWVudCBpcyBGb3JJbkVsZW1lbnQpIHsKICAgIEZvckluTWFwRW50cnkgcmVzdWx0ID0gbmV3IEZvckluTWFwRW50cnkoCiAgICAgICAgZWxlbWVudC52YXJpYWJsZSwKICAgICAgICBlbGVtZW50Lml0ZXJhYmxlLAogICAgICAgIGVsZW1lbnQuc3ludGhldGljQXNzaWdubWVudCwKICAgICAgICBlbGVtZW50LmV4cHJlc3Npb25FZmZlY3RzLAogICAgICAgIGNvbnZlcnRUb01hcEVudHJ5KGVsZW1lbnQuYm9keSwgaGVscGVyLCBvbkNvbnZlcnRGb3JFbGVtZW50KSwKICAgICAgICBlbGVtZW50LnByb2JsZW0sCiAgICAgICAgaXNBc3luYzogZWxlbWVudC5pc0FzeW5jKQogICAgICAuLmZpbGVPZmZzZXQgPSBlbGVtZW50LmZpbGVPZmZzZXQ7CiAgICBvbkNvbnZlcnRGb3JFbGVtZW50KGVsZW1lbnQsIHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICByZXR1cm4gbmV3IE1hcEVudHJ5KAogICAgICBoZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc6JyksCiAgICAgICAgZWxlbWVudC5maWxlT2Zmc2V0LAogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiB3aGF0IGlzIHRoZSBsZW5ndGggb2YgdGhlIGV4cHJlc3Npb24/CiAgICAgICAgbm9MZW5ndGgsCiAgICAgICksCiAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0KQogICAgLi5maWxlT2Zmc2V0ID0gZWxlbWVudC5maWxlT2Zmc2V0Owp9CoJcAE5OPBsBIgEhCRIUHRIVExIdFBcTAUYBJQkbHBUVEQEaSAE4AUcBMARPTU9GKU0TDDZHBAEMRAEMOCYBS0IGT0U/TQIBL0EZFAFRBlAdGAE1HwQBDCUbBAEMJR4zIQYEAQwdPlEEAgEuPRgTGAE5HhkeBAEMJRoVGgQBDCUdMSAGGCcbBh0xIAYEAQxOGCYtPwYoHR0tOUsILwZAIQQCAS4+TChBEwFIIR4fGQQBDCUdGhsVBAEMJScdMSAGJRgnGwYEAQxOGCYtPwYoGUIlJxMEAgExQDcXMi8TJjgBRzcfHR0oJhkcBAE4NjcbASUZGSQiFRgEASUcLx8GHC8fBidFKgYlQSgGGCcbBhstHgYEAQxOGCYtPwYoQUQaIScTBAIBMAwXQgQBDCJCBAEMGUQEAQwkRAQBDDwCASdBGRQBTQZQHRYBNh8EAQwlGwQBDCUeMyEGBAIBJj0YERYBOh4ZHgQBDCUaFRoEAQwlHTEgBhgnGwYdMSAGBAIBJj5MKEERAUkhHh8ZBAEMJR0aGxUEAQwlJx0xIAYlGCcbBgQCASlANxcyLxEmOAFINxYiHR0oJhkcBAE4NjcbASUZGSQiFRgEASUcLx8GHC8fBidFKgYlQSgGGCcbBhstHgYEAgFKTg4EUEFEPSFCMgQdGhlEIBNPJwQeKBkZF0QnKRMEICwYGCMhRBcgJykTBB4vFgcFAgEzLR40JjkEHzIEITIEEAIBS0wkBE1DRzwiRzQEHhsbRiITUSkEHyobGxlGKSoTBCEuGholI0YZIikqEwQXGzgcQRIJOicCATNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NvbGxlY3Rpb25zLmRhcnRdZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2NvbnN0bmVzcy5kYXJ0gTIvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jb25zdG5lc3M7CgplbnVtIENvbnN0bmVzcyB7CiAgZXhwbGljaXRDb25zdCwKICBleHBsaWNpdE5ldywKICBpbXBsaWNpdCwKfQoNAE5OPAEZARERDwwCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NvbnN0bmVzcy5kYXJ0aGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9leHByZXNzaW9uX2dlbmVyYXRvci5kYXJ0wAJK6S8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gQSBsaWJyYXJ5IHRvIGhlbHAgZ2VuZXJhdGUgZXhwcmVzc2lvbi4KbGlicmFyeSBmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydCcKICAgIHNob3cgbGVuZ3RoRm9yVG9rZW4sIGxlbmd0aE9mU3BhbjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvaW52YWxpZF90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9wcmVmaXhfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0JzsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCc7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgYW1wZXJzYW5kTmFtZSwKICAgICAgICBiYXJOYW1lLAogICAgICAgIGNhbGxOYW1lLAogICAgICAgIGNhcmV0TmFtZSwKICAgICAgICBkaXZpc2lvbk5hbWUsCiAgICAgICAgZXF1YWxzTmFtZSwKICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgaW5kZXhTZXROYW1lLAogICAgICAgIGxlZnRTaGlmdE5hbWUsCiAgICAgICAgbGVuZ3RoTmFtZSwKICAgICAgICBtaW51c05hbWUsCiAgICAgICAgbXVsdGlwbHlOYW1lLAogICAgICAgIG11c3RhY2hlTmFtZSwKICAgICAgICBwZXJjZW50TmFtZSwKICAgICAgICBwbHVzTmFtZSwKICAgICAgICByaWdodFNoaWZ0TmFtZSwKICAgICAgICB0cmlwbGVTaGlmdE5hbWU7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAnLi4vc291cmNlL3N0YWNrX2xpc3RlbmVyX2ltcGwuZGFydCcgc2hvdyBvZmZzZXRGb3JUb2tlbjsKCmltcG9ydCAnYm9keV9idWlsZGVyLmRhcnQnIHNob3cgbm9Mb2NhdGlvbjsKCmltcG9ydCAnY29uc3RuZXNzLmRhcnQnIHNob3cgQ29uc3RuZXNzOwoKaW1wb3J0ICdleHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXIuZGFydCcgc2hvdyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyOwoKaW1wb3J0ICdmb3Jlc3QuZGFydCc7CgppbXBvcnQgJ2tlcm5lbF9hcGkuZGFydCcgc2hvdyBOYW1lU3lzdGVtLCBwcmludE5vZGVPbiwgcHJpbnRRdWFsaWZpZWROYW1lT247CgppbXBvcnQgJ2tlcm5lbF9hc3RfYXBpLmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgSW5pdGlhbGl6ZXIsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgTG9hZExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdpbnRlcm5hbF9hc3QuZGFydCc7CgovLy8gQSBnZW5lcmF0b3IgcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24gZm9yIHdoaWNoIHdlIGNhbid0IHlldCBidWlsZCBhbgovLy8gZXhwcmVzc2lvbiBiZWNhdXNlIHdlIGRvbid0IHlldCBrbm93IHRoZSBjb250ZXh0IGluIHdoaWNoIGl0J3MgdXNlZC4KLy8vCi8vLyBPbmNlIHRoZSBjb250ZXh0IGlzIGtub3duLCBhIGdlbmVyYXRvciBjYW4gYmUgY29udmVydGVkIGludG8gYW4gZXhwcmVzc2lvbgovLy8gYnkgY2FsbGluZyBhIGBidWlsZGAgbWV0aG9kLgovLy8KLy8vIEZvciBleGFtcGxlLCB3aGVuIGJ1aWxkaW5nIGEga2VybmVsIHJlcHJlc2VudGF0aW9uIGZvciBgYVt4XSA9IGJgLCBhZnRlcgovLy8gcGFyc2luZyBgYVt4XWAgYnV0IGJlZm9yZSBwYXJzaW5nIGA9IGJgLCB3ZSBkb24ndCB5ZXQga25vdyB3aGV0aGVyIHRvCi8vLyBnZW5lcmF0ZSBhbiBpbnZvY2F0aW9uIG9mIGBvcGVyYXRvcltdYCBvciBgb3BlcmF0b3JbXT1gLCBzbyB3ZSBjcmVhdGUgYQovLy8gW0dlbmVyYXRvcl0gb2JqZWN0LiAgTGF0ZXIsIGFmdGVyIGA9IGJgIGlzIHBhcnNlZCwgW2J1aWxkQXNzaWdubWVudF0gd2lsbAovLy8gYmUgY2FsbGVkLgphYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3IgewogIC8vLyBIZWxwZXIgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY29udGV4dHVhbCBpbmZvcm1hdGlvbi4KICBmaW5hbCBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIF9oZWxwZXI7CgogIC8vLyBBIHRva2VuIHRoYXQgZGVmaW5lcyBhIHBvc2l0aW9uIHN1YmV4cHJlc3Npb24gdGhhdCBiZWluZyBidWlsdC4KICBmaW5hbCBUb2tlbiB0b2tlbjsKCiAgZmluYWwgaW50IGZpbGVPZmZzZXQ7CgogIEdlbmVyYXRvcih0aGlzLl9oZWxwZXIsIHRoaXMudG9rZW4pIDogZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKCiAgLy8vIEVhc3kgYWNjZXNzIHRvIHRoZSBbRm9yZXN0XSBmYWN0b3J5IG9iamVjdC4KICBGb3Jlc3QgZ2V0IF9mb3Jlc3QgPT4gX2hlbHBlci5mb3Jlc3Q7CgogIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgdGhlIHNlbWFudGljIHByZWNpc2lvbiBvZiB0aGlzIHByb3BlcnR5IG9yCiAgLy8gcmVtb3ZlIGl0LiBJdCdzIHVuY2xlYXIgaWYgdGhlIHNlbWFudGljcyBpcyBpbmNvbnNpc3RlbnQuIEl0J3MgZm9yIGluc3RhbmNlCiAgLy8gdXNlZCBib3RoIGZvciB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIGluIFtWYXJpYWJsZVVzZUdlbmVyYXRvcl0gYW5kIGZvcgogIC8vIGBbXWAgaW4gW0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3JdLCBhbmQgd2hpbGUgdGhlIGZvcm1lciB0ZXh0IG9jY3VycyBpbiB0aGUKICAvLyB1bmRlcmx5aW5nIHNvdXJjZSBjb2RlLCB0aGUgbGF0dGVyIGRvZXNuJ3QuCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZDsKCiAgLy8vIEludGVybmFsIG5hbWUgdXNlZCBmb3IgZGVidWdnaW5nLgogIFN0cmluZyBnZXQgX2RlYnVnTmFtZTsKCiAgLy8vIFRoZSBzb3VyY2UgdXJpIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnaW5nLgogIFVyaSBnZXQgX3VyaSA9PiBfaGVscGVyLnVyaTsKCiAgLy8vIEJ1aWxkcyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSByZWFkIGZyb20gdGhlIGdlbmVyYXRvci4KICAvLy8KICAvLy8gVGhlIHJlYWQgb2YgdGhpcyBzdWJleHByZXNzaW9uIGRvZXMgX25vdF8gbmVlZCB0byBzdXBwb3J0IGEgc2ltdWx0YW5lb3VzCiAgLy8vIHdyaXRlIG9mIHRoZSBzYW1lIHN1YmV4cHJlc3Npb24uCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKTsKCiAgLy8vIEJ1aWxkcyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYW4gYXNzaWdubWVudCB3aXRoIHRoZSBnZW5lcmF0b3Igb24KICAvLy8gdGhlIExIUyBhbmQgW3ZhbHVlXSBvbiB0aGUgUkhTLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIGFzc2lnbmVkIHZhbHVlLCB1bmxlc3MKICAvLy8gW3ZvaWRDb250ZXh0XSBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGl0IG1heSBldmFsdWF0ZSB0byBhbnl0aGluZy4KICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KTsKCiAgLy8vIFJldHVybnMgYSBbRXhwcmVzc2lvbl0gcmVwcmVzZW50aW5nIGEgbnVsbC1hd2FyZSBhc3NpZ25tZW50IChgPz89YCkgd2l0aAogIC8vLyB0aGUgZ2VuZXJhdG9yIG9uIHRoZSBMSFMgYW5kIFt2YWx1ZV0gb24gdGhlIFJIUy4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRoZSBhc3NpZ25lZCB2YWx1ZSwgdW5sZXNzCiAgLy8vIFt2b2lkQ29udGV4dF0gaXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSBpdCBtYXkgZXZhbHVhdGUgdG8gYW55dGhpbmcuCiAgLy8vCiAgLy8vIFt0eXBlXSBpcyB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIFJIUy4KICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KTsKCiAgLy8vIFJldHVybnMgYSBbRXhwcmVzc2lvbl0gcmVwcmVzZW50aW5nIGEgY29tcG91bmQgYXNzaWdubWVudCAoZS5nLiBgKz1gKQogIC8vLyB3aXRoIHRoZSBnZW5lcmF0b3Igb24gdGhlIExIUyBhbmQgW3ZhbHVlXSBvbiB0aGUgUkhTLgogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pOwoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBwcmUtaW5jcmVtZW50IG9yIHByZS1kZWNyZW1lbnQgb2YKICAvLy8gdGhlIGdlbmVyYXRvci4KICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoCiAgICAgICAgYmluYXJ5T3BlcmF0b3IsIF9mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpLAogICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFdlIGFyZSBtaXNzaW5nIHNvbWUgdm9pZCBjb250ZXh0cyBoZXJlLiBGb3IKICAgICAgICAvLyBpbnN0YW5jZSBgKythPy5iO2AgaXMgbm90IHByb3ZpZGluZyBhIHZvaWQgY29udGV4dCBtYWtpbmcgaXQgZGVmYXVsdAogICAgICAgIC8vIGB0cnVlYC4KICAgICAgICB2b2lkQ29udGV4dDogdm9pZENvbnRleHQsCiAgICAgICAgaXNQcmVJbmNEZWM6IHRydWUpOwogIH0KCiAgLy8vIFJldHVybnMgYSBbRXhwcmVzc2lvbl0gcmVwcmVzZW50aW5nIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQgb2YKICAvLy8gdGhlIGdlbmVyYXRvci4KICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSk7CgogIC8vLyBSZXR1cm5zIGEgW0dlbmVyYXRvcl0gb3IgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhbiBpbmRleCBhY2Nlc3MKICAvLy8gKGUuZy4gYGFbYl1gKSB3aXRoIHRoZSBnZW5lcmF0b3Igb24gdGhlIHJlY2VpdmVyIGFuZCBbaW5kZXhdIGFzIHRoZQogIC8vLyBpbmRleCBleHByZXNzaW9uLgogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSk7CgogIC8vLyBSZXR1cm5zIGEgW0V4cHJlc3Npb25dIHJlcHJlc2VudGluZyBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAvLy8KICAvLy8gQXQgcnVudGltZSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkUmVhZCgpIHsKICAgIHJldHVybiBfaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoX2ZvcmVzdC5jcmVhdGVOdWxsTGl0ZXJhbChmaWxlT2Zmc2V0KSwKICAgICAgICBfcGxhaW5OYW1lRm9yUmVhZCwgX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNFbXB0eShub0xvY2F0aW9uKSwgZmlsZU9mZnNldCwKICAgICAgICBpc0dldHRlcjogdHJ1ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIFtFeHByZXNzaW9uXSByZXByZXNlbnRpbmcgYSBjb21waWxlLXRpbWUgZXJyb3Igd3JhcHBpbmcKICAvLy8gW3ZhbHVlXS4KICAvLy8KICAvLy8gQXQgcnVudGltZSwgW3ZhbHVlXSB3aWxsIGJlIGV2YWx1YXRlZCBiZWZvcmUgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIF9oZWxwZXIudGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICBfZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKGZpbGVPZmZzZXQpLAogICAgICAgIF9wbGFpbk5hbWVGb3JSZWFkLAogICAgICAgIF9mb3Jlc3QuY3JlYXRlQXJndW1lbnRzKG5vTG9jYXRpb24sIDxFeHByZXNzaW9uPlt2YWx1ZV0pLAogICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgaXNTZXR0ZXI6IHRydWUpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZEZvckVmZmVjdCgpID0+IGJ1aWxkU2ltcGxlUmVhZCgpOwoKICBMaXN0PEluaXRpYWxpemVyPiBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoTWFwPFN0cmluZywgaW50PiBpbml0aWFsaXplZEZpZWxkcykgewogICAgcmV0dXJuIDxJbml0aWFsaXplcj5bCiAgICAgIF9oZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBfaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICBtZXNzYWdlSW52YWxpZEluaXRpYWxpemVyLCBmaWxlT2Zmc2V0LCBsZW5ndGhGb3JUb2tlbih0b2tlbikpLAogICAgICAgICAgZmlsZU9mZnNldCkKICAgIF07CiAgfQoKICAvLy8gUmV0dXJucyBhbiBleHByZXNzaW9uLCBnZW5lcmF0b3Igb3IgaW5pdGlhbGl6ZXIgZm9yIGFuIGludm9jYXRpb24gb2YgdGhpcwogIC8vLyBzdWJleHByZXNzaW9uIHdpdGggW2FyZ3VtZW50c10gYXQgW29mZnNldF0uCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZToKICAvLy8gKiBJZiB0aGlzIGlzIGEgW1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSBmb3IgYGEuYmAsIHRoaXMgd2lsbCBjcmVhdGUKICAvLy8gICBhIFtNZXRob2RJbnZvY2F0aW9uXSBmb3IgYGEuYiguLi4pYC4KICAvLy8gKiBJZiB0aGlzIGlzIGEgW1RoaXNBY2Nlc3NHZW5lcmF0b3JdIGZvciBgdGhpc2AgaW4gYW4gaW5pdGlhbGl6ZXIgbGlzdCwKICAvLy8gICB0aGlzIHdpbGwgY3JlYXRlIGEgW1JlZGlyZWN0aW5nSW5pdGlhbGl6ZXJdIGZvciBgdGhpcyguLi4pYC4KICAvLy8gKiBJZiB0aGlzIGlzIGFuIFtJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3JdLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBlcnJvcgogIC8vLyAgIGdlbmVyYXRvciBpdHNlbGYuCiAgLy8vCiAgLy8vIElmIHRoZSBpbnZvY2F0aW9uIGhhcyBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cwogIC8vLyBbYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzXSBjYWxsZWQgaW5zdGVhZC4KICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yIHwgSW5pdGlhbGl6ZXIgKi8gZG9JbnZvY2F0aW9uKAogICAgICBpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKTsKCiAgLyogRXhwcmVzc2lvbiB8IEdlbmVyYXRvciAqLyBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIGlmIChzZW5kIGlzIFNlbmRBY2Nlc3NHZW5lcmF0b3IpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKGJ1aWxkU2ltcGxlUmVhZCgpLCBzZW5kLm5hbWUsCiAgICAgICAgICBzZW5kLmFyZ3VtZW50cywgb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksCiAgICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUsCiAgICAgICAgICBpc0NvbnN0YW50RXhwcmVzc2lvbjogc2VuZC5pc1BvdGVudGlhbGx5Q29uc3RhbnQpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9oZWxwZXIuY29uc3RhbnRDb250ZXh0ICE9IENvbnN0YW50Q29udGV4dC5ub25lICYmCiAgICAgICAgICBzZW5kLm5hbWUgIT0gbGVuZ3RoTmFtZSkgewogICAgICAgIF9oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIGZpbGVPZmZzZXQsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLm1ha2UoCiAgICAgICAgICBfaGVscGVyLCBzZW5kLnRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgc2VuZC5uYW1lLCBpc051bGxBd2FyZSk7CiAgICB9CiAgfQoKICAvKkV4cHJlc3Npb24gfCBHZW5lcmF0b3IqLyBidWlsZEVxdWFsc09wZXJhdGlvbihUb2tlbiB0b2tlbiwgRXhwcmVzc2lvbiByaWdodCwKICAgICAge2Jvb2wgaXNOb3R9KSB7CiAgICBhc3NlcnQoaXNOb3QgIT0gbnVsbCk7CiAgICByZXR1cm4gX2ZvcmVzdC5jcmVhdGVFcXVhbHMob2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBidWlsZFNpbXBsZVJlYWQoKSwgcmlnaHQsCiAgICAgICAgaXNOb3Q6IGlzTm90KTsKICB9CgogIC8qRXhwcmVzc2lvbiB8IEdlbmVyYXRvciovIGJ1aWxkQmluYXJ5T3BlcmF0aW9uKAogICAgICBUb2tlbiB0b2tlbiwgTmFtZSBiaW5hcnlOYW1lLCBFeHByZXNzaW9uIHJpZ2h0KSB7CiAgICByZXR1cm4gX2ZvcmVzdC5jcmVhdGVCaW5hcnkoCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4odG9rZW4pLCBidWlsZFNpbXBsZVJlYWQoKSwgYmluYXJ5TmFtZSwgcmlnaHQpOwogIH0KCiAgLypFeHByZXNzaW9uIHwgR2VuZXJhdG9yKi8gYnVpbGRVbmFyeU9wZXJhdGlvbihUb2tlbiB0b2tlbiwgTmFtZSB1bmFyeU5hbWUpIHsKICAgIHJldHVybiBfZm9yZXN0LmNyZWF0ZVVuYXJ5KAogICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwgdW5hcnlOYW1lLCBidWlsZFNpbXBsZVJlYWQoKSk7CiAgfQoKICAvLy8gUmV0dXJucyBhIFtUeXBlQnVpbGRlcl0gZm9yIHRoaXMgc3ViZXhwcmVzc2lvbiBpbnN0YW50aWF0ZWQgd2l0aCB0aGUKICAvLy8gdHlwZSBbYXJndW1lbnRzXS4gSWYgbm8gdHlwZSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIFthcmd1bWVudHNdIGlzIGBudWxsYC4KICAvLy8KICAvLy8gVGhlIHR5cGUgYXJndW1lbnRzIGhhdmUgbm90IGJlZW4gcmVzb2x2ZWQgYW5kIHNob3VsZCBiZSByZXNvbHZlZCB0bwogIC8vLyBjcmVhdGUgYSBbVHlwZUJ1aWxkZXJdIGZvciBhIHZhbGlkIHR5cGUuCiAgVHlwZUJ1aWxkZXIgYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKAogICAgICBOdWxsYWJpbGl0eUJ1aWxkZXIgbnVsbGFiaWxpdHlCdWlsZGVyLCBMaXN0PFVucmVzb2x2ZWRUeXBlPiBhcmd1bWVudHMpIHsKICAgIE5hbWVkVHlwZUJ1aWxkZXIgcmVzdWx0ID0KICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcih0b2tlbi5sZXhlbWUsIG51bGxhYmlsaXR5QnVpbGRlciwgbnVsbCk7CiAgICBNZXNzYWdlIG1lc3NhZ2UgPSB0ZW1wbGF0ZU5vdEFUeXBlLndpdGhBcmd1bWVudHModG9rZW4ubGV4ZW1lKTsKICAgIF9oZWxwZXIubGlicmFyeUJ1aWxkZXIKICAgICAgICAuYWRkUHJvYmxlbShtZXNzYWdlLCBmaWxlT2Zmc2V0LCBsZW5ndGhGb3JUb2tlbih0b2tlbiksIF91cmkpOwogICAgcmVzdWx0LmJpbmQocmVzdWx0LmJ1aWxkSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oX3VyaSwgZmlsZU9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gT2JqZWN0IHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRRdWFsaWZpZWRVc2VHZW5lcmF0b3IoX2hlbHBlciwgbmFtZSwgdGhpcywgZmFsc2UpOwogIH0KCiAgRXhwcmVzc2lvbiBpbnZva2VDb25zdHJ1Y3RvcigKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gbmFtZUxhc3RUb2tlbiwKICAgICAgQ29uc3RuZXNzIGNvbnN0bmVzcykgewogICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhc3NlcnQoX2ZvcmVzdC5hcmd1bWVudHNUeXBlQXJndW1lbnRzKGFyZ3VtZW50cykuaXNFbXB0eSk7CiAgICAgIF9mb3Jlc3QuYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50cygKICAgICAgICAgIGFyZ3VtZW50cywgX2hlbHBlci5idWlsZERhcnRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpKTsKICAgIH0KICAgIHJldHVybiBfaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgX2ZvcmVzdC5jcmVhdGVOdWxsTGl0ZXJhbChmaWxlT2Zmc2V0KSwKICAgICAgICBfaGVscGVyLmNvbnN0cnVjdG9yTmFtZUZvckRpYWdub3N0aWNzKG5hbWUsCiAgICAgICAgICAgIGNsYXNzTmFtZTogX3BsYWluTmFtZUZvclJlYWQpLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBuYW1lVG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJ1ZmZlci53cml0ZShfZGVidWdOYW1lKTsKICAgIGJ1ZmZlci53cml0ZSgiKG9mZnNldDogIik7CiAgICBidWZmZXIud3JpdGUoIiR7ZmlsZU9mZnNldH0iKTsKICAgIHByaW50T24oYnVmZmVyKTsKICAgIGJ1ZmZlci53cml0ZSgiKSIpOwogICAgcmV0dXJuICIkYnVmZmVyIjsKICB9Cn0KCi8vLyBbVmFyaWFibGVVc2VHZW5lcmF0b3JdIHJlcHJlc2VudHMgdGhlIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzIGEKLy8vIGxvY2FsIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBuYW1lLgovLy8KLy8vIEZvciBpbnN0YW5jZToKLy8vCi8vLyAgIG1ldGhvZChhKSB7Ci8vLyAgICAgdmFyIGI7Ci8vLyAgICAgYTsgICAgICAgICAvLyBhIFZhcmlhYmxlVXNlR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhYC4KLy8vICAgICBiID0gYVtdOyAgIC8vIGEgVmFyaWFibGVVc2VHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGFgIGFuZCBgYmAuCi8vLyAgICAgYigpOyAgICAgICAvLyBhIFZhcmlhYmxlVXNlR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBiYC4KLy8vICAgICBiLmMgPSBhLmQ7IC8vIGEgVmFyaWFibGVVc2VHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGFgIGFuZCBgYmAuCi8vLyAgIH0KLy8vCi8vLyBJZiB0aGUgdmFyaWFibGUgaXMgZmluYWwgb3IgcmVhZC1vbmx5IChsaWtlIGEgcGFyYW1ldGVyIGluIGEgY2F0Y2ggY2xhdXNlKSBhCi8vLyBbUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3JdIGlzIGNyZWF0ZWQgaW5zdGVhZC4KY2xhc3MgVmFyaWFibGVVc2VHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CgogIGZpbmFsIERhcnRUeXBlIHByb21vdGVkVHlwZTsKCiAgVmFyaWFibGVVc2VHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy52YXJpYWJsZSwKICAgICAgW3RoaXMucHJvbW90ZWRUeXBlXSkKICAgICAgOiBhc3NlcnQodmFyaWFibGUuaXNBc3NpZ25hYmxlLCAnVmFyaWFibGUgJHZhcmlhYmxlIGlzIG5vdCBhc3NpZ25hYmxlJyksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiVmFyaWFibGVVc2VHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IHZhcmlhYmxlLm5hbWU7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIF9jcmVhdGVSZWFkKCk7CiAgfQoKICBFeHByZXNzaW9uIF9jcmVhdGVSZWFkKCkgewogICAgcmV0dXJuIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIGZpbGVPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCB2YWx1ZSk7CiAgfQoKICBFeHByZXNzaW9uIF9jcmVhdGVXcml0ZShpbnQgb2Zmc2V0LCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICBfaGVscGVyLnJlZ2lzdGVyVmFyaWFibGVBc3NpZ25tZW50KHZhcmlhYmxlKTsKICAgIHJldHVybiBuZXcgVmFyaWFibGVTZXQodmFyaWFibGUsIHZhbHVlKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRJZk51bGxBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gcmVhZCA9IF9jcmVhdGVSZWFkKCk7CiAgICBFeHByZXNzaW9uIHdyaXRlID0gX2NyZWF0ZVdyaXRlKGZpbGVPZmZzZXQsIHZhbHVlKTsKICAgIHJldHVybiBuZXcgSWZOdWxsU2V0KHJlYWQsIHdyaXRlLCBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0KQogICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0CiAgICAgICAgLmNyZWF0ZUJpbmFyeShvZmZzZXQsIF9jcmVhdGVSZWFkKCksIGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSk7CiAgICByZXR1cm4gX2NyZWF0ZVdyaXRlKGZpbGVPZmZzZXQsIGJpbmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gX2ZvcmVzdC5jcmVhdGVJbnRMaXRlcmFsKG9mZnNldCwgMSk7CiAgICBpZiAodm9pZENvbnRleHQpIHsKICAgICAgcmV0dXJuIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogb2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQsIGlzUG9zdEluY0RlYzogdHJ1ZSk7CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWQgPQogICAgICAgIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShfY3JlYXRlUmVhZCgpKTsKICAgIEV4cHJlc3Npb24gYmluYXJ5ID0gX2hlbHBlci5mb3Jlc3QuY3JlYXRlQmluYXJ5KG9mZnNldCwKICAgICAgICBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHJlYWQsIGZpbGVPZmZzZXQpLCBiaW5hcnlPcGVyYXRvciwgdmFsdWUpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB3cml0ZSA9IF9oZWxwZXIuZm9yZXN0CiAgICAgICAgLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShfY3JlYXRlV3JpdGUob2Zmc2V0LCBiaW5hcnkpKTsKICAgIHJldHVybiBuZXcgTG9jYWxQb3N0SW5jRGVjKHJlYWQsIHdyaXRlKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLmZvcmVzdC5jcmVhdGVFeHByZXNzaW9uSW52b2NhdGlvbigKICAgICAgICBhZGp1c3RGb3JJbXBsaWNpdENhbGwoX3BsYWluTmFtZUZvclJlYWQsIG9mZnNldCksCiAgICAgICAgYnVpbGRTaW1wbGVSZWFkKCksCiAgICAgICAgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCB2YXJpYWJsZTogIik7CiAgICBwcmludE5vZGVPbih2YXJpYWJsZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgcHJvbW90ZWRUeXBlOiAiKTsKICAgIHByaW50Tm9kZU9uKHByb21vdGVkVHlwZSwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCi8vLyBBIFtQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcl0gcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzCi8vLyBhbiBleHBsaWNpdCBwcm9wZXJ0eSBhY2Nlc3MuCi8vLwovLy8gRm9yIGluc3RhbmNlCi8vLwovLy8gICBtZXRob2QoYSkgewovLy8gICAgIGEuYjsgICAgICAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICAgIGEuYigpOyAgICAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICAgIGEuYiA9IGM7ICAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICAgIGEuYiArPSBjOyAvLyBhIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhLmJgLgovLy8gICB9Ci8vLwovLy8gSWYgdGhlIHJlY2VpdmVyIGlzIGB0aGlzYCwgYSBbVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSBpcyBjcmVhdGVkCi8vLyBpbnN0ZWFkLiBJZiB0aGUgYWNjZXNzIGlzIG51bGwtYXdhcmUsIGUuZy4gYGE/LmJgLCBhCi8vLyBbTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JdIGlzIGNyZWF0ZWQgaW5zdGVhZC4KY2xhc3MgUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIC8vLyBUaGUgcmVjZWl2ZXIgZXhwcmVzc2lvbi4gYGFgIGluIHRoZSBleGFtcGxlcyBpbiB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbi4KICBmaW5hbCBFeHByZXNzaW9uIHJlY2VpdmVyOwoKICAvLy8gVGhlIG5hbWUgZm9yIHRoZSBhY2Nlc3NlZCBwcm9wZXJ0eS4gYGJgIGluIHRoZSBleGFtcGxlcyBpbiB0aGUgY2xhc3MKICAvLy8gZG9jdW1lbnRhdGlvbi4KICBmaW5hbCBOYW1lIG5hbWU7CgogIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24ocmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCByZWNlaXZlcjogIik7CiAgICBwcmludE5vZGVPbihyZWNlaXZlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgbmFtZTogIik7CiAgICBzaW5rLndyaXRlKG5hbWUubmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBfZm9yZXN0LmNyZWF0ZVByb3BlcnR5R2V0KGZpbGVPZmZzZXQsIHJlY2VpdmVyLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfaGVscGVyLmZvcmVzdC5jcmVhdGVQcm9wZXJ0eVNldChmaWxlT2Zmc2V0LCByZWNlaXZlciwgbmFtZSwgdmFsdWUsCiAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dCA9IGZhbHNlfSkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgIFByb3BlcnR5R2V0IHJlYWQgPSBfZm9yZXN0LmNyZWF0ZVByb3BlcnR5R2V0KAogICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgcmVjZWl2ZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpLAogICAgICAgIG5hbWUpOwogICAgUHJvcGVydHlTZXQgd3JpdGUgPSBfaGVscGVyLmZvcmVzdC5jcmVhdGVQcm9wZXJ0eVNldCgKICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIGZvck51bGxHdWFyZGVkQWNjZXNzOiB0cnVlKSwKICAgICAgICBuYW1lLAogICAgICAgIHZhbHVlLAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQpOwogICAgcmV0dXJuIG5ldyBJZk51bGxQcm9wZXJ0eVNldCh2YXJpYWJsZSwgcmVhZCwgd3JpdGUsIGZvckVmZmVjdDogdm9pZENvbnRleHQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgQ29tcG91bmRQcm9wZXJ0eVNldChyZWNlaXZlciwgbmFtZSwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQsCiAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogZmFsc2UsCiAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBiaW5hcnlPZmZzZXQ6IG9mZnNldCwKICAgICAgICB3cml0ZU9mZnNldDogZmlsZU9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dCA9IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IF9mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpOwogICAgaWYgKHZvaWRDb250ZXh0KSB7CiAgICAgIHJldHVybiBidWlsZENvbXBvdW5kQXNzaWdubWVudChiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0LCBpc1Bvc3RJbmNEZWM6IHRydWUpOwogICAgfQogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZCA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZSgKICAgICAgICBfZm9yZXN0LmNyZWF0ZVByb3BlcnR5R2V0KGZpbGVPZmZzZXQsCiAgICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQpLCBuYW1lKSk7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeShvZmZzZXQsCiAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldChyZWFkLCBmaWxlT2Zmc2V0KSwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGUgPSBfaGVscGVyLmZvcmVzdAogICAgICAgIC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUoX2hlbHBlci5mb3Jlc3QuY3JlYXRlUHJvcGVydHlTZXQoCiAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQpLAogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBiaW5hcnksCiAgICAgICAgICAgIGZvckVmZmVjdDogdHJ1ZSkpOwogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVBvc3RJbmNEZWModmFyaWFibGUsIHJlYWQsIHdyaXRlKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0dlbmVyYXRvcl0gZm9yIHRoZSBhY2Nlc3Mgb2YgcHJvcGVydHkgW25hbWVdIG9uIFtyZWNlaXZlcl0uCiAgc3RhdGljIEdlbmVyYXRvciBtYWtlKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICBpZiAoaGVscGVyLmZvcmVzdC5pc1RoaXNFeHByZXNzaW9uKHJlY2VpdmVyKSkgewogICAgICByZXR1cm4gbmV3IFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCBuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpc051bGxBd2FyZQogICAgICAgICAgPyBuZXcgTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgcmVjZWl2ZXIsIG5hbWUpCiAgICAgICAgICA6IG5ldyBQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCByZWNlaXZlciwgbmFtZSk7CiAgICB9CiAgfQp9CgovLy8gQSBbVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSByZXByZXNlbnRzIGEgc3ViZXhwcmVzc2lvbiB3aG9zZSBwcmVmaXggaXMKLy8vIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IGFjY2VzcyBvbiBgdGhpc2AuCi8vLwovLy8gRm9yIGluc3RhbmNlCi8vLwovLy8gICBjbGFzcyBDIHsKLy8vICAgICB2YXIgYjsKLy8vICAgICBtZXRob2QoKSB7Ci8vLyAgICAgICBiOyAgICAgICAgICAgLy8gYSBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGJgLgovLy8gICAgICAgYigpOyAgICAgICAgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBiYC4KLy8vICAgICAgIGIgPSBjOyAgICAgICAvLyBhIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYmAuCi8vLyAgICAgICBiICs9IGM7ICAgICAgLy8gYSBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGJgLgovLy8gICAgICAgdGhpcy5iOyAgICAgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgICAgdGhpcy5iKCk7ICAgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgICAgdGhpcy5iID0gYzsgIC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgICAgdGhpcy5iICs9IGM7IC8vIGEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzLmJgLgovLy8gICAgIH0KLy8vICAgfQovLy8KLy8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgW1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSB0byBhdm9pZCBjcmVhdGluZyBhbgovLy8gaW5kaXJlY3QgYWNjZXNzIHRvICd0aGlzJyBpbiBmb3IgaW5zdGFuY2UgYHRoaXMuYiArPSBjYCB3aGljaCBieQovLy8gW1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yXSB3b3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBhcwovLy8KLy8vICAgICBsZXQgIzEgPSB0aGlzIGluICMuYiA9ICMuYiArIGMKLy8vCi8vLyBpbnN0ZWFkIG9mCi8vLwovLy8gICAgIHRoaXMuYiA9IHRoaXMuYiArIGMKLy8vCmNsYXNzIFRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgLy8vIFRoZSBuYW1lIGZvciB0aGUgYWNjZXNzZWQgcHJvcGVydHkuIGBiYCBpbiB0aGUgZXhhbXBsZXMgaW4gdGhlIGNsYXNzCiAgLy8vIGRvY3VtZW50YXRpb24uCiAgZmluYWwgTmFtZSBuYW1lOwoKICBUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5uYW1lKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlRoaXNQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBfY3JlYXRlUmVhZCgpOwogIH0KCiAgRXhwcmVzc2lvbiBfY3JlYXRlUmVhZCgpIHsKICAgIHJldHVybiBfZm9yZXN0LmNyZWF0ZVByb3BlcnR5R2V0KAogICAgICAgIGZpbGVPZmZzZXQsIF9mb3Jlc3QuY3JlYXRlVGhpc0V4cHJlc3Npb24oZmlsZU9mZnNldCksIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCB2YWx1ZSwgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCk7CiAgfQoKICBFeHByZXNzaW9uIF9jcmVhdGVXcml0ZShpbnQgb2Zmc2V0LCBFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCBmb3JFZmZlY3R9KSB7CiAgICByZXR1cm4gX2hlbHBlci5mb3Jlc3QuY3JlYXRlUHJvcGVydHlTZXQoCiAgICAgICAgZmlsZU9mZnNldCwgX2ZvcmVzdC5jcmVhdGVUaGlzRXhwcmVzc2lvbihmaWxlT2Zmc2V0KSwgbmFtZSwgdmFsdWUsCiAgICAgICAgZm9yRWZmZWN0OiBmb3JFZmZlY3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBJZk51bGxTZXQoCiAgICAgICAgX2NyZWF0ZVJlYWQoKSwgX2NyZWF0ZVdyaXRlKG9mZnNldCwgdmFsdWUsIGZvckVmZmVjdDogdm9pZENvbnRleHQpLAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeSgKICAgICAgICBvZmZzZXQsCiAgICAgICAgX2ZvcmVzdC5jcmVhdGVQcm9wZXJ0eUdldCgKICAgICAgICAgICAgZmlsZU9mZnNldCwgX2ZvcmVzdC5jcmVhdGVUaGlzRXhwcmVzc2lvbihmaWxlT2Zmc2V0KSwgbmFtZSksCiAgICAgICAgYmluYXJ5T3BlcmF0b3IsCiAgICAgICAgdmFsdWUpOwogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBfaGVscGVyLmZvcmVzdC5jcmVhdGVCaW5hcnkoCiAgICAgICAgb2Zmc2V0LAogICAgICAgIF9mb3Jlc3QuY3JlYXRlUHJvcGVydHlHZXQoCiAgICAgICAgICAgIGZpbGVPZmZzZXQsIF9mb3Jlc3QuY3JlYXRlVGhpc0V4cHJlc3Npb24oZmlsZU9mZnNldCksIG5hbWUpLAogICAgICAgIGJpbmFyeU9wZXJhdG9yLAogICAgICAgIHZhbHVlKTsKICAgIHJldHVybiBfY3JlYXRlV3JpdGUoZmlsZU9mZnNldCwgYmluYXJ5LCBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBfZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0LCAxKTsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwgaXNQb3N0SW5jRGVjOiB0cnVlKTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZCA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZSgKICAgICAgICBfZm9yZXN0LmNyZWF0ZVByb3BlcnR5R2V0KAogICAgICAgICAgICBmaWxlT2Zmc2V0LCBfZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpLCBuYW1lKSk7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeShvZmZzZXQsCiAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldChyZWFkLCBmaWxlT2Zmc2V0KSwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGUgPSBfaGVscGVyLmZvcmVzdAogICAgICAgIC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUoCiAgICAgICAgICAgIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCBiaW5hcnksIGZvckVmZmVjdDogdHJ1ZSkpOwogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVBvc3RJbmNEZWMub25SZWFkT25seShyZWFkLCB3cml0ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgX2ZvcmVzdC5jcmVhdGVUaGlzRXhwcmVzc2lvbihmaWxlT2Zmc2V0KSwgbmFtZSwgYXJndW1lbnRzLCBvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICB9Cn0KCmNsYXNzIE51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyOwoKICBmaW5hbCBFeHByZXNzaW9uIHJlY2VpdmVyRXhwcmVzc2lvbjsKCiAgZmluYWwgTmFtZSBuYW1lOwoKICBOdWxsQXdhcmVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sIHRoaXMucmVjZWl2ZXJFeHByZXNzaW9uLCB0aGlzLm5hbWUpCiAgICAgIDogdGhpcy5yZWNlaXZlciA9CiAgICAgICAgICAgIGhlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyRXhwcmVzc2lvbiksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiTnVsbEF3YXJlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIHJlY2VpdmVyQWNjZXNzKCkgPT4gbmV3IFZhcmlhYmxlR2V0KHJlY2VpdmVyKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiBuYW1lLm5hbWU7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyRXhwcmVzc2lvbik7CiAgICBQcm9wZXJ0eUdldCByZWFkID0gX2ZvcmVzdC5jcmVhdGVQcm9wZXJ0eUdldCgKICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyRXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSksCiAgICAgICAgbmFtZSk7CiAgICByZXR1cm4gbmV3IE51bGxBd2FyZVByb3BlcnR5R2V0KHZhcmlhYmxlLCByZWFkKQogICAgICAuLmZpbGVPZmZzZXQgPSByZWNlaXZlckV4cHJlc3Npb24uZmlsZU9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0KICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXJFeHByZXNzaW9uKTsKICAgIFByb3BlcnR5U2V0IHJlYWQgPSBfaGVscGVyLmZvcmVzdC5jcmVhdGVQcm9wZXJ0eVNldCgKICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyRXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSksCiAgICAgICAgbmFtZSwKICAgICAgICB2YWx1ZSwKICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgIHJlYWRPbmx5UmVjZWl2ZXI6IHRydWUpOwogICAgcmV0dXJuIG5ldyBOdWxsQXdhcmVQcm9wZXJ0eVNldCh2YXJpYWJsZSwgcmVhZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gcmVjZWl2ZXJFeHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IE51bGxBd2FyZUlmTnVsbFNldChyZWNlaXZlckV4cHJlc3Npb24sIG5hbWUsIHZhbHVlLAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQsCiAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICB0ZXN0T2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgd3JpdGVPZmZzZXQ6IGZpbGVPZmZzZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgTnVsbEF3YXJlQ29tcG91bmRTZXQoCiAgICAgICAgcmVjZWl2ZXJFeHByZXNzaW9uLCBuYW1lLCBiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBiaW5hcnlPZmZzZXQ6IG9mZnNldCwKICAgICAgICB3cml0ZU9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgIGZvclBvc3RJbmNEZWM6IGlzUG9zdEluY0RlYyk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KAogICAgICAgIGJpbmFyeU9wZXJhdG9yLCBfZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0LCAxKSwKICAgICAgICBvZmZzZXQ6IG9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0LCBpc1Bvc3RJbmNEZWM6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJkb0ludm9jYXRpb24iLCBvZmZzZXQsIF91cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIHJlY2VpdmVyOiAiKTsKICAgIHByaW50Tm9kZU9uKHJlY2VpdmVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCByZWNlaXZlckV4cHJlc3Npb246ICIpOwogICAgcHJpbnROb2RlT24ocmVjZWl2ZXJFeHByZXNzaW9uLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICB9Cn0KCmNsYXNzIFN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIGZpbmFsIE5hbWUgbmFtZTsKCiAgZmluYWwgTWVtYmVyIGdldHRlcjsKCiAgZmluYWwgTWVtYmVyIHNldHRlcjsKCiAgU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMubmFtZSwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlN1cGVyUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IG5hbWUubmFtZTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gX2NyZWF0ZVJlYWQoKTsKICB9CgogIEV4cHJlc3Npb24gX2NyZWF0ZVJlYWQoKSB7CiAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgX2hlbHBlci53YXJuVW5yZXNvbHZlZEdldChuYW1lLCBmaWxlT2Zmc2V0LCBpc1N1cGVyOiB0cnVlKTsKICAgIH0KICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eUdldChuYW1lLCBnZXR0ZXIpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICByZXR1cm4gX2NyZWF0ZVdyaXRlKGZpbGVPZmZzZXQsIHZhbHVlKTsKICB9CgogIEV4cHJlc3Npb24gX2NyZWF0ZVdyaXRlKGludCBvZmZzZXQsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgewogICAgICBfaGVscGVyLndhcm5VbnJlc29sdmVkU2V0KG5hbWUsIG9mZnNldCwgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICBTdXBlclByb3BlcnR5U2V0IHdyaXRlID0gbmV3IFN1cGVyUHJvcGVydHlTZXQobmFtZSwgdmFsdWUsIHNldHRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0ID0gZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWMgPSBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWMgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gYmluYXJ5ID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlQmluYXJ5KG9mZnNldCwgX2NyZWF0ZVJlYWQoKSwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlKTsKICAgIHJldHVybiBfY3JlYXRlV3JpdGUoZmlsZU9mZnNldCwgYmluYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBfZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0LCAxKTsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwgaXNQb3N0SW5jRGVjOiB0cnVlKTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZCA9CiAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKF9jcmVhdGVSZWFkKCkpOwogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBfaGVscGVyLmZvcmVzdC5jcmVhdGVCaW5hcnkob2Zmc2V0LAogICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQocmVhZCwgZmlsZU9mZnNldCksIGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCBiaW5hcnkpKTsKICAgIHJldHVybiBuZXcgU3RhdGljUG9zdEluY0RlYyhyZWFkLCB3cml0ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IElmTnVsbFNldChfY3JlYXRlUmVhZCgpLCBfY3JlYXRlV3JpdGUoZmlsZU9mZnNldCwgdmFsdWUpLAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChfaGVscGVyLmNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSkgewogICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBGaXggdGhlIGxlbmd0aAogICAgICBfaGVscGVyLmFkZFByb2JsZW0obWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIG9mZnNldCwgMSk7CiAgICB9CiAgICBpZiAoZ2V0dGVyID09IG51bGwgfHwgaXNGaWVsZE9yR2V0dGVyKGdldHRlcikpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuZm9yZXN0CiAgICAgICAgICAuY3JlYXRlRXhwcmVzc2lvbkludm9jYXRpb24ob2Zmc2V0LCBidWlsZFNpbXBsZVJlYWQoKSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oYWhlKTogVGhpcyBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZSAic3VwZXIucHJvcGVydHkoLi4uKSIgd2hlcmUKICAgICAgLy8gcHJvcGVydHkgaXMgYSBzZXR0ZXIuCiAgICAgIHJldHVybiB1bmhhbmRsZWQoIiR7Z2V0dGVyLnJ1bnRpbWVUeXBlfSIsICJkb0ludm9jYXRpb24iLCBvZmZzZXQsIF91cmkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogICAgc2luay53cml0ZSgiLCBnZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oZ2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBzZXR0ZXI6ICIpOwogICAgcHJpbnRRdWFsaWZpZWROYW1lT24oc2V0dGVyLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKY2xhc3MgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgZmluYWwgRXhwcmVzc2lvbiBpbmRleDsKCiAgZmluYWwgYm9vbCBpc051bGxBd2FyZTsKCiAgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLnJlY2VpdmVyLCB0aGlzLmluZGV4LAogICAgICB7dGhpcy5pc051bGxBd2FyZX0pCiAgICAgIDogYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpLAogICAgICAgIHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXJWYWx1ZTsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICB2YXJpYWJsZSA9IF9mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIGZpbGVPZmZzZXQsCiAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlclZhbHVlID0gcmVjZWl2ZXI7CiAgICB9CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9CiAgICAgICAgX2ZvcmVzdC5jcmVhdGVJbmRleEdldChmaWxlT2Zmc2V0LCByZWNlaXZlclZhbHVlLCBpbmRleCk7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgcmVzdWx0ID0gbmV3IE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24odmFyaWFibGUsIHJlc3VsdCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyVmFsdWU7CiAgICBib29sIHJlYWRPbmx5UmVjZWl2ZXI7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgdmFyaWFibGUgPSBfZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShyZWNlaXZlcik7CiAgICAgIHJlY2VpdmVyVmFsdWUgPSBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlLCBmaWxlT2Zmc2V0LAogICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpOwogICAgICByZWFkT25seVJlY2VpdmVyID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlcjsKICAgICAgcmVhZE9ubHlSZWNlaXZlciA9IGZhbHNlOwogICAgfQogICAgRXhwcmVzc2lvbiByZXN1bHQgPSBfZm9yZXN0LmNyZWF0ZUluZGV4U2V0KAogICAgICAgIGZpbGVPZmZzZXQsIHJlY2VpdmVyVmFsdWUsIGluZGV4LCB2YWx1ZSwKICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LCByZWFkT25seVJlY2VpdmVyOiByZWFkT25seVJlY2VpdmVyKTsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICByZXN1bHQgPSBuZXcgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbih2YXJpYWJsZSwgcmVzdWx0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXJWYWx1ZTsKICAgIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICB2YXJpYWJsZSA9IF9mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIGZpbGVPZmZzZXQsCiAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSk7CiAgICAgIHJlYWRPbmx5UmVjZWl2ZXIgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyOwogICAgICByZWFkT25seVJlY2VpdmVyID0gZmFsc2U7CiAgICB9CgogICAgRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSWZOdWxsSW5kZXhTZXQocmVjZWl2ZXJWYWx1ZSwgaW5kZXgsIHZhbHVlLAogICAgICAgIHJlYWRPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgdGVzdE9mZnNldDogb2Zmc2V0LAogICAgICAgIHdyaXRlT2Zmc2V0OiBmaWxlT2Zmc2V0LAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQsCiAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogcmVhZE9ubHlSZWNlaXZlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBOdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uKHZhcmlhYmxlLCByZXN1bHQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwogICAgRXhwcmVzc2lvbiByZWNlaXZlclZhbHVlOwogICAgYm9vbCByZWFkT25seVJlY2VpdmVyOwogICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgIHZhcmlhYmxlID0gX2ZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZWNlaXZlclZhbHVlID0gX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgZmlsZU9mZnNldCwKICAgICAgICAgIGZvck51bGxHdWFyZGVkQWNjZXNzOiB0cnVlKTsKICAgICAgcmVhZE9ubHlSZWNlaXZlciA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlclZhbHVlID0gcmVjZWl2ZXI7CiAgICAgIHJlYWRPbmx5UmVjZWl2ZXIgPSBmYWxzZTsKICAgIH0KCiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBDb21wb3VuZEluZGV4U2V0KAogICAgICAgIHJlY2VpdmVyVmFsdWUsIGluZGV4LCBiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBiaW5hcnlPZmZzZXQ6IG9mZnNldCwKICAgICAgICB3cml0ZU9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgIGZvclBvc3RJbmNEZWM6IGlzUG9zdEluY0RlYywKICAgICAgICByZWFkT25seVJlY2VpdmVyOiByZWFkT25seVJlY2VpdmVyKTsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICByZXN1bHQgPSBuZXcgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbih2YXJpYWJsZSwgcmVzdWx0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dCA9IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IF9mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpOwogICAgcmV0dXJuIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSwKICAgICAgICBvZmZzZXQ6IG9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0LCBpc1Bvc3RJbmNEZWM6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25JbnZvY2F0aW9uKAogICAgICAgIGFyZ3VtZW50cy5maWxlT2Zmc2V0LCBidWlsZFNpbXBsZVJlYWQoKSwgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCByZWNlaXZlcjogIik7CiAgICBwcmludE5vZGVPbihyZWNlaXZlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgaW5kZXg6ICIpOwogICAgcHJpbnROb2RlT24oaW5kZXgsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIGlzTnVsbEF3YXJlOiAke2lzTnVsbEF3YXJlfSIpOwogIH0KCiAgc3RhdGljIEdlbmVyYXRvciBtYWtlKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBpbmRleCwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICBpZiAoaGVscGVyLmZvcmVzdC5pc1RoaXNFeHByZXNzaW9uKHJlY2VpdmVyKSkgewogICAgICByZXR1cm4gbmV3IFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yKGhlbHBlciwgdG9rZW4sIGluZGV4KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihoZWxwZXIsIHRva2VuLCByZWNlaXZlciwgaW5kZXgsCiAgICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogICAgfQogIH0KfQoKLy8vIFNwZWNpYWwgY2FzZSBvZiBbSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcl0gdG8gYXZvaWQgY3JlYXRpbmcgYW4gaW5kaXJlY3QKLy8vIGFjY2VzcyB0byAndGhpcycuCmNsYXNzIFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBFeHByZXNzaW9uIGluZGV4OwoKICBUaGlzSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLmluZGV4KQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIgPSBfaGVscGVyLmZvcmVzdC5jcmVhdGVUaGlzRXhwcmVzc2lvbihmaWxlT2Zmc2V0KTsKICAgIHJldHVybiBfZm9yZXN0LmNyZWF0ZUluZGV4R2V0KGZpbGVPZmZzZXQsIHJlY2VpdmVyLCBpbmRleCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyID0gX2hlbHBlci5mb3Jlc3QuY3JlYXRlVGhpc0V4cHJlc3Npb24oZmlsZU9mZnNldCk7CiAgICByZXR1cm4gX2ZvcmVzdC5jcmVhdGVJbmRleFNldChmaWxlT2Zmc2V0LCByZWNlaXZlciwgaW5kZXgsIHZhbHVlLAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQsIHJlYWRPbmx5UmVjZWl2ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiByZWNlaXZlciA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpOwogICAgcmV0dXJuIG5ldyBJZk51bGxJbmRleFNldChyZWNlaXZlciwgaW5kZXgsIHZhbHVlLAogICAgICAgIHJlYWRPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgdGVzdE9mZnNldDogb2Zmc2V0LAogICAgICAgIHdyaXRlT2Zmc2V0OiBmaWxlT2Zmc2V0LAogICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQsCiAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogdHJ1ZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiByZWNlaXZlciA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpOwogICAgcmV0dXJuIG5ldyBDb21wb3VuZEluZGV4U2V0KHJlY2VpdmVyLCBpbmRleCwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgIHJlYWRPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgYmluYXJ5T2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgd3JpdGVPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCwKICAgICAgICBmb3JQb3N0SW5jRGVjOiBpc1Bvc3RJbmNEZWMsCiAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gX2ZvcmVzdC5jcmVhdGVJbnRMaXRlcmFsKG9mZnNldCwgMSk7CiAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgIG9mZnNldDogb2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQsIGlzUG9zdEluY0RlYzogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlRXhwcmVzc2lvbkludm9jYXRpb24ob2Zmc2V0LCBidWlsZFNpbXBsZVJlYWQoKSwgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBpbmRleDogIik7CiAgICBwcmludE5vZGVPbihpbmRleCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCmNsYXNzIFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgRXhwcmVzc2lvbiBpbmRleDsKCiAgZmluYWwgTWVtYmVyIGdldHRlcjsKCiAgZmluYWwgTWVtYmVyIHNldHRlcjsKCiAgU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5pbmRleCwgdGhpcy5nZXR0ZXIsIHRoaXMuc2V0dGVyKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICBpZiAoZ2V0dGVyID09IG51bGwpIHsKICAgICAgX2hlbHBlci53YXJuVW5yZXNvbHZlZE1ldGhvZChpbmRleEdldE5hbWUsIGZpbGVPZmZzZXQsIGlzU3VwZXI6IHRydWUpOwogICAgfQogICAgcmV0dXJuIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgIGluZGV4R2V0TmFtZSwKICAgICAgICBnZXR0ZXIsCiAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlQXJndW1lbnRzKGZpbGVPZmZzZXQsIDxFeHByZXNzaW9uPltpbmRleF0pKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKICAgICAgICBfaGVscGVyLndhcm5VbnJlc29sdmVkTWV0aG9kKGluZGV4U2V0TmFtZSwgZmlsZU9mZnNldCwgaXNTdXBlcjogdHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgICBzZXR0ZXIsCiAgICAgICAgICBfaGVscGVyLmZvcmVzdAogICAgICAgICAgICAgIC5jcmVhdGVBcmd1bWVudHMoZmlsZU9mZnNldCwgPEV4cHJlc3Npb24+W2luZGV4LCB2YWx1ZV0pKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgU3VwZXJJbmRleFNldChzZXR0ZXIsIGluZGV4LCB2YWx1ZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBJZk51bGxTdXBlckluZGV4U2V0KGdldHRlciwgc2V0dGVyLCBpbmRleCwgdmFsdWUsCiAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICB0ZXN0T2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgd3JpdGVPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIG5ldyBDb21wb3VuZFN1cGVySW5kZXhTZXQoCiAgICAgICAgZ2V0dGVyLCBzZXR0ZXIsIGluZGV4LCBiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBiaW5hcnlPZmZzZXQ6IG9mZnNldCwKICAgICAgICB3cml0ZU9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgIGZvclBvc3RJbmNEZWM6IGlzUG9zdEluY0RlYyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gX2ZvcmVzdC5jcmVhdGVJbnRMaXRlcmFsKG9mZnNldCwgMSk7CiAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgIG9mZnNldDogb2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQsIGlzUG9zdEluY0RlYzogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlRXhwcmVzc2lvbkludm9jYXRpb24ob2Zmc2V0LCBidWlsZFNpbXBsZVJlYWQoKSwgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIE5hbWVTeXN0ZW0gc3ludGhldGljTmFtZXMgPSBuZXcgTmFtZVN5c3RlbSgpOwogICAgc2luay53cml0ZSgiLCBpbmRleDogIik7CiAgICBwcmludE5vZGVPbihpbmRleCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgZ2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKGdldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICAgIHNpbmsud3JpdGUoIiwgc2V0dGVyOiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHNldHRlciwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCi8vLyBBIFtTdGF0aWNBY2Nlc3NHZW5lcmF0b3JdIHJlcHJlc2VudHMgYSBzdWJleHByZXNzaW9uIHdob3NlIHByZWZpeCBpcwovLy8gYSBzdGF0aWMgb3IgdG9wLWxldmVsIG1lbWJlciwgaW5jbHVkaW5nIHN0YXRpYyBleHRlbnNpb24gbWVtYmVycy4KLy8vCi8vLyBGb3IgaW5zdGFuY2UKLy8vCi8vLyAgIGdldCBwcm9wZXJ0eSA9PiAwOwovLy8gICBzZXQgcHJvcGVydHkoXykge30KLy8vICAgdmFyIGZpZWxkOwovLy8gICBtZXRob2QoKSB7fQovLy8KLy8vICAgbWFpbigpIHsKLy8vICAgICBwcm9wZXJ0eTsgICAgIC8vIGEgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBwcm9wZXJ0eWAuCi8vLyAgICAgcHJvcGVydHkgPSAwOyAvLyBhIFN0YXRpY0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgcHJvcGVydHlgLgovLy8gICAgIGZpZWxkID0gMDsgICAgLy8gYSBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGZpZWxkYC4KLy8vICAgICBtZXRob2Q7ICAgICAgIC8vIGEgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBtZXRob2RgLgovLy8gICAgIG1ldGhvZCgpOyAgICAgLy8gYSBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYG1ldGhvZGAuCi8vLyAgIH0KLy8vCi8vLyAgIGNsYXNzIEEge30KLy8vICAgZXh0ZW5zaW9uIEIgb24gQSB7Ci8vLyAgICAgc3RhdGljIGdldCBwcm9wZXJ0eSA9PiAwOwovLy8gICAgIHN0YXRpYyBzZXQgcHJvcGVydHkoXykge30KLy8vICAgICBzdGF0aWMgdmFyIGZpZWxkOwovLy8gICAgIHN0YXRpYyBtZXRob2QoKSB7Ci8vLyAgICAgICBwcm9wZXJ0eTsgICAgIC8vIHRoaXMgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBwcm9wZXJ0eWAuCi8vLyAgICAgICBwcm9wZXJ0eSA9IDA7IC8vIHRoaXMgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBwcm9wZXJ0eWAuCi8vLyAgICAgICBmaWVsZCA9IDA7ICAgIC8vIHRoaXMgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBmaWVsZGAuCi8vLyAgICAgICBtZXRob2Q7ICAgICAgIC8vIHRoaXMgU3RhdGljQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBtZXRob2RgLgovLy8gICAgICAgbWV0aG9kKCk7ICAgICAvLyB0aGlzIFN0YXRpY0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgbWV0aG9kYC4KLy8vICAgICB9Ci8vLyAgIH0KLy8vCmNsYXNzIFN0YXRpY0FjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgLy8vIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCB0YXJnZXQ7CiAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWU7CgogIC8vLyBUaGUgc3RhdGljIFtNZW1iZXJdIHVzZWQgZm9yIHBlcmZvcm1pbmcgYSByZWFkIG9yIGludm9jYXRpb24gb24gdGhpcwogIC8vLyBzdWJleHByZXNzaW9uLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSBgbnVsbGAgaWYgdGhlIHN1YmV4cHJlc3Npb24gZG9lc24ndCBoYXZlIGEgcmVhZGFibGUgdGFyZ2V0LgogIC8vLyBGb3IgaW5zdGFuY2UgaWYgdGhlIHN1YmV4cHJlc3Npb24gaXMgYSBzZXR0ZXIgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcKICAvLy8gZ2V0dGVyLgogIGZpbmFsIE1lbWJlciByZWFkVGFyZ2V0OwoKICAvLy8gVGhlIHN0YXRpYyBbTWVtYmVyXSB1c2VkIGZvciBwZXJmb3JtaW5nIGEgd3JpdGUgb24gdGhpcyBzdWJleHByZXNzaW9uLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSBgbnVsbGAgaWYgdGhlIHN1YmV4cHJlc3Npb24gZG9lc24ndCBoYXZlIGEgd3JpdGFibGUgdGFyZ2V0LgogIC8vLyBGb3IgaW5zdGFuY2UgaWYgdGhlIHN1YmV4cHJlc3Npb24gaXMgYSBmaW5hbCBmaWVsZCwgYSBtZXRob2QsIG9yIGEgZ2V0dGVyCiAgLy8vIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIHNldHRlci4KICBmaW5hbCBNZW1iZXIgd3JpdGVUYXJnZXQ7CgogIFN0YXRpY0FjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMudGFyZ2V0TmFtZSwgdGhpcy5yZWFkVGFyZ2V0LCB0aGlzLndyaXRlVGFyZ2V0KQogICAgICA6IGFzc2VydCh0YXJnZXROYW1lICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWFkVGFyZ2V0ICE9IG51bGwgfHwgd3JpdGVUYXJnZXQgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIGZhY3RvcnkgU3RhdGljQWNjZXNzR2VuZXJhdG9yLmZyb21CdWlsZGVyKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgU3RyaW5nIHRhcmdldE5hbWUsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBNZW1iZXJCdWlsZGVyIGdldHRlckJ1aWxkZXIsCiAgICAgIE1lbWJlckJ1aWxkZXIgc2V0dGVyQnVpbGRlcikgewogICAgcmV0dXJuIG5ldyBTdGF0aWNBY2Nlc3NHZW5lcmF0b3IoaGVscGVyLCB0b2tlbiwgdGFyZ2V0TmFtZSwKICAgICAgICBnZXR0ZXJCdWlsZGVyPy5yZWFkVGFyZ2V0LCBzZXR0ZXJCdWlsZGVyPy53cml0ZVRhcmdldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlN0YXRpY0FjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gdGFyZ2V0TmFtZTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gX2NyZWF0ZVJlYWQoKTsKICB9CgogIEV4cHJlc3Npb24gX2NyZWF0ZVJlYWQoKSB7CiAgICBFeHByZXNzaW9uIHJlYWQ7CiAgICBpZiAocmVhZFRhcmdldCA9PSBudWxsKSB7CiAgICAgIHJlYWQgPSBfbWFrZUludmFsaWRSZWFkKCk7CiAgICB9IGVsc2UgewogICAgICByZWFkID0gX2hlbHBlci5tYWtlU3RhdGljR2V0KHJlYWRUYXJnZXQsIHRva2VuKTsKICAgIH0KICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQgPSBmYWxzZX0pIHsKICAgIHJldHVybiBfY3JlYXRlV3JpdGUoZmlsZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgRXhwcmVzc2lvbiBfY3JlYXRlV3JpdGUoaW50IG9mZnNldCwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgRXhwcmVzc2lvbiB3cml0ZTsKICAgIGlmICh3cml0ZVRhcmdldCA9PSBudWxsKSB7CiAgICAgIHdyaXRlID0gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGUgPSBuZXcgU3RhdGljU2V0KHdyaXRlVGFyZ2V0LCB2YWx1ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IElmTnVsbFNldChfY3JlYXRlUmVhZCgpLCBfY3JlYXRlV3JpdGUob2Zmc2V0LCB2YWx1ZSksCiAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0ID0gZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWMgPSBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWMgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gYmluYXJ5ID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlQmluYXJ5KG9mZnNldCwgX2NyZWF0ZVJlYWQoKSwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlKTsKICAgIHJldHVybiBfY3JlYXRlV3JpdGUoZmlsZU9mZnNldCwgYmluYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBfZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0LCAxKTsKICAgIGlmICh2b2lkQ29udGV4dCkgewogICAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwgaXNQb3N0SW5jRGVjOiB0cnVlKTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZCA9CiAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKF9jcmVhdGVSZWFkKCkpOwogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBfaGVscGVyLmZvcmVzdC5jcmVhdGVCaW5hcnkob2Zmc2V0LAogICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQocmVhZCwgZmlsZU9mZnNldCksIGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKF9jcmVhdGVXcml0ZShvZmZzZXQsIGJpbmFyeSkpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNQb3N0SW5jRGVjKHJlYWQsIHdyaXRlKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChfaGVscGVyLmNvbnN0YW50Q29udGV4dCAhPSBDb25zdGFudENvbnRleHQubm9uZSAmJgogICAgICAgICFfaGVscGVyLmlzSWRlbnRpY2FsKHJlYWRUYXJnZXQpKSB7CiAgICAgIHJldHVybiBfaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlTm90Q29uc3RhbnRFeHByZXNzaW9uLndpdGhBcmd1bWVudHMoJ01ldGhvZCBpbnZvY2F0aW9uJyksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICByZWFkVGFyZ2V0Py5uYW1lPy5uYW1lPy5sZW5ndGggPz8gMCk7CiAgICB9CiAgICBpZiAocmVhZFRhcmdldCA9PSBudWxsIHx8IGlzRmllbGRPckdldHRlcihyZWFkVGFyZ2V0KSkgewogICAgICByZXR1cm4gX2hlbHBlci5mb3Jlc3QuY3JlYXRlRXhwcmVzc2lvbkludm9jYXRpb24oCiAgICAgICAgICBvZmZzZXQgKyAocmVhZFRhcmdldD8ubmFtZT8ubmFtZT8ubGVuZ3RoID8/IDApLAogICAgICAgICAgYnVpbGRTaW1wbGVSZWFkKCksCiAgICAgICAgICBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRTdGF0aWNJbnZvY2F0aW9uKHJlYWRUYXJnZXQsIGFyZ3VtZW50cywKICAgICAgICAgIGNoYXJPZmZzZXQ6IG9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBHZW5lcmF0b3IgYnVpbGRJbmRleGVkQWNjZXNzKEV4cHJlc3Npb24gaW5kZXgsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc051bGxBd2FyZX0pIHsKICAgIGFzc2VydChpc051bGxBd2FyZSAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihfaGVscGVyLCB0b2tlbiwgYnVpbGRTaW1wbGVSZWFkKCksIGluZGV4LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgdGFyZ2V0TmFtZTogIik7CiAgICBzaW5rLndyaXRlKHRhcmdldE5hbWUpOwogICAgc2luay53cml0ZSgiLCByZWFkVGFyZ2V0OiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHJlYWRUYXJnZXQsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHdyaXRlVGFyZ2V0OiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHdyaXRlVGFyZ2V0LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKLy8vIEFuIFtFeHRlbnNpb25JbnN0YW5jZUFjY2Vzc0dlbmVyYXRvcl0gcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24gd2hvc2UKLy8vIHByZWZpeCBpcyBhbiBleHRlbnNpb24gaW5zdGFuY2UgbWVtYmVyLgovLy8KLy8vIEZvciBpbnN0YW5jZQovLy8KLy8vICAgY2xhc3MgQSB7fQovLy8gICBleHRlbnNpb24gQiBvbiBBIHsKLy8vICAgICBnZXQgcHJvcGVydHkgPT4gMDsKLy8vICAgICBzZXQgcHJvcGVydHkoXykge30KLy8vICAgICBtZXRob2QoKSB7Ci8vLyAgICAgICBwcm9wZXJ0eTsgICAgIC8vIHRoaXMgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBwcm9wZXJ0eWAuCi8vLyAgICAgICBwcm9wZXJ0eSA9IDA7IC8vIHRoaXMgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBwcm9wZXJ0eWAuCi8vLyAgICAgICBtZXRob2Q7ICAgICAgIC8vIHRoaXMgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBtZXRob2RgLgovLy8gICAgICAgbWV0aG9kKCk7ICAgICAvLyB0aGlzIGdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgbWV0aG9kYC4KLy8vICAgICB9Ci8vLyAgIH0KLy8vCi8vLyBUaGVzZSBjYW4gb25seSBvY2N1ciB3aXRoaW4gYW4gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlci4KY2xhc3MgRXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb247CgogIC8vLyBUaGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgdGFyZ2V0LgogIGZpbmFsIFN0cmluZyB0YXJnZXROYW1lOwoKICAvLy8gVGhlIHN0YXRpYyBbTWVtYmVyXSBnZW5lcmF0ZWQgZm9yIGFuIGluc3RhbmNlIGV4dGVuc2lvbiBtZW1iZXIgd2hpY2ggaXMKICAvLy8gdXNlZCBmb3IgcGVyZm9ybWluZyBhIHJlYWQgb24gdGhpcyBzdWJleHByZXNzaW9uLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSBgbnVsbGAgaWYgdGhlIHN1YmV4cHJlc3Npb24gZG9lc24ndCBoYXZlIGEgcmVhZGFibGUgdGFyZ2V0LgogIC8vLyBGb3IgaW5zdGFuY2UgaWYgdGhlIHN1YmV4cHJlc3Npb24gaXMgYSBzZXR0ZXIgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcKICAvLy8gZ2V0dGVyLgogIGZpbmFsIFByb2NlZHVyZSByZWFkVGFyZ2V0OwoKICAvLy8gVGhlIHN0YXRpYyBbTWVtYmVyXSBnZW5lcmF0ZWQgZm9yIGFuIGluc3RhbmNlIGV4dGVuc2lvbiBtZW1iZXIgd2hpY2ggaXMKICAvLy8gdXNlZCBmb3IgcGVyZm9ybWluZyBhbiBpbnZvY2F0aW9uIG9uIHRoaXMgc3ViZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgYG51bGxgIGlmIHRoZSBzdWJleHByZXNzaW9uIGRvZXNuJ3QgaGF2ZSBhbiBpbnZva2FibGUgdGFyZ2V0LgogIC8vLyBGb3IgaW5zdGFuY2UgaWYgdGhlIHN1YmV4cHJlc3Npb24gaXMgYSBnZXR0ZXIgb3Igc2V0dGVyLgogIGZpbmFsIFByb2NlZHVyZSBpbnZva2VUYXJnZXQ7CgogIC8vLyBUaGUgc3RhdGljIFtNZW1iZXJdIGdlbmVyYXRlZCBmb3IgYW4gaW5zdGFuY2UgZXh0ZW5zaW9uIG1lbWJlciB3aGljaCBpcwogIC8vLyB1c2VkIGZvciBwZXJmb3JtaW5nIGEgd3JpdGUgb24gdGhpcyBzdWJleHByZXNzaW9uLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSBgbnVsbGAgaWYgdGhlIHN1YmV4cHJlc3Npb24gZG9lc24ndCBoYXZlIGEgd3JpdGFibGUgdGFyZ2V0LgogIC8vLyBGb3IgaW5zdGFuY2UgaWYgdGhlIHN1YmV4cHJlc3Npb24gaXMgYSBmaW5hbCBmaWVsZCwgYSBtZXRob2QsIG9yIGEgZ2V0dGVyCiAgLy8vIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIHNldHRlci4KICBmaW5hbCBQcm9jZWR1cmUgd3JpdGVUYXJnZXQ7CgogIC8vLyBUaGUgcGFyYW1ldGVyIGhvbGRpbmcgdGhlIHZhbHVlIGZvciBgdGhpc2Agd2l0aGluIHRoZSBjdXJyZW50IGV4dGVuc2lvbgogIC8vLyBpbnN0YW5jZSBtZXRob2QuCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogSGFuZGxlIHN0YXRpYyBhY2Nlc3MgdG8gZXh0ZW5zaW9uIGluc3RhbmNlIG1lbWJlcnMsCiAgLy8gaW4gd2hpY2ggY2FzZSB0aGUgYWNjZXNzIGlzIGVycm9uZW91cyBhbmQgW2V4dGVuc2lvblRoaXNdIGlzIGBudWxsYC4KICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuc2lvblRoaXM7CgogIC8vLyBUaGUgdHlwZSBwYXJhbWV0ZXJzIHN5bnRoZXRpY2FsbHkgYWRkZWQgdG8gIHRoZSBjdXJyZW50IGV4dGVuc2lvbgogIC8vLyBpbnN0YW5jZSBtZXRob2QuCiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiBleHRlbnNpb25UeXBlUGFyYW1ldGVyczsKCiAgRXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5leHRlbnNpb24sCiAgICAgIHRoaXMudGFyZ2V0TmFtZSwKICAgICAgdGhpcy5yZWFkVGFyZ2V0LAogICAgICB0aGlzLmludm9rZVRhcmdldCwKICAgICAgdGhpcy53cml0ZVRhcmdldCwKICAgICAgdGhpcy5leHRlbnNpb25UaGlzLAogICAgICB0aGlzLmV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzKQogICAgICA6IGFzc2VydCh0YXJnZXROYW1lICE9IG51bGwpLAogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgcmVhZFRhcmdldCAhPSBudWxsIHx8IGludm9rZVRhcmdldCAhPSBudWxsIHx8IHdyaXRlVGFyZ2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChleHRlbnNpb25UaGlzICE9IG51bGwpLAogICAgICAgIHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBmYWN0b3J5IEV4dGVuc2lvbkluc3RhbmNlQWNjZXNzR2VuZXJhdG9yLmZyb21CdWlsZGVyKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24sCiAgICAgIFN0cmluZyB0YXJnZXROYW1lLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuc2lvblRoaXMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMsCiAgICAgIE1lbWJlckJ1aWxkZXIgZ2V0dGVyQnVpbGRlciwKICAgICAgTWVtYmVyQnVpbGRlciBzZXR0ZXJCdWlsZGVyKSB7CiAgICBQcm9jZWR1cmUgcmVhZFRhcmdldDsKICAgIFByb2NlZHVyZSBpbnZva2VUYXJnZXQ7CiAgICBpZiAoZ2V0dGVyQnVpbGRlciAhPSBudWxsKSB7CiAgICAgIGlmIChnZXR0ZXJCdWlsZGVyLmlzR2V0dGVyKSB7CiAgICAgICAgYXNzZXJ0KCFnZXR0ZXJCdWlsZGVyLmlzU3RhdGljKTsKICAgICAgICByZWFkVGFyZ2V0ID0gZ2V0dGVyQnVpbGRlci5yZWFkVGFyZ2V0OwogICAgICB9IGVsc2UgaWYgKGdldHRlckJ1aWxkZXIuaXNSZWd1bGFyTWV0aG9kKSB7CiAgICAgICAgYXNzZXJ0KCFnZXR0ZXJCdWlsZGVyLmlzU3RhdGljKTsKICAgICAgICByZWFkVGFyZ2V0ID0gZ2V0dGVyQnVpbGRlci5yZWFkVGFyZ2V0OwogICAgICAgIGludm9rZVRhcmdldCA9IGdldHRlckJ1aWxkZXIuaW52b2tlVGFyZ2V0OwogICAgICB9IGVsc2UgaWYgKGdldHRlckJ1aWxkZXIuaXNPcGVyYXRvcikgewogICAgICAgIGFzc2VydCghZ2V0dGVyQnVpbGRlci5pc1N0YXRpYyk7CiAgICAgICAgaW52b2tlVGFyZ2V0ID0gZ2V0dGVyQnVpbGRlci5pbnZva2VUYXJnZXQ7CiAgICAgIH0KICAgIH0KICAgIFByb2NlZHVyZSB3cml0ZVRhcmdldDsKICAgIGlmIChzZXR0ZXJCdWlsZGVyICE9IG51bGwpIHsKICAgICAgaWYgKHNldHRlckJ1aWxkZXIuaXNTZXR0ZXIpIHsKICAgICAgICBhc3NlcnQoIXNldHRlckJ1aWxkZXIuaXNTdGF0aWMpOwogICAgICAgIHdyaXRlVGFyZ2V0ID0gc2V0dGVyQnVpbGRlci53cml0ZVRhcmdldDsKICAgICAgICB0YXJnZXROYW1lID8/PSBzZXR0ZXJCdWlsZGVyLm5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICAgIiR7c2V0dGVyQnVpbGRlci5ydW50aW1lVHlwZX0iLAogICAgICAgICAgICAiRXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIiLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICAgIGhlbHBlci51cmkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEV4dGVuc2lvbkluc3RhbmNlQWNjZXNzR2VuZXJhdG9yKAogICAgICAgIGhlbHBlciwKICAgICAgICB0b2tlbiwKICAgICAgICBleHRlbnNpb24sCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgIGludm9rZVRhcmdldCwKICAgICAgICB3cml0ZVRhcmdldCwKICAgICAgICBleHRlbnNpb25UaGlzLAogICAgICAgIGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzKTsKICB9CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiSW5zdGFuY2VFeHRlbnNpb25BY2Nlc3NHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IHRhcmdldE5hbWU7CgogIGludCBnZXQgX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCA9PiBleHRlbnNpb25UeXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDA7CgogIExpc3Q8RGFydFR5cGU+IF9jcmVhdGVFeHRlbnNpb25UeXBlQXJndW1lbnRzKCkgewogICAgTGlzdDxEYXJ0VHlwZT4gZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxEYXJ0VHlwZT5bXTsKICAgIGlmIChleHRlbnNpb25UeXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudHMgPSBbXTsKICAgICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMpIHsKICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRzLmFkZCgKICAgICAgICAgICAgX2ZvcmVzdC5jcmVhdGVUeXBlUGFyYW1ldGVyVHlwZVdpdGhEZWZhdWx0TnVsbGFiaWxpdHlGb3JMaWJyYXJ5KAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlciwgZXh0ZW5zaW9uLmVuY2xvc2luZ0xpYnJhcnkpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV4dGVuc2lvblR5cGVBcmd1bWVudHM7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBfY3JlYXRlUmVhZCgpOwogIH0KCiAgRXhwcmVzc2lvbiBfY3JlYXRlUmVhZCgpIHsKICAgIEV4cHJlc3Npb24gcmVhZDsKICAgIGlmIChyZWFkVGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmVhZCA9IF9tYWtlSW52YWxpZFJlYWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlYWQgPSBfaGVscGVyLmJ1aWxkRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlQXJndW1lbnRzRm9yRXh0ZW5zaW9uTWV0aG9kKAogICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQoZXh0ZW5zaW9uVGhpcywgZmlsZU9mZnNldCksCiAgICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50czogX2NyZWF0ZUV4dGVuc2lvblR5cGVBcmd1bWVudHMoKSksCiAgICAgICAgICBpc1RlYXJPZmY6IGludm9rZVRhcmdldCAhPSBudWxsKTsKICAgIH0KICAgIHJldHVybiByZWFkOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCB2YWx1ZSwgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCk7CiAgfQoKICBFeHByZXNzaW9uIF9jcmVhdGVXcml0ZShpbnQgb2Zmc2V0LCBFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCBmb3JFZmZlY3R9KSB7CiAgICBFeHByZXNzaW9uIHdyaXRlOwogICAgaWYgKHdyaXRlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgd3JpdGUgPSBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZSA9IG5ldyBFeHRlbnNpb25TZXQoCiAgICAgICAgICBleHRlbnNpb24sCiAgICAgICAgICBfY3JlYXRlRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cygpLAogICAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldChleHRlbnNpb25UaGlzLCBmaWxlT2Zmc2V0KSwKICAgICAgICAgIHdyaXRlVGFyZ2V0LAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBmb3JFZmZlY3Q6IGZvckVmZmVjdCwKICAgICAgICAgIHJlYWRPbmx5UmVjZWl2ZXI6IHRydWUpOwogICAgfQogICAgd3JpdGUuZmlsZU9mZnNldCA9IG9mZnNldDsKICAgIHJldHVybiB3cml0ZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRJZk51bGxBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgSWZOdWxsU2V0KAogICAgICAgIF9jcmVhdGVSZWFkKCksIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCB2YWx1ZSwgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCksCiAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBfaGVscGVyLmZvcmVzdAogICAgICAgIC5jcmVhdGVCaW5hcnkob2Zmc2V0LCBfY3JlYXRlUmVhZCgpLCBiaW5hcnlPcGVyYXRvciwgdmFsdWUpOwogICAgcmV0dXJuIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCBiaW5hcnksIGZvckVmZmVjdDogdm9pZENvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dCA9IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IF9mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpOwogICAgaWYgKHZvaWRDb250ZXh0KSB7CiAgICAgIHJldHVybiBidWlsZENvbXBvdW5kQXNzaWdubWVudChiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0LCBpc1Bvc3RJbmNEZWM6IHRydWUpOwogICAgfQogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFkID0KICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUoX2NyZWF0ZVJlYWQoKSk7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeShvZmZzZXQsCiAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldChyZWFkLCBmaWxlT2Zmc2V0KSwgYmluYXJ5T3BlcmF0b3IsIHZhbHVlKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGUgPSBfaGVscGVyLmZvcmVzdAogICAgICAgIC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUoCiAgICAgICAgICAgIF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LCBiaW5hcnksIGZvckVmZmVjdDogdHJ1ZSkpOwogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVBvc3RJbmNEZWMub25SZWFkT25seShyZWFkLCB3cml0ZSkuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBpZiAoaW52b2tlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRFeHRlbnNpb25NZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgaW52b2tlVGFyZ2V0LAogICAgICAgICAgX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNGb3JFeHRlbnNpb25NZXRob2QoCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICBfZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50LAogICAgICAgICAgICAgIGludm9rZVRhcmdldC5mdW5jdGlvbi50eXBlUGFyYW1ldGVycy5sZW5ndGggLQogICAgICAgICAgICAgICAgICBfZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50LAogICAgICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQoZXh0ZW5zaW9uVGhpcywgb2Zmc2V0KSwKICAgICAgICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRzOiBfY3JlYXRlRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cygpLAogICAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IGFyZ3VtZW50cy50eXBlcywKICAgICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzOiBhcmd1bWVudHMucG9zaXRpb25hbCwKICAgICAgICAgICAgICBuYW1lZEFyZ3VtZW50czogYXJndW1lbnRzLm5hbWVkKSwKICAgICAgICAgIGlzVGVhck9mZjogZmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25JbnZvY2F0aW9uKAogICAgICAgICAgYWRqdXN0Rm9ySW1wbGljaXRDYWxsKF9wbGFpbk5hbWVGb3JSZWFkLCBvZmZzZXQpLAogICAgICAgICAgYnVpbGRTaW1wbGVSZWFkKCksCiAgICAgICAgICBhcmd1bWVudHMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIHRhcmdldE5hbWU6ICIpOwogICAgc2luay53cml0ZSh0YXJnZXROYW1lKTsKICAgIHNpbmsud3JpdGUoIiwgcmVhZFRhcmdldDogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihyZWFkVGFyZ2V0LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCB3cml0ZVRhcmdldDogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbih3cml0ZVRhcmdldCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCi8vLyBBIFtFeHBsaWNpdEV4dGVuc2lvbkluc3RhbmNlQWNjZXNzR2VuZXJhdG9yXSByZXByZXNlbnRzIGEgc3ViZXhwcmVzc2lvbgovLy8gd2hvc2UgcHJlZml4IGlzIGEgZm9yY2VkIGV4dGVuc2lvbiBpbnN0YW5jZSBtZW1iZXIgYWNjZXNzLgovLy8KLy8vIEZvciBpbnN0YW5jZQovLy8KLy8vICAgY2xhc3MgQTxUPiB7fQovLy8gICBleHRlbnNpb24gQiBvbiBBPGludD4gewovLy8gICAgIG1ldGhvZCgpIHt9Ci8vLyAgIH0KLy8vICAgZXh0ZW5zaW9uIEM8VD4gewovLy8gICAgIFQgZ2V0IGZpZWxkID0+IDA7Ci8vLyAgICAgc2V0IGZpZWxkKFQgXykge30KLy8vICAgfQovLy8KLy8vICAgbWV0aG9kKEEgYSkgewovLy8gICAgIEIoYSkubWV0aG9kOyAgICAgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYEIoYSkubWV0aG9kYC4KLy8vICAgICBCKGEpLm1ldGhvZCgpOyAgIC8vIHRoaXMgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBCKGEpLm1ldGhvZGAuCi8vLyAgICAgQzxpbnQ+KGEpLmZpZWxkOyAvLyB0aGlzIGdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgQzxpbnQ+KGEpLmZpZWxkYC4KLy8vICAgICBDKGEpLmZpZWxkID0gMDsgIC8vIHRoaXMgZ2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBDKGEpLmZpZWxkYC4KLy8vICAgfQovLy8KY2xhc3MgRXhwbGljaXRFeHRlbnNpb25JbnN0YW5jZUFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgLy8vIFRoZSBmaWxlIG9mZnNldCB1c2VkIGZvciB0aGUgZXhwbGljaXQgZXh0ZW5zaW9uIGFwcGxpY2F0aW9uIHR5cGUKICAvLy8gYXJndW1lbnRzLgogIGZpbmFsIGludCBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQ7CgogIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb247CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgdGFyZ2V0OwogIGZpbmFsIE5hbWUgdGFyZ2V0TmFtZTsKCiAgLy8vIFRoZSBzdGF0aWMgW01lbWJlcl0gZ2VuZXJhdGVkIGZvciBhbiBpbnN0YW5jZSBleHRlbnNpb24gbWVtYmVyIHdoaWNoIGlzCiAgLy8vIHVzZWQgZm9yIHBlcmZvcm1pbmcgYSByZWFkIG9uIHRoaXMgc3ViZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgYG51bGxgIGlmIHRoZSBzdWJleHByZXNzaW9uIGRvZXNuJ3QgaGF2ZSBhIHJlYWRhYmxlIHRhcmdldC4KICAvLy8gRm9yIGluc3RhbmNlIGlmIHRoZSBzdWJleHByZXNzaW9uIGlzIGEgc2V0dGVyIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nCiAgLy8vIGdldHRlci4KICBmaW5hbCBQcm9jZWR1cmUgcmVhZFRhcmdldDsKCiAgLy8vIFRoZSBzdGF0aWMgW01lbWJlcl0gZ2VuZXJhdGVkIGZvciBhbiBpbnN0YW5jZSBleHRlbnNpb24gbWVtYmVyIHdoaWNoIGlzCiAgLy8vIHVzZWQgZm9yIHBlcmZvcm1pbmcgYW4gaW52b2NhdGlvbiBvbiB0aGlzIHN1YmV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIFRoaXMgY2FuIGJlIGBudWxsYCBpZiB0aGUgc3ViZXhwcmVzc2lvbiBkb2Vzbid0IGhhdmUgYW4gaW52b2thYmxlIHRhcmdldC4KICAvLy8gRm9yIGluc3RhbmNlIGlmIHRoZSBzdWJleHByZXNzaW9uIGlzIGEgZ2V0dGVyIG9yIHNldHRlci4KICBmaW5hbCBQcm9jZWR1cmUgaW52b2tlVGFyZ2V0OwoKICAvLy8gVGhlIHN0YXRpYyBbTWVtYmVyXSBnZW5lcmF0ZWQgZm9yIGFuIGluc3RhbmNlIGV4dGVuc2lvbiBtZW1iZXIgd2hpY2ggaXMKICAvLy8gdXNlZCBmb3IgcGVyZm9ybWluZyBhIHdyaXRlIG9uIHRoaXMgc3ViZXhwcmVzc2lvbi4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgYG51bGxgIGlmIHRoZSBzdWJleHByZXNzaW9uIGRvZXNuJ3QgaGF2ZSBhIHdyaXRhYmxlIHRhcmdldC4KICAvLy8gRm9yIGluc3RhbmNlIGlmIHRoZSBzdWJleHByZXNzaW9uIGlzIGEgZmluYWwgZmllbGQsIGEgbWV0aG9kLCBvciBhIGdldHRlcgogIC8vLyB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBzZXR0ZXIuCiAgZmluYWwgUHJvY2VkdXJlIHdyaXRlVGFyZ2V0OwoKICAvLy8gVGhlIGV4cHJlc3Npb24gaG9sZGluZyB0aGUgcmVjZWl2ZXIgdmFsdWUgZm9yIHRoZSBleHBsaWNpdCBleHRlbnNpb24KICAvLy8gYWNjZXNzLCB0aGF0IGlzLCBgYWAgaW4gYEV4dGVuc2lvbjxpbnQ+KGEpLm1ldGhvZDxTdHJpbmc+KClgLgogIGZpbmFsIEV4cHJlc3Npb24gcmVjZWl2ZXI7CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBwYXNzZWQgdG8gdGhlIGV4cGxpY2l0IGV4dGVuc2lvbiBhY2Nlc3MsCiAgLy8vIGxpa2UgYDxpbnQ+YCBpbiBgRXh0ZW5zaW9uPGludD4oYSkubWV0aG9kPFN0cmluZz4oKWAuCiAgZmluYWwgTGlzdDxEYXJ0VHlwZT4gZXhwbGljaXRUeXBlQXJndW1lbnRzOwoKICAvLy8gVGhlIG51bWJlciBvZiB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgb24gdGhlIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi4KICBmaW5hbCBpbnQgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50OwoKICAvLy8gSWYgYHRydWVgIHRoZSBhY2Nlc3MgaXMgbnVsbC1hd2FyZSwgbGlrZSBgRXh0ZW5zaW9uKGMpPy5mb29gLgogIGZpbmFsIGJvb2wgaXNOdWxsQXdhcmU7CgogIEV4cGxpY2l0RXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5leHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQsCiAgICAgIHRoaXMuZXh0ZW5zaW9uLAogICAgICB0aGlzLnRhcmdldE5hbWUsCiAgICAgIHRoaXMucmVhZFRhcmdldCwKICAgICAgdGhpcy5pbnZva2VUYXJnZXQsCiAgICAgIHRoaXMud3JpdGVUYXJnZXQsCiAgICAgIHRoaXMucmVjZWl2ZXIsCiAgICAgIHRoaXMuZXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICB0aGlzLmV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAge3RoaXMuaXNOdWxsQXdhcmV9KQogICAgICA6IGFzc2VydCh0YXJnZXROYW1lICE9IG51bGwpLAogICAgICAgIGFzc2VydCgKICAgICAgICAgICAgcmVhZFRhcmdldCAhPSBudWxsIHx8IGludm9rZVRhcmdldCAhPSBudWxsIHx8IHdyaXRlVGFyZ2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWNlaXZlciAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIGZhY3RvcnkgRXhwbGljaXRFeHRlbnNpb25JbnN0YW5jZUFjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsCiAgICAgIFRva2VuIHRva2VuLAogICAgICBpbnQgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50T2Zmc2V0LAogICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uLAogICAgICBOYW1lIHRhcmdldE5hbWUsCiAgICAgIEJ1aWxkZXIgZ2V0dGVyQnVpbGRlciwKICAgICAgQnVpbGRlciBzZXR0ZXJCdWlsZGVyLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgIGludCBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGdldHRlckJ1aWxkZXIgIT0gbnVsbCB8fCBzZXR0ZXJCdWlsZGVyICE9IG51bGwpOwogICAgUHJvY2VkdXJlIHJlYWRUYXJnZXQ7CiAgICBQcm9jZWR1cmUgaW52b2tlVGFyZ2V0OwogICAgaWYgKGdldHRlckJ1aWxkZXIgIT0gbnVsbCkgewogICAgICBhc3NlcnQoIWdldHRlckJ1aWxkZXIuaXNTdGF0aWMpOwogICAgICBpZiAoZ2V0dGVyQnVpbGRlciBpcyBBY2Nlc3NFcnJvckJ1aWxkZXIpIHsKICAgICAgICBBY2Nlc3NFcnJvckJ1aWxkZXIgZXJyb3IgPSBnZXR0ZXJCdWlsZGVyOwogICAgICAgIGdldHRlckJ1aWxkZXIgPSBlcnJvci5idWlsZGVyOwogICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IHNlZSBhbiBhY2Nlc3MgZXJyb3IgaGVyZSBpZiB3ZSd2ZSBsb29rZWQgdXAgYSBzZXR0ZXIKICAgICAgICAvLyB3aGVuIG5vdCBleHBsaWNpdGx5IGxvb2tpbmcgZm9yIGEgc2V0dGVyLgogICAgICAgIGFzc2VydChnZXR0ZXJCdWlsZGVyLmlzU2V0dGVyKTsKICAgICAgfSBlbHNlIGlmIChnZXR0ZXJCdWlsZGVyLmlzR2V0dGVyKSB7CiAgICAgICAgYXNzZXJ0KCFnZXR0ZXJCdWlsZGVyLmlzU3RhdGljKTsKICAgICAgICBNZW1iZXJCdWlsZGVyIG1lbWJlckJ1aWxkZXIgPSBnZXR0ZXJCdWlsZGVyOwogICAgICAgIHJlYWRUYXJnZXQgPSBtZW1iZXJCdWlsZGVyLnJlYWRUYXJnZXQ7CiAgICAgIH0gZWxzZSBpZiAoZ2V0dGVyQnVpbGRlci5pc1JlZ3VsYXJNZXRob2QpIHsKICAgICAgICBhc3NlcnQoIWdldHRlckJ1aWxkZXIuaXNTdGF0aWMpOwogICAgICAgIE1lbWJlckJ1aWxkZXIgcHJvY2VkdXJlQnVpbGRlciA9IGdldHRlckJ1aWxkZXI7CiAgICAgICAgcmVhZFRhcmdldCA9IHByb2NlZHVyZUJ1aWxkZXIucmVhZFRhcmdldDsKICAgICAgICBpbnZva2VUYXJnZXQgPSBwcm9jZWR1cmVCdWlsZGVyLmludm9rZVRhcmdldDsKICAgICAgfSBlbHNlIGlmIChnZXR0ZXJCdWlsZGVyLmlzT3BlcmF0b3IpIHsKICAgICAgICBhc3NlcnQoIWdldHRlckJ1aWxkZXIuaXNTdGF0aWMpOwogICAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyQnVpbGRlciA9IGdldHRlckJ1aWxkZXI7CiAgICAgICAgaW52b2tlVGFyZ2V0ID0gbWVtYmVyQnVpbGRlci5pbnZva2VUYXJnZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICAgIiRnZXR0ZXJCdWlsZGVyICgke2dldHRlckJ1aWxkZXIucnVudGltZVR5cGV9KSIsCiAgICAgICAgICAgICJJbnN0YW5jZUV4dGVuc2lvbkFjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlciIsCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgICAgaGVscGVyLnVyaSk7CiAgICAgIH0KICAgIH0KICAgIFByb2NlZHVyZSB3cml0ZVRhcmdldDsKICAgIGlmIChzZXR0ZXJCdWlsZGVyICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KCFzZXR0ZXJCdWlsZGVyLmlzU3RhdGljKTsKICAgICAgaWYgKHNldHRlckJ1aWxkZXIgaXMgQWNjZXNzRXJyb3JCdWlsZGVyKSB7CiAgICAgICAgLy8gTm8gc2V0dGVyLgogICAgICB9IGVsc2UgaWYgKHNldHRlckJ1aWxkZXIuaXNTZXR0ZXIpIHsKICAgICAgICBhc3NlcnQoIXNldHRlckJ1aWxkZXIuaXNTdGF0aWMpOwogICAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyQnVpbGRlciA9IHNldHRlckJ1aWxkZXI7CiAgICAgICAgd3JpdGVUYXJnZXQgPSBtZW1iZXJCdWlsZGVyLndyaXRlVGFyZ2V0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgICAgICIkc2V0dGVyQnVpbGRlciAoJHtzZXR0ZXJCdWlsZGVyLnJ1bnRpbWVUeXBlfSkiLAogICAgICAgICAgICAiSW5zdGFuY2VFeHRlbnNpb25BY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIiLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICAgIGhlbHBlci51cmkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cGxpY2l0RXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3IoCiAgICAgICAgaGVscGVyLAogICAgICAgIHRva2VuLAogICAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldCwKICAgICAgICBleHRlbnNpb24sCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgIGludm9rZVRhcmdldCwKICAgICAgICB3cml0ZVRhcmdldCwKICAgICAgICByZWNlaXZlciwKICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIkV4cGxpY2l0RXh0ZW5zaW9uSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gdGFyZ2V0TmFtZS5uYW1lOwoKICBMaXN0PERhcnRUeXBlPiBfY3JlYXRlRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cygpIHsKICAgIHJldHVybiBleHBsaWNpdFR5cGVBcmd1bWVudHMgPz8gY29uc3QgPERhcnRUeXBlPltdOwogIH0KCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIHBlcmZvcm1pbmcgYSByZWFkIG9wZXJhdGlvbiBpcyBhIHRlYXIgb2ZmLgogIC8vLwogIC8vLyBUaGlzIGlzIHRoZSBjYXNlIGlmIFtpbnZva2VUYXJnZXRdIGlzIG5vbi1udWxsLCBzaW5jZSBleHRlbnNpb24gbWV0aG9kcwogIC8vLyBoYXZlIGJvdGggYSBbcmVhZFRhcmdldF0gYW5kIGFuIFtpbnZva2VUYXJnZXRdLCB3aGVyZWFzIGV4dGVuc2lvbiBnZXR0ZXJzCiAgLy8vIG9ubHkgaGF2ZSBhIFtyZWFkVGFyZ2V0XS4KICBib29sIGdldCBpc1JlYWRUZWFyT2ZmID0+IGludm9rZVRhcmdldCAhPSBudWxsOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0KICAgICAgICAgIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShyZWNlaXZlcik7CiAgICAgIHJldHVybiBuZXcgTnVsbEF3YXJlRXh0ZW5zaW9uKAogICAgICAgICAgdmFyaWFibGUsCiAgICAgICAgICBfY3JlYXRlUmVhZChfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlLCB2YXJpYWJsZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIGZvck51bGxHdWFyZGVkQWNjZXNzOiB0cnVlKSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfY3JlYXRlUmVhZChyZWNlaXZlcik7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIF9jcmVhdGVSZWFkKEV4cHJlc3Npb24gcmVjZWl2ZXIpIHsKICAgIEV4cHJlc3Npb24gcmVhZDsKICAgIGlmIChyZWFkVGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmVhZCA9IF9tYWtlSW52YWxpZFJlYWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlYWQgPSBfaGVscGVyLmJ1aWxkRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlQXJndW1lbnRzRm9yRXh0ZW5zaW9uTWV0aG9kKAogICAgICAgICAgICAgIGZpbGVPZmZzZXQsIGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwgMCwgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50czogX2NyZWF0ZUV4dGVuc2lvblR5cGVBcmd1bWVudHMoKSwKICAgICAgICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQ6IGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldCksCiAgICAgICAgICBpc1RlYXJPZmY6IGlzUmVhZFRlYXJPZmYpOwogICAgfQogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZUV4dGVuc2lvbigKICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgX2NyZWF0ZVdyaXRlKAogICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgdmFyaWFibGUuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpLAogICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgIGZvckVmZmVjdDogdm9pZENvbnRleHQsCiAgICAgICAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogdHJ1ZSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfY3JlYXRlV3JpdGUoZmlsZU9mZnNldCwgcmVjZWl2ZXIsIHZhbHVlLAogICAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCwgcmVhZE9ubHlSZWNlaXZlcjogZmFsc2UpOwogICAgfQogIH0KCiAgRXhwcmVzc2lvbiBfY3JlYXRlV3JpdGUoaW50IG9mZnNldCwgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2Jvb2wgcmVhZE9ubHlSZWNlaXZlciwgYm9vbCBmb3JFZmZlY3R9KSB7CiAgICBFeHByZXNzaW9uIHdyaXRlOwogICAgaWYgKHdyaXRlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgd3JpdGUgPSBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZSA9IG5ldyBFeHRlbnNpb25TZXQoCiAgICAgICAgICBleHRlbnNpb24sIGV4cGxpY2l0VHlwZUFyZ3VtZW50cywgcmVjZWl2ZXIsIHdyaXRlVGFyZ2V0LCB2YWx1ZSwKICAgICAgICAgIHJlYWRPbmx5UmVjZWl2ZXI6IHJlYWRPbmx5UmVjZWl2ZXIsIGZvckVmZmVjdDogZm9yRWZmZWN0KTsKICAgIH0KICAgIHdyaXRlLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICByZXR1cm4gd3JpdGU7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICBFeHByZXNzaW9uIHJlYWQgPSBfY3JlYXRlUmVhZChfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KAogICAgICAgICAgdmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSkpOwogICAgICBFeHByZXNzaW9uIHdyaXRlID0gX2NyZWF0ZVdyaXRlKAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgTnVsbEF3YXJlRXh0ZW5zaW9uKAogICAgICAgICAgdmFyaWFibGUsCiAgICAgICAgICBuZXcgSWZOdWxsU2V0KHJlYWQsIHdyaXRlLCBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgICAgRXhwcmVzc2lvbiByZWFkID0KICAgICAgICAgIF9jcmVhdGVSZWFkKF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQpKTsKICAgICAgRXhwcmVzc2lvbiB3cml0ZSA9IF9jcmVhdGVXcml0ZShmaWxlT2Zmc2V0LAogICAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgcmVjZWl2ZXIuZmlsZU9mZnNldCksIHZhbHVlLAogICAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCwgcmVhZE9ubHlSZWNlaXZlcjogdHJ1ZSk7CiAgICAgIHJldHVybiBuZXcgSWZOdWxsUHJvcGVydHlTZXQodmFyaWFibGUsIHJlYWQsIHdyaXRlLAogICAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBvZmZzZXQ7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeSgKICAgICAgICAgIG9mZnNldCwKICAgICAgICAgIF9jcmVhdGVSZWFkKF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpKSwKICAgICAgICAgIGJpbmFyeU9wZXJhdG9yLAogICAgICAgICAgdmFsdWUpOwogICAgICBFeHByZXNzaW9uIHdyaXRlID0gX2NyZWF0ZVdyaXRlKAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpLAogICAgICAgICAgYmluYXJ5LAogICAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCwKICAgICAgICAgIHJlYWRPbmx5UmVjZWl2ZXI6IHRydWUpOwogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZUV4dGVuc2lvbih2YXJpYWJsZSwgd3JpdGUpLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEV4dGVuc2lvblNldChleHRlbnNpb24sIGV4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICAgIHJlY2VpdmVyLCB0YXJnZXROYW1lLCByZWFkVGFyZ2V0LCBiaW5hcnlPcGVyYXRvciwgdmFsdWUsIHdyaXRlVGFyZ2V0LAogICAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogZmFsc2UsCiAgICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgICAgcmVhZE9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICAgIGJpbmFyeU9mZnNldDogb2Zmc2V0LAogICAgICAgICAgd3JpdGVPZmZzZXQ6IGZpbGVPZmZzZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQgPSBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dCA9IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IF9mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpOwogICAgaWYgKHZvaWRDb250ZXh0KSB7CiAgICAgIHJldHVybiBidWlsZENvbXBvdW5kQXNzaWdubWVudChiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0LCBpc1Bvc3RJbmNEZWM6IHRydWUpOwogICAgfSBlbHNlIGlmIChpc051bGxBd2FyZSkgewogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0KICAgICAgICAgIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShyZWNlaXZlcik7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZCA9IF9oZWxwZXIuZm9yZXN0CiAgICAgICAgICAuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKF9jcmVhdGVSZWFkKAogICAgICAgICAgICAgIF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIHJlY2VpdmVyLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGZvck51bGxHdWFyZGVkQWNjZXNzOiB0cnVlKSkpOwogICAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeShvZmZzZXQsCiAgICAgICAgICBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHJlYWQsIGZpbGVPZmZzZXQpLCBiaW5hcnlPcGVyYXRvciwgdmFsdWUpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAgIC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUoX2NyZWF0ZVdyaXRlKAogICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgcmVjZWl2ZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpLAogICAgICAgICAgICAgIGJpbmFyeSwKICAgICAgICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgICAgICAgIHJlYWRPbmx5UmVjZWl2ZXI6IHRydWUpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpOwogICAgICByZXR1cm4gbmV3IE51bGxBd2FyZUV4dGVuc2lvbigKICAgICAgICAgIHZhcmlhYmxlLCBuZXcgTG9jYWxQb3N0SW5jRGVjKHJlYWQsIHdyaXRlKS4uZmlsZU9mZnNldCA9IG9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9CiAgICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWQgPSBfaGVscGVyLmZvcmVzdAogICAgICAgICAgLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShfY3JlYXRlUmVhZCgKICAgICAgICAgICAgICBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlLCByZWNlaXZlci5maWxlT2Zmc2V0KSkpOwogICAgICBFeHByZXNzaW9uIGJpbmFyeSA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUJpbmFyeShvZmZzZXQsCiAgICAgICAgICBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHJlYWQsIGZpbGVPZmZzZXQpLCBiaW5hcnlPcGVyYXRvciwgdmFsdWUpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAgIC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUoX2NyZWF0ZVdyaXRlKGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgcmVjZWl2ZXIuZmlsZU9mZnNldCksIGJpbmFyeSwKICAgICAgICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LCByZWFkT25seVJlY2VpdmVyOiB0cnVlKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KTsKICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVBvc3RJbmNEZWModmFyaWFibGUsIHJlYWQsIHdyaXRlKS4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVjZWl2ZXJWYXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXJFeHByZXNzaW9uID0gcmVjZWl2ZXI7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgcmVjZWl2ZXJWYXJpYWJsZSA9CiAgICAgICAgICBfaGVscGVyLmZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZWNlaXZlckV4cHJlc3Npb24gPSBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KAogICAgICAgICAgcmVjZWl2ZXJWYXJpYWJsZSwgcmVjZWl2ZXJWYXJpYWJsZS5maWxlT2Zmc2V0LAogICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpOwogICAgfQogICAgRXhwcmVzc2lvbiBpbnZvY2F0aW9uOwogICAgaWYgKGludm9rZVRhcmdldCAhPSBudWxsKSB7CiAgICAgIGludm9jYXRpb24gPSBfaGVscGVyLmJ1aWxkRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBpbnZva2VUYXJnZXQsCiAgICAgICAgICBfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50c0ZvckV4dGVuc2lvbk1ldGhvZCgKICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgIGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgICAgICAgICBpbnZva2VUYXJnZXQuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoIC0KICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50LAogICAgICAgICAgICAgIHJlY2VpdmVyRXhwcmVzc2lvbiwKICAgICAgICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRzOiBfY3JlYXRlRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cygpLAogICAgICAgICAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldDogZXh0ZW5zaW9uVHlwZUFyZ3VtZW50T2Zmc2V0LAogICAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IGFyZ3VtZW50cy50eXBlcywKICAgICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzOiBhcmd1bWVudHMucG9zaXRpb25hbCwKICAgICAgICAgICAgICBuYW1lZEFyZ3VtZW50czogYXJndW1lbnRzLm5hbWVkKSwKICAgICAgICAgIGlzVGVhck9mZjogZmFsc2UpOwogICAgfSBlbHNlIHsKICAgICAgaW52b2NhdGlvbiA9IF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25JbnZvY2F0aW9uKAogICAgICAgICAgYWRqdXN0Rm9ySW1wbGljaXRDYWxsKF9wbGFpbk5hbWVGb3JSZWFkLCBvZmZzZXQpLAogICAgICAgICAgX2NyZWF0ZVJlYWQocmVjZWl2ZXJFeHByZXNzaW9uKSwKICAgICAgICAgIGFyZ3VtZW50cyk7CiAgICB9CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgYXNzZXJ0KHJlY2VpdmVyVmFyaWFibGUgIT0gbnVsbCk7CiAgICAgIHJldHVybiBuZXcgTnVsbEF3YXJlRXh0ZW5zaW9uKHJlY2VpdmVyVmFyaWFibGUsIGludm9jYXRpb24pCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbnZvY2F0aW9uOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIHRhcmdldE5hbWU6ICIpOwogICAgc2luay53cml0ZSh0YXJnZXROYW1lKTsKICAgIHNpbmsud3JpdGUoIiwgcmVhZFRhcmdldDogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbihyZWFkVGFyZ2V0LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCB3cml0ZVRhcmdldDogIik7CiAgICBwcmludFF1YWxpZmllZE5hbWVPbih3cml0ZVRhcmdldCwgc2luaywgc3ludGhldGljTmFtZXM6IHN5bnRoZXRpY05hbWVzKTsKICB9Cn0KCmNsYXNzIEV4cGxpY2l0RXh0ZW5zaW9uSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgLy8vIFRoZSBmaWxlIG9mZnNldCB1c2VkIGZvciB0aGUgZXhwbGljaXQgZXh0ZW5zaW9uIGFwcGxpY2F0aW9uIHR5cGUKICAvLy8gYXJndW1lbnRzLgogIGZpbmFsIGludCBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQ7CgogIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb247CgogIC8vLyBUaGUgc3RhdGljIFtNZW1iZXJdIGdlbmVyYXRlZCBmb3IgdGhlIFtdIG9wZXJhdGlvbi4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgYG51bGxgIGlmIHRoZSBleHRlbnNpb24gZG9lc24ndCBoYXZlIGFuIFtdIG1ldGhvZC4KICBmaW5hbCBQcm9jZWR1cmUgcmVhZFRhcmdldDsKCiAgLy8vIFRoZSBzdGF0aWMgW01lbWJlcl0gZ2VuZXJhdGVkIGZvciB0aGUgW109IG9wZXJhdGlvbi4KICAvLy8KICAvLy8gVGhpcyBjYW4gYmUgYG51bGxgIGlmIHRoZSBleHRlbnNpb24gZG9lc24ndCBoYXZlIGFuIFtdPSBtZXRob2QuCiAgZmluYWwgUHJvY2VkdXJlIHdyaXRlVGFyZ2V0OwoKICAvLy8gVGhlIGV4cHJlc3Npb24gaG9sZGluZyB0aGUgcmVjZWl2ZXIgdmFsdWUgZm9yIHRoZSBleHBsaWNpdCBleHRlbnNpb24KICAvLy8gYWNjZXNzLCB0aGF0IGlzLCBgYWAgaW4gYEV4dGVuc2lvbjxpbnQ+KGEpW2luZGV4XWAuCiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlcjsKCiAgLy8vIFRoZSBpbmRleCBleHByZXNzaW9uOwogIGZpbmFsIEV4cHJlc3Npb24gaW5kZXg7CgogIC8vLyBUaGUgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBwYXNzZWQgdG8gdGhlIGV4cGxpY2l0IGV4dGVuc2lvbiBhY2Nlc3MsCiAgLy8vIGxpa2UgYDxpbnQ+YCBpbiBgRXh0ZW5zaW9uPGludD4oYSlbYl1gLgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IGV4cGxpY2l0VHlwZUFyZ3VtZW50czsKCiAgLy8vIFRoZSBudW1iZXIgb2YgdHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIG9uIHRoZSBleHRlbnNpb24gZGVjbGFyYXRpb24uCiAgZmluYWwgaW50IGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudDsKCiAgZmluYWwgYm9vbCBpc051bGxBd2FyZTsKCiAgRXhwbGljaXRFeHRlbnNpb25JbmRleGVkQWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZXh0ZW5zaW9uVHlwZUFyZ3VtZW50T2Zmc2V0LAogICAgICB0aGlzLmV4dGVuc2lvbiwKICAgICAgdGhpcy5yZWFkVGFyZ2V0LAogICAgICB0aGlzLndyaXRlVGFyZ2V0LAogICAgICB0aGlzLnJlY2VpdmVyLAogICAgICB0aGlzLmluZGV4LAogICAgICB0aGlzLmV4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5leHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsCiAgICAgIHt0aGlzLmlzTnVsbEF3YXJlfSkKICAgICAgOiBhc3NlcnQocmVhZFRhcmdldCAhPSBudWxsIHx8IHdyaXRlVGFyZ2V0ICE9IG51bGwpLAogICAgICAgIGFzc2VydChyZWNlaXZlciAhPSBudWxsKSwKICAgICAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCksCiAgICAgICAgc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIGZhY3RvcnkgRXhwbGljaXRFeHRlbnNpb25JbmRleGVkQWNjZXNzR2VuZXJhdG9yLmZyb21CdWlsZGVyKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIGludCBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQsCiAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24sCiAgICAgIEJ1aWxkZXIgZ2V0dGVyQnVpbGRlciwKICAgICAgQnVpbGRlciBzZXR0ZXJCdWlsZGVyLAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBFeHByZXNzaW9uIGluZGV4LAogICAgICBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgIGludCBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgUHJvY2VkdXJlIHJlYWRUYXJnZXQ7CiAgICBpZiAoZ2V0dGVyQnVpbGRlciAhPSBudWxsKSB7CiAgICAgIGlmIChnZXR0ZXJCdWlsZGVyIGlzIEFjY2Vzc0Vycm9yQnVpbGRlcikgewogICAgICAgIEFjY2Vzc0Vycm9yQnVpbGRlciBlcnJvciA9IGdldHRlckJ1aWxkZXI7CiAgICAgICAgZ2V0dGVyQnVpbGRlciA9IGVycm9yLmJ1aWxkZXI7CiAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgc2VlIGFuIGFjY2VzcyBlcnJvciBoZXJlIGlmIHdlJ3ZlIGxvb2tlZCB1cCBhIHNldHRlcgogICAgICAgIC8vIHdoZW4gbm90IGV4cGxpY2l0bHkgbG9va2luZyBmb3IgYSBzZXR0ZXIuCiAgICAgICAgYXNzZXJ0KGdldHRlckJ1aWxkZXIgaXMgTWVtYmVyQnVpbGRlcik7CiAgICAgIH0gZWxzZSBpZiAoZ2V0dGVyQnVpbGRlciBpcyBNZW1iZXJCdWlsZGVyKSB7CiAgICAgICAgTWVtYmVyQnVpbGRlciBwcm9jZWR1cmVCdWlsZGVyID0gZ2V0dGVyQnVpbGRlcjsKICAgICAgICByZWFkVGFyZ2V0ID0gcHJvY2VkdXJlQnVpbGRlci5tZW1iZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICAgIiR7Z2V0dGVyQnVpbGRlci5ydW50aW1lVHlwZX0iLAogICAgICAgICAgICAiSW5zdGFuY2VFeHRlbnNpb25BY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIiLAogICAgICAgICAgICBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICAgIGhlbHBlci51cmkpOwogICAgICB9CiAgICB9CiAgICBQcm9jZWR1cmUgd3JpdGVUYXJnZXQ7CiAgICBpZiAoc2V0dGVyQnVpbGRlciBpcyBNZW1iZXJCdWlsZGVyKSB7CiAgICAgIE1lbWJlckJ1aWxkZXIgbWVtYmVyQnVpbGRlciA9IHNldHRlckJ1aWxkZXI7CiAgICAgIHdyaXRlVGFyZ2V0ID0gbWVtYmVyQnVpbGRlci5tZW1iZXI7CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cGxpY2l0RXh0ZW5zaW9uSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgICBoZWxwZXIsCiAgICAgICAgdG9rZW4sCiAgICAgICAgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50T2Zmc2V0LAogICAgICAgIGV4dGVuc2lvbiwKICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgIHdyaXRlVGFyZ2V0LAogICAgICAgIHJlY2VpdmVyLAogICAgICAgIGluZGV4LAogICAgICAgIGV4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IF9jcmVhdGVFeHRlbnNpb25UeXBlQXJndW1lbnRzKCkgewogICAgcmV0dXJuIGV4cGxpY2l0VHlwZUFyZ3VtZW50cyA/PyBjb25zdCA8RGFydFR5cGU+W107CiAgfQoKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+ICJbXSI7CgogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiRXhwbGljaXRFeHRlbnNpb25JbmRleGVkQWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICBpZiAocmVhZFRhcmdldCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfbWFrZUludmFsaWRSZWFkKCk7CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwogICAgRXhwcmVzc2lvbiByZWNlaXZlclZhbHVlOwogICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgIHZhcmlhYmxlID0gX2ZvcmVzdC5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRm9yVmFsdWUocmVjZWl2ZXIpOwogICAgICByZWNlaXZlclZhbHVlID0gX2hlbHBlci5jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSwgZmlsZU9mZnNldCwKICAgICAgICAgIGZvck51bGxHdWFyZGVkQWNjZXNzOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlcjsKICAgIH0KICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gX2hlbHBlci5idWlsZEV4dGVuc2lvbk1ldGhvZEludm9jYXRpb24oCiAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgIF9mb3Jlc3QuY3JlYXRlQXJndW1lbnRzRm9yRXh0ZW5zaW9uTWV0aG9kKAogICAgICAgICAgICBmaWxlT2Zmc2V0LCBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsIDAsIHJlY2VpdmVyVmFsdWUsCiAgICAgICAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudHM6IF9jcmVhdGVFeHRlbnNpb25UeXBlQXJndW1lbnRzKCksCiAgICAgICAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldDogZXh0ZW5zaW9uVHlwZUFyZ3VtZW50T2Zmc2V0LAogICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzOiA8RXhwcmVzc2lvbj5baW5kZXhdKSwKICAgICAgICBpc1RlYXJPZmY6IGZhbHNlKTsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICByZXN1bHQgPSBuZXcgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbih2YXJpYWJsZSwgcmVzdWx0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgaWYgKHdyaXRlVGFyZ2V0ID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9tYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyVmFsdWU7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgdmFyaWFibGUgPSBfZm9yZXN0LmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShyZWNlaXZlcik7CiAgICAgIHJlY2VpdmVyVmFsdWUgPSBfaGVscGVyLmNyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlLCBmaWxlT2Zmc2V0LAogICAgICAgICAgZm9yTnVsbEd1YXJkZWRBY2Nlc3M6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyOwogICAgfQogICAgRXhwcmVzc2lvbiByZXN1bHQ7CiAgICBpZiAodm9pZENvbnRleHQpIHsKICAgICAgcmVzdWx0ID0gX2hlbHBlci5idWlsZEV4dGVuc2lvbk1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgd3JpdGVUYXJnZXQsCiAgICAgICAgICBfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50c0ZvckV4dGVuc2lvbk1ldGhvZCgKICAgICAgICAgICAgICBmaWxlT2Zmc2V0LCBleHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnQsIDAsIHJlY2VpdmVyVmFsdWUsCiAgICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50czogX2NyZWF0ZUV4dGVuc2lvblR5cGVBcmd1bWVudHMoKSwKICAgICAgICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQ6IGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldCwKICAgICAgICAgICAgICBwb3NpdGlvbmFsQXJndW1lbnRzOiA8RXhwcmVzc2lvbj5baW5kZXgsIHZhbHVlXSksCiAgICAgICAgICBpc1RlYXJPZmY6IGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBFeHRlbnNpb25JbmRleFNldChleHRlbnNpb24sIGV4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICAgIHJlY2VpdmVyVmFsdWUsIHdyaXRlVGFyZ2V0LCBpbmRleCwgdmFsdWUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0KICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICByZXN1bHQgPSBuZXcgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbih2YXJpYWJsZSwgcmVzdWx0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXJWYWx1ZTsKICAgIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICB2YXJpYWJsZSA9IF9mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIGZpbGVPZmZzZXQsCiAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSk7CiAgICAgIHJlYWRPbmx5UmVjZWl2ZXIgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyOwogICAgICByZWFkT25seVJlY2VpdmVyID0gZmFsc2U7CiAgICB9CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBJZk51bGxFeHRlbnNpb25JbmRleFNldCgKICAgICAgICBleHRlbnNpb24sCiAgICAgICAgZXhwbGljaXRUeXBlQXJndW1lbnRzLAogICAgICAgIHJlY2VpdmVyVmFsdWUsCiAgICAgICAgcmVhZFRhcmdldCwKICAgICAgICB3cml0ZVRhcmdldCwKICAgICAgICBpbmRleCwKICAgICAgICB2YWx1ZSwKICAgICAgICByZWFkT2Zmc2V0OiBmaWxlT2Zmc2V0LAogICAgICAgIHRlc3RPZmZzZXQ6IG9mZnNldCwKICAgICAgICB3cml0ZU9mZnNldDogZmlsZU9mZnNldCwKICAgICAgICBmb3JFZmZlY3Q6IHZvaWRDb250ZXh0LAogICAgICAgIHJlYWRPbmx5UmVjZWl2ZXI6IHJlYWRPbmx5UmVjZWl2ZXIpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICByZXN1bHQgPSBuZXcgTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbih2YXJpYWJsZSwgcmVzdWx0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXJWYWx1ZTsKICAgIGJvb2wgcmVhZE9ubHlSZWNlaXZlcjsKICAgIGlmIChpc051bGxBd2FyZSkgewogICAgICB2YXJpYWJsZSA9IF9mb3Jlc3QuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkZvclZhbHVlKHJlY2VpdmVyKTsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IF9oZWxwZXIuY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUsIGZpbGVPZmZzZXQsCiAgICAgICAgICBmb3JOdWxsR3VhcmRlZEFjY2VzczogdHJ1ZSk7CiAgICAgIHJlYWRPbmx5UmVjZWl2ZXIgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXJWYWx1ZSA9IHJlY2VpdmVyOwogICAgICByZWFkT25seVJlY2VpdmVyID0gZmFsc2U7CiAgICB9CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBDb21wb3VuZEV4dGVuc2lvbkluZGV4U2V0KAogICAgICAgIGV4dGVuc2lvbiwKICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgcmVjZWl2ZXJWYWx1ZSwKICAgICAgICByZWFkVGFyZ2V0LAogICAgICAgIHdyaXRlVGFyZ2V0LAogICAgICAgIGluZGV4LAogICAgICAgIGJpbmFyeU9wZXJhdG9yLAogICAgICAgIHZhbHVlLAogICAgICAgIHJlYWRPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgYmluYXJ5T2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgd3JpdGVPZmZzZXQ6IGZpbGVPZmZzZXQsCiAgICAgICAgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCwKICAgICAgICBmb3JQb3N0SW5jRGVjOiBpc1Bvc3RJbmNEZWMsCiAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogcmVhZE9ubHlSZWNlaXZlcik7CiAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgcmVzdWx0ID0gbmV3IE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24odmFyaWFibGUsIHJlc3VsdCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBfZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0LCAxKTsKICAgIHJldHVybiBidWlsZENvbXBvdW5kQXNzaWdubWVudChiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwgaXNQb3N0SW5jRGVjOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLmZvcmVzdAogICAgICAgIC5jcmVhdGVFeHByZXNzaW9uSW52b2NhdGlvbihvZmZzZXQsIGJ1aWxkU2ltcGxlUmVhZCgpLCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgTmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcyA9IG5ldyBOYW1lU3lzdGVtKCk7CiAgICBzaW5rLndyaXRlKCIsIGluZGV4OiAiKTsKICAgIHByaW50Tm9kZU9uKGluZGV4LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCByZWFkVGFyZ2V0OiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHJlYWRUYXJnZXQsIHNpbmssIHN5bnRoZXRpY05hbWVzOiBzeW50aGV0aWNOYW1lcyk7CiAgICBzaW5rLndyaXRlKCIsIHdyaXRlVGFyZ2V0OiAiKTsKICAgIHByaW50UXVhbGlmaWVkTmFtZU9uKHdyaXRlVGFyZ2V0LCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKLy8vIEEgW0V4cGxpY2l0RXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yXSByZXByZXNlbnRzIGEgc3ViZXhwcmVzc2lvbiB3aG9zZQovLy8gcHJlZml4IGlzIGFuIGV4cGxpY2l0IGV4dGVuc2lvbiBhcHBsaWNhdGlvbi4KLy8vCi8vLyBGb3IgaW5zdGFuY2UKLy8vCi8vLyAgIGNsYXNzIEE8VD4ge30KLy8vICAgZXh0ZW5zaW9uIEIgb24gQTxpbnQ+IHsKLy8vICAgICBtZXRob2QoKSB7fQovLy8gICB9Ci8vLyAgIGV4dGVuc2lvbiBDPFQ+IG9uIEE8VD4gewovLy8gICAgIFQgZ2V0IGZpZWxkID0+IDA7Ci8vLyAgICAgc2V0IGZpZWxkKFQgXykge30KLy8vICAgfQovLy8KLy8vICAgbWV0aG9kKEEgYSkgewovLy8gICAgIEIoYSkubWV0aG9kOyAgICAgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYEIoYSlgLgovLy8gICAgIEIoYSkubWV0aG9kKCk7ICAgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYEIoYSlgLgovLy8gICAgIEM8aW50PihhKS5maWVsZDsgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYEM8aW50PihhKWAuCi8vLyAgICAgQyhhKS5maWVsZCA9IDA7ICAvLyB0aGlzIGdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgQyhhKWAuCi8vLyAgIH0KLy8vCi8vLyBXaGVuIGFuIGFjY2VzcyBpcyBwZXJmb3JtZWQgb24gdGhpcyBnZW5lcmF0b3IgYQovLy8gW0V4cGxpY2l0RXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3JdIGlzIGNyZWF0ZWQuCmNsYXNzIEV4cGxpY2l0RXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXI7CiAgZmluYWwgRXhwcmVzc2lvbiByZWNlaXZlcjsKICBmaW5hbCBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHM7CgogIEV4cGxpY2l0RXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwKICAgICAgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZXh0ZW5zaW9uQnVpbGRlciwKICAgICAgdGhpcy5yZWNlaXZlciwKICAgICAgdGhpcy5leHBsaWNpdFR5cGVBcmd1bWVudHMpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJFeHBsaWNpdEV4dGVuc2lvbkFjY2Vzc0dlbmVyYXRvci5wbGFpbk5hbWVGb3JSZWFkIiwgZmlsZU9mZnNldCwgX3VyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIkV4cGxpY2l0RXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkUmVhZCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRJZk51bGxBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRSZWFkKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkUmVhZCgpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRSZWFkKCk7CiAgfQoKICBHZW5lcmF0b3IgX2NyZWF0ZUluc3RhbmNlQWNjZXNzKFRva2VuIHRva2VuLCBOYW1lIG5hbWUsCiAgICAgIHtib29sIGlzTnVsbEF3YXJlOiBmYWxzZX0pIHsKICAgIEJ1aWxkZXIgZ2V0dGVyID0gZXh0ZW5zaW9uQnVpbGRlci5sb29rdXBMb2NhbE1lbWJlckJ5TmFtZShuYW1lKTsKICAgIGlmIChnZXR0ZXIgIT0gbnVsbCAmJiAoZ2V0dGVyLmlzU3RhdGljIHx8IGdldHRlci5pc0ZpZWxkKSkgewogICAgICBnZXR0ZXIgPSBudWxsOwogICAgfQogICAgQnVpbGRlciBzZXR0ZXIgPQogICAgICAgIGV4dGVuc2lvbkJ1aWxkZXIubG9va3VwTG9jYWxNZW1iZXJCeU5hbWUobmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgIGlmIChzZXR0ZXIgIT0gbnVsbCAmJiBzZXR0ZXIuaXNTdGF0aWMpIHsKICAgICAgc2V0dGVyID0gbnVsbDsKICAgIH0KICAgIGlmIChnZXR0ZXIgPT0gbnVsbCAmJiBzZXR0ZXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBuYW1lKTsKICAgIH0KICAgIHJldHVybiBuZXcgRXhwbGljaXRFeHRlbnNpb25JbnN0YW5jZUFjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcigKICAgICAgICBfaGVscGVyLAogICAgICAgIHRva2VuLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcHJvdmUgdGhpcy4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uCiAgICAgICAgLy8gYW5kIG5vdCB0aGUgdHlwZSBhcmd1bWVudHMgKG9yIGFyZ3VtZW50cyBpZiB0eXBlIGFyZ3VtZW50cyBhcmUKICAgICAgICAvLyBvbWl0dGVkKS4KICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgIGV4dGVuc2lvbkJ1aWxkZXIuZXh0ZW5zaW9uLAogICAgICAgIG5hbWUsCiAgICAgICAgZ2V0dGVyLAogICAgICAgIHNldHRlciwKICAgICAgICByZWNlaXZlciwKICAgICAgICBleHBsaWNpdFR5cGVBcmd1bWVudHMsCiAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDAsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3Igc2VuZCwgaW50IG9wZXJhdG9yT2Zmc2V0LCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgX2hlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIGZpbGVPZmZzZXQsIHRva2VuLmxlbmd0aCk7CiAgICB9CiAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yID0KICAgICAgICBfY3JlYXRlSW5zdGFuY2VBY2Nlc3Moc2VuZC50b2tlbiwgc2VuZC5uYW1lLCBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogICAgaWYgKHNlbmQuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5kb0ludm9jYXRpb24ob2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksIHNlbmQuYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3I7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBidWlsZEJpbmFyeU9wZXJhdGlvbihUb2tlbiB0b2tlbiwgTmFtZSBiaW5hcnlOYW1lLCBFeHByZXNzaW9uIHJpZ2h0KSB7CiAgICBpbnQgZmlsZU9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgIEdlbmVyYXRvciBnZW5lcmF0b3IgPSBfY3JlYXRlSW5zdGFuY2VBY2Nlc3ModG9rZW4sIGJpbmFyeU5hbWUpOwogICAgcmV0dXJuIGdlbmVyYXRvci5kb0ludm9jYXRpb24oCiAgICAgICAgZmlsZU9mZnNldCwgX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHMoZmlsZU9mZnNldCwgPEV4cHJlc3Npb24+W3JpZ2h0XSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYnVpbGRVbmFyeU9wZXJhdGlvbihUb2tlbiB0b2tlbiwgTmFtZSB1bmFyeU5hbWUpIHsKICAgIGludCBmaWxlT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgR2VuZXJhdG9yIGdlbmVyYXRvciA9IF9jcmVhdGVJbnN0YW5jZUFjY2Vzcyh0b2tlbiwgdW5hcnlOYW1lKTsKICAgIHJldHVybiBnZW5lcmF0b3IuZG9JbnZvY2F0aW9uKAogICAgICAgIGZpbGVPZmZzZXQsIF9mb3Jlc3QuY3JlYXRlQXJndW1lbnRzRW1wdHkoZmlsZU9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIEdlbmVyYXRvciBnZW5lcmF0b3IgPSBfY3JlYXRlSW5zdGFuY2VBY2Nlc3ModG9rZW4sIGNhbGxOYW1lKTsKICAgIHJldHVybiBnZW5lcmF0b3IuZG9JbnZvY2F0aW9uKG9mZnNldCwgYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkUmVhZCgpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkUHJvYmxlbShtZXNzYWdlRXhwbGljaXRFeHRlbnNpb25Bc0V4cHJlc3Npb24sCiAgICAgICAgZmlsZU9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2VFeHBsaWNpdEV4dGVuc2lvbkFzTHZhbHVlLCBmaWxlT2Zmc2V0LCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICBCdWlsZGVyIGdldHRlciA9IGV4dGVuc2lvbkJ1aWxkZXIubG9va3VwTG9jYWxNZW1iZXJCeU5hbWUoaW5kZXhHZXROYW1lKTsKICAgIEJ1aWxkZXIgc2V0dGVyID0gZXh0ZW5zaW9uQnVpbGRlci5sb29rdXBMb2NhbE1lbWJlckJ5TmFtZShpbmRleFNldE5hbWUpOwogICAgaWYgKGdldHRlciA9PSBudWxsICYmIHNldHRlciA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGluZGV4R2V0TmFtZSk7CiAgICB9CgogICAgcmV0dXJuIG5ldyBFeHBsaWNpdEV4dGVuc2lvbkluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IuZnJvbUJ1aWxkZXIoCiAgICAgICAgX2hlbHBlciwKICAgICAgICB0b2tlbiwKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXByb3ZlIHRoaXMuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbgogICAgICAgIC8vIGFuZCBub3QgdGhlIHR5cGUgYXJndW1lbnRzIChvciBhcmd1bWVudHMgaWYgdHlwZSBhcmd1bWVudHMgYXJlCiAgICAgICAgLy8gb21pdHRlZCkuCiAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICBleHRlbnNpb25CdWlsZGVyLmV4dGVuc2lvbiwKICAgICAgICBnZXR0ZXIsCiAgICAgICAgc2V0dGVyLAogICAgICAgIHJlY2VpdmVyLAogICAgICAgIGluZGV4LAogICAgICAgIGV4cGxpY2l0VHlwZUFyZ3VtZW50cywKICAgICAgICBleHRlbnNpb25CdWlsZGVyLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBleHRlbnNpb25CdWlsZGVyOiAiKTsKICAgIHNpbmsud3JpdGUoZXh0ZW5zaW9uQnVpbGRlcik7CiAgICBzaW5rLndyaXRlKCIsIHJlY2VpdmVyOiAiKTsKICAgIHNpbmsud3JpdGUocmVjZWl2ZXIpOwogIH0KfQoKY2xhc3MgTG9hZExpYnJhcnlHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogIGZpbmFsIExvYWRMaWJyYXJ5QnVpbGRlciBidWlsZGVyOwoKICBMb2FkTGlicmFyeUdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLmJ1aWxkZXIpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gJ2xvYWRMaWJyYXJ5JzsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJMb2FkTGlicmFyeUdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgYnVpbGRlci5pbXBvcnREZXBlbmRlbmN5LnRhcmdldExpYnJhcnk7CiAgICBMb2FkTGlicmFyeVRlYXJPZmYgcmVhZCA9IG5ldyBMb2FkTGlicmFyeVRlYXJPZmYoCiAgICAgICAgYnVpbGRlci5pbXBvcnREZXBlbmRlbmN5LCBidWlsZGVyLmNyZWF0ZVRlYXJvZmZNZXRob2QoX2hlbHBlci5mb3Jlc3QpKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgcmV0dXJuIHJlYWQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiByZWFkID0gYnVpbGRTaW1wbGVSZWFkKCk7CiAgICBFeHByZXNzaW9uIHdyaXRlID0gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogICAgcmV0dXJuIG5ldyBJZk51bGxTZXQocmVhZCwgd3JpdGUsIGZvckVmZmVjdDogdm9pZENvbnRleHQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gYmluYXJ5ID0gX2hlbHBlci5mb3Jlc3QKICAgICAgICAuY3JlYXRlQmluYXJ5KG9mZnNldCwgYnVpbGRTaW1wbGVSZWFkKCksIGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSk7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUoYmluYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0ID0gVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQgPSBmYWxzZX0pIHsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBfZm9yZXN0LmNyZWF0ZUludExpdGVyYWwob2Zmc2V0LCAxKTsKICAgIHJldHVybiBidWlsZENvbXBvdW5kQXNzaWdubWVudChiaW5hcnlPcGVyYXRvciwgdmFsdWUsCiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwgaXNQb3N0SW5jRGVjOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChfZm9yZXN0LmFyZ3VtZW50c1Bvc2l0aW9uYWwoYXJndW1lbnRzKS5sZW5ndGggPiAwIHx8CiAgICAgICAgX2ZvcmVzdC5hcmd1bWVudHNOYW1lZChhcmd1bWVudHMpLmxlbmd0aCA+IDApIHsKICAgICAgX2hlbHBlci5hZGRQcm9ibGVtRXJyb3JJZkNvbnN0KAogICAgICAgICAgbWVzc2FnZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50cywgb2Zmc2V0LCAnbG9hZExpYnJhcnknLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci5jcmVhdGVMb2FkTGlicmFyeShvZmZzZXQsIF9mb3Jlc3QsIGFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBHZW5lcmF0b3IgYnVpbGRJbmRleGVkQWNjZXNzKEV4cHJlc3Npb24gaW5kZXgsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc051bGxBd2FyZX0pIHsKICAgIGFzc2VydChpc051bGxBd2FyZSAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihfaGVscGVyLCB0b2tlbiwgYnVpbGRTaW1wbGVSZWFkKCksIGluZGV4LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIGJ1aWxkZXI6ICIpOwogICAgc2luay53cml0ZShidWlsZGVyKTsKICB9Cn0KCmNsYXNzIERlZmVycmVkQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBQcmVmaXhVc2VHZW5lcmF0b3IgcHJlZml4R2VuZXJhdG9yOwoKICBmaW5hbCBHZW5lcmF0b3Igc3VmZml4R2VuZXJhdG9yOwoKICBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMucHJlZml4R2VuZXJhdG9yLCB0aGlzLnN1ZmZpeEdlbmVyYXRvcikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKHN1ZmZpeEdlbmVyYXRvci5idWlsZFNpbXBsZVJlYWQoKSwKICAgICAgICBwcmVmaXhHZW5lcmF0b3IucHJlZml4LCB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmJ1aWxkQXNzaWdubWVudCh2YWx1ZSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KSwKICAgICAgICBwcmVmaXhHZW5lcmF0b3IucHJlZml4LAogICAgICAgIHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9oZWxwZXIud3JhcEluRGVmZXJyZWRDaGVjaygKICAgICAgICBzdWZmaXhHZW5lcmF0b3IuYnVpbGRJZk51bGxBc3NpZ25tZW50KHZhbHVlLCB0eXBlLCBvZmZzZXQsCiAgICAgICAgICAgIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCksCiAgICAgICAgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwKICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGJpbmFyeU9wZXJhdG9yLCB2YWx1ZSwKICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgICAgIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCwKICAgICAgICAgICAgaXNQcmVJbmNEZWM6IGlzUHJlSW5jRGVjLAogICAgICAgICAgICBpc1Bvc3RJbmNEZWM6IGlzUG9zdEluY0RlYyksCiAgICAgICAgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwKICAgICAgICB0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX2hlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKAogICAgICAgIHN1ZmZpeEdlbmVyYXRvci5idWlsZFBvc3RmaXhJbmNyZW1lbnQoYmluYXJ5T3BlcmF0b3IsCiAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpLAogICAgICAgIHByZWZpeEdlbmVyYXRvci5wcmVmaXgsCiAgICAgICAgdG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIE9iamVjdCBwcm9wZXJ0eUFjY2VzcyA9CiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmJ1aWxkUHJvcGVydHlBY2Nlc3Moc2VuZCwgb3BlcmF0b3JPZmZzZXQsIGlzTnVsbEF3YXJlKTsKICAgIGlmIChwcm9wZXJ0eUFjY2VzcyBpcyBHZW5lcmF0b3IpIHsKICAgICAgcmV0dXJuIG5ldyBEZWZlcnJlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgIF9oZWxwZXIsIHRva2VuLCBwcmVmaXhHZW5lcmF0b3IsIHByb3BlcnR5QWNjZXNzKTsKICAgIH0gZWxzZSB7CiAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHByb3BlcnR5QWNjZXNzOwogICAgICByZXR1cm4gX2hlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKAogICAgICAgICAgZXhwcmVzc2lvbiwgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwgdG9rZW4uY2hhck9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiZGVmZXJyZWRBY2Nlc3Nvci5wbGFpbk5hbWVGb3JSZWFkIiwgZmlsZU9mZnNldCwgX3VyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIkRlZmVycmVkQWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgVHlwZUJ1aWxkZXIgYnVpbGRUeXBlV2l0aFJlc29sdmVkQXJndW1lbnRzKAogICAgICBOdWxsYWJpbGl0eUJ1aWxkZXIgbnVsbGFiaWxpdHlCdWlsZGVyLCBMaXN0PFVucmVzb2x2ZWRUeXBlPiBhcmd1bWVudHMpIHsKICAgIFN0cmluZyBuYW1lID0gIiR7cHJlZml4R2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkfS4iCiAgICAgICAgIiR7c3VmZml4R2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkfSI7CiAgICBUeXBlQnVpbGRlciB0eXBlID0gc3VmZml4R2VuZXJhdG9yLmJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cygKICAgICAgICBudWxsYWJpbGl0eUJ1aWxkZXIsIGFyZ3VtZW50cyk7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlciAmJgogICAgICAgIHR5cGUuZGVjbGFyYXRpb24gaXMgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHsKICAgICAgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgICBtZXNzYWdlID0gZGVjbGFyYXRpb24ubWVzc2FnZTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4ocHJlZml4R2VuZXJhdG9yLnRva2VuKTsKICAgICAgbWVzc2FnZSA9IHRlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvbgogICAgICAgICAgLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgX2hlbHBlci5idWlsZERhcnRUeXBlKG5ldyBVbnJlc29sdmVkVHlwZSh0eXBlLCBjaGFyT2Zmc2V0LCBfdXJpKSksCiAgICAgICAgICAgICAgcHJlZml4R2VuZXJhdG9yLl9wbGFpbk5hbWVGb3JSZWFkLAogICAgICAgICAgICAgIF9oZWxwZXIubGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkKICAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgX3VyaSwgY2hhck9mZnNldCwgbGVuZ3RoT2ZTcGFuKHByZWZpeEdlbmVyYXRvci50b2tlbiwgdG9rZW4pKTsKICAgIH0KICAgIE5hbWVkVHlwZUJ1aWxkZXIgcmVzdWx0ID0KICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlcihuYW1lLCBudWxsYWJpbGl0eUJ1aWxkZXIsIG51bGwpOwogICAgX2hlbHBlci5saWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCwgbWVzc2FnZS51cmkpOwogICAgcmVzdWx0LmJpbmQocmVzdWx0LmJ1aWxkSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIobWVzc2FnZSkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGRvSW52b2NhdGlvbihpbnQgb2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBPYmplY3Qgc3VmZml4ID0gc3VmZml4R2VuZXJhdG9yLmRvSW52b2NhdGlvbihvZmZzZXQsIGFyZ3VtZW50cyk7CiAgICBpZiAoc3VmZml4IGlzIEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIF9oZWxwZXIud3JhcEluRGVmZXJyZWRDaGVjaygKICAgICAgICAgIHN1ZmZpeCwgcHJlZml4R2VuZXJhdG9yLnByZWZpeCwgZmlsZU9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IERlZmVycmVkQWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgX2hlbHBlciwgdG9rZW4sIHByZWZpeEdlbmVyYXRvciwgc3VmZml4KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW52b2tlQ29uc3RydWN0b3IoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIHJldHVybiBfaGVscGVyLndyYXBJbkRlZmVycmVkQ2hlY2soCiAgICAgICAgc3VmZml4R2VuZXJhdG9yLmludm9rZUNvbnN0cnVjdG9yKHR5cGVBcmd1bWVudHMsIG5hbWUsIGFyZ3VtZW50cywKICAgICAgICAgICAgbmFtZVRva2VuLCBuYW1lTGFzdFRva2VuLCBjb25zdG5lc3MpLAogICAgICAgIHByZWZpeEdlbmVyYXRvci5wcmVmaXgsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oc3VmZml4R2VuZXJhdG9yLnRva2VuKSk7CiAgfQoKICBAb3ZlcnJpZGUKICBHZW5lcmF0b3IgYnVpbGRJbmRleGVkQWNjZXNzKEV4cHJlc3Npb24gaW5kZXgsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc051bGxBd2FyZX0pIHsKICAgIGFzc2VydChpc051bGxBd2FyZSAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihfaGVscGVyLCB0b2tlbiwgYnVpbGRTaW1wbGVSZWFkKCksIGluZGV4LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIHByZWZpeEdlbmVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKHByZWZpeEdlbmVyYXRvcik7CiAgICBzaW5rLndyaXRlKCIsIHN1ZmZpeEdlbmVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKHN1ZmZpeEdlbmVyYXRvcik7CiAgfQp9CgovLy8gW1R5cGVVc2VHZW5lcmF0b3JdIHJlcHJlc2VudHMgdGhlIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzIHRoZSBuYW1lIG9mCi8vLyBhIGNsYXNzLCBlbnVtLCB0eXBlIHZhcmlhYmxlLCB0eXBlZGVmLCBtaXhpbiBkZWNsYXJhdGlvbiwgZXh0ZW5zaW9uCi8vLyBkZWNsYXJhdGlvbiBvciBidWlsdC1pbiB0eXBlLCBsaWtlIGR5bmFtaWMgYW5kIHZvaWQuCi8vLwovLy8gRm9yIGluc3RhbmNlOgovLy8KLy8vICAgY2xhc3MgQTxUPiB7fQovLy8gICB0eXBlZGVmIEIgPSBGdW5jdGlvbigpOwovLy8gICBtaXhpbiBDPFQ+IG9uIEE8VD4ge30KLy8vICAgZXh0ZW5zaW9uIEQ8VD4gb24gQTxUPiB7fQovLy8KLy8vICAgbWV0aG9kPFQ+KCkgewovLy8gICAgIEM8Qj4gICAgICAgIC8vIGEgVHlwZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgQ2AgYW5kIGBCYC4KLy8vICAgICBCIGI7ICAgICAgICAvLyBhIFR5cGVVc2VHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYEJgLgovLy8gICAgIEQuZm9vKCk7ICAgIC8vIGEgVHlwZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgRGAuCi8vLyAgICAgbmV3IEE8VD4oKTsgLy8gYSBUeXBlVXNlR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBBYCBhbmQgYFRgLgovLy8gICAgIFQoKTsgICAgICAgIC8vIGEgVHlwZVVzZUdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgVGAuCi8vLyAgIH0KLy8vCmNsYXNzIFR5cGVVc2VHZW5lcmF0b3IgZXh0ZW5kcyBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciB7CiAgZmluYWwgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbjsKCiAgVHlwZVVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZGVjbGFyYXRpb24sIFN0cmluZyB0YXJnZXROYW1lKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIG51bGwsIHRhcmdldE5hbWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlR5cGVVc2VHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHMoCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIsIExpc3Q8VW5yZXNvbHZlZFR5cGU+IGFyZ3VtZW50cykgewogICAgaWYgKGRlY2xhcmF0aW9uLmlzRXh0ZW5zaW9uKSB7CiAgICAgIC8vIEV4dGVuc2lvbiBkZWNsYXJhdGlvbnMgY2Fubm90IGJlIHVzZWQgYXMgdHlwZXMuCiAgICAgIHJldHVybiBzdXBlcgogICAgICAgICAgLmJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cyhudWxsYWJpbGl0eUJ1aWxkZXIsIGFyZ3VtZW50cyk7CiAgICB9CiAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgaW50IGV4cGVjdGVkID0gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc0NvdW50OwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPSBleHBlY3RlZCkgewogICAgICAgIC8vIEJ1aWxkIHRoZSB0eXBlIGFyZ3VtZW50cyB0byByZXBvcnQgYW55IGVycm9ycyB0aGV5IG1heSBoYXZlLgogICAgICAgIF9oZWxwZXIuYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyhhcmd1bWVudHMpOwogICAgICAgIF9oZWxwZXIud2FyblR5cGVBcmd1bWVudHNNaXNtYXRjaCgKICAgICAgICAgICAgZGVjbGFyYXRpb24ubmFtZSwgZXhwZWN0ZWQsIGZpbGVPZmZzZXQpOwogICAgICAgIC8vIFdlIGlnbm9yZSB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLCB3aGljaCB3aWxsIGluIHR1cm4gcmV0dXJuIHRoZQogICAgICAgIC8vIHJhdyB0eXBlIGJlbG93LgogICAgICAgIC8vIFRPRE8oc2lnbXVuZCk6IGNoYW5nZSB0byB1c2UgYW4gSW52YWxpZFR5cGUgYW5kIGluY2x1ZGUgdGhlIHJhdyB0eXBlCiAgICAgICAgLy8gYXMgYSByZWNvdmVyeSBub2RlIG9uY2UgdGhlIElSIGNhbiByZXByZXNlbnQgaXQgKElzc3VlICMyOTg0MCkuCiAgICAgICAgYXJndW1lbnRzID0gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQgIT0gMCkgewogICAgICBfaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHMKICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzQ291bnQpLAogICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgIGxlbmd0aEZvclRva2VuKHRva2VuKSk7CiAgICB9CgogICAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRCdWlsZGVyczsKICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudEJ1aWxkZXJzID0gbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KGFyZ3VtZW50cy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50QnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcmd1bWVudEJ1aWxkZXJzW2ldID0KICAgICAgICAgICAgX2hlbHBlci52YWxpZGF0ZVR5cGVVc2UoYXJndW1lbnRzW2ldLCBmYWxzZSkuYnVpbGRlcjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBOYW1lZFR5cGVCdWlsZGVyKAogICAgICAgIHRhcmdldE5hbWUsIG51bGxhYmlsaXR5QnVpbGRlciwgYXJndW1lbnRCdWlsZGVycykKICAgICAgLi5iaW5kKGRlY2xhcmF0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gaW52b2tlQ29uc3RydWN0b3IoCiAgICAgIExpc3Q8VW5yZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIFN0cmluZyBuYW1lLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIG5hbWVMYXN0VG9rZW4sCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICAgIGRlY2xhcmF0aW9uLAogICAgICAgIG5hbWVUb2tlbiwKICAgICAgICBuYW1lTGFzdFRva2VuLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVBcmd1bWVudHMsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4obmFtZVRva2VuID8/IHRva2VuKSwKICAgICAgICBjb25zdG5lc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBkZWNsYXJhdGlvbjogIik7CiAgICBzaW5rLndyaXRlKGRlY2xhcmF0aW9uKTsKICAgIHNpbmsud3JpdGUoIiwgcGxhaW5OYW1lRm9yUmVhZDogIik7CiAgICBzaW5rLndyaXRlKF9wbGFpbk5hbWVGb3JSZWFkKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZ2V0IGV4cHJlc3Npb24gewogICAgaWYgKHN1cGVyLmV4cHJlc3Npb24gPT0gbnVsbCkgewogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIpIHsKICAgICAgICBJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHRoaXMuZGVjbGFyYXRpb247CiAgICAgICAgc3VwZXIuZXhwcmVzc2lvbiA9IF9oZWxwZXIuYnVpbGRQcm9ibGVtRXJyb3JJZkNvbnN0KAogICAgICAgICAgICBkZWNsYXJhdGlvbi5tZXNzYWdlLm1lc3NhZ2VPYmplY3QsIGZpbGVPZmZzZXQsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3VwZXIuZXhwcmVzc2lvbiA9IF9mb3Jlc3QuY3JlYXRlVHlwZUxpdGVyYWwoCiAgICAgICAgICAgIG9mZnNldEZvclRva2VuKHRva2VuKSwKICAgICAgICAgICAgX2hlbHBlci5idWlsZERhcnRUeXBlKAogICAgICAgICAgICAgICAgbmV3IFVucmVzb2x2ZWRUeXBlKAogICAgICAgICAgICAgICAgICAgIGJ1aWxkVHlwZVdpdGhSZXNvbHZlZEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgX2hlbHBlci5saWJyYXJ5QnVpbGRlci5ub25OdWxsYWJsZUJ1aWxkZXIsIG51bGwpLAogICAgICAgICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgX3VyaSksCiAgICAgICAgICAgICAgICBub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3I6IHRydWUpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmV4cHJlc3Npb247CiAgfQoKICBAb3ZlcnJpZGUKICBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIC8vIGBTb21lVHlwZT8udG9TdHJpbmdgIGlzIHRoZSBzYW1lIGFzIGBTb21lVHlwZS50b1N0cmluZ2AsIG5vdAogICAgLy8gYChTb21lVHlwZSkudG9TdHJpbmdgLgogICAgaXNOdWxsQXdhcmUgPSBmYWxzZTsKCiAgICBOYW1lIG5hbWUgPSBzZW5kLm5hbWU7CiAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gc2VuZC5hcmd1bWVudHM7CgogICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbkJ1aWxkZXIgPSBkZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbkJ1aWxkZXIgaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICBUeXBlQWxpYXNCdWlsZGVyIGFsaWFzQnVpbGRlciA9IGRlY2xhcmF0aW9uQnVpbGRlcjsKICAgICAgZGVjbGFyYXRpb25CdWlsZGVyID0gYWxpYXNCdWlsZGVyLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbkJ1aWxkZXIgaXMgRGVjbGFyYXRpb25CdWlsZGVyKSB7CiAgICAgIERlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uQnVpbGRlcjsKICAgICAgQnVpbGRlciBtZW1iZXIgPSBkZWNsYXJhdGlvbi5maW5kU3RhdGljQnVpbGRlcigKICAgICAgICAgIG5hbWUubmFtZSwgb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksIF91cmksIF9oZWxwZXIubGlicmFyeUJ1aWxkZXIpOwoKICAgICAgR2VuZXJhdG9yIGdlbmVyYXRvcjsKICAgICAgaWYgKG1lbWJlciA9PSBudWxsKSB7CiAgICAgICAgLy8gSWYgd2UgZmluZCBhIHNldHRlciwgW21lbWJlcl0gaXMgYW4gW0FjY2Vzc0Vycm9yQnVpbGRlcl0sIG5vdCBudWxsLgogICAgICAgIGlmIChzZW5kIGlzIEluY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcikgewogICAgICAgICAgZ2VuZXJhdG9yID0gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKF9oZWxwZXIsIHNlbmQudG9rZW4sIG5hbWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gX2hlbHBlci5idWlsZENvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgICBzZW5kLnRva2VuLAogICAgICAgICAgICAgIHNlbmQudG9rZW4sCiAgICAgICAgICAgICAgYXJndW1lbnRzLAogICAgICAgICAgICAgIG5hbWUubmFtZSwKICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgIHRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgQ29uc3RuZXNzLmltcGxpY2l0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGlzIEFtYmlndW91c0J1aWxkZXIpIHsKICAgICAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgIG1lbWJlci5tZXNzYWdlLCBtZW1iZXIuY2hhck9mZnNldCwgbmFtZS5uYW1lLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQnVpbGRlciBzZXR0ZXI7CiAgICAgICAgaWYgKG1lbWJlci5pc1NldHRlcikgewogICAgICAgICAgc2V0dGVyID0gbWVtYmVyOwogICAgICAgICAgbWVtYmVyID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0dldHRlcikgewogICAgICAgICAgc2V0dGVyID0gZGVjbGFyYXRpb24uZmluZFN0YXRpY0J1aWxkZXIoCiAgICAgICAgICAgICAgbmFtZS5uYW1lLCBmaWxlT2Zmc2V0LCBfdXJpLCBfaGVscGVyLmxpYnJhcnlCdWlsZGVyLAogICAgICAgICAgICAgIGlzU2V0dGVyOiB0cnVlKTsKICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc0ZpZWxkKSB7CiAgICAgICAgICBNZW1iZXJCdWlsZGVyIGZpZWxkQnVpbGRlciA9IG1lbWJlcjsKICAgICAgICAgIGlmICghZmllbGRCdWlsZGVyLmlzQXNzaWduYWJsZSkgewogICAgICAgICAgICBzZXR0ZXIgPSBkZWNsYXJhdGlvbi5maW5kU3RhdGljQnVpbGRlcigKICAgICAgICAgICAgICAgIG5hbWUubmFtZSwgZmlsZU9mZnNldCwgX3VyaSwgX2hlbHBlci5saWJyYXJ5QnVpbGRlciwKICAgICAgICAgICAgICAgIGlzU2V0dGVyOiB0cnVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldHRlciA9IG1lbWJlcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2VuZXJhdG9yID0gbmV3IFN0YXRpY0FjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlcigKICAgICAgICAgICAgX2hlbHBlciwKICAgICAgICAgICAgbmFtZS5uYW1lLAogICAgICAgICAgICBzZW5kLnRva2VuLAogICAgICAgICAgICBtZW1iZXIgaXMgTWVtYmVyQnVpbGRlciA/IG1lbWJlciA6IG51bGwsCiAgICAgICAgICAgIHNldHRlciBpcyBNZW1iZXJCdWlsZGVyID8gc2V0dGVyIDogbnVsbCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBhcmd1bWVudHMgPT0gbnVsbAogICAgICAgICAgPyBnZW5lcmF0b3IKICAgICAgICAgIDogZ2VuZXJhdG9yLmRvSW52b2NhdGlvbihvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzdXBlci5idWlsZFByb3BlcnR5QWNjZXNzKHNlbmQsIG9wZXJhdG9yT2Zmc2V0LCBpc051bGxBd2FyZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKGRlY2xhcmF0aW9uLmlzRXh0ZW5zaW9uKSB7CiAgICAgIEV4dGVuc2lvbkJ1aWxkZXIgZXh0ZW5zaW9uQnVpbGRlciA9IGRlY2xhcmF0aW9uOwogICAgICBpZiAoYXJndW1lbnRzLnBvc2l0aW9uYWwubGVuZ3RoICE9IDEgfHwgYXJndW1lbnRzLm5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZUV4cGxpY2l0RXh0ZW5zaW9uQXJndW1lbnRNaXNtYXRjaCwKICAgICAgICAgICAgZmlsZU9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgICAgfQogICAgICBMaXN0PERhcnRUeXBlPiBleHBsaWNpdFR5cGVBcmd1bWVudHMgPQogICAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKGFyZ3VtZW50cyk7CiAgICAgIGlmIChleHBsaWNpdFR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgIGludCB0eXBlUGFyYW1ldGVyQ291bnQgPSBleHRlbnNpb25CdWlsZGVyLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMDsKICAgICAgICBpZiAoZXhwbGljaXRUeXBlQXJndW1lbnRzLmxlbmd0aCAhPSB0eXBlUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICAgIHJldHVybiBfaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUV4cGxpY2l0RXh0ZW5zaW9uVHlwZUFyZ3VtZW50TWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uQnVpbGRlci5uYW1lLCB0eXBlUGFyYW1ldGVyQ291bnQpLAogICAgICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogQ2hlY2sgYXJndW1lbnQgYW5kIHR5cGUgYXJndW1lbnQgY291bnQuCiAgICAgIHJldHVybiBuZXcgRXhwbGljaXRFeHRlbnNpb25BY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGRlY2xhcmF0aW9uLAogICAgICAgICAgYXJndW1lbnRzLnBvc2l0aW9uYWwuc2luZ2xlLCBleHBsaWNpdFR5cGVBcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRDb25zdHJ1Y3Rvckludm9jYXRpb24oZGVjbGFyYXRpb24sIHRva2VuLCB0b2tlbiwKICAgICAgICAgIGFyZ3VtZW50cywgIiIsIG51bGwsIHRva2VuLmNoYXJPZmZzZXQsIENvbnN0bmVzcy5pbXBsaWNpdCk7CiAgICB9CiAgfQp9CgovLy8gW1JlYWRPbmx5QWNjZXNzR2VuZXJhdG9yXSByZXByZXNlbnRzIHRoZSBzdWJleHByZXNzaW9uIHdob3NlIHByZWZpeCBpcyB0aGUKLy8vIG5hbWUgb2YgZmluYWwgbG9jYWwgdmFyaWFibGUsIGZpbmFsIHBhcmFtZXRlciwgb3IgY2F0Y2ggY2xhdXNlIHZhcmlhYmxlIG9yCi8vLyBgdGhpc2AgaW4gYW4gaW5zdGFuY2UgbWV0aG9kIGluIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbi4KLy8vCi8vLyBGb3IgaW5zdGFuY2U6Ci8vLwovLy8gICBtZXRob2QoZmluYWwgYSkgewovLy8gICAgIGZpbmFsIGIgPSBudWxsOwovLy8gICAgIGE7ICAgICAgICAgLy8gYSBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYWAuCi8vLyAgICAgYVtdOyAgICAgICAvLyBhIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhYC4KLy8vICAgICBiKCk7ICAgICAgIC8vIGEgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYGJgLgovLy8gICAgIGIuYyA9IGEuZDsgLy8gYSBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgYWAgYW5kIGBiYC4KLy8vCi8vLyAgICAgdHJ5IHsKLy8vICAgICB9IGNhdGNoIChhKSB7Ci8vLyAgICAgICBhOyAgICAgICAvLyBhIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBhYC4KLy8vICAgICB9Ci8vLyAgIH0KLy8vCi8vLyAgIGV4dGVuc2lvbiBvbiBGb28gewovLy8gICAgIG1ldGhvZCgpIHsKLy8vICAgICAgIHRoaXM7ICAgICAgICAgLy8gYSBSZWFkT25seUFjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgICB0aGlzLmE7ICAgICAgIC8vIGEgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHRoaXNgLgovLy8gICAgICAgdGhpcy5iKCk7ICAgICAvLyBhIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzYC4KLy8vICAgICB9Ci8vLyAgIH0KLy8vCmNsYXNzIFJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZTsKCiAgRXhwcmVzc2lvbiBleHByZXNzaW9uOwoKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlOwoKICBSZWFkT25seUFjY2Vzc0dlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMuZXhwcmVzc2lvbiwgdGhpcy50YXJnZXROYW1lKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlJlYWRPbmx5QWNjZXNzR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiB0YXJnZXROYW1lOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpID0+IF9jcmVhdGVSZWFkKCk7CgogIEV4cHJlc3Npb24gX2NyZWF0ZVJlYWQoKSA9PiBleHByZXNzaW9uOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiByZWFkID0gX2NyZWF0ZVJlYWQoKTsKICAgIEV4cHJlc3Npb24gd3JpdGUgPSBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgICByZXR1cm4gbmV3IElmTnVsbFNldChyZWFkLCB3cml0ZSwgZm9yRWZmZWN0OiB2b2lkQ29udGV4dCkKICAgICAgLi5maWxlT2Zmc2V0ID0gb2Zmc2V0OwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBfaGVscGVyLmZvcmVzdAogICAgICAgIC5jcmVhdGVCaW5hcnkob2Zmc2V0LCBfY3JlYXRlUmVhZCgpLCBiaW5hcnlPcGVyYXRvciwgdmFsdWUpOwogICAgcmV0dXJuIF9tYWtlSW52YWxpZFdyaXRlKGJpbmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gX2ZvcmVzdC5jcmVhdGVJbnRMaXRlcmFsKG9mZnNldCwgMSk7CiAgICByZXR1cm4gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmluYXJ5T3BlcmF0b3IsIHZhbHVlLAogICAgICAgIG9mZnNldDogb2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQsIGlzUG9zdEluY0RlYzogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oZWxwZXIuZm9yZXN0LmNyZWF0ZUV4cHJlc3Npb25JbnZvY2F0aW9uKAogICAgICAgIGFkanVzdEZvckltcGxpY2l0Q2FsbCh0YXJnZXROYW1lLCBvZmZzZXQpLCBfY3JlYXRlUmVhZCgpLCBhcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGUgcmVhZC1vbmx5IHF1YWxpdHkgb2YgdGhlIHZhcmlhYmxlIHNob3VsZCBiZQogICAgLy8gcGFzc2VkIG9uIHRvIHRoZSBnZW5lcmF0b3IuCiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIF9jcmVhdGVSZWFkKCksIGluZGV4LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBOYW1lU3lzdGVtIHN5bnRoZXRpY05hbWVzID0gbmV3IE5hbWVTeXN0ZW0oKTsKICAgIHNpbmsud3JpdGUoIiwgZXhwcmVzc2lvbjogIik7CiAgICBwcmludE5vZGVPbihleHByZXNzaW9uLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogICAgc2luay53cml0ZSgiLCBwbGFpbk5hbWVGb3JSZWFkOiAiKTsKICAgIHNpbmsud3JpdGUodGFyZ2V0TmFtZSk7CiAgICBzaW5rLndyaXRlKCIsIHZhbHVlOiAiKTsKICAgIHByaW50Tm9kZU9uKHZhbHVlLCBzaW5rLCBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgRXJyb25lb3VzRXhwcmVzc2lvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgRXJyb25lb3VzRXhwcmVzc2lvbkdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4pCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIC8vLyBQYXNzIFthcmd1bWVudHNdIHRoYXQgbXVzdCBiZSBldmFsdWF0ZWQgYmVmb3JlIHRocm93aW5nIGFuIGVycm9yLiAgQXQKICAvLy8gbW9zdCBvbmUgb2YgW2lzR2V0dGVyXSBhbmQgW2lzU2V0dGVyXSBzaG91bGQgYmUgdHJ1ZSBhbmQgdGhleSdyZSBwYXNzZWQKICAvLy8gdG8gW0V4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIudGhyb3dOb1N1Y2hNZXRob2RFcnJvcl0gaWYgaXQgaXMgdXNlZC4KICBFeHByZXNzaW9uIGJ1aWxkRXJyb3IoQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNHZXR0ZXI6IGZhbHNlLCBib29sIGlzU2V0dGVyOiBmYWxzZSwgaW50IG9mZnNldH0pOwoKICBOYW1lIGdldCBuYW1lID0+IHVuc3VwcG9ydGVkKCJuYW1lIiwgZmlsZU9mZnNldCwgX3VyaSk7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICB3aXRoUmVjZWl2ZXIoT2JqZWN0IHJlY2VpdmVyLCBpbnQgb3BlcmF0b3JPZmZzZXQsIHtib29sIGlzTnVsbEF3YXJlfSkgPT4gdGhpczsKCiAgQG92ZXJyaWRlCiAgTGlzdDxJbml0aWFsaXplcj4gYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIHJldHVybiA8SW5pdGlhbGl6ZXI+WwogICAgICBfaGVscGVyLmJ1aWxkSW52YWxpZEluaXRpYWxpemVyKAogICAgICAgICAgYnVpbGRFcnJvcihfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50c0VtcHR5KGZpbGVPZmZzZXQpLCBpc1NldHRlcjogdHJ1ZSkpCiAgICBdOwogIH0KCiAgQG92ZXJyaWRlCiAgZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBidWlsZEVycm9yKGFyZ3VtZW50cywgb2Zmc2V0OiBvZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3Igc2VuZCwgaW50IG9wZXJhdG9yT2Zmc2V0LCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICByZXR1cm4gc2VuZC53aXRoUmVjZWl2ZXIoYnVpbGRTaW1wbGVSZWFkKCksIG9wZXJhdG9yT2Zmc2V0LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cyhmaWxlT2Zmc2V0LCA8RXhwcmVzc2lvbj5bdmFsdWVdKSwKICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cyhmaWxlT2Zmc2V0LCA8RXhwcmVzc2lvbj5bdmFsdWVdKSwKICAgICAgICBpc0dldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcigKICAgICAgICBfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cygKICAgICAgICAgICAgZmlsZU9mZnNldCwgPEV4cHJlc3Npb24+W19mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpXSksCiAgICAgICAgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcigKICAgICAgICBfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cygKICAgICAgICAgICAgZmlsZU9mZnNldCwgPEV4cHJlc3Npb24+W19mb3Jlc3QuY3JlYXRlSW50TGl0ZXJhbChvZmZzZXQsIDEpXSksCiAgICAgICAgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IG9mZnNldDsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRJZk51bGxBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEVycm9yKF9mb3Jlc3QuY3JlYXRlQXJndW1lbnRzKGZpbGVPZmZzZXQsIDxFeHByZXNzaW9uPlt2YWx1ZV0pLAogICAgICAgIGlzU2V0dGVyOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNFbXB0eShmaWxlT2Zmc2V0KSwgaXNHZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRSZWFkKCkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNFbXB0eShmaWxlT2Zmc2V0KSwgaXNHZXR0ZXI6IHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSB7CiAgICByZXR1cm4gYnVpbGRFcnJvcihfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cyhmaWxlT2Zmc2V0LCA8RXhwcmVzc2lvbj5bdmFsdWVdKSwKICAgICAgICBpc1NldHRlcjogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGludm9rZUNvbnN0cnVjdG9yKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIGFzc2VydChfZm9yZXN0LmFyZ3VtZW50c1R5cGVBcmd1bWVudHMoYXJndW1lbnRzKS5pc0VtcHR5KTsKICAgICAgX2ZvcmVzdC5hcmd1bWVudHNTZXRUeXBlQXJndW1lbnRzKAogICAgICAgICAgYXJndW1lbnRzLCBfaGVscGVyLmJ1aWxkRGFydFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cykpOwogICAgfQogICAgcmV0dXJuIGJ1aWxkRXJyb3IoYXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9Cn0KCmNsYXNzIFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yIGV4dGVuZHMgRXJyb25lb3VzRXhwcmVzc2lvbkdlbmVyYXRvciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgTmFtZSBuYW1lOwoKICBmYWN0b3J5IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIE5hbWUgbmFtZSkgewogICAgaWYgKG5hbWUubmFtZS5pc0VtcHR5KSB7CiAgICAgIHVuaGFuZGxlZCgiZW1wdHkiLCAibmFtZSIsIG9mZnNldEZvclRva2VuKHRva2VuKSwgaGVscGVyLnVyaSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWROYW1lR2VuZXJhdG9yLmludGVybmFsKGhlbHBlciwgdG9rZW4sIG5hbWUpOwogIH0KCiAgVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3IuaW50ZXJuYWwoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5uYW1lKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlVucmVzb2x2ZWROYW1lR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IGNoYXJPZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBidWlsZEVycm9yKGFyZ3VtZW50cywgb2Zmc2V0OiBjaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRFcnJvcihBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc0dldHRlcjogZmFsc2UsIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLCBpbnQgb2Zmc2V0fSkgewogICAgb2Zmc2V0ID8/PSBmaWxlT2Zmc2V0OwogICAgcmV0dXJuIF9oZWxwZXIudGhyb3dOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICBfZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKG9mZnNldCksIF9wbGFpbk5hbWVGb3JSZWFkLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICBpc0dldHRlcjogaXNHZXR0ZXIsIGlzU2V0dGVyOiBpc1NldHRlcik7CiAgfQoKICBAb3ZlcnJpZGUKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yICovIE9iamVjdCBxdWFsaWZpZWRMb29rdXAoVG9rZW4gbmFtZSkgewogICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yKF9oZWxwZXIsIG5hbWUsIHRoaXMsIHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9idWlsZFVucmVzb2x2ZWRWYXJpYWJsZUFzc2lnbm1lbnQoZmFsc2UsIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBfYnVpbGRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KHRydWUsIHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNFbXB0eShmaWxlT2Zmc2V0KSwgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogIH0KCiAgRXhwcmVzc2lvbiBfYnVpbGRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50KAogICAgICBib29sIGlzQ29tcG91bmQsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgIHJldHVybiBidWlsZEVycm9yKF9mb3Jlc3QuY3JlYXRlQXJndW1lbnRzKGZpbGVPZmZzZXQsIDxFeHByZXNzaW9uPlt2YWx1ZV0pLAogICAgICAgIGlzU2V0dGVyOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIENvbnRleHRBd2FyZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgR2VuZXJhdG9yIGdlbmVyYXRvcjsKCiAgQ29udGV4dEF3YXJlR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMuZ2VuZXJhdG9yKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgicGxhaW5OYW1lRm9yUmVhZCIsIHRva2VuLmNoYXJPZmZzZXQsIF9oZWxwZXIudXJpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBjaGFyT2Zmc2V0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdW5oYW5kbGVkKCIke3J1bnRpbWVUeXBlfSIsICJkb0ludm9jYXRpb24iLCBjaGFyT2Zmc2V0LCBfdXJpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRXcml0ZSh2YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZENvbXBvdW5kQXNzaWdubWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7aW50IG9mZnNldDogLTEsCiAgICAgIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlLAogICAgICBib29sIGlzUHJlSW5jRGVjOiBmYWxzZSwKICAgICAgYm9vbCBpc1Bvc3RJbmNEZWM6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFdyaXRlKHZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IC0xLCBib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRXcml0ZShudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiAtMSwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUobnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBfbWFrZUludmFsaWRSZWFkKCkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJtYWtlSW52YWxpZFJlYWQiLCB0b2tlbi5jaGFyT2Zmc2V0LCBfaGVscGVyLnVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9tYWtlSW52YWxpZFdyaXRlKEV4cHJlc3Npb24gdmFsdWUpIHsKICAgIHJldHVybiBfaGVscGVyLmJ1aWxkUHJvYmxlbShtZXNzYWdlSWxsZWdhbEFzc2lnbm1lbnRUb05vbkFzc2lnbmFibGUsCiAgICAgICAgZmlsZU9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9Cn0KCmNsYXNzIERlbGF5ZWRBc3NpZ25tZW50IGV4dGVuZHMgQ29udGV4dEF3YXJlR2VuZXJhdG9yIHsKICBmaW5hbCBFeHByZXNzaW9uIHZhbHVlOwoKICBTdHJpbmcgYXNzaWdubWVudE9wZXJhdG9yOwoKICBEZWxheWVkQXNzaWdubWVudChFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3IsIHRoaXMudmFsdWUsIHRoaXMuYXNzaWdubWVudE9wZXJhdG9yKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIGdlbmVyYXRvcik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiRGVsYXllZEFzc2lnbm1lbnQiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBoYW5kbGVBc3NpZ25tZW50KGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRGb3JFZmZlY3QoKSB7CiAgICByZXR1cm4gaGFuZGxlQXNzaWdubWVudCh0cnVlKTsKICB9CgogIEV4cHJlc3Npb24gaGFuZGxlQXNzaWdubWVudChib29sIHZvaWRDb250ZXh0KSB7CiAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgbWVzc2FnZU5vdEFDb25zdGFudEV4cHJlc3Npb24sIGZpbGVPZmZzZXQsIHRva2VuLmxlbmd0aCk7CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKCI9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQXNzaWdubWVudCh2YWx1ZSwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCIrPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChwbHVzTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IGZpbGVPZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgiLT0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQobWludXNOYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogZmlsZU9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCIqPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChtdWx0aXBseU5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBmaWxlT2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIiU9IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KHBlcmNlbnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogZmlsZU9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCImPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChhbXBlcnNhbmROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogZmlsZU9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCIvPSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChkaXZpc2lvbk5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBmaWxlT2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIjw8PSIsIGFzc2lnbm1lbnRPcGVyYXRvcikpIHsKICAgICAgcmV0dXJuIGdlbmVyYXRvci5idWlsZENvbXBvdW5kQXNzaWdubWVudChsZWZ0U2hpZnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogZmlsZU9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCI+Pj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQocmlnaHRTaGlmdE5hbWUsIHZhbHVlLAogICAgICAgICAgb2Zmc2V0OiBmaWxlT2Zmc2V0LCB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIj4+Pj0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQodHJpcGxlU2hpZnROYW1lLCB2YWx1ZSwKICAgICAgICAgIG9mZnNldDogZmlsZU9mZnNldCwgdm9pZENvbnRleHQ6IHZvaWRDb250ZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCI/Pz0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRJZk51bGxBc3NpZ25tZW50KAogICAgICAgICAgdmFsdWUsIGNvbnN0IER5bmFtaWNUeXBlKCksIGZpbGVPZmZzZXQsCiAgICAgICAgICB2b2lkQ29udGV4dDogdm9pZENvbnRleHQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoIl49IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KGNhcmV0TmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IGZpbGVPZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgifD0iLCBhc3NpZ25tZW50T3BlcmF0b3IpKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoYmFyTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IGZpbGVPZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgifi89IiwgYXNzaWdubWVudE9wZXJhdG9yKSkgewogICAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KG11c3RhY2hlTmFtZSwgdmFsdWUsCiAgICAgICAgICBvZmZzZXQ6IGZpbGVPZmZzZXQsIHZvaWRDb250ZXh0OiB2b2lkQ29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdW5oYW5kbGVkKGFzc2lnbm1lbnRPcGVyYXRvciwgImhhbmRsZUFzc2lnbm1lbnQiLCB0b2tlbi5jaGFyT2Zmc2V0LAogICAgICAgICAgX2hlbHBlci51cmkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxJbml0aWFsaXplcj4gYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIGlmICghaWRlbnRpY2FsKCI9IiwgYXNzaWdubWVudE9wZXJhdG9yKSB8fAogICAgICAgIGdlbmVyYXRvciBpcyEgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKSB7CiAgICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRGaWVsZEluaXRpYWxpemVyKGluaXRpYWxpemVkRmllbGRzKTsKICAgIH0KICAgIHJldHVybiBfaGVscGVyLmJ1aWxkRmllbGRJbml0aWFsaXplcihnZW5lcmF0b3IuX3BsYWluTmFtZUZvclJlYWQsCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oZ2VuZXJhdG9yLnRva2VuKSwgZmlsZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCB2YWx1ZTogIik7CiAgICBwcmludE5vZGVPbih2YWx1ZSwgc2luayk7CiAgICBzaW5rLndyaXRlKCIsIGFzc2lnbm1lbnRPcGVyYXRvcjogIik7CiAgICBzaW5rLndyaXRlKGFzc2lnbm1lbnRPcGVyYXRvcik7CiAgfQp9CgpjbGFzcyBEZWxheWVkUG9zdGZpeEluY3JlbWVudCBleHRlbmRzIENvbnRleHRBd2FyZUdlbmVyYXRvciB7CiAgZmluYWwgTmFtZSBiaW5hcnlPcGVyYXRvcjsKCiAgRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQoRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLAogICAgICBHZW5lcmF0b3IgZ2VuZXJhdG9yLCB0aGlzLmJpbmFyeU9wZXJhdG9yKQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4sIGdlbmVyYXRvcik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiBnZW5lcmF0b3IuYnVpbGRQb3N0Zml4SW5jcmVtZW50KGJpbmFyeU9wZXJhdG9yLAogICAgICAgIG9mZnNldDogZmlsZU9mZnNldCwgdm9pZENvbnRleHQ6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRGb3JFZmZlY3QoKSB7CiAgICByZXR1cm4gZ2VuZXJhdG9yLmJ1aWxkUG9zdGZpeEluY3JlbWVudChiaW5hcnlPcGVyYXRvciwKICAgICAgICBvZmZzZXQ6IGZpbGVPZmZzZXQsIHZvaWRDb250ZXh0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgYmluYXJ5T3BlcmF0b3I6ICIpOwogICAgc2luay53cml0ZShiaW5hcnlPcGVyYXRvci5uYW1lKTsKICB9Cn0KCmNsYXNzIFByZWZpeFVzZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgUHJlZml4QnVpbGRlciBwcmVmaXg7CgogIFByZWZpeFVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMucHJlZml4KQogICAgICA6IHN1cGVyKGhlbHBlciwgdG9rZW4pOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IHByZWZpeC5uYW1lOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlByZWZpeFVzZUdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gX21ha2VJbnZhbGlkUmVhZCgpOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFJlYWQoKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRSZWFkKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFJlYWQoKTsKICB9CgogIEBvdmVycmlkZQogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgKi8gT2JqZWN0IHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYgcHJlZml4LmRlZmVycmVkKSB7CiAgICAgIF9oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudC53aXRoQXJndW1lbnRzKHRva2VuKSwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogICAgfQogICAgT2JqZWN0IHJlc3VsdCA9IF9oZWxwZXIuc2NvcGVMb29rdXAocHJlZml4LmV4cG9ydFNjb3BlLCBuYW1lLmxleGVtZSwgbmFtZSwKICAgICAgICBpc1F1YWxpZmllZDogdHJ1ZSwgcHJlZml4OiBwcmVmaXgpOwogICAgaWYgKHByZWZpeC5kZWZlcnJlZCkgewogICAgICBpZiAocmVzdWx0IGlzIEdlbmVyYXRvcikgewogICAgICAgIGlmIChyZXN1bHQgaXMhIExvYWRMaWJyYXJ5R2VuZXJhdG9yKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgbmFtZSwgdGhpcywgcmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2hlbHBlci53cmFwSW5EZWZlcnJlZENoZWNrKHJlc3VsdCwgcHJlZml4LCBmaWxlT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIC8qIEV4cHJlc3Npb24gfCBHZW5lcmF0b3IgfCBJbml0aWFsaXplciAqLyBkb0ludm9jYXRpb24oCiAgICAgIGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBfaGVscGVyLndyYXBJbkxvY2F0ZWRQcm9ibGVtKAogICAgICAgIF9oZWxwZXIuZXZhbHVhdGVBcmd1bWVudHNCZWZvcmUoCiAgICAgICAgICAgIGFyZ3VtZW50cywgX2ZvcmVzdC5jcmVhdGVOdWxsTGl0ZXJhbChmaWxlT2Zmc2V0KSksCiAgICAgICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhBc0V4cHJlc3Npb24ud2l0aExvY2F0aW9uKAogICAgICAgICAgICBfaGVscGVyLnVyaSwgZmlsZU9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKSk7CiAgfQoKICBAb3ZlcnJpZGUKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yICovIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgaWYgKHNlbmQgaXMgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IpIHsKICAgICAgYXNzZXJ0KHNlbmQubmFtZS5uYW1lID09IHNlbmQudG9rZW4ubGV4ZW1lLAogICAgICAgICAgIicke3NlbmQubmFtZS5uYW1lfScgIT0gJHtzZW5kLnRva2VuLmxleGVtZX0iKTsKICAgICAgT2JqZWN0IHJlc3VsdCA9IHF1YWxpZmllZExvb2t1cChzZW5kLnRva2VuKTsKICAgICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICAgIHJlc3VsdCA9IF9oZWxwZXIuZmluaXNoU2VuZChyZXN1bHQsIHNlbmQuYXJndW1lbnRzLCBmaWxlT2Zmc2V0KTsKICAgICAgfQogICAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgICByZXN1bHQgPSBfaGVscGVyLndyYXBJbkxvY2F0ZWRQcm9ibGVtKAogICAgICAgICAgICBfaGVscGVyLnRvVmFsdWUocmVzdWx0KSwKICAgICAgICAgICAgbWVzc2FnZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgIF9oZWxwZXIudXJpLCBmaWxlT2Zmc2V0LCBsZW5ndGhGb3JUb2tlbih0b2tlbikpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGJ1aWxkU2ltcGxlUmVhZCgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRSZWFkKCkgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uLCBmaWxlT2Zmc2V0LCBsZW5ndGhGb3JUb2tlbih0b2tlbikpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSA9PiBfbWFrZUludmFsaWRSZWFkKCk7CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleGVkQWNjZXNzR2VuZXJhdG9yKF9oZWxwZXIsIHRva2VuLCBidWlsZFNpbXBsZVJlYWQoKSwgaW5kZXgsCiAgICAgICAgaXNOdWxsQXdhcmU6IGlzTnVsbEF3YXJlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgcHJlZml4OiAiKTsKICAgIHNpbmsud3JpdGUocHJlZml4Lm5hbWUpOwogICAgc2luay53cml0ZSgiLCBkZWZlcnJlZDogIik7CiAgICBzaW5rLndyaXRlKHByZWZpeC5kZWZlcnJlZCk7CiAgfQp9CgpjbGFzcyBVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKICBmaW5hbCBHZW5lcmF0b3IgcHJlZml4R2VuZXJhdG9yOwoKICBmaW5hbCBib29sIGlzVW5yZXNvbHZlZDsKCiAgVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvcihFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sCiAgICAgIHRoaXMucHJlZml4R2VuZXJhdG9yLCB0aGlzLmlzVW5yZXNvbHZlZCkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PgogICAgICAiJHtwcmVmaXhHZW5lcmF0b3IuX3BsYWluTmFtZUZvclJlYWR9LiR7dG9rZW4ubGV4ZW1lfSI7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiVW5leHBlY3RlZFF1YWxpZmllZFVzZUdlbmVyYXRvciI7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gX21ha2VJbnZhbGlkUmVhZCgpOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkV3JpdGUodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9tYWtlSW52YWxpZFJlYWQoKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBfbWFrZUludmFsaWRSZWFkKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkUG9zdGZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldCA9IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0ID0gZmFsc2V9KSB7CiAgICByZXR1cm4gX21ha2VJbnZhbGlkUmVhZCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIF9oZWxwZXIudGhyb3dOb1N1Y2hNZXRob2RFcnJvcihfZm9yZXN0LmNyZWF0ZU51bGxMaXRlcmFsKG9mZnNldCksCiAgICAgICAgX3BsYWluTmFtZUZvclJlYWQsIGFyZ3VtZW50cywgZmlsZU9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHMoCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIsIExpc3Q8VW5yZXNvbHZlZFR5cGU+IGFyZ3VtZW50cykgewogICAgVGVtcGxhdGU8TWVzc2FnZSBGdW5jdGlvbihTdHJpbmcsIFN0cmluZyk+IHRlbXBsYXRlID0gaXNVbnJlc29sdmVkCiAgICAgICAgPyB0ZW1wbGF0ZVVucmVzb2x2ZWRQcmVmaXhJblR5cGVBbm5vdGF0aW9uCiAgICAgICAgOiB0ZW1wbGF0ZU5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uOwogICAgTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPQogICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyKF9wbGFpbk5hbWVGb3JSZWFkLCBudWxsYWJpbGl0eUJ1aWxkZXIsIG51bGwpOwogICAgTWVzc2FnZSBtZXNzYWdlID0KICAgICAgICB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKHByZWZpeEdlbmVyYXRvci50b2tlbi5sZXhlbWUsIHRva2VuLmxleGVtZSk7CiAgICBfaGVscGVyLmxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZSwKICAgICAgICBvZmZzZXRGb3JUb2tlbihwcmVmaXhHZW5lcmF0b3IudG9rZW4pLAogICAgICAgIGxlbmd0aE9mU3BhbihwcmVmaXhHZW5lcmF0b3IudG9rZW4sIHRva2VuKSwKICAgICAgICBfdXJpKTsKICAgIHJlc3VsdC5iaW5kKHJlc3VsdC5idWlsZEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKG1lc3NhZ2Uud2l0aExvY2F0aW9uKAogICAgICAgIF91cmksCiAgICAgICAgb2Zmc2V0Rm9yVG9rZW4ocHJlZml4R2VuZXJhdG9yLnRva2VuKSwKICAgICAgICBsZW5ndGhPZlNwYW4ocHJlZml4R2VuZXJhdG9yLnRva2VuLCB0b2tlbikpKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGJ1aWxkU2ltcGxlUmVhZCgpLCBpbmRleCwKICAgICAgICBpc051bGxBd2FyZTogaXNOdWxsQXdhcmUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBwcmVmaXhHZW5lcmF0b3I6ICIpOwogICAgcHJlZml4R2VuZXJhdG9yLnByaW50T24oc2luayk7CiAgfQp9CgpjbGFzcyBQYXJzZXJFcnJvckdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgZmluYWwgTWVzc2FnZSBtZXNzYWdlOwoKICBQYXJzZXJFcnJvckdlbmVyYXRvcigKICAgICAgRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlciBoZWxwZXIsIFRva2VuIHRva2VuLCB0aGlzLm1lc3NhZ2UpCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gIiNwYXJzZXItZXJyb3IiOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlBhcnNlckVycm9yR2VuZXJhdG9yIjsKCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykge30KCiAgRXhwcmVzc2lvbiBidWlsZFByb2JsZW0oKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZSwgZmlsZU9mZnNldCwgbm9MZW5ndGgsCiAgICAgICAgc3VwcHJlc3NNZXNzYWdlOiB0cnVlKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgPT4gYnVpbGRQcm9ibGVtKCk7CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRJZk51bGxBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIF9tYWtlSW52YWxpZFJlYWQoKSA9PiBidWlsZFByb2JsZW0oKTsKCiAgRXhwcmVzc2lvbiBfbWFrZUludmFsaWRXcml0ZShFeHByZXNzaW9uIHZhbHVlKSA9PiBidWlsZFByb2JsZW0oKTsKCiAgTGlzdDxJbml0aWFsaXplcj4gYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIHJldHVybiA8SW5pdGlhbGl6ZXI+W19oZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoYnVpbGRQcm9ibGVtKCkpXTsKICB9CgogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBidWlsZFByb2JsZW0oKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQcm9wZXJ0eUFjY2VzcygKICAgICAgSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3Igc2VuZCwgaW50IG9wZXJhdG9yT2Zmc2V0LCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBUeXBlQnVpbGRlciBidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHMoCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIsIExpc3Q8VW5yZXNvbHZlZFR5cGU+IGFyZ3VtZW50cykgewogICAgTmFtZWRUeXBlQnVpbGRlciByZXN1bHQgPQogICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyKHRva2VuLmxleGVtZSwgbnVsbGFiaWxpdHlCdWlsZGVyLCBudWxsKTsKICAgIF9oZWxwZXIubGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbShtZXNzYWdlLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCwgX3VyaSk7CiAgICByZXN1bHQuYmluZChyZXN1bHQuYnVpbGRJbnZhbGlkVHlwZURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgICBtZXNzYWdlLndpdGhMb2NhdGlvbihfdXJpLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCkpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFeHByZXNzaW9uIHF1YWxpZmllZExvb2t1cChUb2tlbiBuYW1lKSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBFeHByZXNzaW9uIGludm9rZUNvbnN0cnVjdG9yKAogICAgICBMaXN0PFVucmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBDb25zdG5lc3MgY29uc3RuZXNzKSB7CiAgICByZXR1cm4gYnVpbGRQcm9ibGVtKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBHZW5lcmF0b3IgYnVpbGRJbmRleGVkQWNjZXNzKEV4cHJlc3Npb24gaW5kZXgsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc051bGxBd2FyZX0pIHsKICAgIGFzc2VydChpc051bGxBd2FyZSAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgSW5kZXhlZEFjY2Vzc0dlbmVyYXRvcihfaGVscGVyLCB0b2tlbiwgYnVpbGRTaW1wbGVSZWFkKCksIGluZGV4LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQp9CgovLy8gQSBbVGhpc0FjY2Vzc0dlbmVyYXRvcl0gcmVwcmVzZW50cyBhIHN1YmV4cHJlc3Npb24gd2hvc2UgcHJlZml4IGlzIGB0aGlzYAovLy8gb3IgYHN1cGVyYC4KLy8vCi8vLyBGb3IgaW5zdGFuY2UKLy8vCi8vLyAgIGNsYXNzIEMgewovLy8gICAgIHZhciBiID0gdGhpcy5jOyAvLyBhIFRoaXNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHRoaXNgLgovLy8gICAgIHZhciBjOwovLy8gICAgIEModGhpcy5jKSA6ICAgICAvLyBhIFRoaXNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHRoaXNgLgovLy8gICAgICAgdGhpcy5iID0gYzsgICAvLyBhIFRoaXNBY2Nlc3NHZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYHRoaXNgLgovLy8gICAgIG1ldGhvZCgpIHsKLy8vICAgICAgIHRoaXMuYjsgICAgICAgLy8gYSBUaGlzQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGB0aGlzYC4KLy8vICAgICAgIHN1cGVyLmIoKTsgICAgLy8gYSBUaGlzQWNjZXNzR2VuZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIGBzdXBlcmAuCi8vLyAgICAgICB0aGlzLmIgPSBjOyAgIC8vIGEgVGhpc0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgICB0aGlzLmIgKz0gYzsgIC8vIGEgVGhpc0FjY2Vzc0dlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBgdGhpc2AuCi8vLyAgICAgfQovLy8gICB9Ci8vLwovLy8gSWYgdGhpcyBgdGhpc2Agb2NjdXJzIGluIGFuIGluc3RhbmNlIG1lbWJlciBvbiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24sCi8vLyBhIFtSZWFkT25seUFjY2Vzc0dlbmVyYXRvcl0gaXMgY3JlYXRlZCBpbnN0ZWFkLgovLy8KY2xhc3MgVGhpc0FjY2Vzc0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAgLy8vIGB0cnVlYCBpZiB0aGlzIGFjY2VzcyBpcyBpbiBhbiBpbml0aWFsaXplciBsaXN0LgogIC8vLwogIC8vLyBGb3IgaW5zdGFuY2UgaW4gYDxpbml0PmAgaW4KICAvLy8KICAvLy8gICAgY2xhc3MgQ2xhc3MgewogIC8vLyAgICAgIENsYXNzKCkgOiA8aW5pdD47CiAgLy8vICAgIH0KICAvLy8KICBmaW5hbCBib29sIGlzSW5pdGlhbGl6ZXI7CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcyBhY2Nlc3MgaXMgaW4gYSBmaWVsZCBpbml0aWFsaXplciBlaXRoZXIgZGlyZWN0bHkgb3Igd2l0aGluCiAgLy8vIGFuIGluaXRpYWxpemVyIGxpc3QuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBpbiBgPGluaXQ+YCBpbgogIC8vLwogIC8vLyAgICB2YXIgZm9vID0gPGluaXQ+OwogIC8vLyAgICBjbGFzcyBDbGFzcyB7CiAgLy8vICAgICAgdmFyIGJhciA9IDxpbml0PjsKICAvLy8gICAgICBDbGFzcygpIDogPGluaXQ+OwogIC8vLyAgICB9CiAgLy8vCiAgZmluYWwgYm9vbCBpbkZpZWxkSW5pdGlhbGl6ZXI7CgogIC8vLyBgdHJ1ZWAgaWYgdGhpcyBhY2Nlc3MgaXMgZGlyZWN0bHkgaW4gYSBmaWVsZCBpbml0aWFsaXplciBvZiBhIGxhdGUgZmllbGQuCiAgLy8vCiAgLy8vIEZvciBpbnN0YW5jZSBpbiBgPGluaXQ+YCBpbgogIC8vLwogIC8vLyAgICBsYXRlIHZhciBmb28gPSA8aW5pdD47CiAgLy8vICAgIGNsYXNzIENsYXNzIHsKICAvLy8gICAgICBsYXRlIHZhciBiYXIgPSA8aW5pdD47CiAgLy8vICAgICAgQ2xhc3MoKSA6IGJhciA9IDQyOwogIC8vLyAgICB9CiAgLy8vCiAgZmluYWwgYm9vbCBpbkxhdGVGaWVsZEluaXRpYWxpemVyOwoKICAvLy8gYHRydWVgIGlmIHRoaXMgc3ViZXhwcmVzc2lvbiByZXByZXNlbnRzIGEgYHN1cGVyYCBwcmVmaXguCiAgZmluYWwgYm9vbCBpc1N1cGVyOwoKICBUaGlzQWNjZXNzR2VuZXJhdG9yKEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwKICAgICAgdGhpcy5pc0luaXRpYWxpemVyLCB0aGlzLmluRmllbGRJbml0aWFsaXplciwgdGhpcy5pbkxhdGVGaWVsZEluaXRpYWxpemVyLAogICAgICB7dGhpcy5pc1N1cGVyOiBmYWxzZX0pCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbik7CgogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICIke2lzU3VwZXIgPyAnc3VwZXInIDogJ3RoaXMnfS5wbGFpbk5hbWVGb3JSZWFkIiwgZmlsZU9mZnNldCwgX3VyaSk7CiAgfQoKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlRoaXNBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIGlmICghaXNTdXBlcikgewogICAgICBpZiAoaW5GaWVsZEluaXRpYWxpemVyICYmICFpbkxhdGVGaWVsZEluaXRpYWxpemVyKSB7CiAgICAgICAgcmV0dXJuIGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yKG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBfZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb24sIGZpbGVPZmZzZXQsIGxlbmd0aEZvclRva2VuKHRva2VuKSk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIFN0cmluZyBrZXl3b3JkID0gaXNTdXBlciA/ICJzdXBlciIgOiAidGhpcyI7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplci53aXRoQXJndW1lbnRzKGtleXdvcmQpLAogICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAga2V5d29yZC5sZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxJbml0aWFsaXplcj4gYnVpbGRGaWVsZEluaXRpYWxpemVyKE1hcDxTdHJpbmcsIGludD4gaW5pdGlhbGl6ZWRGaWVsZHMpIHsKICAgIEV4cHJlc3Npb24gZXJyb3IgPSBidWlsZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcihpbml0aWFsaXplZEZpZWxkcyk7CiAgICByZXR1cm4gPEluaXRpYWxpemVyPlsKICAgICAgX2hlbHBlci5idWlsZEludmFsaWRJbml0aWFsaXplcihlcnJvciwgZXJyb3IuZmlsZU9mZnNldCkKICAgIF07CiAgfQoKICBidWlsZFByb3BlcnR5QWNjZXNzKAogICAgICBJbmNvbXBsZXRlU2VuZEdlbmVyYXRvciBzZW5kLCBpbnQgb3BlcmF0b3JPZmZzZXQsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIE5hbWUgbmFtZSA9IHNlbmQubmFtZTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBzZW5kLmFyZ3VtZW50czsKICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKTsKICAgIGlmIChpc0luaXRpYWxpemVyICYmIHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICBpZiAoaXNOdWxsQXdhcmUpIHsKICAgICAgICBfaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3MsIG9wZXJhdG9yT2Zmc2V0LCAyKTsKICAgICAgfQogICAgICByZXR1cm4gYnVpbGRDb25zdHJ1Y3RvckluaXRpYWxpemVyKG9mZnNldCwgbmFtZSwgYXJndW1lbnRzKTsKICAgIH0KICAgIGlmIChpbkZpZWxkSW5pdGlhbGl6ZXIgJiYgIWluTGF0ZUZpZWxkSW5pdGlhbGl6ZXIgJiYgIWlzSW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yKG51bGwpOwogICAgfQogICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICAvLyBOb3RpY2UgdGhhdCAndGhpcycgb3IgJ3N1cGVyJyBjYW4ndCBiZSBudWxsLiBTbyB3ZSBjYW4gaWdub3JlIHRoZQogICAgICAvLyB2YWx1ZSBvZiBbaXNOdWxsQXdhcmVdLgogICAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBfZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIHNlbmQuYXJndW1lbnRzLAogICAgICAgICAgb2Zmc2V0Rm9yVG9rZW4oc2VuZC50b2tlbiksCiAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1N1cGVyKSB7CiAgICAgICAgTWVtYmVyIGdldHRlciA9IF9oZWxwZXIubG9va3VwSW5zdGFuY2VNZW1iZXIobmFtZSwgaXNTdXBlcjogaXNTdXBlcik7CiAgICAgICAgTWVtYmVyIHNldHRlciA9IF9oZWxwZXIubG9va3VwSW5zdGFuY2VNZW1iZXIobmFtZSwKICAgICAgICAgICAgaXNTdXBlcjogaXNTdXBlciwgaXNTZXR0ZXI6IHRydWUpOwogICAgICAgIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgICAgX2hlbHBlciwKICAgICAgICAgICAgLy8gVE9ETyhhaGUpOiBUaGlzIGlzIG5vdCB0aGUgJ3N1cGVyJyB0b2tlbi4KICAgICAgICAgICAgc2VuZC50b2tlbiwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgZ2V0dGVyLAogICAgICAgICAgICBzZXR0ZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgVGhpc1Byb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICAgICAgICBfaGVscGVyLAogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IFRoaXMgaXMgbm90IHRoZSAndGhpcycgdG9rZW4uCiAgICAgICAgICAgIHNlbmQudG9rZW4sCiAgICAgICAgICAgIG5hbWUpOwogICAgICB9CiAgICB9CiAgfQoKICBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgaWYgKGlzSW5pdGlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGJ1aWxkQ29uc3RydWN0b3JJbml0aWFsaXplcihvZmZzZXQsIG5ldyBOYW1lKCIiKSwgYXJndW1lbnRzKTsKICAgIH0gZWxzZSBpZiAoaXNTdXBlcikgewogICAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZVN1cGVyQXNFeHByZXNzaW9uLCBvZmZzZXQsIG5vTGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfaGVscGVyLmZvcmVzdC5jcmVhdGVFeHByZXNzaW9uSW52b2NhdGlvbigKICAgICAgICAgIG9mZnNldCwgX2ZvcmVzdC5jcmVhdGVUaGlzRXhwcmVzc2lvbihmaWxlT2Zmc2V0KSwgYXJndW1lbnRzKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIGJ1aWxkRXF1YWxzT3BlcmF0aW9uKFRva2VuIHRva2VuLCBFeHByZXNzaW9uIHJpZ2h0LCB7Ym9vbCBpc05vdH0pIHsKICAgIGFzc2VydChpc05vdCAhPSBudWxsKTsKICAgIGlmIChpc1N1cGVyKSB7CiAgICAgIGludCBvZmZzZXQgPSBvZmZzZXRGb3JUb2tlbih0b2tlbik7CiAgICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBfZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpLAogICAgICAgICAgZXF1YWxzTmFtZSwKICAgICAgICAgIF9mb3Jlc3QuY3JlYXRlQXJndW1lbnRzKG9mZnNldCwgPEV4cHJlc3Npb24+W3JpZ2h0XSksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBpc1N1cGVyOiB0cnVlKTsKICAgICAgaWYgKGlzTm90KSB7CiAgICAgICAgcmVzdWx0ID0gX2ZvcmVzdC5jcmVhdGVOb3Qob2Zmc2V0LCByZXN1bHQpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuYnVpbGRFcXVhbHNPcGVyYXRpb24odG9rZW4sIHJpZ2h0LCBpc05vdDogaXNOb3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgYnVpbGRCaW5hcnlPcGVyYXRpb24oVG9rZW4gdG9rZW4sIE5hbWUgYmluYXJ5TmFtZSwgRXhwcmVzc2lvbiByaWdodCkgewogICAgaWYgKGlzU3VwZXIpIHsKICAgICAgaW50IG9mZnNldCA9IG9mZnNldEZvclRva2VuKHRva2VuKTsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgX2ZvcmVzdC5jcmVhdGVUaGlzRXhwcmVzc2lvbihmaWxlT2Zmc2V0KSwKICAgICAgICAgIGJpbmFyeU5hbWUsCiAgICAgICAgICBfZm9yZXN0LmNyZWF0ZUFyZ3VtZW50cyhvZmZzZXQsIDxFeHByZXNzaW9uPltyaWdodF0pLAogICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuYnVpbGRCaW5hcnlPcGVyYXRpb24odG9rZW4sIGJpbmFyeU5hbWUsIHJpZ2h0KTsKICB9CgogIEBvdmVycmlkZQogIGJ1aWxkVW5hcnlPcGVyYXRpb24oVG9rZW4gdG9rZW4sIE5hbWUgdW5hcnlOYW1lKSB7CiAgICBpZiAoaXNTdXBlcikgewogICAgICBpbnQgb2Zmc2V0ID0gb2Zmc2V0Rm9yVG9rZW4odG9rZW4pOwogICAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBfZm9yZXN0LmNyZWF0ZVRoaXNFeHByZXNzaW9uKGZpbGVPZmZzZXQpLAogICAgICAgICAgdW5hcnlOYW1lLAogICAgICAgICAgX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNFbXB0eShvZmZzZXQpLAogICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgaXNTdXBlcjogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuYnVpbGRVbmFyeU9wZXJhdGlvbih0b2tlbiwgdW5hcnlOYW1lKTsKICB9CgogIEluaXRpYWxpemVyIGJ1aWxkQ29uc3RydWN0b3JJbml0aWFsaXplcigKICAgICAgaW50IG9mZnNldCwgTmFtZSBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IF9oZWxwZXIubG9va3VwQ29uc3RydWN0b3IobmFtZSwgaXNTdXBlcjogaXNTdXBlcik7CiAgICBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlOwogICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKICAgICAgbWVzc2FnZSA9IF9oZWxwZXIuY2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbigKICAgICAgICAgIGNvbnN0cnVjdG9yLmZ1bmN0aW9uLCBhcmd1bWVudHMsIG9mZnNldCwgPFR5cGVQYXJhbWV0ZXI+W10pOwogICAgfSBlbHNlIHsKICAgICAgU3RyaW5nIGZ1bGxOYW1lID0KICAgICAgICAgIF9oZWxwZXIuY29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3MobmFtZS5uYW1lLCBpc1N1cGVyOiBpc1N1cGVyKTsKICAgICAgbWVzc2FnZSA9IChpc1N1cGVyCiAgICAgICAgICAgICAgPyB0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yCiAgICAgICAgICAgICAgOiB0ZW1wbGF0ZUNvbnN0cnVjdG9yTm90Rm91bmQpCiAgICAgICAgICAud2l0aEFyZ3VtZW50cyhmdWxsTmFtZSkKICAgICAgICAgIC53aXRoTG9jYXRpb24oX3VyaSwgZmlsZU9mZnNldCwgbGVuZ3RoRm9yVG9rZW4odG9rZW4pKTsKICAgIH0KICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoCiAgICAgICAgICBfaGVscGVyLnRocm93Tm9TdWNoTWV0aG9kRXJyb3IoCiAgICAgICAgICAgICAgX2ZvcmVzdC5jcmVhdGVOdWxsTGl0ZXJhbChvZmZzZXQpLAogICAgICAgICAgICAgIF9oZWxwZXIuY29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3MobmFtZS5uYW1lLAogICAgICAgICAgICAgICAgICBpc1N1cGVyOiBpc1N1cGVyKSwKICAgICAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsCiAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSksCiAgICAgICAgICBvZmZzZXQpOwogICAgfSBlbHNlIGlmIChpc1N1cGVyKSB7CiAgICAgIHJldHVybiBfaGVscGVyLmJ1aWxkU3VwZXJJbml0aWFsaXplcigKICAgICAgICAgIGZhbHNlLCBjb25zdHJ1Y3RvciwgYXJndW1lbnRzLCBvZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRSZWRpcmVjdGluZ0luaXRpYWxpemVyKAogICAgICAgICAgY29uc3RydWN0b3IsIGFyZ3VtZW50cywgb2Zmc2V0KTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZElmTnVsbEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwgRGFydFR5cGUgdHlwZSwgaW50IG9mZnNldCwKICAgICAge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIGJ1aWxkQXNzaWdubWVudEVycm9yKCk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gYnVpbGRBc3NpZ25tZW50RXJyb3IoKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQcmVmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiBidWlsZEFzc2lnbm1lbnRFcnJvcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICBpZiAoaXNTdXBlcikgewogICAgICByZXR1cm4gbmV3IFN1cGVySW5kZXhlZEFjY2Vzc0dlbmVyYXRvcigKICAgICAgICAgIF9oZWxwZXIsCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGluZGV4LAogICAgICAgICAgX2hlbHBlci5sb29rdXBJbnN0YW5jZU1lbWJlcihpbmRleEdldE5hbWUsIGlzU3VwZXI6IHRydWUpLAogICAgICAgICAgX2hlbHBlci5sb29rdXBJbnN0YW5jZU1lbWJlcihpbmRleFNldE5hbWUsIGlzU3VwZXI6IHRydWUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVGhpc0luZGV4ZWRBY2Nlc3NHZW5lcmF0b3IoX2hlbHBlciwgdG9rZW4sIGluZGV4KTsKICAgIH0KICB9CgogIEV4cHJlc3Npb24gYnVpbGRBc3NpZ25tZW50RXJyb3IoKSB7CiAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgaXNTdXBlciA/IG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1N1cGVyIDogbWVzc2FnZU5vdEFuTHZhbHVlLAogICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgdG9rZW4ubGVuZ3RoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcHJpbnRPbihTdHJpbmdTaW5rIHNpbmspIHsKICAgIHNpbmsud3JpdGUoIiwgaXNJbml0aWFsaXplcjogIik7CiAgICBzaW5rLndyaXRlKGlzSW5pdGlhbGl6ZXIpOwogICAgc2luay53cml0ZSgiLCBpbkZpZWxkSW5pdGlhbGl6ZXI6ICIpOwogICAgc2luay53cml0ZShpbkZpZWxkSW5pdGlhbGl6ZXIpOwogICAgc2luay53cml0ZSgiLCBpbkxhdGVGaWVsZEluaXRpYWxpemVyOiAiKTsKICAgIHNpbmsud3JpdGUoaW5MYXRlRmllbGRJbml0aWFsaXplcik7CiAgICBzaW5rLndyaXRlKCIsIGlzU3VwZXI6ICIpOwogICAgc2luay53cml0ZShpc1N1cGVyKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIGltcGxlbWVudHMgR2VuZXJhdG9yIHsKICBOYW1lIGdldCBuYW1lOwoKICB3aXRoUmVjZWl2ZXIoT2JqZWN0IHJlY2VpdmVyLCBpbnQgb3BlcmF0b3JPZmZzZXQsIHtib29sIGlzTnVsbEF3YXJlfSk7CgogIEFyZ3VtZW50cyBnZXQgYXJndW1lbnRzID0+IG51bGw7Cn0KCmNsYXNzIEluY29tcGxldGVFcnJvckdlbmVyYXRvciBleHRlbmRzIEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3IKICAgIHdpdGggSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IgewogIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZTsKCiAgSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMubWVzc2FnZSkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgTmFtZSBnZXQgbmFtZSA9PiBudWxsOwoKICBTdHJpbmcgZ2V0IF9wbGFpbk5hbWVGb3JSZWFkID0+IHRva2VuLmxleGVtZTsKCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IiOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGJ1aWxkRXJyb3IoQXJndW1lbnRzIGFyZ3VtZW50cywKICAgICAge2Jvb2wgaXNHZXR0ZXI6IGZhbHNlLCBib29sIGlzU2V0dGVyOiBmYWxzZSwgaW50IG9mZnNldH0pIHsKICAgIGludCBsZW5ndGggPSBub0xlbmd0aDsKICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgewogICAgICBvZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBsZW5ndGggPSBsZW5ndGhGb3JUb2tlbih0b2tlbik7CiAgICB9CiAgICByZXR1cm4gX2hlbHBlci5idWlsZFByb2JsZW0obWVzc2FnZSwgb2Zmc2V0LCBsZW5ndGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpID0+IHRoaXM7CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gYnVpbGRTaW1wbGVSZWFkKCkgewogICAgcmV0dXJuIGJ1aWxkRXJyb3IoX2ZvcmVzdC5jcmVhdGVBcmd1bWVudHNFbXB0eShmaWxlT2Zmc2V0KSwgaXNHZXR0ZXI6IHRydWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIG1lc3NhZ2U6ICIpOwogICAgc2luay53cml0ZShtZXNzYWdlLmNvZGUubmFtZSk7CiAgfQp9CgovLyBUT0RPKGFoZSk6IFJlbmFtZSB0byBTZW5kR2VuZXJhdG9yLgpjbGFzcyBTZW5kQWNjZXNzR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHdpdGggSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IgewogIEBvdmVycmlkZQogIGZpbmFsIE5hbWUgbmFtZTsKCiAgQG92ZXJyaWRlCiAgZmluYWwgQXJndW1lbnRzIGFyZ3VtZW50czsKCiAgZmluYWwgYm9vbCBpc1BvdGVudGlhbGx5Q29uc3RhbnQ7CgogIFNlbmRBY2Nlc3NHZW5lcmF0b3IoCiAgICAgIEV4cHJlc3Npb25HZW5lcmF0b3JIZWxwZXIgaGVscGVyLCBUb2tlbiB0b2tlbiwgdGhpcy5uYW1lLCB0aGlzLmFyZ3VtZW50cywKICAgICAge3RoaXMuaXNQb3RlbnRpYWxseUNvbnN0YW50OiBmYWxzZX0pCiAgICAgIDogc3VwZXIoaGVscGVyLCB0b2tlbikgewogICAgYXNzZXJ0KGFyZ3VtZW50cyAhPSBudWxsKTsKICB9CgogIFN0cmluZyBnZXQgX3BsYWluTmFtZUZvclJlYWQgPT4gbmFtZS5uYW1lOwoKICBTdHJpbmcgZ2V0IF9kZWJ1Z05hbWUgPT4gIlNlbmRBY2Nlc3NHZW5lcmF0b3IiOwoKICBFeHByZXNzaW9uIGJ1aWxkU2ltcGxlUmVhZCgpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRTaW1wbGVSZWFkIiwgZmlsZU9mZnNldCwgX3VyaSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkQXNzaWdubWVudCIsIGZpbGVPZmZzZXQsIF91cmkpOwogIH0KCiAgd2l0aFJlY2VpdmVyKE9iamVjdCByZWNlaXZlciwgaW50IG9wZXJhdG9yT2Zmc2V0LCB7Ym9vbCBpc051bGxBd2FyZTogZmFsc2V9KSB7CiAgICBpZiAocmVjZWl2ZXIgaXMgR2VuZXJhdG9yKSB7CiAgICAgIHJldHVybiByZWNlaXZlci5idWlsZFByb3BlcnR5QWNjZXNzKHRoaXMsIG9wZXJhdG9yT2Zmc2V0LCBpc051bGxBd2FyZSk7CiAgICB9CiAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgX2hlbHBlci50b1ZhbHVlKHJlY2VpdmVyKSwgbmFtZSwgYXJndW1lbnRzLCBmaWxlT2Zmc2V0LAogICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkSWZOdWxsQXNzaWdubWVudChFeHByZXNzaW9uIHZhbHVlLCBEYXJ0VHlwZSB0eXBlLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkTnVsbEF3YXJlQXNzaWdubWVudCIsIG9mZnNldCwgX3VyaSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkQ29tcG91bmRBc3NpZ25tZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgYm9vbCB2b2lkQ29udGV4dDogZmFsc2UsCiAgICAgIGJvb2wgaXNQcmVJbmNEZWM6IGZhbHNlLAogICAgICBib29sIGlzUG9zdEluY0RlYzogZmFsc2V9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkQ29tcG91bmRBc3NpZ25tZW50Iiwgb2Zmc2V0ID8/IGZpbGVPZmZzZXQsIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFByZWZpeEluY3JlbWVudChOYW1lIGJpbmFyeU9wZXJhdG9yLAogICAgICB7aW50IG9mZnNldDogVHJlZU5vZGUubm9PZmZzZXQsIGJvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZFByZWZpeEluY3JlbWVudCIsIG9mZnNldCA/PyBmaWxlT2Zmc2V0LCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRQb3N0Zml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkUG9zdGZpeEluY3JlbWVudCIsIG9mZnNldCA/PyBmaWxlT2Zmc2V0LCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gZG9JbnZvY2F0aW9uKGludCBvZmZzZXQsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiZG9JbnZvY2F0aW9uIiwgb2Zmc2V0LCBfdXJpKTsKICB9CgogIEBvdmVycmlkZQogIEdlbmVyYXRvciBidWlsZEluZGV4ZWRBY2Nlc3MoRXhwcmVzc2lvbiBpbmRleCwgVG9rZW4gdG9rZW4sCiAgICAgIHtib29sIGlzTnVsbEF3YXJlfSkgewogICAgYXNzZXJ0KGlzTnVsbEF3YXJlICE9IG51bGwpOwogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZEluZGV4ZWRBY2Nlc3MiLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksIF91cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBwcmludE9uKFN0cmluZ1Npbmsgc2luaykgewogICAgc2luay53cml0ZSgiLCBuYW1lOiAiKTsKICAgIHNpbmsud3JpdGUobmFtZS5uYW1lKTsKICAgIHNpbmsud3JpdGUoIiwgYXJndW1lbnRzOiAiKTsKICAgIEFyZ3VtZW50cyBub2RlID0gYXJndW1lbnRzOwogICAgaWYgKG5vZGUgaXMgTm9kZSkgewogICAgICBwcmludE5vZGVPbihub2RlLCBzaW5rKTsKICAgIH0gZWxzZSB7CiAgICAgIHNpbmsud3JpdGUobm9kZSk7CiAgICB9CiAgfQp9CgpjbGFzcyBJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IKICAgIHdpdGggSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3IgewogIGZpbmFsIE5hbWUgbmFtZTsKCiAgSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIHRoaXMubmFtZSkKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuKTsKCiAgU3RyaW5nIGdldCBfcGxhaW5OYW1lRm9yUmVhZCA9PiBuYW1lLm5hbWU7CgogIFN0cmluZyBnZXQgX2RlYnVnTmFtZSA9PiAiSW5jb21wbGV0ZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9yIjsKCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkU2ltcGxlUmVhZCIsIGZpbGVPZmZzZXQsIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiB2YWx1ZSwge2Jvb2wgdm9pZENvbnRleHQ6IGZhbHNlfSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJidWlsZEFzc2lnbm1lbnQiLCBmaWxlT2Zmc2V0LCBfdXJpKTsKICB9CgogIHdpdGhSZWNlaXZlcihPYmplY3QgcmVjZWl2ZXIsIGludCBvcGVyYXRvck9mZnNldCwge2Jvb2wgaXNOdWxsQXdhcmU6IGZhbHNlfSkgewogICAgaWYgKHJlY2VpdmVyIGlzIEdlbmVyYXRvcikgewogICAgICByZXR1cm4gcmVjZWl2ZXIuYnVpbGRQcm9wZXJ0eUFjY2Vzcyh0aGlzLCBvcGVyYXRvck9mZnNldCwgaXNOdWxsQXdhcmUpOwogICAgfQogICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzR2VuZXJhdG9yLm1ha2UoCiAgICAgICAgX2hlbHBlciwgdG9rZW4sIF9oZWxwZXIudG9WYWx1ZShyZWNlaXZlciksIG5hbWUsIGlzTnVsbEF3YXJlKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRJZk51bGxBc3NpZ25tZW50KEV4cHJlc3Npb24gdmFsdWUsIERhcnRUeXBlIHR5cGUsIGludCBvZmZzZXQsCiAgICAgIHtib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGROdWxsQXdhcmVBc3NpZ25tZW50Iiwgb2Zmc2V0LCBfdXJpKTsKICB9CgogIEV4cHJlc3Npb24gYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LAogICAgICBib29sIHZvaWRDb250ZXh0OiBmYWxzZSwKICAgICAgYm9vbCBpc1ByZUluY0RlYzogZmFsc2UsCiAgICAgIGJvb2wgaXNQb3N0SW5jRGVjOiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRDb21wb3VuZEFzc2lnbm1lbnQiLCBvZmZzZXQgPz8gZmlsZU9mZnNldCwgX3VyaSk7CiAgfQoKICBFeHByZXNzaW9uIGJ1aWxkUHJlZml4SW5jcmVtZW50KE5hbWUgYmluYXJ5T3BlcmF0b3IsCiAgICAgIHtpbnQgb2Zmc2V0OiBUcmVlTm9kZS5ub09mZnNldCwgYm9vbCB2b2lkQ29udGV4dDogZmFsc2V9KSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkUHJlZml4SW5jcmVtZW50Iiwgb2Zmc2V0ID8/IGZpbGVPZmZzZXQsIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBidWlsZFBvc3RmaXhJbmNyZW1lbnQoTmFtZSBiaW5hcnlPcGVyYXRvciwKICAgICAge2ludCBvZmZzZXQ6IFRyZWVOb2RlLm5vT2Zmc2V0LCBib29sIHZvaWRDb250ZXh0OiBmYWxzZX0pIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGRQb3N0Zml4SW5jcmVtZW50Iiwgb2Zmc2V0ID8/IGZpbGVPZmZzZXQsIF91cmkpOwogIH0KCiAgRXhwcmVzc2lvbiBkb0ludm9jYXRpb24oaW50IG9mZnNldCwgQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJkb0ludm9jYXRpb24iLCBvZmZzZXQsIF91cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgR2VuZXJhdG9yIGJ1aWxkSW5kZXhlZEFjY2VzcyhFeHByZXNzaW9uIGluZGV4LCBUb2tlbiB0b2tlbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoaXNOdWxsQXdhcmUgIT0gbnVsbCk7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkSW5kZXhlZEFjY2VzcyIsIG9mZnNldEZvclRva2VuKHRva2VuKSwgX3VyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHByaW50T24oU3RyaW5nU2luayBzaW5rKSB7CiAgICBzaW5rLndyaXRlKCIsIG5hbWU6ICIpOwogICAgc2luay53cml0ZShuYW1lLm5hbWUpOwogIH0KfQoKLy8vIFtQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkdlbmVyYXRvcl0gcmVwcmVzZW50cyB0aGUgc3ViZXhwcmVzc2lvbiB3aG9zZSBwcmVmaXgKLy8vIGlzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgovLy8KLy8vIEZvciBpbnN0YW5jZToKLy8vCi8vLyAgIG1ldGhvZChmaW5hbCBhKSB7Ci8vLyAgICAgZmluYWwgYiA9IG51bGw7Ci8vLyAgICAgKGEpOyAgICAgICAgICAgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYChhKWAuCi8vLyAgICAgKGEpW107ICAgICAgICAgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYChhKWAuCi8vLyAgICAgKGIpKCk7ICAgICAgICAgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYChiKWAuCi8vLyAgICAgKGIpLmMgPSAoYS5kKTsgLy8gdGhpcyBnZW5lcmF0b3IgaXMgY3JlYXRlZCBmb3IgYChhLmQpYCBhbmQgYChiKWAuCi8vLyAgIH0KLy8vCi8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlbW92ZSB0aGlzIGluIGZhdm9yIG9mIFtQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl0gd2hlbgovLyB0aGUgW1R5cGVQcm9tb3Rlcl0gaXMgcmVwbGFjZWQgYnkgW0Zsb3dBbmFseXNpc10uCmNsYXNzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yIGV4dGVuZHMgUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IgewogIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uR2VuZXJhdG9yKAogICAgICBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGhlbHBlciwgVG9rZW4gdG9rZW4sIEV4cHJlc3Npb24gZXhwcmVzc2lvbikKICAgICAgOiBzdXBlcihoZWxwZXIsIHRva2VuLCBleHByZXNzaW9uLCBudWxsKTsKCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBidWlsZFNpbXBsZVJlYWQoKSA9PiBleHByZXNzaW9uOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIF9jcmVhdGVSZWFkKCkgPT4KICAgICAgX2hlbHBlci5mb3Jlc3QuY3JlYXRlUGFyZW50aGVzaXplZChmaWxlT2Zmc2V0LCBleHByZXNzaW9uKTsKCiAgU3RyaW5nIGdldCBfZGVidWdOYW1lID0+ICJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkdlbmVyYXRvciI7CgogIEV4cHJlc3Npb24gX21ha2VJbnZhbGlkV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgcmV0dXJuIF9oZWxwZXIuYnVpbGRQcm9ibGVtKG1lc3NhZ2VDYW5ub3RBc3NpZ25Ub1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uLAogICAgICAgIGZpbGVPZmZzZXQsIGxlbmd0aEZvclRva2VuKHRva2VuKSk7CiAgfQoKICAvKiBFeHByZXNzaW9uIHwgR2VuZXJhdG9yICovIGJ1aWxkUHJvcGVydHlBY2Nlc3MoCiAgICAgIEluY29tcGxldGVTZW5kR2VuZXJhdG9yIHNlbmQsIGludCBvcGVyYXRvck9mZnNldCwgYm9vbCBpc051bGxBd2FyZSkgewogICAgaWYgKHNlbmQgaXMgU2VuZEFjY2Vzc0dlbmVyYXRvcikgewogICAgICByZXR1cm4gX2hlbHBlci5idWlsZE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBfY3JlYXRlUmVhZCgpLCBzZW5kLm5hbWUsIHNlbmQuYXJndW1lbnRzLCBvZmZzZXRGb3JUb2tlbihzZW5kLnRva2VuKSwKICAgICAgICAgIGlzTnVsbEF3YXJlOiBpc051bGxBd2FyZSwKICAgICAgICAgIGlzQ29uc3RhbnRFeHByZXNzaW9uOiBzZW5kLmlzUG90ZW50aWFsbHlDb25zdGFudCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoX2hlbHBlci5jb25zdGFudENvbnRleHQgIT0gQ29uc3RhbnRDb250ZXh0Lm5vbmUgJiYKICAgICAgICAgIHNlbmQubmFtZSAhPSBsZW5ndGhOYW1lKSB7CiAgICAgICAgX2hlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbiwgZmlsZU9mZnNldCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IubWFrZSgK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a2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3ByZWZpeF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnQnOwoKaW1wb3J0ICcuLi9jb25zdGFudF9jb250ZXh0LmRhcnQnIHNob3cgQ29uc3RhbnRDb250ZXh0OwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JyBzaG93IExvY2F0ZWRNZXNzYWdlOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy5kYXJ0JyBzaG93IE1lc3NhZ2U7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydCcgc2hvdyBJbmZlcmVuY2VIZWxwZXI7CgppbXBvcnQgJ2NvbnN0bmVzcy5kYXJ0JyBzaG93IENvbnN0bmVzczsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAna2VybmVsX2FzdF9hcGkuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgSW5pdGlhbGl6ZXIsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgphYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uR2VuZXJhdG9ySGVscGVyIGltcGxlbWVudHMgSW5mZXJlbmNlSGVscGVyIHsKICBMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeUJ1aWxkZXI7CgogIENvbnN0YW50Q29udGV4dCBnZXQgY29uc3RhbnRDb250ZXh0OwoKICBGb3Jlc3QgZ2V0IGZvcmVzdDsKCiAgQ29uc3RydWN0b3IgbG9va3VwQ29uc3RydWN0b3IoTmFtZSBuYW1lLCB7Ym9vbCBpc1N1cGVyfSk7CgogIEV4cHJlc3Npb24gdG9WYWx1ZShub2RlKTsKCiAgTWVtYmVyIGxvb2t1cEluc3RhbmNlTWVtYmVyKE5hbWUgbmFtZSwge2Jvb2wgaXNTZXR0ZXIsIGJvb2wgaXNTdXBlcn0pOwoKICBzY29wZUxvb2t1cChTY29wZSBzY29wZSwgU3RyaW5nIG5hbWUsIFRva2VuIHRva2VuLAogICAgICB7Ym9vbCBpc1F1YWxpZmllZDogZmFsc2UsIFByZWZpeEJ1aWxkZXIgcHJlZml4fSk7CgogIGZpbmlzaFNlbmQoT2JqZWN0IHJlY2VpdmVyLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0KTsKCiAgSW5pdGlhbGl6ZXIgYnVpbGRJbnZhbGlkSW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBbaW50IG9mZnNldF0pOwoKICBMaXN0PEluaXRpYWxpemVyPiBidWlsZEZpZWxkSW5pdGlhbGl6ZXIoU3RyaW5nIG5hbWUsIGludCBmaWVsZE5hbWVPZmZzZXQsCiAgICAgIGludCBhc3NpZ25tZW50T2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIGZvcm1hbH0pOwoKICBJbml0aWFsaXplciBidWlsZFN1cGVySW5pdGlhbGl6ZXIoCiAgICAgIGJvb2wgaXNTeW50aGV0aWMsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBbaW50IG9mZnNldF0pOwoKICBJbml0aWFsaXplciBidWlsZFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoCiAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBbaW50IGNoYXJPZmZzZXQgPSAtMV0pOwoKICBFeHByZXNzaW9uIGJ1aWxkU3RhdGljSW52b2NhdGlvbihQcm9jZWR1cmUgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICB7Q29uc3RuZXNzIGNvbnN0bmVzcywgaW50IGNoYXJPZmZzZXR9KTsKCiAgRXhwcmVzc2lvbiBidWlsZEV4dGVuc2lvbk1ldGhvZEludm9jYXRpb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LCBQcm9jZWR1cmUgdGFyZ2V0LCBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICB7Ym9vbCBpc1RlYXJPZmZ9KTsKCiAgRXhwcmVzc2lvbiB0aHJvd05vU3VjaE1ldGhvZEVycm9yKAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwKICAgICAge01lbWJlciBjYW5kaWRhdGUsCiAgICAgIGJvb2wgaXNTdXBlciwKICAgICAgYm9vbCBpc0dldHRlciwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgYm9vbCBpc1N0YXRpYywKICAgICAgTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZX0pOwoKICBMb2NhdGVkTWVzc2FnZSBjaGVja0FyZ3VtZW50c0ZvckZ1bmN0aW9uKEZ1bmN0aW9uTm9kZSBmdW5jdGlvbiwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyk7CgogIFN0YXRpY0dldCBtYWtlU3RhdGljR2V0KE1lbWJlciByZWFkVGFyZ2V0LCBUb2tlbiB0b2tlbik7CgogIEV4cHJlc3Npb24gd3JhcEluRGVmZXJyZWRDaGVjaygKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBQcmVmaXhCdWlsZGVyIHByZWZpeCwgaW50IGNoYXJPZmZzZXQpOwoKICBib29sIGlzSWRlbnRpY2FsKE1lbWJlciBtZW1iZXIpOwoKICBFeHByZXNzaW9uIGJ1aWxkTWV0aG9kSW52b2NhdGlvbigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgTmFtZSBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBpbnQgb2Zmc2V0LAogICAgICB7Ym9vbCBpc0NvbnN0YW50RXhwcmVzc2lvbiwgYm9vbCBpc051bGxBd2FyZSwgYm9vbCBpc1N1cGVyfSk7CgogIEV4cHJlc3Npb24gYnVpbGRDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgdHlwZSwKICAgICAgVG9rZW4gbmFtZVRva2VuLAogICAgICBUb2tlbiBuYW1lTGFzdFRva2VuLAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLAogICAgICBTdHJpbmcgbmFtZSwKICAgICAgTGlzdDxVbnJlc29sdmVkVHlwZT4gdHlwZUFyZ3VtZW50cywKICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgIENvbnN0bmVzcyBjb25zdG5lc3MpOwoKICBVbnJlc29sdmVkVHlwZSB2YWxpZGF0ZVR5cGVVc2UoCiAgICAgIFVucmVzb2x2ZWRUeXBlIHVucmVzb2x2ZWQsIGJvb2wgbm9uSW5zdGFuY2VBY2Nlc3NJc0Vycm9yKTsKCiAgdm9pZCBhZGRQcm9ibGVtRXJyb3JJZkNvbnN0KE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgpOwoKICBFeHByZXNzaW9uIGJ1aWxkUHJvYmxlbUVycm9ySWZDb25zdCgKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCk7CgogIE1lc3NhZ2Ugd2FyblVucmVzb2x2ZWRHZXQoTmFtZSBuYW1lLCBpbnQgY2hhck9mZnNldCwge2Jvb2wgaXNTdXBlcn0pOwoKICBNZXNzYWdlIHdhcm5VbnJlc29sdmVkU2V0KE5hbWUgbmFtZSwgaW50IGNoYXJPZmZzZXQsIHtib29sIGlzU3VwZXJ9KTsKCiAgTWVzc2FnZSB3YXJuVW5yZXNvbHZlZE1ldGhvZChOYW1lIG5hbWUsIGludCBjaGFyT2Zmc2V0LCB7Ym9vbCBpc1N1cGVyfSk7CgogIHZvaWQgd2FyblR5cGVBcmd1bWVudHNNaXNtYXRjaChTdHJpbmcgbmFtZSwgaW50IGV4cGVjdGVkLCBpbnQgY2hhck9mZnNldCk7CgogIEV4cHJlc3Npb24gd3JhcEluTG9jYXRlZFByb2JsZW0oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBMb2NhdGVkTWVzc2FnZSBtZXNzYWdlLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dH0pOwoKICBFeHByZXNzaW9uIGV2YWx1YXRlQXJndW1lbnRzQmVmb3JlKAogICAgICBBcmd1bWVudHMgYXJndW1lbnRzLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pOwoKICBEYXJ0VHlwZSBidWlsZERhcnRUeXBlKFVucmVzb2x2ZWRUeXBlIHVucmVzb2x2ZWRUeXBlLAogICAgICB7Ym9vbCBub25JbnN0YW5jZUFjY2Vzc0lzRXJyb3J9KTsKCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGREYXJ0VHlwZUFyZ3VtZW50cyhMaXN0PFVucmVzb2x2ZWRUeXBlPiB1bnJlc29sdmVkVHlwZXMpOwoKICB2b2lkIHJlcG9ydER1cGxpY2F0ZWREZWNsYXJhdGlvbigKICAgICAgQnVpbGRlciBleGlzdGluZywgU3RyaW5nIG5hbWUsIGludCBjaGFyT2Zmc2V0KTsKCiAgLy8vIENyZWF0ZXMgYSBbVmFyaWFibGVHZXRdIG9mIHRoZSBbdmFyaWFibGVdIHVzaW5nIFtjaGFyT2Zmc2V0XSBhcyB0aGUgZmlsZQogIC8vLyBvZmZzZXQgb2YgdGhlIGNyZWF0ZWQgbm9kZS4KICBFeHByZXNzaW9uIGNyZWF0ZVZhcmlhYmxlR2V0KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIGludCBjaGFyT2Zmc2V0LAogICAgICB7Ym9vbCBmb3JOdWxsR3VhcmRlZEFjY2VzczogZmFsc2V9KTsKCiAgLy8vIFJlZ2lzdGVycyB0aGF0IFt2YXJpYWJsZV0gaXMgYXNzaWduZWQgdG8uCiAgLy8vCiAgLy8vIFRoaXMgaXMgbmVlZGVkIGZvciB0eXBlIHByb21vdGlvbi4KICB2b2lkIHJlZ2lzdGVyVmFyaWFibGVBc3NpZ25tZW50KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpOwp9CoCgAE5OPAErAUgBIjMqKTMqATgBMgEoASMBRwEoASIBGAEdCRMVEhQWFRAOExMXHQFGJQEnARUBPAEcAUkBNTgBQAFMAUwzKAElRhUBKzQeAUouAS09GQElSRkUFRUVIAFCTAE7ASJEASMBJEdEASkjFxsbEyoWHAEiQQFMASc0AUgBSAFLAU0BUScBJjMBOCgBTwEkNgFPIk0rATAGKUECAUNwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0WmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9mb3Jlc3QuZGFydMAAa9kvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5mYW5nb3JuOwoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bnN1cHBvcnRlZDsKCmltcG9ydCAnY29sbGVjdGlvbnMuZGFydCcKICAgIHNob3cKICAgICAgICBGb3JFbGVtZW50LAogICAgICAgIEZvckluRWxlbWVudCwKICAgICAgICBGb3JJbk1hcEVudHJ5LAogICAgICAgIEZvck1hcEVudHJ5LAogICAgICAgIElmRWxlbWVudCwKICAgICAgICBJZk1hcEVudHJ5LAogICAgICAgIFNwcmVhZEVsZW1lbnQ7CgppbXBvcnQgJ2ludGVybmFsX2FzdC5kYXJ0JzsKCi8vLyBBIHNoYWRvdyB0cmVlIGZhY3RvcnkuCmNsYXNzIEZvcmVzdCB7CiAgY29uc3QgRm9yZXN0KCk7CgogIEFyZ3VtZW50cyBjcmVhdGVBcmd1bWVudHMoaW50IGZpbGVPZmZzZXQsIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbCwKICAgICAge0xpc3Q8RGFydFR5cGU+IHR5cGVzLCBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWR9KSB7CiAgICByZXR1cm4gbmV3IEFyZ3VtZW50c0ltcGwocG9zaXRpb25hbCwgdHlwZXM6IHR5cGVzLCBuYW1lZDogbmFtZWQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQgPz8gVHJlZU5vZGUubm9PZmZzZXQ7CiAgfQoKICBBcmd1bWVudHMgY3JlYXRlQXJndW1lbnRzRm9yRXh0ZW5zaW9uTWV0aG9kKAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgaW50IGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgaW50IHR5cGVQYXJhbWV0ZXJDb3VudCwKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwKICAgICAge0xpc3Q8RGFydFR5cGU+IGV4dGVuc2lvblR5cGVBcmd1bWVudHMgPSBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgIGludCBleHRlbnNpb25UeXBlQXJndW1lbnRPZmZzZXQsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPSBjb25zdCA8RGFydFR5cGU+W10sCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gcG9zaXRpb25hbEFyZ3VtZW50cyA9IGNvbnN0IDxFeHByZXNzaW9uPltdLAogICAgICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWRBcmd1bWVudHMgPSBjb25zdCA8TmFtZWRFeHByZXNzaW9uPltdfSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEFyZ3VtZW50c0ltcGwuZm9yRXh0ZW5zaW9uTWV0aG9kKAogICAgICAgIGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudCwgdHlwZVBhcmFtZXRlckNvdW50LCByZWNlaXZlciwKICAgICAgICBleHRlbnNpb25UeXBlQXJndW1lbnRzOiBleHRlbnNpb25UeXBlQXJndW1lbnRzLAogICAgICAgIGV4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldDogZXh0ZW5zaW9uVHlwZUFyZ3VtZW50T2Zmc2V0LAogICAgICAgIHR5cGVBcmd1bWVudHM6IHR5cGVBcmd1bWVudHMsCiAgICAgICAgcG9zaXRpb25hbEFyZ3VtZW50czogcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICBuYW1lZEFyZ3VtZW50czogbmFtZWRBcmd1bWVudHMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQgPz8gVHJlZU5vZGUubm9PZmZzZXQ7CiAgfQoKICBBcmd1bWVudHMgY3JlYXRlQXJndW1lbnRzRW1wdHkoaW50IGZpbGVPZmZzZXQpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIGNyZWF0ZUFyZ3VtZW50cyhmaWxlT2Zmc2V0LCA8RXhwcmVzc2lvbj5bXSk7CiAgfQoKICBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gYXJndW1lbnRzTmFtZWQoQXJndW1lbnRzIGFyZ3VtZW50cykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5uYW1lZDsKICB9CgogIExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzUG9zaXRpb25hbChBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLnBvc2l0aW9uYWw7CiAgfQoKICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHNUeXBlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBhcmd1bWVudHMudHlwZXM7CiAgfQoKICB2b2lkIGFyZ3VtZW50c1NldFR5cGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgTGlzdDxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgIEFyZ3VtZW50c0ltcGwuc2V0Tm9uSW5mZXJyYWJsZUFyZ3VtZW50VHlwZXMoYXJndW1lbnRzLCB0eXBlcyk7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBib29sZWFuIGxpdGVyYWwgYXQgdGhlIGdpdmVuIFtmaWxlT2Zmc2V0XS4KICAvLy8gVGhlIGxpdGVyYWwgaGFzIHRoZSBnaXZlbiBbdmFsdWVdLgogIEJvb2xMaXRlcmFsIGNyZWF0ZUJvb2xMaXRlcmFsKGludCBmaWxlT2Zmc2V0LCBib29sIHZhbHVlKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgQm9vbExpdGVyYWwodmFsdWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGRvdWJsZSBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbZmlsZU9mZnNldF0uIFRoZQogIC8vLyBsaXRlcmFsIGhhcyB0aGUgZ2l2ZW4gW3ZhbHVlXS4KICBEb3VibGVMaXRlcmFsIGNyZWF0ZURvdWJsZUxpdGVyYWwoaW50IGZpbGVPZmZzZXQsIGRvdWJsZSB2YWx1ZSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IERvdWJsZUxpdGVyYWwodmFsdWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGxpdGVyYWwgYXQgdGhlIGdpdmVuIFtmaWxlT2Zmc2V0XS4KICAvLy8gVGhlIGxpdGVyYWwgaGFzIHRoZSBnaXZlbiBbdmFsdWVdLgogIEludExpdGVyYWwgY3JlYXRlSW50TGl0ZXJhbChpbnQgZmlsZU9mZnNldCwgaW50IHZhbHVlLCBbU3RyaW5nIGxpdGVyYWxdKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgSW50SnVkZ21lbnQodmFsdWUsIGxpdGVyYWwpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEludExpdGVyYWwgY3JlYXRlSW50TGl0ZXJhbExhcmdlKGludCBmaWxlT2Zmc2V0LCBTdHJpbmcgbGl0ZXJhbCkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFNoYWRvd0xhcmdlSW50TGl0ZXJhbChsaXRlcmFsLCBmaWxlT2Zmc2V0KTsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3QgbGl0ZXJhbCBhdCB0aGUgZ2l2ZW4gW2ZpbGVPZmZzZXRdLiBUaGUKICAvLy8gW2lzQ29uc3RdIGlzIGB0cnVlYCBpZiB0aGUgbGl0ZXJhbCBpcyBlaXRoZXIgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IGEKICAvLy8gY29uc3RhbnQuIFRoZSBbdHlwZUFyZ3VtZW50XSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNpbmdsZSB2YWxpZAogIC8vLyB0eXBlIGFyZ3VtZW50IHByZWNlZGluZyB0aGUgbGlzdCBsaXRlcmFsLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gdHlwZQogIC8vLyBhcmd1bWVudCwgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB0eXBlIGFyZ3VtZW50LCBvciBpZiB0aGUgdHlwZSBhcmd1bWVudAogIC8vLyBjYW5ub3QgYmUgcmVzb2x2ZWQuIFRoZSBsaXN0IG9mIFtleHByZXNzaW9uc10gaXMgYSBsaXN0IG9mIHRoZQogIC8vLyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGxpc3QgZWxlbWVudHMuCiAgTGlzdExpdGVyYWwgY3JlYXRlTGlzdExpdGVyYWwoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBEYXJ0VHlwZSB0eXBlQXJndW1lbnQsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMsCiAgICAgIHtib29sIGlzQ29uc3R9KSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIGFzc2VydChpc0NvbnN0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbChleHByZXNzaW9ucywKICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCwgaXNDb25zdDogaXNDb25zdCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHNldCBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbZmlsZU9mZnNldF0uIFRoZQogIC8vLyBbaXNDb25zdF0gaXMgYHRydWVgIGlmIHRoZSBsaXRlcmFsIGlzIGVpdGhlciBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgYQogIC8vLyBjb25zdGFudC4gVGhlIFt0eXBlQXJndW1lbnRdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2luZ2xlIHZhbGlkCiAgLy8vIHR5cGUgYXJndW1lbnQgcHJlY2VkaW5nIHRoZSBzZXQgbGl0ZXJhbCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHR5cGUKICAvLy8gYXJndW1lbnQsIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdHlwZSBhcmd1bWVudCwgb3IgaWYgdGhlIHR5cGUgYXJndW1lbnQKICAvLy8gY2Fubm90IGJlIHJlc29sdmVkLiBUaGUgbGlzdCBvZiBbZXhwcmVzc2lvbnNdIGlzIGEgbGlzdCBvZiB0aGUKICAvLy8gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBzZXQgZWxlbWVudHMuCiAgU2V0TGl0ZXJhbCBjcmVhdGVTZXRMaXRlcmFsKAogICAgICBpbnQgZmlsZU9mZnNldCwgRGFydFR5cGUgdHlwZUFyZ3VtZW50LCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zLAogICAgICB7Ym9vbCBpc0NvbnN0fSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNDb25zdCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgU2V0TGl0ZXJhbChleHByZXNzaW9ucywKICAgICAgICB0eXBlQXJndW1lbnQ6IHR5cGVBcmd1bWVudCwgaXNDb25zdDogaXNDb25zdCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbZmlsZU9mZnNldF0uIFRoZQogIC8vLyBbaXNDb25zdF0gaXMgYHRydWVgIGlmIHRoZSBsaXRlcmFsIGlzIGVpdGhlciBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgYQogIC8vLyBjb25zdGFudC4gVGhlIFtrZXlUeXBlXSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpcnN0IHR5cGUgYXJndW1lbnQKICAvLy8gcHJlY2VkaW5nIHRoZSBtYXAgbGl0ZXJhbCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBub3QgZXhhY3RseSB0d28gdHlwZQogIC8vLyBhcmd1bWVudHMgb3IgaWYgdGhlIGZpcnN0IHR5cGUgYXJndW1lbnQgY2Fubm90IGJlIHJlc29sdmVkLiBUaGUKICAvLy8gW3ZhbHVlVHlwZV0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWNvbmQgdHlwZSBhcmd1bWVudCBwcmVjZWRpbmcKICAvLy8gdGhlIG1hcCBsaXRlcmFsLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vdCBleGFjdGx5IHR3byB0eXBlIGFyZ3VtZW50cyBvcgogIC8vLyBpZiB0aGUgc2Vjb25kIHR5cGUgYXJndW1lbnQgY2Fubm90IGJlIHJlc29sdmVkLiBUaGUgbGlzdCBvZiBbZW50cmllc10gaXMgYQogIC8vLyBsaXN0IG9mIHRoZSByZXByZXNlbnRhdGlvbnMgb2YgdGhlIG1hcCBlbnRyaWVzLgogIE1hcExpdGVyYWwgY3JlYXRlTWFwTGl0ZXJhbChpbnQgZmlsZU9mZnNldCwgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLCBMaXN0PE1hcEVudHJ5PiBlbnRyaWVzLAogICAgICB7Ym9vbCBpc0NvbnN0fSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNDb25zdCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgTWFwTGl0ZXJhbChlbnRyaWVzLAogICAgICAgIGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLCBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgbnVsbCBsaXRlcmFsIGF0IHRoZSBnaXZlbiBbZmlsZU9mZnNldF0uCiAgTnVsbExpdGVyYWwgY3JlYXRlTnVsbExpdGVyYWwoaW50IGZpbGVPZmZzZXQpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHNpbXBsZSBzdHJpbmcgbGl0ZXJhbCBhdCB0aGUgZ2l2ZW4KICAvLy8gW2ZpbGVPZmZzZXRdLiBUaGUgbGl0ZXJhbCBoYXMgdGhlIGdpdmVuIFt2YWx1ZV0uIFRoaXMgZG9lcyBub3QgaW5jbHVkZQogIC8vLyBlaXRoZXIgYWRqYWNlbnQgc3RyaW5ncyBvciBpbnRlcnBvbGF0ZWQgc3RyaW5ncy4KICBTdHJpbmdMaXRlcmFsIGNyZWF0ZVN0cmluZ0xpdGVyYWwoaW50IGZpbGVPZmZzZXQsIFN0cmluZyB2YWx1ZSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFN0cmluZ0xpdGVyYWwodmFsdWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHN5bWJvbCBsaXRlcmFsIGRlZmluZWQgYnkgW3ZhbHVlXSBhdCB0aGUKICAvLy8gZ2l2ZW4gW2ZpbGVPZmZzZXRdLgogIFN5bWJvbExpdGVyYWwgY3JlYXRlU3ltYm9sTGl0ZXJhbChpbnQgZmlsZU9mZnNldCwgU3RyaW5nIHZhbHVlKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgU3ltYm9sTGl0ZXJhbCh2YWx1ZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgVHlwZUxpdGVyYWwgY3JlYXRlVHlwZUxpdGVyYWwoaW50IGZpbGVPZmZzZXQsIERhcnRUeXBlIHR5cGUpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBUeXBlTGl0ZXJhbCh0eXBlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBrZXkvdmFsdWUgcGFpciBpbiBhIGxpdGVyYWwgbWFwIGF0IHRoZSBnaXZlbgogIC8vLyBbZmlsZU9mZnNldF0uIFRoZSBba2V5XSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gdXNlZCB0bwogIC8vLyBjb21wdXRlIHRoZSBrZXkuIFRoZSBbdmFsdWVdIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB1c2VkCiAgLy8vIHRvIGNvbXB1dGUgdGhlIHZhbHVlLgogIE1hcEVudHJ5IGNyZWF0ZU1hcEVudHJ5KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGtleSwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IE1hcEVudHJ5KGtleSwgdmFsdWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gY3JlYXRlTG9hZExpYnJhcnkoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgTG9hZExpYnJhcnlJbXBsKGRlcGVuZGVuY3ksIGFyZ3VtZW50cykuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBjaGVja0xpYnJhcnlJc0xvYWRlZCgKICAgICAgaW50IGZpbGVPZmZzZXQsIExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBDaGVja0xpYnJhcnlJc0xvYWRlZChkZXBlbmRlbmN5KS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZUFzRXhwcmVzc2lvbigKICAgICAgaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZSwKICAgICAge2Jvb2wgZm9yTm9uTnVsbGFibGVCeURlZmF1bHR9KSB7CiAgICBhc3NlcnQoZm9yTm9uTnVsbGFibGVCeURlZmF1bHQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgQXNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHR5cGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQKICAgICAgLi5pc0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0ID0gZm9yTm9uTnVsbGFibGVCeURlZmF1bHQ7CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZVNwcmVhZEVsZW1lbnQoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAge2Jvb2wgaXNOdWxsQXdhcmV9KSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIGFzc2VydChpc051bGxBd2FyZSAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgU3ByZWFkRWxlbWVudChleHByZXNzaW9uLCBpc051bGxBd2FyZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBjcmVhdGVJZkVsZW1lbnQoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgRXhwcmVzc2lvbiB0aGVuLAogICAgICBbRXhwcmVzc2lvbiBvdGhlcndpc2VdKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgSWZFbGVtZW50KGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBNYXBFbnRyeSBjcmVhdGVJZk1hcEVudHJ5KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgTWFwRW50cnkgdGhlbiwKICAgICAgW01hcEVudHJ5IG90aGVyd2lzZV0pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJZk1hcEVudHJ5KGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZUZvckVsZW1lbnQoCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlcywKICAgICAgRXhwcmVzc2lvbiBib2R5KSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgRm9yRWxlbWVudCh2YXJpYWJsZXMsIGNvbmRpdGlvbiwgdXBkYXRlcywgYm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIE1hcEVudHJ5IGNyZWF0ZUZvck1hcEVudHJ5KAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXMsCiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uLAogICAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZXMsCiAgICAgIE1hcEVudHJ5IGJvZHkpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBGb3JNYXBFbnRyeSh2YXJpYWJsZXMsIGNvbmRpdGlvbiwgdXBkYXRlcywgYm9keSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gY3JlYXRlRm9ySW5FbGVtZW50KAogICAgICBpbnQgZmlsZU9mZnNldCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwKICAgICAgRXhwcmVzc2lvbiBpdGVyYWJsZSwKICAgICAgRXhwcmVzc2lvbiBzeW50aGVzaXplZEFzc2lnbm1lbnQsCiAgICAgIFN0YXRlbWVudCBleHByZXNzaW9uRWZmZWN0cywKICAgICAgRXhwcmVzc2lvbiBib2R5LAogICAgICBFeHByZXNzaW9uIHByb2JsZW0sCiAgICAgIHtib29sIGlzQXN5bmM6IGZhbHNlfSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEZvckluRWxlbWVudCh2YXJpYWJsZSwgaXRlcmFibGUsIHN5bnRoZXNpemVkQXNzaWdubWVudCwKICAgICAgICBleHByZXNzaW9uRWZmZWN0cywgYm9keSwgcHJvYmxlbSwKICAgICAgICBpc0FzeW5jOiBpc0FzeW5jKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgTWFwRW50cnkgY3JlYXRlRm9ySW5NYXBFbnRyeSgKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsCiAgICAgIEV4cHJlc3Npb24gaXRlcmFibGUsCiAgICAgIEV4cHJlc3Npb24gc3ludGhlc2l6ZWRBc3NpZ25tZW50LAogICAgICBTdGF0ZW1lbnQgZXhwcmVzc2lvbkVmZmVjdHMsCiAgICAgIE1hcEVudHJ5IGJvZHksCiAgICAgIEV4cHJlc3Npb24gcHJvYmxlbSwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgRm9ySW5NYXBFbnRyeSh2YXJpYWJsZSwgaXRlcmFibGUsIHN5bnRoZXNpemVkQXNzaWdubWVudCwKICAgICAgICBleHByZXNzaW9uRWZmZWN0cywgYm9keSwgcHJvYmxlbSwKICAgICAgICBpc0FzeW5jOiBpc0FzeW5jKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFzc2VydCB0aGF0IGFwcGVhcnMgaW4gYSBjb25zdHJ1Y3RvcidzCiAgLy8vIGluaXRpYWxpemVyIGxpc3QuCiAgQXNzZXJ0SW5pdGlhbGl6ZXIgY3JlYXRlQXNzZXJ0SW5pdGlhbGl6ZXIoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50KSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgQXNzZXJ0SW5pdGlhbGl6ZXIoYXNzZXJ0U3RhdGVtZW50KS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gYXNzZXJ0IHRoYXQgYXBwZWFycyBhcyBhIHN0YXRlbWVudC4KICBTdGF0ZW1lbnQgY3JlYXRlQXNzZXJ0U3RhdGVtZW50KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgRXhwcmVzc2lvbiBtZXNzYWdlLCBpbnQgY29uZGl0aW9uU3RhcnRPZmZzZXQsIGludCBjb25kaXRpb25FbmRPZmZzZXQpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBBc3NlcnRTdGF0ZW1lbnQoY29uZGl0aW9uLAogICAgICAgIGNvbmRpdGlvblN0YXJ0T2Zmc2V0OiBjb25kaXRpb25TdGFydE9mZnNldCwKICAgICAgICBjb25kaXRpb25FbmRPZmZzZXQ6IGNvbmRpdGlvbkVuZE9mZnNldCwKICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBjcmVhdGVBd2FpdEV4cHJlc3Npb24oaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gb3BlcmFuZCkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEF3YWl0RXhwcmVzc2lvbihvcGVyYW5kKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBibG9jayBvZiBbc3RhdGVtZW50c10gYXQgdGhlIGdpdmVuCiAgLy8vIFtmaWxlT2Zmc2V0XS4KICBTdGF0ZW1lbnQgY3JlYXRlQmxvY2soaW50IGZpbGVPZmZzZXQsIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIExpc3Q8U3RhdGVtZW50PiBjb3B5OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzW2ldOwogICAgICBpZiAoc3RhdGVtZW50IGlzIF9WYXJpYWJsZXNEZWNsYXJhdGlvbikgewogICAgICAgIGNvcHkgPz89IG5ldyBMaXN0PFN0YXRlbWVudD4uZnJvbShzdGF0ZW1lbnRzLmdldFJhbmdlKDAsIGkpKTsKICAgICAgICBjb3B5LmFkZEFsbChzdGF0ZW1lbnQuZGVjbGFyYXRpb25zKTsKICAgICAgfSBlbHNlIGlmIChjb3B5ICE9IG51bGwpIHsKICAgICAgICBjb3B5LmFkZChzdGF0ZW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEJsb2NrKGNvcHkgPz8gc3RhdGVtZW50cykuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgYnJlYWsgc3RhdGVtZW50LgogIFN0YXRlbWVudCBjcmVhdGVCcmVha1N0YXRlbWVudChpbnQgZmlsZU9mZnNldCwgT2JqZWN0IGxhYmVsKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSBbbGFiZWxdPwogICAgcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudEltcGwoaXNDb250aW51ZTogZmFsc2UpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGNhdGNoIGNsYXVzZS4KICBDYXRjaCBjcmVhdGVDYXRjaCgKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIERhcnRUeXBlIGV4Y2VwdGlvblR5cGUsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gZXhjZXB0aW9uUGFyYW1ldGVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHN0YWNrVHJhY2VQYXJhbWV0ZXIsCiAgICAgIERhcnRUeXBlIHN0YWNrVHJhY2VUeXBlLAogICAgICBTdGF0ZW1lbnQgYm9keSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IENhdGNoKGV4Y2VwdGlvblBhcmFtZXRlciwgYm9keSwKICAgICAgICBndWFyZDogZXhjZXB0aW9uVHlwZSwgc3RhY2tUcmFjZTogc3RhY2tUcmFjZVBhcmFtZXRlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYXQgdGhlIGdpdmVuCiAgLy8vIFtmaWxlT2Zmc2V0XS4gVGhlIFtjb25kaXRpb25dIGlzIHRoZSBleHByZXNzaW9uIHByZWNlZGluZyB0aGUgcXVlc3Rpb24KICAvLy8gbWFyay4gVGhlIFt0aGVuRXhwcmVzc2lvbl0gaXMgdGhlIGV4cHJlc3Npb24gZm9sbG93aW5nIHRoZSBxdWVzdGlvbiBtYXJrLgogIC8vLyBUaGUgW2Vsc2VFeHByZXNzaW9uXSBpcyB0aGUgZXhwcmVzc2lvbiBmb2xsb3dpbmcgdGhlIGNvbG9uLgogIEV4cHJlc3Npb24gY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgRXhwcmVzc2lvbiB0aGVuRXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBlbHNlRXhwcmVzc2lvbikgewogICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgY29uZGl0aW9uLCB0aGVuRXhwcmVzc2lvbiwgZWxzZUV4cHJlc3Npb24sIG51bGwpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBjb250aW51ZSBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGNyZWF0ZUNvbnRpbnVlU3RhdGVtZW50KGludCBmaWxlT2Zmc2V0LCBPYmplY3QgbGFiZWwpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIFtsYWJlbF0/CiAgICByZXR1cm4gbmV3IEJyZWFrU3RhdGVtZW50SW1wbChpc0NvbnRpbnVlOiB0cnVlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBkbyBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGNyZWF0ZURvU3RhdGVtZW50KAogICAgICBpbnQgZmlsZU9mZnNldCwgU3RhdGVtZW50IGJvZHksIEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgRG9TdGF0ZW1lbnQoYm9keSwgY29uZGl0aW9uKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgYXQgdGhlIGdpdmVuCiAgLy8vIFtmaWxlT2Zmc2V0XSBjb250YWluaW5nIHRoZSBbZXhwcmVzc2lvbl0uCiAgU3RhdGVtZW50IGNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbikuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVtcHR5IHN0YXRlbWVudCAgYXQgdGhlIGdpdmVuIFtmaWxlT2Zmc2V0XS4KICBTdGF0ZW1lbnQgY3JlYXRlRW1wdHlTdGF0ZW1lbnQoaW50IGZpbGVPZmZzZXQpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBFbXB0eVN0YXRlbWVudCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIGZvciBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGNyZWF0ZUZvclN0YXRlbWVudCgKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzLAogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiwKICAgICAgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGVycywKICAgICAgU3RhdGVtZW50IGJvZHkpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBGb3JTdGF0ZW1lbnQodmFyaWFibGVzID8/IFtdLCBjb25kaXRpb24sIHVwZGF0ZXJzLCBib2R5KQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBpZmAgc3RhdGVtZW50LgogIFN0YXRlbWVudCBjcmVhdGVJZlN0YXRlbWVudChpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50LCBTdGF0ZW1lbnQgZWxzZVN0YXRlbWVudCkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IElmU3RhdGVtZW50KGNvbmRpdGlvbiwgdGhlblN0YXRlbWVudCwgZWxzZVN0YXRlbWVudCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBgaXNgIGV4cHJlc3Npb24gYXQgdGhlIGdpdmVuIFtmaWxlT2Zmc2V0XS4KICAvLy8gVGhlIFtvcGVyYW5kXSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxlZnQgb3BlcmFuZC4gVGhlIFt0eXBlXSBpcyBhCiAgLy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIHRoYXQgaXMgdGhlIHJpZ2h0IG9wZXJhbmQuIElmIFtub3RGaWxlT2Zmc2V0XQogIC8vLyBpcyBub24tbnVsbCB0aGUgdGVzdCBpcyBuZWdhdGVkIHRoZSB0aGF0IGZpbGUgb2Zmc2V0LgogIEV4cHJlc3Npb24gY3JlYXRlSXNFeHByZXNzaW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBvcGVyYW5kLCBEYXJ0VHlwZSB0eXBlLAogICAgICB7Ym9vbCBmb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCwgaW50IG5vdEZpbGVPZmZzZXR9KSB7CiAgICBhc3NlcnQoZm9yTm9uTnVsbGFibGVCeURlZmF1bHQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IElzRXhwcmVzc2lvbihvcGVyYW5kLCB0eXBlKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0CiAgICAgIC4uaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGZvck5vbk51bGxhYmxlQnlEZWZhdWx0OwogICAgaWYgKG5vdEZpbGVPZmZzZXQgIT0gbnVsbCkgewogICAgICByZXN1bHQgPSBjcmVhdGVOb3Qobm90RmlsZU9mZnNldCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gb2YgYSBsb2dpY2FsIGV4cHJlc3Npb24gYXQgdGhlIGdpdmVuIFtmaWxlT2Zmc2V0XQogIC8vLyBoYXZpbmcgdGhlIFtsZWZ0T3BlcmFuZF0sIFtyaWdodE9wZXJhbmRdIGFuZCB0aGUgW29wZXJhdG9yXQogIC8vLyAoZWl0aGVyIGAmJmAgb3IgYHx8YCkuCiAgRXhwcmVzc2lvbiBjcmVhdGVMb2dpY2FsRXhwcmVzc2lvbihpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCwKICAgICAgU3RyaW5nIG9wZXJhdG9yLCBFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQob3BlcmF0b3IgPT0gJyYmJyB8fCBvcGVyYXRvciA9PSAnfHwnKTsKICAgIHJldHVybiBuZXcgTG9naWNhbEV4cHJlc3Npb24obGVmdE9wZXJhbmQsIG9wZXJhdG9yLCByaWdodE9wZXJhbmQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZU5vdChpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBvcGVyYW5kKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgTm90KG9wZXJhbmQpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHJldGhyb3cgc3RhdGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlCiAgLy8vIHJldGhyb3cgYXQgW3JldGhyb3dGaWxlT2Zmc2V0XSBhbmQgdGhlIHN0YXRlbWVudCBhdCBbc3RhdGVtZW50RmlsZU9mZnNldF0uCiAgU3RhdGVtZW50IGNyZWF0ZVJldGhyb3dTdGF0ZW1lbnQoCiAgICAgIGludCByZXRocm93RmlsZU9mZnNldCwgaW50IHN0YXRlbWVudEZpbGVPZmZzZXQpIHsKICAgIGFzc2VydChyZXRocm93RmlsZU9mZnNldCAhPSBudWxsKTsKICAgIGFzc2VydChzdGF0ZW1lbnRGaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgIG5ldyBSZXRocm93KCkuLmZpbGVPZmZzZXQgPSByZXRocm93RmlsZU9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50RmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHJldHVybiBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGNyZWF0ZVJldHVyblN0YXRlbWVudChpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICB7Ym9vbCBpc0Fycm93OiB0cnVlfSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudEltcGwoaXNBcnJvdywgZXhwcmVzc2lvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCA/PyBUcmVlTm9kZS5ub09mZnNldDsKICB9CgogIEV4cHJlc3Npb24gY3JlYXRlU3RyaW5nQ29uY2F0ZW5hdGlvbigKICAgICAgaW50IGZpbGVPZmZzZXQsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKGV4cHJlc3Npb25zKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICAvLy8gVGhlIGdpdmVuIFtzdGF0ZW1lbnRdIGlzIGJlaW5nIHVzZWQgYXMgdGhlIHRhcmdldCBvZiBlaXRoZXIgYSBicmVhayBvcgogIC8vLyBjb250aW51ZSBzdGF0ZW1lbnQuIFJldHVybiB0aGUgc3RhdGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGFjdHVhbAogIC8vLyB0YXJnZXQuCiAgU3RhdGVtZW50IGNyZWF0ZUxhYmVsZWRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgcmV0dXJuIG5ldyBMYWJlbGVkU3RhdGVtZW50KHN0YXRlbWVudCkuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gY3JlYXRlVGhpc0V4cHJlc3Npb24oaW50IGZpbGVPZmZzZXQpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHRocm93IGV4cHJlc3Npb24gYXQgdGhlIGdpdmVuIFtmaWxlT2Zmc2V0XS4KICBFeHByZXNzaW9uIGNyZWF0ZVRocm93KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBUaHJvdyhleHByZXNzaW9uKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBib29sIGlzVGhyb3coT2JqZWN0IG8pID0+IG8gaXMgVGhyb3c7CgogIFN0YXRlbWVudCBjcmVhdGVUcnlTdGF0ZW1lbnQoaW50IGZpbGVPZmZzZXQsIFN0YXRlbWVudCB0cnlCbG9jaywKICAgICAgTGlzdDxDYXRjaD4gY2F0Y2hCbG9ja3MsIFN0YXRlbWVudCBmaW5hbGx5QmxvY2spIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBUcnlTdGF0ZW1lbnQodHJ5QmxvY2ssIGNhdGNoQmxvY2tzID8/IDxDYXRjaD5bXSwgZmluYWxseUJsb2NrKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uIHZhcmlhYmxlc0RlY2xhcmF0aW9uKAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGRlY2xhcmF0aW9ucywgVXJpIHVyaSkgewogICAgcmV0dXJuIG5ldyBfVmFyaWFibGVzRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCB1cmkpOwogIH0KCiAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXNEZWNsYXJhdGlvbkV4dHJhY3REZWNsYXJhdGlvbnMoCiAgICAgIF9WYXJpYWJsZXNEZWNsYXJhdGlvbiB2YXJpYWJsZXNEZWNsYXJhdGlvbikgewogICAgcmV0dXJuIHZhcmlhYmxlc0RlY2xhcmF0aW9uLmRlY2xhcmF0aW9uczsKICB9CgogIFN0YXRlbWVudCB3cmFwVmFyaWFibGVzKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICAgIGlmIChzdGF0ZW1lbnQgaXMgX1ZhcmlhYmxlc0RlY2xhcmF0aW9uKSB7CiAgICAgIHJldHVybiBuZXcgQmxvY2soCiAgICAgICAgICBuZXcgTGlzdDxTdGF0ZW1lbnQ+LmZyb20oc3RhdGVtZW50LmRlY2xhcmF0aW9ucywgZ3Jvd2FibGU6IHRydWUpKQogICAgICAgIC4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0OwogICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICByZXR1cm4gbmV3IEJsb2NrKDxTdGF0ZW1lbnQ+W3N0YXRlbWVudF0pCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3RhdGVtZW50OwogICAgfQogIH0KCiAgLy8vIFJldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIGEgd2hpbGUgc3RhdGVtZW50IGF0IHRoZSBnaXZlbiBbZmlsZU9mZnNldF0KICAvLy8gY29uc2lzdGluZyBvZiB0aGUgZ2l2ZW4gW2NvbmRpdGlvbl0gYW5kIFtib2R5XS4KICBTdGF0ZW1lbnQgY3JlYXRlV2hpbGVTdGF0ZW1lbnQoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IGJvZHkpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBXaGlsZVN0YXRlbWVudChjb25kaXRpb24sIGJvZHkpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIC8vLyBSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiBhIHlpZWxkIHN0YXRlbWVudCBhdCB0aGUgZ2l2ZW4gW2ZpbGVPZmZzZXRdCiAgLy8vIG9mIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0uIElmIFtpc1lpZWxkU3Rhcl0gaXMgYHRydWVgIHRoZSBjcmVhdGVkCiAgLy8vIHN0YXRlbWVudCBpcyBhIHlpZWxkKiBzdGF0ZW1lbnQuCiAgU3RhdGVtZW50IGNyZWF0ZVlpZWxkU3RhdGVtZW50KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgIHtib29sIGlzWWllbGRTdGFyfSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNZaWVsZFN0YXIgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFlpZWxkU3RhdGVtZW50KGV4cHJlc3Npb24sIGlzWWllbGRTdGFyOiBpc1lpZWxkU3RhcikKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIGJvb2wgaXNCbG9jayhPYmplY3Qgbm9kZSkgPT4gbm9kZSBpcyBCbG9jazsKCiAgYm9vbCBpc0Vycm9uZW91c05vZGUoT2JqZWN0IG5vZGUpIHsKICAgIGlmIChub2RlIGlzIEV4cHJlc3Npb25TdGF0ZW1lbnQpIHsKICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSBub2RlOwogICAgICBub2RlID0gc3RhdGVtZW50LmV4cHJlc3Npb247CiAgICB9CiAgICBpZiAobm9kZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlOwogICAgICBub2RlID0gdmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICB9CiAgICBpZiAobm9kZSBpcyBMZXQpIHsKICAgICAgTGV0IGxldCA9IG5vZGU7CiAgICAgIG5vZGUgPSBsZXQudmFyaWFibGUuaW5pdGlhbGl6ZXI7CiAgICB9CiAgICByZXR1cm4gbm9kZSBpcyBJbnZhbGlkRXhwcmVzc2lvbjsKICB9CgogIGJvb2wgaXNUaGlzRXhwcmVzc2lvbihPYmplY3Qgbm9kZSkgPT4gbm9kZSBpcyBUaGlzRXhwcmVzc2lvbjsKCiAgYm9vbCBpc1ZhcmlhYmxlc0RlY2xhcmF0aW9uKE9iamVjdCBub2RlKSA9PiBub2RlIGlzIF9WYXJpYWJsZXNEZWNsYXJhdGlvbjsKCiAgLy8vIENyZWF0ZXMgW1ZhcmlhYmxlRGVjbGFyYXRpb25dIGZvciBhIHZhcmlhYmxlIG5hbWVkIFtuYW1lXSBhdCB0aGUgZ2l2ZW4KICAvLy8gW2Z1bmN0aW9uTmVzdGluZ0xldmVsXS4KICBWYXJpYWJsZURlY2xhcmF0aW9uIGNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LCBTdHJpbmcgbmFtZSwgaW50IGZ1bmN0aW9uTmVzdGluZ0xldmVsLAogICAgICB7RXhwcmVzc2lvbiBpbml0aWFsaXplciwKICAgICAgRGFydFR5cGUgdHlwZSwKICAgICAgYm9vbCBpc0ZpbmFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvbnN0OiBmYWxzZSwKICAgICAgYm9vbCBpc0ZpZWxkRm9ybWFsOiBmYWxzZSwKICAgICAgYm9vbCBpc0NvdmFyaWFudDogZmFsc2UsCiAgICAgIGJvb2wgaXNMb2NhbEZ1bmN0aW9uOiBmYWxzZX0pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbChuYW1lLCBmdW5jdGlvbk5lc3RpbmdMZXZlbCwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIGluaXRpYWxpemVyOiBpbml0aWFsaXplciwKICAgICAgICBpc0ZpbmFsOiBpc0ZpbmFsLAogICAgICAgIGlzQ29uc3Q6IGlzQ29uc3QsCiAgICAgICAgaXNGaWVsZEZvcm1hbDogaXNGaWVsZEZvcm1hbCwKICAgICAgICBpc0NvdmFyaWFudDogaXNDb3ZhcmlhbnQsCiAgICAgICAgaXNMb2NhbEZ1bmN0aW9uOiBpc0xvY2FsRnVuY3Rpb24sCiAgICAgICAgaGFzRGVjbGFyZWRJbml0aWFsaXplcjogaW5pdGlhbGl6ZXIgIT0gbnVsbCk7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uIGNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZShFeHByZXNzaW9uIGluaXRpYWxpemVyLAogICAgICB7RGFydFR5cGUgdHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCl9KSB7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsLmZvclZhbHVlKGluaXRpYWxpemVyKQogICAgICAuLnR5cGUgPSB0eXBlCiAgICAgIC4uZmlsZU9mZnNldCA9IGluaXRpYWxpemVyLmZpbGVPZmZzZXQ7CiAgfQoKICBMZXQgY3JlYXRlTGV0KFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIEV4cHJlc3Npb24gYm9keSkgewogICAgcmV0dXJuIG5ldyBMZXQodmFyaWFibGUsIGJvZHkpOwogIH0KCiAgRnVuY3Rpb25Ob2RlIGNyZWF0ZUZ1bmN0aW9uTm9kZShpbnQgZmlsZU9mZnNldCwgU3RhdGVtZW50IGJvZHksCiAgICAgIHtMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycywKICAgICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQsCiAgICAgIERhcnRUeXBlIHJldHVyblR5cGU6IGNvbnN0IER5bmFtaWNUeXBlKCksCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTWFya2VyOiBBc3luY01hcmtlci5TeW5jLAogICAgICBBc3luY01hcmtlciBkYXJ0QXN5bmNNYXJrZXJ9KSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25Ob2RlKGJvZHksCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzOiBwb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHJldHVyblR5cGU6IHJldHVyblR5cGUsCiAgICAgICAgYXN5bmNNYXJrZXI6IGFzeW5jTWFya2VyLAogICAgICAgIGRhcnRBc3luY01hcmtlcjogZGFydEFzeW5jTWFya2VyKTsKICB9CgogIFR5cGVQYXJhbWV0ZXIgY3JlYXRlVHlwZVBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyKG5hbWUpOwogIH0KCiAgVHlwZVBhcmFtZXRlclR5cGUgY3JlYXRlVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHlwZVBhcmFtZXRlciwgbnVsbGFiaWxpdHkpOwogIH0KCiAgVHlwZVBhcmFtZXRlclR5cGUgY3JlYXRlVHlwZVBhcmFtZXRlclR5cGVXaXRoRGVmYXVsdE51bGxhYmlsaXR5Rm9yTGlicmFyeSgKICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyLCBMaWJyYXJ5IGxpYnJhcnkpIHsKICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUud2l0aERlZmF1bHROdWxsYWJpbGl0eUZvckxpYnJhcnkoCiAgICAgICAgdHlwZVBhcmFtZXRlciwgbGlicmFyeSk7CiAgfQoKICBGdW5jdGlvbkV4cHJlc3Npb24gY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKGZ1bmN0aW9uKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBFeHByZXNzaW9uIGNyZWF0ZUV4cHJlc3Npb25JbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkludm9jYXRpb24oZXhwcmVzc2lvbiwgYXJndW1lbnRzKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBOYW1lIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBNZXRob2RJbnZvY2F0aW9uKGV4cHJlc3Npb24sIG5hbWUsIGFyZ3VtZW50cykKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIE5hbWVkRXhwcmVzc2lvbiBjcmVhdGVOYW1lZEV4cHJlc3Npb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgTmFtZWRFeHByZXNzaW9uKG5hbWUsIGV4cHJlc3Npb24pLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIFN0YXRpY0ludm9jYXRpb24gY3JlYXRlU3RhdGljSW52b2NhdGlvbigKICAgICAgaW50IGZpbGVPZmZzZXQsIFByb2NlZHVyZSBwcm9jZWR1cmUsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBTdGF0aWNJbnZvY2F0aW9uKHByb2NlZHVyZSwgYXJndW1lbnRzKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBTdXBlck1ldGhvZEludm9jYXRpb24gY3JlYXRlU3VwZXJNZXRob2RJbnZvY2F0aW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwgTmFtZSBuYW1lLCBQcm9jZWR1cmUgcHJvY2VkdXJlLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgU3VwZXJNZXRob2RJbnZvY2F0aW9uKG5hbWUsIGFyZ3VtZW50cywgcHJvY2VkdXJlKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgTnVsbENoZWNrIGNyZWF0ZU51bGxDaGVjayhpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIHJldHVybiBuZXcgTnVsbENoZWNrKGV4cHJlc3Npb24pLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIFByb3BlcnR5R2V0IGNyZWF0ZVByb3BlcnR5R2V0KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyLCBOYW1lIG5hbWUsCiAgICAgIHtNZW1iZXIgaW50ZXJmYWNlVGFyZ2V0fSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0KHJlY2VpdmVyLCBuYW1lLCBpbnRlcmZhY2VUYXJnZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBQcm9wZXJ0eVNldCBjcmVhdGVQcm9wZXJ0eVNldCgKICAgICAgaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gcmVjZWl2ZXIsIE5hbWUgbmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSwKICAgICAge01lbWJlciBpbnRlcmZhY2VUYXJnZXQsIGJvb2wgZm9yRWZmZWN0LCBib29sIHJlYWRPbmx5UmVjZWl2ZXI6IGZhbHNlfSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5U2V0SW1wbChyZWNlaXZlciwgbmFtZSwgdmFsdWUsCiAgICAgICAgaW50ZXJmYWNlVGFyZ2V0OiBpbnRlcmZhY2VUYXJnZXQsCiAgICAgICAgZm9yRWZmZWN0OiBmb3JFZmZlY3QsCiAgICAgICAgcmVhZE9ubHlSZWNlaXZlcjogcmVhZE9ubHlSZWNlaXZlcikKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEluZGV4R2V0IGNyZWF0ZUluZGV4R2V0KAogICAgICBpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBpbmRleCkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEluZGV4R2V0KHJlY2VpdmVyLCBpbmRleCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgSW5kZXhTZXQgY3JlYXRlSW5kZXhTZXQoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyLCBFeHByZXNzaW9uIGluZGV4LCBFeHByZXNzaW9uIHZhbHVlLAogICAgICB7Ym9vbCBmb3JFZmZlY3QsIGJvb2wgcmVhZE9ubHlSZWNlaXZlcn0pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgYXNzZXJ0KGZvckVmZmVjdCAhPSBudWxsKTsKICAgIGFzc2VydChyZWFkT25seVJlY2VpdmVyICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBJbmRleFNldChyZWNlaXZlciwgaW5kZXgsIHZhbHVlLAogICAgICAgIGZvckVmZmVjdDogZm9yRWZmZWN0LCByZWFkT25seVJlY2VpdmVyOiByZWFkT25seVJlY2VpdmVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgRXF1YWxzRXhwcmVzc2lvbiBjcmVhdGVFcXVhbHMoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGxlZnQsIEV4cHJlc3Npb24gcmlnaHQsCiAgICAgIHtib29sIGlzTm90fSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoaXNOb3QgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IEVxdWFsc0V4cHJlc3Npb24obGVmdCwgcmlnaHQsIGlzTm90OiBpc05vdCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEJpbmFyeUV4cHJlc3Npb24gY3JlYXRlQmluYXJ5KAogICAgICBpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiBsZWZ0LCBOYW1lIGJpbmFyeU5hbWUsIEV4cHJlc3Npb24gcmlnaHQpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBCaW5hcnlFeHByZXNzaW9uKGxlZnQsIGJpbmFyeU5hbWUsIHJpZ2h0KQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgVW5hcnlFeHByZXNzaW9uIGNyZWF0ZVVuYXJ5KAogICAgICBpbnQgZmlsZU9mZnNldCwgTmFtZSB1bmFyeU5hbWUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICByZXR1cm4gbmV3IFVuYXJ5RXhwcmVzc2lvbih1bmFyeU5hbWUsIGV4cHJlc3Npb24pLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBhcmVudGhlc2l6ZWQoCiAgICAgIGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgcmV0dXJuIG5ldyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihleHByZXNzaW9uKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQp9CgpjbGFzcyBfVmFyaWFibGVzRGVjbGFyYXRpb24gZXh0ZW5kcyBTdGF0ZW1lbnQgewogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zOwogIGZpbmFsIFVyaSB1cmk7CgogIF9WYXJpYWJsZXNEZWNsYXJhdGlvbih0aGlzLmRlY2xhcmF0aW9ucywgdGhpcy51cmkpIHsKICAgIHNldFBhcmVudHMoZGVjbGFyYXRpb25zLCB0aGlzKTsKICB9CgogIFIgYWNjZXB0PFI+KHYpIHsKICAgIHRocm93IHVuc3VwcG9ydGVkKCJhY2NlcHQiLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KCiAgUiBhY2NlcHQxPFIsIEE+KHYsIGFyZykgewogICAgdGhyb3cgdW5zdXBwb3J0ZWQoImFjY2VwdDEiLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KCiAgdmlzaXRDaGlsZHJlbih2KSB7CiAgICB0aHJvdyB1bnN1cHBvcnRlZCgidmlzaXRDaGlsZHJlbiIsIGZpbGVPZmZzZXQsIHVyaSk7CiAgfQoKICB0cmFuc2Zvcm1DaGlsZHJlbih2KSB7CiAgICB0aHJvdyB1bnN1cHBvcnRlZCgidHJhbnNmb3JtQ2hpbGRyZW4iLCBmaWxlT2Zmc2V0LCB1cmkpOwogIH0KfQqC9wBOTjwBFwEiASIBLAEaCRQWFxUTFBcBHAEbDxIBST1FNgQBLxYnHhtDJzlDSyAxQzhCJjIoNgQBMyA4BAE+HAQBPiEEAT8cBAFOQwQBTik+IDwEAVElRCA+BAFPKU0gRQQBRSA7BAFPTk1OTkUsIUsYIB0oNiEEAU5OTU1ORSsfSxggHSc2IQQBTk5PTUZOUFE2QDIYIB0jQiEEAUsyIDcEAUZNN0QgPgQBTBpEID4EAUEgOwQBUE5QHE4gPgQBIEsgUAQBIzYgSgQBITwoLSAuID0EAUgcICFQBAEePSAgTwQBUR4gUAQBHxYrHCAZID8hBAEeFiscIBcgQCEEASEWJBsoIxcaHyBHKhohBAEgFiQbKCMVGh8gSCoaIQQBSxgtOSBMBAFISE4gKjQwGiEEAUkgQgQBRhRGIBoyKzBGLSEdCAZDBAE0QSApTwQBMRUWHi4vHxggLz8hBAFHTVBCTz4mOSEEATdEIClOBAExHz4gRgQBRjBPIEkEAVAzIDoEATIgFiscIRggSCEEATREOiBEIQQBT09PPCE5Oy0gOCA9ITEGEwQBUEIdTTIgMkYhBAE9IDYEAUdRJDgnKSQ3KgQBNUkeIDg2BAEoNiAtSgQBTVEOOk8EATQgOgQBT0IgOwQBKAFDOSBOIQQBLjk5BAFFNC4EATEuGEwtMy8tDRgGBAFNNiI+IEkEAU1IJ0gcICFEIQQBLgEmJywjBicrIwYXFicGJgQBQAFNAU0eMT0fFRsbIR8mIEMUIhoaJiIqNgQBUC89FC0EAUEkBAFCKzYxIjAxJiAiKDQqOCAiKwQBMyQEAS0+PgQBTTZDIQQBLy8gRgQBKUQgOyEEAStPID0hBAEpPCBLBAErQiBQBAE1TSBBIQQBRSA/BAFQIiA8IQQBIUhQIDYqHiwhBAEbPyBDBAEbTzEgHyYwQiEEASE5FiAbOyEEASFMIDkhBAEfPyBQBAEvLyBNBAIBMDARATckBAETMgQBHDMEARU5BAEZPQQCAS5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ZvcmVzdC5kYXJ0amZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnSFxy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmxpYnJhcnkgZmFzdGEuaW1wbGljaXRfdHlwZV9hcmd1bWVudDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93IERhcnRUeXBlLCBEYXJ0VHlwZVZpc2l0b3IsIERhcnRUeXBlVmlzaXRvcjEsIE51bGxhYmlsaXR5LCBWaXNpdG9yOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9hc3N1bXB0aW9ucy5kYXJ0JzsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQsIHVuc3VwcG9ydGVkOwoKLy8vIE1hcmtlciB0eXBlIHVzZWQgYXMgdHlwZSBhcmd1bWVudCBvbiBsaXN0LCBzZXQgYW5kIG1hcCBsaXRlcmFscyB3aGVuZXZlcgovLy8gdHlwZSBhcmd1bWVudHMgYXJlIG9taXR0ZWQgaW4gdGhlIHNvdXJjZS4KLy8vCi8vLyBBbGwgb2YgdGhlc2UgdHlwZXMgYXJlIHJlcGxhY2VkIGJ5IHRoZSB0eXBlIGluZmVyZW5jZS4gSXQgaXMgYW4gaW50ZXJuYWwKLy8vIGVycm9yIGlmIG9uZSBzdXJ2aXZlcyB0byB0aGUgZmluYWwgb3V0cHV0LgpjbGFzcyBJbXBsaWNpdFR5cGVBcmd1bWVudCBleHRlbmRzIERhcnRUeXBlIHsKICBjb25zdCBJbXBsaWNpdFR5cGVBcmd1bWVudCgpOwoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSBnZXQgbnVsbGFiaWxpdHkgPT4gdW5zdXBwb3J0ZWQoIm51bGxhYmlsaXR5IiwgLTEsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihEYXJ0VHlwZVZpc2l0b3I8Uj4gdikgewogICAgdGhyb3cgdW5oYW5kbGVkKCIkcnVudGltZVR5cGUiLCAiJHt2LnJ1bnRpbWVUeXBlfSIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0MTxSLCBBPihEYXJ0VHlwZVZpc2l0b3IxPFIsIEE+IHYsIEEgYXJnKSB7CiAgICB0aHJvdyB1bmhhbmRsZWQoIiRydW50aW1lVHlwZSIsICIke3YucnVudGltZVR5cGV9IiwgLTEsIG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDaGlsZHJlbihWaXNpdG9yPE9iamVjdD4gdikgewogICAgdW5oYW5kbGVkKCIkcnVudGltZVR5cGUiLCAiJHt2LnJ1bnRpbWVUeXBlfSIsIC0xLCBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIEltcGxpY2l0VHlwZUFyZ3VtZW50IHdpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJ3aXRoTnVsbGFiaWxpdHkiLCAtMSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKSA9PiB0aGlzID09IG90aGVyOwp9CjAATU4/ASYBIUwuATcBTS4ETS8uIAEMRwEMJkMEAQw1QwQBDCU9BAEMQjUEAQxHAgE+cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnRjZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0wACcsy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIE5ldmVyVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZhcmlhbmNlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBjb250YWluc1R5cGVWYXJpYWJsZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdXRpbC9ncmFwaC5kYXJ0JyBzaG93IEdyYXBoLCBjb21wdXRlU3Ryb25nQ29tcG9uZW50czsKCmltcG9ydCAnLi4vYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvaW52YWxpZF90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9udWxsYWJpbGl0eV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9kaWxsL2RpbGxfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IERpbGxDbGFzc0J1aWxkZXI7CgppbXBvcnQgJy4uL2RpbGwvZGlsbF90eXBlX2FsaWFzX2J1aWxkZXIuZGFydCcgc2hvdyBEaWxsVHlwZUFsaWFzQnVpbGRlcjsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICB0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHksCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHksCiAgICAgICAgdGVtcGxhdGVCb3VuZElzc3VlVmlhUmF3VHlwZVdpdGhOb25TaW1wbGVCb3VuZHMsCiAgICAgICAgdGVtcGxhdGVDeWNsaWNUeXBlZGVmLAogICAgICAgIHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2UsCiAgICAgICAgdGVtcGxhdGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBWYXJpYW5jZTsKCi8vLyBJbml0aWFsIHZhbHVlIGZvciAidmFyaWFuY2UiIHRoYXQgaXMgdG8gYmUgY29tcHV0ZWQgYnkgdGhlIGNvbXBpbGVyLgpjb25zdCBpbnQgcGVuZGluZ1ZhcmlhbmNlID0gLTE7CgovLyBDb21wdXRlcyB0aGUgdmFyaWFuY2Ugb2YgYSB2YXJpYWJsZSBpbiBhIHR5cGUuICBUaGUgZnVuY3Rpb24gY2FuIGJlIHJ1bgovLyBiZWZvcmUgdGhlIHR5cGVzIGFyZSByZXNvbHZlZCB0byBjb21wdXRlIHZhcmlhbmNlcyBvZiB0eXBlZGVmcycgdHlwZQovLyB2YXJpYWJsZXMuICBGb3IgdGhhdCBjYXNlIGlmIHRoZSB0eXBlIGhhcyBpdHMgZGVjbGFyYXRpb24gc2V0IHRvIG51bGwgYW5kIGl0cwovLyBuYW1lIG1hdGNoZXMgdGhhdCBvZiB0aGUgdmFyaWFibGUsIGl0J3MgaW50ZXJwcmV0ZWQgYXMgYW4gb2NjdXJyZW5jZSBvZiBhCi8vIHR5cGUgdmFyaWFibGUuCmludCBjb21wdXRlVmFyaWFuY2UoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSwgVHlwZUJ1aWxkZXIgdHlwZSwKICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyKSB7CiAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgYXNzZXJ0KHR5cGUuZGVjbGFyYXRpb24gIT0gbnVsbCk7CiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uID0gdHlwZS5kZWNsYXJhdGlvbjsKICAgIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlVmFyaWFibGVCdWlsZGVyKSB7CiAgICAgIGlmIChkZWNsYXJhdGlvbiA9PSB2YXJpYWJsZSkgewogICAgICAgIHJldHVybiBWYXJpYW5jZS5jb3ZhcmlhbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFZhcmlhbmNlLnVucmVsYXRlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIGludCByZXN1bHQgPSBWYXJpYW5jZS51bnJlbGF0ZWQ7CiAgICAgICAgaWYgKHR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5hcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgcmVzdWx0ID0gVmFyaWFuY2UubWVldCgKICAgICAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgICAgIFZhcmlhbmNlLmNvbWJpbmUoCiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uY2xzLnR5cGVQYXJhbWV0ZXJzW2ldLnZhcmlhbmNlLAogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSgKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIHR5cGUuYXJndW1lbnRzW2ldLCBsaWJyYXJ5QnVpbGRlcikpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgaW50IHJlc3VsdCA9IFZhcmlhbmNlLnVucmVsYXRlZDsKCiAgICAgICAgaWYgKHR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5hcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgaW50IHZpc2l0TWFya2VyID0gLTI7CgogICAgICAgICAgICBpbnQgZGVjbGFyYXRpb25UeXBlVmFyaWFibGVWYXJpYW5jZSA9IGRlY2xhcmF0aW9uLnZhcmlhbmNlQXQoaSk7CiAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvblR5cGVWYXJpYWJsZVZhcmlhbmNlID09IHBlbmRpbmdWYXJpYW5jZSkgewogICAgICAgICAgICAgIGFzc2VydCghZGVjbGFyYXRpb24uZnJvbURpbGwpOwogICAgICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgZGVjbGFyYXRpb25UeXBlVmFyaWFibGUgPQogICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzW2ldOwogICAgICAgICAgICAgIGRlY2xhcmF0aW9uVHlwZVZhcmlhYmxlLnZhcmlhbmNlID0gdmlzaXRNYXJrZXI7CiAgICAgICAgICAgICAgaW50IGNvbXB1dGVkVmFyaWFuY2UgPSBjb21wdXRlVmFyaWFuY2UoCiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uVHlwZVZhcmlhYmxlLCBkZWNsYXJhdGlvbi50eXBlLCBsaWJyYXJ5QnVpbGRlcik7CiAgICAgICAgICAgICAgZGVjbGFyYXRpb25UeXBlVmFyaWFibGVWYXJpYW5jZSA9CiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uVHlwZVZhcmlhYmxlLnZhcmlhbmNlID0gY29tcHV0ZWRWYXJpYW5jZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvblR5cGVWYXJpYWJsZVZhcmlhbmNlID09IHZpc2l0TWFya2VyKSB7CiAgICAgICAgICAgICAgYXNzZXJ0KCFkZWNsYXJhdGlvbi5mcm9tRGlsbCk7CiAgICAgICAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBkZWNsYXJhdGlvblR5cGVWYXJpYWJsZSA9CiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXNbaV07CiAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDeWNsaWNUeXBlZGVmLndpdGhBcmd1bWVudHMoZGVjbGFyYXRpb24ubmFtZSksCiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgICAgICAgICAgICAvLyBVc2UgW1ZhcmlhbmNlLnVucmVsYXRlZF0gZm9yIHJlY292ZXJ5LiAgVGhlIHR5cGUgd2l0aCB0aGUKICAgICAgICAgICAgICAvLyBjeWNsaWMgZGVwZW5kZW5jeSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYW4gW0ludmFsaWRUeXBlXQogICAgICAgICAgICAgIC8vIGVsc2V3aGVyZS4KICAgICAgICAgICAgICBkZWNsYXJhdGlvblR5cGVWYXJpYWJsZVZhcmlhbmNlID0KICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25UeXBlVmFyaWFibGUudmFyaWFuY2UgPSBWYXJpYW5jZS51bnJlbGF0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLm1lZXQoCiAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgICAgICBWYXJpYW5jZS5jb21iaW5lKAogICAgICAgICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSgKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIHR5cGUuYXJndW1lbnRzW2ldLCBsaWJyYXJ5QnVpbGRlciksCiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25UeXBlVmFyaWFibGVWYXJpYW5jZSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgIGludCByZXN1bHQgPSBWYXJpYW5jZS51bnJlbGF0ZWQ7CiAgICBpZiAodHlwZS5yZXR1cm5UeXBlICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID0gVmFyaWFuY2UubWVldCgKICAgICAgICAgIHJlc3VsdCwgY29tcHV0ZVZhcmlhbmNlKHZhcmlhYmxlLCB0eXBlLnJldHVyblR5cGUsIGxpYnJhcnlCdWlsZGVyKSk7CiAgICB9CiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHR5cGVWYXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAvLyBJZiBbdmFyaWFibGVdIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGJvdW5kIGF0IGFsbCwgaXQgbWFrZXMgdGhlCiAgICAgICAgLy8gdmFyaWFuY2Ugb2YgW3ZhcmlhYmxlXSBpbiB0aGUgZW50aXJlIHR5cGUgaW52YXJpYW50LiAgVGhlIGludm9jYXRpb24KICAgICAgICAvLyBvZiBbY29tcHV0ZVZhcmlhbmNlXSBiZWxvdyBpcyBtYWRlIHRvIHNpbXBseSBmaWd1cmUgb3V0IGlmIFt2YXJpYWJsZV0KICAgICAgICAvLyBvY2N1cnMgaW4gdGhlIGJvdW5kLgogICAgICAgIGlmICh0eXBlVmFyaWFibGUuYm91bmQgIT0gbnVsbCAmJgogICAgICAgICAgICBjb21wdXRlVmFyaWFuY2UodmFyaWFibGUsIHR5cGVWYXJpYWJsZS5ib3VuZCwgbGlicmFyeUJ1aWxkZXIpICE9CiAgICAgICAgICAgICAgICBWYXJpYW5jZS51bnJlbGF0ZWQpIHsKICAgICAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLmludmFyaWFudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIHR5cGUuZm9ybWFscykgewogICAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLm1lZXQoCiAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgVmFyaWFuY2UuY29tYmluZShWYXJpYW5jZS5jb250cmF2YXJpYW50LAogICAgICAgICAgICAgICAgY29tcHV0ZVZhcmlhbmNlKHZhcmlhYmxlLCBmb3JtYWwudHlwZSwgbGlicmFyeUJ1aWxkZXIpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiBWYXJpYW5jZS51bnJlbGF0ZWQ7Cn0KCi8vLyBDb21iaW5lcyBzeW50YWN0aWMgbnVsbGFiaWxpdGllcyBvbiB0eXBlcyBmb3IgcGVyZm9ybWluZyB0eXBlIHN1YnN0aXR1dGlvbi4KLy8vCi8vLyBUaGUgc3ludGFjdGljIHN1YnN0aXR1dGlvbiBzaG91bGQgcHJlc2VydmUgYSBgP2AgaWYgaXQgd2FzIGVpdGhlciBvbiB0aGUKLy8vIHR5cGUgcGFyYW1ldGVyIG9jY3VycmVuY2Ugb3Igb24gdGhlIHR5cGUgYXJndW1lbnQgcmVwbGFjaW5nIGl0LgpOdWxsYWJpbGl0eUJ1aWxkZXIgY29tYmluZU51bGxhYmlsaXR5QnVpbGRlcnNGb3JTdWJzdGl0dXRpb24oCiAgICBOdWxsYWJpbGl0eUJ1aWxkZXIgYSwgTnVsbGFiaWxpdHlCdWlsZGVyIGIpIHsKICBhc3NlcnQoCiAgICAgIChpZGVudGljYWwoYSwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm51bGxhYmxlKCkpIHx8CiAgICAgICAgICAgICAgaWRlbnRpY2FsKGEsIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCkpKSAmJgogICAgICAgICAgKGlkZW50aWNhbChiLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKSkgfHwKICAgICAgICAgICAgICBpZGVudGljYWwoYiwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKSkpLAogICAgICAiQm90aCBhcmd1bWVudHMgdG8gY29tYmluZU51bGxhYmlsaXR5QnVpbGRlcnNGb3JTdWJzdGl0dXRpb24gIgogICAgICAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBlaXRoZXIgJ2NvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5udWxsYWJsZSgpJyBvciAiCiAgICAgICInY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKScuIik7CgogIGlmIChpZGVudGljYWwoYSwgY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm51bGxhYmxlKCkpIHx8CiAgICAgIGlkZW50aWNhbChiLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKSkpIHsKICAgIHJldHVybiBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKTsKICB9CgogIHJldHVybiBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpOwp9CgpUeXBlQnVpbGRlciBzdWJzdGl0dXRlUmFuZ2UoCiAgICBUeXBlQnVpbGRlciB0eXBlLAogICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiB1cHBlclN1YnN0aXR1dGlvbiwKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj4gbG93ZXJTdWJzdGl0dXRpb24sCiAgICBMaXN0PFR5cGVCdWlsZGVyPiB1bmJvdW5kVHlwZXMsCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHVuYm91bmRUeXBlVmFyaWFibGVzLAogICAge2ZpbmFsIGludCB2YXJpYW5jZSA9IFZhcmlhbmNlLmNvdmFyaWFudH0pIHsKICBpZiAodHlwZSBpcyBOYW1lZFR5cGVCdWlsZGVyKSB7CiAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiBpcyBUeXBlVmFyaWFibGVCdWlsZGVyKSB7CiAgICAgIGlmICh2YXJpYW5jZSA9PSBWYXJpYW5jZS5jb250cmF2YXJpYW50KSB7CiAgICAgICAgVHlwZUJ1aWxkZXIgcmVwbGFjZW1lbnQgPSBsb3dlclN1YnN0aXR1dGlvblt0eXBlLmRlY2xhcmF0aW9uXTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50LndpdGhOdWxsYWJpbGl0eUJ1aWxkZXIoCiAgICAgICAgICAgICAgY29tYmluZU51bGxhYmlsaXR5QnVpbGRlcnNGb3JTdWJzdGl0dXRpb24oCiAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50Lm51bGxhYmlsaXR5QnVpbGRlciwgdHlwZS5udWxsYWJpbGl0eUJ1aWxkZXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIH0KICAgICAgVHlwZUJ1aWxkZXIgcmVwbGFjZW1lbnQgPSB1cHBlclN1YnN0aXR1dGlvblt0eXBlLmRlY2xhcmF0aW9uXTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQud2l0aE51bGxhYmlsaXR5QnVpbGRlcigKICAgICAgICAgICAgY29tYmluZU51bGxhYmlsaXR5QnVpbGRlcnNGb3JTdWJzdGl0dXRpb24oCiAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5udWxsYWJpbGl0eUJ1aWxkZXIsIHR5cGUubnVsbGFiaWxpdHlCdWlsZGVyKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgICBpZiAodHlwZS5hcmd1bWVudHMgPT0gbnVsbCB8fCB0eXBlLmFyZ3VtZW50cy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50czsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0eXBlLmRlY2xhcmF0aW9uOwogICAgaWYgKGRlY2xhcmF0aW9uID09IG51bGwpIHsKICAgICAgYXNzZXJ0KHVuYm91bmRUeXBlcyAhPSBudWxsLAogICAgICAgICAgIkNhbiBub3QgaGFuZGxlIHVuYm91bmQgbmFtZWQgdHlwZSBidWlsZGVycyB3aXRob3V0IGB1bmJvdW5kVHlwZXNgLiIpOwogICAgICBhc3NlcnQoCiAgICAgICAgICB1bmJvdW5kVHlwZVZhcmlhYmxlcyAhPSBudWxsLAogICAgICAgICAgIkNhbiBub3QgaGFuZGxlIHVuYm91bmQgbmFtZWQgdHlwZSBidWlsZGVycyB3aXRob3V0ICIKICAgICAgICAgICJgdW5ib3VuZFR5cGVWYXJpYWJsZXNgLiIpOwogICAgICBhc3NlcnQoCiAgICAgICAgICBpZGVudGljYWwodXBwZXJTdWJzdGl0dXRpb24sIGxvd2VyU3Vic3RpdHV0aW9uKSwKICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgdW5ib3VuZCBuYW1lZCB0eXBlIGJ1aWxkZXJzIGlkZW50aWNhbCAiCiAgICAgICAgICAiYHVwcGVyU3Vic3RpdHV0aW9uYCBhbmQgYGxvd2VyU3Vic3RpdHV0aW9uYC4iKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgIFR5cGVCdWlsZGVyIHN1YnN0aXR1dGVkQXJndW1lbnQgPSBzdWJzdGl0dXRlUmFuZ2UoCiAgICAgICAgICAgIHR5cGUuYXJndW1lbnRzW2ldLAogICAgICAgICAgICB1cHBlclN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgbG93ZXJTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIHVuYm91bmRUeXBlcywKICAgICAgICAgICAgdW5ib3VuZFR5cGVWYXJpYWJsZXMsCiAgICAgICAgICAgIHZhcmlhbmNlOiB2YXJpYW5jZSk7CiAgICAgICAgaWYgKHN1YnN0aXR1dGVkQXJndW1lbnQgIT0gdHlwZS5hcmd1bWVudHNbaV0pIHsKICAgICAgICAgIGFyZ3VtZW50cyA/Pz0gdHlwZS5hcmd1bWVudHMudG9MaXN0KCk7CiAgICAgICAgICBhcmd1bWVudHNbaV0gPSBzdWJzdGl0dXRlZEFyZ3VtZW50OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgICAgIFR5cGVCdWlsZGVyIHN1YnN0aXR1dGVkQXJndW1lbnQgPSBzdWJzdGl0dXRlUmFuZ2UoCiAgICAgICAgICAgIHR5cGUuYXJndW1lbnRzW2ldLAogICAgICAgICAgICB1cHBlclN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgbG93ZXJTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIHVuYm91bmRUeXBlcywKICAgICAgICAgICAgdW5ib3VuZFR5cGVWYXJpYWJsZXMsCiAgICAgICAgICAgIHZhcmlhbmNlOiB2YXJpYW5jZSk7CiAgICAgICAgaWYgKHN1YnN0aXR1dGVkQXJndW1lbnQgIT0gdHlwZS5hcmd1bWVudHNbaV0pIHsKICAgICAgICAgIGFyZ3VtZW50cyA/Pz0gdHlwZS5hcmd1bWVudHMudG9MaXN0KCk7CiAgICAgICAgICBhcmd1bWVudHNbaV0gPSBzdWJzdGl0dXRlZEFyZ3VtZW50OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5hcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlID0gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICBUeXBlQnVpbGRlciBzdWJzdGl0dXRlZEFyZ3VtZW50ID0gc3Vic3RpdHV0ZVJhbmdlKAogICAgICAgICAgICB0eXBlLmFyZ3VtZW50c1tpXSwKICAgICAgICAgICAgdXBwZXJTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIGxvd2VyU3Vic3RpdHV0aW9uLAogICAgICAgICAgICB1bmJvdW5kVHlwZXMsCiAgICAgICAgICAgIHVuYm91bmRUeXBlVmFyaWFibGVzLAogICAgICAgICAgICB2YXJpYW5jZTogVmFyaWFuY2UuY29tYmluZSh2YXJpYW5jZSwgdmFyaWFibGUudmFyaWFuY2UpKTsKICAgICAgICBpZiAoc3Vic3RpdHV0ZWRBcmd1bWVudCAhPSB0eXBlLmFyZ3VtZW50c1tpXSkgewogICAgICAgICAgYXJndW1lbnRzID8/PSB0eXBlLmFyZ3VtZW50cy50b0xpc3QoKTsKICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IHN1YnN0aXR1dGVkQXJndW1lbnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyKSB7CiAgICAgIC8vIERvbid0IHN1YnN0aXR1dGUuCiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoZmFsc2UsICJVbmV4cGVjdGVkIG5hbWVkIHR5cGUgYnVpbGRlciBkZWNsYXJhdGlvbjogJGRlY2xhcmF0aW9uLiIpOwogICAgfQogICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgbmV3VHlwZUJ1aWxkZXIgPQogICAgICAgICAgbmV3IE5hbWVkVHlwZUJ1aWxkZXIodHlwZS5uYW1lLCB0eXBlLm51bGxhYmlsaXR5QnVpbGRlciwgYXJndW1lbnRzKTsKICAgICAgaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKICAgICAgICBuZXdUeXBlQnVpbGRlci5iaW5kKGRlY2xhcmF0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1bmJvdW5kVHlwZXMuYWRkKG5ld1R5cGVCdWlsZGVyKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3VHlwZUJ1aWxkZXI7CiAgICB9CiAgICByZXR1cm4gdHlwZTsKICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXM7CiAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgdmFyaWFibGVzID0gbmV3IExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4odHlwZS50eXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgICB9CiAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IGZvcm1hbHM7CiAgICBpZiAodHlwZS5mb3JtYWxzICE9IG51bGwpIHsKICAgICAgZm9ybWFscyA9IG5ldyBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KHR5cGUuZm9ybWFscy5sZW5ndGgpOwogICAgfQogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZTsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwoKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj4gZnVuY3Rpb25UeXBlVXBwZXJTdWJzdGl0dXRpb247CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IGZ1bmN0aW9uVHlwZUxvd2VyU3Vic3RpdHV0aW9uOwogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IHR5cGUudHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICBUeXBlQnVpbGRlciBib3VuZCA9IHN1YnN0aXR1dGVSYW5nZSh2YXJpYWJsZS5ib3VuZCwgdXBwZXJTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIGxvd2VyU3Vic3RpdHV0aW9uLCB1bmJvdW5kVHlwZXMsIHVuYm91bmRUeXBlVmFyaWFibGVzLAogICAgICAgICAgICB2YXJpYW5jZTogVmFyaWFuY2UuaW52YXJpYW50KTsKICAgICAgICBpZiAoYm91bmQgIT0gdmFyaWFibGUuYm91bmQpIHsKICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgbmV3VHlwZVZhcmlhYmxlQnVpbGRlciA9IHZhcmlhYmxlc1tpXSA9CiAgICAgICAgICAgICAgbmV3IFR5cGVWYXJpYWJsZUJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnBhcmVudCwgdmFyaWFibGUuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgYm91bmQ6IGJvdW5kKTsKICAgICAgICAgIHVuYm91bmRUeXBlVmFyaWFibGVzLmFkZChuZXdUeXBlVmFyaWFibGVCdWlsZGVyKTsKICAgICAgICAgIGlmIChmdW5jdGlvblR5cGVVcHBlclN1YnN0aXR1dGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uVHlwZVVwcGVyU3Vic3RpdHV0aW9uID0ge30uLmFkZEFsbCh1cHBlclN1YnN0aXR1dGlvbik7CiAgICAgICAgICAgIGZ1bmN0aW9uVHlwZUxvd2VyU3Vic3RpdHV0aW9uID0ge30uLmFkZEFsbChsb3dlclN1YnN0aXR1dGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvblR5cGVVcHBlclN1YnN0aXR1dGlvblt2YXJpYWJsZV0gPQogICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZUxvd2VyU3Vic3RpdHV0aW9uW3ZhcmlhYmxlXSA9CiAgICAgICAgICAgICAgICAgIG5ldyBOYW1lZFR5cGVCdWlsZGVyLmZyb21UeXBlRGVjbGFyYXRpb25CdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVZhcmlhYmxlQnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5vbWl0dGVkKCkpOwogICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhcmlhYmxlc1tpXSA9IHZhcmlhYmxlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHR5cGUuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewogICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsID0gdHlwZS5mb3JtYWxzW2ldOwogICAgICAgIFR5cGVCdWlsZGVyIHBhcmFtZXRlclR5cGUgPSBzdWJzdGl0dXRlUmFuZ2UoCiAgICAgICAgICAgIGZvcm1hbC50eXBlLAogICAgICAgICAgICBmdW5jdGlvblR5cGVVcHBlclN1YnN0aXR1dGlvbiA/PyB1cHBlclN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgZnVuY3Rpb25UeXBlTG93ZXJTdWJzdGl0dXRpb24gPz8gbG93ZXJTdWJzdGl0dXRpb24sCiAgICAgICAgICAgIHVuYm91bmRUeXBlcywKICAgICAgICAgICAgdW5ib3VuZFR5cGVWYXJpYWJsZXMsCiAgICAgICAgICAgIHZhcmlhbmNlOiBWYXJpYW5jZS5jb21iaW5lKHZhcmlhbmNlLCBWYXJpYW5jZS5jb250cmF2YXJpYW50KSk7CiAgICAgICAgaWYgKHBhcmFtZXRlclR5cGUgIT0gZm9ybWFsLnR5cGUpIHsKICAgICAgICAgIGZvcm1hbHNbaV0gPSBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICAgICAgICBmb3JtYWwubWV0YWRhdGEsCiAgICAgICAgICAgICAgZm9ybWFsLm1vZGlmaWVycywKICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLAogICAgICAgICAgICAgIGZvcm1hbC5uYW1lLAogICAgICAgICAgICAgIGZvcm1hbC5wYXJlbnQsCiAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgZm9ybWFsLmZpbGVVcmkpOwogICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvcm1hbHNbaV0gPSBmb3JtYWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm5UeXBlID0gc3Vic3RpdHV0ZVJhbmdlKAogICAgICAgIHR5cGUucmV0dXJuVHlwZSwKICAgICAgICBmdW5jdGlvblR5cGVVcHBlclN1YnN0aXR1dGlvbiA/PyB1cHBlclN1YnN0aXR1dGlvbiwKICAgICAgICBmdW5jdGlvblR5cGVMb3dlclN1YnN0aXR1dGlvbiA/PyBsb3dlclN1YnN0aXR1dGlvbiwKICAgICAgICB1bmJvdW5kVHlwZXMsCiAgICAgICAgdW5ib3VuZFR5cGVWYXJpYWJsZXMsCiAgICAgICAgdmFyaWFuY2U6IHZhcmlhbmNlKTsKICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IHJldHVyblR5cGUgIT0gdHlwZS5yZXR1cm5UeXBlOwoKICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlQnVpbGRlcigKICAgICAgICAgIHJldHVyblR5cGUsIHZhcmlhYmxlcywgZm9ybWFscywgdHlwZS5udWxsYWJpbGl0eUJ1aWxkZXIpOwogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQogIHJldHVybiB0eXBlOwp9CgpUeXBlQnVpbGRlciBzdWJzdGl0dXRlKAogICAgVHlwZUJ1aWxkZXIgdHlwZSwgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb24sCiAgICB7TGlzdDxUeXBlQnVpbGRlcj4gdW5ib3VuZFR5cGVzLAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB1bmJvdW5kVHlwZVZhcmlhYmxlc30pIHsKICByZXR1cm4gc3Vic3RpdHV0ZVJhbmdlKAogICAgICB0eXBlLCBzdWJzdGl0dXRpb24sIHN1YnN0aXR1dGlvbiwgdW5ib3VuZFR5cGVzLCB1bmJvdW5kVHlwZVZhcmlhYmxlcywKICAgICAgdmFyaWFuY2U6IFZhcmlhbmNlLmNvdmFyaWFudCk7Cn0KCi8vLyBDYWxjdWxhdGVzIGJvdW5kcyB0byBiZSBwcm92aWRlZCBhcyB0eXBlIGFyZ3VtZW50cyBpbiBwbGFjZSBvZiBtaXNzaW5nIHR5cGUKLy8vIGFyZ3VtZW50cyBvbiByYXcgdHlwZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBwYXJhbWV0ZXJzLgovLy8KLy8vIFNlZSB0aGUgW2Rlc2NyaXB0aW9uXQovLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2Jsb2IvbWFzdGVyL2RvY3MvbGFuZ3VhZ2UvaW5mb3JtYWwvaW5zdGFudGlhdGUtdG8tYm91bmQubWQpCi8vLyBvZiB0aGUgYWxnb3JpdGhtIGZvciBkZXRhaWxzLgpMaXN0PFR5cGVCdWlsZGVyPiBjYWxjdWxhdGVCb3VuZHMoTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXMsCiAgICBUeXBlQnVpbGRlciBkeW5hbWljVHlwZSwgVHlwZUJ1aWxkZXIgYm90dG9tVHlwZSwgQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgTGlzdDxUeXBlQnVpbGRlcj4gYm91bmRzID0gbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KHZhcmlhYmxlcy5sZW5ndGgpOwoKICBmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgYm91bmRzW2ldID0gdmFyaWFibGVzW2ldLmJvdW5kID8/IGR5bmFtaWNUeXBlOwogIH0KCiAgVHlwZVZhcmlhYmxlc0dyYXBoIGdyYXBoID0gbmV3IFR5cGVWYXJpYWJsZXNHcmFwaCh2YXJpYWJsZXMsIGJvdW5kcyk7CiAgTGlzdDxMaXN0PGludD4+IHN0cm9uZ2x5Q29ubmVjdGVkID0gY29tcHV0ZVN0cm9uZ0NvbXBvbmVudHMoZ3JhcGgpOwogIGZvciAoTGlzdDxpbnQ+IGNvbXBvbmVudCBpbiBzdHJvbmdseUNvbm5lY3RlZCkgewogICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBkeW5hbWljU3Vic3RpdHV0aW9uID0KICAgICAgICA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+e307CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IG51bGxTdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj57fTsKICAgIGZvciAoaW50IHZhcmlhYmxlSW5kZXggaW4gY29tcG9uZW50KSB7CiAgICAgIGR5bmFtaWNTdWJzdGl0dXRpb25bdmFyaWFibGVzW3ZhcmlhYmxlSW5kZXhdXSA9IGR5bmFtaWNUeXBlOwogICAgICBudWxsU3Vic3RpdHV0aW9uW3ZhcmlhYmxlc1t2YXJpYWJsZUluZGV4XV0gPSBib3R0b21UeXBlOwogICAgfQogICAgZm9yIChpbnQgdmFyaWFibGVJbmRleCBpbiBjb21wb25lbnQpIHsKICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IHZhcmlhYmxlc1t2YXJpYWJsZUluZGV4XTsKICAgICAgYm91bmRzW3ZhcmlhYmxlSW5kZXhdID0gc3Vic3RpdHV0ZVJhbmdlKGJvdW5kc1t2YXJpYWJsZUluZGV4XSwKICAgICAgICAgIGR5bmFtaWNTdWJzdGl0dXRpb24sIG51bGxTdWJzdGl0dXRpb24sIG51bGwsIG51bGwsCiAgICAgICAgICB2YXJpYW5jZTogdmFyaWFibGUudmFyaWFuY2UpOwogICAgfQogIH0KCiAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMubGVuZ3RoOyBpKyspIHsKICAgIE1hcDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj4gc3Vic3RpdHV0aW9uID0KICAgICAgICA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+e307CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgVHlwZUJ1aWxkZXI+IG51bGxTdWJzdGl0dXRpb24gPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBUeXBlQnVpbGRlcj57fTsKICAgIHN1YnN0aXR1dGlvblt2YXJpYWJsZXNbaV1dID0gYm91bmRzW2ldOwogICAgbnVsbFN1YnN0aXR1dGlvblt2YXJpYWJsZXNbaV1dID0gYm90dG9tVHlwZTsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFyaWFibGVzLmxlbmd0aDsgaisrKSB7CiAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSB2YXJpYWJsZXNbal07CiAgICAgIGJvdW5kc1tqXSA9IHN1YnN0aXR1dGVSYW5nZSgKICAgICAgICAgIGJvdW5kc1tqXSwgc3Vic3RpdHV0aW9uLCBudWxsU3Vic3RpdHV0aW9uLCBudWxsLCBudWxsLAogICAgICAgICAgdmFyaWFuY2U6IHZhcmlhYmxlLnZhcmlhbmNlKTsKICAgIH0KICB9CgogIHJldHVybiBib3VuZHM7Cn0KCi8vLyBHcmFwaCBvZiBtdXR1YWwgZGVwZW5kZW5jaWVzIG9mIHR5cGUgdmFyaWFibGVzIGZyb20gdGhlIHNhbWUgZGVjbGFyYXRpb24uCi8vLyBUeXBlIHZhcmlhYmxlcyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaW5kaWNlcyBpbiB0aGUgY29ycmVzcG9uZGluZwovLy8gZGVjbGFyYXRpb24uCmNsYXNzIFR5cGVWYXJpYWJsZXNHcmFwaCBpbXBsZW1lbnRzIEdyYXBoPGludD4gewogIExpc3Q8aW50PiB2ZXJ0aWNlczsKICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHZhcmlhYmxlczsKICBMaXN0PFR5cGVCdWlsZGVyPiBib3VuZHM7CgogIC8vIGBlZGdlc1tpXWAgaXMgdGhlIGxpc3Qgb2YgaW5kaWNlcyBvZiB0eXBlIHZhcmlhYmxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgdHlwZQogIC8vIHZhcmlhYmxlIHdpdGggdGhlIGluZGV4IGBpYCBpbiB0aGVpciBib3VuZHMuCiAgTGlzdDxMaXN0PGludD4+IGVkZ2VzOwoKICBUeXBlVmFyaWFibGVzR3JhcGgodGhpcy52YXJpYWJsZXMsIHRoaXMuYm91bmRzKSB7CiAgICBhc3NlcnQodmFyaWFibGVzLmxlbmd0aCA9PSBib3VuZHMubGVuZ3RoKTsKCiAgICB2ZXJ0aWNlcyA9IG5ldyBMaXN0PGludD4odmFyaWFibGVzLmxlbmd0aCk7CiAgICBNYXA8VHlwZVZhcmlhYmxlQnVpbGRlciwgaW50PiB2YXJpYWJsZUluZGljZXMgPQogICAgICAgIDxUeXBlVmFyaWFibGVCdWlsZGVyLCBpbnQ+e307CiAgICBlZGdlcyA9IG5ldyBMaXN0PExpc3Q8aW50Pj4odmFyaWFibGVzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZlcnRpY2VzW2ldID0gaTsKICAgICAgdmFyaWFibGVJbmRpY2VzW3ZhcmlhYmxlc1tpXV0gPSBpOwogICAgICBlZGdlc1tpXSA9IDxpbnQ+W107CiAgICB9CgogICAgdm9pZCBjb2xsZWN0UmVmZXJlbmNlc0Zyb20oaW50IGluZGV4LCBUeXBlQnVpbGRlciB0eXBlKSB7CiAgICAgIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgICBpZiAodHlwZS5kZWNsYXJhdGlvbiBpcyBUeXBlVmFyaWFibGVCdWlsZGVyICYmCiAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLmNvbnRhaW5zKHR5cGUuZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICBlZGdlc1t2YXJpYWJsZUluZGljZXNbdHlwZS5kZWNsYXJhdGlvbl1dLmFkZChpbmRleCk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlLmFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIGFyZ3VtZW50IGluIHR5cGUuYXJndW1lbnRzKSB7CiAgICAgICAgICAgIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpbmRleCwgYXJndW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgICBpZiAodHlwZS50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB0eXBlVmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgIGNvbGxlY3RSZWZlcmVuY2VzRnJvbShpbmRleCwgdHlwZVZhcmlhYmxlLmJvdW5kKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyIGluIHR5cGUuZm9ybWFscykgewogICAgICAgICAgICBjb2xsZWN0UmVmZXJlbmNlc0Zyb20oaW5kZXgsIHBhcmFtZXRlci50eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29sbGVjdFJlZmVyZW5jZXNGcm9tKGluZGV4LCB0eXBlLnJldHVyblR5cGUpOwogICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICBjb2xsZWN0UmVmZXJlbmNlc0Zyb20oaSwgYm91bmRzW2ldKTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIGluZGljZXMgb2YgdHlwZSB2YXJpYWJsZXMgdGhhdCBkZXBlbmQgb24gdGhlIHR5cGUgdmFyaWFibGUgd2l0aAogIC8vLyBbaW5kZXhdLgogIEl0ZXJhYmxlPGludD4gbmVpZ2hib3JzT2YoaW50IGluZGV4KSB7CiAgICByZXR1cm4gZWRnZXNbaW5kZXhdOwogIH0KfQoKLy8vIEZpbmRzIGFsbCB0eXBlIGJ1aWxkZXJzIGZvciBbdmFyaWFibGVdIGluIFt0eXBlXS4KLy8vCi8vLyBSZXR1cm5zIGxpc3Qgb2YgdGhlIGZvdW5kIHR5cGUgYnVpbGRlcnMuCkxpc3Q8TmFtZWRUeXBlQnVpbGRlcj4gZmluZFZhcmlhYmxlVXNlc0luVHlwZSgKICBUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlLAogIFR5cGVCdWlsZGVyIHR5cGUsCikgewogIExpc3Q8TmFtZWRUeXBlQnVpbGRlcj4gdXNlcyA9IDxOYW1lZFR5cGVCdWlsZGVyPltdOwogIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgIGlmICh0eXBlLmRlY2xhcmF0aW9uID09IHZhcmlhYmxlKSB7CiAgICAgIHVzZXMuYWRkKHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHR5cGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIGFyZ3VtZW50IGluIHR5cGUuYXJndW1lbnRzKSB7CiAgICAgICAgICB1c2VzLmFkZEFsbChmaW5kVmFyaWFibGVVc2VzSW5UeXBlKHZhcmlhYmxlLCBhcmd1bWVudCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICB1c2VzLmFkZEFsbChmaW5kVmFyaWFibGVVc2VzSW5UeXBlKHZhcmlhYmxlLCB0eXBlLnJldHVyblR5cGUpKTsKICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgZGVwZW5kZW50VmFyaWFibGUgaW4gdHlwZS50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgaWYgKGRlcGVuZGVudFZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIHVzZXMuYWRkQWxsKAogICAgICAgICAgICAgIGZpbmRWYXJpYWJsZVVzZXNJblR5cGUodmFyaWFibGUsIGRlcGVuZGVudFZhcmlhYmxlLmJvdW5kKSk7CiAgICAgICAgfQogICAgICAgIGlmIChkZXBlbmRlbnRWYXJpYWJsZS5kZWZhdWx0VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICB1c2VzLmFkZEFsbCgKICAgICAgICAgICAgICBmaW5kVmFyaWFibGVVc2VzSW5UeXBlKHZhcmlhYmxlLCBkZXBlbmRlbnRWYXJpYWJsZS5kZWZhdWx0VHlwZSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHR5cGUuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgdXNlcy5hZGRBbGwoZmluZFZhcmlhYmxlVXNlc0luVHlwZSh2YXJpYWJsZSwgZm9ybWFsLnR5cGUpKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gdXNlczsKfQoKLy8vIEZpbmRzIHRob3NlIG9mIFt2YXJpYWJsZXNdIHRoYXQgcmVmZXJlbmNlIG90aGVyIFt2YXJpYWJsZXNdIGluIHRoZWlyIGJvdW5kcy4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHBhaXJzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIHR5cGUKLy8vIHZhcmlhYmxlIGJ1aWxkZXIgZnJvbSBbdmFyaWFibGVzXSB0aGF0IHJlZmVyZW5jZXMgb3RoZXIgW3ZhcmlhYmxlc10gaW4gaXRzCi8vLyBib3VuZC4gIFRoZSBzZWNvbmQgZWxlbWVudCBpbiB0aGUgcGFpciBpcyB0aGUgbGlzdCBvZiBmb3VuZCByZWZlcmVuY2VzCi8vLyByZXByZXNlbnRlZCBhcyB0eXBlIGJ1aWxkZXJzLgpMaXN0PE9iamVjdD4gZmluZEluYm91bmRSZWZlcmVuY2VzKExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdmFyaWFibGVzKSB7CiAgTGlzdDxPYmplY3Q+IHZhcmlhYmxlc0FuZERlcGVuZGVuY2llcyA9IDxPYmplY3Q+W107CiAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIGRlcGVuZGVudCBpbiB2YXJpYWJsZXMpIHsKICAgIExpc3Q8TmFtZWRUeXBlQnVpbGRlcj4gZGVwZW5kZW5jaWVzID0gPE5hbWVkVHlwZUJ1aWxkZXI+W107CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgZGVwZW5kZW5jZSBpbiB2YXJpYWJsZXMpIHsKICAgICAgTGlzdDxOYW1lZFR5cGVCdWlsZGVyPiB1c2VzID0KICAgICAgICAgIGZpbmRWYXJpYWJsZVVzZXNJblR5cGUoZGVwZW5kZW5jZSwgZGVwZW5kZW50LmJvdW5kKTsKICAgICAgaWYgKHVzZXMubGVuZ3RoICE9IDApIHsKICAgICAgICBkZXBlbmRlbmNpZXMuYWRkQWxsKHVzZXMpOwogICAgICB9CiAgICB9CiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCAhPSAwKSB7CiAgICAgIHZhcmlhYmxlc0FuZERlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW50KTsKICAgICAgdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmNpZXMpOwogICAgfQogIH0KICByZXR1cm4gdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzOwp9CgovLy8gRmluZHMgcmF3IGdlbmVyaWMgdHlwZXMgaW4gW3R5cGVdIHdpdGggaW5ib3VuZCByZWZlcmVuY2VzIGluIHR5cGUgdmFyaWFibGVzLgovLy8KLy8vIFJldHVybnMgZmxhdHRlbmVkIGxpc3Qgb2YgcGFpcnMuICBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcGFpciBpcyB0aGUgZm91bmQKLy8vIHJhdyBnZW5lcmljIHR5cGUuICBUaGUgc2Vjb25kIGVsZW1lbnQgaW4gdGhlIHBhaXIgaXMgdGhlIGxpc3Qgb2YgdHlwZQovLy8gdmFyaWFibGVzIG9mIHRoYXQgdHlwZSB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbgovLy8gW2ZpbmRJbmJvdW5kUmVmZXJlbmNlc10uCkxpc3Q8T2JqZWN0PiBmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXMoVHlwZUJ1aWxkZXIgdHlwZSkgewogIExpc3Q8T2JqZWN0PiB0eXBlc0FuZERlcGVuZGVuY2llcyA9IDxPYmplY3Q+W107CiAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgaWYgKHR5cGUuYXJndW1lbnRzID09IG51bGwpIHsKICAgICAgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbiA9IHR5cGUuZGVjbGFyYXRpb247CiAgICAgIGlmIChkZWNsYXJhdGlvbiBpcyBEaWxsQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgYm9vbCBoYXNJbmJvdW5kID0gZmFsc2U7CiAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLmNscy50eXBlUGFyYW1ldGVyczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAmJiAhaGFzSW5ib3VuZDsgKytpKSB7CiAgICAgICAgICBpZiAoY29udGFpbnNUeXBlVmFyaWFibGUoCiAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0uYm91bmQsIHR5cGVQYXJhbWV0ZXJzLnRvU2V0KCkpKSB7CiAgICAgICAgICAgIGhhc0luYm91bmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGFzSW5ib3VuZCkgewogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKHR5cGUpOwogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKGNvbnN0IDxPYmplY3Q+W10pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBEaWxsVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgIGJvb2wgaGFzSW5ib3VuZCA9IGZhbHNlOwogICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi50eXBlZGVmLnR5cGVQYXJhbWV0ZXJzOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoICYmICFoYXNJbmJvdW5kOyArK2kpIHsKICAgICAgICAgIGlmIChjb250YWluc1R5cGVWYXJpYWJsZSgKICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCwgdHlwZVBhcmFtZXRlcnMudG9TZXQoKSkpIHsKICAgICAgICAgICAgaGFzSW5ib3VuZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChoYXNJbmJvdW5kKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQodHlwZSk7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQoY29uc3QgPE9iamVjdD5bXSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciAmJgogICAgICAgICAgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgTGlzdDxPYmplY3Q+IGRlcGVuZGVuY2llcyA9CiAgICAgICAgICAgIGZpbmRJbmJvdW5kUmVmZXJlbmNlcyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKTsKICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQodHlwZSk7CiAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jaWVzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgIExpc3Q8T2JqZWN0PiBkZXBlbmRlbmNpZXMgPQogICAgICAgICAgICAgIGZpbmRJbmJvdW5kUmVmZXJlbmNlcyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKTsKICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKHR5cGUpOwogICAgICAgICAgICB0eXBlc0FuZERlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jaWVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgICAgRnVuY3Rpb25UeXBlQnVpbGRlciB0eXBlID0gZGVjbGFyYXRpb24udHlwZTsKICAgICAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgICBMaXN0PE9iamVjdD4gZGVwZW5kZW5jaWVzID0KICAgICAgICAgICAgICAgIGZpbmRJbmJvdW5kUmVmZXJlbmNlcyh0eXBlLnR5cGVWYXJpYWJsZXMpOwogICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMuYWRkKHR5cGUpOwogICAgICAgICAgICAgIHR5cGVzQW5kRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmNpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKFR5cGVCdWlsZGVyIGFyZ3VtZW50IGluIHR5cGUuYXJndW1lbnRzKSB7CiAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMKICAgICAgICAgICAgLmFkZEFsbChmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXMoYXJndW1lbnQpKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICB0eXBlc0FuZERlcGVuZGVuY2llcwogICAgICAgIC5hZGRBbGwoZmluZFJhd1R5cGVzV2l0aEluYm91bmRSZWZlcmVuY2VzKHR5cGUucmV0dXJuVHlwZSkpOwogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAuYWRkQWxsKGZpbmRSYXdUeXBlc1dpdGhJbmJvdW5kUmVmZXJlbmNlcyh2YXJpYWJsZS5ib3VuZCkpOwogICAgICAgIH0KICAgICAgICBpZiAodmFyaWFibGUuZGVmYXVsdFR5cGUgIT0gbnVsbCkgewogICAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAuYWRkQWxsKGZpbmRSYXdUeXBlc1dpdGhJbmJvdW5kUmVmZXJlbmNlcyh2YXJpYWJsZS5kZWZhdWx0VHlwZSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHR5cGUuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gdHlwZS5mb3JtYWxzKSB7CiAgICAgICAgdHlwZXNBbmREZXBlbmRlbmNpZXMKICAgICAgICAgICAgLmFkZEFsbChmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXMoZm9ybWFsLnR5cGUpKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gdHlwZXNBbmREZXBlbmRlbmNpZXM7Cn0KCi8vLyBGaW5kcyBpc3N1ZXMgYnkgcmF3IGdlbmVyaWMgdHlwZXMgd2l0aCBpbmJvdW5kIHJlZmVyZW5jZXMgaW4gdHlwZSB2YXJpYWJsZXMuCi8vLwovLy8gUmV0dXJucyBmbGF0dGVuZWQgbGlzdCBvZiB0cmlwbGV0cy4gIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0cmlwbGV0IGlzIHRoZQovLy8gW1R5cGVEZWNsYXJhdGlvbkJ1aWxkZXJdIGZvciB0aGUgdHlwZSB2YXJpYWJsZSBmcm9tIFt2YXJpYWJsZXNdIHRoYXQgaGFzIHJhdwovLy8gZ2VuZXJpYyB0eXBlcyB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiBpdHMgYm91bmQuICBUaGUgc2Vjb25kIGVsZW1lbnQgb2YKLy8vIHRoZSB0cmlwbGV0IGlzIHRoZSBlcnJvciBtZXNzYWdlLiAgVGhlIHRoaXJkIGVsZW1lbnQgaXMgdGhlIGNvbnRleHQuCkxpc3Q8T2JqZWN0PiBnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdmFyaWFibGVzKSB7CiAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IDxPYmplY3Q+W107CiAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIHZhcmlhYmxlcykgewogICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgTGlzdDxPYmplY3Q+IHJhd1R5cGVzQW5kTXV0dWFsRGVwZW5kZW5jaWVzID0KICAgICAgICAgIGZpbmRSYXdUeXBlc1dpdGhJbmJvdW5kUmVmZXJlbmNlcyh2YXJpYWJsZS5ib3VuZCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmF3VHlwZXNBbmRNdXR1YWxEZXBlbmRlbmNpZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBOYW1lZFR5cGVCdWlsZGVyIHR5cGUgPSByYXdUeXBlc0FuZE11dHVhbERlcGVuZGVuY2llc1tpXTsKICAgICAgICBMaXN0PE9iamVjdD4gdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzID0KICAgICAgICAgICAgcmF3VHlwZXNBbmRNdXR1YWxEZXBlbmRlbmNpZXNbaSArIDFdOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzLmxlbmd0aDsgaiArPSAyKSB7CiAgICAgICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIGRlcGVuZGVudCA9IHZhcmlhYmxlc0FuZERlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIExpc3Q8TmFtZWRUeXBlQnVpbGRlcj4gZGVwZW5kZW5jaWVzID0gdmFyaWFibGVzQW5kRGVwZW5kZW5jaWVzW2ogKyAxXTsKICAgICAgICAgIGZvciAoTmFtZWRUeXBlQnVpbGRlciBkZXBlbmRlbmN5IGluIGRlcGVuZGVuY2llcykgewogICAgICAgICAgICBpc3N1ZXMuYWRkKHZhcmlhYmxlKTsKICAgICAgICAgICAgaXNzdWVzLmFkZCh0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcwogICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5kZWNsYXJhdGlvbi5uYW1lKSk7CiAgICAgICAgICAgIGlzc3Vlcy5hZGQoPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICB0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGUKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZGVwZW5kZW5jeS5kZWNsYXJhdGlvbi5uYW1lKQogICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKGRlcGVuZGVudC5maWxlVXJpLCBkZXBlbmRlbnQuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudC5uYW1lLmxlbmd0aCkKICAgICAgICAgICAgXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh2YXJpYWJsZXNBbmREZXBlbmRlbmNpZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgIC8vIFRoZSBpbmJvdW5kIHJlZmVyZW5jZXMgYXJlIGluIGEgY29tcGlsZWQgZGVjbGFyYXRpb24gaW4gYSAuZGlsbC4KICAgICAgICAgIGlzc3Vlcy5hZGQodmFyaWFibGUpOwogICAgICAgICAgaXNzdWVzLmFkZCh0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFSYXdUeXBlV2l0aE5vblNpbXBsZUJvdW5kcwogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGUuZGVjbGFyYXRpb24ubmFtZSkpOwogICAgICAgICAgaXNzdWVzLmFkZChjb25zdCA8TG9jYXRlZE1lc3NhZ2U+W10pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gaXNzdWVzOwp9CgovLy8gRmluZHMgcmF3IHR5cGUgcGF0aHMgc3RhcnRpbmcgZnJvbSB0aG9zZSBpbiBbc3RhcnRdIGFuZCBlbmRpbmcgd2l0aCBbZW5kXS4KLy8vCi8vLyBSZXR1cm5zIGxpc3Qgb2YgZm91bmQgcGF0aHMuICBFYWNoIHBhdGggaXMgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mCi8vLyBhbHRlcm5hdGluZyBidWlsZGVycyBvZiB0aGUgcmF3IGdlbmVyaWMgdHlwZXMgZnJvbSB0aGUgcGF0aCBhbmQgYnVpbGRlcnMgb2YKLy8vIHR5cGUgdmFyaWFibGVzIG9mIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdHlwZXMgdGhhdCBjb250YWluIHRoZSByZWZlcmVuY2UKLy8vIHRvIHRoZSBuZXh0IHJhdyBnZW5lcmljIHR5cGUgaW4gdGhlIHBhdGguICBUaGUgbGlzdCBlbmRzIHdpdGggdGhlIHR5cGUKLy8vIGJ1aWxkZXIgZm9yIFtlbmRdLgovLy8KLy8vIFRoZSByZWFzb24gZm9yIHB1dHRpbmcgdGhlIHR5cGUgdmFyaWFibGVzIGludG8gdGhlIHBhdGhzIGFzIHdlbGwgYXMgZm9yCi8vLyB1c2luZyB0eXBlIGZvciBbc3RhcnRdLCBhbmQgbm90IHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgZGVjbGFyYXRpb24sCi8vLyBpcyBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgpMaXN0PExpc3Q8T2JqZWN0Pj4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24oCiAgICBUeXBlQnVpbGRlciBzdGFydCwgVHlwZURlY2xhcmF0aW9uQnVpbGRlciBlbmQsCiAgICBbU2V0PFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXI+IHZpc2l0ZWRdKSB7CiAgdmlzaXRlZCA/Pz0gbmV3IFNldDxUeXBlRGVjbGFyYXRpb25CdWlsZGVyPi5pZGVudGl0eSgpOwogIExpc3Q8TGlzdDxPYmplY3Q+PiBwYXRocyA9IDxMaXN0PE9iamVjdD4+W107CiAgaWYgKHN0YXJ0IGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24gPSBzdGFydC5kZWNsYXJhdGlvbjsKICAgIGlmIChzdGFydC5hcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBpZiAoc3RhcnQuZGVjbGFyYXRpb24gPT0gZW5kKSB7CiAgICAgICAgcGF0aHMuYWRkKDxPYmplY3Q+W3N0YXJ0XSk7CiAgICAgIH0gZWxzZSBpZiAodmlzaXRlZC5hZGQoc3RhcnQuZGVjbGFyYXRpb24pKSB7CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciAmJiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gcGF0aCBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbigKICAgICAgICAgICAgICAgICAgdmFyaWFibGUuYm91bmQsIGVuZCwgdmlzaXRlZCkpIHsKICAgICAgICAgICAgICAgIHBhdGhzLmFkZCg8T2JqZWN0PltzdGFydCwgdmFyaWFibGVdLi5hZGRBbGwocGF0aCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcykgewogICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBmb3IgKExpc3Q8T2JqZWN0PiBkZXBlbmRlbmN5UGF0aAogICAgICAgICAgICAgICAgICAgIGluIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5ib3VuZCwgZW5kLCB2aXNpdGVkKSkgewogICAgICAgICAgICAgICAgICBwYXRocy5hZGQoPE9iamVjdD5bc3RhcnQsIHZhcmlhYmxlXS4uYWRkQWxsKGRlcGVuZGVuY3lQYXRoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgICAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSA9IGRlY2xhcmF0aW9uLnR5cGU7CiAgICAgICAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgICAgICAgICBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5ib3VuZCwgZW5kLCB2aXNpdGVkKSkgewogICAgICAgICAgICAgICAgICAgIHBhdGhzCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoPE9iamVjdD5bc3RhcnQsIHZhcmlhYmxlXS4uYWRkQWxsKGRlcGVuZGVuY3lQYXRoKSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmlzaXRlZC5yZW1vdmUoc3RhcnQuZGVjbGFyYXRpb24pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKFR5cGVCdWlsZGVyIGFyZ3VtZW50IGluIHN0YXJ0LmFyZ3VtZW50cykgewogICAgICAgIHBhdGhzLmFkZEFsbChmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbihhcmd1bWVudCwgZW5kLCB2aXNpdGVkKSk7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgaWYgKHN0YXJ0IGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgIHBhdGhzLmFkZEFsbChmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbihzdGFydC5yZXR1cm5UeXBlLCBlbmQsIHZpc2l0ZWQpKTsKICAgIGlmIChzdGFydC50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgZm9yIChUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlIGluIHN0YXJ0LnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgICAgcGF0aHMuYWRkQWxsKAogICAgICAgICAgICAgIGZpbmRSYXdUeXBlUGF0aHNUb0RlY2xhcmF0aW9uKHZhcmlhYmxlLmJvdW5kLCBlbmQsIHZpc2l0ZWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcmlhYmxlLmRlZmF1bHRUeXBlICE9IG51bGwpIHsKICAgICAgICAgIHBhdGhzLmFkZEFsbChmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbigKICAgICAgICAgICAgICB2YXJpYWJsZS5kZWZhdWx0VHlwZSwgZW5kLCB2aXNpdGVkKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3RhcnQuZm9ybWFscyAhPSBudWxsKSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgaW4gc3RhcnQuZm9ybWFscykgewogICAgICAgIHBhdGhzLmFkZEFsbChmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbihmb3JtYWwudHlwZSwgZW5kLCB2aXNpdGVkKSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHBhdGhzOwp9CgovLy8gRmluZHMgcmF3IGdlbmVyaWMgdHlwZSBjeWNsZXMgZW5kaW5nIGFuZCBzdGFydGluZyB3aXRoIFtkZWNsYXJhdGlvbl0uCi8vLwovLy8gUmV0dXJucyBsaXN0IG9mIGZvdW5kIGN5Y2xlcy4gIEVhY2ggY3ljbGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mCi8vLyBhbHRlcm5hdGluZyByYXcgZ2VuZXJpYyB0eXBlcyBmcm9tIHRoZSBjeWNsZSBhbmQgdHlwZSB2YXJpYWJsZXMgb2YgdGhlCi8vLyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdHlwZSB0aGF0IHJlZmVyZW5jZSB0aGUgbmV4dCB0eXBlIGluIHRoZSBjeWNsZS4gIFRoZQovLy8gY3ljbGUgc3RhcnRzIHdpdGggYSB0eXBlIHZhcmlhYmxlIGZyb20gW2RlY2xhcmF0aW9uXSBhbmQgZW5kcyB3aXRoIGEgdHlwZQovLy8gdGhhdCBoYXMgW2RlY2xhcmF0aW9uXSBhcyBpdHMgZGVjbGFyYXRpb24uCi8vLwovLy8gVGhlIHJlYXNvbiBmb3IgcHV0dGluZyB0aGUgdHlwZSB2YXJpYWJsZXMgaW50byB0aGUgY3ljbGVzIGlzIGJldHRlciBlcnJvcgovLy8gcmVwb3J0aW5nLgpMaXN0PExpc3Q8T2JqZWN0Pj4gZmluZFJhd1R5cGVDeWNsZXMoVHlwZURlY2xhcmF0aW9uQnVpbGRlciBkZWNsYXJhdGlvbikgewogIExpc3Q8TGlzdDxPYmplY3Q+PiBjeWNsZXMgPSA8TGlzdDxPYmplY3Q+PltdOwogIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIgJiYgZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgaW4gZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcykgewogICAgICBpZiAodmFyaWFibGUuYm91bmQgIT0gbnVsbCkgewogICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IHBhdGgKICAgICAgICAgICAgaW4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24odmFyaWFibGUuYm91bmQsIGRlY2xhcmF0aW9uKSkgewogICAgICAgICAgY3ljbGVzLmFkZCg8T2JqZWN0Plt2YXJpYWJsZV0uLmFkZEFsbChwYXRoKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICBpZiAoZGVjbGFyYXRpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSB7CiAgICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgaW4gZmluZFJhd1R5cGVQYXRoc1RvRGVjbGFyYXRpb24odmFyaWFibGUuYm91bmQsIGRlY2xhcmF0aW9uKSkgewogICAgICAgICAgICBjeWNsZXMuYWRkKDxPYmplY3Q+W3ZhcmlhYmxlXS4uYWRkQWxsKGRlcGVuZGVuY3lQYXRoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb24udHlwZSBpcyBGdW5jdGlvblR5cGVCdWlsZGVyKSB7CiAgICAgIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgdHlwZSA9IGRlY2xhcmF0aW9uLnR5cGU7CiAgICAgIGlmICh0eXBlLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIGZvciAoVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSBpbiB0eXBlLnR5cGVWYXJpYWJsZXMpIHsKICAgICAgICAgIGlmICh2YXJpYWJsZS5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGRlcGVuZGVuY3lQYXRoCiAgICAgICAgICAgICAgICBpbiBmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbih2YXJpYWJsZS5ib3VuZCwgZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICAgICAgY3ljbGVzLmFkZCg8T2JqZWN0Plt2YXJpYWJsZV0uLmFkZEFsbChkZXBlbmRlbmN5UGF0aCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBjeWNsZXM7Cn0KCi8vLyBDb252ZXJ0cyByYXcgZ2VuZXJpYyB0eXBlIFtjeWNsZXNdIGZvciBbZGVjbGFyYXRpb25dIGludG8gcmVwb3J0YWJsZSBpc3N1ZXMuCi8vLwovLy8gVGhlIFtjeWNsZXNdIGFyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBmb3IgdGhlIHJldHVybiB2YWx1ZQovLy8gb2YgW2ZpbmRSYXdUeXBlQ3ljbGVzXS4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHRyaXBsZXRzLiAgVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHRyaXBsZXQgaXMgdGhlCi8vLyBbVHlwZURlY2xhcmF0aW9uQnVpbGRlcl0gZm9yIHRoZSB0eXBlIHZhcmlhYmxlIGZyb20gW3ZhcmlhYmxlc10gdGhhdCBoYXMgcmF3Ci8vLyBnZW5lcmljIHR5cGVzIHdpdGggaW5ib3VuZCByZWZlcmVuY2VzIGluIGl0cyBib3VuZC4gIFRoZSBzZWNvbmQgZWxlbWVudCBvZgovLy8gdGhlIHRyaXBsZXQgaXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgdGhpcmQgZWxlbWVudCBpcyB0aGUgY29udGV4dC4KTGlzdDxPYmplY3Q+IGNvbnZlcnRSYXdUeXBlQ3ljbGVzSW50b0lzc3VlcygKICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgZGVjbGFyYXRpb24sIExpc3Q8TGlzdDxPYmplY3Q+PiBjeWNsZXMpIHsKICBMaXN0PE9iamVjdD4gaXNzdWVzID0gPE9iamVjdD5bXTsKICBmb3IgKExpc3Q8T2JqZWN0PiBjeWNsZSBpbiBjeWNsZXMpIHsKICAgIGlmIChjeWNsZS5sZW5ndGggPT0gMikgewogICAgICAvLyBMb29wLgogICAgICBUeXBlVmFyaWFibGVCdWlsZGVyIHZhcmlhYmxlID0gY3ljbGVbMF07CiAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgdHlwZSA9IGN5Y2xlWzFdOwogICAgICBpc3N1ZXMuYWRkKHZhcmlhYmxlKTsKICAgICAgaXNzdWVzLmFkZCh0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eQogICAgICAgICAgLndpdGhBcmd1bWVudHModHlwZS5kZWNsYXJhdGlvbi5uYW1lKSk7CiAgICAgIGlzc3Vlcy5hZGQobnVsbCk7IC8vIENvbnRleHQuCiAgICB9IGVsc2UgewogICAgICBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0ID0gPExvY2F0ZWRNZXNzYWdlPltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN5Y2xlLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB2YXJpYWJsZSA9IGN5Y2xlW2ldOwogICAgICAgIE5hbWVkVHlwZUJ1aWxkZXIgdHlwZSA9IGN5Y2xlW2kgKyAxXTsKICAgICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZU5vblNpbXBsZUJvdW5kVmlhUmVmZXJlbmNlCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHR5cGUuZGVjbGFyYXRpb24ubmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbGVVcmksIHZhcmlhYmxlLmNoYXJPZmZzZXQsIHZhcmlhYmxlLm5hbWUubGVuZ3RoKSk7CiAgICAgIH0KICAgICAgTmFtZWRUeXBlQnVpbGRlciBmaXJzdEVuY291bnRlcmVkVHlwZSA9IGN5Y2xlWzFdOwoKICAgICAgaXNzdWVzLmFkZChkZWNsYXJhdGlvbik7CiAgICAgIGlzc3Vlcy5hZGQodGVtcGxhdGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICBkZWNsYXJhdGlvbi5uYW1lLCBmaXJzdEVuY291bnRlcmVkVHlwZS5kZWNsYXJhdGlvbi5uYW1lKSk7CiAgICAgIGlzc3Vlcy5hZGQoY29udGV4dCk7CiAgICB9CiAgfQogIHJldHVybiBpc3N1ZXM7Cn0KCi8vLyBGaW5kcyBub24tc2ltcGxpY2l0eSBpc3N1ZXMgZm9yIHRoZSBnaXZlbiBzZXQgb2YgW3ZhcmlhYmxlc10uCi8vLwovLy8gVGhlIGlzc3VlcyBhcmUgdGhvc2UgY2F1c2VkIGJ5IHJhdyB0eXBlcyB3aXRoIGluYm91bmQgcmVmZXJlbmNlcyBpbiB0aGUKLy8vIGJvdW5kcyBvZiB0aGVpciB0eXBlIHZhcmlhYmxlcy4KLy8vCi8vLyBSZXR1cm5zIGZsYXR0ZW5lZCBsaXN0IG9mIHRyaXBsZXRzLCBlYWNoIHRyaXBsZXQgcmVwcmVzZW50aW5nIGFuIGlzc3VlLiAgVGhlCi8vLyBmaXJzdCBlbGVtZW50IGluIHRoZSB0cmlwbGV0IGlzIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaGFzIHRoZSBpc3N1ZS4KLy8vIFRoZSBzZWNvbmQgZWxlbWVudCBpbiB0aGUgdHJpcGxldCBpcyB0aGUgZXJyb3IgbWVzc2FnZS4gIFRoZSB0aGlyZCBlbGVtZW50Ci8vLyBpbiB0aGUgdHJpcGxldCBpcyB0aGUgY29udGV4dC4KTGlzdDxPYmplY3Q+IGdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzKAogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB2YXJpYWJsZXMpIHsKICBpZiAodmFyaWFibGVzID09IG51bGwpIHJldHVybiA8T2JqZWN0PltdOwogIHJldHVybiBnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKHZhcmlhYmxlcyk7Cn0KCi8vLyBGaW5kcyBub24tc2ltcGxpY2l0eSBpc3N1ZXMgZm9yIHRoZSBnaXZlbiBbZGVjbGFyYXRpb25dLgovLy8KLy8vIFRoZSBpc3N1ZXMgYXJlIHRob3NlIGNhdXNlZCBieSByYXcgdHlwZXMgd2l0aCBpbmJvdW5kIHJlZmVyZW5jZXMgaW4gdGhlCi8vLyBib3VuZHMgb2YgdHlwZSB2YXJpYWJsZXMgZnJvbSBbZGVjbGFyYXRpb25dIGFuZCBieSBjeWNsZXMgb2YgcmF3IHR5cGVzCi8vLyBjb250YWluaW5nIFtkZWNsYXJhdGlvbl0uCi8vLwovLy8gUmV0dXJucyBmbGF0dGVuZWQgbGlzdCBvZiB0cmlwbGV0cywgZWFjaCB0cmlwbGV0IHJlcHJlc2VudGluZyBhbiBpc3N1ZS4gIFRoZQovLy8gZmlyc3QgZWxlbWVudCBpbiB0aGUgdHJpcGxldCBpcyB0aGUgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGhhcyB0aGUgaXNzdWUuCi8vLyBUaGUgc2Vjb25kIGVsZW1lbnQgaW4gdGhlIHRyaXBsZXQgaXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgdGhpcmQgZWxlbWVudAovLy8gaW4gdGhlIHRyaXBsZXQgaXMgdGhlIGNvbnRleHQuCkxpc3Q8T2JqZWN0PiBnZXROb25TaW1wbGljaXR5SXNzdWVzRm9yRGVjbGFyYXRpb24oCiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGRlY2xhcmF0aW9uLAogICAge2Jvb2wgcGVyZm9ybUVycm9yUmVjb3Zlcnk6IHRydWV9KSB7CiAgTGlzdDxPYmplY3Q+IGlzc3VlcyA9IDxPYmplY3Q+W107CiAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlciAmJiBkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzICE9IG51bGwpIHsKICAgIGlzc3Vlcy5hZGRBbGwoZ2V0SW5ib3VuZFJlZmVyZW5jZUlzc3VlcyhkZWNsYXJhdGlvbi50eXBlVmFyaWFibGVzKSk7CiAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyICYmCiAgICAgIGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgaXNzdWVzLmFkZEFsbChnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzKGRlY2xhcmF0aW9uLnR5cGVWYXJpYWJsZXMpKTsKICB9CiAgTGlzdDxMaXN0PE9iamVjdD4+IGN5Y2xlc1RvUmVwb3J0ID0gPExpc3Q8T2JqZWN0Pj5bXTsKICBmb3IgKExpc3Q8T2JqZWN0PiBjeWNsZSBpbiBmaW5kUmF3VHlwZUN5Y2xlcyhkZWNsYXJhdGlvbikpIHsKICAgIC8vIFRvIGF2b2lkIHJlcG9ydGluZyB0aGUgc2FtZSBlcnJvciBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBjeWNsZSwgd2Ugb25seQogICAgLy8gZG8gc28gaWYgaXQgY29tZXMgdGhlIGZpcnN0IGluIHRoZSBsZXhpY29ncmFwaGljYWwgb3JkZXIuICBOb3RlIHRoYXQKICAgIC8vIG9uZS1lbGVtZW50IGN5Y2xlcyBzaG91bGRuJ3QgYmUgY2hlY2tlZCwgYXMgdGhleSBhcmUgbG9vcHMuCiAgICBpZiAoY3ljbGUubGVuZ3RoID09IDIpIHsKICAgICAgY3ljbGVzVG9SZXBvcnQuYWRkKGN5Y2xlKTsKICAgIH0gZWxzZSB7CiAgICAgIFN0cmluZyBkZWNsYXJhdGlvblBhdGhBbmROYW1lID0KICAgICAgICAgICIke2RlY2xhcmF0aW9uLmZpbGVVcml9OiR7ZGVjbGFyYXRpb24ubmFtZX0iOwogICAgICBTdHJpbmcgbGV4TWluUGF0aEFuZE5hbWUgPSBudWxsOwogICAgICBmb3IgKGludCBpID0gMTsgaSA8IGN5Y2xlLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgTmFtZWRUeXBlQnVpbGRlciB0eXBlID0gY3ljbGVbaV07CiAgICAgICAgU3RyaW5nIHBhdGhBbmROYW1lID0KICAgICAgICAgICAgIiR7dHlwZS5kZWNsYXJhdGlvbi5maWxlVXJpfToke3R5cGUuZGVjbGFyYXRpb24ubmFtZX0iOwogICAgICAgIGlmIChsZXhNaW5QYXRoQW5kTmFtZSA9PSBudWxsIHx8CiAgICAgICAgICAgIGxleE1pblBhdGhBbmROYW1lLmNvbXBhcmVUbyhwYXRoQW5kTmFtZSkgPiAwKSB7CiAgICAgICAgICBsZXhNaW5QYXRoQW5kTmFtZSA9IHBhdGhBbmROYW1lOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb25QYXRoQW5kTmFtZSA9PSBsZXhNaW5QYXRoQW5kTmFtZSkgewogICAgICAgIGN5Y2xlc1RvUmVwb3J0LmFkZChjeWNsZSk7CiAgICAgIH0KICAgIH0KICB9CiAgTGlzdDxPYmplY3Q+IHJhd1R5cGVDeWNsZXNBc0lzc3VlcyA9CiAgICAgIGNvbnZlcnRSYXdUeXBlQ3ljbGVzSW50b0lzc3VlcyhkZWNsYXJhdGlvbiwgY3ljbGVzVG9SZXBvcnQpOwogIGlzc3Vlcy5hZGRBbGwocmF3VHlwZUN5Y2xlc0FzSXNzdWVzKTsKCiAgaWYgKHBlcmZvcm1FcnJvclJlY292ZXJ5KSB7CiAgICBicmVha0N5Y2xlcyhjeWNsZXNUb1JlcG9ydCk7CiAgfQoKICByZXR1cm4gaXNzdWVzOwp9CgovLy8gQnJlYWsgcmF3IGdlbmVyaWMgdHlwZSBbY3ljbGVzXSBhcyBlcnJvciByZWNvdmVyeS4KLy8vCi8vLyBUaGUgW2N5Y2xlc10gYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGZvciB0aGUgcmV0dXJuIHZhbHVlCi8vLyBvZiBbZmluZFJhd1R5cGVDeWNsZXNdLgp2b2lkIGJyZWFrQ3ljbGVzKExpc3Q8TGlzdDxPYmplY3Q+PiBjeWNsZXMpIHsKICBmb3IgKExpc3Q8T2JqZWN0PiBjeWNsZSBpbiBjeWNsZXMpIHsKICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdmFyaWFibGUgPSBjeWNsZVswXTsKICAgIHZhcmlhYmxlLmJvdW5kID0gbnVsbDsKICB9Cn0KCnZvaWQgZmluZEdlbmVyaWNGdW5jdGlvblR5cGVzKFR5cGVCdWlsZGVyIHR5cGUsIHtMaXN0PFR5cGVCdWlsZGVyPiByZXN1bHR9KSB7CiAgcmVzdWx0ID8/PSA8VHlwZUJ1aWxkZXI+W107CiAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgaWYgKHR5cGUudHlwZVZhcmlhYmxlcyAhPSBudWxsICYmIHR5cGUudHlwZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7CiAgICAgIHJlc3VsdC5hZGQodHlwZSk7CgogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHlwZVZhcmlhYmxlIGluIHR5cGUudHlwZVZhcmlhYmxlcykgewogICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh0eXBlVmFyaWFibGUuYm91bmQsIHJlc3VsdDogcmVzdWx0KTsKICAgICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXModHlwZVZhcmlhYmxlLmRlZmF1bHRUeXBlLCByZXN1bHQ6IHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyh0eXBlLnJldHVyblR5cGUsIHJlc3VsdDogcmVzdWx0KTsKICAgIGlmICh0eXBlLmZvcm1hbHMgIT0gbnVsbCkgewogICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIHR5cGUuZm9ybWFscykgewogICAgICAgIGZpbmRHZW5lcmljRnVuY3Rpb25UeXBlcyhmb3JtYWwudHlwZSwgcmVzdWx0OiByZXN1bHQpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIgJiYgdHlwZS5hcmd1bWVudHMgIT0gbnVsbCkgewogICAgZm9yIChUeXBlQnVpbGRlciBhcmd1bWVudCBpbiB0eXBlLmFyZ3VtZW50cykgewogICAgICBmaW5kR2VuZXJpY0Z1bmN0aW9uVHlwZXMoYXJndW1lbnQsIHJlc3VsdDogcmVzdWx0KTsKICAgIH0KICB9Cn0KCi8vLyBSZXR1cm5zIHRydWUgaWYgW3R5cGVdIGNvbnRhaW5zIGFueSB0eXBlIHZhcmlhYmxlcyB3aGF0c29ldmVyLiBUaGlzIHNob3VsZAovLy8gb25seSBiZSB1c2VkIGZvciB3b3JraW5nIGFyb3VuZCB0cmFuc2l0aW9uYWwgaXNzdWVzLgovLyBUT0RPKGFoZSk6IFJlbW92ZSB0aGlzIG1ldGhvZC4KYm9vbCBoYXNBbnlUeXBlVmFyaWFibGVzKERhcnRUeXBlIHR5cGUpIHsKICByZXR1cm4gdHlwZS5hY2NlcHQoY29uc3QgVHlwZVZhcmlhYmxlU2VhcmNoKCkpOwp9CgovLy8gRG9uJ3QgdXNlIHRoaXMgZGlyZWN0bHksIHVzZSBbaGFzQW55VHlwZVZhcmlhYmxlc10gaW5zdGVhZC4gQnV0IGRvbid0IHVzZQovLy8gdGhhdCBlaXRoZXIuCi8vIFRPRE8oYWhlKTogUmVtb3ZlIHRoaXMgY2xhc3MuCmNsYXNzIFR5cGVWYXJpYWJsZVNlYXJjaCBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgY29uc3QgVHlwZVZhcmlhYmxlU2VhcmNoKCk7CgogIGJvb2wgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IHRocm93ICJ1bnN1cHBvcnRlZCI7CgogIGJvb2wgYW55VHlwZVZhcmlhYmxlcyhMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlIGluIHR5cGVzKSB7CiAgICAgIGlmICh0eXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgPT4gZmFsc2U7CgogIGJvb2wgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBib29sIHZpc2l0Qm90dG9tVHlwZShCb3R0b21UeXBlIG5vZGUpID0+IGZhbHNlOwoKICBib29sIHZpc2l0TmV2ZXJUeXBlKE5ldmVyVHlwZSBub2RlKSA9PiBmYWxzZTsKCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gYW55VHlwZVZhcmlhYmxlcyhub2RlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgaWYgKGFueVR5cGVWYXJpYWJsZXMobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIHZhcmlhYmxlIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHZhcmlhYmxlLmJvdW5kLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKE5hbWVkVHlwZSB0eXBlIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGlmICh0eXBlLnR5cGUuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSA9PiB0cnVlOwoKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIGFueVR5cGVWYXJpYWJsZXMobm9kZS50eXBlQXJndW1lbnRzKTsKICB9Cn0KhBAATU4/ASEJFBIZFRYXFRMTFxsVEhIBRQFNASgzMDsqLS4tJzMwAUABSQEdCRgxMDkfLCsBMAFJIAFLSFFNEkQlIiY7LiUjDyMIDSkpJjwkGCJAJUgMChc0KQEmPCgBTUYtPDA+Nk4wR0ktPDApSSorKEtKHDBJDgEkGCIlRjcMChcIBiwlIx5PBiZFSVBRICpNJicKCAYgPCAUNUoIBhMEHQIBUARNRD4yCjxDQEFFUDABOzswBAEtAgEdFj09JDQxIjMwRyM1OU0KFQhFITM3SwgTBkATBiE7HyNRDihAJg47Qzs4Ox8fHxoiITgxLgoILjg7Hx8fGiIhODEuCggyOEU7Hx8fGiJGODEuCgg/Gw1RBh0oTyEqDyoIHQYRLCkmTAYqIEcGHBoBSUkmMz5PQysnRidHITw3S0sMNDhDLjsaESMKCAYgMTk1GUBAGiJLLDMfIB0bHSEfGhEfCggGIhk8PBYeHTgBEyZEBhEEDwIBGEolNxpMJQIBUDsEGmIiR1FGAS8zBAFIRjNALj0uK0M/Bis/RT0oBgQBLzkuPS4sMTEzI0EoBgQBEQIBTkkRMRYnHAFRMhkBNC8BMDQmMzAXKRoGAT4mNzk/CiY5NAwKMCpJPgwKJEM6DAo3CAYBMCsGBAFODykZBAIBNgQtLyAUBDYiKBYNJDdDCggGLEQmSi8XSgo1F1AKCAYgPEQIBgQPAgFRBFBPSyJKNjVAOCQ/HiMIBiQvMgYEIwIBUQRRSk4dQzIiIj0tIU1JJEIfDAoaKjYKOCFRSSRCHwwKGio2CjAvJD4oKjIKNDEmQCosNAwKNzcsKDssLjYODAoIDTUdQggGLBlFJkEmH0oKLB9QCggGIDwdRQgGBB8CAVEEUVFPSU4kNCIzPUpCMDJHR1E+Ikc4KTA+SS0QDAo0TiBFNjAKCAYEEQIBTwRIUFFLFwRMSB8yMy06LyM8IyYkM1BMKkczRBAODDYzTiwxNjlQEhAODDk5LkkuMzg7GlEUEhAODAorCA02TQgGLVEnQiYYTAosNjQKCAYhPVAIBgQQAgFKBEpLT04vBE4PSzBKRiQfTTgKCAYwLUgmK09EDAoIBjMzKEMoLVFGDgwKCAYEEQIBUQRRHARRUU9JLUUkJx0PLygcODIkDTkyMS43MhtPCDgBH0hFGwYEEQIBQgRMJARRTU8jNSssLwIBPQRMSx4EUU1PIzMoKSRKSTArSQQ4P1BMQx0hDSY4JzIqHUQpPCsKCDkjCAYEJ0MoAR4hBAERAgE3BFEcLictGwQCAU4eJUcYAUVGTAgGPyA8PwgGQzM6BgQCAU85IioyAgFOESE8HgE+ATAjKgYSBAE0ATQBLgEyATABMDEEAS5COjQGMy8GEgQBPwEsMQQCATdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0YmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYXN0X2FwaS5kYXJ0ieAvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgbGlicmFyeSBleHBvcnRzIGFsbCBBUEkgZnJvbSBLZXJuZWwncyBhc3QuZGFydCB0aGF0IGNhbiBiZSB1c2VkCi8vLyB0aHJvdWdob3V0IGZhc3RhLgpsaWJyYXJ5IGZhc3RhLmtlcm5lbF9hc3RfYXBpOwoKZXhwb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHMsCiAgICAgICAgQXNFeHByZXNzaW9uLAogICAgICAgIEFzc2VydFN0YXRlbWVudCwKICAgICAgICBBc3luY01hcmtlciwKICAgICAgICBCbG9jaywKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIEJyZWFrU3RhdGVtZW50LAogICAgICAgIENhdGNoLAogICAgICAgIENoZWNrTGlicmFyeUlzTG9hZGVkLAogICAgICAgIENsYXNzLAogICAgICAgIENvbXBvbmVudCwKICAgICAgICBDb25zdHJ1Y3RvciwKICAgICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24sCiAgICAgICAgQ29udGludWVTd2l0Y2hTdGF0ZW1lbnQsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRW1wdHlTdGF0ZW1lbnQsCiAgICAgICAgRXhwcmVzc2lvbiwKICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50LAogICAgICAgIEZpZWxkLAogICAgICAgIEZvckluU3RhdGVtZW50LAogICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24sCiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW5pdGlhbGl6ZXIsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkRXhwcmVzc2lvbiwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBJc0V4cHJlc3Npb24sCiAgICAgICAgTGFiZWxlZFN0YXRlbWVudCwKICAgICAgICBMZXQsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBMb2NhbEluaXRpYWxpemVyLAogICAgICAgIExvY2F0aW9uLAogICAgICAgIE1hcEVudHJ5LAogICAgICAgIE1hcExpdGVyYWwsCiAgICAgICAgTWVtYmVyLAogICAgICAgIE1ldGhvZEludm9jYXRpb24sCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIE5vZGUsCiAgICAgICAgTnVsbExpdGVyYWwsCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUHJvcGVydHlHZXQsCiAgICAgICAgUHJvcGVydHlTZXQsCiAgICAgICAgUmV0aHJvdywKICAgICAgICBSZXR1cm5TdGF0ZW1lbnQsCiAgICAgICAgU3RhdGVtZW50LAogICAgICAgIFN0YXRpY0dldCwKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIFN0YXRpY1NldCwKICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uLAogICAgICAgIFN1cGVySW5pdGlhbGl6ZXIsCiAgICAgICAgU3VwZXJNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgU3dpdGNoQ2FzZSwKICAgICAgICBUaGlzRXhwcmVzc2lvbiwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWYsCiAgICAgICAgVHlwZWRlZlR5cGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBWYXJpYWJsZUdldCwKICAgICAgICBWYXJpYWJsZVNldCwKICAgICAgICBWb2lkVHlwZSwKICAgICAgICBzZXRQYXJlbnRzOwoKZXhwb3J0ICdpbnRlcm5hbF9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBcmd1bWVudHNJbXBsLAogICAgICAgIENhc2NhZGUsCiAgICAgICAgRGVmZXJyZWRDaGVjaywKICAgICAgICBGYWN0b3J5Q29uc3RydWN0b3JJbnZvY2F0aW9uSnVkZ21lbnQsCiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbkltcGwsCiAgICAgICAgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCwKICAgICAgICBMb2FkTGlicmFyeVRlYXJPZmYsCiAgICAgICAgTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCwKICAgICAgICBOdWxsQXdhcmVNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIE51bGxBd2FyZVByb3BlcnR5R2V0LAogICAgICAgIFJldHVyblN0YXRlbWVudEltcGwsCiAgICAgICAgU2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgU2hhZG93SW52YWxpZEluaXRpYWxpemVyLAogICAgICAgIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCwKICAgICAgICBWYXJpYWJsZUdldEltcGw7CmgATk48AUkWHgEhCRMWGRUPFBgPHg8TFR8hEhUYFB0PGB0cFhYVFxsVFhoNERsVFRoSEhQQGg4ZEw4VExcVFREZExMaEx0aHxoUGBIXGxEVHRUVEhQBGwkXERcuISkcKSMeHSciHyEZATZwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9hc3RfYXBpLmRhcnRVZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi90cmFuc2Zvcm1hdGlvbnMvYXN5bmMuZGFydMAAVaAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBrZXJuZWwudHJhbnNmb3JtYXRpb25zLmFzeW5jOwoKaW1wb3J0ICcuLi9rZXJuZWwuZGFydCc7CmltcG9ydCAnLi4vdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKaW1wb3J0ICdjb250aW51YXRpb24uZGFydCc7CgovLy8gQSB0cmFuc2Zvcm1lciB0aGF0IGludHJvZHVjZXMgdGVtcG9yYXJ5IHZhcmlhYmxlcyBmb3IgYWxsIHN1YmV4cHJlc3Npb25zCi8vLyB0aGF0IGFyZSBhbGl2ZSBhY3Jvc3MgeWllbGQgcG9pbnRzIChBd2FpdEV4cHJlc3Npb24pLgovLy8KLy8vIFRoZSB0cmFuc2Zvcm1lciBpcyBpbnZva2VkIGJ5IHBhc3NpbmcgW3Jld3JpdGVdIGEgdG9wLWxldmVsIGV4cHJlc3Npb24uCi8vLwovLy8gQWxsIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBhcmUgcG9zc2libGUgbGl2ZSBhY3Jvc3MgYW4gYXdhaXQgYXJlIG5hbWVkIGluCi8vLyBsb2NhbCB2YXJpYWJsZXMuCi8vLwovLy8gQXdhaXQgZXhwcmVzc2lvbnMgYXJlIHRyYW5zbGF0ZWQgaW50byBhIGNhbGwgdG8gYSBoZWxwZXIgZnVuY3Rpb24gYW5kIGEKLy8vIG5hdGl2ZSB5aWVsZC4KY2xhc3MgRXhwcmVzc2lvbkxpZnRlciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBBc3luY1Jld3JpdGVyQmFzZSBjb250aW51YXRpb25SZXdyaXRlcjsKCiAgLy8vIEhhdmUgd2Ugc2VlbiBhbiBhd2FpdCB0byB0aGUgcmlnaHQgaW4gdGhlIGV4cHJlc3Npb24gdHJlZS4KICAvLy8KICAvLy8gU3ViZXhwcmVzc2lvbnMgYXJlIHZpc2l0ZWQgcmlnaHQtdG8tbGVmdCBpbiB0aGUgcmV2ZXJzZSBvZiBldmFsdWF0aW9uCiAgLy8vIG9yZGVyLgogIC8vLwogIC8vLyBPbiBlbnRyeSB0byBhbiBleHByZXNzaW9uJ3MgdmlzaXQgbWV0aG9kLCBbc2VlbkF3YWl0XSBpbmRpY2F0ZXMgd2hldGhlciBhCiAgLy8vIHNpYmxpbmcgdG8gdGhlIHJpZ2h0IGNvbnRhaW5zIGFuIGF3YWl0LiAgSWYgc28gdGhlIGV4cHJlc3Npb24gd2lsbCBiZQogIC8vLyBuYW1lZCBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBiZWNhdXNlIGl0IGlzIHBvdGVudGlhbGx5IGxpdmUgYWNyb3NzIGFuCiAgLy8vIGF3YWl0LgogIC8vLwogIC8vLyBPbiBleGl0IGZyb20gYW4gZXhwcmVzc2lvbidzIHZpc2l0IG1ldGhvZCwgW3NlZW5Bd2FpdF0gaW5kaWNhdGVzIHdoZXRoZXIKICAvLy8gdGhlIGV4cHJlc3Npb24gaXRzZWxmIG9yIGEgc2libGluZyB0byB0aGUgcmlnaHQgY29udGFpbnMgYW4gYXdhaXQuCiAgYm9vbCBzZWVuQXdhaXQgPSBmYWxzZTsKCiAgLy8vIFRoZSAocmV2ZXJzZSBvcmRlcikgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyB0aGF0IGhhdmUgYmVlbiBlbWl0dGVkLgogIC8vLwogIC8vLyBUcmFuc2Zvcm1hdGlvbiBvZiBhbiBleHByZXNzaW9uIHByb2R1Y2VzIGEgdHJhbnNmb3JtZWQgZXhwcmVzc2lvbiBhbmQgYQogIC8vLyBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIHdoaWNoIGFyZSBhc3NpZ25tZW50cyB0byBsb2NhbCB2YXJpYWJsZXMsIGNhbGxzIHRvCiAgLy8vIGhlbHBlciBmdW5jdGlvbnMsIGFuZCB5aWVsZCBwb2ludHMuICBPbmx5IHRoZSB5aWVsZCBwb2ludHMgbmVlZCB0byBiZSBhCiAgLy8vIHN0YXRlbWVudHMsIGFuZCB0aGV5IGFyZSBzdGF0ZW1lbnRzIHNvIGFuIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgdG8KICAvLy8gaGFuZGxlIHVubmFtZWQgZXhwcmVzc2lvbiBpbnRlcm1lZGlhdGUgbGl2ZSBhY3Jvc3MgeWllbGQgcG9pbnRzLgogIC8vLwogIC8vLyBUaGUgdmlzaXQgbWV0aG9kcyByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIGV4cHJlc3Npb24gYW5kIGJ1aWxkIGEgc2VxdWVuY2UKICAvLy8gb2Ygc3RhdGVtZW50cyBieSBlbWl0dGluZyBzdGF0ZW1lbnRzIGludG8gdGhpcyBsaXN0LiAgVGhpcyBsaXN0IGlzIGJ1aWx0CiAgLy8vIGluIHJldmVyc2UgYmVjYXVzZSBjaGlsZHJlbiBhcmUgdmlzaXRlZCByaWdodC10by1sZWZ0LgogIC8vLwogIC8vLyBJZiBhbiBleHByZXNzaW9uIHNob3VsZCBiZSBuYW1lZCBpdCBpcyBuYW1lZCBiZWZvcmUgdmlzaXRpbmcgaXRzIGNoaWxkcmVuCiAgLy8vIHNvIHRoZSBuYW1pbmcgYXNzaWdubWVudCBhcHBlYXJzIGluIHRoZSBsaXN0IGJlZm9yZSBhbGwgc3RhdGVtZW50cwogIC8vLyBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBjaGlsZHJlbi4KICAvLy8KICAvLy8gQ2hpbGRyZW4gdGhhdCBhcmUgY29uZGl0aW9uYWxseSBldmFsdWF0ZWQsIHN1Y2ggYXMgc29tZSBwYXJ0cyBvZiBsb2dpY2FsCiAgLy8vIGFuZCBjb25kaXRpb25hbCBleHByZXNzaW9ucywgbXVzdCBiZSBkZWxpbWl0ZWQgc28gdGhhdCB0aGV5IGRvIG5vdCBlbWl0CiAgLy8vIHVuZ3VhcmRlZCBzdGF0ZW1lbnRzIGludG8gW3N0YXRlbWVudHNdLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSBzZXR0aW5nCiAgLy8vIFtzdGF0ZW1lbnRzXSB0byBhIGZyZXNoIGVtcHR5IGxpc3QgYmVmb3JlIHRyYW5zZm9ybWluZyB0aG9zZSBjaGlsZHJlbi4KICBMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CgogIC8vLyBUaGUgbnVtYmVyIG9mIGN1cnJlbnRseSBsaXZlIG5hbWVkIGludGVybWVkaWF0ZSB2YWx1ZXMuCiAgLy8vCiAgLy8vIFRoaXMgaW5kZXggaXMgdXNlZCB0byBhbGxvY2F0ZSBuYW1lcyB0byB0ZW1wb3JhcnkgdmFsdWVzLiAgQmVjYXVzZQogIC8vLyBjaGlsZHJlbiBhcmUgdmlzaXRlZCByaWdodC10by1sZWZ0LCBuYW1lcyBhcmUgYXNzaWduZWQgaW4gcmV2ZXJzZSBvcmRlciBvZgogIC8vLyBpbmRleC4KICAvLy8KICAvLy8gV2hlbiBhbiBhc3NpZ25tZW50IGlzIGVtaXR0ZWQgaW50byBbc3RhdGVtZW50c10gdG8gbmFtZSBhbiBleHByZXNzaW9uCiAgLy8vIGJlZm9yZSB2aXNpdGluZyBpdHMgY2hpbGRyZW4sIHRoZSBpbmRleCBpcyBub3QgaW1tZWRpYXRlbHkgcmVzZXJ2ZWQKICAvLy8gYmVjYXVzZSBhIGNoaWxkIGNhbiBmcmVlbHkgdXNlIHRoZSBzYW1lIG5hbWUgYXMgaXRzIHBhcmVudC4gIEluIHByYWN0aWNlLAogIC8vLyB0aGlzIHdpbGwgYmUgdGhlIHJpZ2h0bW9zdCBuYW1lZCBjaGlsZC4KICAvLy8KICAvLy8gQWZ0ZXIgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIGEgbmFtZWQgZXhwcmVzc2lvbiwgW25hbWVJbmRleF0gaXMgc2V0IHRvCiAgLy8vIGluZGljYXRlIG9uZSBtb3JlIGxpdmUgdmFsdWUgKHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbikgdGhhbiBiZWZvcmUKICAvLy8gdmlzaXRpbmcgdGhlIGV4cHJlc3Npb24uCiAgLy8vCiAgLy8vIEFmdGVyIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiBhbiBleHByZXNzaW9uIHRoYXQgaXMgbm90IG5hbWVkLAogIC8vLyBbbmFtZUluZGV4XSBtYXkgc3RpbGwgYWNjb3VudCBmb3IgbmFtZXMgb2Ygc3ViZXhwcmVzc2lvbnMuCiAgaW50IG5hbWVJbmRleCA9IDA7CgogIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gYXN5bmNSZXN1bHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignOnJlc3VsdCcpOwogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CgogIEV4cHJlc3Npb25MaWZ0ZXIodGhpcy5jb250aW51YXRpb25SZXdyaXRlcik7CgogIFN0YXRpY1R5cGVDb250ZXh0IGdldCBfc3RhdGljVHlwZUNvbnRleHQgPT4KICAgICAgY29udGludWF0aW9uUmV3cml0ZXIuc3RhdGljVHlwZUNvbnRleHQ7CgogIEJsb2NrIGJsb2NrT2YoTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMpIHsKICAgIHJldHVybiBuZXcgQmxvY2soc3RhdGVtZW50cy5yZXZlcnNlZC50b0xpc3QoKSk7CiAgfQoKICAvLy8gUmV3cml0ZSBhIHRvcGxldmVsIGV4cHJlc3Npb24gKHRvcGxldmVsIHdydC4gYSBzdGF0ZW1lbnQpLgogIC8vLwogIC8vLyBSZXdyaXRpbmcgYW4gZXhwcmVzc2lvbiBwcm9kdWNlcyBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYW5kIGFuCiAgLy8vIGV4cHJlc3Npb24uICBUaGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGdpdmVuIGxpc3QuICBQYXNzCiAgLy8vIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHJld3JpdHRlbiBleHByZXNzaW9uIHNob3VsZCBiZSBkZWxpbWl0ZWQgZnJvbSB0aGUKICAvLy8gc3Vycm91bmRpbmcgY29udGV4dC4KICBFeHByZXNzaW9uIHJld3JpdGUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBMaXN0PFN0YXRlbWVudD4gb3V0ZXIpIHsKICAgIGFzc2VydChzdGF0ZW1lbnRzLmlzRW1wdHkpOwogICAgdmFyIHNhdmVkID0gc2VlbkF3YWl0OwogICAgc2VlbkF3YWl0ID0gZmFsc2U7CiAgICBFeHByZXNzaW9uIHJlc3VsdCA9IGV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKICAgIG91dGVyLmFkZEFsbChzdGF0ZW1lbnRzLnJldmVyc2VkKTsKICAgIHN0YXRlbWVudHMuY2xlYXIoKTsKICAgIHNlZW5Bd2FpdCA9IHNlZW5Bd2FpdCB8fCBzYXZlZDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBQZXJmb3JtIGFuIGFjdGlvbiB3aXRoIGEgZ2l2ZW4gbGlzdCBvZiBzdGF0ZW1lbnRzIHNvIHRoYXQgaXQgY2Fubm90IGVtaXQKICAvLyBzdGF0ZW1lbnRzIGludG8gdGhlICdvdXRlcicgbGlzdC4KICBFeHByZXNzaW9uIGRlbGltaXQoRXhwcmVzc2lvbiBhY3Rpb24oKSwgTGlzdDxTdGF0ZW1lbnQ+IGlubmVyKSB7CiAgICB2YXIgaW5kZXggPSBuYW1lSW5kZXg7CiAgICB2YXIgb3V0ZXIgPSBzdGF0ZW1lbnRzOwogICAgc3RhdGVtZW50cyA9IGlubmVyOwogICAgRXhwcmVzc2lvbiByZXN1bHQgPSBhY3Rpb24oKTsKICAgIG5hbWVJbmRleCA9IGluZGV4OwogICAgc3RhdGVtZW50cyA9IG91dGVyOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIE5hbWUgYW4gZXhwcmVzc2lvbiBieSBlbWl0dGluZyBhbiBhc3NpZ25tZW50IHRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLgogIFZhcmlhYmxlR2V0IG5hbWUoRXhwcmVzc2lvbiBleHByKSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHRlbXAgPQogICAgICAgIGFsbG9jYXRlVGVtcG9yYXJ5KG5hbWVJbmRleCwgZXhwci5nZXRTdGF0aWNUeXBlKF9zdGF0aWNUeXBlQ29udGV4dCkpOwogICAgc3RhdGVtZW50cy5hZGQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IFZhcmlhYmxlU2V0KHRlbXAsIGV4cHIpKSk7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHRlbXApOwogIH0KCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBhbGxvY2F0ZVRlbXBvcmFyeShpbnQgaW5kZXgsIERhcnRUeXBlIHR5cGUpIHsKICAgIGZvciAodmFyIGkgPSB2YXJpYWJsZXMubGVuZ3RoOyBpIDw9IGluZGV4OyBpKyspIHsKICAgICAgdmFyaWFibGVzCiAgICAgICAgICAuYWRkKG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCI6YXN5bmNfdGVtcG9yYXJ5XyR7aX0iLCB0eXBlOiB0eXBlKSk7CiAgICB9CiAgICByZXR1cm4gdmFyaWFibGVzW2luZGV4XTsKICB9CgogIC8vIFNpbXBsZSBsaXRlcmFscy4gIFRoZXNlIGFyZSBwdXJlIGV4cHJlc3Npb25zIHNvIHRoZXkgY2FuIGJlIGV2YWx1YXRlZCBhZnRlcgogIC8vIGFuIGF3YWl0IHRvIHRoZWlyIHJpZ2h0LgogIFRyZWVOb2RlIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIGV4cHIpID0+IGV4cHI7CiAgVHJlZU5vZGUgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBleHByKSA9PiBleHByOwogIFRyZWVOb2RlIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gZXhwcikgPT4gZXhwcjsKICBUcmVlTm9kZSB2aXNpdFN0cmluZ0xpdGVyYWwoU3RyaW5nTGl0ZXJhbCBleHByKSA9PiBleHByOwogIFRyZWVOb2RlIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIGV4cHIpID0+IGV4cHI7CiAgVHJlZU5vZGUgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgZXhwcikgPT4gZXhwcjsKICBUcmVlTm9kZSB2aXNpdEJvb2xMaXRlcmFsKEJvb2xMaXRlcmFsIGV4cHIpID0+IGV4cHI7CiAgVHJlZU5vZGUgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBleHByKSA9PiBleHByOwoKICAvLyBOdWxsYXJ5IGV4cHJlc3Npb25zIHdpdGggZWZmZWN0cy4KICBFeHByZXNzaW9uIG51bGxhcnkoRXhwcmVzc2lvbiBleHByKSB7CiAgICBpZiAoc2VlbkF3YWl0KSB7CiAgICAgIGV4cHIgPSBuYW1lKGV4cHIpOwogICAgICArK25hbWVJbmRleDsKICAgIH0KICAgIHJldHVybiBleHByOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBleHByKSA9PiBudWxsYXJ5KGV4cHIpOwogIFRyZWVOb2RlIHZpc2l0U3VwZXJQcm9wZXJ0eUdldChTdXBlclByb3BlcnR5R2V0IGV4cHIpID0+IG51bGxhcnkoZXhwcik7CiAgVHJlZU5vZGUgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IGV4cHIpID0+IG51bGxhcnkoZXhwcik7CiAgVHJlZU5vZGUgdmlzaXRSZXRocm93KFJldGhyb3cgZXhwcikgPT4gbnVsbGFyeShleHByKTsKCiAgLy8gR2V0dGluZyBhIGZpbmFsIG9yIGNvbnN0IHZhcmlhYmxlIGlzIG5vdCBhbiBlZmZlY3Qgc28gaXQgY2FuIGJlIGV2YWx1YXRlZAogIC8vIGFmdGVyIGFuIGF3YWl0IHRvIGl0cyByaWdodC4KICBUcmVlTm9kZSB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IGV4cHIpIHsKICAgIGlmIChzZWVuQXdhaXQgJiYgIWV4cHIudmFyaWFibGUuaXNGaW5hbCAmJiAhZXhwci52YXJpYWJsZS5pc0NvbnN0KSB7CiAgICAgIGV4cHIgPSBuYW1lKGV4cHIpOwogICAgICArK25hbWVJbmRleDsKICAgIH0KICAgIHJldHVybiBleHByOwogIH0KCiAgLy8gVHJhbnNmb3JtIGFuIGV4cHJlc3Npb24gZ2l2ZW4gYW4gYWN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgY2hpbGRyZW4uICBGb3IKICAvLyB0aGlzIHB1cnBvc2VzIG9mIHRoZSBhd2FpdCB0cmFuc2Zvcm1lciB0aGUgY2hpbGRyZW4gc2hvdWxkIGdlbmVyYWxseSBiZQogIC8vIHRyYW5zbGF0ZWQgZnJvbSByaWdodCB0byBsZWZ0LCBpbiB0aGUgcmV2ZXJzZSBvZiBldmFsdWF0aW9uIG9yZGVyLgogIEV4cHJlc3Npb24gdHJhbnNmb3JtKEV4cHJlc3Npb24gZXhwciwgdm9pZCBhY3Rpb24oKSkgewogICAgdmFyIHNob3VsZE5hbWUgPSBzZWVuQXdhaXQ7CgogICAgLy8gMS4gSWYgdGhlcmUgaXMgYW4gYXdhaXQgaW4gYSBzaWJsaW5nIHRvIHRoZSByaWdodCwgZW1pdCBhbiBhc3NpZ25tZW50IHRvCiAgICAvLyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBiZWZvcmUgdHJhbnNmb3JtaW5nIHRoZSBjaGlsZHJlbi4KICAgIHZhciByZXN1bHQgPSBzaG91bGROYW1lID8gbmFtZShleHByKSA6IGV4cHI7CgogICAgLy8gMi4gUmVtZW1iZXIgdGhlIG51bWJlciBvZiBsaXZlIHRlbXBvcmFyaWVzIGJlZm9yZSB0cmFuc2Zvcm1pbmcgdGhlCiAgICAvLyBjaGlsZHJlbi4KICAgIHZhciBpbmRleCA9IG5hbWVJbmRleDsKCiAgICAvLyAzLiBUcmFuc2Zvcm0gdGhlIGNoaWxkcmVuLiAgSW5pdGlhbGx5IHRoZXkgZG8gbm90IGhhdmUgYW4gYXdhaXQgaW4gYQogICAgLy8gc2libGluZyB0byB0aGVpciByaWdodC4KICAgIHNlZW5Bd2FpdCA9IGZhbHNlOwogICAgYWN0aW9uKCk7CgogICAgLy8gNC4gSWYgdGhlIGV4cHJlc3Npb24gd2FzIG5hbWVkIHRoZW4gdGhlIHZhcmlhYmxlcyB1c2VkIGZvciBjaGlsZHJlbiBhcmUKICAgIC8vIG5vIGxvbmdlciBsaXZlIGJ1dCB0aGUgdmFyaWFibGUgdXNlZCBmb3IgdGhlIGV4cHJlc3Npb24gaXMuCiAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgYSBzaWJsaW5nIHRvIHRoZSBsZWZ0ICh5ZXQgdG8gYmUgcHJvY2Vzc2VkKSBjYW5ub3QKICAgIC8vIHJldXNlIGFueSBvZiB0aGUgdmFyaWFibGVzIHVzZWQgaGVyZSwgYXMgdGhlIGFzc2lnbm1lbnRzIGluIHRoZSBjaGlsZHJlbgogICAgLy8gKGhlcmUpIHdvdWxkIG92ZXJ3cml0ZSBhc3NpZ25tZW50cyBpbiB0aGUgc2libGluZ3MgdG8gdGhlIGxlZnQsCiAgICAvLyBwb3NzaWJseSBiZWZvcmUgdGhlIHVzZSBvZiB0aGUgb3ZlcndyaXR0ZW4gdmFsdWVzLgogICAgaWYgKHNob3VsZE5hbWUpIHsKICAgICAgaWYgKGluZGV4ICsgMSA+IG5hbWVJbmRleCkgbmFtZUluZGV4ID0gaW5kZXggKyAxOwogICAgICBzZWVuQXdhaXQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFVuYXJ5IGV4cHJlc3Npb25zLgogIEV4cHJlc3Npb24gdW5hcnkoRXhwcmVzc2lvbiBleHByKSB7CiAgICByZXR1cm4gdHJhbnNmb3JtKGV4cHIsICgpIHsKICAgICAgZXhwci50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIH0pOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBleHByKSA9PiB1bmFyeShleHByKTsKICBUcmVlTm9kZSB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IGV4cHIpID0+IHVuYXJ5KGV4cHIpOwogIFRyZWVOb2RlIHZpc2l0RGlyZWN0UHJvcGVydHlHZXQoRGlyZWN0UHJvcGVydHlHZXQgZXhwcikgPT4gdW5hcnkoZXhwcik7CiAgVHJlZU5vZGUgdmlzaXRTdXBlclByb3BlcnR5U2V0KFN1cGVyUHJvcGVydHlTZXQgZXhwcikgPT4gdW5hcnkoZXhwcik7CiAgVHJlZU5vZGUgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IGV4cHIpID0+IHVuYXJ5KGV4cHIpOwogIFRyZWVOb2RlIHZpc2l0Tm90KE5vdCBleHByKSA9PiB1bmFyeShleHByKTsKICBUcmVlTm9kZSB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gZXhwcikgPT4gdW5hcnkoZXhwcik7CiAgVHJlZU5vZGUgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIGV4cHIpID0+IHVuYXJ5KGV4cHIpOwogIFRyZWVOb2RlIHZpc2l0VGhyb3coVGhyb3cgZXhwcikgPT4gdW5hcnkoZXhwcik7CgogIFRyZWVOb2RlIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgZXhwcikgewogICAgcmV0dXJuIHRyYW5zZm9ybShleHByLCAoKSB7CiAgICAgIGV4cHIudmFsdWUgPSBleHByLnZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGV4cHI7CiAgICAgIGV4cHIucmVjZWl2ZXIgPSBleHByLnJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGV4cHI7CiAgICB9KTsKICB9CgogIFRyZWVOb2RlIHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoRGlyZWN0UHJvcGVydHlTZXQgZXhwcikgewogICAgcmV0dXJuIHRyYW5zZm9ybShleHByLCAoKSB7CiAgICAgIGV4cHIudmFsdWUgPSBleHByLnZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGV4cHI7CiAgICAgIGV4cHIucmVjZWl2ZXIgPSBleHByLnJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGV4cHI7CiAgICB9KTsKICB9CgogIFRyZWVOb2RlIHZpc2l0QXJndW1lbnRzKEFyZ3VtZW50cyBhcmdzKSB7CiAgICBmb3IgKHZhciBuYW1lZCBpbiBhcmdzLm5hbWVkLnJldmVyc2VkKSB7CiAgICAgIG5hbWVkLnZhbHVlID0gbmFtZWQudmFsdWUuYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gbmFtZWQ7CiAgICB9CiAgICB2YXIgcG9zaXRpb25hbCA9IGFyZ3MucG9zaXRpb25hbDsKICAgIGZvciAodmFyIGkgPSBwb3NpdGlvbmFsLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHBvc2l0aW9uYWxbaV0gPSBwb3NpdGlvbmFsW2ldLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGFyZ3M7CiAgICB9CiAgICAvLyBSZXR1cm5zIHRoZSBhcmd1bWVudHMsIHdoaWNoIGlzIGFzc3VtZWQgYXQgdGhlIGNhbGwgc2l0ZXMgYmVjYXVzZSB0aGV5IGRvCiAgICAvLyBub3QgcmVwbGFjZSB0aGUgYXJndW1lbnRzIG9yIHNldCBwYXJlbnQgcG9pbnRlcnMuCiAgICByZXR1cm4gYXJnczsKICB9CgogIFRyZWVOb2RlIHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIGV4cHIpIHsKICAgIHJldHVybiB0cmFuc2Zvcm0oZXhwciwgKCkgewogICAgICB2aXNpdEFyZ3VtZW50cyhleHByLmFyZ3VtZW50cyk7CiAgICAgIGV4cHIucmVjZWl2ZXIgPSBleHByLnJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGV4cHI7CiAgICB9KTsKICB9CgogIFRyZWVOb2RlIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIGV4cHIpIHsKICAgIHJldHVybiB0cmFuc2Zvcm0oZXhwciwgKCkgewogICAgICB2aXNpdEFyZ3VtZW50cyhleHByLmFyZ3VtZW50cyk7CiAgICAgIGV4cHIucmVjZWl2ZXIgPSBleHByLnJlY2VpdmVyLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGV4cHI7CiAgICB9KTsKICB9CgogIFRyZWVOb2RlIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBleHByKSB7CiAgICByZXR1cm4gdHJhbnNmb3JtKGV4cHIsICgpIHsKICAgICAgdmlzaXRBcmd1bWVudHMoZXhwci5hcmd1bWVudHMpOwogICAgfSk7CiAgfQoKICBUcmVlTm9kZSB2aXNpdFN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBleHByKSB7CiAgICByZXR1cm4gdHJhbnNmb3JtKGV4cHIsICgpIHsKICAgICAgdmlzaXRBcmd1bWVudHMoZXhwci5hcmd1bWVudHMpOwogICAgfSk7CiAgfQoKICBUcmVlTm9kZSB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gZXhwcikgewogICAgcmV0dXJuIHRyYW5zZm9ybShleHByLCAoKSB7CiAgICAgIHZpc2l0QXJndW1lbnRzKGV4cHIuYXJndW1lbnRzKTsKICAgIH0pOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gZXhwcikgewogICAgcmV0dXJuIHRyYW5zZm9ybShleHByLCAoKSB7CiAgICAgIHZhciBleHByZXNzaW9ucyA9IGV4cHIuZXhwcmVzc2lvbnM7CiAgICAgIGZvciAodmFyIGkgPSBleHByZXNzaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIGV4cHJlc3Npb25zW2ldID0gZXhwcmVzc2lvbnNbaV0uYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gZXhwcjsKICAgICAgfQogICAgfSk7CiAgfQoKICBUcmVlTm9kZSB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIGV4cHIpIHsKICAgIHJldHVybiB0cmFuc2Zvcm0oZXhwciwgKCkgewogICAgICB2YXIgZXhwcmVzc2lvbnMgPSBleHByLmV4cHJlc3Npb25zOwogICAgICBmb3IgKHZhciBpID0gZXhwcmVzc2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBleHByZXNzaW9uc1tpXSA9IGV4cHIuZXhwcmVzc2lvbnNbaV0uYWNjZXB0PFRyZWVOb2RlPih0aGlzKQogICAgICAgICAgLi5wYXJlbnQgPSBleHByOwogICAgICB9CiAgICB9KTsKICB9CgogIFRyZWVOb2RlIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIGV4cHIpIHsKICAgIHJldHVybiB0cmFuc2Zvcm0oZXhwciwgKCkgewogICAgICBmb3IgKHZhciBlbnRyeSBpbiBleHByLmVudHJpZXMucmV2ZXJzZWQpIHsKICAgICAgICBlbnRyeS52YWx1ZSA9IGVudHJ5LnZhbHVlLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IGVudHJ5OwogICAgICAgIGVudHJ5LmtleSA9IGVudHJ5LmtleS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLi5wYXJlbnQgPSBlbnRyeTsKICAgICAgfQogICAgfSk7CiAgfQoKICAvLyBDb250cm9sIGZsb3cuCiAgVHJlZU5vZGUgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBleHByKSB7CiAgICB2YXIgc2hvdWxkTmFtZSA9IHNlZW5Bd2FpdDsKCiAgICAvLyBSaWdodCBpcyBkZWxpbWl0ZWQgYmVjYXVzZSBpdCBpcyBjb25kaXRpb25hbGx5IGV2YWx1YXRlZC4KICAgIHZhciByaWdodFN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgc2VlbkF3YWl0ID0gZmFsc2U7CiAgICBleHByLnJpZ2h0ID0KICAgICAgICBkZWxpbWl0KCgpID0+IGV4cHIucmlnaHQuYWNjZXB0PFRyZWVOb2RlPih0aGlzKSwgcmlnaHRTdGF0ZW1lbnRzKQogICAgICAgICAgLi5wYXJlbnQgPSBleHByOwogICAgdmFyIHJpZ2h0QXdhaXQgPSBzZWVuQXdhaXQ7CgogICAgaWYgKHJpZ2h0U3RhdGVtZW50cy5pc0VtcHR5KSB7CiAgICAgIC8vIEVhc3kgY2FzZTogcmlnaHQgZGlkIG5vdCBlbWl0IGFueSBzdGF0ZW1lbnRzLgogICAgICBzZWVuQXdhaXQgPSBzaG91bGROYW1lOwogICAgICByZXR1cm4gdHJhbnNmb3JtKGV4cHIsICgpIHsKICAgICAgICBleHByLmxlZnQgPSBleHByLmxlZnQuYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gZXhwcjsKICAgICAgICBzZWVuQXdhaXQgPSBzZWVuQXdhaXQgfHwgcmlnaHRBd2FpdDsKICAgICAgfSk7CiAgICB9CgogICAgLy8gSWYgcmlnaHQgaGFzIGVtaXR0ZWQgc3RhdGVtZW50cyB3ZSB3aWxsIHByb2R1Y2UgYSB0ZW1wb3JhcnkgdCBhbmQgZW1pdAogICAgLy8gZm9yICYmICh0aGVyZSBpcyBhbiBhbmFsb2dvdXMgY2FzZSBmb3IgfHwpOgogICAgLy8KICAgIC8vIHQgPSBbbGVmdF0gPT0gdHJ1ZTsKICAgIC8vIGlmICh0KSB7CiAgICAvLyAgIHQgPSBbcmlnaHRdID09IHRydWU7CiAgICAvLyB9CgogICAgLy8gUmVjYWxsIHRoYXQgc3RhdGVtZW50cyBhcmUgZW1pdHRlZCBpbiByZXZlcnNlIG9yZGVyLCBzbyBmaXJzdCBlbWl0IHRoZSBpZgogICAgLy8gc3RhdGVtZW50LCB0aGVuIHRoZSBhc3NpZ25tZW50IG9mIFtsZWZ0XSA9PSB0cnVlLCBhbmQgdGhlbiB0cmFuc2xhdGUgbGVmdAogICAgLy8gc28gYW55IHN0YXRlbWVudHMgaXQgZW1pdHMgb2NjdXIgYWZ0ZXIgaW4gdGhlIGFjY3VtdWxhdGVkIGxpc3QgKHRoYXQgaXMsCiAgICAvLyBzbyB0aGV5IG9jY3VyIGJlZm9yZSBpbiB0aGUgY29ycmVzcG9uZGluZyBibG9jaykuCiAgICB2YXIgcmlnaHRCb2R5ID0gYmxvY2tPZihyaWdodFN0YXRlbWVudHMpOwogICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlVGVtcG9yYXJ5KAogICAgICAgIG5hbWVJbmRleCwKICAgICAgICBfc3RhdGljVHlwZUNvbnRleHQudHlwZUVudmlyb25tZW50LmNvcmVUeXBlcwogICAgICAgICAgICAuYm9vbFJhd1R5cGUoX3N0YXRpY1R5cGVDb250ZXh0Lm5vbk51bGxhYmxlKSk7CiAgICByaWdodEJvZHkuYWRkU3RhdGVtZW50KG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBWYXJpYWJsZVNldCgKICAgICAgICByZXN1bHQsCiAgICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24oZXhwci5yaWdodCwgbmV3IE5hbWUoJz09JyksCiAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W25ldyBCb29sTGl0ZXJhbCh0cnVlKV0pKSkpKTsKICAgIHZhciB0aGVuLCBvdGhlcndpc2U7CiAgICBpZiAoZXhwci5vcGVyYXRvciA9PSAnJiYnKSB7CiAgICAgIHRoZW4gPSByaWdodEJvZHk7CiAgICAgIG90aGVyd2lzZSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICB0aGVuID0gbmV3IEVtcHR5U3RhdGVtZW50KCk7CiAgICAgIG90aGVyd2lzZSA9IHJpZ2h0Qm9keTsKICAgIH0KICAgIHN0YXRlbWVudHMuYWRkKG5ldyBJZlN0YXRlbWVudChuZXcgVmFyaWFibGVHZXQocmVzdWx0KSwgdGhlbiwgb3RoZXJ3aXNlKSk7CgogICAgdmFyIHRlc3QgPSBuZXcgTWV0aG9kSW52b2NhdGlvbihleHByLmxlZnQsIG5ldyBOYW1lKCc9PScpLAogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W25ldyBCb29sTGl0ZXJhbCh0cnVlKV0pKTsKICAgIHN0YXRlbWVudHMuYWRkKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBWYXJpYWJsZVNldChyZXN1bHQsIHRlc3QpKSk7CgogICAgc2VlbkF3YWl0ID0gZmFsc2U7CiAgICB0ZXN0LnJlY2VpdmVyID0gdGVzdC5yZWNlaXZlci5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLi5wYXJlbnQgPSB0ZXN0OwoKICAgICsrbmFtZUluZGV4OwogICAgc2VlbkF3YWl0ID0gc2VlbkF3YWl0IHx8IHJpZ2h0QXdhaXQ7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHJlc3VsdCk7CiAgfQoKICBUcmVlTm9kZSB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gZXhwcikgewogICAgLy8gVGhlbiBhbmQgb3RoZXJ3aXNlIGFyZSBkZWxpbWl0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjb25kaXRpb25hbGx5CiAgICAvLyBldmFsdWF0ZWQuCiAgICB2YXIgc2hvdWxkTmFtZSA9IHNlZW5Bd2FpdDsKCiAgICB2YXIgdGhlblN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgc2VlbkF3YWl0ID0gZmFsc2U7CiAgICBleHByLnRoZW4gPSBkZWxpbWl0KCgpID0+IGV4cHIudGhlbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLCB0aGVuU3RhdGVtZW50cykKICAgICAgLi5wYXJlbnQgPSBleHByOwogICAgdmFyIHRoZW5Bd2FpdCA9IHNlZW5Bd2FpdDsKCiAgICB2YXIgb3RoZXJ3aXNlU3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICBzZWVuQXdhaXQgPSBmYWxzZTsKICAgIGV4cHIub3RoZXJ3aXNlID0gZGVsaW1pdCgKICAgICAgICAoKSA9PiBleHByLm90aGVyd2lzZS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLCBvdGhlcndpc2VTdGF0ZW1lbnRzKQogICAgICAuLnBhcmVudCA9IGV4cHI7CiAgICB2YXIgb3RoZXJ3aXNlQXdhaXQgPSBzZWVuQXdhaXQ7CgogICAgaWYgKHRoZW5TdGF0ZW1lbnRzLmlzRW1wdHkgJiYgb3RoZXJ3aXNlU3RhdGVtZW50cy5pc0VtcHR5KSB7CiAgICAgIC8vIEVhc3kgY2FzZTogbmVpdGhlciB0aGVuIG5vciBvdGhlcndpc2UgZW1pdHRlZCBhbnkgc3RhdGVtZW50cy4KICAgICAgc2VlbkF3YWl0ID0gc2hvdWxkTmFtZTsKICAgICAgcmV0dXJuIHRyYW5zZm9ybShleHByLCAoKSB7CiAgICAgICAgZXhwci5jb25kaXRpb24gPSBleHByLmNvbmRpdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLi5wYXJlbnQgPSBleHByOwogICAgICAgIHNlZW5Bd2FpdCA9IHNlZW5Bd2FpdCB8fCB0aGVuQXdhaXQgfHwgb3RoZXJ3aXNlQXdhaXQ7CiAgICAgIH0pOwogICAgfQoKICAgIC8vIElmIHRoZW4gb3Igb3RoZXJ3aXNlIGhhcyBlbWl0dGVkIHN0YXRlbWVudHMgd2Ugd2lsbCBwcm9kdWNlIGEgdGVtcG9yYXJ5IHQKICAgIC8vIGFuZCBlbWl0OgogICAgLy8KICAgIC8vIGlmIChbY29uZGl0aW9uXSkgewogICAgLy8gICB0ID0gW2xlZnRdOwogICAgLy8gfSBlbHNlIHsKICAgIC8vICAgdCA9IFtyaWdodF07CiAgICAvLyB9CiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGVUZW1wb3JhcnkobmFtZUluZGV4LCBleHByLnN0YXRpY1R5cGUpOwogICAgdmFyIHRoZW5Cb2R5ID0gYmxvY2tPZih0aGVuU3RhdGVtZW50cyk7CiAgICB2YXIgb3RoZXJ3aXNlQm9keSA9IGJsb2NrT2Yob3RoZXJ3aXNlU3RhdGVtZW50cyk7CiAgICB0aGVuQm9keS5hZGRTdGF0ZW1lbnQoCiAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IFZhcmlhYmxlU2V0KHJlc3VsdCwgZXhwci50aGVuKSkpOwogICAgb3RoZXJ3aXNlQm9keS5hZGRTdGF0ZW1lbnQoCiAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQobmV3IFZhcmlhYmxlU2V0KHJlc3VsdCwgZXhwci5vdGhlcndpc2UpKSk7CiAgICB2YXIgYnJhbmNoID0gbmV3IElmU3RhdGVtZW50KGV4cHIuY29uZGl0aW9uLCB0aGVuQm9keSwgb3RoZXJ3aXNlQm9keSk7CiAgICBzdGF0ZW1lbnRzLmFkZChicmFuY2gpOwoKICAgIHNlZW5Bd2FpdCA9IGZhbHNlOwogICAgYnJhbmNoLmNvbmRpdGlvbiA9IGJyYW5jaC5jb25kaXRpb24uYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gYnJhbmNoOwoKICAgICsrbmFtZUluZGV4OwogICAgc2VlbkF3YWl0ID0gc2VlbkF3YWl0IHx8IHRoZW5Bd2FpdCB8fCBvdGhlcndpc2VBd2FpdDsKICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQocmVzdWx0KTsKICB9CgogIC8vIE90aGVycy4KICBUcmVlTm9kZSB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gZXhwcikgewogICAgZmluYWwgUiA9IGNvbnRpbnVhdGlvblJld3JpdGVyOwogICAgdmFyIHNob3VsZE5hbWUgPSBzZWVuQXdhaXQ7CiAgICB2YXIgdHlwZSA9IGV4cHIuZ2V0U3RhdGljVHlwZShfc3RhdGljVHlwZUNvbnRleHQpOwogICAgRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgVmFyaWFibGVHZXQoYXN5bmNSZXN1bHQpOwogICAgaWYgKHR5cGUgaXMhIER5bmFtaWNUeXBlKSB7CiAgICAgIGludCBmaWxlT2Zmc2V0ID0gZXhwci5vcGVyYW5kLmZpbGVPZmZzZXQ7CiAgICAgIGlmIChmaWxlT2Zmc2V0ID09IFRyZWVOb2RlLm5vT2Zmc2V0KSB7CiAgICAgICAgZmlsZU9mZnNldCA9IGV4cHIuZmlsZU9mZnNldDsKICAgICAgfQogICAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICAgIHJlc3VsdCA9IG5ldyBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgY29udGludWF0aW9uUmV3cml0ZXIuaGVscGVyLnVuc2FmZUNhc3QsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltyZXN1bHRdLCB0eXBlczogPERhcnRUeXBlPlt0eXBlXSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfQoKICAgIC8vIFRoZSBzdGF0ZW1lbnRzIGFyZSBpbiByZXZlcnNlIG9yZGVyLCBzbyBuYW1lIHRoZSByZXN1bHQgZmlyc3QgaWYKICAgIC8vIG5lY2Vzc2FyeSBhbmQgdGhlbiBhZGQgdGhlIHR3byBvdGhlciBzdGF0ZW1lbnRzIGluIHJldmVyc2UuCiAgICBpZiAoc2hvdWxkTmFtZSkgcmVzdWx0ID0gbmFtZShyZXN1bHQpOwogICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICBleHByLm9wZXJhbmQsCiAgICAgIG5ldyBWYXJpYWJsZUdldChSLnRoZW5Db250aW51YXRpb25WYXJpYWJsZSksCiAgICAgIG5ldyBWYXJpYWJsZUdldChSLmNhdGNoRXJyb3JDb250aW51YXRpb25WYXJpYWJsZSksCiAgICAgIG5ldyBWYXJpYWJsZUdldChSLm5lc3RlZENsb3N1cmVWYXJpYWJsZSksCiAgICBdKTsKCiAgICAvLyBXZSBhcmUgYnVpbGRpbmcKICAgIC8vCiAgICAvLyAgICAgW3lpZWxkXSAobGV0IF8gPSBfYXdhaXRIZWxwZXIoLi4uKSBpbiBudWxsKQogICAgLy8KICAgIC8vIHRvIGVuc3VyZSB0aGF0IDphd2FpdF9qdW1wX3ZhciBhbmQgOmF3YWl0X2p1bXBfY3R4IGFyZSB1cGRhdGVkCiAgICAvLyBiZWZvcmUgX2F3YWl0SGVscGVyIGlzIGludm9rZWQgKHNlZSBCdWlsZFlpZWxkU3RhdGVtZW50IGluCiAgICAvLyBTdHJlYW1pbmdGbG93R3JhcGhCdWlsZGVyIGZvciBkZXRhaWxzIG9mIGhvdyBbeWllbGRdIGlzIHRyYW5zbGF0ZWQgdG8KICAgIC8vIElMKS4gVGhpcyBndWFyYW50ZWVzIHRoYXQgcmVjdXJzaXZlIGludm9jYXRpb24gb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24KICAgIC8vIHdvdWxkIGNvbnRpbnVlIGZyb20gdGhlIGNvcnJlY3QgImp1bXAiIHBvc2l0aW9uLiBSZWN1cnNpdmUgaW52b2NhdGlvbnMKICAgIC8vIGFyaXNlIGlmIGZ1dHVyZSB3ZSBhcmUgYXdhaXRpbmcgY29tcGxldGVzIHN5bmNocm9ub3VzbHkuIEJ1aWx0aW4gRnV0dXJlCiAgICAvLyBpbXBsZW1lbnRhdGlvbiBkb24ndCBjb21wbGV0ZSBzeW5jaHJvbm91c2x5LCBidXQgRmx1dHRlcidzCiAgICAvLyBTeW5jaHJvbm91c0Z1dHVyZSBkbyAoc2VlIGJ1ZyBodHRwOi8vZGFydGJ1Zy5jb20vMzIwOTggZm9yIG1vcmUgZGV0YWlscykuCiAgICBzdGF0ZW1lbnRzLmFkZChSLmNyZWF0ZUNvbnRpbnVhdGlvblBvaW50KG5ldyBMZXQoCiAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24obnVsbCwKICAgICAgICAgICAgaW5pdGlhbGl6ZXI6IG5ldyBTdGF0aWNJbnZvY2F0aW9uKFIuaGVscGVyLmF3YWl0SGVscGVyLCBhcmd1bWVudHMpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwci5maWxlT2Zmc2V0KSwKICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGV4cHIuZmlsZU9mZnNldCk7CgogICAgc2VlbkF3YWl0ID0gZmFsc2U7CiAgICB2YXIgaW5kZXggPSBuYW1lSW5kZXg7CiAgICBhcmd1bWVudHMucG9zaXRpb25hbFswXSA9IGV4cHIub3BlcmFuZC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpCiAgICAgIC4ucGFyZW50ID0gYXJndW1lbnRzOwoKICAgIGlmIChzaG91bGROYW1lICYmIGluZGV4ICsgMSA+IG5hbWVJbmRleCkgbmFtZUluZGV4ID0gaW5kZXggKyAxOwogICAgc2VlbkF3YWl0ID0gdHJ1ZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBUcmVlTm9kZSB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gZXhwcikgewogICAgZXhwci50cmFuc2Zvcm1DaGlsZHJlbih0aGlzKTsKICAgIHJldHVybiBleHByOwogIH0KCiAgVHJlZU5vZGUgdmlzaXRMZXQoTGV0IGV4cHIpIHsKICAgIHZhciBib2R5ID0gZXhwci5ib2R5LmFjY2VwdDxUcmVlTm9kZT4odGhpcyk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGV4cHIudmFyaWFibGU7CiAgICBpZiAoc2VlbkF3YWl0KSB7CiAgICAgIC8vIFRoZXJlIGlzIGFuIGF3YWl0IGluIHRoZSBib2R5IG9mIGBsZXQgdmFyIHggPSBpbml0aWFsaXplciBpbiBib2R5YCBvcgogICAgICAvLyB0byBpdHMgcmlnaHQuICBXZSB3aWxsIHByb2R1Y2UgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHM6CiAgICAgIC8vCiAgICAgIC8vIDxpbml0aWFsaXplcidzIHN0YXRlbWVudHM+CiAgICAgIC8vIHZhciB4ID0gPGluaXRpYWxpemVyJ3MgdmFsdWU+CiAgICAgIC8vIDxib2R5J3Mgc3RhdGVtZW50cz4KICAgICAgLy8KICAgICAgLy8gYW5kIHJldHVybiB0aGUgYm9keSdzIHZhbHVlLgogICAgICAvLwogICAgICAvLyBTbyB4IGlzIGluIHNjb3BlIGZvciBhbGwgdGhlIGJvZHkncyBzdGF0ZW1lbnRzIGFuZCB0aGUgYm9keSdzIHZhbHVlLgogICAgICAvLyBUaGlzIGhhcyB0aGUgdW5wbGVhc2FudCBjb25zZXF1ZW5jZSB0aGF0IGFsbCBsZXQtYm91bmQgdmFyaWFibGVzIHdpdGgKICAgICAgLy8gYXdhaXQgaW4gdGhlIGxldCdzIGJvZHkgd2lsbCBlbmQgdXAgaG9pc3RlZCBvdXQgb2YgdGhlIGV4cHJlc3Npb24gYW5kCiAgICAgIC8vIGFsbG9jYXRlZCB0byB0aGUgY29udGV4dCBpbiB0aGUgVk0sIGV2ZW4gaWYgdGhleSBoYXZlIG5vIHVzZXMKICAgICAgLy8gKGBsZXQgXyA9IGUwIGluIGUxYCBjYW4gYmUgdXNlZCBmb3Igc2VxdWVuY2luZyBvZiBgZTBgIGFuZCBgZTFgKS4KICAgICAgc3RhdGVtZW50cy5hZGQodmFyaWFibGUpOwogICAgICB2YXIgaW5kZXggPSBuYW1lSW5kZXg7CiAgICAgIHNlZW5Bd2FpdCA9IGZhbHNlOwogICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IHZhcmlhYmxlLmluaXRpYWxpemVyLmFjY2VwdDxUcmVlTm9kZT4odGhpcykKICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgICAvLyBUZW1wb3JhcmllcyB1c2VkIGluIHRoZSBpbml0aWFsaXplciBvciB0aGUgYm9keSBhcmUgbm90IGxpdmUgYnV0IHRoZQogICAgICAvLyB0ZW1wb3JhcnkgdXNlZCBmb3IgdGhlIGJvZHkgaXMuCiAgICAgIGlmIChpbmRleCArIDEgPiBuYW1lSW5kZXgpIG5hbWVJbmRleCA9IGluZGV4ICsgMTsKICAgICAgc2VlbkF3YWl0ID0gdHJ1ZTsKICAgICAgcmV0dXJuIGJvZHk7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgYm9keSBpbiBgbGV0IHggPSBpbml0aWFsaXplciBpbiBib2R5YCBkaWQgbm90IGNvbnRhaW4gYW4gYXdhaXQuICBXZQogICAgICAvLyBjYW4gbGVhdmUgYSBsZXQgZXhwcmVzc2lvbi4KICAgICAgcmV0dXJuIHRyYW5zZm9ybShleHByLCAoKSB7CiAgICAgICAgLy8gVGhlIGJvZHkgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2xhdGVkLgogICAgICAgIGV4cHIuYm9keSA9IGJvZHkuLnBhcmVudCA9IGV4cHI7CiAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZS5pbml0aWFsaXplci5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpCiAgICAgICAgICAuLnBhcmVudCA9IHZhcmlhYmxlOwogICAgICB9KTsKICAgIH0KICB9CgogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICB2YXIgbmVzdGVkUmV3cml0ZXIgPSBuZXcgUmVjdXJzaXZlQ29udGludWF0aW9uUmV3cml0ZXIoCiAgICAgICAgY29udGludWF0aW9uUmV3cml0ZXIuaGVscGVyLCBfc3RhdGljVHlwZUNvbnRleHQpOwogICAgcmV0dXJuIG5vZGUuYWNjZXB0KG5lc3RlZFJld3JpdGVyKTsKICB9CgogIFRyZWVOb2RlIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBleHByKSB7CiAgICByZXR1cm4gdHJhbnNmb3JtKGV4cHIsICgpIHsKICAgICAgZXhwci52YWx1ZSA9IGV4cHIudmFsdWUuYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gZXhwcjsKICAgICAgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkgPSA8U3RhdGVtZW50PltdOwogICAgICBmb3IgKFN0YXRlbWVudCBzdG10IGluIGV4cHIuYm9keS5zdGF0ZW1lbnRzLnJldmVyc2VkKSB7CiAgICAgICAgU3RhdGVtZW50IHRyYW5zbGF0aW9uID0gc3RtdC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICAgIGlmICh0cmFuc2xhdGlvbiAhPSBudWxsKSBib2R5LmFkZCh0cmFuc2xhdGlvbik7CiAgICAgIH0KICAgICAgZXhwci5ib2R5ID0gbmV3IEJsb2NrKGJvZHkucmV2ZXJzZWQudG9MaXN0KCkpLi5wYXJlbnQgPSBleHByOwogICAgfSk7CiAgfQoKICBUcmVlTm9kZSBkZWZhdWx0U3RhdGVtZW50KFN0YXRlbWVudCBzdG10KSB7CiAgICAvLyBUaGlzIG1ldGhvZCB0cmFuc2xhdGVzIGEgc3RhdGVtZW50IG5lc3RlZCBpbiBhbiBleHByZXNzaW9uIChlLmcuLCBpbiBhCiAgICAvLyBibG9jayBleHByZXNzaW9uKS4gIEl0IHByb2R1Y2VzIGEgdHJhbnNsYXRlZCBzdGF0ZW1lbnQsIGEgbGlzdCBvZgogICAgLy8gc3RhdGVtZW50cyB3aGljaCBhcmUgc2lkZSBlZmZlY3RzIG5lY2Vzc2FyeSBmb3IgYW55IGF3YWl0LCBhbmQgYSBmbGFnCiAgICAvLyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgd2FzIGFuIGF3YWl0IGluIHRoZSBzdGF0ZW1lbnQgb3IgdG8gaXRzIHJpZ2h0LgogICAgLy8gVGhlIHRyYW5zbGF0ZWQgc3RhdGVtZW50IGNhbiBiZSBudWxsIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIHdhcyBhbHJlYWR5CiAgICAvLyBhbiBhd2FpdCB0byB0aGUgcmlnaHQuCgogICAgLy8gVGhlIHRyYW5zbGF0aW9uIGlzIGFjY3VtdWxhdGluZyB0d28gbGlzdHMgb2Ygc3RhdGVtZW50cywgYW4gaW5uZXIgbGlzdAogICAgLy8gd2hpY2ggaXMgYSByZXZlcnNlZCBsaXN0IG9mIGVmZmVjdHMgbmVlZGVkIGZvciB0aGUgY3VycmVudCBleHByZXNzaW9uIGFuZAogICAgLy8gYW4gb3V0ZXIgbGlzdCB3aGljaCByZXByZXNlbnRzIHRoZSBibG9jayBjb250YWluaW5nIHRoZSBjdXJyZW50CiAgICAvLyBzdGF0ZW1lbnQuICBXZSBuZWVkIHRvIHByZXNlcnZlIGJvdGggb2YgdGhvc2UgZnJvbSBzaWRlIGVmZmVjdHMuCiAgICBMaXN0PFN0YXRlbWVudD4gc2F2ZWRJbm5lciA9IHN0YXRlbWVudHM7CiAgICBMaXN0PFN0YXRlbWVudD4gc2F2ZWRPdXRlciA9IGNvbnRpbnVhdGlvblJld3JpdGVyLnN0YXRlbWVudHM7CiAgICBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgIGNvbnRpbnVhdGlvblJld3JpdGVyLnN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgc3RtdC5hY2NlcHQoY29udGludWF0aW9uUmV3cml0ZXIpOwoKICAgIExpc3Q8U3RhdGVtZW50PiByZXN1bHRzID0gY29udGludWF0aW9uUmV3cml0ZXIuc3RhdGVtZW50czsKICAgIHN0YXRlbWVudHMgPSBzYXZlZElubmVyOwogICAgY29udGludWF0aW9uUmV3cml0ZXIuc3RhdGVtZW50cyA9IHNhdmVkT3V0ZXI7CiAgICBpZiAoIXNlZW5Bd2FpdCAmJiByZXN1bHRzLmxlbmd0aCA9PSAxKSByZXR1cm4gcmVzdWx0cy5maXJzdDsKICAgIHN0YXRlbWVudHMuYWRkQWxsKHJlc3VsdHMucmV2ZXJzZWQpOwogICAgcmV0dXJuIG51bGw7CiAgfQp9CoI9AE5OPAEmARkjHAFNOgRMBFAVBEwSLTABQQZMDQZQTE0NBk9JGgFJBk5QTlBHBk9PPQZQSTQGT05OTS4BPgZJUQ0GTEpQLgZPTR8GRkEVAU5HAS8BLi4BLjQEAUEGR1FNG0UgGxc7JxgkEwQBTidDGxwYIhcYEwQBSyYfTkoiBAFENhBOBh0EAVEeOzc9OzU7NzcBJygVGRMGEQQBTEo8OAFPIjBJGRMGEQQBTU1IOSABUD4xAUoRGwFMHxcOAU9DTVBHOhY4GAYTBAEYJiAkCAQBPj5KSDouQEAyATAgRUsIBAE8IEVLCAQBLC1IBiY3SwZROREEATogJksIBAFGICZLCAQBRCAmCAQBOiAmCAQBRCAmCAQBQCAqOk8ICAQBMCAqOkQbCAgEAS4gMUpGCAgEARM8IAFBKRcRShsgASM3HiJFLQoGAU4zBxsQHgkBUVFQOS4kEzU7RBA5RBkhGBgNIx0GTwE/PUwBF0kBESkkBAFERxIgASgXUBcfAS0XHkoXJAFBRx4iTz4KBgFREQcaFRAWCUAsNhtGIEtLHAEXUQEROiQEAQ04JCA3NiAwLSYILyUyRycjBgFIQys2FDM5MAgBFwc3B0ZCTU5OT0JRNiZPLxwnARcbQhwBRBYTBAE+IhEEASAxATIVT0QJJCcdCSYJTk9PR0sgHRlJHU4pOBgTDVElIjEpSx8KBgQBKTw6KAQBOCBFLD49OAhECAQBLk5JTU9QHgFOUUdILUIgNScBPx0yQSkRBAIBKXBhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9hc3luYy5kYXJ0TmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQtcGtnL3B1Yi9jb252ZXJ0L2xpYi9zcmMvdXRpbHMuZGFydIZYLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgY29udmVydC51dGlsczsKCmltcG9ydCAncGFja2FnZTpjaGFyY29kZS9hc2NpaS5kYXJ0JzsKCi8vLyBSZXR1cm5zIHRoZSBkaWdpdCAoMCB0aHJvdWdoIDE1KSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoZXhhZGVjaW1hbCBjb2RlIHVuaXQKLy8vIGF0IGluZGV4IFtpXSBpbiBbY29kZVVuaXRzXS4KLy8vCi8vLyBJZiB0aGUgZ2l2ZW4gY29kZSB1bml0IGlzbid0IHZhbGlkIGhleGFkZWNpbWFsLCB0aHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXS4KaW50IGRpZ2l0Rm9yQ29kZVVuaXQoTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IGluZGV4KSB7CiAgLy8gSWYgdGhlIGNvZGUgdW5pdCBpcyBhIG51bWVyYWwsIGdldCBpdHMgdmFsdWUuIFhPUiB3b3JrcyBiZWNhdXNlIDAgaW4gQVNDSUkKICAvLyBpcyBgMGIxMTAwMDBgIGFuZCB0aGUgb3RoZXIgbnVtZXJhbHMgY29tZSBhZnRlciBpdCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kCiAgLy8gdGFrZSB1cCBhdCBtb3N0IGZvdXIgYml0cy4KICAvLwogIC8vIFdlIGNoZWNrIGZvciBkaWdpdHMgZmlyc3QgYmVjYXVzZSBpdCBlbnN1cmVzIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBicmFuY2gKICAvLyBmb3IgMTAgb3V0IG9mIDE2IG9mIHRoZSBleHBlY3RlZCBjYXNlcy4gV2UgZG9uJ3QgY291bnQgdGhlIGBkaWdpdCA+PSAwYAogIC8vIGNoZWNrIGJlY2F1c2UgYnJhbmNoIHByZWRpY3Rpb24gd2lsbCBhbHdheXMgd29yayBvbiBpdCBmb3IgdmFsaWQgZGF0YS4KICB2YXIgY29kZVVuaXQgPSBjb2RlVW5pdHNbaW5kZXhdOwogIHZhciBkaWdpdCA9ICQwIF4gY29kZVVuaXQ7CiAgaWYgKGRpZ2l0IDw9IDkpIHsKICAgIGlmIChkaWdpdCA+PSAwKSByZXR1cm4gZGlnaXQ7CiAgfSBlbHNlIHsKICAgIC8vIElmIHRoZSBjb2RlIHVuaXQgaXMgYW4gdXBwZXJjYXNlIGxldHRlciwgY29udmVydCBpdCB0byBsb3dlcmNhc2UuIFRoaXMKICAgIC8vIHdvcmtzIGJlY2F1c2UgdXBwZXJjYXNlIGxldHRlcnMgaW4gQVNDSUkgYXJlIGV4YWN0bHkgYDBiMTAwMDAwID0gMHgyMGAKICAgIC8vIGxlc3MgdGhhbiBsb3dlcmNhc2UgbGV0dGVycywgc28gaWYgd2UgZW5zdXJlIHRoYXQgdGhhdCBiaXQgaXMgMSB3ZSBlbnN1cmUKICAgIC8vIHRoYXQgdGhlIGxldHRlciBpcyBsb3dlcmNhc2UuCiAgICB2YXIgbGV0dGVyID0gMHgyMCB8IGNvZGVVbml0OwogICAgaWYgKCRhIDw9IGxldHRlciAmJiBsZXR0ZXIgPD0gJGYpIHJldHVybiBsZXR0ZXIgLSAkYSArIDEwOwogIH0KCiAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgIkludmFsaWQgaGV4YWRlY2ltYWwgY29kZSB1bml0ICIKICAgICAgIlUrJHtjb2RlVW5pdC50b1JhZGl4U3RyaW5nKDE2KS5wYWRMZWZ0KDQsICcwJyl9LiIsCiAgICAgIGNvZGVVbml0cywKICAgICAgaW5kZXgpOwp9CikATk48ARcBJgFQIQRQN1BPIAVPTUwjHRQiC05OUSUiPwQBHSc6EQ4CAR5wYWNrYWdlOmNvbnZlcnQvc3JjL3V0aWxzLmRhcnRmZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL2Jhc2Uvc3ludGFjdGljX2VudGl0eS5kYXJ0gxcvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYSBzeW50YWN0aWMgZW50aXR5IChlaXRoZXIgYSB0b2tlbiBvciBhbiBBU1Qgbm9kZSkKICogd2hpY2ggaGFzIGEgbG9jYXRpb24gYW5kIGV4dGVudCBpbiB0aGUgc291cmNlIGZpbGUuCiAqLwphYnN0cmFjdCBjbGFzcyBTeW50YWN0aWNFbnRpdHkgewogIC8qKgogICAqIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZQogICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzeW50YWN0aWMgZW50aXR5LgogICAqLwogIGludCBnZXQgZW5kOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzeW50YWN0aWMgZW50aXR5J3Mgc291cmNlIHJhbmdlLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbgogICAqIHRoZSBzeW50YWN0aWMgZW50aXR5LgogICAqLwogIGludCBnZXQgb2Zmc2V0Owp9ChwATk48AQRNNwQhBlEtBg8BBk0GEgEGUBsGEgIBOnBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvYmFzZS9zeW50YWN0aWNfZW50aXR5LmRhcnRpZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvc3RyaW5nX3V0aWxpdGllcy5kYXJ0gYAvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdpbnRlcm5lci5kYXJ0JzsKCmNsYXNzIFN0cmluZ1V0aWxpdGllcyB7CiAgc3RhdGljIEludGVybmVyIElOVEVSTkVSID0gbmV3IE51bGxJbnRlcm5lcigpOwoKICBzdGF0aWMgU3RyaW5nIGludGVybihTdHJpbmcgc3RyaW5nKSA9PiBJTlRFUk5FUi5pbnRlcm4oc3RyaW5nKTsKfQoNAE5OPAEYARgxAUICAT1wYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc3RyaW5nX3V0aWxpdGllcy5kYXJ0ZmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9zY2FubmVyL2tleXdvcmRfc3RhdGUuZGFydJCZLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC5zY2FubmVyLmtleXdvcmRzOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBhcyBhbmFseXplcjsKCmltcG9ydCAnY2hhcmFjdGVycy5kYXJ0JyBzaG93ICRhLCAkeiwgJEEsICRaOwoKLyoqCiAqIEFic3RyYWN0IHN0YXRlIGluIGEgc3RhdGUgbWFjaGluZSBmb3Igc2Nhbm5pbmcga2V5d29yZHMuCiAqLwphYnN0cmFjdCBjbGFzcyBLZXl3b3JkU3RhdGUgewogIEtleXdvcmRTdGF0ZSBuZXh0KGludCBjKTsKICBLZXl3b3JkU3RhdGUgbmV4dENhcGl0YWwoaW50IGMpOwoKICBhbmFseXplci5LZXl3b3JkIGdldCBrZXl3b3JkOwoKICBzdGF0aWMgS2V5d29yZFN0YXRlIF9LRVlXT1JEX1NUQVRFOwogIHN0YXRpYyBLZXl3b3JkU3RhdGUgZ2V0IEtFWVdPUkRfU1RBVEUgewogICAgaWYgKF9LRVlXT1JEX1NUQVRFID09IG51bGwpIHsKICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgTGlzdDxTdHJpbmc+KGFuYWx5emVyLktleXdvcmQudmFsdWVzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5hbHl6ZXIuS2V5d29yZC52YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdHJpbmdzW2ldID0gYW5hbHl6ZXIuS2V5d29yZC52YWx1ZXNbaV0ubGV4ZW1lOwogICAgICB9CiAgICAgIHN0cmluZ3Muc29ydCgoYSwgYikgPT4gYS5jb21wYXJlVG8oYikpOwogICAgICBfS0VZV09SRF9TVEFURSA9IGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgwLCBzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gX0tFWVdPUkRfU1RBVEU7CiAgfQoKICBzdGF0aWMgS2V5d29yZFN0YXRlIGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgKICAgICAgaW50IHN0YXJ0LCBMaXN0PFN0cmluZz4gc3RyaW5ncywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgYm9vbCBpc0xvd2VyY2FzZSA9IHRydWU7CgogICAgTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlID0gbmV3IExpc3Q8S2V5d29yZFN0YXRlPigkeiAtICRBICsgMSk7CiAgICBhc3NlcnQobGVuZ3RoICE9IDApOwogICAgaW50IGNodW5rID0gMDsKICAgIGludCBjaHVua1N0YXJ0ID0gLTE7CiAgICBib29sIGlzTGVhZiA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChzdHJpbmdzW2ldLmxlbmd0aCA9PSBzdGFydCkgewogICAgICAgIGlzTGVhZiA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmluZ3NbaV0ubGVuZ3RoID4gc3RhcnQpIHsKICAgICAgICBpbnQgYyA9IHN0cmluZ3NbaV0uY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgaWYgKCRBIDw9IGMgJiYgYyA8PSAkWikgewogICAgICAgICAgaXNMb3dlcmNhc2UgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rICE9IGMpIHsKICAgICAgICAgIGlmIChjaHVua1N0YXJ0ICE9IC0xKSB7CiAgICAgICAgICAgIGFzc2VydCh0YWJsZVtjaHVuayAtICRBXSA9PSBudWxsKTsKICAgICAgICAgICAgdGFibGVbY2h1bmsgLSAkQV0gPSBjb21wdXRlS2V5d29yZFN0YXRlVGFibGUoCiAgICAgICAgICAgICAgICBzdGFydCArIDEsIHN0cmluZ3MsIGNodW5rU3RhcnQsIGkgLSBjaHVua1N0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICAgIGNodW5rU3RhcnQgPSBpOwogICAgICAgICAgY2h1bmsgPSBjOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNodW5rU3RhcnQgIT0gLTEpIHsKICAgICAgYXNzZXJ0KHRhYmxlW2NodW5rIC0gJEFdID09IG51bGwpOwogICAgICB0YWJsZVtjaHVuayAtICRBXSA9IGNvbXB1dGVLZXl3b3JkU3RhdGVUYWJsZSgKICAgICAgICAgIHN0YXJ0ICsgMSwgc3RyaW5ncywgY2h1bmtTdGFydCwgb2Zmc2V0ICsgbGVuZ3RoIC0gY2h1bmtTdGFydCk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQobGVuZ3RoID09IDEpOwogICAgICByZXR1cm4gbmV3IExlYWZLZXl3b3JkU3RhdGUoc3RyaW5nc1tvZmZzZXRdKTsKICAgIH0KICAgIFN0cmluZyBzeW50YXggPSBpc0xlYWYgPyBzdHJpbmdzW29mZnNldF0gOiBudWxsOwogICAgaWYgKGlzTG93ZXJjYXNlKSB7CiAgICAgIHRhYmxlID0gdGFibGUuc3VibGlzdCgkYSAtICRBKTsKICAgICAgcmV0dXJuIG5ldyBMb3dlckNhc2VBcnJheUtleXdvcmRTdGF0ZSh0YWJsZSwgc3ludGF4KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUodGFibGUsIHN5bnRheCk7CiAgICB9CiAgfQp9CgovKioKICogQSBzdGF0ZSB3aXRoIG11bHRpcGxlIG91dGdvaW5nIHRyYW5zaXRpb25zLgogKi8KYWJzdHJhY3QgY2xhc3MgQXJyYXlLZXl3b3JkU3RhdGUgaW1wbGVtZW50cyBLZXl3b3JkU3RhdGUgewogIGZpbmFsIExpc3Q8S2V5d29yZFN0YXRlPiB0YWJsZTsKICBmaW5hbCBhbmFseXplci5LZXl3b3JkIGtleXdvcmQ7CgogIEFycmF5S2V5d29yZFN0YXRlKHRoaXMudGFibGUsIFN0cmluZyBzeW50YXgpCiAgICAgIDoga2V5d29yZCA9ICgoc3ludGF4ID09IG51bGwpID8gbnVsbCA6IGFuYWx5emVyLktleXdvcmQua2V5d29yZHNbc3ludGF4XSk7CgogIEtleXdvcmRTdGF0ZSBuZXh0KGludCBjKTsKCiAgS2V5d29yZFN0YXRlIG5leHRDYXBpdGFsKGludCBjKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoIlsiKTsKICAgIGlmIChrZXl3b3JkICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIioiKTsKICAgICAgc2Iud3JpdGUoa2V5d29yZCk7CiAgICAgIHNiLndyaXRlKCIgIik7CiAgICB9CiAgICBMaXN0PEtleXdvcmRTdGF0ZT4gZm9vID0gdGFibGU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvby5sZW5ndGg7IGkrKykgewogICAgICBpZiAoZm9vW2ldICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoW2kgKyAkYV0pfTogIgogICAgICAgICAgICAiJHtmb29baV19OyAiKTsKICAgICAgfQogICAgfQogICAgc2Iud3JpdGUoIl0iKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQoKY2xhc3MgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUgZXh0ZW5kcyBBcnJheUtleXdvcmRTdGF0ZSB7CiAgTG93ZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUoTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlLCBTdHJpbmcgc3ludGF4KQogICAgICA6IHN1cGVyKHRhYmxlLCBzeW50YXgpIHsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gJHogLSAkYSArIDEpOwogIH0KCiAgS2V5d29yZFN0YXRlIG5leHQoaW50IGMpID0+IHRhYmxlW2MgLSAkYV07CgogIEtleXdvcmRTdGF0ZSBuZXh0Q2FwaXRhbChpbnQgYykgPT4gbnVsbDsKfQoKY2xhc3MgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUgZXh0ZW5kcyBBcnJheUtleXdvcmRTdGF0ZSB7CiAgVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGUoTGlzdDxLZXl3b3JkU3RhdGU+IHRhYmxlLCBTdHJpbmcgc3ludGF4KQogICAgICA6IHN1cGVyKHRhYmxlLCBzeW50YXgpIHsKICAgIGFzc2VydCh0YWJsZS5sZW5ndGggPT0gJHogLSAkQSArIDEpOwogIH0KCiAgS2V5d29yZFN0YXRlIG5leHQoaW50IGMpID0+IHRhYmxlW2MgLSAkQV07CgogIEtleXdvcmRTdGF0ZSBuZXh0Q2FwaXRhbChpbnQgYykgPT4gdGFibGVbYyAtICRBXTsKfQoKLyoqCiAqIEEgc3RhdGUgdGhhdCBoYXMgbm8gb3V0Z29pbmcgdHJhbnNpdGlvbnMuCiAqLwpjbGFzcyBMZWFmS2V5d29yZFN0YXRlIGltcGxlbWVudHMgS2V5d29yZFN0YXRlIHsKICBmaW5hbCBhbmFseXplci5LZXl3b3JkIGtleXdvcmQ7CgogIExlYWZLZXl3b3JkU3RhdGUoU3RyaW5nIHN5bnRheCkgOiBrZXl3b3JkID0gYW5hbHl6ZXIuS2V5d29yZC5rZXl3b3Jkc1tzeW50YXhdOwoKICBLZXl3b3JkU3RhdGUgbmV4dChpbnQgYykgPT4gbnVsbDsKICBLZXl3b3JkU3RhdGUgbmV4dENhcGl0YWwoaW50IGMpID0+IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpID0+IGtleXdvcmQubGV4ZW1lOwp9CoCWAE5OPAEuASEBLgEEPAQeHCMBIAEmKiJPQTgILlAGGwQBMEEdAUQZExkZNSgXCCcuIh8KGiIvOkEMGhUKCAYcKTRJDRs0BjUXJjwNPAYEAgEELwQ7IiIBL1EBHAEjARYqExsVGRUGJCscOxwIBhMaBAIBPUYfKQQBLQErAgE9Rh8pBAEtATQCAQQtBDEiAVEBJCsBJwIBOnBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9rZXl3b3JkX3N0YXRlLmRhcnRgZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvcmVjb3Zlci5kYXJ0iJYvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnNjYW5uZXIucmVjb3ZlcjsKCmltcG9ydCAndG9rZW4uZGFydCcgc2hvdyBUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICd0b2tlbl9pbXBsLmRhcnQnIHNob3cgU3RyaW5nVG9rZW47CgppbXBvcnQgJ2Vycm9yX3Rva2VuLmRhcnQnIHNob3cgRXJyb3JUb2tlbjsKCi8vLyBSZWNvdmVyIGZyb20gZXJyb3JzIGluIFt0b2tlbnNdLiBUaGUgb3JpZ2luYWwgc291cmNlcyBhcmUgcHJvdmlkZWQgYXMKLy8vIFtieXRlc10uIFtsaW5lU3RhcnRzXSBhcmUgdGhlIGJlZ2lubmluZyBjaGFyYWN0ZXIgb2Zmc2V0cyBvZiBsaW5lcywgYW5kCi8vLyBtdXN0IGJlIHVwZGF0ZWQgaWYgcmVjb3ZlcnkgaXMgcGVyZm9ybWVkIHJld3JpdGluZyB0aGUgb3JpZ2luYWwgc291cmNlCi8vLyBjb2RlLgpUb2tlbiBzY2FubmVyUmVjb3ZlcnkoTGlzdDxpbnQ+IGJ5dGVzLCBUb2tlbiB0b2tlbnMsIExpc3Q8aW50PiBsaW5lU3RhcnRzKSB7CiAgLy8gU2FuaXR5IGNoZWNrIHRoYXQgYWxsIGVycm9yIHRva2VucyBhcmUgcHJlcGVuZGVkLgoKICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHRoaXMgaW4gYSB3aGlsZSBhZnRlciB0aGUgZHVzdCBoYXMgc2V0dGxlZC4KCiAgLy8gU2tpcCBvdmVyIHByZXBlbmRlZCBlcnJvciB0b2tlbnMKICBUb2tlbiB0b2tlbiA9IHRva2VuczsKICB3aGlsZSAodG9rZW4gaXMgRXJyb3JUb2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogIH0KCiAgLy8gQXNzZXJ0IG5vIGVycm9yIHRva2VucyBpbiB0aGUgcmVtYWluaW5nIHRva2VucwogIHdoaWxlICghdG9rZW4uaXNFb2YpIHsKICAgIGlmICh0b2tlbiBpcyBFcnJvclRva2VuKSB7CiAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCAzOyArK2NvdW50KSB7CiAgICAgICAgVG9rZW4gcHJldmlvdXMgPSB0b2tlbi5wcmV2aW91czsKICAgICAgICBpZiAocHJldmlvdXMuaXNFb2YpIGJyZWFrOwogICAgICAgIHRva2VuID0gcHJldmlvdXM7CiAgICAgIH0KICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoCiAgICAgICAgICAiSW50ZXJuYWwgZXJyb3I6IEFsbCBlcnJvciB0b2tlbnMgc2hvdWxkIGhhdmUgYmVlbiBwcmVwZW5kZWQ6Iik7CiAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCA3OyArK2NvdW50KSB7CiAgICAgICAgaWYgKHRva2VuLmlzRW9mKSBicmVhazsKICAgICAgICBtc2cud3JpdGUoJyAke3Rva2VuLnJ1bnRpbWVUeXBlfSwnKTsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgdGhyb3cgbXNnLnRvU3RyaW5nKCk7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgfQoKICByZXR1cm4gdG9rZW5zOwp9CgpUb2tlbiBzeW50aGVzaXplVG9rZW4oaW50IGNoYXJPZmZzZXQsIFN0cmluZyB2YWx1ZSwgVG9rZW5UeXBlIHR5cGUpIHsKICByZXR1cm4gbmV3IFN0cmluZ1Rva2VuLmZyb21TdHJpbmcodHlwZSwgdmFsdWUsIGNoYXJPZmZzZXQpOwp9CgpUb2tlbiBza2lwVG9Fb2YoVG9rZW4gdG9rZW4pIHsKICB3aGlsZSAoIXRva2VuLmlzRW9mKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgfQogIHJldHVybiB0b2tlbjsKfQoKU3RyaW5nIGNsb3NlQnJhY2VGb3IoU3RyaW5nIG9wZW5CcmFjZSkgewogIHJldHVybiBjb25zdCB7CiAgICAnKCc6ICcpJywKICAgICdbJzogJ10nLAogICAgJ3snOiAnfScsCiAgICAnPCc6ICc+JywKICAgIHInJHsnOiAnfScsCiAgICAnPy5bJzogJ10nLAogIH1bb3BlbkJyYWNlXTsKfQoKU3RyaW5nIGNsb3NlUXVvdGVGb3IoU3RyaW5nIG9wZW5RdW90ZSkgewogIHJldHVybiBjb25zdCB7CiAgICAnIic6ICciJywKICAgICInIjogIiciLAogICAgJyIiIic6ICciIiInLAogICAgIicnJyI6ICInJyciLAogICAgJ3IiJzogJyInLAogICAgInInIjogIiciLAogICAgJ3IiIiInOiAnIiIiJywKICAgICJyJycnIjogIicnJyIsCiAgfVtvcGVuUXVvdGVdOwp9ClYATk48AS0BKwErASsBSkxLCk03AUgBJhggGAQBNBkfMCkjGggrSzAgLRwIHAYYBAERAgFGPgIBHxkYBBACASkRDg4ODhAQEAIBKREODhISDw8TExACATRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvcmVjb3Zlci5kYXJ0UWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvc3JjL2JvdW5kc19jaGVja3MuZGFydMAAV+svLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBCb3R0b21UeXBlLAogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBOZXZlclR5cGUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZhcmlhbmNlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICcuLi90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBTdWJzdGl0dXRpb24sIHN1YnN0aXR1dGU7CgppbXBvcnQgJy4uL3R5cGVfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBTdWJ0eXBlQ2hlY2tNb2RlLCBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJy4uL3V0aWwvZ3JhcGguZGFydCcgc2hvdyBHcmFwaCwgY29tcHV0ZVN0cm9uZ0NvbXBvbmVudHM7CgppbXBvcnQgJy4uL3Zpc2l0b3IuZGFydCcgc2hvdyBEYXJ0VHlwZVZpc2l0b3IsIERhcnRUeXBlVmlzaXRvcjE7CgpjbGFzcyBUeXBlVmFyaWFibGVHcmFwaCBleHRlbmRzIEdyYXBoPGludD4gewogIExpc3Q8aW50PiB2ZXJ0aWNlczsKICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOwogIExpc3Q8RGFydFR5cGU+IGJvdW5kczsKCiAgLy8gYGVkZ2VzW2ldYCBpcyB0aGUgbGlzdCBvZiBpbmRpY2VzIG9mIHR5cGUgdmFyaWFibGVzIHRoYXQgcmVmZXJlbmNlIHRoZSB0eXBlCiAgLy8gdmFyaWFibGUgd2l0aCB0aGUgaW5kZXggYGlgIGluIHRoZWlyIGJvdW5kcy4KICBMaXN0PExpc3Q8aW50Pj4gZWRnZXM7CgogIFR5cGVWYXJpYWJsZUdyYXBoKHRoaXMudHlwZVBhcmFtZXRlcnMsIHRoaXMuYm91bmRzKSB7CiAgICBhc3NlcnQodHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IGJvdW5kcy5sZW5ndGgpOwoKICAgIHZlcnRpY2VzID0gbmV3IExpc3Q8aW50Pih0eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIGludD4gdHlwZVBhcmFtZXRlckluZGljZXMgPSA8VHlwZVBhcmFtZXRlciwgaW50Pnt9OwogICAgZWRnZXMgPSBuZXcgTGlzdDxMaXN0PGludD4+KHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZlcnRpY2VzW2ldID0gaTsKICAgICAgdHlwZVBhcmFtZXRlckluZGljZXNbdHlwZVBhcmFtZXRlcnNbaV1dID0gaTsKICAgICAgZWRnZXNbaV0gPSA8aW50PltdOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3IgY29sbGVjdG9yID0KICAgICAgICAgIG5ldyBPY2N1cnJlbmNlQ29sbGVjdG9yVmlzaXRvcih0eXBlUGFyYW1ldGVycy50b1NldCgpKTsKICAgICAgY29sbGVjdG9yLnZpc2l0KGJvdW5kc1tpXSk7CiAgICAgIGZvciAoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIGluIGNvbGxlY3Rvci5vY2N1cnJlZCkgewogICAgICAgIGVkZ2VzW3R5cGVQYXJhbWV0ZXJJbmRpY2VzW3R5cGVQYXJhbWV0ZXJdXS5hZGQoaSk7CiAgICAgIH0KICAgIH0KICB9CgogIEl0ZXJhYmxlPGludD4gbmVpZ2hib3JzT2YoaW50IGluZGV4KSB7CiAgICByZXR1cm4gZWRnZXNbaW5kZXhdOwogIH0KfQoKY2xhc3MgT2NjdXJyZW5jZUNvbGxlY3RvclZpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3IgewogIGZpbmFsIFNldDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKICBTZXQ8VHlwZVBhcmFtZXRlcj4gb2NjdXJyZWQgPSBuZXcgU2V0PFR5cGVQYXJhbWV0ZXI+KCk7CgogIE9jY3VycmVuY2VDb2xsZWN0b3JWaXNpdG9yKHRoaXMudHlwZVBhcmFtZXRlcnMpOwoKICB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgdmlzaXROYW1lZFR5cGUoTmFtZWRUeXBlIG5vZGUpIHsKICAgIG5vZGUudHlwZS5hY2NlcHQodGhpcyk7CiAgfQoKICB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpOwogIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSk7CiAgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKTsKCiAgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgZm9yIChEYXJ0VHlwZSBhcmd1bWVudCBpbiBub2RlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgYXJndW1lbnQuYWNjZXB0KHRoaXMpOwogICAgfQogIH0KCiAgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICBmb3IgKERhcnRUeXBlIGFyZ3VtZW50IGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICBhcmd1bWVudC5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgZm9yIChUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kLmFjY2VwdCh0aGlzKTsKICAgICAgdHlwZVBhcmFtZXRlci5kZWZhdWx0VHlwZT8uYWNjZXB0KHRoaXMpOwogICAgfQogICAgZm9yIChEYXJ0VHlwZSBwYXJhbWV0ZXIgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBwYXJhbWV0ZXIuYWNjZXB0KHRoaXMpOwogICAgfQogICAgZm9yIChOYW1lZFR5cGUgbmFtZWRQYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgbmFtZWRQYXJhbWV0ZXIudHlwZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBub2RlLnJldHVyblR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMuY29udGFpbnMobm9kZS5wYXJhbWV0ZXIpKSB7CiAgICAgIG9jY3VycmVkLmFkZChub2RlLnBhcmFtZXRlcik7CiAgICB9CiAgfQp9CgpEYXJ0VHlwZSBpbnN0YW50aWF0ZVRvQm91bmRzKERhcnRUeXBlIHR5cGUsIENsYXNzIG9iamVjdENsYXNzKSB7CiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gdHlwZTsKICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIHR5cGUudHlwZUFyZ3VtZW50cykgewogICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyBub3QgZHluYW1pYywgd2UgYXNzdW1lIHRoYXQgdGhlCiAgICAgIC8vIHR5cGUgaXMgbm90IHJhdyBhbmQgZG9lcyBub3QgbmVlZCBpbnN0YW50aWF0aW9uIG9mIGl0cyB0eXBlIHBhcmFtZXRlcnMKICAgICAgLy8gdG8gdGhlaXIgYm91bmRzLgogICAgICBpZiAodHlwZUFyZ3VtZW50IGlzISBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUuYnlSZWZlcmVuY2UodHlwZS5jbGFzc05hbWUsIHR5cGUubnVsbGFiaWxpdHksCiAgICAgICAgY2FsY3VsYXRlQm91bmRzKHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLCBvYmplY3RDbGFzcykpOwogIH0KICBpZiAodHlwZSBpcyBUeXBlZGVmVHlwZSkgewogICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cy5pc0VtcHR5KSByZXR1cm4gdHlwZTsKICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIHR5cGUudHlwZUFyZ3VtZW50cykgewogICAgICBpZiAodHlwZUFyZ3VtZW50IGlzISBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFR5cGVkZWZUeXBlLmJ5UmVmZXJlbmNlKHR5cGUudHlwZWRlZlJlZmVyZW5jZSwgdHlwZS5udWxsYWJpbGl0eSwKICAgICAgICBjYWxjdWxhdGVCb3VuZHModHlwZS50eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVycywgb2JqZWN0Q2xhc3MpKTsKICB9CiAgcmV0dXJuIHR5cGU7Cn0KCi8vLyBDYWxjdWxhdGVzIGJvdW5kcyB0byBiZSBwcm92aWRlZCBhcyB0eXBlIGFyZ3VtZW50cyBpbiBwbGFjZSBvZiBtaXNzaW5nIHR5cGUKLy8vIGFyZ3VtZW50cyBvbiByYXcgdHlwZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBwYXJhbWV0ZXJzLgovLy8KLy8vIFNlZSB0aGUgW2Rlc2NyaXB0aW9uXQovLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2Jsb2IvbWFzdGVyL2RvY3MvbGFuZ3VhZ2UvaW5mb3JtYWwvaW5zdGFudGlhdGUtdG8tYm91bmQubWQpCi8vLyBvZiB0aGUgYWxnb3JpdGhtIGZvciBkZXRhaWxzLgpMaXN0PERhcnRUeXBlPiBjYWxjdWxhdGVCb3VuZHMoCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBDbGFzcyBvYmplY3RDbGFzcykgewogIExpc3Q8RGFydFR5cGU+IGJvdW5kcyA9IG5ldyBMaXN0PERhcnRUeXBlPih0eXBlUGFyYW1ldGVycy5sZW5ndGgpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgIERhcnRUeXBlIGJvdW5kID0gdHlwZVBhcmFtZXRlcnNbaV0uYm91bmQ7CiAgICBpZiAoYm91bmQgPT0gbnVsbCkgewogICAgICBib3VuZCA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9IGVsc2UgaWYgKGJvdW5kIGlzIEludGVyZmFjZVR5cGUgJiYgYm91bmQuY2xhc3NOb2RlID09IG9iamVjdENsYXNzKSB7CiAgICAgIERhcnRUeXBlIGRlZmF1bHRUeXBlID0gdHlwZVBhcmFtZXRlcnNbaV0uZGVmYXVsdFR5cGU7CiAgICAgIGlmICghKGRlZmF1bHRUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIGRlZmF1bHRUeXBlLmNsYXNzTm9kZSA9PSBvYmplY3RDbGFzcykpIHsKICAgICAgICBib3VuZCA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIH0KICAgIH0KICAgIGJvdW5kc1tpXSA9IGJvdW5kOwogIH0KCiAgVHlwZVZhcmlhYmxlR3JhcGggZ3JhcGggPSBuZXcgVHlwZVZhcmlhYmxlR3JhcGgodHlwZVBhcmFtZXRlcnMsIGJvdW5kcyk7CiAgTGlzdDxMaXN0PGludD4+IHN0cm9uZ2x5Q29ubmVjdGVkID0gY29tcHV0ZVN0cm9uZ0NvbXBvbmVudHMoZ3JhcGgpOwogIGZvciAoTGlzdDxpbnQ+IGNvbXBvbmVudCBpbiBzdHJvbmdseUNvbm5lY3RlZCkgewogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB1cHBlckJvdW5kcyA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57fTsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gbG93ZXJCb3VuZHMgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKGludCB0eXBlUGFyYW1ldGVySW5kZXggaW4gY29tcG9uZW50KSB7CiAgICAgIHVwcGVyQm91bmRzW3R5cGVQYXJhbWV0ZXJzW3R5cGVQYXJhbWV0ZXJJbmRleF1dID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgICAgbG93ZXJCb3VuZHNbdHlwZVBhcmFtZXRlcnNbdHlwZVBhcmFtZXRlckluZGV4XV0gPSBjb25zdCBCb3R0b21UeXBlKCk7CiAgICB9CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0KICAgICAgICBTdWJzdGl0dXRpb24uZnJvbVVwcGVyQW5kTG93ZXJCb3VuZHModXBwZXJCb3VuZHMsIGxvd2VyQm91bmRzKTsKICAgIGZvciAoaW50IHR5cGVQYXJhbWV0ZXJJbmRleCBpbiBjb21wb25lbnQpIHsKICAgICAgYm91bmRzW3R5cGVQYXJhbWV0ZXJJbmRleF0gPQogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJvdW5kc1t0eXBlUGFyYW1ldGVySW5kZXhdKTsKICAgIH0KICB9CgogIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdXBwZXJCb3VuZHMgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGxvd2VyQm91bmRzID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgdXBwZXJCb3VuZHNbdHlwZVBhcmFtZXRlcnNbaV1dID0gYm91bmRzW2ldOwogICAgbG93ZXJCb3VuZHNbdHlwZVBhcmFtZXRlcnNbaV1dID0gY29uc3QgQm90dG9tVHlwZSgpOwogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9CiAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21VcHBlckFuZExvd2VyQm91bmRzKHVwcGVyQm91bmRzLCBsb3dlckJvdW5kcyk7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7CiAgICAgIGJvdW5kc1tqXSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShib3VuZHNbal0pOwogICAgfQogIH0KCiAgcmV0dXJuIGJvdW5kczsKfQoKY2xhc3MgVHlwZUFyZ3VtZW50SXNzdWUgewogIC8vLyBUaGUgaW5kZXggZm9yIHR5cGUgYXJndW1lbnQgd2l0aGluIHRoZSBwYXNzZWQgdHlwZSBhcmd1bWVudHMuCiAgZmluYWwgaW50IGluZGV4OwoKICAvLy8gVGhlIHR5cGUgYXJndW1lbnQgdGhhdCB2aW9sYXRlZCB0aGUgYm91bmQuCiAgZmluYWwgRGFydFR5cGUgYXJndW1lbnQ7CgogIC8vLyBUaGUgdHlwZSBwYXJhbWV0ZXIgd2l0aCB0aGUgYm91bmQgdGhhdCB3YXMgdmlvbGF0ZWQuCiAgZmluYWwgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyOwoKICAvLy8gVGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSBpc3N1ZSwgdGhhdCBpcywgdGhlIG9uZSB3aXRoIFt0eXBlUGFyYW1ldGVyXS4KICBmaW5hbCBEYXJ0VHlwZSBlbmNsb3NpbmdUeXBlOwoKICBUeXBlQXJndW1lbnRJc3N1ZSgKICAgICAgdGhpcy5pbmRleCwgdGhpcy5hcmd1bWVudCwgdGhpcy50eXBlUGFyYW1ldGVyLCB0aGlzLmVuY2xvc2luZ1R5cGUpOwp9CgovLyBUT0RPKGRtaXRyeWFzKTogIFJlbW92ZSBbdHlwZWRlZkluc3RhbnRpYXRpb25zXSB3aGVuIHR5cGUgYXJndW1lbnRzIHBhc3NlZCB0bwovLyB0eXBlZGVmcyBhcmUgcHJlc2VydmVkIGluIHRoZSBLZXJuZWwgb3V0cHV0LgpMaXN0PFR5cGVBcmd1bWVudElzc3VlPiBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKAogICAgRGFydFR5cGUgdHlwZSwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgIHtib29sIGFsbG93U3VwZXJCb3VuZGVkID0gZmFsc2V9KSB7CiAgTGlzdDxUeXBlUGFyYW1ldGVyPiB2YXJpYWJsZXM7CiAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzOwogIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IHR5cGVkZWZSaHNSZXN1bHQ7CgogIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlLnR5cGVkZWZUeXBlICE9IG51bGwpIHsKICAgIC8vIFt0eXBlXSBpcyBhIGZ1bmN0aW9uIHR5cGUgdGhhdCBpcyBhbiBhcHBsaWNhdGlvbiBvZiBhIHBhcmFtZXRyaXplZAogICAgLy8gdHlwZWRlZi4gIFdlIG5lZWQgdG8gY2hlY2sgYm90aCB0aGUgbC5oLnMuIGFuZCB0aGUgci5oLnMuIG9mIHRoZQogICAgLy8gZGVmaW5pdGlvbiBpbiB0aGF0IGNhc2UuICBGb3IgZGV0YWlscywgc2VlIFtsaW5rXQogICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2Jsb2IvbWFzdGVyL2RvY3MvbGFuZ3VhZ2UvaW5mb3JtYWwvc3VwZXItYm91bmRlZC10eXBlcy5tZCkuCiAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlID0gdHlwZTsKICAgIEZ1bmN0aW9uVHlwZSBjbG9uZWQgPSBuZXcgRnVuY3Rpb25UeXBlKGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycywKICAgICAgICBmdW5jdGlvblR5cGUucmV0dXJuVHlwZSwgZnVuY3Rpb25UeXBlLm51bGxhYmlsaXR5LAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogZnVuY3Rpb25UeXBlLm5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogZnVuY3Rpb25UeXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IGZ1bmN0aW9uVHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHR5cGVkZWZUeXBlOiBudWxsKTsKICAgIHR5cGVkZWZSaHNSZXN1bHQgPSBmaW5kVHlwZUFyZ3VtZW50SXNzdWVzKGNsb25lZCwgdHlwZUVudmlyb25tZW50LAogICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgIHR5cGUgPSBmdW5jdGlvblR5cGUudHlwZWRlZlR5cGU7CiAgfQoKICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICB2YXJpYWJsZXMgPSB0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVyczsKICAgIGFyZ3VtZW50cyA9IHR5cGUudHlwZUFyZ3VtZW50czsKICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUpIHsKICAgIHZhcmlhYmxlcyA9IHR5cGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnM7CiAgICBhcmd1bWVudHMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gcmVzdWx0ID0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciBpbiB0eXBlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIHJlc3VsdC5hZGRBbGwoZmluZFR5cGVBcmd1bWVudElzc3VlcyhwYXJhbWV0ZXIuYm91bmQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSkgPz8KICAgICAgICAgIGNvbnN0IDxUeXBlQXJndW1lbnRJc3N1ZT5bXSk7CiAgICB9CiAgICBmb3IgKERhcnRUeXBlIGZvcm1hbCBpbiB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHJlc3VsdC5hZGRBbGwoZmluZFR5cGVBcmd1bWVudElzc3Vlcyhmb3JtYWwsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSkgPz8KICAgICAgICAgIGNvbnN0IDxUeXBlQXJndW1lbnRJc3N1ZT5bXSk7CiAgICB9CiAgICBmb3IgKE5hbWVkVHlwZSBuYW1lZCBpbiB0eXBlLm5hbWVkUGFyYW1ldGVycykgewogICAgICByZXN1bHQuYWRkQWxsKGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMobmFtZWQudHlwZSwgdHlwZUVudmlyb25tZW50LAogICAgICAgICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKSA/PwogICAgICAgICAgY29uc3QgPFR5cGVBcmd1bWVudElzc3VlPltdKTsKICAgIH0KICAgIHJlc3VsdC5hZGRBbGwoZmluZFR5cGVBcmd1bWVudElzc3Vlcyh0eXBlLnJldHVyblR5cGUsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICAgICAgYWxsb3dTdXBlckJvdW5kZWQ6IHRydWUpID8/CiAgICAgICAgY29uc3QgPFR5cGVBcmd1bWVudElzc3VlPltdKTsKICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSA/IG51bGwgOiByZXN1bHQ7CiAgfSBlbHNlIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgaWYgKHZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gcmVzdWx0OwogIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGFyZ3VtZW50c1Jlc3VsdDsKCiAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXAgPQogICAgICBuZXcgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPi5mcm9tSXRlcmFibGVzKHZhcmlhYmxlcywgYXJndW1lbnRzKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewogICAgRGFydFR5cGUgYXJndW1lbnQgPSBhcmd1bWVudHNbaV07CiAgICBpZiAoYXJndW1lbnQgaXMgRnVuY3Rpb25UeXBlICYmIGFyZ3VtZW50LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gR2VuZXJpYyBmdW5jdGlvbiB0eXBlcyBhcmVuJ3QgYWxsb3dlZCBhcyB0eXBlIGFyZ3VtZW50cyBlaXRoZXIuCiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShpLCBhcmd1bWVudCwgdmFyaWFibGVzW2ldLCB0eXBlKSk7CiAgICB9IGVsc2UgaWYgKCF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgYXJndW1lbnQsCiAgICAgICAgc3Vic3RpdHV0ZSh2YXJpYWJsZXNbaV0uYm91bmQsIHN1YnN0aXR1dGlvbk1hcCksCiAgICAgICAgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShpLCBhcmd1bWVudCwgdmFyaWFibGVzW2ldLCB0eXBlKSk7CiAgICB9CgogICAgTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gaXNzdWVzID0gZmluZFR5cGVBcmd1bWVudElzc3VlcygKICAgICAgICBhcmd1bWVudCwgdHlwZUVudmlyb25tZW50LAogICAgICAgIGFsbG93U3VwZXJCb3VuZGVkOiB0cnVlKTsKICAgIGlmIChpc3N1ZXMgIT0gbnVsbCkgewogICAgICBhcmd1bWVudHNSZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgYXJndW1lbnRzUmVzdWx0LmFkZEFsbChpc3N1ZXMpOwogICAgfQogIH0KICBpZiAoYXJndW1lbnRzUmVzdWx0ICE9IG51bGwpIHsKICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgcmVzdWx0LmFkZEFsbChhcmd1bWVudHNSZXN1bHQpOwogIH0KICBpZiAodHlwZWRlZlJoc1Jlc3VsdCAhPSBudWxsKSB7CiAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgIHJlc3VsdC5hZGRBbGwodHlwZWRlZlJoc1Jlc3VsdCk7CiAgfQoKICAvLyBbdHlwZV0gaXMgcmVndWxhci1ib3VuZGVkLgogIGlmIChyZXN1bHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgaWYgKCFhbGxvd1N1cGVyQm91bmRlZCkgcmV0dXJuIHJlc3VsdDsKCiAgcmVzdWx0ID0gbnVsbDsKICB0eXBlID0gY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWQodHlwZUVudmlyb25tZW50LCB0eXBlKTsKICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHNUb1JlcG9ydCA9IGFyZ3VtZW50cy50b0xpc3QoKTsKICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICB2YXJpYWJsZXMgPSB0eXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVyczsKICAgIGFyZ3VtZW50cyA9IHR5cGUudHlwZUFyZ3VtZW50czsKICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZWRlZlR5cGUpIHsKICAgIHZhcmlhYmxlcyA9IHR5cGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnM7CiAgICBhcmd1bWVudHMgPSB0eXBlLnR5cGVBcmd1bWVudHM7CiAgfQogIHN1YnN0aXR1dGlvbk1hcCA9CiAgICAgIG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+LmZyb21JdGVyYWJsZXModmFyaWFibGVzLCBhcmd1bWVudHMpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKICAgIGlmIChhcmd1bWVudCBpcyBGdW5jdGlvblR5cGUgJiYgYXJndW1lbnQudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewogICAgICAvLyBHZW5lcmljIGZ1bmN0aW9uIHR5cGVzIGFyZW4ndCBhbGxvd2VkIGFzIHR5cGUgYXJndW1lbnRzIGVpdGhlci4KICAgICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIHJlc3VsdC5hZGQoCiAgICAgICAgICBuZXcgVHlwZUFyZ3VtZW50SXNzdWUoaSwgYXJndW1lbnRzVG9SZXBvcnRbaV0sIHZhcmlhYmxlc1tpXSwgdHlwZSkpOwogICAgfSBlbHNlIGlmICghdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgIGFyZ3VtZW50LAogICAgICAgIHN1YnN0aXR1dGUodmFyaWFibGVzW2ldLmJvdW5kLCBzdWJzdGl0dXRpb25NYXApLAogICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZCgKICAgICAgICAgIG5ldyBUeXBlQXJndW1lbnRJc3N1ZShpLCBhcmd1bWVudHNUb1JlcG9ydFtpXSwgdmFyaWFibGVzW2ldLCB0eXBlKSk7CiAgICB9CiAgfQogIGlmIChhcmd1bWVudHNSZXN1bHQgIT0gbnVsbCkgewogICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICByZXN1bHQuYWRkQWxsKGFyZ3VtZW50c1Jlc3VsdCk7CiAgfQogIGlmICh0eXBlZGVmUmhzUmVzdWx0ICE9IG51bGwpIHsKICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgcmVzdWx0LmFkZEFsbCh0eXBlZGVmUmhzUmVzdWx0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8gVE9ETyhkbWl0cnlhcyk6ICBSZW1vdmUgW3R5cGVkZWZJbnN0YW50aWF0aW9uc10gd2hlbiB0eXBlIGFyZ3VtZW50cyBwYXNzZWQgdG8KLy8gdHlwZWRlZnMgYXJlIHByZXNlcnZlZCBpbiB0aGUgS2VybmVsIG91dHB1dC4KTGlzdDxUeXBlQXJndW1lbnRJc3N1ZT4gZmluZFR5cGVBcmd1bWVudElzc3Vlc0Zvckludm9jYXRpb24oCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsCiAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMsCiAgICBUeXBlRW52aXJvbm1lbnQgdHlwZUVudmlyb25tZW50LAogICAge01hcDxGdW5jdGlvblR5cGUsIExpc3Q8RGFydFR5cGU+PiB0eXBlZGVmSW5zdGFudGlhdGlvbnN9KSB7CiAgYXNzZXJ0KGFyZ3VtZW50cy5sZW5ndGggPT0gcGFyYW1ldGVycy5sZW5ndGgpOwogIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IHJlc3VsdDsKICB2YXIgc3Vic3RpdHV0aW9uTWFwID0gPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICBzdWJzdGl0dXRpb25NYXBbcGFyYW1ldGVyc1tpXV0gPSBhcmd1bWVudHNbaV07CiAgfQogIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKICAgIGlmIChhcmd1bWVudCBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiBhcmd1bWVudC5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIHJlc3VsdC5hZGQobmV3IFR5cGVBcmd1bWVudElzc3VlKGksIGFyZ3VtZW50LCBwYXJhbWV0ZXJzW2ldLCBudWxsKSk7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50IGlzIEZ1bmN0aW9uVHlwZSAmJiBhcmd1bWVudC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIEdlbmVyaWMgZnVuY3Rpb24gdHlwZXMgYXJlbid0IGFsbG93ZWQgYXMgdHlwZSBhcmd1bWVudHMgZWl0aGVyLgogICAgICByZXN1bHQgPz89IDxUeXBlQXJndW1lbnRJc3N1ZT5bXTsKICAgICAgcmVzdWx0LmFkZChuZXcgVHlwZUFyZ3VtZW50SXNzdWUoaSwgYXJndW1lbnQsIHBhcmFtZXRlcnNbaV0sIG51bGwpKTsKICAgIH0gZWxzZSBpZiAoIXR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICBhcmd1bWVudCwKICAgICAgICBzdWJzdGl0dXRlKHBhcmFtZXRlcnNbaV0uYm91bmQsIHN1YnN0aXR1dGlvbk1hcCksCiAgICAgICAgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJlc3VsdCA/Pz0gPFR5cGVBcmd1bWVudElzc3VlPltdOwogICAgICByZXN1bHQuYWRkKG5ldyBUeXBlQXJndW1lbnRJc3N1ZShpLCBhcmd1bWVudCwgcGFyYW1ldGVyc1tpXSwgbnVsbCkpOwogICAgfQoKICAgIExpc3Q8VHlwZUFyZ3VtZW50SXNzdWU+IGlzc3VlcyA9IGZpbmRUeXBlQXJndW1lbnRJc3N1ZXMoCiAgICAgICAgYXJndW1lbnQsIHR5cGVFbnZpcm9ubWVudCwKICAgICAgICBhbGxvd1N1cGVyQm91bmRlZDogdHJ1ZSk7CiAgICBpZiAoaXNzdWVzICE9IG51bGwpIHsKICAgICAgcmVzdWx0ID8/PSA8VHlwZUFyZ3VtZW50SXNzdWU+W107CiAgICAgIHJlc3VsdC5hZGRBbGwoaXNzdWVzKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKU3RyaW5nIGdldEdlbmVyaWNUeXBlTmFtZShEYXJ0VHlwZSB0eXBlKSB7CiAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgcmV0dXJuIHR5cGUuY2xhc3NOb2RlLm5hbWU7CiAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVkZWZUeXBlKSB7CiAgICByZXR1cm4gdHlwZS50eXBlZGVmTm9kZS5uYW1lOwogIH0KICByZXR1cm4gdHlwZS50b1N0cmluZygpOwp9CgovLy8gUmVwbGFjZXMgYWxsIGNvdmFyaWFudCBvY2N1cnJlbmNlcyBvZiBgZHluYW1pY2AsIGBPYmplY3RgLCBhbmQgYHZvaWRgIHdpdGgKLy8vIFtCb3R0b21UeXBlXSBhbmQgYWxsIGNvbnRyYXZhcmlhbnQgb2NjdXJyZW5jZXMgb2YgYE51bGxgIGFuZCBbQm90dG9tVHlwZV0KLy8vIHdpdGggYE9iamVjdGAuCkRhcnRUeXBlIGNvbnZlcnRTdXBlckJvdW5kZWRUb1JlZ3VsYXJCb3VuZGVkKAogICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgRGFydFR5cGUgdHlwZSwKICAgIHtib29sIGlzQ292YXJpYW50ID0gdHJ1ZX0pIHsKICBpZiAoKHR5cGUgaXMgRHluYW1pY1R5cGUgfHwKICAgICAgICAgIHR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgICAgIGlzT2JqZWN0KHR5cGVFbnZpcm9ubWVudCwgdHlwZSkpICYmCiAgICAgIGlzQ292YXJpYW50KSB7CiAgICByZXR1cm4gY29uc3QgQm90dG9tVHlwZSgpOwogIH0gZWxzZSBpZiAoKHR5cGUgaXMgQm90dG9tVHlwZSB8fCBpc051bGwodHlwZUVudmlyb25tZW50LCB0eXBlKSkgJiYKICAgICAgIWlzQ292YXJpYW50KSB7CiAgICByZXR1cm4gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5vYmplY3RMZWdhY3lSYXdUeXBlOwogIH0gZWxzZSBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgIExpc3Q8RGFydFR5cGU+IHJlcGxhY2VkVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+KHR5cGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsYWNlZFR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVwbGFjZWRUeXBlQXJndW1lbnRzW2ldID0gY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWQoCiAgICAgICAgICB0eXBlRW52aXJvbm1lbnQsIHR5cGUudHlwZUFyZ3VtZW50c1tpXSwKICAgICAgICAgIGlzQ292YXJpYW50OiBpc0NvdmFyaWFudCk7CiAgICB9CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgdHlwZS5jbGFzc05vZGUsIHR5cGUubnVsbGFiaWxpdHksIHJlcGxhY2VkVHlwZUFyZ3VtZW50cyk7CiAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVkZWZUeXBlICYmIHR5cGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgTGlzdDxEYXJ0VHlwZT4gcmVwbGFjZWRUeXBlQXJndW1lbnRzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZS50eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VkVHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICByZXBsYWNlZFR5cGVBcmd1bWVudHNbaV0gPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgdHlwZS50eXBlQXJndW1lbnRzW2ldLAogICAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZWRlZlR5cGUoCiAgICAgICAgdHlwZS50eXBlZGVmTm9kZSwgdHlwZS5udWxsYWJpbGl0eSwgcmVwbGFjZWRUeXBlQXJndW1lbnRzKTsKICB9IGVsc2UgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICB2YXIgcmVwbGFjZWRSZXR1cm5UeXBlID0gY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWQoCiAgICAgICAgdHlwZUVudmlyb25tZW50LCB0eXBlLnJldHVyblR5cGUsCiAgICAgICAgaXNDb3ZhcmlhbnQ6IGlzQ292YXJpYW50KTsKICAgIHZhciByZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcGxhY2VkUG9zaXRpb25hbFBhcmFtZXRlcnNbaV0gPSBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudCwgdHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwKICAgICAgICAgIGlzQ292YXJpYW50OiAhaXNDb3ZhcmlhbnQpOwogICAgfQogICAgdmFyIHJlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxOYW1lZFR5cGU+KHR5cGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcGxhY2VkTmFtZWRQYXJhbWV0ZXJzW2ldID0gbmV3IE5hbWVkVHlwZSgKICAgICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJzW2ldLm5hbWUsCiAgICAgICAgICBjb252ZXJ0U3VwZXJCb3VuZGVkVG9SZWd1bGFyQm91bmRlZCgKICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQsIHR5cGUubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUsCiAgICAgICAgICAgICAgaXNDb3ZhcmlhbnQ6ICFpc0NvdmFyaWFudCkpOwogICAgfQogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgcmVwbGFjZWRQb3NpdGlvbmFsUGFyYW1ldGVycywgcmVwbGFjZWRSZXR1cm5UeXBlLCB0eXBlLm51bGxhYmlsaXR5LAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogcmVwbGFjZWROYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGUudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50LAogICAgICAgIHR5cGVkZWZUeXBlOiB0eXBlLnR5cGVkZWZUeXBlKTsKICB9CiAgcmV0dXJuIHR5cGU7Cn0KCmJvb2wgaXNPYmplY3QoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgRGFydFR5cGUgdHlwZSkgewogIHJldHVybiB0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgdHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5vYmplY3RDbGFzczsKfQoKYm9vbCBpc051bGwoVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwgRGFydFR5cGUgdHlwZSkgewogIHJldHVybiB0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgdHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50Lm51bGxUeXBlLmNsYXNzTm9kZTsKfQoKaW50IGNvbXB1dGVWYXJpYW5jZShUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlIHR5cGUsCiAgICB7TWFwPFR5cGVQYXJhbWV0ZXIsIE1hcDxEYXJ0VHlwZSwgaW50Pj4gY29tcHV0ZWRWYXJpYW5jZXN9KSB7CiAgY29tcHV0ZWRWYXJpYW5jZXMgPz89IG5ldyBNYXA8VHlwZVBhcmFtZXRlciwgTWFwPERhcnRUeXBlLCBpbnQ+Pi5pZGVudGl0eSgpOwogIGNvbXB1dGVkVmFyaWFuY2VzW3R5cGVQYXJhbWV0ZXJdID8/PSBuZXcgTWFwPERhcnRUeXBlLCBpbnQ+LmlkZW50aXR5KCk7CgogIGludCB2YXJpYW5jZSA9IGNvbXB1dGVkVmFyaWFuY2VzW3R5cGVQYXJhbWV0ZXJdW3R5cGVdOwogIGlmICh2YXJpYW5jZSAhPSBudWxsKSByZXR1cm4gdmFyaWFuY2U7CiAgY29tcHV0ZWRWYXJpYW5jZXNbdHlwZVBhcmFtZXRlcl1bdHlwZV0gPSBWYXJpYW5jZUNhbGN1bGF0b3IuX3Zpc2l0TWFya2VyOwoKICByZXR1cm4gY29tcHV0ZWRWYXJpYW5jZXNbdHlwZVBhcmFtZXRlcl1bdHlwZV0gPQogICAgICB0eXBlLmFjY2VwdDEobmV3IFZhcmlhbmNlQ2FsY3VsYXRvcih0eXBlUGFyYW1ldGVyKSwgY29tcHV0ZWRWYXJpYW5jZXMpOwp9CgpjbGFzcyBWYXJpYW5jZUNhbGN1bGF0b3IKICAgIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yMTxpbnQsIE1hcDxUeXBlUGFyYW1ldGVyLCBNYXA8RGFydFR5cGUsIGludD4+PiB7CiAgZmluYWwgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyOwoKICBzdGF0aWMgY29uc3QgaW50IF92aXNpdE1hcmtlciA9IC0yOwoKICBWYXJpYW5jZUNhbGN1bGF0b3IodGhpcy50eXBlUGFyYW1ldGVyKTsKCiAgQG92ZXJyaWRlCiAgaW50IGRlZmF1bHREYXJ0VHlwZSgKICAgICAgRGFydFR5cGUgbm9kZSwgTWFwPFR5cGVQYXJhbWV0ZXIsIE1hcDxEYXJ0VHlwZSwgaW50Pj4gY29tcHV0ZWRWYXJpYW5jZXMpIHsKICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJVbmhhbmRsZWQgJHtub2RlLnJ1bnRpbWVUeXBlfSAiCiAgICAgICAgIndoZW4gY29tcHV0aW5nIHZhcmlhbmNlIG9mIGEgdHlwZSBwYXJhbWV0ZXIuIik7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgTWFwPERhcnRUeXBlLCBpbnQ+PiBjb21wdXRlZFZhcmlhbmNlcykgewogICAgaWYgKG5vZGUucGFyYW1ldGVyID09IHR5cGVQYXJhbWV0ZXIpIHJldHVybiBWYXJpYW5jZS5jb3ZhcmlhbnQ7CiAgICByZXR1cm4gVmFyaWFuY2UudW5yZWxhdGVkOwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUsCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBNYXA8RGFydFR5cGUsIGludD4+IGNvbXB1dGVkVmFyaWFuY2VzKSB7CiAgICBpbnQgcmVzdWx0ID0gVmFyaWFuY2UudW5yZWxhdGVkOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0ID0gVmFyaWFuY2UubWVldCgKICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgIFZhcmlhbmNlLmNvbWJpbmUoCiAgICAgICAgICAgICAgbm9kZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnNbaV0udmFyaWFuY2UsCiAgICAgICAgICAgICAgY29tcHV0ZVZhcmlhbmNlKHR5cGVQYXJhbWV0ZXIsIG5vZGUudHlwZUFyZ3VtZW50c1tpXSwKICAgICAgICAgICAgICAgICAgY29tcHV0ZWRWYXJpYW5jZXM6IGNvbXB1dGVkVmFyaWFuY2VzKSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGludCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUsCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBNYXA8RGFydFR5cGUsIGludD4+IGNvbXB1dGVkVmFyaWFuY2VzKSB7CiAgICBpbnQgcmVzdWx0ID0gVmFyaWFuY2UudW5yZWxhdGVkOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZWRlZiB0eXBlZGVmTm9kZSA9IG5vZGUudHlwZWRlZk5vZGU7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZWRlZlR5cGVQYXJhbWV0ZXIgPSB0eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgaWYgKGNvbXB1dGVkVmFyaWFuY2VzLmNvbnRhaW5zS2V5KHR5cGVkZWZUeXBlUGFyYW1ldGVyKSAmJgogICAgICAgICAgY29tcHV0ZWRWYXJpYW5jZXNbdHlwZWRlZlR5cGVQYXJhbWV0ZXJdW3R5cGVkZWZOb2RlLnR5cGVdID09CiAgICAgICAgICAgICAgX3Zpc2l0TWFya2VyKSB7CiAgICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlRoZSB0eXBlZGVmICcke25vZGUudHlwZWRlZk5vZGUubmFtZX0nICIKICAgICAgICAgICAgImhhcyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuIik7CiAgICAgIH0KCiAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLm1lZXQoCiAgICAgICAgICByZXN1bHQsCiAgICAgICAgICBWYXJpYW5jZS5jb21iaW5lKAogICAgICAgICAgICAgIGNvbXB1dGVWYXJpYW5jZSh0eXBlUGFyYW1ldGVyLCBub2RlLnR5cGVBcmd1bWVudHNbaV0sCiAgICAgICAgICAgICAgICAgIGNvbXB1dGVkVmFyaWFuY2VzOiBjb21wdXRlZFZhcmlhbmNlcyksCiAgICAgICAgICAgICAgY29tcHV0ZVZhcmlhbmNlKHR5cGVkZWZUeXBlUGFyYW1ldGVyLCB0eXBlZGVmTm9kZS50eXBlLAogICAgICAgICAgICAgICAgICBjb21wdXRlZFZhcmlhbmNlczogY29tcHV0ZWRWYXJpYW5jZXMpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgaW50IHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgTWFwPERhcnRUeXBlLCBpbnQ+PiBjb21wdXRlZFZhcmlhbmNlcykgewogICAgaW50IHJlc3VsdCA9IFZhcmlhbmNlLnVucmVsYXRlZDsKICAgIHJlc3VsdCA9IFZhcmlhbmNlLm1lZXQoCiAgICAgICAgcmVzdWx0LAogICAgICAgIGNvbXB1dGVWYXJpYW5jZSh0eXBlUGFyYW1ldGVyLCBub2RlLnJldHVyblR5cGUsCiAgICAgICAgICAgIGNvbXB1dGVkVmFyaWFuY2VzOiBjb21wdXRlZFZhcmlhbmNlcykpOwogICAgZm9yIChUeXBlUGFyYW1ldGVyIGZ1bmN0aW9uVHlwZVBhcmFtZXRlciBpbiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CiAgICAgIC8vIElmIFt0eXBlUGFyYW1ldGVyXSBpcyByZWZlcmVuY2VkIGluIHRoZSBib3VuZCBhdCBhbGwsIGl0IG1ha2VzIHRoZQogICAgICAvLyB2YXJpYW5jZSBvZiBbdHlwZVBhcmFtZXRlcl0gaW4gdGhlIGVudGlyZSB0eXBlIGludmFyaWFudC4gIFRoZQogICAgICAvLyBpbnZvY2F0aW9uIG9mIHRoZSB2aXNpdG9yIGJlbG93IGlzIG1hZGUgdG8gc2ltcGx5IGZpZ3VyZSBvdXQgaWYKICAgICAgLy8gW3R5cGVQYXJhbWV0ZXJdIG9jY3VycyBpbiB0aGUgYm91bmQuCiAgICAgIGlmIChjb21wdXRlVmFyaWFuY2UodHlwZVBhcmFtZXRlciwgZnVuY3Rpb25UeXBlUGFyYW1ldGVyLmJvdW5kLAogICAgICAgICAgICAgIGNvbXB1dGVkVmFyaWFuY2VzOiBjb21wdXRlZFZhcmlhbmNlcykgIT0KICAgICAgICAgIFZhcmlhbmNlLnVucmVsYXRlZCkgewogICAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLmludmFyaWFudDsKICAgICAgfQogICAgfQogICAgZm9yIChEYXJ0VHlwZSBwb3NpdGlvbmFsVHlwZSBpbiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIHJlc3VsdCA9IFZhcmlhbmNlLm1lZXQoCiAgICAgICAgICByZXN1bHQsCiAgICAgICAgICBWYXJpYW5jZS5jb21iaW5lKAogICAgICAgICAgICAgIFZhcmlhbmNlLmNvbnRyYXZhcmlhbnQsCiAgICAgICAgICAgICAgY29tcHV0ZVZhcmlhbmNlKHR5cGVQYXJhbWV0ZXIsIHBvc2l0aW9uYWxUeXBlLAogICAgICAgICAgICAgICAgICBjb21wdXRlZFZhcmlhbmNlczogY29tcHV0ZWRWYXJpYW5jZXMpKSk7CiAgICB9CiAgICBmb3IgKE5hbWVkVHlwZSBuYW1lZFR5cGUgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgcmVzdWx0ID0gVmFyaWFuY2UubWVldCgKICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgIFZhcmlhbmNlLmNvbWJpbmUoCiAgICAgICAgICAgICAgVmFyaWFuY2UuY29udHJhdmFyaWFudCwKICAgICAgICAgICAgICBjb21wdXRlVmFyaWFuY2UodHlwZVBhcmFtZXRlciwgbmFtZWRUeXBlLnR5cGUsCiAgICAgICAgICAgICAgICAgIGNvbXB1dGVkVmFyaWFuY2VzOiBjb21wdXRlZFZhcmlhbmNlcykpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSwKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIE1hcDxEYXJ0VHlwZSwgaW50Pj4gY29tcHV0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ZWFkZXIuZGFydCcgc2hvdyBUZXh0SXRlcmF0b3I7CgppbXBvcnQgJy4uL3RleHQvdGV4dF9zZXJpYWxpemVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgZGFydFR5cGVTZXJpYWxpemVyLAogICAgICAgIGV4cHJlc3Npb25TZXJpYWxpemVyLAogICAgICAgIGluaXRpYWxpemVTZXJpYWxpemVycywKICAgICAgICBzdGF0ZW1lbnRTZXJpYWxpemVyOwoKaW1wb3J0ICcuLi92aXNpdG9yLmRhcnQnIHNob3cgVmlzaXRvcjsKCmNvbnN0IFVyaSBub1VyaSA9IG51bGw7Cgpjb25zdCBpbnQgbm9PZmZzZXQgPSAtMTsKCmFic3RyYWN0IGNsYXNzIFRleHRTZXJpYWxpemF0aW9uVmVyaWZpY2F0aW9uRmFpbHVyZSB7CiAgLy8vIFtVcmldIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGV4cHJlc3Npb24gdGhhdCBwcm9kdWNlZCBhbiBlcnJvciBkdXJpbmcKICAvLy8gdGhlIHJvdW5kIHRyaXAuCiAgZmluYWwgVXJpIHVyaTsKCiAgLy8vIE9mZnNldCB3aXRoaW4gdGhlIGZpbGUgd2l0aCBbdXJpXSBvZiB0aGUgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VkIGFuIGVycm9yCiAgLy8vIGR1cmluZyB0aGUgcm91bmQgdHJpcC4KICBmaW5hbCBpbnQgb2Zmc2V0OwoKICBUZXh0U2VyaWFsaXphdGlvblZlcmlmaWNhdGlvbkZhaWx1cmUodGhpcy51cmksIHRoaXMub2Zmc2V0KTsKfQoKY2xhc3MgVGV4dFNlcmlhbGl6YXRpb25GYWlsdXJlIGV4dGVuZHMgVGV4dFNlcmlhbGl6YXRpb25WZXJpZmljYXRpb25GYWlsdXJlIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgVGV4dFNlcmlhbGl6YXRpb25GYWlsdXJlKHRoaXMubWVzc2FnZSwgVXJpIHVyaSwgaW50IG9mZnNldCkKICAgICAgOiBzdXBlcih1cmksIG9mZnNldCk7Cn0KCmNsYXNzIFRleHREZXNlcmlhbGl6YXRpb25GYWlsdXJlIGV4dGVuZHMgVGV4dFNlcmlhbGl6YXRpb25WZXJpZmljYXRpb25GYWlsdXJlIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgVGV4dERlc2VyaWFsaXphdGlvbkZhaWx1cmUodGhpcy5tZXNzYWdlLCBVcmkgdXJpLCBpbnQgb2Zmc2V0KQogICAgICA6IHN1cGVyKHVyaSwgb2Zmc2V0KTsKfQoKY2xhc3MgVGV4dFJvdW5kVHJpcEZhaWx1cmUgZXh0ZW5kcyBUZXh0U2VyaWFsaXphdGlvblZlcmlmaWNhdGlvbkZhaWx1cmUgewogIGZpbmFsIFN0cmluZyBpbml0aWFsOwogIGZpbmFsIFN0cmluZyBzZXJpYWxpemVkOwoKICBUZXh0Um91bmRUcmlwRmFpbHVyZSh0aGlzLmluaXRpYWwsIHRoaXMuc2VyaWFsaXplZCwgVXJpIHVyaSwgaW50IG9mZnNldCkKICAgICAgOiBzdXBlcih1cmksIG9mZnNldCk7Cn0KCmNsYXNzIFRleHRTZXJpYWxpemF0aW9uVmVyaWZpZXIgaW1wbGVtZW50cyBWaXNpdG9yPHZvaWQ+IHsKICAvLy8gTGlzdCBvZiBlcnJvcnMgcHJvZHVjZWQgZHVyaW5nIHJvdW5kIHRyaXBzIG9uIHRoZSB2aXNpdGVkIG5vZGVzLgogIGZpbmFsIExpc3Q8VGV4dFNlcmlhbGl6YXRpb25WZXJpZmljYXRpb25GYWlsdXJlPiBmYWlsdXJlcyA9CiAgICAgIDxUZXh0U2VyaWFsaXphdGlvblZlcmlmaWNhdGlvbkZhaWx1cmU+W107CgogIFVyaSBsYXN0U2VlblVyaSA9IG5vVXJpOwoKICBpbnQgbGFzdFNlZW5PZmZzZXQgPSBub09mZnNldDsKCiAgVGV4dFNlcmlhbGl6YXRpb25WZXJpZmllcigpIHsKICAgIGluaXRpYWxpemVTZXJpYWxpemVycygpOwogIH0KCiAgdm9pZCBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KE5vZGUgbm9kZSkgewogICAgaWYgKG5vZGUgaXMgVHJlZU5vZGUpIHsKICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBub2RlLmxvY2F0aW9uOwogICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewogICAgICAgIGxhc3RTZWVuVXJpID0gbG9jYXRpb24uZmlsZTsKICAgICAgICBsYXN0U2Vlbk9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgfQogICAgfQogIH0KCiAgVCByZWFkTm9kZTxUIGV4dGVuZHMgTm9kZT4oCiAgICAgIFN0cmluZyBpbnB1dCwgVGV4dFNlcmlhbGl6ZXI8VD4gc2VyaWFsaXplciwgVXJpIHVyaSwgaW50IG9mZnNldCkgewogICAgVGV4dEl0ZXJhdG9yIHN0cmVhbSA9IG5ldyBUZXh0SXRlcmF0b3IoaW5wdXQsIDApOwogICAgc3RyZWFtLm1vdmVOZXh0KCk7CiAgICBUIHJlc3VsdDsKICAgIHRyeSB7CiAgICAgIHJlc3VsdCA9IHNlcmlhbGl6ZXIucmVhZEZyb20oCiAgICAgICAgICBzdHJlYW0sIG5ldyBEZXNlcmlhbGl6YXRpb25TdGF0ZShudWxsLCBuZXcgQ2Fub25pY2FsTmFtZS5yb290KCkpKTsKICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICBmYWlsdXJlcy5hZGQoCiAgICAgICAgICBuZXcgVGV4dERlc2VyaWFsaXphdGlvbkZhaWx1cmUoZXhjZXB0aW9uLnRvU3RyaW5nKCksIHVyaSwgb2Zmc2V0KSk7CiAgICB9CiAgICBpZiAoc3RyZWFtLm1vdmVOZXh0KCkpIHsKICAgICAgZmFpbHVyZXMuYWRkKG5ldyBUZXh0RGVzZXJpYWxpemF0aW9uRmFpbHVyZSgKICAgICAgICAgICJ1bmV4cGVjdGVkIHRyYWlsaW5nIHRleHQiLCB1cmksIG9mZnNldCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB3cml0ZU5vZGU8VCBleHRlbmRzIE5vZGU+KAogICAgICBUIG5vZGUsIFRleHRTZXJpYWxpemVyPFQ+IHNlcmlhbGl6ZXIsIFVyaSB1cmksIGludCBvZmZzZXQpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICB0cnkgewogICAgICBzZXJpYWxpemVyLndyaXRlVG8oYnVmZmVyLCBub2RlLCBuZXcgU2VyaWFsaXphdGlvblN0YXRlKG51bGwpKTsKICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICBmYWlsdXJlcwogICAgICAgICAgLmFkZChuZXcgVGV4dFNlcmlhbGl6YXRpb25GYWlsdXJlKGV4Y2VwdGlvbi50b1N0cmluZygpLCB1cmksIG9mZnNldCkpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdm9pZCBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChFeHByZXNzaW9uIG5vZGUpIHsKICAgIFVyaSB1cmkgPSBub1VyaTsKICAgIGludCBvZmZzZXQgPSBub09mZnNldDsKICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbm9kZS5sb2NhdGlvbjsKICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CiAgICAgIHVyaSA9IGxvY2F0aW9uLmZpbGU7CiAgICAgIG9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KCiAgICBTdHJpbmcgaW5pdGlhbCA9IHdyaXRlTm9kZShub2RlLCBleHByZXNzaW9uU2VyaWFsaXplciwgdXJpLCBvZmZzZXQpOwoKICAgIC8vIERvIHRoZSByb3VuZCB0cmlwLgogICAgRXhwcmVzc2lvbiBkZXNlcmlhbGl6ZWQgPQogICAgICAgIHJlYWROb2RlKGluaXRpYWwsIGV4cHJlc3Npb25TZXJpYWxpemVyLCB1cmksIG9mZnNldCk7CiAgICBTdHJpbmcgc2VyaWFsaXplZCA9CiAgICAgICAgd3JpdGVOb2RlKGRlc2VyaWFsaXplZCwgZXhwcmVzc2lvblNlcmlhbGl6ZXIsIHVyaSwgb2Zmc2V0KTsKCiAgICBpZiAoaW5pdGlhbCAhPSBzZXJpYWxpemVkKSB7CiAgICAgIGZhaWx1cmVzLmFkZChuZXcgVGV4dFJvdW5kVHJpcEZhaWx1cmUoaW5pdGlhbCwgc2VyaWFsaXplZCwgdXJpLCBvZmZzZXQpKTsKICAgIH0KICB9CgogIHZvaWQgbWFrZURhcnRUeXBlUm91bmRUcmlwKERhcnRUeXBlIG5vZGUpIHsKICAgIFVyaSB1cmkgPSBsYXN0U2VlblVyaTsKICAgIGludCBvZmZzZXQgPSBsYXN0U2Vlbk9mZnNldDsKCiAgICBTdHJpbmcgaW5pdGlhbCA9IHdyaXRlTm9kZShub2RlLCBkYXJ0VHlwZVNlcmlhbGl6ZXIsIHVyaSwgb2Zmc2V0KTsKCiAgICAvLyBEbyB0aGUgcm91bmQgdHJpcC4KICAgIERhcnRUeXBlIGRlc2VyaWFsaXplZCA9IHJlYWROb2RlKGluaXRpYWwsIGRhcnRUeXBlU2VyaWFsaXplciwgdXJpLCBvZmZzZXQpOwogICAgU3RyaW5nIHNlcmlhbGl6ZWQgPQogICAgICAgIHdyaXRlTm9kZShkZXNlcmlhbGl6ZWQsIGRhcnRUeXBlU2VyaWFsaXplciwgdXJpLCBvZmZzZXQpOwoKICAgIGlmIChpbml0aWFsICE9IHNlcmlhbGl6ZWQpIHsKICAgICAgZmFpbHVyZXMuYWRkKG5ldyBUZXh0Um91bmRUcmlwRmFpbHVyZShpbml0aWFsLCBzZXJpYWxpemVkLCB1cmksIG9mZnNldCkpOwogICAgfQogIH0KCiAgdm9pZCBtYWtlU3RhdGVtZW50Um91bmRUcmlwKFN0YXRlbWVudCBub2RlKSB7CiAgICBVcmkgdXJpID0gbm9Vcmk7CiAgICBpbnQgb2Zmc2V0ID0gbm9PZmZzZXQ7CiAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5vZGUubG9jYXRpb247CiAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewogICAgICB1cmkgPSBsb2NhdGlvbi5maWxlOwogICAgICBvZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICB9CgogICAgU3RyaW5nIGluaXRpYWwgPSB3cml0ZU5vZGUobm9kZSwgc3RhdGVtZW50U2VyaWFsaXplciwgdXJpLCBvZmZzZXQpOwoKICAgIC8vIERvIHRoZSByb3VuZCB0cmlwLgogICAgU3RhdGVtZW50IGRlc2VyaWFsaXplZCA9CiAgICAgICAgcmVhZE5vZGUoaW5pdGlhbCwgc3RhdGVtZW50U2VyaWFsaXplciwgdXJpLCBvZmZzZXQpOwogICAgU3RyaW5nIHNlcmlhbGl6ZWQgPQogICAgICAgIHdyaXRlTm9kZShkZXNlcmlhbGl6ZWQsIGV4cHJlc3Npb25TZXJpYWxpemVyLCB1cmksIG9mZnNldCk7CgogICAgaWYgKGluaXRpYWwgIT0gc2VyaWFsaXplZCkgewogICAgICBmYWlsdXJlcy5hZGQobmV3IFRleHRSb3VuZFRyaXBGYWlsdXJlKGluaXRpYWwsIHNlcmlhbGl6ZWQsIHVyaSwgb2Zmc2V0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoImRlZmF1bHRFeHByZXNzaW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJkZWZhdWx0TWVtYmVyUmVmZXJlbmNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRDb25zdGFudChDb25zdGFudCBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiZGVmYXVsdENvbnN0YW50Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiZGVmYXVsdERhcnRUeXBlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiZGVmYXVsdFRyZWVOb2RlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHROb2RlKE5vZGUgbm9kZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoImRlZmF1bHROb2RlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRJbml0aWFsaXplcihJbml0aWFsaXplciBub2RlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiZGVmYXVsdEluaXRpYWxpemVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRNZW1iZXIoTWVtYmVyIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJkZWZhdWx0TWVtYmVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJkZWZhdWx0U3RhdGVtZW50Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRlZmF1bHRCYXNpY0xpdGVyYWwoQmFzaWNMaXRlcmFsIG5vZGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJkZWZhdWx0QmFzaWNMaXRlcmFsIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TmFtZWRUeXBlKE5hbWVkVHlwZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVydHlwZShTdXBlcnR5cGUgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROYW1lKE5hbWUgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb2NlZHVyZVJlZmVyZW5jZShQcm9jZWR1cmUgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9yUmVmZXJlbmNlKENvbnN0cnVjdG9yIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGaWVsZFJlZmVyZW5jZShGaWVsZCBub2RlKSB7fQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZShUeXBlTGl0ZXJhbENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50UmVmZXJlbmNlKFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnRSZWZlcmVuY2UoCiAgICAgIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW5jZUNvbnN0YW50UmVmZXJlbmNlKEluc3RhbmNlQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0Q29uc3RhbnRSZWZlcmVuY2UoTGlzdENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0Q29uc3RhbnRSZWZlcmVuY2UoU2V0Q29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRNYXBDb25zdGFudFJlZmVyZW5jZShNYXBDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50UmVmZXJlbmNlKFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnRSZWZlcmVuY2UoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudFJlZmVyZW5jZShEb3VibGVDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50UmVmZXJlbmNlKEludENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50UmVmZXJlbmNlKEJvb2xDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudFJlZmVyZW5jZShOdWxsQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50UmVmZXJlbmNlKFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlZGVmUmVmZXJlbmNlKFR5cGVkZWYgbm9kZSkge30KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENsYXNzUmVmZXJlbmNlKENsYXNzIG5vZGUpIHt9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlTGl0ZXJhbENvbnN0YW50KFR5cGVMaXRlcmFsQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUZWFyT2ZmQ29uc3RhbnQoVGVhck9mZkNvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudChQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdENvbnN0YW50KExpc3RDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwQ29uc3RhbnQoTWFwQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKEluc3RhbmNlQ3JlYXRpb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRGaWxlVXJpRXhwcmVzc2lvbihGaWxlVXJpRXhwcmVzc2lvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE51bGxDb25zdGFudChOdWxsQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZURhcnRUeXBlUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRGFydFR5cGVSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZURhcnRUeXBlUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZURhcnRUeXBlUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZURhcnRUeXBlUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VEYXJ0VHlwZVJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZURhcnRUeXBlUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRGFydFR5cGVSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VEYXJ0VHlwZVJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb21wb25lbnQoQ29tcG9uZW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwRW50cnkoTWFwRW50cnkgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBcmd1bWVudHMoQXJndW1lbnRzIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExpYnJhcnlQYXJ0KExpYnJhcnlQYXJ0IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29tYmluYXRvcihDb21iaW5hdG9yIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlicmFyeURlcGVuZGVuY3koTGlicmFyeURlcGVuZGVuY3kgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaWJyYXJ5KExpYnJhcnkgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXIoUmVkaXJlY3RpbmdJbml0aWFsaXplciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN1cGVySW5pdGlhbGl6ZXIoU3VwZXJJbml0aWFsaXplciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkSW5pdGlhbGl6ZXIoRmllbGRJbml0aWFsaXplciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEludmFsaWRJbml0aWFsaXplcihJbnZhbGlkSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDbGFzcyhDbGFzcyBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEV4dGVuc2lvbihFeHRlbnNpb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcihSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvciBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZpZWxkKEZpZWxkIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlU3RhdGVtZW50Um91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZVN0YXRlbWVudFJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZVN0YXRlbWVudFJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRUcnlGaW5hbGx5KFRyeUZpbmFsbHkgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VHJ5Q2F0Y2goVHJ5Q2F0Y2ggbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZVN0YXRlbWVudFJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZVN0YXRlbWVudFJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb250aW51ZVN3aXRjaFN0YXRlbWVudChDb250aW51ZVN3aXRjaFN0YXRlbWVudCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZVN0YXRlbWVudFJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlU3RhdGVtZW50Um91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlU3RhdGVtZW50Um91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RG9TdGF0ZW1lbnQoRG9TdGF0ZW1lbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGFiZWxlZFN0YXRlbWVudChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlU3RhdGVtZW50Um91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QXNzZXJ0QmxvY2soQXNzZXJ0QmxvY2sgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlU3RhdGVtZW50Um91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkKENoZWNrTGlicmFyeUlzTG9hZGVkIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMb2FkTGlicmFyeShMb2FkTGlicmFyeSBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW5zdGFudGlhdGlvbihJbnN0YW50aWF0aW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRCbG9ja0V4cHJlc3Npb24oQmxvY2tFeHByZXNzaW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERvdWJsZUxpdGVyYWwoRG91YmxlTGl0ZXJhbCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0SW50TGl0ZXJhbChJbnRMaXRlcmFsIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhyb3coVGhyb3cgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFJldGhyb3coUmV0aHJvdyBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TWFwQ29uY2F0ZW5hdGlvbihNYXBDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDb25kaXRpb25hbEV4cHJlc3Npb24oQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Tm90KE5vdCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0TnVsbENoZWNrKE51bGxDaGVjayBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RNZXRob2RJbnZvY2F0aW9uKERpcmVjdE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljU2V0KFN0YXRpY1NldCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgbm9kZSkgewogICAgc3RvcmVMYXN0U2VlblVyaUFuZE9mZnNldChub2RlKTsKICAgIG1ha2VFeHByZXNzaW9uUm91bmRUcmlwKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXQobm9kZSk7CiAgICBtYWtlRXhwcmVzc2lvblJvdW5kVHJpcChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRWYXJpYWJsZVNldChWYXJpYWJsZVNldCBub2RlKSB7CiAgICBzdG9yZUxhc3RTZWVuVXJpQW5kT2Zmc2V0KG5vZGUpOwogICAgbWFrZUV4cHJlc3Npb25Sb3VuZFRyaXAobm9kZSk7CiAg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ZTsKCABOTjwBTCMBJnBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL2NvbW1vbi5kYXJ0ZWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2RpbGwvZGlsbF9tZW1iZXJfYnVpbGRlci5kYXJ0keQvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5kaWxsX21lbWJlcl9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgQ29uc3RydWN0b3IsIEZpZWxkLCBNZW1iZXIsIFByb2NlZHVyZSwgUHJvY2VkdXJlS2luZDsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyOwppbXBvcnQgJy4uL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0JwogICAgc2hvdyBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb247CgppbXBvcnQgJy4uL21vZGlmaWVyLmRhcnQnCiAgICBzaG93IGFic3RyYWN0TWFzaywgY29uc3RNYXNrLCBleHRlcm5hbE1hc2ssIGZpbmFsTWFzaywgbGF0ZU1hc2ssIHN0YXRpY01hc2s7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKY2xhc3MgRGlsbE1lbWJlckJ1aWxkZXIgZXh0ZW5kcyBNZW1iZXJCdWlsZGVySW1wbCB7CiAgZmluYWwgaW50IG1vZGlmaWVyczsKCiAgZmluYWwgTWVtYmVyIG1lbWJlcjsKCiAgRGlsbE1lbWJlckJ1aWxkZXIoTWVtYmVyIG1lbWJlciwgQnVpbGRlciBwYXJlbnQpCiAgICAgIDogbW9kaWZpZXJzID0gY29tcHV0ZU1vZGlmaWVycyhtZW1iZXIpLAogICAgICAgIG1lbWJlciA9IG1lbWJlciwKICAgICAgICBzdXBlcihwYXJlbnQsIG1lbWJlci5maWxlT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkRpbGxNZW1iZXJCdWlsZGVyIjsKCiAgU3RyaW5nIGdldCBuYW1lID0+IG1lbWJlci5uYW1lLm5hbWU7CgogIGJvb2wgZ2V0IGlzQ29uc3RydWN0b3IgPT4gbWVtYmVyIGlzIENvbnN0cnVjdG9yOwoKICBQcm9jZWR1cmVLaW5kIGdldCBraW5kIHsKICAgIGZpbmFsIE1lbWJlciBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIHJldHVybiBtZW1iZXIgaXMgUHJvY2VkdXJlID8gbWVtYmVyLmtpbmQgOiBudWxsOwogIH0KCiAgYm9vbCBnZXQgaXNSZWd1bGFyTWV0aG9kID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLk1ldGhvZCwga2luZCk7CgogIGJvb2wgZ2V0IGlzR2V0dGVyID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLkdldHRlciwga2luZCk7CgogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IGlkZW50aWNhbChQcm9jZWR1cmVLaW5kLlNldHRlciwga2luZCk7CgogIGJvb2wgZ2V0IGlzT3BlcmF0b3IgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuT3BlcmF0b3IsIGtpbmQpOwoKICBib29sIGdldCBpc0ZhY3RvcnkgPT4gaWRlbnRpY2FsKFByb2NlZHVyZUtpbmQuRmFjdG9yeSwga2luZCk7CgogIGJvb2wgZ2V0IGlzUmVkaXJlY3RpbmdHZW5lcmF0aXZlQ29uc3RydWN0b3IgewogICAgcmV0dXJuIGlzQ29uc3RydWN0b3IgJiYKICAgICAgICBpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb24obWVtYmVyKTsKICB9CgogIGJvb2wgZ2V0IGlzU3ludGhldGljIHsKICAgIGZpbmFsIE1lbWJlciBtZW1iZXIgPSB0aGlzLm1lbWJlcjsKICAgIHJldHVybiBtZW1iZXIgaXMgQ29uc3RydWN0b3IgJiYgbWVtYmVyLmlzU3ludGhldGljOwogIH0KCiAgYm9vbCBnZXQgaXNGaWVsZCA9PiBtZW1iZXIgaXMgRmllbGQ7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSA9PiBtZW1iZXIgaXMgRmllbGQgJiYgbWVtYmVyLmhhc1NldHRlcjsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCByZWFkVGFyZ2V0IHsKICAgIGlmIChpc0ZpZWxkKSB7CiAgICAgIHJldHVybiBtZW1iZXI7CiAgICB9IGVsc2UgaWYgKGlzQ29uc3RydWN0b3IpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgICByZXR1cm4gbWVtYmVyOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhyb3cgdW5oYW5kbGVkKCdQcm9jZWR1cmVLaW5kJywgJyRraW5kJywgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IHdyaXRlVGFyZ2V0IHsKICAgIGlmIChpc0ZpZWxkKSB7CiAgICAgIHJldHVybiBpc0Fzc2lnbmFibGUgPyBtZW1iZXIgOiBudWxsOwogICAgfSBlbHNlIGlmIChpc0NvbnN0cnVjdG9yKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgcmV0dXJuIG1lbWJlcjsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuRmFjdG9yeToKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRocm93IHVuaGFuZGxlZCgnUHJvY2VkdXJlS2luZCcsICcka2luZCcsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCBpbnZva2VUYXJnZXQgewogICAgaWYgKGlzRmllbGQpIHsKICAgICAgcmV0dXJuIG1lbWJlcjsKICAgIH0gZWxzZSBpZiAoaXNDb25zdHJ1Y3RvcikgewogICAgICByZXR1cm4gbWVtYmVyOwogICAgfQogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkZhY3Rvcnk6CiAgICAgICAgcmV0dXJuIG1lbWJlcjsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRocm93IHVuaGFuZGxlZCgnUHJvY2VkdXJlS2luZCcsICcka2luZCcsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBidWlsZE1lbWJlcnMoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIHZvaWQgRnVuY3Rpb24oTWVtYmVyLCBCdWlsdE1lbWJlcktpbmQpIGYpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdEaWxsTWVtYmVyQnVpbGRlci5idWlsZE1lbWJlcnMnKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8Q2xhc3NNZW1iZXI+IGdldCBsb2NhbE1lbWJlcnMgPT4KICAgICAgaXNTZXR0ZXIgPyBjb25zdCA8Q2xhc3NNZW1iZXI+W10gOiA8Q2xhc3NNZW1iZXI+W3RoaXNdOwoKICBAb3ZlcnJpZGUKICBMaXN0PENsYXNzTWVtYmVyPiBnZXQgbG9jYWxTZXR0ZXJzID0+CiAgICAgIGlzU2V0dGVyID8gPENsYXNzTWVtYmVyPlt0aGlzXSA6IGNvbnN0IDxDbGFzc01lbWJlcj5bXTsKfQoKaW50IGNvbXB1dGVNb2RpZmllcnMoTWVtYmVyIG1lbWJlcikgewogIGludCBtb2RpZmllciA9IG1lbWJlci5pc0Fic3RyYWN0ID8gYWJzdHJhY3RNYXNrIDogMDsKICBtb2RpZmllciB8PSBtZW1iZXIuaXNFeHRlcm5hbCA/IGV4dGVybmFsTWFzayA6IDA7CiAgaWYgKG1lbWJlciBpcyBGaWVsZCkgewogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzQ29uc3QgPyBjb25zdE1hc2sgOiAwOwogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzRmluYWwgPyBmaW5hbE1hc2sgOiAwOwogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzTGF0ZSA/IGxhdGVNYXNrIDogMDsKICAgIG1vZGlmaWVyIHw9IG1lbWJlci5pc1N0YXRpYyA/IHN0YXRpY01hc2sgOiAwOwogIH0gZWxzZSBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzQ29uc3QgPyBjb25zdE1hc2sgOiAwOwogICAgbW9kaWZpZXIgfD0gbWVtYmVyLmlzU3RhdGljID8gc3RhdGljTWFzayA6IDA7CiAgfSBlbHNlIGlmIChtZW1iZXIgaXMgQ29uc3RydWN0b3IpIHsKICAgIG1vZGlmaWVyIHw9IG1lbWJlci5pc0NvbnN0ID8gY29uc3RNYXNrIDogMDsKICB9IGVsc2UgewogICAgZHluYW1pYyBwYXJlbnQgPSBtZW1iZXIucGFyZW50OwogICAgdW5oYW5kbGVkKCIke21lbWJlci5ydW50aW1lVHlwZX0iLCAiY29tcHV0ZU1vZGlmaWVycyIsIG1lbWJlci5maWxlT2Zmc2V0LAogICAgICAgIFVyaS5iYXNlLnJlc29sdmUocGFyZW50LmZpbGVVcmkpKTsKICB9CiAgcmV0dXJuIG1vZGlmaWVyOwp9CoCiAE5OPAEjASE/ASIpKgFCJzsBGlEBKgE0FwEXATMuGSoBLwEnATMBGyc1BAFFAT4BPgFCAUABMBxCBAEZJzgEAScBDEABDBoTFSATBhQhIRcjISIVBkQEAQwbEysgEwYUIRchISMiFQZEBAEMHBMVIBUGFCEhIyIXIRUGRAQBDBVKQgQBDCg+AQwoPgIBJjc0GTAwLjIkMDImMAskTisEEwIBOXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfbWVtYmVyX2J1aWxkZXIuZGFydFlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdHlwZXMuZGFydMAAfuQvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50eXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQm90dG9tVHlwZSwKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBJbnZhbGlkVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBOZXZlclR5cGUsCiAgICAgICAgTnVsbGFiaWxpdHksCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWYXJpYW5jZSwKICAgICAgICBWb2lkVHlwZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnCiAgICBzaG93IFN1YnN0aXR1dGlvbiwgY29tYmluZU51bGxhYmlsaXRpZXNGb3JTdWJzdGl0dXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9mdXR1cmVfb3IuZGFydCc7CgppbXBvcnQgJ2tlcm5lbF9idWlsZGVyLmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyOwoKY2xhc3MgVHlwZXMgaW1wbGVtZW50cyBTdWJ0eXBlVGVzdGVyIHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5OwoKICBUeXBlcyh0aGlzLmhpZXJhcmNoeSk7CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW3NdIGlzIGEgc3VidHlwZSBvZiBbdF0uCiAgYm9vbCBpc1N1YnR5cGVPZktlcm5lbChEYXJ0VHlwZSBzLCBEYXJ0VHlwZSB0LCBTdWJ0eXBlQ2hlY2tNb2RlIG1vZGUpIHsKICAgIElzU3VidHlwZU9mIHJlc3VsdCA9IHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHMsIHQpOwogICAgc3dpdGNoIChtb2RlKSB7CiAgICAgIGNhc2UgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllczoKICAgICAgICByZXR1cm4gcmVzdWx0LmlzU3VidHlwZVdoZW5Vc2luZ051bGxhYmlsaXRpZXMoKTsKICAgICAgY2FzZSBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllczoKICAgICAgICByZXR1cm4gcmVzdWx0LmlzU3VidHlwZVdoZW5JZ25vcmluZ051bGxhYmlsaXRpZXMoKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiVW5oYW5kbGVkIHN1YnR5cGUgY2hlY2tpbmcgbW9kZSAnJG1vZGUnIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhEYXJ0VHlwZSBzLCBEYXJ0VHlwZSB0KSB7CiAgICBpZiAocyBpcyBCb3R0b21UeXBlKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsgLy8gUnVsZSAzLgogICAgfQogICAgaWYgKHQgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLmFsd2F5cygpOyAvLyBSdWxlIDIuCiAgICB9CiAgICBpZiAodCBpcyBWb2lkVHlwZSkgewogICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7IC8vIFJ1bGUgMi4KICAgIH0KICAgIGlmICh0IGlzIEJvdHRvbVR5cGUpIHsKICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICB9CiAgICBpZiAocyBpcyBOZXZlclR5cGUpIHsKICAgICAgcmV0dXJuIG5ldyBJc1N1YnR5cGVPZi5iYXNlZFNvbGVseU9uTnVsbGFiaWxpdGllcyhzLCB0KTsKICAgIH0KCiAgICAvLyBUT0RPKGRtaXRyeWFzKTogUmVtb3ZlIEludmFsaWRUeXBlIGZyb20gc3VidHlwZSByZWxhdGlvbi4KICAgIGlmIChzIGlzIEludmFsaWRUeXBlKSB7CiAgICAgIC8vIEludmFsaWRUeXBlIGlzIGEgYm90dG9tIHR5cGUuCiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgIH0KICAgIGlmICh0IGlzIEludmFsaWRUeXBlKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgfQoKICAgIGlmICh0IGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgQ2xhc3MgY2xzID0gdC5jbGFzc05vZGU7CiAgICAgIGlmIChjbHMgPT0gaGllcmFyY2h5Lm9iamVjdENsYXNzICYmCiAgICAgICAgICAhKHMgaXMgSW50ZXJmYWNlVHlwZSAmJiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JDbGFzcykpIHsKICAgICAgICByZXR1cm4gbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpOwogICAgICB9CiAgICAgIGlmIChjbHMgPT0gaGllcmFyY2h5LmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICBjb25zdCBJc0Z1dHVyZU9yU3VidHlwZU9mIHJlbGF0aW9uID0gY29uc3QgSXNGdXR1cmVPclN1YnR5cGVPZigpOwogICAgICAgIGlmIChzIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNEeW5hbWljUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1ZvaWRSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yQ2xhc3MKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzRnV0dXJlT3JSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyZmFjZVJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRnVuY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyc2VjdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgSXNJbnRlcmZhY2VTdWJ0eXBlT2YgcmVsYXRpb24gPSBjb25zdCBJc0ludGVyZmFjZVN1YnR5cGVPZigpOwogICAgICAgIGlmIChzIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNEeW5hbWljUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1ZvaWRSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yQ2xhc3MKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzRnV0dXJlT3JSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyZmFjZVJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRnVuY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyc2VjdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodCBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgY29uc3QgSXNGdW5jdGlvblN1YnR5cGVPZiByZWxhdGlvbiA9IGNvbnN0IElzRnVuY3Rpb25TdWJ0eXBlT2YoKTsKICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNEeW5hbWljUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFZvaWRUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgcmV0dXJuIHMuY2xhc3NOb2RlID09IGhpZXJhcmNoeS5mdXR1cmVPckNsYXNzCiAgICAgICAgICAgID8gcmVsYXRpb24uaXNGdXR1cmVPclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyZmFjZVJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICAgIHJldHVybiBzLnByb21vdGVkQm91bmQgPT0gbnVsbAogICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgOiByZWxhdGlvbi5pc0ludGVyc2VjdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0gZWxzZSBpZiAocyBpcyBUeXBlZGVmVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc1R5cGVkZWZSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHQgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgaWYgKHQucHJvbW90ZWRCb3VuZCA9PSBudWxsKSB7CiAgICAgICAgY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mIHJlbGF0aW9uID0KICAgICAgICAgICAgY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCk7CiAgICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JDbGFzcwogICAgICAgICAgICAgID8gcmVsYXRpb24uaXNGdXR1cmVPclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1R5cGVkZWZSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBJc0ludGVyc2VjdGlvblN1YnR5cGVPZiByZWxhdGlvbiA9CiAgICAgICAgICAgIGNvbnN0IElzSW50ZXJzZWN0aW9uU3VidHlwZU9mKCk7CiAgICAgICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSBpZiAocyBpcyBWb2lkVHlwZSkgewogICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVm9pZFJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIHJldHVybiBzLmNsYXNzTm9kZSA9PSBoaWVyYXJjaHkuZnV0dXJlT3JDbGFzcwogICAgICAgICAgICAgID8gcmVsYXRpb24uaXNGdXR1cmVPclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNGdW5jdGlvblJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgICA/IHJlbGF0aW9uLmlzVHlwZVBhcmFtZXRlclJlbGF0ZWQocywgdCwgdGhpcykKICAgICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pc1R5cGVkZWZSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0IGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgIGNvbnN0IElzVHlwZWRlZlN1YnR5cGVPZiByZWxhdGlvbiA9IGNvbnN0IElzVHlwZWRlZlN1YnR5cGVPZigpOwogICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNWb2lkUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gcy5jbGFzc05vZGUgPT0gaGllcmFyY2h5LmZ1dHVyZU9yQ2xhc3MKICAgICAgICAgICAgPyByZWxhdGlvbi5pc0Z1dHVyZU9yUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJmYWNlUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0Z1bmN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICAgcmV0dXJuIHMucHJvbW90ZWRCb3VuZCA9PSBudWxsCiAgICAgICAgICAgID8gcmVsYXRpb24uaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChzLCB0LCB0aGlzKQogICAgICAgICAgICA6IHJlbGF0aW9uLmlzSW50ZXJzZWN0aW9uUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIFR5cGVkZWZUeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzVHlwZWRlZlJlbGF0ZWQocywgdCwgdGhpcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodCBpcyBOZXZlclR5cGUpIHsKICAgICAgY29uc3QgSXNOZXZlclR5cGVTdWJ0eXBlT2YgcmVsYXRpb24gPSBjb25zdCBJc05ldmVyVHlwZVN1YnR5cGVPZigpOwogICAgICBpZiAocyBpcyBEeW5hbWljVHlwZSkgewogICAgICAgIHJldHVybiByZWxhdGlvbi5pc0R5bmFtaWNSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVm9pZFR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNWb2lkUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfSBlbHNlIGlmIChzIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNJbnRlcmZhY2VSZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmlzRnVuY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgICByZXR1cm4gcy5wcm9tb3RlZEJvdW5kID09IG51bGwKICAgICAgICAgICAgPyByZWxhdGlvbi5pc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKHMsIHQsIHRoaXMpCiAgICAgICAgICAgIDogcmVsYXRpb24uaXNJbnRlcnNlY3Rpb25SZWxhdGVkKHMsIHQsIHRoaXMpOwogICAgICB9IGVsc2UgaWYgKHMgaXMgVHlwZWRlZlR5cGUpIHsKICAgICAgICByZXR1cm4gcmVsYXRpb24uaXNUeXBlZGVmUmVsYXRlZChzLCB0LCB0aGlzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0eXBlOiAke3QucnVudGltZVR5cGV9IjsKICAgIH0KICAgIHRocm93ICJVbmhhbmRsZWQgdHlwZSBjb21iaW5hdGlvbjogJHt0LnJ1bnRpbWVUeXBlfSAke3MucnVudGltZVR5cGV9IjsKICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgYWxsIHR5cGUgYXJndW1lbnRzIGluIFtzXSBhbmQgW3RdIHBhaXJ3aXNlIGFyZSBzdWJ0eXBlcwogIC8vLyB3aXRoIHJlc3BlY3QgdG8gdGhlIHZhcmlhbmNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIFtwXSB0eXBlIHBhcmFtZXRlci4KICBJc1N1YnR5cGVPZiBhcmVUeXBlQXJndW1lbnRzT2ZTdWJ0eXBlS2VybmVsKAogICAgICBMaXN0PERhcnRUeXBlPiBzLCBMaXN0PERhcnRUeXBlPiB0LCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHApIHsKICAgIGlmIChzLmxlbmd0aCAhPSB0Lmxlbmd0aCB8fCBzLmxlbmd0aCAhPSBwLmxlbmd0aCkgewogICAgICB0aHJvdyAiTnVtYmVycyBvZiB0eXBlIGFyZ3VtZW50cyBkb24ndCBtYXRjaCAkcyAkdCB3aXRoIHBhcmFtZXRlcnMgJHAuIjsKICAgIH0KICAgIElzU3VidHlwZU9mIHJlc3VsdCA9IGNvbnN0IElzU3VidHlwZU9mLmFsd2F5cygpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCB2YXJpYW5jZSA9IHBbaV0udmFyaWFuY2U7CiAgICAgIGlmICh2YXJpYW5jZSA9PSBWYXJpYW5jZS5jb250cmF2YXJpYW50KSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZChwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayh0W2ldLCBzW2ldKSk7CiAgICAgICAgaWYgKCFyZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodmFyaWFuY2UgPT0gVmFyaWFuY2UuaW52YXJpYW50KSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZChpc1NhbWVUeXBlS2VybmVsKHNbaV0sIHRbaV0pKTsKICAgICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQuYW5kKHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHNbaV0sIHRbaV0pKTsKICAgICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIElzU3VidHlwZU9mIGlzU2FtZVR5cGVLZXJuZWwoRGFydFR5cGUgcywgRGFydFR5cGUgdCkgewogICAgcmV0dXJuIHBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHMsIHQpCiAgICAgICAgLmFuZFN1YnR5cGVDaGVja0Zvcih0LCBzLCB0aGlzKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNTdWJ0eXBlT2YoCiAgICAgIERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSwgU3VidHlwZUNoZWNrTW9kZSBtb2RlKSB7CiAgICByZXR1cm4gaXNTdWJ0eXBlT2ZLZXJuZWwoc3VidHlwZSwgc3VwZXJ0eXBlLCBtb2RlKTsKICB9CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdXR1cmVPckNsYXNzID0+IGhpZXJhcmNoeS5jb3JlVHlwZXMuZnV0dXJlT3JDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IGZ1bmN0aW9uQ2xhc3MgPT4gaGllcmFyY2h5LmNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzOwoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldCBmdW5jdGlvbkxlZ2FjeVJhd1R5cGUgPT4KICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcy5mdW5jdGlvbkxlZ2FjeVJhd1R5cGU7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZnV0dXJlVHlwZShEYXJ0VHlwZSB0eXBlLCBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgIGhpZXJhcmNoeS5jb3JlVHlwZXMuZnV0dXJlQ2xhc3MsIG51bGxhYmlsaXR5LCA8RGFydFR5cGU+W3R5cGVdKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MsCiAgICAgIExpYnJhcnkgY2xpZW50TGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgcmV0dXJuIGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MsIGNsaWVudExpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZigKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKSB7CiAgICByZXR1cm4gaGllcmFyY2h5LmdldEtlcm5lbFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVG9wKERhcnRUeXBlIHR5cGUpIHsKICAgIHJldHVybiB0eXBlIGlzIER5bmFtaWNUeXBlIHx8CiAgICAgICAgdHlwZSBpcyBWb2lkVHlwZSB8fAogICAgICAgIHR5cGUgPT0gb2JqZWN0TGVnYWN5UmF3VHlwZSB8fAogICAgICAgIHR5cGUgPT0gb2JqZWN0TnVsbGFibGVSYXdUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBnZXQgbnVsbFR5cGUgPT4gaGllcmFyY2h5LmNvcmVUeXBlcy5udWxsVHlwZTsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG9iamVjdENsYXNzID0+IGhpZXJhcmNoeS5jb3JlVHlwZXMub2JqZWN0Q2xhc3M7CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdExlZ2FjeVJhd1R5cGUgewogICAgcmV0dXJuIGhpZXJhcmNoeS5jb3JlVHlwZXMub2JqZWN0TGVnYWN5UmF3VHlwZTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdE51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gaGllcmFyY2h5LmNvcmVUeXBlcy5vYmplY3ROdWxsYWJsZVJhd1R5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZU11dHVhbFN1YnR5cGVzQ2hlY2soCiAgICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMikgewogICAgcmV0dXJuIGlzU2FtZVR5cGVLZXJuZWwodHlwZTEsIHR5cGUyKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIFR5cGVSZWxhdGlvbjxUIGV4dGVuZHMgRGFydFR5cGU+IHsKICBjb25zdCBUeXBlUmVsYXRpb24oKTsKCiAgSXNTdWJ0eXBlT2YgaXNEeW5hbWljUmVsYXRlZChEeW5hbWljVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgSXNTdWJ0eXBlT2YgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgSXNTdWJ0eXBlT2YgaXNJbnRlcmZhY2VSZWxhdGVkKEludGVyZmFjZVR5cGUgcywgVCB0LCBUeXBlcyB0eXBlcyk7CgogIElzU3VidHlwZU9mIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgSXNTdWJ0eXBlT2YgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIFQgdCwgVHlwZXMgdHlwZXMpOwoKICBJc1N1YnR5cGVPZiBpc0Z1dHVyZU9yUmVsYXRlZChJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgSXNTdWJ0eXBlT2YgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChUeXBlUGFyYW1ldGVyVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKCiAgSXNTdWJ0eXBlT2YgaXNUeXBlZGVmUmVsYXRlZChUeXBlZGVmVHlwZSBzLCBUIHQsIFR5cGVzIHR5cGVzKTsKfQoKY2xhc3MgSXNJbnRlcmZhY2VTdWJ0eXBlT2YgZXh0ZW5kcyBUeXBlUmVsYXRpb248SW50ZXJmYWNlVHlwZT4gewogIGNvbnN0IElzSW50ZXJmYWNlU3VidHlwZU9mKCk7CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBzLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBpZiAocy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxDbGFzcykgewogICAgICAvLyBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiwgdG8gYXZvaWQgaW5zdGFudGlhdGluZyB1bm5lY2Vzc2FyeSB0eXBlCiAgICAgIC8vIGFyZ3VtZW50cyBpbiBnZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mLgogICAgICByZXR1cm4gbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gYXNTdXBlcnR5cGVBcmd1bWVudHMgPQogICAgICAgIHR5cGVzLmhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKHMsIHQuY2xhc3NOb2RlKTsKICAgIGlmIChhc1N1cGVydHlwZUFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgfQogICAgcmV0dXJuIHR5cGVzCiAgICAgICAgLmFyZVR5cGVBcmd1bWVudHNPZlN1YnR5cGVLZXJuZWwoCiAgICAgICAgICAgIGFzU3VwZXJ0eXBlQXJndW1lbnRzLCB0LnR5cGVBcmd1bWVudHMsIHQuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzKQogICAgICAgIC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHMsIEludGVyZmFjZVR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcwogICAgICAgIC5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLnBhcmFtZXRlci5ib3VuZCwgdCkKICAgICAgICAuYW5kKG5ldyBJc1N1YnR5cGVPZi5iYXNlZFNvbGVseU9uTnVsbGFiaWxpdGllcyhzLCB0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgSW50ZXJmYWNlVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzID0gZnV0dXJlT3IudHlwZUFyZ3VtZW50czsKICAgIC8vIFJ1bGVzIDcuMSBhbmQgNy4yLgogICAgcmV0dXJuIHR5cGVzCiAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKGFyZ3VtZW50cy5zaW5nbGUsIHQpCiAgICAgICAgLmFuZFN1YnR5cGVDaGVja0ZvcigKICAgICAgICAgICAgbmV3IEludGVyZmFjZVR5cGUodHlwZXMuaGllcmFyY2h5LmZ1dHVyZUNsYXNzLAogICAgICAgICAgICAgICAgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIHQsCiAgICAgICAgICAgIHR5cGVzKQogICAgICAgIC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKGZ1dHVyZU9yLCB0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgSW50ZXJmYWNlVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKAogICAgICAgIGludGVyc2VjdGlvbi5wcm9tb3RlZEJvdW5kLCB0KTsgLy8gUnVsZSAxMi4KICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgSW50ZXJmYWNlVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgSW50ZXJmYWNlVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHQuY2xhc3NOb2RlID09IHR5cGVzLmhpZXJhcmNoeS5mdW5jdGlvbkNsYXNzCiAgICAgICAgPyBuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMocywgdCkKICAgICAgICA6IGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7IC8vIFJ1bGUgMTQuCiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc1R5cGVkZWZSZWxhdGVkKFR5cGVkZWZUeXBlIHMsIEludGVyZmFjZVR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgNS4KICAgIHJldHVybiB0eXBlcwogICAgICAgIC5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLnVuYWxpYXMsIHQpCiAgICAgICAgLmFuZChuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMocywgdCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBJbnRlcmZhY2VUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9Cn0KCmNsYXNzIElzRnVuY3Rpb25TdWJ0eXBlT2YgZXh0ZW5kcyBUeXBlUmVsYXRpb248RnVuY3Rpb25UeXBlPiB7CiAgY29uc3QgSXNGdW5jdGlvblN1YnR5cGVPZigpOwoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0Z1bmN0aW9uUmVsYXRlZChGdW5jdGlvblR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHNUeXBlVmFyaWFibGVzID0gcy50eXBlUGFyYW1ldGVyczsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdFR5cGVWYXJpYWJsZXMgPSB0LnR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKHNUeXBlVmFyaWFibGVzLmxlbmd0aCAhPSB0VHlwZVZhcmlhYmxlcy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICB9CiAgICBJc1N1YnR5cGVPZiByZXN1bHQgPSBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgIGlmIChzVHlwZVZhcmlhYmxlcy5pc05vdEVtcHR5KSB7CiAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiB0eXBlcyBoYXZlIHR5cGUgdmFyaWFibGVzLCB3ZSBhbHBoYS1yZW5hbWUgdGhlIHR5cGUKICAgICAgLy8gdmFyaWFibGVzIG9mIFtzXSB0byB1c2UgdGhvc2Ugb2YgW3RdLgoKICAgICAgLy8gQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBmaXJzdCBjaGVjayBpZiB0aGUgYm91bmRzIG9mIHRoZSB0eXBlIHZhcmlhYmxlcwogICAgICAvLyBvZiB0aGUgdHdvIHR5cGVzIG9uIHRoZSBzYW1lIHBvc2l0aW9ucyBhcmUgbXV0dWFsIHN1YnR5cGVzIHdpdGhvdXQKICAgICAgLy8gYWxwaGEtcmVuYW1pbmcgdGhlbS4KICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uID0gPERhcnRUeXBlPltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNUeXBlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgVHlwZVBhcmFtZXRlciBzVHlwZVZhcmlhYmxlID0gc1R5cGVWYXJpYWJsZXNbaV07CiAgICAgICAgVHlwZVBhcmFtZXRlciB0VHlwZVZhcmlhYmxlID0gdFR5cGVWYXJpYWJsZXNbaV07CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZCgKICAgICAgICAgICAgdHlwZXMuaXNTYW1lVHlwZUtlcm5lbChzVHlwZVZhcmlhYmxlLmJvdW5kLCB0VHlwZVZhcmlhYmxlLmJvdW5kKSk7CiAgICAgICAgdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uLmFkZChuZXcgVHlwZVBhcmFtZXRlclR5cGUuZm9yQWxwaGFSZW5hbWluZygKICAgICAgICAgICAgc1R5cGVWYXJpYWJsZSwgdFR5cGVWYXJpYWJsZSkpOwogICAgICB9CiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmZyb21QYWlycyhzVHlwZVZhcmlhYmxlcywgdHlwZVZhcmlhYmxlU3Vic3RpdHV0aW9uKTsKICAgICAgLy8gSWYgdGhlIGJvdW5kcyBhcmVuJ3QgdGhlIHNhbWUsIHdlIG5lZWQgdG8gdHJ5IGFnYWluIGFmdGVyIGNvbXB1dGluZyB0aGUKICAgICAgLy8gc3Vic3RpdHV0aW9uIG9mIHR5cGUgdmFyaWFibGVzLgogICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICByZXN1bHQgPSBjb25zdCBJc1N1YnR5cGVPZi5hbHdheXMoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNUeXBlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBUeXBlUGFyYW1ldGVyIHNUeXBlVmFyaWFibGUgPSBzVHlwZVZhcmlhYmxlc1tpXTsKICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgdFR5cGVWYXJpYWJsZSA9IHRUeXBlVmFyaWFibGVzW2ldOwogICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFuZCh0eXBlcy5pc1NhbWVUeXBlS2VybmVsKAogICAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShzVHlwZVZhcmlhYmxlLmJvdW5kKSwKICAgICAgICAgICAgICB0VHlwZVZhcmlhYmxlLmJvdW5kKSk7CiAgICAgICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHMgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUocy53aXRob3V0VHlwZVBhcmFtZXRlcnMpOwogICAgfQogICAgcmVzdWx0ID0gcmVzdWx0LmFuZCgKICAgICAgICB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLnJldHVyblR5cGUsIHQucmV0dXJuVHlwZSkpOwogICAgaWYgKCFyZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgfQogICAgTGlzdDxEYXJ0VHlwZT4gc1Bvc2l0aW9uYWwgPSBzLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgTGlzdDxEYXJ0VHlwZT4gdFBvc2l0aW9uYWwgPSB0LnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgaWYgKHMucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IHQucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICAvLyBSdWxlIDE1LCBuMSA8PSBuMi4KICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICB9CiAgICBpZiAoc1Bvc2l0aW9uYWwubGVuZ3RoIDwgdFBvc2l0aW9uYWwubGVuZ3RoKSB7CiAgICAgIC8vIFJ1bGUgMTUsIG4xICsgazEgPj0gbjIgKyBrMi4KICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRQb3NpdGlvbmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC5hbmQodHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgICB0UG9zaXRpb25hbFtpXSwgc1Bvc2l0aW9uYWxbaV0pKTsKICAgICAgaWYgKCFyZXN1bHQuaXNTdWJ0eXBlV2hlbklnbm9yaW5nTnVsbGFiaWxpdGllcygpKSB7CiAgICAgICAgLy8gUnVsZSAxNSwgVGogPDogU2ouCiAgICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8TmFtZWRUeXBlPiBzTmFtZWQgPSBzLm5hbWVkUGFyYW1ldGVyczsKICAgIExpc3Q8TmFtZWRUeXBlPiB0TmFtZWQgPSB0Lm5hbWVkUGFyYW1ldGVyczsKICAgIGlmIChzTmFtZWQuaXNOb3RFbXB0eSB8fCB0TmFtZWQuaXNOb3RFbXB0eSkgewogICAgICAvLyBSdWxlIDE2LCB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIHRoZSBzYW1lLgogICAgICBpZiAoc1Bvc2l0aW9uYWwubGVuZ3RoICE9IHRQb3NpdGlvbmFsLmxlbmd0aCkgewogICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICB9CiAgICAgIGlmIChzLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0gdC5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgICAgIH0KCiAgICAgIC8vIFJ1bGUgMTYsIHRoZSBwYXJhbWV0ZXIgbmFtZXMgb2YgW3RdIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhvc2Ugb2YKICAgICAgLy8gW3NdLiBBbHNvLCBmb3IgdGhlIGludGVyc2VjdGlvbiwgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBvZiBbdF0gbXVzdAogICAgICAvLyBiZSBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBvZiBbc10uCiAgICAgIGludCBzQ291bnQgPSAwOwogICAgICBmb3IgKGludCB0Q291bnQgPSAwOyB0Q291bnQgPCB0TmFtZWQubGVuZ3RoOyB0Q291bnQrKykgewogICAgICAgIFN0cmluZyBuYW1lID0gdE5hbWVkW3RDb3VudF0ubmFtZTsKICAgICAgICBmb3IgKDsgc0NvdW50IDwgc05hbWVkLmxlbmd0aDsgc0NvdW50KyspIHsKICAgICAgICAgIGlmIChzTmFtZWRbc0NvdW50XS5uYW1lID09IG5hbWUpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc0NvdW50ID09IHNOYW1lZC5sZW5ndGgpIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hbmQodHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgICAgIHROYW1lZFt0Q291bnRdLnR5cGUsIHNOYW1lZFtzQ291bnRdLnR5cGUpKTsKICAgICAgICBpZiAoIXJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCkpIHsKICAgICAgICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJmYWNlUmVsYXRlZChJbnRlcmZhY2VUeXBlIHMsIEZ1bmN0aW9uVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgaWYgKHMuY2xhc3NOb2RlID09IHR5cGVzLmhpZXJhcmNoeS5udWxsQ2xhc3MpIHsKICAgICAgLy8gUnVsZSA0LgogICAgICByZXR1cm4gbmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0R5bmFtaWNSZWxhdGVkKER5bmFtaWNUeXBlIHMsIEZ1bmN0aW9uVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBGdW5jdGlvblR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTIuCiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgaW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQsIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDEzLgogICAgcmV0dXJuIHR5cGVzCiAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHMucGFyYW1ldGVyLmJvdW5kLCB0KQogICAgICAgIC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVHlwZWRlZlJlbGF0ZWQoVHlwZWRlZlR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDUuCiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2socy51bmFsaWFzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVm9pZFJlbGF0ZWQoVm9pZFR5cGUgcywgRnVuY3Rpb25UeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9Cn0KCmNsYXNzIElzVHlwZVBhcmFtZXRlclN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxUeXBlUGFyYW1ldGVyVHlwZT4gewogIGNvbnN0IElzVHlwZVBhcmFtZXRlclN1YnR5cGVPZigpOwoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgSXNTdWJ0eXBlT2YgcmVzdWx0ID0gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICBpZiAocy5wYXJhbWV0ZXIgIT0gdC5wYXJhbWV0ZXIpIHsKICAgICAgcmVzdWx0ID0gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2socy5ib3VuZCwgdCk7CiAgICB9CiAgICBpZiAocy5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCkgewogICAgICAvLyBUaGUgdHdvIG51bGxhYmlsaXRpZXMgYXJlIHVuZGV0ZXJtaW5lZCwgYnV0IGFyZSBjb25uZWN0ZWQgdmlhCiAgICAgIC8vIGFkZGl0aW9uYWwgY29uc3RyYWludCwgbmFtZWx5IHRoYXQgdGhleSB3aWxsIGJlIGVxdWFsIGF0IHJ1biB0aW1lLgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdC5hbmQobmV3IElzU3VidHlwZU9mLmJhc2VkU29sZWx5T25OdWxsYWJpbGl0aWVzKHMsIHQpKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUeXBlUGFyYW1ldGVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgLy8gTnVsbGFibGUgdHlwZXMgYXJlbid0IHByb21vdGVkIHRvIGludGVyc2VjdGlvbiB0eXBlcy4KICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB3aGVuIHRoZSBpbmZlcmVuY2UgaXMgdXBkYXRlZC4KICAgIC8vYXNzZXJ0KGludGVyc2VjdGlvbi50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5ICE9IE51bGxhYmlsaXR5Lm51bGxhYmxlKTsKCiAgICAvLyBSdWxlIDguCiAgICBpZiAoaW50ZXJzZWN0aW9uLnBhcmFtZXRlciA9PSB0LnBhcmFtZXRlcikgewogICAgICBpZiAoaW50ZXJzZWN0aW9uLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCAmJgogICAgICAgICAgdC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpIHsKICAgICAgICAvLyBUaGUgdHdvIG51bGxhYmlsaXRpZXMgYXJlIHVuZGV0ZXJtaW5lZCwgYnV0IGFyZSBjb25uZWN0ZWQgdmlhCiAgICAgICAgLy8gYWRkaXRpb25hbCBjb25zdHJhaW50LCBuYW1lbHkgdGhhdCB0aGV5IHdpbGwgYmUgZXF1YWwgYXQgcnVuIHRpbWUuCiAgICAgICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLmFsd2F5cygpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMoaW50ZXJzZWN0aW9uLCB0KTsKICAgIH0KCiAgICAvLyBSdWxlIDEyLgogICAgcmV0dXJuIHR5cGVzLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKAogICAgICAgIGludGVyc2VjdGlvbi5wcm9tb3RlZEJvdW5kLndpdGhOdWxsYWJpbGl0eShpbnRlcnNlY3Rpb24ubnVsbGFiaWxpdHkpLAogICAgICAgIHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNJbnRlcmZhY2VSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBpZiAocy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxDbGFzcykgewogICAgICAvLyBSdWxlIDQuCiAgICAgIHJldHVybiBuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMocywgdCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRHluYW1pY1JlbGF0ZWQoCiAgICAgIER5bmFtaWNUeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRnVuY3Rpb25SZWxhdGVkKAogICAgICBGdW5jdGlvblR5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNGdXR1cmVPclJlbGF0ZWQoCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVHlwZWRlZlJlbGF0ZWQoCiAgICAgIFR5cGVkZWZUeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2socy51bmFsaWFzLCB0KTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVm9pZFJlbGF0ZWQoVm9pZFR5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KfQoKY2xhc3MgSXNUeXBlZGVmU3VidHlwZU9mIGV4dGVuZHMgVHlwZVJlbGF0aW9uPFR5cGVkZWZUeXBlPiB7CiAgY29uc3QgSXNUeXBlZGVmU3VidHlwZU9mKCk7CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJmYWNlUmVsYXRlZChJbnRlcmZhY2VUeXBlIHMsIFR5cGVkZWZUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2socywgdC51bmFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRHluYW1pY1JlbGF0ZWQoRHluYW1pY1R5cGUgcywgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIFR5cGVkZWZUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2socywgdC51bmFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBUeXBlZGVmVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKGZ1dHVyZU9yLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVkZWZUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soaW50ZXJzZWN0aW9uLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgcywgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLCB0LnVuYWxpYXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNUeXBlZGVmUmVsYXRlZChUeXBlZGVmVHlwZSBzLCBUeXBlZGVmVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHMudW5hbGlhcywgdC51bmFsaWFzKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVm9pZFJlbGF0ZWQoVm9pZFR5cGUgcywgVHlwZWRlZlR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLCB0LnVuYWxpYXMpOwogIH0KfQoKY2xhc3MgSXNGdXR1cmVPclN1YnR5cGVPZiBleHRlbmRzIFR5cGVSZWxhdGlvbjxJbnRlcmZhY2VUeXBlPiB7CiAgY29uc3QgSXNGdXR1cmVPclN1YnR5cGVPZigpOwoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0ludGVyZmFjZVJlbGF0ZWQoCiAgICAgIEludGVyZmFjZVR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHM7CgogICAgTnVsbGFiaWxpdHkgdW5pdGVkTnVsbGFiaWxpdHkgPQogICAgICAgIGNvbXB1dGVOdWxsYWJpbGl0eU9mRnV0dXJlT3IoZnV0dXJlT3IsIHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVPckNsYXNzKTsKCiAgICByZXR1cm4gdHlwZXMKICAgICAgICAvLyBSdWxlIDExLgogICAgICAgIC5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjaygKICAgICAgICAgICAgcywgYXJndW1lbnRzLnNpbmdsZS53aXRoTnVsbGFiaWxpdHkodW5pdGVkTnVsbGFiaWxpdHkpKQogICAgICAgIC8vIFJ1bGUgMTAuCiAgICAgICAgLm9yU3VidHlwZUNoZWNrRm9yKAogICAgICAgICAgICBzLAogICAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgIHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVDbGFzcywgdW5pdGVkTnVsbGFiaWxpdHksIGFyZ3VtZW50cyksCiAgICAgICAgICAgIHR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRnV0dXJlT3JSZWxhdGVkKAogICAgICBJbnRlcmZhY2VUeXBlIHNGdXR1cmVPciwgSW50ZXJmYWNlVHlwZSB0RnV0dXJlT3IsIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBUaGlzIGZvbGxvd3MgZnJvbSBjb21iaW5pbmcgcnVsZXMgNywgMTAsIGFuZCAxMS4KICAgIERhcnRUeXBlIHNBcmd1bWVudCA9IHNGdXR1cmVPci50eXBlQXJndW1lbnRzLnNpbmdsZTsKICAgIERhcnRUeXBlIHRBcmd1bWVudCA9IHRGdXR1cmVPci50eXBlQXJndW1lbnRzLnNpbmdsZTsKICAgIHJldHVybiB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzQXJndW1lbnQsIHRBcmd1bWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0R5bmFtaWNSZWxhdGVkKAogICAgICBEeW5hbWljVHlwZSBzLCBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSAxMS4KICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gZnV0dXJlT3IudHlwZUFyZ3VtZW50cy5zaW5nbGU7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgcywKICAgICAgICBhcmd1bWVudC53aXRoTnVsbGFiaWxpdHkoY29tcHV0ZU51bGxhYmlsaXR5T2ZGdXR1cmVPcigKICAgICAgICAgICAgZnV0dXJlT3IsIHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVPckNsYXNzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSAxMS4KICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gZnV0dXJlT3IudHlwZUFyZ3VtZW50cy5zaW5nbGU7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgcywKICAgICAgICBhcmd1bWVudC53aXRoTnVsbGFiaWxpdHkoY29tcHV0ZU51bGxhYmlsaXR5T2ZGdXR1cmVPcigKICAgICAgICAgICAgZnV0dXJlT3IsIHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVPckNsYXNzKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNUeXBlUGFyYW1ldGVyUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHM7CiAgICBOdWxsYWJpbGl0eSB1bml0ZWROdWxsYWJpbGl0eSA9CiAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5T2ZGdXR1cmVPcihmdXR1cmVPciwgdHlwZXMuaGllcmFyY2h5LmZ1dHVyZU9yQ2xhc3MpOwogICAgLy8gVE9ETyhkbWl0cnlhcyk6IFJldmlzZSB0aGUgb3JpZ2luYWwgb3B0aW1pemF0aW9uLgogICAgcmV0dXJuIHR5cGVzCiAgICAgICAgLy8gUnVsZSAxMS4KICAgICAgICAucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgICAgIHMsIGFyZ3VtZW50cy5zaW5nbGUud2l0aE51bGxhYmlsaXR5KHVuaXRlZE51bGxhYmlsaXR5KSkKICAgICAgICAvLyBSdWxlIDEzLgogICAgICAgIC5vclN1YnR5cGVDaGVja0ZvcigKICAgICAgICAgICAgcy5wYXJhbWV0ZXIuYm91bmQud2l0aE51bGxhYmlsaXR5KAogICAgICAgICAgICAgICAgY29tYmluZU51bGxhYmlsaXRpZXNGb3JTdWJzdGl0dXRpb24oCiAgICAgICAgICAgICAgICAgICAgcy5wYXJhbWV0ZXIuYm91bmQubnVsbGFiaWxpdHksIHMubnVsbGFiaWxpdHkpKSwKICAgICAgICAgICAgZnV0dXJlT3IsCiAgICAgICAgICAgIHR5cGVzKQogICAgICAgIC8vIFJ1bGUgMTAuCiAgICAgICAgLm9yU3VidHlwZUNoZWNrRm9yKAogICAgICAgICAgICBzLAogICAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgIHR5cGVzLmhpZXJhcmNoeS5mdXR1cmVDbGFzcywgdW5pdGVkTnVsbGFiaWxpdHksIGFyZ3VtZW50cyksCiAgICAgICAgICAgIHR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzRnVuY3Rpb25SZWxhdGVkKAogICAgICBGdW5jdGlvblR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIC8vIFJ1bGUgMTEuCiAgICBEYXJ0VHlwZSBhcmd1bWVudCA9IGZ1dHVyZU9yLnR5cGVBcmd1bWVudHMuc2luZ2xlOwogICAgcmV0dXJuIHR5cGVzLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKAogICAgICAgIHMsCiAgICAgICAgYXJndW1lbnQud2l0aE51bGxhYmlsaXR5KGNvbXB1dGVOdWxsYWJpbGl0eU9mRnV0dXJlT3IoCiAgICAgICAgICAgIGZ1dHVyZU9yLCB0eXBlcy5oaWVyYXJjaHkuZnV0dXJlT3JDbGFzcykpKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJzZWN0aW9uUmVsYXRlZCgKICAgICAgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBJbnRlcmZhY2VUeXBlIGZ1dHVyZU9yLCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoaW50ZXJzZWN0aW9uLCBmdXR1cmVPciwgdHlwZXMpIC8vIFJ1bGUgOC4KICAgICAgICAub3JTdWJ0eXBlQ2hlY2tGb3IoCiAgICAgICAgICAgIGludGVyc2VjdGlvbi5wcm9tb3RlZEJvdW5kLCBmdXR1cmVPciwgdHlwZXMpOyAvLyBSdWxlIDEyLgogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNUeXBlZGVmUmVsYXRlZCgKICAgICAgVHlwZWRlZlR5cGUgcywgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLnVuYWxpYXMsIGZ1dHVyZU9yKTsKICB9Cn0KCmNsYXNzIElzSW50ZXJzZWN0aW9uU3VidHlwZU9mIGV4dGVuZHMgVHlwZVJlbGF0aW9uPFR5cGVQYXJhbWV0ZXJUeXBlPiB7CiAgY29uc3QgSXNJbnRlcnNlY3Rpb25TdWJ0eXBlT2YoKTsKCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNJbnRlcnNlY3Rpb25SZWxhdGVkKFR5cGVQYXJhbWV0ZXJUeXBlIHNJbnRlcnNlY3Rpb24sCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHRJbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDkuCiAgICByZXR1cm4gY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCkKICAgICAgICAuaXNJbnRlcnNlY3Rpb25SZWxhdGVkKHNJbnRlcnNlY3Rpb24sIHRJbnRlcnNlY3Rpb24sIHR5cGVzKQogICAgICAgIC5hbmRTdWJ0eXBlQ2hlY2tGb3Ioc0ludGVyc2VjdGlvbiwgdEludGVyc2VjdGlvbi5wcm9tb3RlZEJvdW5kLCB0eXBlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc1R5cGVQYXJhbWV0ZXJSZWxhdGVkKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICAvLyBSdWxlIDkuCiAgICByZXR1cm4gY29uc3QgSXNUeXBlUGFyYW1ldGVyU3VidHlwZU9mKCkKICAgICAgICAuaXNUeXBlUGFyYW1ldGVyUmVsYXRlZChzLCBpbnRlcnNlY3Rpb24sIHR5cGVzKQogICAgICAgIC5hbmRTdWJ0eXBlQ2hlY2tGb3IocywgaW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQsIHR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzSW50ZXJmYWNlUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBzLCBUeXBlUGFyYW1ldGVyVHlwZSBpbnRlcnNlY3Rpb24sIFR5cGVzIHR5cGVzKSB7CiAgICBpZiAocy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxDbGFzcykgewogICAgICAvLyBSdWxlIDQuCiAgICAgIHJldHVybiBuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMocywgaW50ZXJzZWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNEeW5hbWljUmVsYXRlZCgKICAgICAgRHluYW1pY1R5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBJc1N1YnR5cGVPZiBpc0Z1bmN0aW9uUmVsYXRlZCgKICAgICAgRnVuY3Rpb25UeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNGdXR1cmVPclJlbGF0ZWQoCiAgICAgIEludGVyZmFjZVR5cGUgZnV0dXJlT3IsIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgSXNTdWJ0eXBlT2YgaXNUeXBlZGVmUmVsYXRlZCgKICAgICAgVHlwZWRlZlR5cGUgcywgVHlwZVBhcmFtZXRlclR5cGUgaW50ZXJzZWN0aW9uLCBUeXBlcyB0eXBlcykgewogICAgLy8gUnVsZSA1LgogICAgcmV0dXJuIHR5cGVzLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHMudW5hbGlhcywgaW50ZXJzZWN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIElzU3VidHlwZU9mIGlzVm9pZFJlbGF0ZWQoCiAgICAgIFZvaWRUeXBlIHMsIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KfQoKY2xhc3MgSXNOZXZlclR5cGVTdWJ0eXBlT2YgaW1wbGVtZW50cyBUeXBlUmVsYXRpb248TmV2ZXJUeXBlPiB7CiAgY29uc3QgSXNOZXZlclR5cGVTdWJ0eXBlT2YoKTsKCiAgSXNTdWJ0eXBlT2YgaXNEeW5hbWljUmVsYXRlZChEeW5hbWljVHlwZSBzLCBOZXZlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KCiAgSXNTdWJ0eXBlT2YgaXNWb2lkUmVsYXRlZChWb2lkVHlwZSBzLCBOZXZlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiBjb25zdCBJc1N1YnR5cGVPZi5uZXZlcigpOwogIH0KCiAgSXNTdWJ0eXBlT2YgaXNJbnRlcmZhY2VSZWxhdGVkKEludGVyZmFjZVR5cGUgcywgTmV2ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICBpZiAocy5jbGFzc05vZGUgPT0gdHlwZXMuaGllcmFyY2h5Lm51bGxDbGFzcykgewogICAgICBpZiAodC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSB8fAogICAgICAgICAgdC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YuYWx3YXlzKCk7CiAgICAgIH0KICAgICAgaWYgKHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICJVbmV4cGVjdGVkIG51bGxhYmlsaXR5ICckdC5udWxsYWJpbGl0eScgb2YgdHlwZSBOZXZlciIpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBJc1N1YnR5cGVPZiBpc0ludGVyc2VjdGlvblJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIGludGVyc2VjdGlvbiwgTmV2ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gdHlwZXMucGVyZm9ybU51bGxhYmlsaXR5QXdhcmVTdWJ0eXBlQ2hlY2soCiAgICAgICAgaW50ZXJzZWN0aW9uLnByb21vdGVkQm91bmQsIHQpOwogIH0KCiAgSXNTdWJ0eXBlT2YgaXNGdW5jdGlvblJlbGF0ZWQoRnVuY3Rpb25UeXBlIHMsIE5ldmVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIGNvbnN0IElzU3VidHlwZU9mLm5ldmVyKCk7CiAgfQoKICBJc1N1YnR5cGVPZiBpc0Z1dHVyZU9yUmVsYXRlZCgKICAgICAgSW50ZXJmYWNlVHlwZSBmdXR1cmVPciwgTmV2ZXJUeXBlIHQsIFR5cGVzIHR5cGVzKSB7CiAgICByZXR1cm4gY29uc3QgSXNTdWJ0eXBlT2YubmV2ZXIoKTsKICB9CgogIElzU3VidHlwZU9mIGlzVHlwZVBhcmFtZXRlclJlbGF0ZWQoCiAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlIHMsIE5ldmVyVHlwZSB0LCBUeXBlcyB0eXBlcykgewogICAgcmV0dXJuIHR5cGVzCiAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKHMuYm91bmQsIHQpCiAgICAgICAgLmFuZChuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMocywgdCkpOwogIH0KCiAgSXNTdWJ0eXBlT2YgaXNUeXBlZGVmUmVsYXRlZChUeXBlZGVmVHlwZSBzLCBOZXZlclR5cGUgdCwgVHlwZXMgdHlwZXMpIHsKICAgIHJldHVybiB0eXBlcy5wZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVjayhzLnVuYWxpYXMsIHQpOwogIH0KfQqDoQBOTjwBFQEhCRQPEhUWFxURExMVFxsVEhIBKQEqPAEvASwBOQEnKQEZAS9KRBQvOTM8D0kGBAEMTBs0Bhw0Bhk0BhsoBho/BgFBHCcpBhwoBgEeHypNQQgsSiA4JDUpODc5KDktKTw8JzgKD0wgOCQ1KTg3OSg5LSk8PCc4CggkSB42IjMnNjU3JjcrJzo6JTYIKSUyLiA4JDUpODc5KDktKTw8JzgKDzEtIDgkNSk4NzkoOS0pPDwnOAoII0YeNiIzJzY1NyY3Kyc6OiU2CCFKHjYiMyc4JjcrJzo6JTYIDTAGSwQBTkwvQzhPBjUpJDBOPCwKMzs8LAoPTjwsCggGEwQBOTUpBAEMFEU4BAEMQAEMQAEMLTEBDEUeSQQBDEo0UQQBDC8uSwQBDB4iHCcnBAEMPgEMPAEMKjQEAQwsNgQBDDooKwQCATIYAUEBOwFFASU5AUMBSwFNAUECAUEgAQwiNzRKMT8GKkwoKAYRKk9ABAEMJjsRQ0AEAQwhPjcaEUIdOzUPE0cEAQwlRjY0BAEMTiYEAQxQODsxBAEMTg8RO0AEAQxIJgQCAT8fAQxPOzs6KAY1JU0vAVBMHj44OTkdT00sCCJMUSk6LTo7OzZAJT4uDAoIQAYZUDgoBjk5PxwoBjMmKAYzRSw6HioIBjAwMkg2KghCKggBSlA7Fj8rMzIKR0c4PCwKCAZJBAEMUTQRPwYmBAEMTSYEAQwhPSYEAQwlRRA2KAQBDCY6EBFDQAQBDE0PRAQBDEcmBAIBSSQBDCY/NSZGBjU1R0wVBkkEAQwlSj1OUQEPMUI3SU4rCEoGARA2TgwEAQwiOzQRPwYmBAEMIDkmBAEMITomBAEMIUImBAEMIDlEBAEMTCYEAgE9HgEMUEQEAQxMRAQBDE5EBAEMITxLBAEMJURPBAEMJjlEBAEMTEwEAQxGRAQCAUAfAQwiPjcBJE8BERQuRBQcDx9MFAQBDCFHODk5TAQBDCA8EDc2Cz84BAEMTxA3Ngs/OAQBDCZCNyRPOREULkQUHC81RBYTFBwPH0wUBAEMIT0QNzYLPzgEAQwlTUwcRgQBDCA8SwQCAUgjAQxFNg8sRFAEAQwmSg8sOEMEAQwiRjQRSgYmBAEMIEQmBAEMIUUmBAEMIU0mBAEMIEQPTwQBDB1BJgQCAUAgAUomBAFEJgQBTjQzMSsINioIHEQGJgQBJUI2KAQBTCYEASE6JgQBJjcROUAEAUpEBAIBLXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZXMuZGFydGdmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYS5kYXJ0jpcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIERhcnRUeXBlLAogICAgICAgIERhcnRUeXBlVmlzaXRvciwKICAgICAgICBEYXJ0VHlwZVZpc2l0b3IxLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBOdWxsYWJpbGl0eSwKICAgICAgICBUeXBlZGVmVHlwZSwKICAgICAgICBWaXNpdG9yOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9hc3N1bXB0aW9ucy5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvaW1wb3J0X3RhYmxlLmRhcnQnIHNob3cgSW1wb3J0VGFibGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydCcKICAgIHNob3cgQW5ub3RhdG9yLCBOYW1lU3lzdGVtLCBQcmludGVyLCBnbG9iYWxEZWJ1Z2dpbmdOYW1lczsKCi8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSB0eXBlIHNjaGVtYSBjb250YWlucyBgP2Agc29tZXdoZXJlIGluc2lkZSBpdC4KYm9vbCBpc0tub3duKERhcnRUeXBlIHNjaGVtYSkgPT4gc2NoZW1hLmFjY2VwdChjb25zdCBfSXNLbm93blZpc2l0b3IoKSk7CgovLy8gQ29udmVydHMgYSBbRGFydFR5cGVdIHRvIGEgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIHVua25vd24gdHlwZSBhcyBgP2AuClN0cmluZyB0eXBlU2NoZW1hVG9TdHJpbmcoRGFydFR5cGUgc2NoZW1hKSB7CiAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBuZXcgVHlwZVNjaGVtYVByaW50ZXIoYnVmZmVyLCBzeW50aGV0aWNOYW1lczogZ2xvYmFsRGVidWdnaW5nTmFtZXMpCiAgICAgIC53cml0ZU5vZGUoc2NoZW1hKTsKICByZXR1cm4gJyRidWZmZXInOwp9CgovLy8gRXh0ZW5zaW9uIG9mIFtQcmludGVyXSB0aGF0IHJlcHJlc2VudHMgdGhlIHVua25vd24gdHlwZSBhcyBgP2AuCmNsYXNzIFR5cGVTY2hlbWFQcmludGVyIGV4dGVuZHMgUHJpbnRlciB7CiAgVHlwZVNjaGVtYVByaW50ZXIoU3RyaW5nU2luayBzaW5rLAogICAgICB7TmFtZVN5c3RlbSBzeW50aGV0aWNOYW1lcywKICAgICAgYm9vbCBzaG93T2Zmc2V0czogZmFsc2UsCiAgICAgIEltcG9ydFRhYmxlIGltcG9ydFRhYmxlLAogICAgICBBbm5vdGF0b3IgYW5ub3RhdG9yfSkKICAgICAgOiBzdXBlcihzaW5rLAogICAgICAgICAgICBzeW50aGV0aWNOYW1lczogc3ludGhldGljTmFtZXMsCiAgICAgICAgICAgIHNob3dPZmZzZXRzOiBzaG93T2Zmc2V0cywKICAgICAgICAgICAgaW1wb3J0VGFibGU6IGltcG9ydFRhYmxlLAogICAgICAgICAgICBhbm5vdGF0b3I6IGFubm90YXRvcik7CgogIEBvdmVycmlkZQogIGRlZmF1bHREYXJ0VHlwZShjb3ZhcmlhbnQgVW5rbm93blR5cGUgbm9kZSkgewogICAgd3JpdGVXb3JkKCc/Jyk7CiAgfQp9CgovLy8gVGhlIHVua25vd24gdHlwZSAoZGVub3RlZCBgP2ApIGlzIGFuIG9iamVjdCB3aGljaCBjYW4gYXBwZWFyIGFueXdoZXJlIHRoYXQKLy8vIGEgdHlwZSBpcyBleHBlY3RlZC4gIEl0IHJlcHJlc2VudHMgYSBjb21wb25lbnQgb2YgYSB0eXBlIHdoaWNoIGhhcyBub3QgeWV0Ci8vLyBiZWVuIGZpeGVkIGJ5IGluZmVyZW5jZS4KLy8vCi8vLyBUaGUgdW5rbm93biB0eXBlIGNhbm5vdCBhcHBlYXIgaW4gcHJvZ3JhbXMgb3IgaW4gZmluYWwgaW5mZXJyZWQgdHlwZXM6IGl0IGlzCi8vLyBwdXJlbHkgcGFydCBvZiB0aGUgbG9jYWwgaW5mZXJlbmNlIHByb2Nlc3MuCmNsYXNzIFVua25vd25UeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eSA9PiBudWxsOwoKICBjb25zdCBVbmtub3duVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgPT4gZXF1YWxzKG90aGVyLCBudWxsKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBlcXVhbHMoT2JqZWN0IG90aGVyLCBBc3N1bXB0aW9ucyBhc3N1bXB0aW9ucykgewogICAgLy8gVGhpcyBjbGFzcyBkb2Vzbid0IGhhdmUgYW55IGZpZWxkcyBzbyBhbGwgaW5zdGFuY2VzIG9mIGBVbmtub3duVHlwZWAgYXJlCiAgICAvLyBlcXVhbC4KICAgIHJldHVybiBvdGhlciBpcyBVbmtub3duVHlwZTsKICB9CgogIEBvdmVycmlkZQogIFIgYWNjZXB0PFI+KERhcnRUeXBlVmlzaXRvcjxSPiB2KSB7CiAgICByZXR1cm4gdi5kZWZhdWx0RGFydFR5cGUodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBhcmcpID0+CiAgICAgIHYuZGVmYXVsdERhcnRUeXBlKHRoaXMsIGFyZyk7CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRDaGlsZHJlbihWaXNpdG9yPGR5bmFtaWM+IHYpIHt9CgogIEBvdmVycmlkZQogIFVua25vd25UeXBlIHdpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgPT4gdGhpczsKfQoKLy8vIFZpc2l0b3IgdGhhdCBjb21wdXRlcyBbaXNLbm93bl0uCmNsYXNzIF9Jc0tub3duVmlzaXRvciBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgY29uc3QgX0lzS25vd25WaXNpdG9yKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IG5vZGUgaXMhIFVua25vd25UeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAoIW5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIGZvciAoRGFydFR5cGUgcGFyYW1ldGVyVHlwZSBpbiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmICghcGFyYW1ldGVyVHlwZS5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoTmFtZWRUeXBlIG5hbWVkUGFyYW1ldGVyVHlwZSBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBpZiAoIW5hbWVkUGFyYW1ldGVyVHlwZS50eXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG5vZGUudHlwZWRlZlR5cGUgIT0gbnVsbCAmJiAhbm9kZS50eXBlZGVmVHlwZS5hY2NlcHQodGhpcykpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICBpZiAoIXR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIGZvciAoRGFydFR5cGUgdHlwZUFyZ3VtZW50IGluIG5vZGUudHlwZUFyZ3VtZW50cykgewogICAgICBpZiAoIXR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQqAggBNTj8BIQkSGRoWFxMVFREuATwBLj8BR0kBTS0sRhoUAgFEKiUiHx8cFCwmJiMBDDAUBAIBT08dBFEwJQwnARcBDDkBDDdQDiEEAQwmJAQBDDQkAQwsAQxAAgElNhsBDD8BDC41QDUGQT8GRhQGEQQBDDA4NAYRBAEMLDg0BhEEAgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnRyZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0idUvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcgc2hvdyBub0xlbmd0aCwgdGVtcGxhdGVDb25zdHJ1Y3Rvck5vdEZvdW5kOwoKaW1wb3J0ICcuLi9pZGVudGlmaWVycy5kYXJ0JyBzaG93IFF1YWxpZmllZE5hbWUsIGZsYXR0ZW5OYW1lOwoKaW1wb3J0ICcuLi9zY29wZS5kYXJ0JzsKCmltcG9ydCAnYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdjbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdwcmVmaXhfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2FsaWFzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwoKY2xhc3MgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHsKICBmaW5hbCBpbnQgY2hhck9mZnNldDsKCiAgZmluYWwgVXJpIGZpbGVVcmk7CgogIGZpbmFsIE9iamVjdCBuYW1lOwoKICBmaW5hbCBMaXN0PFR5cGVCdWlsZGVyPiB0eXBlQXJndW1lbnRzOwoKICAvLy8gVGhpcyBpcyB0aGUgbmFtZSBvZiBhIG5hbWVkIGNvbnN0cnVjdG9yLiBBcyBgYmFyYCBpbiBgbmV3IEZvbzxUPi5iYXIoKWAuCiAgZmluYWwgU3RyaW5nIHN1ZmZpeDsKCiAgQnVpbGRlciB0YXJnZXQ7CgogIENvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcih0aGlzLm5hbWUsIHRoaXMudHlwZUFyZ3VtZW50cywgdGhpcy5zdWZmaXgsCiAgICAgIEJ1aWxkZXIgcGFyZW50LCB0aGlzLmNoYXJPZmZzZXQpCiAgICAgIDogZmlsZVVyaSA9IHBhcmVudC5maWxlVXJpOwoKICBTdHJpbmcgZ2V0IGZ1bGxOYW1lRm9yRXJyb3JzIHsKICAgIHJldHVybiAiJHtmbGF0dGVuTmFtZShuYW1lLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKX0iCiAgICAgICAgIiR7c3VmZml4ID09IG51bGwgPyAnJyA6ICcuJHN1ZmZpeCd9IjsKICB9CgogIHZvaWQgcmVzb2x2ZUluKFNjb3BlIHNjb3BlLCBMaWJyYXJ5QnVpbGRlciBhY2Nlc3NpbmdMaWJyYXJ5KSB7CiAgICBmaW5hbCBPYmplY3QgbmFtZSA9IHRoaXMubmFtZTsKICAgIEJ1aWxkZXIgZGVjbGFyYXRpb247CiAgICBpZiAobmFtZSBpcyBRdWFsaWZpZWROYW1lKSB7CiAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lLnF1YWxpZmllcjsKICAgICAgU3RyaW5nIG1pZGRsZSA9IG5hbWUubmFtZTsKICAgICAgZGVjbGFyYXRpb24gPSBzY29wZS5sb29rdXAocHJlZml4LCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgICBUeXBlQWxpYXNCdWlsZGVyIGFsaWFzQnVpbGRlciA9IGRlY2xhcmF0aW9uOwogICAgICAgIGRlY2xhcmF0aW9uID0gYWxpYXNCdWlsZGVyLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgICAgfQogICAgICBpZiAoZGVjbGFyYXRpb24gaXMgUHJlZml4QnVpbGRlcikgewogICAgICAgIFByZWZpeEJ1aWxkZXIgcHJlZml4ID0gZGVjbGFyYXRpb247CiAgICAgICAgZGVjbGFyYXRpb24gPSBwcmVmaXgubG9va3VwKG1pZGRsZSwgbmFtZS5jaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBDbGFzc0J1aWxkZXIpIHsKICAgICAgICBDbGFzc0J1aWxkZXIgY2xzID0gZGVjbGFyYXRpb247CiAgICAgICAgZGVjbGFyYXRpb24gPSBjbHMuZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5KAogICAgICAgICAgICBtaWRkbGUsIG5hbWUuY2hhck9mZnNldCwgZmlsZVVyaSwgYWNjZXNzaW5nTGlicmFyeSk7CiAgICAgICAgaWYgKHN1ZmZpeCA9PSBudWxsKSB7CiAgICAgICAgICB0YXJnZXQgPSBkZWNsYXJhdGlvbjsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGRlY2xhcmF0aW9uID0gc2NvcGUubG9va3VwKG5hbWUsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICB0YXJnZXQgPSBkZWNsYXJhdGlvbi5maW5kQ29uc3RydWN0b3JPckZhY3RvcnkoCiAgICAgICAgICBzdWZmaXggPz8gIiIsIGNoYXJPZmZzZXQsIGZpbGVVcmksIGFjY2Vzc2luZ0xpYnJhcnkpOwogICAgfQogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIGFjY2Vzc2luZ0xpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgIHRlbXBsYXRlQ29uc3RydWN0b3JOb3RGb3VuZC53aXRoQXJndW1lbnRzKGZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgIGZpbGVVcmkpOwogICAgfQogIH0KfQpTAE5OPAEtAUYBPgEYARcdHx4iHAEkGAEVARUBKQFPFwESAUonIgEhNy8EAUEjGSEmIT8tNTcIKixHMCg0QR4gEgoIDT0GJzVABhojSBYUFAYEAgFGcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvY29uc3RydWN0b3JfcmVmZXJlbmNlX2J1aWxkZXIuZGFydGVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL21ldGFkYXRhX2J1aWxkZXIuZGFydIaNLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWV0YWRhdGFfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgQW5ub3RhdGFibGUsIENsYXNzLCBMaWJyYXJ5OwoKaW1wb3J0ICcuLi9rZXJuZWwvYm9keV9idWlsZGVyLmRhcnQnIHNob3cgQm9keUJ1aWxkZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnIHNob3cgU2NvcGU7CgppbXBvcnQgJ2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbWVtYmVyX2J1aWxkZXIuZGFydCc7CgpjbGFzcyBNZXRhZGF0YUJ1aWxkZXIgewogIGZpbmFsIFRva2VuIGJlZ2luVG9rZW47CgogIGludCBnZXQgY2hhck9mZnNldCA9PiBiZWdpblRva2VuLmNoYXJPZmZzZXQ7CgogIE1ldGFkYXRhQnVpbGRlcih0aGlzLmJlZ2luVG9rZW4pOwoKICBzdGF0aWMgdm9pZCBidWlsZEFubm90YXRpb25zKAogICAgICBBbm5vdGF0YWJsZSBwYXJlbnQsCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlciwKICAgICAgTWVtYmVyQnVpbGRlciBtZW1iZXIpIHsKICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSByZXR1cm47CiAgICBVcmkgZmlsZVVyaSA9IG1lbWJlcj8uZmlsZVVyaSA/PyBjbGFzc0J1aWxkZXI/LmZpbGVVcmkgPz8gbGlicmFyeS5maWxlVXJpOwogICAgU2NvcGUgc2NvcGUgPSBwYXJlbnQgaXMgTGlicmFyeSB8fCBwYXJlbnQgaXMgQ2xhc3MgfHwgY2xhc3NCdWlsZGVyID09IG51bGwKICAgICAgICA/IGxpYnJhcnkuc2NvcGUKICAgICAgICA6IGNsYXNzQnVpbGRlci5zY29wZTsKICAgIEJvZHlCdWlsZGVyIGJvZHlCdWlsZGVyID0gbGlicmFyeS5sb2FkZXIKICAgICAgICAuY3JlYXRlQm9keUJ1aWxkZXJGb3JPdXRsaW5lRXhwcmVzc2lvbigKICAgICAgICAgICAgbGlicmFyeSwgY2xhc3NCdWlsZGVyLCBtZW1iZXIsIHNjb3BlLCBmaWxlVXJpKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YWRhdGEubGVuZ3RoOyArK2kpIHsKICAgICAgTWV0YWRhdGFCdWlsZGVyIGFubm90YXRpb25CdWlsZGVyID0gbWV0YWRhdGFbaV07CiAgICAgIHBhcmVudC5hZGRBbm5vdGF0aW9uKAogICAgICAgICAgYm9keUJ1aWxkZXIucGFyc2VBbm5vdGF0aW9uKGFubm90YXRpb25CdWlsZGVyLmJlZ2luVG9rZW4pKTsKICAgIH0KICAgIGJvZHlCdWlsZGVyLmluZmVyQW5ub3RhdGlvbnMocGFyZW50LCBwYXJlbnQuYW5ub3RhdGlvbnMpOwogICAgYm9keUJ1aWxkZXIucmVzb2x2ZVJlZGlyZWN0aW5nRmFjdG9yeVRhcmdldHMoKTsKICB9Cn0KMwBOTjwBIAFKAUMBNwFKASMBHR4BGBoBLwEkASAaJiQhHiJPTxgeLTA8MDccRgY+NAQCATlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnRnZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9uZXZlcl90eXBlX2J1aWxkZXIuZGFydIQmLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubmV2ZXJfdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgTnVsbGFiaWxpdHk7CgppbXBvcnQgJ2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdudWxsYWJpbGl0eV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIE5ldmVyVHlwZUJ1aWxkZXIgZXh0ZW5kcyBCdWlsdGluVHlwZUJ1aWxkZXIgewogIE5ldmVyVHlwZUJ1aWxkZXIoCiAgICAgIERhcnRUeXBlIHR5cGUsIExpYnJhcnlCdWlsZGVyIGNvbXBpbGF0aW9uVW5pdCwgaW50IGNoYXJPZmZzZXQpCiAgICAgIDogc3VwZXIoIk5ldmVyIiwgdHlwZSwgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIk5ldmVyVHlwZUJ1aWxkZXIiOwoKICBEYXJ0VHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICByZXR1cm4gdHlwZS53aXRoTnVsbGFiaWxpdHkobnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnkpKTsKICB9CgogIERhcnRUeXBlIGJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHksIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cykgewogICAgcmV0dXJuIHR5cGUud2l0aE51bGxhYmlsaXR5KG51bGxhYmlsaXR5KTsKICB9Cn0KIABOTjwBIgE9ASQfIxwBNBRFOwEuAS1MRAQBQDsuBAIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL25ldmVyX3R5cGVfYnVpbGRlci5kYXJ0SmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2tlcm5lbC9saWIvdXRpbC9ncmFwaC5kYXJ0ipAvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmdyYXBoOwoKYWJzdHJhY3QgY2xhc3MgR3JhcGg8VD4gewogIEl0ZXJhYmxlPFQ+IGdldCB2ZXJ0aWNlczsKCiAgSXRlcmFibGU8VD4gbmVpZ2hib3JzT2YoVCB2ZXJ0ZXgpOwp9CgovLy8gQ29tcHV0ZXMgdGhlIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIG9mIFtncmFwaF0uCi8vLwovLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBbRGlqa3N0cmEncyBwYXRoLWJhc2VkIHN0cm9uZyBjb21wb25lbnQKLy8vIGFsZ29yaXRobV0KLy8vIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXRoLWJhc2VkX3N0cm9uZ19jb21wb25lbnRfYWxnb3JpdGhtI0Rlc2NyaXB0aW9uKS4KTGlzdDxMaXN0PFQ+PiBjb21wdXRlU3Ryb25nQ29tcG9uZW50czxUPihHcmFwaDxUPiBncmFwaCkgewogIExpc3Q8TGlzdDxUPj4gcmVzdWx0ID0gPExpc3Q8VD4+W107CiAgaW50IGNvdW50ID0gMDsKICBNYXA8VCwgaW50PiBwcmVvcmRlck51bWJlcnMgPSA8VCwgaW50Pnt9OwogIExpc3Q8VD4gdW5hc3NpZ25lZCA9IDxUPltdOwogIExpc3Q8VD4gY2FuZGlkYXRlcyA9IDxUPltdOwogIFNldDxUPiBhc3NpZ25lZCA9IG5ldyBTZXQ8VD4oKTsKCiAgdm9pZCByZWN1cnNpdmVseVNlYXJjaChUIHZlcnRleCkgewogICAgLy8gU3RlcCAxOiBTZXQgdGhlIHByZW9yZGVyIG51bWJlciBvZiBbdmVydGV4XSB0byBbY291bnRdLCBhbmQgaW5jcmVtZW50CiAgICAvLyBbY291bnRdLgogICAgcHJlb3JkZXJOdW1iZXJzW3ZlcnRleF0gPSBjb3VudCsrOwoKICAgIC8vIFN0ZXAgMjogUHVzaCBbdmVydGV4XSBvbnRvIFt1bmFzc2lnbmVkXSBhbmQgYWxzbyBvbnRvIFtjYW5kaWRhdGVzXS4KICAgIHVuYXNzaWduZWQuYWRkKHZlcnRleCk7CiAgICBjYW5kaWRhdGVzLmFkZCh2ZXJ0ZXgpOwoKICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggZWRnZSBmcm9tIFt2ZXJ0ZXhdIHRvIGEgbmVpZ2hib3JpbmcgdmVydGV4IFtuZWlnaGJvcl06CiAgICBmb3IgKFQgbmVpZ2hib3IgaW4gZ3JhcGgubmVpZ2hib3JzT2YodmVydGV4KSkgewogICAgICBpbnQgbmVpZ2hib3JQcmVvcmRlck51bWJlciA9IHByZW9yZGVyTnVtYmVyc1tuZWlnaGJvcl07CiAgICAgIGlmIChuZWlnaGJvclByZW9yZGVyTnVtYmVyID09IG51bGwpIHsKICAgICAgICAvLyBJZiB0aGUgcHJlb3JkZXIgbnVtYmVyIG9mIFtuZWlnaGJvcl0gaGFzIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCwKICAgICAgICAvLyByZWN1cnNpdmVseSBzZWFyY2ggW25laWdoYm9yXTsKICAgICAgICByZWN1cnNpdmVseVNlYXJjaChuZWlnaGJvcik7CiAgICAgIH0gZWxzZSBpZiAoIWFzc2lnbmVkLmNvbnRhaW5zKG5laWdoYm9yKSkgewogICAgICAgIC8vIE90aGVyd2lzZSwgaWYgW25laWdoYm9yXSBoYXMgbm90IHlldCBiZWVuIGFzc2lnbmVkIHRvIGEgc3Ryb25nbHkKICAgICAgICAvLyBjb25uZWN0ZWQgY29tcG9uZW50OgogICAgICAgIC8vCiAgICAgICAgLy8gKiBSZXBlYXRlZGx5IHBvcCB2ZXJ0aWNlcyBmcm9tIFtjYW5kaWRhdGVzXSB1bnRpbCB0aGUgdG9wIGVsZW1lbnQgb2YKICAgICAgICAvLyAgIFtjYW5kaWRhdGVzXSBoYXMgYSBwcmVvcmRlciBudW1iZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQogICAgICAgIC8vICAgcHJlb3JkZXIgbnVtYmVyIG9mIFtuZWlnaGJvcl0uCiAgICAgICAgd2hpbGUgKHByZW9yZGVyTnVtYmVyc1tjYW5kaWRhdGVzLmxhc3RdID4gbmVpZ2hib3JQcmVvcmRlck51bWJlcikgewogICAgICAgICAgY2FuZGlkYXRlcy5yZW1vdmVMYXN0KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBTdGVwIDQ6IElmIFt2ZXJ0ZXhdIGlzIHRoZSB0b3AgZWxlbWVudCBvZiBbY2FuZGlkYXRlc106CiAgICBpZiAoY2FuZGlkYXRlcy5sYXN0ID09IHZlcnRleCkgewogICAgICAvLyBQb3AgdmVydGljZXMgZnJvbSBbdW5hc3NpZ25lZF0gdW50aWwgW3ZlcnRleF0gaGFzIGJlZW4gcG9wcGVkLCBhbmQKICAgICAgLy8gYXNzaWduIHRoZSBwb3BwZWQgdmVydGljZXMgdG8gYSBuZXcgY29tcG9uZW50LgogICAgICBMaXN0PFQ+IGNvbXBvbmVudCA9IDxUPltdOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIFQgdG9wID0gdW5hc3NpZ25lZC5yZW1vdmVMYXN0KCk7CiAgICAgICAgY29tcG9uZW50LmFkZCh0b3ApOwogICAgICAgIGFzc2lnbmVkLmFkZCh0b3ApOwogICAgICAgIGlmICh0b3AgPT0gdmVydGV4KSBicmVhazsKICAgICAgfQogICAgICByZXN1bHQuYWRkKGNvbXBvbmVudCk7CgogICAgICAvLyBQb3AgW3ZlcnRleF0gZnJvbSBbY2FuZGlkYXRlc10uCiAgICAgIGNhbmRpZGF0ZXMucmVtb3ZlTGFzdCgpOwogICAgfQogIH0KCiAgZm9yIChUIHZlcnRleCBpbiBncmFwaC52ZXJ0aWNlcykgewogICAgaWYgKHByZW9yZGVyTnVtYmVyc1t2ZXJ0ZXhdID09IG51bGwpIHsKICAgICAgcmVjdXJzaXZlbHlTZWFyY2godmVydGV4KTsKICAgIH0KICB9CgogIHJldHVybiByZXN1bHQ7Cn0KUQBNTj8BFQEaHAElAgE7BEwPVzsmESweHiIBJU0QJwFLHBwBTzQ+LEsqJTFMIAtQSixMIwoIBj8lTDghFSkcGyIIHQEpHwYEASUrIQYEARECAR5wYWNrYWdlOmtlcm5lbC91dGlsL2dyYXBoLmRhcnRpZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0gnQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5keW5hbWljX3R5cGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGU7CgppbXBvcnQgJ2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIER5bmFtaWNUeXBlQnVpbGRlciBleHRlbmRzIEJ1aWx0aW5UeXBlQnVpbGRlciB7CiAgRHluYW1pY1R5cGVCdWlsZGVyKAogICAgICBEYXJ0VHlwZSB0eXBlLCBMaWJyYXJ5QnVpbGRlciBjb21waWxhdGlvblVuaXQsIGludCBjaGFyT2Zmc2V0KQogICAgICA6IHN1cGVyKCJkeW5hbWljIiwgdHlwZSwgY29tcGlsYXRpb25Vbml0LCBjaGFyT2Zmc2V0KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkR5bmFtaWNUeXBlQnVpbGRlciI7Cn0KFABOTjwBJAEwASQfATYWRT0BMAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnRoZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvZGlsbC9kaWxsX2V4dGVuc2lvbl9idWlsZGVyLmRhcnSLoi8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICdkaWxsX2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnZGlsbF9leHRlbnNpb25fbWVtYmVyX2J1aWxkZXIuZGFydCc7CgpjbGFzcyBEaWxsRXh0ZW5zaW9uQnVpbGRlciBleHRlbmRzIEV4dGVuc2lvbkJ1aWxkZXJJbXBsIHsKICBmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uOwogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gX3R5cGVQYXJhbWV0ZXJzOwogIFR5cGVCdWlsZGVyIF9vblR5cGU7CgogIERpbGxFeHRlbnNpb25CdWlsZGVyKHRoaXMuZXh0ZW5zaW9uLCBMaWJyYXJ5QnVpbGRlciBwYXJlbnQpCiAgICAgIDogc3VwZXIoCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4dGVuc2lvbi5uYW1lLAogICAgICAgICAgICBwYXJlbnQsCiAgICAgICAgICAgIGV4dGVuc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICBuZXcgU2NvcGUoCiAgICAgICAgICAgICAgICBsb2NhbDogPFN0cmluZywgTWVtYmVyQnVpbGRlcj57fSwKICAgICAgICAgICAgICAgIHNldHRlcnM6IDxTdHJpbmcsIE1lbWJlckJ1aWxkZXI+e30sCiAgICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudC5zY29wZSwKICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogImV4dGVuc2lvbiAke2V4dGVuc2lvbi5uYW1lfSIsCiAgICAgICAgICAgICAgICBpc01vZGlmaWFibGU6IGZhbHNlKSwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCkgewogICAgTWFwPE5hbWUsIEV4dGVuc2lvbk1lbWJlckRlc2NyaXB0b3I+IF9tZXRob2RzID0ge307CiAgICBNYXA8TmFtZSwgTWVtYmVyPiBfdGVhck9mZnMgPSB7fTsKICAgIGZvciAoRXh0ZW5zaW9uTWVtYmVyRGVzY3JpcHRvciBkZXNjcmlwdG9yIGluIGV4dGVuc2lvbi5tZW1iZXJzKSB7CiAgICAgIE5hbWUgbmFtZSA9IGRlc2NyaXB0b3IubmFtZTsKICAgICAgc3dpdGNoIChkZXNjcmlwdG9yLmtpbmQpIHsKICAgICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuTWV0aG9kOgogICAgICAgICAgX21ldGhvZHNbbmFtZV0gPSBkZXNjcmlwdG9yOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFeHRlbnNpb25NZW1iZXJLaW5kLlRlYXJPZmY6CiAgICAgICAgICBfdGVhck9mZnNbbmFtZV0gPSBkZXNjcmlwdG9yLm1lbWJlci5hc01lbWJlcjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5HZXR0ZXI6CiAgICAgICAgY2FzZSBFeHRlbnNpb25NZW1iZXJLaW5kLk9wZXJhdG9yOgogICAgICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5GaWVsZDoKICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBkZXNjcmlwdG9yLm1lbWJlci5hc01lbWJlcjsKICAgICAgICAgIHNjb3BlQnVpbGRlci5hZGRNZW1iZXIobmFtZS5uYW1lLAogICAgICAgICAgICAgIG5ldyBEaWxsRXh0ZW5zaW9uTWVtYmVyQnVpbGRlcihtZW1iZXIsIGRlc2NyaXB0b3IsIHRoaXMpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5TZXR0ZXI6CiAgICAgICAgICBNZW1iZXIgbWVtYmVyID0gZGVzY3JpcHRvci5tZW1iZXIuYXNNZW1iZXI7CiAgICAgICAgICBzY29wZUJ1aWxkZXIuYWRkU2V0dGVyKG5hbWUubmFtZSwKICAgICAgICAgICAgICBuZXcgRGlsbEV4dGVuc2lvbk1lbWJlckJ1aWxkZXIobWVtYmVyLCBkZXNjcmlwdG9yLCB0aGlzKSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgX21ldGhvZHMuZm9yRWFjaCgoTmFtZSBuYW1lLCBFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKICAgICAgTWVtYmVyIG1lbWJlciA9IGRlc2NyaXB0b3IubWVtYmVyLmFzTWVtYmVyOwogICAgICBzY29wZUJ1aWxkZXIuYWRkTWVtYmVyKAogICAgICAgICAgbmFtZS5uYW1lLAogICAgICAgICAgbmV3IERpbGxFeHRlbnNpb25NZW1iZXJCdWlsZGVyKAogICAgICAgICAgICAgIG1lbWJlciwgZGVzY3JpcHRvciwgdGhpcywgX3RlYXJPZmZzW25hbWVdKSk7CiAgICB9KTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gZ2V0IHR5cGVQYXJhbWV0ZXJzIHsKICAgIGlmIChfdHlwZVBhcmFtZXRlcnMgPT0gbnVsbCAmJiBleHRlbnNpb24udHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBfdHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgY29tcHV0ZVR5cGVWYXJpYWJsZUJ1aWxkZXJzKGxpYnJhcnksIGV4dGVuc2lvbi50eXBlUGFyYW1ldGVycyk7CiAgICB9CiAgICByZXR1cm4gX3R5cGVQYXJhbWV0ZXJzOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUJ1aWxkZXIgZ2V0IG9uVHlwZSB7CiAgICBpZiAoX29uVHlwZSA9PSBudWxsKSB7CiAgICAgIF9vblR5cGUgPSBsaWJyYXJ5LmxvYWRlci5jb21wdXRlVHlwZUJ1aWxkZXIoZXh0ZW5zaW9uLm9uVHlwZSk7CiAgICB9CiAgICByZXR1cm4gX29uVHlwZTsKICB9Cn0KXABOTjwBIgEiASwqKScwARgBIi0BOh0tFwE+DxIPHBQiFzI0JjomEhQ4JkYjISknESo4ESkrKDYsSREpNixJEQgGSTIeFSo7CAQBDDFKGEoGHAQBDBsbRQYUBAIBPHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfZXh0ZW5zaW9uX2J1aWxkZXIuZGFydF1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9kaWxsL2RpbGxfbG9hZGVyLmRhcnSPIC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmRpbGxfbG9hZGVyOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgQ2xhc3MsIENvbXBvbmVudCwgRGFydFR5cGUsIExpYnJhcnk7CgppbXBvcnQgJy4uL2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cgU3VtbWFyeVRlbXBsYXRlLCBUZW1wbGF0ZSwgdGVtcGxhdGVEaWxsT3V0bGluZVN1bW1hcnk7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlX2J1aWxkZXJfY29tcHV0ZXIuZGFydCcgc2hvdyBUeXBlQnVpbGRlckNvbXB1dGVyOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXI7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0JyBzaG93IFNvdXJjZUxvYWRlcjsKCmltcG9ydCAnLi4vdGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnQnIHNob3cgVGFyZ2V0SW1wbGVtZW50YXRpb247CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdkaWxsX3RhcmdldC5kYXJ0JyBzaG93IERpbGxUYXJnZXQ7CgpjbGFzcyBEaWxsTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICBTb3VyY2VMb2FkZXIgY3VycmVudFNvdXJjZUxvYWRlcjsKCiAgRGlsbExvYWRlcihUYXJnZXRJbXBsZW1lbnRhdGlvbiB0YXJnZXQpIDogc3VwZXIodGFyZ2V0KTsKCiAgVGVtcGxhdGU8U3VtbWFyeVRlbXBsYXRlPiBnZXQgb3V0bGluZVN1bW1hcnlUZW1wbGF0ZSA9PgogICAgICB0ZW1wbGF0ZURpbGxPdXRsaW5lU3VtbWFyeTsKCiAgLy8vIEFwcGVuZCBjb21waWxlZCBsaWJyYXJpZXMgZnJvbSB0aGUgZ2l2ZW4gW2NvbXBvbmVudF0uIElmIHRoZSBbZmlsdGVyXSBpcwogIC8vLyBwcm92aWRlZCwgYXBwZW5kIG9ubHkgbGlicmFyaWVzIHdob3NlIFtVcmldIGlzIGFjY2VwdGVkIGJ5IHRoZSBbZmlsdGVyXS4KICBMaXN0PERpbGxMaWJyYXJ5QnVpbGRlcj4gYXBwZW5kTGlicmFyaWVzKENvbXBvbmVudCBjb21wb25lbnQsCiAgICAgIHtib29sIGZpbHRlcihVcmkgdXJpKSwgaW50IGJ5dGVDb3VudDogMH0pIHsKICAgIExpc3Q8TGlicmFyeT4gY29tcG9uZW50TGlicmFyaWVzID0gY29tcG9uZW50LmxpYnJhcmllczsKICAgIExpc3Q8VXJpPiByZXF1ZXN0ZWRMaWJyYXJpZXMgPSA8VXJpPltdOwogICAgRGlsbFRhcmdldCB0YXJnZXQgPSB0aGlzLnRhcmdldDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50TGlicmFyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IGNvbXBvbmVudExpYnJhcmllc1tpXTsKICAgICAgVXJpIHVyaSA9IGxpYnJhcnkuaW1wb3J0VXJpOwogICAgICBpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyKGxpYnJhcnkuaW1wb3J0VXJpKSkgewogICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeSk7CiAgICAgICAgdGFyZ2V0LmFkZExpYnJhcnkobGlicmFyeSk7CiAgICAgICAgcmVxdWVzdGVkTGlicmFyaWVzLmFkZCh1cmkpOwogICAgICB9CiAgICB9CiAgICBMaXN0PERpbGxMaWJyYXJ5QnVpbGRlcj4gcmVzdWx0ID0gPERpbGxMaWJyYXJ5QnVpbGRlcj5bXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdGVkTGlicmFyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdC5hZGQocmVhZChyZXF1ZXN0ZWRMaWJyYXJpZXNbaV0sIC0xKSk7CiAgICB9CiAgICB0YXJnZXQudXJpVG9Tb3VyY2UuYWRkQWxsKGNvbXBvbmVudC51cmlUb1NvdXJjZSk7CiAgICB0aGlzLmJ5dGVDb3VudCArPSBieXRlQ291bnQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEFwcGVuZCBzaW5nbGUgY29tcGlsZWQgbGlicmFyeS4KICAvLy8KICAvLy8gTm90ZSB0aGF0IGFzIHRoaXMgb25seSB0YWtlcyBhIGxpYnJhcnksIG5vIG5ldyBzb3VyY2VzIGlzIGFkZGVkIHRvIHRoZQogIC8vLyB1cmlUb1NvdXJjZSBtYXAuCiAgRGlsbExpYnJhcnlCdWlsZGVyIGFwcGVuZExpYnJhcnkoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICAvLyBBZGQgdG8gbGlzdCBvZiBsaWJyYXJpZXMgaW4gdGhlIGxvYWRlciwgdXNlZCBmb3IgZS5nLiBsaW5raW5nLgogICAgbGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKCiAgICAvLyBXZWlyZCBpbnRlcmFjdGlvbiBiZWdpbnMuCiAgICBEaWxsVGFyZ2V0IHRhcmdldCA9IHRoaXMudGFyZ2V0OwogICAgLy8gQ3JlYXRlIGRpbGwgbGlicmFyeSBidWlsZGVyIChhZGRzIGl0IHRvIGEgbWFwIHdoZXJlIGl0J3MgZmV0Y2hlZAogICAgLy8gYWdhaW4gbW9tZW50YXJpbHkpLgogICAgdGFyZ2V0LmFkZExpYnJhcnkobGlicmFyeSk7CiAgICAvLyBTZXQgdXAgdGhlIGRpbGwgbGlicmFyeSBidWlsZGVyIChmZXRjaCBpdCBmcm9tIHRoZSBtYXAgYWdhaW4sIGFkZCBpdCB0bwogICAgLy8gYW5vdGhlciBtYXAgYW5kIHNldHVwIHNvbWUgYXV4aWxpYXJ5IHRoaW5ncykuCiAgICByZXR1cm4gcmVhZChsaWJyYXJ5LmltcG9ydFVyaSwgLTEsIGZpbGVVcmk6IGxpYnJhcnkuZmlsZVVyaSk7CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRPdXRsaW5lKERpbGxMaWJyYXJ5QnVpbGRlciBidWlsZGVyKSBhc3luYyB7CiAgICBpZiAoYnVpbGRlci5saWJyYXJ5ID09IG51bGwpIHsKICAgICAgdW5oYW5kbGVkKCJudWxsIiwgImJ1aWxkZXIubGlicmFyeSIsIDAsIGJ1aWxkZXIuZmlsZVVyaSk7CiAgICB9CiAgICBidWlsZGVyLm1hcmtBc1JlYWR5VG9CdWlsZCgpOwogIH0KCiAgRnV0dXJlPE51bGw+IGJ1aWxkQm9keShEaWxsTGlicmFyeUJ1aWxkZXIgYnVpbGRlcikgewogICAgcmV0dXJuIGJ1aWxkT3V0bGluZShidWlsZGVyKTsKICB9CgogIHZvaWQgZmluYWxpemVFeHBvcnRzKHtib29sIHN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzOiBmYWxzZX0pIHsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgRGlsbExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBidWlsZGVyOwogICAgICBsaWJyYXJ5Lm1hcmtBc1JlYWR5VG9GaW5hbGl6ZUV4cG9ydHMoCiAgICAgICAgICBzdXBwcmVzc0ZpbmFsaXphdGlvbkVycm9yczogc3VwcHJlc3NGaW5hbGl6YXRpb25FcnJvcnMpOwogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzc0J1aWxkZXIgY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhDbGFzcyBjbHMpIHsKICAgIExpYnJhcnkga2VybmVsTGlicmFyeSA9IGNscy5lbmNsb3NpbmdMaWJyYXJ5OwogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGJ1aWxkZXJzW2tlcm5lbExpYnJhcnkuaW1wb3J0VXJpXTsKICAgIHJldHVybiBsaWJyYXJ5Lmxvb2t1cExvY2FsTWVtYmVyKGNscy5uYW1lLCByZXF1aXJlZDogdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciBjb21wdXRlVHlwZUJ1aWxkZXIoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUuYWNjZXB0KG5ldyBUeXBlQnVpbGRlckNvbXB1dGVyKHRoaXMpKTsKICB9Cn0KcwBOTjwBGwEhAUsBKConAR1AAUgBJQEqATkBQgE8ASsBIiQBOwE6IgFPT0AyPCwlOi8jOSAkJQgGPjozBjYhEwQBJgZNFzZGHAEhJUgbIE81QgQBQCNABiIEATciBAFDOSwsQwgEAQw/MkBABAEMMjcEAgExcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9sb2FkZXIuZGFydGlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9kaWxsL2RpbGxfdHlwZV9hbGlhc19idWlsZGVyLmRhcnSKky8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmRpbGxfdHlwZWRlZl9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgVHlwZWRlZiwgSW50ZXJmYWNlVHlwZTsKCmltcG9ydCAnLi4vYnVpbGRlci9mdW5jdGlvbl90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaW1wbGVtZW50ZWQ7CgppbXBvcnQgJ2RpbGxfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgRGlsbExpYnJhcnlCdWlsZGVyOwoKY2xhc3MgRGlsbFR5cGVBbGlhc0J1aWxkZXIgZXh0ZW5kcyBUeXBlQWxpYXNCdWlsZGVyIHsKICBEaWxsVHlwZUFsaWFzQnVpbGRlcihUeXBlZGVmIHR5cGVkZWYsIERpbGxMaWJyYXJ5QnVpbGRlciBwYXJlbnQpCiAgICAgIDogc3VwZXIobnVsbCwgdHlwZWRlZi5uYW1lLCBudWxsLCBudWxsLCBwYXJlbnQsIHR5cGVkZWYuZmlsZU9mZnNldCwKICAgICAgICAgICAgdHlwZWRlZjogdHlwZWRlZik7CgogIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBnZXQgbWV0YWRhdGEgewogICAgcmV0dXJuIHVuaW1wbGVtZW50ZWQoIm1ldGFkYXRhIiwgLTEsIG51bGwpOwogIH0KCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiBnZXQgdHlwZVZhcmlhYmxlcyB7CiAgICByZXR1cm4gdW5pbXBsZW1lbnRlZCgidHlwZVZhcmlhYmxlcyIsIC0xLCBudWxsKTsKICB9CgogIGludCB2YXJpYW5jZUF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHR5cGVkZWYudHlwZVBhcmFtZXRlcnNbaW5kZXhdLnZhcmlhbmNlOwogIH0KCiAgYm9vbCBnZXQgZnJvbURpbGwgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgaW50IGdldCB0eXBlVmFyaWFibGVzQ291bnQgPT4gdHlwZWRlZi50eXBlUGFyYW1ldGVycy5sZW5ndGg7CgogIEBvdmVycmlkZQogIEZ1bmN0aW9uVHlwZUJ1aWxkZXIgZ2V0IHR5cGUgewogICAgcmV0dXJuIHVuaW1wbGVtZW50ZWQoInR5cGUiLCAtMSwgbnVsbCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBidWlsZFRoaXNUeXBlKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgIHJldHVybiB0aGlzVHlwZSA/Pz0gdHlwZWRlZi50eXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxEYXJ0VHlwZT4gYnVpbGRUeXBlQXJndW1lbnRzKAogICAgICBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBMaXN0PFR5cGVCdWlsZGVyPiBhcmd1bWVudHMpIHsKICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBbdHlwZVZhcmlhYmxlc10gYXJlbid0IHJlc3RvcmVkIGZyb20gW3RhcmdldF0uCiAgICAvLyBTbywgaWYgW2FyZ3VtZW50c10gaXMgbnVsbCwgdGhlIGRlZmF1bHQgdHlwZXMgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tCiAgICAvLyBbY2xzLnR5cGVQYXJhbWV0ZXJzXS4KICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBMaXN0PERhcnRUeXBlPiByZXN1bHQgPSBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgdHlwZWRlZi50eXBlUGFyYW1ldGVycy5sZW5ndGgsIG51bGwsCiAgICAgICAgICBncm93YWJsZTogdHJ1ZSk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdHlwZWRlZi50eXBlUGFyYW1ldGVyc1tpXS5kZWZhdWx0VHlwZTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8vIFthcmd1bWVudHNdICE9IG51bGwKICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChhcmd1bWVudHMubGVuZ3RoLCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSBhcmd1bWVudHNbaV0uYnVpbGQobGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsQWxpYXMgewogICAgRGFydFR5cGUgZGFydFR5cGUgPSB0eXBlZGVmLnR5cGU7CiAgICBpZiAoZGFydFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBVcmkgaW1wb3J0VXJpID0gZGFydFR5cGUuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpOwogICAgICByZXR1cm4gZGFydFR5cGUuY2xhc3NOb2RlLm5hbWUgPT0gIk51bGwiICYmCiAgICAgICAgICBpbXBvcnRVcmkuc2NoZW1lID09ICJkYXJ0IiAmJgogICAgICAgICAgaW1wb3J0VXJpLnBhdGggPT0gImNvcmUiOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpaAE5OPAEkAUgBMCorLScwAS4BPAE2Q0ofAScwBAEwNQQBHjMEAR0BDD8BDCEsBAEMMyYEAQwlPU9OHR05LxswOwgVBgEbHEsuLwYTBAEMGSYlRTIoJAYSBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfdHlwZV9hbGlhc19idWlsZGVyLmRhcnRiZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdGFyZ2V0X2ltcGxlbWVudGF0aW9uLmRhcnSd8y8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnRhcmdldF9pbXBsZW1lbnRhdGlvbjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9zZXZlcml0eS5kYXJ0JyBzaG93IFNldmVyaXR5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBMaWJyYXJ5LCBTb3VyY2U7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnIGFzIGJhY2tlbmQgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJy4uL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydCcgc2hvdyBQcm9jZXNzZWRPcHRpb25zOwoKaW1wb3J0ICdidWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnY29tcGlsZXJfY29udGV4dC5kYXJ0JyBzaG93IENvbXBpbGVyQ29udGV4dDsKCmltcG9ydCAnbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKaW1wb3J0ICdtZXNzYWdlcy5kYXJ0JyBzaG93IEZvcm1hdHRlZE1lc3NhZ2UsIExvY2F0ZWRNZXNzYWdlLCBNZXNzYWdlOwoKaW1wb3J0ICdyZXdyaXRlX3NldmVyaXR5LmRhcnQnIHNob3cgcmV3cml0ZVNldmVyaXR5OwoKaW1wb3J0ICd0YXJnZXQuZGFydCcgc2hvdyBUYXJnZXQ7CgppbXBvcnQgJ3RpY2tlci5kYXJ0JyBzaG93IFRpY2tlcjsKCmltcG9ydCAndXJpX3RyYW5zbGF0b3IuZGFydCcgc2hvdyBVcmlUcmFuc2xhdG9yOwoKaW1wb3J0ICcuLi9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0JyBzaG93IEV4cGVyaW1lbnRhbEZsYWc7CgovLy8gUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdXNlZCBieSBhIGxvYWRlciBmb3IgYSB0YXJnZXQuCmFic3RyYWN0IGNsYXNzIFRhcmdldEltcGxlbWVudGF0aW9uIGV4dGVuZHMgVGFyZ2V0IHsKICBmaW5hbCBVcmlUcmFuc2xhdG9yIHVyaVRyYW5zbGF0b3I7CgogIGZpbmFsIGJhY2tlbmQuVGFyZ2V0IGJhY2tlbmRUYXJnZXQ7CgogIGZpbmFsIENvbXBpbGVyQ29udGV4dCBjb250ZXh0ID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQ7CgogIC8vLyBTaGFyZWQgd2l0aCBbQ29tcGlsZXJDb250ZXh0XS4KICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IHVyaVRvU291cmNlID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQudXJpVG9Tb3VyY2U7CgogIE1lbWJlckJ1aWxkZXIgY2FjaGVkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcjsKICBNZW1iZXJCdWlsZGVyIGNhY2hlZENvbXBpbGVUaW1lRXJyb3I7CiAgTWVtYmVyQnVpbGRlciBjYWNoZWREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yOwogIE1lbWJlckJ1aWxkZXIgY2FjaGVkTmF0aXZlQW5ub3RhdGlvbjsKCiAgYm9vbCBlbmFibGVFeHRlbnNpb25NZXRob2RzOwogIGJvb2wgZW5hYmxlTm9uTnVsbGFibGU7CiAgYm9vbCBlbmFibGVUcmlwbGVTaGlmdDsKICBib29sIGVuYWJsZVZhcmlhbmNlOwogIGJvb2wgZW5hYmxlTm9uZnVuY3Rpb25UeXBlQWxpYXNlczsKICBib29sIHBlcmZvcm1ObmJkQ2hlY2tzOwoKICBUYXJnZXRJbXBsZW1lbnRhdGlvbihUaWNrZXIgdGlja2VyLCB0aGlzLnVyaVRyYW5zbGF0b3IsIHRoaXMuYmFja2VuZFRhcmdldCkKICAgICAgOiBlbmFibGVFeHRlbnNpb25NZXRob2RzID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucwogICAgICAgICAgICAuaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnLmV4dGVuc2lvbk1ldGhvZHMpLAogICAgICAgIGVuYWJsZU5vbk51bGxhYmxlID0gQ29tcGlsZXJDb250ZXh0LmN1cnJlbnQub3B0aW9ucwogICAgICAgICAgICAuaXNFeHBlcmltZW50RW5hYmxlZChFeHBlcmltZW50YWxGbGFnLm5vbk51bGxhYmxlKSwKICAgICAgICBlbmFibGVUcmlwbGVTaGlmdCA9IENvbXBpbGVyQ29udGV4dC5jdXJyZW50Lm9wdGlvbnMKICAgICAgICAgICAgLmlzRXhwZXJpbWVudEVuYWJsZWQoRXhwZXJpbWVudGFsRmxhZy50cmlwbGVTaGlmdCksCiAgICAgICAgZW5hYmxlVmFyaWFuY2UgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zCiAgICAgICAgICAgIC5pc0V4cGVyaW1lbnRFbmFibGVkKEV4cGVyaW1lbnRhbEZsYWcudmFyaWFuY2UpLAogICAgICAgIGVuYWJsZU5vbmZ1bmN0aW9uVHlwZUFsaWFzZXMgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zCiAgICAgICAgICAgIC5pc0V4cGVyaW1lbnRFbmFibGVkKEV4cGVyaW1lbnRhbEZsYWcubm9uZnVuY3Rpb25UeXBlQWxpYXNlcyksCiAgICAgICAgcGVyZm9ybU5uYmRDaGVja3MgPSBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLnBlcmZvcm1ObmJkQ2hlY2tzLAogICAgICAgIHN1cGVyKHRpY2tlcik7CgogIC8vLyBDcmVhdGVzIGEgW0xpYnJhcnlCdWlsZGVyXSBjb3JyZXNwb25kaW5nIHRvIFt1cmldLCBpZiBvbmUgZG9lc24ndCBleGlzdAogIC8vLyBhbHJlYWR5LgogIC8vLwogIC8vLyBbZmlsZVVyaV0gbXVzdCBub3QgYmUgbnVsbCBhbmQgaXMgYSBVUkkgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIEZpbGVTeXN0ZW0KICAvLy8gdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUuCiAgLy8vCiAgLy8vIFtvcmlnaW5dIGlzIG5vbi1udWxsIGlmIHRoZSBjcmVhdGVkIGxpYnJhcnkgaXMgYSBwYXRjaCB0byBbb3JpZ2luXS4KICBMaWJyYXJ5QnVpbGRlciBjcmVhdGVMaWJyYXJ5QnVpbGRlcigKICAgICAgVXJpIHVyaSwKICAgICAgVXJpIGZpbGVVcmksCiAgICAgIGNvdmFyaWFudCBMaWJyYXJ5QnVpbGRlciBvcmlnaW4sCiAgICAgIExpYnJhcnkgcmVmZXJlbmNlc0Zyb20sCiAgICAgIGJvb2wgcmVmZXJlbmNlSXNQYXJ0T3duZXIpOwoKICAvLy8gVGhlIGNsYXNzIFtjbHNdIGlzIGludm9sdmVkIGluIGEgY3ljbGljIGRlZmluaXRpb24uIFRoaXMgbWV0aG9kIHNob3VsZAogIC8vLyBlbnN1cmUgdGhhdCB0aGUgY3ljbGUgaXMgYnJva2VuLCBmb3IgZXhhbXBsZSwgYnkgcmVtb3Zpbmcgc3VwZXJjbGFzcyBhbmQKICAvLy8gaW1wbGVtZW50ZWQgaW50ZXJmYWNlcy4KICB2b2lkIGJyZWFrQ3ljbGUoQ2xhc3NCdWlsZGVyIGNscyk7CgogIFVyaSB0cmFuc2xhdGVVcmkoVXJpIHVyaSkgPT4gdXJpVHJhbnNsYXRvci50cmFuc2xhdGUodXJpKTsKCiAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0cnVjdG9yIG9mCiAgLy8vIFtBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yXSBlcnJvci4gIFRoZSBjb25zdHJ1Y3RvciBpcyBleHBlY3RlZCB0bwogIC8vLyBhY2NlcHQgYSBzaW5nbGUgYXJndW1lbnQgb2YgdHlwZSBTdHJpbmcsIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZQogIC8vLyBhYnN0cmFjdCBjbGFzcy4KICBNZW1iZXJCdWlsZGVyIGdldEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IoTG9hZGVyIGxvYWRlcikgewogICAgaWYgKGNhY2hlZEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gY2FjaGVkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcjsKICAgIH0KICAgIHJldHVybiBjYWNoZWRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yID0KICAgICAgICBsb2FkZXIuY29yZUxpYnJhcnkuZ2V0Q29uc3RydWN0b3IoIkFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IiKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciB1c2VkIGZvciBjcmVhdGluZyBhIGNvbXBpbGUtdGltZQogIC8vLyBlcnJvci4gVGhlIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvIGFjY2VwdCBhIHNpbmdsZSBhcmd1bWVudCBvZiB0eXBlCiAgLy8vIFN0cmluZywgd2hpY2ggaXMgdGhlIGNvbXBpbGUtdGltZSBlcnJvciBtZXNzYWdlLgogIE1lbWJlckJ1aWxkZXIgZ2V0Q29tcGlsZVRpbWVFcnJvcihMb2FkZXIgbG9hZGVyKSB7CiAgICBpZiAoY2FjaGVkQ29tcGlsZVRpbWVFcnJvciAhPSBudWxsKSByZXR1cm4gY2FjaGVkQ29tcGlsZVRpbWVFcnJvcjsKICAgIHJldHVybiBjYWNoZWRDb21waWxlVGltZUVycm9yID0gbG9hZGVyLmNvcmVMaWJyYXJ5CiAgICAgICAgLmdldENvbnN0cnVjdG9yKCJfQ29tcGlsZVRpbWVFcnJvciIsIGJ5cGFzc0xpYnJhcnlQcml2YWN5OiB0cnVlKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciB1c2VkIGZvciBjcmVhdGluZyBhIHJ1bnRpbWUgZXJyb3IKICAvLy8gd2hlbiBhIGZpbmFsIGZpZWxkIGlzIGluaXRpYWxpemVkIHR3aWNlLiBUaGUgY29uc3RydWN0b3IgaXMgZXhwZWN0ZWQgdG8KICAvLy8gYWNjZXB0IGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KICBNZW1iZXJCdWlsZGVyIGdldER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IoTG9hZGVyIGxvYWRlcikgewogICAgaWYgKGNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gY2FjaGVkRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcjsKICAgIH0KICAgIHJldHVybiBjYWNoZWREdXBsaWNhdGVkRmllbGRJbml0aWFsaXplckVycm9yID0gbG9hZGVyLmNvcmVMaWJyYXJ5CiAgICAgICAgLmdldENvbnN0cnVjdG9yKCJfRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvciIsCiAgICAgICAgICAgIGJ5cGFzc0xpYnJhcnlQcml2YWN5OiB0cnVlKTsKICB9CgogIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdHJ1Y3RvciB1c2VkIGZvciBjcmVhdGluZyBgbmF0aXZlYAogIC8vLyBhbm5vdGF0aW9ucy4gVGhlIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvIGFjY2VwdCBhIHNpbmdsZSBhcmd1bWVudCBvZgogIC8vLyB0eXBlIFN0cmluZywgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIG5hdGl2ZSBtZXRob2QuCiAgTWVtYmVyQnVpbGRlciBnZXROYXRpdmVBbm5vdGF0aW9uKExvYWRlciBsb2FkZXIpIHsKICAgIGlmIChjYWNoZWROYXRpdmVBbm5vdGF0aW9uICE9IG51bGwpIHJldHVybiBjYWNoZWROYXRpdmVBbm5vdGF0aW9uOwogICAgTGlicmFyeUJ1aWxkZXIgaW50ZXJuYWwgPSBsb2FkZXIucmVhZChVcmkucGFyc2UoImRhcnQ6X2ludGVybmFsIiksIC0xLAogICAgICAgIGFjY2Vzc29yOiBsb2FkZXIuY29yZUxpYnJhcnkpOwogICAgcmV0dXJuIGNhY2hlZE5hdGl2ZUFubm90YXRpb24gPSBpbnRlcm5hbC5nZXRDb25zdHJ1Y3RvcigiRXh0ZXJuYWxOYW1lIik7CiAgfQoKICB2b2lkIGxvYWRFeHRyYVJlcXVpcmVkTGlicmFyaWVzKExvYWRlciBsb2FkZXIpIHsKICAgIGZvciAoU3RyaW5nIHVyaSBpbiBiYWNrZW5kVGFyZ2V0LmV4dHJhUmVxdWlyZWRMaWJyYXJpZXMpIHsKICAgICAgbG9hZGVyLnJlYWQoVXJpLnBhcnNlKHVyaSksIDAsIGFjY2Vzc29yOiBsb2FkZXIuY29yZUxpYnJhcnkpOwogICAgfQogICAgaWYgKGNvbnRleHQuY29tcGlsaW5nUGxhdGZvcm0pIHsKICAgICAgZm9yIChTdHJpbmcgdXJpIGluIGJhY2tlbmRUYXJnZXQuZXh0cmFSZXF1aXJlZExpYnJhcmllc1BsYXRmb3JtKSB7CiAgICAgICAgbG9hZGVyLnJlYWQoVXJpLnBhcnNlKHVyaSksIDAsIGFjY2Vzc29yOiBsb2FkZXIuY29yZUxpYnJhcnkpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFkZFNvdXJjZUluZm9ybWF0aW9uKAogICAgICBVcmkgaW1wb3J0VXJpLCBVcmkgZmlsZVVyaSwgTGlzdDxpbnQ+IGxpbmVTdGFydHMsIExpc3Q8aW50PiBzb3VyY2VDb2RlKTsKCiAgdm9pZCByZWFkUGF0Y2hGaWxlcyhjb3ZhcmlhbnQgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkge30KCiAgRm9ybWF0dGVkTWVzc2FnZSBjcmVhdGVGb3JtYXR0ZWRNZXNzYWdlKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsCiAgICAgIGludCBjaGFyT2Zmc2V0LAogICAgICBpbnQgbGVuZ3RoLAogICAgICBVcmkgZmlsZVVyaSwKICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gbWVzc2FnZUNvbnRleHQsCiAgICAgIFNldmVyaXR5IHNldmVyaXR5KSB7CiAgICBQcm9jZXNzZWRPcHRpb25zIHByb2Nlc3NlZE9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7CiAgICByZXR1cm4gcHJvY2Vzc2VkT3B0aW9ucy5mb3JtYXQoCiAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oZmlsZVVyaSwgY2hhck9mZnNldCwgbGVuZ3RoKSwKICAgICAgICBzZXZlcml0eSwKICAgICAgICBtZXNzYWdlQ29udGV4dCk7CiAgfQoKICBTZXZlcml0eSBmaXhTZXZlcml0eShTZXZlcml0eSBzZXZlcml0eSwgTWVzc2FnZSBtZXNzYWdlLCBVcmkgZmlsZVVyaSkgewogICAgc2V2ZXJpdHkgPz89IG1lc3NhZ2UuY29kZS5zZXZlcml0eTsKICAgIHJldHVybiByZXdyaXRlU2V2ZXJpdHkoc2V2ZXJpdHksIG1lc3NhZ2UuY29kZSwgZmlsZVVyaSk7CiAgfQoKICBTdHJpbmcgZ2V0IGN1cnJlbnRTZGtWZXJzaW9uIHsKICAgIHJldHVybiBDb21waWxlckNvbnRleHQuY3VycmVudC5vcHRpb25zLmN1cnJlbnRTZGtWZXJzaW9uOwogIH0KCiAgaW50IF9jdXJyZW50U2RrVmVyc2lvbk1ham9yOwogIGludCBfY3VycmVudFNka1ZlcnNpb25NaW5vcjsKICBpbnQgZ2V0IGN1cnJlbnRTZGtWZXJzaW9uTWFqb3IgewogICAgaWYgKF9jdXJyZW50U2RrVmVyc2lvbk1ham9yICE9IG51bGwpIHJldHVybiBfY3VycmVudFNka1ZlcnNpb25NYWpvcjsKICAgIF9wYXJzZUN1cnJlbnRTZGtWZXJzaW9uKCk7CiAgICByZXR1cm4gX2N1cnJlbnRTZGtWZXJzaW9uTWFqb3I7CiAgfQoKICBpbnQgZ2V0IGN1cnJlbnRTZGtWZXJzaW9uTWlub3IgewogICAgaWYgKF9jdXJyZW50U2RrVmVyc2lvbk1pbm9yICE9IG51bGwpIHJldHVybiBfY3VycmVudFNka1ZlcnNpb25NaW5vcjsKICAgIF9wYXJzZUN1cnJlbnRTZGtWZXJzaW9uKCk7CiAgICByZXR1cm4gX2N1cnJlbnRTZGtWZXJzaW9uTWlub3I7CiAgfQoKICB2b2lkIF9wYXJzZUN1cnJlbnRTZGtWZXJzaW9uKCkgewogICAgYm9vbCBnb29kID0gZmFsc2U7CiAgICBpZiAoY3VycmVudFNka1ZlcnNpb24gIT0gbnVsbCkgewogICAgICBMaXN0PFN0cmluZz4gZG90U2VwYXJhdGVkUGFydHMgPSBjdXJyZW50U2RrVmVyc2lvbi5zcGxpdCgiLiIpOwogICAgICBpZiAoZG90U2VwYXJhdGVkUGFydHMubGVuZ3RoID49IDIpIHsKICAgICAgICBfY3VycmVudFNka1ZlcnNpb25NYWpvciA9IGludC50cnlQYXJzZShkb3RTZXBhcmF0ZWRQYXJ0c1swXSk7CiAgICAgICAgX2N1cnJlbnRTZGtWZXJzaW9uTWlub3IgPSBpbnQudHJ5UGFyc2UoZG90U2VwYXJhdGVkUGFydHNbMV0pOwogICAgICAgIGdvb2QgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoIWdvb2QpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlVucGFyc2FibGUgc2RrIHZlcnNpb24gZ2l2ZW46ICRjdXJyZW50U2RrVmVyc2lvbiIpOwogICAgfQogIH0KCiAgdm9pZCByZWxlYXNlQW5jaWxsYXJ5UmVzb3VyY2VzKCk7Cn0KgM8ATk48ASUBTwE3AUQBPwElJyYBNQEiAUcBNQEiASIBMQFJAUc1JQEmATsBJUwBNyg3KAEfGhoXJRoBTkFFPEA8QDk9R0tPFwFODwZPKAZKJw8TJx4iAU1PHiUBPQEwT0gWRDk0BjNOBAFOTTc1RzdKBAFPTj9EOTQGRjwpBAFITjs1R0snTQQBMz9EBiVJRggGBAEdTwE7ASsXFhITKxs5JDsSGQQBSig9BAEhPgQBHx8jSR8kBAEjSR8kBAEjFyVFK0ZGFQgGEVAGBAEkAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3RhcmdldF9pbXBsZW1lbnRhdGlvbi5kYXJ0WmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2NvbmZpZ3VyYXRpb24uZGFydIHQLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuY29uZmlndXJhdGlvbjsKCmNsYXNzIENvbmZpZ3VyYXRpb24gewogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwogIGZpbmFsIFN0cmluZyBkb3R0ZWROYW1lOwogIGZpbmFsIFN0cmluZyBjb25kaXRpb247CiAgZmluYWwgU3RyaW5nIGltcG9ydFVyaTsKICBDb25maWd1cmF0aW9uKAogICAgICB0aGlzLmNoYXJPZmZzZXQsIHRoaXMuZG90dGVkTmFtZSwgdGhpcy5jb25kaXRpb24sIHRoaXMuaW1wb3J0VXJpKTsKfQoQAE5OPAEdARYYGxoaEUkCAS5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29uZmlndXJhdGlvbi5kYXJ0a2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0wAGSUC8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmNsYXNzX2hpZXJhcmNoeV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbjsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvZnV0dXJlX29yLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9sZWdhY3lfZXJhc3VyZS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvbm5iZF90b3BfbWVyZ2UuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL25vcm0uZGFydCc7CgppbXBvcnQgJy4uLy4uL3Rlc3RpbmcvaWRfdGVzdGluZ191dGlscy5kYXJ0JyBzaG93IHR5cGVUb1RleHQ7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWVtYmVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYWxpYXNfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vZGlsbC9kaWxsX21lbWJlcl9idWlsZGVyLmRhcnQnIHNob3cgRGlsbE1lbWJlckJ1aWxkZXI7CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXIsCiAgICAgICAgbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlLAogICAgICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QsCiAgICAgICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMSwKICAgICAgICBtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UyLAogICAgICAgIG1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0LAogICAgICAgIG1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2UsCiAgICAgICAgdGVtcGxhdGVDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMsCiAgICAgICAgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMsCiAgICAgICAgdGVtcGxhdGVDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZCwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbiwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlLAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uVXNlLAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uQ2F1c2UsCiAgICAgICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdDsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCcgc2hvdyBub1N1Y2hNZXRob2ROYW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCcgc2hvdyBTY29wZTsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydCcgc2hvdyBTb3VyY2VMb2FkZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3N0YW5kYXJkX2JvdW5kcy5kYXJ0JyBzaG93IFN0YW5kYXJkQm91bmRzOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydCcKICAgIHNob3cgVHlwZUNvbnN0cmFpbnRHYXRoZXJlcjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JyBzaG93IE1peGluSW5mZXJyZXI7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnQnIHNob3cgVHlwZUNvbnN0cmFpbnQ7CgppbXBvcnQgJ2ZvcndhcmRpbmdfbm9kZS5kYXJ0JyBzaG93IEZvcndhcmRpbmdOb2RlOwoKaW1wb3J0ICdrZXJuZWxfYnVpbGRlci5kYXJ0JyBzaG93IEltcGxpY2l0RmllbGRUeXBlOwoKaW1wb3J0ICd0eXBlcy5kYXJ0JyBzaG93IFR5cGVzOwoKY29uc3QgRGVidWdMb2dnZXIgZGVidWcgPQogICAgY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoImRlYnVnLmhpZXJhcmNoeSIpID8gY29uc3QgRGVidWdMb2dnZXIoKSA6IG51bGw7CgpjbGFzcyBEZWJ1Z0xvZ2dlciB7CiAgY29uc3QgRGVidWdMb2dnZXIoKTsKICB2b2lkIGxvZyhPYmplY3QgbWVzc2FnZSkgPT4gcHJpbnQobWVzc2FnZSk7Cn0KCmludCBjb21wYXJlRGVjbGFyYXRpb25zKENsYXNzTWVtYmVyIGEsIENsYXNzTWVtYmVyIGIpIHsKICBpZiAoYSA9PSBiKSByZXR1cm4gMDsKICByZXR1cm4gQ2xhc3NIaWVyYXJjaHkuY29tcGFyZU1lbWJlcnMoYS5tZW1iZXIsIGIubWVtYmVyKTsKfQoKUHJvY2VkdXJlS2luZCBtZW1iZXJLaW5kKE1lbWJlciBtZW1iZXIpIHsKICByZXR1cm4gbWVtYmVyIGlzIFByb2NlZHVyZSA/IG1lbWJlci5raW5kIDogbnVsbDsKfQoKYm9vbCBpc05hbWVWaXNpYmxlSW4oTmFtZSBuYW1lLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcikgewogIHJldHVybiAhbmFtZS5pc1ByaXZhdGUgfHwgbmFtZS5saWJyYXJ5ID09IGxpYnJhcnlCdWlsZGVyLmxpYnJhcnk7Cn0KCmFic3RyYWN0IGNsYXNzIENsYXNzTWVtYmVyIHsKICBib29sIGdldCBpc1N0YXRpYzsKICBib29sIGdldCBpc0ZpZWxkOwogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZTsKICBib29sIGdldCBpc1NldHRlcjsKICBib29sIGdldCBpc0dldHRlcjsKICBib29sIGdldCBpc0ZpbmFsOwogIGJvb2wgZ2V0IGlzQ29uc3Q7CiAgTWVtYmVyIGdldCBtZW1iZXI7CiAgYm9vbCBnZXQgaXNEdXBsaWNhdGU7CiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9yczsKICBDbGFzc0J1aWxkZXIgZ2V0IGNsYXNzQnVpbGRlcjsKICBVcmkgZ2V0IGZpbGVVcmk7CiAgaW50IGdldCBjaGFyT2Zmc2V0Owp9CgovLy8gUmV0dXJucyB0cnVlIGlmIFthXSBpcyBhIGNsYXNzIG1lbWJlciBjb25mbGljdCB3aXRoIFtiXS4gIFthXSBpcyBhc3N1bWVkIHRvCi8vLyBiZSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MsIFtiXSBpcyBhc3N1bWVkIHRvIGJlIGluaGVyaXRlZC4KLy8vCi8vLyBTZWUgdGhlIHNlY3Rpb24gbmFtZWQgIkNsYXNzIE1lbWJlciBDb25mbGljdHMiIGluIFtEYXJ0IFByb2dyYW1taW5nCi8vLyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uXSgKLy8vIC4uLy4uLy4uLy4uLy4uLy4uL2RvY3MvbGFuZ3VhZ2UvZGFydExhbmdTcGVjLnRleCNjbGFzc01lbWJlckNvbmZsaWN0cykuCmJvb2wgaXNJbmhlcml0YW5jZUNvbmZsaWN0KENsYXNzTWVtYmVyIGEsIENsYXNzTWVtYmVyIGIpIHsKICBpZiAoYS5pc1N0YXRpYykgcmV0dXJuIHRydWU7CiAgaWYgKG1lbWJlcktpbmQoYS5tZW1iZXIpID09IG1lbWJlcktpbmQoYi5tZW1iZXIpKSByZXR1cm4gZmFsc2U7CiAgaWYgKGEuaXNGaWVsZCkgcmV0dXJuICEoYi5pc0ZpZWxkIHx8IGIuaXNHZXR0ZXIgfHwgYi5pc1NldHRlcik7CiAgaWYgKGIuaXNGaWVsZCkgcmV0dXJuICEoYS5pc0ZpZWxkIHx8IGEuaXNHZXR0ZXIgfHwgYS5pc1NldHRlcik7CiAgaWYgKGEuaXNTZXR0ZXIpIHJldHVybiAhKGIuaXNHZXR0ZXIgfHwgYi5pc1NldHRlcik7CiAgaWYgKGIuaXNTZXR0ZXIpIHJldHVybiAhKGEuaXNHZXR0ZXIgfHwgYS5pc1NldHRlcik7CiAgaWYgKGEgaXMgSW50ZXJmYWNlQ29uZmxpY3QgfHwgYiBpcyBJbnRlcmZhY2VDb25mbGljdCkgcmV0dXJuIGZhbHNlOwogIHJldHVybiB0cnVlOwp9Cgpib29sIGltcGxpZXNTZXR0ZXIoQ2xhc3NNZW1iZXIgZGVjbGFyYXRpb24pIHsKICByZXR1cm4gZGVjbGFyYXRpb24uaXNBc3NpZ25hYmxlOwp9Cgpib29sIGhhc1NhbWVTaWduYXR1cmUoRnVuY3Rpb25Ob2RlIGEsIEZ1bmN0aW9uTm9kZSBiKSB7CiAgTGlzdDxUeXBlUGFyYW1ldGVyPiBhVHlwZVBhcmFtZXRlcnMgPSBhLnR5cGVQYXJhbWV0ZXJzOwogIExpc3Q8VHlwZVBhcmFtZXRlcj4gYlR5cGVQYXJhbWV0ZXJzID0gYi50eXBlUGFyYW1ldGVyczsKICBpbnQgdHlwZVBhcmFtZXRlckNvdW50ID0gYVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICBpZiAodHlwZVBhcmFtZXRlckNvdW50ICE9IGJUeXBlUGFyYW1ldGVycy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogIGlmICh0eXBlUGFyYW1ldGVyQ291bnQgIT0gMCkgewogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZVBhcmFtZXRlckNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlckNvdW50OyBpKyspIHsKICAgICAgdHlwZXNbaV0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUuZm9yQWxwaGFSZW5hbWluZygKICAgICAgICAgIGJUeXBlUGFyYW1ldGVyc1tpXSwgYVR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgIH0KICAgIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnMoYlR5cGVQYXJhbWV0ZXJzLCB0eXBlcyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIGFCb3VuZCA9IGFUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZDsKICAgICAgRGFydFR5cGUgYkJvdW5kID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJUeXBlUGFyYW1ldGVyc1tpXS5ib3VuZCk7CiAgICAgIGlmIChhQm91bmQgIT0gYkJvdW5kKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBpZiAoYS5yZXF1aXJlZFBhcmFtZXRlckNvdW50ICE9IGIucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOwogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYVBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gYS5wb3NpdGlvbmFsUGFyYW1ldGVyczsKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGJQb3NpdGlvbmFsUGFyYW1ldGVycyA9IGIucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgaWYgKGFQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggIT0gYlBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGludCBpID0gMDsgaSA8IGFQb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYVBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBiUGFyYW1ldGVyID0gYlBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgaWYgKGFQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQgIT0gYlBhcmFtZXRlci5pc0NvdmFyaWFudCkgcmV0dXJuIGZhbHNlOwogICAgRGFydFR5cGUgYVR5cGUgPSBhUGFyYW1ldGVyLnR5cGU7CiAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBiVHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICB9CiAgICBpZiAoYVR5cGUgIT0gYlR5cGUpIHJldHVybiBmYWxzZTsKICB9CgogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYU5hbWVkUGFyYW1ldGVycyA9IGEubmFtZWRQYXJhbWV0ZXJzOwogIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYk5hbWVkUGFyYW1ldGVycyA9IGIubmFtZWRQYXJhbWV0ZXJzOwogIGlmIChhTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAhPSBiTmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYU5hbWVkUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYU5hbWVkUGFyYW1ldGVyc1tpXTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9IGJOYW1lZFBhcmFtZXRlcnNbaV07CiAgICBpZiAoYVBhcmFtZXRlci5pc0NvdmFyaWFudCAhPSBiUGFyYW1ldGVyLmlzQ292YXJpYW50KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoYVBhcmFtZXRlci5uYW1lICE9IGJQYXJhbWV0ZXIubmFtZSkgcmV0dXJuIGZhbHNlOwogICAgRGFydFR5cGUgYVR5cGUgPSBhUGFyYW1ldGVyLnR5cGU7CiAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBiVHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICB9CiAgICBpZiAoYVR5cGUgIT0gYlR5cGUpIHJldHVybiBmYWxzZTsKICB9CgogIERhcnRUeXBlIGFSZXR1cm5UeXBlID0gYS5yZXR1cm5UeXBlOwogIERhcnRUeXBlIGJSZXR1cm5UeXBlID0gYi5yZXR1cm5UeXBlOwogIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgYlJldHVyblR5cGUgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlJldHVyblR5cGUpOwogIH0KCiAgcmV0dXJuIGFSZXR1cm5UeXBlID09IGJSZXR1cm5UeXBlOwp9CgpjbGFzcyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgewogIGZpbmFsIE1hcDxDbGFzcywgQ2xhc3NIaWVyYXJjaHlOb2RlPiBub2RlcyA9IDxDbGFzcywgQ2xhc3NIaWVyYXJjaHlOb2RlPnt9OwoKICBmaW5hbCBDbGFzc0J1aWxkZXIgb2JqZWN0Q2xhc3NCdWlsZGVyOwoKICBmaW5hbCBMb2FkZXIgbG9hZGVyOwoKICBmaW5hbCBDbGFzcyBvYmplY3RDbGFzczsKCiAgZmluYWwgQ2xhc3MgZnV0dXJlQ2xhc3M7CgogIGZpbmFsIENsYXNzIGZ1dHVyZU9yQ2xhc3M7CgogIGZpbmFsIENsYXNzIGZ1bmN0aW9uQ2xhc3M7CgogIGZpbmFsIENsYXNzIG51bGxDbGFzczsKCiAgZmluYWwgTGlzdDxEZWxheWVkT3ZlcnJpZGVDaGVjaz4gb3ZlcnJpZGVDaGVja3MgPSA8RGVsYXllZE92ZXJyaWRlQ2hlY2s+W107CgogIGZpbmFsIExpc3Q8RGVsYXllZE1lbWJlcj4gZGVsYXllZE1lbWJlckNoZWNrcyA9IDxEZWxheWVkTWVtYmVyPltdOwoKICAvLyBUT0RPKGRtaXRyeWFzKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhpcy4KICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwoKICBUeXBlcyB0eXBlczsKCiAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyKHRoaXMub2JqZWN0Q2xhc3NCdWlsZGVyLCB0aGlzLmxvYWRlciwgdGhpcy5jb3JlVHlwZXMpCiAgICAgIDogb2JqZWN0Q2xhc3MgPSBvYmplY3RDbGFzc0J1aWxkZXIuY2xzLAogICAgICAgIGZ1dHVyZUNsYXNzID0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzLAogICAgICAgIGZ1dHVyZU9yQ2xhc3MgPSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcywKICAgICAgICBmdW5jdGlvbkNsYXNzID0gY29yZVR5cGVzLmZ1bmN0aW9uQ2xhc3MsCiAgICAgICAgbnVsbENsYXNzID0gY29yZVR5cGVzLm51bGxDbGFzcyB7CiAgICB0eXBlcyA9IG5ldyBUeXBlcyh0aGlzKTsKICB9CgogIENsYXNzSGllcmFyY2h5Tm9kZSBnZXROb2RlRnJvbUNsYXNzQnVpbGRlcihDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyKSB7CiAgICByZXR1cm4gbm9kZXNbY2xhc3NCdWlsZGVyLmNsc10gPz89CiAgICAgICAgbmV3IENsYXNzSGllcmFyY2h5Tm9kZUJ1aWxkZXIodGhpcywgY2xhc3NCdWlsZGVyKS5idWlsZCgpOwogIH0KCiAgQ2xhc3NIaWVyYXJjaHlOb2RlIGdldE5vZGVGcm9tVHlwZUJ1aWxkZXIoVHlwZUJ1aWxkZXIgdHlwZSkgewogICAgQ2xhc3NCdWlsZGVyIGNscyA9IGdldENsYXNzKHR5cGUpOwogICAgcmV0dXJuIGNscyA9PSBudWxsID8gbnVsbCA6IGdldE5vZGVGcm9tQ2xhc3NCdWlsZGVyKGNscyk7CiAgfQoKICBDbGFzc0hpZXJhcmNoeU5vZGUgZ2V0Tm9kZUZyb21DbGFzcyhDbGFzcyBjbHMpIHsKICAgIHJldHVybiBub2Rlc1tjbHNdID8/CiAgICAgICAgZ2V0Tm9kZUZyb21DbGFzc0J1aWxkZXIobG9hZGVyLmNvbXB1dGVDbGFzc0J1aWxkZXJGcm9tVGFyZ2V0Q2xhc3MoY2xzKSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGFzU3VwZXJ0eXBlT2YoSW50ZXJmYWNlVHlwZSBzdWJ0eXBlLCBDbGFzcyBzdXBlcnR5cGUpIHsKICAgIGlmIChzdWJ0eXBlLmNsYXNzTm9kZSA9PSBzdXBlcnR5cGUpIHsKICAgICAgcmV0dXJuIHN1YnR5cGU7CiAgICB9CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgY2xzTm9kZSA9IGdldE5vZGVGcm9tQ2xhc3Moc3VidHlwZS5jbGFzc05vZGUpOwogICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1cGVydHlwZU5vZGUgPSBnZXROb2RlRnJvbUNsYXNzKHN1cGVydHlwZSk7CiAgICBMaXN0PERhcnRUeXBlPiBzdXBlcmNsYXNzZXMgPSBjbHNOb2RlLnN1cGVyY2xhc3NlczsKICAgIGludCBkZXB0aCA9IHN1cGVydHlwZU5vZGUuZGVwdGg7CiAgICBpZiAoZGVwdGggPCBzdXBlcmNsYXNzZXMubGVuZ3RoKSB7CiAgICAgIERhcnRUeXBlIHN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzZXNbZGVwdGhdOwogICAgICBpZiAoc3VwZXJjbGFzcyBpcyBJbnRlcmZhY2VUeXBlICYmIHN1cGVyY2xhc3MuY2xhc3NOb2RlID09IHN1cGVydHlwZSkgewogICAgICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoc3VidHlwZSkKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHN1cGVyY2xhc3MpOwogICAgICB9CiAgICB9CiAgICBMaXN0PERhcnRUeXBlPiBzdXBlcmludGVyZmFjZXMgPSBjbHNOb2RlLmludGVyZmFjZXM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdXBlcmludGVyZmFjZSA9IHN1cGVyaW50ZXJmYWNlc1tpXTsKICAgICAgaWYgKHN1cGVyaW50ZXJmYWNlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIHN1cGVyaW50ZXJmYWNlLmNsYXNzTm9kZSA9PSBzdXBlcnR5cGUpIHsKICAgICAgICByZXR1cm4gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKHN1YnR5cGUpCiAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZShzdXBlcmludGVyZmFjZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgSW50ZXJmYWNlVHlwZSBnZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MsIExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgQ2xhc3Mga2VybmVsQ2xhc3MgPSB0eXBlLmNsYXNzTm9kZTsKICAgIGlmIChrZXJuZWxDbGFzcyA9PSBzdXBlcmNsYXNzKSByZXR1cm4gdHlwZTsKICAgIGlmIChrZXJuZWxDbGFzcyA9PSBudWxsQ2xhc3MpIHsKICAgICAgaWYgKHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMuaXNFbXB0eSkgewogICAgICAgIHJldHVybiBjb3JlVHlwZXMucmF3VHlwZShzdXBlcmNsYXNzLCBjbGllbnRMaWJyYXJ5Lm51bGxhYmxlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGlzIGEgc2FmZSBmYWxsLWJhY2sgZm9yIGRlYWxpbmcgd2l0aCBgTnVsbGAuIEl0IHdpbGwgbGlrZWx5IGJlCiAgICAgICAgLy8gZmFzdGVyIHRvIGNoZWNrIGZvciBgTnVsbGAgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBzdXBlcmNsYXNzLAogICAgICAgICAgICBjbGllbnRMaWJyYXJ5Lm51bGxhYmxlLAogICAgICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKAogICAgICAgICAgICAgICAgc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5sZW5ndGgsIGNvcmVUeXBlcy5udWxsVHlwZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXNTdXBlcnR5cGVPZih0eXBlLCBzdXBlcmNsYXNzKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IGdldEtlcm5lbFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgQ2xhc3Mga2VybmVsQ2xhc3MgPSB0eXBlLmNsYXNzTm9kZTsKICAgIGlmIChrZXJuZWxDbGFzcyA9PSBzdXBlcmNsYXNzKSByZXR1cm4gdHlwZS50eXBlQXJndW1lbnRzOwogICAgaWYgKGtlcm5lbENsYXNzID09IG51bGxDbGFzcykgewogICAgICBpZiAoc3VwZXJjbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KSByZXR1cm4gY29uc3QgPERhcnRUeXBlPltdOwogICAgICByZXR1cm4gbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZCgKICAgICAgICAgIHN1cGVyY2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoLCBjb3JlVHlwZXMubnVsbFR5cGUpOwogICAgfQogICAgcmV0dXJuIGFzU3VwZXJ0eXBlT2YodHlwZSwgc3VwZXJjbGFzcyk/LnR5cGVBcmd1bWVudHM7CiAgfQoKICBJbnRlcmZhY2VUeXBlIGdldEtlcm5lbExlZ2FjeUxlYXN0VXBwZXJCb3VuZCgKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlMSwgSW50ZXJmYWNlVHlwZSB0eXBlMiwgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHJldHVybiB0eXBlMTsKCiAgICAvLyBMTFVCKE51bGwsIExpc3Q8ZHluYW1pYz4qKSB3b3JrcyBkaWZmZXJlbnRseSBmb3Igb3B0LWluIGFuZCBvcHQtb3V0CiAgICAvLyBsaWJyYXJpZXMuICBJbiBvcHQtb3V0IGxpYnJhcmllcyB0aGUgbGVnYWN5IGJlaGF2aW9yIGlzIHByZXNlcnZlZCwgc28KICAgIC8vIExMVUIoTnVsbCwgTGlzdDxkeW5hbWljPiopID0gTGlzdDxkeW5hbWljPiouICBJbiBvcHQtb3V0IGxpYnJhcmllcyB0aGUKICAgIC8vIHJ1bGVzIGltcGx5IHRoYXQgTExVQihOdWxsLCBMaXN0PGR5bmFtaWM+KikgPSBMaXN0PGR5bmFtaWM+Py4KICAgIGlmICghY2xpZW50TGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIGlmICh0eXBlMSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUxLmNsYXNzTm9kZSA9PSBudWxsQ2xhc3MpIHsKICAgICAgICByZXR1cm4gdHlwZTI7CiAgICAgIH0KICAgICAgaWYgKHR5cGUyIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZTIuY2xhc3NOb2RlID09IG51bGxDbGFzcykgewogICAgICAgIHJldHVybiB0eXBlMTsKICAgICAgfQogICAgfQoKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlMSA9IGdldE5vZGVGcm9tQ2xhc3ModHlwZTEuY2xhc3NOb2RlKTsKICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlMiA9IGdldE5vZGVGcm9tQ2xhc3ModHlwZTIuY2xhc3NOb2RlKTsKICAgIFNldDxDbGFzc0hpZXJhcmNoeU5vZGU+IG5vZGVzMSA9IG5vZGUxLmNvbXB1dGVBbGxTdXBlck5vZGVzKHRoaXMpLnRvU2V0KCk7CiAgICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gbm9kZXMyID0gbm9kZTIuY29tcHV0ZUFsbFN1cGVyTm9kZXModGhpcyk7CiAgICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gY29tbW9uID0gPENsYXNzSGllcmFyY2h5Tm9kZT5bXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzMi5sZW5ndGg7IGkrKykgewogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgbm9kZSA9IG5vZGVzMltpXTsKICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGlmIChub2RlczEuY29udGFpbnMobm9kZSkpIHsKICAgICAgICBEYXJ0VHlwZSBjYW5kaWRhdGUxID0gZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZigKICAgICAgICAgICAgdHlwZTEsIG5vZGUuY2xhc3NCdWlsZGVyLmNscywgY2xpZW50TGlicmFyeSk7CiAgICAgICAgRGFydFR5cGUgY2FuZGlkYXRlMiA9IGdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgIHR5cGUyLCBub2RlLmNsYXNzQnVpbGRlci5jbHMsIGNsaWVudExpYnJhcnkpOwogICAgICAgIGlmIChjYW5kaWRhdGUxID09IGNhbmRpZGF0ZTIpIHsKICAgICAgICAgIGNvbW1vbi5hZGQobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGNvbW1vbi5sZW5ndGggPT0gMSkgewogICAgICByZXR1cm4gY29yZVR5cGVzLm9iamVjdFJhd1R5cGUoCiAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICB9CiAgICBjb21tb24uc29ydChDbGFzc0hpZXJhcmNoeU5vZGUuY29tcGFyZU1heEluaGVyaXRhbmNlUGF0aCk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tb24ubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gY29tbW9uW2ldOwogICAgICBpZiAobm9kZS5tYXhJbmhlcml0YW5jZVBhdGggIT0gY29tbW9uW2kgKyAxXS5tYXhJbmhlcml0YW5jZVBhdGgpIHsKICAgICAgICByZXR1cm4gZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZigKICAgICAgICAgICAgICAgIHR5cGUxLCBub2RlLmNsYXNzQnVpbGRlci5jbHMsIGNsaWVudExpYnJhcnkpCiAgICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG8gewogICAgICAgICAgaSsrOwogICAgICAgIH0gd2hpbGUgKG5vZGUubWF4SW5oZXJpdGFuY2VQYXRoID09IGNvbW1vbltpICsgMV0ubWF4SW5oZXJpdGFuY2VQYXRoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvcmVUeXBlcy5vYmplY3RSYXdUeXBlKAogICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpKTsKICB9CgogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXJLZXJuZWwoQ2xhc3MgY2xzLCBOYW1lIG5hbWUsIGJvb2wgaXNTZXR0ZXIpIHsKICAgIHJldHVybiBnZXROb2RlRnJvbUNsYXNzKGNscykuZ2V0SW50ZXJmYWNlTWVtYmVyKG5hbWUsIGlzU2V0dGVyKT8ubWVtYmVyOwogIH0KCiAgTWVtYmVyIGdldERpc3BhdGNoVGFyZ2V0S2VybmVsKENsYXNzIGNscywgTmFtZSBuYW1lLCBib29sIGlzU2V0dGVyKSB7CiAgICByZXR1cm4gZ2V0Tm9kZUZyb21DbGFzcyhjbHMpLmdldERpc3BhdGNoVGFyZ2V0KG5hbWUsIGlzU2V0dGVyKT8ubWVtYmVyOwogIH0KCiAgTWVtYmVyIGdldENvbWJpbmVkTWVtYmVyU2lnbmF0dXJlS2VybmVsKENsYXNzIGNscywgTmFtZSBuYW1lLCBib29sIGlzU2V0dGVyLAogICAgICBpbnQgY2hhck9mZnNldCwgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgQ2xhc3NNZW1iZXIgZGVjbGFyYXRpb24gPQogICAgICAgIGdldE5vZGVGcm9tQ2xhc3MoY2xzKS5nZXRJbnRlcmZhY2VNZW1iZXIobmFtZSwgaXNTZXR0ZXIpOwogICAgaWYgKGRlY2xhcmF0aW9uPy5pc1N0YXRpYyA/PyB0cnVlKSByZXR1cm4gbnVsbDsKICAgIGlmIChkZWNsYXJhdGlvbi5pc0R1cGxpY2F0ZSkgewogICAgICBsaWJyYXJ5Py5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2Uud2l0aEFyZ3VtZW50cyhuYW1lLm5hbWUpLAogICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgIG5hbWUubmFtZS5sZW5ndGgsCiAgICAgICAgICBsaWJyYXJ5LmZpbGVVcmkpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChkZWNsYXJhdGlvbiBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5jaGVjayh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5tZW1iZXI7CiAgICB9CiAgfQoKICBzdGF0aWMgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkKENsYXNzQnVpbGRlciBvYmplY3RDbGFzcywKICAgICAgTGlzdDxDbGFzc0J1aWxkZXI+IGNsYXNzZXMsIFNvdXJjZUxvYWRlciBsb2FkZXIsIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkgPQogICAgICAgIG5ldyBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIob2JqZWN0Q2xhc3MsIGxvYWRlciwgY29yZVR5cGVzKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyID0gY2xhc3Nlc1tpXTsKICAgICAgaWYgKCFjbGFzc0J1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGhpZXJhcmNoeS5ub2Rlc1tjbGFzc0J1aWxkZXIuY2xzXSA9CiAgICAgICAgICAgIG5ldyBDbGFzc0hpZXJhcmNoeU5vZGVCdWlsZGVyKGhpZXJhcmNoeSwgY2xhc3NCdWlsZGVyKS5idWlsZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oYWhlKTogTWVyZ2UgdGhlIGluamVjdGVkIG1lbWJlcnMgb2YgcGF0Y2ggaW50byB0aGUgaGllcmFyY2h5CiAgICAgICAgLy8gbm9kZSBvZiBgY2xzLm9yaWdpbmAuCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBoaWVyYXJjaHk7CiAgfQp9CgpjbGFzcyBDbGFzc0hpZXJhcmNoeU5vZGVCdWlsZGVyIHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5OwoKICBmaW5hbCBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyOwoKICBib29sIGhhc05vU3VjaE1ldGhvZCA9IGZhbHNlOwoKICBMaXN0PENsYXNzTWVtYmVyPiBhYnN0cmFjdE1lbWJlcnMgPSBudWxsOwoKICBDbGFzc0hpZXJhcmNoeU5vZGVCdWlsZGVyKHRoaXMuaGllcmFyY2h5LCB0aGlzLmNsYXNzQnVpbGRlcik7CgogIENsYXNzQnVpbGRlciBnZXQgb2JqZWN0Q2xhc3MgPT4gaGllcmFyY2h5Lm9iamVjdENsYXNzQnVpbGRlcjsKCiAgYm9vbCBnZXQgc2hvdWxkTW9kaWZ5S2VybmVsID0+CiAgICAgIGNsYXNzQnVpbGRlci5saWJyYXJ5LmxvYWRlciA9PSBoaWVyYXJjaHkubG9hZGVyOwoKICBmaW5hbCBNYXA8Q2xhc3MsIFN1YnN0aXR1dGlvbj4gc3Vic3RpdHV0aW9ucyA9IDxDbGFzcywgU3Vic3RpdHV0aW9uPnt9OwoKICAvLy8gV2hlbiBtZXJnaW5nIGBhTGlzdGAgYW5kIGBiTGlzdGAsIFthXSAoZnJvbSBgYUxpc3RgKSBhbmQgW2JdIChmcm9tCiAgLy8vIGBiTGlzdGApIGVhY2ggaGF2ZSB0aGUgc2FtZSBuYW1lLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLnN1cGVyY2xhc3NgLCBbYV0gc2hvdWxkIG92ZXJyaWRlIFtiXS4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5pbnRlcmZhY2VzYCwgd2UgbmVlZCB0byByZWNvcmQgdGhlbSBhbmQKICAvLy8gc29sdmUgdGhlIGNvbmZsaWN0IGxhdGVyLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLnN1cGVydHlwZXNgLCBbYV0gc2hvdWxkIGltcGxlbWVudCBbYl0sIGFuZAogIC8vLyBbYl0gaXMgaW1wbGljaXRseSBhYnN0cmFjdC4KICBDbGFzc01lbWJlciBoYW5kbGVNZXJnZUNvbmZsaWN0KAogICAgICBDbGFzc01lbWJlciBhLCBDbGFzc01lbWJlciBiLCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICBkZWJ1Zz8ubG9nKAogICAgICAgICJoYW5kbGVNZXJnZUNvbmZsaWN0OiAke2Z1bGxOYW1lKGEpfSAke2Z1bGxOYW1lKGIpfSAke21lcmdlS2luZH0iKTsKICAgIC8vIFRPRE8oYWhlKTogRW5hYmxlIHRoaXMgb3B0aW1pemF0aW9uLCBidXQgYmUgY2FyZWZ1bCBhYm91dCBhYnN0cmFjdAogICAgLy8gbWV0aG9kcyBvdmVycmlkaW5nIGNvbmNyZXRlIG1ldGhvZHMuCiAgICAvLyBpZiAoY2xzIGlzIERpbGxDbGFzc0J1aWxkZXIpIHJldHVybiBhOwogICAgaWYgKGEgPT0gYikgcmV0dXJuIGE7CiAgICBpZiAoYS5pc0R1cGxpY2F0ZSB8fCBiLmlzRHVwbGljYXRlKSB7CiAgICAgIC8vIERvbid0IGNoZWNrIG92ZXJyaWRlcyBpbnZvbHZpbmcgZHVwbGljYXRlZCBtZW1iZXJzLgogICAgICByZXR1cm4gYTsKICAgIH0KICAgIENsYXNzTWVtYmVyIHJlc3VsdCA9IGNoZWNrSW5oZXJpdGFuY2VDb25mbGljdChhLCBiKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKICAgIHJlc3VsdCA9IGE7CiAgICBzd2l0Y2ggKG1lcmdlS2luZCkgewogICAgICBjYXNlIE1lcmdlS2luZC5zdXBlcmNsYXNzTWVtYmVyczoKICAgICAgY2FzZSBNZXJnZUtpbmQuc3VwZXJjbGFzc1NldHRlcnM6CiAgICAgICAgLy8gW2FdIGlzIGEgbWV0aG9kIGRlY2xhcmVkIGluIFtjbHNdLiBUaGlzIG1lYW5zIGl0IGRlZmluZXMgdGhlCiAgICAgICAgLy8gaW50ZXJmYWNlIG9mIHRoaXMgY2xhc3MgcmVnYXJkbGVzcyBpZiBpdHMgYWJzdHJhY3QuCiAgICAgICAgZGVidWc/LmxvZygic3VwZXJjbGFzczogY2hlY2tWYWxpZE92ZXJyaWRlKCIKICAgICAgICAgICAgIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSwgIgogICAgICAgICAgICAiJHtmdWxsTmFtZShhKX0sICR7ZnVsbE5hbWUoYil9KSIpOwogICAgICAgIGNoZWNrVmFsaWRPdmVycmlkZSgKICAgICAgICAgICAgYSwgQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24uc2VsZWN0QWJzdHJhY3QoYikpOwoKICAgICAgICBpZiAoaXNBYnN0cmFjdChhKSkgewogICAgICAgICAgaWYgKGlzQWJzdHJhY3QoYikpIHsKICAgICAgICAgICAgcmVjb3JkQWJzdHJhY3RNZW1iZXIoYSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIWNsYXNzQnVpbGRlci5pc0Fic3RyYWN0KSB7CiAgICAgICAgICAgICAgLy8gVGhlIGludGVyZmFjZSBvZiB0aGlzIGNsYXNzIGlzIFthXS4gQnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcwogICAgICAgICAgICAgIC8vIFtiXS4gU28gW2JdIG11c3QgaW1wbGVtZW50IFthXSwgdW5sZXNzIFtjbHNdIGlzIGFic3RyYWN0LgogICAgICAgICAgICAgIGNoZWNrVmFsaWRPdmVycmlkZShiLCBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQgPSBuZXcgQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24oCiAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIsCiAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24uc2VsZWN0Q29uY3JldGUoYiksCiAgICAgICAgICAgICAgICBtZXJnZUtpbmQuZm9yU2V0dGVycywKICAgICAgICAgICAgICAgIHNob3VsZE1vZGlmeUtlcm5lbCk7CiAgICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2xhc3NCdWlsZGVyLmlzTWl4aW5BcHBsaWNhdGlvbiAmJgogICAgICAgICAgICBhLmNsYXNzQnVpbGRlciAhPSBjbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIHJlc3VsdCA9IEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3QuY29tYmluZWQoCiAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLCBhLCBiLCBtZXJnZUtpbmQuZm9yU2V0dGVycywgc2hvdWxkTW9kaWZ5S2VybmVsLAogICAgICAgICAgICAgIGlzSW5oZXJpdGFibGVDb25mbGljdDogZmFsc2UpOwogICAgICAgICAgaWYgKHJlc3VsdCBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgTWVtYmVyIHRhcmdldCA9IHJlc3VsdC5tZW1iZXI7CiAgICAgICAgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyAhPSBvYmplY3RDbGFzcy5jbHMgJiYKICAgICAgICAgICAgdGFyZ2V0Lm5hbWUgPT0gbm9TdWNoTWV0aG9kTmFtZSkgewogICAgICAgICAgaGFzTm9TdWNoTWV0aG9kID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1lcmdlS2luZC5tZW1iZXJzV2l0aFNldHRlcnM6CiAgICAgIGNhc2UgTWVyZ2VLaW5kLnNldHRlcnNXaXRoTWVtYmVyczoKICAgICAgICBpZiAoYS5jbGFzc0J1aWxkZXIgPT0gY2xhc3NCdWlsZGVyICYmIGIuY2xhc3NCdWlsZGVyICE9IGNsYXNzQnVpbGRlcikgewogICAgICAgICAgaWYgKGEgaXMgRmllbGRCdWlsZGVyKSB7CiAgICAgICAgICAgIGlmIChhLmlzRmluYWwgJiYgYi5pc1NldHRlcikgewogICAgICAgICAgICAgIGhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcwogICAgICAgICAgICAgICAgICAuYWRkKG5ldyBEZWxheWVkT3ZlcnJpZGVDaGVjayhjbGFzc0J1aWxkZXIsIGEsIGIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoIWluZmVyRmllbGRUeXBlcyhhLCBiKSkgewogICAgICAgICAgICAgICAgaGllcmFyY2h5Lm92ZXJyaWRlQ2hlY2tzCiAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soY2xhc3NCdWlsZGVyLCBhLCBiKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGEgaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICAgICAgICBpZiAoIWluZmVyTWV0aG9kVHlwZXMoYSwgYikpIHsKICAgICAgICAgICAgICBoaWVyYXJjaHkub3ZlcnJpZGVDaGVja3MKICAgICAgICAgICAgICAgICAgLmFkZChuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soY2xhc3NCdWlsZGVyLCBhLCBiKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1lcmdlS2luZC5pbnRlcmZhY2VzTWVtYmVyczoKICAgICAgICByZXN1bHQgPSBJbnRlcmZhY2VDb25mbGljdC5jb21iaW5lZCgKICAgICAgICAgICAgY2xhc3NCdWlsZGVyLCBhLCBiLCBmYWxzZSwgc2hvdWxkTW9kaWZ5S2VybmVsKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgTWVyZ2VLaW5kLmludGVyZmFjZXNTZXR0ZXJzOgogICAgICAgIHJlc3VsdCA9IEludGVyZmFjZUNvbmZsaWN0LmNvbWJpbmVkKAogICAgICAgICAgICBjbGFzc0J1aWxkZXIsIGEsIGIsIHRydWUsIHNob3VsZE1vZGlmeUtlcm5lbCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1lcmdlS2luZC5zdXBlcnR5cGVzTWVtYmVyczoKICAgICAgY2FzZSBNZXJnZUtpbmQuc3VwZXJ0eXBlc1NldHRlcnM6CiAgICAgICAgLy8gW2JdIGlzIGluaGVyaXRlZCBmcm9tIGFuIGludGVyZmFjZSBzbyBpdCBpcyBpbXBsaWNpdGx5IGFic3RyYWN0LgoKICAgICAgICBhID0gQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb24uc2VsZWN0QWJzdHJhY3QoYSk7CiAgICAgICAgYiA9IEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uLnNlbGVjdEFic3RyYWN0KGIpOwoKICAgICAgICAvLyBJZiBbYV0gaXMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcywgaXQgZGVmaW5lcyB0aGUgaW50ZXJmYWNlLgogICAgICAgIGlmIChhLmNsYXNzQnVpbGRlciA9PSBjbGFzc0J1aWxkZXIpIHsKICAgICAgICAgIGRlYnVnPy5sb2coInN1cGVydHlwZXM6IGNoZWNrVmFsaWRPdmVycmlkZSgiCiAgICAgICAgICAgICAgIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSwgIgogICAgICAgICAgICAgICIke2Z1bGxOYW1lKGEpfSwgJHtmdWxsTmFtZShiKX0pIik7CiAgICAgICAgICBpZiAoYSBpcyEgRGVsYXllZE1lbWJlcikgewogICAgICAgICAgICBjaGVja1ZhbGlkT3ZlcnJpZGUoYSwgYik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYSBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgICAgICAgIGlmIChiIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgICAgICAgICBiLmFkZEFsbERlY2xhcmF0aW9uc1RvKGEuZGVjbGFyYXRpb25zKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhZGREZWNsYXJhdGlvbklmRGlmZmVyZW50KGIsIGEuZGVjbGFyYXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaXNBYnN0cmFjdChhKSkgewogICAgICAgICAgICByZXN1bHQgPSBJbnRlcmZhY2VDb25mbGljdC5jb21iaW5lZCgKICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlciwgYSwgYiwgbWVyZ2VLaW5kLmZvclNldHRlcnMsIHNob3VsZE1vZGlmeUtlcm5lbCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgPSBJbmhlcml0ZWRJbXBsZW1lbnRhdGlvbkludGVyZmFjZUNvbmZsaWN0LmNvbWJpbmVkKAogICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLCBhLCBiLCBtZXJnZUtpbmQuZm9yU2V0dGVycywgc2hvdWxkTW9kaWZ5S2VybmVsKTsKICAgICAgICAgIH0KICAgICAgICAgIGRlYnVnPy5sb2coInN1cGVydHlwZXM6ICR7cmVzdWx0fSIpOwogICAgICAgICAgaWYgKHJlc3VsdCBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQ2xhc3NNZW1iZXIgY2hlY2tJbmhlcml0YW5jZUNvbmZsaWN0KENsYXNzTWVtYmVyIGEsIENsYXNzTWVtYmVyIGIpIHsKICAgIGlmIChhIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgQ2xhc3NNZW1iZXIgcmVzdWx0OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuZGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgQ2xhc3NNZW1iZXIgZCA9IGNoZWNrSW5oZXJpdGFuY2VDb25mbGljdChhLmRlY2xhcmF0aW9uc1tpXSwgYik7CiAgICAgICAgcmVzdWx0ID8/PSBkOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoYiBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIENsYXNzTWVtYmVyIHJlc3VsdDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiLmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIENsYXNzTWVtYmVyIGQgPSBjaGVja0luaGVyaXRhbmNlQ29uZmxpY3QoYSwgYi5kZWNsYXJhdGlvbnNbaV0pOwogICAgICAgIHJlc3VsdCA/Pz0gZDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGlzSW5oZXJpdGFuY2VDb25mbGljdChhLCBiKSkgewogICAgICByZXBvcnRJbmhlcml0YW5jZUNvbmZsaWN0KGEsIGIpOwogICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCBpbmZlck1ldGhvZFR5cGVzKFByb2NlZHVyZUJ1aWxkZXIgYSwgQ2xhc3NNZW1iZXIgYikgewogICAgZGVidWc/LmxvZygKICAgICAgICAiVHJ5aW5nIHRvIGluZmVyIHR5cGVzIGZvciAke2Z1bGxOYW1lKGEpfSBiYXNlZCBvbiAke2Z1bGxOYW1lKGIpfSIpOwogICAgaWYgKGIgaXMgRGVsYXllZE1lbWJlcikgewogICAgICBib29sIGhhc1NhbWVTaWduYXR1cmUgPSB0cnVlOwogICAgICBMaXN0PENsYXNzTWVtYmVyPiBkZWNsYXJhdGlvbnMgPSBiLmRlY2xhcmF0aW9uczsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIWluZmVyTWV0aG9kVHlwZXMoYSwgZGVjbGFyYXRpb25zW2ldKSkgewogICAgICAgICAgaGFzU2FtZVNpZ25hdHVyZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaGFzU2FtZVNpZ25hdHVyZTsKICAgIH0KICAgIGlmIChhLmlzR2V0dGVyKSB7CiAgICAgIHJldHVybiBpbmZlckdldHRlclR5cGUoYSwgYik7CiAgICB9IGVsc2UgaWYgKGEuaXNTZXR0ZXIpIHsKICAgICAgcmV0dXJuIGluZmVyU2V0dGVyVHlwZShhLCBiKTsKICAgIH0KICAgIGJvb2wgaGFkVHlwZXNJbmZlcnJlZCA9IGEuaGFkVHlwZXNJbmZlcnJlZDsKICAgIENsYXNzQnVpbGRlciBhQ2xhc3NCdWlsZGVyID0gYS5wYXJlbnQ7CiAgICBTdWJzdGl0dXRpb24gYVN1YnN0aXR1dGlvbjsKICAgIGlmIChjbGFzc0J1aWxkZXIgIT0gYUNsYXNzQnVpbGRlcikgewogICAgICBhc3NlcnQoCiAgICAgICAgICBzdWJzdGl0dXRpb25zLmNvbnRhaW5zS2V5KGFDbGFzc0J1aWxkZXIuY2xzKSwKICAgICAgICAgICIke2NsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30gIgogICAgICAgICAgIiR7YUNsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30iKTsKICAgICAgYVN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnNbYUNsYXNzQnVpbGRlci5jbHNdOwogICAgICBkZWJ1Zz8ubG9nKCIke2NsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30gLT4gIgogICAgICAgICAgIiR7YUNsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30gJGFTdWJzdGl0dXRpb24iKTsKICAgIH0KICAgIENsYXNzQnVpbGRlciBiQ2xhc3NCdWlsZGVyID0gYi5jbGFzc0J1aWxkZXI7CiAgICBTdWJzdGl0dXRpb24gYlN1YnN0aXR1dGlvbjsKICAgIGlmIChjbGFzc0J1aWxkZXIgIT0gYkNsYXNzQnVpbGRlcikgewogICAgICBhc3NlcnQoCiAgICAgICAgICBzdWJzdGl0dXRpb25zLmNvbnRhaW5zS2V5KGJDbGFzc0J1aWxkZXIuY2xzKSwKICAgICAgICAgICJObyBzdWJzdGl0dXRpb24gZm91bmQgZm9yICcke2NsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30nIGFzICIKICAgICAgICAgICJpbnN0YW5jZSBvZiAnJHtiQ2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfScuIFN1YnN0aXR1dGlvbnMgIgogICAgICAgICAgImF2YWlsYWJsZSBmb3I6ICR7c3Vic3RpdHV0aW9ucy5rZXlzfSIpOwogICAgICBiU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1tiQ2xhc3NCdWlsZGVyLmNsc107CiAgICAgIGRlYnVnPy5sb2coIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAtPiAiCiAgICAgICAgICAiJHtiQ2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAkYlN1YnN0aXR1dGlvbiIpOwogICAgfQogICAgUHJvY2VkdXJlIGFQcm9jZWR1cmUgPSBhLnByb2NlZHVyZTsKICAgIGlmIChiLm1lbWJlciBpcyEgUHJvY2VkdXJlKSB7CiAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAxIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIFByb2NlZHVyZSBiUHJvY2VkdXJlID0gYi5tZW1iZXI7CiAgICBGdW5jdGlvbk5vZGUgYUZ1bmN0aW9uID0gYVByb2NlZHVyZS5mdW5jdGlvbjsKICAgIEZ1bmN0aW9uTm9kZSBiRnVuY3Rpb24gPSBiUHJvY2VkdXJlLmZ1bmN0aW9uOwoKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gYVR5cGVQYXJhbWV0ZXJzID0gYUZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzOwogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBiVHlwZVBhcmFtZXRlcnMgPSBiRnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICBpbnQgdHlwZVBhcmFtZXRlckNvdW50ID0gYVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGlmICh0eXBlUGFyYW1ldGVyQ291bnQgIT0gYlR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgMiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJDb3VudCAhPSAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlckNvdW50OyBpKyspIHsKICAgICAgICBjb3B5VHlwZVBhcmFtZXRlckNvdmFyaWFuY2UoCiAgICAgICAgICAgIGEucGFyZW50LCBhVHlwZVBhcmFtZXRlcnNbaV0sIGJUeXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4odHlwZVBhcmFtZXRlckNvdW50KTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVyQ291bnQ7IGkrKykgewogICAgICAgIHR5cGVzW2ldID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcoCiAgICAgICAgICAgIGJUeXBlUGFyYW1ldGVyc1tpXSwgYVR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgfQogICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKGJUeXBlUGFyYW1ldGVycywgdHlwZXMpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJDb3VudDsgaSsrKSB7CiAgICAgICAgRGFydFR5cGUgYUJvdW5kID0gYVR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kOwogICAgICAgIERhcnRUeXBlIGJCb3VuZCA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZVBhcmFtZXRlcnNbaV0uYm91bmQpOwogICAgICAgIGlmIChhQm91bmQgIT0gYkJvdW5kKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgMyIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIERhcnRUeXBlIGFSZXR1cm5UeXBlID0gYUZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICBpZiAoYVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgIGFSZXR1cm5UeXBlID0gYVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShhUmV0dXJuVHlwZSk7CiAgICB9CiAgICBEYXJ0VHlwZSBiUmV0dXJuVHlwZSA9IGJGdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgaWYgKGJTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICBiUmV0dXJuVHlwZSA9IGJTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlJldHVyblR5cGUpOwogICAgfQogICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgIGJSZXR1cm5UeXBlID0gc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGJSZXR1cm5UeXBlKTsKICAgIH0KICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKICAgIGlmIChhRnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IGJGdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCA0Iik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gYVBvc2l0aW9uYWwgPSBhRnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnM7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGJQb3NpdGlvbmFsID0gYkZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgaWYgKGFQb3NpdGlvbmFsLmxlbmd0aCA8IGJQb3NpdGlvbmFsLmxlbmd0aCkgewogICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgNSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGFSZXR1cm5UeXBlICE9IGJSZXR1cm5UeXBlKSB7CiAgICAgIGlmIChhLnBhcmVudCA9PSBjbGFzc0J1aWxkZXIgJiYgYS5yZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgICByZXN1bHQgPSBpbmZlclJldHVyblR5cGUoCiAgICAgICAgICAgIGNsYXNzQnVpbGRlciwgYSwgYlJldHVyblR5cGUsIGhhZFR5cGVzSW5mZXJyZWQsIGhpZXJhcmNoeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIDYiKTsKICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYlBvc2l0aW9uYWwubGVuZ3RoOyBpKyspIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYVBvc2l0aW9uYWxbaV07CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9IGJQb3NpdGlvbmFsW2ldOwogICAgICBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZShhLnBhcmVudCwgYVBhcmFtZXRlciwgYlBhcmFtZXRlcik7CiAgICAgIERhcnRUeXBlIGFUeXBlID0gYVBhcmFtZXRlci50eXBlOwogICAgICBpZiAoYVN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgYVR5cGUgPSBhU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGFUeXBlKTsKICAgICAgfQogICAgICBEYXJ0VHlwZSBiVHlwZSA9IGJQYXJhbWV0ZXIudHlwZTsKICAgICAgaWYgKGJTdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgIGJUeXBlID0gYlN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgYlR5cGUgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlR5cGUpOwogICAgICB9CiAgICAgIGlmIChoaWVyYXJjaHkKICAgICAgICAgICAgICAuY29yZVR5cGVzLm9iamVjdENsYXNzLmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgIWEuY2xhc3NCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgYi5tZW1iZXIgPT0gaGllcmFyY2h5LmNvcmVUeXBlcy5vYmplY3RFcXVhbHMpIHsKICAgICAgICAvLyBJbiBsZWdhY3kgY29kZSB3ZSBzcGVjaWFsIGNhc2UgYE9iamVjdC49PWAgdG8gaW5mZXIgYGR5bmFtaWNgIGluc3RlYWQKICAgICAgICAvLyBgT2JqZWN0IWAuCiAgICAgICAgYlR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICAgIGlmIChhVHlwZSAhPSBiVHlwZSkgewogICAgICAgIGlmIChhLmNsYXNzQnVpbGRlciA9PSBjbGFzc0J1aWxkZXIgJiYgYS5mb3JtYWxzW2ldLnR5cGUgPT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0ID0gaW5mZXJQYXJhbWV0ZXJUeXBlKGNsYXNzQnVpbGRlciwgYSwgYS5mb3JtYWxzW2ldLCBiVHlwZSwKICAgICAgICAgICAgICBoYWRUeXBlc0luZmVycmVkLCBoaWVyYXJjaHkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgOCIpOwogICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBhTmFtZWQgPSBhRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzOwogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBiTmFtZWQgPSBiRnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzOwogICAgbmFtZWQ6CiAgICBpZiAoYU5hbWVkLmlzTm90RW1wdHkgfHwgYk5hbWVkLmlzTm90RW1wdHkpIHsKICAgICAgaWYgKGFQb3NpdGlvbmFsLmxlbmd0aCAhPSBiUG9zaXRpb25hbC5sZW5ndGgpIHsKICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgOSIpOwogICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGJyZWFrIG5hbWVkOwogICAgICB9CiAgICAgIGlmIChhRnVuY3Rpb24ucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPQogICAgICAgICAgYkZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgMTAiKTsKICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICBicmVhayBuYW1lZDsKICAgICAgfQoKICAgICAgYU5hbWVkID0gYU5hbWVkLnRvTGlzdCgpLi5zb3J0KGNvbXBhcmVOYW1lZFBhcmFtZXRlcnMpOwogICAgICBiTmFtZWQgPSBiTmFtZWQudG9MaXN0KCkuLnNvcnQoY29tcGFyZU5hbWVkUGFyYW1ldGVycyk7CiAgICAgIGludCBhQ291bnQgPSAwOwogICAgICBmb3IgKGludCBiQ291bnQgPSAwOyBiQ291bnQgPCBiTmFtZWQubGVuZ3RoOyBiQ291bnQrKykgewogICAgICAgIFN0cmluZyBuYW1lID0gYk5hbWVkW2JDb3VudF0ubmFtZTsKICAgICAgICBmb3IgKDsgYUNvdW50IDwgYU5hbWVkLmxlbmd0aDsgYUNvdW50KyspIHsKICAgICAgICAgIGlmIChhTmFtZWRbYUNvdW50XS5uYW1lID09IG5hbWUpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYUNvdW50ID09IGFOYW1lZC5sZW5ndGgpIHsKICAgICAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAxMSIpOwogICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICBicmVhayBuYW1lZDsKICAgICAgICB9CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0gYU5hbWVkW2FDb3VudF07CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBiUGFyYW1ldGVyID0gYk5hbWVkW2JDb3VudF07CiAgICAgICAgY29weVBhcmFtZXRlckNvdmFyaWFuY2UoYS5wYXJlbnQsIGFQYXJhbWV0ZXIsIGJQYXJhbWV0ZXIpOwogICAgICAgIERhcnRUeXBlIGFUeXBlID0gYVBhcmFtZXRlci50eXBlOwogICAgICAgIGlmIChhU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICAgIGFUeXBlID0gYVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShhVHlwZSk7CiAgICAgICAgfQogICAgICAgIERhcnRUeXBlIGJUeXBlID0gYlBhcmFtZXRlci50eXBlOwogICAgICAgIGlmIChiU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICAgIGJUeXBlID0gYlN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShiVHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdWJzdGl0dXRpb24gIT0gbnVsbCkgewogICAgICAgICAgYlR5cGUgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoYlR5cGUpOwogICAgICAgIH0KICAgICAgICBpZiAoYVR5cGUgIT0gYlR5cGUpIHsKICAgICAgICAgIEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgcGFyYW1ldGVyOwogICAgICAgICAgZm9yIChpbnQgaSA9IGFQb3NpdGlvbmFsLmxlbmd0aDsgaSA8IGEuZm9ybWFscy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBpZiAoYS5mb3JtYWxzW2ldLm5hbWUgPT0gbmFtZSkgewogICAgICAgICAgICAgIHBhcmFtZXRlciA9IGEuZm9ybWFsc1tpXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGEucGFyZW50ID09IGNsYXNzQnVpbGRlciAmJiBwYXJhbWV0ZXIudHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGluZmVyUGFyYW1ldGVyVHlwZSgKICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlciwgYSwgcGFyYW1ldGVyLCBiVHlwZSwgaGFkVHlwZXNJbmZlcnJlZCwgaGllcmFyY2h5KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAxMiIpOwogICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRlYnVnPy5sb2coIkluZmVycmluZyB0eXBlcyBmb3IgJHtmdWxsTmFtZShhKX0gYmFzZWQgb24gJHtmdWxsTmFtZShiKX0gIiArCiAgICAgICAgKHJlc3VsdCA/ICJzdWNjZWVkZWQuIiA6ICJmYWlsZWQuIikpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgaW5mZXJHZXR0ZXJUeXBlKFByb2NlZHVyZUJ1aWxkZXIgYSwgQ2xhc3NNZW1iZXIgYikgewogICAgZGVidWc/LmxvZygKICAgICAgICAiSW5mZXJyaW5nIGdldHRlciB0eXBlcyBmb3IgJHtmdWxsTmFtZShhKX0gYmFzZWQgb24gJHtmdWxsTmFtZShiKX0iKTsKICAgIE1lbWJlciBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICBEYXJ0VHlwZSBiVHlwZTsKICAgIGlmIChiVGFyZ2V0IGlzIEZpZWxkKSB7CiAgICAgIGJUeXBlID0gYlRhcmdldC50eXBlOwogICAgfSBlbHNlIGlmIChiVGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgICBpZiAoYi5pc1NldHRlcikgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9CiAgICAgICAgICAgIGJUYXJnZXQuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuc2luZ2xlOwogICAgICAgIGJUeXBlID0gYlBhcmFtZXRlci50eXBlOwogICAgICAgIGlmICghaGFzRXhwbGljaXRseVR5cGVkRm9ybWFsUGFyYW1ldGVyKGIsIDApKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgKHR5cGUgbWF5IGJlIGluZmVycmVkKSIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChiLmlzR2V0dGVyKSB7CiAgICAgICAgYlR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFJldHVyblR5cGUoYikpIHsKICAgICAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAocmV0dXJuIHR5cGUgbWF5IGJlIGluZmVycmVkKSIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgKG5vdCBhY2Nlc3NvcjogJHtiVGFyZ2V0LmtpbmR9KSIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIChub3QgZmllbGQvcHJvY2VkdXJlOiAke2JUYXJnZXQucnVudGltZVR5cGV9KSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYS5wcm9jZWR1cmUuZnVuY3Rpb24ucmV0dXJuVHlwZSA9PSBiVHlwZTsKICB9CgogIGJvb2wgaW5mZXJTZXR0ZXJUeXBlKFByb2NlZHVyZUJ1aWxkZXIgYSwgQ2xhc3NNZW1iZXIgYikgewogICAgZGVidWc/LmxvZygKICAgICAgICAiSW5mZXJyaW5nIHNldHRlciB0eXBlcyBmb3IgJHtmdWxsTmFtZShhKX0gYmFzZWQgb24gJHtmdWxsTmFtZShiKX0iKTsKICAgIE1lbWJlciBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICBQcm9jZWR1cmUgYVByb2NlZHVyZSA9IGEucHJvY2VkdXJlOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyID0KICAgICAgICBhUHJvY2VkdXJlLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnNpbmdsZTsKICAgIERhcnRUeXBlIGJUeXBlOwogICAgaWYgKGJUYXJnZXQgaXMgRmllbGQpIHsKICAgICAgYlR5cGUgPSBiVGFyZ2V0LnR5cGU7CiAgICAgIGNvcHlQYXJhbWV0ZXJDb3ZhcmlhbmNlRnJvbUZpZWxkKGEucGFyZW50LCBhUGFyYW1ldGVyLCBiVGFyZ2V0KTsKICAgIH0KICAgIGlmIChiVGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgICBpZiAoYi5pc1NldHRlcikgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlciA9CiAgICAgICAgICAgIGJUYXJnZXQuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuc2luZ2xlOwogICAgICAgIGJUeXBlID0gYlBhcmFtZXRlci50eXBlOwogICAgICAgIGNvcHlQYXJhbWV0ZXJDb3ZhcmlhbmNlKGEucGFyZW50LCBhUGFyYW1ldGVyLCBiUGFyYW1ldGVyKTsKICAgICAgICBpZiAoIWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcihiLCAwKSB8fAogICAgICAgICAgICAhaGFzRXhwbGljaXRseVR5cGVkRm9ybWFsUGFyYW1ldGVyKGEsIDApKSB7CiAgICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgKHR5cGUgbWF5IGJlIGluZmVycmVkKSIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChiLmlzR2V0dGVyKSB7CiAgICAgICAgYlR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFJldHVyblR5cGUoYikpIHsKICAgICAgICAgIGRlYnVnPy5sb2coIkdpdmluZyB1cCAocmV0dXJuIHR5cGUgbWF5IGJlIGluZmVycmVkKSIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJ1Zz8ubG9nKCJHaXZpbmcgdXAgKG5vdCBhY2Nlc3NvcjogJHtiVGFyZ2V0LmtpbmR9KSIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIChub3QgZmllbGQvcHJvY2VkdXJlOiAke2JUYXJnZXQucnVudGltZVR5cGV9KSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYVBhcmFtZXRlci50eXBlID09IGJUeXBlOwogIH0KCiAgdm9pZCBjaGVja1ZhbGlkT3ZlcnJpZGUoQ2xhc3NNZW1iZXIgYSwgQ2xhc3NNZW1iZXIgYikgewogICAgZGVidWc/LmxvZygKICAgICAgICAiY2hlY2tWYWxpZE92ZXJyaWRlKCR7ZnVsbE5hbWUoYSl9LCAke2Z1bGxOYW1lKGIpfSkgJHthLnJ1bnRpbWVUeXBlfSIpOwogICAgaWYgKGEgaXMgUHJvY2VkdXJlQnVpbGRlcikgewogICAgICBpZiAoaW5mZXJNZXRob2RUeXBlcyhhLCBiKSkgcmV0dXJuOwogICAgfSBlbHNlIGlmIChhLmlzRmllbGQpIHsKICAgICAgaWYgKGluZmVyRmllbGRUeXBlcyhhLCBiKSkgcmV0dXJuOwogICAgfQogICAgTWVtYmVyIGFUYXJnZXQgPSBhLm1lbWJlcjsKICAgIE1lbWJlciBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICBpZiAoYVRhcmdldCBpcyBQcm9jZWR1cmUgJiYgIWFUYXJnZXQuaXNBY2Nlc3NvciAmJiBiVGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgICBpZiAoaGFzU2FtZVNpZ25hdHVyZShhVGFyZ2V0LmZ1bmN0aW9uLCBiVGFyZ2V0LmZ1bmN0aW9uKSkgcmV0dXJuOwogICAgfQoKICAgIGlmIChiIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiLmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcwogICAgICAgICAgICAuYWRkKG5ldyBEZWxheWVkT3ZlcnJpZGVDaGVjayhjbGFzc0J1aWxkZXIsIGEsIGIuZGVjbGFyYXRpb25zW2ldKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcwogICAgICAgICAgLmFkZChuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soY2xhc3NCdWlsZGVyLCBhLCBiKSk7CiAgICB9CiAgfQoKICAvLy8gSW5mZXJzIHRoZSBmaWVsZCB0eXBlIG9mIFthXSBiYXNlZCBvbiBbYl0uIFJldHVybnMgYHRydWVgIGlmIHRoZSB0eXBlIG9mCiAgLy8vIFthXSBpcyBrbm93biB0byBiZSBhIHZhbGlkIG92ZXJyaWRlIG9mIFtiXSwgbWVhbmluZyB0aGF0IG5vIGFkZGl0aW9uYWwKICAvLy8gb3ZlcnJpZGUgY2hlY2tzIGFyZSBuZWVkZWQuCiAgYm9vbCBpbmZlckZpZWxkVHlwZXMoQ2xhc3NNZW1iZXIgYSwgQ2xhc3NNZW1iZXIgYikgewogICAgZGVidWc/LmxvZygiVHJ5aW5nIHRvIGluZmVyIGZpZWxkIHR5cGVzIGZvciAke2Z1bGxOYW1lKGEpfSAiCiAgICAgICAgImJhc2VkIG9uICR7ZnVsbE5hbWUoYil9Iik7CiAgICBpZiAoYiBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIGJvb2wgaGFzU2FtZVNpZ25hdHVyZSA9IHRydWU7CiAgICAgIExpc3Q8Q2xhc3NNZW1iZXI+IGRlY2xhcmF0aW9ucyA9IGIuZGVjbGFyYXRpb25zOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICghaW5mZXJGaWVsZFR5cGVzKGEsIGRlY2xhcmF0aW9uc1tpXSkpIHsKICAgICAgICAgIGhhc1NhbWVTaWduYXR1cmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGhhc1NhbWVTaWduYXR1cmU7CiAgICB9CiAgICBNZW1iZXIgYlRhcmdldCA9IGIubWVtYmVyOwogICAgRGFydFR5cGUgaW5oZXJpdGVkVHlwZTsKICAgIGlmIChiVGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgICBpZiAoYlRhcmdldC5pc1NldHRlcikgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0KICAgICAgICAgICAgYlRhcmdldC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5zaW5nbGU7CiAgICAgICAgLy8gaW5oZXJpdGVkVHlwZSA9IHBhcmFtZXRlci50eXBlOwogICAgICAgIGNvcHlGaWVsZENvdmFyaWFuY2VGcm9tUGFyYW1ldGVyKGEuY2xhc3NCdWlsZGVyLCBhLm1lbWJlciwgcGFyYW1ldGVyKTsKICAgICAgICBpZiAoIWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcihiLCAwKSkgewogICAgICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwICh0eXBlIG1heSBiZSBpbmZlcnJlZCkiKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYlRhcmdldC5pc0dldHRlcikgewogICAgICAgIGlmICghaGFzRXhwbGljaXRSZXR1cm5UeXBlKGIpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaW5oZXJpdGVkVHlwZSA9IGJUYXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChiVGFyZ2V0IGlzIEZpZWxkKSB7CiAgICAgIGNvcHlGaWVsZENvdmFyaWFuY2UoYS5jbGFzc0J1aWxkZXIsIGEubWVtYmVyLCBiVGFyZ2V0KTsKICAgICAgaW5oZXJpdGVkVHlwZSA9IGJUYXJnZXQudHlwZTsKICAgIH0KICAgIGlmIChpbmhlcml0ZWRUeXBlID09IG51bGwpIHsKICAgICAgZGVidWc/LmxvZygiR2l2aW5nIHVwIChpbmhlcml0ZWRUeXBlID09IG51bGwpXG4ke1N0YWNrVHJhY2UuY3VycmVudH0iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgQ2xhc3NCdWlsZGVyIGFDbGFzc0J1aWxkZXIgPSBhLmNsYXNzQnVpbGRlcjsKICAgIFN1YnN0aXR1dGlvbiBhU3Vic3RpdHV0aW9uOwogICAgaWYgKGNsYXNzQnVpbGRlciAhPSBhQ2xhc3NCdWlsZGVyKSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIHN1YnN0aXR1dGlvbnMuY29udGFpbnNLZXkoYUNsYXNzQnVpbGRlci5jbHMpLAogICAgICAgICAgIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAiCiAgICAgICAgICAiJHthQ2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSIpOwogICAgICBhU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1thQ2xhc3NCdWlsZGVyLmNsc107CiAgICAgIGRlYnVnPy5sb2coIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAtPiAiCiAgICAgICAgICAiJHthQ2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAkYVN1YnN0aXR1dGlvbiIpOwogICAgfQogICAgQ2xhc3NCdWlsZGVyIGJDbGFzc0J1aWxkZXIgPSBiLmNsYXNzQnVpbGRlcjsKICAgIFN1YnN0aXR1dGlvbiBiU3Vic3RpdHV0aW9uOwogICAgaWYgKGNsYXNzQnVpbGRlciAhPSBiQ2xhc3NCdWlsZGVyKSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIHN1YnN0aXR1dGlvbnMuY29udGFpbnNLZXkoYkNsYXNzQnVpbGRlci5jbHMpLAogICAgICAgICAgIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAiCiAgICAgICAgICAiJHtiQ2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSIpOwogICAgICBiU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1tiQ2xhc3NCdWlsZGVyLmNsc107CiAgICAgIGRlYnVnPy5sb2coIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAtPiAiCiAgICAgICAgICAiJHtiQ2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAkYlN1YnN0aXR1dGlvbiIpOwogICAgfQogICAgaWYgKGluaGVyaXRlZFR5cGUgaXMhIEltcGxpY2l0RmllbGRUeXBlKSB7CiAgICAgIGlmIChiU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgICBpbmhlcml0ZWRUeXBlID0gYlN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShpbmhlcml0ZWRUeXBlKTsKICAgICAgfQogICAgICBpZiAoIWEuY2xhc3NCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgIGluaGVyaXRlZFR5cGUgPSBsZWdhY3lFcmFzdXJlKGhpZXJhcmNoeS5jb3JlVHlwZXMsIGluaGVyaXRlZFR5cGUpOwogICAgICB9CiAgICB9CgogICAgRmllbGQgYUZpZWxkID0gYS5tZW1iZXI7CiAgICBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUgPSBhRmllbGQudHlwZTsKICAgIGlmIChhU3Vic3RpdHV0aW9uICE9IG51bGwpIHsKICAgICAgZGVjbGFyZWRUeXBlID0gYVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShkZWNsYXJlZFR5cGUpOwogICAgfQogICAgaWYgKGRlY2xhcmVkVHlwZSA9PSBpbmhlcml0ZWRUeXBlKSByZXR1cm4gdHJ1ZTsKCiAgICBib29sIGlzVmFsaWRPdmVycmlkZSA9IGZhbHNlOwogICAgaWYgKGEgaXMgRmllbGRCdWlsZGVyKSB7CiAgICAgIGlmIChhLnBhcmVudCA9PSBjbGFzc0J1aWxkZXIgJiYgYS50eXBlID09IG51bGwpIHsKICAgICAgICBEYXJ0VHlwZSBkZWNsYXJlZFR5cGUgPSBhLmZpZWxkVHlwZTsKICAgICAgICBpZiAoZGVjbGFyZWRUeXBlIGlzIEltcGxpY2l0RmllbGRUeXBlKSB7CiAgICAgICAgICBpZiAoaW5oZXJpdGVkVHlwZSBpcyBJbXBsaWNpdEZpZWxkVHlwZSkgewogICAgICAgICAgICBkZWNsYXJlZFR5cGUuYWRkT3ZlcnJpZGUoaW5oZXJpdGVkVHlwZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUaGUgY29uY3JldGUgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGluZmVycmVkLgogICAgICAgICAgICBhLmhhZFR5cGVzSW5mZXJyZWQgPSB0cnVlOwogICAgICAgICAgICBhLmZpZWxkVHlwZSA9IGluaGVyaXRlZFR5cGU7CiAgICAgICAgICAgIGlzVmFsaWRPdmVycmlkZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhLmhhZFR5cGVzSW5mZXJyZWQpIHsKICAgICAgICAgIGlmIChpbmhlcml0ZWRUeXBlIGlzISBJbXBsaWNpdEZpZWxkVHlwZSkgewogICAgICAgICAgICAvLyBBIGRpZmZlcmVudCB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gaW5mZXJyZWQuCiAgICAgICAgICAgIHJlcG9ydENhbnRJbmZlckZpZWxkVHlwZShjbGFzc0J1aWxkZXIsIGEpOwogICAgICAgICAgICBhLmZpZWxkVHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzVmFsaWRPdmVycmlkZSA9IHRydWU7CiAgICAgICAgICBhLmhhZFR5cGVzSW5mZXJyZWQgPSB0cnVlOwogICAgICAgICAgYS5maWVsZFR5cGUgPSBpbmhlcml0ZWRUeXBlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzVmFsaWRPdmVycmlkZTsKICB9CgogIHZvaWQgY29weVBhcmFtZXRlckNvdmFyaWFuY2UoQnVpbGRlciBwYXJlbnQsIFZhcmlhYmxlRGVjbGFyYXRpb24gYVBhcmFtZXRlciwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBiUGFyYW1ldGVyKSB7CiAgICBpZiAocGFyZW50ID09IGNsYXNzQnVpbGRlcikgewogICAgICBpZiAoYlBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgIGFQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChiUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvcHlQYXJhbWV0ZXJDb3ZhcmlhbmNlRnJvbUZpZWxkKAogICAgICBCdWlsZGVyIHBhcmVudCwgVmFyaWFibGVEZWNsYXJhdGlvbiBhUGFyYW1ldGVyLCBGaWVsZCBiRmllbGQpIHsKICAgIGlmIChwYXJlbnQgPT0gY2xhc3NCdWlsZGVyKSB7CiAgICAgIGlmIChiRmllbGQuaXNDb3ZhcmlhbnQpIHsKICAgICAgICBhUGFyYW1ldGVyLmlzQ292YXJpYW50ID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoYkZpZWxkLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGNvcHlGaWVsZENvdmFyaWFuY2UoQnVpbGRlciBwYXJlbnQsIEZpZWxkIGFGaWVsZCwgRmllbGQgYkZpZWxkKSB7CiAgICBpZiAocGFyZW50ID09IGNsYXNzQnVpbGRlcikgewogICAgICBpZiAoYkZpZWxkLmlzQ292YXJpYW50KSB7CiAgICAgICAgYUZpZWxkLmlzQ292YXJpYW50ID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoYkZpZWxkLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhRmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY29weUZpZWxkQ292YXJpYW5jZUZyb21QYXJhbWV0ZXIoCiAgICAgIEJ1aWxkZXIgcGFyZW50LCBGaWVsZCBhRmllbGQsIFZhcmlhYmxlRGVjbGFyYXRpb24gYlBhcmFtZXRlcikgewogICAgaWYgKHBhcmVudCA9PSBjbGFzc0J1aWxkZXIpIHsKICAgICAgaWYgKGJQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHsKICAgICAgICBhRmllbGQuaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChiUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhRmllbGQuaXNHZW5lcmljQ292YXJpYW50SW1wbCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgY29weVR5cGVQYXJhbWV0ZXJDb3ZhcmlhbmNlKAogICAgICBCdWlsZGVyIHBhcmVudCwgVHlwZVBhcmFtZXRlciBhUGFyYW1ldGVyLCBUeXBlUGFyYW1ldGVyIGJQYXJhbWV0ZXIpIHsKICAgIGlmIChwYXJlbnQgPT0gY2xhc3NCdWlsZGVyKSB7CiAgICAgIGlmIChiUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBhUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlcG9ydEluaGVyaXRhbmNlQ29uZmxpY3QoQ2xhc3NNZW1iZXIgYSwgQ2xhc3NNZW1iZXIgYikgewogICAgU3RyaW5nIG5hbWUgPSBhLmZ1bGxOYW1lRm9yRXJyb3JzOwogICAgaWYgKGEuY2xhc3NCdWlsZGVyICE9IGIuY2xhc3NCdWlsZGVyKSB7CiAgICAgIGlmIChhLmNsYXNzQnVpbGRlciA9PSBjbGFzc0J1aWxkZXIpIHsKICAgICAgICBjbGFzc0J1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlciwKICAgICAgICAgICAgYS5jaGFyT2Zmc2V0LAogICAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgICBtZXNzYWdlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbihiLmZpbGVVcmksIGIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpCiAgICAgICAgICAgIF0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNsYXNzQnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3QsCiAgICAgICAgICAgIGNsYXNzQnVpbGRlci5jaGFyT2Zmc2V0LCBjbGFzc0J1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICBjb250ZXh0OiBpbmhlcml0ZWRDb25mbGljdENvbnRleHQoYSwgYikpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGEuaXNTdGF0aWMgIT0gYi5pc1N0YXRpYykgewogICAgICBDbGFzc01lbWJlciBzdGF0aWNNZW1iZXI7CiAgICAgIENsYXNzTWVtYmVyIGluc3RhbmNlTWVtYmVyOwogICAgICBpZiAoYS5pc1N0YXRpYykgewogICAgICAgIHN0YXRpY01lbWJlciA9IGE7CiAgICAgICAgaW5zdGFuY2VNZW1iZXIgPSBiOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRpY01lbWJlciA9IGI7CiAgICAgICAgaW5zdGFuY2VNZW1iZXIgPSBhOwogICAgICB9CiAgICAgIGNsYXNzQnVpbGRlci5saWJyYXJ5LmFkZFByb2JsZW0obWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3QsCiAgICAgICAgICBzdGF0aWNNZW1iZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgsIHN0YXRpY01lbWJlci5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgbWVzc2FnZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICBpbnN0YW5jZU1lbWJlci5maWxlVXJpLCBpbnN0YW5jZU1lbWJlci5jaGFyT2Zmc2V0LCBuYW1lLmxlbmd0aCkKICAgICAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBtZXNzYWdlIGNhbiBiZSByZXBvcnRlZCB0d2ljZSAod2hlbiBtZXJnaW5nIGxvY2FsTWVtYmVycyB3aXRoCiAgICAgIC8vIGNsYXNzU2V0dGVycywgb3IgbG9jYWxTZXR0ZXJzIHdpdGggY2xhc3NNZW1iZXJzKS4gQnkgZW5zdXJpbmcgdGhhdAogICAgICAvLyB3ZSBhbHdheXMgcmVwb3J0IHRoZSBvbmUgd2l0aCBoaWdoZXIgY2hhck9mZnNldCBhcyB0aGUgZHVwbGljYXRlLAogICAgICAvLyB0aGUgbWVzc2FnZSBkdXBsaWNhdGlvbiBsb2dpYyBlbnN1cmVzIHRoYXQgd2Ugb25seSByZXBvcnQgdGhpcwogICAgICAvLyBwcm9ibGVtIG9uY2UuCiAgICAgIENsYXNzTWVtYmVyIGV4aXN0aW5nOwogICAgICBDbGFzc01lbWJlciBkdXBsaWNhdGU7CiAgICAgIGFzc2VydChhLmZpbGVVcmkgPT0gYi5maWxlVXJpKTsKICAgICAgaWYgKGEuY2hhck9mZnNldCA8IGIuY2hhck9mZnNldCkgewogICAgICAgIGV4aXN0aW5nID0gYTsKICAgICAgICBkdXBsaWNhdGUgPSBiOwogICAgICB9IGVsc2UgewogICAgICAgIGV4aXN0aW5nID0gYjsKICAgICAgICBkdXBsaWNhdGUgPSBhOwogICAgICB9CiAgICAgIGNsYXNzQnVpbGRlci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbi53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgZHVwbGljYXRlLmNoYXJPZmZzZXQsCiAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgIGR1cGxpY2F0ZS5maWxlVXJpLAogICAgICAgICAgY29udGV4dDogPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZS53aXRoQXJndW1lbnRzKG5hbWUpLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgIGV4aXN0aW5nLmZpbGVVcmksIGV4aXN0aW5nLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKQogICAgICAgICAgXSk7CiAgICB9CiAgfQoKICAvLy8gV2hlbiBtZXJnaW5nIGBhTGlzdGAgYW5kIGBiTGlzdGAsIFttZW1iZXJdIHdhcyBvbmx5IGZvdW5kIGluIGBhTGlzdGAuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJjbGFzc2AgW21lbWJlcl0gaXMgZGVjbGFyZWQgaW4gY3VycmVudAogIC8vLyBjbGFzcywgYW5kIGlzbid0IG92ZXJyaWRpbmcgYSBtZXRob2QgZnJvbSB0aGUgc3VwZXJjbGFzcy4KICAvLy8KICAvLy8gSWYgW21lcmdlS2luZF0gaXMgYE1lcmdlS2luZC5pbnRlcmZhY2VzYCwgW21lbWJlcl0gaXMgaWdub3JlZCBmb3Igbm93LgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLnN1cGVydHlwZXNgLCBbbWVtYmVyXSBpc24ndAogIC8vLyBpbXBsZW1lbnRpbmcvb3ZlcnJpZGluZyBhbnl0aGluZy4KICBDbGFzc01lbWJlciBoYW5kbGVPbmx5QShDbGFzc01lbWJlciBtZW1iZXIsIE1lcmdlS2luZCBtZXJnZUtpbmQpIHsKICAgIGlmIChtZXJnZUtpbmQuYmV0d2VlbkludGVyZmFjZXMpIHsKICAgICAgcmV0dXJuIG1lbWJlcjsKICAgIH0KICAgIC8vIFRPRE8oYWhlKTogRW5hYmxlIHRoaXMgb3B0aW1pemF0aW9uOgogICAgLy8gaWYgKGNscyBpcyBEaWxsQ2xhc3NCdWlsZGVyKSByZXR1cm47CiAgICAvLyBhc3NlcnQobWVyZ2VLaW5kLmJldHdlZW5JbnRlcmZhY2VzIHx8CiAgICAvLyAgICBtZW1iZXIgaXMhIEludGVyZmFjZUNvbmZsaWN0KTsKICAgIGlmICgobWVyZ2VLaW5kLmZyb21TdXBlcmNsYXNzKSAmJiBpc0Fic3RyYWN0KG1lbWJlcikpIHsKICAgICAgcmVjb3JkQWJzdHJhY3RNZW1iZXIobWVtYmVyKTsKICAgIH0KICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICAvLy8gV2hlbiBtZXJnaW5nIGBhTGlzdGAgYW5kIGBiTGlzdGAsIFttZW1iZXJdIHdhcyBvbmx5IGZvdW5kIGluIGBiTGlzdGAuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJjbGFzc2AgW21lbWJlcl0gaXMgYmVpbmcgaW5oZXJpdGVkIGZyb20KICAvLy8gYSBzdXBlcmNsYXNzLgogIC8vLwogIC8vLyBJZiBbbWVyZ2VLaW5kXSBpcyBgTWVyZ2VLaW5kLmludGVyZmFjZXNgLCBbbWVtYmVyXSBpcyBpZ25vcmVkIGZvciBub3cuCiAgLy8vCiAgLy8vIElmIFttZXJnZUtpbmRdIGlzIGBNZXJnZUtpbmQuc3VwZXJ0eXBlc2AsIFttZW1iZXJdIGlzIGltcGxpY2l0bHkKICAvLy8gYWJzdHJhY3QsIGFuZCBub3QgaW1wbGVtZW50ZWQuCiAgQ2xhc3NNZW1iZXIgaGFuZGxlT25seUIoQ2xhc3NNZW1iZXIgbWVtYmVyLCBNZXJnZUtpbmQgbWVyZ2VLaW5kKSB7CiAgICBpZiAobWVyZ2VLaW5kLmJldHdlZW5JbnRlcmZhY2VzKSB7CiAgICAgIHJldHVybiBtZW1iZXI7CiAgICB9CiAgICAvLyBUT0RPKGFoZSk6IEVuYWJsZSB0aGlzIG9wdGltaXphdGlvbjoKICAgIC8vIGlmIChjbHMgaXMgRGlsbENsYXNzQnVpbGRlcikgcmV0dXJuIG1lbWJlcjsKICAgIE1lbWJlciB0YXJnZXQgPSBtZW1iZXIubWVtYmVyOwogICAgaWYgKG1lcmdlS2luZC5mcm9tSW50ZXJmYWNlcyB8fAogICAgICAgIChtZXJnZUtpbmQuZnJvbVN1cGVyY2xhc3MgJiYgdGFyZ2V0LmlzQWJzdHJhY3QpKSB7CiAgICAgIGlmIChpc05hbWVWaXNpYmxlSW4odGFyZ2V0Lm5hbWUsIGNsYXNzQnVpbGRlci5saWJyYXJ5KSkgewogICAgICAgIHJlY29yZEFic3RyYWN0TWVtYmVyKG1lbWJlcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChtZXJnZUtpbmQuZnJvbVN1cGVyY2xhc3MgJiYKICAgICAgICB0YXJnZXQuZW5jbG9zaW5nQ2xhc3MgIT0gb2JqZWN0Q2xhc3MuY2xzICYmCiAgICAgICAgdGFyZ2V0Lm5hbWUgPT0gbm9TdWNoTWV0aG9kTmFtZSkgewogICAgICBoYXNOb1N1Y2hNZXRob2QgPSB0cnVlOwogICAgfQogICAgaWYgKCFtZXJnZUtpbmQuZm9yTWVtYmVyc1ZzU2V0dGVycyAmJgogICAgICAgIG1lbWJlciBpcyBEZWxheWVkTWVtYmVyICYmCiAgICAgICAgbWVtYmVyLmlzSW5oZXJpdGFibGVDb25mbGljdCkgewogICAgICBEZWxheWVkTWVtYmVyIGRlbGF5ZWRNZW1iZXIgPSBtZW1iZXI7CiAgICAgIG1lbWJlciA9IGRlbGF5ZWRNZW1iZXIud2l0aFBhcmVudChjbGFzc0J1aWxkZXIpOwogICAgICBoaWVyYXJjaHkuZGVsYXllZE1lbWJlckNoZWNrcy5hZGQobWVtYmVyKTsKICAgIH0KICAgIGlmIChtZXJnZUtpbmQuaW50b0N1cnJlbnRDbGFzcykgewogICAgICBpZiAobWVtYmVyLmNsYXNzQnVpbGRlci5saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICAgICFjbGFzc0J1aWxkZXIubGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgICAgaWYgKG1lbWJlciBpcyEgRGVsYXllZE1lbWJlcikgewogICAgICAgICAgbWVtYmVyID0gbmV3IEludGVyZmFjZUNvbmZsaWN0KAogICAgICAgICAgICAgIGNsYXNzQnVpbGRlciwgW21lbWJlcl0sIG1lcmdlS2luZC5mb3JTZXR0ZXJzLCBzaG91bGRNb2RpZnlLZXJuZWwsCiAgICAgICAgICAgICAgaXNBYnN0cmFjdDogaXNBYnN0cmFjdChtZW1iZXIpKTsKICAgICAgICAgIGhpZXJhcmNoeS5kZWxheWVkTWVtYmVyQ2hlY2tzLmFkZChtZW1iZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIHZvaWQgcmVjb3JkQWJzdHJhY3RNZW1iZXIoQ2xhc3NNZW1iZXIgbWVtYmVyKSB7CiAgICBhYnN0cmFjdE1lbWJlcnMgPz89IDxDbGFzc01lbWJlcj5bXTsKICAgIGlmIChtZW1iZXIgaXMgRGVsYXllZE1lbWJlcikgewogICAgICBhYnN0cmFjdE1lbWJlcnMuYWRkQWxsKG1lbWJlci5kZWNsYXJhdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgYWJzdHJhY3RNZW1iZXJzLmFkZChtZW1iZXIpOwogICAgfQogIH0KCiAgQ2xhc3NIaWVyYXJjaHlOb2RlIGJ1aWxkKCkgewogICAgYXNzZXJ0KCFjbGFzc0J1aWxkZXIuaXNQYXRjaCk7CiAgICBDbGFzc0hpZXJhcmNoeU5vZGUgc3VwZXJub2RlOwogICAgaWYgKG9iamVjdENsYXNzICE9IGNsYXNzQnVpbGRlci5vcmlnaW4pIHsKICAgICAgc3VwZXJub2RlID0gaGllcmFyY2h5LmdldE5vZGVGcm9tVHlwZUJ1aWxkZXIoY2xhc3NCdWlsZGVyLnN1cGVydHlwZSk7CiAgICAgIGlmIChzdXBlcm5vZGUgPT0gbnVsbCkgewogICAgICAgIHN1cGVybm9kZSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbUNsYXNzQnVpbGRlcihvYmplY3RDbGFzcyk7CiAgICAgIH0KICAgICAgYXNzZXJ0KHN1cGVybm9kZSAhPSBudWxsKTsKICAgIH0KCiAgICBTY29wZSBzY29wZSA9IGNsYXNzQnVpbGRlci5zY29wZTsKICAgIGlmIChjbGFzc0J1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgIFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIgbWl4aW4gPSBjbGFzc0J1aWxkZXIubWl4ZWRJblR5cGUuZGVjbGFyYXRpb247CiAgICAgIGluZmVyTWl4aW5BcHBsaWNhdGlvbigpOwogICAgICAvLyByZWNvcmRTdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlKTsKICAgICAgd2hpbGUgKG1peGluLmlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgQ2xhc3NCdWlsZGVyIG5hbWVkID0gbWl4aW47CiAgICAgICAgLy8gcmVjb3JkU3VwZXJ0eXBlKG5hbWVkLm1peGVkSW5UeXBlKTsKICAgICAgICBtaXhpbiA9IG5hbWVkLm1peGVkSW5UeXBlLmRlY2xhcmF0aW9uOwogICAgICB9CiAgICAgIGlmIChtaXhpbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgVHlwZUFsaWFzQnVpbGRlciBhbGlhc0J1aWxkZXIgPSBtaXhpbjsKICAgICAgICBtaXhpbiA9IGFsaWFzQnVpbGRlci51bmFsaWFzRGVjbGFyYXRpb247CiAgICAgIH0KICAgICAgaWYgKG1peGluIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIHNjb3BlID0gbWl4aW4uc2NvcGUuY29tcHV0ZU1peGluU2NvcGUoKTsKICAgICAgfQogICAgfQoKICAgIC8vLyBNZW1iZXJzIChleGNsdWRpbmcgc2V0dGVycykgZGVjbGFyZWQgaW4gW2Nsc10uCiAgICBMaXN0PENsYXNzTWVtYmVyPiBsb2NhbE1lbWJlcnMgPSA8Q2xhc3NNZW1iZXI+W107CgogICAgLy8vIFNldHRlcnMgZGVjbGFyZWQgaW4gW2Nsc10uCiAgICBMaXN0PENsYXNzTWVtYmVyPiBsb2NhbFNldHRlcnMgPSA8Q2xhc3NNZW1iZXI+W107CgogICAgZm9yIChNZW1iZXJCdWlsZGVyIG1lbWJlckJ1aWxkZXIgaW4gc2NvcGUubG9jYWxNZW1iZXJzKSB7CiAgICAgIGxvY2FsTWVtYmVycy5hZGRBbGwobWVtYmVyQnVpbGRlci5sb2NhbE1lbWJlcnMpOwogICAgICBsb2NhbFNldHRlcnMuYWRkQWxsKG1lbWJlckJ1aWxkZXIubG9jYWxTZXR0ZXJzKTsKICAgIH0KCiAgICBmb3IgKE1lbWJlckJ1aWxkZXIgbWVtYmVyQnVpbGRlciBpbiBzY29wZS5sb2NhbFNldHRlcnMpIHsKICAgICAgbG9jYWxNZW1iZXJzLmFkZEFsbChtZW1iZXJCdWlsZGVyLmxvY2FsTWVtYmVycyk7CiAgICAgIGxvY2FsU2V0dGVycy5hZGRBbGwobWVtYmVyQnVpbGRlci5sb2NhbFNldHRlcnMpOwogICAgfQoKICAgIGxvY2FsTWVtYmVycy5zb3J0KGNvbXBhcmVEZWNsYXJhdGlvbnMpOwogICAgbG9jYWxTZXR0ZXJzLnNvcnQoY29tcGFyZURlY2xhcmF0aW9ucyk7CgogICAgLy8gQWRkIGltcGxpZWQgc2V0dGVycyBmcm9tIGZpZWxkcyBpbiBbbG9jYWxNZW1iZXJzXS4KICAgIGxvY2FsU2V0dGVycyA9IG1lcmdlQWNjZXNzb3JzKGxvY2FsTWVtYmVycywgbG9jYWxTZXR0ZXJzKTsKCiAgICAvLy8gTWVtYmVycyAoZXhjbHVkaW5nIHNldHRlcnMpIGRlY2xhcmVkIGluIFtjbHNdIG9yIGl0cyBzdXBlcmNsYXNzZXMuIFRoaXMKICAgIC8vLyBpbmNsdWRlcyBzdGF0aWMgbWV0aG9kcyBvZiBbY2xzXSwgYnV0IG5vdCBpdHMgc3VwZXJjbGFzc2VzLgogICAgTGlzdDxDbGFzc01lbWJlcj4gY2xhc3NNZW1iZXJzOwoKICAgIC8vLyBTZXR0ZXJzIGRlY2xhcmVkIGluIFtjbHNdIG9yIGl0cyBzdXBlcmNsYXNzZXMuIFRoaXMgaW5jbHVkZXMgc3RhdGljCiAgICAvLy8gc2V0dGVycyBvZiBbY2xzXSwgYnV0IG5vdCBpdHMgc3VwZXJjbGFzc2VzLgogICAgTGlzdDxDbGFzc01lbWJlcj4gY2xhc3NTZXR0ZXJzOwoKICAgIC8vLyBNZW1iZXJzIChleGNsdWRpbmcgc2V0dGVycykgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlcy4gVGhpcyBjb250YWlucyBubwogICAgLy8vIHN0YXRpYyBtZW1iZXJzLiBJcyBudWxsIGlmIG5vIGludGVyZmFjZXMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3MKICAgIC8vLyBvciBpdHMgc3VwZXJjbGFzc2VzLgogICAgTGlzdDxDbGFzc01lbWJlcj4gaW50ZXJmYWNlTWVtYmVyczsKCiAgICAvLy8gU2V0dGVycyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2VzLiBUaGlzIGNvbnRhaW5zIG5vIHN0YXRpYyBzZXR0ZXJzLiBJcwogICAgLy8vIG51bGwgaWYgbm8gaW50ZXJmYWNlcyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcyBvciBpdHMKICAgIC8vLyBzdXBlcmNsYXNzZXMuCiAgICBMaXN0PENsYXNzTWVtYmVyPiBpbnRlcmZhY2VTZXR0ZXJzOwoKICAgIExpc3Q8RGFydFR5cGU+IHN1cGVyY2xhc3NlczsKCiAgICBMaXN0PERhcnRUeXBlPiBpbnRlcmZhY2VzOwoKICAgIGludCBtYXhJbmhlcml0YW5jZVBhdGg7CgogICAgaWYgKHN1cGVybm9kZSA9PSBudWxsKSB7CiAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIE9iamVjdC4KICAgICAgY2xhc3NNZW1iZXJzID0gbG9jYWxNZW1iZXJzOwogICAgICBjbGFzc1NldHRlcnMgPSBsb2NhbFNldHRlcnM7CiAgICAgIHN1cGVyY2xhc3NlcyA9IG5ldyBMaXN0PERhcnRUeXBlPigwKTsKICAgICAgaW50ZXJmYWNlcyA9IG5ldyBMaXN0PERhcnRUeXBlPigwKTsKICAgICAgbWF4SW5oZXJpdGFuY2VQYXRoID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIG1heEluaGVyaXRhbmNlUGF0aCA9IHN1cGVybm9kZS5tYXhJbmhlcml0YW5jZVBhdGggKyAxOwoKICAgICAgc3VwZXJjbGFzc2VzID0gbmV3IExpc3Q8RGFydFR5cGU+KHN1cGVybm9kZS5zdXBlcmNsYXNzZXMubGVuZ3RoICsgMSk7CiAgICAgIERhcnRUeXBlIHN1cGVydHlwZSA9IGNsYXNzQnVpbGRlci5zdXBlcnR5cGUuYnVpbGQoY2xhc3NCdWlsZGVyLmxpYnJhcnkpOwogICAgICBpZiAoc3VwZXJ0eXBlIGlzISBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgLy8gSWYgdGhlIHN1cGVyY2xhc3MgaXMgbm90IGFuIGludGVyZmFjZSB0eXBlIHdlIHVzZSBPYmplY3QgaW5zdGVhZC4KICAgICAgICAvLyBBIHNpbWlsYXIgbm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgb24gW3N1cGVybm9kZV0gYWJvdmUuCiAgICAgICAgc3VwZXJ0eXBlID0gaGllcmFyY2h5LmNvcmVUeXBlcy5vYmplY3ROb25OdWxsYWJsZVJhd1R5cGU7CiAgICAgIH0KICAgICAgc3VwZXJjbGFzc2VzLnNldFJhbmdlKDAsIHN1cGVyY2xhc3Nlcy5sZW5ndGggLSAxLAogICAgICAgICAgc3Vic3RTdXBlcnR5cGVzKHN1cGVydHlwZSwgc3VwZXJub2RlLnN1cGVyY2xhc3NlcykpOwogICAgICBzdXBlcmNsYXNzZXNbc3VwZXJjbGFzc2VzLmxlbmd0aCAtIDFdID0gcmVjb3JkU3VwZXJ0eXBlKHN1cGVydHlwZSk7CgogICAgICBMaXN0PFR5cGVCdWlsZGVyPiBkaXJlY3RJbnRlcmZhY2VCdWlsZGVycyA9CiAgICAgICAgICBpZ25vcmVGdW5jdGlvbihjbGFzc0J1aWxkZXIuaW50ZXJmYWNlcyk7CiAgICAgIGlmIChjbGFzc0J1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CiAgICAgICAgaWYgKGRpcmVjdEludGVyZmFjZUJ1aWxkZXJzID09IG51bGwpIHsKICAgICAgICAgIGRpcmVjdEludGVyZmFjZUJ1aWxkZXJzID0gPFR5cGVCdWlsZGVyPltjbGFzc0J1aWxkZXIubWl4ZWRJblR5cGVdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXJlY3RJbnRlcmZhY2VCdWlsZGVycyA9IDxUeXBlQnVpbGRlcj5bY2xhc3NCdWlsZGVyLm1peGVkSW5UeXBlXQogICAgICAgICAgICAuLmFkZEFsbChkaXJlY3RJbnRlcmZhY2VCdWlsZGVycyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkaXJlY3RJbnRlcmZhY2VCdWlsZGVycyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RJbnRlcmZhY2VCdWlsZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcmVjb3JkU3VwZXJ0eXBlKAogICAgICAgICAgICAgIGRpcmVjdEludGVyZmFjZUJ1aWxkZXJzW2ldLmJ1aWxkKGNsYXNzQnVpbGRlci5saWJyYXJ5KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIExpc3Q8RGFydFR5cGU+IHN1cGVyY2xhc3NJbnRlcmZhY2VzID0gc3VwZXJub2RlLmludGVyZmFjZXM7CiAgICAgIGlmIChzdXBlcmNsYXNzSW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgc3VwZXJjbGFzc0ludGVyZmFjZXMgPSBzdWJzdFN1cGVydHlwZXMoc3VwZXJ0eXBlLCBzdXBlcmNsYXNzSW50ZXJmYWNlcyk7CiAgICAgIH0KCiAgICAgIGNsYXNzTWVtYmVycyA9IG1lcmdlKAogICAgICAgICAgbG9jYWxNZW1iZXJzLCBzdXBlcm5vZGUuY2xhc3NNZW1iZXJzLCBNZXJnZUtpbmQuc3VwZXJjbGFzc01lbWJlcnMpOwogICAgICBjbGFzc1NldHRlcnMgPSBtZXJnZSgKICAgICAgICAgIGxvY2FsU2V0dGVycywgc3VwZXJub2RlLmNsYXNzU2V0dGVycywgTWVyZ2VLaW5kLnN1cGVyY2xhc3NTZXR0ZXJzKTsKCiAgICAgIGlmIChkaXJlY3RJbnRlcmZhY2VCdWlsZGVycyAhPSBudWxsKSB7CiAgICAgICAgTWVyZ2VSZXN1bHQgcmVzdWx0ID0KICAgICAgICAgICAgbWVyZ2VJbnRlcmZhY2VzKHN1cGVybm9kZSwgZGlyZWN0SW50ZXJmYWNlQnVpbGRlcnMpOwogICAgICAgIGludGVyZmFjZU1lbWJlcnMgPSByZXN1bHQubWVyZ2VkTWVtYmVyczsKICAgICAgICBpbnRlcmZhY2VTZXR0ZXJzID0gcmVzdWx0Lm1lcmdlZFNldHRlcnM7CiAgICAgICAgaW50ZXJmYWNlcyA9IDxEYXJ0VHlwZT5bXTsKICAgICAgICBpZiAoc3VwZXJjbGFzc0ludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcmNsYXNzSW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlcywgc3VwZXJjbGFzc2VzLCBzdXBlcmNsYXNzSW50ZXJmYWNlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdEludGVyZmFjZUJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBEYXJ0VHlwZSBkaXJlY3RJbnRlcmZhY2UgPQogICAgICAgICAgICAgIGRpcmVjdEludGVyZmFjZUJ1aWxkZXJzW2ldLmJ1aWxkKGNsYXNzQnVpbGRlci5saWJyYXJ5KTsKICAgICAgICAgIGFkZEludGVyZmFjZShpbnRlcmZhY2VzLCBzdXBlcmNsYXNzZXMsIGRpcmVjdEludGVyZmFjZSk7CiAgICAgICAgICBpZiAoZGlyZWN0SW50ZXJmYWNlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgICAgQ2xhc3NIaWVyYXJjaHlOb2RlIGludGVyZmFjZU5vZGUgPQogICAgICAgICAgICAgICAgaGllcmFyY2h5LmdldE5vZGVGcm9tQ2xhc3MoZGlyZWN0SW50ZXJmYWNlLmNsYXNzTm9kZSk7CiAgICAgICAgICAgIGlmIChpbnRlcmZhY2VOb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICBpZiAobWF4SW5oZXJpdGFuY2VQYXRoIDwgaW50ZXJmYWNlTm9kZS5tYXhJbmhlcml0YW5jZVBhdGggKyAxKSB7CiAgICAgICAgICAgICAgICBtYXhJbmhlcml0YW5jZVBhdGggPSBpbnRlcmZhY2VOb2RlLm1heEluaGVyaXRhbmNlUGF0aCArIDE7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBMaXN0PERhcnRUeXBlPiB0eXBlcyA9CiAgICAgICAgICAgICAgICAgIHN1YnN0U3VwZXJ0eXBlcyhkaXJlY3RJbnRlcmZhY2UsIGludGVyZmFjZU5vZGUuc3VwZXJjbGFzc2VzKTsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBhZGRJbnRlcmZhY2UoaW50ZXJmYWNlcywgc3VwZXJjbGFzc2VzLCB0eXBlc1tpXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VOb2RlLmludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXMgPQogICAgICAgICAgICAgICAgICAgIHN1YnN0U3VwZXJ0eXBlcyhkaXJlY3RJbnRlcmZhY2UsIGludGVyZmFjZU5vZGUuaW50ZXJmYWNlcyk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIGFkZEludGVyZmFjZShpbnRlcmZhY2VzLCBzdXBlcmNsYXNzZXMsIHR5cGVzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50ZXJmYWNlTWVtYmVycyA9IHN1cGVybm9kZS5pbnRlcmZhY2VNZW1iZXJzOwogICAgICAgIGludGVyZmFjZVNldHRlcnMgPSBzdXBlcm5vZGUuaW50ZXJmYWNlU2V0dGVyczsKICAgICAgICBpbnRlcmZhY2VzID0gc3VwZXJjbGFzc0ludGVyZmFjZXM7CiAgICAgIH0KCiAgICAgIC8vIENoZWNrIGlmIGxvY2FsIG1lbWJlcnMgY29uZmxpY3Qgd2l0aCBpbmhlcml0ZWQgc2V0dGVycy4gVGhpcyBjaGVjayBoYXMKICAgICAgLy8gYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCBpbiB0aGUgc3VwZXJjbGFzcywgc28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZQogICAgICAvLyBsb2NhbCBtZW1iZXJzLiBUaGVzZSBjaGVja3MgaGF2ZSB0byBvY2N1ciBsYXRlIHRvIGVuYWJsZSBpbmZlcnJpbmcKICAgICAgLy8gdHlwZXMgYmV0d2VlbiBzZXR0ZXJzIGFuZCBnZXR0ZXJzLCBvciBmcm9tIGEgc2V0dGVyIHRvIGEgZmluYWwgZmllbGQuCiAgICAgIG1lcmdlKGxvY2FsTWVtYmVycywgY2xhc3NTZXR0ZXJzLCBNZXJnZUtpbmQubWVtYmVyc1dpdGhTZXR0ZXJzKTsKCiAgICAgIC8vIENoZWNrIGlmIGxvY2FsIHNldHRlcnMgY29uZmxpY3Qgd2l0aCBpbmhlcml0ZWQgbWVtYmVycy4gQXMgYWJvdmUsIHdlCiAgICAgIC8vIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbG9jYWwgc2V0dGVycy4KICAgICAgbWVyZ2UobG9jYWxTZXR0ZXJzLCBjbGFzc01lbWJlcnMsIE1lcmdlS2luZC5zZXR0ZXJzV2l0aE1lbWJlcnMpOwoKICAgICAgaWYgKGludGVyZmFjZU1lbWJlcnMgIT0gbnVsbCkgewogICAgICAgIGludGVyZmFjZU1lbWJlcnMgPQogICAgICAgICAgICBtZXJnZShjbGFzc01lbWJlcnMsIGludGVyZmFjZU1lbWJlcnMsIE1lcmdlS2luZC5zdXBlcnR5cGVzTWVtYmVycyk7CgogICAgICAgIC8vIENoZWNrIGlmIGNsYXNzIHNldHRlcnMgY29uZmxpY3Qgd2l0aCBtZW1iZXJzIGluaGVyaXRlZCBmcm9tCiAgICAgICAgLy8gaW50ZXJmYWNlcy4KICAgICAgICBtZXJnZShjbGFzc1NldHRlcnMsIGludGVyZmFjZU1lbWJlcnMsIE1lcmdlS2luZC5zZXR0ZXJzV2l0aE1lbWJlcnMpOwogICAgICB9CiAgICAgIGlmIChpbnRlcmZhY2VTZXR0ZXJzICE9IG51bGwpIHsKICAgICAgICBpbnRlcmZhY2VTZXR0ZXJzID0KICAgICAgICAgICAgbWVyZ2UoY2xhc3NTZXR0ZXJzLCBpbnRlcmZhY2VTZXR0ZXJzLCBNZXJnZUtpbmQuc3VwZXJ0eXBlc1NldHRlcnMpOwoKICAgICAgICAvLyBDaGVjayBpZiBjbGFzcyBtZW1iZXJzIGNvbmZsaWN0IHdpdGggc2V0dGVycyBpbmhlcml0ZWQgZnJvbQogICAgICAgIC8vIGludGVyZmFjZXMuCiAgICAgICAgbWVyZ2UoY2xhc3NNZW1iZXJzLCBpbnRlcmZhY2VTZXR0ZXJzLCBNZXJnZUtpbmQubWVtYmVyc1dpdGhTZXR0ZXJzKTsKICAgICAgfQogICAgfQogICAgaWYgKGFic3RyYWN0TWVtYmVycyAhPSBudWxsICYmICFjbGFzc0J1aWxkZXIuaXNBYnN0cmFjdCkgewogICAgICBpZiAoIWhhc05vU3VjaE1ldGhvZCkgewogICAgICAgIHJlcG9ydE1pc3NpbmdNZW1iZXJzKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5zdGFsbE5zbUhhbmRsZXJzKCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3IENsYXNzSGllcmFyY2h5Tm9kZSgKICAgICAgY2xhc3NCdWlsZGVyLAogICAgICBjbGFzc01lbWJlcnMsCiAgICAgIGNsYXNzU2V0dGVycywKICAgICAgaW50ZXJmYWNlTWVtYmVycywKICAgICAgaW50ZXJmYWNlU2V0dGVycywKICAgICAgc3VwZXJjbGFzc2VzLAogICAgICBpbnRlcmZhY2VzLAogICAgICBtYXhJbmhlcml0YW5jZVBhdGgsCiAgICAgIGhhc05vU3VjaE1ldGhvZCwKICAgICk7CiAgfQoKICBEYXJ0VHlwZSByZWNvcmRTdXBlcnR5cGUoRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICBkZWJ1Zz8ubG9nKCJJbiAke3RoaXMuY2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAiCiAgICAgICAgInJlY29yZFN1cGVydHlwZSgke3N1cGVydHlwZX0pIik7CiAgICBpZiAoc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgQ2xhc3MgY2xzID0gc3VwZXJ0eXBlLmNsYXNzTm9kZTsKICAgICAgaWYgKGNscy5pc01peGluQXBwbGljYXRpb24pIHsKICAgICAgICByZWNvcmRTdXBlcnR5cGUoY2xzLm1peGVkSW5UeXBlLmFzSW50ZXJmYWNlVHlwZSk7CiAgICAgIH0KICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlVmFyaWFibGVCdWlsZGVycyA9IGNscy50eXBlUGFyYW1ldGVyczsKICAgICAgaWYgKHR5cGVWYXJpYWJsZUJ1aWxkZXJzID09IG51bGwpIHsKICAgICAgICBzdWJzdGl0dXRpb25zW2Nsc10gPSBTdWJzdGl0dXRpb24uZW1wdHk7CiAgICAgICAgYXNzZXJ0KGNscy50eXBlUGFyYW1ldGVycy5pc0VtcHR5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMgPSBzdXBlcnR5cGUudHlwZUFyZ3VtZW50czsKICAgICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gbmV3IExpc3Q8RGFydFR5cGU+KGFyZ3VtZW50cy5sZW5ndGgpOwogICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPQogICAgICAgICAgICBuZXcgTGlzdDxUeXBlUGFyYW1ldGVyPihhcmd1bWVudHMubGVuZ3RoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdHlwZVBhcmFtZXRlcnNbaV0gPSB0eXBlVmFyaWFibGVCdWlsZGVyc1tpXTsKICAgICAgICAgIHR5cGVBcmd1bWVudHNbaV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgfQogICAgICAgIHN1YnN0aXR1dGlvbnNbY2xzXSA9CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3VwZXJ0eXBlOwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gc3Vic3RTdXBlcnR5cGVzKAogICAgICBEYXJ0VHlwZSBzdXBlcnR5cGUsIExpc3Q8RGFydFR5cGU+IHN1cGVydHlwZXMpIHsKICAgIGlmIChzdXBlcnR5cGUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBzdXBlcnR5cGVzOwogICAgSW50ZXJmYWNlVHlwZSBjbHMgPSBzdXBlcnR5cGU7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVWYXJpYWJsZXMgPSBjbHMuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzOwogICAgaWYgKHR5cGVWYXJpYWJsZXMuaXNFbXB0eSkgewogICAgICBkZWJ1Zz8ubG9nKCJJbiAke3RoaXMuY2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSAiCiAgICAgICAgICAiJHN1cGVydHlwZXMgYXJlbid0IHN1YnN0ZWQiKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVjb3JkU3VwZXJ0eXBlKHN1cGVydHlwZXNbaV0pOwogICAgICB9CiAgICAgIHJldHVybiBzdXBlcnR5cGVzOwogICAgfQogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBtYXAgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMgPSBjbHMudHlwZUFyZ3VtZW50czsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykgewogICAgICBtYXBbdHlwZVZhcmlhYmxlc1tpXV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21NYXAobWFwKTsKICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJ0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICBEYXJ0VHlwZSBzdXBlcnR5cGUgPSBzdXBlcnR5cGVzW2ldOwogICAgICBEYXJ0VHlwZSBzdWJzdGl0dXRlZCA9CiAgICAgICAgICByZWNvcmRTdXBlcnR5cGUoc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHN1cGVydHlwZSkpOwogICAgICBpZiAoc3VwZXJ0eXBlICE9IHN1YnN0aXR1dGVkKSB7CiAgICAgICAgZGVidWc/LmxvZygiSW4gJHt0aGlzLmNsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30gJHN1cGVydHlwZSIKICAgICAgICAgICAgIiAtPiAkc3Vic3RpdHV0ZWQiKTsKICAgICAgICByZXN1bHQgPz89IHN1cGVydHlwZXMudG9MaXN0KCk7CiAgICAgICAgcmVzdWx0W2ldID0gc3Vic3RpdHV0ZWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVidWc/LmxvZygiSW4gJHt0aGlzLmNsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30gIgogICAgICAgICAgICAiJHN1cGVydHlwZSBpc24ndCBzdWJzdGVkIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQgPz8gc3VwZXJ0eXBlczsKICB9CgogIExpc3Q8VHlwZUJ1aWxkZXI+IGNvbXB1dGVEZWZhdWx0VHlwZUFyZ3VtZW50cyhUeXBlQnVpbGRlciB0eXBlKSB7CiAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGNscyA9IHR5cGUuZGVjbGFyYXRpb247CiAgICBpZiAoY2xzIGlzIFR5cGVBbGlhc0J1aWxkZXIpIHsKICAgICAgVHlwZUFsaWFzQnVpbGRlciBhbGlhc0J1aWxkZXIgPSBjbHM7CiAgICAgIGNscyA9IGFsaWFzQnVpbGRlci51bmFsaWFzRGVjbGFyYXRpb247CiAgICB9CiAgICBpZiAoY2xzIGlzIENsYXNzQnVpbGRlcikgewogICAgICBMaXN0PFR5cGVCdWlsZGVyPiByZXN1bHQgPQogICAgICAgICAgbmV3IExpc3Q8VHlwZUJ1aWxkZXI+KGNscy50eXBlVmFyaWFibGVzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciB0diA9IGNscy50eXBlVmFyaWFibGVzW2ldOwogICAgICAgIHJlc3VsdFtpXSA9IHR2LmRlZmF1bHRUeXBlID8/CiAgICAgICAgICAgIGNscy5saWJyYXJ5LmxvYWRlci5jb21wdXRlVHlwZUJ1aWxkZXIodHYucGFyYW1ldGVyLmRlZmF1bHRUeXBlKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgiJHtjbHMucnVudGltZVR5cGV9IiwgIiRjbHMiLCBjbGFzc0J1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgIGNsYXNzQnVpbGRlci5maWxlVXJpKTsKICAgIH0KICB9CgogIERhcnRUeXBlIGFkZEludGVyZmFjZSgKICAgICAgTGlzdDxEYXJ0VHlwZT4gaW50ZXJmYWNlcywgTGlzdDxEYXJ0VHlwZT4gc3VwZXJjbGFzc2VzLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAoIWNsYXNzQnVpbGRlci5saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgdHlwZSA9IGxlZ2FjeUVyYXN1cmUoaGllcmFyY2h5LmNvcmVUeXBlcywgdHlwZSk7CiAgICB9CiAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBub2RlID0gaGllcmFyY2h5LmdldE5vZGVGcm9tQ2xhc3ModHlwZS5jbGFzc05vZGUpOwogICAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgaW50IGRlcHRoID0gbm9kZS5kZXB0aDsKICAgICAgaW50IG15RGVwdGggPSBzdXBlcmNsYXNzZXMubGVuZ3RoOwogICAgICBEYXJ0VHlwZSBzdXBlcmNsYXNzID0gZGVwdGggPCBteURlcHRoID8gc3VwZXJjbGFzc2VzW2RlcHRoXSA6IG51bGw7CiAgICAgIGlmIChzdXBlcmNsYXNzIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIHN1cGVyY2xhc3MuY2xhc3NOb2RlID09IHR5cGUuY2xhc3NOb2RlKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBjb25mbGljdC4KICAgICAgICBpZiAoY2xhc3NCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgICAgc3VwZXJjbGFzcyA9IG5uYmRUb3BNZXJnZSgKICAgICAgICAgICAgICBoaWVyYXJjaHkuY29yZVR5cGVzLAogICAgICAgICAgICAgIG5vcm0oaGllcmFyY2h5LmNvcmVUeXBlcywgc3VwZXJjbGFzcyksCiAgICAgICAgICAgICAgbm9ybShoaWVyYXJjaHkuY29yZVR5cGVzLCB0eXBlKSk7CiAgICAgICAgICBpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb25mbGljdC4KICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUmVwb3J0IGVycm9ycyBoZXJlIGluc3RlYWQgb2YgdGhyb3VnaAogICAgICAgICAgICAvLyB0aGUgY29tcHV0YXRpb24gb2YgdGhlIFtDbGFzc0hpZXJhcmNoeV0uCiAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzZXNbZGVwdGhdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VwZXJjbGFzc2VzW2RlcHRoXSA9IHN1cGVyY2xhc3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdXBlcmNsYXNzOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgLy8gVGhpcyBpcyBhIHF1YWRyYXRpYyBhbGdvcml0aG0sIGJ1dCBub3JtYWxseSwgdGhlIG51bWJlciBvZgogICAgICAgICAgLy8gaW50ZXJmYWNlcyBpcyByZWFsbHkgc21hbGwuCiAgICAgICAgICBEYXJ0VHlwZSBpbnRlcmZhY2UgPSBpbnRlcmZhY2VzW2ldOwogICAgICAgICAgaWYgKGludGVyZmFjZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgICAgaW50ZXJmYWNlLmNsYXNzTm9kZSA9PSB0eXBlLmNsYXNzTm9kZSkgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGNvbmZsaWN0LgogICAgICAgICAgICBpZiAoY2xhc3NCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgICAgICAgIGludGVyZmFjZSA9IG5uYmRUb3BNZXJnZSgKICAgICAgICAgICAgICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcywKICAgICAgICAgICAgICAgICAgbm9ybShoaWVyYXJjaHkuY29yZVR5cGVzLCBpbnRlcmZhY2UpLAogICAgICAgICAgICAgICAgICBub3JtKGhpZXJhcmNoeS5jb3JlVHlwZXMsIHR5cGUpKTsKICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb25mbGljdC4KICAgICAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcG9ydCBlcnJvcnMgaGVyZSBpbnN0ZWFkIG9mIHRocm91Z2gKICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgW0NsYXNzSGllcmFyY2h5XS4KICAgICAgICAgICAgICAgIGludGVyZmFjZSA9IGludGVyZmFjZXNbaV07CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGludGVyZmFjZXNbaV0gPSBpbnRlcmZhY2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGludGVyZmFjZXMuYWRkKHR5cGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBNZXJnZVJlc3VsdCBtZXJnZUludGVyZmFjZXMoCiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBzdXBlcm5vZGUsIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZUJ1aWxkZXJzKSB7CiAgICBkZWJ1Zz8ubG9nKCJtZXJnZUludGVyZmFjZXMoJGNsYXNzQnVpbGRlciAoJHt0aGlzLmNsYXNzQnVpbGRlcn0pICIKICAgICAgICAiJHtzdXBlcm5vZGUuaW50ZXJmYWNlc30gJHtpbnRlcmZhY2VCdWlsZGVyc30iKTsKICAgIExpc3Q8TGlzdDxDbGFzc01lbWJlcj4+IG1lbWJlckxpc3RzID0KICAgICAgICBuZXcgTGlzdDxMaXN0PENsYXNzTWVtYmVyPj4oaW50ZXJmYWNlQnVpbGRlcnMubGVuZ3RoICsgMSk7CiAgICBMaXN0PExpc3Q8Q2xhc3NNZW1iZXI+PiBzZXR0ZXJMaXN0cyA9CiAgICAgICAgbmV3IExpc3Q8TGlzdDxDbGFzc01lbWJlcj4+KGludGVyZmFjZUJ1aWxkZXJzLmxlbmd0aCArIDEpOwogICAgbWVtYmVyTGlzdHNbMF0gPSBzdXBlcm5vZGUuaW50ZXJmYWNlTWVtYmVyczsKICAgIHNldHRlckxpc3RzWzBdID0gc3VwZXJub2RlLmludGVyZmFjZVNldHRlcnM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZUJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzSGllcmFyY2h5Tm9kZSBpbnRlcmZhY2VOb2RlID0KICAgICAgICAgIGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGVCdWlsZGVyKGludGVyZmFjZUJ1aWxkZXJzW2ldKTsKICAgICAgaWYgKGludGVyZmFjZU5vZGUgPT0gbnVsbCkgewogICAgICAgIG1lbWJlckxpc3RzW2kgKyAxXSA9IG51bGw7CiAgICAgICAgc2V0dGVyTGlzdHNbaSArIDFdID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBtZW1iZXJMaXN0c1tpICsgMV0gPQogICAgICAgICAgICBpbnRlcmZhY2VOb2RlLmludGVyZmFjZU1lbWJlcnMgPz8gaW50ZXJmYWNlTm9kZS5jbGFzc01lbWJlcnM7CiAgICAgICAgc2V0dGVyTGlzdHNbaSArIDFdID0KICAgICAgICAgICAgaW50ZXJmYWNlTm9kZS5pbnRlcmZhY2VTZXR0ZXJzID8/IGludGVyZmFjZU5vZGUuY2xhc3NTZXR0ZXJzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IE1lcmdlUmVzdWx0KG1lcmdlTGlzdHMobWVtYmVyTGlzdHMsIE1lcmdlS2luZC5pbnRlcmZhY2VzTWVtYmVycyksCiAgICAgICAgbWVyZ2VMaXN0cyhzZXR0ZXJMaXN0cywgTWVyZ2VLaW5kLmludGVyZmFjZXNTZXR0ZXJzKSk7CiAgfQoKICBMaXN0PENsYXNzTWVtYmVyPiBtZXJnZUxpc3RzKAogICAgICBMaXN0PExpc3Q8Q2xhc3NNZW1iZXI+PiBpbnB1dCwgTWVyZ2VLaW5kIG1lcmdlS2luZCkgewogICAgLy8gVGhpcyBpcyBhIGstd2F5IG1lcmdlIHNvcnQgKHdoZXJlIGsgaXMgYGlucHV0Lmxlbmd0aCArIDFgKS4gV2UgbWVyZ2UgdGhlCiAgICAvLyBsaXN0cyBwYWlyd2lzZSwgd2hpY2ggcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGxpc3RzIHRvIG1lcmdlIGJ5IGhhbGYgb24KICAgIC8vIGVhY2ggaXRlcmF0aW9uLiBDb25zZXF1ZW50bHksIHdlIHBlcmZvcm0gTyhsb2cgaykgbWVyZ2VzLgogICAgd2hpbGUgKGlucHV0Lmxlbmd0aCA+IDEpIHsKICAgICAgTGlzdDxMaXN0PENsYXNzTWVtYmVyPj4gb3V0cHV0ID0gPExpc3Q8Q2xhc3NNZW1iZXI+PltdOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICAgIExpc3Q8Q2xhc3NNZW1iZXI+IGZpcnN0ID0gaW5wdXRbaV07CiAgICAgICAgTGlzdDxDbGFzc01lbWJlcj4gc2Vjb25kID0gaW5wdXRbaSArIDFdOwogICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CiAgICAgICAgICBvdXRwdXQuYWRkKHNlY29uZCk7CiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmQgPT0gbnVsbCkgewogICAgICAgICAgb3V0cHV0LmFkZChmaXJzdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dHB1dC5hZGQobWVyZ2UoZmlyc3QsIHNlY29uZCwgbWVyZ2VLaW5kKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbnB1dC5sZW5ndGguaXNPZGQpIHsKICAgICAgICBvdXRwdXQuYWRkKGlucHV0Lmxhc3QpOwogICAgICB9CiAgICAgIGlucHV0ID0gb3V0cHV0OwogICAgfQogICAgcmV0dXJuIGlucHV0LnNpbmdsZTsKICB9CgogIC8vLyBNZXJnZSBbYW5kIGNoZWNrXSBhY2Nlc3NvcnMuIFRoaXMgZW50YWlscyBjb3B5aW5nIG11dGFibGUgZmllbGRzIHRvCiAgLy8vIHNldHRlcnMgdG8gc2ltdWxhdGUgaW1wbGllZCBzZXR0ZXJzLCBhbmQgY2hlY2tpbmcgdGhhdCBzZXR0ZXJzIGRvbid0CiAgLy8vIG92ZXJyaWRlIHJlZ3VsYXIgbWV0aG9kcy4KICBMaXN0PENsYXNzTWVtYmVyPiBtZXJnZUFjY2Vzc29ycygKICAgICAgTGlzdDxDbGFzc01lbWJlcj4gbWVtYmVycywgTGlzdDxDbGFzc01lbWJlcj4gc2V0dGVycykgewogICAgZmluYWwgTGlzdDxDbGFzc01lbWJlcj4gbWVyZ2VkU2V0dGVycyA9IG5ldyBMaXN0PENsYXNzTWVtYmVyPi5maWxsZWQoCiAgICAgICAgbWVtYmVycy5sZW5ndGggKyBzZXR0ZXJzLmxlbmd0aCwgbnVsbCwKICAgICAgICBncm93YWJsZTogdHJ1ZSk7CiAgICBpbnQgc3RvcmVJbmRleCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICBpbnQgaiA9IDA7CiAgICB3aGlsZSAoaSA8IG1lbWJlcnMubGVuZ3RoICYmIGogPCBzZXR0ZXJzLmxlbmd0aCkgewogICAgICBmaW5hbCBDbGFzc01lbWJlciBtZW1iZXIgPSBtZW1iZXJzW2ldOwogICAgICBmaW5hbCBDbGFzc01lbWJlciBzZXR0ZXIgPSBzZXR0ZXJzW2pdOwogICAgICBmaW5hbCBpbnQgY29tcGFyZSA9IGNvbXBhcmVEZWNsYXJhdGlvbnMobWVtYmVyLCBzZXR0ZXIpOwogICAgICBpZiAoY29tcGFyZSA9PSAwKSB7CiAgICAgICAgbWVyZ2VkU2V0dGVyc1tzdG9yZUluZGV4KytdID0gc2V0dGVyOwogICAgICAgIGkrKzsKICAgICAgICBqKys7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKICAgICAgICBpZiAoaW1wbGllc1NldHRlcihtZW1iZXIpKSB7CiAgICAgICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBtZW1iZXI7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBtZXJnZWRTZXR0ZXJzW3N0b3JlSW5kZXgrK10gPSBzZXR0ZXJzW2pdOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgd2hpbGUgKGkgPCBtZW1iZXJzLmxlbmd0aCkgewogICAgICBmaW5hbCBDbGFzc01lbWJlciBtZW1iZXIgPSBtZW1iZXJzW2ldOwogICAgICBpZiAoaW1wbGllc1NldHRlcihtZW1iZXIpKSB7CiAgICAgICAgbWVyZ2VkU2V0dGVyc1tzdG9yZUluZGV4KytdID0gbWVtYmVyOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICAgIHdoaWxlIChqIDwgc2V0dGVycy5sZW5ndGgpIHsKICAgICAgbWVyZ2VkU2V0dGVyc1tzdG9yZUluZGV4KytdID0gc2V0dGVyc1tqXTsKICAgICAgaisrOwogICAgfQoKICAgIGlmIChzdG9yZUluZGV4ID09IGopIHsKICAgICAgcmV0dXJuIHNldHRlcnM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbWVyZ2VkU2V0dGVycy4ubGVuZ3RoID0gc3RvcmVJbmRleDsKICAgIH0KICB9CgogIHZvaWQgcmVwb3J0TWlzc2luZ01lbWJlcnMoKSB7CiAgICBNYXA8U3RyaW5nLCBMb2NhdGVkTWVzc2FnZT4gY29udGV4dE1hcCA9IDxTdHJpbmcsIExvY2F0ZWRNZXNzYWdlPnt9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhYnN0cmFjdE1lbWJlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgQ2xhc3NNZW1iZXIgZGVjbGFyYXRpb24gPSBhYnN0cmFjdE1lbWJlcnNbaV07CiAgICAgIE1lbWJlciB0YXJnZXQgPSBkZWNsYXJhdGlvbi5tZW1iZXI7CiAgICAgIGlmIChpc05hbWVWaXNpYmxlSW4odGFyZ2V0Lm5hbWUsIGNsYXNzQnVpbGRlci5saWJyYXJ5KSkgewogICAgICAgIFN0cmluZyBuYW1lID0gZGVjbGFyYXRpb24uZnVsbE5hbWVGb3JFcnJvcnM7CiAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmF0aW9uLmNsYXNzQnVpbGRlcj8uZnVsbE5hbWVGb3JFcnJvcnM7CiAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0KICAgICAgICAgICAgZGVjbGFyYXRpb24uaXNTZXR0ZXIgPyAiJGNsYXNzTmFtZS4kbmFtZT0iIDogIiRjbGFzc05hbWUuJG5hbWUiOwogICAgICAgIGNvbnRleHRNYXBbZGlzcGxheU5hbWVdID0gdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZQogICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhkaXNwbGF5TmFtZSkKICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmZpbGVVcmksIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbnRleHRNYXAuaXNFbXB0eSkgcmV0dXJuOwogICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IExpc3Q8U3RyaW5nPi5mcm9tKGNvbnRleHRNYXAua2V5cykuLnNvcnQoKTsKICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+W107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnRleHQuYWRkKGNvbnRleHRNYXBbbmFtZXNbaV1dKTsKICAgIH0KICAgIGNsYXNzQnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3Qud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzLCBuYW1lcyksCiAgICAgICAgY2xhc3NCdWlsZGVyLmNoYXJPZmZzZXQsCiAgICAgICAgY2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICB9CgogIHZvaWQgaW5zdGFsbE5zbUhhbmRsZXJzKCkgewogICAgLy8gVE9ETyhhaGUpOiBJbXBsZW1lbnQgdGhpcy4KICB9CgogIExpc3Q8Q2xhc3NNZW1iZXI+IG1lcmdlKAogICAgICBMaXN0PENsYXNzTWVtYmVyPiBhTGlzdCwgTGlzdDxDbGFzc01lbWJlcj4gYkxpc3QsIE1lcmdlS2luZCBtZXJnZUtpbmQpIHsKICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogICAgZmluYWwgTGlzdDxDbGFzc01lbWJlcj4gcmVzdWx0ID0gbmV3IExpc3Q8Q2xhc3NNZW1iZXI+LmZpbGxlZCgKICAgICAgICBhTGlzdC5sZW5ndGggKyBiTGlzdC5sZW5ndGgsIG51bGwsCiAgICAgICAgZ3Jvd2FibGU6IHRydWUpOwogICAgaW50IHN0b3JlSW5kZXggPSAwOwogICAgaW50IGkgPSAwOwogICAgaW50IGogPSAwOwogICAgd2hpbGUgKGkgPCBhTGlzdC5sZW5ndGggJiYgaiA8IGJMaXN0Lmxlbmd0aCkgewogICAgICBmaW5hbCBDbGFzc01lbWJlciBhID0gYUxpc3RbaV07CiAgICAgIGZpbmFsIENsYXNzTWVtYmVyIGIgPSBiTGlzdFtqXTsKICAgICAgaWYgKG1lcmdlS2luZC5iZXR3ZWVuSW50ZXJmYWNlcyAmJiBhLmlzU3RhdGljKSB7CiAgICAgICAgaSsrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChiLmlzU3RhdGljKSB7CiAgICAgICAgaisrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZpbmFsIGludCBjb21wYXJlID0gY29tcGFyZURlY2xhcmF0aW9ucyhhLCBiKTsKICAgICAgaWYgKGNvbXBhcmUgPT0gMCkgewogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gaGFuZGxlTWVyZ2VDb25mbGljdChhLCBiLCBtZXJnZUtpbmQpOwogICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIGkrKzsKICAgICAgICBqKys7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKICAgICAgICBDbGFzc01lbWJlciBtZW1iZXIgPSBoYW5kbGVPbmx5QShhLCBtZXJnZUtpbmQpOwogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gbWVtYmVyOwogICAgICAgIGlmICghaWRlbnRpY2FsKG1lbWJlciwgYSkpIHsKICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQ2xhc3NNZW1iZXIgbWVtYmVyID0gaGFuZGxlT25seUIoYiwgbWVyZ2VLaW5kKTsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IG1lbWJlcjsKICAgICAgICBpZiAoIWlkZW50aWNhbChtZW1iZXIsIGIpKSB7CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICB3aGlsZSAoaSA8IGFMaXN0Lmxlbmd0aCkgewogICAgICBmaW5hbCBDbGFzc01lbWJlciBhID0gYUxpc3RbaV07CiAgICAgIGlmICghbWVyZ2VLaW5kLmJldHdlZW5JbnRlcmZhY2VzIHx8ICFhLmlzU3RhdGljKSB7CiAgICAgICAgQ2xhc3NNZW1iZXIgbWVtYmVyID0gaGFuZGxlT25seUEoYSwgbWVyZ2VLaW5kKTsKICAgICAgICByZXN1bHRbc3RvcmVJbmRleCsrXSA9IG1lbWJlcjsKICAgICAgICBpZiAoIWlkZW50aWNhbChtZW1iZXIsIGEpKSB7CiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogICAgd2hpbGUgKGogPCBiTGlzdC5sZW5ndGgpIHsKICAgICAgZmluYWwgQ2xhc3NNZW1iZXIgYiA9IGJMaXN0W2pdOwogICAgICBpZiAoIWIuaXNTdGF0aWMpIHsKICAgICAgICBDbGFzc01lbWJlciBtZW1iZXIgPSBoYW5kbGVPbmx5QihiLCBtZXJnZUtpbmQpOwogICAgICAgIHJlc3VsdFtzdG9yZUluZGV4KytdID0gbWVtYmVyOwogICAgICAgIGlmICghaWRlbnRpY2FsKG1lbWJlciwgYikpIHsKICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBqKys7CiAgICB9CiAgICBpZiAoIWNoYW5nZWQgJiYgYUxpc3QuaXNFbXB0eSAmJiBzdG9yZUluZGV4ID09IGJMaXN0Lmxlbmd0aCkgewogICAgICBhc3NlcnQoCiAgICAgICAgICBfZXF1YWxzTGlzdChyZXN1bHQsIGJMaXN0LCBzdG9yZUluZGV4KSwKICAgICAgICAgICJMaXN0IG1pc21hdGNoOiBFeHBlY3RlZDogJHtiTGlzdH0sICIKICAgICAgICAgICJhY3R1YWwgJHtyZXN1bHQuc3VibGlzdCgwLCBzdG9yZUluZGV4KX0iKTsKICAgICAgcmV0dXJuIGJMaXN0OwogICAgfQogICAgaWYgKCFjaGFuZ2VkICYmIGJMaXN0LmlzRW1wdHkgJiYgc3RvcmVJbmRleCA9PSBhTGlzdC5sZW5ndGgpIHsKICAgICAgYXNzZXJ0KAogICAgICAgICAgX2VxdWFsc0xpc3QocmVzdWx0LCBhTGlzdCwgc3RvcmVJbmRleCksCiAgICAgICAgICAiTGlzdCBtaXNtYXRjaDogRXhwZWN0ZWQ6ICR7YUxpc3R9LCAiCiAgICAgICAgICAiYWN0dWFsICR7cmVzdWx0LnN1Ymxpc3QoMCwgc3RvcmVJbmRleCl9Iik7CiAgICAgIHJldHVybiBhTGlzdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQuLmxlbmd0aCA9IHN0b3JlSW5kZXg7CiAgfQoKICB2b2lkIGluZmVyTWl4aW5BcHBsaWNhdGlvbigpIHsKICAgIENsYXNzIGNscyA9IGNsYXNzQnVpbGRlci5jbHM7CiAgICBTdXBlcnR5cGUgbWl4ZWRJblR5cGUgPSBjbHMubWl4ZWRJblR5cGU7CiAgICBpZiAobWl4ZWRJblR5cGUgPT0gbnVsbCkgcmV0dXJuOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IG1peGVkSW5UeXBlLnR5cGVBcmd1bWVudHM7CiAgICBpZiAodHlwZUFyZ3VtZW50cy5pc0VtcHR5IHx8IHR5cGVBcmd1bWVudHMuZmlyc3QgaXMhIFVua25vd25UeXBlKSByZXR1cm47CiAgICBuZXcgQnVpbGRlck1peGluSW5mZXJyZXIoCiAgICAgICAgICAgIGNsYXNzQnVpbGRlciwKICAgICAgICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcywKICAgICAgICAgICAgbmV3IFR5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyKGhpZXJhcmNoeSwKICAgICAgICAgICAgICAgIG1peGVkSW5UeXBlLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycywgY2xzLmVuY2xvc2luZ0xpYnJhcnkpKQogICAgICAgIC5pbmZlcihjbHMpOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gaW5mZXJyZWRBcmd1bWVudHMgPQogICAgICAgIG5ldyBMaXN0PFR5cGVCdWlsZGVyPih0eXBlQXJndW1lbnRzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgaW5mZXJyZWRBcmd1bWVudHNbaV0gPQogICAgICAgICAgaGllcmFyY2h5LmxvYWRlci5jb21wdXRlVHlwZUJ1aWxkZXIodHlwZUFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICBOYW1lZFR5cGVCdWlsZGVyIG1peGVkSW5UeXBlQnVpbGRlciA9IGNsYXNzQnVpbGRlci5taXhlZEluVHlwZTsKICAgIG1peGVkSW5UeXBlQnVpbGRlci5hcmd1bWVudHMgPSBpbmZlcnJlZEFyZ3VtZW50czsKICB9CgogIC8vLyBUaGUgY2xhc3MgRnVuY3Rpb24gZnJvbSBkYXJ0OmNvcmUgaXMgc3VwcG9zZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZWQgYXMKICAvLy8gYW4gaW50ZXJmYWNlLgogIExpc3Q8VHlwZUJ1aWxkZXI+IGlnbm9yZUZ1bmN0aW9uKExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMpIHsKICAgIGlmIChpbnRlcmZhY2VzID09IG51bGwpIHJldHVybiBudWxsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIgPSBnZXRDbGFzcyhpbnRlcmZhY2VzW2ldKTsKICAgICAgaWYgKGNsYXNzQnVpbGRlciAhPSBudWxsICYmIGNsYXNzQnVpbGRlci5jbHMgPT0gaGllcmFyY2h5LmZ1bmN0aW9uQ2xhc3MpIHsKICAgICAgICBpZiAoaW50ZXJmYWNlcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzLnRvTGlzdCgpOwogICAgICAgICAgaW50ZXJmYWNlcy5yZW1vdmVBdChpKTsKICAgICAgICAgIHJldHVybiBpZ25vcmVGdW5jdGlvbihpbnRlcmZhY2VzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbnRlcmZhY2VzOwogIH0KfQoKY2xhc3MgQ2xhc3NIaWVyYXJjaHlOb2RlIHsKICAvLy8gVGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBoaWVyYXJjaHkgbm9kZS4KICBmaW5hbCBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyOwoKICAvLy8gQWxsIHRoZSBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgaW5jbHVkaW5nIFtjbGFzc01lbWJlcnNdIG9mIGl0cwogIC8vLyBzdXBlcmNsYXNzZXMuIFRoZSBtZW1iZXJzIGFyZSBzb3J0ZWQgYnkgW2NvbXBhcmVEZWNsYXJhdGlvbnNdLgogIGZpbmFsIExpc3Q8Q2xhc3NNZW1iZXI+IGNsYXNzTWVtYmVyczsKCiAgLy8vIFNpbWlsYXIgdG8gW2NsYXNzTWVtYmVyc10gYnV0IGZvciBzZXR0ZXJzLgogIGZpbmFsIExpc3Q8Q2xhc3NNZW1iZXI+IGNsYXNzU2V0dGVyczsKCiAgLy8vIEFsbCB0aGUgaW50ZXJmYWNlIG1lbWJlcnMgb2YgdGhpcyBjbGFzcyBpbmNsdWRpbmcgW2ludGVyZmFjZU1lbWJlcnNdIG9mCiAgLy8vIGl0cyBzdXBlcnR5cGVzLiBUaGUgbWVtYmVycyBhcmUgc29ydGVkIGJ5IFtjb21wYXJlRGVjbGFyYXRpb25zXS4KICAvLy8KICAvLy8gSW4gYWRkaXRpb24gdG8gdGhlIG1lbWJlcnMgb2YgW2NsYXNzTWVtYmVyc10gdGhpcyBhbHNvIGNvbnRhaW5zIG1lbWJlcnMKICAvLy8gZnJvbSBpbnRlcmZhY2VzLgogIC8vLwogIC8vLyBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIFtjbGFzc01lbWJlcnNdIGlzIHRoZSBpbnRlcmZhY2UgbWVtYmVycy4KICBmaW5hbCBMaXN0PENsYXNzTWVtYmVyPiBpbnRlcmZhY2VNZW1iZXJzOwoKICAvLy8gU2ltaWxhciB0byBbaW50ZXJmYWNlTWVtYmVyc10gYnV0IGZvciBzZXR0ZXJzLgogIC8vLwogIC8vLyBUaGlzIG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIFtjbGFzc1NldHRlcnNdIGlzIHRoZSBpbnRlcmZhY2Ugc2V0dGVycy4KICBmaW5hbCBMaXN0PENsYXNzTWVtYmVyPiBpbnRlcmZhY2VTZXR0ZXJzOwoKICAvLy8gQWxsIHN1cGVyY2xhc3NlcyBvZiBbY2xhc3NCdWlsZGVyXSBleGNsdWRpbmcgaXRzZWxmLiBUaGUgY2xhc3NlcyBhcmUKICAvLy8gc29ydGVkIGJ5IGRlcHRoIGZyb20gdGhlIHJvb3QgKE9iamVjdCkgaW4gYXNjZW5kaW5nIG9yZGVyLgogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHN1cGVyY2xhc3NlczsKCiAgLy8vIFRoZSBsaXN0IG9mIGFsbCBjbGFzc2VzIGltcGxlbWVudGVkIGJ5IFtjbGFzc0J1aWxkZXJdIGFuZCBpdHMgc3VwZXJ0eXBlcwogIC8vLyBleGNsdWRpbmcgYW55IGNsYXNzZXMgZnJvbSBbc3VwZXJjbGFzc2VzXS4KICBmaW5hbCBMaXN0PERhcnRUeXBlPiBpbnRlcmZhY2VzOwoKICAvLy8gVGhlIGxvbmdlc3QgaW5oZXJpdGFuY2UgcGF0aCBmcm9tIFtjbGFzc0J1aWxkZXJdIHRvIGBPYmplY3RgLgogIGZpbmFsIGludCBtYXhJbmhlcml0YW5jZVBhdGg7CgogIGludCBnZXQgZGVwdGggPT4gc3VwZXJjbGFzc2VzLmxlbmd0aDsKCiAgZmluYWwgYm9vbCBoYXNOb1N1Y2hNZXRob2Q7CgogIENsYXNzSGllcmFyY2h5Tm9kZSgKICAgICAgdGhpcy5jbGFzc0J1aWxkZXIsCiAgICAgIHRoaXMuY2xhc3NNZW1iZXJzLAogICAgICB0aGlzLmNsYXNzU2V0dGVycywKICAgICAgdGhpcy5pbnRlcmZhY2VNZW1iZXJzLAogICAgICB0aGlzLmludGVyZmFjZVNldHRlcnMsCiAgICAgIHRoaXMuc3VwZXJjbGFzc2VzLAogICAgICB0aGlzLmludGVyZmFjZXMsCiAgICAgIHRoaXMubWF4SW5oZXJpdGFuY2VQYXRoLAogICAgICB0aGlzLmhhc05vU3VjaE1ldGhvZCk7CgogIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc3VwZXJ0eXBlcyBvZiBbY2xhc3NCdWlsZGVyXSwgaW5jbHVkaW5nIHRoaXMgbm9kZS4KICBMaXN0PENsYXNzSGllcmFyY2h5Tm9kZT4gY29tcHV0ZUFsbFN1cGVyTm9kZXMoCiAgICAgIENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICAgIExpc3Q8Q2xhc3NIaWVyYXJjaHlOb2RlPiByZXN1bHQgPSBuZXcgTGlzdDxDbGFzc0hpZXJhcmNoeU5vZGU+KAogICAgICAgIDEgKyBzdXBlcmNsYXNzZXMubGVuZ3RoICsgaW50ZXJmYWNlcy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcmNsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgRGFydFR5cGUgdHlwZSA9IHN1cGVyY2xhc3Nlc1tpXTsKICAgICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIHJlc3VsdFtpXSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbUNsYXNzKHR5cGUuY2xhc3NOb2RlKTsKICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBpbnRlcmZhY2VzW2ldOwogICAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgcmVzdWx0W2kgKyBzdXBlcmNsYXNzZXMubGVuZ3RoXSA9CiAgICAgICAgICAgIGhpZXJhcmNoeS5nZXROb2RlRnJvbUNsYXNzKHR5cGUuY2xhc3NOb2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdC4ubGFzdCA9IHRoaXM7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYgogICAgICAuLndyaXRlKGNsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9ycykKICAgICAgLi53cml0ZWxuKCI6Iik7CiAgICBpZiAobWF4SW5oZXJpdGFuY2VQYXRoICE9IHRoaXMuZGVwdGgpIHsKICAgICAgc2IKICAgICAgICAuLndyaXRlKCIgIExvbmdlc3QgcGF0aCB0byBPYmplY3Q6ICIpCiAgICAgICAgLi53cml0ZWxuKG1heEluaGVyaXRhbmNlUGF0aCk7CiAgICB9CiAgICBzYi4ud3JpdGVsbigiICBzdXBlcmNsYXNzZXM6Iik7CiAgICBpbnQgZGVwdGggPSAwOwogICAgZm9yIChEYXJ0VHlwZSBzdXBlcmNsYXNzIGluIHN1cGVyY2xhc3NlcykgewogICAgICBzYi53cml0ZSgiICAiICogKGRlcHRoICsgMikpOwogICAgICBpZiAoZGVwdGggIT0gMCkgc2Iud3JpdGUoIi0+ICIpOwogICAgICBzYi53cml0ZSh0eXBlVG9UZXh0KHN1cGVyY2xhc3MpKTsKICAgICAgc2Iud3JpdGVsbigpOwogICAgICBkZXB0aCsrOwogICAgfQogICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiICBpbnRlcmZhY2VzOiIpOwogICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICAgZm9yIChEYXJ0VHlwZSBpIGluIGludGVyZmFjZXMpIHsKICAgICAgICBpZiAoIWZpcnN0KSBzYi53cml0ZSgiLCIpOwogICAgICAgIHNiLndyaXRlKCIgIik7CiAgICAgICAgc2Iud3JpdGUodHlwZVRvVGV4dChpKSk7CiAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgfQogICAgICBzYi53cml0ZWxuKCk7CiAgICB9CiAgICBwcmludE1lbWJlcnMoY2xhc3NNZW1iZXJzLCBzYiwgImNsYXNzTWVtYmVycyIpOwogICAgcHJpbnRNZW1iZXJzKGNsYXNzU2V0dGVycywgc2IsICJjbGFzc1NldHRlcnMiKTsKICAgIGlmIChpbnRlcmZhY2VNZW1iZXJzICE9IG51bGwpIHsKICAgICAgcHJpbnRNZW1iZXJzKGludGVyZmFjZU1lbWJlcnMsIHNiLCAiaW50ZXJmYWNlTWVtYmVycyIpOwogICAgfQogICAgaWYgKGludGVyZmFjZVNldHRlcnMgIT0gbnVsbCkgewogICAgICBwcmludE1lbWJlcnMoaW50ZXJmYWNlU2V0dGVycywgc2IsICJpbnRlcmZhY2VTZXR0ZXJzIik7CiAgICB9CiAgICByZXR1cm4gIiRzYiI7CiAgfQoKICB2b2lkIHByaW50TWVtYmVycygKICAgICAgTGlzdDxDbGFzc01lbWJlcj4gbWVtYmVycywgU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgaGVhZGluZykgewogICAgc2Iud3JpdGUoIiAgIik7CiAgICBzYi53cml0ZShoZWFkaW5nKTsKICAgIHNiLndyaXRlbG4oIjoiKTsKICAgIGZvciAoQ2xhc3NNZW1iZXIgbWVtYmVyIGluIG1lbWJlcnMpIHsKICAgICAgc2IKICAgICAgICAuLndyaXRlKCIgICAgIikKICAgICAgICAuLndyaXRlKG1lbWJlci5jbGFzc0J1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgLi53cml0ZSgiLiIpCiAgICAgICAgLi53cml0ZShtZW1iZXIuZnVsbE5hbWVGb3JFcnJvcnMpCiAgICAgICAgLi53cml0ZWxuKCk7CiAgICB9CiAgfQoKICBDbGFzc01lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoTmFtZSBuYW1lLCBib29sIGlzU2V0dGVyKSB7CiAgICByZXR1cm4gZmluZE1lbWJlcigKICAgICAgICBuYW1lLAogICAgICAgIGlzU2V0dGVyCiAgICAgICAgICAgID8gaW50ZXJmYWNlU2V0dGVycyA/PyBjbGFzc1NldHRlcnMKICAgICAgICAgICAgOiBpbnRlcmZhY2VNZW1iZXJzID8/IGNsYXNzTWVtYmVycyk7CiAgfQoKICBDbGFzc01lbWJlciBmaW5kTWVtYmVyKE5hbWUgbmFtZSwgTGlzdDxDbGFzc01lbWJlcj4gZGVjbGFyYXRpb25zKSB7CiAgICAvLyBUT0RPKGFoZSk6IENvbnNpZGVyIGNyZWF0aW5nIGEgbWFwIG9yIHNjb3BlLiBUaGUgb2J2aW91cyBjaG9pY2Ugd291bGQgYmUKICAgIC8vIHRvIHVzZSBzY29wZXMsIGJ1dCB0aGV5IGRvbid0IGhhbmRsZSBwcml2YXRlIG5hbWVzIGNvcnJlY3RseS4KCiAgICAvLyBUaGlzIGlzIGEgY29weSBvZiBgQ2xhc3NIaWVyYXJjaHkuZmluZE1lbWJlckJ5TmFtZWAuCiAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGRlY2xhcmF0aW9ucy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIGludCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpOwogICAgICBDbGFzc01lbWJlciBwaXZvdCA9IGRlY2xhcmF0aW9uc1ttaWRdOwogICAgICBpbnQgY29tcGFyaXNvbiA9IENsYXNzSGllcmFyY2h5LmNvbXBhcmVOYW1lcyhuYW1lLCBwaXZvdC5tZW1iZXIubmFtZSk7CiAgICAgIGlmIChjb21wYXJpc29uIDwgMCkgewogICAgICAgIGhpZ2ggPSBtaWQgLSAxOwogICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgfSBlbHNlIGlmIChoaWdoICE9IG1pZCkgewogICAgICAgIC8vIEVuc3VyZSB3ZSBmaW5kIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBuYW1lLgogICAgICAgIGhpZ2ggPSBtaWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBpdm90OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIENsYXNzTWVtYmVyIGdldERpc3BhdGNoVGFyZ2V0KE5hbWUgbmFtZSwgYm9vbCBpc1NldHRlcikgewogICAgcmV0dXJuIGZpbmRNZW1iZXIobmFtZSwgaXNTZXR0ZXIgPyBjbGFzc1NldHRlcnMgOiBjbGFzc01lbWJlcnMpOwogIH0KCiAgc3RhdGljIGludCBjb21wYXJlTWF4SW5oZXJpdGFuY2VQYXRoKAogICAgICBDbGFzc0hpZXJhcmNoeU5vZGUgYSwgQ2xhc3NIaWVyYXJjaHlOb2RlIGIpIHsKICAgIHJldHVybiBiLm1heEluaGVyaXRhbmNlUGF0aC5jb21wYXJlVG8oYS5tYXhJbmhlcml0YW5jZVBhdGgpOwogIH0KfQoKY2xhc3MgTWVyZ2VSZXN1bHQgewogIGZpbmFsIExpc3Q8Q2xhc3NNZW1iZXI+IG1lcmdlZE1lbWJlcnM7CgogIGZpbmFsIExpc3Q8Q2xhc3NNZW1iZXI+IG1lcmdlZFNldHRlcnM7CgogIE1lcmdlUmVzdWx0KHRoaXMubWVyZ2VkTWVtYmVycywgdGhpcy5tZXJnZWRTZXR0ZXJzKTsKfQoKY2xhc3MgTWVyZ2VLaW5kIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgZmluYWwgYm9vbCBmb3JTZXR0ZXJzOwoKICBmaW5hbCBib29sIGJldHdlZW5JbnRlcmZhY2VzOwoKICBmaW5hbCBib29sIGZyb21TdXBlcmNsYXNzOwoKICBmaW5hbCBib29sIGZyb21JbnRlcmZhY2VzOwoKICBmaW5hbCBib29sIGZvck1lbWJlcnNWc1NldHRlcnM7CgogIGZpbmFsIGJvb2wgaW50b0N1cnJlbnRDbGFzczsKCiAgY29uc3QgTWVyZ2VLaW5kKHRoaXMubmFtZSwKICAgICAge3RoaXMuZm9yU2V0dGVyczogZmFsc2UsCiAgICAgIHRoaXMuYmV0d2VlbkludGVyZmFjZXM6IGZhbHNlLAogICAgICB0aGlzLmZyb21TdXBlcmNsYXNzOiBmYWxzZSwKICAgICAgdGhpcy5mcm9tSW50ZXJmYWNlczogZmFsc2UsCiAgICAgIHRoaXMuZm9yTWVtYmVyc1ZzU2V0dGVyczogZmFsc2UsCiAgICAgIHRoaXMuaW50b0N1cnJlbnRDbGFzczogZmFsc2V9KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ01lcmdlS2luZCgkbmFtZSknOwoKICAvLy8gTWVyZ2luZyBzdXBlcmNsYXNzIG1lbWJlcnMgd2l0aCB0aGUgY3VycmVudCBjbGFzcy4KICBzdGF0aWMgY29uc3QgTWVyZ2VLaW5kIHN1cGVyY2xhc3NNZW1iZXJzID0gY29uc3QgTWVyZ2VLaW5kKAogICAgICAnTWVyZ2luZyBzdXBlcmNsYXNzIG1lbWJlcnMgd2l0aCB0aGUgY3VycmVudCBjbGFzcy4nLAogICAgICBmcm9tU3VwZXJjbGFzczogdHJ1ZSwKICAgICAgaW50b0N1cnJlbnRDbGFzczogdHJ1ZSk7CgogIC8vLyBNZXJnaW5nIHN1cGVyY2xhc3Mgc2V0dGVycyB3aXRoIHRoZSBjdXJyZW50IGNsYXNzLgogIHN0YXRpYyBjb25zdCBNZXJnZUtpbmQgc3VwZXJjbGFzc1NldHRlcnMgPSBjb25zdCBNZXJnZUtpbmQoCiAgICAgICdNZXJnaW5nIHN1cGVyY2xhc3Mgc2V0dGVycyB3aXRoIHRoZSBjdXJyZW50IGNsYXNzLicsCiAgICAgIGZyb21TdXBlcmNsYXNzOiB0cnVlLAogICAgICBpbnRvQ3VycmVudENsYXNzOiB0cnVlLAogICAgICBmb3JTZXR0ZXJzOiB0cnVlKTsKCiAgLy8vIE1lcmdpbmcgbWVtYmVycyBvZiB0d28gaW50ZXJmYWNlcy4KICBzdGF0aWMgY29uc3QgTWVyZ2VLaW5kIGludGVyZmFjZXNNZW1iZXJzID0gY29uc3QgTWVyZ2VLaW5kKAogICAgICAnTWVyZ2luZyBtZW1iZXJzIG9mIHR3byBpbnRlcmZhY2VzLicsCiAgICAgIGJldHdlZW5JbnRlcmZhY2VzOiB0cnVlKTsKCiAgLy8vIE1lcmdpbmcgc2V0dGVycyBvZiB0d28gaW50ZXJmYWNlcy4KICBzdGF0aWMgY29uc3QgTWVyZ2VLaW5kIGludGVyZmFjZXNTZXR0ZXJzID0gY29uc3QgTWVyZ2VLaW5kKAogICAgICAnTWVyZ2luZyBzZXR0ZXJzIG9mIHR3byBpbnRlcmZhY2VzLicsCiAgICAgIGJldHdlZW5JbnRlcmZhY2VzOiB0cnVlLAogICAgICBmb3JTZXR0ZXJzOiB0cnVlKTsKCiAgLy8vIE1lcmdpbmcgY2xhc3MgbWVtYmVycyB3aXRoIGludGVyZmFjZSBtZW1iZXJzLgogIHN0YXRpYyBjb25zdCBNZXJnZUtpbmQgc3VwZXJ0eXBlc01lbWJlcnMgPSBjb25zdCBNZXJnZUtpbmQoCiAgICAgICdNZXJnaW5nIGNsYXNzIG1lbWJlcnMgd2l0aCBpbnRlcmZhY2UgbWVtYmVycy4nLAogICAgICBmcm9tSW50ZXJmYWNlczogdHJ1ZSwKICAgICAgaW50b0N1cnJlbnRDbGFzczogdHJ1ZSk7CgogIC8vLyBNZXJnaW5nIGNsYXNzIHNldHRlcnMgd2l0aCBpbnRlcmZhY2Ugc2V0dGVycy4KICBzdGF0aWMgY29uc3QgTWVyZ2VLaW5kIHN1cGVydHlwZXNTZXR0ZXJzID0gY29uc3QgTWVyZ2VLaW5kKAogICAgICAnTWVyZ2luZyBjbGFzcyBzZXR0ZXJzIHdpdGggaW50ZXJmYWNlIHNldHRlcnMuJywKICAgICAgZnJvbUludGVyZmFjZXM6IHRydWUsCiAgICAgIGludG9DdXJyZW50Q2xhc3M6IHRydWUsCiAgICAgIGZvclNldHRlcnM6IHRydWUpOwoKICAvLy8gTWVyZ2luZyBtZW1iZXJzIHdpdGggaW5oZXJpdGVkIHNldHRlcnMuCiAgc3RhdGljIGNvbnN0IE1lcmdlS2luZCBtZW1iZXJzV2l0aFNldHRlcnMgPSBjb25zdCBNZXJnZUtpbmQoCiAgICAgICdNZXJnaW5nIG1lbWJlcnMgd2l0aCBpbmhlcml0ZWQgc2V0dGVycy4nLAogICAgICBmb3JNZW1iZXJzVnNTZXR0ZXJzOiB0cnVlKTsKCiAgLy8vIE1lcmdpbmcgc2V0dGVycyB3aXRoIGluaGVyaXRlZCBtZW1iZXJzLgogIHN0YXRpYyBjb25zdCBNZXJnZUtpbmQgc2V0dGVyc1dpdGhNZW1iZXJzID0gY29uc3QgTWVyZ2VLaW5kKAogICAgICAnTWVyZ2luZyBzZXR0ZXJzIHdpdGggaW5oZXJpdGVkIG1lbWJlcnMuJywKICAgICAgZm9yTWVtYmVyc1ZzU2V0dGVyczogdHJ1ZSk7Cn0KCkxpc3Q8TG9jYXRlZE1lc3NhZ2U+IGluaGVyaXRlZENvbmZsaWN0Q29udGV4dChDbGFzc01lbWJlciBhLCBDbGFzc01lbWJlciBiKSB7CiAgcmV0dXJuIGluaGVyaXRlZENvbmZsaWN0Q29udGV4dEtlcm5lbCgKICAgICAgYS5tZW1iZXIsIGIubWVtYmVyLCBhLmZ1bGxOYW1lRm9yRXJyb3JzLmxlbmd0aCk7Cn0KCkxpc3Q8TG9jYXRlZE1lc3NhZ2U+IGluaGVyaXRlZENvbmZsaWN0Q29udGV4dEtlcm5lbCgKICAgIE1lbWJlciBhLCBNZW1iZXIgYiwgaW50IGxlbmd0aCkgewogIC8vIFRPRE8oYWhlKTogRGVsZXRlIHRoaXMgbWV0aG9kIHdoZW4gaXQgaXNuJ3QgdXNlZCBieSBbSW50ZXJmYWNlUmVzb2x2ZXJdLgogIGludCBjb21wYXJlID0gIiR7YS5maWxlVXJpfSIuY29tcGFyZVRvKCIke2IuZmlsZVVyaX0iKTsKICBpZiAoY29tcGFyZSA9PSAwKSB7CiAgICBjb21wYXJlID0gYS5maWxlT2Zmc2V0LmNvbXBhcmVUbyhiLmZpbGVPZmZzZXQpOwogIH0KICBNZW1iZXIgZmlyc3Q7CiAgTWVtYmVyIHNlY29uZDsKICBpZiAoY29tcGFyZSA8IDApIHsKICAgIGZpcnN0ID0gYTsKICAgIHNlY29uZCA9IGI7CiAgfSBlbHNlIHsKICAgIGZpcnN0ID0gYjsKICAgIHNlY29uZCA9IGE7CiAgfQogIHJldHVybiA8TG9jYXRlZE1lc3NhZ2U+WwogICAgbWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMS53aXRoTG9jYXRpb24oCiAgICAgICAgZmlyc3QuZmlsZVVyaSwgZmlyc3QuZmlsZU9mZnNldCwgbGVuZ3RoKSwKICAgIG1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTIud2l0aExvY2F0aW9uKAogICAgICAgIHNlY29uZC5maWxlVXJpLCBzZWNvbmQuZmlsZU9mZnNldCwgbGVuZ3RoKSwKICBdOwp9CgpjbGFzcyBCdWlsZGVyTWl4aW5JbmZlcnJlciBleHRlbmRzIE1peGluSW5mZXJyZXIgewogIGZpbmFsIENsYXNzQnVpbGRlciBjbHM7CgogIEJ1aWxkZXJNaXhpbkluZmVycmVyKAogICAgICB0aGlzLmNscywgQ29yZVR5cGVzIGNvcmVUeXBlcywgVHlwZUJ1aWxkZXJDb25zdHJhaW50R2F0aGVyZXIgZ2F0aGVyZXIpCiAgICAgIDogc3VwZXIoY29yZVR5cGVzLCBnYXRoZXJlcik7CgogIFN1cGVydHlwZSBhc0luc3RhbnRpYXRpb25PZihTdXBlcnR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRzID0KICAgICAgICBnYXRoZXJlci5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKHR5cGUuYXNJbnRlcmZhY2VUeXBlLCBzdXBlcmNsYXNzKTsKICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IFN1cGVydHlwZShzdXBlcmNsYXNzLCBhcmd1bWVudHMpOwogIH0KCiAgdm9pZCByZXBvcnRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgQ2xhc3Mga2VybmVsQ2xhc3MpIHsKICAgIGludCBsZW5ndGggPSBjbHMuaXNNaXhpbkFwcGxpY2F0aW9uID8gMSA6IGNscy5mdWxsTmFtZUZvckVycm9ycy5sZW5ndGg7CiAgICBjbHMuYWRkUHJvYmxlbShtZXNzYWdlLCBjbHMuY2hhck9mZnNldCwgbGVuZ3RoKTsKICB9Cn0KCmNsYXNzIFR5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyIGV4dGVuZHMgVHlwZUNvbnN0cmFpbnRHYXRoZXJlcgogICAgd2l0aCBTdGFuZGFyZEJvdW5kcyB7CiAgZmluYWwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeTsKCiAgVHlwZUJ1aWxkZXJDb25zdHJhaW50R2F0aGVyZXIodGhpcy5oaWVyYXJjaHksCiAgICAgIEl0ZXJhYmxlPFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5KQogICAgICA6IHN1cGVyLnN1YmNsYXNzaW5nKHR5cGVQYXJhbWV0ZXJzLCBjdXJyZW50TGlicmFyeSk7CgogIEBvdmVycmlkZQogIENvcmVUeXBlcyBnZXQgY29yZVR5cGVzID0+IGhpZXJhcmNoeS5jb3JlVHlwZXM7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBoaWVyYXJjaHkub2JqZWN0Q2xhc3M7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzID0+IGhpZXJhcmNoeS5mdW5jdGlvbkNsYXNzOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBoaWVyYXJjaHkuZnV0dXJlT3JDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyA9PiBoaWVyYXJjaHkubnVsbENsYXNzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZExvd2VyQm91bmQoCiAgICAgIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIGxvd2VyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIGNvbnN0cmFpbnQubG93ZXIgPQogICAgICAgIGdldFN0YW5kYXJkVXBwZXJCb3VuZChjb25zdHJhaW50Lmxvd2VyLCBsb3dlciwgY2xpZW50TGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFVwcGVyQm91bmQoCiAgICAgIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIHVwcGVyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIGNvbnN0cmFpbnQudXBwZXIgPQogICAgICAgIGdldFN0YW5kYXJkTG93ZXJCb3VuZChjb25zdHJhaW50LnVwcGVyLCB1cHBlciwgY2xpZW50TGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0SW50ZXJmYWNlTWVtYmVyKENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCB7Ym9vbCBzZXR0ZXI6IGZhbHNlfSkgewogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGdldFR5cGVBc0luc3RhbmNlT2YoSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzLAogICAgICBMaWJyYXJ5IGNsaWVudExpYnJhcnksIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKICAgIHJldHVybiBoaWVyYXJjaHkuZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZih0eXBlLCBzdXBlcmNsYXNzLCBjbGllbnRMaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgcmV0dXJuIGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKHR5cGUsIHN1cGVyY2xhc3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICByZXR1cm4gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgaGllcmFyY2h5LmZ1dHVyZUNsYXNzLCBudWxsYWJpbGl0eSwgPERhcnRUeXBlPlt0eXBlXSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKAogICAgICBEYXJ0VHlwZSBzdWJ0eXBlLCBEYXJ0VHlwZSBzdXBlcnR5cGUsIFN1YnR5cGVDaGVja01vZGUgbW9kZSkgewogICAgcmV0dXJuIGhpZXJhcmNoeS50eXBlcy5pc1N1YnR5cGVPZktlcm5lbChzdWJ0eXBlLCBzdXBlcnR5cGUsIG1vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBhcmVNdXR1YWxTdWJ0eXBlcyhEYXJ0VHlwZSBzLCBEYXJ0VHlwZSB0LCBTdWJ0eXBlQ2hlY2tNb2RlIG1vZGUpIHsKICAgIHJldHVybiBpc1N1YnR5cGVPZihzLCB0LCBtb2RlKSAmJiBpc1N1YnR5cGVPZih0LCBzLCBtb2RlKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIHJldHVybiBoaWVyYXJjaHkuZ2V0S2VybmVsTGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICAgIHR5cGUxLCB0eXBlMiwgY2xpZW50TGlicmFyeSk7CiAgfQp9CgpjbGFzcyBEZWxheWVkT3ZlcnJpZGVDaGVjayB7CiAgZmluYWwgQ2xhc3NCdWlsZGVyIGNsYXNzQnVpbGRlcjsKICBmaW5hbCBDbGFzc01lbWJlciBhOwogIGZpbmFsIENsYXNzTWVtYmVyIGI7CgogIGNvbnN0IERlbGF5ZWRPdmVycmlkZUNoZWNrKHRoaXMuY2xhc3NCdWlsZGVyLCB0aGlzLmEsIHRoaXMuYik7CgogIHZvaWQgY2hlY2soQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogICAgdm9pZCBjYWxsYmFjaygKICAgICAgICBNZW1iZXIgZGVjbGFyZWRNZW1iZXIsIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIsIGJvb2wgaXNTZXR0ZXIpIHsKICAgICAgY2xhc3NCdWlsZGVyLmNoZWNrT3ZlcnJpZGUoCiAgICAgICAgICBoaWVyYXJjaHkudHlwZXMsIGRlY2xhcmVkTWVtYmVyLCBpbnRlcmZhY2VNZW1iZXIsIGlzU2V0dGVyLCBjYWxsYmFjaywKICAgICAgICAgIGlzSW50ZXJmYWNlQ2hlY2s6ICFjbGFzc0J1aWxkZXIuaXNNaXhpbkFwcGxpY2F0aW9uKTsKICAgIH0KCiAgICBDbGFzc01lbWJlciBhID0gdGhpcy5hOwogICAgZGVidWc/LmxvZygiRGVsYXllZCBvdmVycmlkZSBjaGVjayBvZiAke2Z1bGxOYW1lKGEpfSAiCiAgICAgICAgIiR7ZnVsbE5hbWUoYil9IHdydC4gJHtjbGFzc0J1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnN9Iik7CiAgICBpZiAoY2xhc3NCdWlsZGVyID09IGEuY2xhc3NCdWlsZGVyKSB7CiAgICAgIGlmIChhIGlzIFByb2NlZHVyZUJ1aWxkZXIpIHsKICAgICAgICBpZiAoYS5pc0dldHRlciAmJiAhaGFzRXhwbGljaXRSZXR1cm5UeXBlKGEpKSB7CiAgICAgICAgICBEYXJ0VHlwZSB0eXBlOwogICAgICAgICAgaWYgKGIuaXNHZXR0ZXIpIHsKICAgICAgICAgICAgUHJvY2VkdXJlIGJUYXJnZXQgPSBiLm1lbWJlcjsKICAgICAgICAgICAgdHlwZSA9IGJUYXJnZXQuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgICAgICAgIH0gZWxzZSBpZiAoYi5pc1NldHRlcikgewogICAgICAgICAgICBQcm9jZWR1cmUgYlRhcmdldCA9IGIubWVtYmVyOwogICAgICAgICAgICB0eXBlID0gYlRhcmdldC5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycy5zaW5nbGUudHlwZTsKICAgICAgICAgIH0gZWxzZSBpZiAoYi5pc0ZpZWxkKSB7CiAgICAgICAgICAgIEZpZWxkIGJUYXJnZXQgPSBiLm1lbWJlcjsKICAgICAgICAgICAgdHlwZSA9IGJUYXJnZXQudHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgICAgICAgdHlwZSA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHkuZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZigKICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcy50aGlzSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlci5jbHMsIGNsYXNzQnVpbGRlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgYi5tZW1iZXIuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlci5saWJyYXJ5LmxpYnJhcnkpKQogICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwogICAgICAgICAgICBpZiAoIWEuaGFkVHlwZXNJbmZlcnJlZCB8fCAhYi5pc1NldHRlcikgewogICAgICAgICAgICAgIGluZmVyUmV0dXJuVHlwZSgKICAgICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLCBhLCB0eXBlLCBhLmhhZFR5cGVzSW5mZXJyZWQsIGhpZXJhcmNoeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGEuaXNTZXR0ZXIgJiYgIWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcihhLCAwKSkgewogICAgICAgICAgRGFydFR5cGUgdHlwZTsKICAgICAgICAgIGlmIChiLmlzR2V0dGVyKSB7CiAgICAgICAgICAgIFByb2NlZHVyZSBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICAgICAgICAgIHR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICAgICAgICB9IGVsc2UgaWYgKGIuaXNTZXR0ZXIpIHsKICAgICAgICAgICAgUHJvY2VkdXJlIGJUYXJnZXQgPSBiLm1lbWJlcjsKICAgICAgICAgICAgdHlwZSA9IGJUYXJnZXQuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnMuc2luZ2xlLnR5cGU7CiAgICAgICAgICB9IGVsc2UgaWYgKGIuaXNGaWVsZCkgewogICAgICAgICAgICBGaWVsZCBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICAgICAgICAgIHR5cGUgPSBiVGFyZ2V0LnR5cGU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHR5cGUgPSBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5LmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5jb3JlVHlwZXMudGhpc0ludGVyZmFjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIuY2xzLCBjbGFzc0J1aWxkZXIubGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGIubWVtYmVyLmVuY2xvc2luZ0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIubGlicmFyeS5saWJyYXJ5KSkKICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0eXBlKTsKICAgICAgICAgICAgaWYgKCFhLmhhZFR5cGVzSW5mZXJyZWQgfHwgIWIuaXNHZXR0ZXIpIHsKICAgICAgICAgICAgICBpbmZlclBhcmFtZXRlclR5cGUoY2xhc3NCdWlsZGVyLCBhLCBhLmZvcm1hbHMuc2luZ2xlLCB0eXBlLAogICAgICAgICAgICAgICAgICBhLmhhZFR5cGVzSW5mZXJyZWQsIGhpZXJhcmNoeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYS5oYWRUeXBlc0luZmVycmVkID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChhIGlzIEZpZWxkQnVpbGRlciAmJiBhLnR5cGUgPT0gbnVsbCkgewogICAgICAgIERhcnRUeXBlIHR5cGU7CiAgICAgICAgaWYgKGIuaXNHZXR0ZXIpIHsKICAgICAgICAgIFByb2NlZHVyZSBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICAgICAgICB0eXBlID0gYlRhcmdldC5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgICAgIH0gZWxzZSBpZiAoYi5pc1NldHRlcikgewogICAgICAgICAgUHJvY2VkdXJlIGJUYXJnZXQgPSBiLm1lbWJlcjsKICAgICAgICAgIHR5cGUgPSBiVGFyZ2V0LmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnNpbmdsZS50eXBlOwogICAgICAgIH0gZWxzZSBpZiAoYi5pc0ZpZWxkKSB7CiAgICAgICAgICBGaWVsZCBiVGFyZ2V0ID0gYi5tZW1iZXI7CiAgICAgICAgICB0eXBlID0gYlRhcmdldC50eXBlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgICAgICB0eXBlID0gU3Vic3RpdHV0aW9uLmZyb21JbnRlcmZhY2VUeXBlKAogICAgICAgICAgICAgICAgICBoaWVyYXJjaHkuZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZigKICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5jb3JlVHlwZXMudGhpc0ludGVyZmFjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmNscywgY2xhc3NCdWlsZGVyLmxpYnJhcnkubm9uTnVsbGFibGUpLAogICAgICAgICAgICAgICAgICAgICAgYi5tZW1iZXIuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIubGlicmFyeS5saWJyYXJ5KSkKICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVR5cGUodHlwZSk7CiAgICAgICAgICBpZiAoIWEuY2xhc3NCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgICAgICB0eXBlID0gbGVnYWN5RXJhc3VyZShoaWVyYXJjaHkuY29yZVR5cGVzLCB0eXBlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlICE9IGEuZmllbGRUeXBlKSB7CiAgICAgICAgICAgIGlmIChhLmhhZFR5cGVzSW5mZXJyZWQpIHsKICAgICAgICAgICAgICBpZiAoYi5pc1NldHRlciAmJgogICAgICAgICAgICAgICAgICAoIWltcGxpZXNTZXR0ZXIoYSkgfHwKICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeS50eXBlcy5pc1N1YnR5cGVPZktlcm5lbCh0eXBlLCBhLmZpZWxkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gYS5maWVsZFR5cGU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlcG9ydENhbnRJbmZlckZpZWxkVHlwZShjbGFzc0J1aWxkZXIsIGEpOwogICAgICAgICAgICAgICAgdHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlYnVnPy5sb2coIkluZmVycmVkIHR5cGUgJHt0eXBlfSBmb3IgJHtmdWxsTmFtZShhKX0iKTsKICAgICAgICAgICAgYS5maWVsZFR5cGUgPSB0eXBlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhLmhhZFR5cGVzSW5mZXJyZWQgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgY2FsbGJhY2soYS5tZW1iZXIsIGIubWVtYmVyLCBhLmlzU2V0dGVyKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIERlbGF5ZWRNZW1iZXIgaW1wbGVtZW50cyBDbGFzc01lbWJlciB7CiAgLy8vIFRoZSBjbGFzcyB3aGljaCBoYXMgaW5oZXJpdGVkIFtkZWNsYXJhdGlvbnNdLgogIEBvdmVycmlkZQogIGZpbmFsIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXI7CgogIC8vLyBDb25mbGljdGluZyBkZWNsYXJhdGlvbnMuCiAgZmluYWwgTGlzdDxDbGFzc01lbWJlcj4gZGVjbGFyYXRpb25zOwoKICBmaW5hbCBib29sIGlzU2V0dGVyOwoKICBmaW5hbCBib29sIG1vZGlmeUtlcm5lbDsKCiAgRGVsYXllZE1lbWJlcigKICAgICAgdGhpcy5jbGFzc0J1aWxkZXIsIHRoaXMuZGVjbGFyYXRpb25zLCB0aGlzLmlzU2V0dGVyLCB0aGlzLm1vZGlmeUtlcm5lbCk7CgogIGJvb2wgZ2V0IGlzU3RhdGljID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzRmllbGQgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNHZXR0ZXIgPT4gZmFsc2U7CiAgYm9vbCBnZXQgaXNGaW5hbCA9PiBmYWxzZTsKICBib29sIGdldCBpc0NvbnN0ID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzQXNzaWduYWJsZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0R1cGxpY2F0ZSA9PiBmYWxzZTsKCiAgdm9pZCBhZGRBbGxEZWNsYXJhdGlvbnNUbyhMaXN0PENsYXNzTWVtYmVyPiBkZWNsYXJhdGlvbnMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5kZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgYWRkRGVjbGFyYXRpb25JZkRpZmZlcmVudCh0aGlzLmRlY2xhcmF0aW9uc1tpXSwgZGVjbGFyYXRpb25zKTsKICAgIH0KICAgIGFzc2VydChkZWNsYXJhdGlvbnMudG9TZXQoKS5sZW5ndGggPT0gZGVjbGFyYXRpb25zLmxlbmd0aCk7CiAgfQoKICBNZW1iZXIgY2hlY2soQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSk7CgogIERlbGF5ZWRNZW1iZXIgd2l0aFBhcmVudChDbGFzc0J1aWxkZXIgcGFyZW50KTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldCBmaWxlVXJpID0+IGNsYXNzQnVpbGRlci5maWxlVXJpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gY2xhc3NCdWlsZGVyLmNoYXJPZmZzZXQ7CgogIEBvdmVycmlkZQogIFN0cmluZyBnZXQgZnVsbE5hbWVGb3JFcnJvcnMgPT4gZGVjbGFyYXRpb25zLm1hcChmdWxsTmFtZSkuam9pbigiJSIpOwoKICBib29sIGdldCBpc0luaGVyaXRhYmxlQ29uZmxpY3QgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCBtZW1iZXIgPT4gZGVjbGFyYXRpb25zLmZpcnN0Lm1lbWJlcjsKfQoKLy8vIFRoaXMgcmVwcmVzZW50cyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGluaGVyaXRlZCBmcm9tIGEgc3VwZXJjbGFzcyB0aGF0Ci8vLyBoYXMgY29uZmxpY3RzIHdpdGggbWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBhbiBpbnRlcmZhY2UuIFRoZSBjb25jcmV0ZQovLy8gaW1wbGVtZW50YXRpb24gaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgW2RlY2xhcmF0aW9uc10uCmNsYXNzIEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3QgZXh0ZW5kcyBEZWxheWVkTWVtYmVyIHsKICBNZW1iZXIgY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQ7CgogIEBvdmVycmlkZQogIGZpbmFsIGJvb2wgaXNJbmhlcml0YWJsZUNvbmZsaWN0OwoKICBJbmhlcml0ZWRJbXBsZW1lbnRhdGlvbkludGVyZmFjZUNvbmZsaWN0KENsYXNzQnVpbGRlciBwYXJlbnQsCiAgICAgIExpc3Q8Q2xhc3NNZW1iZXI+IGRlY2xhcmF0aW9ucywgYm9vbCBpc1NldHRlciwgYm9vbCBtb2RpZnlLZXJuZWwsCiAgICAgIHt0aGlzLmlzSW5oZXJpdGFibGVDb25mbGljdCA9IHRydWV9KQogICAgICA6IHN1cGVyKHBhcmVudCwgZGVjbGFyYXRpb25zLCBpc1NldHRlciwgbW9kaWZ5S2VybmVsKTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJJbmhlcml0ZWRJbXBsZW1lbnRhdGlvbkludGVyZmFjZUNvbmZsaWN0KCIKICAgICAgICAiJHtjbGFzc0J1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnN9LCAiCiAgICAgICAgIlske2RlY2xhcmF0aW9ucy5tYXAoZnVsbE5hbWUpLmpvaW4oJywgJyl9XSkiOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGNoZWNrKENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICAgIGlmIChjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdDsKICAgIH0KICAgIGlmICghY2xhc3NCdWlsZGVyLmlzQWJzdHJhY3QpIHsKICAgICAgQ2xhc3NNZW1iZXIgY29uY3JldGVJbXBsZW1lbnRhdGlvbiA9IGRlY2xhcmF0aW9ucy5maXJzdDsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soCiAgICAgICAgICAgICAgICBjbGFzc0J1aWxkZXIsIGNvbmNyZXRlSW1wbGVtZW50YXRpb24sIGRlY2xhcmF0aW9uc1tpXSkKICAgICAgICAgICAgLmNoZWNrKGhpZXJhcmNoeSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCA9IG5ldyBJbnRlcmZhY2VDb25mbGljdCgKICAgICAgICAgICAgY2xhc3NCdWlsZGVyLCBkZWNsYXJhdGlvbnMsIGlzU2V0dGVyLCBtb2RpZnlLZXJuZWwpCiAgICAgICAgLmNoZWNrKGhpZXJhcmNoeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWxheWVkTWVtYmVyIHdpdGhQYXJlbnQoQ2xhc3NCdWlsZGVyIHBhcmVudCkgewogICAgcmV0dXJuIHBhcmVudCA9PSB0aGlzLmNsYXNzQnVpbGRlcgogICAgICAgID8gdGhpcwogICAgICAgIDogbmV3IEluaGVyaXRlZEltcGxlbWVudGF0aW9uSW50ZXJmYWNlQ29uZmxpY3QoCiAgICAgICAgICAgIHBhcmVudCwgZGVjbGFyYXRpb25zLnRvTGlzdCgpLCBpc1NldHRlciwgbW9kaWZ5S2VybmVsKTsKICB9CgogIHN0YXRpYyBDbGFzc01lbWJlciBjb21iaW5lZCgKICAgICAgQ2xhc3NCdWlsZGVyIHBhcmVudCwKICAgICAgQ2xhc3NNZW1iZXIgY29uY3JldGVJbXBsZW1lbnRhdGlvbiwKICAgICAgQ2xhc3NNZW1iZXIgb3RoZXIsCiAgICAgIGJvb2wgaXNTZXR0ZXIsCiAgICAgIGJvb2wgY3JlYXRlRm9yd2FyZGVycywKICAgICAge2Jvb2wgaXNJbmhlcml0YWJsZUNvbmZsaWN0ID0gdHJ1ZX0pIHsKICAgIExpc3Q8Q2xhc3NNZW1iZXI+IGRlY2xhcmF0aW9ucyA9IDxDbGFzc01lbWJlcj5bXTsKICAgIGlmIChjb25jcmV0ZUltcGxlbWVudGF0aW9uIGlzIERlbGF5ZWRNZW1iZXIpIHsKICAgICAgY29uY3JldGVJbXBsZW1lbnRhdGlvbi5hZGRBbGxEZWNsYXJhdGlvbnNUbyhkZWNsYXJhdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgZGVjbGFyYXRpb25zLmFkZChjb25jcmV0ZUltcGxlbWVudGF0aW9uKTsKICAgIH0KICAgIGlmIChvdGhlciBpcyBEZWxheWVkTWVtYmVyKSB7CiAgICAgIG90aGVyLmFkZEFsbERlY2xhcmF0aW9uc1RvKGRlY2xhcmF0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICBhZGREZWNsYXJhdGlvbklmRGlmZmVyZW50KG90aGVyLCBkZWNsYXJhdGlvbnMpOwogICAgfQogICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT0gMSkgewogICAgICByZXR1cm4gZGVjbGFyYXRpb25zLnNpbmdsZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgSW5oZXJpdGVkSW1wbGVtZW50YXRpb25JbnRlcmZhY2VDb25mbGljdCgKICAgICAgICAgIHBhcmVudCwgZGVjbGFyYXRpb25zLCBpc1NldHRlciwgY3JlYXRlRm9yd2FyZGVycywKICAgICAgICAgIGlzSW5oZXJpdGFibGVDb25mbGljdDogaXNJbmhlcml0YWJsZUNvbmZsaWN0KTsKICAgIH0KICB9Cn0KCmNsYXNzIEludGVyZmFjZUNvbmZsaWN0IGV4dGVuZHMgRGVsYXllZE1lbWJlciB7CiAgYm9vbCBpc0Fic3RyYWN0OwoKICBJbnRlcmZhY2VDb25mbGljdChDbGFzc0J1aWxkZXIgcGFyZW50LCBMaXN0PENsYXNzTWVtYmVyPiBkZWNsYXJhdGlvbnMsCiAgICAgIGJvb2wgaXNTZXR0ZXIsIGJvb2wgbW9kaWZ5S2VybmVsLAogICAgICB7dGhpcy5pc0Fic3RyYWN0OiB0cnVlfSkKICAgICAgOiBzdXBlcihwYXJlbnQsIGRlY2xhcmF0aW9ucywgaXNTZXR0ZXIsIG1vZGlmeUtlcm5lbCk7CgogIE1lbWJlciBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdDsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJJbnRlcmZhY2VDb25mbGljdCgke2NsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yc30sICIKICAgICAgICAiWyR7ZGVjbGFyYXRpb25zLm1hcChmdWxsTmFtZSkuam9pbignLCAnKX1dKSI7CiAgfQoKICBEYXJ0VHlwZSBjb21wdXRlTWVtYmVyVHlwZSgKICAgICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSwgRGFydFR5cGUgdGhpc1R5cGUsIE1lbWJlciBtZW1iZXIpIHsKICAgIERhcnRUeXBlIHR5cGU7CiAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICBpZiAobWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgICAgdHlwZSA9IG1lbWJlci5nZXR0ZXJUeXBlOwogICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc1NldHRlcikgewogICAgICAgIHR5cGUgPSBtZW1iZXIuc2V0dGVyVHlwZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0eXBlID0gbWVtYmVyLmZ1bmN0aW9uCiAgICAgICAgICAgIC5jb21wdXRlRnVuY3Rpb25UeXBlKG1lbWJlci5lbmNsb3NpbmdMaWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgdHlwZSA9IG1lbWJlci50eXBlOwogICAgfSBlbHNlIHsKICAgICAgdW5oYW5kbGVkKCIke21lbWJlci5ydW50aW1lVHlwZX0iLCAiJG1lbWJlciIsIGNsYXNzQnVpbGRlci5jaGFyT2Zmc2V0LAogICAgICAgICAgY2xhc3NCdWlsZGVyLmZpbGVVcmkpOwogICAgfQogICAgSW50ZXJmYWNlVHlwZSBpbnN0YW5jZSA9IGhpZXJhcmNoeS5nZXRLZXJuZWxUeXBlQXNJbnN0YW5jZU9mKAogICAgICAgIHRoaXNUeXBlLCBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MsIGNsYXNzQnVpbGRlci5saWJyYXJ5LmxpYnJhcnkpOwogICAgYXNzZXJ0KAogICAgICAgIGluc3RhbmNlICE9IG51bGwsCiAgICAgICAgIk5vIGluc3RhbmNlIG9mICR0aGlzVHlwZSBhcyAke21lbWJlci5lbmNsb3NpbmdDbGFzc30gZm91bmQgZm9yICIKICAgICAgICAiJG1lbWJlci4iKTsKICAgIHJldHVybiBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoaW5zdGFuY2UpLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwogIH0KCiAgYm9vbCBpc01vcmVTcGVjaWZpYyhDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5LCBEYXJ0VHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICBpZiAoaXNTZXR0ZXIpIHsKICAgICAgcmV0dXJuIGhpZXJhcmNoeS50eXBlcwogICAgICAgICAgLmlzU3VidHlwZU9mS2VybmVsKGIsIGEsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBoaWVyYXJjaHkudHlwZXMKICAgICAgICAgIC5pc1N1YnR5cGVPZktlcm5lbChhLCBiLCBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgY2hlY2soQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogICAgaWYgKGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0OwogICAgfQogICAgaWYgKGNsYXNzQnVpbGRlci5saWJyYXJ5IGlzISBTb3VyY2VMaWJyYXJ5QnVpbGRlcikgewogICAgICByZXR1cm4gY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQgPSBkZWNsYXJhdGlvbnMuZmlyc3QubWVtYmVyOwogICAgfQogICAgRGFydFR5cGUgdGhpc1R5cGUgPSBoaWVyYXJjaHkuY29yZVR5cGVzCiAgICAgICAgLnRoaXNJbnRlcmZhY2VUeXBlKGNsYXNzQnVpbGRlci5jbHMsIGNsYXNzQnVpbGRlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIENsYXNzTWVtYmVyIGJlc3RTb0ZhcjsKICAgIERhcnRUeXBlIGJlc3RUeXBlU29GYXI7CiAgICBmb3IgKGludCBpID0gZGVjbGFyYXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIENsYXNzTWVtYmVyIGNhbmRpZGF0ZSA9IGRlY2xhcmF0aW9uc1tpXTsKICAgICAgTWVtYmVyIHRhcmdldCA9IGNhbmRpZGF0ZS5tZW1iZXI7CiAgICAgIERhcnRUeXBlIGNhbmRpZGF0ZVR5cGUgPSBjb21wdXRlTWVtYmVyVHlwZShoaWVyYXJjaHksIHRoaXNUeXBlLCB0YXJnZXQpOwogICAgICBpZiAoYmVzdFNvRmFyID09IG51bGwpIHsKICAgICAgICBiZXN0U29GYXIgPSBjYW5kaWRhdGU7CiAgICAgICAgYmVzdFR5cGVTb0ZhciA9IGNhbmRpZGF0ZVR5cGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzTW9yZVNwZWNpZmljKGhpZXJhcmNoeSwgY2FuZGlkYXRlVHlwZSwgYmVzdFR5cGVTb0ZhcikpIHsKICAgICAgICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmU6ICR7ZnVsbE5hbWUoY2FuZGlkYXRlKX0gIgogICAgICAgICAgICAgICIke2NhbmRpZGF0ZVR5cGV9IDw6ICR7ZnVsbE5hbWUoYmVzdFNvRmFyKX0gJHtiZXN0VHlwZVNvRmFyfSIpOwogICAgICAgICAgYmVzdFNvRmFyID0gY2FuZGlkYXRlOwogICAgICAgICAgYmVzdFR5cGVTb0ZhciA9IGNhbmRpZGF0ZVR5cGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmU6ICIKICAgICAgICAgICAgICAiJHtmdWxsTmFtZShjYW5kaWRhdGUpfSAhPDogJHtmdWxsTmFtZShiZXN0U29GYXIpfSIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGJlc3RTb0ZhciAhPSBudWxsKSB7CiAgICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgYmVzdFNvRmFyOiAke2Z1bGxOYW1lKGJlc3RTb0Zhcil9Iik7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgQ2xhc3NNZW1iZXIgY2FuZGlkYXRlID0gZGVjbGFyYXRpb25zW2ldOwogICAgICAgIE1lbWJlciB0YXJnZXQgPSBjYW5kaWRhdGUubWVtYmVyOwogICAgICAgIERhcnRUeXBlIGNhbmRpZGF0ZVR5cGUgPSBjb21wdXRlTWVtYmVyVHlwZShoaWVyYXJjaHksIHRoaXNUeXBlLCB0YXJnZXQpOwogICAgICAgIGlmICghaXNNb3JlU3BlY2lmaWMoaGllcmFyY2h5LCBiZXN0VHlwZVNvRmFyLCBjYW5kaWRhdGVUeXBlKSkgewogICAgICAgICAgZGVidWc/LmxvZygiQ29tYmluZWQgTWVtYmVyIFNpZ25hdHVyZTogIgogICAgICAgICAgICAgICIke2Z1bGxOYW1lKGJlc3RTb0Zhcil9ICE8OiAke2Z1bGxOYW1lKGNhbmRpZGF0ZSl9Iik7CgogICAgICAgICAgU3RyaW5nIHVyaSA9ICcke2NsYXNzQnVpbGRlci5saWJyYXJ5LmltcG9ydFVyaX0nOwogICAgICAgICAgaWYgKHVyaSA9PSAnZGFydDpqcycgJiYKICAgICAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmZpbGVVcmkucGF0aFNlZ21lbnRzLmxhc3QgPT0gJ2pzLmRhcnQnIHx8CiAgICAgICAgICAgICAgdXJpID09ICdkYXJ0Ol9pbnRlcmNlcHRvcnMnICYmCiAgICAgICAgICAgICAgICAgIGNsYXNzQnVpbGRlci5maWxlVXJpLnBhdGhTZWdtZW50cy5sYXN0ID09ICdqc19udW1iZXIuZGFydCcpIHsKICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogRml4IHRoZSBkYXJ0MmpzIGxpYnJhcmllcyBhbmQgcmVtb3ZlIHRoZQogICAgICAgICAgICAvLyBhYm92ZSBVUklzLgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmVzdFNvRmFyID0gbnVsbDsKICAgICAgICAgICAgYmVzdFR5cGVTb0ZhciA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChiZXN0U29GYXIgPT0gbnVsbCkgewogICAgICBTdHJpbmcgbmFtZSA9IGNsYXNzQnVpbGRlci5mdWxsTmFtZUZvckVycm9yczsKICAgICAgaW50IGxlbmd0aCA9IGNsYXNzQnVpbGRlci5pc0Fub255bW91c01peGluQXBwbGljYXRpb24gPyAxIDogbmFtZS5sZW5ndGg7CiAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSBkZWNsYXJhdGlvbnMubWFwKChDbGFzc01lbWJlciBkKSB7CiAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJDYXVzZQogICAgICAgICAgICAud2l0aExvY2F0aW9uKGQuZmlsZVVyaSwgZC5jaGFyT2Zmc2V0LCBkLmZ1bGxOYW1lRm9yRXJyb3JzLmxlbmd0aCk7CiAgICAgIH0pLnRvTGlzdCgpOwoKICAgICAgY2xhc3NCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzLAogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucy5maXJzdC5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICBjbGFzc0J1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgb2YgJHtmdWxsTmFtZUZvckVycm9yc306ICIKICAgICAgICAiJHtmdWxsTmFtZShiZXN0U29GYXIpfSIpOwoKICAgIFByb2NlZHVyZUtpbmQga2luZCA9IFByb2NlZHVyZUtpbmQuTWV0aG9kOwogICAgTWVtYmVyIGJlc3RNZW1iZXJTb0ZhciA9IGJlc3RTb0Zhci5tZW1iZXI7CiAgICBpZiAoYmVzdFNvRmFyLmlzRmllbGQgfHwgYmVzdFNvRmFyLmlzU2V0dGVyIHx8IGJlc3RTb0Zhci5pc0dldHRlcikgewogICAgICBraW5kID0gaXNTZXR0ZXIgPyBQcm9jZWR1cmVLaW5kLlNldHRlciA6IFByb2NlZHVyZUtpbmQuR2V0dGVyOwogICAgfSBlbHNlIGlmIChiZXN0TWVtYmVyU29GYXIgaXMgUHJvY2VkdXJlICYmCiAgICAgICAgYmVzdE1lbWJlclNvRmFyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5PcGVyYXRvcikgewogICAgICBraW5kID0gUHJvY2VkdXJlS2luZC5PcGVyYXRvcjsKICAgIH0KCiAgICBpZiAobW9kaWZ5S2VybmVsKSB7CiAgICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgb2YgJHtmdWxsTmFtZUZvckVycm9yc306IG5ldyAiCiAgICAgICAgICAiRm9yd2FyZGluZ05vZGUoJGNsYXNzQnVpbGRlciwgJGJlc3RTb0ZhciwgJGRlY2xhcmF0aW9ucywgJGtpbmQpIik7CiAgICAgIE1lbWJlciBzdHViID0gbmV3IEZvcndhcmRpbmdOb2RlKAogICAgICAgICAgICAgIGhpZXJhcmNoeSwgY2xhc3NCdWlsZGVyLCBiZXN0U29GYXIsIGRlY2xhcmF0aW9ucywga2luZCkKICAgICAgICAgIC5maW5hbGl6ZSgpOwogICAgICBpZiAoY2xhc3NCdWlsZGVyLmNscyA9PSBzdHViLmVuY2xvc2luZ0NsYXNzKSB7CiAgICAgICAgY2xhc3NCdWlsZGVyLmNscy5hZGRNZW1iZXIoc3R1Yik7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGNsYXNzQnVpbGRlci5saWJyYXJ5OwogICAgICAgIGlmIChiZXN0U29GYXIubWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICAgICAgbGlicmFyeS5mb3J3YXJkZXJzT3JpZ2lucy4uYWRkKHN0dWIpLi5hZGQoYmVzdFNvRmFyLm1lbWJlcik7CiAgICAgICAgfQogICAgICAgIGRlYnVnPy5sb2coIkNvbWJpbmVkIE1lbWJlciBTaWduYXR1cmUgb2YgJHtmdWxsTmFtZUZvckVycm9yc306ICIKICAgICAgICAgICAgImFkZGVkIHN0dWIgJHN0dWIiKTsKICAgICAgICBpZiAoY2xhc3NCdWlsZGVyLmlzTWl4aW5BcHBsaWNhdGlvbikgewogICAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0ID0gYmVzdFNvRmFyLm1lbWJlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0ID0gc3R1YjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBkZWJ1Zz8ubG9nKAogICAgICAgICJDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlIG9mICR7ZnVsbE5hbWVGb3JFcnJvcnN9OiBwaWNrZWQgYmVzdFNvRmFyIik7CiAgICByZXR1cm4gY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQgPSBiZXN0U29GYXIubWVtYmVyOwogIH0KCiAgQG92ZXJyaWRlCiAgRGVsYXllZE1lbWJlciB3aXRoUGFyZW50KENsYXNzQnVpbGRlciBwYXJlbnQpIHsKICAgIHJldHVybiBwYXJlbnQgPT0gdGhpcy5jbGFzc0J1aWxkZXIKICAgICAgICA/IHRoaXMKICAgICAgICA6IG5ldyBJbnRlcmZhY2VDb25mbGljdCgKICAgICAgICAgICAgcGFyZW50LCBkZWNsYXJhdGlvbnMudG9MaXN0KCksIGlzU2V0dGVyLCBtb2RpZnlLZXJuZWwpOwogIH0KCiAgc3RhdGljIENsYXNzTWVtYmVyIGNvbWJpbmVkKENsYXNzQnVpbGRlciBwYXJlbnQsIENsYXNzTWVtYmVyIGEsIENsYXNzTWVtYmVyIGIsCiAgICAgIGJvb2wgaXNTZXR0ZXIsIGJvb2wgY3JlYXRlRm9yd2FyZGVycykgewogICAgTGlzdDxDbGFzc01lbWJlcj4gZGVjbGFyYXRpb25zID0gPENsYXNzTWVtYmVyPltdOwogICAgaWYgKGEgaXMgRGVsYXllZE1lbWJlcikgewogICAgICBhLmFkZEFsbERlY2xhcmF0aW9uc1RvKGRlY2xhcmF0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICBkZWNsYXJhdGlvbnMuYWRkKGEpOwogICAgfQogICAgaWYgKGIgaXMgRGVsYXllZE1lbWJlcikgewogICAgICBiLmFkZEFsbERlY2xhcmF0aW9uc1RvKGRlY2xhcmF0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICBhZGREZWNsYXJhdGlvbklmRGlmZmVyZW50KGIsIGRlY2xhcmF0aW9ucyk7CiAgICB9CiAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbnMuc2luZ2xlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VDb25mbGljdCgKICAgICAgICAgIHBhcmVudCwgZGVjbGFyYXRpb25zLCBpc1NldHRlciwgY3JlYXRlRm9yd2FyZGVycyk7CiAgICB9CiAgfQp9CgpjbGFzcyBBYnN0cmFjdE1lbWJlck92ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbiBleHRlbmRzIERlbGF5ZWRNZW1iZXIgewogIEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uKAogICAgICBDbGFzc0J1aWxkZXIgcGFyZW50LAogICAgICBDbGFzc01lbWJlciBhYnN0cmFjdE1lbWJlciwKICAgICAgQ2xhc3NNZW1iZXIgY29uY3JldGVJbXBsZW1lbnRhdGlvbiwKICAgICAgYm9vbCBpc1NldHRlciwKICAgICAgYm9vbCBtb2RpZnlLZXJuZWwpCiAgICAgIDogc3VwZXIocGFyZW50LCA8Q2xhc3NNZW1iZXI+W2NvbmNyZXRlSW1wbGVtZW50YXRpb24sIGFic3RyYWN0TWVtYmVyXSwKICAgICAgICAgICAgaXNTZXR0ZXIsIG1vZGlmeUtlcm5lbCk7CgogIENsYXNzTWVtYmVyIGdldCBjb25jcmV0ZUltcGxlbWVudGF0aW9uID0+IGRlY2xhcmF0aW9uc1swXTsKCiAgQ2xhc3NNZW1iZXIgZ2V0IGFic3RyYWN0TWVtYmVyID0+IGRlY2xhcmF0aW9uc1sxXTsKCiAgTWVtYmVyIGNoZWNrKENsYXNzSGllcmFyY2h5QnVpbGRlciBoaWVyYXJjaHkpIHsKICAgIGlmICghY2xhc3NCdWlsZGVyLmlzQWJzdHJhY3QgJiYKICAgICAgICAhaGllcmFyY2h5Lm5vZGVzW2NsYXNzQnVpbGRlci5jbHNdLmhhc05vU3VjaE1ldGhvZCkgewogICAgICBuZXcgRGVsYXllZE92ZXJyaWRlQ2hlY2soCiAgICAgICAgICAgICAgY2xhc3NCdWlsZGVyLCBjb25jcmV0ZUltcGxlbWVudGF0aW9uLCBhYnN0cmFjdE1lbWJlcikKICAgICAgICAgIC5jaGVjayhoaWVyYXJjaHkpOwogICAgfQoKICAgIFByb2NlZHVyZUtpbmQga2luZCA9IFByb2NlZHVyZUtpbmQuTWV0aG9kOwogICAgaWYgKGFic3RyYWN0TWVtYmVyLmlzU2V0dGVyIHx8IGFic3RyYWN0TWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgIGtpbmQgPSBpc1NldHRlciA/IFByb2NlZHVyZUtpbmQuU2V0dGVyIDogUHJvY2VkdXJlS2luZC5HZXR0ZXI7CiAgICB9CiAgICBpZiAobW9kaWZ5S2VybmVsKSB7CiAgICAgIC8vIFRoaXMgY2FsbCB3aWxsIGFkZCBhIGJvZHkgdG8gdGhlIGFic3RyYWN0IG1ldGhvZCBpZiBuZWVkZWQgZm9yCiAgICAgIC8vIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgY2hlY2tzLgogICAgICBuZXcgRm9yd2FyZGluZ05vZGUoCiAgICAgICAgICAgICAgaGllcmFyY2h5LCBjbGFzc0J1aWxkZXIsIGFic3RyYWN0TWVtYmVyLCBkZWNsYXJhdGlvbnMsIGtpbmQpCiAgICAgICAgICAuZmluYWxpemUoKTsKICAgIH0KICAgIHJldHVybiBhYnN0cmFjdE1lbWJlci5tZW1iZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBEZWxheWVkTWVtYmVyIHdpdGhQYXJlbnQoQ2xhc3NCdWlsZGVyIHBhcmVudCkgewogICAgcmV0dXJuIHBhcmVudCA9PSB0aGlzLmNsYXNzQnVpbGRlcgogICAgICAgID8gdGhpcwogICAgICAgIDogbmV3IEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uKHBhcmVudCwgYWJzdHJhY3RNZW1iZXIsCiAgICAgICAgICAgIGNvbmNyZXRlSW1wbGVtZW50YXRpb24sIGlzU2V0dGVyLCBtb2RpZnlLZXJuZWwpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJBYnN0cmFjdE1lbWJlck92ZXJyaWRpbmdJbXBsZW1lbnRhdGlvbigiCiAgICAgICAgIiR7Y2xhc3NCdWlsZGVyLmZ1bGxOYW1lRm9yRXJyb3JzfSwgIgogICAgICAgICJbJHtkZWNsYXJhdGlvbnMubWFwKGZ1bGxOYW1lKS5qb2luKCcsICcpfV0pIjsKICB9CgogIHN0YXRpYyBDbGFzc01lbWJlciBzZWxlY3RBYnN0cmFjdChDbGFzc01lbWJlciBkZWNsYXJhdGlvbikgewogICAgaWYgKGRlY2xhcmF0aW9uIGlzIEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5hYnN0cmFjdE1lbWJlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0KICB9CgogIHN0YXRpYyBDbGFzc01lbWJlciBzZWxlY3RDb25jcmV0ZShDbGFzc01lbWJlciBkZWNsYXJhdGlvbikgewogICAgaWYgKGRlY2xhcmF0aW9uIGlzIEFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uKSB7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5jb25jcmV0ZUltcGxlbWVudGF0aW9uOwogICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBJbnRlcmZhY2VDb25mbGljdCAmJiAhZGVjbGFyYXRpb24uaXNBYnN0cmFjdCkgewogICAgICByZXR1cm4gc2VsZWN0Q29uY3JldGUoZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLnNpbmdsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgICB9CiAgfQp9Cgp2b2lkIGFkZERlY2xhcmF0aW9uSWZEaWZmZXJlbnQoCiAgICBDbGFzc01lbWJlciBkZWNsYXJhdGlvbiwgTGlzdDxDbGFzc01lbWJlcj4gZGVjbGFyYXRpb25zKSB7CiAgTWVtYmVyIHRhcmdldCA9IGRlY2xhcmF0aW9uLm1lbWJlcjsKICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSkgewogICAgRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uID0gdGFyZ2V0LmZ1bmN0aW9uOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgTWVtYmVyIG90aGVyID0gZGVjbGFyYXRpb25zW2ldLm1lbWJlcjsKICAgICAgaWYgKG90aGVyIGlzIFByb2NlZHVyZSkgewogICAgICAgIGlmIChoYXNTYW1lU2lnbmF0dXJlKGZ1bmN0aW9uLCBvdGhlci5mdW5jdGlvbikpIHJldHVybjsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoZGVjbGFyYXRpb24gPT0gZGVjbGFyYXRpb25zW2ldKSByZXR1cm47CiAgICB9CiAgfQogIGRlY2xhcmF0aW9ucy5hZGQoZGVjbGFyYXRpb24pOwp9CgpTdHJpbmcgZnVsbE5hbWUoQ2xhc3NNZW1iZXIgZGVjbGFyYXRpb24pIHsKICBTdHJpbmcgc3VmZml4ID0gZGVjbGFyYXRpb24uaXNTZXR0ZXIgPyAiPSIgOiAiIjsKICBpZiAoZGVjbGFyYXRpb24gaXMgRGVsYXllZE1lbWJlcikgewogICAgcmV0dXJuICIke2RlY2xhcmF0aW9uLmZ1bGxOYW1lRm9yRXJyb3JzfSRzdWZmaXgiOwogIH0KICBTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyYXRpb24uY2xhc3NCdWlsZGVyPy5mdWxsTmFtZUZvckVycm9yczsKICByZXR1cm4gY2xhc3NOYW1lID09IG51bGwKICAgICAgPyAiJHtkZWNsYXJhdGlvbi5mdWxsTmFtZUZvckVycm9yc30kc3VmZml4IgogICAgICA6ICIke2NsYXNzTmFtZX0uJHtkZWNsYXJhdGlvbi5mdWxsTmFtZUZvckVycm9yc30kc3VmZml4IjsKfQoKaW50IGNvbXBhcmVOYW1lZFBhcmFtZXRlcnMoVmFyaWFibGVEZWNsYXJhdGlvbiBhLCBWYXJpYWJsZURlY2xhcmF0aW9uIGIpIHsKICByZXR1cm4gYS5uYW1lLmNvbXBhcmVUbyhiLm5hbWUpOwp9Cgpib29sIGlzQWJzdHJhY3QoQ2xhc3NNZW1iZXIgZGVjbGFyYXRpb24pIHsKICByZXR1cm4gZGVjbGFyYXRpb24ubWVtYmVyLmlzQWJzdHJhY3QgfHwKICAgICAgKGRlY2xhcmF0aW9uIGlzIEludGVyZmFjZUNvbmZsaWN0ICYmIGRlY2xhcmF0aW9uLmlzQWJzdHJhY3QpOwp9Cgpib29sIGluZmVyUGFyYW1ldGVyVHlwZSgKICAgIENsYXNzQnVpbGRlciBjbGFzc0J1aWxkZXIsCiAgICBQcm9jZWR1cmVCdWlsZGVyIG1lbWJlckJ1aWxkZXIsCiAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlckJ1aWxkZXIsCiAgICBEYXJ0VHlwZSB0eXBlLAogICAgYm9vbCBoYWRUeXBlc0luZmVycmVkLAogICAgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogIGRlYnVnPy5sb2coIkluZmVycmVkIHR5cGUgJHt0eXBlfSBmb3IgJHtwYXJhbWV0ZXJCdWlsZGVyfSIpOwoKICBpZiAoY2xhc3NCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgaWYgKGhhZFR5cGVzSW5mZXJyZWQpIHsKICAgICAgdHlwZSA9IG5uYmRUb3BNZXJnZSgKICAgICAgICAgIGhpZXJhcmNoeS5jb3JlVHlwZXMsIHBhcmFtZXRlckJ1aWxkZXIudmFyaWFibGUudHlwZSwgdHlwZSk7CiAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKICAgICAgICAvLyBUaGUgbm5iZCB0b3AgbWVyZ2UgZXhpc3RzIHNvIFt0eXBlXSBpcyB0aGUgaW5mZXJyZWQgdHlwZS4KICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLnZhcmlhYmxlLnR5cGUgPSB0eXBlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIFRoZSBubmJkIHRvcCBtZXJnZSBkb2Vzbid0IGV4aXN0LiBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGJlbG93LgogICAgfQogIH0gZWxzZSB7CiAgICB0eXBlID0gbGVnYWN5RXJhc3VyZShoaWVyYXJjaHkuY29yZVR5cGVzLCB0eXBlKTsKICB9CgogIGlmICh0eXBlID09IHBhcmFtZXRlckJ1aWxkZXIudmFyaWFibGUudHlwZSkgcmV0dXJuIHRydWU7CiAgYm9vbCByZXN1bHQgPSB0cnVlOwogIGlmIChoYWRUeXBlc0luZmVycmVkKSB7CiAgICByZXBvcnRDYW50SW5mZXJQYXJhbWV0ZXJUeXBlKAogICAgICAgIGNsYXNzQnVpbGRlciwgbWVtYmVyQnVpbGRlciwgcGFyYW1ldGVyQnVpbGRlciwgaGllcmFyY2h5KTsKICAgIHR5cGUgPSBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgcmVzdWx0ID0gZmFsc2U7CiAgfQogIHBhcmFtZXRlckJ1aWxkZXIudmFyaWFibGUudHlwZSA9IHR5cGU7CiAgbWVtYmVyQnVpbGRlci5oYWRUeXBlc0luZmVycmVkID0gdHJ1ZTsKICByZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIHJlcG9ydENhbnRJbmZlclBhcmFtZXRlclR5cGUoQ2xhc3NCdWlsZGVyIGNscywgTWVtYmVyQnVpbGRlciBtZW1iZXIsCiAgICBGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyIHBhcmFtZXRlciwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogIFN0cmluZyBuYW1lID0gcGFyYW1ldGVyLm5hbWU7CiAgY2xzLmFkZFByb2JsZW0oCiAgICAgIHRlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgIHBhcmFtZXRlci5jaGFyT2Zmc2V0LAogICAgICBuYW1lLmxlbmd0aCwKICAgICAgd2FzSGFuZGxlZDogdHJ1ZSk7Cn0KCmJvb2wgaW5mZXJSZXR1cm5UeXBlKENsYXNzQnVpbGRlciBjbHMsIFByb2NlZHVyZUJ1aWxkZXIgcHJvY2VkdXJlQnVpbGRlciwKICAgIERhcnRUeXBlIHR5cGUsIGJvb2wgaGFkVHlwZXNJbmZlcnJlZCwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogIGlmICh0eXBlID09IHByb2NlZHVyZUJ1aWxkZXIucHJvY2VkdXJlLmZ1bmN0aW9uLnJldHVyblR5cGUpIHJldHVybiB0cnVlOwogIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKICBpZiAoaGFkVHlwZXNJbmZlcnJlZCkgewogICAgcmVwb3J0Q2FudEluZmVyUmV0dXJuVHlwZShjbHMsIHByb2NlZHVyZUJ1aWxkZXIsIGhpZXJhcmNoeSk7CiAgICB0eXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIHJlc3VsdCA9IGZhbHNlOwogIH0gZWxzZSB7CiAgICBwcm9jZWR1cmVCdWlsZGVyLmhhZFR5cGVzSW5mZXJyZWQgPSB0cnVlOwogIH0KICBwcm9jZWR1cmVCdWlsZGVyLnByb2NlZHVyZS5mdW5jdGlvbi5yZXR1cm5UeXBlID0gdHlwZTsKICByZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIHJlcG9ydENhbnRJbmZlclJldHVyblR5cGUoCiAgICBDbGFzc0J1aWxkZXIgY2xzLCBNZW1iZXJCdWlsZGVyIG1lbWJlciwgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyIGhpZXJhcmNoeSkgewogIFN0cmluZyBuYW1lID0gbWVtYmVyLmZ1bGxOYW1lRm9yRXJyb3JzOwogIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CiAgLy8gLy8gVE9ETyhhaGUpOiBUaGUgZm9sbG93aW5nIGlzIGZvciBkZWJ1Z2dpbmcsIGJ1dCBjb3VsZCBiZSBjbGVhbmVkIHVwIGFuZAogIC8vIC8vIHVzZWQgdG8gaW1wcm92ZSB0aGlzIGVycm9yIG1lc3NhZ2UgaW4gZ2VuZXJhbC4KICAvLwogIC8vIGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+W107CiAgLy8gQ2xhc3NIaWVyYXJjaHlOb2RlIHN1cGVybm9kZSA9IGhpZXJhcmNoeS5nZXROb2RlRnJvbVR5cGUoY2xzLnN1cGVydHlwZSk7CiAgLy8gLy8gVE9ETyhhaGUpOiBXcm9uZyB0ZW1wbGF0ZS4KICAvLyBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyk+IHRlbXBsYXRlID0KICAvLyAgICAgdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZTsKICAvLyBpZiAoc3VwZXJub2RlICE9IG51bGwpIHsKICAvLyAgIERlY2xhcmF0aW9uIHN1cGVyTWVtYmVyID0KICAvLyAgICAgICBzdXBlcm5vZGUuZ2V0SW50ZXJmYWNlTWVtYmVyKG5ldyBOYW1lKG5hbWUpLCBmYWxzZSk7CiAgLy8gICBpZiAoc3VwZXJNZW1iZXIgIT0gbnVsbCkgewogIC8vICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZQogIC8vICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAvLyAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgLy8gICAgICAgICAgICAgc3VwZXJNZW1iZXIuZmlsZVVyaSwgc3VwZXJNZW1iZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpKTsKICAvLyAgIH0KICAvLyAgIHN1cGVyTWVtYmVyID0gc3VwZXJub2RlLmdldEludGVyZmFjZU1lbWJlcihuZXcgTmFtZShuYW1lKSwgdHJ1ZSk7CiAgLy8gICBpZiAoc3VwZXJNZW1iZXIgIT0gbnVsbCkgewogIC8vICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZQogIC8vICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAvLyAgICAgICAgIC53aXRoTG9jYXRpb24oCiAgLy8gICAgICAgICAgICAgc3VwZXJNZW1iZXIuZmlsZVVyaSwgc3VwZXJNZW1iZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpKTsKICAvLyAgIH0KICAvLyB9CiAgLy8gTGlzdDxUeXBlQnVpbGRlcj4gZGlyZWN0SW50ZXJmYWNlcyA9IGNscy5pbnRlcmZhY2VzOwogIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0SW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewogIC8vICAgQ2xhc3NIaWVyYXJjaHlOb2RlIHN1cGVybm9kZSA9CiAgLy8gICAgICAgaGllcmFyY2h5LmdldE5vZGVGcm9tVHlwZShkaXJlY3RJbnRlcmZhY2VzW2ldKTsKICAvLyAgIGlmIChzdXBlcm5vZGUgIT0gbnVsbCkgewogIC8vICAgICBEZWNsYXJhdGlvbiBzdXBlck1lbWJlciA9CiAgLy8gICAgICAgICBzdXBlcm5vZGUuZ2V0SW50ZXJmYWNlTWVtYmVyKG5ldyBOYW1lKG5hbWUpLCBmYWxzZSk7CiAgLy8gICAgIGlmIChzdXBlck1lbWJlciAhPSBudWxsKSB7CiAgLy8gICAgICAgY29udGV4dC5hZGQodGVtcGxhdGUKICAvLyAgICAgICAgICAgLndpdGhBcmd1bWVudHMobmFtZSkKICAvLyAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAvLyAgICAgICAgICAgICAgIHN1cGVyTWVtYmVyLmZpbGVVcmksIHN1cGVyTWVtYmVyLmNoYXJPZmZzZXQsIG5hbWUubGVuZ3RoKSk7CiAgLy8gICAgIH0KICAvLyAgICAgc3VwZXJNZW1iZXIgPSBzdXBlcm5vZGUuZ2V0SW50ZXJmYWNlTWVtYmVyKG5ldyBOYW1lKG5hbWUpLCB0cnVlKTsKICAvLyAgICAgaWYgKHN1cGVyTWVtYmVyICE9IG51bGwpIHsKICAvLyAgICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZQogIC8vICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogIC8vICAgICAgICAgICAud2l0aExvY2F0aW9uKAogIC8vICAgICAgICAgICAgICAgc3VwZXJNZW1iZXIuZmlsZVVyaSwgc3VwZXJNZW1iZXIuY2hhck9mZnNldCwgbmFtZS5sZW5ndGgpKTsKICAvLyAgICAgfQogIC8vICAgfQogIC8vIH0KICBjbHMuYWRkUHJvYmxlbSgKICAgICAgdGVtcGxhdGVDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXMud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsCiAgICAgIG5hbWUubGVuZ3RoLAogICAgICB3YXNIYW5kbGVkOiB0cnVlLAogICAgICBjb250ZXh0OiBjb250ZXh0KTsKfQoKdm9pZCByZXBvcnRDYW50SW5mZXJGaWVsZFR5cGUoQ2xhc3NCdWlsZGVyIGNscywgRmllbGRCdWlsZGVyIG1lbWJlcikgewogIFN0cmluZyBuYW1lID0gbWVtYmVyLmZ1bGxOYW1lRm9yRXJyb3JzOwogIGNscy5hZGRQcm9ibGVtKAogICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcy53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICBtZW1iZXIuY2hhck9mZnNldCwKICAgICAgbmFtZS5sZW5ndGgsCiAgICAgIHdhc0hhbmRsZWQ6IHRydWUpOwp9CgpDbGFzc0J1aWxkZXIgZ2V0Q2xhc3MoVHlwZUJ1aWxkZXIgdHlwZSkgewogIEJ1aWxkZXIgZGVjbGFyYXRpb24gPSB0eXBlLmRlY2xhcmF0aW9uOwogIGlmIChkZWNsYXJhdGlvbiBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICBUeXBlQWxpYXNCdWlsZGVyIGFsaWFzQnVpbGRlciA9IGRlY2xhcmF0aW9uOwogICAgZGVjbGFyYXRpb24gPSBhbGlhc0J1aWxkZXIudW5hbGlhc0RlY2xhcmF0aW9uOwogIH0KICByZXR1cm4gZGVjbGFyYXRpb24gaXMgQ2xhc3NCdWlsZGVyID8gZGVjbGFyYXRpb24gOiBudWxsOwp9Cgpib29sIGhhc0V4cGxpY2l0UmV0dXJuVHlwZShDbGFzc01lbWJlciBkZWNsYXJhdGlvbikgewogIGFzc2VydChkZWNsYXJhdGlvbiBpcyBQcm9jZWR1cmVCdWlsZGVyIHx8IGRlY2xhcmF0aW9uIGlzIERpbGxNZW1iZXJCdWlsZGVyLAogICAgICAiJHtkZWNsYXJhdGlvbi5ydW50aW1lVHlwZX0iKTsKICByZXR1cm4gZGVjbGFyYXRpb24gaXMgUHJvY2VkdXJlQnVpbGRlcgogICAgICA/IGRlY2xhcmF0aW9uLnJldHVyblR5cGUgIT0gbnVsbAogICAgICA6IHRydWU7Cn0KCmJvb2wgaGFzRXhwbGljaXRseVR5cGVkRm9ybWFsUGFyYW1ldGVyKENs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aWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS9zdGFuZGFyZF9ib3VuZHMuZGFydMAA3YAvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKCmltcG9ydCAncGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRHluYW1pY1R5cGUsCiAgICAgICAgRnVuY3Rpb25UeXBlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgSW52YWxpZFR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBOYW1lZFR5cGUsCiAgICAgICAgTmV2ZXJUeXBlLAogICAgICAgIE51bGxhYmlsaXR5LAogICAgICAgIFR5cGVQYXJhbWV0ZXIsCiAgICAgICAgVHlwZVBhcmFtZXRlclR5cGUsCiAgICAgICAgVmFyaWFuY2UsCiAgICAgICAgVm9pZFR5cGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2Z1dHVyZV9vci5kYXJ0JzsKCmltcG9ydCAndHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBTdGFuZGFyZEJvdW5kcyB7CiAgQ29yZVR5cGVzIGdldCBjb3JlVHlwZXM7CgogIGJvb2wgaXNTdWJ0eXBlT2YoRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlLCBTdWJ0eXBlQ2hlY2tNb2RlIG1vZGUpOwoKICBib29sIGFyZU11dHVhbFN1YnR5cGVzKERhcnRUeXBlIHMsIERhcnRUeXBlIHQsIFN1YnR5cGVDaGVja01vZGUgbW9kZSk7CgogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpOwoKICAvLy8gQ2hlY2tzIHRoZSB2YWx1ZSBvZiB0aGUgTU9SRVRPUCBwcmVkaWNhdGUgZm9yIFtzXSBhbmQgW3RdLgogIC8vLwogIC8vLyBGb3IgdGhlIGRlZmluaXRpb24gb2YgTU9SRVRPUCBzZWUgdGhlIGZvbGxvd2luZzoKICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9ibG9iL21hc3Rlci9yZXNvdXJjZXMvdHlwZS1zeXN0ZW0vdXBwZXItbG93ZXItYm91bmRzLm1kI2hlbHBlci1wcmVkaWNhdGVzCiAgYm9vbCBtb3JldG9wKERhcnRUeXBlIHMsIERhcnRUeXBlIHQpIHsKICAgIGFzc2VydChjb3JlVHlwZXMuaXNUb3AocykgfHwgY29yZVR5cGVzLmlzT2JqZWN0KHMpKTsKICAgIGFzc2VydChjb3JlVHlwZXMuaXNUb3AodCkgfHwgY29yZVR5cGVzLmlzT2JqZWN0KHQpKTsKCiAgICAvLyBNT1JFVE9QKHZvaWQsIFQpID0gdHJ1ZS4KICAgIGlmIChzIGlzIFZvaWRUeXBlKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBNT1JFVE9QKFMsIHZvaWQpID0gZmFsc2UuCiAgICBpZiAodCBpcyBWb2lkVHlwZSkgcmV0dXJuIGZhbHNlOwoKICAgIC8vIE1PUkVUT1AoZHluYW1pYywgVCkgPSB0cnVlLgogICAgaWYgKHMgaXMgRHluYW1pY1R5cGUpIHJldHVybiB0cnVlOwoKICAgIC8vIE1PUkVUT1AoUywgZHluYW1pYykgPSBmYWxzZS4KICAgIGlmICh0IGlzIER5bmFtaWNUeXBlKSByZXR1cm4gZmFsc2U7CgogICAgLy8gTU9SRVRPUChPYmplY3QsIFQpID0gdHJ1ZS4KICAgIGlmIChzIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBzLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMub2JqZWN0Q2xhc3MgJiYKICAgICAgICBzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIE1PUkVUT1AoUywgT2JqZWN0KSA9IGZhbHNlLgogICAgaWYgKHQgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHQuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5vYmplY3RDbGFzcyAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIE1PUkVUT1AoUyosIFQqKSA9IE1PUkVUT1AoUywgVCkuCiAgICBpZiAocy5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgewogICAgICBEYXJ0VHlwZSBub25OdWxsYWJsZVMgPSBzLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICAgIGFzc2VydChzICE9IG5vbk51bGxhYmxlUyk7CiAgICAgIERhcnRUeXBlIG5vbk51bGxhYmxlVCA9IHQud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICAgICAgYXNzZXJ0KHQgIT0gbm9uTnVsbGFibGVUKTsKICAgICAgcmV0dXJuIG1vcmV0b3Aobm9uTnVsbGFibGVTLCBub25OdWxsYWJsZVQpOwogICAgfQoKICAgIC8vIE1PUkVUT1AoUywgVCopID0gdHJ1ZS4KICAgIGlmIChzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlICYmCiAgICAgICAgdC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gTU9SRVRPUChTKiwgVCkgPSBmYWxzZS4KICAgIGlmIChzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIE1PUkVUT1AoUz8sIFQ/KSA9PSBNT1JFVE9QKFMsIFQpLgogICAgaWYgKHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgIERhcnRUeXBlIG5vbk51bGxhYmxlUyA9IHMud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICAgICAgYXNzZXJ0KHMgIT0gbm9uTnVsbGFibGVTKTsKICAgICAgRGFydFR5cGUgbm9uTnVsbGFibGVUID0gdC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBhc3NlcnQodCAhPSBub25OdWxsYWJsZVQpOwogICAgICByZXR1cm4gbW9yZXRvcChub25OdWxsYWJsZVMsIG5vbk51bGxhYmxlVCk7CiAgICB9CgogICAgLy8gTU9SRVRPUChTLCBUPykgPSB0cnVlLgogICAgaWYgKHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIE1PUkVUT1AoUz8sIFQpID0gZmFsc2UuCiAgICBpZiAocy5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBVcGRhdGUgdGhlIGZvbGxvd2luZyBhZnRlciB0aGUgc3BlYyBpcyB1cGRhdGVkLgogICAgaWYgKHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIE1PUkVUT1AoRnV0dXJlT3I8Uz4sIEZ1dHVyZU9yPFQ+KSA9IE1PUkVUT1AoUywgVCkuCiAgICBpZiAocyBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgcy5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MgJiYKICAgICAgICBzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlICYmCiAgICAgICAgdCBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgdC5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiBtb3JldG9wKHMudHlwZUFyZ3VtZW50cy5zaW5nbGUsIHQudHlwZUFyZ3VtZW50cy5zaW5nbGUpOwogICAgfQoKICAgIHJldHVybiBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZC53aXRoQXJndW1lbnRzKCJtb3JldG9wKCRzLCAkdCkiKSwKICAgICAgICAtMSwKICAgICAgICBudWxsKTsKICB9CgogIC8vLyBDaGVja3MgdGhlIHZhbHVlIG9mIHRoZSBNT1JFQk9UVE9NIHByZWRpY2F0ZSBmb3IgW3NdIGFuZCBbdF0uCiAgLy8vCiAgLy8vIEZvciB0aGUgZGVmaW5pdGlvbiBvZiBNT1JFQk9UVE9NIHNlZSB0aGUgZm9sbG93aW5nOgogIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2Jsb2IvbWFzdGVyL3Jlc291cmNlcy90eXBlLXN5c3RlbS91cHBlci1sb3dlci1ib3VuZHMubWQjaGVscGVyLXByZWRpY2F0ZXMKICBib29sIG1vcmVib3R0b20oRGFydFR5cGUgcywgRGFydFR5cGUgdCkgewogICAgYXNzZXJ0KGNvcmVUeXBlcy5pc0JvdHRvbShzKSB8fCBjb3JlVHlwZXMuaXNOdWxsKHMpKTsKICAgIGFzc2VydChjb3JlVHlwZXMuaXNCb3R0b20odCkgfHwgY29yZVR5cGVzLmlzTnVsbCh0KSk7CgogICAgLy8gTU9SRUJPVFRPTShOZXZlciwgVCkgPSB0cnVlLgogICAgaWYgKHMgaXMgTmV2ZXJUeXBlICYmIHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gTU9SRUJPVFRPTShTLCBOZXZlcikgPSBmYWxzZS4KICAgIGlmICh0IGlzIE5ldmVyVHlwZSAmJiB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBNT1JFQk9UVE9NKE51bGwsIFQpID0gdHJ1ZS4KICAgIGlmIChzID09IGNvcmVUeXBlcy5udWxsVHlwZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBNT1JFQk9UVE9NKFMsIE51bGwpID0gZmFsc2UuCiAgICBpZiAodCA9PSBjb3JlVHlwZXMubnVsbFR5cGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIE1PUkVCT1RUT00oUz8sIFQ/KSA9IE1PUkVCT1RUT00oUywgVCkuCiAgICBpZiAodC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSAmJgogICAgICAgIHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgRGFydFR5cGUgbm9uTnVsbGFibGVTID0gcy53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBhc3NlcnQocyAhPSBub25OdWxsYWJsZVMpOwogICAgICBEYXJ0VHlwZSBub25OdWxsYWJsZVQgPSB0LndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICAgIGFzc2VydCh0ICE9IG5vbk51bGxhYmxlVCk7CiAgICAgIHJldHVybiBtb3JlYm90dG9tKG5vbk51bGxhYmxlUywgbm9uTnVsbGFibGVUKTsKICAgIH0KCiAgICAvLyBNT1JFQk9UVE9NKFMsIFQ/KSA9IHRydWUuCiAgICBpZiAocy5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gTU9SRUJPVFRPTShTPywgVCkgPSBmYWxzZS4KICAgIGlmIChzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlICYmCiAgICAgICAgdC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gTU9SRUJPVFRPTShTKiwgVCopID0gTU9SRUJPVFRPTShTLCBUKS4KICAgIGlmIChzLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5KSB7CiAgICAgIERhcnRUeXBlIG5vbk51bGxhYmxlUyA9IHMud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICAgICAgYXNzZXJ0KHMgIT0gbm9uTnVsbGFibGVTKTsKICAgICAgRGFydFR5cGUgbm9uTnVsbGFibGVUID0gdC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBhc3NlcnQodCAhPSBub25OdWxsYWJsZVQpOwogICAgICByZXR1cm4gbW9yZWJvdHRvbShub25OdWxsYWJsZVMsIG5vbk51bGxhYmxlVCk7CiAgICB9CgogICAgLy8gTU9SRUJPVFRPTShTLCBUKikgPSB0cnVlLgogICAgaWYgKHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUgJiYKICAgICAgICB0Lm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBNT1JFQk9UVE9NKFMqLCBUKSA9IGZhbHNlLgogICAgaWYgKHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5ICYmCiAgICAgICAgdC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gVE9ETyhkbWl0cnlhcyk6IFVwZGF0ZSB0aGUgZm9sbG93aW5nIGFmdGVyIHRoZSBzcGVjIGlzIHVwZGF0ZWQuCiAgICBpZiAocy5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSAmJgogICAgICAgIHQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHMubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5ICYmCiAgICAgICAgdC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gTU9SRUJPVFRPTShYJlMsIFkmVCkgPSBNT1JFQk9UVE9NKFMsIFQpLgogICAgaWYgKHMgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBzLnByb21vdGVkQm91bmQgIT0gbnVsbCAmJgogICAgICAgIHQgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICB0LnByb21vdGVkQm91bmQgIT0gbnVsbCkgewogICAgICByZXR1cm4gbW9yZWJvdHRvbShzLnByb21vdGVkQm91bmQsIHQucHJvbW90ZWRCb3VuZCk7CiAgICB9CgogICAgLy8gTU9SRUJPVFRPTShYJlMsIFQpID0gdHJ1ZS4KICAgIGlmIChzIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmIHMucHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIE1PUkVCT1RUT00oUywgWCZUKSA9IGZhbHNlLgogICAgaWYgKHQgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYgdC5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIE1PUkVCT1RUT00oWCBleHRlbmRzIFMsIFkgZXh0ZW5kcyBUKSA9IE1PUkVCT1RUT00oUywgVCkuCiAgICBpZiAocyBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiB0IGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIGFzc2VydChzLnByb21vdGVkQm91bmQgPT0gbnVsbCk7CiAgICAgIGFzc2VydCh0LnByb21vdGVkQm91bmQgPT0gbnVsbCk7CiAgICAgIHJldHVybiBtb3JlYm90dG9tKHMucGFyYW1ldGVyLmJvdW5kLCB0LnBhcmFtZXRlci5ib3VuZCk7CiAgICB9CgogICAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkLndpdGhBcmd1bWVudHMoIm1vcmVib3R0b20oJHMsICR0KSIpLAogICAgICAgIC0xLAogICAgICAgIG51bGwpOwogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBzdGFuZGFyZCBsb3dlciBib3VuZCBvZiBbdHlwZTFdIGFuZCBbdHlwZTJdLgogIC8vLwogIC8vLyBTdGFuZGFyZCBsb3dlciBib3VuZCBpcyBhIGxvd2VyIGJvdW5kIGZ1bmN0aW9uIHRoYXQgaW1wb3NlcyBhbgogIC8vLyBvcmRlcmluZyBvbiB0aGUgdG9wIHR5cGVzIGB2b2lkYCwgYGR5bmFtaWNgLCBhbmQgYG9iamVjdGAuICBUaGlzIGZ1bmN0aW9uCiAgLy8vIGFkZGl0aW9uYWxseSBoYW5kbGVzIHRoZSB1bmtub3duIHR5cGUgdGhhdCBhcHBlYXJzIGR1cmluZyB0eXBlIGluZmVyZW5jZS4KICBEYXJ0VHlwZSBnZXRTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMiwgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICBpZiAoY2xpZW50TGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJldHVybiBnZXROdWxsYWJpbGl0eUF3YXJlU3RhbmRhcmRMb3dlckJvdW5kKHR5cGUxLCB0eXBlMiwgY2xpZW50TGlicmFyeSk7CiAgICB9CiAgICByZXR1cm4gZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgICAgdHlwZTEsIHR5cGUyLCBjbGllbnRMaWJyYXJ5KTsKICB9CgogIERhcnRUeXBlIGdldE51bGxhYmlsaXR5QXdhcmVTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMiwgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICAvLyBET1dOKFQsIFQpID0gVC4KICAgIGlmIChpZGVudGljYWwodHlwZTEsIHR5cGUyKSkgcmV0dXJuIHR5cGUxOwoKICAgIC8vIEZvciBhbnkgdHlwZSBULCBTTEIoPywgVCkgPSBTTEIoVCwgPykgPSBULgogICAgaWYgKHR5cGUxIGlzIFVua25vd25UeXBlKSByZXR1cm4gdHlwZTI7CiAgICBpZiAodHlwZTIgaXMgVW5rbm93blR5cGUpIHJldHVybiB0eXBlMTsKCiAgICAvLyBET1dOKFQxLCBUMikgd2hlcmUgVE9QKFQxKSBhbmQgVE9QKFQyKSA9CiAgICAvLyAgIFQxIGlmIE1PUkVUT1AoVDIsIFQxKQogICAgLy8gICBUMiBvdGhlcndpc2UKICAgIC8vIERPV04oVDEsIFQyKSA9IFQyIGlmIFRPUChUMSkKICAgIC8vIERPV04oVDEsIFQyKSA9IFQxIGlmIFRPUChUMikKICAgIGlmIChjb3JlVHlwZXMuaXNUb3AodHlwZTEpKSB7CiAgICAgIGlmIChjb3JlVHlwZXMuaXNUb3AodHlwZTIpKSByZXR1cm4gbW9yZXRvcCh0eXBlMiwgdHlwZTEpID8gdHlwZTEgOiB0eXBlMjsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfSBlbHNlIGlmIChjb3JlVHlwZXMuaXNUb3AodHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBET1dOKFQxLCBUMikgd2hlcmUgQk9UVE9NKFQxKSBhbmQgQk9UVE9NKFQyKSA9CiAgICAvLyAgIFQxIGlmIE1PUkVCT1RUT00oVDEsIFQyKQogICAgLy8gICBUMiBvdGhlcndpc2UKICAgIC8vIERPV04oVDEsIFQyKSA9IFQyIGlmIEJPVFRPTShUMikKICAgIC8vIERPV04oVDEsIFQyKSA9IFQxIGlmIEJPVFRPTShUMSkKICAgIGlmIChjb3JlVHlwZXMuaXNCb3R0b20odHlwZTEpKSB7CiAgICAgIGlmIChjb3JlVHlwZXMuaXNCb3R0b20odHlwZTIpKSB7CiAgICAgICAgcmV0dXJuIG1vcmVib3R0b20odHlwZTEsIHR5cGUyKSA/IHR5cGUxIDogdHlwZTI7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGUxOwogICAgfSBlbHNlIGlmIChjb3JlVHlwZXMuaXNCb3R0b20odHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBET1dOKFQxLCBUMikgd2hlcmUgTlVMTChUMSkgYW5kIE5VTEwoVDIpID0KICAgIC8vICAgVDEgaWYgTU9SRUJPVFRPTShUMSwgVDIpCiAgICAvLyAgIFQyIG90aGVyd2lzZQogICAgLy8gRE9XTihOdWxsLCBUMikgPQogICAgLy8gICBOdWxsIGlmIE51bGwgPDogVDIKICAgIC8vICAgTmV2ZXIgb3RoZXJ3aXNlCiAgICAvLyBET1dOKFQxLCBOdWxsKSA9CiAgICAvLyAgTnVsbCBpZiBOdWxsIDw6IFQxCiAgICAvLyAgTmV2ZXIgb3RoZXJ3aXNlCiAgICBpZiAoY29yZVR5cGVzLmlzTnVsbCh0eXBlMSkpIHsKICAgICAgaWYgKGNvcmVUeXBlcy5pc051bGwodHlwZTIpKSB7CiAgICAgICAgcmV0dXJuIG1vcmVib3R0b20odHlwZTEsIHR5cGUyKSA/IHR5cGUxIDogdHlwZTI7CiAgICAgIH0KICAgICAgTnVsbGFiaWxpdHkgdHlwZTJOdWxsYWJpbGl0eSA9CiAgICAgICAgICBjb21wdXRlTnVsbGFiaWxpdHkodHlwZTIsIGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKTsKICAgICAgaWYgKHR5cGUyTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5IHx8CiAgICAgICAgICB0eXBlMk51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgICAgcmV0dXJuIHR5cGUxOwogICAgICB9CiAgICAgIHJldHVybiBjb25zdCBOZXZlclR5cGUoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgfSBlbHNlIGlmIChjb3JlVHlwZXMuaXNOdWxsKHR5cGUyKSkgewogICAgICBOdWxsYWJpbGl0eSB0eXBlMU51bGxhYmlsaXR5ID0KICAgICAgICAgIGNvbXB1dGVOdWxsYWJpbGl0eSh0eXBlMSwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpOwogICAgICBpZiAodHlwZTFOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgfHwKICAgICAgICAgIHR5cGUxTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgICByZXR1cm4gdHlwZTI7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0IE5ldmVyVHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICB9CgogICAgLy8gRE9XTihUMSwgVDIpIHdoZXJlIE9CSkVDVChUMSkgYW5kIE9CSkVDVChUMikgPQogICAgLy8gICBUMSBpZiBNT1JFVE9QKFQyLCBUMSkKICAgIC8vICAgVDIgb3RoZXJ3aXNlCiAgICAvLyBET1dOKFQxLCBUMikgd2hlcmUgT0JKRUNUKFQxKSA9CiAgICAvLyAgIFQyIGlmIFQyIGlzIG5vbi1udWxsYWJsZQogICAgLy8gICBOb25OdWxsKFQyKSBpZiBOb25OdWxsKFQyKSBpcyBub24tbnVsbGFibGUKICAgIC8vICAgTmV2ZXIgb3RoZXJ3aXNlCiAgICAvLyBET1dOKFQxLCBUMikgd2hlcmUgT0JKRUNUKFQyKSA9CiAgICAvLyAgIFQxIGlmIFQxIGlzIG5vbi1udWxsYWJsZQogICAgLy8gICBOb25OdWxsKFQxKSBpZiBOb25OdWxsKFQxKSBpcyBub24tbnVsbGFibGUKICAgIC8vICAgTmV2ZXIgb3RoZXJ3aXNlCiAgICBpZiAoY29yZVR5cGVzLmlzT2JqZWN0KHR5cGUxKSkgewogICAgICBpZiAoY29yZVR5cGVzLmlzT2JqZWN0KHR5cGUyKSkgewogICAgICAgIHJldHVybiBtb3JldG9wKHR5cGUyLCB0eXBlMSkgPyB0eXBlMSA6IHR5cGUyOwogICAgICB9CiAgICAgIE51bGxhYmlsaXR5IHR5cGUyTnVsbGFiaWxpdHkgPQogICAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5KHR5cGUyLCBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcyk7CiAgICAgIGlmICh0eXBlMk51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB7CiAgICAgICAgcmV0dXJuIHR5cGUyOwogICAgICB9CiAgICAgIHR5cGUyID0gdHlwZTIud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICAgICAgdHlwZTJOdWxsYWJpbGl0eSA9IGNvbXB1dGVOdWxsYWJpbGl0eSh0eXBlMiwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpOwogICAgICBpZiAodHlwZTJOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICAgIHJldHVybiB0eXBlMjsKICAgICAgfQogICAgICByZXR1cm4gY29uc3QgTmV2ZXJUeXBlKE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICAgIH0gZWxzZSBpZiAoY29yZVR5cGVzLmlzT2JqZWN0KHR5cGUyKSkgewogICAgICBOdWxsYWJpbGl0eSB0eXBlMU51bGxhYmlsaXR5ID0KICAgICAgICAgIGNvbXB1dGVOdWxsYWJpbGl0eSh0eXBlMSwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpOwogICAgICBpZiAodHlwZTFOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICAgIHJldHVybiB0eXBlMTsKICAgICAgfQogICAgICB0eXBlMSA9IHR5cGUxLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICAgIHR5cGUxTnVsbGFiaWxpdHkgPSBjb21wdXRlTnVsbGFiaWxpdHkodHlwZTEsIGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKTsKICAgICAgaWYgKHR5cGUxTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgICByZXR1cm4gdHlwZTE7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0IE5ldmVyVHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICB9CgogICAgLy8gVGhlIGVmZmVjdCBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzIGlzIGFjY291bnRlZCBmb3IgaW4gdGhlIGNvZGUgYmVsb3cgdmlhCiAgICAvLyB0aGUgaW52b2NhdGlvbnMgb2YgaW50ZXJzZWN0TnVsbGFiaWxpdGllcy4KICAgIC8vIERPV04oVDEqLCBUMiopID0gUyogd2hlcmUgUyBpcyBET1dOKFQxLCBUMikKICAgIC8vIERPV04oVDEqLCBUMj8pID0gUyogd2hlcmUgUyBpcyBET1dOKFQxLCBUMikKICAgIC8vIERPV04oVDE/LCBUMiopID0gUyogd2hlcmUgUyBpcyBET1dOKFQxLCBUMikKICAgIC8vIERPV04oVDEqLCBUMikgPSBTIHdoZXJlIFMgaXMgRE9XTihUMSwgVDIpCiAgICAvLyBET1dOKFQxLCBUMiopID0gUyB3aGVyZSBTIGlzIERPV04oVDEsIFQyKQogICAgLy8gRE9XTihUMT8sIFQyPykgPSBTPyB3aGVyZSBTIGlzIERPV04oVDEsIFQyKQogICAgLy8gRE9XTihUMT8sIFQyKSA9IFMgd2hlcmUgUyBpcyBET1dOKFQxLCBUMikKICAgIC8vIERPV04oVDEsIFQyPykgPSBTIHdoZXJlIFMgaXMgRE9XTihUMSwgVDIpCgogICAgaWYgKHR5cGUxIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlMiBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgcmV0dXJuIF9nZXROdWxsYWJpbGl0eUF3YXJlRnVuY3Rpb25TdGFuZGFyZExvd2VyQm91bmQoCiAgICAgICAgICB0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogICAgfQoKICAgIC8vIERPV04oVDEsIFQyKSA9IFQxIGlmIFQxIDw6IFQyLgogICAgLy8gRE9XTihUMSwgVDIpID0gVDIgaWYgVDIgPDogVDEuCiAgICBEYXJ0VHlwZSBub25OdWxsYWJsZVR5cGUxID0gdHlwZTEud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKICAgIERhcnRUeXBlIG5vbk51bGxhYmxlVHlwZTIgPSB0eXBlMi53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgaWYgKGlzU3VidHlwZU9mKG5vbk51bGxhYmxlVHlwZTEsIG5vbk51bGxhYmxlVHlwZTIsCiAgICAgICAgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykpIHsKICAgICAgcmV0dXJuIHR5cGUxLndpdGhOdWxsYWJpbGl0eSgKICAgICAgICAgIGludGVyc2VjdE51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICB9CiAgICBpZiAoaXNTdWJ0eXBlT2Yobm9uTnVsbGFibGVUeXBlMiwgbm9uTnVsbGFibGVUeXBlMSwKICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLndpdGhOdWxsYWJpbGl0aWVzKSkgewogICAgICByZXR1cm4gdHlwZTIud2l0aE51bGxhYmlsaXR5KAogICAgICAgICAgaW50ZXJzZWN0TnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpKTsKICAgIH0KCiAgICAvLyBET1dOKFQxLCBUMikgPSBOZXZlciBvdGhlcndpc2UuCiAgICByZXR1cm4gbmV3IE5ldmVyVHlwZSgKICAgICAgICBpbnRlcnNlY3ROdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSkpOwogIH0KCiAgRGFydFR5cGUgZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgIERhcnRUeXBlIHR5cGUxLCBEYXJ0VHlwZSB0eXBlMiwgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICAvLyBGb3IgYWxsIHR5cGVzIFQsIFNMQihULFQpID0gVC4gIE5vdGUgdGhhdCB3ZSBkb24ndCB0ZXN0IGZvciBlcXVhbGl0eQogICAgLy8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIG1ha2UgdGhlIGFsZ29yaXRobSBxdWFkcmF0aWMuICBUaGlzIGlzIG9rCiAgICAvLyBiZWNhdXNlIHRoZSBjaGVjayBpcyBub3QgbmVlZGVkIGZvciBjb3JyZWN0bmVzczsgaXQncyBqdXN0IGEgc3BlZWQKICAgIC8vIG9wdGltaXphdGlvbi4KICAgIGlmIChpZGVudGljYWwodHlwZTEsIHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gRm9yIGFueSB0eXBlIFQsIFNMQig/LCBUKSA9IFNMQihULCA/KSA9IFQuCiAgICBpZiAodHlwZTEgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQogICAgaWYgKHR5cGUyIGlzIFVua25vd25UeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBTTEIodm9pZCwgVCkgPSBTTEIoVCwgdm9pZCkgPSBULgogICAgaWYgKHR5cGUxIGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBWb2lkVHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKGR5bmFtaWMsIFQpID0gU0xCKFQsIGR5bmFtaWMpID0gVCBpZiBUIGlzIG5vdCB2b2lkLgogICAgaWYgKHR5cGUxIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiBpcyBEeW5hbWljVHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKE9iamVjdCwgVCkgPSBTTEIoVCwgT2JqZWN0KSA9IFQgaWYgVCBpcyBub3Qgdm9pZCBvciBkeW5hbWljLgogICAgaWYgKHR5cGUxID09IGNvcmVUeXBlcy5vYmplY3RMZWdhY3lSYXdUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmICh0eXBlMiA9PSBjb3JlVHlwZXMub2JqZWN0TGVnYWN5UmF3VHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gU0xCKGJvdHRvbSwgVCkgPSBTTEIoVCwgYm90dG9tKSA9IGJvdHRvbS4KICAgIGlmICh0eXBlMSBpcyBCb3R0b21UeXBlKSByZXR1cm4gdHlwZTE7CiAgICBpZiAodHlwZTIgaXMgQm90dG9tVHlwZSkgcmV0dXJuIHR5cGUyOwogICAgaWYgKHR5cGUxID09IGNvcmVUeXBlcy5udWxsVHlwZSkgcmV0dXJuIHR5cGUxOwogICAgaWYgKHR5cGUyID09IGNvcmVUeXBlcy5udWxsVHlwZSkgcmV0dXJuIHR5cGUyOwoKICAgIC8vIEZ1bmN0aW9uIHR5cGVzIGhhdmUgc3RydWN0dXJhbCBsb3dlciBib3VuZHMuCiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICByZXR1cm4gX2dldE51bGxhYmlsaXR5T2JsaXZpb3VzRnVuY3Rpb25TdGFuZGFyZExvd2VyQm91bmQoCiAgICAgICAgICB0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogICAgfQoKICAgIC8vIE90aGVyd2lzZSwgdGhlIGxvd2VyIGJvdW5kcyAgb2YgdHdvIHR5cGVzIGlzIG9uZSBvZiB0aGVtIGl0IGlmIGl0IGlzIGEKICAgIC8vIHN1YnR5cGUgb2YgdGhlIG90aGVyLgogICAgaWYgKGlzU3VidHlwZU9mKHR5cGUxLCB0eXBlMiwgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxLCBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQoKICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzc0MzkjaXNzdWVjb21tZW50LTUxOTY1NDk1OS4KICAgIGlmICh0eXBlMSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUxLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykgewogICAgICBpZiAodHlwZTIgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgIGlmICh0eXBlMi5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpIHsKICAgICAgICAgIC8vIEdMQihGdXR1cmVPcjxBPiwgRnV0dXJlT3I8Qj4pID09IEZ1dHVyZU9yPEdMQihBLCBCKT4KICAgICAgICAgIERhcnRUeXBlIGFyZ3VtZW50ID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKAogICAgICAgICAgICAgIHR5cGUxLnR5cGVBcmd1bWVudHNbMF0sIHR5cGUyLnR5cGVBcmd1bWVudHNbMF0sIGNsaWVudExpYnJhcnkpOwogICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzLAogICAgICAgICAgICAgIGFyZ3VtZW50Lm51bGxhYmlsaXR5LCA8RGFydFR5cGU+W2FyZ3VtZW50XSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlMi5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzKSB7CiAgICAgICAgICAvLyBHTEIoRnV0dXJlT3I8QT4sIEZ1dHVyZTxCPikgPT0gRnV0dXJlPEdMQihBLCBCKT4KICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MsCiAgICAgICAgICAgICAgaW50ZXJzZWN0TnVsbGFiaWxpdGllcygKICAgICAgICAgICAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5T2ZGdXR1cmVPcih0eXBlMSwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpLAogICAgICAgICAgICAgICAgICB0eXBlMi5udWxsYWJpbGl0eSksCiAgICAgICAgICAgICAgPERhcnRUeXBlPlsKICAgICAgICAgICAgICAgIGdldFN0YW5kYXJkTG93ZXJCb3VuZCh0eXBlMS50eXBlQXJndW1lbnRzWzBdLAogICAgICAgICAgICAgICAgICAgIHR5cGUyLnR5cGVBcmd1bWVudHNbMF0sIGNsaWVudExpYnJhcnkpCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEdMQihGdXR1cmVPcjxBPiwgQikgPT0gR0xCKEEsIEIpCiAgICAgIHJldHVybiBnZXRTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgICAgICB0eXBlMS50eXBlQXJndW1lbnRzWzBdLCB0eXBlMiwgY2xpZW50TGlicmFyeSk7CiAgICB9CiAgICAvLyBUaGUgaWYtc3RhdGVtZW50IGJlbG93IGhhbmRsZXMgdGhlIGZvbGxvd2luZyBydWxlOgogICAgLy8gICAgIEdMQihBLCBGdXR1cmVPcjxCPikgPT0gIEdMQihGdXR1cmVPcjxCPiwgQSkKICAgIC8vIEl0J3MgYnJva2VuIGRvd24gaW50byBzdWItY2FzZXMgaW5zdGVhZCBvZiBtYWtpbmcgYSByZWN1cnNpdmUgY2FsbCB0bwogICAgLy8gYXZvaWQgbWFraW5nIHRoZSBjaGVja3MgdGhhdCB3ZXJlIGFscmVhZHkgbWFkZSBhYm92ZS4gIE5vdGUgdGhhdCBhdCB0aGlzCiAgICAvLyBwb2ludCBpdCdzIG5vdCBwb3NzaWJsZSBmb3IgdHlwZTEgdG8gYmUgYSBGdXR1cmVPci4KICAgIGlmICh0eXBlMiBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUyLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykgewogICAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzKSB7CiAgICAgICAgLy8gR0xCKEZ1dHVyZTxBPiwgRnV0dXJlT3I8Qj4pID09IEZ1dHVyZTxHTEIoQiwgQSk+CiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MsCiAgICAgICAgICAgIGludGVyc2VjdE51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksCiAgICAgICAgICAgICAgICBjb21wdXRlTnVsbGFiaWxpdHlPZkZ1dHVyZU9yKHR5cGUyLCBjb3JlVHlwZXMuZnV0dXJlT3JDbGFzcykpLAogICAgICAgICAgICA8RGFydFR5cGU+WwogICAgICAgICAgICAgIGdldFN0YW5kYXJkTG93ZXJCb3VuZCgKICAgICAgICAgICAgICAgICAgdHlwZTIudHlwZUFyZ3VtZW50c1swXSwgdHlwZTEudHlwZUFyZ3VtZW50c1swXSwgY2xpZW50TGlicmFyeSkKICAgICAgICAgICAgXSk7CiAgICAgIH0KICAgICAgLy8gR0xCKEEsIEZ1dHVyZU9yPEI+KSA9PSBHTEIoQiwgQSkKICAgICAgcmV0dXJuIGdldFN0YW5kYXJkTG93ZXJCb3VuZCgKICAgICAgICAgIHR5cGUyLnR5cGVBcmd1bWVudHNbMF0sIHR5cGUxLCBjbGllbnRMaWJyYXJ5KTsKICAgIH0KCiAgICAvLyBObyBzdWJ0eXBlIHJlbGF0aW9uLCBzbyB0aGUgbG93ZXIgYm91bmQgaXMgYm90dG9tLgogICAgcmV0dXJuIGNvbnN0IEJvdHRvbVR5cGUoKTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgdHdvIHR5cGVzLgogIC8vLwogIC8vLyBTdGFuZGFyZCB1cHBlciBib3VuZCBpcyBhbiB1cHBlciBib3VuZCBmdW5jdGlvbiB0aGF0IGltcG9zZXMgYW4gb3JkZXJpbmcKICAvLy8gb24gdGhlIHRvcCB0eXBlcyAndm9pZCcsICdkeW5hbWljJywgYW5kIGBvYmplY3RgLiAgVGhpcyBmdW5jdGlvbgogIC8vLyBhZGRpdGlvbmFsbHkgaGFuZGxlcyB0aGUgdW5rbm93biB0eXBlIHRoYXQgYXBwZWFycyBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCiAgRGFydFR5cGUgZ2V0U3RhbmRhcmRVcHBlckJvdW5kKAogICAgICBEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgaWYgKGNsaWVudExpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXR1cm4gZ2V0TnVsbGFiaWxpdHlBd2FyZVN0YW5kYXJkVXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogICAgfQogICAgcmV0dXJuIGdldE51bGxhYmlsaXR5T2JsaXZpb3VzU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgIHR5cGUxLCB0eXBlMiwgY2xpZW50TGlicmFyeSk7CiAgfQoKICBEYXJ0VHlwZSBnZXROdWxsYWJpbGl0eUF3YXJlU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICBEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgLy8gVVAoVCwgVCkgPSBUCiAgICBpZiAoaWRlbnRpY2FsKHR5cGUxLCB0eXBlMikpIHJldHVybiB0eXBlMTsKCiAgICAvLyBGb3IgYW55IHR5cGUgVCwgU1VCKD8sIFQpID0gU1VCKFQsID8pID0gVC4KICAgIGlmICh0eXBlMSBpcyBVbmtub3duVHlwZSkgcmV0dXJuIHR5cGUyOwogICAgaWYgKHR5cGUyIGlzIFVua25vd25UeXBlKSByZXR1cm4gdHlwZTE7CgogICAgLy8gVVAoVDEsIFQyKSB3aGVyZSBUT1AoVDEpIGFuZCBUT1AoVDIpID0KICAgIC8vICAgVDEgaWYgTU9SRVRPUChUMSwgVDIpCiAgICAvLyAgIFQyIG90aGVyd2lzZQogICAgLy8gVVAoVDEsIFQyKSA9IFQxIGlmIFRPUChUMSkKICAgIC8vIFVQKFQxLCBUMikgPSBUMiBpZiBUT1AoVDIpCiAgICBpZiAoY29yZVR5cGVzLmlzVG9wKHR5cGUxKSkgewogICAgICBpZiAoY29yZVR5cGVzLmlzVG9wKHR5cGUyKSkgcmV0dXJuIG1vcmV0b3AodHlwZTEsIHR5cGUyKSA/IHR5cGUxIDogdHlwZTI7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0gZWxzZSBpZiAoY29yZVR5cGVzLmlzVG9wKHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CgogICAgLy8gVVAoVDEsIFQyKSB3aGVyZSBCT1RUT00oVDEpIGFuZCBCT1RUT00oVDIpID0KICAgIC8vICAgVDIgaWYgTU9SRUJPVFRPTShUMSwgVDIpCiAgICAvLyAgIFQxIG90aGVyd2lzZQogICAgLy8gVVAoVDEsIFQyKSA9IFQyIGlmIEJPVFRPTShUMSkKICAgIC8vIFVQKFQxLCBUMikgPSBUMSBpZiBCT1RUT00oVDIpCiAgICBpZiAoY29yZVR5cGVzLmlzQm90dG9tKHR5cGUxKSkgewogICAgICBpZiAoY29yZVR5cGVzLmlzQm90dG9tKHR5cGUyKSkgewogICAgICAgIHJldHVybiBtb3JlYm90dG9tKHR5cGUxLCB0eXBlMikgPyB0eXBlMiA6IHR5cGUxOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0gZWxzZSBpZiAoY29yZVR5cGVzLmlzQm90dG9tKHR5cGUyKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CgogICAgLy8gVVAoVDEsIFQyKSB3aGVyZSBOVUxMKFQxKSBhbmQgTlVMTChUMikgPQogICAgLy8gICBUMiBpZiBNT1JFQk9UVE9NKFQxLCBUMikKICAgIC8vICAgVDEgb3RoZXJ3aXNlCiAgICAvLyBVUChUMSwgVDIpIHdoZXJlIE5VTEwoVDEpID0KICAgIC8vICAgVDIgaWYgVDIgaXMgbnVsbGFibGUKICAgIC8vICAgVDI/IG90aGVyd2lzZQogICAgLy8gVVAoVDEsIFQyKSB3aGVyZSBOVUxMKFQyKSA9CiAgICAvLyAgIFQxIGlmIFQxIGlzIG51bGxhYmxlCiAgICAvLyAgIFQxPyBvdGhlcndpc2UKICAgIGlmIChjb3JlVHlwZXMuaXNOdWxsKHR5cGUxKSkgewogICAgICBpZiAoY29yZVR5cGVzLmlzTnVsbCh0eXBlMikpIHsKICAgICAgICByZXR1cm4gbW9yZWJvdHRvbSh0eXBlMSwgdHlwZTIpID8gdHlwZTIgOiB0eXBlMTsKICAgICAgfQogICAgICByZXR1cm4gdHlwZTIud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm51bGxhYmxlKTsKICAgIH0gZWxzZSBpZiAoY29yZVR5cGVzLmlzTnVsbCh0eXBlMikpIHsKICAgICAgcmV0dXJuIHR5cGUxLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eS5udWxsYWJsZSk7CiAgICB9CgogICAgLy8gVVAoVDEsIFQyKSB3aGVyZSBPQkpFQ1QoVDEpIGFuZCBPQkpFQ1QoVDIpID0KICAgIC8vICAgVDEgaWYgTU9SRVRPUChUMSwgVDIpCiAgICAvLyAgIFQyIG90aGVyd2lzZQogICAgLy8gVVAoVDEsIFQyKSB3aGVyZSBPQkpFQ1QoVDEpID0KICAgIC8vICAgVDEgaWYgVDIgaXMgbm9uLW51bGxhYmxlCiAgICAvLyAgIFQxPyBvdGhlcndpc2UKICAgIC8vIFVQKFQxLCBUMikgd2hlcmUgT0JKRUNUKFQyKSA9CiAgICAvLyAgIFQyIGlmIFQxIGlzIG5vbi1udWxsYWJsZQogICAgLy8gICBUMj8gb3RoZXJ3aXNlCiAgICBpZiAoY29yZVR5cGVzLmlzT2JqZWN0KHR5cGUxKSkgewogICAgICBpZiAoY29yZVR5cGVzLmlzT2JqZWN0KHR5cGUyKSkgewogICAgICAgIHJldHVybiBtb3JldG9wKHR5cGUxLCB0eXBlMikgPyB0eXBlMSA6IHR5cGUyOwogICAgICB9CiAgICAgIGlmIChjb21wdXRlTnVsbGFiaWxpdHkodHlwZTIsIGNvcmVUeXBlcy5mdXR1cmVPckNsYXNzKSA9PQogICAgICAgICAgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKICAgICAgICByZXR1cm4gdHlwZTE7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGUxLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eS5udWxsYWJsZSk7CiAgICB9IGVsc2UgaWYgKGNvcmVUeXBlcy5pc09iamVjdCh0eXBlMikpIHsKICAgICAgaWYgKGNvbXB1dGVOdWxsYWJpbGl0eSh0eXBlMSwgY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3MpID09CiAgICAgICAgICBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgewogICAgICAgIHJldHVybiB0eXBlMjsKICAgICAgfQogICAgICByZXR1cm4gdHlwZTIud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm51bGxhYmxlKTsKICAgIH0KCiAgICAvLyBUaGUgZWZmZWN0IG9mIHRoZSBmb2xsb3dpbmcgcnVsZXMgaXMgYWNjb3VudGVkIGZvciBpbiB0aGUgY29kZSBiZWxvdyB2aWEKICAgIC8vIHRoZSBpbnZvY2F0aW9ucyBvZiB1bml0ZU51bGxhYmlsaXRpZXMuCiAgICAvLyBVUChUMSosIFQyKikgPSBTKiB3aGVyZSBTIGlzIFVQKFQxLCBUMikKICAgIC8vIFVQKFQxKiwgVDI/KSA9IFM/IHdoZXJlIFMgaXMgVVAoVDEsIFQyKQogICAgLy8gVVAoVDE/LCBUMiopID0gUz8gd2hlcmUgUyBpcyBVUChUMSwgVDIpCiAgICAvLyBVUChUMSosIFQyKSA9IFMqIHdoZXJlIFMgaXMgVVAoVDEsIFQyKQogICAgLy8gVVAoVDEsIFQyKikgPSBTKiB3aGVyZSBTIGlzIFVQKFQxLCBUMikKICAgIC8vIFVQKFQxPywgVDI/KSA9IFM/IHdoZXJlIFMgaXMgVVAoVDEsIFQyKQogICAgLy8gVVAoVDE/LCBUMikgPSBTPyB3aGVyZSBTIGlzIFVQKFQxLCBUMikKICAgIC8vIFVQKFQxLCBUMj8pID0gUz8gd2hlcmUgUyBpcyBVUChUMSwgVDIpCgogICAgaWYgKHR5cGUxIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIHJldHVybiBfZ2V0TnVsbGFiaWxpdHlBd2FyZVR5cGVQYXJhbWV0ZXJTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICB0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogICAgfQoKICAgIGlmICh0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICByZXR1cm4gX2dldE51bGxhYmlsaXR5QXdhcmVUeXBlUGFyYW1ldGVyU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgICAgdHlwZTIsIHR5cGUxLCBjbGllbnRMaWJyYXJ5KTsKICAgIH0KCiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlKSB7CiAgICAgIGlmICh0eXBlMiBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gX2dldE51bGxhYmlsaXR5QXdhcmVGdW5jdGlvblN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgICAgdHlwZTEsIHR5cGUyLCBjbGllbnRMaWJyYXJ5KTsKICAgICAgfQoKICAgICAgaWYgKHR5cGUyIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIHR5cGUyLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzcykgewogICAgICAgIC8vIFVQKFQgRnVuY3Rpb248Li4uPiguLi4pLCBGdW5jdGlvbikgPSBGdW5jdGlvbgogICAgICAgIHJldHVybiBjb3JlVHlwZXMuZnVuY3Rpb25SYXdUeXBlKAogICAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICAgIH0KCiAgICAgIC8vIFVQKFQgRnVuY3Rpb248Li4uPiguLi4pLCBUMikgPSBPYmplY3QKICAgICAgcmV0dXJuIGNvcmVUeXBlcy5vYmplY3RSYXdUeXBlKAogICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSkpOwogICAgfSBlbHNlIGlmICh0eXBlMiBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKHR5cGUxIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIHR5cGUxLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzcykgewogICAgICAgIC8vIFVQKEZ1bmN0aW9uLCBUIEZ1bmN0aW9uPC4uLj4oLi4uKSkgPSBGdW5jdGlvbgogICAgICAgIHJldHVybiBjb3JlVHlwZXMuZnVuY3Rpb25SYXdUeXBlKAogICAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICAgIH0KCiAgICAgIC8vIFVQKFQxLCBUIEZ1bmN0aW9uPC4uLj4oLi4uKSkgPSBPYmplY3QKICAgICAgcmV0dXJuIGNvcmVUeXBlcy5vYmplY3RSYXdUeXBlKAogICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSkpOwogICAgfQoKICAgIC8vIFVQKFQxLCBUMikgPSBUMiBpZiBUMSA8OiBUMgogICAgLy8gICBOb3RlIHRoYXQgYm90aCB0eXBlcyBtdXN0IGJlIGNsYXNzIHR5cGVzIGF0IHRoaXMgcG9pbnQuCiAgICBhc3NlcnQodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSwKICAgICAgICAiRXhwZWN0ZWQgdHlwZTEgdG8gYmUgYW4gaW50ZXJmYWNlIHR5cGUsIGdvdCAnJHt0eXBlMS5ydW50aW1lVHlwZX0nLiIpOwogICAgYXNzZXJ0KHR5cGUyIGlzIEludGVyZmFjZVR5cGUsCiAgICAgICAgIkV4cGVjdGVkIHR5cGUyIHRvIGJlIGFuIGludGVyZmFjZSB0eXBlLCBnb3QgJyR7dHlwZTIucnVudGltZVR5cGV9Jy4iKTsKICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMSwgdHlwZTIsIFN1YnR5cGVDaGVja01vZGUud2l0aE51bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJldHVybiB0eXBlMi53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICB9CgogICAgLy8gVVAoVDEsIFQyKSA9IFQxIGlmIFQyIDw6IFQxCiAgICAvLyAgIE5vdGUgdGhhdCBib3RoIHR5cGVzIG11c3QgYmUgY2xhc3MgdHlwZXMgYXQgdGhpcyBwb2ludC4KICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMiwgdHlwZTEsIFN1YnR5cGVDaGVja01vZGUud2l0aE51bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJldHVybiB0eXBlMS53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICB9CgogICAgLy8gVVAoQzxUMCwgLi4uLCBUbj4sIEM8UzAsIC4uLiwgU24+KSA9IEM8UjAsLi4uLCBSbj4gd2hlcmUgUmkgaXMgVVAoVGksIFNpKQogICAgaWYgKHR5cGUxIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZTIgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBDbGFzcyBrbGFzcyA9IHR5cGUxLmNsYXNzTm9kZTsKICAgICAgaWYgKHR5cGUyLmNsYXNzTm9kZSA9PSBrbGFzcykgewogICAgICAgIGludCBuID0ga2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgICAgIExpc3Q8RGFydFR5cGU+IGxlZnRBcmd1bWVudHMgPSB0eXBlMS50eXBlQXJndW1lbnRzOwogICAgICAgIExpc3Q8RGFydFR5cGU+IHJpZ2h0QXJndW1lbnRzID0gdHlwZTIudHlwZUFyZ3VtZW50czsKICAgICAgICBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0gbmV3IExpc3Q8RGFydFR5cGU+KG4pOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpbnQgdmFyaWFuY2UgPSBrbGFzcy50eXBlUGFyYW1ldGVyc1tpXS52YXJpYW5jZTsKICAgICAgICAgIGlmICh2YXJpYW5jZSA9PSBWYXJpYW5jZS5jb250cmF2YXJpYW50KSB7CiAgICAgICAgICAgIHR5cGVBcmd1bWVudHNbaV0gPSBnZXROdWxsYWJpbGl0eUF3YXJlU3RhbmRhcmRMb3dlckJvdW5kKAogICAgICAgICAgICAgICAgbGVmdEFyZ3VtZW50c1tpXSwgcmlnaHRBcmd1bWVudHNbaV0sIGNsaWVudExpYnJhcnkpOwogICAgICAgICAgfSBlbHNlIGlmICh2YXJpYW5jZSA9PSBWYXJpYW5jZS5pbnZhcmlhbnQpIHsKICAgICAgICAgICAgaWYgKCFhcmVNdXR1YWxTdWJ0eXBlcyhsZWZ0QXJndW1lbnRzW2ldLCByaWdodEFyZ3VtZW50c1tpXSwKICAgICAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUud2l0aE51bGxhYmlsaXRpZXMpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0eXBlQXJndW1lbnRzW2ldID0gZ2V0TnVsbGFiaWxpdHlBd2FyZVN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgICAgICAgIGxlZnRBcmd1bWVudHNbaV0sIHJpZ2h0QXJndW1lbnRzW2ldLCBjbGllbnRMaWJyYXJ5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKAogICAgICAgICAgICBrbGFzcywKICAgICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSksCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMpOwogICAgICB9CiAgICB9CgogICAgLy8gVVAoQzA8VDAsIC4uLiwgVG4+LCBDMTxTMCwgLi4uLCBTaz4pCiAgICAvLyAgID0gbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIGludGVyZmFjZXMgYXMgaW4gRGFydCAxLgogICAgcmV0dXJuIGdldExlZ2FjeUxlYXN0VXBwZXJCb3VuZCh0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBudWxsYWJpbGl0eS1hd2FyZSBsb3dlciBib3VuZCBvZiB0d28gZnVuY3Rpb24gdHlwZXMuCiAgLy8vCiAgLy8vIFRoZSBhbGdvcml0aG0gaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgogIC8vLyBET1dOKAogIC8vLyAgIDxYMCBleHRlbmRzIEIwMCwgLi4uLCBYbSBleHRlbmRzIEIwbT4oUDAwLCAuLi4sIFAwaykgLT4gVDAsCiAgLy8vICAgPFgwIGV4dGVuZHMgQjEwLCAuLi4sIFhtIGV4dGVuZHMgQjFtPihQMTAsIC4uLiwgUDFsKSAtPiBUMSkKICAvLy8gPQogIC8vLyAgIDxYMCBleHRlbmRzIEIyMCwgLi4uLCBYbSBleHRlbmRzIEIybT4oUDIwLCAuLi4sIFAycSkgLT4gUjAKICAvLy8gaWY6CiAgLy8vICAgZWFjaCBCMGkgYW5kIEIxaSBhcmUgZXF1YWwgdHlwZXMgKHN5bnRhY3RpY2FsbHkpLAogIC8vLyAgIHEgaXMgbWF4KGssIGwpLAogIC8vLyAgIFIwIGlzIERPV04oVDAsIFQxKSwKICAvLy8gICBCMmkgaXMgQjBpLAogIC8vLyAgIFAyaSBpcyBVUChQMGksIFAxaSkgZm9yIGkgPD0gdGhhbiBtaW4oaywgbCksCiAgLy8vICAgUDJpIGlzIFAwaSBmb3IgayA8IGkgPD0gcSwKICAvLy8gICBQMmkgaXMgUDFpIGZvciBsIDwgaSA8PSBxLCBhbmQKICAvLy8gICBQMmkgaXMgb3B0aW9uYWwgaWYgUDBpIG9yIFAxaSBpcyBvcHRpb25hbC4KICAvLy8KICAvLy8gRE9XTigKICAvLy8gICA8WDAgZXh0ZW5kcyBCMDAsIC4uLiwgWG0gZXh0ZW5kcyBCMG0+KFAwMCwgLi4uLCBQMGssIE5hbWVkMCkgLT4gVDAsCiAgLy8vICAgPFgwIGV4dGVuZHMgQjEwLCAuLi4sIFhtIGV4dGVuZHMgQjFtPihQMTAsIC4uLiwgUDFrLCBOYW1lZDEpIC0+IFQxKQogIC8vLyA9CiAgLy8vICAgPFgwIGV4dGVuZHMgQjIwLCAuLi4sIFhtIGV4dGVuZHMgQjJtPihQMjAsIC4uLiwgUDJrLCBOYW1lZDIpIC0+IFIwCiAgLy8vIGlmOgogIC8vLyAgIGVhY2ggQjBpIGFuZCBCMWkgYXJlIGVxdWFsIHR5cGVzIChzeW50YWN0aWNhbGx5KSwKICAvLy8gICBSMCBpcyBET1dOKFQwLCBUMSksCiAgLy8vICAgQjJpIGlzIEIwaSwKICAvLy8gICBQMmkgaXMgVVAoUDBpLCBQMWkpLAogIC8vLyAgIE5hbWVkMiBjb250YWlucyBSMmkgeGkgZm9yIGVhY2ggeGkgaW4gYm90aCBOYW1lZDAgYW5kIE5hbWVkMSwKICAvLy8gICAgIHdoZXJlIFIwaSB4aSBpcyBpbiBOYW1lZDAsCiAgLy8vICAgICB3aGVyZSBSMWkgeGkgaXMgaW4gTmFtZWQxLAogIC8vLyAgICAgYW5kIFIyaSBpcyBVUChSMGksIFIxaSksCiAgLy8vICAgICBhbmQgUjJpIHhpIGlzIHJlcXVpcmVkIGlmIHhpIGlzIHJlcXVpcmVkIGluIGJvdGggTmFtZWQwIGFuZCBOYW1lZDEsCiAgLy8vICAgTmFtZWQyIGNvbnRhaW5zIFIwaSB4aSBmb3IgZWFjaCB4aSBpbiBOYW1lZDAgYW5kIG5vdCBOYW1lZDEsCiAgLy8vICAgICB3aGVyZSB4aSBpcyBvcHRpb25hbCBpbiBOYW1lZDIsCiAgLy8vICAgTmFtZWQyIGNvbnRhaW5zIFIxaSB4aSBmb3IgZWFjaCB4aSBpbiBOYW1lZDEgYW5kIG5vdCBOYW1lZDAsIGFuZAogIC8vLyAgICAgd2hlcmUgeGkgaXMgb3B0aW9uYWwgaW4gTmFtZWQyLgogIC8vLyBET1dOKFQgRnVuY3Rpb248Li4uPiguLi4pLCBTIEZ1bmN0aW9uPC4uLj4oLi4uKSkgPSBOZXZlciBvdGhlcndpc2UuCiAgRGFydFR5cGUgX2dldE51bGxhYmlsaXR5QXdhcmVGdW5jdGlvblN0YW5kYXJkTG93ZXJCb3VuZCgKICAgICAgRnVuY3Rpb25UeXBlIGYsIEZ1bmN0aW9uVHlwZSBnLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIGJvb2wgaGF2ZU5hbWVkID0KICAgICAgICBmLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5IHx8IGcubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHk7CiAgICBib29sIGhhdmVPcHRpb25hbFBvc2l0aW9uYWwgPQogICAgICAgIGYucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICAgIGcucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwoKICAgIC8vIFRoZSBmYWxsYmFjayByZXN1bHQgZm9yIHdoZW5ldmVyIHRoZSBmb2xsb3dpbmcgcnVsZSBhcHBsaWVzOgogICAgLy8gICAgIERPV04oVCBGdW5jdGlvbjwuLi4+KC4uLiksIFMgRnVuY3Rpb248Li4uPiguLi4pKSA9IE5ldmVyIG90aGVyd2lzZS4KICAgIGZpbmFsIERhcnRUeXBlIGZhbGxiYWNrUmVzdWx0ID0KICAgICAgICBuZXcgTmV2ZXJUeXBlKGludGVyc2VjdE51bGxhYmlsaXRpZXMoZi5udWxsYWJpbGl0eSwgZy5udWxsYWJpbGl0eSkpOwoKICAgIGlmIChoYXZlTmFtZWQgJiYgaGF2ZU9wdGlvbmFsUG9zaXRpb25hbCkgcmV0dXJuIGZhbGxiYWNrUmVzdWx0OwogICAgaWYgKGhhdmVOYW1lZCAmJgogICAgICAgIGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICE9IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxsYmFja1Jlc3VsdDsKICAgIH0KCiAgICBpbnQgbSA9IGYudHlwZVBhcmFtZXRlcnMubGVuZ3RoOwogICAgYm9vbCBib3VuZHNNYXRjaCA9IGZhbHNlOwogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5lbXB0eTsKICAgIGlmIChnLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA9PSBtKSB7CiAgICAgIGJvdW5kc01hdGNoID0gdHJ1ZTsKICAgICAgaWYgKG0gIT0gMCkgewogICAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwID0KICAgICAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgICBzdWJzdGl0dXRpb25NYXBbZy50eXBlUGFyYW1ldGVyc1tpXV0gPQogICAgICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS5mb3JBbHBoYVJlbmFtaW5nKAogICAgICAgICAgICAgICAgICBnLnR5cGVQYXJhbWV0ZXJzW2ldLCBmLnR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgICB9CiAgICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21NYXAoc3Vic3RpdHV0aW9uTWFwKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG0gJiYgYm91bmRzTWF0Y2g7ICsraSkgewogICAgICAgICAgLy8gVE9ETyhkbWl0cnlhcyk6IEZpZ3VyZSBvdXQgaWYgYSBwcm9jZWR1cmUgZm9yIHN5bnRhY3RpYyBlcXVhbGl0eQogICAgICAgICAgLy8gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KICAgICAgICAgIGlmICghYXJlTXV0dWFsU3VidHlwZXMoCiAgICAgICAgICAgICAgZi50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCwKICAgICAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZy50eXBlUGFyYW1ldGVyc1tpXS5ib3VuZCksCiAgICAgICAgICAgICAgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykpIHsKICAgICAgICAgICAgYm91bmRzTWF0Y2ggPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghYm91bmRzTWF0Y2gpIHJldHVybiBmYWxsYmFja1Jlc3VsdDsKICAgIGludCBtYXhQb3MgPQogICAgICAgIG1hdGgubWF4KGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoLCBnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBpbnQgbWluUG9zID0KICAgICAgICBtYXRoLm1pbihmLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCwgZy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwoKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBmLnR5cGVQYXJhbWV0ZXJzOwoKICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICBuZXcgTGlzdDxEYXJ0VHlwZT4uZmlsbGVkKG1heFBvcywgbnVsbCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pblBvczsgKytpKSB7CiAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0gZ2V0TnVsbGFiaWxpdHlBd2FyZVN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgICAgIGYucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0sCiAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZy5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSksCiAgICAgICAgICBjbGllbnRMaWJyYXJ5KTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBtaW5Qb3M7IGkgPCBmLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0gZi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBtaW5Qb3M7IGkgPCBnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0KICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShnLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldKTsKICAgIH0KCiAgICBMaXN0PE5hbWVkVHlwZT4gbmFtZWRQYXJhbWV0ZXJzID0gPE5hbWVkVHlwZT5bXTsKICAgIHsKICAgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGUgbmFtZWQgcGFyYW1ldGVycyBvZiBib3RoIHR5cGVzIGFyZSBzb3J0ZWQKICAgICAgLy8gbGV4aWNvZ3JhcGhpY2FsbHkuCiAgICAgIGludCBpID0gMDsKICAgICAgaW50IGogPSAwOwogICAgICB3aGlsZSAoaSA8IGYubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCAmJiBqIDwgZy5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgTmFtZWRUeXBlIG5hbWVkMSA9IGYubmFtZWRQYXJhbWV0ZXJzW2ldOwogICAgICAgIE5hbWVkVHlwZSBuYW1lZDIgPSBnLm5hbWVkUGFyYW1ldGVyc1tqXTsKICAgICAgICBpbnQgb3JkZXIgPSBuYW1lZDEubmFtZS5jb21wYXJlVG8obmFtZWQyLm5hbWUpOwogICAgICAgIE5hbWVkVHlwZSBuYW1lZDsKICAgICAgICBpZiAob3JkZXIgPCAwKSB7CiAgICAgICAgICBuYW1lZCA9IG5ldyBOYW1lZFR5cGUobmFtZWQxLm5hbWUsIG5hbWVkMS50eXBlLCBpc1JlcXVpcmVkOiBmYWxzZSk7CiAgICAgICAgICArK2k7CiAgICAgICAgfSBlbHNlIGlmIChvcmRlciA+IDApIHsKICAgICAgICAgIG5hbWVkID0gIW5hbWVkMi5pc1JlcXVpcmVkCiAgICAgICAgICAgICAgPyBuYW1lZDIKICAgICAgICAgICAgICA6IG5ldyBOYW1lZFR5cGUoCiAgICAgICAgICAgICAgICAgIG5hbWVkMi5uYW1lLCBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUobmFtZWQyLnR5cGUpLAogICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkOiBmYWxzZSk7CiAgICAgICAgICArK2o7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5hbWVkID0gbmV3IE5hbWVkVHlwZSgKICAgICAgICAgICAgICBuYW1lZDEubmFtZSwKICAgICAgICAgICAgICBnZXROdWxsYWJpbGl0eUF3YXJlU3RhbmRhcmRVcHBlckJvdW5kKG5hbWVkMS50eXBlLAogICAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUobmFtZWQyLnR5cGUpLCBjbGllbnRMaWJyYXJ5KSwKICAgICAgICAgICAgICBpc1JlcXVpcmVkOiBuYW1lZDEuaXNSZXF1aXJlZCAmJiBuYW1lZDIuaXNSZXF1aXJlZCk7CiAgICAgICAgICArK2k7CiAgICAgICAgICArK2o7CiAgICAgICAgfQogICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQobmFtZWQpOwogICAgICB9CiAgICAgIHdoaWxlIChpIDwgZi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgTmFtZWRUeXBlIG5hbWVkMSA9IGYubmFtZWRQYXJhbWV0ZXJzW2ldOwogICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQoIW5hbWVkMS5pc1JlcXVpcmVkCiAgICAgICAgICAgID8gbmFtZWQxCiAgICAgICAgICAgIDogbmV3IE5hbWVkVHlwZShuYW1lZDEubmFtZSwgbmFtZWQxLnR5cGUsIGlzUmVxdWlyZWQ6IGZhbHNlKSk7CiAgICAgICAgKytpOwogICAgICB9CiAgICAgIHdoaWxlIChqIDwgZy5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgTmFtZWRUeXBlIG5hbWVkMiA9IGcubmFtZWRQYXJhbWV0ZXJzW2pdOwogICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQobmV3IE5hbWVkVHlwZSgKICAgICAgICAgICAgbmFtZWQyLm5hbWUsIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShuYW1lZDIudHlwZSksCiAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGZhbHNlKSk7CiAgICAgICAgKytqOwogICAgICB9CiAgICB9CgogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IGdldE51bGxhYmlsaXR5QXdhcmVTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgICAgZi5yZXR1cm5UeXBlLCBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZy5yZXR1cm5UeXBlKSwgY2xpZW50TGlicmFyeSk7CgogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocG9zaXRpb25hbFBhcmFtZXRlcnMsIHJldHVyblR5cGUsCiAgICAgICAgaW50ZXJzZWN0TnVsbGFiaWxpdGllcyhmLm51bGxhYmlsaXR5LCBnLm51bGxhYmlsaXR5KSwKICAgICAgICBuYW1lZFBhcmFtZXRlcnM6IG5hbWVkUGFyYW1ldGVycywKICAgICAgICB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogbWluUG9zKTsKICB9CgogIC8vLyBDb21wdXRlcyB0aGUgbnVsbGFiaWxpdHktYXdhcmUgbG93ZXIgYm91bmQgb2YgdHdvIGZ1bmN0aW9uIHR5cGVzLgogIC8vLwogIC8vLyBVUCgKICAvLy8gICA8WDAgZXh0ZW5kcyBCMDAsIC4uLiBYbSBleHRlbmRzIEIwbT4oUDAwLCAuLi4gUDBrKSAtPiBUMCwKICAvLy8gICA8WDAgZXh0ZW5kcyBCMTAsIC4uLiBYbSBleHRlbmRzIEIxbT4oUDEwLCAuLi4gUDFsKSAtPiBUMSkKICAvLy8gPQogIC8vLyAgIDxYMCBleHRlbmRzIEIyMCwgLi4uLCBYbSBleHRlbmRzIEIybT4oUDIwLCAuLi4sIFAycSkgLT4gUjAKICAvLy8gaWY6CiAgLy8vICAgZWFjaCBCMGkgYW5kIEIxaSBhcmUgZXF1YWwgdHlwZXMgKHN5bnRhY3RpY2FsbHkpCiAgLy8vICAgQm90aCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKICAvLy8gICBxIGlzIG1pbihrLCBsKQogIC8vLyAgIFIwIGlzIFVQKFQwLCBUMSkKICAvLy8gICBCMmkgaXMgQjBpCiAgLy8vICAgUDJpIGlzIERPV04oUDBpLCBQMWkpCiAgLy8vIFVQKAogIC8vLyAgIDxYMCBleHRlbmRzIEIwMCwgLi4uIFhtIGV4dGVuZHMgQjBtPihQMDAsIC4uLiBQMGssIE5hbWVkMCkgLT4gVDAsCiAgLy8vICAgPFgwIGV4dGVuZHMgQjEwLCAuLi4gWG0gZXh0ZW5kcyBCMW0+KFAxMCwgLi4uIFAxaywgTmFtZWQxKSAtPiBUMSkKICAvLy8gPQogIC8vLyAgIDxYMCBleHRlbmRzIEIyMCwgLi4uLCBYbSBleHRlbmRzIEIybT4oUDIwLCAuLi4sIFAyaywgTmFtZWQyKSAtPiBSMAogIC8vLyBpZjoKICAvLy8gICBlYWNoIEIwaSBhbmQgQjFpIGFyZSBlcXVhbCB0eXBlcyAoc3ludGFjdGljYWxseSkKICAvLy8gICBBbGwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZAogIC8vLyAgIFIwIGlzIFVQKFQwLCBUMSkKICAvLy8gICBCMmkgaXMgQjBpCiAgLy8vICAgUDJpIGlzIERPV04oUDBpLCBQMWkpCiAgLy8vICAgTmFtZWQwIGNvbnRhaW5zIFIwaSB4aQogIC8vLyAgICAgICBpZiBSMWkgeGkgaXMgYSByZXF1aXJlZCBuYW1lZCBwYXJhbWV0ZXIgaW4gTmFtZWQxCiAgLy8vICAgTmFtZWQxIGNvbnRhaW5zIFIxaSB4aQogIC8vLyAgICAgICBpZiBSMGkgeGkgaXMgYSByZXF1aXJlZCBuYW1lZCBwYXJhbWV0ZXIgaW4gTmFtZWQwCiAgLy8vICAgTmFtZWQyIGNvbnRhaW5zIGV4YWN0bHkgUjJpIHhpCiAgLy8vICAgICAgIGZvciBlYWNoIHhpIGluIGJvdGggTmFtZWQwIGFuZCBOYW1lZDEKICAvLy8gICAgIHdoZXJlIFIwaSB4aSBpcyBpbiBOYW1lZDAKICAvLy8gICAgIHdoZXJlIFIxaSB4aSBpcyBpbiBOYW1lZDEKICAvLy8gICAgIGFuZCBSMmkgaXMgRE9XTihSMGksIFIxaSkKICAvLy8gICAgIGFuZCBSMmkgeGkgaXMgcmVxdWlyZWQKICAvLy8gICAgICAgICBpZiB4aSBpcyByZXF1aXJlZCBpbiBlaXRoZXIgTmFtZWQwIG9yIE5hbWVkMQogIC8vLyBVUChUIEZ1bmN0aW9uPC4uLj4oLi4uKSwgUyBGdW5jdGlvbjwuLi4+KC4uLikpID0gRnVuY3Rpb24gb3RoZXJ3aXNlCiAgRGFydFR5cGUgX2dldE51bGxhYmlsaXR5QXdhcmVGdW5jdGlvblN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgRnVuY3Rpb25UeXBlIGYsIEZ1bmN0aW9uVHlwZSBnLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIGJvb2wgaGF2ZU5hbWVkID0KICAgICAgICBmLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5IHx8IGcubmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHk7CiAgICBib29sIGhhdmVPcHRpb25hbFBvc2l0aW9uYWwgPQogICAgICAgIGYucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoIHx8CiAgICAgICAgICAgIGcucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA8IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwoKICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgZm9yIHdoZW5ldmVyIHRoZSBmb2xsb3dpbmcgYXBwbGllczoKICAgIC8vICAgICBVUChUIEZ1bmN0aW9uPC4uLj4oLi4uKSwgUyBGdW5jdGlvbjwuLi4+KC4uLikpID0gRnVuY3Rpb24gb3RoZXJ3aXNlCiAgICBmaW5hbCBEYXJ0VHlwZSBmYWxsYmFja1Jlc3VsdCA9IGNvcmVUeXBlcwogICAgICAgIC5mdW5jdGlvblJhd1R5cGUodW5pdGVOdWxsYWJpbGl0aWVzKGYubnVsbGFiaWxpdHksIGcubnVsbGFiaWxpdHkpKTsKCiAgICBpZiAoaGF2ZU5hbWVkICYmIGhhdmVPcHRpb25hbFBvc2l0aW9uYWwpIHJldHVybiBmYWxsYmFja1Jlc3VsdDsKICAgIGlmICghaGF2ZU5hbWVkICYmIGYucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCAhPSBnLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhbGxiYWNrUmVzdWx0OwogICAgfQogICAgLy8gSGVyZSB3ZSBwZXJmb3JtIGEgcXVpY2sgY2hlY2sgb24gdGhlIGZ1bmN0aW9uIHR5cGVzIHRvIGZpZ3VyZSBvdXQgaWYgd2UKICAgIC8vIGNhbiBjb21wdXRlIGEgbm9uLXRyaXZpYWwgdXBwZXIgYm91bmQgZm9yIHRoZW0uICBUaGUgY2hlY2sgaXNuJ3QgbWVyZ2VkCiAgICAvLyB3aXRoIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgbm9uLXRyaXZpYWwgdXBwZXIgYm91bmQgaXRzZWxmIHRvIGF2b2lkCiAgICAvLyBwZXJmb3JtaW5nIHVubmVjZXNzYXJ5IGNvbXB1dGF0aW9ucy4KICAgIGlmIChoYXZlTmFtZWQpIHsKICAgICAgaWYgKGYucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICE9IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrUmVzdWx0OwogICAgICB9CiAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIG5hbWVkIHBhcmFtZXRlcnMgYXJlIHNvcnRlZCBsZXhpY29ncmFwaGljYWxseSBpbgogICAgICAvLyBib3RoIHR5cGUxIGFuZCB0eXBlMi4KICAgICAgaW50IGkgPSAwOwogICAgICBpbnQgaiA9IDA7CiAgICAgIHdoaWxlIChpIDwgZi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoICYmIGogPCBnLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICBOYW1lZFR5cGUgbmFtZWQxID0gZi5uYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgICAgTmFtZWRUeXBlIG5hbWVkMiA9IGcubmFtZWRQYXJhbWV0ZXJzW2pdOwogICAgICAgIGludCBvcmRlciA9IG5hbWVkMS5uYW1lLmNvbXBhcmVUbyhuYW1lZDIubmFtZSk7CiAgICAgICAgaWYgKG9yZGVyIDwgMCkgewogICAgICAgICAgaWYgKG5hbWVkMS5pc1JlcXVpcmVkKSByZXR1cm4gZmFsbGJhY2tSZXN1bHQ7CiAgICAgICAgICArK2k7CiAgICAgICAgfSBlbHNlIGlmIChvcmRlciA+IDApIHsKICAgICAgICAgIGlmIChuYW1lZDIuaXNSZXF1aXJlZCkgcmV0dXJuIGZhbGxiYWNrUmVzdWx0OwogICAgICAgICAgKytqOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICArK2k7CiAgICAgICAgICArK2o7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChpIDwgZi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgaWYgKGYubmFtZWRQYXJhbWV0ZXJzW2ldLmlzUmVxdWlyZWQpIHJldHVybiBmYWxsYmFja1Jlc3VsdDsKICAgICAgICArK2k7CiAgICAgIH0KICAgICAgd2hpbGUgKGogPCBnLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICBpZiAoZy5uYW1lZFBhcmFtZXRlcnNbal0uaXNSZXF1aXJlZCkgcmV0dXJuIGZhbGxiYWNrUmVzdWx0OwogICAgICAgICsrajsKICAgICAgfQogICAgfQoKICAgIGludCBtID0gZi50eXBlUGFyYW1ldGVycy5sZW5ndGg7CiAgICBib29sIGJvdW5kc01hdGNoID0gZmFsc2U7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmVtcHR5OwogICAgaWYgKGcudHlwZVBhcmFtZXRlcnMubGVuZ3RoID09IG0pIHsKICAgICAgYm91bmRzTWF0Y2ggPSB0cnVlOwogICAgICBpZiAobSAhPSAwKSB7CiAgICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb25NYXAgPQogICAgICAgICAgICA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgICAgIHN1YnN0aXR1dGlvbk1hcFtnLnR5cGVQYXJhbWV0ZXJzW2ldXSA9CiAgICAgICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcoCiAgICAgICAgICAgICAgICAgIGcudHlwZVBhcmFtZXRlcnNbaV0sIGYudHlwZVBhcmFtZXRlcnNbaV0pOwogICAgICAgIH0KICAgICAgICBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbSAmJiBib3VuZHNNYXRjaDsgKytpKSB7CiAgICAgICAgICAvLyBUT0RPKGRtaXRyeWFzKTogRmlndXJlIG91dCBpZiBhIHByb2NlZHVyZSBmb3Igc3ludGFjdGljCiAgICAgICAgICAvLyBlcXVhbGl0eSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgogICAgICAgICAgaWYgKCFhcmVNdXR1YWxTdWJ0eXBlcygKICAgICAgICAgICAgICBmLnR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kLAogICAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShnLnR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kKSwKICAgICAgICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLndpdGhOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgICBib3VuZHNNYXRjaCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFib3VuZHNNYXRjaCkgcmV0dXJuIGZhbGxiYWNrUmVzdWx0OwogICAgaW50IG1pblBvcyA9CiAgICAgICAgbWF0aC5taW4oZi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsIGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKCiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gZi50eXBlUGFyYW1ldGVyczsKCiAgICBMaXN0PERhcnRUeXBlPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+LmZpbGxlZChtaW5Qb3MsIG51bGwpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5Qb3M7ICsraSkgewogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSA9IGdldE51bGxhYmlsaXR5QXdhcmVTdGFuZGFyZExvd2VyQm91bmQoCiAgICAgICAgICBmLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldLAogICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGcucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0pLAogICAgICAgICAgY2xpZW50TGlicmFyeSk7CiAgICB9CgogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVycyA9IDxOYW1lZFR5cGU+W107CiAgICB7CiAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIG5hbWVkIHBhcmFtZXRlcnMgb2YgYm90aCB0eXBlcyBhcmUgc29ydGVkCiAgICAgIC8vIGxleGljb2dyYXBoaWNhbGx5LgogICAgICBpbnQgaSA9IDA7CiAgICAgIGludCBqID0gMDsKICAgICAgd2hpbGUgKGkgPCBmLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggJiYgaiA8IGcubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgIE5hbWVkVHlwZSBuYW1lZDEgPSBmLm5hbWVkUGFyYW1ldGVyc1tpXTsKICAgICAgICBOYW1lZFR5cGUgbmFtZWQyID0gZy5uYW1lZFBhcmFtZXRlcnNbal07CiAgICAgICAgaW50IG9yZGVyID0gbmFtZWQxLm5hbWUuY29tcGFyZVRvKG5hbWVkMi5uYW1lKTsKICAgICAgICBpZiAob3JkZXIgPCAwKSB7CiAgICAgICAgICArK2k7CiAgICAgICAgfSBlbHNlIGlmIChvcmRlciA+IDApIHsKICAgICAgICAgICsrajsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcgTmFtZWRUeXBlKAogICAgICAgICAgICAgIG5hbWVkMS5uYW1lLAogICAgICAgICAgICAgIGdldE51bGxhYmlsaXR5QXdhcmVTdGFuZGFyZExvd2VyQm91bmQobmFtZWQxLnR5cGUsCiAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShuYW1lZDIudHlwZSksIGNsaWVudExpYnJhcnkpLAogICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IG5hbWVkMS5pc1JlcXVpcmVkIHx8IG5hbWVkMi5pc1JlcXVpcmVkKSk7CiAgICAgICAgICArK2k7CiAgICAgICAgICArK2o7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9IGdldE51bGxhYmlsaXR5QXdhcmVTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgZi5yZXR1cm5UeXBlLCBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoZy5yZXR1cm5UeXBlKSwgY2xpZW50TGlicmFyeSk7CgogICAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUocG9zaXRpb25hbFBhcmFtZXRlcnMsIHJldHVyblR5cGUsCiAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKGYubnVsbGFiaWxpdHksIGcubnVsbGFiaWxpdHkpLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBmLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOwogIH0KCiAgRGFydFR5cGUgX2dldE51bGxhYmlsaXR5QXdhcmVUeXBlUGFyYW1ldGVyU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICBUeXBlUGFyYW1ldGVyVHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgaWYgKHR5cGUxLnByb21vdGVkQm91bmQgPT0gbnVsbCkgewogICAgICAvLyBVUChYMSBleHRlbmRzIEIxLCBUMikgPQogICAgICAvLyAgIFQyIGlmIFgxIDw6IFQyCiAgICAgIC8vICAgb3RoZXJ3aXNlIFgxIGlmIFQyIDw6IFgxCiAgICAgIC8vICAgb3RoZXJ3aXNlIFVQKEIxW09iamVjdC9YMV0sIFQyKQogICAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTEsIHR5cGUyLCBTdWJ0eXBlQ2hlY2tNb2RlLndpdGhOdWxsYWJpbGl0aWVzKSkgewogICAgICAgIHJldHVybiB0eXBlMi53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpKTsKICAgICAgfQogICAgICBpZiAoaXNTdWJ0eXBlT2YodHlwZTIsIHR5cGUxLCBTdWJ0eXBlQ2hlY2tNb2RlLndpdGhOdWxsYWJpbGl0aWVzKSkgewogICAgICAgIHJldHVybiB0eXBlMS53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpKTsKICAgICAgfQogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57CiAgICAgICAgdHlwZTEucGFyYW1ldGVyOiBjb3JlVHlwZXMub2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlCiAgICAgIH07CiAgICAgIHJldHVybiBnZXROdWxsYWJpbGl0eUF3YXJlU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgICAgICAgIHN1YnN0aXR1dGUodHlwZTEucGFyYW1ldGVyLmJvdW5kLCBzdWJzdGl0dXRpb24pLAogICAgICAgICAgICAgIHR5cGUyLAogICAgICAgICAgICAgIGNsaWVudExpYnJhcnkpCiAgICAgICAgICAud2l0aE51bGxhYmlsaXR5KAogICAgICAgICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFVQKFgxICYgQjEsIFQyKSA9CiAgICAgIC8vICAgVDIgaWYgWDEgPDogVDIKICAgICAgLy8gICBvdGhlcndpc2UgWDEgaWYgVDIgPDogWDEKICAgICAgLy8gICBvdGhlcndpc2UgVVAoQjFbT2JqZWN0L1gxXSwgVDIpCiAgICAgIERhcnRUeXBlIGRlbW90ZWQgPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICB0eXBlMS5wYXJhbWV0ZXIsIHR5cGUxLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHkpOwogICAgICBpZiAoaXNTdWJ0eXBlT2YoZGVtb3RlZCwgdHlwZTIsIFN1YnR5cGVDaGVja01vZGUud2l0aE51bGxhYmlsaXRpZXMpKSB7CiAgICAgICAgcmV0dXJuIHR5cGUyLndpdGhOdWxsYWJpbGl0eSgKICAgICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKHR5cGUxLm51bGxhYmlsaXR5LCB0eXBlMi5udWxsYWJpbGl0eSkpOwogICAgICB9CiAgICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMiwgZGVtb3RlZCwgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykpIHsKICAgICAgICByZXR1cm4gZGVtb3RlZC53aXRoTnVsbGFiaWxpdHkoCiAgICAgICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpKTsKICAgICAgfQogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbiA9IDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT57CiAgICAgICAgdHlwZTEucGFyYW1ldGVyOiBjb3JlVHlwZXMub2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlCiAgICAgIH07CiAgICAgIHJldHVybiBnZXROdWxsYWJpbGl0eUF3YXJlU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgICAgICAgIHN1YnN0aXR1dGUodHlwZTEucHJvbW90ZWRCb3VuZCwgc3Vic3RpdHV0aW9uKSwKICAgICAgICAgICAgICB0eXBlMiwKICAgICAgICAgICAgICBjbGllbnRMaWJyYXJ5KQogICAgICAgICAgLndpdGhOdWxsYWJpbGl0eSgKICAgICAgICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXModHlwZTEubnVsbGFiaWxpdHksIHR5cGUyLm51bGxhYmlsaXR5KSk7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBnZXROdWxsYWJpbGl0eU9ibGl2aW91c1N0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIC8vIEZvciBhbGwgdHlwZXMgVCwgU1VCKFQsVCkgPSBULiAgTm90ZSB0aGF0IHdlIGRvbid0IHRlc3QgZm9yIGVxdWFsaXR5CiAgICAvLyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gbWFrZSB0aGUgYWxnb3JpdGhtIHF1YWRyYXRpYy4gIFRoaXMgaXMgb2sKICAgIC8vIGJlY2F1c2UgdGhlIGNoZWNrIGlzIG5vdCBuZWVkZWQgZm9yIGNvcnJlY3RuZXNzOyBpdCdzIGp1c3QgYSBzcGVlZAogICAgLy8gb3B0aW1pemF0aW9uLgogICAgaWYgKGlkZW50aWNhbCh0eXBlMSwgdHlwZTIpKSB7CiAgICAgIHJldHVybiB0eXBlMTsKICAgIH0KCiAgICAvLyBGb3IgYW55IHR5cGUgVCwgU1VCKD8sIFQpID0gU1VCKFQsID8pID0gVC4KICAgIGlmICh0eXBlMSBpcyBVbmtub3duVHlwZSkgewogICAgICByZXR1cm4gdHlwZTI7CiAgICB9CiAgICBpZiAodHlwZTIgaXMgVW5rbm93blR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQoKICAgIC8vIFNVQih2b2lkLCBUKSA9IFNVQihULCB2b2lkKSA9IHZvaWQuCiAgICBpZiAodHlwZTEgaXMgVm9pZFR5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyIGlzIFZvaWRUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBTVUIoZHluYW1pYywgVCkgPSBTVUIoVCwgZHluYW1pYykgPSBkeW5hbWljIGlmIFQgaXMgbm90IHZvaWQuCiAgICBpZiAodHlwZTEgaXMgRHluYW1pY1R5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUxOwogICAgfQogICAgaWYgKHR5cGUyIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KCiAgICAvLyBTVUIoT2JqZWN0LCBUKSA9IFNVQihULCBPYmplY3QpID0gT2JqZWN0IGlmIFQgaXMgbm90IHZvaWQgb3IgZHluYW1pYy4KICAgIGlmICh0eXBlMSA9PSBjb3JlVHlwZXMub2JqZWN0TGVnYWN5UmF3VHlwZSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTIgPT0gY29yZVR5cGVzLm9iamVjdExlZ2FjeVJhd1R5cGUpIHsKICAgICAgcmV0dXJuIHR5cGUyOwogICAgfQoKICAgIC8vIFNVQihib3R0b20sIFQpID0gU1VCKFQsIGJvdHRvbSkgPSBULgogICAgaWYgKHR5cGUxIGlzIEJvdHRvbVR5cGUpIHJldHVybiB0eXBlMjsKICAgIGlmICh0eXBlMiBpcyBCb3R0b21UeXBlKSByZXR1cm4gdHlwZTE7CiAgICBpZiAodHlwZTEgPT0gY29yZVR5cGVzLm51bGxUeXBlKSByZXR1cm4gdHlwZTI7CiAgICBpZiAodHlwZTIgPT0gY29yZVR5cGVzLm51bGxUeXBlKSByZXR1cm4gdHlwZTE7CgogICAgaWYgKHR5cGUxIGlzIFR5cGVQYXJhbWV0ZXJUeXBlIHx8IHR5cGUyIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgIHJldHVybiBfZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNUeXBlUGFyYW1ldGVyU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgICAgdHlwZTEsIHR5cGUyLCBjbGllbnRMaWJyYXJ5KTsKICAgIH0KCiAgICAvLyBUaGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgYSBmdW5jdGlvbiB0eXBlIGFuZCBhbiBpbnRlcmZhY2UgdHlwZSBUIGlzCiAgICAvLyB0aGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgRnVuY3Rpb24gYW5kIFQuCiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgdHlwZTEgPSBjb3JlVHlwZXMuZnVuY3Rpb25MZWdhY3lSYXdUeXBlOwogICAgfQogICAgaWYgKHR5cGUyIGlzIEZ1bmN0aW9uVHlwZSAmJiB0eXBlMSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgIHR5cGUyID0gY29yZVR5cGVzLmZ1bmN0aW9uTGVnYWN5UmF3VHlwZTsKICAgIH0KCiAgICAvLyBBdCB0aGlzIHBvaW50IHR5cGUxIGFuZCB0eXBlMiBzaG91bGQgYm90aCBlaXRoZXIgYmUgaW50ZXJmYWNlIHR5cGVzIG9yCiAgICAvLyBmdW5jdGlvbiB0eXBlcy4KICAgIGlmICh0eXBlMSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUyIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgcmV0dXJuIF9nZXRJbnRlcmZhY2VTdGFuZGFyZFVwcGVyQm91bmQodHlwZTEsIHR5cGUyLCBjbGllbnRMaWJyYXJ5KTsKICAgIH0KCiAgICBpZiAodHlwZTEgaXMgRnVuY3Rpb25UeXBlICYmIHR5cGUyIGlzIEZ1bmN0aW9uVHlwZSkgewogICAgICByZXR1cm4gX2dldE51bGxhYmlsaXR5T2JsaXZpb3VzRnVuY3Rpb25TdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICB0eXBlMSwgdHlwZTIsIGNsaWVudExpYnJhcnkpOwogICAgfQoKICAgIGlmICh0eXBlMSBpcyBJbnZhbGlkVHlwZSB8fCB0eXBlMiBpcyBJbnZhbGlkVHlwZSkgewogICAgICByZXR1cm4gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgIH0KCiAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLiBBcyBhIGRlZmVuc2l2ZSBtZWFzdXJlLCByZXR1cm4gdGhlIGR5bmFtaWMgdHlwZS4KICAgIGFzc2VydChmYWxzZSwgInR5cGUxID0gJHR5cGUxOyB0eXBlMiA9ICR0eXBlMiIpOwogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQoKICAvLy8gQ29tcHV0ZSB0aGUgc3RhbmRhcmQgbG93ZXIgYm91bmQgb2YgZnVuY3Rpb24gdHlwZXMgW2ZdIGFuZCBbZ10uCiAgLy8vCiAgLy8vIFRoZSBzcGVjIHJ1bGVzIGZvciBTTEIgb24gZnVuY3Rpb24gdHlwZXMsIGluZm9ybWFsbHksIGFyZSBwcmV0dHkgc2ltcGxlOgogIC8vLwogIC8vLyAtIElmIGEgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGluIGJvdGgsIGl0IHN0YXlzIHJlcXVpcmVkLgogIC8vLwogIC8vLyAtIElmIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgb3IgbWlzc2luZyBpbiBvbmUsIGl0IGJlY29tZXMKICAvLy8gICBvcHRpb25hbC4gIChUaGlzIGlzIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIGJ1aWxkIGEgZnVuY3Rpb24gdHlwZSB3aGljaAogIC8vLyAgIGlzIGEgc3VidHlwZSBvZiBib3RoIFtmXSBhbmQgW2ddLCBtZWFuaW5nIGl0IGFjY2VwdHMgYWxsIHBvc3NpYmxlIGlucHV0cwogIC8vLyAgIHRoYXQgW2ZdIGFuZCBbZ10gYWNjZXB0LikKICAvLy8KICAvLy8gLSBOYW1lZCBwYXJhbWV0ZXJzIGFyZSB1bmlvbmVkIHRvZ2V0aGVyLgogIC8vLwogIC8vLyAtIEZvciBhbnkgcGFyYW1ldGVyIHRoYXQgZXhpc3RzIGluIGJvdGggZnVuY3Rpb25zLCB1c2UgdGhlIFNVQiBvZiB0aGVtIGFzCiAgLy8vICAgdGhlIHJlc3VsdGluZyBwYXJhbWV0ZXIgdHlwZS4KICAvLy8KICAvLy8gLSBVc2UgdGhlIFNMQiBvZiB0aGVpciByZXR1cm4gdHlwZXMuCiAgRGFydFR5cGUgX2dldE51bGxhYmlsaXR5T2JsaXZpb3VzRnVuY3Rpb25TdGFuZGFyZExvd2VyQm91bmQoCiAgICAgIEZ1bmN0aW9uVHlwZSBmLCBGdW5jdGlvblR5cGUgZywgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICAvLyBUT0RPKHJueXN0cm9tLHBhdWxiZXJyeSk6IFJpZ2h0IG5vdywgdGhpcyBhc3N1bWVzIGYgYW5kIGcgZG8gbm90IGhhdmUgYW55CiAgICAvLyB0eXBlIHBhcmFtZXRlcnMuIFJldmlzaXQgdGhhdCBpbiB0aGUgcHJlc2VuY2Ugb2YgZ2VuZXJpYyBtZXRob2RzLgoKICAgIC8vIENhbGN1bGF0ZSB0aGUgU1VCIG9mIGVhY2ggY29ycmVzcG9uZGluZyBwYWlyIG9mIHBhcmFtZXRlcnMuCiAgICBpbnQgdG90YWxQb3NpdGlvbmFsID0KICAgICAgICBtYXRoLm1heChmLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCwgZy5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpOwogICAgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPSBuZXcgTGlzdDxEYXJ0VHlwZT4odG90YWxQb3NpdGlvbmFsKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQb3NpdGlvbmFsOyBpKyspIHsKICAgICAgaWYgKGkgPCBmLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgIERhcnRUeXBlIGZUeXBlID0gZi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoaSA8IGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICBEYXJ0VHlwZSBnVHlwZSA9IGcucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSA9CiAgICAgICAgICAgICAgZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGZUeXBlLCBnVHlwZSwgY2xpZW50TGlicmFyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0gZlR5cGU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0gZy5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgfQogICAgfQoKICAgIC8vIFBhcmFtZXRlcnMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gYm90aCBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIGluIHRoZQogICAgLy8gcmVzdWx0LiAgUGFyYW1ldGVycyB0aGF0IGFyZSBvcHRpb25hbCBvciBtaXNzaW5nIGluIGVpdGhlciBlbmQgdXAKICAgIC8vIG9wdGlvbmFsLgogICAgaW50IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPQogICAgICAgIG1hdGgubWluKGYucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwgZy5yZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKICAgIGJvb2wgaGFzUG9zaXRpb25hbCA9IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPCB0b3RhbFBvc2l0aW9uYWw7CgogICAgLy8gVW5pb24gdGhlIG5hbWVkIHBhcmFtZXRlcnMgdG9nZXRoZXIuCiAgICBMaXN0PE5hbWVkVHlwZT4gbmFtZWRQYXJhbWV0ZXJzID0gW107CiAgICB7CiAgICAgIGludCBpID0gMDsKICAgICAgaW50IGogPSAwOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChpIDwgZi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoaiA8IGcubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgICAgICBTdHJpbmcgZk5hbWUgPSBmLm5hbWVkUGFyYW1ldGVyc1tpXS5uYW1lOwogICAgICAgICAgICBTdHJpbmcgZ05hbWUgPSBnLm5hbWVkUGFyYW1ldGVyc1tqXS5uYW1lOwogICAgICAgICAgICBpbnQgb3JkZXIgPSBmTmFtZS5jb21wYXJlVG8oZ05hbWUpOwogICAgICAgICAgICBpZiAob3JkZXIgPCAwKSB7CiAgICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChmLm5hbWVkUGFyYW1ldGVyc1tpKytdKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChvcmRlciA+IDApIHsKICAgICAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkKGcubmFtZWRQYXJhbWV0ZXJzW2orK10pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGQobmV3IE5hbWVkVHlwZSgKICAgICAgICAgICAgICAgICAgZk5hbWUsCiAgICAgICAgICAgICAgICAgIGdldFN0YW5kYXJkVXBwZXJCb3VuZChmLm5hbWVkUGFyYW1ldGVyc1tpKytdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICBnLm5hbWVkUGFyYW1ldGVyc1tqKytdLnR5cGUsIGNsaWVudExpYnJhcnkpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5hbWVkUGFyYW1ldGVycy5hZGRBbGwoZi5uYW1lZFBhcmFtZXRlcnMuc2tpcChpKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuYW1lZFBhcmFtZXRlcnMuYWRkQWxsKGcubmFtZWRQYXJhbWV0ZXJzLnNraXAoaikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBib29sIGhhc05hbWVkID0gbmFtZWRQYXJhbWV0ZXJzLmlzTm90RW1wdHk7CgogICAgLy8gRWRnZSBjYXNlLiBEYXJ0IGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb25zIHdpdGggYm90aCBvcHRpb25hbCBwb3NpdGlvbmFsCiAgICAvLyBhbmQgbmFtZWQgcGFyYW1ldGVycy4gSWYgd2Ugd291bGQgc3ludGhlc2l6ZSB0aGF0LCBnaXZlIHVwLgogICAgaWYgKGhhc1Bvc2l0aW9uYWwgJiYgaGFzTmFtZWQpIHJldHVybiBjb25zdCBCb3R0b21UeXBlKCk7CgogICAgLy8gQ2FsY3VsYXRlIHRoZSBTTEIgb2YgdGhlIHJldHVybiB0eXBlLgogICAgRGFydFR5cGUgcmV0dXJuVHlwZSA9CiAgICAgICAgZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGYucmV0dXJuVHlwZSwgZy5yZXR1cm5UeXBlLCBjbGllbnRMaWJyYXJ5KTsKICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWxQYXJhbWV0ZXJzLCByZXR1cm5UeXBlLAogICAgICAgIGludGVyc2VjdE51bGxhYmlsaXRpZXMoZi5udWxsYWJpbGl0eSwgZy5udWxsYWJpbGl0eSksCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgfQoKICAvLy8gQ29tcHV0ZSB0aGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgZnVuY3Rpb24gdHlwZXMgW2ZdIGFuZCBbZ10uCiAgLy8vCiAgLy8vIFRoZSBydWxlcyBmb3IgU1VCIG9uIGZ1bmN0aW9uIHR5cGVzLCBpbmZvcm1hbGx5LCBhcmUgcHJldHR5IHNpbXBsZToKICAvLy8KICAvLy8gLSBJZiB0aGUgZnVuY3Rpb25zIGRvbid0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJlcXVpcmVkIHBhcmFtZXRlcnMsCiAgLy8vICAgYWx3YXlzIHJldHVybiBgRnVuY3Rpb25gLgogIC8vLwogIC8vLyAtIERpc2NhcmQgYW55IG9wdGlvbmFsIG5hbWVkIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGUgdHdvIHR5cGVzIGRvIG5vdAogIC8vLyAgIGhhdmUgaW4gY29tbW9uLgogIC8vLwogIC8vLyAtIENvbXB1dGUgdGhlIFNMQiBvZiBlYWNoIGNvcnJlc3BvbmRpbmcgcGFpciBvZiBwYXJhbWV0ZXIgdHlwZXMsIGFuZCB0aGUKICAvLy8gICBTVUIgb2YgdGhlIHJldHVybiB0eXBlcy4gIFJldHVybiBhIGZ1bmN0aW9uIHR5cGUgd2l0aCB0aG9zZSB0eXBlcy4KICBEYXJ0VHlwZSBfZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNGdW5jdGlvblN0YW5kYXJkVXBwZXJCb3VuZCgKICAgICAgRnVuY3Rpb25UeXBlIGYsIEZ1bmN0aW9uVHlwZSBnLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIC8vIFRPRE8ocm55c3Ryb20pOiBSaWdodCBub3csIHRoaXMgYXNzdW1lcyBmIGFuZCBnIGRvIG5vdCBoYXZlIGFueSB0eXBlCiAgICAvLyBwYXJhbWV0ZXJzLiBSZXZpc2l0IHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIGdlbmVyaWMgbWV0aG9kcy4KCiAgICAvLyBJZiBGIGFuZCBHIGRpZmZlciBpbiB0aGVpciBudW1iZXIgb2YgcmVxdWlyZWQgcGFyYW1ldGVycywgdGhlbiB0aGUKICAgIC8vIHN0YW5kYXJkIHVwcGVyIGJvdW5kIG9mIEYgYW5kIEcgaXMgRnVuY3Rpb24uCiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IFdlIGNvdWxkIGRvIGJldHRlciBoZXJlLCBlLmcuOgogICAgLy8gICBTVUIoKFtpbnRdKSAtPiB2b2lkLCAoaW50KSAtPiB2b2lkKSA9IChpbnQpIC0+IHZvaWQKICAgIGlmIChmLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgIT0gZy5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSB7CiAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgIGNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzLAogICAgICAgICAgdW5pdGVOdWxsYWJpbGl0aWVzKGYubnVsbGFiaWxpdHksIGcubnVsbGFiaWxpdHkpLAogICAgICAgICAgY29uc3QgPER5bmFtaWNUeXBlPltdKTsKICAgIH0KICAgIGludCByZXF1aXJlZFBhcmFtZXRlckNvdW50ID0gZi5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwoKICAgIC8vIENhbGN1bGF0ZSB0aGUgU0xCIG9mIGVhY2ggY29ycmVzcG9uZGluZyBwYWlyIG9mIHBhcmFtZXRlcnMuCiAgICAvLyBJZ25vcmUgYW55IGV4dHJhIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBpZiBvbmUgaGFzIG1vcmUgdGhhbiB0aGUKICAgIC8vIG90aGVyLgogICAgaW50IHRvdGFsUG9zaXRpb25hbCA9CiAgICAgICAgbWF0aC5taW4oZi5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgsIGcucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIExpc3Q8RGFydFR5cGU+IHBvc2l0aW9uYWxQYXJhbWV0ZXJzID0gbmV3IExpc3Q8RGFydFR5cGU+KHRvdGFsUG9zaXRpb25hbCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsUG9zaXRpb25hbDsgaSsrKSB7CiAgICAgIHBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldID0gZ2V0U3RhbmRhcmRMb3dlckJvdW5kKAogICAgICAgICAgZi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwgZy5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXSwgY2xpZW50TGlicmFyeSk7CiAgICB9CgogICAgLy8gSW50ZXJzZWN0IHRoZSBuYW1lZCBwYXJhbWV0ZXJzLgogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVycyA9IFtdOwogICAgewogICAgICBpbnQgaSA9IDA7CiAgICAgIGludCBqID0gMDsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoaSA8IGYubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgICAgaWYgKGogPCBnLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gZi5uYW1lZFBhcmFtZXRlcnNbaV0ubmFtZTsKICAgICAgICAgICAgU3RyaW5nIGdOYW1lID0gZy5uYW1lZFBhcmFtZXRlcnNbal0ubmFtZTsKICAgICAgICAgICAgaW50IG9yZGVyID0gZk5hbWUuY29tcGFyZVRvKGdOYW1lKTsKICAgICAgICAgICAgaWYgKG9yZGVyIDwgMCkgewogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChvcmRlciA+IDApIHsKICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmFtZWRQYXJhbWV0ZXJzLmFkZChuZXcgTmFtZWRUeXBlKAogICAgICAgICAgICAgICAgICBmTmFtZSwKICAgICAgICAgICAgICAgICAgZ2V0U3RhbmRhcmRMb3dlckJvdW5kKGYubmFtZWRQYXJhbWV0ZXJzW2krK10udHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGcubmFtZWRQYXJhbWV0ZXJzW2orK10udHlwZSwgY2xpZW50TGlicmFyeSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENhbGN1bGF0ZSB0aGUgU1VCIG9mIHRoZSByZXR1cm4gdHlwZS4KICAgIERhcnRUeXBlIHJldHVyblR5cGUgPQogICAgICAgIGdldFN0YW5kYXJkVXBwZXJCb3VuZChmLnJldHVyblR5cGUsIGcucmV0dXJuVHlwZSwgY2xpZW50TGlicmFyeSk7CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZShwb3NpdGlvbmFsUGFyYW1ldGVycywgcmV0dXJuVHlwZSwKICAgICAgICB1bml0ZU51bGxhYmlsaXRpZXMoZi5udWxsYWJpbGl0eSwgZy5udWxsYWJpbGl0eSksCiAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZFBhcmFtZXRlcnMsCiAgICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogcmVxdWlyZWRQYXJhbWV0ZXJDb3VudCk7CiAgfQoKICBEYXJ0VHlwZSBfZ2V0SW50ZXJmYWNlU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIC8vIFRoaXMgY3VycmVudGx5IGRvZXMgbm90IGltcGxlbWVudCBhIHZlcnkgY29tcGxldGUgc3RhbmRhcmQgdXBwZXIgYm91bmQKICAgIC8vIGFsZ29yaXRobSwgYnV0IGhhbmRsZXMgYSBjb3VwbGUgb2YgdGhlIHZlcnkgY29tbW9uIGNhc2VzIHRoYXQgYXJlCiAgICAvLyBjYXVzaW5nIHBhaW4gaW4gcmVhbCBjb2RlLiAgVGhlIGN1cnJlbnQgYWxnb3JpdGhtIGlzOgogICAgLy8gMS4gSWYgZWl0aGVyIG9mIHRoZSB0eXBlcyBpcyBhIHN1cGVydHlwZSBvZiB0aGUgb3RoZXIsIHJldHVybiBpdC4KICAgIC8vICAgIFRoaXMgaXMgaW4gZmFjdCB0aGUgYmVzdCByZXN1bHQgaW4gdGhpcyBjYXNlLgogICAgLy8gMi4gSWYgdGhlIHR3byB0eXBlcyBoYXZlIHRoZSBzYW1lIGNsYXNzIGVsZW1lbnQgYW5kIGlzIGltcGxpY2l0bHkgb3IKICAgIC8vICAgIGV4cGxpY2l0bHkgY292YXJpYW50LCB0aGVuIHRha2UgdGhlIHBvaW50d2lzZSBzdGFuZGFyZCB1cHBlciBib3VuZCBvZgogICAgLy8gICAgdGhlIHR5cGUgYXJndW1lbnRzLiBUaGlzIGlzIGFnYWluIHRoZSBiZXN0IHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlCiAgICAvLyAgICByZWN1cnNpdmUgY2FsbHMgbWF5IG5vdCByZXR1cm4gdGhlIHRydWUgc3RhbmRhcmQgdXBwZXIgYm91bmRzLiAgVGhlCiAgICAvLyAgICByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHdlbGwtZm9ybWVkIHR5cGUgdW5kZXIgdGhlIGFzc3VtcHRpb24KICAgIC8vICAgIHRoYXQgdGhlIGlucHV0IHR5cGVzIHdlcmUgd2VsbC1mb3JtZWQgKGFuZCBhc3N1bWluZyB0aGF0IHRoZQogICAgLy8gICAgcmVjdXJzaXZlIGNhbGxzIHJldHVybiB3ZWxsLWZvcm1lZCB0eXBlcykuCiAgICAvLyAgICBJZiB0aGUgdmFyaWFuY2Ugb2YgdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGNvbnRyYXZhcmlhbnQsIHdlIHRha2UgdGhlCiAgICAvLyAgICBzdGFuZGFyZCBsb3dlciBib3VuZCBvZiB0aGUgdHlwZSBhcmd1bWVudHMuIElmIHRoZSB2YXJpYW5jZSBvZiB0aGUKICAgIC8vICAgIHR5cGUgcGFyYW1ldGVyIGlzIGludmFyaWFudCwgd2UgdmVyaWZ5IGlmIHRoZSB0eXBlIGFyZ3VtZW50cyBzYXRpc2Z5CiAgICAvLyAgICBzdWJ0eXBpbmcgaW4gYm90aCBkaXJlY3Rpb25zLCB0aGVuIGNob29zZSBhIGJvdW5kLgogICAgLy8gMy4gT3RoZXJ3aXNlIHJldHVybiB0aGUgc3BlYy1kZWZpbmVkIHN0YW5kYXJkIHVwcGVyIGJvdW5kLiAgVGhpcyB3aWxsCiAgICAvLyAgICBiZSBhbiB1cHBlciBib3VuZCwgbWlnaHQgKG9yIG1pZ2h0IG5vdCkgYmUgbGVhc3QsIGFuZCBtaWdodAogICAgLy8gICAgKG9yIG1pZ2h0IG5vdCkgYmUgYSB3ZWxsLWZvcm1lZCB0eXBlLgogICAgaWYgKGlzU3VidHlwZU9mKHR5cGUxLCB0eXBlMiwgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMiwgdHlwZTEsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIHR5cGUyIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwodHlwZTEuY2xhc3NOb2RlLCB0eXBlMi5jbGFzc05vZGUpKSB7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzMSA9IHR5cGUxLnR5cGVBcmd1bWVudHM7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzMiA9IHR5cGUyLnR5cGVBcmd1bWVudHM7CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdFBhcmFtcyA9IHR5cGUxLmNsYXNzTm9kZS50eXBlUGFyYW1ldGVyczsKCiAgICAgIGFzc2VydCh0QXJnczEubGVuZ3RoID09IHRBcmdzMi5sZW5ndGgpOwogICAgICBhc3NlcnQodEFyZ3MxLmxlbmd0aCA9PSB0UGFyYW1zLmxlbmd0aCk7CiAgICAgIExpc3Q8RGFydFR5cGU+IHRBcmdzID0gbmV3IExpc3QodEFyZ3MxLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdEFyZ3MxLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHRQYXJhbXNbaV0udmFyaWFuY2UgPT0gVmFyaWFuY2UuY29udHJhdmFyaWFudCkgewogICAgICAgICAgdEFyZ3NbaV0gPSBnZXRTdGFuZGFyZExvd2VyQm91bmQodEFyZ3MxW2ldLCB0QXJnczJbaV0sIGNsaWVudExpYnJhcnkpOwogICAgICAgIH0gZWxzZSBpZiAodFBhcmFtc1tpXS52YXJpYW5jZSA9PSBWYXJpYW5jZS5pbnZhcmlhbnQpIHsKICAgICAgICAgIGlmICghYXJlTXV0dWFsU3VidHlwZXMoCiAgICAgICAgICAgICAgdEFyZ3MxW2ldLCB0QXJnczJbaV0sIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICAgICAgICAvLyBObyBib3VuZCB3aWxsIGJlIHZhbGlkLCBmaW5kIGJvdW5kIGF0IHRoZSBpbnRlcmZhY2UgbGV2ZWwuCiAgICAgICAgICAgIHJldHVybiBnZXRMZWdhY3lMZWFzdFVwcGVyQm91bmQodHlwZTEsIHR5cGUyLCBjbGllbnRMaWJyYXJ5KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFRPRE8gKGthbGxlbnR1KSA6IEZpeCBhc3ltbWV0cmljIGJvdW5kcyBiZWhhdmlvciBmb3IgaW52YXJpYW50IHR5cGUKICAgICAgICAgIC8vICBwYXJhbWV0ZXJzLgogICAgICAgICAgdEFyZ3NbaV0gPSB0QXJnczFbaV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRBcmdzW2ldID0gZ2V0U3RhbmRhcmRVcHBlckJvdW5kKHRBcmdzMVtpXSwgdEFyZ3MyW2ldLCBjbGllbnRMaWJyYXJ5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2VUeXBlKHR5cGUxLmNsYXNzTm9kZSwKICAgICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlMS5udWxsYWJpbGl0eSwgdHlwZTIubnVsbGFiaWxpdHkpLCB0QXJncyk7CiAgICB9CiAgICByZXR1cm4gZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKHR5cGUxLCB0eXBlMiwgY2xpZW50TGlicmFyeSk7CiAgfQoKICBEYXJ0VHlwZSBfZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNUeXBlUGFyYW1ldGVyU3RhbmRhcmRVcHBlckJvdW5kKAogICAgICBEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIsIExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgLy8gVGhpcyBjdXJyZW50bHkganVzdCBpbXBsZW1lbnRzIGEgc2ltcGxlIHN0YW5kYXJkIHVwcGVyIGJvdW5kIHRvCiAgICAvLyBoYW5kbGUgc29tZSBjb21tb24gY2FzZXMuICBJdCBhbHNvIGF2b2lkcyBzb21lIHRlcm1pbmF0aW9uIGlzc3VlcwogICAgLy8gd2l0aCB0aGUgbmFpdmUgc3BlYyBhbGdvcml0aG0uICBUaGUgc3RhbmRhcmQgdXBwZXIgYm91bmQgb2YgdHdvIHR5cGVzCiAgICAvLyAoYXQgbGVhc3Qgb25lIG9mIHdoaWNoIGlzIGEgdHlwZSBwYXJhbWV0ZXIpIGlzIGNvbXB1dGVkIGhlcmUgYXM6CiAgICAvLyAxLiBJZiBlaXRoZXIgdHlwZSBpcyBhIHN1cGVydHlwZSBvZiB0aGUgb3RoZXIsIHJldHVybiBpdC4KICAgIC8vIDIuIElmIHRoZSBmaXJzdCB0eXBlIGlzIGEgdHlwZSBwYXJhbWV0ZXIsIHJlcGxhY2UgaXQgd2l0aCBpdHMgYm91bmQsCiAgICAvLyAgICB3aXRoIHJlY3Vyc2l2ZSBvY2N1cnJlbmNlcyBvZiBpdHNlbGYgcmVwbGFjZWQgd2l0aCBPYmplY3QuCiAgICAvLyAgICBUaGUgc2Vjb25kIHBhcnQgb2YgdGhpcyBzaG91bGQgZW5zdXJlIHRlcm1pbmF0aW9uLiAgSW5mb3JtYWxseSwKICAgIC8vICAgIGVhY2ggdHlwZSB2YXJpYWJsZSBpbnN0YW50aWF0aW9uIGluIG9uZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZQogICAgLy8gICAgc3RhbmRhcmQgdXBwZXIgYm91bmQgYWxnb3JpdGhtIG5vdyBzdHJpY3RseSByZWR1Y2VzIHRoZSBudW1iZXIKICAgIC8vICAgIG9mIGJvdW5kIHZhcmlhYmxlcyBpbiBzY29wZSBpbiB0aGF0IGFyZ3VtZW50IHBvc2l0aW9uLgogICAgLy8gMy4gSWYgdGhlIHNlY29uZCB0eXBlIGlzIGEgdHlwZSBwYXJhbWV0ZXIsIGRvIHRoZSBzeW1tZXRyaWMgb3BlcmF0aW9uCiAgICAvLyAgICB0byAjMi4KICAgIC8vCiAgICAvLyBJdCdzIG5vdCBpbW1lZGlhdGVseSBvYnZpb3VzIHdoeSB0aGlzIGlzIHN5bW1ldHJpYyBpbiB0aGUgY2FzZSB0aGF0IGJvdGgKICAgIC8vIG9mIHRoZW0gYXJlIHR5cGUgcGFyYW1ldGVycy4gIEZvciAjMSwgc3ltbWV0cnkgaG9sZHMgc2luY2Ugc3VidHlwZQogICAgLy8gaXMgYW50aXN5bW1ldHJpYy4gIEZvciAjMiwgaXQncyBjbGVhcmx5IG5vdCBzeW1tZXRyaWMgaWYgdXBwZXIgYm91bmRzIG9mCiAgICAvLyBib3R0b20gYXJlIGFsbG93ZWQuICBJZ25vcmluZyB0aGlzIChmb3IgdmFyaW91cyByZWFzb25zLCBub3QgbGVhc3QKICAgIC8vIG9mIHdoaWNoIHRoYXQgdGhlcmUncyBubyB3YXkgdG8gd3JpdGUgaXQpLCB0aGVyZSdzIGFuIGluZm9ybWFsCiAgICAvLyBhcmd1bWVudCAodGhhdCBtaWdodCBldmVuIGJlIHJpZ2h0KSB0aGF0IHlvdSB3aWxsIGFsd2F5cyBlaXRoZXIKICAgIC8vIGVuZCB1cCBleHBhbmRpbmcgYm90aCBvZiB0aGVtIG9yIGVsc2UgcmV0dXJuaW5nIHRoZSBzYW1lIHJlc3VsdCBubyBtYXR0ZXIKICAgIC8vIHdoaWNoIG9yZGVyIHlvdSBleHBhbmQgdGhlbSBpbi4gIEEga2V5IG9ic2VydmF0aW9uIGlzIHRoYXQKICAgIC8vIGlkZW50aWNhbChleHBhbmQodHlwZTEpLCB0eXBlMikgPT4gc3VidHlwZSh0eXBlMSwgdHlwZTIpCiAgICAvLyBhbmQgaGVuY2UgdGhlIGNvbnRyYS1wb3NpdGl2ZS4KICAgIC8vCiAgICAvLyBUT0RPKGxlYWZwKTogVGhpbmsgdGhpcyB0aHJvdWdoIGFuZCBmaWd1cmUgb3V0IHdoYXQncyB0aGUgcmlnaHQKICAgIC8vIGRlZmluaXRpb24uICBCZSBjYXJlZnVsIGFib3V0IHRlcm1pbmF0aW9uLgogICAgLy8KICAgIC8vIEkgc3VzcGVjdCBpbiBnZW5lcmFsIGEgcmVhc29uYWJsZSBhbGdvcml0aG0gaXMgdG8gZXhwYW5kIHRoZSBpbm5lcm1vc3QKICAgIC8vIHR5cGUgdmFyaWFibGUgZmlyc3QuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY291bGQgcHJvYmFibHkgY2hvb3NlIHRvIHRyZWF0CiAgICAvLyBpdCBhcyBqdXN0IGFuIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdHlwZSB1cHBlciBib3VuZCBwcm9ibGVtLCB3aXRoCiAgICAvLyB0aGUgImluaGVyaXRhbmNlIiBjaGFpbiBleHRlbmRlZCBieSB0aGUgYm91bmRzIHBsYWNlZCBvbiB0aGUgdmFyaWFibGVzLgogICAgaWYgKGlzU3VidHlwZU9mKHR5cGUxLCB0eXBlMiwgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpKSB7CiAgICAgIHJldHVybiB0eXBlMjsKICAgIH0KICAgIGlmIChpc1N1YnR5cGVPZih0eXBlMiwgdHlwZTEsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICByZXR1cm4gdHlwZTE7CiAgICB9CiAgICBpZiAodHlwZTEgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBBbmFseXplciBjb2xsYXBzZXMgc2ltcGxlIGJvdW5kcyBpbiBvbmUgc3RlcCwgaS5lLiBmb3IKICAgICAgLy8gQzxUIGV4dGVuZHMgVSwgVSBleHRlbmRzIExpc3Q+LCBUIGdldHMgcmVzb2x2ZWQgZGlyZWN0bHkgdG8gTGlzdC4gIERvCiAgICAgIC8vIHdlIG5lZWQgdG8gcmVwbGljYXRlIHRoYXQgYmVoYXZpb3I/CiAgICAgIHJldHVybiBnZXRTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbU1hcCh7dHlwZTEucGFyYW1ldGVyOiBjb3JlVHlwZXMub2JqZWN0TGVnYWN5UmF3VHlwZX0pCiAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUxLnBhcmFtZXRlci5ib3VuZCksCiAgICAgICAgICB0eXBlMiwKICAgICAgICAgIGNsaWVudExpYnJhcnkpOwogICAgfSBlbHNlIGlmICh0eXBlMiBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICByZXR1cm4gZ2V0U3RhbmRhcmRVcHBlckJvdW5kKAogICAgICAgICAgdHlwZTEsCiAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbU1hcCh7dHlwZTIucGFyYW1ldGVyOiBjb3JlVHlwZXMub2JqZWN0TGVnYWN5UmF3VHlwZX0pCiAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGUyLnBhcmFtZXRlci5ib3VuZCksCiAgICAgICAgICBjbGllbnRMaWJyYXJ5KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGF0IGxlYXN0IG9u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KSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIuY2xhc3NfbWVtYmVyX3BhcnNlcjsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdlcnJvcl9kZWxlZ2F0aW9uX2xpc3RlbmVyLmRhcnQnIHNob3cgRXJyb3JEZWxlZ2F0aW9uTGlzdGVuZXI7CgppbXBvcnQgJ2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgppbXBvcnQgJ3BhcnNlcl9pbXBsLmRhcnQnIHNob3cgUGFyc2VyOwoKLy8vIFBhcnNlciBzaW1pbGFyIHRvIFtUb3BMZXZlbFBhcnNlcl0gYnV0IGFsc28gcGFyc2VzIGNsYXNzIG1lbWJlcnMgKGV4Y2x1ZGluZwovLy8gdGhlaXIgYm9kaWVzKS4KY2xhc3MgQ2xhc3NNZW1iZXJQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgewogIFBhcnNlciBza2lwUGFyc2VyOwoKICBDbGFzc01lbWJlclBhcnNlcihMaXN0ZW5lciBsaXN0ZW5lcikgOiBzdXBlcihsaXN0ZW5lcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHNraXBFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlSWRlbnRpZmllckV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0OwogIH0KCiAgVG9rZW4gc2tpcEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRPRE8oYXNrZXNjKTogV2UgbGlzdGVuIHRvIGVycm9ycyBvY2N1cnJpbmcgZHVyaW5nIGV4cHJlc3Npb24gcGFyc2luZywKICAgIC8vIHNpbmNlIHRoZSBwYXJzZXIgbWF5IHJld3JpdGUgdGhlIHRva2VuIHN0cmVhbSBzdWNoIHRoYXQgdGhlIGVycm9yIGlzCiAgICAvLyBub3QgdHJpZ2dlcmVkIGR1cmluZyB0aGUgc2Vjb25kIHBhcnNlLgogICAgLy8gV2hlbiB0aGUgcGFyc2VyIHN1cHBvcnRzIG5vdCBkb2luZyB0b2tlbiBzdHJlYW0gcmV3cml0aW5nLCB1c2UgdGhhdAogICAgLy8gZmVhdHVyZSB0b2dldGhlciB3aXRoIGEgbm8tb3AgbGlzdGVuZXIgaW5zdGVhZC4KICAgIHNraXBQYXJzZXIgPz89IG5ldyBQYXJzZXIobmV3IEVycm9yRGVsZWdhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICBza2lwUGFyc2VyLm1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIHNraXBQYXJzZXIuYXN5bmNTdGF0ZSA9IGFzeW5jU3RhdGU7CiAgICBza2lwUGFyc2VyLmxvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIHJldHVybiBza2lwUGFyc2VyLnBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICAvLyBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGZvciB0d28gcmVhc29uczoKICAvLyAxLiBBdm9pZCBnZW5lcmF0aW5nIGV2ZW50cyBmb3IgYXJndW1lbnRzLgogIC8vIDIuIEF2b2lkIGNhbGxpbmcgc2tpcCBleHByZXNzaW9uIGZvciBlYWNoIGFyZ3VtZW50ICh3aGljaCBkb2Vzbid0IHdvcmspLgogIFRva2VuIHBhcnNlQXJndW1lbnRzT3B0KFRva2VuIHRva2VuKSA9PiBza2lwQXJndW1lbnRzT3B0KHRva2VuKTsKCiAgVG9rZW4gcGFyc2VGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4sIGJvb2wgaXNFeHByZXNzaW9uLCBib29sIGFsbG93QWJzdHJhY3QpIHsKICAgIHJldHVybiBza2lwRnVuY3Rpb25Cb2R5KHRva2VuLCBpc0V4cHJlc3Npb24sIGFsbG93QWJzdHJhY3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VJbnZhbGlkQmxvY2soVG9rZW4gdG9rZW4pID0+IHNraXBCbG9jayh0b2tlbik7Cn0KOgBOTjwBOAErAUYBJgEnAVATKRUBOgEMJyIEAQwxFwQBJk5MLks3RkooJi4EATAvTkMBUEEEAQw8AgE/cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvY2xhc3NfbWVtYmVyX3BhcnNlci5kYXJ0aGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvZGVjbGFyYXRpb25fa2luZC5kYXJ0geYvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgplbnVtIERlY2xhcmF0aW9uS2luZCB7CiAgLy8vIEEgdG9wIGxldmVsIGRlY2xhcmF0aW9uLgogIFRvcExldmVsLAoKICAvLy8gQSBjbGFzcyBkZWNsYXJhdGlvbi4gTm90IGluY2x1ZGluZyBhIG5hbWVkIG1peGluIGRlY2xhcmF0aW9uLgogIENsYXNzLAoKICAvLy8gQSBtaXhpbiBkZWNsYXJhdGlvbi4gTm90IGluY2x1ZGluZyBhIG5hbWVkIG1peGluIGRlY2xhcmF0aW9uLgogIE1peGluLAoKICAvLy8gQW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgogIEV4dGVuc2lvbiwKfQoTAE1OPAEXHwwBRAkBRAkBIA0CATxwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9kZWNsYXJhdGlvbl9raW5kLmRhcnRrZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnShcS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQuc2Nhbm5lci51dGY4X2J5dGVzX3NjYW5uZXI7CgppbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyB1bmljb2RlQm9tQ2hhcmFjdGVyUnVuZSwgdXRmODsKCmltcG9ydCAndG9rZW4uZGFydCcgc2hvdyBTeW50aGV0aWNTdHJpbmdUb2tlbiwgVG9rZW5UeXBlOwoKaW1wb3J0ICd0b2tlbi5kYXJ0JyBhcyBhbmFseXplciBzaG93IFN0cmluZ1Rva2VuOwoKaW1wb3J0ICdzY2FubmVyLmRhcnQnIHNob3cgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwoKaW1wb3J0ICdhYnN0cmFjdF9zY2FubmVyLmRhcnQnCiAgICBzaG93IEFic3RyYWN0U2Nhbm5lciwgTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZCwgU2Nhbm5lckNvbmZpZ3VyYXRpb247CgppbXBvcnQgJ3Rva2VuX2ltcGwuZGFydCcKICAgIHNob3cgQ29tbWVudFRva2VuLCBEYXJ0RG9jVG9rZW4sIExhbmd1YWdlVmVyc2lvblRva2VuLCBTdHJpbmdUb2tlbjsKCi8qKgogKiBTY2FubmVyIHRoYXQgcmVhZHMgZnJvbSBhIFVURi04IGVuY29kZWQgbGlzdCBvZiBieXRlcyBhbmQgY3JlYXRlcyB0b2tlbnMKICogdGhhdCBwb2ludHMgdG8gc3Vic3RyaW5ncy4KICovCmNsYXNzIFV0ZjhCeXRlc1NjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFNjYW5uZXIgewogIC8qKgogICAqIFRoZSBmaWxlIGNvbnRlbnQuCiAgICoKICAgKiBUaGUgY29udGVudCBpcyB6ZXJvLXRlcm1pbmF0ZWQuCiAgICovCiAgTGlzdDxpbnQ+IGJ5dGVzOwoKICAvKioKICAgKiBQb2ludHMgdG8gdGhlIG9mZnNldCBvZiB0aGUgbGFzdCBieXRlIHJldHVybmVkIGJ5IFthZHZhbmNlXS4KICAgKgogICAqIEFmdGVyIGludm9raW5nIFtjdXJyZW50QXNVbmljb2RlXSwgdGhlIFtieXRlT2Zmc2V0XSBwb2ludHMgdG8gdGhlIGxhc3QKICAgKiBieXRlIHRoYXQgaXMgcGFydCBvZiB0aGUgKHVuaWNvZGUgb3IgQVNDSUkpIGNoYXJhY3Rlci4gVGhhdCB3YXksIFthZHZhbmNlXQogICAqIGNhbiBhbHdheXMgaW5jcmVhc2UgdGhlIGJ5dGUgb2Zmc2V0IGJ5IDEuCiAgICovCiAgaW50IGJ5dGVPZmZzZXQgPSAtMTsKCiAgLyoqCiAgICogVGhlIGdldHRlciBbc2Nhbk9mZnNldF0gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgY3VycmVudAogICAqIGNoYXJhY3RlciAqc3RhcnRzKi4gSW4gY2FzZSBvZiBhIG5vbi1hc2NpaSBjaGFyYWN0ZXIsIGFmdGVyIGludm9raW5nCiAgICogW2N1cnJlbnRBc1VuaWNvZGVdLCB0aGUgYnl0ZSBvZmZzZXQgcG9pbnRzIHRvIHRoZSAqbGFzdCogYnl0ZS4KICAgKgogICAqIFRoaXMgZmllbGQga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBieXRlcyBmb3IgdGhlIGN1cnJlbnQgdW5pY29kZQogICAqIGNoYXJhY3Rlci4gRm9yIGV4YW1wbGUsIGlmIGJ5dGVzIDcsOCw5IGVuY29kZSBvbmUgdW5pY29kZSBjaGFyYWN0ZXIsIHRoZQogICAqIFtieXRlT2Zmc2V0XSBpcyA5IChhZnRlciBpbnZva2luZyBbY3VycmVudEFzVW5pY29kZV0pLiBUaGUgW3NjYW5TbGFja10KICAgKiB3aWxsIGJlIDIsIHNvIHRoYXQgW3NjYW5PZmZzZXRdIHJldHVybnMgNy4KICAgKi8KICBpbnQgc2NhblNsYWNrID0gMDsKCiAgLyoqCiAgICogSG9sZHMgdGhlIFtieXRlT2Zmc2V0XSB2YWx1ZSBmb3Igd2hpY2ggdGhlIGN1cnJlbnQgW3NjYW5TbGFja10gaXMgdmFsaWQuCiAgICovCiAgaW50IHNjYW5TbGFja09mZnNldCA9IC0xOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZmlyc3QgYnl0ZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQKICAgKiBjaGFyYWN0ZXIuCiAgICovCiAgaW50IGdldCBzY2FuT2Zmc2V0IHsKICAgIGlmIChieXRlT2Zmc2V0ID09IHNjYW5TbGFja09mZnNldCkgewogICAgICByZXR1cm4gYnl0ZU9mZnNldCAtIHNjYW5TbGFjazsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBieXRlT2Zmc2V0OwogICAgfQogIH0KCiAgLyoqCiAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCB0aGUgbnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcKICAgKiBzdHJpbmcgY2hhcmFjdGVycywgdXAgdG8gdGhlIGN1cnJlbnQgW2J5dGVPZmZzZXRdLgogICAqLwogIGludCB1dGY4U2xhY2sgPSAwOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFV0ZjhCeXRlc1NjYW5uZXIuIFRoZSBzb3VyY2UgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBhCiAgICogW1V0ZjhCeXRlc1NvdXJjZUZpbGVdIHRoYXQgaG9sZHMgYSBsaXN0IG9mIFVURi04IGJ5dGVzLiBPdGhlcndpc2UgdGhlCiAgICogc3RyaW5nIHRleHQgb2YgdGhlIHNvdXJjZSBmaWxlIGlzIGRlY29kZWQuCiAgICoKICAgKiBUaGUgbGlzdCBvZiBVVEYtOCBieXRlcyBbZmlsZS5zbG93VXRmOEJ5dGVzKCldIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbgogICAqIGFycmF5IHdob3NlIGxhc3QgZWxlbWVudCBpcyAnMCcgdG8gc2lnbmFsIHRoZSBlbmQgb2YgdGhlIGZpbGUuIElmIHRoaXMKICAgKiBpcyBub3QgdGhlIGNhc2UsIHRoZSBlbnRpcmUgYXJyYXkgaXMgY29waWVkIGJlZm9yZSBzY2FubmluZy4KICAgKi8KICBVdGY4Qnl0ZXNTY2FubmVyKHRoaXMuYnl0ZXMsCiAgICAgIHtTY2FubmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAogICAgICBib29sIGluY2x1ZGVDb21tZW50czogZmFsc2UsCiAgICAgIExhbmd1YWdlVmVyc2lvbkNoYW5nZWQgbGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZH0pCiAgICAgIDogc3VwZXIoY29uZmlndXJhdGlvbiwgaW5jbHVkZUNvbW1lbnRzLCBsYW5ndWFnZVZlcnNpb25DaGFuZ2VkLAogICAgICAgICAgICBudW1iZXJPZkJ5dGVzSGludDogYnl0ZXMubGVuZ3RoKSB7CiAgICBhc3NlcnQoYnl0ZXMubGFzdCA9PSAwKTsKICAgIC8vIFNraXAgYSBsZWFkaW5nIEJPTS4KICAgIGlmIChjb250YWluc0JvbUF0KDApKSB7CiAgICAgIGJ5dGVPZmZzZXQgKz0gMzsKICAgICAgdXRmOFNsYWNrICs9IDM7CiAgICB9CiAgfQoKICBib29sIGNvbnRhaW5zQm9tQXQoaW50IG9mZnNldCkgewogICAgY29uc3QgTGlzdDxpbnQ+IEJPTV9VVEY4ID0gY29uc3QgWzB4RUYsIDB4QkIsIDB4QkZdOwoKICAgIHJldHVybiBvZmZzZXQgKyAzIDwgYnl0ZXMubGVuZ3RoICYmCiAgICAgICAgYnl0ZXNbb2Zmc2V0XSA9PSBCT01fVVRGOFswXSAmJgogICAgICAgIGJ5dGVzW29mZnNldCArIDFdID09IEJPTV9VVEY4WzFdICYmCiAgICAgICAgYnl0ZXNbb2Zmc2V0ICsgMl0gPT0gQk9NX1VURjhbMl07CiAgfQoKICBpbnQgYWR2YW5jZSgpID0+IGJ5dGVzWysrYnl0ZU9mZnNldF07CgogIGludCBwZWVrKCkgPT4gYnl0ZXNbYnl0ZU9mZnNldCArIDFdOwoKICAvLy8gUmV0dXJucyB0aGUgdW5pY29kZSBjb2RlIHBvaW50IHN0YXJ0aW5nIGF0IHRoZSBieXRlIG9mZnNldCBbc3RhcnRPZmZzZXRdCiAgLy8vIHdpdGggdGhlIGJ5dGUgW25leHRCeXRlXS4KICBpbnQgbmV4dENvZGVQb2ludChpbnQgc3RhcnRPZmZzZXQsIGludCBuZXh0Qnl0ZSkgewogICAgaW50IGV4cGVjdGVkSGlnaEJ5dGVzOwogICAgaWYgKG5leHRCeXRlIDwgMHhDMikgewogICAgICBleHBlY3RlZEhpZ2hCeXRlcyA9IDE7IC8vIEJhZCBjb2RlIHVuaXQuCiAgICB9IGVsc2UgaWYgKG5leHRCeXRlIDwgMHhFMCkgewogICAgICBleHBlY3RlZEhpZ2hCeXRlcyA9IDI7CiAgICB9IGVsc2UgaWYgKG5leHRCeXRlIDwgMHhGMCkgewogICAgICBleHBlY3RlZEhpZ2hCeXRlcyA9IDM7CiAgICB9IGVsc2UgaWYgKG5leHRCeXRlIDwgMHhGNSkgewogICAgICBleHBlY3RlZEhpZ2hCeXRlcyA9IDQ7CiAgICB9IGVsc2UgewogICAgICBleHBlY3RlZEhpZ2hCeXRlcyA9IDE7IC8vIEJhZCBjb2RlIHVuaXQuCiAgICB9CiAgICBpbnQgbnVtQnl0ZXMgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZEhpZ2hCeXRlczsgaSsrKSB7CiAgICAgIGlmIChieXRlc1tieXRlT2Zmc2V0ICsgaV0gPCAweDgwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbnVtQnl0ZXMrKzsKICAgIH0KICAgIGludCBlbmQgPSBzdGFydE9mZnNldCArIG51bUJ5dGVzOwogICAgYnl0ZU9mZnNldCA9IGVuZCAtIDE7CiAgICBpZiAoZXhwZWN0ZWRIaWdoQnl0ZXMgPT0gMSB8fCBudW1CeXRlcyAhPSBleHBlY3RlZEhpZ2hCeXRlcykgewogICAgICByZXR1cm4gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwogICAgfQogICAgLy8gVE9ETyhscnkpOiBtZWFzdXJhYmx5IHNsb3csIGRlY29kZSBjcmVhdGVzIGZpcnN0IGEgVXRmOERlY29kZXIgYW5kIGEKICAgIC8vIF9VdGY4RGVjb2RlciBpbnN0YW5jZS4gQWxzbyB0aGUgc3VibGlzdCBpcyBlYWdlcmx5IGFsbG9jYXRlZC4KICAgIFN0cmluZyBjb2RlUG9pbnQgPQogICAgICAgIHV0ZjguZGVjb2RlKGJ5dGVzLnN1Ymxpc3Qoc3RhcnRPZmZzZXQsIGVuZCksIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgIGlmIChjb2RlUG9pbnQubGVuZ3RoID09IDApIHsKICAgICAgLy8gVGhlIFVURi04IGRlY29kZXIgZGlzY2FyZHMgbGVhZGluZyBCT00gY2hhcmFjdGVycy4KICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGRvbid0IGp1c3QgYXNzdW1lIHRoYXQgcmVtb3ZlZCBjaGFyYWN0ZXJzIHdlcmUgdGhlCiAgICAgIC8vIEJPTS4KICAgICAgYXNzZXJ0KGNvbnRhaW5zQm9tQXQoc3RhcnRPZmZzZXQpKTsKICAgICAgY29kZVBvaW50ID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZUJvbUNoYXJhY3RlclJ1bmUpOwogICAgfQogICAgaWYgKGNvZGVQb2ludC5sZW5ndGggPT0gMSkgewogICAgICB1dGY4U2xhY2sgKz0gKG51bUJ5dGVzIC0gMSk7CiAgICAgIHNjYW5TbGFjayA9IG51bUJ5dGVzIC0gMTsKICAgICAgc2NhblNsYWNrT2Zmc2V0ID0gYnl0ZU9mZnNldDsKICAgICAgcmV0dXJuIGNvZGVQb2ludC5jb2RlVW5pdEF0KDApOwogICAgfSBlbHNlIGlmIChjb2RlUG9pbnQubGVuZ3RoID09IDIpIHsKICAgICAgdXRmOFNsYWNrICs9IChudW1CeXRlcyAtIDIpOwogICAgICBzY2FuU2xhY2sgPSBudW1CeXRlcyAtIDE7CiAgICAgIHNjYW5TbGFja09mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICAgIHN0cmluZ09mZnNldFNsYWNrT2Zmc2V0ID0gYnl0ZU9mZnNldDsKICAgICAgLy8gSW4gY2FzZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLCByZXR1cm4gYSBzaW5nbGUgY29kZSBwb2ludC4KICAgICAgLy8gR3JhY2VmdWxseSBkZWdyYWRlIGdpdmVuIGludmFsaWQgVVRGLTguCiAgICAgIFJ1bmVJdGVyYXRvciBydW5lcyA9IGNvZGVQb2ludC5ydW5lcy5pdGVyYXRvcjsKICAgICAgaWYgKCFydW5lcy5tb3ZlTmV4dCgpKSByZXR1cm4gdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyOwogICAgICBpbnQgY29kZVVuaXQgPSBydW5lcy5jdXJyZW50OwogICAgICByZXR1cm4gIXJ1bmVzLm1vdmVOZXh0KCkgPyBjb2RlVW5pdCA6IHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXI7CiAgICB9CiAgfQoKICBpbnQgbGFzdFVuaWNvZGVPZmZzZXQgPSAtMTsKICBpbnQgY3VycmVudEFzVW5pY29kZShpbnQgbmV4dCkgewogICAgaWYgKG5leHQgPCAxMjgpIHJldHVybiBuZXh0OwogICAgLy8gQ2hlY2sgaWYgY3VycmVudEFzVW5pY29kZSB3YXMgYWxyZWFkeSBpbnZva2VkLgogICAgaWYgKGJ5dGVPZmZzZXQgPT0gbGFzdFVuaWNvZGVPZmZzZXQpIHJldHVybiBuZXh0OwogICAgaW50IHJlcyA9IG5leHRDb2RlUG9pbnQoYnl0ZU9mZnNldCwgbmV4dCk7CiAgICBsYXN0VW5pY29kZU9mZnNldCA9IGJ5dGVPZmZzZXQ7CiAgICByZXR1cm4gcmVzOwogIH0KCiAgdm9pZCBoYW5kbGVVbmljb2RlKGludCBzdGFydFNjYW5PZmZzZXQpIHsKICAgIGludCBlbmQgPSBieXRlT2Zmc2V0OwogICAgLy8gVE9ETyhscnkpOiB0aGlzIG1lYXN1cmFibHkgc2xvd3MgZG93biB0aGUgc2Nhbm5lciBmb3IgZmlsZXMgd2l0aCB1bmljb2RlLgogICAgU3RyaW5nIHMgPQogICAgICAgIHV0ZjguZGVjb2RlKGJ5dGVzLnN1Ymxpc3Qoc3RhcnRTY2FuT2Zmc2V0LCBlbmQpLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CiAgICB1dGY4U2xhY2sgKz0gKGVuZCAtIHN0YXJ0U2Nhbk9mZnNldCkgLSBzLmxlbmd0aDsKICB9CgogIC8qKgogICAqIFRoaXMgZmllbGQgcmVtZW1iZXJzIHRoZSBieXRlIG9mZnNldCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgZGVjb2RlZCB3aXRoCiAgICogW25leHRDb2RlUG9pbnRdIHRoYXQgdXNlZCB0d28gY29kZSB1bml0cyBpbiBVVEYtMTYuCiAgICoKICAgKiBbbmV4dENvZGVQb2ludF0gcmV0dXJucyBhIHNpbmdsZSBjb2RlIHBvaW50IGZvciBlYWNoIHVuaWNvZGUgY2hhcmFjdGVyLAogICAqIGV2ZW4gaWYgaXQgbmVlZHMgdHdvIGNvZGUgdW5pdHMgaW4gVVRGLTE2LgogICAqCiAgICogRm9yIGV4YW1wbGUsICdcdXsxZDExZX0nIHVzZXMgNCBieXRlcyBpbiBVVEYtOCwgYW5kIHR3byBjb2RlIHVuaXRzIGluCiAgICogVVRGLTE2LiBUaGUgW3V0ZjhTbGFja10gaXMgdGhlcmVmb3JlIDIuIEFmdGVyIGludm9raW5nIFtuZXh0Q29kZVBvaW50XSwgdGhlCiAgICogW2J5dGVPZmZzZXRdIHBvaW50cyB0byB0aGUgbGFzdCAob2YgNCkgYnl0ZXMuIFRoZSBbc3RyaW5nT2Zmc2V0XSBzaG91bGQKICAgKiByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgb25lLCB3aGljaCBpcyBvbmUgcG9zaXRpb24gbW9yZSBsZWZ0IHRoYW4KICAgKiB0aGUgW3V0ZjhTbGFja10uCiAgICovCiAgaW50IHN0cmluZ09mZnNldFNsYWNrT2Zmc2V0ID0gLTE7CgogIGludCBnZXQgc3RyaW5nT2Zmc2V0IHsKICAgIGlmIChzdHJpbmdPZmZzZXRTbGFja09mZnNldCA9PSBieXRlT2Zmc2V0KSB7CiAgICAgIHJldHVybiBieXRlT2Zmc2V0IC0gdXRmOFNsYWNrIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBieXRlT2Zmc2V0IC0gdXRmOFNsYWNrOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYW5hbHl6ZXIuU3RyaW5nVG9rZW4gY3JlYXRlU3Vic3RyaW5nVG9rZW4oCiAgICAgIFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pIHsKICAgIHJldHVybiBuZXcgU3RyaW5nVG9rZW4uZnJvbVV0ZjhCeXRlcygKICAgICAgICB0eXBlLCBieXRlcywgc3RhcnQsIGJ5dGVPZmZzZXQgKyBleHRyYU9mZnNldCwgYXNjaWlPbmx5LCB0b2tlblN0YXJ0LAogICAgICAgIHByZWNlZGluZ0NvbW1lbnRzOiBjb21tZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBhbmFseXplci5TdHJpbmdUb2tlbiBjcmVhdGVTeW50aGV0aWNTdWJzdHJpbmdUb2tlbigKICAgICAgVG9rZW5UeXBlIHR5cGUsIGludCBzdGFydCwgYm9vbCBhc2NpaU9ubHksIFN0cmluZyBzeW50aGV0aWNDaGFycykgewogICAgU3RyaW5nIHNvdXJjZSA9IFN0cmluZ1Rva2VuLmRlY29kZVV0ZjgoYnl0ZXMsIHN0YXJ0LCBieXRlT2Zmc2V0LCBhc2NpaU9ubHkpOwogICAgcmV0dXJuIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICB0eXBlLCBzb3VyY2UgKyBzeW50aGV0aWNDaGFycywgdG9rZW5TdGFydCwgc291cmNlLmxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb21tZW50VG9rZW4gY3JlYXRlQ29tbWVudFRva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pIHsKICAgIHJldHVybiBuZXcgQ29tbWVudFRva2VuLmZyb21VdGY4Qnl0ZXMoCiAgICAgICAgdHlwZSwgYnl0ZXMsIHN0YXJ0LCBieXRlT2Zmc2V0ICsgZXh0cmFPZmZzZXQsIGFzY2lpT25seSwgdG9rZW5TdGFydCk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0RG9jVG9rZW4gY3JlYXRlRGFydERvY1Rva2VuKFRva2VuVHlwZSB0eXBlLCBpbnQgc3RhcnQsIGJvb2wgYXNjaWlPbmx5LAogICAgICBbaW50IGV4dHJhT2Zmc2V0ID0gMF0pIHsKICAgIHJldHVybiBuZXcgRGFydERvY1Rva2VuLmZyb21VdGY4Qnl0ZXMoCiAgICAgICAgdHlwZSwgYnl0ZXMsIHN0YXJ0LCBieXRlT2Zmc2V0ICsgZXh0cmFPZmZzZXQsIGFzY2lpT25seSwgdG9rZW5TdGFydCk7CiAgfQoKICBAb3ZlcnJpZGUKICBMYW5ndWFnZVZlcnNpb25Ub2tlbiBjcmVhdGVMYW5ndWFnZVZlcnNpb25Ub2tlbigKICAgICAgaW50IHN0YXJ0LCBpbnQgbWFqb3IsIGludCBtaW5vcikgewogICAgcmV0dXJuIG5ldyBMYW5ndWFnZVZlcnNpb25Ub2tlbi5mcm9tVXRmOEJ5dGVzKAogICAgICAgIGJ5dGVzLCBzdGFydCwgYnl0ZU9mZnNldCwgdG9rZW5TdGFydCwgbWFqb3IsIG1pbm9yKTsKICB9CgogIGJvb2wgYXRFbmRPZkZpbGUoKSA9PiBieXRlT2Zmc2V0ID49IGJ5dGVzLmxlbmd0aCAtIDE7Cn0KgP4ATk48ATgBOgE6ATIBOAEfSAEZSAEETB4EMQYXBSUGEwEGQgVMUC8GFwEGT0pEBUtOTDAGFQEGTgYcAQZLEAYXKSUNGQYEAQZQOAYVAQZJSzAFTUxCBh8rIzZGLx0bHBcWBgQBIzkBKCgsKgQBKAEnAU8gNRsbLyIdIh0iHQ0vBhYyKg8IEgYmGkMqBkxFF0whPEwOKkQGISMgJCYoIyAkLEIxNUEkSQ0qBgQBHiMhNjYvJBAEASwaUQ9QNQQBBk05BU0wBUtRTU4WBiQBGTEpDSUGBAEMLTEfKk0mBAEMNkpRJUMEAQxNHytOBAEMTR8rTgQBDDMpMz0EATgCAT9wYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnRmZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL2RpcmVjdGl2ZV9saXN0ZW5lci5kYXJ0j8svLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIExpc3RlbmVyIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgVG9wTGV2ZWxQYXJzZXJgIHRvIGV4dHJhY3QgdGhlIFVSSXMgb2YKLy8vIGltcG9ydCwgcGFydCwgYW5kIGV4cG9ydCBkaXJlY3RpdmVzLgpsaWJyYXJ5IGZyb250X2VuZC5zcmMuZmFzdGEuc291cmNlLmRpcmVjdGl2ZV9saXN0ZW5lcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2xpc3RlbmVyLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3F1b3RlLmRhcnQnOwppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXA7CgovLy8gTGlzdGVuZXIgdGhhdCByZWNvcmRzIGltcG9ydHMsIGV4cG9ydHMsIGFuZCBwYXJ0IGRpcmVjdGl2ZXMuCi8vLwovLy8gVGhpcyBpcyBub3JtYWxseSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGBUb3BMZXZlbFBhcnNlcmAsIHdoaWNoIHNraXBzCi8vLyBvdmVyIHRoZSBib2R5IG9mIGRlY2xhcmF0aW9ucyBsaWtlIGNsYXNzZXMgYW5kIGZ1bmN0aW9uIHRoYXQgYXJlIGlycmVsZXZhbnQKLy8vIGZvciBkaXJlY3RpdmVzLiBOb3RlIHRoYXQgb24gY29ycmVjdCBwcm9ncmFtcyBkaXJlY3RpdmVzIGNhbm5vdCBvY2N1ciBhZnRlcgovLy8gYW55IHRvcC1sZXZlbCBkZWNsYXJhdGlvbiwgYnV0IHdlIHJlY29tbWVuZCB0byBjb250aW51ZSBwYXJzaW5nIHRoZSBlbnRpcmUKLy8vIGZpbGUgaW4gb3JkZXIgdG8gZ3JhY2VmdWxseSBoYW5kbGUgaW5wdXQgZXJyb3JzLgpjbGFzcyBEaXJlY3RpdmVMaXN0ZW5lciBleHRlbmRzIExpc3RlbmVyIHsKICAvLy8gSW1wb3J0IGRpcmVjdGl2ZXMgd2l0aCBVUklzIGFuZCBjb21iaW5hdG9ycy4KICBmaW5hbCBMaXN0PE5hbWVzcGFjZURpcmVjdGl2ZT4gaW1wb3J0cyA9IDxOYW1lc3BhY2VEaXJlY3RpdmU+W107CgogIC8vLyBFeHBvcnQgZGlyZWN0aXZlcyB3aXRoIFVSSXMgYW5kIGNvbWJpbmF0b3JzLgogIGZpbmFsIExpc3Q8TmFtZXNwYWNlRGlyZWN0aXZlPiBleHBvcnRzID0gPE5hbWVzcGFjZURpcmVjdGl2ZT5bXTsKCiAgLy8vIENvbGxlY3RzIFVSSXMgdGhhdCBvY2N1ciBvbiBhbnkgcGFydCBkaXJlY3RpdmUuCiAgZmluYWwgU2V0PFN0cmluZz4gcGFydHMgPSBuZXcgU2V0PFN0cmluZz4oKTsKCiAgYm9vbCBfaW5QYXJ0ID0gZmFsc2U7CiAgU3RyaW5nIF91cmk7CiAgTGlzdDxOYW1lc3BhY2VDb21iaW5hdG9yPiBfY29tYmluYXRvcnM7CiAgTGlzdDxTdHJpbmc+IF9jb21iaW5hdG9yTmFtZXM7CgogIERpcmVjdGl2ZUxpc3RlbmVyKCk7CgogIEBvdmVycmlkZQogIGJlZ2luRXhwb3J0KFRva2VuIGV4cG9ydCkgewogICAgX2NvbWJpbmF0b3JzID0gPE5hbWVzcGFjZUNvbWJpbmF0b3I+W107CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSGlkZShUb2tlbiBoaWRlKSB7CiAgICBfY29tYmluYXRvck5hbWVzID0gPFN0cmluZz5bXTsKICB9CgogIEBvdmVycmlkZQogIGJlZ2luSW1wb3J0KFRva2VuIGltcG9ydCkgewogICAgX2NvbWJpbmF0b3JzID0gPE5hbWVzcGFjZUNvbWJpbmF0b3I+W107CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgaWYgKF9jb21iaW5hdG9ycyAhPSBudWxsIHx8IF9pblBhcnQpIHsKICAgICAgX3VyaSA9IHVuZXNjYXBlU3RyaW5nKHRva2VuLmxleGVtZSwgdG9rZW4sIHRoaXMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgYmVnaW5QYXJ0KFRva2VuIHBhcnQpIHsKICAgIF9pblBhcnQgPSB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblNob3coVG9rZW4gc2hvdykgewogICAgX2NvbWJpbmF0b3JOYW1lcyA9IDxTdHJpbmc+W107CiAgfQoKICBAb3ZlcnJpZGUKICBlbmRFeHBvcnQoVG9rZW4gZXhwb3J0LCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGV4cG9ydHMuYWRkKG5ldyBOYW1lc3BhY2VEaXJlY3RpdmUuZXhwb3J0KF91cmksIF9jb21iaW5hdG9ycykpOwogICAgX3VyaSA9IG51bGw7CiAgICBfY29tYmluYXRvcnMgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGUpIHsKICAgIF9jb21iaW5hdG9ycy5hZGQobmV3IE5hbWVzcGFjZUNvbWJpbmF0b3IuaGlkZShfY29tYmluYXRvck5hbWVzKSk7CiAgICBfY29tYmluYXRvck5hbWVzID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIGVuZEltcG9ydChUb2tlbiBpbXBvcnQsIFRva2VuIHNlbWljb2xvbikgewogICAgaW1wb3J0cy5hZGQobmV3IE5hbWVzcGFjZURpcmVjdGl2ZS5pbXBvcnQoX3VyaSwgX2NvbWJpbmF0b3JzKSk7CiAgICBfdXJpID0gbnVsbDsKICAgIF9jb21iaW5hdG9ycyA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBlbmRQYXJ0KFRva2VuIHBhcnQsIFRva2VuIHNlbWljb2xvbikgewogICAgcGFydHMuYWRkKF91cmkpOwogICAgX3VyaSA9IG51bGw7CiAgICBfaW5QYXJ0ID0gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvdykgewogICAgX2NvbWJpbmF0b3JzLmFkZChuZXcgTmFtZXNwYWNlQ29tYmluYXRvci5zaG93KF9jb21iaW5hdG9yTmFtZXMpKTsKICAgIF9jb21iaW5hdG9yTmFtZXMgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBpZiAoX2NvbWJpbmF0b3JOYW1lcyAhPSBudWxsICYmIGNvbnRleHQgPT0gSWRlbnRpZmllckNvbnRleHQuY29tYmluYXRvcikgewogICAgICBfY29tYmluYXRvck5hbWVzLmFkZCh0b2tlbi5sZXhlbWUpOwogICAgfQogIH0KCiAgLy8vIEJ5IGRlZmF1bHQsIG5hdGl2ZSBjbGF1c2VzIGFyZSBub3QgaGFuZGxlZCBhbmQgYW4gZXJyb3IgaXMgdGhyb3duLgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBzdXBlci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgIG1lc3NhZ2VFeHBlY3RlZEJsb2NrVG9Ta2lwLCBuYXRpdmVUb2tlbiwgbmF0aXZlVG9rZW4pOwogIH0KfQoKY2xhc3MgTmFtZXNwYWNlQ29tYmluYXRvciB7CiAgZmluYWwgYm9vbCBpc1Nob3c7CiAgZmluYWwgU2V0PFN0cmluZz4gbmFtZXM7CgogIE5hbWVzcGFjZUNvbWJpbmF0b3IuaGlkZShMaXN0PFN0cmluZz4gbmFtZXMpCiAgICAgIDogaXNTaG93ID0gZmFsc2UsCiAgICAgICAgbmFtZXMgPSBuYW1lcy50b1NldCgpOwoKICBOYW1lc3BhY2VDb21iaW5hdG9yLnNob3coTGlzdDxTdHJpbmc+IG5hbWVzKQogICAgICA6IGlzU2hvdyA9IHRydWUsCiAgICAgICAgbmFtZXMgPSBuYW1lcy50b1NldCgpOwp9CgpjbGFzcyBOYW1lc3BhY2VEaXJlY3RpdmUgewogIGZpbmFsIGJvb2wgaXNJbXBvcnQ7CiAgZmluYWwgU3RyaW5nIHVyaTsKICBmaW5hbCBMaXN0PE5hbWVzcGFjZUNvbWJpbmF0b3I+IGNvbWJpbmF0b3JzOwoKICBOYW1lc3BhY2VEaXJlY3RpdmUuZXhwb3J0KHRoaXMudXJpLCB0aGlzLmNvbWJpbmF0b3JzKSA6IGlzSW1wb3J0ID0gZmFsc2U7CgogIE5hbWVzcGFjZURpcmVjdGl2ZS5pbXBvcnQodGhpcy51cmksIHRoaXMuY29tYmluYXRvcnMpIDogaXNJbXBvcnQgPSB0cnVlOwp9CoCOAE5OPAFOKTcBSEk/PD4BQQRQUFBPNSszQwEzQwE2LwEYDyohARcBDB4sBAEMHyMEAQweLAQBDCkrOAYEAQwaFAQBDB8jBAEMLUQRGQQBDB1GHQQBDC1EERkEAQwpFREVBAEMHUYdBAEMQk8qBgQBSQxNIj8EAgEcFRsBLxgfAS8XHwIBGxcULwFMAUsCATpwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL2RpcmVjdGl2ZV9saXN0ZW5lci5kYXJ0Z2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF9maWVsZF90eXBlLmRhcnSW5i8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmltcGxpY2l0X3R5cGU7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2Fzc3VtcHRpb25zLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9sZWdhY3lfZXJhc3VyZS5kYXJ0JzsKCmltcG9ydCAnLi4vYnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2NvbnN0YW50X2NvbnRleHQuZGFydCc7CmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCc7CmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bnN1cHBvcnRlZDsKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnOwppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hLmRhcnQnOwppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JzsKCmFic3RyYWN0IGNsYXNzIEltcGxpY2l0RmllbGRUeXBlIGV4dGVuZHMgRGFydFR5cGUgewogIFNvdXJjZUZpZWxkQnVpbGRlciBnZXQgZmllbGRCdWlsZGVyOwoKICBJbXBsaWNpdEZpZWxkVHlwZS5fKCk7CgogIGZhY3RvcnkgSW1wbGljaXRGaWVsZFR5cGUoCiAgICAgICAgICBTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyLCBUb2tlbiBpbml0aWFsaXplclRva2VuKSA9CiAgICAgIF9JbXBsaWNpdEZpZWxkVHlwZVJvb3Q7CgogIEBvdmVycmlkZQogIE51bGxhYmlsaXR5IGdldCBudWxsYWJpbGl0eSA9PgogICAgICB1bnN1cHBvcnRlZCgibnVsbGFiaWxpdHkiLCBmaWVsZEJ1aWxkZXIuY2hhck9mZnNldCwgZmllbGRCdWlsZGVyLmZpbGVVcmkpOwoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDxSPihEYXJ0VHlwZVZpc2l0b3I8Uj4gdikgewogICAgdGhyb3cgdW5zdXBwb3J0ZWQoImFjY2VwdCIsIGZpZWxkQnVpbGRlci5jaGFyT2Zmc2V0LCBmaWVsZEJ1aWxkZXIuZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBSIGFjY2VwdDE8UiwgQT4oRGFydFR5cGVWaXNpdG9yMTxSLCBBPiB2LCBhcmcpIHsKICAgIHRocm93IHVuc3VwcG9ydGVkKCJhY2NlcHQxIiwgZmllbGRCdWlsZGVyLmNoYXJPZmZzZXQsIGZpZWxkQnVpbGRlci5maWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0Q2hpbGRyZW4oVmlzaXRvcjxPYmplY3Q+IHYpIHsKICAgIHVuc3VwcG9ydGVkKCJ2aXNpdENoaWxkcmVuIiwgZmllbGRCdWlsZGVyLmNoYXJPZmZzZXQsIGZpZWxkQnVpbGRlci5maWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIEltcGxpY2l0RmllbGRUeXBlIHdpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSkgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKAogICAgICAgICJ3aXRoTnVsbGFiaWxpdHkiLCBmaWVsZEJ1aWxkZXIuY2hhck9mZnNldCwgZmllbGRCdWlsZGVyLmZpbGVVcmkpOwogIH0KCiAgdm9pZCBhZGRPdmVycmlkZShJbXBsaWNpdEZpZWxkVHlwZSBvdGhlcik7CgogIERhcnRUeXBlIGNoZWNrSW5mZXJyZWQoRGFydFR5cGUgdHlwZSk7CgogIEBvdmVycmlkZQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PiBlcXVhbHMob3RoZXIsIG51bGwpOwoKICBAb3ZlcnJpZGUKICBib29sIGVxdWFscyhPYmplY3Qgb3RoZXIsIEFzc3VtcHRpb25zIGFzc3VtcHRpb25zKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgSW1wbGljaXRGaWVsZFR5cGUgJiYgZmllbGRCdWlsZGVyID09IG90aGVyLmZpZWxkQnVpbGRlcjsKICB9CgogIEBvdmVycmlkZQogIGludCBnZXQgaGFzaENvZGUgPT4gZmllbGRCdWlsZGVyLmhhc2hDb2RlOwoKICBEYXJ0VHlwZSBpbmZlclR5cGUoKTsKCiAgRGFydFR5cGUgY29tcHV0ZVR5cGUoKTsKfQoKY2xhc3MgX0ltcGxpY2l0RmllbGRUeXBlUm9vdCBleHRlbmRzIEltcGxpY2l0RmllbGRUeXBlIHsKICBmaW5hbCBTb3VyY2VGaWVsZEJ1aWxkZXIgZmllbGRCdWlsZGVyOwogIExpc3Q8SW1wbGljaXRGaWVsZFR5cGU+IF9vdmVycmlkZGVuRmllbGRzOwogIFRva2VuIGluaXRpYWxpemVyVG9rZW47CiAgYm9vbCBpc1N0YXJ0ZWQgPSBmYWxzZTsKCiAgX0ltcGxpY2l0RmllbGRUeXBlUm9vdCh0aGlzLmZpZWxkQnVpbGRlciwgdGhpcy5pbml0aWFsaXplclRva2VuKSA6IHN1cGVyLl8oKTsKCiAgRGFydFR5cGUgaW5mZXJUeXBlKCkgewogICAgcmV0dXJuIGZpZWxkQnVpbGRlci5pbmZlclR5cGUoKTsKICB9CgogIERhcnRUeXBlIGNvbXB1dGVUeXBlKCkgewogICAgaWYgKGlzU3RhcnRlZCkgewogICAgICBmaWVsZEJ1aWxkZXIubGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9DaXJjdWxhcml0eQogICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZpZWxkQnVpbGRlci5uYW1lKSwKICAgICAgICAgIGZpZWxkQnVpbGRlci5jaGFyT2Zmc2V0LAogICAgICAgICAgZmllbGRCdWlsZGVyLm5hbWUubGVuZ3RoLAogICAgICAgICAgZmllbGRCdWlsZGVyLmZpbGVVcmkpOwogICAgICByZXR1cm4gZmllbGRCdWlsZGVyLmZpZWxkVHlwZSA9IGNvbnN0IEludmFsaWRUeXBlKCk7CiAgICB9CiAgICBpc1N0YXJ0ZWQgPSB0cnVlOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlOwogICAgaWYgKF9vdmVycmlkZGVuRmllbGRzICE9IG51bGwpIHsKICAgICAgZm9yIChJbXBsaWNpdEZpZWxkVHlwZSBvdmVycmlkZGVuIGluIF9vdmVycmlkZGVuRmllbGRzKSB7CiAgICAgICAgRGFydFR5cGUgb3ZlcnJpZGRlblR5cGUgPSBvdmVycmlkZGVuLmluZmVyVHlwZSgpOwogICAgICAgIGlmICghZmllbGRCdWlsZGVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgICAgb3ZlcnJpZGRlblR5cGUgPSBsZWdhY3lFcmFzdXJlKAogICAgICAgICAgICAgIGZpZWxkQnVpbGRlci5saWJyYXJ5LmxvYWRlci5jb3JlVHlwZXMsIG92ZXJyaWRkZW5UeXBlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZmVycmVkVHlwZSA9PSBudWxsKSB7CiAgICAgICAgICBpbmZlcnJlZFR5cGUgPSBvdmVycmlkZGVuVHlwZTsKICAgICAgICB9IGVsc2UgaWYgKGluZmVycmVkVHlwZSAhPSBvdmVycmlkZGVuVHlwZSkgewogICAgICAgICAgaW5mZXJyZWRUeXBlID0gY29uc3QgSW52YWxpZFR5cGUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGluZmVycmVkVHlwZTsKICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIEludGVyZmFjZVR5cGUgZW5jbG9zaW5nQ2xhc3NUaGlzVHlwZSA9CiAgICAgICAgICBmaWVsZEJ1aWxkZXIuZmllbGQuZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbAogICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgIDogZmllbGRCdWlsZGVyLmxpYnJhcnkubG9hZGVyLnR5cGVJbmZlcmVuY2VFbmdpbmUuY29yZVR5cGVzCiAgICAgICAgICAgICAgICAgIC50aGlzSW50ZXJmYWNlVHlwZShmaWVsZEJ1aWxkZXIuZmllbGQuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICBmaWVsZEJ1aWxkZXIuZmllbGQuZW5jbG9zaW5nTGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgIFR5cGVJbmZlcnJlckltcGwgdHlwZUluZmVycmVyID0gZmllbGRCdWlsZGVyCiAgICAgICAgICAubGlicmFyeS5sb2FkZXIudHlwZUluZmVyZW5jZUVuZ2luZQogICAgICAgICAgLmNyZWF0ZVRvcExldmVsVHlwZUluZmVycmVyKAogICAgICAgICAgICAgIGZpZWxkQnVpbGRlci5maWxlVXJpLAogICAgICAgICAgICAgIGVuY2xvc2luZ0NsYXNzVGhpc1R5cGUsCiAgICAgICAgICAgICAgZmllbGRCdWlsZGVyLmxpYnJhcnksCiAgICAgICAgICAgICAgZmllbGRCdWlsZGVyLmRhdGFGb3JUZXN0aW5nPy5pbmZlcmVuY2VEYXRhKTsKICAgICAgQm9keUJ1aWxkZXIgYm9keUJ1aWxkZXIgPSBmaWVsZEJ1aWxkZXIubGlicmFyeS5sb2FkZXIKICAgICAgICAgIC5jcmVhdGVCb2R5QnVpbGRlckZvckZpZWxkKGZpZWxkQnVpbGRlciwgdHlwZUluZmVycmVyKTsKICAgICAgYm9keUJ1aWxkZXIuY29uc3RhbnRDb250ZXh0ID0gZmllbGRCdWlsZGVyLmlzQ29uc3QKICAgICAgICAgID8gQ29uc3RhbnRDb250ZXh0LmluZmVycmVkCiAgICAgICAgICA6IENvbnN0YW50Q29udGV4dC5ub25lOwogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0KICAgICAgICAgIGJvZHlCdWlsZGVyLnBhcnNlRmllbGRJbml0aWFsaXplcihpbml0aWFsaXplclRva2VuKTsKICAgICAgaW5pdGlhbGl6ZXJUb2tlbiA9IG51bGw7CgogICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IHR5cGVJbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBpbml0aWFsaXplciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpbmZlcnJlZFR5cGUgPSB0eXBlSW5mZXJyZXIuaW5mZXJEZWNsYXJhdGlvblR5cGUocmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlZFR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgcmV0dXJuIGluZmVycmVkVHlwZTsKICB9CgogIHZvaWQgYWRkT3ZlcnJpZGUoSW1wbGljaXRGaWVsZFR5cGUgb3RoZXIpIHsKICAgIF9vdmVycmlkZGVuRmllbGRzID8/PSBbXTsKICAgIF9vdmVycmlkZGVuRmllbGRzLmFkZChvdGhlcik7CiAgfQoKICBEYXJ0VHlwZSBjaGVja0luZmVycmVkKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmIChfb3ZlcnJpZGRlbkZpZWxkcyAhPSBudWxsKSB7CiAgICAgIGZvciAoSW1wbGljaXRGaWVsZFR5cGUgb3ZlcnJpZGRlbiBpbiBfb3ZlcnJpZGRlbkZpZWxkcykgewogICAgICAgIERhcnRUeXBlIG92ZXJyaWRkZW5UeXBlID0gb3ZlcnJpZGRlbi5pbmZlclR5cGUoKTsKICAgICAgICBpZiAoIWZpZWxkQnVpbGRlci5saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgICAgIG92ZXJyaWRkZW5UeXBlID0gbGVnYWN5RXJhc3VyZSgKICAgICAgICAgICAgICBmaWVsZEJ1aWxkZXIubGlicmFyeS5sb2FkZXIuY29yZVR5cGVzLCBvdmVycmlkZGVuVHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlICE9IG92ZXJyaWRkZW5UeXBlKSB7CiAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpZWxkQnVpbGRlci5mdWxsTmFtZUZvckVycm9yczsKICAgICAgICAgIGZpZWxkQnVpbGRlci5jbGFzc0J1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlcwogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICBmaWVsZEJ1aWxkZXIuY2hhck9mZnNldCwKICAgICAgICAgICAgICBuYW1lLmxlbmd0aCwKICAgICAgICAgICAgICB3YXNIYW5kbGVkOiB0cnVlKTsKICAgICAgICAgIHJldHVybiBjb25zdCBJbnZhbGlkVHlwZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnSW1wbGljaXRGaWVsZFR5cGUoJGZpZWxkQnVpbGRlciknOwp9CoC0AE5OPAEdAUgBMAEuMQEoIx4sLy0cATQnARkBHUUeAQwhUQEMJlAEAQwzUQQBDCVRBAEMPxhLBAEtASkBDDkBDDctTQQBDC0BGAEaAgE5KS0aGgFQARklBAEbFScwMSMkITsGFhslQDo8KkYKJCk1LgoIGystNBVKSEgzLickJiQ7PEI5JSIfPx8BRzIgTQ0qBhkEAS4eIgQBKiVAOjwqRgomODA+KCcbISYKCAYRBAEMOwIBO3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvaW1wbGljaXRfZmllbGRfdHlwZS5kYXJ0a2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfdmFyaWFibGVfYnVpbGRlci5kYXJ0hDsvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5rZXJuZWxfdmFyaWFibGVfYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgVmFyaWFibGVEZWNsYXJhdGlvbjsKCmltcG9ydCAnLi4vYnVpbGRlci9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIFZhcmlhYmxlQnVpbGRlckltcGwgZXh0ZW5kcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIFZhcmlhYmxlQnVpbGRlciB7CiAgQG92ZXJyaWRlCiAgZmluYWwgQnVpbGRlciBwYXJlbnQ7CgogIEBvdmVycmlkZQogIGZpbmFsIFVyaSBmaWxlVXJpOwoKICBAb3ZlcnJpZGUKICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwoKICBWYXJpYWJsZUJ1aWxkZXJJbXBsKHRoaXMudmFyaWFibGUsIHRoaXMucGFyZW50LCB0aGlzLmZpbGVVcmkpOwoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGNoYXJPZmZzZXQgPT4gdmFyaWFibGUuZmlsZU9mZnNldDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNMb2NhbCA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc0NvbnN0ID0+IHZhcmlhYmxlLmlzQ29uc3Q7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzRmluYWwgPT4gdmFyaWFibGUuaXNGaW5hbDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlID0+IHZhcmlhYmxlLmlzQXNzaWduYWJsZTsKCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiB2YXJpYWJsZS5uYW1lID8/ICI8dW5uYW1lZD4iOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnVmFyaWFibGVCdWlsZGVySW1wbCgkZnVsbE5hbWVGb3JFcnJvcnMpJzsKfQouAE5OPAEnATsBIisBSwwYAQwVAQwmAUEBDC0BDBwBDCgBDCgBDDIBDEABDEICAT9wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF92YXJpYWJsZV9idWlsZGVyLmRhcnRoZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2xvYWRfbGlicmFyeV9idWlsZGVyLmRhcnSJPy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvbk5vZGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMb2FkTGlicmFyeSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgUHJvY2VkdXJlS2luZCwKICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnIHNob3cgU291cmNlTGlicmFyeUJ1aWxkZXI7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnZm9yZXN0LmRhcnQnIHNob3cgRm9yZXN0OwoKLy8vIEJ1aWxkZXIgdG8gcmVwcmVzZW50IHRoZSBgZGVmZXJMaWJyYXJ5LmxvYWRMaWJyYXJ5YCBjYWxscyBhbmQgdGVhci1vZmZzLgpjbGFzcyBMb2FkTGlicmFyeUJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVySW1wbCB7CiAgZmluYWwgU291cmNlTGlicmFyeUJ1aWxkZXIgcGFyZW50OwoKICBmaW5hbCBMaWJyYXJ5RGVwZW5kZW5jeSBpbXBvcnREZXBlbmRlbmN5OwoKICAvLy8gT2Zmc2V0IG9mIHRoZSBpbXBvcnQgcHJlZml4LgogIGZpbmFsIGludCBjaGFyT2Zmc2V0OwoKICAvLy8gU3ludGhldGljIHN0YXRpYyBtZXRob2QgdG8gcmVwcmVzZW50IHRoZSB0ZWFyLW9mZiBvZiAnbG9hZExpYnJhcnknLiAgSWYKICAvLy8gbnVsbCwgbm8gdGVhci1vZmZzIHdlcmUgc2VlbiBpbiB0aGUgY29kZSBhbmQgbm8gbWV0aG9kIGlzIGdlbmVyYXRlZC4KICBNZW1iZXIgdGVhcm9mZjsKCiAgTG9hZExpYnJhcnlCdWlsZGVyKHRoaXMucGFyZW50LCB0aGlzLmltcG9ydERlcGVuZGVuY3ksIHRoaXMuY2hhck9mZnNldCk7CgogIFVyaSBnZXQgZmlsZVVyaSA9PiBwYXJlbnQuZmlsZVVyaTsKCiAgTG9hZExpYnJhcnkgY3JlYXRlTG9hZExpYnJhcnkoCiAgICAgIGludCBjaGFyT2Zmc2V0LCBGb3Jlc3QgZm9yZXN0LCBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gZm9yZXN0LmNyZWF0ZUxvYWRMaWJyYXJ5KGNoYXJPZmZzZXQsIGltcG9ydERlcGVuZGVuY3ksIGFyZ3VtZW50cyk7CiAgfQoKICBQcm9jZWR1cmUgY3JlYXRlVGVhcm9mZk1ldGhvZChGb3Jlc3QgZm9yZXN0KSB7CiAgICBpZiAodGVhcm9mZiAhPSBudWxsKSByZXR1cm4gdGVhcm9mZjsKICAgIExvYWRMaWJyYXJ5IGV4cHJlc3Npb24gPSBjcmVhdGVMb2FkTGlicmFyeShjaGFyT2Zmc2V0LCBmb3Jlc3QsIG51bGwpOwogICAgU3RyaW5nIHByZWZpeCA9IGV4cHJlc3Npb24uaW1wb3J0Lm5hbWU7CiAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZSgnXyNsb2FkTGlicmFyeV8kcHJlZml4JywgcGFyZW50LmxpYnJhcnkpOwogICAgUHJvY2VkdXJlIHJlZmVyZW5jZXNGcm9tID0KICAgICAgICBwYXJlbnQubG9va3VwTGlicmFyeVJlZmVyZW5jZVByb2NlZHVyZShuYW1lLm5hbWUsIGZhbHNlKTsKICAgIHRlYXJvZmYgPSBuZXcgUHJvY2VkdXJlKAogICAgICAgIG5hbWUsCiAgICAgICAgUHJvY2VkdXJlS2luZC5NZXRob2QsCiAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZShuZXcgUmV0dXJuU3RhdGVtZW50KGV4cHJlc3Npb24pLAogICAgICAgICAgICByZXR1cm5UeXBlOiBuZXcgSW50ZXJmYWNlVHlwZShwYXJlbnQubG9hZGVyLmNvcmVUeXBlcy5mdXR1cmVDbGFzcywKICAgICAgICAgICAgICAgIHBhcmVudC5ub25OdWxsYWJsZSwgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpXSkpLAogICAgICAgIGZpbGVVcmk6IHBhcmVudC5saWJyYXJ5LmZpbGVVcmksCiAgICAgICAgaXNTdGF0aWM6IHRydWUsCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VzRnJvbT8ucmVmZXJlbmNlKQogICAgICAuLnN0YXJ0RmlsZU9mZnNldCA9IGNoYXJPZmZzZXQKICAgICAgLi5maWxlT2Zmc2V0ID0gY2hhck9mZnNldAogICAgICAuLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBwYXJlbnQuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKICAgIHJldHVybiB0ZWFyb2ZmOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RyaW5nIGdldCBmdWxsTmFtZUZvckVycm9ycyA9PiAnbG9hZExpYnJhcnknOwp9CkoATk48ASEJExIVFhcbFRAOExcZAUoBIgEiAU0vJQEsASMYAU5LEgFLASUBITxOBAExKUosQx9CHQ4eOk9HKRguJSBAFAQBDDECATxwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2xvYWRfbGlicmFyeV9idWlsZGVyLmRhcnRxZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnSn0i8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UubWQgZmlsZS4KCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9mbG93X2FuYWx5c2lzL2Zsb3dfYW5hbHlzaXMuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIERhcnRUeXBlVmlzaXRvciwKICAgICAgICBGaWVsZCwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIE5ldmVyVHlwZSwKICAgICAgICBOdWxsYWJpbGl0eSwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICAgICAgVmFyaWFuY2U7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwoKaW1wb3J0ICcuLi8uLi9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0JyBzaG93IEluc3RydW1lbnRhdGlvbjsKCmltcG9ydCAnLi4vYnVpbGRlci9jb25zdHJ1Y3Rvcl9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9rZXJuZWwvZm9yZXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLCBJbXBsaWNpdEZpZWxkVHlwZTsKCmltcG9ydCAnLi4vc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcgc2hvdyBTb3VyY2VMaWJyYXJ5QnVpbGRlcjsKCmltcG9ydCAndHlwZV9pbmZlcnJlci5kYXJ0JzsKCmltcG9ydCAndHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydCcgc2hvdyBUeXBlU2NoZW1hRW52aXJvbm1lbnQ7CgovLy8gVmlzaXRvciB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gdHlwZSBtZW50aW9ucyBhbnkgb2YgYSBjbGFzcydzIHR5cGUKLy8vIHBhcmFtZXRlcnMgaW4gYSBub24tY292YXJpYW50IGZhc2hpb24uCmNsYXNzIEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSBleHRlbmRzIERhcnRUeXBlVmlzaXRvcjxib29sPiB7CiAgaW50IF92YXJpYW5jZTsKCiAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiBfdHlwZVBhcmFtZXRlcnNUb1NlYXJjaEZvcjsKCiAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5KHRoaXMuX3R5cGVQYXJhbWV0ZXJzVG9TZWFyY2hGb3IsCiAgICAgIHtpbnQgaW5pdGlhbFZhcmlhbmNlfSkKICAgICAgOiBfdmFyaWFuY2UgPSBpbml0aWFsVmFyaWFuY2U7CgogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICBpbnQgb2xkVmFyaWFuY2UgPSBfdmFyaWFuY2U7CiAgICBfdmFyaWFuY2UgPSBWYXJpYW5jZS5pbnZhcmlhbnQ7CiAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyIGluIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgaWYgKHBhcmFtZXRlci5ib3VuZC5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgX3ZhcmlhbmNlID0gVmFyaWFuY2UuY29tYmluZShWYXJpYW5jZS5jb250cmF2YXJpYW50LCBvbGRWYXJpYW5jZSk7CiAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlciBpbiBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChwYXJhbWV0ZXIuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoTmFtZWRUeXBlIHBhcmFtZXRlciBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW1ldGVyLnR5cGUuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF92YXJpYW5jZSA9IG9sZFZhcmlhbmNlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBpbnQgb2xkVmFyaWFuY2UgPSBfdmFyaWFuY2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBfdmFyaWFuY2UgPSBWYXJpYW5jZS5jb21iaW5lKAogICAgICAgICAgbm9kZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnNbaV0udmFyaWFuY2UsIG9sZFZhcmlhbmNlKTsKICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50c1tpXS5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgX3ZhcmlhbmNlID0gb2xkVmFyaWFuY2U7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5vZGUudW5hbGlhcy5hY2NlcHQodGhpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuICFWYXJpYW5jZS5ncmVhdGVyVGhhbk9yRXF1YWwoX3ZhcmlhbmNlLCBub2RlLnBhcmFtZXRlci52YXJpYW5jZSkgJiYKICAgICAgICBfdHlwZVBhcmFtZXRlcnNUb1NlYXJjaEZvci5jb250YWlucyhub2RlLnBhcmFtZXRlcik7CiAgfQp9CgovLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGdsb2JhbCBzdGF0ZSBmb3IgdGhlIHR5cGUgaW5mZXJlbmNlIHRoYXQgb2NjdXJzIG91dHNpZGUKLy8vIG9mIG1ldGhvZCBib2RpZXMgYW5kIGluaXRpYWxpemVycy4KLy8vCi8vLyBUaGlzIGNsYXNzIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGZvciB1c2UgYnkgY2xpZW50cyBvZiB0eXBlIGluZmVyZW5jZQovLy8gKGUuZy4gRGlldExpc3RlbmVyKS4gIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgZGVyaXZlIGZyb20KLy8vIFtUeXBlSW5mZXJlbmNlRW5naW5lSW1wbF0uCmFic3RyYWN0IGNsYXNzIFR5cGVJbmZlcmVuY2VFbmdpbmUgewogIENsYXNzSGllcmFyY2h5IGNsYXNzSGllcmFyY2h5OwoKICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5QnVpbGRlcjsKCiAgQ29yZVR5cGVzIGNvcmVUeXBlczsKCiAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogU2hhcmVkIHRoaXMgd2l0aCB0aGUgQm9keUJ1aWxkZXIuCiAgZmluYWwgRm9yZXN0IGZvcmVzdCA9IGNvbnN0IEZvcmVzdCgpOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlICJwcmVwYXJlIiBwaGFzZSBvZiB0eXBlIGluZmVyZW5jZSBpcyBjb21wbGV0ZS4KICBib29sIGlzVHlwZUluZmVyZW5jZVByZXBhcmVkID0gZmFsc2U7CgogIFR5cGVTY2hlbWFFbnZpcm9ubWVudCB0eXBlU2NoZW1hRW52aXJvbm1lbnQ7CgogIC8vLyBBIG1hcCBjb250YWluaW5nIGNvbnN0cnVjdG9ycyB3aXRoIGluaXRpYWxpemluZyBmb3JtYWxzIHdob3NlIHR5cGVzCiAgLy8vIG5lZWQgdG8gYmUgaW5mZXJyZWQuCiAgLy8vCiAgLy8vIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXMgYSBtYXAgZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGl0cyBsaWJyYXJ5CiAgLy8vIGJ1aWxkZXIgYmVjYXVzZSB0aGUgYnVpbGRlciBpcyB1c2VkIHRvIHJlcG9ydCBlcnJvcnMgZHVlIHRvIGN5Y2xpYwogIC8vLyBpbmZlcmVuY2UgZGVwZW5kZW5jaWVzLgogIGZpbmFsIE1hcDxDb25zdHJ1Y3RvciwgQ29uc3RydWN0b3JCdWlsZGVyPiB0b0JlSW5mZXJyZWQgPSB7fTsKCiAgLy8vIEEgbWFwIGNvbnRhaW5pbmcgY29uc3RydWN0b3JzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGluZmVycmVkLgogIC8vLwogIC8vLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGN5Y2xpYyBpbmZlcmVuY2UgZGVwZW5kZW5jaWVzLiAgSXQgaXMgcmVwcmVzZW50ZWQKICAvLy8gYXMgYSBtYXAgZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGl0cyBsaWJyYXJ5IGJ1aWxkZXIgYmVjYXVzZSB0aGUgYnVpbGRlcgogIC8vLyBpcyB1c2VkIHRvIHJlcG9ydCBlcnJvcnMuCiAgZmluYWwgTWFwPENvbnN0cnVjdG9yLCBDb25zdHJ1Y3RvckJ1aWxkZXI+IGJlaW5nSW5mZXJyZWQgPSB7fTsKCiAgZmluYWwgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbjsKCiAgVHlwZUluZmVyZW5jZUVuZ2luZSh0aGlzLmluc3RydW1lbnRhdGlvbik7CgogIC8vLyBDcmVhdGVzIGEgdHlwZSBpbmZlcnJlciBmb3IgdXNlIGluc2lkZSBvZiBhIG1ldGhvZCBib2R5IGRlY2xhcmVkIGluIGEgZmlsZQogIC8vLyB3aXRoIHRoZSBnaXZlbiBbdXJpXS4KICBUeXBlSW5mZXJyZXIgY3JlYXRlTG9jYWxUeXBlSW5mZXJyZXIoVXJpIHVyaSwgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSwKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgSW5mZXJlbmNlRGF0YUZvclRlc3RpbmcgZGF0YUZvclRlc3RpbmcpOwoKICAvLy8gQ3JlYXRlcyBhIFtUeXBlSW5mZXJyZXJdIG9iamVjdCB3aGljaCBpcyByZWFkeSB0byBwZXJmb3JtIHR5cGUgaW5mZXJlbmNlCiAgLy8vIG9uIHRoZSBnaXZlbiBbZmllbGRdLgogIFR5cGVJbmZlcnJlciBjcmVhdGVUb3BMZXZlbFR5cGVJbmZlcnJlcihVcmkgdXJpLCBJbnRlcmZhY2VUeXBlIHRoaXNUeXBlLAogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCBJbmZlcmVuY2VEYXRhRm9yVGVzdGluZyBkYXRhRm9yVGVzdGluZyk7CgogIC8vLyBQZXJmb3JtcyB0aGUgdGhpcmQgcGhhc2Ugb2YgdG9wIGxldmVsIGluZmVyZW5jZSwgd2hpY2ggaXMgdG8gdmlzaXQgYWxsCiAgLy8vIGNvbnN0cnVjdG9ycyBzdGlsbCBuZWVkaW5nIGluZmVyZW5jZSBhbmQgaW5mZXIgdGhlIHR5cGVzIG9mIHRoZWlyCiAgLy8vIGluaXRpYWxpemluZyBmb3JtYWxzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzLgogIHZvaWQgZmluaXNoVG9wTGV2ZWxJbml0aWFsaXppbmdGb3JtYWxzKCkgewogICAgLy8gRmllbGQgdHlwZXMgaGF2ZSBhbGwgYmVlbiBpbmZlcnJlZCBzbyB3ZSBkb24ndCBuZWVkIHRvIGd1YXJkIGFnYWluc3QKICAgIC8vIGN5Y2xpYyBkZXBlbmRlbmN5LgogICAgdG9CZUluZmVycmVkLnZhbHVlcy5mb3JFYWNoKChDb25zdHJ1Y3RvckJ1aWxkZXIgYnVpbGRlcikgewogICAgICBidWlsZGVyLmluZmVyRm9ybWFsVHlwZXMoKTsKICAgIH0pOwogICAgdG9CZUluZmVycmVkLmNsZWFyKCk7CiAgfQoKICAvLy8gR2V0cyByZWFkeSB0byBkbyB0b3AgbGV2ZWwgdHlwZSBpbmZlcmVuY2UgZm9yIHRoZSBjb21wb25lbnQgaGF2aW5nIHRoZQogIC8vLyBnaXZlbiBbaGllcmFyY2h5XSwgdXNpbmcgdGhlIGdpdmVuIFtjb3JlVHlwZXNdLgogIHZvaWQgcHJlcGFyZVRvcExldmVsKENvcmVUeXBlcyBjb3JlVHlwZXMsIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeSkgewogICAgdGhpcy5jb3JlVHlwZXMgPSBjb3JlVHlwZXM7CiAgICB0aGlzLmNsYXNzSGllcmFyY2h5ID0gaGllcmFyY2h5OwogICAgdGhpcy50eXBlU2NoZW1hRW52aXJvbm1lbnQgPQogICAgICAgIG5ldyBUeXBlU2NoZW1hRW52aXJvbm1lbnQoY29yZVR5cGVzLCBoaWVyYXJjaHkpOwogIH0KCiAgc3RhdGljIE1lbWJlciByZXNvbHZlSW5mZXJlbmNlTm9kZShNZW1iZXIgbWVtYmVyKSB7CiAgICBpZiAobWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBtZW1iZXIudHlwZTsKICAgICAgaWYgKHR5cGUgaXMgSW1wbGljaXRGaWVsZFR5cGUpIHsKICAgICAgICB0eXBlLmluZmVyVHlwZSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWVtYmVyOwogIH0KfQoKLy8vIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlSW5mZXJlbmNlRW5naW5lXSBzcGVjaWFsaXplZCB0byB3b3JrIHdpdGgKLy8vIGtlcm5lbCBvYmplY3RzLgpjbGFzcyBUeXBlSW5mZXJlbmNlRW5naW5lSW1wbCBleHRlbmRzIFR5cGVJbmZlcmVuY2VFbmdpbmUgewogIFR5cGVJbmZlcmVuY2VFbmdpbmVJbXBsKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24pCiAgICAgIDogc3VwZXIoaW5zdHJ1bWVudGF0aW9uKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZmVycmVyIGNyZWF0ZUxvY2FsVHlwZUluZmVycmVyKFVyaSB1cmksIEludGVyZmFjZVR5cGUgdGhpc1R5cGUsCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksIEluZmVyZW5jZURhdGFGb3JUZXN0aW5nIGRhdGFGb3JUZXN0aW5nKSB7CiAgICBBc3NpZ25lZFZhcmlhYmxlczxUcmVlTm9kZSwgVmFyaWFibGVEZWNsYXJhdGlvbj4gYXNzaWduZWRWYXJpYWJsZXM7CiAgICBpZiAoZGF0YUZvclRlc3RpbmcgIT0gbnVsbCkgewogICAgICBhc3NpZ25lZFZhcmlhYmxlcyA9IGRhdGFGb3JUZXN0aW5nLmZsb3dBbmFseXNpc1Jlc3VsdC5hc3NpZ25lZFZhcmlhYmxlcyA9CiAgICAgICAgICBuZXcgQXNzaWduZWRWYXJpYWJsZXNGb3JUZXN0aW5nPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgfSBlbHNlIHsKICAgICAgYXNzaWduZWRWYXJpYWJsZXMgPQogICAgICAgICAgbmV3IEFzc2lnbmVkVmFyaWFibGVzPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlSW5mZXJyZXJJbXBsKAogICAgICAgIHRoaXMsIHVyaSwgZmFsc2UsIHRoaXNUeXBlLCBsaWJyYXJ5LCBhc3NpZ25lZFZhcmlhYmxlcywgZGF0YUZvclRlc3RpbmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHlwZUluZmVycmVyIGNyZWF0ZVRvcExldmVsVHlwZUluZmVycmVyKFVyaSB1cmksIEludGVyZmFjZVR5cGUgdGhpc1R5cGUsCiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnksIEluZmVyZW5jZURhdGFGb3JUZXN0aW5nIGRhdGFGb3JUZXN0aW5nKSB7CiAgICBBc3NpZ25lZFZhcmlhYmxlczxUcmVlTm9kZSwgVmFyaWFibGVEZWNsYXJhdGlvbj4gYXNzaWduZWRWYXJpYWJsZXM7CiAgICBpZiAoZGF0YUZvclRlc3RpbmcgIT0gbnVsbCkgewogICAgICBhc3NpZ25lZFZhcmlhYmxlcyA9IGRhdGFGb3JUZXN0aW5nLmZsb3dBbmFseXNpc1Jlc3VsdC5hc3NpZ25lZFZhcmlhYmxlcyA9CiAgICAgICAgICBuZXcgQXNzaWduZWRWYXJpYWJsZXNGb3JUZXN0aW5nPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgfSBlbHNlIHsKICAgICAgYXNzaWduZWRWYXJpYWJsZXMgPQogICAgICAgICAgbmV3IEFzc2lnbmVkVmFyaWFibGVzPFRyZWVOb2RlLCBWYXJpYWJsZURlY2xhcmF0aW9uPigpOwogICAgfQogICAgcmV0dXJuIG5ldyBUeXBlSW5mZXJyZXJJbXBsKAogICAgICAgIHRoaXMsIHVyaSwgdHJ1ZSwgdGhpc1R5cGUsIGxpYnJhcnksIGFzc2lnbmVkVmFyaWFibGVzLCBkYXRhRm9yVGVzdGluZyk7CiAgfQp9CgpjbGFzcyBJbmZlcmVuY2VEYXRhRm9yVGVzdGluZyB7CiAgZmluYWwgRmxvd0FuYWx5c2lzUmVzdWx0IGZsb3dBbmFseXNpc1Jlc3VsdCA9IG5ldyBGbG93QW5hbHlzaXNSZXN1bHQoKTsKfQoKLy8vIFRoZSByZXN1bHQgb2YgcGVyZm9ybWluZyBmbG93IGFuYWx5c2lzIG9uIGEgdW5pdC4KY2xhc3MgRmxvd0FuYWx5c2lzUmVzdWx0IHsKICAvLy8gVGhlIGxpc3Qgb2Ygbm9kZXMsIFtFeHByZXNzaW9uXXMgb3IgW1N0YXRlbWVudF1zLCB0aGF0IGNhbm5vdCBiZSByZWFjaGVkLAogIC8vLyBmb3IgZXhhbXBsZSBiZWNhdXNlIGEgcHJldmlvdXMgc3RhdGVtZW50IGFsd2F5cyBleGl0cy4KICBmaW5hbCBMaXN0PFRyZWVOb2RlPiB1bnJlYWNoYWJsZU5vZGVzID0gW107CgogIC8vLyBUaGUgbGlzdCBvZiBmdW5jdGlvbiBib2RpZXMgdGhhdCBkb24ndCBjb21wbGV0ZSwgZm9yIGV4YW1wbGUgYmVjYXVzZQogIC8vLyB0aGVyZSBpcyBhIGByZXR1cm5gIHN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBib2R5IGJsb2NrLgogIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGZ1bmN0aW9uQm9kaWVzVGhhdERvbnRDb21wbGV0ZSA9IFtdOwoKICAvLy8gVGhlIGxpc3Qgb2YgW0V4cHJlc3Npb25dcyByZXByZXNlbnRpbmcgdmFyaWFibGUgYWNjZXNzZXMgdGhhdCBvY2N1ciBiZWZvcmUKICAvLy8gdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgaGFzIGJlZW4gZGVmaW5pdGVseSBhc3NpZ25lZC4KICBmaW5hbCBMaXN0PFRyZWVOb2RlPiB1bmFzc2lnbmVkTm9kZXMgPSBbXTsKCiAgLy8vIFRoZSBhc3NpZ25lZCB2YXJpYWJsZXMgaW5mb3JtYXRpb24gdGhhdCBjb21wdXRlZCBmb3IgdGhlIG1lbWJlci4KICBBc3NpZ25lZFZhcmlhYmxlc0ZvclRlc3Rpbmc8VHJlZU5vZGUsIFZhcmlhYmxlRGVjbGFyYXRpb24+IGFzc2lnbmVkVmFyaWFibGVzOwp9CgovLy8gQ0ZFLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIFtUeXBlT3BlcmF0aW9uc10uCmNsYXNzIFR5cGVPcGVyYXRpb25zQ2ZlCiAgICBpbXBsZW1lbnRzIFR5cGVPcGVyYXRpb25zPFZhcmlhYmxlRGVjbGFyYXRpb24sIERhcnRUeXBlPiB7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudDsKCiAgVHlwZU9wZXJhdGlvbnNDZmUodGhpcy50eXBlRW52aXJvbm1lbnQpOwoKICAvLyBUT0RPKGRtaXRyeWFzKTogQ29uc2lkZXIgY2hlY2tpbmcgZm9yIG11dHVhbCBzdWJ0eXBlcyBpbnN0ZWFkIG9mID09LgogIEBvdmVycmlkZQogIGJvb2wgaXNTYW1lVHlwZShEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIpID0+IHR5cGUxID09IHR5cGUyOwoKICBAb3ZlcnJpZGUKICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIGxlZnRUeXBlLCBEYXJ0VHlwZSByaWdodFR5cGUpIHsKICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgbGVmdFR5cGUsIHJpZ2h0VHlwZSwgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBwcm9tb3RlVG9Ob25OdWxsKERhcnRUeXBlIHR5cGUpIHsKICAgIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgdHlwZS50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5ICE9IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgIERhcnRUeXBlIGJvdW5kID0gdHlwZS5ib3VuZC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogICAgICBpZiAoYm91bmQgIT0gdHlwZS5ib3VuZCkgewogICAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICAgIHR5cGUucGFyYW1ldGVyLCB0eXBlLnR5cGVQYXJhbWV0ZXJUeXBlTnVsbGFiaWxpdHksIGJvdW5kKTsKICAgICAgfQogICAgICByZXR1cm4gdHlwZTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSB0eXBlRW52aXJvbm1lbnQubnVsbFR5cGUpIHsKICAgICAgcmV0dXJuIGNvbnN0IE5ldmVyVHlwZShOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSk7CiAgICB9CiAgICByZXR1cm4gdHlwZS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGFydFR5cGUgdmFyaWFibGVUeXBlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpID0+IHZhcmlhYmxlLnR5cGU7CgogIEBvdmVycmlkZQogIERhcnRUeXBlIHRyeVByb21vdGVUb1R5cGUoRGFydFR5cGUgdG8sIERhcnRUeXBlIGZyb20pIHsKICAgIGlmIChpc1N1YnR5cGVPZih0bywgZnJvbSkpIHsKICAgICAgcmV0dXJuIHRvOwogICAgfQogICAgaWYgKGZyb20gaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKICAgICAgaWYgKGlzU3VidHlwZU9mKHRvLCBmcm9tLnByb21vdGVkQm91bmQgPz8gZnJvbS5ib3VuZCkpIHsKICAgICAgICByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmludGVyc2VjdGlvbigKICAgICAgICAgICAgZnJvbS5wYXJhbWV0ZXIsIGZyb20ubnVsbGFiaWxpdHksIHRvKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZyb207CiAgfQp9CoEoAE1OPwFLASEJFRIZDxYXEBMTFRIXGxUdEgFCATgBLwE/AS4BIAEnMwFKAR0BQgFJK0sRATgBSB0lAQwwAQwuMyEkOzUGRzwvBjg0Bh0SBAEMMCE6JEM7Bh0SBAEMLCYEAQw4Tz0EAgFPJwRMPR8lIQEqARcBPCgBSygBLwFKGwZFSR5AAUYGT00gQQEpAS0BURxITQFPHEtNAU1IOi1MGj8iCBoEAU02SCAlITkEATYbIycaCAYTBAIBThQ8OyABDEhOSCJQTA0aQgYhUQQBDEtOSCJQTA0aQgYhUAQCASBKAgE2G1A9LgFLSzwBUT8tAUdQAgE1GD8pASsBSgxFAQw8KEIEAQwtJUVMISZHCBMzNwY6BAEMSAEMOiERBiU/MzMIBhEEAgFFcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0c2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2Vudmlyb25tZW50LmRhcnTAAEriLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBEeW5hbWljVHlwZSwKICAgICAgICBGdW5jdGlvblR5cGUsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMaWJyYXJ5LAogICAgICAgIE5hbWVkVHlwZSwKICAgICAgICBOdWxsYWJpbGl0eSwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBWYXJpYW5jZTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnIHNob3cgQ2xhc3NIaWVyYXJjaHk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JyBzaG93IFN1YnN0aXR1dGlvbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2hpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50LmRhcnQnCiAgICBzaG93IEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50OwoKaW1wb3J0ICdzdGFuZGFyZF9ib3VuZHMuZGFydCcgc2hvdyBTdGFuZGFyZEJvdW5kczsKCmltcG9ydCAndHlwZV9jb25zdHJhaW50X2dhdGhlcmVyLmRhcnQnIHNob3cgVHlwZUNvbnN0cmFpbnRHYXRoZXJlcjsKCmltcG9ydCAndHlwZV9kZW1vdGlvbi5kYXJ0JzsKCmltcG9ydCAndHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZSwgdHlwZVNjaGVtYVRvU3RyaW5nLCBpc0tub3duOwoKaW1wb3J0ICd0eXBlX3NjaGVtYV9lbGltaW5hdGlvbi5kYXJ0JyBzaG93IGdyZWF0ZXN0Q2xvc3VyZSwgbGVhc3RDbG9zdXJlOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JzsKCi8vIFRPRE8ocGF1bGJlcnJ5KTogdHJ5IHRvIHB1c2ggdGhpcyBmdW5jdGlvbmFsaXR5IGludG8ga2VybmVsLgpGdW5jdGlvblR5cGUgc3Vic3RpdHV0ZVR5cGVQYXJhbXMoCiAgICBGdW5jdGlvblR5cGUgdHlwZSwKICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gc3Vic3RpdHV0aW9uTWFwLAogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBuZXdUeXBlUGFyYW1ldGVycykgewogIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbU1hcChzdWJzdGl0dXRpb25NYXApOwogIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKAogICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLm1hcChzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUpLnRvTGlzdCgpLAogICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUodHlwZS5yZXR1cm5UeXBlKSwKICAgICAgdHlwZS5udWxsYWJpbGl0eSwKICAgICAgbmFtZWRQYXJhbWV0ZXJzOiB0eXBlLm5hbWVkUGFyYW1ldGVycwogICAgICAgICAgLm1hcCgobmFtZWQpID0+IG5ldyBOYW1lZFR5cGUoCiAgICAgICAgICAgICAgbmFtZWQubmFtZSwgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKG5hbWVkLnR5cGUpLAogICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IG5hbWVkLmlzUmVxdWlyZWQpKQogICAgICAgICAgLnRvTGlzdCgpLAogICAgICB0eXBlUGFyYW1ldGVyczogbmV3VHlwZVBhcmFtZXRlcnMsCiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCwKICAgICAgdHlwZWRlZlR5cGU6IHR5cGUudHlwZWRlZlR5cGUgPT0gbnVsbAogICAgICAgICAgPyBudWxsCiAgICAgICAgICA6IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZSh0eXBlLnR5cGVkZWZUeXBlKSk7Cn0KCi8vLyBHaXZlbiBhIFtGdW5jdGlvblR5cGVdLCBnZXRzIHRoZSB0eXBlIG9mIHRoZSBuYW1lZCBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4KLy8vIFtuYW1lXSwgb3IgYGR5bmFtaWNgIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgpEYXJ0VHlwZSBnZXROYW1lZFBhcmFtZXRlclR5cGUoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uVHlwZSwgU3RyaW5nIG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb25UeXBlLmdldE5hbWVkUGFyYW1ldGVyKG5hbWUpID8/IGNvbnN0IER5bmFtaWNUeXBlKCk7Cn0KCi8vLyBHaXZlbiBhIFtGdW5jdGlvblR5cGVdLCBnZXRzIHRoZSB0eXBlIG9mIHRoZSBbaV10aCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgb3IKLy8vIGBkeW5hbWljYCBpZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgd2l0aCB0aGF0IGluZGV4LgpEYXJ0VHlwZSBnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZShGdW5jdGlvblR5cGUgZnVuY3Rpb25UeXBlLCBpbnQgaSkgewogIGlmIChpIDwgZnVuY3Rpb25UeXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgcmV0dXJuIGZ1bmN0aW9uVHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICB9IGVsc2UgewogICAgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgfQp9CgovLy8gQSBjb25zdHJhaW50IG9uIGEgdHlwZSBwYXJhbWV0ZXIgdGhhdCB3ZSdyZSBpbmZlcnJpbmcuCmNsYXNzIFR5cGVDb25zdHJhaW50IHsKICAvLy8gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSB0eXBlIGJlaW5nIGNvbnN0cmFpbmVkLiAgVGhpcyBib3VuZCBtdXN0IGJlIGEKICAvLy8gc3VidHlwZSBvZiB0aGUgdHlwZSBiZWluZyBjb25zdHJhaW5lZC4KICBEYXJ0VHlwZSBsb3dlcjsKCiAgLy8vIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgdHlwZSBiZWluZyBjb25zdHJhaW5lZC4gIFRoZSB0eXBlIGJlaW5nIGNvbnN0cmFpbmVkCiAgLy8vIG11c3QgYmUgYSBzdWJ0eXBlIG9mIHRoaXMgYm91bmQuCiAgRGFydFR5cGUgdXBwZXI7CgogIFR5cGVDb25zdHJhaW50KCkKICAgICAgOiBsb3dlciA9IGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgdXBwZXIgPSBjb25zdCBVbmtub3duVHlwZSgpOwoKICBUeXBlQ29uc3RyYWludC5fKHRoaXMubG93ZXIsIHRoaXMudXBwZXIpOwoKICBUeXBlQ29uc3RyYWludCBjbG9uZSgpID0+IG5ldyBUeXBlQ29uc3RyYWludC5fKGxvd2VyLCB1cHBlcik7CgogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICcke3R5cGVTY2hlbWFUb1N0cmluZyhsb3dlcil9IDw6IDx0eXBlPiA8OiAke3R5cGVTY2hlbWFUb1N0cmluZyh1cHBlcil9JzsKfQoKY2xhc3MgVHlwZVNjaGVtYUVudmlyb25tZW50IGV4dGVuZHMgSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQKICAgIHdpdGggU3RhbmRhcmRCb3VuZHMgewogIFR5cGVTY2hlbWFFbnZpcm9ubWVudChDb3JlVHlwZXMgY29yZVR5cGVzLCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHkpCiAgICAgIDogc3VwZXIoY29yZVR5cGVzLCBoaWVyYXJjaHkpOwoKICBDbGFzcyBnZXQgZnVuY3Rpb25DbGFzcyA9PiBjb3JlVHlwZXMuZnVuY3Rpb25DbGFzczsKCiAgQ2xhc3MgZ2V0IGZ1dHVyZUNsYXNzID0+IGNvcmVUeXBlcy5mdXR1cmVDbGFzczsKCiAgQ2xhc3MgZ2V0IGZ1dHVyZU9yQ2xhc3MgPT4gY29yZVR5cGVzLmZ1dHVyZU9yQ2xhc3M7CgogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBjb3JlVHlwZXMub2JqZWN0Q2xhc3M7CgogIEludGVyZmFjZVR5cGUgZ2V0IG9iamVjdE5vbk51bGxhYmxlUmF3VHlwZSB7CiAgICByZXR1cm4gY29yZVR5cGVzLm9iamVjdE5vbk51bGxhYmxlUmF3VHlwZTsKICB9CgogIEludGVyZmFjZVR5cGUgZnVuY3Rpb25SYXdUeXBlKE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KSB7CiAgICByZXR1cm4gY29yZVR5cGVzLmZ1bmN0aW9uUmF3VHlwZShudWxsYWJpbGl0eSk7CiAgfQoKICBJbnRlcmZhY2VUeXBlIG9iamVjdFJhd1R5cGUoTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0UmF3VHlwZShudWxsYWJpbGl0eSk7CiAgfQoKICBib29sIGFyZU11dHVhbFN1YnR5cGVzKERhcnRUeXBlIHMsIERhcnRUeXBlIHQsIFN1YnR5cGVDaGVja01vZGUgbW9kZSkgewogICAgSXNTdWJ0eXBlT2YgcmVzdWx0ID0gcGVyZm9ybU51bGxhYmlsaXR5QXdhcmVNdXR1YWxTdWJ0eXBlc0NoZWNrKHMsIHQpOwogICAgc3dpdGNoIChtb2RlKSB7CiAgICAgIGNhc2UgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXM6CiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzKCk7CiAgICAgIGNhc2UgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllczoKICAgICAgICByZXR1cm4gcmVzdWx0LmlzU3VidHlwZVdoZW5Vc2luZ051bGxhYmlsaXRpZXMoKTsKICAgIH0KICAgIHJldHVybiB1bmhhbmRsZWQoCiAgICAgICAgIiRtb2RlIiwgIlR5cGVTY2hlbWFFbnZpcm9ubWVudC5hcmVNdXR1YWxTdWJ0eXBlcyIsIC0xLCBudWxsKTsKICB9CgogIEludGVyZmFjZVR5cGUgZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICBJbnRlcmZhY2VUeXBlIHR5cGUxLCBJbnRlcmZhY2VUeXBlIHR5cGUyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIHJldHVybiBoaWVyYXJjaHkuZ2V0TGVnYWN5TGVhc3RVcHBlckJvdW5kKAogICAgICAgIHR5cGUxLCB0eXBlMiwgY2xpZW50TGlicmFyeSwgdGhpcy5jb3JlVHlwZXMpOwogIH0KCiAgLy8vIE1vZGlmeSB0aGUgZ2l2ZW4gW2NvbnN0cmFpbnRdJ3MgbG93ZXIgYm91bmQgdG8gaW5jbHVkZSBbbG93ZXJdLgogIHZvaWQgYWRkTG93ZXJCb3VuZCgKICAgICAgVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgbG93ZXIsIExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgY29uc3RyYWludC5sb3dlciA9CiAgICAgICAgZ2V0U3RhbmRhcmRVcHBlckJvdW5kKGNvbnN0cmFpbnQubG93ZXIsIGxvd2VyLCBjbGllbnRMaWJyYXJ5KTsKICB9CgogIC8vLyBNb2RpZnkgdGhlIGdpdmVuIFtjb25zdHJhaW50XSdzIHVwcGVyIGJvdW5kIHRvIGluY2x1ZGUgW3VwcGVyXS4KICB2b2lkIGFkZFVwcGVyQm91bmQoCiAgICAgIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIHVwcGVyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIGNvbnN0cmFpbnQudXBwZXIgPQogICAgICAgIGdldFN0YW5kYXJkTG93ZXJCb3VuZChjb25zdHJhaW50LnVwcGVyLCB1cHBlciwgY2xpZW50TGlicmFyeSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRUeXBlT2ZPdmVybG9hZGVkQXJpdGhtZXRpYyhEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdGhpcyBtYXRjaGVzIHdoYXQgaXMgZGVmaW5lZCBpbiB0aGUgc3BlYy4gIEl0IHdvdWxkIGJlCiAgICAvLyBuaWNlIGlmIHdlIGNvdWxkIGNoYW5nZSBrZXJuZWwgdG8gbWF0Y2ggdGhlIHNwZWMgYW5kIG5vdCBoYXZlIHRvCiAgICAvLyBvdmVycmlkZS4KICAgIGlmICh0eXBlMSBpcyBJbnRlcmZhY2VUeXBlICYmIHR5cGUxLmNsYXNzTm9kZSA9PSBjb3JlVHlwZXMuaW50Q2xhc3MpIHsKICAgICAgaWYgKHR5cGUyIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZTIuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5pbnRDbGFzcykgewogICAgICAgIHJldHVybiB0eXBlMjsKICAgICAgfQogICAgICBpZiAodHlwZTIgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlMi5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmRvdWJsZUNsYXNzKSB7CiAgICAgICAgcmV0dXJuIHR5cGUyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29yZVR5cGVzLm51bVJhd1R5cGUodHlwZTEubnVsbGFiaWxpdHkpOwogIH0KCiAgLy8vIEluZmVycyBhIGdlbmVyaWMgdHlwZSwgZnVuY3Rpb24sIG1ldGhvZCwgb3IgbGlzdC9tYXAgbGl0ZXJhbAogIC8vLyBpbnN0YW50aWF0aW9uLCB1c2luZyB0aGUgZG93bndhcmQgY29udGV4dCB0eXBlIGFzIHdlbGwgYXMgdGhlIGFyZ3VtZW50CiAgLy8vIHR5cGVzIGlmIGF2YWlsYWJsZS4KICAvLy8KICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSB3aXRoIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzLCB0aGlzCiAgLy8vIGluZmVycyB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGFjdHVhbCBhcmd1bWVudCB0eXBlcy4KICAvLy8KICAvLy8gQ29uY3JldGVseSwgZ2l2ZW4gYSBmdW5jdGlvbiB0eXBlIHdpdGggcGFyYW1ldGVyIHR5cGVzIFAwLCBQMSwgLi4uIFBuLAogIC8vLyByZXN1bHQgdHlwZSBSLCBhbmQgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgVDAsIFQxLCAuLi4gVG0sIHVzZSB0aGUKICAvLy8gYXJndW1lbnQgdHlwZXMgQTAsIEExLCAuLi4gQW4gdG8gc29sdmUgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIEZvciBlYWNoIHBhcmFtZXRlciBQaSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCBBaSA8OiBQaS4gV2UgY2FuIGRvIHRoaXMgYnkKICAvLy8gcnVubmluZyB0aGUgc3VidHlwZSBhbGdvcml0aG0sIGFuZCB3aGVuIHdlIHJlYWNoIGEgdHlwZSBwYXJhbWV0ZXIgVGosCiAgLy8vIHJlY29yZGluZyB0aGUgbG93ZXIgb3IgdXBwZXIgYm91bmQgaXQgbXVzdCBzYXRpc2Z5LiBBdCB0aGUgZW5kLCBhbGwKICAvLy8gY29uc3RyYWludHMgY2FuIGJlIGNvbWJpbmVkIHRvIGRldGVybWluZSB0aGUgdHlwZS4KICAvLy8KICAvLy8gQWxsIGNvbnN0cmFpbnRzIG9uIGVhY2ggdHlwZSBwYXJhbWV0ZXIgVGogYXJlIHRyYWNrZWQsIGFzIHdlbGwgYXMgd2hlcmUKICAvLy8gdGhleSBvcmlnaW5hdGVkLCBzbyB3ZSBjYW4gaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSB0cmFjaW5nIGJhY2sgdG8gdGhlCiAgLy8vIGFyZ3VtZW50IHZhbHVlcywgdHlwZSBwYXJhbWV0ZXIgImV4dGVuZHMiIGNsYXVzZSwgb3IgdGhlIHJldHVybiB0eXBlCiAgLy8vIGNvbnRleHQuCiAgLy8vCiAgLy8vIElmIG5vbi1udWxsIHZhbHVlcyBmb3IgW2Zvcm1hbFR5cGVzXSBhbmQgW2FjdHVhbFR5cGVzXSBhcmUgcHJvdmlkZWQsIHRoaXMKICAvLy8gaXMgdXB3YXJkcyBpbmZlcmVuY2UuICBPdGhlcndpc2UgaXQgaXMgZG93bndhcmQgaW5mZXJlbmNlLgogIHZvaWQgaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgIERhcnRUeXBlIGRlY2xhcmVkUmV0dXJuVHlwZSwKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc1RvSW5mZXIsCiAgICAgIExpc3Q8RGFydFR5cGU+IGZvcm1hbFR5cGVzLAogICAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlcywKICAgICAgRGFydFR5cGUgcmV0dXJuQ29udGV4dFR5cGUsCiAgICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXMsCiAgICAgIExpYnJhcnkgY2xpZW50TGlicmFyeSwKICAgICAge2Jvb2wgaXNDb25zdDogZmFsc2V9KSB7CiAgICBhc3NlcnQoKGZvcm1hbFR5cGVzPy5sZW5ndGggPz8gMCkgPT0gKGFjdHVhbFR5cGVzPy5sZW5ndGggPz8gMCkpOwogICAgaWYgKHR5cGVQYXJhbWV0ZXJzVG9JbmZlci5pc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDcmVhdGUgYSBUeXBlQ29uc3RyYWludEdhdGhlcmVyIHRoYXQgd2lsbCBhbGxvdyBjZXJ0YWluIHR5cGUgcGFyYW1ldGVycwogICAgLy8gdG8gYmUgaW5mZXJyZWQuIEl0IHdpbGwgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoZXNlIHR5cGUgcGFyYW1ldGVycyBjYW4KICAgIC8vIGJlIHN1YnR5cGVzIChvciBzdXBlcnR5cGVzKSBhcyBuZWNlc3NhcnksIGFuZCB0cmFjayB0aGUgY29uc3RyYWludHMgdGhhdAogICAgLy8gYXJlIGltcGxpZWQgYnkgdGhpcy4KICAgIFR5cGVDb25zdHJhaW50R2F0aGVyZXIgZ2F0aGVyZXIgPQogICAgICAgIG5ldyBUeXBlQ29uc3RyYWludEdhdGhlcmVyKHRoaXMsIHR5cGVQYXJhbWV0ZXJzVG9JbmZlciwgY2xpZW50TGlicmFyeSk7CgogICAgaWYgKCFpc0VtcHR5Q29udGV4dChyZXR1cm5Db250ZXh0VHlwZSkpIHsKICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICByZXR1cm5Db250ZXh0VHlwZSA9IG5ldyBUeXBlVmFyaWFibGVFbGltaW5hdG9yKGNvcmVUeXBlcykKICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHJldHVybkNvbnRleHRUeXBlKTsKICAgICAgfQogICAgICBnYXRoZXJlci50cnlTdWJ0eXBlTWF0Y2goZGVjbGFyZWRSZXR1cm5UeXBlLCByZXR1cm5Db250ZXh0VHlwZSk7CiAgICB9CgogICAgaWYgKGZvcm1hbFR5cGVzICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYWxUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgIC8vIFRyeSB0byBwYXNzIGVhY2ggYXJndW1lbnQgdG8gZWFjaCBwYXJhbWV0ZXIsIHJlY29yZGluZyBhbnkgdHlwZQogICAgICAgIC8vIHBhcmFtZXRlciBib3VuZHMgdGhhdCB3ZXJlIGltcGxpZWQgYnkgdGhpcyBhc3NpZ25tZW50LgogICAgICAgIGdhdGhlcmVyLnRyeVN1YnR5cGVNYXRjaChhY3R1YWxUeXBlc1tpXSwgZm9ybWFsVHlwZXNbaV0pOwogICAgICB9CiAgICB9CgogICAgaW5mZXJUeXBlRnJvbUNvbnN0cmFpbnRzKGdhdGhlcmVyLmNvbXB1dGVDb25zdHJhaW50cyhjbGllbnRMaWJyYXJ5KSwKICAgICAgICB0eXBlUGFyYW1ldGVyc1RvSW5mZXIsIGluZmVycmVkVHlwZXMsIGNsaWVudExpYnJhcnksCiAgICAgICAgZG93bndhcmRzSW5mZXJQaGFzZTogZm9ybWFsVHlwZXMgPT0gbnVsbCk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZlcnJlZFR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGluZmVycmVkVHlwZXNbaV0gPSBkZW1vdGVUeXBlSW5MaWJyYXJ5KGluZmVycmVkVHlwZXNbaV0sIGNsaWVudExpYnJhcnkpOwogICAgfQogIH0KCiAgYm9vbCBoYXNPbWl0dGVkQm91bmQoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKICAgIC8vIElmIHRoZSBib3VuZCB3YXMgb21pdHRlZCBieSB0aGUgcHJvZ3JhbW1lciwgdGhlIEtlcm5lbCByZXByZXNlbnRhdGlvbiBmb3IKICAgIC8vIHRoZSBwYXJhbWV0ZXIgd2lsbCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKICAgIC8vCiAgICAvLyAgICAgVCBleHRlbmRzIE9iamVjdCA9IGR5bmFtaWMKICAgIC8vCiAgICAvLyBOb3RlIHRoYXQgaXQncyBub3QgcG9zc2libGUgdG8gcmVjZWl2ZSBbT2JqZWN0XSBhcyBbVHlwZVBhcmFtZXRlci5ib3VuZF0KICAgIC8vIGFuZCBgZHluYW1pY2AgYXMgW1R5cGVQYXJhbWV0ZXIuZGVmYXVsdFR5cGVdIGZyb20gdGhlIGZyb250IGVuZCBpbiBhbnkKICAgIC8vIG90aGVyIHdheS4KICAgIERhcnRUeXBlIGJvdW5kID0gcGFyYW1ldGVyLmJvdW5kOwogICAgcmV0dXJuIGJvdW5kIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICBpZGVudGljYWwoYm91bmQuY2xhc3NOb2RlLCBjb3JlVHlwZXMub2JqZWN0Q2xhc3MpICYmCiAgICAgICAgcGFyYW1ldGVyLmRlZmF1bHRUeXBlIGlzIER5bmFtaWNUeXBlOwogIH0KCiAgLy8vIFVzZSB0aGUgZ2l2ZW4gW2NvbnN0cmFpbnRzXSB0byBzdWJzdGl0dXRlIGZvciB0eXBlIHZhcmlhYmxlcy4KICAvLy8KICAvLy8gW3R5cGVQYXJhbWV0ZXJzVG9JbmZlcl0gaXMgdGhlIHNldCBvZiB0eXBlIHBhcmFtZXRlcnMgdGhhdCBzaG91bGQgYmUKICAvLy8gc3Vic3RpdHV0ZWQgZm9yLiAgW2luZmVycmVkVHlwZXNdIHNob3VsZCBiZSBhIGxpc3Qgb2YgdGhlIHNhbWUgbGVuZ3RoLgogIC8vLwogIC8vLyBJZiBbZG93bndhcmRzSW5mZXJQaGFzZV0gaXMgYHRydWVgLCB0aGVuIHdlIGFyZSBpbiB0aGUgZmlyc3QgcGFzcyBvZgogIC8vLyBpbmZlcmVuY2UsIHB1c2hpbmcgY29udGV4dCB0eXBlcyBkb3duLiAgVGhpcyBtZWFucyB3ZSBhcmUgYWxsb3dlZCB0byBwdXNoCiAgLy8vIGRvd24gYD9gIHRvIHByZWNpc2VseSByZXByZXNlbnQgYW4gdW5rbm93biB0eXBlLiAgW2luZmVycmVkVHlwZXNdIHNob3VsZAogIC8vLyBiZSBpbml0aWFsbHkgcG9wdWxhdGVkIHdpdGggYD9gLiAgVGhlc2UgYD9gcyB3aWxsIGJlIHJlcGxhY2VkLCBpZgogIC8vLyBhcHByb3ByaWF0ZSwgd2l0aCB0aGUgdHlwZXMgdGhhdCB3ZXJlIGluZmVycmVkIGJ5IGRvd253YXJkcyBpbmZlcmVuY2UuCiAgLy8vCiAgLy8vIElmIFtkb3dud2FyZHNJbmZlclBoYXNlXSBpcyBgZmFsc2VgLCB0aGVuIHdlIGFyZSBpbiB0aGUgc2Vjb25kIHBhc3Mgb2YKICAvLy8gaW5mZXJlbmNlLCBhbmQgbXVzdCBub3QgY29uY2x1ZGUgYD9gIGZvciBhbnkgdHlwZSBmb3JtYWwuICBJbiB0aGlzIHBhc3MsCiAgLy8vIFtpbmZlcnJlZFR5cGVzXSBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIGZyb20gdGhlIGZpcnN0IHBhc3MuICBUaGV5IHdpbGwKICAvLy8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgZmluYWwgaW5mZXJyZWQgdHlwZXMuCiAgdm9pZCBpbmZlclR5cGVGcm9tQ29uc3RyYWludHMoCiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD4gY29uc3RyYWludHMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnNUb0luZmVyLAogICAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzLAogICAgICBMaWJyYXJ5IGNsaWVudExpYnJhcnksCiAgICAgIHtib29sIGRvd253YXJkc0luZmVyUGhhc2U6IGZhbHNlfSkgewogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZXNGcm9tRG93bndhcmRzSW5mZXJlbmNlID0KICAgICAgICBkb3dud2FyZHNJbmZlclBoYXNlID8gbnVsbCA6IGluZmVycmVkVHlwZXMudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVyc1RvSW5mZXIubGVuZ3RoOyBpKyspIHsKICAgICAgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0gPSB0eXBlUGFyYW1ldGVyc1RvSW5mZXJbaV07CgogICAgICBEYXJ0VHlwZSB0eXBlUGFyYW1Cb3VuZCA9IHR5cGVQYXJhbS5ib3VuZDsKICAgICAgRGFydFR5cGUgZXh0ZW5kc0NvbnN0cmFpbnQ7CiAgICAgIGlmICghaGFzT21pdHRlZEJvdW5kKHR5cGVQYXJhbSkpIHsKICAgICAgICBleHRlbmRzQ29uc3RyYWludCA9CiAgICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnNUb0luZmVyLCBpbmZlcnJlZFR5cGVzKQogICAgICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHR5cGVQYXJhbUJvdW5kKTsKICAgICAgfQoKICAgICAgVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW3R5cGVQYXJhbV07CiAgICAgIGlmIChkb3dud2FyZHNJbmZlclBoYXNlKSB7CiAgICAgICAgaW5mZXJyZWRUeXBlc1tpXSA9IF9pbmZlclR5cGVQYXJhbWV0ZXJGcm9tQ29udGV4dCgKICAgICAgICAgICAgY29uc3RyYWludCwgZXh0ZW5kc0NvbnN0cmFpbnQsIGNsaWVudExpYnJhcnkpOwogICAgICB9IGVsc2UgewogICAgICAgIGluZmVycmVkVHlwZXNbaV0gPSBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUFsbCgKICAgICAgICAgICAgdHlwZXNGcm9tRG93bndhcmRzSW5mZXJlbmNlW2ldLAogICAgICAgICAgICBjb25zdHJhaW50LAogICAgICAgICAgICBleHRlbmRzQ29uc3RyYWludCwKICAgICAgICAgICAgY2xpZW50TGlicmFyeSwKICAgICAgICAgICAgaXNDb250cmF2YXJpYW50OiB0eXBlUGFyYW0udmFyaWFuY2UgPT0gVmFyaWFuY2UuY29udHJhdmFyaWFudCwKICAgICAgICAgICAgcHJlZmVyVXB3YXJkc0luZmVyZW5jZTogIXR5cGVQYXJhbS5pc0xlZ2FjeUNvdmFyaWFudCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB0aGUgZG93bndhcmRzIGluZmVyIHBoYXNlIGhhcyBmYWlsZWQsIHdlJ2xsIGNhdGNoIHRoaXMgaW4gdGhlIHVwd2FyZHMKICAgIC8vIHBoYXNlIGxhdGVyIG9uLgogICAgaWYgKGRvd253YXJkc0luZmVyUGhhc2UpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIENoZWNrIHRoZSBpbmZlcnJlZCB0eXBlcyBhZ2FpbnN0IGFsbCBvZiB0aGUgY29uc3RyYWludHMuCiAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IGtub3duVHlwZXMgPSA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzVG9JbmZlci5sZW5ndGg7IGkrKykgewogICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IHR5cGVQYXJhbWV0ZXJzVG9JbmZlcltpXTsKICAgICAgVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW3R5cGVQYXJhbV07CiAgICAgIERhcnRUeXBlIHR5cGVQYXJhbUJvdW5kID0KICAgICAgICAgIFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnNUb0luZmVyLCBpbmZlcnJlZFR5cGVzKQogICAgICAgICAgICAgIC5zdWJzdGl0dXRlVHlwZSh0eXBlUGFyYW0uYm91bmQpOwoKICAgICAgRGFydFR5cGUgaW5mZXJyZWQgPSBpbmZlcnJlZFR5cGVzW2ldOwogICAgICBib29sIHN1Y2Nlc3MgPSB0eXBlU2F0aXNmaWVzQ29uc3RyYWludChpbmZlcnJlZCwgY29uc3RyYWludCk7CiAgICAgIGlmIChzdWNjZXNzICYmICFoYXNPbWl0dGVkQm91bmQodHlwZVBhcmFtKSkgewogICAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgZWxzZSBzdWNjZWVkZWQsIGNoZWNrIHRoZSBgZXh0ZW5kc2AgY29uc3RyYWludC4KICAgICAgICBEYXJ0VHlwZSBleHRlbmRzQ29uc3RyYWludCA9IHR5cGVQYXJhbUJvdW5kOwogICAgICAgIHN1Y2Nlc3MgPSBpc1N1YnR5cGVPZihpbmZlcnJlZCwgZXh0ZW5kc0NvbnN0cmFpbnQsCiAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKICAgICAgfQoKICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiByZXBvcnQgZXJyb3IuCgogICAgICAgIC8vIEhldXJpc3RpYzogZXZlbiBpZiB3ZSBmYWlsZWQsIGtlZXAgdGhlIGVycm9uZW91cyB0eXBlLgogICAgICAgIC8vIEl0IHNob3VsZCBzYXRpc2Z5IGF0IGxlYXN0IHNvbWUgb2YgdGhlIGNvbnN0cmFpbnRzIChlLmcuIHRoZSByZXR1cm4KICAgICAgICAvLyBjb250ZXh0KS4gSWYgd2UgZmFsbCBiYWNrIHRvIGluc3RhbnRpYXRlVG9Cb3VuZHMsIHdlJ2xsIHR5cGljYWxseSBnZXQKICAgICAgICAvLyBtb3JlIGVycm9ycyAoZS5nLiBiZWNhdXNlIGBkeW5hbWljYCBpcyB0aGUgbW9zdCBjb21tb24gYm91bmQpLgogICAgICB9CgogICAgICBpZiAoaXNLbm93bihpbmZlcnJlZCkpIHsKICAgICAgICBrbm93blR5cGVzW3R5cGVQYXJhbV0gPSBpbmZlcnJlZDsKICAgICAgfQogICAgfQoKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogcmVwb3J0IGFueSBlcnJvcnMgZnJvbSBpbnN0YW50aWF0ZVRvQm91bmRzLgogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc1N1YnR5cGVPZigKICAgICAgRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlLCBTdWJ0eXBlQ2hlY2tNb2RlIG1vZGUpIHsKICAgIGlmIChzdWJ0eXBlIGlzIFVua25vd25UeXBlKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChzdWJ0eXBlID09IE51bGwgJiYgc3VwZXJ0eXBlIGlzIFVua25vd25UeXBlKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBzdXBlci5pc1N1YnR5cGVPZihzdWJ0eXBlLCBzdXBlcnR5cGUsIG1vZGUpOwogIH0KCiAgYm9vbCBpc0VtcHR5Q29udGV4dChEYXJ0VHlwZSBjb250ZXh0KSB7CiAgICBpZiAoY29udGV4dCBpcyBEeW5hbWljVHlwZSkgewogICAgICAvLyBBbmFseXplciB0cmVhdHMgYSB0eXBlIGNvbnRleHQgb2YgYGR5bmFtaWNgIGFzIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkKICAgICAgLy8gY29udGV4dC4gIFRPRE8ocGF1bGJlcnJ5KTogdGhpcyBpcyBub3Qgc3BlYydlZCBhbnl3aGVyZTsgZG8gd2Ugc3RpbGwKICAgICAgLy8gd2FudCB0byBkbyB0aGlzPwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBjb250ZXh0ID09IG51bGw7CiAgfQoKICAvLy8gVHJ1ZSBpZiBbbWVtYmVyXSBpcyBhIGJpbmFyeSBvcGVyYXRvciB0aGF0IHJldHVybnMgYW4gYGludGAgaWYgYm90aAogIC8vLyBvcGVyYW5kcyBhcmUgYGludGAsIGFuZCBvdGhlcndpc2UgcmV0dXJucyBgZG91YmxlYC4KICAvLy8KICAvLy8gTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgcmVjZWl2ZXIgdHlwZSwgc28gd2UgY2FuIG9ubHkgbWFrZQogIC8vLyB0aGlzIGRldGVybWluYXRpb24gaWYgd2Uga25vdyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBjYXNlIG9mIHR5cGUtYmFzZWQgb3ZlcmxvYWRpbmcsIHdoaWNoIGluIERhcnQgaXMgb25seSBzdXBwb3J0ZWQKICAvLy8gYnkgZ2l2aW5nIHNwZWNpYWwgdHJlYXRtZW50IHRvIGNlcnRhaW4gYXJpdGhtZXRpYyBvcGVyYXRvcnMuCiAgYm9vbCBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKAogICAgICBQcm9jZWR1cmUgbWVtYmVyLCBEYXJ0VHlwZSByZWNlaXZlclR5cGUpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdGhpcyBtYXRjaGVzIHdoYXQgaXMgZGVmaW5lZCBpbiB0aGUgc3BlYy4gIEl0IHdvdWxkIGJlCiAgICAvLyBuaWNlIGlmIHdlIGNvdWxkIGNoYW5nZSBrZXJuZWwgdG8gbWF0Y2ggdGhlIHNwZWMgYW5kIG5vdCBoYXZlIHRvCiAgICAvLyBvdmVycmlkZS4KICAgIGlmIChtZW1iZXIubmFtZS5uYW1lID09ICdyZW1haW5kZXInKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIShyZWNlaXZlclR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgIGlkZW50aWNhbChyZWNlaXZlclR5cGUuY2xhc3NOb2RlLCBjb3JlVHlwZXMuaW50Q2xhc3MpKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yKG1lbWJlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGlzVG9wKERhcnRUeXBlIHQpIHsKICAgIGlmICh0IGlzIFVua25vd25UeXBlKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN1cGVyLmlzVG9wKHQpOwogICAgfQogIH0KCiAgLy8vIENvbXB1dGVzIHRoZSBjb25zdHJhaW50IHNvbHV0aW9uIGZvciBhIHR5cGUgdmFyaWFibGUgYmFzZWQgb24gYSBnaXZlbiBzZXQKICAvLy8gb2YgY29uc3RyYWludHMuCiAgLy8vCiAgLy8vIElmIFtncm91bmRlZF0gaXMgYHRydWVgLCB0aGVuIHRoZSByZXR1cm5lZCB0eXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgYQogIC8vLyBrbm93biB0eXBlIChpLmUuIGl0IHdpbGwgbm90IGNvbnRhaW4gYW55IGluc3RhbmNlcyBvZiBgP2ApLgogIC8vLwogIC8vLyBJZiBbaXNDb250cmF2YXJpYW50XSBpcyBgdHJ1ZWAsIHRoZW4gd2UgYXJlIHNvbHZpbmcgZm9yIGEgY29udHJhdmFyaWFudAogIC8vLyB0eXBlIHBhcmFtZXRlciB3aGljaCBtZWFucyB3ZSBjaG9vc2UgdGhlIHVwcGVyIGJvdW5kIHJhdGhlciB0aGFuIHRoZQogIC8vLyBsb3dlciBib3VuZCBmb3Igbm9ybWFsbHkgY292YXJpYW50IHR5cGUgcGFyYW1ldGVycy4KICBEYXJ0VHlwZSBzb2x2ZVR5cGVDb25zdHJhaW50KFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsCiAgICAgIHtib29sIGdyb3VuZGVkOiBmYWxzZSwgYm9vbCBpc0NvbnRyYXZhcmlhbnQ6IGZhbHNlfSkgewogICAgaWYgKCFpc0NvbnRyYXZhcmlhbnQpIHsKICAgICAgLy8gUHJlZmVyIHRoZSBrbm93biBib3VuZCwgaWYgYW55LgogICAgICBpZiAoaXNLbm93bihjb25zdHJhaW50Lmxvd2VyKSkgcmV0dXJuIGNvbnN0cmFpbnQubG93ZXI7CiAgICAgIGlmIChpc0tub3duKGNvbnN0cmFpbnQudXBwZXIpKSByZXR1cm4gY29uc3RyYWludC51cHBlcjsKCiAgICAgIC8vIE90aGVyd2lzZSB0YWtlIHdoYXRldmVyIGJvdW5kIGhhcyBwYXJ0aWFsIGluZm9ybWF0aW9uLAogICAgICAvLyBlLmcuIGBJdGVyYWJsZTw/PmAKICAgICAgaWYgKGNvbnN0cmFpbnQubG93ZXIgaXMhIFVua25vd25UeXBlKSB7CiAgICAgICAgcmV0dXJuIGdyb3VuZGVkCiAgICAgICAgICAgID8gbGVhc3RDbG9zdXJlKGNvcmVUeXBlcywgY29uc3RyYWludC5sb3dlcikKICAgICAgICAgICAgOiBjb25zdHJhaW50Lmxvd2VyOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBncm91bmRlZAogICAgICAgICAgICA/IGdyZWF0ZXN0Q2xvc3VyZShjb3JlVHlwZXMsIGNvbnN0cmFpbnQudXBwZXIpCiAgICAgICAgICAgIDogY29uc3RyYWludC51cHBlcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gUHJlZmVyIHRoZSBrbm93biBib3VuZCwgaWYgYW55LgogICAgICBpZiAoaXNLbm93bihjb25zdHJhaW50LnVwcGVyKSkgcmV0dXJuIGNvbnN0cmFpbnQudXBwZXI7CiAgICAgIGlmIChpc0tub3duKGNvbnN0cmFpbnQubG93ZXIpKSByZXR1cm4gY29uc3RyYWludC5sb3dlcjsKCiAgICAgIC8vIE90aGVyd2lzZSB0YWtlIHdoYXRldmVyIGJvdW5kIGhhcyBwYXJ0aWFsIGluZm9ybWF0aW9uLAogICAgICAvLyBlLmcuIGBJdGVyYWJsZTw/PmAKICAgICAgaWYgKGNvbnN0cmFpbnQudXBwZXIgaXMhIFVua25vd25UeXBlKSB7CiAgICAgICAgcmV0dXJuIGdyb3VuZGVkCiAgICAgICAgICAgID8gZ3JlYXRlc3RDbG9zdXJlKGNvcmVUeXBlcywgY29uc3RyYWludC51cHBlcikKICAgICAgICAgICAgOiBjb25zdHJhaW50LnVwcGVyOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBncm91bmRlZAogICAgICAgICAgICA/IGxlYXN0Q2xvc3VyZShjb3JlVHlwZXMsIGNvbnN0cmFpbnQubG93ZXIpCiAgICAgICAgICAgIDogY29uc3RyYWludC5sb3dlcjsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gW3R5cGVdIHNhdGlzZmllcyB0aGUgZ2l2ZW4gdHlwZSBbY29uc3RyYWludF0uCiAgYm9vbCB0eXBlU2F0aXNmaWVzQ29uc3RyYWludChEYXJ0VHlwZSB0eXBlLCBUeXBlQ29uc3RyYWludCBjb25zdHJhaW50KSB7CiAgICByZXR1cm4gaXNTdWJ0eXBlT2YoCiAgICAgICAgICAgIGNvbnN0cmFpbnQubG93ZXIsIHR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSAmJgogICAgICAgIGlzU3VidHlwZU9mKAogICAgICAgICAgICB0eXBlLCBjb25zdHJhaW50LnVwcGVyLCBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcyk7CiAgfQoKICBEYXJ0VHlwZSBfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUFsbCgKICAgICAgRGFydFR5cGUgdHlwZUZyb21Db250ZXh0SW5mZXJlbmNlLAogICAgICBUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LAogICAgICBEYXJ0VHlwZSBleHRlbmRzQ29uc3RyYWludCwKICAgICAgTGlicmFyeSBjbGllbnRMaWJyYXJ5LAogICAgICB7Ym9vbCBpc0NvbnRyYXZhcmlhbnQ6IGZhbHNlLAogICAgICBib29sIHByZWZlclVwd2FyZHNJbmZlcmVuY2U6IGZhbHNlfSkgewogICAgLy8gU2VlIGlmIHdlIGFscmVhZHkgZml4ZWQgdGhpcyB0eXBlIGZyb20gZG93bndhcmRzIGluZmVyZW5jZS4KICAgIC8vIElmIHNvLCB0aGVuIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNoYW5nZSBpdCBiYXNlZCBvbiBhcmd1bWVudCB0eXBlcyB1bmxlc3MKICAgIC8vIFtwcmVmZXJVcHdhcmRzSW5mZXJlbmNlXSBpcyB0cnVlLgogICAgaWYgKCFwcmVmZXJVcHdhcmRzSW5mZXJlbmNlICYmIGlzS25vd24odHlwZUZyb21Db250ZXh0SW5mZXJlbmNlKSkgewogICAgICByZXR1cm4gdHlwZUZyb21Db250ZXh0SW5mZXJlbmNlOwogICAgfQoKICAgIGlmIChleHRlbmRzQ29uc3RyYWludCAhPSBudWxsKSB7CiAgICAgIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50LmNsb25lKCk7CiAgICAgIGFkZFVwcGVyQm91bmQoY29uc3RyYWludCwgZXh0ZW5kc0NvbnN0cmFpbnQsIGNsaWVudExpYnJhcnkpOwogICAgfQoKICAgIHJldHVybiBzb2x2ZVR5cGVDb25zdHJhaW50KGNvbnN0cmFpbnQsCiAgICAgICAgZ3JvdW5kZWQ6IHRydWUsIGlzQ29udHJhdmFyaWFudDogaXNDb250cmF2YXJpYW50KTsKICB9CgogIERhcnRUeXBlIF9pbmZlclR5cGVQYXJhbWV0ZXJGcm9tQ29udGV4dChUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LAogICAgICBEYXJ0VHlwZSBleHRlbmRzQ29uc3RyYWludCwgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICBEYXJ0VHlwZSB0ID0gc29sdmVUeXBlQ29uc3RyYWludChjb25zdHJhaW50KTsKICAgIGlmICghaXNLbm93bih0KSkgewogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byBtYWtlIG91ciBmaW5hbCBjaG9pY2UsIGFwcGx5IHRoZSBleHRlbmRzIGNsYXVzZS4KICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYSBjaGFuY2UgdG8gcmVmaW5lIHRoZSBjaG9pY2UsIGluIGNhc2UgaXQgd291bGQgdmlvbGF0ZQogICAgLy8gdGhlIGBleHRlbmRzYCBjbGF1c2UuIEZvciBleGFtcGxlOgogICAgLy8KICAgIC8vICAgICBPYmplY3Qgb2JqID0gbWF0aC5taW4vKjxpbmZlciBPYmplY3QsIGVycm9yPiovKDEsIDIpOwogICAgLy8KICAgIC8vIElmIHdlIGNvbnNpZGVyIHRoZSBgVCBleHRlbmRzIG51bWAgd2UgY29uY2x1ZGUgYDxudW0+YCwgd2hpY2ggd29ya3MuCiAgICBpZiAoZXh0ZW5kc0NvbnN0cmFpbnQgIT0gbnVsbCkgewogICAgICBjb25zdHJhaW50ID0gY29uc3RyYWludC5jbG9uZSgpOwogICAgICBhZGRVcHBlckJvdW5kKGNvbnN0cmFpbnQsIGV4dGVuZHNDb25zdHJhaW50LCBjbGllbnRMaWJyYXJ5KTsKICAgICAgcmV0dXJuIHNvbHZlVHlwZUNvbnN0cmFpbnQoY29uc3RyYWludCk7CiAgICB9CiAgICByZXR1cm4gdDsKICB9Cn0KCmNsYXNzIFR5cGVWYXJpYWJsZUVsaW1pbmF0b3IgZXh0ZW5kcyBTdWJzdGl0dXRpb24gewogIGZpbmFsIENvcmVUeXBlcyBfY29yZVR5cGVzOwoKICAvLyBUT0RPKGRtaXRyeWFzKTogSW5zdGVhZCBvZiBhIENvcmVUeXBlcyBvYmplY3QgcGFzcyBudWxsIGFuZCBhbiBPYmplY3QgdHlwZQogIC8vIGV4cGxpY2l0bHksIHdpdGggdGhlIHN1aXRhYmxlIG51bGxhYmlsaXR5IG9uIHRoZSBsYXR0ZXIuCiAgVHlwZVZhcmlhYmxlRWxpbWluYXRvcih0aGlzLl9jb3JlVHlwZXMpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBib29sIHVwcGVyQm91bmQpIHsKICAgIHJldHVybiB1cHBlckJvdW5kID8gX2NvcmVUeXBlcy5udWxsVHlwZSA6IF9jb3JlVHlwZXMub2JqZWN0TGVnYWN5UmF3VHlwZTsKICB9Cn0Kgf8ATU4/ASEJDxIVFhcRExUTFxIBQgE4AT0BLwFCKAEzAUQBHQFJAUoBGwFAIxcyLUUbSzQYLClDLRUpOywRPAIBUEdJRgIBUDhINjELIAQCATsXSy0SAVEnEgETJSUBLAFAARdQAgFCGkclATYBMgE2ATIBLy8EATszBAE5MQQBSksUMzwvOQYWRwQBKkkvNgQBRhZKF0cEAUYWShdHBAEMS09IEUtNFghQFggGNAQBQ00aBkxBBk1JRgZQTEo5Bk5MSw8GUEEjIzEiIiIkHR9GKQ4GAU9PUBwmUAEuFUIwCEcGAR81S0JCCAYBST0zATVPBgQBMlE5ByYHUE4SJiU9LgQBRAZLTQZLUE9ITQZNT1AxITYxJB0rMUwBPToBMSIpHEkxCAE6ITs7DzcsGB8bS0MIBgFQFx8OBgFASz06OiBHMAEsRDRJNTs1CAEWKgFCT1FKCAEfKggGAUQEAQwURS1COAQBKiJPThoTBhwEAUo6BlA+BlBDLjFPSBE3K0IUBjMEAQwbHBMNHQYEAVAWBkxCBk5LOjo9HCk+PgFAHC4YOCAPGDsgCA0pPj4BQBwuGDsgDxg4IAgGBAFLSxhPFU0EAScpISIdJC1DUSlIJwYBJSdDBgErOwQBRTsyFxAGAUpNKgdBB0wlJ0MuBg4EAgE0HgFQPisBDEVOBAIBR3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYV9lbnZpcm9ubWVudC5kYXJ0ZWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbmZlcmVuY2VfdmlzaXRvci5kYXJ0wAOQHS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy91dGlsL2xpbmsuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnIHNob3cgU3Vic3RpdHV0aW9uOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwoKaW1wb3J0ICcuLi8uLi9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0JwogICAgc2hvdwogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyLAogICAgICAgIEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZSwKICAgICAgICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzOwoKaW1wb3J0ICcuLi9mYXN0YV9jb2Rlcy5kYXJ0JzsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCc7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVyZW5jZV9lbmdpbmUuZGFydCc7CmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JzsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydCcgc2hvdyBVbmtub3duVHlwZTsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydCcgc2hvdyBncmVhdGVzdENsb3N1cmU7CgppbXBvcnQgJ2JvZHlfYnVpbGRlci5kYXJ0JyBzaG93IGNvbWJpbmVTdGF0ZW1lbnRzOwoKaW1wb3J0ICdjb2xsZWN0aW9ucy5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvckVsZW1lbnQsCiAgICAgICAgRm9ySW5FbGVtZW50LAogICAgICAgIEZvckluTWFwRW50cnksCiAgICAgICAgRm9yTWFwRW50cnksCiAgICAgICAgSWZFbGVtZW50LAogICAgICAgIElmTWFwRW50cnksCiAgICAgICAgU3ByZWFkRWxlbWVudCwKICAgICAgICBTcHJlYWRNYXBFbnRyeSwKICAgICAgICBjb252ZXJ0VG9FbGVtZW50OwoKaW1wb3J0ICdpbXBsaWNpdF90eXBlX2FyZ3VtZW50LmRhcnQnIHNob3cgSW1wbGljaXRUeXBlQXJndW1lbnQ7CgppbXBvcnQgJ2ludGVybmFsX2FzdC5kYXJ0JzsKCmltcG9ydCAnbGF0ZV9sb3dlcmluZy5kYXJ0JyBhcyBsYXRlX2xvd2VyaW5nOwoKY2xhc3MgSW5mZXJlbmNlVmlzaXRvcgogICAgaW1wbGVtZW50cwogICAgICAgIEV4cHJlc3Npb25WaXNpdG9yMTxFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0LCBEYXJ0VHlwZT4sCiAgICAgICAgU3RhdGVtZW50VmlzaXRvcjxTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQ+LAogICAgICAgIEluaXRpYWxpemVyVmlzaXRvcjx2b2lkPiB7CiAgZmluYWwgVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcjsKCiAgQ2xhc3MgbWFwRW50cnlDbGFzczsKCiAgLy8gU3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIG1hcCBlbnRyeSBmb3VuZCBieSBpbmZlck1hcEVudHJ5LgogIGludCBtYXBFbnRyeU9mZnNldCA9IG51bGw7CgogIC8vIFN0b3JlcyB0aGUgb2Zmc2V0IG9mIHRoZSBtYXAgc3ByZWFkIGZvdW5kIGJ5IGluZmVyTWFwRW50cnkuCiAgaW50IG1hcFNwcmVhZE9mZnNldCA9IG51bGw7CgogIC8vIFN0b3JlcyB0aGUgb2Zmc2V0IG9mIHRoZSBpdGVyYWJsZSBzcHJlYWQgZm91bmQgYnkgaW5mZXJNYXBFbnRyeS4KICBpbnQgaXRlcmFibGVTcHJlYWRPZmZzZXQgPSBudWxsOwoKICAvLyBTdG9yZXMgdGhlIHR5cGUgb2YgdGhlIGl0ZXJhYmxlIHNwcmVhZCBmb3VuZCBieSBpbmZlck1hcEVudHJ5LgogIERhcnRUeXBlIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IG51bGw7CgogIEluZmVyZW5jZVZpc2l0b3IodGhpcy5pbmZlcnJlcik7CgogIEV4cHJlc3Npb24gX2Nsb25lKEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKG5vZGUgaXMgVGhpc0V4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIG5ldyBUaGlzRXhwcmVzc2lvbigpLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIGlmIChub2RlIGlzIFZhcmlhYmxlR2V0KSB7CiAgICAgIGFzc2VydCgKICAgICAgICAgIG5vZGUudmFyaWFibGUuaXNGaW5hbCwKICAgICAgICAgICJUcnlpbmcgdG8gY2xvbmUgVmFyaWFibGVHZXQgb2Ygbm9uLWZpbmFsIHZhcmlhYmxlIgogICAgICAgICAgIiAke25vZGUudmFyaWFibGV9LiIpOwogICAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KG5vZGUudmFyaWFibGUsIG5vZGUucHJvbW90ZWRUeXBlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDbG9uZSBub3Qgc3VwcG9ydGVkIGZvciAke25vZGUucnVudGltZVR5cGV9LiIpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBfdW5oYW5kbGVkRXhwcmVzc2lvbigKICAgICAgRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgIkluZmVyZW5jZVZpc2l0b3IiLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZXIuaGVscGVyLnVyaSk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgSW52YWxpZFR5cGUoKSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGRlZmF1bHRFeHByZXNzaW9uKAogICAgICBFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gX3VuaGFuZGxlZEV4cHJlc3Npb24obm9kZSwgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBkZWZhdWx0QmFzaWNMaXRlcmFsKAogICAgICBCYXNpY0xpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkRXhwcmVzc2lvbihub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0QmxvY2tFeHByZXNzaW9uKAogICAgICBCbG9ja0V4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkRXhwcmVzc2lvbihub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKAogICAgICBDb25zdGFudEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkRXhwcmVzc2lvbihub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbigKICAgICAgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIF91bmhhbmRsZWRFeHByZXNzaW9uKG5vZGUsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXREaXJlY3RQcm9wZXJ0eUdldCgKICAgICAgRGlyZWN0UHJvcGVydHlHZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkRXhwcmVzc2lvbihub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0RGlyZWN0UHJvcGVydHlTZXQoCiAgICAgIERpcmVjdFByb3BlcnR5U2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gX3VuaGFuZGxlZEV4cHJlc3Npb24obm9kZSwgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdEZpbGVVcmlFeHByZXNzaW9uKAogICAgICBGaWxlVXJpRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIF91bmhhbmRsZWRFeHByZXNzaW9uKG5vZGUsIHR5cGVDb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRJbnN0YW5jZUNyZWF0aW9uKAogICAgICBJbnN0YW5jZUNyZWF0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gX3VuaGFuZGxlZEV4cHJlc3Npb24obm9kZSwgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdEluc3RhbnRpYXRpb24oCiAgICAgIEluc3RhbnRpYXRpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkRXhwcmVzc2lvbihub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TGlzdENvbmNhdGVuYXRpb24oCiAgICAgIExpc3RDb25jYXRlbmF0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gX3VuaGFuZGxlZEV4cHJlc3Npb24obm9kZSwgdHlwZUNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdE1hcENvbmNhdGVuYXRpb24oCiAgICAgIE1hcENvbmNhdGVuYXRpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkRXhwcmVzc2lvbihub2RlLCB0eXBlQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0U2V0Q29uY2F0ZW5hdGlvbigKICAgICAgU2V0Q29uY2F0ZW5hdGlvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIF91bmhhbmRsZWRFeHByZXNzaW9uKG5vZGUsIHR5cGVDb250ZXh0KTsKICB9CgogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBfdW5oYW5kbGVkU3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICByZXR1cm4gdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgIkluZmVyZW5jZVZpc2l0b3IiLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5mZXJyZXIuaGVscGVyLnVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgZGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgewogICAgcmV0dXJuIF91bmhhbmRsZWRTdGF0ZW1lbnQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRBc3NlcnRCbG9jayhBc3NlcnRCbG9jayBub2RlKSB7CiAgICByZXR1cm4gX3VuaGFuZGxlZFN0YXRlbWVudChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2aXNpdFRyeUNhdGNoKFRyeUNhdGNoIG5vZGUpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHZpc2l0VHJ5RmluYWxseShUcnlGaW5hbGx5IG5vZGUpIHsKICAgIHJldHVybiBfdW5oYW5kbGVkU3RhdGVtZW50KG5vZGUpOwogIH0KCiAgdm9pZCBfdW5oYW5kbGVkSW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgdW5oYW5kbGVkKCIke25vZGUucnVudGltZVR5cGV9IiwgIkluZmVyZW5jZVZpc2l0b3IiLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgbm9kZS5sb2NhdGlvbi5maWxlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZGVmYXVsdEluaXRpYWxpemVyKEluaXRpYWxpemVyIG5vZGUpIHsKICAgIF91bmhhbmRsZWRJbml0aWFsaXplcihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRJbnZhbGlkSW5pdGlhbGl6ZXIoSW5pdGlhbGl6ZXIgbm9kZSkgewogICAgX3VuaGFuZGxlZEluaXRpYWxpemVyKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCB2aXNpdExvY2FsSW5pdGlhbGl6ZXIoTG9jYWxJbml0aWFsaXplciBub2RlKSB7CiAgICBfdW5oYW5kbGVkSW5pdGlhbGl6ZXIobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0SW52YWxpZEV4cHJlc3Npb24oCiAgICAgIEludmFsaWRFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBUaGUgaW5mZXJyZWQgdHlwZSBzaG91bGQgYmUgYW4gSW52YWxpZFR5cGUuIFVzaW5nCiAgICAvLyBCb3R0b21UeXBlIGxlYWRzIHRvIGNhc2NhZGluZyBlcnJvcnMgc28gd2UgdXNlIER5bmFtaWNUeXBlIGZvciBub3cuCiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgRHluYW1pY1R5cGUoKSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0SW50TGl0ZXJhbCgKICAgICAgSW50TGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5pbnRSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRBc0V4cHJlc3Npb24oCiAgICAgIEFzRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBvcGVyYW5kUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUub3BlcmFuZCwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBub2RlLm9wZXJhbmQgPSBvcGVyYW5kUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuYXNFeHByZXNzaW9uX2VuZChub2RlLm9wZXJhbmQsIG5vZGUudHlwZSk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQobm9kZS50eXBlLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRBc3NlcnRJbml0aWFsaXplcihBc3NlcnRJbml0aWFsaXplciBub2RlKSB7CiAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgcmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5zdGF0ZW1lbnQpOwogICAgaWYgKHJlc3VsdC5oYXNDaGFuZ2VkKSB7CiAgICAgIG5vZGUuc3RhdGVtZW50ID0gcmVzdWx0LnN0YXRlbWVudC4ucGFyZW50ID0gbm9kZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2aXNpdEFzc2VydFN0YXRlbWVudChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmFzc2VydF9iZWdpbigpOwogICAgSW50ZXJmYWNlVHlwZSBleHBlY3RlZFR5cGUgPQogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgY29uZGl0aW9uUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUuY29uZGl0aW9uLCBleHBlY3RlZFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwoKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0KICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KGV4cGVjdGVkVHlwZSwgY29uZGl0aW9uUmVzdWx0KTsKICAgIG5vZGUuY29uZGl0aW9uID0gY29uZGl0aW9uLi5wYXJlbnQgPSBub2RlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmFzc2VydF9hZnRlckNvbmRpdGlvbihub2RlLmNvbmRpdGlvbik7CiAgICBpZiAobm9kZS5tZXNzYWdlICE9IG51bGwpIHsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBtZXNzYWdlUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgbm9kZS5tZXNzYWdlLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBub2RlLm1lc3NhZ2UgPSBtZXNzYWdlUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICB9CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuYXNzZXJ0X2VuZCgpOwogICAgcmV0dXJuIGNvbnN0IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdEF3YWl0RXhwcmVzc2lvbigKICAgICAgQXdhaXRFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoIWluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pc0VtcHR5Q29udGV4dCh0eXBlQ29udGV4dCkpIHsKICAgICAgdHlwZUNvbnRleHQgPSBpbmZlcnJlci53cmFwRnV0dXJlT3JUeXBlKHR5cGVDb250ZXh0KTsKICAgIH0KICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgb3BlcmFuZFJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLm9wZXJhbmQsIHR5cGVDb250ZXh0LCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShvcGVyYW5kUmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICBub2RlLm9wZXJhbmQgPSBvcGVyYW5kUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBub2RlKTsKICB9CgogIExpc3Q8U3RhdGVtZW50PiBfdmlzaXRTdGF0ZW1lbnRzPFQgZXh0ZW5kcyBTdGF0ZW1lbnQ+KExpc3Q8VD4gc3RhdGVtZW50cykgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHJlc3VsdDsKICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICBUIHN0YXRlbWVudCA9IHN0YXRlbWVudHNbaW5kZXhdOwogICAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgc3RhdGVtZW50UmVzdWx0ID0KICAgICAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KHN0YXRlbWVudCk7CiAgICAgIGlmIChzdGF0ZW1lbnRSZXN1bHQuaGFzQ2hhbmdlZCkgewogICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0ID0gPFQ+W107CiAgICAgICAgICByZXN1bHQuYWRkQWxsKHN0YXRlbWVudHMuc3VibGlzdCgwLCBpbmRleCkpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGVtZW50UmVzdWx0LnN0YXRlbWVudENvdW50ID09IDEpIHsKICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50UmVzdWx0LnN0YXRlbWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5hZGRBbGwoc3RhdGVtZW50UmVzdWx0LnN0YXRlbWVudHMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgIGluZmVycmVyLnJlZ2lzdGVySWZVbnJlYWNoYWJsZUZvclRlc3Rpbmcobm9kZSk7CiAgICBMaXN0PFN0YXRlbWVudD4gcmVzdWx0ID0gX3Zpc2l0U3RhdGVtZW50czxTdGF0ZW1lbnQ+KG5vZGUuc3RhdGVtZW50cyk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2socmVzdWx0KS4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgaW5mZXJyZXIubGlicmFyeS5sb2FkZXIuZGF0YUZvclRlc3Rpbmc/LnJlZ2lzdGVyQWxpYXMobm9kZSwgYmxvY2spOwogICAgICByZXR1cm4gbmV3IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdC5zaW5nbGUoYmxvY2spOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNvbnN0IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCgpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdEJvb2xMaXRlcmFsKAogICAgICBCb29sTGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmJvb2xlYW5MaXRlcmFsKG5vZGUsIG5vZGUudmFsdWUpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRCcmVha1N0YXRlbWVudCgKICAgICAgY292YXJpYW50IEJyZWFrU3RhdGVtZW50SW1wbCBub2RlKSB7CiAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZWZhY3RvciBicmVhay9jb250aW51ZSBlbmNvZGluZy4KICAgIGFzc2VydChub2RlLnRhcmdldFN0YXRlbWVudCAhPSBudWxsKTsKICAgIGlmIChub2RlLmlzQ29udGludWUpIHsKICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmhhbmRsZUNvbnRpbnVlKG5vZGUudGFyZ2V0U3RhdGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5oYW5kbGVCcmVhayhub2RlLnRhcmdldFN0YXRlbWVudCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0Q2FzY2FkZShDYXNjYWRlIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnZhcmlhYmxlLmluaXRpYWxpemVyLCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICBpZiAobm9kZS5pc051bGxBd2FyZSkgewogICAgICByZXBvcnROb25OdWxsYWJsZUluTnVsbEF3YXJlV2FybmluZ0lmTmVlZGVkKAogICAgICAgICAgcmVzdWx0LmluZmVycmVkVHlwZSwgIj8uLiIsIG5vZGUuZmlsZU9mZnNldCk7CiAgICB9CgogICAgbm9kZS52YXJpYWJsZS5pbml0aWFsaXplciA9IHJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlLnZhcmlhYmxlOwogICAgbm9kZS52YXJpYWJsZS50eXBlID0gcmVzdWx0LmluZmVycmVkVHlwZTsKICAgIE51bGxBd2FyZUd1YXJkIG51bGxBd2FyZUd1YXJkOwogICAgaWYgKG5vZGUuaXNOdWxsQXdhcmUpIHsKICAgICAgbnVsbEF3YXJlR3VhcmQgPSBpbmZlcnJlci5jcmVhdGVOdWxsQXdhcmVHdWFyZChub2RlLnZhcmlhYmxlKTsKICAgIH0KCiAgICBMaXN0PEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQ+IGV4cHJlc3Npb25SZXN1bHRzID0KICAgICAgICA8RXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdD5bXTsKICAgIGZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIGluIG5vZGUuZXhwcmVzc2lvbnMpIHsKICAgICAgZXhwcmVzc2lvblJlc3VsdHMuYWRkKGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGV4cHJlc3Npb24sIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSkpOwogICAgfQogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudCA9IGNyZWF0ZVZhcmlhYmxlR2V0KG5vZGUudmFyaWFibGUpOwogICAgZm9yIChpbnQgaW5kZXggPSBleHByZXNzaW9uUmVzdWx0cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gY3JlYXRlTGV0KAogICAgICAgICAgY3JlYXRlVmFyaWFibGUoZXhwcmVzc2lvblJlc3VsdHNbaW5kZXhdLmV4cHJlc3Npb24sIGNvbnN0IFZvaWRUeXBlKCkpLAogICAgICAgICAgcmVwbGFjZW1lbnQpOwogICAgfQoKICAgIGlmIChub2RlLmlzTnVsbEF3YXJlKSB7CiAgICAgIHJlcGxhY2VtZW50ID0KICAgICAgICAgIG51bGxBd2FyZUd1YXJkLmNyZWF0ZUV4cHJlc3Npb24ocmVzdWx0LmluZmVycmVkVHlwZSwgcmVwbGFjZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTGV0KG5vZGUudmFyaWFibGUsIHJlcGxhY2VtZW50KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChyZXN1bHQuaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEludGVyZmFjZVR5cGUgZXhwZWN0ZWRUeXBlID0KICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGNvbmRpdGlvblJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmNvbmRpdGlvbiwgZXhwZWN0ZWRUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0KICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KGV4cGVjdGVkVHlwZSwgY29uZGl0aW9uUmVzdWx0KTsKICAgIG5vZGUuY29uZGl0aW9uID0gY29uZGl0aW9uLi5wYXJlbnQgPSBub2RlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmNvbmRpdGlvbmFsX3RoZW5CZWdpbihub2RlLmNvbmRpdGlvbik7CiAgICBib29sIGlzVGhlblJlYWNoYWJsZSA9IGluZmVycmVyLmZsb3dBbmFseXNpcy5pc1JlYWNoYWJsZTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdGhlblJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLnRoZW4sIHR5cGVDb250ZXh0LCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIG5vZGUudGhlbiA9IHRoZW5SZXN1bHQuZXhwcmVzc2lvbi4ucGFyZW50ID0gbm9kZTsKICAgIGluZmVycmVyLnJlZ2lzdGVySWZVbnJlYWNoYWJsZUZvclRlc3Rpbmcobm9kZS50aGVuLAogICAgICAgIGlzUmVhY2hhYmxlOiBpc1RoZW5SZWFjaGFibGUpOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmNvbmRpdGlvbmFsX2Vsc2VCZWdpbihub2RlLnRoZW4pOwogICAgYm9vbCBpc090aGVyd2lzZVJlYWNoYWJsZSA9IGluZmVycmVyLmZsb3dBbmFseXNpcy5pc1JlYWNoYWJsZTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgb3RoZXJ3aXNlUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUub3RoZXJ3aXNlLCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIG5vZGUub3RoZXJ3aXNlID0gb3RoZXJ3aXNlUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICBpbmZlcnJlci5yZWdpc3RlcklmVW5yZWFjaGFibGVGb3JUZXN0aW5nKG5vZGUub3RoZXJ3aXNlLAogICAgICAgIGlzUmVhY2hhYmxlOiBpc090aGVyd2lzZVJlYWNoYWJsZSk7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuY29uZGl0aW9uYWxfZW5kKG5vZGUuY29uZGl0aW9uLCBub2RlLm90aGVyd2lzZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKHRoZW5SZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgICAgICBvdGhlcndpc2VSZXN1bHQuaW5mZXJyZWRUeXBlLCBpbmZlcnJlci5saWJyYXJ5LmxpYnJhcnkpOwogICAgbm9kZS5zdGF0aWNUeXBlID0gaW5mZXJyZWRUeXBlOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyQ29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlcyhub2RlLnRhcmdldCk7CiAgICBib29sIGhhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSAhPSBudWxsOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uCiAgICAgICAgICAgIC5jb21wdXRlVGhpc0Z1bmN0aW9uVHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICBub2RlLm5hbWUsCiAgICAgICAgcmV0dXJuVHlwZToKICAgICAgICAgICAgY29tcHV0ZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShub2RlLnRhcmdldCwgaW5mZXJyZXIuY29yZVR5cGVzKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsKSB7CiAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OwogICAgICBpZiAoIWhhc0V4cGxpY2l0VHlwZUFyZ3VtZW50cykgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgbm9kZSwgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LCBpbmZlcnJlci5oZWxwZXIudXJpLAogICAgICAgICAgICBpbmZlcnJlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICByZXN1bHQuaW5mZXJyZWRUeXBlLCByZXN1bHQuYXBwbHlSZXN1bHQobm9kZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnQoCiAgICAgIENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5oYW5kbGVDb250aW51ZShub2RlLnRhcmdldC5ib2R5KTsKICAgIHJldHVybiBjb25zdCBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQoKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRFeHRlbnNpb25UZWFyT2ZmKAogICAgICBFeHRlbnNpb25UZWFyT2ZmIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBGdW5jdGlvblR5cGUgY2FsbGVlVHlwZSA9IG5vZGUudGFyZ2V0ICE9IG51bGwKICAgICAgICA/IG5vZGUudGFyZ2V0LmZ1bmN0aW9uLmNvbXB1dGVGdW5jdGlvblR5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSkKICAgICAgICA6IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgICAgIFtdLCBjb25zdCBEeW5hbWljVHlwZSgpLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIFR5cGVBcmd1bWVudHNJbmZvIHR5cGVBcmd1bWVudHNJbmZvID0gZ2V0VHlwZUFyZ3VtZW50c0luZm8obm9kZS5hcmd1bWVudHMpOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24odHlwZUNvbnRleHQsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCBjYWxsZWVUeXBlLCBub2RlLmFyZ3VtZW50cywgbm9kZS50YXJnZXQubmFtZSk7CiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbmV3IFN0YXRpY0ludm9jYXRpb24obm9kZS50YXJnZXQsIG5vZGUuYXJndW1lbnRzKTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCAmJiBub2RlLnRhcmdldCAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmxpYnJhcnkuY2hlY2tCb3VuZHNJblN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICByZXBsYWNlbWVudCwKICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICAgIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICB0eXBlQXJndW1lbnRzSW5mbyk7CiAgICB9CiAgICByZXR1cm4gaW5mZXJyZXIuaW5zdGFudGlhdGVUZWFyT2ZmKAogICAgICAgIHJlc3VsdC5pbmZlcnJlZFR5cGUsIHR5cGVDb250ZXh0LCByZXN1bHQuYXBwbHlSZXN1bHQocmVwbGFjZW1lbnQpKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRFeHRlbnNpb25TZXQoCiAgICAgIEV4dGVuc2lvblNldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWNlaXZlclJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKCiAgICBMaXN0PERhcnRUeXBlPiBleHRlbnNpb25UeXBlQXJndW1lbnRzID0KICAgICAgICBpbmZlcnJlci5jb21wdXRlRXh0ZW5zaW9uVHlwZUFyZ3VtZW50KG5vZGUuZXh0ZW5zaW9uLAogICAgICAgICAgICBub2RlLmV4cGxpY2l0VHlwZUFyZ3VtZW50cywgcmVjZWl2ZXJSZXN1bHQuaW5mZXJyZWRUeXBlKTsKCiAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUgPSBpbmZlcnJlci5nZXRFeHRlbnNpb25SZWNlaXZlclR5cGUoCiAgICAgICAgbm9kZS5leHRlbnNpb24sIGV4dGVuc2lvblR5cGVBcmd1bWVudHMpOwoKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXIgPQogICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQocmVjZWl2ZXJUeXBlLCByZWNlaXZlclJlc3VsdCk7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCA9IG5ldyBFeHRlbnNpb25BY2Nlc3NUYXJnZXQoCiAgICAgICAgbm9kZS50YXJnZXQsIG51bGwsIFByb2NlZHVyZUtpbmQuU2V0dGVyLCBleHRlbnNpb25UeXBlQXJndW1lbnRzKTsKCiAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUgPQogICAgICAgIGluZmVycmVyLmdldFNldHRlclR5cGUodGFyZ2V0LCByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmFsdWVSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YWx1ZSwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdCh2YWx1ZVR5cGUsIHZhbHVlUmVzdWx0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyaWFibGU7CiAgICBpZiAobm9kZS5mb3JFZmZlY3QpIHsKICAgICAgLy8gTm8gbmVlZCBmb3IgdmFsdWUgdmFyaWFibGUuCiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUodmFsdWUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICAgIHZhbHVlID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWNlaXZlclZhcmlhYmxlOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0IHx8IG5vZGUucmVhZE9ubHlSZWNlaXZlcikgewogICAgICAvLyBObyBuZWVkIGZvciByZWNlaXZlciB2YXJpYWJsZS4KICAgIH0gZWxzZSB7CiAgICAgIHJlY2VpdmVyVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZShyZWNlaXZlciwgcmVjZWl2ZXJSZXN1bHQuaW5mZXJyZWRUeXBlKTsKICAgICAgcmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIH0KICAgIEV4cHJlc3Npb24gYXNzaWdubWVudCA9IG5ldyBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgIG5vZGUudGFyZ2V0LAogICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W3JlY2VpdmVyLCB2YWx1ZV0sCiAgICAgICAgICAgIHR5cGVzOiBleHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KQogICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChub2RlLmZvckVmZmVjdCkgewogICAgICBhc3NlcnQocmVjZWl2ZXJWYXJpYWJsZSA9PSBudWxsKTsKICAgICAgYXNzZXJ0KHZhbHVlVmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIHJlcGxhY2VtZW50ID0gYXNzaWdubWVudDsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlICE9IG51bGwpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGFzc2lnbm1lbnRWYXJpYWJsZSA9CiAgICAgICAgICBjcmVhdGVWYXJpYWJsZShhc3NpZ25tZW50LCBjb25zdCBWb2lkVHlwZSgpKTsKICAgICAgcmVwbGFjZW1lbnQgPSBjcmVhdGVMZXQodmFsdWVWYXJpYWJsZSwKICAgICAgICAgIGNyZWF0ZUxldChhc3NpZ25tZW50VmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSk7CiAgICAgIGlmIChyZWNlaXZlclZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgICByZXBsYWNlbWVudCA9IGNyZWF0ZUxldChyZWNlaXZlclZhcmlhYmxlLCByZXBsYWNlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIHJlcGxhY2VtZW50LmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQodmFsdWVSZXN1bHQuaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0Q29tcG91bmRFeHRlbnNpb25TZXQoCiAgICAgIENvbXBvdW5kRXh0ZW5zaW9uU2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlY2VpdmVyUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUucmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwoKICAgIExpc3Q8RGFydFR5cGU+IGV4dGVuc2lvblR5cGVBcmd1bWVudHMgPQogICAgICAgIGluZmVycmVyLmNvbXB1dGVFeHRlbnNpb25UeXBlQXJndW1lbnQobm9kZS5leHRlbnNpb24sCiAgICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlQXJndW1lbnRzLCByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGUpOwoKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IGluZmVycmVyLmdldEV4dGVuc2lvblJlY2VpdmVyVHlwZSgKICAgICAgICBub2RlLmV4dGVuc2lvbiwgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CgogICAgRXhwcmVzc2lvbiByZWNlaXZlciA9CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdChyZWNlaXZlclR5cGUsIHJlY2VpdmVyUmVzdWx0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHJlYWRSZWNlaXZlcjsKICAgIEV4cHJlc3Npb24gd3JpdGVSZWNlaXZlcjsKICAgIGlmIChub2RlLnJlYWRPbmx5UmVjZWl2ZXIgJiYgaWRlbnRpY2FsKHJlY2VpdmVyLCBub2RlLnJlY2VpdmVyKSkgewogICAgICByZWFkUmVjZWl2ZXIgPSByZWNlaXZlcjsKICAgICAgd3JpdGVSZWNlaXZlciA9IF9jbG9uZShyZWNlaXZlcik7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlclZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSk7CiAgICAgIHJlYWRSZWNlaXZlciA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlY2VpdmVyVmFyaWFibGUpOwogICAgICB3cml0ZVJlY2VpdmVyID0gY3JlYXRlVmFyaWFibGVHZXQocmVjZWl2ZXJWYXJpYWJsZSk7CiAgICB9CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHJlYWRUYXJnZXQgPSBub2RlLmdldHRlciA9PSBudWxsCiAgICAgICAgPyBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpCiAgICAgICAgOiBuZXcgRXh0ZW5zaW9uQWNjZXNzVGFyZ2V0KAogICAgICAgICAgICBub2RlLmdldHRlciwgbnVsbCwgUHJvY2VkdXJlS2luZC5HZXR0ZXIsIGV4dGVuc2lvblR5cGVBcmd1bWVudHMpOwoKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gaW5mZXJyZXIuZ2V0R2V0dGVyVHlwZShyZWFkVGFyZ2V0LCByZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb24gcmVhZDsKICAgIGlmIChyZWFkVGFyZ2V0LmlzTWlzc2luZykgewogICAgICByZWFkID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ1Byb3BlcnR5R2V0KAogICAgICAgICAgbm9kZS5yZWFkT2Zmc2V0LCByZWFkUmVjZWl2ZXIsIHJlYWRUeXBlLCBub2RlLnByb3BlcnR5TmFtZSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQocmVhZFRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcik7CiAgICAgIHJlYWQgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIHJlYWRUYXJnZXQubWVtYmVyLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICAgIHJlYWRSZWNlaXZlciwKICAgICAgICAgIF0sIHR5cGVzOiByZWFkVGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5yZWFkT2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUucmVhZE9mZnNldDsKICAgIH0KCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGJpbmFyeVJlc3VsdCA9IF9jb21wdXRlQmluYXJ5RXhwcmVzc2lvbigKICAgICAgICBub2RlLmJpbmFyeU9mZnNldCwgcmVhZCwgcmVhZFR5cGUsIG5vZGUuYmluYXJ5TmFtZSwgbm9kZS5yaHMpOwogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBiaW5hcnlSZXN1bHQuZXhwcmVzc2lvbjsKICAgIERhcnRUeXBlIGJpbmFyeVR5cGUgPSBiaW5hcnlSZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCB3cml0ZVRhcmdldCA9IG5vZGUuc2V0dGVyID09IG51bGwKICAgICAgICA/IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5taXNzaW5nKCkKICAgICAgICA6IG5ldyBFeHRlbnNpb25BY2Nlc3NUYXJnZXQoCiAgICAgICAgICAgIG5vZGUuc2V0dGVyLCBudWxsLCBQcm9jZWR1cmVLaW5kLlNldHRlciwgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CgogICAgRGFydFR5cGUgdmFsdWVUeXBlID0gaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKCiAgICBFeHByZXNzaW9uIHZhbHVlID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSh2YWx1ZVR5cGUsIGJpbmFyeVR5cGUsIGJpbmFyeSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyaWFibGU7CiAgICBpZiAobm9kZS5mb3JFZmZlY3QpIHsKICAgICAgLy8gTm8gbmVlZCBmb3IgdmFsdWUgdmFyaWFibGUuCiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUodmFsdWUsIHZhbHVlVHlwZSk7CiAgICAgIHZhbHVlID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiB3cml0ZTsKICAgIGlmICh3cml0ZVRhcmdldC5pc01pc3NpbmcpIHsKICAgICAgd3JpdGUgPSBpbmZlcnJlci5jcmVhdGVNaXNzaW5nUHJvcGVydHlTZXQoCiAgICAgICAgICBub2RlLndyaXRlT2Zmc2V0LCB3cml0ZVJlY2VpdmVyLCByZWFkVHlwZSwgbm9kZS5wcm9wZXJ0eU5hbWUsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh3cml0ZVRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcik7CiAgICAgIHdyaXRlID0gbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICB3cml0ZVRhcmdldC5tZW1iZXIsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgd3JpdGVSZWNlaXZlciwKICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICBdLCB0eXBlczogd3JpdGVUYXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLndyaXRlT2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUud3JpdGVPZmZzZXQ7CiAgICB9CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChub2RlLmZvckVmZmVjdCkgewogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSA9PSBudWxsKTsKICAgICAgcmVwbGFjZW1lbnQgPSB3cml0ZTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlICE9IG51bGwpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlVmFyaWFibGUgPQogICAgICAgICAgY3JlYXRlVmFyaWFibGUod3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgICByZXBsYWNlbWVudCA9IGNyZWF0ZUxldCh2YWx1ZVZhcmlhYmxlLAogICAgICAgICAgY3JlYXRlTGV0KHdyaXRlVmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSk7CiAgICB9CiAgICBpZiAocmVjZWl2ZXJWYXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gY3JlYXRlTGV0KHJlY2VpdmVyVmFyaWFibGUsIHJlcGxhY2VtZW50KTsKICAgIH0KICAgIHJlcGxhY2VtZW50LmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQodmFsdWVUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0RGVmZXJyZWRDaGVjaygKICAgICAgRGVmZXJyZWRDaGVjayBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgLy8gU2luY2UgdGhlIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGluIHRoZSBib2R5IHdlIGRvbid0IG5lZWQgdG8gdHlwZSBpbmZlcgogICAgLy8gaXQuICBXZSBjYW4ganVzdCB0eXBlIGluZmVyIHRoZSBib2R5LgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5leHByZXNzaW9uLCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbmV3IExldChub2RlLnZhcmlhYmxlLCByZXN1bHQuZXhwcmVzc2lvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KHJlc3VsdC5pbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2aXNpdERvU3RhdGVtZW50KERvU3RhdGVtZW50IG5vZGUpIHsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5kb1N0YXRlbWVudF9ib2R5QmVnaW4obm9kZSk7CiAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgYm9keVJlc3VsdCA9IGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgICBpZiAoYm9keVJlc3VsdC5oYXNDaGFuZ2VkKSB7CiAgICAgIG5vZGUuYm9keSA9IGJvZHlSZXN1bHQuc3RhdGVtZW50Li5wYXJlbnQgPSBub2RlOwogICAgfQogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmRvU3RhdGVtZW50X2NvbmRpdGlvbkJlZ2luKCk7CiAgICBJbnRlcmZhY2VUeXBlIGJvb2xUeXBlID0KICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGNvbmRpdGlvblJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmNvbmRpdGlvbiwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPQogICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoYm9vbFR5cGUsIGNvbmRpdGlvblJlc3VsdCk7CiAgICBub2RlLmNvbmRpdGlvbiA9IGNvbmRpdGlvbi4ucGFyZW50ID0gbm9kZTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5kb1N0YXRlbWVudF9lbmQoY29uZGl0aW9uKTsKICAgIHJldHVybiBjb25zdCBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQoKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXREb3VibGVMaXRlcmFsKAogICAgICBEb3VibGVMaXRlcmFsIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmRvdWJsZVJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSksIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHZpc2l0RW1wdHlTdGF0ZW1lbnQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewogICAgLy8gTm8gaW5mZXJlbmNlIG5lZWRzIHRvIGJlIGRvbmUuCiAgICByZXR1cm4gY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5leHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIG5vZGUuZXhwcmVzc2lvbiA9IHJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgcmV0dXJuIGNvbnN0IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCgpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudCgKICAgICAgRmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBib29sIGhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSAhPSBudWxsOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uCiAgICAgICAgICAgIC5jb21wdXRlVGhpc0Z1bmN0aW9uVHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICBub2RlLm5hbWUsCiAgICAgICAgcmV0dXJuVHlwZToKICAgICAgICAgICAgY29tcHV0ZUNvbnN0cnVjdG9yUmV0dXJuVHlwZShub2RlLnRhcmdldCwgaW5mZXJyZXIuY29yZVR5cGVzKSwKICAgICAgICBpc0NvbnN0OiBub2RlLmlzQ29uc3QpOwogICAgbm9kZS5oYXNCZWVuSW5mZXJyZWQgPSB0cnVlOwogICAgRXhwcmVzc2lvbiByZXN1bHROb2RlID0gbm9kZTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgaWYgKCFoYWRFeHBsaWNpdFR5cGVBcmd1bWVudHMpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5GYWN0b3J5SW52b2NhdGlvbigKICAgICAgICAgICAgbm9kZSwgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LCBpbmZlcnJlci5oZWxwZXIudXJpLAogICAgICAgICAgICBpbmZlcnJlZDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmIGluZmVycmVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIGlmIChub2RlLnRhcmdldCA9PSBpbmZlcnJlci5jb3JlVHlwZXMubGlzdERlZmF1bHRDb25zdHJ1Y3RvcikgewogICAgICAgIGlmIChpbmZlcnJlci5ubmJkU3Ryb25nTW9kZSkgewogICAgICAgICAgcmVzdWx0Tm9kZSA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgICAgIG5vZGUsIG1lc3NhZ2VEZWZhdWx0TGlzdENvbnN0cnVjdG9yRXJyb3IsIG5vTGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VEZWZhdWx0TGlzdENvbnN0cnVjdG9yV2FybmluZywKICAgICAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsIG5vTGVuZ3RoLCBpbmZlcnJlci5saWJyYXJ5LmZpbGVVcmkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHJlc3VsdC5pbmZlcnJlZFR5cGUsIHJlc3VsdC5hcHBseVJlc3VsdChyZXN1bHROb2RlKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0RmllbGRJbml0aWFsaXplcihGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5pdGlhbGl6ZXJSZXN1bHQgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLnZhbHVlLCBub2RlLmZpZWxkLnR5cGUsIHRydWUpOwogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoCiAgICAgICAgbm9kZS5maWVsZC50eXBlLCBpbml0aWFsaXplclJlc3VsdCwKICAgICAgICBmaWxlT2Zmc2V0OiBub2RlLmZpbGVPZmZzZXQpOwogICAgbm9kZS52YWx1ZSA9IGluaXRpYWxpemVyLi5wYXJlbnQgPSBub2RlOwogIH0KCiAgRm9ySW5SZXN1bHQgaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZSgKICAgICAgVHJlZU5vZGUgbm9kZSwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwKICAgICAgRXhwcmVzc2lvbiBpdGVyYWJsZSwKICAgICAgU3RhdGVtZW50IGV4cHJlc3Npb25FZmZlY3RzLAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pIHsKICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlOwogICAgYm9vbCB0eXBlTmVlZGVkID0gZmFsc2U7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaW5mZXJyZXIuaXNUb3BMZXZlbDsKICAgIGlmICh2YXJpYWJsZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCAmJiB2YXJpYWJsZS5pc0ltcGxpY2l0bHlUeXBlZCkgewogICAgICB0eXBlTmVlZGVkID0gdHJ1ZTsKICAgICAgZWxlbWVudFR5cGUgPSBjb25zdCBVbmtub3duVHlwZSgpOwogICAgfSBlbHNlIHsKICAgICAgZWxlbWVudFR5cGUgPSB2YXJpYWJsZS50eXBlOwogICAgfQoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaXRlcmFibGVSZXN1bHQgPSBpbmZlckZvckluSXRlcmFibGUoCiAgICAgICAgaXRlcmFibGUsIGVsZW1lbnRUeXBlLCB0eXBlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgaXNBc3luYzogaXNBc3luYyk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpdGVyYWJsZVJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICBpZiAodHlwZU5lZWRlZCkgewogICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24/LnJlY29yZCgKICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgIHZhcmlhYmxlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZScsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkVHlwZSkpOwogICAgICB2YXJpYWJsZS50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgfQoKICAgIC8vIFRoaXMgaXMgbWF0Y2hlZCBieSB0aGUgY2FsbCB0byBbZm9yRWFjaF9lbmRdIGluCiAgICAvLyBbaW5mZXJFbGVtZW50XSwgW2luZmVyTWFwRW50cnldIG9yIFtpbmZlckZvckluU3RhdGVtZW50XS4KICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JFYWNoX2JvZHlCZWdpbihub2RlLCB2YXJpYWJsZSwgdmFyaWFibGUudHlwZSk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wVmFyaWFibGUgPQogICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIHR5cGU6IGluZmVycmVkVHlwZSwgaXNGaW5hbDogdHJ1ZSk7CiAgICBWYXJpYWJsZUdldCB2YXJpYWJsZUdldCA9IG5ldyBWYXJpYWJsZUdldCh0ZW1wVmFyaWFibGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IHZhcmlhYmxlLmZpbGVPZmZzZXQ7CiAgICBUcmVlTm9kZSBwYXJlbnQgPSB2YXJpYWJsZS5wYXJlbnQ7CiAgICBFeHByZXNzaW9uIGltcGxpY2l0RG93bmNhc3QgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIHZhcmlhYmxlLnR5cGUsIGluZmVycmVkVHlwZSwgdmFyaWFibGVHZXQsCiAgICAgICAgZmlsZU9mZnNldDogcGFyZW50LmZpbGVPZmZzZXQsCiAgICAgICAgZXJyb3JUZW1wbGF0ZTogdGVtcGxhdGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUpOwogICAgU3RhdGVtZW50IGV4cHJlc3Npb25FZmZlY3Q7CiAgICBpZiAoIWlkZW50aWNhbChpbXBsaWNpdERvd25jYXN0LCB2YXJpYWJsZUdldCkpIHsKICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBpbXBsaWNpdERvd25jYXN0Li5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgZXhwcmVzc2lvbkVmZmVjdCA9IHZhcmlhYmxlOwogICAgICB2YXJpYWJsZSA9IHRlbXBWYXJpYWJsZTsKICAgIH0KICAgIGlmIChleHByZXNzaW9uRWZmZWN0cyAhPSBudWxsKSB7CiAgICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0KICAgICAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KGV4cHJlc3Npb25FZmZlY3RzKTsKICAgICAgaWYgKGJvZHlSZXN1bHQuaGFzQ2hhbmdlZCkgewogICAgICAgIGV4cHJlc3Npb25FZmZlY3RzID0gYm9keVJlc3VsdC5zdGF0ZW1lbnQ7CiAgICAgIH0KICAgICAgaWYgKGV4cHJlc3Npb25FZmZlY3QgIT0gbnVsbCkgewogICAgICAgIGV4cHJlc3Npb25FZmZlY3RzID0KICAgICAgICAgICAgY29tYmluZVN0YXRlbWVudHMoZXhwcmVzc2lvbkVmZmVjdCwgZXhwcmVzc2lvbkVmZmVjdHMpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBleHByZXNzaW9uRWZmZWN0cyA9IGV4cHJlc3Npb25FZmZlY3Q7CiAgICB9CiAgICByZXR1cm4gbmV3IEZvckluUmVzdWx0KAogICAgICAgIHZhcmlhYmxlLCBpdGVyYWJsZVJlc3VsdC5leHByZXNzaW9uLCBudWxsLCBleHByZXNzaW9uRWZmZWN0cyk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZmVyRm9ySW5JdGVyYWJsZSgKICAgICAgRXhwcmVzc2lvbiBpdGVyYWJsZSwgRGFydFR5cGUgZWxlbWVudFR5cGUsIGJvb2wgdHlwZU5lZWRlZCwKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2V9KSB7CiAgICBDbGFzcyBpdGVyYWJsZUNsYXNzID0gaXNBc3luYwogICAgICAgID8gaW5mZXJyZXIuY29yZVR5cGVzLnN0cmVhbUNsYXNzCiAgICAgICAgOiBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzczsKICAgIERhcnRUeXBlIGNvbnRleHQgPSBpbmZlcnJlci53cmFwVHlwZSgKICAgICAgICBlbGVtZW50VHlwZSwgaXRlcmFibGVDbGFzcywgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGl0ZXJhYmxlUmVzdWx0ID0gaW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKGl0ZXJhYmxlLCBjb250ZXh0LCB0eXBlTmVlZGVkLCBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICBEYXJ0VHlwZSBpdGVyYWJsZVR5cGUgPSBpdGVyYWJsZVJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlUmVzdWx0LmV4cHJlc3Npb247CiAgICBEYXJ0VHlwZSBpbmZlcnJlZEV4cHJlc3Npb25UeXBlID0KICAgICAgICBpbmZlcnJlci5yZXNvbHZlVHlwZVBhcmFtZXRlcihpdGVyYWJsZVR5cGUpOwogICAgaXRlcmFibGUgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGluZmVycmVyLndyYXBUeXBlKAogICAgICAgICAgICBjb25zdCBEeW5hbWljVHlwZSgpLCBpdGVyYWJsZUNsYXNzLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICBpbmZlcnJlZEV4cHJlc3Npb25UeXBlLAogICAgICAgIGl0ZXJhYmxlLAogICAgICAgIGVycm9yVGVtcGxhdGU6IHRlbXBsYXRlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZTsKICAgIGlmICh0eXBlTmVlZGVkKSB7CiAgICAgIGluZmVycmVkVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIGlmIChpbmZlcnJlZEV4cHJlc3Npb25UeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTaG91bGQgd2UgdXNlIHRoZSB0eXBlIG9mCiAgICAgICAgLy8gIGBpdGVyYWJsZS5pdGVyYXRvci5jdXJyZW50YCBpbnN0ZWFkPwogICAgICAgIExpc3Q8RGFydFR5cGU+IHN1cGVydHlwZUFyZ3VtZW50cyA9IGluZmVycmVyLmNsYXNzSGllcmFyY2h5CiAgICAgICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKAogICAgICAgICAgICAgICAgaW5mZXJyZWRFeHByZXNzaW9uVHlwZSwgaXRlcmFibGVDbGFzcyk7CiAgICAgICAgaWYgKHN1cGVydHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgICAgICBpbmZlcnJlZFR5cGUgPSBzdXBlcnR5cGVBcmd1bWVudHNbMF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBpdGVyYWJsZSk7CiAgfQoKICBGb3JJblZhcmlhYmxlIGNvbXB1dGVGb3JJblZhcmlhYmxlKAogICAgICBFeHByZXNzaW9uIHN5bnRoZXRpY0Fzc2lnbm1lbnQsIGJvb2wgaGFzUHJvYmxlbSkgewogICAgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgVmFyaWFibGVTZXQpIHsKICAgICAgcmV0dXJuIG5ldyBMb2NhbEZvckluVmFyaWFibGUoc3ludGhldGljQXNzaWdubWVudCk7CiAgICB9IGVsc2UgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgUHJvcGVydHlTZXQpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUZvckluVmFyaWFibGUoc3ludGhldGljQXNzaWdubWVudCk7CiAgICB9IGVsc2UgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgU3VwZXJQcm9wZXJ0eVNldCkgewogICAgICByZXR1cm4gbmV3IFN1cGVyUHJvcGVydHlGb3JJblZhcmlhYmxlKHN5bnRoZXRpY0Fzc2lnbm1lbnQpOwogICAgfSBlbHNlIGlmIChzeW50aGV0aWNBc3NpZ25tZW50IGlzIFN0YXRpY1NldCkgewogICAgICByZXR1cm4gbmV3IFN0YXRpY0ZvckluVmFyaWFibGUoc3ludGhldGljQXNzaWdubWVudCk7CiAgICB9IGVsc2UgaWYgKHN5bnRoZXRpY0Fzc2lnbm1lbnQgaXMgSW52YWxpZEV4cHJlc3Npb24gfHwgaGFzUHJvYmxlbSkgewogICAgICByZXR1cm4gbmV3IEludmFsaWRGb3JJblZhcmlhYmxlKHN5bnRoZXRpY0Fzc2lnbm1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAgICIke3N5bnRoZXRpY0Fzc2lnbm1lbnQucnVudGltZVR5cGV9IiwKICAgICAgICAgICJoYW5kbGVGb3JJblN0YXRlbWVudFdpdGhvdXRWYXJpYWJsZSIsCiAgICAgICAgICBzeW50aGV0aWNBc3NpZ25tZW50LmZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlci5oZWxwZXIudXJpKTsKICAgIH0KICB9CgogIEZvckluUmVzdWx0IGhhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlKAogICAgICBUcmVlTm9kZSBub2RlLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBFeHByZXNzaW9uIGl0ZXJhYmxlLAogICAgICBFeHByZXNzaW9uIHN5bnRoZXRpY0Fzc2lnbm1lbnQsCiAgICAgIFN0YXRlbWVudCBleHByZXNzaW9uRWZmZWN0cywKICAgICAge2Jvb2wgaXNBc3luYzogZmFsc2UsCiAgICAgIGJvb2wgaGFzUHJvYmxlbX0pIHsKICAgIGFzc2VydChoYXNQcm9ibGVtICE9IG51bGwpOwogICAgYm9vbCB0eXBlQ2hlY2tzTmVlZGVkID0gIWluZmVycmVyLmlzVG9wTGV2ZWw7CiAgICBGb3JJblZhcmlhYmxlIGZvckluVmFyaWFibGUgPQogICAgICAgIGNvbXB1dGVGb3JJblZhcmlhYmxlKHN5bnRoZXRpY0Fzc2lnbm1lbnQsIGhhc1Byb2JsZW0pOwogICAgRGFydFR5cGUgZWxlbWVudFR5cGUgPSBmb3JJblZhcmlhYmxlLmNvbXB1dGVFbGVtZW50VHlwZShpbmZlcnJlcik7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGl0ZXJhYmxlUmVzdWx0ID0gaW5mZXJGb3JJbkl0ZXJhYmxlKAogICAgICAgIGl0ZXJhYmxlLCBlbGVtZW50VHlwZSwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICBpc0FzeW5jOiBpc0FzeW5jKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGl0ZXJhYmxlUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIHZhcmlhYmxlLnR5cGUgPSBpbmZlcnJlZFR5cGU7CiAgICB9CiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2ZvckVhY2hfZW5kXSBpbgogICAgLy8gW2luZmVyRWxlbWVudF0sIFtpbmZlck1hcEVudHJ5XSBvciBbaW5mZXJGb3JJblN0YXRlbWVudF0uCiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZm9yRWFjaF9ib2R5QmVnaW4obm9kZSwgdmFyaWFibGUsIGluZmVycmVkVHlwZSk7CiAgICBzeW50aGV0aWNBc3NpZ25tZW50ID0gZm9ySW5WYXJpYWJsZS5pbmZlckFzc2lnbm1lbnQoaW5mZXJyZXIsIGluZmVycmVkVHlwZSk7CiAgICBpZiAoZXhwcmVzc2lvbkVmZmVjdHMgIT0gbnVsbCkgewogICAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgcmVzdWx0ID0KICAgICAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KGV4cHJlc3Npb25FZmZlY3RzKTsKICAgICAgZXhwcmVzc2lvbkVmZmVjdHMgPQogICAgICAgICAgcmVzdWx0Lmhhc0NoYW5nZWQgPyByZXN1bHQuc3RhdGVtZW50IDogZXhwcmVzc2lvbkVmZmVjdHM7CiAgICB9CiAgICByZXR1cm4gbmV3IEZvckluUmVzdWx0KHZhcmlhYmxlLCBpdGVyYWJsZVJlc3VsdC5leHByZXNzaW9uLAogICAgICAgIHN5bnRoZXRpY0Fzc2lnbm1lbnQsIGV4cHJlc3Npb25FZmZlY3RzKTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIGFzc2VydChub2RlLnZhcmlhYmxlLm5hbWUgIT0gbnVsbCk7CiAgICBGb3JJblJlc3VsdCByZXN1bHQgPSBoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlKAogICAgICAgIG5vZGUsIG5vZGUudmFyaWFibGUsIG5vZGUuaXRlcmFibGUsIG51bGwsCiAgICAgICAgaXNBc3luYzogbm9kZS5pc0FzeW5jKTsKCiAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgYm9keVJlc3VsdCA9IGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CgogICAgLy8gVGhpcyBpcyBtYXRjaGVkIGJ5IHRoZSBjYWxsIHRvIFtmb3JFYWNoX2JvZHlCZWdpbl0gaW4KICAgIC8vIFtoYW5kbGVGb3JJbldpdGhvdXRWYXJpYWJsZV0gb3IgW2hhbmRsZUZvckluRGVjbGFyaW5nVmFyaWFibGVdLgogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZvckVhY2hfZW5kKCk7CgogICAgU3RhdGVtZW50IGJvZHkgPSBib2R5UmVzdWx0Lmhhc0NoYW5nZWQgPyBib2R5UmVzdWx0LnN0YXRlbWVudCA6IG5vZGUuYm9keTsKICAgIGlmIChyZXN1bHQuZXhwcmVzc2lvblNpZGVFZmZlY3RzICE9IG51bGwpIHsKICAgICAgYm9keSA9IGNvbWJpbmVTdGF0ZW1lbnRzKHJlc3VsdC5leHByZXNzaW9uU2lkZUVmZmVjdHMsIGJvZHkpOwogICAgfQogICAgaWYgKHJlc3VsdC5zeW50aGV0aWNBc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgYm9keSA9IGNvbWJpbmVTdGF0ZW1lbnRzKAogICAgICAgICAgY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQuc3ludGhldGljQXNzaWdubWVudCksIGJvZHkpOwogICAgfQogICAgbm9kZS52YXJpYWJsZSA9IHJlc3VsdC52YXJpYWJsZS4ucGFyZW50ID0gbm9kZTsKICAgIG5vZGUuaXRlcmFibGUgPSByZXN1bHQuaXRlcmFibGUuLnBhcmVudCA9IG5vZGU7CiAgICBub2RlLmJvZHkgPSBib2R5Li5wYXJlbnQgPSBub2RlOwogICAgcmV0dXJuIGNvbnN0IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCgpOwogIH0KCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHZpc2l0Rm9ySW5TdGF0ZW1lbnRXaXRoU3ludGhlc2l6ZWRWYXJpYWJsZSgKICAgICAgRm9ySW5TdGF0ZW1lbnRXaXRoU3ludGhlc2l6ZWRWYXJpYWJsZSBub2RlKSB7CiAgICBhc3NlcnQobm9kZS52YXJpYWJsZS5uYW1lID09IG51bGwpOwogICAgRm9ySW5SZXN1bHQgcmVzdWx0ID0gaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGUobm9kZSwgbm9kZS52YXJpYWJsZSwKICAgICAgICBub2RlLml0ZXJhYmxlLCBub2RlLnN5bnRoZXRpY0Fzc2lnbm1lbnQsIG5vZGUuZXhwcmVzc2lvbkVmZmVjdHMsCiAgICAgICAgaXNBc3luYzogbm9kZS5pc0FzeW5jLCBoYXNQcm9ibGVtOiBub2RlLmhhc1Byb2JsZW0pOwoKICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKCiAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2ZvckVhY2hfYm9keUJlZ2luXSBpbgogICAgLy8gW2hhbmRsZUZvckluV2l0aG91dFZhcmlhYmxlXSBvciBbaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZV0uCiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZm9yRWFjaF9lbmQoKTsKCiAgICBTdGF0ZW1lbnQgYm9keSA9IGJvZHlSZXN1bHQuaGFzQ2hhbmdlZCA/IGJvZHlSZXN1bHQuc3RhdGVtZW50IDogbm9kZS5ib2R5OwogICAgaWYgKHJlc3VsdC5leHByZXNzaW9uU2lkZUVmZmVjdHMgIT0gbnVsbCkgewogICAgICBib2R5ID0gY29tYmluZVN0YXRlbWVudHMocmVzdWx0LmV4cHJlc3Npb25TaWRlRWZmZWN0cywgYm9keSk7CiAgICB9CiAgICBpZiAocmVzdWx0LnN5bnRoZXRpY0Fzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICBib2R5ID0gY29tYmluZVN0YXRlbWVudHMoCiAgICAgICAgICBjcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdC5zeW50aGV0aWNBc3NpZ25tZW50KSwgYm9keSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgcmVwbGFjZW1lbnQgPSBuZXcgRm9ySW5TdGF0ZW1lbnQoCiAgICAgICAgcmVzdWx0LnZhcmlhYmxlLCByZXN1bHQuaXRlcmFibGUsIGJvZHksCiAgICAgICAgaXNBc3luYzogbm9kZS5pc0FzeW5jKQogICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQKICAgICAgLi5ib2R5T2Zmc2V0ID0gbm9kZS5ib2R5T2Zmc2V0OwogICAgaW5mZXJyZXIubGlicmFyeS5sb2FkZXIuZGF0YUZvclRlc3Rpbmc/LnJlZ2lzdGVyQWxpYXMobm9kZSwgcmVwbGFjZW1lbnQpOwogICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQuc2luZ2xlKHJlcGxhY2VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2aXNpdEZvclN0YXRlbWVudChGb3JTdGF0ZW1lbnQgbm9kZSkgewogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXM7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbm9kZS52YXJpYWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlc1tpbmRleF07CiAgICAgIGlmICh2YXJpYWJsZS5uYW1lID09IG51bGwpIHsKICAgICAgICBpZiAodmFyaWFibGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgICAgdmFyaWFibGUuaW5pdGlhbGl6ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IHJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgICAgIHZhcmlhYmxlLnR5cGUgPSByZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmFyaWFibGVSZXN1bHQgPQogICAgICAgICAgICBpbmZlcnJlci5pbmZlclN0YXRlbWVudCh2YXJpYWJsZSk7CiAgICAgICAgaWYgKHZhcmlhYmxlUmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewogICAgICAgICAgICB2YXJpYWJsZXMgPSA8VmFyaWFibGVEZWNsYXJhdGlvbj5bXTsKICAgICAgICAgICAgdmFyaWFibGVzLmFkZEFsbChub2RlLnZhcmlhYmxlcy5zdWJsaXN0KDAsIGluZGV4KSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmFyaWFibGVSZXN1bHQuc3RhdGVtZW50Q291bnQgPT0gMSkgewogICAgICAgICAgICB2YXJpYWJsZXMuYWRkKHZhcmlhYmxlUmVzdWx0LnN0YXRlbWVudCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgaW4gdmFyaWFibGVSZXN1bHQuc3RhdGVtZW50cykgewogICAgICAgICAgICAgIHZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgdmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgbm9kZS52YXJpYWJsZXMuY2xlYXIoKTsKICAgICAgbm9kZS52YXJpYWJsZXMuYWRkQWxsKHZhcmlhYmxlcyk7CiAgICAgIHNldFBhcmVudHModmFyaWFibGVzLCBub2RlKTsKICAgIH0KICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfY29uZGl0aW9uQmVnaW4obm9kZSk7CiAgICBpZiAobm9kZS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICBJbnRlcmZhY2VUeXBlIGV4cGVjdGVkVHlwZSA9CiAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgY29uZGl0aW9uUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgbm9kZS5jb25kaXRpb24sIGV4cGVjdGVkVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPQogICAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdChleHBlY3RlZFR5cGUsIGNvbmRpdGlvblJlc3VsdCk7CiAgICAgIG5vZGUuY29uZGl0aW9uID0gY29uZGl0aW9uLi5wYXJlbnQgPSBub2RlOwogICAgfQoKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfYm9keUJlZ2luKG5vZGUsIG5vZGUuY29uZGl0aW9uKTsKICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGlmIChib2R5UmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgbm9kZS5ib2R5ID0gYm9keVJlc3VsdC5zdGF0ZW1lbnQuLnBhcmVudCA9IG5vZGU7CiAgICB9CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZm9yX3VwZGF0ZXJCZWdpbigpOwogICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5vZGUudXBkYXRlcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB1cGRhdGVSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBub2RlLnVwZGF0ZXNbaW5kZXhdLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBub2RlLnVwZGF0ZXNbaW5kZXhdID0gdXBkYXRlUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICB9CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZm9yX2VuZCgpOwogICAgcmV0dXJuIGNvbnN0IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCgpOwogIH0KCiAgRGFydFR5cGUgdmlzaXRGdW5jdGlvbk5vZGUoRnVuY3Rpb25Ob2RlIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0LAogICAgICBEYXJ0VHlwZSByZXR1cm5Db250ZXh0LCBpbnQgcmV0dXJuVHlwZUluc3RydW1lbnRhdGlvbk9mZnNldCkgewogICAgcmV0dXJuIGluZmVycmVyLmluZmVyTG9jYWxGdW5jdGlvbigKICAgICAgICBub2RlLCB0eXBlQ29udGV4dCwgcmV0dXJuVHlwZUluc3RydW1lbnRhdGlvbk9mZnNldCwgcmV0dXJuQ29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKAogICAgICBjb3ZhcmlhbnQgRnVuY3Rpb25EZWNsYXJhdGlvbkltcGwgbm9kZSkgewogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZ1bmN0aW9uRXhwcmVzc2lvbl9iZWdpbihub2RlKTsKICAgIGluZmVycmVyLmluZmVyTWV0YWRhdGFLZWVwaW5nSGVscGVyKAogICAgICAgIG5vZGUudmFyaWFibGUsIG5vZGUudmFyaWFibGUuYW5ub3RhdGlvbnMpOwogICAgRGFydFR5cGUgcmV0dXJuQ29udGV4dCA9CiAgICAgICAgbm9kZS5oYXNJbXBsaWNpdFJldHVyblR5cGUgPyBudWxsIDogbm9kZS5mdW5jdGlvbi5yZXR1cm5UeXBlOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0KICAgICAgICB2aXNpdEZ1bmN0aW9uTm9kZShub2RlLmZ1bmN0aW9uLCBudWxsLCByZXR1cm5Db250ZXh0LCBub2RlLmZpbGVPZmZzZXQpOwogICAgbm9kZS52YXJpYWJsZS50eXBlID0gaW5mZXJyZWRUeXBlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZ1bmN0aW9uRXhwcmVzc2lvbl9lbmQoKTsKICAgIHJldHVybiBjb25zdCBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQoKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oCiAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZ1bmN0aW9uRXhwcmVzc2lvbl9iZWdpbihub2RlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgdmlzaXRGdW5jdGlvbk5vZGUobm9kZS5mdW5jdGlvbiwgdHlwZUNvbnRleHQsIG51bGwsIG5vZGUuZmlsZU9mZnNldCk7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZnVuY3Rpb25FeHByZXNzaW9uX2VuZCgpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgbm9kZSk7CiAgfQoKICB2b2lkIHZpc2l0SW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCgKICAgICAgSW52YWxpZFN1cGVySW5pdGlhbGl6ZXJKdWRnbWVudCBub2RlKSB7CiAgICBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmZyb21TdXBlcnR5cGUoCiAgICAgICAgaW5mZXJyZXIuY2xhc3NIaWVyYXJjaHkuZ2V0Q2xhc3NBc0luc3RhbmNlT2YoCiAgICAgICAgICAgIGluZmVycmVyLnRoaXNUeXBlLmNsYXNzTm9kZSwgbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MpKTsKICAgIGluZmVycmVyLmluZmVySW52b2NhdGlvbigKICAgICAgICBudWxsLAogICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUobm9kZS50YXJnZXQuZnVuY3Rpb24KICAgICAgICAgICAgLmNvbXB1dGVUaGlzRnVuY3Rpb25UeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpCiAgICAgICAgICAgIC53aXRob3V0VHlwZVBhcmFtZXRlcnMpLAogICAgICAgIG5vZGUuYXJndW1lbnRzSnVkZ21lbnQsCiAgICAgICAgbm9kZS50YXJnZXQubmFtZSwKICAgICAgICByZXR1cm5UeXBlOiBpbmZlcnJlci50aGlzVHlwZSwKICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiB0cnVlKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRJZk51bGxFeHByZXNzaW9uKAogICAgICBJZk51bGxFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICAvLyBUbyBpbmZlciBgZTAgPz8gZTFgIGluIGNvbnRleHQgSzoKICAgIC8vIC0gSW5mZXIgZTAgaW4gY29udGV4dCBLIHRvIGdldCBUMAogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBsaHNSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5sZWZ0LCBpbmZlcnJlci5jb21wdXRlTnVsbGFibGUodHlwZUNvbnRleHQpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgIHJlcG9ydE5vbk51bGxhYmxlSW5OdWxsQXdhcmVXYXJuaW5nSWZOZWVkZWQoCiAgICAgICAgbGhzUmVzdWx0LmluZmVycmVkVHlwZSwgIj8/Iiwgbm9kZS5sZWZ0LmZpbGVPZmZzZXQpOwoKICAgIE1lbWJlciBlcXVhbHNNZW1iZXIgPSBpbmZlcnJlcgogICAgICAgIC5maW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgICAgICBsaHNSZXN1bHQuaW5mZXJyZWRUeXBlLCBlcXVhbHNOYW1lLCBub2RlLmZpbGVPZmZzZXQpCiAgICAgICAgLm1lbWJlcjsKCiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZOdWxsRXhwcmVzc2lvbl9yaWdodEJlZ2luKG5vZGUubGVmdCk7CiAgICAvLyAtIExldCBKID0gVDAgaWYgSyBpcyBgP2AgZWxzZSBLLgogICAgLy8gLSBJbmZlciBlMSBpbiBjb250ZXh0IEogdG8gZ2V0IFQxCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJoc1Jlc3VsdDsKICAgIGlmICh0eXBlQ29udGV4dCBpcyBVbmtub3duVHlwZSkgewogICAgICByaHNSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBub2RlLnJpZ2h0LCBsaHNSZXN1bHQuaW5mZXJyZWRUeXBlLCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICByaHNSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obm9kZS5yaWdodCwgdHlwZUNvbnRleHQsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIH0KICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5pZk51bGxFeHByZXNzaW9uX2VuZCgpOwoKICAgIC8vIC0gTGV0IFQgPSBncmVhdGVzdCBjbG9zdXJlIG9mIEsgd2l0aCByZXNwZWN0IHRvIGA/YCBpZiBLIGlzIG5vdCBgX2AsIGVsc2UKICAgIC8vICAgVVAodDAsIHQxKQogICAgLy8gLSBUaGVuIHRoZSBpbmZlcnJlZCB0eXBlIGlzIFQuCiAgICBEYXJ0VHlwZSBvcmlnaW5hbExoc1R5cGUgPSBsaHNSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgRGFydFR5cGUgbm9uTnVsbGFibGVMaHNUeXBlID0gaW5mZXJyZXIuY29tcHV0ZU5vbk51bGxhYmxlKG9yaWdpbmFsTGhzVHlwZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKG5vbk51bGxhYmxlTGhzVHlwZSwgcmhzUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPQogICAgICAgIGNyZWF0ZVZhcmlhYmxlKGxoc1Jlc3VsdC5leHByZXNzaW9uLCBsaHNSZXN1bHQuaW5mZXJyZWRUeXBlKTsKICAgIE1ldGhvZEludm9jYXRpb24gZXF1YWxzTnVsbCA9IGNyZWF0ZUVxdWFsc051bGwoCiAgICAgICAgbGhzUmVzdWx0LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICBjcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSksCiAgICAgICAgZXF1YWxzTWVtYmVyKTsKICAgIFZhcmlhYmxlR2V0IHZhcmlhYmxlR2V0ID0gY3JlYXRlVmFyaWFibGVHZXQodmFyaWFibGUpOwogICAgaWYgKGluZmVycmVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICFpZGVudGljYWwobm9uTnVsbGFibGVMaHNUeXBlLCBvcmlnaW5hbExoc1R5cGUpKSB7CiAgICAgIHZhcmlhYmxlR2V0LnByb21vdGVkVHlwZSA9IG5vbk51bGxhYmxlTGhzVHlwZTsKICAgIH0KICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgZXF1YWxzTnVsbCwgcmhzUmVzdWx0LmV4cHJlc3Npb24sIHZhcmlhYmxlR2V0LCBpbmZlcnJlZFR5cGUpOwogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudCA9IG5ldyBMZXQodmFyaWFibGUsIGNvbmRpdGlvbmFsKQogICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRJZlN0YXRlbWVudChJZlN0YXRlbWVudCBub2RlKSB7CiAgICBJbnRlcmZhY2VUeXBlIGV4cGVjdGVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBjb25kaXRpb25SZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5jb25kaXRpb24sIGV4cGVjdGVkVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdChleHBlY3RlZFR5cGUsIGNvbmRpdGlvblJlc3VsdCk7CiAgICBub2RlLmNvbmRpdGlvbiA9IGNvbmRpdGlvbi4ucGFyZW50ID0gbm9kZTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5pZlN0YXRlbWVudF90aGVuQmVnaW4oY29uZGl0aW9uKTsKICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB0aGVuUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS50aGVuKTsKICAgIGlmICh0aGVuUmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgbm9kZS50aGVuID0gdGhlblJlc3VsdC5zdGF0ZW1lbnQuLnBhcmVudCA9IG5vZGU7CiAgICB9CiAgICBpZiAobm9kZS5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZTdGF0ZW1lbnRfZWxzZUJlZ2luKCk7CiAgICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBvdGhlcndpc2VSZXN1bHQgPQogICAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5vdGhlcndpc2UpOwogICAgICBpZiAob3RoZXJ3aXNlUmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgICBub2RlLm90aGVyd2lzZSA9IG90aGVyd2lzZVJlc3VsdC5zdGF0ZW1lbnQuLnBhcmVudCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5pZlN0YXRlbWVudF9lbmQobm9kZS5vdGhlcndpc2UgIT0gbnVsbCk7CiAgICByZXR1cm4gY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0SW50SnVkZ21lbnQoCiAgICAgIEludEp1ZGdtZW50IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoaW5mZXJyZXIuaXNEb3VibGVDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICBkb3VibGUgZG91YmxlVmFsdWUgPSBub2RlLmFzRG91YmxlKCk7CiAgICAgIGlmIChkb3VibGVWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudCA9IG5ldyBEb3VibGVMaXRlcmFsKGRvdWJsZVZhbHVlKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5kb3VibGVSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50KTsKICAgICAgfQogICAgfQogICAgRXhwcmVzc2lvbiBlcnJvciA9IGNoZWNrV2ViSW50TGl0ZXJhbHNFcnJvcklmVW5leGFjdCgKICAgICAgICBpbmZlcnJlciwgbm9kZS52YWx1ZSwgbm9kZS5saXRlcmFsLCBub2RlLmZpbGVPZmZzZXQpOwogICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGNvbnN0IER5bmFtaWNUeXBlKCksIGVycm9yKTsKICAgIH0KICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmludFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBub2RlKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRTaGFkb3dMYXJnZUludExpdGVyYWwoCiAgICAgIFNoYWRvd0xhcmdlSW50TGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaWYgKGluZmVycmVyLmlzRG91YmxlQ29udGV4dCh0eXBlQ29udGV4dCkpIHsKICAgICAgZG91YmxlIGRvdWJsZVZhbHVlID0gbm9kZS5hc0RvdWJsZSgpOwogICAgICBpZiAoZG91YmxlVmFsdWUgIT0gbnVsbCkgewogICAgICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQgPSBuZXcgRG91YmxlTGl0ZXJhbChkb3VibGVWYWx1ZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPQogICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuZG91YmxlUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICBpbnQgaW50VmFsdWUgPSBub2RlLmFzSW50NjQoKTsKICAgIGlmIChpbnRWYWx1ZSA9PSBudWxsKSB7CiAgICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQgPSBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZS53aXRoQXJndW1lbnRzKG5vZGUubGl0ZXJhbCksCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICBub2RlLmxpdGVyYWwubGVuZ3RoKTsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGNvbnN0IER5bmFtaWNUeXBlKCksIHJlcGxhY2VtZW50KTsKICAgIH0KICAgIEV4cHJlc3Npb24gZXJyb3IgPSBjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3QoCiAgICAgICAgaW5mZXJyZXIsIGludFZhbHVlLCBub2RlLmxpdGVyYWwsIG5vZGUuZmlsZU9mZnNldCk7CiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgRHluYW1pY1R5cGUoKSwgZXJyb3IpOwogICAgfQogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudCA9IG5ldyBJbnRMaXRlcmFsKGludFZhbHVlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmludFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICB2b2lkIHZpc2l0U2hhZG93SW52YWxpZEluaXRpYWxpemVyKFNoYWRvd0ludmFsaWRJbml0aWFsaXplciBub2RlKSB7CiAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YXJpYWJsZS5pbml0aWFsaXplciwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogIH0KCiAgdm9pZCB2aXNpdFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyKFNoYWRvd0ludmFsaWRGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5pdGlhbGl6ZXJSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YWx1ZSwgbm9kZS5maWVsZC50eXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICBub2RlLnZhbHVlID0gaW5pdGlhbGl6ZXJSZXN1bHQuZXhwcmVzc2lvbi4ucGFyZW50ID0gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRJc0V4cHJlc3Npb24oCiAgICAgIElzRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBvcGVyYW5kUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUub3BlcmFuZCwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgbm9kZS5vcGVyYW5kID0gb3BlcmFuZFJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzCiAgICAgICAgLmlzRXhwcmVzc2lvbl9lbmQobm9kZSwgbm9kZS5vcGVyYW5kLCAvKmlzTm90OiovIGZhbHNlLCBub2RlLnR5cGUpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRMYWJlbGVkU3RhdGVtZW50KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewogICAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IGJvZHlSZXN1bHQgPSBpbmZlcnJlci5pbmZlclN0YXRlbWVudChub2RlLmJvZHkpOwogICAgaWYgKGJvZHlSZXN1bHQuaGFzQ2hhbmdlZCkgewogICAgICBub2RlLmJvZHkgPSBib2R5UmVzdWx0LnN0YXRlbWVudC4ucGFyZW50ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBjb25zdCBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQoKTsKICB9CgogIERhcnRUeXBlIGdldFNwcmVhZEVsZW1lbnRUeXBlKERhcnRUeXBlIHNwcmVhZFR5cGUsIGJvb2wgaXNOdWxsQXdhcmUpIHsKICAgIGlmIChzcHJlYWRUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgaWYgKHNwcmVhZFR5cGUuY2xhc3NOb2RlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MpIHsKICAgICAgICByZXR1cm4gaXNOdWxsQXdhcmUgPyBzcHJlYWRUeXBlIDogbnVsbDsKICAgICAgfQogICAgICBMaXN0PERhcnRUeXBlPiBzdXBlcnR5cGVBcmd1bWVudHMgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKAogICAgICAgICAgICAgIHNwcmVhZFR5cGUsIGluZmVycmVyLmNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzKTsKICAgICAgaWYgKHN1cGVydHlwZUFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIHN1cGVydHlwZUFyZ3VtZW50cy5zaW5nbGU7CiAgICB9CiAgICBpZiAoc3ByZWFkVHlwZSBpcyBEeW5hbWljVHlwZSkgcmV0dXJuIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5mZXJFbGVtZW50KAogICAgICBFeHByZXNzaW9uIGVsZW1lbnQsCiAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICBNYXA8RXhwcmVzc2lvbiwgRGFydFR5cGU+IGluZmVycmVkQ29uZGl0aW9uVHlwZXMsCiAgICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkLAogICAgICBib29sIHR5cGVDaGVja3NOZWVkZWQpIHsKICAgIGlmIChlbGVtZW50IGlzIFNwcmVhZEVsZW1lbnQpIHsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBzcHJlYWRSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24sCiAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcywKICAgICAgICAgICAgICBpbmZlcnJlci5saWJyYXJ5Lm51bGxhYmxlSWZUcnVlKGVsZW1lbnQuaXNOdWxsQXdhcmUpLAogICAgICAgICAgICAgIDxEYXJ0VHlwZT5baW5mZXJyZWRUeXBlQXJndW1lbnRdKSwKICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIGlmIChlbGVtZW50LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgICAgICAgc3ByZWFkUmVzdWx0LmluZmVycmVkVHlwZSwgIi4uLj8iLCBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgZWxlbWVudC5leHByZXNzaW9uID0gc3ByZWFkUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IGVsZW1lbnQ7CiAgICAgIERhcnRUeXBlIHNwcmVhZFR5cGUgPSBzcHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzW2VsZW1lbnQuZXhwcmVzc2lvbl0gPSBzcHJlYWRUeXBlOwogICAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gZWxlbWVudDsKICAgICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgICBEYXJ0VHlwZSBzcHJlYWRFbGVtZW50VHlwZSA9CiAgICAgICAgICAgIGdldFNwcmVhZEVsZW1lbnRUeXBlKHNwcmVhZFR5cGUsIGVsZW1lbnQuaXNOdWxsQXdhcmUpOwogICAgICAgIGlmIChzcHJlYWRFbGVtZW50VHlwZSA9PSBudWxsKSB7CiAgICAgICAgICBpZiAoc3ByZWFkVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgICAgc3ByZWFkVHlwZS5jbGFzc05vZGUgPT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxDbGFzcyAmJgogICAgICAgICAgICAgICFlbGVtZW50LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIG1lc3NhZ2VOb25OdWxsQXdhcmVTcHJlYWRJc051bGwsCiAgICAgICAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVTcHJlYWRUeXBlTWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBzcHJlYWRUeXBlLCBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzcHJlYWRUeXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGluZmVycmVkVHlwZUFyZ3VtZW50LCBzcHJlYWRFbGVtZW50VHlwZSkpIHsKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgc3ByZWFkRWxlbWVudFR5cGUsCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgICBlbGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBVc2UgJ2R5bmFtaWMnIGZvciBlcnJvciByZWNvdmVyeS4KICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9CiAgICAgICAgICBnZXRTcHJlYWRFbGVtZW50VHlwZShzcHJlYWRUeXBlLCBlbGVtZW50LmlzTnVsbEF3YXJlKSA/PwogICAgICAgICAgICAgIGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChlbGVtZW50LmVsZW1lbnRUeXBlLCByZXBsYWNlbWVudCk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgSWZFbGVtZW50KSB7CiAgICAgIERhcnRUeXBlIGJvb2xUeXBlID0KICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBjb25kaXRpb25SZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBlbGVtZW50LmNvbmRpdGlvbiwgYm9vbFR5cGUsIHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0KICAgICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoYm9vbFR5cGUsIGNvbmRpdGlvblJlc3VsdCk7CiAgICAgIGVsZW1lbnQuY29uZGl0aW9uID0gY29uZGl0aW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZTdGF0ZW1lbnRfdGhlbkJlZ2luKGNvbmRpdGlvbik7CiAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdGhlblJlc3VsdCA9IGluZmVyRWxlbWVudCgKICAgICAgICAgIGVsZW1lbnQudGhlbiwKICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMsCiAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgZWxlbWVudC50aGVuID0gdGhlblJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IG90aGVyd2lzZVJlc3VsdDsKICAgICAgaWYgKGVsZW1lbnQub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZTdGF0ZW1lbnRfZWxzZUJlZ2luKCk7CiAgICAgICAgb3RoZXJ3aXNlUmVzdWx0ID0gaW5mZXJFbGVtZW50KAogICAgICAgICAgICBlbGVtZW50Lm90aGVyd2lzZSwKICAgICAgICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMsCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgICAgZWxlbWVudC5vdGhlcndpc2UgPSBvdGhlcndpc2VSZXN1bHQuZXhwcmVzc2lvbi4ucGFyZW50ID0gZWxlbWVudDsKICAgICAgfQogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZTdGF0ZW1lbnRfZW5kKGVsZW1lbnQub3RoZXJ3aXNlICE9IG51bGwpOwogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICBvdGhlcndpc2VSZXN1bHQgPT0gbnVsbAogICAgICAgICAgICAgID8gdGhlblJlc3VsdC5pbmZlcnJlZFR5cGUKICAgICAgICAgICAgICA6IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5nZXRTdGFuZGFyZFVwcGVyQm91bmQoCiAgICAgICAgICAgICAgICAgIHRoZW5SZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgICAgICAgICAgICBvdGhlcndpc2VSZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgICAgICAgICAgICBpbmZlcnJlci5saWJyYXJ5LmxpYnJhcnkpLAogICAgICAgICAgZWxlbWVudCk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9yRWxlbWVudCkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVc2UgX3Zpc2l0U3RhdGVtZW50cyBpbnN0ZWFkLgogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlczsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnQudmFyaWFibGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBlbGVtZW50LnZhcmlhYmxlc1tpbmRleF07CiAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICAgICAgaWYgKHZhcmlhYmxlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbml0aWFsaXplclJlc3VsdCA9CiAgICAgICAgICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24odmFyaWFibGUuaW5pdGlhbGl6ZXIsIHZhcmlhYmxlLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXJSZXN1bHQuZXhwcmVzc2lvbgogICAgICAgICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgICAgICAgIHZhcmlhYmxlLnR5cGUgPSBpbml0aWFsaXplclJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2YXJpYWJsZVJlc3VsdCA9CiAgICAgICAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQodmFyaWFibGUpOwogICAgICAgICAgaWYgKHZhcmlhYmxlUmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgICAgICAgaWYgKHZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyaWFibGVzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICAgICAgICAgICAgdmFyaWFibGVzLmFkZEFsbChlbGVtZW50LnZhcmlhYmxlcy5zdWJsaXN0KDAsIGluZGV4KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhcmlhYmxlUmVzdWx0LnN0YXRlbWVudENvdW50ID09IDEpIHsKICAgICAgICAgICAgICB2YXJpYWJsZXMuYWRkKHZhcmlhYmxlUmVzdWx0LnN0YXRlbWVudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlIGluIHZhcmlhYmxlUmVzdWx0LnN0YXRlbWVudHMpIHsKICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5hZGQodmFyaWFibGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgICB2YXJpYWJsZXMuYWRkKHZhcmlhYmxlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgZWxlbWVudC52YXJpYWJsZXMuY2xlYXIoKTsKICAgICAgICBlbGVtZW50LnZhcmlhYmxlcy5hZGRBbGwodmFyaWFibGVzKTsKICAgICAgICBzZXRQYXJlbnRzKHZhcmlhYmxlcywgZWxlbWVudCk7CiAgICAgIH0KICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZvcl9jb25kaXRpb25CZWdpbihlbGVtZW50KTsKICAgICAgaWYgKGVsZW1lbnQuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGNvbmRpdGlvblJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgICAgZWxlbWVudC5jb25kaXRpb24sCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgICAgICBlbGVtZW50LmNvbmRpdGlvbiA9IGNvbmRpdGlvblJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXNbZWxlbWVudC5jb25kaXRpb25dID0KICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0LmluZmVycmVkVHlwZTsKICAgICAgfQogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZm9yX2JvZHlCZWdpbihudWxsLCBlbGVtZW50LmNvbmRpdGlvbik7CiAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYm9keVJlc3VsdCA9IGluZmVyRWxlbWVudCgKICAgICAgICAgIGVsZW1lbnQuYm9keSwKICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMsCiAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgZWxlbWVudC5ib2R5ID0gYm9keVJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZm9yX3VwZGF0ZXJCZWdpbigpOwogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudC51cGRhdGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdXBkYXRlUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgICBlbGVtZW50LnVwZGF0ZXNbaW5kZXhdLAogICAgICAgICAgICBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgICAgZWxlbWVudC51cGRhdGVzW2luZGV4XSA9IHVwZGF0ZVJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICB9CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfZW5kKCk7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChib2R5UmVzdWx0LmluZmVycmVkVHlwZSwgZWxlbWVudCk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgIEZvckluUmVzdWx0IHJlc3VsdDsKICAgICAgaWYgKGVsZW1lbnQudmFyaWFibGUubmFtZSA9PSBudWxsKSB7CiAgICAgICAgcmVzdWx0ID0gaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGUoCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIGVsZW1lbnQudmFyaWFibGUsCiAgICAgICAgICAgIGVsZW1lbnQuaXRlcmFibGUsCiAgICAgICAgICAgIGVsZW1lbnQuc3ludGhldGljQXNzaWdubWVudCwKICAgICAgICAgICAgZWxlbWVudC5leHByZXNzaW9uRWZmZWN0cywKICAgICAgICAgICAgaXNBc3luYzogZWxlbWVudC5pc0FzeW5jLAogICAgICAgICAgICBoYXNQcm9ibGVtOiBlbGVtZW50LnByb2JsZW0gIT0gbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gaGFuZGxlRm9ySW5EZWNsYXJpbmdWYXJpYWJsZShlbGVtZW50LCBlbGVtZW50LnZhcmlhYmxlLAogICAgICAgICAgICBlbGVtZW50Lml0ZXJhYmxlLCBlbGVtZW50LmV4cHJlc3Npb25FZmZlY3RzLAogICAgICAgICAgICBpc0FzeW5jOiBlbGVtZW50LmlzQXN5bmMpOwogICAgICB9CiAgICAgIGVsZW1lbnQudmFyaWFibGUgPSByZXN1bHQudmFyaWFibGUuLnBhcmVudCA9IGVsZW1lbnQ7CiAgICAgIGVsZW1lbnQuaXRlcmFibGUgPSByZXN1bHQuaXRlcmFibGUuLnBhcmVudCA9IGVsZW1lbnQ7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSA/Li4gaGVyZSBpbnN0ZWFkLgogICAgICBlbGVtZW50LnN5bnRoZXRpY0Fzc2lnbm1lbnQgPSByZXN1bHQuc3ludGhldGljQXNzaWdubWVudDsKICAgICAgcmVzdWx0LnN5bnRoZXRpY0Fzc2lnbm1lbnQ/LnBhcmVudCA9IGVsZW1lbnQ7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSA/Li4gaGVyZSBpbnN0ZWFkLgogICAgICBlbGVtZW50LmV4cHJlc3Npb25FZmZlY3RzID0gcmVzdWx0LmV4cHJlc3Npb25TaWRlRWZmZWN0czsKICAgICAgcmVzdWx0LmV4cHJlc3Npb25TaWRlRWZmZWN0cz8ucGFyZW50ID0gZWxlbWVudDsKCiAgICAgIGlmIChlbGVtZW50LnByb2JsZW0gIT0gbnVsbCkgewogICAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcHJvYmxlbVJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgICAgZWxlbWVudC5wcm9ibGVtLAogICAgICAgICAgICBjb25zdCBVbmtub3duVHlwZSgpLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgICAgZWxlbWVudC5wcm9ibGVtID0gcHJvYmxlbVJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICB9CiAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYm9keVJlc3VsdCA9IGluZmVyRWxlbWVudCgKICAgICAgICAgIGVsZW1lbnQuYm9keSwKICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMsCiAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgZWxlbWVudC5ib2R5ID0gYm9keVJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbGVtZW50OwogICAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2ZvckVhY2hfYm9keUJlZ2luXSBpbgogICAgICAvLyBbaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGVdIG9yIFtoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlXS4KICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZvckVhY2hfZW5kKCk7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChib2R5UmVzdWx0LmluZmVycmVkVHlwZSwgZWxlbWVudCk7CiAgICB9IGVsc2UgewogICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgIGVsZW1lbnQsIGluZmVycmVkVHlwZUFyZ3VtZW50LCBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50OwogICAgICBpZiAoaW5mZXJyZWRUeXBlQXJndW1lbnQgaXMhIFVua25vd25UeXBlKSB7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KAogICAgICAgICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCwgcmVzdWx0LAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZFR5cGVBcmd1bWVudCBpcyBWb2lkVHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwbGFjZW1lbnQgPSByZXN1bHQuZXhwcmVzc2lvbjsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQocmVzdWx0LmluZmVycmVkVHlwZSwgcmVwbGFjZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0VsZW1lbnQoCiAgICAgIEV4cHJlc3Npb24gaXRlbSwKICAgICAgRXhwcmVzc2lvbiBwYXJlbnQsCiAgICAgIERhcnRUeXBlIHR5cGVBcmd1bWVudCwKICAgICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgTWFwPEV4cHJlc3Npb24sIERhcnRUeXBlPiBpbmZlcnJlZENvbmRpdGlvblR5cGVzKSB7CiAgICBpZiAoaXRlbSBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgIERhcnRUeXBlIHNwcmVhZFR5cGUgPSBpbmZlcnJlZFNwcmVhZFR5cGVzW2l0ZW0uZXhwcmVzc2lvbl07CiAgICAgIGlmIChzcHJlYWRUeXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlUmF3VHlwZSgKICAgICAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubnVsbGFibGVJZlRydWUoaXRlbS5pc051bGxBd2FyZSkpLAogICAgICAgICAgICBzcHJlYWRUeXBlLAogICAgICAgICAgICBpdGVtLmV4cHJlc3Npb24pOwogICAgICAgIGl0ZW0uZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uLnBhcmVudCA9IGl0ZW07CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaXRlbSBpcyBJZkVsZW1lbnQpIHsKICAgICAgY2hlY2tFbGVtZW50KGl0ZW0udGhlbiwgaXRlbSwgdHlwZUFyZ3VtZW50LCBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJyZWRDb25kaXRpb25UeXBlcyk7CiAgICAgIGlmIChpdGVtLm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgICAgY2hlY2tFbGVtZW50KGl0ZW0ub3RoZXJ3aXNlLCBpdGVtLCB0eXBlQXJndW1lbnQsIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGl0ZW0gaXMgRm9yRWxlbWVudCkgewogICAgICBpZiAoaXRlbS5jb25kaXRpb24gIT0gbnVsbCkgewogICAgICAgIERhcnRUeXBlIGNvbmRpdGlvblR5cGUgPSBpbmZlcnJlZENvbmRpdGlvblR5cGVzW2l0ZW0uY29uZGl0aW9uXTsKICAgICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICAgICAgY29uZGl0aW9uVHlwZSwKICAgICAgICAgICAgaXRlbS5jb25kaXRpb24pOwogICAgICAgIGl0ZW0uY29uZGl0aW9uID0gY29uZGl0aW9uLi5wYXJlbnQgPSBpdGVtOwogICAgICB9CiAgICAgIGNoZWNrRWxlbWVudChpdGVtLmJvZHksIGl0ZW0sIHR5cGVBcmd1bWVudCwgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgfSBlbHNlIGlmIChpdGVtIGlzIEZvckluRWxlbWVudCkgewogICAgICBjaGVja0VsZW1lbnQoaXRlbS5ib2R5LCBpdGVtLCB0eXBlQXJndW1lbnQsIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICBpbmZlcnJlZENvbmRpdGlvblR5cGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIERvIG5vdGhpbmcuICBBc3NpZ25hYmlsaXR5IGNoZWNrcyBhcmUgZG9uZSBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TGlzdExpdGVyYWwoCiAgICAgIExpc3RMaXRlcmFsIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBDbGFzcyBsaXN0Q2xhc3MgPSBpbmZlcnJlci5jb3JlVHlwZXMubGlzdENsYXNzOwogICAgSW50ZXJmYWNlVHlwZSBsaXN0VHlwZSA9IGluZmVycmVyLmNvcmVUeXBlcwogICAgICAgIC50aGlzSW50ZXJmYWNlVHlwZShsaXN0Q2xhc3MsIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlczsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZUFyZ3VtZW50OwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIGJvb2wgaW5mZXJlbmNlTmVlZGVkID0gbm9kZS50eXBlQXJndW1lbnQgaXMgSW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICBib29sIHR5cGVDaGVja3NOZWVkZWQgPSAhaW5mZXJyZXIuaXNUb3BMZXZlbDsKICAgIE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+IGluZmVycmVkU3ByZWFkVHlwZXM7CiAgICBNYXA8RXhwcmVzc2lvbiwgRGFydFR5cGU+IGluZmVycmVkQ29uZGl0aW9uVHlwZXM7CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9ybWFsVHlwZXMgPSBbXTsKICAgICAgYWN0dWFsVHlwZXMgPSBbXTsKICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcyA9IG5ldyBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPi5pZGVudGl0eSgpOwogICAgICBpbmZlcnJlZENvbmRpdGlvblR5cGVzID0gbmV3IE1hcDxFeHByZXNzaW9uLCBEYXJ0VHlwZT4uaWRlbnRpdHkoKTsKICAgIH0KICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgaW5mZXJyZWRUeXBlcyA9IFtjb25zdCBVbmtub3duVHlwZSgpXTsKICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKAogICAgICAgICAgbGlzdFR5cGUsCiAgICAgICAgICBsaXN0Q2xhc3MudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBudWxsLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSwKICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlc1swXTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50ID0gbm9kZS50eXBlQXJndW1lbnQ7CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyArK2luZGV4KSB7CiAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlckVsZW1lbnQoCiAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbnNbaW5kZXhdLAogICAgICAgICAgICBpbmZlcnJlZFR5cGVBcmd1bWVudCwKICAgICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgICAgaW5mZXJyZWRDb25kaXRpb25UeXBlcywKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgICBub2RlLmV4cHJlc3Npb25zW2luZGV4XSA9IHJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgICAgIGFjdHVhbFR5cGVzLmFkZChyZXN1bHQuaW5mZXJyZWRUeXBlKTsKICAgICAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgICAgICBmb3JtYWxUeXBlcy5hZGQobGlzdFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIGxpc3RUeXBlLAogICAgICAgICAgbGlzdENsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgZm9ybWFsVHlwZXMsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CiAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlc1swXTsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZUFyZ3MnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoW2luZmVycmVkVHlwZUFyZ3VtZW50XSkpOwogICAgICBub2RlLnR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZUFyZ3VtZW50OwogICAgfQogICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2hlY2tFbGVtZW50KG5vZGUuZXhwcmVzc2lvbnNbaV0sIG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LAogICAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLCBpbmZlcnJlZENvbmRpdGlvblR5cGVzKTsKICAgICAgfQogICAgfQogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgbGlzdENsYXNzLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlLCBbaW5mZXJyZWRUeXBlQXJndW1lbnRdKTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbkxpc3RMaXRlcmFsKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKAogICAgICBMb2dpY2FsRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgSW50ZXJmYWNlVHlwZSBib29sVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBsZWZ0UmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUubGVmdCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgIEV4cHJlc3Npb24gbGVmdCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoYm9vbFR5cGUsIGxlZnRSZXN1bHQpOwogICAgbm9kZS5sZWZ0ID0gbGVmdC4ucGFyZW50ID0gbm9kZTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcwogICAgICAgIC5sb2dpY2FsQmluYXJ5T3BfcmlnaHRCZWdpbihub2RlLmxlZnQsIGlzQW5kOiBub2RlLm9wZXJhdG9yID09ICcmJicpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByaWdodFJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJpZ2h0LCBib29sVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgRXhwcmVzc2lvbiByaWdodCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoYm9vbFR5cGUsIHJpZ2h0UmVzdWx0KTsKICAgIG5vZGUucmlnaHQgPSByaWdodC4ucGFyZW50ID0gbm9kZTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcwogICAgICAgIC5sb2dpY2FsQmluYXJ5T3BfZW5kKG5vZGUsIG5vZGUucmlnaHQsIGlzQW5kOiBub2RlLm9wZXJhdG9yID09ICcmJicpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGJvb2xUeXBlLCBub2RlKTsKICB9CgogIC8vIENhbGN1bGF0ZXMgdGhlIGtleSBhbmQgdGhlIHZhbHVlIHR5cGUgb2YgYSBzcHJlYWQgbWFwIGVudHJ5IG9mIHR5cGUKICAvLyBzcHJlYWRNYXBFbnRyeVR5cGUgYW5kIHN0b3JlcyB0aGVtIGluIG91dHB1dCBpbiBwb3NpdGlvbnMgb2Zmc2V0IGFuZCBvZmZzZXQKICAvLyArIDEuICBJZiB0aGUgdHlwZXMgY2FuJ3QgYmUgY2FsY3VsYXRlZCwgZm9yIGV4YW1wbGUsIGlmIHNwcmVhZE1hcEVudHJ5VHlwZQogIC8vIGlzIGEgZnVuY3Rpb24gdHlwZSwgdGhlIG9yaWdpbmFsIHZhbHVlcyBpbiBvdXRwdXQgYXJlIHByZXNlcnZlZC4KICB2b2lkIHN0b3JlU3ByZWFkTWFwRW50cnlFbGVtZW50VHlwZXMoRGFydFR5cGUgc3ByZWFkTWFwRW50cnlUeXBlLAogICAgICBib29sIGlzTnVsbEF3YXJlLCBMaXN0PERhcnRUeXBlPiBvdXRwdXQsIGludCBvZmZzZXQpIHsKICAgIGlmIChzcHJlYWRNYXBFbnRyeVR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICBpZiAoc3ByZWFkTWFwRW50cnlUeXBlLmNsYXNzTm9kZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzKSB7CiAgICAgICAgaWYgKGlzTnVsbEF3YXJlKSB7CiAgICAgICAgICBvdXRwdXRbb2Zmc2V0XSA9IG91dHB1dFtvZmZzZXQgKyAxXSA9IHNwcmVhZE1hcEVudHJ5VHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTGlzdDxEYXJ0VHlwZT4gc3VwZXJ0eXBlQXJndW1lbnRzID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKAogICAgICAgICAgICAgICAgc3ByZWFkTWFwRW50cnlUeXBlLCBpbmZlcnJlci5jb3JlVHlwZXMubWFwQ2xhc3MpOwogICAgICAgIGlmIChzdXBlcnR5cGVBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgb3V0cHV0W29mZnNldF0gPSBzdXBlcnR5cGVBcmd1bWVudHNbMF07CiAgICAgICAgICBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBzdXBlcnR5cGVBcmd1bWVudHNbMV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3ByZWFkTWFwRW50cnlUeXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgIG91dHB1dFtvZmZzZXRdID0gb3V0cHV0W29mZnNldCArIDFdID0gY29uc3QgRHluYW1pY1R5cGUoKTsKICAgIH0KICB9CgogIC8vIE5vdGUgdGhhdCBpbmZlck1hcEVudHJ5IGFkZHMgZXhhY3RseSB0d28gZWxlbWVudHMgdG8gYWN0dWFsVHlwZXMgLS0gdGhlCiAgLy8gYWN0dWFsIHR5cGVzIG9mIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZS4gIFRoZSBzYW1lIHRlY2huaXF1ZSBpcyB1c2VkIGZvcgogIC8vIGFjdHVhbFR5cGVzRm9yU2V0LCBvbmx5IGluZmVyTWFwRW50cnkgYWRkcyBleGFjdGx5IG9uZSBlbGVtZW50IHRvIHRoYXQKICAvLyBsaXN0OiB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGl0ZXJhYmxlIHNwcmVhZCBlbGVtZW50cyBpbiBjYXNlIHRoZSBtYXAKICAvLyBsaXRlcmFsIHdpbGwgYmUgZGlzYW1iaWd1YXRlZCBhcyBhIHNldCBsaXRlcmFsIGxhdGVyLgogIE1hcEVudHJ5IGluZmVyTWFwRW50cnkoCiAgICAgIE1hcEVudHJ5IGVudHJ5LAogICAgICBUcmVlTm9kZSBwYXJlbnQsCiAgICAgIERhcnRUeXBlIGluZmVycmVkS2V5VHlwZSwKICAgICAgRGFydFR5cGUgaW5mZXJyZWRWYWx1ZVR5cGUsCiAgICAgIERhcnRUeXBlIHNwcmVhZENvbnRleHQsCiAgICAgIExpc3Q8RGFydFR5cGU+IGFjdHVhbFR5cGVzLAogICAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlc0ZvclNldCwKICAgICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgTWFwPEV4cHJlc3Npb24sIERhcnRUeXBlPiBpbmZlcnJlZENvbmRpdGlvblR5cGVzLAogICAgICBib29sIGluZmVyZW5jZU5lZWRlZCwKICAgICAgYm9vbCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBzcHJlYWRSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLCBzcHJlYWRDb250ZXh0LCBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBpZiAoZW50cnkuaXNOdWxsQXdhcmUpIHsKICAgICAgICByZXBvcnROb25OdWxsYWJsZUluTnVsbEF3YXJlV2FybmluZ0lmTmVlZGVkKAogICAgICAgICAgICBzcHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlLCAiLi4uPyIsIGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCk7CiAgICAgIH0KICAgICAgZW50cnkuZXhwcmVzc2lvbiA9IHNwcmVhZFJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbnRyeTsKICAgICAgRGFydFR5cGUgc3ByZWFkVHlwZSA9IHNwcmVhZFJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICAgIGluZmVycmVkU3ByZWFkVHlwZXNbZW50cnkuZXhwcmVzc2lvbl0gPSBzcHJlYWRUeXBlOwogICAgICBpbnQgbGVuZ3RoID0gYWN0dWFsVHlwZXMubGVuZ3RoOwogICAgICBhY3R1YWxUeXBlcy5hZGQobnVsbCk7CiAgICAgIGFjdHVhbFR5cGVzLmFkZChudWxsKTsKICAgICAgc3RvcmVTcHJlYWRNYXBFbnRyeUVsZW1lbnRUeXBlcygKICAgICAgICAgIHNwcmVhZFR5cGUsIGVudHJ5LmlzTnVsbEF3YXJlLCBhY3R1YWxUeXBlcywgbGVuZ3RoKTsKICAgICAgRGFydFR5cGUgYWN0dWFsS2V5VHlwZSA9IGFjdHVhbFR5cGVzW2xlbmd0aF07CiAgICAgIERhcnRUeXBlIGFjdHVhbFZhbHVlVHlwZSA9IGFjdHVhbFR5cGVzW2xlbmd0aCArIDFdOwogICAgICBEYXJ0VHlwZSBhY3R1YWxFbGVtZW50VHlwZSA9CiAgICAgICAgICBnZXRTcHJlYWRFbGVtZW50VHlwZShzcHJlYWRUeXBlLCBlbnRyeS5pc051bGxBd2FyZSk7CgogICAgICBNYXBFbnRyeSByZXBsYWNlbWVudCA9IGVudHJ5OwogICAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICAgIGlmIChhY3R1YWxLZXlUeXBlID09IG51bGwpIHsKICAgICAgICAgIGlmIChzcHJlYWRUeXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgICAgICBzcHJlYWRUeXBlLmNsYXNzTm9kZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzICYmCiAgICAgICAgICAgICAgIWVudHJ5LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gbmV3IE1hcEVudHJ5KAogICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbShtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsLAogICAgICAgICAgICAgICAgICAgIGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCwgMSksCiAgICAgICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0OwogICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxFbGVtZW50VHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIERvbid0IHJlcG9ydCB0aGUgZXJyb3IgaGVyZSwgaXQgbWlnaHQgYmUgYW4gYW1iaWd1b3VzIFNldC4gIFRoZQogICAgICAgICAgICAvLyBlcnJvciBpcyByZXBvcnRlZCBpbiBjaGVja01hcEVudHJ5IGlmIGl0J3MgZGlzYW1iaWd1YXRlZCBhcyBtYXAuCiAgICAgICAgICAgIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IHNwcmVhZFR5cGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXBsYWNlbWVudCA9IG5ldyBNYXBFbnRyeSgKICAgICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVTcHJlYWRNYXBFbnRyeVR5cGVNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWRUeXBlLCBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgMSksCiAgICAgICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3ByZWFkVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgICBFeHByZXNzaW9uIGtleUVycm9yOwogICAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZUVycm9yOwogICAgICAgICAgaWYgKCFpbmZlcnJlci5pc0Fzc2lnbmFibGUoaW5mZXJyZWRLZXlUeXBlLCBhY3R1YWxLZXlUeXBlKSkgewogICAgICAgICAgICBrZXlFcnJvciA9IGluZmVycmVyLmhlbHBlci5idWlsZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGFjdHVhbEtleVR5cGUsCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWRLZXlUeXBlLAogICAgICAgICAgICAgICAgICAgIGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgZW50cnkuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWluZmVycmVyLmlzQXNzaWduYWJsZShpbmZlcnJlZFZhbHVlVHlwZSwgYWN0dWFsVmFsdWVUeXBlKSkgewogICAgICAgICAgICB2YWx1ZUVycm9yID0gaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2gud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBhY3R1YWxWYWx1ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChrZXlFcnJvciAhPSBudWxsIHx8IHZhbHVlRXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICBrZXlFcnJvciA/Pz0gbmV3IE51bGxMaXRlcmFsKCk7CiAgICAgICAgICAgIHZhbHVlRXJyb3IgPz89IG5ldyBOdWxsTGl0ZXJhbCgpOwogICAgICAgICAgICByZXBsYWNlbWVudCA9IG5ldyBNYXBFbnRyeShrZXlFcnJvciwgdmFsdWVFcnJvcikKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVXNlICdkeW5hbWljJyBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgIGlmIChhY3R1YWxLZXlUeXBlID09IG51bGwpIHsKICAgICAgICBhY3R1YWxLZXlUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoXSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgICAgYWN0dWFsVmFsdWVUeXBlID0gYWN0dWFsVHlwZXNbbGVuZ3RoICsgMV0gPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgICB9CiAgICAgIC8vIFN0b3JlIHRoZSB0eXBlIGluIGNhc2Ugb2YgYW4gYW1iaWd1b3VzIFNldC4gIFVzZSAnZHluYW1pYycgZm9yIGVycm9yCiAgICAgIC8vIHJlY292ZXJ5LgogICAgICBhY3R1YWxUeXBlc0ZvclNldC5hZGQoYWN0dWFsRWxlbWVudFR5cGUgPz8gY29uc3QgRHluYW1pY1R5cGUoKSk7CgogICAgICBtYXBFbnRyeUNsYXNzID8/PQogICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmluZGV4LmdldENsYXNzKCdkYXJ0OmNvcmUnLCAnTWFwRW50cnknKTsKICAgICAgLy8gVE9ETyhkbWl0cnlhcyk6ICBIYW5kbGUgdGhlIGNhc2Ugb2YgYW4gYW1iaWd1b3VzIFNldC4KICAgICAgZW50cnkuZW50cnlUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICBtYXBFbnRyeUNsYXNzLAogICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSwKICAgICAgICAgIDxEYXJ0VHlwZT5bYWN0dWFsS2V5VHlwZSwgYWN0dWFsVmFsdWVUeXBlXSk7CgogICAgICBib29sIGlzTWFwID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKAogICAgICAgICAgc3ByZWFkVHlwZSwKICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5tYXBSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubnVsbGFibGUpLAogICAgICAgICAgU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXMpOwogICAgICBib29sIGlzSXRlcmFibGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCiAgICAgICAgICBzcHJlYWRUeXBlLAogICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm51bGxhYmxlKSwKICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKICAgICAgaWYgKGlzTWFwICYmICFpc0l0ZXJhYmxlKSB7CiAgICAgICAgbWFwU3ByZWFkT2Zmc2V0ID0gZW50cnkuZmlsZU9mZnNldDsKICAgICAgfQogICAgICBpZiAoIWlzTWFwICYmIGlzSXRlcmFibGUpIHsKICAgICAgICBpdGVyYWJsZVNwcmVhZE9mZnNldCA9IGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldDsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICAgIERhcnRUeXBlIGJvb2xUeXBlID0KICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBjb25kaXRpb25SZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBlbnRyeS5jb25kaXRpb24sIGJvb2xUeXBlLCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9CiAgICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KGJvb2xUeXBlLCBjb25kaXRpb25SZXN1bHQpOwogICAgICBlbnRyeS5jb25kaXRpb24gPSBjb25kaXRpb24uLnBhcmVudCA9IGVudHJ5OwogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZTdGF0ZW1lbnRfdGhlbkJlZ2luKGNvbmRpdGlvbik7CiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mIGluZmVyTWFwRW50cnkgd2lsbCBhZGQgdHdvIHR5cGVzCiAgICAgIC8vIHRvIGFjdHVhbFR5cGVzOyB0aGV5IGFyZSB0aGUgYWN0dWFsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24gaWYKICAgICAgLy8gdGhlICdlbHNlJyBicmFuY2ggaXMgZW1wdHkuCiAgICAgIE1hcEVudHJ5IHRoZW4gPSBpbmZlck1hcEVudHJ5KAogICAgICAgICAgZW50cnkudGhlbiwKICAgICAgICAgIGVudHJ5LAogICAgICAgICAgaW5mZXJyZWRLZXlUeXBlLAogICAgICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUsCiAgICAgICAgICBzcHJlYWRDb250ZXh0LAogICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICBhY3R1YWxUeXBlc0ZvclNldCwKICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsCiAgICAgICAgICBpbmZlcnJlZENvbmRpdGlvblR5cGVzLAogICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgdHlwZUNoZWNrc05lZWRlZCk7CiAgICAgIGVudHJ5LnRoZW4gPSB0aGVuLi5wYXJlbnQgPSBlbnRyeTsKICAgICAgTWFwRW50cnkgb3RoZXJ3aXNlOwogICAgICBpZiAoZW50cnkub3RoZXJ3aXNlICE9IG51bGwpIHsKICAgICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZTdGF0ZW1lbnRfZWxzZUJlZ2luKCk7CiAgICAgICAgLy8gV2UgbmVlZCB0byBtb2RpZnkgdGhlIGFjdHVhbCB0eXBlcyBhZGRlZCBpbiB0aGUgcmVjdXJzaXZlIGNhbGwgdG8KICAgICAgICAvLyBpbmZlck1hcEVudHJ5LgogICAgICAgIERhcnRUeXBlIGFjdHVhbFZhbHVlVHlwZSA9IGFjdHVhbFR5cGVzLnJlbW92ZUxhc3QoKTsKICAgICAgICBEYXJ0VHlwZSBhY3R1YWxLZXlUeXBlID0gYWN0dWFsVHlwZXMucmVtb3ZlTGFzdCgpOwogICAgICAgIERhcnRUeXBlIGFjdHVhbFR5cGVGb3JTZXQgPSBhY3R1YWxUeXBlc0ZvclNldC5yZW1vdmVMYXN0KCk7CiAgICAgICAgb3RoZXJ3aXNlID0gaW5mZXJNYXBFbnRyeSgKICAgICAgICAgICAgZW50cnkub3RoZXJ3aXNlLAogICAgICAgICAgICBlbnRyeSwKICAgICAgICAgICAgaW5mZXJyZWRLZXlUeXBlLAogICAgICAgICAgICBpbmZlcnJlZFZhbHVlVHlwZSwKICAgICAgICAgICAgc3ByZWFkQ29udGV4dCwKICAgICAgICAgICAgYWN0dWFsVHlwZXMsCiAgICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgICBpbmZlcnJlZENvbmRpdGlvblR5cGVzLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICAgIGludCBsZW5ndGggPSBhY3R1YWxUeXBlcy5sZW5ndGg7CiAgICAgICAgYWN0dWFsVHlwZXNbbGVuZ3RoIC0gMl0gPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZChhY3R1YWxLZXlUeXBlLCBhY3R1YWxUeXBlc1tsZW5ndGggLSAyXSwKICAgICAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CiAgICAgICAgYWN0dWFsVHlwZXNbbGVuZ3RoIC0gMV0gPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZChhY3R1YWxWYWx1ZVR5cGUsIGFjdHVhbFR5cGVzW2xlbmd0aCAtIDFdLAogICAgICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKICAgICAgICBpbnQgbGVuZ3RoRm9yU2V0ID0gYWN0dWFsVHlwZXNGb3JTZXQubGVuZ3RoOwogICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0W2xlbmd0aEZvclNldCAtIDFdID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQoYWN0dWFsVHlwZUZvclNldCwKICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0W2xlbmd0aEZvclNldCAtIDFdLCBpbmZlcnJlci5saWJyYXJ5LmxpYnJhcnkpOwogICAgICAgIGVudHJ5Lm90aGVyd2lzZSA9IG90aGVyd2lzZS4ucGFyZW50ID0gZW50cnk7CiAgICAgIH0KICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmU3RhdGVtZW50X2VuZChlbnRyeS5vdGhlcndpc2UgIT0gbnVsbCk7CiAgICAgIHJldHVybiBlbnRyeTsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9yTWFwRW50cnkpIHsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIF92aXNpdFN0YXRlbWVudHMgaW5zdGVhZC4KICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJpYWJsZXM7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyeS52YXJpYWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGVudHJ5LnZhcmlhYmxlc1tpbmRleF07CiAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT0gbnVsbCkgewogICAgICAgICAgaWYgKHZhcmlhYmxlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciwKICAgICAgICAgICAgICAgIHZhcmlhYmxlLnR5cGUsCiAgICAgICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCwKICAgICAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9IHJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgICAgICAgdmFyaWFibGUudHlwZSA9IHJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCB2YXJpYWJsZVJlc3VsdCA9CiAgICAgICAgICAgICAgaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQodmFyaWFibGUpOwogICAgICAgICAgaWYgKHZhcmlhYmxlUmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgICAgICAgaWYgKHZhcmlhYmxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyaWFibGVzID0gPFZhcmlhYmxlRGVjbGFyYXRpb24+W107CiAgICAgICAgICAgICAgdmFyaWFibGVzLmFkZEFsbChlbnRyeS52YXJpYWJsZXMuc3VibGlzdCgwLCBpbmRleCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YXJpYWJsZVJlc3VsdC5zdGF0ZW1lbnRDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICAgdmFyaWFibGVzLmFkZCh2YXJpYWJsZVJlc3VsdC5zdGF0ZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiB2YXJpYWJsZVJlc3VsdC5zdGF0ZW1lbnRzKSB7CiAgICAgICAgICAgICAgICB2YXJpYWJsZXMuYWRkKHZhcmlhYmxlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKICAgICAgICAgICAgdmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh2YXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIGVudHJ5LnZhcmlhYmxlcy5jbGVhcigpOwogICAgICAgIGVudHJ5LnZhcmlhYmxlcy5hZGRBbGwodmFyaWFibGVzKTsKICAgICAgICBzZXRQYXJlbnRzKHZhcmlhYmxlcywgZW50cnkpOwogICAgICB9CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfY29uZGl0aW9uQmVnaW4oZW50cnkpOwogICAgICBpZiAoZW50cnkuY29uZGl0aW9uICE9IG51bGwpIHsKICAgICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGNvbmRpdGlvblJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICAgICAgZW50cnkuY29uZGl0aW9uLAogICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CiAgICAgICAgZW50cnkuY29uZGl0aW9uID0gY29uZGl0aW9uUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IGVudHJ5OwogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEVuc3VyZSBhc3NpZ25hYmlsaXR5IG9mIGNvbmRpdGlvbj8KICAgICAgICBpbmZlcnJlZENvbmRpdGlvblR5cGVzW2VudHJ5LmNvbmRpdGlvbl0gPSBjb25kaXRpb25SZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgICB9CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfYm9keUJlZ2luKG51bGwsIGVudHJ5LmNvbmRpdGlvbik7CiAgICAgIC8vIEFjdHVhbCB0eXBlcyBhcmUgYWRkZWQgYnkgdGhlIHJlY3Vyc2l2ZSBjYWxsLgogICAgICBNYXBFbnRyeSBib2R5ID0gaW5mZXJNYXBFbnRyeSgKICAgICAgICAgIGVudHJ5LmJvZHksCiAgICAgICAgICBlbnRyeSwKICAgICAgICAgIGluZmVycmVkS2V5VHlwZSwKICAgICAgICAgIGluZmVycmVkVmFsdWVUeXBlLAogICAgICAgICAgc3ByZWFkQ29udGV4dCwKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgYWN0dWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgaW5mZXJyZWRDb25kaXRpb25UeXBlcywKICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCwKICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICBlbnRyeS5ib2R5ID0gYm9keS4ucGFyZW50ID0gZW50cnk7CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfdXBkYXRlckJlZ2luKCk7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyeS51cGRhdGVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdXBkYXRlUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgICBlbnRyeS51cGRhdGVzW2luZGV4XSwKICAgICAgICAgICAgY29uc3QgVW5rbm93blR5cGUoKSwKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQsCiAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICAgIGVudHJ5LnVwZGF0ZXNbaW5kZXhdID0gdXBkYXRlUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IGVudHJ5OwogICAgICB9CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5mb3JfZW5kKCk7CiAgICAgIHJldHVybiBlbnRyeTsKICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9ySW5NYXBFbnRyeSkgewogICAgICBGb3JJblJlc3VsdCByZXN1bHQ7CiAgICAgIGlmIChlbnRyeS52YXJpYWJsZS5uYW1lID09IG51bGwpIHsKICAgICAgICByZXN1bHQgPSBoYW5kbGVGb3JJbldpdGhvdXRWYXJpYWJsZShlbnRyeSwgZW50cnkudmFyaWFibGUsCiAgICAgICAgICAgIGVudHJ5Lml0ZXJhYmxlLCBlbnRyeS5zeW50aGV0aWNBc3NpZ25tZW50LCBlbnRyeS5leHByZXNzaW9uRWZmZWN0cywKICAgICAgICAgICAgaXNBc3luYzogZW50cnkuaXNBc3luYywgaGFzUHJvYmxlbTogZW50cnkucHJvYmxlbSAhPSBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlKAogICAgICAgICAgICBlbnRyeSwgZW50cnkudmFyaWFibGUsIGVudHJ5Lml0ZXJhYmxlLCBlbnRyeS5leHByZXNzaW9uRWZmZWN0cywKICAgICAgICAgICAgaXNBc3luYzogZW50cnkuaXNBc3luYyk7CiAgICAgIH0KICAgICAgZW50cnkudmFyaWFibGUgPSByZXN1bHQudmFyaWFibGUuLnBhcmVudCA9IGVudHJ5OwogICAgICBlbnRyeS5pdGVyYWJsZSA9IHJlc3VsdC5pdGVyYWJsZS4ucGFyZW50ID0gZW50cnk7CiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFVzZSA/Li4gaGVyZSBpbnN0ZWFkLgogICAgICBlbnRyeS5zeW50aGV0aWNBc3NpZ25tZW50ID0gcmVzdWx0LnN5bnRoZXRpY0Fzc2lnbm1lbnQ7CiAgICAgIHJlc3VsdC5zeW50aGV0aWNBc3NpZ25tZW50Py5wYXJlbnQgPSBlbnRyeTsKICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlID8uLiBoZXJlIGluc3RlYWQuCiAgICAgIGVudHJ5LmV4cHJlc3Npb25FZmZlY3RzID0gcmVzdWx0LmV4cHJlc3Npb25TaWRlRWZmZWN0czsKICAgICAgcmVzdWx0LmV4cHJlc3Npb25TaWRlRWZmZWN0cz8ucGFyZW50ID0gZW50cnk7CiAgICAgIGlmIChlbnRyeS5wcm9ibGVtICE9IG51bGwpIHsKICAgICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHByb2JsZW1SZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgIGVudHJ5LnByb2JsZW0sCiAgICAgICAgICAgIGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgICAgIGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkLAogICAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgICBlbnRyeS5wcm9ibGVtID0gcHJvYmxlbVJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBlbnRyeTsKICAgICAgfQogICAgICAvLyBBY3R1YWwgdHlwZXMgYXJlIGFkZGVkIGJ5IHRoZSByZWN1cnNpdmUgY2FsbC4KICAgICAgTWFwRW50cnkgYm9keSA9IGluZmVyTWFwRW50cnkoCiAgICAgICAgICBlbnRyeS5ib2R5LAogICAgICAgICAgZW50cnksCiAgICAgICAgICBpbmZlcnJlZEtleVR5cGUsCiAgICAgICAgICBpbmZlcnJlZFZhbHVlVHlwZSwKICAgICAgICAgIHNwcmVhZENvbnRleHQsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMsCiAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgZW50cnkuYm9keSA9IGJvZHkuLnBhcmVudCA9IGVudHJ5OwogICAgICAvLyBUaGlzIGlzIG1hdGNoZWQgYnkgdGhlIGNhbGwgdG8gW2ZvckVhY2hfYm9keUJlZ2luXSBpbgogICAgICAvLyBbaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGVdIG9yIFtoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlXS4KICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmZvckVhY2hfZW5kKCk7CiAgICAgIHJldHVybiBlbnRyeTsKICAgIH0gZWxzZSB7CiAgICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQga2V5UmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkua2V5LCBpbmZlcnJlZEtleVR5cGUsIHRydWUsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgICAgRXhwcmVzc2lvbiBrZXkgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KAogICAgICAgICAgaW5mZXJyZWRLZXlUeXBlLCBrZXlSZXN1bHQsCiAgICAgICAgICBpc1ZvaWRBbGxvd2VkOiBpbmZlcnJlZEtleVR5cGUgaXMgVm9pZFR5cGUpOwogICAgICBlbnRyeS5rZXkgPSBrZXkuLnBhcmVudCA9IGVudHJ5OwogICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZhbHVlUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgZW50cnkudmFsdWUsIGluZmVycmVkVmFsdWVUeXBlLCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KAogICAgICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUsIHZhbHVlUmVzdWx0LAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogaW5mZXJyZWRWYWx1ZVR5cGUgaXMgVm9pZFR5cGUpOwogICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlLi5wYXJlbnQgPSBlbnRyeTsKICAgICAgYWN0dWFsVHlwZXMuYWRkKGtleVJlc3VsdC5pbmZlcnJlZFR5cGUpOwogICAgICBhY3R1YWxUeXBlcy5hZGQodmFsdWVSZXN1bHQuaW5mZXJyZWRUeXBlKTsKICAgICAgLy8gVXNlICdkeW5hbWljJyBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LmFkZChjb25zdCBEeW5hbWljVHlwZSgpKTsKICAgICAgbWFwRW50cnlPZmZzZXQgPSBlbnRyeS5maWxlT2Zmc2V0OwogICAgICByZXR1cm4gZW50cnk7CiAgICB9CiAgfQoKICBNYXBFbnRyeSBjaGVja01hcEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwKICAgICAgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLAogICAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICBNYXA8RXhwcmVzc2lvbiwgRGFydFR5cGU+IGluZmVycmVkQ29uZGl0aW9uVHlwZXMpIHsKICAgIC8vIEl0J3MgZGlzYW1iaWd1YXRlZCBhcyBhIG1hcCBsaXRlcmFsLgogICAgTWFwRW50cnkgcmVwbGFjZW1lbnQgPSBlbnRyeTsKICAgIGlmIChpdGVyYWJsZVNwcmVhZE9mZnNldCAhPSBudWxsKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gbmV3IE1hcEVudHJ5KAogICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGl0ZXJhYmxlU3ByZWFkVHlwZSwgaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgaXRlcmFibGVTcHJlYWRPZmZzZXQsCiAgICAgICAgICAgICAgMSksCiAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKSk7CiAgICB9CiAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgRGFydFR5cGUgc3ByZWFkVHlwZSA9IGluZmVycmVkU3ByZWFkVHlwZXNbZW50cnkuZXhwcmVzc2lvbl07CiAgICAgIGlmIChzcHJlYWRUeXBlIGlzIER5bmFtaWNUeXBlKSB7CiAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzCiAgICAgICAgICAgICAgICAubWFwUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm51bGxhYmxlSWZUcnVlKGVudHJ5LmlzTnVsbEF3YXJlKSksCiAgICAgICAgICAgIHNwcmVhZFR5cGUsCiAgICAgICAgICAgIGVudHJ5LmV4cHJlc3Npb24pOwogICAgICAgIGVudHJ5LmV4cHJlc3Npb24gPSBleHByZXNzaW9uLi5wYXJlbnQgPSBlbnRyeTsKICAgICAgfQogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICAgIE1hcEVudHJ5IHRoZW4gPSBjaGVja01hcEVudHJ5KGVudHJ5LnRoZW4sIGtleVR5cGUsIHZhbHVlVHlwZSwKICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICBlbnRyeS50aGVuID0gdGhlbi4ucGFyZW50ID0gZW50cnk7CiAgICAgIGlmIChlbnRyeS5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICAgIE1hcEVudHJ5IG90aGVyd2lzZSA9IGNoZWNrTWFwRW50cnkoZW50cnkub3RoZXJ3aXNlLCBrZXlUeXBlLCB2YWx1ZVR5cGUsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICAgIGVudHJ5Lm90aGVyd2lzZSA9IG90aGVyd2lzZS4ucGFyZW50ID0gZW50cnk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZW50cnkgaXMgRm9yTWFwRW50cnkpIHsKICAgICAgaWYgKGVudHJ5LmNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgRGFydFR5cGUgY29uZGl0aW9uVHlwZSA9IGluZmVycmVkQ29uZGl0aW9uVHlwZXNbZW50cnkuY29uZGl0aW9uXTsKICAgICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICAgICAgY29uZGl0aW9uVHlwZSwKICAgICAgICAgICAgZW50cnkuY29uZGl0aW9uKTsKICAgICAgICBlbnRyeS5jb25kaXRpb24gPSBjb25kaXRpb24uLnBhcmVudCA9IGVudHJ5OwogICAgICB9CiAgICAgIE1hcEVudHJ5IGJvZHkgPSBjaGVja01hcEVudHJ5KGVudHJ5LmJvZHksIGtleVR5cGUsIHZhbHVlVHlwZSwKICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICBlbnRyeS5ib2R5ID0gYm9keS4ucGFyZW50ID0gZW50cnk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvckluTWFwRW50cnkpIHsKICAgICAgTWFwRW50cnkgYm9keSA9IGNoZWNrTWFwRW50cnkoZW50cnkuYm9keSwga2V5VHlwZSwgdmFsdWVUeXBlLAogICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywgaW5mZXJyZWRDb25kaXRpb25UeXBlcyk7CiAgICAgIGVudHJ5LmJvZHkgPSBib2R5Li5wYXJlbnQgPSBlbnRyeTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIERvIG5vdGhpbmcuICBBc3NpZ25hYmlsaXR5IGNoZWNrcyBhcmUgZG9uZSBkdXJpbmcgdHlwZSBpbmZlcmVuY2UuCiAgICB9CiAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TWFwTGl0ZXJhbCgKICAgICAgTWFwTGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgQ2xhc3MgbWFwQ2xhc3MgPSBpbmZlcnJlci5jb3JlVHlwZXMubWFwQ2xhc3M7CiAgICBJbnRlcmZhY2VUeXBlIG1hcFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMKICAgICAgICAudGhpc0ludGVyZmFjZVR5cGUobWFwQ2xhc3MsIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJyZWRUeXBlczsKICAgIERhcnRUeXBlIGluZmVycmVkS2V5VHlwZTsKICAgIERhcnRUeXBlIGluZmVycmVkVmFsdWVUeXBlOwogICAgTGlzdDxEYXJ0VHlwZT4gZm9ybWFsVHlwZXM7CiAgICBMaXN0PERhcnRUeXBlPiBhY3R1YWxUeXBlczsKICAgIExpc3Q8RGFydFR5cGU+IGFjdHVhbFR5cGVzRm9yU2V0OwogICAgYXNzZXJ0KChub2RlLmtleVR5cGUgaXMgSW1wbGljaXRUeXBlQXJndW1lbnQpID09CiAgICAgICAgKG5vZGUudmFsdWVUeXBlIGlzIEltcGxpY2l0VHlwZUFyZ3VtZW50KSk7CiAgICBib29sIGluZmVyZW5jZU5lZWRlZCA9IG5vZGUua2V5VHlwZSBpcyBJbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgIGJvb2wgdHlwZUNvbnRleHRJc01hcCA9IG5vZGUua2V5VHlwZSBpcyEgSW1wbGljaXRUeXBlQXJndW1lbnQ7CiAgICBib29sIHR5cGVDb250ZXh0SXNJdGVyYWJsZSA9IGZhbHNlOwogICAgaWYgKCFpbmZlcnJlci5pc1RvcExldmVsICYmIGluZmVyZW5jZU5lZWRlZCkgewogICAgICAvLyBBbWJpZ3VvdXMgc2V0L21hcCBsaXRlcmFsCiAgICAgIERhcnRUeXBlIGNvbnRleHQgPQogICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZSh0eXBlQ29udGV4dCk7CiAgICAgIGlmIChjb250ZXh0IGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgICB0eXBlQ29udGV4dElzTWFwID0gdHlwZUNvbnRleHRJc01hcCB8fAogICAgICAgICAgICBpbmZlcnJlci5jbGFzc0hpZXJhcmNoeQogICAgICAgICAgICAgICAgLmlzU3VidHlwZU9mKGNvbnRleHQuY2xhc3NOb2RlLCBpbmZlcnJlci5jb3JlVHlwZXMubWFwQ2xhc3MpOwogICAgICAgIHR5cGVDb250ZXh0SXNJdGVyYWJsZSA9IHR5cGVDb250ZXh0SXNJdGVyYWJsZSB8fAogICAgICAgICAgICBpbmZlcnJlci5jbGFzc0hpZXJhcmNoeS5pc1N1YnR5cGVPZigKICAgICAgICAgICAgICAgIGNvbnRleHQuY2xhc3NOb2RlLCBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcyk7CiAgICAgICAgaWYgKG5vZGUuZW50cmllcy5pc0VtcHR5ICYmCiAgICAgICAgICAgIHR5cGVDb250ZXh0SXNJdGVyYWJsZSAmJgogICAgICAgICAgICAhdHlwZUNvbnRleHRJc01hcCkgewogICAgICAgICAgLy8gU2V0IGxpdGVyYWwKICAgICAgICAgIFNldExpdGVyYWwgc2V0TGl0ZXJhbCA9IG5ldyBTZXRMaXRlcmFsKFtdLAogICAgICAgICAgICAgIHR5cGVBcmd1bWVudDogY29uc3QgSW1wbGljaXRUeXBlQXJndW1lbnQoKSwgaXNDb25zdDogbm9kZS5pc0NvbnN0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgICAgICByZXR1cm4gdmlzaXRTZXRMaXRlcmFsKHNldExpdGVyYWwsIHR5cGVDb250ZXh0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJvb2wgdHlwZUNoZWNrc05lZWRlZCA9ICFpbmZlcnJlci5pc1RvcExldmVsOwogICAgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4gaW5mZXJyZWRTcHJlYWRUeXBlczsKICAgIE1hcDxFeHByZXNzaW9uLCBEYXJ0VHlwZT4gaW5mZXJyZWRDb25kaXRpb25UeXBlczsKICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3JtYWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlcyA9IFtdOwogICAgICBhY3R1YWxUeXBlc0ZvclNldCA9IFtdOwogICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzID0gbmV3IE1hcDxUcmVlTm9kZSwgRGFydFR5cGU+LmlkZW50aXR5KCk7CiAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMgPSBuZXcgTWFwPEV4cHJlc3Npb24sIERhcnRUeXBlPi5pZGVudGl0eSgpOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlZFR5cGVzID0gW2NvbnN0IFVua25vd25UeXBlKCksIGNvbnN0IFVua25vd25UeXBlKCldOwogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICBtYXBUeXBlLAogICAgICAgICAgbWFwQ2xhc3MudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBudWxsLAogICAgICAgICAgbnVsbCwKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSwKICAgICAgICAgIGlzQ29uc3Q6IG5vZGUuaXNDb25zdCk7CiAgICAgIGluZmVycmVkS2V5VHlwZSA9IGluZmVycmVkVHlwZXNbMF07CiAgICAgIGluZmVycmVkVmFsdWVUeXBlID0gaW5mZXJyZWRUeXBlc1sxXTsKICAgIH0gZWxzZSB7CiAgICAgIGluZmVycmVkS2V5VHlwZSA9IG5vZGUua2V5VHlwZTsKICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUgPSBub2RlLnZhbHVlVHlwZTsKICAgIH0KICAgIGJvb2wgaGFzTWFwRW50cnkgPSBmYWxzZTsKICAgIGJvb2wgaGFzTWFwU3ByZWFkID0gZmFsc2U7CiAgICBib29sIGhhc0l0ZXJhYmxlU3ByZWFkID0gZmFsc2U7CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkIHx8IHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgbWFwRW50cnlPZmZzZXQgPSBudWxsOwogICAgICBtYXBTcHJlYWRPZmZzZXQgPSBudWxsOwogICAgICBpdGVyYWJsZVNwcmVhZE9mZnNldCA9IG51bGw7CiAgICAgIGl0ZXJhYmxlU3ByZWFkVHlwZSA9IG51bGw7CiAgICAgIERhcnRUeXBlIHNwcmVhZFR5cGVDb250ZXh0ID0gY29uc3QgVW5rbm93blR5cGUoKTsKICAgICAgaWYgKHR5cGVDb250ZXh0SXNJdGVyYWJsZSAmJiAhdHlwZUNvbnRleHRJc01hcCkgewogICAgICAgIHNwcmVhZFR5cGVDb250ZXh0ID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuaXRlcmFibGVDbGFzcywKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5LAogICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMpOwogICAgICB9IGVsc2UgaWYgKCF0eXBlQ29udGV4dElzSXRlcmFibGUgJiYgdHlwZUNvbnRleHRJc01hcCkgewogICAgICAgIHNwcmVhZFR5cGVDb250ZXh0ID0gbmV3IEludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5tYXBDbGFzcywKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSwKICAgICAgICAgICAgPERhcnRUeXBlPltpbmZlcnJlZEtleVR5cGUsIGluZmVycmVkVmFsdWVUeXBlXSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5vZGUuZW50cmllcy5sZW5ndGg7ICsraW5kZXgpIHsKICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IG5vZGUuZW50cmllc1tpbmRleF07CiAgICAgICAgZW50cnkgPSBpbmZlck1hcEVudHJ5KAogICAgICAgICAgICBlbnRyeSwKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgaW5mZXJyZWRLZXlUeXBlLAogICAgICAgICAgICBpbmZlcnJlZFZhbHVlVHlwZSwKICAgICAgICAgICAgc3ByZWFkVHlwZUNvbnRleHQsCiAgICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgICBhY3R1YWxUeXBlc0ZvclNldCwKICAgICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgICAgaW5mZXJyZWRDb25kaXRpb25UeXBlcywKICAgICAgICAgICAgaW5mZXJlbmNlTmVlZGVkLAogICAgICAgICAgICB0eXBlQ2hlY2tzTmVlZGVkKTsKICAgICAgICBub2RlLmVudHJpZXNbaW5kZXhdID0gZW50cnkuLnBhcmVudCA9IG5vZGU7CiAgICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgICAgZm9ybWFsVHlwZXMuYWRkKG1hcFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgICBmb3JtYWxUeXBlcy5hZGQobWFwVHlwZS50eXBlQXJndW1lbnRzWzFdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGFzTWFwRW50cnkgPSBtYXBFbnRyeU9mZnNldCAhPSBudWxsOwogICAgICBoYXNNYXBTcHJlYWQgPSBtYXBTcHJlYWRPZmZzZXQgIT0gbnVsbDsKICAgICAgaGFzSXRlcmFibGVTcHJlYWQgPSBpdGVyYWJsZVNwcmVhZE9mZnNldCAhPSBudWxsOwogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBib29sIGNhbkJlU2V0ID0gIWhhc01hcFNwcmVhZCAmJiAhaGFzTWFwRW50cnkgJiYgIXR5cGVDb250ZXh0SXNNYXA7CiAgICAgIGJvb2wgY2FuQmVNYXAgPSAhaGFzSXRlcmFibGVTcHJlYWQgJiYgIXR5cGVDb250ZXh0SXNJdGVyYWJsZTsKICAgICAgaWYgKGNhbkJlU2V0ICYmICFjYW5CZU1hcCkgewogICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gc2V0RWxlbWVudHMgPSA8RXhwcmVzc2lvbj5bXTsKICAgICAgICBMaXN0PERhcnRUeXBlPiBmb3JtYWxUeXBlc0ZvclNldCA9IDxEYXJ0VHlwZT5bXTsKICAgICAgICBJbnRlcmZhY2VUeXBlIHNldFR5cGUgPSBpbmZlcnJlci5jb3JlVHlwZXMudGhpc0ludGVyZmFjZVR5cGUoCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcywgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHNldEVsZW1lbnRzLmFkZChjb252ZXJ0VG9FbGVtZW50KG5vZGUuZW50cmllc1tpXSwgaW5mZXJyZXIuaGVscGVyLAogICAgICAgICAgICAgIGluZmVycmVyLmFzc2lnbmVkVmFyaWFibGVzLnJlYXNzaWduSW5mbykpOwogICAgICAgICAgZm9ybWFsVHlwZXNGb3JTZXQuYWRkKHNldFR5cGUudHlwZUFyZ3VtZW50c1swXSk7CiAgICAgICAgfQoKICAgICAgICBMaXN0PERhcnRUeXBlPiBpbmZlcnJlZFR5cGVzRm9yU2V0ID0gPERhcnRUeXBlPltjb25zdCBVbmtub3duVHlwZSgpXTsKICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICAgIHNldFR5cGUsCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgICAgIGluZmVycmVkVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSwKICAgICAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy50aGlzSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcywgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zZXRDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgICAgZm9ybWFsVHlwZXNGb3JTZXQsCiAgICAgICAgICAgIGFjdHVhbFR5cGVzRm9yU2V0LAogICAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgICAgaW5mZXJyZWRUeXBlc0ZvclNldCwKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKICAgICAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGVBcmd1bWVudCA9IGluZmVycmVkVHlwZXNGb3JTZXRbMF07CiAgICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAndHlwZUFyZ3MnLAogICAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyhbaW5mZXJyZWRUeXBlQXJndW1lbnRdKSk7CgogICAgICAgIFNldExpdGVyYWwgc2V0TGl0ZXJhbCA9IG5ldyBTZXRMaXRlcmFsKHNldEVsZW1lbnRzLAogICAgICAgICAgICB0eXBlQXJndW1lbnQ6IGluZmVycmVkVHlwZUFyZ3VtZW50LCBpc0NvbnN0OiBub2RlLmlzQ29uc3QpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgICAgaWYgKHR5cGVDaGVja3NOZWVkZWQpIHsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0TGl0ZXJhbC5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjaGVja0VsZW1lbnQoCiAgICAgICAgICAgICAgICBzZXRMaXRlcmFsLmV4cHJlc3Npb25zW2ldLAogICAgICAgICAgICAgICAgc2V0TGl0ZXJhbCwKICAgICAgICAgICAgICAgIHNldExpdGVyYWwudHlwZUFyZ3VtZW50LAogICAgICAgICAgICAgICAgaW5mZXJyZWRTcHJlYWRUeXBlcywKICAgICAgICAgICAgICAgIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gbmV3IEludGVyZmFjZVR5cGUoaW5mZXJyZXIuY29yZVR5cGVzLnNldENsYXNzLAogICAgICAgICAgICBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlLCBpbmZlcnJlZFR5cGVzRm9yU2V0KTsKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBzZXRMaXRlcmFsKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVTZXQgJiYgY2FuQmVNYXAgJiYgbm9kZS5lbnRyaWVzLmlzTm90RW1wdHkpIHsKICAgICAgICBFeHByZXNzaW9uIGVycm9yID0gaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgbWVzc2FnZUNhbnREaXNhbWJpZ3VhdGVOb3RFbm91Z2hJbmZvcm1hdGlvbiwgbm9kZS5maWxlT2Zmc2V0LCAxKTsKICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgQm90dG9tVHlwZSgpLCBlcnJvcik7CiAgICAgIH0KICAgICAgaWYgKCFjYW5CZVNldCAmJiAhY2FuQmVNYXApIHsKICAgICAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbm9kZTsKICAgICAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgICAgIHJlcGxhY2VtZW50ID0gaW5mZXJyZXIuaGVscGVyLmJ1aWxkUHJvYmxlbSgKICAgICAgICAgICAgICBtZXNzYWdlQ2FudERpc2FtYmlndWF0ZUFtYmlndW91c0luZm9ybWF0aW9uLCBub2RlLmZpbGVPZmZzZXQsIDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgQm90dG9tVHlwZSgpLCByZXBsYWNlbWVudCk7CiAgICAgIH0KICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmluZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlKAogICAgICAgICAgbWFwVHlwZSwKICAgICAgICAgIG1hcENsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgZm9ybWFsVHlwZXMsCiAgICAgICAgICBhY3R1YWxUeXBlcywKICAgICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgICAgaW5mZXJyZWRUeXBlcywKICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CiAgICAgIGluZmVycmVkS2V5VHlwZSA9IGluZmVycmVkVHlwZXNbMF07CiAgICAgIGluZmVycmVkVmFsdWVUeXBlID0gaW5mZXJyZWRUeXBlc1sxXTsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZUFyZ3MnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZUFyZ3MoCiAgICAgICAgICAgICAgW2luZmVycmVkS2V5VHlwZSwgaW5mZXJyZWRWYWx1ZVR5cGVdKSk7CiAgICAgIG5vZGUua2V5VHlwZSA9IGluZmVycmVkS2V5VHlwZTsKICAgICAgbm9kZS52YWx1ZVR5cGUgPSBpbmZlcnJlZFZhbHVlVHlwZTsKICAgIH0KICAgIGlmICh0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBub2RlLmVudHJpZXMubGVuZ3RoOyArK2luZGV4KSB7CiAgICAgICAgTWFwRW50cnkgZW50cnkgPSBjaGVja01hcEVudHJ5KG5vZGUuZW50cmllc1tpbmRleF0sIG5vZGUua2V5VHlwZSwKICAgICAgICAgICAgbm9kZS52YWx1ZVR5cGUsIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICAgIG5vZGUuZW50cmllc1tpbmRleF0gPSBlbnRyeS4ucGFyZW50ID0gbm9kZTsKICAgICAgfQogICAgfQogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gbmV3IEludGVyZmFjZVR5cGUobWFwQ2xhc3MsCiAgICAgICAgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSwgW2luZmVycmVkS2V5VHlwZSwgaW5mZXJyZWRWYWx1ZVR5cGVdKTsKICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgLy8gRWl0aGVyIGJvdGggW19kZWNsYXJlZEtleVR5cGVdIGFuZCBbX2RlY2xhcmVkVmFsdWVUeXBlXSBhcmUgb21pdHRlZCBvcgogICAgICAvLyBub25lIG9mIHRoZW0sIHNvIHdlIG1heSBqdXN0IGNoZWNrIG9uZS4KICAgICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICAgIGxpYnJhcnkuY2hlY2tCb3VuZHNJbk1hcExpdGVyYWwoCiAgICAgICAgICAgIG5vZGUsIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwgaW5mZXJyZXIuaGVscGVyLnVyaSwKICAgICAgICAgICAgaW5mZXJyZWQ6IHRydWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKAogICAgICBNZXRob2RJbnZvY2F0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBhc3NlcnQobm9kZS5uYW1lICE9IHVuYXJ5TWludXNOYW1lKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVzdWx0ID0KICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obm9kZS5yZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyOwogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzOwogICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgbnVsbEF3YXJlR3VhcmRzID0gcmVzdWx0Lm51bGxBd2FyZUd1YXJkczsKICAgICAgcmVjZWl2ZXIgPSByZXN1bHQubnVsbEF3YXJlQWN0aW9uOwogICAgICByZWNlaXZlclR5cGUgPSByZXN1bHQubnVsbEF3YXJlQWN0aW9uVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHJlY2VpdmVyID0gcmVzdWx0LmV4cHJlc3Npb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICB9CiAgICByZXR1cm4gaW5mZXJyZXIuaW5mZXJNZXRob2RJbnZvY2F0aW9uKG5vZGUuZmlsZU9mZnNldCwgbnVsbEF3YXJlR3VhcmRzLAogICAgICAgIHJlY2VpdmVyLCByZWNlaXZlclR5cGUsIG5vZGUubmFtZSwgbm9kZS5hcmd1bWVudHMsIHR5cGVDb250ZXh0LAogICAgICAgIGlzRXhwcmVzc2lvbkludm9jYXRpb246IGZhbHNlKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRFeHByZXNzaW9uSW52b2NhdGlvbigKICAgICAgRXhwcmVzc2lvbkludm9jYXRpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVzdWx0ID0KICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGU7CiAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZHM7CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBudWxsQXdhcmVHdWFyZHMgPSByZXN1bHQubnVsbEF3YXJlR3VhcmRzOwogICAgICByZWNlaXZlciA9IHJlc3VsdC5udWxsQXdhcmVBY3Rpb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlc3VsdC5udWxsQXdhcmVBY3Rpb25UeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXIgPSByZXN1bHQuZXhwcmVzc2lvbjsKICAgICAgcmVjZWl2ZXJUeXBlID0gcmVzdWx0LmluZmVycmVkVHlwZTsKICAgIH0KICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW52b2NhdGlvblJlc3VsdCA9IGluZmVycmVyLmluZmVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgbnVsbEF3YXJlR3VhcmRzLAogICAgICAgIHJlY2VpdmVyLAogICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICBjYWxsTmFtZSwKICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICBpc0V4cHJlc3Npb25JbnZvY2F0aW9uOiB0cnVlKTsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmIGluZmVycmVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgaXMhIER5bmFtaWNUeXBlICYmCiAgICAgICAgICByZWNlaXZlclR5cGUgaXMhIEludmFsaWRUeXBlICYmCiAgICAgICAgICByZWNlaXZlclR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAgICAgaWYgKGluZmVycmVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICAgICAgaW52b2NhdGlvblJlc3VsdC5pbmZlcnJlZFR5cGUsCiAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCiAgICAgICAgICAgICAgICAgIGludm9jYXRpb25SZXN1bHQuZXhwcmVzc2lvbi4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZUV4cHJlc3Npb25DYWxsRXJyb3Iud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwgaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZmVycmVyLmhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVFeHByZXNzaW9uQ2FsbFdhcm5pbmcud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGludm9jYXRpb25SZXN1bHQ7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCgKICAgICAgTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbml0aWFsaXplclJlc3VsdCA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIsIHR5cGVDb250ZXh0LCB0cnVlKTsKICAgIG5vZGUudmFyaWFibGUuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplclJlc3VsdC5leHByZXNzaW9uCiAgICAgIC4ucGFyZW50ID0gbm9kZS52YXJpYWJsZTsKICAgIG5vZGUudmFyaWFibGUudHlwZSA9IGluaXRpYWxpemVyUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbml0aWFsaXplclJlc3VsdC5pbmZlcnJlZFR5cGUsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdE5vdChOb3Qgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEludGVyZmFjZVR5cGUgYm9vbFR5cGUgPQogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5ib29sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgb3BlcmFuZFJlc3VsdCA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUub3BlcmFuZCwgYm9vbFR5cGUsICFpbmZlcnJlci5pc1RvcExldmVsKTsKICAgIEV4cHJlc3Npb24gb3BlcmFuZCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoCiAgICAgICAgYm9vbFR5cGUsIG9wZXJhbmRSZXN1bHQsCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0KTsKICAgIG5vZGUub3BlcmFuZCA9IG9wZXJhbmQuLnBhcmVudCA9IG5vZGU7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMubG9naWNhbE5vdF9lbmQobm9kZSwgbm9kZS5vcGVyYW5kKTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChib29sVHlwZSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TnVsbENoZWNrKAogICAgICBOdWxsQ2hlY2sgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgb3BlcmFuZFJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLm9wZXJhbmQsIGluZmVycmVyLmNvbXB1dGVOdWxsYWJsZSh0eXBlQ29udGV4dCksIHRydWUpOwogICAgbm9kZS5vcGVyYW5kID0gb3BlcmFuZFJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgICBvcGVyYW5kUmVzdWx0LmluZmVycmVkVHlwZSwgIiEiLCBub2RlLm9wZXJhbmQuZmlsZU9mZnNldCk7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMubm9uTnVsbEFzc2VydF9lbmQobm9kZS5vcGVyYW5kKTsKICAgIERhcnRUeXBlIG5vbk51bGxhYmxlUmVzdWx0VHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29tcHV0ZU5vbk51bGxhYmxlKG9wZXJhbmRSZXN1bHQuaW5mZXJyZWRUeXBlKTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChub25OdWxsYWJsZVJlc3VsdFR5cGUsIG5vZGUpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24oCiAgICAgIE51bGxBd2FyZU1ldGhvZEludm9jYXRpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcyA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJTeW50aGV0aWNWYXJpYWJsZU51bGxBd2FyZShub2RlLnZhcmlhYmxlKTsKICAgIHJlcG9ydE5vbk51bGxhYmxlSW5OdWxsQXdhcmVXYXJuaW5nSWZOZWVkZWQoCiAgICAgICAgbm9kZS52YXJpYWJsZS50eXBlLCAiPy4iLCBub2RlLnZhcmlhYmxlLmZpbGVPZmZzZXQpOwogICAgTnVsbEF3YXJlR3VhcmQgbnVsbEF3YXJlR3VhcmQgPQogICAgICAgIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUd1YXJkKG5vZGUudmFyaWFibGUpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbnZvY2F0aW9uUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUuaW52b2NhdGlvbiwgdHlwZUNvbnRleHQsIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbnZvY2F0aW9uUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICBpbnZvY2F0aW9uUmVzdWx0LmV4cHJlc3Npb24sCiAgICAgICAgbnVsbEF3YXJlR3VhcmRzLnByZXBlbmQobnVsbEF3YXJlR3VhcmQpKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXROdWxsQXdhcmVQcm9wZXJ0eUdldCgKICAgICAgTnVsbEF3YXJlUHJvcGVydHlHZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcyA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJTeW50aGV0aWNWYXJpYWJsZU51bGxBd2FyZShub2RlLnZhcmlhYmxlKTsKICAgIHJlcG9ydE5vbk51bGxhYmxlSW5OdWxsQXdhcmVXYXJuaW5nSWZOZWVkZWQoCiAgICAgICAgbm9kZS52YXJpYWJsZS50eXBlLCAiPy4iLCBub2RlLnZhcmlhYmxlLmZpbGVPZmZzZXQpOwogICAgTnVsbEF3YXJlR3VhcmQgbnVsbEF3YXJlR3VhcmQgPQogICAgICAgIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUd1YXJkKG5vZGUudmFyaWFibGUpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWFkUmVzdWx0ID0KICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obm9kZS5yZWFkLCB0eXBlQ29udGV4dCwgdHJ1ZSk7CiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICByZWFkUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICByZWFkUmVzdWx0LmV4cHJlc3Npb24sCiAgICAgICAgbnVsbEF3YXJlR3VhcmRzLnByZXBlbmQobnVsbEF3YXJlR3VhcmQpKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXROdWxsQXdhcmVQcm9wZXJ0eVNldCgKICAgICAgTnVsbEF3YXJlUHJvcGVydHlTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcyA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJTeW50aGV0aWNWYXJpYWJsZU51bGxBd2FyZShub2RlLnZhcmlhYmxlKTsKICAgIHJlcG9ydE5vbk51bGxhYmxlSW5OdWxsQXdhcmVXYXJuaW5nSWZOZWVkZWQoCiAgICAgICAgbm9kZS52YXJpYWJsZS50eXBlLCAiPy4iLCBub2RlLnZhcmlhYmxlLmZpbGVPZmZzZXQpOwogICAgTnVsbEF3YXJlR3VhcmQgbnVsbEF3YXJlR3VhcmQgPQogICAgICAgIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUd1YXJkKG5vZGUudmFyaWFibGUpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB3cml0ZVJlc3VsdCA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUud3JpdGUsIHR5cGVDb250ZXh0LCB0cnVlKTsKICAgIHJldHVybiBpbmZlcnJlci5jcmVhdGVOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHdyaXRlUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICB3cml0ZVJlc3VsdC5leHByZXNzaW9uLAogICAgICAgIG51bGxBd2FyZUd1YXJkcy5wcmVwZW5kKG51bGxBd2FyZUd1YXJkKSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TnVsbEF3YXJlRXh0ZW5zaW9uKAogICAgICBOdWxsQXdhcmVFeHRlbnNpb24gbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyU3ludGhldGljVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICByZXBvcnROb25OdWxsYWJsZUluTnVsbEF3YXJlV2FybmluZ0lmTmVlZGVkKAogICAgICAgIG5vZGUudmFyaWFibGUudHlwZSwgIj8uIiwgbm9kZS52YXJpYWJsZS5maWxlT2Zmc2V0KTsKICAgIE51bGxBd2FyZUd1YXJkIG51bGxBd2FyZUd1YXJkID0KICAgICAgICBpbmZlcnJlci5jcmVhdGVOdWxsQXdhcmVHdWFyZChub2RlLnZhcmlhYmxlKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgZXhwcmVzc2lvblJlc3VsdCA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSk7CiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBleHByZXNzaW9uUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICBleHByZXNzaW9uUmVzdWx0LmV4cHJlc3Npb24sCiAgICAgICAgY29uc3QgTGluazxOdWxsQXdhcmVHdWFyZD4oKS5wcmVwZW5kKG51bGxBd2FyZUd1YXJkKSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0U3RhdGljUG9zdEluY0RlYygKICAgICAgU3RhdGljUG9zdEluY0RlYyBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaW5mZXJyZXIuaW5mZXJTeW50aGV0aWNWYXJpYWJsZShub2RlLnJlYWQpOwogICAgaW5mZXJyZXIuaW5mZXJTeW50aGV0aWNWYXJpYWJsZShub2RlLndyaXRlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IG5vZGUucmVhZC50eXBlOwoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQgPQogICAgICAgIG5ldyBMZXQobm9kZS5yZWFkLCBjcmVhdGVMZXQobm9kZS53cml0ZSwgY3JlYXRlVmFyaWFibGVHZXQobm9kZS5yZWFkKSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0U3VwZXJQb3N0SW5jRGVjKAogICAgICBTdXBlclBvc3RJbmNEZWMgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmluZmVyU3ludGhldGljVmFyaWFibGUobm9kZS5yZWFkKTsKICAgIGluZmVycmVyLmluZmVyU3ludGhldGljVmFyaWFibGUobm9kZS53cml0ZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBub2RlLnJlYWQudHlwZTsKCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0KICAgICAgICBuZXcgTGV0KG5vZGUucmVhZCwgY3JlYXRlTGV0KG5vZGUud3JpdGUsIGNyZWF0ZVZhcmlhYmxlR2V0KG5vZGUucmVhZCkpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgcmVwbGFjZW1lbnQpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdExvY2FsUG9zdEluY0RlYygKICAgICAgTG9jYWxQb3N0SW5jRGVjIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpbmZlcnJlci5pbmZlclN5bnRoZXRpY1ZhcmlhYmxlKG5vZGUucmVhZCk7CiAgICBpbmZlcnJlci5pbmZlclN5bnRoZXRpY1ZhcmlhYmxlKG5vZGUud3JpdGUpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gbm9kZS5yZWFkLnR5cGU7CiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0KICAgICAgICBuZXcgTGV0KG5vZGUucmVhZCwgY3JlYXRlTGV0KG5vZGUud3JpdGUsIGNyZWF0ZVZhcmlhYmxlR2V0KG5vZGUucmVhZCkpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgcmVwbGFjZW1lbnQpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFByb3BlcnR5UG9zdEluY0RlYygKICAgICAgUHJvcGVydHlQb3N0SW5jRGVjIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAobm9kZS52YXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIGluZmVycmVyLmluZmVyU3ludGhldGljVmFyaWFibGUobm9kZS52YXJpYWJsZSk7CiAgICB9CiAgICBpbmZlcnJlci5pbmZlclN5bnRoZXRpY1ZhcmlhYmxlKG5vZGUucmVhZCk7CiAgICBpbmZlcnJlci5pbmZlclN5bnRoZXRpY1ZhcmlhYmxlKG5vZGUud3JpdGUpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gbm9kZS5yZWFkLnR5cGU7CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChub2RlLnZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTGV0KAogICAgICAgICAgbm9kZS52YXJpYWJsZSwKICAgICAgICAgIGNyZWF0ZUxldCgKICAgICAgICAgICAgICBub2RlLnJlYWQsIGNyZWF0ZUxldChub2RlLndyaXRlLCBjcmVhdGVWYXJpYWJsZUdldChub2RlLnJlYWQpKSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTGV0KAogICAgICAgICAgbm9kZS5yZWFkLCBjcmVhdGVMZXQobm9kZS53cml0ZSwgY3JlYXRlVmFyaWFibGVHZXQobm9kZS5yZWFkKSkpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgcmVwbGFjZW1lbnQpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdENvbXBvdW5kUHJvcGVydHlTZXQoCiAgICAgIENvbXBvdW5kUHJvcGVydHlTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVjZWl2ZXJSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5yZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CgogICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzOwogICAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIG51bGxBd2FyZUd1YXJkcyA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUd1YXJkczsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUFjdGlvblR5cGU7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0LmV4cHJlc3Npb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIH0KCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHJlYWRSZWNlaXZlcjsKICAgIEV4cHJlc3Npb24gd3JpdGVSZWNlaXZlcjsKICAgIGlmIChub2RlLnJlYWRPbmx5UmVjZWl2ZXIgJiYgaWRlbnRpY2FsKHJlY2VpdmVyLCBub2RlLnJlY2VpdmVyKSkgewogICAgICByZWFkUmVjZWl2ZXIgPSByZWNlaXZlcjsKICAgICAgd3JpdGVSZWNlaXZlciA9IF9jbG9uZShyZWNlaXZlcik7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlclZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSk7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpRm9ySW5zdHJ1bWVudGF0aW9uLAogICAgICAgICAgcmVjZWl2ZXJWYXJpYWJsZS5maWxlT2Zmc2V0LAogICAgICAgICAgJ3R5cGUnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShyZWNlaXZlclR5cGUpKTsKICAgICAgcmVhZFJlY2VpdmVyID0gY3JlYXRlVmFyaWFibGVHZXQocmVjZWl2ZXJWYXJpYWJsZSk7CiAgICAgIHdyaXRlUmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIH0KCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlYWRSZXN1bHQgPSBfY29tcHV0ZVByb3BlcnR5R2V0KG5vZGUucmVhZE9mZnNldCwKICAgICAgICByZWFkUmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSwgbm9kZS5wcm9wZXJ0eU5hbWUsIGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgaXNUaGlzUmVjZWl2ZXI6IG5vZGUucmVjZWl2ZXIgaXMgVGhpc0V4cHJlc3Npb24pOwoKICAgIEV4cHJlc3Npb24gcmVhZCA9IHJlYWRSZXN1bHQuZXhwcmVzc2lvbjsKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gcmVhZFJlc3VsdC5pbmZlcnJlZFR5cGU7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBiaW5hcnlSZXN1bHQgPSBfY29tcHV0ZUJpbmFyeUV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5iaW5hcnlPZmZzZXQsIHJlYWQsIHJlYWRUeXBlLCBub2RlLmJpbmFyeU5hbWUsIG5vZGUucmhzKTsKICAgIERhcnRUeXBlIGJpbmFyeVR5cGUgPSBiaW5hcnlSZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCB3cml0ZVRhcmdldCA9IGluZmVycmVyLmZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgcmVjZWl2ZXJUeXBlLCBub2RlLnByb3BlcnR5TmFtZSwgbm9kZS53cml0ZU9mZnNldCwKICAgICAgICBzZXR0ZXI6IHRydWUsIGluc3RydW1lbnRlZDogdHJ1ZSwgaW5jbHVkZUV4dGVuc2lvbk1ldGhvZHM6IHRydWUpOwogICAgRGFydFR5cGUgd3JpdGVUeXBlID0gaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEV4cHJlc3Npb24gYmluYXJ5ID0KICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KHdyaXRlVHlwZSwgYmluYXJ5UmVzdWx0KTsKCiAgICBFeHByZXNzaW9uIHdyaXRlID0gX2NvbXB1dGVQcm9wZXJ0eVNldChub2RlLndyaXRlT2Zmc2V0LCB3cml0ZVJlY2VpdmVyLAogICAgICAgIHJlY2VpdmVyVHlwZSwgbm9kZS5wcm9wZXJ0eU5hbWUsIHdyaXRlVGFyZ2V0LCBiaW5hcnksCiAgICAgICAgdmFsdWVUeXBlOiBiaW5hcnlUeXBlLCBmb3JFZmZlY3Q6IG5vZGUuZm9yRWZmZWN0KTsKCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gd3JpdGU7CiAgICBpZiAocmVjZWl2ZXJWYXJpYWJsZSAhPSBudWxsKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gY3JlYXRlTGV0KHJlY2VpdmVyVmFyaWFibGUsIHJlcGxhY2VtZW50KTsKICAgIH0KICAgIHJlcGxhY2VtZW50LmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBiaW5hcnlUeXBlLCByZXBsYWNlbWVudCwgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRJZk51bGxQcm9wZXJ0eVNldCgKICAgICAgSWZOdWxsUHJvcGVydHlTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkcyA9CiAgICAgICAgaW5mZXJyZXIuaW5mZXJTeW50aGV0aWNWYXJpYWJsZU51bGxBd2FyZShub2RlLnZhcmlhYmxlKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVhZFJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJlYWQsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICByZXBvcnROb25OdWxsYWJsZUluTnVsbEF3YXJlV2FybmluZ0lmTmVlZGVkKAogICAgICAgIHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlLCAiPz89Iiwgbm9kZS5yZWFkLmZpbGVPZmZzZXQpOwogICAgRXhwcmVzc2lvbiByZWFkID0gcmVhZFJlc3VsdC5leHByZXNzaW9uOwogICAgRGFydFR5cGUgcmVhZFR5cGUgPSByZWFkUmVzdWx0LmluZmVycmVkVHlwZTsKCiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZOdWxsRXhwcmVzc2lvbl9yaWdodEJlZ2luKHJlYWQpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB3cml0ZVJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLndyaXRlLCB0eXBlQ29udGV4dCwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZOdWxsRXhwcmVzc2lvbl9lbmQoKTsKCiAgICBNZW1iZXIgZXF1YWxzTWVtYmVyID0gaW5mZXJyZXIKICAgICAgICAuZmluZEludGVyZmFjZU1lbWJlcihyZWFkVHlwZSwgZXF1YWxzTmFtZSwgbm9kZS5maWxlT2Zmc2V0KQogICAgICAgIC5tZW1iZXI7CgogICAgRGFydFR5cGUgbm9uTnVsbGFibGVSZWFkVHlwZSA9IGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZShyZWFkVHlwZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKG5vbk51bGxhYmxlUmVhZFR5cGUsIHdyaXRlUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50OwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIC8vIEVuY29kZSBgby5hID8/PSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCB2MSA9IG8gaW4gdjEuYSA9PSBudWxsID8gdjEuYSA9IGIgOiBudWxsCiAgICAgIC8vCiAgICAgIE1ldGhvZEludm9jYXRpb24gZXF1YWxzTnVsbCA9CiAgICAgICAgICBjcmVhdGVFcXVhbHNOdWxsKG5vZGUuZmlsZU9mZnNldCwgcmVhZCwgZXF1YWxzTWVtYmVyKTsKICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgIGVxdWFsc051bGwsCiAgICAgICAgICB3cml0ZVJlc3VsdC5leHByZXNzaW9uLAogICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlZFR5cGUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICByZXBsYWNlbWVudCA9CiAgICAgICAgICBuZXcgTGV0KG5vZGUudmFyaWFibGUsIGNvbmRpdGlvbmFsLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEVuY29kZSBgby5hID8/PSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCB2MSA9IG8gaW4gbGV0IHYyID0gdjEuYSBpbiB2MiA9PSBudWxsID8gdjEuYSA9IGIgOiB2MgogICAgICAvLwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlYWRWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKHJlYWQsIHJlYWRUeXBlKTsKICAgICAgTWV0aG9kSW52b2NhdGlvbiBlcXVhbHNOdWxsID0gY3JlYXRlRXF1YWxzTnVsbCgKICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwgY3JlYXRlVmFyaWFibGVHZXQocmVhZFZhcmlhYmxlKSwgZXF1YWxzTWVtYmVyKTsKICAgICAgVmFyaWFibGVHZXQgdmFyaWFibGVHZXQgPSBjcmVhdGVWYXJpYWJsZUdldChyZWFkVmFyaWFibGUpOwogICAgICBpZiAoaW5mZXJyZXIubGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmCiAgICAgICAgICAhaWRlbnRpY2FsKG5vbk51bGxhYmxlUmVhZFR5cGUsIHJlYWRUeXBlKSkgewogICAgICAgIHZhcmlhYmxlR2V0LnByb21vdGVkVHlwZSA9IG5vbk51bGxhYmxlUmVhZFR5cGU7CiAgICAgIH0KICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgIGVxdWFsc051bGwsIHdyaXRlUmVzdWx0LmV4cHJlc3Npb24sIHZhcmlhYmxlR2V0LCBpbmZlcnJlZFR5cGUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICByZXBsYWNlbWVudCA9IG5ldyBMZXQobm9kZS52YXJpYWJsZSwgY3JlYXRlTGV0KHJlYWRWYXJpYWJsZSwgY29uZGl0aW9uYWwpKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KCiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50LCBudWxsQXdhcmVHdWFyZHMpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdElmTnVsbFNldCgKICAgICAgSWZOdWxsU2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlYWRSZXN1bHQgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLnJlYWQsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgICByZWFkUmVzdWx0LmluZmVycmVkVHlwZSwgIj8/PSIsIG5vZGUucmVhZC5maWxlT2Zmc2V0KTsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkczsKICAgIEV4cHJlc3Npb24gcmVhZDsKICAgIERhcnRUeXBlIHJlYWRUeXBlOwogICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgbnVsbEF3YXJlR3VhcmRzID0gcmVhZFJlc3VsdC5udWxsQXdhcmVHdWFyZHM7CiAgICAgIHJlYWQgPSByZWFkUmVzdWx0Lm51bGxBd2FyZUFjdGlvbjsKICAgICAgcmVhZFR5cGUgPSByZWFkUmVzdWx0Lm51bGxBd2FyZUFjdGlvblR5cGU7CiAgICB9IGVsc2UgewogICAgICByZWFkID0gcmVhZFJlc3VsdC5leHByZXNzaW9uOwogICAgICByZWFkVHlwZSA9IHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgfQogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbihyZWFkKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgd3JpdGVSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS53cml0ZSwgdHlwZUNvbnRleHQsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmTnVsbEV4cHJlc3Npb25fZW5kKCk7CgogICAgTWVtYmVyIGVxdWFsc01lbWJlciA9IGluZmVycmVyCiAgICAgICAgLmZpbmRJbnRlcmZhY2VNZW1iZXIocmVhZFR5cGUsIGVxdWFsc05hbWUsIG5vZGUuZmlsZU9mZnNldCkKICAgICAgICAubWVtYmVyOwoKICAgIERhcnRUeXBlIG9yaWdpbmFsUmVhZFR5cGUgPSByZWFkVHlwZTsKICAgIERhcnRUeXBlIG5vbk51bGxhYmxlUmVhZFR5cGUgPQogICAgICAgIGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZShvcmlnaW5hbFJlYWRUeXBlKTsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgIC5nZXRTdGFuZGFyZFVwcGVyQm91bmQobm9uTnVsbGFibGVSZWFkVHlwZSwgd3JpdGVSZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgICAgICBpbmZlcnJlci5saWJyYXJ5LmxpYnJhcnkpOwoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQ7CiAgICBpZiAobm9kZS5mb3JFZmZlY3QpIHsKICAgICAgLy8gRW5jb2RlIGBhID8/PSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGEgPT0gbnVsbCA/IGEgPSBiIDogbnVsbAogICAgICAvLwogICAgICBNZXRob2RJbnZvY2F0aW9uIGVxdWFsc051bGwgPQogICAgICAgICAgY3JlYXRlRXF1YWxzTnVsbChub2RlLmZpbGVPZmZzZXQsIHJlYWQsIGVxdWFsc01lbWJlcik7CiAgICAgIHJlcGxhY2VtZW50ID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgIGVxdWFsc051bGwsCiAgICAgICAgICB3cml0ZVJlc3VsdC5leHByZXNzaW9uLAogICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICBpbmZlcnJlZFR5cGUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb2RlIGBhID8/PSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgICBsZXQgdjEgPSBhIGluIHYxID09IG51bGwgPyBhID0gYiA6IHYxCiAgICAgIC8vCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVhZCwgcmVhZFR5cGUpOwogICAgICBNZXRob2RJbnZvY2F0aW9uIGVxdWFsc051bGwgPSBjcmVhdGVFcXVhbHNOdWxsKAogICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCBjcmVhdGVWYXJpYWJsZUdldChyZWFkVmFyaWFibGUpLCBlcXVhbHNNZW1iZXIpOwogICAgICBWYXJpYWJsZUdldCB2YXJpYWJsZUdldCA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlYWRWYXJpYWJsZSk7CiAgICAgIGlmIChpbmZlcnJlci5saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICAgICFpZGVudGljYWwobm9uTnVsbGFibGVSZWFkVHlwZSwgb3JpZ2luYWxSZWFkVHlwZSkpIHsKICAgICAgICB2YXJpYWJsZUdldC5wcm9tb3RlZFR5cGUgPSBub25OdWxsYWJsZVJlYWRUeXBlOwogICAgICB9CiAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICBlcXVhbHNOdWxsLCB3cml0ZVJlc3VsdC5leHByZXNzaW9uLCB2YXJpYWJsZUdldCwgaW5mZXJyZWRUeXBlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTGV0KHJlYWRWYXJpYWJsZSwgY29uZGl0aW9uYWwpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCwgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRJbmRleEdldChJbmRleEdldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWNlaXZlclJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkczsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIG51bGxBd2FyZUd1YXJkcyA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUd1YXJkczsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUFjdGlvblR5cGU7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0LmV4cHJlc3Npb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIH0KCiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgaW5kZXhHZXRUYXJnZXQgPSBpbmZlcnJlci5maW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgIHJlY2VpdmVyVHlwZSwgaW5kZXhHZXROYW1lLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5jbHVkZUV4dGVuc2lvbk1ldGhvZHM6IHRydWUpOwoKICAgIERhcnRUeXBlIGluZGV4VHlwZSA9IGluZmVycmVyLmdldEluZGV4S2V5VHlwZShpbmRleEdldFRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKCiAgICBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCByZWFkQ2hlY2tLaW5kID0KICAgICAgICBpbmZlcnJlci5wcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZShyZWNlaXZlclR5cGUsIGluZGV4R2V0VGFyZ2V0LAogICAgICAgICAgICBpc1RoaXNSZWNlaXZlcjogbm9kZS5yZWNlaXZlciBpcyBUaGlzRXhwcmVzc2lvbik7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmRleFJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLmluZGV4LCBpbmRleFR5cGUsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwoKICAgIEV4cHJlc3Npb24gaW5kZXggPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KGluZGV4VHlwZSwgaW5kZXhSZXN1bHQpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVwbGFjZW1lbnQgPSBfY29tcHV0ZUluZGV4R2V0KG5vZGUuZmlsZU9mZnNldCwKICAgICAgICByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCBpbmRleEdldFRhcmdldCwgaW5kZXgsIHJlYWRDaGVja0tpbmQpOwogICAgcmV0dXJuIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgcmVwbGFjZW1lbnQuaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudC5leHByZXNzaW9uLCBudWxsQXdhcmVHdWFyZHMpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdEluZGV4U2V0KEluZGV4U2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlY2VpdmVyUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUucmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHJlY2VpdmVyOwogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlOwogICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzOwogICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgbnVsbEF3YXJlR3VhcmRzID0gcmVjZWl2ZXJSZXN1bHQubnVsbEF3YXJlR3VhcmRzOwogICAgICByZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUFjdGlvbjsKICAgICAgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJSZXN1bHQubnVsbEF3YXJlQWN0aW9uVHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXJSZXN1bHQuZXhwcmVzc2lvbjsKICAgICAgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgfQogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWNlaXZlclZhcmlhYmxlOwogICAgaWYgKCFub2RlLmZvckVmZmVjdCAmJiAhbm9kZS5yZWFkT25seVJlY2VpdmVyKSB7CiAgICAgIHJlY2VpdmVyVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZShyZWNlaXZlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgcmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIH0KCiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgaW5kZXhTZXRUYXJnZXQgPSBpbmZlcnJlci5maW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgIHJlY2VpdmVyVHlwZSwgaW5kZXhTZXROYW1lLCBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgaW5jbHVkZUV4dGVuc2lvbk1ldGhvZHM6IHRydWUpOwoKICAgIERhcnRUeXBlIGluZGV4VHlwZSA9IGluZmVycmVyLmdldEluZGV4S2V5VHlwZShpbmRleFNldFRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIERhcnRUeXBlIHZhbHVlVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0SW5kZXhTZXRWYWx1ZVR5cGUoaW5kZXhTZXRUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmRleFJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLmluZGV4LCBpbmRleFR5cGUsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwoKICAgIEV4cHJlc3Npb24gaW5kZXggPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KGluZGV4VHlwZSwgaW5kZXhSZXN1bHQpOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gaW5kZXhWYXJpYWJsZTsKICAgIGlmICghbm9kZS5mb3JFZmZlY3QpIHsKICAgICAgaW5kZXhWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKGluZGV4LCBpbmRleFJlc3VsdC5pbmZlcnJlZFR5cGUpOwogICAgICBpbmRleCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogICAgfQoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmFsdWVSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS52YWx1ZSwgdmFsdWVUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KHZhbHVlVHlwZSwgdmFsdWVSZXN1bHQpOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFsdWVWYXJpYWJsZTsKICAgIGlmICghbm9kZS5mb3JFZmZlY3QpIHsKICAgICAgdmFsdWVWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKHZhbHVlLCB2YWx1ZVJlc3VsdC5pbmZlcnJlZFR5cGUpOwogICAgICB2YWx1ZSA9IGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpOwogICAgfQoKICAgIC8vIFRoZSBpbmZlcnJlZCB0eXBlIGlzIHRoYXQgaW5mZXJyZWQgdHlwZSBvZiB0aGUgdmFsdWUgZXhwcmVzc2lvbiBhbmQgbm90CiAgICAvLyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLgogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gdmFsdWVSZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgIEV4cHJlc3Npb24gYXNzaWdubWVudCA9IF9jb21wdXRlSW5kZXhTZXQoCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCBpbmRleFNldFRhcmdldCwgaW5kZXgsIHZhbHVlKTsKCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50OwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIHJlcGxhY2VtZW50ID0gYXNzaWdubWVudDsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpbmRleFZhcmlhYmxlICE9IG51bGwpOwogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSAhPSBudWxsKTsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBhc3NpZ25tZW50VmFyaWFibGUgPQogICAgICAgICAgY3JlYXRlVmFyaWFibGUoYXNzaWdubWVudCwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICAgIHJlcGxhY2VtZW50ID0gY3JlYXRlTGV0KAogICAgICAgICAgaW5kZXhWYXJpYWJsZSwKICAgICAgICAgIGNyZWF0ZUxldCh2YWx1ZVZhcmlhYmxlLAogICAgICAgICAgICAgIGNyZWF0ZUxldChhc3NpZ25tZW50VmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSkpOwogICAgICBpZiAocmVjZWl2ZXJWYXJpYWJsZSAhPSBudWxsKSB7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBjcmVhdGVMZXQocmVjZWl2ZXJWYXJpYWJsZSwgcmVwbGFjZW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXBsYWNlbWVudC5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgcmV0dXJuIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCwgbnVsbEF3YXJlR3VhcmRzKTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRTdXBlckluZGV4U2V0KAogICAgICBTdXBlckluZGV4U2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgaW5kZXhTZXRUYXJnZXQgPSBub2RlLnNldHRlciAhPSBudWxsCiAgICAgICAgPyBuZXcgT2JqZWN0QWNjZXNzVGFyZ2V0LmludGVyZmFjZU1lbWJlcihub2RlLnNldHRlcikKICAgICAgICA6IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC5taXNzaW5nKCk7CgogICAgRGFydFR5cGUgaW5kZXhUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleEtleVR5cGUoaW5kZXhTZXRUYXJnZXQsIGluZmVycmVyLnRoaXNUeXBlKTsKICAgIERhcnRUeXBlIHZhbHVlVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0SW5kZXhTZXRWYWx1ZVR5cGUoaW5kZXhTZXRUYXJnZXQsIGluZmVycmVyLnRoaXNUeXBlKTsKCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluZGV4UmVzdWx0ID0gaW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKG5vZGUuaW5kZXgsIGluZGV4VHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CgogICAgRXhwcmVzc2lvbiBpbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoaW5kZXhUeXBlLCBpbmRleFJlc3VsdCk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBpbmRleFZhcmlhYmxlID0KICAgICAgICBjcmVhdGVWYXJpYWJsZShpbmRleCwgaW5kZXhSZXN1bHQuaW5mZXJyZWRUeXBlKTsKCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZhbHVlUmVzdWx0ID0gaW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKG5vZGUudmFsdWUsIHZhbHVlVHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdCh2YWx1ZVR5cGUsIHZhbHVlUmVzdWx0KTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFsdWVWYXJpYWJsZSA9CiAgICAgICAgY3JlYXRlVmFyaWFibGUodmFsdWUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSk7CgogICAgLy8gVGhlIGluZmVycmVkIHR5cGUgaXMgdGhhdCBpbmZlcnJlZCB0eXBlIG9mIHRoZSB2YWx1ZSBleHByZXNzaW9uIGFuZCBub3QKICAgIC8vIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIuCiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSB2YWx1ZVJlc3VsdC5pbmZlcnJlZFR5cGU7CgogICAgRXhwcmVzc2lvbiBhc3NpZ25tZW50OwogICAgaWYgKGluZGV4U2V0VGFyZ2V0LmlzTWlzc2luZykgewogICAgICBhc3NpZ25tZW50ID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ1N1cGVySW5kZXhTZXQobm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgY3JlYXRlVmFyaWFibGVHZXQoaW5kZXhWYXJpYWJsZSksIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpbmRleFNldFRhcmdldC5pc0luc3RhbmNlTWVtYmVyKTsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLnNldHRlcikpOwogICAgICBhc3NpZ25tZW50ID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICAgICAgICBjcmVhdGVWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKSwKICAgICAgICAgICAgY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSkKICAgICAgICAgIF0pCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgIGluZGV4U2V0VGFyZ2V0Lm1lbWJlcikKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGFzc2lnbm1lbnRWYXJpYWJsZSA9CiAgICAgICAgY3JlYXRlVmFyaWFibGUoYXNzaWdubWVudCwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbmV3IExldCgKICAgICAgICBpbmRleFZhcmlhYmxlLAogICAgICAgIGNyZWF0ZUxldCh2YWx1ZVZhcmlhYmxlLAogICAgICAgICAgICBjcmVhdGVMZXQoYXNzaWdubWVudFZhcmlhYmxlLCBjcmVhdGVWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpKQogICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0RXh0ZW5zaW9uSW5kZXhTZXQoCiAgICAgIEV4dGVuc2lvbkluZGV4U2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlY2VpdmVyUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUucmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwoKICAgIExpc3Q8RGFydFR5cGU+IGV4dGVuc2lvblR5cGVBcmd1bWVudHMgPQogICAgICAgIGluZmVycmVyLmNvbXB1dGVFeHRlbnNpb25UeXBlQXJndW1lbnQobm9kZS5leHRlbnNpb24sCiAgICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlQXJndW1lbnRzLCByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGUpOwoKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IGluZmVycmVyLmdldEV4dGVuc2lvblJlY2VpdmVyVHlwZSgKICAgICAgICBub2RlLmV4dGVuc2lvbiwgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CgogICAgRXhwcmVzc2lvbiByZWNlaXZlciA9CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdChyZWNlaXZlclR5cGUsIHJlY2VpdmVyUmVzdWx0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGUgPQogICAgICAgIGNyZWF0ZVZhcmlhYmxlKHJlY2VpdmVyLCByZWNlaXZlclR5cGUpOwoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQgPSBuZXcgRXh0ZW5zaW9uQWNjZXNzVGFyZ2V0KAogICAgICAgIG5vZGUuc2V0dGVyLCBudWxsLCBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yLCBleHRlbnNpb25UeXBlQXJndW1lbnRzKTsKCiAgICBEYXJ0VHlwZSBpbmRleFR5cGUgPSBpbmZlcnJlci5nZXRJbmRleEtleVR5cGUodGFyZ2V0LCByZWNlaXZlclR5cGUpOwogICAgRGFydFR5cGUgdmFsdWVUeXBlID0gaW5mZXJyZXIuZ2V0SW5kZXhTZXRWYWx1ZVR5cGUodGFyZ2V0LCByZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5kZXhSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS5pbmRleCwgaW5kZXhUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKCiAgICBFeHByZXNzaW9uIGluZGV4ID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdChpbmRleFR5cGUsIGluZGV4UmVzdWx0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGUgPQogICAgICAgIGNyZWF0ZVZhcmlhYmxlKGluZGV4LCBpbmRleFJlc3VsdC5pbmZlcnJlZFR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmFsdWVSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS52YWx1ZSwgdmFsdWVUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KHZhbHVlVHlwZSwgdmFsdWVSZXN1bHQpOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YWx1ZVZhcmlhYmxlID0KICAgICAgICBjcmVhdGVWYXJpYWJsZSh2YWx1ZSwgdmFsdWVSZXN1bHQuaW5mZXJyZWRUeXBlKTsKCiAgICAvLyBUaGUgaW5mZXJyZWQgdHlwZSBpcyB0aGF0IGluZmVycmVkIHR5cGUgb2YgdGhlIHZhbHVlIGV4cHJlc3Npb24gYW5kIG5vdAogICAgLy8gdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHBhcmFtZXRlci4KICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZTsKCiAgICBFeHByZXNzaW9uIGFzc2lnbm1lbnQgPSBfY29tcHV0ZUluZGV4U2V0KAogICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKSwKICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgdGFyZ2V0LAogICAgICAgIGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpLAogICAgICAgIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGFzc2lnbm1lbnRWYXJpYWJsZSA9CiAgICAgICAgY3JlYXRlVmFyaWFibGUoYXNzaWdubWVudCwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbmV3IExldCgKICAgICAgICByZWNlaXZlclZhcmlhYmxlLAogICAgICAgIGNyZWF0ZUxldCgKICAgICAgICAgICAgaW5kZXhWYXJpYWJsZSwKICAgICAgICAgICAgY3JlYXRlTGV0KAogICAgICAgICAgICAgICAgdmFsdWVWYXJpYWJsZSwKICAgICAgICAgICAgICAgIGNyZWF0ZUxldCgKICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50VmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSkpKQogICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0SWZOdWxsSW5kZXhTZXQoCiAgICAgIElmTnVsbEluZGV4U2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlY2VpdmVyUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUucmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CgogICAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkczsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIG51bGxBd2FyZUd1YXJkcyA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUd1YXJkczsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUFjdGlvblR5cGU7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0LmV4cHJlc3Npb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIH0KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVjZWl2ZXJWYXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVhZFJlY2VpdmVyID0gcmVjZWl2ZXI7CiAgICBFeHByZXNzaW9uIHdyaXRlUmVjZWl2ZXI7CiAgICBpZiAobm9kZS5yZWFkT25seVJlY2VpdmVyICYmIGlkZW50aWNhbChyZWNlaXZlciwgbm9kZS5yZWNlaXZlcikpIHsKICAgICAgd3JpdGVSZWNlaXZlciA9IF9jbG9uZShyZWFkUmVjZWl2ZXIpOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXJWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKHJlYWRSZWNlaXZlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgcmVhZFJlY2VpdmVyID0gY3JlYXRlVmFyaWFibGVHZXQocmVjZWl2ZXJWYXJpYWJsZSk7CiAgICAgIHdyaXRlUmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIH0KCiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgcmVhZFRhcmdldCA9IGluZmVycmVyLmZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgcmVjZWl2ZXJUeXBlLCBpbmRleEdldE5hbWUsIG5vZGUucmVhZE9mZnNldCwKICAgICAgICBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSk7CgogICAgTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQgY2hlY2tLaW5kID0KICAgICAgICBpbmZlcnJlci5wcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZShyZWNlaXZlclR5cGUsIHJlYWRUYXJnZXQsCiAgICAgICAgICAgIGlzVGhpc1JlY2VpdmVyOiBub2RlLnJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKTsKCiAgICBEYXJ0VHlwZSByZWFkSW5kZXhUeXBlID0gaW5mZXJyZXIuZ2V0SW5kZXhLZXlUeXBlKHJlYWRUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICByZWNlaXZlclR5cGUsIGluZGV4U2V0TmFtZSwgbm9kZS53cml0ZU9mZnNldCwKICAgICAgICBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSk7CgogICAgRGFydFR5cGUgd3JpdGVJbmRleFR5cGUgPQogICAgICAgIGluZmVycmVyLmdldEluZGV4S2V5VHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIERhcnRUeXBlIHZhbHVlVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0SW5kZXhTZXRWYWx1ZVR5cGUod3JpdGVUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmRleFJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLmluZGV4LCByZWFkSW5kZXhUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZUZvclJlc3VsdChpbmRleFJlc3VsdCk7CgogICAgRXhwcmVzc2lvbiByZWFkSW5kZXggPSBjcmVhdGVWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICAgIHJlYWRJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgcmVhZEluZGV4VHlwZSwgaW5kZXhSZXN1bHQuaW5mZXJyZWRUeXBlLCByZWFkSW5kZXgpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVhZFJlc3VsdCA9IF9jb21wdXRlSW5kZXhHZXQobm9kZS5yZWFkT2Zmc2V0LAogICAgICAgIHJlYWRSZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCByZWFkVGFyZ2V0LCByZWFkSW5kZXgsIGNoZWNrS2luZCk7CiAgICByZXBvcnROb25OdWxsYWJsZUluTnVsbEF3YXJlV2FybmluZ0lmTmVlZGVkKAogICAgICAgIHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlLCAiPz89Iiwgbm9kZS5yZWFkT2Zmc2V0KTsKICAgIEV4cHJlc3Npb24gcmVhZCA9IHJlYWRSZXN1bHQuZXhwcmVzc2lvbjsKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gcmVhZFJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaWZOdWxsRXhwcmVzc2lvbl9yaWdodEJlZ2luKHJlYWQpOwoKICAgIE1lbWJlciBlcXVhbHNNZW1iZXIgPSBpbmZlcnJlcgogICAgICAgIC5maW5kSW50ZXJmYWNlTWVtYmVyKHJlYWRUeXBlLCBlcXVhbHNOYW1lLCBub2RlLnRlc3RPZmZzZXQpCiAgICAgICAgLm1lbWJlcjsKCiAgICBFeHByZXNzaW9uIHdyaXRlSW5kZXggPSBjcmVhdGVWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICAgIHdyaXRlSW5kZXggPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIHdyaXRlSW5kZXhUeXBlLCBpbmRleFJlc3VsdC5pbmZlcnJlZFR5cGUsIHdyaXRlSW5kZXgpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmFsdWVSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS52YWx1ZSwgdmFsdWVUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIEV4cHJlc3Npb24gdmFsdWUgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KHZhbHVlVHlwZSwgdmFsdWVSZXN1bHQpOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmTnVsbEV4cHJlc3Npb25fZW5kKCk7CgogICAgRGFydFR5cGUgbm9uTnVsbGFibGVSZWFkVHlwZSA9IGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZShyZWFkVHlwZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKG5vbk51bGxhYmxlUmVhZFR5cGUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyaWFibGU7CiAgICBpZiAobm9kZS5mb3JFZmZlY3QpIHsKICAgICAgLy8gTm8gbmVlZCBmb3IgdmFsdWUgdmFyaWFibGUuCiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUodmFsdWUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICAgIHZhbHVlID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiB3cml0ZSA9IF9jb21wdXRlSW5kZXhTZXQobm9kZS53cml0ZU9mZnNldCwgd3JpdGVSZWNlaXZlciwKICAgICAgICByZWNlaXZlclR5cGUsIHdyaXRlVGFyZ2V0LCB3cml0ZUluZGV4LCB2YWx1ZSk7CgogICAgRXhwcmVzc2lvbiBpbm5lcjsKICAgIGlmIChub2RlLmZvckVmZmVjdCkgewogICAgICAvLyBFbmNvZGUgYEV4dGVuc2lvbihvKVthXSA/Pz0gYmAsIGlmIGBub2RlLnJlYWRPbmx5UmVjZWl2ZXJgIGlzIGZhbHNlLAogICAgICAvLyBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gbyBpbgogICAgICAvLyAgICAgbGV0IGluZGV4VmFyaWFibGUgPSBhIGluCiAgICAgIC8vICAgICAgICByZWNlaXZlclZhcmlhYmxlW2luZGV4VmFyaWFibGVdICA9PSBudWxsCiAgICAgIC8vICAgICAgICAgID8gcmVjZWl2ZXJWYXJpYWJsZS5bXT0oaW5kZXhWYXJpYWJsZSwgYikgOiBudWxsCiAgICAgIC8vCiAgICAgIC8vIGFuZCBpZiBgbm9kZS5yZWFkT25seVJlY2VpdmVyYCBpcyB0cnVlIGFzOgogICAgICAvLwogICAgICAvLyAgICAgbGV0IGluZGV4VmFyaWFibGUgPSBhIGluCiAgICAgIC8vICAgICAgICAgb1tpbmRleFZhcmlhYmxlXSA9PSBudWxsID8gby5bXT0oaW5kZXhWYXJpYWJsZSwgYikgOiBudWxsCiAgICAgIC8vCiAgICAgIE1ldGhvZEludm9jYXRpb24gZXF1YWxzTnVsbCA9CiAgICAgICAgICBjcmVhdGVFcXVhbHNOdWxsKG5vZGUudGVzdE9mZnNldCwgcmVhZCwgZXF1YWxzTWVtYmVyKTsKICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihlcXVhbHNOdWxsLAogICAgICAgICAgd3JpdGUsIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gbm9kZS50ZXN0T2Zmc2V0LCBpbmZlcnJlZFR5cGUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS50ZXN0T2Zmc2V0OwogICAgICBpbm5lciA9IGNyZWF0ZUxldChpbmRleFZhcmlhYmxlLCBjb25kaXRpb25hbCk7CiAgICB9IGVsc2UgewogICAgICAvLyBFbmNvZGUgYEV4dGVuc2lvbihvKVthXSA/Pz0gYmAgYXMsIGlmIGBub2RlLnJlYWRPbmx5UmVjZWl2ZXJgIGlzIGZhbHNlLAogICAgICAvLyBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gbyBpbgogICAgICAvLyAgICAgbGV0IGluZGV4VmFyaWFibGUgPSBhIGluCiAgICAgIC8vICAgICBsZXQgcmVhZFZhcmlhYmxlID0gcmVjZWl2ZXJWYXJpYWJsZVtpbmRleFZhcmlhYmxlXSBpbgogICAgICAvLyAgICAgICByZWFkVmFyaWFibGUgPT0gbnVsbAogICAgICAvLyAgICAgICAgPyAobGV0IHZhbHVlVmFyaWFibGUgPSBiIGluCiAgICAgIC8vICAgICAgICAgICBsZXQgd3JpdGVWYXJpYWJsZSA9CiAgICAgIC8vICAgICAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUuW109KGluZGV4VmFyaWFibGUsIHZhbHVlVmFyaWFibGUpIGluCiAgICAgIC8vICAgICAgICAgICAgICAgdmFsdWVWYXJpYWJsZSkKICAgICAgLy8gICAgICAgIDogcmVhZFZhcmlhYmxlCiAgICAgIC8vCiAgICAgIC8vIGFuZCBpZiBgbm9kZS5yZWFkT25seVJlY2VpdmVyYCBpcyB0cnVlIGFzOgogICAgICAvLwogICAgICAvLyAgICAgbGV0IGluZGV4VmFyaWFibGUgPSBhIGluCiAgICAgIC8vICAgICBsZXQgcmVhZFZhcmlhYmxlID0gb1tpbmRleFZhcmlhYmxlXSBpbgogICAgICAvLyAgICAgICByZWFkVmFyaWFibGUgPT0gbnVsbAogICAgICAvLyAgICAgICAgPyAobGV0IHZhbHVlVmFyaWFibGUgPSBiIGluCiAgICAgIC8vICAgICAgICAgICBsZXQgd3JpdGVWYXJpYWJsZSA9IG8uW109KGluZGV4VmFyaWFibGUsIHZhbHVlVmFyaWFibGUpIGluCiAgICAgIC8vICAgICAgICAgICAgICAgdmFsdWVWYXJpYWJsZSkKICAgICAgLy8gICAgICAgIDogcmVhZFZhcmlhYmxlCiAgICAgIC8vCiAgICAgIC8vCiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlICE9IG51bGwpOwoKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFkVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZShyZWFkLCByZWFkVHlwZSk7CiAgICAgIE1ldGhvZEludm9jYXRpb24gZXF1YWxzTnVsbCA9IGNyZWF0ZUVxdWFsc051bGwoCiAgICAgICAgICBub2RlLnRlc3RPZmZzZXQsIGNyZWF0ZVZhcmlhYmxlR2V0KHJlYWRWYXJpYWJsZSksIGVxdWFsc01lbWJlcik7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGVWYXJpYWJsZSA9CiAgICAgICAgICBjcmVhdGVWYXJpYWJsZSh3cml0ZSwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICAgIFZhcmlhYmxlR2V0IHZhcmlhYmxlR2V0ID0gY3JlYXRlVmFyaWFibGVHZXQocmVhZFZhcmlhYmxlKTsKICAgICAgaWYgKGluZmVycmVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgIWlkZW50aWNhbChub25OdWxsYWJsZVJlYWRUeXBlLCByZWFkVHlwZSkpIHsKICAgICAgICB2YXJpYWJsZUdldC5wcm9tb3RlZFR5cGUgPSBub25OdWxsYWJsZVJlYWRUeXBlOwogICAgICB9CiAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICBlcXVhbHNOdWxsLAogICAgICAgICAgY3JlYXRlTGV0KHZhbHVlVmFyaWFibGUsCiAgICAgICAgICAgICAgY3JlYXRlTGV0KHdyaXRlVmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSksCiAgICAgICAgICB2YXJpYWJsZUdldCwKICAgICAgICAgIGluZmVycmVkVHlwZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgIGlubmVyID0gY3JlYXRlTGV0KGluZGV4VmFyaWFibGUsIGNyZWF0ZUxldChyZWFkVmFyaWFibGUsIGNvbmRpdGlvbmFsKSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChyZWNlaXZlclZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTGV0KHJlY2VpdmVyVmFyaWFibGUsIGlubmVyKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIHJlcGxhY2VtZW50ID0gaW5uZXI7CiAgICB9CiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50LCBudWxsQXdhcmVHdWFyZHMpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdElmTnVsbFN1cGVySW5kZXhTZXQoCiAgICAgIElmTnVsbFN1cGVySW5kZXhTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIE9iamVjdEFjY2Vzc1RhcmdldCByZWFkVGFyZ2V0ID0gbm9kZS5nZXR0ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IE9iamVjdEFjY2Vzc1RhcmdldC5pbnRlcmZhY2VNZW1iZXIobm9kZS5nZXR0ZXIpCiAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpOwoKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gaW5mZXJyZXIuZ2V0UmV0dXJuVHlwZShyZWFkVGFyZ2V0LCBpbmZlcnJlci50aGlzVHlwZSk7CiAgICByZXBvcnROb25OdWxsYWJsZUluTnVsbEF3YXJlV2FybmluZ0lmTmVlZGVkKAogICAgICAgIHJlYWRUeXBlLCAiPz89Iiwgbm9kZS5yZWFkT2Zmc2V0KTsKICAgIERhcnRUeXBlIHJlYWRJbmRleFR5cGUgPQogICAgICAgIGluZmVycmVyLmdldEluZGV4S2V5VHlwZShyZWFkVGFyZ2V0LCBpbmZlcnJlci50aGlzVHlwZSk7CgogICAgTWVtYmVyIGVxdWFsc01lbWJlciA9IGluZmVycmVyCiAgICAgICAgLmZpbmRJbnRlcmZhY2VNZW1iZXIocmVhZFR5cGUsIGVxdWFsc05hbWUsIG5vZGUudGVzdE9mZnNldCkKICAgICAgICAubWVtYmVyOwoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCB3cml0ZVRhcmdldCA9IG5vZGUuc2V0dGVyICE9IG51bGwKICAgICAgICA/IG5ldyBPYmplY3RBY2Nlc3NUYXJnZXQuaW50ZXJmYWNlTWVtYmVyKG5vZGUuc2V0dGVyKQogICAgICAgIDogY29uc3QgT2JqZWN0QWNjZXNzVGFyZ2V0Lm1pc3NpbmcoKTsKCiAgICBEYXJ0VHlwZSB3cml0ZUluZGV4VHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0SW5kZXhLZXlUeXBlKHdyaXRlVGFyZ2V0LCBpbmZlcnJlci50aGlzVHlwZSk7CiAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUgPQogICAgICAgIGluZmVycmVyLmdldEluZGV4U2V0VmFsdWVUeXBlKHdyaXRlVGFyZ2V0LCBpbmZlcnJlci50aGlzVHlwZSk7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmRleFJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLmluZGV4LCByZWFkSW5kZXhUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZUZvclJlc3VsdChpbmRleFJlc3VsdCk7CgogICAgRXhwcmVzc2lvbiByZWFkSW5kZXggPSBjcmVhdGVWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICAgIHJlYWRJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgcmVhZEluZGV4VHlwZSwgaW5kZXhSZXN1bHQuaW5mZXJyZWRUeXBlLCByZWFkSW5kZXgpOwoKICAgIEV4cHJlc3Npb24gd3JpdGVJbmRleCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogICAgd3JpdGVJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgd3JpdGVJbmRleFR5cGUsIGluZGV4UmVzdWx0LmluZmVycmVkVHlwZSwgd3JpdGVJbmRleCk7CgogICAgRXhwcmVzc2lvbiByZWFkOwoKICAgIGlmIChyZWFkVGFyZ2V0LmlzTWlzc2luZykgewogICAgICByZWFkID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ1N1cGVySW5kZXhHZXQobm9kZS5yZWFkT2Zmc2V0LCByZWFkSW5kZXgpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHJlYWRUYXJnZXQuaXNJbnN0YW5jZU1lbWJlcik7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpRm9ySW5zdHJ1bWVudGF0aW9uLAogICAgICAgICAgbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgICAgJ3RhcmdldCcsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JNZW1iZXIobm9kZS5nZXR0ZXIpKTsKICAgICAgcmVhZCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgcmVhZEluZGV4LAogICAgICAgICAgXSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgICAgcmVhZFRhcmdldC5tZW1iZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5yZWFkT2Zmc2V0OwogICAgfQoKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5pZk51bGxFeHByZXNzaW9uX3JpZ2h0QmVnaW4ocmVhZCk7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZhbHVlUmVzdWx0ID0gaW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKG5vZGUudmFsdWUsIHZhbHVlVHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdCh2YWx1ZVR5cGUsIHZhbHVlUmVzdWx0KTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5pZk51bGxFeHByZXNzaW9uX2VuZCgpOwoKICAgIERhcnRUeXBlIG5vbk51bGxhYmxlUmVhZFR5cGUgPSBpbmZlcnJlci5jb21wdXRlTm9uTnVsbGFibGUocmVhZFR5cGUpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZChub25OdWxsYWJsZVJlYWRUeXBlLCB2YWx1ZVJlc3VsdC5pbmZlcnJlZFR5cGUsCiAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YWx1ZVZhcmlhYmxlOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIC8vIE5vIG5lZWQgZm9yIGEgdmFsdWUgdmFyaWFibGUuCiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUodmFsdWUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICAgIHZhbHVlID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiB3cml0ZTsKCiAgICBpZiAod3JpdGVUYXJnZXQuaXNNaXNzaW5nKSB7CiAgICAgIHdyaXRlID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ1N1cGVySW5kZXhTZXQoCiAgICAgICAgICBub2RlLndyaXRlT2Zmc2V0LCB3cml0ZUluZGV4LCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQod3JpdGVUYXJnZXQuaXNJbnN0YW5jZU1lbWJlcik7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpRm9ySW5zdHJ1bWVudGF0aW9uLAogICAgICAgICAgbm9kZS53cml0ZU9mZnNldCwKICAgICAgICAgICd0YXJnZXQnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKG5vZGUuc2V0dGVyKSk7CiAgICAgIHdyaXRlID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGluZGV4U2V0TmFtZSwKICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W3dyaXRlSW5kZXgsIHZhbHVlXSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS53cml0ZU9mZnNldCwKICAgICAgICAgIHdyaXRlVGFyZ2V0Lm1lbWJlcikKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLndyaXRlT2Zmc2V0OwogICAgfQoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQ7CiAgICBpZiAobm9kZS5mb3JFZmZlY3QpIHsKICAgICAgLy8gRW5jb2RlIGBvW2FdID8/PSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCB2MSA9IGEgaW4KICAgICAgLy8gICAgICAgIHN1cGVyW3YxXSA9PSBudWxsID8gc3VwZXIuW109KHYxLCBiKSA6IG51bGwKICAgICAgLy8KICAgICAgTWV0aG9kSW52b2NhdGlvbiBlcXVhbHNOdWxsID0KICAgICAgICAgIGNyZWF0ZUVxdWFsc051bGwobm9kZS50ZXN0T2Zmc2V0LCByZWFkLCBlcXVhbHNNZW1iZXIpOwogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWwgPSBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKGVxdWFsc051bGwsCiAgICAgICAgICB3cml0ZSwgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBub2RlLnRlc3RPZmZzZXQsIGluZmVycmVkVHlwZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLnRlc3RPZmZzZXQ7CiAgICAgIHJlcGxhY2VtZW50ID0gY3JlYXRlTGV0KGluZGV4VmFyaWFibGUsIGNvbmRpdGlvbmFsKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEVuY29kZSBgb1thXSA/Pz0gYmAgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgdjEgPSBhIGluCiAgICAgIC8vICAgICBsZXQgdjIgPSBzdXBlclt2MV0gaW4KICAgICAgLy8gICAgICAgdjIgPT0gbnVsbAogICAgICAvLyAgICAgICAgPyAobGV0IHYzID0gYiBpbgogICAgICAvLyAgICAgICAgICAgbGV0IF8gPSBzdXBlci5bXT0odjEsIHYzKSBpbgogICAgICAvLyAgICAgICAgICAgdjMpCiAgICAgIC8vICAgICAgICA6IHYyCiAgICAgIC8vCiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlICE9IG51bGwpOwoKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZWFkVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZShyZWFkLCByZWFkVHlwZSk7CiAgICAgIE1ldGhvZEludm9jYXRpb24gZXF1YWxzTnVsbCA9IGNyZWF0ZUVxdWFsc051bGwoCiAgICAgICAgICBub2RlLnRlc3RPZmZzZXQsIGNyZWF0ZVZhcmlhYmxlR2V0KHJlYWRWYXJpYWJsZSksIGVxdWFsc01lbWJlcik7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGVWYXJpYWJsZSA9CiAgICAgICAgICBjcmVhdGVWYXJpYWJsZSh3cml0ZSwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICAgIFZhcmlhYmxlR2V0IHZhcmlhYmxlR2V0ID0gY3JlYXRlVmFyaWFibGVHZXQocmVhZFZhcmlhYmxlKTsKICAgICAgaWYgKGluZmVycmVyLmxpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgICAgIWlkZW50aWNhbChub25OdWxsYWJsZVJlYWRUeXBlLCByZWFkVHlwZSkpIHsKICAgICAgICB2YXJpYWJsZUdldC5wcm9tb3RlZFR5cGUgPSBub25OdWxsYWJsZVJlYWRUeXBlOwogICAgICB9CiAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICBlcXVhbHNOdWxsLAogICAgICAgICAgY3JlYXRlTGV0KHZhbHVlVmFyaWFibGUsCiAgICAgICAgICAgICAgY3JlYXRlTGV0KHdyaXRlVmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSksCiAgICAgICAgICB2YXJpYWJsZUdldCwKICAgICAgICAgIGluZmVycmVkVHlwZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgIHJlcGxhY2VtZW50ID0KICAgICAgICAgIGNyZWF0ZUxldChpbmRleFZhcmlhYmxlLCBjcmVhdGVMZXQocmVhZFZhcmlhYmxlLCBjb25kaXRpb25hbCkpOwogICAgfQoKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50KTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRJZk51bGxFeHRlbnNpb25JbmRleFNldCgKICAgICAgSWZOdWxsRXh0ZW5zaW9uSW5kZXhTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVjZWl2ZXJSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5yZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiBmYWxzZSk7CgogICAgTGlzdDxEYXJ0VHlwZT4gZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyA9CiAgICAgICAgaW5mZXJyZXIuY29tcHV0ZUV4dGVuc2lvblR5cGVBcmd1bWVudChub2RlLmV4dGVuc2lvbiwKICAgICAgICAgICAgbm9kZS5leHBsaWNpdFR5cGVBcmd1bWVudHMsIHJlY2VpdmVyUmVzdWx0LmluZmVycmVkVHlwZSk7CgogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gaW5mZXJyZXIuZ2V0RXh0ZW5zaW9uUmVjZWl2ZXJUeXBlKAogICAgICAgIG5vZGUuZXh0ZW5zaW9uLCBleHRlbnNpb25UeXBlQXJndW1lbnRzKTsKCiAgICBFeHByZXNzaW9uIHJlY2VpdmVyID0KICAgICAgICBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KHJlY2VpdmVyVHlwZSwgcmVjZWl2ZXJSZXN1bHQpOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVjZWl2ZXJWYXJpYWJsZTsKICAgIEV4cHJlc3Npb24gcmVhZFJlY2VpdmVyOwogICAgRXhwcmVzc2lvbiB3cml0ZVJlY2VpdmVyOwogICAgaWYgKG5vZGUucmVhZE9ubHlSZWNlaXZlciAmJiBpZGVudGljYWwocmVjZWl2ZXIsIG5vZGUucmVjZWl2ZXIpKSB7CiAgICAgIHJlYWRSZWNlaXZlciA9IHJlY2VpdmVyOwogICAgICB3cml0ZVJlY2VpdmVyID0gX2Nsb25lKHJlY2VpdmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlY2VpdmVyVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZShyZWNlaXZlciwgcmVjZWl2ZXJUeXBlKTsKICAgICAgcmVhZFJlY2VpdmVyID0gY3JlYXRlVmFyaWFibGVHZXQocmVjZWl2ZXJWYXJpYWJsZSk7CiAgICAgIHdyaXRlUmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIH0KCiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgcmVhZFRhcmdldCA9IG5vZGUuZ2V0dGVyICE9IG51bGwKICAgICAgICA/IG5ldyBFeHRlbnNpb25BY2Nlc3NUYXJnZXQoCiAgICAgICAgICAgIG5vZGUuZ2V0dGVyLCBudWxsLCBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yLCBleHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgIDogY29uc3QgT2JqZWN0QWNjZXNzVGFyZ2V0Lm1pc3NpbmcoKTsKCiAgICBEYXJ0VHlwZSByZWFkSW5kZXhUeXBlID0gaW5mZXJyZXIuZ2V0SW5kZXhLZXlUeXBlKHJlYWRUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gbm9kZS5zZXR0ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IEV4dGVuc2lvbkFjY2Vzc1RhcmdldCgKICAgICAgICAgICAgbm9kZS5zZXR0ZXIsIG51bGwsIFByb2NlZHVyZUtpbmQuT3BlcmF0b3IsIGV4dGVuc2lvblR5cGVBcmd1bWVudHMpCiAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpOwoKICAgIERhcnRUeXBlIHdyaXRlSW5kZXhUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleEtleVR5cGUod3JpdGVUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUgPQogICAgICAgIGluZmVycmVyLmdldEluZGV4U2V0VmFsdWVUeXBlKHdyaXRlVGFyZ2V0LCByZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5kZXhSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS5pbmRleCwgcmVhZEluZGV4VHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBpbmRleFZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGVGb3JSZXN1bHQoaW5kZXhSZXN1bHQpOwoKICAgIEV4cHJlc3Npb24gcmVhZEluZGV4ID0gY3JlYXRlVmFyaWFibGVHZXQoaW5kZXhWYXJpYWJsZSk7CiAgICByZWFkSW5kZXggPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIHJlYWRJbmRleFR5cGUsIGluZGV4UmVzdWx0LmluZmVycmVkVHlwZSwgcmVhZEluZGV4KTsKCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlYWRSZXN1bHQgPSBfY29tcHV0ZUluZGV4R2V0KAogICAgICAgIG5vZGUucmVhZE9mZnNldCwKICAgICAgICByZWFkUmVjZWl2ZXIsCiAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgIHJlYWRUYXJnZXQsCiAgICAgICAgcmVhZEluZGV4LAogICAgICAgIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLm5vbmUpOwogICAgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgICByZWFkUmVzdWx0LmluZmVycmVkVHlwZSwgIj8/PSIsIG5vZGUucmVhZE9mZnNldCk7CiAgICBFeHByZXNzaW9uIHJlYWQgPSByZWFkUmVzdWx0LmV4cHJlc3Npb247CiAgICBEYXJ0VHlwZSByZWFkVHlwZSA9IHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbihyZWFkKTsKCiAgICBNZW1iZXIgZXF1YWxzTWVtYmVyID0gaW5mZXJyZXIKICAgICAgICAuZmluZEludGVyZmFjZU1lbWJlcihyZWFkVHlwZSwgZXF1YWxzTmFtZSwgbm9kZS50ZXN0T2Zmc2V0KQogICAgICAgIC5tZW1iZXI7CgogICAgRXhwcmVzc2lvbiB3cml0ZUluZGV4ID0gY3JlYXRlVmFyaWFibGVHZXQoaW5kZXhWYXJpYWJsZSk7CiAgICB3cml0ZUluZGV4ID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICB3cml0ZUluZGV4VHlwZSwgaW5kZXhSZXN1bHQuaW5mZXJyZWRUeXBlLCB3cml0ZUluZGV4KTsKCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZhbHVlUmVzdWx0ID0gaW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKG5vZGUudmFsdWUsIHZhbHVlVHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHZhbHVlID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdCh2YWx1ZVR5cGUsIHZhbHVlUmVzdWx0KTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5pZk51bGxFeHByZXNzaW9uX2VuZCgpOwoKICAgIERhcnRUeXBlIG5vbk51bGxhYmxlUmVhZFR5cGUgPSBpbmZlcnJlci5jb21wdXRlTm9uTnVsbGFibGUocmVhZFR5cGUpOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgLmdldFN0YW5kYXJkVXBwZXJCb3VuZChub25OdWxsYWJsZVJlYWRUeXBlLCB2YWx1ZVJlc3VsdC5pbmZlcnJlZFR5cGUsCiAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YWx1ZVZhcmlhYmxlOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIC8vIE5vIG5lZWQgZm9yIGEgdmFsdWUgdmFyaWFibGUuCiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUodmFsdWUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICAgIHZhbHVlID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiB3cml0ZSA9IF9jb21wdXRlSW5kZXhTZXQobm9kZS53cml0ZU9mZnNldCwgd3JpdGVSZWNlaXZlciwKICAgICAgICByZWNlaXZlclR5cGUsIHdyaXRlVGFyZ2V0LCB3cml0ZUluZGV4LCB2YWx1ZSk7CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChub2RlLmZvckVmZmVjdCkgewogICAgICAvLyBFbmNvZGUgYEV4dGVuc2lvbihvKVthXSA/Pz0gYmAgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IG87CiAgICAgIC8vICAgICBsZXQgaW5kZXhWYXJpYWJsZSA9IGEgaW4KICAgICAgLy8gICAgICAgIHJlY2VpdmVyVmFyaWFibGVbaW5kZXhWYXJpYWJsZV0gPT0gbnVsbAogICAgICAvLyAgICAgICAgICA/IHJlY2VpdmVyVmFyaWFibGUuW109KGluZGV4VmFyaWFibGUsIGIpIDogbnVsbAogICAgICAvLwogICAgICBNZXRob2RJbnZvY2F0aW9uIGVxdWFsc051bGwgPQogICAgICAgICAgY3JlYXRlRXF1YWxzTnVsbChub2RlLnRlc3RPZmZzZXQsIHJlYWQsIGVxdWFsc01lbWJlcik7CiAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oZXF1YWxzTnVsbCwKICAgICAgICAgIHdyaXRlLCBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IG5vZGUudGVzdE9mZnNldCwgaW5mZXJyZWRUeXBlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUudGVzdE9mZnNldDsKICAgICAgcmVwbGFjZW1lbnQgPSBjcmVhdGVMZXQoaW5kZXhWYXJpYWJsZSwgY29uZGl0aW9uYWwpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb2RlIGBFeHRlbnNpb24obylbYV0gPz89IGJgIGFzOgogICAgICAvLwogICAgICAvLyAgICAgbGV0IHJlY2VpdmVyVmFyaWFibGUgPSBvOwogICAgICAvLyAgICAgbGV0IGluZGV4VmFyaWFibGUgPSBhIGluCiAgICAgIC8vICAgICBsZXQgcmVhZFZhcmlhYmxlID0gcmVjZWl2ZXJWYXJpYWJsZVtpbmRleFZhcmlhYmxlXSBpbgogICAgICAvLyAgICAgICByZWFkVmFyaWFibGUgPT0gbnVsbAogICAgICAvLyAgICAgICAgPyAobGV0IHZhbHVlVmFyaWFibGUgPSBiIGluCiAgICAgIC8vICAgICAgICAgICBsZXQgd3JpdGVWYXJpYWJsZSA9CiAgICAgIC8vICAgICAgICAgICAgICAgcmVjZWl2ZXJWYXJpYWJsZS5bXT0oaW5kZXhWYXJpYWJsZSwgdmFsdWVWYXJpYWJsZSkgaW4KICAgICAgLy8gICAgICAgICAgIHZhbHVlVmFyaWFibGUpCiAgICAgIC8vICAgICAgICA6IHJlYWRWYXJpYWJsZQogICAgICAvLwogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSAhPSBudWxsKTsKCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVhZCwgcmVhZFR5cGUpOwogICAgICBNZXRob2RJbnZvY2F0aW9uIGVxdWFsc051bGwgPSBjcmVhdGVFcXVhbHNOdWxsKAogICAgICAgICAgbm9kZS50ZXN0T2Zmc2V0LCBjcmVhdGVWYXJpYWJsZUdldChyZWFkVmFyaWFibGUpLCBlcXVhbHNNZW1iZXIpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlVmFyaWFibGUgPQogICAgICAgICAgY3JlYXRlVmFyaWFibGUod3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgICBWYXJpYWJsZUdldCB2YXJpYWJsZUdldCA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlYWRWYXJpYWJsZSk7CiAgICAgIGlmIChpbmZlcnJlci5saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICAgICFpZGVudGljYWwobm9uTnVsbGFibGVSZWFkVHlwZSwgcmVhZFR5cGUpKSB7CiAgICAgICAgdmFyaWFibGVHZXQucHJvbW90ZWRUeXBlID0gbm9uTnVsbGFibGVSZWFkVHlwZTsKICAgICAgfQogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWwgPSBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgZXF1YWxzTnVsbCwKICAgICAgICAgIGNyZWF0ZUxldCh2YWx1ZVZhcmlhYmxlLAogICAgICAgICAgICAgIGNyZWF0ZUxldCh3cml0ZVZhcmlhYmxlLCBjcmVhdGVWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpLAogICAgICAgICAgdmFyaWFibGVHZXQsCiAgICAgICAgICBpbmZlcnJlZFR5cGUpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgICByZXBsYWNlbWVudCA9CiAgICAgICAgICBjcmVhdGVMZXQoaW5kZXhWYXJpYWJsZSwgY3JlYXRlTGV0KHJlYWRWYXJpYWJsZSwgY29uZGl0aW9uYWwpKTsKICAgIH0KICAgIGlmIChyZWNlaXZlclZhcmlhYmxlICE9IG51bGwpIHsKICAgICAgcmVwbGFjZW1lbnQgPSBuZXcgTGV0KHJlY2VpdmVyVmFyaWFibGUsIHJlcGxhY2VtZW50KTsKICAgIH0KICAgIHJlcGxhY2VtZW50LmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCByZXBsYWNlbWVudCk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhbiBlcXVhbHMgZXhwcmVzc2lvbiBvZiB1c2luZyBbbGVmdF0gYW5kIFtyaWdodF0gYXMgb3BlcmFuZHMuCiAgLy8vCiAgLy8vIFtmaWxlT2Zmc2V0XSBpcyB1c2VkIGFzIHRoZSBmaWxlIG9mZnNldCBmb3IgY3JlYXRlZCBub2Rlcy4gW2xlZnRUeXBlXSBpcwogIC8vLyB0aGUgYWxyZWFkeSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBbbGVmdF0gZXhwcmVzc2lvbi4gVGhlIGluZmVycmVkIHR5cGUgb2YKICAvLy8gW3JpZ2h0XSBpcyBjb21wdXRlZCBieSB0aGlzIG1ldGhvZC4gSWYgW2lzTm90XSBpcyBgdHJ1ZWAgdGhlIHJlc3VsdCBpcwogIC8vLyBuZWdhdGVkIHRvIHBlcmZvcm0gYSAhPSBvcGVyYXRpb24uCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBfY29tcHV0ZUVxdWFsc0V4cHJlc3Npb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGxlZnQsIERhcnRUeXBlIGxlZnRUeXBlLCBFeHByZXNzaW9uIHJpZ2h0LAogICAgICB7Ym9vbCBpc05vdH0pIHsKICAgIGFzc2VydChpc05vdCAhPSBudWxsKTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5lcXVhbGl0eU9wX3JpZ2h0QmVnaW4obGVmdCk7CiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgZXF1YWxzVGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICBsZWZ0VHlwZSwgZXF1YWxzTmFtZSwgZmlsZU9mZnNldCwKICAgICAgICBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSk7CgogICAgYm9vbCB0eXBlTmVlZGVkID0gIWluZmVycmVyLmlzVG9wTGV2ZWw7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJpZ2h0UmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIHJpZ2h0LCBjb25zdCBVbmtub3duVHlwZSgpLCB0eXBlTmVlZGVkLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgIHJpZ2h0ID0gcmlnaHRSZXN1bHQuZXhwcmVzc2lvbjsKCiAgICBhc3NlcnQoZXF1YWxzVGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgaWYgKGluZmVycmVyLmluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmIGxlZnRUeXBlID09IGNvbnN0IER5bmFtaWNUeXBlKCkpIHsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uLnJlY29yZCgKICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgIGZpbGVPZmZzZXQsCiAgICAgICAgICAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihlcXVhbHNUYXJnZXQubWVtYmVyKSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiBlcXVhbHMgPSBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBsZWZ0LAogICAgICAgIGVxdWFsc05hbWUsCiAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICByaWdodCwKICAgICAgICBdKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICBlcXVhbHNUYXJnZXQubWVtYmVyKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgaWYgKGlzTm90KSB7CiAgICAgIGVxdWFscyA9IG5ldyBOb3QoZXF1YWxzKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuZXF1YWxpdHlPcF9lbmQoZXF1YWxzLCByaWdodCwgbm90RXF1YWw6IGlzTm90KTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuYm9vbFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSksIGVxdWFscyk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIGJpbmFyeSBleHByZXNzaW9uIG9mIHRoZSBiaW5hcnkgb3BlcmF0b3Igd2l0aCBbYmluYXJ5TmFtZV0gdXNpbmcKICAvLy8gW2xlZnRdIGFuZCBbcmlnaHRdIGFzIG9wZXJhbmRzLgogIC8vLwogIC8vLyBbZmlsZU9mZnNldF0gaXMgdXNlZCBhcyB0aGUgZmlsZSBvZmZzZXQgZm9yIGNyZWF0ZWQgbm9kZXMuIFtsZWZ0VHlwZV0gaXMKICAvLy8gdGhlIGFscmVhZHkgaW5mZXJyZWQgdHlwZSBvZiB0aGUgW2xlZnRdIGV4cHJlc3Npb24uIFRoZSBpbmZlcnJlZCB0eXBlIG9mCiAgLy8vIFtyaWdodF0gaXMgY29tcHV0ZWQgYnkgdGhpcyBtZXRob2QuCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBfY29tcHV0ZUJpbmFyeUV4cHJlc3Npb24oaW50IGZpbGVPZmZzZXQsCiAgICAgIEV4cHJlc3Npb24gbGVmdCwgRGFydFR5cGUgbGVmdFR5cGUsIE5hbWUgYmluYXJ5TmFtZSwgRXhwcmVzc2lvbiByaWdodCkgewogICAgYXNzZXJ0KGJpbmFyeU5hbWUgIT0gZXF1YWxzTmFtZSk7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IGJpbmFyeVRhcmdldCA9IGluZmVycmVyLmZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgbGVmdFR5cGUsIGJpbmFyeU5hbWUsIGZpbGVPZmZzZXQsCiAgICAgICAgaW5jbHVkZUV4dGVuc2lvbk1ldGhvZHM6IHRydWUpOwoKICAgIE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kIGJpbmFyeUNoZWNrS2luZCA9CiAgICAgICAgaW5mZXJyZXIucHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UobGVmdFR5cGUsIGJpbmFyeVRhcmdldCwKICAgICAgICAgICAgaXNUaGlzUmVjZWl2ZXI6IGZhbHNlKTsKCiAgICBEYXJ0VHlwZSBiaW5hcnlUeXBlID0gaW5mZXJyZXIuZ2V0UmV0dXJuVHlwZShiaW5hcnlUYXJnZXQsIGxlZnRUeXBlKTsKICAgIERhcnRUeXBlIHJpZ2h0VHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0UG9zaXRpb25hbFBhcmFtZXRlclR5cGVGb3JUYXJnZXQoYmluYXJ5VGFyZ2V0LCBsZWZ0VHlwZSwgMCk7CgogICAgYm9vbCBpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlID0KICAgICAgICBpbmZlcnJlci5pc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlKGJpbmFyeVRhcmdldCwgbGVmdFR5cGUpOwoKICAgIGJvb2wgdHlwZU5lZWRlZCA9CiAgICAgICAgIWluZmVycmVyLmlzVG9wTGV2ZWwgfHwgaXNPdmVybG9hZGVkQXJpdGhtZXRpY09wZXJhdG9yQW5kVHlwZTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmlnaHRSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24ocmlnaHQsIHJpZ2h0VHlwZSwgdHlwZU5lZWRlZCwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBpZiAocmlnaHRSZXN1bHQuaW5mZXJyZWRUeXBlID09IG51bGwpIHsKICAgICAgYXNzZXJ0KCF0eXBlTmVlZGVkLAogICAgICAgICAgIk1pc3NpbmcgcmlnaHQgdHlwZSBmb3Igb3ZlcmxvYWRlZCBhcml0aG1ldGljIG9wZXJhdG9yLiIpOwogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICBiaW5hcnlUeXBlLAogICAgICAgICAgaW5mZXJyZXIuZW5naW5lLmZvcmVzdAogICAgICAgICAgICAgIC5jcmVhdGVCaW5hcnkoZmlsZU9mZnNldCwgbGVmdCwgYmluYXJ5TmFtZSwgcmlnaHQpKTsKICAgIH0KCiAgICByaWdodCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQocmlnaHRUeXBlLCByaWdodFJlc3VsdCk7CgogICAgaWYgKGlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvckFuZFR5cGUpIHsKICAgICAgYmluYXJ5VHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgLmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljKGxlZnRUeXBlLCByaWdodFJlc3VsdC5pbmZlcnJlZFR5cGUpOwogICAgfQoKICAgIEV4cHJlc3Npb24gYmluYXJ5OwogICAgaWYgKGJpbmFyeVRhcmdldC5pc01pc3NpbmcpIHsKICAgICAgYmluYXJ5ID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ0JpbmFyeSgKICAgICAgICAgIGZpbGVPZmZzZXQsIGxlZnQsIGxlZnRUeXBlLCBiaW5hcnlOYW1lLCByaWdodCk7CiAgICB9IGVsc2UgaWYgKGJpbmFyeVRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcikgewogICAgICBhc3NlcnQoYmluYXJ5VGFyZ2V0LmV4dGVuc2lvbk1ldGhvZEtpbmQgIT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpOwogICAgICBiaW5hcnkgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIGJpbmFyeVRhcmdldC5tZW1iZXIsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgbGVmdCwKICAgICAgICAgICAgcmlnaHQsCiAgICAgICAgICBdLCB0eXBlczogYmluYXJ5VGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgaWYgKGJpbmFyeVRhcmdldC5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24gIT0gbnVsbCAmJgogICAgICAgICAgbGVmdFR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbi5yZWNvcmQoCiAgICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgJ3RhcmdldCcsCiAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihiaW5hcnlUYXJnZXQubWVtYmVyKSk7CiAgICAgIH0KCiAgICAgIGJpbmFyeSA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgbGVmdCwKICAgICAgICAgIGJpbmFyeU5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgcmlnaHQsCiAgICAgICAgICBdKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgYmluYXJ5VGFyZ2V0Lm1lbWJlcikKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwoKICAgICAgaWYgKGJpbmFyeUNoZWNrS2luZCA9PSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja01ldGhvZFJldHVybikgewogICAgICAgIGlmIChpbmZlcnJlci5pbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uLnJlY29yZCgKICAgICAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICAnY2hlY2tSZXR1cm4nLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoYmluYXJ5VHlwZSkpOwogICAgICAgIH0KICAgICAgICBiaW5hcnkgPSBuZXcgQXNFeHByZXNzaW9uKGJpbmFyeSwgYmluYXJ5VHlwZSkKICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAuLmlzQ292YXJpYW5jZUNoZWNrID0gdHJ1ZQogICAgICAgICAgLi5pc0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0ID0gaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgfQogICAgfQogICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgaW5mZXJyZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgaWYgKGxlZnRUeXBlIGlzISBEeW5hbWljVHlwZSAmJiBsZWZ0VHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUpIHsKICAgICAgICBpZiAoaW5mZXJyZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICAgICAgICBiaW5hcnlUeXBlLAogICAgICAgICAgICAgIGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAogICAgICAgICAgICAgICAgICBiaW5hcnksCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvci53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgYmluYXJ5TmFtZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgbGVmdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICAgICAgYmluYXJ5TmFtZS5uYW1lLmxlbmd0aCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBiaW5hcnlOYW1lLm5hbWUsIGxlZnRUeXBlLCBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICBiaW5hcnkuZmlsZU9mZnNldCwKICAgICAgICAgICAgICBiaW5hcnlOYW1lLm5hbWUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChiaW5hcnlUeXBlLCBiaW5hcnkpOwogIH0KCiAgLy8vIENyZWF0ZXMgYSB1bmFyeSBleHByZXNzaW9uIG9mIHRoZSB1bmFyeSBvcGVyYXRvciB3aXRoIFt1bmFyeU5hbWVdIHVzaW5nCiAgLy8vIFtleHByZXNzaW9uXSBhcyB0aGUgb3BlcmFuZC4KICAvLy8KICAvLy8gW2ZpbGVPZmZzZXRdIGlzIHVzZWQgYXMgdGhlIGZpbGUgb2Zmc2V0IGZvciBjcmVhdGVkIG5vZGVzLgogIC8vLyBbZXhwcmVzc2lvblR5cGVdIGlzIHRoZSBhbHJlYWR5IGluZmVycmVkIHR5cGUgb2YgdGhlIFtleHByZXNzaW9uXS4KICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IF9jb21wdXRlVW5hcnlFeHByZXNzaW9uKGludCBmaWxlT2Zmc2V0LAogICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sIERhcnRUeXBlIGV4cHJlc3Npb25UeXBlLCBOYW1lIHVuYXJ5TmFtZSkgewogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHVuYXJ5VGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICBleHByZXNzaW9uVHlwZSwgdW5hcnlOYW1lLCBmaWxlT2Zmc2V0LAogICAgICAgIGluY2x1ZGVFeHRlbnNpb25NZXRob2RzOiB0cnVlKTsKCiAgICBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCB1bmFyeUNoZWNrS2luZCA9CiAgICAgICAgaW5mZXJyZXIucHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2UoZXhwcmVzc2lvblR5cGUsIHVuYXJ5VGFyZ2V0LAogICAgICAgICAgICBpc1RoaXNSZWNlaXZlcjogZmFsc2UpOwoKICAgIERhcnRUeXBlIHVuYXJ5VHlwZSA9IGluZmVycmVyLmdldFJldHVyblR5cGUodW5hcnlUYXJnZXQsIGV4cHJlc3Npb25UeXBlKTsKCiAgICBFeHByZXNzaW9uIHVuYXJ5OwogICAgaWYgKHVuYXJ5VGFyZ2V0LmlzTWlzc2luZykgewogICAgICB1bmFyeSA9IGluZmVycmVyLmNyZWF0ZU1pc3NpbmdVbmFyeSgKICAgICAgICAgIGZpbGVPZmZzZXQsIGV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB1bmFyeU5hbWUpOwogICAgfSBlbHNlIGlmICh1bmFyeVRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcikgewogICAgICBhc3NlcnQodW5hcnlUYXJnZXQuZXh0ZW5zaW9uTWV0aG9kS2luZCAhPSBQcm9jZWR1cmVLaW5kLlNldHRlcik7CiAgICAgIHVuYXJ5ID0gbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICB1bmFyeVRhcmdldC5tZW1iZXIsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgZXhwcmVzc2lvbiwKICAgICAgICAgIF0sIHR5cGVzOiB1bmFyeVRhcmdldC5pbmZlcnJlZEV4dGVuc2lvblR5cGVBcmd1bWVudHMpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh1bmFyeVRhcmdldC5pc0luc3RhbmNlTWVtYmVyICYmCiAgICAgICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24gIT0gbnVsbCAmJgogICAgICAgICAgZXhwcmVzc2lvblR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbi5yZWNvcmQoCiAgICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgJ3RhcmdldCcsCiAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcih1bmFyeVRhcmdldC5tZW1iZXIpKTsKICAgICAgfQoKICAgICAgdW5hcnkgPSBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgIGV4cHJlc3Npb24sCiAgICAgICAgICB1bmFyeU5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltdKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICB1bmFyeVRhcmdldC5tZW1iZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKCiAgICAgIGlmICh1bmFyeUNoZWNrS2luZCA9PSBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja01ldGhvZFJldHVybikgewogICAgICAgIGlmIChpbmZlcnJlci5pbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uLnJlY29yZCgKICAgICAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICAnY2hlY2tSZXR1cm4nLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUoZXhwcmVzc2lvblR5cGUpKTsKICAgICAgICB9CiAgICAgICAgdW5hcnkgPSBuZXcgQXNFeHByZXNzaW9uKHVuYXJ5LCB1bmFyeVR5cGUpCiAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgLi5pc0NvdmFyaWFuY2VDaGVjayA9IHRydWUKICAgICAgICAgIC4uaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmIGluZmVycmVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIGlmIChleHByZXNzaW9uVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAgIGV4cHJlc3Npb25UeXBlLmlzUG90ZW50aWFsbHlOdWxsYWJsZSkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFNwZWNpYWwgY2FzZSAndW5hcnktJyBpbiBtZXNzYWdlcy4gSXQgc2hvdWxkCiAgICAgICAgLy8gcHJvYmFibHkgYmUgcmVmZXJyZWQgdG8gYXMgIlVuYXJ5IG9wZXJhdG9yICctJyAuLi4iLgogICAgICAgIGlmIChpbmZlcnJlci5ubmJkU3Ryb25nTW9kZSkgewogICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgICAgICAgIHVuYXJ5VHlwZSwKICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdW5hcnksCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvci53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgdW5hcnlOYW1lLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uVHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgICB1bmFyeU5hbWUgPT0gdW5hcnlNaW51c05hbWUgPyAxIDogdW5hcnlOYW1lLm5hbWUubGVuZ3RoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZmVycmVyLmhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVPcGVyYXRvckNhbGxXYXJuaW5nLndpdGhBcmd1bWVudHModW5hcnlOYW1lLm5hbWUsCiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlLCBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICB1bmFyeS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIHVuYXJ5TmFtZSA9PSB1bmFyeU1pbnVzTmFtZSA/IDEgOiB1bmFyeU5hbWUubmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KHVuYXJ5VHlwZSwgdW5hcnkpOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gaW5kZXggb3BlcmF0aW9uIG9mIFtyZWFkVGFyZ2V0XSBvbiBbcmVjZWl2ZXJdIHVzaW5nIFtpbmRleF0gYXMKICAvLy8gdGhlIGFyZ3VtZW50LgogIC8vLwogIC8vLyBbZmlsZU9mZnNldF0gaXMgdXNlZCBhcyB0aGUgZmlsZSBvZmZzZXQgZm9yIGNyZWF0ZWQgbm9kZXMuIFtyZWNlaXZlclR5cGVdCiAgLy8vIGlzIHRoZSBhbHJlYWR5IGluZmVycmVkIHR5cGUgb2YgdGhlIFtyZWNlaXZlcl0gZXhwcmVzc2lvbi4gVGhlIGluZmVycmVkCiAgLy8vIHR5cGUgb2YgW2luZGV4XSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGNvbXB1dGVkLgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgX2NvbXB1dGVJbmRleEdldCgKICAgICAgaW50IGZpbGVPZmZzZXQsCiAgICAgIEV4cHJlc3Npb24gcmVhZFJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCByZWFkVGFyZ2V0LAogICAgICBFeHByZXNzaW9uIHJlYWRJbmRleCwKICAgICAgTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQgcmVhZENoZWNrS2luZCkgewogICAgRXhwcmVzc2lvbiByZWFkOwogICAgRGFydFR5cGUgcmVhZFR5cGUgPSBpbmZlcnJlci5nZXRSZXR1cm5UeXBlKHJlYWRUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgICBpZiAocmVhZFRhcmdldC5pc01pc3NpbmcpIHsKICAgICAgcmVhZCA9IGluZmVycmVyLmNyZWF0ZU1pc3NpbmdJbmRleEdldCgKICAgICAgICAgIGZpbGVPZmZzZXQsIHJlYWRSZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCByZWFkSW5kZXgpOwogICAgfSBlbHNlIGlmIChyZWFkVGFyZ2V0LmlzRXh0ZW5zaW9uTWVtYmVyKSB7CiAgICAgIHJlYWQgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIHJlYWRUYXJnZXQubWVtYmVyLAogICAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICAgIHJlYWRSZWNlaXZlciwKICAgICAgICAgICAgcmVhZEluZGV4LAogICAgICAgICAgXSwgdHlwZXM6IHJlYWRUYXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZWFkID0gbmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICByZWFkUmVjZWl2ZXIsCiAgICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgcmVhZEluZGV4LAogICAgICAgICAgXSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgIHJlYWRUYXJnZXQubWVtYmVyKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIGlmIChyZWFkQ2hlY2tLaW5kID09IE1ldGhvZENvbnRyYXZhcmlhbmNlQ2hlY2tLaW5kLmNoZWNrTWV0aG9kUmV0dXJuKSB7CiAgICAgICAgaWYgKGluZmVycmVyLmluc3RydW1lbnRhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24ucmVjb3JkKAogICAgICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICdjaGVja1JldHVybicsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yVHlwZShyZWFkVHlwZSkpOwogICAgICAgIH0KICAgICAgICByZWFkID0gbmV3IEFzRXhwcmVzc2lvbihyZWFkLCByZWFkVHlwZSkKICAgICAgICAgIC4uaXNUeXBlRXJyb3IgPSB0cnVlCiAgICAgICAgICAuLmlzQ292YXJpYW5jZUNoZWNrID0gdHJ1ZQogICAgICAgICAgLi5pc0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0ID0gaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgfQogICAgfQogICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgaW5mZXJyZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgSW52YWxpZFR5cGUgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUpIHsKICAgICAgICBpZiAoaW5mZXJyZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICAgICAgICByZWFkVHlwZSwKICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgcmVhZCwKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZU9wZXJhdG9yQ2FsbEVycm9yLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICBpbmRleEdldE5hbWUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgICBub0xlbmd0aCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBpbmRleEdldE5hbWUubmFtZSwKICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgICAgICAgICAgICBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICByZWFkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KHJlYWRUeXBlLCByZWFkKTsKICB9CgogIC8vLyBDcmVhdGVzIGFuIGluZGV4IHNldCBvcGVyYXRpb24gb2YgW3dyaXRlVGFyZ2V0XSBvbiBbcmVjZWl2ZXJdIHVzaW5nCiAgLy8vIFtpbmRleF0gYW5kIFt2YWx1ZV0gYXMgdGhlIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gW2ZpbGVPZmZzZXRdIGlzIHVzZWQgYXMgdGhlIGZpbGUgb2Zmc2V0IGZvciBjcmVhdGVkIG5vZGVzLiBbcmVjZWl2ZXJUeXBlXQogIC8vLyBpcyB0aGUgYWxyZWFkeSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBbcmVjZWl2ZXJdIGV4cHJlc3Npb24uIFRoZSBpbmZlcnJlZAogIC8vLyB0eXBlIG9mIFtpbmRleF0gYW5kIFt2YWx1ZV0gbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBjb21wdXRlZC4KICBFeHByZXNzaW9uIF9jb21wdXRlSW5kZXhTZXQoCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB3cml0ZVRhcmdldCwKICAgICAgRXhwcmVzc2lvbiBpbmRleCwKICAgICAgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgRXhwcmVzc2lvbiB3cml0ZTsKICAgIGlmICh3cml0ZVRhcmdldC5pc01pc3NpbmcpIHsKICAgICAgd3JpdGUgPSBpbmZlcnJlci5jcmVhdGVNaXNzaW5nSW5kZXhTZXQoCiAgICAgICAgICBmaWxlT2Zmc2V0LCByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCBpbmRleCwgdmFsdWUsCiAgICAgICAgICBmb3JFZmZlY3Q6IHRydWUsIHJlYWRPbmx5UmVjZWl2ZXI6IHRydWUpOwogICAgfSBlbHNlIGlmICh3cml0ZVRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcikgewogICAgICBhc3NlcnQod3JpdGVUYXJnZXQuZXh0ZW5zaW9uTWV0aG9kS2luZCAhPSBQcm9jZWR1cmVLaW5kLlNldHRlcik7CiAgICAgIHdyaXRlID0gbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICB3cml0ZVRhcmdldC5tZW1iZXIsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltyZWNlaXZlciwgaW5kZXgsIHZhbHVlXSwKICAgICAgICAgICAgICB0eXBlczogd3JpdGVUYXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICB3cml0ZSA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltpbmRleCwgdmFsdWVdKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICB3cml0ZVRhcmdldC5tZW1iZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0KICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmIGluZmVycmVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIGlmIChyZWNlaXZlclR5cGUgaXMhIER5bmFtaWNUeXBlICYmIHJlY2VpdmVyVHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUpIHsKICAgICAgICBpZiAoaW5mZXJyZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgIHJldHVybiBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKICAgICAgICAgICAgICB3cml0ZSwKICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlT3BlcmF0b3JDYWxsRXJyb3Iud2l0aEFyZ3VtZW50cyhpbmRleFNldE5hbWUubmFtZSwKICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLCBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZmVycmVyLmhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVPcGVyYXRvckNhbGxXYXJuaW5nLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGluZGV4U2V0TmFtZS5uYW1lLAogICAgICAgICAgICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgICAgICAgICAgIGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgIHdyaXRlLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgbm9MZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBwcm9wZXJ0eSBnZXQgb2YgW3Byb3BlcnR5TmFtZV0gb24gW3JlY2VpdmVyXSBvZiB0eXBlCiAgLy8vIFtyZWNlaXZlclR5cGVdLgogIC8vLwogIC8vLyBbZmlsZU9mZnNldF0gaXMgdXNlZCBhcyB0aGUgZmlsZSBvZmZzZXQgZm9yIGNyZWF0ZWQgbm9kZXMuIFtyZWNlaXZlclR5cGVdCiAgLy8vIGlzIHRoZSBhbHJlYWR5IGluZmVycmVkIHR5cGUgb2YgdGhlIFtyZWNlaXZlcl0gZXhwcmVzc2lvbi4gVGhlCiAgLy8vIFt0eXBlQ29udGV4dF0gaXMgdXNlZCB0byBjcmVhdGUgaW1wbGljaXQgZ2VuZXJpYyB0ZWFyb2ZmIGluc3RhbnRpYXRpb24KICAvLy8gaWYgbmVjZXNzYXJ5LiBbaXNUaGlzUmVjZWl2ZXJdIG11c3QgYmUgc2V0IHRvIGB0cnVlYCBpZiB0aGUgcmVjZWl2ZXIgaXMgYQogIC8vLyBgdGhpc2AgZXhwcmVzc2lvbi4KICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IF9jb21wdXRlUHJvcGVydHlHZXQoCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE5hbWUgcHJvcGVydHlOYW1lLAogICAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCwKICAgICAge2Jvb2wgaXNUaGlzUmVjZWl2ZXJ9KSB7CiAgICBhc3NlcnQoaXNUaGlzUmVjZWl2ZXIgIT0gbnVsbCk7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHJlYWRUYXJnZXQgPSBpbmZlcnJlci5maW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgIHJlY2VpdmVyVHlwZSwgcHJvcGVydHlOYW1lLCBmaWxlT2Zmc2V0LAogICAgICAgIGluY2x1ZGVFeHRlbnNpb25NZXRob2RzOiB0cnVlKTsKCiAgICBEYXJ0VHlwZSByZWFkVHlwZSA9IGluZmVycmVyLmdldEdldHRlclR5cGUocmVhZFRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKCiAgICBFeHByZXNzaW9uIHJlYWQ7CiAgICBpZiAocmVhZFRhcmdldC5pc01pc3NpbmcpIHsKICAgICAgcmVhZCA9IGluZmVycmVyLmNyZWF0ZU1pc3NpbmdQcm9wZXJ0eUdldCgKICAgICAgICAgIGZpbGVPZmZzZXQsIHJlY2VpdmVyLCByZWNlaXZlclR5cGUsIHByb3BlcnR5TmFtZSk7CiAgICB9IGVsc2UgaWYgKHJlYWRUYXJnZXQuaXNFeHRlbnNpb25NZW1iZXIpIHsKICAgICAgc3dpdGNoIChyZWFkVGFyZ2V0LmV4dGVuc2lvbk1ldGhvZEtpbmQpIHsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICAgICAgcmVhZCA9IG5ldyBTdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgICAgIHJlYWRUYXJnZXQubWVtYmVyLAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICAgICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgXSwgdHlwZXM6IHJlYWRUYXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6CiAgICAgICAgICByZWFkID0gbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgICAgcmVhZFRhcmdldC50ZWFyb2ZmVGFyZ2V0LAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICAgICAgICAgICAgcmVjZWl2ZXIsCiAgICAgICAgICAgICAgXSwgdHlwZXM6IHJlYWRUYXJnZXQuaW5mZXJyZWRFeHRlbnNpb25UeXBlQXJndW1lbnRzKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICAgIHJldHVybiBpbmZlcnJlci5pbnN0YW50aWF0ZVRlYXJPZmYocmVhZFR5cGUsIHR5cGVDb250ZXh0LCByZWFkKTsKICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuU2V0dGVyOgogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgICAgIHVuaGFuZGxlZCgnJHJlYWRUYXJnZXQnLCAiaW5mZXJQcm9wZXJ0eUdldCIsIG51bGwsIG51bGwpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChyZWFkVGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIgJiYKICAgICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmCiAgICAgICAgICByZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbi5yZWNvcmQoCiAgICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgJ3RhcmdldCcsCiAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihyZWFkVGFyZ2V0Lm1lbWJlcikpOwogICAgICB9CiAgICAgIHJlYWQgPSBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXIsIHByb3BlcnR5TmFtZSwgcmVhZFRhcmdldC5tZW1iZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgYm9vbCBjaGVja1JldHVybiA9IGZhbHNlOwogICAgICBpZiAocmVhZFRhcmdldC5pc0luc3RhbmNlTWVtYmVyICYmICFpc1RoaXNSZWNlaXZlcikgewogICAgICAgIE1lbWJlciBpbnRlcmZhY2VNZW1iZXIgPSByZWFkVGFyZ2V0Lm1lbWJlcjsKICAgICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIFByb2NlZHVyZSkgewogICAgICAgICAgY2hlY2tSZXR1cm4gPQogICAgICAgICAgICAgIFR5cGVJbmZlcnJlckltcGwucmV0dXJuZWRUeXBlUGFyYW1ldGVyc09jY3VyTm9uQ292YXJpYW50bHkoCiAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1lbWJlci5lbmNsb3NpbmdDbGFzcywKICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGUpOwogICAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlTWVtYmVyIGlzIEZpZWxkKSB7CiAgICAgICAgICBjaGVja1JldHVybiA9CiAgICAgICAgICAgICAgVHlwZUluZmVycmVySW1wbC5yZXR1cm5lZFR5cGVQYXJhbWV0ZXJzT2NjdXJOb25Db3ZhcmlhbnRseSgKICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzLCBpbnRlcmZhY2VNZW1iZXIudHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaGVja1JldHVybikgewogICAgICAgIGlmIChpbmZlcnJlci5pbnN0cnVtZW50YXRpb24gIT0gbnVsbCkgewogICAgICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uLnJlY29yZCgKICAgICAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgICAnY2hlY2tSZXR1cm4nLAogICAgICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUocmVhZFR5cGUpKTsKICAgICAgICB9CiAgICAgICAgcmVhZCA9IG5ldyBBc0V4cHJlc3Npb24ocmVhZCwgcmVhZFR5cGUpCiAgICAgICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAgICAgLi5pc0NvdmFyaWFuY2VDaGVjayA9IHRydWUKICAgICAgICAgIC4uaXNGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdCA9IGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICAgIH0KICAgICAgTWVtYmVyIG1lbWJlciA9IHJlYWRUYXJnZXQubWVtYmVyOwogICAgICBpZiAobWVtYmVyIGlzIFByb2NlZHVyZSAmJiBtZW1iZXIua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICAgIHJldHVybiBpbmZlcnJlci5pbnN0YW50aWF0ZVRlYXJPZmYocmVhZFR5cGUsIHR5cGVDb250ZXh0LCByZWFkKTsKICAgICAgfQogICAgfQogICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgaW5mZXJyZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgaWYgKHJlY2VpdmVyVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZSBpcyEgSW52YWxpZFR5cGUgJiYKICAgICAgICAgIHJlY2VpdmVyVHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUgJiYKICAgICAgICAgICFpbmZlcnJlci5tYXRjaGVzT2JqZWN0TWVtYmVyQ2FsbCgKICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsIGNvbnN0IFtdLCBjb25zdCBbXSwgY29uc3QgW10pKSB7CiAgICAgICAgaWYgKGluZmVycmVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICAgICAgcmVhZFR5cGUsCiAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHJlYWQsCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc0Vycm9yLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUubmFtZS5sZW5ndGgpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzV2FybmluZy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUubmFtZSwKICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgICAgICAgICAgICBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICByZWFkLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLm5hbWUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChyZWFkVHlwZSwgcmVhZCk7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIHByb3BlcnR5IHNldCBvcGVyYXRpb24gb2YgW3dyaXRlVGFyZ2V0XSBvbiBbcmVjZWl2ZXJdIHVzaW5nCiAgLy8vIFt2YWx1ZV0gYXMgdGhlIHJpZ2h0LWhhbmQgc2lkZS4KICAvLy8KICAvLy8gW2ZpbGVPZmZzZXRdIGlzIHVzZWQgYXMgdGhlIGZpbGUgb2Zmc2V0IGZvciBjcmVhdGVkIG5vZGVzLiBbcHJvcGVydHlOYW1lXQogIC8vLyBpcyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuIFtyZWNlaXZlclR5cGVdIGlzIHRoZSBhbHJlYWR5IGluZmVycmVkIHR5cGUKICAvLy8gb2YgdGhlIFtyZWNlaXZlcl0gZXhwcmVzc2lvbi4gVGhlIGluZmVycmVkIHR5cGUgb2YgW3ZhbHVlXSBtdXN0IGFscmVhZHkKICAvLy8gaGF2ZSBiZWVuIGNvbXB1dGVkLgogIC8vLwogIC8vLyBJZiBbZm9yRWZmZWN0XSB0aGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gaXMgZW5zdXJlZCB0byByZXR1cm4gdGhlIFt2YWx1ZV0KICAvLy8gb2Ygc3RhdGljIHR5cGUgW3ZhbHVlVHlwZV0uIFRoaXMgaXMgbmVlZGVkIGZvciBleHRlbnNpb24gc2V0dGVycyB3aGljaCBhcmUKICAvLy8gZW5jb2RlZCBhcyBzdGF0aWMgbWV0aG9kIGNhbGxzIHRoYXQgZG8gbm90IGltcGxpY2l0bHkgcmV0dXJuIHRoZSB2YWx1ZS4KICBFeHByZXNzaW9uIF9jb21wdXRlUHJvcGVydHlTZXQoCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLAogICAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGUsCiAgICAgIE5hbWUgcHJvcGVydHlOYW1lLAogICAgICBPYmplY3RBY2Nlc3NUYXJnZXQgd3JpdGVUYXJnZXQsCiAgICAgIEV4cHJlc3Npb24gdmFsdWUsCiAgICAgIHtEYXJ0VHlwZSB2YWx1ZVR5cGUsCiAgICAgIGJvb2wgZm9yRWZmZWN0fSkgewogICAgYXNzZXJ0KGZvckVmZmVjdCAhPSBudWxsKTsKICAgIGFzc2VydChmb3JFZmZlY3QgfHwgdmFsdWVUeXBlICE9IG51bGwsCiAgICAgICAgIk5vIHZhbHVlIHR5cGUgcHJvdmlkZWQgZm9yIHByb3BlcnR5IHNldCBuZWVkZWQgZm9yIHZhbHVlLiIpOwogICAgRXhwcmVzc2lvbiB3cml0ZTsKICAgIGlmICh3cml0ZVRhcmdldC5pc01pc3NpbmcpIHsKICAgICAgd3JpdGUgPSBpbmZlcnJlci5jcmVhdGVNaXNzaW5nUHJvcGVydHlTZXQoCiAgICAgICAgICBmaWxlT2Zmc2V0LCByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLAogICAgICAgICAgZm9yRWZmZWN0OiBmb3JFZmZlY3QpOwogICAgfSBlbHNlIGlmICh3cml0ZVRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcikgewogICAgICBpZiAoZm9yRWZmZWN0KSB7CiAgICAgICAgd3JpdGUgPSBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgd3JpdGVUYXJnZXQubWVtYmVyLAogICAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPltyZWNlaXZlciwgdmFsdWVdLAogICAgICAgICAgICAgICAgdHlwZXM6IHdyaXRlVGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZSh2YWx1ZSwgdmFsdWVUeXBlKTsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGFzc2lnbm1lbnRWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKAogICAgICAgICAgICBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICAgIHdyaXRlVGFyZ2V0Lm1lbWJlciwKICAgICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgPEV4cHJlc3Npb24+W3JlY2VpdmVyLCBjcmVhdGVWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKV0sCiAgICAgICAgICAgICAgICAgICAgdHlwZXM6IHdyaXRlVGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50cykKICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICBjb25zdCBWb2lkVHlwZSgpKTsKICAgICAgICB3cml0ZSA9IGNyZWF0ZUxldCh2YWx1ZVZhcmlhYmxlLAogICAgICAgICAgICBjcmVhdGVMZXQoYXNzaWdubWVudFZhcmlhYmxlLCBjcmVhdGVWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3cml0ZSA9IG5ldyBQcm9wZXJ0eVNldChyZWNlaXZlciwgcHJvcGVydHlOYW1lLCB2YWx1ZSwgd3JpdGVUYXJnZXQubWVtYmVyKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJiBpbmZlcnJlci5wZXJmb3JtTm5iZENoZWNrcykgewogICAgICBpZiAocmVjZWl2ZXJUeXBlIGlzISBEeW5hbWljVHlwZSAmJiByZWNlaXZlclR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAgICAgaWYgKGluZmVycmVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICByZXR1cm4gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCiAgICAgICAgICAgICAgd3JpdGUsCiAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzRXJyb3Iud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLm5hbWUsCiAgICAgICAgICAgICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICAgICAgICAgICAgaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCksCiAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLm5hbWUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzV2FybmluZy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUubmFtZSwKICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJUeXBlLAogICAgICAgICAgICAgICAgICBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICB3cml0ZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5uYW1lLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHdyaXRlOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdENvbXBvdW5kSW5kZXhTZXQoCiAgICAgIENvbXBvdW5kSW5kZXhTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVjZWl2ZXJSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5yZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZHM7CiAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGU7CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBudWxsQXdhcmVHdWFyZHMgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVHdWFyZHM7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXJSZXN1bHQubnVsbEF3YXJlQWN0aW9uOwogICAgICByZWNlaXZlclR5cGUgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb25UeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlclJlc3VsdC5leHByZXNzaW9uOwogICAgICByZWNlaXZlclR5cGUgPSByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICB9CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHJlYWRSZWNlaXZlciA9IHJlY2VpdmVyOwogICAgRXhwcmVzc2lvbiB3cml0ZVJlY2VpdmVyOwogICAgaWYgKG5vZGUucmVhZE9ubHlSZWNlaXZlcikgewogICAgICB3cml0ZVJlY2VpdmVyID0gX2Nsb25lKHJlYWRSZWNlaXZlcik7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlclZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVhZFJlY2VpdmVyLCByZWNlaXZlclR5cGUpOwogICAgICByZWFkUmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgICAgd3JpdGVSZWNlaXZlciA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlY2VpdmVyVmFyaWFibGUpOwogICAgfQoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCByZWFkVGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICByZWNlaXZlclR5cGUsIGluZGV4R2V0TmFtZSwgbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgIGluY2x1ZGVFeHRlbnNpb25NZXRob2RzOiB0cnVlKTsKCiAgICBNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZCByZWFkQ2hlY2tLaW5kID0KICAgICAgICBpbmZlcnJlci5wcmVDaGVja0ludm9jYXRpb25Db250cmF2YXJpYW5jZShyZWNlaXZlclR5cGUsIHJlYWRUYXJnZXQsCiAgICAgICAgICAgIGlzVGhpc1JlY2VpdmVyOiBub2RlLnJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKTsKCiAgICBEYXJ0VHlwZSByZWFkSW5kZXhUeXBlID0gaW5mZXJyZXIuZ2V0SW5kZXhLZXlUeXBlKHJlYWRUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBpbmRleFJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLmluZGV4LCByZWFkSW5kZXhUeXBlLCB0cnVlLCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gaW5kZXhWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlRm9yUmVzdWx0KGluZGV4UmVzdWx0KTsKCiAgICBFeHByZXNzaW9uIHJlYWRJbmRleCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogICAgcmVhZEluZGV4ID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKICAgICAgICByZWFkSW5kZXhUeXBlLCBpbmRleFJlc3VsdC5pbmZlcnJlZFR5cGUsIHJlYWRJbmRleCk7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWFkUmVzdWx0ID0gX2NvbXB1dGVJbmRleEdldChub2RlLnJlYWRPZmZzZXQsCiAgICAgICAgcmVhZFJlY2VpdmVyLCByZWNlaXZlclR5cGUsIHJlYWRUYXJnZXQsIHJlYWRJbmRleCwgcmVhZENoZWNrS2luZCk7CiAgICBFeHByZXNzaW9uIHJlYWQgPSByZWFkUmVzdWx0LmV4cHJlc3Npb247CiAgICBEYXJ0VHlwZSByZWFkVHlwZSA9IHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gbGVmdFZhcmlhYmxlOwogICAgRXhwcmVzc2lvbiBsZWZ0OwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIGxlZnQgPSByZWFkOwogICAgfSBlbHNlIGlmIChub2RlLmZvclBvc3RJbmNEZWMpIHsKICAgICAgbGVmdFZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVhZCwgcmVhZFR5cGUpOwogICAgICBsZWZ0ID0gY3JlYXRlVmFyaWFibGVHZXQobGVmdFZhcmlhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlZnQgPSByZWFkOwogICAgfQoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYmluYXJ5UmVzdWx0ID0gX2NvbXB1dGVCaW5hcnlFeHByZXNzaW9uKAogICAgICAgIG5vZGUuYmluYXJ5T2Zmc2V0LCBsZWZ0LCByZWFkVHlwZSwgbm9kZS5iaW5hcnlOYW1lLCBub2RlLnJocyk7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IGJpbmFyeVJlc3VsdC5leHByZXNzaW9uOwogICAgRGFydFR5cGUgYmluYXJ5VHlwZSA9IGJpbmFyeVJlc3VsdC5pbmZlcnJlZFR5cGU7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICByZWNlaXZlclR5cGUsIGluZGV4U2V0TmFtZSwgbm9kZS53cml0ZU9mZnNldCwKICAgICAgICBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSk7CgogICAgRGFydFR5cGUgd3JpdGVJbmRleFR5cGUgPQogICAgICAgIGluZmVycmVyLmdldEluZGV4S2V5VHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEV4cHJlc3Npb24gd3JpdGVJbmRleCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogICAgd3JpdGVJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgd3JpdGVJbmRleFR5cGUsIGluZGV4UmVzdWx0LmluZmVycmVkVHlwZSwgd3JpdGVJbmRleCk7CgogICAgRGFydFR5cGUgdmFsdWVUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleFNldFZhbHVlVHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIGJpbmFyeSA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUodmFsdWVUeXBlLCBiaW5hcnlUeXBlLCBiaW5hcnksCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbjsKICAgIGlmIChub2RlLmZvckVmZmVjdCB8fCBub2RlLmZvclBvc3RJbmNEZWMpIHsKICAgICAgdmFsdWVFeHByZXNzaW9uID0gYmluYXJ5OwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKGJpbmFyeSwgYmluYXJ5VHlwZSk7CiAgICAgIHZhbHVlRXhwcmVzc2lvbiA9IGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpOwogICAgfQoKICAgIEV4cHJlc3Npb24gd3JpdGUgPSBfY29tcHV0ZUluZGV4U2V0KG5vZGUud3JpdGVPZmZzZXQsIHdyaXRlUmVjZWl2ZXIsCiAgICAgICAgcmVjZWl2ZXJUeXBlLCB3cml0ZVRhcmdldCwgd3JpdGVJbmRleCwgdmFsdWVFeHByZXNzaW9uKTsKCiAgICBFeHByZXNzaW9uIGlubmVyOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIGFzc2VydChsZWZ0VmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlID09IG51bGwpOwogICAgICAvLyBFbmNvZGUgYG9bYV0gKz0gYmAgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgdjEgPSBvIGluIGxldCB2MiA9IGEgaW4gdjEuW109KHYyLCB2MS5bXSh2MikgKyBiKQogICAgICAvLwogICAgICBpbm5lciA9IGNyZWF0ZUxldChpbmRleFZhcmlhYmxlLCB3cml0ZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUuZm9yUG9zdEluY0RlYykgewogICAgICAvLyBFbmNvZGUgYG9bYV0rK2AgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgdjEgPSBvIGluCiAgICAgIC8vICAgICBsZXQgdjIgPSBhIGluCiAgICAgIC8vICAgICBsZXQgdjMgPSB2MS5bXSh2MikKICAgICAgLy8gICAgIGxldCB2NCA9IHYxLltdPSh2MiwgYzMgKyBiKSBpbiB2MwogICAgICAvLwogICAgICBhc3NlcnQobGVmdFZhcmlhYmxlICE9IG51bGwpOwogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSA9PSBudWxsKTsKCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGVWYXJpYWJsZSA9CiAgICAgICAgICBjcmVhdGVWYXJpYWJsZSh3cml0ZSwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICAgIGlubmVyID0gY3JlYXRlTGV0KAogICAgICAgICAgaW5kZXhWYXJpYWJsZSwKICAgICAgICAgIGNyZWF0ZUxldChsZWZ0VmFyaWFibGUsCiAgICAgICAgICAgICAgY3JlYXRlTGV0KHdyaXRlVmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KGxlZnRWYXJpYWJsZSkpKSk7CiAgICB9IGVsc2UgewogICAgICAvLyBFbmNvZGUgYG9bYV0gKz0gYmAgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgdjEgPSBvIGluCiAgICAgIC8vICAgICBsZXQgdjIgPSBhIGluCiAgICAgIC8vICAgICBsZXQgdjMgPSB2MS5bXSh2MikgKyBiCiAgICAgIC8vICAgICBsZXQgdjQgPSB2MS5bXT0odjIsIGMzKSBpbiB2MwogICAgICAvLwogICAgICBhc3NlcnQobGVmdFZhcmlhYmxlID09IG51bGwpOwogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSAhPSBudWxsKTsKCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGVWYXJpYWJsZSA9CiAgICAgICAgICBjcmVhdGVWYXJpYWJsZSh3cml0ZSwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICAgIGlubmVyID0gY3JlYXRlTGV0KAogICAgICAgICAgaW5kZXhWYXJpYWJsZSwKICAgICAgICAgIGNyZWF0ZUxldCh2YWx1ZVZhcmlhYmxlLAogICAgICAgICAgICAgIGNyZWF0ZUxldCh3cml0ZVZhcmlhYmxlLCBjcmVhdGVWYXJpYWJsZUdldCh2YWx1ZVZhcmlhYmxlKSkpKTsKICAgIH0KCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50OwogICAgaWYgKHJlY2VpdmVyVmFyaWFibGUgIT0gbnVsbCkgewogICAgICByZXBsYWNlbWVudCA9IG5ldyBMZXQocmVjZWl2ZXJWYXJpYWJsZSwgaW5uZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OwogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZW1lbnQgPSBpbm5lcjsKICAgIH0KICAgIHJldHVybiBpbmZlcnJlci5jcmVhdGVOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIG5vZGUuZm9yUG9zdEluY0RlYyA/IHJlYWRUeXBlIDogYmluYXJ5VHlwZSwKICAgICAgICByZXBsYWNlbWVudCwKICAgICAgICBudWxsQXdhcmVHdWFyZHMpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdE51bGxBd2FyZUNvbXBvdW5kU2V0KAogICAgICBOdWxsQXdhcmVDb21wb3VuZFNldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWNlaXZlclJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgICByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGUsICI/LiIsIG5vZGUucmVjZWl2ZXIuZmlsZU9mZnNldCk7CgogICAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkczsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXJSZXN1bHQubnVsbEF3YXJlQWN0aW9uOwogICAgICByZWNlaXZlclR5cGUgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb25UeXBlOwogICAgICBudWxsQXdhcmVHdWFyZHMgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVHdWFyZHM7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0LmV4cHJlc3Npb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0LmluZmVycmVkVHlwZTsKICAgICAgbnVsbEF3YXJlR3VhcmRzID0gY29uc3QgTGluazxOdWxsQXdhcmVHdWFyZD4oKTsKICAgIH0KCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGUgPQogICAgICAgIGNyZWF0ZVZhcmlhYmxlKHJlY2VpdmVyLCByZWNlaXZlclR5cGUpOwogICAgTnVsbEF3YXJlR3VhcmQgbnVsbEF3YXJlR3VhcmQgPQogICAgICAgIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUd1YXJkKHJlY2VpdmVyVmFyaWFibGUpOwogICAgRXhwcmVzc2lvbiByZWFkUmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIEV4cHJlc3Npb24gd3JpdGVSZWNlaXZlciA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlY2VpdmVyVmFyaWFibGUpOwogICAgRGFydFR5cGUgbm9uTnVsbFJlY2VpdmVyVHlwZSA9IGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZShyZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVhZFJlc3VsdCA9IF9jb21wdXRlUHJvcGVydHlHZXQoCiAgICAgICAgbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgIHJlYWRSZWNlaXZlciwKICAgICAgICBub25OdWxsUmVjZWl2ZXJUeXBlLAogICAgICAgIG5vZGUucHJvcGVydHlOYW1lLAogICAgICAgIGNvbnN0IFVua25vd25UeXBlKCksCiAgICAgICAgaXNUaGlzUmVjZWl2ZXI6IG5vZGUucmVjZWl2ZXIgaXMgVGhpc0V4cHJlc3Npb24pOwogICAgRXhwcmVzc2lvbiByZWFkID0gcmVhZFJlc3VsdC5leHByZXNzaW9uOwogICAgRGFydFR5cGUgcmVhZFR5cGUgPSByZWFkUmVzdWx0LmluZmVycmVkVHlwZTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGxlZnRWYXJpYWJsZTsKICAgIEV4cHJlc3Npb24gbGVmdDsKICAgIGlmIChub2RlLmZvckVmZmVjdCkgewogICAgICBsZWZ0ID0gcmVhZDsKICAgIH0gZWxzZSBpZiAobm9kZS5mb3JQb3N0SW5jRGVjKSB7CiAgICAgIGxlZnRWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKHJlYWQsIHJlYWRUeXBlKTsKICAgICAgbGVmdCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGxlZnRWYXJpYWJsZSk7CiAgICB9IGVsc2UgewogICAgICBsZWZ0ID0gcmVhZDsKICAgIH0KCiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGJpbmFyeVJlc3VsdCA9IF9jb21wdXRlQmluYXJ5RXhwcmVzc2lvbigKICAgICAgICBub2RlLmJpbmFyeU9mZnNldCwgbGVmdCwgcmVhZFR5cGUsIG5vZGUuYmluYXJ5TmFtZSwgbm9kZS5yaHMpOwogICAgRXhwcmVzc2lvbiBiaW5hcnkgPSBiaW5hcnlSZXN1bHQuZXhwcmVzc2lvbjsKICAgIERhcnRUeXBlIGJpbmFyeVR5cGUgPSBiaW5hcnlSZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCB3cml0ZVRhcmdldCA9IGluZmVycmVyLmZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgbm9uTnVsbFJlY2VpdmVyVHlwZSwgbm9kZS5wcm9wZXJ0eU5hbWUsIG5vZGUud3JpdGVPZmZzZXQsCiAgICAgICAgc2V0dGVyOiB0cnVlLCBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSk7CgogICAgRGFydFR5cGUgdmFsdWVUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRTZXR0ZXJUeXBlKHdyaXRlVGFyZ2V0LCBub25OdWxsUmVjZWl2ZXJUeXBlKTsKICAgIGJpbmFyeSA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUodmFsdWVUeXBlLCBiaW5hcnlUeXBlLCBiaW5hcnksCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhbHVlVmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbjsKICAgIGlmIChub2RlLmZvckVmZmVjdCB8fCBub2RlLmZvclBvc3RJbmNEZWMpIHsKICAgICAgdmFsdWVFeHByZXNzaW9uID0gYmluYXJ5OwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVWYXJpYWJsZSA9IGNyZWF0ZVZhcmlhYmxlKGJpbmFyeSwgYmluYXJ5VHlwZSk7CiAgICAgIHZhbHVlRXhwcmVzc2lvbiA9IGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpOwogICAgfQoKICAgIEV4cHJlc3Npb24gd3JpdGUgPSBfY29tcHV0ZVByb3BlcnR5U2V0KG5vZGUud3JpdGVPZmZzZXQsIHdyaXRlUmVjZWl2ZXIsCiAgICAgICAgbm9uTnVsbFJlY2VpdmVyVHlwZSwgbm9kZS5wcm9wZXJ0eU5hbWUsIHdyaXRlVGFyZ2V0LCB2YWx1ZUV4cHJlc3Npb24sCiAgICAgICAgZm9yRWZmZWN0OiB0cnVlKTsKCiAgICBEYXJ0VHlwZSByZXN1bHRUeXBlID0gbm9kZS5mb3JQb3N0SW5jRGVjID8gcmVhZFR5cGUgOiBiaW5hcnlUeXBlOwoKICAgIEV4cHJlc3Npb24gYWN0aW9uOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIGFzc2VydChsZWZ0VmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlID09IG51bGwpOwogICAgICAvLyBFbmNvZGUgYHJlY2VpdmVyPy5wcm9wZXJ0eU5hbWUgYmluYXJ5TmFtZT0gcmhzYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KICAgICAgLy8gICAgICAgcmVjZWl2ZXJWYXJpYWJsZSA9PSBudWxsID8gbnVsbCA6CiAgICAgIC8vICAgICAgICAgcmVjZWl2ZXJWYXJpYWJsZS5wcm9wZXJ0eU5hbWUgPQogICAgICAvLyAgICAgICAgICAgICByZWNlaXZlclZhcmlhYmxlLnByb3BlcnR5TmFtZSArIHJocwogICAgICAvLwoKICAgICAgYWN0aW9uID0gd3JpdGU7CiAgICB9IGVsc2UgaWYgKG5vZGUuZm9yUG9zdEluY0RlYykgewogICAgICAvLyBFbmNvZGUgYHJlY2VpdmVyPy5wcm9wZXJ0eU5hbWUgYmluYXJ5TmFtZT0gcmhzYCBmcm9tIGEgcG9zdGZpeAogICAgICAvLyBleHByZXNzaW9uIGxpa2UgYG8/LmErK2AgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IHJlY2VpdmVyIGluCiAgICAgIC8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUgPT0gbnVsbCA/IG51bGwgOgogICAgICAvLyAgICAgICAgIGxldCBsZWZ0VmFyaWFibGUgPSByZWNlaXZlclZhcmlhYmxlLnByb3BlcnR5TmFtZSBpbgogICAgICAvLyAgICAgICAgICAgbGV0IHdyaXRlVmFyaWFibGUgPQogICAgICAvLyAgICAgICAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUucHJvcGVydHlOYW1lID0KICAgICAgLy8gICAgICAgICAgICAgICAgICAgbGVmdFZhcmlhYmxlIGJpbmFyeU5hbWUgcmhzIGluCiAgICAgIC8vICAgICAgICAgICAgIGxlZnRWYXJpYWJsZQogICAgICAvLwogICAgICBhc3NlcnQobGVmdFZhcmlhYmxlICE9IG51bGwpOwogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSA9PSBudWxsKTsKCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gd3JpdGVWYXJpYWJsZSA9CiAgICAgICAgICBjcmVhdGVWYXJpYWJsZSh3cml0ZSwgY29uc3QgVm9pZFR5cGUoKSk7CiAgICAgIGFjdGlvbiA9IGNyZWF0ZUxldChsZWZ0VmFyaWFibGUsCiAgICAgICAgICBjcmVhdGVMZXQod3JpdGVWYXJpYWJsZSwgY3JlYXRlVmFyaWFibGVHZXQobGVmdFZhcmlhYmxlKSkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb2RlIGByZWNlaXZlcj8ucHJvcGVydHlOYW1lIGJpbmFyeU5hbWU9IHJoc2AgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IHJlY2VpdmVyIGluCiAgICAgIC8vICAgICAgIHJlY2VpdmVyVmFyaWFibGUgPT0gbnVsbCA/IG51bGwgOgogICAgICAvLyAgICAgICAgIGxldCBsZWZ0VmFyaWFibGUgPSByZWNlaXZlclZhcmlhYmxlLnByb3BlcnR5TmFtZSBpbgogICAgICAvLyAgICAgICAgICAgbGV0IHZhbHVlVmFyaWFibGUgPSBsZWZ0VmFyaWFibGUgYmluYXJ5TmFtZSByaHMgaW4KICAgICAgLy8gICAgICAgICAgICAgbGV0IHdyaXRlVmFyaWFibGUgPQogICAgICAvLyAgICAgICAgICAgICAgICAgcmVjZWl2ZXJWYXJpYWJsZS5wcm9wZXJ0eU5hbWUgPSB2YWx1ZVZhcmlhYmxlIGluCiAgICAgIC8vICAgICAgICAgICAgICAgdmFsdWVWYXJpYWJsZQogICAgICAvLwogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBEbyB3ZSBuZWVkIHRoZSBgbGVmdFZhcmlhYmxlYCBpbiB0aGlzIGNhc2U/CiAgICAgIGFzc2VydChsZWZ0VmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlICE9IG51bGwpOwoKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB3cml0ZVZhcmlhYmxlID0KICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlKHdyaXRlLCBjb25zdCBWb2lkVHlwZSgpKTsKICAgICAgYWN0aW9uID0gY3JlYXRlTGV0KHZhbHVlVmFyaWFibGUsCiAgICAgICAgICBjcmVhdGVMZXQod3JpdGVWYXJpYWJsZSwgY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSkpKTsKICAgIH0KCiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICByZXN1bHRUeXBlLCBhY3Rpb24sIG51bGxBd2FyZUd1YXJkcy5wcmVwZW5kKG51bGxBd2FyZUd1YXJkKSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0Q29tcG91bmRTdXBlckluZGV4U2V0KAogICAgICBDb21wb3VuZFN1cGVySW5kZXhTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIE9iamVjdEFjY2Vzc1RhcmdldCByZWFkVGFyZ2V0ID0gbm9kZS5nZXR0ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IE9iamVjdEFjY2Vzc1RhcmdldC5pbnRlcmZhY2VNZW1iZXIobm9kZS5nZXR0ZXIpCiAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpOwoKICAgIERhcnRUeXBlIHJlYWRUeXBlID0gaW5mZXJyZXIuZ2V0UmV0dXJuVHlwZShyZWFkVGFyZ2V0LCBpbmZlcnJlci50aGlzVHlwZSk7CiAgICBEYXJ0VHlwZSByZWFkSW5kZXhUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleEtleVR5cGUocmVhZFRhcmdldCwgaW5mZXJyZXIudGhpc1R5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5kZXhSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS5pbmRleCwgcmVhZEluZGV4VHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZUZvclJlc3VsdChpbmRleFJlc3VsdCk7CgogICAgRXhwcmVzc2lvbiByZWFkSW5kZXggPSBjcmVhdGVWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICAgIHJlYWRJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgcmVhZEluZGV4VHlwZSwgaW5kZXhSZXN1bHQuaW5mZXJyZWRUeXBlLCByZWFkSW5kZXgpOwoKICAgIEV4cHJlc3Npb24gcmVhZDsKICAgIGlmIChyZWFkVGFyZ2V0LmlzTWlzc2luZykgewogICAgICByZWFkID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ1N1cGVySW5kZXhHZXQobm9kZS5yZWFkT2Zmc2V0LCByZWFkSW5kZXgpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHJlYWRUYXJnZXQuaXNJbnN0YW5jZU1lbWJlcik7CiAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbj8ucmVjb3JkKAogICAgICAgICAgaW5mZXJyZXIudXJpRm9ySW5zdHJ1bWVudGF0aW9uLAogICAgICAgICAgbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgICAgJ3RhcmdldCcsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JNZW1iZXIobm9kZS5nZXR0ZXIpKTsKICAgICAgcmVhZCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBpbmRleEdldE5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgcmVhZEluZGV4LAogICAgICAgICAgXSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgICAgcmVhZFRhcmdldC5tZW1iZXIpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5yZWFkT2Zmc2V0OwogICAgfQoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gbGVmdFZhcmlhYmxlOwogICAgRXhwcmVzc2lvbiBsZWZ0OwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIGxlZnQgPSByZWFkOwogICAgfSBlbHNlIGlmIChub2RlLmZvclBvc3RJbmNEZWMpIHsKICAgICAgbGVmdFZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVhZCwgcmVhZFR5cGUpOwogICAgICBsZWZ0ID0gY3JlYXRlVmFyaWFibGVHZXQobGVmdFZhcmlhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlZnQgPSByZWFkOwogICAgfQoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYmluYXJ5UmVzdWx0ID0gX2NvbXB1dGVCaW5hcnlFeHByZXNzaW9uKAogICAgICAgIG5vZGUuYmluYXJ5T2Zmc2V0LCBsZWZ0LCByZWFkVHlwZSwgbm9kZS5iaW5hcnlOYW1lLCBub2RlLnJocyk7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IGJpbmFyeVJlc3VsdC5leHByZXNzaW9uOwogICAgRGFydFR5cGUgYmluYXJ5VHlwZSA9IGJpbmFyeVJlc3VsdC5pbmZlcnJlZFR5cGU7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gbm9kZS5zZXR0ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IE9iamVjdEFjY2Vzc1RhcmdldC5pbnRlcmZhY2VNZW1iZXIobm9kZS5zZXR0ZXIpCiAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpOwoKICAgIERhcnRUeXBlIHdyaXRlSW5kZXhUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleEtleVR5cGUod3JpdGVUYXJnZXQsIGluZmVycmVyLnRoaXNUeXBlKTsKICAgIEV4cHJlc3Npb24gd3JpdGVJbmRleCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogICAgd3JpdGVJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgd3JpdGVJbmRleFR5cGUsIGluZGV4UmVzdWx0LmluZmVycmVkVHlwZSwgd3JpdGVJbmRleCk7CgogICAgRGFydFR5cGUgdmFsdWVUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleFNldFZhbHVlVHlwZSh3cml0ZVRhcmdldCwgaW5mZXJyZXIudGhpc1R5cGUpOwogICAgRXhwcmVzc2lvbiBiaW5hcnlSZXBsYWNlbWVudCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgdmFsdWVUeXBlLCBiaW5hcnlUeXBlLCBiaW5hcnksCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0KTsKICAgIGlmIChiaW5hcnlSZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgIGJpbmFyeSA9IGJpbmFyeVJlcGxhY2VtZW50OwogICAgfQoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFsdWVWYXJpYWJsZTsKICAgIEV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0IHx8IG5vZGUuZm9yUG9zdEluY0RlYykgewogICAgICB2YWx1ZUV4cHJlc3Npb24gPSBiaW5hcnk7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUoYmluYXJ5LCBiaW5hcnlUeXBlKTsKICAgICAgdmFsdWVFeHByZXNzaW9uID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiB3cml0ZTsKCiAgICBpZiAod3JpdGVUYXJnZXQuaXNNaXNzaW5nKSB7CiAgICAgIHdyaXRlID0gaW5mZXJyZXIuY3JlYXRlTWlzc2luZ1N1cGVySW5kZXhTZXQoCiAgICAgICAgICBub2RlLndyaXRlT2Zmc2V0LCB3cml0ZUluZGV4LCB2YWx1ZUV4cHJlc3Npb24pOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KHdyaXRlVGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpOwogICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24/LnJlY29yZCgKICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgIG5vZGUud3JpdGVPZmZzZXQsCiAgICAgICAgICAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLnNldHRlcikpOwogICAgICB3cml0ZSA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBpbmRleFNldE5hbWUsCiAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlt3cml0ZUluZGV4LCB2YWx1ZUV4cHJlc3Npb25dKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLndyaXRlT2Zmc2V0LAogICAgICAgICAgd3JpdGVUYXJnZXQubWVtYmVyKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUud3JpdGVPZmZzZXQ7CiAgICB9CgogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudDsKICAgIGlmIChub2RlLmZvckVmZmVjdCkgewogICAgICBhc3NlcnQobGVmdFZhcmlhYmxlID09IG51bGwpOwogICAgICBhc3NlcnQodmFsdWVWYXJpYWJsZSA9PSBudWxsKTsKICAgICAgLy8gRW5jb2RlIGBzdXBlclthXSArPSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCB2MSA9IGEgaW4gc3VwZXIuW109KHYxLCBzdXBlci5bXSh2MSkgKyBiKQogICAgICAvLwogICAgICByZXBsYWNlbWVudCA9IGNyZWF0ZUxldChpbmRleFZhcmlhYmxlLCB3cml0ZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUuZm9yUG9zdEluY0RlYykgewogICAgICAvLyBFbmNvZGUgYHN1cGVyW2FdKytgIGFzOgogICAgICAvLwogICAgICAvLyAgICAgbGV0IHYyID0gYSBpbgogICAgICAvLyAgICAgbGV0IHYzID0gdjEuW10odjIpCiAgICAgIC8vICAgICBsZXQgdjQgPSB2MS5bXT0odjIsIHYzICsgMSkgaW4gdjMKICAgICAgLy8KICAgICAgYXNzZXJ0KGxlZnRWYXJpYWJsZSAhPSBudWxsKTsKICAgICAgYXNzZXJ0KHZhbHVlVmFyaWFibGUgPT0gbnVsbCk7CgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlVmFyaWFibGUgPQogICAgICAgICAgY3JlYXRlVmFyaWFibGUod3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgICByZXBsYWNlbWVudCA9IGNyZWF0ZUxldCgKICAgICAgICAgIGluZGV4VmFyaWFibGUsCiAgICAgICAgICBjcmVhdGVMZXQobGVmdFZhcmlhYmxlLAogICAgICAgICAgICAgIGNyZWF0ZUxldCh3cml0ZVZhcmlhYmxlLCBjcmVhdGVWYXJpYWJsZUdldChsZWZ0VmFyaWFibGUpKSkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb2RlIGBzdXBlclthXSArPSBiYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCB2MSA9IG8gaW4KICAgICAgLy8gICAgIGxldCB2MiA9IGEgaW4KICAgICAgLy8gICAgIGxldCB2MyA9IHYxLltdKHYyKSArIGIKICAgICAgLy8gICAgIGxldCB2NCA9IHYxLltdPSh2MiwgYzMpIGluIHYzCiAgICAgIC8vCiAgICAgIGFzc2VydChsZWZ0VmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIGFzc2VydCh2YWx1ZVZhcmlhYmxlICE9IG51bGwpOwoKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB3cml0ZVZhcmlhYmxlID0KICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlKHdyaXRlLCBjb25zdCBWb2lkVHlwZSgpKTsKICAgICAgcmVwbGFjZW1lbnQgPSBjcmVhdGVMZXQoCiAgICAgICAgICBpbmRleFZhcmlhYmxlLAogICAgICAgICAgY3JlYXRlTGV0KHZhbHVlVmFyaWFibGUsCiAgICAgICAgICAgICAgY3JlYXRlTGV0KHdyaXRlVmFyaWFibGUsIGNyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyaWFibGUpKSkpOwogICAgfQoKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBub2RlLmZvclBvc3RJbmNEZWMgPyByZWFkVHlwZSA6IGJpbmFyeVR5cGUsIHJlcGxhY2VtZW50KTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRDb21wb3VuZEV4dGVuc2lvbkluZGV4U2V0KAogICAgICBDb21wb3VuZEV4dGVuc2lvbkluZGV4U2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlY2VpdmVyUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUucmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwoKICAgIExpc3Q8RGFydFR5cGU+IGV4dGVuc2lvblR5cGVBcmd1bWVudHMgPQogICAgICAgIGluZmVycmVyLmNvbXB1dGVFeHRlbnNpb25UeXBlQXJndW1lbnQobm9kZS5leHRlbnNpb24sCiAgICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlQXJndW1lbnRzLCByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGUpOwoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCByZWFkVGFyZ2V0ID0gbm9kZS5nZXR0ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IEV4dGVuc2lvbkFjY2Vzc1RhcmdldCgKICAgICAgICAgICAgbm9kZS5nZXR0ZXIsIG51bGwsIFByb2NlZHVyZUtpbmQuT3BlcmF0b3IsIGV4dGVuc2lvblR5cGVBcmd1bWVudHMpCiAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpOwoKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IGluZmVycmVyLmdldEV4dGVuc2lvblJlY2VpdmVyVHlwZSgKICAgICAgICBub2RlLmV4dGVuc2lvbiwgZXh0ZW5zaW9uVHlwZUFyZ3VtZW50cyk7CgogICAgRXhwcmVzc2lvbiByZWNlaXZlciA9CiAgICAgICAgaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdChyZWNlaXZlclR5cGUsIHJlY2VpdmVyUmVzdWx0KTsKCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGU7CiAgICBFeHByZXNzaW9uIHJlYWRSZWNlaXZlcjsKICAgIEV4cHJlc3Npb24gd3JpdGVSZWNlaXZlcjsKICAgIGlmIChub2RlLnJlYWRPbmx5UmVjZWl2ZXIgJiYgaWRlbnRpY2FsKHJlY2VpdmVyLCBub2RlLnJlY2VpdmVyKSkgewogICAgICByZWFkUmVjZWl2ZXIgPSByZWNlaXZlcjsKICAgICAgd3JpdGVSZWNlaXZlciA9IF9jbG9uZShyZWNlaXZlcik7CiAgICB9IGVsc2UgewogICAgICByZWNlaXZlclZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSk7CiAgICAgIHJlYWRSZWNlaXZlciA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlY2VpdmVyVmFyaWFibGUpOwogICAgICB3cml0ZVJlY2VpdmVyID0gY3JlYXRlVmFyaWFibGVHZXQocmVjZWl2ZXJWYXJpYWJsZSk7CiAgICB9CgogICAgRGFydFR5cGUgcmVhZEluZGV4VHlwZSA9IGluZmVycmVyLmdldEluZGV4S2V5VHlwZShyZWFkVGFyZ2V0LCByZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5kZXhSZXN1bHQgPSBpbmZlcnJlcgogICAgICAgIC5pbmZlckV4cHJlc3Npb24obm9kZS5pbmRleCwgcmVhZEluZGV4VHlwZSwgdHJ1ZSwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGluZGV4VmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZUZvclJlc3VsdChpbmRleFJlc3VsdCk7CgogICAgRXhwcmVzc2lvbiByZWFkSW5kZXggPSBjcmVhdGVWYXJpYWJsZUdldChpbmRleFZhcmlhYmxlKTsKICAgIHJlYWRJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgcmVhZEluZGV4VHlwZSwgaW5kZXhSZXN1bHQuaW5mZXJyZWRUeXBlLCByZWFkSW5kZXgpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVhZFJlc3VsdCA9IF9jb21wdXRlSW5kZXhHZXQoCiAgICAgICAgbm9kZS5yZWFkT2Zmc2V0LAogICAgICAgIHJlYWRSZWNlaXZlciwKICAgICAgICByZWNlaXZlclR5cGUsCiAgICAgICAgcmVhZFRhcmdldCwKICAgICAgICByZWFkSW5kZXgsCiAgICAgICAgTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQubm9uZSk7CiAgICBFeHByZXNzaW9uIHJlYWQgPSByZWFkUmVzdWx0LmV4cHJlc3Npb247CiAgICBEYXJ0VHlwZSByZWFkVHlwZSA9IHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gbGVmdFZhcmlhYmxlOwogICAgRXhwcmVzc2lvbiBsZWZ0OwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIGxlZnQgPSByZWFkOwogICAgfSBlbHNlIGlmIChub2RlLmZvclBvc3RJbmNEZWMpIHsKICAgICAgbGVmdFZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUocmVhZCwgcmVhZFR5cGUpOwogICAgICBsZWZ0ID0gY3JlYXRlVmFyaWFibGVHZXQobGVmdFZhcmlhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlZnQgPSByZWFkOwogICAgfQoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgYmluYXJ5UmVzdWx0ID0gX2NvbXB1dGVCaW5hcnlFeHByZXNzaW9uKAogICAgICAgIG5vZGUuYmluYXJ5T2Zmc2V0LCBsZWZ0LCByZWFkVHlwZSwgbm9kZS5iaW5hcnlOYW1lLCBub2RlLnJocyk7CiAgICBFeHByZXNzaW9uIGJpbmFyeSA9IGJpbmFyeVJlc3VsdC5leHByZXNzaW9uOwogICAgRGFydFR5cGUgYmluYXJ5VHlwZSA9IGJpbmFyeVJlc3VsdC5pbmZlcnJlZFR5cGU7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gbm9kZS5zZXR0ZXIgIT0gbnVsbAogICAgICAgID8gbmV3IEV4dGVuc2lvbkFjY2Vzc1RhcmdldCgKICAgICAgICAgICAgbm9kZS5zZXR0ZXIsIG51bGwsIFByb2NlZHVyZUtpbmQuT3BlcmF0b3IsIGV4dGVuc2lvblR5cGVBcmd1bWVudHMpCiAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQubWlzc2luZygpOwoKICAgIERhcnRUeXBlIHdyaXRlSW5kZXhUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleFNldFZhbHVlVHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEV4cHJlc3Npb24gd3JpdGVJbmRleCA9IGNyZWF0ZVZhcmlhYmxlR2V0KGluZGV4VmFyaWFibGUpOwogICAgd3JpdGVJbmRleCA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgd3JpdGVJbmRleFR5cGUsIGluZGV4UmVzdWx0LmluZmVycmVkVHlwZSwgd3JpdGVJbmRleCk7CgogICAgRGFydFR5cGUgdmFsdWVUeXBlID0KICAgICAgICBpbmZlcnJlci5nZXRJbmRleFNldFZhbHVlVHlwZSh3cml0ZVRhcmdldCwgaW5mZXJyZXIudGhpc1R5cGUpOwogICAgYmluYXJ5ID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSh2YWx1ZVR5cGUsIGJpbmFyeVR5cGUsIGJpbmFyeSwKICAgICAgICBmaWxlT2Zmc2V0OiBub2RlLmZpbGVPZmZzZXQpOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFsdWVWYXJpYWJsZTsKICAgIEV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uOwogICAgaWYgKG5vZGUuZm9yRWZmZWN0IHx8IG5vZGUuZm9yUG9zdEluY0RlYykgewogICAgICB2YWx1ZUV4cHJlc3Npb24gPSBiaW5hcnk7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZVZhcmlhYmxlID0gY3JlYXRlVmFyaWFibGUoYmluYXJ5LCBiaW5hcnlUeXBlKTsKICAgICAgdmFsdWVFeHByZXNzaW9uID0gY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSk7CiAgICB9CgogICAgRXhwcmVzc2lvbiB3cml0ZSA9IF9jb21wdXRlSW5kZXhTZXQobm9kZS53cml0ZU9mZnNldCwgd3JpdGVSZWNlaXZlciwKICAgICAgICByZWNlaXZlclR5cGUsIHdyaXRlVGFyZ2V0LCB3cml0ZUluZGV4LCB2YWx1ZUV4cHJlc3Npb24pOwoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQ7CiAgICBpZiAobm9kZS5mb3JFZmZlY3QpIHsKICAgICAgYXNzZXJ0KGxlZnRWYXJpYWJsZSA9PSBudWxsKTsKICAgICAgYXNzZXJ0KHZhbHVlVmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIC8vIEVuY29kZSBgRXh0ZW5zaW9uKG8pW2FdICs9IGJgIGFzOgogICAgICAvLwogICAgICAvLyAgICAgbGV0IHJlY2VpdmVyVmFyaWFibGUgPSBvIGluCiAgICAgIC8vICAgICBsZXQgaW5kZXhWYXJpYWJsZSA9IGEgaW4KICAgICAgLy8gICAgICAgICByZWNlaXZlclZhcmlhYmxlLltdPShyZWNlaXZlclZhcmlhYmxlLCBvLltdKGluZGV4VmFyaWFibGUpICsgYikKICAgICAgLy8KICAgICAgcmVwbGFjZW1lbnQgPSBjcmVhdGVMZXQoaW5kZXhWYXJpYWJsZSwgd3JpdGUpOwogICAgfSBlbHNlIGlmIChub2RlLmZvclBvc3RJbmNEZWMpIHsKICAgICAgLy8gRW5jb2RlIGBFeHRlbnNpb24obylbYV0rK2AgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IG8gaW4KICAgICAgLy8gICAgIGxldCBpbmRleFZhcmlhYmxlID0gYSBpbgogICAgICAvLyAgICAgbGV0IGxlZnRWYXJpYWJsZSA9IHJlY2VpdmVyVmFyaWFibGUuW10oaW5kZXhWYXJpYWJsZSkKICAgICAgLy8gICAgIGxldCB3cml0ZVZhcmlhYmxlID0KICAgICAgLy8gICAgICAgcmVjZWl2ZXJWYXJpYWJsZS5bXT0oaW5kZXhWYXJpYWJsZSwgbGVmdFZhcmlhYmxlICsgMSkgaW4KICAgICAgLy8gICAgICAgICBsZWZ0VmFyaWFibGUKICAgICAgLy8KICAgICAgYXNzZXJ0KGxlZnRWYXJpYWJsZSAhPSBudWxsKTsKICAgICAgYXNzZXJ0KHZhbHVlVmFyaWFibGUgPT0gbnVsbCk7CgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlVmFyaWFibGUgPQogICAgICAgICAgY3JlYXRlVmFyaWFibGUod3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgICByZXBsYWNlbWVudCA9IGNyZWF0ZUxldCgKICAgICAgICAgIGluZGV4VmFyaWFibGUsCiAgICAgICAgICBjcmVhdGVMZXQobGVmdFZhcmlhYmxlLAogICAgICAgICAgICAgIGNyZWF0ZUxldCh3cml0ZVZhcmlhYmxlLCBjcmVhdGVWYXJpYWJsZUdldChsZWZ0VmFyaWFibGUpKSkpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb2RlIGBFeHRlbnNpb24obylbYV0gKz0gYmAgYXM6CiAgICAgIC8vCiAgICAgIC8vICAgICBsZXQgcmVjZWl2ZXJWYXJpYWJsZSA9IG8gaW4KICAgICAgLy8gICAgIGxldCBpbmRleFZhcmlhYmxlID0gYSBpbgogICAgICAvLyAgICAgbGV0IHZhbHVlVmFyaWFibGUgPSByZWNlaXZlclZhcmlhYmxlLltdKGluZGV4VmFyaWFibGUpICsgYgogICAgICAvLyAgICAgbGV0IHdyaXRlVmFyaWFibGUgPQogICAgICAvLyAgICAgICByZWNlaXZlclZhcmlhYmxlLltdPShpbmRleFZhcmlhYmxlLCB2YWx1ZVZhcmlhYmxlKSBpbgogICAgICAvLyAgICAgICAgIHZhbHVlVmFyaWFibGUKICAgICAgLy8KICAgICAgYXNzZXJ0KGxlZnRWYXJpYWJsZSA9PSBudWxsKTsKICAgICAgYXNzZXJ0KHZhbHVlVmFyaWFibGUgIT0gbnVsbCk7CgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHdyaXRlVmFyaWFibGUgPQogICAgICAgICAgY3JlYXRlVmFyaWFibGUod3JpdGUsIGNvbnN0IFZvaWRUeXBlKCkpOwogICAgICByZXBsYWNlbWVudCA9IGNyZWF0ZUxldCgKICAgICAgICAgIGluZGV4VmFyaWFibGUsCiAgICAgICAgICBjcmVhdGVMZXQodmFsdWVWYXJpYWJsZSwKICAgICAgICAgICAgICBjcmVhdGVMZXQod3JpdGVWYXJpYWJsZSwgY3JlYXRlVmFyaWFibGVHZXQodmFsdWVWYXJpYWJsZSkpKSk7CiAgICB9CgogICAgaWYgKHJlY2VpdmVyVmFyaWFibGUgIT0gbnVsbCkgewogICAgICByZXBsYWNlbWVudCA9IG5ldyBMZXQocmVjZWl2ZXJWYXJpYWJsZSwgcmVwbGFjZW1lbnQpOwogICAgfQogICAgcmVwbGFjZW1lbnQuZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBub2RlLmZvclBvc3RJbmNEZWMgPyByZWFkVHlwZSA6IGJpbmFyeVR5cGUsIHJlcGxhY2VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXROdWxsTGl0ZXJhbCgKICAgICAgTnVsbExpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5udWxsTGl0ZXJhbChub2RlKTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlci5jb3JlVHlwZXMubnVsbFR5cGUsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdExldChMZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIHZhcmlhYmxlVHlwZSA9IG5vZGUudmFyaWFibGUudHlwZTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgaW5pdGlhbGl6ZXJSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YXJpYWJsZS5pbml0aWFsaXplciwgdmFyaWFibGVUeXBlLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgbm9kZS52YXJpYWJsZS5pbml0aWFsaXplciA9IGluaXRpYWxpemVyUmVzdWx0LmV4cHJlc3Npb24KICAgICAgLi5wYXJlbnQgPSBub2RlLnZhcmlhYmxlOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0gaW5mZXJyZXIKICAgICAgICAuaW5mZXJFeHByZXNzaW9uKG5vZGUuYm9keSwgdHlwZUNvbnRleHQsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgbm9kZS5ib2R5ID0gYm9keVJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gYm9keVJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoaW5mZXJyZWRUeXBlLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRQcm9wZXJ0eVNldCgKICAgICAgY292YXJpYW50IFByb3BlcnR5U2V0SW1wbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWNlaXZlclJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLnJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKTsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgICBMaW5rPE51bGxBd2FyZUd1YXJkPiBudWxsQXdhcmVHdWFyZHM7CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBudWxsQXdhcmVHdWFyZHMgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVHdWFyZHM7CiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXJSZXN1bHQubnVsbEF3YXJlQWN0aW9uOwogICAgICByZWNlaXZlclR5cGUgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb25UeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlclJlc3VsdC5leHByZXNzaW9uOwogICAgICByZWNlaXZlclR5cGUgPSByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICB9CiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgdGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICByZWNlaXZlclR5cGUsIG5vZGUubmFtZSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIHNldHRlcjogdHJ1ZSwgaW5zdHJ1bWVudGVkOiB0cnVlLCBpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kczogdHJ1ZSk7CiAgICBpZiAodGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgaWYgKGluZmVycmVyLmluc3RydW1lbnRhdGlvbiAhPSBudWxsICYmCiAgICAgICAgICByZWNlaXZlclR5cGUgPT0gY29uc3QgRHluYW1pY1R5cGUoKSkgewogICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbi5yZWNvcmQoCiAgICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAndGFyZ2V0JywKICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKHRhcmdldC5tZW1iZXIpKTsKICAgICAgfQogICAgICBub2RlLmludGVyZmFjZVRhcmdldCA9IHRhcmdldC5tZW1iZXI7CiAgICB9CiAgICBEYXJ0VHlwZSB3cml0ZUNvbnRleHQgPSBpbmZlcnJlci5nZXRTZXR0ZXJUeXBlKHRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmhzUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUudmFsdWUsIHdyaXRlQ29udGV4dCA/PyBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgRGFydFR5cGUgcmhzVHlwZSA9IHJoc1Jlc3VsdC5pbmZlcnJlZFR5cGU7CiAgICBFeHByZXNzaW9uIHJocyA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQod3JpdGVDb250ZXh0LCByaHNSZXN1bHQsCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0LCBpc1ZvaWRBbGxvd2VkOiB3cml0ZUNvbnRleHQgaXMgVm9pZFR5cGUpOwoKICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQgPSBfY29tcHV0ZVByb3BlcnR5U2V0KAogICAgICAgIG5vZGUuZmlsZU9mZnNldCwgcmVjZWl2ZXIsIHJlY2VpdmVyVHlwZSwgbm9kZS5uYW1lLCB0YXJnZXQsIHJocywKICAgICAgICB2YWx1ZVR5cGU6IHJoc1R5cGUsIGZvckVmZmVjdDogbm9kZS5mb3JFZmZlY3QpOwoKICAgIHJldHVybiBpbmZlcnJlci5jcmVhdGVOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHJoc1R5cGUsIHJlcGxhY2VtZW50LCBudWxsQXdhcmVHdWFyZHMpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdE51bGxBd2FyZUlmTnVsbFNldCgKICAgICAgTnVsbEF3YXJlSWZOdWxsU2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlY2VpdmVyUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUucmVjZWl2ZXIsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgICByZWNlaXZlclJlc3VsdC5pbmZlcnJlZFR5cGUsICI/LiIsIG5vZGUucmVjZWl2ZXIuZmlsZU9mZnNldCk7CgogICAgTGluazxOdWxsQXdhcmVHdWFyZD4gbnVsbEF3YXJlR3VhcmRzOwogICAgRXhwcmVzc2lvbiByZWNlaXZlcjsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZTsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIG51bGxBd2FyZUd1YXJkcyA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUd1YXJkczsKICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlclJlc3VsdC5udWxsQXdhcmVBY3Rpb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0Lm51bGxBd2FyZUFjdGlvblR5cGU7CiAgICB9IGVsc2UgewogICAgICBudWxsQXdhcmVHdWFyZHMgPSBjb25zdCBMaW5rPE51bGxBd2FyZUd1YXJkPigpOwogICAgICByZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0LmV4cHJlc3Npb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIH0KCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHJlY2VpdmVyVmFyaWFibGUgPQogICAgICAgIGNyZWF0ZVZhcmlhYmxlKHJlY2VpdmVyLCByZWNlaXZlclR5cGUpOwogICAgTnVsbEF3YXJlR3VhcmQgbnVsbEF3YXJlR3VhcmQgPQogICAgICAgIGluZmVycmVyLmNyZWF0ZU51bGxBd2FyZUd1YXJkKHJlY2VpdmVyVmFyaWFibGUpOwogICAgRXhwcmVzc2lvbiByZWFkUmVjZWl2ZXIgPSBjcmVhdGVWYXJpYWJsZUdldChyZWNlaXZlclZhcmlhYmxlKTsKICAgIEV4cHJlc3Npb24gd3JpdGVSZWNlaXZlciA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlY2VpdmVyVmFyaWFibGUpOwogICAgRGFydFR5cGUgbm9uTnVsbFJlY2VpdmVyVHlwZSA9IGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZShyZWNlaXZlclR5cGUpOwoKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVhZFJlc3VsdCA9IF9jb21wdXRlUHJvcGVydHlHZXQobm9kZS5yZWFkT2Zmc2V0LAogICAgICAgIHJlYWRSZWNlaXZlciwgbm9uTnVsbFJlY2VpdmVyVHlwZSwgbm9kZS5uYW1lLCB0eXBlQ29udGV4dCwKICAgICAgICBpc1RoaXNSZWNlaXZlcjogbm9kZS5yZWNlaXZlciBpcyBUaGlzRXhwcmVzc2lvbik7CiAgICBFeHByZXNzaW9uIHJlYWQgPSByZWFkUmVzdWx0LmV4cHJlc3Npb247CiAgICBEYXJ0VHlwZSByZWFkVHlwZSA9IHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbihyZWFkKTsKCiAgICBNZW1iZXIgcmVhZEVxdWFsc01lbWJlciA9IGluZmVycmVyCiAgICAgICAgLmZpbmRJbnRlcmZhY2VNZW1iZXIocmVhZFR5cGUsIGVxdWFsc05hbWUsIG5vZGUudGVzdE9mZnNldCkKICAgICAgICAubWVtYmVyOwoKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVhZFZhcmlhYmxlOwogICAgaWYgKCFub2RlLmZvckVmZmVjdCkgewogICAgICByZWFkVmFyaWFibGUgPSBjcmVhdGVWYXJpYWJsZShyZWFkLCByZWFkVHlwZSk7CiAgICAgIHJlYWQgPSBjcmVhdGVWYXJpYWJsZUdldChyZWFkVmFyaWFibGUpOwogICAgfQoKICAgIE9iamVjdEFjY2Vzc1RhcmdldCB3cml0ZVRhcmdldCA9IGluZmVycmVyLmZpbmRJbnRlcmZhY2VNZW1iZXIoCiAgICAgICAgbm9uTnVsbFJlY2VpdmVyVHlwZSwgbm9kZS5uYW1lLCBub2RlLndyaXRlT2Zmc2V0LAogICAgICAgIHNldHRlcjogdHJ1ZSwgaW5jbHVkZUV4dGVuc2lvbk1ldGhvZHM6IHRydWUpOwoKICAgIERhcnRUeXBlIHZhbHVlVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZVRhcmdldCwgbm9uTnVsbFJlY2VpdmVyVHlwZSk7CgogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2YWx1ZVJlc3VsdCA9IGluZmVycmVyCiAgICAgICAgLmluZmVyRXhwcmVzc2lvbihub2RlLnZhbHVlLCB2YWx1ZVR5cGUsIHRydWUsIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQodmFsdWVUeXBlLCB2YWx1ZVJlc3VsdCk7CgogICAgRXhwcmVzc2lvbiB3cml0ZSA9IF9jb21wdXRlUHJvcGVydHlTZXQobm9kZS53cml0ZU9mZnNldCwgd3JpdGVSZWNlaXZlciwKICAgICAgICBub25OdWxsUmVjZWl2ZXJUeXBlLCBub2RlLm5hbWUsIHdyaXRlVGFyZ2V0LCB2YWx1ZSwKICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSwgZm9yRWZmZWN0OiBub2RlLmZvckVmZmVjdCk7CgogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlmTnVsbEV4cHJlc3Npb25fZW5kKCk7CgogICAgRGFydFR5cGUgbm9uTnVsbGFibGVSZWFkVHlwZSA9IGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZShyZWFkVHlwZSk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKICAgICAgICAuZ2V0U3RhbmRhcmRVcHBlckJvdW5kKG5vbk51bGxhYmxlUmVhZFR5cGUsIHZhbHVlUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKCiAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50OwogICAgaWYgKG5vZGUuZm9yRWZmZWN0KSB7CiAgICAgIGFzc2VydChyZWFkVmFyaWFibGUgPT0gbnVsbCk7CiAgICAgIC8vIEVuY29kZSBgcmVjZWl2ZXI/Lm5hbWUgPz89IHZhbHVlYCBhczoKICAgICAgLy8KICAgICAgLy8gICAgIGxldCByZWNlaXZlclZhcmlhYmxlID0gcmVjZWl2ZXIgaW4KICAgICAgLy8gICAgICAgcmVjZWl2ZXJWYXJpYWJsZSA9PSBudWxsID8gbnVsbCA6CiAgICAgIC8vICAgICAgICAgKHJlY2VpdmVyVmFyaWFibGUubmFtZSA9PSBudWxsID8KICAgICAgLy8gICAgICAgICAgIHJlY2VpdmVyVmFyaWFibGUubmFtZSA9IHZhbHVlIDogbnVsbCkKICAgICAgLy8KCiAgICAgIE1ldGhvZEludm9jYXRpb24gcmVhZEVxdWFsc051bGwgPQogICAgICAgICAgY3JlYXRlRXF1YWxzTnVsbChub2RlLnJlYWRPZmZzZXQsIHJlYWQsIHJlYWRFcXVhbHNNZW1iZXIpOwogICAgICByZXBsYWNlbWVudCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24ocmVhZEVxdWFsc051bGwsIHdyaXRlLAogICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBub2RlLndyaXRlT2Zmc2V0LCBpbmZlcnJlZFR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5jb2RlIGByZWNlaXZlcj8ubmFtZSA/Pz0gdmFsdWVgIGFzOgogICAgICAvLwogICAgICAvLyAgICAgbGV0IHJlY2VpdmVyVmFyaWFibGUgPSByZWNlaXZlciBpbgogICAgICAvLyAgICAgICByZWNlaXZlclZhcmlhYmxlID09IG51bGwgPyBudWxsIDoKICAgICAgLy8gICAgICAgICAobGV0IHJlYWRWYXJpYWJsZSA9IHJlY2VpdmVyVmFyaWFibGUubmFtZSBpbgogICAgICAvLyAgICAgICAgICAgcmVhZFZhcmlhYmxlID09IG51bGwgPwogICAgICAvLyAgICAgICAgICAgICByZWNlaXZlclZhcmlhYmxlLm5hbWUgPSB2YWx1ZSA6IHJlYWRWYXJpYWJsZSkKICAgICAgLy8KICAgICAgYXNzZXJ0KHJlYWRWYXJpYWJsZSAhPSBudWxsKTsKCiAgICAgIE1ldGhvZEludm9jYXRpb24gcmVhZEVxdWFsc051bGwgPQogICAgICAgICAgY3JlYXRlRXF1YWxzTnVsbChyZWNlaXZlclZhcmlhYmxlLmZpbGVPZmZzZXQsIHJlYWQsIHJlYWRFcXVhbHNNZW1iZXIpOwogICAgICBWYXJpYWJsZUdldCB2YXJpYWJsZUdldCA9IGNyZWF0ZVZhcmlhYmxlR2V0KHJlYWRWYXJpYWJsZSk7CiAgICAgIGlmIChpbmZlcnJlci5saWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICAgICFpZGVudGljYWwobm9uTnVsbGFibGVSZWFkVHlwZSwgcmVhZFR5cGUpKSB7CiAgICAgICAgdmFyaWFibGVHZXQucHJvbW90ZWRUeXBlID0gbm9uTnVsbGFibGVSZWFkVHlwZTsKICAgICAgfQogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgIHJlYWRFcXVhbHNOdWxsLCB3cml0ZSwgdmFyaWFibGVHZXQsIGluZmVycmVkVHlwZSk7CiAgICAgIHJlcGxhY2VtZW50ID0gY3JlYXRlTGV0KHJlYWRWYXJpYWJsZSwgY29uZGl0aW9uKTsKICAgIH0KCiAgICByZXR1cm4gaW5mZXJyZXIuY3JlYXRlTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50LCBudWxsQXdhcmVHdWFyZHMucHJlcGVuZChudWxsQXdhcmVHdWFyZCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFByb3BlcnR5R2V0KAogICAgICBQcm9wZXJ0eUdldCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLnJlY2VpdmVyLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIExpbms8TnVsbEF3YXJlR3VhcmQ+IG51bGxBd2FyZUd1YXJkczsKICAgIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAgICBEYXJ0VHlwZSByZWNlaXZlclR5cGU7CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBudWxsQXdhcmVHdWFyZHMgPSByZXN1bHQubnVsbEF3YXJlR3VhcmRzOwogICAgICByZWNlaXZlciA9IHJlc3VsdC5udWxsQXdhcmVBY3Rpb247CiAgICAgIHJlY2VpdmVyVHlwZSA9IHJlc3VsdC5udWxsQXdhcmVBY3Rpb25UeXBlOwogICAgfSBlbHNlIHsKICAgICAgcmVjZWl2ZXIgPSByZXN1bHQuZXhwcmVzc2lvbjsKICAgICAgcmVjZWl2ZXJUeXBlID0gcmVzdWx0LmluZmVycmVkVHlwZTsKICAgIH0KICAgIG5vZGUucmVjZWl2ZXIgPSByZWNlaXZlci4ucGFyZW50ID0gbm9kZTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVhZFJlc3VsdCA9IF9jb21wdXRlUHJvcGVydHlHZXQoCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCByZWNlaXZlciwgcmVjZWl2ZXJUeXBlLCBub2RlLm5hbWUsIHR5cGVDb250ZXh0LAogICAgICAgIGlzVGhpc1JlY2VpdmVyOiBub2RlLnJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKTsKICAgIHJldHVybiBpbmZlcnJlci5jcmVhdGVOdWxsQXdhcmVFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHJlYWRSZXN1bHQuaW5mZXJyZWRUeXBlLCByZWFkUmVzdWx0LmV4cHJlc3Npb24sIG51bGxBd2FyZUd1YXJkcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHZpc2l0UmVkaXJlY3RpbmdJbml0aWFsaXplcihSZWRpcmVjdGluZ0luaXRpYWxpemVyIG5vZGUpIHsKICAgIGluZmVycmVyLmluZmVyQ29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlcyhub2RlLnRhcmdldCk7CiAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IGNsYXNzVHlwZVBhcmFtZXRlcnMgPQogICAgICAgIG5vZGUudGFyZ2V0LmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9CiAgICAgICAgbmV3IExpc3Q8RGFydFR5cGU+KGNsYXNzVHlwZVBhcmFtZXRlcnMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB0eXBlQXJndW1lbnRzW2ldID0gbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLndpdGhEZWZhdWx0TnVsbGFiaWxpdHlGb3JMaWJyYXJ5KAogICAgICAgICAgY2xhc3NUeXBlUGFyYW1ldGVyc1tpXSwgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKICAgIH0KICAgIEFyZ3VtZW50c0ltcGwuc2V0Tm9uSW5mZXJyYWJsZUFyZ3VtZW50VHlwZXMobm9kZS5hcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIG51bGwsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIG5vZGUudGFyZ2V0LmZ1bmN0aW9uCiAgICAgICAgICAgIC5jb21wdXRlVGhpc0Z1bmN0aW9uVHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwKICAgICAgICBub2RlLmFyZ3VtZW50cywKICAgICAgICBub2RlLnRhcmdldC5uYW1lLAogICAgICAgIHJldHVyblR5cGU6IGluZmVycmVyLmNvcmVUeXBlcy50aGlzSW50ZXJmYWNlVHlwZSgKICAgICAgICAgICAgbm9kZS50YXJnZXQuZW5jbG9zaW5nQ2xhc3MsIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpLAogICAgICAgIHNraXBUeXBlQXJndW1lbnRJbmZlcmVuY2U6IHRydWUpOwogICAgQXJndW1lbnRzSW1wbC5yZW1vdmVOb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlcyhub2RlLmFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0UmV0aHJvdyhSZXRocm93IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaGFuZGxlRXhpdCgpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGNvbnN0IEJvdHRvbVR5cGUoKSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoCiAgICAgIGNvdmFyaWFudCBSZXR1cm5TdGF0ZW1lbnRJbXBsIG5vZGUpIHsKICAgIENsb3N1cmVDb250ZXh0IGNsb3N1cmVDb250ZXh0ID0gaW5mZXJyZXIuY2xvc3VyZUNvbnRleHQ7CiAgICBEYXJ0VHlwZSB0eXBlQ29udGV4dCA9ICFjbG9zdXJlQ29udGV4dC5pc0dlbmVyYXRvcgogICAgICAgID8gY2xvc3VyZUNvbnRleHQucmV0dXJuT3JZaWVsZENvbnRleHQKICAgICAgICA6IGNvbnN0IFVua25vd25UeXBlKCk7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CiAgICBpZiAobm9kZS5leHByZXNzaW9uICE9IG51bGwpIHsKICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBleHByZXNzaW9uUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgbm9kZS5leHByZXNzaW9uLCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgICBub2RlLmV4cHJlc3Npb24gPSBleHByZXNzaW9uUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICAgIGluZmVycmVkVHlwZSA9IGV4cHJlc3Npb25SZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlOwogICAgfQogICAgY2xvc3VyZUNvbnRleHQuaGFuZGxlUmV0dXJuKGluZmVycmVyLCBub2RlLCBpbmZlcnJlZFR5cGUsIG5vZGUuaXNBcnJvdyk7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMuaGFuZGxlRXhpdCgpOwogICAgcmV0dXJuIGNvbnN0IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFNldExpdGVyYWwoCiAgICAgIFNldExpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIENsYXNzIHNldENsYXNzID0gaW5mZXJyZXIuY29yZVR5cGVzLnNldENsYXNzOwogICAgSW50ZXJmYWNlVHlwZSBzZXRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzCiAgICAgICAgLnRoaXNJbnRlcmZhY2VUeXBlKHNldENsYXNzLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIExpc3Q8RGFydFR5cGU+IGluZmVycmVkVHlwZXM7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGVBcmd1bWVudDsKICAgIExpc3Q8RGFydFR5cGU+IGZvcm1hbFR5cGVzOwogICAgTGlzdDxEYXJ0VHlwZT4gYWN0dWFsVHlwZXM7CiAgICBib29sIGluZmVyZW5jZU5lZWRlZCA9IG5vZGUudHlwZUFyZ3VtZW50IGlzIEltcGxpY2l0VHlwZUFyZ3VtZW50OwogICAgYm9vbCB0eXBlQ2hlY2tzTmVlZGVkID0gIWluZmVycmVyLmlzVG9wTGV2ZWw7CiAgICBNYXA8VHJlZU5vZGUsIERhcnRUeXBlPiBpbmZlcnJlZFNwcmVhZFR5cGVzOwogICAgTWFwPEV4cHJlc3Npb24sIERhcnRUeXBlPiBpbmZlcnJlZENvbmRpdGlvblR5cGVzOwogICAgaWYgKGluZmVyZW5jZU5lZWRlZCB8fCB0eXBlQ2hlY2tzTmVlZGVkKSB7CiAgICAgIGZvcm1hbFR5cGVzID0gW107CiAgICAgIGFjdHVhbFR5cGVzID0gW107CiAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMgPSBuZXcgTWFwPFRyZWVOb2RlLCBEYXJ0VHlwZT4uaWRlbnRpdHkoKTsKICAgICAgaW5mZXJyZWRDb25kaXRpb25UeXBlcyA9IG5ldyBNYXA8RXhwcmVzc2lvbiwgRGFydFR5cGU+LmlkZW50aXR5KCk7CiAgICB9CiAgICBpZiAoaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgIGluZmVycmVkVHlwZXMgPSBbY29uc3QgVW5rbm93blR5cGUoKV07CiAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5pbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSgKICAgICAgICAgIHNldFR5cGUsCiAgICAgICAgICBzZXRDbGFzcy50eXBlUGFyYW1ldGVycywKICAgICAgICAgIG51bGwsCiAgICAgICAgICBudWxsLAogICAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgICBpbmZlcnJlZFR5cGVzLAogICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5LAogICAgICAgICAgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgfSBlbHNlIHsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBub2RlLnR5cGVBcmd1bWVudDsKICAgIH0KICAgIGlmIChpbmZlcmVuY2VOZWVkZWQgfHwgdHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7ICsraW5kZXgpIHsKICAgICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVyRWxlbWVudCgKICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uc1tpbmRleF0sCiAgICAgICAgICAgIGluZmVycmVkVHlwZUFyZ3VtZW50LAogICAgICAgICAgICBpbmZlcnJlZFNwcmVhZFR5cGVzLAogICAgICAgICAgICBpbmZlcnJlZENvbmRpdGlvblR5cGVzLAogICAgICAgICAgICBpbmZlcmVuY2VOZWVkZWQsCiAgICAgICAgICAgIHR5cGVDaGVja3NOZWVkZWQpOwogICAgICAgIG5vZGUuZXhwcmVzc2lvbnNbaW5kZXhdID0gcmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICAgICAgYWN0dWFsVHlwZXMuYWRkKHJlc3VsdC5pbmZlcnJlZFR5cGUpOwogICAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICAgIGZvcm1hbFR5cGVzLmFkZChzZXRUeXBlLnR5cGVBcmd1bWVudHNbMF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGluZmVyZW5jZU5lZWRlZCkgewogICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGUoCiAgICAgICAgICBzZXRUeXBlLAogICAgICAgICAgc2V0Q2xhc3MudHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBmb3JtYWxUeXBlcywKICAgICAgICAgIGFjdHVhbFR5cGVzLAogICAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgICBpbmZlcnJlZFR5cGVzLAogICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5KTsKICAgICAgaW5mZXJyZWRUeXBlQXJndW1lbnQgPSBpbmZlcnJlZFR5cGVzWzBdOwogICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24/LnJlY29yZCgKICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgICd0eXBlQXJncycsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJncyhbaW5mZXJyZWRUeXBlQXJndW1lbnRdKSk7CiAgICAgIG5vZGUudHlwZUFyZ3VtZW50ID0gaW5mZXJyZWRUeXBlQXJndW1lbnQ7CiAgICB9CiAgICBpZiAodHlwZUNoZWNrc05lZWRlZCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja0VsZW1lbnQobm9kZS5leHByZXNzaW9uc1tpXSwgbm9kZSwgbm9kZS50eXBlQXJndW1lbnQsCiAgICAgICAgICAgIGluZmVycmVkU3ByZWFkVHlwZXMsIGluZmVycmVkQ29uZGl0aW9uVHlwZXMpOwogICAgICB9CiAgICB9CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZSgKICAgICAgICBzZXRDbGFzcywgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSwgW2luZmVycmVkVHlwZUFyZ3VtZW50XSk7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGluZmVycmVyLmxpYnJhcnk7CiAgICAgIGlmIChpbmZlcmVuY2VOZWVkZWQpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5TZXRMaXRlcmFsKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQoKICAgICAgaWYgKCFsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5zdXBwb3J0c1NldExpdGVyYWxzKSB7CiAgICAgICAgaW5mZXJyZXIuaGVscGVyLnRyYW5zZm9ybVNldExpdGVyYWxzID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0U3RhdGljU2V0KAogICAgICBTdGF0aWNTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIE1lbWJlciB3cml0ZU1lbWJlciA9IG5vZGUudGFyZ2V0OwogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gd3JpdGVNZW1iZXIuc2V0dGVyVHlwZTsKICAgIFR5cGVJbmZlcmVuY2VFbmdpbmUucmVzb2x2ZUluZmVyZW5jZU5vZGUod3JpdGVNZW1iZXIpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByaHNSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YWx1ZSwgd3JpdGVDb250ZXh0ID8/IGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHJocyA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQod3JpdGVDb250ZXh0LCByaHNSZXN1bHQsCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0LCBpc1ZvaWRBbGxvd2VkOiB3cml0ZUNvbnRleHQgaXMgVm9pZFR5cGUpOwogICAgbm9kZS52YWx1ZSA9IHJocy4ucGFyZW50ID0gbm9kZTsKICAgIERhcnRUeXBlIHJoc1R5cGUgPSByaHNSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KHJoc1R5cGUsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFN0YXRpY0dldCgKICAgICAgU3RhdGljR2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBNZW1iZXIgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICBUeXBlSW5mZXJlbmNlRW5naW5lLnJlc29sdmVJbmZlcmVuY2VOb2RlKHRhcmdldCk7CiAgICBEYXJ0VHlwZSB0eXBlID0gdGFyZ2V0LmdldHRlclR5cGU7CiAgICBpZiAodGFyZ2V0IGlzIFByb2NlZHVyZSAmJiB0YXJnZXQua2luZCA9PSBQcm9jZWR1cmVLaW5kLk1ldGhvZCkgewogICAgICByZXR1cm4gaW5mZXJyZXIuaW5zdGFudGlhdGVUZWFyT2ZmKHR5cGUsIHR5cGVDb250ZXh0LCBub2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCh0eXBlLCBub2RlKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKAogICAgICBTdGF0aWNJbnZvY2F0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBGdW5jdGlvblR5cGUgY2FsbGVlVHlwZSA9IG5vZGUudGFyZ2V0ICE9IG51bGwKICAgICAgICA/IG5vZGUudGFyZ2V0LmZ1bmN0aW9uLmNvbXB1dGVGdW5jdGlvblR5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSkKICAgICAgICA6IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgICAgIFtdLCBjb25zdCBEeW5hbWljVHlwZSgpLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIFR5cGVBcmd1bWVudHNJbmZvIHR5cGVBcmd1bWVudHNJbmZvID0gZ2V0VHlwZUFyZ3VtZW50c0luZm8obm9kZS5hcmd1bWVudHMpOwogICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgdHlwZUNvbnRleHQsIG5vZGUuZmlsZU9mZnNldCwgY2FsbGVlVHlwZSwgbm9kZS5hcmd1bWVudHMsIG5vZGUubmFtZSk7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwgJiYgbm9kZS50YXJnZXQgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5saWJyYXJ5LmNoZWNrQm91bmRzSW5TdGF0aWNJbnZvY2F0aW9uKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICAgIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICB0eXBlQXJndW1lbnRzSW5mbyk7CiAgICB9CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgcmVzdWx0LmluZmVycmVkVHlwZSwgcmVzdWx0LmFwcGx5UmVzdWx0KG5vZGUpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRTdHJpbmdDb25jYXRlbmF0aW9uKAogICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbnNbaW5kZXhdLCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICAgIG5vZGUuZXhwcmVzc2lvbnNbaW5kZXhdID0gcmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuc3RyaW5nUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0U3RyaW5nTGl0ZXJhbCgKICAgICAgU3RyaW5nTGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcy5zdHJpbmdSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgdmlzaXRTdXBlckluaXRpYWxpemVyKFN1cGVySW5pdGlhbGl6ZXIgbm9kZSkgewogICAgaW5mZXJyZXIuaW5mZXJDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzKG5vZGUudGFyZ2V0KTsKICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVN1cGVydHlwZSgKICAgICAgICBpbmZlcnJlci5jbGFzc0hpZXJhcmNoeS5nZXRDbGFzc0FzSW5zdGFuY2VPZigKICAgICAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLCBub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcykpOwogICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgIG51bGwsCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShub2RlLnRhcmdldC5mdW5jdGlvbgogICAgICAgICAgICAuY29tcHV0ZVRoaXNGdW5jdGlvblR5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSkKICAgICAgICAgICAgLndpdGhvdXRUeXBlUGFyYW1ldGVycyksCiAgICAgICAgbm9kZS5hcmd1bWVudHMsCiAgICAgICAgbm9kZS50YXJnZXQubmFtZSwKICAgICAgICByZXR1cm5UeXBlOiBpbmZlcnJlci50aGlzVHlwZSwKICAgICAgICBza2lwVHlwZUFyZ3VtZW50SW5mZXJlbmNlOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgaWYgKG5vZGUuaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndGFyZ2V0JywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvck1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCkpOwogICAgfQogICAgYXNzZXJ0KG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID09IG51bGwgfHwgbm9kZS5pbnRlcmZhY2VUYXJnZXQgaXMgUHJvY2VkdXJlKTsKICAgIHJldHVybiBpbmZlcnJlci5pbmZlclN1cGVyTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBub2RlLAogICAgICAgIHR5cGVDb250ZXh0LAogICAgICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ICE9IG51bGwKICAgICAgICAgICAgPyBuZXcgT2JqZWN0QWNjZXNzVGFyZ2V0LmludGVyZmFjZU1lbWJlcihub2RlLmludGVyZmFjZVRhcmdldCkKICAgICAgICAgICAgOiBjb25zdCBPYmplY3RBY2Nlc3NUYXJnZXQudW5yZXNvbHZlZCgpKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRTdXBlclByb3BlcnR5R2V0KAogICAgICBTdXBlclByb3BlcnR5R2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBpZiAobm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5pbnN0cnVtZW50YXRpb24/LnJlY29yZCgKICAgICAgICAgIGluZmVycmVyLnVyaUZvckluc3RydW1lbnRhdGlvbiwKICAgICAgICAgIG5vZGUuZmlsZU9mZnNldCwKICAgICAgICAgICd0YXJnZXQnLAogICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKG5vZGUuaW50ZXJmYWNlVGFyZ2V0KSk7CiAgICB9CiAgICByZXR1cm4gaW5mZXJyZXIuaW5mZXJTdXBlclByb3BlcnR5R2V0KAogICAgICAgIG5vZGUsCiAgICAgICAgdHlwZUNvbnRleHQsCiAgICAgICAgbm9kZS5pbnRlcmZhY2VUYXJnZXQgIT0gbnVsbAogICAgICAgICAgICA/IG5ldyBPYmplY3RBY2Nlc3NUYXJnZXQuaW50ZXJmYWNlTWVtYmVyKG5vZGUuaW50ZXJmYWNlVGFyZ2V0KQogICAgICAgICAgICA6IGNvbnN0IE9iamVjdEFjY2Vzc1RhcmdldC51bnJlc29sdmVkKCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFN1cGVyUHJvcGVydHlTZXQoCiAgICAgIFN1cGVyUHJvcGVydHlTZXQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIHJlY2VpdmVyVHlwZSA9IGluZmVycmVyLmNsYXNzSGllcmFyY2h5LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUsCiAgICAgICAgaW5mZXJyZXIudGhpc1R5cGUuY2xhc3NOb2RlLnN1cGVydHlwZS5jbGFzc05vZGUsCiAgICAgICAgaW5mZXJyZXIubGlicmFyeS5saWJyYXJ5LAogICAgICAgIGluZmVycmVyLmNvcmVUeXBlcyk7CgogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICByZWNlaXZlclR5cGUsIG5vZGUubmFtZSwgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgIHNldHRlcjogdHJ1ZSwgaW5zdHJ1bWVudGVkOiB0cnVlKTsKICAgIGlmICh3cml0ZVRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIG5vZGUuaW50ZXJmYWNlVGFyZ2V0ID0gd3JpdGVUYXJnZXQubWVtYmVyOwogICAgfQogICAgRGFydFR5cGUgd3JpdGVDb250ZXh0ID0gaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmhzUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUudmFsdWUsIHdyaXRlQ29udGV4dCA/PyBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgRXhwcmVzc2lvbiByaHMgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlUmVzdWx0KHdyaXRlQ29udGV4dCwgcmhzUmVzdWx0LAogICAgICAgIGZpbGVPZmZzZXQ6IG5vZGUuZmlsZU9mZnNldCwgaXNWb2lkQWxsb3dlZDogd3JpdGVDb250ZXh0IGlzIFZvaWRUeXBlKTsKICAgIG5vZGUudmFsdWUgPSByaHMuLnBhcmVudCA9IG5vZGU7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQocmhzUmVzdWx0LmluZmVycmVkVHlwZSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRTd2l0Y2hTdGF0ZW1lbnQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgZXhwcmVzc2lvblJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmV4cHJlc3Npb24sIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgbm9kZS5leHByZXNzaW9uID0gZXhwcmVzc2lvblJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUgPSBleHByZXNzaW9uUmVzdWx0LmluZmVycmVkVHlwZTsKICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5zd2l0Y2hTdGF0ZW1lbnRfZXhwcmVzc2lvbkVuZChub2RlKTsKCiAgICBib29sIGhhc0RlZmF1bHQgPSBmYWxzZTsKICAgIGZvciAoU3dpdGNoQ2FzZUltcGwgc3dpdGNoQ2FzZSBpbiBub2RlLmNhc2VzKSB7CiAgICAgIGhhc0RlZmF1bHQgPSBoYXNEZWZhdWx0IHx8IHN3aXRjaENhc2UuaXNEZWZhdWx0OwogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMKICAgICAgICAgIC5zd2l0Y2hTdGF0ZW1lbnRfYmVnaW5DYXNlKHN3aXRjaENhc2UuaGFzTGFiZWwsIG5vZGUpOwogICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3dpdGNoQ2FzZS5leHByZXNzaW9ucy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGNhc2VFeHByZXNzaW9uUmVzdWx0ID0KICAgICAgICAgICAgaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgICAgICAgc3dpdGNoQ2FzZS5leHByZXNzaW9uc1tpbmRleF0sIGV4cHJlc3Npb25UeXBlLCB0cnVlLAogICAgICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgICAgIEV4cHJlc3Npb24gY2FzZUV4cHJlc3Npb24gPSBjYXNlRXhwcmVzc2lvblJlc3VsdC5leHByZXNzaW9uOwogICAgICAgIHN3aXRjaENhc2UuZXhwcmVzc2lvbnNbaW5kZXhdID0gY2FzZUV4cHJlc3Npb24uLnBhcmVudCA9IHN3aXRjaENhc2U7CiAgICAgICAgRGFydFR5cGUgY2FzZUV4cHJlc3Npb25UeXBlID0gY2FzZUV4cHJlc3Npb25SZXN1bHQuaW5mZXJyZWRUeXBlOwoKICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHR5cGUgaXMgYXNzaWduYWJsZSB0byB0aGUgY2FzZQogICAgICAgIC8vIGV4cHJlc3Npb24gdHlwZS4KICAgICAgICBpZiAoIWluZmVycmVyLmlzQXNzaWduYWJsZShleHByZXNzaW9uVHlwZSwgY2FzZUV4cHJlc3Npb25UeXBlKSkgewogICAgICAgICAgaW5mZXJyZXIuaGVscGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBleHByZXNzaW9uVHlwZSwKICAgICAgICAgICAgICAgICAgY2FzZUV4cHJlc3Npb25UeXBlLAogICAgICAgICAgICAgICAgICBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICAgICAgICBjYXNlRXhwcmVzc2lvbi5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIG1lc3NhZ2VTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgbm9MZW5ndGgpCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0KICAgICAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KHN3aXRjaENhc2UuYm9keSk7CiAgICAgIGlmIChib2R5UmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgICBzd2l0Y2hDYXNlLmJvZHkgPSBib2R5UmVzdWx0LnN0YXRlbWVudC4ucGFyZW50ID0gc3dpdGNoQ2FzZTsKICAgICAgfQogICAgfQogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLnN3aXRjaFN0YXRlbWVudF9lbmQoaGFzRGVmYXVsdCk7CiAgICByZXR1cm4gY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0U3ltYm9sTGl0ZXJhbCgKICAgICAgU3ltYm9sTGl0ZXJhbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0KICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuc3ltYm9sUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIG5vZGUpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFRoaXNFeHByZXNzaW9uKAogICAgICBUaGlzRXhwcmVzc2lvbiBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVyLnRoaXNUeXBlLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRUaHJvdyhUaHJvdyBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBleHByZXNzaW9uUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIG5vZGUuZXhwcmVzc2lvbiwgY29uc3QgVW5rbm93blR5cGUoKSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgbm9kZS5leHByZXNzaW9uID0gZXhwcmVzc2lvblJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmhhbmRsZUV4aXQoKTsKICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmIGluZmVycmVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKAogICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50Lm9iamVjdE5vbk51bGxhYmxlUmF3VHlwZSwKICAgICAgICAgIGV4cHJlc3Npb25SZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgICAgaXNTdHJvbmdOdWxsYWJpbGl0eU1vZGU6IHRydWUpKSB7CiAgICAgICAgaWYgKGluZmVycmVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICAgICAgY29uc3QgRHluYW1pY1R5cGUoKSwKICAgICAgICAgICAgICBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0RXJyb3Iud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25SZXN1bHQuaW5mZXJyZWRUeXBlLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIG5vTGVuZ3RoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZmVycmVyLmhlbHBlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlVGhyb3dpbmdOb3RBc3NpZ25hYmxlVG9PYmplY3RXYXJuaW5nLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25SZXN1bHQuaW5mZXJyZWRUeXBlLCB0cnVlKSwKICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBSZXR1cm4gQm90dG9tVHlwZSBpbiBsZWdhY3kgbW9kZSBmb3IgY29tcGF0aWJpbGl0eS4KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0CiAgICAgICAgICAgID8gY29uc3QgTmV2ZXJUeXBlKE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKQogICAgICAgICAgICA6IGNvbnN0IEJvdHRvbVR5cGUoKSwKICAgICAgICBub2RlKTsKICB9CgogIHZvaWQgdmlzaXRDYXRjaChDYXRjaCBub2RlKSB7CiAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgYm9keVJlc3VsdCA9IGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuYm9keSk7CiAgICBpZiAoYm9keVJlc3VsdC5oYXNDaGFuZ2VkKSB7CiAgICAgIG5vZGUuYm9keSA9IGJvZHlSZXN1bHQuc3RhdGVtZW50Li5wYXJlbnQgPSBub2RlOwogICAgfQogIH0KCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHZpc2l0VHJ5U3RhdGVtZW50KFRyeVN0YXRlbWVudCBub2RlKSB7CiAgICBpZiAobm9kZS5maW5hbGx5QmxvY2sgIT0gbnVsbCkgewogICAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMudHJ5RmluYWxseVN0YXRlbWVudF9ib2R5QmVnaW4oKTsKICAgIH0KICAgIFN0YXRlbWVudCB0cnlCb2R5V2l0aEFzc2lnbmVkSW5mbyA9IG5vZGUudHJ5QmxvY2s7CiAgICBpZiAobm9kZS5jYXRjaEJsb2Nrcy5pc05vdEVtcHR5KSB7CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy50cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW4oKTsKICAgIH0KCiAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdHJ5QmxvY2tSZXN1bHQgPQogICAgICAgIGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUudHJ5QmxvY2spOwoKICAgIGlmIChub2RlLmNhdGNoQmxvY2tzLmlzTm90RW1wdHkpIHsKICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLnRyeUNhdGNoU3RhdGVtZW50X2JvZHlFbmQodHJ5Qm9keVdpdGhBc3NpZ25lZEluZm8pOwogICAgICBmb3IgKENhdGNoIGNhdGNoQmxvY2sgaW4gbm9kZS5jYXRjaEJsb2NrcykgewogICAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy50cnlDYXRjaFN0YXRlbWVudF9jYXRjaEJlZ2luKAogICAgICAgICAgICBjYXRjaEJsb2NrLmV4Y2VwdGlvbiwgY2F0Y2hCbG9jay5zdGFja1RyYWNlKTsKICAgICAgICB2aXNpdENhdGNoKGNhdGNoQmxvY2spOwogICAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy50cnlDYXRjaFN0YXRlbWVudF9jYXRjaEVuZCgpOwogICAgICB9CiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy50cnlDYXRjaFN0YXRlbWVudF9lbmQoKTsKICAgIH0KCiAgICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgZmluYWxpemVyUmVzdWx0OwogICAgaWYgKG5vZGUuZmluYWxseUJsb2NrICE9IG51bGwpIHsKICAgICAgLy8gSWYgYSB0cnkgc3RhdGVtZW50IGhhcyBubyBjYXRjaCBibG9ja3MsIHRoZSBmaW5hbGx5IGJsb2NrIHVzZXMgdGhlCiAgICAgIC8vIGFzc2lnbmVkIHZhcmlhYmxlcyBmcm9tIHRoZSB0cnkgYmxvY2sgaW4gW3RyeUJvZHlXaXRoQXNzaWduZWRJbmZvXSwKICAgICAgLy8gb3RoZXJ3aXNlIGl0IHVzZXMgdGhlIGFzc2lnbmVkIHZhcmlhYmxlcyBmb3IgdGhlCiAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy50cnlGaW5hbGx5U3RhdGVtZW50X2ZpbmFsbHlCZWdpbigKICAgICAgICAgIG5vZGUuY2F0Y2hCbG9ja3MuaXNOb3RFbXB0eSA/IG5vZGUgOiB0cnlCb2R5V2l0aEFzc2lnbmVkSW5mbyk7CiAgICAgIGZpbmFsaXplclJlc3VsdCA9IGluZmVycmVyLmluZmVyU3RhdGVtZW50KG5vZGUuZmluYWxseUJsb2NrKTsKICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLnRyeUZpbmFsbHlTdGF0ZW1lbnRfZW5kKG5vZGUuZmluYWxseUJsb2NrKTsKICAgIH0KICAgIFN0YXRlbWVudCByZXN1bHQgPQogICAgICAgIHRyeUJsb2NrUmVzdWx0Lmhhc0NoYW5nZWQgPyB0cnlCbG9ja1Jlc3VsdC5zdGF0ZW1lbnQgOiBub2RlLnRyeUJsb2NrOwogICAgaWYgKG5vZGUuY2F0Y2hCbG9ja3MuaXNOb3RFbXB0eSkgewogICAgICByZXN1bHQgPSBuZXcgVHJ5Q2F0Y2gocmVzdWx0LCBub2RlLmNhdGNoQmxvY2tzKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KICAgIGlmIChub2RlLmZpbmFsbHlCbG9jayAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IG5ldyBUcnlGaW5hbGx5KAogICAgICAgICAgcmVzdWx0LAogICAgICAgICAgZmluYWxpemVyUmVzdWx0Lmhhc0NoYW5nZWQKICAgICAgICAgICAgICA/IGZpbmFsaXplclJlc3VsdC5zdGF0ZW1lbnQKICAgICAgICAgICAgICA6IG5vZGUuZmluYWxseUJsb2NrKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KICAgIGluZmVycmVyLmxpYnJhcnkubG9hZGVyLmRhdGFGb3JUZXN0aW5nPy5yZWdpc3RlckFsaWFzKG5vZGUsIHJlc3VsdCk7CiAgICByZXR1cm4gbmV3IFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdC5zaW5nbGUocmVzdWx0KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRUeXBlTGl0ZXJhbCgKICAgICAgVHlwZUxpdGVyYWwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLnR5cGVSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0VmFyaWFibGVTZXQoCiAgICAgIFZhcmlhYmxlU2V0IG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uSW1wbCB2YXJpYWJsZSA9IG5vZGUudmFyaWFibGU7CiAgICBEYXJ0VHlwZSB3cml0ZUNvbnRleHQgPSB2YXJpYWJsZS50eXBlOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByaHNSZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS52YWx1ZSwgd3JpdGVDb250ZXh0ID8/IGNvbnN0IFVua25vd25UeXBlKCksIHRydWUsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICBFeHByZXNzaW9uIHJocyA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQod3JpdGVDb250ZXh0LCByaHNSZXN1bHQsCiAgICAgICAgZmlsZU9mZnNldDogbm9kZS5maWxlT2Zmc2V0LCBpc1ZvaWRBbGxvd2VkOiB3cml0ZUNvbnRleHQgaXMgVm9pZFR5cGUpOwogICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLndyaXRlKHZhcmlhYmxlLCByaHNSZXN1bHQuaW5mZXJyZWRUeXBlKTsKICAgIGlmICh2YXJpYWJsZS5sYXRlU2V0dGVyICE9IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgICAgcmhzUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZS5sYXRlU2V0dGVyKQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgIGNhbGxOYW1lLAogICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+W3Joc10pLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZS52YWx1ZSA9IHJocy4ucGFyZW50ID0gbm9kZTsKICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KHJoc1Jlc3VsdC5pbmZlcnJlZFR5cGUsIG5vZGUpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0IHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbigKICAgICAgY292YXJpYW50IFZhcmlhYmxlRGVjbGFyYXRpb25JbXBsIG5vZGUpIHsKICAgIERhcnRUeXBlIGRlY2xhcmVkVHlwZSA9CiAgICAgICAgbm9kZS5pc0ltcGxpY2l0bHlUeXBlZCA/IGNvbnN0IFVua25vd25UeXBlKCkgOiBub2RlLnR5cGU7CiAgICBEYXJ0VHlwZSBpbmZlcnJlZFR5cGU7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGluaXRpYWxpemVyUmVzdWx0OwogICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICBpbml0aWFsaXplclJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLmluaXRpYWxpemVyLAogICAgICAgICAgZGVjbGFyZWRUeXBlLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCB8fCBub2RlLmlzSW1wbGljaXRseVR5cGVkLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICAgIGluZmVycmVkVHlwZSA9IGluZmVycmVyLmluZmVyRGVjbGFyYXRpb25UeXBlKAogICAgICAgICAgaW5pdGlhbGl6ZXJSZXN1bHQuaW5mZXJyZWRUeXBlLAogICAgICAgICAgZm9yU3ludGhldGljVmFyaWFibGU6IG5vZGUubmFtZSA9PSBudWxsKTsKICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmluaXRpYWxpemUobm9kZSk7CiAgICB9IGVsc2UgewogICAgICBpbmZlcnJlZFR5cGUgPSBjb25zdCBEeW5hbWljVHlwZSgpOwogICAgfQogICAgaWYgKG5vZGUuaXNJbXBsaWNpdGx5VHlwZWQpIHsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAndHlwZScsCiAgICAgICAgICBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKGluZmVycmVkVHlwZSkpOwogICAgICBub2RlLnR5cGUgPSBpbmZlcnJlZFR5cGU7CiAgICB9CiAgICBpZiAoaW5pdGlhbGl6ZXJSZXN1bHQgIT0gbnVsbCkgewogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZVJlc3VsdCgKICAgICAgICAgIG5vZGUudHlwZSwgaW5pdGlhbGl6ZXJSZXN1bHQsCiAgICAgICAgICBmaWxlT2Zmc2V0OiBub2RlLmZpbGVPZmZzZXQsIGlzVm9pZEFsbG93ZWQ6IG5vZGUudHlwZSBpcyBWb2lkVHlwZSk7CiAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci4ucGFyZW50ID0gbm9kZTsKICAgIH0KICAgIGlmICghaW5mZXJyZXIuaXNUb3BMZXZlbCkgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gaW5mZXJyZXIubGlicmFyeTsKICAgICAgaWYgKG5vZGUuaXNJbXBsaWNpdGx5VHlwZWQpIHsKICAgICAgICBsaWJyYXJ5LmNoZWNrQm91bmRzSW5WYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICAgICAgICBub2RlLCBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQsIGluZmVycmVyLmhlbHBlci51cmksCiAgICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGUuaXNMYXRlICYmCiAgICAgICAgIWluZmVycmVyLmxpYnJhcnkubG9hZGVyLnRhcmdldC5iYWNrZW5kVGFyZ2V0LnN1cHBvcnRzTGF0ZUZpZWxkcykgewogICAgICBpbnQgZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKCiAgICAgIExpc3Q8U3RhdGVtZW50PiByZXN1bHQgPSA8U3RhdGVtZW50PltdOwogICAgICByZXN1bHQuYWRkKG5vZGUpOwoKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBpc1NldFZhcmlhYmxlOwogICAgICBpZiAobm9kZS50eXBlLmlzUG90ZW50aWFsbHlOdWxsYWJsZSkgewogICAgICAgIGlzU2V0VmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbignIyR7bm9kZS5uYW1lfSNpc1NldCcsCiAgICAgICAgICAgIGluaXRpYWxpemVyOiBuZXcgQm9vbExpdGVyYWwoZmFsc2UpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgdHlwZTogaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICByZXN1bHQuYWRkKGlzU2V0VmFyaWFibGUpOwogICAgICB9CgogICAgICBFeHByZXNzaW9uIGNyZWF0ZVZhcmlhYmxlUmVhZCh7Ym9vbCBuZWVkc1Byb21vdGlvbjogZmFsc2V9KSB7CiAgICAgICAgaWYgKG5lZWRzUHJvbW90aW9uKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KG5vZGUsIG5vZGUudHlwZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQobm9kZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBFeHByZXNzaW9uIGNyZWF0ZUlzU2V0UmVhZCgpID0+IG5ldyBWYXJpYWJsZUdldChpc1NldFZhcmlhYmxlKTsKICAgICAgRXhwcmVzc2lvbiBjcmVhdGVWYXJpYWJsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUpID0+CiAgICAgICAgICBuZXcgVmFyaWFibGVTZXQobm9kZSwgdmFsdWUpOwogICAgICBFeHByZXNzaW9uIGNyZWF0ZUlzU2V0V3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSkgPT4KICAgICAgICAgIG5ldyBWYXJpYWJsZVNldChpc1NldFZhcmlhYmxlLCB2YWx1ZSk7CgogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGdldFZhcmlhYmxlID0KICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCcjJHtub2RlLm5hbWV9I2dldCcpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbiBnZXR0ZXIgPSBuZXcgRnVuY3Rpb25EZWNsYXJhdGlvbigKICAgICAgICAgIGdldFZhcmlhYmxlLAogICAgICAgICAgbmV3IEZ1bmN0aW9uTm9kZSgKICAgICAgICAgICAgICBub2RlLmluaXRpYWxpemVyID09IG51bGwKICAgICAgICAgICAgICAgICAgPyBsYXRlX2xvd2VyaW5nLmNyZWF0ZUdldHRlckJvZHlXaXRob3V0SW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlLAogICAgICAgICAgICAgICAgICAgICAgJ0xvY2FsJywKICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZDogY3JlYXRlVmFyaWFibGVSZWFkLAogICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSXNTZXRSZWFkOiBjcmVhdGVJc1NldFJlYWQpCiAgICAgICAgICAgICAgICAgIDogbGF0ZV9sb3dlcmluZy5jcmVhdGVHZXR0ZXJXaXRoSW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgICAgICAgICBmaWxlT2Zmc2V0LCBub2RlLm5hbWUsIG5vZGUudHlwZSwgbm9kZS5pbml0aWFsaXplciwKICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZDogY3JlYXRlVmFyaWFibGVSZWFkLAogICAgICAgICAgICAgICAgICAgICAgY3JlYXRlVmFyaWFibGVXcml0ZTogY3JlYXRlVmFyaWFibGVXcml0ZSwKICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUlzU2V0UmVhZDogY3JlYXRlSXNTZXRSZWFkLAogICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSXNTZXRXcml0ZTogY3JlYXRlSXNTZXRXcml0ZSksCiAgICAgICAgICAgICAgcmV0dXJuVHlwZTogbm9kZS50eXBlKSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICBnZXRWYXJpYWJsZS50eXBlID0KICAgICAgICAgIGdldHRlci5mdW5jdGlvbi5jb21wdXRlRnVuY3Rpb25UeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICBub2RlLmxhdGVHZXR0ZXIgPSBnZXRWYXJpYWJsZTsKICAgICAgcmVzdWx0LmFkZChnZXR0ZXIpOwoKICAgICAgaWYgKCFub2RlLmlzRmluYWwgfHwgbm9kZS5pbml0aWFsaXplciA9PSBudWxsKSB7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBzZXRWYXJpYWJsZSA9CiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCcjJHtub2RlLm5hbWV9I3NldCcpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHNldHRlclBhcmFtZXRlciA9CiAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKG51bGwsIHR5cGU6IG5vZGUudHlwZSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24gc2V0dGVyID0gbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24oCiAgICAgICAgICAgICAgICBzZXRWYXJpYWJsZSwKICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvbk5vZGUoCiAgICAgICAgICAgICAgICAgICAgbm9kZS5pc0ZpbmFsCiAgICAgICAgICAgICAgICAgICAgICAgID8gbGF0ZV9sb3dlcmluZy5jcmVhdGVTZXR0ZXJCb2R5RmluYWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVyUGFyYW1ldGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvY2FsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJldHVyblZhbHVlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlVmFyaWFibGVSZWFkOiBjcmVhdGVWYXJpYWJsZVJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVWYXJpYWJsZVdyaXRlOiBjcmVhdGVWYXJpYWJsZVdyaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSXNTZXRSZWFkOiBjcmVhdGVJc1NldFJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJc1NldFdyaXRlOiBjcmVhdGVJc1NldFdyaXRlKQogICAgICAgICAgICAgICAgICAgICAgICA6IGxhdGVfbG93ZXJpbmcuY3JlYXRlU2V0dGVyQm9keSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVPZmZzZXQsIG5vZGUubmFtZSwgc2V0dGVyUGFyYW1ldGVyLCBub2RlLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZXR1cm5WYWx1ZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlV3JpdGU6IGNyZWF0ZVZhcmlhYmxlV3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJc1NldFdyaXRlOiBjcmVhdGVJc1NldFdyaXRlKQogICAgICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczogPFZhcmlhYmxlRGVjbGFyYXRpb24+WwogICAgICAgICAgICAgICAgICAgICAgc2V0dGVyUGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgXSkpCiAgICAgICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlaW5zZXJ0IHRoZSBmaWxlIG9mZnNldCB3aGVuIHRoZSB2bSBkb2Vzbid0CiAgICAgICAgICAgIC8vICB1c2UgaXQgZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LgogICAgICAgICAgICAvKi4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQqLzsKICAgICAgICBzZXRWYXJpYWJsZS50eXBlID0KICAgICAgICAgICAgc2V0dGVyLmZ1bmN0aW9uLmNvbXB1dGVGdW5jdGlvblR5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CiAgICAgICAgbm9kZS5sYXRlU2V0dGVyID0gc2V0VmFyaWFibGU7CiAgICAgICAgcmVzdWx0LmFkZChzZXR0ZXIpOwogICAgICB9CiAgICAgIG5vZGUuaXNMYXRlID0gZmFsc2U7CiAgICAgIG5vZGUubGF0ZVR5cGUgPSBub2RlLnR5cGU7CiAgICAgIG5vZGUudHlwZSA9IGluZmVycmVyLmNvbXB1dGVOdWxsYWJsZShub2RlLnR5cGUpOwogICAgICBub2RlLmluaXRpYWxpemVyID0gbnVsbDsKCiAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0Lm11bHRpcGxlKG5vZGUuZmlsZU9mZnNldCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiBjb25zdCBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQoKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRWYXJpYWJsZUdldCgKICAgICAgY292YXJpYW50IFZhcmlhYmxlR2V0SW1wbCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewogICAgVmFyaWFibGVEZWNsYXJhdGlvbkltcGwgdmFyaWFibGUgPSBub2RlLnZhcmlhYmxlOwogICAgYm9vbCBpc1VuYXNzaWduZWQgPSAhaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmlzQXNzaWduZWQodmFyaWFibGUpOwogICAgaWYgKGlzVW5hc3NpZ25lZCkgewogICAgICBpbmZlcnJlci5kYXRhRm9yVGVzdGluZz8uZmxvd0FuYWx5c2lzUmVzdWx0Py51bmFzc2lnbmVkTm9kZXM/LmFkZChub2RlKTsKICAgICAgaWYgKGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYgaW5mZXJyZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgICAvLyBTeW50aGV0aWMgdmFyaWFibGVzIGFyZW4ndCBjaGVja2VkLgogICAgICAgIGlmICh2YXJpYWJsZS5uYW1lICE9IG51bGwgJiYKICAgICAgICAgICAgIXZhcmlhYmxlLmlzTG9jYWxGdW5jdGlvbiAmJgogICAgICAgICAgICB2YXJpYWJsZS50eXBlIGlzISBJbnZhbGlkVHlwZSAmJgogICAgICAgICAgICB2YXJpYWJsZS50eXBlLmlzUG90ZW50aWFsbHlOb25OdWxsYWJsZSkgewogICAgICAgICAgaWYgKGluZmVycmVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICAgICAgICAgIG5ldyBJbnZhbGlkVHlwZSgpLAogICAgICAgICAgICAgICAgaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCiAgICAgICAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU5vbk51bGxhYmxlTm90QXNzaWduZWRFcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhub2RlLnZhcmlhYmxlLm5hbWUpLAogICAgICAgICAgICAgICAgICAgIG5vZGUudmFyaWFibGUubmFtZS5sZW5ndGgpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlTm9uTnVsbGFibGVOb3RBc3NpZ25lZFdhcm5pbmcKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhub2RlLnZhcmlhYmxlLm5hbWUpLAogICAgICAgICAgICAgICAgbm9kZS5maWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgbm9kZS52YXJpYWJsZS5uYW1lLmxlbmd0aCwKICAgICAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkuZmlsZVVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgRGFydFR5cGUgcHJvbW90ZWRUeXBlOwogICAgRGFydFR5cGUgZGVjbGFyZWRPckluZmVycmVkVHlwZSA9IHZhcmlhYmxlLmxhdGVUeXBlID8/IHZhcmlhYmxlLnR5cGU7CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICBpZiAobm9kZS5mb3JOdWxsR3VhcmRlZEFjY2VzcykgewogICAgICAgIERhcnRUeXBlIG5vbk51bGxhYmxlVHlwZSA9IGluZmVycmVyLmNvbXB1dGVOb25OdWxsYWJsZSh2YXJpYWJsZS50eXBlKTsKICAgICAgICBpZiAobm9uTnVsbGFibGVUeXBlICE9IHZhcmlhYmxlLnR5cGUpIHsKICAgICAgICAgIHByb21vdGVkVHlwZSA9IG5vbk51bGxhYmxlVHlwZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLmlzTG9jYWxGdW5jdGlvbikgewogICAgICAgIC8vIERvbid0IHByb21vdGUgbG9jYWwgZnVuY3Rpb25zLgogICAgICAgIHByb21vdGVkVHlwZSA9IGluZmVycmVyLmZsb3dBbmFseXNpcy52YXJpYWJsZVJlYWQobm9kZSwgdmFyaWFibGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBib29sIG11dGF0ZWRJbkNsb3N1cmUgPSB2YXJpYWJsZS5tdXRhdGVkSW5DbG9zdXJlOwogICAgICBwcm9tb3RlZFR5cGUgPSBpbmZlcnJlci50eXBlUHJvbW90ZXIKICAgICAgICAgIC5jb21wdXRlUHJvbW90ZWRUeXBlKG5vZGUuZmFjdCwgbm9kZS5zY29wZSwgbXV0YXRlZEluQ2xvc3VyZSk7CiAgICB9CiAgICBpZiAocHJvbW90ZWRUeXBlICE9IG51bGwpIHsKICAgICAgaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uPy5yZWNvcmQoCiAgICAgICAgICBpbmZlcnJlci51cmlGb3JJbnN0cnVtZW50YXRpb24sCiAgICAgICAgICBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAncHJvbW90ZWRUeXBlJywKICAgICAgICAgIG5ldyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUocHJvbW90ZWRUeXBlKSk7CiAgICB9CiAgICBub2RlLnByb21vdGVkVHlwZSA9IHByb21vdGVkVHlwZTsKICAgIERhcnRUeXBlIHR5cGUgPSBwcm9tb3RlZFR5cGUgPz8gZGVjbGFyZWRPckluZmVycmVkVHlwZTsKICAgIGlmICh2YXJpYWJsZS5pc0xvY2FsRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIGluZmVycmVyLmluc3RhbnRpYXRlVGVhck9mZih0eXBlLCB0eXBlQ29udGV4dCwgbm9kZSk7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLmxhdGVHZXR0ZXIgIT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCiAgICAgICAgICB0eXBlLAogICAgICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlLmxhdGVHZXR0ZXIpCiAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgY2FsbE5hbWUsCiAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bXSkuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQodHlwZSwgbm9kZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRXaGlsZVN0YXRlbWVudChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMud2hpbGVTdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW4obm9kZSk7CiAgICBJbnRlcmZhY2VUeXBlIGV4cGVjdGVkVHlwZSA9CiAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmJvb2xSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBjb25kaXRpb25SZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgbm9kZS5jb25kaXRpb24sIGV4cGVjdGVkVHlwZSwgIWluZmVycmVyLmlzVG9wTGV2ZWwsCiAgICAgICAgaXNWb2lkQWxsb3dlZDogZmFsc2UpOwogICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPQogICAgICAgIGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGVSZXN1bHQoZXhwZWN0ZWRUeXBlLCBjb25kaXRpb25SZXN1bHQpOwogICAgbm9kZS5jb25kaXRpb24gPSBjb25kaXRpb24uLnBhcmVudCA9IG5vZGU7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMud2hpbGVTdGF0ZW1lbnRfYm9keUJlZ2luKG5vZGUsIG5vZGUuY29uZGl0aW9uKTsKICAgIFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdCBib2R5UmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJTdGF0ZW1lbnQobm9kZS5ib2R5KTsKICAgIGlmIChib2R5UmVzdWx0Lmhhc0NoYW5nZWQpIHsKICAgICAgbm9kZS5ib2R5ID0gYm9keVJlc3VsdC5zdGF0ZW1lbnQuLnBhcmVudCA9IG5vZGU7CiAgICB9CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMud2hpbGVTdGF0ZW1lbnRfZW5kKCk7CiAgICByZXR1cm4gY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CiAgICBDbG9zdXJlQ29udGV4dCBjbG9zdXJlQ29udGV4dCA9IGluZmVycmVyLmNsb3N1cmVDb250ZXh0OwogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCBleHByZXNzaW9uUmVzdWx0OwogICAgaWYgKGNsb3N1cmVDb250ZXh0LmlzR2VuZXJhdG9yKSB7CiAgICAgIERhcnRUeXBlIHR5cGVDb250ZXh0ID0gY2xvc3VyZUNvbnRleHQucmV0dXJuT3JZaWVsZENvbnRleHQ7CiAgICAgIGlmIChub2RlLmlzWWllbGRTdGFyICYmIHR5cGVDb250ZXh0ICE9IG51bGwpIHsKICAgICAgICB0eXBlQ29udGV4dCA9IGluZmVycmVyLndyYXBUeXBlKAogICAgICAgICAgICB0eXBlQ29udGV4dCwKICAgICAgICAgICAgY2xvc3VyZUNvbnRleHQuaXNBc3luYwogICAgICAgICAgICAgICAgPyBpbmZlcnJlci5jb3JlVHlwZXMuc3RyZWFtQ2xhc3MKICAgICAgICAgICAgICAgIDogaW5mZXJyZXIuY29yZVR5cGVzLml0ZXJhYmxlQ2xhc3MsCiAgICAgICAgICAgIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICB9CiAgICAgIGV4cHJlc3Npb25SZXN1bHQgPSBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24oCiAgICAgICAgICBub2RlLmV4cHJlc3Npb24sIHR5cGVDb250ZXh0LCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBleHByZXNzaW9uUmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgICAgbm9kZS5leHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlLAogICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CiAgICB9CiAgICBjbG9zdXJlQ29udGV4dC5oYW5kbGVZaWVsZChpbmZlcnJlciwgbm9kZSwgZXhwcmVzc2lvblJlc3VsdCk7CiAgICByZXR1cm4gY29uc3QgU3RhdGVtZW50SW5mZXJlbmNlUmVzdWx0KCk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TG9hZExpYnJhcnkoCiAgICAgIGNvdmFyaWFudCBMb2FkTGlicmFyeUltcGwgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgIC5mdXR1cmVUeXBlKGNvbnN0IER5bmFtaWNUeXBlKCksIGluZmVycmVyLmxpYnJhcnkubnVsbGFibGUpOwogICAgaWYgKG5vZGUuYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgRnVuY3Rpb25UeXBlIGNhbGxlZVR5cGUgPQogICAgICAgICAgbmV3IEZ1bmN0aW9uVHlwZShbXSwgaW5mZXJyZWRUeXBlLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgaW5mZXJyZXIuaW5mZXJJbnZvY2F0aW9uKAogICAgICAgICAgdHlwZUNvbnRleHQsIG5vZGUuZmlsZU9mZnNldCwgY2FsbGVlVHlwZSwgbm9kZS5hcmd1bWVudHMsIG51bGwpOwogICAgfQogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgbm9kZSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0TG9hZExpYnJhcnlUZWFyT2ZmKAogICAgICBMb2FkTGlicmFyeVRlYXJPZmYgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9IG5ldyBGdW5jdGlvblR5cGUoCiAgICAgICAgW10sCiAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CiAgICAgICAgICAgIC5mdXR1cmVUeXBlKGNvbnN0IER5bmFtaWNUeXBlKCksIGluZmVycmVyLmxpYnJhcnkubnVsbGFibGUpLAogICAgICAgIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgRXhwcmVzc2lvbiByZXBsYWNlbWVudCA9IG5ldyBTdGF0aWNHZXQobm9kZS50YXJnZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50KTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZCgKICAgICAgQ2hlY2tMaWJyYXJ5SXNMb2FkZWQgbm9kZSwgRGFydFR5cGUgdHlwZUNvbnRleHQpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBGaWd1cmUgb3V0IHRoZSBzdWl0YWJsZSBudWxsYWJpbGl0eSBmb3IgdGhhdC4KICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCgKICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMub2JqZWN0UmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm51bGxhYmxlKSwgbm9kZSk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0RXF1YWxzKAogICAgICBFcXVhbHNFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGxlZnRSZXN1bHQgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLmxlZnQsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgcmV0dXJuIF9jb21wdXRlRXF1YWxzRXhwcmVzc2lvbihub2RlLmZpbGVPZmZzZXQsIGxlZnRSZXN1bHQuZXhwcmVzc2lvbiwKICAgICAgICBsZWZ0UmVzdWx0LmluZmVycmVkVHlwZSwgbm9kZS5yaWdodCwKICAgICAgICBpc05vdDogbm9kZS5pc05vdCk7CiAgfQoKICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHZpc2l0QmluYXJ5KAogICAgICBCaW5hcnlFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGxlZnRSZXN1bHQgPQogICAgICAgIGluZmVycmVyLmluZmVyRXhwcmVzc2lvbihub2RlLmxlZnQsIGNvbnN0IFVua25vd25UeXBlKCksIHRydWUpOwogICAgcmV0dXJuIF9jb21wdXRlQmluYXJ5RXhwcmVzc2lvbihub2RlLmZpbGVPZmZzZXQsIGxlZnRSZXN1bHQuZXhwcmVzc2lvbiwKICAgICAgICBsZWZ0UmVzdWx0LmluZmVycmVkVHlwZSwgbm9kZS5iaW5hcnlOYW1lLCBub2RlLnJpZ2h0KTsKICB9CgogIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgdmlzaXRVbmFyeSgKICAgICAgVW5hcnlFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IGV4cHJlc3Npb25SZXN1bHQ7CiAgICBpZiAobm9kZS51bmFyeU5hbWUgPT0gdW5hcnlNaW51c05hbWUpIHsKICAgICAgLy8gUmVwbGFjZSBpbnRlZ2VyIGxpdGVyYWxzIGluIGEgZG91YmxlIGNvbnRleHQgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogICAgICAvLyBkb3VibGUgbGl0ZXJhbCBpZiBpdCdzIGV4YWN0LiAgRm9yIGRvdWJsZSBsaXRlcmFscywgdGhlIG5lZ2F0aW9uIGlzCiAgICAgIC8vIGZvbGRlZCBhd2F5LiAgSW4gYW55IG5vbi1kb3VibGUgY29udGV4dCwgb3IgaWYgdGhlcmUgaXMgbm8gZXhhY3QKICAgICAgLy8gZG91YmxlIHZhbHVlLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGludGVnZXIgbGl0ZXJhbCBpcyBsZWZ0LiAgVGhlCiAgICAgIC8vIG5lZ2F0aW9uIGlzIG5vdCBmb2xkZWQgYXdheSBzbyB0aGF0IHBsYXRmb3JtcyB3aXRoIHdlYiBsaXRlcmFscyBjYW4KICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAobm9uLW5lZ2F0ZWQpIDB4ODAwMDAwMDAwMDAwMDAwMCByZXByZXNlbnRlZCBhcwogICAgICAvLyBpbnRlZ2VyIGxpdGVyYWwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggd2hpY2ggc2hvdWxkIGJlIGEgcG9zaXRpdmUgbnVtYmVyLAogICAgICAvLyBhbmQgbmVnYXRlZCA5MjIzMzcyMDM2ODU0Nzc1ODA4IHJlcHJlc2VudGVkIGFzCiAgICAgIC8vIC05MjIzMzcyMDM2ODU0Nzc1ODA4LnVuYXJ5LSgpIHdoaWNoIHNob3VsZCBiZSBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbiBpcyBJbnRKdWRnbWVudCkgewogICAgICAgIEludEp1ZGdtZW50IHJlY2VpdmVyID0gbm9kZS5leHByZXNzaW9uOwogICAgICAgIGlmIChpbmZlcnJlci5pc0RvdWJsZUNvbnRleHQodHlwZUNvbnRleHQpKSB7CiAgICAgICAgICBkb3VibGUgZG91YmxlVmFsdWUgPSByZWNlaXZlci5hc0RvdWJsZShuZWdhdGVkOiB0cnVlKTsKICAgICAgICAgIGlmIChkb3VibGVWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQgPSBuZXcgRG91YmxlTGl0ZXJhbChkb3VibGVWYWx1ZSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgICAgICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9CiAgICAgICAgICAgICAgICBpbmZlcnJlci5jb3JlVHlwZXMuZG91YmxlUmF3VHlwZShpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGluZmVycmVkVHlwZSwgcmVwbGFjZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBFeHByZXNzaW9uIGVycm9yID0gY2hlY2tXZWJJbnRMaXRlcmFsc0Vycm9ySWZVbmV4YWN0KAogICAgICAgICAgICBpbmZlcnJlciwgcmVjZWl2ZXIudmFsdWUsIHJlY2VpdmVyLmxpdGVyYWwsIHJlY2VpdmVyLmZpbGVPZmZzZXQpOwogICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoY29uc3QgRHluYW1pY1R5cGUoKSwgZXJyb3IpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlLmV4cHJlc3Npb24gaXMgU2hhZG93TGFyZ2VJbnRMaXRlcmFsKSB7CiAgICAgICAgU2hhZG93TGFyZ2VJbnRMaXRlcmFsIHJlY2VpdmVyID0gbm9kZS5leHByZXNzaW9uOwogICAgICAgIGlmICghcmVjZWl2ZXIuaXNQYXJlbnRoZXNpemVkKSB7CiAgICAgICAgICBpZiAoaW5mZXJyZXIuaXNEb3VibGVDb250ZXh0KHR5cGVDb250ZXh0KSkgewogICAgICAgICAgICBkb3VibGUgZG91YmxlVmFsdWUgPSByZWNlaXZlci5hc0RvdWJsZShuZWdhdGVkOiB0cnVlKTsKICAgICAgICAgICAgaWYgKGRvdWJsZVZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICBFeHByZXNzaW9uIHJlcGxhY2VtZW50ID0gbmV3IERvdWJsZUxpdGVyYWwoZG91YmxlVmFsdWUpCiAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgICAgICAgICAgRGFydFR5cGUgaW5mZXJyZWRUeXBlID0gaW5mZXJyZXIuY29yZVR5cGVzCiAgICAgICAgICAgICAgICAgIC5kb3VibGVSYXdUeXBlKGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIHJlcGxhY2VtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaW50IGludFZhbHVlID0gcmVjZWl2ZXIuYXNJbnQ2NChuZWdhdGVkOiB0cnVlKTsKICAgICAgICAgIGlmIChpbnRWYWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIEV4cHJlc3Npb24gZXJyb3IgPSBpbmZlcnJlci5oZWxwZXIuYnVpbGRQcm9ibGVtKAogICAgICAgICAgICAgICAgdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHJlY2VpdmVyLmxpdGVyYWwpLAogICAgICAgICAgICAgICAgcmVjZWl2ZXIuZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIHJlY2VpdmVyLmxpdGVyYWwubGVuZ3RoKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KGNvbnN0IER5bmFtaWNUeXBlKCksIGVycm9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbnRWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIEV4cHJlc3Npb24gZXJyb3IgPSBjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3QoCiAgICAgICAgICAgICAgICBpbmZlcnJlciwgaW50VmFsdWUsIHJlY2VpdmVyLmxpdGVyYWwsIHJlY2VpdmVyLmZpbGVPZmZzZXQpOwogICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChjb25zdCBEeW5hbWljVHlwZSgpLCBlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhwcmVzc2lvblJlc3VsdCA9IG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgICAgICAgICAgaW5mZXJyZXIuY29yZVR5cGVzLmludFJhd1R5cGUoaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSksCiAgICAgICAgICAgICAgICBuZXcgSW50TGl0ZXJhbCgtaW50VmFsdWUpCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZXhwcmVzc2lvbi5maWxlT2Zmc2V0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChleHByZXNzaW9uUmVzdWx0ID09IG51bGwpIHsKICAgICAgZXhwcmVzc2lvblJlc3VsdCA9CiAgICAgICAgICBpbmZlcnJlci5pbmZlckV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBjb25zdCBVbmtub3duVHlwZSgpLCB0cnVlKTsKICAgIH0KICAgIHJldHVybiBfY29tcHV0ZVVuYXJ5RXhwcmVzc2lvbihub2RlLmZpbGVPZmZzZXQsIGV4cHJlc3Npb25SZXN1bHQuZXhwcmVzc2lvbiwKICAgICAgICBleHByZXNzaW9uUmVzdWx0LmluZmVycmVkVHlwZSwgbm9kZS51bmFyeU5hbWUpOwogIH0KCiAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFBhcmVudGhlc2l6ZWQoCiAgICAgIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHR5cGVDb250ZXh0KSB7CiAgICBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0IHJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBub2RlLmV4cHJlc3Npb24sIHR5cGVDb250ZXh0LCB0cnVlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0KAogICAgICAgIHJlc3VsdC5pbmZlcnJlZFR5cGUsIHJlc3VsdC5leHByZXNzaW9uKTsKICB9CgogIHZvaWQgcmVwb3J0Tm9uTnVsbGFibGVJbk51bGxBd2FyZVdhcm5pbmdJZk5lZWRlZCgKICAgICAgRGFydFR5cGUgb3BlcmFuZFR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBpbnQgb2Zmc2V0KSB7CiAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJiBpbmZlcnJlci5wZXJmb3JtTm5iZENoZWNrcykgewogICAgICBpZiAob3BlcmFuZFR5cGUgaXMhIEludmFsaWRUeXBlICYmICFvcGVyYW5kVHlwZS5pc1BvdGVudGlhbGx5TnVsbGFibGUpIHsKICAgICAgICBpbmZlcnJlci5saWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlTm9uTnVsbGFibGVJbk51bGxBd2FyZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSwgb3BlcmFuZFR5cGUsIGluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoLAogICAgICAgICAgICBpbmZlcnJlci5saWJyYXJ5LmZpbGVVcmkpOwogICAgICB9CiAgICB9CiAgfQp9CgpjbGFzcyBGb3JJblJlc3VsdCB7CiAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZTsKICBmaW5hbCBFeHByZXNzaW9uIGl0ZXJhYmxlOwogIGZpbmFsIEV4cHJlc3Npb24gc3ludGhldGljQXNzaWdubWVudDsKICBmaW5hbCBTdGF0ZW1lbnQgZXhwcmVzc2lvblNpZGVFZmZlY3RzOwoKICBGb3JJblJlc3VsdCh0aGlzLnZhcmlhYmxlLCB0aGlzLml0ZXJhYmxlLCB0aGlzLnN5bnRoZXRpY0Fzc2lnbm1lbnQsCiAgICAgIHRoaXMuZXhwcmVzc2lvblNpZGVFZmZlY3RzKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0ZvckluUmVzdWx0KCR2YXJpYWJsZSwkaXRlcmFibGUsJwogICAgICAnJHN5bnRoZXRpY0Fzc2lnbm1lbnQsJGV4cHJlc3Npb25TaWRlRWZmZWN0cyknOwp9CgphYnN0cmFjdCBjbGFzcyBGb3JJblZhcmlhYmxlIHsKICAvLy8gQ29tcHV0ZXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIGV4cGVjdGVkIGZvciB0aGlzIGZvci1pbiB2YXJpYWJsZS4KICBEYXJ0VHlwZSBjb21wdXRlRWxlbWVudFR5cGUoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcik7CgogIC8vLyBJbmZlcnMgdGhlIGFzc2lnbm1lbnQgdG8gdGhpcyBmb3ItaW4gdmFyaWFibGUgd2l0aCBhIHZhbHVlIG9mIHR5cGUKICAvLy8gW3Joc1R5cGVdLiBUaGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gaXMgcmV0dXJuZWQuCiAgRXhwcmVzc2lvbiBpbmZlckFzc2lnbm1lbnQoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgRGFydFR5cGUgcmhzVHlwZSk7Cn0KCmNsYXNzIExvY2FsRm9ySW5WYXJpYWJsZSBpbXBsZW1lbnRzIEZvckluVmFyaWFibGUgewogIFZhcmlhYmxlU2V0IHZhcmlhYmxlU2V0OwoKICBMb2NhbEZvckluVmFyaWFibGUodGhpcy52YXJpYWJsZVNldCk7CgogIERhcnRUeXBlIGNvbXB1dGVFbGVtZW50VHlwZShUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyKSA9PgogICAgICB2YXJpYWJsZVNldC52YXJpYWJsZS50eXBlOwoKICBFeHByZXNzaW9uIGluZmVyQXNzaWdubWVudChUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBEYXJ0VHlwZSByaHNUeXBlKSB7CiAgICBFeHByZXNzaW9uIHJocyA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgdmFyaWFibGVTZXQudmFyaWFibGUudHlwZSksCiAgICAgICAgcmhzVHlwZSwKICAgICAgICB2YXJpYWJsZVNldC52YWx1ZSwKICAgICAgICBlcnJvclRlbXBsYXRlOiB0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKCiAgICB2YXJpYWJsZVNldC52YWx1ZSA9IHJocy4ucGFyZW50ID0gdmFyaWFibGVTZXQ7CiAgICBpbmZlcnJlci5mbG93QW5hbHlzaXMud3JpdGUodmFyaWFibGVTZXQudmFyaWFibGUsIHJoc1R5cGUpOwogICAgcmV0dXJuIHZhcmlhYmxlU2V0OwogIH0KfQoKY2xhc3MgUHJvcGVydHlGb3JJblZhcmlhYmxlIGltcGxlbWVudHMgRm9ySW5WYXJpYWJsZSB7CiAgZmluYWwgUHJvcGVydHlTZXQgcHJvcGVydHlTZXQ7CgogIERhcnRUeXBlIF93cml0ZVR5cGU7CgogIEV4cHJlc3Npb24gX3JoczsKCiAgUHJvcGVydHlGb3JJblZhcmlhYmxlKHRoaXMucHJvcGVydHlTZXQpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBjb21wdXRlRWxlbWVudFR5cGUoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCByZWNlaXZlclJlc3VsdCA9IGluZmVycmVyLmluZmVyRXhwcmVzc2lvbigKICAgICAgICBwcm9wZXJ0eVNldC5yZWNlaXZlciwgY29uc3QgVW5rbm93blR5cGUoKSwgdHJ1ZSk7CiAgICBwcm9wZXJ0eVNldC5yZWNlaXZlciA9IHJlY2VpdmVyUmVzdWx0LmV4cHJlc3Npb24uLnBhcmVudCA9IHByb3BlcnR5U2V0OwogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJSZXN1bHQuaW5mZXJyZWRUeXBlOwogICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHdyaXRlVGFyZ2V0ID0gaW5mZXJyZXIuZmluZEludGVyZmFjZU1lbWJlcigKICAgICAgICByZWNlaXZlclR5cGUsIHByb3BlcnR5U2V0Lm5hbWUsIHByb3BlcnR5U2V0LmZpbGVPZmZzZXQsCiAgICAgICAgc2V0dGVyOiB0cnVlLCBpbnN0cnVtZW50ZWQ6IHRydWUsIGluY2x1ZGVFeHRlbnNpb25NZXRob2RzOiB0cnVlKTsKICAgIERhcnRUeXBlIGVsZW1lbnRUeXBlID0KICAgICAgICBfd3JpdGVUeXBlID0gaW5mZXJyZXIuZ2V0U2V0dGVyVHlwZSh3cml0ZVRhcmdldCwgcmVjZWl2ZXJUeXBlKTsKICAgIEV4cHJlc3Npb24gZXJyb3IgPSBpbmZlcnJlci5yZXBvcnRNaXNzaW5nSW50ZXJmYWNlTWVtYmVyKAogICAgICAgIHdyaXRlVGFyZ2V0LAogICAgICAgIHJlY2VpdmVyVHlwZSwKICAgICAgICBwcm9wZXJ0eVNldC5uYW1lLAogICAgICAgIHByb3BlcnR5U2V0LmZpbGVPZmZzZXQsCiAgICAgICAgdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXIpOwogICAgaWYgKGVycm9yICE9IG51bGwpIHsKICAgICAgX3JocyA9IGVycm9yOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHdyaXRlVGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgICBpZiAoaW5mZXJyZXIuaW5zdHJ1bWVudGF0aW9uICE9IG51bGwgJiYKICAgICAgICAgICAgcmVjZWl2ZXJUeXBlID09IGNvbnN0IER5bmFtaWNUeXBlKCkpIHsKICAgICAgICAgIGluZmVycmVyLmluc3RydW1lbnRhdGlvbi5yZWNvcmQoCiAgICAgICAgICAgICAgaW5mZXJyZXIudXJpRm9ySW5zdHJ1bWVudGF0aW9uLAogICAgICAgICAgICAgIHByb3BlcnR5U2V0LmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgJ3RhcmdldCcsCiAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVyKHdyaXRlVGFyZ2V0Lm1lbWJlcikpOwogICAgICAgIH0KICAgICAgICBwcm9wZXJ0eVNldC5pbnRlcmZhY2VUYXJnZXQgPSB3cml0ZVRhcmdldC5tZW1iZXI7CiAgICAgIH0KICAgICAgX3JocyA9IHByb3BlcnR5U2V0LnZhbHVlOwogICAgfQogICAgcmV0dXJuIGVsZW1lbnRUeXBlOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiBpbmZlckFzc2lnbm1lbnQoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlciwgRGFydFR5cGUgcmhzVHlwZSkgewogICAgRXhwcmVzc2lvbiByaHMgPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAogICAgICAgIGdyZWF0ZXN0Q2xvc3VyZShpbmZlcnJlci5jb3JlVHlwZXMsIF93cml0ZVR5cGUpLCByaHNUeXBlLCBfcmhzLAogICAgICAgIGVycm9yVGVtcGxhdGU6IHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwoKICAgIHByb3BlcnR5U2V0LnZhbHVlID0gcmhzLi5wYXJlbnQgPSBwcm9wZXJ0eVNldDsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIHByb3BlcnR5U2V0LCBjb25zdCBVbmtub3duVHlwZSgpLCAhaW5mZXJyZXIuaXNUb3BMZXZlbCwKICAgICAgICBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKICAgIHJldHVybiByZXN1bHQuZXhwcmVzc2lvbjsKICB9Cn0KCmNsYXNzIFN1cGVyUHJvcGVydHlGb3JJblZhcmlhYmxlIGltcGxlbWVudHMgRm9ySW5WYXJpYWJsZSB7CiAgZmluYWwgU3VwZXJQcm9wZXJ0eVNldCBzdXBlclByb3BlcnR5U2V0OwoKICBEYXJ0VHlwZSBfd3JpdGVUeXBlOwoKICBTdXBlclByb3BlcnR5Rm9ySW5WYXJpYWJsZSh0aGlzLnN1cGVyUHJvcGVydHlTZXQpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBjb21wdXRlRWxlbWVudFR5cGUoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgewogICAgRGFydFR5cGUgcmVjZWl2ZXJUeXBlID0gaW5mZXJyZXIudGhpc1R5cGU7CiAgICBPYmplY3RBY2Nlc3NUYXJnZXQgd3JpdGVUYXJnZXQgPSBpbmZlcnJlci5maW5kSW50ZXJmYWNlTWVtYmVyKAogICAgICAgIHJlY2VpdmVyVHlwZSwgc3VwZXJQcm9wZXJ0eVNldC5uYW1lLCBzdXBlclByb3BlcnR5U2V0LmZpbGVPZmZzZXQsCiAgICAgICAgc2V0dGVyOiB0cnVlLCBpbnN0cnVtZW50ZWQ6IHRydWUpOwogICAgaWYgKHdyaXRlVGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgc3VwZXJQcm9wZXJ0eVNldC5pbnRlcmZhY2VUYXJnZXQgPSB3cml0ZVRhcmdldC5tZW1iZXI7CiAgICB9CiAgICByZXR1cm4gX3dyaXRlVHlwZSA9IGluZmVycmVyLmdldFNldHRlclR5cGUod3JpdGVUYXJnZXQsIHJlY2VpdmVyVHlwZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGluZmVyQXNzaWdubWVudChUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBEYXJ0VHlwZSByaHNUeXBlKSB7CiAgICBFeHByZXNzaW9uIHJocyA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgX3dyaXRlVHlwZSksCiAgICAgICAgcmhzVHlwZSwKICAgICAgICBzdXBlclByb3BlcnR5U2V0LnZhbHVlLAogICAgICAgIGVycm9yVGVtcGxhdGU6IHRlbXBsYXRlRm9ySW5Mb29wRWxlbWVudFR5cGVOb3RBc3NpZ25hYmxlLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgc3VwZXJQcm9wZXJ0eVNldC52YWx1ZSA9IHJocy4ucGFyZW50ID0gc3VwZXJQcm9wZXJ0eVNldDsKICAgIEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQgcmVzdWx0ID0gaW5mZXJyZXIuaW5mZXJFeHByZXNzaW9uKAogICAgICAgIHN1cGVyUHJvcGVydHlTZXQsIGNvbnN0IFVua25vd25UeXBlKCksICFpbmZlcnJlci5pc1RvcExldmVsLAogICAgICAgIGlzVm9pZEFsbG93ZWQ6IHRydWUpOwogICAgcmV0dXJuIHJlc3VsdC5leHByZXNzaW9uOwogIH0KfQoKY2xhc3MgU3RhdGljRm9ySW5WYXJpYWJsZSBpbXBsZW1lbnRzIEZvckluVmFyaWFibGUgewogIGZpbmFsIFN0YXRpY1NldCBzdGF0aWNTZXQ7CgogIFN0YXRpY0ZvckluVmFyaWFibGUodGhpcy5zdGF0aWNTZXQpOwoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSBjb21wdXRlRWxlbWVudFR5cGUoVHlwZUluZmVycmVySW1wbCBpbmZlcnJlcikgPT4KICAgICAgc3RhdGljU2V0LnRhcmdldC5zZXR0ZXJUeXBlOwoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIGluZmVyQXNzaWdubWVudChUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBEYXJ0VHlwZSByaHNUeXBlKSB7CiAgICBFeHByZXNzaW9uIHJocyA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCiAgICAgICAgZ3JlYXRlc3RDbG9zdXJlKGluZmVycmVyLmNvcmVUeXBlcywgc3RhdGljU2V0LnRhcmdldC5zZXR0ZXJUeXBlKSwKICAgICAgICByaHNUeXBlLAogICAgICAgIHN0YXRpY1NldC52YWx1ZSwKICAgICAgICBlcnJvclRlbXBsYXRlOiB0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZSwKICAgICAgICBpc1ZvaWRBbGxvd2Vk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OAQBMDxBLB4qMQQBNEBJTyU6ThQWJwgGBAIBFCYdKCkBRiMBOjYCAR9LOgFJN0sCATQbASgBPCEBTDBIERtCHgEzQBgEAgE3IQEXARMBKwEMO0k6TDlDQEobSD4VFhogIhkUDSowMysuJhhGCjoIIAYYBAEMTDBIQh4BM0FAHh4EAgE8KwEXATUBDDsvQ0orKD0GSwQBDEwwOREgQh49QUUeHgQCATUdAScBDDwjAQxMMEoRGUIeAS9BPh4eBAIBNh8BKQEMUQEMTRICATlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2luZmVyZW5jZV92aXNpdG9yLmRhcnRIZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi92ZXJpZmllci5kYXJ0wABmci8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCmxpYnJhcnkga2VybmVsLmNoZWNrczsKCmltcG9ydCAnYXN0LmRhcnQnOwppbXBvcnQgJ3RyYW5zZm9ybWF0aW9ucy9mbGFncy5kYXJ0JzsKaW1wb3J0ICd0eXBlX2Vudmlyb25tZW50LmRhcnQnIHNob3cgU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dCwgVHlwZUVudmlyb25tZW50OwoKdm9pZCB2ZXJpZnlDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwge2Jvb2wgaXNPdXRsaW5lLCBib29sIGFmdGVyQ29uc3R9KSB7CiAgVmVyaWZ5aW5nVmlzaXRvci5jaGVjayhjb21wb25lbnQsCiAgICAgIGlzT3V0bGluZTogaXNPdXRsaW5lLCBhZnRlckNvbnN0OiBhZnRlckNvbnN0KTsKfQoKY2xhc3MgVmVyaWZpY2F0aW9uRXJyb3IgewogIGZpbmFsIFRyZWVOb2RlIGNvbnRleHQ7CgogIGZpbmFsIFRyZWVOb2RlIG5vZGU7CgogIGZpbmFsIFN0cmluZyBkZXRhaWxzOwoKICBWZXJpZmljYXRpb25FcnJvcih0aGlzLmNvbnRleHQsIHRoaXMubm9kZSwgdGhpcy5kZXRhaWxzKTsKCiAgdG9TdHJpbmcoKSB7CiAgICBMb2NhdGlvbiBsb2NhdGlvbjsKICAgIHRyeSB7CiAgICAgIGxvY2F0aW9uID0gbm9kZT8ubG9jYXRpb24gPz8gY29udGV4dD8ubG9jYXRpb247CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogRml4IHRoZSBjb21waWxlciBpbnN0ZWFkLgogICAgfQogICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGZpbGUgPSBsb2NhdGlvbi5maWxlPy50b1N0cmluZygpID8/ICIiOwogICAgICByZXR1cm4gIiRmaWxlOiR7bG9jYXRpb24ubGluZX06JHtsb2NhdGlvbi5jb2x1bW59OiBWZXJpZmljYXRpb24gZXJyb3I6IgogICAgICAgICAgIiAkZGV0YWlscyI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIlZlcmlmaWNhdGlvbiBlcnJvcjogJGRldGFpbHNcbiIKICAgICAgICAgICJDb250ZXh0OiAnJGNvbnRleHQnLlxuIgogICAgICAgICAgIk5vZGU6ICckbm9kZScuIjsKICAgIH0KICB9Cn0KCmVudW0gVHlwZWRlZlN0YXRlIHsgRG9uZSwgQmVpbmdDaGVja2VkIH0KCi8vLyBDaGVja3MgdGhhdCBhIGtlcm5lbCBjb21wb25lbnQgaXMgd2VsbC1mb3JtZWQuCi8vLwovLy8gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSBraW5kIG9mIHR5cGUgY2hlY2tpbmcuCmNsYXNzIFZlcmlmeWluZ1Zpc2l0b3IgZXh0ZW5kcyBSZWN1cnNpdmVWaXNpdG9yPHZvaWQ+IHsKICBmaW5hbCBTZXQ8Q2xhc3M+IGNsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogIGZpbmFsIFNldDxUeXBlZGVmPiB0eXBlZGVmcyA9IG5ldyBTZXQ8VHlwZWRlZj4oKTsKICBTZXQ8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnNJblNjb3BlID0gbmV3IFNldDxUeXBlUGFyYW1ldGVyPigpOwogIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gdmFyaWFibGVTdGFjayA9IDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogIGZpbmFsIE1hcDxUeXBlZGVmLCBUeXBlZGVmU3RhdGU+IHR5cGVkZWZTdGF0ZSA9IDxUeXBlZGVmLCBUeXBlZGVmU3RhdGU+e307CiAgZmluYWwgU2V0PENvbnN0YW50PiBzZWVuQ29uc3RhbnRzID0gPENvbnN0YW50Pnt9OwogIGJvb2wgY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGUgPSBmYWxzZTsKCiAgLy8vIElmIHRydWUsIHJlbGF4IGNlcnRhaW4gY2hlY2tzIGZvciAqb3V0bGluZSogbW9kZS4gRm9yIGV4YW1wbGUsIGRvbid0CiAgLy8vIGF0dGVtcHQgdG8gdmFsaWRhdGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogIGZpbmFsIGJvb2wgaXNPdXRsaW5lOwoKICAvLy8gSWYgdHJ1ZSwgYXNzdW1lIHRoYXQgY29uc3RhbnQgZXZhbHVhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgKHdpdGggYQogIC8vLyB0YXJnZXQgdGhhdCBkaWQgbm90IG9wdCBvdXQgb2YgYW55IG9mIHRoZSBjb25zdGFudCBpbmxpbmluZykgYW5kIHJlcG9ydAogIC8vLyBhIHZlcmlmaWNhdGlvbiBlcnJvciBmb3IgYW55dGhpbmcgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgYnkgaXQuCiAgZmluYWwgYm9vbCBhZnRlckNvbnN0OwoKICBib29sIGluQ2F0Y2hCbG9jayA9IGZhbHNlOwoKICBib29sIGluVW5ldmFsdWF0ZWRDb25zdGFudCA9IGZhbHNlOwoKICBMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5OwoKICBNZW1iZXIgY3VycmVudE1lbWJlcjsKCiAgQ2xhc3MgY3VycmVudENsYXNzOwoKICBUcmVlTm9kZSBjdXJyZW50UGFyZW50OwoKICBUcmVlTm9kZSBnZXQgY29udGV4dCA9PiBjdXJyZW50TWVtYmVyID8/IGN1cnJlbnRDbGFzczsKCiAgc3RhdGljIHZvaWQgY2hlY2soQ29tcG9uZW50IGNvbXBvbmVudCwge2Jvb2wgaXNPdXRsaW5lLCBib29sIGFmdGVyQ29uc3R9KSB7CiAgICBjb21wb25lbnQuYWNjZXB0KAogICAgICAgIG5ldyBWZXJpZnlpbmdWaXNpdG9yKGlzT3V0bGluZTogaXNPdXRsaW5lLCBhZnRlckNvbnN0OiBhZnRlckNvbnN0KSk7CiAgfQoKICBWZXJpZnlpbmdWaXNpdG9yKHtib29sIGlzT3V0bGluZSwgYm9vbCBhZnRlckNvbnN0fSkKICAgICAgOiBpc091dGxpbmUgPSBpc091dGxpbmUgPz8gZmFsc2UsCiAgICAgICAgYWZ0ZXJDb25zdCA9IGFmdGVyQ29uc3QgPz8gIShpc091dGxpbmUgPz8gZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBkZWZhdWx0VHJlZU5vZGUoVHJlZU5vZGUgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHRDb25zdGFudFJlZmVyZW5jZShDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKHNlZW5Db25zdGFudHMuYWRkKGNvbnN0YW50KSkgewogICAgICBjb25zdGFudC5hY2NlcHQodGhpcyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBkZWZhdWx0Q29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGNvbnN0YW50LnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgfQoKICBwcm9ibGVtKFRyZWVOb2RlIG5vZGUsIFN0cmluZyBkZXRhaWxzLCB7VHJlZU5vZGUgY29udGV4dH0pIHsKICAgIGNvbnRleHQgPz89IHRoaXMuY29udGV4dDsKICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihjb250ZXh0LCBub2RlLCBkZXRhaWxzKTsKICB9CgogIFRyZWVOb2RlIGVudGVyUGFyZW50KFRyZWVOb2RlIG5vZGUpIHsKICAgIGlmICghaWRlbnRpY2FsKG5vZGUucGFyZW50LCBjdXJyZW50UGFyZW50KSkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICJJbmNvcnJlY3QgcGFyZW50IHBvaW50ZXIgb24gJHtub2RlLnJ1bnRpbWVUeXBlfToiCiAgICAgICAgICAiIGV4cGVjdGVkICcke2N1cnJlbnRQYXJlbnQucnVudGltZVR5cGV9JywiCiAgICAgICAgICAiIGJ1dCBmb3VuZDogJyR7bm9kZS5wYXJlbnQucnVudGltZVR5cGV9Jy4iLAogICAgICAgICAgY29udGV4dDogY3VycmVudFBhcmVudCk7CiAgICB9CiAgICB2YXIgb2xkUGFyZW50ID0gY3VycmVudFBhcmVudDsKICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlOwogICAgcmV0dXJuIG9sZFBhcmVudDsKICB9CgogIHZvaWQgZXhpdFBhcmVudChUcmVlTm9kZSBvbGRQYXJlbnQpIHsKICAgIGN1cnJlbnRQYXJlbnQgPSBvbGRQYXJlbnQ7CiAgfQoKICBpbnQgZW50ZXJMb2NhbFNjb3BlKCkgPT4gdmFyaWFibGVTdGFjay5sZW5ndGg7CgogIHZvaWQgZXhpdExvY2FsU2NvcGUoaW50IHN0YWNrSGVpZ2h0KSB7CiAgICBmb3IgKGludCBpID0gc3RhY2tIZWlnaHQ7IGkgPCB2YXJpYWJsZVN0YWNrLmxlbmd0aDsgKytpKSB7CiAgICAgIHVuZGVjbGFyZVZhcmlhYmxlKHZhcmlhYmxlU3RhY2tbaV0pOwogICAgfQogICAgdmFyaWFibGVTdGFjay5sZW5ndGggPSBzdGFja0hlaWdodDsKICB9CgogIHZvaWQgdmlzaXRDaGlsZHJlbihUcmVlTm9kZSBub2RlKSB7CiAgICB2YXIgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgfQoKICB2b2lkIHZpc2l0V2l0aExvY2FsU2NvcGUoVHJlZU5vZGUgbm9kZSkgewogICAgaW50IHN0YWNrSGVpZ2h0ID0gZW50ZXJMb2NhbFNjb3BlKCk7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogICAgZXhpdExvY2FsU2NvcGUoc3RhY2tIZWlnaHQpOwogIH0KCiAgdm9pZCBkZWNsYXJlTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIudHJhbnNmb3JtZXJGbGFncyAmIFRyYW5zZm9ybWVyRmxhZy5zZWVuQnlWZXJpZmllciAhPSAwKSB7CiAgICAgIHByb2JsZW0obWVtYmVyLmZ1bmN0aW9uLAogICAgICAgICAgIk1lbWJlciAnJG1lbWJlcicgaGFzIGJlZW4gZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuIik7CiAgICB9CiAgICBtZW1iZXIudHJhbnNmb3JtZXJGbGFncyB8PSBUcmFuc2Zvcm1lckZsYWcuc2VlbkJ5VmVyaWZpZXI7CiAgfQoKICB2b2lkIHVuZGVjbGFyZU1lbWJlcihNZW1iZXIgbWVtYmVyKSB7CiAgICBtZW1iZXIudHJhbnNmb3JtZXJGbGFncyAmPSB+VHJhbnNmb3JtZXJGbGFnLnNlZW5CeVZlcmlmaWVyOwogIH0KCiAgdm9pZCBkZWNsYXJlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgaWYgKHZhcmlhYmxlLmZsYWdzICYgVmFyaWFibGVEZWNsYXJhdGlvbi5GbGFnSW5TY29wZSAhPSAwKSB7CiAgICAgIHByb2JsZW0odmFyaWFibGUsICJWYXJpYWJsZSAnJHZhcmlhYmxlJyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iKTsKICAgIH0KICAgIHZhcmlhYmxlLmZsYWdzIHw9IFZhcmlhYmxlRGVjbGFyYXRpb24uRmxhZ0luU2NvcGU7CiAgICB2YXJpYWJsZVN0YWNrLmFkZCh2YXJpYWJsZSk7CiAgfQoKICB2b2lkIHVuZGVjbGFyZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKICAgIHZhcmlhYmxlLmZsYWdzICY9IH5WYXJpYWJsZURlY2xhcmF0aW9uLkZsYWdJblNjb3BlOwogIH0KCiAgdm9pZCBkZWNsYXJlVHlwZVBhcmFtZXRlcnMoTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07CiAgICAgIGlmIChwYXJhbWV0ZXIuYm91bmQgPT0gbnVsbCkgewogICAgICAgIHByb2JsZW0oCiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQsICJNaXNzaW5nIGJvdW5kIGZvciB0eXBlIHBhcmFtZXRlciAnJHBhcmFtZXRlcicuIik7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyc0luU2NvcGUuYWRkKHBhcmFtZXRlcikpIHsKICAgICAgICBwcm9ibGVtKHBhcmFtZXRlciwgIlR5cGUgcGFyYW1ldGVyICckcGFyYW1ldGVyJyByZWRlY2xhcmVkLiIpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycykgewogICAgdHlwZVBhcmFtZXRlcnNJblNjb3BlLnJlbW92ZUFsbChwYXJhbWV0ZXJzKTsKICB9CgogIHZvaWQgY2hlY2tWYXJpYWJsZUluU2NvcGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSwgVHJlZU5vZGUgd2hlcmUpIHsKICAgIGlmICh2YXJpYWJsZS5mbGFncyAmIFZhcmlhYmxlRGVjbGFyYXRpb24uRmxhZ0luU2NvcGUgPT0gMCkgewogICAgICBwcm9ibGVtKHdoZXJlLCAiVmFyaWFibGUgJyR2YXJpYWJsZScgdXNlZCBvdXQgb2Ygc2NvcGUuIik7CiAgICB9CiAgfQoKICB2aXNpdENvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSB7CiAgICB0cnkgewogICAgICBmb3IgKHZhciBsaWJyYXJ5IGluIGNvbXBvbmVudC5saWJyYXJpZXMpIHsKICAgICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgICBpZiAoIWNsYXNzZXMuYWRkKGNsYXNzXykpIHsKICAgICAgICAgICAgcHJvYmxlbShjbGFzc18sICJDbGFzcyAnJGNsYXNzXycgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHR5cGVkZWZfIGluIGxpYnJhcnkudHlwZWRlZnMpIHsKICAgICAgICAgIGlmICghdHlwZWRlZnMuYWRkKHR5cGVkZWZfKSkgewogICAgICAgICAgICBwcm9ibGVtKHR5cGVkZWZfLCAiVHlwZWRlZiAnJHR5cGVkZWZfJyBkZWNsYXJlZCBtb3JlIHRoYW4gb25jZS4iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGlicmFyeS5tZW1iZXJzLmZvckVhY2goZGVjbGFyZU1lbWJlcik7CiAgICAgICAgZm9yICh2YXIgY2xhc3NfIGluIGxpYnJhcnkuY2xhc3NlcykgewogICAgICAgICAgY2xhc3NfLm1lbWJlcnMuZm9yRWFjaChkZWNsYXJlTWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmlzaXRDaGlsZHJlbihjb21wb25lbnQpOwogICAgfSBmaW5hbGx5IHsKICAgICAgZm9yICh2YXIgbGlicmFyeSBpbiBjb21wb25lbnQubGlicmFyaWVzKSB7CiAgICAgICAgbGlicmFyeS5tZW1iZXJzLmZvckVhY2godW5kZWNsYXJlTWVtYmVyKTsKICAgICAgICBmb3IgKHZhciBjbGFzc18gaW4gbGlicmFyeS5jbGFzc2VzKSB7CiAgICAgICAgICBjbGFzc18ubWVtYmVycy5mb3JFYWNoKHVuZGVjbGFyZU1lbWJlcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhcmlhYmxlU3RhY2suZm9yRWFjaCh1bmRlY2xhcmVWYXJpYWJsZSk7CiAgICB9CiAgfQoKICB2b2lkIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIGN1cnJlbnRMaWJyYXJ5ID0gbm9kZTsKICAgIHN1cGVyLnZpc2l0TGlicmFyeShub2RlKTsKICAgIGN1cnJlbnRMaWJyYXJ5ID0gbnVsbDsKICB9CgogIHZpc2l0RXh0ZW5zaW9uKEV4dGVuc2lvbiBub2RlKSB7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICBmaW5hbCBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGV4aXRQYXJlbnQob2xkUGFyZW50KTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgdm9pZCBjaGVja1R5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICB2YXIgc3RhdGUgPSB0eXBlZGVmU3RhdGVbbm9kZV07CiAgICBpZiAoc3RhdGUgPT0gVHlwZWRlZlN0YXRlLkRvbmUpIHJldHVybjsKICAgIGlmIChzdGF0ZSA9PSBUeXBlZGVmU3RhdGUuQmVpbmdDaGVja2VkKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlRoZSB0eXBlZGVmICckbm9kZScgcmVmZXJzIHRvIGl0c2VsZiIsIGNvbnRleHQ6IG5vZGUpOwogICAgfQogICAgYXNzZXJ0KHN0YXRlID09IG51bGwpOwogICAgdHlwZWRlZlN0YXRlW25vZGVdID0gVHlwZWRlZlN0YXRlLkJlaW5nQ2hlY2tlZDsKICAgIHZhciBzYXZlZFR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnNJblNjb3BlOwogICAgdHlwZVBhcmFtZXRlcnNJblNjb3BlID0gbm9kZS50eXBlUGFyYW1ldGVycy50b1NldCgpOwogICAgdmFyIHNhdmVkUGFyZW50ID0gY3VycmVudFBhcmVudDsKICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlOwogICAgLy8gVmlzaXQgY2hpbGRyZW4gd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHBvaW50ZXIgb24gdGhlIHR5cGVkZWYgaXRzZWxmCiAgICAvLyBzaW5jZSB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhIGNvbnRleHQgb3RoZXIgdGhhbiBpdHMgdHJ1ZSBwYXJlbnQuCiAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICBjdXJyZW50UGFyZW50ID0gc2F2ZWRQYXJlbnQ7CiAgICB0eXBlUGFyYW1ldGVyc0luU2NvcGUgPSBzYXZlZFR5cGVQYXJhbWV0ZXJzOwogICAgdHlwZWRlZlN0YXRlW25vZGVdID0gVHlwZWRlZlN0YXRlLkRvbmU7CiAgfQoKICB2aXNpdFR5cGVkZWYoVHlwZWRlZiBub2RlKSB7CiAgICBjaGVja1R5cGVkZWYobm9kZSk7CiAgICAvLyBFbnRlciBhbmQgZXhpdCB0aGUgbm9kZSB0byBjaGVjayB0aGUgcGFyZW50IHBvaW50ZXIgb24gdGhlIHR5cGVkZWYgbm9kZS4KICAgIGV4aXRQYXJlbnQoZW50ZXJQYXJlbnQobm9kZSkpOwogIH0KCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGJvb2wgaXNUb3BMZXZlbCA9IG5vZGUucGFyZW50ID09IGN1cnJlbnRMaWJyYXJ5OwogICAgaWYgKGlzVG9wTGV2ZWwgJiYgIW5vZGUuaXNTdGF0aWMpIHsKICAgICAgcHJvYmxlbShub2RlLCAiVGhlIHRvcC1sZXZlbCBmaWVsZCAnJHtub2RlLm5hbWUubmFtZX0nIHNob3VsZCBiZSBzdGF0aWMiLAogICAgICAgICAgY29udGV4dDogbm9kZSk7CiAgICB9CiAgICBpZiAobm9kZS5pc0NvbnN0ICYmICFub2RlLmlzU3RhdGljKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlRoZSBjb25zdCBmaWVsZCAnJHtub2RlLm5hbWUubmFtZX0nIHNob3VsZCBiZSBzdGF0aWMiLAogICAgICAgICAgY29udGV4dDogbm9kZSk7CiAgICB9CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9ICFub2RlLmlzU3RhdGljOwogICAgbm9kZS5pbml0aWFsaXplcj8uYWNjZXB0KHRoaXMpOwogICAgbm9kZS50eXBlLmFjY2VwdCh0aGlzKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gIW5vZGUuaXNTdGF0aWM7CiAgICBub2RlLmZ1bmN0aW9uLmFjY2VwdCh0aGlzKTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjdXJyZW50TWVtYmVyID0gbnVsbDsKICB9CgogIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgY3VycmVudE1lbWJlciA9IG5vZGU7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IHRydWU7CiAgICAvLyBUaGUgY29uc3RydWN0b3IgbWVtYmVyIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBwYXJhbWV0ZXJzIGJlaW5nCiAgICAvLyBpbiBzY29wZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KICAgIHZhciBvbGRQYXJlbnQgPSBlbnRlclBhcmVudChub2RlKTsKICAgIGludCBzdGFja0hlaWdodCA9IGVudGVyTG9jYWxTY29wZSgpOwogICAgdmlzaXRDaGlsZHJlbihub2RlLmZ1bmN0aW9uKTsKICAgIHZpc2l0TGlzdChub2RlLmluaXRpYWxpemVycywgdGhpcyk7CiAgICBpZiAoIWlzT3V0bGluZSkgewogICAgICBjaGVja0luaXRpYWxpemVycyhub2RlKTsKICAgIH0KICAgIGV4aXRMb2NhbFNjb3BlKHN0YWNrSGVpZ2h0KTsKICAgIGNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlID0gZmFsc2U7CiAgICB2aXNpdExpc3Qobm9kZS5hbm5vdGF0aW9ucywgdGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwogICAgY3VycmVudE1lbWJlciA9IG51bGw7CiAgfQoKICB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIGN1cnJlbnRDbGFzcyA9IG5vZGU7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICB2YXIgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQXJlSW5TY29wZSA9IGZhbHNlOwogICAgdmlzaXRMaXN0KG5vZGUuYW5ub3RhdGlvbnMsIHRoaXMpOwogICAgY2xhc3NUeXBlUGFyYW1ldGVyc0FyZUluU2NvcGUgPSB0cnVlOwogICAgdmlzaXRMaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMpOwogICAgdmlzaXRMaXN0KG5vZGUuZmllbGRzLCB0aGlzKTsKICAgIHZpc2l0TGlzdChub2RlLmNvbnN0cnVjdG9ycywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5wcm9jZWR1cmVzLCB0aGlzKTsKICAgIGV4aXRQYXJlbnQob2xkUGFyZW50KTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogICAgY3VycmVudENsYXNzID0gbnVsbDsKICB9CgogIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBkZWNsYXJlVHlwZVBhcmFtZXRlcnMobm9kZS50eXBlUGFyYW1ldGVycyk7CiAgICBib29sIHNhdmVkSW5DYXRjaEJsb2NrID0gaW5DYXRjaEJsb2NrOwogICAgaW5DYXRjaEJsb2NrID0gZmFsc2U7CiAgICB2aXNpdFdpdGhMb2NhbFNjb3BlKG5vZGUpOwogICAgaW5DYXRjaEJsb2NrID0gc2F2ZWRJbkNhdGNoQmxvY2s7CiAgICB1bmRlY2xhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICB9CgogIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG5vZGUubmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChub2RlLm5hbWVkUGFyYW1ldGVyc1tpIC0gMV0uY29tcGFyZVRvKG5vZGUubmFtZWRQYXJhbWV0ZXJzW2ldKSA+PSAwKSB7CiAgICAgICAgcHJvYmxlbShjdXJyZW50UGFyZW50LAogICAgICAgICAgICAiTmFtZWQgcGFyYW1ldGVycyBhcmUgbm90IHNvcnRlZCBvbiBmdW5jdGlvbiB0eXBlICgkbm9kZSkuIik7CiAgICAgIH0KICAgIH0KICAgIGRlY2xhcmVUeXBlUGFyYW1ldGVycyhub2RlLnR5cGVQYXJhbWV0ZXJzKTsKICAgIGZvciAodmFyIHR5cGVQYXJhbWV0ZXIgaW4gbm9kZS50eXBlUGFyYW1ldGVycykgewogICAgICB0eXBlUGFyYW1ldGVyLmJvdW5kPy5hY2NlcHQodGhpcyk7CiAgICAgIGlmICh0eXBlUGFyYW1ldGVyLmFubm90YXRpb25zLmlzTm90RW1wdHkpIHsKICAgICAgICBwcm9ibGVtKAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyLCAiQW5ub3RhdGlvbiBvbiB0eXBlIHBhcmFtZXRlciBpbiBmdW5jdGlvbiB0eXBlLiIpOwogICAgICB9CiAgICB9CiAgICB2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycywgdGhpcyk7CiAgICB2aXNpdExpc3Qobm9kZS5uYW1lZFBhcmFtZXRlcnMsIHRoaXMpOwogICAgbm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKTsKICAgIHVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzKG5vZGUudHlwZVBhcmFtZXRlcnMpOwogIH0KCiAgdmlzaXRCbG9jayhCbG9jayBub2RlKSB7CiAgICB2aXNpdFdpdGhMb2NhbFNjb3BlKG5vZGUpOwogIH0KCiAgdmlzaXRGb3JTdGF0ZW1lbnQoRm9yU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0V2l0aExvY2FsU2NvcGUobm9kZSk7CiAgfQoKICB2aXNpdEZvckluU3RhdGVtZW50KEZvckluU3RhdGVtZW50IG5vZGUpIHsKICAgIHZpc2l0V2l0aExvY2FsU2NvcGUobm9kZSk7CiAgfQoKICB2aXNpdExldChMZXQgbm9kZSkgewogICAgdmlzaXRXaXRoTG9jYWxTY29wZShub2RlKTsKICB9CgogIHZpc2l0QmxvY2tFeHByZXNzaW9uKEJsb2NrRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpbnQgc3RhY2tIZWlnaHQgPSBlbnRlckxvY2FsU2NvcGUoKTsKICAgIC8vIERvIG5vdCB2aXNpdCB0aGUgYmxvY2sgZGlyZWN0bHkgYmVjYXVzZSB0aGUgdmFsdWUgZXhwcmVzc2lvbiBuZWVkcyB0bwogICAgLy8gYmUgaW4gaXRzIHNjb3BlLgogICAgVHJlZU5vZGUgb2xkUGFyZW50ID0gZW50ZXJQYXJlbnQobm9kZSk7CiAgICBlbnRlclBhcmVudChub2RlLmJvZHkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICBub2RlLmJvZHkuc3RhdGVtZW50c1tpXS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBleGl0UGFyZW50KG5vZGUpOwogICAgbm9kZS52YWx1ZS5hY2NlcHQodGhpcyk7CiAgICBleGl0UGFyZW50KG9sZFBhcmVudCk7CiAgICBleGl0TG9jYWxTY29wZShzdGFja0hlaWdodCk7CiAgfQoKICB2aXNpdENhdGNoKENhdGNoIG5vZGUpIHsKICAgIGJvb2wgc2F2ZWRJbkNhdGNoQmxvY2sgPSBpbkNhdGNoQmxvY2s7CiAgICBpbkNhdGNoQmxvY2sgPSB0cnVlOwogICAgdmlzaXRXaXRoTG9jYWxTY29wZShub2RlKTsKICAgIGluQ2F0Y2hCbG9jayA9IHNhdmVkSW5DYXRjaEJsb2NrOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRSZXRocm93KFJldGhyb3cgbm9kZSkgewogICAgaWYgKCFpbkNhdGNoQmxvY2spIHsKICAgICAgcHJvYmxlbShub2RlLCAiUmV0aHJvdyBtdXN0IGJlIGluc2lkZSBhIENhdGNoIGJsb2NrLiIpOwogICAgfQogIH0KCiAgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewogICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgaWYgKHBhcmVudCBpcyEgQmxvY2sgJiYKICAgICAgICAhKHBhcmVudCBpcyBDYXRjaCAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgICEocGFyZW50IGlzIEZ1bmN0aW9uTm9kZSAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgIHBhcmVudCBpcyEgRnVuY3Rpb25EZWNsYXJhdGlvbiAmJgogICAgICAgICEocGFyZW50IGlzIEZvclN0YXRlbWVudCAmJiBwYXJlbnQuYm9keSAhPSBub2RlKSAmJgogICAgICAgICEocGFyZW50IGlzIEZvckluU3RhdGVtZW50ICYmIHBhcmVudC5ib2R5ICE9IG5vZGUpICYmCiAgICAgICAgcGFyZW50IGlzISBMZXQgJiYKICAgICAgICBwYXJlbnQgaXMhIExvY2FsSW5pdGlhbGl6ZXIpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdGlvbiBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGEgQmxvY2ssICIKICAgICAgICAgICJub3QgJHtwYXJlbnQucnVudGltZVR5cGV9LiIpOwogICAgfQogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGRlY2xhcmVWYXJpYWJsZShub2RlKTsKICAgIGlmIChhZnRlckNvbnN0ICYmIG5vZGUuaXNDb25zdCkgewogICAgICBFeHByZXNzaW9uIGluaXRpYWxpemVyID0gbm9kZS5pbml0aWFsaXplcjsKICAgICAgaWYgKCEoaW5pdGlhbGl6ZXIgaXMgSW52YWxpZEV4cHJlc3Npb24gfHwKICAgICAgICAgIGluaXRpYWxpemVyIGlzIENvbnN0YW50RXhwcmVzc2lvbiAmJgogICAgICAgICAgICAgIGluaXRpYWxpemVyLmNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpKSB7CiAgICAgICAgcHJvYmxlbShub2RlLCAiQ29uc3RhbnQgVmFyaWFibGVEZWNsYXJhdGlvbiIpOwogICAgICB9CiAgICB9CiAgfQoKICB2aXNpdFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICAgIGNoZWNrVmFyaWFibGVJblNjb3BlKG5vZGUudmFyaWFibGUsIG5vZGUpOwogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChhZnRlckNvbnN0ICYmIG5vZGUudmFyaWFibGUuaXNDb25zdCkgewogICAgICBwcm9ibGVtKG5vZGUsICJWYXJpYWJsZUdldCBvZiBjb25zdCB2YXJpYWJsZSAnJHtub2RlLnZhcmlhYmxlfScuIik7CiAgICB9CiAgfQoKICB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICAgIGNoZWNrVmFyaWFibGVJblNjb3BlKG5vZGUudmFyaWFibGUsIG5vZGUpOwogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljR2V0KFN0YXRpY0dldCBub2RlKSB7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogICAgaWYgKG5vZGUudGFyZ2V0ID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3RhdGljR2V0IHdpdGhvdXQgdGFyZ2V0LiIpOwogICAgfQogICAgLy8gQ3VycmVudGx5IENvbnN0cnVjdG9yLmhhc0dldHRlciByZXR1cm5zIGBmYWxzZWAgZXZlbiB0aG91Z2ggZmFzdGEgdXNlcyBpdAogICAgLy8gYXMgYSBnZXR0ZXIgZm9yIGludGVybmFsIHB1cnBvc2VzOgogICAgLy8KICAgIC8vIEZhc3RhIGlzIGxldHRpbmcgYWxsIGNhbGwgc2l0ZSBvZiBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIGJlIHJlc29sdmVkCiAgICAvLyB0byB0aGUgcmVhbCB0YXJnZXQuICBJbiBvcmRlciB0byByZXNvbHZlIGl0LCBpdCBzZWVtcyB0byBhZGQgYSBib2R5IGludG8KICAgIC8vIHRoZSByZWRpcmVjdGluZy1mYWN0b3J5IGNvbnN0cnVjdG9yIHdoaWNoIGNhY2hlcyB0aGUgdGFyZ2V0IGNvbnN0cnVjdG9yLgogICAgLy8gVGhhdCBjYWNoZSBpcyB2aWEgYSBgU3RhdGljR2V0KHJlYWwtY29uc3RydWN0b3IpYCBub2RlLCB3aGljaCB3ZSBtYWtlCiAgICAvLyBoZXJlIHBhc3MgdGhlIHZlcmlmaWVyLgogICAgaWYgKCFub2RlLnRhcmdldC5oYXNHZXR0ZXIgJiYgbm9kZS50YXJnZXQgaXMhIENvbnN0cnVjdG9yKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY0dldCBvZiAnJHtub2RlLnRhcmdldH0nIHdpdGhvdXQgZ2V0dGVyLiIpOwogICAgfQogICAgaWYgKG5vZGUudGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3RhdGljR2V0IG9mICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICAgIGlmIChhZnRlckNvbnN0ICYmIG5vZGUudGFyZ2V0IGlzIEZpZWxkICYmIG5vZGUudGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3RhdGljR2V0IG9mIGNvbnN0IGZpZWxkICcke25vZGUudGFyZ2V0fScuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFN0YXRpY1NldChTdGF0aWNTZXQgbm9kZSkgewogICAgdmlzaXRDaGlsZHJlbihub2RlKTsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY1NldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaGFzU2V0dGVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIlN0YXRpY1NldCB0byAnJHtub2RlLnRhcmdldH0nIHdpdGhvdXQgc2V0dGVyLiIpOwogICAgfQogICAgaWYgKG5vZGUudGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3RhdGljU2V0IHRvICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKG5vZGUudGFyZ2V0LCBub2RlKTsKICAgIGlmIChub2RlLnRhcmdldC5pc0luc3RhbmNlTWVtYmVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwKICAgICAgICAgICJTdGF0aWNJbnZvY2F0aW9uIG9mICcke25vZGUudGFyZ2V0fScgdGhhdCdzIGFuIGluc3RhbmNlIG1lbWJlci4iKTsKICAgIH0KICAgIGlmIChub2RlLmlzQ29uc3QgJiYKICAgICAgICAoIW5vZGUudGFyZ2V0LmlzQ29uc3QgfHwKICAgICAgICAgICAgIW5vZGUudGFyZ2V0LmlzRXh0ZXJuYWwgfHwKICAgICAgICAgICAgbm9kZS50YXJnZXQua2luZCAhPSBQcm9jZWR1cmVLaW5kLkZhY3RvcnkpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLAogICAgICAgICAgIkNvbnN0YW50IFN0YXRpY0ludm9jYXRpb24gb2YgJyR7bm9kZS50YXJnZXR9JyB0aGF0IGlzbid0IgogICAgICAgICAgIiBhIGNvbnN0IGV4dGVybmFsIGZhY3RvcnkuIik7CiAgICB9CiAgICBpZiAoYWZ0ZXJDb25zdCAmJiBub2RlLmlzQ29uc3QgJiYgIWluVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICBwcm9ibGVtKG5vZGUsICJDb25zdGFudCBTdGF0aWNJbnZvY2F0aW9uLiIpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1RhcmdldGVkSW52b2NhdGlvbihNZW1iZXIgdGFyZ2V0LCBJbnZvY2F0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIiR7bm9kZS5ydW50aW1lVHlwZX0gd2l0aG91dCB0YXJnZXQuIik7CiAgICB9CiAgICBpZiAodGFyZ2V0LmZ1bmN0aW9uID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiJHtub2RlLnJ1bnRpbWVUeXBlfSB3aXRob3V0IGZ1bmN0aW9uLiIpOwogICAgfQogICAgaWYgKCFhcmVBcmd1bWVudHNDb21wYXRpYmxlKG5vZGUuYXJndW1lbnRzLCB0YXJnZXQuZnVuY3Rpb24pKSB7CiAgICAgIHByb2JsZW0obm9kZSwKICAgICAgICAgICIke25vZGUucnVudGltZVR5cGV9IHdpdGggaW5jb21wYXRpYmxlIGFyZ3VtZW50cyBmb3IgJyR7dGFyZ2V0fScuIik7CiAgICB9CiAgICBpbnQgZXhwZWN0ZWRUeXBlUGFyYW1ldGVycyA9IHRhcmdldCBpcyBDb25zdHJ1Y3RvcgogICAgICAgID8gdGFyZ2V0LmVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aAogICAgICAgIDogdGFyZ2V0LmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGlmIChub2RlLmFyZ3VtZW50cy50eXBlcy5sZW5ndGggIT0gZXhwZWN0ZWRUeXBlUGFyYW1ldGVycykgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICIke25vZGUucnVudGltZVR5cGV9IHdpdGggd3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIgogICAgICAgICAgIiBmb3IgJyR7dGFyZ2V0fScuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdFByb3BlcnR5R2V0KERpcmVjdFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBpZiAobm9kZS50YXJnZXQgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICJEaXJlY3RQcm9wZXJ0eUdldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaGFzR2V0dGVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkRpcmVjdFByb3BlcnR5R2V0IG9mICcke25vZGUudGFyZ2V0fScgd2l0aG91dCBnZXR0ZXIuIik7CiAgICB9CiAgICBpZiAoIW5vZGUudGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiRGlyZWN0UHJvcGVydHlHZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB0aGF0IGlzbid0IGFuIgogICAgICAgICAgIiBpbnN0YW5jZSBtZW1iZXIuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdERpcmVjdFByb3BlcnR5U2V0KERpcmVjdFByb3BlcnR5U2V0IG5vZGUpIHsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBpZiAobm9kZS50YXJnZXQgPT0gbnVsbCkgewogICAgICBwcm9ibGVtKG5vZGUsICJEaXJlY3RQcm9wZXJ0eVNldCB3aXRob3V0IHRhcmdldC4iKTsKICAgIH0KICAgIGlmICghbm9kZS50YXJnZXQuaGFzU2V0dGVyKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkRpcmVjdFByb3BlcnR5U2V0IG9mICcke25vZGUudGFyZ2V0fScgd2l0aG91dCBzZXR0ZXIuIik7CiAgICB9CiAgICBpZiAoIW5vZGUudGFyZ2V0LmlzSW5zdGFuY2VNZW1iZXIpIHsKICAgICAgcHJvYmxlbShub2RlLCAiRGlyZWN0UHJvcGVydHlTZXQgb2YgJyR7bm9kZS50YXJnZXR9JyB0aGF0IGlzIHN0YXRpYy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbihEaXJlY3RNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKG5vZGUudGFyZ2V0LCBub2RlKTsKICAgIGlmIChub2RlLnJlY2VpdmVyID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiRGlyZWN0TWV0aG9kSW52b2NhdGlvbiB3aXRob3V0IHJlY2VpdmVyLiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGNoZWNrVGFyZ2V0ZWRJbnZvY2F0aW9uKG5vZGUudGFyZ2V0LCBub2RlKTsKICAgIGlmIChub2RlLnRhcmdldC5lbmNsb3NpbmdDbGFzcy5pc0Fic3RyYWN0KSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkNvbnN0cnVjdG9ySW52b2NhdGlvbiBvZiBhYnN0cmFjdCBjbGFzcy4iKTsKICAgIH0KICAgIGlmIChub2RlLmlzQ29uc3QgJiYgIW5vZGUudGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAiQ29uc3RhbnQgQ29uc3RydWN0b3JJbnZvY2F0aW9uIGZvICcke25vZGUudGFyZ2V0fScgdGhhdCIKICAgICAgICAgICIgaXNuJ3QgY29uc3QuIik7CiAgICB9CiAgICBpZiAoYWZ0ZXJDb25zdCAmJiBub2RlLmlzQ29uc3QpIHsKICAgICAgcHJvYmxlbShub2RlLCAiSW52b2NhdGlvbiBvZiBjb25zdCBjb25zdHJ1Y3RvciAnJHtub2RlLnRhcmdldH0nLiIpOwogICAgfQogIH0KCiAgYm9vbCBhcmVBcmd1bWVudHNDb21wYXRpYmxlKEFyZ3VtZW50cyBhcmd1bWVudHMsIEZ1bmN0aW9uTm9kZSBmdW5jdGlvbikgewogICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA8IGZ1bmN0aW9uLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGFyZ3VtZW50cy5wb3NpdGlvbmFsLmxlbmd0aCA+IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBuYW1lZExvb3A6CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5uYW1lZC5sZW5ndGg7ICsraSkgewogICAgICB2YXIgYXJndW1lbnQgPSBhcmd1bWVudHMubmFtZWRbaV07CiAgICAgIFN0cmluZyBuYW1lID0gYXJndW1lbnQubmFtZTsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmdW5jdGlvbi5uYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyArK2opIHsKICAgICAgICBpZiAoZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzW2pdLm5hbWUgPT0gbmFtZSkgY29udGludWUgbmFtZWRMb29wOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBub2RlKSB7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogICAgaWYgKGFmdGVyQ29uc3QgJiYgbm9kZS5pc0NvbnN0KSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkNvbnN0YW50IGxpc3QgbGl0ZXJhbC4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0U2V0TGl0ZXJhbChTZXRMaXRlcmFsIG5vZGUpIHsKICAgIHZpc2l0Q2hpbGRyZW4obm9kZSk7CiAgICBpZiAoYWZ0ZXJDb25zdCAmJiBub2RlLmlzQ29uc3QpIHsKICAgICAgcHJvYmxlbShub2RlLCAiQ29uc3RhbnQgc2V0IGxpdGVyYWwuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBub2RlKSB7CiAgICB2aXNpdENoaWxkcmVuKG5vZGUpOwogICAgaWYgKGFmdGVyQ29uc3QgJiYgbm9kZS5pc0NvbnN0KSB7CiAgICAgIHByb2JsZW0obm9kZSwgIkNvbnN0YW50IG1hcCBsaXRlcmFsLiIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgbm9kZSkgewogICAgaWYgKGFmdGVyQ29uc3QpIHsKICAgICAgcHJvYmxlbShub2RlLCAiU3ltYm9sIGxpdGVyYWwuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnRpbnVlU3dpdGNoU3RhdGVtZW50KENvbnRpbnVlU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKICAgIGlmIChub2RlLnRhcmdldCA9PSBudWxsKSB7CiAgICAgIHByb2JsZW0obm9kZSwgIk5vIHRhcmdldC4iKTsKICAgIH0gZWxzZSBpZiAobm9kZS50YXJnZXQucGFyZW50ID09IG51bGwpIHsKICAgICAgcHJvYmxlbShub2RlLCAiVGFyZ2V0IGhhcyBubyBwYXJlbnQuIik7CiAgICB9IGVsc2UgewogICAgICBTd2l0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbm9kZS50YXJnZXQucGFyZW50OwogICAgICBmb3IgKFN3aXRjaENhc2Ugc3dpdGNoQ2FzZSBpbiBzdGF0ZW1lbnQuY2FzZXMpIHsKICAgICAgICBpZiAoc3dpdGNoQ2FzZSA9PSBub2RlLnRhcmdldCkgcmV0dXJuOwogICAgICB9CiAgICAgIHByb2JsZW0obm9kZSwgIlN3aXRjaCBjYXNlIGlzbid0IGNoaWxkIG9mIHBhcmVudC4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW5zdGFuY2VDb25zdGFudChJbnN0YW5jZUNvbnN0YW50IGNvbnN0YW50KSB7CiAgICBjb25zdGFudC52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgaWYgKGNvbnN0YW50LnR5cGVBcmd1bWVudHMubGVuZ3RoICE9CiAgICAgICAgY29uc3RhbnQuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgY3VycmVudFBhcmVudCwKICAgICAgICAgICJDb25zdGFudCAkY29uc3RhbnQgcHJvdmlkZXMgJHtjb25zdGFudC50eXBlQXJndW1lbnRzLmxlbmd0aH0iCiAgICAgICAgICAiIHR5cGUgYXJndW1lbnRzLCBidXQgdGhlIGNsYXNzIGRlY2xhcmVzIgogICAgICAgICAgIiAke2NvbnN0YW50LmNsYXNzTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGh9IHBhcmFtZXRlcnMuIik7CiAgICB9CiAgICBTZXQ8Q2xhc3M+IHN1cGVyQ2xhc3NlcyA9IDxDbGFzcz57fTsKICAgIGludCBmaWVsZENvdW50ID0gMDsKICAgIGZvciAoQ2xhc3MgY2xzID0gY29uc3RhbnQuY2xhc3NOb2RlOyBjbHMgIT0gbnVsbDsgY2xzID0gY2xzLnN1cGVyY2xhc3MpIHsKICAgICAgc3VwZXJDbGFzc2VzLmFkZChjbHMpOwogICAgICBmb3IgKEZpZWxkIGYgaW4gY2xzLmZpZWxkcykgewogICAgICAgIGlmICghZi5pc1N0YXRpYyAmJiAhZi5pc0NvbnN0KSBmaWVsZENvdW50Kys7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb25zdGFudC5maWVsZFZhbHVlcy5sZW5ndGggIT0gZmllbGRDb3VudCkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgY3VycmVudFBhcmVudCwKICAgICAgICAgICJDb25zdGFudCAkY29uc3RhbnQgcHJvdmlkZXMgJHtjb25zdGFudC5maWVsZFZhbHVlcy5sZW5ndGh9IgogICAgICAgICAgIiBmaWVsZCB2YWx1ZXMsIGJ1dCB0aGUgY2xhc3MgZGVjbGFyZXMiCiAgICAgICAgICAiICRmaWVsZENvdW50IGZpZWxkcy4iKTsKICAgIH0KICAgIGNvbnN0YW50LmZpZWxkVmFsdWVzLmZvckVhY2goKFJlZmVyZW5jZSBmaWVsZFJlZiwgQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgRmllbGQgZmllbGQgPSBmaWVsZFJlZi5hc0ZpZWxkOwogICAgICBpZiAoIXN1cGVyQ2xhc3Nlcy5jb250YWlucyhmaWVsZC5lbmNsb3NpbmdDbGFzcykpIHsKICAgICAgICBwcm9ibGVtKAogICAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgICAiQ29uc3RhbnQgJGNvbnN0YW50IHJlZmVycyB0byBmaWVsZCAkZmllbGQsIgogICAgICAgICAgICAiIHdoaWNoIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgcmlnaHQgY2xhc3MuIik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRVbmV2YWx1YXRlZENvbnN0YW50KFVuZXZhbHVhdGVkQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChpblVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgcHJvYmxlbShjdXJyZW50UGFyZW50LCAiVW5ldmFsdWF0ZWRDb25zdGFudCBpbiBVbmV2YWx1YXRlZENvbnN0YW50LiIpOwogICAgfQogICAgYm9vbCBzYXZlZEluVW5ldmFsdWF0ZWRDb25zdGFudCA9IGluVW5ldmFsdWF0ZWRDb25zdGFudDsKICAgIGluVW5ldmFsdWF0ZWRDb25zdGFudCA9IHRydWU7CiAgICBUcmVlTm9kZSBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwogICAgY3VycmVudFBhcmVudCA9IG51bGw7CiAgICBjb25zdGFudC5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKICAgIGN1cnJlbnRQYXJlbnQgPSBvbGRQYXJlbnQ7CiAgICBpblVuZXZhbHVhdGVkQ29uc3RhbnQgPSBzYXZlZEluVW5ldmFsdWF0ZWRDb25zdGFudDsKICB9CgogIEBvdmVycmlkZQogIGRlZmF1bHRNZW1iZXJSZWZlcmVuY2UoTWVtYmVyIG5vZGUpIHsKICAgIGlmIChub2RlLnRyYW5zZm9ybWVyRmxhZ3MgJiBUcmFuc2Zvcm1lckZsYWcuc2VlbkJ5VmVyaWZpZXIgPT0gMCkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwgIkRhbmdsaW5nIHJlZmVyZW5jZSB0byAnJG5vZGUnLCBwYXJlbnQgaXM6ICcke25vZGUucGFyZW50fScuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENsYXNzUmVmZXJlbmNlKENsYXNzIG5vZGUpIHsKICAgIGlmICghY2xhc3Nlcy5jb250YWlucyhub2RlKSkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgbm9kZSwgIkRhbmdsaW5nIHJlZmVyZW5jZSB0byAnJG5vZGUnLCBwYXJlbnQgaXM6ICcke25vZGUucGFyZW50fScuIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdFR5cGVkZWZSZWZlcmVuY2UoVHlwZWRlZiBub2RlKSB7CiAgICBpZiAoIXR5cGVkZWZzLmNvbnRhaW5zKG5vZGUpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBub2RlLCAiRGFuZ2xpbmcgcmVmZXJlbmNlIHRvICckbm9kZScsIHBhcmVudCBpczogJyR7bm9kZS5wYXJlbnR9JyIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyVHlwZSBub2RlKSB7CiAgICB2YXIgcGFyYW1ldGVyID0gbm9kZS5wYXJhbWV0ZXI7CiAgICBpZiAoIXR5cGVQYXJhbWV0ZXJzSW5TY29wZS5jb250YWlucyhwYXJhbWV0ZXIpKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgIlR5cGUgcGFyYW1ldGVyICckcGFyYW1ldGVyJyByZWZlcmVuY2VkIG91dCBvZiIKICAgICAgICAgICIgc2NvcGUsIHBhcmVudCBpczogJyR7cGFyYW1ldGVyLnBhcmVudH0nLiIpOwogICAgfQogICAgaWYgKHBhcmFtZXRlci5wYXJlbnQgaXMgQ2xhc3MgJiYgIWNsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlKSB7CiAgICAgIHByb2JsZW0oCiAgICAgICAgICBjdXJyZW50UGFyZW50LAogICAgICAgICAgIlR5cGUgcGFyYW1ldGVyICckcGFyYW1ldGVyJyByZWZlcmVuY2VkIGZyb20iCiAgICAgICAgICAiIHN0YXRpYyBjb250ZXh0LCBwYXJlbnQgaXM6ICcke3BhcmFtZXRlci5wYXJlbnR9Jy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0SW50ZXJmYWNlVHlwZShJbnRlcmZhY2VUeXBlIG5vZGUpIHsKICAgIG5vZGUudmlzaXRDaGlsZHJlbih0aGlzKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICBwcm9ibGVtKAogICAgICAgICAgY3VycmVudFBhcmVudCwKICAgICAgICAgICJUeXBlICRub2RlIHByb3ZpZGVzICR7bm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aH0iCiAgICAgICAgICAiIHR5cGUgYXJndW1lbnRzLCBidXQgdGhlIGNsYXNzIGRlY2xhcmVzIgogICAgICAgICAgIiAke25vZGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aH0gcGFyYW1ldGVycy4iKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZpc2l0VHlwZWRlZlR5cGUoVHlwZWRlZlR5cGUgbm9kZSkgewogICAgY2hlY2tUeXBlZGVmKG5vZGUudHlwZWRlZk5vZGUpOwogICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9kZS50eXBlZGVmTm9kZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcHJvYmxlbSgKICAgICAgICAgIGN1cnJlbnRQYXJlbnQsCiAgICAgICAgICAiVGhlIHR5cGVkZWYgdHlwZSAkbm9kZSBwcm92aWRlcyAke25vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGh9IgogICAgICAgICAgIiB0eXBlIGFyZ3VtZW50cywgYnV0IHRoZSB0eXBlZGVmIGRlY2xhcmVzIgogICAgICAgICAgIiAke25vZGUudHlwZWRlZk5vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RofSBwYXJhbWV0ZXJzLiIpOwogICAgfQogIH0KfQoKdm9pZCB2ZXJpZnlHZXRTdGF0aWNUeXBlKFR5cGVFbnZpcm9ubWVudCBlbnYsIENvbXBvbmVudCBjb21wb25lbnQpIHsKICBjb21wb25lbnQuYWNjZXB0KG5ldyBWZXJpZnlHZXRTdGF0aWNUeXBlKGVudikpOwp9CgpjbGFzcyBWZXJpZnlHZXRTdGF0aWNUeXBlIGV4dGVuZHMgUmVjdXJzaXZlVmlzaXRvciB7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IGVudjsKICBNZW1iZXIgY3VycmVudE1lbWJlcjsKICBmaW5hbCBTdGF0ZWZ1bFN0YXRpY1R5cGVDb250ZXh0IF9zdGF0aWNUeXBlQ29udGV4dDsKCiAgVmVyaWZ5R2V0U3RhdGljVHlwZSh0aGlzLmVudikKICAgICAgOiBfc3RhdGljVHlwZUNvbnRleHQgPSBuZXcgU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dC5zdGFja2VkKGVudik7CgogIEBvdmVycmlkZQogIHZpc2l0TGlicmFyeShMaWJyYXJ5IG5vZGUpIHsKICAgIF9zdGF0aWNUeXBlQ29udGV4dC5lbnRlckxpYnJhcnkobm9kZSk7CiAgICBzdXBlci52aXNpdExpYnJhcnkobm9kZSk7CiAgICBfc3RhdGljVHlwZUNvbnRleHQubGVhdmVMaWJyYXJ5KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdmlzaXRGaWVsZChGaWVsZCBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIF9zdGF0aWNUeXBlQ29udGV4dC5lbnRlck1lbWJlcihub2RlKTsKICAgIHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CiAgICBfc3RhdGljVHlwZUNvbnRleHQubGVhdmVNZW1iZXIobm9kZSk7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIHZpc2l0UHJvY2VkdXJlKFByb2NlZHVyZSBub2RlKSB7CiAgICBjdXJyZW50TWVtYmVyID0gbm9kZTsKICAgIF9zdGF0aWNUeXBlQ29udGV4dC5lbnRlck1lbWJlcihub2RlKTsKICAgIHN1cGVyLnZpc2l0UHJvY2VkdXJlKG5vZGUpOwogICAgX3N0YXRpY1R5cGVDb250ZXh0LmxlYXZlTWVtYmVyKG5vZGUpOwogICAgY3VycmVudE1lbWJlciA9IG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIG5vZGUpIHsKICAgIGN1cnJlbnRNZW1iZXIgPSBub2RlOwogICAgX3N0YXRpY1R5cGVDb250ZXh0LmVudGVyTWVtYmVyKG5vZGUpOwogICAgc3VwZXIudmlzaXRDb25zdHJ1Y3Rvcihub2RlKTsKICAgIF9zdGF0aWNUeXBlQ29udGV4dC5sZWF2ZU1lbWJlcihub2RlKTsKICAgIGN1cnJlbnRNZW1iZXIgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgZGVmYXVsdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICB0cnkgewogICAgICBub2RlLmdldFN0YXRpY1R5cGUoX3N0YXRpY1R5cGVDb250ZXh0KTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgcHJpbnQoJ0Vycm9yIGluICRjdXJyZW50TWVtYmVyIGluICR7Y3VycmVudE1lbWJlcj8uZmlsZVVyaX06ICcKICAgICAgICAgICckbm9kZSAoJHtub2RlLnJ1bnRpbWVUeXBlfSknKTsKICAgICAgcmV0aHJvdzsKICAgIH0KICAgIHN1cGVyLmRlZmF1bHRFeHByZXNzaW9uKG5vZGUpOwogIH0KfQoKY2xhc3MgQ2hlY2tQYXJlbnRQb2ludGVycyBleHRlbmRzIFZpc2l0b3IgewogIHN0YXRpYyB2b2lkIGNoZWNrKFRyZWVOb2RlIG5vZGUpIHsKICAgIG5vZGUuYWNjZXB0KG5ldyBDaGVja1BhcmVudFBvaW50ZXJzKG5vZGUucGFyZW50KSk7CiAgfQoKICBUcmVlTm9kZSBwYXJlbnQ7CgogIENoZWNrUGFyZW50UG9pbnRlcnMoW3RoaXMucGFyZW50XSk7CgogIGRlZmF1bHRUcmVlTm9kZShUcmVlTm9kZSBub2RlKSB7CiAg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aG93IFVpbnQ4TGlzdDsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvY2xhc3NfbWVtYmVyX3BhcnNlci5kYXJ0JwogICAgc2hvdyBDbGFzc01lbWJlclBhcnNlcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvcGFyc2VyLmRhcnQnCiAgICBzaG93IFBhcnNlciwgbGVuZ3RoRm9yVG9rZW47CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zY2FubmVyLmRhcnQnCiAgICBzaG93CiAgICAgICAgRXJyb3JUb2tlbiwKICAgICAgICBMYW5ndWFnZVZlcnNpb25Ub2tlbiwKICAgICAgICBTY2FubmVyLAogICAgICAgIFNjYW5uZXJDb25maWd1cmF0aW9uLAogICAgICAgIFNjYW5uZXJSZXN1bHQsCiAgICAgICAgVG9rZW4sCiAgICAgICAgc2NhbjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29tcG9uZW50LAogICAgICAgIERhcnRUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRnVuY3Rpb25Ob2RlLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBOdWxsYWJpbGl0eSwKICAgICAgICBQcm9jZWR1cmVLaW5kLAogICAgICAgIFJlZmVyZW5jZSwKICAgICAgICBTdXBlcnR5cGUsCiAgICAgICAgVHJlZU5vZGU7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JwogICAgc2hvdyBDbGFzc0hpZXJhcmNoeSwgSGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvcmVmZXJlbmNlX2Zyb21faW5kZXguZGFydCcgc2hvdyBSZWZlcmVuY2VGcm9tSW5kZXg7CgppbXBvcnQgJy4uLy4uL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydCc7CgppbXBvcnQgJy4uLy4uL2Jhc2UvY29tbW9uLmRhcnQnOwoKaW1wb3J0ICcuLi8uLi9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0JyBzaG93IEluc3RydW1lbnRhdGlvbjsKCmltcG9ydCAnLi4vYmxhY2tsaXN0ZWRfY2xhc3Nlcy5kYXJ0JyBzaG93IGJsYWNrbGlzdGVkQ29yZUNsYXNzZXM7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9lbnVtX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9leHRlbnNpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2ZpZWxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3Byb2NlZHVyZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwoKaW1wb3J0ICcuLi9leHBvcnQuZGFydCcgc2hvdyBFeHBvcnQ7CgppbXBvcnQgJy4uL2ltcG9ydC5kYXJ0JyBzaG93IEltcG9ydDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIFN1bW1hcnlUZW1wbGF0ZSwKICAgICAgICBUZW1wbGF0ZSwKICAgICAgICBtZXNzYWdlT2JqZWN0RXh0ZW5kcywKICAgICAgICBtZXNzYWdlT2JqZWN0SW1wbGVtZW50cywKICAgICAgICBtZXNzYWdlT2JqZWN0TWl4ZXNJbiwKICAgICAgICBtZXNzYWdlUGFydE9ycGhhbiwKICAgICAgICBub0xlbmd0aCwKICAgICAgICB0ZW1wbGF0ZUFtYmlndW91c1N1cGVydHlwZXMsCiAgICAgICAgdGVtcGxhdGVDYW50UmVhZEZpbGUsCiAgICAgICAgdGVtcGxhdGVDeWNsaWNDbGFzc0hpZXJhcmNoeSwKICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnRDb250ZXh0LAogICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnQsCiAgICAgICAgdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQsCiAgICAgICAgdGVtcGxhdGVFeHRlbmRpbmdFbnVtLAogICAgICAgIHRlbXBsYXRlRXh0ZW5kaW5nUmVzdHJpY3RlZCwKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbiwKICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzLAogICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZSwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWUsCiAgICAgICAgdGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeSwKICAgICAgICB0ZW1wbGF0ZVVudHJhbnNsYXRhYmxlVXJpOwoKaW1wb3J0ICcuLi9rZXJuZWwva2VybmVsX2J1aWxkZXIuZGFydCcKICAgIHNob3cgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLCBEZWxheWVkTWVtYmVyLCBEZWxheWVkT3ZlcnJpZGVDaGVjazsKCmltcG9ydCAnLi4va2VybmVsL2tlcm5lbF90YXJnZXQuZGFydCcgc2hvdyBLZXJuZWxUYXJnZXQ7CgppbXBvcnQgJy4uL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAnLi4va2VybmVsL3RyYW5zZm9ybV9jb2xsZWN0aW9ucy5kYXJ0JyBzaG93IENvbGxlY3Rpb25UcmFuc2Zvcm1lcjsKCmltcG9ydCAnLi4va2VybmVsL3RyYW5zZm9ybV9zZXRfbGl0ZXJhbHMuZGFydCcgc2hvdyBTZXRMaXRlcmFsVHJhbnNmb3JtZXI7CgppbXBvcnQgJy4uL2tlcm5lbC90eXBlX2J1aWxkZXJfY29tcHV0ZXIuZGFydCcgc2hvdyBUeXBlQnVpbGRlckNvbXB1dGVyOwoKaW1wb3J0ICcuLi9sb2FkZXIuZGFydCcgc2hvdyBMb2FkZXIsIHVudHJhbnNsYXRhYmxlVXJpU2NoZW1lOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JyBzaG93IGludGVybmFsUHJvYmxlbTsKCmltcG9ydCAnLi4vc291cmNlL3N0YWNrX2xpc3RlbmVyX2ltcGwuZGFydCcgc2hvdyBvZmZzZXRGb3JUb2tlbjsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnQnOwoKaW1wb3J0ICcuLi90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQnOwoKaW1wb3J0ICdkaWV0X2xpc3RlbmVyLmRhcnQnIHNob3cgRGlldExpc3RlbmVyOwoKaW1wb3J0ICdkaWV0X3BhcnNlci5kYXJ0JyBzaG93IERpZXRQYXJzZXI7CgppbXBvcnQgJ291dGxpbmVfYnVpbGRlci5kYXJ0JyBzaG93IE91dGxpbmVCdWlsZGVyOwoKaW1wb3J0ICdzb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUNsYXNzQnVpbGRlcjsKCmltcG9ydCAnc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKY2xhc3MgU291cmNlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICAvLy8gVGhlIFtGaWxlU3lzdGVtXSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBhY2Nlc3MgZmlsZXMuCiAgZmluYWwgRmlsZVN5c3RlbSBmaWxlU3lzdGVtOwoKICAvLy8gV2hldGhlciBjb21tZW50cyBzaG91bGQgYmUgc2Nhbm5lZCBhbmQgcGFyc2VkLgogIGZpbmFsIGJvb2wgaW5jbHVkZUNvbW1lbnRzOwoKICBmaW5hbCBNYXA8VXJpLCBMaXN0PGludD4+IHNvdXJjZUJ5dGVzID0gPFVyaSwgTGlzdDxpbnQ+Pnt9OwoKICBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgYnVpbGRlckhpZXJhcmNoeTsKCiAgUmVmZXJlbmNlRnJvbUluZGV4IHJlZmVyZW5jZUZyb21JbmRleDsKCiAgLy8vIFVzZWQgd2hlbiBidWlsZGluZyBkaXJlY3RseSB0byBrZXJuZWwuCiAgQ2xhc3NIaWVyYXJjaHkgaGllcmFyY2h5OwogIENvcmVUeXBlcyBfY29yZVR5cGVzOwoKICAvLy8gRm9yIGJ1aWxkZXJzIGNyZWF0ZWQgd2l0aCBhIHJlZmVyZW5jZSwgdGhpcyBtYXBzIGZyb20gdGhhdCByZWZlcmVuY2UgdG8KICAvLy8gdGhhdCBidWlsZGVyLiBUaGlzIGlzIHVzZWQgZm9yIGxvb2tpbmcgdXAgc291cmNlIGJ1aWxkZXJzIHdoZW4gZmluYWxpemluZwogIC8vLyBleHBvcnRzIGluIGRpbGwgYnVpbGRlcnMuCiAgTWFwPFJlZmVyZW5jZSwgQnVpbGRlcj4gYnVpbGRlcnNDcmVhdGVkV2l0aFJlZmVyZW5jZXMgPSB7fTsKCiAgLy8vIFVzZWQgd2hlbiBjaGVja2luZyB3aGV0aGVyIGEgcmV0dXJuIHR5cGUgb2YgYW4gYXN5bmMgZnVuY3Rpb24gaXMgdmFsaWQuCiAgLy8vCiAgLy8vIFRoZSBzYWlkIHJldHVybiB0eXBlIGlzIHZhbGlkIGlmIGl0J3MgYSBzdWJ0eXBlIG9mIFtmdXR1cmVPZkJvdHRvbV0uCiAgRGFydFR5cGUgZnV0dXJlT2ZCb3R0b207CgogIC8vLyBVc2VkIHdoZW4gY2hlY2tpbmcgd2hldGhlciBhIHJldHVybiB0eXBlIG9mIGEgc3luYyogZnVuY3Rpb24gaXMgdmFsaWQuCiAgLy8vCiAgLy8vIFRoZSBzYWlkIHJldHVybiB0eXBlIGlzIHZhbGlkIGlmIGl0J3MgYSBzdWJ0eXBlIG9mIFtpdGVyYWJsZU9mQm90dG9tXS4KICBEYXJ0VHlwZSBpdGVyYWJsZU9mQm90dG9tOwoKICAvLy8gVXNlZCB3aGVuIGNoZWNraW5nIHdoZXRoZXIgYSByZXR1cm4gdHlwZSBvZiBhbiBhc3luYyogZnVuY3Rpb24gaXMgdmFsaWQuCiAgLy8vCiAgLy8vIFRoZSBzYWlkIHJldHVybiB0eXBlIGlzIHZhbGlkIGlmIGl0J3MgYSBzdWJ0eXBlIG9mIFtzdHJlYW1PZkJvdHRvbV0uCiAgRGFydFR5cGUgc3RyZWFtT2ZCb3R0b207CgogIFR5cGVJbmZlcmVuY2VFbmdpbmVJbXBsIHR5cGVJbmZlcmVuY2VFbmdpbmU7CgogIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb247CgogIENvbGxlY3Rpb25UcmFuc2Zvcm1lciBjb2xsZWN0aW9uVHJhbnNmb3JtZXI7CgogIFNldExpdGVyYWxUcmFuc2Zvcm1lciBzZXRMaXRlcmFsVHJhbnNmb3JtZXI7CgogIGZpbmFsIFNvdXJjZUxvYWRlckRhdGFGb3JUZXN0aW5nIGRhdGFGb3JUZXN0aW5nOwoKICBTb3VyY2VMb2FkZXIodGhpcy5maWxlU3lzdGVtLCB0aGlzLmluY2x1ZGVDb21tZW50cywgS2VybmVsVGFyZ2V0IHRhcmdldCkKICAgICAgOiBkYXRhRm9yVGVzdGluZyA9CiAgICAgICAgICAgIHJldGFpbkRhdGFGb3JUZXN0aW5nID8gbmV3IFNvdXJjZUxvYWRlckRhdGFGb3JUZXN0aW5nKCkgOiBudWxsLAogICAgICAgIHN1cGVyKHRhcmdldCk7CgogIGJvb2wgZ2V0IG5uYmRTdHJvbmdNb2RlID0+IHRhcmdldC5jb250ZXh0Lm9wdGlvbnMubm5iZFN0cm9uZ01vZGU7CgogIGJvb2wgZ2V0IHBlcmZvcm1ObmJkQ2hlY2tzID0+IHRhcmdldC5jb250ZXh0Lm9wdGlvbnMucGVyZm9ybU5uYmRDaGVja3M7CgogIENvcmVUeXBlcyBnZXQgY29yZVR5cGVzIHsKICAgIGFzc2VydChfY29yZVR5cGVzICE9IG51bGwsICJDb3JlVHlwZXMgaGFzIG5vdCBiZWVuIGNvbXB1dGVkLiIpOwogICAgcmV0dXJuIF9jb3JlVHlwZXM7CiAgfQoKICBUZW1wbGF0ZTxTdW1tYXJ5VGVtcGxhdGU+IGdldCBvdXRsaW5lU3VtbWFyeVRlbXBsYXRlID0+CiAgICAgIHRlbXBsYXRlU291cmNlT3V0bGluZVN1bW1hcnk7CgogIGJvb2wgZ2V0IGlzU291cmNlTG9hZGVyID0+IHRydWU7CgogIEZ1dHVyZTxUb2tlbj4gdG9rZW5pemUoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAge2Jvb2wgc3VwcHJlc3NMZXhpY2FsRXJyb3JzOiBmYWxzZX0pIGFzeW5jIHsKICAgIFVyaSB1cmkgPSBsaWJyYXJ5LmZpbGVVcmk7CgogICAgLy8gTG9va3VwIHRoZSBmaWxlIFVSSSBpbiB0aGUgY2FjaGUuCiAgICBMaXN0PGludD4gYnl0ZXMgPSBzb3VyY2VCeXRlc1t1cmldOwoKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIC8vIEVycm9yIHJlY292ZXJ5LgogICAgICBpZiAodXJpLnNjaGVtZSA9PSB1bnRyYW5zbGF0YWJsZVVyaVNjaGVtZSkgewogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9CiAgICAgICAgICAgIHRlbXBsYXRlVW50cmFuc2xhdGFibGVVcmkud2l0aEFyZ3VtZW50cyhsaWJyYXJ5LmltcG9ydFVyaSk7CiAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtQXRBY2Nlc3NvcnMobWVzc2FnZSk7CiAgICAgICAgYnl0ZXMgPSBzeW50aGVzaXplU291cmNlRm9yTWlzc2luZ0ZpbGUobGlicmFyeS5pbXBvcnRVcmksIG51bGwpOwogICAgICB9IGVsc2UgaWYgKCF1cmkuaGFzU2NoZW1lKSB7CiAgICAgICAgcmV0dXJuIGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lLndpdGhBcmd1bWVudHModXJpKSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIGxpYnJhcnkuaW1wb3J0VXJpKTsKICAgICAgfSBlbHNlIGlmICh1cmkuc2NoZW1lID09IFNvdXJjZUxpYnJhcnlCdWlsZGVyLk1BTEZPUk1FRF9VUklfU0NIRU1FKSB7CiAgICAgICAgYnl0ZXMgPSBzeW50aGVzaXplU291cmNlRm9yTWlzc2luZ0ZpbGUobGlicmFyeS5pbXBvcnRVcmksIG51bGwpOwogICAgICB9CiAgICAgIGlmIChieXRlcyAhPSBudWxsKSB7CiAgICAgICAgVWludDhMaXN0IHplcm9UZXJtaW5hdGVkQnl0ZXMgPSBuZXcgVWludDhMaXN0KGJ5dGVzLmxlbmd0aCArIDEpOwogICAgICAgIHplcm9UZXJtaW5hdGVkQnl0ZXMuc2V0UmFuZ2UoMCwgYnl0ZXMubGVuZ3RoLCBieXRlcyk7CiAgICAgICAgYnl0ZXMgPSB6ZXJvVGVybWluYXRlZEJ5dGVzOwogICAgICAgIHNvdXJjZUJ5dGVzW3VyaV0gPSBieXRlczsKICAgICAgfQogICAgfQoKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIC8vIElmIGl0IGlzbid0IGZvdW5kIGluIHRoZSBjYWNoZSwgcmVhZCB0aGUgZmlsZSByZWFkIGZyb20gdGhlIGZpbGUKICAgICAgLy8gc3lzdGVtLgogICAgICBMaXN0PGludD4gcmF3Qnl0ZXM7CiAgICAgIHRyeSB7CiAgICAgICAgcmF3Qnl0ZXMgPSBhd2FpdCBmaWxlU3lzdGVtLmVudGl0eUZvclVyaSh1cmkpLnJlYWRBc0J5dGVzKCk7CiAgICAgIH0gb24gRmlsZVN5c3RlbUV4Y2VwdGlvbiBjYXRjaCAoZSkgewogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHRlbXBsYXRlQ2FudFJlYWRGaWxlLndpdGhBcmd1bWVudHModXJpLCBlLm1lc3NhZ2UpOwogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbUF0QWNjZXNzb3JzKG1lc3NhZ2UpOwogICAgICAgIHJhd0J5dGVzID0gc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlKGxpYnJhcnkuaW1wb3J0VXJpLCBtZXNzYWdlKTsKICAgICAgfQogICAgICBVaW50OExpc3QgemVyb1Rlcm1pbmF0ZWRCeXRlcyA9IG5ldyBVaW50OExpc3QocmF3Qnl0ZXMubGVuZ3RoICsgMSk7CiAgICAgIHplcm9UZXJtaW5hdGVkQnl0ZXMuc2V0UmFuZ2UoMCwgcmF3Qnl0ZXMubGVuZ3RoLCByYXdCeXRlcyk7CiAgICAgIGJ5dGVzID0gemVyb1Rlcm1pbmF0ZWRCeXRlczsKICAgICAgc291cmNlQnl0ZXNbdXJpXSA9IGJ5dGVzOwogICAgICBieXRlQ291bnQgKz0gcmF3Qnl0ZXMubGVuZ3RoOwogICAgfQoKICAgIFNjYW5uZXJSZXN1bHQgcmVzdWx0ID0gc2NhbihieXRlcywKICAgICAgICBpbmNsdWRlQ29tbWVudHM6IGluY2x1ZGVDb21tZW50cywKICAgICAgICBjb25maWd1cmF0aW9uOiBuZXcgU2Nhbm5lckNvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgIGVuYWJsZVRyaXBsZVNoaWZ0OiB0YXJnZXQuZW5hYmxlVHJpcGxlU2hpZnQsCiAgICAgICAgICAgIGVuYWJsZUV4dGVuc2lvbk1ldGhvZHM6IHRhcmdldC5lbmFibGVFeHRlbnNpb25NZXRob2RzLAogICAgICAgICAgICBlbmFibGVOb25OdWxsYWJsZTogbGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSwKICAgICAgICBsYW5ndWFnZVZlcnNpb25DaGFuZ2VkOgogICAgICAgICAgICAoU2Nhbm5lciBzY2FubmVyLCBMYW5ndWFnZVZlcnNpb25Ub2tlbiB2ZXJzaW9uKSB7CiAgICAgIGxpYnJhcnkuc2V0TGFuZ3VhZ2VWZXJzaW9uKHZlcnNpb24ubWFqb3IsIHZlcnNpb24ubWlub3IsCiAgICAgICAgICBvZmZzZXQ6IHZlcnNpb24ub2Zmc2V0LCBsZW5ndGg6IHZlcnNpb24ubGVuZ3RoLCBleHBsaWNpdDogdHJ1ZSk7CiAgICAgIHNjYW5uZXIuY29uZmlndXJhdGlvbiA9IG5ldyBTY2FubmVyQ29uZmlndXJhdGlvbigKICAgICAgICAgIGVuYWJsZVRyaXBsZVNoaWZ0OiB0YXJnZXQuZW5hYmxlVHJpcGxlU2hpZnQsCiAgICAgICAgICBlbmFibGVFeHRlbnNpb25NZXRob2RzOiB0YXJnZXQuZW5hYmxlRXh0ZW5zaW9uTWV0aG9kcywKICAgICAgICAgIGVuYWJsZU5vbk51bGxhYmxlOiBsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgfSk7CiAgICBUb2tlbiB0b2tlbiA9IHJlc3VsdC50b2tlbnM7CiAgICBpZiAoIXN1cHByZXNzTGV4aWNhbEVycm9ycykgewogICAgICBMaXN0PGludD4gc291cmNlID0gZ2V0U291cmNlKGJ5dGVzKTsKICAgICAgVXJpIGltcG9ydFVyaSA9IGxpYnJhcnkuaW1wb3J0VXJpOwogICAgICBpZiAobGlicmFyeS5pc1BhdGNoKSB7CiAgICAgICAgLy8gRm9yIHBhdGNoIGZpbGVzIHdlIGNyZWF0ZSBhICJmYWtlIiBpbXBvcnQgdXJpLgogICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgdGhlIGltcG9ydCB1cmkgZnJvbSB0aGUgcGF0Y2hlZCBsaWJyYXJ5IGJlY2F1c2UKICAgICAgICAvLyBzZXZlcmFsIGRpZmZlcmVudCBmaWxlcyB3b3VsZCB0aGVuIGhhdmUgdGhlIHNhbWUgaW1wb3J0IHVyaSwKICAgICAgICAvLyBhbmQgdGhlIFZNIGRvZXMgbm90IHN1cHBvcnQgdGhhdC4gQWxzbywgd2hhdCB3b3VsZCwgZm9yIGluc3RhbmNlLAogICAgICAgIC8vIHNldHRpbmcgYSBicmVha3BvaW50IG9uIGxpbmUgNDIgb2Ygc29tZSBpbXBvcnQgdXJpIG1lYW4sIGlmIHRoZSB1cmkKICAgICAgICAvLyByZXByZXNlbnRlZCBzZXZlcmFsIGZpbGVzPwogICAgICAgIExpc3Q8U3RyaW5nPiBuZXdQYXRoU2VnbWVudHMgPQogICAgICAgICAgICBuZXcgTGlzdDxTdHJpbmc+LmZyb20oaW1wb3J0VXJpLnBhdGhTZWdtZW50cyk7CiAgICAgICAgbmV3UGF0aFNlZ21lbnRzLmFkZChsaWJyYXJ5LmZpbGVVcmkucGF0aFNlZ21lbnRzLmxhc3QpOwogICAgICAgIG5ld1BhdGhTZWdtZW50c1swXSA9ICIke25ld1BhdGhTZWdtZW50c1swXX0tcGF0Y2giOwogICAgICAgIGltcG9ydFVyaSA9IGltcG9ydFVyaS5yZXBsYWNlKHBhdGhTZWdtZW50czogbmV3UGF0aFNlZ21lbnRzKTsKICAgICAgfQogICAgICB0YXJnZXQuYWRkU291cmNlSW5mb3JtYXRpb24oCiAgICAgICAgICBpbXBvcnRVcmksIGxpYnJhcnkuZmlsZVVyaSwgcmVzdWx0LmxpbmVTdGFydHMsIHNvdXJjZSk7CiAgICB9CiAgICBsaWJyYXJ5Lmlzc3VlUG9zdHBvbmVkUHJvYmxlbXMoKTsKICAgIHdoaWxlICh0b2tlbiBpcyBFcnJvclRva2VuKSB7CiAgICAgIGlmICghc3VwcHJlc3NMZXhpY2FsRXJyb3JzKSB7CiAgICAgICAgRXJyb3JUb2tlbiBlcnJvciA9IHRva2VuOwogICAgICAgIGxpYnJhcnkuYWRkUHJvYmxlbShlcnJvci5hc3NlcnRpb25NZXNzYWdlLCBvZmZzZXRGb3JUb2tlbih0b2tlbiksCiAgICAgICAgICAgIGxlbmd0aEZvclRva2VuKHRva2VuKSwgdXJpKTsKICAgICAgfQogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBMaXN0PGludD4gc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlKFVyaSB1cmksIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgc3dpdGNoICgiJHVyaSIpIHsKICAgICAgY2FzZSAiZGFydDpjb3JlIjoKICAgICAgICByZXR1cm4gdXRmOC5lbmNvZGUoZGVmYXVsdERhcnRDb3JlU291cmNlKTsKCiAgICAgIGNhc2UgImRhcnQ6YXN5bmMiOgogICAgICAgIHJldHVybiB1dGY4LmVuY29kZShkZWZhdWx0RGFydEFzeW5jU291cmNlKTsKCiAgICAgIGNhc2UgImRhcnQ6Y29sbGVjdGlvbiI6CiAgICAgICAgcmV0dXJuIHV0ZjguZW5jb2RlKGRlZmF1bHREYXJ0Q29sbGVjdGlvblNvdXJjZSk7CgogICAgICBjYXNlICJkYXJ0Ol9pbnRlcm5hbCI6CiAgICAgICAgcmV0dXJuIHV0ZjguZW5jb2RlKGRlZmF1bHREYXJ0SW50ZXJuYWxTb3VyY2UpOwoKICAgICAgY2FzZSAiZGFydDp0eXBlZF9kYXRhIjoKICAgICAgICByZXR1cm4gdXRmOC5lbmNvZGUoZGVmYXVsdERhcnRUeXBlZERhdGFTb3VyY2UpOwoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gdXRmOC5lbmNvZGUobWVzc2FnZSA9PSBudWxsID8gIiIgOiAiLyogJHttZXNzYWdlLm1lc3NhZ2V9ICovIik7CiAgICB9CiAgfQoKICBMaXN0PGludD4gZ2V0U291cmNlKExpc3Q8aW50PiBieXRlcykgewogICAgLy8gYnl0ZXMgaXMgMC10ZXJtaW5hdGVkLiBXZSBkb24ndCB3YW50IHRoYXQgaW5jbHVkZWQuCiAgICBpZiAoYnl0ZXMgaXMgVWludDhMaXN0KSB7CiAgICAgIHJldHVybiBuZXcgVWludDhMaXN0LnZpZXcoCiAgICAgICAgICBieXRlcy5idWZmZXIsIGJ5dGVzLm9mZnNldEluQnl0ZXMsIGJ5dGVzLmxlbmd0aCAtIDEpOwogICAgfQogICAgcmV0dXJuIGJ5dGVzLnN1Ymxpc3QoMCwgYnl0ZXMubGVuZ3RoIC0gMSk7CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRPdXRsaW5lKFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIGFzeW5jIHsKICAgIFRva2VuIHRva2VucyA9IGF3YWl0IHRva2VuaXplKGxpYnJhcnkpOwogICAgaWYgKHRva2VucyA9PSBudWxsKSByZXR1cm47CiAgICBPdXRsaW5lQnVpbGRlciBsaXN0ZW5lciA9IG5ldyBPdXRsaW5lQnVpbGRlcihsaWJyYXJ5KTsKICAgIG5ldyBDbGFzc01lbWJlclBhcnNlcihsaXN0ZW5lcikucGFyc2VVbml0KHRva2Vucyk7CiAgfQoKICBGdXR1cmU8TnVsbD4gYnVpbGRCb2R5KExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIGFzeW5jIHsKICAgIGlmIChsaWJyYXJ5IGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyKSB7CiAgICAgIC8vIFdlIHRva2VuaXplIHNvdXJjZSBmaWxlcyB0d2ljZSB0byBrZWVwIG1lbW9yeSB1c2FnZSBsb3cuIFRoaXMgaXMgdGhlCiAgICAgIC8vIHNlY29uZCB0aW1lLCBhbmQgdGhlIGZpcnN0IHRpbWUgd2FzIGluIFtidWlsZE91dGxpbmVdIGFib3ZlLiBTbyB0aGlzCiAgICAgIC8vIHRpbWUgd2Ugc3VwcHJlc3MgbGV4aWNhbCBlcnJvcnMuCiAgICAgIFRva2VuIHRva2VucyA9IGF3YWl0IHRva2VuaXplKGxpYnJhcnksIHN1cHByZXNzTGV4aWNhbEVycm9yczogdHJ1ZSk7CiAgICAgIGlmICh0b2tlbnMgPT0gbnVsbCkgcmV0dXJuOwogICAgICBEaWV0TGlzdGVuZXIgbGlzdGVuZXIgPSBjcmVhdGVEaWV0TGlzdGVuZXIobGlicmFyeSk7CiAgICAgIERpZXRQYXJzZXIgcGFyc2VyID0gbmV3IERpZXRQYXJzZXIobGlzdGVuZXIpOwogICAgICBwYXJzZXIucGFyc2VVbml0KHRva2Vucyk7CiAgICAgIGZvciAoU291cmNlTGlicmFyeUJ1aWxkZXIgcGFydCBpbiBsaWJyYXJ5LnBhcnRzKSB7CiAgICAgICAgaWYgKHBhcnQucGFydE9mTGlicmFyeSAhPSBsaWJyYXJ5KSB7CiAgICAgICAgICAvLyBQYXJ0IHdhcyBpbmNsdWRlZCBpbiBtdWx0aXBsZSBsaWJyYXJpZXMuIFNraXAgaXQgaGVyZS4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBUb2tlbiB0b2tlbnMgPSBhd2FpdCB0b2tlbml6ZShwYXJ0KTsKICAgICAgICBpZiAodG9rZW5zICE9IG51bGwpIHsKICAgICAgICAgIGxpc3RlbmVyLnVyaSA9IHBhcnQuZmlsZVVyaTsKICAgICAgICAgIHBhcnNlci5wYXJzZVVuaXQodG9rZW5zKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRPRE8oam9obm5pd2ludGhlcixqZW5zaik6IEhhbmRsZSBleHByZXNzaW9uIGluIGV4dGVuc2lvbnM/CiAgRnV0dXJlPEV4cHJlc3Npb24+IGJ1aWxkRXhwcmVzc2lvbigKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgU3RyaW5nIGVuY2xvc2luZ0NsYXNzLAogICAgICBib29sIGlzQ2xhc3NJbnN0YW5jZU1lbWJlciwKICAgICAgRnVuY3Rpb25Ob2RlIHBhcmFtZXRlcnMpIGFzeW5jIHsKICAgIFRva2VuIHRva2VuID0gYXdhaXQgdG9rZW5pemUobGlicmFyeSwgc3VwcHJlc3NMZXhpY2FsRXJyb3JzOiBmYWxzZSk7CiAgICBpZiAodG9rZW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBEaWV0TGlzdGVuZXIgZGlldExpc3RlbmVyID0gY3JlYXRlRGlldExpc3RlbmVyKGxpYnJhcnkpOwoKICAgIEJ1aWxkZXIgcGFyZW50ID0gbGlicmFyeTsKICAgIGlmIChlbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICAgIEJ1aWxkZXIgY2xzID0gZGlldExpc3RlbmVyLm1lbWJlclNjb3BlLmxvb2t1cChlbmNsb3NpbmdDbGFzcywgLTEsIG51bGwpOwogICAgICBpZiAoY2xzIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgIHBhcmVudCA9IGNsczsKICAgICAgICBkaWV0TGlzdGVuZXIKICAgICAgICAgIC4uY3VycmVudERlY2xhcmF0aW9uID0gY2xzCiAgICAgICAgICAuLm1lbWJlclNjb3BlID0gY2xzLnNjb3BlLmNvcHlXaXRoUGFyZW50KAogICAgICAgICAgICAgIGRpZXRMaXN0ZW5lci5tZW1iZXJTY29wZS53aXRoVHlwZVZhcmlhYmxlcyhjbHMudHlwZVZhcmlhYmxlcyksCiAgICAgICAgICAgICAgImRlYnVnRXhwcmVzc2lvbiBpbiAkZW5jbG9zaW5nQ2xhc3MiKTsKICAgICAgfQogICAgfQogICAgUHJvY2VkdXJlQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2NlZHVyZUJ1aWxkZXJJbXBsKAogICAgICAgIG51bGwsCiAgICAgICAgMCwKICAgICAgICBudWxsLAogICAgICAgICJkZWJ1Z0V4cHIiLAogICAgICAgIG51bGwsCiAgICAgICAgbnVsbCwKICAgICAgICBQcm9jZWR1cmVLaW5kLk1ldGhvZCwKICAgICAgICBsaWJyYXJ5LAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICBudWxsLAogICAgICAgIG51bGwpCiAgICAgIC4ucGFyZW50ID0gcGFyZW50OwogICAgQm9keUJ1aWxkZXIgbGlzdGVuZXIgPSBkaWV0TGlzdGVuZXIuY3JlYXRlTGlzdGVuZXIoCiAgICAgICAgYnVpbGRlciwgZGlldExpc3RlbmVyLm1lbWJlclNjb3BlLAogICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcjogaXNDbGFzc0luc3RhbmNlTWVtYmVyKTsKCiAgICByZXR1cm4gbGlzdGVuZXIucGFyc2VTaW5nbGVFeHByZXNzaW9uKAogICAgICAgIG5ldyBQYXJzZXIobGlzdGVuZXIpLCB0b2tlbiwgcGFyYW1ldGVycyk7CiAgfQoKICBLZXJuZWxUYXJnZXQgZ2V0IHRhcmdldCA9PiBzdXBlci50YXJnZXQ7CgogIERpZXRMaXN0ZW5lciBjcmVhdGVEaWV0TGlzdGVuZXIoU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgcmV0dXJuIG5ldyBEaWV0TGlzdGVuZXIobGlicmFyeSwgaGllcmFyY2h5LCBjb3JlVHlwZXMsIHR5cGVJbmZlcmVuY2VFbmdpbmUpOwogIH0KCiAgdm9pZCByZXNvbHZlUGFydHMoKSB7CiAgICBMaXN0PFVyaT4gcGFydHMgPSA8VXJpPltdOwogICAgTGlzdDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj4gbGlicmFyaWVzID0gPFNvdXJjZUxpYnJhcnlCdWlsZGVyPltdOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGlmIChsaWJyYXJ5LmlzUGFydCkgewogICAgICAgICAgcGFydHMuYWRkKHVyaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxpYnJhcmllcy5hZGQobGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIFNldDxVcmk+IHVzZWRQYXJ0cyA9IG5ldyBTZXQ8VXJpPigpOwogICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5IGluIGxpYnJhcmllcykgewogICAgICBsaWJyYXJ5LmluY2x1ZGVQYXJ0cyh1c2VkUGFydHMpOwogICAgfQogICAgZm9yIChVcmkgdXJpIGluIHBhcnRzKSB7CiAgICAgIGlmICh1c2VkUGFydHMuY29udGFpbnModXJpKSkgewogICAgICAgIGJ1aWxkZXJzLnJlbW92ZSh1cmkpOwogICAgICB9IGVsc2UgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHBhcnQgPSBidWlsZGVyc1t1cmldOwogICAgICAgIHBhcnQuYWRkUHJvYmxlbShtZXNzYWdlUGFydE9ycGhhbiwgMCwgMSwgcGFydC5maWxlVXJpKTsKICAgICAgICBwYXJ0LnZhbGlkYXRlUGFydChudWxsLCBudWxsKTsKICAgICAgfQogICAgfQogICAgdGlja2VyLmxvZ01zKCJSZXNvbHZlZCBwYXJ0cyIpOwoKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBsaWJyYXJ5LmFwcGx5UGF0Y2hlcygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiQXBwbGllZCBwYXRjaGVzIik7CiAgfQoKICB2b2lkIGNvbXB1dGVMaWJyYXJ5U2NvcGVzKCkgewogICAgU2V0PExpYnJhcnlCdWlsZGVyPiBleHBvcnRlcnMgPSBuZXcgU2V0PExpYnJhcnlCdWlsZGVyPigpOwogICAgU2V0PExpYnJhcnlCdWlsZGVyPiBleHBvcnRlZXMgPSBuZXcgU2V0PExpYnJhcnlCdWlsZGVyPigpOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHNvdXJjZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgIHNvdXJjZUxpYnJhcnkuYnVpbGRJbml0aWFsU2NvcGVzKCk7CiAgICAgIH0KICAgICAgaWYgKGxpYnJhcnkuZXhwb3J0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgICBleHBvcnRlZXMuYWRkKGxpYnJhcnkpOwogICAgICAgIGZvciAoRXhwb3J0IGV4cG9ydGVyIGluIGxpYnJhcnkuZXhwb3J0ZXJzKSB7CiAgICAgICAgICBleHBvcnRlcnMuYWRkKGV4cG9ydGVyLmV4cG9ydGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgU2V0PFNvdXJjZUxpYnJhcnlCdWlsZGVyPiBib3RoID0gbmV3IFNldDxTb3VyY2VMaWJyYXJ5QnVpbGRlcj4oKTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZWQgaW4gZXhwb3J0ZWVzKSB7CiAgICAgIGlmIChleHBvcnRlcnMuY29udGFpbnMoZXhwb3J0ZWQpKSB7CiAgICAgICAgYm90aC5hZGQoZXhwb3J0ZWQpOwogICAgICB9CiAgICAgIGZvciAoRXhwb3J0IGV4cG9ydCBpbiBleHBvcnRlZC5leHBvcnRlcnMpIHsKICAgICAgICBleHBvcnRlZC5leHBvcnRTY29wZS5mb3JFYWNoKGV4cG9ydC5hZGRUb0V4cG9ydFNjb3BlKTsKICAgICAgfQogICAgfQogICAgYm9vbCB3YXNDaGFuZ2VkID0gZmFsc2U7CiAgICBkbyB7CiAgICAgIHdhc0NoYW5nZWQgPSBmYWxzZTsKICAgICAgZm9yIChTb3VyY2VMaWJyYXJ5QnVpbGRlciBleHBvcnRlZCBpbiBib3RoKSB7CiAgICAgICAgZm9yIChFeHBvcnQgZXhwb3J0IGluIGV4cG9ydGVkLmV4cG9ydGVycykgewogICAgICAgICAgZXhwb3J0ZWQuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgICAgICAgIGlmIChleHBvcnQuYWRkVG9FeHBvcnRTY29wZShuYW1lLCBtZW1iZXIpKSB7CiAgICAgICAgICAgICAgd2FzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSB3aGlsZSAod2FzQ2hhbmdlZCk7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgc291cmNlTGlicmFyeSA9IGxpYnJhcnk7CiAgICAgICAgc291cmNlTGlicmFyeS5hZGRJbXBvcnRzVG9TY29wZSgpOwogICAgICB9CiAgICB9KTsKICAgIGZvciAoTGlicmFyeUJ1aWxkZXIgZXhwb3J0ZWUgaW4gZXhwb3J0ZWVzKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogQ2hhbmdlIGhvdyB3ZSB0cmFjayBleHBvcnRlcnMuIEN1cnJlbnRseSwgd2hlbiBhIGxpYnJhcnkKICAgICAgLy8gKGV4cG9ydGVyKSBleHBvcnRzIGFub3RoZXIgbGlicmFyeSAoZXhwb3J0ZWUpIHdlIGFkZCBhIHJlZmVyZW5jZSB0bwogICAgICAvLyBleHBvcnRlciB0byBleHBvcnRlZS4gVGhpcyBjcmVhdGVzIGEgcmVmZXJlbmNlIGluIHRoZSB3cm9uZyBkaXJlY3Rpb24KICAgICAgLy8gYW5kIGNhbiBsZWFkIHRvIG1lbW9yeSBsZWFrcy4KICAgICAgZXhwb3J0ZWUuZXhwb3J0ZXJzLmNsZWFyKCk7CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIGxpYnJhcnkgc2NvcGVzIik7CiAgICAvLyBkZWJ1Z1ByaW50RXhwb3J0cygpOwogIH0KCiAgdm9pZCBkZWJ1Z1ByaW50RXhwb3J0cygpIHsKICAgIC8vIFRPRE8oc2lnbXVuZCk6IHNob3VsZCBiZSBgY292YXJpYW50IFNvdXJjZUxpYnJhcnlCdWlsZGVyYC4KICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIGR5bmFtaWMgbCkgewogICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5ID0gbDsKICAgICAgU2V0PEJ1aWxkZXI+IG1lbWJlcnMgPSBuZXcgU2V0PEJ1aWxkZXI+KCk7CiAgICAgIEl0ZXJhdG9yPEJ1aWxkZXI+IGl0ZXJhdG9yID0gbGlicmFyeS5pdGVyYXRvcjsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBtZW1iZXJzLmFkZChpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfQogICAgICBMaXN0PFN0cmluZz4gZXhwb3J0cyA9IDxTdHJpbmc+W107CiAgICAgIGxpYnJhcnkuZXhwb3J0U2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgbWVtYmVyKSB7CiAgICAgICAgd2hpbGUgKG1lbWJlciAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoIW1lbWJlcnMuY29udGFpbnMobWVtYmVyKSkgewogICAgICAgICAgICBleHBvcnRzLmFkZChuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIG1lbWJlciA9IG1lbWJlci5uZXh0OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChleHBvcnRzLmlzTm90RW1wdHkpIHsKICAgICAgICBwcmludCgiJHVyaSBleHBvcnRzICRleHBvcnRzIik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCByZXNvbHZlVHlwZXMoKSB7CiAgICBpbnQgdHlwZUNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBzb3VyY2VMaWJyYXJ5ID0gbGlicmFyeTsKICAgICAgICB0eXBlQ291bnQgKz0gc291cmNlTGlicmFyeS5yZXNvbHZlVHlwZXMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIlJlc29sdmVkICR0eXBlQ291bnQgdHlwZXMiKTsKICB9CgogIHZvaWQgZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoRGVmZXJyZWRMb2FkVGVhcm9mZnMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkIGRlZmVycmVkIGxvYWQgdGVhcm9mZnMgJGNvdW50Iik7CiAgfQoKICB2b2lkIGZpbmlzaE5vU3VjaE1ldGhvZEZvcndhcmRlcnMoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoRm9yd2FyZGVycygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiRmluaXNoZWQgZm9yd2FyZGVycyBmb3IgJGNvdW50IHByb2NlZHVyZXMiKTsKICB9CgogIHZvaWQgcmVzb2x2ZUNvbnN0cnVjdG9ycygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5yZXNvbHZlQ29uc3RydWN0b3JzKG51bGwpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiUmVzb2x2ZWQgJGNvdW50IGNvbnN0cnVjdG9ycyIpOwogIH0KCiAgdm9pZCBmaW5pc2hUeXBlVmFyaWFibGVzKENsYXNzQnVpbGRlciBvYmplY3QsIFR5cGVCdWlsZGVyIGR5bmFtaWNUeXBlKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoVHlwZVZhcmlhYmxlcyhvYmplY3QsIGR5bmFtaWNUeXBlKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIlJlc29sdmVkICRjb3VudCB0eXBlLXZhcmlhYmxlIGJvdW5kcyIpOwogIH0KCiAgdm9pZCBjb21wdXRlVmFyaWFuY2VzKCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkpIHsKICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICBjb3VudCArPSBsaWJyYXJ5LmNvbXB1dGVWYXJpYW5jZXMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIHZhcmlhbmNlcyBvZiAkY291bnQgdHlwZSB2YXJpYWJsZXMiKTsKICB9CgogIHZvaWQgY29tcHV0ZURlZmF1bHRUeXBlcyhUeXBlQnVpbGRlciBkeW5hbWljVHlwZSwgVHlwZUJ1aWxkZXIgYm90dG9tVHlwZSwKICAgICAgQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9CiAgICAgICAgICAgIGxpYnJhcnkuY29tcHV0ZURlZmF1bHRUeXBlcyhkeW5hbWljVHlwZSwgYm90dG9tVHlwZSwgb2JqZWN0Q2xhc3MpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiQ29tcHV0ZWQgZGVmYXVsdCB0eXBlcyBmb3IgJGNvdW50IHR5cGUgdmFyaWFibGVzIik7CiAgfQoKICB2b2lkIGZpbmlzaE5hdGl2ZU1ldGhvZHMoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGNvdW50ICs9IGxpYnJhcnkuZmluaXNoTmF0aXZlTWV0aG9kcygpOwogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiRmluaXNoZWQgJGNvdW50IG5hdGl2ZSBtZXRob2RzIik7CiAgfQoKICB2b2lkIGZpbmlzaFBhdGNoTWV0aG9kcygpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgY291bnQgKz0gbGlicmFyeS5maW5pc2hQYXRjaE1ldGhvZHMoKTsKICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkZpbmlzaGVkICRjb3VudCBwYXRjaCBtZXRob2RzIik7CiAgfQoKICAvLy8gQ2hlY2sgdGhhdCBbb2JqZWN0Q2xhc3NdIGhhcyBubyBzdXBlcnR5cGVzLiBSZWNvdmVyIGJ5IHJlbW92aW5nIGFueQogIC8vLyBmb3VuZC4KICB2b2lkIGNoZWNrT2JqZWN0Q2xhc3NIaWVyYXJjaHkoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBpZiAob2JqZWN0Q2xhc3MgaXMgU291cmNlQ2xhc3NCdWlsZGVyICYmCiAgICAgICAgb2JqZWN0Q2xhc3MubGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICBpZiAob2JqZWN0Q2xhc3Muc3VwZXJ0eXBlICE9IG51bGwpIHsKICAgICAgICBvYmplY3RDbGFzcy5zdXBlcnR5cGUgPSBudWxsOwogICAgICAgIG9iamVjdENsYXNzLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VPYmplY3RFeHRlbmRzLCBvYmplY3RDbGFzcy5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdENsYXNzLmludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICAgIG9iamVjdENsYXNzLmFkZFByb2JsZW0oCiAgICAgICAgICAgIG1lc3NhZ2VPYmplY3RJbXBsZW1lbnRzLCBvYmplY3RDbGFzcy5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgb2JqZWN0Q2xhc3MuaW50ZXJmYWNlcyA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdENsYXNzLm1peGVkSW5UeXBlICE9IG51bGwpIHsKICAgICAgICBvYmplY3RDbGFzcy5hZGRQcm9ibGVtKAogICAgICAgICAgICBtZXNzYWdlT2JqZWN0TWl4ZXNJbiwgb2JqZWN0Q2xhc3MuY2hhck9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgIG9iamVjdENsYXNzLm1peGVkSW5UeXBlID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KCiAgLy8vIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjbGFzcyBidWlsZGVycyBkZWNsYXJlZCBpbiB0aGlzIGxvYWRlci4gIEFzIHRoZQogIC8vLyBjbGFzc2VzIGFyZSBzb3J0ZWQsIGFueSBjeWNsZXMgaW4gdGhlIGhpZXJhcmNoeSBhcmUgcmVwb3J0ZWQgYXMKICAvLy8gZXJyb3JzLiBSZWNvdmVyIGJ5IGJyZWFraW5nIHRoZSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVzdCBvZiB0aGUKICAvLy8gcGlwZWxpbmUgKGluY2x1ZGluZyBiYWNrZW5kcykgY2FuIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBoaWVyYXJjaHkKICAvLy8gY3ljbGVzLgogIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBoYW5kbGVIaWVyYXJjaHlDeWNsZXMoQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICAvLyBDb21wdXRlIHRoZSBpbml0aWFsIHdvcmsgbGlzdCBvZiBhbGwgY2xhc3NlcyBkZWNsYXJlZCBpbiB0aGlzIGxvYWRlci4KICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiB3b3JrTGlzdCA9IDxTb3VyY2VDbGFzc0J1aWxkZXI+W107CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgSXRlcmF0b3I8QnVpbGRlcj4gbWVtYmVycyA9IGxpYnJhcnkuaXRlcmF0b3I7CiAgICAgICAgd2hpbGUgKG1lbWJlcnMubW92ZU5leHQoKSkgewogICAgICAgICAgQnVpbGRlciBtZW1iZXIgPSBtZW1iZXJzLmN1cnJlbnQ7CiAgICAgICAgICBpZiAobWVtYmVyIGlzIFNvdXJjZUNsYXNzQnVpbGRlcikgewogICAgICAgICAgICB3b3JrTGlzdC5hZGQobWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBTZXQ8Q2xhc3NCdWlsZGVyPiBibGFja0xpc3RlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzQnVpbGRlcj4oKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxhY2tsaXN0ZWRDb3JlQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICBibGFja0xpc3RlZENsYXNzZXMuYWRkKGNvcmVMaWJyYXJ5CiAgICAgICAgICAubG9va3VwTG9jYWxNZW1iZXIoYmxhY2tsaXN0ZWRDb3JlQ2xhc3Nlc1tpXSwgcmVxdWlyZWQ6IHRydWUpKTsKICAgIH0KCiAgICAvLyBTb3J0IHRoZSBjbGFzc2VzIHRvcG9sb2dpY2FsbHkuCiAgICBTZXQ8U291cmNlQ2xhc3NCdWlsZGVyPiB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3NlcyA9CiAgICAgICAgbmV3IFNldDxTb3VyY2VDbGFzc0J1aWxkZXI+KCk7CiAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gcHJldmlvdXNXb3JrTGlzdDsKICAgIGRvIHsKICAgICAgcHJldmlvdXNXb3JrTGlzdCA9IHdvcmtMaXN0OwogICAgICB3b3JrTGlzdCA9IDxTb3VyY2VDbGFzc0J1aWxkZXI+W107CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJldmlvdXNXb3JrTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBjbHMgPSBwcmV2aW91c1dvcmtMaXN0W2ldOwogICAgICAgIExpc3Q8QnVpbGRlcj4gZGlyZWN0U3VwZXJ0eXBlcyA9CiAgICAgICAgICAgIGNscy5jb21wdXRlRGlyZWN0U3VwZXJ0eXBlcyhvYmplY3RDbGFzcyk7CiAgICAgICAgYm9vbCBhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdFN1cGVydHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIEJ1aWxkZXIgc3VwZXJ0eXBlID0gZGlyZWN0U3VwZXJ0eXBlc1tpXTsKICAgICAgICAgIGlmIChzdXBlcnR5cGUgaXMgU291cmNlQ2xhc3NCdWlsZGVyICYmCiAgICAgICAgICAgICAgc3VwZXJ0eXBlLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYKICAgICAgICAgICAgICAhdG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMuY29udGFpbnMoc3VwZXJ0eXBlKSkgewogICAgICAgICAgICBhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYWxsU3VwZXJ0eXBlc1Byb2Nlc3NlZCAmJiBjbHMuaXNQYXRjaCkgewogICAgICAgICAgYWxsU3VwZXJ0eXBlc1Byb2Nlc3NlZCA9CiAgICAgICAgICAgICAgdG9wb2xvZ2ljYWxseVNvcnRlZENsYXNzZXMuY29udGFpbnMoY2xzLm9yaWdpbik7CiAgICAgICAgfQogICAgICAgIGlmIChhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkKSB7CiAgICAgICAgICB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgICAgIGNoZWNrQ2xhc3NTdXBlcnR5cGVzKGNscywgZGlyZWN0U3VwZXJ0eXBlcywgYmxhY2tMaXN0ZWRDbGFzc2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd29ya0xpc3QuYWRkKGNscyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IHdoaWxlIChwcmV2aW91c1dvcmtMaXN0Lmxlbmd0aCAhPSB3b3JrTGlzdC5sZW5ndGgpOwogICAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGNsYXNzZXMgPSB0b3BvbG9naWNhbGx5U29ydGVkQ2xhc3Nlcy50b0xpc3QoKTsKICAgIExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBjbGFzc2VzV2l0aEN5Y2xlcyA9IHByZXZpb3VzV29ya0xpc3Q7CgogICAgLy8gT25jZSB0aGUgd29yayBsaXN0IGRvZXNuJ3QgY2hhbmdlIGluIHNpemUsIGl0J3MgZWl0aGVyIGVtcHR5LCBvcgogICAgLy8gY29udGFpbnMgYWxsIGNsYXNzZXMgd2l0aCBjeWNsZXMuCgogICAgLy8gU29ydCB0aGUgY2xhc3NlcyB0byBlbnN1cmUgY29uc2lzdGVudCBvdXRwdXQuCiAgICBjbGFzc2VzV2l0aEN5Y2xlcy5zb3J0KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXNXaXRoQ3ljbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFNvdXJjZUNsYXNzQnVpbGRlciBjbHMgPSBjbGFzc2VzV2l0aEN5Y2xlc1tpXTsKICAgICAgdGFyZ2V0LmJyZWFrQ3ljbGUoY2xzKTsKICAgICAgY2xhc3Nlcy5hZGQoY2xzKTsKICAgICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5LndpdGhBcmd1bWVudHMoY2xzLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgIGNscy5jaGFyT2Zmc2V0LAogICAgICAgICAgbm9MZW5ndGgpOwogICAgfQoKICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBjbGFzcyBoaWVyYXJjaHkiKTsKICAgIHJldHVybiBjbGFzc2VzOwogIH0KCiAgdm9pZCBfY2hlY2tDb25zdHJ1Y3RvcnNGb3JNaXhpbigKICAgICAgU291cmNlQ2xhc3NCdWlsZGVyIGNscywgQ2xhc3NCdWlsZGVyIGJ1aWxkZXIpIHsKICAgIGZvciAoQnVpbGRlciBjb25zdHJ1Y3RvciBpbiBidWlsZGVyLmNvbnN0cnVjdG9ycy5sb2NhbC52YWx1ZXMpIHsKICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IgJiYgIWNvbnN0cnVjdG9yLmlzU3ludGhldGljKSB7CiAgICAgICAgY2xzLmFkZFByb2JsZW0oCiAgICAgICAgICAgIHRlbXBsYXRlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGJ1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICBjbHMuY2hhck9mZnNldCwKICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2UKICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoYnVpbGRlci5mdWxsTmFtZUZvckVycm9ycykKICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmZpbGVVcmksIGNvbnN0cnVjdG9yLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKQogICAgICAgICAgICBdKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjaGVja0NsYXNzU3VwZXJ0eXBlcyhTb3VyY2VDbGFzc0J1aWxkZXIgY2xzLAogICAgICBMaXN0PEJ1aWxkZXI+IGRpcmVjdFN1cGVydHlwZXMsIFNldDxDbGFzc0J1aWxkZXI+IGJsYWNrTGlzdGVkQ2xhc3NlcykgewogICAgLy8gQ2hlY2sgdGhhdCB0aGUgZGlyZWN0IHN1cGVydHlwZXMgYXJlbid0IGJsYWNrLWxpc3RlZCBvciBlbnVtcy4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0U3VwZXJ0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICBCdWlsZGVyIHN1cGVydHlwZSA9IGRpcmVjdFN1cGVydHlwZXNbaV07CiAgICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICAgIFR5cGVBbGlhc0J1aWxkZXIgYWxpYXNCdWlsZGVyID0gc3VwZXJ0eXBlOwogICAgICAgIHN1cGVydHlwZSA9IGFsaWFzQnVpbGRlci51bmFsaWFzRGVjbGFyYXRpb247CiAgICAgIH0KICAgICAgaWYgKHN1cGVydHlwZSBpcyBFbnVtQnVpbGRlcikgewogICAgICAgIGNscy5hZGRQcm9ibGVtKHRlbXBsYXRlRXh0ZW5kaW5nRW51bS53aXRoQXJndW1lbnRzKHN1cGVydHlwZS5uYW1lKSwKICAgICAgICAgICAgY2xzLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmICghY2xzLmxpYnJhcnkubWF5SW1wbGVtZW50UmVzdHJpY3RlZFR5cGVzICYmCiAgICAgICAgICBibGFja0xpc3RlZENsYXNzZXMuY29udGFpbnMoc3VwZXJ0eXBlKSkgewogICAgICAgIGNscy5hZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUV4dGVuZGluZ1Jlc3RyaWN0ZWQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHN1cGVydHlwZS5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgIGNscy5jaGFyT2Zmc2V0LAogICAgICAgICAgICBub0xlbmd0aCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDaGVjayB0aGF0IHRoZSBtaXhlZC1pbiB0eXBlIGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4uCiAgICBmaW5hbCBUeXBlQnVpbGRlciBtaXhlZEluVHlwZSA9IGNscy5taXhlZEluVHlwZTsKICAgIGlmIChtaXhlZEluVHlwZSAhPSBudWxsKSB7CiAgICAgIGJvb2wgaXNDbGFzc0J1aWxkZXIgPSBmYWxzZTsKICAgICAgaWYgKG1peGVkSW5UeXBlIGlzIE5hbWVkVHlwZUJ1aWxkZXIpIHsKICAgICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBtaXhlZEluVHlwZS5kZWNsYXJhdGlvbjsKICAgICAgICBpZiAoYnVpbGRlciBpcyBUeXBlQWxpYXNCdWlsZGVyKSB7CiAgICAgICAgICBUeXBlQWxpYXNCdWlsZGVyIGFsaWFzQnVpbGRlciA9IGJ1aWxkZXI7CiAgICAgICAgICBidWlsZGVyID0gYWxpYXNCdWlsZGVyLnVuYWxpYXNEZWNsYXJhdGlvbjsKICAgICAgICB9CiAgICAgICAgaWYgKGJ1aWxkZXIgaXMgQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgICBpc0NsYXNzQnVpbGRlciA9IHRydWU7CiAgICAgICAgICBfY2hlY2tDb25zdHJ1Y3RvcnNGb3JNaXhpbihjbHMsIGJ1aWxkZXIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWlzQ2xhc3NCdWlsZGVyKSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBFaXRoZXIgd2UgbmVlZCB0byBjaGVjayB0aGlzIGZvciBzdXBlcmNsYXNzIGFuZAogICAgICAgIC8vIGludGVyZmFjZXMsIG9yIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSAob3IgaGFuZGxlZCBlbHNld2hlcmUpLgogICAgICAgIGNscy5hZGRQcm9ibGVtKAogICAgICAgICAgICB0ZW1wbGF0ZUlsbGVnYWxNaXhpbi53aXRoQXJndW1lbnRzKG1peGVkSW5UeXBlLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgY2xzLmNoYXJPZmZzZXQsCiAgICAgICAgICAgIG5vTGVuZ3RoKTsKICAgICAgfQogICAgfQogIH0KCiAgTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IGNoZWNrU2VtYW50aWNzKENsYXNzQnVpbGRlciBvYmplY3RDbGFzcykgewogICAgY2hlY2tPYmplY3RDbGFzc0hpZXJhcmNoeShvYmplY3RDbGFzcyk7CiAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gY2xhc3NlcyA9IGhhbmRsZUhpZXJhcmNoeUN5Y2xlcyhvYmplY3RDbGFzcyk7CgogICAgLy8gQ2hlY2sgaW1wb3J0cyBhbmQgZXhwb3J0cyBmb3IgZHVwbGljYXRlIG5hbWVzLgogICAgLy8gVGhpcyBpcyByYXRoZXIgc2lsbHksIGUuZy4gaXQgbWFrZXMgaW1wb3J0aW5nICdmb28nIGFuZCBleHBvcnRpbmcgYW5vdGhlcgogICAgLy8gJ2Zvbycgb2suCiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5IGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyICYmIGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICAvLyBDaGVjayBleHBvcnRzLgogICAgICAgIGlmIChsaWJyYXJ5LmV4cG9ydHMuaXNOb3RFbXB0eSkgewogICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxFeHBvcnQ+PiBuYW1lVG9FeHBvcnRzOwogICAgICAgICAgYm9vbCBlcnJvckV4cG9ydHMgPSBmYWxzZTsKICAgICAgICAgIGZvciAoRXhwb3J0IGV4cG9ydCBpbiBsaWJyYXJ5LmV4cG9ydHMpIHsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBleHBvcnQuZXhwb3J0ZWQ/Lm5hbWUgPz8gJyc7CiAgICAgICAgICAgIGlmIChuYW1lICE9ICcnKSB7CiAgICAgICAgICAgICAgbmFtZVRvRXhwb3J0cyA/Pz0gbmV3IE1hcDxTdHJpbmcsIExpc3Q8RXhwb3J0Pj4oKTsKICAgICAgICAgICAgICBMaXN0PEV4cG9ydD4gZXhwb3J0cyA9IG5hbWVUb0V4cG9ydHNbbmFtZV0gPz89IDxFeHBvcnQ+W107CiAgICAgICAgICAgICAgZXhwb3J0cy5hZGQoZXhwb3J0KTsKICAgICAgICAgICAgICBpZiAoZXhwb3J0c1swXS5leHBvcnRlZCAhPSBleHBvcnQuZXhwb3J0ZWQpIGVycm9yRXhwb3J0cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChlcnJvckV4cG9ydHMpIHsKICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSBpbiBuYW1lVG9FeHBvcnRzLmtleXMpIHsKICAgICAgICAgICAgICBMaXN0PEV4cG9ydD4gZXhwb3J0cyA9IG5hbWVUb0V4cG9ydHNbbmFtZV07CiAgICAgICAgICAgICAgaWYgKGV4cG9ydHMubGVuZ3RoIDwgMikgY29udGludWU7CiAgICAgICAgICAgICAgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCA9IDxMb2NhdGVkTWVzc2FnZT5bXTsKICAgICAgICAgICAgICBmb3IgKEV4cG9ydCBleHBvcnQgaW4gZXhwb3J0cy5za2lwKDEpKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmFkZCh0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dAogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NhdGlvbih1cmksIGV4cG9ydC5jaGFyT2Zmc2V0LCBub0xlbmd0aCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsaWJyYXJ5LmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlFeHBvcnQud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgICAgICAgZXhwb3J0c1swXS5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBub0xlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpLAogICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaW1wb3J0cy4KICAgICAgICBpZiAobGlicmFyeS5pbXBvcnRzLmlzTm90RW1wdHkpIHsKICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8SW1wb3J0Pj4gbmFtZVRvSW1wb3J0czsKICAgICAgICAgIGJvb2wgZXJyb3JJbXBvcnRzOwogICAgICAgICAgZm9yIChJbXBvcnQgaW1wb3J0IGluIGxpYnJhcnkuaW1wb3J0cykgewogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGltcG9ydC5pbXBvcnRlZD8ubmFtZSA/PyAnJzsKICAgICAgICAgICAgaWYgKG5hbWUgIT0gJycpIHsKICAgICAgICAgICAgICBuYW1lVG9JbXBvcnRzID8/PSBuZXcgTWFwPFN0cmluZywgTGlzdDxJbXBvcnQ+PigpOwogICAgICAgICAgICAgIExpc3Q8SW1wb3J0PiBpbXBvcnRzID0gbmFtZVRvSW1wb3J0c1tuYW1lXSA/Pz0gPEltcG9ydD5bXTsKICAgICAgICAgICAgICBpbXBvcnRzLmFkZChpbXBvcnQpOwogICAgICAgICAgICAgIGlmIChpbXBvcnRzWzBdLmltcG9ydGVkICE9IGltcG9ydC5pbXBvcnRlZCkgZXJyb3JJbXBvcnRzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVycm9ySW1wb3J0cyAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgaW4gbmFtZVRvSW1wb3J0cy5rZXlzKSB7CiAgICAgICAgICAgICAgTGlzdDxJbXBvcnQ+IGltcG9ydHMgPSBuYW1lVG9JbXBvcnRzW25hbWVdOwogICAgICAgICAgICAgIGlmIChpbXBvcnRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlOwogICAgICAgICAgICAgIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQgPSA8TG9jYXRlZE1lc3NhZ2U+W107CiAgICAgICAgICAgICAgZm9yIChJbXBvcnQgaW1wb3J0IGluIGltcG9ydHMuc2tpcCgxKSkgewogICAgICAgICAgICAgICAgY29udGV4dC5hZGQodGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydENvbnRleHQKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhuYW1lKQogICAgICAgICAgICAgICAgICAgIC53aXRoTG9jYXRpb24odXJpLCBpbXBvcnQuY2hhck9mZnNldCwgbm9MZW5ndGgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0LndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgICAgICAgIGltcG9ydHNbMF0uY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgICAgICAgICAgIHVyaSwKICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgdGlja2VyLmxvZ01zKCJDaGVja2VkIGltcG9ydHMgYW5kIGV4cG9ydHMgZm9yIGR1cGxpY2F0ZSBuYW1lcyIpOwogICAgcmV0dXJuIGNsYXNzZXM7CiAgfQoKICB2b2lkIGJ1aWxkQ29tcG9uZW50KCkgewogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIHNvdXJjZUxpYnJhcnkgPSBsaWJyYXJ5OwogICAgICAgIExpYnJhcnkgdGFyZ2V0ID0gc291cmNlTGlicmFyeS5idWlsZChjb3JlTGlicmFyeSk7CiAgICAgICAgaWYgKCFsaWJyYXJ5LmlzUGF0Y2gpIHsKICAgICAgICAgIGlmIChzb3VyY2VMaWJyYXJ5LnJlZmVyZW5jZXNGcm9tICE9IG51bGwpIHsKICAgICAgICAgICAgcmVmZXJlbmNlRnJvbUluZGV4ID8/PSBuZXcgUmVmZXJlbmNlRnJvbUluZGV4KCk7CiAgICAgICAgICAgIHJlZmVyZW5jZUZyb21JbmRleC5hZGRJbmRleGVkTGlicmFyeSgKICAgICAgICAgICAgICAgIHRhcmdldCwgc291cmNlTGlicmFyeS5yZWZlcmVuY2VzRnJvbUluZGV4ZWQpOwogICAgICAgICAgfQogICAgICAgICAgbGlicmFyaWVzLmFkZCh0YXJnZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB0aWNrZXIubG9nTXMoIkJ1aWx0IGNvbXBvbmVudCIpOwogIH0KCiAgQ29tcG9uZW50IGNvbXB1dGVGdWxsQ29tcG9uZW50KCkgewogICAgU2V0PExpYnJhcnk+IGxpYnJhcmllcyA9IG5ldyBTZXQ8TGlicmFyeT4oKTsKICAgIExpc3Q8TGlicmFyeT4gd29ya0xpc3QgPSA8TGlicmFyeT5bXTsKICAgIGJ1aWxkZXJzLmZvckVhY2goKFVyaSB1cmksIExpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyKSB7CiAgICAgIGlmICghbGlicmFyeUJ1aWxkZXIuaXNQYXRjaCAmJgogICAgICAgICAgKGxpYnJhcnlCdWlsZGVyLmxvYWRlciA9PSB0aGlzIHx8CiAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuaW1wb3J0VXJpLnNjaGVtZSA9PSAiZGFydCIgfHwKICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlciA9PSB0aGlzLmZpcnN0KSkgewogICAgICAgIGlmIChsaWJyYXJpZXMuYWRkKGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpKSB7CiAgICAgICAgICB3b3JrTGlzdC5hZGQobGlicmFyeUJ1aWxkZXIubGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHdoaWxlICh3b3JrTGlzdC5pc05vdEVtcHR5KSB7CiAgICAgIExpYnJhcnkgbGlicmFyeSA9IHdvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgZm9yIChMaWJyYXJ5RGVwZW5kZW5jeSBkZXBlbmRlbmN5IGluIGxpYnJhcnkuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgaWYgKGxpYnJhcmllcy5hZGQoZGVwZW5kZW5jeS50YXJnZXRMaWJyYXJ5KSkgewogICAgICAgICAgd29ya0xpc3QuYWRkKGRlcGVuZGVuY3kudGFyZ2V0TGlicmFyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IENvbXBvbmVudCgpLi5saWJyYXJpZXMuYWRkQWxsKGxpYnJhcmllcyk7CiAgfQoKICB2b2lkIGNvbXB1dGVIaWVyYXJjaHkoKSB7CiAgICBMaXN0PEFtYmlndW91c1R5cGVzUmVjb3JkPiBhbWJpZ3VvdXNUeXBlc1JlY29yZHMgPSBbXTsKICAgIEhhbmRsZUFtYmlndW91c1N1cGVydHlwZXMgb25BbWJpZ3VvdXNTdXBlcnR5cGVzID0KICAgICAgICAoQ2xhc3MgY2xzLCBTdXBlcnR5cGUgYSwgU3VwZXJ0eXBlIGIpIHsKICAgICAgaWYgKGFtYmlndW91c1R5cGVzUmVjb3JkcyAhPSBudWxsKSB7CiAgICAgICAgYW1iaWd1b3VzVHlwZXNSZWNvcmRzLmFkZChuZXcgQW1iaWd1b3VzVHlwZXNSZWNvcmQoY2xzLCBhLCBiKSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaGllcmFyY2h5ID09IG51bGwpIHsKICAgICAgaGllcmFyY2h5ID0gbmV3IENsYXNzSGllcmFyY2h5KGNvbXB1dGVGdWxsQ29tcG9uZW50KCksIGNvcmVUeXBlcywKICAgICAgICAgIG9uQW1iaWd1b3VzU3VwZXJ0eXBlczogb25BbWJpZ3VvdXNTdXBlcnR5cGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIGhpZXJhcmNoeS5vbkFtYmlndW91c1N1cGVydHlwZXMgPSBvbkFtYmlndW91c1N1cGVydHlwZXM7CiAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBjb21wdXRlRnVsbENvbXBvbmVudCgpOwogICAgICBoaWVyYXJjaHkuY29yZVR5cGVzID0gY29yZVR5cGVzOwogICAgICBoaWVyYXJjaHkuYXBwbHlUcmVlQ2hhbmdlcyhjb25zdCBbXSwgY29tcG9uZW50LmxpYnJhcmllcywKICAgICAgICAgIHJlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yOiBjb21wb25lbnQpOwogICAgfQogICAgZm9yIChBbWJpZ3VvdXNUeXBlc1JlY29yZCByZWNvcmQgaW4gYW1iaWd1b3VzVHlwZXNSZWNvcmRzKSB7CiAgICAgIGhhbmRsZUFtYmlndW91c1N1cGVydHlwZXMocmVjb3JkLmNscywgcmVjb3JkLmEsIHJlY29yZC5iKTsKICAgIH0KICAgIGFtYmlndW91c1R5cGVzUmVjb3JkcyA9IG51bGw7CiAgICB0aWNrZXIubG9nTXMoIkNvbXB1dGVkIGNsYXNzIGhpZXJhcmNoeSIpOwogIH0KCiAgdm9pZCBoYW5kbGVBbWJpZ3VvdXNTdXBlcnR5cGVzKENsYXNzIGNscywgU3VwZXJ0eXBlIGEsIFN1cGVydHlwZSBiKSB7CiAgICBhZGRQcm9ibGVtKAogICAgICAgIHRlbXBsYXRlQW1iaWd1b3VzU3VwZXJ0eXBlcy53aXRoQXJndW1lbnRzKGNscy5uYW1lLCBhLmFzSW50ZXJmYWNlVHlwZSwKICAgICAgICAgICAgYi5hc0ludGVyZmFjZVR5cGUsIGNscy5lbmNsb3NpbmdMaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpLAogICAgICAgIGNscy5maWxlT2Zmc2V0LAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIGNscy5maWxlVXJpKTsKICB9CgogIHZvaWQgaWdub3JlQW1iaWd1b3VzU3VwZXJ0eXBlcyhDbGFzcyBjbHMsIFN1cGVydHlwZSBhLCBTdXBlcnR5cGUgYikge30KCiAgdm9pZCBjb21wdXRlQ29yZVR5cGVzKENvbXBvbmVudCBjb21wb25lbnQpIHsKICAgIGFzc2VydChfY29yZVR5cGVzID09IG51bGwsICJDb3JlVHlwZXMgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZCIpOwogICAgX2NvcmVUeXBlcyA9IG5ldyBDb3JlVHlwZXMoY29tcG9uZW50KTsKCiAgICAvLyBUaGVzZSB0eXBlcyBhcmUgdXNlZCBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIGlzLXN1YnR5cGUtb2YgcmVsYXRpb24KICAgIC8vIHRvIGNoZWNrIGlmIHRoZSByZXR1cm4gdHlwZXMgb2YgZnVuY3Rpb25zIHdpdGggYXN5bmMsIHN5bmMqLCBhbmQgYXN5bmMqCiAgICAvLyBib2RpZXMgYXJlIGNvcnJlY3QuICBJdCdzIHZhbGlkIHRvIHVzZSB0aGUgbm9uLW51bGxhYmxlIHR5cGVzIG9uIHRoZQogICAgLy8gbGVmdC1oYW5kIHNpZGUgaW4gYm90aCBvcHQtaW4gYW5kIG9wdC1vdXQgY29kZS4KICAgIGZ1dHVyZU9mQm90dG9tID0gbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLmZ1dHVyZUNsYXNzLAogICAgICAgIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCA8RGFydFR5cGU+W2NvbnN0IEJvdHRvbVR5cGUoKV0pOwogICAgaXRlcmFibGVPZkJvdHRvbSA9IG5ldyBJbnRlcmZhY2VUeXBlKGNvcmVUeXBlcy5pdGVyYWJsZUNsYXNzLAogICAgICAgIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLCA8RGFydFR5cGU+W2NvbnN0IEJvdHRvbVR5cGUoKV0pOwogICAgc3RyZWFtT2ZCb3R0b20gPSBuZXcgSW50ZXJmYWNlVHlwZShjb3JlVHlwZXMuc3RyZWFtQ2xhc3MsCiAgICAgICAgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUsIDxEYXJ0VHlwZT5bY29uc3QgQm90dG9tVHlwZSgpXSk7CgogICAgdGlja2VyLmxvZ01zKCJDb21wdXRlZCBjb3JlIHR5cGVzIik7CiAgfQoKICB2b2lkIGNoZWNrU3VwZXJ0eXBlcyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGJ1aWxkZXIuY2hlY2tTdXBlcnR5cGVzKGNvcmVUeXBlcyk7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBzdXBlcnR5cGVzIik7CiAgfQoKICB2b2lkIGNoZWNrVHlwZXMoKSB7CiAgICBidWlsZGVycy5mb3JFYWNoKChVcmkgdXJpLCBMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KSB7CiAgICAgIGlmIChsaWJyYXJ5IGlzIFNvdXJjZUxpYnJhcnlCdWlsZGVyKSB7CiAgICAgICAgaWYgKGxpYnJhcnkubG9hZGVyID09IHRoaXMpIHsKICAgICAgICAgIGxpYnJhcnkKICAgICAgICAgICAgICAuY2hlY2tUeXBlc0luT3V0bGluZSh0eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCB0eXBlIGFyZ3VtZW50cyBvZiBzdXBlcnMgYWdhaW5zdCB0aGUgYm91bmRzIik7CiAgfQoKICB2b2lkIGNoZWNrT3ZlcnJpZGVzKExpc3Q8U291cmNlQ2xhc3NCdWlsZGVyPiBzb3VyY2VDbGFzc2VzKSB7CiAgICBMaXN0PERlbGF5ZWRPdmVycmlkZUNoZWNrPiBvdmVycmlkZUNoZWNrcyA9CiAgICAgICAgYnVpbGRlckhpZXJhcmNoeS5vdmVycmlkZUNoZWNrcy50b0xpc3QoKTsKICAgIGJ1aWxkZXJIaWVyYXJjaHkub3ZlcnJpZGVDaGVja3MuY2xlYXIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3ZlcnJpZGVDaGVja3MubGVuZ3RoOyBpKyspIHsKICAgICAgb3ZlcnJpZGVDaGVja3NbaV0uY2hlY2soYnVpbGRlckhpZXJhcmNoeSk7CiAgICB9CiAgICB0aWNrZXIubG9nTXMoIkNoZWNrZWQgJHtvdmVycmlkZUNoZWNrcy5sZW5ndGh9IG92ZXJyaWRlcyIpOwoKICAgIHR5cGVJbmZlcmVuY2VFbmdpbmU/LmZpbmlzaFRvcExldmVsSW5pdGlhbGl6aW5nRm9ybWFscygpOwogICAgdGlja2VyLmxvZ01zKCJGaW5pc2hlZCBpbml0aWFsaXppbmcgZm9ybWFscyIpOwogIH0KCiAgdm9pZCBjaGVja0Fic3RyYWN0TWVtYmVycyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgTGlzdDxEZWxheWVkTWVtYmVyPiBkZWxheWVkTWVtYmVyQ2hlY2tzID0KICAgICAgICBidWlsZGVySGllcmFyY2h5LmRlbGF5ZWRNZW1iZXJDaGVja3MudG9MaXN0KCk7CiAgICBidWlsZGVySGllcmFyY2h5LmRlbGF5ZWRNZW1iZXJDaGVja3MuY2xlYXIoKTsKICAgIFNldDxDbGFzcz4gY2hhbmdlZENsYXNzZXMgPSBuZXcgU2V0PENsYXNzPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxheWVkTWVtYmVyQ2hlY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGRlbGF5ZWRNZW1iZXJDaGVja3NbaV0uY2hlY2soYnVpbGRlckhpZXJhcmNoeSk7CiAgICAgIGNoYW5nZWRDbGFzc2VzLmFkZChkZWxheWVkTWVtYmVyQ2hlY2tzW2ldLmNsYXNzQnVpbGRlci5jbHMpOwogICAgfQogICAgdGlja2VyLmxvZ01zKAogICAgICAgICJDb21wdXRlZCAke2RlbGF5ZWRNZW1iZXJDaGVja3MubGVuZ3RofSBjb21iaW5lZCBtZW1iZXIgc2lnbmF0dXJlcyIpOwoKICAgIGhpZXJhcmNoeS5hcHBseU1lbWJlckNoYW5nZXMoY2hhbmdlZENsYXNzZXMsIGZpbmREZXNjZW5kYW50czogZmFsc2UpOwogICAgdGlja2VyCiAgICAgICAgLmxvZ01zKCJVcGRhdGVkICR7Y2hhbmdlZENsYXNzZXMubGVuZ3RofSBjbGFzc2VzIGluIGtlcm5lbCBoaWVyYXJjaHkiKTsKICB9CgogIHZvaWQgY2hlY2tSZWRpcmVjdGluZ0ZhY3RvcmllcyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgLy8gVE9ETyhhaGUpOiBNb3ZlIHRoaXMgdG8gW0NsYXNzSGllcmFyY2h5QnVpbGRlcl0uCiAgICBmb3IgKFNvdXJjZUNsYXNzQnVpbGRlciBidWlsZGVyIGluIHNvdXJjZUNsYXNzZXMpIHsKICAgICAgaWYgKGJ1aWxkZXIubGlicmFyeS5sb2FkZXIgPT0gdGhpcyAmJiAhYnVpbGRlci5pc1BhdGNoKSB7CiAgICAgICAgYnVpbGRlci5jaGVja1JlZGlyZWN0aW5nRmFjdG9yaWVzKAogICAgICAgICAgICB0eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCk7CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCByZWRpcmVjdGluZyBmYWN0b3JpZXMiKTsKICB9CgogIHZvaWQgYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVycyhMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcykgewogICAgLy8gVE9ETyhhaGUpOiBNb3ZlIHRoaXMgdG8gW0NsYXNzSGllcmFyY2h5QnVpbGRlcl0uCiAgICBpZiAoIXRhcmdldC5iYWNrZW5kVGFyZ2V0LmVuYWJsZU5vU3VjaE1ldGhvZEZvcndhcmRlcnMpIHJldHVybjsKCiAgICBMaXN0PENsYXNzPiBjaGFuZ2VkQ2xhc3NlcyA9IG5ldyBMaXN0PENsYXNzPigpOwogICAgZm9yIChTb3VyY2VDbGFzc0J1aWxkZXIgYnVpbGRlciBpbiBzb3VyY2VDbGFzc2VzKSB7CiAgICAgIGlmIChidWlsZGVyLmxpYnJhcnkubG9hZGVyID09IHRoaXMgJiYgIWJ1aWxkZXIuaXNQYXRjaCkgewogICAgICAgIGlmIChidWlsZGVyLmFkZE5vU3VjaE1ldGhvZEZvcndhcmRlcnModGFyZ2V0LCBoaWVyYXJjaHkpKSB7CiAgICAgICAgICBjaGFuZ2VkQ2xhc3Nlcy5hZGQoYnVpbGRlci5jbHMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaGllcmFyY2h5LmFwcGx5TWVtYmVyQ2hhbmdlcyhjaGFuZ2VkQ2xhc3NlcywgZmluZERlc2NlbmRhbnRzOiB0cnVlKTsKICAgIHRpY2tlci5sb2dNcygiQWRkZWQgbm9TdWNoTWV0aG9kIGZvcndhcmRlcnMiKTsKICB9CgogIHZvaWQgY2hlY2tNaXhpbnMoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIGZvciAoU291cmNlQ2xhc3NCdWlsZGVyIGJ1aWxkZXIgaW4gc291cmNlQ2xhc3NlcykgewogICAgICBpZiAoYnVpbGRlci5saWJyYXJ5LmxvYWRlciA9PSB0aGlzICYmICFidWlsZGVyLmlzUGF0Y2gpIHsKICAgICAgICBDbGFzcyBtaXhlZEluQ2xhc3MgPSBidWlsZGVyLmNscy5taXhlZEluQ2xhc3M7CiAgICAgICAgaWYgKG1peGVkSW5DbGFzcyAhPSBudWxsICYmIG1peGVkSW5DbGFzcy5pc01peGluRGVjbGFyYXRpb24pIHsKICAgICAgICAgIGJ1aWxkZXIuY2hlY2tNaXhpbkFwcGxpY2F0aW9uKGhpZXJhcmNoeSwgY29yZVR5cGVzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRpY2tlci5sb2dNcygiQ2hlY2tlZCBtaXhpbiBkZWNsYXJhdGlvbiBhcHBsaWNhdGlvbnMiKTsKICB9CgogIHZvaWQgYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgYnVpbGRlcnMuZm9yRWFjaCgoVXJpIHVyaSwgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSkgewogICAgICBpZiAobGlicmFyeS5sb2FkZXIgPT0gdGhpcykgewogICAgICAgIGxpYnJhcnkuYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMoKTsKICAgICAgICBJdGVyYXRvcjxCdWlsZGVyPiBpdGVyYXRvciA9IGxpYnJhcnkuaXRlcmF0b3I7CiAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICAgIEJ1aWxkZXIgZGVjbGFyYXRpb24gPSBpdGVyYXRvci5jdXJyZW50OwogICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGlzIENsYXNzQnVpbGRlcikgewogICAgICAgICAgICBkZWNsYXJhdGlvbi5idWlsZE91dGxpbmVFeHByZXNzaW9ucyhsaWJyYXJ5LCBjb3JlVHlwZXMpOwogICAgICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpcyBFeHRlbnNpb25CdWlsZGVyKSB7CiAgICAgICAgICAgIGRlY2xhcmF0aW9uLmJ1aWxkT3V0bGluZUV4cHJlc3Npb25zKGxpYnJhcnksIGNvcmVUeXBlcyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGlzIE1lbWJlckJ1aWxkZXIpIHsKICAgICAgICAgICAgZGVjbGFyYXRpb24uYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnMobGlicmFyeSwgY29yZVR5cGVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBidWlsZENsYXNzSGllcmFyY2h5KAogICAgICBMaXN0PFNvdXJjZUNsYXNzQnVpbGRlcj4gc291cmNlQ2xhc3NlcywgQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzKSB7CiAgICBidWlsZGVySGllcmFyY2h5ID0gQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLmJ1aWxkKAogICAgICAgIG9iamVjdENsYXNzLCBzb3VyY2VDbGFzc2VzLCB0aGlzLCBjb3JlVHlwZXMpOwogICAgdHlwZUluZmVyZW5jZUVuZ2luZT8uaGllcmFyY2h5QnVpbGRlciA9IGJ1aWxkZXJIaWVyYXJjaHk7CiAgICB0aWNrZXIubG9nTXMoIkJ1aWx0IGNsYXNzIGhpZXJhcmNoeSIpOwogIH0KCiAgdm9pZCBjcmVhdGVUeXBlSW5mZXJlbmNlRW5naW5lKCkgewogICAgdHlwZUluZmVyZW5jZUVuZ2luZSA9IG5ldyBUeXBlSW5mZXJlbmNlRW5naW5lSW1wbChpbnN0cnVtZW50YXRpb24pOwogIH0KCiAgdm9pZCBwZXJmb3JtVG9wTGV2ZWxJbmZlcmVuY2UoTGlzdDxTb3VyY2VDbGFzc0J1aWxkZXI+IHNvdXJjZUNsYXNzZXMpIHsKICAgIC8vLyBUaGUgZmlyc3QgcGhhc2Ugb2YgdG9wIGxldmVsIGluaXRpYWxpemVyIGluZmVyZW5jZSwgd2hpY2ggY29uc2lzdHMgb2YKICAgIC8vLyBjcmVhdGluZyBrZXJuZWwgb2JqZWN0cyBmb3IgYWxsIGZpZWxkcyBhbmQgdG9wIGxldmVsIHZhcmlhYmxlcyB0aGF0CiAgICAvLy8gbWlnaHQgYmUgc3ViamVjdCB0byB0eXBlIGluZmVyZW5jZSwgYW5kIHJlY29yZHMgZGVwZW5kZW5jaWVzIGJldHdlZW4KICAgIC8vLyB0aGVtLgogICAgdHlwZUluZmVyZW5jZUVuZ2luZS5wcmVwYXJlVG9wTGV2ZWwoY29yZVR5cGVzLCBoaWVyYXJjaHkpOwogICAgTGlzdDxGaWVsZEJ1aWxkZXI+IGFsbEltcGxpY2l0bHlUeXBlZEZpZWxkcyA9IDxGaWVsZEJ1aWxkZXI+W107CiAgICBmb3IgKExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgaW4gYnVpbGRlcnMudmFsdWVzKSB7CiAgICAgIGlmIChsaWJyYXJ5LmxvYWRlciA9PSB0aGlzKSB7CiAgICAgICAgTGlzdDxGaWVsZEJ1aWxkZXI+IGltcGxpY2l0bHlUeXBlZEZpZWxkcyA9CiAgICAgICAgICAgIGxpYnJhcnkudGFrZUltcGxpY2l0bHlUeXBlZEZpZWxkcygpOwogICAgICAgIGlmIChpbXBsaWNpdGx5VHlwZWRGaWVsZHMgIT0gbnVsbCkgewogICAgICAgICAgYWxsSW1wbGljaXRseVR5cGVkRmllbGRzLmFkZEFsbChpbXBsaWNpdGx5VHlwZWRGaWVsZHMpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW1wbGljaXRseVR5cGVkRmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIC8vIFRPRE8oYWhlKTogVGhpcyBjYW4gY2F1c2UgYSBjcmFzaCBmb3IgcGFydHMgdGhhdCBmYWlsZWQgdG8gZ2V0CiAgICAgIC8vIGluY2x1ZGVkLCBzZWUgZm9yIGV4YW1wbGUsCiAgICAgIC8vIHRlc3RzL3N0YW5kYWxvbmVfMi9pby9odHRwX2Nvb2tpZV9kYXRlX3Rlc3QuZGFydC4KICAgICAgYWxsSW1wbGljaXRseVR5cGVkRmllbGRzW2ldLmluZmVyVHlwZSgpOwogICAgfQoKICAgIHR5cGVJbmZlcmVuY2VFbmdpbmUuaXNUeXBlSW5mZXJlbmNlUHJlcGFyZWQgPSB0cnVlOwoKICAgIC8vIFNpbmNlIGZpbmFsaXphdGlvbiBvZiBjb3ZhcmlhbmNlIG1heSBoYXZlIGFkZGVkIGZvcndhcmRpbmcgc3R1YnMsIHdlIG5lZWQKICAgIC8vIHRvIHJlY29tcHV0ZSB0aGUgY2xhc3MgaGllcmFyY2h5IHNvIHRoYXQgbWV0aG9kIGNvbXBpbGF0aW9uIHdpbGwgcHJvcGVybHkKICAgIC8vIHRhcmdldCB0aG9zZSBmb3J3YXJkaW5nIHN0dWJzLgogICAgaGllcmFyY2h5Lm9uQW1iaWd1b3VzU3VwZXJ0eXBlcyA9IGlnbm9yZUFtYmlndW91c1N1cGVydHlwZXM7CiAgICB0aWNrZXIubG9nTXMoIlBlcmZvcm1lZCB0b3AgbGV2ZWwgaW5mZXJlbmNlIik7CiAgfQoKICB2b2lkIHRyYW5zZm9ybVBvc3RJbmZlcmVuY2UoVHJlZU5vZGUgbm9kZSwgYm9vbCB0cmFuc2Zvcm1TZXRMaXRlcmFscywKICAgICAgYm9vbCB0cmFuc2Zvcm1Db2xsZWN0aW9ucywgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICBpZiAodHJhbnNmb3JtQ29sbGVjdGlvbnMpIHsKICAgICAgY29sbGVjdGlvblRyYW5zZm9ybWVyID8/PSBuZXcgQ29sbGVjdGlvblRyYW5zZm9ybWVyKHRoaXMpOwogICAgICBjb2xsZWN0aW9uVHJhbnNmb3JtZXIuZW50ZXJMaWJyYXJ5KGNsaWVudExpYnJhcnkpOwogICAgICBub2RlLmFjY2VwdChjb2xsZWN0aW9uVHJhbnNmb3JtZXIpOwogICAgICBjb2xsZWN0aW9uVHJhbnNmb3JtZXIuZXhpdExpYnJhcnkoKTsKICAgIH0KICAgIGlmICh0cmFuc2Zvcm1TZXRMaXRlcmFscykgewogICAgICBzZXRMaXRlcmFsVHJhbnNmb3JtZXIgPz89IG5ldyBTZXRMaXRlcmFsVHJhbnNmb3JtZXIodGhpcyk7CiAgICAgIHNldExpdGVyYWxUcmFuc2Zvcm1lci5lbnRlckxpYnJhcnkoY2xpZW50TGlicmFyeSk7CiAgICAgIG5vZGUuYWNjZXB0KHNldExpdGVyYWxUcmFuc2Zvcm1lcik7CiAgICAgIHNldExpdGVyYWxUcmFuc2Zvcm1lci5leGl0TGlicmFyeSgpOwogICAgfQogIH0KCiAgdm9pZCB0cmFuc2Zvcm1MaXN0UG9zdEluZmVyZW5jZSgKICAgICAgTGlzdDxUcmVlTm9kZT4gbGlzdCwKICAgICAgYm9vbCB0cmFuc2Zvcm1TZXRMaXRlcmFscywKICAgICAgYm9vbCB0cmFuc2Zvcm1Db2xsZWN0aW9ucywKICAgICAgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICBpZiAodHJhbnNmb3JtQ29sbGVjdGlvbnMpIHsKICAgICAgQ29sbGVjdGlvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KICAgICAgICAgIGNvbGxlY3Rpb25UcmFuc2Zvcm1lciA/Pz0gbmV3IENvbGxlY3Rpb25UcmFuc2Zvcm1lcih0aGlzKTsKICAgICAgdHJhbnNmb3JtZXIuZW50ZXJMaWJyYXJ5KGNsaWVudExpYnJhcnkpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbGlzdFtpXS5hY2NlcHQodHJhbnNmb3JtZXIpOwogICAgICB9CiAgICAgIHRyYW5zZm9ybWVyLmV4aXRMaWJyYXJ5KCk7CiAgICB9CiAgICBpZiAodHJhbnNmb3JtU2V0TGl0ZXJhbHMpIHsKICAgICAgU2V0TGl0ZXJhbFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KICAgICAgICAgIHNldExpdGVyYWxUcmFuc2Zvcm1lciA/Pz0gbmV3IFNldExpdGVyYWxUcmFuc2Zvcm1lcih0aGlzKTsKICAgICAgdHJhbnNmb3JtZXIuZW50ZXJMaWJyYXJ5KGNsaWVudExpYnJhcnkpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgICBsaXN0W2ldID0gbGlzdFtpXS5hY2NlcHQodHJhbnNmb3JtZXIpOwogICAgICB9CiAgICAgIHRyYW5zZm9ybWVyLmV4aXRMaWJyYXJ5KCk7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGluc3RhbnRpYXRlSW52b2NhdGlvbihFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwKICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgaW50IG9mZnNldCwgYm9vbCBpc1N1cGVyKSB7CiAgICByZXR1cm4gdGFyZ2V0LmJhY2tlbmRUYXJnZXQuaW5zdGFudGlhdGVJbnZvY2F0aW9uKAogICAgICAgIGNvcmVUeXBlcywgcmVjZWl2ZXIsIG5hbWUsIGFyZ3VtZW50cywgb2Zmc2V0LCBpc1N1cGVyKTsKICB9CgogIEV4cHJlc3Npb24gaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQsCiAgICAgIHtib29sIGlzTWV0aG9kOiBmYWxzZSwKICAgICAgYm9vbCBpc0dldHRlcjogZmFsc2UsCiAgICAgIGJvb2wgaXNTZXR0ZXI6IGZhbHNlLAogICAgICBib29sIGlzRmllbGQ6IGZhbHNlLAogICAgICBib29sIGlzTG9jYWxWYXJpYWJsZTogZmFsc2UsCiAgICAgIGJvb2wgaXNEeW5hbWljOiBmYWxzZSwKICAgICAgYm9vbCBpc1N1cGVyOiBmYWxzZSwKICAgICAgYm9vbCBpc1N0YXRpYzogZmFsc2UsCiAgICAgIGJvb2wgaXNDb25zdHJ1Y3RvcjogZmFsc2UsCiAgICAgIGJvb2wgaXNUb3BMZXZlbDogZmFsc2V9KSB7CiAgICByZXR1cm4gdGFyZ2V0LmJhY2tlbmRUYXJnZXQuaW5zdGFudGlhdGVOb1N1Y2hNZXRob2RFcnJvcigKICAgICAgICBjb3JlVHlwZXMsIHJlY2VpdmVyLCBuYW1lLCBhcmd1bWVudHMsIG9mZnNldCwKICAgICAgICBpc01ldGhvZDogaXNNZXRob2QsCiAgICAgICAgaXNHZXR0ZXI6IGlzR2V0dGVyLAogICAgICAgIGlzU2V0dGVyOiBpc1NldHRlciwKICAgICAgICBpc0ZpZWxkOiBpc0ZpZWxkLAogICAgICAgIGlzTG9jYWxWYXJpYWJsZTogaXNMb2NhbFZhcmlhYmxlLAogICAgICAgIGlzRHluYW1pYzogaXNEeW5hbWljLAogICAgICAgIGlzU3VwZXI6IGlzU3VwZXIsCiAgICAgICAgaXNTdGF0aWM6IGlzU3RhdGljLAogICAgICAgIGlzQ29uc3RydWN0b3I6IGlzQ29uc3RydWN0b3IsCiAgICAgICAgaXNUb3BMZXZlbDogaXNUb3BMZXZlbCk7CiAgfQoKICB2b2lkIHJlbGVhc2VBbmNpbGxhcnlSZXNvdXJjZXMoKSB7CiAgICBoaWVyYXJjaHkgPSBudWxsOwogICAgYnVpbGRlckhpZXJhcmNoeSA9IG51bGw7CiAgICB0eXBlSW5mZXJlbmNlRW5naW5lID0gbnVsbDsKICAgIGJ1aWxkZXJzPy5jbGVhcigpOwogICAgbGlicmFyaWVzPy5jbGVhcigpOwogICAgZmlyc3QgPSBudWxsOwogICAgc291cmNlQnl0ZXM/LmNsZWFyKCk7CiAgICB0YXJnZXQ/LnJlbGVhc2VBbmNpbGxhcnlSZXNvdXJjZXMoKTsKICAgIF9jb3JlVHlwZXMgPSBudWxsOwogICAgaW5zdHJ1bWVudGF0aW9uID0gbnVsbDsKICAgIGNvbGxlY3Rpb25UcmFuc2Zvcm1lciA9IG51bGw7CiAgICBzZXRMaXRlcmFsVHJhbnNmb3JtZXIgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgQ2xhc3NCdWlsZGVyIGNvbXB1dGVDbGFzc0J1aWxkZXJGcm9tVGFyZ2V0Q2xhc3MoQ2xhc3MgY2xzKSB7CiAgICBMaWJyYXJ5IGtlcm5lbExpYnJhcnkgPSBjbHMuZW5jbG9zaW5nTGlicmFyeTsKICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBidWlsZGVyc1trZXJuZWxMaWJyYXJ5LmltcG9ydFVyaV07CiAgICBpZiAobGlicmFyeSA9PSBudWxsKSB7CiAgICAgIHJldHVybiB0YXJnZXQuZGlsbFRhcmdldC5sb2FkZXIuY29tcHV0ZUNsYXNzQnVpbGRlckZyb21UYXJnZXRDbGFzcyhjbHMpOwogICAgfQogICAgcmV0dXJuIGxpYnJhcnkubG9va3VwTG9jYWxNZW1iZXIoY2xzLm5hbWUsIHJlcXVpcmVkOiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVCdWlsZGVyIGNvbXB1dGVUeXBlQnVpbGRlcihEYXJ0VHlwZSB0eXBlKSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQobmV3IFR5cGVCdWlsZGVyQ29tcHV0ZXIodGhpcykpOwogIH0KCiAgQm9keUJ1aWxkZXIgY3JlYXRlQm9keUJ1aWxkZXJGb3JGaWVsZCgKICAgICAgRmllbGRCdWlsZGVyIGZpZWxkLCBUeXBlSW5mZXJyZXIgdHlwZUluZmVycmVyKSB7CiAgICByZXR1cm4gbmV3IEJvZHlCdWlsZGVyLmZvckZpZWxkKGZpZWxkLCB0eXBlSW5mZXJyZXIpOwogIH0KfQoKLy8vIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXJ0OmNvcmUgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGNyZWF0ZSBhbgovLy8gaW5zdGFuY2Ugb2YgW0NvcmVUeXBlc10gYW5kIGNvbXBpbGUgYSBwcm9ncmFtLgpjb25zdCBTdHJpbmcgZGVmYXVsdERhcnRDb3JlU291cmNlID0gIiIiCmltcG9ydCAnZGFydDpfaW50ZXJuYWwnOwppbXBvcnQgJ2RhcnQ6YXN5bmMnOwoKZXhwb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZSwgU3RyZWFtOwoKcHJpbnQob2JqZWN0KSB7fQoKY2xhc3MgSXRlcmF0b3Ige30KCmNsYXNzIEl0ZXJhYmxlIHt9CgpjbGFzcyBMaXN0IGV4dGVuZHMgSXRlcmFibGUgewogIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoZWxlbWVudHMpID0+IG51bGw7Cn0KCmNsYXNzIE1hcCBleHRlbmRzIEl0ZXJhYmxlIHsKICBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUob3RoZXIpID0+IG51bGw7Cn0KCmNsYXNzIE5vU3VjaE1ldGhvZEVycm9yIHsKICBOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbihyZWNlaXZlciwgaW52b2NhdGlvbik7Cn0KCmNsYXNzIE51bGwge30KCmNsYXNzIE9iamVjdCB7CiAgbm9TdWNoTWV0aG9kKGludm9jYXRpb24pID0+IG51bGw7Cn0KCmNsYXNzIFN0cmluZyB7fQoKY2xhc3MgU3ltYm9sIHt9CgpjbGFzcyBTZXQge30KCmNsYXNzIFR5cGUge30KCmNsYXNzIF9JbnZvY2F0aW9uTWlycm9yIHsKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aFR5cGUoX21lbWJlck5hbWUsIF90eXBlLCBfdHlwZUFyZ3VtZW50cywKICAgICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMsIF9uYW1lZEFyZ3VtZW50cyk7Cn0KCmNsYXNzIGJvb2wge30KCmNsYXNzIGRvdWJsZSBleHRlbmRzIG51bSB7fQoKY2xhc3MgaW50IGV4dGVuZHMgbnVtIHt9CgpjbGFzcyBudW0ge30KCmNsYXNzIF9TeW5jSXRlcmFibGUge30KCmNsYXNzIF9TeW5jSXRlcmF0b3IgewogIHZhciBfY3VycmVudDsKICB2YXIgX3lpZWxkRWFjaEl0ZXJhYmxlOwp9CgpjbGFzcyBGdW5jdGlvbiB7fQoiIiI7CgovLy8gQSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIGRhcnQ6YXN5bmMgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGNyZWF0ZSBhbgovLy8gaW5zdGFuY2Ugb2YgW0NvcmVUeXBlc10gYW5kIGNvbXBpbGUgcHJvZ3JhbS4KY29uc3QgU3RyaW5nIGRlZmF1bHREYXJ0QXN5bmNTb3VyY2UgPSAiIiIKX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikge30KCl9hc3luY1N0YWNrVHJhY2VIZWxwZXIoYXN5bmNfb3ApIHt9CgpfYXN5bmNUaGVuV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHt9CgpfYXdhaXRIZWxwZXIob2JqZWN0LCB0aGVuQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIGF3YWl0ZXIpIHt9CgpfY29tcGxldGVPbkFzeW5jUmV0dXJuKGNvbXBsZXRlciwgdmFsdWUpIHt9CgpjbGFzcyBfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlciB7CiAgYWRkKGV2ZW50KSB7fQoKICBhZGRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSkge30KCiAgYWRkU3RyZWFtKHN0cmVhbSkge30KCiAgY2xvc2UoKSB7fQoKICBnZXQgc3RyZWFtID0+IG51bGw7Cn0KCmNsYXNzIENvbXBsZXRlciB7CiAgZmFjdG9yeSBDb21wbGV0ZXIuc3luYygpID0+IG51bGw7CgogIGdldCBmdXR1cmU7CgogIGNvbXBsZXRlKFt2YWx1ZV0pOwoKICBjb21wbGV0ZUVycm9yKGVycm9yLCBbc3RhY2tUcmFjZV0pOwp9CgpjbGFzcyBGdXR1cmUgewogIGZhY3RvcnkgRnV0dXJlLm1pY3JvdGFzayhjb21wdXRhdGlvbikgPT4gbnVsbDsKfQoKY2xhc3MgRnV0dXJlT3Igewp9CgpjbGFzcyBfQXN5bmNBd2FpdENvbXBsZXRlciBpbXBsZW1lbnRzIENvbXBsZXRlciB7CiAgZ2V0IGZ1dHVyZSA9PiBudWxsOwoKICBjb21wbGV0ZShbdmFsdWVdKSB7fQoKICBjb21wbGV0ZUVycm9yKGVycm9yLCBbc3RhY2tUcmFjZV0pIHt9Cn0KCmNsYXNzIFN0cmVhbSB7fQoKY2xhc3MgX1N0cmVhbUl0ZXJhdG9yIHsKICBnZXQgY3VycmVudCA9PiBudWxsOwoKICBtb3ZlTmV4dCgpIHt9CgogIGNhbmNlbCgpIHt9Cn0KIiIiOwoKLy8vIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXJ0OmNvbGxlY3Rpb24gdGhhdCBpcyBzdWZmaWNpZW50IHRvIGNyZWF0ZSBhbgovLy8gaW5zdGFuY2Ugb2YgW0NvcmVUeXBlc10gYW5kIGNvbXBpbGUgcHJvZ3JhbS4KY29uc3QgU3RyaW5nIGRlZmF1bHREYXJ0Q29sbGVjdGlvblNvdXJjZSA9ICIiIgpjbGFzcyBfVW5tb2RpZmlhYmxlU2V0IHsKICBmaW5hbCBNYXAgX21hcDsKICBjb25zdCBfVW5tb2RpZmlhYmxlU2V0KHRoaXMuX21hcCk7Cn0KIiIiOwoKLy8vIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXJ0Ol9pbnRlcm5hbCB0aGF0IGlzIHN1ZmZpY2llbnQgdG8gY3JlYXRlIGFuCi8vLyBpbnN0YW5jZSBvZiBbQ29yZVR5cGVzXSBhbmQgY29tcGlsZSBwcm9ncmFtLgpjb25zdCBTdHJpbmcgZGVmYXVsdERhcnRJbnRlcm5hbFNvdXJjZSA9ICIiIgpjbGFzcyBTeW1ib2wgewogIGNvbnN0IFN5bWJvbChTdHJpbmcgbmFtZSk7Cn0KIiIiOwoKLy8vIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXJ0OnR5cGVkX2RhdGEgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGNyZWF0ZSBhbgovLy8gaW5zdGFuY2Ugb2YgW0NvcmVUeXBlc10gYW5kIGNvbXBpbGUgcHJvZ3JhbS4KY29uc3QgU3RyaW5nIGRlZmF1bHREYXJ0VHlwZWREYXRhU291cmNlID0gIiIiCmNsYXNzIEVuZGlhbiB7CiAgc3RhdGljIGNvbnN0IEVuZGlhbiBsaXR0bGUgPSBudWxsOwogIHN0YXRpYyBjb25zdCBFbmRpYW4gYmlnID0gbnVsbDsKICBzdGF0aWMgZmluYWwgRW5kaWFuIGhvc3QgPSBudWxsOwp9CiIiIjsKCmNsYXNzIEFtYmlndW91c1R5cGVzUmVjb3JkIHsKICBmaW5hbCBDbGFzcyBjbHM7CiAgZmluYWwgU3VwZXJ0eXBlIGE7CiAgZmluYWwgU3VwZXJ0eXBlIGI7CgogIGNvbnN0IEFtYmlndW91c1R5cGVzUmVjb3JkKHRoaXMuY2xzLCB0aGlzLmEsIHRoaXMuYik7Cn0KCmNsYXNzIFNvdXJjZUxvYWRlckRhdGFGb3JUZXN0aW5nIHsKICBmaW5hbCBNYXA8VHJlZU5vZGUsIFRyZWVOb2RlPiBf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ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0ZmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdGFudF9ldmFsdWF0b3IuZGFydMABO7YvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIFRoaXMgbGlicmFyeSBpbXBsZW1lbnRzIGEga2VybmVsMmtlcm5lbCBjb25zdGFudCBldmFsdWF0aW9uIHRyYW5zZm9ybWF0aW9uLgovLy8KLy8vIEV2ZW4gdGhvdWdoIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGZyb250ZW5kIGRvZXMgbm90IGVtaXQga2VybmVsIEFTVCB3aGljaAovLy8gY29udGFpbnMgY29tcGlsZS10aW1lIGVycm9ycywgdGhpcyB0cmFuc2Zvcm1hdGlvbiBzdGlsbCBwZXJmb3JtcyBzb21lCi8vLyB2YWxpZGF0aW9uIGFuZCB0aHJvd3MgYSBbQ29uc3RhbnRFdmFsdWF0aW9uRXJyb3JdIGlmIHRoZXJlIHdhcyBhCi8vLyBjb21waWxlLXRpbWUgZXJyb3JzLgovLy8KLy8vIER1ZSB0byB0aGUgbGFjayBpbmZvcm1hdGlvbiB3aGljaCBpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgZnJvbnQtZW5kLAovLy8gdGhpcyB2YWxpZGF0aW9uIGlzIGluY29tcGxldGUgKGUuZy4gd2hldGhlciBhbiBpbnRlZ2VyIGxpdGVyYWwgdXNlZCB0aGUKLy8vIGhleGFkZWNpbWFsIHN5bnRheCBvciBub3QpLgovLy8KLy8vIEZ1cnRoZXJtb3JlIGR1ZSB0byB0aGUgbG93ZXJpbmcgb2YgY2VydGFpbiBjb25zdHJ1Y3RzIGluIHRoZSBmcm9udC1lbmQKLy8vIChlLmcuICc/PycpIHdlIG5lZWQgdG8gc3VwcG9ydCBhIHN1cGVyLXNldCBvZiB0aGUgbm9ybWFsIGNvbnN0YW50IGV4cHJlc3Npb24KLy8vIGxhbmd1YWdlLiAgSXNzdWUoaHR0cDovL2RhcnRidWcuY29tLzMxNzk5KQpsaWJyYXJ5IGZhc3RhLmNvbnN0YW50X2V2YWx1YXRvcjsKCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbG9uZS5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvbGVnYWN5X2VyYXN1cmUuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CmltcG9ydCAncGFja2FnZTprZXJuZWwvdGFyZ2V0L3RhcmdldHMuZGFydCc7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgTG9jYXRlZE1lc3NhZ2UsCiAgICAgICAgTWVzc2FnZSwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHksCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbENvbnRleHQsCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbEV4dGVuc2lvbiwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uLAogICAgICAgIG1lc3NhZ2VDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZCwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsTm90TWFwSW5TcHJlYWQsCiAgICAgICAgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsU3RhcnRpbmdQb2ludCwKICAgICAgICBtZXNzYWdlQ29uc3RFdmFsVW5ldmFsdWF0ZWQsCiAgICAgICAgbm9MZW5ndGgsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxEZWZlcnJlZExpYnJhcnksCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxEdXBsaWNhdGVFbGVtZW50LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlS2V5LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0LAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24sCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmQsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3ltYm9sTmFtZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbCwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXQsCiAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxaZXJvRGl2aXNvcjsKCmltcG9ydCAnY29uc3RhbnRfaW50X2ZvbGRlci5kYXJ0JzsKCnBhcnQgJ2NvbnN0YW50X2NvbGxlY3Rpb25fYnVpbGRlcnMuZGFydCc7CgpDb21wb25lbnQgdHJhbnNmb3JtQ29tcG9uZW50KAogICAgQ29tcG9uZW50IGNvbXBvbmVudCwKICAgIENvbnN0YW50c0JhY2tlbmQgYmFja2VuZCwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzLAogICAgRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyLAogICAgRXZhbHVhdGlvbk1vZGUgZXZhbHVhdGlvbk1vZGUsCiAgICB7Ym9vbCBrZWVwRmllbGRzOiB0cnVlLAogICAgYm9vbCBldmFsdWF0ZUFubm90YXRpb25zOiB0cnVlLAogICAgYm9vbCBkZXN1Z2FyU2V0czogZmFsc2UsCiAgICBib29sIGVuYWJsZVRyaXBsZVNoaWZ0OiBmYWxzZSwKICAgIGJvb2wgZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQ6IGZhbHNlLAogICAgQ29yZVR5cGVzIGNvcmVUeXBlcywKICAgIENsYXNzSGllcmFyY2h5IGhpZXJhcmNoeX0pIHsKICBjb3JlVHlwZXMgPz89IG5ldyBDb3JlVHlwZXMoY29tcG9uZW50KTsKICBoaWVyYXJjaHkgPz89IG5ldyBDbGFzc0hpZXJhcmNoeShjb21wb25lbnQsIGNvcmVUeXBlcyk7CgogIGZpbmFsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQgPQogICAgICBuZXcgVHlwZUVudmlyb25tZW50KGNvcmVUeXBlcywgaGllcmFyY2h5KTsKCiAgdHJhbnNmb3JtTGlicmFyaWVzKGNvbXBvbmVudC5saWJyYXJpZXMsIGJhY2tlbmQsIGVudmlyb25tZW50RGVmaW5lcywKICAgICAgdHlwZUVudmlyb25tZW50LCBlcnJvclJlcG9ydGVyLCBldmFsdWF0aW9uTW9kZSwKICAgICAga2VlcEZpZWxkczoga2VlcEZpZWxkcywKICAgICAgZGVzdWdhclNldHM6IGRlc3VnYXJTZXRzLAogICAgICBlbmFibGVUcmlwbGVTaGlmdDogZW5hYmxlVHJpcGxlU2hpZnQsCiAgICAgIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OiBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCwKICAgICAgZXZhbHVhdGVBbm5vdGF0aW9uczogZXZhbHVhdGVBbm5vdGF0aW9ucyk7CiAgcmV0dXJuIGNvbXBvbmVudDsKfQoKdm9pZCB0cmFuc2Zvcm1MaWJyYXJpZXMoCiAgICBMaXN0PExpYnJhcnk+IGxpYnJhcmllcywKICAgIENvbnN0YW50c0JhY2tlbmQgYmFja2VuZCwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnREZWZpbmVzLAogICAgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudCwKICAgIEVycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlciwKICAgIEV2YWx1YXRpb25Nb2RlIGV2YWx1YXRpb25Nb2RlLAogICAge2Jvb2wga2VlcEZpZWxkczogdHJ1ZSwKICAgIGJvb2wgZXZhbHVhdGVBbm5vdGF0aW9uczogdHJ1ZSwKICAgIGJvb2wgZGVzdWdhclNldHM6IGZhbHNlLAogICAgYm9vbCBlbmFibGVUcmlwbGVTaGlmdDogZmFsc2UsCiAgICBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OiBmYWxzZX0pIHsKICBmaW5hbCBDb25zdGFudHNUcmFuc2Zvcm1lciBjb25zdGFudHNUcmFuc2Zvcm1lciA9IG5ldyBDb25zdGFudHNUcmFuc2Zvcm1lcigKICAgICAgYmFja2VuZCwKICAgICAgZW52aXJvbm1lbnREZWZpbmVzLAogICAgICBrZWVwRmllbGRzLAogICAgICBldmFsdWF0ZUFubm90YXRpb25zLAogICAgICBkZXN1Z2FyU2V0cywKICAgICAgZW5hYmxlVHJpcGxlU2hpZnQsCiAgICAgIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50LAogICAgICB0eXBlRW52aXJvbm1lbnQsCiAgICAgIGVycm9yUmVwb3J0ZXIsCiAgICAgIGV2YWx1YXRpb25Nb2RlKTsKICBmb3IgKGZpbmFsIExpYnJhcnkgbGlicmFyeSBpbiBsaWJyYXJpZXMpIHsKICAgIGNvbnN0YW50c1RyYW5zZm9ybWVyLmNvbnZlcnRMaWJyYXJ5KGxpYnJhcnkpOwogIH0KfQoKZW51bSBFdmFsdWF0aW9uTW9kZSB7CiAgbGVnYWN5LAogIHdlYWssCiAgc3Ryb25nLAp9CgpjbGFzcyBDb25zdGFudHNUcmFuc2Zvcm1lciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBDb25zdGFudHNCYWNrZW5kIGJhY2tlbmQ7CiAgZmluYWwgQ29uc3RhbnRFdmFsdWF0b3IgY29uc3RhbnRFdmFsdWF0b3I7CiAgZmluYWwgVHlwZUVudmlyb25tZW50IHR5cGVFbnZpcm9ubWVudDsKICBTdGF0aWNUeXBlQ29udGV4dCBfc3RhdGljVHlwZUNvbnRleHQ7CgogIC8vLyBXaGV0aGVyIHRvIHByZXNlcnZlIGNvbnN0YW50IFtGaWVsZF1zLiAgQWxsIHVzZS1zaXRlcyB3aWxsIGJlIHJld3JpdHRlbi4KICBmaW5hbCBib29sIGtlZXBGaWVsZHM7CiAgZmluYWwgYm9vbCBldmFsdWF0ZUFubm90YXRpb25zOwogIGZpbmFsIGJvb2wgZGVzdWdhclNldHM7CiAgZmluYWwgYm9vbCBlbmFibGVUcmlwbGVTaGlmdDsKICBmaW5hbCBib29sIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OwoKICBDb25zdGFudHNUcmFuc2Zvcm1lcigKICAgICAgdGhpcy5iYWNrZW5kLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50RGVmaW5lcywKICAgICAgdGhpcy5rZWVwRmllbGRzLAogICAgICB0aGlzLmV2YWx1YXRlQW5ub3RhdGlvbnMsCiAgICAgIHRoaXMuZGVzdWdhclNldHMsCiAgICAgIHRoaXMuZW5hYmxlVHJpcGxlU2hpZnQsCiAgICAgIHRoaXMuZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnQsCiAgICAgIHRoaXMudHlwZUVudmlyb25tZW50LAogICAgICBFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXIsCiAgICAgIEV2YWx1YXRpb25Nb2RlIGV2YWx1YXRpb25Nb2RlKQogICAgICA6IGNvbnN0YW50RXZhbHVhdG9yID0gbmV3IENvbnN0YW50RXZhbHVhdG9yKAogICAgICAgICAgICBiYWNrZW5kLCBlbnZpcm9ubWVudERlZmluZXMsIHR5cGVFbnZpcm9ubWVudCwgZXJyb3JSZXBvcnRlciwKICAgICAgICAgICAgZGVzdWdhclNldHM6IGRlc3VnYXJTZXRzLAogICAgICAgICAgICBlbmFibGVUcmlwbGVTaGlmdDogZW5hYmxlVHJpcGxlU2hpZnQsCiAgICAgICAgICAgIGVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50OiBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCwKICAgICAgICAgICAgZXZhbHVhdGlvbk1vZGU6IGV2YWx1YXRpb25Nb2RlKTsKCiAgLy8gVHJhbnNmb3JtIHRoZSBsaWJyYXJ5L2NsYXNzIG1lbWJlcnM6CgogIHZvaWQgY29udmVydExpYnJhcnkoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPQogICAgICAgIG5ldyBTdGF0aWNUeXBlQ29udGV4dC5mb3JBbm5vdGF0aW9ucyhsaWJyYXJ5LCB0eXBlRW52aXJvbm1lbnQpOwoKICAgIHRyYW5zZm9ybUFubm90YXRpb25zKGxpYnJhcnkuYW5ub3RhdGlvbnMsIGxpYnJhcnkpOwoKICAgIHRyYW5zZm9ybUxpc3QobGlicmFyeS5kZXBlbmRlbmNpZXMsIHRoaXMsIGxpYnJhcnkpOwogICAgdHJhbnNmb3JtTGlzdChsaWJyYXJ5LnBhcnRzLCB0aGlzLCBsaWJyYXJ5KTsKICAgIHRyYW5zZm9ybUxpc3QobGlicmFyeS50eXBlZGVmcywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkuY2xhc3NlcywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkucHJvY2VkdXJlcywgdGhpcywgbGlicmFyeSk7CiAgICB0cmFuc2Zvcm1MaXN0KGxpYnJhcnkuZmllbGRzLCB0aGlzLCBsaWJyYXJ5KTsKCiAgICBpZiAoIWtlZXBGaWVsZHMpIHsKICAgICAgLy8gVGhlIHRyYW5zZm9ybWVyIEFQSSBkb2VzIG5vdCBpdGVyYXRlIG92ZXIgYExpYnJhcnkuYWRkaXRpb25hbEV4cG9ydHNgLAogICAgICAvLyBzbyB3ZSBtYW51YWxseSBkZWxldGUgdGhlIHJlZmVyZW5jZXMgdG8gc2hha2VuIG5vZGVzLgogICAgICBsaWJyYXJ5LmFkZGl0aW9uYWxFeHBvcnRzLnJlbW92ZVdoZXJlKChSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZS5ub2RlIGlzIEZpZWxkICYmIHJlZmVyZW5jZS5jYW5vbmljYWxOYW1lID09IG51bGw7CiAgICAgIH0pOwogICAgfQogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIExpYnJhcnlQYXJ0IHZpc2l0TGlicmFyeVBhcnQoTGlicmFyeVBhcnQgbm9kZSkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICB9KTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlicmFyeURlcGVuZGVuY3kgdmlzaXRMaWJyYXJ5RGVwZW5kZW5jeShMaWJyYXJ5RGVwZW5kZW5jeSBub2RlKSB7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgIH0pOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBDbGFzcyB2aXNpdENsYXNzKENsYXNzIG5vZGUpIHsKICAgIFN0YXRpY1R5cGVDb250ZXh0IG9sZFN0YXRpY1R5cGVDb250ZXh0ID0gX3N0YXRpY1R5cGVDb250ZXh0OwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbmV3IFN0YXRpY1R5cGVDb250ZXh0LmZvckFubm90YXRpb25zKAogICAgICAgIG5vZGUuZW5jbG9zaW5nTGlicmFyeSwgdHlwZUVudmlyb25tZW50KTsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuZmllbGRzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnR5cGVQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLmNvbnN0cnVjdG9ycywgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS5wcm9jZWR1cmVzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ycywgdGhpcywgbm9kZSk7CiAgICB9KTsKICAgIF9zdGF0aWNUeXBlQ29udGV4dCA9IG9sZFN0YXRpY1R5cGVDb250ZXh0OwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBQcm9jZWR1cmUgdmlzaXRQcm9jZWR1cmUoUHJvY2VkdXJlIG5vZGUpIHsKICAgIFN0YXRpY1R5cGVDb250ZXh0IG9sZFN0YXRpY1R5cGVDb250ZXh0ID0gX3N0YXRpY1R5cGVDb250ZXh0OwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gbmV3IFN0YXRpY1R5cGVDb250ZXh0KG5vZGUsIHR5cGVFbnZpcm9ubWVudCk7CiAgICBjb25zdGFudEV2YWx1YXRvci53aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyhub2RlLmFubm90YXRpb25zLCBub2RlKTsKICAgICAgbm9kZS5mdW5jdGlvbiA9IG5vZGUuZnVuY3Rpb24uYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0pOwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gb2xkU3RhdGljVHlwZUNvbnRleHQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0cnVjdG9yIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3Igbm9kZSkgewogICAgU3RhdGljVHlwZUNvbnRleHQgb2xkU3RhdGljVHlwZUNvbnRleHQgPSBfc3RhdGljVHlwZUNvbnRleHQ7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPSBuZXcgU3RhdGljVHlwZUNvbnRleHQobm9kZSwgdHlwZUVudmlyb25tZW50KTsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUuaW5pdGlhbGl6ZXJzLCB0aGlzLCBub2RlKTsKICAgICAgbm9kZS5mdW5jdGlvbiA9IG5vZGUuZnVuY3Rpb24uYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0pOwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gb2xkU3RhdGljVHlwZUNvbnRleHQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVkZWYgdmlzaXRUeXBlZGVmKFR5cGVkZWYgbm9kZSkgewogICAgY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS50eXBlUGFyYW1ldGVycywgdGhpcywgbm9kZSk7CiAgICAgIHRyYW5zZm9ybUxpc3Qobm9kZS50eXBlUGFyYW1ldGVyc09mRnVuY3Rpb25UeXBlLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgICAgdHJhbnNmb3JtTGlzdChub2RlLm5hbWVkUGFyYW1ldGVycywgdGhpcywgbm9kZSk7CiAgICB9KTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgdmlzaXRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcigKICAgICAgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Igbm9kZSkgewogICAgU3RhdGljVHlwZUNvbnRleHQgb2xkU3RhdGljVHlwZUNvbnRleHQgPSBfc3RhdGljVHlwZUNvbnRleHQ7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPSBuZXcgU3RhdGljVHlwZUNvbnRleHQobm9kZSwgdHlwZUVudmlyb25tZW50KTsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgICB0cmFuc2Zvcm1MaXN0KG5vZGUubmFtZWRQYXJhbWV0ZXJzLCB0aGlzLCBub2RlKTsKICAgIH0pOwogICAgX3N0YXRpY1R5cGVDb250ZXh0ID0gb2xkU3RhdGljVHlwZUNvbnRleHQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIFR5cGVQYXJhbWV0ZXIgdmlzaXRUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgewogICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIHZvaWQgdHJhbnNmb3JtQW5ub3RhdGlvbnMoTGlzdDxFeHByZXNzaW9uPiBub2RlcywgVHJlZU5vZGUgcGFyZW50KSB7CiAgICBpZiAoZXZhbHVhdGVBbm5vdGF0aW9ucyAmJiBub2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgIHRyYW5zZm9ybUV4cHJlc3Npb25zKG5vZGVzLCBwYXJlbnQpOwogICAgfQogIH0KCiAgdm9pZCB0cmFuc2Zvcm1FeHByZXNzaW9ucyhMaXN0PEV4cHJlc3Npb24+IG5vZGVzLCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIGNvbnN0YW50RXZhbHVhdG9yLndpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICBub2Rlc1tpXSA9IGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQocGFyZW50LCBub2Rlc1tpXSkKICAgICAgICAgIC4ucGFyZW50ID0gcGFyZW50OwogICAgICB9CiAgICB9KTsKICB9CgogIC8vIEhhbmRsZSBkZWZpbml0aW9uIG9mIGNvbnN0YW50czoKCiAgQG92ZXJyaWRlCiAgRnVuY3Rpb25Ob2RlIHZpc2l0RnVuY3Rpb25Ob2RlKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICB0cmFuc2Zvcm1MaXN0KG5vZGUudHlwZVBhcmFtZXRlcnMsIHRoaXMsIG5vZGUpOwogICAgZmluYWwgaW50IHBvc2l0aW9uYWxQYXJhbWV0ZXJDb3VudCA9IG5vZGUucG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnQ7ICsraSkgewogICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnModmFyaWFibGUuYW5ub3RhdGlvbnMsIHZhcmlhYmxlKTsKICAgICAgaWYgKHZhcmlhYmxlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9CiAgICAgICAgICAgIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQodmFyaWFibGUsIHZhcmlhYmxlLmluaXRpYWxpemVyKQogICAgICAgICAgICAgIC4ucGFyZW50ID0gdmFyaWFibGU7CiAgICAgIH0KICAgIH0KICAgIGZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSBpbiBub2RlLm5hbWVkUGFyYW1ldGVycykgewogICAgICB0cmFuc2Zvcm1Bbm5vdGF0aW9ucyh2YXJpYWJsZS5hbm5vdGF0aW9ucywgdmFyaWFibGUpOwogICAgICBpZiAodmFyaWFibGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgIHZhcmlhYmxlLmluaXRpYWxpemVyID0KICAgICAgICAgICAgZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dCh2YXJpYWJsZSwgdmFyaWFibGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGUuYm9keSAhPSBudWxsKSB7CiAgICAgIG5vZGUuYm9keSA9IG5vZGUuYm9keS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBAb3ZlcnJpZGUKICBWYXJpYWJsZURlY2xhcmF0aW9uIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwoKICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwpIHsKICAgICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICAgIGZpbmFsIENvbnN0YW50IGNvbnN0YW50ID0gZXZhbHVhdGVXaXRoQ29udGV4dChub2RlLCBub2RlLmluaXRpYWxpemVyKTsKICAgICAgICBjb25zdGFudEV2YWx1YXRvci5lbnYuYWRkVmFyaWFibGVWYWx1ZShub2RlLCBjb25zdGFudCk7CiAgICAgICAgbm9kZS5pbml0aWFsaXplciA9IG1ha2VDb25zdGFudEV4cHJlc3Npb24oY29uc3RhbnQsIG5vZGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAuLnBhcmVudCA9IG5vZGU7CgogICAgICAgIC8vIElmIHRoaXMgY29uc3RhbnQgaXMgaW5saW5lZCwgcmVtb3ZlIGl0LgogICAgICAgIGlmIChzaG91bGRJbmxpbmUobm9kZS5pbml0aWFsaXplcikpIHsKICAgICAgICAgIGlmIChjb25zdGFudCBpcyEgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgICAgICAvLyBJZiB0aGUgY29uc3RhbnQgaXMgdW5ldmFsdWF0ZWQgd2UgbmVlZCB0byBrZWVwIHRoZSBleHByZXNzaW9uLAogICAgICAgICAgICAvLyBzbyB0aGF0LCBpbiB0aGUgY2FzZSB0aGUgY29uc3RhbnQgY29udGFpbnMgZXJyb3IgYnV0IHRoZSBsb2NhbAogICAgICAgICAgICAvLyBpcyB1bnVzZWQsIHRoZSBlcnJvciB3aWxsIHN0aWxsIGJlIHJlcG9ydGVkLgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5pbml0aWFsaXplciA9IG5vZGUuaW5pdGlhbGl6ZXIuYWNjZXB0PFRyZWVOb2RlPih0aGlzKQogICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CgogIEBvdmVycmlkZQogIEZpZWxkIHZpc2l0RmllbGQoRmllbGQgbm9kZSkgewogICAgU3RhdGljVHlwZUNvbnRleHQgb2xkU3RhdGljVHlwZUNvbnRleHQgPSBfc3RhdGljVHlwZUNvbnRleHQ7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPSBuZXcgU3RhdGljVHlwZUNvbnRleHQobm9kZSwgdHlwZUVudmlyb25tZW50KTsKICAgIEZpZWxkIGZpZWxkID0gY29uc3RhbnRFdmFsdWF0b3Iud2l0aE5ld0Vudmlyb25tZW50KCgpIHsKICAgICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICAgIHRyYW5zZm9ybUFubm90YXRpb25zKG5vZGUuYW5ub3RhdGlvbnMsIG5vZGUpOwogICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgPQogICAgICAgICAgICBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgICAgLi5wYXJlbnQgPSBub2RlOwoKICAgICAgICAvLyBJZiB0aGlzIGNvbnN0YW50IGlzIGlubGluZWQsIHJlbW92ZSBpdC4KICAgICAgICBpZiAoIWtlZXBGaWVsZHMgJiYgc2hvdWxkSW5saW5lKG5vZGUuaW5pdGlhbGl6ZXIpKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHJhbnNmb3JtQW5ub3RhdGlvbnMobm9kZS5hbm5vdGF0aW9ucywgbm9kZSk7CiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIgIT0gbnVsbCkgewogICAgICAgICAgbm9kZS5pbml0aWFsaXplciA9IG5vZGUuaW5pdGlhbGl6ZXIuYWNjZXB0PFRyZWVOb2RlPih0aGlzKQogICAgICAgICAgICAuLnBhcmVudCA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfSk7CiAgICBfc3RhdGljVHlwZUNvbnRleHQgPSBvbGRTdGF0aWNUeXBlQ29udGV4dDsKICAgIHJldHVybiBmaWVsZDsKICB9CgogIC8vIEhhbmRsZSB1c2Utc2l0ZXMgb2YgY29uc3RhbnRzIChhbmQgImlubGluZSIgY29uc3RhbnQgZXhwcmVzc2lvbnMpOgoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIHJldHVybiBtYWtlQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgIGNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKF9zdGF0aWNUeXBlQ29udGV4dCwgbm9kZSksIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB2aXNpdFN0YXRpY0dldChTdGF0aWNHZXQgbm9kZSkgewogICAgZmluYWwgTWVtYmVyIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgaWYgKHRhcmdldCBpcyBGaWVsZCAmJiB0YXJnZXQuaXNDb25zdCkgewogICAgICAvLyBNYWtlIHN1cmUgdGhlIGluaXRpYWxpemVyIGlzIGV2YWx1YXRlZCBmaXJzdC4KICAgICAgdGFyZ2V0LmluaXRpYWxpemVyID0KICAgICAgICAgIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQodGFyZ2V0LCB0YXJnZXQuaW5pdGlhbGl6ZXIpCiAgICAgICAgICAgIC4ucGFyZW50ID0gdGFyZ2V0OwogICAgICBpZiAoc2hvdWxkSW5saW5lKHRhcmdldC5pbml0aWFsaXplcikpIHsKICAgICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0U3RhdGljR2V0KG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgU3dpdGNoQ2FzZSB2aXNpdFN3aXRjaENhc2UoU3dpdGNoQ2FzZSBub2RlKSB7CiAgICB0cmFuc2Zvcm1FeHByZXNzaW9ucyhub2RlLmV4cHJlc3Npb25zLCBub2RlKTsKICAgIHJldHVybiBzdXBlci52aXNpdFN3aXRjaENhc2Uobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGUudmFyaWFibGU7CiAgICBpZiAodmFyaWFibGUuaXNDb25zdCkgewogICAgICB2YXJpYWJsZS5pbml0aWFsaXplciA9CiAgICAgICAgICBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KHZhcmlhYmxlLCB2YXJpYWJsZS5pbml0aWFsaXplcikKICAgICAgICAgICAgLi5wYXJlbnQgPSB2YXJpYWJsZTsKICAgICAgaWYgKHNob3VsZElubGluZSh2YXJpYWJsZS5pbml0aWFsaXplcikpIHsKICAgICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0VmFyaWFibGVHZXQobm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICAgIH0KICAgIHJldHVybiBzdXBlci52aXNpdExpc3RMaXRlcmFsKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB2aXNpdExpc3RDb25jYXRlbmF0aW9uKExpc3RDb25jYXRlbmF0aW9uIG5vZGUpIHsKICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAobm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRyYW5zZm9ybVdpdGhDb250ZXh0KG5vZGUsIG5vZGUpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnZpc2l0U2V0TGl0ZXJhbChub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gdmlzaXRTZXRDb25jYXRlbmF0aW9uKFNldENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRNYXBMaXRlcmFsKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICByZXR1cm4gZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dChub2RlLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIEV4cHJlc3Npb24gdmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb24obm9kZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBFeHByZXNzaW9uIHZpc2l0U3RhdGljSW52b2NhdGlvbihTdGF0aWNJbnZvY2F0aW9uIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQobm9kZSwgbm9kZSk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIudmlzaXRTdGF0aWNJbnZvY2F0aW9uKG5vZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgRXhwcmVzc2lvbiB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24gbm9kZSkgewogICAgQ29uc3RhbnQgY29uc3RhbnQgPSBub2RlLmNvbnN0YW50OwogICAgaWYgKGNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gY29uc3RhbnQuZXhwcmVzc2lvbjsKICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CiAgICB9IGVsc2UgewogICAgICBub2RlLmNvbnN0YW50ID0gY29uc3RhbnRFdmFsdWF0b3IuY2Fub25pY2FsaXplKGNvbnN0YW50KTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICBFeHByZXNzaW9uIGV2YWx1YXRlQW5kVHJhbnNmb3JtV2l0aENvbnRleHQoCiAgICAgIFRyZWVOb2RlIHRyZWVDb250ZXh0LCBFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBtYWtlQ29uc3RhbnRFeHByZXNzaW9uKGV2YWx1YXRlV2l0aENvbnRleHQodHJlZUNvbnRleHQsIG5vZGUpLCBub2RlKTsKICB9CgogIENvbnN0YW50IGV2YWx1YXRlV2l0aENvbnRleHQoVHJlZU5vZGUgdHJlZUNvbnRleHQsIEV4cHJlc3Npb24gbm9kZSkgewogICAgaWYgKHRyZWVDb250ZXh0ID09IG5vZGUpIHsKICAgICAgcmV0dXJuIGNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKF9zdGF0aWNUeXBlQ29udGV4dCwgbm9kZSk7CiAgICB9CgogICAgcmV0dXJuIGNvbnN0YW50RXZhbHVhdG9yLnJ1bkluc2lkZUNvbnRleHQodHJlZUNvbnRleHQsICgpIHsKICAgICAgcmV0dXJuIGNvbnN0YW50RXZhbHVhdG9yLmV2YWx1YXRlKF9zdGF0aWNUeXBlQ29udGV4dCwgbm9kZSk7CiAgICB9KTsKICB9CgogIEV4cHJlc3Npb24gbWFrZUNvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudCBjb25zdGFudCwgRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAoY29uc3RhbnQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCAmJgogICAgICAgIGNvbnN0YW50LmV4cHJlc3Npb24gaXMgSW52YWxpZEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGNvbnN0YW50LmV4cHJlc3Npb247CiAgICB9CiAgICByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbigKICAgICAgICBjb25zdGFudCwgbm9kZS5nZXRTdGF0aWNUeXBlKF9zdGF0aWNUeXBlQ29udGV4dCkpCiAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICB9CgogIGJvb2wgc2hvdWxkSW5saW5lKEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKICAgIGlmIChpbml0aWFsaXplciBpcyBDb25zdGFudEV4cHJlc3Npb24pIHsKICAgICAgcmV0dXJuIGJhY2tlbmQuc2hvdWxkSW5saW5lQ29uc3RhbnQoaW5pdGlhbGl6ZXIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBDb25zdGFudEV2YWx1YXRvciBleHRlbmRzIFJlY3Vyc2l2ZVZpc2l0b3I8Q29uc3RhbnQ+IHsKICBmaW5hbCBDb25zdGFudHNCYWNrZW5kIGJhY2tlbmQ7CiAgZmluYWwgTnVtYmVyU2VtYW50aWNzIG51bWJlclNlbWFudGljczsKICBDb25zdGFudEludEZvbGRlciBpbnRGb2xkZXI7CiAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudERlZmluZXM7CiAgZmluYWwgYm9vbCBlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudDsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwogIGZpbmFsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQ7CiAgU3RhdGljVHlwZUNvbnRleHQgX3N0YXRpY1R5cGVDb250ZXh0OwogIGZpbmFsIEVycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlcjsKICBmaW5hbCBFdmFsdWF0aW9uTW9kZSBldmFsdWF0aW9uTW9kZTsKCiAgZmluYWwgYm9vbCBkZXN1Z2FyU2V0czsKICBmaW5hbCBGaWVsZCB1bm1vZGlmaWFibGVTZXRNYXA7CgogIGZpbmFsIGJvb2wgZW5hYmxlVHJpcGxlU2hpZnQ7CgogIGZpbmFsIGJvb2wgRnVuY3Rpb24oRGFydFR5cGUpIGlzSW5zdGFudGlhdGVkID0KICAgICAgbmV3IElzSW5zdGFudGlhdGVkVmlzaXRvcigpLmlzSW5zdGFudGlhdGVkOwoKICBmaW5hbCBNYXA8Q29uc3RhbnQsIENvbnN0YW50PiBjYW5vbmljYWxpemF0aW9uQ2FjaGU7CiAgZmluYWwgTWFwPE5vZGUsIE9iamVjdD4gbm9kZUNhY2hlOwogIGZpbmFsIENsb25lVmlzaXRvck5vdE1lbWJlcnMgY2xvbmVyID0gbmV3IENsb25lVmlzaXRvck5vdE1lbWJlcnMoKTsKCiAgTWFwPENsYXNzLCBib29sPiBwcmltaXRpdmVFcXVhbENhY2hlOwoKICBmaW5hbCBOdWxsQ29uc3RhbnQgbnVsbENvbnN0YW50ID0gbmV3IE51bGxDb25zdGFudCgpOwogIGZpbmFsIEJvb2xDb25zdGFudCB0cnVlQ29uc3RhbnQgPSBuZXcgQm9vbENvbnN0YW50KHRydWUpOwogIGZpbmFsIEJvb2xDb25zdGFudCBmYWxzZUNvbnN0YW50ID0gbmV3IEJvb2xDb25zdGFudChmYWxzZSk7CgogIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGNvbnRleHRDaGFpbiA9IFtdOwoKICBJbnN0YW5jZUJ1aWxkZXIgaW5zdGFuY2VCdWlsZGVyOwogIEV2YWx1YXRpb25FbnZpcm9ubWVudCBlbnY7CiAgU2V0PEV4cHJlc3Npb24+IHJlcGxhY2VtZW50Tm9kZXMgPSBuZXcgU2V0PEV4cHJlc3Npb24+LmlkZW50aXR5KCk7CiAgTWFwPENvbnN0YW50LCBDb25zdGFudD4gbG93ZXJlZCA9IG5ldyBNYXA8Q29uc3RhbnQsIENvbnN0YW50Pi5pZGVudGl0eSgpOwoKICBib29sIHNlZW5VbmV2YWx1YXRlZENoaWxkOyAvLyBBbnkgY2hpbGRyZW4gdGhhdCB3ZXJlIGxlZnQgdW5ldmFsdWF0ZWQ/CiAgaW50IGxhenlEZXB0aDsgLy8gQ3VycmVudCBuZXN0aW5nIGRlcHRoIG9mIGxhenkgcmVnaW9ucy4KCiAgYm9vbCBnZXQgc2hvdWxkQmVVbmV2YWx1YXRlZCA9PiBzZWVuVW5ldmFsdWF0ZWRDaGlsZCB8fCBsYXp5RGVwdGggIT0gMDsKCiAgYm9vbCBnZXQgdGFyZ2V0aW5nSmF2YVNjcmlwdCA9PiBudW1iZXJTZW1hbnRpY3MgPT0gTnVtYmVyU2VtYW50aWNzLmpzOwoKICBib29sIGdldCBpc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+CiAgICAgIF9zdGF0aWNUeXBlQ29udGV4dC5ub25OdWxsYWJsZSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKCiAgQ29uc3RhbnRFdmFsdWF0b3IodGhpcy5iYWNrZW5kLCB0aGlzLmVudmlyb25tZW50RGVmaW5lcywgdGhpcy50eXBlRW52aXJvbm1lbnQsCiAgICAgIHRoaXMuZXJyb3JSZXBvcnRlciwKICAgICAge3RoaXMuZGVzdWdhclNldHMgPSBmYWxzZSwKICAgICAgdGhpcy5lbmFibGVUcmlwbGVTaGlmdCA9IGZhbHNlLAogICAgICB0aGlzLmVycm9yT25VbmV2YWx1YXRlZENvbnN0YW50ID0gZmFsc2UsCiAgICAgIHRoaXMuZXZhbHVhdGlvbk1vZGU6IEV2YWx1YXRpb25Nb2RlLmxlZ2FjeX0pCiAgICAgIDogbnVtYmVyU2VtYW50aWNzID0gYmFja2VuZC5udW1iZXJTZW1hbnRpY3MsCiAgICAgICAgY29yZVR5cGVzID0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcywKICAgICAgICBjYW5vbmljYWxpemF0aW9uQ2FjaGUgPSA8Q29uc3RhbnQsIENvbnN0YW50Pnt9LAogICAgICAgIG5vZGVDYWNoZSA9IDxOb2RlLCBDb25zdGFudD57fSwKICAgICAgICBlbnYgPSBuZXcgRXZhbHVhdGlvbkVudmlyb25tZW50KCksCiAgICAgICAgdW5tb2RpZmlhYmxlU2V0TWFwID0gZGVzdWdhclNldHMKICAgICAgICAgICAgPyB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmluZGV4CiAgICAgICAgICAgICAgICAuZ2V0TWVtYmVyKCdkYXJ0OmNvbGxlY3Rpb24nLCAnX1VubW9kaWZpYWJsZVNldCcsICdfbWFwJykKICAgICAgICAgICAgOiBudWxsIHsKICAgIGlmIChlbnZpcm9ubWVudERlZmluZXMgPT0gbnVsbCAmJiAhYmFja2VuZC5zdXBwb3J0c1VuZXZhbHVhdGVkQ29uc3RhbnRzKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgIk5vICdlbnZpcm9ubWVudERlZmluZXMnIHBhc3NlZCB0byB0aGUgY29uc3RhbnQgZXZhbHVhdG9yIGJ1dCB0aGUgIgogICAgICAgICAgIkNvbnN0YW50c0JhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCB1bmV2YWx1YXRlZCBjb25zdGFudHMuIik7CiAgICB9CiAgICBpbnRGb2xkZXIgPSBuZXcgQ29uc3RhbnRJbnRGb2xkZXIuZm9yU2VtYW50aWNzKHRoaXMsIG51bWJlclNlbWFudGljcyk7CiAgICBwcmltaXRpdmVFcXVhbENhY2hlID0gPENsYXNzLCBib29sPnsKICAgICAgY29yZVR5cGVzLmJvb2xDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLmRvdWJsZUNsYXNzOiBmYWxzZSwKICAgICAgY29yZVR5cGVzLmludENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMuaW50ZXJuYWxTeW1ib2xDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLmxpc3RDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLm1hcENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMubnVsbENsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMub2JqZWN0Q2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy5zZXRDbGFzczogdHJ1ZSwKICAgICAgY29yZVR5cGVzLnN0cmluZ0NsYXNzOiB0cnVlLAogICAgICBjb3JlVHlwZXMuc3ltYm9sQ2xhc3M6IHRydWUsCiAgICAgIGNvcmVUeXBlcy50eXBlQ2xhc3M6IHRydWUsCiAgICB9OwogIH0KCiAgRGFydFR5cGUgY29udmVydFR5cGUoRGFydFR5cGUgdHlwZSkgewogICAgc3dpdGNoIChldmFsdWF0aW9uTW9kZSkgewogICAgICBjYXNlIEV2YWx1YXRpb25Nb2RlLmxlZ2FjeToKICAgICAgY2FzZSBFdmFsdWF0aW9uTW9kZS5zdHJvbmc6CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIGNhc2UgRXZhbHVhdGlvbk1vZGUud2VhazoKICAgICAgICByZXR1cm4gbGVnYWN5RXJhc3VyZShjb3JlVHlwZXMsIHR5cGUpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgZXZhbHVhdGlvbiBtb2RlOiAke2V2YWx1YXRpb25Nb2RlfS4iKTsKICB9CgogIExpc3Q8RGFydFR5cGU+IGNvbnZlcnRUeXBlcyhMaXN0PERhcnRUeXBlPiB0eXBlcykgewogICAgc3dpdGNoIChldmFsdWF0aW9uTW9kZSkgewogICAgICBjYXNlIEV2YWx1YXRpb25Nb2RlLmxlZ2FjeToKICAgICAgY2FzZSBFdmFsdWF0aW9uTW9kZS5zdHJvbmc6CiAgICAgICAgcmV0dXJuIHR5cGVzOwogICAgICBjYXNlIEV2YWx1YXRpb25Nb2RlLndlYWs6CiAgICAgICAgcmV0dXJuIHR5cGVzCiAgICAgICAgICAgIC5tYXAoKERhcnRUeXBlIHR5cGUpID0+IGxlZ2FjeUVyYXN1cmUoY29yZVR5cGVzLCB0eXBlKSkKICAgICAgICAgICAgLnRvTGlzdCgpOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlVuZXhwZWN0ZWQgZXZhbHVhdGlvbiBtb2RlOiAke2V2YWx1YXRpb25Nb2RlfS4iKTsKICB9CgogIFVyaSBnZXRGaWxlVXJpKFRyZWVOb2RlIG5vZGUpIHsKICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZSBpcyEgRmlsZVVyaU5vZGUpIHsKICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgfQogICAgcmV0dXJuIChub2RlIGFzIEZpbGVVcmlOb2RlKT8uZmlsZVVyaTsKICB9CgogIGludCBnZXRGaWxlT2Zmc2V0KFVyaSB1cmksIFRyZWVOb2RlIG5vZGUpIHsKICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIFRyZWVOb2RlLm5vT2Zmc2V0OwogICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmZpbGVPZmZzZXQgPT0gVHJlZU5vZGUubm9PZmZzZXQpIHsKICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgfQogICAgcmV0dXJuIG5vZGUgPT0gbnVsbCA/IFRyZWVOb2RlLm5vT2Zmc2V0IDogbm9kZS5maWxlT2Zmc2V0OwogIH0KCiAgLy8vIEV2YWx1YXRlIFtub2RlXSBhbmQgcG9zc2libHkgY2FjaGUgdGhlIGV2YWx1YXRpb24gcmVzdWx0LgogIC8vLyBSZXR1cm5zIFVuZXZhbHVhdGVkQ29uc3RhbnQgaWYgdGhlIGNvbnN0YW50IGNvdWxkIG5vdCBiZSBldmFsdWF0ZWQuCiAgLy8vIElmIHRoZSBleHByZXNzaW9uIGluIHRoZSBVbmV2YWx1YXRlZENvbnN0YW50IGlzIGFuIEludmFsaWRFeHByZXNzaW9uLAogIC8vLyBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KICBDb25zdGFudCBldmFsdWF0ZShTdGF0aWNUeXBlQ29udGV4dCBjb250ZXh0LCBFeHByZXNzaW9uIG5vZGUpIHsKICAgIF9zdGF0aWNUeXBlQ29udGV4dCA9IGNvbnRleHQ7CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IGZhbHNlOwogICAgbGF6eURlcHRoID0gMDsKICAgIHRyeSB7CiAgICAgIENvbnN0YW50IHJlc3VsdCA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZSk7CiAgICAgIGlmIChyZXN1bHQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgIGlmIChlcnJvck9uVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgICAgcmV0dXJuIHJlcG9ydChub2RlLCBtZXNzYWdlQ29uc3RFdmFsVW5ldmFsdWF0ZWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVuZXZhbHVhdGVkQ29uc3RhbnQoCiAgICAgICAgICAgIHJlbW92ZVJlZHVuZGFudEZpbGVVcmlFeHByZXNzaW9ucyhyZXN1bHQuZXhwcmVzc2lvbikpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IG9uIF9BYm9ydER1ZVRvRXJyb3IgY2F0Y2ggKGUpIHsKICAgICAgZmluYWwgVXJpIHVyaSA9IGdldEZpbGVVcmkoZS5ub2RlKTsKICAgICAgZmluYWwgaW50IGZpbGVPZmZzZXQgPSBnZXRGaWxlT2Zmc2V0KHVyaSwgZS5ub2RlKTsKICAgICAgZmluYWwgTG9jYXRlZE1lc3NhZ2UgbG9jYXRlZE1lc3NhZ2VBY3R1YWxFcnJvciA9CiAgICAgICAgICBlLm1lc3NhZ2Uud2l0aExvY2F0aW9uKHVyaSwgZmlsZU9mZnNldCwgbm9MZW5ndGgpOwoKICAgICAgZmluYWwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dE1lc3NhZ2VzID0gPExvY2F0ZWRNZXNzYWdlPlsKICAgICAgICBsb2NhdGVkTWVzc2FnZUFjdHVhbEVycm9yCiAgICAgIF07CiAgICAgIGlmIChlLmNvbnRleHQgIT0gbnVsbCkgY29udGV4dE1lc3NhZ2VzLmFkZEFsbChlLmNvbnRleHQpOwogICAgICBmb3IgKGZpbmFsIFRyZWVOb2RlIG5vZGUgaW4gY29udGV4dENoYWluKSB7CiAgICAgICAgaWYgKG5vZGUgPT0gZS5ub2RlKSBjb250aW51ZTsKICAgICAgICBmaW5hbCBVcmkgdXJpID0gZ2V0RmlsZVVyaShub2RlKTsKICAgICAgICBmaW5hbCBpbnQgZmlsZU9mZnNldCA9IGdldEZpbGVPZmZzZXQodXJpLCBub2RlKTsKICAgICAgICBjb250ZXh0TWVzc2FnZXMuYWRkKAogICAgICAgICAgICBtZXNzYWdlQ29uc3RFdmFsQ29udGV4dC53aXRoTG9jYXRpb24odXJpLCBmaWxlT2Zmc2V0LCBub0xlbmd0aCkpOwogICAgICB9CgogICAgICB7CiAgICAgICAgZmluYWwgVXJpIHVyaSA9IGdldEZpbGVVcmkobm9kZSk7CiAgICAgICAgZmluYWwgaW50IGZpbGVPZmZzZXQgPSBnZXRGaWxlT2Zmc2V0KHVyaSwgbm9kZSk7CiAgICAgICAgZmluYWwgTG9jYXRlZE1lc3NhZ2UgbG9jYXRlZE1lc3NhZ2UgPSBtZXNzYWdlQ29uc3RFdmFsU3RhcnRpbmdQb2ludAogICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgZmlsZU9mZnNldCwgbm9MZW5ndGgpOwogICAgICAgIGVycm9yUmVwb3J0ZXIucmVwb3J0KGxvY2F0ZWRNZXNzYWdlLCBjb250ZXh0TWVzc2FnZXMpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgVW5ldmFsdWF0ZWRDb25zdGFudChuZXcgSW52YWxpZEV4cHJlc3Npb24oZS5tZXNzYWdlLm1lc3NhZ2UpKTsKICAgIH0gb24gX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbiBjYXRjaCAoZSkgewogICAgICBJbnZhbGlkRXhwcmVzc2lvbiBpbnZhbGlkID0gbmV3IEludmFsaWRFeHByZXNzaW9uKGUubWVzc2FnZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICAgIGVycm9yUmVwb3J0ZXIucmVwb3J0SW52YWxpZEV4cHJlc3Npb24oaW52YWxpZCk7CiAgICAgIHJldHVybiBuZXcgVW5ldmFsdWF0ZWRDb25zdGFudChpbnZhbGlkKTsKICAgIH0KICB9CgogIC8vLyBSZXBvcnQgYW4gZXJyb3IgdGhhdCBoYXMgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uc3RhbnQgZXZhbHVhdGlvbi4KICBOdWxsIHJlcG9ydChUcmVlTm9kZSBub2RlLCBNZXNzYWdlIG1lc3NhZ2UsIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSkgewogICAgdGhyb3cgbmV3IF9BYm9ydER1ZVRvRXJyb3Iobm9kZSwgbWVzc2FnZSwgY29udGV4dDogY29udGV4dCk7CiAgfQoKICAvLy8gUmVwb3J0IGEgY29uc3RydWN0IHRoYXQgc2hvdWxkIG5vdCBvY2N1ciBpbnNpZGUgYSBwb3RlbnRpYWxseSBjb25zdGFudAogIC8vLyBleHByZXNzaW9uLiBJdCBpcyBhc3N1bWVkIHRoYXQgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICBOdWxsIHJlcG9ydEludmFsaWQoVHJlZU5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgIHRocm93IG5ldyBfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uKG5vZGUsIG1lc3NhZ2UpOwogIH0KCiAgLy8vIFByb2R1Y2UgYW4gdW5ldmFsdWF0ZWQgY29uc3RhbnQgbm9kZSBmb3IgYW4gZXhwcmVzc2lvbi4KICBDb25zdGFudCB1bmV2YWx1YXRlZChFeHByZXNzaW9uIG9yaWdpbmFsLCBFeHByZXNzaW9uIHJlcGxhY2VtZW50KSB7CiAgICByZXBsYWNlbWVudC5maWxlT2Zmc2V0ID0gb3JpZ2luYWwuZmlsZU9mZnNldDsKICAgIHJldHVybiBuZXcgVW5ldmFsdWF0ZWRDb25zdGFudCgKICAgICAgICBuZXcgRmlsZVVyaUV4cHJlc3Npb24ocmVwbGFjZW1lbnQsIGdldEZpbGVVcmkob3JpZ2luYWwpKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gb3JpZ2luYWwuZmlsZU9mZnNldCk7CiAgfQoKICBFeHByZXNzaW9uIHJlbW92ZVJlZHVuZGFudEZpbGVVcmlFeHByZXNzaW9ucyhFeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiBub2RlLmFjY2VwdChuZXcgUmVkdW5kYW50RmlsZVVyaUV4cHJlc3Npb25SZW1vdmVyKCkpIGFzIEV4cHJlc3Npb247CiAgfQoKICAvLy8gRXh0cmFjdCBhbiBleHByZXNzaW9uIGZyb20gYSAocG9zc2libHkgdW5ldmFsdWF0ZWQpIGNvbnN0YW50IHRvIGJlY29tZQogIC8vLyBwYXJ0IG9mIHRoZSBleHByZXNzaW9uIHRyZWUgb2YgYW5vdGhlciB1bmV2YWx1YXRlZCBjb25zdGFudC4KICAvLy8gTWFrZXMgc3VyZSBhIHBhcnRpY3VsYXIgZXhwcmVzc2lvbiBvY2N1cnMgb25seSBvbmNlIGluIHRoZSB0cmVlIGJ5CiAgLy8vIGNsb25pbmcgZnVydGhlciBpbnN0YW5jZXMuCiAgRXhwcmVzc2lvbiBleHRyYWN0KENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBjb25zdGFudC5hc0V4cHJlc3Npb24oKTsKICAgIGlmICghcmVwbGFjZW1lbnROb2Rlcy5hZGQoZXhwcmVzc2lvbikpIHsKICAgICAgZXhwcmVzc2lvbiA9IGNsb25lci5jbG9uZShleHByZXNzaW9uKTsKICAgICAgcmVwbGFjZW1lbnROb2Rlcy5hZGQoZXhwcmVzc2lvbik7CiAgICB9CiAgICByZXR1cm4gZXhwcmVzc2lvbjsKICB9CgogIC8vLyBFbnRlciBhIHJlZ2lvbiBvZiBsYXp5IGV2YWx1YXRpb24uIEFsbCBsZWFmIG5vZGVzIGFyZSBldmFsdWF0ZWQgbm9ybWFsbHkKICAvLy8gKHRvIGVuc3VyZSBpbmxpbmluZyBvZiByZWZlcmVuY2VkIGxvY2FsIHZhcmlhYmxlcyksIGJ1dCBjb21wb3NpdGUgbm9kZXMKICAvLy8gYWx3YXlzIHRyZWF0IHRoZWlyIGNoaWxkcmVuIGFzIHVuZXZhbHVhdGVkLCByZXN1bHRpbmcgaW4gYSBwYXJ0aWFsbHkKICAvLy8gZXZhbHVhdGVkIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBleHByZXNzaW9uIHRyZWUuCiAgLy8vIExhenkgZXZhbHVhdGlvbiBpcyB1c2VkIGZvciB0aGUgc3VidHJlZXMgb2YgbGF6eSBvcGVyYXRpb25zIHdpdGgKICAvLy8gdW5ldmFsdWF0ZWQgY29uZGl0aW9ucyB0byBlbnN1cmUgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCBmb3IgcHJvYmxlbXMKICAvLy8gaW4gdGhlIHN1YnRyZWUgYXMgbG9uZyBhcyB0aGUgc3VidHJlZSBpcyBwb3RlbnRpYWxseSBjb25zdGFudC4KICB2b2lkIGVudGVyTGF6eSgpID0+IGxhenlEZXB0aCsrOwoKICAvLy8gTGVhdmUgYSAocG9zc2libHkgbmVzdGVkKSByZWdpb24gb2YgbGF6eSBldmFsdWF0aW9uLgogIHZvaWQgbGVhdmVMYXp5KCkgPT4gbGF6eURlcHRoLS07CgogIENvbnN0YW50IGxvd2VyKENvbnN0YW50IG9yaWdpbmFsLCBDb25zdGFudCByZXBsYWNlbWVudCkgewogICAgaWYgKCFpZGVudGljYWwob3JpZ2luYWwsIHJlcGxhY2VtZW50KSkgewogICAgICBvcmlnaW5hbCA9IGNhbm9uaWNhbGl6ZShvcmlnaW5hbCk7CiAgICAgIHJlcGxhY2VtZW50ID0gY2Fub25pY2FsaXplKHJlcGxhY2VtZW50KTsKICAgICAgbG93ZXJlZFtyZXBsYWNlbWVudF0gPSBvcmlnaW5hbDsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgfQogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShyZXBsYWNlbWVudCk7CiAgfQoKICBDb25zdGFudCB1bmxvd2VyKENvbnN0YW50IGNvbnN0YW50KSB7CiAgICByZXR1cm4gbG93ZXJlZFtjb25zdGFudF0gPz8gY29uc3RhbnQ7CiAgfQoKICBDb25zdGFudCBsb3dlckxpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSByZXR1cm4gY29uc3RhbnQ7CiAgICByZXR1cm4gbG93ZXIoY29uc3RhbnQsIGJhY2tlbmQubG93ZXJMaXN0Q29uc3RhbnQoY29uc3RhbnQpKTsKICB9CgogIENvbnN0YW50IGxvd2VyU2V0Q29uc3RhbnQoU2V0Q29uc3RhbnQgY29uc3RhbnQpIHsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSByZXR1cm4gY29uc3RhbnQ7CiAgICByZXR1cm4gbG93ZXIoY29uc3RhbnQsIGJhY2tlbmQubG93ZXJTZXRDb25zdGFudChjb25zdGFudCkpOwogIH0KCiAgQ29uc3RhbnQgbG93ZXJNYXBDb25zdGFudChNYXBDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHJldHVybiBjb25zdGFudDsKICAgIHJldHVybiBsb3dlcihjb25zdGFudCwgYmFja2VuZC5sb3dlck1hcENvbnN0YW50KGNvbnN0YW50KSk7CiAgfQoKICAvLy8gRXZhbHVhdGUgW25vZGVdIGFuZCBwb3NzaWJseSBjYWNoZSB0aGUgZXZhbHVhdGlvbiByZXN1bHQuCiAgLy8vIEB0aHJvd3MgX0Fib3J0RHVlVG9FcnJvciBvciBfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uIGlmIGV4cHJlc3Npb24KICAvLy8gY2FuJ3QgYmUgZXZhbHVhdGVkLgogIENvbnN0YW50IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICBib29sIHdhc1VuZXZhbHVhdGVkID0gc2VlblVuZXZhbHVhdGVkQ2hpbGQ7CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IGZhbHNlOwogICAgQ29uc3RhbnQgcmVzdWx0OwogICAgaWYgKGVudi5pc0VtcHR5KSB7CiAgICAgIC8vIFdlIG9ubHkgdHJ5IHRvIGV2YWx1YXRlIHRoZSBzYW1lIFtub2RlXSAqb25jZSogd2l0aGluIGFuIGVtcHR5CiAgICAgIC8vIGVudmlyb25tZW50LgogICAgICBpZiAobm9kZUNhY2hlLmNvbnRhaW5zS2V5KG5vZGUpKSB7CiAgICAgICAgcmVzdWx0ID0gbm9kZUNhY2hlW25vZGVdID8/IHJlcG9ydChub2RlLCBtZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVDYWNoZVtub2RlXSA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9IG5vZGVDYWNoZVtub2RlXSA9IG5vZGUuYWNjZXB0KHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIG5vZGVDYWNoZS5yZW1vdmUobm9kZSk7CiAgICAgICAgICByZXRocm93OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbm9kZS5hY2NlcHQodGhpcyk7CiAgICB9CiAgICBzZWVuVW5ldmFsdWF0ZWRDaGlsZCA9IHdhc1VuZXZhbHVhdGVkIHx8IHJlc3VsdCBpcyBVbmV2YWx1YXRlZENvbnN0YW50OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIENvbnN0YW50IF9ldmFsdWF0ZU51bGxhYmxlU3ViZXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsQ29uc3RhbnQ7CiAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlKTsKICB9CgogIFQgcnVuSW5zaWRlQ29udGV4dDxUPihUcmVlTm9kZSBub2RlLCBUIGZ1bigpKSB7CiAgICB0cnkgewogICAgICBwdXNoQ29udGV4dChub2RlKTsKICAgICAgcmV0dXJuIGZ1bigpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcG9wQ29udGV4dChub2RlKTsKICAgIH0KICB9CgogIFQgcnVuSW5zaWRlQ29udGV4dElmTm9Db250ZXh0PFQ+KFRyZWVOb2RlIG5vZGUsIFQgZnVuKCkpIHsKICAgIGlmIChjb250ZXh0Q2hhaW4uaXNFbXB0eSkgewogICAgICByZXR1cm4gcnVuSW5zaWRlQ29udGV4dChub2RlLCBmdW4pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZ1bigpOwogICAgfQogIH0KCiAgdm9pZCBwdXNoQ29udGV4dChUcmVlTm9kZSBjb250ZXh0Tm9kZSkgewogICAgY29udGV4dENoYWluLmFkZChjb250ZXh0Tm9kZSk7CiAgfQoKICB2b2lkIHBvcENvbnRleHQoVHJlZU5vZGUgY29udGV4dE5vZGUpIHsKICAgIGFzc2VydChjb250ZXh0Q2hhaW4ubGFzdCA9PSBjb250ZXh0Tm9kZSk7CiAgICBjb250ZXh0Q2hhaW4ubGVuZ3RoID0gY29udGV4dENoYWluLmxlbmd0aCAtIDE7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCBkZWZhdWx0VHJlZU5vZGUoTm9kZSBub2RlKSB7CiAgICAvLyBPbmx5IGEgc3Vic2V0IG9mIHRoZSBleHByZXNzaW9uIGxhbmd1YWdlIGlzIHZhbGlkIGZvciBjb25zdGFudAogICAgLy8gZXZhbHVhdGlvbi4KICAgIHJldHVybiByZXBvcnRJbnZhbGlkKAogICAgICAgIG5vZGUsICdDb25zdGFudCBldmFsdWF0aW9uIGhhcyBubyBzdXBwb3J0IGZvciAke25vZGUucnVudGltZVR5cGV9IScpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRGaWxlVXJpRXhwcmVzc2lvbihGaWxlVXJpRXhwcmVzc2lvbiBub2RlKSB7CiAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXROdWxsTGl0ZXJhbChOdWxsTGl0ZXJhbCBub2RlKSA9PiBudWxsQ29uc3RhbnQ7CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQobm9kZS52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBub2RlKSB7CiAgICAvLyBUaGUgZnJvbnRlbmQgZW5zdXJlcyB0aGF0IGludGVnZXIgbGl0ZXJhbHMgYXJlIHZhbGlkIGFjY29yZGluZyB0byB0aGUKICAgIC8vIHRhcmdldCByZXByZXNlbnRhdGlvbi4KICAgIHJldHVybiBjYW5vbmljYWxpemUoaW50Rm9sZGVyLm1ha2VJbnRDb25zdGFudChub2RlLnZhbHVlLCB1bnNpZ25lZDogdHJ1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgRG91YmxlQ29uc3RhbnQobm9kZS52YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgU3RyaW5nQ29uc3RhbnQobm9kZS52YWx1ZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBub2RlKSB7CiAgICBmaW5hbCBEYXJ0VHlwZSB0eXBlID0gZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBjb252ZXJ0VHlwZShub2RlLnR5cGUpKTsKICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IFR5cGVMaXRlcmFsQ29uc3RhbnQodHlwZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgIENvbnN0YW50IGNvbnN0YW50ID0gbm9kZS5jb25zdGFudDsKICAgIENvbnN0YW50IHJlc3VsdCA9IGNvbnN0YW50OwogICAgaWYgKGNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgcmVzdWx0ID0gcnVuSW5zaWRlQ29udGV4dChjb25zdGFudC5leHByZXNzaW9uLCAoKSB7CiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oY29uc3RhbnQuZXhwcmVzc2lvbik7CiAgICAgIH0pOwogICAgfQogICAgLy8gSWYgdGhlcmUgd2VyZSBhbHJlYWR5IGNvbnN0YW50cyBpbiB0aGUgQVNUIHRoZW4gd2UgbWFrZSBzdXJlIHdlCiAgICAvLyByZS1jYW5vbmljYWxpemUgdGhlbS4gIEFmdGVyIHJ1bm5pbmcgdGhlIHRyYW5zZm9ybWVyIHdlIHdpbGwgdGhlcmVmb3JlCiAgICAvLyBoYXZlIGEgZnVsbHktY2Fub25pY2FsaXplZCBjb25zdGFudCBEQUcgd2l0aCByb290cyBjb21pbmcgZnJvbSB0aGUKICAgIC8vIFtDb25zdGFudEV4cHJlc3Npb25dIG5vZGVzIGluIHRoZSBBU1QuCiAgICByZXR1cm4gY2Fub25pY2FsaXplKHJlc3VsdCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdExpc3RMaXRlcmFsKExpc3RMaXRlcmFsIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICJOb24tY29uc3RhbnQgbGlzdCBsaXRlcmFsIik7CiAgICB9CiAgICBmaW5hbCBMaXN0Q29uc3RhbnRCdWlsZGVyIGJ1aWxkZXIgPQogICAgICAgIG5ldyBMaXN0Q29uc3RhbnRCdWlsZGVyKG5vZGUsIGNvbnZlcnRUeXBlKG5vZGUudHlwZUFyZ3VtZW50KSwgdGhpcyk7CiAgICBmb3IgKEV4cHJlc3Npb24gZWxlbWVudCBpbiBub2RlLmV4cHJlc3Npb25zKSB7CiAgICAgIGJ1aWxkZXIuYWRkKGVsZW1lbnQpOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0TGlzdENvbmNhdGVuYXRpb24oTGlzdENvbmNhdGVuYXRpb24gbm9kZSkgewogICAgZmluYWwgTGlzdENvbnN0YW50QnVpbGRlciBidWlsZGVyID0KICAgICAgICBuZXcgTGlzdENvbnN0YW50QnVpbGRlcihub2RlLCBjb252ZXJ0VHlwZShub2RlLnR5cGVBcmd1bWVudCksIHRoaXMpOwogICAgZm9yIChFeHByZXNzaW9uIGxpc3QgaW4gbm9kZS5saXN0cykgewogICAgICBidWlsZGVyLmFkZFNwcmVhZChsaXN0KTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBub2RlKSB7CiAgICBpZiAoIW5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCAiTm9uLWNvbnN0YW50IHNldCBsaXRlcmFsIik7CiAgICB9CiAgICBmaW5hbCBTZXRDb25zdGFudEJ1aWxkZXIgYnVpbGRlciA9CiAgICAgICAgbmV3IFNldENvbnN0YW50QnVpbGRlcihub2RlLCBjb252ZXJ0VHlwZShub2RlLnR5cGVBcmd1bWVudCksIHRoaXMpOwogICAgZm9yIChFeHByZXNzaW9uIGVsZW1lbnQgaW4gbm9kZS5leHByZXNzaW9ucykgewogICAgICBidWlsZGVyLmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdFNldENvbmNhdGVuYXRpb24oU2V0Q29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBmaW5hbCBTZXRDb25zdGFudEJ1aWxkZXIgYnVpbGRlciA9CiAgICAgICAgbmV3IFNldENvbnN0YW50QnVpbGRlcihub2RlLCBjb252ZXJ0VHlwZShub2RlLnR5cGVBcmd1bWVudCksIHRoaXMpOwogICAgZm9yIChFeHByZXNzaW9uIHNldF8gaW4gbm9kZS5zZXRzKSB7CiAgICAgIGJ1aWxkZXIuYWRkU3ByZWFkKHNldF8pOwogICAgfQogICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmICghbm9kZS5pc0NvbnN0KSB7CiAgICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICJOb24tY29uc3RhbnQgbWFwIGxpdGVyYWwiKTsKICAgIH0KICAgIGZpbmFsIE1hcENvbnN0YW50QnVpbGRlciBidWlsZGVyID0gbmV3IE1hcENvbnN0YW50QnVpbGRlcigKICAgICAgICBub2RlLCBjb252ZXJ0VHlwZShub2RlLmtleVR5cGUpLCBjb252ZXJ0VHlwZShub2RlLnZhbHVlVHlwZSksIHRoaXMpOwogICAgZm9yIChNYXBFbnRyeSBlbGVtZW50IGluIG5vZGUuZW50cmllcykgewogICAgICBidWlsZGVyLmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdE1hcENvbmNhdGVuYXRpb24oTWFwQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBmaW5hbCBNYXBDb25zdGFudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNYXBDb25zdGFudEJ1aWxkZXIoCiAgICAgICAgbm9kZSwgY29udmVydFR5cGUobm9kZS5rZXlUeXBlKSwgY29udmVydFR5cGUobm9kZS52YWx1ZVR5cGUpLCB0aGlzKTsKICAgIGZvciAoRXhwcmVzc2lvbiBtYXAgaW4gbm9kZS5tYXBzKSB7CiAgICAgIGJ1aWxkZXIuYWRkU3ByZWFkKG1hcCk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgIHJldHVybiByZXBvcnRJbnZhbGlkKG5vZGUsICJGdW5jdGlvbiBsaXRlcmFsIik7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgaWYgKCFub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgICBub2RlLCAnTm9uLWNvbnN0YW50IGNvbnN0cnVjdG9yIGludm9jYXRpb24gIiRub2RlIi4nKTsKICAgIH0KCiAgICBmaW5hbCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG5vZGUudGFyZ2V0OwogICAgY2hlY2tDb25zdHJ1Y3RvckNvbnN0KG5vZGUsIGNvbnN0cnVjdG9yKTsKCiAgICBmaW5hbCBDbGFzcyBrbGFzcyA9IGNvbnN0cnVjdG9yLmVuY2xvc2luZ0NsYXNzOwogICAgaWYgKGtsYXNzLmlzQWJzdHJhY3QpIHsKICAgICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgICBub2RlLCAnQ29uc3RydWN0b3IgIiRub2RlIiBiZWxvbmdzIHRvIGFic3RyYWN0IGNsYXNzICIke2tsYXNzfSIuJyk7CiAgICB9CgogICAgZmluYWwgTGlzdDxDb25zdGFudD4gcG9zaXRpb25hbHMgPQogICAgICAgIGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cyk7CiAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb25zdGFudD4gbmFtZWQgPSBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKTsKCiAgICBib29sIGlzU3ltYm9sID0ga2xhc3MgPT0gY29yZVR5cGVzLmludGVybmFsU3ltYm9sQ2xhc3M7CiAgICBpZiAoaXNTeW1ib2wgJiYgc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbihjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICB1bmV2YWx1YXRlZEFyZ3VtZW50cyhwb3NpdGlvbmFscywgbmFtZWQsIG5vZGUuYXJndW1lbnRzLnR5cGVzKSwKICAgICAgICAgICAgICBpc0NvbnN0OiB0cnVlKSk7CiAgICB9CgogICAgLy8gU3BlY2lhbCBjYXNlIHRoZSBkYXJ0OmNvcmUncyBTeW1ib2wgY2xhc3MgaGVyZSBhbmQgY29udmVydCBpdCB0byBhCiAgICAvLyBbU3ltYm9sQ29uc3RhbnRdLiAgRm9yIGludmFsaWQgdmFsdWVzIHdlIHJlcG9ydCBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAgIGlmIChpc1N5bWJvbCkgewogICAgICBmaW5hbCBDb25zdGFudCBuYW1lVmFsdWUgPSBwb3NpdGlvbmFscy5zaW5nbGU7CgogICAgICBpZiAobmFtZVZhbHVlIGlzIFN0cmluZ0NvbnN0YW50ICYmIGlzVmFsaWRTeW1ib2xOYW1lKG5hbWVWYWx1ZS52YWx1ZSkpIHsKICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBTeW1ib2xDb25zdGFudChuYW1lVmFsdWUudmFsdWUsIG51bGwpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgbm9kZS5hcmd1bWVudHMucG9zaXRpb25hbC5maXJzdCwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICBuYW1lVmFsdWUsIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpKTsKICAgIH0KCiAgICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzID0KICAgICAgICBjb252ZXJ0VHlwZXMoZXZhbHVhdGVUeXBlQXJndW1lbnRzKG5vZGUsIG5vZGUuYXJndW1lbnRzKSk7CgogICAgLy8gRmlsbCBpbiBhbnkgbWlzc2luZyB0eXBlIGFyZ3VtZW50cyB3aXRoICJkeW5hbWljIi4KICAgIGZvciAoaW50IGkgPSB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSA8IGtsYXNzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHR5cGVBcmd1bWVudHMuYWRkKGNvbnN0IER5bmFtaWNUeXBlKCkpOwogICAgfQoKICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGluc3RhbmNlLgogICAgcmV0dXJuIHdpdGhOZXdJbnN0YW5jZUJ1aWxkZXIoa2xhc3MsIHR5cGVBcmd1bWVudHMsICgpIHsKICAgICAgcmV0dXJuIHJ1bkluc2lkZUNvbnRleHRJZk5vQ29udGV4dChub2RlLCAoKSB7CiAgICAgICAgLy8gIlJ1biIgdGhlIGNvbnN0cnVjdG9yIChhbmQgYW55IHN1cGVyIGNvbnN0cnVjdG9yIGNhbGxzKSwgd2hpY2ggd2lsbAogICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbmV3IGluc3RhbmNlLgogICAgICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgICBlbnRlckxhenkoKTsKICAgICAgICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgdHlwZUFyZ3VtZW50cywgcG9zaXRpb25hbHMsIG5hbWVkKTsKICAgICAgICAgIGxlYXZlTGF6eSgpOwogICAgICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIGluc3RhbmNlQnVpbGRlci5idWlsZFVuZXZhbHVhdGVkSW5zdGFuY2UoKSk7CiAgICAgICAgfQogICAgICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgY29uc3RydWN0b3IsIHR5cGVBcmd1bWVudHMsIHBvc2l0aW9uYWxzLCBuYW1lZCk7CiAgICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLCBpbnN0YW5jZUJ1aWxkZXIuYnVpbGRVbmV2YWx1YXRlZEluc3RhbmNlKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKGluc3RhbmNlQnVpbGRlci5idWlsZEluc3RhbmNlKCkpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgdm9pZCBjaGVja0NvbnN0cnVjdG9yQ29uc3QoVHJlZU5vZGUgbm9kZSwgQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHsKICAgIGlmICghY29uc3RydWN0b3IuaXNDb25zdCkgewogICAgICByZXBvcnRJbnZhbGlkKG5vZGUsICdOb24tY29uc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbi4nKTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5ICE9IG51bGwgJiYKICAgICAgICBjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5IGlzISBFbXB0eVN0YXRlbWVudCkgewogICAgICByZXBvcnRJbnZhbGlkKAogICAgICAgICAgbm9kZSwKICAgICAgICAgICdDb25zdHJ1Y3RvciAiJG5vZGUiIGhhcyBub24tdHJpdmlhbCBib2R5ICcKICAgICAgICAgICciJHtjb25zdHJ1Y3Rvci5mdW5jdGlvbi5ib2R5LnJ1bnRpbWVUeXBlfSIuJyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdEluc3RhbmNlQ3JlYXRpb24oSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CiAgICByZXR1cm4gd2l0aE5ld0luc3RhbmNlQnVpbGRlcigKICAgICAgICBub2RlLmNsYXNzTm9kZSwgY29udmVydFR5cGVzKG5vZGUudHlwZUFyZ3VtZW50cyksICgpIHsKICAgICAgZm9yIChBc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50IGluIG5vZGUuYXNzZXJ0cykgewogICAgICAgIGNoZWNrQXNzZXJ0KHN0YXRlbWVudCk7CiAgICAgIH0KICAgICAgbm9kZS5maWVsZFZhbHVlcy5mb3JFYWNoKChSZWZlcmVuY2UgZmllbGRSZWYsIEV4cHJlc3Npb24gdmFsdWUpIHsKICAgICAgICBpbnN0YW5jZUJ1aWxkZXIuc2V0RmllbGRWYWx1ZSgKICAgICAgICAgICAgZmllbGRSZWYuYXNGaWVsZCwgX2V2YWx1YXRlU3ViZXhwcmVzc2lvbih2YWx1ZSkpOwogICAgICB9KTsKICAgICAgbm9kZS51bnVzZWRBcmd1bWVudHMuZm9yRWFjaCgoRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgICAgIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbih2YWx1ZSk7CiAgICAgICAgaWYgKGNvbnN0YW50IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgICAgIGluc3RhbmNlQnVpbGRlci51bnVzZWRBcmd1bWVudHMuYWRkKGV4dHJhY3QoY29uc3RhbnQpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLCBpbnN0YW5jZUJ1aWxkZXIuYnVpbGRVbmV2YWx1YXRlZEluc3RhbmNlKCkpOwogICAgICB9CiAgICAgIHJldHVybiBjYW5vbmljYWxpemUoaW5zdGFuY2VCdWlsZGVyLmJ1aWxkSW5zdGFuY2UoKSk7CiAgICB9KTsKICB9CgogIGJvb2wgaXNWYWxpZFN5bWJvbE5hbWUoU3RyaW5nIG5hbWUpIHsKICAgIC8vIFNlZSBodHRwczovL2FwaS5kYXJ0bGFuZy5vcmcvc3RhYmxlLzIuMC4wL2RhcnQtY29yZS9TeW1ib2wvU3ltYm9sLmh0bWw6CiAgICAvLwogICAgLy8gIEEgcXVhbGlmaWVkIG5hbWUgaXMgYSB2YWxpZCBuYW1lIHByZWNlZGVkIGJ5IGEgcHVibGljIGlkZW50aWZpZXIgbmFtZQogICAgLy8gIGFuZCBhICcuJywgZS5nLiwgZm9vLmJhci5iYXo9IGlzIGEgcXVhbGlmaWVkIHZlcnNpb24gb2YgYmF6PS4KICAgIC8vCiAgICAvLyAgVGhhdCBtZWFucyB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBuYW1lIFN0cmluZyBtdXN0IGJlIGVpdGhlcgogICAgLy8gICAgIC0gYSB2YWxpZCBwdWJsaWMgRGFydCBpZGVudGlmaWVyICh0aGF0IGlzLCBhbiBpZGVudGlmaWVyIG5vdAogICAgLy8gICAgICAgc3RhcnRpbmcgd2l0aCAiXyIpLAogICAgLy8gICAgIC0gc3VjaCBhbiBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICI9IiAoYSBzZXR0ZXIgbmFtZSksCiAgICAvLyAgICAgLSB0aGUgbmFtZSBvZiBhIGRlY2xhcmFibGUgb3BlcmF0b3IsCiAgICAvLyAgICAgLSBhbnkgb2YgdGhlIGFib3ZlIHByZWNlZGVkIGJ5IGFueSBudW1iZXIgb2YgcXVhbGlmaWVycywgd2hlcmUgYQogICAgLy8gICAgICAgcXVhbGlmaWVyIGlzIGEgbm9uLXByaXZhdGUgaWRlbnRpZmllciBmb2xsb3dlZCBieSAnLicsCiAgICAvLyAgICAgLSBvciB0aGUgZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCBuYW1lIG9mIGEgbGlicmFyeSB3aXRoIG5vIGxpYnJhcnkKICAgIC8vICAgICAgIG5hbWUgZGVjbGFyYXRpb24pLgoKICAgIGNvbnN0IExpc3Q8U3RyaW5nPiBvcGVyYXRvck5hbWVzID0gY29uc3QgPFN0cmluZz5bCiAgICAgICcrJywKICAgICAgJy0nLAogICAgICAnKicsCiAgICAgICcvJywKICAgICAgJyUnLAogICAgICAnfi8nLAogICAgICAnJicsCiAgICAgICd8JywKICAgICAgJ14nLAogICAgICAnficsCiAgICAgICc8PCcsCiAgICAgICc+PicsCiAgICAgICc+Pj4nLAogICAgICAnPCcsCiAgICAgICc8PScsCiAgICAgICc+JywKICAgICAgJz49JywKICAgICAgJz09JywKICAgICAgJ1tdJywKICAgICAgJ1tdPScsCiAgICAgICd1bmFyeS0nCiAgICBdOwoKICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIGlmIChuYW1lID09ICcnKSByZXR1cm4gdHJ1ZTsKCiAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CgogICAgLy8gRWFjaCBxdWFsaWZpZXIgbXVzdCBiZSBhIHB1YmxpYyBpZGVudGlmaWVyLgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyArK2kpIHsKICAgICAgaWYgKCFpc1ZhbGlkUHVibGljSWRlbnRpZmllcihwYXJ0c1tpXSkpIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBTdHJpbmcgbGFzdCA9IHBhcnRzLmxhc3Q7CiAgICBpZiAob3BlcmF0b3JOYW1lcy5jb250YWlucyhsYXN0KSkgewogICAgICByZXR1cm4gZW5hYmxlVHJpcGxlU2hpZnQgfHwgbGFzdCAhPSAnPj4+JzsKICAgIH0KICAgIGlmIChsYXN0LmVuZHNXaXRoKCc9JykpIHsKICAgICAgbGFzdCA9IGxhc3Quc3Vic3RyaW5nKDAsIGxhc3QubGVuZ3RoIC0gMSk7CiAgICB9CiAgICBpZiAoIWlzVmFsaWRQdWJsaWNJZGVudGlmaWVyKGxhc3QpKSByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8gRnJvbSB0aGUgRGFydCBMYW5ndWFnZSBzcGVjaWZpY2F0aW9uOgogIC8vLwogIC8vLyAgIElERU5USUZJRVI6CiAgLy8vICAgICBJREVOVElGSUVSX1NUQVJUIElERU5USUZJRVJfUEFSVCoKICAvLy8KICAvLy8gICBJREVOVElGSUVSX1NUQVJUOgogIC8vLyAgICAgICBJREVOVElGSUVSX1NUQVJUX05PX0RPTExBUiB8IOKAmCTigJkKICAvLy8KICAvLy8gICBJREVOVElGSUVSX1BBUlQ6CiAgLy8vICAgICAgIElERU5USUZJRVJfU1RBUlQgfCBESUdJVAogIC8vLwogIC8vLyAgIElERU5USUZJRVJfTk9fRE9MTEFSOgogIC8vLyAgICAgSURFTlRJRklFUl9TVEFSVF9OT19ET0xMQVIgSURFTlRJRklFUl9QQVJUX05PX0RPTExBUioKICAvLy8KICAvLy8gICBJREVOVElGSUVSX1NUQVJUX05PX0RPTExBUjoKICAvLy8gICAgICAgTEVUVEVSIHwgJ18nCiAgLy8vCiAgLy8vICAgSURFTlRJRklFUl9QQVJUX05PX0RPTExBUjoKICAvLy8gICAgICAgSURFTlRJRklFUl9TVEFSVF9OT19ET0xMQVIgfCBESUdJVAogIC8vLwogIHN0YXRpYyBmaW5hbCBSZWdFeHAgcHVibGljSWRlbnRpZmllclJlZ0V4cCA9CiAgICAgIG5ldyBSZWdFeHAocideW2EtekEtWiRdW2EtekEtWjAtOV8kXSokJyk7CgogIHN0YXRpYyBjb25zdCBMaXN0PFN0cmluZz4gbm9uVXNhYmxlS2V5d29yZHMgPSBjb25zdCA8U3RyaW5nPlsKICAgICdhc3NlcnQnLAogICAgJ2JyZWFrJywKICAgICdjYXNlJywKICAgICdjYXRjaCcsCiAgICAnY2xhc3MnLAogICAgJ2NvbnN0JywKICAgICdjb250aW51ZScsCiAgICAnZGVmYXVsdCcsCiAgICAnZG8nLAogICAgJ2Vsc2UnLAogICAgJ2VudW0nLAogICAgJ2V4dGVuZHMnLAogICAgJ2ZhbHNlJywKICAgICdmaW5hbCcsCiAgICAnZmluYWxseScsCiAgICAnZm9yJywKICAgICdpZicsCiAgICAnaW4nLAogICAgJ2lzJywKICAgICduZXcnLAogICAgJ251bGwnLAogICAgJ3JldGhyb3cnLAogICAgJ3JldHVybicsCiAgICAnc3VwZXInLAogICAgJ3N3aXRjaCcsCiAgICAndGhpcycsCiAgICAndGhyb3cnLAogICAgJ3RydWUnLAogICAgJ3RyeScsCiAgICAndmFyJywKICAgICd3aGlsZScsCiAgICAnd2l0aCcsCiAgXTsKCiAgYm9vbCBpc1ZhbGlkUHVibGljSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIHB1YmxpY0lkZW50aWZpZXJSZWdFeHAuaGFzTWF0Y2gobmFtZSkgJiYKICAgICAgICAhbm9uVXNhYmxlS2V5d29yZHMuY29udGFpbnMobmFtZSk7CiAgfQoKICB2b2lkIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IsCiAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsCiAgICAgIExpc3Q8Q29uc3RhbnQ+IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIE1hcDxTdHJpbmcsIENvbnN0YW50PiBuYW1lZEFyZ3VtZW50cykgewogICAgcmV0dXJuIHJ1bkluc2lkZUNvbnRleHQoY29uc3RydWN0b3IsICgpIHsKICAgICAgcmV0dXJuIHdpdGhOZXdFbnZpcm9ubWVudCgoKSB7CiAgICAgICAgZmluYWwgQ2xhc3Mga2xhc3MgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdDbGFzczsKICAgICAgICBmaW5hbCBGdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBjb25zdHJ1Y3Rvci5mdW5jdGlvbjsKCiAgICAgICAgLy8gV2Ugc2ltdWxhdGUgbm93IHRoZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLgoKICAgICAgICAvLyBTdGVwIDEpIE1hcCB0eXBlIGFyZ3VtZW50cyBhbmQgbm9ybWFsIGFyZ3VtZW50cyBmcm9tIGNhbGxlciB0bwogICAgICAgIC8vICAgICAgICAgY2FsbGVlLgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2xhc3MudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGVudi5hZGRUeXBlUGFyYW1ldGVyVmFsdWUoa2xhc3MudHlwZVBhcmFtZXRlcnNbaV0sIHR5cGVBcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9CiAgICAgICAgICAgICAgZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgICBmaW5hbCBDb25zdGFudCB2YWx1ZSA9IChpIDwgcG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGgpCiAgICAgICAgICAgICAgPyBwb3NpdGlvbmFsQXJndW1lbnRzW2ldCiAgICAgICAgICAgICAgOiBfZXZhbHVhdGVOdWxsYWJsZVN1YmV4cHJlc3Npb24ocGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGVudi5hZGRWYXJpYWJsZVZhbHVlKHBhcmFtZXRlciwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBmb3IgKGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIGluIGZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVycykgewogICAgICAgICAgZmluYWwgQ29uc3RhbnQgdmFsdWUgPSBuYW1lZEFyZ3VtZW50c1twYXJhbWV0ZXIubmFtZV0gPz8KICAgICAgICAgICAgICBfZXZhbHVhdGVOdWxsYWJsZVN1YmV4cHJlc3Npb24ocGFyYW1ldGVyLmluaXRpYWxpemVyKTsKICAgICAgICAgIGVudi5hZGRWYXJpYWJsZVZhbHVlKHBhcmFtZXRlciwgdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gU3RlcCAyKSBSdW4gYWxsIGluaXRpYWxpemVycyAoaW5jbHVkaW5nIHN1cGVyIGNhbGxzKSB3aXRoIGVudmlyb25tZW50CiAgICAgICAgLy8gICAgICAgICBzZXR1cC4KICAgICAgICBmb3IgKGZpbmFsIEZpZWxkIGZpZWxkIGluIGtsYXNzLmZpZWxkcykgewogICAgICAgICAgaWYgKCFmaWVsZC5pc1N0YXRpYykgewogICAgICAgICAgICBpbnN0YW5jZUJ1aWxkZXIuc2V0RmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgIGZpZWxkLCBfZXZhbHVhdGVOdWxsYWJsZVN1YmV4cHJlc3Npb24oZmllbGQuaW5pdGlhbGl6ZXIpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChmaW5hbCBJbml0aWFsaXplciBpbml0IGluIGNvbnN0cnVjdG9yLmluaXRpYWxpemVycykgewogICAgICAgICAgaWYgKGluaXQgaXMgRmllbGRJbml0aWFsaXplcikgewogICAgICAgICAgICBpbnN0YW5jZUJ1aWxkZXIuc2V0RmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgIGluaXQuZmllbGQsIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oaW5pdC52YWx1ZSkpOwogICAgICAgICAgfSBlbHNlIGlmIChpbml0IGlzIExvY2FsSW5pdGlhbGl6ZXIpIHsKICAgICAgICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IGluaXQudmFyaWFibGU7CiAgICAgICAgICAgIGVudi5hZGRWYXJpYWJsZVZhbHVlKAogICAgICAgICAgICAgICAgdmFyaWFibGUsIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24odmFyaWFibGUuaW5pdGlhbGl6ZXIpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdCBpcyBTdXBlckluaXRpYWxpemVyKSB7CiAgICAgICAgICAgIGNoZWNrQ29uc3RydWN0b3JDb25zdChpbml0LCBjb25zdHJ1Y3Rvcik7CiAgICAgICAgICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICAgIGluaXQudGFyZ2V0LAogICAgICAgICAgICAgICAgZXZhbHVhdGVTdXBlclR5cGVBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgaW5pdCwgY29uc3RydWN0b3IuZW5jbG9zaW5nQ2xhc3Muc3VwZXJ0eXBlKSwKICAgICAgICAgICAgICAgIGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhpbml0LmFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKGluaXQuYXJndW1lbnRzKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGluaXQgaXMgUmVkaXJlY3RpbmdJbml0aWFsaXplcikgewogICAgICAgICAgICAvLyBTaW5jZSBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIHRhcmdldHMgYSBjb25zdHJ1Y3RvciBvZiB0aGUgc2FtZQogICAgICAgICAgICAvLyBjbGFzcywgd2UgcGFzcyB0aGUgc2FtZSBbdHlwZUFyZ3VtZW50c10uCiAgICAgICAgICAgIGNoZWNrQ29uc3RydWN0b3JDb25zdChpbml0LCBjb25zdHJ1Y3Rvcik7CiAgICAgICAgICAgIGhhbmRsZUNvbnN0cnVjdG9ySW52b2NhdGlvbigKICAgICAgICAgICAgICAgIGluaXQudGFyZ2V0LAogICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cywKICAgICAgICAgICAgICAgIGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhpbml0LmFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKGluaXQuYXJndW1lbnRzKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGluaXQgaXMgQXNzZXJ0SW5pdGlhbGl6ZXIpIHsKICAgICAgICAgICAgY2hlY2tBc3NlcnQoaW5pdC5zdGF0ZW1lbnQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICdObyBzdXBwb3J0IGZvciBoYW5kbGluZyBpbml0aWFsaXplciBvZiB0eXBlICcKICAgICAgICAgICAgICAgICciJHtpbml0LnJ1bnRpbWVUeXBlfSIuJyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKFVuZXZhbHVhdGVkQ29uc3RhbnQgY29uc3RhbnQgaW4gZW52LnVuZXZhbHVhdGVkVW5yZWFkQ29uc3RhbnRzKSB7CiAgICAgICAgICBpbnN0YW5jZUJ1aWxkZXIudW51c2VkQXJndW1lbnRzLmFkZChleHRyYWN0KGNvbnN0YW50KSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0KCiAgdm9pZCBjaGVja0Fzc2VydChBc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25kaXRpb24gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHN0YXRlbWVudC5jb25kaXRpb24pOwoKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIEV4cHJlc3Npb24gbWVzc2FnZSA9IG51bGw7CiAgICAgIGlmIChzdGF0ZW1lbnQubWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICAgZW50ZXJMYXp5KCk7CiAgICAgICAgbWVzc2FnZSA9IGV4dHJhY3QoX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihzdGF0ZW1lbnQubWVzc2FnZSkpOwogICAgICAgIGxlYXZlTGF6eSgpOwogICAgICB9CiAgICAgIGluc3RhbmNlQnVpbGRlci5hc3NlcnRzLmFkZChuZXcgQXNzZXJ0U3RhdGVtZW50KGV4dHJhY3QoY29uZGl0aW9uKSwKICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgICBjb25kaXRpb25TdGFydE9mZnNldDogc3RhdGVtZW50LmNvbmRpdGlvblN0YXJ0T2Zmc2V0LAogICAgICAgICAgY29uZGl0aW9uRW5kT2Zmc2V0OiBzdGF0ZW1lbnQuY29uZGl0aW9uRW5kT2Zmc2V0KSk7CiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbiBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgaWYgKCFjb25kaXRpb24udmFsdWUpIHsKICAgICAgICBpZiAoc3RhdGVtZW50Lm1lc3NhZ2UgPT0gbnVsbCkgewogICAgICAgICAgcmVwb3J0KHN0YXRlbWVudC5jb25kaXRpb24sIG1lc3NhZ2VDb25zdEV2YWxGYWlsZWRBc3NlcnRpb24pOwogICAgICAgIH0KICAgICAgICBmaW5hbCBDb25zdGFudCBtZXNzYWdlID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihzdGF0ZW1lbnQubWVzc2FnZSk7CiAgICAgICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgICAgIGluc3RhbmNlQnVpbGRlci5hc3NlcnRzLmFkZChuZXcgQXNzZXJ0U3RhdGVtZW50KGV4dHJhY3QoY29uZGl0aW9uKSwKICAgICAgICAgICAgICBtZXNzYWdlOiBleHRyYWN0KG1lc3NhZ2UpLAogICAgICAgICAgICAgIGNvbmRpdGlvblN0YXJ0T2Zmc2V0OiBzdGF0ZW1lbnQuY29uZGl0aW9uU3RhcnRPZmZzZXQsCiAgICAgICAgICAgICAgY29uZGl0aW9uRW5kT2Zmc2V0OiBzdGF0ZW1lbnQuY29uZGl0aW9uRW5kT2Zmc2V0KSk7CiAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICByZXBvcnQoCiAgICAgICAgICAgICAgc3RhdGVtZW50LmNvbmRpdGlvbiwKICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG1lc3NhZ2UudmFsdWUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0KAogICAgICAgICAgICAgIHN0YXRlbWVudC5tZXNzYWdlLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5zdHJpbmdMZWdhY3lSYXdUeXBlLAogICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFR5cGUoX3N0YXRpY1R5cGVDb250ZXh0KSwKICAgICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0KAogICAgICAgICAgc3RhdGVtZW50LmNvbmRpdGlvbiwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICBjb25kaXRpb24sCiAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5ib29sTGVnYWN5UmF3VHlwZSwKICAgICAgICAgICAgICBjb25kaXRpb24uZ2V0VHlwZShfc3RhdGljVHlwZUNvbnRleHQpLAogICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewogICAgcmV0dXJuIHJlcG9ydEludmFsaWQobm9kZSwgbm9kZS5tZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0TWV0aG9kSW52b2NhdGlvbihNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKICAgIC8vIFdlIGhhdmUgbm8gc3VwcG9ydCBmb3IgZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbiBhdG0uCiAgICBhc3NlcnQobm9kZS5hcmd1bWVudHMubmFtZWQuaXNFbXB0eSk7CgogICAgZmluYWwgQ29uc3RhbnQgcmVjZWl2ZXIgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUucmVjZWl2ZXIpOwogICAgZmluYWwgTGlzdDxDb25zdGFudD4gYXJndW1lbnRzID0KICAgICAgICBldmFsdWF0ZVBvc2l0aW9uYWxBcmd1bWVudHMobm9kZS5hcmd1bWVudHMpOwoKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBuZXcgTWV0aG9kSW52b2NhdGlvbihleHRyYWN0KHJlY2VpdmVyKSwgbm9kZS5uYW1lLAogICAgICAgICAgICAgIHVuZXZhbHVhdGVkQXJndW1lbnRzKGFyZ3VtZW50cywge30sIG5vZGUuYXJndW1lbnRzLnR5cGVzKSkpOwogICAgfQoKICAgIGZpbmFsIFN0cmluZyBvcCA9IG5vZGUubmFtZS5uYW1lOwoKICAgIC8vIEhhbmRsZSA9PSBhbmQgIT0gZmlyc3QgKGl0J3MgY29tbW9uIGJldHdlZW4gYWxsIHR5cGVzKS4gU2luY2UgYGEgIT0gYmAgaXMKICAgIC8vIHBhcnNlZCBhcyBgIShhID09IGIpYCBpdCBpcyBoYW5kbGVkIGltcGxpY2l0bHkgdGhyb3VnaCA9PS4KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEgJiYgb3AgPT0gJz09JykgewogICAgICBmaW5hbCBDb25zdGFudCByaWdodCA9IGFyZ3VtZW50c1swXTsKCiAgICAgIGlmIChyZWNlaXZlciBpcyBOdWxsQ29uc3RhbnQgfHwKICAgICAgICAgIHJlY2VpdmVyIGlzIEJvb2xDb25zdGFudCB8fAogICAgICAgICAgcmVjZWl2ZXIgaXMgSW50Q29uc3RhbnQgfHwKICAgICAgICAgIHJlY2VpdmVyIGlzIERvdWJsZUNvbnN0YW50IHx8CiAgICAgICAgICByZWNlaXZlciBpcyBTdHJpbmdDb25zdGFudCB8fAogICAgICAgICAgcmlnaHQgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgICAgLy8gW0RvdWJsZUNvbnN0YW50XSB1c2VzIFtpZGVudGljYWxdIHRvIGRldGVybWluZSBlcXVhbGl0eSwgc28gd2UgbmVlZAogICAgICAgIC8vIHRvIHRha2UgdGhlIHNwZWNpYWwgY2FzZXMgaW50byBhY2NvdW50LgogICAgICAgIHJldHVybiBkb3VibGVTcGVjaWFsQ2FzZXMocmVjZWl2ZXIsIHJpZ2h0KSA/PwogICAgICAgICAgICBtYWtlQm9vbENvbnN0YW50KHJlY2VpdmVyID09IHJpZ2h0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZS53aXRoQXJndW1lbnRzKHJlY2VpdmVyLAogICAgICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0VHlwZShfc3RhdGljVHlwZUNvbnRleHQpLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGlzIGlzIGEgd2hpdGUtbGlzdGVkIHNldCBvZiBtZXRob2RzIHdlIG5lZWQgdG8gc3VwcG9ydCBvbiBjb25zdGFudHMuCiAgICBpZiAocmVjZWl2ZXIgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICBmaW5hbCBDb25zdGFudCBvdGhlciA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgaWYgKG90aGVyIGlzIFN0cmluZ0NvbnN0YW50KSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0NvbnN0YW50KHJlY2VpdmVyLnZhbHVlICsgb3RoZXIudmFsdWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgICAgJysnLAogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLAogICAgICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuc3RyaW5nTGVnYWN5UmF3VHlwZSwKICAgICAgICAgICAgICAgICAgICBvdGhlci5nZXRUeXBlKF9zdGF0aWNUeXBlQ29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChpbnRGb2xkZXIuaXNJbnQocmVjZWl2ZXIpKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKGludEZvbGRlci5mb2xkVW5hcnlPcGVyYXRvcihub2RlLCBvcCwgcmVjZWl2ZXIpKTsKICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmaW5hbCBDb25zdGFudCBvdGhlciA9IGFyZ3VtZW50c1swXTsKICAgICAgICBpZiAoaW50Rm9sZGVyLmlzSW50KG90aGVyKSkgewogICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgICBpbnRGb2xkZXIuZm9sZEJpbmFyeU9wZXJhdG9yKG5vZGUsIG9wLCByZWNlaXZlciwgb3RoZXIpKTsKICAgICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgICAgICBpZiAoKG9wID09ICd8JyB8fCBvcCA9PSAnJicgfHwgb3AgPT0gJ14nKSB8fAogICAgICAgICAgICAgIChvcCA9PSAnPDwnIHx8IG9wID09ICc+PicgfHwgb3AgPT0gJz4+PicpKSB7CiAgICAgICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGUud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAgICAgICBvcCwKICAgICAgICAgICAgICAgICAgICBvdGhlciwKICAgICAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmludExlZ2FjeVJhd1R5cGUsCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuZ2V0VHlwZShfc3RhdGljVHlwZUNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpKTsKICAgICAgICAgIH0KICAgICAgICAgIG51bSByZWNlaXZlclZhbHVlID0gKHJlY2VpdmVyIGFzIFByaW1pdGl2ZUNvbnN0YW50PG51bT4pLnZhbHVlOwogICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24oCiAgICAgICAgICAgICAgb3AsIHJlY2VpdmVyVmFsdWUsIG90aGVyLnZhbHVlLCBub2RlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBvcCwKICAgICAgICAgICAgICAgIHJlY2VpdmVyLAogICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5udW1MZWdhY3lSYXdUeXBlLAogICAgICAgICAgICAgICAgb3RoZXIuZ2V0VHlwZShfc3RhdGljVHlwZUNvbnRleHQpLAogICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIERvdWJsZUNvbnN0YW50KSB7CiAgICAgIGlmICgob3AgPT0gJ3wnIHx8IG9wID09ICcmJyB8fCBvcCA9PSAnXicpIHx8CiAgICAgICAgICAob3AgPT0gJzw8JyB8fCBvcCA9PSAnPj4nIHx8IG9wID09ICc+Pj4nKSkgewogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBvcCwKICAgICAgICAgICAgICAgIHJlY2VpdmVyLAogICAgICAgICAgICAgICAgdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5pbnRMZWdhY3lSYXdUeXBlLAogICAgICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0VHlwZShfc3RhdGljVHlwZUNvbnRleHQpLAogICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICB9CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICBjYXNlICd1bmFyeS0nOgogICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBEb3VibGVDb25zdGFudCgtcmVjZWl2ZXIudmFsdWUpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgZmluYWwgQ29uc3RhbnQgb3RoZXIgPSBhcmd1bWVudHNbMF07CgogICAgICAgIGlmIChvdGhlciBpcyBJbnRDb25zdGFudCB8fCBvdGhlciBpcyBEb3VibGVDb25zdGFudCkgewogICAgICAgICAgZmluYWwgbnVtIHZhbHVlID0gKG90aGVyIGFzIFByaW1pdGl2ZUNvbnN0YW50PG51bT4pLnZhbHVlOwogICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeU51bWVyaWNPcGVyYXRpb24ob3AsIHJlY2VpdmVyLnZhbHVlLCB2YWx1ZSwgbm9kZSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgb3AsCiAgICAgICAgICAgICAgICByZWNlaXZlciwKICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMubnVtTGVnYWN5UmF3VHlwZSwKICAgICAgICAgICAgICAgIG90aGVyLmdldFR5cGUoX3N0YXRpY1R5cGVDb250ZXh0KSwKICAgICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChyZWNlaXZlciBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgIGZpbmFsIENvbnN0YW50IG90aGVyID0gYXJndW1lbnRzWzBdOwogICAgICAgIGlmIChvdGhlciBpcyBCb29sQ29uc3RhbnQpIHsKICAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgICAgY2FzZSAnfCc6CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgICAgICAgbmV3IEJvb2xDb25zdGFudChyZWNlaXZlci52YWx1ZSB8fCBvdGhlci52YWx1ZSkpOwogICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKAogICAgICAgICAgICAgICAgICBuZXcgQm9vbENvbnN0YW50KHJlY2VpdmVyLnZhbHVlICYmIG90aGVyLnZhbHVlKSk7CiAgICAgICAgICAgIGNhc2UgJ14nOgogICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUoCiAgICAgICAgICAgICAgICAgIG5ldyBCb29sQ29uc3RhbnQocmVjZWl2ZXIudmFsdWUgIT0gb3RoZXIudmFsdWUpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVjZWl2ZXIgaXMgTnVsbENvbnN0YW50KSB7CiAgICAgIHJldHVybiByZXBvcnQobm9kZSwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICB9CgogICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICBub2RlLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb24ud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgb3AsIHJlY2VpdmVyLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uKExvZ2ljYWxFeHByZXNzaW9uIG5vZGUpIHsKICAgIGZpbmFsIENvbnN0YW50IGxlZnQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUubGVmdCk7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICBlbnRlckxhenkoKTsKICAgICAgQ29uc3RhbnQgcmlnaHQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUucmlnaHQpOwogICAgICBsZWF2ZUxhenkoKTsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsCiAgICAgICAgICBuZXcgTG9naWNhbEV4cHJlc3Npb24oZXh0cmFjdChsZWZ0KSwgbm9kZS5vcGVyYXRvciwgZXh0cmFjdChyaWdodCkpKTsKICAgIH0KICAgIHN3aXRjaCAobm9kZS5vcGVyYXRvcikgewogICAgICBjYXNlICd8fCc6CiAgICAgICAgaWYgKGxlZnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgICAgICBpZiAobGVmdC52YWx1ZSkgcmV0dXJuIHRydWVDb25zdGFudDsKCiAgICAgICAgICBmaW5hbCBDb25zdGFudCByaWdodCA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5yaWdodCk7CiAgICAgICAgICBpZiAocmlnaHQgaXMgQm9vbENvbnN0YW50IHx8IHJpZ2h0IGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHJpZ2h0OwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRCaW5hcnlPcGVyYW5kVHlwZS53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICBub2RlLm9wZXJhdG9yLAogICAgICAgICAgICAgICAgICBsZWZ0LAogICAgICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmJvb2xMZWdhY3lSYXdUeXBlLAogICAgICAgICAgICAgICAgICByaWdodC5nZXRUeXBlKF9zdGF0aWNUeXBlQ29udGV4dCksCiAgICAgICAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkTWV0aG9kSW52b2NhdGlvbi53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgbm9kZS5vcGVyYXRvciwgbGVmdCwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICBjYXNlICcmJic6CiAgICAgICAgaWYgKGxlZnQgaXMgQm9vbENvbnN0YW50KSB7CiAgICAgICAgICBpZiAoIWxlZnQudmFsdWUpIHJldHVybiBmYWxzZUNvbnN0YW50OwoKICAgICAgICAgIGZpbmFsIENvbnN0YW50IHJpZ2h0ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJpZ2h0KTsKICAgICAgICAgIGlmIChyaWdodCBpcyBCb29sQ29uc3RhbnQgfHwgcmlnaHQgaXMgVW5ldmFsdWF0ZWRDb25zdGFudCkgewogICAgICAgICAgICByZXR1cm4gcmlnaHQ7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICAgIG5vZGUub3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgIGxlZnQsCiAgICAgICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuYm9vbExlZ2FjeVJhd1R5cGUsCiAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldFR5cGUoX3N0YXRpY1R5cGVDb250ZXh0KSwKICAgICAgICAgICAgICAgICAgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBub2RlLm9wZXJhdG9yLCBsZWZ0LCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgICAgIGNhc2UgJz8/JzoKICAgICAgICByZXR1cm4gKGxlZnQgaXMhIE51bGxDb25zdGFudCkKICAgICAgICAgICAgPyBsZWZ0CiAgICAgICAgICAgIDogX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnJpZ2h0KTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBub2RlLm9wZXJhdG9yLCBsZWZ0LCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgZmluYWwgQ29uc3RhbnQgY29uZGl0aW9uID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLmNvbmRpdGlvbik7CiAgICBpZiAoY29uZGl0aW9uID09IHRydWVDb25zdGFudCkgewogICAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLnRoZW4pOwogICAgfSBlbHNlIGlmIChjb25kaXRpb24gPT0gZmFsc2VDb25zdGFudCkgewogICAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm90aGVyd2lzZSk7CiAgICB9IGVsc2UgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgZW50ZXJMYXp5KCk7CiAgICAgIENvbnN0YW50IHRoZW4gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUudGhlbik7CiAgICAgIENvbnN0YW50IG90aGVyd2lzZSA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5vdGhlcndpc2UpOwogICAgICBsZWF2ZUxhenkoKTsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oZXh0cmFjdChjb25kaXRpb24pLCBleHRyYWN0KHRoZW4pLAogICAgICAgICAgICAgIGV4dHJhY3Qob3RoZXJ3aXNlKSwgbm9kZS5zdGF0aWNUeXBlKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgbm9kZS5jb25kaXRpb24sCiAgICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgY29uZGl0aW9uLAogICAgICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuYm9vbExlZ2FjeVJhd1R5cGUsCiAgICAgICAgICAgICAgY29uZGl0aW9uLmdldFR5cGUoX3N0YXRpY1R5cGVDb250ZXh0KSwKICAgICAgICAgICAgICBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IG5vZGUpIHsKICAgIGlmIChub2RlLnJlY2VpdmVyIGlzIFRoaXNFeHByZXNzaW9uKSB7CiAgICAgIC8vIEFjY2VzcyAidGhpcyIgZHVyaW5nIGluc3RhbmNlIGNyZWF0aW9uLgogICAgICBpZiAoaW5zdGFuY2VCdWlsZGVyID09IG51bGwpIHsKICAgICAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCAnSW5zdGFuY2UgZmllbGQgYWNjZXNzIG91dHNpZGUgY29uc3RydWN0b3InKTsKICAgICAgfQogICAgICBmb3IgKGZpbmFsIEZpZWxkIGZpZWxkIGluIGluc3RhbmNlQnVpbGRlci5maWVsZHMua2V5cykgewogICAgICAgIGlmIChmaWVsZC5uYW1lID09IG5vZGUubmFtZSkgewogICAgICAgICAgcmV0dXJuIGluc3RhbmNlQnVpbGRlci5maWVsZHNbZmllbGRdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLAogICAgICAgICAgJ0NvdWxkIG5vdCBldmFsdWF0ZSBmaWVsZCBnZXQgJHtub2RlLm5hbWV9IG9uIGluY29tcGxldGUgaW5zdGFuY2UnKTsKICAgIH0KCiAgICBmaW5hbCBDb25zdGFudCByZWNlaXZlciA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5yZWNlaXZlcik7CiAgICBpZiAocmVjZWl2ZXIgaXMgU3RyaW5nQ29uc3RhbnQgJiYgbm9kZS5uYW1lLm5hbWUgPT0gJ2xlbmd0aCcpIHsKICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShpbnRGb2xkZXIubWFrZUludENvbnN0YW50KHJlY2VpdmVyLnZhbHVlLmxlbmd0aCkpOwogICAgfSBlbHNlIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZChub2RlLAogICAgICAgICAgbmV3IFByb3BlcnR5R2V0KGV4dHJhY3QocmVjZWl2ZXIpLCBub2RlLm5hbWUsIG5vZGUuaW50ZXJmYWNlVGFyZ2V0KSk7CiAgICB9IGVsc2UgaWYgKHJlY2VpdmVyIGlzIE51bGxDb25zdGFudCkgewogICAgICByZXR1cm4gcmVwb3J0KG5vZGUsIG1lc3NhZ2VDb25zdEV2YWxOdWxsVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHJlcG9ydCgKICAgICAgICBub2RlLAogICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFByb3BlcnR5R2V0LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIG5vZGUubmFtZS5uYW1lLCByZWNlaXZlciwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRMZXQoTGV0IG5vZGUpIHsKICAgIGVudi5hZGRWYXJpYWJsZVZhbHVlKAogICAgICAgIG5vZGUudmFyaWFibGUsIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS52YXJpYWJsZS5pbml0aWFsaXplcikpOwogICAgcmV0dXJuIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5ib2R5KTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgbm9kZSkgewogICAgLy8gTm90IGV2ZXJ5IHZhcmlhYmxlIHdoaWNoIGEgW1ZhcmlhYmxlR2V0XSByZWZlcnMgdG8gbXVzdCBiZSBtYXJrZWQgYXMKICAgIC8vIGNvbnN0YW50LiAgRm9yIGV4YW1wbGUgZnVuY3Rpb24gcGFyYW1ldGVycyBhcyB3ZWxsIGFzIGNvbnN0cnVjdHMKICAgIC8vIGRlc3VnYXJlZCB0byBbTGV0XSBleHByZXNzaW9ucyBhcmUgb2suCiAgICAvLwogICAgLy8gVE9ETyhrdXN0ZXJtYW5uKTogVGhlIGhldXJpc3RpYyBvZiBhbGxvd2luZyBhbGwgW1ZhcmlhYmxlR2V0XXMgb24gW0xldF0KICAgIC8vIHZhcmlhYmxlcyBtaWdodCBhbGxvdyBtb3JlIHRoYW4gaXQgc2hvdWxkLgogICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5vZGUudmFyaWFibGU7CiAgICBpZiAodmFyaWFibGUucGFyZW50IGlzIExldCB8fCBfaXNGb3JtYWxQYXJhbWV0ZXIodmFyaWFibGUpKSB7CiAgICAgIHJldHVybiBlbnYubG9va3VwVmFyaWFibGUobm9kZS52YXJpYWJsZSkgPz8KICAgICAgICAgIHJlcG9ydCgKICAgICAgICAgICAgICBub2RlLAogICAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldAogICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyh2YXJpYWJsZS5uYW1lKSk7CiAgICB9CiAgICBpZiAodmFyaWFibGUuaXNDb25zdCkgewogICAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbih2YXJpYWJsZS5pbml0aWFsaXplcik7CiAgICB9CiAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCAnVmFyaWFibGUgZ2V0IG9mIGEgbm9uLWNvbnN0IHZhcmlhYmxlLicpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IG5vZGUpIHsKICAgIHJldHVybiB3aXRoTmV3RW52aXJvbm1lbnQoKCkgewogICAgICBmaW5hbCBNZW1iZXIgdGFyZ2V0ID0gbm9kZS50YXJnZXQ7CiAgICAgIGlmICh0YXJnZXQgaXMgRmllbGQpIHsKICAgICAgICBpZiAodGFyZ2V0LmlzQ29uc3QpIHsKICAgICAgICAgIHJldHVybiBydW5JbnNpZGVDb250ZXh0KHRhcmdldCwgKCkgewogICAgICAgICAgICByZXR1cm4gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbih0YXJnZXQuaW5pdGlhbGl6ZXIpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24KICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHRhcmdldC5uYW1lLm5hbWUpKTsKICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlKSB7CiAgICAgICAgaWYgKHRhcmdldC5raW5kID09IFByb2NlZHVyZUtpbmQuTWV0aG9kKSB7CiAgICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplKG5ldyBUZWFyT2ZmQ29uc3RhbnQodGFyZ2V0KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb24KICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHRhcmdldC5uYW1lLm5hbWUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRJbnZhbGlkKAogICAgICAgICAgICBub2RlLCAnTm8gc3VwcG9ydCBmb3IgJHt0YXJnZXQucnVudGltZVR5cGV9IGluIGEgc3RhdGljLWdldC4nKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBub2RlKSB7CiAgICBmaW5hbCBMaXN0PE9iamVjdD4gY29uY2F0ZW5hdGVkID0gPE9iamVjdD5bbmV3IFN0cmluZ0J1ZmZlcigpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykgewogICAgICBDb25zdGFudCBjb25zdGFudCA9IF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uc1tpXSk7CiAgICAgIGlmIChjb25zdGFudCBpcyBQcmltaXRpdmVDb25zdGFudDxPYmplY3Q+KSB7CiAgICAgICAgU3RyaW5nIHZhbHVlOwogICAgICAgIGlmIChjb25zdGFudCBpcyBEb3VibGVDb25zdGFudCAmJiBpbnRGb2xkZXIuaXNJbnQoY29uc3RhbnQpKSB7CiAgICAgICAgICB2YWx1ZSA9IG5ldyBCaWdJbnQuZnJvbShjb25zdGFudC52YWx1ZSkudG9TdHJpbmcoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsdWUgPSBjb25zdGFudC50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgICBPYmplY3QgbGFzdCA9IGNvbmNhdGVuYXRlZC5sYXN0OwogICAgICAgIGlmIChsYXN0IGlzIFN0cmluZ0J1ZmZlcikgewogICAgICAgICAgbGFzdC53cml0ZSh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbmNhdGVuYXRlZC5hZGQobmV3IFN0cmluZ0J1ZmZlcih2YWx1ZSkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgICAgLy8gVGhlIGNvbnN0YW50IGlzIGVpdGhlciB1bmV2YWx1YXRlZCBvciBhIG5vbi1wcmltaXRpdmUgaW4gYW4KICAgICAgICAvLyB1bmV2YWx1YXRlZCBjb250ZXh0LiBJbiBib3RoIGNhc2VzIHdlIGRlZmVyIHRoZSBldmFsdWF0aW9uIGFuZC9vcgogICAgICAgIC8vIGVycm9yIHJlcG9ydGluZyB0aWxsIGxhdGVyLgogICAgICAgIGNvbmNhdGVuYXRlZC5hZGQoY29uc3RhbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZFN0cmluZ0ludGVycG9sYXRpb25PcGVyYW5kLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgICBjb25zdGFudCwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgICB9CiAgICB9CiAgICBpZiAoY29uY2F0ZW5hdGVkLmxlbmd0aCA+IDEpIHsKICAgICAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9CiAgICAgICAgICBuZXcgTGlzdDxFeHByZXNzaW9uPihjb25jYXRlbmF0ZWQubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25jYXRlbmF0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBPYmplY3QgdmFsdWUgPSBjb25jYXRlbmF0ZWRbaV07CiAgICAgICAgaWYgKHZhbHVlIGlzIFN0cmluZ0J1ZmZlcikgewogICAgICAgICAgZXhwcmVzc2lvbnNbaV0gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKAogICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZShuZXcgU3RyaW5nQ29uc3RhbnQodmFsdWUudG9TdHJpbmcoKSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIGVpdGhlciB1bmV2YWx1YXRlZCBjb25zdGFudCBvciBhIG5vbi1wcmltaXRpdmUKICAgICAgICAgIC8vIGNvbnN0YW50IGluIGFuIHVuZXZhbHVhdGVkIGV4cHJlc3Npb24uCiAgICAgICAgICBleHByZXNzaW9uc1tpXSA9IGV4dHJhY3QodmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQobm9kZSwgbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oZXhwcmVzc2lvbnMpKTsKICAgIH0KICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IFN0cmluZ0NvbnN0YW50KGNvbmNhdGVuYXRlZC5zaW5nbGUudG9TdHJpbmcoKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gbm9kZSkgewogICAgZmluYWwgUHJvY2VkdXJlIHRhcmdldCA9IG5vZGUudGFyZ2V0OwogICAgZmluYWwgQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRzOwogICAgZmluYWwgTGlzdDxDb25zdGFudD4gcG9zaXRpb25hbHMgPSBldmFsdWF0ZVBvc2l0aW9uYWxBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbnN0YW50PiBuYW1lZCA9IGV2YWx1YXRlTmFtZWRBcmd1bWVudHMoYXJndW1lbnRzKTsKICAgIGlmIChzaG91bGRCZVVuZXZhbHVhdGVkKSB7CiAgICAgIHJldHVybiB1bmV2YWx1YXRlZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgICAgICB0YXJnZXQsIHVuZXZhbHVhdGVkQXJndW1lbnRzKHBvc2l0aW9uYWxzLCBuYW1lZCwgYXJndW1lbnRzLnR5cGVzKSwKICAgICAgICAgICAgICBpc0NvbnN0OiB0cnVlKSk7CiAgICB9CiAgICBpZiAodGFyZ2V0LmtpbmQgPT0gUHJvY2VkdXJlS2luZC5GYWN0b3J5KSB7CiAgICAgIGlmICh0YXJnZXQuaXNDb25zdCAmJgogICAgICAgICAgdGFyZ2V0Lm5hbWUubmFtZSA9PSAiZnJvbUVudmlyb25tZW50IiAmJgogICAgICAgICAgdGFyZ2V0LmVuY2xvc2luZ0xpYnJhcnkgPT0gY29yZVR5cGVzLmNvcmVMaWJyYXJ5ICYmCiAgICAgICAgICBwb3NpdGlvbmFscy5sZW5ndGggPT0gMSkgewogICAgICAgIGlmIChlbnZpcm9ubWVudERlZmluZXMgIT0gbnVsbCkgewogICAgICAgICAgLy8gRXZhbHVhdGUgZW52aXJvbm1lbnQgY29uc3RhbnQuCiAgICAgICAgICBDb25zdGFudCBuYW1lID0gcG9zaXRpb25hbHMuc2luZ2xlOwogICAgICAgICAgaWYgKG5hbWUgaXMgU3RyaW5nQ29uc3RhbnQpIHsKICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZW52aXJvbm1lbnREZWZpbmVzW25hbWUudmFsdWVdOwogICAgICAgICAgICBDb25zdGFudCBkZWZhdWx0VmFsdWUgPSBuYW1lZFsiZGVmYXVsdFZhbHVlIl07CgogICAgICAgICAgICBpZiAodGFyZ2V0LmVuY2xvc2luZ0NsYXNzID09IGNvcmVUeXBlcy5ib29sQ2xhc3MpIHsKICAgICAgICAgICAgICBDb25zdGFudCBib29sQ29uc3RhbnQgPSB2YWx1ZSA9PSAidHJ1ZSIKICAgICAgICAgICAgICAgICAgPyB0cnVlQ29uc3RhbnQKICAgICAgICAgICAgICAgICAgOiB2YWx1ZSA9PSAiZmFsc2UiCiAgICAgICAgICAgICAgICAgICAgICA/IGZhbHNlQ29uc3RhbnQKICAgICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdFZhbHVlIGlzIEJvb2xDb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgID8gbWFrZUJvb2xDb25zdGFudChkZWZhdWx0VmFsdWUudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUgaXMgTnVsbENvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbENvbnN0YW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2VDb25zdGFudDsKICAgICAgICAgICAgICByZXR1cm4gYm9vbENvbnN0YW50OwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5lbmNsb3NpbmdDbGFzcyA9PSBjb3JlVHlwZXMuaW50Q2xhc3MpIHsKICAgICAgICAgICAgICBpbnQgaW50VmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gaW50LnRyeVBhcnNlKHZhbHVlKSA6IG51bGw7CiAgICAgICAgICAgICAgQ29uc3RhbnQgaW50Q29uc3RhbnQ7CiAgICAgICAgICAgICAgaWYgKGludFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGJvb2wgbmVnYXRlZCA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTsKICAgICAgICAgICAgICAgIGludENvbnN0YW50ID0KICAgICAgICAgICAgICAgICAgICBpbnRGb2xkZXIubWFrZUludENvbnN0YW50KGludFZhbHVlLCB1bnNpZ25lZDogIW5lZ2F0ZWQpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50Rm9sZGVyLmlzSW50KGRlZmF1bHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIGludENvbnN0YW50ID0gZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnRDb25zdGFudCA9IG51bGxDb25zdGFudDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShpbnRDb25zdGFudCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmVuY2xvc2luZ0NsYXNzID09IGNvcmVUeXBlcy5zdHJpbmdDbGFzcykgewogICAgICAgICAgICAgIHZhbHVlID8/PQogICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgaXMgU3RyaW5nQ29uc3RhbnQgPyBkZWZhdWx0VmFsdWUudmFsdWUgOiBudWxsOwogICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbENvbnN0YW50OwogICAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUobmV3IFN0cmluZ0NvbnN0YW50KHZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSBpcyBOdWxsQ29uc3RhbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHJlcG9ydChub2RlLCBtZXNzYWdlQ29uc3RFdmFsTnVsbFZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTGVhdmUgZW52aXJvbm1lbnQgY29uc3RhbnQgdW5ldmFsdWF0ZWQuCiAgICAgICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICBuZXcgU3RhdGljSW52b2NhdGlvbih0YXJnZXQsCiAgICAgICAgICAgICAgICAgIHVuZXZhbHVhdGVkQXJndW1lbnRzKHBvc2l0aW9uYWxzLCBuYW1lZCwgYXJndW1lbnRzLnR5cGVzKSwKICAgICAgICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSkpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0YXJnZXQubmFtZS5uYW1lID09ICdpZGVudGljYWwnKSB7CiAgICAgIC8vIEVuc3VyZSB0aGUgImlkZW50aWNhbCgpIiBmdW5jdGlvbiBjb21lcyBmcm9tIGRhcnQ6Y29yZS4KICAgICAgZmluYWwgVHJlZU5vZGUgcGFyZW50ID0gdGFyZ2V0LnBhcmVudDsKICAgICAgaWYgKHBhcmVudCBpcyBMaWJyYXJ5ICYmIHBhcmVudCA9PSBjb3JlVHlwZXMuY29yZUxpYnJhcnkpIHsKICAgICAgICBmaW5hbCBDb25zdGFudCBsZWZ0ID0gcG9zaXRpb25hbHNbMF07CiAgICAgICAgZmluYWwgQ29uc3RhbnQgcmlnaHQgPSBwb3NpdGlvbmFsc1sxXTsKCiAgICAgICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgICAgIC8vIEluIEphdmFTY3JpcHQsIHdlIGxvd2VyIFtpZGVudGljYWxdIHRvIGA9PT1gLCBzbyB3ZSBuZWVkIHRvIHRha2UKICAgICAgICAgIC8vIHRoZSBkb3VibGUgc3BlY2lhbCBjYXNlcyBpbnRvIGFjY291bnQuCiAgICAgICAgICByZXR1cm4gZG91YmxlU3BlY2lhbENhc2VzKGxlZnQsIHJpZ2h0KSA/PwogICAgICAgICAgICAgIG1ha2VCb29sQ29uc3RhbnQoaWRlbnRpY2FsKGxlZnQsIHJpZ2h0KSk7CiAgICAgICAgfQoKICAgICAgICAvLyBTaW5jZSB3ZSBjYW5vbmljYWxpemUgY29uc3RhbnRzIGR1cmluZyB0aGUgZXZhbHVhdGlvbiwgd2UgY2FuIHVzZQogICAgICAgIC8vIGlkZW50aWNhbCBoZXJlLgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGlkZW50aWNhbChsZWZ0LCByaWdodCkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRhcmdldC5pc0V4dGVuc2lvbk1lbWJlcikgewogICAgICByZXR1cm4gcmVwb3J0KG5vZGUsIG1lc3NhZ2VDb25zdEV2YWxFeHRlbnNpb24pOwogICAgfQoKICAgIFN0cmluZyBuYW1lID0gdGFyZ2V0Lm5hbWUubmFtZTsKICAgIGlmICh0YXJnZXQgaXMgUHJvY2VkdXJlICYmIHRhcmdldC5pc0ZhY3RvcnkpIHsKICAgICAgaWYgKG5hbWUuaXNFbXB0eSkgewogICAgICAgIG5hbWUgPSB0YXJnZXQuZW5jbG9zaW5nQ2xhc3MubmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lID0gJyR7dGFyZ2V0LmVuY2xvc2luZ0NsYXNzLm5hbWV9LiR7bmFtZX0nOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCAiSW52b2NhdGlvbiBvZiAkbmFtZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRBc0V4cHJlc3Npb24oQXNFeHByZXNzaW9uIG5vZGUpIHsKICAgIGZpbmFsIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm9wZXJhbmQpOwogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG5ldyBBc0V4cHJlc3Npb24oZXh0cmFjdChjb25zdGFudCksIGVudi5zdWJzdGl0dXRlVHlwZShub2RlLnR5cGUpKQogICAgICAgICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPQogICAgICAgICAgICAgICAgX3N0YXRpY1R5cGVDb250ZXh0LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgfQogICAgcmV0dXJuIGVuc3VyZUlzU3VidHlwZShjb25zdGFudCwgZXZhbHVhdGVEYXJ0VHlwZShub2RlLCBub2RlLnR5cGUpLCBub2RlKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICBmaW5hbCBDb25zdGFudCBjb25zdGFudCA9IG5vZGUub3BlcmFuZC5hY2NlcHQodGhpcyk7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IElzRXhwcmVzc2lvbihleHRyYWN0KGNvbnN0YW50KSwgbm9kZS50eXBlKQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQKICAgICAgICAgICAgLi5mbGFncyA9IG5vZGUuZmxhZ3MpOwogICAgfQogICAgaWYgKGNvbnN0YW50IGlzIE51bGxDb25zdGFudCkgewogICAgICBEYXJ0VHlwZSBub2RlVHlwZSA9IG5vZGUudHlwZTsKICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQobm9kZVR5cGUgPT0gdHlwZUVudmlyb25tZW50Lm51bGxUeXBlIHx8CiAgICAgICAgICBub2RlVHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICAgICAgbm9kZVR5cGUuY2xhc3NOb2RlID09IHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3MgfHwKICAgICAgICAgIG5vZGUudHlwZSBpcyBEeW5hbWljVHlwZSk7CiAgICB9CiAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudCgKICAgICAgICBpc1N1YnR5cGUoY29uc3RhbnQsIGV2YWx1YXRlRGFydFR5cGUobm9kZSwgbm9kZS50eXBlKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXROb3QoTm90IG5vZGUpIHsKICAgIGZpbmFsIENvbnN0YW50IGNvbnN0YW50ID0gX2V2YWx1YXRlU3ViZXhwcmVzc2lvbihub2RlLm9wZXJhbmQpOwogICAgaWYgKGNvbnN0YW50IGlzIEJvb2xDb25zdGFudCkgewogICAgICByZXR1cm4gbWFrZUJvb2xDb25zdGFudChjb25zdGFudCAhPSB0cnVlQ29uc3RhbnQpOwogICAgfQogICAgaWYgKHNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcmV0dXJuIHVuZXZhbHVhdGVkKG5vZGUsIG5ldyBOb3QoZXh0cmFjdChjb25zdGFudCkpKTsKICAgIH0KICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgbm9kZSwKICAgICAgICB0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgIGNvbnN0YW50LAogICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmJvb2xMZWdhY3lSYXdUeXBlLAogICAgICAgICAgICBjb25zdGFudC5nZXRUeXBlKF9zdGF0aWNUeXBlQ29udGV4dCksCiAgICAgICAgICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQpKTsKICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IHZpc2l0U3ltYm9sTGl0ZXJhbChTeW1ib2xMaXRlcmFsIG5vZGUpIHsKICAgIGZpbmFsIFJlZmVyZW5jZSBsaWJyYXJ5UmVmZXJlbmNlID0KICAgICAgICBub2RlLnZhbHVlLnN0YXJ0c1dpdGgoJ18nKSA/IGxpYnJhcnlPZihub2RlKS5yZWZlcmVuY2UgOiBudWxsOwogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZShuZXcgU3ltYm9sQ29uc3RhbnQobm9kZS52YWx1ZSwgbGlicmFyeVJlZmVyZW5jZSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRJbnN0YW50aWF0aW9uKEluc3RhbnRpYXRpb24gbm9kZSkgewogICAgZmluYWwgQ29uc3RhbnQgY29uc3RhbnQgPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbik7CiAgICBpZiAoc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICByZXR1cm4gdW5ldmFsdWF0ZWQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgbmV3IEluc3RhbnRpYXRpb24oZXh0cmFjdChjb25zdGFudCksCiAgICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzLm1hcCgodCkgPT4gZW52LnN1YnN0aXR1dGVUeXBlKHQpKS50b0xpc3QoKSkpOwogICAgfQogICAgaWYgKGNvbnN0YW50IGlzIFRlYXJPZmZDb25zdGFudCkgewogICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCA9PQogICAgICAgICAgY29uc3RhbnQucHJvY2VkdXJlLmZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkgewogICAgICAgIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMgPQogICAgICAgICAgICBjb252ZXJ0VHlwZXMoZXZhbHVhdGVEYXJ0VHlwZXMobm9kZSwgbm9kZS50eXBlQXJndW1lbnRzKSk7CiAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZSgKICAgICAgICAgICAgbmV3IFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQoY29uc3RhbnQsIHR5cGVBcmd1bWVudHMpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVwb3J0SW52YWxpZCgKICAgICAgICAgIG5vZGUsCiAgICAgICAgICAnVGhlIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyBzdXBwbGllZCBpbiB0aGUgcGFydGlhbCBpbnN0YW50aWF0aW9uICcKICAgICAgICAgICdkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoZSAkY29uc3RhbnQuJyk7CiAgICB9CiAgICAvLyBUaGUgaW5uZXIgZXhwcmVzc2lvbiBpbiBhbiBpbnN0YW50aWF0aW9uIGNhbiBuZXZlciBiZSBudWxsLCBzaW5jZQogICAgLy8gaW5zdGFudGlhdGlvbnMgYXJlIG9ubHkgaW5mZXJyZWQgb24gZGlyZWN0IHJlZmVyZW5jZXMgdG8gZGVjbGFyYXRpb25zLgogICAgcmV0dXJuIHJlcG9ydEludmFsaWQoCiAgICAgICAgbm9kZSwgJ09ubHkgdGVhci1vZmYgY29uc3RhbnRzIGNhbiBiZSBwYXJ0aWFsbHkgaW5zdGFudGlhdGVkLicpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdmlzaXRDaGVja0xpYnJhcnlJc0xvYWRlZChDaGVja0xpYnJhcnlJc0xvYWRlZCBub2RlKSB7CiAgICByZXR1cm4gcmVwb3J0KAogICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5LndpdGhBcmd1bWVudHMobm9kZS5pbXBvcnQubmFtZSkpOwogIH0KCiAgLy8gSGVscGVyIG1ldGhvZHM6CgogIC8vLyBJZiBib3RoIGNvbnN0YW50cyBhcmUgRG91YmxlQ29uc3RhbnQgd2hvc2UgdmFsdWVzIHdvdWxkIGdpdmUgZGlmZmVyZW50CiAgLy8vIHJlc3VsdHMgZnJvbSA9PSBhbmQgW2lkZW50aWNhbF0sIHJldHVybiB0aGUgcmVzdWx0IG9mID09LiBPdGhlcndpc2UKICAvLy8gcmV0dXJuIG51bGwuCiAgQ29uc3RhbnQgZG91YmxlU3BlY2lhbENhc2VzKENvbnN0YW50IGEsIENvbnN0YW50IGIpIHsKICAgIGlmIChhIGlzIERvdWJsZUNvbnN0YW50ICYmIGIgaXMgRG91YmxlQ29uc3RhbnQpIHsKICAgICAgaWYgKGEudmFsdWUuaXNOYU4gJiYgYi52YWx1ZS5pc05hTikgcmV0dXJuIGZhbHNlQ29uc3RhbnQ7CiAgICAgIGlmIChhLnZhbHVlID09IDAuMCAmJiBiLnZhbHVlID09IDAuMCkgcmV0dXJuIHRydWVDb25zdGFudDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgYm9vbCBoYXNQcmltaXRpdmVFcXVhbChDb25zdGFudCBjb25zdGFudCkgewogICAgaWYgKGludEZvbGRlci5pc0ludChjb25zdGFudCkpIHJldHVybiB0cnVlOwogICAgRGFydFR5cGUgdHlwZSA9IGNvbnN0YW50LmdldFR5cGUoX3N0YXRpY1R5cGVDb250ZXh0KTsKICAgIHJldHVybiAhKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiAhY2xhc3NIYXNQcmltaXRpdmVFcXVhbCh0eXBlLmNsYXNzTm9kZSkpOwogIH0KCiAgYm9vbCBjbGFzc0hhc1ByaW1pdGl2ZUVxdWFsKENsYXNzIGtsYXNzKSB7CiAgICBib29sIGNhY2hlZCA9IHByaW1pdGl2ZUVxdWFsQ2FjaGVba2xhc3NdOwogICAgaWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4gY2FjaGVkOwogICAgZm9yIChQcm9jZWR1cmUgcHJvY2VkdXJlIGluIGtsYXNzLnByb2NlZHVyZXMpIHsKICAgICAgaWYgKHByb2NlZHVyZS5raW5kID09IFByb2NlZHVyZUtpbmQuT3BlcmF0b3IgJiYKICAgICAgICAgIHByb2NlZHVyZS5uYW1lLm5hbWUgPT0gJz09JyAmJgogICAgICAgICAgIXByb2NlZHVyZS5pc0Fic3RyYWN0ICYmCiAgICAgICAgICAhcHJvY2VkdXJlLmlzRm9yd2FyZGluZ1N0dWIpIHsKICAgICAgICByZXR1cm4gcHJpbWl0aXZlRXF1YWxDYWNoZVtrbGFzc10gPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGtsYXNzLnN1cGVydHlwZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gVG8gYmUgb24gdGhlIHNhZmUgc2lkZQogICAgcmV0dXJuIHByaW1pdGl2ZUVxdWFsQ2FjaGVba2xhc3NdID0KICAgICAgICBjbGFzc0hhc1ByaW1pdGl2ZUVxdWFsKGtsYXNzLnN1cGVydHlwZS5jbGFzc05vZGUpOwogIH0KCiAgQm9vbENvbnN0YW50IG1ha2VCb29sQ29uc3RhbnQoYm9vbCB2YWx1ZSkgPT4KICAgICAgdmFsdWUgPyB0cnVlQ29uc3RhbnQgOiBmYWxzZUNvbnN0YW50OwoKICBib29sIGlzU3VidHlwZShDb25zdGFudCBjb25zdGFudCwgRGFydFR5cGUgdHlwZSkgewogICAgRGFydFR5cGUgY29uc3RhbnRUeXBlID0gY29uc3RhbnQuZ2V0VHlwZShfc3RhdGljVHlwZUNvbnRleHQpOwogICAgaWYgKHRhcmdldGluZ0phdmFTY3JpcHQpIHsKICAgICAgaWYgKGNvbnN0YW50VHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgICBjb25zdGFudFR5cGUuY2xhc3NOb2RlID09IHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuaW50Q2xhc3MgJiYKICAgICAgICAgIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgdHlwZS5jbGFzc05vZGUgPT0gdHlwZUVudmlyb25tZW50LmNvcmVUeXBlcy5kb3VibGVDbGFzcykgewogICAgICAgIC8vIFdpdGggSlMgc2VtYW50aWNzLCBhbiBpbnRlZ2VyIGlzIGFsc28gYSBkb3VibGUuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChjb25zdGFudFR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICAgICAgY29uc3RhbnRUeXBlLmNsYXNzTm9kZSA9PSB0eXBlRW52aXJvbm1lbnQuY29yZVR5cGVzLmRvdWJsZUNsYXNzICYmCiAgICAgICAgICB0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIHR5cGUuY2xhc3NOb2RlID09IHR5cGVFbnZpcm9ubWVudC5jb3JlVHlwZXMuaW50Q2xhc3MpIHsKICAgICAgICBkb3VibGUgdmFsdWUgPSAoY29uc3RhbnQgYXMgRG91YmxlQ29uc3RhbnQpLnZhbHVlOwogICAgICAgIGlmICh2YWx1ZS5pc0Zpbml0ZSAmJiB2YWx1ZSA9PSB2YWx1ZS50cnVuY2F0ZVRvRG91YmxlKCkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC5pc1N1YnR5cGVPZigKICAgICAgICBjb25zdGFudFR5cGUsIHR5cGUsIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKTsKICB9CgogIENvbnN0YW50IGVuc3VyZUlzU3VidHlwZShDb25zdGFudCBjb25zdGFudCwgRGFydFR5cGUgdHlwZSwgVHJlZU5vZGUgbm9kZSkgewogICAgaWYgKCFpc1N1YnR5cGUoY29uc3RhbnQsIHR5cGUpKSB7CiAgICAgIHJldHVybiByZXBvcnQoCiAgICAgICAgICBub2RlLAogICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkVHlwZS53aXRoQXJndW1lbnRzKGNvbnN0YW50LCB0eXBlLAogICAgICAgICAgICAgIGNvbnN0YW50LmdldFR5cGUoX3N0YXRpY1R5cGVDb250ZXh0KSwgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgfQogICAgcmV0dXJuIGNvbnN0YW50OwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gZXZhbHVhdGVUeXBlQXJndW1lbnRzKFRyZWVOb2RlIG5vZGUsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIHJldHVybiBldmFsdWF0ZURhcnRUeXBlcyhub2RlLCBhcmd1bWVudHMudHlwZXMpOwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gZXZhbHVhdGVTdXBlclR5cGVBcmd1bWVudHMoVHJlZU5vZGUgbm9kZSwgU3VwZXJ0eXBlIHR5cGUpIHsKICAgIHJldHVybiBldmFsdWF0ZURhcnRUeXBlcyhub2RlLCB0eXBlLnR5cGVBcmd1bWVudHMpOwogIH0KCiAgTGlzdDxEYXJ0VHlwZT4gZXZhbHVhdGVEYXJ0VHlwZXMoVHJlZU5vZGUgbm9kZSwgTGlzdDxEYXJ0VHlwZT4gdHlwZXMpIHsKICAgIC8vIFRPRE86IE9uY2UgdGhlIGZyb250ZW5kIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSBhcmUgbm8gZnJlZSB0eXBlIHZhcmlhYmxlcwogICAgLy8gbGVmdCBvdmVyIGFmdGVyIHN1YnN0aXR1dGlvbiwgd2UgY2FuIGVuYWJsZSB0aGlzIHNob3J0Y3V0IGFnYWluOgogICAgLy8gaWYgKGVudi5pc0VtcHR5KSByZXR1cm4gdHlwZXM7CiAgICByZXR1cm4gdHlwZXMubWFwKCh0KSA9PiBldmFsdWF0ZURhcnRUeXBlKG5vZGUsIHQpKS50b0xpc3QoKTsKICB9CgogIERhcnRUeXBlIGV2YWx1YXRlRGFydFR5cGUoVHJlZU5vZGUgbm9kZSwgRGFydFR5cGUgdHlwZSkgewogICAgZmluYWwgRGFydFR5cGUgcmVzdWx0ID0gZW52LnN1YnN0aXR1dGVUeXBlKHR5cGUpOwoKICAgIGlmICghaXNJbnN0YW50aWF0ZWQocmVzdWx0KSkgewogICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgbm9kZSwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXIud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICB0eXBlLCBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpc3Q8Q29uc3RhbnQ+IGV2YWx1YXRlUG9zaXRpb25hbEFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLnBvc2l0aW9uYWwubWFwKChFeHByZXNzaW9uIG5vZGUpIHsKICAgICAgcmV0dXJuIF9ldmFsdWF0ZVN1YmV4cHJlc3Npb24obm9kZSk7CiAgICB9KS50b0xpc3QoKTsKICB9CgogIE1hcDxTdHJpbmcsIENvbnN0YW50PiBldmFsdWF0ZU5hbWVkQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKICAgIGlmIChhcmd1bWVudHMubmFtZWQuaXNFbXB0eSkgcmV0dXJuIGNvbnN0IDxTdHJpbmcsIENvbnN0YW50Pnt9OwoKICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbnN0YW50PiBuYW1lZCA9IHt9OwogICAgYXJndW1lbnRzLm5hbWVkLmZvckVhY2goKE5hbWVkRXhwcmVzc2lvbiBwYWlyKSB7CiAgICAgIG5hbWVkW3BhaXIubmFtZV0gPSBfZXZhbHVhdGVTdWJleHByZXNzaW9uKHBhaXIudmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gbmFtZWQ7CiAgfQoKICBBcmd1bWVudHMgdW5ldmFsdWF0ZWRBcmd1bWVudHMoTGlzdDxDb25zdGFudD4gcG9zaXRpb25hbEFyZ3MsCiAgICAgIE1hcDxTdHJpbmcsIENvbnN0YW50PiBuYW1lZEFyZ3MsIExpc3Q8RGFydFR5cGU+IHR5cGVzKSB7CiAgICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWwgPQogICAgICAgIG5ldyBMaXN0PEV4cHJlc3Npb24+KHBvc2l0aW9uYWxBcmdzLmxlbmd0aCk7CiAgICBmaW5hbCBMaXN0PE5hbWVkRXhwcmVzc2lvbj4gbmFtZWQgPQogICAgICAgIG5ldyBMaXN0PE5hbWVkRXhwcmVzc2lvbj4obmFtZWRBcmdzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxBcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIHBvc2l0aW9uYWxbaV0gPSBleHRyYWN0KHBvc2l0aW9uYWxBcmdzW2ldKTsKICAgIH0KICAgIGludCBpID0gMDsKICAgIG5hbWVkQXJncy5mb3JFYWNoKChTdHJpbmcgbmFtZSwgQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgbmFtZWRbaSsrXSA9IG5ldyBOYW1lZEV4cHJlc3Npb24obmFtZSwgZXh0cmFjdCh2YWx1ZSkpOwogICAgfSk7CiAgICByZXR1cm4gbmV3IEFyZ3VtZW50cyhwb3NpdGlvbmFsLCBuYW1lZDogbmFtZWQsIHR5cGVzOiB0eXBlcyk7CiAgfQoKICBDb25zdGFudCBjYW5vbmljYWxpemUoQ29uc3RhbnQgY29uc3RhbnQpIHsKICAgIHJldHVybiBjYW5vbmljYWxpemF0aW9uQ2FjaGUucHV0SWZBYnNlbnQoY29uc3RhbnQsICgpID0+IGNvbnN0YW50KTsKICB9CgogIFQgd2l0aE5ld0luc3RhbmNlQnVpbGRlcjxUPigKICAgICAgQ2xhc3Mga2xhc3MsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMsIFQgZm4oKSkgewogICAgSW5zdGFuY2VCdWlsZGVyIG9sZCA9IGluc3RhbmNlQnVpbGRlcjsKICAgIHRyeSB7CiAgICAgIGluc3RhbmNlQnVpbGRlciA9IG5ldyBJbnN0YW5jZUJ1aWxkZXIodGhpcywga2xhc3MsIHR5cGVBcmd1bWVudHMpOwogICAgICByZXR1cm4gZm4oKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGluc3RhbmNlQnVpbGRlciA9IG9sZDsKICAgIH0KICB9CgogIFQgd2l0aE5ld0Vudmlyb25tZW50PFQ+KFQgZm4oKSkgewogICAgZmluYWwgRXZhbHVhdGlvbkVudmlyb25tZW50IG9sZEVudiA9IGVudjsKICAgIHRyeSB7CiAgICAgIGVudiA9IG5ldyBFdmFsdWF0aW9uRW52aXJvbm1lbnQoKTsKICAgICAgcmV0dXJuIGZuKCk7CiAgICB9IGZpbmFsbHkgewogICAgICBlbnYgPSBvbGRFbnY7CiAgICB9CiAgfQoKICAvLy8gQmluYXJ5IG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBvcGVyYW5kcywgYXQgbGVhc3Qgb25lIG9mIHdoaWNoIGlzIGEgZG91YmxlLgogIENvbnN0YW50IGV2YWx1YXRlQmluYXJ5TnVtZXJpY09wZXJhdGlvbigKICAgICAgU3RyaW5nIG9wLCBudW0gYSwgbnVtIGIsIFRyZWVOb2RlIG5vZGUpIHsKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAnKyc6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChhICsgYik7CiAgICAgIGNhc2UgJy0nOgogICAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoYSAtIGIpOwogICAgICBjYXNlICcqJzoKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KGEgKiBiKTsKICAgICAgY2FzZSAnLyc6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChhIC8gYik7CiAgICAgIGNhc2UgJ34vJzoKICAgICAgICBpZiAoYiA9PSAwKSB7CiAgICAgICAgICByZXR1cm4gcmVwb3J0KAogICAgICAgICAgICAgIG5vZGUsIHRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3Iud2l0aEFyZ3VtZW50cyhvcCwgJyRhJykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW50Rm9sZGVyLnRydW5jYXRpbmdEaXZpZGUoYSwgYik7CiAgICAgIGNhc2UgJyUnOgogICAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoYSAlIGIpOwogICAgfQoKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAnPCc6CiAgICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQoYSA8IGIpOwogICAgICBjYXNlICc8PSc6CiAgICAgICAgcmV0dXJuIG1ha2VCb29sQ29uc3RhbnQoYSA8PSBiKTsKICAgICAgY2FzZSAnPj0nOgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGEgPj0gYik7CiAgICAgIGNhc2UgJz4nOgogICAgICAgIHJldHVybiBtYWtlQm9vbENvbnN0YW50KGEgPiBiKTsKICAgIH0KCiAgICByZXR1cm4gcmVwb3J0SW52YWxpZChub2RlLCAiVW5leHBlY3RlZCBiaW5hcnkgbnVtZXJpYyBvcGVyYXRpb24gJyRvcCcuIik7CiAgfQoKICBMaWJyYXJ5IGxpYnJhcnlPZihUcmVlTm9kZSBub2RlKSB7CiAgICAvLyBUaGUgdHJlZSBzdHJ1Y3R1cmUgb2YgdGhlIGtlcm5lbCBBU1QgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSBhbiBlbmNsb3NpbmcKICAgIC8vIGxpYnJhcnkuCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAobm9kZSBpcyBMaWJyYXJ5KSByZXR1cm4gbm9kZTsKICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgfQogIH0KfQoKLy8vIEhvbGRzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIGEgY29uc3RhbnQgb2JqZWN0LCBuYW1lbHkKLy8vICAgKiB0aGUgW2tsYXNzXSBiZWluZyBpbnN0YW50aWF0ZWQKLy8vICAgKiB0aGUgW3R5cGVBcmd1bWVudHNdIHVzZWQgZm9yIHRoZSBpbnN0YW50aWF0aW9uCi8vLyAgICogdGhlIFtmaWVsZHNdIHRoZSBpbnN0YW5jZSB3aWxsIG9idGFpbiAoYWxsIGZpZWxkcyBmcm9tIHRoZQovLy8gICAgIGluc3RhbnRpYXRlZCBba2xhc3NdIHVwIHRvIHRoZSBbT2JqZWN0XSBrbGFzcykuCmNsYXNzIEluc3RhbmNlQnVpbGRlciB7CiAgQ29uc3RhbnRFdmFsdWF0b3IgZXZhbHVhdG9yOwoKICAvLy8gVGhlIGNsYXNzIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAgZmluYWwgQ2xhc3Mga2xhc3M7CgogIC8vLyBUaGUgdmFsdWVzIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIG5ldyBpbnN0YW5jZS4KICBmaW5hbCBMaXN0PERhcnRUeXBlPiB0eXBlQXJndW1lbnRzOwoKICAvLy8gVGhlIGZpZWxkIHZhbHVlcyBvZiB0aGUgbmV3IGluc3RhbmNlLgogIGZpbmFsIE1hcDxGaWVsZCwgQ29uc3RhbnQ+IGZpZWxkcyA9IDxGaWVsZCwgQ29uc3RhbnQ+e307CgogIGZpbmFsIExpc3Q8QXNzZXJ0U3RhdGVtZW50PiBhc3NlcnRzID0gPEFzc2VydFN0YXRlbWVudD5bXTsKCiAgZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1bnVzZWRBcmd1bWVudHMgPSA8RXhwcmVzc2lvbj5bXTsKCiAgSW5zdGFuY2VCdWlsZGVyKHRoaXMuZXZhbHVhdG9yLCB0aGlzLmtsYXNzLCB0aGlzLnR5cGVBcmd1bWVudHMpOwoKICB2b2lkIHNldEZpZWxkVmFsdWUoRmllbGQgZmllbGQsIENvbnN0YW50IGNvbnN0YW50KSB7CiAgICBmaWVsZHNbZmllbGRdID0gY29uc3RhbnQ7CiAgfQoKICBJbnN0YW5jZUNvbnN0YW50IGJ1aWxkSW5zdGFuY2UoKSB7CiAgICBhc3NlcnQoYXNzZXJ0cy5pc0VtcHR5KTsKICAgIGZpbmFsIE1hcDxSZWZlcmVuY2UsIENvbnN0YW50PiBmaWVsZFZhbHVlcyA9IDxSZWZlcmVuY2UsIENvbnN0YW50Pnt9OwogICAgZmllbGRzLmZvckVhY2goKEZpZWxkIGZpZWxkLCBDb25zdGFudCB2YWx1ZSkgewogICAgICBhc3NlcnQodmFsdWUgaXMhIFVuZXZhbHVhdGVkQ29uc3RhbnQpOwogICAgICBmaWVsZFZhbHVlc1tmaWVsZC5yZWZlcmVuY2VdID0gdmFsdWU7CiAgICB9KTsKICAgIGFzc2VydCh1bnVzZWRBcmd1bWVudHMuaXNFbXB0eSk7CiAgICByZXR1cm4gbmV3IEluc3RhbmNlQ29uc3RhbnQoa2xhc3MucmVmZXJlbmNlLCB0eXBlQXJndW1lbnRzLCBmaWVsZFZhbHVlcyk7CiAgfQoKICBJbnN0YW5jZUNyZWF0aW9uIGJ1aWxkVW5ldmFsdWF0ZWRJbnN0YW5jZSgpIHsKICAgIGZpbmFsIE1hcDxSZWZlcmVuY2UsIEV4cHJlc3Npb24+IGZpZWxkVmFsdWVzID0gPFJlZmVyZW5jZSwgRXhwcmVzc2lvbj57fTsKICAgIGZpZWxkcy5mb3JFYWNoKChGaWVsZCBmaWVsZCwgQ29uc3RhbnQgdmFsdWUpIHsKICAgICAgZmllbGRWYWx1ZXNbZmllbGQucmVmZXJlbmNlXSA9IGV2YWx1YXRvci5leHRyYWN0KHZhbHVlKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBJbnN0YW5jZUNyZWF0aW9uKAogICAgICAgIGtsYXNzLnJlZmVyZW5jZSwgdHlwZUFyZ3VtZW50cywgZmllbGRWYWx1ZXMsIGFzc2VydHMsIHVudXNlZEFyZ3VtZW50cyk7CiAgfQp9CgovLy8gSG9sZHMgYW4gZW52aXJvbm1lbnQgb2YgdHlwZSBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzIGFuZCB2YXJpYWJsZXMuCmNsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudCB7CiAgLy8vIFRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBpbiBzY29wZS4KICBmaW5hbCBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IF90eXBlVmFyaWFibGVzID0KICAgICAgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwoKICAvLy8gVGhlIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVycy92YXJpYWJsZXMgaW4gc2NvcGUuCiAgZmluYWwgTWFwPFZhcmlhYmxlRGVjbGFyYXRpb24sIENvbnN0YW50PiBfdmFyaWFibGVzID0KICAgICAgPFZhcmlhYmxlRGVjbGFyYXRpb24sIENvbnN0YW50Pnt9OwoKICAvLy8gVGhlIHZhcmlhYmxlcyB0aGF0IGhvbGQgdW5ldmFsdWF0ZWQgY29uc3RhbnRzLgogIC8vLwogIC8vLyBWYXJpYWJsZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGlzIHNldCB3aGVuIGxvb2tlZCB1cCwgbGVhdmluZyBvbmx5IHRoZQogIC8vLyB1bnJlYWQgdmFyaWFibGVzIGF0IHRoZSBlbmQuCiAgZmluYWwgU2V0PFZhcmlhYmxlRGVjbGFyYXRpb24+IF91bnJlYWRVbmV2YWx1YXRlZFZhcmlhYmxlcyA9CiAgICAgIG5ldyBTZXQ8VmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKCiAgLy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgZW1wdHkuCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfdHlwZVZhcmlhYmxlcy5pc0VtcHR5ICYmIF92YXJpYWJsZXMuaXNFbXB0eTsKCiAgdm9pZCBhZGRUeXBlUGFyYW1ldGVyVmFsdWUoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsIERhcnRUeXBlIHZhbHVlKSB7CiAgICBhc3NlcnQoIV90eXBlVmFyaWFibGVzLmNvbnRhaW5zS2V5KHBhcmFtZXRlcikpOwogICAgX3R5cGVWYXJpYWJsZXNbcGFyYW1ldGVyXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBhZGRWYXJpYWJsZVZhbHVlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIENvbnN0YW50IHZhbHVlKSB7CiAgICBfdmFyaWFibGVzW3ZhcmlhYmxlXSA9IHZhbHVlOwogICAgaWYgKHZhbHVlIGlzIFVuZXZhbHVhdGVkQ29uc3RhbnQpIHsKICAgICAgX3VucmVhZFVuZXZhbHVhdGVkVmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CiAgICB9CiAgfQoKICBEYXJ0VHlwZSBsb29rdXBQYXJhbWV0ZXJWYWx1ZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlcikgewogICAgZmluYWwgRGFydFR5cGUgdmFsdWUgPSBfdHlwZVZhcmlhYmxlc1twYXJhbWV0ZXJdOwogICAgYXNzZXJ0KHZhbHVlICE9IG51bGwpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgQ29uc3RhbnQgbG9va3VwVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgQ29uc3RhbnQgdmFsdWUgPSBfdmFyaWFibGVzW3ZhcmlhYmxlXTsKICAgIGlmICh2YWx1ZSBpcyBVbmV2YWx1YXRlZENvbnN0YW50KSB7CiAgICAgIF91bnJlYWRVbmV2YWx1YXRlZFZhcmlhYmxlcy5yZW1vdmUodmFyaWFibGUpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLy8vIFRoZSB1bmV2YWx1YXRlZCBjb25zdGFudHMgb2YgdmFyaWFibGVzIHRoYXQgd2VyZSBuZXZlciByZWFkLgogIEl0ZXJhYmxlPFVuZXZhbHVhdGVkQ29uc3RhbnQ+IGdldCB1bmV2YWx1YXRlZFVucmVhZENvbnN0YW50cyB7CiAgICBpZiAoX3VucmVhZFVuZXZhbHVhdGVkVmFyaWFibGVzLmlzRW1wdHkpIHJldHVybiBjb25zdCBbXTsKICAgIHJldHVybiBfdW5yZWFkVW5ldmFsdWF0ZWRWYXJpYWJsZXMubWFwPFVuZXZhbHVhdGVkQ29uc3RhbnQ+KAogICAgICAgIChWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSA9PiBfdmFyaWFibGVzW3ZhcmlhYmxlXSk7CiAgfQoKICBEYXJ0VHlwZSBzdWJzdGl0dXRlVHlwZShEYXJ0VHlwZSB0eXBlKSB7CiAgICBpZiAoX3R5cGVWYXJpYWJsZXMuaXNFbXB0eSkgcmV0dXJuIHR5cGU7CiAgICByZXR1cm4gc3Vic3RpdHV0ZSh0eXBlLCBfdHlwZVZhcmlhYmxlcyk7CiAgfQp9CgpjbGFzcyBSZWR1bmRhbnRGaWxlVXJpRXhwcmVzc2lvblJlbW92ZXIgZXh0ZW5kcyBUcmFuc2Zvcm1lciB7CiAgVXJpIGN1cnJlbnRGaWxlVXJpID0gbnVsbDsKCiAgVHJlZU5vZGUgdmlzaXRGaWxlVXJpRXhwcmVzc2lvbihGaWxlVXJpRXhwcmVzc2lvbiBub2RlKSB7CiAgICBpZiAobm9kZS5maWxlVXJpID09IGN1cnJlbnRGaWxlVXJpKSB7CiAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgVXJpIG9sZEZpbGVVcmkgPSBjdXJyZW50RmlsZVVyaTsKICAgICAgY3VycmVudEZpbGVVcmkgPSBub2RlLmZpbGVVcmk7CiAgICAgIG5vZGUuZXhwcmVzc2lvbiA9IG5vZGUuZXhwcmVzc2lvbi5hY2NlcHQodGhpcykgYXMgRXhwcmVzc2lvbgogICAgICAgIC4ucGFyZW50ID0gbm9kZTsKICAgICAgY3VycmVudEZpbGVVcmkgPSBvbGRGaWxlVXJpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICB9Cn0KCi8vIFVzZWQgYXMgY29udHJvbC1mbG93IHRvIGFib3J0IHRoZSBjdXJyZW50IGV2YWx1YXRpb24uCmNsYXNzIF9BYm9ydER1ZVRvRXJyb3IgewogIGZpbmFsIFRyZWVOb2RlIG5vZGU7CiAgZmluYWwgTWVzc2FnZSBtZXNzYWdlOwogIGZpbmFsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQ7CgogIF9BYm9ydER1ZVRvRXJyb3IodGhpcy5ub2RlLCB0aGlzLm1lc3NhZ2UsIHt0aGlzLmNvbnRleHR9KTsKfQoKY2xhc3MgX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbiB7CiAgZmluYWwgVHJlZU5vZGUgbm9kZTsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgX0Fib3J0RHVlVG9JbnZhbGlkRXhwcmVzc2lvbih0aGlzLm5vZGUsIHRoaXMubWVzc2FnZSk7Cn0KCmFic3RyYWN0IGNsYXNzIEVycm9yUmVwb3J0ZXIgewogIGNvbnN0IEVycm9yUmVwb3J0ZXIoKTsKCiAgdm9pZCByZXBvcnQoTG9jYXRlZE1lc3NhZ2UgbWVzc2FnZSwgTGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCk7CgogIHZvaWQgcmVwb3J0SW52YWxpZEV4cHJlc3Npb24oSW52YWxpZEV4cHJlc3Npb24gbm9kZSk7Cn0KCmNsYXNzIFNpbXBsZUVycm9yUmVwb3J0ZXIgaW1wbGVtZW50cyBFcnJvclJlcG9ydGVyIHsKICBjb25zdCBTaW1wbGVFcnJvclJlcG9ydGVyKCk7CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQpIHsKICAgIF9yZXBvcnQobWVzc2FnZSk7CiAgICBmb3IgKExvY2F0ZWRNZXNzYWdlIGNvbnRleHRNZXNzYWdlIGluIGNvbnRleHQpIHsKICAgICAgX3JlcG9ydChjb250ZXh0TWVzc2FnZSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIElnbm9yZWQKICB9CgogIHZvaWQgX3JlcG9ydChMb2NhdGVkTWVzc2FnZSBtZXNzYWdlKSB7CiAgICByZXBvcnRNZXNzYWdlKG1lc3NhZ2UudXJpLCBtZXNzYWdlLmNoYXJPZmZzZXQsIG1lc3NhZ2UubWVzc2FnZSk7CiAgfQoKICB2b2lkIHJlcG9ydE1lc3NhZ2UoVXJpIHVyaSwgaW50IG9mZnNldCwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgIGlvLmV4aXRDb2RlID0gNDI7CiAgICBpby5zdGRlcnIud3JpdGVsbignJHVyaTokb2Zmc2V0IENvbnN0YW50IGV2YWx1YXRpb24gZXJyb3I6ICRtZXNzYWdlJyk7CiAgfQp9CgpjbGFzcyBJc0luc3RhbnRpYXRlZFZpc2l0b3IgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8Ym9vbD4gewogIGZpbmFsIF9hdmFpbGFibGVWYXJpYWJsZXMgPSBuZXcgU2V0PFR5cGVQYXJhbWV0ZXI+KCk7CgogIGJvb2wgaXNJbnN0YW50aWF0ZWQoRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIHR5cGUuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgewogICAgdGhyb3cgJ0EgdmlzaXRvciBtZXRob2Qgc2VlbXMgdG8gYmUgdW5pbXBsZW1lbnRlZCEnOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUpID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXREeW5hbWljVHlwZShEeW5hbWljVHlwZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0Vm9pZFR5cGUoVm9pZFR5cGUgbm9kZSkgPT4gdHJ1ZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIF9hdmFpbGFibGVWYXJpYWJsZXMuY29udGFpbnMobm9kZS5wYXJhbWV0ZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICByZXR1cm4gbm9kZS50eXBlQXJndW1lbnRzCiAgICAgICAgLmV2ZXJ5KChEYXJ0VHlwZSB0eXBlQXJndW1lbnQpID0+IHR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbm9kZS50eXBlUGFyYW1ldGVyczsKICAgIF9hdmFpbGFibGVWYXJpYWJsZXMuYWRkQWxsKHBhcmFtZXRlcnMpOwogICAgZmluYWwgYm9vbCByZXN1bHQgPSBub2RlLnJldHVyblR5cGUuYWNjZXB0KHRoaXMpICYmCiAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5ldmVyeSgocCkgPT4gcC5hY2NlcHQodGhpcykpICYmCiAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMuZXZlcnkoKHApID0+IHAudHlwZS5hY2NlcHQodGhpcykpOwogICAgX2F2YWlsYWJsZVZhcmlhYmxlcy5yZW1vdmVBbGwocGFyYW1ldGVycyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnVuYWxpYXMuYWNjZXB0KHRoaXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgPT4gdHJ1ZTsKfQoKYm9vbCBfaXNGb3JtYWxQYXJhbWV0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogIGZpbmFsIFRyZWVOb2RlIHBhcmVudCA9IHZhcmlhYmxlLnBhcmVudDsKICBpZiAocGFyZW50IGlzIEZ1bmN0aW9uTm9kZSkgewogICAgcmV0dXJuIHBhcmVudC5wb3NpdGlvbmFsUGFyYW1ldGVycy5jb250YWlucyh2YXJpYWJsZSkgfHwKICAgICAgICBwYXJlbnQubmFtZWRQYXJhbWV0ZXJzLmNvbnRhaW5zKHZhcmlhYmxlKTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9ColAAE5OPAFQBFBKRRkETUwgBEtRLyIBIgEY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Y2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mICdjb25zdGFudF9ldmFsdWF0b3IuZGFydCc7CgphYnN0cmFjdCBjbGFzcyBfTGlzdE9yU2V0Q29uc3RhbnRCdWlsZGVyPEwgZXh0ZW5kcyBFeHByZXNzaW9uPiB7CiAgZmluYWwgQ29uc3RhbnRFdmFsdWF0b3IgZXZhbHVhdG9yOwogIGZpbmFsIEV4cHJlc3Npb24gb3JpZ2luYWw7CiAgZmluYWwgRGFydFR5cGUgZWxlbWVudFR5cGU7CgogIC8vIEVhY2ggZWxlbWVudCBvZiBbcGFydHNdIGlzIGVpdGhlciBhIGBMaXN0PENvbnN0YW50PmAgKGNvbnRhaW5pbmcgZnVsbHkKICAvLyBldmFsdWF0ZWQgY29uc3RhbnRzKSBvciBhIGBDb25zdGFudGAgKHBvdGVudGlhbGx5IHVuZXZhbHVhdGVkKS4KICBMaXN0PE9iamVjdD4gcGFydHMgPSA8T2JqZWN0Pls8Q29uc3RhbnQ+W11dOwoKICBfTGlzdE9yU2V0Q29uc3RhbnRCdWlsZGVyKHRoaXMub3JpZ2luYWwsIHRoaXMuZWxlbWVudFR5cGUsIHRoaXMuZXZhbHVhdG9yKTsKCiAgTCBtYWtlTGl0ZXJhbChMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzKTsKCiAgLy8vIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBjb25zdGFudCBsaXN0IGJlaW5nIGJ1aWx0IGJ5IHRoaXMgYnVpbGRlci4KICB2b2lkIGFkZChFeHByZXNzaW9uIGVsZW1lbnQpIHsKICAgIENvbnN0YW50IGNvbnN0YW50ID0gZXZhbHVhdG9yLl9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oZWxlbWVudCk7CiAgICBpZiAoZXZhbHVhdG9yLnNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcGFydHMuYWRkKGV2YWx1YXRvci51bmV2YWx1YXRlZCgKICAgICAgICAgIGVsZW1lbnQsIG1ha2VMaXRlcmFsKFtldmFsdWF0b3IuZXh0cmFjdChjb25zdGFudCldKSkpOwogICAgfSBlbHNlIHsKICAgICAgYWRkQ29uc3RhbnQoY29uc3RhbnQsIGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCBhZGRTcHJlYWQoRXhwcmVzc2lvbiBzcHJlYWRFeHByZXNzaW9uKSB7CiAgICBDb25zdGFudCBzcHJlYWQgPQogICAgICAgIGV2YWx1YXRvci51bmxvd2VyKGV2YWx1YXRvci5fZXZhbHVhdGVTdWJleHByZXNzaW9uKHNwcmVhZEV4cHJlc3Npb24pKTsKICAgIGlmIChldmFsdWF0b3Iuc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAvLyBVbmV2YWx1YXRlZCBzcHJlYWQKICAgICAgcGFydHMuYWRkKHNwcmVhZCk7CiAgICB9IGVsc2UgaWYgKHNwcmVhZCA9PSBldmFsdWF0b3IubnVsbENvbnN0YW50KSB7CiAgICAgIC8vIE51bGwgc3ByZWFkCiAgICAgIGV2YWx1YXRvci5yZXBvcnQoc3ByZWFkRXhwcmVzc2lvbiwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBGdWxseSBldmFsdWF0ZWQgc3ByZWFkCiAgICAgIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXM7CiAgICAgIGlmIChzcHJlYWQgaXMgTGlzdENvbnN0YW50KSB7CiAgICAgICAgZW50cmllcyA9IHNwcmVhZC5lbnRyaWVzOwogICAgICB9IGVsc2UgaWYgKHNwcmVhZCBpcyBTZXRDb25zdGFudCkgewogICAgICAgIGVudHJpZXMgPSBzcHJlYWQuZW50cmllczsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3QgbGlzdCBvciBzZXQgaW4gc3ByZWFkCiAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5yZXBvcnQoCiAgICAgICAgICAgIHNwcmVhZEV4cHJlc3Npb24sIG1lc3NhZ2VDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZCk7CiAgICAgIH0KICAgICAgZm9yIChDb25zdGFudCBlbnRyeSBpbiBlbnRyaWVzKSB7CiAgICAgICAgYWRkQ29uc3RhbnQoZW50cnksIHNwcmVhZEV4cHJlc3Npb24pOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFkZENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50LCBUcmVlTm9kZSBjb250ZXh0KTsKCiAgQ29uc3RhbnQgYnVpbGQoKTsKfQoKY2xhc3MgTGlzdENvbnN0YW50QnVpbGRlciBleHRlbmRzIF9MaXN0T3JTZXRDb25zdGFudEJ1aWxkZXI8TGlzdExpdGVyYWw+IHsKICBMaXN0Q29uc3RhbnRCdWlsZGVyKAogICAgICBFeHByZXNzaW9uIG9yaWdpbmFsLCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgQ29uc3RhbnRFdmFsdWF0b3IgZXZhbHVhdG9yKQogICAgICA6IHN1cGVyKG9yaWdpbmFsLCBlbGVtZW50VHlwZSwgZXZhbHVhdG9yKTsKCiAgQG92ZXJyaWRlCiAgTGlzdExpdGVyYWwgbWFrZUxpdGVyYWwoTGlzdDxFeHByZXNzaW9uPiBlbGVtZW50cykgPT4KICAgICAgbmV3IExpc3RMaXRlcmFsKGVsZW1lbnRzLCBpc0NvbnN0OiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRDb25zdGFudChDb25zdGFudCBjb25zdGFudCwgVHJlZU5vZGUgY29udGV4dCkgewogICAgTGlzdDxDb25zdGFudD4gbGFzdFBhcnQ7CiAgICBpZiAocGFydHMubGFzdCBpcyBMaXN0PENvbnN0YW50PikgewogICAgICBsYXN0UGFydCA9IHBhcnRzLmxhc3Q7CiAgICB9IGVsc2UgewogICAgICBwYXJ0cy5hZGQobGFzdFBhcnQgPSA8Q29uc3RhbnQ+W10pOwogICAgfQogICAgbGFzdFBhcnQuYWRkKGV2YWx1YXRvci5lbnN1cmVJc1N1YnR5cGUoY29uc3RhbnQsIGVsZW1lbnRUeXBlLCBjb250ZXh0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCBidWlsZCgpIHsKICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewogICAgICAvLyBGdWxseSBldmFsdWF0ZWQKICAgICAgcmV0dXJuIGV2YWx1YXRvcgogICAgICAgICAgLmxvd2VyTGlzdENvbnN0YW50KG5ldyBMaXN0Q29uc3RhbnQoZWxlbWVudFR5cGUsIHBhcnRzLnNpbmdsZSkpOwogICAgfQogICAgTGlzdDxFeHByZXNzaW9uPiBsaXN0cyA9IDxFeHByZXNzaW9uPltdOwogICAgZm9yIChPYmplY3QgcGFydCBpbiBwYXJ0cykgewogICAgICBpZiAocGFydCBpcyBMaXN0PENvbnN0YW50PikgewogICAgICAgIGxpc3RzLmFkZChuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBMaXN0Q29uc3RhbnQoZWxlbWVudFR5cGUsIHBhcnQpKSk7CiAgICAgIH0gZWxzZSBpZiAocGFydCBpcyBDb25zdGFudCkgewogICAgICAgIGxpc3RzLmFkZChldmFsdWF0b3IuZXh0cmFjdChwYXJ0KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgJ05vbi1jb25zdGFudCBpbiBjb25zdGFudCBsaXN0JzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV2YWx1YXRvci51bmV2YWx1YXRlZCgKICAgICAgICBvcmlnaW5hbCwgbmV3IExpc3RDb25jYXRlbmF0aW9uKGxpc3RzLCB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlKSk7CiAgfQp9CgpjbGFzcyBTZXRDb25zdGFudEJ1aWxkZXIgZXh0ZW5kcyBfTGlzdE9yU2V0Q29uc3RhbnRCdWlsZGVyPFNldExpdGVyYWw+IHsKICBmaW5hbCBTZXQ8Q29uc3RhbnQ+IHNlZW4gPSBuZXcgU2V0PENvbnN0YW50Pi5pZGVudGl0eSgpOwoKICBTZXRDb25zdGFudEJ1aWxkZXIoCiAgICAgIEV4cHJlc3Npb24gb3JpZ2luYWwsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBDb25zdGFudEV2YWx1YXRvciBldmFsdWF0b3IpCiAgICAgIDogc3VwZXIob3JpZ2luYWwsIGVsZW1lbnRUeXBlLCBldmFsdWF0b3IpOwoKICBAb3ZlcnJpZGUKICBTZXRMaXRlcmFsIG1ha2VMaXRlcmFsKExpc3Q8RXhwcmVzc2lvbj4gZWxlbWVudHMpID0+CiAgICAgIG5ldyBTZXRMaXRlcmFsKGVsZW1lbnRzLCBpc0NvbnN0OiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRDb25zdGFudChDb25zdGFudCBjb25zdGFudCwgVHJlZU5vZGUgY29udGV4dCkgewogICAgaWYgKCFldmFsdWF0b3IuaGFzUHJpbWl0aXZlRXF1YWwoY29uc3RhbnQpKSB7CiAgICAgIGV2YWx1YXRvci5yZXBvcnQoCiAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAgY29uc3RhbnQsIGV2YWx1YXRvci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSk7CiAgICB9CiAgICBpZiAoIXNlZW4uYWRkKGNvbnN0YW50KSkgewogICAgICBldmFsdWF0b3IucmVwb3J0KAogICAgICAgICAgY29udGV4dCwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudC53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgIGNvbnN0YW50LCBldmFsdWF0b3IuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgfQoKICAgIExpc3Q8Q29uc3RhbnQ+IGxhc3RQYXJ0OwogICAgaWYgKHBhcnRzLmxhc3QgaXMgTGlzdDxDb25zdGFudD4pIHsKICAgICAgbGFzdFBhcnQgPSBwYXJ0cy5sYXN0OwogICAgfSBlbHNlIHsKICAgICAgcGFydHMuYWRkKGxhc3RQYXJ0ID0gPENvbnN0YW50PltdKTsKICAgIH0KICAgIGxhc3RQYXJ0LmFkZChldmFsdWF0b3IuZW5zdXJlSXNTdWJ0eXBlKGNvbnN0YW50LCBlbGVtZW50VHlwZSwgY29udGV4dCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgYnVpbGQoKSB7CiAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKICAgICAgLy8gRnVsbHkgZXZhbHVhdGVkCiAgICAgIExpc3Q8Q29uc3RhbnQ+IGVudHJpZXMgPSBwYXJ0cy5zaW5nbGU7CiAgICAgIFNldENvbnN0YW50IHJlc3VsdCA9IG5ldyBTZXRDb25zdGFudChlbGVtZW50VHlwZSwgZW50cmllcyk7CiAgICAgIGlmIChldmFsdWF0b3IuZGVzdWdhclNldHMpIHsKICAgICAgICBmaW5hbCBMaXN0PENvbnN0YW50TWFwRW50cnk+IG1hcEVudHJpZXMgPQogICAgICAgICAgICBuZXcgTGlzdDxDb25zdGFudE1hcEVudHJ5PihlbnRyaWVzLmxlbmd0aCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBtYXBFbnRyaWVzW2ldID0KICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRNYXBFbnRyeShlbnRyaWVzW2ldLCBldmFsdWF0b3IubnVsbENvbnN0YW50KTsKICAgICAgICB9CiAgICAgICAgQ29uc3RhbnQgbWFwID0gZXZhbHVhdG9yLmxvd2VyTWFwQ29uc3RhbnQobmV3IE1hcENvbnN0YW50KAogICAgICAgICAgICBlbGVtZW50VHlwZSwgZXZhbHVhdG9yLnR5cGVFbnZpcm9ubWVudC5udWxsVHlwZSwgbWFwRW50cmllcykpOwogICAgICAgIHJldHVybiBldmFsdWF0b3IubG93ZXIoCiAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgbmV3IEluc3RhbmNlQ29uc3RhbnQoCiAgICAgICAgICAgICAgICBldmFsdWF0b3IudW5tb2RpZmlhYmxlU2V0TWFwLmVuY2xvc2luZ0NsYXNzLnJlZmVyZW5jZSwgWwogICAgICAgICAgICAgIGVsZW1lbnRUeXBlCiAgICAgICAgICAgIF0sIDxSZWZlcmVuY2UsIENvbnN0YW50PnsKICAgICAgICAgICAgICBldmFsdWF0b3IudW5tb2RpZmlhYmxlU2V0TWFwLnJlZmVyZW5jZTogbWFwCiAgICAgICAgICAgIH0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmxvd2VyU2V0Q29uc3RhbnQocmVzdWx0KTsKICAgICAgfQogICAgfQogICAgTGlzdDxFeHByZXNzaW9uPiBzZXRzID0gPEV4cHJlc3Npb24+W107CiAgICBmb3IgKE9iamVjdCBwYXJ0IGluIHBhcnRzKSB7CiAgICAgIGlmIChwYXJ0IGlzIExpc3Q8Q29uc3RhbnQ+KSB7CiAgICAgICAgc2V0cy5hZGQobmV3IENvbnN0YW50RXhwcmVzc2lvbihuZXcgU2V0Q29uc3RhbnQoZWxlbWVudFR5cGUsIHBhcnQpKSk7CiAgICAgIH0gZWxzZSBpZiAocGFydCBpcyBDb25zdGFudCkgewogICAgICAgIHNldHMuYWRkKGV2YWx1YXRvci5leHRyYWN0KHBhcnQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyAnTm9uLWNvbnN0YW50IGluIGNvbnN0YW50IHNldCc7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBldmFsdWF0b3IudW5ldmFsdWF0ZWQoCiAgICAgICAgb3JpZ2luYWwsIG5ldyBTZXRDb25jYXRlbmF0aW9uKHNldHMsIHR5cGVBcmd1bWVudDogZWxlbWVudFR5cGUpKTsKICB9Cn0KCmNsYXNzIE1hcENvbnN0YW50QnVpbGRlciB7CiAgZmluYWwgQ29uc3RhbnRFdmFsdWF0b3IgZXZhbHVhdG9yOwogIGZpbmFsIEV4cHJlc3Npb24gb3JpZ2luYWw7CiAgZmluYWwgRGFydFR5cGUga2V5VHlwZTsKICBmaW5hbCBEYXJ0VHlwZSB2YWx1ZVR5cGU7CgogIC8vLyBFYWNoIGVsZW1lbnQgb2YgW3BhcnRzXSBpcyBlaXRoZXIgYSBgTGlzdDxDb25zdGFudE1hcEVudHJ5PmAgKGNvbnRhaW5pbmcKICAvLy8gZnVsbHkgZXZhbHVhdGVkIG1hcCBlbnRyaWVzKSBvciBhIGBDb25zdGFudGAgKHBvdGVudGlhbGx5IHVuZXZhbHVhdGVkKS4KICBMaXN0PE9iamVjdD4gcGFydHMgPSA8T2JqZWN0Pls8Q29uc3RhbnRNYXBFbnRyeT5bXV07CgogIGZpbmFsIFNldDxDb25zdGFudD4gc2VlbktleXMgPSBuZXcgU2V0PENvbnN0YW50Pi5pZGVudGl0eSgpOwoKICBNYXBDb25zdGFudEJ1aWxkZXIoCiAgICAgIHRoaXMub3JpZ2luYWwsIHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMuZXZhbHVhdG9yKTsKCiAgLy8vIEFkZCBhIG1hcCBlbnRyeSB0byB0aGUgY29uc3RhbnQgbWFwIGJlaW5nIGJ1aWx0IGJ5IHRoaXMgYnVpbGRlcgogIHZvaWQgYWRkKE1hcEVudHJ5IGVsZW1lbnQpIHsKICAgIENvbnN0YW50IGtleSA9IGV2YWx1YXRvci5fZXZhbHVhdGVTdWJleHByZXNzaW9uKGVsZW1lbnQua2V5KTsKICAgIENvbnN0YW50IHZhbHVlID0gZXZhbHVhdG9yLl9ldmFsdWF0ZVN1YmV4cHJlc3Npb24oZWxlbWVudC52YWx1ZSk7CiAgICBpZiAoZXZhbHVhdG9yLnNob3VsZEJlVW5ldmFsdWF0ZWQpIHsKICAgICAgcGFydHMuYWRkKGV2YWx1YXRvci51bmV2YWx1YXRlZCgKICAgICAgICAgIGVsZW1lbnQua2V5LAogICAgICAgICAgbmV3IE1hcExpdGVyYWwoCiAgICAgICAgICAgICAgW25ldyBNYXBFbnRyeShldmFsdWF0b3IuZXh0cmFjdChrZXkpLCBldmFsdWF0b3IuZXh0cmFjdCh2YWx1ZSkpXSwKICAgICAgICAgICAgICBpc0NvbnN0OiB0cnVlKSkpOwogICAgfSBlbHNlIHsKICAgICAgYWRkQ29uc3RhbnQoa2V5LCB2YWx1ZSwgZWxlbWVudC5rZXksIGVsZW1lbnQudmFsdWUpOwogICAgfQogIH0KCiAgdm9pZCBhZGRTcHJlYWQoRXhwcmVzc2lvbiBzcHJlYWRFeHByZXNzaW9uKSB7CiAgICBDb25zdGFudCBzcHJlYWQgPQogICAgICAgIGV2YWx1YXRvci51bmxvd2VyKGV2YWx1YXRvci5fZXZhbHVhdGVTdWJleHByZXNzaW9uKHNwcmVhZEV4cHJlc3Npb24pKTsKICAgIGlmIChldmFsdWF0b3Iuc2hvdWxkQmVVbmV2YWx1YXRlZCkgewogICAgICAvLyBVbmV2YWx1YXRlZCBzcHJlYWQKICAgICAgcGFydHMuYWRkKHNwcmVhZCk7CiAgICB9IGVsc2UgaWYgKHNwcmVhZCA9PSBldmFsdWF0b3IubnVsbENvbnN0YW50KSB7CiAgICAgIC8vIE51bGwgc3ByZWFkCiAgICAgIGV2YWx1YXRvci5yZXBvcnQoc3ByZWFkRXhwcmVzc2lvbiwgbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBGdWxseSBldmFsdWF0ZWQgc3ByZWFkCiAgICAgIGlmIChzcHJlYWQgaXMgTWFwQ29uc3RhbnQpIHsKICAgICAgICBmb3IgKENvbnN0YW50TWFwRW50cnkgZW50cnkgaW4gc3ByZWFkLmVudHJpZXMpIHsKICAgICAgICAgIGFkZENvbnN0YW50KAogICAgICAgICAgICAgIGVudHJ5LmtleSwgZW50cnkudmFsdWUsIHNwcmVhZEV4cHJlc3Npb24sIHNwcmVhZEV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3QgbWFwIGluIHNwcmVhZAogICAgICAgIHJldHVybiBldmFsdWF0b3IucmVwb3J0KAogICAgICAgICAgICBzcHJlYWRFeHByZXNzaW9uLCBtZXNzYWdlQ29uc3RFdmFsTm90TWFwSW5TcHJlYWQpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGFkZENvbnN0YW50KENvbnN0YW50IGtleSwgQ29uc3RhbnQgdmFsdWUsIFRyZWVOb2RlIGtleUNvbnRleHQsCiAgICAgIFRyZWVOb2RlIHZhbHVlQ29udGV4dCkgewogICAgTGlzdDxDb25zdGFudE1hcEVudHJ5PiBsYXN0UGFydDsKICAgIGlmIChwYXJ0cy5sYXN0IGlzIExpc3Q8Q29uc3RhbnRNYXBFbnRyeT4pIHsKICAgICAgbGFzdFBhcnQgPSBwYXJ0cy5sYXN0OwogICAgfSBlbHNlIHsKICAgICAgcGFydHMuYWRkKGxhc3RQYXJ0ID0gPENvbnN0YW50TWFwRW50cnk+W10pOwogICAgfQogICAgaWYgKCFldmFsdWF0b3IuaGFzUHJpbWl0aXZlRXF1YWwoa2V5KSkgewogICAgICBldmFsdWF0b3IucmVwb3J0KAogICAgICAgICAga2V5Q29udGV4dCwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsLndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAga2V5LCBldmFsdWF0b3IuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgfQogICAgaWYgKCFzZWVuS2V5cy5hZGQoa2V5KSkgewogICAgICBldmFsdWF0b3IucmVwb3J0KAogICAgICAgICAga2V5Q29udGV4dCwKICAgICAgICAgIHRlbXBsYXRlQ29uc3RFdmFsRHVwbGljYXRlS2V5LndpdGhBcmd1bWVudHMoCiAgICAgICAgICAgICAga2V5LCBldmFsdWF0b3IuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkpOwogICAgfQogICAgbGFzdFBhcnQuYWRkKG5ldyBDb25zdGFudE1hcEVudHJ5KAogICAgICAgIGV2YWx1YXRvci5lbnN1cmVJc1N1YnR5cGUoa2V5LCBrZXlUeXBlLCBrZXlDb250ZXh0KSwKICAgICAgICBldmFsdWF0b3IuZW5zdXJlSXNTdWJ0eXBlKHZhbHVlLCB2YWx1ZVR5cGUsIHZhbHVlQ29udGV4dCkpKTsKICB9CgogIENvbnN0YW50IGJ1aWxkKCkgewogICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIC8vIEZ1bGx5IGV2YWx1YXRlZAogICAgICByZXR1cm4gZXZhbHVhdG9yCiAgICAgICAgICAubG93ZXJNYXBDb25zdGFudChuZXcgTWFwQ29uc3RhbnQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJ0cy5zaW5nbGUpKTsKICAgIH0KICAgIExpc3Q8RXhwcmVzc2lvbj4gbWFwcyA9IDxFeHByZXNzaW9uPltdOwogICAgZm9yIChPYmplY3QgcGFydCBpbiBwYXJ0cykgewogICAgICBpZiAocGFydCBpcyBMaXN0PENvbnN0YW50TWFwRW50cnk+KSB7CiAgICAgICAgbWFwcy5hZGQoCiAgICAgICAgICAgIG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IE1hcENvbnN0YW50KGtleVR5cGUsIHZhbHVlVHlwZSwgcGFydCkpKTsKICAgICAgfSBlbHNlIGlmIChwYXJ0IGlzIENvbnN0YW50KSB7CiAgICAgICAgbWFwcy5hZGQoZXZhbHVhdG9yLmV4dHJhY3QocGFydCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93ICdOb24tY29uc3RhbnQgaW4gY29uc3RhbnQgbWFwJzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV2YWx1YXRvci51bmV2YWx1YXRlZChvcmlnaW5hbCwKICAgICAgICBuZXcgTWFwQ29uY2F0ZW5hdGlvbihtYXBzLCBrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSkpOwogIH0KfQqBGwBOTjwBIwFBJR0eAUxFLwFOASwBRyFDKSdBDSYGBAEwFk8pHBkzFUUNIB4kIioiDyUhRQgoLggGBAE5ARQCAUsXTjEBDDgwAQw6HSgdDSoGTQQBDBUdGRdLBi0hJFAlLA8vCAYiTAQCAUk7ARZOMQEMNy8BDDoyGBNBPAYfGBM7PAYBHSgdDSoGTQQBDBUdGS1CIzI4MxpICkNLIBQiSRomOhEPMwgGLCEkTiUrDy4IBiJKBAIBGyUdGhwBT043AT8BFkQBRh9CRiknFxpQIA07BgQBMBZPKRwZMxVFDSAjORdLCg8dIT8IBgQBRh8lMB0NMgYtGBY9NwYeGBY3NwYnPUUEARUdGRdQBiwhLBJQJSsPLggGK00EAgFEcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdGFudF9jb2xsZWN0aW9uX2J1aWxkZXJzLmRhcnRkZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9jb25zdGFudHMuZGFydIONLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEua2VybmVsX2NvbnN0YW50czsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgSW52YWxpZEV4cHJlc3Npb247CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2U7CgppbXBvcnQgJy4uL2xvYWRlci5kYXJ0JyBzaG93IExvYWRlcjsKCmltcG9ydCAnY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQnIHNob3cgRXJyb3JSZXBvcnRlcjsKCmNsYXNzIEtlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlciBleHRlbmRzIEVycm9yUmVwb3J0ZXIgewogIGZpbmFsIExvYWRlciBsb2FkZXI7CgogIEtlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlcih0aGlzLmxvYWRlcik7CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0KExvY2F0ZWRNZXNzYWdlIG1lc3NhZ2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQpIHsKICAgIGxvYWRlci5hZGRQcm9ibGVtKAogICAgICAgIG1lc3NhZ2UubWVzc2FnZU9iamVjdCwgbWVzc2FnZS5jaGFyT2Zmc2V0LCBtZXNzYWdlLmxlbmd0aCwgbWVzc2FnZS51cmksCiAgICAgICAgY29udGV4dDogY29udGV4dCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHJlcG9ydEludmFsaWRFeHByZXNzaW9uKEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKICAgIC8vIEFzc3VtZWQgdG8gYmUgYWxyZWFkeSByZXBvcnRlZC4KICB9Cn0KIQBOTjwBIAE5ATIBJQE1AToXASwBDEYXUBsEAQw5JwQCAThwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9jb25zdGFudHMuZGFydGZmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnSCuy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2tlcm5lbC5kYXJ0JyBzaG93IE1lbWJlciwgTWV0YWRhdGFSZXBvc2l0b3J5LCBOYW1lZE5vZGU7CgovLy8gVGhlIGNvbGxlY3RvciB0byBhZGQgdGFyZ2V0IHNwZWNpZmljIG1ldGFkYXRhIHRvLgphYnN0cmFjdCBjbGFzcyBNZXRhZGF0YUNvbGxlY3RvciB7CiAgLy8vIE1ldGFkYXRhIGlzIHJlbWVtYmVyZWQgaW4gdGhpcyByZXBvc2l0b3J5LCBzbyB0aGF0IHdoZW4gaXQgaXMgYWRkZWQKICAvLy8gdG8gYSBjb21wb25lbnQsIG1ldGFkYXRhIGlzIHNlcmlhbGl6ZWQgd2l0aCB0aGUgY29tcG9uZW50LgogIE1ldGFkYXRhUmVwb3NpdG9yeTxkeW5hbWljPiBnZXQgcmVwb3NpdG9yeTsKCiAgdm9pZCBzZXRDb25zdHJ1Y3Rvck5hbWVPZmZzZXQoTWVtYmVyIG5vZGUsIE9iamVjdCBuYW1lKTsKCiAgdm9pZCBzZXREb2N1bWVudGF0aW9uQ29tbWVudChOYW1lZE5vZGUgbm9kZSwgU3RyaW5nIGNvbW1lbnQpOwp9ChIATk48AVABNiNKQS4BOwFAAgE6cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9tZXRhZGF0YV9jb2xsZWN0b3IuZGFydGpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvdXRpbC9yZXNvbHZlX3JlbGF0aXZlX3VyaS5kYXJ0g7wvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqIFJlc29sdmUgdGhlIFtjb250YWluZWRVcmldIGFnYWluc3QgW2Jhc2VVcmldIHVzaW5nIERhcnQgcnVsZXMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBzaW1pbGFybHkgdG8gW1VyaS5yZXNvbHZlVXJpXSwgZXhjZXB0IHRoYXQgaXQgcHJvcGVybHkKICogaGFuZGxlcyBzaXR1YXRpb25zIGxpa2UgdGhlIGZvbGxvd2luZzoKICoKICogICAgIHJlc29sdmVSZWxhdGl2ZVVyaShkYXJ0OmNvcmUsIGJvb2wuZGFydCkgLT4gZGFydDpjb3JlL2Jvb2wuZGFydAogKiAgICAgcmVzb2x2ZVJlbGF0aXZlVXJpKHBhY2thZ2U6YS9iLmRhcnQsIC4uL2MuZGFydCkgLT4gcGFja2FnZTphL2MuZGFydAogKi8KVXJpIHJlc29sdmVSZWxhdGl2ZVVyaShVcmkgYmFzZVVyaSwgVXJpIGNvbnRhaW5lZFVyaSkgewogIGlmIChjb250YWluZWRVcmkuaXNBYnNvbHV0ZSkgewogICAgcmV0dXJuIGNvbnRhaW5lZFVyaTsKICB9CiAgU3RyaW5nIHNjaGVtZSA9IGJhc2VVcmkuc2NoZW1lOwogIC8vIGRhcnQ6Y29yZSA9PiBkYXJ0OmNvcmUvY29yZS5kYXJ0CiAgaWYgKHNjaGVtZSA9PSAnZGFydCcpIHsKICAgIFN0cmluZyBwYXJ0ID0gYmFzZVVyaS5wYXRoOwogICAgaWYgKHBhcnQuaW5kZXhPZignLycpIDwgMCkgewogICAgICBiYXNlVXJpID0gVXJpLnBhcnNlKCckc2NoZW1lOiRwYXJ0LyRwYXJ0LmRhcnQnKTsKICAgIH0KICB9CiAgcmV0dXJuIGJhc2VVcmkucmVzb2x2ZVVyaShjb250YWluZWRVcmkpOwp9Ch0ATk48AQRCA1AqA0dLBDghGQQiJhogITcGBCsCAT5wYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvcmVzb2x2ZV9yZWxhdGl2ZV91cmkuZGFydGlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnSEcC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmJ1aWx0aW5fdHlwZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBEYXJ0VHlwZSwgTnVsbGFiaWxpdHk7CgppbXBvcnQgJ2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICdudWxsYWJpbGl0eV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAndHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwoKYWJzdHJhY3QgY2xhc3MgQnVpbHRpblR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uQnVpbGRlckltcGwgewogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIEJ1aWx0aW5UeXBlQnVpbGRlcigKICAgICAgU3RyaW5nIG5hbWUsIHRoaXMudHlwZSwgTGlicmFyeUJ1aWxkZXIgY29tcGlsYXRpb25Vbml0LCBpbnQgY2hhck9mZnNldCkKICAgICAgOiBzdXBlcihudWxsLCAwLCBuYW1lLCBjb21waWxhdGlvblVuaXQsIGNoYXJPZmZzZXQpOwoKICBEYXJ0VHlwZSBidWlsZFR5cGUoTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwKICAgICAgTnVsbGFiaWxpdHlCdWlsZGVyIG51bGxhYmlsaXR5QnVpbGRlciwgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzKSB7CiAgICAvLyBUT0RPKGRtaXRyeWFzKTogVXNlIFtudWxsYWJpbGl0eUJ1aWxkZXJdLgogICAgcmV0dXJuIHR5cGU7CiAgfQoKICBEYXJ0VHlwZSBidWlsZFR5cGVzV2l0aEJ1aWx0QXJndW1lbnRzKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksCiAgICAgIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5LCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMpIHsKICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBVc2UgW251bGxhYmlsaXR5XS4KICAgIHJldHVybiB0eXBlOwogIH0KCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gIkJ1aWx0aW5UeXBlQnVpbGRlciI7Cn0KJQBOTjwBJAE9AR8jHAEoAUcXARZOOwEtTDERBAFAOyoRBAEwAgE9cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvYnVpbHRpbl90eXBlX2J1aWxkZXIuZGFydG5maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydIiwLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEubWl4aW5fYXBwbGljYXRpb25fYnVpbGRlcjsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgSW50ZXJmYWNlVHlwZSwgU3VwZXJ0eXBlLCBUeXBlZGVmVHlwZTsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bnN1cHBvcnRlZDsKCmltcG9ydCAnbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAndHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJ3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIE1peGluQXBwbGljYXRpb25CdWlsZGVyIGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIGZpbmFsIFR5cGVCdWlsZGVyIHN1cGVydHlwZTsKICBmaW5hbCBMaXN0PFR5cGVCdWlsZGVyPiBtaXhpbnM7CiAgU3VwZXJ0eXBlIGJ1aWx0VHlwZTsKCiAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzOwoKICBNaXhpbkFwcGxpY2F0aW9uQnVpbGRlcih0aGlzLnN1cGVydHlwZSwgdGhpcy5taXhpbnMpOwoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gbnVsbDsKCiAgTnVsbGFiaWxpdHlCdWlsZGVyIGdldCBudWxsYWJpbGl0eUJ1aWxkZXIgewogICAgcmV0dXJuIHVuc3VwcG9ydGVkKCJudWxsYWJpbGl0eUJ1aWxkZXIiLCAtMSwgbnVsbCk7CiAgfQoKICBTdHJpbmcgZ2V0IGRlYnVnTmFtZSA9PiAiTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIiOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUoc3VwZXJ0eXBlKTsKICAgIGJ1ZmZlci53cml0ZSgiIHdpdGggIik7CiAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgIGZvciAoVHlwZUJ1aWxkZXIgdCBpbiBtaXhpbnMpIHsKICAgICAgaWYgKCFmaXJzdCkgYnVmZmVyLndyaXRlKCIsICIpOwogICAgICBmaXJzdCA9IGZhbHNlOwogICAgICB0LnByaW50T24oYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGJ1aWxkKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIFtUeXBlZGVmVHlwZSBvcmlnaW5dKSB7CiAgICBpbnQgY2hhck9mZnNldCA9IC0xOyAvLyBUT0RPKGFoZSk6IFByb3ZpZGUgdGhlc2UuCiAgICBVcmkgZmlsZVVyaSA9IG51bGw7IC8vIFRPRE8oYWhlKTogUHJvdmlkZSB0aGVzZS4KICAgIHJldHVybiB1bnN1cHBvcnRlZCgiYnVpbGQiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIFN1cGVydHlwZSBidWlsZFN1cGVydHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkU3VwZXJ0eXBlIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBTdXBlcnR5cGUgYnVpbGRNaXhlZEluVHlwZSgKICAgICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSwgaW50IGNoYXJPZmZzZXQsIFVyaSBmaWxlVXJpKSB7CiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImJ1aWxkTWl4ZWRJblR5cGUiLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIE1peGluQXBwbGljYXRpb25CdWlsZGVyIHdpdGhOdWxsYWJpbGl0eUJ1aWxkZXIoCiAgICAgIE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIpIHsKICAgIHJldHVybiB1bnN1cHBvcnRlZCgid2l0aE51bGxhYmlsaXR5QnVpbGRlciIsIC0xLCBudWxsKTsKICB9CgogIE1peGluQXBwbGljYXRpb25CdWlsZGVyIGNsb25lKExpc3Q8VHlwZUJ1aWxkZXI+IG5ld1R5cGVzKSB7CiAgICBpbnQgY2hhck9mZnNldCA9IC0xOyAvLyBUT0RPKGRtaXRyeWFzKTogUHJvdmlkZSB0aGVzZS4KICAgIFVyaSBmaWxlVXJpID0gbnVsbDsgLy8gVE9ETyhkbWl0cnlhcyk6IFByb3ZpZGUgdGhlc2UuCiAgICByZXR1cm4gdW5zdXBwb3J0ZWQoImNsb25lIiwgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQp9Ck0ATk48ASkBTQEsAR8jHCUBNB8iFwErATgBGwEuOAQBNQEuHRwXJCYVGQYTBAEMRjY1NgQBDBw9PwQBDB49QQQBDDIvPAQBPjs6NgQCAUJwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnRsZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9leHRlbnNpb25fYnVpbGRlci5kYXJ0oHMvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgTWFwRW50cnk7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKCmltcG9ydCAnLi4vLi4vYmFzZS9jb21tb24uZGFydCc7CgppbXBvcnQgJy4uL2J1aWxkZXIvYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9leHRlbnNpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWV0YWRhdGFfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBtZXNzYWdlUGF0Y2hEZWNsYXJhdGlvbk1pc21hdGNoLAogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLAogICAgICAgIG5vTGVuZ3RoLAogICAgICAgIHRlbXBsYXRlQ29uZmxpY3RzV2l0aE1lbWJlciwKICAgICAgICB0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIsCiAgICAgICAgdGVtcGxhdGVFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyOwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JzsKCmltcG9ydCAnLi4vc2NvcGUuZGFydCc7CgppbXBvcnQgJ3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CgpjbGFzcyBTb3VyY2VFeHRlbnNpb25CdWlsZGVyIGV4dGVuZHMgRXh0ZW5zaW9uQnVpbGRlckltcGwgewogIGZpbmFsIEV4dGVuc2lvbiBfZXh0ZW5zaW9uOwoKICBTb3VyY2VFeHRlbnNpb25CdWlsZGVyIF9vcmlnaW47CiAgU291cmNlRXh0ZW5zaW9uQnVpbGRlciBwYXRjaEZvclRlc3Rpbmc7CgogIFNvdXJjZUV4dGVuc2lvbkJ1aWxkZXIoCiAgICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSwKICAgICAgaW50IG1vZGlmaWVycywKICAgICAgU3RyaW5nIG5hbWUsCiAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIFR5cGVCdWlsZGVyIG9uVHlwZSwKICAgICAgU2NvcGUgc2NvcGUsCiAgICAgIExpYnJhcnlCdWlsZGVyIHBhcmVudCwKICAgICAgaW50IHN0YXJ0T2Zmc2V0LAogICAgICBpbnQgbmFtZU9mZnNldCwKICAgICAgaW50IGVuZE9mZnNldCwKICAgICAgRXh0ZW5zaW9uIHJlZmVyZW5jZUZyb20pCiAgICAgIDogX2V4dGVuc2lvbiA9IG5ldyBFeHRlbnNpb24oCiAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgIGZpbGVVcmk6IHBhcmVudC5maWxlVXJpLAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyczoKICAgICAgICAgICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIudHlwZVBhcmFtZXRlcnNGcm9tQnVpbGRlcnModHlwZVBhcmFtZXRlcnMpLAogICAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUZyb20/LnJlZmVyZW5jZSkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5hbWVPZmZzZXQsCiAgICAgICAgc3VwZXIobWV0YWRhdGEsIG1vZGlmaWVycywgbmFtZSwgcGFyZW50LCBuYW1lT2Zmc2V0LCBzY29wZSwKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMsIG9uVHlwZSk7CgogIEBvdmVycmlkZQogIFNvdXJjZUV4dGVuc2lvbkJ1aWxkZXIgZ2V0IG9yaWdpbiA9PiBfb3JpZ2luID8/IHRoaXM7CgogIEV4dGVuc2lvbiBnZXQgZXh0ZW5zaW9uID0+IGlzUGF0Y2ggPyBvcmlnaW4uX2V4dGVuc2lvbiA6IF9leHRlbnNpb247CgogIC8vLyBCdWlsZHMgdGhlIFtFeHRlbnNpb25dIGZvciB0aGlzIGV4dGVuc2lvbiBidWlsZCBhbmQgaW5zZXJ0cyB0aGUgbWVtYmVycwogIC8vLyBpbnRvIHRoZSBbTGlicmFyeV0gb2YgW2xpYnJhcnlCdWlsZGVyXS4KICAvLy8KICAvLy8gW2FkZE1lbWJlcnNUb0xpYnJhcnldIGlzIGB0cnVlYCBpZiB0aGUgZXh0ZW5zaW9uIG1lbWJlcnMgc2hvdWxkIGJlIGFkZGVkCiAgLy8vIHRvIHRoZSBsaWJyYXJ5LiBUaGlzIGlzIGBmYWxzZWAgaWYgdGhlIGV4dGVuc2lvbiBpcyBpbiBjb25mbGljdCB3aXRoCiAgLy8vIGFub3RoZXIgbGlicmFyeSBtZW1iZXIuIEluIHRoaXMgY2FzZSwgdGhlIGV4dGVuc2lvbiBtZW1iZXIgc2hvdWxkIG5vdCBiZQogIC8vLyBhZGRlZCB0byB0aGUgbGlicmFyeSB0byBhdm9pZCBuYW1lIGNsYXNoZXMgd2l0aCBvdGhlciBtZW1iZXJzIGluIHRoZQogIC8vLyBsaWJyYXJ5LgogIEV4dGVuc2lvbiBidWlsZCgKICAgICAgU291cmNlTGlicmFyeUJ1aWxkZXIgbGlicmFyeUJ1aWxkZXIsIExpYnJhcnlCdWlsZGVyIGNvcmVMaWJyYXJ5LAogICAgICB7Ym9vbCBhZGRNZW1iZXJzVG9MaWJyYXJ5fSkgewogICAgQ2xhc3NCdWlsZGVyIG9iamVjdENsYXNzQnVpbGRlciA9CiAgICAgICAgY29yZUxpYnJhcnkubG9va3VwTG9jYWxNZW1iZXIoJ09iamVjdCcsIHJlcXVpcmVkOiB0cnVlKTsKICAgIHZvaWQgYnVpbGRCdWlsZGVycyhTdHJpbmcgbmFtZSwgQnVpbGRlciBkZWNsYXJhdGlvbikgewogICAgICBkbyB7CiAgICAgICAgQnVpbGRlciBvYmplY3RHZXR0ZXIgPSBvYmplY3RDbGFzc0J1aWxkZXIubG9va3VwTG9jYWxNZW1iZXIobmFtZSk7CiAgICAgICAgQnVpbGRlciBvYmplY3RTZXR0ZXIgPQogICAgICAgICAgICBvYmplY3RDbGFzc0J1aWxkZXIubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgICAgICBpZiAob2JqZWN0R2V0dGVyICE9IG51bGwgfHwgb2JqZWN0U2V0dGVyICE9IG51bGwpIHsKICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgdGVtcGxhdGVFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUpLAogICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgbmFtZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICBpZiAoZGVjbGFyYXRpb24ucGFyZW50ICE9IHRoaXMpIHsKICAgICAgICAgIGlmIChmaWxlVXJpICE9IGRlY2xhcmF0aW9uLnBhcmVudC5maWxlVXJpKSB7CiAgICAgICAgICAgIHVuZXhwZWN0ZWQoIiRmaWxlVXJpIiwgIiR7ZGVjbGFyYXRpb24ucGFyZW50LmZpbGVVcml9IiwgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGZpbGVVcmkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdW5leHBlY3RlZChmdWxsTmFtZUZvckVycm9ycywgZGVjbGFyYXRpb24ucGFyZW50Py5mdWxsTmFtZUZvckVycm9ycywKICAgICAgICAgICAgICAgIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24gaXMgTWVtYmVyQnVpbGRlckltcGwpIHsKICAgICAgICAgIE1lbWJlckJ1aWxkZXJJbXBsIG1lbWJlckJ1aWxkZXIgPSBkZWNsYXJhdGlvbjsKICAgICAgICAgIG1lbWJlckJ1aWxkZXIuYnVpbGRNZW1iZXJzKGxpYnJhcnlCdWlsZGVyLAogICAgICAgICAgICAgIChNZW1iZXIgbWVtYmVyLCBCdWlsdE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgICAgICAgICBpZiAoYWRkTWVtYmVyc1RvTGlicmFyeSAmJgogICAgICAgICAgICAgICAgIW1lbWJlckJ1aWxkZXIuaXNQYXRjaCAmJgogICAgICAgICAgICAgICAgIW1lbWJlckJ1aWxkZXIuaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgICBFeHRlbnNpb25NZW1iZXJLaW5kIGtpbmQ7CiAgICAgICAgICAgICAgc3dpdGNoIChtZW1iZXJLaW5kKSB7CiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0TWVtYmVyS2luZC5Db25zdHJ1Y3RvcjoKICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRNZW1iZXJLaW5kLlJlZGlyZWN0aW5nRmFjdG9yeToKICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRNZW1iZXJLaW5kLkZpZWxkOgogICAgICAgICAgICAgICAgY2FzZSBCdWlsdE1lbWJlcktpbmQuTWV0aG9kOgogICAgICAgICAgICAgICAgICB1bmhhbmRsZWQoCiAgICAgICAgICAgICAgICAgICAgICAiJHttZW1iZXIucnVudGltZVR5cGV9OiR7bWVtYmVyS2luZH0iLAogICAgICAgICAgICAgICAgICAgICAgImJ1aWxkTWVtYmVycyIsCiAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uRmllbGQ6CiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0TWVtYmVyS2luZC5MYXRlSXNTZXRGaWVsZDoKICAgICAgICAgICAgICAgICAga2luZCA9IEV4dGVuc2lvbk1lbWJlcktpbmQuRmllbGQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uTWV0aG9kOgogICAgICAgICAgICAgICAgICBraW5kID0gRXh0ZW5zaW9uTWVtYmVyS2luZC5NZXRob2Q7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uR2V0dGVyOgogICAgICAgICAgICAgICAgY2FzZSBCdWlsdE1lbWJlcktpbmQuTGF0ZUdldHRlcjoKICAgICAgICAgICAgICAgICAga2luZCA9IEV4dGVuc2lvbk1lbWJlcktpbmQuR2V0dGVyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvblNldHRlcjoKICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRNZW1iZXJLaW5kLkxhdGVTZXR0ZXI6CiAgICAgICAgICAgICAgICAgIGtpbmQgPSBFeHRlbnNpb25NZW1iZXJLaW5kLlNldHRlcjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0TWVtYmVyS2luZC5FeHRlbnNpb25PcGVyYXRvcjoKICAgICAgICAgICAgICAgICAga2luZCA9IEV4dGVuc2lvbk1lbWJlcktpbmQuT3BlcmF0b3I7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uVGVhck9mZjoKICAgICAgICAgICAgICAgICAga2luZCA9IEV4dGVuc2lvbk1lbWJlcktpbmQuVGVhck9mZjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFzc2VydChraW5kICE9IG51bGwpOwogICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkuYWRkTWVtYmVyKG1lbWJlcik7CiAgICAgICAgICAgICAgZXh0ZW5zaW9uLm1lbWJlcnMuYWRkKG5ldyBFeHRlbnNpb25NZW1iZXJEZXNjcmlwdG9yKAogICAgICAgICAgICAgICAgICBuYW1lOiBuZXcgTmFtZShtZW1iZXJCdWlsZGVyLm5hbWUsIGxpYnJhcnlCdWlsZGVyLmxpYnJhcnkpLAogICAgICAgICAgICAgICAgICBtZW1iZXI6IG1lbWJlci5yZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgIGlzU3RhdGljOiBkZWNsYXJhdGlvbi5pc1N0YXRpYywKICAgICAgICAgICAgICAgICAga2luZDoga2luZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdW5oYW5kbGVkKCIke2RlY2xhcmF0aW9uLnJ1bnRpbWVUeXBlfSIsICJidWlsZEJ1aWxkZXJzIiwKICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LCBkZWNsYXJhdGlvbi5maWxlVXJpKTsKICAgICAgICB9CiAgICAgICAgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5uZXh0OwogICAgICB9IHdoaWxlIChkZWNsYXJhdGlvbiAhPSBudWxsKTsKICAgIH0KCiAgICBzY29wZS5mb3JFYWNoKGJ1aWxkQnVpbGRlcnMpOwoKICAgIHNjb3BlLmZvckVhY2hMb2NhbFNldHRlcigoU3RyaW5nIG5hbWUsIE1lbWJlckJ1aWxkZXIgc2V0dGVyKSB7CiAgICAgIEJ1aWxkZXIgbWVtYmVyID0gc2NvcGVCdWlsZGVyW25hbWVdOwogICAgICBpZiAobWVtYmVyID09IG51bGwpIHsKICAgICAgICAvLyBTZXR0ZXIgd2l0aG91dCBnZXR0ZXIuCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGJvb2wgY29uZmxpY3QgPSBtZW1iZXIuaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyICE9CiAgICAgICAgICBzZXR0ZXIuaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyOwogICAgICBpZiAobWVtYmVyLmlzRmllbGQpIHsKICAgICAgICBpZiAoIW1lbWJlci5pc0NvbnN0ICYmICFtZW1iZXIuaXNGaW5hbCkgewogICAgICAgICAgLy8gU2V0dGVyIHdpdGggd3JpdGFibGUgZmllbGQuCiAgICAgICAgICBjb25mbGljdCA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc1JlZ3VsYXJNZXRob2QpIHsKICAgICAgICAvLyBTZXR0ZXIgd2l0aCBtZXRob2QuCiAgICAgICAgY29uZmxpY3QgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChjb25mbGljdCkgewogICAgICAgIGFkZFByb2JsZW0odGVtcGxhdGVDb25mbGljdHNXaXRoTWVtYmVyLndpdGhBcmd1bWVudHMobmFtZSksCiAgICAgICAgICAgIHNldHRlci5jaGFyT2Zmc2V0LCBub0xlbmd0aCk7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBDb250ZXh0IGFyZ3VtZW50IHRvIHByZXZpb3VzIG1lc3NhZ2U/CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXIud2l0aEFyZ3VtZW50cyhuYW1lKSwKICAgICAgICAgICAgbWVtYmVyLmNoYXJPZmZzZXQsIG5vTGVuZ3RoKTsKICAgICAgfQogICAgfSk7CgogICAgX2V4dGVuc2lvbi5vblR5cGUgPSBvblR5cGU/LmJ1aWxkKGxpYnJhcnlCdWlsZGVyKTsKCiAgICByZXR1cm4gX2V4dGVuc2lvbjsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYXBwbHlQYXRjaChCdWlsZGVyIHBhdGNoKSB7CiAgICBpZiAocGF0Y2ggaXMgU291cmNlRXh0ZW5zaW9uQnVpbGRlcikgewogICAgICBwYXRjaC5fb3JpZ2luID0gdGhpczsKICAgICAgaWYgKHJldGFpbkRhdGFGb3JUZXN0aW5nKSB7CiAgICAgICAgcGF0Y2hGb3JUZXN0aW5nID0gcGF0Y2g7CiAgICAgIH0KICAgICAgc2NvcGUuZm9yRWFjaExvY2FsTWVtYmVyKChTdHJpbmcgbmFtZSwgQnVpbGRlciBtZW1iZXIpIHsKICAgICAgICBCdWlsZGVyIG1lbWJlclBhdGNoID0KICAgICAgICAgICAgcGF0Y2guc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiBmYWxzZSk7CiAgICAgICAgaWYgKG1lbWJlclBhdGNoICE9IG51bGwpIHsKICAgICAgICAgIG1lbWJlci5hcHBseVBhdGNoKG1lbWJlclBhdGNoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBzY29wZS5mb3JFYWNoTG9jYWxTZXR0ZXIoKFN0cmluZyBuYW1lLCBCdWlsZGVyIG1lbWJlcikgewogICAgICAgIEJ1aWxkZXIgbWVtYmVyUGF0Y2ggPSBwYXRjaC5zY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IHRydWUpOwogICAgICAgIGlmIChtZW1iZXJQYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICBtZW1iZXIuYXBwbHlQYXRjaChtZW1iZXJQYXRjaCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IENoZWNrIHRoYXQgdHlwZSBwYXJhbWV0ZXJzIGFuZCBvbi10eXBlIG1hdGNoCiAgICAgIC8vIHdpdGggb3JpZ2luIGRlY2xhcmF0aW9uLgogICAgfSBlbHNlIHsKICAgICAgbGlicmFyeS5hZGRQcm9ibGVtKG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2gsIHBhdGNoLmNoYXJPZmZzZXQsCiAgICAgICAgICBub0xlbmd0aCwgcGF0Y2guZmlsZVVyaSwgY29udGV4dDogWwogICAgICAgIG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uT3JpZ2luLndpdGhMb2NhdGlvbigKICAgICAgICAgICAgZmlsZVVyaSwgY2hhck9mZnNldCwgbm9MZW5ndGgpCiAgICAgIF0pOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgaW50IGZpbmlzaFBhdGNoKCkgewogICAgaWYgKCFpc1BhdGNoKSByZXR1cm4gMDsKCiAgICBpbnQgY291bnQgPSAwOwogICAgc2NvcGUuZm9yRWFjaCgoU3RyaW5nIG5hbWUsIEJ1aWxkZXIgZGVjbGFyYXRpb24pIHsKICAgICAgY291bnQgKz0gZGVjbGFyYXRpb24uZmluaXNoUGF0Y2goKTsKICAgIH0pOwogICAgcmV0dXJuIGNvdW50OwogIH0KfQqA7ABOTjwBIgEiASEBIigsKikrJzABHQkpJxIlJToBGwEYASYBPB4BIioBGiYVEzAaEx0XFhUfJBglHFAxJUQlAQw4AUcBTi4GT0tPSw8TRyQmQTsLSx9GPBY/KCYcCio3UBoTUSYMNzk1PCcqLigkMjksLR09Ji4sGTU1NBk2NRk2MTUZNjE1GTg3GTc2GRAkOENOLDIgDg4RQzwKKCUGASIBQyscIhAIPC4cMikbCisfGQgWRCo8RCoICAE3ARcEAQwjKxwiIQg/HkAjKgoKP1EjKgoKAUsiDUwuNCsKBgQBDBYcARM3KggSBAIBQHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2V4dGVuc2lvbl9idWlsZGVyLmRhcnRgZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9saXN0ZW5lci5kYXJ0wADECS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLmxpc3RlbmVyOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy9jb2Rlcy5kYXJ0JwogICAgc2hvdyBNZXNzYWdlLCBNZXNzYWdlQ29kZSwgdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZDsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICcuLi9zY2FubmVyL2Vycm9yX3Rva2VuLmRhcnQnIHNob3cgRXJyb3JUb2tlbjsKCmltcG9ydCAnYXNzZXJ0LmRhcnQnIHNob3cgQXNzZXJ0OwoKaW1wb3J0ICdibG9ja19raW5kLmRhcnQnIHNob3cgQmxvY2tLaW5kOwoKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2tpbmQuZGFydCcgc2hvdyBGb3JtYWxQYXJhbWV0ZXJLaW5kOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCcgc2hvdyBJZGVudGlmaWVyQ29udGV4dDsKCmltcG9ydCAnZGVjbGFyYXRpb25fa2luZC5kYXJ0JyBzaG93IERlY2xhcmF0aW9uS2luZDsKCmltcG9ydCAnbWVtYmVyX2tpbmQuZGFydCcgc2hvdyBNZW1iZXJLaW5kOwoKYWJzdHJhY3QgY2xhc3MgVW5lc2NhcGVFcnJvckxpc3RlbmVyIHsKICB2b2lkIGhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgY292YXJpYW50IGxvY2F0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKfQoKLy8vIEEgcGFyc2VyIGV2ZW50IGxpc3RlbmVyIHRoYXQgZG9lcyBub3RoaW5nIGV4Y2VwdCB0aHJvdyBleGNlcHRpb25zCi8vLyBvbiBwYXJzZXIgZXJyb3JzLgovLy8KLy8vIEV2ZW50cyBhcmUgbWV0aG9kcyB0aGF0IGJlZ2luIHdpdGggb25lIG9mOiBgYmVnaW5gLCBgZW5kYCwgb3IgYGhhbmRsZWAuCi8vLwovLy8gRXZlbnRzIHN0YXJ0aW5nIHdpdGggYGJlZ2luYCBhbmQgYGVuZGAgY29tZSBpbiBwYWlycy4gTm9ybWFsbHksIGEKLy8vIGBiZWdpbkZvb2AgZXZlbnQgaXMgZm9sbG93ZWQgYnkgYW4gYGVuZEZvb2AgZXZlbnQuIFRoZXJlJ3MgYSBmZXcgZXhjZXB0aW9ucwovLy8gZG9jdW1lbnRlZCBiZWxvdy4KLy8vCi8vLyBFdmVudHMgc3RhcnRpbmcgd2l0aCBgaGFuZGxlYCBhcmUgdXNlZCB3aGVuIGlzbid0IHBvc3NpYmxlIHRvIGhhdmUgYSBiZWdpbgovLy8gZXZlbnQuCmNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgVW5lc2NhcGVFcnJvckxpc3RlbmVyIHsKICBVcmkgZ2V0IHVyaSA9PiBudWxsOwoKICB2b2lkIGxvZ0V2ZW50KFN0cmluZyBuYW1lKSB7fQoKICBzZXQgc3VwcHJlc3NQYXJzZUVycm9ycyhib29sIHZhbHVlKSB7fQoKICB2b2lkIGJlZ2luQXJndW1lbnRzKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZEFyZ3VtZW50cyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQXJndW1lbnRzIik7CiAgfQoKICAvLy8gSGFuZGxlIGFzeW5jIG1vZGlmaWVycyBgYXN5bmNgLCBgYXN5bmMqYCwgYHN5bmNgLgogIHZvaWQgaGFuZGxlQXN5bmNNb2RpZmllcihUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJBc3luY01vZGlmaWVyIik7CiAgfQoKICB2b2lkIGJlZ2luQXdhaXRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZEF3YWl0RXhwcmVzc2lvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkF3YWl0RXhwcmVzc2lvbiIpOwogIH0KCiAgdm9pZCBlbmRJbnZhbGlkQXdhaXRFeHByZXNzaW9uKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbiwgTWVzc2FnZUNvZGUgZXJyb3JDb2RlKSB7CiAgICBsb2dFdmVudCgiSW52YWxpZEF3YWl0RXhwcmVzc2lvbiIpOwogIH0KCiAgdm9pZCBiZWdpbkJsb2NrKFRva2VuIHRva2VuLCBCbG9ja0tpbmQgYmxvY2tLaW5kKSB7fQoKICB2b2lkIGVuZEJsb2NrKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBCbG9ja0tpbmQgYmxvY2tLaW5kKSB7CiAgICBsb2dFdmVudCgiQmxvY2siKTsKICB9CgogIC8vLyBDYWxsZWQgdG8gaGFuZGxlIGEgYmxvY2sgdGhhdCBoYXMgYmVlbiBwYXJzZWQgYnV0IGlzIG5vdCBhc3NvY2lhdGVkCiAgLy8vIHdpdGggYW55IHRvcCBsZXZlbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBibG9jawogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2soVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgYmVnaW5DYXNjYWRlKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENhc2NhZGUoKSB7CiAgICBsb2dFdmVudCgiQ2FzY2FkZSIpOwogIH0KCiAgdm9pZCBiZWdpbkNhc2VFeHByZXNzaW9uKFRva2VuIGNhc2VLZXl3b3JkKSB7fQoKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiQ2FzZUV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIHN0YXJ0IG9mIHRoZSBib2R5IG9mIGEgY2xhc3MsIG1peGluIG9yIGV4dGVuc2lvbiBkZWNsYXJhdGlvbgogIC8vLyBiZWdpbm5pbmcgYXQgW3Rva2VuXS4gVGhlIGFjdHVhbCBraW5kIG9mIGRlY2xhcmF0aW9uIGlzIGluZGljYXRlZCBieQogIC8vLyBba2luZF0uCiAgdm9pZCBiZWdpbkNsYXNzT3JNaXhpbkJvZHkoRGVjbGFyYXRpb25LaW5kIGtpbmQsIFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgYSBjbGFzcywgbWl4aW4gb3IgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uLgogIC8vLyBUaGUgb25seSBzdWJzdHJ1Y3R1cmVzIGFyZSB0aGUgY2xhc3MsIG1peGluIG9yIGV4dGVuc2lvbiBtZW1iZXJzLgogIC8vLwogIC8vLyBUaGUgYWN0dWFsIGtpbmQgb2YgZGVjbGFyYXRpb24gaXMgaW5kaWNhdGVkIGJ5IFtraW5kXS4KICB2b2lkIGVuZENsYXNzT3JNaXhpbkJvZHkoCiAgICAgIERlY2xhcmF0aW9uS2luZCBraW5kLCBpbnQgbWVtYmVyQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NPck1peGluQm9keSIpOwogIH0KCiAgLy8vIENhbGxlZCBiZWZvcmUgcGFyc2luZyBhIGNsYXNzIG9yIG5hbWVkIG1peGluIGFwcGxpY2F0aW9uLgogIC8vLwogIC8vLyBBdCB0aGlzIHBvaW50IG9ubHkgdGhlIGBjbGFzc2Aga2V5d29yZCBoYXZlIGJlZW4gc2Vlbiwgc28gd2Uga25vdyBhCiAgLy8vIGRlY2xhcmF0aW9uIGlzIGNvbWluZyBidXQgbm90IGl0cyBuYW1lIG9yIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KICB2b2lkIGJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvblByZWx1ZGUoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uLgogIC8vLyBbYmVnaW5dIG1heSBiZSB0aGUgc2FtZSBhcyBbbmFtZV0sIG9yIG1heSBwb2ludCB0byBtb2RpZmllcnMKICAvLy8gKG9yIGV4dHJhbmVvdXMgbW9kaWZpZXJzIGluIHRoZSBjYXNlIG9mIHJlY292ZXJ5KSBwcmVjZWRpbmcgW25hbWVdLgogIC8vLwogIC8vLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgcGFyc2VkIHRoZSBuYW1lIGFuZCB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCiAgdm9pZCBiZWdpbkNsYXNzRGVjbGFyYXRpb24oVG9rZW4gYmVnaW4sIFRva2VuIGFic3RyYWN0VG9rZW4sIFRva2VuIG5hbWUpIHt9CgogIC8vLyBIYW5kbGUgYW4gZXh0ZW5kcyBjbGF1c2UgaW4gYSBjbGFzcyBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBzdXBlcnR5cGUgKG1heSBiZSBhIG1peGluIGFwcGxpY2F0aW9uKQogIHZvaWQgaGFuZGxlQ2xhc3NFeHRlbmRzKFRva2VuIGV4dGVuZHNLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NFeHRlbmRzIik7CiAgfQoKICAvLy8gSGFuZGxlIGFuIGltcGxlbWVudHMgY2xhdXNlIGluIGEgY2xhc3Mgb3IgbWl4aW4gZGVjbGFyYXRpb24uCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gaW1wbGVtZW50ZWQgdHlwZXMKICB2b2lkIGhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBpbnQgaW50ZXJmYWNlc0NvdW50KSB7CiAgICBsb2dFdmVudCgiQ2xhc3NJbXBsZW1lbnRzIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBoZWFkZXIgb2YgYSBjbGFzcyBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtb2RpZmllcnMKICAvLy8gLSBjbGFzcyBuYW1lCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBzdXBlcnR5cGUKICAvLy8gLSB3aXRoIGNsYXVzZQogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgLy8vIC0gbmF0aXZlIGNsYXVzZQogIHZvaWQgaGFuZGxlQ2xhc3NIZWFkZXIoVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCwgVG9rZW4gbmF0aXZlVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDbGFzc0hlYWRlciIpOwogIH0KCiAgLy8vIEhhbmRsZSByZWNvdmVyeSBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcyBoZWFkZXIuCiAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhZnRlciBbaGFuZGxlQ2xhc3NIZWFkZXJdCiAgLy8vIHRvIHJlY292ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByZXZpb3VzIGNsYXNzIGhlYWRlci4KICAvLy8gVGhlIHN1YnN0cnVjdHVyZXMgYXJlIGEgc3Vic2V0IG9mCiAgLy8vIGFuZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBbaGFuZGxlQ2xhc3NIZWFkZXJdOgogIC8vLyAtIHN1cGVydHlwZQogIC8vLyAtIHdpdGggY2xhdXNlCiAgLy8vIC0gaW1wbGVtZW50ZWQgdHlwZXMKICB2b2lkIGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpIHsKICAgIGxvZ0V2ZW50KCJSZWNvdmVyQ2xhc3NIZWFkZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNsYXNzIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBjbGFzcyBoZWFkZXIKICAvLy8gLSBjbGFzcyBib2R5CiAgdm9pZCBlbmRDbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NEZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGEgbWl4aW4gZGVjbGFyYXRpb24uCiAgdm9pZCBiZWdpbk1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5LZXl3b3JkLCBUb2tlbiBuYW1lKSB7fQoKICAvLy8gSGFuZGxlIGFuIG9uIGNsYXVzZSBpbiBhIG1peGluIGRlY2xhcmF0aW9uLiBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVNaXhpbk9uKFRva2VuIG9uS2V5d29yZCwgaW50IHR5cGVDb3VudCkgewogICAgbG9nRXZlbnQoIk1peGluT24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGhlYWRlciBvZiBhIG1peGluIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIG1peGluIG5hbWUKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIG9uIHR5cGVzCiAgLy8vIC0gaW1wbGVtZW50ZWQgdHlwZXMKICB2b2lkIGhhbmRsZU1peGluSGVhZGVyKFRva2VuIG1peGluS2V5d29yZCkgewogICAgbG9nRXZlbnQoIk1peGluSGVhZGVyIik7CiAgfQoKICAvLy8gSGFuZGxlIHJlY292ZXJ5IGFzc29jaWF0ZWQgd2l0aCBhIG1peGluIGhlYWRlci4KICAvLy8gVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFmdGVyIFtoYW5kbGVNaXhpbkhlYWRlcl0KICAvLy8gdG8gcmVjb3ZlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJldmlvdXMgbWl4aW4gaGVhZGVyLgogIC8vLyBUaGUgc3Vic3RydWN0dXJlcyBhcmUgYSBzdWJzZXQgb2YKICAvLy8gYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIFtoYW5kbGVNaXhpbkhlYWRlcl0KICAvLy8gLSBvbiB0eXBlcwogIC8vLyAtIGltcGxlbWVudGVkIHR5cGVzCiAgdm9pZCBoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKSB7CiAgICBsb2dFdmVudCgiUmVjb3Zlck1peGluSGVhZGVyIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBtaXhpbiBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWl4aW4gaGVhZGVyCiAgLy8vIC0gY2xhc3Mgb3IgbWl4aW4gYm9keQogIHZvaWQgZW5kTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiTWl4aW5EZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGFuIGV4dGVuc2lvbiBtZXRob2RzIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLwogIC8vLyBBdCB0aGlzIHBvaW50IG9ubHkgdGhlIGBleHRlbnNpb25gIGtleXdvcmQgaGF2ZSBiZWVuIHNlZW4sIHNvIHdlIGtub3cgYQogIC8vLyBkZWNsYXJhdGlvbiBpcyBjb21pbmcgYnV0IG5vdCBpdHMgbmFtZSBvciB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCiAgdm9pZCBiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uUHJlbHVkZShUb2tlbiBleHRlbnNpb25LZXl3b3JkKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gZXh0ZW5zaW9uIG1ldGhvZHMgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHR5cGUgdmFyaWFibGVzCiAgLy8vCiAgLy8vIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBwYXJzZWQgdGhlIG5hbWUgYW5kIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KICB2b2lkIGJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb24oVG9rZW4gZXh0ZW5zaW9uS2V5d29yZCwgVG9rZW4gbmFtZSkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGFuIGV4dGVuc2lvbiBtZXRob2RzIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBzdWJzdHJ1Y3R1cmVzIGZyb20gW2JlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25dCiAgLy8vIC0gb24gdHlwZQogIC8vLyAtIGJvZHkKICB2b2lkIGVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uKAogICAgICBUb2tlbiBleHRlbnNpb25LZXl3b3JkLCBUb2tlbiBvbktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgnRXh0ZW5zaW9uRGVjbGFyYXRpb24nKTsKICB9CgogIHZvaWQgYmVnaW5Db21iaW5hdG9ycyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRDb21iaW5hdG9ycyhpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJDb21iaW5hdG9ycyIpOwogIH0KCiAgdm9pZCBiZWdpbkNvbXBpbGF0aW9uVW5pdChUb2tlbiB0b2tlbikge30KCiAgLy8vIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3IgYW5hbHl6ZXIgY29tcGF0aWJpbGl0eSBvbmx5CiAgLy8vIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSBhbmFseXplci9mYXN0YSBpbnRlZ3JhdGlvbiBpcyBjb21wbGV0ZS4KICAvLy8KICAvLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBbcGFyc2VEaXJlY3RpdmVzXSBoYXMgcGFyc2VkIGFsbCBkaXJlY3RpdmVzCiAgLy8vIGFuZCBpcyBza2lwcGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlRGlyZWN0aXZlc09ubHkoKSB7fQoKICB2b2lkIGVuZENvbXBpbGF0aW9uVW5pdChpbnQgY291bnQsIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQ29tcGlsYXRpb25Vbml0Iik7CiAgfQoKICB2b2lkIGJlZ2luQ29uc3RMaXRlcmFsKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENvbnN0TGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0TGl0ZXJhbCIpOwogIH0KCiAgdm9pZCBiZWdpbkNvbnN0cnVjdG9yUmVmZXJlbmNlKFRva2VuIHN0YXJ0KSB7fQoKICB2b2lkIGVuZENvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBUb2tlbiBzdGFydCwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDb25zdHJ1Y3RvclJlZmVyZW5jZSIpOwogIH0KCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRG9XaGlsZVN0YXRlbWVudCgKICAgICAgVG9rZW4gZG9LZXl3b3JkLCBUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRG9XaGlsZVN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZERvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRG9XaGlsZVN0YXRlbWVudEJvZHkiKTsKICB9CgogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiV2hpbGVTdGF0ZW1lbnRCb2R5Iik7CiAgfQoKICB2b2lkIGJlZ2luRW51bShUb2tlbiBlbnVtS2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGFuIGVudW0gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gRW51bSBuYW1lIChpZGVudGlmaWVyKQogIC8vLyAtIFtjb3VudF0gdGltZXM6CiAgLy8vICAgLSBFbnVtIHZhbHVlIChpZGVudGlmaWVyKQogIHZvaWQgZW5kRW51bShUb2tlbiBlbnVtS2V5d29yZCwgVG9rZW4gbGVmdEJyYWNlLCBpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJFbnVtIik7CiAgfQoKICB2b2lkIGJlZ2luRXhwb3J0KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYW4gZXhwb3J0IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSB1cmkKICAvLy8gLSBjb25kaXRpb25hbCB1cmlzCiAgLy8vIC0gY29tYmluYXRvcnMKICB2b2lkIGVuZEV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJFeHBvcnQiKTsKICB9CgogIC8vLyBDYWxsZWQgYnkgW1BhcnNlcl0gYWZ0ZXIgcGFyc2luZyBhbiBleHRyYW5lb3VzIGV4cHJlc3Npb24gYXMgZXJyb3IKICAvLy8gcmVjb3ZlcnkuIEZvciBhIHN0YWNrLWJhc2VkIGxpc3RlbmVyLCB0aGUgc3VnZ2VzdGVkIGFjdGlvbiBpcyB0byBkaXNjYXJkCiAgLy8vIGFuIGV4cHJlc3Npb24gZnJvbSB0aGUgc3RhY2suCiAgdm9pZCBoYW5kbGVFeHRyYW5lb3VzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBsb2dFdmVudCgiRXh0cmFuZW91c0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkV4cHJlc3Npb25TdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5GYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBsYXN0Q29uc3VtZWQsIFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIGNvbnN0VG9rZW4pIHt9CgogIHZvaWQgZW5kQ2xhc3NGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDbGFzc0ZhY3RvcnlNZXRob2QiKTsKICB9CgogIHZvaWQgZW5kTWl4aW5GYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBwdXNoIGltcGxlbWVudGF0aW9uIGludG8gc3ViY2xhc3NlcwogICAgZW5kQ2xhc3NGYWN0b3J5TWV0aG9kKGJlZ2luVG9rZW4sIGZhY3RvcnlLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICB2b2lkIGVuZEV4dGVuc2lvbkZhY3RvcnlNZXRob2QoCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGZhY3RvcnlLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IHB1c2ggaW1wbGVtZW50YXRpb24gaW50byBzdWJjbGFzc2VzCiAgICBlbmRDbGFzc0ZhY3RvcnlNZXRob2QoYmVnaW5Ub2tlbiwgZmFjdG9yeUtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIHZvaWQgYmVnaW5Gb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCwgVG9rZW4gcmVxdWlyZWRUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCkge30KCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgIFRva2VuIHRoaXNLZXl3b3JkLAogICAgICBUb2tlbiBwZXJpb2RBZnRlclRoaXMsCiAgICAgIFRva2VuIG5hbWVUb2tlbiwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJTdGFydCwKICAgICAgVG9rZW4gaW5pdGlhbGl6ZXJFbmQsCiAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCwKICAgICAgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICBsb2dFdmVudCgiRm9ybWFsUGFyYW1ldGVyIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBsb2dFdmVudCgiTm9Gb3JtYWxQYXJhbWV0ZXJzIik7CiAgfQoKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7fQoKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgbG9nRXZlbnQoIkZvcm1hbFBhcmFtZXRlcnMiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNsYXNzIGZpZWxkIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIE1vZGlmaWVycwogIC8vLyAtIFR5cGUKICAvLy8gLSBWYXJpYWJsZSBkZWNsYXJhdGlvbnMgKGNvdW50IHRpbWVzKQogIC8vLwogIC8vLyBEb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJlZ2luIGV2ZW50LCB1c2UgW2JlZ2luTWVtYmVyXSBpbnN0ZWFkLgogIHZvaWQgZW5kQ2xhc3NGaWVsZHMoVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZpZWxkcyIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgbWl4aW4gZmllbGQgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gTW9kaWZpZXJzCiAgLy8vIC0gVHlwZQogIC8vLyAtIFZhcmlhYmxlIGRlY2xhcmF0aW9ucyAoY291bnQgdGltZXMpCiAgLy8vCiAgLy8vIERvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYmVnaW4gZXZlbnQsIHVzZSBbYmVnaW5NZW1iZXJdIGluc3RlYWQuCiAgdm9pZCBlbmRNaXhpbkZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcHVzaCBpbXBsZW1lbnRhdGlvbiBpbnRvIHN1YmNsYXNzZXMKICAgIGVuZENsYXNzRmllbGRzKHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLCB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGV4dGVuc2lvbiBmaWVsZCBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBNb2RpZmllcnMKICAvLy8gLSBUeXBlCiAgLy8vIC0gVmFyaWFibGUgZGVjbGFyYXRpb25zIChjb3VudCB0aW1lcykKICAvLy8KICAvLy8gRG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiZWdpbiBldmVudCwgdXNlIFtiZWdpbk1lbWJlcl0gaW5zdGVhZC4KICB2b2lkIGVuZEV4dGVuc2lvbkZpZWxkcygKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgaW50IGNvdW50LAogICAgICBUb2tlbiBiZWdpblRva2VuLAogICAgICBUb2tlbiBlbmRUb2tlbikgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IHB1c2ggaW1wbGVtZW50YXRpb24gaW50byBzdWJjbGFzc2VzCiAgICBlbmRDbGFzc0ZpZWxkcyhzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIGxhdGVUb2tlbiwgdmFyRmluYWxPckNvbnN0LAogICAgICAgIGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICAvLy8gTWFya3MgdGhhdCB0aGUgZ3JhbW1hciB0ZXJtIGBmb3JJbml0aWFsaXplclN0YXRlbWVudGAgaGFzIGJlZW4gcGFyc2VkIGFuZAogIC8vLyBpdCB3YXMgYW4gZW1wdHkgc3RhdGVtZW50LgogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQiKTsKICB9CgogIC8vLyBNYXJrcyB0aGF0IHRoZSBncmFtbWFyIHRlcm0gYGZvckluaXRpYWxpemVyU3RhdGVtZW50YCBoYXMgYmVlbiBwYXJzZWQgYW5kCiAgLy8vIGl0IHdhcyBhbiBleHByZXNzaW9uIHN0YXRlbWVudC4KICB2b2lkIGhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudChUb2tlbiB0b2tlbiwgYm9vbCBmb3JJbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudCIpOwogIH0KCiAgLy8vIE1hcmtzIHRoYXQgdGhlIGdyYW1tYXIgdGVybSBgZm9ySW5pdGlhbGl6ZXJTdGF0ZW1lbnRgIGhhcyBiZWVuIHBhcnNlZCBhbmQKICAvLy8gaXQgd2FzIGEgYGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbmAuCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihUb2tlbiB0b2tlbiwgYm9vbCBmb3JJbikgewogICAgbG9nRXZlbnQoIkZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIik7CiAgfQoKICAvLy8gTWFya3MgdGhlIHN0YXJ0IG9mIGEgZm9yIHN0YXRlbWVudCB3aGljaCBpcyBlbmRlZCBieSBlaXRoZXIKICAvLy8gW2VuZEZvclN0YXRlbWVudF0gb3IgW2VuZEZvckluXS4KICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICAvLy8gTWFya3MgdGhlIGVuZCBvZiBwYXJzaW5nIHRoZSBjb250cm9sIHN0cnVjdHVyZSBvZiBhIGZvciBzdGF0ZW1lbnQKICAvLy8gb3IgZm9yIGNvbnRyb2wgZmxvdyBlbnRyeSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLgogIC8vLyBgZm9yYCBgKGAgaW5pdGlhbGl6YXRpb24gYDtgIGNvbmRpdGlvbiBgO2AgdXBkYXRlcnMgYClgCiAgdm9pZCBoYW5kbGVGb3JMb29wUGFydHMoVG9rZW4gZm9yS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLAogICAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yLCBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50KSB7fQoKICB2b2lkIGVuZEZvclN0YXRlbWVudChUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkZvclN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkZvclN0YXRlbWVudEJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvclN0YXRlbWVudEJvZHkiKTsKICB9CgogIC8vLyBNYXJrcyB0aGUgZW5kIG9mIHBhcnNpbmcgdGhlIGNvbnRyb2wgc3RydWN0dXJlIG9mIGEgZm9yLWluIHN0YXRlbWVudAogIC8vLyBvciBmb3IgY29udHJvbCBmbG93IGVudHJ5IHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMuCiAgLy8vIGBmb3JgIGAoYCAodHlwZSk/IGlkZW50aWZpZXIgYGluYCBpdGVyYXRvciBgKWAKICB2b2lkIGhhbmRsZUZvckluTG9vcFBhcnRzKFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLAogICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsIFRva2VuIGluS2V5d29yZCkge30KCiAgLy8gT25lIG9mIHRoZSB0d28gcG9zc2libGUgY29ycmVzcG9uZGluZyBlbmQgZXZlbnRzIGZvciBbYmVnaW5Gb3JTdGF0ZW1lbnRdLgogIHZvaWQgZW5kRm9ySW4oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGb3JJbiIpOwogIH0KCiAgdm9pZCBiZWdpbkZvckluRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRGb3JJbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGb3JJbkV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5Gb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRm9ySW5Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRm9ySW5Cb2R5Iik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYSBuYW1lZCBmdW5jdGlvbiBleHByZXNzaW9uIHdoaWNoIGlzbid0IGxlZ2FsCiAgLy8vIHN5bnRheCBpbiBEYXJ0LiAgVXNlZnVsIGZvciByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZAogIC8vLyBpbnRvIGEgRGFydCBwcm9ncmFtLCBhcyBpdCB3aWxsIGludGVycHJldCBgZnVuY3Rpb24gZm9vKCkge31gIGFzIGEgbmFtZWQKICAvLy8gZnVuY3Rpb24gZXhwcmVzc2lvbiB3aXRoIHJldHVybiB0eXBlIGBmdW5jdGlvbmAgYW5kIG5hbWUgYGZvb2AuCiAgLy8vCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICB2b2lkIGJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBBIG5hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb24gd2hpY2ggaXNuJ3QgbGVnYWwgc3ludGF4IGluIERhcnQuCiAgLy8vIFVzZWZ1bCBmb3IgcmVjb3ZlcmluZyBmcm9tIEphdmFzY3JpcHQgY29kZSBiZWluZyBwYXN0ZWQgaW50byBhIERhcnQKICAvLy8gcHJvZ3JhbSwgYXMgaXQgd2lsbCBpbnRlcnByZXQgYGZ1bmN0aW9uIGZvbygpIHt9YCBhcyBhIG5hbWVkIGZ1bmN0aW9uCiAgLy8vIGV4cHJlc3Npb24gd2l0aCByZXR1cm4gdHlwZSBgZnVuY3Rpb25gIGFuZCBuYW1lIGBmb29gLgogIC8vLwogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIFR5cGUgdmFyaWFibGVzCiAgLy8vIC0gTW9kaWZpZXJzCiAgLy8vIC0gUmV0dXJuIHR5cGUKICAvLy8gLSBOYW1lCiAgLy8vIC0gRm9ybWFscwogIC8vLyAtIEluaXRpYWxpemVycwogIC8vLyAtIEFzeW5jIG1vZGlmaWVyCiAgLy8vIC0gRnVuY3Rpb24gYm9keSAoYmxvY2sgb3IgYXJyb3cgZXhwcmVzc2lvbikuCiAgdm9pZCBlbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYSBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIHZvaWQgYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBBIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogIC8vLwogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICAvLy8gLSBSZXR1cm4gdHlwZQogIC8vLyAtIE5hbWUKICAvLy8gLSBUeXBlIHZhcmlhYmxlcwogIC8vLyAtIEZvcm1hbHMKICAvLy8gLSBJbml0aWFsaXplcnMKICAvLy8gLSBBc3luYyBtb2RpZmllcgogIC8vLyAtIEZ1bmN0aW9uIGJvZHkgKGJsb2NrIG9yIGFycm93IGV4cHJlc3Npb24pLgogIHZvaWQgZW5kTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25EZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiB0aGUgcGFyc2VyIHNlZXMgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhCiAgLy8vIGJsb2NrIGZ1bmN0aW9uIGJvZHkuICBUaGlzIG1ldGhvZCBpcyBub3QgaW52b2tlZCBmb3IgZW1wdHkgb3IgZXhwcmVzc2lvbgogIC8vLyBmdW5jdGlvbiBib2RpZXMsIHNlZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzIFtoYW5kbGVFbXB0eUZ1bmN0aW9uQm9keV0KICAvLy8gYW5kIFtoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5XS4KICB2b2lkIGJlZ2luQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBwYXJzZXIgYWZ0ZXIgaXQgZmluaXNoZWQgcGFyc2luZyBhIGJsb2NrCiAgLy8vIGZ1bmN0aW9uIGJvZHkuICBUaGlzIG1ldGhvZCBpcyBub3QgaW52b2tlZCBmb3IgZW1wdHkgb3IgZXhwcmVzc2lvbgogIC8vLyBmdW5jdGlvbiBib2RpZXMsIHNlZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzIFtoYW5kbGVFbXB0eUZ1bmN0aW9uQm9keV0KICAvLy8gYW5kIFtoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5XS4gIFRoZSBbYmVnaW5Ub2tlbl0gaXMgdGhlICd7JyB0b2tlbiwKICAvLy8gYW5kIHRoZSBbZW5kVG9rZW5dIGlzIHRoZSAnfScgdG9rZW4gb2YgdGhlIGJsb2NrLiAgVGhlIG51bWJlciBvZgogIC8vLyBzdGF0ZW1lbnRzIGlzIGdpdmVuIGFzIHRoZSBbY291bnRdIHBhcmFtZXRlci4KICB2b2lkIGVuZEJsb2NrRnVuY3Rpb25Cb2R5KGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJCbG9ja0Z1bmN0aW9uQm9keSIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb0Z1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vRnVuY3Rpb25Cb2R5Iik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBib2R5IHRoYXQgd2FzIHNraXBwZWQgYnkgdGhlIHBhcnNlci4KICAvLy8KICAvLy8gVGhlIGJvb2xlYW4gW2lzRXhwcmVzc2lvbkJvZHldIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBib2R5IHRoYXQKICAvLy8gd2FzIHNraXBwZWQgdXNlZCAiPT4iIHN5bnRheC4KICB2b2lkIGhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQoVG9rZW4gdG9rZW4sIGJvb2wgaXNFeHByZXNzaW9uQm9keSkge30KCiAgdm9pZCBiZWdpbkZ1bmN0aW9uTmFtZShUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRGdW5jdGlvbk5hbWUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGdW5jdGlvbk5hbWUiKTsKICB9CgogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGVBbGlhcyhUb2tlbiB0b2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgdHlwZWRlZiBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gSWYgW2VxdWFsc10gaXMgbnVsbCwgdGhlbiB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgc3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIFJldHVybiB0eXBlCiAgLy8vIC0gTmFtZSAoaWRlbnRpZmllcikKICAvLy8gLSBBbGlhcyB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIEZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vCiAgLy8vIElmIFtlcXVhbHNdIGlzIG5vdCBudWxsLCB0aGVuIHRoZSBoYXZlIHRoZSBmb2xsb3dpbmcgc3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIE5hbWUgKGlkZW50aWZpZXIpCiAgLy8vIC0gQWxpYXMgdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBUeXBlIChGdW5jdGlvblR5cGVBbm5vdGF0aW9uKQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlQWxpYXMoCiAgICAgIFRva2VuIHR5cGVkZWZLZXl3b3JkLCBUb2tlbiBlcXVhbHMsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25UeXBlQWxpYXMiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIHdpdGggY2xhdXNlIChlLmcuICJ3aXRoIEIsIEMiKS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtaXhpbiB0eXBlcyAoVHlwZUxpc3QpCiAgdm9pZCBoYW5kbGVDbGFzc1dpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJDbGFzc1dpdGhDbGF1c2UiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGFic2VuY2Ugb2YgYSB3aXRoIGNsYXVzZS4KICB2b2lkIGhhbmRsZUNsYXNzTm9XaXRoQ2xhdXNlKCkgewogICAgbG9nRXZlbnQoIkNsYXNzTm9XaXRoQ2xhdXNlIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbi4KICAvLy8gW2JlZ2luVG9rZW5dIG1heSBiZSB0aGUgc2FtZSBhcyBbbmFtZV0sIG9yIG1heSBwb2ludCB0byBtb2RpZmllcnMKICAvLy8gKG9yIGV4dHJhbmVvdXMgbW9kaWZpZXJzIGluIHRoZSBjYXNlIG9mIHJlY292ZXJ5KSBwcmVjZWRpbmcgW25hbWVdLgogIC8vLwogIC8vLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgcGFyc2VkIHRoZSBuYW1lIGFuZCB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCiAgdm9pZCBiZWdpbk5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgVG9rZW4gYmVnaW4sIFRva2VuIGFic3RyYWN0VG9rZW4sIFRva2VuIG5hbWUpIHt9CgogIC8vLyBIYW5kbGUgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiB3aXRoIGNsYXVzZSAoZS5nLiAiQSB3aXRoIEIsIEMiKS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBzdXBlcnR5cGUKICAvLy8gLSBtaXhpbiB0eXBlcyAoVHlwZUxpc3QpCiAgdm9pZCBoYW5kbGVOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgbmFtZWQgbWl4aW4gZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgLy8vIC0gbW9kaWZpZXJzCiAgLy8vIC0gY2xhc3MgbmFtZQogIC8vLyAtIHR5cGUgdmFyaWFibGVzCiAgLy8vIC0gc3VwZXJ0eXBlCiAgLy8vIC0gd2l0aCBjbGF1c2UKICAvLy8gLSBpbXBsZW1lbnRlZCB0eXBlcyAoVHlwZUxpc3QpCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5LGFoZSk6IGl0IHNlZW1zIGluY29uc2lzdGVudCB0aGF0IGZvciBhIG5hbWVkIG1peGluCiAgLy8vIGFwcGxpY2F0aW9uLCB0aGUgaW1wbGVtZW50ZWQgdHlwZXMgYXJlIGEgVHlwZUxpc3QsIHdoZXJlYXMgZm9yIGEgY2xhc3MKICAvLy8gZGVjbGFyYXRpb24sIGVhY2ggaW1wbGVtZW50ZWQgdHlwZSBpcyBsaXN0ZWQgc2VwYXJhdGVseSBvbiB0aGUgc3RhY2ssIGFuZAogIC8vLyB0aGUgbnVtYmVyIG9mIGltcGxlbWVudGVkIHR5cGVzIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KICB2b2lkIGVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkLCBUb2tlbiBlcXVhbHMsCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIk5hbWVkTWl4aW5BcHBsaWNhdGlvbiIpOwogIH0KCiAgdm9pZCBiZWdpbkhpZGUoVG9rZW4gaGlkZUtleXdvcmQpIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhICJoaWRlIiBjb21iaW5hdG9yLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBoaWRkZW4gbmFtZXMgKElkZW50aWZpZXJMaXN0KQogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgbG9nRXZlbnQoIkhpZGUiKTsKICB9CgogIHZvaWQgaGFuZGxlSWRlbnRpZmllckxpc3QoaW50IGNvdW50KSB7CiAgICBsb2dFdmVudCgiSWRlbnRpZmllckxpc3QiKTsKICB9CgogIHZvaWQgYmVnaW5UeXBlTGlzdChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRUeXBlTGlzdChpbnQgY291bnQpIHsKICAgIGxvZ0V2ZW50KCJUeXBlTGlzdCIpOwogIH0KCiAgdm9pZCBiZWdpbklmU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZElmU3RhdGVtZW50KFRva2VuIGlmVG9rZW4sIFRva2VuIGVsc2VUb2tlbikgewogICAgbG9nRXZlbnQoIklmU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGJlZ2luVGhlblN0YXRlbWVudChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRUaGVuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVGhlblN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkVsc2VTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kRWxzZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkVsc2VTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5JbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCkge30KCiAgLy8vIFNpZ25hbHMgdGhhdCB0aGUgY3VycmVudCBpbXBvcnQgaXMgZGVmZXJyZWQgYW5kL29yIGhhcyBhIHByZWZpeAogIC8vLyBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIFtkZWZlcnJlZEtleXdvcmRdIGFuZCBbYXNLZXl3b3JkXQogIC8vLyBhcmUgbm90IGBudWxsYCByZXNwZWN0aXZlbHkuIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gcHJlZml4IGlkZW50aWZpZXIgKG9ubHkgaWYgYXNLZXl3b3JkICE9IG51bGwpCiAgdm9pZCBoYW5kbGVJbXBvcnRQcmVmaXgoVG9rZW4gZGVmZXJyZWRLZXl3b3JkLCBUb2tlbiBhc0tleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJJbXBvcnRQcmVmaXgiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhbiBpbXBvcnQgZGlyZWN0aXZlLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHVyaQogIC8vLyAtIGNvbmRpdGlvbmFsIHVyaXMKICAvLy8gLSBwcmVmaXggaWRlbnRpZmllcgogIC8vLyAtIGNvbWJpbmF0b3JzCiAgdm9pZCBlbmRJbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiSW1wb3J0Iik7CiAgfQoKICAvLy8gSGFuZGxlIHJlY292ZXJ5IGFzc29jaWF0ZWQgd2l0aCBhbiBpbXBvcnQgZGlyZWN0aXZlLgogIC8vLyBUaGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYWZ0ZXIgW2VuZEltcG9ydF0KICAvLy8gdG8gcmVjb3ZlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJldmlvdXMgaW1wb3J0IGRpcmVjdGl2ZS4KICAvLy8gVGhlIHN1YnN0cnVjdHVyZXMgYXJlIGEgc3Vic2V0IG9mIGFuZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBbZW5kSW1wb3J0XToKICAvLy8gLSBjb25kaXRpb25hbCB1cmlzCiAgLy8vIC0gcHJlZml4IGlkZW50aWZpZXIKICAvLy8gLSBjb21iaW5hdG9ycwogIHZvaWQgaGFuZGxlUmVjb3ZlckltcG9ydChUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJJbXBvcnRSZWNvdmVyeSIpOwogIH0KCiAgdm9pZCBiZWdpbkNvbmRpdGlvbmFsVXJpcyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaXMoaW50IGNvdW50KSB7CiAgICBsb2dFdmVudCgiQ29uZGl0aW9uYWxVcmlzIik7CiAgfQoKICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbCBVUkkgY29uc3RydWN0LiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBEb3R0ZWQgbmFtZQogIC8vLyAtIENvbmRpdGlvbiAobGl0ZXJhbCBzdHJpbmc7IG9ubHkgaWYgW2VxdWFsU2lnbl0gIT0gbnVsbCkKICAvLy8gLSBVUkkgKGxpdGVyYWwgc3RyaW5nKQogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW4sIFRva2VuIGVxdWFsU2lnbikgewogICAgbG9nRXZlbnQoIkNvbmRpdGlvbmFsVXJpIik7CiAgfQoKICB2b2lkIGhhbmRsZURvdHRlZE5hbWUoaW50IGNvdW50LCBUb2tlbiBmaXJzdElkZW50aWZpZXIpIHsKICAgIGxvZ0V2ZW50KCJEb3R0ZWROYW1lIik7CiAgfQoKICB2b2lkIGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbiIpOwogIH0KCiAgdm9pZCBiZWdpbkluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRJbml0aWFsaXplZElkZW50aWZpZXIoVG9rZW4gbmFtZVRva2VuKSB7CiAgICBsb2dFdmVudCgiSW5pdGlhbGl6ZWRJZGVudGlmaWVyIik7CiAgfQoKICB2b2lkIGJlZ2luRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZmllbGQgaW5pdGlhbGl6ZXIuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIEluaXRpYWxpemVyIGV4cHJlc3Npb24KICB2b2lkIGVuZEZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gYXNzaWdubWVudCwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGaWVsZEluaXRpYWxpemVyIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBsYWNrIG9mIGEgZmllbGQgaW5pdGlhbGl6ZXIuCiAgdm9pZCBoYW5kbGVOb0ZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb0ZpZWxkSW5pdGlhbGl6ZXIiKTsKICB9CgogIHZvaWQgYmVnaW5WYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB2YXJpYWJsZSBpbml0aWFsaXplci4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBJbml0aWFsaXplciBleHByZXNzaW9uLgogIHZvaWQgZW5kVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IpIHsKICAgIGxvZ0V2ZW50KCJWYXJpYWJsZUluaXRpYWxpemVyIik7CiAgfQoKICAvLy8gVXNlZCB3aGVuIGEgdmFyaWFibGUgaGFzIG5vIGluaXRpYWxpemVyLgogIHZvaWQgaGFuZGxlTm9WYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9WYXJpYWJsZUluaXRpYWxpemVyIik7CiAgfQoKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJDb25zdHJ1Y3RvckluaXRpYWxpemVyIik7CiAgfQoKICB2b2lkIGJlZ2luSW5pdGlhbGl6ZXJzKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiSW5pdGlhbGl6ZXJzIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCkgewogICAgbG9nRXZlbnQoIk5vSW5pdGlhbGl6ZXJzIik7CiAgfQoKICAvLy8gQ2FsbGVkIGFmdGVyIHRoZSBsaXN0ZW5lciBoYXMgcmVjb3ZlcmVkIGZyb20gYW4gaW52YWxpZCBleHByZXNzaW9uLiBUaGUKICAvLy8gcGFyc2VyIHdpbGwgcmVzdW1lIHBhcnNpbmcgZnJvbSBbdG9rZW5dLiBFeGFjdGx5IHdoZXJlIHRoZSBwYXJzZXIgd2lsbAogIC8vLyByZXN1bWUgcGFyc2luZyBpcyB1bnNwZWNpZmllZC4KICB2b2lkIGhhbmRsZUludmFsaWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiSW52YWxpZEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgdGhlIGxpc3RlbmVyIGhhcyByZWNvdmVyZWQgZnJvbSBhbiBpbnZhbGlkIGZ1bmN0aW9uCiAgLy8vIGJvZHkuIFRoZSBwYXJzZXIgZXhwZWN0ZWQgYW4gb3BlbiBjdXJseSBicmFjZSBge2AgYW5kIHdpbGwgcmVzdW1lIHBhcnNpbmcKICAvLy8gZnJvbSBbdG9rZW5dIGFzIGlmIGEgZnVuY3Rpb24gYm9keSBoYWQgcHJlY2VkZWQgaXQuCiAgdm9pZCBoYW5kbGVJbnZhbGlkRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiSW52YWxpZEZ1bmN0aW9uQm9keSIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciB0aGUgbGlzdGVuZXIgaGFzIHJlY292ZXJlZCBmcm9tIGFuIGludmFsaWQgdHlwZS4gVGhlIHBhcnNlcgogIC8vLyBleHBlY3RlZCBhbiBpZGVudGlmaWVyLCBhbmQgd2lsbCByZXN1bWUgcGFyc2luZyB0eXBlIGFyZ3VtZW50cyBmcm9tCiAgLy8vIFt0b2tlbl0uCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRUeXBlUmVmZXJlbmNlIik7CiAgfQoKICB2b2lkIGhhbmRsZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTGFiZWwiKTsKICB9CgogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkge30KCiAgdm9pZCBlbmRMYWJlbGVkU3RhdGVtZW50KGludCBsYWJlbENvdW50KSB7CiAgICBsb2dFdmVudCgiTGFiZWxlZFN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbkxpYnJhcnlOYW1lKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBsaWJyYXJ5IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gTWV0YWRhdGEKICAvLy8gLSBMaWJyYXJ5IG5hbWUgKGEgcXVhbGlmaWVkIGlkZW50aWZpZXIpCiAgdm9pZCBlbmRMaWJyYXJ5TmFtZShUb2tlbiBsaWJyYXJ5S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiTGlicmFyeU5hbWUiKTsKICB9CgogIHZvaWQgaGFuZGxlTGl0ZXJhbE1hcEVudHJ5KFRva2VuIGNvbG9uLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxNYXBFbnRyeSIpOwogIH0KCiAgdm9pZCBiZWdpbkxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24oVG9rZW4gbGVmdEJyYWNrZXQsIFRva2VuIHJpZ2h0QnJhY2tldCkge30KCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiTGl0ZXJhbFN0cmluZyIpOwogIH0KCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKFRva2VuIHN0YXJ0VG9rZW4sIGludCBsaXRlcmFsQ291bnQpIHsKICAgIGxvZ0V2ZW50KCJTdHJpbmdKdXh0YXBvc2l0aW9uIik7CiAgfQoKICB2b2lkIGJlZ2luTWVtYmVyKCkge30KCiAgLy8vIEhhbmRsZSBhbiBpbnZhbGlkIG1lbWJlciBkZWNsYXJhdGlvbi4gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlSW52YWxpZE1lbWJlcihUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRNZW1iZXIiKTsKICB9CgogIC8vLyBUaGlzIGV2ZW50IGlzIGFkZGVkIGZvciBjb252ZW5pZW5jZS4gTm9ybWFsbHksIG9uZSBzaG91bGQgb3ZlcnJpZGUKICAvLy8gW2VuZENsYXNzRmllbGRzXSwgW2VuZE1peGluRmllbGRzXSwgW2VuZEV4dGVuc2lvbkZpZWxkc10sCiAgLy8vIFtlbmRDbGFzc01ldGhvZF0sIFtlbmRNaXhpbk1ldGhvZF0sIFtlbmRFeHRlbnNpb25NZXRob2RdLAogIC8vLyBbZW5kQ2xhc3NDb25zdHJ1Y3Rvcl0sIFtlbmRNaXhpbkNvbnN0cnVjdG9yXSwKICAvLy8gb3IgW2VuZEV4dGVuc2lvbkNvbnN0cnVjdG9yXSBpbnN0ZWFkLgogIHZvaWQgZW5kTWVtYmVyKCkgewogICAgbG9nRXZlbnQoIk1lbWJlciIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgYmVnaW5NZXRob2QoVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIFRva2VuIGdldE9yU2V0LCBUb2tlbiBuYW1lKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjbGFzcyBtZXRob2QgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIG1ldGFkYXRhCiAgLy8vIC0gcmV0dXJuIHR5cGUKICAvLy8gLSBtZXRob2QgbmFtZSAoaWRlbnRpZmllciwgcG9zc2libHkgcXVhbGlmaWVkKQogIC8vLyAtIHR5cGUgdmFyaWFibGVzCiAgLy8vIC0gZm9ybWFsIHBhcmFtZXRlcnMKICAvLy8gLSBpbml0aWFsaXplcnMKICAvLy8gLSBhc3luYyBtYXJrZXIKICAvLy8gLSBib2R5CiAgdm9pZCBlbmRDbGFzc01ldGhvZChUb2tlbiBnZXRPclNldCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gYmVnaW5QYXJhbSwKICAgICAgVG9rZW4gYmVnaW5Jbml0aWFsaXplcnMsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2xhc3NNZXRob2QiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIG1peGluIG1ldGhvZCBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSByZXR1cm4gdHlwZQogIC8vLyAtIG1ldGhvZCBuYW1lIChpZGVudGlmaWVyLCBwb3NzaWJseSBxdWFsaWZpZWQpCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBmb3JtYWwgcGFyYW1ldGVycwogIC8vLyAtIGluaXRpYWxpemVycwogIC8vLyAtIGFzeW5jIG1hcmtlcgogIC8vLyAtIGJvZHkKICB2b2lkIGVuZE1peGluTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBwdXNoIGltcGxlbWVudGF0aW9uIGludG8gc3ViY2xhc3NlcwogICAgZW5kQ2xhc3NNZXRob2QoCiAgICAgICAgZ2V0T3JTZXQsIGJlZ2luVG9rZW4sIGJlZ2luUGFyYW0sIGJlZ2luSW5pdGlhbGl6ZXJzLCBlbmRUb2tlbik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBleHRlbnNpb24gbWV0aG9kIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gbWV0aG9kIG5hbWUgKGlkZW50aWZpZXIsIHBvc3NpYmx5IHF1YWxpZmllZCkKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gaW5pdGlhbGl6ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kRXh0ZW5zaW9uTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBwdXNoIGltcGxlbWVudGF0aW9uIGludG8gc3ViY2xhc3NlcwogICAgZW5kQ2xhc3NNZXRob2QoCiAgICAgICAgZ2V0T3JTZXQsIGJlZ2luVG9rZW4sIGJlZ2luUGFyYW0sIGJlZ2luSW5pdGlhbGl6ZXJzLCBlbmRUb2tlbik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjbGFzcyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSByZXR1cm4gdHlwZQogIC8vLyAtIG1ldGhvZCBuYW1lIChpZGVudGlmaWVyLCBwb3NzaWJseSBxdWFsaWZpZWQpCiAgLy8vIC0gdHlwZSB2YXJpYWJsZXMKICAvLy8gLSBmb3JtYWwgcGFyYW1ldGVycwogIC8vLyAtIGluaXRpYWxpemVycwogIC8vLyAtIGFzeW5jIG1hcmtlcgogIC8vLyAtIGJvZHkKICB2b2lkIGVuZENsYXNzQ29uc3RydWN0b3IoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sCiAgICAgIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IHB1c2ggaW1wbGVtZW50YXRpb24gaW50byBzdWJjbGFzc2VzCiAgICBlbmRDbGFzc01ldGhvZCgKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIG1peGluIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gbWV0aG9kIG5hbWUgKGlkZW50aWZpZXIsIHBvc3NpYmx5IHF1YWxpZmllZCkKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gaW5pdGlhbGl6ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kTWl4aW5Db25zdHJ1Y3RvcihUb2tlbiBnZXRPclNldCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gYmVnaW5QYXJhbSwKICAgICAgVG9rZW4gYmVnaW5Jbml0aWFsaXplcnMsIFRva2VuIGVuZFRva2VuKSB7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcHVzaCBpbXBsZW1lbnRhdGlvbiBpbnRvIHN1YmNsYXNzZXMKICAgIGVuZENsYXNzTWV0aG9kKAogICAgICAgIGdldE9yU2V0LCBiZWdpblRva2VuLCBiZWdpblBhcmFtLCBiZWdpbkluaXRpYWxpemVycywgZW5kVG9rZW4pOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZXh0ZW5zaW9uIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gbWV0aG9kIG5hbWUgKGlkZW50aWZpZXIsIHBvc3NpYmx5IHF1YWxpZmllZCkKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gaW5pdGlhbGl6ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kRXh0ZW5zaW9uQ29uc3RydWN0b3IoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sCiAgICAgIFRva2VuIGJlZ2luUGFyYW0sIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgLy8gVE9ETyhkYW5ydWJlbCk6IHB1c2ggaW1wbGVtZW50YXRpb24gaW50byBzdWJjbGFzc2VzCiAgICBlbmRDbGFzc01ldGhvZCgKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIHZvaWQgYmVnaW5NZXRhZGF0YVN0YXIoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgbG9nRXZlbnQoIk1ldGFkYXRhU3RhciIpOwogIH0KCiAgdm9pZCBiZWdpbk1ldGFkYXRhKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBtZXRhZGF0YSBhbm5vdGF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBJZGVudGlmaWVyCiAgLy8vIC0gVHlwZSBhcmd1bWVudHMKICAvLy8gLSBDb25zdHJ1Y3RvciBuYW1lIChvbmx5IGlmIFtwZXJpb2RCZWZvcmVOYW1lXSBpcyBub3QgYG51bGxgKQogIC8vLyAtIEFyZ3VtZW50cwogIHZvaWQgZW5kTWV0YWRhdGEoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJNZXRhZGF0YSIpOwogIH0KCiAgdm9pZCBiZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMiKTsKICB9CgogIHZvaWQgYmVnaW5QYXJ0KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBwYXJ0IGRpcmVjdGl2ZS4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSB1cmkKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbG9nRXZlbnQoIlBhcnQiKTsKICB9CgogIHZvaWQgYmVnaW5QYXJ0T2YoVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhICJwYXJ0IG9mIiBkaXJlY3RpdmUuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gTGlicmFyeSBuYW1lIChhIHF1YWxpZmllZCBpZGVudGlmaWVyKQogIC8vLwogIC8vLyBJZiBbaGFzTmFtZV0gaXMgdHJ1ZSwgdGhpcyBwYXJ0IHJlZmVycyB0byBpdHMgbGlicmFyeSBieSBuYW1lLCBvdGhlcndpc2UsCiAgLy8vIGJ5IFVSSS4KICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGxvZ0V2ZW50KCJQYXJ0T2YiKTsKICB9CgogIHZvaWQgYmVnaW5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5Iik7CiAgfQoKICB2b2lkIGJlZ2luUmV0dXJuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBgbmF0aXZlYCBmdW5jdGlvbi4KICAvLy8gVGhlIFtoYW5kbGVOYXRpdmVDbGF1c2VdIGV2ZW50IGlzIHNlbnQgcHJpb3IgdG8gdGhpcyBldmVudC4KICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5Iik7CiAgfQoKICAvLy8gQ2FsbGVkIGFmdGVyIHRoZSBbaGFuZGxlTmF0aXZlQ2xhdXNlXSBldmVudCB3aGVuIHRoZSBwYXJzZXIgZGV0ZXJtaW5lcwogIC8vLyB0aGF0IHRoZSBuYXRpdmUgY2xhdXNlIHNob3VsZCBiZSBkaXNjYXJkZWQgLyBpZ25vcmVkLgogIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGEgbmF0aXZlIGNsYXVzZSBpcyBmb2xsb3dlZCBieQogIC8vLyBhIGZ1bmN0aW9uIGJvZHkuCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBgbmF0aXZlYCBmdW5jdGlvbiB0aGF0IHdhcyBza2lwcGVkIGJ5IHRoZSBwYXJzZXIuCiAgLy8vIFRoZSBbaGFuZGxlTmF0aXZlQ2xhdXNlXSBldmVudCBpcyBzZW50IHByaW9yIHRvIHRoaXMgZXZlbnQuCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxvZ0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkIik7CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIGEgZnVuY3Rpb24gaGFzIHRoZSBlbXB0eSBib2R5LgogIHZvaWQgaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsb2dFdmVudCgiRW1wdHlGdW5jdGlvbkJvZHkiKTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gcGFyc2VyIGZpbmlzaGVzIHBhcnNpbmcgdGhlIGNvcnJlc3BvbmRpbmcKICAvLy8gZXhwcmVzc2lvbiBvZiB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiBib2R5LgogIHZvaWQgaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiBhcnJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkV4cHJlc3Npb25GdW5jdGlvbkJvZHkiKTsKICB9CgogIHZvaWQgZW5kUmV0dXJuU3RhdGVtZW50KAogICAgICBib29sIGhhc0V4cHJlc3Npb24sIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiUmV0dXJuU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZVNlbmQoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJTZW5kIik7CiAgfQoKICB2b2lkIGJlZ2luU2hvdyhUb2tlbiBzaG93S2V5d29yZCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgInNob3ciIGNvbWJpbmF0b3IuICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIHNob3duIG5hbWVzIChJZGVudGlmaWVyTGlzdCkKICB2b2lkIGVuZFNob3coVG9rZW4gc2hvd0tleXdvcmQpIHsKICAgIGxvZ0V2ZW50KCJTaG93Iik7CiAgfQoKICB2b2lkIGJlZ2luU3dpdGNoU3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlN3aXRjaFN0YXRlbWVudCIpOwogIH0KCiAgdm9pZCBiZWdpblN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFN3aXRjaEJsb2NrKGludCBjYXNlQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3dpdGNoQmxvY2siKTsKICB9CgogIHZvaWQgYmVnaW5MaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZExpdGVyYWxTeW1ib2woVG9rZW4gaGFzaFRva2VuLCBpbnQgaWRlbnRpZmllckNvdW50KSB7CiAgICBsb2dFdmVudCgiTGl0ZXJhbFN5bWJvbCIpOwogIH0KCiAgdm9pZCBoYW5kbGVUaHJvd0V4cHJlc3Npb24oVG9rZW4gdGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUaHJvd0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5SZXRocm93U3RhdGVtZW50KFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZFJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gcmV0aHJvd1Rva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIlJldGhyb3dTdGF0ZW1lbnQiKTsKICB9CgogIC8vLyBUaGlzIGV2ZW50IGlzIGFkZGVkIGZvciBjb252ZW5pZW5jZS4gTm9ybWFsbHksIG9uZSBzaG91bGQgdXNlCiAgLy8vIFtlbmRDbGFzc0RlY2xhcmF0aW9uXSwgW2VuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbl0sIFtlbmRFbnVtXSwKICAvLy8gW2VuZEZ1bmN0aW9uVHlwZUFsaWFzXSwgW2VuZExpYnJhcnlOYW1lXSwgW2VuZEltcG9ydF0sIFtlbmRFeHBvcnRdLAogIC8vLyBbZW5kUGFydF0sIFtlbmRQYXJ0T2ZdLCBbZW5kVG9wTGV2ZWxGaWVsZHNdLCBvciBbZW5kVG9wTGV2ZWxNZXRob2RdLgogIHZvaWQgZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlRvcExldmVsRGVjbGFyYXRpb24iKTsKICB9CgogIC8vLyBDYWxsZWQgYnkgdGhlIFtQYXJzZXJdIHdoZW4gaXQgcmVjb3ZlcnMgZnJvbSBhbiBpbnZhbGlkIHRvcCBsZXZlbAogIC8vLyBkZWNsYXJhdGlvbiwgd2hlcmUgW2VuZFRva2VuXSBpcyB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgZGVjbGFyYXRpb24KICAvLy8gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJlZ2luL2VuZCBtZXRhZGF0YSBzdGFyIGV2ZW50cywKICAvLy8gYW5kIGlzIGZvbGxvd2VkIGJ5IFtlbmRUb3BMZXZlbERlY2xhcmF0aW9uXS4KICAvLy8KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBtZXRhZGF0YQogIHZvaWQgaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbiIpOwogIH0KCiAgLy8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3AgbGV2ZWwgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9uLgogIC8vLyBEb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGVuZCBldmVudC4KICAvLy8gU2VlIFtlbmRUb3BMZXZlbEZpZWxkc10gYW5kIFtlbmRUb3BMZXZlbE1ldGhvZF0uCiAgdm9pZCBiZWdpblRvcExldmVsTWVtYmVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSB0b3AgbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb24uICBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIE1ldGFkYXRhCiAgLy8vIC0gVHlwZQogIC8vLyAtIFJlcGVhdGVkIFtjb3VudF0gdGltZXM6CiAgLy8vICAgLSBWYXJpYWJsZSBuYW1lIChpZGVudGlmaWVyKQogIC8vLyAgIC0gRmllbGQgaW5pdGlhbGl6ZXIKICAvLy8gRG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBiZWdpbiBldmVudC4KICAvLy8gVXNlIFtiZWdpblRvcExldmVsTWVtYmVyXSBpbnN0ZWFkLgogIHZvaWQgZW5kVG9wTGV2ZWxGaWVsZHMoCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUb3BMZXZlbEZpZWxkcyIpOwogIH0KCiAgdm9pZCBiZWdpblRvcExldmVsTWV0aG9kKFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgdG9wIGxldmVsIG1ldGhvZC4gIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gbWV0YWRhdGEKICAvLy8gLSBtb2RpZmllcnMKICAvLy8gLSByZXR1cm4gdHlwZQogIC8vLyAtIGlkZW50aWZpZXIKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIGZvcm1hbCBwYXJhbWV0ZXJzCiAgLy8vIC0gYXN5bmMgbWFya2VyCiAgLy8vIC0gYm9keQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVG9wTGV2ZWxNZXRob2QiKTsKICB9CgogIHZvaWQgYmVnaW5UcnlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgaGFuZGxlQ2FzZU1hdGNoKFRva2VuIGNhc2VLZXl3b3JkLCBUb2tlbiBjb2xvbikgewogICAgbG9nRXZlbnQoIkNhc2VNYXRjaCIpOwogIH0KCiAgdm9pZCBiZWdpbkNhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7fQoKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQ2F0Y2hDbGF1c2UiKTsKICB9CgogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGxvZ0V2ZW50KCJDYXRjaEJsb2NrIik7CiAgfQoKICB2b2lkIGhhbmRsZUZpbmFsbHlCbG9jayhUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgbG9nRXZlbnQoIkZpbmFsbHlCbG9jayIpOwogIH0KCiAgdm9pZCBlbmRUcnlTdGF0ZW1lbnQoaW50IGNhdGNoQ291bnQsIFRva2VuIHRyeUtleXdvcmQsIFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBsb2dFdmVudCgiVHJ5U3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBsb2dFdmVudCgiVHlwZSIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHBhcnNlciBlbmNvdW50ZXJzIGEgJyEnCiAgLy8vIHVzZWQgYXMgYSBub24tbnVsbCBwb3N0Zml4IGFzc2VydGlvbiBpbiBhbiBleHByZXNzaW9uLgogIHZvaWQgaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oVG9rZW4gYmFuZykgewogICAgbG9nRXZlbnQoIk5vbk51bGxBc3NlcnRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vTmFtZSIpOwogIH0KCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZShUb2tlbiBiZWdpblRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFN1YnN0cnVjdHVyZXM6CiAgLy8vIC0gVHlwZSB2YXJpYWJsZXMKICAvLy8gLSBSZXR1cm4gdHlwZQogIC8vLyAtIEZvcm1hbCBwYXJhbWV0ZXJzCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBsb2dFdmVudCgiRnVuY3Rpb25UeXBlIik7CiAgfQoKICB2b2lkIGJlZ2luVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRUeXBlQXJndW1lbnRzKGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJUeXBlQXJndW1lbnRzIik7CiAgfQoKICAvLy8gQWZ0ZXIgZW5kVHlwZUFyZ3VtZW50cyBoYXMgYmVlbiBjYWxsZWQsCiAgLy8vIHRoaXMgZXZlbnQgaXMgY2FsbGVkIGlmIHRob3NlIHR5cGUgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgogIHZvaWQgaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb1R5cGVBcmd1bWVudHMiKTsKICB9CgogIHZvaWQgaGFuZGxlTm9UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9UeXBlQXJndW1lbnRzIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBiZWdpbiBvZiBhIHR5cGUgZm9ybWFsIHBhcmFtZXRlciAoZS5nLiAiWCBleHRlbmRzIFkiKS4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIE5hbWUgKGlkZW50aWZpZXIpCiAgdm9pZCBiZWdpblR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbikge30KCiAgLy8vIENhbGxlZCB3aGVuIFtiZWdpblR5cGVWYXJpYWJsZV0gaGFzIGJlZW4gY2FsbGVkIGZvciBhbGwgb2YgdGhlIHZhcmlhYmxlcwogIC8vLyBpbiBhIGdyb3VwLCBhbmQgYmVmb3JlIFtlbmRUeXBlVmFyaWFibGVdIGhhcyBiZWVuIGNhbGxlZCBmb3IgYW55IG9mIHRoZQogIC8vLyB2YXJpYWJsZXMgaW4gdGhhdCBzYW1lIGdyb3VwLgogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgdHlwZSBmb3JtYWwgcGFyYW1ldGVyIChlLmcuICJYIGV4dGVuZHMgWSIpCiAgLy8vIHdoZXJlIFtpbmRleF0gaXMgdGhlIGluZGV4IG9mIHRoZSB0eXBlIHZhcmlhYmxlIGluIHRoZSBsaXN0IG9mCiAgLy8vIHR5cGUgdmFyaWFibGVzIGJlaW5nIGRlY2xhcmVkLgogIC8vLwogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIFR5cGUgYm91bmQKICAvLy8KICAvLy8gU2VlIFtiZWdpblR5cGVWYXJpYWJsZV0gZm9yIGFkZGl0aW9uYWwgc3Vic3RydWN0dXJlcy4KICB2b2lkIGVuZFR5cGVWYXJpYWJsZSgKICAgICAgVG9rZW4gdG9rZW4sIGludCBpbmRleCwgVG9rZW4gZXh0ZW5kc09yU3VwZXIsIFRva2VuIHZhcmlhbmNlKSB7CiAgICBsb2dFdmVudCgiVHlwZVZhcmlhYmxlIik7CiAgfQoKICB2b2lkIGJlZ2luVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRUeXBlVmFyaWFibGVzKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVHlwZVZhcmlhYmxlcyIpOwogIH0KCiAgdm9pZCByZXBvcnRWYXJpYW5jZU1vZGlmaWVyTm90RW5hYmxlZChUb2tlbiB2YXJpYW5jZSkgewogICAgaWYgKHZhcmlhbmNlICE9IG51bGwpIHsKICAgICAgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRlbXBsYXRlRXhwZXJpbWVudE5vdEVuYWJsZWQud2l0aEFyZ3VtZW50cygndmFyaWFuY2UnKSwKICAgICAgICAgIHZhcmlhbmNlLAogICAgICAgICAgdmFyaWFuY2UpOwogICAgfQogIH0KCiAgdm9pZCBiZWdpbkZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgLy8vIEhhbmRsZSB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiAoZS5nLiAiKCkgeyAuLi4gfSIpLgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIFR5cGUgdmFyaWFibGVzCiAgLy8vIC0gRm9ybWFsIHBhcmFtZXRlcnMKICAvLy8gLSBBc3luYyBtYXJrZXIKICAvLy8gLSBCb2R5CiAgdm9pZCBlbmRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJGdW5jdGlvbkV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGVzIGRlY2xhcmF0aW9uLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBNZXRhZGF0YQogIC8vLyAtIFR5cGUKICB2b2lkIGJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBsYXRlVG9rZW4sIFRva2VuIHZhckZpbmFsT3JDb25zdCkge30KCiAgdm9pZCBlbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihpbnQgY291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiVmFyaWFibGVzRGVjbGFyYXRpb24iKTsKICB9CgogIHZvaWQgYmVnaW5XaGlsZVN0YXRlbWVudChUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudChUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiV2hpbGVTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgaGFuZGxlQXNPcGVyYXRvcihUb2tlbiBvcGVyYXRvcikgewogICAgbG9nRXZlbnQoIkFzT3BlcmF0b3IiKTsKICB9CgogIHZvaWQgaGFuZGxlQXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJBc3NpZ25tZW50RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIGJpbmFyeSBvcGVyYXRvciwgaW4gYmV0d2VlbiB0aGUgTEhTCiAgLy8vIGFuZCBSSFMgc3ViZXhwcmVzc2lvbnMuCiAgLy8vCiAgLy8vIE5vdCBjYWxsZWQgd2hlbiB0aGUgYmluYXJ5IG9wZXJhdG9yIGlzIGAuYCwgYD8uYCwgb3IgYC4uYC4KICB2b2lkIGJlZ2luQmluYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbikge30KCiAgdm9pZCBlbmRCaW5hcnlFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiQmluYXJ5RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIGA/YCBvcGVyYXRvciBhbmQgYmVnaW5zIHBhcnNpbmcgYQogIC8vLyBjb25kaXRpb25hbCBleHByZXNzaW9uLgogIHZvaWQgYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb24oVG9rZW4gcXVlc3Rpb24pIHt9CgogIC8vLyBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGVuY291bnRlcnMgYSBgOmAgb3BlcmF0b3IgaW4gYSBjb25kaXRpb25hbAogIC8vLyBleHByZXNzaW9uLgogIHZvaWQgaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKSB7fQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHBhcnNlciBmaW5pc2hlcyBwcm9jZXNzaW5nIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICB2b2lkIGVuZENvbmRpdGlvbmFsRXhwcmVzc2lvbihUb2tlbiBxdWVzdGlvbiwgVG9rZW4gY29sb24pIHsKICAgIGxvZ0V2ZW50KCJDb25kaXRpb25hbEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgYmVnaW5Db25zdEV4cHJlc3Npb24oVG9rZW4gY29uc3RLZXl3b3JkKSB7fQoKICB2b2lkIGVuZENvbnN0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkNvbnN0RXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIENhbGxlZCBiZWZvcmUgcGFyc2luZyBhICJmb3IiIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGJlZ2luRm9yQ29udHJvbEZsb3coVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4pIHt9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhICJmb3IiIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGVuZEZvckNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgnZW5kRm9yQ29udHJvbEZsb3cnKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhICJmb3ItaW4iIGNvbnRyb2wgZmxvdyBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeS4KICB2b2lkIGVuZEZvckluQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCdlbmRGb3JJbkNvbnRyb2xGbG93Jyk7CiAgfQoKICAvLy8gQ2FsbGVkIGJlZm9yZSBwYXJzaW5nIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5LgogIHZvaWQgYmVnaW5JZkNvbnRyb2xGbG93KFRva2VuIGlmVG9rZW4pIHt9CgogIC8vLyBDYWxsZWQgYmVmb3JlIHBhcnNpbmcgdGhlIGB0aGVuYCBwb3J0aW9uIG9mIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsCiAgLy8vIHNldCwgb3IgbWFwIGVudHJ5LgogIHZvaWQgYmVnaW5UaGVuQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHt9CgogIC8vLyBDYWxsZWQgYmVmb3JlIHBhcnNpbmcgdGhlIGBlbHNlYCBwb3J0aW9uIG9mIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsCiAgLy8vIHNldCwgb3IgbWFwIGVudHJ5LgogIHZvaWQgaGFuZGxlRWxzZUNvbnRyb2xGbG93KFRva2VuIGVsc2VUb2tlbikgewogICAgbG9nRXZlbnQoIkVsc2VDb250cm9sRmxvdyIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciBwYXJzaW5nIGFuIGBpZmAgY29udHJvbCBmbG93IGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5LgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGlmIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KICAvLy8gLSBleHByZXNzaW9uCiAgdm9pZCBlbmRJZkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiZW5kSWZDb250cm9sRmxvdyIpOwogIH0KCiAgLy8vIENhbGxlZCBhZnRlciBwYXJzaW5nIGFuIGlmLWVsc2UgY29udHJvbCBmbG93IGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5LgogIC8vLyBTdWJzdHJ1Y3R1cmVzOgogIC8vLyAtIGlmIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KICAvLy8gLSB0aGVuIGV4cHJlc3Npb24KICAvLy8gLSBlbHNlIGV4cHJlc3Npb24KICB2b2lkIGVuZElmRWxzZUNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiZW5kSWZFbHNlQ29udHJvbEZsb3ciKTsKICB9CgogIC8vLyBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBhIGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5IHRoYXQgc3RhcnRzIHdpdGgKICAvLy8gb25lIG9mIHRoZSBzcHJlYWQgY29sbGVjdGlvbiB0b2tlbnMgYC4uLmAgb3IgYC4uLj9gLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSBleHByZXNzaW9uCiAgdm9pZCBoYW5kbGVTcHJlYWRFeHByZXNzaW9uKFRva2VuIHNwcmVhZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3ByZWFkRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8vIEhhbmRsZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiB0eXBlZCBmb3JtYWwgcGFyYW1ldGVyLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIHRva2VuKSB7fQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiB0eXBlZCBmb3JtYWwgcGFyYW1ldGVyLiAgU3Vic3RydWN0dXJlczoKICAvLy8gLSB0eXBlIHZhcmlhYmxlcwogIC8vLyAtIHJldHVybiB0eXBlCiAgLy8vIC0gZm9ybWFsIHBhcmFtZXRlcnMKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gbmFtZVRva2VuLCBUb2tlbiBxdWVzdGlvbikgewogICAgbG9nRXZlbnQoIkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICB9CgogIC8vLyBIYW5kbGUgYW4gaWRlbnRpZmllciB0b2tlbi4KICAvLy8KICAvLy8gW2NvbnRleHRdIGluZGljYXRlcyB3aGF0IGtpbmQgb2YgY29uc3RydWN0IHRoZSBpZGVudGlmaWVyIGFwcGVhcnMgaW4uCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsb2dFdmVudCgiSWRlbnRpZmllciIpOwogIH0KCiAgdm9pZCBoYW5kbGVJbmRleGVkRXhwcmVzc2lvbigKICAgICAgVG9rZW4gb3BlblNxdWFyZUJyYWNrZXQsIFRva2VuIGNsb3NlU3F1YXJlQnJhY2tldCkgewogICAgbG9nRXZlbnQoIkluZGV4ZWRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZUlzT3BlcmF0b3IoVG9rZW4gaXNPcGVyYXRvciwgVG9rZW4gbm90KSB7CiAgICBsb2dFdmVudCgiSXNPcGVyYXRvciIpOwogIH0KCiAgdm9pZCBoYW5kbGVMaXRlcmFsQm9vbChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxCb29sIik7CiAgfQoKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkJyZWFrU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUNvbnRpbnVlU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gY29udGludWVLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIkNvbnRpbnVlU3RhdGVtZW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUVtcHR5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiRW1wdHlTdGF0ZW1lbnQiKTsKICB9CgogIHZvaWQgYmVnaW5Bc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQpIHt9CgogIHZvaWQgZW5kQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kLCBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIFRva2VuIGNvbW1hVG9rZW4sIFRva2VuIHNlbWljb2xvblRva2VuKSB7CiAgICBsb2dFdmVudCgiQXNzZXJ0Iik7CiAgfQoKICAvKiogQ2FsbGVkIHdpdGggZWl0aGVyIHRoZSB0b2tlbiBjb250YWluaW5nIGEgZG91YmxlIGxpdGVyYWwsIG9yCiAgICAqIGFuIGltbWVkaWF0ZWx5IHByZWNlZGluZyAidW5hcnkgcGx1cyIgdG9rZW4uCiAgICAqLwogIHZvaWQgaGFuZGxlTGl0ZXJhbERvdWJsZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkxpdGVyYWxEb3VibGUiKTsKICB9CgogIC8qKiBDYWxsZWQgd2l0aCBlaXRoZXIgdGhlIHRva2VuIGNvbnRhaW5pbmcgYW4gaW50ZWdlciBsaXRlcmFsLAogICAgKiBvciBhbiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgInVuYXJ5IHBsdXMiIHRva2VuLgogICAgKi8KICB2b2lkIGhhbmRsZUxpdGVyYWxJbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJMaXRlcmFsSW50Iik7CiAgfQoKICB2b2lkIGhhbmRsZUxpdGVyYWxMaXN0KAogICAgICBpbnQgY291bnQsIFRva2VuIGxlZnRCcmFja2V0LCBUb2tlbiBjb25zdEtleXdvcmQsIFRva2VuIHJpZ2h0QnJhY2tldCkgewogICAgbG9nRXZlbnQoIkxpdGVyYWxMaXN0Iik7CiAgfQoKICB2b2lkIGhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgIGludCBjb3VudCwKICAgIFRva2VuIGxlZnRCcmFjZSwKICAgIFRva2VuIGNvbnN0S2V5d29yZCwKICAgIFRva2VuIHJpZ2h0QnJhY2UsCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFzU2V0RW50cnkgcGFyYW1ldGVyIGV4aXN0cyBmb3IgcmVwbGljYXRpbmcgZXhpc3RpbmcKICAgIC8vIGJlaGF2aW9yIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb24gaGFzIGJlZW4gZW5hYmxlZAogICAgYm9vbCBoYXNTZXRFbnRyeSwKICApIHsKICAgIGxvZ0V2ZW50KCdMaXRlcmFsU2V0T3JNYXAnKTsKICB9CgogIHZvaWQgaGFuZGxlTGl0ZXJhbE51bGwoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJMaXRlcmFsTnVsbCIpOwogIH0KCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgbG9nRXZlbnQoIk5hdGl2ZUNsYXVzZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVOYW1lZEFyZ3VtZW50KFRva2VuIGNvbG9uKSB7CiAgICBsb2dFdmVudCgiTmFtZWRBcmd1bWVudCIpOwogIH0KCiAgdm9pZCBiZWdpbk5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5ld0V4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlTm9Bcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJOb0FyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBsb2dFdmVudCgiTm9UeXBlIik7CiAgfQoKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk5vVHlwZVZhcmlhYmxlcyIpOwogIH0KCiAgdm9pZCBoYW5kbGVPcGVyYXRvcihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIk9wZXJhdG9yIik7CiAgfQoKICB2b2lkIGhhbmRsZVN5bWJvbFZvaWQoVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJTeW1ib2xWb2lkIik7CiAgfQoKICAvLy8gSGFuZGxlIHRoZSBlbmQgb2YgYSBjb25zdHJ1Y3Qgb2YgdGhlIGZvcm0gIm9wZXJhdG9yIDx0b2tlbj4iLgogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJPcGVyYXRvck5hbWUiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGVuZCBvZiBhIGNvbnN0cnVjdCBvZiB0aGUgZm9ybSAib3BlcmF0b3IgPHRva2VuPiIKICAvLy8gd2hlcmUgPHRva2VuPiBpcyBub3QgYSB2YWxpZCBvcGVyYXRvciB0b2tlbi4KICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkludmFsaWRPcGVyYXRvck5hbWUiKTsKICB9CgogIC8vLyBIYW5kbGUgdGhlIGNvbmRpdGlvbiBpbiBhIGNvbnRyb2wgc3RydWN0dXJlOgogIC8vLyAtIGlmIHN0YXRlbWVudAogIC8vLyAtIGRvIHdoaWxlIGxvb3AKICAvLy8gLSBzd2l0Y2ggc3RhdGVtZW50CiAgLy8vIC0gd2hpbGUgbG9vcAogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlBhcmVudGhlc2l6ZWRDb25kaXRpb24iKTsKICB9CgogIC8vLyBIYW5kbGUgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCiAgLy8vIFRoZXNlIG1heSBiZSB3aXRoaW4gdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG9mIGEgY29udHJvbCBzdHJ1Y3R1cmUKICAvLy8gYnV0IHdpbGwgbm90IGJlIHRoZSBjb25kaXRpb24gb2YgYSBjb250cm9sIHN0cnVjdHVyZS4KICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKTsKICB9CgogIC8vLyBIYW5kbGUgYSBjb25zdHJ1Y3Qgb2YgdGhlIGZvcm0gImlkZW50aWZpZXIuaWRlbnRpZmllciIgb2NjdXJyaW5nIGluIGEgcGFydAogIC8vLyBvZiB0aGUgZ3JhbW1hciB3aGVyZSBleHByZXNzaW9ucyBpbiBnZW5lcmFsIGFyZSBub3QgYWxsb3dlZC4KICAvLy8gU3Vic3RydWN0dXJlczoKICAvLy8gLSBRdWFsaWZpZWQgaWRlbnRpZmllciAoYmVmb3JlIHRoZSBwZXJpb2QpCiAgLy8vIC0gSWRlbnRpZmllciAoYWZ0ZXIgdGhlIHBlcmlvZCkKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGxvZ0V2ZW50KCJRdWFsaWZpZWQiKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlN0cmluZ1BhcnQiKTsKICB9CgogIHZvaWQgaGFuZGxlU3VwZXJFeHByZXNzaW9uKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsb2dFdmVudCgiU3VwZXJFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luU3dpdGNoQ2FzZShpbnQgbGFiZWxDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCwgVG9rZW4gZmlyc3RUb2tlbikge30KCiAgdm9pZCBlbmRTd2l0Y2hDYXNlKAogICAgICBpbnQgbGFiZWxDb3VudCwKICAgICAgaW50IGV4cHJlc3Npb25Db3VudCwKICAgICAgVG9rZW4gZGVmYXVsdEtleXdvcmQsCiAgICAgIFRva2VuIGNvbG9uQWZ0ZXJEZWZhdWx0LAogICAgICBpbnQgc3RhdGVtZW50Q291bnQsCiAgICAgIFRva2VuIGZpcnN0VG9rZW4sCiAgICAgIFRva2VuIGVuZFRva2VuKSB7CiAgICBsb2dFdmVudCgiU3dpdGNoQ2FzZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVUaGlzRXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgbG9nRXZlbnQoIlRoaXNFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24iKTsKICB9CgogIHZvaWQgaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVW5hcnlQcmVmaXhFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxvZ0V2ZW50KCJVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHt9CgogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpIHsKICAgIGxvZ0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uIik7CiAgfQoKICB2b2lkIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBlcXVhbHMsIFRva2VuIHRva2VuKSB7CiAgICBsb2dFdmVudCgiVmFsdWVkRm9ybWFsUGFyYW1ldGVyIik7CiAgfQoKICB2b2lkIGhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZShUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIkZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZSIpOwogIH0KCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlZvaWRLZXl3b3JkIik7CiAgfQoKICB2b2lkIGJlZ2luWWllbGRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHt9CgogIHZvaWQgZW5kWWllbGRTdGF0ZW1lbnQoVG9rZW4geWllbGRUb2tlbiwgVG9rZW4gc3RhclRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbG9nRXZlbnQoIllpZWxkU3RhdGVtZW50Iik7CiAgfQoKICAvLy8gVGhlIHBhcnNlciBub3RpY2VkIGEgc3ludGF4IGVycm9yLCBidXQgd2FzIGFibGUgdG8gcmVjb3ZlciBmcm9tIGl0LiBUaGUKICAvLy8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkIHVzaW5nIHRoZSBbbWVzc2FnZV0sIGFuZCB0aGUgY29kZSBiZXR3ZWVuIHRoZQogIC8vLyBiZWdpbm5pbmcgb2YgdGhlIFtzdGFydFRva2VuXSBhbmQgdGhlIGVuZCBvZiB0aGUgW2VuZFRva2VuXSBzaG91bGQgYmUKICAvLy8gaGlnaGxpZ2h0ZWQuIFRoZSBbc3RhcnRUb2tlbl0gYW5kIFtlbmRUb2tlbl0gY2FuIGJlIHRoZSBzYW1lIHRva2VuLgogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikge30KCiAgLy8vIFRoZSBwYXJzZXIgZW5jb3VudGVyZWQgYW4gW0Vycm9yVG9rZW5dIHJlcHJlc2VudGluZyBhbiBlcnJvcgogIC8vLyBmcm9tIHRoZSBzY2FubmVyIGJ1dCByZWNvdmVyZWQgZnJvbSBpdC4gQnkgZGVmYXVsdCwgdGhlIGVycm9yIGlzIHJlcG9ydGVkCiAgLy8vIGJ5IGNhbGxpbmcgW2hhbmRsZVJlY292ZXJhYmxlRXJyb3JdIHdpdGggdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZAogIC8vLyB3aXRoIHRoZSBlcnJvciBbdG9rZW5dLgogIHZvaWQgaGFuZGxlRXJyb3JUb2tlbihFcnJvclRva2VuIHRva2VuKSB7CiAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKHRva2VuLmFzc2VydGlvbk1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gbG9jYXRpb24sIGludCBzdHJpbmdPZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIGhhbmRsZVJlY292ZXJhYmxlRXJyb3IobWVzc2FnZSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKICB9CgogIC8vLyBTaWduYWxzIHRvIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBwcmV2aW91cyBzdGF0ZW1lbnQgY29udGFpbmVkIGEgc2VtYW50aWMKICAvLy8gZXJyb3IgKGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gW21lc3NhZ2VdKS4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgY2FsbGVkCiAgLy8vIGFmdGVyIFtoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5XSwgaW4gd2hpY2ggY2FzZSBpdCBzaWduYWxzIHRoYXQgdGhlCiAgLy8vIGltcGxpY2l0IHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5lZCBhIHNlbWFudGljIGVycm9yLgogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2UsIHRva2VuLCB0b2tlbik7CiAgfQoKICB2b2lkIGhhbmRsZVNjcmlwdChUb2tlbiB0b2tlbikgewogICAgbG9nRXZlbnQoIlNjcmlwdCIpOwogIH0KCiAgLy8vIEEgdHlwZSBoYXMgYmVlbiBqdXN0IHBhcnNlZCwgYW5kIHRoZSBwYXJzZXIgbm90aWNlZCB0aGF0IHRoZSBuZXh0IHRva2VuCiAgLy8vIGhhcyBhIHR5cGUgc3Vic3RpdHV0aW9uIGNvbW1lbnQgLyo9VCouIFNvLCB0aGUgdHlwZSB0aGF0IGhhcyBiZWVuIGp1c3QKICAvLy8gcGFyc2VkIHNob3VsZCBiZSBkaXNjYXJkZWQsIGFuZCBhIG5ldyB0eXBlIHNob3VsZCBiZSBwYXJzZWQgaW5zdGVhZC4KICB2b2lkIGRpc2NhcmRUeXBlUmVwbGFjZWRXaXRoQ29tbWVudFR5cGVBc3NpZ24oKSB7fQoKICAvLy8gQSBzaW5nbGUgY29tbWVudCByZWZlcmVuY2UgaGFzIGJlZW4gZm91bmQKICAvLy8gd2hlcmUgW3JlZmVyZW5jZVNvdXJjZV0gaXMgdGhlIHRleHQgYmV0d2VlbiB0aGUgYFtgIGFuZCBgXWAKICAvLy8gYW5kIFtyZWZlcmVuY2VPZmZzZXRdIGlzIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSB0b2tlbiBzdHJlYW0uCiAgLy8vCiAgLy8vIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgd2hlbiB0aGUgcGFyc2VyJ3MKICAvLy8gYHBhcnNlQ29tbWVudFJlZmVyZW5jZXNgIG1ldGhvZCBpcyBjYWxsZWQuIEZvciBmdXJ0aGVyIHByb2Nlc3NpbmcsCiAgLy8vIGEgbGlzdGVuZXIgbWF5IHNjYW4gdGhlIFtyZWZlcmVuY2VTb3VyY2VdIGFuZCB0aGVuIHBhc3MgdGhlIHJlc3VsdGluZwogIC8vLyB0b2tlbiBzdHJlYW0gdG8gdGhlIHBhcnNlcidzIGBwYXJzZU9uZUNvbW1lbnRSZWZlcmVuY2VgIG1ldGhvZC4KICB2b2lkIGhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KFN0cmluZyByZWZlcmVuY2VTb3VyY2UsIGludCByZWZlcmVuY2VPZmZzZXQpIHsKICAgIGxvZ0V2ZW50KCJDb21tZW50UmVmZXJlbmNlVGV4dCIpOwogIH0KCiAgLy8vIEEgc2luZ2xlIGNvbW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuIHBhcnNlZC4KICAvLy8gKiBbbmV3S2V5d29yZF0gbWF5IGJlIG51bGwuCiAgLy8vICogW3ByZWZpeF0gYW5kIFtwZXJpb2RdIGFyZSBlaXRoZXIgYm90aCB0b2tlbnMgb3IgYm90aCBgbnVsbGAuCiAgLy8vICogW3Rva2VuXSBjYW4gYmUgYW4gaWRlbnRpZmllciBvciBhbiBvcGVyYXRvci4KICAvLy8KICAvLy8gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRoZSBwYXJzZXIncwogIC8vLyBgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlYCBtZXRob2QgaXMgY2FsbGVkLgogIHZvaWQgaGFuZGxlQ29tbWVudFJlZmVyZW5jZSgKICAgICAgVG9rZW4gbmV3S2V5d29yZCwgVG9rZW4gcHJlZml4LCBUb2tlbiBwZXJpb2QsIFRva2VuIHRva2VuKSB7fQoKICAvLy8gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRoZSBwYXJzZXIncwogIC8vLyBgcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlYCBtZXRob2QgaXMgY2FsbGVkLgogIHZvaWQgaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCkge30KfQqGVABOTjwBLQEgPQErATYBIgEpAT4BOQE1ASsBJxxEAgFGFgRMBEZQFgRPCzIXASABKQEm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ZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlci5wYXJzZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnIHNob3cgTWVzc2FnZSwgVGVtcGxhdGU7CgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnIGFzIGNvZGVzOwoKaW1wb3J0ICcuLi9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBFcnJvclRva2VuLCBUb2tlbjsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbi5kYXJ0JwogICAgc2hvdwogICAgICAgIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwKICAgICAgICBCZWdpblRva2VuLAogICAgICAgIENBU0NBREVfUFJFQ0VERU5DRSwKICAgICAgICBFUVVBTElUWV9QUkVDRURFTkNFLAogICAgICAgIEtleXdvcmQsCiAgICAgICAgUE9TVEZJWF9QUkVDRURFTkNFLAogICAgICAgIFJFTEFUSU9OQUxfUFJFQ0VERU5DRSwKICAgICAgICBTRUxFQ1RPUl9QUkVDRURFTkNFLAogICAgICAgIFN5bnRoZXRpY0JlZ2luVG9rZW4sCiAgICAgICAgU3ludGhldGljS2V5d29yZFRva2VuLAogICAgICAgIFN5bnRoZXRpY1N0cmluZ1Rva2VuLAogICAgICAgIFN5bnRoZXRpY1Rva2VuLAogICAgICAgIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcKICAgIHNob3cKICAgICAgICBCQU5HX0VRX0VRX1RPS0VOLAogICAgICAgIENPTU1BX1RPS0VOLAogICAgICAgIERPVUJMRV9UT0tFTiwKICAgICAgICBFT0ZfVE9LRU4sCiAgICAgICAgRVFfRVFfRVFfVE9LRU4sCiAgICAgICAgRVFfVE9LRU4sCiAgICAgICAgRlVOQ1RJT05fVE9LRU4sCiAgICAgICAgSEFTSF9UT0tFTiwKICAgICAgICBIRVhBREVDSU1BTF9UT0tFTiwKICAgICAgICBJREVOVElGSUVSX1RPS0VOLAogICAgICAgIElOVF9UT0tFTiwKICAgICAgICBLRVlXT1JEX1RPS0VOLAogICAgICAgIExUX1RPS0VOLAogICAgICAgIE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTiwKICAgICAgICBPUEVOX1BBUkVOX1RPS0VOLAogICAgICAgIE9QRU5fU1FVQVJFX0JSQUNLRVRfVE9LRU4sCiAgICAgICAgU0VNSUNPTE9OX1RPS0VOLAogICAgICAgIFNUUklOR19JTlRFUlBPTEFUSU9OX0lERU5USUZJRVJfVE9LRU4sCiAgICAgICAgU1RSSU5HX0lOVEVSUE9MQVRJT05fVE9LRU4sCiAgICAgICAgU1RSSU5HX1RPS0VOOwoKaW1wb3J0ICdhc3NlcnQuZGFydCcgc2hvdyBBc3NlcnQ7CgppbXBvcnQgJ2FzeW5jX21vZGlmaWVyLmRhcnQnIHNob3cgQXN5bmNNb2RpZmllcjsKCmltcG9ydCAnYmxvY2tfa2luZC5kYXJ0JzsKCmltcG9ydCAnZGVjbGFyYXRpb25fa2luZC5kYXJ0JyBzaG93IERlY2xhcmF0aW9uS2luZDsKCmltcG9ydCAnZGlyZWN0aXZlX2NvbnRleHQuZGFydCc7CgppbXBvcnQgJ2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0JwogICAgc2hvdwogICAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kLAogICAgICAgIGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZDsKCmltcG9ydCAnZm9yd2FyZGluZ19saXN0ZW5lci5kYXJ0JyBzaG93IEZvcndhcmRpbmdMaXN0ZW5lcjsKCmltcG9ydCAnaWRlbnRpZmllcl9jb250ZXh0LmRhcnQnCiAgICBzaG93IElkZW50aWZpZXJDb250ZXh0LCBsb29rc0xpa2VFeHByZXNzaW9uU3RhcnQ7CgppbXBvcnQgJ2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgppbXBvcnQgJ2xpdGVyYWxfZW50cnlfaW5mby5kYXJ0JwogICAgc2hvdwogICAgICAgIExpdGVyYWxFbnRyeUluZm8sCiAgICAgICAgY29tcHV0ZUxpdGVyYWxFbnRyeSwKICAgICAgICBsb29rc0xpa2VMaXRlcmFsRW50cnksCiAgICAgICAgc2ltcGxlRW50cnk7CgppbXBvcnQgJ2xvb3Bfc3RhdGUuZGFydCcgc2hvdyBMb29wU3RhdGU7CgppbXBvcnQgJ21lbWJlcl9raW5kLmRhcnQnIHNob3cgTWVtYmVyS2luZDsKCmltcG9ydCAnbW9kaWZpZXJfY29udGV4dC5kYXJ0JyBzaG93IE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0LCBpc01vZGlmaWVyOwoKaW1wb3J0ICdyZWNvdmVyeV9saXN0ZW5lcnMuZGFydCcKICAgIHNob3cKICAgICAgICBDbGFzc0hlYWRlclJlY292ZXJ5TGlzdGVuZXIsCiAgICAgICAgSW1wb3J0UmVjb3ZlcnlMaXN0ZW5lciwKICAgICAgICBNaXhpbkhlYWRlclJlY292ZXJ5TGlzdGVuZXI7CgppbXBvcnQgJ3Rva2VuX3N0cmVhbV9yZXdyaXRlci5kYXJ0JyBzaG93IFRva2VuU3RyZWFtUmV3cml0ZXI7CgppbXBvcnQgJ3R5cGVfaW5mby5kYXJ0JwogICAgc2hvdwogICAgICAgIFR5cGVJbmZvLAogICAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbywKICAgICAgICBjb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50cywKICAgICAgICBjb21wdXRlVHlwZSwKICAgICAgICBjb21wdXRlVHlwZVBhcmFtT3JBcmcsCiAgICAgICAgaXNWYWxpZFR5cGVSZWZlcmVuY2UsCiAgICAgICAgbm9UeXBlLAogICAgICAgIG5vVHlwZVBhcmFtT3JBcmc7CgppbXBvcnQgJ3V0aWwuZGFydCcKICAgIHNob3cKICAgICAgICBmaW5kTm9uWmVyb0xlbmd0aFRva2VuLAogICAgICAgIGZpbmRQcmV2aW91c05vblplcm9MZW5ndGhUb2tlbiwKICAgICAgICBpc0xldHRlciwKICAgICAgICBpc0xldHRlck9yRGlnaXQsCiAgICAgICAgaXNPbmVPZiwKICAgICAgICBpc09uZU9mT3JFb2YsCiAgICAgICAgaXNXaGl0ZXNwYWNlLAogICAgICAgIG9wdGlvbmFsOwoKLy8vIEFuIGV2ZW50IGdlbmVyYXRpbmcgcGFyc2VyIG9mIERhcnQgcHJvZ3JhbXMuIFRoaXMgcGFyc2VyIGV4cGVjdHMgYWxsIHRva2VucwovLy8gaW4gYSBsaW5rZWQgbGlzdCAoYWthIGEgdG9rZW4gc3RyZWFtKS4KLy8vCi8vLyBUaGUgY2xhc3MgW1NjYW5uZXJdIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB0b2tlbiBzdHJlYW0uIFNlZSB0aGUgZmlsZQovLy8gW3NjYW5uZXIuZGFydF0oLi4vc2Nhbm5lci5kYXJ0KS4KLy8vCi8vLyBTdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBbTGlzdGVuZXJdIGFyZSB1c2VkIHRvIGxpc3RlbiB0byBldmVudHMuCi8vLwovLy8gTW9zdCBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYmVsb25nIGluIG9uZSBvZiBmb3VyIG1ham9yIGNhdGVnb3JpZXM6IHBhcnNlCi8vLyBtZXRob2RzLCBwZWVrIG1ldGhvZHMsIGVuc3VyZSBtZXRob2RzLCBhbmQgc2tpcCBtZXRob2RzLgovLy8KLy8vIFBhcnNlIG1ldGhvZHMgYWxsIGhhdmUgdGhlIHByZWZpeCBgcGFyc2VgLCBnZW5lcmF0ZSBldmVudHMKLy8vIChieSBjYWxsaW5nIG1ldGhvZHMgb24gW2xpc3RlbmVyXSksIGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gdG8gcGFyc2UuCi8vLyBTb21lIGV4Y2VwdGlvbnMgdG8gdGhpcyBsYXN0IHBvaW50IGFyZSBtZXRob2RzIHN1Y2ggYXMgW3BhcnNlRnVuY3Rpb25Cb2R5XQovLy8gYW5kIFtwYXJzZUNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uQm9keV0gd2hpY2ggcmV0dXJuIHRoZSBsYXN0IHRva2VuIHBhcnNlZAovLy8gcmF0aGVyIHRoYW4gdGhlIG5leHQgdG9rZW4gdG8gYmUgcGFyc2VkLgovLy8gUGFyc2UgbWV0aG9kcyBhcmUgZ2VuZXJhbGx5IG5hbWVkIGBwYXJzZUdyYW1tYXJQcm9kdWN0aW9uU3VmZml4YC4KLy8vIFRoZSBzdWZmaXggY2FuIGJlIG9uZSBvZiBgb3B0YCwgb3IgYHN0YXJgLgovLy8gYG9wdGAgbWVhbnMgemVybyBvciBvbmUgbWF0Y2hlcywgYHN0YXJgIG1lYW5zIHplcm8gb3IgbW9yZSBtYXRjaGVzLgovLy8gRm9yIGV4YW1wbGUsIFtwYXJzZU1ldGFkYXRhU3Rhcl0gY29ycmVzcG9uZHMgdG8gdGhpcyBncmFtbWFyIHNuaXBwZXQ6Ci8vLyBgbWV0YWRhdGEqYCwgYW5kIFtwYXJzZUFyZ3VtZW50c09wdF0gY29ycmVzcG9uZHMgdG86IGBhcmd1bWVudHM/YC4KLy8vCi8vLyBQZWVrIG1ldGhvZHMgYWxsIGhhdmUgdGhlIHByZWZpeCBgcGVla2AsIGRvIG5vdCBnZW5lcmF0ZSBldmVudHMKLy8vIChleGNlcHQgZm9yIGVycm9ycykgYW5kIG1heSByZXR1cm4gbnVsbC4KLy8vCi8vLyBFbnN1cmUgbWV0aG9kcyBhbGwgaGF2ZSB0aGUgcHJlZml4IGBlbnN1cmVgIGFuZCBtYXkgZ2VuZXJhdGUgZXZlbnRzLgovLy8gVGhleSByZXR1cm4gdGhlIGN1cnJlbnQgdG9rZW4sIG9yIGluc2VydCBhbmQgcmV0dXJuIGEgc3ludGhldGljIHRva2VuCi8vLyBpZiB0aGUgY3VycmVudCB0b2tlbiBkb2VzIG5vdCBtYXRjaC4gRm9yIGV4YW1wbGUsCi8vLyBbZW5zdXJlU2VtaWNvbG9uXSByZXR1cm5zIHRoZSBjdXJyZW50IHRva2VuIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEKLy8vIHNlbWljb2xvbiwgb3RoZXJ3aXNlIGluc2VydHMgYSBzeW50aGV0aWMgc2VtaWNvbG9uIGluIHRoZSB0b2tlbiBzdHJlYW0KLy8vIGJlZm9yZSB0aGUgY3VycmVudCB0b2tlbiBhbmQgdGhlbiByZXR1cm5zIHRoYXQgbmV3IHN5bnRoZXRpYyB0b2tlbi4KLy8vCi8vLyBTa2lwIG1ldGhvZHMgYXJlIGxpa2UgcGFyc2UgbWV0aG9kcywgYnV0IGFsbCBoYXZlIHRoZSBwcmVmaXggYHNraXBgCi8vLyBhbmQgc2tpcCBvdmVyIHNvbWUgcGFydHMgb2YgdGhlIGZpbGUgYmVpbmcgcGFyc2VkLgovLy8gVHlwaWNhbGx5LCBza2lwIG1ldGhvZHMgZ2VuZXJhdGUgYW4gZXZlbnQgZm9yIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgc2tpcHBlZCwKLy8vIGJ1dCBub3QgZm9yIGl0cyBzdWJzdHJ1Y3R1cmVzLgovLy8KLy8vICMjIEN1cnJlbnQgVG9rZW4KLy8vCi8vLyBUaGUgY3VycmVudCB0b2tlbiBpcyBhbHdheXMgdG8gYmUgZm91bmQgaW4gYSBmb3JtYWwgcGFyYW1ldGVyIG5hbWVkCi8vLyBgdG9rZW5gLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIGZpcnN0IGFzIHRoaXMgaW5jcmVhc2VzIHRoZSBjaGFuY2UKLy8vIHRoYXQgYSBjb21waWxlciB3aWxsIHBsYWNlIGl0IGluIGEgcmVnaXN0ZXIuCi8vLwovLy8gIyMgSW1wbGVtZW50YXRpb24gTm90ZXMKLy8vCi8vLyBUaGUgcGFyc2VyIGFzc3VtZXMgdGhhdCBrZXl3b3JkcywgYnVpbHQtaW4gaWRlbnRpZmllcnMsIGFuZCBvdGhlciBzcGVjaWFsCi8vLyB3b3JkcyAocHNldWRvLWtleXdvcmRzKSBhcmUgYWxsIGNhbm9uaWNhbGl6ZWQuIFRvIGV4dGVuZCB0aGUgcGFyc2VyIHRvCi8vLyByZWNvZ25pemUgYSBuZXcgaWRlbnRpZmllciwgb25lIHNob3VsZCBtb2RpZnkKLy8vIFtrZXl3b3JkLmRhcnRdKC4uL3NjYW5uZXIva2V5d29yZC5kYXJ0KSBhbmQgZW5zdXJlIHRoZSBpZGVudGlmaWVyIGlzIGFkZGVkCi8vLyB0byB0aGUga2V5d29yZCB0YWJsZS4KLy8vCi8vLyBBcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMsIG9uZSBzaG91bGQgbm90IHVzZSBgPT1gIHRvIGNvbXBhcmUgc3RyaW5ncyBpbiB0aGUKLy8vIHBhcnNlci4gT25lIHNob3VsZCBmYXZvciB0aGUgbWV0aG9kcyBbb3B0aW9uYWxdIGFuZCBbZXhwZWN0XSB0byByZWNvZ25pemUKLy8vIGtleXdvcmRzIG9yIGlkZW50aWZpZXJzLiBJbiBzb21lIGNhc2VzLCBpdCdzIHBvc3NpYmxlIHRvIGNvbXBhcmUgYSB0b2tlbidzCi8vLyBgc3RyaW5nVmFsdWVgIHVzaW5nIFtpZGVudGljYWxdLCBidXQgbm9ybWFsbHkgW29wdGlvbmFsXSB3aWxsIHN1ZmZpY2UuCi8vLwovLy8gSGlzdG9yaWNhbGx5LCB3ZSBvdmVyLXVzZWQgaWRlbnRpY2FsLCBhbmQgd2hlbiBpZGVudGljYWwgaXMgdXNlZCBvbiBvYmplY3RzCi8vLyBvdGhlciB0aGFuIHN0cmluZ3MsIGl0IGNhbiBvZnRlbiBiZSByZXBsYWNlZCBieSBgPT1gLgovLy8KLy8vICMjIEZsZXhpYmlsaXR5LCBFeHRlbnNpYmlsaXR5LCBhbmQgU3BlY2lmaWNhdGlvbgovLy8KLy8vIFRoZSBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgZmxleGlibGUgYW5kIGV4dGVuc2libGUuIEl0cyBtZXRob2RzIGFyZQovLy8gZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLCBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlCi8vLyB1bnNwZWNpZmllZCBsYW5ndWFnZSBleHRlbnNpb24gb3IgZXhwZXJpbWVudHMgd2hpbGUgZXZlcnl0aGluZyBpbiB0aGlzIGZpbGUKLy8vIGF0dGVtcHRzIHRvIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiAodW5sZXNzIHdoZW4gaXQgaW50ZXJmZXJlcyB3aXRoIGVycm9yCi8vLyByZWNvdmVyeSkuCi8vLwovLy8gV2UgYWNoaWV2ZSBmbGV4aWJpbGl0eSwgZXh0ZW5zaWJsZSwgYW5kIHNwZWNpZmljYXRpb24gY29tcGxpYW5jZSBieQovLy8gZm9sbG93aW5nIGEgZmV3IHJ1bGVzLW9mLXRodW1iOgovLy8KLy8vIDEuIEFsbCBtZXRob2RzIGluIHRoZSBwYXJzZXIgc2hvdWxkIGJlIHB1YmxpYy4KLy8vCi8vLyAyLiBUaGUgbWV0aG9kcyBmb2xsb3cgdGhlIHNwZWNpZmllZCBncmFtbWFyLCBhbmQgZG8gbm90IGltcGxlbWVudCBjdXN0b20KLy8vIGV4dGVuc2lvbnMsIGZvciBleGFtcGxlLCBgbmF0aXZlYC4KLy8vCi8vLyAzLiBUaGUgcGFyc2VyIGRvZXNuJ3QgcmV3cml0ZSB0aGUgdG9rZW4gc3RyZWFtICh3aGVuIGRlYWxpbmcgd2l0aCBgPj5gKS4KLy8vCi8vLyAjIyMgSW1wbGVtZW50aW5nIEV4dGVuc2lvbnMKLy8vCi8vLyBGb3IgdmFyaW91cyByZWFzb25zLCBzb21lIERhcnQgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zIGhhdmUgdXNlZAovLy8gY3VzdG9tL3Vuc3BlY2lmaWVkIGV4dGVuc2lvbnMgdG8gdGhlIERhcnQgZ3JhbW1hci4gRXhhbXBsZXMgb2YgdGhpcwovLy8gaW5jbHVkZXMgZGlldCBwYXJzaW5nLCBwYXRjaCBmaWxlcywgYG5hdGl2ZWAga2V5d29yZCwgYW5kIGdlbmVyaWMKLy8vIGNvbW1lbnRzLiBUaGlzIGNsYXNzIGlzbid0IHN1cHBvc2VkIHRvIGltcGxlbWVudCBhbnkgb2YgdGhlc2UKLy8vIGZlYXR1cmVzLiBJbnN0ZWFkIGl0IHByb3ZpZGVzIGhvb2tzIGZvciB0aG9zZSBleHRlbnNpb25zIHRvIGJlIGltcGxlbWVudGVkCi8vLyBpbiBzdWJjbGFzc2VzIG9yIGxpc3RlbmVycy4gTGV0J3MgZXhhbWluZSBob3cgZGlldCBwYXJzaW5nIGFuZCBgbmF0aXZlYAovLy8ga2V5d29yZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IEZhc3RhLgovLy8KLy8vICMjIyMgTGVnYWN5IEltcGxlbWVudGF0aW9uIG9mIGBuYXRpdmVgIEtleXdvcmQKLy8vCi8vLyBUT0RPKGFoZSxkYW5ydWJlbCk6IFJlbW92ZSB0aGlzIHNlY3Rpb24uCi8vLwovLy8gQm90aCBkYXJ0MmpzIGFuZCB0aGUgRGFydCBWTSBoYXZlIHVzZWQgdGhlIGBuYXRpdmVgIGtleXdvcmQgdG8gbWFyayBtZXRob2RzCi8vLyB0aGF0IGNvdWxkbid0IGJlIGltcGxlbWVudGVkIGluIHRoZSBEYXJ0IGxhbmd1YWdlIGFuZCBuZWVkZWQgdG8gYmUKLy8vIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQgb3IgQysrLCByZXNwZWN0aXZlbHkuIEFuIGV4YW1wbGUgb2YgdGhlIHN5bnRheAovLy8gZXh0ZW5zaW9uIHVzZWQgYnkgdGhlIERhcnQgVk0gaXM6Ci8vLwovLy8gICAgIG5hdGl2ZUZ1bmN0aW9uKCkgbmF0aXZlICJOYXRpdmVGdW5jdGlvbiI7Ci8vLwovLy8gV2hlbiBhdHRlbXB0aW5nIHRvIHBhcnNlIHRoaXMgZnVuY3Rpb24sIHRoZSBwYXJzZXIgZXZlbnR1YWxseSBjYWxscwovLy8gW3BhcnNlRnVuY3Rpb25Cb2R5XS4gVGhpcyBtZXRob2Qgd2lsbCByZXBvcnQgYW4gdW5yZWNvdmVyYWJsZSBlcnJvciB0byB0aGUKLy8vIGxpc3RlbmVyIHdpdGggdGhlIGNvZGUgW2Zhc3RhLm1lc3NhZ2VFeHBlY3RlZEZ1bmN0aW9uQm9keV0uIFRoZSBsaXN0ZW5lciBjYW4KLy8vIHRoZW4gbG9vayBhdCB0aGUgZXJyb3IgY29kZSBhbmQgdGhlIHRva2VuIGFuZCB1c2UgdGhlIG1ldGhvZHMgaW4KLy8vIFtuYXRpdmVfc3VwcG9ydC5kYXJ0XShuYXRpdmVfc3VwcG9ydC5kYXJ0KSB0byBwYXJzZSB0aGUgbmF0aXZlIHN5bnRheC4KLy8vCi8vLyAjIyMjIEltcGxlbWVudGF0aW9uIG9mIERpZXQgUGFyc2luZwovLy8KLy8vIFdlIGNhbGwgaXQgX2RpZXRfIF9wYXJzaW5nXyB3aGVuIHRoZSBwYXJzZXIgc2tpcHMgcGFydHMgb2YgYSBmaWxlLiBCb3RoCi8vLyBkYXJ0MmpzIGFuZCB0aGUgRGFydCBWTSBoYXZlIGJlZW4gcmVseWluZyBvbiB0aGlzIGZyb20gZWFybHkgb24gYXMgaXQgYWxsb3dzCi8vLyB0aGVtIHRvIG1vcmUgcXVpY2tseSBjb21waWxlIHNtYWxsIHByb2dyYW1zIHRoYXQgdXNlIHNtYWxsIHBhcnRzIG9mIGJpZwovLy8gbGlicmFyaWVzLiBJdCdzIGFsc28gYmVjb21lIGFuIGludGVncmF0ZWQgcGFydCBvZiBob3cgRmFzdGEgYnVpbGRzIHVwCi8vLyBvdXRsaW5lcyBiZWZvcmUgc3RhcnRpbmcgdG8gcGFyc2UgbWV0aG9kIGJvZGllcy4KLy8vCi8vLyBXaGVuIGxvb2tpbmcgdGhyb3VnaCB0aGlzIHBhcnNlciwgeW91J2xsIGZpbmQgYSBudW1iZXIgb2YgdW51c2VkIG1ldGhvZHMKLy8vIHN0YXJ0aW5nIHdpdGggYHNraXBgLiBUaGVzZSBtZXRob2RzIGFyZSBvbmx5IHVzZWQgYnkgc3ViY2xhc3Nlcywgc3VjaCBhcwovLy8gW0NsYXNzTWVtYmVyUGFyc2VyXShjbGFzc19tZW1iZXJfcGFyc2VyLmRhcnQpIGFuZAovLy8gW1RvcExldmVsUGFyc2VyXSh0b3BfbGV2ZWxfcGFyc2VyLmRhcnQpLiBUaGVzZSBtZXRob2RzIHZpb2xhdGUgdGhlCi8vLyBwcmluY2lwbGUgYWJvdmUgYWJvdXQgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgZ3JhbW1hciwgYW5kIG9yaWdpbmFsbHkgbGl2ZWQKLy8vIGluIHN1YmNsYXNzZXMuIEhvd2V2ZXIsIHdlIHJlYWxpemVkIHRoYXQgdGhlc2UgbWV0aG9kcyB3ZXJlIHNvIHdpZGVseSB1c2VkCi8vLyBhbmQgaGFyZCB0byBtYWludGFpbiBpbiBzdWJjbGFzc2VzLCB0aGF0IGl0IG1hZGUgc2Vuc2UgdG8gbW92ZSB0aGVtIGhlcmUuCi8vLwovLy8gIyMjIFNwZWNpZmljYXRpb24gYW5kIEVycm9yIFJlY292ZXJ5Ci8vLwovLy8gVG8gaW1wcm92ZSBlcnJvciByZWNvdmVyeSwgdGhlIHBhcnNlciB3aWxsIGluZm9ybSB0aGUgbGlzdGVuZXIgb2YKLy8vIHJlY292ZXJhYmxlIGVycm9ycyBhbmQgY29udGludWUgdG8gcGFyc2UuICBBbiBleGFtcGxlIG9mIGEgcmVjb3ZlcmFibGUKLy8vIGVycm9yIGlzOgovLy8KLy8vICAgICBFcnJvcjogQXN5bmNocm9ub3VzIGZvci1sb29wIGNhbiBvbmx5IGJlIHVzZWQgaW4gJ2FzeW5jJyBvciAnYXN5bmMqJy4uLgovLy8gICAgIG1haW4oKSB7IGF3YWl0IGZvciAodmFyIHggaW4gW10pIHt9IH0KLy8vICAgICAgICAgICAgICBeXl5eXgovLy8KLy8vICMjIyBMZWdhY3kgRXJyb3IgUmVjb3ZlcnkKLy8vCi8vLyBXaGF0J3MgZGVzY3JpYmVkIGJlbG93IHdpbGwgYmUgcGhhc2VkIG91dCBpbiBwcmVmZXJlbmNlIG9mIHRoZSBwYXJzZXIKLy8vIHJlcG9ydGluZyBhbmQgcmVjb3ZlcmluZyBmcm9tIHN5bnRheCBlcnJvcnMuIFRoZSBtb3RpdmF0aW9uIGZvciB0aGlzIGlzCi8vLyB0aGF0IHdlIGhhdmUgbXVsdGlwbGUgbGlzdGVuZXJzIHRoYXQgdXNlIHRoZSBwYXJzZXIsIGFuZCB0aGlzIHdpbGwgZW5zdXJlCi8vLyBjb25zaXN0ZW5jeS4KLy8vCi8vLyBGb3IgdW5yZWNvdmVyYWJsZSBlcnJvcnMsIHRoZSBwYXJzZXIgd2lsbCBhc2sgdGhlIGxpc3RlbmVyIGZvciBoZWxwIHRvCi8vLyByZWNvdmVyIGZyb20gdGhlIGVycm9yLiBXZSBoYXZlbid0IG1hZGUgbXVjaCBwcm9ncmVzcyBvbiB0aGVzZSBraW5kcyBvZgovLy8gZXJyb3JzLCBzbyBpbiBtb3N0IGNhc2VzLCB0aGUgcGFyc2VyIGFib3J0cyBieSBza2lwcGluZyB0byB0aGUgZW5kIG9mIGZpbGUuCi8vLwovLy8gSGlzdG9yaWNhbGx5LCB0aGlzIHBhcnNlciBoYXMgYmVlbiByYXRoZXIgbGF4IGluIHdoYXQgaXQgYWxsb3dzLCBhbmQKLy8vIGRlZmVycmVkIHRoZSBlbmZvcmNlbWVudCBvZiBzb21lIHN5bnRhY3RpY2FsIHJ1bGVzIHRvIHN1YnNlcXVlbnQgcGhhc2VzLiBJdAovLy8gZG9lc24ndCBtYXR0ZXIgaG93IHdlIGdvdCB0aGVyZSwgb25seSB0aGF0IHdlJ3ZlIGlkZW50aWZpZWQgdGhhdCBpdCdzCi8vLyBlYXNpZXIgaWYgdGhlIHBhcnNlciByZXBvcnRzIGFzIG1hbnkgZXJyb3JzIGl0IGNhbiwgYnV0IGluZm9ybXMgdGhlCi8vLyBsaXN0ZW5lciBpZiB0aGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgb3Igbm90LgpjbGFzcyBQYXJzZXIgewogIExpc3RlbmVyIGxpc3RlbmVyOwoKICBVcmkgZ2V0IHVyaSA9PiBsaXN0ZW5lci51cmk7CgogIGJvb2wgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKCiAgLy8vIFJlcHJlc2VudHMgcGFyc2VyIHN0YXRlOiB3aGF0IGFzeW5jaHJvbm91cyBzeW50YXggaXMgYWxsb3dlZCBpbiB0aGUKICAvLy8gZnVuY3Rpb24gYmVpbmcgY3VycmVudGx5IHBhcnNlZC4gSW4gcmFyZSBzaXR1YXRpb25zLCB0aGlzIGNhbiBiZSBzZXQgYnkKICAvLy8gZXh0ZXJuYWwgY2xpZW50cywgZm9yIGV4YW1wbGUsIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gb3V0c2lkZSBhIGZ1bmN0aW9uLgogIEFzeW5jTW9kaWZpZXIgYXN5bmNTdGF0ZSA9IEFzeW5jTW9kaWZpZXIuU3luYzsKCiAgLy8gVE9ETyhkYW5ydWJlbCk6IFRoZSBbbG9vcFN0YXRlXSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbmFsaXR5IGluIHRoZQogIC8vIFtQYXJzZXJdIGR1cGxpY2F0ZXMgd29yayB0aGF0IHRoZSByZXNvbHZlciBuZWVkcyB0byBkbyB3aGVuIHJlc29sdmluZwogIC8vIGJyZWFrL2NvbnRpbnVlIHRhcmdldHMuIExvbmcgdGVybSwgdGhpcyBzdGF0ZSBhbmQgZnVuY3Rpb25hbGl0eSB3aWxsIGJlCiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBbUGFyc2VyXSBjbGFzcyBhbmQgdGhlIHJlc29sdmVyIHdpbGwgYmUgcmVzcG9uc2libGUKICAvLyBmb3IgZ2VuZXJhdGluZyBhbGwgYnJlYWsvY29udGludWUgZXJyb3IgbWVzc2FnZXMuCgogIC8vLyBSZXByZXNlbnRzIHBhcnNlciBzdGF0ZTogd2hldGhlciBwYXJzaW5nIG91dHNpZGUgYSBsb29wLAogIC8vLyBpbnNpZGUgYSBsb29wLCBvciBpbnNpZGUgYSBzd2l0Y2guIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlcgogIC8vLyBicmVhayBhbmQgY29udGludWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KICBMb29wU3RhdGUgbG9vcFN0YXRlID0gTG9vcFN0YXRlLk91dHNpZGVMb29wOwoKICAvLy8gQSByZXdyaXRlciBmb3IgaW5zZXJ0aW5nIHN5bnRoZXRpYyB0b2tlbnMuCiAgLy8vIEFjY2VzcyB1c2luZyBbcmV3cml0ZXJdIGZvciBsYXp5IGluaXRpYWxpemF0aW9uLgogIFRva2VuU3RyZWFtUmV3cml0ZXIgY2FjaGVkUmV3cml0ZXI7CgogIFRva2VuU3RyZWFtUmV3cml0ZXIgZ2V0IHJld3JpdGVyIHsKICAgIGNhY2hlZFJld3JpdGVyID8/PSBuZXcgVG9rZW5TdHJlYW1SZXdyaXRlcigpOwogICAgcmV0dXJuIGNhY2hlZFJld3JpdGVyOwogIH0KCiAgUGFyc2VyKHRoaXMubGlzdGVuZXIpOwoKICBib29sIGdldCBpbkdlbmVyYXRvciB7CiAgICByZXR1cm4gYXN5bmNTdGF0ZSA9PSBBc3luY01vZGlmaWVyLkFzeW5jU3RhciB8fAogICAgICAgIGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5TeW5jU3RhcjsKICB9CgogIGJvb2wgZ2V0IGluQXN5bmMgewogICAgcmV0dXJuIGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5Bc3luYyB8fAogICAgICAgIGFzeW5jU3RhdGUgPT0gQXN5bmNNb2RpZmllci5Bc3luY1N0YXI7CiAgfQoKICBib29sIGdldCBpblBsYWluU3luYyA9PiBhc3luY1N0YXRlID09IEFzeW5jTW9kaWZpZXIuU3luYzsKCiAgYm9vbCBnZXQgaXNCcmVha0FsbG93ZWQgPT4gbG9vcFN0YXRlICE9IExvb3BTdGF0ZS5PdXRzaWRlTG9vcDsKCiAgYm9vbCBnZXQgaXNDb250aW51ZUFsbG93ZWQgPT4gbG9vcFN0YXRlID09IExvb3BTdGF0ZS5JbnNpZGVMb29wOwoKICBib29sIGdldCBpc0NvbnRpbnVlV2l0aExhYmVsQWxsb3dlZCA9PiBsb29wU3RhdGUgIT0gTG9vcFN0YXRlLk91dHNpZGVMb29wOwoKICAvLy8gUGFyc2UgYSBjb21waWxhdGlvbiB1bml0LgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBsaWJyYXJ5RGVmaW5pdGlvbjoKICAvLy8gICBzY3JpcHRUYWc/CiAgLy8vICAgbGlicmFyeU5hbWU/CiAgLy8vICAgaW1wb3J0T3JFeHBvcnQqCiAgLy8vICAgcGFydERpcmVjdGl2ZSoKICAvLy8gICB0b3BMZXZlbERlZmluaXRpb24qCiAgLy8vIDsKICAvLy8KICAvLy8gcGFydERlY2xhcmF0aW9uOgogIC8vLyAgIHBhcnRIZWFkZXIgdG9wTGV2ZWxEZWZpbml0aW9uKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVW5pdChUb2tlbiB0b2tlbikgewogICAgLy8gU2tpcCBvdmVyIGVycm9yIHRva2VucyBhbmQgcmVwb3J0IHRoZW0gYXQgdGhlIGVuZAogICAgLy8gc28gdGhhdCB0aGUgcGFyc2VyIGhhcyB0aGUgY2hhbmNlIHRvIGFkanVzdCB0aGUgZXJyb3IgbG9jYXRpb24uCiAgICBUb2tlbiBlcnJvclRva2VuID0gdG9rZW47CiAgICB0b2tlbiA9IHNraXBFcnJvclRva2VucyhlcnJvclRva2VuKTsKCiAgICBsaXN0ZW5lci5iZWdpbkNvbXBpbGF0aW9uVW5pdCh0b2tlbik7CiAgICBpbnQgY291bnQgPSAwOwogICAgRGlyZWN0aXZlQ29udGV4dCBkaXJlY3RpdmVTdGF0ZSA9IG5ldyBEaXJlY3RpdmVDb250ZXh0KCk7CiAgICB0b2tlbiA9IHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pOwogICAgaWYgKGlkZW50aWNhbCh0b2tlbi5uZXh0LnR5cGUsIFRva2VuVHlwZS5TQ1JJUFRfVEFHKSkgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tTY3JpcHRUYWcodGhpcywgdG9rZW4ubmV4dCk7CiAgICAgIHRva2VuID0gcGFyc2VTY3JpcHQodG9rZW4pOwogICAgfQogICAgd2hpbGUgKCF0b2tlbi5uZXh0LmlzRW9mKSB7CiAgICAgIGZpbmFsIFRva2VuIHN0YXJ0ID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZVRvcExldmVsRGVjbGFyYXRpb25JbXBsKHRva2VuLCBkaXJlY3RpdmVTdGF0ZSk7CiAgICAgIGxpc3RlbmVyLmVuZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4ubmV4dCk7CiAgICAgIGNvdW50Kys7CiAgICAgIGlmIChzdGFydCA9PSB0b2tlbi5uZXh0KSB7CiAgICAgICAgLy8gUmVjb3Zlcnk6CiAgICAgICAgLy8gSWYgcHJvZ3Jlc3MgaGFzIG5vdCBiZWVuIG1hZGUgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgdG9rZW4gc3RyZWFtLAogICAgICAgIC8vIHRoZW4gcmVwb3J0IGFuIGVycm9yIGFuZCBza2lwIHRoZSBjdXJyZW50IHRva2VuLgogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICBsaXN0ZW5lci5iZWdpbk1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuZW5kTWV0YWRhdGFTdGFyKDApOwogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkRGVjbGFyYXRpb24pOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuKTsKICAgICAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuLm5leHQpOwogICAgICAgIGNvdW50Kys7CiAgICAgIH0KICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIHJlcG9ydEFsbEVycm9yVG9rZW5zKGVycm9yVG9rZW4pOwogICAgbGlzdGVuZXIuZW5kQ29tcGlsYXRpb25Vbml0KGNvdW50LCB0b2tlbik7CiAgICAvLyBDbGVhciBmaWVsZHMgdGhhdCBjb3VsZCBsZWFkIHRvIG1lbW9yeSBsZWFrLgogICAgY2FjaGVkUmV3cml0ZXIgPSBudWxsOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3IgYW5hbHl6ZXIgY29tcGF0aWJpbGl0eSBvbmx5CiAgLy8vIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSBhbmFseXplci9mYXN0YSBpbnRlZ3JhdGlvbiBpcyBjb21wbGV0ZS4KICAvLy8KICAvLy8gU2ltaWxhciB0byBbcGFyc2VVbml0XSwgdGhpcyBtZXRob2QgcGFyc2VzIGEgY29tcGlsYXRpb24gdW5pdCwKICAvLy8gYnV0IHN0b3BzIHdoZW4gaXQgcmVhY2hlcyB0aGUgZmlyc3QgZGVjbGFyYXRpb24gb3IgRU9GLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VEaXJlY3RpdmVzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lci5iZWdpbkNvbXBpbGF0aW9uVW5pdCh0b2tlbik7CiAgICBpbnQgY291bnQgPSAwOwogICAgRGlyZWN0aXZlQ29udGV4dCBkaXJlY3RpdmVTdGF0ZSA9IG5ldyBEaXJlY3RpdmVDb250ZXh0KCk7CiAgICB0b2tlbiA9IHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pOwogICAgd2hpbGUgKCF0b2tlbi5uZXh0LmlzRW9mKSB7CiAgICAgIGZpbmFsIFRva2VuIHN0YXJ0ID0gdG9rZW4ubmV4dDsKICAgICAgZmluYWwgU3RyaW5nIG5leHRWYWx1ZSA9IHN0YXJ0Lm5leHQuc3RyaW5nVmFsdWU7CgogICAgICAvLyBJZiBhIGJ1aWx0LWluIGtleXdvcmQgaXMgYmVpbmcgdXNlZCBhcyBmdW5jdGlvbiBuYW1lLCB0aGVuIHN0b3AuCiAgICAgIGlmIChpZGVudGljYWwobmV4dFZhbHVlLCAnLicpIHx8CiAgICAgICAgICBpZGVudGljYWwobmV4dFZhbHVlLCAnPCcpIHx8CiAgICAgICAgICBpZGVudGljYWwobmV4dFZhbHVlLCAnKCcpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmIChpZGVudGljYWwodG9rZW4ubmV4dC50eXBlLCBUb2tlblR5cGUuU0NSSVBUX1RBRykpIHsKICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tTY3JpcHRUYWcodGhpcywgdG9rZW4ubmV4dCk7CiAgICAgICAgdG9rZW4gPSBwYXJzZVNjcmlwdCh0b2tlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICAgICAgVG9rZW4ga2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0ga2V5d29yZC5zdHJpbmdWYWx1ZTsKICAgICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnaW1wb3J0JykpIHsKICAgICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0ltcG9ydCh0aGlzLCBrZXl3b3JkKTsKICAgICAgICAgIHRva2VuID0gcGFyc2VJbXBvcnQoa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdleHBvcnQnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRXhwb3J0KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUV4cG9ydChrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2xpYnJhcnknKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrTGlicmFyeSh0aGlzLCBrZXl3b3JkKTsKICAgICAgICAgIHRva2VuID0gcGFyc2VMaWJyYXJ5TmFtZShrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3BhcnQnKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZVBhcnRPclBhcnRPZihrZXl3b3JkLCBkaXJlY3RpdmVTdGF0ZSk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc7JykpIHsKICAgICAgICAgIHRva2VuID0gc3RhcnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZURpcmVjdGl2ZXNPbmx5KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGlzdGVuZXIuZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbih0b2tlbi5uZXh0KTsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGxpc3RlbmVyLmVuZENvbXBpbGF0aW9uVW5pdChjb3VudCwgdG9rZW4pOwogICAgLy8gQ2xlYXIgZmllbGRzIHRoYXQgY291bGQgbGVhZCB0byBtZW1vcnkgbGVhay4KICAgIGNhY2hlZFJld3JpdGVyID0gbnVsbDsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBhIHRvcC1sZXZlbCBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgaXMgb25seSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgcGFyc2VyLiBBcyBhIHJlc3VsdCwgdGhpcwogIC8vLyBtZXRob2QgdGFrZXMgdGhlIG5leHQgdG9rZW4gdG8gYmUgY29uc3VtZWQgcmF0aGVyIHRoYW4gdGhlIGxhc3QgY29uc3VtZWQKICAvLy8gdG9rZW4gYW5kIHJldHVybnMgdGhlIHRva2VuIGFmdGVyIHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuIHJhdGhlciB0aGFuIHRoZQogIC8vLyBsYXN0IGNvbnN1bWVkIHRva2VuLgogIFRva2VuIHBhcnNlVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPQogICAgICAgIHBhcnNlVG9wTGV2ZWxEZWNsYXJhdGlvbkltcGwoc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbiksIG51bGwpLm5leHQ7CiAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbERlY2xhcmF0aW9uKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gdG9wTGV2ZWxEZWZpbml0aW9uOgogIC8vLyAgIGNsYXNzRGVmaW5pdGlvbiB8CiAgLy8vICAgZW51bVR5cGUgfAogIC8vLyAgIHR5cGVBbGlhcyB8CiAgLy8vICAgJ2V4dGVybmFsJz8gZnVuY3Rpb25TaWduYXR1cmUgJzsnIHwKICAvLy8gICAnZXh0ZXJuYWwnPyBnZXR0ZXJTaWduYXR1cmUgJzsnIHwKICAvLy8gICAnZXh0ZXJuYWwnJz8gc2V0dGVyU2lnbmF0dXJlICc7JyB8CiAgLy8vICAgZnVuY3Rpb25TaWduYXR1cmUgZnVuY3Rpb25Cb2R5IHwKICAvLy8gICByZXR1cm5UeXBlPyAnZ2V0JyBpZGVudGlmaWVyIGZ1bmN0aW9uQm9keSB8CiAgLy8vICAgcmV0dXJuVHlwZT8gJ3NldCcgaWRlbnRpZmllciBmb3JtYWxQYXJhbWV0ZXJMaXN0IGZ1bmN0aW9uQm9keSB8CiAgLy8vICAgKCdmaW5hbCcgfCAnY29uc3QnKSB0eXBlPyBzdGF0aWNGaW5hbERlY2xhcmF0aW9uTGlzdCAnOycgfAogIC8vLyAgIHZhcmlhYmxlRGVjbGFyYXRpb24gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uSW1wbCgKICAgICAgVG9rZW4gdG9rZW4sIERpcmVjdGl2ZUNvbnRleHQgZGlyZWN0aXZlU3RhdGUpIHsKICAgIHRva2VuID0gcGFyc2VNZXRhZGF0YVN0YXIodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5pc1RvcExldmVsS2V5d29yZCkgewogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbEtleXdvcmREZWNsYXJhdGlvbih0b2tlbiwgbmV4dCwgZGlyZWN0aXZlU3RhdGUpOwogICAgfQogICAgVG9rZW4gc3RhcnQgPSB0b2tlbjsKICAgIC8vIFNraXAgbW9kaWZpZXJzIHRvIGZpbmQgYSB0b3AgbGV2ZWwga2V5d29yZCBvciBpZGVudGlmaWVyCiAgICBpZiAobmV4dC5pc01vZGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgndmFyJywgbmV4dCkgfHwKICAgICAgICAgIG9wdGlvbmFsKCdsYXRlJywgbmV4dCkgfHwKICAgICAgICAgICgob3B0aW9uYWwoJ2NvbnN0JywgbmV4dCkgfHwgb3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpICYmCiAgICAgICAgICAgICAgLy8gSWdub3JlIGBjb25zdCBjbGFzc2AgYW5kIGBmaW5hbCBjbGFzc2Agc28gdGhhdCBpdCBpcyByZXBvcnRlZAogICAgICAgICAgICAgIC8vIGJlbG93IGFzIGFuIGludmFsaWQgbW9kaWZpZXIgb24gYSBjbGFzcy4KICAgICAgICAgICAgICAhb3B0aW9uYWwoJ2NsYXNzJywgbmV4dC5uZXh0KSkpIHsKICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbCh0b2tlbik7CiAgICAgIH0KICAgICAgd2hpbGUgKHRva2VuLm5leHQuaXNNb2RpZmllcikgewogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5pc1RvcExldmVsS2V5d29yZCkgewogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbEtleXdvcmREZWNsYXJhdGlvbihzdGFydCwgbmV4dCwgZGlyZWN0aXZlU3RhdGUpOwogICAgfSBlbHNlIGlmIChuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaW1wcm92ZSBwYXJzZVRvcExldmVsTWVtYmVyCiAgICAgIC8vIHNvIHRoYXQgd2UgZG9uJ3QgcGFyc2UgbW9kaWZpZXJzIHR3aWNlLgogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwoc3RhcnQpOwogICAgfSBlbHNlIGlmIChzdGFydC5uZXh0ICE9IG5leHQpIHsKICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgLy8gSGFuZGxlIHRoZSBlZGdlIGNhc2Ugd2hlcmUgYSBtb2RpZmllciBpcyBiZWluZyB1c2VkIGFzIGFuIGlkZW50aWZpZXIKICAgICAgcmV0dXJuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKHN0YXJ0KTsKICAgIH0KICAgIC8vIFJlY292ZXJ5CiAgICBpZiAobmV4dC5pc09wZXJhdG9yICYmIG9wdGlvbmFsKCcoJywgbmV4dC5uZXh0KSkgewogICAgICAvLyBUaGlzIGFwcGVhcnMgdG8gYmUgYSB0b3AgbGV2ZWwgb3BlcmF0b3IgZGVjbGFyYXRpb24sIHdoaWNoIGlzIGludmFsaWQuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZVRvcExldmVsT3BlcmF0b3IpOwogICAgICAvLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllcgogICAgICAvLyBhbmQgY29udGludWUgcGFyc2luZyBhcyBhIHRvcCBsZXZlbCBmdW5jdGlvbi4KICAgICAgcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgIG5leHQsICcjc3ludGhldGljX2Z1bmN0aW9uXyR7bmV4dC5jaGFyT2Zmc2V0fScpOwogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1lbWJlckltcGwobmV4dCk7CiAgICB9CiAgICAvLyBJZ25vcmUgYW55IHByZWNlZGluZyBtb2RpZmllcnMgYW5kIGp1c3QgcmVwb3J0IHRoZSB1bmV4cGVjdGVkIHRva2VuCiAgICBsaXN0ZW5lci5iZWdpblRvcExldmVsTWVtYmVyKG5leHQpOwogICAgcmV0dXJuIHBhcnNlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBtb2RpZmllcnMgYmVmb3JlIHRoZSBgY2xhc3NgIGtleXdvcmQuCiAgLy8vIFJldHVybiB0aGUgZmlyc3QgYGFic3RyYWN0YCBtb2RpZmllciBvciBgbnVsbGAgaWYgbm90IGZvdW5kLgogIFRva2VuIHBhcnNlQ2xhc3NEZWNsYXJhdGlvbk1vZGlmaWVycyhUb2tlbiBzdGFydCwgVG9rZW4ga2V5d29yZCkgewogICAgVG9rZW4gbW9kaWZpZXIgPSBzdGFydC5uZXh0OwogICAgd2hpbGUgKG1vZGlmaWVyICE9IGtleXdvcmQpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdhYnN0cmFjdCcsIG1vZGlmaWVyKSkgewogICAgICAgIHBhcnNlVG9wTGV2ZWxLZXl3b3JkTW9kaWZpZXJzKG1vZGlmaWVyLCBrZXl3b3JkKTsKICAgICAgICByZXR1cm4gbW9kaWZpZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICByZXBvcnRUb3BMZXZlbE1vZGlmaWVyRXJyb3IobW9kaWZpZXIsIGtleXdvcmQpOwogICAgICB9CiAgICAgIG1vZGlmaWVyID0gbW9kaWZpZXIubmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJlcG9ydCBlcnJvcnMgb24gYW55IG1vZGlmaWVycyBiZWZvcmUgdGhlIHNwZWNpZmllZCBrZXl3b3JkLgogIHZvaWQgcGFyc2VUb3BMZXZlbEtleXdvcmRNb2RpZmllcnMoVG9rZW4gc3RhcnQsIFRva2VuIGtleXdvcmQpIHsKICAgIFRva2VuIG1vZGlmaWVyID0gc3RhcnQubmV4dDsKICAgIHdoaWxlIChtb2RpZmllciAhPSBrZXl3b3JkKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFRvcExldmVsTW9kaWZpZXJFcnJvcihtb2RpZmllciwga2V5d29yZCk7CiAgICAgIG1vZGlmaWVyID0gbW9kaWZpZXIubmV4dDsKICAgIH0KICB9CgogIC8vIFJlcG9ydCBhbiBlcnJvciBmb3IgdGhlIGdpdmVuIG1vZGlmaWVyIHByZWNlZGluZyBhIHRvcCBsZXZlbCBrZXl3b3JkCiAgLy8gc3VjaCBhcyBgaW1wb3J0YCBvciBgY2xhc3NgLgogIHZvaWQgcmVwb3J0VG9wTGV2ZWxNb2RpZmllckVycm9yKFRva2VuIG1vZGlmaWVyLCBUb2tlbiBhZnRlck1vZGlmaWVycykgewogICAgaWYgKG9wdGlvbmFsKCdjb25zdCcsIG1vZGlmaWVyKSAmJiBvcHRpb25hbCgnY2xhc3MnLCBhZnRlck1vZGlmaWVycykpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtb2RpZmllciwgY29kZXMubWVzc2FnZUNvbnN0Q2xhc3MpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnZXh0ZXJuYWwnLCBtb2RpZmllcikpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdjbGFzcycsIGFmdGVyTW9kaWZpZXJzKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobW9kaWZpZXIsIGNvZGVzLm1lc3NhZ2VFeHRlcm5hbENsYXNzKTsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnZW51bScsIGFmdGVyTW9kaWZpZXJzKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobW9kaWZpZXIsIGNvZGVzLm1lc3NhZ2VFeHRlcm5hbEVudW0pOwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd0eXBlZGVmJywgYWZ0ZXJNb2RpZmllcnMpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihtb2RpZmllciwgY29kZXMubWVzc2FnZUV4dGVybmFsVHlwZWRlZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgbW9kaWZpZXIsIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIG1vZGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICB9CiAgfQoKICAvLy8gUGFyc2UgYW55IHRvcC1sZXZlbCBkZWNsYXJhdGlvbiB0aGF0IGJlZ2lucyB3aXRoIGEga2V5d29yZC4KICAvLy8gW3N0YXJ0XSBpcyB0aGUgdG9rZW4gYmVmb3JlIGFueSBtb2RpZmllcnMgcHJlY2VkaW5nIFtrZXl3b3JkXS4KICBUb2tlbiBwYXJzZVRvcExldmVsS2V5d29yZERlY2xhcmF0aW9uKAogICAgICBUb2tlbiBzdGFydCwgVG9rZW4ga2V5d29yZCwgRGlyZWN0aXZlQ29udGV4dCBkaXJlY3RpdmVTdGF0ZSkgewogICAgYXNzZXJ0KGtleXdvcmQuaXNUb3BMZXZlbEtleXdvcmQpOwogICAgZmluYWwgU3RyaW5nIHZhbHVlID0ga2V5d29yZC5zdHJpbmdWYWx1ZTsKICAgIGlmIChpZGVudGljYWwodmFsdWUsICdjbGFzcycpKSB7CiAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgIFRva2VuIGFic3RyYWN0VG9rZW4gPSBwYXJzZUNsYXNzRGVjbGFyYXRpb25Nb2RpZmllcnMoc3RhcnQsIGtleXdvcmQpOwogICAgICByZXR1cm4gcGFyc2VDbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uKGFic3RyYWN0VG9rZW4sIGtleXdvcmQpOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdlbnVtJykpIHsKICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgcGFyc2VUb3BMZXZlbEtleXdvcmRNb2RpZmllcnMoc3RhcnQsIGtleXdvcmQpOwogICAgICByZXR1cm4gcGFyc2VFbnVtKGtleXdvcmQpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIHJlbWFpbmluZyB0b3AgbGV2ZWwga2V5d29yZHMgYXJlIGJ1aWx0LWluIGtleXdvcmRzCiAgICAgIC8vIGFuZCBjYW4gYmUgdXNlZCBpbiBhIHRvcCBsZXZlbCBkZWNsYXJhdGlvbgogICAgICAvLyBhcyBhbiBpZGVudGlmaWVyIHN1Y2ggYXMgImFic3RyYWN0PFQ+KCkgPT4gMDsiCiAgICAgIC8vIG9yIGFzIGEgcHJlZml4IHN1Y2ggYXMgImFic3RyYWN0LkEgYigpID0+IDA7Ii4KICAgICAgU3RyaW5nIG5leHRWYWx1ZSA9IGtleXdvcmQubmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0VmFsdWUsICcoJykgfHwgaWRlbnRpY2FsKG5leHRWYWx1ZSwgJy4nKSkgewogICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0RlY2xhcmF0aW9uKCk7CiAgICAgICAgcmV0dXJuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKHN0YXJ0KTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwobmV4dFZhbHVlLCAnPCcpKSB7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2V4dGVuc2lvbicpKSB7CiAgICAgICAgICAvLyBUaGUgbmFtZSBpbiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gaXMgb3B0aW9uYWw6CiAgICAgICAgICAvLyBgZXh0ZW5zaW9uPFQ+IG9uIC4uLmAKICAgICAgICAgIFRva2VuIGVuZEdyb3VwID0ga2V5d29yZC5uZXh0LmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwICE9IG51bGwgJiYgb3B0aW9uYWwoJ29uJywgZW5kR3JvdXAubmV4dCkpIHsKICAgICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0ZW5zaW9uKGtleXdvcmQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbChzdGFydCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFyc2VUb3BMZXZlbEtleXdvcmRNb2RpZmllcnMoc3RhcnQsIGtleXdvcmQpOwogICAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdpbXBvcnQnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrSW1wb3J0KHRoaXMsIGtleXdvcmQpOwogICAgICAgICAgcmV0dXJuIHBhcnNlSW1wb3J0KGtleXdvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZXhwb3J0JykpIHsKICAgICAgICAgIGRpcmVjdGl2ZVN0YXRlPy5jaGVja0V4cG9ydCh0aGlzLCBrZXl3b3JkKTsKICAgICAgICAgIHJldHVybiBwYXJzZUV4cG9ydChrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3R5cGVkZWYnKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgIHJldHVybiBwYXJzZVR5cGVkZWYoa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdtaXhpbicpKSB7CiAgICAgICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tEZWNsYXJhdGlvbigpOwogICAgICAgICAgcmV0dXJuIHBhcnNlTWl4aW4oa2V5d29yZCk7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdleHRlbnNpb24nKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrRGVjbGFyYXRpb24oKTsKICAgICAgICAgIHJldHVybiBwYXJzZUV4dGVuc2lvbihrZXl3b3JkKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3BhcnQnKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlUGFydE9yUGFydE9mKGtleXdvcmQsIGRpcmVjdGl2ZVN0YXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2xpYnJhcnknKSkgewogICAgICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrTGlicmFyeSh0aGlzLCBrZXl3b3JkKTsKICAgICAgICAgIHJldHVybiBwYXJzZUxpYnJhcnlOYW1lKGtleXdvcmQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogVW5oYW5kbGVkIHRvcCBsZXZlbCBrZXl3b3JkICckdmFsdWUnLiI7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGxpYnJhcnlEaXJlY3RpdmU6CiAgLy8vICAgJ2xpYnJhcnknIHF1YWxpZmllZCAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpYnJhcnlOYW1lKFRva2VuIGxpYnJhcnlLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2xpYnJhcnknLCBsaWJyYXJ5S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5MaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkKGxpYnJhcnlLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZSwKICAgICAgICBJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZUNvbnRpbnVhdGlvbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRMaWJyYXJ5TmFtZShsaWJyYXJ5S2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBpbXBvcnRQcmVmaXg6CiAgLy8vICAgJ2RlZmVycmVkJz8gJ2FzJyBpZGVudGlmaWVyCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJbXBvcnRQcmVmaXhPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCdkZWZlcnJlZCcsIG5leHQpICYmIG9wdGlvbmFsKCdhcycsIG5leHQubmV4dCkpIHsKICAgICAgVG9rZW4gZGVmZXJyZWRUb2tlbiA9IG5leHQ7CiAgICAgIFRva2VuIGFzS2V5d29yZCA9IG5leHQubmV4dDsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKAogICAgICAgICAgYXNLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5pbXBvcnRQcmVmaXhEZWNsYXJhdGlvbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeChkZWZlcnJlZFRva2VuLCBhc0tleXdvcmQpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnYXMnLCBuZXh0KSkgewogICAgICBUb2tlbiBhc0tleXdvcmQgPSBuZXh0OwogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIobmV4dCwgSWRlbnRpZmllckNvbnRleHQuaW1wb3J0UHJlZml4RGVjbGFyYXRpb24pOwogICAgICBsaXN0ZW5lci5oYW5kbGVJbXBvcnRQcmVmaXgobnVsbCwgYXNLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeChudWxsLCBudWxsKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gaW1wb3J0RGlyZWN0aXZlOgogIC8vLyAgICdpbXBvcnQnIHVyaSAoJ2lmJyAnKCcgdGVzdCAnKScgdXJpKSogaW1wb3J0UHJlZml4PyBjb21iaW5hdG9yKiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUltcG9ydChUb2tlbiBpbXBvcnRLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ltcG9ydCcsIGltcG9ydEtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luSW1wb3J0KGltcG9ydEtleXdvcmQpOwogICAgVG9rZW4gdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKGltcG9ydEtleXdvcmQpOwogICAgVG9rZW4gdXJpID0gdG9rZW47CiAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VJbXBvcnRQcmVmaXhPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbWJpbmF0b3JTdGFyKHRva2VuKS5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc7JywgdG9rZW4pKSB7CiAgICAgIGxpc3RlbmVyLmVuZEltcG9ydChpbXBvcnRLZXl3b3JkLCB0b2tlbik7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGxpc3RlbmVyLmVuZEltcG9ydChpbXBvcnRLZXl3b3JkLCBudWxsKTsKICAgICAgcmV0dXJuIHBhcnNlSW1wb3J0UmVjb3ZlcnkodXJpKTsKICAgIH0KICB9CgogIC8vLyBSZWNvdmVyIGdpdmVuIG91dC1vZi1vcmRlciBjbGF1c2VzIGluIGFuIGltcG9ydCBkaXJlY3RpdmUgd2hlcmUgW3Rva2VuXSBpcwogIC8vLyB0aGUgaW1wb3J0IGtleXdvcmQuCiAgVG9rZW4gcGFyc2VJbXBvcnRSZWNvdmVyeShUb2tlbiB0b2tlbikgewogICAgZmluYWwgTGlzdGVuZXIgcHJpbWFyeUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBmaW5hbCBJbXBvcnRSZWNvdmVyeUxpc3RlbmVyIHJlY292ZXJ5TGlzdGVuZXIgPQogICAgICAgIG5ldyBJbXBvcnRSZWNvdmVyeUxpc3RlbmVyKCk7CgogICAgLy8gUmVwYXJzZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhdXNlcyBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQKICAgIC8vIGJ1dCBpbnRlcmNlcHQgdGhlIGV2ZW50cyBzbyB0aGV5IGFyZSBub3Qgc2VudCB0byB0aGUgcHJpbWFyeSBsaXN0ZW5lcgogICAgbGlzdGVuZXIgPSByZWNvdmVyeUxpc3RlbmVyOwogICAgdG9rZW4gPSBwYXJzZUNvbmRpdGlvbmFsVXJpU3Rhcih0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlSW1wb3J0UHJlZml4T3B0KHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDb21iaW5hdG9yU3Rhcih0b2tlbik7CgogICAgVG9rZW4gZmlyc3REZWZlcnJlZEtleXdvcmQgPSByZWNvdmVyeUxpc3RlbmVyLmRlZmVycmVkS2V5d29yZDsKICAgIGJvb2wgaGFzUHJlZml4ID0gcmVjb3ZlcnlMaXN0ZW5lci5hc0tleXdvcmQgIT0gbnVsbDsKICAgIGJvb2wgaGFzQ29tYmluYXRvciA9IHJlY292ZXJ5TGlzdGVuZXIuaGFzQ29tYmluYXRvcjsKCiAgICAvLyBVcGRhdGUgdGhlIHJlY292ZXJ5IGxpc3RlbmVyIHRvIGZvcndhcmQgc3Vic2VxdWVudCBldmVudHMKICAgIC8vIHRvIHRoZSBwcmltYXJ5IGxpc3RlbmVyCiAgICByZWNvdmVyeUxpc3RlbmVyLmxpc3RlbmVyID0gcHJpbWFyeUxpc3RlbmVyOwoKICAgIC8vIFBhcnNlIGFkZGl0aW9uYWwgb3V0LW9mLW9yZGVyIGNsYXVzZXMuCiAgICBUb2tlbiBzZW1pY29sb247CiAgICBkbyB7CiAgICAgIFRva2VuIHN0YXJ0ID0gdG9rZW4ubmV4dDsKCiAgICAgIC8vIENoZWNrIGZvciBleHRyYW5lb3VzIHRva2VuIGluIHRoZSBtaWRkbGUgb2YgYW4gaW1wb3J0IHN0YXRlbWVudC4KICAgICAgdG9rZW4gPSBza2lwVW5leHBlY3RlZFRva2VuT3B0KAogICAgICAgICAgdG9rZW4sIGNvbnN0IDxTdHJpbmc+WydpZicsICdkZWZlcnJlZCcsICdhcycsICdoaWRlJywgJ3Nob3cnLCAnOyddKTsKCiAgICAgIC8vIER1cmluZyByZWNvdmVyeSwgY2xhdXNlcyBhcmUgcGFyc2VkIGluIHRoZSBzYW1lIG9yZGVyCiAgICAgIC8vIGFuZCBnZW5lcmF0ZSB0aGUgc2FtZSBldmVudHMgYXMgaW4gdGhlIHBhcnNlSW1wb3J0IG1ldGhvZCBhYm92ZS4KICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5jbGVhcigpOwogICAgICB0b2tlbiA9IHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKHRva2VuKTsKICAgICAgaWYgKHJlY292ZXJ5TGlzdGVuZXIuaWZLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoZmlyc3REZWZlcnJlZEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCBlcnJvciBpbmRpY2F0aW5nIGNvbmRpdGlvbmFsIHNob3VsZAogICAgICAgICAgLy8gYmUgbW92ZWQgYmVmb3JlIGRlZmVycmVkIGtleXdvcmQKICAgICAgICB9IGVsc2UgaWYgKGhhc1ByZWZpeCkgewogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCBlcnJvciBpbmRpY2F0aW5nIGNvbmRpdGlvbmFsIHNob3VsZAogICAgICAgICAgLy8gYmUgbW92ZWQgYmVmb3JlIHByZWZpeCBjbGF1c2UKICAgICAgICB9IGVsc2UgaWYgKGhhc0NvbWJpbmF0b3IpIHsKICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiByZXBvcnQgZXJyb3IgaW5kaWNhdGluZyBjb25kaXRpb25hbCBzaG91bGQKICAgICAgICAgIC8vIGJlIG1vdmVkIGJlZm9yZSBjb21iaW5hdG9ycwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG9wdGlvbmFsKCdkZWZlcnJlZCcsIHRva2VuLm5leHQpICYmCiAgICAgICAgICAhb3B0aW9uYWwoJ2FzJywgdG9rZW4ubmV4dC5uZXh0KSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZUltcG9ydFByZWZpeCh0b2tlbi5uZXh0LCBudWxsKTsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUltcG9ydFByZWZpeE9wdCh0b2tlbik7CiAgICAgIH0KICAgICAgaWYgKHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoZmlyc3REZWZlcnJlZEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLmRlZmVycmVkS2V5d29yZCwgY29kZXMubWVzc2FnZUR1cGxpY2F0ZURlZmVycmVkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc1ByZWZpeCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHJlY292ZXJ5TGlzdGVuZXIuZGVmZXJyZWRLZXl3b3JkLAogICAgICAgICAgICAgICAgY29kZXMubWVzc2FnZURlZmVycmVkQWZ0ZXJQcmVmaXgpOwogICAgICAgICAgfQogICAgICAgICAgZmlyc3REZWZlcnJlZEtleXdvcmQgPSByZWNvdmVyeUxpc3RlbmVyLmRlZmVycmVkS2V5d29yZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHJlY292ZXJ5TGlzdGVuZXIuYXNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzUHJlZml4KSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIuYXNLZXl3b3JkLCBjb2Rlcy5tZXNzYWdlRHVwbGljYXRlUHJlZml4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc0NvbWJpbmF0b3IpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIuYXNLZXl3b3JkLCBjb2Rlcy5tZXNzYWdlUHJlZml4QWZ0ZXJDb21iaW5hdG9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGhhc1ByZWZpeCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICB0b2tlbiA9IHBhcnNlQ29tYmluYXRvclN0YXIodG9rZW4pOwogICAgICBoYXNDb21iaW5hdG9yID0gaGFzQ29tYmluYXRvciB8fCByZWNvdmVyeUxpc3RlbmVyLmhhc0NvbWJpbmF0b3I7CgogICAgICBpZiAob3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICAgIHNlbWljb2xvbiA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHN0YXJ0LCB0b2tlbi5uZXh0KSkgewogICAgICAgIC8vIElmIG5vIGZvcndhcmQgcHJvZ3Jlc3Mgd2FzIG1hZGUsIGluc2VydCAnOycgc28gdGhhdCB3ZSBleGl0IGxvb3AuCiAgICAgICAgc2VtaWNvbG9uID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgICAgfQogICAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVySW1wb3J0KHNlbWljb2xvbik7CiAgICB9IHdoaWxlIChzZW1pY29sb24gPT0gbnVsbCk7CgogICAgaWYgKGZpcnN0RGVmZXJyZWRLZXl3b3JkICE9IG51bGwgJiYgIWhhc1ByZWZpeCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgZmlyc3REZWZlcnJlZEtleXdvcmQsIGNvZGVzLm1lc3NhZ2VNaXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydCk7CiAgICB9CgogICAgcmV0dXJuIHNlbWljb2xvbjsKICB9CgogIC8vLyBgYGAKICAvLy8gY29uZGl0aW9uYWxVcmlzOgogIC8vLyAgIGNvbmRpdGlvbmFsVXJpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29uZGl0aW9uYWxVcmlTdGFyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lci5iZWdpbkNvbmRpdGlvbmFsVXJpcyh0b2tlbi5uZXh0KTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAob3B0aW9uYWwoJ2lmJywgdG9rZW4ubmV4dCkpIHsKICAgICAgY291bnQrKzsKICAgICAgdG9rZW4gPSBwYXJzZUNvbmRpdGlvbmFsVXJpKHRva2VuKTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZENvbmRpdGlvbmFsVXJpcyhjb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGNvbmRpdGlvbmFsVXJpOgogIC8vLyAgICdpZicgJygnIGRvdHRlZE5hbWUgKCc9PScgbGl0ZXJhbFN0cmluZyk/ICcpJyB1cmkKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUNvbmRpdGlvbmFsVXJpKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBpZktleXdvcmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2lmJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luQ29uZGl0aW9uYWxVcmkodG9rZW4pOwogICAgVG9rZW4gbGVmdFBhcmVuID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBsZWZ0UGFyZW4pKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBsZWZ0UGFyZW4sIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgbGVmdFBhcmVuID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCB0cnVlKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VEb3R0ZWROYW1lKGxlZnRQYXJlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIFRva2VuIGVxdWFsaXR5U2lnbjsKICAgIGlmIChvcHRpb25hbCgnPT0nLCBuZXh0KSkgewogICAgICBlcXVhbGl0eVNpZ24gPSBuZXh0OwogICAgICB0b2tlbiA9IGVuc3VyZUxpdGVyYWxTdHJpbmcobmV4dCk7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgaWYgKG5leHQgIT0gbGVmdFBhcmVuLmVuZEdyb3VwKSB7CiAgICAgIFRva2VuIGVuZEdyb3VwID0gbGVmdFBhcmVuLmVuZEdyb3VwOwogICAgICBpZiAoZW5kR3JvdXAuaXNTeW50aGV0aWMpIHsKICAgICAgICAvLyBUaGUgc2Nhbm5lciBkaWQgbm90IHBsYWNlIHRoZSBzeW50aGV0aWMgJyknIGNvcnJlY3RseSwgc28gbW92ZSBpdC4KICAgICAgICBuZXh0ID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgZW5kR3JvdXApOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgY29kZXMudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgIG5leHQgPSBlbmRHcm91cDsKICAgICAgfQogICAgfQogICAgdG9rZW4gPSBuZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKCiAgICB0b2tlbiA9IGVuc3VyZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kQ29uZGl0aW9uYWxVcmkoaWZLZXl3b3JkLCBsZWZ0UGFyZW4sIGVxdWFsaXR5U2lnbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGRvdHRlZE5hbWU6CiAgLy8vICAgaWRlbnRpZmllciAoJy4nIGlkZW50aWZpZXIpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRG90dGVkTmFtZShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5kb3R0ZWROYW1lKTsKICAgIFRva2VuIGZpcnN0SWRlbnRpZmllciA9IHRva2VuOwogICAgaW50IGNvdW50ID0gMTsKICAgIHdoaWxlIChvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgIHRva2VuLm5leHQsIElkZW50aWZpZXJDb250ZXh0LmRvdHRlZE5hbWVDb250aW51YXRpb24pOwogICAgICBjb3VudCsrOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlRG90dGVkTmFtZShjb3VudCwgZmlyc3RJZGVudGlmaWVyKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZXhwb3J0RGlyZWN0aXZlOgogIC8vLyAgICdleHBvcnQnIHVyaSBjb25kaXRpb25hbC11cmlzKiBjb21iaW5hdG9yKiAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2V4cG9ydCcsIGV4cG9ydEtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luRXhwb3J0KGV4cG9ydEtleXdvcmQpOwogICAgVG9rZW4gdG9rZW4gPSBlbnN1cmVMaXRlcmFsU3RyaW5nKGV4cG9ydEtleXdvcmQpOwogICAgdG9rZW4gPSBwYXJzZUNvbmRpdGlvbmFsVXJpU3Rhcih0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlQ29tYmluYXRvclN0YXIodG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kRXhwb3J0KGV4cG9ydEtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gY29tYmluYXRvcnM6CiAgLy8vICAgKGhpZGVDb21iaW5hdG9yIHwgc2hvd0NvbWJpbmF0b3IpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29tYmluYXRvclN0YXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5Db21iaW5hdG9ycyhuZXh0KTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoaWRlbnRpY2FsKCdoaWRlJywgdmFsdWUpKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUhpZGUodG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnc2hvdycsIHZhbHVlKSkgewogICAgICAgIHRva2VuID0gcGFyc2VTaG93KHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsaXN0ZW5lci5lbmRDb21iaW5hdG9ycyhjb3VudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGhpZGVDb21iaW5hdG9yOgogIC8vLyAgICdoaWRlJyBpZGVudGlmaWVyTGlzdAogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlSGlkZShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gaGlkZUtleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdoaWRlJywgaGlkZUtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luSGlkZShoaWRlS2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlSWRlbnRpZmllckxpc3QoaGlkZUtleXdvcmQpOwogICAgbGlzdGVuZXIuZW5kSGlkZShoaWRlS2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHNob3dDb21iaW5hdG9yOgogIC8vLyAgICdzaG93JyBpZGVudGlmaWVyTGlzdAogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlU2hvdyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gc2hvd0tleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdzaG93Jywgc2hvd0tleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luU2hvdyhzaG93S2V5d29yZCk7CiAgICB0b2tlbiA9IHBhcnNlSWRlbnRpZmllckxpc3Qoc2hvd0tleXdvcmQpOwogICAgbGlzdGVuZXIuZW5kU2hvdyhzaG93S2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGlkZW50aWZpZXJMaXN0OgogIC8vLyAgIGlkZW50aWZpZXIgKCcsJyBpZGVudGlmaWVyKSoKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUlkZW50aWZpZXJMaXN0KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmNvbWJpbmF0b3IpOwogICAgaW50IGNvdW50ID0gMTsKICAgIHdoaWxlIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbi5uZXh0LCBJZGVudGlmaWVyQ29udGV4dC5jb21iaW5hdG9yKTsKICAgICAgY291bnQrKzsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXJMaXN0KGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gdHlwZUxpc3Q6CiAgLy8vICAgdHlwZSAoJywnIHR5cGUpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVHlwZUxpc3QoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyLmJlZ2luVHlwZUxpc3QodG9rZW4ubmV4dCk7CiAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKHRva2VuLCB0cnVlKS5lbnN1cmVUeXBlT3JWb2lkKHRva2VuLCB0aGlzKTsKICAgIGludCBjb3VudCA9IDE7CiAgICB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKHRva2VuLm5leHQsIHRydWUpLmVuc3VyZVR5cGVPclZvaWQodG9rZW4ubmV4dCwgdGhpcyk7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRUeXBlTGlzdChjb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVBhcnRPclBhcnRPZihUb2tlbiBwYXJ0S2V5d29yZCwgRGlyZWN0aXZlQ29udGV4dCBkaXJlY3RpdmVTdGF0ZSkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdwYXJ0JywgcGFydEtleXdvcmQpKTsKICAgIGlmIChvcHRpb25hbCgnb2YnLCBwYXJ0S2V5d29yZC5uZXh0KSkgewogICAgICBkaXJlY3RpdmVTdGF0ZT8uY2hlY2tQYXJ0T2YodGhpcywgcGFydEtleXdvcmQpOwogICAgICByZXR1cm4gcGFyc2VQYXJ0T2YocGFydEtleXdvcmQpOwogICAgfSBlbHNlIHsKICAgICAgZGlyZWN0aXZlU3RhdGU/LmNoZWNrUGFydCh0aGlzLCBwYXJ0S2V5d29yZCk7CiAgICAgIHJldHVybiBwYXJzZVBhcnQocGFydEtleXdvcmQpOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBwYXJ0RGlyZWN0aXZlOgogIC8vLyAgICdwYXJ0JyB1cmkgJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VQYXJ0KFRva2VuIHBhcnRLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3BhcnQnLCBwYXJ0S2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5QYXJ0KHBhcnRLZXl3b3JkKTsKICAgIFRva2VuIHRva2VuID0gZW5zdXJlTGl0ZXJhbFN0cmluZyhwYXJ0S2V5d29yZCk7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRQYXJ0KHBhcnRLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHBhcnRPZkRpcmVjdGl2ZToKICAvLy8gICAncGFydCcgJ29mJyAocXVhbGlmaWVkIHwgdXJpKSAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVBhcnRPZihUb2tlbiBwYXJ0S2V5d29yZCkgewogICAgVG9rZW4gb2ZLZXl3b3JkID0gcGFydEtleXdvcmQubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgncGFydCcsIHBhcnRLZXl3b3JkKSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJ29mJywgb2ZLZXl3b3JkKSk7CiAgICBsaXN0ZW5lci5iZWdpblBhcnRPZihwYXJ0S2V5d29yZCk7CiAgICBib29sIGhhc05hbWUgPSBvZktleXdvcmQubmV4dC5pc0lkZW50aWZpZXI7CiAgICBUb2tlbiB0b2tlbjsKICAgIGlmIChoYXNOYW1lKSB7CiAgICAgIHRva2VuID0gcGFyc2VRdWFsaWZpZWQob2ZLZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZSwKICAgICAgICAgIElkZW50aWZpZXJDb250ZXh0LnBhcnROYW1lQ29udGludWF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gZW5zdXJlTGl0ZXJhbFN0cmluZyhvZktleXdvcmQpOwogICAgfQogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kUGFydE9mKHBhcnRLZXl3b3JkLCBvZktleXdvcmQsIHRva2VuLCBoYXNOYW1lKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gbWV0YWRhdGE6CiAgLy8vICAgYW5ub3RhdGlvbioKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1ldGFkYXRhU3RhcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXIuYmVnaW5NZXRhZGF0YVN0YXIodG9rZW4ubmV4dCk7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKG9wdGlvbmFsKCdAJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhKHRva2VuKTsKICAgICAgY291bnQrKzsKICAgIH0KICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhU3Rhcihjb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGFubm90YXRpb246CiAgLy8vICAgJ0AnIHF1YWxpZmllZCAoJy4nIGlkZW50aWZpZXIpPyBhcmd1bWVudHM/CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VNZXRhZGF0YShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYXRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ0AnLCBhdFRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbk1ldGFkYXRhKGF0VG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKGF0VG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGFkYXRhUmVmZXJlbmNlKTsKICAgIHRva2VuID0KICAgICAgICBwYXJzZVF1YWxpZmllZFJlc3RPcHQodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGFkYXRhQ29udGludWF0aW9uKTsKICAgIGlmIChvcHRpb25hbCgiPCIsIHRva2VuLm5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4ubmV4dCwgY29kZXMubWVzc2FnZU1ldGFkYXRhVHlwZUFyZ3VtZW50cyk7CiAgICB9CiAgICB0b2tlbiA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbikucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgVG9rZW4gcGVyaW9kID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgIHBlcmlvZCA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgIHBlcmlvZCwgSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50c09wdCh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRNZXRhZGF0YShhdFRva2VuLCBwZXJpb2QsIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBzY3JpcHRUYWc6CiAgLy8vICAgJyMhJyAoy5xORVdMSU5FKSogTkVXTElORQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlU2NyaXB0KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLnR5cGUsIFRva2VuVHlwZS5TQ1JJUFRfVEFHKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVTY3JpcHQodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0eXBlQWxpYXM6CiAgLy8vICAgbWV0YWRhdGEgJ3R5cGVkZWYnIHR5cGVBbGlhc0JvZHkgfAogIC8vLyAgIG1ldGFkYXRhICd0eXBlZGVmJyBpZGVudGlmaWVyIHR5cGVQYXJhbWV0ZXJzPyAnPScgZnVuY3Rpb25UeXBlICc7JwogIC8vLyA7CiAgLy8vCiAgLy8vIGZ1bmN0aW9uVHlwZToKICAvLy8gICByZXR1cm5UeXBlPyAnRnVuY3Rpb24nIHR5cGVQYXJhbWV0ZXJzPyBwYXJhbWV0ZXJUeXBlTGlzdAogIC8vLwogIC8vLyB0eXBlQWxpYXNCb2R5OgogIC8vLyAgIGZ1bmN0aW9uVHlwZUFsaWFzCiAgLy8vIDsKICAvLy8KICAvLy8gZnVuY3Rpb25UeXBlQWxpYXM6CiAgLy8vICAgZnVuY3Rpb25QcmVmaXggdHlwZVBhcmFtZXRlcnM/IGZvcm1hbFBhcmFtZXRlckxpc3Qg4oCYO+KAmQogIC8vLyA7CiAgLy8vCiAgLy8vIGZ1bmN0aW9uUHJlZml4OgogIC8vLyAgIHJldHVyblR5cGU/IGlkZW50aWZpZXIKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVR5cGVkZWYoVG9rZW4gdHlwZWRlZktleXdvcmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgndHlwZWRlZicsIHR5cGVkZWZLZXl3b3JkKSk7CiAgICBsaXN0ZW5lci5iZWdpbkZ1bmN0aW9uVHlwZUFsaWFzKHR5cGVkZWZLZXl3b3JkKTsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUodHlwZWRlZktleXdvcmQsIGZhbHNlKTsKICAgIFRva2VuIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUodHlwZWRlZktleXdvcmQpLm5leHQ7CiAgICBUb2tlbiBlcXVhbHM7CiAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCB0cnVlKTsKICAgIGlmICh0eXBlSW5mbyA9PSBub1R5cGUgJiYKICAgICAgICAodG9rZW4ua2luZCA9PSBJREVOVElGSUVSX1RPS0VOIHx8IHRva2VuLnR5cGUuaXNQc2V1ZG8pICYmCiAgICAgICAgb3B0aW9uYWwoJz0nLCB0eXBlUGFyYW0uc2tpcCh0b2tlbikubmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZWRlZkRlY2xhcmF0aW9uKTsKICAgICAgdG9rZW4gPSB0eXBlUGFyYW0ucGFyc2VWYXJpYWJsZXModG9rZW4sIHRoaXMpLm5leHQ7CiAgICAgIC8vIHBhcnNlVmFyaWFibGVzIHJld3JpdGVzIHNvIGV2ZW4gdGhvdWdoIHdlIGNoZWNrZWQgaW4gdGhlIGlmLAogICAgICAvLyB3ZSBtaWdodCBub3QgaGF2ZSBhbiBlcXVhbCBoZXJlIG5vdy4KICAgICAgaWYgKCFvcHRpb25hbCgnPScsIHRva2VuKSAmJiBvcHRpb25hbCgnPScsIHRva2VuLm5leHQpKSB7CiAgICAgICAgLy8gUmVjb3ZlcnkgYWZ0ZXIgcmVjb3Zlcnk6IEEgdG9rZW4gd2FzIGluc2VydGVkLCBidXQgd2UnbGwgc2tpcCBpdCBub3cKICAgICAgICAvLyB0byBnZXQgbW9yZSBpbiBsaW5lIHdpdGggd2hhdCB3ZSB0aG91Z2h0IGluIHRoZSBpZiBiZWZvcmUuCiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmIChvcHRpb25hbCgnPScsIHRva2VuKSkgewogICAgICAgIGVxdWFscyA9IHRva2VuOwogICAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUoZXF1YWxzLCB0cnVlKS5lbnN1cmVUeXBlT3JWb2lkKGVxdWFscywgdGhpcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQSByZXdyaXRlIGNhdXNlZCB0aGUgPSB0byBkaXNhcHBlYXIKICAgICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyc1JlcXVpcmVkT3B0KAogICAgICAgICAgICB0b2tlbiwgTWVtYmVyS2luZC5GdW5jdGlvblR5cGVBbGlhcyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKHR5cGVkZWZLZXl3b3JkLCB0aGlzKTsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlZGVmRGVjbGFyYXRpb24pOwogICAgICB0b2tlbiA9IHR5cGVQYXJhbS5wYXJzZVZhcmlhYmxlcyh0b2tlbiwgdGhpcyk7CiAgICAgIHRva2VuID0KICAgICAgICAgIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1JlcXVpcmVkT3B0KHRva2VuLCBNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZUFsaWFzKTsKICAgIH0KICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uVHlwZUFsaWFzKHR5cGVkZWZLZXl3b3JkLCBlcXVhbHMsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBhIG1peGluIGFwcGxpY2F0aW9uIHN0YXJ0aW5nIGZyb20gYHdpdGhgLiBBc3N1bWVzIHRoYXQgdGhlIGZpcnN0CiAgLy8vIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQuCiAgVG9rZW4gcGFyc2VNaXhpbkFwcGxpY2F0aW9uUmVzdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gd2l0aEtleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnd2l0aCcsIHdpdGhLZXl3b3JkKSkgewogICAgICAvLyBSZWNvdmVyeTogUmVwb3J0IGFuIGVycm9yIGFuZCBpbnNlcnQgc3ludGhldGljIGB3aXRoYCBjbGF1c2UuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICB3aXRoS2V5d29yZCwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd3aXRoJykpOwogICAgICB3aXRoS2V5d29yZCA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0tleXdvcmQodG9rZW4sIEtleXdvcmQuV0lUSCk7CiAgICAgIGlmICghaXNWYWxpZFR5cGVSZWZlcmVuY2Uod2l0aEtleXdvcmQubmV4dCkpIHsKICAgICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHdpdGhLZXl3b3JkKTsKICAgICAgfQogICAgfQogICAgdG9rZW4gPSBwYXJzZVR5cGVMaXN0KHdpdGhLZXl3b3JkKTsKICAgIGxpc3RlbmVyLmhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2Uod2l0aEtleXdvcmQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VXaXRoQ2xhdXNlT3B0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiB3aXRoS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ3dpdGgnLCB3aXRoS2V5d29yZCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZVR5cGVMaXN0KHdpdGhLZXl3b3JkKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NXaXRoQ2xhdXNlKHdpdGhLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzTm9XaXRoQ2xhdXNlKCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgZ2V0dGVyICh3aGljaCBzaG91bGRuJ3QgaGF2ZSBwYXJhbWV0ZXJzKQogIC8vLyBvciBmdW5jdGlvbiBvciBtZXRob2QuCiAgVG9rZW4gcGFyc2VHZXR0ZXJPckZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIFRva2VuIHRva2VuLCBUb2tlbiBuYW1lLCBib29sIGlzR2V0dGVyLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCIoIiwgbmV4dCkpIHsKICAgICAgaWYgKGlzR2V0dGVyKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlR2V0dGVyV2l0aEZvcm1hbHMpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICAgIH0gZWxzZSBpZiAoaXNHZXR0ZXIpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKG5leHQsIGtpbmQpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCdvcGVyYXRvcicsIG5hbWUpKSB7CiAgICAgICAgVG9rZW4gbmV4dCA9IG5hbWUubmV4dDsKICAgICAgICBpZiAobmV4dC5pc09wZXJhdG9yKSB7CiAgICAgICAgICBuYW1lID0gbmV4dDsKICAgICAgICB9IGVsc2UgaWYgKGlzVW5hcnlNaW51cyhuZXh0KSkgewogICAgICAgICAgbmFtZSA9IG5leHQubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuYW1lLCBtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZShraW5kKSk7CiAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCBmYWxzZSk7CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVzdCh0b2tlbiwga2luZCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNPcHQoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMobmV4dCwga2luZCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBza2lwRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICByZXR1cm4gc2tpcEZvcm1hbFBhcmFtZXRlcnNSZXN0KHRva2VuLm5leHQsIGtpbmQpOwogIH0KCiAgVG9rZW4gc2tpcEZvcm1hbFBhcmFtZXRlcnNSZXN0KFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuKSk7CiAgICAvLyBUT0RPKGFoZSk6IFNob3VsZG4ndCB0aGlzIGJlIGBiZWdpbkZvcm1hbFBhcmFtZXRlcnNgPwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnModG9rZW4pOwogICAgVG9rZW4gY2xvc2VCcmFjZSA9IHRva2VuLmVuZEdyb3VwOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgY2xvc2VCcmFjZSkpOwogICAgbGlzdGVuZXIuZW5kRm9ybWFsUGFyYW1ldGVycygwLCB0b2tlbiwgY2xvc2VCcmFjZSwga2luZCk7CiAgICByZXR1cm4gY2xvc2VCcmFjZTsKICB9CgogIC8vLyBQYXJzZXMgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBvZiBhIGZ1bmN0aW9uLgogIC8vLwogIC8vLyBJZiBga2luZCA9PSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlYCwgdGhlbiBuYW1lcyBtYXkgYmUKICAvLy8gb21pdHRlZCAoZXhjZXB0IGZvciBuYW1lZCBhcmd1bWVudHMpLiBPdGhlcndpc2UsIHR5cGVzIG1heSBiZSBvbWl0dGVkLgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1JlcXVpcmVkT3B0KFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgbWlzc2luZ1BhcmFtZXRlck1lc3NhZ2Uoa2luZCkpOwogICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCBmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVzdChuZXh0LCBraW5kKTsKICB9CgogIC8vLyBQYXJzZXMgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdCBvZiBhIGZ1bmN0aW9uIGdpdmVuIHRoYXQgdGhlIGxlZnQKICAvLy8gcGFyZW50aGVzaXMgaXMga25vd24gdG8gZXhpc3QuCiAgLy8vCiAgLy8vIElmIGBraW5kID09IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGVgLCB0aGVuIG5hbWVzIG1heSBiZQogIC8vLyBvbWl0dGVkIChleGNlcHQgZm9yIG5hbWVkIGFyZ3VtZW50cykuIE90aGVyd2lzZSwgdHlwZXMgbWF5IGJlIG9taXR0ZWQuCiAgVG9rZW4gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIHJldHVybiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KHRva2VuLm5leHQsIGtpbmQpOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgZm9ybWFsIHBhcmFtZXRlciBsaXN0IG9mIGEgZnVuY3Rpb24gZ2l2ZW4gdGhhdCB0aGUgbGVmdAogIC8vLyBwYXJlbnRoZXNpcyBwYXNzZWQgaW4gYXMgW3Rva2VuXS4KICAvLy8KICAvLy8gSWYgYGtpbmQgPT0gTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZWAsIHRoZW4gbmFtZXMgbWF5IGJlCiAgLy8vIG9taXR0ZWQgKGV4Y2VwdCBmb3IgbmFtZWQgYXJndW1lbnRzKS4gT3RoZXJ3aXNlLCB0eXBlcyBtYXkgYmUgb21pdHRlZC4KICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXN0KFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW47CiAgICBhc3NlcnQob3B0aW9uYWwoJygnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JtYWxQYXJhbWV0ZXJzKGJlZ2luLCBraW5kKTsKICAgIGludCBwYXJhbWV0ZXJDb3VudCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcpJywgbmV4dCkpIHsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ1snKSkgewogICAgICAgIHRva2VuID0gcGFyc2VPcHRpb25hbFBvc2l0aW9uYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICAgICAgICB0b2tlbiA9IGVuc3VyZUNsb3NlUGFyZW4odG9rZW4sIGJlZ2luKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd7JykpIHsKICAgICAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxOYW1lZFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogICAgICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ1tdJykpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIHRva2VuID0gcmV3cml0ZVNxdWFyZUJyYWNrZXRzKHRva2VuKTsKICAgICAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgICAgICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBiZWdpbik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcih0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5tYW5kYXRvcnksIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCcpJywgbmV4dCkpIHsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIGlmIChiZWdpbi5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAvLyBTY2FubmVyIGhhcyBhbHJlYWR5IHJlcG9ydGVkIGEgbWlzc2luZyBgKWAgZXJyb3IsCiAgICAgICAgICAgIC8vIGJ1dCBwbGFjZWQgdGhlIGApYCBpbiB0aGUgd3JvbmcgbG9jYXRpb24sIHNvIG1vdmUgaXQuCiAgICAgICAgICAgIHRva2VuID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgYmVnaW4uZW5kR3JvdXApOwogICAgICAgICAgfSBlbHNlIGlmIChuZXh0LmtpbmQgPT0gSURFTlRJRklFUl9UT0tFTiAmJgogICAgICAgICAgICAgIG5leHQubmV4dC5raW5kID09IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgICAgICAgLy8gTG9va3MgbGlrZSBhIG1pc3NpbmcgY29tbWEKICAgICAgICAgICAgdG9rZW4gPSByZXdyaXRlQW5kUmVjb3ZlcigKICAgICAgICAgICAgICAgIHRva2VuLAogICAgICAgICAgICAgICAgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyksCiAgICAgICAgICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNPTU1BLCBuZXh0LmNoYXJPZmZzZXQpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b2tlbiA9IGVuc3VyZUNsb3NlUGFyZW4odG9rZW4sIGJlZ2luKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmVuZEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbiwga2luZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUmV0dXJuIHRoZSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHByb2R1Y2VkIHdoZW4gdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIGFyZQogIC8vLyBtaXNzaW5nLgogIE1lc3NhZ2UgbWlzc2luZ1BhcmFtZXRlck1lc3NhZ2UoTWVtYmVyS2luZCBraW5kKSB7CiAgICBpZiAoa2luZCA9PSBNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZUFsaWFzKSB7CiAgICAgIHJldHVybiBjb2Rlcy5tZXNzYWdlTWlzc2luZ1R5cGVkZWZQYXJhbWV0ZXJzOwogICAgfSBlbHNlIGlmIChraW5kID09IE1lbWJlcktpbmQuTm9uU3RhdGljTWV0aG9kIHx8CiAgICAgICAga2luZCA9PSBNZW1iZXJLaW5kLlN0YXRpY01ldGhvZCkgewogICAgICByZXR1cm4gY29kZXMubWVzc2FnZU1pc3NpbmdNZXRob2RQYXJhbWV0ZXJzOwogICAgfQogICAgcmV0dXJuIGNvZGVzLm1lc3NhZ2VNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzOwogIH0KCiAgLy8vIGBgYAogIC8vLyBub3JtYWxGb3JtYWxQYXJhbWV0ZXI6CiAgLy8vICAgZnVuY3Rpb25Gb3JtYWxQYXJhbWV0ZXIgfAogIC8vLyAgIGZpZWxkRm9ybWFsUGFyYW1ldGVyIHwKICAvLy8gICBzaW1wbGVGb3JtYWxQYXJhbWV0ZXIKICAvLy8gOwogIC8vLwogIC8vLyBmdW5jdGlvbkZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBtZXRhZGF0YSAnY292YXJpYW50Jz8gcmV0dXJuVHlwZT8gaWRlbnRpZmllciBmb3JtYWxQYXJhbWV0ZXJMaXN0CiAgLy8vIDsKICAvLy8KICAvLy8gc2ltcGxlRm9ybWFsUGFyYW1ldGVyOgogIC8vLyAgIG1ldGFkYXRhICdjb3ZhcmlhbnQnPyBmaW5hbENvbnN0VmFyT3JUeXBlPyBpZGVudGlmaWVyIHwKICAvLy8gOwogIC8vLwogIC8vLyBmaWVsZEZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBtZXRhZGF0YSBmaW5hbENvbnN0VmFyT3JUeXBlPyAndGhpcycgJy4nIGlkZW50aWZpZXIgZm9ybWFsUGFyYW1ldGVyTGlzdD8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlcigKICAgICAgVG9rZW4gdG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQgcGFyYW1ldGVyS2luZCwgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICBhc3NlcnQocGFyYW1ldGVyS2luZCAhPSBudWxsKTsKICAgIHRva2VuID0gcGFyc2VNZXRhZGF0YVN0YXIodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBzdGFydCA9IG5leHQ7CgogICAgZmluYWwgYm9vbCBpbkZ1bmN0aW9uVHlwZSA9CiAgICAgICAgbWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlOwoKICAgIFRva2VuIHJlcXVpcmVkVG9rZW47CiAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbjsKICAgIFRva2VuIHZhckZpbmFsT3JDb25zdDsKICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgIGlmIChvcHRpb25hbCgncmVxdWlyZWQnLCBuZXh0KSkgewogICAgICAgIGlmIChwYXJhbWV0ZXJLaW5kID09IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZCkgewogICAgICAgICAgcmVxdWlyZWRUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ2NvdmFyaWFudCcsIG5leHQpKSB7CiAgICAgICAgICBpZiAobWVtYmVyS2luZCAhPSBNZW1iZXJLaW5kLlN0YXRpY01ldGhvZCAmJgogICAgICAgICAgICAgIG1lbWJlcktpbmQgIT0gTWVtYmVyS2luZC5Ub3BMZXZlbE1ldGhvZCAmJgogICAgICAgICAgICAgIG1lbWJlcktpbmQgIT0gTWVtYmVyS2luZC5FeHRlbnNpb25Ob25TdGF0aWNNZXRob2QgJiYKICAgICAgICAgICAgICBtZW1iZXJLaW5kICE9IE1lbWJlcktpbmQuRXh0ZW5zaW9uU3RhdGljTWV0aG9kKSB7CiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgICBpZiAoIWluRnVuY3Rpb25UeXBlKSB7CiAgICAgICAgICAgIGlmIChvcHRpb25hbCgndmFyJywgbmV4dCkpIHsKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpIHsKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgICBNb2RpZmllclJlY292ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0KHRoaXMpCiAgICAgICAgICAgICAgLi5jb3ZhcmlhbnRUb2tlbiA9IGNvdmFyaWFudFRva2VuCiAgICAgICAgICAgICAgLi5yZXF1aXJlZFRva2VuID0gcmVxdWlyZWRUb2tlbgogICAgICAgICAgICAgIC4udmFyRmluYWxPckNvbnN0ID0gdmFyRmluYWxPckNvbnN0OwoKICAgICAgICAgICAgdG9rZW4gPSBjb250ZXh0LnBhcnNlRm9ybWFsUGFyYW1ldGVyTW9kaWZpZXJzKAogICAgICAgICAgICAgICAgdG9rZW4sIHBhcmFtZXRlcktpbmQsIG1lbWJlcktpbmQpOwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuID0gY29udGV4dC5jb3ZhcmlhbnRUb2tlbjsKICAgICAgICAgICAgcmVxdWlyZWRUb2tlbiA9IGNvbnRleHQucmVxdWlyZWRUb2tlbjsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBsaXN0ZW5lci5iZWdpbkZvcm1hbFBhcmFtZXRlcigKICAgICAgICBzdGFydCwgbWVtYmVyS2luZCwgcmVxdWlyZWRUb2tlbiwgY292YXJpYW50VG9rZW4sIHZhckZpbmFsT3JDb25zdCk7CgogICAgLy8gVHlwZSBpcyByZXF1aXJlZCBpbiBhIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGUsIGJ1dCBvcHRpb25hbCBvdGhlcndpc2UuCiAgICBmaW5hbCBUb2tlbiBiZWZvcmVUeXBlID0gdG9rZW47CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCBpbkZ1bmN0aW9uVHlwZSk7CiAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKTsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSAmJgogICAgICAgIChvcHRpb25hbCgnLicsIG5leHQpIHx8CiAgICAgICAgICAgIChuZXh0LmlzSWRlbnRpZmllciAmJiBvcHRpb25hbCgnLicsIG5leHQubmV4dCkpKSkgewogICAgICAvLyBSZWNvdmVyeTogTWFsZm9ybWVkIHR5cGUgcmVmZXJlbmNlLgogICAgICB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKGJlZm9yZVR5cGUsIHRydWUpOwogICAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKGJlZm9yZVR5cGUpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KCiAgICBmaW5hbCBib29sIGlzTmFtZWRQYXJhbWV0ZXIgPQogICAgICAgIHBhcmFtZXRlcktpbmQgPT0gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkOwoKICAgIFRva2VuIHRoaXNLZXl3b3JkOwogICAgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzOwogICAgSWRlbnRpZmllckNvbnRleHQgbmFtZUNvbnRleHQgPQogICAgICAgIElkZW50aWZpZXJDb250ZXh0LmZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uOwoKICAgIGlmICghaW5GdW5jdGlvblR5cGUgJiYgb3B0aW9uYWwoJ3RoaXMnLCBuZXh0KSkgewogICAgICB0aGlzS2V5d29yZCA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmICghb3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgICAgIC8vIFJlY292ZXIgZnJvbSBhIG1pc3NpbmcgcGVyaW9kIGJ5IGluc2VydGluZyBvbmUuCiAgICAgICAgbmV4dCA9IHJld3JpdGVBbmRSZWNvdmVyKAogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcuJyksCiAgICAgICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuUEVSSU9ELCBuZXh0LmNoYXJPZmZzZXQpKTsKICAgICAgfQogICAgICBwZXJpb2RBZnRlclRoaXMgPSB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBuYW1lQ29udGV4dCA9IElkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXI7CiAgICB9CgogICAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBUb2tlbiBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGU7CiAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtID0gbm9UeXBlUGFyYW1PckFyZzsKICAgIGlmIChvcHRpb25hbCgiPCIsIG5leHQpKSB7CiAgICAgIHR5cGVQYXJhbSA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICAgIGlmICh0eXBlUGFyYW0gIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIFRva2VuIGNsb3NlciA9IHR5cGVQYXJhbS5za2lwKHRva2VuKTsKICAgICAgICBpZiAob3B0aW9uYWwoIigiLCBjbG9zZXIubmV4dCkpIHsKICAgICAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBjb2Rlcy5tZXNzYWdlRnVuY3Rpb25UeXBlZFBhcmFtZXRlclZhcik7CiAgICAgICAgICB9CiAgICAgICAgICBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUgPSB0b2tlbjsKICAgICAgICAgIHRva2VuID0gY2xvc2VyLm5leHQuZW5kR3JvdXA7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoIigiLCBuZXh0KSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGNvZGVzLm1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyKTsKICAgICAgfQogICAgICBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUgPSB0b2tlbjsKICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIGlmICh0eXBlSW5mbyAhPSBub1R5cGUgJiYKICAgICAgICB2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJgogICAgICAgIG9wdGlvbmFsKCd2YXInLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBjb2Rlcy5tZXNzYWdlVHlwZUFmdGVyVmFyKTsKICAgIH0KCiAgICBUb2tlbiBlbmRJbmxpbmVGdW5jdGlvblR5cGU7CiAgICBpZiAoYmVmb3JlSW5saW5lRnVuY3Rpb25UeXBlICE9IG51bGwpIHsKICAgICAgZW5kSW5saW5lRnVuY3Rpb25UeXBlID0KICAgICAgICAgIHR5cGVQYXJhbS5wYXJzZVZhcmlhYmxlcyhiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUsIHRoaXMpOwogICAgICBsaXN0ZW5lci5iZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoYmVmb3JlSW5saW5lRnVuY3Rpb25UeXBlLm5leHQpOwogICAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgICAgZW5kSW5saW5lRnVuY3Rpb25UeXBlID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzUmVxdWlyZWRPcHQoCiAgICAgICAgICBlbmRJbmxpbmVGdW5jdGlvblR5cGUsIE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlZFBhcmFtZXRlcik7CiAgICAgIFRva2VuIHF1ZXN0aW9uOwogICAgICBpZiAob3B0aW9uYWwoJz8nLCBlbmRJbmxpbmVGdW5jdGlvblR5cGUubmV4dCkpIHsKICAgICAgICBxdWVzdGlvbiA9IGVuZElubGluZUZ1bmN0aW9uVHlwZSA9IGVuZElubGluZUZ1bmN0aW9uVHlwZS5uZXh0OwogICAgICB9CiAgICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgICBiZWZvcmVJbmxpbmVGdW5jdGlvblR5cGUsIHF1ZXN0aW9uKTsKCiAgICAgIC8vIEdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGVzIGRvbid0IGFsbG93IGlubGluZSBmdW5jdGlvbiB0eXBlcy4KICAgICAgLy8gVGhlIGZvbGxvd2luZyBpc24ndCBhbGxvd2VkOgogICAgICAvLyAgICBpbnQgRnVuY3Rpb24oaW50IGJhcihTdHJpbmcgeCkpLgogICAgICBpZiAoaW5GdW5jdGlvblR5cGUpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZS5uZXh0LAogICAgICAgICAgICBjb2Rlcy5tZXNzYWdlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5GdW5jdGlvblR5cGUpIHsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5lbnN1cmVUeXBlT3JWb2lkKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICB9CgogICAgVG9rZW4gbmFtZVRva2VuOwogICAgaWYgKHBlcmlvZEFmdGVyVGhpcyAhPSBudWxsKSB7CiAgICAgIHRva2VuID0gcGVyaW9kQWZ0ZXJUaGlzOwogICAgfQogICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoaW5GdW5jdGlvblR5cGUgJiYKICAgICAgICAhaXNOYW1lZFBhcmFtZXRlciAmJgogICAgICAgICFuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciAmJgogICAgICAgIGJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZSA9PSBudWxsKSB7CiAgICAgIG5hbWVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vTmFtZShuYW1lVG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgbmFtZVRva2VuID0gdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBuYW1lQ29udGV4dCk7CiAgICAgIGlmIChpc05hbWVkUGFyYW1ldGVyICYmIG5hbWVUb2tlbi5sZXhlbWUuc3RhcnRzV2l0aCgiXyIpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuYW1lVG9rZW4sIGNvZGVzLm1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoZW5kSW5saW5lRnVuY3Rpb25UeXBlICE9IG51bGwpIHsKICAgICAgdG9rZW4gPSBlbmRJbmxpbmVGdW5jdGlvblR5cGU7CiAgICB9CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgVG9rZW4gaW5pdGlhbGl6ZXJTdGFydCwgaW5pdGlhbGl6ZXJFbmQ7CiAgICBpZiAoKGlkZW50aWNhbCgnPScsIHZhbHVlKSkgfHwgKGlkZW50aWNhbCgnOicsIHZhbHVlKSkpIHsKICAgICAgVG9rZW4gZXF1YWwgPSBuZXh0OwogICAgICBpbml0aWFsaXplclN0YXJ0ID0gZXF1YWwubmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCk7CiAgICAgIHRva2VuID0gaW5pdGlhbGl6ZXJFbmQgPSBwYXJzZUV4cHJlc3Npb24oZXF1YWwpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuZW5kRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbigpOwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIGxhc3QgcGFyYW1ldGVyIGZyb20gdGhlCiAgICAgIC8vIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlciBldmVudC4uLiBpdCBhcHBlYXJzIHRvIGJlIHVudXNlZC4KICAgICAgbGlzdGVuZXIuaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyKGVxdWFsLCBuZXh0KTsKICAgICAgaWYgKGlzTWFuZGF0b3J5Rm9ybWFsUGFyYW1ldGVyS2luZChwYXJhbWV0ZXJLaW5kKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIGVxdWFsLCBjb2Rlcy5tZXNzYWdlUmVxdWlyZWRQYXJhbWV0ZXJXaXRoRGVmYXVsdCk7CiAgICAgIH0gZWxzZSBpZiAoaXNPcHRpb25hbFBvc2l0aW9uYWxGb3JtYWxQYXJhbWV0ZXJLaW5kKHBhcmFtZXRlcktpbmQpICYmCiAgICAgICAgICBpZGVudGljYWwoJzonLCB2YWx1ZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBlcXVhbCwgY29kZXMubWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzKTsKICAgICAgfSBlbHNlIGlmIChpbkZ1bmN0aW9uVHlwZSB8fAogICAgICAgICAgbWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLkZ1bmN0aW9uVHlwZUFsaWFzIHx8CiAgICAgICAgICBtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuRnVuY3Rpb25UeXBlZFBhcmFtZXRlcikgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoZXF1YWwsIGNvZGVzLm1lc3NhZ2VGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JtYWxQYXJhbWV0ZXJXaXRob3V0VmFsdWUobmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRGb3JtYWxQYXJhbWV0ZXIodGhpc0tleXdvcmQsIHBlcmlvZEFmdGVyVGhpcywgbmFtZVRva2VuLAogICAgICAgIGluaXRpYWxpemVyU3RhcnQsIGluaXRpYWxpemVyRW5kLCBwYXJhbWV0ZXJLaW5kLCBtZW1iZXJLaW5kKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZGVmYXVsdEZvcm1hbFBhcmFtZXRlcjoKICAvLy8gICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU9wdGlvbmFsUG9zaXRpb25hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ1snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoYmVnaW4pOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgICB0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWwsIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnXScsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ10nKSk7CiAgICAgICAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIGJyYWNrZXQuCiAgICAgICAgICBuZXh0ID0gYmVnaW4uZW5kR3JvdXA7CiAgICAgICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBuZXh0KSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgaWYgKHBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGNvZGVzLm1lc3NhZ2VFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdCwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyKAogICAgICAgICAgdG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxQb3NpdGlvbmFsLCBraW5kKTsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnXScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGRlZmF1bHROYW1lZFBhcmFtZXRlcjoKICAvLy8gICBub3JtYWxGb3JtYWxQYXJhbWV0ZXIgKCc9JyBleHByZXNzaW9uKT8gfAogIC8vLyAgIG5vcm1hbEZvcm1hbFBhcmFtZXRlciAoJzonIGV4cHJlc3Npb24pPwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlT3B0aW9uYWxOYW1lZFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoYmVnaW4pOwogICAgaW50IHBhcmFtZXRlckNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRva2VuID0KICAgICAgICAgIHBhcnNlRm9ybWFsUGFyYW1ldGVyKHRva2VuLCBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQsIGtpbmQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKCFvcHRpb25hbCgnfScsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ30nKSk7CiAgICAgICAgICAvLyBTY2FubmVyIGd1YXJhbnRlZXMgYSBjbG9zaW5nIGJyYWNrZXQuCiAgICAgICAgICBuZXh0ID0gYmVnaW4uZW5kR3JvdXA7CiAgICAgICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBuZXh0KSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgaWYgKHBhcmFtZXRlckNvdW50ID09IDApIHsKICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIGNvZGVzLm1lc3NhZ2VFbXB0eU5hbWVkUGFyYW1ldGVyTGlzdCwKICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbigKICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogICAgICB0b2tlbiA9CiAgICAgICAgICBwYXJzZUZvcm1hbFBhcmFtZXRlcih0b2tlbiwgRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkLCBraW5kKTsKICAgICAgKytwYXJhbWV0ZXJDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMocGFyYW1ldGVyQ291bnQsIGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHF1YWxpZmllZDoKICAvLy8gICBpZGVudGlmaWVyIHF1YWxpZmllZFJlc3QqCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VRdWFsaWZpZWQoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQsCiAgICAgIElkZW50aWZpZXJDb250ZXh0IGNvbnRpbnVhdGlvbkNvbnRleHQpIHsKICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgY29udGV4dCk7CiAgICB3aGlsZSAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkUmVzdCh0b2tlbiwgY29udGludWF0aW9uQ29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHF1YWxpZmllZFJlc3RPcHQ6CiAgLy8vICAgcXVhbGlmaWVkUmVzdD8KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgIFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250aW51YXRpb25Db250ZXh0KSB7CiAgICBpZiAob3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICByZXR1cm4gcGFyc2VRdWFsaWZpZWRSZXN0KHRva2VuLCBjb250aW51YXRpb25Db250ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIC8vLyBgYGAKICAvLy8gcXVhbGlmaWVkUmVzdDoKICAvLy8gICAnLicgaWRlbnRpZmllcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUXVhbGlmaWVkUmVzdChUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcuJywgdG9rZW4pKTsKICAgIFRva2VuIHBlcmlvZCA9IHRva2VuOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKICAgIGxpc3RlbmVyLmhhbmRsZVF1YWxpZmllZChwZXJpb2QpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICAvLyBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgYHtgIGFsd2F5cyBoYXMgYSBjbG9zaW5nIGB9YC4KICAgIHJldHVybiBlbnN1cmVCbG9jayh0b2tlbiwgbnVsbCwgbnVsbCkuZW5kR3JvdXA7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGVudW1UeXBlOgogIC8vLyAgIG1ldGFkYXRhICdlbnVtJyBpZCAneycgbWV0YWRhdGEgaWQgWycsJyBtZXRhZGF0YSBpZF0qIFsnLCddICd9JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRW51bShUb2tlbiBlbnVtS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdlbnVtJywgZW51bUtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luRW51bShlbnVtS2V5d29yZCk7CiAgICBUb2tlbiB0b2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcihlbnVtS2V5d29yZCwgSWRlbnRpZmllckNvbnRleHQuZW51bURlY2xhcmF0aW9uKTsKICAgIFRva2VuIGxlZnRCcmFjZSA9IHRva2VuLm5leHQ7CiAgICBpbnQgY291bnQgPSAwOwogICAgaWYgKG9wdGlvbmFsKCd7JywgbGVmdEJyYWNlKSkgewogICAgICB0b2tlbiA9IGxlZnRCcmFjZTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAob3B0aW9uYWwoJ30nLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgY29kZXMubWVzc2FnZUVudW1EZWNsYXJhdGlvbkVtcHR5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHRva2VuKTsKICAgICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmVudW1WYWx1ZURlY2xhcmF0aW9uKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnfScsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIFRva2VuIGVuZEdyb3VwID0gbGVmdEJyYWNlLmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnfScgY29ycmVjdGx5LgogICAgICAgICAgICB0b2tlbiA9IHJld3JpdGVyLm1vdmVTeW50aGV0aWModG9rZW4sIGVuZEdyb3VwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGFzc3VtZSBhIG1pc3NpbmcgY29tbWEuCiAgICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBpbXByb3ZlZCByZWNvdmVyeSBmb3IgbWlzc2luZyBgfWAKICAgICAgICAgICAgLy8gYm90aCBoZXJlIGFuZCB3aGVuIHRoZSBzY2FubmVyIGluc2VydHMgYSBzeW50aGV0aWMgYH1gCiAgICAgICAgICAgIC8vIGZvciBzaXR1YXRpb25zIHN1Y2ggYXMgYGVudW0gTGV0dGVyIHthLCBiICAgTGV0dGVyIGU7YC4KICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLCcpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhc3N1bWUgYSBtaXNzaW5nIGB9YCBhbmQgZXhpdCB0aGUgbG9vcAogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgbmV4dCwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd9JykpOwogICAgICAgICAgICB0b2tlbiA9IGxlZnRCcmFjZS5lbmRHcm91cDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogbWVyZ2UgdGhpcyBlcnJvciBtZXNzYWdlIHdpdGggbWlzc2luZyBjbGFzcy9taXhpbiBib2R5CiAgICAgIGxlZnRCcmFjZSA9IGVuc3VyZUJsb2NrKHRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkRW51bUJvZHksIG51bGwpOwogICAgICB0b2tlbiA9IGxlZnRCcmFjZS5lbmRHcm91cDsKICAgIH0KICAgIGFzc2VydChvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5lbmRFbnVtKGVudW1LZXl3b3JkLCBsZWZ0QnJhY2UsIGNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gY2xhc3NLZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NsYXNzJywgY2xhc3NLZXl3b3JkKSk7CiAgICBUb2tlbiBiZWdpbiA9IGFic3RyYWN0VG9rZW4gPz8gY2xhc3NLZXl3b3JkOwogICAgbGlzdGVuZXIuYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uUHJlbHVkZShiZWdpbik7CiAgICBUb2tlbiBuYW1lID0gZW5zdXJlSWRlbnRpZmllcigKICAgICAgICBjbGFzc0tleXdvcmQsIElkZW50aWZpZXJDb250ZXh0LmNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uRGVjbGFyYXRpb24pOwogICAgVG9rZW4gdG9rZW4gPQogICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuYW1lLCB0cnVlLCB0cnVlKS5wYXJzZVZhcmlhYmxlcyhuYW1lLCB0aGlzKTsKICAgIGlmIChvcHRpb25hbCgnPScsIHRva2VuLm5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKGJlZ2luLCBhYnN0cmFjdFRva2VuLCBuYW1lKTsKICAgICAgcmV0dXJuIHBhcnNlTmFtZWRNaXhpbkFwcGxpY2F0aW9uKHRva2VuLCBiZWdpbiwgY2xhc3NLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NEZWNsYXJhdGlvbihiZWdpbiwgYWJzdHJhY3RUb2tlbiwgbmFtZSk7CiAgICAgIHJldHVybiBwYXJzZUNsYXNzKHRva2VuLCBiZWdpbiwgY2xhc3NLZXl3b3JkLCBuYW1lLmxleGVtZSk7CiAgICB9CiAgfQoKICBUb2tlbiBwYXJzZU5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQpIHsKICAgIFRva2VuIGVxdWFscyA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPScsIGVxdWFscykpOwogICAgdG9rZW4gPSBjb21wdXRlVHlwZSh0b2tlbiwgdHJ1ZSkuZW5zdXJlVHlwZU5vdFZvaWQodG9rZW4sIHRoaXMpOwogICAgdG9rZW4gPSBwYXJzZU1peGluQXBwbGljYXRpb25SZXN0KHRva2VuKTsKICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnaW1wbGVtZW50cycsIHRva2VuLm5leHQpKSB7CiAgICAgIGltcGxlbWVudHNLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZVR5cGVMaXN0KGltcGxlbWVudHNLZXl3b3JkKTsKICAgIH0KICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICBiZWdpbiwgY2xhc3NLZXl3b3JkLCBlcXVhbHMsIGltcGxlbWVudHNLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgdGhlIHBvcnRpb24gb2YgYSBjbGFzcyBkZWNsYXJhdGlvbiAobm90IGEgbWl4aW4gYXBwbGljYXRpb24pIHRoYXQKICAvLy8gZm9sbG93cyB0aGUgZW5kIG9mIHRoZSB0eXBlIHBhcmFtZXRlcnMuCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBjbGFzc0RlZmluaXRpb246CiAgLy8vICAgbWV0YWRhdGEgYWJzdHJhY3Q/ICdjbGFzcycgaWRlbnRpZmllciB0eXBlUGFyYW1ldGVycz8KICAvLy8gICAgICAgKHN1cGVyY2xhc3MgbWl4aW5zPyk/IGludGVyZmFjZXM/CiAgLy8vICAgICAgICd7JyAobWV0YWRhdGEgY2xhc3NNZW1iZXJEZWZpbml0aW9uKSogJ30nIHwKICAvLy8gICBtZXRhZGF0YSBhYnN0cmFjdD8gJ2NsYXNzJyBtaXhpbkFwcGxpY2F0aW9uQ2xhc3MKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUNsYXNzKAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCwgU3RyaW5nIGNsYXNzTmFtZSkgewogICAgVG9rZW4gc3RhcnQgPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VDbGFzc0hlYWRlck9wdCh0b2tlbiwgYmVnaW4sIGNsYXNzS2V5d29yZCk7CiAgICBpZiAoIW9wdGlvbmFsKCd7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgdG9rZW4gPSBwYXJzZUNsYXNzSGVhZGVyUmVjb3Zlcnkoc3RhcnQsIGJlZ2luLCBjbGFzc0tleXdvcmQpOwogICAgICBlbnN1cmVCbG9jayh0b2tlbiwgbnVsbCwgJ2NsYXNzIGRlY2xhcmF0aW9uJyk7CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NPck1peGluT3JFeHRlbnNpb25Cb2R5KAogICAgICAgIHRva2VuLCBEZWNsYXJhdGlvbktpbmQuQ2xhc3MsIGNsYXNzTmFtZSk7CiAgICBsaXN0ZW5lci5lbmRDbGFzc0RlY2xhcmF0aW9uKGJlZ2luLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUNsYXNzSGVhZGVyT3B0KFRva2VuIHRva2VuLCBUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkKSB7CiAgICB0b2tlbiA9IHBhcnNlQ2xhc3NFeHRlbmRzT3B0KHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VXaXRoQ2xhdXNlT3B0KHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KHRva2VuKTsKICAgIFRva2VuIG5hdGl2ZVRva2VuOwogICAgaWYgKG9wdGlvbmFsKCduYXRpdmUnLCB0b2tlbi5uZXh0KSkgewogICAgICBuYXRpdmVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gcGFyc2VOYXRpdmVDbGF1c2UodG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NIZWFkZXIoYmVnaW4sIGNsYXNzS2V5d29yZCwgbmF0aXZlVG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFJlY292ZXIgZ2l2ZW4gb3V0LW9mLW9yZGVyIGNsYXVzZXMgaW4gYSBjbGFzcyBoZWFkZXIuCiAgVG9rZW4gcGFyc2VDbGFzc0hlYWRlclJlY292ZXJ5KFRva2VuIHRva2VuLCBUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkKSB7CiAgICBmaW5hbCBMaXN0ZW5lciBwcmltYXJ5TGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgIGZpbmFsIENsYXNzSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lciByZWNvdmVyeUxpc3RlbmVyID0KICAgICAgICBuZXcgQ2xhc3NIZWFkZXJSZWNvdmVyeUxpc3RlbmVyKCk7CgogICAgLy8gUmVwYXJzZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhdXNlcyBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQKICAgIC8vIGJ1dCBpbnRlcmNlcHQgdGhlIGV2ZW50cyBzbyB0aGV5IGFyZSBub3Qgc2VudCB0byB0aGUgcHJpbWFyeSBsaXN0ZW5lci4KICAgIGxpc3RlbmVyID0gcmVjb3ZlcnlMaXN0ZW5lcjsKICAgIHRva2VuID0gcGFyc2VDbGFzc0hlYWRlck9wdCh0b2tlbiwgYmVnaW4sIGNsYXNzS2V5d29yZCk7CiAgICBib29sIGhhc0V4dGVuZHMgPSByZWNvdmVyeUxpc3RlbmVyLmV4dGVuZHNLZXl3b3JkICE9IG51bGw7CiAgICBib29sIGhhc0ltcGxlbWVudHMgPSByZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGw7CiAgICBib29sIGhhc1dpdGggPSByZWNvdmVyeUxpc3RlbmVyLndpdGhLZXl3b3JkICE9IG51bGw7CgogICAgLy8gVXBkYXRlIHRoZSByZWNvdmVyeSBsaXN0ZW5lciB0byBmb3J3YXJkIHN1YnNlcXVlbnQgZXZlbnRzCiAgICAvLyB0byB0aGUgcHJpbWFyeSBsaXN0ZW5lci4KICAgIHJlY292ZXJ5TGlzdGVuZXIubGlzdGVuZXIgPSBwcmltYXJ5TGlzdGVuZXI7CgogICAgLy8gUGFyc2UgYWRkaXRpb25hbCBvdXQtb2Ytb3JkZXIgY2xhdXNlcwogICAgVG9rZW4gc3RhcnQ7CiAgICBkbyB7CiAgICAgIHN0YXJ0ID0gdG9rZW47CgogICAgICAvLyBDaGVjayBmb3IgZXh0cmFuZW91cyB0b2tlbiBpbiB0aGUgbWlkZGxlIG9mIGEgY2xhc3MgaGVhZGVyLgogICAgICB0b2tlbiA9IHNraXBVbmV4cGVjdGVkVG9rZW5PcHQoCiAgICAgICAgICB0b2tlbiwgY29uc3QgPFN0cmluZz5bJ2V4dGVuZHMnLCAnd2l0aCcsICdpbXBsZW1lbnRzJywgJ3snXSk7CgogICAgICAvLyBEdXJpbmcgcmVjb3ZlcnksIGNsYXVzZXMgYXJlIHBhcnNlZCBpbiB0aGUgc2FtZSBvcmRlcgogICAgICAvLyBhbmQgZ2VuZXJhdGUgdGhlIHNhbWUgZXZlbnRzIGFzIGluIHRoZSBwYXJzZUNsYXNzSGVhZGVyIG1ldGhvZCBhYm92ZS4KICAgICAgcmVjb3ZlcnlMaXN0ZW5lci5jbGVhcigpOwoKICAgICAgaWYgKHRva2VuLm5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyICYmCiAgICAgICAgICBjb25zdCBbJ2V4dGVuZCcsICdvbiddLmNvbnRhaW5zKHRva2VuLm5leHQubGV4ZW1lKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLm5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJbnN0ZWFkLndpdGhBcmd1bWVudHMoJ2V4dGVuZHMnKSk7CiAgICAgICAgVG9rZW4gaW5jb3JyZWN0RXh0ZW5kc0tleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUoaW5jb3JyZWN0RXh0ZW5kc0tleXdvcmQsIHRydWUpCiAgICAgICAgICAgIC5lbnN1cmVUeXBlTm90Vm9pZChpbmNvcnJlY3RFeHRlbmRzS2V5d29yZCwgdGhpcyk7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NFeHRlbmRzKGluY29ycmVjdEV4dGVuZHNLZXl3b3JkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHBhcnNlQ2xhc3NFeHRlbmRzT3B0KHRva2VuKTsKICAgICAgfQoKICAgICAgaWYgKHJlY292ZXJ5TGlzdGVuZXIuZXh0ZW5kc0tleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChoYXNFeHRlbmRzKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIuZXh0ZW5kc0tleXdvcmQsIGNvZGVzLm1lc3NhZ2VNdWx0aXBsZUV4dGVuZHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzV2l0aCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHJlY292ZXJ5TGlzdGVuZXIuZXh0ZW5kc0tleXdvcmQsCiAgICAgICAgICAgICAgICBjb2Rlcy5tZXNzYWdlV2l0aEJlZm9yZUV4dGVuZHMpOwogICAgICAgICAgfSBlbHNlIGlmIChoYXNJbXBsZW1lbnRzKSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcnlMaXN0ZW5lci5leHRlbmRzS2V5d29yZCwKICAgICAgICAgICAgICAgIGNvZGVzLm1lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kcyk7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNFeHRlbmRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VXaXRoQ2xhdXNlT3B0KHRva2VuKTsKCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLndpdGhLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzV2l0aCkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLndpdGhLZXl3b3JkLCBjb2Rlcy5tZXNzYWdlTXVsdGlwbGVXaXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc0ltcGxlbWVudHMpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLndpdGhLZXl3b3JkLAogICAgICAgICAgICAgICAgY29kZXMubWVzc2FnZUltcGxlbWVudHNCZWZvcmVXaXRoKTsKICAgICAgICAgIH0KICAgICAgICAgIGhhc1dpdGggPSB0cnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdG9rZW4gPSBwYXJzZUNsYXNzT3JNaXhpbkltcGxlbWVudHNPcHQodG9rZW4pOwoKICAgICAgaWYgKHJlY292ZXJ5TGlzdGVuZXIuaW1wbGVtZW50c0tleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChoYXNJbXBsZW1lbnRzKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHJlY292ZXJ5TGlzdGVuZXIuaW1wbGVtZW50c0tleXdvcmQsCiAgICAgICAgICAgICAgY29kZXMubWVzc2FnZU11bHRpcGxlSW1wbGVtZW50cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhhc0ltcGxlbWVudHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbGlzdGVuZXIuaGFuZGxlUmVjb3ZlckNsYXNzSGVhZGVyKCk7CgogICAgICAvLyBFeGl0IGlmIGEgY2xhc3MgYm9keSBpcyBkZXRlY3RlZCwgb3IgaWYgbm8gcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZQogICAgfSB3aGlsZSAoIW9wdGlvbmFsKCd7JywgdG9rZW4ubmV4dCkgJiYgc3RhcnQgIT0gdG9rZW4pOwoKICAgIGxpc3RlbmVyID0gcHJpbWFyeUxpc3RlbmVyOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VDbGFzc0V4dGVuZHNPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCdleHRlbmRzJywgbmV4dCkpIHsKICAgICAgVG9rZW4gZXh0ZW5kc0tleXdvcmQgPSBuZXh0OwogICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKG5leHQsIHRydWUpLmVuc3VyZVR5cGVOb3RWb2lkKG5leHQsIHRoaXMpOwogICAgICBsaXN0ZW5lci5oYW5kbGVDbGFzc0V4dGVuZHMoZXh0ZW5kc0tleXdvcmQpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlKHRva2VuKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlQ2xhc3NFeHRlbmRzKG51bGwpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBpbXBsZW1lbnRzQ2xhdXNlOgogIC8vLyAgICdpbXBsZW1lbnRzJyB0eXBlTmFtZSAoJywnIHR5cGVOYW1lKSoKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUNsYXNzT3JNaXhpbkltcGxlbWVudHNPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkOwogICAgaW50IGludGVyZmFjZXNDb3VudCA9IDA7CiAgICBpZiAob3B0aW9uYWwoJ2ltcGxlbWVudHMnLCB0b2tlbi5uZXh0KSkgewogICAgICBpbXBsZW1lbnRzS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAgIGRvIHsKICAgICAgICB0b2tlbiA9CiAgICAgICAgICAgIGNvbXB1dGVUeXBlKHRva2VuLm5leHQsIHRydWUpLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLm5leHQsIHRoaXMpOwogICAgICAgICsraW50ZXJmYWNlc0NvdW50OwogICAgICB9IHdoaWxlIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoaW1wbGVtZW50c0tleXdvcmQsIGludGVyZmFjZXNDb3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgYSBtaXhpbiBkZWNsYXJhdGlvbi4KICAvLy8KICAvLy8gYGBgCiAgLy8vIG1peGluRGVjbGFyYXRpb246CiAgLy8vICAgbWV0YWRhdGE/ICdtaXhpbicgW1NpbXBsZUlkZW50aWZpZXJdIFtUeXBlUGFyYW1ldGVyTGlzdF0/CiAgLy8vICAgICAgICBbT25DbGF1c2VdPyBbSW1wbGVtZW50c0NsYXVzZV0/ICd7JyBbQ2xhc3NNZW1iZXJdKiAnfScKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1peGluKFRva2VuIG1peGluS2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCdtaXhpbicsIG1peGluS2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uUHJlbHVkZShtaXhpbktleXdvcmQpOwogICAgVG9rZW4gbmFtZSA9IGVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgbWl4aW5LZXl3b3JkLCBJZGVudGlmaWVyQ29udGV4dC5jbGFzc09yTWl4aW5PckV4dGVuc2lvbkRlY2xhcmF0aW9uKTsKICAgIFRva2VuIGhlYWRlclN0YXJ0ID0KICAgICAgICBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmFtZSwgdHJ1ZSwgdHJ1ZSkucGFyc2VWYXJpYWJsZXMobmFtZSwgdGhpcyk7CiAgICBsaXN0ZW5lci5iZWdpbk1peGluRGVjbGFyYXRpb24obWl4aW5LZXl3b3JkLCBuYW1lKTsKICAgIFRva2VuIHRva2VuID0gcGFyc2VNaXhpbkhlYWRlck9wdChoZWFkZXJTdGFydCwgbWl4aW5LZXl3b3JkKTsKICAgIGlmICghb3B0aW9uYWwoJ3snLCB0b2tlbi5uZXh0KSkgewogICAgICAvLyBSZWNvdmVyeQogICAgICB0b2tlbiA9IHBhcnNlTWl4aW5IZWFkZXJSZWNvdmVyeSh0b2tlbiwgbWl4aW5LZXl3b3JkLCBoZWFkZXJTdGFydCk7CiAgICAgIGVuc3VyZUJsb2NrKHRva2VuLCBudWxsLCAnbWl4aW4gZGVjbGFyYXRpb24nKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5PckV4dGVuc2lvbkJvZHkoCiAgICAgICAgdG9rZW4sIERlY2xhcmF0aW9uS2luZC5NaXhpbiwgbmFtZS5sZXhlbWUpOwogICAgbGlzdGVuZXIuZW5kTWl4aW5EZWNsYXJhdGlvbihtaXhpbktleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlTWl4aW5IZWFkZXJPcHQoVG9rZW4gdG9rZW4sIFRva2VuIG1peGluS2V5d29yZCkgewogICAgdG9rZW4gPSBwYXJzZU1peGluT25PcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNsYXNzT3JNaXhpbkltcGxlbWVudHNPcHQodG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlTWl4aW5IZWFkZXIobWl4aW5LZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlTWl4aW5IZWFkZXJSZWNvdmVyeSgKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gaGVhZGVyU3RhcnQpIHsKICAgIGZpbmFsIExpc3RlbmVyIHByaW1hcnlMaXN0ZW5lciA9IGxpc3RlbmVyOwogICAgZmluYWwgTWl4aW5IZWFkZXJSZWNvdmVyeUxpc3RlbmVyIHJlY292ZXJ5TGlzdGVuZXIgPQogICAgICAgIG5ldyBNaXhpbkhlYWRlclJlY292ZXJ5TGlzdGVuZXIoKTsKCiAgICAvLyBSZXBhcnNlIHRvIGRldGVybWluZSB3aGljaCBjbGF1c2VzIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZAogICAgLy8gYnV0IGludGVyY2VwdCB0aGUgZXZlbnRzIHNvIHRoZXkgYXJlIG5vdCBzZW50IHRvIHRoZSBwcmltYXJ5IGxpc3RlbmVyLgogICAgbGlzdGVuZXIgPSByZWNvdmVyeUxpc3RlbmVyOwogICAgdG9rZW4gPSBwYXJzZU1peGluSGVhZGVyT3B0KGhlYWRlclN0YXJ0LCBtaXhpbktleXdvcmQpOwogICAgYm9vbCBoYXNPbiA9IHJlY292ZXJ5TGlzdGVuZXIub25LZXl3b3JkICE9IG51bGw7CiAgICBib29sIGhhc0ltcGxlbWVudHMgPSByZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGw7CgogICAgLy8gVXBkYXRlIHRoZSByZWNvdmVyeSBsaXN0ZW5lciB0byBmb3J3YXJkIHN1YnNlcXVlbnQgZXZlbnRzCiAgICAvLyB0byB0aGUgcHJpbWFyeSBsaXN0ZW5lci4KICAgIHJlY292ZXJ5TGlzdGVuZXIubGlzdGVuZXIgPSBwcmltYXJ5TGlzdGVuZXI7CgogICAgLy8gUGFyc2UgYWRkaXRpb25hbCBvdXQtb2Ytb3JkZXIgY2xhdXNlcwogICAgVG9rZW4gc3RhcnQ7CiAgICBkbyB7CiAgICAgIHN0YXJ0ID0gdG9rZW47CgogICAgICAvLyBDaGVjayBmb3IgZXh0cmFuZW91cyB0b2tlbiBpbiB0aGUgbWlkZGxlIG9mIGEgY2xhc3MgaGVhZGVyLgogICAgICB0b2tlbiA9IHNraXBVbmV4cGVjdGVkVG9rZW5PcHQoCiAgICAgICAgICB0b2tlbiwgY29uc3QgPFN0cmluZz5bJ29uJywgJ2ltcGxlbWVudHMnLCAneyddKTsKCiAgICAgIC8vIER1cmluZyByZWNvdmVyeSwgY2xhdXNlcyBhcmUgcGFyc2VkIGluIHRoZSBzYW1lIG9yZGVyIGFuZAogICAgICAvLyBnZW5lcmF0ZSB0aGUgc2FtZSBldmVudHMgYXMgaW4gdGhlIHBhcnNlTWl4aW5IZWFkZXJPcHQgbWV0aG9kIGFib3ZlLgogICAgICByZWNvdmVyeUxpc3RlbmVyLmNsZWFyKCk7CgogICAgICBpZiAodG9rZW4ubmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIgJiYKICAgICAgICAgIGNvbnN0IFsnZXh0ZW5kJywgJ2V4dGVuZHMnXS5jb250YWlucyh0b2tlbi5uZXh0LmxleGVtZSkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbi5uZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSW5zdGVhZC53aXRoQXJndW1lbnRzKCdvbicpKTsKICAgICAgICB0b2tlbiA9IHBhcnNlTWl4aW5Pbih0b2tlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZU1peGluT25PcHQodG9rZW4pOwogICAgICB9CgogICAgICBpZiAocmVjb3ZlcnlMaXN0ZW5lci5vbktleXdvcmQgIT0gbnVsbCkgewogICAgICAgIGlmIChoYXNPbikgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICByZWNvdmVyeUxpc3RlbmVyLm9uS2V5d29yZCwgY29kZXMubWVzc2FnZU11bHRpcGxlT25DbGF1c2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc0ltcGxlbWVudHMpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIHJlY292ZXJ5TGlzdGVuZXIub25LZXl3b3JkLCBjb2Rlcy5tZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGhhc09uID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5JbXBsZW1lbnRzT3B0KHRva2VuKTsKCiAgICAgIGlmIChyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICBpZiAoaGFzSW1wbGVtZW50cykgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyeUxpc3RlbmVyLmltcGxlbWVudHNLZXl3b3JkLAogICAgICAgICAgICAgIGNvZGVzLm1lc3NhZ2VNdWx0aXBsZUltcGxlbWVudHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYXNJbXBsZW1lbnRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxpc3RlbmVyLmhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcigpOwoKICAgICAgLy8gRXhpdCBpZiBhIG1peGluIGJvZHkgaXMgZGV0ZWN0ZWQsIG9yIGlmIG5vIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKICAgIH0gd2hpbGUgKCFvcHRpb25hbCgneycsIHRva2VuLm5leHQpICYmIHN0YXJ0ICE9IHRva2VuKTsKCiAgICBsaXN0ZW5lciA9IHByaW1hcnlMaXN0ZW5lcjsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gb25DbGF1c2U6CiAgLy8vICAgJ29uJyB0eXBlTmFtZSAoJywnIHR5cGVOYW1lKSoKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1peGluT25PcHQoVG9rZW4gdG9rZW4pIHsKICAgIGlmICghb3B0aW9uYWwoJ29uJywgdG9rZW4ubmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTWl4aW5PbihudWxsLCAwKTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgcmV0dXJuIHBhcnNlTWl4aW5Pbih0b2tlbik7CiAgfQoKICBUb2tlbiBwYXJzZU1peGluT24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG9uS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAvLyBEdXJpbmcgcmVjb3ZlcnksIHRoZSBbb25LZXl3b3JkXSBjYW4gYmUgImV4dGVuZCIgb3IgImV4dGVuZHMiCiAgICBhc3NlcnQob3B0aW9uYWwoJ29uJywgb25LZXl3b3JkKSB8fAogICAgICAgIG9wdGlvbmFsKCdleHRlbmRzJywgb25LZXl3b3JkKSB8fAogICAgICAgIG9uS2V5d29yZC5sZXhlbWUgPT0gJ2V4dGVuZCcpOwogICAgaW50IHR5cGVDb3VudCA9IDA7CiAgICBkbyB7CiAgICAgIHRva2VuID0gY29tcHV0ZVR5cGUodG9rZW4ubmV4dCwgdHJ1ZSkuZW5zdXJlVHlwZU5vdFZvaWQodG9rZW4ubmV4dCwgdGhpcyk7CiAgICAgICsrdHlwZUNvdW50OwogICAgfSB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSk7CiAgICBsaXN0ZW5lci5oYW5kbGVNaXhpbk9uKG9uS2V5d29yZCwgdHlwZUNvdW50KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gJ2V4dGVuc2lvbicgPGlkZW50aWZpZXI+PyA8dHlwZVBhcmFtZXRlcnM+PyAnb24nIDx0eXBlPiAnPyc/CiAgLy8gICBgeycKICAvLyAgICAgPG1lbWJlckRlY2xhcmF0aW9uPioKICAvLyAgIGB9JwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUV4dGVuc2lvbihUb2tlbiBleHRlbnNpb25LZXl3b3JkKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2V4dGVuc2lvbicsIGV4dGVuc2lvbktleXdvcmQpKTsKICAgIFRva2VuIHRva2VuID0gZXh0ZW5zaW9uS2V5d29yZDsKICAgIGxpc3RlbmVyLmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25QcmVsdWRlKGV4dGVuc2lvbktleXdvcmQpOwogICAgVG9rZW4gbmFtZSA9IHRva2VuLm5leHQ7CiAgICBpZiAobmFtZS5pc0lkZW50aWZpZXIgJiYgIW9wdGlvbmFsKCdvbicsIG5hbWUpKSB7CiAgICAgIHRva2VuID0gbmFtZTsKICAgICAgaWYgKG5hbWUudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICB0b2tlbiwgY29kZXMudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuYW1lID0gbnVsbDsKICAgIH0KICAgIHRva2VuID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCB0cnVlKS5wYXJzZVZhcmlhYmxlcyh0b2tlbiwgdGhpcyk7CiAgICBsaXN0ZW5lci5iZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uKGV4dGVuc2lvbktleXdvcmQsIG5hbWUpOwogICAgVG9rZW4gb25LZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJ29uJywgb25LZXl3b3JkKSkgewogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAob3B0aW9uYWwoJ2V4dGVuZHMnLCBvbktleXdvcmQpIHx8CiAgICAgICAgICBvcHRpb25hbCgnaW1wbGVtZW50cycsIG9uS2V5d29yZCkgfHwKICAgICAgICAgIG9wdGlvbmFsKCd3aXRoJywgb25LZXl3b3JkKSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG9uS2V5d29yZCwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEluc3RlYWQud2l0aEFyZ3VtZW50cygnb24nKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCdvbicpKTsKICAgICAgICBvbktleXdvcmQgPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNLZXl3b3JkKHRva2VuLCBLZXl3b3JkLk9OKTsKICAgICAgfQogICAgfQogICAgVHlwZUluZm8gdHlwZUluZm8gPSBjb21wdXRlVHlwZShvbktleXdvcmQsIHRydWUpOwogICAgdG9rZW4gPSB0eXBlSW5mby5lbnN1cmVUeXBlT3JWb2lkKG9uS2V5d29yZCwgdGhpcyk7CiAgICBpZiAoIW9wdGlvbmFsKCd7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIHdoaWxlICghbmV4dC5pc0VvZikgewogICAgICAgIGlmIChvcHRpb25hbCgnLCcsIG5leHQpIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCdleHRlbmRzJywgbmV4dCkgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJ2ltcGxlbWVudHMnLCBuZXh0KSB8fAogICAgICAgICAgICBvcHRpb25hbCgnb24nLCBuZXh0KSB8fAogICAgICAgICAgICBvcHRpb25hbCgnd2l0aCcsIG5leHQpKSB7CiAgICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IgYW5kIHNraXAgYCxgIG9yIHNwZWNpZmljIGtleXdvcmQKICAgICAgICAgIC8vIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllcgogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGlmIChuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZW5zdXJlQmxvY2sodG9rZW4sIG51bGwsICdleHRlbnNpb24gZGVjbGFyYXRpb24nKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VDbGFzc09yTWl4aW5PckV4dGVuc2lvbkJvZHkoCiAgICAgICAgdG9rZW4sIERlY2xhcmF0aW9uS2luZC5FeHRlbnNpb24sIG5hbWU/LmxleGVtZSk7CiAgICBsaXN0ZW5lci5lbmRFeHRlbnNpb25EZWNsYXJhdGlvbihleHRlbnNpb25LZXl3b3JkLCBvbktleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5raW5kICE9IFNUUklOR19UT0tFTikgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRTdHJpbmcpOwogICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oVG9rZW5UeXBlLlNUUklORywgJycsIG5leHQuY2hhck9mZnNldCkpOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlU3RyaW5nUGFydChuZXh0KTsKICAgIHJldHVybiBuZXh0OwogIH0KCiAgLy8vIEluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIGFmdGVyIHRoZSBnaXZlbiBbdG9rZW5dIGFuZCBjcmVhdGUgYW4gZXJyb3IKICAvLy8gbWVzc2FnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gW2NvbnRleHRdLiBSZXR1cm4gdGhlIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRoYXQKICAvLy8gd2FzIGluc2VydGVkLgogIFRva2VuIGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQsCiAgICAgIHtNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIG1lc3NhZ2VPblRva2VufSkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG1lc3NhZ2VPblRva2VuID8/IG5leHQsCiAgICAgICAgbWVzc2FnZSA/PyBjb250ZXh0LnJlY292ZXJ5VGVtcGxhdGUud2l0aEFyZ3VtZW50cyhuZXh0KSk7CiAgICByZXR1cm4gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgfQoKICAvLy8gUGFyc2UgYSBzaW1wbGUgaWRlbnRpZmllciBhdCB0aGUgZ2l2ZW4gW3Rva2VuXSwgYW5kIHJldHVybiB0aGUgaWRlbnRpZmllcgogIC8vLyB0aGF0IHdhcyBwYXJzZWQuCiAgLy8vCiAgLy8vIElmIHRoZSB0b2tlbiBpcyBub3QgYW4gaWRlbnRpZmllciwgb3IgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB1c2UgYXMgYW4KICAvLy8gaWRlbnRpZmllciBpbiB0aGUgZ2l2ZW4gW2NvbnRleHRdLCBjcmVhdGUgYSBzeW50aGV0aWMgaWRlbnRpZmllciwgcmVwb3J0CiAgLy8vIGFuIGVycm9yLCBhbmQgcmV0dXJuIHRoZSBzeW50aGV0aWMgaWRlbnRpZmllci4KICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBhc3NlcnQoY29udGV4dCAhPSBudWxsKTsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgaWYgKGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKSB7CiAgICAgIGlkZW50aWZpZXIgPSBjb250ZXh0LmVuc3VyZUlkZW50aWZpZXIodG9rZW4sIHRoaXMpOwogICAgICBhc3NlcnQoaWRlbnRpZmllciAhPSBudWxsKTsKICAgICAgYXNzZXJ0KGlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXIoaWRlbnRpZmllciwgY29udGV4dCk7CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9CgogIGJvb2wgbm90RW9mT3JWYWx1ZShTdHJpbmcgdmFsdWUsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gIWlkZW50aWNhbCh0b2tlbi5raW5kLCBFT0ZfVE9LRU4pICYmCiAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgdG9rZW4uc3RyaW5nVmFsdWUpOwogIH0KCiAgVG9rZW4gcGFyc2VUeXBlVmFyaWFibGVzT3B0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCB0cnVlKS5wYXJzZVZhcmlhYmxlcyh0b2tlbiwgdGhpcyk7CiAgfQoKICAvLy8gUGFyc2UgYSB0b3AgbGV2ZWwgZmllbGQgb3IgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4gQXMgYSByZXN1bHQsIHRoaXMKICAvLy8gbWV0aG9kIHRha2VzIHRoZSBuZXh0IHRva2VuIHRvIGJlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHRoZSBsYXN0IGNvbnN1bWVkCiAgLy8vIHRva2VuIGFuZCByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiByYXRoZXIgdGhhbiB0aGUKICAvLy8gbGFzdCBjb25zdW1lZCB0b2tlbi4KICBUb2tlbiBwYXJzZVRvcExldmVsTWVtYmVyKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlTWV0YWRhdGFTdGFyKHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pKTsKICAgIHJldHVybiBwYXJzZVRvcExldmVsTWVtYmVySW1wbCh0b2tlbikubmV4dDsKICB9CgogIFRva2VuIHBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBsKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWZvcmVTdGFydCA9IHRva2VuOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5iZWdpblRvcExldmVsTWVtYmVyKG5leHQpOwoKICAgIFRva2VuIGV4dGVybmFsVG9rZW47CiAgICBUb2tlbiBsYXRlVG9rZW47CiAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3Q7CgogICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdleHRlcm5hbCcsIG5leHQpKSB7CiAgICAgICAgZXh0ZXJuYWxUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnZmluYWwnLCBuZXh0KSkgewogICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgndmFyJywgbmV4dCkpIHsKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2NvbnN0JywgbmV4dCkpIHsKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2xhdGUnLCBuZXh0KSkgewogICAgICAgICAgbGF0ZVRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSAmJiBvcHRpb25hbCgnZmluYWwnLCBuZXh0KSkgewogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJgogICAgICAgICAgICAgIChvcHRpb25hbCgnZmluYWwnLCBuZXh0KSB8fAogICAgICAgICAgICAgICAgICBvcHRpb25hbCgndmFyJywgbmV4dCkgfHwKICAgICAgICAgICAgICAgICAgb3B0aW9uYWwoJ2NvbnN0JywgbmV4dCkpKSB7CiAgICAgICAgICAgIC8vIElmIGFub3RoZXIgYHZhcmAsIGBmaW5hbGAsIG9yIGBjb25zdGAgdGhlbiBmYWxsIHRocm91Z2gKICAgICAgICAgICAgLy8gdG8gcGFyc2UgdGhhdCBhcyBwYXJ0IG9mIHRoZSBuZXh0IHRvcCBsZXZlbCBkZWNsYXJhdGlvbi4KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQodGhpcykKICAgICAgICAgICAgICAuLmV4dGVybmFsVG9rZW4gPSBleHRlcm5hbFRva2VuCiAgICAgICAgICAgICAgLi5sYXRlVG9rZW4gPSBsYXRlVG9rZW4KICAgICAgICAgICAgICAuLnZhckZpbmFsT3JDb25zdCA9IHZhckZpbmFsT3JDb25zdDsKCiAgICAgICAgICAgIHRva2VuID0gY29udGV4dC5wYXJzZVRvcExldmVsTW9kaWZpZXJzKHRva2VuKTsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgICAgICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICAgICAgICBsYXRlVG9rZW4gPSBjb250ZXh0LmxhdGVUb2tlbjsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBUb2tlbiBiZWZvcmVUeXBlID0gdG9rZW47CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCBmYWxzZSwgdHJ1ZSk7CiAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKTsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgIFRva2VuIGdldE9yU2V0OwogICAgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmIChpZGVudGljYWwodmFsdWUsICdnZXQnKSB8fCBpZGVudGljYWwodmFsdWUsICdzZXQnKSkgewogICAgICBpZiAobmV4dC5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgIGdldE9yU2V0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CgogICAgaWYgKG5leHQudHlwZSAhPSBUb2tlblR5cGUuSURFTlRJRklFUikgewogICAgICB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdmYWN0b3J5JykgfHwgaWRlbnRpY2FsKHZhbHVlLCAnb3BlcmF0b3InKSkgewogICAgICAgIC8vIGBmYWN0b3J5YCBhbmQgYG9wZXJhdG9yYCBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyLgogICAgICAgIHZhbHVlID0gbmV4dC5uZXh0LnN0cmluZ1ZhbHVlOwogICAgICAgIGlmIChnZXRPclNldCA9PSBudWxsICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICcoJykgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJ3snKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAnPCcpICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICc9PicpICYmCiAgICAgICAgICAgICFpZGVudGljYWwodmFsdWUsICc9JykgJiYKICAgICAgICAgICAgIWlkZW50aWNhbCh2YWx1ZSwgJzsnKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKHZhbHVlLCAnLCcpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2ZhY3RvcnknKSkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgbmV4dCwgY29kZXMubWVzc2FnZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZVRvcExldmVsT3BlcmF0b3IpOwogICAgICAgICAgICBpZiAobmV4dC5uZXh0LmlzT3BlcmF0b3IpIHsKICAgICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dC5uZXh0KSkgewogICAgICAgICAgICAgICAgcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgICAgICAgICAgICBuZXh0LCAnI3N5bnRoZXRpY19pZGVudGlmaWVyXyR7bmV4dC5jaGFyT2Zmc2V0fScpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24obmV4dCk7CiAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIGFuZCBjb250aW51ZSBwYXJzaW5nCiAgICAgIH0gZWxzZSBpZiAoIW5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICBpZiAobmV4dC5pc0tleXdvcmQpIHsKICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBwYXJzZSB0aGUga2V5d29yZCBhcyB0aGUgaWRlbnRpZmllci4KICAgICAgICAgIC8vIGVuc3VyZUlkZW50aWZpZXIgd2lsbCByZXBvcnQgdGhlIGVycm9yLgogICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gYmVmb3JlU3RhcnQpIHsKICAgICAgICAgIC8vIEVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzLgogICAgICAgICAgcmV0dXJuIHBhcnNlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBMb29rcyBsaWtlIGEgZGVjbGFyYXRpb24gbWlzc2luZyBhbiBpZGVudGlmaWVyLgogICAgICAgICAgLy8gSW5zZXJ0IHN5bnRoZXRpYyBpZGVudGlmaWVyIGFuZCBmYWxsIHRocm91Z2guCiAgICAgICAgICBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbik7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIEF0IHRoaXMgcG9pbnQsIGB0b2tlbmAgaXMgYmVmb3JlTmFtZS4KCiAgICAvLyBSZWNvdmVyeTogSW5zZXJ0ZWQgISBhZnRlciBtZXRob2QgbmFtZS4KICAgIGlmIChvcHRpb25hbCgnIScsIG5leHQubmV4dCkpIHsKICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgIH0KCiAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgaWYgKGdldE9yU2V0ICE9IG51bGwgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICcoJykgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICd7JykgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICc8JykgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICcuJykgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICc9PicpKSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCkgewogICAgICAgIGlmIChvcHRpb25hbCgndmFyJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih2YXJGaW5hbE9yQ29uc3QsIGNvZGVzLm1lc3NhZ2VWYXJSZXR1cm5UeXBlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBsYXRlVG9rZW4sIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VUb3BMZXZlbE1ldGhvZChiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwgYmVmb3JlVHlwZSwKICAgICAgICAgIHR5cGVJbmZvLCBnZXRPclNldCwgdG9rZW4ubmV4dCk7CiAgICB9CgogICAgaWYgKGdldE9yU2V0ICE9IG51bGwpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGdldE9yU2V0LCBjb2Rlcy50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICB9CiAgICByZXR1cm4gcGFyc2VGaWVsZHMoCiAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICBudWxsLAogICAgICAgIG51bGwsCiAgICAgICAgbGF0ZVRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgIHR5cGVJbmZvLAogICAgICAgIHRva2VuLm5leHQsCiAgICAgICAgRGVjbGFyYXRpb25LaW5kLlRvcExldmVsKTsKICB9CgogIFRva2VuIHBhcnNlRmllbGRzKAogICAgICBUb2tlbiBiZWZvcmVTdGFydCwKICAgICAgVG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIFRva2VuIG5hbWUsCiAgICAgIERlY2xhcmF0aW9uS2luZCBraW5kKSB7CiAgICBpZiAoZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoZXh0ZXJuYWxUb2tlbiwgY29kZXMubWVzc2FnZUV4dGVybmFsRmllbGQpOwogICAgfQogICAgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsICYmIG9wdGlvbmFsKCdmaW5hbCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGNvdmFyaWFudFRva2VuLCBjb2Rlcy5tZXNzYWdlRmluYWxBbmRDb3ZhcmlhbnQpOwogICAgICAgIGNvdmFyaWFudFRva2VuID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHR5cGVJbmZvID09IG5vVHlwZSkgewogICAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5hbWUsIGNvZGVzLm1lc3NhZ2VNaXNzaW5nQ29uc3RGaW5hbFZhck9yVHlwZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiBvcHRpb25hbCgndmFyJywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBjb2Rlcy5tZXNzYWdlVHlwZUFmdGVyVmFyKTsKICAgICAgfQogICAgfQoKICAgIFRva2VuIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgYXNzZXJ0KHRva2VuLm5leHQgPT0gbmFtZSB8fCB0b2tlbi5uZXh0LmlzRW9mKTsKCiAgICBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0ID0ga2luZCA9PSBEZWNsYXJhdGlvbktpbmQuVG9wTGV2ZWwKICAgICAgICA/IElkZW50aWZpZXJDb250ZXh0LnRvcExldmVsVmFyaWFibGVEZWNsYXJhdGlvbgogICAgICAgIDogSWRlbnRpZmllckNvbnRleHQuZmllbGREZWNsYXJhdGlvbjsKICAgIFRva2VuIGZpcnN0TmFtZSA9IG5hbWUgPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKCiAgICBpbnQgZmllbGRDb3VudCA9IDE7CiAgICB0b2tlbiA9CiAgICAgICAgcGFyc2VGaWVsZEluaXRpYWxpemVyT3B0KG5hbWUsIG5hbWUsIGxhdGVUb2tlbiwgdmFyRmluYWxPckNvbnN0LCBraW5kKTsKICAgIHdoaWxlIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKSB7CiAgICAgIG5hbWUgPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLm5leHQsIGNvbnRleHQpOwogICAgICB0b2tlbiA9IHBhcnNlRmllbGRJbml0aWFsaXplck9wdCgKICAgICAgICAgIG5hbWUsIG5hbWUsIGxhdGVUb2tlbiwgdmFyRmluYWxPckNvbnN0LCBraW5kKTsKICAgICAgKytmaWVsZENvdW50OwogICAgfQogICAgVG9rZW4gc2VtaWNvbG9uID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnOycsIHNlbWljb2xvbikpIHsKICAgICAgdG9rZW4gPSBzZW1pY29sb247CiAgICB9IGVsc2UgewogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAoa2luZCA9PSBEZWNsYXJhdGlvbktpbmQuVG9wTGV2ZWwgJiYKICAgICAgICAgIGJlZm9yZVR5cGUubmV4dC5pc0lkZW50aWZpZXIgJiYKICAgICAgICAgIGJlZm9yZVR5cGUubmV4dC5sZXhlbWUgPT0gJ2V4dGVuc2lvbicpIHsKICAgICAgICAvLyBMb29rcyBsaWtlIGFuIGV4dGVuc2lvbiBtZXRob2QKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIHdoZW4gZXh0ZW5zaW9uIG1ldGhvZHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgIC8vIGJlY2F1c2UgdGhlbiAnZXh0ZW5zaW9uJyB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgYnVpbHQtaW4KICAgICAgICAvLyBhbmQgdGhpcyBjb2RlIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBiZWZvcmVUeXBlLm5leHQsCiAgICAgICAgICAgIGNvZGVzLnRlbXBsYXRlRXhwZXJpbWVudE5vdEVuYWJsZWQKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKCdleHRlbnNpb24tbWV0aG9kcycpKTsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuU0VNSUNPTE9OKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIH0KICAgIH0KICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5Ub3BMZXZlbDoKICAgICAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbEZpZWxkcyhzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIGxhdGVUb2tlbiwKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBmaWVsZENvdW50LCBiZWZvcmVTdGFydC5uZXh0LCB0b2tlbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgRGVjbGFyYXRpb25LaW5kLkNsYXNzOgogICAgICAgIGxpc3RlbmVyLmVuZENsYXNzRmllbGRzKHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLAogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZpZWxkQ291bnQsIGJlZm9yZVN0YXJ0Lm5leHQsIHRva2VuKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBEZWNsYXJhdGlvbktpbmQuTWl4aW46CiAgICAgICAgbGlzdGVuZXIuZW5kTWl4aW5GaWVsZHMoc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLCBsYXRlVG9rZW4sCiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgZmllbGRDb3VudCwgYmVmb3JlU3RhcnQubmV4dCwgdG9rZW4pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5FeHRlbnNpb246CiAgICAgICAgaWYgKHN0YXRpY1Rva2VuID09IG51bGwpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgZmlyc3ROYW1lLCBjb2Rlcy5tZXNzYWdlRXh0ZW5zaW9uRGVjbGFyZXNJbnN0YW5jZUZpZWxkKTsKICAgICAgICB9CiAgICAgICAgbGlzdGVuZXIuZW5kRXh0ZW5zaW9uRmllbGRzKHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLAogICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGZpZWxkQ291bnQsIGJlZm9yZVN0YXJ0Lm5leHQsIHRva2VuKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVmb3JlU3RhcnQsIFRva2VuIGV4dGVybmFsVG9rZW4sCiAgICAgIFRva2VuIGJlZm9yZVR5cGUsIFR5cGVJbmZvIHR5cGVJbmZvLCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXIuYmVnaW5Ub3BMZXZlbE1ldGhvZChiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbik7CgogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5wYXJzZVR5cGUoYmVmb3JlVHlwZSwgdGhpcyk7CiAgICBhc3NlcnQodG9rZW4ubmV4dCA9PSAoZ2V0T3JTZXQgPz8gbmFtZSkgfHwgdG9rZW4ubmV4dC5pc0VvZik7CiAgICBuYW1lID0gZW5zdXJlSWRlbnRpZmllcigKICAgICAgICBnZXRPclNldCA/PyB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudG9wTGV2ZWxGdW5jdGlvbkRlY2xhcmF0aW9uKTsKCiAgICBib29sIGlzR2V0dGVyID0gZmFsc2U7CiAgICBpZiAoZ2V0T3JTZXQgPT0gbnVsbCkgewogICAgICB0b2tlbiA9IHBhcnNlTWV0aG9kVHlwZVZhcihuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGlzR2V0dGVyID0gb3B0aW9uYWwoImdldCIsIGdldE9yU2V0KTsKICAgICAgdG9rZW4gPSBuYW1lOwogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXModG9rZW4ubmV4dCk7CiAgICB9CiAgICB0b2tlbiA9IHBhcnNlR2V0dGVyT3JGb3JtYWxQYXJhbWV0ZXJzKAogICAgICAgIHRva2VuLCBuYW1lLCBpc0dldHRlciwgTWVtYmVyS2luZC5Ub3BMZXZlbE1ldGhvZCk7CiAgICBBc3luY01vZGlmaWVyIHNhdmVkQXN5bmNNb2RpZmllciA9IGFzeW5jU3RhdGU7CiAgICBUb2tlbiBhc3luY1Rva2VuID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VBc3luY01vZGlmaWVyT3B0KHRva2VuKTsKICAgIGlmIChnZXRPclNldCAhPSBudWxsICYmICFpblBsYWluU3luYyAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXN5bmNUb2tlbiwgY29kZXMubWVzc2FnZVNldHRlck5vdFN5bmMpOwogICAgfQogICAgYm9vbCBpc0V4dGVybmFsID0gZXh0ZXJuYWxUb2tlbiAhPSBudWxsOwogICAgaWYgKGlzRXh0ZXJuYWwgJiYgIW9wdGlvbmFsKCc7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGV4dGVybmFsVG9rZW4sIGNvZGVzLm1lc3NhZ2VFeHRlcm5hbE1ldGhvZFdpdGhCb2R5KTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VGdW5jdGlvbkJvZHkodG9rZW4sIGZhbHNlLCBpc0V4dGVybmFsKTsKICAgIGFzeW5jU3RhdGUgPSBzYXZlZEFzeW5jTW9kaWZpZXI7CiAgICBsaXN0ZW5lci5lbmRUb3BMZXZlbE1ldGhvZChiZWZvcmVTdGFydC5uZXh0LCBnZXRPclNldCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VNZXRob2RUeXBlVmFyKFRva2VuIG5hbWUpIHsKICAgIGlmIChvcHRpb25hbCgnIScsIG5hbWUubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgbmFtZSA9IG5hbWUubmV4dDsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuYW1lLCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICB9CiAgICBpZiAoIW9wdGlvbmFsKCc8JywgbmFtZS5uZXh0KSkgewogICAgICByZXR1cm4gbm9UeXBlUGFyYW1PckFyZy5wYXJzZVZhcmlhYmxlcyhuYW1lLCB0aGlzKTsKICAgIH0KICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlVmFyID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5hbWUsIHRydWUpOwogICAgVG9rZW4gdG9rZW4gPSB0eXBlVmFyLnBhcnNlVmFyaWFibGVzKG5hbWUsIHRoaXMpOwogICAgaWYgKG9wdGlvbmFsKCc9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKHRva2VuLCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZpZWxkSW5pdGlhbGl6ZXJPcHQoVG9rZW4gdG9rZW4sIFRva2VuIG5hbWUsIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBEZWNsYXJhdGlvbktpbmQga2luZCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICBUb2tlbiBhc3NpZ25tZW50ID0gbmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5GaWVsZEluaXRpYWxpemVyKG5leHQpOwogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihuZXh0KTsKICAgICAgbGlzdGVuZXIuZW5kRmllbGRJbml0aWFsaXplcihhc3NpZ25tZW50LCB0b2tlbi5uZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiAhbmFtZS5pc1N5bnRoZXRpYykgewogICAgICAgIGlmIChvcHRpb25hbCgiY29uc3QiLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgY29kZXMudGVtcGxhdGVDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubGV4ZW1lKSk7CiAgICAgICAgfSBlbHNlIGlmIChraW5kID09IERlY2xhcmF0aW9uS2luZC5Ub3BMZXZlbCAmJgogICAgICAgICAgICBvcHRpb25hbCgiZmluYWwiLCB2YXJGaW5hbE9yQ29uc3QpICYmCiAgICAgICAgICAgIGxhdGVUb2tlbiA9PSBudWxsKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgY29kZXMudGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyCiAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG5hbWUubGV4ZW1lKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vRmllbGRJbml0aWFsaXplcih0b2tlbi5uZXh0KTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdChUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCc9JywgdG9rZW4ubmV4dCkpIHsKICAgICAgVG9rZW4gYXNzaWdubWVudCA9IHRva2VuLm5leHQ7CiAgICAgIGxpc3RlbmVyLmJlZ2luVmFyaWFibGVJbml0aWFsaXplcihhc3NpZ25tZW50KTsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oYXNzaWdubWVudCk7CiAgICAgIGxpc3RlbmVyLmVuZFZhcmlhYmxlSW5pdGlhbGl6ZXIoYXNzaWdubWVudCk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb1ZhcmlhYmxlSW5pdGlhbGl6ZXIodG9rZW4ubmV4dCk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUluaXRpYWxpemVyc09wdChUb2tlbiB0b2tlbikgewogICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJzKHRva2VuLm5leHQpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9Jbml0aWFsaXplcnMoKTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBpbml0aWFsaXplcnM6CiAgLy8vICAgJzonIGluaXRpYWxpemVyTGlzdEVudHJ5ICgnLCcgaW5pdGlhbGl6ZXJMaXN0RW50cnkpKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlSW5pdGlhbGl6ZXJzKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgYmVnaW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZXJzKGJlZ2luKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IGZhbHNlOwogICAgVG9rZW4gbmV4dCA9IGJlZ2luOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdG9rZW4gPSBwYXJzZUluaXRpYWxpemVyKG5leHQpOwogICAgICArK2NvdW50OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgLy8gUmVjb3Zlcnk6IEZvdW5kIGFuIGlkZW50aWZpZXIgd2hpY2ggY291bGQgYmUKICAgICAgICAvLyAxKSBtaXNzaW5nIHByZWNlZGluZyBgLGAgdGh1cyBpdCdzIGFub3RoZXIgaW5pdGlhbGl6ZXIsIG9yCiAgICAgICAgLy8gMikgbWlzc2luZyBwcmVjZWRpbmcgYDtgIHRodXMgaXQncyBhIGNsYXNzIG1lbWJlciwgb3IKICAgICAgICAvLyAzKSBtaXNzaW5nIHByZWNlZGluZyAneycgdGh1cyBpdCdzIGEgc3RhdGVtZW50CiAgICAgICAgaWYgKG9wdGlvbmFsKCdhc3NlcnQnLCBuZXh0KSkgewogICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICAgIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIC8vIExvb2tzIGxpa2UgYXNzZXJ0IGV4cHJlc3Npb24gLi4uIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgY29tbWEKICAgICAgICB9IGVsc2UgaWYgKCFuZXh0LmlzSWRlbnRpZmllciAmJiAhb3B0aW9uYWwoJ3RoaXMnLCBuZXh0KSkgewogICAgICAgICAgLy8gQW4gaWRlbnRpZmllciB0aGF0IHdhc24ndCBhbiBpbml0aWFsaXplci4gQnJlYWsuCiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG9wdGlvbmFsKCd0aGlzJywgbmV4dCkpIHsKICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICAgICAgaWYgKCFvcHRpb25hbCgnLicsIG5leHQpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICAgICAgaWYgKCFuZXh0LmlzSWRlbnRpZmllciAmJiAhb3B0aW9uYWwoJ2Fzc2VydCcsIG5leHQpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICBpZiAoIW9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBMb29rcyBsaWtlIGZpZWxkIGFzc2lnbm1lbnQuLi4gZmFsbCB0aHJvdWdoIHRvIGluc2VydCBjb21tYQogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgZW5oYW5jaW5nIHRoaXMgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUKICAgICAgICAvLyBleHBlY3Rpbmcgb25lIG9mIGAsYCBvciBgO2Agb3IgYHtgCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgdG9rZW4sIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJykpOwogICAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLkNPTU1BKTsKICAgICAgfQogICAgfQogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgbGlzdGVuZXIuZW5kSW5pdGlhbGl6ZXJzKGNvdW50LCBiZWdpbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGluaXRpYWxpemVyTGlzdEVudHJ5OgogIC8vLyAgICdzdXBlcicgKCcuJyBpZGVudGlmaWVyKT8gYXJndW1lbnRzIHwKICAvLy8gICBmaWVsZEluaXRpYWxpemVyIHwKICAvLy8gICBhc3NlcnRpb24KICAvLy8gOwogIC8vLwogIC8vLyBmaWVsZEluaXRpYWxpemVyOgogIC8vLyAgICgndGhpcycgJy4nKT8gaWRlbnRpZmllciAnPScgY29uZGl0aW9uYWxFeHByZXNzaW9uIGNhc2NhZGVTZWN0aW9uKgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5Jbml0aWFsaXplcihuZXh0KTsKICAgIFRva2VuIGJlZm9yZUV4cHJlc3Npb24gPSB0b2tlbjsKICAgIGlmIChvcHRpb25hbCgnYXNzZXJ0JywgbmV4dCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZUFzc2VydCh0b2tlbiwgQXNzZXJ0LkluaXRpYWxpemVyKTsKICAgICAgbGlzdGVuZXIuZW5kSW5pdGlhbGl6ZXIodG9rZW4ubmV4dCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3N1cGVyJywgbmV4dCkpIHsKICAgICAgcmV0dXJuIHBhcnNlU3VwZXJJbml0aWFsaXplckV4cHJlc3Npb24odG9rZW4pOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgndGhpcycsIG5leHQpKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnLicsIG5leHQpKSB7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGlmIChuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgdG9rZW4gPSBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKAogICAgICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5maWVsZEluaXRpYWxpemVyKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc9JywgbmV4dCkpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3QoYmVmb3JlRXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3QoYmVmb3JlRXhwcmVzc2lvbik7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCd7JywgbmV4dCkgfHwgb3B0aW9uYWwoJz0+JywgbmV4dCkpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgbmV4dCwgY29kZXMubWVzc2FnZVJlZGlyZWN0aW5nQ29uc3RydWN0b3JXaXRoQm9keSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfQogICAgICAvLyBSZWNvdmVyeQogICAgICBpZiAob3B0aW9uYWwoJ3RoaXMnLCB0b2tlbikpIHsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQKICAgICAgICAvLyBgdGhpcy48ZmllbGRuYW1lPj1gIGlzIGV4cGVjdGVkLgogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnLicpKTsKICAgICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlBFUklPRCk7CiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLm5leHQpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byByZWNvdmVyeQogICAgfSBlbHNlIGlmIChuZXh0LmlzSWRlbnRpZmllcikgewogICAgICBUb2tlbiBuZXh0MiA9IG5leHQubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCc9JywgbmV4dDIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdCh0b2tlbik7CiAgICAgIH0KICAgICAgLy8gUmVjb3Zlcnk6IElmIHRoaXMgbG9va3MgbGlrZSBhbiBleHByZXNzaW9uLAogICAgICAvLyB0aGVuIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgdGhlIExIUyBhbmQgYD1gIG9mIHRoZSBhc3NpZ25tZW50LAogICAgICAvLyBvdGhlcndpc2UgaW5zZXJ0IGFuIGA9YCBhbmQgc3ludGhldGljIGlkZW50aWZpZXIuCiAgICAgIGlmICghbmV4dDIuaXNPcGVyYXRvciAmJiAhb3B0aW9uYWwoJy4nLCBuZXh0MikpIHsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKG5leHQsIFRva2VuVHlwZS5FUSk7CiAgICAgICAgdG9rZW4gPSBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uLAogICAgICAgICAgICBtZXNzYWdlOiBjb2Rlcy5tZXNzYWdlTWlzc2luZ0Fzc2lnbm1lbnRJbkluaXRpYWxpemVyLAogICAgICAgICAgICBtZXNzYWdlT25Ub2tlbjogbmV4dCk7CiAgICAgICAgcmV0dXJuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChiZWZvcmVFeHByZXNzaW9uKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gUmVjb3Zlcnk6IEluc2VydCBhIHN5bnRoZXRpYyBhc3NpZ25tZW50LgogICAgICB0b2tlbiA9IGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoCiAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZmllbGRJbml0aWFsaXplciwKICAgICAgICAgIG1lc3NhZ2U6IGNvZGVzLm1lc3NhZ2VFeHBlY3RlZEFuSW5pdGlhbGl6ZXIsIG1lc3NhZ2VPblRva2VuOiB0b2tlbik7CiAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljVG9rZW4odG9rZW4sIFRva2VuVHlwZS5FUSk7CiAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgICAgIHJldHVybiBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3QoYmVmb3JlRXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBSZWNvdmVyeToKICAgIC8vIEluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yCiAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyBpbmRlZWQgYW4gYXNzaWdubWVudC4KICAgIC8vIEZhaWxpbmcgdG8gZG8gc28gY2F1c2VzIHRoaXMgdGVzdCB0byBmYWlsOgogICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvcmVncmVzcy9pc3N1ZV8zMTE5Mi5kYXJ0CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSW52ZXN0aWdhdGUgYmV0dGVyIHJlY292ZXJ5LgogICAgdG9rZW4gPSBpbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKAogICAgICAgIGJlZm9yZUV4cHJlc3Npb24sIElkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXIsCiAgICAgICAgbWVzc2FnZTogY29kZXMubWVzc2FnZU1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplcik7CiAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLkVRKTsKICAgIHJldHVybiBwYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3QoYmVmb3JlRXhwcmVzc2lvbik7CiAgfQoKICAvLy8gUGFyc2UgdGhlIGBzdXBlcmAgaW5pdGlhbGl6ZXI6CiAgLy8vIGBgYAogIC8vLyAgICdzdXBlcicgKCcuJyBpZGVudGlmaWVyKT8gYXJndW1lbnRzIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VTdXBlckluaXRpYWxpemVyRXhwcmVzc2lvbihmaW5hbCBUb2tlbiBzdGFydCkgewogICAgVG9rZW4gdG9rZW4gPSBzdGFydC5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdzdXBlcicsIHRva2VuKSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnLicsIG5leHQpKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChuZXh0LmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTikgewogICAgICAgIG5leHQgPSBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uCiAgICAgICAgICAgIC5lbnN1cmVJZGVudGlmaWVyKHRva2VuLCB0aGlzKTsKICAgICAgfQogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGlmIChvcHRpb25hbCgnPy4nLCBuZXh0KSkgewogICAgICAgIC8vIEFuIGVycm9yIGZvciBgc3VwZXI/LmAgaXMgcmVwb3J0ZWQgaW4gcGFyc2VTdXBlckV4cHJlc3Npb24uCiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIGlmICghbmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgICAgIC8vIEluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIGJ1dCBkb24ndCByZXBvcnQgYW5vdGhlciBlcnJvci4KICAgICAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgICAgICB9CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmIChvcHRpb25hbCgnPScsIG5leHQpKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCdzdXBlcicsIHRva2VuKSkgewogICAgICAgICAgLy8gcGFyc2VFeHByZXNzaW9uIHdpbGwgcmVwb3J0IGVycm9yIG9uIGFzc2lnbm1lbnQgdG8gc3VwZXIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICB0b2tlbiwgY29kZXMubWVzc2FnZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCcoJykpOwogICAgICAgIHJld3JpdGVyLmluc2VydFBhcmVucyh0b2tlbiwgZmFsc2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFyc2VJbml0aWFsaXplckV4cHJlc3Npb25SZXN0KHN0YXJ0KTsKICB9CgogIFRva2VuIHBhcnNlSW5pdGlhbGl6ZXJFeHByZXNzaW9uUmVzdChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kSW5pdGlhbGl6ZXIodG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gSWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gb3BlbmluZyBjdXJseSBicmFjZSwgcmV0dXJuIGl0LiBPdGhlcndpc2UsIHVzZSB0aGUKICAvLy8gZ2l2ZW4gW3RlbXBsYXRlXSBvciBbbWlzc2luZ0Jsb2NrTmFtZV0gdG8gcmVwb3J0IGFuIGVycm9yLCBpbnNlcnQgYW4KICAvLy8gb3BlbmluZyBhbmQgYSBjbG9zaW5nIGN1cmx5IGJyYWNlLCBhbmQgcmV0dXJuIHRoZSBuZXdseSBpbnNlcnRlZCBvcGVuaW5nCiAgLy8vIGN1cmx5IGJyYWNlLiBJZiAgW3RlbXBsYXRlXSBhbmQgW21pc3NpbmdCbG9ja05hbWVdIGFyZSBgbnVsbGAsIHRoZW4gdXNlCiAgLy8vIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlIGluc3RlYWQuCiAgVG9rZW4gZW5zdXJlQmxvY2soCiAgICAgIFRva2VuIHRva2VuLAogICAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFRva2VuIHRva2VuKT4gdGVtcGxhdGUsCiAgICAgIFN0cmluZyBtaXNzaW5nQmxvY2tOYW1lKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgneycsIG5leHQpKSByZXR1cm4gbmV4dDsKICAgIGlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7CiAgICAgIGlmIChtaXNzaW5nQmxvY2tOYW1lID09IG51bGwpIHsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVuYW1lIEV4cGVjdGVkQnV0R290IHRvIEV4cGVjdGVkQmVmb3JlCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgbmV4dCwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd7JykpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiByZW5hbWUgRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5CiAgICAgICAgLy8gIHRvIEV4cGVjdGVkRGVjbGFyYXRpb25PckNsYXVzZUJvZHkKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgY29kZXMudGVtcGxhdGVFeHBlY3RlZENsYXNzT3JNaXhpbkJvZHkKICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG1pc3NpbmdCbG9ja05hbWUpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCB0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5leHQpKTsKICAgIH0KICAgIHJldHVybiBpbnNlcnRCbG9jayh0b2tlbik7CiAgfQoKICBUb2tlbiBpbnNlcnRCbG9jayhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBCZWdpblRva2VuIGJlZ2luR3JvdXAgPSByZXdyaXRlci5pbnNlcnRUb2tlbih0b2tlbiwKICAgICAgICBuZXcgU3ludGhldGljQmVnaW5Ub2tlbihUb2tlblR5cGUuT1BFTl9DVVJMWV9CUkFDS0VULCBuZXh0Lm9mZnNldCkpOwogICAgVG9rZW4gZW5kR3JvdXAgPSByZXdyaXRlci5pbnNlcnRUb2tlbihiZWdpbkdyb3VwLAogICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ0xPU0VfQ1VSTFlfQlJBQ0tFVCwgbmV4dC5vZmZzZXQpKTsKICAgIGJlZ2luR3JvdXAuZW5kR3JvdXAgPSBlbmRHcm91cDsKICAgIHJldHVybiBiZWdpbkdyb3VwOwogIH0KCiAgLy8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgY2xvc2luZyBwYXJlbnRoZXNpcywgcmV0dXJuIGl0LgogIC8vLyBPdGhlcndpc2UsIHJlcG9ydCBhbiBlcnJvciBhbmQgcmV0dXJuIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzCiAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZW4gcGFyZW50aGVzaXMuCiAgVG9rZW4gZW5zdXJlQ2xvc2VQYXJlbihUb2tlbiB0b2tlbiwgVG9rZW4gb3BlblBhcmVuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnKScsIG5leHQpKSB7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgaWYgKG9wZW5QYXJlbi5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAvLyBTY2FubmVyIGhhcyBhbHJlYWR5IHJlcG9ydGVkIGEgbWlzc2luZyBgKWAgZXJyb3IsCiAgICAgIC8vIGJ1dCBwbGFjZWQgdGhlIGApYCBpbiB0aGUgd3JvbmcgbG9jYXRpb24sIHNvIG1vdmUgaXQuCiAgICAgIHJldHVybiByZXdyaXRlci5tb3ZlU3ludGhldGljKHRva2VuLCBvcGVuUGFyZW4uZW5kR3JvdXApOwogICAgfQoKICAgIC8vIFRPRE8oZGFucnViZWwpOiBQYXNzIGluIGNvbnRleHQgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlLgogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJyknKSk7CgogICAgLy8gU2Nhbm5lciBndWFyYW50ZWVzIGEgY2xvc2luZyBwYXJlbnRoZXNpcwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IEltcHJvdmUgcmVjb3ZlcnkgYnkgaGF2aW5nIGNhbGxlcnMgcGFyc2UgdG9rZW5zCiAgICAvLyBiZXR3ZWVuIGB0b2tlbmAgYW5kIGBvcGVuUGFyZW4uZW5kR3JvdXBgLgogICAgcmV0dXJuIG9wZW5QYXJlbi5lbmRHcm91cDsKICB9CgogIC8vLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGNvbG9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgcmVwb3J0IGFuCiAgLy8vIGVycm9yLCBpbnNlcnQgYSBzeW50aGV0aWMgY29sb24sIGFuZCByZXR1cm4gdGhlIGluc2VydGVkIGNvbG9uLgogIFRva2VuIGVuc3VyZUNvbG9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnOicsIG5leHQpKSByZXR1cm4gbmV4dDsKICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnOicpOwogICAgVG9rZW4gbmV3VG9rZW4gPSBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNPTE9OLCBuZXh0LmNoYXJPZmZzZXQpOwogICAgcmV0dXJuIHJld3JpdGVBbmRSZWNvdmVyKHRva2VuLCBtZXNzYWdlLCBuZXdUb2tlbik7CiAgfQoKICAvLy8gSWYgdGhlIHRva2VuIGFmdGVyIFt0b2tlbl0gaXMgYSBub3QgbGl0ZXJhbCBzdHJpbmcsCiAgLy8vIHRoZW4gaW5zZXJ0IGEgc3ludGhldGljIGxpdGVyYWwgc3RyaW5nLgogIC8vLyBDYWxsIGBwYXJzZUxpdGVyYWxTdHJpbmdgIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KICBUb2tlbiBlbnN1cmVMaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmICghaWRlbnRpY2FsKG5leHQua2luZCwgU1RSSU5HX1RPS0VOKSkgewogICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkU3RyaW5nLndpdGhBcmd1bWVudHMobmV4dCk7CiAgICAgIFRva2VuIG5ld1Rva2VuID0KICAgICAgICAgIG5ldyBTeW50aGV0aWNTdHJpbmdUb2tlbihUb2tlblR5cGUuU1RSSU5HLCAnIiInLCBuZXh0LmNoYXJPZmZzZXQsIDApOwogICAgICByZXdyaXRlQW5kUmVjb3Zlcih0b2tlbiwgbWVzc2FnZSwgbmV3VG9rZW4pOwogICAgfQogICAgcmV0dXJuIHBhcnNlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgfQoKICAvLy8gSWYgdGhlIHRva2VuIGFmdGVyIFt0b2tlbl0gaXMgYSBzZW1pLWNvbG9uLCByZXR1cm4gaXQuCiAgLy8vIE90aGVyd2lzZSwgcmVwb3J0IGFuIGVycm9yLCBpbnNlcnQgYSBzeW50aGV0aWMgc2VtaS1jb2xvbiwKICAvLy8gYW5kIHJldHVybiB0aGUgaW5zZXJ0ZWQgc2VtaS1jb2xvbi4KICBUb2tlbiBlbnN1cmVTZW1pY29sb24oVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRPRE8oZGFucnViZWwpOiBPbmNlIGFsbCBleHBlY3QoJzsnLi4uKSBjYWxsIHNpdGVzIGhhdmUgYmVlbiBjb252ZXJ0ZWQKICAgIC8vIHRvIHVzZSB0aGlzIG1ldGhvZCwgcmVtb3ZlIHNpbWlsYXIgc2VtaWNvbG9uIHJlY292ZXJ5IGNvZGUKICAgIC8vIGZyb20gdGhlIGhhbmRsZUVycm9yIG1ldGhvZCBpbiBlbGVtZW50X2xpc3RlbmVyLmRhcnQuCiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnOycsIG5leHQpKSByZXR1cm4gbmV4dDsKCiAgICAvLyBGaW5kIGEgdG9rZW4gb24gdGhlIHNhbWUgbGluZSBhcyB3aGVyZSB0aGUgJzsnIHNob3VsZCBiZSBpbnNlcnRlZC4KICAgIC8vIFJlcG9ydGluZyB0aGUgZXJyb3Igb24gdGhpcyB0b2tlbiBtYWtlcyBpdCBlYXNpZXIKICAgIC8vIGZvciB1c2VycyB0byB1bmRlcnN0YW5kIGFuZCBmaXggdGhlIGVycm9yLgogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihmaW5kUHJldmlvdXNOb25aZXJvTGVuZ3RoVG9rZW4odG9rZW4pLAogICAgICAgIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdC53aXRoQXJndW1lbnRzKCc7JykpOwogICAgcmV0dXJuIHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKHRva2VuLCBUb2tlblR5cGUuU0VNSUNPTE9OKTsKICB9CgogIC8vLyBSZXBvcnQgYW4gZXJyb3IgYXQgdGhlIHRva2VuIGFmdGVyIFt0b2tlbl0gdGhhdCBoYXMgdGhlIGdpdmVuIFttZXNzYWdlXS4KICAvLy8gSW5zZXJ0IHRoZSBbbmV3VG9rZW5dIGFmdGVyIFt0b2tlbl0gYW5kIHJldHVybiBbbmV3VG9rZW5dLgogIFRva2VuIHJld3JpdGVBbmRSZWNvdmVyKFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIG5ld1Rva2VuKSB7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLm5leHQsIG1lc3NhZ2UpOwogICAgcmV0dXJuIHJld3JpdGVyLmluc2VydFRva2VuKHRva2VuLCBuZXdUb2tlbik7CiAgfQoKICAvLy8gUmVwbGFjZSB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSB3aXRoIGBbYCBmb2xsb3dlZCBieSBgXWAKICAvLy8gYW5kIHJldHVybiBbdG9rZW5dLgogIFRva2VuIHJld3JpdGVTcXVhcmVCcmFja2V0cyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ1tdJywgbmV4dCkpOwogICAgVG9rZW4gcmVwbGFjZW1lbnQ7CiAgICBpZiAobmV4dC5pc1N5bnRoZXRpYykgewogICAgICByZXBsYWNlbWVudCA9IGxpbmsoCiAgICAgICAgICBuZXcgU3ludGhldGljQmVnaW5Ub2tlbihUb2tlblR5cGUuT1BFTl9TUVVBUkVfQlJBQ0tFVCwgbmV4dC5vZmZzZXQpLAogICAgICAgICAgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVCwgbmV4dC5vZmZzZXQpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcGxhY2VtZW50ID0gbGluaygKICAgICAgICAgIG5ldyBCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VULCBuZXh0Lm9mZnNldCksCiAgICAgICAgICBuZXcgVG9rZW4oVG9rZW5UeXBlLkNMT1NFX1NRVUFSRV9CUkFDS0VULCBuZXh0Lm9mZnNldCArIDEpKTsKICAgIH0KICAgIHJld3JpdGVyLnJlcGxhY2VUb2tlbkZvbGxvd2luZyh0b2tlbiwgcmVwbGFjZW1lbnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFJlcG9ydCB0aGUgZ2l2ZW4gdG9rZW4gYXMgdW5leHBlY3RlZCBhbmQgcmV0dXJuIHRoZSBuZXh0IHRva2VuIGlmIHRoZSBuZXh0CiAgLy8vIHRva2VuIGlzIG9uZSBvZiB0aGUgW2V4cGVjdGVkTmV4dF0sIG90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgZ2l2ZW4gdG9rZW4uCiAgVG9rZW4gc2tpcFVuZXhwZWN0ZWRUb2tlbk9wdChUb2tlbiB0b2tlbiwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkTmV4dCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAobmV4dC5rZXl3b3JkID09IG51bGwpIHsKICAgICAgZmluYWwgU3RyaW5nIG5leHRWYWx1ZSA9IG5leHQubmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRWYWx1ZSBpbiBleHBlY3RlZE5leHQpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKG5leHRWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4obmV4dCwgY29kZXMudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZU5hdGl2ZUNsYXVzZShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmF0aXZlVG9rZW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ25hdGl2ZScsIG5hdGl2ZVRva2VuKSk7CiAgICBib29sIGhhc05hbWUgPSBmYWxzZTsKICAgIGlmICh0b2tlbi5uZXh0LmtpbmQgPT0gU1RSSU5HX1RPS0VOKSB7CiAgICAgIGhhc05hbWUgPSB0cnVlOwogICAgICB0b2tlbiA9IHBhcnNlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVOYXRpdmVDbGF1c2UobmF0aXZlVG9rZW4sIGhhc05hbWUpOwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICBuYXRpdmVUb2tlbiwgY29kZXMubWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBza2lwQ2xhc3NPck1peGluT3JFeHRlbnNpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICAvLyBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgYHtgIGFsd2F5cyBoYXMgYSBjbG9zaW5nIGB9YC4KICAgIHJldHVybiBlbnN1cmVCbG9jayh0b2tlbiwgbnVsbCwgbnVsbCk7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGNsYXNzQm9keToKICAvLy8gICAneycgY2xhc3NNZW1iZXIqICd9JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ2xhc3NPck1peGluT3JFeHRlbnNpb25Cb2R5KAogICAgICBUb2tlbiB0b2tlbiwgRGVjbGFyYXRpb25LaW5kIGtpbmQsIFN0cmluZyBlbmNsb3NpbmdEZWNsYXJhdGlvbk5hbWUpIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd7JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luQ2xhc3NPck1peGluQm9keShraW5kLCB0b2tlbik7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlQ2xhc3NPck1peGluT3JFeHRlbnNpb25NZW1iZXJJbXBsKAogICAgICAgICAgdG9rZW4sIGtpbmQsIGVuY2xvc2luZ0RlY2xhcmF0aW9uTmFtZSk7CiAgICAgICsrY291bnQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNFb2YgfHwgb3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kQ2xhc3NPck1peGluQm9keShraW5kLCBjb3VudCwgYmVnaW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIGJvb2wgaXNVbmFyeU1pbnVzKFRva2VuIHRva2VuKSA9PgogICAgICB0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4gJiYKICAgICAgdG9rZW4ubGV4ZW1lID09ICd1bmFyeScgJiYKICAgICAgb3B0aW9uYWwoJy0nLCB0b2tlbi5uZXh0KTsKCiAgLy8vIFBhcnNlIGEgY2xhc3MgbWVtYmVyLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VDbGFzc01lbWJlcihUb2tlbiB0b2tlbiwgU3RyaW5nIGNsYXNzTmFtZSkgewogICAgcmV0dXJuIHBhcnNlQ2xhc3NPck1peGluT3JFeHRlbnNpb25NZW1iZXJJbXBsKAogICAgICAgICAgICBzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwgRGVjbGFyYXRpb25LaW5kLkNsYXNzLCBjbGFzc05hbWUpCiAgICAgICAgLm5leHQ7CiAgfQoKICAvLy8gUGFyc2UgYSBtaXhpbiBtZW1iZXIuCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4gQXMgYSByZXN1bHQsIHRoaXMKICAvLy8gbWV0aG9kIHRha2VzIHRoZSBuZXh0IHRva2VuIHRvIGJlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHRoZSBsYXN0IGNvbnN1bWVkCiAgLy8vIHRva2VuIGFuZCByZXR1cm5zIHRoZSB0b2tlbiBhZnRlciB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbiByYXRoZXIgdGhhbiB0aGUKICAvLy8gbGFzdCBjb25zdW1lZCB0b2tlbi4KICBUb2tlbiBwYXJzZU1peGluTWVtYmVyKFRva2VuIHRva2VuLCBTdHJpbmcgbWl4aW5OYW1lKSB7CiAgICByZXR1cm4gcGFyc2VDbGFzc09yTWl4aW5PckV4dGVuc2lvbk1lbWJlckltcGwoCiAgICAgICAgICAgIHN5bnRoZXRpY1ByZXZpb3VzVG9rZW4odG9rZW4pLCBEZWNsYXJhdGlvbktpbmQuTWl4aW4sIG1peGluTmFtZSkKICAgICAgICAubmV4dDsKICB9CgogIC8vLyBQYXJzZSBhbiBleHRlbnNpb24gbWVtYmVyLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBwYXJzZXIuIEFzIGEgcmVzdWx0LCB0aGlzCiAgLy8vIG1ldGhvZCB0YWtlcyB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCByYXRoZXIgdGhhbiB0aGUgbGFzdCBjb25zdW1lZAogIC8vLyB0b2tlbiBhbmQgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQgdG9rZW4gcmF0aGVyIHRoYW4gdGhlCiAgLy8vIGxhc3QgY29uc3VtZWQgdG9rZW4uCiAgVG9rZW4gcGFyc2VFeHRlbnNpb25NZW1iZXIoVG9rZW4gdG9rZW4sIFN0cmluZyBleHRlbnNpb25OYW1lKSB7CiAgICByZXR1cm4gcGFyc2VDbGFzc09yTWl4aW5PckV4dGVuc2lvbk1lbWJlckltcGwoc3ludGhldGljUHJldmlvdXNUb2tlbih0b2tlbiksCiAgICAgICAgICAgIERlY2xhcmF0aW9uS2luZC5FeHRlbnNpb24sIGV4dGVuc2lvbk5hbWUpCiAgICAgICAgLm5leHQ7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGNsYXNzTWVtYmVyOgogIC8vLyAgIGZpZWxkRGVjbGFyYXRpb24gfAogIC8vLyAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gfAogIC8vLyAgIG1ldGhvZERlY2xhcmF0aW9uCiAgLy8vIDsKICAvLy8KICAvLy8gbWl4aW5NZW1iZXI6CiAgLy8vICAgZmllbGREZWNsYXJhdGlvbiB8CiAgLy8vICAgbWV0aG9kRGVjbGFyYXRpb24KICAvLy8gOwogIC8vLwogIC8vLyBleHRlbnNpb25NZW1iZXI6CiAgLy8vICAgc3RhdGljRmllbGREZWNsYXJhdGlvbiB8CiAgLy8vICAgbWV0aG9kRGVjbGFyYXRpb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uTWVtYmVySW1wbCgKICAgICAgVG9rZW4gdG9rZW4sIERlY2xhcmF0aW9uS2luZCBraW5kLCBTdHJpbmcgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKSB7CiAgICBUb2tlbiBiZWZvcmVTdGFydCA9IHRva2VuID0gcGFyc2VNZXRhZGF0YVN0YXIodG9rZW4pOwoKICAgIFRva2VuIGNvdmFyaWFudFRva2VuOwogICAgVG9rZW4gZXh0ZXJuYWxUb2tlbjsKICAgIFRva2VuIGxhdGVUb2tlbjsKICAgIFRva2VuIHN0YXRpY1Rva2VuOwogICAgVG9rZW4gdmFyRmluYWxPckNvbnN0OwoKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgaWYgKG9wdGlvbmFsKCdleHRlcm5hbCcsIG5leHQpKSB7CiAgICAgICAgZXh0ZXJuYWxUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnc3RhdGljJywgbmV4dCkpIHsKICAgICAgICAgIHN0YXRpY1Rva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCgnY292YXJpYW50JywgbmV4dCkpIHsKICAgICAgICAgIGNvdmFyaWFudFRva2VuID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgICBpZiAob3B0aW9uYWwoJ2ZpbmFsJywgbmV4dCkpIHsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpKSB7CiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdjb25zdCcsIG5leHQpICYmIGNvdmFyaWFudFRva2VuID09IG51bGwpIHsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2xhdGUnLCBuZXh0KSkgewogICAgICAgICAgICBsYXRlVG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSAmJiBvcHRpb25hbCgnZmluYWwnLCBuZXh0KSkgewogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTW9kaWZpZXIobmV4dCkpIHsKICAgICAgICAgICAgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgY29udGV4dCA9IG5ldyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzKQogICAgICAgICAgICAgIC4uY292YXJpYW50VG9rZW4gPSBjb3ZhcmlhbnRUb2tlbgogICAgICAgICAgICAgIC4uZXh0ZXJuYWxUb2tlbiA9IGV4dGVybmFsVG9rZW4KICAgICAgICAgICAgICAuLmxhdGVUb2tlbiA9IGxhdGVUb2tlbgogICAgICAgICAgICAgIC4uc3RhdGljVG9rZW4gPSBzdGF0aWNUb2tlbgogICAgICAgICAgICAgIC4udmFyRmluYWxPckNvbnN0ID0gdmFyRmluYWxPckNvbnN0OwoKICAgICAgICAgICAgdG9rZW4gPSBjb250ZXh0LnBhcnNlQ2xhc3NNZW1iZXJNb2RpZmllcnModG9rZW4pOwogICAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgICAgICAgIGNvdmFyaWFudFRva2VuID0gY29udGV4dC5jb3ZhcmlhbnRUb2tlbjsKICAgICAgICAgICAgZXh0ZXJuYWxUb2tlbiA9IGNvbnRleHQuZXh0ZXJuYWxUb2tlbjsKICAgICAgICAgICAgbGF0ZVRva2VuID0gY29udGV4dC5sYXRlVG9rZW47CiAgICAgICAgICAgIHN0YXRpY1Rva2VuID0gY29udGV4dC5zdGF0aWNUb2tlbjsKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBsaXN0ZW5lci5iZWdpbk1lbWJlcigpOwoKICAgIFRva2VuIGJlZm9yZVR5cGUgPSB0b2tlbjsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUodG9rZW4sIGZhbHNlLCB0cnVlKTsKICAgIHRva2VuID0gdHlwZUluZm8uc2tpcFR5cGUodG9rZW4pOwogICAgbmV4dCA9IHRva2VuLm5leHQ7CgogICAgVG9rZW4gZ2V0T3JTZXQ7CiAgICBpZiAobmV4dC50eXBlICE9IFRva2VuVHlwZS5JREVOVElGSUVSKSB7CiAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgIGlmIChpZGVudGljYWwodmFsdWUsICdnZXQnKSB8fCBpZGVudGljYWwodmFsdWUsICdzZXQnKSkgewogICAgICAgIGlmIChuZXh0Lm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICBnZXRPclNldCA9IHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gY29udGludWUgcGFyc2luZyBgZ2V0YCBvciBgc2V0YCBhcyBhbiBpZGVudGlmaWVyLgogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2ZhY3RvcnknKSkgewogICAgICAgIFRva2VuIG5leHQyID0gbmV4dC5uZXh0OwogICAgICAgIGlmIChuZXh0Mi5pc0lkZW50aWZpZXIgfHwgbmV4dDIuaXNNb2RpZmllcikgewogICAgICAgICAgaWYgKGJlZm9yZVR5cGUgIT0gdG9rZW4pIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgY29kZXMubWVzc2FnZVR5cGVCZWZvcmVGYWN0b3J5KTsKICAgICAgICAgIH0KICAgICAgICAgIHRva2VuID0gcGFyc2VGYWN0b3J5TWV0aG9kKHRva2VuLCBraW5kLCBiZWZvcmVTdGFydCwgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgICAgICBzdGF0aWNUb2tlbiA/PyBjb3ZhcmlhbnRUb2tlbiwgdmFyRmluYWxPckNvbnN0KTsKICAgICAgICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gY29udGludWUgcGFyc2luZyBgZmFjdG9yeWAgYXMgYW4gaWRlbnRpZmllci4KICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdvcGVyYXRvcicpKSB7CiAgICAgICAgVG9rZW4gbmV4dDIgPSBuZXh0Lm5leHQ7CiAgICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbSA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0KTsKICAgICAgICAvLyBgb3BlcmF0b3JgIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgYXMgaW4KICAgICAgICAvLyBgaW50IG9wZXJhdG9yPFQ+KClgIG9yIGBpbnQgb3BlcmF0b3IgPSAyYAogICAgICAgIGlmIChuZXh0Mi5pc1VzZXJEZWZpbmFibGVPcGVyYXRvciAmJiB0eXBlUGFyYW0gPT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgICAgICB0b2tlbi5uZXh0LAogICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKTsKICAgICAgICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz09PScsIG5leHQyKSB8fAogICAgICAgICAgICBvcHRpb25hbCgnIT09JywgbmV4dDIpIHx8CiAgICAgICAgICAgIChuZXh0Mi5pc09wZXJhdG9yICYmCiAgICAgICAgICAgICAgICAhb3B0aW9uYWwoJz0nLCBuZXh0MikgJiYKICAgICAgICAgICAgICAgICFvcHRpb25hbCgnPCcsIG5leHQyKSkpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5OiBJbnZhbGlkIG9wZXJhdG9yCiAgICAgICAgICByZXR1cm4gcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbigKICAgICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgICAgICBraW5kLAogICAgICAgICAgICAgIGVuY2xvc2luZ0RlY2xhcmF0aW9uTmFtZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc1VuYXJ5TWludXMobmV4dDIpKSB7CiAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgICAgICB0b2tlbi5uZXh0LAogICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKTsKICAgICAgICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gY29udGludWUgcGFyc2luZyBgb3BlcmF0b3JgIGFzIGFuIGlkZW50aWZpZXIuCiAgICAgIH0gZWxzZSBpZiAoIW5leHQuaXNJZGVudGlmaWVyIHx8CiAgICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAndHlwZWRlZicpICYmCiAgICAgICAgICAgICAgdG9rZW4gPT0gYmVmb3JlU3RhcnQgJiYKICAgICAgICAgICAgICBuZXh0Lm5leHQuaXNJZGVudGlmaWVyKSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgcmV0dXJuIHJlY292ZXJGcm9tSW52YWxpZE1lbWJlcigKICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgICBzdGF0aWNUb2tlbiwKICAgICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LAogICAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgICAgZ2V0T3JTZXQsCiAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgIGVuY2xvc2luZ0RlY2xhcmF0aW9uTmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZUluZm8gPT0gbm9UeXBlICYmIHZhckZpbmFsT3JDb25zdCA9PSBudWxsKSB7CiAgICAgIFRva2VuIG5leHQyID0gbmV4dC5uZXh0OwogICAgICBpZiAobmV4dDIuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IgJiYgbmV4dDIuZW5kR3JvdXAgPT0gbnVsbCkgewogICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHQyLm5leHQuc3RyaW5nVmFsdWU7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgICAgICBpZGVudGljYWwodmFsdWUsICd7JykgfHwKICAgICAgICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPT4nKSkgewogICAgICAgICAgLy8gUmVjb3Zlcnk6IE1pc3NpbmcgYG9wZXJhdG9yYCBrZXl3b3JkCiAgICAgICAgICByZXR1cm4gcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbigKICAgICAgICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICAgICAgICBraW5kLAogICAgICAgICAgICAgIGVuY2xvc2luZ0RlY2xhcmF0aW9uTmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gQXQgdGhpcyBwb2ludCwgdG9rZW4gaXMgYmVmb3JlIHRoZSBuYW1lLCBhbmQgbmV4dCBpcyB0aGUgbmFtZQogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJ3snKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJzwnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJy4nKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz0+JykpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICBsYXRlVG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgIHRva2VuLm5leHQsCiAgICAgICAgICBraW5kLAogICAgICAgICAgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChnZXRPclNldCAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgZ2V0T3JTZXQsIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlRmllbGRzKAogICAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgIGJlZm9yZVR5cGUsCiAgICAgICAgICB0eXBlSW5mbywKICAgICAgICAgIHRva2VuLm5leHQsCiAgICAgICAgICBraW5kKTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZE1lbWJlcigpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VNZXRob2QoCiAgICAgIFRva2VuIGJlZm9yZVN0YXJ0LAogICAgICBUb2tlbiBleHRlcm5hbFRva2VuLAogICAgICBUb2tlbiBzdGF0aWNUb2tlbiwKICAgICAgVG9rZW4gY292YXJpYW50VG9rZW4sCiAgICAgIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBUb2tlbiBiZWZvcmVUeXBlLAogICAgICBUeXBlSW5mbyB0eXBlSW5mbywKICAgICAgVG9rZW4gZ2V0T3JTZXQsCiAgICAgIFRva2VuIG5hbWUsCiAgICAgIERlY2xhcmF0aW9uS2luZCBraW5kLAogICAgICBTdHJpbmcgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKSB7CiAgICBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGxhdGVUb2tlbiwgY29kZXMudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgfQogICAgYm9vbCBpc09wZXJhdG9yID0gZmFsc2U7CiAgICBpZiAoZ2V0T3JTZXQgPT0gbnVsbCAmJiBvcHRpb25hbCgnb3BlcmF0b3InLCBuYW1lKSkgewogICAgICBUb2tlbiBvcGVyYXRvciA9IG5hbWUubmV4dDsKICAgICAgaWYgKG9wZXJhdG9yLmlzT3BlcmF0b3IgfHwKICAgICAgICAgIGlkZW50aWNhbChvcGVyYXRvci5raW5kLCBFUV9FUV9FUV9UT0tFTikgfHwKICAgICAgICAgIGlkZW50aWNhbChvcGVyYXRvci5raW5kLCBCQU5HX0VRX0VRX1RPS0VOKSB8fAogICAgICAgICAgaXNVbmFyeU1pbnVzKG9wZXJhdG9yKSkgewogICAgICAgIGlzT3BlcmF0b3IgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgaWYgKHN0YXRpY1Rva2VuICE9IG51bGwpIHsKICAgICAgaWYgKGlzT3BlcmF0b3IpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHN0YXRpY1Rva2VuLCBjb2Rlcy5tZXNzYWdlU3RhdGljT3BlcmF0b3IpOwogICAgICAgIHN0YXRpY1Rva2VuID0gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIGlmIChnZXRPclNldCA9PSBudWxsIHx8IG9wdGlvbmFsKCdnZXQnLCBnZXRPclNldCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGNvdmFyaWFudFRva2VuLCBjb2Rlcy5tZXNzYWdlQ292YXJpYW50TWVtYmVyKTsKICAgICAgICBjb3ZhcmlhbnRUb2tlbiA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCkgewogICAgICBpZiAob3B0aW9uYWwoJ2NvbnN0JywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICAgIGlmIChnZXRPclNldCAhPSBudWxsKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgY29kZXMudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHZhckZpbmFsT3JDb25zdCwgY29kZXMubWVzc2FnZVZhclJldHVyblR5cGUpOwogICAgICAgIHZhckZpbmFsT3JDb25zdCA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCdmaW5hbCcsIHZhckZpbmFsT3JDb25zdCkpOwogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgY29kZXMudGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXIpOwogICAgICAgIHZhckZpbmFsT3JDb25zdCA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgcGFyc2luZyB0aGUgbmFtZSBiZWZvcmUgY2FsbGluZyBiZWdpbk1ldGhvZAogICAgLy8gcmF0aGVyIHRoYW4gcGFzc2luZyB0aGUgbmFtZSB0b2tlbiBpbnRvIGJlZ2luTWV0aG9kLgogICAgbGlzdGVuZXIuYmVnaW5NZXRob2QoZXh0ZXJuYWxUb2tlbiwgc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwgZ2V0T3JTZXQsIG5hbWUpOwoKICAgIFRva2VuIHRva2VuID0gdHlwZUluZm8ucGFyc2VUeXBlKGJlZm9yZVR5cGUsIHRoaXMpOwogICAgYXNzZXJ0KHRva2VuLm5leHQgPT0gKGdldE9yU2V0ID8/IG5hbWUpKTsKICAgIHRva2VuID0gZ2V0T3JTZXQgPz8gdG9rZW47CgogICAgaWYgKGlzT3BlcmF0b3IpIHsKICAgICAgdG9rZW4gPSBwYXJzZU9wZXJhdG9yTmFtZSh0b2tlbik7CiAgICB9IGVsc2UgewogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uKTsKICAgICAgaWYgKGdldE9yU2V0ID09IG51bGwpIHsKICAgICAgICB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkUmVzdE9wdCgKICAgICAgICAgICAgdG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uQ29udGludWF0aW9uKTsKICAgICAgfQogICAgfQoKICAgIGJvb2wgaXNHZXR0ZXIgPSBmYWxzZTsKICAgIGlmIChnZXRPclNldCA9PSBudWxsKSB7CiAgICAgIHRva2VuID0gcGFyc2VNZXRob2RUeXBlVmFyKHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIGlzR2V0dGVyID0gb3B0aW9uYWwoImdldCIsIGdldE9yU2V0KTsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlVmFyaWFibGVzKHRva2VuLm5leHQpOwogICAgfQoKICAgIFRva2VuIGJlZm9yZVBhcmFtID0gdG9rZW47CiAgICBUb2tlbiBiZWZvcmVJbml0aWFsaXplcnMgPSBwYXJzZUdldHRlck9yRm9ybWFsUGFyYW1ldGVycygKICAgICAgICB0b2tlbiwKICAgICAgICBuYW1lLAogICAgICAgIGlzR2V0dGVyLAogICAgICAgIGtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkV4dGVuc2lvbgogICAgICAgICAgICA/IHN0YXRpY1Rva2VuICE9IG51bGwKICAgICAgICAgICAgICAgID8gTWVtYmVyS2luZC5FeHRlbnNpb25TdGF0aWNNZXRob2QKICAgICAgICAgICAgICAgIDogTWVtYmVyS2luZC5FeHRlbnNpb25Ob25TdGF0aWNNZXRob2QKICAgICAgICAgICAgOiBzdGF0aWNUb2tlbiAhPSBudWxsCiAgICAgICAgICAgICAgICA/IE1lbWJlcktpbmQuU3RhdGljTWV0aG9kCiAgICAgICAgICAgICAgICA6IE1lbWJlcktpbmQuTm9uU3RhdGljTWV0aG9kKTsKICAgIHRva2VuID0gcGFyc2VJbml0aWFsaXplcnNPcHQoYmVmb3JlSW5pdGlhbGl6ZXJzKTsKICAgIGlmICh0b2tlbiA9PSBiZWZvcmVJbml0aWFsaXplcnMpIGJlZm9yZUluaXRpYWxpemVycyA9IG51bGw7CgogICAgQXN5bmNNb2RpZmllciBzYXZlZEFzeW5jTW9kaWZpZXIgPSBhc3luY1N0YXRlOwogICAgVG9rZW4gYXN5bmNUb2tlbiA9IHRva2VuLm5leHQ7CiAgICB0b2tlbiA9IHBhcnNlQXN5bmNNb2RpZmllck9wdCh0b2tlbik7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiAhaW5QbGFpblN5bmMgJiYgb3B0aW9uYWwoInNldCIsIGdldE9yU2V0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGFzeW5jVG9rZW4sIGNvZGVzLm1lc3NhZ2VTZXR0ZXJOb3RTeW5jKTsKICAgIH0KICAgIGZpbmFsIFRva2VuIGJvZHlTdGFydCA9IHRva2VuLm5leHQ7CiAgICBpZiAoZXh0ZXJuYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIGlmICghb3B0aW9uYWwoJzsnLCBib2R5U3RhcnQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihib2R5U3RhcnQsIGNvZGVzLm1lc3NhZ2VFeHRlcm5hbE1ldGhvZFdpdGhCb2R5KTsKICAgICAgfQogICAgfQogICAgaWYgKG9wdGlvbmFsKCc9JywgYm9keVN0YXJ0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGJvZHlTdGFydCwgY29kZXMubWVzc2FnZVJlZGlyZWN0aW9uSW5Ob25GYWN0b3J5KTsKICAgICAgdG9rZW4gPSBwYXJzZVJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgZmFsc2UsCiAgICAgICAgICAoc3RhdGljVG9rZW4gPT0gbnVsbCB8fCBleHRlcm5hbFRva2VuICE9IG51bGwpICYmIGluUGxhaW5TeW5jKTsKICAgIH0KICAgIGFzeW5jU3RhdGUgPSBzYXZlZEFzeW5jTW9kaWZpZXI7CgogICAgYm9vbCBpc0NvbnN0cnVjdG9yID0gZmFsc2U7CiAgICBpZiAob3B0aW9uYWwoJy4nLCBuYW1lLm5leHQpIHx8IGJlZm9yZUluaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgIGlzQ29uc3RydWN0b3IgPSB0cnVlOwogICAgICBpZiAobmFtZS5sZXhlbWUgIT0gZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKSB7CiAgICAgICAgLy8gUmVjb3Zlcnk6IFRoZSBuYW1lIGRvZXMgbm90IG1hdGNoLAogICAgICAgIC8vIGJ1dCB0aGUgbmFtZSBpcyBwcmVmaXhlZCBvciB0aGUgZGVjbGFyYXRpb24gY29udGFpbnMgaW5pdGlhbGl6ZXJzLgogICAgICAgIC8vIFJlcG9ydCBhbiBlcnJvciBhbmQgY29udGludWUgd2l0aCBpbnZhbGlkIG5hbWUuCiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCBpbnZhbGlkIGNvbnN0cnVjdG9yIG5hbWUKICAgICAgICAvLyBDdXJyZW50bHkgbXVsdGlwbGUgbGlzdGVuZXJzIHJlcG9ydCB0aGlzIGVycm9yLCBidXQgdGhhdCBsb2dpYyBzaG91bGQKICAgICAgICAvLyBiZSByZW1vdmVkIGFuZCB0aGUgZXJyb3IgcmVwb3J0ZWQgaGVyZSBpbnN0ZWFkLgogICAgICAgIGlmIChpc09wZXJhdG9yKSB7CiAgICAgICAgICBpc0NvbnN0cnVjdG9yID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChnZXRPclNldCAhPSBudWxsKSB7CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICBpZiAob3B0aW9uYWwoJy4nLCBuYW1lLm5leHQpKSB7CiAgICAgICAgICAvLyBVbmV4cGVjdGVkIGdldC9zZXQgYmVmb3JlIGNvbnN0cnVjdG9yLgogICAgICAgICAgLy8gUmVwb3J0IGFuIGVycm9yIGFuZCBza2lwIG92ZXIgdGhlIHRva2VuLgogICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IHJlcG9ydCBhbiBlcnJvciBvbiBnZXQvc2V0IHRva2VuCiAgICAgICAgICAvLyBUaGlzIGlzIGN1cnJlbnRseSByZXBvcnRlZCBieSBsaXN0ZW5lcnMgb3RoZXIgdGhhbiBBc3RCdWlsZGVyLgogICAgICAgICAgLy8gSXQgc2hvdWxkIGJlIHJlcG9ydGVkIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGxpc3RlbmVycy4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXNDb25zdHJ1Y3RvciA9IGZhbHNlOwogICAgICAgICAgaWYgKGJlZm9yZUluaXRpYWxpemVycyAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgaW5pdGlhbGl6ZXJzIGFmdGVyIGdldC9zZXQgZGVjbGFyYXRpb24uCiAgICAgICAgICAgIC8vIFJlcG9ydCBhbiBlcnJvciBvbiB0aGUgaW5pdGlhbGl6ZXJzCiAgICAgICAgICAgIC8vIGFuZCBjb250aW51ZSB3aXRoIHRoZSBnZXQvc2V0IGRlY2xhcmF0aW9uLgogICAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVwb3J0IGludmFsaWQgaW5pdGlhbGl6ZXJzIGVycm9yCiAgICAgICAgICAgIC8vIEN1cnJlbnRseSBtdWx0aXBsZSBsaXN0ZW5lcnMgcmVwb3J0IHRoaXMgZXJyb3IsIGJ1dCB0aGF0IGxvZ2ljCiAgICAgICAgICAgIC8vIHNob3VsZCBiZSByZW1vdmVkIGFuZCB0aGUgZXJyb3IgcmVwb3J0ZWQgaGVyZSBpbnN0ZWFkLgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChuYW1lLmxleGVtZSA9PSBlbmNsb3NpbmdEZWNsYXJhdGlvbk5hbWUpIHsKICAgICAgaWYgKGdldE9yU2V0ICE9IG51bGwpIHsKICAgICAgICAvLyBSZWNvdmVyeTogVGhlIGdldC9zZXQgbWVtYmVyIG5hbWUgaXMgaW52YWxpZC4KICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IgYW5kIGNvbnRpbnVlIHdpdGggaW52YWxpZCBuYW1lLgogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiByZXBvcnQgaW52YWxpZCBnZXQvc2V0IG1lbWJlciBuYW1lCiAgICAgICAgLy8gQ3VycmVudGx5IG11bHRpcGxlIGxpc3RlbmVycyByZXBvcnQgdGhpcyBlcnJvciwgYnV0IHRoYXQgbG9naWMgc2hvdWxkCiAgICAgICAgLy8gYmUgcmVtb3ZlZCBhbmQgdGhlIGVycm9yIHJlcG9ydGVkIGhlcmUgaW5zdGVhZC4KICAgICAgfSBlbHNlIHsKICAgICAgICBpc0NvbnN0cnVjdG9yID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGlmIChpc0NvbnN0cnVjdG9yKSB7CiAgICAgIC8vCiAgICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgIC8vCiAgICAgIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihzdGF0aWNUb2tlbiwgY29kZXMubWVzc2FnZVN0YXRpY0NvbnN0cnVjdG9yKTsKICAgICAgfQogICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5DbGFzczoKICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZW1vdmUgZ2V0T3JTZXQgZnJvbSBjb25zdHJ1Y3RvciBldmVudHMKICAgICAgICAgIGxpc3RlbmVyLmVuZENsYXNzQ29uc3RydWN0b3IoZ2V0T3JTZXQsIGJlZm9yZVN0YXJ0Lm5leHQsCiAgICAgICAgICAgICAgYmVmb3JlUGFyYW0ubmV4dCwgYmVmb3JlSW5pdGlhbGl6ZXJzPy5uZXh0LCB0b2tlbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5NaXhpbjoKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmFtZSwgY29kZXMubWVzc2FnZU1peGluRGVjbGFyZXNDb25zdHJ1Y3Rvcik7CiAgICAgICAgICBsaXN0ZW5lci5lbmRNaXhpbkNvbnN0cnVjdG9yKGdldE9yU2V0LCBiZWZvcmVTdGFydC5uZXh0LAogICAgICAgICAgICAgIGJlZm9yZVBhcmFtLm5leHQsIGJlZm9yZUluaXRpYWxpemVycz8ubmV4dCwgdG9rZW4pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBEZWNsYXJhdGlvbktpbmQuRXh0ZW5zaW9uOgogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuYW1lLCBjb2Rlcy5tZXNzYWdlRXh0ZW5zaW9uRGVjbGFyZXNDb25zdHJ1Y3Rvcik7CiAgICAgICAgICBsaXN0ZW5lci5lbmRFeHRlbnNpb25Db25zdHJ1Y3RvcihnZXRPclNldCwgYmVmb3JlU3RhcnQubmV4dCwKICAgICAgICAgICAgICBiZWZvcmVQYXJhbS5uZXh0LCBiZWZvcmVJbml0aWFsaXplcnM/Lm5leHQsIHRva2VuKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRGVjbGFyYXRpb25LaW5kLlRvcExldmVsOgogICAgICAgICAgdGhyb3cgIkludGVybmFsIGVycm9yOiBUb3BMZXZlbCBjb25zdHJ1Y3Rvci4iOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vCiAgICAgIC8vIG1ldGhvZAogICAgICAvLwogICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICBhc3NlcnQob3B0aW9uYWwoJ2NvbnN0JywgdmFyRmluYWxPckNvbnN0KSk7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih2YXJGaW5hbE9yQ29uc3QsIGNvZGVzLm1lc3NhZ2VDb25zdE1ldGhvZCk7CiAgICAgIH0KICAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgICAgY2FzZSBEZWNsYXJhdGlvbktpbmQuQ2xhc3M6CiAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogUmVtb3ZlIGJlZ2luSW5pdGlhbGl6ZXJzIHRva2VuIGZyb20gbWV0aG9kIGV2ZW50cwogICAgICAgICAgbGlzdGVuZXIuZW5kQ2xhc3NNZXRob2QoZ2V0T3JTZXQsIGJlZm9yZVN0YXJ0Lm5leHQsIGJlZm9yZVBhcmFtLm5leHQsCiAgICAgICAgICAgICAgYmVmb3JlSW5pdGlhbGl6ZXJzPy5uZXh0LCB0b2tlbik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5NaXhpbjoKICAgICAgICAgIGxpc3RlbmVyLmVuZE1peGluTWV0aG9kKGdldE9yU2V0LCBiZWZvcmVTdGFydC5uZXh0LCBiZWZvcmVQYXJhbS5uZXh0LAogICAgICAgICAgICAgIGJlZm9yZUluaXRpYWxpemVycz8ubmV4dCwgdG9rZW4pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBEZWNsYXJhdGlvbktpbmQuRXh0ZW5zaW9uOgogICAgICAgICAgaWYgKG9wdGlvbmFsKCc7JywgYm9keVN0YXJ0KSAmJiBleHRlcm5hbFRva2VuID09IG51bGwpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihpc09wZXJhdG9yID8gbmFtZS5uZXh0IDogbmFtZSwKICAgICAgICAgICAgICAgIGNvZGVzLm1lc3NhZ2VFeHRlbnNpb25EZWNsYXJlc0Fic3RyYWN0TWVtYmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RlbmVyLmVuZEV4dGVuc2lvbk1ldGhvZChnZXRPclNldCwgYmVmb3JlU3RhcnQubmV4dCwKICAgICAgICAgICAgICBiZWZvcmVQYXJhbS5uZXh0LCBiZWZvcmVJbml0aWFsaXplcnM/Lm5leHQsIHRva2VuKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRGVjbGFyYXRpb25LaW5kLlRvcExldmVsOgogICAgICAgICAgdGhyb3cgIkludGVybmFsIGVycm9yOiBUb3BMZXZlbCBtZXRob2QuIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZhY3RvcnlNZXRob2QoVG9rZW4gdG9rZW4sIERlY2xhcmF0aW9uS2luZCBraW5kLCBUb2tlbiBiZWZvcmVTdGFydCwKICAgICAgVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gc3RhdGljT3JDb3ZhcmlhbnQsIFRva2VuIHZhckZpbmFsT3JDb25zdCkgewogICAgVG9rZW4gZmFjdG9yeUtleXdvcmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZhY3RvcnknLCBmYWN0b3J5S2V5d29yZCkpOwoKICAgIGlmICghaXNWYWxpZFR5cGVSZWZlcmVuY2UodG9rZW4ubmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgY29udGV4dCA9IG5ldyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzKQogICAgICAgIC4uZXh0ZXJuYWxUb2tlbiA9IGV4dGVybmFsVG9rZW4KICAgICAgICAuLnN0YXRpY09yQ292YXJpYW50ID0gc3RhdGljT3JDb3ZhcmlhbnQKICAgICAgICAuLnZhckZpbmFsT3JDb25zdCA9IHZhckZpbmFsT3JDb25zdDsKCiAgICAgIHRva2VuID0gY29udGV4dC5wYXJzZU1vZGlmaWVyc0FmdGVyRmFjdG9yeSh0b2tlbik7CgogICAgICBleHRlcm5hbFRva2VuID0gY29udGV4dC5leHRlcm5hbFRva2VuOwogICAgICBzdGF0aWNPckNvdmFyaWFudCA9IGNvbnRleHQuc3RhdGljVG9rZW4gPz8gY29udGV4dC5jb3ZhcmlhbnRUb2tlbjsKICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICBjb250ZXh0ID0gbnVsbDsKICAgIH0KCiAgICBpZiAoc3RhdGljT3JDb3ZhcmlhbnQgIT0gbnVsbCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgc3RhdGljT3JDb3ZhcmlhbnQsIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiAhb3B0aW9uYWwoJ2NvbnN0JywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBjb2Rlcy50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgIHZhckZpbmFsT3JDb25zdCA9IG51bGw7CiAgICB9CgogICAgbGlzdGVuZXIuYmVnaW5GYWN0b3J5TWV0aG9kKGJlZm9yZVN0YXJ0LCBleHRlcm5hbFRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbik7CiAgICB0b2tlbiA9IHBhcnNlUXVhbGlmaWVkUmVzdE9wdCgKICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24pOwogICAgdG9rZW4gPSBwYXJzZU1ldGhvZFR5cGVWYXIodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdCh0b2tlbiwgTWVtYmVyS2luZC5GYWN0b3J5KTsKICAgIFRva2VuIGFzeW5jVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgdG9rZW4gPSBwYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIWluUGxhaW5TeW5jKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXN5bmNUb2tlbiwgY29kZXMubWVzc2FnZUZhY3RvcnlOb3RTeW5jKTsKICAgIH0KICAgIGlmIChvcHRpb25hbCgnPScsIG5leHQpKSB7CiAgICAgIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGNvZGVzLm1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbik7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZVJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogICAgfSBlbHNlIGlmIChleHRlcm5hbFRva2VuICE9IG51bGwpIHsKICAgICAgaWYgKCFvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHkpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VGdW5jdGlvbkJvZHkodG9rZW4sIGZhbHNlLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgIT0gbnVsbCAmJiAhb3B0aW9uYWwoJ25hdGl2ZScsIG5leHQpKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCdjb25zdCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodmFyRmluYWxPckNvbnN0LCBjb2Rlcy5tZXNzYWdlQ29uc3RGYWN0b3J5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgZmFsc2UsIGZhbHNlKTsKICAgIH0KICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5DbGFzczoKICAgICAgICBsaXN0ZW5lci5lbmRDbGFzc0ZhY3RvcnlNZXRob2QoYmVmb3JlU3RhcnQubmV4dCwgZmFjdG9yeUtleXdvcmQsIHRva2VuKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBEZWNsYXJhdGlvbktpbmQuTWl4aW46CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgZmFjdG9yeUtleXdvcmQsIGNvZGVzLm1lc3NhZ2VNaXhpbkRlY2xhcmVzQ29uc3RydWN0b3IpOwogICAgICAgIGxpc3RlbmVyLmVuZE1peGluRmFjdG9yeU1ldGhvZChiZWZvcmVTdGFydC5uZXh0LCBmYWN0b3J5S2V5d29yZCwgdG9rZW4pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5FeHRlbnNpb246CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgZmFjdG9yeUtleXdvcmQsIGNvZGVzLm1lc3NhZ2VFeHRlbnNpb25EZWNsYXJlc0NvbnN0cnVjdG9yKTsKICAgICAgICBsaXN0ZW5lci5lbmRFeHRlbnNpb25GYWN0b3J5TWV0aG9kKAogICAgICAgICAgICBiZWZvcmVTdGFydC5uZXh0LCBmYWN0b3J5S2V5d29yZCwgdG9rZW4pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIERlY2xhcmF0aW9uS2luZC5Ub3BMZXZlbDoKICAgICAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6IFRvcExldmVsIGZhY3RvcnkuIjsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlT3BlcmF0b3JOYW1lKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWZvcmVUb2tlbiA9IHRva2VuOwogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdvcGVyYXRvcicsIHRva2VuKSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChuZXh0LmlzVXNlckRlZmluYWJsZU9wZXJhdG9yKSB7CiAgICAgIGlmIChjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4pICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAvLyBgb3BlcmF0b3JgIGlzIGJlaW5nIHVzZWQgYXMgYW4gaWRlbnRpZmllci4KICAgICAgICAvLyBGb3IgZXhhbXBsZTogYGludCBvcGVyYXRvcjxUPihmb28pID0+IDA7YAogICAgICAgIGxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm1ldGhvZERlY2xhcmF0aW9uKTsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlT3BlcmF0b3JOYW1lKHRva2VuLCBuZXh0KTsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHJldHVybiBlbnN1cmVJZGVudGlmaWVyKGJlZm9yZVRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5vcGVyYXRvck5hbWUpOwogICAgfSBlbHNlIGlmIChpc1VuYXJ5TWludXMobmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU9wZXJhdG9yTmFtZSh0b2tlbiwgbmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgLy8gU2Nhbm5lciByZXBvcnRzIGFuIGVycm9yIGZvciBgPT09YCBhbmQgYCE9PWAuCiAgICAgIGlmIChuZXh0LnR5cGUgIT0gVG9rZW5UeXBlLkVRX0VRX0VRICYmCiAgICAgICAgICBuZXh0LnR5cGUgIT0gVG9rZW5UeXBlLkJBTkdfRVFfRVEpIHsKICAgICAgICAvLyBUaGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGludmFsaWQgb3BlcmF0b3IgbmFtZS4KICAgICAgICAvLyBSZXBvcnQgdGhlIGVycm9yLCBhY2NlcHQgdGhlIGludmFsaWQgb3BlcmF0b3IgbmFtZSwgYW5kIG1vdmUgb24uCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBjb2Rlcy50ZW1wbGF0ZUludmFsaWRPcGVyYXRvcik7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZE9wZXJhdG9yTmFtZSh0b2tlbiwgbmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogIH0KCiAgVG9rZW4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24oYmVnaW5Ub2tlbik7CiAgICB0b2tlbiA9IHBhcnNlRm9ybWFsUGFyYW1ldGVyc1JlcXVpcmVkT3B0KHRva2VuLCBNZW1iZXJLaW5kLkxvY2FsKTsKICAgIHRva2VuID0gcGFyc2VBc3luY09wdEJvZHkodG9rZW4sIHRydWUsIGZhbHNlKTsKICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uRXhwcmVzc2lvbihiZWdpblRva2VuLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRnVuY3Rpb25MaXRlcmFsKAogICAgICBUb2tlbiBzdGFydCwKICAgICAgVG9rZW4gYmVmb3JlTmFtZSwKICAgICAgVG9rZW4gbmFtZSwKICAgICAgVHlwZUluZm8gdHlwZUluZm8sCiAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW0sCiAgICAgIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIGZvcm1hbHMgPSB0eXBlUGFyYW0ucGFyc2VWYXJpYWJsZXMobmFtZSwgdGhpcyk7CiAgICBsaXN0ZW5lci5iZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKHN0YXJ0Lm5leHQpOwogICAgdHlwZUluZm8ucGFyc2VUeXBlKHN0YXJ0LCB0aGlzKTsKICAgIHJldHVybiBwYXJzZU5hbWVkRnVuY3Rpb25SZXN0KGJlZm9yZU5hbWUsIHN0YXJ0Lm5leHQsIGZvcm1hbHMsIHRydWUpOwogIH0KCiAgLy8vIFBhcnNlcyB0aGUgcmVzdCBvZiBhIG5hbWVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHN0YXJ0aW5nIGZyb20gaXRzIFtuYW1lXQogIC8vLyBidXQgdGhlbiBza2lwcyBhbnkgdHlwZSBwYXJhbWV0ZXJzIGFuZCBjb250aW51ZSBwYXJzaW5nIGZyb20gW2Zvcm1hbHNdCiAgLy8vICh0aGUgZm9ybWFsIHBhcmFtZXRlcnMpLgogIC8vLwogIC8vLyBJZiBbaXNGdW5jdGlvbkV4cHJlc3Npb25dIGlzIHRydWUsIHRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgcmVzdCBvZiBuYW1lZAogIC8vLyBmdW5jdGlvbiBleHByZXNzaW9uIHdoaWNoIGlzbid0IGxlZ2FsIHN5bnRheCBpbiBEYXJ0LiAgVXNlZnVsIGZvcgogIC8vLyByZWNvdmVyaW5nIGZyb20gSmF2YXNjcmlwdCBjb2RlIGJlaW5nIHBhc3RlZCBpbnRvIGEgRGFydCBwcm9ncmFtLCBhcyBpdAogIC8vLyB3aWxsIGludGVycHJldCBgZnVuY3Rpb24gZm9vKCkge31gIGFzIGEgbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aXRoCiAgLy8vIHJldHVybiB0eXBlIGBmdW5jdGlvbmAgYW5kIG5hbWUgYGZvb2AuCiAgLy8vCiAgLy8vIFByZWNvbmRpdGlvbjogdGhlIHBhcnNlciBoYXMgcHJldmlvdXNseSBnZW5lcmF0ZWQgdGhlc2UgZXZlbnRzOgogIC8vLwogIC8vLyAtIFR5cGUgdmFyaWFibGVzLgogIC8vLyAtIGBiZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmAgaWYgW2lzRnVuY3Rpb25FeHByZXNzaW9uXSBpcyBmYWxzZSwKICAvLy8gICBvdGhlcndpc2UgYGJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25gLgogIC8vLyAtIFJldHVybiB0eXBlLgogIFRva2VuIHBhcnNlTmFtZWRGdW5jdGlvblJlc3QoCiAgICAgIFRva2VuIGJlZm9yZU5hbWUsIFRva2VuIGJlZ2luLCBUb2tlbiBmb3JtYWxzLCBib29sIGlzRnVuY3Rpb25FeHByZXNzaW9uKSB7CiAgICBUb2tlbiB0b2tlbiA9IGJlZm9yZU5hbWUubmV4dDsKICAgIGxpc3RlbmVyLmJlZ2luRnVuY3Rpb25OYW1lKHRva2VuKTsKICAgIHRva2VuID0KICAgICAgICBlbnN1cmVJZGVudGlmaWVyKGJlZm9yZU5hbWUsIElkZW50aWZpZXJDb250ZXh0LmxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbikKICAgICAgICAgICAgLm5leHQ7CiAgICBpZiAoaXNGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIGJlZm9yZU5hbWUubmV4dCwgY29kZXMubWVzc2FnZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIH0KICAgIGxpc3RlbmVyLmVuZEZ1bmN0aW9uTmFtZShiZWdpbiwgdG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdChmb3JtYWxzLCBNZW1iZXJLaW5kLkxvY2FsKTsKICAgIHRva2VuID0gcGFyc2VJbml0aWFsaXplcnNPcHQodG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUFzeW5jT3B0Qm9keSh0b2tlbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24sIGZhbHNlKTsKICAgIGlmIChpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICBsaXN0ZW5lci5lbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5lbmRMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24odG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlcyBhIGZ1bmN0aW9uIGJvZHkgb3B0aW9uYWxseSBwcmVjZWRlZCBieSBhbiBhc3luYyBtb2RpZmllciAoc2VlCiAgLy8vIFtwYXJzZUFzeW5jTW9kaWZpZXJPcHRdKS4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gYm90aCBleHByZXNzaW9uIGNvbnRleHQKICAvLy8gKHdoZW4gW29mRnVuY3Rpb25FeHByZXNzaW9uXSBpcyB0cnVlKSBhbmQgc3RhdGVtZW50IGNvbnRleHQuIEluIHN0YXRlbWVudAogIC8vLyBjb250ZXh0ICh3aGVuIFtvZkZ1bmN0aW9uRXhwcmVzc2lvbl0gaXMgZmFsc2UpLCBhbmQgaWYgdGhlIGZ1bmN0aW9uIGJvZHkKICAvLy8gaXMgb24gdGhlIGZvcm0gYD0+IGV4cHJlc3Npb25gLCBhIHRyYWlsaW5nIHNlbWljb2xvbiBpcyByZXF1aXJlZC4KICAvLy8KICAvLy8gSXQncyBhbiBlcnJvciBpZiB0aGVyZSdzIG5vIGZ1bmN0aW9uIGJvZHkgdW5sZXNzIFthbGxvd0Fic3RyYWN0XSBpcyB0cnVlLgogIFRva2VuIHBhcnNlQXN5bmNPcHRCb2R5KAogICAgICBUb2tlbiB0b2tlbiwgYm9vbCBvZkZ1bmN0aW9uRXhwcmVzc2lvbiwgYm9vbCBhbGxvd0Fic3RyYWN0KSB7CiAgICBBc3luY01vZGlmaWVyIHNhdmVkQXN5bmNNb2RpZmllciA9IGFzeW5jU3RhdGU7CiAgICB0b2tlbiA9IHBhcnNlQXN5bmNNb2RpZmllck9wdCh0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlRnVuY3Rpb25Cb2R5KHRva2VuLCBvZkZ1bmN0aW9uRXhwcmVzc2lvbiwgYWxsb3dBYnN0cmFjdCk7CiAgICBhc3luY1N0YXRlID0gc2F2ZWRBc3luY01vZGlmaWVyOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZShUb2tlbiB0b2tlbiwgW1R5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnXSkgewogICAgVG9rZW4gc3RhcnQgPQogICAgICAgIGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlKTsKICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3RhcnQpOwogICAgdG9rZW4gPSBwYXJzZVF1YWxpZmllZFJlc3RPcHQoCiAgICAgICAgc3RhcnQsIElkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uKTsKICAgIHR5cGVBcmcgPz89IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgVG9rZW4gcGVyaW9kID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgIHBlcmlvZCA9IHRva2VuLm5leHQ7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcihwZXJpb2QsCiAgICAgICAgICBJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lci5oYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKAogICAgICAgICAgdG9rZW4ubmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRDb25zdHJ1Y3RvclJlZmVyZW5jZShzdGFydCwgcGVyaW9kLCB0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc9JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSh0b2tlbik7CiAgICBUb2tlbiBlcXVhbHMgPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZSh0b2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KGVxdWFscywgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbiwgYm9vbCBpc0V4cHJlc3Npb24sIGJvb2wgYWxsb3dBYnN0cmFjdCkgewogICAgYXNzZXJ0KCFpc0V4cHJlc3Npb24pOwogICAgdG9rZW4gPSBza2lwQXN5bmNNb2RpZmllcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnbmF0aXZlJywgbmV4dCkpIHsKICAgICAgVG9rZW4gbmF0aXZlVG9rZW4gPSBuZXh0OwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogc2tpcCB0aGUgbmF0aXZlIGNsYXVzZSByYXRoZXIgdGhhbiBwYXJzaW5nIGl0CiAgICAgIC8vIG9yIHJlbW92ZSB0aGlzIGNvZGUgY29tcGxldGVseSB3aGVuIHdlIHJlbW92ZSBzdXBwb3J0CiAgICAgIC8vIGZvciB0aGUgYG5hdGl2ZWAgY2xhdXNlLgogICAgICB0b2tlbiA9IHBhcnNlTmF0aXZlQ2xhdXNlKHRva2VuKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChuYXRpdmVUb2tlbiwgbmV4dCk7CiAgICAgICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZChuYXRpdmVUb2tlbiwgbmV4dCk7CiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byByZWNvdmVyIGFuZCBza2lwIGZ1bmN0aW9uIGJvZHkKICAgIH0KICAgIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnOycpKSB7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgaWYgKCFhbGxvd0Fic3RyYWN0KSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgY29kZXMubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlTm9GdW5jdGlvbkJvZHkodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc9PicpKSB7CiAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpOwogICAgICAvLyBUaGVyZSBvdWdodCB0byBiZSBhIHNlbWljb2xvbiBmb2xsb3dpbmcgdGhlIGV4cHJlc3Npb24sIGJ1dCB3ZSBjaGVjawogICAgICAvLyBiZWZvcmUgYWR2YW5jaW5nIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSBtZXRob2QKICAgICAgLy8gW3BhcnNlRnVuY3Rpb25Cb2R5XSByZWNvdmVycyB3aGVuIHRoZSBzZW1pY29sb24gaXMgbWlzc2luZy4KICAgICAgaWYgKG9wdGlvbmFsKCc7JywgdG9rZW4ubmV4dCkpIHsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgdHJ1ZSk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJz0nKSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIGNvZGVzLm1lc3NhZ2VFeHBlY3RlZEJvZHkpOwogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgIC8vIFRoZXJlIG91Z2h0IHRvIGJlIGEgc2VtaWNvbG9uIGZvbGxvd2luZyB0aGUgZXhwcmVzc2lvbiwgYnV0IHdlIGNoZWNrCiAgICAgIC8vIGJlZm9yZSBhZHZhbmNpbmcgaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIG1ldGhvZAogICAgICAvLyBbcGFyc2VGdW5jdGlvbkJvZHldIHJlY292ZXJzIHdoZW4gdGhlIHNlbWljb2xvbiBpcyBtaXNzaW5nLgogICAgICBpZiAob3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBsaXN0ZW5lci5oYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkKHRva2VuLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gc2tpcEJsb2NrKHRva2VuKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgZmFsc2UpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlcyBhIGZ1bmN0aW9uIGJvZHkuICBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIGJvdGggZXhwcmVzc2lvbiBjb250ZXh0CiAgLy8vICh3aGVuIFtvZkZ1bmN0aW9uRXhwcmVzc2lvbl0gaXMgdHJ1ZSkgYW5kIHN0YXRlbWVudCBjb250ZXh0LiBJbiBzdGF0ZW1lbnQKICAvLy8gY29udGV4dCAod2hlbiBbb2ZGdW5jdGlvbkV4cHJlc3Npb25dIGlzIGZhbHNlKSwgYW5kIGlmIHRoZSBmdW5jdGlvbiBib2R5CiAgLy8vIGlzIG9uIHRoZSBmb3JtIGA9PiBleHByZXNzaW9uYCwgYSB0cmFpbGluZyBzZW1pY29sb24gaXMgcmVxdWlyZWQuCiAgLy8vCiAgLy8vIEl0J3MgYW4gZXJyb3IgaWYgdGhlcmUncyBubyBmdW5jdGlvbiBib2R5IHVubGVzcyBbYWxsb3dBYnN0cmFjdF0gaXMgdHJ1ZS4KICBUb2tlbiBwYXJzZUZ1bmN0aW9uQm9keSgKICAgICAgVG9rZW4gdG9rZW4sIGJvb2wgb2ZGdW5jdGlvbkV4cHJlc3Npb24sIGJvb2wgYWxsb3dBYnN0cmFjdCkgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ25hdGl2ZScsIG5leHQpKSB7CiAgICAgIFRva2VuIG5hdGl2ZVRva2VuID0gbmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZU5hdGl2ZUNsYXVzZSh0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keShuYXRpdmVUb2tlbiwgbmV4dCk7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlRXh0ZXJuYWxNZXRob2RXaXRoQm9keSk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQobmF0aXZlVG9rZW4sIG5leHQpOwogICAgICAvLyBJZ25vcmUgdGhlIG5hdGl2ZSBrZXl3b3JkIGFuZCBmYWxsIHRocm91Z2ggdG8gcGFyc2UgdGhlIGJvZHkKICAgIH0KICAgIGlmIChvcHRpb25hbCgnOycsIG5leHQpKSB7CiAgICAgIGlmICghYWxsb3dBYnN0cmFjdCkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgIH0KICAgICAgbGlzdGVuZXIuaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkobmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnPT4nLCBuZXh0KSkgewogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG5leHQsIG9mRnVuY3Rpb25FeHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz0nLCBuZXh0KSkgewogICAgICAvLyBSZWNvdmVyIGZyb20gYSBiYWQgZmFjdG9yeSBtZXRob2QuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZUV4cGVjdGVkQm9keSk7CiAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRUb2tlbigKICAgICAgICAgIG5leHQsIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRlVOQ1RJT04sIG5leHQubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgIFRva2VuIGJlZ2luID0gbmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24obmV4dCk7CiAgICAgIGlmICghb2ZGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShiZWdpbiwgdG9rZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIG51bGwpOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIFRva2VuIGJlZ2luID0gbmV4dDsKICAgIGludCBzdGF0ZW1lbnRDb3VudCA9IDA7CiAgICBpZiAoIW9wdGlvbmFsKCd7JywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgLy8gSWYgYHJldHVybmAgdXNlZCBpbnN0ZWFkIG9mIGA9PmAsIHRoZW4gcmVwb3J0IGFuIGVycm9yIGFuZCBjb250aW51ZQogICAgICBpZiAob3B0aW9uYWwoJ3JldHVybicsIG5leHQpKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlRXhwZWN0ZWRCb2R5KTsKICAgICAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICAgIG5leHQsIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuRlVOQ1RJT04sIG5leHQubmV4dC5jaGFyT2Zmc2V0KSk7CiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShuZXh0LCBvZkZ1bmN0aW9uRXhwcmVzc2lvbik7CiAgICAgIH0KICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzdHJheSBzaW1wbGUgaWRlbnRpZmllciBpbiB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbgogICAgICAvLyBiZWNhdXNlIHRoZSB1c2VyIGlzIHR5cGluZyAoZS5nLiBgKCkgYXN5ID0+IG51bGw7YCkKICAgICAgLy8gdGhlbiByZXBvcnQgYW4gZXJyb3IsIHNraXAgdGhlIHRva2VuLCBhbmQgY29udGludWUgcGFyc2luZy4KICAgICAgaWYgKG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyICYmIG9wdGlvbmFsKCc9PicsIG5leHQubmV4dCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGNvZGVzLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG5leHQubmV4dCwgb2ZGdW5jdGlvbkV4cHJlc3Npb24pOwogICAgICB9CiAgICAgIGlmIChuZXh0LmlzS2V5d29yZE9ySWRlbnRpZmllciAmJiBvcHRpb25hbCgneycsIG5leHQubmV4dCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGNvZGVzLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgYmVnaW4gPSBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcGFyc2UgdGhlIGJsb2NrLgogICAgICB9IGVsc2UgewogICAgICAgIHRva2VuID0gZW5zdXJlQmxvY2sodG9rZW4sIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRGdW5jdGlvbkJvZHksIG51bGwpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRGdW5jdGlvbkJvZHkodG9rZW4pOwogICAgICAgIHJldHVybiB0b2tlbi5lbmRHcm91cDsKICAgICAgfQogICAgfQoKICAgIExvb3BTdGF0ZSBzYXZlZExvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIGxvb3BTdGF0ZSA9IExvb3BTdGF0ZS5PdXRzaWRlTG9vcDsKICAgIGxpc3RlbmVyLmJlZ2luQmxvY2tGdW5jdGlvbkJvZHkoYmVnaW4pOwogICAgdG9rZW4gPSBuZXh0OwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCB0b2tlbi5uZXh0KSkgewogICAgICBUb2tlbiBzdGFydFRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICAgIGlmIChpZGVudGljYWwodG9rZW4ubmV4dCwgc3RhcnRUb2tlbikpIHsKICAgICAgICAvLyBObyBwcm9ncmVzcyB3YXMgbWFkZSwgc28gd2UgcmVwb3J0IHRoZSBjdXJyZW50IHRva2VuIGFzIGJlaW5nIGludmFsaWQKICAgICAgICAvLyBhbmQgbW92ZSBmb3J3YXJkLgogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKHRva2VuKSk7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgICsrc3RhdGVtZW50Q291bnQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNFb2YgfHwgb3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kQmxvY2tGdW5jdGlvbkJvZHkoc3RhdGVtZW50Q291bnQsIGJlZ2luLCB0b2tlbik7CiAgICBsb29wU3RhdGUgPSBzYXZlZExvb3BTdGF0ZTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbiwgYm9vbCBvZkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCc9PicsIHRva2VuKSk7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgaWYgKCFvZkZ1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIHRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUV4cHJlc3Npb25GdW5jdGlvbkJvZHkoYmVnaW4sIG51bGwpOwogICAgfQogICAgaWYgKGluR2VuZXJhdG9yKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUludmFsaWRTdGF0ZW1lbnQoCiAgICAgICAgICBiZWdpbiwgY29kZXMubWVzc2FnZUdlbmVyYXRvclJldHVybnNWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBza2lwQXN5bmNNb2RpZmllcihUb2tlbiB0b2tlbikgewogICAgU3RyaW5nIHZhbHVlID0gdG9rZW4ubmV4dC5zdHJpbmdWYWx1ZTsKICAgIGlmIChpZGVudGljYWwodmFsdWUsICdhc3luYycpKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwoKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJyonKSkgewogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdzeW5jJykpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB2YWx1ZSA9IHRva2VuLm5leHQuc3RyaW5nVmFsdWU7CgogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnKicpKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUFzeW5jTW9kaWZpZXJPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGFzeW5jOwogICAgVG9rZW4gc3RhcjsKICAgIGFzeW5jU3RhdGUgPSBBc3luY01vZGlmaWVyLlN5bmM7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnYXN5bmMnLCBuZXh0KSkgewogICAgICBhc3luYyA9IHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgnKicsIG5leHQpKSB7CiAgICAgICAgYXN5bmNTdGF0ZSA9IEFzeW5jTW9kaWZpZXIuQXN5bmNTdGFyOwogICAgICAgIHN0YXIgPSBuZXh0OwogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3luY1N0YXRlID0gQXN5bmNNb2RpZmllci5Bc3luYzsKICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnc3luYycsIG5leHQpKSB7CiAgICAgIGFzeW5jID0gdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcqJywgbmV4dCkpIHsKICAgICAgICBhc3luY1N0YXRlID0gQXN5bmNNb2RpZmllci5TeW5jU3RhcjsKICAgICAgICBzdGFyID0gbmV4dDsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhc3luYywgY29kZXMubWVzc2FnZUludmFsaWRTeW5jTW9kaWZpZXIpOwogICAgICB9CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVBc3luY01vZGlmaWVyKGFzeW5jLCBzdGFyKTsKICAgIGlmICghaW5QbGFpblN5bmMgJiYgb3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLm5leHQsIGNvZGVzLm1lc3NhZ2VBYnN0cmFjdE5vdFN5bmMpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgaW50IHN0YXRlbWVudERlcHRoID0gMDsKICBUb2tlbiBwYXJzZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlbWVudERlcHRoKysgPiA1MDApIHsKICAgICAgLy8gVGhpcyBoYXBwZW5zIGZvciBkZWdlbmVyYXRlIHByb2dyYW1zLCBmb3IgZXhhbXBsZSwgYSBsb3Qgb2YgbmVzdGVkCiAgICAgIC8vIGlmLXN0YXRlbWVudHMuIFRoZSBsYW5ndWFnZSB0ZXN0IGRlZXBfbmVzdGluZzJfbmVnYXRpdmVfdGVzdCwgZm9yCiAgICAgIC8vIGV4YW1wbGUsIHByb3Zva2VzIHRoaXMuCiAgICAgIHJldHVybiByZWNvdmVyRnJvbVN0YWNrT3ZlcmZsb3codG9rZW4pOwogICAgfQogICAgVG9rZW4gcmVzdWx0ID0gcGFyc2VTdGF0ZW1lbnRYKHRva2VuKTsKICAgIHN0YXRlbWVudERlcHRoLS07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgVG9rZW4gcGFyc2VTdGF0ZW1lbnRYKFRva2VuIHRva2VuKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRva2VuLm5leHQua2luZCwgSURFTlRJRklFUl9UT0tFTikpIHsKICAgICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dC5uZXh0KSkgewogICAgICAgIHJldHVybiBwYXJzZUxhYmVsZWRTdGF0ZW1lbnQodG9rZW4pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnMoCiAgICAgICAgICB0b2tlbiwgdG9rZW4sIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKICAgIH0KICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHRva2VuLm5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAneycpKSB7CiAgICAgIC8vIFRoZSBzY2FubmVyIGVuc3VyZXMgdGhhdCBge2AgYWx3YXlzIGhhcyBhIGNsb3NpbmcgYH1gLgogICAgICByZXR1cm4gcGFyc2VCbG9jayh0b2tlbiwgQmxvY2tLaW5kLnN0YXRlbWVudCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3JldHVybicpKSB7CiAgICAgIHJldHVybiBwYXJzZVJldHVyblN0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3ZhcicpIHx8IGlkZW50aWNhbCh2YWx1ZSwgJ2ZpbmFsJykpIHsKICAgICAgVG9rZW4gdmFyT3JGaW5hbCA9IHRva2VuLm5leHQ7CiAgICAgIGlmICghaXNNb2RpZmllcih2YXJPckZpbmFsLm5leHQpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25BZnRlck1vZGlmaWVycygKICAgICAgICAgICAgdmFyT3JGaW5hbCwgdG9rZW4sIG51bGwsIHZhck9yRmluYWwsIG51bGwsIGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbih0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2lmJykpIHsKICAgICAgcmV0dXJuIHBhcnNlSWZTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdhd2FpdCcpICYmIG9wdGlvbmFsKCdmb3InLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgIHJldHVybiBwYXJzZUZvclN0YXRlbWVudCh0b2tlbi5uZXh0LCB0b2tlbi5uZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZm9yJykpIHsKICAgICAgcmV0dXJuIHBhcnNlRm9yU3RhdGVtZW50KHRva2VuLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAncmV0aHJvdycpKSB7CiAgICAgIHJldHVybiBwYXJzZVJldGhyb3dTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd3aGlsZScpKSB7CiAgICAgIHJldHVybiBwYXJzZVdoaWxlU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZG8nKSkgewogICAgICByZXR1cm4gcGFyc2VEb1doaWxlU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAndHJ5JykpIHsKICAgICAgcmV0dXJuIHBhcnNlVHJ5U3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnc3dpdGNoJykpIHsKICAgICAgcmV0dXJuIHBhcnNlU3dpdGNoU3RhdGVtZW50KHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnYnJlYWsnKSkgewogICAgICByZXR1cm4gcGFyc2VCcmVha1N0YXRlbWVudCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2NvbnRpbnVlJykpIHsKICAgICAgcmV0dXJuIHBhcnNlQ29udGludWVTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdhc3NlcnQnKSkgewogICAgICByZXR1cm4gcGFyc2VBc3NlcnRTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICc7JykpIHsKICAgICAgcmV0dXJuIHBhcnNlRW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICd5aWVsZCcpKSB7CiAgICAgIHN3aXRjaCAoYXN5bmNTdGF0ZSkgewogICAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5TeW5jOgogICAgICAgICAgaWYgKG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dC5uZXh0KSkgewogICAgICAgICAgICByZXR1cm4gcGFyc2VMYWJlbGVkU3RhdGVtZW50KHRva2VuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKHRva2VuKTsKCiAgICAgICAgY2FzZSBBc3luY01vZGlmaWVyLlN5bmNTdGFyOgogICAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5Bc3luY1N0YXI6CiAgICAgICAgICByZXR1cm4gcGFyc2VZaWVsZFN0YXRlbWVudCh0b2tlbik7CgogICAgICAgIGNhc2UgQXN5bmNNb2RpZmllci5Bc3luYzoKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4ubmV4dCwgY29kZXMubWVzc2FnZVlpZWxkTm90R2VuZXJhdG9yKTsKICAgICAgICAgIHJldHVybiBwYXJzZVlpZWxkU3RhdGVtZW50KHRva2VuKTsKICAgICAgfQogICAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gYXN5bmNTdGF0ZTogJyRhc3luY1N0YXRlJy4iOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdjb25zdCcpKSB7CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckNvbnN0RGVjbGFyYXRpb24odG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdhd2FpdCcpKSB7CiAgICAgIGlmIChpblBsYWluU3luYykgewogICAgICAgIGlmICghbG9va3NMaWtlQXdhaXRFeHByZXNzaW9uKHRva2VuKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwogICAgICAgIH0KICAgICAgICAvLyBSZWNvdmVyeTogbG9va3MgbGlrZSBhbiBleHByZXNzaW9uIHByZWNlZGVkIGJ5IGBhd2FpdGAKICAgICAgICAvLyBidXQgbm90IGluc2lkZSBhbiBhc3luYyBjb250ZXh0LgogICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQKICAgICAgICAvLyBhbmQgcGFyc2VBd2FpdEV4cHJlc3Npb24gd2lsbCByZXBvcnQgdGhlIGVycm9yLgogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQodG9rZW4pOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICdzZXQnKSAmJiB0b2tlbi5uZXh0Lm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBpbnZhbGlkIHVzZSBvZiBgc2V0YAogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgdG9rZW4ubmV4dCwgY29kZXMudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICByZXR1cm4gcGFyc2VTdGF0ZW1lbnRYKHRva2VuLm5leHQpOwogICAgfSBlbHNlIGlmICh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICBpZiAob3B0aW9uYWwoJzonLCB0b2tlbi5uZXh0Lm5leHQpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTGFiZWxlZFN0YXRlbWVudCh0b2tlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24odG9rZW4pOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyB5aWVsZFN0YXRlbWVudDoKICAvLy8gICAneWllbGQnIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlWWllbGRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd5aWVsZCcsIHRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbllpZWxkU3RhdGVtZW50KGJlZ2luKTsKICAgIFRva2VuIHN0YXJUb2tlbjsKICAgIGlmIChvcHRpb25hbCgnKicsIHRva2VuLm5leHQpKSB7CiAgICAgIHN0YXJUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZFlpZWxkU3RhdGVtZW50KGJlZ2luLCBzdGFyVG9rZW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gcmV0dXJuU3RhdGVtZW50OgogIC8vLyAgICdyZXR1cm4nIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUmV0dXJuU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgncmV0dXJuJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luUmV0dXJuU3RhdGVtZW50KGJlZ2luKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCc7JywgbmV4dCkpIHsKICAgICAgbGlzdGVuZXIuZW5kUmV0dXJuU3RhdGVtZW50KGZhbHNlLCBiZWdpbiwgbmV4dCk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuZW5kUmV0dXJuU3RhdGVtZW50KHRydWUsIGJlZ2luLCB0b2tlbik7CiAgICBpZiAoaW5HZW5lcmF0b3IpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFN0YXRlbWVudCgKICAgICAgICAgIGJlZ2luLCBjb2Rlcy5tZXNzYWdlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gbGFiZWw6CiAgLy8vICAgaWRlbnRpZmllciAnOicKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxhYmVsKFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQodG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpOwogICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5sYWJlbERlY2xhcmF0aW9uKS5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxhYmVsKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3RhdGVtZW50OgogIC8vLyAgIGxhYmVsKiBub25MYWJlbGxlZFN0YXRlbWVudAogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGFiZWxlZFN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQobmV4dC5pc0lkZW50aWZpZXIpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCc6JywgbmV4dC5uZXh0KSk7CiAgICBpbnQgbGFiZWxDb3VudCA9IDA7CiAgICBkbyB7CiAgICAgIHRva2VuID0gcGFyc2VMYWJlbCh0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBsYWJlbENvdW50Kys7CiAgICB9IHdoaWxlIChuZXh0LmlzSWRlbnRpZmllciAmJiBvcHRpb25hbCgnOicsIG5leHQubmV4dCkpOwogICAgbGlzdGVuZXIuYmVnaW5MYWJlbGVkU3RhdGVtZW50KG5leHQsIGxhYmVsQ291bnQpOwogICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICBsaXN0ZW5lci5lbmRMYWJlbGVkU3RhdGVtZW50KGxhYmVsQ291bnQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBleHByZXNzaW9uU3RhdGVtZW50OgogIC8vLyAgIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIC8vLwogIC8vLyBOb3RlOiBUaGlzIG1ldGhvZCBjYW4gZmFpbCB0byBtYWtlIHByb2dyZXNzLiBJZiB0aGVyZSBpcyBuZWl0aGVyIGFuCiAgLy8vIGV4cHJlc3Npb24gbm9yIGEgc2VtaS1jb2xvbiwgdGhlbiBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIGFuZCBzeW50aGV0aWMKICAvLy8gc2VtaWNvbG9uIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIFt0b2tlbl0gYW5kIHRoZSBzZW1pY29sb24gd2lsbCBiZQogIC8vLyByZXR1cm5lZC4KICBUb2tlbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgdGhlIHN0YXJ0IG9mIGEgdmFsaWQKICAgIC8vIGV4cHJlc3Npb24sIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkbid0IHJlcG9ydCB0aGF0IHdlIGhhdmUgYW4gZXhwcmVzc2lvbgogICAgLy8gc3RhdGVtZW50LgogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBpbnQgZXhwcmVzc2lvbkRlcHRoID0gMDsKICBUb2tlbiBwYXJzZUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGlmIChleHByZXNzaW9uRGVwdGgrKyA+IDUwMCkgewogICAgICAvLyBUaGlzIGhhcHBlbnMgaW4gZGVnZW5lcmF0ZSBwcm9ncmFtcywgZm9yIGV4YW1wbGUsIHdpdGggYSBsb3Qgb2YgbmVzdGVkCiAgICAgIC8vIGxpc3QgbGl0ZXJhbHMuIFRoaXMgaXMgcHJvdm9rZWQgYnksIGZvciBleGFtcGxlLCB0aGUgbGFuZ3VhZ2UgdGVzdAogICAgICAvLyBkZWVwX25lc3RpbmcxX25lZ2F0aXZlX3Rlc3QuCiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGNvZGVzLm1lc3NhZ2VTdGFja092ZXJmbG93KTsKCiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIFRva2VuIGVuZEdyb3VwID0gbmV4dC5lbmRHcm91cDsKICAgICAgaWYgKGVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgICB3aGlsZSAoIW5leHQuaXNFb2YgJiYgIWlkZW50aWNhbChuZXh0LCBlbmRHcm91cCkpIHsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoIWlzT25lT2YobmV4dCwgY29uc3QgWycpJywgJ10nLCAnfScsICc7J10pKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCF0b2tlbi5pc0VvZikgewogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQuZXhwcmVzc2lvbik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gb3B0aW9uYWwoJ3Rocm93JywgdG9rZW4ubmV4dCkKICAgICAgICAgID8gcGFyc2VUaHJvd0V4cHJlc3Npb24odG9rZW4sIHRydWUpCiAgICAgICAgICA6IHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24odG9rZW4sIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgdHJ1ZSk7CiAgICB9CiAgICBleHByZXNzaW9uRGVwdGgtLTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gb3B0aW9uYWwoJ3Rocm93JywgdG9rZW4ubmV4dCkKICAgICAgICA/IHBhcnNlVGhyb3dFeHByZXNzaW9uKHRva2VuLCBmYWxzZSkKICAgICAgICA6IHBhcnNlUHJlY2VkZW5jZUV4cHJlc3Npb24odG9rZW4sIEFTU0lHTk1FTlRfUFJFQ0VERU5DRSwgZmFsc2UpOwogIH0KCiAgVG9rZW4gcGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb25SZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBxdWVzdGlvbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHF1ZXN0aW9uKSk7CiAgICBsaXN0ZW5lci5iZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbih0b2tlbik7CiAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKHRva2VuKTsKICAgIFRva2VuIGNvbG9uID0gZW5zdXJlQ29sb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKTsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUoY29sb24pOwogICAgbGlzdGVuZXIuZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKHF1ZXN0aW9uLCBjb2xvbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICBUb2tlbiB0b2tlbiwgaW50IHByZWNlZGVuY2UsIGJvb2wgYWxsb3dDYXNjYWRlcykgewogICAgYXNzZXJ0KHByZWNlZGVuY2UgPj0gMSk7CiAgICBhc3NlcnQocHJlY2VkZW5jZSA8PSBTRUxFQ1RPUl9QUkVDRURFTkNFKTsKICAgIHRva2VuID0gcGFyc2VVbmFyeUV4cHJlc3Npb24odG9rZW4sIGFsbG93Q2FzY2FkZXMpOwogICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcgPSBjb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgIC8vIEZvciBleGFtcGxlIGEoYik8VD4oYyksIHdoZXJlIHRva2VuIGlzIGJlZm9yZSAnPCcuCiAgICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgIH0KICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgVG9rZW5UeXBlIHR5cGUgPSBuZXh0LnR5cGU7CiAgICBpbnQgdG9rZW5MZXZlbCA9IF9jb21wdXRlUHJlY2VkZW5jZShuZXh0KTsKICAgIGZvciAoaW50IGxldmVsID0gdG9rZW5MZXZlbDsgbGV2ZWwgPj0gcHJlY2VkZW5jZTsgLS1sZXZlbCkgewogICAgICBpbnQgbGFzdEJpbmFyeUV4cHJlc3Npb25MZXZlbCA9IC0xOwogICAgICBUb2tlbiBsYXN0Q2FzY2FkZTsKICAgICAgd2hpbGUgKGlkZW50aWNhbCh0b2tlbkxldmVsLCBsZXZlbCkpIHsKICAgICAgICBUb2tlbiBvcGVyYXRvciA9IG5leHQ7CiAgICAgICAgaWYgKGlkZW50aWNhbCh0b2tlbkxldmVsLCBDQVNDQURFX1BSRUNFREVOQ0UpKSB7CiAgICAgICAgICBpZiAoIWFsbG93Q2FzY2FkZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgfSBlbHNlIGlmIChsYXN0Q2FzY2FkZSAhPSBudWxsICYmIG9wdGlvbmFsKCc/Li4nLCBuZXh0KSkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgbmV4dCwgY29kZXMubWVzc2FnZU51bGxBd2FyZUNhc2NhZGVPdXRPZk9yZGVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3RDYXNjYWRlID0gbmV4dDsKICAgICAgICAgIHRva2VuID0gcGFyc2VDYXNjYWRlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodG9rZW5MZXZlbCwgQVNTSUdOTUVOVF9QUkVDRURFTkNFKSkgewogICAgICAgICAgLy8gUmlnaHQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIHNhbWUgcHJlY2VkZW5jZQogICAgICAgICAgLy8gbGV2ZWwuCiAgICAgICAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICAgIHRva2VuID0gb3B0aW9uYWwoJ3Rocm93JywgbmV4dC5uZXh0KQogICAgICAgICAgICAgID8gcGFyc2VUaHJvd0V4cHJlc3Npb24obmV4dCwgZmFsc2UpCiAgICAgICAgICAgICAgOiBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKG5leHQsIGxldmVsLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKG9wZXJhdG9yKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0b2tlbkxldmVsLCBQT1NURklYX1BSRUNFREVOQ0UpKSB7CiAgICAgICAgICBpZiAoKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuUExVU19QTFVTKSkgfHwKICAgICAgICAgICAgICAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5NSU5VU19NSU5VUykpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuLm5leHQpOwogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuQkFORykpIHsKICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24obmV4dCk7CiAgICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0b2tlbkxldmVsLCBTRUxFQ1RPUl9QUkVDRURFTkNFKSkgewogICAgICAgICAgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuUEVSSU9EKSB8fAogICAgICAgICAgICAgIGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9EKSkgewogICAgICAgICAgICAvLyBMZWZ0IGFzc29jaWF0aXZlLCBzbyB3ZSByZWN1cnNlIGF0IHRoZSBuZXh0IGhpZ2hlciBwcmVjZWRlbmNlCiAgICAgICAgICAgIC8vIGxldmVsLiBIb3dldmVyLCBTRUxFQ1RPUl9QUkVDRURFTkNFIGlzIHRoZSBoaWdoZXN0IGxldmVsLCBzbyB3ZQogICAgICAgICAgICAvLyBzaG91bGQganVzdCBjYWxsIFtwYXJzZVVuYXJ5RXhwcmVzc2lvbl0gZGlyZWN0bHkuIEhvd2V2ZXIsIGEKICAgICAgICAgICAgLy8gdW5hcnkgZXhwcmVzc2lvbiBpc24ndCBsZWdhbCBhZnRlciBhIHBlcmlvZCwgc28gd2UgY2FsbAogICAgICAgICAgICAvLyBbcGFyc2VQcmltYXJ5XSBpbnN0ZWFkLgogICAgICAgICAgICB0b2tlbiA9IHBhcnNlUHJpbWFyeSgKICAgICAgICAgICAgICAgIHRva2VuLm5leHQsIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25Db250aW51YXRpb24pOwogICAgICAgICAgICBsaXN0ZW5lci5lbmRCaW5hcnlFeHByZXNzaW9uKG9wZXJhdG9yKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5PUEVOX1BBUkVOKSB8fAogICAgICAgICAgICAgIGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuT1BFTl9TUVVBUkVfQlJBQ0tFVCkgfHwKICAgICAgICAgICAgICBpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLlFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUKSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRPckluZGV4U3Rhcih0b2tlbiwgdHlwZUFyZyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuSU5ERVgpKSB7CiAgICAgICAgICAgIEJlZ2luVG9rZW4gcmVwbGFjZW1lbnQgPSBsaW5rKAogICAgICAgICAgICAgICAgbmV3IEJlZ2luVG9rZW4oVG9rZW5UeXBlLk9QRU5fU1FVQVJFX0JSQUNLRVQsIG5leHQuY2hhck9mZnNldCwKICAgICAgICAgICAgICAgICAgICBuZXh0LnByZWNlZGluZ0NvbW1lbnRzKSwKICAgICAgICAgICAgICAgIG5ldyBUb2tlbihUb2tlblR5cGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQsIG5leHQuY2hhck9mZnNldCArIDEpKTsKICAgICAgICAgICAgcmV3cml0ZXIucmVwbGFjZVRva2VuRm9sbG93aW5nKHRva2VuLCByZXBsYWNlbWVudCk7CiAgICAgICAgICAgIHJlcGxhY2VtZW50LmVuZFRva2VuID0gcmVwbGFjZW1lbnQubmV4dDsKICAgICAgICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXIodG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpOwogICAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLkJBTkcpKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKHRva2VuLm5leHQpOwogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICAgICAgdG9rZW4ubmV4dCwgY29kZXMudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodHlwZSwgVG9rZW5UeXBlLklTKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUlzT3BlcmF0b3JSZXN0KHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuQVMpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlQXNPcGVyYXRvclJlc3QodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHR5cGUsIFRva2VuVHlwZS5RVUVTVElPTikpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb25SZXN0KHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGxldmVsID09IEVRVUFMSVRZX1BSRUNFREVOQ0UgfHwgbGV2ZWwgPT0gUkVMQVRJT05BTF9QUkVDRURFTkNFKSB7CiAgICAgICAgICAgIC8vIFdlIGRvbid0IGFsbG93IChhID09IGIgPT0gYykgb3IgKGEgPCBiIDwgYykuCiAgICAgICAgICAgIGlmIChsYXN0QmluYXJ5RXhwcmVzc2lvbkxldmVsID09IGxldmVsKSB7CiAgICAgICAgICAgICAgLy8gUmVwb3J0IGFuIGVycm9yLCB0aGVuIGNvbnRpbnVlIHBhcnNpbmcgYXMgaWYgaXQgaXMgbGVnYWwuCiAgICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgICAgbmV4dCwgY29kZXMubWVzc2FnZUVxdWFsaXR5Q2Fubm90QmVFcXVhbGl0eU9wZXJhbmQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFNldCBhIGZsYWcgdG8gY2F0Y2ggc3Vic2VxdWVudCBiaW5hcnkgZXhwcmVzc2lvbnMgb2YgdGhpcyB0eXBlLgogICAgICAgICAgICAgIGxhc3RCaW5hcnlFeHByZXNzaW9uTGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIuYmVnaW5CaW5hcnlFeHByZXNzaW9uKG5leHQpOwogICAgICAgICAgLy8gTGVmdCBhc3NvY2lhdGl2ZSwgc28gd2UgcmVjdXJzZSBhdCB0aGUgbmV4dCBoaWdoZXIKICAgICAgICAgIC8vIHByZWNlZGVuY2UgbGV2ZWwuCiAgICAgICAgICB0b2tlbiA9CiAgICAgICAgICAgICAgcGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbih0b2tlbi5uZXh0LCBsZXZlbCArIDEsIGFsbG93Q2FzY2FkZXMpOwogICAgICAgICAgbGlzdGVuZXIuZW5kQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgICAgfQogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIHR5cGUgPSBuZXh0LnR5cGU7CiAgICAgICAgdG9rZW5MZXZlbCA9IF9jb21wdXRlUHJlY2VkZW5jZShuZXh0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgaW50IF9jb21wdXRlUHJlY2VkZW5jZShUb2tlbiB0b2tlbikgewogICAgVG9rZW5UeXBlIHR5cGUgPSB0b2tlbi50eXBlOwogICAgaWYgKGlkZW50aWNhbCh0eXBlLCBUb2tlblR5cGUuQkFORykpIHsKICAgICAgLy8gVGhlICchJyBoYXMgcHJlZml4IHByZWNlZGVuY2UgYnV0IGhlcmUgaXQncyBiZWluZyB1c2VkIGFzIGEKICAgICAgLy8gcG9zdGZpeCBvcGVyYXRvciB0byBhc3NlcnQgdGhlIGV4cHJlc3Npb24gaGFzIGEgbm9uLW51bGwgdmFsdWUuCiAgICAgIFRva2VuVHlwZSBuZXh0VHlwZSA9IHRva2VuLm5leHQudHlwZTsKICAgICAgaWYgKGlkZW50aWNhbChuZXh0VHlwZSwgVG9rZW5UeXBlLlBFUklPRCkgfHwKICAgICAgICAgIGlkZW50aWNhbChuZXh0VHlwZSwgVG9rZW5UeXBlLk9QRU5fUEFSRU4pIHx8CiAgICAgICAgICBpZGVudGljYWwobmV4dFR5cGUsIFRva2VuVHlwZS5PUEVOX1NRVUFSRV9CUkFDS0VUKSB8fAogICAgICAgICAgaWRlbnRpY2FsKG5leHRUeXBlLCBUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9EKSB8fAogICAgICAgICAgaWRlbnRpY2FsKG5leHRUeXBlLCBUb2tlblR5cGUuUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVQpKSB7CiAgICAgICAgcmV0dXJuIFNFTEVDVE9SX1BSRUNFREVOQ0U7CiAgICAgIH0KICAgICAgcmV0dXJuIFBPU1RGSVhfUFJFQ0VERU5DRTsKICAgIH0KICAgIHJldHVybiB0eXBlLnByZWNlZGVuY2U7CiAgfQoKICBUb2tlbiBwYXJzZUNhc2NhZGVFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBjYXNjYWRlT3BlcmF0b3IgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJy4uJywgY2FzY2FkZU9wZXJhdG9yKSB8fCBvcHRpb25hbCgnPy4uJywgY2FzY2FkZU9wZXJhdG9yKSk7CiAgICBsaXN0ZW5lci5iZWdpbkNhc2NhZGUoY2FzY2FkZU9wZXJhdG9yKTsKICAgIGlmIChvcHRpb25hbCgnWycsIHRva2VuLm5leHQpKSB7CiAgICAgIHRva2VuID0gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKHRva2VuLCBub1R5cGVQYXJhbU9yQXJnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gcGFyc2VTZW5kKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uKTsKICAgICAgbGlzdGVuZXIuZW5kQmluYXJ5RXhwcmVzc2lvbihjYXNjYWRlT3BlcmF0b3IpOwogICAgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBtYXJrOwogICAgZG8gewogICAgICBtYXJrID0gdG9rZW47CiAgICAgIGlmIChvcHRpb25hbCgnLicsIG5leHQpIHx8IG9wdGlvbmFsKCc/LicsIG5leHQpKSB7CiAgICAgICAgVG9rZW4gcGVyaW9kID0gbmV4dDsKICAgICAgICB0b2tlbiA9IHBhcnNlU2VuZChuZXh0LCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uQ29udGludWF0aW9uKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBsaXN0ZW5lci5lbmRCaW5hcnlFeHByZXNzaW9uKHBlcmlvZCk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJyEnLCBuZXh0KSkgewogICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKG5leHQpOwogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgaWYgKHR5cGVBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIC8vIEZvciBleGFtcGxlIGEoYikuLjxUPihjKSwgd2hlcmUgdG9rZW4gaXMgJzwnLgogICAgICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgbmV4dCkpOwogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKHRva2VuLCB0eXBlQXJnKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9IHdoaWxlICghaWRlbnRpY2FsKG1hcmssIHRva2VuKSk7CgogICAgaWYgKGlkZW50aWNhbChuZXh0LnR5cGUucHJlY2VkZW5jZSwgQVNTSUdOTUVOVF9QUkVDRURFTkNFKSkgewogICAgICBUb2tlbiBhc3NpZ25tZW50ID0gbmV4dDsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZShuZXh0KTsKICAgICAgbGlzdGVuZXIuaGFuZGxlQXNzaWdubWVudEV4cHJlc3Npb24oYXNzaWdubWVudCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRDYXNjYWRlKCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVVuYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbiwgYm9vbCBhbGxvd0Nhc2NhZGVzKSB7CiAgICBTdHJpbmcgdmFsdWUgPSB0b2tlbi5uZXh0LnN0cmluZ1ZhbHVlOwogICAgLy8gUHJlZml4OgogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2F3YWl0JykpIHsKICAgICAgaWYgKGluUGxhaW5TeW5jKSB7CiAgICAgICAgaWYgKCFsb29rc0xpa2VBd2FpdEV4cHJlc3Npb24odG9rZW4pKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3Zlcnk6IExvb2tzIGxpa2UgYW4gZXhwcmVzc2lvbiBwcmVjZWRlZCBieSBgYXdhaXRgLgogICAgICAgIC8vIEZhbGwgdGhyb3VnaCBhbmQgbGV0IHBhcnNlQXdhaXRFeHByZXNzaW9uIHJlcG9ydCB0aGUgZXJyb3IuCiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlQXdhaXRFeHByZXNzaW9uKHRva2VuLCBhbGxvd0Nhc2NhZGVzKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnKycpKSB7CiAgICAgIC8vIERhcnQgbm8gbG9uZ2VyIGFsbG93cyBwcmVmaXgtcGx1cy4KICAgICAgcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciByZXBvcnRpbmcgIm1pc3NpbmcgaWRlbnRpZmllciIgaW5zdGVhZC4KICAgICAgICAgIGNvZGVzLm1lc3NhZ2VVbnN1cHBvcnRlZFByZWZpeFBsdXMsCiAgICAgICAgICBuZXcgU3ludGhldGljU3RyaW5nVG9rZW4oCiAgICAgICAgICAgICAgVG9rZW5UeXBlLklERU5USUZJRVIsICcnLCB0b2tlbi5uZXh0Lm9mZnNldCkpOwogICAgICByZXR1cm4gcGFyc2VQcmltYXJ5KHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5leHByZXNzaW9uKTsKICAgIH0gZWxzZSBpZiAoKGlkZW50aWNhbCh2YWx1ZSwgJyEnKSkgfHwKICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAnLScpKSB8fAogICAgICAgIChpZGVudGljYWwodmFsdWUsICd+JykpKSB7CiAgICAgIFRva2VuIG9wZXJhdG9yID0gdG9rZW4ubmV4dDsKICAgICAgLy8gUmlnaHQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIHNhbWUgcHJlY2VkZW5jZQogICAgICAvLyBsZXZlbC4KICAgICAgdG9rZW4gPSBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICAgICAgdG9rZW4ubmV4dCwgUE9TVEZJWF9QUkVDRURFTkNFLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uKG9wZXJhdG9yKTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfSBlbHNlIGlmICgoaWRlbnRpY2FsKHZhbHVlLCAnKysnKSkgfHwgaWRlbnRpY2FsKHZhbHVlLCAnLS0nKSkgewogICAgICAvLyBUT0RPKGFoZSk6IFZhbGlkYXRlIHRoaXMgaXMgdXNlZCBjb3JyZWN0bHkuCiAgICAgIFRva2VuIG9wZXJhdG9yID0gdG9rZW4ubmV4dDsKICAgICAgLy8gUmlnaHQgYXNzb2NpYXRpdmUsIHNvIHdlIHJlY3Vyc2UgYXQgdGhlIHNhbWUgcHJlY2VkZW5jZQogICAgICAvLyBsZXZlbC4KICAgICAgdG9rZW4gPSBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICAgICAgdG9rZW4ubmV4dCwgUE9TVEZJWF9QUkVDRURFTkNFLCBhbGxvd0Nhc2NhZGVzKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvcik7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0gZWxzZSBpZiAodG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgiLiIsIGlkZW50aWZpZXIubmV4dCkpIHsKICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5uZXh0Lm5leHQ7CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gTG9va2luZyBhdCBgaWRlbnRpZmllciAoJy4nIGlkZW50aWZpZXIpP2AuCiAgICAgICAgaWYgKG9wdGlvbmFsKCI8IiwgaWRlbnRpZmllci5uZXh0KSkgewogICAgICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcoaWRlbnRpZmllcik7CiAgICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAgIFRva2VuIGVuZFR5cGVBcmd1bWVudHMgPSB0eXBlQXJnLnNraXAoaWRlbnRpZmllcik7CiAgICAgICAgICAgIGlmIChvcHRpb25hbCgiLiIsIGVuZFR5cGVBcmd1bWVudHMubmV4dCkpIHsKICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbih0b2tlbiwgdHlwZUFyZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJzZVByaW1hcnkodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24pOwogIH0KCiAgVG9rZW4gcGFyc2VBcmd1bWVudE9ySW5kZXhTdGFyKFRva2VuIHRva2VuLCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZykgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBiZWdpblRva2VuID0gbmV4dDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChvcHRpb25hbCgnWycsIG5leHQpIHx8IG9wdGlvbmFsKCc/LlsnLCBuZXh0KSkgewogICAgICAgIGFzc2VydCh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpOwogICAgICAgIFRva2VuIG9wZW5TcXVhcmVCcmFja2V0ID0gbmV4dDsKICAgICAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgICAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKG5leHQpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgICAgICBpZiAoIW9wdGlvbmFsKCddJywgbmV4dCkpIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnXScpKTsKICAgICAgICAgIC8vIFNjYW5uZXIgZW5zdXJlcyBhIGNsb3NpbmcgJ10nCiAgICAgICAgICBUb2tlbiBlbmRHcm91cCA9IG9wZW5TcXVhcmVCcmFja2V0LmVuZEdyb3VwOwogICAgICAgICAgaWYgKGVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgIC8vIFNjYW5uZXIgaW5zZXJ0ZWQgY2xvc2luZyAnXScgaW4gdGhlIHdyb25nIHBsYWNlLCBzbyBtb3ZlIGl0LgogICAgICAgICAgICBuZXh0ID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgZW5kR3JvdXApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHVuZXhwZWN0ZWQgdG9rZW5zIHRvIHdoZXJlIHRoZSB1c2VyIHBsYWNlZCB0aGUgYF1gLgogICAgICAgICAgICBuZXh0ID0gZW5kR3JvdXA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxpc3RlbmVyLmhhbmRsZUluZGV4ZWRFeHByZXNzaW9uKG9wZW5TcXVhcmVCcmFja2V0LCBuZXh0KTsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBhW2JdPFQ+KGMpLCB3aGVyZSB0b2tlbiBpcyBiZWZvcmUgJzwnLgogICAgICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIGlmICh0eXBlQXJnID09IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgICB9CiAgICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50cyh0b2tlbik7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlU2VuZChiZWdpblRva2VuLCB0b2tlbik7CiAgICAgICAgdHlwZUFyZyA9IGNvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgICAgICBpZiAodHlwZUFyZyAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBhKGIpPFQ+KGMpLCB3aGVyZSB0b2tlbiBpcyBiZWZvcmUgJzwnLgogICAgICAgICAgdG9rZW4gPSB0eXBlQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCB0aGlzKTsKICAgICAgICAgIGFzc2VydChvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUHJpbWFyeShUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgZmluYWwgaW50IGtpbmQgPSB0b2tlbi5uZXh0LmtpbmQ7CiAgICBpZiAoa2luZCA9PSBJREVOVElGSUVSX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbCh0b2tlbiwgY29udGV4dCk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gSU5UX1RPS0VOIHx8IGtpbmQgPT0gSEVYQURFQ0lNQUxfVE9LRU4pIHsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbEludCh0b2tlbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gRE9VQkxFX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxEb3VibGUodG9rZW4pOwogICAgfSBlbHNlIGlmIChraW5kID09IFNUUklOR19UT0tFTikgewogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsU3RyaW5nKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBIQVNIX1RPS0VOKSB7CiAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxTeW1ib2wodG9rZW4pOwogICAgfSBlbHNlIGlmIChraW5kID09IEtFWVdPUkRfVE9LRU4pIHsKICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gdG9rZW4ubmV4dC5zdHJpbmdWYWx1ZTsKICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgInRydWUiKSB8fCBpZGVudGljYWwodmFsdWUsICJmYWxzZSIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbEJvb2wodG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgIm51bGwiKSkgewogICAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxOdWxsKHRva2VuKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJ0aGlzIikpIHsKICAgICAgICByZXR1cm4gcGFyc2VUaGlzRXhwcmVzc2lvbih0b2tlbiwgY29udGV4dCk7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAic3VwZXIiKSkgewogICAgICAgIHJldHVybiBwYXJzZVN1cGVyRXhwcmVzc2lvbih0b2tlbiwgY29udGV4dCk7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAibmV3IikpIHsKICAgICAgICByZXR1cm4gcGFyc2VOZXdFeHByZXNzaW9uKHRva2VuKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJjb25zdCIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlQ29uc3RFeHByZXNzaW9uKHRva2VuKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwodmFsdWUsICJ2b2lkIikpIHsKICAgICAgICByZXR1cm4gcGFyc2VTZW5kT3JGdW5jdGlvbkxpdGVyYWwodG9rZW4sIGNvbnRleHQpOwogICAgICB9IGVsc2UgaWYgKCFpblBsYWluU3luYyAmJgogICAgICAgICAgKGlkZW50aWNhbCh2YWx1ZSwgInlpZWxkIikgfHwgaWRlbnRpY2FsKHZhbHVlLCAiYXN5bmMiKSkpIHsKICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHJlY292ZXJ5IGNvZGUuCiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAiYXNzZXJ0IikpIHsKICAgICAgICByZXR1cm4gcGFyc2VBc3NlcnQodG9rZW4sIEFzc2VydC5FeHByZXNzaW9uKTsKICAgICAgfSBlbHNlIGlmICh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgIHJldHVybiBwYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbCh0b2tlbiwgY29udGV4dCk7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAicmV0dXJuIikpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKHRva2VuLCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgcmV0dXJuIHBhcnNlUHJpbWFyeSh0b2tlbiwgY29udGV4dCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRoZSByZWNvdmVyeSBjb2RlLgogICAgICB9CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gT1BFTl9QQVJFTl9UT0tFTikgewogICAgICByZXR1cm4gcGFyc2VQYXJlbnRoZXNpemVkRXhwcmVzc2lvbk9yRnVuY3Rpb25MaXRlcmFsKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBPUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOIHx8CiAgICAgICAgb3B0aW9uYWwoJ1tdJywgdG9rZW4ubmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeCh0b2tlbiwgbnVsbCk7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyh0b2tlbi5uZXh0KTsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbFNldE9yTWFwU3VmZml4KHRva2VuLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoa2luZCA9PSBMVF9UT0tFTikgewogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsTGlzdFNldE1hcE9yRnVuY3Rpb24odG9rZW4sIG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRoZSByZWNvdmVyeSBjb2RlLgogICAgfQogICAgLy8KICAgIC8vIFJlY292ZXJ5IGNvZGUuCiAgICAvLwogICAgcmV0dXJuIHBhcnNlU2VuZCh0b2tlbiwgY29udGV4dCk7CiAgfQoKICBUb2tlbiBwYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWwoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgbmV4dCkpOwogICAgVG9rZW4gbmV4dFRva2VuID0gbmV4dC5lbmRHcm91cC5uZXh0OwogICAgaW50IGtpbmQgPSBuZXh0VG9rZW4ua2luZDsKICAgIGlmIChtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMpIHsKICAgICAgaWYgKChpZGVudGljYWwoa2luZCwgRlVOQ1RJT05fVE9LRU4pIHx8CiAgICAgICAgICBpZGVudGljYWwoa2luZCwgT1BFTl9DVVJMWV9CUkFDS0VUX1RPS0VOKSkpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXMobmV4dCk7CiAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKHRva2VuKTsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoa2luZCwgS0VZV09SRF9UT0tFTikgfHwKICAgICAgICAgIGlkZW50aWNhbChraW5kLCBJREVOVElGSUVSX1RPS0VOKSkgewogICAgICAgIGlmIChvcHRpb25hbCgnYXN5bmMnLCBuZXh0VG9rZW4pIHx8IG9wdGlvbmFsKCdzeW5jJywgbmV4dFRva2VuKSkgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlVmFyaWFibGVzKG5leHQpOwogICAgICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKHRva2VuKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHN0cmF5IHNpbXBsZSBpZGVudGlmaWVyIGluIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uCiAgICAgICAgLy8gYmVjYXVzZSB0aGUgdXNlciBpcyB0eXBpbmcgKGUuZy4gYCgpIGFzeSB7fWApIHRoZW4gY29udGludWUgcGFyc2luZwogICAgICAgIC8vIGFuZCBhbGxvdyBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbiB0byByZXBvcnQgYW4gdW5leHBlY3RlZCB0b2tlbi4KICAgICAgICBraW5kID0gbmV4dFRva2VuLm5leHQua2luZDsKICAgICAgICBpZiAoKGlkZW50aWNhbChraW5kLCBGVU5DVElPTl9UT0tFTikgfHwKICAgICAgICAgICAgaWRlbnRpY2FsKGtpbmQsIE9QRU5fQ1VSTFlfQlJBQ0tFVF9UT0tFTikpKSB7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVWYXJpYWJsZXMobmV4dCk7CiAgICAgICAgICByZXR1cm4gcGFyc2VGdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYm9vbCBvbGQgPSBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnM7CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSB0cnVlOwogICAgdG9rZW4gPSBwYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRva2VuKTsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG9wZW5QYXJlbiA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgb3BlblBhcmVuKSkgewogICAgICAvLyBSZWNvdmVyCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBvcGVuUGFyZW4sIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKCcoJykpOwogICAgICBvcGVuUGFyZW4gPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgIH0KICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3Qob3BlblBhcmVuKTsKICAgIGxpc3RlbmVyLmhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24ob3BlblBhcmVuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGJlZ2luID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpcyh0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihiZWdpbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3QodG9rZW4ubmV4dCk7CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzUmVzdChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4pKTsKICAgIEJlZ2luVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgYmVnaW4pOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVGhpc0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIHRoaXNUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgndGhpcycsIHRoaXNUb2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlVGhpc0V4cHJlc3Npb24odGhpc1Rva2VuLCBjb250ZXh0KTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gQ29uc3RydWN0b3IgZm9yd2FyZGluZy4KICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKG5leHQpOwogICAgICB0b2tlbiA9IHBhcnNlQXJndW1lbnRzKHRva2VuKTsKICAgICAgbGlzdGVuZXIuaGFuZGxlU2VuZCh0aGlzVG9rZW4sIHRva2VuLm5leHQpOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VTdXBlckV4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIHN1cGVyVG9rZW4gPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3N1cGVyJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZVN1cGVyRXhwcmVzc2lvbihzdXBlclRva2VuLCBjb250ZXh0KTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgLy8gU3VwZXIgY29uc3RydWN0b3IuCiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyhuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50cyh0b2tlbik7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVNlbmQoc3VwZXJUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCI/LiIsIG5leHQpKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZVN1cGVyTnVsbEF3YXJlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIHBvcnRpb24gb2YgYSBsaXN0IGxpdGVyYWwgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdAogIC8vLyBzcXVhcmUgYnJhY2tldC4KICAvLy8KICAvLy8gYGBgCiAgLy8vIGxpc3RMaXRlcmFsOgogIC8vLyAgICdjb25zdCc/IHR5cGVBcmd1bWVudHM/ICdbJyAoZXhwcmVzc2lvbkxpc3QgJywnPyk/ICddJwogIC8vLyA7CiAgLy8vIGBgYAogIC8vLwogIC8vLyBQcm92aWRlIGEgW2NvbnN0S2V5d29yZF0gaWYgdGhlIGxpdGVyYWwgaXMgcHJlY2VkZWQgYnkgJ2NvbnN0Jywgb3IgYG51bGxgCiAgLy8vIGlmIG5vdC4gVGhpcyBpcyBhIHN1ZmZpeCBwYXJzZXIgYmVjYXVzZSBpdCBpcyBhc3N1bWVkIHRoYXQgdHlwZSBhcmd1bWVudHMKICAvLy8gaGF2ZSBiZWVuIHBhcnNlZCwgb3IgYGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50c2AgaGFzIGJlZW4gZXhlY3V0ZWQuCiAgVG9rZW4gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeChUb2tlbiB0b2tlbiwgVG9rZW4gY29uc3RLZXl3b3JkKSB7CiAgICBUb2tlbiBiZWZvcmVUb2tlbiA9IHRva2VuOwogICAgVG9rZW4gYmVnaW5Ub2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnWycsIHRva2VuKSB8fCBvcHRpb25hbCgnW10nLCB0b2tlbikpOwogICAgaW50IGNvdW50ID0gMDsKICAgIGlmIChvcHRpb25hbCgnW10nLCB0b2tlbikpIHsKICAgICAgdG9rZW4gPSByZXdyaXRlU3F1YXJlQnJhY2tldHMoYmVmb3JlVG9rZW4pLm5leHQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxMaXN0KDAsIHRva2VuLCBjb25zdEtleXdvcmQsIHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW4ubmV4dDsKICAgIH0KICAgIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpbnQgaWZDb3VudCA9IDA7CiAgICAgIExpdGVyYWxFbnRyeUluZm8gaW5mbyA9IGNvbXB1dGVMaXRlcmFsRW50cnkodG9rZW4pOwogICAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7CiAgICAgICAgaWYgKGluZm8uaGFzRW50cnkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKHRva2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4gPSBpbmZvLnBhcnNlKHRva2VuLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWZDb3VudCArPSBpbmZvLmlmQ29uZGl0aW9uRGVsdGE7CiAgICAgICAgaW5mbyA9IGluZm8uY29tcHV0ZU5leHQodG9rZW4pOwogICAgICB9CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICArK2NvdW50OwogICAgICBpZiAoIW9wdGlvbmFsKCcsJywgbmV4dCkpIHsKICAgICAgICBpZiAob3B0aW9uYWwoJ10nLCBuZXh0KSkgewogICAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmICghbG9va3NMaWtlTGl0ZXJhbEVudHJ5KG5leHQpKSB7CiAgICAgICAgICBpZiAoYmVnaW5Ub2tlbi5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAvLyBUaGUgc2Nhbm5lciBoYXMgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciwKICAgICAgICAgICAgLy8gYnV0IGluc2VydGVkIGBdYCBpbiB0aGUgd3JvbmcgcGxhY2UuCiAgICAgICAgICAgIHRva2VuID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgYmVnaW5Ub2tlbi5lbmRHcm91cCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IgYW5kIGp1bXAgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnXScpKTsKICAgICAgICAgICAgdG9rZW4gPSBiZWdpblRva2VuLmVuZEdyb3VwOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIFRoaXMgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbi4KICAgICAgICAvLyBSZXBvcnQgYW4gZXJyb3IsIGluc2VydCB0aGUgY29tbWEsIGFuZCBjb250aW51ZSBwYXJzaW5nLgogICAgICAgIFN5bnRoZXRpY1Rva2VuIGNvbW1hID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgbmV4dC5vZmZzZXQpOwogICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlmQ291bnQgPiAwCiAgICAgICAgICAgID8gY29kZXMubWVzc2FnZUV4cGVjdGVkRWxzZU9yQ29tbWEKICAgICAgICAgICAgOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJywnKTsKICAgICAgICBuZXh0ID0gcmV3cml0ZUFuZFJlY292ZXIodG9rZW4sIG1lc3NhZ2UsIGNvbW1hKTsKICAgICAgfQogICAgICB0b2tlbiA9IG5leHQ7CiAgICB9CiAgICBtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMgPSBvbGQ7CiAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTGlzdChjb3VudCwgYmVnaW5Ub2tlbiwgY29uc3RLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBwb3J0aW9uIG9mIGEgc2V0IG9yIG1hcCBsaXRlcmFsIHRoYXQgc3RhcnRzIHdpdGgKICAvLy8gdGhlIGxlZnQgY3VybHkgYnJhY2Ugd2hlbiB0aGVyZSBhcmUgbm8gbGVhZGluZyB0eXBlIGFyZ3VtZW50cy4KICBUb2tlbiBwYXJzZUxpdGVyYWxTZXRPck1hcFN1ZmZpeChUb2tlbiB0b2tlbiwgVG9rZW4gY29uc3RLZXl3b3JkKSB7CiAgICBUb2tlbiBsZWZ0QnJhY2UgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCBsZWZ0QnJhY2UpKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCd9JywgbmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbFNldE9yTWFwKDAsIGxlZnRCcmFjZSwgY29uc3RLZXl3b3JkLCBuZXh0LCBmYWxzZSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIGZpbmFsIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIGludCBjb3VudCA9IDA7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogaGFzU2V0RW50cnkgcGFyYW1ldGVyIGV4aXN0cyBmb3IgcmVwbGljYXRpbmcgZXhpc3RpbmcKICAgIC8vIGJlaGF2aW9yIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSB1bmlmaWVkIGNvbGxlY3Rpb24gaGFzIGJlZW4gZW5hYmxlZAogICAgYm9vbCBoYXNTZXRFbnRyeTsKCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpbnQgaWZDb3VudCA9IDA7CiAgICAgIExpdGVyYWxFbnRyeUluZm8gaW5mbyA9IGNvbXB1dGVMaXRlcmFsRW50cnkodG9rZW4pOwogICAgICBpZiAoaW5mbyA9PSBzaW1wbGVFbnRyeSkgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZW1vdmUgdGhpcyBzZWN0aW9uIGFuZCB1c2UgdGhlIHdoaWxlIGxvb3AgYmVsb3cKICAgICAgICAvLyBvbmNlIGhhc1NldEVudHJ5IGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIGJvb2wgaXNNYXBFbnRyeSA9IG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCk7CiAgICAgICAgaGFzU2V0RW50cnkgPz89ICFpc01hcEVudHJ5OwogICAgICAgIGlmIChpc01hcEVudHJ5KSB7CiAgICAgICAgICBUb2tlbiBjb2xvbiA9IHRva2VuLm5leHQ7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihjb2xvbik7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIHRva2VuLm5leHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7CiAgICAgICAgICBpZiAoaW5mby5oYXNFbnRyeSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgICAgIGlmIChvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgICAgICAgICAgVG9rZW4gY29sb24gPSB0b2tlbi5uZXh0OwogICAgICAgICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKGNvbG9uKTsKICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsTWFwRW50cnkoY29sb24sIHRva2VuLm5leHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b2tlbiA9IGluZm8ucGFyc2UodG9rZW4sIHRoaXMpOwogICAgICAgICAgfQogICAgICAgICAgaWZDb3VudCArPSBpbmZvLmlmQ29uZGl0aW9uRGVsdGE7CiAgICAgICAgICBpbmZvID0gaW5mby5jb21wdXRlTmV4dCh0b2tlbik7CiAgICAgICAgfQogICAgICB9CiAgICAgICsrY291bnQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgICAgVG9rZW4gY29tbWE7CiAgICAgIGlmIChvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgY29tbWEgPSB0b2tlbiA9IG5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbmFsKCd9JywgbmV4dCkpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsU2V0T3JNYXAoCiAgICAgICAgICAgIGNvdW50LCBsZWZ0QnJhY2UsIGNvbnN0S2V5d29yZCwgbmV4dCwgaGFzU2V0RW50cnkgPz8gZmFsc2UpOwogICAgICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgfQoKICAgICAgaWYgKGNvbW1hID09IG51bGwpIHsKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmIChsb29rc0xpa2VMaXRlcmFsRW50cnkobmV4dCkpIHsKICAgICAgICAgIC8vIElmIHRoaXMgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbiwKICAgICAgICAgIC8vIHRoZW4gcmVwb3J0IGFuIGVycm9yLCBpbnNlcnQgdGhlIGNvbW1hLCBhbmQgY29udGludWUgcGFyc2luZy4KICAgICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogICAgICAgICAgU3ludGhldGljVG9rZW4gY29tbWEgPQogICAgICAgICAgICAgIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ09NTUEsIG5leHQub2Zmc2V0KTsKICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlmQ291bnQgPiAwCiAgICAgICAgICAgICAgPyBjb2Rlcy5tZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYQogICAgICAgICAgICAgIDogY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyk7CiAgICAgICAgICB0b2tlbiA9IHJld3JpdGVBbmRSZWNvdmVyKHRva2VuLCBtZXNzYWdlLCBjb21tYSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgbmV4dCwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCd9JykpOwogICAgICAgICAgLy8gU2Nhbm5lciBndWFyYW50ZWVzIGEgY2xvc2luZyBjdXJseSBicmFja2V0CiAgICAgICAgICBuZXh0ID0gbGVmdEJyYWNlLmVuZEdyb3VwOwogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTGl0ZXJhbFNldE9yTWFwKAogICAgICAgICAgICAgIGNvdW50LCBsZWZ0QnJhY2UsIGNvbnN0S2V5d29yZCwgbmV4dCwgaGFzU2V0RW50cnkgPz8gZmFsc2UpOwogICAgICAgICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gb2xkOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLy8gZm9ybWFsUGFyYW1ldGVyTGlzdCBmdW5jdGlvbkJvZHkuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBzdWZmaXggcGFyc2VyIGJlY2F1c2UgaXQgaXMgYXNzdW1lZCB0aGF0IHR5cGUgYXJndW1lbnRzIGhhdmUKICAvLy8gYmVlbiBwYXJzZWQsIG9yIGBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMoLi4pYCBoYXMgYmVlbiBleGVjdXRlZC4KICBUb2tlbiBwYXJzZUxpdGVyYWxGdW5jdGlvblN1ZmZpeChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgdG9rZW4ubmV4dCkpOwogICAgLy8gU2Nhbm5lciBlbnN1cmVzIGAoYCBoYXMgbWF0Y2hpbmcgYClgLgogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQuZW5kR3JvdXAubmV4dDsKICAgIGludCBraW5kID0gbmV4dC5raW5kOwogICAgaWYgKCFpZGVudGljYWwoa2luZCwgRlVOQ1RJT05fVE9LRU4pICYmCiAgICAgICAgIWlkZW50aWNhbChraW5kLCBPUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU4pICYmCiAgICAgICAgKCFpZGVudGljYWwoa2luZCwgS0VZV09SRF9UT0tFTikgfHwKICAgICAgICAgICAgIW9wdGlvbmFsKCdhc3luYycsIG5leHQpICYmICFvcHRpb25hbCgnc3luYycsIG5leHQpKSkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKG5leHQsIGNvZGVzLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICAvLy8gZ2VuZXJpY0xpc3RMaXRlcmFsIHwgZ2VuZXJpY01hcExpdGVyYWwgfCBnZW5lcmljRnVuY3Rpb25MaXRlcmFsLgogIC8vLwogIC8vLyBXaGVyZQogIC8vLyAgIGdlbmVyaWNMaXN0TGl0ZXJhbCA6Oj0gdHlwZUFyZ3VtZW50cyAnWycgKGV4cHJlc3Npb25MaXN0ICcsJz8pPyAnXScKICAvLy8gICBnZW5lcmljTWFwTGl0ZXJhbCA6Oj0KICAvLy8gICAgICAgdHlwZUFyZ3VtZW50cyAneycgKG1hcExpdGVyYWxFbnRyeSAoJywnIG1hcExpdGVyYWxFbnRyeSkqICcsJz8pPyAnfScKICAvLy8gICBnZW5lcmljRnVuY3Rpb25MaXRlcmFsIDo6PQogIC8vLyAgICAgICB0eXBlUGFyYW1ldGVycyBmb3JtYWxQYXJhbWV0ZXJMaXN0IGZ1bmN0aW9uQm9keQogIC8vLyBQcm92aWRlIHRva2VuIGZvciBbY29uc3RLZXl3b3JkXSBpZiBwcmVjZWRlZCBieSAnY29uc3QnLCBudWxsIGlmIG5vdC4KICBUb2tlbiBwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbigKICAgICAgZmluYWwgVG9rZW4gc3RhcnQsIFRva2VuIGNvbnN0S2V5d29yZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCc8Jywgc3RhcnQubmV4dCkpOwogICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbU9yQXJnID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHN0YXJ0LCB0cnVlKTsKICAgIFRva2VuIHRva2VuID0gdHlwZVBhcmFtT3JBcmcuc2tpcChzdGFydCk7CiAgICBpZiAob3B0aW9uYWwoJygnLCB0b2tlbi5uZXh0KSkgewogICAgICBpZiAoY29uc3RLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBjb25zdEtleXdvcmQsIGNvZGVzLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgfQogICAgICB0b2tlbiA9IHR5cGVQYXJhbU9yQXJnLnBhcnNlVmFyaWFibGVzKHN0YXJ0LCB0aGlzKTsKICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbEZ1bmN0aW9uU3VmZml4KHRva2VuKTsKICAgIH0KICAgIC8vIE5vdGUgdGhhdCBwYXJzZUFyZ3VtZW50cyBjYW4gcmV3cml0ZSB0aGUgdG9rZW4gc3RyZWFtIQogICAgdG9rZW4gPSB0eXBlUGFyYW1PckFyZy5wYXJzZUFyZ3VtZW50cyhzdGFydCwgdGhpcyk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgneycsIG5leHQpKSB7CiAgICAgIGlmICh0eXBlUGFyYW1PckFyZy50eXBlQXJndW1lbnRDb3VudCA+IDIpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBjb2Rlcy5tZXNzYWdlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHMsCiAgICAgICAgICAgIHN0YXJ0Lm5leHQsCiAgICAgICAgICAgIHRva2VuKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXgodG9rZW4sIGNvbnN0S2V5d29yZCk7CiAgICB9CiAgICBpZiAoIW9wdGlvbmFsKCdbJywgbmV4dCkgJiYgIW9wdGlvbmFsKCdbXScsIG5leHQpKSB7CiAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBJbXByb3ZlIHRoaXMgZXJyb3IgbWVzc2FnZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnWycpKTsKICAgICAgcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljVG9rZW4odG9rZW4sIFRva2VuVHlwZS5JTkRFWCk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeCh0b2tlbiwgY29uc3RLZXl3b3JkKTsKICB9CgogIC8vLyBgYGAKICAvLy8gbWFwTGl0ZXJhbEVudHJ5OgogIC8vLyAgIGV4cHJlc3Npb24gJzonIGV4cHJlc3Npb24gfAogIC8vLyAgICdpZicgJygnIGV4cHJlc3Npb24gJyknIG1hcExpdGVyYWxFbnRyeSAoICdlbHNlJyBtYXBMaXRlcmFsRW50cnkgKT8gfAogIC8vLyAgICdhd2FpdCc/ICdmb3InICcoJyBmb3JMb29wUGFydHMgJyknIG1hcExpdGVyYWxFbnRyeSB8CiAgLy8vICAgKCAnLi4uJyB8ICcuLi4/JyApIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZU1hcExpdGVyYWxFbnRyeShUb2tlbiB0b2tlbikgewogICAgLy8gQXNzdW1lIHRoZSBsaXN0ZW5lciByZWplY3RzIG5vbi1zdHJpbmcga2V5cy4KICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOiBDaGFuZ2UgdGhlIGFzc3VtcHRpb24gYWJvdmUgYnkgbW92aW5nIGVycm9yCiAgICAvLyBjaGVja2luZyBpbnRvIHRoZSBwYXJzZXIsIG1ha2luZyBpdCBwb3NzaWJsZSB0byByZWNvdmVyLgogICAgTGl0ZXJhbEVudHJ5SW5mbyBpbmZvID0gY29tcHV0ZUxpdGVyYWxFbnRyeSh0b2tlbik7CiAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7CiAgICAgIGlmIChpbmZvLmhhc0VudHJ5KSB7CiAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIFRva2VuIGNvbG9uID0gZW5zdXJlQ29sb24odG9rZW4pOwogICAgICAgIHRva2VuID0gcGFyc2VFeHByZXNzaW9uKGNvbG9uKTsKICAgICAgICAvLyBUT0RPIHJlbW92ZSB1bnVzZWQgMm5kIHBhcmFtZXRlcgogICAgICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxNYXBFbnRyeShjb2xvbiwgdG9rZW4ubmV4dCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4gPSBpbmZvLnBhcnNlKHRva2VuLCB0aGlzKTsKICAgICAgfQogICAgICBpbmZvID0gaW5mby5jb21wdXRlTmV4dCh0b2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbChUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgaWYgKCFtYXlQYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbnMpIHsKICAgICAgcmV0dXJuIHBhcnNlU2VuZCh0b2tlbiwgY29udGV4dCk7CiAgICB9CiAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKHRva2VuLCBmYWxzZSk7CiAgICBUb2tlbiBiZWZvcmVOYW1lID0gdHlwZUluZm8uc2tpcFR5cGUodG9rZW4pOwogICAgVG9rZW4gbmFtZSA9IGJlZm9yZU5hbWUubmV4dDsKICAgIGlmIChuYW1lLmlzSWRlbnRpZmllcikgewogICAgICBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZVBhcmFtID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5hbWUpOwogICAgICBUb2tlbiBuZXh0ID0gdHlwZVBhcmFtLnNraXAobmFtZSkubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgICBpZiAobG9va3NMaWtlRnVuY3Rpb25Cb2R5KG5leHQuZW5kR3JvdXAubmV4dCkpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUZ1bmN0aW9uTGl0ZXJhbCgKICAgICAgICAgICAgICB0b2tlbiwgYmVmb3JlTmFtZSwgbmFtZSwgdHlwZUluZm8sIHR5cGVQYXJhbSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFyc2VTZW5kKHRva2VuLCBjb250ZXh0KTsKICB9CgogIFRva2VuIGVuc3VyZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCcoJywgbmV4dCkpIHsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgbmV4dCA9IHJld3JpdGVyLmluc2VydFBhcmVucyh0b2tlbiwgZmFsc2UpOwogICAgfQogICAgcmV0dXJuIHBhcnNlQXJndW1lbnRzUmVzdChuZXh0KTsKICB9CgogIFRva2VuIHBhcnNlQ29uc3RydWN0b3JJbnZvY2F0aW9uQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAvLyBSZWNvdmVyeTogQ2hlY2sgZm9yIGludmFsaWQgdHlwZSBwYXJhbWV0ZXJzCiAgICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKTsKICAgICAgaWYgKHR5cGVBcmcgPT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgY29kZXMubWVzc2FnZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHMpOwogICAgICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgdGhpcyk7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHModG9rZW4pOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmICghb3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRQYXJlbnModG9rZW4sIGZhbHNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcnNlQXJndW1lbnRzUmVzdChuZXh0KTsKICB9CgogIC8vLyBgYGAKICAvLy8gbmV3RXhwcmVzc2lvbjoKICAvLy8gICAnbmV3JyB0eXBlICgnLicgaWRlbnRpZmllcik/IGFyZ3VtZW50cwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTmV3RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV3S2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ25ldycsIG5ld0tleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luTmV3RXhwcmVzc2lvbihuZXdLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZShuZXdLZXl3b3JkKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3Rvckludm9jYXRpb25Bcmd1bWVudHModG9rZW4pOwogICAgbGlzdGVuZXIuZW5kTmV3RXhwcmVzc2lvbihuZXdLZXl3b3JkKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oCiAgICAgIFRva2VuIHRva2VuLCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZykgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIGxpc3RlbmVyLmJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24odG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZUNvbnN0cnVjdG9yUmVmZXJlbmNlKHRva2VuLCB0eXBlQXJnKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3Rvckludm9jYXRpb25Bcmd1bWVudHModG9rZW4pOwogICAgbGlzdGVuZXIuZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oYmVnaW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIHBhcnNlcyBhIGxpc3Qgb3IgbWFwIGxpdGVyYWwgdGhhdCBpcyBrbm93biB0byBzdGFydCB3aXRoIHRoZQogIC8vLyBrZXl3b3JkICdjb25zdCcuCiAgLy8vCiAgLy8vIGBgYAogIC8vLyBsaXN0TGl0ZXJhbDoKICAvLy8gICAnY29uc3QnPyB0eXBlQXJndW1lbnRzPyAnWycgKGV4cHJlc3Npb25MaXN0ICcsJz8pPyAnXScKICAvLy8gOwogIC8vLwogIC8vLyBtYXBMaXRlcmFsOgogIC8vLyAgICdjb25zdCc/IHR5cGVBcmd1bWVudHM/CiAgLy8vICAgICAneycgKG1hcExpdGVyYWxFbnRyeSAoJywnIG1hcExpdGVyYWxFbnRyeSkqICcsJz8pPyAnfScKICAvLy8gOwogIC8vLwogIC8vLyBtYXBMaXRlcmFsRW50cnk6CiAgLy8vICAgZXhwcmVzc2lvbiAnOicgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29uc3RFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBjb25zdEtleXdvcmQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NvbnN0JywgY29uc3RLZXl3b3JkKSk7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICBpZiAoKGlkZW50aWNhbCh2YWx1ZSwgJ1snKSkgfHwgKGlkZW50aWNhbCh2YWx1ZSwgJ1tdJykpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RMaXRlcmFsKG5leHQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMobmV4dCk7CiAgICAgIHRva2VuID0gcGFyc2VMaXRlcmFsTGlzdFN1ZmZpeCh0b2tlbiwgY29uc3RLZXl3b3JkKTsKICAgICAgbGlzdGVuZXIuZW5kQ29uc3RMaXRlcmFsKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAneycpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ29uc3RMaXRlcmFsKG5leHQpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHMobmV4dCk7CiAgICAgIHRva2VuID0gcGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXgodG9rZW4sIGNvbnN0S2V5d29yZCk7CiAgICAgIGxpc3RlbmVyLmVuZENvbnN0TGl0ZXJhbCh0b2tlbi5uZXh0KTsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJzwnKSkgewogICAgICBsaXN0ZW5lci5iZWdpbkNvbnN0TGl0ZXJhbChuZXh0KTsKICAgICAgdG9rZW4gPSBwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbih0b2tlbiwgY29uc3RLZXl3b3JkKTsKICAgICAgbGlzdGVuZXIuZW5kQ29uc3RMaXRlcmFsKHRva2VuLm5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBsaXN0ZW5lci5iZWdpbkNvbnN0RXhwcmVzc2lvbihjb25zdEtleXdvcmQpOwogICAgdG9rZW4gPSBwYXJzZUNvbnN0cnVjdG9yUmVmZXJlbmNlKHRva2VuKTsKICAgIHRva2VuID0gcGFyc2VDb25zdHJ1Y3Rvckludm9jYXRpb25Bcmd1bWVudHModG9rZW4pOwogICAgbGlzdGVuZXIuZW5kQ29uc3RFeHByZXNzaW9uKGNvbnN0S2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGludExpdGVyYWw6CiAgLy8vICAgaW50ZWdlcgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGl0ZXJhbEludChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5raW5kLCBJTlRfVE9LRU4pIHx8CiAgICAgICAgaWRlbnRpY2FsKHRva2VuLmtpbmQsIEhFWEFERUNJTUFMX1RPS0VOKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsSW50KHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZG91YmxlTGl0ZXJhbDoKICAvLy8gICBkb3VibGUKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpdGVyYWxEb3VibGUoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGljYWwodG9rZW4ua2luZCwgRE9VQkxFX1RPS0VOKSk7CiAgICBsaXN0ZW5lci5oYW5kbGVMaXRlcmFsRG91YmxlKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3RyaW5nTGl0ZXJhbDoKICAvLy8gICAobXVsdGlsaW5lU3RyaW5nIHwgc2luZ2xlTGluZVN0cmluZykrCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBzdGFydFRva2VuID0gdG9rZW47CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLm5leHQua2luZCwgU1RSSU5HX1RPS0VOKSk7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CiAgICB0b2tlbiA9IHBhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICBpbnQgY291bnQgPSAxOwogICAgd2hpbGUgKGlkZW50aWNhbCh0b2tlbi5uZXh0LmtpbmQsIFNUUklOR19UT0tFTikpIHsKICAgICAgdG9rZW4gPSBwYXJzZVNpbmdsZUxpdGVyYWxTdHJpbmcodG9rZW4pOwogICAgICBjb3VudCsrOwogICAgfQogICAgaWYgKGNvdW50ID4gMSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKHN0YXJ0VG9rZW4sIGNvdW50KTsKICAgIH0KICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3ltYm9sTGl0ZXJhbDoKICAvLy8gICAnIycgKG9wZXJhdG9yIHwgKGlkZW50aWZpZXIgKCcuJyBpZGVudGlmaWVyKSopKQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlTGl0ZXJhbFN5bWJvbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gaGFzaFRva2VuID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCcjJywgaGFzaFRva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpbkxpdGVyYWxTeW1ib2woaGFzaFRva2VuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlT3BlcmF0b3IobmV4dCk7CiAgICAgIGxpc3RlbmVyLmVuZExpdGVyYWxTeW1ib2woaGFzaFRva2VuLCAxKTsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2b2lkJywgbmV4dCkpIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlU3ltYm9sVm9pZChuZXh0KTsKICAgICAgbGlzdGVuZXIuZW5kTGl0ZXJhbFN5bWJvbChoYXNoVG9rZW4sIDEpOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIGludCBjb3VudCA9IDE7CiAgICAgIHRva2VuID0gZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubGl0ZXJhbFN5bWJvbCk7CiAgICAgIHdoaWxlIChvcHRpb25hbCgnLicsIHRva2VuLm5leHQpKSB7CiAgICAgICAgY291bnQrKzsKICAgICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIoCiAgICAgICAgICAgIHRva2VuLm5leHQsIElkZW50aWZpZXJDb250ZXh0LmxpdGVyYWxTeW1ib2xDb250aW51YXRpb24pOwogICAgICB9CiAgICAgIGxpc3RlbmVyLmVuZExpdGVyYWxTeW1ib2woaGFzaFRva2VuLCBjb3VudCk7CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICB9CgogIFRva2VuIHBhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWNhbCh0b2tlbi5raW5kLCBTVFJJTkdfVE9LRU4pKTsKICAgIGxpc3RlbmVyLmJlZ2luTGl0ZXJhbFN0cmluZyh0b2tlbik7CiAgICAvLyBQYXJzaW5nIHRoZSBwcmVmaXgsIGZvciBpbnN0YW5jZSAneCBvZiAneCR7aWR9eSR7aWR9eicKICAgIGludCBpbnRlcnBvbGF0aW9uQ291bnQgPSAwOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpbnQga2luZCA9IG5leHQua2luZDsKICAgIHdoaWxlIChraW5kICE9IEVPRl9UT0tFTikgewogICAgICBpZiAoaWRlbnRpY2FsKGtpbmQsIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKSkgewogICAgICAgIC8vIFBhcnNpbmcgJHtleHByZXNzaW9ufS4KICAgICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbihuZXh0KS5uZXh0OwogICAgICAgIGlmICghb3B0aW9uYWwoJ30nLCB0b2tlbikpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgdG9rZW4sIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnfScpKTsKICAgICAgICAgIHRva2VuID0gbmV4dC5lbmRHcm91cDsKICAgICAgICB9CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24obmV4dCwgdG9rZW4pOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChraW5kLCBTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSX1RPS0VOKSkgewogICAgICAgIC8vIFBhcnNpbmcgJGlkZW50aWZpZXIuCiAgICAgICAgdG9rZW4gPSBwYXJzZUlkZW50aWZpZXJFeHByZXNzaW9uKG5leHQpOwogICAgICAgIGxpc3RlbmVyLmhhbmRsZUludGVycG9sYXRpb25FeHByZXNzaW9uKG5leHQsIG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgICsraW50ZXJwb2xhdGlvbkNvdW50OwogICAgICAvLyBQYXJzaW5nIHRoZSBpbmZpeC9zdWZmaXgsIGZvciBpbnN0YW5jZSB5IGFuZCB6JyBvZiAneCR7aWR9eSR7aWR9eicKICAgICAgdG9rZW4gPSBwYXJzZVN0cmluZ1BhcnQodG9rZW4pOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAga2luZCA9IG5leHQua2luZDsKICAgIH0KICAgIGxpc3RlbmVyLmVuZExpdGVyYWxTdHJpbmcoaW50ZXJwb2xhdGlvbkNvdW50LCBuZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSWRlbnRpZmllckV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQua2luZCA9PSBLRVlXT1JEX1RPS0VOICYmIGlkZW50aWNhbChuZXh0LnN0cmluZ1ZhbHVlLCAidGhpcyIpKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZVRoaXNFeHByZXNzaW9uKG5leHQsIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24pOwogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBwYXJzZVNlbmQodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb24pOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBib29sZWFuTGl0ZXJhbDoKICAvLy8gICAndHJ1ZScgfAogIC8vLyAgICdmYWxzZScKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUxpdGVyYWxCb29sKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZhbHNlJywgdG9rZW4pIHx8IG9wdGlvbmFsKCd0cnVlJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxCb29sKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gbnVsbExpdGVyYWw6CiAgLy8vICAgJ251bGwnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VMaXRlcmFsTnVsbChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdudWxsJywgdG9rZW4pKTsKICAgIGxpc3RlbmVyLmhhbmRsZUxpdGVyYWxOdWxsKHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBDYWxscyBoYW5kbGVOb25OdWxsQXNzZXJ0RXhwcmVzc2lvbiB3aGVuIHRoZSB0b2tlbiBwb2ludHMgdG8gYCE8YC4KICAvLy8gUmV0dXJucyB0aGUgaW5wdXQgdG9rZW4gaWYgaXQgZG9lc24ndCBwb2ludCB0byBgITxgLCBvciB0aGUgbmV4dCB0b2tlbgogIC8vLyAocmVhZHkgZm9yIHBhcnNpbmcgYnkgZS5nLiBjb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50cykgaWYgaXQgZG9lcy4KICBUb2tlbiBwYXJzZUJhbmdCZWZvcmVUeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBpZiAob3B0aW9uYWwoJyEnLCB0b2tlbi5uZXh0KSAmJiBvcHRpb25hbCgnPCcsIHRva2VuLm5leHQubmV4dCkpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBsaXN0ZW5lci5oYW5kbGVOb25OdWxsQXNzZXJ0RXhwcmVzc2lvbih0b2tlbik7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZVNlbmQoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIFRva2VuIGJlZ2luVG9rZW4gPSB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIGNvbnRleHQpOwogICAgdG9rZW4gPSBwYXJzZUJhbmdCZWZvcmVUeXBlQXJndW1lbnRzKHRva2VuKTsKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnID0gY29tcHV0ZU1ldGhvZFR5cGVBcmd1bWVudHModG9rZW4pOwogICAgaWYgKHR5cGVBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgICB0b2tlbiA9IHR5cGVBcmcucGFyc2VBcmd1bWVudHModG9rZW4sIHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlQXJndW1lbnRzKHRva2VuLm5leHQpOwogICAgfQogICAgdG9rZW4gPSBwYXJzZUFyZ3VtZW50c09wdCh0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVTZW5kKGJlZ2luVG9rZW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gc2tpcEFyZ3VtZW50c09wdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5oYW5kbGVOb0FyZ3VtZW50cyhuZXh0KTsKICAgIGlmIChvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIHJldHVybiBuZXh0LmVuZEdyb3VwOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogIH0KCiAgVG9rZW4gcGFyc2VBcmd1bWVudHNPcHQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnKCcsIG5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU5vQXJndW1lbnRzKG5leHQpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gcGFyc2VBcmd1bWVudHModG9rZW4pOwogICAgfQogIH0KCiAgLy8vIGBgYAogIC8vLyBhcmd1bWVudHM6CiAgLy8vICAgJygnIChhcmd1bWVudExpc3QgJywnPyk/ICcpJwogIC8vLyA7CiAgLy8vCiAgLy8vIGFyZ3VtZW50TGlzdDoKICAvLy8gICBuYW1lZEFyZ3VtZW50ICgnLCcgbmFtZWRBcmd1bWVudCkqIHwKICAvLy8gICBleHByZXNzaW9uTGlzdCAoJywnIG5hbWVkQXJndW1lbnQpKgogIC8vLyA7CiAgLy8vCiAgLy8vIG5hbWVkQXJndW1lbnQ6CiAgLy8vICAgbGFiZWwgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gcGFyc2VBcmd1bWVudHNSZXN0KHRva2VuLm5leHQpOwogIH0KCiAgVG9rZW4gcGFyc2VBcmd1bWVudHNSZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgYmVnaW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luQXJndW1lbnRzKGJlZ2luKTsKICAgIGludCBhcmd1bWVudENvdW50ID0gMDsKICAgIGJvb2wgaGFzU2Vlbk5hbWVkQXJndW1lbnQgPSBmYWxzZTsKICAgIGJvb2wgb2xkID0gbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zOwogICAgbWF5UGFyc2VGdW5jdGlvbkV4cHJlc3Npb25zID0gdHJ1ZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBUb2tlbiBjb2xvbiA9IG51bGw7CiAgICAgIGlmIChvcHRpb25hbCgnOicsIG5leHQubmV4dCkpIHsKICAgICAgICB0b2tlbiA9CiAgICAgICAgICAgIGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0Lm5hbWVkQXJndW1lbnRSZWZlcmVuY2UpCiAgICAgICAgICAgICAgICAubmV4dDsKICAgICAgICBjb2xvbiA9IHRva2VuOwogICAgICAgIGhhc1NlZW5OYW1lZEFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChoYXNTZWVuTmFtZWRBcmd1bWVudCkgewogICAgICAgIC8vIFBvc2l0aW9uYWwgYXJndW1lbnQgYWZ0ZXIgbmFtZWQgYXJndW1lbnQuCiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlUG9zaXRpb25hbEFmdGVyTmFtZWRBcmd1bWVudCk7CiAgICAgIH0KICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKGNvbG9uICE9IG51bGwpIGxpc3RlbmVyLmhhbmRsZU5hbWVkQXJndW1lbnQoY29sb24pOwogICAgICArK2FyZ3VtZW50Q291bnQ7CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCBuZXh0KSkgewogICAgICAgIGlmIChvcHRpb25hbCgnKScsIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICBpZiAobG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0KG5leHQpKSB7CiAgICAgICAgICAvLyBJZiB0aGlzIGxvb2tzIGxpa2UgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24sCiAgICAgICAgICAvLyB0aGVuIHJlcG9ydCBhbiBlcnJvciwgaW5zZXJ0IHRoZSBjb21tYSwgYW5kIGNvbnRpbnVlIHBhcnNpbmcuCiAgICAgICAgICBuZXh0ID0gcmV3cml0ZUFuZFJlY292ZXIoCiAgICAgICAgICAgICAgdG9rZW4sCiAgICAgICAgICAgICAgY29kZXMudGVtcGxhdGVFeHBlY3RlZEJ1dEdvdC53aXRoQXJndW1lbnRzKCcsJyksCiAgICAgICAgICAgICAgbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DT01NQSwgbmV4dC5vZmZzZXQpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4gPSBlbnN1cmVDbG9zZVBhcmVuKHRva2VuLCBiZWdpbik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgfQogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIGxpc3RlbmVyLmVuZEFyZ3VtZW50cyhhcmd1bWVudENvdW50LCBiZWdpbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0eXBlVGVzdDo6CiAgLy8vICAgJ2lzJyAnISc/IHR5cGUKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUlzT3BlcmF0b3JSZXN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBvcGVyYXRvciA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnaXMnLCBvcGVyYXRvcikpOwogICAgVG9rZW4gbm90ID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnIScsIHRva2VuLm5leHQpKSB7CiAgICAgIG5vdCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGVBZnRlcklzT3JBcyh0b2tlbik7CiAgICB0b2tlbiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCB0aGlzKTsKICAgIGxpc3RlbmVyLmhhbmRsZUlzT3BlcmF0b3Iob3BlcmF0b3IsIG5vdCk7CiAgICByZXR1cm4gc2tpcENoYWluZWRBc0lzT3BlcmF0b3JzKHRva2VuKTsKICB9CgogIFR5cGVJbmZvIGNvbXB1dGVUeXBlQWZ0ZXJJc09yQXMoVG9rZW4gdG9rZW4pIHsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpOwogICAgaWYgKHR5cGVJbmZvLmlzTnVsbGFibGUpIHsKICAgICAgVG9rZW4gbmV4dCA9IHR5cGVJbmZvLnNraXBUeXBlKHRva2VuKS5uZXh0OwogICAgICBpZiAoIWlzT25lT2ZPckVvZihuZXh0LCBjb25zdCBbJyknLCAnPycsICc/PycsICc7JywgJ2lzJywgJ2FzJ10pKSB7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IGludmVzdGlnYXRlIG90aGVyIHNpdHVhdGlvbnMKICAgICAgICAvLyB3aGVyZSBgP2Agc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgdHlwZSBpbmZvCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KICAgICAgICB0eXBlSW5mbyA9IHR5cGVJbmZvLmFzTm9uTnVsbGFibGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0eXBlSW5mbzsKICB9CgogIC8vLyBgYGAKICAvLy8gdHlwZUNhc3Q6CiAgLy8vICAgJ2FzJyB0eXBlCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VBc09wZXJhdG9yUmVzdChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gb3BlcmF0b3IgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2FzJywgb3BlcmF0b3IpKTsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGVBZnRlcklzT3JBcyh0b2tlbik7CiAgICB0b2tlbiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCB0aGlzKTsKICAgIGxpc3RlbmVyLmhhbmRsZUFzT3BlcmF0b3Iob3BlcmF0b3IpOwogICAgcmV0dXJuIHNraXBDaGFpbmVkQXNJc09wZXJhdG9ycyh0b2tlbik7CiAgfQoKICBUb2tlbiBza2lwQ2hhaW5lZEFzSXNPcGVyYXRvcnMoVG9rZW4gdG9rZW4pIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICBpZiAoIWlkZW50aWNhbCh2YWx1ZSwgJ2lzJykgJiYgIWlkZW50aWNhbCh2YWx1ZSwgJ2FzJykpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgICAgLy8gVGhlIGlzLSBhbmQgYXMtb3BlcmF0b3JzIGNhbm5vdCBiZSBjaGFpbmVkLgogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIGlmIChvcHRpb25hbCgnIScsIG5leHQubmV4dCkpIHsKICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICB9CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGVBZnRlcklzT3JBcyhuZXh0KTsKICAgICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZShuZXh0KTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKICAgIH0KICB9CgogIC8vLyBSZXR1cm5zIHRydWUgaWYgW3Rva2VuXSBjb3VsZCBiZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbgogIC8vLyB3aXRob3V0IGEgcmV0dXJuIHR5cGUuCiAgYm9vbCBsb29rc0xpa2VMb2NhbEZ1bmN0aW9uKFRva2VuIHRva2VuKSB7CiAgICBpZiAodG9rZW4uaXNJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgnPCcsIHRva2VuLm5leHQpKSB7CiAgICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbSA9IGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0b2tlbik7CiAgICAgICAgaWYgKHR5cGVQYXJhbSA9PSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRva2VuID0gdHlwZVBhcmFtLnNraXAodG9rZW4pOwogICAgICB9CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcoJywgdG9rZW4pKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5lbmRHcm91cC5uZXh0OwogICAgICAgIHJldHVybiBvcHRpb25hbCgneycsIHRva2VuKSB8fAogICAgICAgICAgICBvcHRpb25hbCgnPT4nLCB0b2tlbikgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJ2FzeW5jJywgdG9rZW4pIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCdzeW5jJywgdG9rZW4pOwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCc9PicsIHRva2VuKSkgewogICAgICAgIC8vIFJlY292ZXJ5OiBMb29rcyBsaWtlIGEgbG9jYWwgZnVuY3Rpb24gdGhhdCBpcyBtaXNzaW5nIHBhcmVudGhlc2lzLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmV0dXJucyB0cnVlIGlmIFt0b2tlbl0gY291bGQgYmUgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gYm9keS4KICBib29sIGxvb2tzTGlrZUZ1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIG9wdGlvbmFsKCd7JywgdG9rZW4pIHx8CiAgICAgICAgb3B0aW9uYWwoJz0+JywgdG9rZW4pIHx8CiAgICAgICAgb3B0aW9uYWwoJ2FzeW5jJywgdG9rZW4pIHx8CiAgICAgICAgb3B0aW9uYWwoJ3N5bmMnLCB0b2tlbik7CiAgfQoKICBUb2tlbiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckNvbnN0RGVjbGFyYXRpb24oZmluYWwgVG9rZW4gc3RhcnQpIHsKICAgIFRva2VuIGNvbnN0VG9rZW4gPSBzdGFydC5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdjb25zdCcsIGNvbnN0VG9rZW4pKTsKICAgIGlmICghaXNNb2RpZmllcihjb25zdFRva2VuLm5leHQpKSB7CiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUoY29uc3RUb2tlbiwgZmFsc2UpOwogICAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlKSB7CiAgICAgICAgVG9rZW4gbmV4dCA9IGNvbnN0VG9rZW4ubmV4dDsKICAgICAgICBpZiAoIW5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KHN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKICAgICAgICBpZiAoIShvcHRpb25hbCgnPScsIG5leHQpIHx8CiAgICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICAgIG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyIHx8CiAgICAgICAgICAgIG9wdGlvbmFsKCc7JywgbmV4dCkgfHwKICAgICAgICAgICAgb3B0aW9uYWwoJywnLCBuZXh0KSB8fAogICAgICAgICAgICBvcHRpb25hbCgneycsIG5leHQpKSkgewogICAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChzdGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uQWZ0ZXJNb2RpZmllcnMoCiAgICAgICAgICBjb25zdFRva2VuLCBzdGFydCwgbnVsbCwgY29uc3RUb2tlbiwgdHlwZUluZm8sIGZhbHNlKTsKICAgIH0KICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKHN0YXJ0KTsKICB9CgogIC8vLyBUaGlzIG1ldGhvZCBoYXMgdHdvIG1vZGVzIGJhc2VkIHVwb24gW29ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydF0uCiAgLy8vCiAgLy8vIElmIFtvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnRdIGlzIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGVuIHRoaXMKICAvLy8gbWV0aG9kIHdpbGwgcGFyc2UgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgYSBsb2NhbCBmdW5jdGlvbiwKICAvLy8gb3IgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQsIGFuZCB0aGVuIHJldHVybiB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4KICAvLy8KICAvLy8gSWYgW29ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydF0gaXMgYHRydWVgIHRoZW4gdGhpcyBtZXRob2QKICAvLy8gd2lsbCBvbmx5IHBhcnNlIHRoZSBtZXRhZGF0YSwgbW9kaWZpZXJzLCBhbmQgdHlwZSBvZiBhIGxvY2FsIHZhcmlhYmxlCiAgLy8vIGRlY2xhcmF0aW9uIGlmIGl0IGV4aXN0cy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8KICAvLy8gY2FsbCBbcGFyc2VWYXJpYWJsZXNEZWNsYXJhdGlvblJlc3RdIHRvIGZpbmlzaCBwYXJzaW5nIHRoZSBsb2NhbCB2YXJpYWJsZQogIC8vLyBkZWNsYXJhdGlvbi4gSWYgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpcyBub3QgZm91bmQgdGhlbiB0aGlzCiAgLy8vIG1ldGhvZCB3aWxsIHJldHVybiBbc3RhcnRdLgogIFRva2VuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb24oZmluYWwgVG9rZW4gc3RhcnQsCiAgICAgIFtib29sIG9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCA9IGZhbHNlXSkgewogICAgVG9rZW4gdG9rZW4gPSBzdGFydDsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG9wdGlvbmFsKCdAJywgbmV4dCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGFkYXRhU3Rhcih0b2tlbik7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQoKICAgIFRva2VuIGxhdGVUb2tlbjsKICAgIFRva2VuIHZhckZpbmFsT3JDb25zdDsKCiAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpIHx8CiAgICAgICAgICBvcHRpb25hbCgnZmluYWwnLCBuZXh0KSB8fAogICAgICAgICAgb3B0aW9uYWwoJ2NvbnN0JywgbmV4dCkpIHsKICAgICAgICB2YXJGaW5hbE9yQ29uc3QgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2xhdGUnLCBuZXh0KSkgewogICAgICAgIGxhdGVUb2tlbiA9IHRva2VuID0gbmV4dDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSAmJgogICAgICAgICAgICAob3B0aW9uYWwoJ3ZhcicsIG5leHQpIHx8IG9wdGlvbmFsKCdmaW5hbCcsIG5leHQpKSkgewogICAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gdG9rZW4gPSBuZXh0OwogICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoaXNNb2RpZmllcihuZXh0KSkgewogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgY29udGV4dCA9IG5ldyBNb2RpZmllclJlY292ZXJ5Q29udGV4dCh0aGlzKQogICAgICAgICAgLi5sYXRlVG9rZW4gPSBsYXRlVG9rZW4KICAgICAgICAgIC4udmFyRmluYWxPckNvbnN0ID0gdmFyRmluYWxPckNvbnN0OwoKICAgICAgICB0b2tlbiA9IGNvbnRleHQucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTW9kaWZpZXJzKHRva2VuKTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgICAgbGF0ZVRva2VuID0gY29udGV4dC5sYXRlVG9rZW47CiAgICAgICAgdmFyRmluYWxPckNvbnN0ID0gY29udGV4dC52YXJGaW5hbE9yQ29uc3Q7CgogICAgICAgIGNvbnRleHQgPSBudWxsOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25BZnRlck1vZGlmaWVycyh0b2tlbiwgc3RhcnQsCiAgICAgICAgbGF0ZVRva2VuLCB2YXJGaW5hbE9yQ29uc3QsIG51bGwsIG9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCk7CiAgfQoKICAvLy8gU2VlIFtwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uXQogIFRva2VuIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25BZnRlck1vZGlmaWVycygKICAgICAgZmluYWwgVG9rZW4gYmVmb3JlVHlwZSwKICAgICAgZmluYWwgVG9rZW4gc3RhcnQsCiAgICAgIGZpbmFsIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LAogICAgICBUeXBlSW5mbyB0eXBlSW5mbywKICAgICAgYm9vbCBvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpIHsKICAgIHR5cGVJbmZvID8/PSBjb21wdXRlVHlwZShiZWZvcmVUeXBlLCBmYWxzZSk7CgogICAgVG9rZW4gdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZShiZWZvcmVUeXBlKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwoKICAgIGlmIChvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpIHsKICAgICAgaWYgKGxhdGVUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgbGF0ZVRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChsb29rc0xpa2VMb2NhbEZ1bmN0aW9uKG5leHQpKSB7CiAgICAgICAgLy8gUGFyc2UgYSBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KICAgICAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgdmFyRmluYWxPckNvbnN0LCBjb2Rlcy50ZW1wbGF0ZUV4dHJhbmVvdXNNb2RpZmllcik7CiAgICAgICAgfSBlbHNlIGlmIChsYXRlVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICBsYXRlVG9rZW4sIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFvcHRpb25hbCgnQCcsIHN0YXJ0Lm5leHQpKSB7CiAgICAgICAgICBsaXN0ZW5lci5iZWdpbk1ldGFkYXRhU3RhcihzdGFydC5uZXh0KTsKICAgICAgICAgIGxpc3RlbmVyLmVuZE1ldGFkYXRhU3RhcigwKTsKICAgICAgICB9CiAgICAgICAgVG9rZW4gYmVmb3JlRm9ybWFscyA9CiAgICAgICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0KS5wYXJzZVZhcmlhYmxlcyhuZXh0LCB0aGlzKTsKICAgICAgICBsaXN0ZW5lci5iZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbihzdGFydC5uZXh0KTsKICAgICAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgICAgICByZXR1cm4gcGFyc2VOYW1lZEZ1bmN0aW9uUmVzdCh0b2tlbiwgc3RhcnQubmV4dCwgYmVmb3JlRm9ybWFscywgZmFsc2UpOwogICAgICB9CiAgICB9CgogICAgaWYgKGJlZm9yZVR5cGUgPT0gc3RhcnQgJiYKICAgICAgICB0eXBlSW5mby5pc051bGxhYmxlICYmCiAgICAgICAgdHlwZUluZm8uY291bGRCZUV4cHJlc3Npb24pIHsKICAgICAgYXNzZXJ0KG9wdGlvbmFsKCc/JywgdG9rZW4pKTsKICAgICAgYXNzZXJ0KG5leHQuaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgICAgaWYgKCFuZXh0LmlzSWRlbnRpZmllcikgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMobmV4dCkpOwogICAgICAgIG5leHQgPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKG5leHQpOwogICAgICB9CiAgICAgIFRva2VuIGFmdGVySWRlbnRpZmllciA9IG5leHQubmV4dDsKICAgICAgLy8KICAgICAgLy8gZm91bmQgPHR5cGVyZWY+IGA/YCA8aWRlbnRpZmllcj4KICAgICAgLy8gd2l0aCBubyBhbm5vdGF0aW9ucyBvciBtb2RpZmllcnMgcHJlY2VlZGluZyBpdAogICAgICAvLwogICAgICBpZiAob3B0aW9uYWwoJz0nLCBhZnRlcklkZW50aWZpZXIpKSB7CiAgICAgICAgLy8KICAgICAgICAvLyBsb29rIHBhc3QgdGhlIG5leHQgZXhwcmVzc2lvbgogICAgICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIHBhcnQgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uCiAgICAgICAgLy8KICAgICAgICBMaXN0ZW5lciBvcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgICAgbGlzdGVuZXIgPSBuZXcgRm9yd2FyZGluZ0xpc3RlbmVyKCk7CiAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IGNvbnNpZGVyIHVzaW5nIFRva2VuU3RyZWFtR2hvc3RXcml0ZXIgaGVyZQogICAgICAgIFRva2VuIGFmdGVyRXhwcmVzc2lvbiA9CiAgICAgICAgICAgIHBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlKGFmdGVySWRlbnRpZmllcikubmV4dDsKICAgICAgICBsaXN0ZW5lciA9IG9yaWdpbmFsTGlzdGVuZXI7CgogICAgICAgIGlmIChvcHRpb25hbCgnOicsIGFmdGVyRXhwcmVzc2lvbikpIHsKICAgICAgICAgIC8vIExvb2tzIGxpa2UgcGFydCBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCiAgICAgICAgICAvLyBEcm9wIHRoZSB0eXBlIGluZm9ybWF0aW9uIGFuZCByZXNldCB0aGUgbGFzdCBjb25zdW1lZCB0b2tlbi4KICAgICAgICAgIHR5cGVJbmZvID0gbm9UeXBlOwogICAgICAgICAgdG9rZW4gPSBzdGFydDsKICAgICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWZ0ZXJJZGVudGlmaWVyLmlzS2V5d29yZCAmJgogICAgICAgICAgIWlzT25lT2ZPckVvZihhZnRlcklkZW50aWZpZXIsIGNvbnN0IFsnOycsICcsJywgJyknXSkpIHsKICAgICAgICAvLyBMb29rcyBsaWtlIHBhcnQgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLgogICAgICAgIC8vIERyb3AgdGhlIHR5cGUgaW5mb3JtYXRpb24gYW5kIHJlc2V0IHRoZSBsYXN0IGNvbnN1bWVkIHRva2VuLgogICAgICAgIHR5cGVJbmZvID0gbm9UeXBlOwogICAgICAgIHRva2VuID0gc3RhcnQ7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodG9rZW4gPT0gc3RhcnQpIHsKICAgICAgLy8gSWYgbm8gYW5ub3RhdGlvbiwgbW9kaWZpZXIsIG9yIHR5cGUsIGFuZCB0aGlzIGlzIG5vdCBhIGxvY2FsIGZ1bmN0aW9uCiAgICAgIC8vIHRoZW4gdGhpcyBtdXN0IGJlIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50LgogICAgICBpZiAob25seVBhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXJ0KSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoc3RhcnQpOwogICAgICB9CiAgICB9CgogICAgaWYgKG5leHQudHlwZS5pc0J1aWx0SW4gJiYKICAgICAgICBiZWZvcmVUeXBlID09IHN0YXJ0ICYmCiAgICAgICAgdHlwZUluZm8uY291bGRCZUV4cHJlc3Npb24pIHsKICAgICAgLy8gRGV0ZWN0IGV4cHJlc3Npb25zIHN1Y2ggYXMgaWRlbnRpZmllciBgYXNgIGlkZW50aWZpZXIKICAgICAgLy8gYW5kIHRyZWF0IHRob3NlIGFzIGV4cHJlc3Npb25zLgogICAgICBpZiAob3B0aW9uYWwoJ2FzJywgbmV4dCkgfHwgb3B0aW9uYWwoJ2lzJywgbmV4dCkpIHsKICAgICAgICBpbnQga2luZCA9IG5leHQubmV4dC5raW5kOwogICAgICAgIGlmIChFUV9UT0tFTiAhPSBraW5kICYmCiAgICAgICAgICAgIFNFTUlDT0xPTl9UT0tFTiAhPSBraW5kICYmCiAgICAgICAgICAgIENPTU1BX1RPS0VOICE9IGtpbmQpIHsKICAgICAgICAgIGlmIChvbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnQpIHsKICAgICAgICAgICAgaWYgKCFvcHRpb25hbCgnaW4nLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KHN0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgLy8gT25seSByZXBvcnQgdGhlc2UgZXJyb3JzIGlmIHRoZXJlIGlzIGFuIGlkZW50aWZpZXIuIElmIHRoZXJlIGlzIG5vdCBhbgogICAgICAvLyBpZGVudGlmaWVyLCB0aGVuIGFsbG93IGVuc3VyZUlkZW50aWZpZXIgdG8gcmVwb3J0IGFuIGVycm9yCiAgICAgIC8vIGFuZCBkb24ndCByZXBvcnQgZXJyb3JzIGhlcmUuCiAgICAgIGlmICh2YXJGaW5hbE9yQ29uc3QgPT0gbnVsbCkgewogICAgICAgIGlmICh0eXBlSW5mbyA9PSBub1R5cGUgJiYgbGF0ZVRva2VuID09IG51bGwpIHsKICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZU1pc3NpbmdDb25zdEZpbmFsVmFyT3JUeXBlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgICBpZiAodHlwZUluZm8gIT0gbm9UeXBlKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHZhckZpbmFsT3JDb25zdCwgY29kZXMubWVzc2FnZVR5cGVBZnRlclZhcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKCFvcHRpb25hbCgnQCcsIHN0YXJ0Lm5leHQpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luTWV0YWRhdGFTdGFyKHN0YXJ0Lm5leHQpOwogICAgICBsaXN0ZW5lci5lbmRNZXRhZGF0YVN0YXIoMCk7CiAgICB9CiAgICB0b2tlbiA9IHR5cGVJbmZvLnBhcnNlVHlwZShiZWZvcmVUeXBlLCB0aGlzKTsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgbGlzdGVuZXIuYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbihuZXh0LCBsYXRlVG9rZW4sIHZhckZpbmFsT3JDb25zdCk7CiAgICBpZiAoIW9ubHlQYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGFydCkgewogICAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KHRva2VuLCB0cnVlKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KFRva2VuIHRva2VuLCBib29sIGVuZFdpdGhTZW1pY29sb24pIHsKICAgIGludCBjb3VudCA9IDE7CiAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcih0b2tlbik7CiAgICB3aGlsZSAob3B0aW9uYWwoJywnLCB0b2tlbi5uZXh0KSkgewogICAgICB0b2tlbiA9IHBhcnNlT3B0aW9uYWxseUluaXRpYWxpemVkSWRlbnRpZmllcih0b2tlbi5uZXh0KTsKICAgICAgKytjb3VudDsKICAgIH0KICAgIGlmIChlbmRXaXRoU2VtaWNvbG9uKSB7CiAgICAgIFRva2VuIHNlbWljb2xvbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICAgIGxpc3RlbmVyLmVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGNvdW50LCBzZW1pY29sb24pOwogICAgICByZXR1cm4gc2VtaWNvbG9uOwogICAgfSBlbHNlIHsKICAgICAgbGlzdGVuZXIuZW5kVmFyaWFibGVzRGVjbGFyYXRpb24oY291bnQsIG51bGwpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgfQoKICBUb2tlbiBwYXJzZU9wdGlvbmFsbHlJbml0aWFsaXplZElkZW50aWZpZXIoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5hbWVUb2tlbiA9CiAgICAgICAgZW5zdXJlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQubG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKTsKICAgIGxpc3RlbmVyLmJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWVUb2tlbik7CiAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdChuYW1lVG9rZW4pOwogICAgbGlzdGVuZXIuZW5kSW5pdGlhbGl6ZWRJZGVudGlmaWVyKG5hbWVUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGlmU3RhdGVtZW50OgogIC8vLyAgICdpZicgJygnIGV4cHJlc3Npb24gJyknIHN0YXRlbWVudCAoJ2Vsc2UnIHN0YXRlbWVudCk/CiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VJZlN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gaWZUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2lmJywgaWZUb2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5JZlN0YXRlbWVudChpZlRva2VuKTsKICAgIHRva2VuID0gZW5zdXJlUGFyZW50aGVzaXplZENvbmRpdGlvbihpZlRva2VuKTsKICAgIGxpc3RlbmVyLmJlZ2luVGhlblN0YXRlbWVudCh0b2tlbi5uZXh0KTsKICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kVGhlblN0YXRlbWVudCh0b2tlbik7CiAgICBUb2tlbiBlbHNlVG9rZW4gPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdlbHNlJywgdG9rZW4ubmV4dCkpIHsKICAgICAgZWxzZVRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5FbHNlU3RhdGVtZW50KGVsc2VUb2tlbik7CiAgICAgIHRva2VuID0gcGFyc2VTdGF0ZW1lbnQoZWxzZVRva2VuKTsKICAgICAgbGlzdGVuZXIuZW5kRWxzZVN0YXRlbWVudChlbHNlVG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kSWZTdGF0ZW1lbnQoaWZUb2tlbiwgZWxzZVRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gZm9yU3RhdGVtZW50OgogIC8vLyAgICdhd2FpdCc/ICdmb3InICcoJyBmb3JMb29wUGFydHMgJyknIHN0YXRlbWVudAogIC8vLyA7CiAgLy8vCiAgLy8vICBmb3JMb29wUGFydHM6CiAgLy8vICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JyBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbkxpc3Q/CiAgLy8vICAgIHwgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJ2luJyBleHByZXNzaW9uCiAgLy8vICAgIHwgaWRlbnRpZmllciAnaW4nIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLwogIC8vLyBmb3JJbml0aWFsaXplclN0YXRlbWVudDoKICAvLy8gICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gfAogIC8vLyAgIGV4cHJlc3Npb24/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9yU3RhdGVtZW50KFRva2VuIHRva2VuLCBUb2tlbiBhd2FpdFRva2VuKSB7CiAgICBUb2tlbiBmb3JUb2tlbiA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChhd2FpdFRva2VuID09IG51bGwgfHwgb3B0aW9uYWwoJ2F3YWl0JywgYXdhaXRUb2tlbikpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JTdGF0ZW1lbnQoZm9yVG9rZW4pOwoKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNTdGFydChhd2FpdFRva2VuLCBmb3JUb2tlbik7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIHRva2VuID0gcGFyc2VGb3JMb29wUGFydHNNaWQodG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuKTsKICAgIGlmIChvcHRpb25hbCgnaW4nLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiBpbiAuLi4gKWAKICAgICAgcmV0dXJuIHBhcnNlRm9ySW5SZXN0KHRva2VuLCBhd2FpdFRva2VuLCBmb3JUb2tlbiwgaWRlbnRpZmllcik7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9jZXNzIGBmb3IgKCAuLi4gOyAuLi4gOyAuLi4gKWAKICAgICAgcmV0dXJuIHBhcnNlRm9yUmVzdChhd2FpdFRva2VuLCB0b2tlbiwgZm9yVG9rZW4pOwogICAgfQogIH0KCiAgLy8vIFBhcnNlIHRoZSBzdGFydCBvZiBhIGZvciBsb29wIGNvbnRyb2wgc3RydWN0dXJlCiAgLy8vIGZyb20gdGhlIG9wZW4gcGFyZW50aGVzaXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGlkZW50aWZpZXIuCiAgVG9rZW4gcGFyc2VGb3JMb29wUGFydHNTdGFydChUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbikgewogICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzID0gZm9yVG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBsZWZ0UGFyZW50aGVzaXMsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKCiAgICAgIEJlZ2luVG9rZW4gb3BlblBhcmVuID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICBmb3JUb2tlbiwKICAgICAgICAgIG5ldyBTeW50aGV0aWNCZWdpblRva2VuKAogICAgICAgICAgICAgIFRva2VuVHlwZS5PUEVOX1BBUkVOLCBsZWZ0UGFyZW50aGVzaXMub2Zmc2V0KSk7CgogICAgICBUb2tlbiB0b2tlbjsKICAgICAgaWYgKGF3YWl0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihvcGVuUGFyZW4pOwogICAgICAgIHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZCh0b2tlbiwgS2V5d29yZC5JTik7CiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY1Rva2VuKG9wZW5QYXJlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CiAgICAgICAgdG9rZW4gPSByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CiAgICAgIH0KCiAgICAgIG9wZW5QYXJlbi5lbmRHcm91cCA9IHRva2VuID0gcmV3cml0ZXIuaW5zZXJ0VG9rZW4odG9rZW4sCiAgICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNMT1NFX1BBUkVOLCBsZWZ0UGFyZW50aGVzaXMub2Zmc2V0KSk7CgogICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgICByZXdyaXRlci5pbnNlcnRTeW50aGV0aWNUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlNFTUlDT0xPTik7CgogICAgICBsZWZ0UGFyZW50aGVzaXMgPSBvcGVuUGFyZW47CiAgICB9CgogICAgLy8gUGFzcyBgdHJ1ZWAgc28gdGhhdCB0aGUgW3BhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25dIG9ubHkKICAgIC8vIHBhcnNlcyB0aGUgbWV0YWRhdGEsIG1vZGlmaWVycywgYW5kIHR5cGUgb2YgYSBsb2NhbCB2YXJpYWJsZQogICAgLy8gZGVjbGFyYXRpb24gaWYgaXQgZXhpc3RzLiBUaGlzIGVuYWJsZXMgY2FwdHVyaW5nIFtiZWZvcmVJZGVudGlmaWVyXQogICAgLy8gZm9yIGxhdGVyIGVycm9yIHJlcG9ydGluZy4KICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckRlY2xhcmF0aW9uKGxlZnRQYXJlbnRoZXNpcywgdHJ1ZSk7CiAgfQoKICAvLy8gUGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24KICAvLy8gb3IgYW4gZXhwcmVzc2lvbiBpZiBubyBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB3YXMgZm91bmQuCiAgVG9rZW4gcGFyc2VGb3JMb29wUGFydHNNaWQoVG9rZW4gdG9rZW4sIFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuKSB7CiAgICBpZiAodG9rZW4gIT0gZm9yVG9rZW4ubmV4dCkgewogICAgICB0b2tlbiA9IHBhcnNlVmFyaWFibGVzRGVjbGFyYXRpb25SZXN0KHRva2VuLCBmYWxzZSk7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUZvckluaXRpYWxpemVyTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKAogICAgICAgICAgdG9rZW4sIG9wdGlvbmFsKCdpbicsIHRva2VuLm5leHQpKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJzsnLCB0b2tlbi5uZXh0KSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JJbml0aWFsaXplckVtcHR5U3RhdGVtZW50KHRva2VuLm5leHQpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICBsaXN0ZW5lci5oYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICB0b2tlbiwKICAgICAgICAgIG9wdGlvbmFsKCdpbicsIHRva2VuLm5leHQpIHx8CiAgICAgICAgICAgICAgb3B0aW9uYWwoJzonLCB0b2tlbi5uZXh0KSB8fAogICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZW1wdHkgYGF3YWl0IGZvcmAsIHdlIHJld3JpdGUgaXQgaW50byBhbgogICAgICAgICAgICAgIC8vIGBhd2FpdCBmb3IgKF8gaW4gXylgLgogICAgICAgICAgICAgIChhd2FpdFRva2VuICE9IG51bGwgJiYgb3B0aW9uYWwoJyknLCB0b2tlbi5uZXh0KSkpOwogICAgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJzsnLCBuZXh0KSkgewogICAgICBpZiAoYXdhaXRUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhd2FpdFRva2VuLCBjb2Rlcy5tZXNzYWdlSW52YWxpZEF3YWl0Rm9yKTsKICAgICAgfQogICAgfSBlbHNlIGlmICghb3B0aW9uYWwoJ2luJywgbmV4dCkpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCc6JywgbmV4dCkpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGNvZGVzLm1lc3NhZ2VDb2xvbkluUGxhY2VPZkluKTsKICAgICAgfSBlbHNlIGlmIChhd2FpdFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ2luJykpOwogICAgICAgIHRva2VuLnNldE5leHQoCiAgICAgICAgICAgIG5ldyBTeW50aGV0aWNLZXl3b3JkVG9rZW4oS2V5d29yZC5JTiwgbmV4dC5vZmZzZXQpLi5zZXROZXh0KG5leHQpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgcG9ydGlvbiBvZiB0aGUgZm9yTG9vcFBhcnRzIHRoYXQgc3RhcnRzIHdpdGggdGhlCiAgLy8vIGZpcnN0IHNlbWljb2xvbiAodGhlIG9uZSB0aGF0IHRlcm1pbmF0ZXMgdGhlIGZvckluaXRpYWxpemVyU3RhdGVtZW50KS4KICAvLy8KICAvLy8gYGBgCiAgLy8vICBmb3JMb29wUGFydHM6CiAgLy8vICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JyBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbkxpc3Q/CiAgLy8vICAgIHwgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJ2luJyBleHByZXNzaW9uCiAgLy8vICAgIHwgaWRlbnRpZmllciAnaW4nIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUZvclJlc3QoVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gdG9rZW4sIFRva2VuIGZvclRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlRm9yTG9vcFBhcnRzUmVzdCh0b2tlbiwgZm9yVG9rZW4sIGF3YWl0VG9rZW4pOwogICAgbGlzdGVuZXIuYmVnaW5Gb3JTdGF0ZW1lbnRCb2R5KHRva2VuLm5leHQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kRm9yU3RhdGVtZW50Qm9keSh0b2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmVuZEZvclN0YXRlbWVudCh0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlRm9yTG9vcFBhcnRzUmVzdChUb2tlbiB0b2tlbiwgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGF3YWl0VG9rZW4pIHsKICAgIFRva2VuIGxlZnRQYXJlbnRoZXNpcyA9IGZvclRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2ZvcicsIGZvclRva2VuKSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKTsKCiAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGlmIChvcHRpb25hbCgnOycsIGxlZnRTZXBhcmF0b3IubmV4dCkpIHsKICAgICAgdG9rZW4gPSBwYXJzZUVtcHR5U3RhdGVtZW50KGxlZnRTZXBhcmF0b3IpOwogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobGVmdFNlcGFyYXRvcik7CiAgICB9CiAgICBpbnQgZXhwcmVzc2lvbkNvdW50ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJyknLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlRXhwcmVzc2lvbih0b2tlbikubmV4dDsKICAgICAgKytleHByZXNzaW9uQ291bnQ7CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCB0b2tlbikpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKHRva2VuICE9IGxlZnRQYXJlbnRoZXNpcy5lbmRHcm91cCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKHRva2VuLCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgIHRva2VuID0gbGVmdFBhcmVudGhlc2lzLmVuZEdyb3VwOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlRm9yTG9vcFBhcnRzKAogICAgICAgIGZvclRva2VuLCBsZWZ0UGFyZW50aGVzaXMsIGxlZnRTZXBhcmF0b3IsIGV4cHJlc3Npb25Db3VudCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBwb3J0aW9uIG9mIHRoZSBmb3JMb29wUGFydHMgdGhhdCBzdGFydHMgd2l0aCB0aGUKICAvLy8ga2V5d29yZCAnaW4nLiBGb3IgdGhlIHNha2Ugb2YgcmVjb3ZlcnksIHdlIGFjY2VwdCBhIGNvbG9uIGluIHBsYWNlIG9mIHRoZQogIC8vLyBrZXl3b3JkLgogIC8vLwogIC8vLyBgYGAKICAvLy8gIGZvckxvb3BQYXJ0czoKICAvLy8gICAgICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJzsnIGV4cHJlc3Npb24/ICc7JyBleHByZXNzaW9uTGlzdD8KICAvLy8gICAgfCBleHByZXNzaW9uPyAnOycgZXhwcmVzc2lvbj8gJzsnIGV4cHJlc3Npb25MaXN0PwogIC8vLyAgICB8IGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiAnaW4nIGV4cHJlc3Npb24KICAvLy8gICAgfCBpZGVudGlmaWVyICdpbicgZXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlRm9ySW5SZXN0KAogICAgICBUb2tlbiB0b2tlbiwgVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4sIFRva2VuIGlkZW50aWZpZXIpIHsKICAgIHRva2VuID0gcGFyc2VGb3JJbkxvb3BQYXJ0c1Jlc3QodG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuLCBpZGVudGlmaWVyKTsKICAgIGxpc3RlbmVyLmJlZ2luRm9ySW5Cb2R5KHRva2VuLm5leHQpOwogICAgTG9vcFN0YXRlIHNhdmVkTG9vcFN0YXRlID0gbG9vcFN0YXRlOwogICAgbG9vcFN0YXRlID0gTG9vcFN0YXRlLkluc2lkZUxvb3A7CiAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kRm9ySW5Cb2R5KHRva2VuLm5leHQpOwogICAgbGlzdGVuZXIuZW5kRm9ySW4odG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUZvckluTG9vcFBhcnRzUmVzdCgKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIGF3YWl0VG9rZW4sIFRva2VuIGZvclRva2VuLCBUb2tlbiBpZGVudGlmaWVyKSB7CiAgICBUb2tlbiBpbktleXdvcmQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCBmb3JUb2tlbikpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCcoJywgZm9yVG9rZW4ubmV4dCkpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdpbicsIGluS2V5d29yZCkgfHwgb3B0aW9uYWwoJzonLCBpbktleXdvcmQpKTsKCiAgICBpZiAoIWlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgIT0gdG9rZW4pIHsKICAgICAgaWYgKG9wdGlvbmFsKCc9JywgaWRlbnRpZmllci5uZXh0KSkgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIGlkZW50aWZpZXIubmV4dCwgY29kZXMubWVzc2FnZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2gpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIGlkZW50aWZpZXIubmV4dCwgY29kZXMudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGF3YWl0VG9rZW4gIT0gbnVsbCAmJiAhaW5Bc3luYykgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcmVwb3J0aW5nIHRoZSBlcnJvciBvbiBhd2FpdFRva2VuCiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoaW5LZXl3b3JkLCBjb2Rlcy5tZXNzYWdlQXdhaXRGb3JOb3RBc3luYyk7CiAgICB9CgogICAgbGlzdGVuZXIuYmVnaW5Gb3JJbkV4cHJlc3Npb24oaW5LZXl3b3JkLm5leHQpOwogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oaW5LZXl3b3JkKTsKICAgIHRva2VuID0gZW5zdXJlQ2xvc2VQYXJlbih0b2tlbiwgZm9yVG9rZW4ubmV4dCk7CiAgICBsaXN0ZW5lci5lbmRGb3JJbkV4cHJlc3Npb24odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlRm9ySW5Mb29wUGFydHMoCiAgICAgICAgYXdhaXRUb2tlbiwgZm9yVG9rZW4sIGZvclRva2VuLm5leHQsIGluS2V5d29yZCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHdoaWxlU3RhdGVtZW50OgogIC8vLyAgICd3aGlsZScgJygnIGV4cHJlc3Npb24gJyknIHN0YXRlbWVudAogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIHdoaWxlVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd3aGlsZScsIHdoaWxlVG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luV2hpbGVTdGF0ZW1lbnQod2hpbGVUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24od2hpbGVUb2tlbik7CiAgICBsaXN0ZW5lci5iZWdpbldoaWxlU3RhdGVtZW50Qm9keSh0b2tlbi5uZXh0KTsKICAgIExvb3BTdGF0ZSBzYXZlZExvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIGxvb3BTdGF0ZSA9IExvb3BTdGF0ZS5JbnNpZGVMb29wOwogICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICBsb29wU3RhdGUgPSBzYXZlZExvb3BTdGF0ZTsKICAgIGxpc3RlbmVyLmVuZFdoaWxlU3RhdGVtZW50Qm9keSh0b2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmVuZFdoaWxlU3RhdGVtZW50KHdoaWxlVG9rZW4sIHRva2VuLm5leHQpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBkb1N0YXRlbWVudDoKICAvLy8gICAnZG8nIHN0YXRlbWVudCAnd2hpbGUnICcoJyBleHByZXNzaW9uICcpJyAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZURvV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGRvVG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdkbycsIGRvVG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luRG9XaGlsZVN0YXRlbWVudChkb1Rva2VuKTsKICAgIGxpc3RlbmVyLmJlZ2luRG9XaGlsZVN0YXRlbWVudEJvZHkoZG9Ub2tlbi5uZXh0KTsKICAgIExvb3BTdGF0ZSBzYXZlZExvb3BTdGF0ZSA9IGxvb3BTdGF0ZTsKICAgIGxvb3BTdGF0ZSA9IExvb3BTdGF0ZS5JbnNpZGVMb29wOwogICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudChkb1Rva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kRG9XaGlsZVN0YXRlbWVudEJvZHkodG9rZW4pOwogICAgVG9rZW4gd2hpbGVUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBpZiAoIW9wdGlvbmFsKCd3aGlsZScsIHdoaWxlVG9rZW4pKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICB3aGlsZVRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJ3doaWxlJykpOwogICAgICB3aGlsZVRva2VuID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZCh0b2tlbiwgS2V5d29yZC5XSElMRSk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24od2hpbGVUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5lbmREb1doaWxlU3RhdGVtZW50KGRvVG9rZW4sIHdoaWxlVG9rZW4sIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gYmxvY2s6CiAgLy8vICAgJ3snIHN0YXRlbWVudCogJ30nCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VCbG9jayhUb2tlbiB0b2tlbiwgQmxvY2tLaW5kIGJsb2NrS2luZCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbiA9IGVuc3VyZUJsb2NrKHRva2VuLCBudWxsLCBibG9ja0tpbmQubWlzc2luZ0Jsb2NrTmFtZSk7CiAgICBsaXN0ZW5lci5iZWdpbkJsb2NrKGJlZ2luLCBibG9ja0tpbmQpOwogICAgaW50IHN0YXRlbWVudENvdW50ID0gMDsKICAgIFRva2VuIHN0YXJ0VG9rZW4gPSB0b2tlbi5uZXh0OwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCBzdGFydFRva2VuKSkgewogICAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50KHRva2VuKTsKICAgICAgaWYgKGlkZW50aWNhbCh0b2tlbi5uZXh0LCBzdGFydFRva2VuKSkgewogICAgICAgIC8vIE5vIHByb2dyZXNzIHdhcyBtYWRlLCBzbyB3ZSByZXBvcnQgdGhlIGN1cnJlbnQgdG9rZW4gYXMgYmVpbmcgaW52YWxpZAogICAgICAgIC8vIGFuZCBtb3ZlIGZvcndhcmQuCiAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKHRva2VuKSk7CiAgICAgIH0KICAgICAgKytzdGF0ZW1lbnRDb3VudDsKICAgICAgc3RhcnRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNFb2YgfHwgb3B0aW9uYWwoJ30nLCB0b2tlbikpOwogICAgbGlzdGVuZXIuZW5kQmxvY2soc3RhdGVtZW50Q291bnQsIGJlZ2luLCB0b2tlbiwgYmxvY2tLaW5kKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSW52YWxpZEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3snLCBiZWdpbikpOwogICAgLy8gUGFyc2UgYW5kIHJlcG9ydCB0aGUgaW52YWxpZCBibG9jaywgYnV0IHN1cHByZXNzIGVycm9ycwogICAgLy8gYmVjYXVzZSBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIGJ5IHRoZSBjYWxsZXIuCiAgICBMaXN0ZW5lciBvcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXI7CiAgICBsaXN0ZW5lciA9IG5ldyBGb3J3YXJkaW5nTGlzdGVuZXIobGlzdGVuZXIpLi5mb3J3YXJkRXJyb3JzID0gZmFsc2U7CiAgICAvLyBUaGUgc2Nhbm5lciBlbnN1cmVzIHRoYXQgYHtgIGFsd2F5cyBoYXMgYSBjbG9zaW5nIGB9YC4KICAgIHRva2VuID0gcGFyc2VCbG9jayh0b2tlbiwgQmxvY2tLaW5kLmludmFsaWQpOwogICAgbGlzdGVuZXIgPSBvcmlnaW5hbExpc3RlbmVyOwogICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2soYmVnaW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIERldGVybWluZSBpZiB0aGUgZm9sbG93aW5nIHRva2VucyBsb29rIGxpa2UgYW4gJ2F3YWl0JyBleHByZXNzaW9uCiAgLy8vIGFuZCBub3QgYSBsb2NhbCB2YXJpYWJsZSBvciBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KICBib29sIGxvb2tzTGlrZUF3YWl0RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdhd2FpdCcsIHRva2VuKSk7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CgogICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIHBhcnNpbmcgdGhlIHBvdGVudGlhbCBleHByZXNzaW9uIGZvbGxvd2luZwogICAgLy8gdGhlIGBhd2FpdGAgdG9rZW4gb25jZSBkb2luZyBzbyBkb2VzIG5vdCBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbS4KICAgIC8vIEZvciBub3csIHVzZSBzaW1wbGUgbG9vayBhaGVhZCBhbmQgZW5zdXJlIG5vIGZhbHNlIHBvc2l0aXZlcy4KCiAgICBpZiAodG9rZW4uaXNJZGVudGlmaWVyKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCcoJywgdG9rZW4pKSB7CiAgICAgICAgdG9rZW4gPSB0b2tlbi5lbmRHcm91cC5uZXh0OwogICAgICAgIGlmIChpc09uZU9mKHRva2VuLCBbJzsnLCAnLicsICcuLicsICc/JywgJz8uJ10pKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaXNPbmVPZih0b2tlbiwgWycuJywgJyknLCAnXSddKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gYGBgCiAgLy8vIGF3YWl0RXhwcmVzc2lvbjoKICAvLy8gICAnYXdhaXQnIHVuYXJ5RXhwcmVzc2lvbgogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQXdhaXRFeHByZXNzaW9uKFRva2VuIHRva2VuLCBib29sIGFsbG93Q2FzY2FkZXMpIHsKICAgIFRva2VuIGF3YWl0VG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdhd2FpdCcsIGF3YWl0VG9rZW4pKTsKICAgIGxpc3RlbmVyLmJlZ2luQXdhaXRFeHByZXNzaW9uKGF3YWl0VG9rZW4pOwogICAgdG9rZW4gPSBwYXJzZVByZWNlZGVuY2VFeHByZXNzaW9uKAogICAgICAgIGF3YWl0VG9rZW4sIFBPU1RGSVhfUFJFQ0VERU5DRSwgYWxsb3dDYXNjYWRlcyk7CiAgICBpZiAoaW5Bc3luYykgewogICAgICBsaXN0ZW5lci5lbmRBd2FpdEV4cHJlc3Npb24oYXdhaXRUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICB9IGVsc2UgewogICAgICBjb2Rlcy5NZXNzYWdlQ29kZSBlcnJvckNvZGUgPSBjb2Rlcy5tZXNzYWdlQXdhaXROb3RBc3luYzsKICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihhd2FpdFRva2VuLCBlcnJvckNvZGUpOwogICAgICBsaXN0ZW5lci5lbmRJbnZhbGlkQXdhaXRFeHByZXNzaW9uKGF3YWl0VG9rZW4sIHRva2VuLm5leHQsIGVycm9yQ29kZSk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHRocm93RXhwcmVzc2lvbjoKICAvLy8gICAndGhyb3cnIGV4cHJlc3Npb24KICAvLy8gOwogIC8vLwogIC8vLyB0aHJvd0V4cHJlc3Npb25XaXRob3V0Q2FzY2FkZToKICAvLy8gICAndGhyb3cnIGV4cHJlc3Npb25XaXRob3V0Q2FzY2FkZQogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlVGhyb3dFeHByZXNzaW9uKFRva2VuIHRva2VuLCBib29sIGFsbG93Q2FzY2FkZXMpIHsKICAgIFRva2VuIHRocm93VG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCd0aHJvdycsIHRocm93VG9rZW4pKTsKICAgIGlmIChvcHRpb25hbCgnOycsIHRocm93VG9rZW4ubmV4dCkpIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGludGVyY2VwdCB0aGUgcGFyc2VFeHByZXNzaW9uCiAgICAgIC8vIHJlY292ZXJ5IHRvIGdlbmVyYXRlIHRoaXMgZXJyb3IgbWVzc2FnZSByYXRoZXIgdGhhbiBleHBsaWNpdGx5CiAgICAgIC8vIGNoZWNraW5nIHRoZSBuZXh0IHRva2VuIGFzIHdlIGFyZSBkb2luZyBoZXJlLgogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgdGhyb3dUb2tlbi5uZXh0LCBjb2Rlcy5tZXNzYWdlTWlzc2luZ0V4cHJlc3Npb25JblRocm93KTsKICAgICAgcmV3cml0ZXIuaW5zZXJ0VG9rZW4oCiAgICAgICAgICB0aHJvd1Rva2VuLAogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgICAgICAgIFRva2VuVHlwZS5TVFJJTkcsICciIicsIHRocm93VG9rZW4ubmV4dC5jaGFyT2Zmc2V0LCAwKSk7CiAgICB9CiAgICB0b2tlbiA9IGFsbG93Q2FzY2FkZXMKICAgICAgICA/IHBhcnNlRXhwcmVzc2lvbih0aHJvd1Rva2VuKQogICAgICAgIDogcGFyc2VFeHByZXNzaW9uV2l0aG91dENhc2NhZGUodGhyb3dUb2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVUaHJvd0V4cHJlc3Npb24odGhyb3dUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIHJldGhyb3dTdGF0ZW1lbnQ6CiAgLy8vICAgJ3JldGhyb3cnICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlUmV0aHJvd1N0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gdGhyb3dUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3JldGhyb3cnLCB0aHJvd1Rva2VuKSk7CiAgICBsaXN0ZW5lci5iZWdpblJldGhyb3dTdGF0ZW1lbnQodGhyb3dUb2tlbik7CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0aHJvd1Rva2VuKTsKICAgIGxpc3RlbmVyLmVuZFJldGhyb3dTdGF0ZW1lbnQodGhyb3dUb2tlbiwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyB0cnlTdGF0ZW1lbnQ6CiAgLy8vICAgJ3RyeScgYmxvY2sgKG9uUGFydCsgZmluYWxseVBhcnQ/IHwgZmluYWxseVBhcnQpCiAgLy8vIDsKICAvLy8KICAvLy8gb25QYXJ0OgogIC8vLyAgIGNhdGNoUGFydCBibG9jayB8CiAgLy8vICAgJ29uJyB0eXBlIGNhdGNoUGFydD8gYmxvY2sKICAvLy8gOwogIC8vLwogIC8vLyBjYXRjaFBhcnQ6CiAgLy8vICAgJ2NhdGNoJyAnKCcgaWRlbnRpZmllciAoJywnIGlkZW50aWZpZXIpPyAnKScKICAvLy8gOwogIC8vLwogIC8vLyBmaW5hbGx5UGFydDoKICAvLy8gICAnZmluYWxseScgYmxvY2sKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVRyeVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gdHJ5S2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ3RyeScsIHRyeUtleXdvcmQpKTsKICAgIGxpc3RlbmVyLmJlZ2luVHJ5U3RhdGVtZW50KHRyeUtleXdvcmQpOwogICAgVG9rZW4gbGFzdENvbnN1bWVkID0gcGFyc2VCbG9jayh0cnlLZXl3b3JkLCBCbG9ja0tpbmQudHJ5U3RhdGVtZW50KTsKICAgIHRva2VuID0gbGFzdENvbnN1bWVkLm5leHQ7CiAgICBpbnQgY2F0Y2hDb3VudCA9IDA7CgogICAgU3RyaW5nIHZhbHVlID0gdG9rZW4uc3RyaW5nVmFsdWU7CiAgICB3aGlsZSAoaWRlbnRpY2FsKHZhbHVlLCAnY2F0Y2gnKSB8fCBpZGVudGljYWwodmFsdWUsICdvbicpKSB7CiAgICAgIGxpc3RlbmVyLmJlZ2luQ2F0Y2hDbGF1c2UodG9rZW4pOwogICAgICBUb2tlbiBvbktleXdvcmQgPSBudWxsOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnb24nKSkgewogICAgICAgIC8vICdvbicgdHlwZSBjYXRjaFBhcnQ/CiAgICAgICAgb25LZXl3b3JkID0gdG9rZW47CiAgICAgICAgbGFzdENvbnN1bWVkID0gY29tcHV0ZVR5cGUodG9rZW4sIHRydWUpLmVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCB0aGlzKTsKICAgICAgICB0b2tlbiA9IGxhc3RDb25zdW1lZC5uZXh0OwogICAgICAgIHZhbHVlID0gdG9rZW4uc3RyaW5nVmFsdWU7CiAgICAgIH0KICAgICAgVG9rZW4gY2F0Y2hLZXl3b3JkID0gbnVsbDsKICAgICAgVG9rZW4gY29tbWEgPSBudWxsOwogICAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnY2F0Y2gnKSkgewogICAgICAgIGNhdGNoS2V5d29yZCA9IHRva2VuOwoKICAgICAgICBUb2tlbiBvcGVuUGFyZW5zID0gY2F0Y2hLZXl3b3JkLm5leHQ7CiAgICAgICAgaWYgKCFvcHRpb25hbCgiKCIsIG9wZW5QYXJlbnMpKSB7CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKG9wZW5QYXJlbnMsIGNvZGVzLm1lc3NhZ2VDYXRjaFN5bnRheCk7CiAgICAgICAgICBvcGVuUGFyZW5zID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKGNhdGNoS2V5d29yZCwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBUb2tlbiBleGNlcHRpb25OYW1lID0gb3BlblBhcmVucy5uZXh0OwogICAgICAgIGlmIChleGNlcHRpb25OYW1lLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTikgewogICAgICAgICAgZXhjZXB0aW9uTmFtZSA9IElkZW50aWZpZXJDb250ZXh0LmNhdGNoUGFyYW1ldGVyCiAgICAgICAgICAgICAgLmVuc3VyZUlkZW50aWZpZXIob3BlblBhcmVucywgdGhpcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9uYWwoIikiLCBleGNlcHRpb25OYW1lLm5leHQpKSB7CiAgICAgICAgICAvLyBPSzogYGNhdGNoIChpZGVudGlmaWVyKWAuCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbW1hID0gZXhjZXB0aW9uTmFtZS5uZXh0OwogICAgICAgICAgaWYgKCFvcHRpb25hbCgiLCIsIGNvbW1hKSkgewogICAgICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgICAgICBpZiAoIWV4Y2VwdGlvbk5hbWUuaXNTeW50aGV0aWMpIHsKICAgICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKGNvbW1hLCBjb2Rlcy5tZXNzYWdlQ2F0Y2hTeW50YXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgaW5zZXJ0aW5nIGBvbmAgY2xhdXNlIGlmCiAgICAgICAgICAgIC8vIGV4Y2VwdGlvbk5hbWUgaXMgcHJlY2VkZWQgYnkgdHlwZSBhbmQgZm9sbG93ZWQgYnkgYSBjb21tYS4KICAgICAgICAgICAgLy8gVGhlbiB0aGlzCiAgICAgICAgICAgIC8vICAgfSBjYXRjaCAoRSBlLCB0KSB7CiAgICAgICAgICAgIC8vIHdpbGwgcmVjb3ZlciB0bwogICAgICAgICAgICAvLyAgIH0gb24gRSBjYXRjaCAoZSwgdCkgewogICAgICAgICAgICAvLyB3aXRoIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gZm9yIHRoZSB1c2VyIGluIHRoZSBlcnJvcgogICAgICAgICAgICAvLyBpbmRpY2F0aW5nIHdoYXQgdGhleSBzaG91bGQgZG8gdG8gZml4IHRoZSBjb2RlLgoKICAgICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGluc2VydGluZyBzeW50aGV0aWMgaWRlbnRpZmllciBpZgogICAgICAgICAgICAvLyBleGNlcHRpb25OYW1lIGlzIGEgbm9uLXN5bnRoZXRpYyBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5IGAuYC4KICAgICAgICAgICAgLy8gVGhlbiB0aGlzCiAgICAgICAgICAgIC8vICAgfSBjYXRjaCAoCiAgICAgICAgICAgIC8vICAgZS5mKCk7CiAgICAgICAgICAgIC8vIHdpbGwgcmVjb3ZlciB0bwogICAgICAgICAgICAvLyAgIH0gY2F0Y2ggKF9zXykge30KICAgICAgICAgICAgLy8gICBlLmYoKTsKICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4KICAgICAgICAgICAgLy8gICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAvLyAgIF9zXy5mKCk7CgogICAgICAgICAgICBpZiAob3BlblBhcmVucy5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnKScgY29ycmVjdGx5LgogICAgICAgICAgICAgIHJld3JpdGVyLm1vdmVTeW50aGV0aWMoZXhjZXB0aW9uTmFtZSwgb3BlblBhcmVucy5lbmRHcm91cCk7CiAgICAgICAgICAgICAgY29tbWEgPSBudWxsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbW1hID0KICAgICAgICAgICAgICAgICAgcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljVG9rZW4oZXhjZXB0aW9uTmFtZSwgVG9rZW5UeXBlLkNPTU1BKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbW1hICE9IG51bGwpIHsKICAgICAgICAgICAgVG9rZW4gdHJhY2VOYW1lID0gY29tbWEubmV4dDsKICAgICAgICAgICAgaWYgKHRyYWNlTmFtZS5raW5kICE9IElERU5USUZJRVJfVE9LRU4pIHsKICAgICAgICAgICAgICB0cmFjZU5hbWUgPSBJZGVudGlmaWVyQ29udGV4dC5jYXRjaFBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAuZW5zdXJlSWRlbnRpZmllcihjb21tYSwgdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFvcHRpb25hbCgiKSIsIHRyYWNlTmFtZS5uZXh0KSkgewogICAgICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICAgICAgaWYgKCF0cmFjZU5hbWUuaXNTeW50aGV0aWMpIHsKICAgICAgICAgICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgdHJhY2VOYW1lLm5leHQsIGNvZGVzLm1lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVycyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChvcGVuUGFyZW5zLmVuZEdyb3VwLmlzU3ludGhldGljKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgc2Nhbm5lciBkaWQgbm90IHBsYWNlIHRoZSBzeW50aGV0aWMgJyknIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgIHJld3JpdGVyLm1vdmVTeW50aGV0aWModHJhY2VOYW1lLCBvcGVuUGFyZW5zLmVuZEdyb3VwKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGFzdENvbnN1bWVkID0gcGFyc2VGb3JtYWxQYXJhbWV0ZXJzKGNhdGNoS2V5d29yZCwgTWVtYmVyS2luZC5DYXRjaCk7CiAgICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWQubmV4dDsKICAgICAgfQogICAgICBsaXN0ZW5lci5lbmRDYXRjaENsYXVzZSh0b2tlbik7CiAgICAgIGxhc3RDb25zdW1lZCA9IHBhcnNlQmxvY2sobGFzdENvbnN1bWVkLCBCbG9ja0tpbmQuY2F0Y2hDbGF1c2UpOwogICAgICB0b2tlbiA9IGxhc3RDb25zdW1lZC5uZXh0OwogICAgICArK2NhdGNoQ291bnQ7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUNhdGNoQmxvY2sob25LZXl3b3JkLCBjYXRjaEtleXdvcmQsIGNvbW1hKTsKICAgICAgdmFsdWUgPSB0b2tlbi5zdHJpbmdWYWx1ZTsgLy8gd2hpbGUgY29uZGl0aW9uCiAgICB9CgogICAgVG9rZW4gZmluYWxseUtleXdvcmQgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCdmaW5hbGx5JywgdG9rZW4pKSB7CiAgICAgIGZpbmFsbHlLZXl3b3JkID0gdG9rZW47CiAgICAgIGxhc3RDb25zdW1lZCA9IHBhcnNlQmxvY2sodG9rZW4sIEJsb2NrS2luZC5maW5hbGx5Q2xhdXNlKTsKICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWQubmV4dDsKICAgICAgbGlzdGVuZXIuaGFuZGxlRmluYWxseUJsb2NrKGZpbmFsbHlLZXl3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjYXRjaENvdW50ID09IDApIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRyeUtleXdvcmQsIGNvZGVzLm1lc3NhZ2VPbmx5VHJ5KTsKICAgICAgfQogICAgfQogICAgbGlzdGVuZXIuZW5kVHJ5U3RhdGVtZW50KGNhdGNoQ291bnQsIHRyeUtleXdvcmQsIGZpbmFsbHlLZXl3b3JkKTsKICAgIHJldHVybiBsYXN0Q29uc3VtZWQ7CiAgfQoKICAvLy8gYGBgCiAgLy8vIHN3aXRjaFN0YXRlbWVudDoKICAvLy8gICAnc3dpdGNoJyBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzd2l0Y2hCbG9jawogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlU3dpdGNoU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBzd2l0Y2hLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnc3dpdGNoJywgc3dpdGNoS2V5d29yZCkpOwogICAgbGlzdGVuZXIuYmVnaW5Td2l0Y2hTdGF0ZW1lbnQoc3dpdGNoS2V5d29yZCk7CiAgICB0b2tlbiA9IGVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oc3dpdGNoS2V5d29yZCk7CiAgICBMb29wU3RhdGUgc2F2ZWRMb29wU3RhdGUgPSBsb29wU3RhdGU7CiAgICBpZiAobG9vcFN0YXRlID09IExvb3BTdGF0ZS5PdXRzaWRlTG9vcCkgewogICAgICBsb29wU3RhdGUgPSBMb29wU3RhdGUuSW5zaWRlU3dpdGNoOwogICAgfQogICAgdG9rZW4gPSBwYXJzZVN3aXRjaEJsb2NrKHRva2VuKTsKICAgIGxvb3BTdGF0ZSA9IHNhdmVkTG9vcFN0YXRlOwogICAgbGlzdGVuZXIuZW5kU3dpdGNoU3RhdGVtZW50KHN3aXRjaEtleXdvcmQsIHRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBgYGAKICAvLy8gc3dpdGNoQmxvY2s6CiAgLy8vICAgJ3snIHN3aXRjaENhc2UqIGRlZmF1bHRDYXNlPyAnfScKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZVN3aXRjaEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBiZWdpblN3aXRjaCA9IHRva2VuID0gZW5zdXJlQmxvY2sodG9rZW4sIG51bGwsICdzd2l0Y2ggc3RhdGVtZW50Jyk7CiAgICBsaXN0ZW5lci5iZWdpblN3aXRjaEJsb2NrKGJlZ2luU3dpdGNoKTsKICAgIGludCBjYXNlQ291bnQgPSAwOwogICAgVG9rZW4gZGVmYXVsdEtleXdvcmQgPSBudWxsOwogICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQgPSBudWxsOwogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCB0b2tlbi5uZXh0KSkgewogICAgICBUb2tlbiBiZWdpbkNhc2UgPSB0b2tlbi5uZXh0OwogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50ID0gMDsKICAgICAgaW50IGxhYmVsQ291bnQgPSAwOwogICAgICBUb2tlbiBwZWVrID0gcGVla1Bhc3RMYWJlbHMoYmVnaW5DYXNlKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAvLyBMb29wIHVudGlsIHdlIGZpbmQgc29tZXRoaW5nIHRoYXQgY2FuJ3QgYmUgcGFydCBvZiBhIHN3aXRjaCBjYXNlLgogICAgICAgIFN0cmluZyB2YWx1ZSA9IHBlZWsuc3RyaW5nVmFsdWU7CiAgICAgICAgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ2RlZmF1bHQnKSkgewogICAgICAgICAgd2hpbGUgKCFpZGVudGljYWwodG9rZW4ubmV4dCwgcGVlaykpIHsKICAgICAgICAgICAgdG9rZW4gPSBwYXJzZUxhYmVsKHRva2VuKTsKICAgICAgICAgICAgbGFiZWxDb3VudCsrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmF1bHRLZXl3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICAgIHRva2VuLm5leHQsIGNvZGVzLm1lc3NhZ2VTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzKTsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHRLZXl3b3JkID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGNvbG9uQWZ0ZXJEZWZhdWx0ID0gdG9rZW4gPSBlbnN1cmVDb2xvbihkZWZhdWx0S2V5d29yZCk7CiAgICAgICAgICBwZWVrID0gdG9rZW4ubmV4dDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnY2FzZScpKSB7CiAgICAgICAgICB3aGlsZSAoIWlkZW50aWNhbCh0b2tlbi5uZXh0LCBwZWVrKSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcnNlTGFiZWwodG9rZW4pOwogICAgICAgICAgICBsYWJlbENvdW50Kys7CiAgICAgICAgICB9CiAgICAgICAgICBUb2tlbiBjYXNlS2V5d29yZCA9IHRva2VuLm5leHQ7CiAgICAgICAgICBpZiAoZGVmYXVsdEtleXdvcmQgIT0gbnVsbCkgewogICAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgICAgY2FzZUtleXdvcmQsIGNvZGVzLm1lc3NhZ2VTd2l0Y2hIYXNDYXNlQWZ0ZXJEZWZhdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RlbmVyLmJlZ2luQ2FzZUV4cHJlc3Npb24oY2FzZUtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24oY2FzZUtleXdvcmQpOwogICAgICAgICAgdG9rZW4gPSBlbnN1cmVDb2xvbih0b2tlbik7CiAgICAgICAgICBsaXN0ZW5lci5lbmRDYXNlRXhwcmVzc2lvbih0b2tlbik7CiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVDYXNlTWF0Y2goY2FzZUtleXdvcmQsIHRva2VuKTsKICAgICAgICAgIGV4cHJlc3Npb25Db3VudCsrOwogICAgICAgICAgcGVlayA9IHBlZWtQYXN0TGFiZWxzKHRva2VuLm5leHQpOwogICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbkNvdW50ID4gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHBlZWssIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKCJjYXNlIikpOwogICAgICAgICAgVG9rZW4gZW5kR3JvdXAgPSBiZWdpblN3aXRjaC5lbmRHcm91cDsKICAgICAgICAgIHdoaWxlICh0b2tlbi5uZXh0ICE9IGVuZEdyb3VwKSB7CiAgICAgICAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgICAgIH0KICAgICAgICAgIHBlZWsgPSBwZWVrUGFzdExhYmVscyh0b2tlbi5uZXh0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlU3RhdGVtZW50c0luU3dpdGNoQ2FzZSh0b2tlbiwgcGVlaywgYmVnaW5DYXNlLCBsYWJlbENvdW50LAogICAgICAgICAgZXhwcmVzc2lvbkNvdW50LCBkZWZhdWx0S2V5d29yZCwgY29sb25BZnRlckRlZmF1bHQpOwogICAgICArK2Nhc2VDb3VudDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGxpc3RlbmVyLmVuZFN3aXRjaEJsb2NrKGNhc2VDb3VudCwgYmVnaW5Td2l0Y2gsIHRva2VuKTsKICAgIGFzc2VydCh0b2tlbi5pc0VvZiB8fCBvcHRpb25hbCgnfScsIHRva2VuKSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGVlayBhZnRlciB0aGUgZm9sbG93aW5nIGxhYmVscyAoaWYgYW55KS4gVGhlIGZvbGxvd2luZyB0b2tlbgogIC8vLyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGFiZWxzIGJlbG9uZyB0byBhIHN0YXRlbWVudCBvciBhCiAgLy8vIHN3aXRjaCBjYXNlLgogIFRva2VuIHBlZWtQYXN0TGFiZWxzKFRva2VuIHRva2VuKSB7CiAgICB3aGlsZSAodG9rZW4uaXNJZGVudGlmaWVyICYmIG9wdGlvbmFsKCc6JywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2Ugc3RhdGVtZW50cyBhZnRlciBhIHN3aXRjaCBgY2FzZTpgIG9yIGBkZWZhdWx0OmAuCiAgVG9rZW4gcGFyc2VTdGF0ZW1lbnRzSW5Td2l0Y2hDYXNlKAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgVG9rZW4gcGVlaywKICAgICAgVG9rZW4gYmVnaW4sCiAgICAgIGludCBsYWJlbENvdW50LAogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50LAogICAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCwKICAgICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQpIHsKICAgIGxpc3RlbmVyLmJlZ2luU3dpdGNoQ2FzZShsYWJlbENvdW50LCBleHByZXNzaW9uQ291bnQsIGJlZ2luKTsKICAgIC8vIEZpbmFsbHkgemVybyBvciBtb3JlIHN0YXRlbWVudHMuCiAgICBpbnQgc3RhdGVtZW50Q291bnQgPSAwOwogICAgd2hpbGUgKCFpZGVudGljYWwodG9rZW4ubmV4dC5raW5kLCBFT0ZfVE9LRU4pKSB7CiAgICAgIFN0cmluZyB2YWx1ZSA9IHBlZWsuc3RyaW5nVmFsdWU7CiAgICAgIGlmICgoaWRlbnRpY2FsKHZhbHVlLCAnY2FzZScpKSB8fAogICAgICAgICAgKGlkZW50aWNhbCh2YWx1ZSwgJ2RlZmF1bHQnKSkgfHwKICAgICAgICAgICgoaWRlbnRpY2FsKHZhbHVlLCAnfScpKSAmJiAoaWRlbnRpY2FsKHRva2VuLm5leHQsIHBlZWspKSkpIHsKICAgICAgICAvLyBBIGxhYmVsIGp1c3QgYmVmb3JlICJ9IiB3aWxsIGJlIGhhbmRsZWQgYXMgYSBzdGF0ZW1lbnQgZXJyb3IuCiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgVG9rZW4gc3RhcnRUb2tlbiA9IHRva2VuLm5leHQ7CiAgICAgICAgdG9rZW4gPSBwYXJzZVN0YXRlbWVudCh0b2tlbik7CiAgICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKGlkZW50aWNhbChuZXh0LCBzdGFydFRva2VuKSkgewogICAgICAgICAgLy8gTm8gcHJvZ3Jlc3Mgd2FzIG1hZGUsIHNvIHdlIHJlcG9ydCB0aGUgY3VycmVudCB0b2tlbiBhcyBiZWluZwogICAgICAgICAgLy8gaW52YWxpZCBhbmQgbW92ZSBmb3J3YXJkLgogICAgICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbi53aXRoQXJndW1lbnRzKG5leHQpKTsKICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgKytzdGF0ZW1lbnRDb3VudDsKICAgICAgfQogICAgICBwZWVrID0gcGVla1Bhc3RMYWJlbHModG9rZW4ubmV4dCk7CiAgICB9CiAgICBsaXN0ZW5lci5lbmRTd2l0Y2hDYXNlKGxhYmVsQ291bnQsIGV4cHJlc3Npb25Db3VudCwgZGVmYXVsdEtleXdvcmQsCiAgICAgICAgY29sb25BZnRlckRlZmF1bHQsIHN0YXRlbWVudENvdW50LCBiZWdpbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGJyZWFrU3RhdGVtZW50OgogIC8vLyAgICdicmVhaycgaWRlbnRpZmllcj8gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VCcmVha1N0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gYnJlYWtLZXl3b3JkID0gdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdicmVhaycsIGJyZWFrS2V5d29yZCkpOwogICAgYm9vbCBoYXNUYXJnZXQgPSBmYWxzZTsKICAgIGlmICh0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikgewogICAgICB0b2tlbiA9IGVuc3VyZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LmxhYmVsUmVmZXJlbmNlKTsKICAgICAgaGFzVGFyZ2V0ID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoIWlzQnJlYWtBbGxvd2VkKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYnJlYWtLZXl3b3JkLCBjb2Rlcy5tZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wKTsKICAgIH0KICAgIHRva2VuID0gZW5zdXJlU2VtaWNvbG9uKHRva2VuKTsKICAgIGxpc3RlbmVyLmhhbmRsZUJyZWFrU3RhdGVtZW50KGhhc1RhcmdldCwgYnJlYWtLZXl3b3JkLCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGFzc2VydGlvbjoKICAvLy8gICAnYXNzZXJ0JyAnKCcgZXhwcmVzc2lvbiAoJywnIGV4cHJlc3Npb24pPyAnLCc/ICcpJwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQXNzZXJ0KFRva2VuIHRva2VuLCBBc3NlcnQga2luZCkgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdhc3NlcnQnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuYmVnaW5Bc3NlcnQodG9rZW4sIGtpbmQpOwogICAgVG9rZW4gYXNzZXJ0S2V5d29yZCA9IHRva2VuOwogICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzID0gdG9rZW4ubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJygnLCBsZWZ0UGFyZW50aGVzaXMpKSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBsZWZ0UGFyZW50aGVzaXMsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRCdXRHb3Qud2l0aEFyZ3VtZW50cygnKCcpKTsKICAgICAgbGVmdFBhcmVudGhlc2lzID0gcmV3cml0ZXIuaW5zZXJ0UGFyZW5zKHRva2VuLCB0cnVlKTsKICAgIH0KICAgIHRva2VuID0gbGVmdFBhcmVudGhlc2lzOwogICAgVG9rZW4gY29tbWFUb2tlbiA9IG51bGw7CiAgICBib29sIG9sZCA9IG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uczsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IHRydWU7CgogICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgaWYgKG9wdGlvbmFsKCcsJywgdG9rZW4ubmV4dCkpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBpZiAoIW9wdGlvbmFsKCcpJywgdG9rZW4ubmV4dCkpIHsKICAgICAgICBjb21tYVRva2VuID0gdG9rZW47CiAgICAgICAgdG9rZW4gPSBwYXJzZUV4cHJlc3Npb24odG9rZW4pOwogICAgICAgIGlmIChvcHRpb25hbCgnLCcsIHRva2VuLm5leHQpKSB7CiAgICAgICAgICAvLyBUcmFpbGluZyBjb21tYSBpcyBpZ25vcmVkLgogICAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFRva2VuIGVuZEdyb3VwID0gbGVmdFBhcmVudGhlc2lzLmVuZEdyb3VwOwogICAgaWYgKHRva2VuLm5leHQgPT0gZW5kR3JvdXApIHsKICAgICAgdG9rZW4gPSBlbmRHcm91cDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlY292ZXJ5CiAgICAgIGlmIChlbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICAgIC8vIFRoZSBzY2FubmVyIGRpZCBub3QgcGxhY2UgdGhlIHN5bnRoZXRpYyAnKScgY29ycmVjdGx5LCBzbyBtb3ZlIGl0LgogICAgICAgIHRva2VuID0gcmV3cml0ZXIubW92ZVN5bnRoZXRpYyh0b2tlbiwgZW5kR3JvdXApOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIHRva2VuLm5leHQsIGNvZGVzLnRlbXBsYXRlVW5leHBlY3RlZFRva2VuKTsKICAgICAgICB0b2tlbiA9IGVuZEdyb3VwOwogICAgICB9CiAgICB9CgogICAgYXNzZXJ0KG9wdGlvbmFsKCcpJywgdG9rZW4pKTsKICAgIG1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9ucyA9IG9sZDsKICAgIGlmIChraW5kID09IEFzc2VydC5FeHByZXNzaW9uKSB7CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3IoYXNzZXJ0S2V5d29yZCwgY29kZXMubWVzc2FnZUFzc2VydEFzRXhwcmVzc2lvbik7CiAgICB9IGVsc2UgaWYgKGtpbmQgPT0gQXNzZXJ0LlN0YXRlbWVudCkgewogICAgICBlbnN1cmVTZW1pY29sb24odG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuZW5kQXNzZXJ0KAogICAgICAgIGFzc2VydEtleXdvcmQsIGtpbmQsIGxlZnRQYXJlbnRoZXNpcywgY29tbWFUb2tlbiwgdG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gYGBgCiAgLy8vIGFzc2VydFN0YXRlbWVudDoKICAvLy8gICBhc3NlcnRpb24gJzsnCiAgLy8vIDsKICAvLy8gYGBgCiAgVG9rZW4gcGFyc2VBc3NlcnRTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgnYXNzZXJ0JywgdG9rZW4ubmV4dCkpOwogICAgLy8gcGFyc2VBc3NlcnQgZW5zdXJlcyB0aGF0IHRoZXJlIGlzIGEgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgcmV0dXJuIHBhcnNlQXNzZXJ0KHRva2VuLCBBc3NlcnQuU3RhdGVtZW50KS5uZXh0OwogIH0KCiAgLy8vIGBgYAogIC8vLyBjb250aW51ZVN0YXRlbWVudDoKICAvLy8gICAnY29udGludWUnIGlkZW50aWZpZXI/ICc7JwogIC8vLyA7CiAgLy8vIGBgYAogIFRva2VuIHBhcnNlQ29udGludWVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGNvbnRpbnVlS2V5d29yZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnY29udGludWUnLCBjb250aW51ZUtleXdvcmQpKTsKICAgIGJvb2wgaGFzVGFyZ2V0ID0gZmFsc2U7CiAgICBpZiAodG9rZW4ubmV4dC5pc0lkZW50aWZpZXIpIHsKICAgICAgdG9rZW4gPSBlbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5sYWJlbFJlZmVyZW5jZSk7CiAgICAgIGhhc1RhcmdldCA9IHRydWU7CiAgICAgIGlmICghaXNDb250aW51ZVdpdGhMYWJlbEFsbG93ZWQpIHsKICAgICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBjb250aW51ZUtleXdvcmQsIGNvZGVzLm1lc3NhZ2VDb250aW51ZU91dHNpZGVPZkxvb3ApOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFpc0NvbnRpbnVlQWxsb3dlZCkgewogICAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgY29udGludWVLZXl3b3JkLAogICAgICAgICAgbG9vcFN0YXRlID09IExvb3BTdGF0ZS5JbnNpZGVTd2l0Y2gKICAgICAgICAgICAgICA/IGNvZGVzLm1lc3NhZ2VDb250aW51ZVdpdGhvdXRMYWJlbEluQ2FzZQogICAgICAgICAgICAgIDogY29kZXMubWVzc2FnZUNvbnRpbnVlT3V0c2lkZU9mTG9vcCk7CiAgICB9CiAgICB0b2tlbiA9IGVuc3VyZVNlbWljb2xvbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVDb250aW51ZVN0YXRlbWVudChoYXNUYXJnZXQsIGNvbnRpbnVlS2V5d29yZCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIGBgYAogIC8vLyBlbXB0eVN0YXRlbWVudDoKICAvLy8gICAnOycKICAvLy8gOwogIC8vLyBgYGAKICBUb2tlbiBwYXJzZUVtcHR5U3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzsnLCB0b2tlbikpOwogICAgbGlzdGVuZXIuaGFuZGxlRW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIEdpdmVuIGEgdG9rZW4gKFtiZWZvcmVUb2tlbl0pIHRoYXQgaXMga25vd24gdG8gYmUgYmVmb3JlIGFub3RoZXIgW3Rva2VuXSwKICAvLy8gcmV0dXJuIHRoZSB0b2tlbiB0aGF0IGlzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgW3Rva2VuXS4KICBUb2tlbiBwcmV2aW91c1Rva2VuKFRva2VuIGJlZm9yZVRva2VuLCBUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IGJlZm9yZVRva2VuLm5leHQ7CiAgICB3aGlsZSAobmV4dCAhPSB0b2tlbiAmJiBuZXh0ICE9IGJlZm9yZVRva2VuKSB7CiAgICAgIGJlZm9yZVRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IGJlZm9yZVRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gYmVmb3JlVG9rZW47CiAgfQoKICAvLy8gUmVjb3ZlciBmcm9tIGZpbmRpbmcgYW4gb3BlcmF0b3IgZGVjbGFyYXRpb24gbWlzc2luZyB0aGUgYG9wZXJhdG9yYAogIC8vLyBrZXl3b3JkLiBUaGUgbWV0YWRhdGEgZm9yIHRoZSBtZW1iZXIsIGlmIGFueSwgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQKICAvLy8gKGFuZCBldmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkKS4KICBUb2tlbiBwYXJzZUludmFsaWRPcGVyYXRvckRlY2xhcmF0aW9uKAogICAgICBUb2tlbiBiZWZvcmVTdGFydCwKICAgICAgVG9rZW4gZXh0ZXJuYWxUb2tlbiwKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgVG9rZW4gYmVmb3JlVHlwZSwKICAgICAgRGVjbGFyYXRpb25LaW5kIGtpbmQsCiAgICAgIFN0cmluZyBlbmNsb3NpbmdEZWNsYXJhdGlvbk5hbWUpIHsKICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUoYmVmb3JlU3RhcnQsIGZhbHNlLCB0cnVlKTsKICAgIFRva2VuIGJlZm9yZU5hbWUgPSB0eXBlSW5mby5za2lwVHlwZShiZWZvcmVUeXBlKTsKICAgIFRva2VuIG5leHQgPSBiZWZvcmVOYW1lLm5leHQ7CgogICAgaWYgKG9wdGlvbmFsKCdvcGVyYXRvcicsIG5leHQpKSB7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICB9IGVsc2UgewogICAgICAvLyBUaGUgJ29wZXJhdG9yJyBrZXl3b3JkIGlzIG1pc3NpbmcsIGJ1dCB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHlwZQogICAgICAvLyBiZWZvcmUgdGhlIHRva2VuIHRoYXQgaXMgdGhlIGFjdHVhbCBvcGVyYXRvci4KICAgICAgVG9rZW4gb3BlcmF0b3IgPSBuZXh0OwogICAgICBpZiAoIW5leHQuaXNPcGVyYXRvciAmJiBuZXh0Lm5leHQuaXNPcGVyYXRvcikgewogICAgICAgIGJlZm9yZU5hbWUgPSBuZXh0OwogICAgICAgIG9wZXJhdG9yID0gbmV4dC5uZXh0OwogICAgICB9CiAgICAgIHJlcG9ydFJlY292ZXJhYmxlRXJyb3Iob3BlcmF0b3IsIGNvZGVzLm1lc3NhZ2VNaXNzaW5nT3BlcmF0b3JLZXl3b3JkKTsKICAgICAgcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljS2V5d29yZChiZWZvcmVOYW1lLCBLZXl3b3JkLk9QRVJBVE9SKTsKCiAgICAgIC8vIEhhdmluZyBpbnNlcnRlZCB0aGUga2V5d29yZCB0aGUgdHlwZSBub3cgcG9zc2libHkgY29tcHV0ZSBkaWZmZXJlbnRseS4KICAgICAgdHlwZUluZm8gPSBjb21wdXRlVHlwZShiZWZvcmVTdGFydCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIGJlZm9yZU5hbWUgPSB0eXBlSW5mby5za2lwVHlwZShiZWZvcmVUeXBlKTsKICAgICAgbmV4dCA9IGJlZm9yZU5hbWUubmV4dDsKCiAgICAgIC8vIFRoZSAnbmV4dCcgdG9rZW4gY2FuIGJlIHRoZSBqdXN0LWluc2VydGVkICdvcGVyYXRvcicga2V5d29yZC4KICAgICAgLy8gSWYgaXQgaXMsIGNoYW5nZSBpdCBzbyBpdCBwb2ludHMgdG8gdGhlIGFjdHVhbCBvcGVyYXRvci4KICAgICAgaWYgKCFuZXh0LmlzT3BlcmF0b3IgJiYKICAgICAgICAgIG5leHQubmV4dC5pc09wZXJhdG9yICYmCiAgICAgICAgICBpZGVudGljYWwobmV4dC5zdHJpbmdWYWx1ZSwgJ29wZXJhdG9yJykpIHsKICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICB9CiAgICB9CgogICAgYXNzZXJ0KChuZXh0LmlzT3BlcmF0b3IgJiYgbmV4dC5lbmRHcm91cCA9PSBudWxsKSB8fAogICAgICAgIG9wdGlvbmFsKCc9PT0nLCBuZXh0KSB8fAogICAgICAgIG9wdGlvbmFsKCchPT0nLCBuZXh0KSk7CgogICAgVG9rZW4gdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICBiZWZvcmVTdGFydCwKICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgIGNvdmFyaWFudFRva2VuLAogICAgICAgIGxhdGVUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgYmVmb3JlVHlwZSwKICAgICAgICB0eXBlSW5mbywKICAgICAgICBudWxsLAogICAgICAgIGJlZm9yZU5hbWUubmV4dCwKICAgICAgICBraW5kLAogICAgICAgIGVuY2xvc2luZ0RlY2xhcmF0aW9uTmFtZSk7CiAgICBsaXN0ZW5lci5lbmRNZW1iZXIoKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBSZWNvdmVyIGZyb20gZmluZGluZyBhbiBpbnZhbGlkIGNsYXNzIG1lbWJlci4gVGhlIG1ldGFkYXRhIGZvciB0aGUgbWVtYmVyLAogIC8vLyBpZiBhbnksIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkIChhbmQgZXZlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCkuCiAgLy8vIFRoZSBtZW1iZXIgd2FzIGV4cGVjdGVkIHRvIHN0YXJ0IHdpdGggdGhlIHRva2VuIGFmdGVyIFt0b2tlbl0uCiAgVG9rZW4gcmVjb3ZlckZyb21JbnZhbGlkTWVtYmVyKAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgVG9rZW4gYmVmb3JlU3RhcnQsCiAgICAgIFRva2VuIGV4dGVybmFsVG9rZW4sCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIFRva2VuIGJlZm9yZVR5cGUsCiAgICAgIFR5cGVJbmZvIHR5cGVJbmZvLAogICAgICBUb2tlbiBnZXRPclNldCwKICAgICAgRGVjbGFyYXRpb25LaW5kIGtpbmQsCiAgICAgIFN0cmluZyBlbmNsb3NpbmdEZWNsYXJhdGlvbk5hbWUpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgU3RyaW5nIHZhbHVlID0gbmV4dC5zdHJpbmdWYWx1ZTsKCiAgICBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnY2xhc3MnKSkgewogICAgICByZXR1cm4gcmVwb3J0QW5kU2tpcENsYXNzSW5DbGFzcyhuZXh0KTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKHZhbHVlLCAnZW51bScpKSB7CiAgICAgIHJldHVybiByZXBvcnRBbmRTa2lwRW51bUluQ2xhc3MobmV4dCk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCh2YWx1ZSwgJ3R5cGVkZWYnKSkgewogICAgICByZXR1cm4gcmVwb3J0QW5kU2tpcFR5cGVkZWZJbkNsYXNzKG5leHQpOwogICAgfSBlbHNlIGlmIChuZXh0LmlzT3BlcmF0b3IgJiYgbmV4dC5lbmRHcm91cCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBwYXJzZUludmFsaWRPcGVyYXRvckRlY2xhcmF0aW9uKAogICAgICAgICAgYmVmb3JlU3RhcnQsCiAgICAgICAgICBleHRlcm5hbFRva2VuLAogICAgICAgICAgc3RhdGljVG9rZW4sCiAgICAgICAgICBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICAgIGxhdGVUb2tlbiwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwKICAgICAgICAgIGJlZm9yZVR5cGUsCiAgICAgICAgICBraW5kLAogICAgICAgICAgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKTsKICAgIH0KCiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJygnKSB8fAogICAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz0+JykgfHwKICAgICAgICBpZGVudGljYWwodmFsdWUsICd7JykpIHsKICAgICAgdG9rZW4gPSBwYXJzZU1ldGhvZCgKICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICBsYXRlVG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICBnZXRPclNldCwKICAgICAgICAgIHRva2VuLm5leHQsCiAgICAgICAgICBraW5kLAogICAgICAgICAgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKTsKICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gYmVmb3JlU3RhcnQpIHsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IFByb3ZpZGUgYSBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgZm9yIGV4dHJhICc7Jy4KICAgICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NNZW1iZXIpOwogICAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkTWVtYmVyKG5leHQpOwogICAgICBpZiAoIWlkZW50aWNhbCh2YWx1ZSwgJ30nKSkgewogICAgICAgIC8vIEVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzLgogICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdG9rZW4gPSBwYXJzZUZpZWxkcygKICAgICAgICAgIGJlZm9yZVN0YXJ0LAogICAgICAgICAgZXh0ZXJuYWxUb2tlbiwKICAgICAgICAgIHN0YXRpY1Rva2VuLAogICAgICAgICAgY292YXJpYW50VG9rZW4sCiAgICAgICAgICBsYXRlVG9rZW4sCiAgICAgICAgICB2YXJGaW5hbE9yQ29uc3QsCiAgICAgICAgICBiZWZvcmVUeXBlLAogICAgICAgICAgdHlwZUluZm8sCiAgICAgICAgICB0b2tlbi5uZXh0LAogICAgICAgICAga2luZCk7CiAgICB9CgogICAgbGlzdGVuZXIuZW5kTWVtYmVyKCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUmVwb3J0IHRoYXQgdGhlIG5lc3RpbmcgZGVwdGggb2YgdGhlIGNvZGUgYmVpbmcgcGFyc2VkIGlzIHRvbyBsYXJnZSBmb3IKICAvLy8gdGhlIHBhcnNlciB0byBzYWZlbHkgaGFuZGxlLiBSZXR1cm4gdGhlIG5leHQgYH1gIG9yIEVPRi4KICBUb2tlbiByZWNvdmVyRnJvbVN0YWNrT3ZlcmZsb3coVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlU3RhY2tPdmVyZmxvdyk7CiAgICBuZXh0ID0gcmV3cml0ZXIuaW5zZXJ0U3ludGhldGljVG9rZW4odG9rZW4sIFRva2VuVHlwZS5TRU1JQ09MT04pOwogICAgbGlzdGVuZXIuaGFuZGxlRW1wdHlTdGF0ZW1lbnQobmV4dCk7CgogICAgd2hpbGUgKG5vdEVvZk9yVmFsdWUoJ30nLCBuZXh0KSkgewogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgdm9pZCByZXBvcnRSZWNvdmVyYWJsZUVycm9yKFRva2VuIHRva2VuLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgIC8vIEZpbmQgYSBub24tc3ludGhldGljIHRva2VuIG9uIHdoaWNoIHRvIHJlcG9ydCB0aGUgZXJyb3IuCiAgICB0b2tlbiA9IGZpbmROb25aZXJvTGVuZ3RoVG9rZW4odG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlUmVjb3ZlcmFibGVFcnJvcihtZXNzYWdlLCB0b2tlbiwgdG9rZW4pOwogIH0KCiAgdm9pZCByZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICBUb2tlbiB0b2tlbiwgVGVtcGxhdGU8X01lc3NhZ2VXaXRoQXJndW1lbnQ8VG9rZW4+PiB0ZW1wbGF0ZSkgewogICAgLy8gRmluZCBhIG5vbi1zeW50aGV0aWMgdG9rZW4gb24gd2hpY2ggdG8gcmVwb3J0IHRoZSBlcnJvci4KICAgIHRva2VuID0gZmluZE5vblplcm9MZW5ndGhUb2tlbih0b2tlbik7CiAgICBsaXN0ZW5lci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgIHRlbXBsYXRlLndpdGhBcmd1bWVudHModG9rZW4pLCB0b2tlbiwgdG9rZW4pOwogIH0KCiAgVG9rZW4gcmVwb3J0QWxsRXJyb3JUb2tlbnMoVG9rZW4gdG9rZW4pIHsKICAgIHdoaWxlICh0b2tlbiBpcyBFcnJvclRva2VuKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZUVycm9yVG9rZW4odG9rZW4pOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBza2lwRXJyb3JUb2tlbnMoVG9rZW4gdG9rZW4pIHsKICAgIHdoaWxlICh0b2tlbiBpcyBFcnJvclRva2VuKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIFRva2VuIHBhcnNlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICBuZXh0LAogICAgICAgIG9wdGlvbmFsKCc7JywgbmV4dCkKICAgICAgICAgICAgPyBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbgogICAgICAgICAgICA6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWREZWNsYXJhdGlvbik7CiAgICBpZiAob3B0aW9uYWwoJ3snLCBuZXh0KSkgewogICAgICBuZXh0ID0gcGFyc2VJbnZhbGlkQmxvY2sodG9rZW4pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb24obmV4dCk7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIFRva2VuIHJlcG9ydEFuZFNraXBDbGFzc0luQ2xhc3MoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgnY2xhc3MnLCB0b2tlbikpOwogICAgcmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgY29kZXMubWVzc2FnZUNsYXNzSW5DbGFzcyk7CiAgICBsaXN0ZW5lci5oYW5kbGVJbnZhbGlkTWVtYmVyKHRva2VuKTsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgLy8gSWYgdGhlIGRlY2xhcmF0aW9uIGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBjbGFzcyBkZWNsYXJhdGlvbgogICAgLy8gdGhlbiBza2lwIHRoZSBlbnRpcmUgZGVjbGFyYXRpb24gc28gdGhhdCB3ZSBvbmx5IGdlbmVyYXRlIHRoZSBvbmUKICAgIC8vIGVycm9yIChhYm92ZSkgcmF0aGVyIHRoYW4gYSBwbGV0aG9yYSBvZiB1bmhlbHBmdWwgZXJyb3JzLgogICAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIC8vIHNraXAgY2xhc3MgbmFtZQogICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcGFyc2luZyAoc2tpcHBpbmcpIHRoZSBjbGFzcyBoZWFkZXIKICAgICAgLy8gd2l0aCBhIHJlY292ZXJ5IGxpc3RlbmVyIHNvIHRoYXQgbm8gZXZlbnRzIGFyZSBnZW5lcmF0ZWQKICAgICAgaWYgKG9wdGlvbmFsKCd7JywgbmV4dCkgJiYgbmV4dC5lbmRHcm91cCAhPSBudWxsKSB7CiAgICAgICAgLy8gc2tpcCBjbGFzcyBib2R5CiAgICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiByZXBvcnRBbmRTa2lwRW51bUluQ2xhc3MoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgnZW51bScsIHRva2VuKSk7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBjb2Rlcy5tZXNzYWdlRW51bUluQ2xhc3MpOwogICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZE1lbWJlcih0b2tlbik7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIC8vIElmIHRoZSBkZWNsYXJhdGlvbiBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgZW51bSBkZWNsYXJhdGlvbgogICAgLy8gdGhlbiBza2lwIHRoZSBlbnRpcmUgZGVjbGFyYXRpb24gc28gdGhhdCB3ZSBvbmx5IGdlbmVyYXRlIHRoZSBvbmUKICAgIC8vIGVycm9yIChhYm92ZSkgcmF0aGVyIHRoYW4gYSBwbGV0aG9yYSBvZiB1bmhlbHBmdWwgZXJyb3JzLgogICAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgIC8vIHNraXAgZW51bSBuYW1lCiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgIGlmIChvcHRpb25hbCgneycsIG5leHQpICYmIG5leHQuZW5kR3JvdXAgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBDb25zaWRlciByZXBsYWNpbmcgdGhpcyBgc2tpcCBlbnVtYCBmdW5jdGlvbmFsaXR5CiAgICAgICAgLy8gd2l0aCBzb21ldGhpbmcgdGhhdCBjYW4gcGFyc2UgYW5kIHJlc29sdmUgdGhlIGRlY2xhcmF0aW9uCiAgICAgICAgLy8gZXZlbiB0aG91Z2ggaXQgaXMgaW4gYSBjbGFzcyBjb250ZXh0CiAgICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiByZXBvcnRBbmRTa2lwVHlwZWRlZkluQ2xhc3MoVG9rZW4gdG9rZW4pIHsKICAgIGFzc2VydChvcHRpb25hbCgndHlwZWRlZicsIHRva2VuKSk7CiAgICByZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBjb2Rlcy5tZXNzYWdlVHlwZWRlZkluQ2xhc3MpOwogICAgbGlzdGVuZXIuaGFuZGxlSW52YWxpZE1lbWJlcih0b2tlbik7CiAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKTogSWYgdGhlIGRlY2xhcmF0aW9uIGFwcGVhcnMgdG8gYmUgYSB2YWxpZCB0eXBlZGVmCiAgICAvLyB0aGVuIHNraXAgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiBzbyB0aGF0IHdlIGdlbmVyYXRlIGEgc2luZ2xlIGVycm9yCiAgICAvLyAoYWJvdmUpIHJhdGhlciB0aGFuIG1hbnkgdW5oZWxwZnVsIGVycm9ycy4KICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBDcmVhdGUgYSBzaG9ydCB0b2tlbiBjaGFpbiBmcm9tIHRoZSBbYmVnaW5Ub2tlbl0gYW5kIFtlbmRUb2tlbl0gYW5kIHJldHVybgogIC8vLyB0aGUgW2JlZ2luVG9rZW5dLgogIFRva2VuIGxpbmsoQmVnaW5Ub2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgYmVnaW5Ub2tlbi5zZXROZXh0KGVuZFRva2VuKTsKICAgIGJlZ2luVG9rZW4uZW5kR3JvdXAgPSBlbmRUb2tlbjsKICAgIHJldHVybiBiZWdpblRva2VuOwogIH0KCiAgLy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgdG9rZW4gd2hvc2UgbmV4dCB0b2tlbiBpcyB0aGUgZ2l2ZW4gW3Rva2VuXS4KICBUb2tlbiBzeW50aGV0aWNQcmV2aW91c1Rva2VuKFRva2VuIHRva2VuKSB7CiAgICAvLyBSZXR1cm4gdGhlIHByZXZpb3VzIHRva2VuIGlmIHRoZXJlIGlzIG9uZSBzbyB0aGF0IGFueSB0b2tlbiBpbnNlcnRlZAogICAgLy8gYmVmb3JlIGB0b2tlbmAgd2lsbCBiZSBwcm9wZXJseSBpbnNlcnRlZCBpbnRvIHRoZSB0b2tlbiBzdHJlYW0uCiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogcmVtb3ZlIHRoaXMgb25jZSBhbGwgbWV0aG9kcyBoYXZlIGJlZW4gY29udmVydGVkIHRvCiAgICAvLyB1c2UgYW5kIHJldHVybiB0aGUgbGFzdCB0b2tlbiBjb25zdW1lZCBhbmQgdGhlIGBwcmV2aW91c2AgZmllbGQKICAgIC8vIGhhcyBiZWVuIHJlbW92ZWQuCiAgICBpZiAodG9rZW4ucHJldmlvdXMgIT0gbnVsbCkgewogICAgICByZXR1cm4gdG9rZW4ucHJldmlvdXM7CiAgICB9CiAgICBUb2tlbiBiZWZvcmUgPSBuZXcgVG9rZW4uZW9mKC0xKTsKICAgIGJlZm9yZS5uZXh0ID0gdG9rZW47CiAgICByZXR1cm4gYmVmb3JlOwogIH0KCiAgLy8vIFJldHVybiB0aGUgZmlyc3QgZGFydGRvYyBjb21tZW50IHRva2VuIHByZWNlZGluZyB0aGUgZ2l2ZW4gdG9rZW4KICAvLy8gb3IgYG51bGxgIGlmIG5vIGRhcnRkb2MgdG9rZW4gaXMgZm91bmQuCiAgVG9rZW4gZmluZERhcnREb2MoVG9rZW4gdG9rZW4pIHsKICAgIFRva2VuIGNvbW1lbnRzID0gdG9rZW4ucHJlY2VkaW5nQ29tbWVudHM7CiAgICBUb2tlbiBkYXJ0ZG9jID0gbnVsbDsKICAgIGJvb2wgaXNNdWx0aWxpbmUgPSBmYWxzZTsKICAgIHdoaWxlIChjb21tZW50cyAhPSBudWxsKSB7CiAgICAgIFN0cmluZyBsZXhlbWUgPSBjb21tZW50cy5sZXhlbWU7CiAgICAgIGlmIChsZXhlbWUuc3RhcnRzV2l0aCgnLy8vJykpIHsKICAgICAgICBpZiAoIWlzTXVsdGlsaW5lKSB7CiAgICAgICAgICBkYXJ0ZG9jID0gY29tbWVudHM7CiAgICAgICAgICBpc011bHRpbGluZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGxleGVtZS5zdGFydHNXaXRoKCcvKionKSkgewogICAgICAgIGRhcnRkb2MgPSBjb21tZW50czsKICAgICAgICBpc011bHRpbGluZSA9IGZhbHNlOwogICAgICB9CiAgICAgIGNvbW1lbnRzID0gY29tbWVudHMubmV4dDsKICAgIH0KICAgIHJldHVybiBkYXJ0ZG9jOwogIH0KCiAgLy8vIFBhcnNlIHRoZSBjb21tZW50IHJlZmVyZW5jZXMgaW4gYSBzZXF1ZW5jZSBvZiBjb21tZW50IHRva2VucwogIC8vLyB3aGVyZSBbZGFydGRvY10gKG5vdCBudWxsKSBpcyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIHNlcXVlbmNlLgogIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBjb21tZW50IHJlZmVyZW5jZXMgcGFyc2VkLgogIGludCBwYXJzZUNvbW1lbnRSZWZlcmVuY2VzKFRva2VuIGRhcnRkb2MpIHsKICAgIHJldHVybiBkYXJ0ZG9jLmxleGVtZS5zdGFydHNXaXRoKCcvLy8nKQogICAgICAgID8gcGFyc2VSZWZlcmVuY2VzSW5TaW5nbGVMaW5lQ29tbWVudHMoZGFydGRvYykKICAgICAgICA6IHBhcnNlUmVmZXJlbmNlc0luTXVsdGlMaW5lQ29tbWVudChkYXJ0ZG9jKTsKICB9CgogIC8vLyBQYXJzZSB0aGUgY29tbWVudCByZWZlcmVuY2VzIGluIGEgbXVsdGktbGluZSBjb21tZW50IHRva2VuLgogIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBjb21tZW50IHJlZmVyZW5jZXMgcGFyc2VkLgogIGludCBwYXJzZVJlZmVyZW5jZXNJbk11bHRpTGluZUNvbW1lbnQoVG9rZW4gbXVsdGlMaW5lRG9jKSB7CiAgICBTdHJpbmcgY29tbWVudCA9IG11bHRpTGluZURvYy5sZXhlbWU7CiAgICBhc3NlcnQoY29tbWVudC5zdGFydHNXaXRoKCcvKionKSk7CiAgICBpbnQgY291bnQgPSAwOwogICAgaW50IGxlbmd0aCA9IGNvbW1lbnQubGVuZ3RoOwogICAgaW50IHN0YXJ0ID0gMzsKICAgIGJvb2wgaW5Db2RlQmxvY2sgPSBmYWxzZTsKICAgIGludCBjb2RlQmxvY2sgPSBjb21tZW50LmluZGV4T2YoJ2BgYCcsIDMpOwogICAgaWYgKGNvZGVCbG9jayA9PSAtMSkgewogICAgICBjb2RlQmxvY2sgPSBsZW5ndGg7CiAgICB9CiAgICB3aGlsZSAoc3RhcnQgPCBsZW5ndGgpIHsKICAgICAgaWYgKGlzV2hpdGVzcGFjZShjb21tZW50LmNvZGVVbml0QXQoc3RhcnQpKSkgewogICAgICAgICsrc3RhcnQ7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaW50IGVuZCA9IGNvbW1lbnQuaW5kZXhPZignXG4nLCBzdGFydCk7CiAgICAgIGlmIChlbmQgPT0gLTEpIHsKICAgICAgICBlbmQgPSBsZW5ndGg7CiAgICAgIH0KICAgICAgaWYgKGNvZGVCbG9jayA8IGVuZCkgewogICAgICAgIGluQ29kZUJsb2NrID0gIWluQ29kZUJsb2NrOwogICAgICAgIGNvZGVCbG9jayA9IGNvbW1lbnQuaW5kZXhPZignYGBgJywgZW5kKTsKICAgICAgICBpZiAoY29kZUJsb2NrID09IC0xKSB7CiAgICAgICAgICBjb2RlQmxvY2sgPSBsZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaW5Db2RlQmxvY2sgJiYgIWNvbW1lbnQuc3RhcnRzV2l0aCgnKiAgICAgJywgc3RhcnQpKSB7CiAgICAgICAgY291bnQgKz0gcGFyc2VDb21tZW50UmVmZXJlbmNlc0luVGV4dChtdWx0aUxpbmVEb2MsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIHN0YXJ0ID0gZW5kICsgMTsKICAgIH0KICAgIHJldHVybiBjb3VudDsKICB9CgogIC8vLyBQYXJzZSB0aGUgY29tbWVudCByZWZlcmVuY2VzIGluIGEgc2VxdWVuY2Ugb2Ygc2luZ2xlIGxpbmUgY29tbWVudCB0b2tlbnMKICAvLy8gd2hlcmUgW3Rva2VuXSBpcyB0aGUgZmlyc3QgY29tbWVudCB0b2tlbiBpbiB0aGUgc2VxdWVuY2UuCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbW1lbnQgcmVmZXJlbmNlcyBwYXJzZWQuCiAgaW50IHBhcnNlUmVmZXJlbmNlc0luU2luZ2xlTGluZUNvbW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgYm9vbCBpbkNvZGVCbG9jayA9IGZhbHNlOwogICAgd2hpbGUgKHRva2VuICE9IG51bGwgJiYgIXRva2VuLmlzRW9mKSB7CiAgICAgIFN0cmluZyBjb21tZW50ID0gdG9rZW4ubGV4ZW1lOwogICAgICBpZiAoY29tbWVudC5zdGFydHNXaXRoKCcvLy8nKSkgewogICAgICAgIGlmIChjb21tZW50LmluZGV4T2YoJ2BgYCcsIDMpICE9IC0xKSB7CiAgICAgICAgICBpbkNvZGVCbG9jayA9ICFpbkNvZGVCbG9jazsKICAgICAgICB9CiAgICAgICAgaWYgKCFpbkNvZGVCbG9jayAmJiAhY29tbWVudC5zdGFydHNXaXRoKCcvLy8gICAgJykpIHsKICAgICAgICAgIGNvdW50ICs9IHBhcnNlQ29tbWVudFJlZmVyZW5jZXNJblRleHQodG9rZW4sIDMsIGNvbW1lbnQubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLy8vIFBhcnNlIHRoZSBjb21tZW50IHJlZmVyZW5jZXMgaW4gdGhlIHRleHQgYmV0d2VlbiBbc3RhcnRdIGluY2x1c2l2ZQogIC8vLyBhbmQgW2VuZF0gZXhjbHVzaXZlLiBSZXR1cm4gYSBjb3VudCBpbmRpY2F0aW5nIGhvdyBtYW55IHdlcmUgcGFyc2VkLgogIGludCBwYXJzZUNvbW1lbnRSZWZlcmVuY2VzSW5UZXh0KFRva2VuIGNvbW1lbnRUb2tlbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBTdHJpbmcgY29tbWVudCA9IGNvbW1lbnRUb2tlbi5sZXhlbWU7CiAgICBpbnQgY291bnQgPSAwOwogICAgaW50IGluZGV4ID0gc3RhcnQ7CiAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKICAgICAgaW50IGNoID0gY29tbWVudC5jb2RlVW5pdEF0KGluZGV4KTsKICAgICAgaWYgKGNoID09IDB4NUIgLyogYFtgICovKSB7CiAgICAgICAgKytpbmRleDsKICAgICAgICBpZiAoaW5kZXggPCBlbmQgJiYgY29tbWVudC5jb2RlVW5pdEF0KGluZGV4KSA9PSAweDNBIC8qIGA6YCAqLykgewogICAgICAgICAgLy8gU2tpcCBvbGQtc3R5bGUgY29kZSBibG9jay4KICAgICAgICAgIGluZGV4ID0gY29tbWVudC5pbmRleE9mKCc6XScsIGluZGV4ICsgMSkgKyAxOwogICAgICAgICAgaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPiBlbmQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludCByZWZlcmVuY2VTdGFydCA9IGluZGV4OwogICAgICAgICAgaW5kZXggPSBjb21tZW50LmluZGV4T2YoJ10nLCBpbmRleCk7CiAgICAgICAgICBpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gZW5kKSB7CiAgICAgICAgICAgIC8vIFJlY292ZXJ5OiB0ZXJtaW5hdGluZyAnXScgaXMgbm90IHR5cGVkIHlldC4KICAgICAgICAgICAgaW5kZXggPSBmaW5kUmVmZXJlbmNlRW5kKGNvbW1lbnQsIHJlZmVyZW5jZVN0YXJ0LCBlbmQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNoICE9IDB4MjcgLyogYCdgICovICYmIGNoICE9IDB4MjIgLyogYCJgICovKSB7CiAgICAgICAgICAgIGlmIChpc0xpbmtUZXh0KGNvbW1lbnQsIGluZGV4KSkgewogICAgICAgICAgICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzIGEgbGlicmFyeQogICAgICAgICAgICAgIC8vIFVSSSBpbiB0aGUgbGluayB0ZXh0LgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KAogICAgICAgICAgICAgICAgICBjb21tZW50LnN1YnN0cmluZyhyZWZlcmVuY2VTdGFydCwgaW5kZXgpLAogICAgICAgICAgICAgICAgICBjb21tZW50VG9rZW4uY2hhck9mZnNldCArIHJlZmVyZW5jZVN0YXJ0KTsKICAgICAgICAgICAgICArK2NvdW50OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09IDB4NjAgLyogJ2AnICovKSB7CiAgICAgICAgLy8gU2tpcCBpbmxpbmUgY29kZSBibG9jayBpZiB0aGVyZSBpcyBib3RoIHN0YXJ0aW5nICdgJyBhbmQgZW5kaW5nICdgJwogICAgICAgIGludCBlbmRDb2RlQmxvY2sgPSBjb21tZW50LmluZGV4T2YoJ2AnLCBpbmRleCArIDEpOwogICAgICAgIGlmIChlbmRDb2RlQmxvY2sgIT0gLTEgJiYgZW5kQ29kZUJsb2NrIDwgZW5kKSB7CiAgICAgICAgICBpbmRleCA9IGVuZENvZGVCbG9jazsKICAgICAgICB9CiAgICAgIH0KICAgICAgKytpbmRleDsKICAgIH0KICAgIHJldHVybiBjb3VudDsKICB9CgogIC8vLyBHaXZlbiBhIGNvbW1lbnQgcmVmZXJlbmNlIHdpdGhvdXQgYSBjbG9zaW5nIGBdYCwKICAvLy8gc2VhcmNoIGZvciBhIHBvc3NpYmxlIHBsYWNlIHdoZXJlIGBdYCBzaG91bGQgYmUuCiAgaW50IGZpbmRSZWZlcmVuY2VFbmQoU3RyaW5nIGNvbW1lbnQsIGludCBpbmRleCwgaW50IGVuZCkgewogICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBpZGVudGlmaWVyIGlmIHRoZXJlIGlzIG9uZQogICAgaWYgKGluZGV4ID49IGVuZCB8fCAhaXNMZXR0ZXIoY29tbWVudC5jb2RlVW5pdEF0KGluZGV4KSkpIHsKICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgd2hpbGUgKGluZGV4IDwgZW5kICYmIGlzTGV0dGVyT3JEaWdpdChjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpKSkgewogICAgICArK2luZGV4OwogICAgfQoKICAgIC8vIENoZWNrIGZvciBhIHRyYWlsaW5nIGAuYAogICAgaWYgKGluZGV4ID49IGVuZCB8fCBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpICE9IDB4MkUgLyogYC5gICovKSB7CiAgICAgIHJldHVybiBpbmRleDsKICAgIH0KICAgICsraW5kZXg7CgogICAgLy8gRmluZCBlbmQgb2YgdGhlIGlkZW50aWZpZXIgYWZ0ZXIgdGhlIGAuYAogICAgaWYgKGluZGV4ID49IGVuZCB8fCAhaXNMZXR0ZXIoY29tbWVudC5jb2RlVW5pdEF0KGluZGV4KSkpIHsKICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgKytpbmRleDsKICAgIHdoaWxlIChpbmRleCA8IGVuZCAmJiBpc0xldHRlck9yRGlnaXQoY29tbWVudC5jb2RlVW5pdEF0KGluZGV4KSkpIHsKICAgICAgKytpbmRleDsKICAgIH0KICAgIHJldHVybiBpbmRleDsKICB9CgogIC8vLyBQYXJzZSB0aGUgdG9rZW5zIGluIGEgc2luZ2xlIGNvbW1lbnQgcmVmZXJlbmNlIGFuZCBnZW5lcmF0ZSBlaXRoZXIgYQogIC8vLyBgaGFuZGxlQ29tbWVudFJlZmVyZW5jZWAgb3IgYGhhbmRsZU5vQ29tbWVudFJlZmVyZW5jZWAgZXZlbnQuCiAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgYSBjb21tZW50IHJlZmVyZW5jZSB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4KICBib29sIHBhcnNlT25lQ29tbWVudFJlZmVyZW5jZShUb2tlbiB0b2tlbiwgaW50IHJlZmVyZW5jZU9mZnNldCkgewogICAgVG9rZW4gYmVnaW4gPSB0b2tlbjsKICAgIFRva2VuIG5ld0tleXdvcmQgPSBudWxsOwogICAgaWYgKG9wdGlvbmFsKCduZXcnLCB0b2tlbikpIHsKICAgICAgbmV3S2V5d29yZCA9IHRva2VuOwogICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICB9CiAgICBUb2tlbiBwcmVmaXgsIHBlcmlvZDsKICAgIGlmICh0b2tlbi5pc0lkZW50aWZpZXIgJiYgb3B0aW9uYWwoJy4nLCB0b2tlbi5uZXh0KSkgewogICAgICBwcmVmaXggPSB0b2tlbjsKICAgICAgcGVyaW9kID0gdG9rZW4ubmV4dDsKICAgICAgdG9rZW4gPSBwZXJpb2QubmV4dDsKICAgIH0KICAgIGlmICh0b2tlbi5pc0VvZikgewogICAgICAvLyBSZWNvdmVyeTogSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgZm9yIGNvZGUgY29tcGxldGlvbgogICAgICB0b2tlbiA9IHJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoCiAgICAgICAgICBwZXJpb2QgPz8gbmV3S2V5d29yZCA/PyBzeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSk7CiAgICAgIGlmIChiZWdpbiA9PSB0b2tlbi5uZXh0KSB7CiAgICAgICAgYmVnaW4gPSB0b2tlbjsKICAgICAgfQogICAgfQogICAgVG9rZW4gb3BlcmF0b3JLZXl3b3JkID0gbnVsbDsKICAgIGlmIChvcHRpb25hbCgnb3BlcmF0b3InLCB0b2tlbikpIHsKICAgICAgb3BlcmF0b3JLZXl3b3JkID0gdG9rZW47CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIGlmICh0b2tlbi5pc1VzZXJEZWZpbmFibGVPcGVyYXRvcikgewogICAgICBpZiAodG9rZW4ubmV4dC5pc0VvZikgewogICAgICAgIHBhcnNlT25lQ29tbWVudFJlZmVyZW5jZVJlc3QoCiAgICAgICAgICAgIGJlZ2luLCByZWZlcmVuY2VPZmZzZXQsIG5ld0tleXdvcmQsIHByZWZpeCwgcGVyaW9kLCB0b2tlbik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRva2VuID0gb3BlcmF0b3JLZXl3b3JkID8/IHRva2VuOwogICAgICBpZiAodG9rZW4ubmV4dC5pc0VvZikgewogICAgICAgIGlmICh0b2tlbi5pc0lkZW50aWZpZXIpIHsKICAgICAgICAgIHBhcnNlT25lQ29tbWVudFJlZmVyZW5jZVJlc3QoCiAgICAgICAgICAgICAgYmVnaW4sIHJlZmVyZW5jZU9mZnNldCwgbmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIHRva2VuKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBLZXl3b3JkIGtleXdvcmQgPSB0b2tlbi5rZXl3b3JkOwogICAgICAgIGlmIChuZXdLZXl3b3JkID09IG51bGwgJiYKICAgICAgICAgICAgcHJlZml4ID09IG51bGwgJiYKICAgICAgICAgICAgKGtleXdvcmQgPT0gS2V5d29yZC5USElTIHx8CiAgICAgICAgICAgICAgICBrZXl3b3JkID09IEtleXdvcmQuTlVMTCB8fAogICAgICAgICAgICAgICAga2V5d29yZCA9PSBLZXl3b3JkLlRSVUUgfHwKICAgICAgICAgICAgICAgIGtleXdvcmQgPT0gS2V5d29yZC5GQUxTRSkpIHsKICAgICAgICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIElmIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzIHdlIHdpbGwgbmVlZCB0bwogICAgICAgICAgLy8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uIG9mIENvbW1lbnRSZWZlcmVuY2UgdG8gdGFrZSBhbiBleHByZXNzaW9uCiAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhbiBpZGVudGlmaWVyLiBGb3Igbm93IHdlIGp1c3QgaWdub3JlIGl0IHRvIHJlZHVjZSB0aGUKICAgICAgICAgIC8vIG51bWJlciBvZiBlcnJvcnMgcHJvZHVjZWQsIGJ1dCB0aGF0J3MgcHJvYmFibHkgbm90IGEgdmFsaWQgbG9uZwogICAgICAgICAgLy8gdGVybSBhcHByb2FjaC4KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxpc3RlbmVyLmhhbmRsZU5vQ29tbWVudFJlZmVyZW5jZSgpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBwYXJzZU9uZUNvbW1lbnRSZWZlcmVuY2VSZXN0KAogICAgICBUb2tlbiBiZWdpbiwKICAgICAgaW50IHJlZmVyZW5jZU9mZnNldCwKICAgICAgVG9rZW4gbmV3S2V5d29yZCwKICAgICAgVG9rZW4gcHJlZml4LAogICAgICBUb2tlbiBwZXJpb2QsCiAgICAgIFRva2VuIGlkZW50aWZpZXJPck9wZXJhdG9yKSB7CiAgICAvLyBBZGp1c3QgdGhlIHRva2VuIG9mZnNldHMgdG8gbWF0Y2ggdGhlIGVuY2xvc2luZyBjb21tZW50IHRva2VuLgogICAgVG9rZW4gdG9rZW4gPSBiZWdpbjsKICAgIGRvIHsKICAgICAgdG9rZW4ub2Zmc2V0ICs9IHJlZmVyZW5jZU9mZnNldDsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfSB3aGlsZSAoIXRva2VuLmlzRW9mKTsKCiAgICBsaXN0ZW5lci5oYW5kbGVDb21tZW50UmVmZXJlbmNlKAogICAgICAgIG5ld0tleXdvcmQsIHByZWZpeCwgcGVyaW9kLCBpZGVudGlmaWVyT3JPcGVyYXRvcik7CiAgfQoKICAvLy8gR2l2ZW4gdGhhdCB3ZSBoYXZlIGp1c3QgZm91bmQgYnJhY2tldGVkIHRleHQgd2l0aGluIHRoZSBnaXZlbiBbY29tbWVudF0sCiAgLy8vIGxvb2sgdG8gc2VlIHdoZXRoZXIgdGhhdCB0ZXh0IGlzIChhKSBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQgbGluawogIC8vLyBhZGRyZXNzLCAoYikgZm9sbG93ZWQgYnkgYSBjb2xvbiwgb3IgKGMpIGZvbGxvd2VkIGJ5IG9wdGlvbmFsIHdoaXRlc3BhY2UKICAvLy8gYW5kIGFub3RoZXIgc3F1YXJlIGJyYWNrZXQuIFRoZSBbcmlnaHRJbmRleF0gaXMgdGhlIGluZGV4IG9mIHRoZSByaWdodAogIC8vLyBicmFja2V0LiBSZXR1cm4gYHRydWVgIGlmIHRoZSBicmFja2V0ZWQgdGV4dCBpcyBmb2xsb3dlZCBieSBhIGxpbmsKICAvLy8gYWRkcmVzcy4KICAvLy8KICAvLy8gVGhpcyBtZXRob2QgdXNlcyB0aGUgc3ludGF4IGRlc2NyaWJlZCBieSB0aGUKICAvLy8gPGEgaHJlZj0iaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgiPm1hcmtkb3duPC9hPgogIC8vLyBwcm9qZWN0LgogIGJvb2wgaXNMaW5rVGV4dChTdHJpbmcgY29tbWVudCwgaW50IHJpZ2h0SW5kZXgpIHsKICAgIGludCBsZW5ndGggPSBjb21tZW50Lmxlbmd0aDsKICAgIGludCBpbmRleCA9IHJpZ2h0SW5kZXggKyAxOwogICAgaWYgKGluZGV4ID49IGxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpbnQgY2ggPSBjb21tZW50LmNvZGVVbml0QXQoaW5kZXgpOwogICAgaWYgKGNoID09IDB4MjggfHwgY2ggPT0gMHgzQSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHdoaWxlIChpc1doaXRlc3BhY2UoY2gpKSB7CiAgICAgIGluZGV4ID0gaW5kZXggKyAxOwogICAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwog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BiInHxoGKR4mSBUIDSgeIihKFwopIh4oKystTU1QTRwKCAYpEgQBJRMbGBQUJEYZCScaHAElOwQBT0xPTUkPBjNQDzQhIBsUBigkEwYfGR0WCCYGFwQCAUk3ATdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXJfaW1wbC5kYXJ0ZGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvcGFyc2VyX2Vycm9yLmRhcnSDeC8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLnBhcnNlcl9lcnJvcjsKCmltcG9ydCAnLi4vbWVzc2FnZXMvY29kZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICcuLi9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmNsYXNzIFBhcnNlckVycm9yIHsKICAvLy8gQ2hhcmFjdGVyIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZmlsZSB3aGVyZSB0aGlzIGVycm9yIHN0YXJ0cy4KICBmaW5hbCBpbnQgYmVnaW5PZmZzZXQ7CgogIC8vLyBDaGFyYWN0ZXIgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlIHdoZXJlIHRoaXMgZXJyb3IgZW5kcy4KICBmaW5hbCBpbnQgZW5kT2Zmc2V0OwoKICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2U7CgogIFBhcnNlckVycm9yKHRoaXMuYmVnaW5PZmZzZXQsIHRoaXMuZW5kT2Zmc2V0LCB0aGlzLm1lc3NhZ2UpOwoKICBQYXJzZXJFcnJvci5mcm9tVG9rZW5zKFRva2VuIGJlZ2luLCBUb2tlbiBlbmQsIE1lc3NhZ2UgbWVzc2FnZSkKICAgICAgOiB0aGlzKGJlZ2luLmNoYXJPZmZzZXQsIGVuZC5jaGFyT2Zmc2V0ICsgZW5kLmNoYXJDb3VudCwgbWVzc2FnZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJAJHtiZWdpbk9mZnNldH06ICR7bWVzc2FnZS5tZXNzYWdlfVxuJHttZXNzYWdlLnRpcH0iOwp9ChwATk48ATEBLgEtARRLGQFJFwEZAT8BQkkBTgIBOHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3BhcnNlcl9lcnJvci5kYXJ0XmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvYXNzZXJ0LmRhcnSCMi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLkFzc2VydDsKCi8vLyBTeW50YWN0aWMgZm9ybXMgb2YgYGFzc2VydGAuCi8vLwovLy8gQW4gYXNzZXJ0aW9uIGNhbiBsZWdhbGx5IG9jY3VyIGFzIGEgc3RhdGVtZW50LiBIb3dldmVyLCBhc3NlcnRpb25zIGFyZSBhbHNvCi8vLyBleHBlcmltZW50YWxseSBhbGxvd2VkIGluIGluaXRpYWxpemVycy4gRm9yIGltcHJvdmVkIGVycm9yIHJlY292ZXJ5LCB3ZQovLy8gYWxzbyBhdHRlbXB0IHRvIHBhcnNlIGFzc2VydHMgYXMgZXhwcmVzc2lvbnMuCmVudW0gQXNzZXJ0IHsKICBFeHByZXNzaW9uLAogIEluaXRpYWxpemVyLAogIFN0YXRlbWVudCwKfQoSAE5OPAErASEEUEwyDg4PDQIBMnBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2Fzc2VydC5kYXJ0YmZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvYmxvY2tfa2luZC5kYXJ0hmovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKY2xhc3MgQmxvY2tLaW5kIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgZmluYWwgYm9vbCB1c2VOYW1lRm9yTWlzc2luZ0Jsb2NrOwoKICBjb25zdCBCbG9ja0tpbmQuXyh0aGlzLm5hbWUsIHRoaXMudXNlTmFtZUZvck1pc3NpbmdCbG9jayk7CgogIC8vLyBSZXR1cm5zIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhpcyBibG9jayBpZiBpdCBpcyBtaXNzaW5nIGluCiAgLy8vIFt0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keV0uCiAgLy8vCiAgLy8vIElmIGBudWxsYCB0aGUgZ2VuZXJpYyBbdGVtcGxhdGVFeHBlY3RlZEJ1dEdvdF0gaXMgdXNlZCBpbnN0ZWFkLgogIFN0cmluZyBnZXQgbWlzc2luZ0Jsb2NrTmFtZSA9PiB1c2VOYW1lRm9yTWlzc2luZ0Jsb2NrID8gbmFtZSA6IG51bGw7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICdCbG9ja0tpbmQoJG5hbWUpJzsKCiAgc3RhdGljIGNvbnN0IEJsb2NrS2luZCBjYXRjaENsYXVzZSA9IGNvbnN0IEJsb2NrS2luZC5fKCdjYXRjaCBjbGF1c2UnLCB0cnVlKTsKICBzdGF0aWMgY29uc3QgQmxvY2tLaW5kIGNsYXNzRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBCbG9ja0tpbmQuXygnY2xhc3MgZGVjbGFyYXRpb24nLCBmYWxzZSk7CiAgc3RhdGljIGNvbnN0IEJsb2NrS2luZCBlbnVtRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBCbG9ja0tpbmQuXygnZW51bSBkZWNsYXJhdGlvbicsIGZhbHNlKTsKICBzdGF0aWMgY29uc3QgQmxvY2tLaW5kIGV4dGVuc2lvbkRlY2xhcmF0aW9uID0KICAgICAgY29uc3QgQmxvY2tLaW5kLl8oJ2V4dGVuc2lvbiBkZWNsYXJhdGlvbicsIGZhbHNlKTsKICBzdGF0aWMgY29uc3QgQmxvY2tLaW5kIGZpbmFsbHlDbGF1c2UgPQogICAgICBjb25zdCBCbG9ja0tpbmQuXygnZmluYWxseSBjbGF1c2UnLCB0cnVlKTsKICBzdGF0aWMgY29uc3QgQmxvY2tLaW5kIGZ1bmN0aW9uQm9keSA9CiAgICAgIGNvbnN0IEJsb2NrS2luZC5fKCdmdW5jdGlvbiBib2R5JywgZmFsc2UpOwogIHN0YXRpYyBjb25zdCBCbG9ja0tpbmQgaW52YWxpZCA9IGNvbnN0IEJsb2NrS2luZC5fKCdpbnZhbGlkJywgZmFsc2UpOwogIHN0YXRpYyBjb25zdCBCbG9ja0tpbmQgbWl4aW5EZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IEJsb2NrS2luZC5fKCdtaXhpbiBkZWNsYXJhdGlvbicsIGZhbHNlKTsKICBzdGF0aWMgY29uc3QgQmxvY2tLaW5kIHN0YXRlbWVudCA9IGNvbnN0IEJsb2NrS2luZC5fKCdzdGF0ZW1lbnQnLCBmYWxzZSk7CiAgc3RhdGljIGNvbnN0IEJsb2NrS2luZCBzd2l0Y2hTdGF0ZW1lbnQgPQogICAgICBjb25zdCBCbG9ja0tpbmQuXygnc3dpdGNoIHN0YXRlbWVudCcsIGZhbHNlKTsKICBzdGF0aWMgY29uc3QgQmxvY2tLaW5kIHRyeVN0YXRlbWVudCA9CiAgICAgIGNvbnN0IEJsb2NrS2luZC5fKCd0cnkgc3RhdGVtZW50JywgdHJ1ZSk7Cn0KKQBOTjwBEhUBJQE9AUEqBkZHASsBUCw1KzQwOSkxKDFILDVMKzQoMAIBNnBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2Jsb2NrX2tpbmQuZGFydG1maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL2Zvcm1hbF9wYXJhbWV0ZXJfa2luZC5kYXJ0gyEvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlci5mb3JtYWxfcGFyYW1ldGVyX2tpbmQ7CgovLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBVcGRhdGUgdGhpcyB0byBzdXBwb3J0IHJlcXVpcmVkIG5hbWVkIGFyZ3VtZW50cy4KZW51bSBGb3JtYWxQYXJhbWV0ZXJLaW5kIHsKICBtYW5kYXRvcnksCiAgb3B0aW9uYWxOYW1lZCwKICBvcHRpb25hbFBvc2l0aW9uYWwsCn0KCmJvb2wgaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kKEZvcm1hbFBhcmFtZXRlcktpbmQgdHlwZSkgewogIHJldHVybiBGb3JtYWxQYXJhbWV0ZXJLaW5kLm1hbmRhdG9yeSA9PSB0eXBlOwp9Cgpib29sIGlzT3B0aW9uYWxOYW1lZEZvcm1hbFBhcmFtZXRlcktpbmQoRm9ybWFsUGFyYW1ldGVyS2luZCB0eXBlKSB7CiAgcmV0dXJuIEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZCA9PSB0eXBlOwp9Cgpib29sIGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZChGb3JtYWxQYXJhbWV0ZXJLaW5kIHR5cGUpIHsKICByZXR1cm4gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWwgPT0gdHlwZTsKfQoaAE5OPAE6AUkbDREWAgFAMAIBRDQCAUk5AgFBcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvZm9ybWFsX3BhcmFtZXRlcl9raW5kLmRhcnRqZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHQuZGFydLmlLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vbWVzc2FnZXMvY29kZXMuZGFydCcKICAgIHNob3cgTWVzc2FnZSwgVGVtcGxhdGUsIHRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHRfaW1wbC5kYXJ0JzsKCmltcG9ydCAncGFyc2VyX2ltcGwuZGFydCcgc2hvdyBQYXJzZXI7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBpc09uZU9mT3JFb2YsIG9wdGlvbmFsOwoKLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJzZXIgc3RhdGUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyIGF0IHRoZQovLy8gdGltZSBhbiBpZGVudGlmaWVyIGlzIGVuY291bnRlcmVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgdGhlIHBhcnNlciBmb3IgZXJyb3IKLy8vIHJlY292ZXJ5IHdoZW4gYSByZWNvdmVyeSB0ZW1wbGF0ZSBpcyBkZWZpbmVkLgovLy8KLy8vIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIGxpc3RlbmVyIHRvIGRldGVybWluZSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUKLy8vIGlkZW50aWZpZXIgYXBwZWFyczsgdGhhdCBpbiB0dXJuIGNhbiBoZWxwIHRoZSBsaXN0ZW5lciBkZWNpZGUgaG93IHRvIHJlc29sdmUKLy8vIHRoZSBpZGVudGlmaWVyIChpZiB0aGUgbGlzdGVuZXIgaXMgZG9pbmcgcmVzb2x1dGlvbikuCmNsYXNzIElkZW50aWZpZXJDb250ZXh0IHsKICAvLy8gSWRlbnRpZmllciBpcyBiZWluZyBkZWNsYXJlZCBhcyB0aGUgbmFtZSBvZiBhbiBpbXBvcnQgcHJlZml4IChpLmUuIGBGb29gCiAgLy8vIGluIGBpbXBvcnQgIi4uLiIgYXMgRm9vO2ApCiAgc3RhdGljIGNvbnN0IEltcG9ydFByZWZpeElkZW50aWZpZXJDb250ZXh0IGltcG9ydFByZWZpeERlY2xhcmF0aW9uID0KICAgICAgY29uc3QgSW1wb3J0UHJlZml4SWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgZG90dGVkIG5hbWUgaW4gYSBjb25kaXRpb25hbCBpbXBvcnQgb3IKICAvLy8gZXhwb3J0LgogIHN0YXRpYyBjb25zdCBEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHQgZG90dGVkTmFtZSA9CiAgICAgIGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgZG90dGVkIG5hbWUgaW4gYSBjb25kaXRpb25hbCBpbXBvcnQgb3IgZXhwb3J0LCBidXQKICAvLy8gaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIGRvdHRlZCBuYW1lLgogIHN0YXRpYyBjb25zdCBEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHQgZG90dGVkTmFtZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgb25lIG9mIHRoZSBzaG93bi9oaWRkZW4gbmFtZXMgaW4gYW4gaW1wb3J0L2V4cG9ydAogIC8vLyBjb21iaW5hdG9yLgogIHN0YXRpYyBjb25zdCBDb21iaW5hdG9ySWRlbnRpZmllckNvbnRleHQgY29tYmluYXRvciA9CiAgICAgIGNvbnN0IENvbWJpbmF0b3JJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSBuYW1lIGluIGFuIGFubm90YXRpb24gdGhhdCBwcmVjZWRlcyBhCiAgLy8vIGRlY2xhcmF0aW9uIChpLmUuIGl0IGFwcGVhcnMgZGlyZWN0bHkgYWZ0ZXIgYW4gYEBgKS4KICBzdGF0aWMgY29uc3QgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBtZXRhZGF0YVJlZmVyZW5jZSA9CiAgICAgIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIG5hbWUgaW4gYW4gYW5ub3RhdGlvbiB0aGF0IHByZWNlZGVzIGEgZGVjbGFyYXRpb24sCiAgLy8vIGJ1dCBpdCdzIG5vdCB0aGUgZmlyc3QgaWRlbnRpZmllciBpbiB0aGUgbmFtZS4KICBzdGF0aWMgY29uc3QgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBtZXRhZGF0YUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHBhcnQgb2YgYSBuYW1lIGluIGFuIGFubm90YXRpb24gdGhhdCBwcmVjZWRlcyBhIGRlY2xhcmF0aW9uLAogIC8vLyBidXQgaXQgYXBwZWFycyBhZnRlciB0eXBlIHBhcmFtZXRlcnMgKGUuZy4gYGZvb2AgaW4gYEBYPFk+LmZvbygpYCkuCiAgc3RhdGljIGNvbnN0IE1ldGFkYXRhUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQKICAgICAgbWV0YWRhdGFDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMgPQogICAgICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cygpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIHR5cGVkZWYgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IFR5cGVkZWZEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IHR5cGVkZWZEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IFR5cGVkZWZEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIGEgZmllbGQgaW5pdGlhbGl6ZXIgaW4gYSBmb3JtYWwgcGFyYW1ldGVyIGxpc3QgKGkuZS4gaXQKICAvLy8gYXBwZWFycyBkaXJlY3RseSBhZnRlciBgdGhpcy5gKS4KICBzdGF0aWMgY29uc3QgRmllbGRJbml0aWFsaXplcklkZW50aWZpZXJDb250ZXh0IGZpZWxkSW5pdGlhbGl6ZXIgPQogICAgICBjb25zdCBGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBmb3JtYWwgcGFyYW1ldGVyIGJlaW5nIGRlY2xhcmVkIGFzIHBhcnQgb2YgYSBmdW5jdGlvbiwKICAvLy8gbWV0aG9kLCBvciB0eXBlZGVmIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBGb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0CiAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uID0KICAgICAgY29uc3QgRm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBhIGZvcm1hbCBwYXJhbWV0ZXIgYmVpbmcgZGVjbGFyZWQgYXMgcGFydCBvZiBhIGNhdGNoIGJsb2NrCiAgLy8vIGluIGEgdHJ5L2NhdGNoL2ZpbmFsbHkgc3RhdGVtZW50LgogIHN0YXRpYyBjb25zdCBDYXRjaFBhcmFtZXRlcklkZW50aWZpZXJDb250ZXh0IGNhdGNoUGFyYW1ldGVyID0KICAgICAgY29uc3QgQ2F0Y2hQYXJhbWV0ZXJJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSBsaWJyYXJ5IG5hbWUgKGUuZy4gYGZvb2AgaW4gdGhlIGRpcmVjdGl2ZQogIC8vLyAnbGlicmFyeSBmb287YCkuCiAgc3RhdGljIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dCBsaWJyYXJ5TmFtZSA9CiAgICAgIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIGEgbGlicmFyeSBuYW1lLCBidXQgaXQncyBub3QgdGhlIGZpcnN0IGlkZW50aWZpZXIgaW4KICAvLy8gdGhlIG5hbWUuCiAgc3RhdGljIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dCBsaWJyYXJ5TmFtZUNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgbGlicmFyeSBuYW1lIHJlZmVyZW5jZWQgYnkgYSBgcGFydCBvZmAKICAvLy8gZGlyZWN0aXZlIChlLmcuIGBmb29gIGluIHRoZSBkaXJlY3RpdmUgYHBhcnQgb2YgZm9vO2ApLgogIHN0YXRpYyBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQgcGFydE5hbWUgPQogICAgICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQucGFydE5hbWUoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIGxpYnJhcnkgbmFtZSByZWZlcmVuY2VkIGJ5IGEgYHBhcnQgb2ZgIGRpcmVjdGl2ZSwKICAvLy8gYnV0IGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIGluIHRoZSBuYW1lLgogIHN0YXRpYyBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQgcGFydE5hbWVDb250aW51YXRpb24gPQogICAgICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQucGFydE5hbWVDb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHR5cGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhbiBlbnVtIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBFbnVtRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBlbnVtRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBFbnVtRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBhbiBlbnVtZXJhdGVkIHZhbHVlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYW4gZW51bQogIC8vLyBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgRW51bVZhbHVlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBlbnVtVmFsdWVEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IEVudW1WYWx1ZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBjbGFzcyBkZWNsYXJhdGlvbiwgYSBtaXhpbgogIC8vLyBkZWNsYXJhdGlvbiwgb3IgYSBuYW1lZCBtaXhpbiBhcHBsaWNhdGlvbiwgZm9yIGV4YW1wbGUsCiAgLy8vIGBGb29gIGluIGBjbGFzcyBGb28gPSBYIHdpdGggWTtgLgogIHN0YXRpYyBjb25zdCBDbGFzc09yTWl4aW5PckV4dGVuc2lvbklkZW50aWZpZXJDb250ZXh0CiAgICAgIGNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBDbGFzc09yTWl4aW5PckV4dGVuc2lvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIGEgdHlwZSB2YXJpYWJsZSBiZWluZyBkZWNsYXJlZCAoZS5nLiBgRm9vYCBpbgogIC8vLyBgY2xhc3MgQzxGb28gZXh0ZW5kcyBudW0+IHt9YCkuCiAgc3RhdGljIGNvbnN0IFR5cGVWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQKICAgICAgdHlwZVZhcmlhYmxlRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBUeXBlVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIHR5cGUgdGhhdCBzdGFydHMgd2l0aCBwcmVmaXguCiAgc3RhdGljIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBwcmVmaXhlZFR5cGVSZWZlcmVuY2UgPQogICAgICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgdGhlIHN0YXJ0IG9mIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWNsYXJlZCBlbHNld2hlcmUuCiAgc3RhdGljIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCB0eXBlUmVmZXJlbmNlID0KICAgICAgY29uc3QgVHlwZVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHBhcnQgb2YgYSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlY2xhcmVkIGVsc2V3aGVyZSwgYnV0IGl0J3MKICAvLy8gbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIG9mIHRoZSByZWZlcmVuY2UuCiAgc3RhdGljIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCB0eXBlUmVmZXJlbmNlQ29udGludWF0aW9uID0KICAgICAgY29uc3QgVHlwZVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyBhIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSB0b3AgbGV2ZWwgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dAogICAgICB0b3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb24gPSBjb25zdCBUb3BMZXZlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoCiAgICAgICAgICAndG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uJywgY29uc3QgWyc7JywgJz0nLCAnLCddKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgZmllbGQgZGVjbGFyYXRpb24uCiAgc3RhdGljIGNvbnN0IEZpZWxkRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBmaWVsZERlY2xhcmF0aW9uID0KICAgICAgY29uc3QgRmllbGREZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgdG9wIGxldmVsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBUb3BMZXZlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQKICAgICAgdG9wTGV2ZWxGdW5jdGlvbkRlY2xhcmF0aW9uID0gY29uc3QgVG9wTGV2ZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KAogICAgICAgICAgJ3RvcExldmVsRnVuY3Rpb25EZWNsYXJhdGlvbicsIGNvbnN0IFsnPCcsICcoJywgJ3snLCAnPT4nXSk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIG1ldGhvZAogIC8vLyBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBtZXRob2REZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IE1ldGhvZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIG1ldGhvZCBkZWNsYXJhdGlvbiwKICAvLy8gYnV0IGl0J3Mgbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIG9mIHRoZSBuYW1lLgogIC8vLwogIC8vLyBJbiB2YWxpZCBEYXJ0LCB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiBhCiAgLy8vIG5hbWVkIGNvbnN0cnVjdG9yIHdoaWNoIGlzIGJlaW5nIGRlY2xhcmVkLCBlLmcuIGBmb29gIGluCiAgLy8vIGBjbGFzcyBDIHsgQy5mb28oKTsgfWAuCiAgc3RhdGljIGNvbnN0IE1ldGhvZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQKICAgICAgbWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24gPQogICAgICBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBhcHBlYXJzIGFmdGVyIHRoZSB3b3JkIGBvcGVyYXRvcmAgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24uCiAgLy8vCiAgLy8vIFRPRE8ocGF1bGJlcnJ5LGFoZSk6IERvZXMgdGhpcyBldmVyIG9jY3VyIGluIHZhbGlkIERhcnQsIG9yIGRvZXMgaXQgb25seQogIC8vLyBvY2N1ciBhcyBwYXJ0IG9mIGVycm9yIHJlY292ZXJ5PyAgSWYgaXQncyBvbmx5IGFzIHBhcnQgb2YgZXJyb3IgcmVjb3ZlcnksCiAgLy8vIHBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgcmUtdXNlIG1ldGhvZERlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBNZXRob2REZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IG9wZXJhdG9yTmFtZSA9CiAgICAgIGNvbnN0IE1ldGhvZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHRoZSBzdGFydCBvZiB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZCBieSBhIGxvY2FsIGZ1bmN0aW9uCiAgLy8vIGRlY2xhcmF0aW9uLgogIHN0YXRpYyBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dAogICAgICBsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24gPQogICAgICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBwYXJ0IG9mIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkIGJ5IGEgbG9jYWwgZnVuY3Rpb24KICAvLy8gZGVjbGFyYXRpb24sIGJ1dCBpdCdzIG5vdCB0aGUgZmlyc3QgaWRlbnRpZmllciBvZiB0aGUgbmFtZS4KICAvLy8KICAvLy8gVE9ETyhwYXVsYmVycnksYWhlKTogRG9lcyB0aGlzIGV2ZXIgb2NjdXIgaW4gdmFsaWQgRGFydCwgb3IgZG9lcyBpdCBvbmx5CiAgLy8vIG9jY3VyIGFzIHBhcnQgb2YgZXJyb3IgcmVjb3Zlcnk/CiAgc3RhdGljIGNvbnN0IExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0CiAgICAgIGxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbkNvbnRpbnVhdGlvbiA9CiAgICAgIGNvbnN0IExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSByZWZlcmVuY2UgdG8gYSBjb25zdHJ1Y3RvciBkZWNsYXJlZAogIC8vLyBlbHNld2hlcmUuCiAgc3RhdGljIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgY29uc3RydWN0b3JSZWZlcmVuY2UgPQogICAgICBjb25zdCBDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGlzIHBhcnQgb2YgYSByZWZlcmVuY2UgdG8gYSBjb25zdHJ1Y3RvciBkZWNsYXJlZCBlbHNld2hlcmUsIGJ1dAogIC8vLyBpdCdzIG5vdCB0aGUgZmlyc3QgaWRlbnRpZmllciBvZiB0aGUgcmVmZXJlbmNlLgogIHN0YXRpYyBjb25zdCBDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0CiAgICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uID0KICAgICAgY29uc3QgQ29uc3RydWN0b3JSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGRlY2xhcmVkIGVsc2V3aGVyZSwgYnV0CiAgLy8vIGl0IGFwcGVhcnMgYWZ0ZXIgdHlwZSBwYXJhbWV0ZXJzIChlLmcuIGBmb29gIGluIGBYPFk+LmZvb2ApLgogIHN0YXRpYyBjb25zdCBDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0CiAgICAgIGNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzID0KICAgICAgY29uc3QgQ29uc3RydWN0b3JSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dAogICAgICAgICAgLmNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cygpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBsYWJlbCAoaS5lLiBpdCBpcyBmb2xsb3dlZCBieSBgOmAgYW5kCiAgLy8vIHRoZW4gYSBzdGF0ZW1lbnQpLgogIHN0YXRpYyBjb25zdCBMYWJlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgbGFiZWxEZWNsYXJhdGlvbiA9CiAgICAgIGNvbnN0IExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyB0aGUgc3RhcnQgb2YgYSByZWZlcmVuY2Ugb2NjdXJyaW5nIGluIGEgbGl0ZXJhbCBzeW1ib2wgKGUuZy4KICAvLy8gYGZvb2AgaW4gYCNmb29gKS4KICBzdGF0aWMgY29uc3QgTGl0ZXJhbFN5bWJvbElkZW50aWZpZXJDb250ZXh0IGxpdGVyYWxTeW1ib2wgPQogICAgICBjb25zdCBMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgcGFydCBvZiBhIHJlZmVyZW5jZSBvY2N1cnJpbmcgaW4gYSBsaXRlcmFsIHN5bWJvbCwgYnV0IGl0J3MKICAvLy8gbm90IHRoZSBmaXJzdCBpZGVudGlmaWVyIG9mIHRoZSByZWZlcmVuY2UgKGUuZy4gYGZvb2AgaW4gYCNwcmVmaXguZm9vYCkuCiAgc3RhdGljIGNvbnN0IExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dCBsaXRlcmFsU3ltYm9sQ29udGludWF0aW9uID0KICAgICAgY29uc3QgTGl0ZXJhbFN5bWJvbElkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBhcHBlYXJzIGluIGFuIGV4cHJlc3Npb24sIGFuZCBpdCBkb2VzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3cgYQogIC8vLyBgLmAuCiAgc3RhdGljIGNvbnN0IEV4cHJlc3Npb25JZGVudGlmaWVyQ29udGV4dCBleHByZXNzaW9uID0KICAgICAgY29uc3QgRXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0KCk7CgogIC8vLyBJZGVudGlmaWVyIGFwcGVhcnMgaW4gYW4gZXhwcmVzc2lvbiwgYW5kIGl0IGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBgLmAuCiAgc3RhdGljIGNvbnN0IEV4cHJlc3Npb25JZGVudGlmaWVyQ29udGV4dCBleHByZXNzaW9uQ29udGludWF0aW9uID0KICAgICAgY29uc3QgRXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpOwoKICAvLy8gSWRlbnRpZmllciBpcyBhIHJlZmVyZW5jZSB0byBhIG5hbWVkIGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kCiAgLy8vIGludm9jYXRpb24gKGUuZy4gYGZvb2AgaW4gYGYoZm9vOiAwKTtgLgogIHN0YXRpYyBjb25zdCBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgbmFtZWRBcmd1bWVudFJlZmVyZW5jZSA9CiAgICAgIGNvbnN0IE5hbWVkQXJndW1lbnRSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCgpOwoKICAvLy8gSWRlbnRpZmllciBpcyBhIG5hbWUgYmVpbmcgZGVjbGFyZWQgYnkgYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KICBzdGF0aWMgY29uc3QgTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQKICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uID0KICAgICAgY29uc3QgTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKTsKCiAgLy8vIElkZW50aWZpZXIgaXMgYSByZWZlcmVuY2UgdG8gYSBsYWJlbCAoZS5nLiBgZm9vYCBpbiBgYnJlYWsgZm9vO2ApLgogIC8vLyBMYWJlbHMgaGF2ZSB0aGVpciBvd24gc2NvcGUuCiAgc3RhdGljIGNvbnN0IExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgbGFiZWxSZWZlcmVuY2UgPQogICAgICBjb25zdCBMYWJlbFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCk7CgogIGZpbmFsIFN0cmluZyBfbmFtZTsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZGVudGlmaWVyIHJlcHJlc2VudHMgYSBuYW1lIHdoaWNoIGlzIGJlaW5nCiAgLy8vIGRlY2xhcmVkLgogIGZpbmFsIGJvb2wgaW5EZWNsYXJhdGlvbjsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZGVudGlmaWVyIGlzIHdpdGhpbiBhIGBsaWJyYXJ5YCBvciBgcGFydCBvZmAKICAvLy8gZGVjbGFyYXRpb24uCiAgZmluYWwgYm9vbCBpbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkZW50aWZpZXIgaXMgd2l0aGluIGEgc3ltYm9sIGxpdGVyYWwuCiAgZmluYWwgYm9vbCBpblN5bWJvbDsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZGVudGlmaWVyIGZvbGxvd3MgYSBgLmAuCiAgZmluYWwgYm9vbCBpc0NvbnRpbnVhdGlvbjsKCiAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpZGVudGlmaWVyIHNob3VsZCBiZSBsb29rZWQgdXAgaW4gdGhlIGN1cnJlbnQgc2NvcGUuCiAgZmluYWwgYm9vbCBpc1Njb3BlUmVmZXJlbmNlOwoKICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgYnVpbHQtaW4gaWRlbnRpZmllcnMgYXJlIGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0LgogIGZpbmFsIGJvb2wgaXNCdWlsdEluSWRlbnRpZmllckFsbG93ZWQ7CgogIC8vLyBJbmRpY2F0ZWQgd2hldGhlciB0aGUgaWRlbnRpZmllciBpcyBhbGxvd2VkIGluIGEgY29udGV4dCB3aGVyZSBjb25zdGFudAogIC8vLyBleHByZXNzaW9ucyBhcmUgcmVxdWlyZWQuCiAgZmluYWwgYm9vbCBhbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb247CgogIGZpbmFsIFRlbXBsYXRlPF9NZXNzYWdlV2l0aEFyZ3VtZW50PFRva2VuPj4gcmVjb3ZlcnlUZW1wbGF0ZTsKCiAgY29uc3QgSWRlbnRpZmllckNvbnRleHQodGhpcy5fbmFtZSwKICAgICAge3RoaXMuaW5EZWNsYXJhdGlvbjogZmFsc2UsCiAgICAgIHRoaXMuaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbjogZmFsc2UsCiAgICAgIHRoaXMuaW5TeW1ib2w6IGZhbHNlLAogICAgICB0aGlzLmlzQ29udGludWF0aW9uOiBmYWxzZSwKICAgICAgdGhpcy5pc1Njb3BlUmVmZXJlbmNlOiBmYWxzZSwKICAgICAgdGhpcy5pc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogdHJ1ZSwKICAgICAgYm9vbCBhbGxvd2VkSW5Db25zdGFudEV4cHJlc3Npb24sCiAgICAgIHRoaXMucmVjb3ZlcnlUZW1wbGF0ZTogdGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXJ9KQogICAgICA6IHRoaXMuYWxsb3dlZEluQ29uc3RhbnRFeHByZXNzaW9uID0KICAgICAgICAgICAgLy8gR2VuZXJhbGx5LCBkZWNsYXJhdGlvbnMgYXJlIGxlZ2FsIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgQQogICAgICAgICAgICAvLyBjb250aW51YXRpb24gZG9lc24ndCBhZmZlY3QgY29uc3RhbnQgZXhwcmVzc2lvbnM6IGlmIHdoYXQgaXQncwogICAgICAgICAgICAvLyBjb250aW51aW5nIGlzIGEgcHJvYmxlbSwgaXQgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KICAgICAgICAgICAgYWxsb3dlZEluQ29uc3RhbnRFeHByZXNzaW9uID8/CiAgICAgICAgICAgICAgICAoaW5EZWNsYXJhdGlvbiB8fCBpc0NvbnRpbnVhdGlvbiB8fCBpblN5bWJvbCk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9uYW1lOwoKICAvLy8gRW5zdXJlIHRoYXQgdGhlIG5leHQgdG9rZW4gaXMgYW4gaWRlbnRpZmllciAob3Iga2V5d29yZCB3aGljaCBzaG91bGQgYmUKICAvLy8gdHJlYXRlZCBhcyBhbiBpZGVudGlmaWVyKSBhbmQgcmV0dXJuIHRoYXQgaWRlbnRpZmllci4KICAvLy8gUmVwb3J0IGVycm9ycyBhcyBuZWNlc3NhcnkgdmlhIFtwYXJzZXJdLgogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIGFzc2VydCh0b2tlbi5uZXh0LmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSW1wbGVtZW50IHRoaXMgbWV0aG9kIGZvciBlYWNoIGlkZW50aWZpZXIgY29udGV4dAogICAgLy8gc3VjaCB0aGF0IHRoZXkgcmV0dXJuIGEgbm9uLW51bGwgdmFsdWUuCiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCi8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbdG9rZW5dIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgdGhlIHN0YXJ0IG9mCi8vLyBhbiBleHByZXNzaW9uIGZvciB0aGUgcHVycG9zZXMgb2YgcmVjb3ZlcnkuCmJvb2wgbG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0KFRva2VuIG5leHQpID0+CiAgICBuZXh0LmlzSWRlbnRpZmllciB8fAogICAgbmV4dC5pc0tleXdvcmQgJiYgIWxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KG5leHQpIHx8CiAgICBuZXh0LnR5cGUgPT0gVG9rZW5UeXBlLkRPVUJMRSB8fAogICAgbmV4dC50eXBlID09IFRva2VuVHlwZS5IQVNIIHx8CiAgICBuZXh0LnR5cGUgPT0gVG9rZW5UeXBlLkhFWEFERUNJTUFMIHx8CiAgICBuZXh0LnR5cGUgPT0gVG9rZW5UeXBlLklERU5USUZJRVIgfHwKICAgIG5leHQudHlwZSA9PSBUb2tlblR5cGUuSU5UIHx8CiAgICBuZXh0LnR5cGUgPT0gVG9rZW5UeXBlLlNUUklORyB8fAogICAgb3B0aW9uYWwoJ3snLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJygnLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJ1snLCBuZXh0KSB8fAogICAgb3B0aW9uYWwoJ1tdJywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCc8JywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCchJywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCctJywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCd+JywgbmV4dCkgfHwKICAgIG9wdGlvbmFsKCcrKycsIG5leHQpIHx8CiAgICBvcHRpb25hbCgnLS0nLCBuZXh0KTsKCi8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbdG9rZW5dIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgdGhlIHN0YXJ0IG9mCi8vLyBhIG5ldyBzdGF0ZW1lbnQgZm9yIHRoZSBwdXJwb3NlcyBvZiByZWNvdmVyeS4KYm9vbCBsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChUb2tlbiB0b2tlbikgPT4gaXNPbmVPZk9yRW9mKHRva2VuLCBjb25zdCBbCiAgICAgICdAJywKICAgICAgJ2Fzc2VydCcsICdicmVhaycsICdjb250aW51ZScsICdkbycsICdlbHNlJywgJ2ZpbmFsJywgJ2ZvcicsIC8vCiAgICAgICdpZicsICdyZXR1cm4nLCAnc3dpdGNoJywgJ3RyeScsICd2YXInLCAndm9pZCcsICd3aGlsZScsIC8vCiAgICBdKTsKCi8vIFRPRE8oYWhlKTogUmVtb3ZlIHdoZW4gYW5hbHl6ZXIgc3VwcG9ydHMgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gc3ludGF4Lgp0eXBlZGVmIF9NZXNzYWdlV2l0aEFyZ3VtZW50PFQ+ID0gTWVzc2FnZSBGdW5jdGlvbihUKTsKgVAATk48ASA4ATYBQAEnAScBMAFNTzIES1E6Gk8hRy0BSg44KwFROEQ4AUYSOCsBSTtGMgFRNUk/AVFKMi9RAUZIMwFMJ0QxAU0mOyM7AU8oQC8BTRc2KAFREEI1AUo+MzEBUDU/PQFJQjABRxNMNQFMPig4KzgBTiY4IDgBUEY3AUs+LgFPMUo7AU80UEEBQkQxAVE0UEcBRRNGMgFNNQZNPx4yJj8BTAZPUDdBPwFNEzkhOQFIQgZPJzktRgFHEUw1AVE2NSlCAVFDNTsyLQFPGUQxAVEYPi4BUE9KOwFQCzgrAU1EOAFMLlA3AUs5ITkBSSNALwEWAUgQHAFKEysBQxcBNh0BUR8BSikBTiAqAUABJiIwHCIkLSg6K01ORis/AR4BTjwvNzFJLxEEAgFLMC0ZOCUjKikiJRsbGxwbGxsbHBoBSzJJC0ZCCAFJNwE+cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvaWRlbnRpZmllcl9jb250ZXh0LmRhcnRjZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9tZW1iZXJfa2luZC5kYXJ0hDUvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlci5tZW1iZXJfa2luZDsKCmVudW0gTWVtYmVyS2luZCB7CiAgLy8vIEEgY2F0Y2ggYmxvY2ssIG5vdCBhIHJlYWwgbWVtYmVyLgogIENhdGNoLAoKICAvLy8gQSBmYWN0b3J5CiAgRmFjdG9yeSwKCiAgLy8vIE9sZC1zdHlsZSB0eXBlZGVmLgogIEZ1bmN0aW9uVHlwZUFsaWFzLAoKICAvLy8gT2xkLXN0eWxlIGZ1bmN0aW9uLXR5cGVkIHBhcmFtZXRlciwgbm90IGEgcmVhbCBtZW1iZXIuCiAgRnVuY3Rpb25UeXBlZFBhcmFtZXRlciwKCiAgLy8vIEEgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gdHlwZSwgbm90IGEgcmVhbCBtZW1iZXIuCiAgR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUsCgogIC8vLyBBIGxvY2FsIGZ1bmN0aW9uLgogIExvY2FsLAoKICAvLy8gQSBub24tc3RhdGljIG1ldGhvZCBpbiBhIGNsYXNzIChpbmNsdWRpbmcgY29uc3RydWN0b3JzKS4KICBOb25TdGF0aWNNZXRob2QsCgogIC8vLyBBIHN0YXRpYyBtZXRob2QgaW4gYSBjbGFzcy4KICBTdGF0aWNNZXRob2QsCgogIC8vLyBBIHRvcC1sZXZlbCBtZXRob2QuCiAgVG9wTGV2ZWxNZXRob2QsCgogIC8vLyBBIG5vbi1zdGF0aWMgbWV0aG9kIGluIGFuIGV4dGVuc2lvbi4KICBFeHRlbnNpb25Ob25TdGF0aWNNZXRob2QsCgogIC8vLyBBIHN0YXRpYyBtZXRob2QgaW4gYW4gZXh0ZW5zaW9uLgogIEV4dGVuc2lvblN0YXRpY01ldGhvZCwKCiAgLy8vIEFuIGluc3RhbmNlIGZpZWxkIGluIGEgY2xhc3MuCiAgTm9uU3RhdGljRmllbGQsCgogIC8vLyBBIHN0YXRpYyBmaWVsZCBpbiBhIGNsYXNzLgogIFN0YXRpY0ZpZWxkLAoKICAvLy8gQSB0b3AtbGV2ZWwgZmllbGQuCiAgVG9wTGV2ZWxGaWVsZCwKfQozAE5OPAEwARIoCQEQCwEZFQE9GgE2GwEYCQE/EwEiEAEaEgErHAEnGQEkEgEhDwEZEQIBN3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL21lbWJlcl9raW5kLmRhcnRoZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci90b3BfbGV2ZWxfcGFyc2VyLmRhcnSDZC8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLnRvcF9sZXZlbF9wYXJzZXI7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnZGVjbGFyYXRpb25fa2luZC5kYXJ0JyBzaG93IERlY2xhcmF0aW9uS2luZDsKCmltcG9ydCAnY2xhc3NfbWVtYmVyX3BhcnNlci5kYXJ0JyBzaG93IENsYXNzTWVtYmVyUGFyc2VyOwoKaW1wb3J0ICdsaXN0ZW5lci5kYXJ0JyBzaG93IExpc3RlbmVyOwoKLy8vIFBhcnNlciB3aGljaCBvbmx5IHBhcnNlcyB0b3AtbGV2ZWwgZWxlbWVudHMsIGJ1dCBpZ25vcmVzIHRoZWlyIGJvZGllcy4KLy8vIFVzZSBbUGFyc2VyXSB0byBwYXJzZSBldmVyeXRoaW5nLgpjbGFzcyBUb3BMZXZlbFBhcnNlciBleHRlbmRzIENsYXNzTWVtYmVyUGFyc2VyIHsKICBUb3BMZXZlbFBhcnNlcihMaXN0ZW5lciBsaXN0ZW5lcikgOiBzdXBlcihsaXN0ZW5lcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlQ2xhc3NPck1peGluT3JFeHRlbnNpb25Cb2R5KAogICAgICAgICAgVG9rZW4gdG9rZW4sIERlY2xhcmF0aW9uS2luZCBraW5kLCBTdHJpbmcgZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lKSA9PgogICAgICBza2lwQ2xhc3NPck1peGluT3JFeHRlbnNpb25Cb2R5KHRva2VuKTsKfQoaAE5OPAE1ASsBNQE6ASYBSyYxNwEMKlEuAgE8cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdG9wX2xldmVsX3BhcnNlci5kYXJ0XGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvdXRpbC5kYXJ0mtQvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlci51dGlsOwoKaW1wb3J0ICcuLi9tZXNzYWdlcy9jb2Rlcy5kYXJ0JyBzaG93IG5vTGVuZ3RoOwoKaW1wb3J0ICcuLi9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbi5kYXJ0JwogICAgc2hvdyBCZWdpblRva2VuLCBTaW1wbGVUb2tlbiwgU3ludGhldGljVG9rZW4sIFRva2VuVHlwZTsKCi8vLyBSZXR1cm5zIHRydWUgaWYgW3Rva2VuXSBpcyB0aGUgc3ltYm9sIG9yIGtleXdvcmQgW3ZhbHVlXS4KYm9vbCBvcHRpb25hbChTdHJpbmcgdmFsdWUsIFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIGlkZW50aWNhbCh2YWx1ZSwgdG9rZW4uc3RyaW5nVmFsdWUpOwp9CgovLy8gUmV0dXJucyB0aGUgdG9rZW4gYmVmb3JlIHRoZSBjbG9zZSBicmFjZSwgYnJhY2tldCwgb3IgcGFyZW50aGVzaXMKLy8vIGFzc29jaWF0ZWQgd2l0aCBbbGVmdF0uIEZvciAnPCcsIGl0IG1heSByZXR1cm4gYG51bGxgLgpUb2tlbiBiZWZvcmVDbG9zZUJyYWNlVG9rZW5Gb3IoQmVnaW5Ub2tlbiBsZWZ0KSB7CiAgVG9rZW4gZW5kVG9rZW4gPSBsZWZ0LmVuZFRva2VuOwogIGlmIChlbmRUb2tlbiA9PSBudWxsKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgVG9rZW4gdG9rZW4gPSBsZWZ0OwogIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogIHdoaWxlIChuZXh0ICE9IGVuZFRva2VuICYmIG5leHQgIT0gbmV4dC5uZXh0KSB7CiAgICB0b2tlbiA9IG5leHQ7CiAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICB9CiAgcmV0dXJuIHRva2VuOwp9CgovLy8gUmV0dXJuIFt0b2tlbl0gb3IgYSB0b2tlbiBiZWZvcmUgW3Rva2VuXSB3aGljaCBpcyBlaXRoZXIKLy8vIG5vdCBzeW50aGV0aWMgb3Igc3ludGhldGljIHdpdGggbm9uLXplcm8gbGVuZ3RoLgpUb2tlbiBmaW5kUHJldmlvdXNOb25aZXJvTGVuZ3RoVG9rZW4oVG9rZW4gdG9rZW4pIHsKICB3aGlsZSAodG9rZW4uaXNTeW50aGV0aWMgJiYgdG9rZW4ubGVuZ3RoID09IDApIHsKICAgIFRva2VuIHByZXZpb3VzID0gdG9rZW4uYmVmb3JlU3ludGhldGljOwogICAgaWYgKHByZXZpb3VzID09IHRva2VuKSB7CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJ0b2tlbiA9PSB0b2tlbi5iZWZvcmVTeW50aGV0aWMiKTsKICAgIH0KICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgdG9rZW4gPSBwcmV2aW91czsKICB9CiAgcmV0dXJuIHRva2VuOwp9CgovLy8gUmV0dXJuIFt0b2tlbl0gb3IgYSB0b2tlbiBhZnRlciBbdG9rZW5dIHdoaWNoIGlzIGVpdGhlcgovLy8gbm90IHN5bnRoZXRpYyBvciBzeW50aGV0aWMgd2l0aCBub24temVybyBsZW5ndGguCi8vLyBUaGlzIG1heSByZXR1cm4gRU9GIGlmIHRoZXJlIGFyZSBubyBtb3JlIG5vbi1zeW50aGV0aWMgdG9rZW5zIGluIHRoZSBzdHJlYW0uClRva2VuIGZpbmROb25aZXJvTGVuZ3RoVG9rZW4oVG9rZW4gdG9rZW4pIHsKICB3aGlsZSAodG9rZW4uaXNTeW50aGV0aWMgJiYgdG9rZW4ubGVuZ3RoID09IDAgJiYgIXRva2VuLmlzRW9mKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgfQogIHJldHVybiB0b2tlbjsKfQoKYm9vbCBpc0RpZ2l0KGludCBjKSA9PiBjID49IDB4MzAgJiYgYyA8PSAweDM5OwoKYm9vbCBpc0xldHRlcihpbnQgYykgPT4gYyA+PSAweDQxICYmIGMgPD0gMHg1QSB8fCBjID49IDB4NjEgJiYgYyA8PSAweDdBOwoKYm9vbCBpc0xldHRlck9yRGlnaXQoaW50IGMpID0+IGlzTGV0dGVyKGMpIHx8IGlzRGlnaXQoYyk7Cgpib29sIGlzV2hpdGVzcGFjZShpbnQgYykgPT4gYyA9PSAweDIwIHx8IGMgPT0gMHhBIHx8IGMgPT0gMHhEIHx8IGMgPT0gMHg5OwoKLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0b2tlbiBtYXRjaGVzIG9uZSBvZiB0aGUgZ2l2ZW4gdmFsdWVzLgpib29sIGlzT25lT2YoVG9rZW4gdG9rZW4sIEl0ZXJhYmxlPFN0cmluZz4gdmFsdWVzKSB7CiAgZm9yIChTdHJpbmcgdG9rZW5WYWx1ZSBpbiB2YWx1ZXMpIHsKICAgIGlmIChvcHRpb25hbCh0b2tlblZhbHVlLCB0b2tlbikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQoKLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0b2tlbiBtYXRjaGVzIG9uZSBvZiB0aGUgZ2l2ZW4gdmFsdWVzIG9yIGlzIEVPRi4KYm9vbCBpc09uZU9mT3JFb2YoVG9rZW4gdG9rZW4sIEl0ZXJhYmxlPFN0cmluZz4gdmFsdWVzKSB7CiAgZm9yIChTdHJpbmcgdG9rZW5WYWx1ZSBpbiB2YWx1ZXMpIHsKICAgIGlmIChvcHRpb25hbCh0b2tlblZhbHVlLCB0b2tlbikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiB0b2tlbi5pc0VvZjsKfQoKLy8vIEEgbnVsbC1hd2FyZSBhbHRlcm5hdGl2ZSB0byBgdG9rZW4ubGVuZ3RoYC4gIElmIFt0b2tlbl0gaXMgYG51bGxgLCByZXR1cm5zCi8vLyBbbm9MZW5ndGhdLgppbnQgbGVuZ3RoRm9yVG9rZW4oVG9rZW4gdG9rZW4pIHsKICByZXR1cm4gdG9rZW4gPT0gbnVsbCA/IG5vTGVuZ3RoIDogdG9rZW4ubGVuZ3RoOwp9CgovLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFuIGZyb20gW2JlZ2luXSB0byBbZW5kXSAoaW5jbHVzaXZlKS4gSWYgYm90aAovLy8gdG9rZW5zIGFyZSBudWxsLCByZXR1cm4gW25vTGVuZ3RoXS4gSWYgb25lIG9mIHRoZSB0b2tlbnMgYXJlIG51bGwsIHJldHVybgovLy8gdGhlIGxlbmd0aCBvZiB0aGUgb3RoZXIgdG9rZW4uCmludCBsZW5ndGhPZlNwYW4oVG9rZW4gYmVnaW4sIFRva2VuIGVuZCkgewogIGlmIChiZWdpbiA9PSBudWxsKSByZXR1cm4gbGVuZ3RoRm9yVG9rZW4oZW5kKTsKICBpZiAoZW5kID09IG51bGwpIHJldHVybiBsZW5ndGhGb3JUb2tlbihiZWdpbik7CiAgcmV0dXJuIGVuZC5vZmZzZXQgKyBlbmQubGVuZ3RoIC0gYmVnaW4ub2Zmc2V0Owp9CgpUb2tlbiBza2lwTWV0YWRhdGEoVG9rZW4gdG9rZW4pIHsKICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgYXNzZXJ0KG9wdGlvbmFsKCdAJywgdG9rZW4pKTsKICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICBpZiAobmV4dC5pc0lkZW50aWZpZXIpIHsKICAgIHRva2VuID0gbmV4dDsKICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgd2hpbGUgKG9wdGlvbmFsKCcuJywgbmV4dCkpIHsKICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgdG9rZW4gPSBuZXh0OwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICB9CiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSAmJiAhbmV4dC5lbmRHcm91cC5pc1N5bnRoZXRpYykgewogICAgICB0b2tlbiA9IG5leHQuZW5kR3JvdXA7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogIH0KICByZXR1cm4gdG9rZW47Cn0KCi8vLyBTcGxpdCBgPj1gIGludG8gdHdvIHNlcGFyYXRlIHRva2Vucy4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KVG9rZW4gc3BsaXRHdEVxKFRva2VuIHRva2VuKSB7CiAgYXNzZXJ0KG9wdGlvbmFsKCc+PScsIHRva2VuKSk7CiAgcmV0dXJuIG5ldyBTaW1wbGVUb2tlbigKICAgICAgVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykKICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkVRLCB0b2tlbi5jaGFyT2Zmc2V0ICsgMSkKICAgICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAgIC4ubmV4dCA9IHRva2VuLm5leHQpOwp9CgovLy8gU3BsaXQgYD4+YCBpbnRvIHR3byBzZXBhcmF0ZSB0b2tlbnMuCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClNpbXBsZVRva2VuIHNwbGl0R3RHdChUb2tlbiB0b2tlbikgewogIGFzc2VydChvcHRpb25hbCgnPj4nLCB0b2tlbikpOwogIHJldHVybiBuZXcgU2ltcGxlVG9rZW4oCiAgICAgIFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpCiAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCArIDEpCiAgICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgICAuLm5leHQgPSB0b2tlbi5uZXh0KTsKfQoKLy8vIFNwbGl0IGA+Pj1gIGludG8gdGhyZWUgc2VwYXJhdGUgdG9rZW5zLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpUb2tlbiBzcGxpdEd0R3RFcShUb2tlbiB0b2tlbikgewogIGFzc2VydChvcHRpb25hbCgnPj49JywgdG9rZW4pKTsKICByZXR1cm4gbmV3IFNpbXBsZVRva2VuKAogICAgICBUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQsIHRva2VuLnByZWNlZGluZ0NvbW1lbnRzKQogICAgLi5zZXROZXh0KG5ldyBTaW1wbGVUb2tlbihUb2tlblR5cGUuR1QsIHRva2VuLmNoYXJPZmZzZXQgKyAxKQogICAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5FUSwgdG9rZW4uY2hhck9mZnNldCArIDIpCiAgICAgICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAgICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgICAgICAuLm5leHQgPSB0b2tlbi5uZXh0KSk7Cn0KCi8vLyBTcGxpdCBgPj49YCBpbnRvIHR3byBzZXBhcmF0ZSB0b2tlbnMuLi4gYD5gIGZvbGxvd2VkIGJ5IGA+PWAuCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClRva2VuIHNwbGl0R3RGcm9tR3RHdEVxKFRva2VuIHRva2VuKSB7CiAgYXNzZXJ0KG9wdGlvbmFsKCc+Pj0nLCB0b2tlbikpOwogIHJldHVybiBuZXcgU2ltcGxlVG9rZW4oCiAgICAgIFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpCiAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5HVF9FUSwgdG9rZW4uY2hhck9mZnNldCArIDEpCiAgICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgICAuLm5leHQgPSB0b2tlbi5uZXh0KTsKfQoKLy8vIFNwbGl0IGA+Pj5gIGludG8gdHdvIHNlcGFyYXRlIHRva2Vucy4uLiBgPmAgZm9sbG93ZWQgYnkgYD4+YC4KLy8vIENhbGwgW1Rva2VuLnNldE5leHRdIHRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHN0cmVhbS4KVG9rZW4gc3BsaXRHdEZyb21HdEd0R3QoVG9rZW4gdG9rZW4pIHsKICBhc3NlcnQob3B0aW9uYWwoJz4+PicsIHRva2VuKSk7CiAgcmV0dXJuIG5ldyBTaW1wbGVUb2tlbigKICAgICAgVG9rZW5UeXBlLkdULCB0b2tlbi5jaGFyT2Zmc2V0LCB0b2tlbi5wcmVjZWRpbmdDb21tZW50cykKICAgIC4uc2V0TmV4dChuZXcgU2ltcGxlVG9rZW4oVG9rZW5UeXBlLkdUX0dULCB0b2tlbi5jaGFyT2Zmc2V0ICsgMSkKICAgICAgLy8gU2V0IG5leHQgcmF0aGVyIHRoYW4gY2FsbGluZyBUb2tlbi5zZXROZXh0CiAgICAgIC8vIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIG5vdCBzZXQuCiAgICAgIC4ubmV4dCA9IHRva2VuLm5leHQpOwp9CgovLy8gU3BsaXQgYD4+Pj1gIGludG8gdHdvIHNlcGFyYXRlIHRva2Vucy4uLiBgPmAgZm9sbG93ZWQgYnkgYD4+PWAuCi8vLyBDYWxsIFtUb2tlbi5zZXROZXh0XSB0byBhZGQgdGhlIHRva2VuIHRvIHRoZSBzdHJlYW0uClRva2VuIHNwbGl0R3RGcm9tR3RHdEd0RXEoVG9rZW4gdG9rZW4pIHsKICBhc3NlcnQob3B0aW9uYWwoJz4+Pj0nLCB0b2tlbikpOwogIHJldHVybiBuZXcgU2ltcGxlVG9rZW4oCiAgICAgIFRva2VuVHlwZS5HVCwgdG9rZW4uY2hhck9mZnNldCwgdG9rZW4ucHJlY2VkaW5nQ29tbWVudHMpCiAgICAuLnNldE5leHQobmV3IFNpbXBsZVRva2VuKFRva2VuVHlwZS5HVF9HVF9FUSwgdG9rZW4uY2hhck9mZnNldCArIDEpCiAgICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgICAvLyBzbyB0aGF0IHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3Qgc2V0LgogICAgICAuLm5leHQgPSB0b2tlbi5uZXh0KTsKfQoKLy8vIFJldHVybiBhIHN5bnRoZXRpYyBgPmAgZm9sbG93ZWQgYnkgW25leHRdLgovLy8gQ2FsbCBbVG9rZW4uc2V0TmV4dF0gdG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgc3RyZWFtLgpUb2tlbiBzeW50aGV0aWNHdChUb2tlbiBuZXh0KSB7CiAgcmV0dXJuIG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuR1QsIG5leHQuY2hhck9mZnNldCkKICAgIC8vIFNldCBuZXh0IHJhdGhlciB0aGFuIGNhbGxpbmcgVG9rZW4uc2V0TmV4dAogICAgLy8gc28gdGhhdCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgbm90IHNldC4KICAgIC4ubmV4dCA9IG5leHQ7Cn0KgNEATk48ASkBLwEtAR89AT4rLgIBRjsyIhoRBBYbMhIXBBACAT01NDMsHT4GHA0GFgQQAgE8NVEsQxgEEAIBLwFKAToBSwFENSYnEwYEEAIBTjomJxMGBBYCAU8QIjICAU5OIysxMTECASIWIBsbEhciFBkfFhsIBj0dGQYEEAIBKTkfIRo/QjQwHAIBKTklIRo/QjQwHAIBLDkhIho/QkQ2Mh8CAUI5JyIaP0U0MBwCAUI5JyIaP0U0MBwCAUQ5KSMaP0g0MBwCAS85IDsyLhMCATBwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci91dGlsLmRhcnRmZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9zdGFja19saXN0ZW5lci5kYXJ0wABEzy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQuc3RhY2tfbGlzdGVuZXI7CgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnCiAgICBzaG93CiAgICAgICAgQ29kZSwKICAgICAgICBMb2NhdGVkTWVzc2FnZSwKICAgICAgICBNZXNzYWdlLAogICAgICAgIGNvZGVDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVycywKICAgICAgICBjb2RlTmF0aXZlQ2xhdXNlU2hvdWxkQmVBbm5vdGF0aW9uLAogICAgICAgIHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eSwKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZDsKCmltcG9ydCAnLi4vc2Nhbm5lci9zY2FubmVyLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2lkZW50aWZpZXJfY29udGV4dC5kYXJ0JyBzaG93IElkZW50aWZpZXJDb250ZXh0OwoKaW1wb3J0ICdwYXJzZXIuZGFydCcgc2hvdyBMaXN0ZW5lciwgTWVtYmVyS2luZCwgbGVuZ3RoT2ZTcGFuOwoKaW1wb3J0ICdxdW90ZS5kYXJ0JyBzaG93IHVuZXNjYXBlU3RyaW5nOwoKaW1wb3J0ICd2YWx1ZV9raW5kLmRhcnQnOwoKZW51bSBOdWxsVmFsdWUgewogIEFyZ3VtZW50cywKICBBcywKICBBd2FpdFRva2VuLAogIEJsb2NrLAogIEJyZWFrVGFyZ2V0LAogIENhc2NhZGVSZWNlaXZlciwKICBDb21iaW5hdG9ycywKICBDb21tZW50cywKICBDb25kaXRpb25hbFVyaXMsCiAgQ29uZGl0aW9uYWxseVNlbGVjdGVkSW1wb3J0LAogIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJTZXBhcmF0b3IsCiAgQ29uc3RydWN0b3JJbml0aWFsaXplcnMsCiAgQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMsCiAgQ29udGludWVUYXJnZXQsCiAgRGVmZXJyZWQsCiAgRG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgRXhwcmVzc2lvbiwKICBFeHRlbmRzQ2xhdXNlLAogIEZpZWxkSW5pdGlhbGl6ZXIsCiAgRm9ybWFsUGFyYW1ldGVycywKICBGdW5jdGlvbkJvZHksCiAgRnVuY3Rpb25Cb2R5QXN5bmNUb2tlbiwKICBGdW5jdGlvbkJvZHlTdGFyVG9rZW4sCiAgSWRlbnRpZmllciwKICBJZGVudGlmaWVyTGlzdCwKICBJbml0aWFsaXplcnMsCiAgTGFiZWxzLAogIE1ldGFkYXRhLAogIE1vZGlmaWVycywKICBOYW1lLAogIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSwKICBQcmVmaXgsCiAgU3RyaW5nTGl0ZXJhbCwKICBTd2l0Y2hTY29wZSwKICBUb2tlbiwKICBUeXBlLAogIFR5cGVBcmd1bWVudHMsCiAgVHlwZUJ1aWxkZXJMaXN0LAogIFR5cGVMaXN0LAogIFR5cGVWYXJpYWJsZSwKICBUeXBlVmFyaWFibGVzLAogIFZhckZpbmFsT3JDb25zdFRva2VuLAogIFdpdGhDbGF1c2UsCn0KCmFic3RyYWN0IGNsYXNzIFN0YWNrTGlzdGVuZXIgZXh0ZW5kcyBMaXN0ZW5lciB7CiAgc3RhdGljIGNvbnN0IGJvb2wgZGVidWdTdGFjayA9IGZhbHNlOwogIGZpbmFsIFN0YWNrIHN0YWNrID0gZGVidWdTdGFjayA/IG5ldyBEZWJ1Z1N0YWNrKCkgOiBuZXcgU3RhY2tJbXBsKCk7CgogIC8vLyBVc2VkIHRvIHJlcG9ydCBhbiBpbnRlcm5hbCBlcnJvciBlbmNvdW50ZXJlZCBpbiB0aGUgc3RhY2sgbGlzdGVuZXIuCiAgZHluYW1pYyBpbnRlcm5hbFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgVXJpIHVyaSk7CgogIC8vLyBDaGVja3MgdGhhdCBbdmFsdWVdIG1hdGNoZXMgdGhlIGV4cGVjdGVkIFtraW5kXS4KICAvLy8KICAvLy8gVXNlIHRoaXMgaW4gYXNzZXJ0IHN0YXRlbWVudHMgbGlrZQogIC8vLwogIC8vLyAgICAgYXNzZXJ0KGNoZWNrVmFsdWUodG9rZW4sIFZhbHVlS2luZC5Ub2tlbiwgdmFsdWUpKTsKICAvLy8KICAvLy8gdG8gZG9jdW1lbnQgYW5kIHZhbGlkYXRlIHRoZSBleHBlY3RlZCB2YWx1ZSBraW5kLgogIGJvb2wgY2hlY2tWYWx1ZShUb2tlbiB0b2tlbiwgVmFsdWVLaW5kIGtpbmQsIE9iamVjdCB2YWx1ZSkgewogICAgaWYgKCFraW5kLmNoZWNrKHZhbHVlKSkgewogICAgICBTdHJpbmcgbWVzc2FnZSA9ICdVbmV4cGVjdGVkIHZhbHVlIGAke3ZhbHVlfWAgKCR7dmFsdWUucnVudGltZVR5cGV9KS4gJwogICAgICAgICAgJ0V4cGVjdGVkICR7a2luZH0uJzsKICAgICAgaWYgKHRva2VuICE9IG51bGwpIHsKICAgICAgICAvLyBJZiBvZmZzZXQgaXMgYXZhaWxhYmxlIHJlcG9ydCBhbmQgaW50ZXJuYWwgcHJvYmxlbSB0byBzaG93IHRoZQogICAgICAgIC8vIHBhcnNlZCBjb2RlIGluIHRoZSBvdXRwdXQuCiAgICAgICAgdGhyb3cgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgICBuZXcgTWVzc2FnZShudWxsLCBtZXNzYWdlOiBtZXNzYWdlKSwgdG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBtZXNzYWdlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vLyBDaGVja3MgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBzdGFjayBhZ2FpbnN0IFtraW5kc10uIElmIGEgbWlzbWF0Y2ggaXMKICAvLy8gZm91bmQsIGEgdG9wIG9mIHRoZSBjdXJyZW50IHN0YWNrIGlzIHByaW50IGFsb25nIHdpdGggdGhlIGV4cGVjdGVkIFtraW5kc10KICAvLy8gbWFya2luZyB0aGUgZnJhbWVzIHRoYXQgZG9uJ3QgbWF0Y2gsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogIC8vLwogIC8vLyBVc2UgdGhpcyBpbiBhc3NlcnQgc3RhdGVtZW50cyBsaWtlCiAgLy8vCiAgLy8vICAgICBhc3NlcnQoY2hlY2tTdGF0ZSh0b2tlbiwgW1ZhbHVlS2luZC5JbnRlZ2VyLCBWYWx1ZUtpbmQuU3RyaW5nT3JOdWxsXSkpCiAgLy8vCiAgLy8vIHRvIGRvY3VtZW50IHRoZSBleHBlY3RlZCBzdGFjayBhbmQgZ2V0IGVhcmxpZXIgZXJyb3JzIG9uIHVuZXhwZWN0ZWQgc3RhY2sKICAvLy8gY29udGVudC4KICBib29sIGNoZWNrU3RhdGUoVG9rZW4gdG9rZW4sIExpc3Q8VmFsdWVLaW5kPiBraW5kcykgewogICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKICAgIGZvciAoaW50IGtpbmRJbmRleCA9IDA7IGtpbmRJbmRleCA8IGtpbmRzLmxlbmd0aDsga2luZEluZGV4KyspIHsKICAgICAgVmFsdWVLaW5kIGtpbmQgPSBraW5kc1traW5kSW5kZXhdOwogICAgICBpZiAoa2luZEluZGV4IDwgc3RhY2subGVuZ3RoKSB7CiAgICAgICAgT2JqZWN0IHZhbHVlID0gc3RhY2tba2luZEluZGV4XTsKICAgICAgICBpZiAoIWtpbmQuY2hlY2sodmFsdWUpKSB7CiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCiAgICAgIFN0cmluZyBzYWZlVG9TdHJpbmcoT2JqZWN0IG9iamVjdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gJyRvYmplY3QnOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIC8vIEp1ZGdtZW50cyBmYWlsIG9uIHRvU3RyaW5nLgogICAgICAgICAgcmV0dXJuIG9iamVjdC5ydW50aW1lVHlwZS50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgU3RyaW5nIHBhZExlZnQoT2JqZWN0IG9iamVjdCwgaW50IGxlbmd0aCkgewogICAgICAgIFN0cmluZyB0ZXh0ID0gc2FmZVRvU3RyaW5nKG9iamVjdCk7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoIDwgbGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gJyAnICogKGxlbmd0aCAtIHRleHQubGVuZ3RoKSArIHRleHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0OwogICAgICB9CgogICAgICBTdHJpbmcgcGFkUmlnaHQoT2JqZWN0IG9iamVjdCwgaW50IGxlbmd0aCkgewogICAgICAgIFN0cmluZyB0ZXh0ID0gc2FmZVRvU3RyaW5nKG9iamVjdCk7CiAgICAgICAgaWYgKHRleHQubGVuZ3RoIDwgbGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gdGV4dCArICcgJyAqIChsZW5ndGggLSB0ZXh0Lmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0OwogICAgICB9CgogICAgICAvLyBDb21wdXRlIGtpbmQvc3RhY2sgZnJhbWUgaW5mb3JtYXRpb24gZm9yIGFsbCBleHBlY3RlZCB2YWx1ZXMgcGx1cyAzIG1vcmUKICAgICAgLy8gc3RhY2sgZWxlbWVudHMgaWYgYXZhaWxhYmxlLgogICAgICBmb3IgKGludCBraW5kSW5kZXggPSAwOyBraW5kSW5kZXggPCBraW5kcy5sZW5ndGggKyAzOyBraW5kSW5kZXgrKykgewogICAgICAgIGlmIChraW5kSW5kZXggPj0gc3RhY2subGVuZ3RoICYmIGtpbmRJbmRleCA+PSBraW5kcy5sZW5ndGgpIHsKICAgICAgICAgIC8vIE5vIG1vcmUgc3RhY2sgZWxlbWVudHMgbm9yIGtpbmRzIHRvIGRpc3BsYXkuCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc2Iud3JpdGUocGFkTGVmdChraW5kSW5kZXgsIDQpKTsKICAgICAgICBzYi53cml0ZSgnOiAnKTsKICAgICAgICBWYWx1ZUtpbmQga2luZDsKICAgICAgICBpZiAoa2luZEluZGV4IDwga2luZHMubGVuZ3RoKSB7CiAgICAgICAgICBraW5kID0ga2luZHNba2luZEluZGV4XTsKICAgICAgICAgIHNiLndyaXRlKHBhZFJpZ2h0KGtpbmQsIDYwKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNiLndyaXRlKHBhZFJpZ2h0KCctLS0nLCA2MCkpOwogICAgICAgIH0KICAgICAgICBpZiAoa2luZEluZGV4IDwgc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICBPYmplY3QgdmFsdWUgPSBzdGFja1traW5kSW5kZXhdOwogICAgICAgICAgaWYgKGtpbmQgPT0gbnVsbCB8fCBraW5kLmNoZWNrKHZhbHVlKSkgewogICAgICAgICAgICBzYi53cml0ZSgnICcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2Iud3JpdGUoJyonKTsKICAgICAgICAgIH0KICAgICAgICAgIHNiLndyaXRlKHNhZmVUb1N0cmluZyh2YWx1ZSkpOwogICAgICAgICAgc2Iud3JpdGUoJyAoJHt2YWx1ZS5ydW50aW1lVHlwZX0pJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChraW5kID09IG51bGwpIHsKICAgICAgICAgICAgc2Iud3JpdGUoJyAnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNiLndyaXRlKCcqJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzYi53cml0ZSgnLS0tJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlbG4oKTsKICAgICAgfQoKICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAnJHJ1bnRpbWVUeXBlIGZhaWx1cmVcbiRzYic7CiAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CiAgICAgICAgLy8gSWYgb2Zmc2V0IGlzIGF2YWlsYWJsZSByZXBvcnQgYW5kIGludGVybmFsIHByb2JsZW0gdG8gc2hvdyB0aGUKICAgICAgICAvLyBwYXJzZWQgY29kZSBpbiB0aGUgb3V0cHV0LgogICAgICAgIHRocm93IGludGVybmFsUHJvYmxlbSgKICAgICAgICAgICAgbmV3IE1lc3NhZ2UobnVsbCwgbWVzc2FnZTogbWVzc2FnZSksIHRva2VuLmNoYXJPZmZzZXQsIHVyaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbWVzc2FnZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1Y2Nlc3M7CiAgfQoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHVyaTsKCiAgdm9pZCBkaXNjYXJkKGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBwb3AoKTsKICAgIH0KICB9CgogIHZvaWQgcHVzaChPYmplY3Qgbm9kZSkgewogICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZC53aXRoQXJndW1lbnRzKCJudWxsIiwgInB1c2giKSwKICAgICAgICAgIC0xLAogICAgICAgICAgdXJpKTsKICAgIH0KICAgIHN0YWNrLnB1c2gobm9kZSk7CiAgfQoKICB2b2lkIHB1c2hJZk51bGwoVG9rZW4gdG9rZW5Pck51bGwsIE51bGxWYWx1ZSBudWxsVmFsdWUpIHsKICAgIGlmICh0b2tlbk9yTnVsbCA9PSBudWxsKSBzdGFjay5wdXNoKG51bGxWYWx1ZSk7CiAgfQoKICBPYmplY3QgcGVlaygpID0+IHN0YWNrLmlzTm90RW1wdHkgPyBzdGFjay5sYXN0IDogbnVsbDsKCiAgT2JqZWN0IHBvcChbTnVsbFZhbHVlIG51bGxWYWx1ZV0pIHsKICAgIHJldHVybiBzdGFjay5wb3AobnVsbFZhbHVlKTsKICB9CgogIE9iamVjdCBwb3BJZk5vdE51bGwoT2JqZWN0IHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBwb3AoKTsKICB9CgogIHZvaWQgZGVidWdFdmVudChTdHJpbmcgbmFtZSkgewogICAgLy8gcHJpbnRFdmVudChuYW1lKTsKICB9CgogIHZvaWQgcHJpbnRFdmVudChTdHJpbmcgbmFtZSkgewogICAgcHJpbnQoJ1xuLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICBmb3IgKE9iamVjdCBvIGluIHN0YWNrLnZhbHVlcykgewogICAgICBTdHJpbmcgcyA9ICIgICRvIjsKICAgICAgaW50IGluZGV4ID0gcy5pbmRleE9mKCJcbiIpOwogICAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi4uLiI7CiAgICAgIH0KICAgICAgcHJpbnQocyk7CiAgICB9CiAgICBwcmludCgiICA+PiAkbmFtZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBsb2dFdmVudChTdHJpbmcgbmFtZSkgewogICAgcHJpbnRFdmVudChuYW1lKTsKICAgIGludGVybmFsUHJvYmxlbSgKICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZC53aXRoQXJndW1lbnRzKG5hbWUsICIkcnVudGltZVR5cGUiKSwKICAgICAgICAtMSwKICAgICAgICB1cmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVJZGVudGlmaWVyIik7CiAgICBpZiAoIXRva2VuLmlzU3ludGhldGljKSB7CiAgICAgIHB1c2godG9rZW4ubGV4ZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoaXMgY29tZXMgZnJvbSBhIHN5bnRoZXRpYyB0b2tlbiB3aGljaCBpcyBpbnNlcnRlZCBieSB0aGUgcGFyc2VyIGluCiAgICAgIC8vIGFuIGF0dGVtcHQgdG8gcmVjb3Zlci4gIFRoaXMgYWxtb3N0IGFsd2F5cyBtZWFucyB0aGF0IHRoZSBwYXJzZXIgaGFzCiAgICAgIC8vIGdvdHRlbiB2ZXJ5IGNvbmZ1c2VkIGFuZCB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgcmVzdWx0cy4KICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3ZlcnkodG9rZW4uY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb05hbWUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vTmFtZSIpOwogICAgcHVzaChOdWxsVmFsdWUuSWRlbnRpZmllcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplciIpOwogIH0KCiAgdm9pZCBjaGVja0VtcHR5KGludCBjaGFyT2Zmc2V0KSB7CiAgICBpZiAoc3RhY2suaXNOb3RFbXB0eSkgewogICAgICBpbnRlcm5hbFByb2JsZW0oCiAgICAgICAgICB0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAiJHtydW50aW1lVHlwZX0iLCBzdGFjay52YWx1ZXMuam9pbigiXG4gICIpKSwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICB1cmkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUb3BMZXZlbERlY2xhcmF0aW9uIik7CiAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb21waWxhdGlvblVuaXQoaW50IGNvdW50LCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiQ29tcGlsYXRpb25Vbml0Iik7CiAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0V4dGVuZHMoVG9rZW4gZXh0ZW5kc0tleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzRXh0ZW5kcyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVNaXhpbk9uKFRva2VuIG9uS2V5d29yZCwgaW50IHR5cGVDb3VudCkgewogICAgZGVidWdFdmVudCgiTWl4aW5PbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0hlYWRlcihUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkLCBUb2tlbiBuYXRpdmVUb2tlbikgewogICAgZGVidWdFdmVudCgiQ2xhc3NIZWFkZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWl4aW5IZWFkZXIoVG9rZW4gbWl4aW5LZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJNaXhpbkhlYWRlciIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXIoKSB7CiAgICBkZWJ1Z0V2ZW50KCJSZWNvdmVyQ2xhc3NIZWFkZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3Zlck1peGluSGVhZGVyKCkgewogICAgZGVidWdFdmVudCgiUmVjb3Zlck1peGluSGVhZGVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBpbnQgaW50ZXJmYWNlc0NvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc0ltcGxlbWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGVBcmd1bWVudHMiKTsKICAgIHB1c2goTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGVWYXJpYWJsZXMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vVHlwZVZhcmlhYmxlcyIpOwogICAgcHVzaChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlKFRva2VuIGxhc3RDb25zdW1lZCkgewogICAgZGVidWdFdmVudCgiTm9UeXBlIik7CiAgICBwdXNoKE51bGxWYWx1ZS5UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGRlYnVnRXZlbnQoIk5vRm9ybWFsUGFyYW1ldGVycyIpOwogICAgcHVzaChOdWxsVmFsdWUuRm9ybWFsUGFyYW1ldGVycyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0FyZ3VtZW50cyIpOwogICAgcHVzaChOdWxsVmFsdWUuQXJndW1lbnRzKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keSIpOwogICAgcHVzaChOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Z1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GdW5jdGlvbkJvZHkiKTsKICAgIHB1c2goTnVsbFZhbHVlLkZ1bmN0aW9uQm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vSW5pdGlhbGl6ZXJzKCkgewogICAgZGVidWdFdmVudCgiTm9Jbml0aWFsaXplcnMiKTsKICAgIHB1c2goTnVsbFZhbHVlLkluaXRpYWxpemVycyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGl0ZXJhbFN0cmluZyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5MaXRlcmFsU3RyaW5nIik7CiAgICBwdXNoKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN0cmluZyhpbnQgaW50ZXJwb2xhdGlvbkNvdW50LCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kTGl0ZXJhbFN0cmluZyIpOwogICAgaWYgKGludGVycG9sYXRpb25Db3VudCA9PSAwKSB7CiAgICAgIFRva2VuIHRva2VuID0gcG9wKCk7CiAgICAgIHB1c2godW5lc2NhcGVTdHJpbmcodG9rZW4ubGV4ZW1lLCB0b2tlbiwgdGhpcykpOwogICAgfSBlbHNlIHsKICAgICAgaW50ZXJuYWxQcm9ibGVtKAogICAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWQud2l0aEFyZ3VtZW50cygKICAgICAgICAgICAgICAic3RyaW5nIGludGVycG9sYXRpb24iLCAiZW5kTGl0ZXJhbFN0cmluZyIpLAogICAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIHVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUNsYXVzZShUb2tlbiBuYXRpdmVUb2tlbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVDbGF1c2UiKTsKICAgIGlmIChoYXNOYW1lKSB7CiAgICAgIHBvcCgpOyAvLyBQb3AgdGhlIG5hdGl2ZSBuYW1lIHdoaWNoIGlzIGEgU3RyaW5nLgogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEaXJlY3RpdmVzT25seSgpIHsKICAgIHBvcCgpOyAvLyBEaXNjYXJkIHRoZSBtZXRhZGF0YS4KICB9CgogIHZvaWQgaGFuZGxlRXh0cmFuZW91c0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgZGVidWdFdmVudCgiRXh0cmFuZW91c0V4cHJlc3Npb24iKTsKICAgIHBvcCgpOyAvLyBEaXNjYXJkIHRoZSBleHRyYW5lb3VzIGV4cHJlc3Npb24uCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhc2VFeHByZXNzaW9uKFRva2VuIGNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJDYXNlRXhwcmVzc2lvbiIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiQ2F0Y2hDbGF1c2UiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlcmFibGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiBzdGFydFRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlfSIpOwogICAgaWYgKGlzSWdub3JlZEVycm9yKG1lc3NhZ2UuY29kZSwgc3RhcnRUb2tlbikpIHJldHVybjsKICAgIGFkZFByb2JsZW0oCiAgICAgICAgbWVzc2FnZSwgc3RhcnRUb2tlbi5jaGFyT2Zmc2V0LCBsZW5ndGhPZlNwYW4oc3RhcnRUb2tlbiwgZW5kVG9rZW4pKTsKICB9CgogIGJvb2wgaXNJZ25vcmVkRXJyb3IoQ29kZTxkeW5hbWljPiBjb2RlLCBUb2tlbiB0b2tlbikgewogICAgaWYgKGNvZGUgPT0gY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbikgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogSWdub3JlIHRoaXMgZXJyb3IgdW50aWwgd2UgZGVwcmVjYXRlIGBuYXRpdmVgCiAgICAgIC8vIHN1cHBvcnQuCiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChjb2RlID09IGNvZGVDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVycykgewogICAgICAvLyBJZ25vcmVkLiBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIEJvZHlCdWlsZGVyLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVW5lc2NhcGVFcnJvcigKICAgICAgTWVzc2FnZSBtZXNzYWdlLCBUb2tlbiB0b2tlbiwgaW50IHN0cmluZ09mZnNldCwgaW50IGxlbmd0aCkgewogICAgYWRkUHJvYmxlbShtZXNzYWdlLCB0b2tlbi5jaGFyT2Zmc2V0ICsgc3RyaW5nT2Zmc2V0LCBsZW5ndGgpOwogIH0KCiAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCiAgICAgIHtib29sIHdhc0hhbmRsZWQ6IGZhbHNlLCBMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSk7Cn0KCmFic3RyYWN0IGNsYXNzIFN0YWNrIHsKICAvLy8gUG9wcyBbY291bnRdIGVsZW1lbnRzIGZyb20gdGhlIHN0YWNrIGFuZCBwdXRzIGl0IGludG8gW2xpc3RdLgogIC8vLyBSZXR1cm5zIFtudWxsXSBpZiBhIFtQYXJzZXJSZWNvdmVyeV0gdmFsdWUgaXMgZm91bmQsIG9yIFtsaXN0XSBvdGhlcndpc2UuCiAgTGlzdDxPYmplY3Q+IHBvcExpc3QoaW50IGNvdW50LCBMaXN0PE9iamVjdD4gbGlzdCwgTnVsbFZhbHVlIG51bGxWYWx1ZSk7CgogIHZvaWQgcHVzaChPYmplY3QgdmFsdWUpOwoKICAvLy8gV2lsbCByZXR1cm4gW251bGxdIGluc3RlYWQgb2YgW051bGxWYWx1ZV0uCiAgT2JqZWN0IGdldCBsYXN0OwoKICBib29sIGdldCBpc05vdEVtcHR5OwoKICBMaXN0PE9iamVjdD4gZ2V0IHZhbHVlczsKCiAgT2JqZWN0IHBvcChOdWxsVmFsdWUgbnVsbFZhbHVlKTsKCiAgaW50IGdldCBsZW5ndGg7CgogIC8vLyBSYXcsIGkuZS4gW051bGxWYWx1ZV1zIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBbbnVsbF0uCiAgT2JqZWN0IG9wZXJhdG9yIFtdKGludCBpbmRleCk7Cn0KCmNsYXNzIFN0YWNrSW1wbCBpbXBsZW1lbnRzIFN0YWNrIHsKICBMaXN0PE9iamVjdD4gYXJyYXkgPSBuZXcgTGlzdDxPYmplY3Q+KDgpOwogIGludCBhcnJheUxlbmd0aCA9IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gYXJyYXlMZW5ndGggPiAwOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBhcnJheUxlbmd0aDsKCiAgT2JqZWN0IGdldCBsYXN0IHsKICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGFycmF5W2FycmF5TGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdmFsdWUgaXMgTnVsbFZhbHVlID8gbnVsbCA6IHZhbHVlOwogIH0KCiAgT2JqZWN0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgcmV0dXJuIGFycmF5W2FycmF5TGVuZ3RoIC0gMSAtIGluZGV4XTsKICB9CgogIHZvaWQgcHVzaChPYmplY3QgdmFsdWUpIHsKICAgIGFycmF5W2FycmF5TGVuZ3RoKytdID0gdmFsdWU7CiAgICBpZiAoYXJyYXkubGVuZ3RoID09IGFycmF5TGVuZ3RoKSB7CiAgICAgIF9ncm93KCk7CiAgICB9CiAgfQoKICBPYmplY3QgcG9wKE51bGxWYWx1ZSBudWxsVmFsdWUpIHsKICAgIGFzc2VydChhcnJheUxlbmd0aCA+IDApOwogICAgZmluYWwgT2JqZWN0IHZhbHVlID0gYXJyYXlbLS1hcnJheUxlbmd0aF07CiAgICBhcnJheVthcnJheUxlbmd0aF0gPSBudWxsOwogICAgaWYgKHZhbHVlIGlzISBOdWxsVmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSBlbHNlIGlmIChudWxsVmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsVmFsdWUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgfQoKICBMaXN0PE9iamVjdD4gcG9wTGlzdChpbnQgY291bnQsIExpc3Q8T2JqZWN0PiBsaXN0LCBOdWxsVmFsdWUgbnVsbFZhbHVlKSB7CiAgICBhc3NlcnQoYXJyYXlMZW5ndGggPj0gY291bnQpOwogICAgZmluYWwgTGlzdDxPYmplY3Q+IGFycmF5ID0gdGhpcy5hcnJheTsKICAgIGZpbmFsIGludCBsZW5ndGggPSBhcnJheUxlbmd0aDsKICAgIGZpbmFsIGludCBzdGFydEluZGV4ID0gbGVuZ3RoIC0gY291bnQ7CiAgICBib29sIGlzUGFyc2VyUmVjb3ZlcnkgPSBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBpbnQgYXJyYXlJbmRleCA9IHN0YXJ0SW5kZXggKyBpOwogICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBhcnJheVthcnJheUluZGV4XTsKICAgICAgYXJyYXlbYXJyYXlJbmRleF0gPSBudWxsOwogICAgICBpZiAodmFsdWUgaXMgTnVsbFZhbHVlICYmIG51bGxWYWx1ZSA9PSBudWxsIHx8CiAgICAgICAgICBpZGVudGljYWwodmFsdWUsIG51bGxWYWx1ZSkpIHsKICAgICAgICBsaXN0W2ldID0gbnVsbDsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIGlzUGFyc2VyUmVjb3ZlcnkgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydCh2YWx1ZSBpcyEgTnVsbFZhbHVlKTsKICAgICAgICBsaXN0W2ldID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIGFycmF5TGVuZ3RoIC09IGNvdW50OwoKICAgIHJldHVybiBpc1BhcnNlclJlY292ZXJ5ID8gbnVsbCA6IGxpc3Q7CiAgfQoKICBMaXN0PE9iamVjdD4gZ2V0IHZhbHVlcyB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYXJyYXlMZW5ndGg7CiAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBMaXN0PE9iamVjdD4obGVuZ3RoKTsKICAgIGxpc3Quc2V0UmFuZ2UoMCwgbGVuZ3RoLCBhcnJheSk7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIHZvaWQgX2dyb3coKSB7CiAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgZmluYWwgTGlzdDxPYmplY3Q+IG5ld0FycmF5ID0gbmV3IExpc3Q8T2JqZWN0PihsZW5ndGggKiAyKTsKICAgIG5ld0FycmF5LnNldFJhbmdlKDAsIGxlbmd0aCwgYXJyYXksIDApOwogICAgYXJyYXkgPSBuZXdBcnJheTsKICB9Cn0KCmNsYXNzIERlYnVnU3RhY2sgaW1wbGVtZW50cyBTdGFjayB7CiAgU3RhY2sgcmVhbFN0YWNrID0gbmV3IFN0YWNrSW1wbCgpOwogIFN0YWNrIHN0YWNrVHJhY2VTdGFjayA9IG5ldyBTdGFja0ltcGwoKTsKICBMaXN0PFN0YWNrVHJhY2U+IGxhdGVzdFN0YWNrdHJhY2VzID0gbmV3IExpc3Q8U3RhY2tUcmFjZT4oKTsKCiAgQG92ZXJyaWRlCiAgT2JqZWN0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgT2JqZWN0IHJlc3VsdCA9IHJlYWxTdGFja1tpbmRleF07CiAgICBsYXRlc3RTdGFja3RyYWNlcy5jbGVhcigpOwogICAgbGF0ZXN0U3RhY2t0cmFjZXMuYWRkKHN0YWNrVHJhY2VTdGFja1tpbmRleF0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gcmVhbFN0YWNrLmlzTm90RW1wdHk7CgogIEBvdmVycmlkZQogIE9iamVjdCBnZXQgbGFzdCB7CiAgICBPYmplY3QgcmVzdWx0ID0gdGhpc1swXTsKICAgIGlmIChyZXN1bHQgaXMgTnVsbFZhbHVlKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBpbnQgZ2V0IGxlbmd0aCA9PiByZWFsU3RhY2subGVuZ3RoOwoKICBAb3ZlcnJpZGUKICBPYmplY3QgcG9wKE51bGxWYWx1ZSBudWxsVmFsdWUpIHsKICAgIE9iamVjdCByZXN1bHQgPSByZWFsU3RhY2sucG9wKG51bGxWYWx1ZSk7CiAgICBsYXRlc3RTdGFja3RyYWNlcy5jbGVhcigpOwogICAgbGF0ZXN0U3RhY2t0cmFjZXMuYWRkKHN0YWNrVHJhY2VTdGFjay5wb3AobnVsbCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8T2JqZWN0PiBwb3BMaXN0KGludCBjb3VudCwgTGlzdDxPYmplY3Q+IGxpc3QsIE51bGxWYWx1ZSBudWxsVmFsdWUpIHsKICAgIExpc3Q8T2JqZWN0PiByZXN1bHQgPSByZWFsU3RhY2sucG9wTGlzdChjb3VudCwgbGlzdCwgbnVsbFZhbHVlKTsKICAgIGxhdGVzdFN0YWNrdHJhY2VzLmxlbmd0aCA9IGNvdW50OwogICAgc3RhY2tUcmFjZVN0YWNrLnBvcExpc3QoY291bnQsIGxhdGVzdFN0YWNrdHJhY2VzLCBudWxsKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIHB1c2goT2JqZWN0IHZhbHVlKSB7CiAgICByZWFsU3RhY2sucHVzaCh2YWx1ZSk7CiAgICBzdGFja1RyYWNlU3RhY2sucHVzaChTdGFja1RyYWNlLmN1cnJlbnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGlzdDxPYmplY3Q+IGdldCB2YWx1ZXMgPT4gcmVhbFN0YWNrLnZhbHVlczsKfQoKLy8vIEhlbHBlciBjb25zdGFudCBmb3IgcG9wcGluZyBhIGxpc3Qgb2YgdGhlIHRvcCBvZiBhIFtTdGFja10uICBUaGlzIGhlbHBlcgovLy8gcmV0dXJucyBudWxsIGluc3RlYWQgb2YgZW1wdHkgbGlzdHMsIGFuZCB0aGUgbGlzdHMgcmV0dXJuZWQgYXJlIG9mIGZpeGVkCi8vLyBsZW5ndGguCmNsYXNzIEZpeGVkTnVsbGFibGVMaXN0PFQ+IHsKICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdCgpOwoKICBMaXN0PFQ+IHBvcChTdGFjayBzdGFjaywgaW50IGNvdW50LCBbTnVsbFZhbHVlIG51bGxWYWx1ZV0pIHsKICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBzdGFjay5wb3BMaXN0KGNvdW50LCBuZXcgTGlzdDxUPihjb3VudCksIG51bGxWYWx1ZSk7CiAgfQoKICBMaXN0PFQ+IHBvcFBhZGRlZChTdGFjayBzdGFjaywgaW50IGNvdW50LCBpbnQgcGFkZGluZywKICAgICAgW051bGxWYWx1ZSBudWxsVmFsdWVdKSB7CiAgICBpZiAoY291bnQgKyBwYWRkaW5nID09IDApIHJldHVybiBudWxsOwogICAg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cGxlbWVudHMgSXRlcmF0b3I8VD4gewogIFQgX2N1cnJlbnQ7CiAgTGluazxUPiBfbGluazsKCiAgTGlua0l0ZXJhdG9yKHRoaXMuX2xpbmspOwoKICBUIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9saW5rLmlzRW1wdHkpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF9saW5rLmhlYWQ7CiAgICBfbGluayA9IF9saW5rLnRhaWw7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCnR5cGVkZWYgVCBUcmFuc2Zvcm1hdGlvbjxTLCBUPihTIGlucHV0KTsKCmNsYXNzIE1hcHBlZExpbmtJdGVyYXRvcjxTLCBUPiBleHRlbmRzIEl0ZXJhdG9yPFQ+IHsKICBUcmFuc2Zvcm1hdGlvbjxTLCBUPiBfdHJhbnNmb3JtYXRpb247CiAgTGluazxTPiBfbGluazsKICBUIF9jdXJyZW50OwoKICBNYXBwZWRMaW5rSXRlcmF0b3IodGhpcy5fbGluaywgdGhpcy5fdHJhbnNmb3JtYXRpb24pOwoKICBUIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9saW5rLmlzRW1wdHkpIHsKICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfY3VycmVudCA9IF90cmFuc2Zvcm1hdGlvbihfbGluay5oZWFkKTsKICAgIF9saW5rID0gX2xpbmsudGFpbDsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKY2xhc3MgTWFwcGVkTGlua0l0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICBUcmFuc2Zvcm1hdGlvbjxTLCBUPiBfdHJhbnNmb3JtYXRpb247CiAgTGluazxTPiBfbGluazsKCiAgTWFwcGVkTGlua0l0ZXJhYmxlKHRoaXMuX2xpbmssIHRoaXMuX3RyYW5zZm9ybWF0aW9uKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgTWFwcGVkTGlua0l0ZXJhdG9yPFMsIFQ+KF9saW5rLCBfdHJhbnNmb3JtYXRpb24pOwogIH0KfQoKY2xhc3MgTGlua0VudHJ5PFQ+IGV4dGVuZHMgTGluazxUPiB7CiAgZmluYWwgVCBoZWFkOwogIExpbms8VD4gdGFpbDsKCiAgTGlua0VudHJ5KHRoaXMuaGVhZCwgW0xpbms8VD4gdGFpbF0pIDogdGFpbCA9IHRhaWwgPz8gY29uc3QgTGluazxOdWxsPigpOwoKICBMaW5rPFQ+IHByZXBlbmQoVCBlbGVtZW50KSB7CiAgICAvLyBUT0RPKGFoZSk6IFVzZSBuZXcgTGluazxUPiwgYnV0IHRoaXMgY29zdCA4JSBwZXJmb3JtYW5jZSBvbiBWTS4KICAgIHJldHVybiBuZXcgTGlua0VudHJ5PFQ+KGVsZW1lbnQsIHRoaXMpOwogIH0KCiAgdm9pZCBwcmludE9uKFN0cmluZ0J1ZmZlciBidWZmZXIsIFtzZXBhcmF0ZWRCeV0pIHsKICAgIGJ1ZmZlci53cml0ZShoZWFkKTsKICAgIGlmIChzZXBhcmF0ZWRCeSA9PSBudWxsKSBzZXBhcmF0ZWRCeSA9ICcnOwogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0YWlsOyBsaW5rLmlzTm90RW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRlZEJ5KTsKICAgICAgYnVmZmVyLndyaXRlKGxpbmsuaGVhZCk7CiAgICB9CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgYnVmZmVyLndyaXRlKCdbICcpOwogICAgcHJpbnRPbihidWZmZXIsICcsICcpOwogICAgYnVmZmVyLndyaXRlKCcgXScpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgQG92ZXJyaWRlCiAgTGluazxUPiByZXZlcnNlKExpbms8VD4gdGFpbCkgewogICAgTGluazxUPiByZXN1bHQgPSB0YWlsOwogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyBsaW5rLmlzTm90RW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnByZXBlbmQobGluay5oZWFkKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBMaW5rPFQ+IHJldmVyc2VQcmVwZW5kQWxsKExpbms8VD4gZnJvbSkgewogICAgTGluazxUPiByZXN1bHQ7CiAgICBmb3IgKHJlc3VsdCA9IHRoaXM7IGZyb20uaXNOb3RFbXB0eTsgZnJvbSA9IGZyb20udGFpbCkgewogICAgICByZXN1bHQgPSByZXN1bHQucHJlcGVuZChmcm9tLmhlYWQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpbms8VD4gc2tpcChpbnQgbikgewogICAgTGluazxUPiBsaW5rID0gdGhpczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGlmIChsaW5rLmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggJG4gb3V0IG9mIHJhbmdlJyk7CiAgICAgIH0KICAgICAgbGluayA9IGxpbmsudGFpbDsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBmYWxzZTsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IHRydWU7CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoVCBlbGVtZW50KSkgewogICAgZm9yIChMaW5rPFQ+IGxpbmsgPSB0aGlzOyBsaW5rLmlzTm90RW1wdHk7IGxpbmsgPSBsaW5rLnRhaWwpIHsKICAgICAgZihsaW5rLmhlYWQpOwogICAgfQogIH0KCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgewogICAgaWYgKG90aGVyIGlzISBMaW5rPFQ+KSByZXR1cm4gZmFsc2U7CiAgICBMaW5rPFQ+IG15RWxlbWVudHMgPSB0aGlzOwogICAgd2hpbGUgKG15RWxlbWVudHMuaXNOb3RFbXB0eSAmJiBvdGhlci5pc05vdEVtcHR5KSB7CiAgICAgIGlmIChteUVsZW1lbnRzLmhlYWQgIT0gb3RoZXIuaGVhZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBteUVsZW1lbnRzID0gbXlFbGVtZW50cy50YWlsOwogICAgICBvdGhlciA9IG90aGVyLnRhaWw7CiAgICB9CiAgICByZXR1cm4gbXlFbGVtZW50cy5pc0VtcHR5ICYmIG90aGVyLmlzRW1wdHk7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdMaW5rRW50cnkuaGFzaENvZGUnKTsKCiAgaW50IHNsb3dMZW5ndGgoKSB7CiAgICBpbnQgbGVuZ3RoID0gMDsKICAgIGZvciAoTGluazxUPiBjdXJyZW50ID0gdGhpczsgY3VycmVudC5pc05vdEVtcHR5OyBjdXJyZW50ID0gY3VycmVudC50YWlsKSB7CiAgICAgICsrbGVuZ3RoOwogICAgfQogICAgcmV0dXJuIGxlbmd0aDsKICB9Cn0KCmNsYXNzIExpbmtCdWlsZGVySW1wbGVtZW50YXRpb248VD4gaW1wbGVtZW50cyBMaW5rQnVpbGRlcjxUPiB7CiAgTGlua0VudHJ5PFQ+IGhlYWQgPSBudWxsOwogIExpbmtFbnRyeTxUPiBsYXN0TGluayA9IG51bGw7CiAgaW50IGxlbmd0aCA9IDA7CgogIExpbmtCdWlsZGVySW1wbGVtZW50YXRpb24oKTsKCiAgQG92ZXJyaWRlCiAgTGluazxUPiB0b0xpbmsoTGluazxUPiB0YWlsKSB7CiAgICBpZiAoaGVhZCA9PSBudWxsKSByZXR1cm4gdGFpbDsKICAgIGxhc3RMaW5rLnRhaWwgPSB0YWlsOwogICAgTGluazxUPiBsaW5rID0gaGVhZDsKICAgIGxhc3RMaW5rID0gbnVsbDsKICAgIGhlYWQgPSBudWxsOwogICAgbGVuZ3RoID0gMDsKICAgIHJldHVybiBsaW5rOwogIH0KCiAgTGlzdDxUPiB0b0xpc3QoKSB7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgTGlzdDxUPigwKTsKICAgIExpc3Q8VD4gbGlzdCA9IG5ldyBMaXN0PFQ+KGxlbmd0aCk7CiAgICBpbnQgaW5kZXggPSAwOwogICAgTGluazxUPiBsaW5rID0gaGVhZDsKICAgIHdoaWxlIChsaW5rLmlzTm90RW1wdHkpIHsKICAgICAgbGlzdFtpbmRleF0gPSBsaW5rLmhlYWQ7CiAgICAgIGxpbmsgPSBsaW5rLnRhaWw7CiAgICAgIGluZGV4Kys7CiAgICB9CiAgICBsYXN0TGluayA9IG51bGw7CiAgICBoZWFkID0gbnVsbDsKICAgIGxlbmd0aCA9IDA7CiAgICByZXR1cm4gbGlzdDsKICB9CgogIExpbms8VD4gYWRkTGFzdChUIHQpIHsKICAgIGxlbmd0aCsrOwogICAgTGlua0VudHJ5PFQ+IGVudHJ5ID0gbmV3IExpbmtFbnRyeTxUPih0LCBudWxsKTsKICAgIGlmIChoZWFkID09IG51bGwpIHsKICAgICAgaGVhZCA9IGVudHJ5OwogICAgfSBlbHNlIHsKICAgICAgbGFzdExpbmsudGFpbCA9IGVudHJ5OwogICAgfQogICAgbGFzdExpbmsgPSBlbnRyeTsKICAgIHJldHVybiBlbnRyeTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGVuZ3RoID09IDA7CgogIFQgZ2V0IGZpcnN0IHsKICAgIGlmIChoZWFkICE9IG51bGwpIHsKICAgICAgcmV0dXJuIGhlYWQuaGVhZDsKICAgIH0KICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJubyBlbGVtZW50cyIpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGhlYWQgPSBudWxsOwogICAgbGFzdExpbmsgPSBudWxsOwogICAgbGVuZ3RoID0gMDsKICB9Cn0KgNYATk48ATYBLAErAS8OEQEcAR0BFBkXFAYbGBEEAgEpATUoEQ4BOAEdARQZFxQGLBgRBAIBOSgRATgBHUEEAgElEBABTAEfRywEATUYL0MhHwYEARYuGBsYHgQBDCIbQyoGEwQBLBQ9KgYTBAEYGSIaNwgYBhEEAR0fASRDFAYEARwpHzgrFggkGgYwBAFIARUUTxAGEwQCAT8cIBIBHwEMISMaGRUREBEEARUsKBMZHh8YDwYVERARBAEZDjQYFA0dBhYSBAEjARAYGAYpBAERERUQBAIBPXBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvdXRpbC9saW5rX2ltcGxlbWVudGF0aW9uLmRhcnRhZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2xhdGVfbG93ZXJpbmcuZGFydLgfLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIGhpZGUgTWFwRW50cnk7CmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JzsKCmltcG9ydCAnLi4vbmFtZXMuZGFydCc7CgovLy8gQ3JlYXRlcyB0aGUgYm9keSBmb3IgdGhlIHN5bnRoZXNpemVkIGdldHRlciB1c2VkIHRvIGVuY29kZSB0aGUgbG93ZXJpbmcKLy8vIG9mIGEgbGF0ZSBub24tZmluYWwgZmllbGQgd2l0aCBhbiBpbml0aWFsaXplciBvciBhIGxhdGUgbG9jYWwgd2l0aCBhbgovLy8gaW5pdGlhbGl6ZXIuCi8vLwovLy8gTGF0ZSBmaW5hbCBmaWVsZCBuZWVkcyB0byBkZXRlY3Qgd3JpdGVzIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgdGhlcmVmb3JlCi8vLyB1c2VzIFtjcmVhdGVHZXR0ZXJXaXRoSW5pdGlhbGl6ZXJXaXRoUmVjaGVja10gaW5zdGVhZC4gTGF0ZSBmaW5hbCBsb2NhbHMKLy8vIGNhbm5vdCBoYXZlIHdyaXRlcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gc2luY2UgdGhleSBhcmUgbm90IGluIHNjb3BlIGluCi8vLyB0aGVpciBvd24gaW5pdGlhbGl6ZXIuClN0YXRlbWVudCBjcmVhdGVHZXR0ZXJXaXRoSW5pdGlhbGl6ZXIoCiAgICBpbnQgZmlsZU9mZnNldCwgU3RyaW5nIG5hbWUsIERhcnRUeXBlIHR5cGUsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsCiAgICB7RXhwcmVzc2lvbiBjcmVhdGVWYXJpYWJsZVJlYWQoe2Jvb2wgbmVlZHNQcm9tb3Rpb259KSwKICAgIEV4cHJlc3Npb24gY3JlYXRlVmFyaWFibGVXcml0ZShFeHByZXNzaW9uIHZhbHVlKSwKICAgIEV4cHJlc3Npb24gY3JlYXRlSXNTZXRSZWFkKCksCiAgICBFeHByZXNzaW9uIGNyZWF0ZUlzU2V0V3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSl9KSB7CiAgaWYgKHR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vCiAgICAvLyAgICBpZiAoIV8jaXNTZXQjZmllbGQpIHsKICAgIC8vICAgICAgXyNpc1NldCNmaWVsZCA9IHRydWUKICAgIC8vICAgICAgXyNmaWVsZCA9IDxpbml0PjsKICAgIC8vICAgIH0KICAgIC8vICAgIHJldHVybiBfI2ZpZWxkOwogICAgcmV0dXJuIG5ldyBCbG9jayg8U3RhdGVtZW50PlsKICAgICAgbmV3IElmU3RhdGVtZW50KAogICAgICAgICAgbmV3IE5vdChjcmVhdGVJc1NldFJlYWQoKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICBuZXcgQmxvY2soPFN0YXRlbWVudD5bCiAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgICAgICAgY3JlYXRlSXNTZXRXcml0ZShuZXcgQm9vbExpdGVyYWwodHJ1ZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgICAgICAgY3JlYXRlVmFyaWFibGVXcml0ZShpbml0aWFsaXplcikuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICBdKSwKICAgICAgICAgIG51bGwpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgbmV3IFJldHVyblN0YXRlbWVudCgKICAgICAgICAgIC8vIElmIFt0eXBlXSBpcyBhIHR5cGUgdmFyaWFibGUgd2l0aCB1bmRldGVybWluZWQgbnVsbGFiaWxpdHkgd2UgbmVlZAogICAgICAgICAgLy8gdG8gY3JlYXRlIGEgcmVhZCBvZiB0aGUgZmllbGQgdGhhdCBpcyBwcm9tb3RlZCB0byB0aGUgdHlwZSB2YXJpYWJsZQogICAgICAgICAgLy8gdHlwZS4KICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZChuZWVkc1Byb21vdGlvbjogdHlwZS5pc1BvdGVudGlhbGx5Tm9uTnVsbGFibGUpKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQKICAgIF0pCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfSBlbHNlIHsKICAgIC8vIEdlbmVyYXRlOgogICAgLy8KICAgIC8vICAgIHJldHVybiBsZXQgIyA9IF8jZmllbGQgaW4gIyA9PSBudWxsID8gXyNmaWVsZCA9IDxpbml0PiA6ICM7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgY3JlYXRlVmFyaWFibGVSZWFkKG5lZWRzUHJvbW90aW9uOiBmYWxzZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgIHR5cGU6IHR5cGUud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5Lm51bGxhYmxlKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIHJldHVybiBuZXcgUmV0dXJuU3RhdGVtZW50KAogICAgICAgIG5ldyBMZXQoCiAgICAgICAgICAgIHZhcmlhYmxlLAogICAgICAgICAgICBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgZXF1YWxzTmFtZSwKICAgICAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldAogICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgY3JlYXRlVmFyaWFibGVXcml0ZShpbml0aWFsaXplcikuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHZhcmlhYmxlLCB0eXBlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICB0eXBlKQogICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KfQoKLy8vIENyZWF0ZXMgdGhlIGJvZHkgZm9yIHRoZSBzeW50aGVzaXplZCBnZXR0ZXIgdXNlZCB0byBlbmNvZGUgdGhlIGxvd2VyaW5nCi8vLyBvZiBhIGxhdGUgZmluYWwgZmllbGQgd2l0aCBhbiBpbml0aWFsaXplci4KLy8vCi8vLyBBIGxhdGUgZmluYWwgZmllbGQgbmVlZHMgdG8gZGV0ZWN0IHdyaXRlcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gZm9yCi8vLyB3aGljaCBhIGBMYXRlSW5pdGlhbGl6YXRpb25FcnJvcmAgc2hvdWxkIGJlIHRocm93bi4gTGF0ZSBmaW5hbCBsb2NhbHMKLy8vIGNhbm5vdCBoYXZlIHdyaXRlcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gc2luY2UgdGhleSBhcmUgbm90IGluIHNjb3BlIGluCi8vLyB0aGVpciBvd24gaW5pdGlhbGl6ZXIuClN0YXRlbWVudCBjcmVhdGVHZXR0ZXJXaXRoSW5pdGlhbGl6ZXJXaXRoUmVjaGVjaygKICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICBpbnQgZmlsZU9mZnNldCwKICAgIFN0cmluZyBuYW1lLAogICAgRGFydFR5cGUgdHlwZSwKICAgIFN0cmluZyB2YXJpYWJsZUtpbmROYW1lLAogICAgRXhwcmVzc2lvbiBpbml0aWFsaXplciwKICAgIHtFeHByZXNzaW9uIGNyZWF0ZVZhcmlhYmxlUmVhZCh7Ym9vbCBuZWVkc1Byb21vdGlvbn0pLAogICAgRXhwcmVzc2lvbiBjcmVhdGVWYXJpYWJsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUpLAogICAgRXhwcmVzc2lvbiBjcmVhdGVJc1NldFJlYWQoKSwKICAgIEV4cHJlc3Npb24gY3JlYXRlSXNTZXRXcml0ZShFeHByZXNzaW9uIHZhbHVlKX0pIHsKICBFeHByZXNzaW9uIGV4Y2VwdGlvbiA9IG5ldyBUaHJvdyhuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgICBjb3JlVHlwZXMubGF0ZUluaXRpYWxpemF0aW9uRXJyb3JDb25zdHJ1Y3RvciwKICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgbmV3IFN0cmluZ0xpdGVyYWwoCiAgICAgICAgICAgICIkdmFyaWFibGVLaW5kTmFtZSAnJHtuYW1lfScgaGFzIGJlZW4gYXNzaWduZWQgZHVyaW5nICIKICAgICAgICAgICAgImluaXRpYWxpemF0aW9uLiIpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0CiAgICAgIF0pCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIFZhcmlhYmxlRGVjbGFyYXRpb24gdGVtcCA9CiAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKGluaXRpYWxpemVyLCB0eXBlOiB0eXBlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgaWYgKHR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vCiAgICAvLyAgICBpZiAoIV8jaXNTZXQjZmllbGQpIHsKICAgIC8vICAgICAgdmFyIHRlbXAgPSA8aW5pdD47CiAgICAvLyAgICAgIGlmIChfI2lzU2V0I2ZpZWxkKSB0aHJvdyAnLi4uJwogICAgLy8gICAgICBfI2lzU2V0I2ZpZWxkID0gdHJ1ZQogICAgLy8gICAgICBfI2ZpZWxkID0gdGVtcDsKICAgIC8vICAgIH0KICAgIC8vICAgIHJldHVybiBfI2ZpZWxkOwogICAgcmV0dXJuIG5ldyBCbG9jayg8U3RhdGVtZW50PlsKICAgICAgbmV3IElmU3RhdGVtZW50KAogICAgICAgICAgbmV3IE5vdChjcmVhdGVJc1NldFJlYWQoKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICBuZXcgQmxvY2soPFN0YXRlbWVudD5bCiAgICAgICAgICAgIHRlbXAsCiAgICAgICAgICAgIG5ldyBJZlN0YXRlbWVudCgKICAgICAgICAgICAgICAgIGNyZWF0ZUlzU2V0UmVhZCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGV4Y2VwdGlvbikuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgbnVsbCkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICAgICAgICAgIGNyZWF0ZUlzU2V0V3JpdGUobmV3IEJvb2xMaXRlcmFsKHRydWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlV3JpdGUoCiAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHRlbXApLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgXSksCiAgICAgICAgICBudWxsKQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQoCiAgICAgICAgICAvLyBJZiBbdHlwZV0gaXMgYSB0eXBlIHZhcmlhYmxlIHdpdGggdW5kZXRlcm1pbmVkIG51bGxhYmlsaXR5IHdlIG5lZWQKICAgICAgICAgIC8vIHRvIGNyZWF0ZSBhIHJlYWQgb2YgdGhlIGZpZWxkIHRoYXQgaXMgcHJvbW90ZWQgdG8gdGhlIHR5cGUgdmFyaWFibGUKICAgICAgICAgIC8vIHR5cGUuCiAgICAgICAgICBjcmVhdGVWYXJpYWJsZVJlYWQobmVlZHNQcm9tb3Rpb246IHR5cGUuaXNQb3RlbnRpYWxseU5vbk51bGxhYmxlKSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0CiAgICBdKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0gZWxzZSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vCiAgICAvLyAgICByZXR1cm4gbGV0ICMxID0gXyNmaWVsZCBpbiAjMSA9PSBudWxsCiAgICAvLyAgICAgICAgPyBsZXQgIzIgPSA8aW5pdD4gaW4gXyNmaWVsZCA9PSBudWxsID8gXyNmaWVsZCA9ICMyIDogdGhyb3cgJy4uLicKICAgIC8vICAgICAgICA6ICMxOwogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKAogICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZChuZWVkc1Byb21vdGlvbjogZmFsc2UpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICB0eXBlOiB0eXBlLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eS5udWxsYWJsZSkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudCgKICAgICAgICBuZXcgTGV0KAogICAgICAgICAgICB2YXJpYWJsZSwKICAgICAgICAgICAgbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgICAgIG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIGVxdWFsc05hbWUsCiAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQKICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIG5ldyBMZXQoCiAgICAgICAgICAgICAgICAgICAgdGVtcCwKICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlUmVhZChuZWVkc1Byb21vdGlvbjogZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50cyg8RXhwcmVzc2lvbj5bCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVWYXJpYWJsZVdyaXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlR2V0KHRlbXApLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KSwKICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSwgdHlwZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICAgICAgdHlwZSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9Cn0KCi8vLyBDcmVhdGVzIHRoZSBib2R5IGZvciB0aGUgc3ludGhlc2l6ZWQgZ2V0dGVyIHVzZWQgdG8gZW5jb2RlIHRoZSBsb3dlcmluZwovLy8gb2YgYSBsYXRlIGZpZWxkIG9yIGxvY2FsIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZXIuClN0YXRlbWVudCBjcmVhdGVHZXR0ZXJCb2R5V2l0aG91dEluaXRpYWxpemVyKENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICBpbnQgZmlsZU9mZnNldCwgU3RyaW5nIG5hbWUsIERhcnRUeXBlIHR5cGUsIFN0cmluZyB2YXJpYWJsZUtpbmROYW1lLAogICAge0V4cHJlc3Npb24gY3JlYXRlVmFyaWFibGVSZWFkKHtib29sIG5lZWRzUHJvbW90aW9ufSksCiAgICBFeHByZXNzaW9uIGNyZWF0ZUlzU2V0UmVhZCgpfSkgewogIEV4cHJlc3Npb24gZXhjZXB0aW9uID0gbmV3IFRocm93KG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIGNvcmVUeXBlcy5sYXRlSW5pdGlhbGl6YXRpb25FcnJvckNvbnN0cnVjdG9yLAogICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICBuZXcgU3RyaW5nTGl0ZXJhbCgKICAgICAgICAgICAgIiR2YXJpYWJsZUtpbmROYW1lICcke25hbWV9JyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIikKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQKICAgICAgXSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgaWYgKHR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vCiAgICAvLyAgICByZXR1cm4gXyNpc1NldCNmaWVsZCA/IF8jZmllbGQgOiB0aHJvdyAnLi4uJzsKICAgIHJldHVybiBuZXcgUmV0dXJuU3RhdGVtZW50KAogICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICAgIGNyZWF0ZUlzU2V0UmVhZCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgY3JlYXRlVmFyaWFibGVSZWFkKG5lZWRzUHJvbW90aW9uOiB0eXBlLmlzUG90ZW50aWFsbHlOb25OdWxsYWJsZSkKICAgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICAgICAgICBleGNlcHRpb24sCiAgICAgICAgICAgIHR5cGUpCiAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0gZWxzZSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vCiAgICAvLyAgICByZXR1cm4gbGV0ICMgPSBfI2ZpZWxkIGluICMgPT0gbnVsbCA/IHRocm93ICcuLi4nIDogIzsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbi5mb3JWYWx1ZSgKICAgICAgICBjcmVhdGVWYXJpYWJsZVJlYWQoKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgdHlwZTogdHlwZS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubnVsbGFibGUpKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQoCiAgICAgICAgbmV3IExldCgKICAgICAgICAgICAgdmFyaWFibGUsCiAgICAgICAgICAgIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICBlcXVhbHNOYW1lLAogICAgICAgICAgICAgICAgICAgIG5ldyBBcmd1bWVudHMoPEV4cHJlc3Npb24+WwogICAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgICAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgICBleGNlcHRpb24sCiAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUsIHR5cGUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgICAgICAgIHR5cGUpCiAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQp9CgovLy8gQ3JlYXRlcyB0aGUgYm9keSBmb3IgdGhlIHN5bnRoZXNpemVkIHNldHRlciB1c2VkIHRvIGVuY29kZSB0aGUgbG93ZXJpbmcKLy8vIG9mIGEgbm9uLWZpbmFsIGxhdGUgZmllbGQgb3IgbG9jYWwuClN0YXRlbWVudCBjcmVhdGVTZXR0ZXJCb2R5KAogICAgaW50IGZpbGVPZmZzZXQsIFN0cmluZyBuYW1lLCBWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciwgRGFydFR5cGUgdHlwZSwKICAgIHtib29sIHNob3VsZFJldHVyblZhbHVlLAogICAgRXhwcmVzc2lvbiBjcmVhdGVWYXJpYWJsZVdyaXRlKEV4cHJlc3Npb24gdmFsdWUpLAogICAgRXhwcmVzc2lvbiBjcmVhdGVJc1NldFdyaXRlKEV4cHJlc3Npb24gdmFsdWUpfSkgewogIFN0YXRlbWVudCBjcmVhdGVSZXR1cm4oRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgaWYgKHNob3VsZFJldHVyblZhbHVlKSB7CiAgICAgIHJldHVybiBuZXcgUmV0dXJuU3RhdGVtZW50KHZhbHVlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQodmFsdWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0KICB9CgogIFN0YXRlbWVudCBhc3NpZ25tZW50ID0gY3JlYXRlUmV0dXJuKAogICAgICBjcmVhdGVWYXJpYWJsZVdyaXRlKG5ldyBWYXJpYWJsZUdldChwYXJhbWV0ZXIpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KTsKCiAgaWYgKHR5cGUuaXNQb3RlbnRpYWxseU51bGxhYmxlKSB7CiAgICAvLyBHZW5lcmF0ZToKICAgIC8vCiAgICAvLyAgICBfI2lzU2V0I2ZpZWxkID0gdHJ1ZTsKICAgIC8vICAgIHJldHVybiBfI2ZpZWxkID0gcGFyYW1ldGVyCiAgICAvLwogICAgcmV0dXJuIG5ldyBCbG9jayhbCiAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAogICAgICAgICAgY3JlYXRlSXNTZXRXcml0ZShuZXcgQm9vbExpdGVyYWwodHJ1ZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgIGFzc2lnbm1lbnQKICAgIF0pCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfSBlbHNlIHsKICAgIC8vIEdlbmVyYXRlOgogICAgLy8KICAgIC8vICAgIHJldHVybiBfI2ZpZWxkID0gcGFyYW1ldGVyCiAgICAvLwogICAgcmV0dXJuIGFzc2lnbm1lbnQ7CiAgfQp9CgovLy8gQ3JlYXRlcyB0aGUgYm9keSBmb3IgdGhlIHN5bnRoZXNpemVkIHNldHRlciB1c2VkIHRvIGVuY29kZSB0aGUgbG93ZXJpbmcKLy8vIG9mIGEgZmluYWwgbGF0ZSBmaWVsZCBvciBsb2NhbC4KU3RhdGVtZW50IGNyZWF0ZVNldHRlckJvZHlGaW5hbCgKICAgIENvcmVUeXBlcyBjb3JlVHlwZXMsCiAgICBpbnQgZmlsZU9mZnNldCwKICAgIFN0cmluZyBuYW1lLAogICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIsCiAgICBEYXJ0VHlwZSB0eXBlLAogICAgU3RyaW5nIHZhcmlhYmxlS2luZE5hbWUsCiAgICB7Ym9vbCBzaG91bGRSZXR1cm5WYWx1ZSwKICAgIEV4cHJlc3Npb24gY3JlYXRlVmFyaWFibGVSZWFkKCksCiAgICBFeHByZXNzaW9uIGNyZWF0ZVZhcmlhYmxlV3JpdGUoRXhwcmVzc2lvbiB2YWx1ZSksCiAgICBFeHByZXNzaW9uIGNyZWF0ZUlzU2V0UmVhZCgpLAogICAgRXhwcmVzc2lvbiBjcmVhdGVJc1NldFdyaXRlKEV4cHJlc3Npb24gdmFsdWUpfSkgewogIEV4cHJlc3Npb24gZXhjZXB0aW9uID0gbmV3IFRocm93KG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICAgIGNvcmVUeXBlcy5sYXRlSW5pdGlhbGl6YXRpb25FcnJvckNvbnN0cnVjdG9yLAogICAgICBuZXcgQXJndW1lbnRzKDxFeHByZXNzaW9uPlsKICAgICAgICBuZXcgU3RyaW5nTGl0ZXJhbCgKICAgICAgICAgICAgIiR7dmFyaWFibGVLaW5kTmFtZX0gJyR7bmFtZX0nIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIikKICAgICAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQKICAgICAgXSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CgogIFN0YXRlbWVudCBjcmVhdGVSZXR1cm4oRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgaWYgKHNob3VsZFJldHVyblZhbHVlKSB7CiAgICAgIHJldHVybiBuZXcgUmV0dXJuU3RhdGVtZW50KHZhbHVlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQodmFsdWUpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0KICB9CgogIGlmICh0eXBlLmlzUG90ZW50aWFsbHlOdWxsYWJsZSkgewogICAgLy8gR2VuZXJhdGU6CiAgICAvLwogICAgLy8gICAgaWYgKF8jaXNTZXQjZmllbGQpIHsKICAgIC8vICAgICAgdGhyb3cgJy4uLic7CiAgICAvLyAgICB9IGVsc2UKICAgIC8vICAgICAgXyNpc1NldCNmaWVsZCA9IHRydWU7CiAgICAvLyAgICAgIHJldHVybiBfI2ZpZWxkID0gcGFyYW1ldGVyCiAgICAvLyAgICB9CiAgICByZXR1cm4gbmV3IElmU3RhdGVtZW50KAogICAgICAgIGNyZWF0ZUlzU2V0UmVhZCgpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChleGNlcHRpb24pLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICBuZXcgQmxvY2soWwogICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCiAgICAgICAgICAgICAgY3JlYXRlSXNTZXRXcml0ZShuZXcgQm9vbExpdGVyYWwodHJ1ZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KQogICAgICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCwKICAgICAgICAgIGNyZWF0ZVJldHVybihjcmVhdGVWYXJpYWJsZVdyaXRlKAogICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChwYXJhbWV0ZXIpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICBdKQogICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9IGVsc2UgewogICAgLy8gR2VuZXJhdGU6CiAgICAvLwogICAgLy8gICAgaWYgKF8jZmllbGQgPT0gbnVsbCkgewogICAgLy8gICAgICByZXR1cm4gXyNmaWVsZCA9IHBhcmFtZXRlcjsKICAgIC8vICAgIH0gZWxzZSB7CiAgICAvLyAgICAgIHRocm93ICcuLi4nOwogICAgLy8gICAgfQogICAgcmV0dXJuIG5ldyBJZlN0YXRlbWVudCgKICAgICAgbmV3IE1ldGhvZEludm9jYXRpb24oCiAgICAgICAgICBjcmVhdGVWYXJpYWJsZVJlYWQoKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICAgICAgICBlcXVhbHNOYW1lLAogICAgICAgICAgbmV3IEFyZ3VtZW50cygKICAgICAgICAgICAgICA8RXhwcmVzc2lvbj5bbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0XSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0LAogICAgICBjcmVhdGVSZXR1cm4oY3JlYXRlVmFyaWFibGVXcml0ZSgKICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChwYXJhbWV0ZXIpLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0KSwKICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhjZXB0aW9uKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQsCiAgICApLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9Cn0KgYEATk48ATApARgBTEoRBFBNTBsnSDs2IjYkEQcgIR4MGiIXPichJVEtKSVLKQ4QIxtQURNNIgchCxEHRkVMOiEgERYnJkggMEEXMS1LShYpJSEEAgFMLwRISkwbMhkUERMdHDs2IjY+NCIbRB8kCSMfHx1AIyQRByAfKyEcDBoiFz4nIRIdPE0WKSVRLSklJUQtKQ4QIxtQURNNIgchCxEHMFAURUw6ISARFicmSCAwQRcxLRkaLy5GOSg4SR85NS1MNSMeMkoWKSUhBAIBTDVCSTslPjQiG0UkCSMfHyQRBzggIzhOKRcSJSELEQdBRTc6ISARFicmSCAwQRcxLRtKFiklIQQCAUwoHE8dNjYtHUINRgYEASdPJAEkEQcgJQcXH0snIxEHIQsRByUHFwQCAUwkIRkUESMTHR0lNiI2PjQiG0skCSMfHwEtHUINRgYEASQRBx8ZESInDBw0RRQjTysnLEMnCyUhCxEHISgTGQwcHDkWGUgnIyg/JEMgBAIBNXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvbGF0ZV9sb3dlcmluZy5kYXJ0Z2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZml4ZWRfdHlwZV9idWlsZGVyLmRhcnSFXS8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICcuLi9wcm9ibGVtcy5kYXJ0JzsKaW1wb3J0ICdsaWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnbnVsbGFiaWxpdHlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICd0eXBlX2J1aWxkZXIuZGFydCc7CgpjbGFzcyBGaXhlZFR5cGVCdWlsZGVyIGV4dGVuZHMgVHlwZUJ1aWxkZXIgewogIGZpbmFsIERhcnRUeXBlIHR5cGU7CgogIGNvbnN0IEZpeGVkVHlwZUJ1aWxkZXIodGhpcy50eXBlKTsKCiAgVHlwZUJ1aWxkZXIgY2xvbmUoTGlzdDxUeXBlQnVpbGRlcj4gbmV3VHlwZXMpID0+IHRoaXM7CgogIE9iamVjdCBnZXQgbmFtZSA9PiBudWxsOwoKICBOdWxsYWJpbGl0eUJ1aWxkZXIgZ2V0IG51bGxhYmlsaXR5QnVpbGRlciA9PgogICAgICBuZXcgTnVsbGFiaWxpdHlCdWlsZGVyLmZyb21OdWxsYWJpbGl0eSh0eXBlLm51bGxhYmlsaXR5KTsKCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gJ0ZpeGVkVHlwZUJ1aWxkZXInOwoKICBTdHJpbmdCdWZmZXIgcHJpbnRPbihTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CiAgICBidWZmZXIud3JpdGUoJ3R5cGU9JHt0eXBlfScpOwogICAgcmV0dXJuIGJ1ZmZlcjsKICB9CgogIERhcnRUeXBlIGJ1aWxkKExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIFtUeXBlZGVmVHlwZSBvcmlnaW5dKSA9PiB0eXBlOwoKICBTdXBlcnR5cGUgYnVpbGRTdXBlcnR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIHVuaGFuZGxlZCgnYnVpbGRTdXBlcnR5cGUnLCAnRml4ZWRUeXBlQnVpbGRlcicsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgU3VwZXJ0eXBlIGJ1aWxkTWl4ZWRJblR5cGUoCiAgICAgIExpYnJhcnlCdWlsZGVyIGxpYnJhcnksIGludCBjaGFyT2Zmc2V0LCBVcmkgZmlsZVVyaSkgewogICAgcmV0dXJuIHVuaGFuZGxlZCgKICAgICAgICAnYnVpbGRNaXhlZEluVHlwZScsICdGaXhlZFR5cGVCdWlsZGVyJywgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBUeXBlQnVpbGRlciB3aXRoTnVsbGFiaWxpdHlCdWlsZGVyKE51bGxhYmlsaXR5QnVpbGRlciBudWxsYWJpbGl0eUJ1aWxkZXIpID0+CiAgICAgIHRoaXM7Cn0KMABOTjwBMAEbHyMcAS0XASUBOQEbAS9AAS4BLiITBAFIARw9UQQBHj0WRgQBTwwCATtwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9maXhlZF90eXBlX2J1aWxkZXIuZGFydFVmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9vcGVyYXRvci5kYXJ0jucvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS5vcGVyYXRvcnM7CgovLy8gVGhlIHVzZXItZGVmaW5hYmxlIG9wZXJhdG9ycyBpbiBEYXJ0LgovLy8KLy8vIFRoZSBuYW1lcyBoYXZlIGJlZW4gY2hvc2VuIHRvIHJlcHJlc2VudCB0aGVpciBub3JtYWwgc2VtYW50aWMgbWVhbmluZy4KZW51bSBPcGVyYXRvciB7CiAgYWRkLAogIGJpdHdpc2VBbmQsCiAgYml0d2lzZU5vdCwKICBiaXR3aXNlT3IsCiAgYml0d2lzZVhvciwKICBkaXZpZGUsCiAgZXF1YWxzLAogIGdyZWF0ZXJUaGFuLAogIGdyZWF0ZXJUaGFuRXF1YWxzLAogIGluZGV4R2V0LAogIGluZGV4U2V0LAogIGxlZnRTaGlmdCwKICBsZXNzVGhhbiwKICBsZXNzVGhhbkVxdWFscywKICBtb2R1bG8sCiAgbXVsdGlwbHksCiAgcmlnaHRTaGlmdCwKICB0cmlwbGVTaGlmdCwKICBzdWJ0cmFjdCwKICB0cnVuY2F0aW5nRGl2aWRlLAogIHVuYXJ5TWludXMsCn0KCk9wZXJhdG9yIG9wZXJhdG9yRnJvbVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgaWYgKGlkZW50aWNhbCgiKyIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5hZGQ7CiAgaWYgKGlkZW50aWNhbCgiJiIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5iaXR3aXNlQW5kOwogIGlmIChpZGVudGljYWwoIn4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuYml0d2lzZU5vdDsKICBpZiAoaWRlbnRpY2FsKCJ8Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmJpdHdpc2VPcjsKICBpZiAoaWRlbnRpY2FsKCJeIiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmJpdHdpc2VYb3I7CiAgaWYgKGlkZW50aWNhbCgiLyIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5kaXZpZGU7CiAgaWYgKGlkZW50aWNhbCgiPT0iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZXF1YWxzOwogIGlmIChpZGVudGljYWwoIj4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZ3JlYXRlclRoYW47CiAgaWYgKGlkZW50aWNhbCgiPj0iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbHM7CiAgaWYgKGlkZW50aWNhbCgiW10iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IuaW5kZXhHZXQ7CiAgaWYgKGlkZW50aWNhbCgiW109Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmluZGV4U2V0OwogIGlmIChpZGVudGljYWwoIjw8Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmxlZnRTaGlmdDsKICBpZiAoaWRlbnRpY2FsKCI8Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmxlc3NUaGFuOwogIGlmIChpZGVudGljYWwoIjw9Iiwgc3RyaW5nKSkgcmV0dXJuIE9wZXJhdG9yLmxlc3NUaGFuRXF1YWxzOwogIGlmIChpZGVudGljYWwoIiUiLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IubW9kdWxvOwogIGlmIChpZGVudGljYWwoIioiLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IubXVsdGlwbHk7CiAgaWYgKGlkZW50aWNhbCgiPj4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IucmlnaHRTaGlmdDsKICBpZiAoaWRlbnRpY2FsKCI+Pj4iLCBzdHJpbmcpKSByZXR1cm4gT3BlcmF0b3IudHJpcGxlU2hpZnQ7CiAgaWYgKGlkZW50aWNhbCgiLSIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci5zdWJ0cmFjdDsKICBpZiAoaWRlbnRpY2FsKCJ+LyIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRlOwogIGlmIChpZGVudGljYWwoInVuYXJ5LSIsIHN0cmluZykpIHJldHVybiBPcGVyYXRvci51bmFyeU1pbnVzOwogIHJldHVybiBudWxsOwp9CgpTdHJpbmcgb3BlcmF0b3JUb1N0cmluZyhPcGVyYXRvciBvcGVyYXRvcikgewogIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgIGNhc2UgT3BlcmF0b3IuYWRkOgogICAgICByZXR1cm4gIisiOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlQW5kOgogICAgICByZXR1cm4gIiYiOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlTm90OgogICAgICByZXR1cm4gIn4iOwogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlT3I6CiAgICAgIHJldHVybiAifCI7CiAgICBjYXNlIE9wZXJhdG9yLmJpdHdpc2VYb3I6CiAgICAgIHJldHVybiAiXiI7CiAgICBjYXNlIE9wZXJhdG9yLmRpdmlkZToKICAgICAgcmV0dXJuICIvIjsKICAgIGNhc2UgT3BlcmF0b3IuZXF1YWxzOgogICAgICByZXR1cm4gIj09IjsKICAgIGNhc2UgT3BlcmF0b3IuZ3JlYXRlclRoYW46CiAgICAgIHJldHVybiAiPiI7CiAgICBjYXNlIE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxzOgogICAgICByZXR1cm4gIj49IjsKICAgIGNhc2UgT3BlcmF0b3IuaW5kZXhHZXQ6CiAgICAgIHJldHVybiAiW10iOwogICAgY2FzZSBPcGVyYXRvci5pbmRleFNldDoKICAgICAgcmV0dXJuICJbXT0iOwogICAgY2FzZSBPcGVyYXRvci5sZWZ0U2hpZnQ6CiAgICAgIHJldHVybiAiPDwiOwogICAgY2FzZSBPcGVyYXRvci5sZXNzVGhhbjoKICAgICAgcmV0dXJuICI8IjsKICAgIGNhc2UgT3BlcmF0b3IubGVzc1RoYW5FcXVhbHM6CiAgICAgIHJldHVybiAiPD0iOwogICAgY2FzZSBPcGVyYXRvci5tb2R1bG86CiAgICAgIHJldHVybiAiJSI7CiAgICBjYXNlIE9wZXJhdG9yLm11bHRpcGx5OgogICAgICByZXR1cm4gIioiOwogICAgY2FzZSBPcGVyYXRvci5yaWdodFNoaWZ0OgogICAgICByZXR1cm4gIj4+IjsKICAgIGNhc2UgT3BlcmF0b3IudHJpcGxlU2hpZnQ6CiAgICAgIHJldHVybiAiPj4+IjsKICAgIGNhc2UgT3BlcmF0b3Iuc3VidHJhY3Q6CiAgICAgIHJldHVybiAiLSI7CiAgICBjYXNlIE9wZXJhdG9yLnRydW5jYXRpbmdEaXZpZGU6CiAgICAgIHJldHVybiAifi8iOwogICAgY2FzZSBPcGVyYXRvci51bmFyeU1pbnVzOgogICAgICByZXR1cm4gInVuYXJ5LSI7CiAgfQogIHJldHVybiBudWxsOwp9CgppbnQgb3BlcmF0b3JSZXF1aXJlZEFyZ3VtZW50Q291bnQoT3BlcmF0b3Igb3BlcmF0b3IpIHsKICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICBjYXNlIE9wZXJhdG9yLmJpdHdpc2VOb3Q6CiAgICBjYXNlIE9wZXJhdG9yLnVuYXJ5TWludXM6CiAgICAgIHJldHVybiAwOwoKICAgIGNhc2UgT3BlcmF0b3IuYWRkOgogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlQW5kOgogICAgY2FzZSBPcGVyYXRvci5iaXR3aXNlT3I6CiAgICBjYXNlIE9wZXJhdG9yLmJpdHdpc2VYb3I6CiAgICBjYXNlIE9wZXJhdG9yLmRpdmlkZToKICAgIGNhc2UgT3BlcmF0b3IuZXF1YWxzOgogICAgY2FzZSBPcGVyYXRvci5ncmVhdGVyVGhhbjoKICAgIGNhc2UgT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbHM6CiAgICBjYXNlIE9wZXJhdG9yLmluZGV4R2V0OgogICAgY2FzZSBPcGVyYXRvci5sZWZ0U2hpZnQ6CiAgICBjYXNlIE9wZXJhdG9yLmxlc3NUaGFuOgogICAgY2FzZSBPcGVyYXRvci5sZXNzVGhhbkVxdWFsczoKICAgIGNhc2UgT3BlcmF0b3IubW9kdWxvOgogICAgY2FzZSBPcGVyYXRvci5tdWx0aXBseToKICAgIGNhc2UgT3BlcmF0b3IucmlnaHRTaGlmdDoKICAgIGNhc2UgT3BlcmF0b3IudHJpcGxlU2hpZnQ6CiAgICBjYXNlIE9wZXJhdG9yLnN1YnRyYWN0OgogICAgY2FzZSBPcGVyYXRvci50cnVuY2F0aW5nRGl2aWRlOgogICAgICByZXR1cm4gMTsKCiAgICBjYXNlIE9wZXJhdG9yLmluZGV4U2V0OgogICAgICByZXR1cm4gMjsKICB9CiAgcmV0dXJuIC0xOwp9CoCLAE5OPAEZASoESxAHDg4NDgoKDxUMDA0MEgoMDg8MFA4CAS0zOjo5OjY3O0I5Ojo4PzY4Oz04QT8PAgEtFhcSHhIeEh0SHhIaEhoTHxIlExwTHBQdExwSIhMaEhwSHhMfFBwSJBMeFwQPAgE3Fh4eEAEXHh0eGhofJRwdHCIaHB4fHCQQARwQBA0CASlwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvb3BlcmF0b3IuZGFydGNmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnTAARCyLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEub3V0bGluZV9idWlsZGVyOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydCcKICAgIHNob3cKICAgICAgICBBc3NlcnQsCiAgICAgICAgRGVjbGFyYXRpb25LaW5kLAogICAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQsCiAgICAgICAgSWRlbnRpZmllckNvbnRleHQsCiAgICAgICAgbGVuZ3RoT2ZTcGFuLAogICAgICAgIE1lbWJlcktpbmQsCiAgICAgICAgb3B0aW9uYWw7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3F1b3RlLmRhcnQnIHNob3cgdW5lc2NhcGVTdHJpbmc7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3N0YWNrX2xpc3RlbmVyLmRhcnQnCiAgICBzaG93IEZpeGVkTnVsbGFibGVMaXN0LCBOdWxsVmFsdWUsIFBhcnNlclJlY292ZXJ5OwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci92YWx1ZV9raW5kLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc2Nhbm5lci5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cgSW52YWxpZFR5cGUsIE51bGxhYmlsaXR5LCBQcm9jZWR1cmVLaW5kLCBWYXJpYW5jZTsKCmltcG9ydCAnLi4vYnVpbGRlci9jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2ZpeGVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2ludmFsaWRfdHlwZV9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWV0YWRhdGFfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL21peGluX2FwcGxpY2F0aW9uX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9udWxsYWJpbGl0eV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdHlwZV92YXJpYWJsZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvdW5yZXNvbHZlZF90eXBlLmRhcnQnOwoKaW1wb3J0ICcuLi9jb21iaW5hdG9yLmRhcnQnIHNob3cgQ29tYmluYXRvcjsKCmltcG9ydCAnLi4vY29uZmlndXJhdGlvbi5kYXJ0JyBzaG93IENvbmZpZ3VyYXRpb247CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnOwoKaW1wb3J0ICcuLi9pZGVudGlmaWVycy5kYXJ0JyBzaG93IFF1YWxpZmllZE5hbWUsIGZsYXR0ZW5OYW1lOwoKaW1wb3J0ICcuLi9pZ25vcmVkX3BhcnNlcl9lcnJvcnMuZGFydCcgc2hvdyBpc0lnbm9yZWRQYXJzZXJFcnJvcjsKCmltcG9ydCAnLi4va2VybmVsL3R5cGVfYWxnb3JpdGhtcy5kYXJ0JzsKCmltcG9ydCAnLi4vbW9kaWZpZXIuZGFydCcKICAgIHNob3cKICAgICAgICBDb25zdCwKICAgICAgICBDb3ZhcmlhbnQsCiAgICAgICAgRXh0ZXJuYWwsCiAgICAgICAgRmluYWwsCiAgICAgICAgTW9kaWZpZXIsCiAgICAgICAgU3RhdGljLAogICAgICAgIFZhciwKICAgICAgICBhYnN0cmFjdE1hc2ssCiAgICAgICAgY29uc3RNYXNrLAogICAgICAgIGNvdmFyaWFudE1hc2ssCiAgICAgICAgZXh0ZXJuYWxNYXNrLAogICAgICAgIGZpbmFsTWFzaywKICAgICAgICBsYXRlTWFzaywKICAgICAgICBtaXhpbkRlY2xhcmF0aW9uTWFzaywKICAgICAgICByZXF1aXJlZE1hc2ssCiAgICAgICAgc3RhdGljTWFzazsKCmltcG9ydCAnLi4vb3BlcmF0b3IuZGFydCcKICAgIHNob3cKICAgICAgICBPcGVyYXRvciwKICAgICAgICBvcGVyYXRvckZyb21TdHJpbmcsCiAgICAgICAgb3BlcmF0b3JUb1N0cmluZywKICAgICAgICBvcGVyYXRvclJlcXVpcmVkQXJndW1lbnRDb3VudDsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcgc2hvdyB1bmhhbmRsZWQ7CgppbXBvcnQgJ3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCcKICAgIHNob3cKICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQsCiAgICAgICAgRmllbGRJbmZvLAogICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdzdGFja19saXN0ZW5lcl9pbXBsLmRhcnQnOwoKaW1wb3J0ICd2YWx1ZV9raW5kcy5kYXJ0JzsKCmVudW0gTWV0aG9kQm9keSB7CiAgQWJzdHJhY3QsCiAgUmVndWxhciwKICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5LAp9CgpjbGFzcyBPdXRsaW5lQnVpbGRlciBleHRlbmRzIFN0YWNrTGlzdGVuZXJJbXBsIHsKICBmaW5hbCBTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5QnVpbGRlcjsKCiAgZmluYWwgYm9vbCBlbmFibGVOYXRpdmU7CiAgZmluYWwgYm9vbCBzdHJpbmdFeHBlY3RlZEFmdGVyTmF0aXZlOwogIGJvb2wgaW5Db25zdHJ1Y3RvciA9IGZhbHNlOwogIGJvb2wgaW5Db25zdHJ1Y3Rvck5hbWUgPSBmYWxzZTsKICBpbnQgaW1wb3J0SW5kZXggPSAwOwoKICBTdHJpbmcgbmF0aXZlTWV0aG9kTmFtZTsKCiAgLy8vIENvdW50ZXIgdXNlZCBmb3IgbmFtaW5nIHVubmFtZWQgZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucy4KICBpbnQgdW5uYW1lZEV4dGVuc2lvbkNvdW50ZXIgPSAwOwoKICBPdXRsaW5lQnVpbGRlcihTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5KQogICAgICA6IGxpYnJhcnlCdWlsZGVyID0gbGlicmFyeSwKICAgICAgICBlbmFibGVOYXRpdmUgPQogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5lbmFibGVOYXRpdmUobGlicmFyeS5pbXBvcnRVcmkpLAogICAgICAgIHN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmUgPQogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5uYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nOwoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0IHVyaSA9PiBsaWJyYXJ5QnVpbGRlci5maWxlVXJpOwoKICBpbnQgcG9wQ2hhck9mZnNldCgpID0+IHBvcCgpOwoKICBMaXN0PFN0cmluZz4gcG9wSWRlbnRpZmllckxpc3QoaW50IGNvdW50KSB7CiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oY291bnQpOwogICAgYm9vbCBpc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICBwb3BDaGFyT2Zmc2V0KCk7CiAgICAgIE9iamVjdCBpZGVudGlmaWVyID0gcG9wKCk7CiAgICAgIGlmIChpZGVudGlmaWVyIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgaXNQYXJzZXJSZWNvdmVyeSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGlzdFtpXSA9IGlkZW50aWZpZXI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpc1BhcnNlclJlY292ZXJ5ID8gbnVsbCA6IGxpc3Q7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YSIpOwogICAgcG9wKCk7IC8vIGFyZ3VtZW50cwogICAgaWYgKHBlcmlvZEJlZm9yZU5hbWUgIT0gbnVsbCkgewogICAgICBwb3AoKTsgLy8gb2Zmc2V0CiAgICAgIHBvcCgpOyAvLyBjb25zdHJ1Y3RvciBuYW1lCiAgICB9CiAgICBwb3AoKTsgLy8gdHlwZSBhcmd1bWVudHMKICAgIHBvcCgpOyAvLyBvZmZzZXQKICAgIE9iamVjdCBzZW50aW5lbCA9IHBvcCgpOyAvLyBwcmVmaXggb3IgY29uc3RydWN0b3IKICAgIHB1c2goc2VudGluZWwgaXMgUGFyc2VyUmVjb3ZlcnkKICAgICAgICA/IHNlbnRpbmVsCiAgICAgICAgOiBuZXcgTWV0YWRhdGFCdWlsZGVyKGJlZ2luVG9rZW4pKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiTWV0YWRhdGFTdGFyIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PE1ldGFkYXRhQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5NZXRhZGF0YSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbiIpOwogICAgcG9wKCk7IC8vIG1ldGFkYXRhIHN0YXIKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiSGlkZSIpOwogICAgT2JqZWN0IG5hbWVzID0gcG9wKCk7CiAgICBpZiAobmFtZXMgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lcyk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKG5ldyBDb21iaW5hdG9yLmhpZGUoCiAgICAgICAgICBuYW1lcywgaGlkZUtleXdvcmQuY2hhck9mZnNldCwgbGlicmFyeUJ1aWxkZXIuZmlsZVVyaSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJTaG93Iik7CiAgICBPYmplY3QgbmFtZXMgPSBwb3AoKTsKICAgIGlmIChuYW1lcyBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobmV3IENvbWJpbmF0b3Iuc2hvdygKICAgICAgICAgIG5hbWVzLCBzaG93S2V5d29yZC5jaGFyT2Zmc2V0LCBsaWJyYXJ5QnVpbGRlci5maWxlVXJpKSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbWJpbmF0b3JzKGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiQ29tYmluYXRvcnMiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Q29tYmluYXRvcj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIE51bGxWYWx1ZS5Db21iaW5hdG9ycyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4cG9ydChUb2tlbiBleHBvcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIkV4cG9ydCIpOwogICAgTGlzdDxDb21iaW5hdG9yPiBjb21iaW5hdG9ycyA9IHBvcCgpOwogICAgTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucyA9IHBvcCgpOwogICAgaW50IHVyaU9mZnNldCA9IHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyB1cmkgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgbGlicmFyeUJ1aWxkZXIuYWRkRXhwb3J0KG1ldGFkYXRhLCB1cmksIGNvbmZpZ3VyYXRpb25zLCBjb21iaW5hdG9ycywKICAgICAgICBleHBvcnRLZXl3b3JkLmNoYXJPZmZzZXQsIHVyaU9mZnNldCk7CiAgICBjaGVja0VtcHR5KGV4cG9ydEtleXdvcmQuY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUltcG9ydFByZWZpeChUb2tlbiBkZWZlcnJlZEtleXdvcmQsIFRva2VuIGFzS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiSW1wb3J0UHJlZml4Iik7CiAgICBpZiAoYXNLZXl3b3JkID09IG51bGwpIHsKICAgICAgLy8gSWYgYXNLZXl3b3JkIGlzIG51bGwsIHRoZW4gbm8gcHJlZml4IGhhcyBiZWVuIHB1c2hlZCBvbiB0aGUgc3RhY2suCiAgICAgIC8vIFB1c2ggYSBwbGFjZWhvbGRlciBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgbm8gcHJlZml4LgogICAgICBwdXNoKE51bGxWYWx1ZS5QcmVmaXgpOwogICAgICBwdXNoKC0xKTsKICAgIH0KICAgIHB1c2goZGVmZXJyZWRLZXl3b3JkICE9IG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJFbmRJbXBvcnQiKTsKICAgIExpc3Q8Q29tYmluYXRvcj4gY29tYmluYXRvcnMgPSBwb3AoKTsKICAgIGJvb2wgaXNEZWZlcnJlZCA9IHBvcCgpOwogICAgaW50IHByZWZpeE9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHByZWZpeCA9IHBvcChOdWxsVmFsdWUuUHJlZml4KTsKICAgIExpc3Q8Q29uZmlndXJhdGlvbj4gY29uZmlndXJhdGlvbnMgPSBwb3AoKTsKICAgIGludCB1cmlPZmZzZXQgPSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBTdHJpbmcgdXJpID0gcG9wKCk7IC8vIEZvciBhIGNvbmRpdGlvbmFsIGltcG9ydCwgdGhpcyBpcyB0aGUgZGVmYXVsdCBVUkkuCiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoaW1wb3J0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGlmIChwcmVmaXggaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKICAgIGxpYnJhcnlCdWlsZGVyLmFkZEltcG9ydCgKICAgICAgICBtZXRhZGF0YSwKICAgICAgICB1cmksCiAgICAgICAgY29uZmlndXJhdGlvbnMsCiAgICAgICAgcHJlZml4LAogICAgICAgIGNvbWJpbmF0b3JzLAogICAgICAgIGlzRGVmZXJyZWQsCiAgICAgICAgaW1wb3J0S2V5d29yZC5jaGFyT2Zmc2V0LAogICAgICAgIHByZWZpeE9mZnNldCwKICAgICAgICB1cmlPZmZzZXQsCiAgICAgICAgaW1wb3J0SW5kZXgrKyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpcyhpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkVuZENvbmRpdGlvbmFsVXJpcyIpOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxDb25maWd1cmF0aW9uPigpLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLkNvbmRpdGlvbmFsVXJpcyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpKFRva2VuIGlmS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLCBUb2tlbiBlcXVhbFNpZ24pIHsKICAgIGRlYnVnRXZlbnQoIkVuZENvbmRpdGlvbmFsVXJpIik7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcENoYXJPZmZzZXQoKTsKICAgIFN0cmluZyB1cmkgPSBwb3AoKTsKICAgIGlmIChlcXVhbFNpZ24gIT0gbnVsbCkgcG9wQ2hhck9mZnNldCgpOwogICAgU3RyaW5nIGNvbmRpdGlvbiA9IHBvcElmTm90TnVsbChlcXVhbFNpZ24pID8/ICJ0cnVlIjsKICAgIE9iamVjdCBkb3R0ZWROYW1lID0gcG9wKCk7CiAgICBpZiAoZG90dGVkTmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKGRvdHRlZE5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuZXcgQ29uZmlndXJhdGlvbihjaGFyT2Zmc2V0LCBkb3R0ZWROYW1lLCBjb25kaXRpb24sIHVyaSkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVEb3R0ZWROYW1lKGludCBjb3VudCwgVG9rZW4gZmlyc3RJZGVudGlmaWVyKSB7CiAgICBkZWJ1Z0V2ZW50KCJEb3R0ZWROYW1lIik7CiAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBwb3BJZGVudGlmaWVyTGlzdChjb3VudCk7CiAgICBpZiAobmFtZXMgPT0gbnVsbCkgewogICAgICBwdXNoKG5ldyBQYXJzZXJSZWNvdmVyeShmaXJzdElkZW50aWZpZXIuY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChuYW1lcy5qb2luKCcuJykpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVySW1wb3J0KFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiUmVjb3ZlckltcG9ydCIpOwogICAgcG9wKCk7IC8vIGNvbWJpbmF0b3JzCiAgICBwb3AoTnVsbFZhbHVlLkRlZmVycmVkKTsgLy8gZGVmZXJyZWRLZXl3b3JkCiAgICBwb3AoKTsgLy8gcHJlZml4T2Zmc2V0CiAgICBwb3AoTnVsbFZhbHVlLlByZWZpeCk7IC8vIHByZWZpeAogICAgcG9wKCk7IC8vIGNvbmRpdGlvbmFsVXJpcwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRQYXJ0KFRva2VuIHBhcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIlBhcnQiKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wQ2hhck9mZnNldCgpOwogICAgU3RyaW5nIHVyaSA9IHBvcCgpOwogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBsaWJyYXJ5QnVpbGRlci5hZGRQYXJ0KG1ldGFkYXRhLCB1cmksIGNoYXJPZmZzZXQpOwogICAgY2hlY2tFbXB0eShwYXJ0S2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlT3BlcmF0b3JOYW1lKFRva2VuIG9wZXJhdG9yS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk9wZXJhdG9yTmFtZSIpOwogICAgcHVzaChvcGVyYXRvckZyb21TdHJpbmcodG9rZW4uc3RyaW5nVmFsdWUpKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZE9wZXJhdG9yTmFtZSIpOwogICAgcHVzaCgnaW52YWxpZCcpOwogICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQgY29udGV4dCkgewogICAgaWYgKGNvbnRleHQgPT0gSWRlbnRpZmllckNvbnRleHQuZW51bVZhbHVlRGVjbGFyYXRpb24pIHsKICAgICAgZGVidWdFdmVudCgiaGFuZGxlSWRlbnRpZmllciIpOwogICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgICAgaWYgKHRva2VuLmlzU3ludGhldGljKSB7CiAgICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3ZlcnkodG9rZW4uY2hhck9mZnNldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHB1c2gobmV3IEVudW1Db25zdGFudEluZm8obWV0YWRhdGEsIHRva2VuLmxleGVtZSwgdG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICAgZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQodG9rZW4pKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIGNvbnRleHQpOwogICAgICBwdXNoKHRva2VuLmNoYXJPZmZzZXQpOwogICAgfQogICAgaWYgKGluQ29uc3RydWN0b3IgJiYgY29udGV4dCA9PSBJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbikgewogICAgICBpbkNvbnN0cnVjdG9yTmFtZSA9IHRydWU7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vTmFtZShUb2tlbiB0b2tlbikgewogICAgc3VwZXIuaGFuZGxlTm9OYW1lKHRva2VuKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ1BhcnQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ1BhcnQiKTsKICAgIC8vIElnbm9yZSBzdHJpbmcgcGFydHMgLSByZXBvcnQgZXJyb3IgbGF0ZXIuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTdHJpbmcoaW50IGludGVycG9sYXRpb25Db3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpdGVyYWxTdHJpbmciKTsKICAgIGlmIChpbnRlcnBvbGF0aW9uQ291bnQgPT0gMCkgewogICAgICBUb2tlbiB0b2tlbiA9IHBvcCgpOwogICAgICBwdXNoKHVuZXNjYXBlU3RyaW5nKHRva2VuLmxleGVtZSwgdG9rZW4sIHRoaXMpKTsKICAgICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIFRva2VuIGJlZ2luVG9rZW4gPSBwb3AoKTsKICAgICAgaW50IGNoYXJPZmZzZXQgPSBiZWdpblRva2VuLmNoYXJPZmZzZXQ7CiAgICAgIHB1c2goIiR7U291cmNlTGlicmFyeUJ1aWxkZXIuTUFMRk9STUVEX1VSSV9TQ0hFTUV9OmJhZCR7Y2hhck9mZnNldH0iKTsKICAgICAgcHVzaChjaGFyT2Zmc2V0KTsKICAgICAgLy8gUG9pbnQgdG8gZG9sbGFyIHNpZ24KICAgICAgaW50IGludGVycG9sYXRpb25PZmZzZXQgPSBjaGFyT2Zmc2V0ICsgYmVnaW5Ub2tlbi5sZXhlbWUubGVuZ3RoOwogICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5VcmksIGludGVycG9sYXRpb25PZmZzZXQsIDEpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVDbGF1c2UoVG9rZW4gbmF0aXZlVG9rZW4sIGJvb2wgaGFzTmFtZSkgewogICAgZGVidWdFdmVudCgiTmF0aXZlQ2xhdXNlIik7CiAgICBpZiAoaGFzTmFtZSkgewogICAgICAvLyBQb3AgdGhlIG5hdGl2ZSBjbGF1c2Ugd2hpY2ggaW4gdGhpcyBjYXNlIGlzIGEgU3RyaW5nTGl0ZXJhbC4KICAgICAgcG9wKCk7IC8vIENoYXIgb2Zmc2V0LgogICAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUgPSAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYXRpdmVNZXRob2ROYW1lID0gbmFtZTsgLy8gU3RyaW5nLgogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuYXRpdmVNZXRob2ROYW1lID0gJyc7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oVG9rZW4gc3RhcnRUb2tlbiwgaW50IGxpdGVyYWxDb3VudCkgewogICAgZGVidWdFdmVudCgiU3RyaW5nSnV4dGFwb3NpdGlvbiIpOwogICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KGxpdGVyYWxDb3VudCk7CiAgICBpbnQgY2hhck9mZnNldCA9IC0xOwogICAgZm9yIChpbnQgaSA9IGxpdGVyYWxDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgICAgbGlzdFtpXSA9IHBvcCgpOwogICAgfQogICAgcHVzaChsaXN0LmpvaW4oIiIpKTsKICAgIHB1c2goY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXJMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiZW5kSWRlbnRpZmllckxpc3QiKTsKICAgIHB1c2gocG9wSWRlbnRpZmllckxpc3QoY291bnQpID8/CiAgICAgICAgKGNvdW50ID09IDAgPyBOdWxsVmFsdWUuSWRlbnRpZmllckxpc3QgOiBuZXcgUGFyc2VyUmVjb3ZlcnkoLTEpKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVF1YWxpZmllZChUb2tlbiBwZXJpb2QpIHsKICAgIGFzc2VydChjaGVja1N0YXRlKHBlcmlvZCwgWwogICAgICAvKnN1ZmZpeCBvZmZzZXQqLyBWYWx1ZUtpbmRzLkludGVnZXIsCiAgICAgIC8qc3VmZml4Ki8gVmFsdWVLaW5kcy5OYW1lT3JQYXJzZXJSZWNvdmVyeSwKICAgICAgLypwcmVmaXggb2Zmc2V0Ki8gVmFsdWVLaW5kcy5JbnRlZ2VyLAogICAgICAvKnByZWZpeCovIHVuaW9uT2ZLaW5kcyhbCiAgICAgICAgVmFsdWVLaW5kcy5OYW1lLAogICAgICAgIFZhbHVlS2luZHMuUGFyc2VyUmVjb3ZlcnksCiAgICAgICAgVmFsdWVLaW5kcy5RdWFsaWZpZWROYW1lCiAgICAgIF0pLAogICAgXSkpOwogICAgZGVidWdFdmVudCgiaGFuZGxlUXVhbGlmaWVkIik7CiAgICBpbnQgc3VmZml4T2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3Qgc3VmZml4ID0gcG9wKCk7CiAgICBpbnQgb2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgcHJlZml4ID0gcG9wKCk7CiAgICBpZiAocHJlZml4IGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gocHJlZml4KTsKICAgIH0gZWxzZSBpZiAoc3VmZml4IGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2goc3VmZml4KTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoc3VmZml4LCBwZXJpb2QubmV4dC5sZXhlbWUpKTsKICAgICAgYXNzZXJ0KHN1ZmZpeE9mZnNldCA9PSBwZXJpb2QubmV4dC5jaGFyT2Zmc2V0KTsKICAgICAgcHVzaChuZXcgUXVhbGlmaWVkTmFtZShwcmVmaXgsIHBlcmlvZC5uZXh0KSk7CiAgICB9CiAgICBwdXNoKG9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpYnJhcnlOYW1lKFRva2VuIGxpYnJhcnlLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpYnJhcnlOYW1lIik7CiAgICBwb3BDaGFyT2Zmc2V0KCk7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChsaWJyYXJ5S2V5d29yZCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBsaWJyYXJ5QnVpbGRlci5kb2N1bWVudGF0aW9uQ29tbWVudCA9IGRvY3VtZW50YXRpb25Db21tZW50OwogICAgaWYgKG5hbWUgaXMhIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIGxpYnJhcnlCdWlsZGVyLm5hbWUgPQogICAgICAgICAgZmxhdHRlbk5hbWUobmFtZSwgb2Zmc2V0Rm9yVG9rZW4obGlicmFyeUtleXdvcmQpLCB1cmkpOwogICAgfQogICAgbGlicmFyeUJ1aWxkZXIubWV0YWRhdGEgPSBtZXRhZGF0YTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uUHJlbHVkZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CiAgICBsaWJyYXJ5QnVpbGRlci5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvbiwKICAgICAgICAiY2xhc3Mgb3IgbWl4aW4gYXBwbGljYXRpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNsYXNzRGVjbGFyYXRpb24iKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgcHVzaCh0eXBlVmFyaWFibGVzID8/IE51bGxWYWx1ZS5UeXBlVmFyaWFibGVzKTsKICAgIGxpYnJhcnlCdWlsZGVyLmN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyCiAgICAgICAgLm1hcmtBc0NsYXNzRGVjbGFyYXRpb24obmFtZS5sZXhlbWUsIG5hbWUuY2hhck9mZnNldCwgdHlwZVZhcmlhYmxlcyk7CiAgICBsaWJyYXJ5QnVpbGRlci5zZXRDdXJyZW50Q2xhc3NOYW1lKG5hbWUubGV4ZW1lKTsKICAgIHB1c2goYWJzdHJhY3RUb2tlbiAhPSBudWxsID8gYWJzdHJhY3RNYXNrIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTWl4aW5EZWNsYXJhdGlvbiIpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBwdXNoKHR5cGVWYXJpYWJsZXMgPz8gTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogICAgbGlicmFyeUJ1aWxkZXIuY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIKICAgICAgICAubWFya0FzTWl4aW5EZWNsYXJhdGlvbihuYW1lLmxleGVtZSwgbmFtZS5jaGFyT2Zmc2V0LCB0eXBlVmFyaWFibGVzKTsKICAgIGxpYnJhcnlCdWlsZGVyLnNldEN1cnJlbnRDbGFzc05hbWUobmFtZS5sZXhlbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNsYXNzT3JNaXhpbkJvZHkoRGVjbGFyYXRpb25LaW5kIGtpbmQsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoa2luZCA9PSBEZWNsYXJhdGlvbktpbmQuRXh0ZW5zaW9uKSB7CiAgICAgIGFzc2VydChjaGVja1N0YXRlKHRva2VuLCBbCiAgICAgICAgdW5pb25PZktpbmRzKFtWYWx1ZUtpbmRzLlBhcnNlclJlY292ZXJ5LCBWYWx1ZUtpbmRzLlR5cGVCdWlsZGVyXSkKICAgICAgXSkpOwogICAgICBPYmplY3QgZXh0ZW5zaW9uVGhpc1R5cGUgPSBwZWVrKCk7CiAgICAgIGlmIChleHRlbnNpb25UaGlzVHlwZSBpcyBUeXBlQnVpbGRlcikgewogICAgICAgIGxpYnJhcnlCdWlsZGVyLmN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyCiAgICAgICAgICAgIC5yZWdpc3RlckV4dGVuc2lvblRoaXNUeXBlKGV4dGVuc2lvblRoaXNUeXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBTdXBwbHkgYW4gaW52YWxpZCB0eXBlIGFzIHRoZSBleHRlbnNpb24gb24gdHlwZS4KICAgICAgfQogICAgfQogICAgZGVidWdFdmVudCgiYmVnaW5DbGFzc09yTWl4aW5Cb2R5Iik7CiAgICAvLyBSZXNvbHZlIHVucmVzb2x2ZWQgdHlwZXMgZnJvbSB0aGUgY2xhc3MgaGVhZGVyIChpLmUuLCBzdXBlcmNsYXNzLCBtaXhpbnMsCiAgICAvLyBhbmQgaW1wbGVtZW50ZWQgdHlwZXMpIGJlZm9yZSBhZGRpbmcgbWVtYmVycyBmcm9tIHRoZSBjbGFzcyBib2R5IHdoaWNoCiAgICAvLyBzaG91bGQgbm90IHNoYWRvdyB0aGVzZSB1bnJlc29sdmVkIHR5cGVzLgogICAgbGlicmFyeUJ1aWxkZXIuY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIucmVzb2x2ZVR5cGVzKAogICAgICAgIGxpYnJhcnlCdWlsZGVyLmN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLnR5cGVWYXJpYWJsZXMsCiAgICAgICAgbGlicmFyeUJ1aWxkZXIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgVG9rZW4gYmVnaW4sIFRva2VuIGFic3RyYWN0VG9rZW4sIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uIik7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyA/PyBOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBsaWJyYXJ5QnVpbGRlci5jdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlci5tYXJrQXNOYW1lZE1peGluQXBwbGljYXRpb24oCiAgICAgICAgbmFtZS5sZXhlbWUsIG5hbWUuY2hhck9mZnNldCwgdHlwZVZhcmlhYmxlcyk7CiAgICBwdXNoKGFic3RyYWN0VG9rZW4gIT0gbnVsbCA/IGFic3RyYWN0TWFzayA6IDApOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgZGVidWdFdmVudCgiQ2xhc3NPck1peGluSW1wbGVtZW50cyIpOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxOYW1lZFR5cGVCdWlsZGVyPigpCiAgICAgICAgICAgIC5wb3Aoc3RhY2ssIGludGVyZmFjZXNDb3VudCkgPz8KICAgICAgICBOdWxsVmFsdWUuVHlwZUJ1aWxkZXJMaXN0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlckNsYXNzSGVhZGVyKCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlUmVjb3ZlckNsYXNzSGVhZGVyIik7CiAgICBwb3AoTnVsbFZhbHVlLlR5cGVCdWlsZGVyTGlzdCk7IC8vIEludGVyZmFjZXMuCiAgICBwb3AoKTsgLy8gU3VwZXJ0eXBlIG9mZnNldC4KICAgIHBvcCgpOyAvLyBTdXBlcnR5cGUuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcigpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZVJlY292ZXJNaXhpbkhlYWRlciIpOwogICAgcG9wKE51bGxWYWx1ZS5UeXBlQnVpbGRlckxpc3QpOyAvLyBJbnRlcmZhY2VzLgogICAgcG9wKE51bGxWYWx1ZS5UeXBlQnVpbGRlckxpc3QpOyAvLyBTdXBlcnR5cGUgY29uc3RyYWludHMuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiaGFuZGxlQ2xhc3NFeHRlbmRzIik7CiAgICBwdXNoKGV4dGVuZHNLZXl3b3JkPy5jaGFyT2Zmc2V0ID8/IC0xKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWl4aW5PbihUb2tlbiBvbktleXdvcmQsIGludCB0eXBlQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZU1peGluT24iKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8TmFtZWRUeXBlQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIHR5cGVDb3VudCkgPz8KICAgICAgICBuZXcgUGFyc2VyUmVjb3Zlcnkob2Zmc2V0Rm9yVG9rZW4ob25LZXl3b3JkKSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRDbGFzc0RlY2xhcmF0aW9uIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMgPSBwb3AoTnVsbFZhbHVlLlR5cGVCdWlsZGVyTGlzdCk7CiAgICBpbnQgc3VwZXJ0eXBlT2Zmc2V0ID0gcG9wKCk7CiAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBudWxsSWZQYXJzZXJSZWNvdmVyeShwb3AoKSk7CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIGludCBuYW1lT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCAmJiBzdXBlcnR5cGUgaXMgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIpIHsKICAgICAgc3VwZXJ0eXBlLnR5cGVWYXJpYWJsZXMgPSB0eXBlVmFyaWFibGVzOwogICAgfQogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBsaWJyYXJ5QnVpbGRlci5lbmROZXN0ZWREZWNsYXJhdGlvbigKICAgICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuY2xhc3NEZWNsYXJhdGlvbiwgIjxzeW50YXgtZXJyb3I+Iik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmaW5hbCBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICBtZXRhZGF0YSA9PSBudWxsID8gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0IDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKCiAgICBpZiAobGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCAmJgogICAgICAgIGxpYnJhcnlCdWlsZGVyLmxvYWRlci5wZXJmb3JtTm5iZENoZWNrcykgewogICAgICBTdHJpbmcgY2xhc3NOYW1lRm9yRXJyb3JzID0gIiR7bmFtZX0iOwogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGVGb3JFcnJvcnMgPSBzdXBlcnR5cGUgaXMgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIKICAgICAgICAgID8gc3VwZXJ0eXBlLnN1cGVydHlwZQogICAgICAgICAgOiBzdXBlcnR5cGU7CiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IG1peGlucyA9CiAgICAgICAgICBzdXBlcnR5cGUgaXMgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIgPyBzdXBlcnR5cGUubWl4aW5zIDogbnVsbDsKICAgICAgaWYgKHN1cGVydHlwZUZvckVycm9ycyAhPSBudWxsKSB7CiAgICAgICAgaWYgKHN1cGVydHlwZUZvckVycm9ycy5udWxsYWJpbGl0eUJ1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpID09CiAgICAgICAgICAgIE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgICAgICBpZiAobGlicmFyeUJ1aWxkZXIubG9hZGVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlU3VwZXJjbGFzc0Vycm9yCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoc3VwZXJ0eXBlRm9yRXJyb3JzLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgICAgICAgICBjbGFzc05hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgdXJpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmcKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGVGb3JFcnJvcnMuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgICAgICAgICB1cmkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobWl4aW5zICE9IG51bGwpIHsKICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIG1peGluIGluIG1peGlucykgewogICAgICAgICAgaWYgKG1peGluLm51bGxhYmlsaXR5QnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcikgPT0KICAgICAgICAgICAgICBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgICAgICAgICBpZiAobGlicmFyeUJ1aWxkZXIubG9hZGVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZU1peGluRXJyb3IKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG1peGluLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlTWl4aW5XYXJuaW5nCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhtaXhpbi5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgIHVyaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewogICAgICAgIGZvciAoVHlwZUJ1aWxkZXIgaW50ZXJmYWNlIGluIGludGVyZmFjZXMpIHsKICAgICAgICAgIGlmIChpbnRlcmZhY2UubnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKSA9PQogICAgICAgICAgICAgIE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgICAgICAgIGlmIChsaWJyYXJ5QnVpbGRlci5sb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlSW50ZXJmYWNlRXJyb3IKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZS5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgIHVyaSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZUludGVyZmFjZVdhcm5pbmcKICAgICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGludGVyZmFjZS5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgIHVyaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBsaWJyYXJ5QnVpbGRlci5hZGRDbGFzcygKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgbmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIHN1cGVydHlwZSwKICAgICAgICBpbnRlcmZhY2VzLAogICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICBuYW1lT2Zmc2V0LAogICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgc3VwZXJ0eXBlT2Zmc2V0KTsKCiAgICBsaWJyYXJ5QnVpbGRlci5zZXRDdXJyZW50Q2xhc3NOYW1lKG51bGwpOwogIH0KCiAgT2JqZWN0IG51bGxJZlBhcnNlclJlY292ZXJ5KE9iamVjdCBub2RlKSB7CiAgICByZXR1cm4gbm9kZSBpcyBQYXJzZXJSZWNvdmVyeSA/IG51bGwgOiBub2RlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRNaXhpbkRlY2xhcmF0aW9uIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChtaXhpblRva2VuKTsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGludGVyZmFjZXMgPSBwb3AoTnVsbFZhbHVlLlR5cGVCdWlsZGVyTGlzdCk7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBzdXBlcnR5cGVDb25zdHJhaW50cyA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcChOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBpbnQgbmFtZU9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcChOdWxsVmFsdWUuTWV0YWRhdGEpOwogICAgY2hlY2tFbXB0eShtaXhpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgbGlicmFyeUJ1aWxkZXIuZW5kTmVzdGVkRGVjbGFyYXRpb24oCiAgICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLm1peGluRGVjbGFyYXRpb24sICI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgc3RhcnRPZmZzZXQgPQogICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBtaXhpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgVHlwZUJ1aWxkZXIgc3VwZXJ0eXBlOwogICAgaWYgKHN1cGVydHlwZUNvbnN0cmFpbnRzICE9IG51bGwgJiYgc3VwZXJ0eXBlQ29uc3RyYWludHMuaXNOb3RFbXB0eSkgewogICAgICBpZiAoc3VwZXJ0eXBlQ29uc3RyYWludHMubGVuZ3RoID09IDEpIHsKICAgICAgICBzdXBlcnR5cGUgPSBzdXBlcnR5cGVDb25zdHJhaW50cy5maXJzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdXBlcnR5cGUgPSBuZXcgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIoCiAgICAgICAgICAgIHN1cGVydHlwZUNvbnN0cmFpbnRzLmZpcnN0LCBzdXBlcnR5cGVDb25zdHJhaW50cy5za2lwKDEpLnRvTGlzdCgpKTsKICAgICAgfQogICAgfQoKICAgIGlmIChsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmCiAgICAgICAgbGlicmFyeUJ1aWxkZXIubG9hZGVyLnBlcmZvcm1ObmJkQ2hlY2tzKSB7CiAgICAgIFN0cmluZyBjbGFzc05hbWVGb3JFcnJvcnMgPSAiJHtuYW1lfSI7CiAgICAgIGlmIChzdXBlcnR5cGVDb25zdHJhaW50cyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChUeXBlQnVpbGRlciBzdXBlcnR5cGUgaW4gc3VwZXJ0eXBlQ29uc3RyYWludHMpIHsKICAgICAgICAgIGlmIChzdXBlcnR5cGUubnVsbGFiaWxpdHlCdWlsZGVyLmJ1aWxkKGxpYnJhcnlCdWlsZGVyKSA9PQogICAgICAgICAgICAgIE51bGxhYmlsaXR5Lm51bGxhYmxlKSB7CiAgICAgICAgICAgIGlmIChsaWJyYXJ5QnVpbGRlci5sb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlU3VwZXJjbGFzc0Vycm9yCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgICBuYW1lT2Zmc2V0LAogICAgICAgICAgICAgICAgICBjbGFzc05hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgICB1cmkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVTdXBlcmNsYXNzV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoc3VwZXJ0eXBlLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CiAgICAgICAgZm9yIChUeXBlQnVpbGRlciBpbnRlcmZhY2UgaW4gaW50ZXJmYWNlcykgewogICAgICAgICAgaWYgKGludGVyZmFjZS5udWxsYWJpbGl0eUJ1aWxkZXIuYnVpbGQobGlicmFyeUJ1aWxkZXIpID09CiAgICAgICAgICAgICAgTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgICAgICAgaWYgKGxpYnJhcnlCdWlsZGVyLmxvYWRlci5ubmJkU3Ryb25nTW9kZSkgewogICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVJbnRlcmZhY2VFcnJvcgogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU51bGxhYmxlSW50ZXJmYWNlV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoaW50ZXJmYWNlLmZ1bGxOYW1lRm9yRXJyb3JzKSwKICAgICAgICAgICAgICAgICAgbmFtZU9mZnNldCwKICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgdXJpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGxpYnJhcnlCdWlsZGVyLmFkZE1peGluRGVjbGFyYXRpb24oCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbWl4aW5EZWNsYXJhdGlvbk1hc2ssCiAgICAgICAgbmFtZSwKICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgIHN1cGVydHlwZSwKICAgICAgICBpbnRlcmZhY2VzLAogICAgICAgIHN0YXJ0T2Zmc2V0LAogICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAtMSk7CiAgICBsaWJyYXJ5QnVpbGRlci5zZXRDdXJyZW50Q2xhc3NOYW1lKG51bGwpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uUHJlbHVkZShUb2tlbiBleHRlbnNpb25LZXl3b3JkKSB7CiAgICBhc3NlcnQoY2hlY2tTdGF0ZShleHRlbnNpb25LZXl3b3JkLCBbVmFsdWVLaW5kcy5NZXRhZGF0YUxpc3RPck51bGxdKSk7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uIik7CiAgICBsaWJyYXJ5QnVpbGRlci5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZXh0ZW5zaW9uRGVjbGFyYXRpb24sICJleHRlbnNpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbihUb2tlbiBleHRlbnNpb25LZXl3b3JkLCBUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKGV4dGVuc2lvbktleXdvcmQsCiAgICAgICAgW1ZhbHVlS2luZHMuVHlwZVZhcmlhYmxlTGlzdE9yTnVsbCwgVmFsdWVLaW5kcy5NZXRhZGF0YUxpc3RPck51bGxdKSk7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uIik7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIGludCBvZmZzZXQgPSBuYW1lVG9rZW4/LmNoYXJPZmZzZXQgPz8gZXh0ZW5zaW9uS2V5d29yZC5jaGFyT2Zmc2V0OwogICAgU3RyaW5nIG5hbWUgPSBuYW1lVG9rZW4/LmxleGVtZSA/PwogICAgICAgIC8vIFN5bnRoZXNpemVkIG5hbWUgdXNlZCBpbnRlcm5hbGx5LgogICAgICAgICdfZXh0ZW5zaW9uIyR7dW5uYW1lZEV4dGVuc2lvbkNvdW50ZXIrK30nOwogICAgcHVzaChuYW1lKTsKICAgIHB1c2gob2Zmc2V0KTsKICAgIHB1c2godHlwZVZhcmlhYmxlcyA/PyBOdWxsVmFsdWUuVHlwZVZhcmlhYmxlcyk7CiAgICBsaWJyYXJ5QnVpbGRlci5jdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlcgogICAgICAgIC5tYXJrQXNFeHRlbnNpb25EZWNsYXJhdGlvbihuYW1lLCBvZmZzZXQsIHR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHRlbnNpb25EZWNsYXJhdGlvbigKICAgICAgVG9rZW4gZXh0ZW5zaW9uS2V5d29yZCwgVG9rZW4gb25LZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUoZXh0ZW5zaW9uS2V5d29yZCwgWwogICAgICB1bmlvbk9mS2luZHMoW1ZhbHVlS2luZHMuUGFyc2VyUmVjb3ZlcnksIFZhbHVlS2luZHMuVHlwZUJ1aWxkZXJdKSwKICAgICAgVmFsdWVLaW5kcy5UeXBlVmFyaWFibGVMaXN0T3JOdWxsLAogICAgICBWYWx1ZUtpbmRzLkludGVnZXIsCiAgICAgIFZhbHVlS2luZHMuTmFtZU9yTnVsbCwKICAgICAgVmFsdWVLaW5kcy5NZXRhZGF0YUxpc3RPck51bGwKICAgIF0pKTsKICAgIGRlYnVnRXZlbnQoImVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChleHRlbnNpb25LZXl3b3JkKTsKICAgIE9iamVjdCBvblR5cGUgPSBwb3AoKTsKICAgIGlmIChvblR5cGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgb25UeXBlID0gbmV3IEZpeGVkVHlwZUJ1aWxkZXIoY29uc3QgSW52YWxpZFR5cGUoKSk7CiAgICB9CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogICAgaW50IG5hbWVPZmZzZXQgPSBwb3AoKTsKICAgIFN0cmluZyBuYW1lID0gcG9wKE51bGxWYWx1ZS5OYW1lKTsKICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgbmFtZU9mZnNldCA9IGV4dGVuc2lvbktleXdvcmQuY2hhck9mZnNldDsKICAgICAgbmFtZSA9ICckbmFtZU9mZnNldCc7CiAgICB9CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoTnVsbFZhbHVlLk1ldGFkYXRhKTsKICAgIGNoZWNrRW1wdHkoZXh0ZW5zaW9uS2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGludCBzdGFydE9mZnNldCA9IG1ldGFkYXRhID09IG51bGwKICAgICAgICA/IGV4dGVuc2lvbktleXdvcmQuY2hhck9mZnNldAogICAgICAgIDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKICAgIGxpYnJhcnlCdWlsZGVyLmFkZEV4dGVuc2lvbkRlY2xhcmF0aW9uKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFN1cHBvcnQgbW9kaWZpZXJzIG9uIGV4dGVuc2lvbnM/CiAgICAgICAgMCwKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgb25UeXBlLAogICAgICAgIHN0YXJ0T2Zmc2V0LAogICAgICAgIG5hbWVPZmZzZXQsCiAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBQcm9jZWR1cmVLaW5kIGNvbXB1dGVQcm9jZWR1cmVLaW5kKFRva2VuIHRva2VuKSB7CiAgICBpZiAodG9rZW4gPT0gbnVsbCkgcmV0dXJuIFByb2NlZHVyZUtpbmQuTWV0aG9kOwogICAgaWYgKG9wdGlvbmFsKCJnZXQiLCB0b2tlbikpIHJldHVybiBQcm9jZWR1cmVLaW5kLkdldHRlcjsKICAgIGlmIChvcHRpb25hbCgic2V0IiwgdG9rZW4pKSByZXR1cm4gUHJvY2VkdXJlS2luZC5TZXR0ZXI7CiAgICByZXR1cm4gdW5oYW5kbGVkKAogICAgICAgIHRva2VuLmxleGVtZSwgImNvbXB1dGVQcm9jZWR1cmVLaW5kIiwgdG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Ub3BMZXZlbE1ldGhvZChUb2tlbiBsYXN0Q29uc3VtZWQsIFRva2VuIGV4dGVybmFsVG9rZW4pIHsKICAgIGxpYnJhcnlCdWlsZGVyLmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oCiAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC50b3BMZXZlbE1ldGhvZCwgIiNtZXRob2QiLAogICAgICAgIGhhc01lbWJlcnM6IGZhbHNlKTsKICAgIHB1c2goZXh0ZXJuYWxUb2tlbiAhPSBudWxsID8gZXh0ZXJuYWxNYXNrIDogMCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRvcExldmVsTWV0aG9kKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGdldE9yU2V0LCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiZW5kVG9wTGV2ZWxNZXRob2QiKTsKICAgIE1ldGhvZEJvZHkga2luZCA9IHBvcCgpOwogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICBpbnQgZm9ybWFsc09mZnNldCA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIGJvb2wgaXNBYnN0cmFjdCA9IGtpbmQgPT0gTWV0aG9kQm9keS5BYnN0cmFjdDsKICAgIGlmIChnZXRPclNldCAhPSBudWxsICYmIG9wdGlvbmFsKCJzZXQiLCBnZXRPclNldCkpIHsKICAgICAgaWYgKGZvcm1hbHMgPT0gbnVsbCB8fCBmb3JtYWxzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgLy8gVGhpcyBpc24ndCBhYnN0cmFjdCBhcyB3ZSdsbCBhZGQgYW4gZXJyb3ItcmVjb3Zlcnkgbm9kZSBpbgogICAgICAgIC8vIFtCb2R5QnVpbGRlci5maW5pc2hGdW5jdGlvbl0uCiAgICAgICAgaXNBYnN0cmFjdCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBpZiAoaXNBYnN0cmFjdCkgewogICAgICBtb2RpZmllcnMgfD0gYWJzdHJhY3RNYXNrOwogICAgfQogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBtb2RpZmllcnMgfD0gZXh0ZXJuYWxNYXNrOwogICAgfQogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBsaWJyYXJ5QnVpbGRlcgogICAgICAgIC5lbmROZXN0ZWREZWNsYXJhdGlvbihUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLnRvcExldmVsTWV0aG9kLCAiI21ldGhvZCIpCiAgICAgICAgLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCBsaWJyYXJ5QnVpbGRlcik7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwogICAgZmluYWwgaW50IHN0YXJ0Q2hhck9mZnNldCA9CiAgICAgICAgbWV0YWRhdGEgPT0gbnVsbCA/IGJlZ2luVG9rZW4uY2hhck9mZnNldCA6IG1ldGFkYXRhLmZpcnN0LmNoYXJPZmZzZXQ7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2NlZHVyZSgKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBtb2RpZmllcnMsCiAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgZm9ybWFscywKICAgICAgICBjb21wdXRlUHJvY2VkdXJlS2luZChnZXRPclNldCksCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgZm9ybWFsc09mZnNldCwKICAgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAogICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgICAgaXNUb3BMZXZlbDogdHJ1ZSk7CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keSIpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE1ldGhvZEJvZHkuQWJzdHJhY3QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBpZiAoIWVuYWJsZU5hdGl2ZSkgewogICAgICBzdXBlci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAsIG5hdGl2ZVRva2VuLCBuYXRpdmVUb2tlbik7CiAgICB9CiAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Z1bmN0aW9uQm9keSIpOwogICAgaWYgKG5hdGl2ZU1ldGhvZE5hbWUgIT0gbnVsbCkgewogICAgICBwdXNoKE1ldGhvZEJvZHkuUmVndWxhcik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE1ldGhvZEJvZHkuQWJzdHJhY3QpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGdW5jdGlvbkJvZHlTa2lwcGVkKFRva2VuIHRva2VuLCBib29sIGlzRXhwcmVzc2lvbkJvZHkpIHsKICAgIGRlYnVnRXZlbnQoImhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWQiKTsKICAgIHB1c2goTWV0aG9kQm9keS5SZWd1bGFyKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRob2QoVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIFRva2VuIGdldE9yU2V0LCBUb2tlbiBuYW1lKSB7CiAgICBpbkNvbnN0cnVjdG9yID0KICAgICAgICBuYW1lPy5sZXhlbWUgPT0gbGlicmFyeUJ1aWxkZXIuY3VycmVudFR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIubmFtZSAmJgogICAgICAgICAgICBnZXRPclNldCA9PSBudWxsOwogICAgTGlzdDxNb2RpZmllcj4gbW9kaWZpZXJzOwogICAgaWYgKGV4dGVybmFsVG9rZW4gIT0gbnVsbCkgewogICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgbW9kaWZpZXJzLmFkZChFeHRlcm5hbCk7CiAgICB9CiAgICBpZiAoc3RhdGljVG9rZW4gIT0gbnVsbCkgewogICAgICBpZiAoIWluQ29uc3RydWN0b3IpIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKFN0YXRpYyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsKSB7CiAgICAgIG1vZGlmaWVycyA/Pz0gPE1vZGlmaWVyPltdOwogICAgICBtb2RpZmllcnMuYWRkKENvdmFyaWFudCk7CiAgICB9CiAgICBpZiAodmFyRmluYWxPckNvbnN0ICE9IG51bGwpIHsKICAgICAgU3RyaW5nIGxleGVtZSA9IHZhckZpbmFsT3JDb25zdC5sZXhlbWU7CiAgICAgIGlmIChpZGVudGljYWwoJ3ZhcicsIGxleGVtZSkpIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKFZhcik7CiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdmaW5hbCcsIGxleGVtZSkpIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKEZpbmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtb2RpZmllcnMgPz89IDxNb2RpZmllcj5bXTsKICAgICAgICBtb2RpZmllcnMuYWRkKENvbnN0KTsKICAgICAgfQogICAgfQogICAgcHVzaCh2YXJGaW5hbE9yQ29uc3Q/LmNoYXJPZmZzZXQgPz8gLTEpOwogICAgcHVzaChtb2RpZmllcnMgPz8gTnVsbFZhbHVlLk1vZGlmaWVycyk7CiAgICBsaWJyYXJ5QnVpbGRlci5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuc3RhdGljT3JJbnN0YW5jZU1ldGhvZE9yQ29uc3RydWN0b3IsICIjbWV0aG9kIiwKICAgICAgICBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGFzc2VydChjaGVja1N0YXRlKGJlZ2luVG9rZW4sIFtWYWx1ZUtpbmRzLk1ldGhvZEJvZHldKSk7CiAgICBkZWJ1Z0V2ZW50KCJNZXRob2QiKTsKICAgIE1ldGhvZEJvZHkgYm9keUtpbmQgPSBwb3AoKTsKICAgIGlmIChib2R5S2luZCA9PSBNZXRob2RCb2R5LlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkpIHsKICAgICAgLy8gVGhpcyB3aWxsIGNhdXNlIGFuIGVycm9yIGxhdGVyLgogICAgICBwb3AoKTsKICAgIH0KICAgIGFzc2VydChjaGVja1N0YXRlKGJlZ2luVG9rZW4sIFsKICAgICAgVmFsdWVLaW5kcy5Gb3JtYWxzT3JOdWxsLAogICAgICBWYWx1ZUtpbmRzLkludGVnZXIsIC8vIGZvcm1hbHMgb2Zmc2V0CiAgICAgIFZhbHVlS2luZHMuVHlwZVZhcmlhYmxlTGlzdE9yTnVsbCwKICAgICAgVmFsdWVLaW5kcy5JbnRlZ2VyLCAvLyBuYW1lIG9mZnNldAogICAgICB1bmlvbk9mS2luZHMoWwogICAgICAgIFZhbHVlS2luZHMuTmFtZSwKICAgICAgICBWYWx1ZUtpbmRzLlF1YWxpZmllZE5hbWUsCiAgICAgICAgVmFsdWVLaW5kcy5PcGVyYXRvciwKICAgICAgICBWYWx1ZUtpbmRzLlBhcnNlclJlY292ZXJ5LAogICAgICBdKSwKICAgICAgVmFsdWVLaW5kcy5UeXBlQnVpbGRlck9yTnVsbCwKICAgICAgVmFsdWVLaW5kcy5Nb2RpZmllcnNPck51bGwsCiAgICAgIFZhbHVlS2luZHMuSW50ZWdlciwgLy8gdmFyL2ZpbmFsL2NvbnN0IG9mZnNldAogICAgICBWYWx1ZUtpbmRzLk1ldGFkYXRhTGlzdE9yTnVsbCwKICAgIF0pKTsKICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgaW50IGZvcm1hbHNPZmZzZXQgPSBwb3AoKTsKICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVZhcmlhYmxlcyA9IHBvcCgpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lT3JPcGVyYXRvciA9IHBvcCgpOwogICAgaWYgKE9wZXJhdG9yLnN1YnRyYWN0ID09IG5hbWVPck9wZXJhdG9yICYmIGZvcm1hbHMgPT0gbnVsbCkgewogICAgICBuYW1lT3JPcGVyYXRvciA9IE9wZXJhdG9yLnVuYXJ5TWludXM7CiAgICB9CiAgICBPYmplY3QgbmFtZTsKICAgIFByb2NlZHVyZUtpbmQga2luZDsKICAgIGlmIChuYW1lT3JPcGVyYXRvciBpcyBPcGVyYXRvcikgewogICAgICBuYW1lID0gb3BlcmF0b3JUb1N0cmluZyhuYW1lT3JPcGVyYXRvcik7CiAgICAgIGtpbmQgPSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOwogICAgICBpbnQgcmVxdWlyZWRBcmd1bWVudENvdW50ID0gb3BlcmF0b3JSZXF1aXJlZEFyZ3VtZW50Q291bnQobmFtZU9yT3BlcmF0b3IpOwogICAgICBpZiAoKGZvcm1hbHM/Lmxlbmd0aCA/PyAwKSAhPSByZXF1aXJlZEFyZ3VtZW50Q291bnQpIHsKICAgICAgICBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFN0cmluZyBuYW1lKT4gdGVtcGxhdGU7CiAgICAgICAgc3dpdGNoIChyZXF1aXJlZEFyZ3VtZW50Q291bnQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIGlmIChPcGVyYXRvci5zdWJ0cmFjdCA9PSBuYW1lT3JPcGVyYXRvcikgewogICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGVPcGVyYXRvck1pbnVzUGFyYW1ldGVyTWlzbWF0Y2g7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gyOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB1bmhhbmRsZWQoIiRyZXF1aXJlZEFyZ3VtZW50Q291bnQiLCAib3BlcmF0b3JSZXF1aXJlZEFyZ3VtZW50Q291bnQiLAogICAgICAgICAgICAgICAgY2hhck9mZnNldCwgdXJpKTsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIHN0cmluZyA9IG5hbWU7CiAgICAgICAgYWRkUHJvYmxlbSh0ZW1wbGF0ZS53aXRoQXJndW1lbnRzKG5hbWUpLCBjaGFyT2Zmc2V0LCBzdHJpbmcubGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgICAgICAgaWYgKCFmb3JtYWwuaXNSZXF1aXJlZCkgewogICAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFscywgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGZvcm1hbC5uYW1lLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgIFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHlwZVZhcmlhYmxlQnVpbGRlciA9IHR5cGVWYXJpYWJsZXMuZmlyc3Q7CiAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlT3BlcmF0b3JXaXRoVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICAgIHR5cGVWYXJpYWJsZUJ1aWxkZXIuY2hhck9mZnNldCwgdHlwZVZhcmlhYmxlQnVpbGRlci5uYW1lLmxlbmd0aCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG5hbWUgPSBuYW1lT3JPcGVyYXRvcjsKICAgICAga2luZCA9IGNvbXB1dGVQcm9jZWR1cmVLaW5kKGdldE9yU2V0KTsKICAgIH0KICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBwb3AoKTsKICAgIGJvb2wgaXNBYnN0cmFjdCA9IGJvZHlLaW5kID09IE1ldGhvZEJvZHkuQWJzdHJhY3Q7CiAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgIGlmIChmb3JtYWxzID09IG51bGwgfHwgZm9ybWFscy5sZW5ndGggIT0gMSkgewogICAgICAgIC8vIFRoaXMgaXNuJ3QgYWJzdHJhY3QgYXMgd2UnbGwgYWRkIGFuIGVycm9yLXJlY292ZXJ5IG5vZGUgaW4KICAgICAgICAvLyBbQm9keUJ1aWxkZXIuZmluaXNoRnVuY3Rpb25dLgogICAgICAgIGlzQWJzdHJhY3QgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaW50IG1vZGlmaWVycyA9IE1vZGlmaWVyLnZhbGlkYXRlKHBvcCgpLCBpc0Fic3RyYWN0OiBpc0Fic3RyYWN0KTsKICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgbW9kaWZpZXJzIHw9IGV4dGVybmFsTWFzazsKICAgIH0KICAgIGlmICgobW9kaWZpZXJzICYgZXh0ZXJuYWxNYXNrKSAhPSAwKSB7CiAgICAgIG1vZGlmaWVycyAmPSB+YWJzdHJhY3RNYXNrOwogICAgfQogICAgYm9vbCBpc0NvbnN0ID0gKG1vZGlmaWVycyAmIGNvbnN0TWFzaykgIT0gMDsKICAgIGludCB2YXJGaW5hbE9yQ29uc3RPZmZzZXQgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CgogICAgVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciBkZWNsYXJhdGlvbkJ1aWxkZXIgPQogICAgICAgIGxpYnJhcnlCdWlsZGVyLmVuZE5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLnN0YXRpY09ySW5zdGFuY2VNZXRob2RPckNvbnN0cnVjdG9yLAogICAgICAgICAgICAiI21ldGhvZCIpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgICAgIGluQ29uc3RydWN0b3IgPSBmYWxzZTsKICAgICAgZGVjbGFyYXRpb25CdWlsZGVyLnJlc29sdmVUeXBlcyh0eXBlVmFyaWFibGVzLCBsaWJyYXJ5QnVpbGRlcik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBTdHJpbmcgY29uc3RydWN0b3JOYW1lID0ga2luZCA9PSBQcm9jZWR1cmVLaW5kLkdldHRlciB8fAogICAgICAgICAgICBraW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyCiAgICAgICAgPyBudWxsCiAgICAgICAgOiBsaWJyYXJ5QnVpbGRlci5jb21wdXRlQW5kVmFsaWRhdGVDb25zdHJ1Y3Rvck5hbWUobmFtZSwgY2hhck9mZnNldCk7CiAgICBpZiAoY29uc3RydWN0b3JOYW1lID09IG51bGwgJiYKICAgICAgICAobW9kaWZpZXJzICYgc3RhdGljTWFzaykgPT0gMCAmJgogICAgICAgIGxpYnJhcnlCdWlsZGVyLmN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLmtpbmQgPT0KICAgICAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5leHRlbnNpb25EZWNsYXJhdGlvbikgewogICAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGV4dGVuc2lvbiA9CiAgICAgICAgICBsaWJyYXJ5QnVpbGRlci5jdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlcjsKICAgICAgTWFwPFR5cGVWYXJpYWJsZUJ1aWxkZXIsIFR5cGVCdWlsZGVyPiBzdWJzdGl0dXRpb247CiAgICAgIGlmIChleHRlbnNpb24udHlwZVZhcmlhYmxlcyAhPSBudWxsKSB7CiAgICAgICAgLy8gV2Ugc3ludGhlc2l6ZSB0aGUgbmFtZXMgb2YgdGhlIGdlbmVyYXRlZCBbVHlwZVBhcmFtZXRlcl1zLCBpLmUuCiAgICAgICAgLy8gcmVuYW1lICdUJyB0byAnI1QnLiBXZSBjYW5ub3QgZG8gaXQgb24gdGhlIGJ1aWxkZXJzIGJlY2F1c2UgdGhlaXIKICAgICAgICAvLyBuYW1lcyBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIHNjb3BlLgogICAgICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gc3ludGhlc2l6ZWRUeXBlVmFyaWFibGVzID0gbGlicmFyeUJ1aWxkZXIKICAgICAgICAgICAgLmNvcHlUeXBlVmFyaWFibGVzKGV4dGVuc2lvbi50eXBlVmFyaWFibGVzLCBkZWNsYXJhdGlvbkJ1aWxkZXIsCiAgICAgICAgICAgICAgICBpc0V4dGVuc2lvblR5cGVQYXJhbWV0ZXI6IHRydWUpOwogICAgICAgIHN1YnN0aXR1dGlvbiA9IHt9OwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ludGhlc2l6ZWRUeXBlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdWJzdGl0dXRpb25bZXh0ZW5zaW9uLnR5cGVWYXJpYWJsZXNbaV1dID0KICAgICAgICAgICAgICBuZXcgTmFtZWRUeXBlQnVpbGRlci5mcm9tVHlwZURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgICAgICAgICAgICAgc3ludGhlc2l6ZWRUeXBlVmFyaWFibGVzW2ldLAogICAgICAgICAgICAgICAgICBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVWYXJpYWJsZXMgIT0gbnVsbCkgewogICAgICAgICAgdHlwZVZhcmlhYmxlcyA9IHN5bnRoZXNpemVkVHlwZVZhcmlhYmxlcy4uYWRkQWxsKHR5cGVWYXJpYWJsZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eXBlVmFyaWFibGVzID0gc3ludGhlc2l6ZWRUeXBlVmFyaWFibGVzOwogICAgICAgIH0KICAgICAgfQogICAgICBMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+IHN5bnRoZXNpemVkRm9ybWFscyA9IFtdOwogICAgICBUeXBlQnVpbGRlciB0aGlzVHlwZSA9IGV4dGVuc2lvbi5leHRlbnNpb25UaGlzVHlwZTsKICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPSBudWxsKSB7CiAgICAgICAgTGlzdDxUeXBlQnVpbGRlcj4gdW5ib3VuZFR5cGVzID0gW107CiAgICAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB1bmJvdW5kVHlwZVZhcmlhYmxlcyA9IFtdOwogICAgICAgIHRoaXNUeXBlID0gc3Vic3RpdHV0ZSh0aGlzVHlwZSwgc3Vic3RpdHV0aW9uLAogICAgICAgICAgICB1bmJvdW5kVHlwZXM6IHVuYm91bmRUeXBlcywKICAgICAgICAgICAgdW5ib3VuZFR5cGVWYXJpYWJsZXM6IHVuYm91bmRUeXBlVmFyaWFibGVzKTsKICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIHVuYm91bmRUeXBlIGluIHVuYm91bmRUeXBlcykgewogICAgICAgICAgZXh0ZW5zaW9uLmFkZFR5cGUobmV3IFVucmVzb2x2ZWRUeXBlKHVuYm91bmRUeXBlLCAtMSwgbnVsbCkpOwogICAgICAgIH0KICAgICAgICBsaWJyYXJ5QnVpbGRlci5ib3VuZGxlc3NUeXBlVmFyaWFibGVzLmFkZEFsbCh1bmJvdW5kVHlwZVZhcmlhYmxlcyk7CiAgICAgIH0KICAgICAgc3ludGhlc2l6ZWRGb3JtYWxzLmFkZChuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICAgIG51bGwsIGZpbmFsTWFzaywgdGhpc1R5cGUsICIjdGhpcyIsIG51bGwsIGNoYXJPZmZzZXQsIHVyaSkpOwogICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgc3ludGhlc2l6ZWRGb3JtYWxzLmFkZEFsbChmb3JtYWxzKTsKICAgICAgfQogICAgICBmb3JtYWxzID0gc3ludGhlc2l6ZWRGb3JtYWxzOwogICAgfQoKICAgIGRlY2xhcmF0aW9uQnVpbGRlci5yZXNvbHZlVHlwZXModHlwZVZhcmlhYmxlcywgbGlicmFyeUJ1aWxkZXIpOwogICAgaWYgKGNvbnN0cnVjdG9yTmFtZSAhPSBudWxsKSB7CiAgICAgIGlmIChpc0NvbnN0ICYmIGJvZHlLaW5kICE9IE1ldGhvZEJvZHkuQWJzdHJhY3QpIHsKICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aEJvZHksIHZhckZpbmFsT3JDb25zdE9mZnNldCwgNSk7CiAgICAgICAgbW9kaWZpZXJzICY9IH5jb25zdE1hc2s7CiAgICAgIH0KICAgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgewogICAgICAgIC8vIFRPRE8oZGFucnViZWwpOiBSZXBvcnQgdGhpcyBlcnJvciBvbiB0aGUgcmV0dXJuIHR5cGUKICAgICAgICBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICBtZXNzYWdlQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZSwgYmVnaW5Ub2tlbiwgYmVnaW5Ub2tlbik7CiAgICAgICAgcmV0dXJuVHlwZSA9IG51bGw7CiAgICAgIH0KICAgICAgZmluYWwgaW50IHN0YXJ0Q2hhck9mZnNldCA9CiAgICAgICAgICBtZXRhZGF0YSA9PSBudWxsID8gYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0IDogbWV0YWRhdGEuZmlyc3QuY2hhck9mZnNldDsKICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkQ29uc3RydWN0b3IoCiAgICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBjb25zdHJ1Y3Rvck5hbWUsCiAgICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIHN0YXJ0Q2hhck9mZnNldCwKICAgICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgICBmb3JtYWxzT2Zmc2V0LAogICAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUsCiAgICAgICAgICBiZWdpbkluaXRpYWxpemVyczogYmVnaW5Jbml0aWFsaXplcnMpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGlzQ29uc3QpIHsKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcwogICAgICAgIC8vIGJlY2F1c2UgaXQgaXMgYW4gZXJyb3IgdG8gaGF2ZSBhIGNvbnN0IG1ldGhvZC4KICAgICAgICBtb2RpZmllcnMgJj0gfmNvbnN0TWFzazsKICAgICAgfQogICAgICBmaW5hbCBpbnQgc3RhcnRDaGFyT2Zmc2V0ID0KICAgICAgICAgIG1ldGFkYXRhID09IG51bGwgPyBiZWdpblRva2VuLmNoYXJPZmZzZXQgOiBtZXRhZGF0YS5maXJzdC5jaGFyT2Zmc2V0OwogICAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9jZWR1cmUoCiAgICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgbW9kaWZpZXJzLAogICAgICAgICAgcmV0dXJuVHlwZSwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICB0eXBlVmFyaWFibGVzLAogICAgICAgICAgZm9ybWFscywKICAgICAgICAgIGtpbmQsCiAgICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgZm9ybWFsc09mZnNldCwKICAgICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lLAogICAgICAgICAgaXNUb3BMZXZlbDogZmFsc2UpOwogICAgfQogICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgICBpbkNvbnN0cnVjdG9yID0gZmFsc2U7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIk5hbWVkTWl4aW5BcHBsaWNhdGlvbldpdGhDbGF1c2UiKTsKICAgIE9iamVjdCBtaXhpbnMgPSBwb3AoKTsKICAgIE9iamVjdCBzdXBlcnR5cGUgPSBwb3AoKTsKICAgIGlmIChtaXhpbnMgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChtaXhpbnMpOwogICAgfSBlbHNlIGlmIChzdXBlcnR5cGUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChzdXBlcnR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5QnVpbGRlci5hZGRNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgICAgc3VwZXJ0eXBlLCBtaXhpbnMsIHdpdGhLZXl3b3JkLmNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGNsYXNzS2V5d29yZCwKICAgICAgVG9rZW4gZXF1YWxzLCBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbiIpOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBMaXN0PFR5cGVCdWlsZGVyPiBpbnRlcmZhY2VzID0gcG9wSWZOb3ROdWxsKGltcGxlbWVudHNLZXl3b3JkKTsKICAgIE9iamVjdCBtaXhpbkFwcGxpY2F0aW9uID0gcG9wKCk7CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSB8fCBtaXhpbkFwcGxpY2F0aW9uIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIGxpYnJhcnlCdWlsZGVyLmVuZE5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5uYW1lZE1peGluQXBwbGljYXRpb24sICI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKICAgICAgICBsaWJyYXJ5QnVpbGRlci5sb2FkZXIucGVyZm9ybU5uYmRDaGVja3MpIHsKICAgICAgU3RyaW5nIGNsYXNzTmFtZUZvckVycm9ycyA9ICIke25hbWV9IjsKICAgICAgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIgbWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIgPSBtaXhpbkFwcGxpY2F0aW9uOwogICAgICBUeXBlQnVpbGRlciBzdXBlcnR5cGUgPSBtaXhpbkFwcGxpY2F0aW9uQnVpbGRlci5zdXBlcnR5cGU7CiAgICAgIExpc3Q8VHlwZUJ1aWxkZXI+IG1peGlucyA9IG1peGluQXBwbGljYXRpb25CdWlsZGVyLm1peGluczsKICAgICAgaWYgKHN1cGVydHlwZSAhPSBudWxsICYmIHN1cGVydHlwZSBpcyEgTWl4aW5BcHBsaWNhdGlvbkJ1aWxkZXIpIHsKICAgICAgICBpZiAoc3VwZXJ0eXBlLm51bGxhYmlsaXR5QnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcikgPT0KICAgICAgICAgICAgTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgICAgIGlmIChsaWJyYXJ5QnVpbGRlci5sb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVTdXBlcmNsYXNzRXJyb3IKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhzdXBlcnR5cGUuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgICAgICAgICB1cmkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVTdXBlcmNsYXNzV2FybmluZwogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKHN1cGVydHlwZS5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgY2xhc3NOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICAgICAgICAgIHVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoVHlwZUJ1aWxkZXIgbWl4aW4gaW4gbWl4aW5zKSB7CiAgICAgICAgaWYgKG1peGluLm51bGxhYmlsaXR5QnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcikgPT0KICAgICAgICAgICAgTnVsbGFiaWxpdHkubnVsbGFibGUpIHsKICAgICAgICAgIGlmIChsaWJyYXJ5QnVpbGRlci5sb2FkZXIubm5iZFN0cm9uZ01vZGUpIHsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVNaXhpbkVycm9yCiAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobWl4aW4uZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZvckVycm9ycy5sZW5ndGgsCiAgICAgICAgICAgICAgICB1cmkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVNaXhpbldhcm5pbmcKICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhtaXhpbi5mdWxsTmFtZUZvckVycm9ycyksCiAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgY2xhc3NOYW1lRm9yRXJyb3JzLmxlbmd0aCwKICAgICAgICAgICAgICAgIHVyaSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKICAgICAgICBmb3IgKFR5cGVCdWlsZGVyIGludGVyZmFjZSBpbiBpbnRlcmZhY2VzKSB7CiAgICAgICAgICBpZiAoaW50ZXJmYWNlLm51bGxhYmlsaXR5QnVpbGRlci5idWlsZChsaWJyYXJ5QnVpbGRlcikgPT0KICAgICAgICAgICAgICBOdWxsYWJpbGl0eS5udWxsYWJsZSkgewogICAgICAgICAgICBpZiAobGlicmFyeUJ1aWxkZXIubG9hZGVyLm5uYmRTdHJvbmdNb2RlKSB7CiAgICAgICAgICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUHJvYmxlbSgKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOdWxsYWJsZUludGVyZmFjZUVycm9yCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2UuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBjbGFzc05hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgICB1cmkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpYnJhcnlCdWlsZGVyLmFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5nCiAgICAgICAgICAgICAgICAgICAgICAud2l0aEFyZ3VtZW50cyhpbnRlcmZhY2UuZnVsbE5hbWVGb3JFcnJvcnMpLAogICAgICAgICAgICAgICAgICBjaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBjbGFzc05hbWVGb3JFcnJvcnMubGVuZ3RoLAogICAgICAgICAgICAgICAgICB1cmkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaW50IHN0YXJ0Q2hhck9mZnNldCA9IGJlZ2luVG9rZW4uY2hhck9mZnNldDsKICAgIGludCBjaGFyRW5kT2Zmc2V0ID0gZW5kVG9rZW4uY2hhck9mZnNldDsKICAgIGxpYnJhcnlCdWlsZGVyLmFkZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICBkb2N1bWVudGF0aW9uQ29tbWVudCwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIG1peGluQXBwbGljYXRpb24sCiAgICAgICAgaW50ZXJmYWNlcywKICAgICAgICBzdGFydENoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBjaGFyRW5kT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZUFyZ3VtZW50cyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlQXJndW1lbnRzIik7CiAgICBwdXNoKGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PFR5cGVCdWlsZGVyPigpLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLlR5cGVBcmd1bWVudHMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZFR5cGVBcmd1bWVudHMiKTsKICAgIHBvcChOdWxsVmFsdWUuVHlwZUFyZ3VtZW50cyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVNjcmlwdChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiU2NyaXB0Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKFRva2VuIGJhbmcpIHsKICAgIGlmICghbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXBvcnROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbk5vdEVuYWJsZWQoYmFuZyk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVR5cGUoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBkZWJ1Z0V2ZW50KCJUeXBlIik7CiAgICBpZiAoIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShxdWVzdGlvbk1hcmspOwogICAgfQogICAgYm9vbCBpc01hcmtlZEFzTnVsbGFibGUgPSBxdWVzdGlvbk1hcmsgIT0gbnVsbDsKICAgIExpc3Q8VHlwZUJ1aWxkZXI+IGFyZ3VtZW50cyA9IHBvcCgpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5QnVpbGRlci5hZGROYW1lZFR5cGUoCiAgICAgICAgICBuYW1lLAogICAgICAgICAgbGlicmFyeUJ1aWxkZXIubnVsbGFibGVCdWlsZGVySWZUcnVlKGlzTWFya2VkQXNOdWxsYWJsZSksCiAgICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgICBjaGFyT2Zmc2V0KSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiVHlwZUxpc3QiKTsKICAgIHB1c2goY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8TmFtZWRUeXBlQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIGNvdW50KSA/PwogICAgICAgIG5ldyBQYXJzZXJSZWNvdmVyeSgtMSkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGVWYXJpYWJsZXMoVG9rZW4gdG9rZW4pIHsKICAgIHN1cGVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyh0b2tlbik7CiAgICBpbkNvbnN0cnVjdG9yTmFtZSA9IGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiVm9pZEtleXdvcmQiKTsKICAgIHB1c2gobGlicmFyeUJ1aWxkZXIuYWRkVm9pZFR5cGUodG9rZW4uY2hhck9mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiByZXF1aXJlZFRva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBpZiAocmVxdWlyZWRUb2tlbiAhPSBudWxsICYmICFsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJlcG9ydE5vbk51bGxhYmxlTW9kaWZpZXJFcnJvcihyZXF1aXJlZFRva2VuKTsKICAgIH0KICAgIHB1c2goKGNvdmFyaWFudFRva2VuICE9IG51bGwgPyBjb3ZhcmlhbnRNYXNrIDogMCkgfAogICAgICAgIChyZXF1aXJlZFRva2VuICE9IG51bGwgPyByZXF1aXJlZE1hc2sgOiAwKSB8CiAgICAgICAgTW9kaWZpZXIudmFsaWRhdGVWYXJGaW5hbE9yQ29uc3QodmFyRmluYWxPckNvbnN0Py5sZXhlbWUpKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyKAogICAgICBUb2tlbiB0aGlzS2V5d29yZCwKICAgICAgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIGluaXRpYWxpemVyU3RhcnQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyRW5kLAogICAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQsCiAgICAgIE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVyIik7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBudWxsSWZQYXJzZXJSZWNvdmVyeShwb3AoKSk7CiAgICBpbnQgbW9kaWZpZXJzID0gcG9wKCk7CiAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIHB1c2gobmFtZSk7CiAgICB9IGVsc2UgewogICAgICBwdXNoKGxpYnJhcnlCdWlsZGVyLmFkZEZvcm1hbFBhcmFtZXRlcihtZXRhZGF0YSwgbW9kaWZpZXJzLCB0eXBlLCBuYW1lLAogICAgICAgICAgdGhpc0tleXdvcmQgIT0gbnVsbCwgY2hhck9mZnNldCwgaW5pdGlhbGl6ZXJTdGFydCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICAvLyBJZ25vcmVkIGZvciBub3cuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uIik7CiAgICAvLyBJZ25vcmVkIGZvciBub3cuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBlcXVhbHMsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJWYWx1ZWRGb3JtYWxQYXJhbWV0ZXIiKTsKICAgIC8vIElnbm9yZWQgZm9yIG5vdy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGb3JtYWxQYXJhbWV0ZXJXaXRob3V0VmFsdWUiKTsKICAgIC8vIElnbm9yZWQgZm9yIG5vdy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJPcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMiKTsKICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCA9IG9wdGlvbmFsKCJ7IiwgYmVnaW5Ub2tlbikKICAgICAgICA/IEZvcm1hbFBhcmFtZXRlcktpbmQub3B0aW9uYWxOYW1lZAogICAgICAgIDogRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWw7CiAgICAvLyBXaGVuIHJlY292ZXJpbmcgZnJvbSBhbiBlbXB0eSBsaXN0IG9mIG9wdGlvbmFsIGFyZ3VtZW50cywgY291bnQgbWF5IGJlCiAgICAvLyAwLiBJdCBtaWdodCBiZSBzaW1wbGVyIGlmIHRoZSBwYXJzZXIgZGlkbid0IGNhbGwgdGhpcyBtZXRob2QgaW4gdGhhdAogICAgLy8gY2FzZSwgaG93ZXZlciwgdGhlbiBbYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnNdIHdvdWxkbid0IGFsd2F5cyBiZQogICAgLy8gbWF0Y2hlZCBieSB0aGlzIG1ldGhvZC4KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gcGFyYW1ldGVycyA9CiAgICAgICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkob2Zmc2V0Rm9yVG9rZW4oYmVnaW5Ub2tlbikpKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewogICAgICAgIHBhcmFtZXRlci5raW5kID0ga2luZDsKICAgICAgfQogICAgICBwdXNoKHBhcmFtZXRlcnMpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGRlYnVnRXZlbnQoIkZvcm1hbFBhcmFtZXRlcnMiKTsKICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFsczsKICAgIGlmIChjb3VudCA9PSAxKSB7CiAgICAgIE9iamVjdCBsYXN0ID0gcG9wKCk7CiAgICAgIGlmIChsYXN0IGlzIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4pIHsKICAgICAgICBmb3JtYWxzID0gbGFzdDsKICAgICAgfSBlbHNlIGlmIChsYXN0IGlzISBQYXJzZXJSZWNvdmVyeSkgewogICAgICAgIGFzc2VydChsYXN0ICE9IG51bGwpOwogICAgICAgIGZvcm1hbHMgPSBuZXcgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPigxKTsKICAgICAgICBmb3JtYWxzWzBdID0gbGFzdDsKICAgICAgfQogICAgfSBlbHNlIGlmIChjb3VudCA+IDEpIHsKICAgICAgT2JqZWN0IGxhc3QgPSBwb3AoKTsKICAgICAgY291bnQtLTsKICAgICAgaWYgKGxhc3QgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBkaXNjYXJkKGNvdW50KTsKICAgICAgfSBlbHNlIGlmIChsYXN0IGlzIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4pIHsKICAgICAgICBmb3JtYWxzID0gY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oKQogICAgICAgICAgICAucG9wUGFkZGVkKHN0YWNrLCBjb3VudCwgbGFzdC5sZW5ndGgpOwogICAgICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgIGZvcm1hbHMuc2V0UmFuZ2UoY291bnQsIGZvcm1hbHMubGVuZ3RoLCBsYXN0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9ybWFscyA9IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PEZvcm1hbFBhcmFtZXRlckJ1aWxkZXI+KCkKICAgICAgICAgICAgLnBvcFBhZGRlZChzdGFjaywgY291bnQsIDEpOwogICAgICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgICAgIGZvcm1hbHNbY291bnRdID0gbGFzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3JtYWxzICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KGZvcm1hbHMuaXNOb3RFbXB0eSk7CiAgICAgIGlmIChmb3JtYWxzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgLy8gVGhlIG5hbWUgbWF5IGJlIG51bGwgZm9yIGdlbmVyYWxpemVkIGZ1bmN0aW9uIHR5cGVzLgogICAgICAgIGlmIChmb3JtYWxzWzBdLm5hbWUgIT0gbnVsbCAmJiBmb3JtYWxzWzBdLm5hbWUgPT0gZm9ybWFsc1sxXS5uYW1lKSB7CiAgICAgICAgICBhZGRQcm9ibGVtKAogICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWUud2l0aEFyZ3VtZW50cyhmb3JtYWxzWzFdLm5hbWUpLAogICAgICAgICAgICAgIGZvcm1hbHNbMV0uY2hhck9mZnNldCwKICAgICAgICAgICAgICBmb3JtYWxzWzFdLm5hbWUubGVuZ3RoLAogICAgICAgICAgICAgIGNvbnRleHQ6IFsKICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZQogICAgICAgICAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKGZvcm1hbHNbMV0ubmFtZSkKICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICB1cmksIGZvcm1hbHNbMF0uY2hhck9mZnNldCwgZm9ybWFsc1swXS5uYW1lLmxlbmd0aCkKICAgICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZm9ybWFscy5sZW5ndGggPiAyKSB7CiAgICAgICAgTWFwPFN0cmluZywgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gc2Vlbk5hbWVzID0KICAgICAgICAgICAgPFN0cmluZywgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcj57fTsKICAgICAgICBmb3IgKEZvcm1hbFBhcmFtZXRlckJ1aWxkZXIgZm9ybWFsIGluIGZvcm1hbHMpIHsKICAgICAgICAgIGlmIChmb3JtYWwubmFtZSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIGlmIChzZWVuTmFtZXMuY29udGFpbnNLZXkoZm9ybWFsLm5hbWUpKSB7CiAgICAgICAgICAgIGFkZFByb2JsZW0oCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUR1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lLndpdGhBcmd1bWVudHMoZm9ybWFsLm5hbWUpLAogICAgICAgICAgICAgICAgZm9ybWFsLmNoYXJPZmZzZXQsCiAgICAgICAgICAgICAgICBmb3JtYWwubmFtZS5sZW5ndGgsCiAgICAgICAgICAgICAgICBjb250ZXh0OiBbCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZQogICAgICAgICAgICAgICAgICAgICAgLndpdGhBcmd1bWVudHMoZm9ybWFsLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAud2l0aExvY2F0aW9uKHVyaSwgc2Vlbk5hbWVzW2Zvcm1hbC5uYW1lXS5jaGFyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5OYW1lc1tmb3JtYWwubmFtZV0ubmFtZS5sZW5ndGgpCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlZW5OYW1lc1tmb3JtYWwubmFtZV0gPSBmb3JtYWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBwdXNoKGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBwdXNoKGZvcm1hbHMgPz8gTnVsbFZhbHVlLkZvcm1hbFBhcmFtZXRlcnMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgcHVzaCh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgIHN1cGVyLmhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyh0b2tlbiwga2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEFzc2VydChUb2tlbiBhc3NlcnRLZXl3b3JkLCBBc3NlcnQga2luZCwgVG9rZW4gbGVmdFBhcmVudGhlc2lzLAogICAgICBUb2tlbiBjb21tYVRva2VuLCBUb2tlbiBzZW1pY29sb25Ub2tlbikgewogICAgZGVidWdFdmVudCgiQXNzZXJ0Iik7CiAgICAvLyBEbyBub3RoaW5nCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEVudW0oVG9rZW4gZW51bUtleXdvcmQsIFRva2VuIGxlZnRCcmFjZSwgaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJFbnVtIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChlbnVtS2V5d29yZCk7CiAgICBMaXN0PEVudW1Db25zdGFudEluZm8+IGVudW1Db25zdGFudEluZm9zID0KICAgICAgICBjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxFbnVtQ29uc3RhbnRJbmZvPigpLnBvcChzdGFjaywgY291bnQpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsgLy8gaWRlbnRpZmllciBjaGFyIG9mZnNldC4KICAgIGludCBzdGFydENoYXJPZmZzZXQgPSBlbnVtS2V5d29yZC5jaGFyT2Zmc2V0OwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShlbnVtS2V5d29yZC5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSByZXR1cm47CiAgICBsaWJyYXJ5QnVpbGRlci5hZGRFbnVtKAogICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIG5hbWUsCiAgICAgICAgZW51bUNvbnN0YW50SW5mb3MsCiAgICAgICAgc3RhcnRDaGFyT2Zmc2V0LAogICAgICAgIGNoYXJPZmZzZXQsCiAgICAgICAgbGVmdEJyYWNlPy5lbmRHcm91cD8uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlQWxpYXMoVG9rZW4gdG9rZW4pIHsKICAgIGxpYnJhcnlCdWlsZGVyLmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oCiAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC50eXBlZGVmLCAiI3R5cGVkZWYiLAogICAgICAgIGhhc01lbWJlcnM6IGZhbHNlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGUoVG9rZW4gYmVnaW5Ub2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5GdW5jdGlvblR5cGUiKTsKICAgIGxpYnJhcnlCdWlsZGVyLmJlZ2luTmVzdGVkRGVjbGFyYXRpb24oCiAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5mdW5jdGlvblR5cGUsICIjZnVuY3Rpb25fdHlwZSIsCiAgICAgICAgaGFzTWVtYmVyczogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgbGlicmFyeUJ1aWxkZXIuYmVnaW5OZXN0ZWREZWNsYXJhdGlvbigKICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmZ1bmN0aW9uVHlwZSwgIiNmdW5jdGlvbl90eXBlIiwKICAgICAgICBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZShUb2tlbiBmdW5jdGlvblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGRlYnVnRXZlbnQoIkZ1bmN0aW9uVHlwZSIpOwogICAgaWYgKCFsaWJyYXJ5QnVpbGRlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgIHJlcG9ydEVycm9ySWZOdWxsYWJsZVR5cGUocXVlc3Rpb25NYXJrKTsKICAgIH0KICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgcG9wKCk7IC8vIGZvcm1hbHMgb2Zmc2V0CiAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgIHB1c2gobGlicmFyeUJ1aWxkZXIuYWRkRnVuY3Rpb25UeXBlKAogICAgICAgIHJldHVyblR5cGUsCiAgICAgICAgdHlwZVZhcmlhYmxlcywKICAgICAgICBmb3JtYWxzLAogICAgICAgIGxpYnJhcnlCdWlsZGVyLm51bGxhYmxlQnVpbGRlcklmVHJ1ZShxdWVzdGlvbk1hcmsgIT0gbnVsbCksCiAgICAgICAgZnVuY3Rpb25Ub2tlbi5jaGFyT2Zmc2V0KSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXIoVG9rZW4gbmFtZVRva2VuLCBUb2tlbiBxdWVzdGlvbikgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciIpOwogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICBpbnQgZm9ybWFsc09mZnNldCA9IHBvcCgpOwogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IHBvcCgpOwogICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICBpZiAoIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmVwb3J0RXJyb3JJZk51bGxhYmxlVHlwZShxdWVzdGlvbik7CiAgICB9CiAgICBwdXNoKGxpYnJhcnlCdWlsZGVyLmFkZEZ1bmN0aW9uVHlwZShyZXR1cm5UeXBlLCB0eXBlVmFyaWFibGVzLCBmb3JtYWxzLAogICAgICAgIGxpYnJhcnlCdWlsZGVyLm51bGxhYmxlQnVpbGRlcklmVHJ1ZShxdWVzdGlvbiAhPSBudWxsKSwgZm9ybWFsc09mZnNldCkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVBbGlhcygKICAgICAgVG9rZW4gdHlwZWRlZktleXdvcmQsIFRva2VuIGVxdWFscywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZEZ1bmN0aW9uVHlwZUFsaWFzIik7CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudCh0eXBlZGVmS2V5d29yZCk7CiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXM7CiAgICBPYmplY3QgbmFtZTsKICAgIGludCBjaGFyT2Zmc2V0OwogICAgVHlwZUJ1aWxkZXIgYWxpYXNlZFR5cGU7CiAgICBpZiAoZXF1YWxzID09IG51bGwpIHsKICAgICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICAgIHBvcCgpOyAvLyBmb3JtYWxzIG9mZnNldAogICAgICB0eXBlVmFyaWFibGVzID0gcG9wKCk7CiAgICAgIGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgICAgbmFtZSA9IHBvcCgpOwogICAgICBUeXBlQnVpbGRlciByZXR1cm5UeXBlID0gcG9wKCk7CiAgICAgIC8vIENyZWF0ZSBhIG5lc3RlZCBkZWNsYXJhdGlvbiB0aGF0IGlzIGVuZGVkIGJlbG93IGJ5CiAgICAgIC8vIGBsaWJyYXJ5LmFkZEZ1bmN0aW9uVHlwZWAuCiAgICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcG9wKCk7IC8vIE1ldGFkYXRhLgogICAgICAgIGxpYnJhcnlCdWlsZGVyLmVuZE5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLnR5cGVkZWYsICI8c3ludGF4LWVycm9yPiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsaWJyYXJ5QnVpbGRlci5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgICAgVHlwZVBhcmFtZXRlclNjb3BlS2luZC5mdW5jdGlvblR5cGUsICIjZnVuY3Rpb25fdHlwZSIsCiAgICAgICAgICBoYXNNZW1iZXJzOiBmYWxzZSk7CiAgICAgIC8vIFRPRE8oZG1pdHJ5YXMpOiBNYWtlIHN1cmUgdGhhdCBSSFMgb2YgdHlwZWRlZnMgY2FuJ3QgaGF2ZSAnPycuCiAgICAgIGFsaWFzZWRUeXBlID0gbGlicmFyeUJ1aWxkZXIuYWRkRnVuY3Rpb25UeXBlKHJldHVyblR5cGUsIG51bGwsIGZvcm1hbHMsCiAgICAgICAgICBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLCBjaGFyT2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIE9iamVjdCB0eXBlID0gcG9wKCk7CiAgICAgIHR5cGVWYXJpYWJsZXMgPSBwb3AoKTsKICAgICAgY2hhck9mZnNldCA9IHBvcCgpOwogICAgICBuYW1lID0gcG9wKCk7CiAgICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgICAgcG9wKCk7IC8vIE1ldGFkYXRhLgogICAgICAgIGxpYnJhcnlCdWlsZGVyLmVuZE5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmZ1bmN0aW9uVHlwZSwgIjxzeW50YXgtZXJyb3I+Iik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZUJ1aWxkZXIpIHsKICAgICAgICAvLyBUT0RPKGFoZSk6IFdlIG5lZWQgdG8gc3RhcnQgYSBuZXN0ZWQgZGVjbGFyYXRpb24gd2hlbiBwYXJzaW5nIHRoZQogICAgICAgIC8vIGZvcm1hbHMgYW5kIHJldHVybiB0eXBlIHNvIHdlIGNhbiBjb3JyZWN0bHkgYmluZAogICAgICAgIC8vIGB0eXBlLnR5cGVWYXJpYWJsZXNgLiBBIHR5cGVkZWYgY2FuIGhhdmUgdHlwZSB2YXJpYWJsZXMsIGFuZCBhIG5ldwogICAgICAgIC8vIGZ1bmN0aW9uIHR5cGUgY2FuIGFsc28gaGF2ZSB0eXBlIHZhcmlhYmxlcyAocmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mCiAgICAgICAgLy8gYSBnZW5lcmljIGZ1bmN0aW9uKS4KICAgICAgICBhbGlhc2VkVHlwZSA9IHR5cGU7CiAgICAgIH0gZWxzZSBpZiAobGlicmFyeUJ1aWxkZXIubG9hZGVyLnRhcmdldC5lbmFibGVOb25mdW5jdGlvblR5cGVBbGlhc2VzKSB7CiAgICAgICAgaWYgKHR5cGUgaXMgVHlwZUJ1aWxkZXIpIHsKICAgICAgICAgIGFsaWFzZWRUeXBlID0gdHlwZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkUHJvYmxlbShtZXNzYWdlVHlwZWRlZk5vdFR5cGUsIGVxdWFscy5jaGFyT2Zmc2V0LCBlcXVhbHMubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVE9ETyhhaGUpOiBJbXByb3ZlIHRoaXMgZXJyb3IgbWVzc2FnZS4KICAgICAgICBhZGRQcm9ibGVtKG1lc3NhZ2VUeXBlZGVmTm90RnVuY3Rpb24sIGVxdWFscy5jaGFyT2Zmc2V0LCBlcXVhbHMubGVuZ3RoKTsKICAgICAgfQogICAgfQogICAgTGlzdDxNZXRhZGF0YUJ1aWxkZXI+IG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KHR5cGVkZWZLZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgbGlicmFyeUJ1aWxkZXIuYWRkRnVuY3Rpb25UeXBlQWxpYXMoZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBuYW1lLAogICAgICAgIHR5cGVWYXJpYWJsZXMsIGFsaWFzZWRUeXBlLCBjaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxGaWVsZHMoCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFRvcExldmVsRmllbGRzIik7CiAgICBpZiAobGF0ZVRva2VuICE9IG51bGwgJiYgIWxpYnJhcnlCdWlsZGVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgcmVwb3J0Tm9uTnVsbGFibGVNb2RpZmllckVycm9yKGxhdGVUb2tlbik7CiAgICB9CiAgICBMaXN0PEZpZWxkSW5mbz4gZmllbGRJbmZvcyA9IHBvcEZpZWxkSW5mb3MoY291bnQpOwogICAgVHlwZUJ1aWxkZXIgdHlwZSA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIGludCBtb2RpZmllcnMgPSAoc3RhdGljVG9rZW4gIT0gbnVsbCA/IHN0YXRpY01hc2sgOiAwKSB8CiAgICAgICAgKGNvdmFyaWFudFRva2VuICE9IG51bGwgPyBjb3ZhcmlhbnRNYXNrIDogMCkgfAogICAgICAgIChsYXRlVG9rZW4gIT0gbnVsbCA/IGxhdGVNYXNrIDogMCkgfAogICAgICAgIE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0KHZhckZpbmFsT3JDb25zdD8ubGV4ZW1lKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKGZpZWxkSW5mb3MgPT0gbnVsbCkgcmV0dXJuOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBsaWJyYXJ5QnVpbGRlci5hZGRGaWVsZHMoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGUsIGZpZWxkSW5mb3MpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc0ZpZWxkcyhUb2tlbiBzdGF0aWNUb2tlbiwgVG9rZW4gY292YXJpYW50VG9rZW4sIFRva2VuIGxhdGVUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZHMiKTsKICAgIGlmIChsYXRlVG9rZW4gIT0gbnVsbCAmJiAhbGlicmFyeUJ1aWxkZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICByZXBvcnROb25OdWxsYWJsZU1vZGlmaWVyRXJyb3IobGF0ZVRva2VuKTsKICAgIH0KICAgIExpc3Q8RmllbGRJbmZvPiBmaWVsZEluZm9zID0gcG9wRmllbGRJbmZvcyhjb3VudCk7CiAgICBUeXBlQnVpbGRlciB0eXBlID0gcG9wKCk7CiAgICBpbnQgbW9kaWZpZXJzID0gKHN0YXRpY1Rva2VuICE9IG51bGwgPyBzdGF0aWNNYXNrIDogMCkgfAogICAgICAgIChjb3ZhcmlhbnRUb2tlbiAhPSBudWxsID8gY292YXJpYW50TWFzayA6IDApIHwKICAgICAgICAobGF0ZVRva2VuICE9IG51bGwgPyBsYXRlTWFzayA6IDApIHwKICAgICAgICBNb2RpZmllci52YWxpZGF0ZVZhckZpbmFsT3JDb25zdCh2YXJGaW5hbE9yQ29uc3Q/LmxleGVtZSk7CiAgICBpZiAoc3RhdGljVG9rZW4gPT0gbnVsbCAmJiBtb2RpZmllcnMgJiBjb25zdE1hc2sgIT0gMCkgewogICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCB0byBiZQogICAgICAvLyBjb25zdGFudC4KICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkLCB2YXJGaW5hbE9yQ29uc3QuY2hhck9mZnNldCwKICAgICAgICAgIHZhckZpbmFsT3JDb25zdC5sZW5ndGgpOwogICAgICBtb2RpZmllcnMgJj0gfmNvbnN0TWFzazsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgaWYgKGZpZWxkSW5mb3MgPT0gbnVsbCkgcmV0dXJuOwogICAgU3RyaW5nIGRvY3VtZW50YXRpb25Db21tZW50ID0gZ2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoYmVnaW5Ub2tlbik7CiAgICBsaWJyYXJ5QnVpbGRlci5hZGRGaWVsZHMoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsIG1ldGFkYXRhLCBtb2RpZmllcnMsIHR5cGUsIGZpZWxkSW5mb3MpOwogIH0KCiAgTGlzdDxGaWVsZEluZm8+IHBvcEZpZWxkSW5mb3MoaW50IGNvdW50KSB7CiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7CiAgICBMaXN0PEZpZWxkSW5mbz4gZmllbGRJbmZvcyA9IG5ldyBMaXN0PEZpZWxkSW5mbz4oY291bnQpOwogICAgYm9vbCBpc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpICE9IC0xOyBpLS0pIHsKICAgICAgaW50IGNoYXJFbmRPZmZzZXQgPSBwb3AoKTsKICAgICAgVG9rZW4gYmVmb3JlTGFzdCA9IHBvcCgpOwogICAgICBUb2tlbiBpbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlID0gcG9wKCk7CiAgICAgIGludCBjaGFyT2Zmc2V0ID0gcG9wKCk7CiAgICAgIE9iamVjdCBuYW1lID0gcG9wKE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICAgICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgICBpc1BhcnNlclJlY292ZXJ5ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaWVsZEluZm9zW2ldID0gbmV3IEZpZWxkSW5mbyhuYW1lLCBjaGFyT2Zmc2V0LAogICAgICAgICAgICBpbml0aWFsaXplclRva2VuRm9ySW5mZXJlbmNlLCBiZWZvcmVMYXN0LCBjaGFyRW5kT2Zmc2V0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzUGFyc2VyUmVjb3ZlcnkgPyBudWxsIDogZmllbGRJbmZvczsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGUoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luVHlwZVZhcmlhYmxlIik7CiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogdHlwZSB2YXJpYWJsZSBtZXRhZGF0YSBzaG91bGQgbm90IGJlIGlnbm9yZWQuICBTZWUKICAgIC8vIGRhcnRidWcuY29tLzI4OTgxLgogICAgLyogTGlzdDxNZXRhZGF0YUJ1aWxkZXI8VHlwZUJ1aWxkZXI+PiBtZXRhZGF0YSA9ICovIHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHB1c2gobGlicmFyeUJ1aWxkZXIuYWRkVHlwZVZhcmlhYmxlKG5hbWUsIG51bGwsIGNoYXJPZmZzZXQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiVHlwZVZhcmlhYmxlc0RlZmluZWQiKTsKICAgIGFzc2VydChjb3VudCA+IDApOwogICAgcHVzaChjb25zdCBGaXhlZE51bGxhYmxlTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPigpLnBvcChzdGFjaywgY291bnQpID8/CiAgICAgICAgTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXMpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlVmFyaWFibGUoCiAgICAgIFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyLCBUb2tlbiB2YXJpYW5jZSkgewogICAgZGVidWdFdmVudCgiZW5kVHlwZVZhcmlhYmxlIik7CiAgICBUeXBlQnVpbGRlciBib3VuZCA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgIC8vIFBlZWsgdG8gbGVhdmUgdHlwZSBwYXJhbWV0ZXJzIG9uIHRvcCBvZiBzdGFjay4KICAgIExpc3Q8VHlwZVZhcmlhYmxlQnVpbGRlcj4gdHlwZVBhcmFtZXRlcnMgPSBwZWVrKCk7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICB0eXBlUGFyYW1ldGVyc1tpbmRleF0uYm91bmQgPSBib3VuZDsKICAgICAgaWYgKHZhcmlhbmNlICE9IG51bGwpIHsKICAgICAgICBpZiAoIWxpYnJhcnlCdWlsZGVyLmxvYWRlci50YXJnZXQuZW5hYmxlVmFyaWFuY2UpIHsKICAgICAgICAgIHJlcG9ydFZhcmlhbmNlTW9kaWZpZXJOb3RFbmFibGVkKHZhcmlhbmNlKTsKICAgICAgICB9CiAgICAgICAgdHlwZVBhcmFtZXRlcnNbaW5kZXhdLnZhcmlhbmNlID0gVmFyaWFuY2UuZnJvbVN0cmluZyh2YXJpYW5jZS5sZXhlbWUpOwogICAgICB9CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZFR5cGVWYXJpYWJsZXMiKTsKCiAgICAvLyBQZWVrIHRvIGxlYXZlIHR5cGUgcGFyYW1ldGVycyBvbiB0b3Agb2Ygc3RhY2suCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVQYXJhbWV0ZXJzID0gcGVlaygpOwoKICAgIE1hcDxTdHJpbmcsIFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXNCeU5hbWU7CiAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgIGlmIChidWlsZGVyLmJvdW5kICE9IG51bGwpIHsKICAgICAgICAgIGlmICh0eXBlVmFyaWFibGVzQnlOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgdHlwZVZhcmlhYmxlc0J5TmFtZSA9IG5ldyBNYXA8U3RyaW5nLCBUeXBlVmFyaWFibGVCdWlsZGVyPigpOwogICAgICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZUJ1aWxkZXIgYnVpbGRlciBpbiB0eXBlUGFyYW1ldGVycykgewogICAgICAgICAgICAgIHR5cGVWYXJpYWJsZXNCeU5hbWVbYnVpbGRlci5uYW1lXSA9IGJ1aWxkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBGaW5kIGN5Y2xlOiBJZiB0aGVyZSdzIG5vIGN5Y2xlIHdlIGNhbiBhdCBtb3N0IHN0ZXAgdGhyb3VnaCBhbGwKICAgICAgICAgIC8vIGB0eXBlUGFyYW1ldGVyc2AgKGF0IHdoaWNoIHBvaW50IHRoZSBsYXN0IGJ1aWxkZXJzIGJvdW5kIHdpbGwgYmUKICAgICAgICAgIC8vIG51bGwpLgogICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjeWNsZSB3aXRoIGBidWlsZGVyYCAnaW5zaWRlJyB0aGUgc3RlcHMgdG8gZ2V0IGJhY2sKICAgICAgICAgIC8vIHRvIGl0IHdpbGwgYWxzbyBiZSBib3VuZCBieSBgdHlwZVBhcmFtZXRlcnMubGVuZ3RoYC4KICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY3ljbGUgd2l0aG91dCBgYnVpbGRlcmAgJ2luc2lkZScgd2Ugd2lsbCBqdXN0IGlnbm9yZQogICAgICAgICAgLy8gaXQgZm9yIG5vdy4gSXQgd2lsbCBiZSByZXBvcnRlZCB3aGVuIHByb2Nlc3Npbmcgb25lIG9mIHRoZQogICAgICAgICAgLy8gYGJ1aWxkZXJgcyB0aGF0IGlzIGluIGZhY3QgYGluc2lkZWAgdGhlIGN5Y2xlLiBUaGlzIG1hdGNoZXMgdGhlCiAgICAgICAgICAvLyBjeWNsaWMgY2xhc3MgaGllcmFyY2h5IGVycm9yLgogICAgICAgICAgVHlwZVZhcmlhYmxlQnVpbGRlciBib3VuZCA9IGJ1aWxkZXI7CiAgICAgICAgICBmb3IgKGludCBzdGVwcyA9IDA7CiAgICAgICAgICAgICAgYm91bmQuYm91bmQgIT0gbnVsbCAmJiBzdGVwcyA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsKICAgICAgICAgICAgICArK3N0ZXBzKSB7CiAgICAgICAgICAgIGJvdW5kID0gdHlwZVZhcmlhYmxlc0J5TmFtZVtib3VuZC5ib3VuZC5uYW1lXTsKICAgICAgICAgICAgaWYgKGJvdW5kID09IG51bGwgfHwgYm91bmQgPT0gYnVpbGRlcikgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYm91bmQgPT0gYnVpbGRlciAmJiBib3VuZC5ib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIFdyaXRlIG91dCBjeWNsZS4KICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZpYSA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgICAgICAgICAgYm91bmQgPSB0eXBlVmFyaWFibGVzQnlOYW1lW2J1aWxkZXIuYm91bmQubmFtZV07CiAgICAgICAgICAgIHdoaWxlIChib3VuZCAhPSBidWlsZGVyKSB7CiAgICAgICAgICAgICAgdmlhLmFkZChib3VuZC5uYW1lKTsKICAgICAgICAgICAgICBib3VuZCA9IHR5cGVWYXJpYWJsZXNCeU5hbWVbYm91bmQuYm91bmQubmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gdmlhLmlzRW1wdHkKICAgICAgICAgICAgICAgID8gdGVtcGxhdGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKGJ1aWxkZXIubmFtZSkKICAgICAgICAgICAgICAgIDogdGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlcy53aXRoQXJndW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIubmFtZSwgdmlhLmpvaW4oIicsICciKSk7CiAgICAgICAgICAgIGFkZFByb2JsZW0obWVzc2FnZSwgYnVpbGRlci5jaGFyT2Zmc2V0LCBidWlsZGVyLm5hbWUubGVuZ3RoKTsKICAgICAgICAgICAgYnVpbGRlci5ib3VuZCA9IG5ldyBOYW1lZFR5cGVCdWlsZGVyKAogICAgICAgICAgICAgICAgYnVpbGRlci5uYW1lLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLCBudWxsKQogICAgICAgICAgICAgIC4uYmluZChuZXcgSW52YWxpZFR5cGVEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgIGJ1aWxkZXIubmFtZSwKICAgICAgICAgICAgICAgICAgbWVzc2FnZS53aXRoTG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICB1cmksIGJ1aWxkZXIuY2hhck9mZnNldCwgYnVpbGRlci5uYW1lLmxlbmd0aCkpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaW5Db25zdHJ1Y3Rvck5hbWUpIHsKICAgICAgYWRkUHJvYmxlbShtZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZVBhcmFtZXRlcnMsCiAgICAgICAgICBvZmZzZXRGb3JUb2tlbihiZWdpblRva2VuKSwgbGVuZ3RoT2ZTcGFuKGJlZ2luVG9rZW4sIGVuZFRva2VuKSk7CiAgICAgIGluQ29uc3RydWN0b3JOYW1lID0gZmFsc2U7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGRlYnVnRXZlbnQoImVuZFBhcnRPZiIpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3BDaGFyT2Zmc2V0KCk7CiAgICBPYmplY3QgY29udGFpbmluZ0xpYnJhcnkgPSBwb3AoKTsKICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgaWYgKGhhc05hbWUpIHsKICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUGFydE9mKG1ldGFkYXRhLAogICAgICAgICAgZmxhdHRlbk5hbWUoY29udGFpbmluZ0xpYnJhcnksIGNoYXJPZmZzZXQsIHVyaSksIG51bGwsIGNoYXJPZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgbGlicmFyeUJ1aWxkZXIuYWRkUGFydE9mKG1ldGFkYXRhLCBudWxsLCBjb250YWluaW5nTGlicmFyeSwgY2hhck9mZnNldCk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbnN0cnVjdG9yUmVmZXJlbmNlKAogICAgICBUb2tlbiBzdGFydCwgVG9rZW4gcGVyaW9kQmVmb3JlTmFtZSwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNvbnN0cnVjdG9yUmVmZXJlbmNlIik7CiAgICBwb3BJZk5vdE51bGwocGVyaW9kQmVmb3JlTmFtZSk7IC8vIGNoYXJPZmZzZXQuCiAgICBTdHJpbmcgc3VmZml4ID0gcG9wSWZOb3ROdWxsKHBlcmlvZEJlZm9yZU5hbWUpOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gdHlwZUFyZ3VtZW50cyA9IHBvcCgpOwogICAgaW50IGNoYXJPZmZzZXQgPSBwb3AoKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgewogICAgICBwdXNoKG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5QnVpbGRlci5hZGRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgICAgIG5hbWUsIHR5cGVBcmd1bWVudHMsIHN1ZmZpeCwgY2hhck9mZnNldCkpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZhY3RvcnlNZXRob2QoCiAgICAgIFRva2VuIGxhc3RDb25zdW1lZCwgVG9rZW4gZXh0ZXJuYWxUb2tlbiwgVG9rZW4gY29uc3RUb2tlbikgewogICAgaW5Db25zdHJ1Y3RvciA9IHRydWU7CiAgICBsaWJyYXJ5QnVpbGRlci5iZWdpbk5lc3RlZERlY2xhcmF0aW9uKAogICAgICAgIFR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZmFjdG9yeU1ldGhvZCwgIiNmYWN0b3J5X21ldGhvZCIsCiAgICAgICAgaGFzTWVtYmVyczogZmFsc2UpOwogICAgcHVzaCgoZXh0ZXJuYWxUb2tlbiAhPSBudWxsID8gZXh0ZXJuYWxNYXNrIDogMCkgfAogICAgICAgIChjb25zdFRva2VuICE9IG51bGwgPyBjb25zdE1hc2sgOiAwKSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc0ZhY3RvcnlNZXRob2QiKTsKICAgIE1ldGhvZEJvZHkga2luZCA9IHBvcCgpOwogICAgQ29uc3RydWN0b3JSZWZlcmVuY2VCdWlsZGVyIHJlZGlyZWN0aW9uVGFyZ2V0OwogICAgaWYgKGtpbmQgPT0gTWV0aG9kQm9keS5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KSB7CiAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0ID0gbnVsbElmUGFyc2VyUmVjb3ZlcnkocG9wKCkpOwogICAgfQogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gcG9wKCk7CiAgICBpbnQgZm9ybWFsc09mZnNldCA9IHBvcCgpOwogICAgcG9wKCk7IC8vIHR5cGUgdmFyaWFibGVzCiAgICBpbnQgY2hhck9mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIGludCBtb2RpZmllcnMgPSBwb3AoKTsKICAgIGlmIChuYXRpdmVNZXRob2ROYW1lICE9IG51bGwpIHsKICAgICAgbW9kaWZpZXJzIHw9IGV4dGVybmFsTWFzazsKICAgIH0KICAgIExpc3Q8TWV0YWRhdGFCdWlsZGVyPiBtZXRhZGF0YSA9IHBvcCgpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgbGlicmFyeUJ1aWxkZXIuZW5kTmVzdGVkRGVjbGFyYXRpb24oCiAgICAgICAgICBUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmZhY3RvcnlNZXRob2QsICI8c3ludGF4LWVycm9yPiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbkNvbW1lbnQgPSBnZXREb2N1bWVudGF0aW9uQ29tbWVudChiZWdpblRva2VuKTsKICAgIGxpYnJhcnlCdWlsZGVyLmFkZEZhY3RvcnlNZXRob2QoCiAgICAgICAgZG9jdW1lbnRhdGlvbkNvbW1lbnQsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgbW9kaWZpZXJzLAogICAgICAgIG5hbWUsCiAgICAgICAgZm9ybWFscywKICAgICAgICByZWRpcmVjdGlvblRhcmdldCwKICAgICAgICBiZWdpblRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgY2hhck9mZnNldCwKICAgICAgICBmb3JtYWxzT2Zmc2V0LAogICAgICAgIGVuZFRva2VuLmNoYXJPZmZzZXQsCiAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSk7CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICAgIGluQ29uc3RydWN0b3IgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSIpOwogICAgcHVzaChNZXRob2RCb2R5LlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGaWVsZEluaXRpYWxpemVyKFRva2VuIGFzc2lnbm1lbnRPcGVyYXRvciwgVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkZpZWxkSW5pdGlhbGl6ZXIiKTsKICAgIFRva2VuIGJlZm9yZUxhc3QgPSBhc3NpZ25tZW50T3BlcmF0b3IubmV4dDsKICAgIFRva2VuIG5leHQgPSBiZWZvcmVMYXN0Lm5leHQ7CiAgICB3aGlsZSAobmV4dCAhPSB0b2tlbiAmJiAhbmV4dC5pc0VvZikgewogICAgICAvLyBUbyBhdm9pZCBzdG9yaW5nIHRoZSByZXN0IG9mIHRoZSB0b2tlbiBzdHJlYW0sIHdlIG5lZWQgdG8gaWRlbnRpZnkgdGhlCiAgICAgIC8vIHRva2VuIGJlZm9yZSBbdG9rZW5dLiBUaGF0IHRva2VuIHdpbGwgYmUgdGhlIGxhc3QgdG9rZW4gb2YgdGhlCiAgICAgIC8vIGluaXRpYWxpemVyIGV4cHJlc3Npb24gYW5kIGJ5IHNldHRpbmcgaXRzIHRhaWwgdG8gRU9GIHdlIG9ubHkgc3RvcmUKICAgICAgLy8gdGhlIHRva2VucyBmb3IgdGhlIGV4cHJlc3Npb24uCiAgICAgIC8vIFRPRE8oYWhlKTogTWlnaHQgYmUgY2xlYXJlciBpZiB0aGlzIHNlYXJjaCB3YXMgbW92ZWQgdG8KICAgICAgLy8gYGxpYnJhcnkuYWRkRmllbGRzYC4KICAgICAgLy8gVE9ETyhhaGUpOiBJIGRvbid0IGV2ZW4gdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnkuIFt0b2tlbl0gcG9pbnRzIHRvIDsKICAgICAgLy8gb3IgLCBhbmQgd2UgZG9uJ3Qgb3RoZXJ3aXNlIHN0b3JlIHRva2Vucy4KICAgICAgYmVmb3JlTGFzdCA9IG5leHQ7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICB9CiAgICBwdXNoKGFzc2lnbm1lbnRPcGVyYXRvci5uZXh0KTsKICAgIHB1c2goYmVmb3JlTGFzdCk7CiAgICBwdXNoKHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0ZpZWxkSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5vRmllbGRJbml0aWFsaXplciIpOwogICAgcHVzaChOdWxsVmFsdWUuRmllbGRJbml0aWFsaXplcik7CiAgICBwdXNoKE51bGxWYWx1ZS5GaWVsZEluaXRpYWxpemVyKTsKICAgIHB1c2godG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICAgIC8vIElnbm9yZWQgZm9yIG5vdy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0luaXRpYWxpemVycyIpOwogICAgLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyIGFuZCBpdCdzIGlnbm9yZWQgZm9yIG5vdy4KICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZE1lbWJlcihUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZE1lbWJlciIpOwogICAgcG9wKCk7IC8vIG1ldGFkYXRhIHN0YXIKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWVtYmVyKCkgewogICAgZGVidWdFdmVudCgiTWVtYmVyIik7CiAgICBhc3NlcnQobmF0aXZlTWV0aG9kTmFtZSA9PSBudWxsKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NXaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc1dpdGhDbGF1c2UiKTsKCiAgICBPYmplY3QgbWl4aW5zID0gcG9wKCk7CiAgICBpbnQgZXh0ZW5kc09mZnNldCA9IHBvcCgpOwogICAgT2JqZWN0IHN1cGVydHlwZSA9IHBvcCgpOwogICAgaWYgKHN1cGVydHlwZSBpcyBQYXJzZXJSZWNvdmVyeSB8fCBtaXhpbnMgaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChuZXcgUGFyc2VyUmVjb3Zlcnkod2l0aEtleXdvcmQuY2hhck9mZnNldCkpOwogICAgfSBlbHNlIHsKICAgICAgcHVzaChsaWJyYXJ5QnVpbGRlci5hZGRNaXhpbkFwcGxpY2F0aW9uKAogICAgICAgICAgc3VwZXJ0eXBlLCBtaXhpbnMsIHdpdGhLZXl3b3JkLmNoYXJPZmZzZXQpKTsKICAgIH0KICAgIHB1c2goZXh0ZW5kc09mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzTm9XaXRoQ2xhdXNlKCkgewogICAgZGVidWdFdmVudCgiQ2xhc3NOb1dpdGhDbGF1c2UiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2xhc3NIZWFkZXIoVG9rZW4gYmVnaW4sIFRva2VuIGNsYXNzS2V5d29yZCwgVG9rZW4gbmF0aXZlVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzSGVhZGVyIik7CiAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWl4aW5IZWFkZXIoVG9rZW4gbWl4aW5LZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVNaXhpbkhlYWRlciIpOwogICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzT3JNaXhpbkJvZHkoCiAgICAgIERlY2xhcmF0aW9uS2luZCBraW5kLCBpbnQgbWVtYmVyQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc09yTWl4aW5Cb2R5Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3luY01vZGlmaWVyIik7CiAgfQoKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgdXJpLAogICAgICAgIHdhc0hhbmRsZWQ6IHdhc0hhbmRsZWQsIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0lnbm9yZWRFcnJvcihDb2RlPGR5bmFtaWM+IGNvZGUsIFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gaXNJZ25vcmVkUGFyc2VyRXJyb3IoY29kZSwgdG9rZW4pIHx8CiAgICAgICAgc3VwZXIuaXNJZ25vcmVkRXJyb3IoY29kZSwgdG9rZW4pOwogIH0KCiAgLy8vIFJldHVybiB0aGUgZG9jdW1lbnRhdGlvbiBjb21tZW50IGZvciB0aGUgZW50aXR5IHRoYXQgc3RhcnRzIGF0IHRoZQogIC8vLyBnaXZlbiBbdG9rZW5dLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gcHJlY2VkaW5nIGRvY3VtZW50YXRpb24gY29tbWVudC4KICBzdGF0aWMgU3RyaW5nIGdldERvY3VtZW50YXRpb25Db21tZW50KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBkb2NUb2tlbiA9IHRva2VuLnByZWNlZGluZ0NvbW1lbnRzOwogICAgaWYgKGRvY1Rva2VuID09IG51bGwpIHJldHVybiBudWxsOwogICAgYm9vbCBpblNsYXNoID0gZmFsc2U7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZl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CCAGHgQBDCEsBAIBN3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnRpZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9kZW1vdGlvbi5kYXJ0jjwvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBoaWRlIE1hcEVudHJ5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9yZXBsYWNlbWVudF92aXNpdG9yLmRhcnQnOwoKLy8vIFJldHVybnMgYHRydWVgIGlmIHR5cGUgY29udGFpbnMgYSBwcm9tb3RlZCB0eXBlIHZhcmlhYmxlLgpib29sIGhhc1Byb21vdGVkVHlwZVZhcmlhYmxlKERhcnRUeXBlIHR5cGUpIHsKICByZXR1cm4gdHlwZS5hY2NlcHQoY29uc3QgX0hhc1Byb21vdGVkVHlwZVZhcmlhYmxlVmlzaXRvcigpKTsKfQoKLy8vIFZpc2l0b3IgdGhhdCByZXR1cm5zIGB0cnVlYCBpZiBhIHR5cGUgY29udGFpbnMgYSBwcm9tb3RlZCB0eXBlIHZhcmlhYmxlLgpjbGFzcyBfSGFzUHJvbW90ZWRUeXBlVmFyaWFibGVWaXNpdG9yIGV4dGVuZHMgRGFydFR5cGVWaXNpdG9yPGJvb2w+IHsKICBjb25zdCBfSGFzUHJvbW90ZWRUeXBlVmFyaWFibGVWaXNpdG9yKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBub2RlKSB7CiAgICBpZiAobm9kZS5yZXR1cm5UeXBlLmFjY2VwdCh0aGlzKSkgcmV0dXJuIHRydWU7CiAgICBmb3IgKERhcnRUeXBlIHBhcmFtZXRlclR5cGUgaW4gbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycykgewogICAgICBpZiAocGFyYW1ldGVyVHlwZS5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgZm9yIChOYW1lZFR5cGUgbmFtZWRQYXJhbWV0ZXJUeXBlIGluIG5vZGUubmFtZWRQYXJhbWV0ZXJzKSB7CiAgICAgIGlmIChuYW1lZFBhcmFtZXRlclR5cGUudHlwZS5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKG5vZGUudHlwZWRlZlR5cGUgIT0gbnVsbCAmJiBub2RlLnR5cGVkZWZUeXBlLmFjY2VwdCh0aGlzKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgZm9yIChEYXJ0VHlwZSB0eXBlQXJndW1lbnQgaW4gbm9kZS50eXBlQXJndW1lbnRzKSB7CiAgICAgIGlmICh0eXBlQXJndW1lbnQuYWNjZXB0KHRoaXMpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICBmb3IgKERhcnRUeXBlIHR5cGVBcmd1bWVudCBpbiBub2RlLnR5cGVBcmd1bWVudHMpIHsKICAgICAgaWYgKHR5cGVBcmd1bWVudC5hY2NlcHQodGhpcykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHJldHVybiBub2RlLnByb21vdGVkQm91bmQgIT0gbnVsbDsKICB9Cn0KCi8vLyBSZXR1cm5zIFt0eXBlXSBpbiB3aGljaCBhbGwgcHJvbW90ZWQgdHlwZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIHJlcGxhY2Ugd2l0aAovLy8gdGhlaXIgdW5wcm9tb3RlZCBlcXVpdmFsZW50cywgYW5kLCBpZiBbbGlicmFyeV0gaXMgbm9uLW51bGxhYmxlIGJ5IGRlZmF1bHQsCi8vLyByZXBsYWNlcyBhbGwgbGVnYWN5IHR5cGVzIHdpdGggdGhlaXIgbm9uLW51bGxhYmxlIGVxdWl2YWxlbnRzLgpEYXJ0VHlwZSBkZW1vdGVUeXBlSW5MaWJyYXJ5KERhcnRUeXBlIHR5cGUsIExpYnJhcnkgbGlicmFyeSkgewogIGlmIChsaWJyYXJ5LmlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgIHJldHVybiB0eXBlLmFjY2VwdChjb25zdCBfRGVtb3Rpb25Ob25OdWxsaWZpY2F0aW9uKCkpID8/IHR5cGU7CiAgfSBlbHNlIHsKICAgIHJldHVybiB0eXBlCiAgICAgICAgICAgIC5hY2NlcHQoY29uc3QgX0RlbW90aW9uTm9uTnVsbGlmaWNhdGlvbihub25OdWxsaWZ5VHlwZXM6IGZhbHNlKSkgPz8KICAgICAgICB0eXBlOwogIH0KfQoKLy8vIFJldHVybnMgW3R5cGVdIGluIHdoaWNoIGFsbCBsZWdhY3kgdHlwZXMgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGgKLy8vIG5vbi1udWxsYWJsZSB0eXBlcy4KRGFydFR5cGUgbm9uTnVsbGlmeUluTGlicmFyeShEYXJ0VHlwZSB0eXBlLCBMaWJyYXJ5IGxpYnJhcnkpIHsKICBpZiAobGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICByZXR1cm4gdHlwZS5hY2NlcHQoCiAgICAgICAgICAgIGNvbnN0IF9EZW1vdGlvbk5vbk51bGxpZmljYXRpb24oZGVtb3RlVHlwZVZhcmlhYmxlczogZmFsc2UpKSA/PwogICAgICAgIHR5cGU7CiAgfQogIHJldHVybiB0eXBlOwp9CgovLy8gVmlzaXRvciB0aGF0IHJlcGxhY2VzIGFsbCBwcm9tb3RlZCB0eXBlIHZhcmlhYmxlcyB0aGUgdHlwZSB2YXJpYWJsZSBpdHNlbGYKLy8vIGFuZC9vciByZXBsYWNlcyBhbGwgbGVnYWN5IHR5cGVzIHdpdGggbm9uLW51bGxhYmxlIHR5cGVzLgovLy8KLy8vIFRoZSB2aXNpdG9yIHJldHVybnMgYG51bGxgIGlmIHRoZSB0eXBlIHdhc24ndCBjaGFuZ2VkLgpjbGFzcyBfRGVtb3Rpb25Ob25OdWxsaWZpY2F0aW9uIGV4dGVuZHMgUmVwbGFjZW1lbnRWaXNpdG9yIHsKICBmaW5hbCBib29sIGRlbW90ZVR5cGVWYXJpYWJsZXM7CiAgZmluYWwgYm9vbCBub25OdWxsaWZ5VHlwZXM7CgogIGNvbnN0IF9EZW1vdGlvbk5vbk51bGxpZmljYXRpb24oCiAgICAgIHt0aGlzLmRlbW90ZVR5cGVWYXJpYWJsZXM6IHRydWUsIHRoaXMubm9uTnVsbGlmeVR5cGVzOiB0cnVlfSkKICAgICAgOiBhc3NlcnQoZGVtb3RlVHlwZVZhcmlhYmxlcyB8fCBub25OdWxsaWZ5VHlwZXMpOwoKICBAb3ZlcnJpZGUKICBOdWxsYWJpbGl0eSB2aXNpdE51bGxhYmlsaXR5KERhcnRUeXBlIG5vZGUpIHsKICAgIGlmIChub25OdWxsaWZ5VHlwZXMgJiYgbm9kZS5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHsKICAgICAgcmV0dXJuIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICBEYXJ0VHlwZSB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIE51bGxhYmlsaXR5IG5ld051bGxhYmlsaXR5ID0gdmlzaXROdWxsYWJpbGl0eShub2RlKTsKICAgIGlmIChkZW1vdGVUeXBlVmFyaWFibGVzICYmIG5vZGUucHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUoCiAgICAgICAgICBub2RlLnBhcmFtZXRlciwgbmV3TnVsbGFiaWxpdHkgPz8gbm9kZS50eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5KTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVUeXBlUGFyYW1ldGVyVHlwZShub2RlLCBuZXdOdWxsYWJpbGl0eSk7CiAgfQp9CnAATU4/ATA2AT4uPwIBTUYrAQwwAQwuM0AzBkE9BkUTBhIEAQwwODIGEgQBDCw4MgYSBAEMOCcEAgFPUEM/KEMLEFAOBAIBRRg/KBhMDgQPAgFPPgQ7PSIeASNEOAEMMEUmBhEEAQw8OT0kUAY6BAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2RlbW90aW9uLmRhcnRbZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYmFzZS9pbnN0cnVtZW50YXRpb24uZGFydIr6Ly8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnIHNob3cgRGFydFR5cGUsIE1lbWJlcjsKCi8vLyBDb252ZXJ0ICfihpInIHRvICctPicgYmVjYXVzZSAn4oaSJyBkb2Vzbid0IHNob3cgdXAgaW4gc29tZSB0ZXJtaW5hbHMuCi8vLyBSZW1vdmUgcHJlZml4ZXMgdGhhdCBhcmUgdXNlZCB2ZXJ5IG9mdGVuIGluIHRlc3RzLgpTdHJpbmcgX3Nob3J0ZW5JbnN0cnVtZW50YXRpb25TdHJpbmcoU3RyaW5nIHMpID0+IHMKICAgIC5yZXBsYWNlQWxsKCfihpInLCAnLT4nKQogICAgLnJlcGxhY2VBbGwoJ2RhcnQuY29yZTo6JywgJycpCiAgICAucmVwbGFjZUFsbCgnZGFydC5hc3luYzo6JywgJycpCiAgICAucmVwbGFjZUFsbCgndGVzdDo6JywgJycpCiAgICAucmVwbGFjZUFsbChuZXcgUmVnRXhwKHInXHMqL1wqLio/XCovXHMqJyksICcnKTsKCi8vLyBJbnRlcmZhY2UgcHJvdmlkaW5nIHRoZSBhYmlsaXR5IHRvIHJlY29yZCBwcm9wZXJ0eS92YWx1ZSBwYWlycyBhc3NvY2lhdGVkCi8vLyB3aXRoIHNvdXJjZSBmaWxlIGxvY2F0aW9ucy4gIEludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGVzdGluZy4KYWJzdHJhY3QgY2xhc3MgSW5zdHJ1bWVudGF0aW9uIHsKICAvLy8gUmVjb3JkcyBhIHByb3BlcnR5L3ZhbHVlIHBhaXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkkgYW5kIG9mZnNldC4KICB2b2lkIHJlY29yZChVcmkgdXJpLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcHJvcGVydHksIEluc3RydW1lbnRhdGlvblZhbHVlIHZhbHVlKTsKfQoKLy8vIEludGVyZmFjZSBmb3IgdmFsdWVzIHJlY29yZGVkIGJ5IFtJbnN0cnVtZW50YXRpb25dLgphYnN0cmFjdCBjbGFzcyBJbnN0cnVtZW50YXRpb25WYWx1ZSB7CiAgY29uc3QgSW5zdHJ1bWVudGF0aW9uVmFsdWUoKTsKCiAgLy8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gU3RyaW5nIGlzIGFuIGFjY3VyYXRlIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFsdWUuCiAgLy8vCiAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgY2hlY2tzIGZvciBlcXVhbGl0eSB3aXRoIHRoZSByZXR1cm4gdmFsdWUKICAvLy8gb2YgW3RvU3RyaW5nXSwgaG93ZXZlciBkZXJpdmVkIGNsYXNzZXMgbWF5IHdhbnQgYSBtb3JlIHNvcGhpc3RpY2F0ZWQKICAvLy8gaW1wbGVtZW50YXRpb24gKGUuZy4gdG8gYWxsb3cgYWJicmV2aWF0aW9ucyBpbiB0aGUgZGVzY3JpcHRpb24pLgogIC8vLwogIC8vLyBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBpbnZhcmlhbnQgaG9sZHM6CiAgLy8vIGB0aGlzLm1hdGNoZXModGhpcy50b1N0cmluZygpKWAgc2hvdWxkIGFsd2F5cyByZXR1cm4gYHRydWVgLgogIGJvb2wgbWF0Y2hlcyhTdHJpbmcgZGVzY3JpcHRpb24pID0+IGRlc2NyaXB0aW9uID09IHRvU3RyaW5nKCk7Cn0KCi8vLyBJbnN0YW5jZSBvZiBbSW5zdHJ1bWVudGF0aW9uVmFsdWVdIGRlc2NyaWJpbmcgYSBbTWVtYmVyXS4KY2xhc3MgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JNZW1iZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25WYWx1ZSB7CiAgZmluYWwgTWVtYmVyIG1lbWJlcjsKCiAgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JNZW1iZXIodGhpcy5tZW1iZXIpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfc2hvcnRlbkluc3RydW1lbnRhdGlvblN0cmluZyhtZW1iZXIudG9TdHJpbmcoKSk7Cn0KCi8vLyBJbnN0YW5jZSBvZiBbSW5zdHJ1bWVudGF0aW9uVmFsdWVdIGRlc2NyaWJpbmcgYSBbRGFydFR5cGVdLgpjbGFzcyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGUgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25WYWx1ZSB7CiAgZmluYWwgRGFydFR5cGUgdHlwZTsKCiAgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKHRoaXMudHlwZSk7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IF9zaG9ydGVuSW5zdHJ1bWVudGF0aW9uU3RyaW5nKHR5cGUudG9TdHJpbmcoKSk7Cn0KCi8vLyBJbnN0YW5jZSBvZiBbSW5zdHJ1bWVudGF0aW9uVmFsdWVdIGRlc2NyaWJpbmcgYSBsaXN0IG9mIFtEYXJ0VHlwZV1zLgpjbGFzcyBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVmFsdWUgewogIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVzOwoKICBJbnN0cnVtZW50YXRpb25WYWx1ZUZvclR5cGVBcmdzKHRoaXMudHlwZXMpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB0eXBlcwogICAgICAubWFwKCh0eXBlKSA9PiBuZXcgSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlKHR5cGUpLnRvU3RyaW5nKCkpCiAgICAgIC5qb2luKCcsICcpOwp9CgovLy8gSW5zdGFuY2Ugb2YgW0luc3RydW1lbnRhdGlvblZhbHVlXSB3aGljaCBvbmx5IG1hdGNoZXMgdGhlIGdpdmVuIGxpdGVyYWwKLy8vIHN0cmluZy4KY2xhc3MgSW5zdHJ1bWVudGF0aW9uVmFsdWVMaXRlcmFsIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVmFsdWUgewogIGZpbmFsIFN0cmluZyB2YWx1ZTsKCiAgY29uc3QgSW5zdHJ1bWVudGF0aW9uVmFsdWVMaXRlcmFsKHRoaXMudmFsdWUpOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB2YWx1ZTsKfQpRAE5OPAE4AUc3NBsjJB41AU5BIU5RAgE4JiABSwZQS0cGPkNBAgE+QxcBLgEMSQIBQEEXASoBDEcCAUlFHgEvAQwdRxMCAUwMQRYBMQEMHgIBL3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9iYXNlL2luc3RydW1lbnRhdGlvbi5kYXJ0bGZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydIRFLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnIHNob3cgTG9jYXRlZE1lc3NhZ2UsIE1lc3NhZ2U7CgphYnN0cmFjdCBjbGFzcyBJbmZlcmVuY2VIZWxwZXIgewogIENvcmVUeXBlcyBnZXQgY29yZVR5cGVzOwoKICBVcmkgZ2V0IHVyaTsKCiAgc2V0IHRyYW5zZm9ybVNldExpdGVyYWxzKGJvb2wgdmFsdWUpOwoKICBFeHByZXNzaW9uIGJ1aWxkUHJvYmxlbShNZXNzYWdlIG1lc3NhZ2UsIGludCBjaGFyT2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICB7TGlzdDxMb2NhdGVkTWVzc2FnZT4gY29udGV4dCwgYm9vbCBzdXBwcmVzc01lc3NhZ2V9KTsKCiAgTG9jYXRlZE1lc3NhZ2UgY2hlY2tBcmd1bWVudHNGb3JUeXBlKAogICAgICBGdW5jdGlvblR5cGUgZnVuY3Rpb24sIEFyZ3VtZW50cyBhcmd1bWVudHMsIGludCBvZmZzZXQpOwoKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge0xpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHQsIGJvb2wgd2FzSGFuZGxlZH0pOwoKICBFeHByZXNzaW9uIHdyYXBJblByb2JsZW0oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBNZXNzYWdlIG1lc3NhZ2UsIGludCBsZW5ndGgsCiAgICAgIHtMaXN0PExvY2F0ZWRNZXNzYWdlPiBjb250ZXh0fSk7CgogIFN0cmluZyBjb25zdHJ1Y3Rvck5hbWVGb3JEaWFnbm9zdGljcyhTdHJpbmcgbmFtZSwKICAgICAge1N0cmluZyBjbGFzc05hbWUsIGJvb2wgaXNTdXBlcn0pOwp9CiQATk48ASIBIgE4ATsBIRsBDwEoAUc9ASg/AT84AU8nATQpAgFAcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2luZmVyZW5jZV9oZWxwZXIuZGFydHRmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydMAAWBcvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIENsYXNzLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTWVtYmVyLAogICAgICAgIE5hbWUsCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIE51bGxhYmlsaXR5LAogICAgICAgIFByb2NlZHVyZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFZhcmlhbmNlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCcgc2hvdyBzdWJzdGl0dXRlLCBTdWJzdGl0dXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9mdXR1cmVfb3IuZGFydCc7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgppbXBvcnQgJy4uL25hbWVzLmRhcnQnIHNob3cgY2FsbE5hbWU7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnOwoKaW1wb3J0ICd0eXBlX3NjaGVtYV9lbnZpcm9ubWVudC5kYXJ0JzsKCi8vLyBDcmVhdGVzIGEgY29sbGVjdGlvbiBvZiBbVHlwZUNvbnN0cmFpbnRdcyBjb3JyZXNwb25kaW5nIHRvIHR5cGUgcGFyYW1ldGVycywKLy8vIGJhc2VkIG9uIGFuIGF0dGVtcHQgdG8gbWFrZSBvbmUgdHlwZSBzY2hlbWEgYSBzdWJ0eXBlIG9mIGFub3RoZXIuCmFic3RyYWN0IGNsYXNzIFR5cGVDb25zdHJhaW50R2F0aGVyZXIgewogIGZpbmFsIF9wcm90b0NvbnN0cmFpbnRzID0gPF9Qcm90b0NvbnN0cmFpbnQ+W107CgogIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gX3BhcmFtZXRlcnNUb0NvbnN0cmFpbjsKCiAgZmluYWwgTGlicmFyeSBfY3VycmVudExpYnJhcnk7CgogIC8vLyBDcmVhdGVzIGEgW1R5cGVDb25zdHJhaW50R2F0aGVyZXJdIHdoaWNoIGlzIHByZXBhcmVkIHRvIGdhdGhlciB0eXBlCiAgLy8vIGNvbnN0cmFpbnRzIGZvciB0aGUgZ2l2ZW4gW3R5cGVQYXJhbWV0ZXJzXS4KICBUeXBlQ29uc3RyYWludEdhdGhlcmVyLnN1YmNsYXNzaW5nKAogICAgICBJdGVyYWJsZTxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgdGhpcy5fY3VycmVudExpYnJhcnkpCiAgICAgIDogX3BhcmFtZXRlcnNUb0NvbnN0cmFpbiA9IHR5cGVQYXJhbWV0ZXJzLnRvTGlzdCgpOwoKICBmYWN0b3J5IFR5cGVDb25zdHJhaW50R2F0aGVyZXIoVHlwZVNjaGVtYUVudmlyb25tZW50IGVudmlyb25tZW50LAogICAgICBJdGVyYWJsZTxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgTGlicmFyeSBjdXJyZW50TGlicmFyeSkgewogICAgcmV0dXJuIG5ldyBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyKAogICAgICAgIGVudmlyb25tZW50LCB0eXBlUGFyYW1ldGVycywgY3VycmVudExpYnJhcnkpOwogIH0KCiAgQ2xhc3MgZ2V0IG9iamVjdENsYXNzOwoKICBDbGFzcyBnZXQgZnVuY3Rpb25DbGFzczsKCiAgQ2xhc3MgZ2V0IGZ1dHVyZU9yQ2xhc3M7CgogIENsYXNzIGdldCBudWxsQ2xhc3M7CgogIHZvaWQgYWRkVXBwZXJCb3VuZCgKICAgICAgVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgdXBwZXIsIExpYnJhcnkgY2xpZW50TGlicmFyeSk7CgogIHZvaWQgYWRkTG93ZXJCb3VuZCgKICAgICAgVHlwZUNvbnN0cmFpbnQgY29uc3RyYWludCwgRGFydFR5cGUgbG93ZXIsIExpYnJhcnkgY2xpZW50TGlicmFyeSk7CgogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KTsKCiAgSW50ZXJmYWNlVHlwZSBnZXRUeXBlQXNJbnN0YW5jZU9mKEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcywKICAgICAgTGlicmFyeSBjbGllbnRMaWJyYXJ5LCBDb3JlVHlwZXMgY29yZVR5cGVzKTsKCiAgTGlzdDxEYXJ0VHlwZT4gZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZigKICAgICAgSW50ZXJmYWNlVHlwZSB0eXBlLCBDbGFzcyBzdXBlcmNsYXNzKTsKCiAgSW50ZXJmYWNlVHlwZSBmdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUsIE51bGxhYmlsaXR5IG51bGxhYmlsaXR5KTsKCiAgLy8vIFJldHVybnMgdGhlIHNldCBvZiB0eXBlIGNvbnN0cmFpbnRzIHRoYXQgd2FzIGdhdGhlcmVkLgogIE1hcDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD4gY29tcHV0ZUNvbnN0cmFpbnRzKExpYnJhcnkgY2xpZW50TGlicmFyeSkgewogICAgTWFwPFR5cGVQYXJhbWV0ZXIsIFR5cGVDb25zdHJhaW50PiByZXN1bHQgPQogICAgICAgIDxUeXBlUGFyYW1ldGVyLCBUeXBlQ29uc3RyYWludD57fTsKICAgIGZvciAoVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIgaW4gX3BhcmFtZXRlcnNUb0NvbnN0cmFpbikgewogICAgICByZXN1bHRbcGFyYW1ldGVyXSA9IG5ldyBUeXBlQ29uc3RyYWludCgpOwogICAgfQogICAgZm9yIChfUHJvdG9Db25zdHJhaW50IHByb3RvQ29uc3RyYWludCBpbiBfcHJvdG9Db25zdHJhaW50cykgewogICAgICBpZiAocHJvdG9Db25zdHJhaW50LmlzVXBwZXIpIHsKICAgICAgICBhZGRVcHBlckJvdW5kKHJlc3VsdFtwcm90b0NvbnN0cmFpbnQucGFyYW1ldGVyXSwgcHJvdG9Db25zdHJhaW50LmJvdW5kLAogICAgICAgICAgICBjbGllbnRMaWJyYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhZGRMb3dlckJvdW5kKHJlc3VsdFtwcm90b0NvbnN0cmFpbnQucGFyYW1ldGVyXSwgcHJvdG9Db25zdHJhaW50LmJvdW5kLAogICAgICAgICAgICBjbGllbnRMaWJyYXJ5KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBUcmllcyB0byBtYXRjaCBbc3VidHlwZV0gYWdhaW5zdCBbc3VwZXJ0eXBlXS4KICAvLy8KICAvLy8gSWYgdGhlIG1hdGNoIHN1Y2NlZWRzLCB0aGUgcmVzdWx0aW5nIHR5cGUgY29uc3RyYWludHMgYXJlIHJlY29yZGVkIGZvcgogIC8vLyBsYXRlciB1c2UgYnkgW2NvbXB1dGVDb25zdHJhaW50c10uICBJZiB0aGUgbWF0Y2ggZmFpbHMsIHRoZSBzZXQgb2YgdHlwZQogIC8vLyBjb25zdHJhaW50cyBpcyB1bmNoYW5nZWQuCiAgYm9vbCB0cnlTdWJ0eXBlTWF0Y2goRGFydFR5cGUgc3VidHlwZSwgRGFydFR5cGUgc3VwZXJ0eXBlKSB7CiAgICBpbnQgb2xkUHJvdG9Db25zdHJhaW50c0xlbmd0aCA9IF9wcm90b0NvbnN0cmFpbnRzLmxlbmd0aDsKICAgIGJvb2wgaXNNYXRjaCA9IF9pc1N1YnR5cGVNYXRjaChzdWJ0eXBlLCBzdXBlcnR5cGUpOwogICAgaWYgKCFpc01hdGNoKSB7CiAgICAgIF9wcm90b0NvbnN0cmFpbnRzLmxlbmd0aCA9IG9sZFByb3RvQ29uc3RyYWludHNMZW5ndGg7CiAgICB9CiAgICByZXR1cm4gaXNNYXRjaDsKICB9CgogIHZvaWQgX2NvbnN0cmFpbkxvd2VyKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBEYXJ0VHlwZSBsb3dlcikgewogICAgX3Byb3RvQ29uc3RyYWludHMuYWRkKG5ldyBfUHJvdG9Db25zdHJhaW50Lmxvd2VyKHBhcmFtZXRlciwgbG93ZXIpKTsKICB9CgogIHZvaWQgX2NvbnN0cmFpblVwcGVyKFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyLCBEYXJ0VHlwZSB1cHBlcikgewogICAgX3Byb3RvQ29uc3RyYWludHMuYWRkKG5ldyBfUHJvdG9Db25zdHJhaW50LnVwcGVyKHBhcmFtZXRlciwgdXBwZXIpKTsKICB9CgogIGJvb2wgX2lzRnVuY3Rpb25TdWJ0eXBlTWF0Y2goRnVuY3Rpb25UeXBlIHN1YnR5cGUsIEZ1bmN0aW9uVHlwZSBzdXBlcnR5cGUpIHsKICAgIC8vIEEgZnVuY3Rpb24gdHlwZSBgKE0wLC4uLiwgTW4sIFtNe24rMX0sIC4uLiwgTW1dKSAtPiBSMGAgaXMgYSBzdWJ0eXBlCiAgICAvLyBtYXRjaCBmb3IgYSBmdW5jdGlvbiB0eXBlIGAoTjAsLi4uLCBOaywgW057aysxfSwgLi4uLCBOcl0pIC0+IFIxYCB3aXRoCiAgICAvLyByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQzAgKyAuLi4gKyBDciArIENgCiAgICAvLyAtIElmIGBSMGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhIHR5cGUgYFIxYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyAgIGNvbnN0cmFpbnRzIGBDYDoKICAgIC8vIC0gSWYgYG4gPD0ga2AgYW5kIGByIDw9IG1gLgogICAgLy8gLSBBbmQgZm9yIGBpYCBpbiBgMC4uLnJgLCBgTmlgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYE1pYCB3aXRoIHJlc3BlY3QKICAgIC8vICAgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDaWAuCiAgICAvLyBGdW5jdGlvbiB0eXBlcyB3aXRoIG5hbWVkIHBhcmFtZXRlcnMgYXJlIHRyZWF0ZWQgYW5hbG9nb3VzbHkgdG8gdGhlCiAgICAvLyBwb3NpdGlvbmFsIHBhcmFtZXRlciBjYXNlIGFib3ZlLgogICAgLy8gQSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgYDxUMCBleHRlbmRzIEIwLCAuLi4sIFRuIGV4dGVuZHMgQm4+RjBgIGlzIGEKICAgIC8vIHN1YnR5cGUgbWF0Y2ggZm9yIGEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGA8UzAgZXh0ZW5kcyBCMCwgLi4uLCBTbgogICAgLy8gZXh0ZW5kcyBCbj5GMWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2xgOgogICAgLy8gLSBJZiBgRjBbWjAvVDAsIC4uLiwgWm4vVG5dYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBGMFtaMC9TMCwgLi4uLAogICAgLy8gICBabi9Tbl1gIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENgLCB3aGVyZSBlYWNoIGBaaWAgaXMgYQogICAgLy8gICBmcmVzaCB0eXBlIHZhcmlhYmxlIHdpdGggYm91bmQgYEJpYC4KICAgIC8vIC0gQW5kIGBDbGAgaXMgYENgIHdpdGggZWFjaCBjb25zdHJhaW50IHJlcGxhY2VkIHdpdGggaXRzIGNsb3N1cmUgd2l0aAogICAgLy8gICByZXNwZWN0IHRvIGBbWjAsIC4uLiwgWm5dYC4KICAgIGlmIChzdWJ0eXBlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQgPiBzdXBlcnR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3VidHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGggPAogICAgICAgIHN1cGVydHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHN1YnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHN1cGVydHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHN1YnR5cGUudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnR5cGVTdWJzdGl0dXRpb24gPQogICAgICAgICAgPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPnt9OwogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1cGVydHlwZVN1YnN0aXR1dGlvbiA9CiAgICAgICAgICA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZnJlc2hUeXBlVmFyaWFibGVzID0gPFR5cGVQYXJhbWV0ZXI+W107CiAgICAgIGlmICghX21hdGNoVHlwZUZvcm1hbHMoc3VidHlwZS50eXBlUGFyYW1ldGVycywgc3VwZXJ0eXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgc3VidHlwZVN1YnN0aXR1dGlvbiwgc3VwZXJ0eXBlU3Vic3RpdHV0aW9uLCBmcmVzaFR5cGVWYXJpYWJsZXMpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBzdWJ0eXBlID0gc3Vic3RpdHV0ZVR5cGVQYXJhbXMoCiAgICAgICAgICBzdWJ0eXBlLCBzdWJ0eXBlU3Vic3RpdHV0aW9uLCBmcmVzaFR5cGVWYXJpYWJsZXMpOwogICAgICBzdXBlcnR5cGUgPSBzdWJzdGl0dXRlVHlwZVBhcmFtcygKICAgICAgICAgIHN1cGVydHlwZSwgc3VwZXJ0eXBlU3Vic3RpdHV0aW9uLCBmcmVzaFR5cGVWYXJpYWJsZXMpOwogICAgfQoKICAgIC8vIFRlc3QgdGhlIHJldHVybiB0eXBlcy4KICAgIGlmIChzdXBlcnR5cGUucmV0dXJuVHlwZSBpcyEgVm9pZFR5cGUgJiYKICAgICAgICAhX2lzU3VidHlwZU1hdGNoKHN1YnR5cGUucmV0dXJuVHlwZSwgc3VwZXJ0eXBlLnJldHVyblR5cGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBUZXN0IHRoZSBwYXJhbWV0ZXIgdHlwZXMuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgewogICAgICBEYXJ0VHlwZSBzdXBlcnR5cGVQYXJhbWV0ZXIgPSBzdXBlcnR5cGUucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgIERhcnRUeXBlIHN1YnR5cGVQYXJhbWV0ZXIgPSBzdWJ0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzW2ldOwogICAgICAvLyBUZXJtaW5hdGlvbjogQm90aCB0eXBlcyBzaHJpbmsgaW4gc2l6ZS4KICAgICAgaWYgKCFfaXNTdWJ0eXBlTWF0Y2goc3VwZXJ0eXBlUGFyYW1ldGVyLCBzdWJ0eXBlUGFyYW1ldGVyKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgaW50IHN1YnR5cGVOYW1lSW5kZXggPSAwOwogICAgZm9yIChOYW1lZFR5cGUgc3VwZXJ0eXBlUGFyYW1ldGVyIGluIHN1cGVydHlwZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgd2hpbGUgKHN1YnR5cGVOYW1lSW5kZXggPCBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGggJiYKICAgICAgICAgIHN1YnR5cGUubmFtZWRQYXJhbWV0ZXJzW3N1YnR5cGVOYW1lSW5kZXhdLm5hbWUgIT0KICAgICAgICAgICAgICBzdXBlcnR5cGVQYXJhbWV0ZXIubmFtZSkgewogICAgICAgICsrc3VidHlwZU5hbWVJbmRleDsKICAgICAgfQogICAgICBpZiAoc3VidHlwZU5hbWVJbmRleCA9PSBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVycy5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgTmFtZWRUeXBlIHN1YnR5cGVQYXJhbWV0ZXIgPSBzdWJ0eXBlLm5hbWVkUGFyYW1ldGVyc1tzdWJ0eXBlTmFtZUluZGV4XTsKICAgICAgLy8gVGVybWluYXRpb246IEJvdGggdHlwZXMgc2hyaW5rIGluIHNpemUuCiAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKHN1cGVydHlwZVBhcmFtZXRlci50eXBlLCBzdWJ0eXBlUGFyYW1ldGVyLnR5cGUpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgX2lzSW50ZXJmYWNlU3VidHlwZU1hdGNoKAogICAgICBJbnRlcmZhY2VUeXBlIHN1YnR5cGUsIEludGVyZmFjZVR5cGUgc3VwZXJ0eXBlKSB7CiAgICAvLyBBIHR5cGUgYFA8TTAsIC4uLiwgTWs+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBQPE4wLCAuLi4sIE5rPmAgd2l0aAogICAgLy8gcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYEMwICsgLi4uICsgQ2tgOgogICAgLy8gLSBJZiBgTWlgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYE5pYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyAgIGNvbnN0cmFpbnRzIGBDaWAuCiAgICAvLyBBIHR5cGUgYFA8TTAsIC4uLiwgTWs+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRPE4wLCAuLi4sIE5qPmAgd2l0aAogICAgLy8gcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENgOgogICAgLy8gLSBJZiBgUjxCMCwgLi4uLCBCaj5gIGlzIHRoZSBzdXBlcmNsYXNzIG9mIGBQPE0wLCAuLi4sIE1rPmAgYW5kIGBSPEIwLAogICAgLy8gICAuLi4sIEJqPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUTxOMCwgLi4uLCBOaj5gIHdpdGggcmVzcGVjdCB0byBgTGAKICAgIC8vICAgdW5kZXIgY29uc3RyYWludHMgYENgLgogICAgLy8gLSBPciBgUjxCMCwgLi4uLCBCaj5gIGlzIG9uZSBvZiB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSBgUDxNMCwgLi4uLAogICAgLy8gICBNaz5gIChjb25zaWRlcmVkIGluIGxleGljYWwgb3JkZXIpIGFuZCBgUjxCMCwgLi4uLCBCaj5gIGlzIGEgc3VidHlwZQogICAgLy8gICBtYXRjaCBmb3IgYFE8TjAsIC4uLiwgTmo+YCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYC4KICAgIC8vIC0gT3IgYFI8QjAsIC4uLiwgQmo+YCBpcyBhIG1peGluIGludG8gYFA8TTAsIC4uLiwgTWs+YCAoY29uc2lkZXJlZCBpbgogICAgLy8gICBsZXhpY2FsIG9yZGVyKSBhbmQgYFI8QjAsIC4uLiwgQmo+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRPE4wLCAuLi4sCiAgICAvLyAgIE5qPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2AuCgogICAgLy8gTm90ZSB0aGF0IHNpbmNlIGtlcm5lbCByZXF1aXJlcyB0aGF0IG5vIGNsYXNzIG1heSBvbmx5IGFwcGVhciBpbiB0aGUgc2V0CiAgICAvLyBvZiBzdXBlcnR5cGVzIG9mIGEgZ2l2ZW4gdHlwZSBtb3JlIHRoYW4gb25jZSwgdGhlIG9yZGVyIG9mIHRoZSBjaGVja3MKICAgIC8vIGFib3ZlIGlzIGlycmVsZXZhbnQ7IHdlIGp1c3QgbmVlZCB0byBmaW5kIHRoZSBtYXRjaGVkIHN1cGVyY2xhc3MsCiAgICAvLyBzdWJzdGl0dXRlLCBhbmQgdGhlbiBpdGVyYXRlIHRocm91Z2ggdHlwZSB2YXJpYWJsZXMuCiAgICBMaXN0PERhcnRUeXBlPiBtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50cyA9CiAgICAgICAgZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZihzdWJ0eXBlLCBzdXBlcnR5cGUuY2xhc3NOb2RlKTsKICAgIGlmIChtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVydHlwZS5jbGFzc05vZGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgLy8gR2VuZXJhdGUgY29uc3RyYWludHMgYW5kIHN1YnR5cGUgbWF0Y2ggd2l0aCByZXNwZWN0IHRvIHZhcmlhbmNlLgogICAgICBpbnQgcGFyYW1ldGVyVmFyaWFuY2UgPSBzdXBlcnR5cGUuY2xhc3NOb2RlLnR5cGVQYXJhbWV0ZXJzW2ldLnZhcmlhbmNlOwogICAgICBpZiAocGFyYW1ldGVyVmFyaWFuY2UgPT0gVmFyaWFuY2UuY29udHJhdmFyaWFudCkgewogICAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKHN1cGVydHlwZS50eXBlQXJndW1lbnRzW2ldLAogICAgICAgICAgICBtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50c1tpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVmFyaWFuY2UgPT0gVmFyaWFuY2UuaW52YXJpYW50KSB7CiAgICAgICAgaWYgKCFfaXNTdWJ0eXBlTWF0Y2goc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbaV0sCiAgICAgICAgICAgICAgICBtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50c1tpXSkgfHwKICAgICAgICAgICAgIV9pc1N1YnR5cGVNYXRjaChtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50c1tpXSwKICAgICAgICAgICAgICAgIHN1cGVydHlwZS50eXBlQXJndW1lbnRzW2ldKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIV9pc1N1YnR5cGVNYXRjaChtYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50c1tpXSwKICAgICAgICAgICAgc3VwZXJ0eXBlLnR5cGVBcmd1bWVudHNbaV0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgX2lzTnVsbChEYXJ0VHlwZSB0eXBlKSB7CiAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHdvdWxkIGl0IGJlIGJldHRlciB0byBjYWxsIHRoaXMgIl9pc0JvdHRvbSIsIGFuZCB0byBoYXZlCiAgICAvLyBpdCByZXR1cm4gYHRydWVgIGZvciBib3RoIE51bGwgYW5kIGJvdHRvbSB0eXBlcz8gIFJldmlzaXQgdGhpcyBvbmNlCiAgICAvLyBlbm91Z2ggZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZSBiZWhhdmlvciB3aXRoCiAgICAvLyB0aGUgb2xkIGFuYWx5emVyLWJhc2VkIGltcGxlbWVudGF0aW9uLgogICAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIG51bGxDbGFzcyk7CiAgfQoKICAvLy8gQXR0ZW1wdHMgdG8gbWF0Y2ggW3N1YnR5cGVdIGFzIGEgc3VidHlwZSBvZiBbc3VwZXJ0eXBlXSwgZ2F0aGVyaW5nIGFueQogIC8vLyBjb25zdHJhaW50cyBkaXNjb3ZlcmVkIGluIHRoZSBwcm9jZXNzLgogIC8vLwogIC8vLyBJZiBhIHNldCBvZiBjb25zdHJhaW50cyB3YXMgZm91bmQsIGB0cnVlYCBpcyByZXR1cm5lZCBhbmQgdGhlIGNhbGxlcgogIC8vLyBtYXkgcHJvY2VlZCB0byBjYWxsIFtjb21wdXRlQ29uc3RyYWludHNdLiAgT3RoZXJ3aXNlLCBgZmFsc2VgIGlzIHJldHVybmVkLgogIC8vLwogIC8vLyBJbiB0aGUgY2FzZSB3aGVyZSBgZmFsc2VgIGlzIHJldHVybmVkLCBzb21lIGJvZ3VzIGNvbnN0cmFpbnRzIG1heSBoYXZlCiAgLy8vIGJlZW4gYWRkZWQgdG8gW19wcm90b0NvbnN0cmFpbnRzXS4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bwogIC8vLyBkaXNjYXJkIHRoZW0gaWYgbmVjZXNzYXJ5LgogIGJvb2wgX2lzU3VidHlwZU1hdGNoKERhcnRUeXBlIHN1YnR5cGUsIERhcnRUeXBlIHN1cGVydHlwZSkgewogICAgLy8gVGhlIHVua25vd24gdHlwZSBgP2AgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBgUWAgd2l0aCBubwogICAgLy8gY29uc3RyYWludHMuCiAgICBpZiAoc3VidHlwZSBpcyBVbmtub3duVHlwZSkgcmV0dXJuIHRydWU7CiAgICAvLyBBbnkgdHlwZSBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciB0aGUgdW5rbm93biB0eXBlIGA/YCB3aXRoIG5vCiAgICAvLyBjb25zdHJhaW50cy4KICAgIGlmIChzdXBlcnR5cGUgaXMgVW5rbm93blR5cGUpIHJldHVybiB0cnVlOwogICAgLy8gQSB0eXBlIHZhcmlhYmxlIGBUYCBpbiBgTGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBzY2hlbWEgYFFgOgogICAgLy8gLSBVbmRlciBjb25zdHJhaW50IGBUIDw6IFFgLgogICAgaWYgKHN1YnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBfcGFyYW1ldGVyc1RvQ29uc3RyYWluLmNvbnRhaW5zKHN1YnR5cGUucGFyYW1ldGVyKSkgewogICAgICBfY29uc3RyYWluVXBwZXIoc3VidHlwZS5wYXJhbWV0ZXIsIHN1cGVydHlwZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8gQSB0eXBlIHNjaGVtYSBgUWAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhIHR5cGUgdmFyaWFibGUgYFRgIGluIGBMYDoKICAgIC8vIC0gVW5kZXIgY29uc3RyYWludCBgUSA8OiBUYC4KICAgIGlmIChzdXBlcnR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUgJiYKICAgICAgICBfcGFyYW1ldGVyc1RvQ29uc3RyYWluLmNvbnRhaW5zKHN1cGVydHlwZS5wYXJhbWV0ZXIpKSB7CiAgICAgIF9jb25zdHJhaW5Mb3dlcihzdXBlcnR5cGUucGFyYW1ldGVyLCBzdWJ0eXBlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBBbnkgdHdvIGVxdWFsIHR5cGVzIGBQYCBhbmQgYFFgIGFyZSBzdWJ0eXBlIG1hdGNoZXMgdW5kZXIgbm8gY29uc3RyYWludHMuCiAgICAvLyBOb3RlOiB0byBhdm9pZCBtYWtpbmcgdGhlIGFsZ29yaXRobSBxdWFkcmF0aWMsIHdlIGp1c3QgY2hlY2sgZm9yCiAgICAvLyBpZGVudGljYWwoKS4gIElmIFAgYW5kIFEgYXJlIGVxdWFsIGJ1dCBub3QgaWRlbnRpY2FsLCByZWN1cnNpbmcgdGhyb3VnaAogICAgLy8gdGhlIHR5cGVzIHdpbGwgZ2l2ZSB0aGUgcHJvcGVyIHJlc3VsdC4KICAgIGlmIChpZGVudGljYWwoc3VidHlwZSwgc3VwZXJ0eXBlKSkgcmV0dXJuIHRydWU7CgogICAgLy8gSGFuZGxlIEZ1dHVyZU9yPFQ+IHVuaW9uIHR5cGUuCiAgICBpZiAoc3VidHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1YnR5cGUuY2xhc3NOb2RlLCBmdXR1cmVPckNsYXNzKSkgewogICAgICBEYXJ0VHlwZSBzdWJ0eXBlQXJnID0gc3VidHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICBpZiAoc3VwZXJ0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYKICAgICAgICAgIGlkZW50aWNhbChzdXBlcnR5cGUuY2xhc3NOb2RlLCBmdXR1cmVPckNsYXNzKSkgewogICAgICAgIC8vIGBGdXR1cmVPcjxQPmAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgRnV0dXJlT3I8UT5gIHdpdGggcmVzcGVjdCB0bwogICAgICAgIC8vIGBMYCB1bmRlciBjb25zdHJhaW50cyBgQ2A6CiAgICAgICAgLy8gLSBJZiBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAgIC8vICAgY29uc3RyYWludHMgYENgLgogICAgICAgIERhcnRUeXBlIHN1cGVydHlwZUFyZyA9IHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdOwogICAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goc3VidHlwZUFyZywgc3VwZXJ0eXBlQXJnKTsKICAgICAgfQoKICAgICAgLy8gYEZ1dHVyZU9yPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vIGNvbnN0cmFpbnRzIGBDMCArIEMxYDoKICAgICAgLy8gLSBJZiBgRnV0dXJlPFA+YCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgY29uc3RyYWludHMgYEMwYC4KICAgICAgLy8gLSBBbmQgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIKICAgICAgLy8gICBjb25zdHJhaW50cyBgQzFgLgogICAgICBJbnRlcmZhY2VUeXBlIHN1YnR5cGVGdXR1cmUgPQogICAgICAgICAgZnV0dXJlVHlwZShzdWJ0eXBlQXJnLCBfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICByZXR1cm4gX2lzU3VidHlwZU1hdGNoKHN1YnR5cGVGdXR1cmUsIHN1cGVydHlwZSkgJiYKICAgICAgICAgIF9pc1N1YnR5cGVNYXRjaChzdWJ0eXBlQXJnLCBzdXBlcnR5cGUpICYmCiAgICAgICAgICBuZXcgSXNTdWJ0eXBlT2YuYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXMoc3VidHlwZSwgc3VwZXJ0eXBlKQogICAgICAgICAgICAgIC5pc1N1YnR5cGVXaGVuVXNpbmdOdWxsYWJpbGl0aWVzKCk7CiAgICB9CgogICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgICAgaWRlbnRpY2FsKHN1cGVydHlwZS5jbGFzc05vZGUsIGZ1dHVyZU9yQ2xhc3MpKSB7CiAgICAgIC8vIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBGdXR1cmVPcjxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAvLyBjb25zdHJhaW50cyBgQ2A6CiAgICAgIC8vIC0gSWYgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYEZ1dHVyZTxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgICAvLyAgIGNvbnN0cmFpbnRzIGBDYC4KICAgICAgLy8gLSBPciBgUGAgaXMgbm90IGEgc3VidHlwZSBtYXRjaCBmb3IgYEZ1dHVyZTxRPmAgd2l0aCByZXNwZWN0IHRvIGBMYAogICAgICAvLyAgIHVuZGVyIGNvbnN0cmFpbnRzIGBDYAogICAgICAvLyAgIC0gQW5kIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgICBjb25zdHJhaW50cyBgQ2AKCiAgICAgIC8vIFNpbmNlIEZ1dHVyZU9yPFM+IGlzIGEgdW5pb24gdHlwZSBGdXR1cmU8Uz4gVSBTIHdoZXJlIFUgZGVub3RlcyB0aGUKICAgICAgLy8gdW5pb24gb3BlcmF0aW9uIG9uIHR5cGVzLCBUPyBpcyBUIFUgTnVsbCwgVCBVIFQgPSBULCBTIFUgVCA9IFQgVSBTLCBhbmQKICAgICAgLy8gUyBVIChUIFUgVikgPSAoUyBVIFQpIFUgViwgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgogICAgICAvLwogICAgICAvLyAgIC0gRnV0dXJlT3I8Uz8+ID0gUz8gVSBGdXR1cmU8Uz8+PwogICAgICAvLyAgIC0gRnV0dXJlT3I8Uz4/ID0gUz8gVSBGdXR1cmU8Uz4/CiAgICAgIC8vCiAgICAgIC8vIFRvIGNvbXB1dGUgdGhlIG51bGxhYmlsaXRpZXMgZm9yIHRoZSB0d28gdHlwZXMgaW4gdGhlIHVuaW9uLCB0aGUKICAgICAgLy8gbnVsbGFiaWxpdHkgb2YgdGhlIGFyZ3VtZW50IGFuZCB0aGUgZGVjbGFyZWQgbnVsbGFiaWxpdHkgb2YgRnV0dXJlT3IKICAgICAgLy8gc2hvdWxkIGJlIHVuaXRlZC4gIEFsc28sIGNvbXB1dGVOdWxsYWJpbGl0eSBpcyB1c2VkIHRvIGZldGNoIHRoZQogICAgICAvLyBudWxsYWJpbGl0eSBvZiB0aGUgYXJndW1lbnQgYmVjYXVzZSBpdCBjYW4gYmUgYSBGdXR1cmVPciBpdHNlbGYuCiAgICAgIE51bGxhYmlsaXR5IHVuaXRlZE51bGxhYmlsaXR5ID0gdW5pdGVOdWxsYWJpbGl0aWVzKAogICAgICAgICAgY29tcHV0ZU51bGxhYmlsaXR5KHN1cGVydHlwZS50eXBlQXJndW1lbnRzWzBdLCBmdXR1cmVPckNsYXNzKSwKICAgICAgICAgIHN1cGVydHlwZS5udWxsYWJpbGl0eSk7CiAgICAgIERhcnRUeXBlIHN1cGVydHlwZUFyZyA9CiAgICAgICAgICBzdXBlcnR5cGUudHlwZUFyZ3VtZW50c1swXS53aXRoTnVsbGFiaWxpdHkodW5pdGVkTnVsbGFiaWxpdHkpOwogICAgICBEYXJ0VHlwZSBzdXBlcnR5cGVGdXR1cmUgPSBmdXR1cmVUeXBlKHN1cGVydHlwZUFyZywgdW5pdGVkTnVsbGFiaWxpdHkpOwoKICAgICAgLy8gVGhlIG1hdGNoIGFnYWluc3QgRnV0dXJlT3I8WD4gc3VjY2VlZHMgaWYgdGhlIG1hdGNoIGFnYWluc3QgZWl0aGVyCiAgICAgIC8vIEZ1dHVyZTxYPiBvciBYIHN1Y2NlZWRzLiAgSWYgdGhleSBib3RoIHN1Y2NlZWQsIHRoZSBvbmUgYWRkaW5nIG5ldwogICAgICAvLyBjb25zdHJhaW50cyBzaG91bGQgYmUgcHJlZmVycmVkLiAgSWYgYm90aCBtYXRjaGVzIGFnYWluc3QgRnV0dXJlPFg+IGFuZAogICAgICAvLyBYIGFkZCBuZXcgY29uc3RyYWludHMsIHRoZSBmb3JtZXIgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIHRoZSBsYXR0ZXIuCiAgICAgIGludCBvbGRQcm90b0NvbnN0cmFpbnRzTGVuZ3RoID0gX3Byb3RvQ29uc3RyYWludHMubGVuZ3RoOwogICAgICBib29sIG1hdGNoZXNGdXR1cmUgPSB0cnlTdWJ0eXBlTWF0Y2goc3VidHlwZSwgc3VwZXJ0eXBlRnV0dXJlKTsKICAgICAgYm9vbCBtYXRjaGVzQXJnID0gb2xkUHJvdG9Db25zdHJhaW50c0xlbmd0aCAhPSBfcHJvdG9Db25zdHJhaW50cy5sZW5ndGgKICAgICAgICAgID8gZmFsc2UKICAgICAgICAgIDogX2lzU3VidHlwZU1hdGNoKHN1YnR5cGUsIHN1cGVydHlwZUFyZyk7CiAgICAgIHJldHVybiBtYXRjaGVzRnV0dXJlIHx8IG1hdGNoZXNBcmc7CiAgICB9CgogICAgLy8gQW55IHR5cGUgYFBgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYGR5bmFtaWNgLCBgT2JqZWN0YCwgb3IgYHZvaWRgIHVuZGVyCiAgICAvLyBubyBjb25zdHJhaW50cy4KICAgIGlmIChfaXNUb3Aoc3VwZXJ0eXBlKSkgcmV0dXJuIHRydWU7CiAgICAvLyBgTnVsbGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhbnkgdHlwZSBgUWAgdW5kZXIgbm8gY29uc3RyYWludHMuCiAgICAvLyBOb3RlIHRoYXQgbnVsbGFibGUgdHlwZXMgd2lsbCBjaGFuZ2UgdGhpcy4KICAgIGlmIChfaXNOdWxsKHN1YnR5cGUpKSByZXR1cm4gdHJ1ZTsKCiAgICAvLyBBIHR5cGUgdmFyaWFibGUgYFRgIG5vdCBpbiBgTGAgd2l0aCBib3VuZCBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciB0aGUKICAgIC8vIHNhbWUgdHlwZSB2YXJpYWJsZSBgVGAgd2l0aCBib3VuZCBgUWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgLy8gY29uc3RyYWludHMgYENgOgogICAgLy8gLSBJZiBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBgUWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlciBjb25zdHJhaW50cwogICAgLy8gICBgQ2AuCiAgICBpZiAoc3VidHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSkgewogICAgICBpZiAoc3VwZXJ0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmCiAgICAgICAgICBpZGVudGljYWwoc3VidHlwZS5wYXJhbWV0ZXIsIHN1cGVydHlwZS5wYXJhbWV0ZXIpKSB7CiAgICAgICAgLy8gS2VybmVsIGRvZXNuJ3QgeWV0IGFsbG93IGEgdHlwZSB2YXJpYWJsZSB0byBoYXZlIGRpZmZlcmVudCBib3VuZHMKICAgICAgICAvLyB1bmRlciBkaWZmZXJlbnQgY2lyY3Vtc3RhbmNlcyAoc2VlIGRhcnRidWcuY29tLzI5NTI5KSBzbyBmb3Igbm93IGlmCiAgICAgICAgLy8gd2UgZ2V0IGhlcmUsIHRoZSBib3VuZHMgbXVzdCBiZSB0aGUgc2FtZS4KICAgICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHVwZGF0ZSB0aGlzIGNvZGUgb25jZSBkYXJ0YnVnLmNvbS8yOTUyOSBpcwogICAgICAgIC8vIGFkZHJlc3NlZC4KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBBIHR5cGUgdmFyaWFibGUgYFRgIG5vdCBpbiBgTGAgd2l0aCBib3VuZCBgUGAgaXMgYSBzdWJ0eXBlIG1hdGNoIGZvciBhCiAgICAgIC8vIHR5cGUgYFFgIHdpdGggcmVzcGVjdCB0byBgTGAgdW5kZXIgY29uc3RyYWludHMgYENgOgogICAgICAvLyAtIElmIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAgIC8vICAgY29uc3RyYWludHMgYENgLgogICAgICByZXR1cm4gX2lzU3VidHlwZU1hdGNoKHN1YnR5cGUucGFyYW1ldGVyLmJvdW5kLCBzdXBlcnR5cGUpOwogICAgfQogICAgaWYgKHN1YnR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBzdXBlcnR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICByZXR1cm4gX2lzSW50ZXJmYWNlU3VidHlwZU1hdGNoKHN1YnR5cGUsIHN1cGVydHlwZSk7CiAgICB9CiAgICBpZiAoc3VidHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKHN1cGVydHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aWNhbChzdXBlcnR5cGUuY2xhc3NOb2RlLCBmdW5jdGlvbkNsYXNzKSB8fAogICAgICAgICAgICBpZGVudGljYWwoc3VwZXJ0eXBlLmNsYXNzTm9kZSwgb2JqZWN0Q2xhc3MpOwogICAgICB9IGVsc2UgaWYgKHN1cGVydHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKICAgICAgICByZXR1cm4gX2lzRnVuY3Rpb25TdWJ0eXBlTWF0Y2goc3VidHlwZSwgc3VwZXJ0eXBlKTsKICAgICAgfQogICAgfQogICAgLy8gQSB0eXBlIGBQYCBpcyBhIHN1YnR5cGUgbWF0Y2ggZm9yIGEgdHlwZSBgUWAgd2l0aCByZXNwZWN0IHRvIGBMYCB1bmRlcgogICAgLy8gY29uc3RyYWludHMgYENgOgogICAgLy8gLSBJZiBgUGAgaXMgYW4gaW50ZXJmYWNlIHR5cGUgd2hpY2ggaW1wbGVtZW50cyBhIGNhbGwgbWV0aG9kIG9mIHR5cGUgYEZgLAogICAgLy8gICBhbmQgYEZgIGlzIGEgc3VidHlwZSBtYXRjaCBmb3IgYSB0eXBlIGBRYCB3aXRoIHJlc3BlY3QgdG8gYExgIHVuZGVyCiAgICAvLyAgIGNvbnN0cmFpbnRzIGBDYC4KICAgIGlmIChzdWJ0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgTWVtYmVyIGNhbGxNZW1iZXIgPSBnZXRJbnRlcmZhY2VNZW1iZXIoc3VidHlwZS5jbGFzc05vZGUsIGNhbGxOYW1lKTsKICAgICAgaWYgKGNhbGxNZW1iZXIgaXMgUHJvY2VkdXJlICYmICFjYWxsTWVtYmVyLmlzR2V0dGVyKSB7CiAgICAgICAgRGFydFR5cGUgY2FsbFR5cGUgPSBjYWxsTWVtYmVyLmdldHRlclR5cGU7CiAgICAgICAgaWYgKGNhbGxUeXBlICE9IG51bGwpIHsKICAgICAgICAgIGNhbGxUeXBlID0KICAgICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbUludGVyZmFjZVR5cGUoc3VidHlwZSkuc3Vic3RpdHV0ZVR5cGUoY2FsbFR5cGUpOwogICAgICAgICAgLy8gVE9ETyhrbWlsbGlraW4pOiBUaGUgc3VidHlwZSBjaGVjayB3aWxsIGZhaWwgaWYgdGhlIHR5cGUgb2YgYQogICAgICAgICAgLy8gZ2VuZXJpYyBjYWxsIG1ldGhvZCBpcyBhIHN1YnR5cGUgb2YgYSBub24tZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLgogICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIGBUIGNhbGw8VD4oVCBhcmcpYCBpcyBhIHN1YnR5cGUgb2YgYFMtPlNgIGZvciBzb21lCiAgICAgICAgICAvLyBTLiAgSG93ZXZlciwgZXhwbGljaXRseSB0ZWFyaW5nIG9mZiB0aGF0IGNhbGwgbWV0aG9kIHdpbGwgd29yayBhbmQKICAgICAgICAgIC8vIGluc2VydCBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uLCBzbyB0aGUgaW1wbGljaXQgdGVhciBvZmYgc2hvdWxkCiAgICAgICAgICAvLyB3b3JrIGFzIHdlbGwuICBGaWd1cmUgb3V0IGhvdyB0byBzdXBwb3J0IHRoaXMgY2FzZS4KICAgICAgICAgIHJldHVybiBfaXNTdWJ0eXBlTWF0Y2goY2FsbFR5cGUsIHN1cGVydHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIF9pc1RvcChEYXJ0VHlwZSB0eXBlKSA9PgogICAgICB0eXBlIGlzIER5bmFtaWNUeXBlIHx8CiAgICAgIHR5cGUgaXMgVm9pZFR5cGUgfHwKICAgICAgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiBpZGVudGljYWwodHlwZS5jbGFzc05vZGUsIG9iamVjdENsYXNzKSk7CgogIC8vLyBHaXZlbiB0d28gbGlzdHMgb2YgZnVuY3Rpb24gdHlwZSBmb3JtYWwgcGFyYW1ldGVycywgY2hlY2tzIHRoYXQgdGhlaXIKICAvLy8gYm91bmRzIGFyZSBjb21wYXRpYmxlLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgbWF0Y2ggd2FzIGZvdW5kLiAgSWYgaXQgd2FzLCBlbnRyaWVzCiAgLy8vIGFyZSBhZGRlZCB0byBbc3Vic3RpdHV0aW9uMV0gYW5kIFtzdWJzdGl0dXRpb24yXSB3aGljaCBzdWJzdGl0dXRlIGEgZnJlc2gKICAvLy8gc2V0IG9mIHR5cGUgdmFyaWFibGVzIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXJzIFtwYXJhbXMxXSBhbmQgW3BhcmFtczJdLAogIC8vLyByZXNwZWN0aXZlbHksIGFsbG93aW5nIGZ1cnRoZXIgY29tcGFyaXNvbi4KICBib29sIF9tYXRjaFR5cGVGb3JtYWxzKAogICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHBhcmFtczEsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1zMiwKICAgICAgTWFwPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiBzdWJzdGl0dXRpb24xLAogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHN1YnN0aXR1dGlvbjIsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZnJlc2hUeXBlVmFyaWFibGVzKSB7CiAgICBhc3NlcnQocGFyYW1zMS5sZW5ndGggPT0gcGFyYW1zMi5sZW5ndGgpOwogICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpbiBpbWl0YXRpb24gb2YgYW5hbHl6ZXIsIHdlJ3JlIGNoZWNraW5nIHRoZSBib3VuZHMgYXMKICAgIC8vIHdlIGJ1aWxkIHVwIHRoZSBzdWJzdGl0dXRpb25zLiAgQnV0IEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGNvcnJlY3QtLUkgdGhpbmsKICAgIC8vIHdlIHNob3VsZCBidWlsZCB1cCBib3RoIHN1YnN0aXR1dGlvbnMgY29tcGxldGVseSBiZWZvcmUgY2hlY2tpbmcgYW55CiAgICAvLyBib3VuZHMuICBTZWUgZGFydGJ1Zy5jb20vMjk2MjkuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtczEubGVuZ3RoOyArK2kpIHsKICAgICAgVHlwZVBhcmFtZXRlciBwRnJlc2ggPSBuZXcgVHlwZVBhcmFtZXRlcihwYXJhbXMyW2ldLm5hbWUpOwogICAgICBmcmVzaFR5cGVWYXJpYWJsZXMuYWRkKHBGcmVzaCk7CiAgICAgIERhcnRUeXBlIHZhcmlhYmxlRnJlc2ggPQogICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcocGFyYW1zMltpXSwgcEZyZXNoKTsKICAgICAgc3Vic3RpdHV0aW9uMVtwYXJhbXMxW2ldXSA9IHZhcmlhYmxlRnJlc2g7CiAgICAgIHN1YnN0aXR1dGlvbjJbcGFyYW1zMltpXV0gPSB2YXJpYWJsZUZyZXNoOwogICAgICBEYXJ0VHlwZSBib3VuZDEgPSBzdWJzdGl0dXRlKHBhcmFtczFbaV0uYm91bmQsIHN1YnN0aXR1dGlvbjEpOwogICAgICBEYXJ0VHlwZSBib3VuZDIgPSBzdWJzdGl0dXRlKHBhcmFtczJbaV0uYm91bmQsIHN1YnN0aXR1dGlvbjIpOwogICAgICBwRnJlc2guYm91bmQgPSBib3VuZDI7CiAgICAgIGlmICghX2lzU3VidHlwZU1hdGNoKGJvdW5kMiwgYm91bmQxKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyIGV4dGVuZHMgVHlwZUNvbnN0cmFpbnRHYXRoZXJlciB7CiAgZmluYWwgVHlwZVNjaGVtYUVudmlyb25tZW50IGVudmlyb25tZW50OwoKICBUeXBlU2NoZW1hQ29uc3RyYWludEdhdGhlcmVyKHRoaXMuZW52aXJvbm1lbnQsCiAgICAgIEl0ZXJhYmxlPFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5KQogICAgICA6IHN1cGVyLnN1YmNsYXNzaW5nKHR5cGVQYXJhbWV0ZXJzLCBjdXJyZW50TGlicmFyeSk7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBvYmplY3RDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMub2JqZWN0Q2xhc3M7CgogIEBvdmVycmlkZQogIENsYXNzIGdldCBmdW5jdGlvbkNsYXNzID0+IGVudmlyb25tZW50LmNvcmVUeXBlcy5mdW5jdGlvbkNsYXNzOwoKICBAb3ZlcnJpZGUKICBDbGFzcyBnZXQgZnV0dXJlT3JDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMuZnV0dXJlT3JDbGFzczsKCiAgQG92ZXJyaWRlCiAgQ2xhc3MgZ2V0IG51bGxDbGFzcyA9PiBlbnZpcm9ubWVudC5jb3JlVHlwZXMubnVsbENsYXNzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFVwcGVyQm91bmQoCiAgICAgIFR5cGVDb25zdHJhaW50IGNvbnN0cmFpbnQsIERhcnRUeXBlIHVwcGVyLCBMaWJyYXJ5IGNsaWVudExpYnJhcnkpIHsKICAgIGVudmlyb25tZW50LmFkZFVwcGVyQm91bmQoY29uc3RyYWludCwgdXBwZXIsIGNsaWVudExpYnJhcnkpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBhZGRMb3dlckJvdW5kKAogICAgICBUeXBlQ29uc3RyYWludCBjb25zdHJhaW50LCBEYXJ0VHlwZSBsb3dlciwgTGlicmFyeSBjbGllbnRMaWJyYXJ5KSB7CiAgICBlbnZpcm9ubWVudC5hZGRMb3dlckJvdW5kKGNvbnN0cmFpbnQsIGxvd2VyLCBjbGllbnRMaWJyYXJ5KTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXRJbnRlcmZhY2VNZW1iZXIoQ2xhc3MgY2xhc3NfLCBOYW1lIG5hbWUsIHtib29sIHNldHRlcjogZmFsc2V9KSB7CiAgICByZXR1cm4gZW52aXJvbm1lbnQuaGllcmFyY2h5CiAgICAgICAgLmdldEludGVyZmFjZU1lbWJlcihjbGFzc18sIG5hbWUsIHNldHRlcjogc2V0dGVyKTsKICB9CgogIEBvdmVycmlkZQogIEludGVyZmFjZVR5cGUgZ2V0VHlwZUFzSW5zdGFuY2VPZihJbnRlcmZhY2VUeXBlIHR5cGUsIENsYXNzIHN1cGVyY2xhc3MsCiAgICAgIExpYnJhcnkgY2xpZW50TGlicmFyeSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgcmV0dXJuIGVudmlyb25tZW50LmdldFR5cGVBc0luc3RhbmNlT2YoCiAgICAgICAgdHlwZSwgc3VwZXJjbGFzcywgY2xpZW50TGlicmFyeSwgY29yZVR5cGVzKTsKICB9CgogIEBvdmVycmlkZQogIExpc3Q8RGFydFR5cGU+IGdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YoCiAgICAgIEludGVyZmFjZVR5cGUgdHlwZSwgQ2xhc3Mgc3VwZXJjbGFzcykgewogICAgcmV0dXJuIGVudmlyb25tZW50LmdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YodHlwZSwgc3VwZXJjbGFzcyk7CiAgfQoKICBAb3ZlcnJpZGUKICBJbnRlcmZhY2VUeXBlIGZ1dHVyZVR5cGUoRGFydFR5cGUgdHlwZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKICAgIHJldHVybiBlbnZpcm9ubWVudC5mdXR1cmVUeXBlKHR5cGUsIG51bGxhYmlsaXR5KTsKICB9Cn0KCi8vLyBUcmFja3MgYSBzaW5nbGUgY29uc3RyYWludCBvbiBhIHNpbmdsZSB0eXBlIHZhcmlhYmxlLgovLy8KLy8vIFRoaXMgaXMgY2FsbGVkICJfUHJvdG9Db25zdHJhaW50IiB0byBkaXN0aW5ndWlzaCBmcm9tIFtUeXBlQ29uc3RyYWludF0sCi8vLyB3aGljaCB0cmFja3MgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgdGhhdCBhcmUgdG9nZXRoZXIgaW1wbGllZCBieSBhIHNldAovLy8gb2YgW19Qcm90b0NvbnN0cmFpbnRdcy4KY2xhc3MgX1Byb3RvQ29uc3RyYWludCB7CiAgZmluYWwgVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXI7CgogIGZpbmFsIERhcnRUeXBlIGJvdW5kOwoKICBmaW5hbCBib29sIGlzVXBwZXI7CgogIF9Qcm90b0NvbnN0cmFpbnQubG93ZXIodGhpcy5wYXJhbWV0ZXIsIHRoaXMuYm91bmQpIDogaXNVcHBlciA9IGZhbHNlOwoKICBfUHJvdG9Db25zdHJhaW50LnVwcGVyKHRoaXMucGFyYW1ldGVyLCB0aGlzLmJvdW5kKSA6IGlzVXBwZXIgPSB0cnVlOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gaXNVcHBlcgogICAgICAgID8gIiR7cGFyYW1ldGVyLm5hbWV9IDw6ICRib3VuZCIKICAgICAgICA6ICIkYm91bmQgPDogJHtwYXJhbWV0ZXIubmFtZX0iOwogIH0KfQqCJABNTj8BIQkPEhUWFxEQDhMVExcbEhIBKQFJAS8BLAEsASYBGwEnAVBGKDIBNAEhAUoyJkQ6AURILTYEARkBGwEbARcBFkkBFkkBTAFKMwEvLQFEAT1RMCs+MAZCJVAcD1AcCAYTBAE0Bk1OID8+OBQ8BhQEAUJJBAFCSQQBT0xOPE4aI08oSyhMSkJLUS5NJU0UBi4xFAZMFAYtOSc7J0JPTRYIASY9KEEGAR4tRhQGASFGR0MxRBYIBh5GQjwpHAhMTjFOFggGEQQBIThMOUcbTC1OTyBRTk9NUDkBUE1JPDlEQ0pKTjk5NxgKPDk7RS8YCg9FKxgKCAYRBAEgUUtRLkoEAU0tBktRBk1PIT9IFC1IFC9OJCg+NRMGTCQqQDUTBlFITy40ASYkNzYoO04mSR48OggBTCBPHUgdJD86NEkyBgEmOUwaTxxNIUodAU1ROwktLAlKTkpKOkkiHklOAUxMUVBARk4SNCoGAVAXKEgyJwFQRxhRDigsP01PNUcWFQhQPUccQgZCOwYjKEA5LjwIBk4YUU0aJEs9MyAVUEtOUFBPQTcKCAYSBAEgHRpJAUwdBlBQTTEaIyMyMjAuT1FMJy9BJh9GMTFFRR06BhEEAgFEKwExRjsBDD4BDEIBDEIBDDoBDBZKQQQBDBZKQQQBDE0hOwQBDEo0LDUEAQwvLkcEAQxFNgQCAToETE8cGSEBGAEWAUgBRwEWEygpBAIBSHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydHNmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX3NjaGVtYV9lbGltaW5hdGlvbi5kYXJ0jIMvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFLm1kIGZpbGUuCgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JyBoaWRlIE1hcEVudHJ5OwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NvcmVfdHlwZXMuZGFydCcgc2hvdyBDb3JlVHlwZXM7CmltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL3JlcGxhY2VtZW50X3Zpc2l0b3IuZGFydCc7CgppbXBvcnQgJ3R5cGVfc2NoZW1hLmRhcnQnIHNob3cgVW5rbm93blR5cGU7CgovLy8gUmV0dXJucyB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBbc2NoZW1hXSB3aXRoIHJlc3BlY3QgdG8gYD9gLgovLy8KLy8vIFRoZSBncmVhdGVzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgYFBgIHdpdGggcmVzcGVjdCB0byBgP2AgaXMgZGVmaW5lZCBhcwovLy8gYFBgIHdpdGggZXZlcnkgY292YXJpYW50IG9jY3VycmVuY2Ugb2YgYD9gIHJlcGxhY2VkIHdpdGggYE51bGxgLCBhbmQgZXZlcnkKLy8vIGNvbnRyYXZhcmlhbnQgb2NjdXJyZW5jZSBvZiBgP2AgcmVwbGFjZWQgd2l0aCBgT2JqZWN0YC4KLy8vCi8vLyBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIG5vIGluc3RhbmNlcyBvZiBgP2AsIHRoZSBvcmlnaW5hbCBzY2hlbWEgb2JqZWN0IGlzCi8vLyByZXR1cm5lZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uLgovLy8KLy8vIE5vdGUgdGhhdCB0aGUgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGlzIGEgcHJvcGVyIHR5cGUuCi8vLwovLy8gTm90ZSB0aGF0IHRoZSBncmVhdGVzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYWx3YXlzIGEgc3VwZXJ0eXBlIG9mIGFueQovLy8gdHlwZSB3aGljaCBtYXRjaGVzIHRoZSBzY2hlbWEuCkRhcnRUeXBlIGdyZWF0ZXN0Q2xvc3VyZShDb3JlVHlwZXMgY29yZVR5cGVzLCBEYXJ0VHlwZSBzY2hlbWEpID0+CiAgICBfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvci5ydW4oY29yZVR5cGVzLCBmYWxzZSwgc2NoZW1hKTsKCi8vLyBSZXR1cm5zIHRoZSBsZWFzdCBjbG9zdXJlIG9mIHRoZSBnaXZlbiB0eXBlIFtzY2hlbWFdIHdpdGggcmVzcGVjdCB0byBgP2AuCi8vLwovLy8gVGhlIGxlYXN0IGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBgUGAgd2l0aCByZXNwZWN0IHRvIGA/YCBpcyBkZWZpbmVkIGFzCi8vLyBgUGAgd2l0aCBldmVyeSBjb3ZhcmlhbnQgb2NjdXJyZW5jZSBvZiBgP2AgcmVwbGFjZWQgd2l0aCBgT2JqZWN0YCwgYW5kIGV2ZXJ5Ci8vLyBjb250cmF2YXJpYW50IG9jY3VycmVuY2Ugb2YgYD9gIHJlcGxhY2VkIHdpdGggYE51bGxgLgovLy8KLy8vIElmIHRoZSBzY2hlbWEgY29udGFpbnMgbm8gaW5zdGFuY2VzIG9mIGA/YCwgdGhlIG9yaWdpbmFsIHNjaGVtYSBvYmplY3QgaXMKLy8vIHJldHVybmVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFsbG9jYXRpb24uCi8vLwovLy8gTm90ZSB0aGF0IHRoZSBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYSBwcm9wZXIgdHlwZS4KLy8vCi8vLyBOb3RlIHRoYXQgdGhlIGxlYXN0IGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBpcyBhbHdheXMgYSBzdWJ0eXBlIG9mIGFueSB0eXBlCi8vLyB3aGljaCBtYXRjaGVzIHRoZSBzY2hlbWEuCkRhcnRUeXBlIGxlYXN0Q2xvc3VyZShDb3JlVHlwZXMgY29yZVR5cGVzLCBEYXJ0VHlwZSBzY2hlbWEpID0+CiAgICBfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvci5ydW4oY29yZVR5cGVzLCB0cnVlLCBzY2hlbWEpOwoKLy8vIFZpc2l0b3IgdGhhdCBjb21wdXRlcyBsZWFzdCBhbmQgZ3JlYXRlc3QgY2xvc3VyZXMgb2YgYSB0eXBlIHNjaGVtYS4KLy8vCi8vLyBFYWNoIHZpc2l0b3IgbWV0aG9kIHJldHVybnMgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBgP2BzIGNvbnRhaW5lZCBpbiB0aGUKLy8vIHR5cGUsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3Vic3RpdHV0aW5nIGA/YCB3aXRoIGBOdWxsYCBvcgovLy8gYE9iamVjdGAsIGFzIGFwcHJvcHJpYXRlLgpjbGFzcyBfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvciBleHRlbmRzIFJlcGxhY2VtZW50VmlzaXRvciB7CiAgZmluYWwgRGFydFR5cGUgbnVsbFR5cGU7CgogIGJvb2wgaXNMZWFzdENsb3N1cmU7CgogIF9UeXBlU2NoZW1hRWxpbWluYXRpb25WaXNpdG9yKENvcmVUeXBlcyBjb3JlVHlwZXMsIHRoaXMuaXNMZWFzdENsb3N1cmUpCiAgICAgIDogbnVsbFR5cGUgPSBjb3JlVHlwZXMubnVsbFR5cGU7CgogIHZvaWQgY2hhbmdlVmFyaWFuY2UoKSB7CiAgICBpc0xlYXN0Q2xvc3VyZSA9ICFpc0xlYXN0Q2xvc3VyZTsKICB9CgogIEBvdmVycmlkZQogIERhcnRUeXBlIGRlZmF1bHREYXJ0VHlwZShEYXJ0VHlwZSBub2RlKSB7CiAgICBpZiAobm9kZSBpcyBVbmtub3duVHlwZSkgewogICAgICByZXR1cm4gaXNMZWFzdENsb3N1cmUgPyBudWxsVHlwZSA6IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSdW5zIGFuIGluc3RhbmNlIG9mIHRoZSB2aXNpdG9yIG9uIHRoZSBnaXZlbiBbc2NoZW1hXSBhbmQgcmV0dXJucyB0aGUKICAvLy8gcmVzdWx0aW5nIHR5cGUuICBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIG5vIGluc3RhbmNlcyBvZiBgP2AsIHRoZSBvcmlnaW5hbAogIC8vLyBzY2hlbWEgb2JqZWN0IGlzIHJldHVybmVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFsbG9jYXRpb24uCiAgc3RhdGljIERhcnRUeXBlIHJ1bigKICAgICAgQ29yZVR5cGVzIGNvcmVUeXBlcywgYm9vbCBpc0xlYXN0Q2xvc3VyZSwgRGFydFR5cGUgc2NoZW1hKSB7CiAgICBfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvciB2aXNpdG9yID0KICAgICAgICBuZXcgX1R5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IoY29yZVR5cGVzLCBpc0xlYXN0Q2xvc3VyZSk7CiAgICBEYXJ0VHlwZSByZXN1bHQgPSBzY2hlbWEuYWNjZXB0KHZpc2l0b3IpOwogICAgYXNzZXJ0KHZpc2l0b3IuaXNMZWFzdENsb3N1cmUgPT0gaXNMZWFzdENsb3N1cmUpOwogICAgcmV0dXJuIHJlc3VsdCA/PyBzY2hlbWE7CiAgfQp9ClEATU4/ATA4NgEsAVEEUE88BE4uBD0EUSNCQQFOBE1ROgROLgQ9BFEeP0ABSARNTR5BGwEXAUonARomBAEMLB8+BhEEAUxQQRdDLEYuNh0EAgFHcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2VsaW1pbmF0aW9uLmRhcnRhZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3NjYW5uZXIvaW50ZXJuZXIuZGFydILhLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8qKgogKiBUaGUgaW50ZXJmYWNlIGBJbnRlcm5lcmAgZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2Ygb2JqZWN0cyB0aGF0IGNhbiBpbnRlcm4KICogc3RyaW5ncy4KICovCmFic3RyYWN0IGNsYXNzIEludGVybmVyIHsKICAvKioKICAgKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCBpcyBpZGVudGljYWwgdG8gYWxsIG9mIHRoZSBvdGhlciBzdHJpbmdzIHRoYXQgaGF2ZQogICAqIGJlZW4gaW50ZXJuZWQgdGhhdCBhcmUgZXF1YWwgdG8gdGhlIGdpdmVuIFtzdHJpbmddLgogICAqLwogIFN0cmluZyBpbnRlcm4oU3RyaW5nIHN0cmluZyk7Cn0KCi8qKgogKiBUaGUgY2xhc3MgYE51bGxJbnRlcm5lcmAgaW1wbGVtZW50cyBhbiBpbnRlcm5lciB0aGF0IGRvZXMgbm90aGluZyAoZG9lcyBub3QKICogYWN0dWFsbHkgaW50ZXJuIGFueSBzdHJpbmdzKS4KICovCmNsYXNzIE51bGxJbnRlcm5lciBpbXBsZW1lbnRzIEludGVybmVyIHsKICBAb3ZlcnJpZGUKICBTdHJpbmcgaW50ZXJuKFN0cmluZyBzdHJpbmcpID0+IHN0cmluZzsKfQoaAE5OPAEETAwEGgZNOQYgAgEETyEEKQwqAgE1cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL2ludGVybmVyLmRhcnRbZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi90ZXh0L3NlcmlhbGl6ZXJfY29tYmluYXRvcnMuZGFydMAAQTQvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBrZXJuZWwuc2VyaWFsaXplcl9jb21iaW5hdG9yczsKCmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IGpzb247CgppbXBvcnQgJy4uL2FzdC5kYXJ0JyBzaG93IE5vZGU7CmltcG9ydCAnLi4vY2Fub25pY2FsX25hbWUuZGFydCcgc2hvdyBDYW5vbmljYWxOYW1lOwppbXBvcnQgJ3RleHRfc2VyaWFsaXplci5kYXJ0JyBzaG93IFRhZ2dlcjsKCmNsYXNzIERlc2VyaWFsaXphdGlvbkVudmlyb25tZW50PFQgZXh0ZW5kcyBOb2RlPiB7CiAgZmluYWwgRGVzZXJpYWxpemF0aW9uRW52aXJvbm1lbnQ8VD4gcGFyZW50OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBUPiBsb2NhbHMgPSA8U3RyaW5nLCBUPnt9OwoKICBmaW5hbCBNYXA8U3RyaW5nLCBUPiBiaW5kZXJzID0gPFN0cmluZywgVD57fTsKCiAgZmluYWwgU2V0PFN0cmluZz4gdXNlZE5hbWVzOwoKICBEZXNlcmlhbGl6YXRpb25FbnZpcm9ubWVudCh0aGlzLnBhcmVudCkKICAgICAgOiB1c2VkTmFtZXMgPSBwYXJlbnQ/LnVzZWROYW1lcz8udG9TZXQoKSA/PyBuZXcgU2V0PFN0cmluZz4oKTsKCiAgVCBsb29rdXAoU3RyaW5nIG5hbWUpID0+IGxvY2Fsc1tuYW1lXSA/PyBwYXJlbnQ/Lmxvb2t1cChuYW1lKTsKCiAgVCBhZGRCaW5kZXIoU3RyaW5nIG5hbWUsIFQgbm9kZSkgewogICAgaWYgKHVzZWROYW1lcy5jb250YWlucyhuYW1lKSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJuYW1lICckbmFtZScgaXMgYWxyZWFkeSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlIik7CiAgICB9CiAgICB1c2VkTmFtZXMuYWRkKG5hbWUpOwogICAgcmV0dXJuIGJpbmRlcnNbbmFtZV0gPSBub2RlOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIGxvY2Fscy5hZGRBbGwoYmluZGVycyk7CiAgICBiaW5kZXJzLmNsZWFyKCk7CiAgfQp9CgpjbGFzcyBTZXJpYWxpemF0aW9uRW52aXJvbm1lbnQ8VCBleHRlbmRzIE5vZGU+IHsKICBmaW5hbCBTZXJpYWxpemF0aW9uRW52aXJvbm1lbnQ8VD4gcGFyZW50OwoKICBmaW5hbCBNYXA8VCwgU3RyaW5nPiBsb2NhbHMgPSBuZXcgTWFwPFQsIFN0cmluZz4uaWRlbnRpdHkoKTsKCiAgZmluYWwgTWFwPFQsIFN0cmluZz4gYmluZGVycyA9IG5ldyBNYXA8VCwgU3RyaW5nPi5pZGVudGl0eSgpOwoKICBpbnQgbmFtZUNvdW50OwoKICBTZXJpYWxpemF0aW9uRW52aXJvbm1lbnQodGhpcy5wYXJlbnQpIDogbmFtZUNvdW50ID0gcGFyZW50Py5uYW1lQ291bnQgPz8gMDsKCiAgU3RyaW5nIGxvb2t1cChUIG5vZGUpID0+IGxvY2Fsc1tub2RlXSA/PyBwYXJlbnQ/Lmxvb2t1cChub2RlKTsKCiAgU3RyaW5nIGFkZEJpbmRlcihUIG5vZGUsIFN0cmluZyBuYW1lKSB7CiAgICBmaW5hbCBTdHJpbmcgc2VwYXJhdG9yID0gIl4iOwogICAgZmluYWwgaW50IGNvZGVPZlplcm8gPSAiMCIuY29kZVVuaXRBdCgwKTsKICAgIGZpbmFsIGludCBjb2RlT2ZOaW5lID0gIjkiLmNvZGVVbml0QXQoMCk7CgogICAgaW50IHByZWZpeExlbmd0aCA9IG5hbWUubGVuZ3RoIC0gMTsKICAgIGJvb2wgaXNPbmx5RGlnaXRzID0gdHJ1ZTsKICAgIHdoaWxlIChwcmVmaXhMZW5ndGggPj0gMCAmJiBuYW1lW3ByZWZpeExlbmd0aF0gIT0gc2VwYXJhdG9yKSB7CiAgICAgIGludCBjb2RlID0gbmFtZS5jb2RlVW5pdEF0KHByZWZpeExlbmd0aCk7CiAgICAgIGlzT25seURpZ2l0cyA9IGlzT25seURpZ2l0cyAmJiAoY29kZU9mWmVybyA8PSBjb2RlICYmIGNvZGUgPD0gY29kZU9mTmluZSk7CiAgICAgIC0tcHJlZml4TGVuZ3RoOwogICAgfQogICAgaWYgKHByZWZpeExlbmd0aCA8IDAgfHwgIWlzT25seURpZ2l0cykgewogICAgICBwcmVmaXhMZW5ndGggPSBuYW1lLmxlbmd0aDsKICAgIH0KICAgIFN0cmluZyBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBwcmVmaXhMZW5ndGgpOwogICAgcmV0dXJuIGJpbmRlcnNbbm9kZV0gPSAiJHByZWZpeCRzZXBhcmF0b3Ike25hbWVDb3VudCsrfSI7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgbG9jYWxzLmFkZEFsbChiaW5kZXJzKTsKICAgIGJpbmRlcnMuY2xlYXIoKTsKICB9Cn0KCmNsYXNzIERlc2VyaWFsaXphdGlvblN0YXRlIHsKICBmaW5hbCBEZXNlcmlhbGl6YXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKICBmaW5hbCBDYW5vbmljYWxOYW1lIG5hbWVSb290OwoKICBEZXNlcmlhbGl6YXRpb25TdGF0ZSh0aGlzLmVudmlyb25tZW50LCB0aGlzLm5hbWVSb290KTsKfQoKY2xhc3MgU2VyaWFsaXphdGlvblN0YXRlIHsKICBmaW5hbCBTZXJpYWxpemF0aW9uRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7CgogIFNlcmlhbGl6YXRpb25TdGF0ZSh0aGlzLmVudmlyb25tZW50KTsKfQoKYWJzdHJhY3QgY2xhc3MgVGV4dFNlcmlhbGl6ZXI8VD4gewogIGNvbnN0IFRleHRTZXJpYWxpemVyKCk7CgogIFQgcmVhZEZyb20oSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0sIERlc2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKTsKICB2b2lkIHdyaXRlVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVCBvYmplY3QsIFNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSk7CgogIC8vLyBUcnVlIGlmIHRoaXMgc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIgd3JpdGVzL3JlYWRzIG5vdGhpbmcuICBUaGlzIGlzIHRydWUKICAvLy8gZm9yIHRoZSBzZXJpYWxpemVyIFtOb3RoaW5nXSBhbmQgYWxzbyBzb21lIHNlcmlhbGl6ZXJzIGRlcml2ZWQgZnJvbSBpdC4KICBib29sIGdldCBpc0VtcHR5ID0+IGZhbHNlOwp9CgpjbGFzcyBOb3RoaW5nIGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8dm9pZD4gewogIGNvbnN0IE5vdGhpbmcoKTsKCiAgdm9pZCByZWFkRnJvbShJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgXykge30KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIHZvaWQgaWdub3JlZCwgU2VyaWFsaXphdGlvblN0YXRlIF8pIHt9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gdHJ1ZTsKfQoKY2xhc3MgRGFydFN0cmluZyBleHRlbmRzIFRleHRTZXJpYWxpemVyPFN0cmluZz4gewogIGNvbnN0IERhcnRTdHJpbmcoKTsKCiAgU3RyaW5nIHJlYWRGcm9tKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtLCBEZXNlcmlhbGl6YXRpb25TdGF0ZSBfKSB7CiAgICBpZiAoc3RyZWFtLmN1cnJlbnQgaXMhIFN0cmluZykgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJleHBlY3RlZCBhbiBhdG9tLCBmb3VuZCBhIGxpc3QiKTsKICAgIH0KICAgIFN0cmluZyByZXN1bHQgPSBqc29uLmRlY29kZShzdHJlYW0uY3VycmVudCk7CiAgICBzdHJlYW0ubW92ZU5leHQoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHdyaXRlVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIG9iamVjdCwgU2VyaWFsaXphdGlvblN0YXRlIF8pIHsKICAgIGJ1ZmZlci53cml0ZShqc29uLmVuY29kZShvYmplY3QpKTsKICB9Cn0KCmNsYXNzIERhcnRJbnQgZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxpbnQ+IHsKICBjb25zdCBEYXJ0SW50KCk7CgogIGludCByZWFkRnJvbShJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgXykgewogICAgaWYgKHN0cmVhbS5jdXJyZW50IGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiZXhwZWN0ZWQgYW4gYXRvbSwgZm91bmQgYSBsaXN0Iik7CiAgICB9CiAgICBpbnQgcmVzdWx0ID0gaW50LnBhcnNlKHN0cmVhbS5jdXJyZW50KTsKICAgIHN0cmVhbS5tb3ZlTmV4dCgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgd3JpdGVUbyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgb2JqZWN0LCBTZXJpYWxpemF0aW9uU3RhdGUgXykgewogICAgYnVmZmVyLndyaXRlKG9iamVjdCk7CiAgfQp9CgpjbGFzcyBEYXJ0RG91YmxlIGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8ZG91YmxlPiB7CiAgY29uc3QgRGFydERvdWJsZSgpOwoKICBkb3VibGUgcmVhZEZyb20oSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0sIERlc2VyaWFsaXphdGlvblN0YXRlIF8pIHsKICAgIGlmIChzdHJlYW0uY3VycmVudCBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoImV4cGVjdGVkIGFuIGF0b20sIGZvdW5kIGEgbGlzdCIpOwogICAgfQogICAgZG91YmxlIHJlc3VsdCA9IGRvdWJsZS5wYXJzZShzdHJlYW0uY3VycmVudCk7CiAgICBzdHJlYW0ubW92ZU5leHQoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHdyaXRlVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgZG91YmxlIG9iamVjdCwgU2VyaWFsaXphdGlvblN0YXRlIF8pIHsKICAgIGJ1ZmZlci53cml0ZShvYmplY3QpOwogIH0KfQoKY2xhc3MgRGFydEJvb2wgZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxib29sPiB7CiAgY29uc3QgRGFydEJvb2woKTsKCiAgYm9vbCByZWFkRnJvbShJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgXykgewogICAgaWYgKHN0cmVhbS5jdXJyZW50IGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiZXhwZWN0ZWQgYW4gYXRvbSwgZm91bmQgYSBsaXN0Iik7CiAgICB9CiAgICBib29sIHJlc3VsdDsKICAgIGlmIChzdHJlYW0uY3VycmVudCA9PSAidHJ1ZSIpIHsKICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLmN1cnJlbnQgPT0gImZhbHNlIikgewogICAgICByZXN1bHQgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoImV4cGVjdGVkICd0cnVlJyBvciAnZmFsc2UnLCBmb3VuZCAnJHtzdHJlYW0uY3VycmVudH0nIik7CiAgICB9CiAgICBzdHJlYW0ubW92ZU5leHQoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHdyaXRlVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbCBvYmplY3QsIFNlcmlhbGl6YXRpb25TdGF0ZSBfKSB7CiAgICBidWZmZXIud3JpdGUob2JqZWN0ID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgfQp9CgovLyA9PSBTZXJpYWxpemVycyBmb3IgdGFnZ2VkIChkaXNqb2ludCkgdW5pb25zLgovLwovLyBUaGV5IHJlcXVpcmUgYSBmdW5jdGlvbiBtYXBwaW5nIHNlcmlhbGl6YWJsZXMgdG8gYSB0YWcgc3RyaW5nLiAgVGhpcyBpcwovLyBpbXBsZW1lbnRlZCBieSBUYWdnZXIgdmlzaXRvcnMuCi8vIEEgdGFnZ2VkIHVuaW9uIG9mIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVycy4KY2xhc3MgQ2FzZTxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxUPiB7CiAgZmluYWwgVGFnZ2VyPFQ+IHRhZ2dlcjsKICBmaW5hbCBMaXN0PFN0cmluZz4gdGFnczsKICBmaW5hbCBMaXN0PFRleHRTZXJpYWxpemVyPFQ+PiBzZXJpYWxpemVyczsKCiAgQ2FzZSh0aGlzLnRhZ2dlciwgdGhpcy50YWdzLCB0aGlzLnNlcmlhbGl6ZXJzKTsKCiAgQ2FzZS51bmluaXRpYWxpemVkKHRoaXMudGFnZ2VyKQogICAgICA6IHRhZ3MgPSBbXSwKICAgICAgICBzZXJpYWxpemVycyA9IFtdOwoKICBUIHJlYWRGcm9tKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtLCBEZXNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5jdXJyZW50IGlzISBJdGVyYXRvcikgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJleHBlY3RlZCBsaXN0LCBmb3VuZCBhdG9tIik7CiAgICB9CiAgICBJdGVyYXRvciBuZXN0ZWQgPSBzdHJlYW0uY3VycmVudDsKICAgIG5lc3RlZC5tb3ZlTmV4dCgpOwogICAgaWYgKG5lc3RlZC5jdXJyZW50IGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiZXhwZWN0ZWQgYXRvbSwgZm91bmQgbGlzdCIpOwogICAgfQogICAgU3RyaW5nIHRhZyA9IG5lc3RlZC5jdXJyZW50OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmICh0YWdzW2ldID09IHRhZykgewogICAgICAgIG5lc3RlZC5tb3ZlTmV4dCgpOwogICAgICAgIFQgcmVzdWx0ID0gc2VyaWFsaXplcnNbaV0ucmVhZEZyb20obmVzdGVkLCBzdGF0ZSk7CiAgICAgICAgaWYgKG5lc3RlZC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICB0aHJvdyBTdGF0ZUVycm9yKCJleHRyYSBjcnVmdCBpbiB0YWdnZWQgJyR7dGFnfSciKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLm1vdmVOZXh0KCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfQogICAgdGhyb3cgU3RhdGVFcnJvcigidW5yZWNvZ25pemVkIHRhZyAnJHt0YWd9JyIpOwogIH0KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIFQgb2JqZWN0LCBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIFN0cmluZyB0YWcgPSB0YWdnZXIudGFnKG9iamVjdCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHRhZ3NbaV0gPT0gdGFnKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKCIoJHt0YWd9Iik7CiAgICAgICAgaWYgKCFzZXJpYWxpemVyc1tpXS5pc0VtcHR5KSB7CiAgICAgICAgICBidWZmZXIud3JpdGUoIiAiKTsKICAgICAgICB9CiAgICAgICAgc2VyaWFsaXplcnNbaV0ud3JpdGVUbyhidWZmZXIsIG9iamVjdCwgc3RhdGUpOwogICAgICAgIGJ1ZmZlci53cml0ZSgiKSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgdGhyb3cgU3RhdGVFcnJvcigidW5yZWNvZ25pemVkIHRhZyAnJHt0YWd9Iik7CiAgfQp9CgovLyBBIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIHRoYXQgdW53cmFwcy93cmFwcyBub2RlcyBiZWZvcmUgc2VyaWFsaXphdGlvbiBhbmQKLy8gYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLgpjbGFzcyBXcmFwcGVkPFMsIEs+IGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8Sz4gewogIGZpbmFsIFMgRnVuY3Rpb24oSykgdW53cmFwOwogIGZpbmFsIEsgRnVuY3Rpb24oUykgd3JhcDsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxTPiBjb250ZW50czsKCiAgV3JhcHBlZCh0aGlzLnVud3JhcCwgdGhpcy53cmFwLCB0aGlzLmNvbnRlbnRzKTsKCiAgSyByZWFkRnJvbShJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIHJldHVybiB3cmFwKGNvbnRlbnRzLnJlYWRGcm9tKHN0cmVhbSwgc3RhdGUpKTsKICB9CgogIHZvaWQgd3JpdGVUbyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBLIG9iamVjdCwgU2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKSB7CiAgICBjb250ZW50cy53cml0ZVRvKGJ1ZmZlciwgdW53cmFwKG9iamVjdCksIHN0YXRlKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gY29udGVudHMuaXNFbXB0eTsKfQoKY2xhc3MgU2NvcGVkVXNlPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFRleHRTZXJpYWxpemVyPFQ+IHsKICBmaW5hbCBEYXJ0U3RyaW5nIHN0cmluZ1NlcmlhbGl6ZXIgPSBjb25zdCBEYXJ0U3RyaW5nKCk7CgogIGNvbnN0IFNjb3BlZFVzZSgpOwoKICBUIHJlYWRGcm9tKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtLCBEZXNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgcmV0dXJuIHN0YXRlLmVudmlyb25tZW50Lmxvb2t1cChzdHJpbmdTZXJpYWxpemVyLnJlYWRGcm9tKHN0cmVhbSwgbnVsbCkpOwogIH0KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIFQgb2JqZWN0LCBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIHN0cmluZ1NlcmlhbGl6ZXIud3JpdGVUbyhidWZmZXIsIHN0YXRlLmVudmlyb25tZW50Lmxvb2t1cChvYmplY3QpLCBudWxsKTsKICB9Cn0KCi8vIEEgc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIgZm9yIHBhaXJzLgpjbGFzcyBUdXBsZTJTZXJpYWxpemVyPFQxLCBUMj4gZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxUdXBsZTI8VDEsIFQyPj4gewogIGZpbmFsIFRleHRTZXJpYWxpemVyPFQxPiBmaXJzdDsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxUMj4gc2Vjb25kOwoKICBjb25zdCBUdXBsZTJTZXJpYWxpemVyKHRoaXMuZmlyc3QsIHRoaXMuc2Vjb25kKTsKCiAgVHVwbGUyPFQxLCBUMj4gcmVhZEZyb20oSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0sIERlc2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKSB7CiAgICByZXR1cm4gbmV3IFR1cGxlMigKICAgICAgICBmaXJzdC5yZWFkRnJvbShzdHJlYW0sIHN0YXRlKSwgc2Vjb25kLnJlYWRGcm9tKHN0cmVhbSwgc3RhdGUpKTsKICB9CgogIHZvaWQgd3JpdGVUbygKICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVHVwbGUyPFQxLCBUMj4gb2JqZWN0LCBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIGZpcnN0LndyaXRlVG8oYnVmZmVyLCBvYmplY3QuZmlyc3QsIHN0YXRlKTsKICAgIGJ1ZmZlci53cml0ZSgnICcpOwogICAgc2Vjb25kLndyaXRlVG8oYnVmZmVyLCBvYmplY3Quc2Vjb25kLCBzdGF0ZSk7CiAgfQp9CgpjbGFzcyBUdXBsZTI8VDEsIFQyPiB7CiAgZmluYWwgVDEgZmlyc3Q7CiAgZmluYWwgVDIgc2Vjb25kOwoKICBjb25zdCBUdXBsZTIodGhpcy5maXJzdCwgdGhpcy5zZWNvbmQpOwp9CgpjbGFzcyBUdXBsZTNTZXJpYWxpemVyPFQxLCBUMiwgVDM+IGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8VHVwbGUzPFQxLCBUMiwgVDM+PiB7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8VDE+IGZpcnN0OwogIGZpbmFsIFRleHRTZXJpYWxpemVyPFQyPiBzZWNvbmQ7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8VDM+IHRoaXJkOwoKICBjb25zdCBUdXBsZTNTZXJpYWxpemVyKHRoaXMuZmlyc3QsIHRoaXMuc2Vjb25kLCB0aGlzLnRoaXJkKTsKCiAgVHVwbGUzPFQxLCBUMiwgVDM+IHJlYWRGcm9tKAogICAgICBJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIHJldHVybiBuZXcgVHVwbGUzKGZpcnN0LnJlYWRGcm9tKHN0cmVhbSwgc3RhdGUpLAogICAgICAgIHNlY29uZC5yZWFkRnJvbShzdHJlYW0sIHN0YXRlKSwgdGhpcmQucmVhZEZyb20oc3RyZWFtLCBzdGF0ZSkpOwogIH0KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIFR1cGxlMzxUMSwgVDIsIFQzPiBvYmplY3QsCiAgICAgIFNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgZmlyc3Qud3JpdGVUbyhidWZmZXIsIG9iamVjdC5maXJzdCwgc3RhdGUpOwogICAgYnVmZmVyLndyaXRlKCcgJyk7CiAgICBzZWNvbmQud3JpdGVUbyhidWZmZXIsIG9iamVjdC5zZWNvbmQsIHN0YXRlKTsKICAgIGJ1ZmZlci53cml0ZSgnICcpOwogICAgdGhpcmQud3JpdGVUbyhidWZmZXIsIG9iamVjdC50aGlyZCwgc3RhdGUpOwogIH0KfQoKY2xhc3MgVHVwbGUzPFQxLCBUMiwgVDM+IHsKICBmaW5hbCBUMSBmaXJzdDsKICBmaW5hbCBUMiBzZWNvbmQ7CiAgZmluYWwgVDMgdGhpcmQ7CgogIGNvbnN0IFR1cGxlMyh0aGlzLmZpcnN0LCB0aGlzLnNlY29uZCwgdGhpcy50aGlyZCk7Cn0KCmNsYXNzIFR1cGxlNFNlcmlhbGl6ZXI8VDEsIFQyLCBUMywgVDQ+CiAgICBleHRlbmRzIFRleHRTZXJpYWxpemVyPFR1cGxlNDxUMSwgVDIsIFQzLCBUND4+IHsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxUMT4gZmlyc3Q7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8VDI+IHNlY29uZDsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxUMz4gdGhpcmQ7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8VDQ+IGZvdXJ0aDsKCiAgY29uc3QgVHVwbGU0U2VyaWFsaXplcih0aGlzLmZpcnN0LCB0aGlzLnNlY29uZCwgdGhpcy50aGlyZCwgdGhpcy5mb3VydGgpOwoKICBUdXBsZTQ8VDEsIFQyLCBUMywgVDQ+IHJlYWRGcm9tKAogICAgICBJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIHJldHVybiBuZXcgVHVwbGU0KAogICAgICAgIGZpcnN0LnJlYWRGcm9tKHN0cmVhbSwgc3RhdGUpLAogICAgICAgIHNlY29uZC5yZWFkRnJvbShzdHJlYW0sIHN0YXRlKSwKICAgICAgICB0aGlyZC5yZWFkRnJvbShzdHJlYW0sIHN0YXRlKSwKICAgICAgICBmb3VydGgucmVhZEZyb20oc3RyZWFtLCBzdGF0ZSkpOwogIH0KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIFR1cGxlNDxUMSwgVDIsIFQzLCBUND4gb2JqZWN0LAogICAgICBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIGZpcnN0LndyaXRlVG8oYnVmZmVyLCBvYmplY3QuZmlyc3QsIHN0YXRlKTsKICAgIGJ1ZmZlci53cml0ZSgnICcpOwogICAgc2Vjb25kLndyaXRlVG8oYnVmZmVyLCBvYmplY3Quc2Vjb25kLCBzdGF0ZSk7CiAgICBidWZmZXIud3JpdGUoJyAnKTsKICAgIHRoaXJkLndyaXRlVG8oYnVmZmVyLCBvYmplY3QudGhpcmQsIHN0YXRlKTsKICAgIGJ1ZmZlci53cml0ZSgnICcpOwogICAgZm91cnRoLndyaXRlVG8oYnVmZmVyLCBvYmplY3QuZm91cnRoLCBzdGF0ZSk7CiAgfQp9CgpjbGFzcyBUdXBsZTQ8VDEsIFQyLCBUMywgVDQ+IHsKICBmaW5hbCBUMSBmaXJzdDsKICBmaW5hbCBUMiBzZWNvbmQ7CiAgZmluYWwgVDMgdGhpcmQ7CiAgZmluYWwgVDQgZm91cnRoOwoKICBjb25zdCBUdXBsZTQodGhpcy5maXJzdCwgdGhpcy5zZWNvbmQsIHRoaXMudGhpcmQsIHRoaXMuZm91cnRoKTsKfQoKLy8gQSBzZXJpYWxpemVyL2Rlc2VyaWFsaXplciBmb3IgbGlzdHMuCmNsYXNzIExpc3RTZXJpYWxpemVyPFQ+IGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8TGlzdDxUPj4gewogIGZpbmFsIFRleHRTZXJpYWxpemVyPFQ+IGVsZW1lbnRzOwoKICBjb25zdCBMaXN0U2VyaWFsaXplcih0aGlzLmVsZW1lbnRzKTsKCiAgTGlzdDxUPiByZWFkRnJvbShJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSwgRGVzZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uY3VycmVudCBpcyEgSXRlcmF0b3IpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiZXhwZWN0ZWQgYSBsaXN0LCBmb3VuZCBhbiBhdG9tIik7CiAgICB9CiAgICBJdGVyYXRvcjxPYmplY3Q+IGxpc3QgPSBzdHJlYW0uY3VycmVudDsKICAgIGxpc3QubW92ZU5leHQoKTsKICAgIExpc3Q8VD4gcmVzdWx0ID0gW107CiAgICB3aGlsZSAobGlzdC5jdXJyZW50ICE9IG51bGwpIHsKICAgICAgcmVzdWx0LmFkZChlbGVtZW50cy5yZWFkRnJvbShsaXN0LCBzdGF0ZSkpOwogICAgfQogICAgc3RyZWFtLm1vdmVOZXh0KCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIExpc3Q8VD4gb2JqZWN0LCBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIGJ1ZmZlci53cml0ZSgnKCcpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGkgIT0gMCkgYnVmZmVyLndyaXRlKCcgJyk7CiAgICAgIGVsZW1lbnRzLndyaXRlVG8oYnVmZmVyLCBvYmplY3RbaV0sIHN0YXRlKTsKICAgIH0KICAgIGJ1ZmZlci53cml0ZSgnKScpOwogIH0KfQoKY2xhc3MgT3B0aW9uYWw8VD4gZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxUPiB7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8VD4gY29udGVudHM7CgogIGNvbnN0IE9wdGlvbmFsKHRoaXMuY29udGVudHMpOwoKICBUIHJlYWRGcm9tKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtLCBEZXNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5jdXJyZW50ID09ICdfJykgewogICAgICBzdHJlYW0ubW92ZU5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gY29udGVudHMucmVhZEZyb20oc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICB2b2lkIHdyaXRlVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVCBvYmplY3QsIFNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgnXycpOwogICAgfSBlbHNlIHsKICAgICAgY29udGVudHMud3JpdGVUbyhidWZmZXIsIG9iamVjdCwgc3RhdGUpOwogICAgfQogIH0KfQoKLy8vIEludHJvZHVjZXMgYSBiaW5kZXIgdG8gdGhlIGVudmlyb25tZW50LgovLy8KLy8vIFNlcmlhbGl6ZXMgYW4gb2JqZWN0IGFuZCB1c2VzIGl0IGFzIGEgYmluZGVyIGZvciB0aGUgbmFtZSB0aGF0IGlzIHJldHJpZXZlZAovLy8gZnJvbSB0aGUgb2JqZWN0IHVzaW5nIFtuYW1lR2V0dGVyXSBhbmQgKHRlbXBvcmFyaWx5KSBtb2RpZmllZCB1c2luZwovLy8gW25hbWVTZXR0ZXJdLiAgVGhlIGJpbmRlciBpcyBhZGRlZCB0byB0aGUgZW5jbG9zaW5nIGVudmlyb25tZW50LgpjbGFzcyBCaW5kZXI8VCBleHRlbmRzIE5vZGU+IGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8VD4gewogIGZpbmFsIFRleHRTZXJpYWxpemVyPFQ+IGNvbnRlbnRzOwogIGZpbmFsIFN0cmluZyBGdW5jdGlvbihUKSBuYW1lR2V0dGVyOwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oVCwgU3RyaW5nKSBuYW1lU2V0dGVyOwoKICBjb25zdCBCaW5kZXIodGhpcy5jb250ZW50cywgdGhpcy5uYW1lR2V0dGVyLCB0aGlzLm5hbWVTZXR0ZXIpOwoKICBUIHJlYWRGcm9tKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtLCBEZXNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgVCBvYmplY3QgPSBjb250ZW50cy5yZWFkRnJvbShzdHJlYW0sIHN0YXRlKTsKICAgIHN0YXRlLmVudmlyb25tZW50LmFkZEJpbmRlcihuYW1lR2V0dGVyKG9iamVjdCksIG9iamVjdCk7CiAgICByZXR1cm4gb2JqZWN0OwogIH0KCiAgdm9pZCB3cml0ZVRvKFN0cmluZ0J1ZmZlciBidWZmZXIsIFQgb2JqZWN0LCBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIFN0cmluZyBvbGROYW1lID0gbmFtZUdldHRlcihvYmplY3QpOwogICAgU3RyaW5nIG5ld05hbWUgPSBzdGF0ZS5lbnZpcm9ubWVudC5hZGRCaW5kZXIob2JqZWN0LCBvbGROYW1lKTsKICAgIG5hbWVTZXR0ZXIob2JqZWN0LCBuZXdOYW1lKTsKICAgIGNvbnRlbnRzLndyaXRlVG8oYnVmZmVyLCBvYmplY3QsIHN0YXRlKTsKICAgIG5hbWVTZXR0ZXIob2JqZWN0LCBvbGROYW1lKTsKICB9Cn0KCi8vLyBCaW5kcyBiaW5kZXJzIGZyb20gb25lIHRlcm0gaW4gdGhlIG90aGVyLgovLy8KLy8vIFNlcmlhbGl6ZXMgYSBbVHVwbGUyXSBvZiBbcGF0dGVybl0gYW5kIFt0ZXJtXSwgY2xvc2luZyBbdGVybV0gb3ZlciB0aGUKLy8vIGJpbmRlcnMgZm91bmQgaW4gW3BhdHRlcm5dLiAgVGhlIGJpbmRlcnMgYXJlbid0IGFkZGVkIHRvIHRoZSBlbmNsb3NpbmcKLy8vIGVudmlyb25tZW50LgpjbGFzcyBCaW5kPFAsIFQ+IGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8VHVwbGUyPFAsIFQ+PiB7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8UD4gcGF0dGVybjsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxUPiB0ZXJtOwoKICBjb25zdCBCaW5kKHRoaXMucGF0dGVybiwgdGhpcy50ZXJtKTsKCiAgVHVwbGUyPFAsIFQ+IHJlYWRGcm9tKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtLCBEZXNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgdmFyIGJpbmRpbmdTdGF0ZSA9IG5ldyBEZXNlcmlhbGl6YXRpb25TdGF0ZSgKICAgICAgICBuZXcgRGVzZXJpYWxpemF0aW9uRW52aXJvbm1lbnQoc3RhdGUuZW52aXJvbm1lbnQpLCBzdGF0ZS5uYW1lUm9vdCk7CiAgICBQIGZpcnN0ID0gcGF0dGVybi5yZWFkRnJvbShzdHJlYW0sIGJpbmRpbmdTdGF0ZSk7CiAgICBiaW5kaW5nU3RhdGUuZW52aXJvbm1lbnQuY2xvc2UoKTsKICAgIFQgc2Vjb25kID0gdGVybS5yZWFkRnJvbShzdHJlYW0sIGJpbmRpbmdTdGF0ZSk7CiAgICByZXR1cm4gbmV3IFR1cGxlMihmaXJzdCwgc2Vjb25kKTsKICB9CgogIHZvaWQgd3JpdGVUbygKICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVHVwbGUyPFAsIFQ+IHR1cGxlLCBTZXJpYWxpemF0aW9uU3RhdGUgc3RhdGUpIHsKICAgIHZhciBiaW5kaW5nU3RhdGUgPQogICAgICAgIG5ldyBTZXJpYWxpemF0aW9uU3RhdGUobmV3IFNlcmlhbGl6YXRpb25FbnZpcm9ubWVudChzdGF0ZS5lbnZpcm9ubWVudCkpOwogICAgcGF0dGVybi53cml0ZVRvKGJ1ZmZlciwgdHVwbGUuZmlyc3QsIGJpbmRpbmdTdGF0ZSk7CiAgICBiaW5kaW5nU3RhdGUuZW52aXJvbm1lbnQuY2xvc2UoKTsKICAgIGJ1ZmZlci53cml0ZSgnICcpOwogICAgdGVybS53cml0ZVRvKGJ1ZmZlciwgdHVwbGUuc2Vjb25kLCBiaW5kaW5nU3RhdGUpOwogIH0KfQoKLy8vIE5lc3RlZCBiaW5kaW5nIHBhdHRlcm4gdGhhdCBhbHNvIGJpbmRzIGJpbmRlcnMgZnJvbSBvbmUgdGVybSBpbiB0aGUgb3RoZXIuCi8vLwovLy8gU2VyaWFsaXplcyBhIFtUdXBsZTJdIG9mIFtwYXR0ZXJuMV0gYW5kIFtwYXR0ZXJuMl0sIGNsb3NpbmcgW3BhdHRlcm4yXSBvdmVyCi8vLyB0aGUgYmluZGVycyBmb3VuZCBpbiBbcGF0dGVybjFdLiAgVGhlIGJpbmRlcnMgZnJvbSBib3RoIFtwYXR0ZXJuMV0gYW5kCi8vLyBbcGF0dGVybjJdIGFyZSBhZGRlZCB0byB0aGUgZW5jbG9zaW5nIGVudmlyb25tZW50LgpjbGFzcyBSZWJpbmQ8UCwgVD4gZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxUdXBsZTI8UCwgVD4+IHsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxQPiBwYXR0ZXJuMTsKICBmaW5hbCBUZXh0U2VyaWFsaXplcjxUPiBwYXR0ZXJuMjsKCiAgY29uc3QgUmViaW5kKHRoaXMucGF0dGVybjEsIHRoaXMucGF0dGVybjIpOwoKICBUdXBsZTI8UCwgVD4gcmVhZEZyb20oSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0sIERlc2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKSB7CiAgICBQIGZpcnN0ID0gcGF0dGVybjEucmVhZEZyb20oc3RyZWFtLCBzdGF0ZSk7CiAgICB2YXIgY2xvc2VkU3RhdGUgPSBuZXcgRGVzZXJpYWxpemF0aW9uU3RhdGUoCiAgICAgICAgbmV3IERlc2VyaWFsaXphdGlvbkVudmlyb25tZW50KHN0YXRlLmVudmlyb25tZW50KQogICAgICAgICAgLi5iaW5kZXJzLmFkZEFsbChzdGF0ZS5lbnZpcm9ubWVudC5iaW5kZXJzKQogICAgICAgICAgLi5jbG9zZSgpLAogICAgICAgIHN0YXRlLm5hbWVSb290KTsKICAgIFQgc2Vjb25kID0gcGF0dGVybjIucmVhZEZyb20oc3RyZWFtLCBjbG9zZWRTdGF0ZSk7CiAgICBzdGF0ZS5lbnZpcm9ubWVudC5iaW5kZXJzLmFkZEFsbChjbG9zZWRTdGF0ZS5lbnZpcm9ubWVudC5iaW5kZXJzKTsKICAgIHJldHVybiBuZXcgVHVwbGUyKGZpcnN0LCBzZWNvbmQpOwogIH0KCiAgdm9pZCB3cml0ZVRvKAogICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyLCBUdXBsZTI8UCwgVD4gdHVwbGUsIFNlcmlhbGl6YXRpb25TdGF0ZSBzdGF0ZSkgewogICAgcGF0dGVybjEud3JpdGVUbyhidWZmZXIsIHR1cGxlLmZpcnN0LCBzdGF0ZSk7CiAgICB2YXIgY2xvc2VkU3RhdGUgPQogICAgICAgIG5ldyBTZXJpYWxpemF0aW9uU3RhdGUobmV3IFNlcmlhbGl6YXRpb25FbnZpcm9ubWVudChzdGF0ZS5lbnZpcm9ubWVudCkKICAgICAgICAgIC4uYmluZGVycy5hZGRBbGwoc3RhdGUuZW52aXJvbm1lbnQuYmluZGVycykKICAgICAgICAgIC4uY2xvc2UoKSk7CiAgICBidWZmZXIud3JpdGUoJyAnKTsKICAgIHBhdHRlcm4yLndyaXRlVG8oYnVmZmVyLCB0dXBsZS5zZWNvbmQsIGNsb3NlZFN0YXRlKTsKICAgIHN0YXRlLmVudmlyb25tZW50LmJpbmRlcnMuYWRkQWxsKGNsb3NlZFN0YXRlLmVudmlyb25tZW50LmJpbmRlcnMpOwogIH0KfQoKY2xhc3MgWmlwPFQsIFQxLCBUMj4gZXh0ZW5kcyBUZXh0U2VyaWFsaXplcjxMaXN0PFQ+PiB7CiAgZmluYWwgVGV4dFNlcmlhbGl6ZXI8VHVwbGUyPExpc3Q8VDE+LCBMaXN0PFQyPj4+IGxpc3RzOwogIGZpbmFsIFQgRnVuY3Rpb24oVDEsIFQyKSB6aXA7CiAgZmluYWwgVHVwbGUyPFQxLCBUMj4gRnVuY3Rpb24oVCkgdW56aXA7CgogIGNvbnN0IFppcCh0aGlzLmxpc3RzLCB0aGlzLnppcCwgdGhpcy51bnppcCk7CgogIExpc3Q8VD4gcmVhZEZyb20oSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0sIERlc2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKSB7CiAgICBUdXBsZTI8TGlzdDxUMT4sIExpc3Q8VDI+PiB0b1ppcCA9IGxpc3RzLnJlYWRGcm9tKHN0cmVhbSwgc3RhdGUpOwogICAgTGlzdDxUMT4gZmlyc3RzID0gdG9aaXAuZmlyc3Q7CiAgICBMaXN0PFQyPiBzZWNv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dG9tPgovLyAgICAgICAgICAgICAgICAgIHwgPFMtbGlzdD4KLy8gPFMtbGlzdD4gICAgICAgOjo9ICcoJyAnKScKLy8gICAgICAgICAgICAgICAgICB8ICcoJyA8Uy1leHByZXNzaW9uPiB7JyAnIDxTLWV4cHJlc3Npb24+fSogJyknCi8vCi8vIFdlIHVzZSBhbiBpdGVyYXRvciB0byByZWFkIFMtZXhwcmVzc2lvbnMuICBUaGUgaXRlcmF0b3IgcHJvZHVjZXMgYSBzdHJlYW0KLy8gb2YgYXRvbXMgKHN0cmluZ3MpIGFuZCBuZXN0ZWQgaXRlcmF0b3JzIChTLWxpc3RzKS4KY2xhc3MgVGV4dEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8T2JqZWN0IC8qIFN0cmluZyB8IFRleHRJdGVyYXRvciAqLyA+IHsKICBzdGF0aWMgaW50IHNwYWNlID0gJyAnLmNvZGVVbml0QXQoMCk7CiAgc3RhdGljIGludCBscGFyZW4gPSAnKCcuY29kZVVuaXRBdCgwKTsKICBzdGF0aWMgaW50IHJwYXJlbiA9ICcpJy5jb2RlVW5pdEF0KDApOwogIHN0YXRpYyBpbnQgZHF1b3RlID0gJyInLmNvZGVVbml0QXQoMCk7CiAgc3RhdGljIGludCBic2xhc2ggPSAnXFwnLmNvZGVVbml0QXQoMCk7CgogIGZpbmFsIFN0cmluZyBpbnB1dDsKICBpbnQgaW5kZXg7CgogIFRleHRJdGVyYXRvcih0aGlzLmlucHV0LCB0aGlzLmluZGV4KTsKCiAgLy8gQ29uc3VtZSBzcGFjZXMuCiAgdm9pZCBza2lwV2hpdGVzcGFjZSgpIHsKICAgIHdoaWxlIChpbmRleCA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dC5jb2RlVW5pdEF0KGluZGV4KSA9PSBzcGFjZSkgewogICAgICArK2luZGV4OwogICAgfQogIH0KCiAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiBhIG5lc3RlZCBTLWV4cHJlc3Npb24gYW5kIHRoZSBjbG9zaW5nIGRlbGltaXRlci4KICB2b2lkIHNraXBUb0VuZE9mTmVzdGVkKCkgewogICAgaWYgKGN1cnJlbnQgaXMgVGV4dEl0ZXJhdG9yKSB7CiAgICAgIFRleHRJdGVyYXRvciBpdCA9IGN1cnJlbnQ7CiAgICAgIHdoaWxlIChpdC5tb3ZlTmV4dCgpKTsKICAgICAgaW5kZXggPSBpdC5pbmRleCArIDE7CiAgICB9CiAgfQoKICB2b2lkIHNraXBUb0VuZE9mQXRvbSgpIHsKICAgIGJvb2wgaXNRdW90ZWQgPSBmYWxzZTsKICAgIGlmIChpbmRleCA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dC5jb2RlVW5pdEF0KGluZGV4KSA9PSBkcXVvdGUpIHsKICAgICAgKytpbmRleDsKICAgICAgaXNRdW90ZWQgPSB0cnVlOwogICAgfQogICAgZG8gewogICAgICBpZiAoaW5kZXggPj0gaW5wdXQubGVuZ3RoKSByZXR1cm47CiAgICAgIGludCBjb2RlVW5pdCA9IGlucHV0LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoaXNRdW90ZWQpIHsKICAgICAgICAvLyBUZXJtaW5hdG9yLgogICAgICAgIGlmIChjb2RlVW5pdCA9PSBkcXVvdGUpIHsKICAgICAgICAgICsraW5kZXg7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIEVzY2FwZWQgZG91YmxlIHF1b3RlLgogICAgICAgIGlmIChjb2RlVW5pdCA9PSBic2xhc2ggJiYKICAgICAgICAgICAgaW5kZXggPCBpbnB1dC5sZW5ndGggKyAxICYmCiAgICAgICAgICAgIGlucHV0LmNvZGVVbml0QXQoaW5kZXggKyAxKSA9PSBkcXVvdGUpIHsKICAgICAgICAgIGluZGV4ICs9IDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICsraW5kZXg7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRlcm1pbmF0b3IuCiAgICAgICAgaWYgKGNvZGVVbml0ID09IHNwYWNlIHx8IGNvZGVVbml0ID09IHJwYXJlbikgcmV0dXJuOwogICAgICAgICsraW5kZXg7CiAgICAgIH0KICAgIH0gd2hpbGUgKHRydWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgT2JqZWN0IGN1cnJlbnQgPSBudWxsOwoKICBAb3ZlcnJpZGUKICBib29sIG1vdmVOZXh0KCkgewogICAgc2tpcFRvRW5kT2ZOZXN0ZWQoKTsKICAgIHNraXBXaGl0ZXNwYWNlKCk7CiAgICBpZiAoaW5kZXggPj0gaW5wdXQubGVuZ3RoIHx8IGlucHV0LmNvZGVVbml0QXQoaW5kZXgpID09IHJwYXJlbikgewogICAgICBjdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGlucHV0LmNvZGVVbml0QXQoaW5kZXgpID09IGxwYXJlbikgewogICAgICBjdXJyZW50ID0gbmV3IFRleHRJdGVyYXRvcihpbnB1dCwgaW5kZXggKyAxKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpbnQgc3RhcnQgPSBpbmRleDsKICAgIHNraXBUb0VuZE9mQXRvbSgpOwogICAgY3VycmVudCA9IGlucHV0LnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CmUATk48ARwBEQNOTzYDHR8eQwNNNk4oKSkpKgEWDQEoARUaRw8GBAFKHSMhHRwGBAEbG0UPFwYJKS4WFyITEgohIig1FhETCg8XPREIFAQBDBkBDBQZFkYWFAYtNBMGFxctEQQCASRwYWNrYWdlOmtlcm5lbC90ZXh0L3RleHRfcmVhZGVyLmRhcnRUZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cva2VybmVsL2xpYi90ZXh0L3RleHRfc2VyaWFsaXplci5kYXJ0wAC3tS8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGtlcm5lbC50ZXh0X3NlcmlhbGl6ZXI7CgppbXBvcnQgJy4uL2FzdC5kYXJ0JzsKCmltcG9ydCAnc2VyaWFsaXplcl9jb21iaW5hdG9ycy5kYXJ0JzsKCmltcG9ydCAnLi4vdmlzaXRvci5kYXJ0JyBzaG93IEV4cHJlc3Npb25WaXNpdG9yOwoKYWJzdHJhY3QgY2xhc3MgVGFnZ2VyPFQgZXh0ZW5kcyBOb2RlPiB7CiAgU3RyaW5nIHRhZyhUIG5vZGUpOwp9CgpjbGFzcyBOYW1lVGFnZ2VyIGltcGxlbWVudHMgVGFnZ2VyPE5hbWU+IHsKICBjb25zdCBOYW1lVGFnZ2VyKCk7CgogIFN0cmluZyB0YWcoTmFtZSBuYW1lKSA9PiBuYW1lLmlzUHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOwp9CgpUZXh0U2VyaWFsaXplcjxOYW1lPiBwdWJsaWNOYW1lID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcFB1YmxpY05hbWUsIHdyYXBQdWJsaWNOYW1lLCBjb25zdCBEYXJ0U3RyaW5nKCkpOwoKU3RyaW5nIHVud3JhcFB1YmxpY05hbWUoTmFtZSBuYW1lKSA9PiBuYW1lLm5hbWU7CgpOYW1lIHdyYXBQdWJsaWNOYW1lKFN0cmluZyBuYW1lKSA9PiBuZXcgTmFtZShuYW1lKTsKClRleHRTZXJpYWxpemVyPE5hbWU+IHByaXZhdGVOYW1lID0gbmV3IFdyYXBwZWQodW53cmFwUHJpdmF0ZU5hbWUsCiAgICB3cmFwUHJpdmF0ZU5hbWUsIFR1cGxlMlNlcmlhbGl6ZXIoY29uc3QgRGFydFN0cmluZygpLCBjb25zdCBEYXJ0U3RyaW5nKCkpKTsKClR1cGxlMjxTdHJpbmcsIFN0cmluZz4gdW53cmFwUHJpdmF0ZU5hbWUoTmFtZSBuYW1lKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTIobmFtZS5saWJyYXJ5LmltcG9ydFVyaS50b1N0cmluZygpLCBuYW1lLm5hbWUpOwp9CgpOYW1lIHdyYXBQcml2YXRlTmFtZShUdXBsZTI8U3RyaW5nLCBTdHJpbmc+IHR1cGxlKSB7CiAgLy8gV2UgbmVlZCBhIG1hcCBmcm9tIGltcG9ydCBVUkkgdG8gbGlicmFyaWVzLiAgTW9yZSBnZW5lcmFsbHksIHdlIHdpbGwgbmVlZAogIC8vIGEgd2F5IHRvIG1hcCBhbnkgJ25hbWVkJyBub2RlIHRvIHRoZSBub2RlJ3MgcmVmZXJlbmNlLgogIHRocm93IFVuaW1wbGVtZW50ZWRFcnJvcignZGVzZXJpYWxpemF0aW9uIG9mIHByaXZhdGUgbmFtZXMnKTsKfQoKVGV4dFNlcmlhbGl6ZXI8TmFtZT4gbmFtZVNlcmlhbGl6ZXIgPSBuZXcgQ2FzZShjb25zdCBOYW1lVGFnZ2VyKCksIFsKICAicHVibGljIiwKICAicHJpdmF0ZSIsCl0sIFsKICBwdWJsaWNOYW1lLAogIHByaXZhdGVOYW1lCl0pOwoKY2xhc3MgRXhwcmVzc2lvblRhZ2dlciBleHRlbmRzIEV4cHJlc3Npb25WaXNpdG9yPFN0cmluZz4KICAgIGltcGxlbWVudHMgVGFnZ2VyPEV4cHJlc3Npb24+IHsKICBjb25zdCBFeHByZXNzaW9uVGFnZ2VyKCk7CgogIFN0cmluZyB0YWcoRXhwcmVzc2lvbiBleHByZXNzaW9uKSA9PiBleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKCiAgU3RyaW5nIHZpc2l0U3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIF8pID0+ICJzdHJpbmciOwogIFN0cmluZyB2aXNpdEludExpdGVyYWwoSW50TGl0ZXJhbCBfKSA9PiAiaW50IjsKICBTdHJpbmcgdmlzaXREb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgXykgPT4gImRvdWJsZSI7CiAgU3RyaW5nIHZpc2l0Qm9vbExpdGVyYWwoQm9vbExpdGVyYWwgXykgPT4gImJvb2wiOwogIFN0cmluZyB2aXNpdE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIF8pID0+ICJudWxsIjsKICBTdHJpbmcgdmlzaXRJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBfKSA9PiAiaW52YWxpZCI7CiAgU3RyaW5nIHZpc2l0Tm90KE5vdCBfKSA9PiAibm90IjsKICBTdHJpbmcgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbihMb2dpY2FsRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5vcGVyYXRvcjsKICB9CgogIFN0cmluZyB2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb24oU3RyaW5nQ29uY2F0ZW5hdGlvbiBfKSA9PiAiY29uY2F0IjsKICBTdHJpbmcgdmlzaXRTeW1ib2xMaXRlcmFsKFN5bWJvbExpdGVyYWwgXykgPT4gInN5bWJvbCI7CiAgU3RyaW5nIHZpc2l0VGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gXykgPT4gInRoaXMiOwogIFN0cmluZyB2aXNpdFJldGhyb3coUmV0aHJvdyBfKSA9PiAicmV0aHJvdyI7CiAgU3RyaW5nIHZpc2l0VGhyb3coVGhyb3cgXykgPT4gInRocm93IjsKICBTdHJpbmcgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIF8pID0+ICJhd2FpdCI7CiAgU3RyaW5nIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBfKSA9PiAiY29uZCI7CiAgU3RyaW5nIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBfKSA9PiAiaXMiOwogIFN0cmluZyB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gXykgPT4gImFzIjsKICBTdHJpbmcgdmlzaXRUeXBlTGl0ZXJhbChUeXBlTGl0ZXJhbCBfKSA9PiAidHlwZSI7CiAgU3RyaW5nIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgZXhwcmVzc2lvbikgewogICAgcmV0dXJuIGV4cHJlc3Npb24uaXNDb25zdCA/ICJjb25zdC1saXN0IiA6ICJsaXN0IjsKICB9CgogIFN0cmluZyB2aXNpdFNldExpdGVyYWwoU2V0TGl0ZXJhbCBleHByZXNzaW9uKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5pc0NvbnN0ID8gImNvbnN0LXNldCIgOiAic2V0IjsKICB9CgogIFN0cmluZyB2aXNpdE1hcExpdGVyYWwoTWFwTGl0ZXJhbCBleHByZXNzaW9uKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbi5pc0NvbnN0ID8gImNvbnN0LW1hcCIgOiAibWFwIjsKICB9CgogIFN0cmluZyB2aXNpdExldChMZXQgXykgPT4gImxldCI7CgogIFN0cmluZyB2aXNpdFByb3BlcnR5R2V0KFByb3BlcnR5R2V0IF8pID0+ICJnZXQtcHJvcCI7CiAgU3RyaW5nIHZpc2l0UHJvcGVydHlTZXQoUHJvcGVydHlTZXQgXykgPT4gInNldC1wcm9wIjsKICBTdHJpbmcgdmlzaXRTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgXykgPT4gImdldC1zdXBlciI7CiAgU3RyaW5nIHZpc2l0U3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IF8pID0+ICJzZXQtc3VwZXIiOwogIFN0cmluZyB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBfKSA9PiAiaW52b2tlLW1ldGhvZCI7CiAgU3RyaW5nIHZpc2l0U3VwZXJNZXRob2RJbnZvY2F0aW9uKFN1cGVyTWV0aG9kSW52b2NhdGlvbiBfKSA9PiAiaW52b2tlLXN1cGVyIjsKCiAgU3RyaW5nIHZpc2l0VmFyaWFibGVHZXQoVmFyaWFibGVHZXQgXykgPT4gImdldC12YXIiOwogIFN0cmluZyB2aXNpdFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IF8pID0+ICJzZXQtdmFyIjsKICBTdHJpbmcgdmlzaXRTdGF0aWNHZXQoU3RhdGljR2V0IF8pID0+ICJnZXQtc3RhdGljIjsKICBTdHJpbmcgdmlzaXRTdGF0aWNTZXQoU3RhdGljU2V0IF8pID0+ICJzZXQtc3RhdGljIjsKICBTdHJpbmcgdmlzaXREaXJlY3RQcm9wZXJ0eUdldChEaXJlY3RQcm9wZXJ0eUdldCBfKSA9PiAiZ2V0LWRpcmVjdC1wcm9wIjsKICBTdHJpbmcgdmlzaXREaXJlY3RQcm9wZXJ0eVNldChEaXJlY3RQcm9wZXJ0eVNldCBfKSA9PiAic2V0LWRpcmVjdC1wcm9wIjsKICBTdHJpbmcgdmlzaXRTdGF0aWNJbnZvY2F0aW9uKFN0YXRpY0ludm9jYXRpb24gZXhwcmVzc2lvbikgewogICAgcmV0dXJuIGV4cHJlc3Npb24uaXNDb25zdCA/ICJpbnZva2UtY29uc3Qtc3RhdGljIiA6ICJpbnZva2Utc3RhdGljIjsKICB9CgogIFN0cmluZyB2aXNpdERpcmVjdE1ldGhvZEludm9jYXRpb24oRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBfKSB7CiAgICByZXR1cm4gImludm9rZS1kaXJlY3QtbWV0aG9kIjsKICB9CgogIFN0cmluZyB2aXNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihDb25zdHJ1Y3Rvckludm9jYXRpb24gZXhwcmVzc2lvbikgewogICAgcmV0dXJuIGV4cHJlc3Npb24uaXNDb25zdAogICAgICAgID8gImludm9rZS1jb25zdC1jb25zdHJ1Y3RvciIKICAgICAgICA6ICJpbnZva2UtY29uc3RydWN0b3IiOwogIH0KCiAgU3RyaW5nIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiBfKSA9PiAiZnVuIjsKfQoKVGV4dFNlcmlhbGl6ZXI8SW52YWxpZEV4cHJlc3Npb24+IGludmFsaWRFeHByZXNzaW9uU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwSW52YWxpZEV4cHJlc3Npb24sIHdyYXBJbnZhbGlkRXhwcmVzc2lvbiwgY29uc3QgRGFydFN0cmluZygpKTsKClN0cmluZyB1bndyYXBJbnZhbGlkRXhwcmVzc2lvbihJbnZhbGlkRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgcmV0dXJuIGV4cHJlc3Npb24ubWVzc2FnZTsKfQoKSW52YWxpZEV4cHJlc3Npb24gd3JhcEludmFsaWRFeHByZXNzaW9uKFN0cmluZyBtZXNzYWdlKSB7CiAgcmV0dXJuIG5ldyBJbnZhbGlkRXhwcmVzc2lvbihtZXNzYWdlKTsKfQoKVGV4dFNlcmlhbGl6ZXI8Tm90PiBub3RTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcE5vdCwgd3JhcE5vdCwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpOwoKRXhwcmVzc2lvbiB1bndyYXBOb3QoTm90IGV4cHJlc3Npb24pID0+IGV4cHJlc3Npb24ub3BlcmFuZDsKCk5vdCB3cmFwTm90KEV4cHJlc3Npb24gb3BlcmFuZCkgPT4gbmV3IE5vdChvcGVyYW5kKTsKClRleHRTZXJpYWxpemVyPExvZ2ljYWxFeHByZXNzaW9uPiBsb2dpY2FsQW5kU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwTG9naWNhbEV4cHJlc3Npb24sCiAgICB3cmFwTG9naWNhbEFuZCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyLCBleHByZXNzaW9uU2VyaWFsaXplcikpOwoKVHVwbGUyPEV4cHJlc3Npb24sIEV4cHJlc3Npb24+IHVud3JhcExvZ2ljYWxFeHByZXNzaW9uKAogICAgTG9naWNhbEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUyKGV4cHJlc3Npb24ubGVmdCwgZXhwcmVzc2lvbi5yaWdodCk7Cn0KCkxvZ2ljYWxFeHByZXNzaW9uIHdyYXBMb2dpY2FsQW5kKFR1cGxlMjxFeHByZXNzaW9uLCBFeHByZXNzaW9uPiB0dXBsZSkgewogIHJldHVybiBuZXcgTG9naWNhbEV4cHJlc3Npb24odHVwbGUuZmlyc3QsICcmJicsIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPExvZ2ljYWxFeHByZXNzaW9uPiBsb2dpY2FsT3JTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBMb2dpY2FsRXhwcmVzc2lvbiwKICAgIHdyYXBMb2dpY2FsT3IsCiAgICBuZXcgVHVwbGUyU2VyaWFsaXplcihleHByZXNzaW9uU2VyaWFsaXplciwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpKTsKCkxvZ2ljYWxFeHByZXNzaW9uIHdyYXBMb2dpY2FsT3IoVHVwbGUyPEV4cHJlc3Npb24sIEV4cHJlc3Npb24+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBMb2dpY2FsRXhwcmVzc2lvbih0dXBsZS5maXJzdCwgJ3x8JywgdHVwbGUuc2Vjb25kKTsKfQoKVGV4dFNlcmlhbGl6ZXI8U3RyaW5nQ29uY2F0ZW5hdGlvbj4gc3RyaW5nQ29uY2F0ZW5hdGlvblNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFN0cmluZ0NvbmNhdGVuYXRpb24sCiAgICB3cmFwU3RyaW5nQ29uY2F0ZW5hdGlvbiwKICAgIG5ldyBMaXN0U2VyaWFsaXplcihleHByZXNzaW9uU2VyaWFsaXplcikpOwoKTGlzdDxFeHByZXNzaW9uPiB1bndyYXBTdHJpbmdDb25jYXRlbmF0aW9uKFN0cmluZ0NvbmNhdGVuYXRpb24gZXhwcmVzc2lvbikgewogIHJldHVybiBleHByZXNzaW9uLmV4cHJlc3Npb25zOwp9CgpTdHJpbmdDb25jYXRlbmF0aW9uIHdyYXBTdHJpbmdDb25jYXRlbmF0aW9uKExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpIHsKICByZXR1cm4gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oZXhwcmVzc2lvbnMpOwp9CgpUZXh0U2VyaWFsaXplcjxTdHJpbmdMaXRlcmFsPiBzdHJpbmdMaXRlcmFsU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBTdHJpbmdMaXRlcmFsLCB3cmFwU3RyaW5nTGl0ZXJhbCwgY29uc3QgRGFydFN0cmluZygpKTsKClN0cmluZyB1bndyYXBTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgbGl0ZXJhbCkgPT4gbGl0ZXJhbC52YWx1ZTsKClN0cmluZ0xpdGVyYWwgd3JhcFN0cmluZ0xpdGVyYWwoU3RyaW5nIHZhbHVlKSA9PiBuZXcgU3RyaW5nTGl0ZXJhbCh2YWx1ZSk7CgpUZXh0U2VyaWFsaXplcjxJbnRMaXRlcmFsPiBpbnRMaXRlcmFsU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBJbnRMaXRlcmFsLCB3cmFwSW50TGl0ZXJhbCwgY29uc3QgRGFydEludCgpKTsKCmludCB1bndyYXBJbnRMaXRlcmFsKEludExpdGVyYWwgbGl0ZXJhbCkgPT4gbGl0ZXJhbC52YWx1ZTsKCkludExpdGVyYWwgd3JhcEludExpdGVyYWwoaW50IHZhbHVlKSA9PiBuZXcgSW50TGl0ZXJhbCh2YWx1ZSk7CgpUZXh0U2VyaWFsaXplcjxEb3VibGVMaXRlcmFsPiBkb3VibGVMaXRlcmFsU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBEb3VibGVMaXRlcmFsLCB3cmFwRG91YmxlTGl0ZXJhbCwgY29uc3QgRGFydERvdWJsZSgpKTsKCmRvdWJsZSB1bndyYXBEb3VibGVMaXRlcmFsKERvdWJsZUxpdGVyYWwgbGl0ZXJhbCkgPT4gbGl0ZXJhbC52YWx1ZTsKCkRvdWJsZUxpdGVyYWwgd3JhcERvdWJsZUxpdGVyYWwoZG91YmxlIHZhbHVlKSA9PiBuZXcgRG91YmxlTGl0ZXJhbCh2YWx1ZSk7CgpUZXh0U2VyaWFsaXplcjxCb29sTGl0ZXJhbD4gYm9vbExpdGVyYWxTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcEJvb2xMaXRlcmFsLCB3cmFwQm9vbExpdGVyYWwsIGNvbnN0IERhcnRCb29sKCkpOwoKYm9vbCB1bndyYXBCb29sTGl0ZXJhbChCb29sTGl0ZXJhbCBsaXRlcmFsKSA9PiBsaXRlcmFsLnZhbHVlOwoKQm9vbExpdGVyYWwgd3JhcEJvb2xMaXRlcmFsKGJvb2wgdmFsdWUpID0+IG5ldyBCb29sTGl0ZXJhbCh2YWx1ZSk7CgpUZXh0U2VyaWFsaXplcjxOdWxsTGl0ZXJhbD4gbnVsbExpdGVyYWxTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcE51bGxMaXRlcmFsLCB3cmFwTnVsbExpdGVyYWwsIGNvbnN0IE5vdGhpbmcoKSk7Cgp2b2lkIHVud3JhcE51bGxMaXRlcmFsKE51bGxMaXRlcmFsIGxpdGVyYWwpIHt9CgpOdWxsTGl0ZXJhbCB3cmFwTnVsbExpdGVyYWwodm9pZCBpZ25vcmVkKSA9PiBuZXcgTnVsbExpdGVyYWwoKTsKClRleHRTZXJpYWxpemVyPFN5bWJvbExpdGVyYWw+IHN5bWJvbExpdGVyYWxTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcFN5bWJvbExpdGVyYWwsIHdyYXBTeW1ib2xMaXRlcmFsLCBjb25zdCBEYXJ0U3RyaW5nKCkpOwoKU3RyaW5nIHVud3JhcFN5bWJvbExpdGVyYWwoU3ltYm9sTGl0ZXJhbCBleHByZXNzaW9uKSA9PiBleHByZXNzaW9uLnZhbHVlOwoKU3ltYm9sTGl0ZXJhbCB3cmFwU3ltYm9sTGl0ZXJhbChTdHJpbmcgdmFsdWUpID0+IG5ldyBTeW1ib2xMaXRlcmFsKHZhbHVlKTsKClRleHRTZXJpYWxpemVyPFRoaXNFeHByZXNzaW9uPiB0aGlzRXhwcmVzc2lvblNlcmlhbGl6ZXIgPQogICAgbmV3IFdyYXBwZWQodW53cmFwVGhpc0V4cHJlc3Npb24sIHdyYXBUaGlzRXhwcmVzc2lvbiwgY29uc3QgTm90aGluZygpKTsKCnZvaWQgdW53cmFwVGhpc0V4cHJlc3Npb24oVGhpc0V4cHJlc3Npb24gZXhwcmVzc2lvbikge30KClRoaXNFeHByZXNzaW9uIHdyYXBUaGlzRXhwcmVzc2lvbih2b2lkIGlnbm9yZWQpID0+IG5ldyBUaGlzRXhwcmVzc2lvbigpOwoKVGV4dFNlcmlhbGl6ZXI8UmV0aHJvdz4gcmV0aHJvd1NlcmlhbGl6ZXIgPQogICAgbmV3IFdyYXBwZWQodW53cmFwUmV0aHJvdywgd3JhcFJldGhyb3csIGNvbnN0IE5vdGhpbmcoKSk7Cgp2b2lkIHVud3JhcFJldGhyb3coUmV0aHJvdyBleHByZXNzaW9uKSB7fQoKUmV0aHJvdyB3cmFwUmV0aHJvdyh2b2lkIGlnbm9yZWQpID0+IG5ldyBSZXRocm93KCk7CgpUZXh0U2VyaWFsaXplcjxUaHJvdz4gdGhyb3dTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcFRocm93LCB3cmFwVGhyb3csIGV4cHJlc3Npb25TZXJpYWxpemVyKTsKCkV4cHJlc3Npb24gdW53cmFwVGhyb3coVGhyb3cgZXhwcmVzc2lvbikgPT4gZXhwcmVzc2lvbi5leHByZXNzaW9uOwoKVGhyb3cgd3JhcFRocm93KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgPT4gbmV3IFRocm93KGV4cHJlc3Npb24pOwoKVGV4dFNlcmlhbGl6ZXI8QXdhaXRFeHByZXNzaW9uPiBhd2FpdEV4cHJlc3Npb25TZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBBd2FpdEV4cHJlc3Npb24sIHdyYXBBd2FpdEV4cHJlc3Npb24sIGV4cHJlc3Npb25TZXJpYWxpemVyKTsKCkV4cHJlc3Npb24gdW53cmFwQXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBleHByZXNzaW9uKSA9PgogICAgZXhwcmVzc2lvbi5vcGVyYW5kOwoKQXdhaXRFeHByZXNzaW9uIHdyYXBBd2FpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBvcGVyYW5kKSA9PgogICAgbmV3IEF3YWl0RXhwcmVzc2lvbihvcGVyYW5kKTsKClRleHRTZXJpYWxpemVyPENvbmRpdGlvbmFsRXhwcmVzc2lvbj4gY29uZGl0aW9uYWxFeHByZXNzaW9uU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCgKICAgICAgICB1bndyYXBDb25kaXRpb25hbEV4cHJlc3Npb24sCiAgICAgICAgd3JhcENvbmRpdGlvbmFsRXhwcmVzc2lvbiwKICAgICAgICBuZXcgVHVwbGU0U2VyaWFsaXplcihleHByZXNzaW9uU2VyaWFsaXplciwgZGFydFR5cGVTZXJpYWxpemVyLAogICAgICAgICAgICBleHByZXNzaW9uU2VyaWFsaXplciwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpKTsKClR1cGxlNDxFeHByZXNzaW9uLCBEYXJ0VHlwZSwgRXhwcmVzc2lvbiwgRXhwcmVzc2lvbj4KICAgIHVud3JhcENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGU0KGV4cHJlc3Npb24uY29uZGl0aW9uLCBleHByZXNzaW9uLnN0YXRpY1R5cGUsCiAgICAgIGV4cHJlc3Npb24udGhlbiwgZXhwcmVzc2lvbi5vdGhlcndpc2UpOwp9CgpDb25kaXRpb25hbEV4cHJlc3Npb24gd3JhcENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgIFR1cGxlNDxFeHByZXNzaW9uLCBEYXJ0VHlwZSwgRXhwcmVzc2lvbiwgRXhwcmVzc2lvbj4gdHVwbGUpIHsKICByZXR1cm4gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgdHVwbGUuZmlyc3QsIHR1cGxlLnRoaXJkLCB0dXBsZS5mb3VydGgsIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPElzRXhwcmVzc2lvbj4gaXNFeHByZXNzaW9uU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwSXNFeHByZXNzaW9uLAogICAgd3JhcElzRXhwcmVzc2lvbiwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyLCBkYXJ0VHlwZVNlcmlhbGl6ZXIpKTsKClR1cGxlMjxFeHByZXNzaW9uLCBEYXJ0VHlwZT4gdW53cmFwSXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTIoZXhwcmVzc2lvbi5vcGVyYW5kLCBleHByZXNzaW9uLnR5cGUpOwp9CgpJc0V4cHJlc3Npb24gd3JhcElzRXhwcmVzc2lvbihUdXBsZTI8RXhwcmVzc2lvbiwgRGFydFR5cGU+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBJc0V4cHJlc3Npb24odHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPEFzRXhwcmVzc2lvbj4gYXNFeHByZXNzaW9uU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwQXNFeHByZXNzaW9uLAogICAgd3JhcEFzRXhwcmVzc2lvbiwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyLCBkYXJ0VHlwZVNlcmlhbGl6ZXIpKTsKClR1cGxlMjxFeHByZXNzaW9uLCBEYXJ0VHlwZT4gdW53cmFwQXNFeHByZXNzaW9uKEFzRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTIoZXhwcmVzc2lvbi5vcGVyYW5kLCBleHByZXNzaW9uLnR5cGUpOwp9CgpBc0V4cHJlc3Npb24gd3JhcEFzRXhwcmVzc2lvbihUdXBsZTI8RXhwcmVzc2lvbiwgRGFydFR5cGU+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBBc0V4cHJlc3Npb24odHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPFR5cGVMaXRlcmFsPiB0eXBlTGl0ZXJhbFNlcmlhbGl6ZXIgPQogICAgbmV3IFdyYXBwZWQodW53cmFwVHlwZUxpdGVyYWwsIHdyYXBUeXBlTGl0ZXJhbCwgZGFydFR5cGVTZXJpYWxpemVyKTsKCkRhcnRUeXBlIHVud3JhcFR5cGVMaXRlcmFsKFR5cGVMaXRlcmFsIGV4cHJlc3Npb24pID0+IGV4cHJlc3Npb24udHlwZTsKClR5cGVMaXRlcmFsIHdyYXBUeXBlTGl0ZXJhbChEYXJ0VHlwZSB0eXBlKSA9PiBuZXcgVHlwZUxpdGVyYWwodHlwZSk7CgpUZXh0U2VyaWFsaXplcjxMaXN0TGl0ZXJhbD4gbGlzdExpdGVyYWxTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBMaXN0TGl0ZXJhbCwKICAgIHdyYXBMaXN0TGl0ZXJhbCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKAogICAgICAgIGRhcnRUeXBlU2VyaWFsaXplciwgbmV3IExpc3RTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyKSkpOwoKVHVwbGUyPERhcnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+PiB1bndyYXBMaXN0TGl0ZXJhbChMaXN0TGl0ZXJhbCBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTIoZXhwcmVzc2lvbi50eXBlQXJndW1lbnQsIGV4cHJlc3Npb24uZXhwcmVzc2lvbnMpOwp9CgpMaXN0TGl0ZXJhbCB3cmFwTGlzdExpdGVyYWwoVHVwbGUyPERhcnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+PiB0dXBsZSkgewogIHJldHVybiBuZXcgTGlzdExpdGVyYWwodHVwbGUuc2Vjb25kLAogICAgICB0eXBlQXJndW1lbnQ6IHR1cGxlLmZpcnN0LCBpc0NvbnN0OiBmYWxzZSk7Cn0KClRleHRTZXJpYWxpemVyPExpc3RMaXRlcmFsPiBjb25zdExpc3RMaXRlcmFsU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwTGlzdExpdGVyYWwsCiAgICB3cmFwQ29uc3RMaXN0TGl0ZXJhbCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKAogICAgICAgIGRhcnRUeXBlU2VyaWFsaXplciwgbmV3IExpc3RTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyKSkpOwoKTGlzdExpdGVyYWwgd3JhcENvbnN0TGlzdExpdGVyYWwoVHVwbGUyPERhcnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+PiB0dXBsZSkgewogIHJldHVybiBuZXcgTGlzdExpdGVyYWwodHVwbGUuc2Vjb25kLAogICAgICB0eXBlQXJndW1lbnQ6IHR1cGxlLmZpcnN0LCBpc0NvbnN0OiB0cnVlKTsKfQoKVGV4dFNlcmlhbGl6ZXI8U2V0TGl0ZXJhbD4gc2V0TGl0ZXJhbFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFNldExpdGVyYWwsCiAgICB3cmFwU2V0TGl0ZXJhbCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKAogICAgICAgIGRhcnRUeXBlU2VyaWFsaXplciwgbmV3IExpc3RTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyKSkpOwoKVHVwbGUyPERhcnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+PiB1bndyYXBTZXRMaXRlcmFsKFNldExpdGVyYWwgZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUyKGV4cHJlc3Npb24udHlwZUFyZ3VtZW50LCBleHByZXNzaW9uLmV4cHJlc3Npb25zKTsKfQoKU2V0TGl0ZXJhbCB3cmFwU2V0TGl0ZXJhbChUdXBsZTI8RGFydFR5cGUsIExpc3Q8RXhwcmVzc2lvbj4+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBTZXRMaXRlcmFsKHR1cGxlLnNlY29uZCwKICAgICAgdHlwZUFyZ3VtZW50OiB0dXBsZS5maXJzdCwgaXNDb25zdDogZmFsc2UpOwp9CgpUZXh0U2VyaWFsaXplcjxTZXRMaXRlcmFsPiBjb25zdFNldExpdGVyYWxTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBTZXRMaXRlcmFsLAogICAgd3JhcENvbnN0U2V0TGl0ZXJhbCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKAogICAgICAgIGRhcnRUeXBlU2VyaWFsaXplciwgbmV3IExpc3RTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyKSkpOwoKU2V0TGl0ZXJhbCB3cmFwQ29uc3RTZXRMaXRlcmFsKFR1cGxlMjxEYXJ0VHlwZSwgTGlzdDxFeHByZXNzaW9uPj4gdHVwbGUpIHsKICByZXR1cm4gbmV3IFNldExpdGVyYWwodHVwbGUuc2Vjb25kLCB0eXBlQXJndW1lbnQ6IHR1cGxlLmZpcnN0LCBpc0NvbnN0OiB0cnVlKTsKfQoKVGV4dFNlcmlhbGl6ZXI8TWFwTGl0ZXJhbD4gbWFwTGl0ZXJhbFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcE1hcExpdGVyYWwsCiAgICB3cmFwTWFwTGl0ZXJhbCwKICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKGRhcnRUeXBlU2VyaWFsaXplciwgZGFydFR5cGVTZXJpYWxpemVyLAogICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihleHByZXNzaW9uU2VyaWFsaXplcikpKTsKClR1cGxlMzxEYXJ0VHlwZSwgRGFydFR5cGUsIExpc3Q8RXhwcmVzc2lvbj4+IHVud3JhcE1hcExpdGVyYWwoCiAgICBNYXBMaXRlcmFsIGV4cHJlc3Npb24pIHsKICBMaXN0PEV4cHJlc3Npb24+IGVudHJpZXMgPSBuZXcgTGlzdCgyICogZXhwcmVzc2lvbi5lbnRyaWVzLmxlbmd0aCk7CiAgZm9yIChpbnQgZnJvbSA9IDAsIHRvID0gMDsgZnJvbSA8IGV4cHJlc3Npb24uZW50cmllcy5sZW5ndGg7ICsrZnJvbSkgewogICAgTWFwRW50cnkgZW50cnkgPSBleHByZXNzaW9uLmVudHJpZXNbZnJvbV07CiAgICBlbnRyaWVzW3RvKytdID0gZW50cnkua2V5OwogICAgZW50cmllc1t0bysrXSA9IGVudHJ5LnZhbHVlOwogIH0KICByZXR1cm4gbmV3IFR1cGxlMyhleHByZXNzaW9uLmtleVR5cGUsIGV4cHJlc3Npb24udmFsdWVUeXBlLCBlbnRyaWVzKTsKfQoKTWFwTGl0ZXJhbCB3cmFwTWFwTGl0ZXJhbChUdXBsZTM8RGFydFR5cGUsIERhcnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+PiB0dXBsZSkgewogIExpc3Q8TWFwRW50cnk+IGVudHJpZXMgPSBuZXcgTGlzdCh0dXBsZS50aGlyZC5sZW5ndGggfi8gMik7CiAgZm9yIChpbnQgZnJvbSA9IDAsIHRvID0gMDsgdG8gPCBlbnRyaWVzLmxlbmd0aDsgKyt0bykgewogICAgZW50cmllc1t0b10gPSBuZXcgTWFwRW50cnkodHVwbGUudGhpcmRbZnJvbSsrXSwgdHVwbGUudGhpcmRbZnJvbSsrXSk7CiAgfQogIHJldHVybiBuZXcgTWFwTGl0ZXJhbChlbnRyaWVzLAogICAgICBrZXlUeXBlOiB0dXBsZS5maXJzdCwgdmFsdWVUeXBlOiB0dXBsZS5zZWNvbmQsIGlzQ29uc3Q6IGZhbHNlKTsKfQoKVGV4dFNlcmlhbGl6ZXI8TWFwTGl0ZXJhbD4gY29uc3RNYXBMaXRlcmFsU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwTWFwTGl0ZXJhbCwKICAgIHdyYXBDb25zdE1hcExpdGVyYWwsCiAgICBuZXcgVHVwbGUzU2VyaWFsaXplcihkYXJ0VHlwZVNlcmlhbGl6ZXIsIGRhcnRUeXBlU2VyaWFsaXplciwKICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIoZXhwcmVzc2lvblNlcmlhbGl6ZXIpKSk7CgpNYXBMaXRlcmFsIHdyYXBDb25zdE1hcExpdGVyYWwoCiAgICBUdXBsZTM8RGFydFR5cGUsIERhcnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+PiB0dXBsZSkgewogIExpc3Q8TWFwRW50cnk+IGVudHJpZXMgPSBuZXcgTGlzdCh0dXBsZS50aGlyZC5sZW5ndGggfi8gMik7CiAgZm9yIChpbnQgZnJvbSA9IDAsIHRvID0gMDsgdG8gPCBlbnRyaWVzLmxlbmd0aDsgKyt0bykgewogICAgZW50cmllc1t0b10gPSBuZXcgTWFwRW50cnkodHVwbGUudGhpcmRbZnJvbSsrXSwgdHVwbGUudGhpcmRbZnJvbSsrXSk7CiAgfQogIHJldHVybiBuZXcgTWFwTGl0ZXJhbChlbnRyaWVzLAogICAgICBrZXlUeXBlOiB0dXBsZS5maXJzdCwgdmFsdWVUeXBlOiB0dXBsZS5zZWNvbmQsIGlzQ29uc3Q6IHRydWUpOwp9CgpUZXh0U2VyaWFsaXplcjxMZXQ+IGxldFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcExldCwKICAgIHdyYXBMZXQsCiAgICBuZXcgQmluZCgKICAgICAgICBuZXcgQmluZGVyKHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyLCBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSwKICAgICAgICAgICAgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUpLAogICAgICAgIGV4cHJlc3Npb25TZXJpYWxpemVyKSk7CgpUdXBsZTI8VmFyaWFibGVEZWNsYXJhdGlvbiwgRXhwcmVzc2lvbj4gdW53cmFwTGV0KExldCBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTIoZXhwcmVzc2lvbi52YXJpYWJsZSwgZXhwcmVzc2lvbi5ib2R5KTsKfQoKTGV0IHdyYXBMZXQoVHVwbGUyPFZhcmlhYmxlRGVjbGFyYXRpb24sIEV4cHJlc3Npb24+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBMZXQodHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCk7Cn0KClN0cmluZyBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZShWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpID0+IG5vZGUubmFtZTsKCnZvaWQgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUoVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCBTdHJpbmcgbmFtZSkgewogIG5vZGUubmFtZSA9IG5hbWU7Cn0KClRleHRTZXJpYWxpemVyPFByb3BlcnR5R2V0PiBwcm9wZXJ0eUdldFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFByb3BlcnR5R2V0LAogICAgd3JhcFByb3BlcnR5R2V0LAogICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoZXhwcmVzc2lvblNlcmlhbGl6ZXIsIG5hbWVTZXJpYWxpemVyKSk7CgpUdXBsZTI8RXhwcmVzc2lvbiwgTmFtZT4gdW53cmFwUHJvcGVydHlHZXQoUHJvcGVydHlHZXQgZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUyKGV4cHJlc3Npb24ucmVjZWl2ZXIsIGV4cHJlc3Npb24ubmFtZSk7Cn0KClByb3BlcnR5R2V0IHdyYXBQcm9wZXJ0eUdldChUdXBsZTI8RXhwcmVzc2lvbiwgTmFtZT4gdHVwbGUpIHsKICByZXR1cm4gbmV3IFByb3BlcnR5R2V0KHR1cGxlLmZpcnN0LCB0dXBsZS5zZWNvbmQpOwp9CgpUZXh0U2VyaWFsaXplcjxQcm9wZXJ0eVNldD4gcHJvcGVydHlTZXRTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBQcm9wZXJ0eVNldCwKICAgIHdyYXBQcm9wZXJ0eVNldCwKICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKAogICAgICAgIGV4cHJlc3Npb25TZXJpYWxpemVyLCBuYW1lU2VyaWFsaXplciwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpKTsKClR1cGxlMzxFeHByZXNzaW9uLCBOYW1lLCBFeHByZXNzaW9uPiB1bndyYXBQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTMoZXhwcmVzc2lvbi5yZWNlaXZlciwgZXhwcmVzc2lvbi5uYW1lLCBleHByZXNzaW9uLnZhbHVlKTsKfQoKUHJvcGVydHlTZXQgd3JhcFByb3BlcnR5U2V0KFR1cGxlMzxFeHByZXNzaW9uLCBOYW1lLCBFeHByZXNzaW9uPiB0dXBsZSkgewogIHJldHVybiBuZXcgUHJvcGVydHlTZXQodHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCwgdHVwbGUudGhpcmQpOwp9CgpUZXh0U2VyaWFsaXplcjxTdXBlclByb3BlcnR5R2V0PiBzdXBlclByb3BlcnR5R2V0U2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBTdXBlclByb3BlcnR5R2V0LCB3cmFwU3VwZXJQcm9wZXJ0eUdldCwgbmFtZVNlcmlhbGl6ZXIpOwoKTmFtZSB1bndyYXBTdXBlclByb3BlcnR5R2V0KFN1cGVyUHJvcGVydHlHZXQgZXhwcmVzc2lvbikgewogIHJldHVybiBleHByZXNzaW9uLm5hbWU7Cn0KClN1cGVyUHJvcGVydHlHZXQgd3JhcFN1cGVyUHJvcGVydHlHZXQoTmFtZSBuYW1lKSB7CiAgcmV0dXJuIG5ldyBTdXBlclByb3BlcnR5R2V0KG5hbWUpOwp9CgpUZXh0U2VyaWFsaXplcjxTdXBlclByb3BlcnR5U2V0PiBzdXBlclByb3BlcnR5U2V0U2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwU3VwZXJQcm9wZXJ0eVNldCwKICAgIHdyYXBTdXBlclByb3BlcnR5U2V0LAogICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIobmFtZVNlcmlhbGl6ZXIsIGV4cHJlc3Npb25TZXJpYWxpemVyKSk7CgpUdXBsZTI8TmFtZSwgRXhwcmVzc2lvbj4gdW53cmFwU3VwZXJQcm9wZXJ0eVNldChTdXBlclByb3BlcnR5U2V0IGV4cHJlc3Npb24pIHsKICByZXR1cm4gbmV3IFR1cGxlMihleHByZXNzaW9uLm5hbWUsIGV4cHJlc3Npb24udmFsdWUpOwp9CgpTdXBlclByb3BlcnR5U2V0IHdyYXBTdXBlclByb3BlcnR5U2V0KFR1cGxlMjxOYW1lLCBFeHByZXNzaW9uPiB0dXBsZSkgewogIHJldHVybiBuZXcgU3VwZXJQcm9wZXJ0eVNldCh0dXBsZS5maXJzdCwgdHVwbGUuc2Vjb25kLCBudWxsKTsKfQoKVGV4dFNlcmlhbGl6ZXI8TWV0aG9kSW52b2NhdGlvbj4gbWV0aG9kSW52b2NhdGlvblNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcE1ldGhvZEludm9jYXRpb24sCiAgICB3cmFwTWV0aG9kSW52b2NhdGlvbiwKICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKAogICAgICAgIGV4cHJlc3Npb25TZXJpYWxpemVyLCBuYW1lU2VyaWFsaXplciwgYXJndW1lbnRzU2VyaWFsaXplcikpOwoKVHVwbGUzPEV4cHJlc3Npb24sIE5hbWUsIEFyZ3VtZW50cz4gdW53cmFwTWV0aG9kSW52b2NhdGlvbigKICAgIE1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUzKGV4cHJlc3Npb24ucmVjZWl2ZXIsIGV4cHJlc3Npb24ubmFtZSwgZXhwcmVzc2lvbi5hcmd1bWVudHMpOwp9CgpNZXRob2RJbnZvY2F0aW9uIHdyYXBNZXRob2RJbnZvY2F0aW9uKAogICAgVHVwbGUzPEV4cHJlc3Npb24sIE5hbWUsIEFyZ3VtZW50cz4gdHVwbGUpIHsKICByZXR1cm4gbmV3IE1ldGhvZEludm9jYXRpb24odHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCwgdHVwbGUudGhpcmQpOwp9CgpUZXh0U2VyaWFsaXplcjxTdXBlck1ldGhvZEludm9jYXRpb24+IHN1cGVyTWV0aG9kSW52b2NhdGlvblNlcmlhbGl6ZXIgPQogICAgbmV3IFdyYXBwZWQodW53cmFwU3VwZXJNZXRob2RJbnZvY2F0aW9uLCB3cmFwU3VwZXJNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKG5hbWVTZXJpYWxpemVyLCBhcmd1bWVudHNTZXJpYWxpemVyKSk7CgpUdXBsZTI8TmFtZSwgQXJndW1lbnRzPiB1bndyYXBTdXBlck1ldGhvZEludm9jYXRpb24oCiAgICBTdXBlck1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUyKGV4cHJlc3Npb24ubmFtZSwgZXhwcmVzc2lvbi5hcmd1bWVudHMpOwp9CgpTdXBlck1ldGhvZEludm9jYXRpb24gd3JhcFN1cGVyTWV0aG9kSW52b2NhdGlvbihUdXBsZTI8TmFtZSwgQXJndW1lbnRzPiB0dXBsZSkgewogIHJldHVybiBuZXcgU3VwZXJNZXRob2RJbnZvY2F0aW9uKHR1cGxlLmZpcnN0LCB0dXBsZS5zZWNvbmQpOwp9CgpUZXh0U2VyaWFsaXplcjxWYXJpYWJsZUdldD4gdmFyaWFibGVHZXRTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBWYXJpYWJsZUdldCwKICAgIHdyYXBWYXJpYWJsZUdldCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGNvbnN0IFNjb3BlZFVzZTxWYXJpYWJsZURlY2xhcmF0aW9uPigpLAogICAgICAgIG5ldyBPcHRpb25hbChkYXJ0VHlwZVNlcmlhbGl6ZXIpKSk7CgpUdXBsZTI8VmFyaWFibGVEZWNsYXJhdGlvbiwgRGFydFR5cGU+IHVud3JhcFZhcmlhYmxlR2V0KFZhcmlhYmxlR2V0IG5vZGUpIHsKICByZXR1cm4gbmV3IFR1cGxlMjxWYXJpYWJsZURlY2xhcmF0aW9uLCBEYXJ0VHlwZT4oCiAgICAgIG5vZGUudmFyaWFibGUsIG5vZGUucHJvbW90ZWRUeXBlKTsKfQoKVmFyaWFibGVHZXQgd3JhcFZhcmlhYmxlR2V0KFR1cGxlMjxWYXJpYWJsZURlY2xhcmF0aW9uLCBEYXJ0VHlwZT4gdHVwbGUpIHsKICByZXR1cm4gbmV3IFZhcmlhYmxlR2V0KHR1cGxlLmZpcnN0LCB0dXBsZS5zZWNvbmQpOwp9CgpUZXh0U2VyaWFsaXplcjxWYXJpYWJsZVNldD4gdmFyaWFibGVTZXRTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBWYXJpYWJsZVNldCwKICAgIHdyYXBWYXJpYWJsZVNldCwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKAogICAgICAgIGNvbnN0IFNjb3BlZFVzZTxWYXJpYWJsZURlY2xhcmF0aW9uPigpLCBleHByZXNzaW9uU2VyaWFsaXplcikpOwoKVHVwbGUyPFZhcmlhYmxlRGVjbGFyYXRpb24sIEV4cHJlc3Npb24+IHVud3JhcFZhcmlhYmxlU2V0KFZhcmlhYmxlU2V0IG5vZGUpIHsKICByZXR1cm4gbmV3IFR1cGxlMjxWYXJpYWJsZURlY2xhcmF0aW9uLCBFeHByZXNzaW9uPihub2RlLnZhcmlhYmxlLCBub2RlLnZhbHVlKTsKfQoKVmFyaWFibGVTZXQgd3JhcFZhcmlhYmxlU2V0KFR1cGxlMjxWYXJpYWJsZURlY2xhcmF0aW9uLCBFeHByZXNzaW9uPiB0dXBsZSkgewogIHJldHVybiBuZXcgVmFyaWFibGVTZXQodHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCk7Cn0KCmNsYXNzIENhbm9uaWNhbE5hbWVTZXJpYWxpemVyIGV4dGVuZHMgVGV4dFNlcmlhbGl6ZXI8Q2Fub25pY2FsTmFtZT4gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgZGVsaW1pdGVyID0gIjo6IjsKCiAgY29uc3QgQ2Fub25pY2FsTmFtZVNlcmlhbGl6ZXIoKTsKCiAgc3RhdGljIHZvaWQgd3JpdGVOYW1lKENhbm9uaWNhbE5hbWUgbmFtZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewogICAgaWYgKCFuYW1lLmlzUm9vdCkgewogICAgICBpZiAoIW5hbWUucGFyZW50LmlzUm9vdCkgewogICAgICAgIHdyaXRlTmFtZShuYW1lLnBhcmVudCwgYnVmZmVyKTsKICAgICAgICBidWZmZXIud3JpdGUoZGVsaW1pdGVyKTsKICAgICAgfQogICAgICBidWZmZXIud3JpdGUobmFtZS5uYW1lKTsKICAgIH0KICB9CgogIENhbm9uaWNhbE5hbWUgcmVhZEZyb20oSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0sIERlc2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKSB7CiAgICBTdHJpbmcgc3RyaW5nID0gY29uc3QgRGFydFN0cmluZygpLnJlYWRGcm9tKHN0cmVhbSwgc3RhdGUpOwogICAgQ2Fub25pY2FsTmFtZSBuYW1lID0gc3RhdGUubmFtZVJvb3Q7CiAgICBmb3IgKFN0cmluZyBzIGluIHN0cmluZy5zcGxpdChkZWxpbWl0ZXIpKSB7CiAgICAgIG5hbWUgPSBuYW1lLmdldENoaWxkKHMpOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQoKICB2b2lkIHdyaXRlVG8oCiAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIsIENhbm9uaWNhbE5hbWUgbmFtZSwgU2VyaWFsaXphdGlvblN0YXRlIHN0YXRlKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICB3cml0ZU5hbWUobmFtZSwgc2IpOwogICAgY29uc3QgRGFydFN0cmluZygpLndyaXRlVG8oYnVmZmVyLCBzYi50b1N0cmluZygpLCBzdGF0ZSk7CiAgfQp9CgpUZXh0U2VyaWFsaXplcjxTdGF0aWNHZXQ+IHN0YXRpY0dldFNlcmlhbGl6ZXIgPQogICAgbmV3IFdyYXBwZWQodW53cmFwU3RhdGljR2V0LCB3cmFwU3RhdGljR2V0LCBuZXcgQ2Fub25pY2FsTmFtZVNlcmlhbGl6ZXIoKSk7CgpDYW5vbmljYWxOYW1lIHVud3JhcFN0YXRpY0dldChTdGF0aWNHZXQgZXhwcmVzc2lvbikgewogIHJldHVybiBleHByZXNzaW9uLnRhcmdldFJlZmVyZW5jZS5jYW5vbmljYWxOYW1lOwp9CgpTdGF0aWNHZXQgd3JhcFN0YXRpY0dldChDYW5vbmljYWxOYW1lIG5hbWUpIHsKICByZXR1cm4gbmV3IFN0YXRpY0dldC5ieVJlZmVyZW5jZShuYW1lLmdldFJlZmVyZW5jZSgpKTsKfQoKVGV4dFNlcmlhbGl6ZXI8U3RhdGljU2V0PiBzdGF0aWNTZXRTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBTdGF0aWNTZXQsCiAgICB3cmFwU3RhdGljU2V0LAogICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoCiAgICAgICAgY29uc3QgQ2Fub25pY2FsTmFtZVNlcmlhbGl6ZXIoKSwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpKTsKClR1cGxlMjxDYW5vbmljYWxOYW1lLCBFeHByZXNzaW9uPiB1bndyYXBTdGF0aWNTZXQoU3RhdGljU2V0IGV4cHJlc3Npb24pIHsKICByZXR1cm4gbmV3IFR1cGxlMihleHByZXNzaW9uLnRhcmdldFJlZmVyZW5jZS5jYW5vbmljYWxOYW1lLCBleHByZXNzaW9uLnZhbHVlKTsKfQoKU3RhdGljU2V0IHdyYXBTdGF0aWNTZXQoVHVwbGUyPENhbm9uaWNhbE5hbWUsIEV4cHJlc3Npb24+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBTdGF0aWNTZXQuYnlSZWZlcmVuY2UodHVwbGUuZmlyc3QuZ2V0UmVmZXJlbmNlKCksIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPERpcmVjdFByb3BlcnR5R2V0PiBkaXJlY3RQcm9wZXJ0eUdldFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcERpcmVjdFByb3BlcnR5R2V0LAogICAgd3JhcERpcmVjdFByb3BlcnR5R2V0LAogICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoCiAgICAgICAgZXhwcmVzc2lvblNlcmlhbGl6ZXIsIGNvbnN0IENhbm9uaWNhbE5hbWVTZXJpYWxpemVyKCkpKTsKClR1cGxlMjxFeHByZXNzaW9uLCBDYW5vbmljYWxOYW1lPiB1bndyYXBEaXJlY3RQcm9wZXJ0eUdldCgKICAgIERpcmVjdFByb3BlcnR5R2V0IGV4cHJlc3Npb24pIHsKICByZXR1cm4gbmV3IFR1cGxlMigKICAgICAgZXhwcmVzc2lvbi5yZWNlaXZlciwgZXhwcmVzc2lvbi50YXJnZXRSZWZlcmVuY2UuY2Fub25pY2FsTmFtZSk7Cn0KCkRpcmVjdFByb3BlcnR5R2V0IHdyYXBEaXJlY3RQcm9wZXJ0eUdldCgKICAgIFR1cGxlMjxFeHByZXNzaW9uLCBDYW5vbmljYWxOYW1lPiB0dXBsZSkgewogIHJldHVybiBuZXcgRGlyZWN0UHJvcGVydHlHZXQuYnlSZWZlcmVuY2UoCiAgICAgIHR1cGxlLmZpcnN0LCB0dXBsZS5zZWNvbmQuZ2V0UmVmZXJlbmNlKCkpOwp9CgpUZXh0U2VyaWFsaXplcjxEaXJlY3RQcm9wZXJ0eVNldD4gZGlyZWN0UHJvcGVydHlTZXRTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBEaXJlY3RQcm9wZXJ0eVNldCwKICAgIHdyYXBEaXJlY3RQcm9wZXJ0eVNldCwKICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyLCBjb25zdCBDYW5vbmljYWxOYW1lU2VyaWFsaXplcigpLAogICAgICAgIGV4cHJlc3Npb25TZXJpYWxpemVyKSk7CgpUdXBsZTM8RXhwcmVzc2lvbiwgQ2Fub25pY2FsTmFtZSwgRXhwcmVzc2lvbj4gdW53cmFwRGlyZWN0UHJvcGVydHlTZXQoCiAgICBEaXJlY3RQcm9wZXJ0eVNldCBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTMoZXhwcmVzc2lvbi5yZWNlaXZlciwKICAgICAgZXhwcmVzc2lvbi50YXJnZXRSZWZlcmVuY2UuY2Fub25pY2FsTmFtZSwgZXhwcmVzc2lvbi52YWx1ZSk7Cn0KCkRpcmVjdFByb3BlcnR5U2V0IHdyYXBEaXJlY3RQcm9wZXJ0eVNldCgKICAgIFR1cGxlMzxFeHByZXNzaW9uLCBDYW5vbmljYWxOYW1lLCBFeHByZXNzaW9uPiB0dXBsZSkgewogIHJldHVybiBuZXcgRGlyZWN0UHJvcGVydHlTZXQuYnlSZWZlcmVuY2UoCiAgICAgIHR1cGxlLmZpcnN0LCB0dXBsZS5zZWNvbmQuZ2V0UmVmZXJlbmNlKCksIHR1cGxlLnRoaXJkKTsKfQoKVGV4dFNlcmlhbGl6ZXI8U3RhdGljSW52b2NhdGlvbj4gc3RhdGljSW52b2NhdGlvblNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFN0YXRpY0ludm9jYXRpb24sCiAgICB3cmFwU3RhdGljSW52b2NhdGlvbiwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGNvbnN0IENhbm9uaWNhbE5hbWVTZXJpYWxpemVyKCksIGFyZ3VtZW50c1NlcmlhbGl6ZXIpKTsKClR1cGxlMjxDYW5vbmljYWxOYW1lLCBBcmd1bWVudHM+IHVud3JhcFN0YXRpY0ludm9jYXRpb24oCiAgICBTdGF0aWNJbnZvY2F0aW9uIGV4cHJlc3Npb24pIHsKICByZXR1cm4gbmV3IFR1cGxlMigKICAgICAgZXhwcmVzc2lvbi50YXJnZXRSZWZlcmVuY2UuY2Fub25pY2FsTmFtZSwgZXhwcmVzc2lvbi5hcmd1bWVudHMpOwp9CgpTdGF0aWNJbnZvY2F0aW9uIHdyYXBTdGF0aWNJbnZvY2F0aW9uKFR1cGxlMjxDYW5vbmljYWxOYW1lLCBBcmd1bWVudHM+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBTdGF0aWNJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICB0dXBsZS5maXJzdC5nZXRSZWZlcmVuY2UoKSwgdHVwbGUuc2Vjb25kLAogICAgICBpc0NvbnN0OiBmYWxzZSk7Cn0KClRleHRTZXJpYWxpemVyPFN0YXRpY0ludm9jYXRpb24+IGNvbnN0U3RhdGljSW52b2NhdGlvblNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFN0YXRpY0ludm9jYXRpb24sCiAgICB3cmFwQ29uc3RTdGF0aWNJbnZvY2F0aW9uLAogICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoY29uc3QgQ2Fub25pY2FsTmFtZVNlcmlhbGl6ZXIoKSwgYXJndW1lbnRzU2VyaWFsaXplcikpOwoKU3RhdGljSW52b2NhdGlvbiB3cmFwQ29uc3RTdGF0aWNJbnZvY2F0aW9uKAogICAgVHVwbGUyPENhbm9uaWNhbE5hbWUsIEFyZ3VtZW50cz4gdHVwbGUpIHsKICByZXR1cm4gbmV3IFN0YXRpY0ludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHR1cGxlLmZpcnN0LmdldFJlZmVyZW5jZSgpLCB0dXBsZS5zZWNvbmQsCiAgICAgIGlzQ29uc3Q6IHRydWUpOwp9CgpUZXh0U2VyaWFsaXplcjxEaXJlY3RNZXRob2RJbnZvY2F0aW9uPiBkaXJlY3RNZXRob2RJbnZvY2F0aW9uU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCgKICAgICAgICB1bndyYXBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIHdyYXBEaXJlY3RNZXRob2RJbnZvY2F0aW9uLAogICAgICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyLAogICAgICAgICAgICBjb25zdCBDYW5vbmljYWxOYW1lU2VyaWFsaXplcigpLCBhcmd1bWVudHNTZXJpYWxpemVyKSk7CgpUdXBsZTM8RXhwcmVzc2lvbiwgQ2Fub25pY2FsTmFtZSwgQXJndW1lbnRzPiB1bndyYXBEaXJlY3RNZXRob2RJbnZvY2F0aW9uKAogICAgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTMoZXhwcmVzc2lvbi5yZWNlaXZlciwKICAgICAgZXhwcmVzc2lvbi50YXJnZXRSZWZlcmVuY2UuY2Fub25pY2FsTmFtZSwgZXhwcmVzc2lvbi5hcmd1bWVudHMpOwp9CgpEaXJlY3RNZXRob2RJbnZvY2F0aW9uIHdyYXBEaXJlY3RNZXRob2RJbnZvY2F0aW9uKAogICAgVHVwbGUzPEV4cHJlc3Npb24sIENhbm9uaWNhbE5hbWUsIEFyZ3VtZW50cz4gdHVwbGUpIHsKICByZXR1cm4gbmV3IERpcmVjdE1ldGhvZEludm9jYXRpb24uYnlSZWZlcmVuY2UoCiAgICAgIHR1cGxlLmZpcnN0LCB0dXBsZS5zZWNvbmQuZ2V0UmVmZXJlbmNlKCksIHR1cGxlLnRoaXJkKTsKfQoKVGV4dFNlcmlhbGl6ZXI8Q29uc3RydWN0b3JJbnZvY2F0aW9uPiBjb25zdHJ1Y3Rvckludm9jYXRpb25TZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKAogICAgICAgIHVud3JhcENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICB3cmFwQ29uc3RydWN0b3JJbnZvY2F0aW9uLAogICAgICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKAogICAgICAgICAgICBjb25zdCBDYW5vbmljYWxOYW1lU2VyaWFsaXplcigpLCBhcmd1bWVudHNTZXJpYWxpemVyKSk7CgpUdXBsZTI8Q2Fub25pY2FsTmFtZSwgQXJndW1lbnRzPiB1bndyYXBDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24gZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUyKAogICAgICBleHByZXNzaW9uLnRhcmdldFJlZmVyZW5jZS5jYW5vbmljYWxOYW1lLCBleHByZXNzaW9uLmFyZ3VtZW50cyk7Cn0KCkNvbnN0cnVjdG9ySW52b2NhdGlvbiB3cmFwQ29uc3RydWN0b3JJbnZvY2F0aW9uKAogICAgVHVwbGUyPENhbm9uaWNhbE5hbWUsIEFyZ3VtZW50cz4gdHVwbGUpIHsKICByZXR1cm4gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbi5ieVJlZmVyZW5jZSgKICAgICAgdHVwbGUuZmlyc3QuZ2V0UmVmZXJlbmNlKCksIHR1cGxlLnNlY29uZCwKICAgICAgaXNDb25zdDogZmFsc2UpOwp9CgpUZXh0U2VyaWFsaXplcjxDb25zdHJ1Y3Rvckludm9jYXRpb24+IGNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBDb25zdHJ1Y3Rvckludm9jYXRpb24sIHdyYXBDb25zdENvbnN0cnVjdG9ySW52b2NhdGlvbiwKICAgICAgICBUdXBsZTJTZXJpYWxpemVyKGNvbnN0IENhbm9uaWNhbE5hbWVTZXJpYWxpemVyKCksIGFyZ3VtZW50c1NlcmlhbGl6ZXIpKTsKCkNvbnN0cnVjdG9ySW52b2NhdGlvbiB3cmFwQ29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb24oCiAgICBUdXBsZTI8Q2Fub25pY2FsTmFtZSwgQXJndW1lbnRzPiB0dXBsZSkgewogIHJldHVybiBuZXcgQ29uc3RydWN0b3JJbnZvY2F0aW9uLmJ5UmVmZXJlbmNlKAogICAgICB0dXBsZS5maXJzdC5nZXRSZWZlcmVuY2UoKSwgdHVwbGUuc2Vjb25kLAogICAgICBpc0NvbnN0OiB0cnVlKTsKfQoKVGV4dFNlcmlhbGl6ZXI8RnVuY3Rpb25FeHByZXNzaW9uPiBmdW5jdGlvbkV4cHJlc3Npb25TZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBGdW5jdGlvbkV4cHJlc3Npb24sIHdyYXBGdW5jdGlvbkV4cHJlc3Npb24sIGZ1bmN0aW9uTm9kZVNlcmlhbGl6ZXIpOwoKRnVuY3Rpb25Ob2RlIHVud3JhcEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogIHJldHVybiBleHByZXNzaW9uLmZ1bmN0aW9uOwp9CgpGdW5jdGlvbkV4cHJlc3Npb24gd3JhcEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbk5vZGUgbm9kZSkgewogIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKG5vZGUpOwp9CgpDYXNlPEV4cHJlc3Npb24+IGV4cHJlc3Npb25TZXJpYWxpemVyID0KICAgIG5ldyBDYXNlLnVuaW5pdGlhbGl6ZWQoY29uc3QgRXhwcmVzc2lvblRhZ2dlcigpKTsKClRleHRTZXJpYWxpemVyPE5hbWVkRXhwcmVzc2lvbj4gbmFtZWRFeHByZXNzaW9uU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwTmFtZWRFeHByZXNzaW9uLAogICAgd3JhcE5hbWVkRXhwcmVzc2lvbiwKICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGNvbnN0IERhcnRTdHJpbmcoKSwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpKTsKClR1cGxlMjxTdHJpbmcsIEV4cHJlc3Npb24+IHVud3JhcE5hbWVkRXhwcmVzc2lvbihOYW1lZEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogIHJldHVybiBuZXcgVHVwbGUyKGV4cHJlc3Npb24ubmFtZSwgZXhwcmVzc2lvbi52YWx1ZSk7Cn0KCk5hbWVkRXhwcmVzc2lvbiB3cmFwTmFtZWRFeHByZXNzaW9uKFR1cGxlMjxTdHJpbmcsIEV4cHJlc3Npb24+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBOYW1lZEV4cHJlc3Npb24odHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPEFyZ3VtZW50cz4gYXJndW1lbnRzU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwQXJndW1lbnRzLAogICAgd3JhcEFyZ3VtZW50cywKICAgIFR1cGxlM1NlcmlhbGl6ZXIoCiAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKGRhcnRUeXBlU2VyaWFsaXplciksCiAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyKSwKICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIobmFtZWRFeHByZXNzaW9uU2VyaWFsaXplcikpKTsKClR1cGxlMzxMaXN0PERhcnRUeXBlPiwgTGlzdDxFeHByZXNzaW9uPiwgTGlzdDxOYW1lZEV4cHJlc3Npb24+PiB1bndyYXBBcmd1bWVudHMoCiAgICBBcmd1bWVudHMgYXJndW1lbnRzKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTMoYXJndW1lbnRzLnR5cGVzLCBhcmd1bWVudHMucG9zaXRpb25hbCwgYXJndW1lbnRzLm5hbWVkKTsKfQoKQXJndW1lbnRzIHdyYXBBcmd1bWVudHMoCiAgICBUdXBsZTM8TGlzdDxEYXJ0VHlwZT4sIExpc3Q8RXhwcmVzc2lvbj4sIExpc3Q8TmFtZWRFeHByZXNzaW9uPj4gdHVwbGUpIHsKICByZXR1cm4gbmV3IEFyZ3VtZW50cyh0dXBsZS5zZWNvbmQsIHR5cGVzOiB0dXBsZS5maXJzdCwgbmFtZWQ6IHR1cGxlLnRoaXJkKTsKfQoKY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvblRhZ2dlciBpbXBsZW1lbnRzIFRhZ2dlcjxWYXJpYWJsZURlY2xhcmF0aW9uPiB7CiAgY29uc3QgVmFyaWFibGVEZWNsYXJhdGlvblRhZ2dlcigpOwoKICBTdHJpbmcgdGFnKFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbCkgewogICAgaWYgKGRlY2wuaXNDb3ZhcmlhbnQpIHRocm93IFVuaW1wbGVtZW50ZWRFcnJvcigiY292YXJpYW50IGRlY2xhcmF0aW9uIik7CiAgICBpZiAoZGVjbC5pc0ZpZWxkRm9ybWFsKSB0aHJvdyBVbmltcGxlbWVudGVkRXJyb3IoImluaXRpYWxpemluZyBmb3JtYWwiKTsKICAgIGlmIChkZWNsLmlzQ29uc3QpIHsKICAgICAgLy8gSXQncyBub3QgY2xlYXIgd2hhdCBpbnZhcmlhbnRzIHdlIGFzc3VtZSBhYm91dCBjb25zdC9maW5hbC4gIEZvciBub3cKICAgICAgLy8gdGhyb3cgaWYgd2UgaGF2ZSBib3RoLgogICAgICBpZiAoZGVjbC5pc0ZpbmFsKSB0aHJvdyBVbmltcGxlbWVudGVkRXJyb3IoImNvbnN0IGFuZCBmaW5hbCIpOwogICAgICByZXR1cm4gImNvbnN0IjsKICAgIH0KICAgIGlmIChkZWNsLmlzRmluYWwpIHsKICAgICAgcmV0dXJuICJmaW5hbCI7CiAgICB9CiAgICByZXR1cm4gInZhciI7CiAgfQp9CgpUZXh0U2VyaWFsaXplcjxWYXJpYWJsZURlY2xhcmF0aW9uPiB2YXJEZWNsYXJhdGlvblNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICB3cmFwVmFyRGVjbGFyYXRpb24sCiAgICBUdXBsZTRTZXJpYWxpemVyKAogICAgICAgIGNvbnN0IERhcnRTdHJpbmcoKSwKICAgICAgICBkYXJ0VHlwZVNlcmlhbGl6ZXIsCiAgICAgICAgbmV3IE9wdGlvbmFsKGV4cHJlc3Npb25TZXJpYWxpemVyKSwKICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIoZXhwcmVzc2lvblNlcmlhbGl6ZXIpKSk7CgpUdXBsZTQ8U3RyaW5nLCBEYXJ0VHlwZSwgRXhwcmVzc2lvbiwgTGlzdDxFeHByZXNzaW9uPj4KICAgIHVud3JhcFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogIHJldHVybiBuZXcgVHVwbGU0KGRlY2xhcmF0aW9uLm5hbWUgPz8gIiIsIGRlY2xhcmF0aW9uLnR5cGUsCiAgICAgIGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLCBkZWNsYXJhdGlvbi5hbm5vdGF0aW9ucyk7Cn0KClZhcmlhYmxlRGVjbGFyYXRpb24gd3JhcFZhckRlY2xhcmF0aW9uKAogICAgVHVwbGU0PFN0cmluZywgRGFydFR5cGUsIEV4cHJlc3Npb24sIExpc3Q8RXhwcmVzc2lvbj4+IHR1cGxlKSB7CiAgdmFyIHJlc3VsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKHR1cGxlLmZpcnN0LmlzRW1wdHkgPyBudWxsIDogdHVwbGUuZmlyc3QsCiAgICAgIGluaXRpYWxpemVyOiB0dXBsZS50aGlyZCwgdHlwZTogdHVwbGUuc2Vjb25kKTsKICBmb3IgKGludCBpID0gMDsgaSA8IHR1cGxlLmZvdXJ0aC5sZW5ndGg7ICsraSkgewogICAgcmVzdWx0LmFkZEFubm90YXRpb24odHVwbGUuZm91cnRoW2ldKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKVGV4dFNlcmlhbGl6ZXI8VmFyaWFibGVEZWNsYXJhdGlvbj4gZmluYWxEZWNsYXJhdGlvblNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFZhcmlhYmxlRGVjbGFyYXRpb24sCiAgICB3cmFwRmluYWxEZWNsYXJhdGlvbiwKICAgIFR1cGxlNFNlcmlhbGl6ZXIoCiAgICAgICAgY29uc3QgRGFydFN0cmluZygpLAogICAgICAgIGRhcnRUeXBlU2VyaWFsaXplciwKICAgICAgICBuZXcgT3B0aW9uYWwoZXhwcmVzc2lvblNlcmlhbGl6ZXIpLAogICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihleHByZXNzaW9uU2VyaWFsaXplcikpKTsKClZhcmlhYmxlRGVjbGFyYXRpb24gd3JhcEZpbmFsRGVjbGFyYXRpb24oCiAgICBUdXBsZTQ8U3RyaW5nLCBEYXJ0VHlwZSwgRXhwcmVzc2lvbiwgTGlzdDxFeHByZXNzaW9uPj4gdHVwbGUpIHsKICB2YXIgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24odHVwbGUuZmlyc3QuaXNFbXB0eSA/IG51bGwgOiB0dXBsZS5maXJzdCwKICAgICAgaW5pdGlhbGl6ZXI6IHR1cGxlLnRoaXJkLCB0eXBlOiB0dXBsZS5zZWNvbmQsIGlzRmluYWw6IHRydWUpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgdHVwbGUuZm91cnRoLmxlbmd0aDsgKytpKSB7CiAgICByZXN1bHQuYWRkQW5ub3RhdGlvbih0dXBsZS5mb3VydGhbaV0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CgpUZXh0U2VyaWFsaXplcjxWYXJpYWJsZURlY2xhcmF0aW9uPiBjb25zdERlY2xhcmF0aW9uU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgIHdyYXBDb25zdERlY2xhcmF0aW9uLAogICAgVHVwbGU0U2VyaWFsaXplcigKICAgICAgICBjb25zdCBEYXJ0U3RyaW5nKCksCiAgICAgICAgZGFydFR5cGVTZXJpYWxpemVyLAogICAgICAgIG5ldyBPcHRpb25hbChleHByZXNzaW9uU2VyaWFsaXplciksCiAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKGV4cHJlc3Npb25TZXJpYWxpemVyKSkpOwoKVmFyaWFibGVEZWNsYXJhdGlvbiB3cmFwQ29uc3REZWNsYXJhdGlvbigKICAgIFR1cGxlNDxTdHJpbmcsIERhcnRUeXBlLCBFeHByZXNzaW9uLCBMaXN0PEV4cHJlc3Npb24+PiB0dXBsZSkgewogIHZhciByZXN1bHQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbih0dXBsZS5maXJzdC5pc0VtcHR5ID8gbnVsbCA6IHR1cGxlLmZpcnN0LAogICAgICBpbml0aWFsaXplcjogdHVwbGUudGhpcmQsIHR5cGU6IHR1cGxlLnNlY29uZCwgaXNDb25zdDogdHJ1ZSk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBsZS5mb3VydGgubGVuZ3RoOyArK2kpIHsKICAgIHJlc3VsdC5hZGRBbm5vdGF0aW9uKHR1cGxlLmZvdXJ0aFtpXSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KClRleHRTZXJpYWxpemVyPFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyID0KICAgIG5ldyBDYXNlKGNvbnN0IFZhcmlhYmxlRGVjbGFyYXRpb25UYWdnZXIoKSwgWwogICJ2YXIiLAogICJmaW5hbCIsCiAgImNvbnN0IiwKXSwgWwogIHZhckRlY2xhcmF0aW9uU2VyaWFsaXplciwKICBmaW5hbERlY2xhcmF0aW9uU2VyaWFsaXplciwKICBjb25zdERlY2xhcmF0aW9uU2VyaWFsaXplciwKXSk7CgpUZXh0U2VyaWFsaXplcjxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBUeXBlUGFyYW1ldGVyLCB3cmFwVHlwZVBhcmFtZXRlciwgY29uc3QgRGFydFN0cmluZygpKTsKClN0cmluZyB1bndyYXBUeXBlUGFyYW1ldGVyKFR5cGVQYXJhbWV0ZXIgbm9kZSkgPT4gbm9kZS5uYW1lOwoKVHlwZVBhcmFtZXRlciB3cmFwVHlwZVBhcmFtZXRlcihTdHJpbmcgbmFtZSkgPT4gbmV3IFR5cGVQYXJhbWV0ZXIobmFtZSk7CgpUZXh0U2VyaWFsaXplcjxMaXN0PFR5cGVQYXJhbWV0ZXI+PiB0eXBlUGFyYW1ldGVyc1NlcmlhbGl6ZXIgPSBuZXcgWmlwKAogICAgbmV3IFJlYmluZCgKICAgICAgICBuZXcgWmlwKAogICAgICAgICAgICBuZXcgUmViaW5kKAogICAgICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5ldyBCaW5kZXIodHlwZVBhcmFtZXRlclNlcmlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZVBhcmFtZXRlck5hbWUsIHNldFR5cGVQYXJhbWV0ZXJOYW1lKSksCiAgICAgICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIoZGFydFR5cGVTZXJpYWxpemVyKSksCiAgICAgICAgICAgIHppcFR5cGVQYXJhbWV0ZXJCb3VuZCwKICAgICAgICAgICAgdW56aXBUeXBlUGFyYW1ldGVyQm91bmQpLAogICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihkYXJ0VHlwZVNlcmlhbGl6ZXIpKSwKICAgIHppcFR5cGVQYXJhbWV0ZXJEZWZhdWx0VHlwZSwKICAgIHVuemlwVHlwZVBhcmFtZXRlckRlZmF1bHRUeXBlKTsKClN0cmluZyBnZXRUeXBlUGFyYW1ldGVyTmFtZShUeXBlUGFyYW1ldGVyIG5vZGUpID0+IG5vZGUubmFtZTsKCnZvaWQgc2V0VHlwZVBhcmFtZXRlck5hbWUoVHlwZVBhcmFtZXRlciBub2RlLCBTdHJpbmcgbmFtZSkgewogIG5vZGUubmFtZSA9IG5hbWU7Cn0KClR5cGVQYXJhbWV0ZXIgemlwVHlwZVBhcmFtZXRlckJvdW5kKFR5cGVQYXJhbWV0ZXIgbm9kZSwgRGFydFR5cGUgYm91bmQpIHsKICByZXR1cm4gbm9kZS4uYm91bmQgPSBib3VuZDsKfQoKVHVwbGUyPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB1bnppcFR5cGVQYXJhbWV0ZXJCb3VuZChUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICByZXR1cm4gbmV3IFR1cGxlMihub2RlLCBub2RlLmJvdW5kKTsKfQoKVHlwZVBhcmFtZXRlciB6aXBUeXBlUGFyYW1ldGVyRGVmYXVsdFR5cGUoCiAgICBUeXBlUGFyYW1ldGVyIG5vZGUsIERhcnRUeXBlIGRlZmF1bHRUeXBlKSB7CiAgcmV0dXJuIG5vZGUuLmRlZmF1bHRUeXBlID0gZGVmYXVsdFR5cGU7Cn0KClR1cGxlMjxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gdW56aXBUeXBlUGFyYW1ldGVyRGVmYXVsdFR5cGUoCiAgICBUeXBlUGFyYW1ldGVyIG5vZGUpIHsKICByZXR1cm4gbmV3IFR1cGxlMihub2RlLCBub2RlLmRlZmF1bHRUeXBlKTsKfQoKY2xhc3MgRGFydFR5cGVUYWdnZXIgZXh0ZW5kcyBEYXJ0VHlwZVZpc2l0b3I8U3RyaW5nPgogICAgaW1wbGVtZW50cyBUYWdnZXI8RGFydFR5cGU+IHsKICBjb25zdCBEYXJ0VHlwZVRhZ2dlcigpOwoKICBTdHJpbmcgdGFnKERhcnRUeXBlIHR5cGUpID0+IHR5cGUuYWNjZXB0KHRoaXMpOwoKICBTdHJpbmcgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBfKSA9PiAiaW52YWxpZCI7CiAgU3RyaW5nIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgXykgPT4gImR5bmFtaWMiOwogIFN0cmluZyB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIF8pID0+ICJ2b2lkIjsKICBTdHJpbmcgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgXykgPT4gImJvdHRvbSI7CiAgU3RyaW5nIHZpc2l0RnVuY3Rpb25UeXBlKEZ1bmN0aW9uVHlwZSBfKSA9PiAiLT4iOwogIFN0cmluZyB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIF8pID0+ICJwYXIiOwp9CgpUZXh0U2VyaWFsaXplcjxJbnZhbGlkVHlwZT4gaW52YWxpZFR5cGVTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKHVud3JhcEludmFsaWRUeXBlLCB3cmFwSW52YWxpZFR5cGUsIGNvbnN0IE5vdGhpbmcoKSk7Cgp2b2lkIHVud3JhcEludmFsaWRUeXBlKEludmFsaWRUeXBlIHR5cGUpIHt9CgpJbnZhbGlkVHlwZSB3cmFwSW52YWxpZFR5cGUodm9pZCBpZ25vcmVkKSA9PiBjb25zdCBJbnZhbGlkVHlwZSgpOwoKVGV4dFNlcmlhbGl6ZXI8RHluYW1pY1R5cGU+IGR5bmFtaWNUeXBlU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBEeW5hbWljVHlwZSwgd3JhcER5bmFtaWNUeXBlLCBjb25zdCBOb3RoaW5nKCkpOwoKdm9pZCB1bndyYXBEeW5hbWljVHlwZShEeW5hbWljVHlwZSB0eXBlKSB7fQoKRHluYW1pY1R5cGUgd3JhcER5bmFtaWNUeXBlKHZvaWQgaWdub3JlZCkgPT4gY29uc3QgRHluYW1pY1R5cGUoKTsKClRleHRTZXJpYWxpemVyPFZvaWRUeXBlPiB2b2lkVHlwZVNlcmlhbGl6ZXIgPQogICAgbmV3IFdyYXBwZWQodW53cmFwVm9pZFR5cGUsIHdyYXBWb2lkVHlwZSwgY29uc3QgTm90aGluZygpKTsKCnZvaWQgdW53cmFwVm9pZFR5cGUoVm9pZFR5cGUgdHlwZSkge30KClZvaWRUeXBlIHdyYXBWb2lkVHlwZSh2b2lkIGlnbm9yZWQpID0+IGNvbnN0IFZvaWRUeXBlKCk7CgpUZXh0U2VyaWFsaXplcjxCb3R0b21UeXBlPiBib3R0b21UeXBlU2VyaWFsaXplciA9CiAgICBuZXcgV3JhcHBlZCh1bndyYXBCb3R0b21UeXBlLCB3cmFwQm90dG9tVHlwZSwgY29uc3QgTm90aGluZygpKTsKCnZvaWQgdW53cmFwQm90dG9tVHlwZShCb3R0b21UeXBlIHR5cGUpIHt9CgpCb3R0b21UeXBlIHdyYXBCb3R0b21UeXBlKHZvaWQgaWdub3JlZCkgPT4gY29uc3QgQm90dG9tVHlwZSgpOwoKLy8gVE9ETyhkbWl0cnlhcyk6ICBBbHNvIGhhbmRsZSBuYW1lUGFyYW1ldGVycywgYW5kIHR5cGVkZWZUeXBlLgpUZXh0U2VyaWFsaXplcjxGdW5jdGlvblR5cGU+IGZ1bmN0aW9uVHlwZVNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcEZ1bmN0aW9uVHlwZSwKICAgIHdyYXBGdW5jdGlvblR5cGUsCiAgICBuZXcgQmluZCgKICAgICAgICB0eXBlUGFyYW1ldGVyc1NlcmlhbGl6ZXIsCiAgICAgICAgbmV3IFR1cGxlNFNlcmlhbGl6ZXIoCiAgICAgICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihkYXJ0VHlwZVNlcmlhbGl6ZXIpLAogICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIoZGFydFR5cGVTZXJpYWxpemVyKSwKICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5hbWVkVHlwZVNlcmlhbGl6ZXIpLAogICAgICAgICAgICBkYXJ0VHlwZVNlcmlhbGl6ZXIpKSk7CgpUdXBsZTI8TGlzdDxUeXBlUGFyYW1ldGVyPiwKICAgICAgICBUdXBsZTQ8TGlzdDxEYXJ0VHlwZT4sIExpc3Q8RGFydFR5cGU+LCBMaXN0PE5hbWVkVHlwZT4sIERhcnRUeXBlPj4KICAgIHVud3JhcEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgdHlwZSkgewogIHJldHVybiBuZXcgVHVwbGUyKAogICAgICB0eXBlLnR5cGVQYXJhbWV0ZXJzLAogICAgICBuZXcgVHVwbGU0KAogICAgICAgICAgdHlwZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5zdWJsaXN0KDAsIHR5cGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksCiAgICAgICAgICB0eXBlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzLnN1Ymxpc3QodHlwZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50KSwKICAgICAgICAgIHR5cGUubmFtZWRQYXJhbWV0ZXJzLAogICAgICAgICAgdHlwZS5yZXR1cm5UeXBlKSk7Cn0KCkZ1bmN0aW9uVHlwZSB3cmFwRnVuY3Rpb25UeXBlKAogICAgVHVwbGUyPExpc3Q8VHlwZVBhcmFtZXRlcj4sCiAgICAgICAgICAgIFR1cGxlNDxMaXN0PERhcnRUeXBlPiwgTGlzdDxEYXJ0VHlwZT4sIExpc3Q8TmFtZWRUeXBlPiwgRGFydFR5cGU+PgogICAgICAgIHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBGdW5jdGlvblR5cGUodHVwbGUuc2Vjb25kLmZpcnN0ICsgdHVwbGUuc2Vjb25kLnNlY29uZCwKICAgICAgdHVwbGUuc2Vjb25kLmZvdXJ0aCwgTnVsbGFiaWxpdHkubGVnYWN5LAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0dXBsZS5zZWNvbmQuZmlyc3QubGVuZ3RoLAogICAgICB0eXBlUGFyYW1ldGVyczogdHVwbGUuZmlyc3QsCiAgICAgIG5hbWVkUGFyYW1ldGVyczogdHVwbGUuc2Vjb25kLnRoaXJkKTsKfQoKVGV4dFNlcmlhbGl6ZXI8TmFtZWRUeXBlPiBuYW1lZFR5cGVTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQodW53cmFwTmFtZWRUeXBlLAogICAgd3JhcE5hbWVkVHlwZSwgVHVwbGUyU2VyaWFsaXplcihjb25zdCBEYXJ0U3RyaW5nKCksIGRhcnRUeXBlU2VyaWFsaXplcikpOwoKVHVwbGUyPFN0cmluZywgRGFydFR5cGU+IHVud3JhcE5hbWVkVHlwZShOYW1lZFR5cGUgbmFtZWRUeXBlKSB7CiAgcmV0dXJuIG5ldyBUdXBsZTIobmFtZWRUeXBlLm5hbWUsIG5hbWVkVHlwZS50eXBlKTsKfQoKTmFtZWRUeXBlIHdyYXBOYW1lZFR5cGUoVHVwbGUyPFN0cmluZywgRGFydFR5cGU+IHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBOYW1lZFR5cGUodHVwbGUuZmlyc3QsIHR1cGxlLnNlY29uZCk7Cn0KClRleHRTZXJpYWxpemVyPFR5cGVQYXJhbWV0ZXJUeXBlPiB0eXBlUGFyYW1ldGVyVHlwZVNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgd3JhcFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgVHVwbGUyU2VyaWFsaXplcigKICAgICAgICBuZXcgU2NvcGVkVXNlPFR5cGVQYXJhbWV0ZXI+KCksIG5ldyBPcHRpb25hbChkYXJ0VHlwZVNlcmlhbGl6ZXIpKSk7CgpUdXBsZTI8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+IHVud3JhcFR5cGVQYXJhbWV0ZXJUeXBlKAogICAgVHlwZVBhcmFtZXRlclR5cGUgbm9kZSkgewogIHJldHVybiBuZXcgVHVwbGUyKG5vZGUucGFyYW1ldGVyLCBub2RlLnByb21vdGVkQm91bmQpOwp9CgpUeXBlUGFyYW1ldGVyVHlwZSB3cmFwVHlwZVBhcmFtZXRlclR5cGUoVHVwbGUyPFR5cGVQYXJhbWV0ZXIsIERhcnRUeXBlPiB0dXBsZSkgewogIHJldHVybiBuZXcgVHlwZVBhcmFtZXRlclR5cGUodHVwbGUuZmlyc3QsIE51bGxhYmlsaXR5LmxlZ2FjeSwgdHVwbGUuc2Vjb25kKTsKfQoKQ2FzZTxEYXJ0VHlwZT4gZGFydFR5cGVTZXJpYWxpemVyID0KICAgIG5ldyBDYXNlLnVuaW5pdGlhbGl6ZWQoY29uc3QgRGFydFR5cGVUYWdnZXIoKSk7CgpjbGFzcyBTdGF0ZW1lbnRUYWdnZXIgZXh0ZW5kcyBTdGF0ZW1lbnRWaXNpdG9yPFN0cmluZz4KICAgIGltcGxlbWVudHMgVGFnZ2VyPFN0YXRlbWVudD4gewogIGNvbnN0IFN0YXRlbWVudFRhZ2dlcigpOwoKICBTdHJpbmcgdGFnKFN0YXRlbWVudCBzdGF0ZW1lbnQpID0+IHN0YXRlbWVudC5hY2NlcHQodGhpcyk7CgogIFN0cmluZyB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBfKSA9PiAiZXhwciI7CiAgU3RyaW5nIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBfKSA9PiAicmV0IjsKfQoKVGV4dFNlcmlhbGl6ZXI8RXhwcmVzc2lvblN0YXRlbWVudD4gZXhwcmVzc2lvblN0YXRlbWVudFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcEV4cHJlc3Npb25TdGF0ZW1lbnQsIHdyYXBFeHByZXNzaW9uU3RhdGVtZW50LCBleHByZXNzaW9uU2VyaWFsaXplcik7CgpFeHByZXNzaW9uIHVud3JhcEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb247Cn0KCkV4cHJlc3Npb25TdGF0ZW1lbnQgd3JhcEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pOwp9CgpUZXh0U2VyaWFsaXplcjxSZXR1cm5TdGF0ZW1lbnQ+IHJldHVyblN0YXRlbWVudFNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcFJldHVyblN0YXRlbWVudCwgd3JhcFJldHVyblN0YXRlbWVudCwgZXhwcmVzc2lvblNlcmlhbGl6ZXIpOwoKRXhwcmVzc2lvbiB1bndyYXBSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCkgewogIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbjsKfQoKUmV0dXJuU3RhdGVtZW50IHdyYXBSZXR1cm5TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQoZXhwcmVzc2lvbik7Cn0KCkNhc2U8U3RhdGVtZW50PiBzdGF0ZW1lbnRTZXJpYWxpemVyID0KICAgIG5ldyBDYXNlLnVuaW5pdGlhbGl6ZWQoY29uc3QgU3RhdGVtZW50VGFnZ2VyKCkpOwoKY2xhc3MgRnVuY3Rpb25Ob2RlVGFnZ2VyIGltcGxlbWVudHMgVGFnZ2VyPEZ1bmN0aW9uTm9kZT4gewogIGNvbnN0IEZ1bmN0aW9uTm9kZVRhZ2dlcigpOwoKICBTdHJpbmcgdGFnKEZ1bmN0aW9uTm9kZSBub2RlKSB7CiAgICBzd2l0Y2ggKG5vZGUuYXN5bmNNYXJrZXIpIHsKICAgICAgY2FzZSBBc3luY01hcmtlci5Bc3luYzoKICAgICAgICByZXR1cm4gImFzeW5jIjsKICAgICAgY2FzZSBBc3luY01hcmtlci5TeW5jOgogICAgICAgIHJldHVybiAic3luYyI7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuQXN5bmNTdGFyOgogICAgICAgIHJldHVybiAiYXN5bmMtc3RhciI7CiAgICAgIGNhc2UgQXN5bmNNYXJrZXIuU3luY1N0YXI6CiAgICAgICAgcmV0dXJuICJzeW5jLXN0YXIiOwogICAgICBjYXNlIEFzeW5jTWFya2VyLlN5bmNZaWVsZGluZzoKICAgICAgICByZXR1cm4gInN5bmMteWllbGRpbmciOwogICAgfQogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIiR7bm9kZS5hc3luY01hcmtlcn0iKTsKICB9Cn0KClRleHRTZXJpYWxpemVyPEZ1bmN0aW9uTm9kZT4gc3luY0Z1bmN0aW9uTm9kZVNlcmlhbGl6ZXIgPSBuZXcgV3JhcHBlZCgKICAgIHVud3JhcEZ1bmN0aW9uTm9kZSwKICAgIHdyYXBTeW5jRnVuY3Rpb25Ob2RlLAogICAgbmV3IEJpbmQoCiAgICAgICAgbmV3IFJlYmluZCgKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNTZXJpYWxpemVyLAogICAgICAgICAgICBuZXcgVHVwbGUzU2VyaWFsaXplcigKICAgICAgICAgICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihuZXcgQmluZGVyKHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyLAogICAgICAgICAgICAgICAgICAgIGdldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lLCBzZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSkpLAogICAgICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5ldyBCaW5kZXIodmFyaWFibGVEZWNsYXJhdGlvblNlcmlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUsIHNldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lKSksCiAgICAgICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIobmV3IEJpbmRlcih2YXJpYWJsZURlY2xhcmF0aW9uU2VyaWFsaXplciwKICAgICAgICAgICAgICAgICAgICBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSwgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUpKSkpLAogICAgICAgIG5ldyBUdXBsZTJTZXJpYWxpemVyKGRhcnRUeXBlU2VyaWFsaXplciwgc3RhdGVtZW50U2VyaWFsaXplcikpKTsKClR1cGxlMjwKICAgIFR1cGxlMjwKICAgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+LAogICAgICAgIFR1cGxlMzxMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LAogICAgICAgICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+Pj4sCiAgICBUdXBsZTI8RGFydFR5cGUsIFN0YXRlbWVudD4+IHVud3JhcEZ1bmN0aW9uTm9kZShGdW5jdGlvbk5vZGUgbm9kZSkgewogIHJldHVybiBuZXcgVHVwbGUyKAogICAgICBuZXcgVHVwbGUyKAogICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycywKICAgICAgICAgIG5ldyBUdXBsZTMoCiAgICAgICAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5zdWJsaXN0KDAsIG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksCiAgICAgICAgICAgICAgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5zdWJsaXN0KG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCksCiAgICAgICAgICAgICAgbm9kZS5uYW1lZFBhcmFtZXRlcnMpKSwKICAgICAgbmV3IFR1cGxlMihub2RlLnJldHVyblR5cGUsIG5vZGUuYm9keSkpOwp9CgpGdW5jdGlvbk5vZGUgd3JhcFN5bmNGdW5jdGlvbk5vZGUoCiAgICBUdXBsZTI8CiAgICAgICAgICAgIFR1cGxlMjwKICAgICAgICAgICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4sCiAgICAgICAgICAgICAgICBUdXBsZTM8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiwKICAgICAgICAgICAgICAgICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+Pj4sCiAgICAgICAgICAgIFR1cGxlMjxEYXJ0VHlwZSwgU3RhdGVtZW50Pj4KICAgICAgICB0dXBsZSkgewogIHJldHVybiBuZXcgRnVuY3Rpb25Ob2RlKHR1cGxlLnNlY29uZC5zZWNvbmQsCiAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0dXBsZS5maXJzdC5maXJzdCwKICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6CiAgICAgICAgICB0dXBsZS5maXJzdC5zZWNvbmQuZmlyc3QgKyB0dXBsZS5maXJzdC5zZWNvbmQuc2Vjb25kLAogICAgICBuYW1lZFBhcmFtZXRlcnM6IHR1cGxlLmZpcnN0LnNlY29uZC50aGlyZCwKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHVwbGUuZmlyc3Quc2Vjb25kLmZpcnN0Lmxlbmd0aCwKICAgICAgcmV0dXJuVHlwZTogdHVwbGUuc2Vjb25kLmZpcnN0LAogICAgICBhc3luY01hcmtlcjogQXN5bmNNYXJrZXIuU3luYyk7Cn0KClRleHRTZXJpYWxpemVyPEZ1bmN0aW9uTm9kZT4gYXN5bmNGdW5jdGlvbk5vZGVTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBGdW5jdGlvbk5vZGUsCiAgICB3cmFwQXN5bmNGdW5jdGlvbk5vZGUsCiAgICBuZXcgQmluZCgKICAgICAgICBuZXcgUmViaW5kKAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyc1NlcmlhbGl6ZXIsCiAgICAgICAgICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKAogICAgICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5ldyBCaW5kZXIodmFyaWFibGVEZWNsYXJhdGlvblNlcmlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUsIHNldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lKSksCiAgICAgICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIobmV3IEJpbmRlcih2YXJpYWJsZURlY2xhcmF0aW9uU2VyaWFsaXplciwKICAgICAgICAgICAgICAgICAgICBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSwgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUpKSwKICAgICAgICAgICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihuZXcgQmluZGVyKHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyLAogICAgICAgICAgICAgICAgICAgIGdldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lLCBzZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSkpKSksCiAgICAgICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoZGFydFR5cGVTZXJpYWxpemVyLCBzdGF0ZW1lbnRTZXJpYWxpemVyKSkpOwoKRnVuY3Rpb25Ob2RlIHdyYXBBc3luY0Z1bmN0aW9uTm9kZSgKICAgIFR1cGxlMjwKICAgICAgICAgICAgVHVwbGUyPAogICAgICAgICAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiwKICAgICAgICAgICAgICAgIFR1cGxlMzxMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LAogICAgICAgICAgICAgICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4+PiwKICAgICAgICAgICAgVHVwbGUyPERhcnRUeXBlLCBTdGF0ZW1lbnQ+PgogICAgICAgIHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBGdW5jdGlvbk5vZGUodHVwbGUuc2Vjb25kLnNlY29uZCwKICAgICAgdHlwZVBhcmFtZXRlcnM6IHR1cGxlLmZpcnN0LmZpcnN0LAogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczoKICAgICAgICAgIHR1cGxlLmZpcnN0LnNlY29uZC5maXJzdCArIHR1cGxlLmZpcnN0LnNlY29uZC5zZWNvbmQsCiAgICAgIG5hbWVkUGFyYW1ldGVyczogdHVwbGUuZmlyc3Quc2Vjb25kLnRoaXJkLAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0dXBsZS5maXJzdC5zZWNvbmQuZmlyc3QubGVuZ3RoLAogICAgICByZXR1cm5UeXBlOiB0dXBsZS5zZWNvbmQuZmlyc3QsCiAgICAgIGFzeW5jTWFya2VyOiBBc3luY01hcmtlci5Bc3luYyk7Cn0KClRleHRTZXJpYWxpemVyPEZ1bmN0aW9uTm9kZT4gc3luY1N0YXJGdW5jdGlvbk5vZGVTZXJpYWxpemVyID0gbmV3IFdyYXBwZWQoCiAgICB1bndyYXBGdW5jdGlvbk5vZGUsCiAgICB3cmFwU3luY1N0YXJGdW5jdGlvbk5vZGUsCiAgICBuZXcgQmluZCgKICAgICAgICBuZXcgUmViaW5kKAogICAgICAgICAgICB0eXBlUGFyYW1ldGVyc1NlcmlhbGl6ZXIsCiAgICAgICAgICAgIG5ldyBUdXBsZTNTZXJpYWxpemVyKAogICAgICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5ldyBCaW5kZXIodmFyaWFibGVEZWNsYXJhdGlvblNlcmlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUsIHNldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lKSksCiAgICAgICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIobmV3IEJpbmRlcih2YXJpYWJsZURlY2xhcmF0aW9uU2VyaWFsaXplciwKICAgICAgICAgICAgICAgICAgICBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSwgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUpKSwKICAgICAgICAgICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihuZXcgQmluZGVyKHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyLAogICAgICAgICAgICAgICAgICAgIGdldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lLCBzZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSkpKSksCiAgICAgICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoZGFydFR5cGVTZXJpYWxpemVyLCBzdGF0ZW1lbnRTZXJpYWxpemVyKSkpOwoKRnVuY3Rpb25Ob2RlIHdyYXBTeW5jU3RhckZ1bmN0aW9uTm9kZSgKICAgIFR1cGxlMjwKICAgICAgICAgICAgVHVwbGUyPAogICAgICAgICAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiwKICAgICAgICAgICAgICAgIFR1cGxlMzxMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LAogICAgICAgICAgICAgICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4+PiwKICAgICAgICAgICAgVHVwbGUyPERhcnRUeXBlLCBTdGF0ZW1lbnQ+PgogICAgICAgIHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBGdW5jdGlvbk5vZGUodHVwbGUuc2Vjb25kLnNlY29uZCwKICAgICAgdHlwZVBhcmFtZXRlcnM6IHR1cGxlLmZpcnN0LmZpcnN0LAogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczoKICAgICAgICAgIHR1cGxlLmZpcnN0LnNlY29uZC5maXJzdCArIHR1cGxlLmZpcnN0LnNlY29uZC5zZWNvbmQsCiAgICAgIG5hbWVkUGFyYW1ldGVyczogdHVwbGUuZmlyc3Quc2Vjb25kLnRoaXJkLAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0dXBsZS5maXJzdC5zZWNvbmQuZmlyc3QubGVuZ3RoLAogICAgICByZXR1cm5UeXBlOiB0dXBsZS5zZWNvbmQuZmlyc3QsCiAgICAgIGFzeW5jTWFya2VyOiBBc3luY01hcmtlci5TeW5jU3Rhcik7Cn0KClRleHRTZXJpYWxpemVyPEZ1bmN0aW9uTm9kZT4gYXN5bmNTdGFyRnVuY3Rpb25Ob2RlU2VyaWFsaXplciA9IG5ldyBXcmFwcGVkKAogICAgdW53cmFwRnVuY3Rpb25Ob2RlLAogICAgd3JhcEFzeW5jU3RhckZ1bmN0aW9uTm9kZSwKICAgIG5ldyBCaW5kKAogICAgICAgIG5ldyBSZWJpbmQoCiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzU2VyaWFsaXplciwKICAgICAgICAgICAgbmV3IFR1cGxlM1NlcmlhbGl6ZXIoCiAgICAgICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIobmV3IEJpbmRlcih2YXJpYWJsZURlY2xhcmF0aW9uU2VyaWFsaXplciwKICAgICAgICAgICAgICAgICAgICBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSwgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUpKSwKICAgICAgICAgICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihuZXcgQmluZGVyKHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyLAogICAgICAgICAgICAgICAgICAgIGdldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lLCBzZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSkpLAogICAgICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5ldyBCaW5kZXIodmFyaWFibGVEZWNsYXJhdGlvblNlcmlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUsIHNldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lKSkpKSwKICAgICAgICBuZXcgVHVwbGUyU2VyaWFsaXplcihkYXJ0VHlwZVNlcmlhbGl6ZXIsIHN0YXRlbWVudFNlcmlhbGl6ZXIpKSk7CgpGdW5jdGlvbk5vZGUgd3JhcEFzeW5jU3RhckZ1bmN0aW9uTm9kZSgKICAgIFR1cGxlMjwKICAgICAgICAgICAgVHVwbGUyPAogICAgICAgICAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiwKICAgICAgICAgICAgICAgIFR1cGxlMzxMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+LAogICAgICAgICAgICAgICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4+PiwKICAgICAgICAgICAgVHVwbGUyPERhcnRUeXBlLCBTdGF0ZW1lbnQ+PgogICAgICAgIHR1cGxlKSB7CiAgcmV0dXJuIG5ldyBGdW5jdGlvbk5vZGUodHVwbGUuc2Vjb25kLnNlY29uZCwKICAgICAgdHlwZVBhcmFtZXRlcnM6IHR1cGxlLmZpcnN0LmZpcnN0LAogICAgICBwb3NpdGlvbmFsUGFyYW1ldGVyczoKICAgICAgICAgIHR1cGxlLmZpcnN0LnNlY29uZC5maXJzdCArIHR1cGxlLmZpcnN0LnNlY29uZC5zZWNvbmQsCiAgICAgIG5hbWVkUGFyYW1ldGVyczogdHVwbGUuZmlyc3Quc2Vjb25kLnRoaXJkLAogICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiB0dXBsZS5maXJzdC5zZWNvbmQuZmlyc3QubGVuZ3RoLAogICAgICByZXR1cm5UeXBlOiB0dXBsZS5zZWNvbmQuZmlyc3QsCiAgICAgIGFzeW5jTWFya2VyOiBBc3luY01hcmtlci5Bc3luY1N0YXIpOwp9CgpUZXh0U2VyaWFsaXplcjxGdW5jdGlvbk5vZGU+IHN5bmNZaWVsZGluZ1N0YXJGdW5jdGlvbk5vZGVTZXJpYWxpemVyID0KICAgIG5ldyBXcmFwcGVkKAogICAgICAgIHVud3JhcEZ1bmN0aW9uTm9kZSwKICAgICAgICB3cmFwU3luY1lpZWxkaW5nRnVuY3Rpb25Ob2RlLAogICAgICAgIG5ldyBCaW5kKAogICAgICAgICAgICBuZXcgUmViaW5kKAogICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNTZXJpYWxpemVyLAogICAgICAgICAgICAgICAgbmV3IFR1cGxlM1NlcmlhbGl6ZXIoCiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RTZXJpYWxpemVyKG5ldyBCaW5kZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVyLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUpKSwKICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdFNlcmlhbGl6ZXIobmV3IEJpbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvblNlcmlhbGl6ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZSkpLAogICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0U2VyaWFsaXplcihuZXcgQmluZGVyKAogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uU2VyaWFsaXplciwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhYmxlRGVjbGFyYXRpb25OYW1lKSkpKSwKICAgICAgICAgICAgbmV3IFR1cGxlMlNlcmlhbGl6ZXIoZGFydFR5cGVTZXJpYWxpemVyLCBzdGF0ZW1lbnRTZXJpYWxpemVyKSkpOwoKRnVuY3Rpb25Ob2RlIHdyYXBTeW5jWWllbGRpbmdGdW5jdGlvbk5vZGUoCiAgICBUdXBsZTI8CiAgICAgICAgICAgIFR1cGxlMjwKICAgICAgICAgICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4sCiAgICAgICAgICAgICAgICBUdXBsZTM8TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiwgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiwKICAgICAgICAgICAgICAgICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+Pj4sCiAgICAgICAgICAgIFR1cGxlMjxEYXJ0VHlwZSwgU3RhdGVtZW50Pj4KICAgICAgICB0dXBsZSkgewogIHJldHVybiBuZXcgRnVuY3Rpb25Ob2RlKHR1cGxlLnNlY29uZC5zZWNvbmQsCiAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0dXBsZS5maXJzdC5maXJzdCwKICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6CiAgICAgICAgICB0dXBsZS5maXJzdC5zZWNvbmQuZmlyc3QgKyB0dXBsZS5maXJzdC5zZWNvbmQuc2Vjb25kLAogICAgICBuYW1lZFBhcmFtZXRlcnM6IHR1cGxlLmZpcnN0LnNlY29uZC50aGlyZCwKICAgICAgcmVxdWlyZWRQYXJhbWV0ZXJDb3VudDogdHVwbGUuZmlyc3Quc2Vjb25kLmZpcnN0Lmxlbmd0aCwKICAgICAgcmV0dXJuVHlwZTogdHVwbGUuc2Vjb25kLmZpcnN0LAogICAgICBhc3luY01hcmtlcjogQXN5bmNNYXJrZXIuU3luY1lpZWxkaW5nKTsKfQoKQ2FzZTxGdW5jdGlvbk5vZGU+IGZ1bmN0aW9uTm9kZVNlcmlhbGl6ZXIgPQogICAgbmV3IENhc2UudW5pbml0aWFsaXplZChjb25zdCBGdW5jdGlvbk5vZGVUYWdnZXIoKSk7Cgp2b2lkIGluaXRpYWxpemVTZXJpYWxpemVycygpIHsKICBleHByZXNzaW9uU2VyaWFsaXplci50YWdzLmFkZEFsbChbCiAgICAic3RyaW5nIiwKICAgICJpbnQiLAogICAgImRvdWJsZSIsCiAgICAiYm9vbCIsCiAgICAibnVsbCIsCiAgICAiaW52YWxpZCIsCiAgICAibm90IiwKICAgICImJiIsCiAgICAifHwiLAogICAgImNvbmNhdCIsCiAgICAic3ltYm9sIiwKICAgICJ0aGlzIiwKICAgICJyZXRocm93IiwKICAgICJ0aHJvdyIsCiAgICAiYXdhaXQiLAogICAgImNvbmQiLAogICAgImlzIiwKICAgICJhcyIsCiAgICAidHlwZSIsCiAgICAibGlzdCIsCiAgICAiY29uc3QtbGlzdCIsCiAgICAic2V0IiwKICAgICJjb25zdC1zZXQiLAogICAgIm1hcCIsCiAgICAiY29uc3QtbWFwIiwKICAgICJsZXQiLAogICAgImdldC1wcm9wIiwKICAgICJzZXQtcHJvcCIsCiAgICAiZ2V0LXN1cGVyIiwKICAgICJzZXQtc3VwZXIiLAogICAgImludm9rZS1tZXRob2QiLAogICAgImludm9rZS1zdXBlciIsCiAgICAiZ2V0LXZhciIsCiAgICAic2V0LXZhciIsCiAgICAiZ2V0LXN0YXRpYyIsCiAgICAic2V0LXN0YXRpYyIsCiAgICAiZ2V0LWRpcmVjdC1wcm9wIiwKICAgICJzZXQtZGlyZWN0LXByb3AiLAogICAgImludm9rZS1zdGF0aWMiLAogICAgImludm9rZS1jb25zdC1zdGF0aWMiLAogICAgImludm9rZS1kaXJlY3QtbWV0aG9kIiwKICAgICJpbnZva2UtY29uc3RydWN0b3IiLAogICAgImludm9rZS1jb25zdC1jb25zdHJ1Y3RvciIsCiAgICAiZnVuIiwKICBdKTsKICBleHByZXNzaW9uU2VyaWFsaXplci5zZXJpYWxpemVycy5hZGRBbGwoWwogICAgc3RyaW5nTGl0ZXJhbFNlcmlhbGl6ZXIsCiAgICBpbnRMaXRlcmFsU2VyaWFsaXplciwKICAgIGRvdWJsZUxpdGVyYWxTZXJpYWxpemVyLAogICAgYm9vbExpdGVyYWxTZXJpYWxpemVyLAogICAgbnVsbExpdGVyYWxTZXJpYWxpemVyLAogICAgaW52YWxpZEV4cHJlc3Npb25TZXJpYWxpemVyLAogICAgbm90U2VyaWFsaXplciwKICAgIGxvZ2ljYWxBbmRTZXJpYWxpemVyLAogICAgbG9naWNhbE9yU2VyaWFsaXplciwKICAgIHN0cmluZ0NvbmNhdGVuYXRpb25TZXJpYWxpemVyLAogICAgc3ltYm9sTGl0ZXJhbFNlcmlhbGl6ZXIsCiAgICB0aGlzRXhwcmVzc2lvblNlcmlhbGl6ZXIsCiAgICByZXRocm93U2VyaWFsaXplciwKICAgIHRocm93U2VyaWFsaXplciwKICAgIGF3YWl0RXhwcmVzc2lvblNlcmlhbGl6ZXIsCiAgICBjb25kaXRpb25hbEV4cHJlc3Npb25TZXJpYWxpemVyLAogICAgaXNFeHByZXNzaW9uU2VyaWFsaXplciwKICAgIGFzRXhwcmVzc2lvblNlcmlhbGl6ZXIsCiAgICB0eXBlTGl0ZXJhbFNlcmlhbGl6ZXIsCiAgICBsaXN0TGl0ZXJhbFNlcmlhbGl6ZXIsCiAgICBjb25zdExpc3RMaXRlcmFsU2VyaWFsaXplciwKICAgIHNldExpdGVyYWxTZXJpYWxpemVyLAogICAgY29uc3RTZXRMaXRlcmFsU2VyaWFsaXplciwKICAgIG1hcExpdGVyYWxTZXJpYWxpemVyLAogICAgY29uc3RNYXBMaXRlcmFsU2VyaWFsaXplciwKICAgIGxldFNlcmlhbGl6ZXIsCiAgICBwcm9wZXJ0eUdldFNlcmlhbGl6ZXIsCiAgICBwcm9wZXJ0eVNldFNlcmlhbGl6ZXIsCiAgICBzdXBlclByb3BlcnR5R2V0U2VyaWFsaXplciwKICAgIHN1cGVyUHJvcGVydHlTZXRTZXJpYWxpemVyLAogICAgbWV0aG9kSW52b2NhdGlvblNlcmlhbGl6ZXIsCiAgICBzdXBlck1ldGhvZEludm9jYXRpb25TZXJpYWxpemVyLAogICAgdmFyaWFibGVHZXRTZXJpYWxpemVyLAogICAgdmFyaWFibGVTZXRTZXJpYWxpemVyLAogICAgc3RhdGljR2V0U2VyaWFsaXplciwKICAgIHN0YXRpY1NldFNlcmlhbGl6ZXIsCiAgICBkaXJlY3RQcm9wZXJ0eUdldFNlcmlhbGl6ZXIsCiAgICBkaXJlY3RQcm9wZXJ0eVNldFNlcmlhbGl6ZXIsCiAgICBzdGF0aWNJbnZvY2F0aW9uU2VyaWFsaXplciwKICAgIGNvbnN0U3RhdGljSW52b2NhdGlvblNlcmlhbGl6ZXIsCiAgICBkaXJlY3RNZXRob2RJbnZvY2F0aW9uU2VyaWFsaXplciwKICAgIGNvbnN0cnVjdG9ySW52b2NhdGlvblNlcmlhbGl6ZXIsCiAgICBjb25zdENvbnN0cnVjdG9ySW52b2NhdGlvblNlcmlhbGl6ZXIsCiAgICBmdW5jdGlvbkV4cHJlc3Npb25TZXJpYWxpemVyLAogIF0pOwogIGRhcnRUeXBlU2VyaWFsaXplci50YWdzLmFkZEFsbChbCiAgICAiaW52YWxpZCIsCiAgICAiZHluYW1pYyIsCiAgICAidm9pZCIsCiAgICAiYm90dG9tIiwKICAgICItPiIsCiAgICAicGFyIiwKICBdKTsKICBkYXJ0VHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplcnMuYWRkQWxsKFsKICAgIGludmFsaWRUeXBlU2VyaWFsaXplciwKICAgIGR5bmFtaWNUeXBlU2VyaWFsaXplciwKICAgIHZvaWRUeXBlU2VyaWFsaXplciwKICAgIGJvdHRvbVR5cGVTZXJpYWxpemVyLAogICAgZnVuY3Rpb25UeXBlU2VyaWFsaXplciwKICAgIHR5cGVQYXJhbWV0ZXJUeXBlU2VyaWFsaXplciwKICBdKTsKICBzdGF0ZW1lbnRTZXJpYWxpemVyLnRhZ3MuYWRkQWxsKFsKICAgICJleHByIiwKICAgICJyZXQiLAogIF0pOwogIHN0YXRlbWVudFNlcmlhbGl6ZXIuc2VyaWFsaXplcnMuYWRkQWxsKFsKICAgIGV4cHJlc3Npb25TdGF0ZW1lbnRTZXJpYWxpemVyLAogICAgcmV0dXJuU3RhdGVtZW50U2VyaWFsaXplciwKICBdKTsKICBmdW5jdGlvbk5vZGVTZXJpYWxpemVyLnRhZ3MuYWRkQWxsKFsKICAgICJzeW5jIiwKICAgICJhc3luYyIsCiAgICAic3luYy1zdGFyIiwKICAgICJhc3luYy1zdGFyIiwKICAgICJzeW5jLXlpZWxkaW5nIiwKICBdKTsKICBmdW5jdGlvbk5vZGVTZXJpYWxpemVyLnNlcmlhbGl6ZXJzLmFkZEFsbChbCiAgICBzeW5jRnVuY3Rpb25Ob2RlU2VyaWFsaXplciwKICAgIGFzeW5jRnVuY3Rpb25Ob2RlU2VyaWFsaXplciwKICAgIHN5bmNTdGFyRnVuY3Rpb25Ob2RlU2VyaWFsaXplciwKICAgIGFzeW5jU3RhckZ1bmN0aW9uTm9kZVNlcmlhbGl6ZXIsCiAgICBzeW5jWWllbGRpbmdTdGFyRnVuY3Rpb25Ob2RlU2VyaWFsaXplciwKICBd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YXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnOwoKaW1wb3J0ICdkaWxsX21lbWJlcl9idWlsZGVyLmRhcnQnOwoKY2xhc3MgRGlsbEV4dGVuc2lvbk1lbWJlckJ1aWxkZXIgZXh0ZW5kcyBEaWxsTWVtYmVyQnVpbGRlciB7CiAgZmluYWwgRXh0ZW5zaW9uTWVtYmVyRGVzY3JpcHRvciBfZGVzY3JpcHRvcjsKCiAgZmluYWwgTWVtYmVyIF9leHRlbnNpb25UZWFyT2ZmOwoKICBEaWxsRXh0ZW5zaW9uTWVtYmVyQnVpbGRlcihNZW1iZXIgbWVtYmVyLCB0aGlzLl9kZXNjcmlwdG9yLCBCdWlsZGVyIHBhcmVudCwKICAgICAgW3RoaXMuX2V4dGVuc2lvblRlYXJPZmZdKQogICAgICA6IHN1cGVyKG1lbWJlciwgcGFyZW50KTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNTdGF0aWMgPT4gX2Rlc2NyaXB0b3IuaXNTdGF0aWM7CgogIGJvb2wgZ2V0IGlzRXh0ZXJuYWwgPT4gbWVtYmVyLmlzRXh0ZXJuYWw7CgogIEBvdmVycmlkZQogIFByb2NlZHVyZUtpbmQgZ2V0IGtpbmQgewogICAgc3dpdGNoIChfZGVzY3JpcHRvci5raW5kKSB7CiAgICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5NZXRob2Q6CiAgICAgICAgcmV0dXJuIFByb2NlZHVyZUtpbmQuTWV0aG9kOwogICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuR2V0dGVyOgogICAgICAgIHJldHVybiBQcm9jZWR1cmVLaW5kLkdldHRlcjsKICAgICAgY2FzZSBFeHRlbnNpb25NZW1iZXJLaW5kLk9wZXJhdG9yOgogICAgICAgIHJldHVybiBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOwogICAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuU2V0dGVyOgogICAgICAgIHJldHVybiBQcm9jZWR1cmVLaW5kLlNldHRlcjsKICAgICAgY2FzZSBFeHRlbnNpb25NZW1iZXJLaW5kLlRlYXJPZmY6CiAgICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5GaWVsZDoKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgTWVtYmVyIGdldCByZWFkVGFyZ2V0IHsKICAgIGlmIChpc0ZpZWxkKSB7CiAgICAgIHJldHVybiBtZW1iZXI7CiAgICB9CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk1ldGhvZDoKICAgICAgICByZXR1cm4gX2V4dGVuc2lvblRlYXJPZmYgPz8gbWVtYmVyOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICAgIHJldHVybiBtZW1iZXI7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkZhY3Rvcnk6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0aHJvdyB1bmhhbmRsZWQoJ1Byb2NlZHVyZUtpbmQnLCAnJGtpbmQnLCBjaGFyT2Zmc2V0LCBmaWxlVXJpKTsKICB9CgogIEBvdmVycmlkZQogIE1lbWJlciBnZXQgd3JpdGVUYXJnZXQgewogICAgaWYgKGlzRmllbGQpIHsKICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZSA/IG1lbWJlciA6IG51bGw7CiAgICB9CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICByZXR1cm4gbWVtYmVyOwogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5GYWN0b3J5OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhyb3cgdW5oYW5kbGVkKCdQcm9jZWR1cmVLaW5kJywgJyRraW5kJywgY2hhck9mZnNldCwgZmlsZVVyaSk7CiAgfQoKICBAb3ZlcnJpZGUKICBNZW1iZXIgZ2V0IGludm9rZVRhcmdldCB7CiAgICBpZiAoaXNGaWVsZCkgewogICAgICByZXR1cm4gbWVtYmVyOwogICAgfQogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkZhY3Rvcnk6CiAgICAgICAgcmV0dXJuIG1lbWJlcjsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRocm93IHVuaGFuZGxlZCgnUHJvY2VkdXJlS2luZCcsICcka2luZCcsIGNoYXJPZmZzZXQsIGZpbGVVcmkpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNBc3NpZ25hYmxlID0+IG1lbWJlciBpcyBGaWVsZCAmJiBtZW1iZXIuaGFzU2V0dGVyOwp9CmYATk48ASIBIgEiARsBIwE9LwEiAU4gHwEMLQEsAQwbICclJyUpJyclKCYGEQQBDBoTFQYUISwhFyMhIhUGRAQBDBsTKwYUIRchISMiFQZEBAEMHBMVBhQhISMiFyEVBkQEAQxAAgFDcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9leHRlbnNpb25fbWVtYmVyX2J1aWxkZXIuZGFydGlmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9idWlsZGVyX2NvbXB1dGVyLmRhcnSTuy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLnR5cGVfYnVpbGRlcl9jb21wdXRlcjsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvcGFyc2VyLmRhcnQnCiAgICBzaG93IEZvcm1hbFBhcmFtZXRlcktpbmQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgc2hvdwogICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgQ2xhc3MsCiAgICAgICAgRGFydFR5cGUsCiAgICAgICAgRGFydFR5cGVWaXNpdG9yLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEZ1bmN0aW9uVHlwZSwKICAgICAgICBJbnRlcmZhY2VUeXBlLAogICAgICAgIEludmFsaWRUeXBlLAogICAgICAgIExpYnJhcnksCiAgICAgICAgTmFtZWRUeXBlLAogICAgICAgIE5ldmVyVHlwZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFR5cGVQYXJhbWV0ZXJUeXBlLAogICAgICAgIFR5cGVkZWZUeXBlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICcuLi9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9keW5hbWljX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Zvcm1hbF9wYXJhbWV0ZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL25ldmVyX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL251bGxhYmlsaXR5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci92b2lkX3R5cGVfYnVpbGRlci5kYXJ0JzsKCmltcG9ydCAnLi4vbG9hZGVyLmRhcnQnIHNob3cgTG9hZGVyOwoKY2xhc3MgVHlwZUJ1aWxkZXJDb21wdXRlciBpbXBsZW1lbnRzIERhcnRUeXBlVmlzaXRvcjxUeXBlQnVpbGRlcj4gewogIGZpbmFsIExvYWRlciBsb2FkZXI7CgogIGNvbnN0IFR5cGVCdWlsZGVyQ29tcHV0ZXIodGhpcy5sb2FkZXIpOwoKICBUeXBlQnVpbGRlciBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSkgewogICAgdGhyb3cgIlVuc3VwcG9ydGVkIjsKICB9CgogIFR5cGVCdWlsZGVyIHZpc2l0SW52YWxpZFR5cGUoSW52YWxpZFR5cGUgbm9kZSkgewogICAgdGhyb3cgIk5vdCBpbXBsZW1lbnRlZCI7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdER5bmFtaWNUeXBlKER5bmFtaWNUeXBlIG5vZGUpIHsKICAgIC8vICdkeW5hbWljJyBpcyBhbHdheXMgbnVsbGFibGUuCiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoCiAgICAgICAgImR5bmFtaWMiLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKSwgbnVsbCkKICAgICAgLi5iaW5kKAogICAgICAgICAgbmV3IER5bmFtaWNUeXBlQnVpbGRlcihjb25zdCBEeW5hbWljVHlwZSgpLCBsb2FkZXIuY29yZUxpYnJhcnksIC0xKSk7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdFZvaWRUeXBlKFZvaWRUeXBlIG5vZGUpIHsKICAgIC8vICd2b2lkJyBpcyBhbHdheXMgbnVsbGFibGUuCiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoCiAgICAgICAgInZvaWQiLCBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIubnVsbGFibGUoKSwgbnVsbCkKICAgICAgLi5iaW5kKG5ldyBWb2lkVHlwZUJ1aWxkZXIoY29uc3QgVm9pZFR5cGUoKSwgbG9hZGVyLmNvcmVMaWJyYXJ5LCAtMSkpOwogIH0KCiAgVHlwZUJ1aWxkZXIgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSkgewogICAgdGhyb3cgIk5vdCBpbXBsZW1lbnRlZCI7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdE5ldmVyVHlwZShOZXZlclR5cGUgbm9kZSkgewogICAgcmV0dXJuIG5ldyBOYW1lZFR5cGVCdWlsZGVyKAogICAgICAgICJOZXZlciIsIG5ldyBOdWxsYWJpbGl0eUJ1aWxkZXIuZnJvbU51bGxhYmlsaXR5KG5vZGUubnVsbGFiaWxpdHkpLCBudWxsKQogICAgICAuLmJpbmQobmV3IE5ldmVyVHlwZUJ1aWxkZXIobm9kZSwgbG9hZGVyLmNvcmVMaWJyYXJ5LCAtMSkpOwogIH0KCiAgVHlwZUJ1aWxkZXIgdmlzaXRJbnRlcmZhY2VUeXBlKEludGVyZmFjZVR5cGUgbm9kZSkgewogICAgQ2xhc3NCdWlsZGVyIGNscyA9CiAgICAgICAgbG9hZGVyLmNvbXB1dGVDbGFzc0J1aWxkZXJGcm9tVGFyZ2V0Q2xhc3Mobm9kZS5jbGFzc05vZGUpOwogICAgTGlzdDxUeXBlQnVpbGRlcj4gYXJndW1lbnRzOwogICAgTGlzdDxEYXJ0VHlwZT4ga2VybmVsQXJndW1lbnRzID0gbm9kZS50eXBlQXJndW1lbnRzOwogICAgaWYgKGtlcm5lbEFyZ3VtZW50cy5pc05vdEVtcHR5KSB7CiAgICAgIGFyZ3VtZW50cyA9IG5ldyBMaXN0PFR5cGVCdWlsZGVyPihrZXJuZWxBcmd1bWVudHMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXJuZWxBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcmd1bWVudHNbaV0gPSBrZXJuZWxBcmd1bWVudHNbaV0uYWNjZXB0KHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIoY2xzLm5hbWUsCiAgICAgICAgbmV3IE51bGxhYmlsaXR5QnVpbGRlci5mcm9tTnVsbGFiaWxpdHkobm9kZS5udWxsYWJpbGl0eSksIGFyZ3VtZW50cykKICAgICAgLi5iaW5kKGNscyk7CiAgfQoKICBAb3ZlcnJpZGUKICBUeXBlQnVpbGRlciB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgVHlwZUJ1aWxkZXIgcmV0dXJuVHlwZSA9IG5vZGUucmV0dXJuVHlwZS5hY2NlcHQodGhpcyk7CiAgICAvLyBXZSBjb3VsZCBjb21wdXRlIHRoZSB0eXBlIHZhcmlhYmxlcyBoZXJlLiBIb3dldmVyLCB0aGUgY3VycmVudAogICAgLy8gaW1wbGVtZW50YXRpb24gb2YgW3Zpc2l0VHlwZVBhcmFtZXRlclR5cGVdIGlzIHN1ZmZpY2llbnQuCiAgICBMaXN0PFR5cGVWYXJpYWJsZUJ1aWxkZXI+IHR5cGVWYXJpYWJsZXMgPSBudWxsOwogICAgTGlzdDxEYXJ0VHlwZT4gcG9zaXRpb25hbFBhcmFtZXRlcnMgPSBub2RlLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgTGlzdDxOYW1lZFR5cGU+IG5hbWVkUGFyYW1ldGVycyA9IG5vZGUubmFtZWRQYXJhbWV0ZXJzOwogICAgTGlzdDxGb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPiBmb3JtYWxzID0gbmV3IExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4oCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoICsgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgIEZvcm1hbFBhcmFtZXRlcktpbmQga2luZCA9IEZvcm1hbFBhcmFtZXRlcktpbmQubWFuZGF0b3J5OwogICAgICBpZiAoaSA+PSBub2RlLnJlcXVpcmVkUGFyYW1ldGVyQ291bnQpIHsKICAgICAgICBraW5kID0gRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWw7CiAgICAgIH0KICAgICAgZm9ybWFsc1tpXSA9CiAgICAgICAgICBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcihudWxsLCAwLCB0eXBlLCBudWxsLCBudWxsLCAtMSwgbnVsbCkKICAgICAgICAgICAgLi5raW5kID0ga2luZDsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIE5hbWVkVHlwZSBwYXJhbWV0ZXIgPSBuYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgIFR5cGVCdWlsZGVyIHR5cGUgPSBwb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5hY2NlcHQodGhpcyk7CiAgICAgIGZvcm1hbHNbaSArIHBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aF0gPSBuZXcgRm9ybWFsUGFyYW1ldGVyQnVpbGRlcigKICAgICAgICAgIG51bGwsIDAsIHR5cGUsIHBhcmFtZXRlci5uYW1lLCBudWxsLCAtMSwgbnVsbCkKICAgICAgICAuLmtpbmQgPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQ7CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVHlwZUJ1aWxkZXIocmV0dXJuVHlwZSwgdHlwZVZhcmlhYmxlcywgZm9ybWFscywKICAgICAgICBuZXcgTnVsbGFiaWxpdHlCdWlsZGVyLmZyb21OdWxsYWJpbGl0eShub2RlLm51bGxhYmlsaXR5KSk7CiAgfQoKICBUeXBlQnVpbGRlciB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIFR5cGVQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbm9kZS5wYXJhbWV0ZXI7CiAgICBDbGFzcyBrZXJuZWxDbGFzcyA9IHBhcmFtZXRlci5wYXJlbnQ7CiAgICBMaWJyYXJ5IGtlcm5lbExpYnJhcnkgPSBrZXJuZWxDbGFzcy5lbmNsb3NpbmdMaWJyYXJ5OwogICAgTGlicmFyeUJ1aWxkZXIgbGlicmFyeSA9IGxvYWRlci5idWlsZGVyc1trZXJuZWxMaWJyYXJ5LmltcG9ydFVyaV07CiAgICByZXR1cm4gbmV3IE5hbWVkVHlwZUJ1aWxkZXIocGFyYW1ldGVyLm5hbWUsCiAgICAgICAgbmV3IE51bGxhYmlsaXR5QnVpbGRlci5mcm9tTnVsbGFiaWxpdHkobm9kZS5udWxsYWJpbGl0eSksIG51bGwpCiAgICAgIC4uYmluZChuZXcgVHlwZVZhcmlhYmxlQnVpbGRlci5mcm9tS2VybmVsKHBhcmFtZXRlciwgbGlicmFyeSkpOwogIH0KCiAgVHlwZUJ1aWxkZXIgdmlzaXRUeXBlZGVmVHlwZShUeXBlZGVmVHlwZSBub2RlKSB7CiAgICB0aHJvdyAiTm90IGltcGxlbWVudGVkIjsKICB9Cn0KgI4ATk48ASUBPB4BIQkUDxIZFRYXFRETExcbFRIBKC8zMCotLS4nMCwBJQFEFwEqAS8ZBAEzHQQBMyUhPg5QBAEtIiE7TQQBMR0EAS8hUUIEATcXQyE5JkE5OAgGKk0TBAEMNTtGQTRFPE0/PD9ALjcIE0obBjcwP005NAZHQwQBPy4qOkcwSEYEATMdBAIBPXBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9idWlsZGVyX2NvbXB1dGVyLmRhcnRdZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvcmV3cml0ZV9zZXZlcml0eS5kYXJ0hUcvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL21lc3NhZ2VzL3NldmVyaXR5LmRhcnQnIHNob3cgU2V2ZXJpdHk7CgppbXBvcnQgJ21lc3NhZ2VzLmRhcnQnIGFzIG1zZzsKClNldmVyaXR5IHJld3JpdGVTZXZlcml0eSgKICAgIFNldmVyaXR5IHNldmVyaXR5LCBtc2cuQ29kZTxPYmplY3Q+IGNvZGUsIFVyaSBmaWxlVXJpKSB7CiAgaWYgKHNldmVyaXR5ICE9IFNldmVyaXR5Lmlnbm9yZWQpIHsKICAgIHJldHVybiBzZXZlcml0eTsKICB9CgogIFN0cmluZyBwYXRoID0gZmlsZVVyaS5wYXRoOwogIFN0cmluZyBmYXN0YVBhdGggPSAiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS8iOwogIGludCBpbmRleCA9IHBhdGguaW5kZXhPZihmYXN0YVBhdGgpOwogIGlmIChpbmRleCA9PSAtMSkgewogICAgZmFzdGFQYXRoID0gIi9wa2cvZnJvbnRfZW5kL3Rvb2wvX2Zhc3RhLyI7CiAgICBpbmRleCA9IHBhdGguaW5kZXhPZihmYXN0YVBhdGgpOwogICAgaWYgKGluZGV4ID09IC0xKSByZXR1cm4gc2V2ZXJpdHk7CiAgfQogIGlmIChjb2RlID09IG1zZy5jb2RlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcikgewogICAgLy8gVE9ETyhhaGUpOiBSZW1vdmUgdGhlIGV4Y2VwdGlvbnMgYmVsb3cuCiAgICAvLyBXZSBwbGFuIHRvIHJlbW92ZSBhbGwgdXNlcyBvZiBkZXByZWNhdGVkIGlkZW50aWZpZXJzIGZyb20gRmFzdGEuIFRoZQogICAgLy8gc3RyYXRlZ3kgaXMgdG8gcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGxpc3QgYmVsb3cgb25lIGJ5IG9uZS4gVG8gZ2V0CiAgICAvLyBzdGFydGVkIG9uIGNsZWFuaW5nIHVwIGEgZ2l2ZW4gZmlsZSwgc2ltcGx5IHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0CiAgICAvLyBiZWxvdyBhbmQgY29tcGlsZSBGYXN0YSB3aXRoIGl0c2VsZiB0byBnZXQgYSBsaXN0IG9mIHJlbWFpbmluZyBjYWxsCiAgICAvLyBzaXRlcy4KICAgIHN3aXRjaCAocGF0aC5zdWJzdHJpbmcoZmFzdGFQYXRoLmxlbmd0aCArIGluZGV4KSkgewogICAgICBjYXNlICJjb21tYW5kX2xpbmUuZGFydCI6CiAgICAgIGNhc2UgImtlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCI6CiAgICAgICAgcmV0dXJuIHNldmVyaXR5OwogICAgfQogIH0KICByZXR1cm4gU2V2ZXJpdHkuZXJyb3I7Cn0KJwBOTjwBTwEfARo9JhUEAR42JxUvJSYEMy9MSktLDjggJxkGBBkCATFwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcmV3cml0ZV9zZXZlcml0eS5kYXJ0U2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3RhcmdldC5kYXJ0gy4vLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50YXJnZXQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgc2hvdyBDb21wb25lbnQ7CgppbXBvcnQgJ3RpY2tlci5kYXJ0JyBzaG93IFRpY2tlcjsKCi8vLyBBIGNvbXBpbGF0aW9uIHRhcmdldC4KLy8vCi8vLyBBIHRhcmdldCByZWFkcyBzb3VyY2UgZmlsZXMgd2l0aCBbcmVhZF0sIGJ1aWxkcyBvdXRsaW5lcyB3aGVuCi8vLyBbYnVpbGRPdXRsaW5lc10gaXMgY2FsbGVkIGFuZCBidWlsZHMgdGhlIGZ1bGwgY29tcG9uZW50IHdoZW4KLy8vIFtidWlsZENvbXBvbmVudF0gaXMgY2FsbGVkLgphYnN0cmFjdCBjbGFzcyBUYXJnZXQgewogIGZpbmFsIFRpY2tlciB0aWNrZXI7CgogIFRhcmdldCh0aGlzLnRpY2tlcik7CgogIC8vLyBCdWlsZCBhbmQgcmV0dXJuIG91dGxpbmVzIGZvciBhbGwgbGlicmFyaWVzLgogIEZ1dHVyZTxDb21wb25lbnQ+IGJ1aWxkT3V0bGluZXMoKTsKCiAgLy8vIEJ1aWxkIGFuZCByZXR1cm4gdGhlIGZ1bGwgY29tcG9uZW50IGZvciBhbGwgbGlicmFyaWVzLgogIEZ1dHVyZTxDb21wb25lbnQ+IGJ1aWxkQ29tcG9uZW50KCk7Cn0KHgBOTjwBFgEhATEBIgEaBEJBIBgXARcBMyUBPSYCASdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdGFyZ2V0LmRhcnRfZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvdGVzdGluZy9pZF90ZXN0aW5nX3V0aWxzLmRhcnTAAFIvLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9mYXN0YS9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vZmFzdGEvYnVpbGRlci9saWJyYXJ5X2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vZmFzdGEvYnVpbGRlci9tZW1iZXJfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9mYXN0YS9idWlsZGVyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9mYXN0YS9idWlsZGVyL3R5cGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9mYXN0YS9idWlsZGVyL3R5cGVfdmFyaWFibGVfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9mYXN0YS9idWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2Zhc3RhL21lc3NhZ2VzLmRhcnQnOwppbXBvcnQgJy4uL2Zhc3RhL3NvdXJjZS9zb3VyY2VfbGlicmFyeV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2Zhc3RhL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnQnOwppbXBvcnQgJy4uL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0JzsKCi8vLyBIZWxwZXIgbWV0aG9kcyB0byB1c2UgaW4gYW5ub3RhdGVkIHRlc3RzLgoKLy8vIFJldHVybnMgYSBjYW5vbmljYWwgc2ltcGxlIG5hbWUgZm9yIFttZW1iZXJdLgpTdHJpbmcgZ2V0TWVtYmVyTmFtZShNZW1iZXIgbWVtYmVyKSB7CiAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmlzU2V0dGVyKSByZXR1cm4gJyR7bWVtYmVyLm5hbWUubmFtZX09JzsKICByZXR1cm4gbWVtYmVyLm5hbWUubmFtZTsKfQoKLy8vIFJldHVybnMgdGhlIGVuY2xvc2luZyBbTWVtYmVyXSBmb3IgW25vZGVdLgpNZW1iZXIgZ2V0RW5jbG9zaW5nTWVtYmVyKFRyZWVOb2RlIG5vZGUpIHsKICB3aGlsZSAobm9kZSBpcyEgTWVtYmVyKSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgfQogIHJldHVybiBub2RlOwp9CgovLy8gRmluZHMgdGhlIGZpcnN0IFtMaWJyYXJ5XSBpbiBbY29tcG9uZW50XSB3aXRoIHRoZSBnaXZlbiBpbXBvcnQgW3VyaV0uCi8vLwovLy8gSWYgW3JlcXVpcmVkXSBpcyBgdHJ1ZWAgYW4gZXJyb3IgaXMgdGhyb3duIGlmIG5vIGxpYnJhcnkgd2FzIGZvdW5kLgpMaWJyYXJ5IGxvb2t1cExpYnJhcnkoQ29tcG9uZW50IGNvbXBvbmVudCwgVXJpIHVyaSwge2Jvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgcmV0dXJuIGNvbXBvbmVudC5saWJyYXJpZXMKICAgICAgLmZpcnN0V2hlcmUoKExpYnJhcnkgbGlicmFyeSkgPT4gbGlicmFyeS5pbXBvcnRVcmkgPT0gdXJpLCBvckVsc2U6ICgpIHsKICAgIGlmIChyZXF1aXJlZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTGlicmFyeSAnJHVyaScgbm90IGZvdW5kLiIpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSk7Cn0KCi8vLyBGaW5kcyB0aGUgZmlyc3QgW0NsYXNzXSBpbiBbbGlicmFyeV0gd2l0aCB0aGUgZ2l2ZW4gW2NsYXNzTmFtZV0uCi8vLwovLy8gSWYgW3JlcXVpcmVkXSBpcyBgdHJ1ZWAgYW4gZXJyb3IgaXMgdGhyb3duIGlmIG5vIGNsYXNzIHdhcyBmb3VuZC4KQ2xhc3MgbG9va3VwQ2xhc3MoTGlicmFyeSBsaWJyYXJ5LCBTdHJpbmcgY2xhc3NOYW1lLCB7Ym9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICByZXR1cm4gbGlicmFyeS5jbGFzc2VzLmZpcnN0V2hlcmUoKENsYXNzIGNscykgPT4gY2xzLm5hbWUgPT0gY2xhc3NOYW1lLAogICAgICBvckVsc2U6ICgpIHsKICAgIGlmIChyZXF1aXJlZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiQ2xhc3MgJyRjbGFzc05hbWUnIG5vdCBmb3VuZCBpbiAnJGxpYnJhcnknLiIpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSk7Cn0KCi8vLyBGaW5kcyB0aGUgZmlyc3QgW0V4dGVuc2lvbl0gaW4gW2xpYnJhcnldIHdpdGggdGhlIGdpdmVuIFtjbGFzc05hbWVdLgovLy8KLy8vIElmIFtyZXF1aXJlZF0gaXMgYHRydWVgIGFuIGVycm9yIGlzIHRocm93biBpZiBubyBjbGFzcyB3YXMgZm91bmQuCkV4dGVuc2lvbiBsb29rdXBFeHRlbnNpb24oTGlicmFyeSBsaWJyYXJ5LCBTdHJpbmcgZXh0ZW5zaW9uTmFtZSwKICAgIHtib29sIHJlcXVpcmVkOiB0cnVlfSkgewogIHJldHVybiBsaWJyYXJ5LmV4dGVuc2lvbnMuZmlyc3RXaGVyZSgKICAgICAgKEV4dGVuc2lvbiBleHRlbnNpb24pID0+IGV4dGVuc2lvbi5uYW1lID09IGV4dGVuc2lvbk5hbWUsIG9yRWxzZTogKCkgewogICAgaWYgKHJlcXVpcmVkKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgIkV4dGVuc2lvbiAnJGV4dGVuc2lvbk5hbWUnIG5vdCBmb3VuZCBpbiAnJHtsaWJyYXJ5LmltcG9ydFVyaX0nLiIpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSk7Cn0KCi8vLyBGaW5kcyB0aGUgZmlyc3QgW01lbWJlcl0gaW4gW2xpYnJhcnldIHdpdGggdGhlIGdpdmVuIGNhbm9uaWNhbCBzaW1wbGUKLy8vIFttZW1iZXJOYW1lXSBhcyBjb21wdXRlZCBieSBbZ2V0TWVtYmVyTmFtZV0uCi8vLwovLy8gSWYgW3JlcXVpcmVkXSBpcyBgdHJ1ZWAgYW4gZXJyb3IgaXMgdGhyb3duIGlmIG5vIG1lbWJlciB3YXMgZm91bmQuCk1lbWJlciBsb29rdXBMaWJyYXJ5TWVtYmVyKExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG1lbWJlck5hbWUsCiAgICB7Ym9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICByZXR1cm4gbGlicmFyeS5tZW1iZXJzLmZpcnN0V2hlcmUoCiAgICAgIChNZW1iZXIgbWVtYmVyKSA9PiBnZXRNZW1iZXJOYW1lKG1lbWJlcikgPT0gbWVtYmVyTmFtZSwgb3JFbHNlOiAoKSB7CiAgICBpZiAocmVxdWlyZWQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIk1lbWJlciAnJG1lbWJlck5hbWUnIG5vdCBmb3VuZCBpbiAnJGxpYnJhcnknLiIpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSk7Cn0KCi8vLyBGaW5kcyB0aGUgZmlyc3QgW01lbWJlcl0gaW4gW2Nsc10gd2l0aCB0aGUgZ2l2ZW4gY2Fub25pY2FsIHNpbXBsZQovLy8gW21lbWJlck5hbWVdIGFzIGNvbXB1dGVkIGJ5IFtnZXRNZW1iZXJOYW1lXS4KLy8vCi8vLyBJZiBbcmVxdWlyZWRdIGlzIGB0cnVlYCBhbiBlcnJvciBpcyB0aHJvd24gaWYgbm8gbWVtYmVyIHdhcyBmb3VuZC4KTWVtYmVyIGxvb2t1cENsYXNzTWVtYmVyKENsYXNzIGNscywgU3RyaW5nIG1lbWJlck5hbWUsIHtib29sIHJlcXVpcmVkOiB0cnVlfSkgewogIHJldHVybiBjbHMubWVtYmVycy5maXJzdFdoZXJlKAogICAgICAoTWVtYmVyIG1lbWJlcikgPT4gZ2V0TWVtYmVyTmFtZShtZW1iZXIpID09IG1lbWJlck5hbWUsIG9yRWxzZTogKCkgewogICAgaWYgKHJlcXVpcmVkKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJNZW1iZXIgJyRtZW1iZXJOYW1lJyBub3QgZm91bmQgaW4gJyRjbHMnLiIpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSk7Cn0KCkxpYnJhcnlCdWlsZGVyIGxvb2t1cExpYnJhcnlCdWlsZGVyKAogICAgSW50ZXJuYWxDb21waWxlclJlc3VsdCBjb21waWxlclJlc3VsdCwgTGlicmFyeSBsaWJyYXJ5LAogICAge2Jvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgU291cmNlTG9hZGVyIGxvYWRlciA9IGNvbXBpbGVyUmVzdWx0Lmtlcm5lbFRhcmdldEZvclRlc3RpbmcubG9hZGVyOwogIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPSBsb2FkZXIuYnVpbGRlcnNbbGlicmFyeS5pbXBvcnRVcmldOwogIGlmIChidWlsZGVyID09IG51bGwgJiYgcmVxdWlyZWQpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJEZWNsYXJhdGlvbkJ1aWxkZXIgZm9yICRsaWJyYXJ5IG5vdCBmb3VuZC4iKTsKICB9CiAgcmV0dXJuIGJ1aWxkZXI7Cn0KClR5cGVQYXJhbWV0ZXJTY29wZUJ1aWxkZXIgbG9va3VwTGlicmFyeURlY2xhcmF0aW9uQnVpbGRlcigKICAgIEludGVybmFsQ29tcGlsZXJSZXN1bHQgY29tcGlsZXJSZXN1bHQsIExpYnJhcnkgbGlicmFyeSwKICAgIHtib29sIHJlcXVpcmVkOiB0cnVlfSkgewogIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGJ1aWxkZXIgPQogICAgICBsb29rdXBMaWJyYXJ5QnVpbGRlcihjb21waWxlclJlc3VsdCwgbGlicmFyeSwgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICByZXR1cm4gYnVpbGRlci5saWJyYXJ5RGVjbGFyYXRpb247Cn0KCkNsYXNzQnVpbGRlciBsb29rdXBDbGFzc0J1aWxkZXIoCiAgICBJbnRlcm5hbENvbXBpbGVyUmVzdWx0IGNvbXBpbGVyUmVzdWx0LCBDbGFzcyBjbHMsCiAgICB7Ym9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGxpYnJhcnlCdWlsZGVyID0gbG9va3VwTGlicmFyeURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgY29tcGlsZXJSZXN1bHQsIGNscy5lbmNsb3NpbmdMaWJyYXJ5LAogICAgICByZXF1aXJlZDogcmVxdWlyZWQpOwogIENsYXNzQnVpbGRlciBjbHNCdWlsZGVyID0gbGlicmFyeUJ1aWxkZXIubWVtYmVyc1tjbHMubmFtZV07CiAgaWYgKGNsc0J1aWxkZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNsYXNzQnVpbGRlciBmb3IgJGNscyBub3QgZm91bmQuIik7CiAgfQogIHJldHVybiBjbHNCdWlsZGVyOwp9CgpFeHRlbnNpb25CdWlsZGVyIGxvb2t1cEV4dGVuc2lvbkJ1aWxkZXIoCiAgICBJbnRlcm5hbENvbXBpbGVyUmVzdWx0IGNvbXBpbGVyUmVzdWx0LCBFeHRlbnNpb24gZXh0ZW5zaW9uLAogICAge2Jvb2wgcmVxdWlyZWQ6IHRydWV9KSB7CiAgVHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlciBsaWJyYXJ5QnVpbGRlciA9IGxvb2t1cExpYnJhcnlEZWNsYXJhdGlvbkJ1aWxkZXIoCiAgICAgIGNvbXBpbGVyUmVzdWx0LCBleHRlbnNpb24uZW5jbG9zaW5nTGlicmFyeSwKICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICBFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXIgPSBsaWJyYXJ5QnVpbGRlci5tZW1iZXJzW2V4dGVuc2lvbi5uYW1lXTsKICBpZiAoZXh0ZW5zaW9uQnVpbGRlciA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRXh0ZW5zaW9uQnVpbGRlciBmb3IgJGV4dGVuc2lvbiBub3QgZm91bmQuIik7CiAgfQogIHJldHVybiBleHRlbnNpb25CdWlsZGVyOwp9CgovLy8gTG9vayB1cCB0aGUgW01lbWJlckJ1aWxkZXJdIGZvciBbbWVtYmVyXSB0aHJvdWdoIHRoZSBbQ2xhc3NCdWlsZGVyXSBmb3IKLy8vIFtjbHNdIHVzaW5nIFttZW1iZXJOYW1lXSBhcyBpdHMgbmFtZS4KTWVtYmVyQnVpbGRlciBsb29rdXBDbGFzc01lbWJlckJ1aWxkZXIoSW50ZXJuYWxDb21waWxlclJlc3VsdCBjb21waWxlclJlc3VsdCwKICAgIENsYXNzIGNscywgTWVtYmVyIG1lbWJlciwgU3RyaW5nIG1lbWJlck5hbWUsCiAgICB7Ym9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICBDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyID0KICAgICAgbG9va3VwQ2xhc3NCdWlsZGVyKGNvbXBpbGVyUmVzdWx0LCBjbHMsIHJlcXVpcmVkOiByZXF1aXJlZCk7CiAgTWVtYmVyQnVpbGRlciBtZW1iZXJCdWlsZGVyOwogIGlmIChjbGFzc0J1aWxkZXIgIT0gbnVsbCkgewogICAgaWYgKG1lbWJlciBpcyBDb25zdHJ1Y3RvciB8fCBtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5pc0ZhY3RvcnkpIHsKICAgICAgbWVtYmVyQnVpbGRlciA9IGNsYXNzQnVpbGRlci5jb25zdHJ1Y3RvcnMubG9jYWxbbWVtYmVyTmFtZV07CiAgICB9IGVsc2UgewogICAgICBtZW1iZXJCdWlsZGVyID0gY2xhc3NCdWlsZGVyLnNjb3BlLmxvb2t1cExvY2FsTWVtYmVyKG1lbWJlck5hbWUsCiAgICAgICAgICBzZXR0ZXI6IG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmlzU2V0dGVyKTsKICAgIH0KICB9CiAgaWYgKG1lbWJlckJ1aWxkZXIgPT0gbnVsbCAmJiByZXF1aXJlZCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIk1lbWJlckJ1aWxkZXIgZm9yICRtZW1iZXIgbm90IGZvdW5kLiIpOwogIH0KICByZXR1cm4gbWVtYmVyQnVpbGRlcjsKfQoKTWVtYmVyQnVpbGRlciBsb29rdXBNZW1iZXJCdWlsZGVyKAogICAgSW50ZXJuYWxDb21waWxlclJlc3VsdCBjb21waWxlclJlc3VsdCwgTWVtYmVyIG1lbWJlciwKICAgIHtib29sIHJlcXVpcmVkOiB0cnVlfSkgewogIE1lbWJlckJ1aWxkZXIgbWVtYmVyQnVpbGRlcjsKICBpZiAobWVtYmVyLmlzRXh0ZW5zaW9uTWVtYmVyKSB7CiAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlci5uYW1lLm5hbWU7CiAgICBTdHJpbmcgZXh0ZW5zaW9uTmFtZSA9IG1lbWJlck5hbWUuc3Vic3RyaW5nKDAsIG1lbWJlck5hbWUuaW5kZXhPZignfCcpKTsKICAgIG1lbWJlck5hbWUgPSBtZW1iZXJOYW1lLnN1YnN0cmluZyhleHRlbnNpb25OYW1lLmxlbmd0aCArIDEpOwogICAgYm9vbCBpc1NldHRlciA9IG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmlzU2V0dGVyOwogICAgaWYgKG1lbWJlck5hbWUuc3RhcnRzV2l0aCgnc2V0IycpKSB7CiAgICAgIG1lbWJlck5hbWUgPSBtZW1iZXJOYW1lLnN1YnN0cmluZyg0KTsKICAgICAgaXNTZXR0ZXIgPSB0cnVlOwogICAgfSBlbHNlIGlmIChtZW1iZXJOYW1lLnN0YXJ0c1dpdGgoJ2dldCMnKSkgewogICAgICBtZW1iZXJOYW1lID0gbWVtYmVyTmFtZS5zdWJzdHJpbmcoNCk7CiAgICB9CiAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0KICAgICAgICBsb29rdXBFeHRlbnNpb24obWVtYmVyLmVuY2xvc2luZ0xpYnJhcnksIGV4dGVuc2lvbk5hbWUpOwogICAgbWVtYmVyQnVpbGRlciA9IGxvb2t1cEV4dGVuc2lvbk1lbWJlckJ1aWxkZXIoCiAgICAgICAgY29tcGlsZXJSZXN1bHQsIGV4dGVuc2lvbiwgbWVtYmVyLCBtZW1iZXJOYW1lLAogICAgICAgIGlzU2V0dGVyOiBpc1NldHRlciwgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICB9IGVsc2UgaWYgKG1lbWJlci5lbmNsb3NpbmdDbGFzcyAhPSBudWxsKSB7CiAgICBtZW1iZXJCdWlsZGVyID0gbG9va3VwQ2xhc3NNZW1iZXJCdWlsZGVyKAogICAgICAgIGNvbXBpbGVyUmVzdWx0LCBtZW1iZXIuZW5jbG9zaW5nQ2xhc3MsIG1lbWJlciwgbWVtYmVyLm5hbWUubmFtZSwKICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQpOwogIH0gZWxzZSB7CiAgICBUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyIGxpYnJhcnlCdWlsZGVyID0gbG9va3VwTGlicmFyeURlY2xhcmF0aW9uQnVpbGRlcigKICAgICAgICBjb21waWxlclJlc3VsdCwgbWVtYmVyLmVuY2xvc2luZ0xpYnJhcnksCiAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkKTsKICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlICYmIG1lbWJlci5pc1NldHRlcikgewogICAgICBtZW1iZXJCdWlsZGVyID0gbGlicmFyeUJ1aWxkZXIuc2V0dGVyc1ttZW1iZXIubmFtZS5uYW1lXTsKICAgIH0gZWxzZSB7CiAgICAgIG1lbWJlckJ1aWxkZXIgPSBsaWJyYXJ5QnVpbGRlci5tZW1iZXJzW21lbWJlci5uYW1lLm5hbWVdOwogICAgfQogIH0KICBpZiAobWVtYmVyQnVpbGRlciA9PSBudWxsICYmIHJlcXVpcmVkKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTWVtYmVyQnVpbGRlciBmb3IgJG1lbWJlciBub3QgZm91bmQuIik7CiAgfQogIHJldHVybiBtZW1iZXJCdWlsZGVyOwp9CgovLy8gTG9vayB1cCB0aGUgW01lbWJlckJ1aWxkZXJdIGZvciBbbWVtYmVyXSB0aHJvdWdoIHRoZSBbRXh0ZW5zaW9uQnVpbGRlcl0gZm9yCi8vLyBbZXh0ZW5zaW9uXSB1c2luZyBbbWVtYmVyTmFtZV0gYXMgaXRzIG5hbWUuCk1lbWJlckJ1aWxkZXIgbG9va3VwRXh0ZW5zaW9uTWVtYmVyQnVpbGRlcigKICAgIEludGVybmFsQ29tcGlsZXJSZXN1bHQgY29tcGlsZXJSZXN1bHQsCiAgICBFeHRlbnNpb24gZXh0ZW5zaW9uLAogICAgTWVtYmVyIG1lbWJlciwKICAgIFN0cmluZyBtZW1iZXJOYW1lLAogICAge2Jvb2wgaXNTZXR0ZXI6IGZhbHNlLAogICAgYm9vbCByZXF1aXJlZDogdHJ1ZX0pIHsKICBFeHRlbnNpb25CdWlsZGVyIGV4dGVuc2lvbkJ1aWxkZXIgPQogICAgICBsb29rdXBFeHRlbnNpb25CdWlsZGVyKGNvbXBpbGVyUmVzdWx0LCBleHRlbnNpb24sIHJlcXVpcmVkOiByZXF1aXJlZCk7CiAgTWVtYmVyQnVpbGRlciBtZW1iZXJCdWlsZGVyOwogIGlmIChleHRlbnNpb25CdWlsZGVyICE9IG51bGwpIHsKICAgIG1lbWJlckJ1aWxkZXIgPQogICAgICAgIGV4dGVuc2lvbkJ1aWxkZXIuc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobWVtYmVyTmFtZSwgc2V0dGVyOiBpc1NldHRlcik7CiAgfQogIGlmIChtZW1iZXJCdWlsZGVyID09IG51bGwgJiYgcmVxdWlyZWQpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJNZW1iZXJCdWlsZGVyIGZvciAkbWVtYmVyIG5vdCBmb3VuZC4iKTsKICB9CiAgcmV0dXJuIG1lbWJlckJ1aWxkZXI7Cn0KCi8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RhbnQgW25vZGVdIHRvIGJlIHVzZWQgaW4KLy8vIHRlc3RpbmcuClN0cmluZyBjb25zdGFudFRvVGV4dChDb25zdGFudCBub2RlLAogICAge1R5cGVSZXByZXNlbnRhdGlvbiB0eXBlUmVwcmVzZW50YXRpb246IFR5cGVSZXByZXNlbnRhdGlvbi5sZWdhY3l9KSB7CiAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIG5ldyBDb25zdGFudFRvVGV4dFZpc2l0b3Ioc2IsIHR5cGVSZXByZXNlbnRhdGlvbikudmlzaXQobm9kZSk7CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KCmVudW0gVHlwZVJlcHJlc2VudGF0aW9uIHsKICBsZWdhY3ksCiAgZXhwbGljaXQsCiAgaW1wbGljaXRVbmRldGVybWluZWQsCiAgbm9uTnVsbGFibGVCeURlZmF1bHQsCn0KCi8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBbbm9kZV0gdG8gYmUgdXNlZCBpbgovLy8gdGVzdGluZy4KU3RyaW5nIHR5cGVUb1RleHQoRGFydFR5cGUgbm9kZSwKICAgIFtUeXBlUmVwcmVzZW50YXRpb24gdHlwZVJlcHJlc2VudGF0aW9uID0gVHlwZVJlcHJlc2VudGF0aW9uLmxlZ2FjeV0pIHsKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgbmV3IERhcnRUeXBlVG9UZXh0VmlzaXRvcihzYiwgdHlwZVJlcHJlc2VudGF0aW9uKS52aXNpdChub2RlKTsKICByZXR1cm4gc2IudG9TdHJpbmcoKTsKfQoKU2V0PENsYXNzPiBjb21wdXRlQWxsU3VwZXJjbGFzc2VzKENsYXNzIG5vZGUpIHsKICBTZXQ8Q2xhc3M+IHNldCA9IDxDbGFzcz57fTsKICBfZ2V0QWxsU3VwZXJjbGFzc2VzKG5vZGUsIHNldCk7CiAgcmV0dXJuIHNldDsKfQoKdm9pZCBfZ2V0QWxsU3VwZXJjbGFzc2VzKENsYXNzIG5vZGUsIFNldDxDbGFzcz4gc2V0KSB7CiAgaWYgKHNldC5hZGQobm9kZSkpIHsKICAgIGlmIChub2RlLnN1cGVydHlwZSAhPSBudWxsKSB7CiAgICAgIF9nZXRBbGxTdXBlcmNsYXNzZXMobm9kZS5zdXBlcnR5cGUuY2xhc3NOb2RlLCBzZXQpOwogICAgfQogICAgaWYgKG5vZGUubWl4ZWRJblR5cGUgIT0gbnVsbCkgewogICAgICBfZ2V0QWxsU3VwZXJjbGFzc2VzKG5vZGUubWl4ZWRJblR5cGUuY2xhc3NOb2RlLCBzZXQpOwogICAgfQogICAgZm9yIChTdXBlcnR5cGUgaW50ZXJmYWNlIGluIG5vZGUuaW1wbGVtZW50ZWRUeXBlcykgewogICAgICBfZ2V0QWxsU3VwZXJjbGFzc2VzKGludGVyZmFjZS5jbGFzc05vZGUsIHNldCk7CiAgICB9CiAgfQp9CgpTdHJpbmcgc3VwZXJ0eXBlVG9UZXh0KFN1cGVydHlwZSBub2RlLAogICAgW1R5cGVSZXByZXNlbnRhdGlvbiB0eXBlUmVwcmVzZW50YXRpb24gPSBUeXBlUmVwcmVzZW50YXRpb24ubGVnYWN5XSkgewogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBzYi53cml0ZShub2RlLmNsYXNzTm9kZS5uYW1lKTsKICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgIHNiLndyaXRlKCc8Jyk7CiAgICBuZXcgRGFydFR5cGVUb1RleHRWaXNpdG9yKHNiLCB0eXBlUmVwcmVzZW50YXRpb24pCiAgICAgICAgLnZpc2l0TGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgc2Iud3JpdGUoJz4nKTsKICB9CiAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cn0KCmNsYXNzIENvbnN0YW50VG9UZXh0VmlzaXRvciBpbXBsZW1lbnRzIENvbnN0YW50VmlzaXRvcjx2b2lkPiB7CiAgZmluYWwgU3RyaW5nQnVmZmVyIHNiOwogIGZpbmFsIERhcnRUeXBlVG9UZXh0VmlzaXRvciB0eXBlVG9UZXh0OwoKICBDb25zdGFudFRvVGV4dFZpc2l0b3IodGhpcy5zYiwgVHlwZVJlcHJlc2VudGF0aW9uIHR5cGVSZXByZXNlbnRhdGlvbikKICAgICAgOiB0eXBlVG9UZXh0ID0gbmV3IERhcnRUeXBlVG9UZXh0VmlzaXRvcihzYiwgdHlwZVJlcHJlc2VudGF0aW9uKTsKCiAgdm9pZCB2aXNpdChDb25zdGFudCBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgdm9pZCB2aXNpdExpc3QoSXRlcmFibGU8Q29uc3RhbnQ+IG5vZGVzKSB7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIGZvciAoQ29uc3RhbnQgbm9kZSBpbiBub2RlcykgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHZpc2l0KG5vZGUpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICB9CgogIHZvaWQgZGVmYXVsdENvbnN0YW50KENvbnN0YW50IG5vZGUpID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoCiAgICAgICdVbmV4cGVjdGVkIGNvbnN0YW50ICRub2RlICgke25vZGUucnVudGltZVR5cGV9KScpOwoKICB2b2lkIHZpc2l0TnVsbENvbnN0YW50KE51bGxDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnTnVsbCgpJyk7CiAgfQoKICB2b2lkIHZpc2l0Qm9vbENvbnN0YW50KEJvb2xDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnQm9vbCgke25vZGUudmFsdWV9KScpOwogIH0KCiAgdm9pZCB2aXNpdEludENvbnN0YW50KEludENvbnN0YW50IG5vZGUpIHsKICAgIHNiLndyaXRlKCdJbnQoJHtub2RlLnZhbHVlfSknKTsKICB9CgogIHZvaWQgdmlzaXREb3VibGVDb25zdGFudChEb3VibGVDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnRG91YmxlKCR7bm9kZS52YWx1ZX0pJyk7CiAgfQoKICB2b2lkIHZpc2l0U3RyaW5nQ29uc3RhbnQoU3RyaW5nQ29uc3RhbnQgbm9kZSkgewogICAgc2Iud3JpdGUoJ1N0cmluZygke25vZGUudmFsdWV9KScpOwogIH0KCiAgdm9pZCB2aXNpdFN5bWJvbENvbnN0YW50KFN5bWJvbENvbnN0YW50IG5vZGUpIHsKICAgIHNiLndyaXRlKCdTeW1ib2woJHtub2RlLm5hbWV9KScpOwogIH0KCiAgdm9pZCB2aXNpdE1hcENvbnN0YW50KE1hcENvbnN0YW50IG5vZGUpIHsKICAgIHNiLndyaXRlKCdNYXA8Jyk7CiAgICB0eXBlVG9UZXh0LnZpc2l0KG5vZGUua2V5VHlwZSk7CiAgICBzYi53cml0ZSgnLCcpOwogICAgdHlwZVRvVGV4dC52aXNpdChub2RlLnZhbHVlVHlwZSk7CiAgICBzYi53cml0ZSgnPignKTsKICAgIFN0cmluZyBjb21tYSA9ICcnOwogICAgZm9yIChDb25zdGFudE1hcEVudHJ5IGVudHJ5IGluIG5vZGUuZW50cmllcykgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIGVudHJ5LmtleS5hY2NlcHQodGhpcyk7CiAgICAgIHNiLndyaXRlKCc6Jyk7CiAgICAgIGVudHJ5LnZhbHVlLmFjY2VwdCh0aGlzKTsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgdm9pZCB2aXNpdExpc3RDb25zdGFudChMaXN0Q29uc3RhbnQgbm9kZSkgewogICAgc2Iud3JpdGUoJ0xpc3Q8Jyk7CiAgICB0eXBlVG9UZXh0LnZpc2l0KG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHNiLndyaXRlKCc+KCcpOwogICAgdmlzaXRMaXN0KG5vZGUuZW50cmllcyk7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgdm9pZCB2aXNpdFNldENvbnN0YW50KFNldENvbnN0YW50IG5vZGUpIHsKICAgIHNiLndyaXRlKCdTZXQ8Jyk7CiAgICB0eXBlVG9UZXh0LnZpc2l0KG5vZGUudHlwZUFyZ3VtZW50KTsKICAgIHNiLndyaXRlKCc+KCcpOwogICAgdmlzaXRMaXN0KG5vZGUuZW50cmllcyk7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgdm9pZCB2aXNpdEluc3RhbmNlQ29uc3RhbnQoSW5zdGFuY2VDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnSW5zdGFuY2UoJyk7CiAgICBzYi53cml0ZShub2RlLmNsYXNzTm9kZS5uYW1lKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICB0eXBlVG9UZXh0LnZpc2l0TGlzdChub2RlLnR5cGVBcmd1bWVudHMpOwogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogICAgaWYgKG5vZGUuZmllbGRWYWx1ZXMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnLHsnKTsKICAgICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICAgIGZvciAoUmVmZXJlbmNlIHJlZiBpbiBub2RlLmZpZWxkVmFsdWVzLmtleXMpIHsKICAgICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgICAgc2Iud3JpdGUoZ2V0TWVtYmVyTmFtZShyZWYuYXNGaWVsZCkpOwogICAgICAgIHNiLndyaXRlKCc6Jyk7CiAgICAgICAgdmlzaXQobm9kZS5maWVsZFZhbHVlc1tyZWZdKTsKICAgICAgICBjb21tYSA9ICcsJzsKICAgICAgfQogICAgICBzYi53cml0ZSgnfScpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICB9CgogIHZvaWQgdmlzaXRQYXJ0aWFsSW5zdGFudGlhdGlvbkNvbnN0YW50KFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnQgbm9kZSkgewogICAgc2Iud3JpdGUoJ0luc3RhbnRpYXRpb24oJyk7CiAgICBzYi53cml0ZShnZXRNZW1iZXJOYW1lKG5vZGUudGVhck9mZkNvbnN0YW50LnByb2NlZHVyZSkpOwogICAgc2Iud3JpdGUoJzwnKTsKICAgIHR5cGVUb1RleHQudmlzaXRMaXN0KG5vZGUudHlwZXMpOwogICAgc2Iud3JpdGUoJz4pJyk7CiAgfQoKICB2b2lkIHZpc2l0VGVhck9mZkNvbnN0YW50KFRlYXJPZmZDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnRnVuY3Rpb24oJyk7CiAgICBzYi53cml0ZShnZXRNZW1iZXJOYW1lKG5vZGUucHJvY2VkdXJlKSk7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgdm9pZCB2aXNpdFR5cGVMaXRlcmFsQ29uc3RhbnQoVHlwZUxpdGVyYWxDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnVHlwZUxpdGVyYWwoJyk7CiAgICB0eXBlVG9UZXh0LnZpc2l0KG5vZGUudHlwZSk7CiAgICBzYi53cml0ZSgnKScpOwogIH0KCiAgdm9pZCB2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnQoVW5ldmFsdWF0ZWRDb25zdGFudCBub2RlKSB7CiAgICBzYi53cml0ZSgnVW5ldmFsdWF0ZWQoKScpOwogIH0KfQoKY2xhc3MgRGFydFR5cGVUb1RleHRWaXNpdG9yIGltcGxlbWVudHMgRGFydFR5cGVWaXNpdG9yPHZvaWQ+IHsKICBmaW5hbCBTdHJpbmdCdWZmZXIgc2I7CiAgZmluYWwgVHlwZVJlcHJlc2VudGF0aW9uIHR5cGVSZXByZXNlbnRhdGlvbjsKCiAgRGFydFR5cGVUb1RleHRWaXNpdG9yKHRoaXMuc2IsIHRoaXMudHlwZVJlcHJlc2VudGF0aW9uKTsKCiAgdm9pZCB2aXNpdChEYXJ0VHlwZSBub2RlKSA9PiBub2RlLmFjY2VwdCh0aGlzKTsKCiAgdm9pZCB2aXNpdExpc3QoSXRlcmFibGU8RGFydFR5cGU+IG5vZGVzKSB7CiAgICBTdHJpbmcgY29tbWEgPSAnJzsKICAgIGZvciAoRGFydFR5cGUgbm9kZSBpbiBub2RlcykgewogICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgIHZpc2l0KG5vZGUpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICB9CgogIHZvaWQgZGVmYXVsdERhcnRUeXBlKERhcnRUeXBlIG5vZGUpID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoCiAgICAgICdVbmV4cGVjdGVkIHR5cGUgJG5vZGUgKCR7bm9kZS5ydW50aW1lVHlwZX0pJyk7CgogIHZvaWQgdmlzaXRJbnZhbGlkVHlwZShJbnZhbGlkVHlwZSBub2RlKSB7CiAgICBzYi53cml0ZSgnPGludmFsaWQ+Jyk7CiAgfQoKICB2b2lkIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSkgewogICAgc2Iud3JpdGUoJ2R5bmFtaWMnKTsKICB9CgogIHZvaWQgdmlzaXRWb2lkVHlwZShWb2lkVHlwZSBub2RlKSB7CiAgICBzYi53cml0ZSgndm9pZCcpOwogIH0KCiAgdm9pZCB2aXNpdEJvdHRvbVR5cGUoQm90dG9tVHlwZSBub2RlKSB7CiAgICBzYi53cml0ZSgnPGJvdHRvbT4nKTsKICB9CgogIHZvaWQgdmlzaXROZXZlclR5cGUoTmV2ZXJUeXBlIG5vZGUpIHsKICAgIHNiLndyaXRlKCdOZXZlcicpOwogIH0KCiAgdm9pZCB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlKSB7CiAgICBzYi53cml0ZShub2RlLmNsYXNzTm9kZS5uYW1lKTsKICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICBzYi53cml0ZSgnPCcpOwogICAgICB2aXNpdExpc3Qobm9kZS50eXBlQXJndW1lbnRzKTsKICAgICAgc2Iud3JpdGUoJz4nKTsKICAgIH0KICAgIGlmICghaXNOdWxsKG5vZGUpKSB7CiAgICAgIHNiLndyaXRlKG51bGxhYmlsaXR5VG9UZXh0KG5vZGUubnVsbGFiaWxpdHksIHR5cGVSZXByZXNlbnRhdGlvbikpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgbm9kZSkgewogICAgdmlzaXQobm9kZS5yZXR1cm5UeXBlKTsKICAgIHNiLndyaXRlKCcgRnVuY3Rpb24nKTsKICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICBzYi53cml0ZSgnLCcpOwogICAgICAgIH0KICAgICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBub2RlLnR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICAgIHNiLndyaXRlKHR5cGVQYXJhbWV0ZXIubmFtZSk7CiAgICAgICAgRGFydFR5cGUgYm91bmQgPSB0eXBlUGFyYW1ldGVyLmJvdW5kOwogICAgICAgIGlmICghKGJvdW5kIGlzIEludGVyZmFjZVR5cGUgJiYgYm91bmQuY2xhc3NOb2RlLm5hbWUgPT0gJ09iamVjdCcpKSB7CiAgICAgICAgICBzYi53cml0ZSgnIGV4dGVuZHMgJyk7CiAgICAgICAgICB2aXNpdChib3VuZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZSgnKCcpOwogICAgU3RyaW5nIGNvbW1hID0gJyc7CiAgICB2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy50YWtlKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkpOwogICAgaWYgKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCA+IDApIHsKICAgICAgY29tbWEgPSAnLCc7CiAgICB9CiAgICBpZiAobm9kZS5yZXF1aXJlZFBhcmFtZXRlckNvdW50IDwgbm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5sZW5ndGgpIHsKICAgICAgc2Iud3JpdGUoY29tbWEpOwogICAgICBzYi53cml0ZSgnWycpOwogICAgICB2aXNpdExpc3Qobm9kZS5wb3NpdGlvbmFsUGFyYW1ldGVycy5za2lwKG5vZGUucmVxdWlyZWRQYXJhbWV0ZXJDb3VudCkpOwogICAgICBzYi53cml0ZSgnXScpOwogICAgICBjb21tYSA9ICcsJzsKICAgIH0KICAgIGlmIChub2RlLm5hbWVkUGFyYW1ldGVycy5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKGNvbW1hKTsKICAgICAgc2Iud3JpdGUoJ3snKTsKICAgICAgY29tbWEgPSAnJzsKICAgICAgZm9yIChOYW1lZFR5cGUgbmFtZWRQYXJhbWV0ZXIgaW4gbm9kZS5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICBzYi53cml0ZShjb21tYSk7CiAgICAgICAgaWYgKG5hbWVkUGFyYW1ldGVyLmlzUmVxdWlyZWQpIHsKICAgICAgICAgIHNiLndyaXRlKCdyZXF1aXJlZCAnKTsKICAgICAgICB9CiAgICAgICAgdmlzaXQobmFtZWRQYXJhbWV0ZXIudHlwZSk7CiAgICAgICAgc2Iud3JpdGUoJyAnKTsKICAgICAgICBzYi53cml0ZShuYW1lZFBhcmFtZXRlci5uYW1lKTsKICAgICAgICBjb21tYSA9ICcsJzsKICAgICAgfQogICAgICBzYi53cml0ZSgnfScpOwogICAgfQogICAgc2Iud3JpdGUoJyknKTsKICAgIHNiLndyaXRlKG51bGxhYmlsaXR5VG9UZXh0KG5vZGUubnVsbGFiaWxpdHksIHR5cGVSZXByZXNlbnRhdGlvbikpOwogIH0KCiAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXJUeXBlKFR5cGVQYXJhbWV0ZXJUeXBlIG5vZGUpIHsKICAgIHNiLndyaXRlKG5vZGUucGFyYW1ldGVyLm5hbWUpOwogICAgc2Iud3JpdGUobnVsbGFiaWxpdHlUb1RleHQobm9kZS5udWxsYWJpbGl0eSwgdHlwZVJlcHJlc2VudGF0aW9uKSk7CiAgICBpZiAobm9kZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoJyAmICcpOwogICAgICB2aXNpdChub2RlLnByb21vdGVkQm91bmQpOwogICAgfQogIH0KCiAgdm9pZCB2aXNpdFR5cGVkZWZUeXBlKFR5cGVkZWZUeXBlIG5vZGUpIHsKICAgIHNiLndyaXRlKG5vZGUudHlwZWRlZk5vZGUubmFtZSk7CiAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgdmlzaXRMaXN0KG5vZGUudHlwZUFyZ3VtZW50cyk7CiAgICAgIHNiLndyaXRlKCc+Jyk7CiAgICB9CiAgICBzYi53cml0ZShudWxsYWJpbGl0eVRvVGV4dChub2RlLm51bGxhYmlsaXR5LCB0eXBlUmVwcmVzZW50YXRpb24pKTsKICB9Cn0KCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdHlwZV0gaXMgYE9iamVjdGAgZnJvbSBgZGFydDpjb3JlYC4KYm9vbCBpc09iamVjdChEYXJ0VHlwZSB0eXBlKSB7CiAgcmV0dXJuIHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgogICAgICB0eXBlLmNsYXNzTm9kZS5uYW1lID09ICdPYmplY3QnICYmCiAgICAgICcke3R5cGUuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpfScgPT0gJ2RhcnQ6Y29yZSc7Cn0KCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBbdHlwZV0gaXMgYE51bGxgIGZyb20gYGRhcnQ6Y29yZWAuCmJvb2wgaXNOdWxsKERhcnRUeXBlIHR5cGUpIHsKICByZXR1cm4gdHlwZSBpcyBJbnRlcmZhY2VUeXBlICYmCiAgICAgIHR5cGUuY2xhc3NOb2RlLm5hbWUgPT0gJ051bGwnICYmCiAgICAgICcke3R5cGUuY2xhc3NOb2RlLmVuY2xvc2luZ0xpYnJhcnkuaW1wb3J0VXJpfScgPT0gJ2RhcnQ6Y29yZSc7Cn0KCi8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW3R5cGVQYXJhbWV0ZXJdIHRvIGJlIHVzZWQgaW4KLy8vIHRlc3RpbmcuClN0cmluZyB0eXBlUGFyYW1ldGVyVG9UZXh0KFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlcikgewogIFN0cmluZyBuYW1lID0gdHlwZVBhcmFtZXRlci5uYW1lOwogIGlmICghaXNPYmplY3QodHlwZVBhcmFtZXRlci5ib3VuZCkpIHsKICAgIHJldHVybiAnJG5hbWUgZXh0ZW5kcyAke3R5cGVUb1RleHQodHlwZVBhcmFtZXRlci5ib3VuZCl9JzsKICB9CiAgcmV0dXJuIG5hbWU7Cn0KCi8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW3R5cGVdIHRvIGJlIHVzZWQgaW4gdGVzdGluZy4KU3RyaW5nIHR5cGVCdWlsZGVyVG9UZXh0KFR5cGVCdWlsZGVyIHR5cGUpIHsKICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgX3R5cGVCdWlsZGVyVG9UZXh0KHR5cGUsIHNiKTsKICByZXR1cm4gc2IudG9TdHJpbmcoKTsKfQoKdm9pZCBfdHlwZUJ1aWxkZXJUb1RleHQoVHlwZUJ1aWxkZXIgdHlwZSwgU3RyaW5nQnVmZmVyIHNiKSB7CiAgaWYgKHR5cGUgaXMgTmFtZWRUeXBlQnVpbGRlcikgewogICAgc2Iud3JpdGUodHlwZS5uYW1lKTsKICAgIGlmICh0eXBlLmFyZ3VtZW50cyAhPSBudWxsICYmIHR5cGUuYXJndW1lbnRzLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoJzwnKTsKICAgICAgX3R5cGVCdWlsZGVyc1RvVGV4dCh0eXBlLmFyZ3VtZW50cywgc2IpOwogICAgICBzYi53cml0ZSgnPicpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyAnVW5oYW5kbGVkIHR5cGUgYnVpbGRlciAkdHlwZSAoJHt0eXBlLnJ1bnRpbWVUeXBlfSknOwogIH0KfQoKdm9pZCBfdHlwZUJ1aWxkZXJzVG9UZXh0KEl0ZXJhYmxlPFR5cGVCdWlsZGVyPiB0eXBlcywgU3RyaW5nQnVmZmVyIHNiKSB7CiAgU3RyaW5nIGNvbW1hID0gJyc7CiAgZm9yIChUeXBlQnVpbGRlciB0eXBlIGluIHR5cGVzKSB7CiAgICBzYi53cml0ZShjb21tYSk7CiAgICBfdHlwZUJ1aWxkZXJUb1RleHQodHlwZSwgc2IpOwogICAgY29tbWEgPSAnLCc7CiAgfQp9CgovLy8gUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFt0eXBlVmFyaWFibGVdIHRvIGJlIHVzZWQgaW4KLy8vIHRlc3RpbmcuClN0cmluZyB0eXBlVmFyaWFibGVCdWlsZGVyVG9UZXh0KFR5cGVWYXJpYWJsZUJ1aWxkZXIgdHlwZVZhcmlhYmxlKSB7CiAgU3RyaW5nIG5hbWUgPSB0eXBlVmFyaWFibGUubmFtZTsKICBpZiAodHlwZVZhcmlhYmxlLmJvdW5kICE9IG51bGwpIHsKICAgIHJldHVybiAnJG5hbWUgZXh0ZW5kcyAke3R5cGVCdWlsZGVyVG9UZXh0KHR5cGVWYXJpYWJsZS5ib3VuZCl9JzsKICB9CiAgcmV0dXJuIG5hbWU7Cn0KCi8vLyBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBbZXJyb3JzXSB0byBiZSB1c2VkIGluIHRlc3RpbmcuClN0cmluZyBlcnJvcnNUb1RleHQoTGlzdDxGb3JtYXR0ZWRNZXNzYWdlPiBlcnJvcnMsIHtib29sIHVzZUNvZGVzOiBmYWxzZX0pIHsKICBpZiAodXNlQ29kZXMpIHsKICAgIHJldHVybiBlcnJvcnMubWFwKChtKSA9PiBtLmNvZGUpLmpvaW4oJywnKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGVycm9ycy5tYXAoKG0pID0+IG0ubWVzc2FnZSkuam9pbignLCcpOwogIH0KfQoKLy8vIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIFtkZXNjcmlwdG9yXSB0byBiZSB1c2VkIGluIHRlc3RpbmcuClN0cmluZyBleHRlbnNpb25NZXRob2REZXNjcmlwdG9yVG9UZXh0KEV4dGVuc2lvbk1lbWJlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewogIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICBpZiAoZGVzY3JpcHRvci5pc1N0YXRpYykgewogICAgc2Iud3JpdGUoJ3N0YXRpYyAnKTsKICB9CiAgc3dpdGNoIChkZXNjcmlwdG9yLmtpbmQpIHsKICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5NZXRob2Q6CiAgICAgIGJyZWFrOwogICAgY2FzZSBFeHRlbnNpb25NZW1iZXJLaW5kLkdldHRlcjoKICAgICAgc2Iud3JpdGUoJ2dldHRlciAnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEV4dGVuc2lvbk1lbWJlcktpbmQuU2V0dGVyOgogICAgICBzYi53cml0ZSgnc2V0dGVyICcpOwogICAgICBicmVhazsKICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5PcGVyYXRvcjoKICAgICAgc2Iud3JpdGUoJ29wZXJhdG9yICcpOwogICAgICBicmVhazsKICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5GaWVsZDoKICAgICAgc2Iud3JpdGUoJ2ZpZWxkICcpOwogICAgICBicmVhazsKICAgIGNhc2UgRXh0ZW5zaW9uTWVtYmVyS2luZC5UZWFyT2ZmOgogICAgICBzYi53cml0ZSgndGVhcm9mZiAnKTsKICAgICAgYnJlYWs7CiAgfQogIHNiLndyaXRlKGRlc2NyaXB0b3IubmFtZS5uYW1lKTsKICBzYi53cml0ZSgnPScpOwogIE1lbWJlciBtZW1iZXIgPSBkZXNjcmlwdG9yLm1lbWJlci5hc01lbWJlcjsKICBTdHJpbmcgbmFtZSA9IG1lbWJlci5uYW1lLm5hbWU7CiAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUgJiYgbWVtYmVyLmlzU2V0dGVyKSB7CiAgICBzYi53cml0ZSgnJG5hbWU9Jyk7CiAgfSBlbHNlIHsKICAgIHNiLndyaXRlKG5hbWUpOwogIH0KICByZXR1cm4gc2IudG9TdHJpbmcoKTsKfQoKLy8vIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIFtudWxsYWJpbGl0eV0gdG8gYmUgdXNlZCBpbiB0ZXN0aW5nLgpTdHJpbmcgbnVsbGFiaWxpdHlUb1RleHQoCiAgICBOdWxsYWJpbGl0eSBudWxsYWJpbGl0eSwgVHlwZVJlcHJlc2VudGF0aW9uIHR5cGVSZXByZXNlbnRhdGlvbikgewogIHN3aXRjaCAobnVsbGFiaWxpdHkpIHsKICAgIGNhc2UgTnVsbGFiaWxpdHkubm9uTnVsbGFibGU6CiAgICAgIHN3aXRjaCAodHlwZVJlcHJlc2VudGF0aW9uKSB7CiAgICAgICAgY2FzZSBUeXBlUmVwcmVzZW50YXRpb24uZXhwbGljaXQ6CiAgICAgICAgY2FzZSBUeXBlUmVwcmVzZW50YXRpb24ubGVnYWN5OgogICAgICAgIGNhc2UgVHlwZVJlcHJlc2VudGF0aW9uLmltcGxpY2l0VW5kZXRlcm1pbmVkOgogICAgICAgICAgcmV0dXJuICchJzsKICAgICAgICBjYXNlIFR5cGVSZXByZXNlbnRhdGlvbi5ub25OdWxsYWJsZUJ5RGVmYXVsdDoKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgTnVsbGFiaWxpdHkubnVsbGFibGU6CiAgICAgIHJldHVybiAnPyc7CiAgICBjYXNlIE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZDoKICAgICAgc3dpdGNoICh0eXBlUmVwcmVzZW50YXRpb24pIHsKICAgICAgICBjYXNlIFR5cGVSZXByZXNlbnRhdGlvbi5pbXBsaWNpdFVuZGV0ZXJtaW5lZDoKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuICclJzsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgTnVsbGFiaWxpdHkubGVnYWN5OgogICAgICBzd2l0Y2ggKHR5cGVSZXByZXNlbnRhdGlvbikgewogICAgICAgIGNhc2UgVHlwZVJlcHJlc2VudGF0aW9uLmxlZ2FjeToKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICBjYXNlIFR5cGVSZXByZXNlbnRhdGlvbi5leHBsaWNpdDoKICAgICAgICBjYXNlIFR5cGVSZXByZXNlbnRhdGlvbi5ub25OdWxsYWJsZUJ5RGVmYXVsdDoKICAgICAgICBjYXNlIFR5cGVSZXByZXNlbnRhdGlvbi5pbXBsaWNpdFVuZGV0ZXJtaW5lZDoKICAgICAgICAgIHJldHVybiAnKic7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgfQogIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVbmV4cGVjdGVkIG51bGxhYmlsaXR5OiAkbnVsbGFiaWxpdHkuJyk7Cn0KgrEATk48ASIBLjAvMy02MiE2LSgBLgEyJk0bAgEvKxwYBA8CAUoESE0dThQ8BhEGAgFFBEZOShMUTgYRBgIBSQRGQR0oTRQfTgYRBgIBSjEERz8dJUsUUAYRBgIBRjEER1AhSxRMBhEGAgElPB1GRSVLBBICATs8HSFJJQIBITYdTiwbPihBBBUCASlAHU4yG04uSwQbAgFMKk4xHR5DHx5MQw1HOwYEK0UEGAIBIzodHyIqTUE8KSwXMCwGGkEyNzEuLkkdC1AxHTJADUAGBCtFBBgCAVAwLCsZExcbHCZNHyIUUAQrRQQYAgFKDSVKKEEYAgEaCgwYGAIBRg0hSyhBGAIBMB4iDgIBNxciOgYkPAY5NQYEAgEnSyghJxM2KBMEGAIBPxkqAUhIATIBLRcjFxMTBgQBRzoBLhgEAS4lBAEsJAQBMicEATInBAEyJgQBLBYkEyYUFzMXHhUgEwYTBAEuFykUHRMEASwWKRQdEwQBNhsjKRUwFQYnFhk1GS4XJhUIFQYTBAFOID0TJhQEATQbLRMEATweIRMEATwfBAIBPxkvATsBMgEtFyMXExMGBAFHNgEsGwQBLBkEASYWBAEqGgQBKBcEATAjKRUlFQYZSQYEAS4cGyoVPRUZCj4mLk0hGAoIFQYTF0wrEwZKFxVOFRMGKxcVEj8ZKSEKJBcnFQgVBhNHBAE4I0cmFyEGBAEsJSkVJRUGRwQCATsfIilFAgE5HSInRQIBSg06JCg/BA8CAUotKCAYAgE9Ihk/FS8VBgtABAIBSRUkFSIRBAIBSQ1FIyRFBA8CAUhNEjALMwQCAUxPKB0ZBB0lDSUbDSUbDScdDSQaDSYcDQQiES4iMBgLFAQYAgFNGkYZIiQqKDYWNhUIDR8SIyQ2FREWCA0dJCgVKjY2FggNBEcCATNwYWNrYWdlOmZyb250X2VuZC9zcmMvdGVzdGluZy9pZF90ZXN0aW5nX3V0aWxzLmRhcnRjZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2ZvcndhcmRpbmdfbm9kZS5kYXJ0wABTzS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgInBhY2thZ2U6a2VybmVsL2FzdC5kYXJ0IgogICAgc2hvdwogICAgICAgIEFyZ3VtZW50cywKICAgICAgICBDbGFzcywKICAgICAgICBEYXJ0VHlwZSwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEZpZWxkLAogICAgICAgIEZ1bmN0aW9uTm9kZSwKICAgICAgICBNZW1iZXIsCiAgICAgICAgTmFtZSwKICAgICAgICBOYW1lZEV4cHJlc3Npb24sCiAgICAgICAgUHJvY2VkdXJlLAogICAgICAgIFByb2NlZHVyZUtpbmQsCiAgICAgICAgUmV0dXJuU3RhdGVtZW50LAogICAgICAgIFN1cGVyTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBTdXBlclByb3BlcnR5R2V0LAogICAgICAgIFN1cGVyUHJvcGVydHlTZXQsCiAgICAgICAgVHlwZVBhcmFtZXRlciwKICAgICAgICBUeXBlUGFyYW1ldGVyVHlwZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0LAogICAgICAgIFZhcmlhbmNlLAogICAgICAgIFZvaWRUeXBlOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydCcgc2hvdyBUcmFuc2Zvcm1lckZsYWc7CgppbXBvcnQgInBhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0IiBzaG93IFN1YnN0aXR1dGlvbjsKCmltcG9ydCAicGFja2FnZTprZXJuZWwvc3JjL2xlZ2FjeV9lcmFzdXJlLmRhcnQiOwppbXBvcnQgInBhY2thZ2U6a2VybmVsL3NyYy9ubmJkX3RvcF9tZXJnZS5kYXJ0IjsKCmltcG9ydCAiLi4vc291cmNlL3NvdXJjZV9jbGFzc19idWlsZGVyLmRhcnQiOwoKaW1wb3J0ICIuLi9wcm9ibGVtcy5kYXJ0IiBzaG93IHVuaGFuZGxlZDsKCmltcG9ydCAiLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnQiCiAgICBzaG93IEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseTsKCmltcG9ydCAiLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0IiBzaG93IGdldE5hbWVkRm9ybWFsOwoKaW1wb3J0ICdjbGFzc19oaWVyYXJjaHlfYnVpbGRlci5kYXJ0JzsKCmNsYXNzIEZvcndhcmRpbmdOb2RlIHsKICBmaW5hbCBDbGFzc0hpZXJhcmNoeUJ1aWxkZXIgaGllcmFyY2h5OwoKICBmaW5hbCBTb3VyY2VDbGFzc0J1aWxkZXIgY2xhc3NCdWlsZGVyOwoKICBmaW5hbCBDbGFzc01lbWJlciBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdDsKCiAgZmluYWwgUHJvY2VkdXJlS2luZCBraW5kOwoKICAvLy8gQSBsaXN0IGNvbnRhaW5pbmcgdGhlIGRpcmVjdGx5IGltcGxlbWVudGVkIGFuZCBkaXJlY3RseSBpbmhlcml0ZWQKICAvLy8gcHJvY2VkdXJlcyBvZiB0aGUgY2xhc3MgaW4gcXVlc3Rpb24uCiAgZmluYWwgTGlzdDxDbGFzc01lbWJlcj4gX2NhbmRpZGF0ZXM7CgogIEZvcndhcmRpbmdOb2RlKHRoaXMuaGllcmFyY2h5LCB0aGlzLmNsYXNzQnVpbGRlciwKICAgICAgdGhpcy5jb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdCwgdGhpcy5fY2FuZGlkYXRlcywgdGhpcy5raW5kKTsKCiAgTmFtZSBnZXQgbmFtZSA9PiBjb21iaW5lZE1lbWJlclNpZ25hdHVyZVJlc3VsdC5tZW1iZXIubmFtZTsKCiAgQ2xhc3MgZ2V0IGVuY2xvc2luZ0NsYXNzID0+IGNsYXNzQnVpbGRlci5jbHM7CgogIC8vLyBGaW5pc2hlcyBoYW5kbGluZyBvZiB0aGlzIG5vZGUgYnkgcHJvcGFnYXRpbmcgY292YXJpYW5jZSBhbmQgY3JlYXRpbmcKICAvLy8gZm9yd2FyZGluZyBzdHVicyBpZiBuZWNlc3NhcnkuCiAgTWVtYmVyIGZpbmFsaXplKCkgPT4gX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXMoKTsKCiAgLy8vIFRhZyB0aGUgcGFyYW1ldGVycyBvZiBbaW50ZXJmYWNlTWVtYmVyXSB0aGF0IG5lZWQgdHlwZSBjaGVja3MKICAvLy8KICAvLy8gUGFyYW1ldGVycyBjYW4gbmVlZCB0eXBlIGNoZWNrcyBmb3IgY2FsbHMgY29taW5nIGZyb20gc3RhdGljYWxseSB0eXBlZAogIC8vLyBjYWxsIHNpdGVzLCBkdWUgdG8gY292YXJpYW50IGdlbmVyaWNzIGFuZCBvdmVycmlkZXMgd2l0aCBleHBsaWNpdAogIC8vLyBgY292YXJpYW50YCBwYXJhbWV0ZXJzLgogIC8vLwogIC8vLyBUYWcgcGFyYW1ldGVycyBvZiBbaW50ZXJmYWNlTWVtYmVyXSB0aGF0IG5lZWQgc3VjaCBjaGVja3Mgd2hlbiB0aGUgbWVtYmVyCiAgLy8vIG9jY3VycyBpbiBbZW5jbG9zaW5nQ2xhc3NdJ3MgaW50ZXJmYWNlLiAgSWYgcGFyYW1ldGVycyBuZWVkIGNoZWNrcyBidXQKICAvLy8gdGhleSB3b3VsZCBub3QgYmUgY2hlY2tlZCBpbiBhbiBpbmhlcml0ZWQgaW1wbGVtZW50YXRpb24sIGEgZm9yd2FyZGluZwogIC8vLyBzdHViIGlzIGludHJvZHVjZWQgYXMgYSBwbGFjZSB0byBwdXQgdGhlIGNoZWNrcy4KICBNZW1iZXIgX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXMoKSB7CiAgICBNZW1iZXIgaW50ZXJmYWNlTWVtYmVyID0gY29tYmluZWRNZW1iZXJTaWduYXR1cmVSZXN1bHQubWVtYmVyOwoKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gaW50ZXJmYWNlTWVtYmVyVHlwZVBhcmFtZXRlcnMgPQogICAgICAgIGludGVyZmFjZU1lbWJlci5mdW5jdGlvbj8udHlwZVBhcmFtZXRlcnMgPz8gW107CgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBzdHViVHlwZVBhcmFtZXRlcnM7CiAgICBpZiAoaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzICE9IGVuY2xvc2luZ0NsYXNzICYmCiAgICAgICAgaW50ZXJmYWNlTWVtYmVyVHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkgewogICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzIGZvciB0aGUgc3R1YiB1cCBmcm9udC4gVGhlc2UgYXJlIG5lZWRlZCB0bwogICAgICAvLyBlbnN1cmUgdGhlIFtzdWJzdGl0dXRpb25zXSBhcmUgYWxwaGEgcmVuYW1lZCB0byB0aGUgc2FtZSB0eXBlCiAgICAgIC8vIHBhcmFtZXRlcnMuCiAgICAgIHN0dWJUeXBlUGFyYW1ldGVycyA9IG5ldyBMaXN0PFR5cGVQYXJhbWV0ZXI+LmZpbGxlZCgKICAgICAgICAgIGludGVyZmFjZU1lbWJlclR5cGVQYXJhbWV0ZXJzLmxlbmd0aCwgbnVsbCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlTWVtYmVyVHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBUeXBlUGFyYW1ldGVyIHRhcmdldFR5cGVQYXJhbWV0ZXIgPSBpbnRlcmZhY2VNZW1iZXJUeXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBuZXcgVHlwZVBhcmFtZXRlcigKICAgICAgICAgICAgdGFyZ2V0VHlwZVBhcmFtZXRlci5uYW1lLCBudWxsKQogICAgICAgICAgLi5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdGFyZ2V0VHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsOwogICAgICAgIHN0dWJUeXBlUGFyYW1ldGVyc1tpXSA9IHR5cGVQYXJhbWV0ZXI7CiAgICAgIH0KICAgIH0KCiAgICBMaXN0PFN1YnN0aXR1dGlvbj4gc3Vic3RpdHV0aW9ucyA9CiAgICAgICAgbmV3IExpc3Q8U3Vic3RpdHV0aW9uPihfY2FuZGlkYXRlcy5sZW5ndGgpOwogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbjsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgX2NhbmRpZGF0ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgTWVtYmVyIG90aGVyTWVtYmVyID0gZ2V0Q2FuZGlkYXRlQXQoaik7CiAgICAgIHN1YnN0aXR1dGlvbnNbal0gPQogICAgICAgICAgX3N1YnN0aXR1dGlvbkZvcihzdHViVHlwZVBhcmFtZXRlcnMsIG90aGVyTWVtYmVyLCBlbmNsb3NpbmdDbGFzcyk7CiAgICAgIGlmIChvdGhlck1lbWJlciA9PSBpbnRlcmZhY2VNZW1iZXIpIHsKICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25zW2pdOwogICAgICB9CiAgICB9CiAgICAvLyBXZSBhbHdheXMgY3JlYXRlIGEgZm9yd2FyZGluZyBzdHViIHdoZW4gd2UndmUgaW5oZXJpdGVkIGEgbWVtYmVyIGZyb20gYW4KICAgIC8vIGludGVyZmFjZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvdmVycmlkZSBjYW5kaWRhdGUuICBUaGlzIGlzIHRvIHdvcmsKICAgIC8vIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgS2VybmVsIHR5cGUgY2hlY2tlciB3aGVyZSBpdCBjaG9vc2VzIHRoZSBmaXJzdAogICAgLy8gb3ZlcnJpZGUgY2FuZGlkYXRlLgogICAgLy8KICAgIC8vIFRPRE8oa21pbGxpa2luKTogRml4IHRoZSBLZXJuZWwgdHlwZSBjaGVja2VyIGFuZCBzdG9wIGNyZWF0aW5nIHRoZXNlCiAgICAvLyBleHRyYSBzdHVicy4KICAgIE1lbWJlciBzdHViID0gaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGVuY2xvc2luZ0NsYXNzIHx8CiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlciA9PSBnZXRDYW5kaWRhdGVBdCgwKQogICAgICAgID8gaW50ZXJmYWNlTWVtYmVyCiAgICAgICAgOiBfY3JlYXRlRm9yd2FyZGluZ1N0dWIoCiAgICAgICAgICAgIHN0dWJUeXBlUGFyYW1ldGVycywgc3Vic3RpdHV0aW9uLCBpbnRlcmZhY2VNZW1iZXIpOwoKICAgIEZ1bmN0aW9uTm9kZSBpbnRlcmZhY2VGdW5jdGlvbiA9IGludGVyZmFjZU1lbWJlci5mdW5jdGlvbjsKICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbj4gaW50ZXJmYWNlUG9zaXRpb25hbFBhcmFtZXRlcnMgPQogICAgICAgIGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJzKGludGVyZmFjZU1lbWJlcik7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGludGVyZmFjZU5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgaW50ZXJmYWNlRnVuY3Rpb24/Lm5hbWVkUGFyYW1ldGVycyA/PyBbXTsKICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gaW50ZXJmYWNlVHlwZVBhcmFtZXRlcnMgPQogICAgICAgIGludGVyZmFjZUZ1bmN0aW9uPy50eXBlUGFyYW1ldGVycyA/PyBbXTsKCiAgICB2b2lkIGNyZWF0ZVN0dWJJZk5lZWRlZCh7Ym9vbCBmb3JNZW1iZXJTaWduYXR1cmU6IGZhbHNlfSkgewogICAgICBpZiAoc3R1YiAhPSBpbnRlcmZhY2VNZW1iZXIpIHsKICAgICAgICBQcm9jZWR1cmUgcHJvY2VkdXJlID0gc3R1YjsKICAgICAgICBpZiAoZm9yTWVtYmVyU2lnbmF0dXJlKSB7CiAgICAgICAgICBwcm9jZWR1cmUuaXNNZW1iZXJTaWduYXR1cmUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU3R1YiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyLmVuY2xvc2luZ0NsYXNzID09IGVuY2xvc2luZ0NsYXNzKSByZXR1cm47CiAgICAgIHN0dWIgPSBfY3JlYXRlRm9yd2FyZGluZ1N0dWIoCiAgICAgICAgICBzdHViVHlwZVBhcmFtZXRlcnMsIHN1YnN0aXR1dGlvbiwgaW50ZXJmYWNlTWVtYmVyLAogICAgICAgICAgZm9yTWVtYmVyU2lnbmF0dXJlOiBmb3JNZW1iZXJTaWduYXR1cmUpOwogICAgfQoKICAgIGJvb2wgaXNJbXBsQ3JlYXRlZCA9IGZhbHNlOwogICAgdm9pZCBjcmVhdGVJbXBsSWZOZWVkZWQoKSB7CiAgICAgIGlmIChpc0ltcGxDcmVhdGVkKSByZXR1cm47CiAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICBfY3JlYXRlRm9yd2FyZGluZ0ltcGxJZk5lZWRlZChzdHViLmZ1bmN0aW9uKTsKICAgICAgaXNJbXBsQ3JlYXRlZCA9IHRydWU7CiAgICB9CgogICAgSW5jbHVkZXNUeXBlUGFyYW1ldGVyc05vbkNvdmFyaWFudGx5IG5lZWRzQ2hlY2tWaXNpdG9yID0KICAgICAgICBlbmNsb3NpbmdDbGFzcy50eXBlUGFyYW1ldGVycy5pc0VtcHR5CiAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAvLyBUT0RPKGFoZSk6IEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gY2FjaGUgdGhpcyBvYmplY3QuCiAgICAgICAgICAgIDogbmV3IEluY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseSgKICAgICAgICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLnR5cGVQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNoZWNraW5nIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYW5kIHRoZXNlIGFyZSBpbiBhCiAgICAgICAgICAgICAgICAvLyBjb250cmF2YXJpYW50IHBvc2l0aW9uLgogICAgICAgICAgICAgICAgaW5pdGlhbFZhcmlhbmNlOiBWYXJpYW5jZS5jb250cmF2YXJpYW50KTsKICAgIGJvb2wgbmVlZHNDaGVjayhEYXJ0VHlwZSB0eXBlKSA9PiBuZWVkc0NoZWNrVmlzaXRvciA9PSBudWxsCiAgICAgICAgPyBmYWxzZQogICAgICAgIDogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHR5cGUpLmFjY2VwdChuZWVkc0NoZWNrVmlzaXRvcik7CiAgICBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSBjbGFzc0J1aWxkZXIubGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0OwoKICAgIERhcnRUeXBlIGluaXRpYWxUeXBlKERhcnRUeXBlIGEpIHsKICAgICAgaWYgKCFpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgICAgYSA9IGxlZ2FjeUVyYXN1cmUoaGllcmFyY2h5LmNvcmVUeXBlcywgYSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgRGFydFR5cGUgbWVyZ2VUeXBlcyhEYXJ0VHlwZSBhLCBEYXJ0VHlwZSBiKSB7CiAgICAgIGlmIChhID09IG51bGwpIHJldHVybiBudWxsOwogICAgICBpZiAoIWlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKICAgICAgICBiID0gbGVnYWN5RXJhc3VyZShoaWVyYXJjaHkuY29yZVR5cGVzLCBiKTsKICAgICAgfQogICAgICByZXR1cm4gbm5iZFRvcE1lcmdlKGhpZXJhcmNoeS5jb3JlVHlwZXMsIGEsIGIpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlUG9zaXRpb25hbFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBpbnRlcmZhY2VQb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgRGFydFR5cGUgcGFyYW1ldGVyVHlwZSA9IHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShwYXJhbWV0ZXIudHlwZSk7CiAgICAgIERhcnRUeXBlIHR5cGUgPSBpbml0aWFsVHlwZShwYXJhbWV0ZXJUeXBlKTsKICAgICAgYm9vbCBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0KICAgICAgICAgIHBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsIHx8IG5lZWRzQ2hlY2socGFyYW1ldGVyLnR5cGUpOwogICAgICBib29sIGlzQ292YXJpYW50ID0gcGFyYW1ldGVyLmlzQ292YXJpYW50OwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHN1cGVyUGFyYW1ldGVyID0gcGFyYW1ldGVyOwogICAgICBmb3IgKGludCBqID0gMDsgaiA8IF9jYW5kaWRhdGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgTWVtYmVyIG90aGVyTWVtYmVyID0gZ2V0Q2FuZGlkYXRlQXQoaik7CiAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBvdGhlclBvc2l0aW9uYWxQYXJhbWV0ZXJzID0KICAgICAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnMob3RoZXJNZW1iZXIpOwogICAgICAgIGlmIChvdGhlclBvc2l0aW9uYWxQYXJhbWV0ZXJzLmxlbmd0aCA8PSBpKSBjb250aW51ZTsKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIG90aGVyUGFyYW1ldGVyID0gb3RoZXJQb3NpdGlvbmFsUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoaiA9PSAwKSBzdXBlclBhcmFtZXRlciA9IG90aGVyUGFyYW1ldGVyOwogICAgICAgIGlmIChpZGVudGljYWwob3RoZXJNZW1iZXIsIGludGVyZmFjZU1lbWJlcikpIGNvbnRpbnVlOwogICAgICAgIGlmIChvdGhlclBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG90aGVyUGFyYW1ldGVyLmlzQ292YXJpYW50KSB7CiAgICAgICAgICBpc0NvdmFyaWFudCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBtZXJnZVR5cGVzKAogICAgICAgICAgICB0eXBlLCBzdWJzdGl0dXRpb25zW2pdLnN1YnN0aXR1dGVUeXBlKG90aGVyUGFyYW1ldGVyLnR5cGUpKTsKICAgICAgfQogICAgICBpZiAoaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgIGlmICghc3VwZXJQYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICAgICAgc3R1Yi5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzQ292YXJpYW50KSB7CiAgICAgICAgaWYgKCFzdXBlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzQ292YXJpYW50KSB7CiAgICAgICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgICAgIHN0dWIuZnVuY3Rpb24ucG9zaXRpb25hbFBhcmFtZXRlcnNbaV0uaXNDb3ZhcmlhbnQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgIT0gcGFyYW1ldGVyVHlwZSkgewogICAgICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IFJlcG9ydCBhbiBlcnJvciB3aGVuIFt0eXBlXSBpcyBudWxsOyB0aGlzCiAgICAgICAgLy8gbWVhbnMgdGhhdCBubmJkLXRvcC1tZXJnZSB3YXMgbm90IGRlZmluZWQuCiAgICAgICAgY3JlYXRlU3R1YklmTmVlZGVkKGZvck1lbWJlclNpZ25hdHVyZTogdHJ1ZSk7CiAgICAgICAgc3R1Yi5mdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVyc1tpXS50eXBlID0gdHlwZTsKICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBpbnRlcmZhY2VOYW1lZFBhcmFtZXRlcnNbaV07CiAgICAgIERhcnRUeXBlIHBhcmFtZXRlclR5cGUgPSBzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUocGFyYW1ldGVyLnR5cGUpOwogICAgICBEYXJ0VHlwZSB0eXBlID0gaW5pdGlhbFR5cGUocGFyYW1ldGVyVHlwZSk7CiAgICAgIGJvb2wgaXNHZW5lcmljQ292YXJpYW50SW1wbCA9CiAgICAgICAgICBwYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCB8fCBuZWVkc0NoZWNrKHBhcmFtZXRlci50eXBlKTsKICAgICAgYm9vbCBpc0NvdmFyaWFudCA9IHBhcmFtZXRlci5pc0NvdmFyaWFudDsKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBzdXBlclBhcmFtZXRlciA9IHBhcmFtZXRlcjsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfY2FuZGlkYXRlcy5sZW5ndGg7IGorKykgewogICAgICAgIE1lbWJlciBvdGhlck1lbWJlciA9IGdldENhbmRpZGF0ZUF0KGopOwogICAgICAgIGlmIChvdGhlck1lbWJlciBpcyBGb3J3YXJkaW5nTm9kZSkgY29udGludWU7CiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBvdGhlclBhcmFtZXRlciA9CiAgICAgICAgICAgIGdldE5hbWVkRm9ybWFsKG90aGVyTWVtYmVyLmZ1bmN0aW9uLCBwYXJhbWV0ZXIubmFtZSk7CiAgICAgICAgaWYgKG90aGVyUGFyYW1ldGVyID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGlmIChqID09IDApIHN1cGVyUGFyYW1ldGVyID0gb3RoZXJQYXJhbWV0ZXI7CiAgICAgICAgaWYgKGlkZW50aWNhbChvdGhlck1lbWJlciwgaW50ZXJmYWNlTWVtYmVyKSkgY29udGludWU7CiAgICAgICAgaWYgKG90aGVyUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAob3RoZXJQYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpIHsKICAgICAgICAgIGlzQ292YXJpYW50ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IG1lcmdlVHlwZXMoCiAgICAgICAgICAgIHR5cGUsIHN1YnN0aXR1dGlvbnNbal0uc3Vic3RpdHV0ZVR5cGUob3RoZXJQYXJhbWV0ZXIudHlwZSkpOwogICAgICB9CiAgICAgIGlmIChpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgaWYgKCFzdXBlclBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBjcmVhdGVJbXBsSWZOZWVkZWQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJhbWV0ZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbCkgewogICAgICAgICAgY3JlYXRlU3R1YklmTmVlZGVkKCk7CiAgICAgICAgICBzdHViLmZ1bmN0aW9uLm5hbWVkUGFyYW1ldGVyc1tpXS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzQ292YXJpYW50KSB7CiAgICAgICAgaWYgKCFzdXBlclBhcmFtZXRlci5pc0NvdmFyaWFudCkgewogICAgICAgICAgY3JlYXRlSW1wbElmTmVlZGVkKCk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyYW1ldGVyLmlzQ292YXJpYW50KSB7CiAgICAgICAgICBjcmVhdGVTdHViSWZOZWVkZWQoKTsKICAgICAgICAgIHN0dWIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzW2ldLmlzQ292YXJpYW50ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9IHBhcmFtZXRlclR5cGUpIHsKICAgICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBvcnQgYW4gZXJyb3Igd2hlbiBbdHlwZV0gaXMgbnVsbDsgdGhpcwogICAgICAgIC8vIG1lYW5zIHRoYXQgbm5iZC10b3AtbWVyZ2Ugd2FzIG5vdCBkZWZpbmVkLgogICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZChmb3JNZW1iZXJTaWduYXR1cmU6IHRydWUpOwogICAgICAgIHN0dWIuZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzW2ldLnR5cGUgPSB0eXBlOwogICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZVR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGludGVyZmFjZVR5cGVQYXJhbWV0ZXJzW2ldOwogICAgICBib29sIGlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSB0eXBlUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgfHwKICAgICAgICAgIG5lZWRzQ2hlY2sodHlwZVBhcmFtZXRlci5ib3VuZCk7CiAgICAgIFR5cGVQYXJhbWV0ZXIgc3VwZXJUeXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcjsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfY2FuZGlkYXRlcy5sZW5ndGg7IGorKykgewogICAgICAgIE1lbWJlciBvdGhlck1lbWJlciA9IGdldENhbmRpZGF0ZUF0KGopOwogICAgICAgIGlmIChvdGhlck1lbWJlciBpcyBGb3J3YXJkaW5nTm9kZSkgY29udGludWU7CiAgICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBvdGhlclR5cGVQYXJhbWV0ZXJzID0KICAgICAgICAgICAgb3RoZXJNZW1iZXIuZnVuY3Rpb24udHlwZVBhcmFtZXRlcnM7CiAgICAgICAgaWYgKG90aGVyVHlwZVBhcmFtZXRlcnMubGVuZ3RoIDw9IGkpIGNvbnRpbnVlOwogICAgICAgIFR5cGVQYXJhbWV0ZXIgb3RoZXJUeXBlUGFyYW1ldGVyID0gb3RoZXJUeXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBpZiAoaiA9PSAwKSBzdXBlclR5cGVQYXJhbWV0ZXIgPSBvdGhlclR5cGVQYXJhbWV0ZXI7CiAgICAgICAgaWYgKGlkZW50aWNhbChvdGhlck1lbWJlciwgaW50ZXJmYWNlTWVtYmVyKSkgY29udGludWU7CiAgICAgICAgaWYgKG90aGVyVHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBpc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICBpZiAoIXN1cGVyVHlwZVBhcmFtZXRlci5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsKSB7CiAgICAgICAgICBjcmVhdGVJbXBsSWZOZWVkZWQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGwpIHsKICAgICAgICAgIGNyZWF0ZVN0dWJJZk5lZWRlZCgpOwogICAgICAgICAgc3R1Yi5mdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXS5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIERhcnRUeXBlIHJldHVyblR5cGUgPQogICAgICAgIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShnZXRSZXR1cm5UeXBlKGludGVyZmFjZU1lbWJlcikpOwogICAgRGFydFR5cGUgdHlwZSA9IGluaXRpYWxUeXBlKHJldHVyblR5cGUpOwogICAgZm9yIChpbnQgaiA9IDA7IGogPCBfY2FuZGlkYXRlcy5sZW5ndGg7IGorKykgewogICAgICBNZW1iZXIgb3RoZXJNZW1iZXIgPSBnZXRDYW5kaWRhdGVBdChqKTsKICAgICAgdHlwZSA9IG1lcmdlVHlwZXMoCiAgICAgICAgICB0eXBlLCBzdWJzdGl0dXRpb25zW2pdLnN1YnN0aXR1dGVUeXBlKGdldFJldHVyblR5cGUob3RoZXJNZW1iZXIpKSk7CiAgICB9CiAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgIT0gcmV0dXJuVHlwZSkgewogICAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBSZXBvcnQgYW4gZXJyb3Igd2hlbiBbdHlwZV0gaXMgbnVsbDsgdGhpcwogICAgICAvLyBtZWFucyB0aGF0IG5uYmQtdG9wLW1lcmdlIHdhcyBub3QgZGVmaW5lZC4KICAgICAgY3JlYXRlU3R1YklmTmVlZGVkKGZvck1lbWJlclNpZ25hdHVyZTogdHJ1ZSk7CiAgICAgIHN0dWIuZnVuY3Rpb24ucmV0dXJuVHlwZSA9IHR5cGU7CiAgICB9CiAgICByZXR1cm4gc3R1YjsKICB9CgogIHZvaWQgX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWQoRnVuY3Rpb25Ob2RlIGZ1bmN0aW9uKSB7CiAgICBpZiAoZnVuY3Rpb24uYm9keSAhPSBudWxsKSB7CiAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYW4gaW1wbGVtZW50YXRpb247IG5vdGhpbmcgZnVydGhlciBuZWVkcyB0byBiZSBkb25lLgogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBGaW5kIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgc3VwZXJjbGFzczsgdGhpcyBpcyB3aGF0IHdlIG5lZWQKICAgIC8vIHRvIGZvcndhcmQgdG8uICBJZiB3ZSBjYW4ndCBmaW5kIG9uZSwgdGhlbiB0aGUgbWV0aG9kIGlzIGZ1bGx5IGFic3RyYWN0CiAgICAvLyBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KICAgIENsYXNzIHN1cGVyY2xhc3MgPSBlbmNsb3NpbmdDbGFzcy5zdXBlcmNsYXNzOwogICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgcmV0dXJuOwogICAgUHJvY2VkdXJlIHByb2NlZHVyZSA9IGZ1bmN0aW9uLnBhcmVudDsKICAgIE1lbWJlciBzdXBlclRhcmdldCA9IGhpZXJhcmNoeS5nZXREaXNwYXRjaFRhcmdldEtlcm5lbCgKICAgICAgICBzdXBlcmNsYXNzLCBwcm9jZWR1cmUubmFtZSwga2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcik7CiAgICBpZiAoc3VwZXJUYXJnZXQgPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKHN1cGVyVGFyZ2V0IGlzIFByb2NlZHVyZSAmJiBzdXBlclRhcmdldC5pc0ZvcndhcmRpbmdTdHViKSB7CiAgICAgIHN1cGVyVGFyZ2V0ID0gX2dldEZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQoc3VwZXJUYXJnZXQpOwogICAgfQogICAgcHJvY2VkdXJlLmlzQWJzdHJhY3QgPSBmYWxzZTsKICAgIGlmICghcHJvY2VkdXJlLmlzRm9yd2FyZGluZ1N0dWIpIHsKICAgICAgLy8gVGhpcyBwcm9jZWR1cmUgZXhpc3RzIGFic3RyYWN0bHkgaW4gdGhlIHNvdXJjZSBjb2RlOyB3ZSBuZWVkIHRvIG1ha2UgaXQKICAgICAgLy8gY29uY3JldGUgYW5kIGdpdmUgaXQgYSBib2R5IHRoYXQgaXMgYSBmb3J3YXJkaW5nIHN0dWIuICBUaGlzIHNpdHVhdGlvbgogICAgICAvLyBpcyBjYWxsZWQgYSAiZm9yd2FyZGluZyBzZW1pLXN0dWIiLgogICAgICBwcm9jZWR1cmUuaXNGb3J3YXJkaW5nU3R1YiA9IHRydWU7CiAgICAgIHByb2NlZHVyZS5pc0ZvcndhcmRpbmdTZW1pU3R1YiA9IHRydWU7CiAgICB9CiAgICBMaXN0PEV4cHJlc3Npb24+IHBvc2l0aW9uYWxBcmd1bWVudHMgPSBmdW5jdGlvbi5wb3NpdGlvbmFsUGFyYW1ldGVycwogICAgICAgIC5tYXA8RXhwcmVzc2lvbj4oKHBhcmFtZXRlcikgPT4gbmV3IFZhcmlhYmxlR2V0KHBhcmFtZXRlcikpCiAgICAgICAgLnRvTGlzdCgpOwogICAgTGlzdDxOYW1lZEV4cHJlc3Npb24+IG5hbWVkQXJndW1lbnRzID0gZnVuY3Rpb24ubmFtZWRQYXJhbWV0ZXJzCiAgICAgICAgLm1hcCgocGFyYW1ldGVyKSA9PgogICAgICAgICAgICBuZXcgTmFtZWRFeHByZXNzaW9uKHBhcmFtZXRlci5uYW1lLCBuZXcgVmFyaWFibGVHZXQocGFyYW1ldGVyKSkpCiAgICAgICAgLnRvTGlzdCgpOwogICAgTGlzdDxEYXJ0VHlwZT4gdHlwZUFyZ3VtZW50cyA9IGZ1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzCiAgICAgICAgLm1hcDxEYXJ0VHlwZT4oKHR5cGVQYXJhbWV0ZXIpID0+CiAgICAgICAgICAgIG5ldyBUeXBlUGFyYW1ldGVyVHlwZS53aXRoRGVmYXVsdE51bGxhYmlsaXR5Rm9yTGlicmFyeSgKICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIsIGVuY2xvc2luZ0NsYXNzLmVuY2xvc2luZ0xpYnJhcnkpKQogICAgICAgIC50b0xpc3QoKTsKICAgIEFyZ3VtZW50cyBhcmd1bWVudHMgPSBuZXcgQXJndW1lbnRzKHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgdHlwZXM6IHR5cGVBcmd1bWVudHMsIG5hbWVkOiBuYW1lZEFyZ3VtZW50cyk7CiAgICBFeHByZXNzaW9uIHN1cGVyQ2FsbDsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgogICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6CiAgICAgICAgc3VwZXJDYWxsID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbihuYW1lLCBhcmd1bWVudHMsIHN1cGVyVGFyZ2V0KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgICBzdXBlckNhbGwgPSBuZXcgU3VwZXJQcm9wZXJ0eUdldChuYW1lLCBzdXBlclRhcmdldCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgc3VwZXJDYWxsID0KICAgICAgICAgICAgbmV3IFN1cGVyUHJvcGVydHlTZXQobmFtZSwgcG9zaXRpb25hbEFyZ3VtZW50c1swXSwgc3VwZXJUYXJnZXQpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHVuaGFuZGxlZCgnJGtpbmQnLCAnX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWQnLCAtMSwgbnVsbCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBmdW5jdGlvbi5ib2R5ID0gbmV3IFJldHVyblN0YXRlbWVudChzdXBlckNhbGwpLi5wYXJlbnQgPSBmdW5jdGlvbjsKICAgIHByb2NlZHVyZS50cmFuc2Zvcm1lckZsYWdzIHw9IFRyYW5zZm9ybWVyRmxhZy5zdXBlckNhbGxzOwogICAgcHJvY2VkdXJlLmZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQgPSBzdXBlclRhcmdldDsKICB9CgogIC8vLyBDcmVhdGVzIGEgZm9yd2FyZGluZyBzdHViIGJhc2VkIG9uIHRoZSBnaXZlbiBbdGFyZ2V0XS4KICBQcm9jZWR1cmUgX2NyZWF0ZUZvcndhcmRpbmdTdHViKExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCiAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24sIE1lbWJlciB0YXJnZXQsCiAgICAgIHtib29sIGZvck1lbWJlclNpZ25hdHVyZTogZmFsc2V9KSB7CiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGNvcHlQYXJhbWV0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIpIHsKICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKHBhcmFtZXRlci5uYW1lLAogICAgICAgICAgdHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHBhcmFtZXRlci50eXBlKSwKICAgICAgICAgIGlzQ292YXJpYW50OiBwYXJhbWV0ZXIuaXNDb3ZhcmlhbnQpCiAgICAgICAgLi5pc0dlbmVyaWNDb3ZhcmlhbnRJbXBsID0gcGFyYW1ldGVyLmlzR2VuZXJpY0NvdmFyaWFudEltcGw7CiAgICB9CgogICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0YXJnZXRUeXBlUGFyYW1ldGVycyA9CiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uPy50eXBlUGFyYW1ldGVycyA/PyBbXTsKICAgIGlmICh0eXBlUGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgIE1hcDxUeXBlUGFyYW1ldGVyLCBEYXJ0VHlwZT4gYWRkaXRpb25hbFN1YnN0aXR1dGlvbiA9CiAgICAgICAgICA8VHlwZVBhcmFtZXRlciwgRGFydFR5cGU+e307CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0VHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBUeXBlUGFyYW1ldGVyIHRhcmdldFR5cGVQYXJhbWV0ZXIgPSB0YXJnZXRUeXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBhZGRpdGlvbmFsU3Vic3RpdHV0aW9uW3RhcmdldFR5cGVQYXJhbWV0ZXJdID0KICAgICAgICAgICAgbmV3IFR5cGVQYXJhbWV0ZXJUeXBlLmZvckFscGhhUmVuYW1pbmcoCiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlUGFyYW1ldGVyLCB0eXBlUGFyYW1ldGVyc1tpXSk7CiAgICAgIH0KICAgICAgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLmNvbWJpbmUoCiAgICAgICAgICBzdWJzdGl0dXRpb24sIFN1YnN0aXR1dGlvbi5mcm9tTWFwKGFkZGl0aW9uYWxTdWJzdGl0dXRpb24pKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kID0KICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKHRhcmdldFR5cGVQYXJhbWV0ZXJzW2ldLmJvdW5kKTsKICAgICAgfQogICAgfQogICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uPiBwb3NpdGlvbmFsUGFyYW1ldGVycyA9CiAgICAgICAgZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnModGFyZ2V0KS5tYXAoY29weVBhcmFtZXRlcikudG9MaXN0KCk7CiAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IG5hbWVkUGFyYW1ldGVycyA9CiAgICAgICAgdGFyZ2V0LmZ1bmN0aW9uPy5uYW1lZFBhcmFtZXRlcnM/Lm1hcChjb3B5UGFyYW1ldGVyKT8udG9MaXN0KCkgPz8gW107CiAgICBGdW5jdGlvbk5vZGUgZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25Ob2RlKG51bGwsCiAgICAgICAgcG9zaXRpb25hbFBhcmFtZXRlcnM6IHBvc2l0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWRQYXJhbWV0ZXJzLAogICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVycywKICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiBnZXRSZXF1aXJlZFBhcmFtZXRlckNvdW50KHRhcmdldCksCiAgICAgICAgcmV0dXJuVHlwZTogc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGdldFJldHVyblR5cGUodGFyZ2V0KSkpOwogICAgTWVtYmVyIGZpbmFsVGFyZ2V0OwogICAgaWYgKHRhcmdldCBpcyBQcm9jZWR1cmUgJiYgdGFyZ2V0LmlzRm9yd2FyZGluZ1N0dWIpIHsKICAgICAgZmluYWxUYXJnZXQgPSB0YXJnZXQuZm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXQ7CiAgICB9IGVsc2UgewogICAgICBmaW5hbFRhcmdldCA9IHRhcmdldDsKICAgIH0KICAgIFByb2NlZHVyZSByZWZlcmVuY2VGcm9tOwogICAgaWYgKGNsYXNzQnVpbGRlci5yZWZlcmVuY2VzRnJvbUluZGV4ZWQgIT0gbnVsbCkgewogICAgICBpZiAoa2luZCA9PSBQcm9jZWR1cmVLaW5kLlNldHRlcikgewogICAgICAgIHJlZmVyZW5jZUZyb20gPQogICAgICAgICAgICBjbGFzc0J1aWxkZXIucmVmZXJlbmNlc0Zyb21JbmRleGVkLmxvb2t1cFByb2NlZHVyZVNldHRlcihuYW1lLm5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlZmVyZW5jZUZyb20gPSBjbGFzc0J1aWxkZXIucmVmZXJlbmNlc0Zyb21JbmRleGVkCiAgICAgICAgICAgIC5sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXIobmFtZS5uYW1lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBQcm9jZWR1cmUobmFtZSwga2luZCwgZnVuY3Rpb24sCiAgICAgICAgaXNBYnN0cmFjdDogdHJ1ZSwKICAgICAgICBpc0ZvcndhcmRpbmdTdHViOiAhZm9yTWVtYmVyU2lnbmF0dXJlLAogICAgICAgIGlzTWVtYmVyU2lnbmF0dXJlOiBmb3JNZW1iZXJTaWduYXR1cmUsCiAgICAgICAgZmlsZVVyaTogZW5jbG9zaW5nQ2xhc3MuZmlsZVVyaSwKICAgICAgICBmb3J3YXJkaW5nU3R1YkludGVyZmFjZVRhcmdldDogZmluYWxUYXJnZXQsCiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VGcm9tPy5yZWZlcmVuY2UpCiAgICAgIC4uc3RhcnRGaWxlT2Zmc2V0ID0gZW5jbG9zaW5nQ2xhc3MuZmlsZU9mZnNldAogICAgICAuLmZpbGVPZmZzZXQgPSBlbmNsb3NpbmdDbGFzcy5maWxlT2Zmc2V0CiAgICAgIC4ucGFyZW50ID0gZW5jbG9zaW5nQ2xhc3MKICAgICAgLi5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0KICAgICAgICAgIGVuY2xvc2luZ0NsYXNzLmVuY2xvc2luZ0xpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKICB9CgogIC8vLyBSZXR1cm5zIHRoZSBbaV10aCBlbGVtZW50IG9mIFtfY2FuZGlkYXRlc10sIGZpbmFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5LgogIE1lbWJlciBnZXRDYW5kaWRhdGVBdChpbnQgaSkgewogICAgQ2xhc3NNZW1iZXIgY2FuZGlkYXRlID0gX2NhbmRpZGF0ZXNbaV07CiAgICBhc3NlcnQoY2FuZGlkYXRlIGlzISBEZWxheWVkTWVtYmVyKTsKICAgIHJldHVybiBjYW5kaWRhdGUubWVtYmVyOwogIH0KCiAgc3RhdGljIE1lbWJlciBfZ2V0Rm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldChQcm9jZWR1cmUgZm9yd2FyZGluZ1N0dWIpIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiBkYXJ0YnVnLmNvbS8zMTU2MiBpcyBmaXhlZCwgdGhpcyBzaG91bGQgYmVjb21lCiAgICAvLyBlYXNpZXIuCiAgICBSZXR1cm5TdGF0ZW1lbnQgYm9keSA9IGZvcndhcmRpbmdTdHViLmZ1bmN0aW9uLmJvZHk7CiAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBib2R5LmV4cHJlc3Npb247CiAgICBpZiAoZXhwcmVzc2lvbiBpcyBTdXBlck1ldGhvZEludm9jYXRpb24pIHsKICAgICAgcmV0dXJuIGV4cHJlc3Npb24uaW50ZXJmYWNlVGFyZ2V0OwogICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGlzIFN1cGVyUHJvcGVydHlTZXQpIHsKICAgICAgcmV0dXJuIGV4cHJlc3Npb24uaW50ZXJmYWNlVGFyZ2V0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVuaGFuZGxlZCgnJHtleHByZXNzaW9uLnJ1bnRpbWVUeXBlfScsCiAgICAgICAgICAnX2dldEZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXQnLCAtMSwgbnVsbCk7CiAgICB9CiAgfQoKICBTdWJzdGl0dXRpb24gX3N1YnN0aXR1dGlvbkZvcigKICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBzdHViVHlwZVBhcmFtZXRlcnMsIE1lbWJlciBjYW5kaWRhdGUsIENsYXNzIGNsYXNzXykgewogICAgU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tSW50ZXJmYWNlVHlwZSgKICAgICAgICBoaWVyYXJjaHkuZ2V0S2VybmVsVHlwZUFzSW5zdGFuY2VPZigKICAgICAgICAgICAgaGllcmFyY2h5LmNvcmVUeXBlcwogICAgICAgICAgICAgICAgLnRoaXNJbnRlcmZhY2VUeXBlKGNsYXNzXywgY2xhc3NfLmVuY2xvc2luZ0xpYnJhcnkubm9uTnVsbGFibGUpLAogICAgICAgICAgICBjYW5kaWRhdGUuZW5jbG9zaW5nQ2xhc3MsCiAgICAgICAgICAgIGNsYXNzXy5lbmNsb3NpbmdMaWJyYXJ5KSk7CiAgICBpZiAoc3R1YlR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgLy8gSWYgdGhlIHN0dWIgaXMgZ2VuZXJpYyBlbnN1cmUgdGhhdCB0eXBlIHBhcmFtZXRlcnMgYXJlIGFscGhhIHJlbmFtZWQKICAgICAgLy8gdG8gdGhlIFtzdHViVHlwZVBhcmFtZXRlcnNdLgogICAgICBNYXA8VHlwZVBhcmFtZXRlciwgVHlwZVBhcmFtZXRlclR5cGU+IG1hcCA9IHt9OwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0dWJUeXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIFR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGNhbmRpZGF0ZS5mdW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXTsKICAgICAgICBtYXBbdHlwZVBhcmFtZXRlcl0gPSBuZXcgVHlwZVBhcmFtZXRlclR5cGUuZm9yQWxwaGFSZW5hbWluZygKICAgICAgICAgICAgdHlwZVBhcmFtZXRlciwgc3R1YlR5cGVQYXJhbWV0ZXJzW2ldKTsKICAgICAgfQogICAgICBzdWJzdGl0dXRpb24gPQogICAgICAgICAgU3Vic3RpdHV0aW9uLmNvbWJpbmUoc3Vic3RpdHV0aW9uLCBTdWJzdGl0dXRpb24uZnJvbU1hcChtYXApKTsKICAgIH0KICAgIHJldHVybiBzdWJzdGl0dXRpb247CiAgfQoKICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IGdldFBvc2l0aW9uYWxQYXJhbWV0ZXJzKE1lbWJlciBtZW1iZXIpIHsKICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKICAgICAgaWYgKGtpbmQgPT0gUHJvY2VkdXJlS2luZC5TZXR0ZXIpIHsKICAgICAgICByZXR1cm4gPFZhcmlhYmxlRGVjbGFyYXRpb24+WwogICAgICAgICAgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oIl8iLAogICAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlLCBpc0NvdmFyaWFudDogbWVtYmVyLmlzQ292YXJpYW50KQogICAgICAgICAgICAuLmlzR2VuZXJpY0NvdmFyaWFudEltcGwgPSBtZW1iZXIuaXNHZW5lcmljQ292YXJpYW50SW1wbAogICAgICAgIF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDxWYXJpYWJsZURlY2xhcmF0aW9uPltdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbWVtYmVyLmZ1bmN0aW9uLnBvc2l0aW9uYWxQYXJhbWV0ZXJzOwogICAgfQogIH0KCiAgaW50IGdldFJlcXVpcmVkUGFyYW1ldGVyQ291bnQoTWVtYmVyIG1lbWJlcikgewogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG1lbWJlci5mdW5jdGlvbi5yZXF1aXJlZFBhcmFtZXRlckNvdW50OwogICAgfQogIH0KCiAgRGFydFR5cGUgZ2V0UmV0dXJuVHlwZShNZW1iZXIgbWVtYmVyKSB7CiAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLkdldHRlcjoKICAgICAgICByZXR1cm4gbWVtYmVyIGlzIEZpZWxkID8gbWVtYmVyLnR5cGUgOiBtZW1iZXIuZnVuY3Rpb24ucmV0dXJuVHlwZTsKICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKICAgICAgICByZXR1cm4gY29uc3QgVm9pZFR5cGUoKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbWVtYmVyLmZ1bmN0aW9uLnJldHVyblR5cGU7CiAgICB9CiAgfQp9CoIkAE5OPAEhCRMPEhQPFhAOGRMXGR8aGhcbHRUSEgFJAT0BMTEBLgEqATYvAUMBJwEXKQEpATMBHAFIKycBNEgBPgEwAUwlMgFEBk1IHgZQTU03JUMBODgBLDw0S0cVOzdHTjksUS8IBgEnNB8zLhlNLCkIBlBLShsHTBRGMRohQAE/PjI5MjIxAUAlJCIuES0KEAhEJD0zBgEgICEcNBwGAT0uE0Q4L0orOkAQR08BJyUzCBAGATIiJTMINgYBRUhMMiRKMDY1MD4yPUs1PzUpCioeChtJCCQ2IAoxIE8KCBkrIAomIEQKCDNKNjY7CAZAQ0wyJEowNjUwNS1CLjU/NSkKKh4KG0kIJDYgCjEgSgoIGSsgCiYgPwoIM0o2NjYIBj9ATCs4NTA1MjE3Qz0/OSkKCCQ6IAo1IEkKCAYaRS0zLhlOBi5INDQnBhEEAT4hTw4GUE8pMiQrPEMlREAGIidRUC0pLQZJRBNEHE0TOypEQRM9NhoUISNNDyE9DyEUTQ8PRw8GRz43BAE9RjAqRzU9LkUGAS8vIjwnPkU2NDkIK0c4IkgIBjVFME4zNCooQ0kYOjoNHAYdNioYUQ87MggGLxovLyk0LTQvICFCBAFOISwpHQQBSkwPOS0vKTEpDTQ2BgQBIVBALSBRJicmTiY2PExFMwgVSQYZBAFFGyomJ0JFCw8oCA0zBgQBMRQhEiESDzcGBAEqFCFLISEPKwYEAgE3cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9mb3J3YXJkaW5nX25vZGUuZGFydHFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL2Vycm9yX2RlbGVnYXRpb25fbGlzdGVuZXIuZGFydILaLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmltcG9ydCAnLi4vbWVzc2FnZXMvY29kZXMuZGFydCcgc2hvdyBNZXNzYWdlOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2xpc3RlbmVyLmRhcnQnIHNob3cgTGlzdGVuZXI7CgovLy8gQSBsaXN0ZW5lciB3aGljaCBmb3J3YXJkcyBlcnJvciByZXBvcnRzIHRvIGFub3RoZXIgbGlzdGVuZXIgYnV0IGlnbm9yZXMKLy8vIGFsbCBvdGhlciBldmVudHMuCmNsYXNzIEVycm9yRGVsZWdhdGlvbkxpc3RlbmVyIGV4dGVuZHMgTGlzdGVuZXIgewogIExpc3RlbmVyIGRlbGVnYXRlOwoKICBFcnJvckRlbGVnYXRpb25MaXN0ZW5lcih0aGlzLmRlbGVnYXRlKTsKCiAgdm9pZCBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIHN0YXJ0VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICByZXR1cm4gZGVsZWdhdGUuaGFuZGxlUmVjb3ZlcmFibGVFcnJvcihtZXNzYWdlLCBzdGFydFRva2VuLCBlbmRUb2tlbik7CiAgfQp9ChgATk48AS4BKwEmAUwWMRUBKgEfO0sEAgFFcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvZXJyb3JfZGVsZWdhdGlvbl9saXN0ZW5lci5kYXJ0aWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fY29sbGVjdGlvbnMuZGFydMAAfYMvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBmYXN0YS50cmFuc2Zvcm1fY29sbGVjdGlvbnM7CgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnCiAgICBzaG93CiAgICAgICAgQXJndW1lbnRzLAogICAgICAgIEFzRXhwcmVzc2lvbiwKICAgICAgICBCbG9jaywKICAgICAgICBCbG9ja0V4cHJlc3Npb24sCiAgICAgICAgQ2xhc3MsCiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uLAogICAgICAgIERhcnRUeXBlLAogICAgICAgIER5bmFtaWNUeXBlLAogICAgICAgIEV4cHJlc3Npb24sCiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCwKICAgICAgICBGaWVsZCwKICAgICAgICBGb3JJblN0YXRlbWVudCwKICAgICAgICBGb3JTdGF0ZW1lbnQsCiAgICAgICAgSWZTdGF0ZW1lbnQsCiAgICAgICAgSW50ZXJmYWNlVHlwZSwKICAgICAgICBMZXQsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaXN0Q29uY2F0ZW5hdGlvbiwKICAgICAgICBMaXN0TGl0ZXJhbCwKICAgICAgICBNYXBDb25jYXRlbmF0aW9uLAogICAgICAgIE1hcEVudHJ5LAogICAgICAgIE1hcExpdGVyYWwsCiAgICAgICAgTWV0aG9kSW52b2NhdGlvbiwKICAgICAgICBOYW1lLAogICAgICAgIE5vdCwKICAgICAgICBOdWxsTGl0ZXJhbCwKICAgICAgICBQcm9jZWR1cmUsCiAgICAgICAgUHJvcGVydHlHZXQsCiAgICAgICAgU2V0Q29uY2F0ZW5hdGlvbiwKICAgICAgICBTZXRMaXRlcmFsLAogICAgICAgIFN0YXRlbWVudCwKICAgICAgICBTdGF0aWNJbnZvY2F0aW9uLAogICAgICAgIHRyYW5zZm9ybUxpc3QsCiAgICAgICAgVHJlZU5vZGUsCiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiwKICAgICAgICBWYXJpYWJsZUdldDsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvY29yZV90eXBlcy5kYXJ0JyBzaG93IENvcmVUeXBlczsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9lbnZpcm9ubWVudC5kYXJ0JwogICAgc2hvdyBTdWJ0eXBlQ2hlY2tNb2RlLCBUeXBlRW52aXJvbm1lbnQ7CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3Zpc2l0b3IuZGFydCcgc2hvdyBUcmFuc2Zvcm1lcjsKCmltcG9ydCAnY29sbGVjdGlvbnMuZGFydCcKICAgIHNob3cKICAgICAgICBDb250cm9sRmxvd0VsZW1lbnQsCiAgICAgICAgQ29udHJvbEZsb3dNYXBFbnRyeSwKICAgICAgICBGb3JFbGVtZW50LAogICAgICAgIEZvckluRWxlbWVudCwKICAgICAgICBGb3JJbk1hcEVudHJ5LAogICAgICAgIEZvck1hcEVudHJ5LAogICAgICAgIElmRWxlbWVudCwKICAgICAgICBJZk1hcEVudHJ5LAogICAgICAgIFNwcmVhZEVsZW1lbnQsCiAgICAgICAgU3ByZWFkTWFwRW50cnk7CgppbXBvcnQgJy4uL3Byb2JsZW1zLmRhcnQnIHNob3cgZ2V0RmlsZVVyaSwgdW5oYW5kbGVkOwoKaW1wb3J0ICcuLi9zb3VyY2Uvc291cmNlX2xvYWRlci5kYXJ0JzsKCmltcG9ydCAncmVkaXJlY3RpbmdfZmFjdG9yeV9ib2R5LmRhcnQnIHNob3cgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keTsKCmNsYXNzIENvbGxlY3Rpb25UcmFuc2Zvcm1lciBleHRlbmRzIFRyYW5zZm9ybWVyIHsKICBmaW5hbCBDb3JlVHlwZXMgY29yZVR5cGVzOwogIGZpbmFsIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQ7CiAgZmluYWwgUHJvY2VkdXJlIGxpc3RBZGQ7CiAgZmluYWwgUHJvY2VkdXJlIHNldEZhY3Rvcnk7CiAgZmluYWwgUHJvY2VkdXJlIHNldEFkZDsKICBmaW5hbCBQcm9jZWR1cmUgb2JqZWN0RXF1YWxzOwogIGZpbmFsIFByb2NlZHVyZSBtYXBFbnRyaWVzOwogIGZpbmFsIFByb2NlZHVyZSBtYXBQdXQ7CiAgZmluYWwgQ2xhc3MgbWFwRW50cnlDbGFzczsKICBmaW5hbCBGaWVsZCBtYXBFbnRyeUtleTsKICBmaW5hbCBGaWVsZCBtYXBFbnRyeVZhbHVlOwogIGZpbmFsIFNvdXJjZUxvYWRlckRhdGFGb3JUZXN0aW5nIGRhdGFGb3JUZXN0aW5nOwoKICAvLy8gTGlicmFyeSB0aGF0IGNvbnRhaW5zIHRoZSB0cmFuc2Zvcm1lZCBub2Rlcy4KICAvLy8KICAvLy8gVGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBub2RlcyBpcyBhZmZlY3RlZCBieSB0aGUgTk5CRCBvcHQtaW4gc3RhdHVzIG9mCiAgLy8vIHRoZSBsaWJyYXJ5LgogIExpYnJhcnkgX2N1cnJlbnRMaWJyYXJ5OwoKICBzdGF0aWMgUHJvY2VkdXJlIF9maW5kU2V0RmFjdG9yeShDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICBQcm9jZWR1cmUgZmFjdG9yeSA9IGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnJyk7CiAgICBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5IGJvZHkgPSBmYWN0b3J5Py5mdW5jdGlvbj8uYm9keTsKICAgIHJldHVybiBib2R5Py50YXJnZXQ7CiAgfQoKICBDb2xsZWN0aW9uVHJhbnNmb3JtZXIoU291cmNlTG9hZGVyIGxvYWRlcikKICAgICAgOiBjb3JlVHlwZXMgPSBsb2FkZXIuY29yZVR5cGVzLAogICAgICAgIHR5cGVFbnZpcm9ubWVudCA9IGxvYWRlci50eXBlSW5mZXJlbmNlRW5naW5lLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwKICAgICAgICBsaXN0QWRkID0gbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdMaXN0JywgJ2FkZCcpLAogICAgICAgIHNldEZhY3RvcnkgPSBfZmluZFNldEZhY3RvcnkobG9hZGVyLmNvcmVUeXBlcyksCiAgICAgICAgc2V0QWRkID0gbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdTZXQnLCAnYWRkJyksCiAgICAgICAgb2JqZWN0RXF1YWxzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdPYmplY3QnLCAnPT0nKSwKICAgICAgICBtYXBFbnRyaWVzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdNYXAnLCAnZ2V0OmVudHJpZXMnKSwKICAgICAgICBtYXBQdXQgPSBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcCcsICdbXT0nKSwKICAgICAgICBtYXBFbnRyeUNsYXNzID0KICAgICAgICAgICAgbG9hZGVyLmNvcmVUeXBlcy5pbmRleC5nZXRDbGFzcygnZGFydDpjb3JlJywgJ01hcEVudHJ5JyksCiAgICAgICAgbWFwRW50cnlLZXkgPQogICAgICAgICAgICBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcEVudHJ5JywgJ2tleScpLAogICAgICAgIG1hcEVudHJ5VmFsdWUgPQogICAgICAgICAgICBsb2FkZXIuY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ01hcEVudHJ5JywgJ3ZhbHVlJyksCiAgICAgICAgZGF0YUZvclRlc3RpbmcgPSBsb2FkZXIuZGF0YUZvclRlc3Rpbmc7CgogIFRyZWVOb2RlIF90cmFuc2xhdGVMaXN0T3JTZXQoCiAgICAgIEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgZWxlbWVudFR5cGUsIExpc3Q8RXhwcmVzc2lvbj4gZWxlbWVudHMsCiAgICAgIHtib29sIGlzU2V0OiBmYWxzZX0pIHsKICAgIC8vIFRyYW5zbGF0ZSBlbGVtZW50cyBpbiBwbGFjZSB1cCB0byB0aGUgZmlyc3Qgbm9uLWV4cHJlc3Npb24sIGlmIGFueS4KICAgIGludCBpID0gMDsKICAgIGZvciAoOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGVsZW1lbnRzW2ldIGlzIENvbnRyb2xGbG93RWxlbWVudCkgYnJlYWs7CiAgICAgIGVsZW1lbnRzW2ldID0gZWxlbWVudHNbaV0uYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0KCiAgICAvLyBJZiB0aGVyZSB3ZXJlIG9ubHkgZXhwcmVzc2lvbnMsIHdlIGFyZSBkb25lLgogICAgaWYgKGkgPT0gZWxlbWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZTsKCiAgICAvLyBCdWlsZCBhIGJsb2NrIGV4cHJlc3Npb24gYW5kIGNyZWF0ZSBhbiBlbXB0eSBsaXN0IG9yIHNldC4KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0OwogICAgaWYgKGlzU2V0KSB7CiAgICAgIHJlc3VsdCA9IF9jcmVhdGVWYXJpYWJsZSgKICAgICAgICAgIF9jcmVhdGVTZXRMaXRlcmFsKG5vZGUuZmlsZU9mZnNldCwgZWxlbWVudFR5cGUsIFtdKSwKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5zZXRUeXBlKGVsZW1lbnRUeXBlLCBfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IF9jcmVhdGVWYXJpYWJsZSgKICAgICAgICAgIF9jcmVhdGVMaXN0TGl0ZXJhbChub2RlLmZpbGVPZmZzZXQsIGVsZW1lbnRUeXBlLCBbXSksCiAgICAgICAgICB0eXBlRW52aXJvbm1lbnQubGlzdFR5cGUoZWxlbWVudFR5cGUsIF9jdXJyZW50TGlicmFyeS5ub25OdWxsYWJsZSkpOwogICAgfQogICAgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkgPSBbcmVzdWx0XTsKICAgIC8vIEFkZCB0aGUgZWxlbWVudHMgdXAgdG8gdGhlIGZpcnN0IG5vbi1leHByZXNzaW9uLgogICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKICAgICAgX2FkZEV4cHJlc3Npb25FbGVtZW50KGVsZW1lbnRzW2pdLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0KICAgIC8vIFRyYW5zbGF0ZSB0aGUgZWxlbWVudHMgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3Qgbm9uLWV4cHJlc3Npb24uCiAgICBmb3IgKDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIF90cmFuc2xhdGVFbGVtZW50KGVsZW1lbnRzW2ldLCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9CgogICAgcmV0dXJuIF9jcmVhdGVCbG9ja0V4cHJlc3Npb24oCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCBfY3JlYXRlQmxvY2soYm9keSksIF9jcmVhdGVWYXJpYWJsZUdldChyZXN1bHQpKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUVsZW1lbnQoRXhwcmVzc2lvbiBlbGVtZW50LCBEYXJ0VHlwZSBlbGVtZW50VHlwZSwgYm9vbCBpc1NldCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBpZiAoZWxlbWVudCBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgIF90cmFuc2xhdGVTcHJlYWRFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBJZkVsZW1lbnQpIHsKICAgICAgX3RyYW5zbGF0ZUlmRWxlbWVudChlbGVtZW50LCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9yRWxlbWVudCkgewogICAgICBfdHJhbnNsYXRlRm9yRWxlbWVudChlbGVtZW50LCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9ySW5FbGVtZW50KSB7CiAgICAgIF90cmFuc2xhdGVGb3JJbkVsZW1lbnQoZWxlbWVudCwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIHsKICAgICAgX2FkZEV4cHJlc3Npb25FbGVtZW50KAogICAgICAgICAgZWxlbWVudC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLCBpc1NldCwgcmVzdWx0LCBib2R5KTsKICAgIH0KICB9CgogIHZvaWQgX2FkZEV4cHJlc3Npb25FbGVtZW50KEV4cHJlc3Npb24gZWxlbWVudCwgYm9vbCBpc1NldCwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBib2R5LmFkZChfY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudCgKICAgICAgICBfY3JlYXRlQWRkKF9jcmVhdGVWYXJpYWJsZUdldChyZXN1bHQpLCBlbGVtZW50LCBpc1NldCkpKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUlmRWxlbWVudChJZkVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsIGJvb2wgaXNTZXQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHRoZW5TdGF0ZW1lbnRzID0gW107CiAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50LnRoZW4sIGVsZW1lbnRUeXBlLCBpc1NldCwgcmVzdWx0LCB0aGVuU3RhdGVtZW50cyk7CiAgICBMaXN0PFN0YXRlbWVudD4gZWxzZVN0YXRlbWVudHM7CiAgICBpZiAoZWxlbWVudC5vdGhlcndpc2UgIT0gbnVsbCkgewogICAgICBfdHJhbnNsYXRlRWxlbWVudChlbGVtZW50Lm90aGVyd2lzZSwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsCiAgICAgICAgICBlbHNlU3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W10pOwogICAgfQogICAgU3RhdGVtZW50IHRoZW5Cb2R5ID0gdGhlblN0YXRlbWVudHMubGVuZ3RoID09IDEKICAgICAgICA/IHRoZW5TdGF0ZW1lbnRzLmZpcnN0CiAgICAgICAgOiBfY3JlYXRlQmxvY2sodGhlblN0YXRlbWVudHMpOwogICAgU3RhdGVtZW50IGVsc2VCb2R5OwogICAgaWYgKGVsc2VTdGF0ZW1lbnRzICE9IG51bGwgJiYgZWxzZVN0YXRlbWVudHMuaXNOb3RFbXB0eSkgewogICAgICBlbHNlQm9keSA9IGVsc2VTdGF0ZW1lbnRzLmxlbmd0aCA9PSAxCiAgICAgICAgICA/IGVsc2VTdGF0ZW1lbnRzLmZpcnN0CiAgICAgICAgICA6IF9jcmVhdGVCbG9jayhlbHNlU3RhdGVtZW50cyk7CiAgICB9CiAgICBib2R5LmFkZChfY3JlYXRlSWYoZWxlbWVudC5maWxlT2Zmc2V0LAogICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odGhpcyksIHRoZW5Cb2R5LCBlbHNlQm9keSkpOwogIH0KCiAgdm9pZCBfdHJhbnNsYXRlRm9yRWxlbWVudChGb3JFbGVtZW50IGVsZW1lbnQsIERhcnRUeXBlIGVsZW1lbnRUeXBlLAogICAgICBib29sIGlzU2V0LCBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgIF90cmFuc2xhdGVFbGVtZW50KGVsZW1lbnQuYm9keSwgZWxlbWVudFR5cGUsIGlzU2V0LCByZXN1bHQsIHN0YXRlbWVudHMpOwogICAgU3RhdGVtZW50IGxvb3BCb2R5ID0KICAgICAgICBzdGF0ZW1lbnRzLmxlbmd0aCA9PSAxID8gc3RhdGVtZW50cy5maXJzdCA6IF9jcmVhdGVCbG9jayhzdGF0ZW1lbnRzKTsKICAgIEZvclN0YXRlbWVudCBsb29wID0gX2NyZWF0ZUZvclN0YXRlbWVudCgKICAgICAgICBlbGVtZW50LmZpbGVPZmZzZXQsCiAgICAgICAgZWxlbWVudC52YXJpYWJsZXMsCiAgICAgICAgZWxlbWVudC5jb25kaXRpb24/LmFjY2VwdDxUcmVlTm9kZT4odGhpcyksCiAgICAgICAgZWxlbWVudC51cGRhdGVzLAogICAgICAgIGxvb3BCb2R5KTsKICAgIHRyYW5zZm9ybUxpc3QobG9vcC52YXJpYWJsZXMsIHRoaXMsIGxvb3ApOwogICAgdHJhbnNmb3JtTGlzdChsb29wLnVwZGF0ZXMsIHRoaXMsIGxvb3ApOwogICAgZGF0YUZvclRlc3Rpbmc/LnJlZ2lzdGVyQWxpYXMoZWxlbWVudCwgbG9vcCk7CiAgICBib2R5LmFkZChsb29wKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckluRWxlbWVudChGb3JJbkVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIGJvb2wgaXNTZXQsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CiAgICBTdGF0ZW1lbnQgcHJvbG9ndWUgPSBlbGVtZW50LnByb2xvZ3VlOwogICAgaWYgKHByb2xvZ3VlID09IG51bGwpIHsKICAgICAgc3RhdGVtZW50cyA9IDxTdGF0ZW1lbnQ+W107CiAgICB9IGVsc2UgewogICAgICBwcm9sb2d1ZSA9IHByb2xvZ3VlLmFjY2VwdDxUcmVlTm9kZT4odGhpcyk7CiAgICAgIHN0YXRlbWVudHMgPQogICAgICAgICAgcHJvbG9ndWUgaXMgQmxvY2sgPyBwcm9sb2d1ZS5zdGF0ZW1lbnRzIDogPFN0YXRlbWVudD5bcHJvbG9ndWVdOwogICAgfQogICAgX3RyYW5zbGF0ZUVsZW1lbnQoZWxlbWVudC5ib2R5LCBlbGVtZW50VHlwZSwgaXNTZXQsIHJlc3VsdCwgc3RhdGVtZW50cyk7CiAgICBTdGF0ZW1lbnQgbG9vcEJvZHkgPQogICAgICAgIHN0YXRlbWVudHMubGVuZ3RoID09IDEgPyBzdGF0ZW1lbnRzLmZpcnN0IDogX2NyZWF0ZUJsb2NrKHN0YXRlbWVudHMpOwogICAgaWYgKGVsZW1lbnQucHJvYmxlbSAhPSBudWxsKSB7CiAgICAgIGJvZHkuYWRkKAogICAgICAgICAgX2NyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoZWxlbWVudC5wcm9ibGVtLmFjY2VwdDxUcmVlTm9kZT4odGhpcykpKTsKICAgIH0KICAgIEZvckluU3RhdGVtZW50IGxvb3AgPSBfY3JlYXRlRm9ySW5TdGF0ZW1lbnQoZWxlbWVudC5maWxlT2Zmc2V0LAogICAgICAgIGVsZW1lbnQudmFyaWFibGUsIGVsZW1lbnQuaXRlcmFibGUuYWNjZXB0PFRyZWVOb2RlPih0aGlzKSwgbG9vcEJvZHksCiAgICAgICAgaXNBc3luYzogZWxlbWVudC5pc0FzeW5jKTsKICAgIGRhdGFGb3JUZXN0aW5nPy5yZWdpc3RlckFsaWFzKGVsZW1lbnQsIGxvb3ApOwogICAgYm9keS5hZGQobG9vcCk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVTcHJlYWRFbGVtZW50KFNwcmVhZEVsZW1lbnQgZWxlbWVudCwgRGFydFR5cGUgZWxlbWVudFR5cGUsCiAgICAgIGJvb2wgaXNTZXQsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGVsZW1lbnQuZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgLy8gTnVsbC1hd2FyZSBzcHJlYWRzIHJlcXVpcmUgdGVzdGluZyB0aGUgc3ViZXhwcmVzc2lvbidzIHZhbHVlLgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wOwogICAgaWYgKGVsZW1lbnQuaXNOdWxsQXdhcmUpIHsKICAgICAgdGVtcCA9IF9jcmVhdGVWYXJpYWJsZSh2YWx1ZSwKICAgICAgICAgIHR5cGVFbnZpcm9ubWVudC5pdGVyYWJsZVR5cGUoZWxlbWVudFR5cGUsIF9jdXJyZW50TGlicmFyeS5udWxsYWJsZSkpOwogICAgICBib2R5LmFkZCh0ZW1wKTsKICAgICAgdmFsdWUgPSBfY3JlYXRlTnVsbENoZWNrZWRWYXJpYWJsZUdldCh0ZW1wKTsKICAgIH0KCiAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlOwogICAgU3RhdGVtZW50IGxvb3BCb2R5OwogICAgaWYgKGVsZW1lbnQuZWxlbWVudFR5cGUgPT0gbnVsbCB8fAogICAgICAgICF0eXBlRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoZWxlbWVudC5lbGVtZW50VHlwZSwgZWxlbWVudFR5cGUsCiAgICAgICAgICAgIFN1YnR5cGVDaGVja01vZGUuaWdub3JpbmdOdWxsYWJpbGl0aWVzKSkgewogICAgICB2YXJpYWJsZSA9IF9jcmVhdGVGb3JJblZhcmlhYmxlKGVsZW1lbnQuZmlsZU9mZnNldCwgY29uc3QgRHluYW1pY1R5cGUoKSk7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gY2FzdGVkVmFyID0gX2NyZWF0ZVZhcmlhYmxlKAogICAgICAgICAgX2NyZWF0ZUltcGxpY2l0QXMoZWxlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgX2NyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlKSwgZWxlbWVudFR5cGUpLAogICAgICAgICAgZWxlbWVudFR5cGUpOwogICAgICBsb29wQm9keSA9IF9jcmVhdGVCbG9jayg8U3RhdGVtZW50PlsKICAgICAgICBjYXN0ZWRWYXIsCiAgICAgICAgX2NyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoX2NyZWF0ZUFkZCgKICAgICAgICAgICAgX2NyZWF0ZVZhcmlhYmxlR2V0KHJlc3VsdCksIF9jcmVhdGVWYXJpYWJsZUdldChjYXN0ZWRWYXIpLCBpc1NldCkpCiAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgdmFyaWFibGUgPSBfY3JlYXRlRm9ySW5WYXJpYWJsZShlbGVtZW50LmZpbGVPZmZzZXQsIGVsZW1lbnRUeXBlKTsKICAgICAgbG9vcEJvZHkgPSBfY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChfY3JlYXRlQWRkKAogICAgICAgICAgX2NyZWF0ZVZhcmlhYmxlR2V0KHJlc3VsdCksIF9jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSksIGlzU2V0KSk7CiAgICB9CiAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0KICAgICAgICBfY3JlYXRlRm9ySW5TdGF0ZW1lbnQoZWxlbWVudC5maWxlT2Zmc2V0LCB2YXJpYWJsZSwgdmFsdWUsIGxvb3BCb2R5KTsKCiAgICBpZiAoZWxlbWVudC5pc051bGxBd2FyZSkgewogICAgICBzdGF0ZW1lbnQgPSBfY3JlYXRlSWYoCiAgICAgICAgICB0ZW1wLmZpbGVPZmZzZXQsCiAgICAgICAgICBfY3JlYXRlRXF1YWxzTnVsbChfY3JlYXRlVmFyaWFibGVHZXQodGVtcCksIG5vdEVxdWFsczogdHJ1ZSksCiAgICAgICAgICBzdGF0ZW1lbnQpOwogICAgfQogICAgYm9keS5hZGQoc3RhdGVtZW50KTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gX3RyYW5zbGF0ZUNvbnN0TGlzdE9yU2V0KG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCBub2RlLmV4cHJlc3Npb25zLAogICAgICAgICAgaXNTZXQ6IGZhbHNlKTsKICAgIH0KCiAgICByZXR1cm4gX3RyYW5zbGF0ZUxpc3RPclNldChub2RlLCBub2RlLnR5cGVBcmd1bWVudCwgbm9kZS5leHByZXNzaW9ucywKICAgICAgICBpc1NldDogZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgVHJlZU5vZGUgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgewogICAgICByZXR1cm4gX3RyYW5zbGF0ZUNvbnN0TGlzdE9yU2V0KG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCBub2RlLmV4cHJlc3Npb25zLAogICAgICAgICAgaXNTZXQ6IHRydWUpOwogICAgfQoKICAgIHJldHVybiBfdHJhbnNsYXRlTGlzdE9yU2V0KG5vZGUsIG5vZGUudHlwZUFyZ3VtZW50LCBub2RlLmV4cHJlc3Npb25zLAogICAgICAgIGlzU2V0OiB0cnVlKTsKICB9CgogIEBvdmVycmlkZQogIFRyZWVOb2RlIHZpc2l0TWFwTGl0ZXJhbChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIGlmIChub2RlLmlzQ29uc3QpIHsKICAgICAgcmV0dXJuIF90cmFuc2xhdGVDb25zdE1hcChub2RlKTsKICAgIH0KCiAgICAvLyBUcmFuc2xhdGUgZW50cmllcyBpbiBwbGFjZSB1cCB0byB0aGUgZmlyc3QgY29udHJvbC1mbG93IGVudHJ5LCBpZiBhbnkuCiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKDsgaSA8IG5vZGUuZW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICBpZiAobm9kZS5lbnRyaWVzW2ldIGlzIENvbnRyb2xGbG93TWFwRW50cnkpIGJyZWFrOwogICAgICBub2RlLmVudHJpZXNbaV0gPSBub2RlLmVudHJpZXNbaV0uYWNjZXB0PFRyZWVOb2RlPih0aGlzKS4ucGFyZW50ID0gbm9kZTsKICAgIH0KCiAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIGNvbnRyb2wtZmxvdyBlbnRyaWVzIHdlIGFyZSBkb25lLgogICAgaWYgKGkgPT0gbm9kZS5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuIG5vZGU7CgogICAgLy8gQnVpbGQgYSBibG9jayBleHByZXNzaW9uIGFuZCBjcmVhdGUgYW4gZW1wdHkgbWFwLgogICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQgPSBfY3JlYXRlVmFyaWFibGUoCiAgICAgICAgX2NyZWF0ZU1hcExpdGVyYWwobm9kZS5maWxlT2Zmc2V0LCBub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlLCBbXSksCiAgICAgICAgdHlwZUVudmlyb25tZW50Lm1hcFR5cGUoCiAgICAgICAgICAgIG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUsIF9jdXJyZW50TGlicmFyeS5ub25OdWxsYWJsZSkpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkgPSBbcmVzdWx0XTsKICAgIC8vIEFkZCBhbGwgdGhlIGVudHJpZXMgdXAgdG8gdGhlIGZpcnN0IGNvbnRyb2wtZmxvdyBlbnRyeS4KICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CiAgICAgIF9hZGROb3JtYWxFbnRyeShub2RlLmVudHJpZXNbal0sIHJlc3VsdCwgYm9keSk7CiAgICB9CiAgICBmb3IgKDsgaSA8IG5vZGUuZW50cmllcy5sZW5ndGg7ICsraSkgewogICAgICBfdHJhbnNsYXRlRW50cnkoCiAgICAgICAgICBub2RlLmVudHJpZXNbaV0sIG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUsIHJlc3VsdCwgYm9keSk7CiAgICB9CgogICAgcmV0dXJuIF9jcmVhdGVCbG9ja0V4cHJlc3Npb24oCiAgICAgICAgbm9kZS5maWxlT2Zmc2V0LCBfY3JlYXRlQmxvY2soYm9keSksIF9jcmVhdGVWYXJpYWJsZUdldChyZXN1bHQpKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUVudHJ5KE1hcEVudHJ5IGVudHJ5LCBEYXJ0VHlwZSBrZXlUeXBlLCBEYXJ0VHlwZSB2YWx1ZVR5cGUsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgaWYgKGVudHJ5IGlzIFNwcmVhZE1hcEVudHJ5KSB7CiAgICAgIF90cmFuc2xhdGVTcHJlYWRFbnRyeShlbnRyeSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICAgIF90cmFuc2xhdGVJZkVudHJ5KGVudHJ5LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgaWYgKGVudHJ5IGlzIEZvck1hcEVudHJ5KSB7CiAgICAgIF90cmFuc2xhdGVGb3JFbnRyeShlbnRyeSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIGJvZHkpOwogICAgfSBlbHNlIGlmIChlbnRyeSBpcyBGb3JJbk1hcEVudHJ5KSB7CiAgICAgIF90cmFuc2xhdGVGb3JJbkVudHJ5KGVudHJ5LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHJlc3VsdCwgYm9keSk7CiAgICB9IGVsc2UgewogICAgICBfYWRkTm9ybWFsRW50cnkoZW50cnkuYWNjZXB0PFRyZWVOb2RlPih0aGlzKSwgcmVzdWx0LCBib2R5KTsKICAgIH0KICB9CgogIHZvaWQgX2FkZE5vcm1hbEVudHJ5KAogICAgICBNYXBFbnRyeSBlbnRyeSwgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBib2R5LmFkZChfY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChfY3JlYXRlSW5kZXhTZXQoCiAgICAgICAgZW50cnkuZmlsZU9mZnNldCwgX2NyZWF0ZVZhcmlhYmxlR2V0KHJlc3VsdCksIGVudHJ5LmtleSwgZW50cnkudmFsdWUpKSk7CiAgfQoKICB2b2lkIF90cmFuc2xhdGVJZkVudHJ5KElmTWFwRW50cnkgZW50cnksIERhcnRUeXBlIGtleVR5cGUsIERhcnRUeXBlIHZhbHVlVHlwZSwKICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQsIExpc3Q8U3RhdGVtZW50PiBib2R5KSB7CiAgICBMaXN0PFN0YXRlbWVudD4gdGhlbkJvZHkgPSBbXTsKICAgIF90cmFuc2xhdGVFbnRyeShlbnRyeS50aGVuLCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHJlc3VsdCwgdGhlbkJvZHkpOwogICAgTGlzdDxTdGF0ZW1lbnQ+IGVsc2VCb2R5OwogICAgaWYgKGVudHJ5Lm90aGVyd2lzZSAhPSBudWxsKSB7CiAgICAgIF90cmFuc2xhdGVFbnRyeShlbnRyeS5vdGhlcndpc2UsIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LAogICAgICAgICAgZWxzZUJvZHkgPSA8U3RhdGVtZW50PltdKTsKICAgIH0KICAgIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50ID0KICAgICAgICB0aGVuQm9keS5sZW5ndGggPT0gMSA/IHRoZW5Cb2R5LmZpcnN0IDogX2NyZWF0ZUJsb2NrKHRoZW5Cb2R5KTsKICAgIFN0YXRlbWVudCBlbHNlU3RhdGVtZW50OwogICAgaWYgKGVsc2VCb2R5ICE9IG51bGwgJiYgZWxzZUJvZHkuaXNOb3RFbXB0eSkgewogICAgICBlbHNlU3RhdGVtZW50ID0KICAgICAgICAgIGVsc2VCb2R5Lmxlbmd0aCA9PSAxID8gZWxzZUJvZHkuZmlyc3QgOiBfY3JlYXRlQmxvY2soZWxzZUJvZHkpOwogICAgfQogICAgYm9keS5hZGQoX2NyZWF0ZUlmKGVudHJ5LmZpbGVPZmZzZXQsIGVudHJ5LmNvbmRpdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLAogICAgICAgIHRoZW5TdGF0ZW1lbnQsIGVsc2VTdGF0ZW1lbnQpKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckVudHJ5KEZvck1hcEVudHJ5IGVudHJ5LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMgPSA8U3RhdGVtZW50PltdOwogICAgX3RyYW5zbGF0ZUVudHJ5KGVudHJ5LmJvZHksIGtleVR5cGUsIHZhbHVlVHlwZSwgcmVzdWx0LCBzdGF0ZW1lbnRzKTsKICAgIFN0YXRlbWVudCBsb29wQm9keSA9CiAgICAgICAgc3RhdGVtZW50cy5sZW5ndGggPT0gMSA/IHN0YXRlbWVudHMuZmlyc3QgOiBfY3JlYXRlQmxvY2soc3RhdGVtZW50cyk7CiAgICBGb3JTdGF0ZW1lbnQgbG9vcCA9IF9jcmVhdGVGb3JTdGF0ZW1lbnQoZW50cnkuZmlsZU9mZnNldCwgZW50cnkudmFyaWFibGVzLAogICAgICAgIGVudHJ5LmNvbmRpdGlvbj8uYWNjZXB0PFRyZWVOb2RlPih0aGlzKSwgZW50cnkudXBkYXRlcywgbG9vcEJvZHkpOwogICAgZGF0YUZvclRlc3Rpbmc/LnJlZ2lzdGVyQWxpYXMoZW50cnksIGxvb3ApOwogICAgdHJhbnNmb3JtTGlzdChsb29wLnZhcmlhYmxlcywgdGhpcywgbG9vcCk7CiAgICB0cmFuc2Zvcm1MaXN0KGxvb3AudXBkYXRlcywgdGhpcywgbG9vcCk7CiAgICBib2R5LmFkZChsb29wKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZUZvckluRW50cnkoRm9ySW5NYXBFbnRyeSBlbnRyeSwgRGFydFR5cGUga2V5VHlwZSwKICAgICAgRGFydFR5cGUgdmFsdWVUeXBlLCBWYXJpYWJsZURlY2xhcmF0aW9uIHJlc3VsdCwgTGlzdDxTdGF0ZW1lbnQ+IGJvZHkpIHsKICAgIExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzOwogICAgU3RhdGVtZW50IHByb2xvZ3VlID0gZW50cnkucHJvbG9ndWU7CiAgICBpZiAocHJvbG9ndWUgPT0gbnVsbCkgewogICAgICBzdGF0ZW1lbnRzID0gPFN0YXRlbWVudD5bXTsKICAgIH0gZWxzZSB7CiAgICAgIHByb2xvZ3VlID0gcHJvbG9ndWUuYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKICAgICAgc3RhdGVtZW50cyA9CiAgICAgICAgICBwcm9sb2d1ZSBpcyBCbG9jayA/IHByb2xvZ3VlLnN0YXRlbWVudHMgOiA8U3RhdGVtZW50Pltwcm9sb2d1ZV07CiAgICB9CiAgICBfdHJhbnNsYXRlRW50cnkoZW50cnkuYm9keSwga2V5VHlwZSwgdmFsdWVUeXBlLCByZXN1bHQsIHN0YXRlbWVudHMpOwogICAgU3RhdGVtZW50IGxvb3BCb2R5ID0KICAgICAgICBzdGF0ZW1lbnRzLmxlbmd0aCA9PSAxID8gc3RhdGVtZW50cy5maXJzdCA6IF9jcmVhdGVCbG9jayhzdGF0ZW1lbnRzKTsKICAgIGlmIChlbnRyeS5wcm9ibGVtICE9IG51bGwpIHsKICAgICAgYm9keS5hZGQoCiAgICAgICAgICBfY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChlbnRyeS5wcm9ibGVtLmFjY2VwdDxUcmVlTm9kZT4odGhpcykpKTsKICAgIH0KICAgIEZvckluU3RhdGVtZW50IGxvb3AgPSBfY3JlYXRlRm9ySW5TdGF0ZW1lbnQoZW50cnkuZmlsZU9mZnNldCwKICAgICAgICBlbnRyeS52YXJpYWJsZSwgZW50cnkuaXRlcmFibGUuYWNjZXB0PFRyZWVOb2RlPih0aGlzKSwgbG9vcEJvZHksCiAgICAgICAgaXNBc3luYzogZW50cnkuaXNBc3luYyk7CiAgICBkYXRhRm9yVGVzdGluZz8ucmVnaXN0ZXJBbGlhcyhlbnRyeSwgbG9vcCk7CiAgICBib2R5LmFkZChsb29wKTsKICB9CgogIHZvaWQgX3RyYW5zbGF0ZVNwcmVhZEVudHJ5KFNwcmVhZE1hcEVudHJ5IGVudHJ5LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0LCBMaXN0PFN0YXRlbWVudD4gYm9keSkgewogICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGVudHJ5LmV4cHJlc3Npb24uYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKICAgIC8vIE51bGwtYXdhcmUgc3ByZWFkcyByZXF1aXJlIHRlc3RpbmcgdGhlIHN1YmV4cHJlc3Npb24ncyB2YWx1ZS4KICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdGVtcDsKICAgIGlmIChlbnRyeS5pc051bGxBd2FyZSkgewogICAgICB0ZW1wID0gX2NyZWF0ZVZhcmlhYmxlKAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICB0eXBlRW52aXJvbm1lbnQubWFwVHlwZSgKICAgICAgICAgICAgICBrZXlUeXBlLCB2YWx1ZVR5cGUsIF9jdXJyZW50TGlicmFyeS5udWxsYWJsZSkpOwogICAgICBib2R5LmFkZCh0ZW1wKTsKICAgICAgdmFsdWUgPSBfY3JlYXRlTnVsbENoZWNrZWRWYXJpYWJsZUdldCh0ZW1wKTsKICAgIH0KCiAgICBEYXJ0VHlwZSBlbnRyeVR5cGUgPSBuZXcgSW50ZXJmYWNlVHlwZShtYXBFbnRyeUNsYXNzLAogICAgICAgIF9jdXJyZW50TGlicmFyeS5ub25OdWxsYWJsZSwgPERhcnRUeXBlPltrZXlUeXBlLCB2YWx1ZVR5cGVdKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGU7CiAgICBTdGF0ZW1lbnQgbG9vcEJvZHk7CiAgICBpZiAoZW50cnkuZW50cnlUeXBlID09IG51bGwgfHwKICAgICAgICAhdHlwZUVudmlyb25tZW50LmlzU3VidHlwZU9mKGVudHJ5LmVudHJ5VHlwZSwgZW50cnlUeXBlLAogICAgICAgICAgICBTdWJ0eXBlQ2hlY2tNb2RlLmlnbm9yaW5nTnVsbGFiaWxpdGllcykpIHsKICAgICAgdmFyaWFibGUgPSBfY3JlYXRlRm9ySW5WYXJpYWJsZSgKICAgICAgICAgIGVudHJ5LmZpbGVPZmZzZXQsCiAgICAgICAgICBuZXcgSW50ZXJmYWNlVHlwZShtYXBFbnRyeUNsYXNzLCBfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUsCiAgICAgICAgICAgICAgPERhcnRUeXBlPltjb25zdCBEeW5hbWljVHlwZSgpLCBjb25zdCBEeW5hbWljVHlwZSgpXSkpOwogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGtleVZhciA9IF9jcmVhdGVWYXJpYWJsZSgKICAgICAgICAgIF9jcmVhdGVJbXBsaWNpdEFzKAogICAgICAgICAgICAgIGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgICAgICBfY3JlYXRlR2V0S2V5KAogICAgICAgICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsIF9jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSkpLAogICAgICAgICAgICAgIGtleVR5cGUpLAogICAgICAgICAga2V5VHlwZSk7CiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFsdWVWYXIgPSBfY3JlYXRlVmFyaWFibGUoCiAgICAgICAgICBfY3JlYXRlSW1wbGljaXRBcygKICAgICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgICAgX2NyZWF0ZUdldFZhbHVlKAogICAgICAgICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsIF9jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSkpLAogICAgICAgICAgICAgIHZhbHVlVHlwZSksCiAgICAgICAgICB2YWx1ZVR5cGUpOwogICAgICBsb29wQm9keSA9IF9jcmVhdGVCbG9jayg8U3RhdGVtZW50PlsKICAgICAgICBrZXlWYXIsCiAgICAgICAgdmFsdWVWYXIsCiAgICAgICAgX2NyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoX2NyZWF0ZUluZGV4U2V0KAogICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsCiAgICAgICAgICAgIF9jcmVhdGVWYXJpYWJsZUdldChyZXN1bHQpLAogICAgICAgICAgICBfY3JlYXRlVmFyaWFibGVHZXQoa2V5VmFyKSwKICAgICAgICAgICAgX2NyZWF0ZVZhcmlhYmxlR2V0KHZhbHVlVmFyKSkpCiAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgdmFyaWFibGUgPSBfY3JlYXRlRm9ySW5WYXJpYWJsZShlbnRyeS5maWxlT2Zmc2V0LCBlbnRyeVR5cGUpOwogICAgICBsb29wQm9keSA9IF9jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KF9jcmVhdGVJbmRleFNldCgKICAgICAgICAgIGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKICAgICAgICAgIF9jcmVhdGVWYXJpYWJsZUdldChyZXN1bHQpLAogICAgICAgICAgX2NyZWF0ZUdldEtleSgKICAgICAgICAgICAgICBlbnRyeS5leHByZXNzaW9uLmZpbGVPZmZzZXQsIF9jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSkpLAogICAgICAgICAgX2NyZWF0ZUdldFZhbHVlKAogICAgICAgICAgICAgIGVudHJ5LmV4cHJlc3Npb24uZmlsZU9mZnNldCwgX2NyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlKSkpKTsKICAgIH0KICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBfY3JlYXRlRm9ySW5TdGF0ZW1lbnQoZW50cnkuZmlsZU9mZnNldCwgdmFyaWFibGUsCiAgICAgICAgX2NyZWF0ZUdldEVudHJpZXMoZW50cnkuZmlsZU9mZnNldCwgdmFsdWUpLCBsb29wQm9keSk7CgogICAgaWYgKGVudHJ5LmlzTnVsbEF3YXJlKSB7CiAgICAgIHN0YXRlbWVudCA9IF9jcmVhdGVJZigKICAgICAgICAgIHRlbXAuZmlsZU9mZnNldCwKICAgICAgICAgIF9jcmVhdGVFcXVhbHNOdWxsKF9jcmVhdGVWYXJpYWJsZUdldCh0ZW1wKSwgbm90RXF1YWxzOiB0cnVlKSwKICAgICAgICAgIHN0YXRlbWVudCk7CiAgICB9CiAgICBib2R5LmFkZChzdGF0ZW1lbnQpOwogIH0KCiAgVHJlZU5vZGUgX3RyYW5zbGF0ZUNvbnN0TGlzdE9yU2V0KAogICAgICBFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzLAogICAgICB7Ym9vbCBpc1NldDogZmFsc2V9KSB7CiAgICAvLyBUcmFuc2xhdGUgZWxlbWVudHMgaW4gcGxhY2UgdXAgdG8gdGhlIGZpcnN0IG5vbi1leHByZXNzaW9uLCBpZiBhbnkuCiAgICBpbnQgaSA9IDA7CiAgICBmb3IgKDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChlbGVtZW50c1tpXSBpcyBDb250cm9sRmxvd0VsZW1lbnQpIGJyZWFrOwogICAgICBlbGVtZW50c1tpXSA9IGVsZW1lbnRzW2ldLmFjY2VwdDxUcmVlTm9kZT4odGhpcykuLnBhcmVudCA9IG5vZGU7CiAgICB9CgogICAgLy8gSWYgdGhlcmUgd2VyZSBvbmx5IGV4cHJlc3Npb25zLCB3ZSBhcmUgZG9uZS4KICAgIGlmIChpID09IGVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGU7CgogICAgRXhwcmVzc2lvbiBtYWtlTGl0ZXJhbChpbnQgZmlsZU9mZnNldCwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucykgewogICAgICBpZiAoaXNTZXQpIHsKICAgICAgICByZXR1cm4gX2NyZWF0ZVNldExpdGVyYWwoZmlsZU9mZnNldCwgZWxlbWVudFR5cGUsIGV4cHJlc3Npb25zLAogICAgICAgICAgICBpc0NvbnN0OiB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gX2NyZWF0ZUxpc3RMaXRlcmFsKGZpbGVPZmZzZXQsIGVsZW1lbnRUeXBlLCBleHByZXNzaW9ucywKICAgICAgICAgICAgaXNDb25zdDogdHJ1ZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBCdWlsZCBhIGNvbmNhdGVuYXRpb24gbm9kZS4KICAgIExpc3Q8RXhwcmVzc2lvbj4gcGFydHMgPSBbXTsKICAgIExpc3Q8RXhwcmVzc2lvbj4gY3VycmVudFBhcnQgPSBpID4gMCA/IGVsZW1lbnRzLnN1Ymxpc3QoMCwgaSkgOiBudWxsOwoKICAgIERhcnRUeXBlIGl0ZXJhYmxlVHlwZSA9CiAgICAgICAgdHlwZUVudmlyb25tZW50Lml0ZXJhYmxlVHlwZShlbGVtZW50VHlwZSwgX2N1cnJlbnRMaWJyYXJ5Lm5vbk51bGxhYmxlKTsKCiAgICBmb3IgKDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIEV4cHJlc3Npb24gZWxlbWVudCA9IGVsZW1lbnRzW2ldOwogICAgICBpZiAoZWxlbWVudCBpcyBTcHJlYWRFbGVtZW50KSB7CiAgICAgICAgaWYgKGN1cnJlbnRQYXJ0ICE9IG51bGwpIHsKICAgICAgICAgIHBhcnRzLmFkZChtYWtlTGl0ZXJhbChub2RlLmZpbGVPZmZzZXQsIGN1cnJlbnRQYXJ0KSk7CiAgICAgICAgICBjdXJyZW50UGFydCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIEV4cHJlc3Npb24gc3ByZWFkRXhwcmVzc2lvbiA9IGVsZW1lbnQuZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICAgIGlmIChlbGVtZW50LmlzTnVsbEF3YXJlKSB7CiAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIHRlbXAgPSBfY3JlYXRlVmFyaWFibGUoCiAgICAgICAgICAgICAgc3ByZWFkRXhwcmVzc2lvbiwKICAgICAgICAgICAgICB0eXBlRW52aXJvbm1lbnQuaXRlcmFibGVUeXBlKAogICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSwgX2N1cnJlbnRMaWJyYXJ5Lm51bGxhYmxlKSk7CiAgICAgICAgICBwYXJ0cy5hZGQoX2NyZWF0ZU51bGxBd2FyZUd1YXJkKGVsZW1lbnQuZmlsZU9mZnNldCwgdGVtcCwKICAgICAgICAgICAgICBtYWtlTGl0ZXJhbChlbGVtZW50LmZpbGVPZmZzZXQsIFtdKSwgaXRlcmFibGVUeXBlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhcnRzLmFkZChzcHJlYWRFeHByZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpcyBJZkVsZW1lbnQpIHsKICAgICAgICBpZiAoY3VycmVudFBhcnQgIT0gbnVsbCkgewogICAgICAgICAgcGFydHMuYWRkKG1ha2VMaXRlcmFsKG5vZGUuZmlsZU9mZnNldCwgY3VycmVudFBhcnQpKTsKICAgICAgICAgIGN1cnJlbnRQYXJ0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBlbGVtZW50LmNvbmRpdGlvbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICAgIEV4cHJlc3Npb24gdGhlbiA9IG1ha2VMaXRlcmFsKGVsZW1lbnQudGhlbi5maWxlT2Zmc2V0LCBbZWxlbWVudC50aGVuXSkKICAgICAgICAgICAgLmFjY2VwdDxUcmVlTm9kZT4odGhpcyk7CiAgICAgICAgRXhwcmVzc2lvbiBvdGhlcndpc2UgPSBlbGVtZW50Lm90aGVyd2lzZSAhPSBudWxsCiAgICAgICAgICAgID8gbWFrZUxpdGVyYWwoZWxlbWVudC5vdGhlcndpc2UuZmlsZU9mZnNldCwgW2VsZW1lbnQub3RoZXJ3aXNlXSkKICAgICAgICAgICAgICAgIC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpCiAgICAgICAgICAgIDogbWFrZUxpdGVyYWwoZWxlbWVudC5maWxlT2Zmc2V0LCBbXSk7CiAgICAgICAgcGFydHMuYWRkKF9jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgICAgICAgIGVsZW1lbnQuZmlsZU9mZnNldCwgY29uZGl0aW9uLCB0aGVuLCBvdGhlcndpc2UsIGl0ZXJhYmxlVHlwZSkpOwogICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRm9yRWxlbWVudCB8fCBlbGVtZW50IGlzIEZvckluRWxlbWVudCkgewogICAgICAgIC8vIFJlamVjdGVkIGVhcmxpZXIuCiAgICAgICAgdW5oYW5kbGVkKCIke2VsZW1lbnQucnVudGltZVR5cGV9IiwgIl90cmFuc2xhdGVDb25zdExpc3RPclNldCIsCiAgICAgICAgICAgIGVsZW1lbnQuZmlsZU9mZnNldCwgZ2V0RmlsZVVyaShlbGVtZW50KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFBhcnQgPz89IDxFeHByZXNzaW9uPltdOwogICAgICAgIGN1cnJlbnRQYXJ0LmFkZChlbGVtZW50LmFjY2VwdDxUcmVlTm9kZT4odGhpcykpOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFBhcnQgIT0gbnVsbCkgewogICAgICBwYXJ0cy5hZGQobWFrZUxpdGVyYWwobm9kZS5maWxlT2Zmc2V0LCBjdXJyZW50UGFydCkpOwogICAgfQogICAgaWYgKGlzU2V0KSB7CiAgICAgIHJldHVybiBuZXcgU2V0Q29uY2F0ZW5hdGlvbihwYXJ0cywgdHlwZUFyZ3VtZW50OiBlbGVtZW50VHlwZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IExpc3RDb25jYXRlbmF0aW9uKHBhcnRzLCB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlKQogICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKICAgIH0KICB9CgogIFRyZWVOb2RlIF90cmFuc2xhdGVDb25zdE1hcChNYXBMaXRlcmFsIG5vZGUpIHsKICAgIC8vIFRyYW5zbGF0ZSBlbnRyaWVzIGluIHBsYWNlIHVwIHRvIHRoZSBmaXJzdCBjb250cm9sLWZsb3cgZW50cnksIGlmIGFueS4KICAgIGludCBpID0gMDsKICAgIGZvciAoOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChub2RlLmVudHJpZXNbaV0gaXMgQ29udHJvbEZsb3dNYXBFbnRyeSkgYnJlYWs7CiAgICAgIG5vZGUuZW50cmllc1tpXSA9IG5vZGUuZW50cmllc1tpXS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpLi5wYXJlbnQgPSBub2RlOwogICAgfQoKICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gY29udHJvbC1mbG93IGVudHJpZXMgd2UgYXJlIGRvbmUuCiAgICBpZiAoaSA9PSBub2RlLmVudHJpZXMubGVuZ3RoKSByZXR1cm4gbm9kZTsKCiAgICBNYXBMaXRlcmFsIG1ha2VMaXRlcmFsKGludCBmaWxlT2Zmc2V0LCBMaXN0PE1hcEVudHJ5PiBlbnRyaWVzKSB7CiAgICAgIHJldHVybiBfY3JlYXRlTWFwTGl0ZXJhbCgKICAgICAgICAgIGZpbGVPZmZzZXQsIG5vZGUua2V5VHlwZSwgbm9kZS52YWx1ZVR5cGUsIGVudHJpZXMsCiAgICAgICAgICBpc0NvbnN0OiB0cnVlKTsKICAgIH0KCiAgICAvLyBCdWlsZCBhIGNvbmNhdGVuYXRpb24gbm9kZS4KICAgIExpc3Q8RXhwcmVzc2lvbj4gcGFydHMgPSBbXTsKICAgIExpc3Q8TWFwRW50cnk+IGN1cnJlbnRQYXJ0ID0gaSA+IDAgPyBub2RlLmVudHJpZXMuc3VibGlzdCgwLCBpKSA6IG51bGw7CgogICAgRGFydFR5cGUgY29sbGVjdGlvblR5cGUgPSB0eXBlRW52aXJvbm1lbnQubWFwVHlwZSgKICAgICAgICBub2RlLmtleVR5cGUsIG5vZGUudmFsdWVUeXBlLCBfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUpOwoKICAgIGZvciAoOyBpIDwgbm9kZS5lbnRyaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgIE1hcEVudHJ5IGVudHJ5ID0gbm9kZS5lbnRyaWVzW2ldOwogICAgICBpZiAoZW50cnkgaXMgU3ByZWFkTWFwRW50cnkpIHsKICAgICAgICBpZiAoY3VycmVudFBhcnQgIT0gbnVsbCkgewogICAgICAgICAgcGFydHMuYWRkKG1ha2VMaXRlcmFsKG5vZGUuZmlsZU9mZnNldCwgY3VycmVudFBhcnQpKTsKICAgICAgICAgIGN1cnJlbnRQYXJ0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgRXhwcmVzc2lvbiBzcHJlYWRFeHByZXNzaW9uID0gZW50cnkuZXhwcmVzc2lvbi5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICAgIGlmIChlbnRyeS5pc051bGxBd2FyZSkgewogICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiB0ZW1wID0gX2NyZWF0ZVZhcmlhYmxlKHNwcmVhZEV4cHJlc3Npb24sCiAgICAgICAgICAgICAgY29sbGVjdGlvblR5cGUud2l0aE51bGxhYmlsaXR5KF9jdXJyZW50TGlicmFyeS5udWxsYWJsZSkpOwogICAgICAgICAgcGFydHMuYWRkKF9jcmVhdGVOdWxsQXdhcmVHdWFyZChlbnRyeS5maWxlT2Zmc2V0LCB0ZW1wLAogICAgICAgICAgICAgIG1ha2VMaXRlcmFsKGVudHJ5LmZpbGVPZmZzZXQsIFtdKSwgY29sbGVjdGlvblR5cGUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGFydHMuYWRkKHNwcmVhZEV4cHJlc3Npb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbnRyeSBpcyBJZk1hcEVudHJ5KSB7CiAgICAgICAgaWYgKGN1cnJlbnRQYXJ0ICE9IG51bGwpIHsKICAgICAgICAgIHBhcnRzLmFkZChtYWtlTGl0ZXJhbChub2RlLmZpbGVPZmZzZXQsIGN1cnJlbnRQYXJ0KSk7CiAgICAgICAgICBjdXJyZW50UGFydCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gZW50cnkuY29uZGl0aW9uLmFjY2VwdDxUcmVlTm9kZT4odGhpcyk7CiAgICAgICAgRXhwcmVzc2lvbiB0aGVuID0gbWFrZUxpdGVyYWwoZW50cnkudGhlbi5maWxlT2Zmc2V0LCBbZW50cnkudGhlbl0pCiAgICAgICAgICAgIC5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpOwogICAgICAgIEV4cHJlc3Npb24gb3RoZXJ3aXNlID0gZW50cnkub3RoZXJ3aXNlICE9IG51bGwKICAgICAgICAgICAgPyBtYWtlTGl0ZXJhbChlbnRyeS5vdGhlcndpc2UuZmlsZU9mZnNldCwgW2VudHJ5Lm90aGVyd2lzZV0pCiAgICAgICAgICAgICAgICAuYWNjZXB0PFRyZWVOb2RlPih0aGlzKQogICAgICAgICAgICA6IG1ha2VMaXRlcmFsKG5vZGUuZmlsZU9mZnNldCwgW10pOwogICAgICAgIHBhcnRzLmFkZChfY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKAogICAgICAgICAgICBlbnRyeS5maWxlT2Zmc2V0LCBjb25kaXRpb24sIHRoZW4sIG90aGVyd2lzZSwgY29sbGVjdGlvblR5cGUpKTsKICAgICAgfSBlbHNlIGlmIChlbnRyeSBpcyBGb3JNYXBFbnRyeSB8fCBlbnRyeSBpcyBGb3JJbk1hcEVudHJ5KSB7CiAgICAgICAgLy8gUmVqZWN0ZWQgZWFybGllci4KICAgICAgICB1bmhhbmRsZWQoIiR7ZW50cnkucnVudGltZVR5cGV9IiwgIl90cmFuc2xhdGVDb25zdE1hcCIsCiAgICAgICAgICAgIGVudHJ5LmZpbGVPZmZzZXQsIGdldEZpbGVVcmkoZW50cnkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UGFydCA/Pz0gPE1hcEVudHJ5PltdOwogICAgICAgIGN1cnJlbnRQYXJ0LmFkZChlbnRyeS5hY2NlcHQ8VHJlZU5vZGU+KHRoaXMpKTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRQYXJ0ICE9IG51bGwpIHsKICAgICAgcGFydHMuYWRkKG1ha2VMaXRlcmFsKG5vZGUuZmlsZU9mZnNldCwgY3VycmVudFBhcnQpKTsKICAgIH0KICAgIHJldHVybiBuZXcgTWFwQ29uY2F0ZW5hdGlvbihwYXJ0cywKICAgICAgICBrZXlUeXBlOiBub2RlLmtleVR5cGUsIHZhbHVlVHlwZTogbm9kZS52YWx1ZVR5cGUpOwogIH0KCiAgdm9pZCBlbnRlckxpYnJhcnkoTGlicmFyeSBsaWJyYXJ5KSB7CiAgICBhc3NlcnQoCiAgICAgICAgX2N1cnJlbnRMaWJyYXJ5ID09IG51bGwsCiAgICAgICAgIkF0dGVtcHRpbmcgdG8gZW50ZXIgbGlicmFyeSAnJHtsaWJyYXJ5LmZpbGVVcml9JyAiCiAgICAgICAgIndpdGhvdXQgaGF2aW5nIGV4aXRlZCBsaWJyYXJ5ICcke19jdXJyZW50TGlicmFyeS5maWxlVXJpfScuIik7CiAgICBfY3VycmVudExpYnJhcnkgPSBsaWJyYXJ5OwogIH0KCiAgdm9pZCBleGl0TGlicmFyeSgpIHsKICAgIGFzc2VydChfY3VycmVudExpYnJhcnkgIT0gbnVsbCwKICAgICAgICAiQXR0ZW1wdGluZyB0byBleGl0IGEgbGlicmFyeSB3aXRob3V0IGhhdmluZyBlbnRlcmVkIG9uZS4iKTsKICAgIF9jdXJyZW50TGlicmFyeSA9IG51bGw7CiAgfQoKICBWYXJpYWJsZURlY2xhcmF0aW9uIF9jcmVhdGVWYXJpYWJsZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIERhcnRUeXBlIHR5cGUpIHsKICAgIGFzc2VydChleHByZXNzaW9uICE9IG51bGwpOwogICAgYXNzZXJ0KGV4cHJlc3Npb24uZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoZXhwcmVzc2lvbiwgdHlwZTogdHlwZSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0OwogIH0KCiAgVmFyaWFibGVEZWNsYXJhdGlvbiBfY3JlYXRlRm9ySW5WYXJpYWJsZShpbnQgZmlsZU9mZnNldCwgRGFydFR5cGUgdHlwZSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKG51bGwsIHR5cGU6IHR5cGUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBWYXJpYWJsZUdldCBfY3JlYXRlVmFyaWFibGVHZXQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgYXNzZXJ0KHZhcmlhYmxlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhcmlhYmxlLmZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBWYXJpYWJsZUdldCh2YXJpYWJsZSkuLmZpbGVPZmZzZXQgPSB2YXJpYWJsZS5maWxlT2Zmc2V0OwogIH0KCiAgVmFyaWFibGVHZXQgX2NyZWF0ZU51bGxDaGVja2VkVmFyaWFibGVHZXQoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgewogICAgYXNzZXJ0KHZhcmlhYmxlICE9IG51bGwpOwogICAgYXNzZXJ0KHZhcmlhYmxlLmZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgRGFydFR5cGUgcHJvbW90ZWRUeXBlID0KICAgICAgICB2YXJpYWJsZS50eXBlLndpdGhOdWxsYWJpbGl0eShfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUpOwogICAgaWYgKHByb21vdGVkVHlwZSAhPSB2YXJpYWJsZS50eXBlKSB7CiAgICAgIHJldHVybiBuZXcgVmFyaWFibGVHZXQodmFyaWFibGUsIHByb21vdGVkVHlwZSkKICAgICAgICAuLmZpbGVPZmZzZXQgPSB2YXJpYWJsZS5maWxlT2Zmc2V0OwogICAgfQogICAgcmV0dXJuIF9jcmVhdGVWYXJpYWJsZUdldCh2YXJpYWJsZSk7CiAgfQoKICBNYXBMaXRlcmFsIF9jcmVhdGVNYXBMaXRlcmFsKGludCBmaWxlT2Zmc2V0LCBEYXJ0VHlwZSBrZXlUeXBlLAogICAgICBEYXJ0VHlwZSB2YWx1ZVR5cGUsIExpc3Q8TWFwRW50cnk+IGVudHJpZXMsCiAgICAgIHtib29sIGlzQ29uc3Q6IGZhbHNlfSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IE1hcExpdGVyYWwoZW50cmllcywKICAgICAgICBrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSwgaXNDb25zdDogaXNDb25zdCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIExpc3RMaXRlcmFsIF9jcmVhdGVMaXN0TGl0ZXJhbCgKICAgICAgaW50IGZpbGVPZmZzZXQsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzLAogICAgICB7Ym9vbCBpc0NvbnN0OiBmYWxzZX0pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBMaXN0TGl0ZXJhbChlbGVtZW50cywKICAgICAgICB0eXBlQXJndW1lbnQ6IGVsZW1lbnRUeXBlLCBpc0NvbnN0OiBpc0NvbnN0KQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgRXhwcmVzc2lvbiBfY3JlYXRlU2V0TGl0ZXJhbCgKICAgICAgaW50IGZpbGVPZmZzZXQsIERhcnRUeXBlIGVsZW1lbnRUeXBlLCBMaXN0PEV4cHJlc3Npb24+IGVsZW1lbnRzLAogICAgICB7Ym9vbCBpc0NvbnN0OiBmYWxzZX0pIHsKICAgIGlmIChpc0NvbnN0KSB7CiAgICAgIHJldHVybiBuZXcgU2V0TGl0ZXJhbChlbGVtZW50cywKICAgICAgICAgIHR5cGVBcmd1bWVudDogZWxlbWVudFR5cGUsIGlzQ29uc3Q6IGlzQ29uc3QpCiAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRPRE8oa21pbGxpa2luKTogV2hlbiBhbGwgdGhlIGJhY2sgZW5kcyBoYW5kbGUgc2V0IGxpdGVyYWxzIHdlIGNhbiB1c2UKICAgICAgLy8gb25lIGhlcmUuCiAgICAgIHJldHVybiBuZXcgU3RhdGljSW52b2NhdGlvbigKICAgICAgICAgIHNldEZhY3RvcnksCiAgICAgICAgICBuZXcgQXJndW1lbnRzKGVsZW1lbnRzLCB0eXBlczogW2VsZW1lbnRUeXBlXSkKICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldCkKICAgICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogICAgfQogIH0KCiAgRXhwcmVzc2lvblN0YXRlbWVudCBfY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgIGFzc2VydChleHByZXNzaW9uICE9IG51bGwpOwogICAgYXNzZXJ0KGV4cHJlc3Npb24uZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbikKICAgICAgLi5maWxlT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0OwogIH0KCiAgTWV0aG9kSW52b2NhdGlvbiBfY3JlYXRlQWRkKAogICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBFeHByZXNzaW9uIGFyZ3VtZW50LCBib29sIGlzU2V0KSB7CiAgICBhc3NlcnQocmVjZWl2ZXIgIT0gbnVsbCk7CiAgICBhc3NlcnQoYXJndW1lbnQgIT0gbnVsbCk7CiAgICBhc3NlcnQoYXJndW1lbnQuZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCwKICAgICAgICAiTm8gZmlsZU9mZnNldCBvbiAke2FyZ3VtZW50fS4iKTsKICAgIHJldHVybiBuZXcgTWV0aG9kSW52b2NhdGlvbihyZWNlaXZlciwgbmV3IE5hbWUoJ2FkZCcpLAogICAgICAgIG5ldyBBcmd1bWVudHMoW2FyZ3VtZW50XSksIGlzU2V0ID8gc2V0QWRkIDogbGlzdEFkZCkKICAgICAgLi5maWxlT2Zmc2V0ID0gYXJndW1lbnQuZmlsZU9mZnNldDsKICB9CgogIEV4cHJlc3Npb24gX2NyZWF0ZUVxdWFsc051bGwoRXhwcmVzc2lvbiBleHByZXNzaW9uLCB7Ym9vbCBub3RFcXVhbHM6IGZhbHNlfSkgewogICAgYXNzZXJ0KGV4cHJlc3Npb24gIT0gbnVsbCk7CiAgICBhc3NlcnQoZXhwcmVzc2lvbi5maWxlT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KTsKICAgIEV4cHJlc3Npb24gY2hlY2sgPSBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICBleHByZXNzaW9uLAogICAgICAgIG5ldyBOYW1lKCc9PScpLAogICAgICAgIG5ldyBBcmd1bWVudHMoW25ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gZXhwcmVzc2lvbi5maWxlT2Zmc2V0XSksCiAgICAgICAgb2JqZWN0RXF1YWxzKQogICAgICAuLmZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICBpZiAobm90RXF1YWxzKSB7CiAgICAgIGNoZWNrID0gbmV3IE5vdChjaGVjaykuLmZpbGVPZmZzZXQgPSBleHByZXNzaW9uLmZpbGVPZmZzZXQ7CiAgICB9CiAgICByZXR1cm4gY2hlY2s7CiAgfQoKICBNZXRob2RJbnZvY2F0aW9uIF9jcmVhdGVJbmRleFNldCgKICAgICAgaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gcmVjZWl2ZXIsIEV4cHJlc3Npb24ga2V5LCBFeHByZXNzaW9uIHZhbHVlKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KTsKICAgIHJldHVybiBuZXcgTWV0aG9kSW52b2NhdGlvbigKICAgICAgICByZWNlaXZlciwgbmV3IE5hbWUoJ1tdPScpLCBuZXcgQXJndW1lbnRzKFtrZXksIHZhbHVlXSksIG1hcFB1dCkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEFzRXhwcmVzc2lvbiBfY3JlYXRlSW1wbGljaXRBcygKICAgICAgaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IEFzRXhwcmVzc2lvbihleHByZXNzaW9uLCB0eXBlKQogICAgICAuLmlzVHlwZUVycm9yID0gdHJ1ZQogICAgICAuLmlzRm9yTm9uTnVsbGFibGVCeURlZmF1bHQgPSBfY3VycmVudExpYnJhcnkuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdAogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgSWZTdGF0ZW1lbnQgX2NyZWF0ZUlmKGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IHRoZW4sCiAgICAgIFtTdGF0ZW1lbnQgb3RoZXJ3aXNlXSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IElmU3RhdGVtZW50KGNvbmRpdGlvbiwgdGhlbiwgb3RoZXJ3aXNlKS4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBQcm9wZXJ0eUdldCBfY3JlYXRlR2V0S2V5KGludCBmaWxlT2Zmc2V0LCBFeHByZXNzaW9uIHJlY2VpdmVyKSB7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBudWxsKTsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IFRyZWVOb2RlLm5vT2Zmc2V0KTsKICAgIHJldHVybiBuZXcgUHJvcGVydHlHZXQocmVjZWl2ZXIsIG5ldyBOYW1lKCdrZXknKSwgbWFwRW50cnlLZXkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBQcm9wZXJ0eUdldCBfY3JlYXRlR2V0VmFsdWUoaW50IGZpbGVPZmZzZXQsIEV4cHJlc3Npb24gcmVjZWl2ZXIpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUdldChyZWNlaXZlciwgbmV3IE5hbWUoJ3ZhbHVlJyksIG1hcEVudHJ5VmFsdWUpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBQcm9wZXJ0eUdldCBfY3JlYXRlR2V0RW50cmllcyhpbnQgZmlsZU9mZnNldCwgRXhwcmVzc2lvbiByZWNlaXZlcikgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IFByb3BlcnR5R2V0KHJlY2VpdmVyLCBuZXcgTmFtZSgnZW50cmllcycpLCBtYXBFbnRyaWVzKQogICAgICAuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgRm9yU3RhdGVtZW50IF9jcmVhdGVGb3JTdGF0ZW1lbnQoCiAgICAgIGludCBmaWxlT2Zmc2V0LAogICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb24+IHZhcmlhYmxlcywKICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24sCiAgICAgIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlcywKICAgICAgU3RhdGVtZW50IGJvZHkpIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBGb3JTdGF0ZW1lbnQodmFyaWFibGVzLCBjb25kaXRpb24sIHVwZGF0ZXMsIGJvZHkpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBGb3JJblN0YXRlbWVudCBfY3JlYXRlRm9ySW5TdGF0ZW1lbnQoaW50IGZpbGVPZmZzZXQsCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUsIEV4cHJlc3Npb24gaXRlcmFibGUsIFN0YXRlbWVudCBib2R5LAogICAgICB7Ym9vbCBpc0FzeW5jOiBmYWxzZX0pIHsKICAgIGFzc2VydChmaWxlT2Zmc2V0ICE9IG51bGwpOwogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gVHJlZU5vZGUubm9PZmZzZXQpOwogICAgcmV0dXJuIG5ldyBGb3JJblN0YXRlbWVudCh2YXJpYWJsZSwgaXRlcmFibGUsIGJvZHksIGlzQXN5bmM6IGlzQXN5bmMpCiAgICAgIC4uZmlsZU9mZnNldCA9IGZpbGVPZmZzZXQ7CiAgfQoKICBMZXQgX2NyZWF0ZU51bGxBd2FyZUd1YXJkKGludCBmaWxlT2Zmc2V0LCBWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlLAogICAgICBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSwgRGFydFR5cGUgdHlwZSkgewogICAgcmV0dXJuIG5ldyBMZXQoCiAgICAgICAgdmFyaWFibGUsCiAgICAgICAgX2NyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbigKICAgICAgICAgICAgZmlsZU9mZnNldCwKICAgICAgICAgICAgX2NyZWF0ZUVxdWFsc051bGwoX2NyZWF0ZVZhcmlhYmxlR2V0KHZhcmlhYmxlKSksCiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSwKICAgICAgICAgICAgX2NyZWF0ZU51bGxDaGVja2VkVmFyaWFibGVHZXQodmFyaWFibGUpLAogICAgICAgICAgICB0eXBlKSkKICAgICAgLi5maWxlT2Zmc2V0ID0gZmlsZU9mZnNldDsKICB9CgogIEJsb2NrIF9jcmVhdGVCbG9jayhMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cykgewogICAgcmV0dXJuIG5ldyBCbG9jayhzdGF0ZW1lbnRzKTsKICB9CgogIEJsb2NrRXhwcmVzc2lvbiBfY3JlYXRlQmxvY2tFeHByZXNzaW9uKAogICAgICBpbnQgZmlsZU9mZnNldCwgQmxvY2sgYm9keSwgRXhwcmVzc2lvbiB2YWx1ZSkgewogICAgYXNzZXJ0KGZpbGVPZmZzZXQgIT0gbnVsbCk7CiAgICBhc3NlcnQoZmlsZU9mZnNldCAhPSBUcmVlTm9kZS5ub09mZnNldCk7CiAgICByZXR1cm4gbmV3IEJsb2NrRXhwcmVzc2lvbihib2R5LCB2YWx1ZSkuLmZpbGVPZmZzZXQgPSBmaWxlT2Zmc2V0OwogIH0KCiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uIF9jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oCiAgICAgIGludCBmaWxlT2Zmc2V0LAog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ICAgUHJvY2VkdXJlLAogICAgICAgIFNldExpdGVyYWwsCiAgICAgICAgU3RhdGljSW52b2NhdGlvbiwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uLAogICAgICAgIFZhcmlhYmxlR2V0OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC92aXNpdG9yLmRhcnQnIHNob3cgVHJhbnNmb3JtZXI7CgppbXBvcnQgJy4uL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnQnIHNob3cgU291cmNlTG9hZGVyOwoKaW1wb3J0ICdyZWRpcmVjdGluZ19mYWN0b3J5X2JvZHkuZGFydCcgc2hvdyBSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5OwoKLy8gVE9ETyhhc2tlc2MpOiBEZWxldGUgdGhpcyBjbGFzcyB3aGVuIGFsbCBiYWNrZW5kcyBzdXBwb3J0IHNldCBsaXRlcmFscy4KY2xhc3MgU2V0TGl0ZXJhbFRyYW5zZm9ybWVyIGV4dGVuZHMgVHJhbnNmb3JtZXIgewogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CiAgZmluYWwgUHJvY2VkdXJlIHNldEZhY3Rvcnk7CiAgZmluYWwgUHJvY2VkdXJlIGFkZE1ldGhvZDsKCiAgLy8vIExpYnJhcnkgdGhhdCBjb250YWlucyB0aGUgdHJhbnNmb3JtZWQgbm9kZXMuCiAgLy8vCiAgLy8vIFRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgbm9kZXMgaXMgYWZmZWN0ZWQgYnkgdGhlIE5OQkQgb3B0LWluIHN0YXR1cyBvZgogIC8vLyB0aGUgbGlicmFyeS4KICBMaWJyYXJ5IF9jdXJyZW50TGlicmFyeTsKCiAgc3RhdGljIFByb2NlZHVyZSBfZmluZFNldEZhY3RvcnkoQ29yZVR5cGVzIGNvcmVUeXBlcykgewogICAgUHJvY2VkdXJlIGZhY3RvcnkgPSBjb3JlVHlwZXMuaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnU2V0JywgJycpOwogICAgUmVkaXJlY3RpbmdGYWN0b3J5Qm9keSBib2R5ID0gZmFjdG9yeT8uZnVuY3Rpb24/LmJvZHk7CiAgICByZXR1cm4gYm9keT8udGFyZ2V0OwogIH0KCiAgc3RhdGljIFByb2NlZHVyZSBfZmluZEFkZE1ldGhvZChDb3JlVHlwZXMgY29yZVR5cGVzKSB7CiAgICByZXR1cm4gY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ1NldCcsICdhZGQnKTsKICB9CgogIFNldExpdGVyYWxUcmFuc2Zvcm1lcihTb3VyY2VMb2FkZXIgbG9hZGVyKQogICAgICA6IGNvcmVUeXBlcyA9IGxvYWRlci5jb3JlVHlwZXMsCiAgICAgICAgc2V0RmFjdG9yeSA9IF9maW5kU2V0RmFjdG9yeShsb2FkZXIuY29yZVR5cGVzKSwKICAgICAgICBhZGRNZXRob2QgPSBfZmluZEFkZE1ldGhvZChsb2FkZXIuY29yZVR5cGVzKTsKCiAgVHJlZU5vZGUgdmlzaXRTZXRMaXRlcmFsKFNldExpdGVyYWwgbm9kZSkgewogICAgaWYgKG5vZGUuaXNDb25zdCkgcmV0dXJuIG5vZGU7CgogICAgLy8gT3V0ZXJtb3N0IGRlY2xhcmF0aW9uIG9mIGxldCBjaGFpbjogU2V0PEU+IHNldFZhciA9IG5ldyBTZXQ8RT4oKTsKICAgIFZhcmlhYmxlRGVjbGFyYXRpb24gc2V0VmFyID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24uZm9yVmFsdWUoCiAgICAgICAgbmV3IFN0YXRpY0ludm9jYXRpb24oCiAgICAgICAgICAgIHNldEZhY3RvcnksIG5ldyBBcmd1bWVudHMoW10sIHR5cGVzOiBbbm9kZS50eXBlQXJndW1lbnRdKSksCiAgICAgICAgdHlwZTogbmV3IEludGVyZmFjZVR5cGUoY29yZVR5cGVzLnNldENsYXNzLCBfY3VycmVudExpYnJhcnkubm9uTnVsbGFibGUsCiAgICAgICAgICAgIFtub2RlLnR5cGVBcmd1bWVudF0pKTsKICAgIC8vIElubmVybW9zdCBib2R5IG9mIGxldCBjaGFpbjogc2V0VmFyCiAgICBFeHByZXNzaW9uIHNldEV4cCA9IG5ldyBWYXJpYWJsZUdldChzZXRWYXIpOwogICAgZm9yIChpbnQgaSA9IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgLy8gbGV0IF8gPSBzZXRWYXIuYWRkKGV4cHJlc3Npb24pIGluIHJlc3QKICAgICAgRXhwcmVzc2lvbiBlbnRyeSA9IG5vZGUuZXhwcmVzc2lvbnNbaV0uYWNjZXB0PFRyZWVOb2RlPih0aGlzKTsKICAgICAgc2V0RXhwID0gbmV3IExldCgKICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uLmZvclZhbHVlKG5ldyBNZXRob2RJbnZvY2F0aW9uKAogICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUdldChzZXRWYXIpLAogICAgICAgICAgICAgIG5ldyBOYW1lKCJhZGQiKSwKICAgICAgICAgICAgICBuZXcgQXJndW1lbnRzKFtlbnRyeV0pLAogICAgICAgICAgICAgIGFkZE1ldGhvZCkpLAogICAgICAgICAgc2V0RXhwKTsKICAgIH0KICAgIHJldHVybiBuZXcgTGV0KHNldFZhciwgc2V0RXhwKTsKICB9CgogIHZvaWQgZW50ZXJMaWJyYXJ5KExpYnJhcnkgbGlicmFyeSkgewogICAgYXNzZXJ0KAogICAgICAgIF9jdXJyZW50TGlicmFyeSA9PSBudWxsLAogICAgICAgICJBdHRlbXB0aW5nIHRvIGVudGVyIGxpYnJhcnkgJyR7bGlicmFyeS5maWxlVXJpfScgIgogICAgICAgICJ3aXRob3V0IGhhdmluZyBleGl0ZWQgbGlicmFyeSAnJHtfY3VycmVudExpYnJhcnkuZmlsZVVyaX0nLiIpOwogICAgX2N1cnJlbnRMaWJyYXJ5ID0gbGlicmFyeTsKICB9CgogIHZvaWQgZXhpdExpYnJhcnkoKSB7CiAgICBhc3NlcnQoX2N1cnJlbnRMaWJyYXJ5ICE9IG51bGwsCiAgICAgICAgIkF0dGVtcHRpbmcgdG8gZXhpdCBhIGxpYnJhcnkgd2l0aG91dCBoYXZpbmcgZW50ZXJlZCBvbmUuIik7CiAgICBfY3VycmVudExpYnJhcnkgPSBudWxsOwogIH0KfQpkAE5OPAEmASIBIQkTFBcNERoOExQaEh0VATgBNwE5AUQBSzIdHh0BMwZPExsBOks7GQQBOUEEAS0mODYBLiMBSUMeSFEjKzE9MEUYQScfJhsTBiQEAScMITxIHwQBFyRFHAQCAT5wYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3RyYW5zZm9ybV9zZXRfbGl0ZXJhbHMuZGFydGFmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2UvZGlldF9saXN0ZW5lci5kYXJ0wACIBC8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGZhc3RhLmRpZXRfbGlzdGVuZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3BhcnNlci5kYXJ0JwogICAgc2hvdyBBc3NlcnQsIERlY2xhcmF0aW9uS2luZCwgTWVtYmVyS2luZCwgUGFyc2VyLCBvcHRpb25hbDsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvcXVvdGUuZGFydCcgc2hvdyB1bmVzY2FwZVN0cmluZzsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvc3RhY2tfbGlzdGVuZXIuZGFydCcKICAgIHNob3cgRml4ZWROdWxsYWJsZUxpc3QsIE51bGxWYWx1ZSwgUGFyc2VyUmVjb3Zlcnk7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3ZhbHVlX2tpbmQuZGFydCc7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgIHNob3cKICAgICAgICBBc3luY01hcmtlciwKICAgICAgICBFeHByZXNzaW9uLAogICAgICAgIEludGVyZmFjZVR5cGUsCiAgICAgICAgTGlicmFyeSwKICAgICAgICBMaWJyYXJ5RGVwZW5kZW5jeSwKICAgICAgICBMaWJyYXJ5UGFydCwKICAgICAgICBUcmVlTm9kZSwKICAgICAgICBUeXBlUGFyYW1ldGVyLAogICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb247CgppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2NsYXNzX2hpZXJhcmNoeS5kYXJ0JyBzaG93IENsYXNzSGllcmFyY2h5OwoKaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwoKaW1wb3J0ICcuLi9idWlsZGVyL2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZGVjbGFyYXRpb25fYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL2ZpZWxkX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci9mdW5jdGlvbl9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnQnOwppbXBvcnQgJy4uL2J1aWxkZXIvbWV0YWRhdGFfYnVpbGRlci5kYXJ0JzsKaW1wb3J0ICcuLi9idWlsZGVyL21vZGlmaWVyX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2FsaWFzX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2J1aWxkZXIuZGFydCc7CmltcG9ydCAnLi4vYnVpbGRlci90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydCc7CgppbXBvcnQgJy4uL2lkZW50aWZpZXJzLmRhcnQnIHNob3cgUXVhbGlmaWVkTmFtZTsKCmltcG9ydCAnLi4vY29uc3RhbnRfY29udGV4dC5kYXJ0JyBzaG93IENvbnN0YW50Q29udGV4dDsKCmltcG9ydCAnLi4vY3Jhc2guZGFydCcgc2hvdyBDcmFzaDsKCmltcG9ydCAnLi4vZmFzdGFfY29kZXMuZGFydCcKICAgIHNob3cKICAgICAgICBDb2RlLAogICAgICAgIExvY2F0ZWRNZXNzYWdlLAogICAgICAgIE1lc3NhZ2UsCiAgICAgICAgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAsCiAgICAgICAgdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZDsKCmltcG9ydCAnLi4vaWdub3JlZF9wYXJzZXJfZXJyb3JzLmRhcnQnIHNob3cgaXNJZ25vcmVkUGFyc2VyRXJyb3I7CgppbXBvcnQgJy4uL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydCcgc2hvdyBCb2R5QnVpbGRlcjsKCmltcG9ydCAnLi4vcHJvYmxlbXMuZGFydCcKICAgIHNob3cgRGVidWdBYm9ydCwgaW50ZXJuYWxQcm9ibGVtLCB1bmV4cGVjdGVkLCB1bmhhbmRsZWQ7CgppbXBvcnQgJy4uL3Njb3BlLmRhcnQnOwoKaW1wb3J0ICcuLi9zb3VyY2UvdmFsdWVfa2luZHMuZGFydCc7CgppbXBvcnQgJy4uL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJlbmNlX2VuZ2luZS5kYXJ0JwogICAgc2hvdyBJbmZlcmVuY2VEYXRhRm9yVGVzdGluZywgVHlwZUluZmVyZW5jZUVuZ2luZTsKCmltcG9ydCAnLi4vdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0JyBzaG93IFR5cGVJbmZlcnJlcjsKCmltcG9ydCAnc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0JyBzaG93IFNvdXJjZUxpYnJhcnlCdWlsZGVyOwoKaW1wb3J0ICdzdGFja19saXN0ZW5lcl9pbXBsLmRhcnQnOwoKY2xhc3MgRGlldExpc3RlbmVyIGV4dGVuZHMgU3RhY2tMaXN0ZW5lckltcGwgewogIGZpbmFsIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnlCdWlsZGVyOwoKICBmaW5hbCBDbGFzc0hpZXJhcmNoeSBoaWVyYXJjaHk7CgogIGZpbmFsIENvcmVUeXBlcyBjb3JlVHlwZXM7CgogIGZpbmFsIGJvb2wgZW5hYmxlTmF0aXZlOwoKICBmaW5hbCBib29sIHN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmU7CgogIGZpbmFsIFR5cGVJbmZlcmVuY2VFbmdpbmUgdHlwZUluZmVyZW5jZUVuZ2luZTsKCiAgaW50IGltcG9ydEV4cG9ydERpcmVjdGl2ZUluZGV4ID0gMDsKICBpbnQgcGFydERpcmVjdGl2ZUluZGV4ID0gMDsKCiAgRGVjbGFyYXRpb25CdWlsZGVyIF9jdXJyZW50RGVjbGFyYXRpb247CiAgQ2xhc3NCdWlsZGVyIF9jdXJyZW50Q2xhc3M7CiAgYm9vbCBfaW5SZWRpcmVjdGluZ0ZhY3RvcnkgPSBmYWxzZTsKCiAgYm9vbCBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5ID0gZmFsc2U7CgogIC8vLyBDb3VudGVyIHVzZWQgZm9yIG5hbWluZyB1bm5hbWVkIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnMuCiAgaW50IHVubmFtZWRFeHRlbnNpb25Db3VudGVyID0gMDsKCiAgLy8vIEZvciB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLCB0aGlzIGlzIHRoZSBsaWJyYXJ5IHNjb3BlLiBGb3IgY2xhc3MgbWVtYmVycywKICAvLy8gdGhpcyBpcyB0aGUgaW5zdGFuY2Ugc2NvcGUgb2YgW2N1cnJlbnREZWNsYXJhdGlvbl0uCiAgU2NvcGUgbWVtYmVyU2NvcGU7CgogIEBvdmVycmlkZQogIFVyaSB1cmk7CgogIERpZXRMaXN0ZW5lcihTb3VyY2VMaWJyYXJ5QnVpbGRlciBsaWJyYXJ5LCB0aGlzLmhpZXJhcmNoeSwgdGhpcy5jb3JlVHlwZXMsCiAgICAgIHRoaXMudHlwZUluZmVyZW5jZUVuZ2luZSkKICAgICAgOiBsaWJyYXJ5QnVpbGRlciA9IGxpYnJhcnksCiAgICAgICAgdXJpID0gbGlicmFyeS5maWxlVXJpLAogICAgICAgIG1lbWJlclNjb3BlID0gbGlicmFyeS5zY29wZSwKICAgICAgICBlbmFibGVOYXRpdmUgPQogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5lbmFibGVOYXRpdmUobGlicmFyeS5pbXBvcnRVcmkpLAogICAgICAgIHN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmUgPQogICAgICAgICAgICBsaWJyYXJ5LmxvYWRlci50YXJnZXQuYmFja2VuZFRhcmdldC5uYXRpdmVFeHRlbnNpb25FeHBlY3RzU3RyaW5nOwoKICBEZWNsYXJhdGlvbkJ1aWxkZXIgZ2V0IGN1cnJlbnREZWNsYXJhdGlvbiA9PiBfY3VycmVudERlY2xhcmF0aW9uOwoKICB2b2lkIHNldCBjdXJyZW50RGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uQnVpbGRlciBidWlsZGVyKSB7CiAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CiAgICAgIF9jdXJyZW50Q2xhc3MgPSBfY3VycmVudERlY2xhcmF0aW9uID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIF9jdXJyZW50RGVjbGFyYXRpb24gPSBidWlsZGVyOwogICAgICBUeXBlRGVjbGFyYXRpb25CdWlsZGVyIHVuYWxpYXNlZEJ1aWxkZXIgPQogICAgICAgICAgYnVpbGRlciBpcyBUeXBlQWxpYXNCdWlsZGVyID8gYnVpbGRlci51bmFsaWFzRGVjbGFyYXRpb24gOiBidWlsZGVyOwogICAgICBfY3VycmVudENsYXNzID0KICAgICAgICAgIHVuYWxpYXNlZEJ1aWxkZXIgaXMgQ2xhc3NCdWlsZGVyID8gdW5hbGlhc2VkQnVpbGRlciA6IG51bGw7CiAgICB9CiAgfQoKICBDbGFzc0J1aWxkZXIgZ2V0IGN1cnJlbnRDbGFzcyA9PiBfY3VycmVudENsYXNzOwoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhU3RhcihpbnQgY291bnQpIHsKICAgIGFzc2VydChjaGVja1N0YXRlKG51bGwsIHJlcGVhdGVkS2luZHMoVmFsdWVLaW5kcy5Ub2tlbiwgY291bnQpKSk7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YVN0YXIiKTsKICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgZGlzY2FyZChjb3VudCAtIDEpOwogICAgICBwdXNoKHBvcChOdWxsVmFsdWUuVG9rZW4pID8/IE51bGxWYWx1ZS5Ub2tlbik7CiAgICB9IGVsc2UgewogICAgICBwdXNoKE51bGxWYWx1ZS5Ub2tlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1ldGFkYXRhKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJNZXRhZGF0YSIpOwogICAgZGlzY2FyZChwZXJpb2RCZWZvcmVOYW1lID09IG51bGwgPyAxIDogMik7CiAgICBwdXNoKGJlZ2luVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRQYXJ0T2YoCiAgICAgIFRva2VuIHBhcnRLZXl3b3JkLCBUb2tlbiBvZktleXdvcmQsIFRva2VuIHNlbWljb2xvbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJQYXJ0T2YiKTsKICAgIGlmIChoYXNOYW1lKSBkaXNjYXJkKDEpOwogICAgZGlzY2FyZCgxKTsgLy8gTWV0YWRhdGEuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uIik7CiAgICBwb3AoKTsgLy8gbWV0YWRhdGEgc3RhcgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0FyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9Bcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGVBcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb1R5cGUiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGRlYnVnRXZlbnQoIlR5cGUiKTsKICAgIGRpc2NhcmQoMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiVHlwZUxpc3QiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgZGVidWdFdmVudCgiTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc1dpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzV2l0aENsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzTm9XaXRoQ2xhdXNlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiVHlwZUFyZ3VtZW50cyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiSW52YWxpZFR5cGVBcmd1bWVudHMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJGaWVsZEluaXRpYWxpemVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GaWVsZEluaXRpYWxpemVyIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9UeXBlVmFyaWFibGVzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvcm1hbFBhcmFtZXRlcnMoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgZGVidWdFdmVudCgiRm9ybWFsUGFyYW1ldGVycyIpOwogICAgYXNzZXJ0KGNvdW50ID09IDApOyAvLyBDb3VudCBpcyBhbHdheXMgMCBhcyB0aGUgZGlldCBwYXJzZXIgc2tpcHMgZm9ybWFscy4KICAgIGlmIChraW5kICE9IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUgJiYKICAgICAgICBpZGVudGljYWwocGVlaygpLCAiLSIpICYmCiAgICAgICAgaWRlbnRpY2FsKGJlZ2luVG9rZW4ubmV4dCwgZW5kVG9rZW4pKSB7CiAgICAgIHBvcCgpOwogICAgICBwdXNoKCJ1bmFyeS0iKTsKICAgIH0KICAgIHB1c2goYmVnaW5Ub2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBkZWJ1Z0V2ZW50KCJOb0Zvcm1hbFBhcmFtZXRlcnMiKTsKICAgIGlmIChpZGVudGljYWwocGVlaygpLCAiLSIpKSB7CiAgICAgIHBvcCgpOwogICAgICBwdXNoKCJ1bmFyeS0iKTsKICAgIH0KICAgIHB1c2godG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGUoVG9rZW4gZnVuY3Rpb25Ub2tlbiwgVG9rZW4gcXVlc3Rpb25NYXJrKSB7CiAgICBkZWJ1Z0V2ZW50KCJGdW5jdGlvblR5cGUiKTsKICAgIGRpc2NhcmQoMSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZUFsaWFzKAogICAgICBUb2tlbiB0eXBlZGVmS2V5d29yZCwgVG9rZW4gZXF1YWxzLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRnVuY3Rpb25UeXBlQWxpYXMiKTsKCiAgICBpZiAoZXF1YWxzID09IG51bGwpIHBvcCgpOyAvLyBlbmRUb2tlbgogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KHR5cGVkZWZLZXl3b3JkLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWUgaXMgUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKCiAgICBUeXBlQWxpYXNCdWlsZGVyIHR5cGVkZWZCdWlsZGVyID0gbG9va3VwQnVpbGRlcih0eXBlZGVmS2V5d29yZCwgbnVsbCwgbmFtZSk7CiAgICBwYXJzZU1ldGFkYXRhKHR5cGVkZWZCdWlsZGVyLCBtZXRhZGF0YSwgdHlwZWRlZkJ1aWxkZXIudHlwZWRlZik7CiAgICBpZiAodHlwZWRlZkJ1aWxkZXIgaXMgVHlwZUFsaWFzQnVpbGRlcikgewogICAgICBUeXBlQnVpbGRlciB0eXBlID0gdHlwZWRlZkJ1aWxkZXIudHlwZTsKICAgICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlQnVpbGRlcikgewogICAgICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHR5cGUuZm9ybWFsczsKICAgICAgICBpZiAoZm9ybWFscyAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgRm9ybWFsUGFyYW1ldGVyQnVpbGRlciBmb3JtYWwgPSBmb3JtYWxzW2ldOwogICAgICAgICAgICBMaXN0PE1ldGFkYXRhQnVpbGRlcj4gbWV0YWRhdGEgPSBmb3JtYWwubWV0YWRhdGE7CiAgICAgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmIG1ldGFkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAvLyBbcGFyc2VNZXRhZGF0YV0gaXMgdXNpbmcgW1BhcnNlci5wYXJzZU1ldGFkYXRhU3Rhcl0gdW5kZXIgdGhlCiAgICAgICAgICAgICAgLy8gaG9vZCwgc28gd2Ugb25seSBuZWVkIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGFubm90YXRpb24uCiAgICAgICAgICAgICAgVG9rZW4gbWV0YWRhdGFUb2tlbiA9IHRva2VuRm9yT2Zmc2V0KAogICAgICAgICAgICAgICAgICB0eXBlZGVmS2V5d29yZCwgZW5kVG9rZW4sIG1ldGFkYXRhWzBdLmNoYXJPZmZzZXQpOwogICAgICAgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYW5ub3RhdGlvbnMgPQogICAgICAgICAgICAgICAgICBwYXJzZU1ldGFkYXRhKHR5cGVkZWZCdWlsZGVyLCBtZXRhZGF0YVRva2VuLCBudWxsKTsKICAgICAgICAgICAgICBpZiAoZm9ybWFsLmlzUG9zaXRpb25hbCkgewogICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPQogICAgICAgICAgICAgICAgICAgIHR5cGVkZWZCdWlsZGVyLnR5cGVkZWYucG9zaXRpb25hbFBhcmFtZXRlcnNbaV07CiAgICAgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBhbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uIG5hbWVkCiAgICAgICAgICAgICAgICAgICAgaW4gdHlwZWRlZkJ1aWxkZXIudHlwZWRlZi5uYW1lZFBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkLm5hbWUgPT0gZm9ybWFsLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gYW5ub3RhdGlvbiBpbiBhbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgbmFtZWQuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZWRlZkJ1aWxkZXIgIT0gbnVsbCkgewogICAgICB1bmhhbmRsZWQoIiR7dHlwZWRlZkJ1aWxkZXIuZnVsbE5hbWVGb3JFcnJvcnN9IiwgImVuZEZ1bmN0aW9uVHlwZUFsaWFzIiwKICAgICAgICAgIHR5cGVkZWZLZXl3b3JkLmNoYXJPZmZzZXQsIHVyaSk7CiAgICB9CgogICAgY2hlY2tFbXB0eSh0eXBlZGVmS2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NGaWVsZHMoVG9rZW4gc3RhdGljVG9rZW4sIFRva2VuIGNvdmFyaWFudFRva2VuLCBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiRmllbGRzIik7CiAgICBidWlsZEZpZWxkcyhjb3VudCwgYmVnaW5Ub2tlbiwgZmFsc2UpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc3luY01vZGlmaWVyKFRva2VuIGFzeW5jVG9rZW4sIFRva2VuIHN0YXJ0VG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkFzeW5jTW9kaWZpZXIiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJUb3BMZXZlbE1ldGhvZCIpOwogICAgVG9rZW4gYm9keVRva2VuID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSByZXR1cm47CgogICAgZmluYWwgU3RhY2tMaXN0ZW5lckltcGwgbGlzdGVuZXIgPQogICAgICAgIGNyZWF0ZUZ1bmN0aW9uTGlzdGVuZXIobG9va3VwQnVpbGRlcihiZWdpblRva2VuLCBnZXRPclNldCwgbmFtZSkpOwogICAgYnVpbGRGdW5jdGlvbkJvZHkobGlzdGVuZXIsIGJvZHlUb2tlbiwgbWV0YWRhdGEsIE1lbWJlcktpbmQuVG9wTGV2ZWxNZXRob2QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Z1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiTm9GdW5jdGlvbkJvZHkiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxGaWVsZHMoCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlRvcExldmVsRmllbGRzIik7CiAgICBidWlsZEZpZWxkcyhjb3VudCwgYmVnaW5Ub2tlbiwgdHJ1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVZvaWRLZXl3b3JkKFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJWb2lkS2V5d29yZCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0luaXRpYWxpemVycygpIHsKICAgIGRlYnVnRXZlbnQoIk5vSW5pdGlhbGl6ZXJzIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbml0aWFsaXplcnMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUXVhbGlmaWVkKFRva2VuIHBlcmlvZCkgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUocGVyaW9kLCBbCiAgICAgIC8qc3VmZml4Ki8gVmFsdWVLaW5kcy5OYW1lT3JQYXJzZXJSZWNvdmVyeSwKICAgICAgLypwcmVmaXgqLyB1bmlvbk9mS2luZHMoWwogICAgICAgIFZhbHVlS2luZHMuTmFtZSwKICAgICAgICBWYWx1ZUtpbmRzLkdlbmVyYXRvciwKICAgICAgICBWYWx1ZUtpbmRzLlBhcnNlclJlY292ZXJ5LAogICAgICAgIFZhbHVlS2luZHMuUXVhbGlmaWVkTmFtZSwKICAgICAgXSksCiAgICBdKSk7CiAgICBkZWJ1Z0V2ZW50KCJoYW5kbGVRdWFsaWZpZWQiKTsKICAgIE9iamVjdCBzdWZmaXggPSBwb3AoKTsKICAgIE9iamVjdCBwcmVmaXggPSBwb3AoKTsKICAgIGlmIChwcmVmaXggaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChwcmVmaXgpOwogICAgfSBlbHNlIGlmIChzdWZmaXggaXMgUGFyc2VyUmVjb3ZlcnkpIHsKICAgICAgcHVzaChzdWZmaXgpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGlkZW50aWNhbChzdWZmaXgsIHBlcmlvZC5uZXh0LmxleGVtZSkpOwogICAgICBwdXNoKG5ldyBRdWFsaWZpZWROYW1lKHByZWZpeCwgcGVyaW9kLm5leHQpKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGlicmFyeU5hbWUoVG9rZW4gbGlicmFyeUtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiZW5kTGlicmFyeU5hbWUiKTsKICAgIHBvcCgpOyAvLyBOYW1lLgogICAgcG9wKCk7IC8vIEFubm90YXRpb25zLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkxpdGVyYWxTdHJpbmcoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTGl0ZXJhbFN0cmluZyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdQYXJ0KFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJTdHJpbmdQYXJ0Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZExpdGVyYWxTdHJpbmcoaW50IGludGVycG9sYXRpb25Db3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZExpdGVyYWxTdHJpbmciKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlQ2xhdXNlKFRva2VuIG5hdGl2ZVRva2VuLCBib29sIGhhc05hbWUpIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUNsYXVzZSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTY3JpcHQoVG9rZW4gdG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlNjcmlwdCIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdHJpbmdKdXh0YXBvc2l0aW9uKFRva2VuIHN0YXJ0VG9rZW4sIGludCBsaXRlcmFsQ291bnQpIHsKICAgIGRlYnVnRXZlbnQoIlN0cmluZ0p1eHRhcG9zaXRpb24iKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgZGVidWdFdmVudCgiRG90dGVkTmFtZSIpOwogICAgZGlzY2FyZChjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpKFRva2VuIGlmS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLCBUb2tlbiBlcXVhbFNpZ24pIHsKICAgIGRlYnVnRXZlbnQoIkNvbmRpdGlvbmFsVXJpIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpcyhpbnQgY291bnQpIHsKICAgIGRlYnVnRXZlbnQoIkNvbmRpdGlvbmFsVXJpcyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiT3BlcmF0b3JOYW1lIik7CiAgICBwdXNoKHRva2VuLnN0cmluZ1ZhbHVlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZE9wZXJhdG9yTmFtZShUb2tlbiBvcGVyYXRvcktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbnZhbGlkT3BlcmF0b3JOYW1lIik7CiAgICBwdXNoKCdpbnZhbGlkJyk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXJMaXN0KGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiSWRlbnRpZmllckxpc3QiKTsKICAgIGRpc2NhcmQoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBkZWJ1Z0V2ZW50KCJTaG93Iik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEhpZGUoVG9rZW4gaGlkZUtleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIkhpZGUiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29tYmluYXRvcnMoaW50IGNvdW50KSB7CiAgICBkZWJ1Z0V2ZW50KCJDb21iaW5hdG9ycyIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbXBvcnRQcmVmaXgoVG9rZW4gZGVmZXJyZWRLZXl3b3JkLCBUb2tlbiBhc0tleXdvcmQpIHsKICAgIGRlYnVnRXZlbnQoIkltcG9ydFByZWZpeCIpOwogICAgcHVzaElmTnVsbChhc0tleXdvcmQsIE51bGxWYWx1ZS5QcmVmaXgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJJbXBvcnQiKTsKICAgIE9iamVjdCBuYW1lID0gcG9wKE51bGxWYWx1ZS5QcmVmaXgpOwoKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGltcG9ydEtleXdvcmQuY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwoKICAgIC8vIE5hdGl2ZSBpbXBvcnRzIG11c3QgYmUgc2tpcHBlZCBiZWNhdXNlIHRoZXkgYXJlbid0IGFzc2lnbmVkIGNvcnJlc3BvbmRpbmcKICAgIC8vIExpYnJhcnlEZXBlbmRlbmN5IG5vZGVzLgogICAgVG9rZW4gaW1wb3J0VXJpVG9rZW4gPSBpbXBvcnRLZXl3b3JkLm5leHQ7CiAgICBTdHJpbmcgaW1wb3J0VXJpID0KICAgICAgICB1bmVzY2FwZVN0cmluZyhpbXBvcnRVcmlUb2tlbi5sZXhlbWUsIGltcG9ydFVyaVRva2VuLCB0aGlzKTsKICAgIGlmIChpbXBvcnRVcmkuc3RhcnRzV2l0aCgiZGFydC1leHQ6IikpIHJldHVybjsKCiAgICBMaWJyYXJ5IGxpYnJhcnlOb2RlID0gbGlicmFyeUJ1aWxkZXIubGlicmFyeTsKICAgIExpYnJhcnlEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPQogICAgICAgIGxpYnJhcnlOb2RlLmRlcGVuZGVuY2llc1tpbXBvcnRFeHBvcnREaXJlY3RpdmVJbmRleCsrXTsKICAgIHBhcnNlTWV0YWRhdGEobGlicmFyeUJ1aWxkZXIsIG1ldGFkYXRhLCBkZXBlbmRlbmN5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlckltcG9ydChUb2tlbiBzZW1pY29sb24pIHsKICAgIHBvcChOdWxsVmFsdWUuUHJlZml4KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXhwb3J0KFRva2VuIGV4cG9ydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgZGVidWdFdmVudCgiRXhwb3J0Iik7CgogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIExpYnJhcnkgbGlicmFyeU5vZGUgPSBsaWJyYXJ5QnVpbGRlci5saWJyYXJ5OwogICAgTGlicmFyeURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9CiAgICAgICAgbGlicmFyeU5vZGUuZGVwZW5kZW5jaWVzW2ltcG9ydEV4cG9ydERpcmVjdGl2ZUluZGV4KytdOwogICAgcGFyc2VNZXRhZGF0YShsaWJyYXJ5QnVpbGRlciwgbWV0YWRhdGEsIGRlcGVuZGVuY3kpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRQYXJ0KFRva2VuIHBhcnRLZXl3b3JkLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIlBhcnQiKTsKCiAgICBUb2tlbiBtZXRhZGF0YSA9IHBvcCgpOwogICAgTGlicmFyeSBsaWJyYXJ5Tm9kZSA9IGxpYnJhcnlCdWlsZGVyLmxpYnJhcnk7CiAgICBpZiAobGlicmFyeU5vZGUucGFydHMubGVuZ3RoID4gcGFydERpcmVjdGl2ZUluZGV4KSB7CiAgICAgIC8vIElmIHBhcnREaXJlY3RpdmVJbmRleCA+PSBsaWJyYXJ5Tm9kZS5wYXJ0cy5sZW5ndGggd2UgYXJlIGluIGEgY2FzZSBvZgogICAgICAvLyBvbiBwYXJ0IGhhdmluZyBvdGhlciBwYXJ0cy4gQW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQuCiAgICAgIC8vIERvbid0IHRyeSB0byBwYXJzZSBtZXRhZGF0YSBpbnRvIG90aGVyIHBhcnRzIHRoYXQgaGF2ZSBub3RoaW5nIHRvIGRvCiAgICAgIC8vIHdpdGggdGhlIG9uZSB0aGlzIGtleXdvcmQgaXMgdGFsa2luZyBhYm91dC4KICAgICAgTGlicmFyeVBhcnQgcGFydCA9IGxpYnJhcnlOb2RlLnBhcnRzW3BhcnREaXJlY3RpdmVJbmRleCsrXTsKICAgICAgcGFyc2VNZXRhZGF0YShsaWJyYXJ5QnVpbGRlciwgbWV0YWRhdGEsIHBhcnQpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5UeXBlVmFyaWFibGUiKTsKICAgIGRpc2NhcmQoMik7IC8vIE5hbWUgYW5kIG1ldGFkYXRhLgogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlVmFyaWFibGUoCiAgICAgIFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyLCBUb2tlbiB2YXJpYW5jZSkgewogICAgZGVidWdFdmVudCgiZW5kVHlwZVZhcmlhYmxlIik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlR5cGVWYXJpYWJsZXMiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uc3RydWN0b3JSZWZlcmVuY2UoCiAgICAgIFRva2VuIHN0YXJ0LCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgZGVidWdFdmVudCgiQ29uc3RydWN0b3JSZWZlcmVuY2UiKTsKICAgIHBvcElmTm90TnVsbChwZXJpb2RCZWZvcmVOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBmYWN0b3J5S2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkNsYXNzRmFjdG9yeU1ldGhvZCIpOwogICAgVG9rZW4gYm9keVRva2VuID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgVG9rZW4gbWV0YWRhdGEgPSBwb3AoKTsKICAgIGNoZWNrRW1wdHkoYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0KTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5IHx8IGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnkpIHJldHVybjsKCiAgICBGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlciA9IGxvb2t1cENvbnN0cnVjdG9yKGJlZ2luVG9rZW4sIG5hbWUpOwogICAgaWYgKF9pblJlZGlyZWN0aW5nRmFjdG9yeSkgewogICAgICBidWlsZFJlZGlyZWN0aW5nRmFjdG9yeU1ldGhvZCgKICAgICAgICAgIGJvZHlUb2tlbiwgYnVpbGRlciwgTWVtYmVyS2luZC5GYWN0b3J5LCBtZXRhZGF0YSk7CiAgICB9IGVsc2UgewogICAgICBidWlsZEZ1bmN0aW9uQm9keShjcmVhdGVGdW5jdGlvbkxpc3RlbmVyKGJ1aWxkZXIpLCBib2R5VG9rZW4sIG1ldGFkYXRhLAogICAgICAgICAgTWVtYmVyS2luZC5GYWN0b3J5KTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXh0ZW5zaW9uRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJFeHRlbnNpb25GYWN0b3J5TWV0aG9kIik7CiAgICBwb3AoKTsgLy8gYm9keVRva2VuCiAgICBwb3AoKTsgLy8gbmFtZQogICAgcG9wKCk7IC8vIG1ldGFkYXRhCiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICAvLyBTa2lwIHRoZSBkZWNsYXJhdGlvbi4gQW4gZXJyb3IgYXMgYWxyZWFkeSBiZWVuIHByb2R1Y2VkIGJ5IHRoZSBwYXJzZXIuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4dGVuc2lvbkNvbnN0cnVjdG9yKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLAogICAgICBUb2tlbiBiZWdpblBhcmFtLCBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkV4dGVuc2lvbkNvbnN0cnVjdG9yIik7CiAgICBwb3AoKTsgLy8gYm9keVRva2VuCiAgICBwb3AoKTsgLy8gbmFtZQogICAgcG9wKCk7IC8vIG1ldGFkYXRhCiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICAvLyBTa2lwIHRoZSBkZWNsYXJhdGlvbi4gQW4gZXJyb3IgYXMgYWxyZWFkeSBiZWVuIHByb2R1Y2VkIGJ5IHRoZSBwYXJzZXIuCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIlJlZGlyZWN0aW5nRmFjdG9yeUJvZHkiKTsKICAgIGRpc2NhcmQoMSk7IC8vIENvbnN0cnVjdG9yUmVmZXJlbmNlLgogICAgX2luUmVkaXJlY3RpbmdGYWN0b3J5ID0gdHJ1ZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keSIpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHlJZ25vcmVkKFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGRlYnVnRXZlbnQoIk5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQiKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiBuYXRpdmVUb2tlbiwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBkZWJ1Z0V2ZW50KCJOYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkIik7CiAgICBpZiAoIWVuYWJsZU5hdGl2ZSkgewogICAgICBzdXBlci5oYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgbWVzc2FnZUV4cGVjdGVkQmxvY2tUb1NraXAsIG5hdGl2ZVRva2VuLCBuYXRpdmVUb2tlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk1ldGhvZCIpOwogICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIHJlbW92aW5nIHRoZSBiZWdpblBhcmFtIHBhcmFtZXRlcgogICAgLy8gYW5kIHVzaW5nIGJvZHlUb2tlbiwgYnV0IHB1c2hpbmcgYSBOdWxsVmFsdWUgb24gdGhlIHN0YWNrCiAgICAvLyBpbiBoYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnMgcmF0aGVyIHRoYW4gdGhlIHN1cHBsaWVkIHRva2VuLgogICAgcG9wKCk7IC8vIGJvZHlUb2tlbgogICAgT2JqZWN0IG5hbWUgPSBwb3AoKTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgICBpZiAobmFtZSBpcyBQYXJzZXJSZWNvdmVyeSB8fCBjdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5KSByZXR1cm47CiAgICBGdW5jdGlvbkJ1aWxkZXIgYnVpbGRlcjsKICAgIGlmIChuYW1lIGlzIFF1YWxpZmllZE5hbWUgfHwKICAgICAgICAoZ2V0T3JTZXQgPT0gbnVsbCAmJiBuYW1lID09IGN1cnJlbnRDbGFzcz8ubmFtZSkpIHsKICAgICAgYnVpbGRlciA9IGxvb2t1cENvbnN0cnVjdG9yKGJlZ2luVG9rZW4sIG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgYnVpbGRlciA9IGxvb2t1cEJ1aWxkZXIoYmVnaW5Ub2tlbiwgZ2V0T3JTZXQsIG5hbWUpOwogICAgfQogICAgYnVpbGRGdW5jdGlvbkJvZHkoCiAgICAgICAgY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcihidWlsZGVyKSwKICAgICAgICBiZWdpblBhcmFtLAogICAgICAgIG1ldGFkYXRhLAogICAgICAgIGJ1aWxkZXIuaXNTdGF0aWMKICAgICAgICAgICAgPyBNZW1iZXJLaW5kLlN0YXRpY01ldGhvZAogICAgICAgICAgICA6IE1lbWJlcktpbmQuTm9uU3RhdGljTWV0aG9kKTsKICB9CgogIFN0YWNrTGlzdGVuZXJJbXBsIGNyZWF0ZUxpc3RlbmVyKE1vZGlmaWVyQnVpbGRlciBidWlsZGVyLCBTY29wZSBtZW1iZXJTY29wZSwKICAgICAge2Jvb2wgaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuc2lvblRoaXMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMsCiAgICAgIFNjb3BlIGZvcm1hbFBhcmFtZXRlclNjb3BlLAogICAgICBJbmZlcmVuY2VEYXRhRm9yVGVzdGluZyBpbmZlcmVuY2VEYXRhRm9yVGVzdGluZ30pIHsKICAgIC8vIE5vdGU6IHdlIHNldCB0aGlzVHlwZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIGEgc3RhdGljCiAgICAvLyBtZW1iZXIsIHNpbmNlIHRoYXQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIHJlY292ZXJ5LgogICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogUHJvdmlkZSBhIGR1bW15IHRoaXMgb24gc3RhdGljIGV4dGVuc2lvbiBtZXRob2RzCiAgICAvLyBmb3IgYmV0dGVyIGVycm9yIHJlY292ZXJ5PwogICAgSW50ZXJmYWNlVHlwZSB0aGlzVHlwZSA9CiAgICAgICAgZXh0ZW5zaW9uVGhpcyA9PSBudWxsID8gY3VycmVudERlY2xhcmF0aW9uPy50aGlzVHlwZSA6IG51bGw7CiAgICBUeXBlSW5mZXJyZXIgdHlwZUluZmVycmVyID0gdHlwZUluZmVyZW5jZUVuZ2luZT8uY3JlYXRlTG9jYWxUeXBlSW5mZXJyZXIoCiAgICAgICAgdXJpLCB0aGlzVHlwZSwgbGlicmFyeUJ1aWxkZXIsIGluZmVyZW5jZURhdGFGb3JUZXN0aW5nKTsKICAgIENvbnN0YW50Q29udGV4dCBjb25zdGFudENvbnRleHQgPSBidWlsZGVyLmlzQ29uc3RydWN0b3IgJiYgYnVpbGRlci5pc0NvbnN0CiAgICAgICAgPyBDb25zdGFudENvbnRleHQuaW5mZXJyZWQKICAgICAgICA6IENvbnN0YW50Q29udGV4dC5ub25lOwogICAgcmV0dXJuIGNyZWF0ZUxpc3RlbmVySW50ZXJuYWwoCiAgICAgICAgYnVpbGRlciwKICAgICAgICBtZW1iZXJTY29wZSwKICAgICAgICBmb3JtYWxQYXJhbWV0ZXJTY29wZSwKICAgICAgICBpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZXh0ZW5zaW9uVGhpcywKICAgICAgICBleHRlbnNpb25UeXBlUGFyYW1ldGVycywKICAgICAgICB0eXBlSW5mZXJyZXIsCiAgICAgICAgY29uc3RhbnRDb250ZXh0KTsKICB9CgogIFN0YWNrTGlzdGVuZXJJbXBsIGNyZWF0ZUxpc3RlbmVySW50ZXJuYWwoCiAgICAgIE1vZGlmaWVyQnVpbGRlciBidWlsZGVyLAogICAgICBTY29wZSBtZW1iZXJTY29wZSwKICAgICAgU2NvcGUgZm9ybWFsUGFyYW1ldGVyU2NvcGUsCiAgICAgIGJvb2wgaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyLAogICAgICBWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuc2lvblRoaXMsCiAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnMsCiAgICAgIFR5cGVJbmZlcnJlciB0eXBlSW5mZXJyZXIsCiAgICAgIENvbnN0YW50Q29udGV4dCBjb25zdGFudENvbnRleHQpIHsKICAgIHJldHVybiBuZXcgQm9keUJ1aWxkZXIoCiAgICAgICAgbGlicmFyeUJ1aWxkZXI6IGxpYnJhcnlCdWlsZGVyLAogICAgICAgIG1lbWJlcjogYnVpbGRlciwKICAgICAgICBlbmNsb3NpbmdTY29wZTogbWVtYmVyU2NvcGUsCiAgICAgICAgZm9ybWFsUGFyYW1ldGVyU2NvcGU6IGZvcm1hbFBhcmFtZXRlclNjb3BlLAogICAgICAgIGhpZXJhcmNoeTogaGllcmFyY2h5LAogICAgICAgIGNvcmVUeXBlczogY29yZVR5cGVzLAogICAgICAgIGRlY2xhcmF0aW9uQnVpbGRlcjogY3VycmVudERlY2xhcmF0aW9uLAogICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcjogaXNEZWNsYXJhdGlvbkluc3RhbmNlTWVtYmVyLAogICAgICAgIGV4dGVuc2lvblRoaXM6IGV4dGVuc2lvblRoaXMsCiAgICAgICAgZXh0ZW5zaW9uVHlwZVBhcmFtZXRlcnM6IGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzLAogICAgICAgIHVyaTogdXJpLAogICAgICAgIHR5cGVJbmZlcnJlcjogdHlwZUluZmVycmVyKQogICAgICAuLmNvbnN0YW50Q29udGV4dCA9IGNvbnN0YW50Q29udGV4dDsKICB9CgogIFN0YWNrTGlzdGVuZXJJbXBsIGNyZWF0ZUZ1bmN0aW9uTGlzdGVuZXIoRnVuY3Rpb25CdWlsZGVySW1wbCBidWlsZGVyKSB7CiAgICBmaW5hbCBTY29wZSB0eXBlUGFyYW1ldGVyU2NvcGUgPQogICAgICAgIGJ1aWxkZXIuY29tcHV0ZVR5cGVQYXJhbWV0ZXJTY29wZShtZW1iZXJTY29wZSk7CiAgICBmaW5hbCBTY29wZSBmb3JtYWxQYXJhbWV0ZXJTY29wZSA9CiAgICAgICAgYnVpbGRlci5jb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGUodHlwZVBhcmFtZXRlclNjb3BlKTsKICAgIGFzc2VydCh0eXBlUGFyYW1ldGVyU2NvcGUgIT0gbnVsbCk7CiAgICBhc3NlcnQoZm9ybWFsUGFyYW1ldGVyU2NvcGUgIT0gbnVsbCk7CiAgICByZXR1cm4gY3JlYXRlTGlzdGVuZXIoYnVpbGRlciwgdHlwZVBhcmFtZXRlclNjb3BlLAogICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcjogYnVpbGRlci5pc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXIsCiAgICAgICAgZXh0ZW5zaW9uVGhpczogYnVpbGRlci5leHRlbnNpb25UaGlzLAogICAgICAgIGV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzOiBidWlsZGVyLmV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzLAogICAgICAgIGZvcm1hbFBhcmFtZXRlclNjb3BlOiBmb3JtYWxQYXJhbWV0ZXJTY29wZSwKICAgICAgICBpbmZlcmVuY2VEYXRhRm9yVGVzdGluZzogYnVpbGRlci5kYXRhRm9yVGVzdGluZz8uaW5mZXJlbmNlRGF0YSk7CiAgfQoKICB2b2lkIGJ1aWxkUmVkaXJlY3RpbmdGYWN0b3J5TWV0aG9kKAogICAgICBUb2tlbiB0b2tlbiwgRnVuY3Rpb25CdWlsZGVyIGJ1aWxkZXIsIE1lbWJlcktpbmQga2luZCwgVG9rZW4gbWV0YWRhdGEpIHsKICAgIGZpbmFsIFN0YWNrTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gY3JlYXRlRnVuY3Rpb25MaXN0ZW5lcihidWlsZGVyKTsKICAgIHRyeSB7CiAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpc3RlbmVyKTsKICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKICAgICAgICBwYXJzZXIucGFyc2VNZXRhZGF0YVN0YXIocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4obWV0YWRhdGEpKTsKICAgICAgICBsaXN0ZW5lci5wb3AoKTsgLy8gUG9wcyBtZXRhZGF0YSBjb25zdGFudHMuCiAgICAgIH0KCiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9ybWFsUGFyYW1ldGVyc09wdCgKICAgICAgICAgIHBhcnNlci5zeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwgTWVtYmVyS2luZC5GYWN0b3J5KTsKICAgICAgbGlzdGVuZXIucG9wKCk7IC8vIFBvcHMgZm9ybWFsIHBhcmFtZXRlcnMuCiAgICAgIGxpc3RlbmVyLmNoZWNrRW1wdHkodG9rZW4ubmV4dC5jaGFyT2Zmc2V0KTsKICAgIH0gb24gRGVidWdBYm9ydCB7CiAgICAgIHJldGhyb3c7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIHRocm93IG5ldyBDcmFzaCh1cmksIHRva2VuLmNoYXJPZmZzZXQsIGUsIHMpOwogICAgfQogIH0KCiAgdm9pZCBidWlsZEZpZWxkcyhpbnQgY291bnQsIFRva2VuIHRva2VuLCBib29sIGlzVG9wTGV2ZWwpIHsKICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IGNvbnN0IEZpeGVkTnVsbGFibGVMaXN0PFN0cmluZz4oKS5wb3Aoc3RhY2ssIGNvdW50KTsKICAgIFRva2VuIG1ldGFkYXRhID0gcG9wKCk7CiAgICBjaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogICAgaWYgKG5hbWVzID09IG51bGwgfHwgY3VycmVudENsYXNzSXNQYXJzZXJSZWNvdmVyeSkgcmV0dXJuOwoKICAgIFNvdXJjZUZpZWxkQnVpbGRlciBkZWNsYXJhdGlvbiA9IGxvb2t1cEJ1aWxkZXIodG9rZW4sIG51bGwsIG5hbWVzLmZpcnN0KTsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogZG9uJ3QgcmUtcGFyc2UgdGhlIGZpZWxkIGlmIHdlJ3ZlIGFscmVhZHkgcGFyc2VkIGl0CiAgICAvLyBmb3IgdHlwZSBpbmZlcmVuY2UuCiAgICBwYXJzZUZpZWxkcygKICAgICAgICBjcmVhdGVMaXN0ZW5lcihkZWNsYXJhdGlvbiwgbWVtYmVyU2NvcGUsCiAgICAgICAgICAgIGlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlcjoKICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmlzRGVjbGFyYXRpb25JbnN0YW5jZU1lbWJlciwKICAgICAgICAgICAgaW5mZXJlbmNlRGF0YUZvclRlc3Rpbmc6IGRlY2xhcmF0aW9uLmRhdGFGb3JUZXN0aW5nPy5pbmZlcmVuY2VEYXRhKSwKICAgICAgICB0b2tlbiwKICAgICAgICBtZXRhZGF0YSwKICAgICAgICBpc1RvcExldmVsKTsKICAgIGNoZWNrRW1wdHkodG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRNZW1iZXIoVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIkludmFsaWRNZW1iZXIiKTsKICAgIHBvcCgpOyAvLyBtZXRhZGF0YSBzdGFyCiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1lbWJlcigpIHsKICAgIGRlYnVnRXZlbnQoIk1lbWJlciIpOwogICAgY2hlY2tFbXB0eSgtMSk7CiAgICBfaW5SZWRpcmVjdGluZ0ZhY3RvcnkgPSBmYWxzZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQXNzZXJ0KFRva2VuIGFzc2VydEtleXdvcmQsIEFzc2VydCBraW5kLCBUb2tlbiBsZWZ0UGFyZW50aGVzaXMsCiAgICAgIFRva2VuIGNvbW1hVG9rZW4sIFRva2VuIHNlbWljb2xvblRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJBc3NlcnQiKTsKICAgIC8vIERvIG5vdGhpbmcKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc09yTWl4aW5Cb2R5KERlY2xhcmF0aW9uS2luZCBraW5kLCBUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KGNoZWNrU3RhdGUodG9rZW4sIFsKICAgICAgVmFsdWVLaW5kcy5Ub2tlbiwKICAgICAgVmFsdWVLaW5kcy5OYW1lT3JQYXJzZXJSZWNvdmVyeSwKICAgICAgVmFsdWVLaW5kcy5Ub2tlbk9yTnVsbAogICAgXSkpOwogICAgZGVidWdFdmVudCgiYmVnaW5DbGFzc09yTWl4aW5Cb2R5Iik7CiAgICBUb2tlbiBiZWdpblRva2VuID0gcG9wKCk7CiAgICBPYmplY3QgbmFtZSA9IHBvcCgpOwogICAgcG9wKCk7IC8vIEFubm90YXRpb24gYmVnaW4gdG9rZW4uCiAgICBhc3NlcnQoY3VycmVudERlY2xhcmF0aW9uID09IG51bGwpOwogICAgYXNzZXJ0KG1lbWJlclNjb3BlID09IGxpYnJhcnlCdWlsZGVyLnNjb3BlKTsKICAgIGlmIChuYW1lIGlzIFBhcnNlclJlY292ZXJ5KSB7CiAgICAgIGN1cnJlbnRDbGFzc0lzUGFyc2VyUmVjb3ZlcnkgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBjdXJyZW50RGVjbGFyYXRpb24gPSBsb29rdXBCdWlsZGVyKGJlZ2luVG9rZW4sIG51bGwsIG5hbWUpOwogICAgbWVtYmVyU2NvcGUgPSBjdXJyZW50RGVjbGFyYXRpb24uc2NvcGU7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzT3JNaXhpbkJvZHkoCiAgICAgIERlY2xhcmF0aW9uS2luZCBraW5kLCBpbnQgbWVtYmVyQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJDbGFzc09yTWl4aW5Cb2R5Iik7CiAgICBjdXJyZW50RGVjbGFyYXRpb24gPSBudWxsOwogICAgY3VycmVudENsYXNzSXNQYXJzZXJSZWNvdmVyeSA9IGZhbHNlOwogICAgbWVtYmVyU2NvcGUgPSBsaWJyYXJ5QnVpbGRlci5zY29wZTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luLCBUb2tlbiBhYnN0cmFjdFRva2VuLCBUb2tlbiBuYW1lKSB7CiAgICBkZWJ1Z0V2ZW50KCJiZWdpbkNsYXNzRGVjbGFyYXRpb24iKTsKICAgIHB1c2goYmVnaW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRDbGFzc0RlY2xhcmF0aW9uIik7CiAgICBjaGVja0VtcHR5KGJlZ2luVG9rZW4uY2hhck9mZnNldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWl4aW5EZWNsYXJhdGlvbihUb2tlbiBtaXhpbktleXdvcmQsIFRva2VuIG5hbWUpIHsKICAgIGRlYnVnRXZlbnQoImJlZ2luTWl4aW5EZWNsYXJhdGlvbiIpOwogICAgcHVzaChtaXhpbktleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoImVuZE1peGluRGVjbGFyYXRpb24iKTsKICAgIGNoZWNrRW1wdHkobWl4aW5LZXl3b3JkLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uKFRva2VuIGV4dGVuc2lvbktleXdvcmQsIFRva2VuIG5hbWVUb2tlbikgewogICAgZGVidWdFdmVudCgiYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvbiIpOwogICAgU3RyaW5nIG5hbWUgPSBuYW1lVG9rZW4/LmxleGVtZSA/PwogICAgICAgIC8vIFN5bnRoZXNpemVkIG5hbWUgdXNlZCBpbnRlcm5hbGx5LgogICAgICAgICdfZXh0ZW5zaW9uIyR7dW5uYW1lZEV4dGVuc2lvbkNvdW50ZXIrK30nOwogICAgcHVzaChuYW1lKTsKICAgIHB1c2goZXh0ZW5zaW9uS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4dGVuc2lvbkRlY2xhcmF0aW9uKAogICAgICBUb2tlbiBleHRlbnNpb25LZXl3b3JkLCBUb2tlbiBvbktleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBkZWJ1Z0V2ZW50KCJlbmRFeHRlbnNpb25EZWNsYXJhdGlvbiIpOwogICAgY2hlY2tFbXB0eShleHRlbnNpb25LZXl3b3JkLmNoYXJPZmZzZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbnVtKFRva2VuIGVudW1LZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIGludCBjb3VudCkgewogICAgZGVidWdFdmVudCgiRW51bSIpOwogICAgY29uc3QgRml4ZWROdWxsYWJsZUxpc3Q8T2JqZWN0PigpLnBvcChzdGFjaywgY291bnQgKiAyKTsKICAgIHBvcCgpOyAvLyBOYW1lLgogICAgcG9wKCk7IC8vIEFubm90YXRpb25zIGJlZ2luIHRva2VuLgogICAgY2hlY2tFbXB0eShlbnVtS2V5d29yZC5jaGFyT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRNaXhpbkFwcGxpY2F0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGNsYXNzS2V5d29yZCwKICAgICAgVG9rZW4gZXF1YWxzLCBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGRlYnVnRXZlbnQoIk5hbWVkTWl4aW5BcHBsaWNhdGlvbiIpOwoKICAgIHBvcCgpOyAvLyBOYW1lLgogICAgcG9wKCk7IC8vIEFubm90YXRpb25zIGJlZ2luIHRva2VuLgogICAgY2hlY2tFbXB0eShiZWdpblRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQXN5bmNNYXJrZXIgZ2V0QXN5bmNNYXJrZXIoU3RhY2tMaXN0ZW5lckltcGwgbGlzdGVuZXIpID0+IGxpc3RlbmVyLnBvcCgpOwoKICAvLy8gSW52b2tlcyB0aGUgbGlzdGVuZXIncyBbZmluaXNoRnVuY3Rpb25dIG1ldGhvZC4KICAvLy8KICAvLy8gVGhpcyBpcyBhIHNlcGFyYXRlIG1ldGhvZCBzbyB0aGF0IGl0IG1heSBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzcwogIC8vLyBpZiBtb3JlIGNvbXB1dGF0aW9uIG11c3QgYmUgZG9uZSBiZWZvcmUgZmluaXNoaW5nIHRoZSBmdW5jdGlvbi4KICB2b2lkIGxpc3RlbmVyRmluaXNoRnVuY3Rpb24oCiAgICAgIFN0YWNrTGlzdGVuZXJJbXBsIGxpc3RlbmVyLAogICAgICBUb2tlbiB0b2tlbiwKICAgICAgTWVtYmVyS2luZCBraW5kLAogICAgICBkeW5hbWljIGZvcm1hbHMsCiAgICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIsCiAgICAgIGR5bmFtaWMgYm9keSkgewogICAgbGlzdGVuZXIuZmluaXNoRnVuY3Rpb24oZm9ybWFscywgYXN5bmNNb2RpZmllciwgYm9keSk7CiAgfQoKICAvLy8gSW52b2tlcyB0aGUgbGlzdGVuZXIncyBbZmluaXNoRmllbGRzXSBtZXRob2QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBtZXRob2Qgc28gdGhhdCBpdCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3MKICAvLy8gaWYgbW9yZSBjb21wdXRhdGlvbiBtdXN0IGJlIGRvbmUgYmVmb3JlIGZpbmlzaGluZyB0aGUgZnVuY3Rpb24uCiAgdm9pZCBsaXN0ZW5lckZpbmlzaEZpZWxkcyhTdGFja0xpc3RlbmVySW1wbCBsaXN0ZW5lciwgVG9rZW4gc3RhcnRUb2tlbiwKICAgICAgVG9rZW4gbWV0YWRhdGEsIGJvb2wgaXNUb3BMZXZlbCkgewogICAgbGlzdGVuZXIuZmluaXNoRmllbGRzKCk7CiAgfQoKICB2b2lkIGJ1aWxkRnVuY3Rpb25Cb2R5KFN0YWNrTGlzdGVuZXJJbXBsIGxpc3RlbmVyLCBUb2tlbiBzdGFydFRva2VuLAogICAgICBUb2tlbiBtZXRhZGF0YSwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47CiAgICB0cnkgewogICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihsaXN0ZW5lcik7CiAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgICAgcGFyc2VyLnBhcnNlTWV0YWRhdGFTdGFyKHBhcnNlci5zeW50aGV0aWNQcmV2aW91c1Rva2VuKG1ldGFkYXRhKSk7CiAgICAgICAgbGlzdGVuZXIucG9wKCk7IC8vIEFubm90YXRpb25zLgogICAgICB9CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9ybWFsUGFyYW1ldGVyc09wdCgKICAgICAgICAgIHBhcnNlci5zeW50aGV0aWNQcmV2aW91c1Rva2VuKHRva2VuKSwga2luZCk7CiAgICAgIE9iamVjdCBmb3JtYWxzID0gbGlzdGVuZXIucG9wKCk7CiAgICAgIGxpc3RlbmVyLmNoZWNrRW1wdHkodG9rZW4ubmV4dC5jaGFyT2Zmc2V0KTsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VJbml0aWFsaXplcnNPcHQodG9rZW4pOwogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUFzeW5jTW9kaWZpZXJPcHQodG9rZW4pOwogICAgICBBc3luY01hcmtlciBhc3luY01vZGlmaWVyID0gZ2V0QXN5bmNNYXJrZXIobGlzdGVuZXIpID8/IEFzeW5jTWFya2VyLlN5bmM7CiAgICAgIGlmIChraW5kID09IE1lbWJlcktpbmQuRmFjdG9yeSAmJiBhc3luY01vZGlmaWVyICE9IEFzeW5jTWFya2VyLlN5bmMpIHsKICAgICAgICAvLyBGYWN0b3JpZXMgaGFzIHRvIGJlIHN5bmMuIFRoZSBwYXJzZXIgaXNzdWVkIGFuIGVycm9yLgogICAgICAgIC8vIFJlY292ZXIgdG8gc3luYy4KICAgICAgICBhc3luY01vZGlmaWVyID0gQXN5bmNNYXJrZXIuU3luYzsKICAgICAgfQogICAgICBib29sIGlzRXhwcmVzc2lvbiA9IGZhbHNlOwogICAgICBib29sIGFsbG93QWJzdHJhY3QgPSBhc3luY01vZGlmaWVyID09IEFzeW5jTWFya2VyLlN5bmM7CiAgICAgIHBhcnNlci5wYXJzZUZ1bmN0aW9uQm9keSh0b2tlbiwgaXNFeHByZXNzaW9uLCBhbGxvd0Fic3RyYWN0KTsKICAgICAgT2JqZWN0IGJvZHkgPSBsaXN0ZW5lci5wb3AoKTsKICAgICAgbGlzdGVuZXIuY2hlY2tFbXB0eSh0b2tlbi5jaGFyT2Zmc2V0KTsKICAgICAgbGlzdGVuZXJGaW5pc2hGdW5jdGlvbigKICAgICAgICAgIGxpc3RlbmVyLCBzdGFydFRva2VuLCBraW5kLCBmb3JtYWxzLCBhc3luY01vZGlmaWVyLCBib2R5KTsKICAgIH0gb24gRGVidWdBYm9ydCB7CiAgICAgIHJldGhyb3c7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIHRocm93IG5ldyBDcmFzaCh1cmksIHRva2VuLmNoYXJPZmZzZXQsIGUsIHMpOwogICAgfQogIH0KCiAgdm9pZCBwYXJzZUZpZWxkcyhTdGFja0xpc3RlbmVySW1wbCBsaXN0ZW5lciwgVG9rZW4gc3RhcnRUb2tlbiwgVG9rZW4gbWV0YWRhdGEsCiAgICAgIGJvb2wgaXNUb3BMZXZlbCkgewogICAgVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwogICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobGlzdGVuZXIpOwogICAgaWYgKGlzVG9wTGV2ZWwpIHsKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VUb3BMZXZlbE1lbWJlcihtZXRhZGF0YSA/PyB0b2tlbik7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPKGRhbnJ1YmVsKTogZGlzYW1iaWd1YXRlIGJldHdlZW4gY2xhc3MvbWl4aW4vZXh0ZW5zaW9uIG1lbWJlcnMKICAgICAgdG9rZW4gPSBwYXJzZXIucGFyc2VDbGFzc01lbWJlcihtZXRhZGF0YSA/PyB0b2tlbiwgbnVsbCkubmV4dDsKICAgIH0KICAgIGxpc3RlbmVyRmluaXNoRmllbGRzKGxpc3RlbmVyLCBzdGFydFRva2VuLCBtZXRhZGF0YSwgaXNUb3BMZXZlbCk7CiAgICBsaXN0ZW5lci5jaGVja0VtcHR5KHRva2VuLmNoYXJPZmZzZXQpOwogIH0KCiAgQnVpbGRlciBsb29rdXBCdWlsZGVyKFRva2VuIHRva2VuLCBUb2tlbiBnZXRPclNldCwgU3RyaW5nIG5hbWUpIHsKICAgIC8vIFRPRE8oYWhlKTogQ2FuIEkgbW92ZSB0aGlzIHRvIFNjb3BlIG9yIFNjb3BlQnVpbGRlcj8KICAgIEJ1aWxkZXIgZGVjbGFyYXRpb247CiAgICBpZiAoY3VycmVudERlY2xhcmF0aW9uICE9IG51bGwpIHsKICAgICAgaWYgKHVyaSAhPSBjdXJyZW50RGVjbGFyYXRpb24uZmlsZVVyaSkgewogICAgICAgIHVuZXhwZWN0ZWQoIiR1cmkiLCAiJHtjdXJyZW50RGVjbGFyYXRpb24uZmlsZVVyaX0iLAogICAgICAgICAgICBjdXJyZW50RGVjbGFyYXRpb24uY2hhck9mZnNldCwgY3VycmVudERlY2xhcmF0aW9uLmZpbGVVcmkpOwogICAgICB9CgogICAgICBpZiAoZ2V0T3JTZXQgIT0gbnVsbCAmJiBvcHRpb25hbCgic2V0IiwgZ2V0T3JTZXQpKSB7CiAgICAgICAgZGVjbGFyYXRpb24gPQogICAgICAgICAgICBjdXJyZW50RGVjbGFyYXRpb24uc2NvcGUubG9va3VwTG9jYWxNZW1iZXIobmFtZSwgc2V0dGVyOiB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWNsYXJhdGlvbiA9CiAgICAgICAgICAgIGN1cnJlbnREZWNsYXJhdGlvbi5zY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IGZhbHNlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChnZXRPclNldCAhPSBudWxsICYmIG9wdGlvbmFsKCJzZXQiLCBnZXRPclNldCkpIHsKICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5QnVpbGRlci5zY29wZS5sb29rdXBMb2NhbE1lbWJlcihuYW1lLCBzZXR0ZXI6IHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgZGVjbGFyYXRpb24gPSBsaWJyYXJ5QnVpbGRlci5zY29wZUJ1aWxkZXJbbmFtZV07CiAgICB9CiAgICBkZWNsYXJhdGlvbiA9IGhhbmRsZUR1cGxpY2F0ZWROYW1lKGRlY2xhcmF0aW9uLCB0b2tlbik7CiAgICBjaGVja0J1aWxkZXIodG9rZW4sIGRlY2xhcmF0aW9uLCBuYW1lKTsKICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICB9CgogIEJ1aWxkZXIgbG9va3VwQ29uc3RydWN0b3IoVG9rZW4gdG9rZW4sIE9iamVjdCBuYW1lT3JRdWFsaWZpZWQpIHsKICAgIGFzc2VydChjdXJyZW50Q2xhc3MgIT0gbnVsbCk7CiAgICBCdWlsZGVyIGRlY2xhcmF0aW9uOwogICAgU3RyaW5nIHN1ZmZpeDsKICAgIGlmIChuYW1lT3JRdWFsaWZpZWQgaXMgUXVhbGlmaWVkTmFtZSkgewogICAgICBzdWZmaXggPSBuYW1lT3JRdWFsaWZpZWQubmFtZTsKICAgIH0gZWxzZSB7CiAgICAgIHN1ZmZpeCA9IG5hbWVPclF1YWxpZmllZCA9PSBjdXJyZW50Q2xhc3MubmFtZSA/ICIiIDogbmFtZU9yUXVhbGlmaWVkOwogICAgfQogICAgZGVjbGFyYXRpb24gPSBjdXJyZW50Q2xhc3MuY29uc3RydWN0b3JzLmxvY2FsW3N1ZmZpeF07CiAgICBkZWNsYXJhdGlvbiA9IGhhbmRsZUR1cGxpY2F0ZWROYW1lKGRlY2xhcmF0aW9uLCB0b2tlbik7CiAgICBjaGVja0J1aWxkZXIodG9rZW4sIGRlY2xhcmF0aW9uLCBuYW1lT3JRdWFsaWZpZWQpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KCiAgQnVpbGRlciBoYW5kbGVEdXBsaWNhdGVkTmFtZShCdWlsZGVyIGRlY2xhcmF0aW9uLCBUb2tlbiB0b2tlbikgewogICAgaW50IG9mZnNldCA9IHRva2VuLmNoYXJPZmZzZXQ7CiAgICBpZiAoZGVjbGFyYXRpb24/Lm5leHQgPT0gbnVsbCkgewogICAgICByZXR1cm4gZGVjbGFyYXRpb247CiAgICB9IGVsc2UgewogICAgICBCdWlsZGVyIG5lYXJlc3REZWNsYXJhdGlvbjsKICAgICAgaW50IG1pbkRpc3RhbmNlID0gLTE7CiAgICAgIGRvIHsKICAgICAgICAvLyBPbmx5IGxvb2sgYXQgZGVjbGFyYXRpb25zIGZyb20gdGhpcyBmaWxlIChwYXJ0KS4KICAgICAgICBpZiAodXJpID09IGRlY2xhcmF0aW9uLmZpbGVVcmkpIHsKICAgICAgICAgIC8vIFtkaXN0YW5jZV0gd2lsbCBhbHdheXMgYmUgbm9uLW5lZ2F0aXZlIGFzIHdlIGVuc3VyZSBbdG9rZW5dIGlzCiAgICAgICAgICAvLyBhbHdheXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGVjbGFyYXRpb24uIFRoZSBtaW5pbXVtIGRpc3RhbmNlCiAgICAgICAgICAvLyB3aWxsIG9mdGVuIGJlIGxhcmdlciB0aGFuIDAsIGZvciBleGFtcGxlLCBpbiBhIGNsYXNzIGRlY2xhcmF0aW9uCiAgICAgICAgICAvLyB3aGVyZSBbdG9rZW5dIHdpbGwgcG9pbnQgdG8gYGFic3RyYWN0YCBvciBgY2xhc3NgLCBidXQgdGhlCiAgICAgICAgICAvLyBkZWNsYXJhdGlvbidzIG9mZnNldCBwb2ludHMgdG8gdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgogICAgICAgICAgaW50IGRpc3RhbmNlID0gZGVjbGFyYXRpb24uY2hhck9mZnNldCAtIG9mZnNldDsKICAgICAgICAgIGlmIChkaXN0YW5jZSA+PSAwKSB7CiAgICAgICAgICAgIGlmIChtaW5EaXN0YW5jZSA9PSAtMSB8fCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7CiAgICAgICAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKICAgICAgICAgICAgICBuZWFyZXN0RGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLm5leHQ7CiAgICAgIH0gd2hpbGUgKGRlY2xhcmF0aW9uICE9IG51bGwpOwogICAgICByZXR1cm4gbmVhcmVzdERlY2xhcmF0aW9uOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0J1aWxkZXIoVG9rZW4gdG9rZW4sIEJ1aWxkZXIgZGVjbGFyYXRpb24sIE9iamVjdCBuYW1lKSB7CiAgICBpZiAoZGVjbGFyYXRpb24gPT0gbnVsbCkgewogICAgICBpbnRlcm5hbFByb2JsZW0odGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZC53aXRoQXJndW1lbnRzKCIkbmFtZSIpLAogICAgICAgICAgdG9rZW4uY2hhck9mZnNldCwgdXJpKTsKICAgIH0KICAgIGlmICh1cmkgIT0gZGVjbGFyYXRpb24uZmlsZVVyaSkgewogICAgICB1bmV4cGVjdGVkKCIkdXJpIiwgIiR7ZGVjbGFyYXRpb24uZmlsZVVyaX0iLCBkZWNsYXJhdGlvbi5jaGFyT2Zmc2V0LAogICAgICAgICAgZGVjbGFyYXRpb24uZmlsZVVyaSk7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGFkZFByb2JsZW0oTWVzc2FnZSBtZXNzYWdlLCBpbnQgY2hhck9mZnNldCwgaW50IGxlbmd0aCwKICAgICAge2Jvb2wgd2FzSGFuZGxlZDogZmFsc2UsIExpc3Q8TG9jYXRlZE1lc3NhZ2U+IGNvbnRleHR9KSB7CiAgICBsaWJyYXJ5QnVpbGRlci5hZGRQcm9ibGVtKG1lc3NhZ2UsIGNoYXJPZmZzZXQsIGxlbmd0aCwgdXJpLAogICAgICAgIHdhc0hhbmRsZWQ6IHdhc0hhbmRsZWQsIGNvbnRleHQ6IGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBkZWJ1Z0V2ZW50KFN0cmluZyBuYW1lKSB7CiAgICAvLyBwcmludEV2ZW50KCdEaWV0TGlzdGVuZXI6ICRuYW1lJyk7CiAgfQoKICAvLy8gSWYgdGhlIFttZXRhZGF0YV0gaXMgbm90IGBudWxsYCwgcmV0dXJuIHRoZSBwYXJzZWQgbWV0YWRhdGEgW0V4cHJlc3Npb25dcy4KICAvLy8gT3RoZXJ3aXNlLCByZXR1cm4gYG51bGxgLgogIExpc3Q8RXhwcmVzc2lvbj4gcGFyc2VNZXRhZGF0YSgKICAgICAgTW9kaWZpZXJCdWlsZGVyIGJ1aWxkZXIsIFRva2VuIG1ldGFkYXRhLCBUcmVlTm9kZSBwYXJlbnQpIHsKICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CiAgICAgIFN0YWNrTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gY3JlYXRlTGlzdGVuZXIoYnVpbGRlciwgbWVtYmVyU2NvcGUsCiAgICAgICAgICBpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXI6IGZhbHNlKTsKICAgICAgUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobGlzdGVuZXIpOwogICAgICBwYXJzZXIucGFyc2VNZXRhZGF0YVN0YXIocGFyc2VyLnN5bnRoZXRpY1ByZXZpb3VzVG9rZW4obWV0YWRhdGEpKTsKICAgICAgcmV0dXJuIGxpc3RlbmVyLmZpbmlzaE1ldGFkYXRhKHBhcmVudCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vLyBSZXR1cm5zIFtUb2tlbl0gZm91bmQgYmV0d2VlbiBbc3RhcnRdIChpbmNsdXNpdmUpIGFuZCBbZW5kXQogIC8vLyAobm9uLWluY2x1c2l2ZSkgdGhhdCBoYXMgaXRzIFtUb2tlbi5jaGFyT2Zmc2V0XSBlcXVhbCB0byBbb2Zmc2V0XS4gIElmCiAgLy8vIHRoZXJlIGlzIG5vIHN1Y2ggdG9rZW4sIG51bGwgaXMgcmV0dXJuZWQuCiAgVG9rZW4gdG9rZW5Gb3JPZmZzZXQoVG9rZW4gc3RhcnQsIFRva2VuIGVuZCwgaW50IG9mZnNldCkgewogICAgaWYgKG9mZnNldCA8IHN0YXJ0LmNoYXJPZmZzZXQgfHwgb2Zmc2V0ID49IGVuZC5jaGFyT2Zmc2V0KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgd2hpbGUgKHN0YXJ0ICE9IGVuZCkgewogICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0LmNoYXJPZmZzZXQpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgIH0KICAgICAgc3RhcnQgPSBzdGFydC5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8gUmV0dXJucyBsaXN0IG9mIFtUb2tlbl1zIGZvdW5kIGJldHdlZW4gW3N0YXJ0XSAoaW5jbHVzaXZlKSBhbmQgW2VuZF0KICAvLy8gKG5vbi1pbmNsdXNpdmUpIHRoYXQgY29ycmVzcG9uZCB0byBbb2Zmc2V0c10uICBJZiB0aGVyZSdzIG5vIHRva2VuIGJldHdlZW4KICAvLy8gW3N0YXJ0XSBhbmQgW2VuZF0gZm9yIHRoZSBnaXZlbiBvZmZzZXQsIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gaW4gdGhlCiAgLy8vIHJlc3VsdGluZyBsaXN0IGlzIHNldCB0byBudWxsLiAgW29mZnNldHNdIGFyZSBhc3N1bWVkIHRvIGJlIGluIGFzY2VuZGluZwogIC8vLyBvcmRlci4KICBMaXN0PFRva2VuPiB0b2tlbnNGb3JPZmZzZXRzKFRva2VuIHN0YXJ0LCBUb2tlbiBlbmQsIExpc3Q8aW50PiBvZmZzZXRzKSB7CiAgICBMaXN0PFRva2VuPiByZXN1bHQgPQogICAgICAgIG5ldyBMaXN0PFRva2VuPi5maWxsZWQob2Zmc2V0cy5sZW5ndGgsIG51bGwsIGdyb3dhYmxlOiBmYWxzZSk7CiAgICBmb3IgKGludCBpID0gMDsgc3RhcnQgIT0gZW5kICYmIGkgPCBvZmZzZXRzLmxlbmd0aDspIHsKICAgICAgaW50IG9mZnNldCA9IG9mZnNldHNbaV07CiAgICAgIGlmIChvZmZzZXQgPCBzdGFydC5jaGFyT2Zmc2V0KSB7CiAgICAgICAgKytpOwogICAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSBzdGFydC5jaGFyT2Zmc2V0KSB7CiAgICAgICAgcmVzdWx0W2ldID0gc3RhcnQ7CiAgICAgICAgc3RhcnQgPSBzdGFydC5uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXJ0ID0gc3RhcnQubmV4dDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgaXNJZ25vcmVkRXJyb3IoQ29kZTxkeW5hbWljPiBjb2RlLCBUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGlzSWdub3JlZFBhcnNlckVycm9yKGNvZGUsIHRva2VuKSB8fAogICAgICAgIHN1cGVyLmlzSWdub3JlZEVycm9yKGNvZGUsIHRva2VuKTsKICB9Cn0KhGQATk48AR0BPEABUAFENwFBAUgBIQkVFBcRGxUSFx0BQgE4ASIoLigzKzArKy0nMwExATgBIwEdCQ4YESQpAUIBNwEaPQEYASUBNjcBQQFAASMBLy0BIgEdARsBKAExASYeASoeJgEtAT4jAVA6FQEMCwFNICIfJRdRJE4BRAFAGzINJTBOFkYGBAEyAQwkRiAVGjUNHQYEAQxPHC8WBAEMEksaHR0EAQw8LhwEAQwoHwQBDCwjBAEMUUgEAQwqGgQBDDoYEAQBDCAcBAEMQjMEAQwyIwQBDCMlBAEMRyEEAQwxKAQBDEQkBAEMLyYEAQwsIwQBDBxGJE82IjANFgYWBAEMQCYiDRYGEQQBDEIgEAQBDB08JQErGRwrKAFRRS4uKT0fNTg+O09LNEUtRikwRD03EhcvQTNBNxYUEhAODAoIKU8rBgErBAEMUEwaKwQBDEEhBAEMTSIdGRwnKAEnS1EEAQwrIgQBDBoZHBcdERgYIioEAQwoHwQBDCAiBAEMRiAEAQwnIDIgGR4jIgoJIxsbJBQrFA01NAYEAQw/IhQbBAEMKSYEAQwnHgQBDEIkBAEMPSAEAQwjGgQBDEcnBAEMPB4UBAEMTiIEAQwnIwQBDEAgHQQBDEcnFQQBDCkiFAQBDCQYBAEMJBgEAQwjHwQBDEQgLQQBDDkaKQEcKigBUSAvF0UzATIjQDkEAQwuGwQBDDkaARwyI0A5BAEMNRgBHDI5T0dONUI1BgQBDCglJgQBDBhGIwQBDDwhBAEMID0oJAQBDB5AJh0ZHCdIAUMhJT0NTh8GBAEMIkAqGBMXJ04EAQxBQygYExcnTgQBDEUqKSIEAQxGJgQBDE0tBAEMTS0ZJEEGBAEMSjEaQkFDGBkcJ0gdITw1DTsGFykUEhkmKwQBTykpMyI6TDpNIh1FTkFPIyAjERUeJRchFhoEASwfGSIoKTMhKRwoGSU0Hh4wQiY6EiQrBAFKJTgnQSgqN0ouQjRJBAEmT0gKLB5LNAgBL0UxMhYPFTQGBAE+ThwiPwFOTBsRMSk5UQ8SFSIEAQwtIRwEAQwVGhQjBAEMSjAaEgQBDEIfGCcdCSkeGSYoMSIrDgZALAQBDBxRJB8qKAQBDE0pEQQBDD8nJwQBDD8pGAQBDEEnKQQBDEwtJy0zEBwEAQwgQSstBAEMQBg9FCcoBAEMRj8pARQnJwQBTAE2BlBGHyITFxchFjsEATQGUEZKKR0EAUcpHgosHksoCC83JzIyM1BNQRwqCCE+RCQtHkUWDxU0BgQBURkeKhY9DUxFBkYrBAFEPBkmLzxICAE7FkwPFk0IQFANNwY8LBgEAUMiGRMsJQ1MBjs8NxgEAUMjJRoNIhwLPCpMTk5IQzofPyYwDgwKKCUhBgQBRR9OIgYmSyAGBAEMP0BAMwQBDCEqBAFRICJCHEgvLEkuBhEEAUJNMD1BEwYbKBYIGgYRBAFLUUxPDUwZRzsfJw0vGxwPHAgGEwQBDDkwKwQCATVwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL2RpZXRfbGlzdGVuZXIuZGFydF9maWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2UvZGlldF9wYXJzZXIuZGFydIKzLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuZGlldF9wYXJzZXI7CgppbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbi5kYXJ0JyBzaG93IFRva2VuOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydCcKICAgIHNob3cgQ2xhc3NNZW1iZXJQYXJzZXIsIExpc3RlbmVyLCBNZW1iZXJLaW5kOwoKLy8gVE9ETyhhaGUpOiBNb3ZlIHRoaXMgdG8gcGFyc2VyIHBhY2thZ2UuCmNsYXNzIERpZXRQYXJzZXIgZXh0ZW5kcyBDbGFzc01lbWJlclBhcnNlciB7CiAgRGlldFBhcnNlcihMaXN0ZW5lciBsaXN0ZW5lcikgOiBzdXBlcihsaXN0ZW5lcik7CgogIFRva2VuIHBhcnNlRm9ybWFsUGFyYW1ldGVyc1Jlc3QoVG9rZW4gdG9rZW4sIE1lbWJlcktpbmQga2luZCkgewogICAgcmV0dXJuIHNraXBGb3JtYWxQYXJhbWV0ZXJzUmVzdCh0b2tlbiwga2luZCk7CiAgfQp9ChUATk48ARsBSAE8MgErLTMBQjIEAgEzcGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9kaWV0X3BhcnNlci5kYXJ0Z2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdGFudF9pbnRfZm9sZGVyLmRhcnSbPS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKCmltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3RhcmdldC90YXJnZXRzLmRhcnQnOwoKaW1wb3J0ICdjb25zdGFudF9ldmFsdWF0b3IuZGFydCc7CgppbXBvcnQgJy4uL2Zhc3RhX2NvZGVzLmRhcnQnCiAgICBzaG93IHRlbXBsYXRlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdCwgdGVtcGxhdGVDb25zdEV2YWxaZXJvRGl2aXNvcjsKCmFic3RyYWN0IGNsYXNzIENvbnN0YW50SW50Rm9sZGVyIHsKICBmaW5hbCBDb25zdGFudEV2YWx1YXRvciBldmFsdWF0b3I7CgogIENvbnN0YW50SW50Rm9sZGVyKHRoaXMuZXZhbHVhdG9yKTsKCiAgZmFjdG9yeSBDb25zdGFudEludEZvbGRlci5mb3JTZW1hbnRpY3MoCiAgICAgIENvbnN0YW50RXZhbHVhdG9yIGV2YWx1YXRvciwgTnVtYmVyU2VtYW50aWNzIHNlbWFudGljcykgewogICAgaWYgKHNlbWFudGljcyA9PSBOdW1iZXJTZW1hbnRpY3MuanMpIHsKICAgICAgcmV0dXJuIG5ldyBKc0NvbnN0YW50SW50Rm9sZGVyKGV2YWx1YXRvcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbmV3IFZtQ29uc3RhbnRJbnRGb2xkZXIoZXZhbHVhdG9yKTsKICAgIH0KICB9CgogIGJvb2wgaXNJbnQoQ29uc3RhbnQgY29uc3RhbnQpOwoKICBDb25zdGFudCBtYWtlSW50Q29uc3RhbnQoaW50IHZhbHVlLCB7Ym9vbCB1bnNpZ25lZDogZmFsc2V9KTsKCiAgQ29uc3RhbnQgZm9sZFVuYXJ5T3BlcmF0b3IoCiAgICAgIE1ldGhvZEludm9jYXRpb24gbm9kZSwgU3RyaW5nIG9wLCBjb3ZhcmlhbnQgQ29uc3RhbnQgb3BlcmFuZCk7CgogIENvbnN0YW50IGZvbGRCaW5hcnlPcGVyYXRvcihNZXRob2RJbnZvY2F0aW9uIG5vZGUsIFN0cmluZyBvcCwKICAgICAgY292YXJpYW50IENvbnN0YW50IGxlZnQsIGNvdmFyaWFudCBDb25zdGFudCByaWdodCk7CgogIENvbnN0YW50IHRydW5jYXRpbmdEaXZpZGUobnVtIGxlZnQsIG51bSByaWdodCk7CgogIHZvaWQgX2NoZWNrT3BlcmFuZHMoTWV0aG9kSW52b2NhdGlvbiBub2RlLCBTdHJpbmcgb3AsIG51bSBsZWZ0LCBudW0gcmlnaHQpIHsKICAgIGlmICgob3AgPT0gJzw8JyB8fCBvcCA9PSAnPj4nIHx8IG9wID09ICc+Pj4nKSAmJiByaWdodCA8IDApIHsKICAgICAgZXZhbHVhdG9yLnJlcG9ydChub2RlLAogICAgICAgICAgdGVtcGxhdGVDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0LndpdGhBcmd1bWVudHMob3AsICckbGVmdCcsICckcmlnaHQnKSk7CiAgICB9CiAgICBpZiAoKG9wID09ICclJyB8fCBvcCA9PSAnfi8nKSAmJiByaWdodCA9PSAwKSB7CiAgICAgIGV2YWx1YXRvci5yZXBvcnQoCiAgICAgICAgICBub2RlLCB0ZW1wbGF0ZUNvbnN0RXZhbFplcm9EaXZpc29yLndpdGhBcmd1bWVudHMob3AsICckbGVmdCcpKTsKICAgIH0KICB9Cn0KCmNsYXNzIFZtQ29uc3RhbnRJbnRGb2xkZXIgZXh0ZW5kcyBDb25zdGFudEludEZvbGRlciB7CiAgVm1Db25zdGFudEludEZvbGRlcihDb25zdGFudEV2YWx1YXRvciBldmFsdWF0b3IpIDogc3VwZXIoZXZhbHVhdG9yKTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludChDb25zdGFudCBjb25zdGFudCkgPT4gY29uc3RhbnQgaXMgSW50Q29uc3RhbnQ7CgogIEBvdmVycmlkZQogIEludENvbnN0YW50IG1ha2VJbnRDb25zdGFudChpbnQgdmFsdWUsIHtib29sIHVuc2lnbmVkOiBmYWxzZX0pIHsKICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnQodmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgZm9sZFVuYXJ5T3BlcmF0b3IoCiAgICAgIE1ldGhvZEludm9jYXRpb24gbm9kZSwgU3RyaW5nIG9wLCBJbnRDb25zdGFudCBvcGVyYW5kKSB7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJ3VuYXJ5LSc6CiAgICAgICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudCgtb3BlcmFuZC52YWx1ZSk7CiAgICAgIGNhc2UgJ34nOgogICAgICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnQofm9wZXJhbmQudmFsdWUpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBldmFsdWF0b3IucmVwb3J0SW52YWxpZChub2RlLCAiSW52YWxpZCB1bmFyeSBvcGVyYXRvciAkb3AiKTsKICAgIH0KICB9CgogIEBvdmVycmlkZQogIENvbnN0YW50IGZvbGRCaW5hcnlPcGVyYXRvcigKICAgICAgTWV0aG9kSW52b2NhdGlvbiBub2RlLCBTdHJpbmcgb3AsIEludENvbnN0YW50IGxlZnQsIEludENvbnN0YW50IHJpZ2h0KSB7CiAgICBpbnQgYSA9IGxlZnQudmFsdWU7CiAgICBpbnQgYiA9IHJpZ2h0LnZhbHVlOwogICAgX2NoZWNrT3BlcmFuZHMobm9kZSwgb3AsIGEsIGIpOwogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICcrJzoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KGEgKyBiKTsKICAgICAgY2FzZSAnLSc6CiAgICAgICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudChhIC0gYik7CiAgICAgIGNhc2UgJyonOgogICAgICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnQoYSAqIGIpOwogICAgICBjYXNlICcvJzoKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KGEgLyBiKTsKICAgICAgY2FzZSAnfi8nOgogICAgICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnQoYSB+LyBiKTsKICAgICAgY2FzZSAnJSc6CiAgICAgICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudChhICUgYik7CiAgICAgIGNhc2UgJ3wnOgogICAgICAgIHJldHVybiBuZXcgSW50Q29uc3RhbnQoYSB8IGIpOwogICAgICBjYXNlICcmJzoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KGEgJiBiKTsKICAgICAgY2FzZSAnXic6CiAgICAgICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudChhIF4gYik7CiAgICAgIGNhc2UgJzw8JzoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KGEgPDwgYik7CiAgICAgIGNhc2UgJz4+JzoKICAgICAgICByZXR1cm4gbmV3IEludENvbnN0YW50KGEgPj4gYik7CiAgICAgIGNhc2UgJz4+Pic6CiAgICAgICAgaW50IHJlc3VsdCA9IGIgPj0gNjQgPyAwIDogKGEgPj4gYikgJiAoKDEgPDwgKDY0IC0gYikpIC0gMSk7CiAgICAgICAgcmV0dXJuIG5ldyBJbnRDb25zdGFudChyZXN1bHQpOwogICAgICBjYXNlICc8JzoKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLm1ha2VCb29sQ29uc3RhbnQoYSA8IGIpOwogICAgICBjYXNlICc8PSc6CiAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5tYWtlQm9vbENvbnN0YW50KGEgPD0gYik7CiAgICAgIGNhc2UgJz49JzoKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLm1ha2VCb29sQ29uc3RhbnQoYSA+PSBiKTsKICAgICAgY2FzZSAnPic6CiAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5tYWtlQm9vbENvbnN0YW50KGEgPiBiKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLnJlcG9ydEludmFsaWQobm9kZSwgIkludmFsaWQgYmluYXJ5IG9wZXJhdG9yICRvcCIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgdHJ1bmNhdGluZ0RpdmlkZShudW0gbGVmdCwgbnVtIHJpZ2h0KSB7CiAgICByZXR1cm4gbmV3IEludENvbnN0YW50KGxlZnQgfi8gcmlnaHQpOwogIH0KfQoKY2xhc3MgSnNDb25zdGFudEludEZvbGRlciBleHRlbmRzIENvbnN0YW50SW50Rm9sZGVyIHsKICBKc0NvbnN0YW50SW50Rm9sZGVyKENvbnN0YW50RXZhbHVhdG9yIGV2YWx1YXRvcikgOiBzdXBlcihldmFsdWF0b3IpOwoKICBzdGF0aWMgYm9vbCBfdmFsdWVJc0ludGVnZXIoZG91YmxlIHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuaXNGaW5pdGUgJiYgdmFsdWUudHJ1bmNhdGVUb0RvdWJsZSgpID09IHZhbHVlOwogIH0KCiAgc3RhdGljIGludCBfdHJ1bmNhdGUzMihpbnQgdmFsdWUpID0+IHZhbHVlICYgMHhGRkZGRkZGRjsKCiAgc3RhdGljIGludCBfdG9VaW50MzIoZG91YmxlIHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IEJpZ0ludC5mcm9tKHZhbHVlKS50b1Vuc2lnbmVkKDMyKS50b0ludCgpOwogIH0KCiAgQG92ZXJyaWRlCiAgYm9vbCBpc0ludChDb25zdGFudCBjb25zdGFudCkgewogICAgcmV0dXJuIGNvbnN0YW50IGlzIERvdWJsZUNvbnN0YW50ICYmIF92YWx1ZUlzSW50ZWdlcihjb25zdGFudC52YWx1ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBEb3VibGVDb25zdGFudCBtYWtlSW50Q29uc3RhbnQoaW50IHZhbHVlLCB7Ym9vbCB1bnNpZ25lZDogZmFsc2V9KSB7CiAgICBkb3VibGUgZG91YmxlVmFsdWUgPSB2YWx1ZS50b0RvdWJsZSgpOwogICAgYXNzZXJ0KGRvdWJsZVZhbHVlLnRvSW50KCkgPT0gdmFsdWUpOwogICAgaWYgKHVuc2lnbmVkKSB7CiAgICAgIGNvbnN0IGRvdWJsZSB0d29UbzY0ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTYuMDsKICAgICAgaWYgKHZhbHVlIDwgMCkgZG91YmxlVmFsdWUgKz0gdHdvVG82NDsKICAgIH0KICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoZG91YmxlVmFsdWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgZm9sZFVuYXJ5T3BlcmF0b3IoCiAgICAgIE1ldGhvZEludm9jYXRpb24gbm9kZSwgU3RyaW5nIG9wLCBEb3VibGVDb25zdGFudCBvcGVyYW5kKSB7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJ3VuYXJ5LSc6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudCgtb3BlcmFuZC52YWx1ZSk7CiAgICAgIGNhc2UgJ34nOgogICAgICAgIGludCBpbnRWYWx1ZSA9IF90b1VpbnQzMihvcGVyYW5kLnZhbHVlKTsKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KF90cnVuY2F0ZTMyKH5pbnRWYWx1ZSkudG9Eb3VibGUoKSk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5yZXBvcnRJbnZhbGlkKG5vZGUsICJJbnZhbGlkIHVuYXJ5IG9wZXJhdG9yICRvcCIpOwogICAgfQogIH0KCiAgQG92ZXJyaWRlCiAgQ29uc3RhbnQgZm9sZEJpbmFyeU9wZXJhdG9yKE1ldGhvZEludm9jYXRpb24gbm9kZSwgU3RyaW5nIG9wLAogICAgICBEb3VibGVDb25zdGFudCBsZWZ0LCBEb3VibGVDb25zdGFudCByaWdodCkgewogICAgZG91YmxlIGEgPSBsZWZ0LnZhbHVlOwogICAgZG91YmxlIGIgPSByaWdodC52YWx1ZTsKICAgIF9jaGVja09wZXJhbmRzKG5vZGUsIG9wLCBhLCBiKTsKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAnKyc6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChhICsgYik7CiAgICAgIGNhc2UgJy0nOgogICAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoYSAtIGIpOwogICAgICBjYXNlICcqJzoKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KGEgKiBiKTsKICAgICAgY2FzZSAnLyc6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChhIC8gYik7CiAgICAgIGNhc2UgJ34vJzoKICAgICAgICByZXR1cm4gdHJ1bmNhdGluZ0RpdmlkZShhLCBiKTsKICAgICAgY2FzZSAnJSc6CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChhICUgYik7CiAgICAgIGNhc2UgJ3wnOgogICAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoKF90b1VpbnQzMihhKSB8IF90b1VpbnQzMihiKSkudG9Eb3VibGUoKSk7CiAgICAgIGNhc2UgJyYnOgogICAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoKF90b1VpbnQzMihhKSAmIF90b1VpbnQzMihiKSkudG9Eb3VibGUoKSk7CiAgICAgIGNhc2UgJ14nOgogICAgICAgIHJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQoKF90b1VpbnQzMihhKSBeIF90b1VpbnQzMihiKSkudG9Eb3VibGUoKSk7CiAgICAgIGNhc2UgJzw8JzoKICAgICAgICBpbnQgYWkgPSBfdG9VaW50MzIoYSk7CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChfdHJ1bmNhdGUzMihhaSA8PCBiLnRvSW50KCkpLnRvRG91YmxlKCkpOwogICAgICBjYXNlICc+Pic6CiAgICAgICAgaW50IGFpID0gX3RvVWludDMyKGEpOwogICAgICAgIGlmIChhIDwgMCkgewogICAgICAgICAgY29uc3QgaW50IHNpZ25CaXQgPSAweDgwMDAwMDAwOwogICAgICAgICAgYWkgLT0gKGFpICYgc2lnbkJpdCkgPDwgMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVDb25zdGFudChfdHJ1bmNhdGUzMihhaSA+PiBiLnRvSW50KCkpLnRvRG91YmxlKCkpOwogICAgICBjYXNlICc+Pj4nOgogICAgICAgIGludCBhaSA9IF90b1VpbnQzMihhKTsKICAgICAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KF90cnVuY2F0ZTMyKGFpID4+IGIudG9JbnQoKSkudG9Eb3VibGUoKSk7CiAgICAgIGNhc2UgJzwnOgogICAgICAgIHJldHVybiBldmFsdWF0b3IubWFrZUJvb2xDb25zdGFudChhIDwgYik7CiAgICAgIGNhc2UgJzw9JzoKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLm1ha2VCb29sQ29uc3RhbnQoYSA8PSBiKTsKICAgICAgY2FzZSAnPj0nOgogICAgICAgIHJldHVybiBldmFsdWF0b3IubWFrZUJvb2xDb25zdGFudChhID49IGIpOwogICAgICBjYXNlICc+JzoKICAgICAgICByZXR1cm4gZXZhbHVhdG9yLm1ha2VCb29sQ29uc3RhbnQoYSA+IGIpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBldmFsdWF0b3IucmVwb3J0SW52YWxpZChub2RlLCAiSW52YWxpZCBiaW5hcnkgb3BlcmF0b3IgJG9wIik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICBDb25zdGFudCB0cnVuY2F0aW5nRGl2aWRlKG51bSBsZWZ0LCBudW0gcmlnaHQpIHsKICAgIGRvdWJsZSByZXN1bHQgPSAobGVmdCAvIHJpZ2h0KS50cnVuY2F0ZVRvRG91YmxlKCk7CiAgICByZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHJlc3VsdCA9PSAwLjAgPyAwLjAgOiByZXN1bHQpOwogIH0KfQqA5QBOTjwBIgEiLQEiAR1HASMlASUBKkArMQ0xBgQBIQE/AR5FAUA6ATIBT0IdUAYzGEoGBAIBNkcBDDwBDEMjBAEMHj8SFTAQMA9MBgQBDB9PGBkkEhAnECcQJxAqESgQJxAnECcQJxEoESgSRSgQMhEzETMQMg9NBgQBDDMrBAIBNkcBLkAEATsBJzoEAQwiSgQBDEYrKhQ1LQYsBAEMHkISFTMQMUYPTAYEAQxAMxscJBIQKhAqECoQKhEnECoQTRBNEE0RH0wRHxUqJQpMEh9MEDIRMxEzEDIPTQYEAQwzNz0EAgE7cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9jb25zdGFudF9pbnRfZm9sZGVyLmRhcnRmZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9hc3luY19tb2RpZmllci5kYXJ0gU4vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSBfZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlci5hc3luY19tb2RpZmllcjsKCmVudW0gQXN5bmNNb2RpZmllciB7CiAgU3luYywKICBTeW5jU3RhciwKICBBc3luYywKICBBc3luY1N0YXIsCn0KDgBOTjwBMwEVCAwJDQIBOnBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2FzeW5jX21vZGlmaWVyLmRhcnRpZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9kaXJlY3RpdmVfY29udGV4dC5kYXJ0jMkvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9tZXNzYWdlcy9jb2Rlcy5kYXJ0JzsKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnOwppbXBvcnQgJ3BhcnNlcl9pbXBsLmRhcnQnOwoKY2xhc3MgRGlyZWN0aXZlQ29udGV4dCB7CiAgRGlyZWN0aXZlU3RhdGUgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5Vbmtub3duOwoKICB2b2lkIGNoZWNrU2NyaXB0VGFnKFBhcnNlciBwYXJzZXIsIFRva2VuIHRva2VuKSB7CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuVW5rbm93bikgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLlNjcmlwdDsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVGhlIHNjYW5uZXIgb25seSBwcm9kdWNlcyB0aGUgU0NSSVBUX1RBRwogICAgLy8gd2hlbiBpdCBpcyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGZpbGUuCiAgICB0aHJvdyAiSW50ZXJuYWwgZXJyb3I6IFVuZXhwZWN0ZWQgc2NyaXB0IHRhZy4iOwogIH0KCiAgdm9pZCBjaGVja0RlY2xhcmF0aW9uKCkgewogICAgaWYgKHN0YXRlICE9IERpcmVjdGl2ZVN0YXRlLlBhcnRPZikgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLkRlY2xhcmF0aW9uczsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tFeHBvcnQoUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZS5pbmRleCA8PSBEaXJlY3RpdmVTdGF0ZS5JbXBvcnRBbmRFeHBvcnQuaW5kZXgpIHsKICAgICAgc3RhdGUgPSBEaXJlY3RpdmVTdGF0ZS5JbXBvcnRBbmRFeHBvcnQ7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZUV4cG9ydEFmdGVyUGFydCk7CiAgICB9IGVsc2UgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnRPZikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydCk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb24pOwogICAgfQogIH0KCiAgdm9pZCBjaGVja0ltcG9ydChQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlLmluZGV4IDw9IERpcmVjdGl2ZVN0YXRlLkltcG9ydEFuZEV4cG9ydC5pbmRleCkgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLkltcG9ydEFuZEV4cG9ydDsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0KSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlSW1wb3J0QWZ0ZXJQYXJ0KTsKICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuUGFydE9mKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlRGlyZWN0aXZlQWZ0ZXJEZWNsYXJhdGlvbik7CiAgICB9CiAgfQoKICB2b2lkIGNoZWNrTGlicmFyeShQYXJzZXIgcGFyc2VyLCBUb2tlbiB0b2tlbikgewogICAgaWYgKHN0YXRlLmluZGV4IDwgRGlyZWN0aXZlU3RhdGUuTGlicmFyeS5pbmRleCkgewogICAgICBzdGF0ZSA9IERpcmVjdGl2ZVN0YXRlLkxpYnJhcnk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoc3RhdGUgPT0gRGlyZWN0aXZlU3RhdGUuTGlicmFyeSkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXMpOwogICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2YpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3QpOwogICAgfQogIH0KCiAgdm9pZCBjaGVja1BhcnQoUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZS5pbmRleCA8PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0LmluZGV4KSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuUGFydDsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5QYXJ0T2YpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnQpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4sIG1lc3NhZ2VEaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9uKTsKICAgIH0KICB9CgogIHZvaWQgY2hlY2tQYXJ0T2YoUGFyc2VyIHBhcnNlciwgVG9rZW4gdG9rZW4pIHsKICAgIGlmIChzdGF0ZSA9PSBEaXJlY3RpdmVTdGF0ZS5Vbmtub3duKSB7CiAgICAgIHN0YXRlID0gRGlyZWN0aXZlU3RhdGUuUGFydE9mOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWNvdmVyeQogICAgaWYgKHN0YXRlID09IERpcmVjdGl2ZVN0YXRlLlBhcnRPZikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcih0b2tlbiwgbWVzc2FnZVBhcnRPZlR3aWNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKHRva2VuLCBtZXNzYWdlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KTsKICAgIH0KICB9Cn0KCmVudW0gRGlyZWN0aXZlU3RhdGUgewogIFVua25vd24sCiAgU2NyaXB0LAogIExpYnJhcnksCiAgSW1wb3J0QW5kRXhwb3J0LAogIFBhcnQsCiAgUGFydE9mLAogIERlY2xhcmF0aW9ucywKfQpuAE5OPAEhIBsBGTEBNCslDgYwLzQEARwqKwYEATE/Lg4GEChEMU0NTgYEATE/Lg4GEChEMU0NTgYEATI2Jg4GECtOMU0NTQYEAS80Iw4GECpNDU4GBAExKyUOBhAqQA1NBgQCARYLCgsTCAoQAgE9cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvZGlyZWN0aXZlX2NvbnRleHQuZGFydGtmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL2ZvcndhcmRpbmdfbGlzdGVuZXIuZGFydMAAmiUvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9tZXNzYWdlcy9jb2Rlcy5kYXJ0JzsKaW1wb3J0ICcuLi9zY2FubmVyL3NjYW5uZXIuZGFydCc7CmltcG9ydCAncGFyc2VyLmRhcnQnOwoKY2xhc3MgRm9yd2FyZGluZ0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewogIExpc3RlbmVyIGxpc3RlbmVyOwogIGJvb2wgZm9yd2FyZEVycm9ycyA9IHRydWU7CgogIEZvcndhcmRpbmdMaXN0ZW5lcihbdGhpcy5saXN0ZW5lcl0pOwoKICBAb3ZlcnJpZGUKICBzZXQgc3VwcHJlc3NQYXJzZUVycm9ycyhib29sIHZhbHVlKSB7CiAgICBsaXN0ZW5lcj8uc3VwcHJlc3NQYXJzZUVycm9ycyA9IHZhbHVlOwogIH0KCiAgQG92ZXJyaWRlCiAgVXJpIGdldCB1cmkgPT4gbGlzdGVuZXI/LnVyaTsKCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Bc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkFzc2VydChhc3NlcnRLZXl3b3JkLCBraW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Bd2FpdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkF3YWl0RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmluYXJ5RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQmluYXJ5RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQmxvY2soVG9rZW4gdG9rZW4sIEJsb2NrS2luZCBibG9ja0tpbmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkJsb2NrKHRva2VuLCBibG9ja0tpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkJsb2NrRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5CbG9ja0Z1bmN0aW9uQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2FzY2FkZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2FzY2FkZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ2FzZUV4cHJlc3Npb24oVG9rZW4gY2FzZUtleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNhc2VFeHByZXNzaW9uKGNhc2VLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DYXRjaENsYXVzZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2F0Y2hDbGF1c2UodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNsYXNzRGVjbGFyYXRpb24oVG9rZW4gYmVnaW4sIFRva2VuIGFic3RyYWN0VG9rZW4sIFRva2VuIG5hbWUpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNsYXNzRGVjbGFyYXRpb24oYmVnaW4sIGFic3RyYWN0VG9rZW4sIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNsYXNzT3JNaXhpbkJvZHkoRGVjbGFyYXRpb25LaW5kIGtpbmQsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5DbGFzc09yTWl4aW5Cb2R5KGtpbmQsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uUHJlbHVkZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ2xhc3NPck5hbWVkTWl4aW5BcHBsaWNhdGlvblByZWx1ZGUodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbWJpbmF0b3JzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db21iaW5hdG9ycyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29tcGlsYXRpb25Vbml0KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db21waWxhdGlvblVuaXQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihUb2tlbiBxdWVzdGlvbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ29uZGl0aW9uYWxFeHByZXNzaW9uKHF1ZXN0aW9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbmRpdGlvbmFsVXJpKGlmS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luQ29uZGl0aW9uYWxVcmlzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Db25kaXRpb25hbFVyaXModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbnN0RXhwcmVzc2lvbihUb2tlbiBjb25zdEtleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5iZWdpbkNvbnN0RXhwcmVzc2lvbihjb25zdEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkNvbnN0TGl0ZXJhbChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luQ29uc3RMaXRlcmFsKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Db25zdHJ1Y3RvclJlZmVyZW5jZShUb2tlbiBzdGFydCkgewogICAgbGlzdGVuZXI/LmJlZ2luQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3RhcnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkRvV2hpbGVTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkRvV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRWxzZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRWxzZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRW51bShUb2tlbiBlbnVtS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luRW51bShlbnVtS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXhwb3J0KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5FeHBvcnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkV4dGVuc2lvbkRlY2xhcmF0aW9uUHJlbHVkZShUb2tlbiBleHRlbnNpb25LZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5FeHRlbnNpb25EZWNsYXJhdGlvblByZWx1ZGUoZXh0ZW5zaW9uS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb24oVG9rZW4gZXh0ZW5zaW9uS2V5d29yZCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb24oZXh0ZW5zaW9uS2V5d29yZCwgbmFtZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gbGFzdENvbnN1bWVkLCBUb2tlbiBleHRlcm5hbFRva2VuLCBUb2tlbiBjb25zdFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GYWN0b3J5TWV0aG9kKGxhc3RDb25zdW1lZCwgZXh0ZXJuYWxUb2tlbiwgY29uc3RUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRmllbGRJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRmllbGRJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yQ29udHJvbEZsb3coVG9rZW4gYXdhaXRUb2tlbiwgVG9rZW4gZm9yVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvckNvbnRyb2xGbG93KGF3YWl0VG9rZW4sIGZvclRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JJbkJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvckluQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JJbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kLCBUb2tlbiByZXF1aXJlZFRva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXIoCiAgICAgICAgdG9rZW4sIGtpbmQsIHJlcXVpcmVkVG9rZW4sIGNvdmFyaWFudFRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9ybWFsUGFyYW1ldGVycyhUb2tlbiB0b2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Gb3JtYWxQYXJhbWV0ZXJzKHRva2VuLCBraW5kKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Gb3JTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkZvclN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRm9yU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRm9yU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GdW5jdGlvbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uTmFtZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25OYW1lKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5GdW5jdGlvblR5cGUoVG9rZW4gYmVnaW5Ub2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25UeXBlKGJlZ2luVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkZ1bmN0aW9uVHlwZUFsaWFzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5GdW5jdGlvblR5cGVBbGlhcyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luSGlkZShoaWRlS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSWZDb250cm9sRmxvdyhUb2tlbiBpZlRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5JZkNvbnRyb2xGbG93KGlmVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbklmU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5JZlN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5JbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmJlZ2luSW1wb3J0KGltcG9ydEtleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZWRJZGVudGlmaWVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Jbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZXIodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbkluaXRpYWxpemVycyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luSW5pdGlhbGl6ZXJzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MYWJlbGVkU3RhdGVtZW50KFRva2VuIHRva2VuLCBpbnQgbGFiZWxDb3VudCkgewogICAgbGlzdGVuZXI/LmJlZ2luTGFiZWxlZFN0YXRlbWVudCh0b2tlbiwgbGFiZWxDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTGlicmFyeU5hbWUoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkxpYnJhcnlOYW1lKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3RyaW5nKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5MaXRlcmFsU3RyaW5nKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5MaXRlcmFsU3ltYm9sKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5MaXRlcmFsU3ltYm9sKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Mb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWVtYmVyKCkgewogICAgbGlzdGVuZXI/LmJlZ2luTWVtYmVyKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWV0YWRhdGEoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk1ldGFkYXRhKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NZXRhZGF0YVN0YXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk1ldGFkYXRhU3Rhcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTWV0aG9kKFRva2VuIGV4dGVybmFsVG9rZW4sIFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gdmFyRmluYWxPckNvbnN0LCBUb2tlbiBnZXRPclNldCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luTWV0aG9kKGV4dGVybmFsVG9rZW4sIHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGdldE9yU2V0LCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5NaXhpbkRlY2xhcmF0aW9uKFRva2VuIG1peGluS2V5d29yZCwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luTWl4aW5EZWNsYXJhdGlvbihtaXhpbktleXdvcmQsIG5hbWUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbk5hbWVkRnVuY3Rpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5OYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKAogICAgICBUb2tlbiBiZWdpbiwgVG9rZW4gYWJzdHJhY3RUb2tlbiwgVG9rZW4gbmFtZSkgewogICAgbGlzdGVuZXI/LmJlZ2luTmFtZWRNaXhpbkFwcGxpY2F0aW9uKGJlZ2luLCBhYnN0cmFjdFRva2VuLCBuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5OZXdFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5OZXdFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5PcHRpb25hbEZvcm1hbFBhcmFtZXRlcnMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVycyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUGFydChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luUGFydCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luUGFydE9mKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5QYXJ0T2YodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblJlZGlyZWN0aW5nRmFjdG9yeUJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblJldGhyb3dTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblJldGhyb3dTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblJldHVyblN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luUmV0dXJuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5TaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5TaG93KHNob3dLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hCbG9jayhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luU3dpdGNoQmxvY2sodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblN3aXRjaENhc2UoaW50IGxhYmVsQ291bnQsIGludCBleHByZXNzaW9uQ291bnQsIFRva2VuIGZpcnN0VG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblN3aXRjaENhc2UobGFiZWxDb3VudCwgZXhwcmVzc2lvbkNvdW50LCBmaXJzdFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5Td2l0Y2hTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblN3aXRjaFN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVGhlbkNvbnRyb2xGbG93KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UaGVuQ29udHJvbEZsb3codG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5iZWdpblRoZW5TdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRvcExldmVsTWVtYmVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Ub3BMZXZlbE1lbWJlcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luVG9wTGV2ZWxNZXRob2QoVG9rZW4gbGFzdENvbnN1bWVkLCBUb2tlbiBleHRlcm5hbFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5Ub3BMZXZlbE1ldGhvZChsYXN0Q29uc3VtZWQsIGV4dGVybmFsVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblRyeVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHJ5U3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UeXBlQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlTGlzdChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHlwZUxpc3QodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpblR5cGVWYXJpYWJsZShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmJlZ2luVHlwZVZhcmlhYmxlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5UeXBlVmFyaWFibGVzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5UeXBlVmFyaWFibGVzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5WYXJpYWJsZUluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5WYXJpYWJsZUluaXRpYWxpemVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbigKICAgICAgVG9rZW4gdG9rZW4sIFRva2VuIGxhdGVUb2tlbiwgVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5WYXJpYWJsZXNEZWNsYXJhdGlvbih0b2tlbiwgbGF0ZVRva2VuLCB2YXJGaW5hbE9yQ29uc3QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbldoaWxlU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5XaGlsZVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGJlZ2luV2hpbGVTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5XaGlsZVN0YXRlbWVudEJvZHkodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBiZWdpbllpZWxkU3RhdGVtZW50KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uYmVnaW5ZaWVsZFN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGRpc2NhcmRUeXBlUmVwbGFjZWRXaXRoQ29tbWVudFR5cGVBc3NpZ24oKSB7CiAgICBsaXN0ZW5lcj8uZGlzY2FyZFR5cGVSZXBsYWNlZFdpdGhDb21tZW50VHlwZUFzc2lnbigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEFyZ3VtZW50cyhjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRBc3NlcnQoVG9rZW4gYXNzZXJ0S2V5d29yZCwgQXNzZXJ0IGtpbmQsIFRva2VuIGxlZnRQYXJlbnRoZXNpcywKICAgICAgVG9rZW4gY29tbWFUb2tlbiwgVG9rZW4gc2VtaWNvbG9uVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRBc3NlcnQoCiAgICAgICAgYXNzZXJ0S2V5d29yZCwga2luZCwgbGVmdFBhcmVudGhlc2lzLCBjb21tYVRva2VuLCBzZW1pY29sb25Ub2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEF3YWl0RXhwcmVzc2lvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEF3YWl0RXhwcmVzc2lvbihiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJpbmFyeUV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRCaW5hcnlFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQmxvY2soCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4sIEJsb2NrS2luZCBibG9ja0tpbmQpIHsKICAgIGxpc3RlbmVyPy5lbmRCbG9jayhjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4sIGJsb2NrS2luZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEJsb2NrRnVuY3Rpb25Cb2R5KGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRCbG9ja0Z1bmN0aW9uQm9keShjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDYXNjYWRlKCkgewogICAgbGlzdGVuZXI/LmVuZENhc2NhZGUoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2FzZUV4cHJlc3Npb24oVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5lbmRDYXNlRXhwcmVzc2lvbihjb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENhdGNoQ2xhdXNlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ2F0Y2hDbGF1c2UodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc0NvbnN0cnVjdG9yKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDbGFzc0NvbnN0cnVjdG9yKAogICAgICAgIGdldE9yU2V0LCBiZWdpblRva2VuLCBiZWdpblBhcmFtLCBiZWdpbkluaXRpYWxpemVycywgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDbGFzc0RlY2xhcmF0aW9uKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ2xhc3NEZWNsYXJhdGlvbihiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ2xhc3NGYWN0b3J5TWV0aG9kKGJlZ2luVG9rZW4sIGZhY3RvcnlLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDbGFzc0ZpZWxkcyhzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIGxhdGVUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENsYXNzTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDbGFzc01ldGhvZCgKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ2xhc3NPck1peGluQm9keSgKICAgICAgRGVjbGFyYXRpb25LaW5kIGtpbmQsIGludCBtZW1iZXJDb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDbGFzc09yTWl4aW5Cb2R5KGtpbmQsIG1lbWJlckNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbWJpbmF0b3JzKGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmVuZENvbWJpbmF0b3JzKGNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29tcGlsYXRpb25Vbml0KGludCBjb3VudCwgVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb21waWxhdGlvblVuaXQoY291bnQsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uKFRva2VuIHF1ZXN0aW9uLCBUb2tlbiBjb2xvbikgewogICAgbGlzdGVuZXI/LmVuZENvbmRpdGlvbmFsRXhwcmVzc2lvbihxdWVzdGlvbiwgY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25kaXRpb25hbFVyaShUb2tlbiBpZktleXdvcmQsIFRva2VuIGxlZnRQYXJlbiwgVG9rZW4gZXF1YWxTaWduKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ29uZGl0aW9uYWxVcmkoaWZLZXl3b3JkLCBsZWZ0UGFyZW4sIGVxdWFsU2lnbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZENvbmRpdGlvbmFsVXJpcyhpbnQgY291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRDb25kaXRpb25hbFVyaXMoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdEV4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25zdEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdExpdGVyYWwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRDb25zdExpdGVyYWwodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKICAgICAgVG9rZW4gc3RhcnQsIFRva2VuIHBlcmlvZEJlZm9yZU5hbWUsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3RhcnQsIHBlcmlvZEJlZm9yZU5hbWUsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRG9XaGlsZVN0YXRlbWVudCgKICAgICAgVG9rZW4gZG9LZXl3b3JkLCBUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRG9XaGlsZVN0YXRlbWVudChkb0tleXdvcmQsIHdoaWxlS2V5d29yZCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmREb1doaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZERvV2hpbGVTdGF0ZW1lbnRCb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRWxzZVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEVsc2VTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFbnVtKFRva2VuIGVudW1LZXl3b3JkLCBUb2tlbiBsZWZ0QnJhY2UsIGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmVuZEVudW0oZW51bUtleXdvcmQsIGxlZnRCcmFjZSwgY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHBvcnQoVG9rZW4gZXhwb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kRXhwb3J0KGV4cG9ydEtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEV4dGVuc2lvbkNvbnN0cnVjdG9yKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLAogICAgICBUb2tlbiBiZWdpblBhcmFtLCBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRFeHRlbnNpb25Db25zdHJ1Y3RvcigKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXh0ZW5zaW9uRGVjbGFyYXRpb24oCiAgICAgIFRva2VuIGV4dGVuc2lvbktleXdvcmQsIFRva2VuIG9uS2V5d29yZCwgVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRFeHRlbnNpb25EZWNsYXJhdGlvbihleHRlbnNpb25LZXl3b3JkLCBvbktleXdvcmQsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRXh0ZW5zaW9uRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRXh0ZW5zaW9uRmFjdG9yeU1ldGhvZChiZWdpblRva2VuLCBmYWN0b3J5S2V5d29yZCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHRlbnNpb25GaWVsZHMoCiAgICAgIFRva2VuIHN0YXRpY1Rva2VuLAogICAgICBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwKICAgICAgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsCiAgICAgIGludCBjb3VudCwKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRFeHRlbnNpb25GaWVsZHMoc3RhdGljVG9rZW4sIGNvdmFyaWFudFRva2VuLCBsYXRlVG9rZW4sCiAgICAgICAgdmFyRmluYWxPckNvbnN0LCBjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRFeHRlbnNpb25NZXRob2QoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sCiAgICAgIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZEV4dGVuc2lvbk1ldGhvZCgKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRmllbGRJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50LCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZpZWxkSW5pdGlhbGl6ZXIoYXNzaWdubWVudCwgdG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JDb250cm9sRmxvdyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckNvbnRyb2xGbG93KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW4oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JJbihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZvckluQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZvckluQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JJbkNvbnRyb2xGbG93KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ySW5FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ySW5FeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVyKAogICAgICBUb2tlbiB0aGlzS2V5d29yZCwKICAgICAgVG9rZW4gcGVyaW9kQWZ0ZXJUaGlzLAogICAgICBUb2tlbiBuYW1lVG9rZW4sCiAgICAgIFRva2VuIGluaXRpYWxpemVyU3RhcnQsCiAgICAgIFRva2VuIGluaXRpYWxpemVyRW5kLAogICAgICBGb3JtYWxQYXJhbWV0ZXJLaW5kIGtpbmQsCiAgICAgIE1lbWJlcktpbmQgbWVtYmVyS2luZCkgewogICAgbGlzdGVuZXI/LmVuZEZvcm1hbFBhcmFtZXRlcih0aGlzS2V5d29yZCwgcGVyaW9kQWZ0ZXJUaGlzLCBuYW1lVG9rZW4sCiAgICAgICAgaW5pdGlhbGl6ZXJTdGFydCwgaW5pdGlhbGl6ZXJFbmQsIGtpbmQsIG1lbWJlcktpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uKCkgewogICAgbGlzdGVuZXI/LmVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRm9ybWFsUGFyYW1ldGVycygKICAgICAgaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbiwgTWVtYmVyS2luZCBraW5kKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9ybWFsUGFyYW1ldGVycyhjb3VudCwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4sIGtpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JTdGF0ZW1lbnQoVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRGb3JTdGF0ZW1lbnQoZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGb3JTdGF0ZW1lbnRCb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRm9yU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbiBiZWdpblRva2VuLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uRXhwcmVzc2lvbihiZWdpblRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uTmFtZShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZEZ1bmN0aW9uTmFtZShiZWdpblRva2VuLCB0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEZ1bmN0aW9uVHlwZShUb2tlbiBmdW5jdGlvblRva2VuLCBUb2tlbiBxdWVzdGlvbk1hcmspIHsKICAgIGxpc3RlbmVyPy5lbmRGdW5jdGlvblR5cGUoZnVuY3Rpb25Ub2tlbiwgcXVlc3Rpb25NYXJrKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kRnVuY3Rpb25UeXBlQWxpYXMoCiAgICAgIFRva2VuIHR5cGVkZWZLZXl3b3JkLCBUb2tlbiBlcXVhbHMsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kRnVuY3Rpb25UeXBlQWxpYXModHlwZWRlZktleXdvcmQsIGVxdWFscywgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyKFRva2VuIG5hbWVUb2tlbiwgVG9rZW4gcXVlc3Rpb24pIHsKICAgIGxpc3RlbmVyPy5lbmRGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyKG5hbWVUb2tlbiwgcXVlc3Rpb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRIaWRlKFRva2VuIGhpZGVLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uZW5kSGlkZShoaWRlS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJZkNvbnRyb2xGbG93KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSWZFbHNlQ29udHJvbEZsb3coVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJZkVsc2VDb250cm9sRmxvdyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZElmU3RhdGVtZW50KFRva2VuIGlmVG9rZW4sIFRva2VuIGVsc2VUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZElmU3RhdGVtZW50KGlmVG9rZW4sIGVsc2VUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEltcGxpY2l0Q3JlYXRpb25FeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRJbXBvcnQoVG9rZW4gaW1wb3J0S2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uZW5kSW1wb3J0KGltcG9ydEtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVkSWRlbnRpZmllcihUb2tlbiBuYW1lVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbml0aWFsaXplZElkZW50aWZpZXIobmFtZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kSW5pdGlhbGl6ZXIoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEluaXRpYWxpemVycyhpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kSW5pdGlhbGl6ZXJzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZEludmFsaWRBd2FpdEV4cHJlc3Npb24oCiAgICAgIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuLCBNZXNzYWdlQ29kZSBlcnJvckNvZGUpIHsKICAgIGxpc3RlbmVyPy5lbmRJbnZhbGlkQXdhaXRFeHByZXNzaW9uKGJlZ2luVG9rZW4sIGVuZFRva2VuLCBlcnJvckNvZGUpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMYWJlbGVkU3RhdGVtZW50KGludCBsYWJlbENvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kTGFiZWxlZFN0YXRlbWVudChsYWJlbENvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGlicmFyeU5hbWUoVG9rZW4gbGlicmFyeUtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmVuZExpYnJhcnlOYW1lKGxpYnJhcnlLZXl3b3JkLCBzZW1pY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRMaXRlcmFsU3RyaW5nKGludCBpbnRlcnBvbGF0aW9uQ291bnQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kTGl0ZXJhbFN0cmluZyhpbnRlcnBvbGF0aW9uQ291bnQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTGl0ZXJhbFN5bWJvbChUb2tlbiBoYXNoVG9rZW4sIGludCBpZGVudGlmaWVyQ291bnQpIHsKICAgIGxpc3RlbmVyPy5lbmRMaXRlcmFsU3ltYm9sKGhhc2hUb2tlbiwgaWRlbnRpZmllckNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kTG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uKGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWVtYmVyKCkgewogICAgbGlzdGVuZXI/LmVuZE1lbWJlcigpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRNZXRhZGF0YShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBwZXJpb2RCZWZvcmVOYW1lLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE1ldGFkYXRhKGJlZ2luVG9rZW4sIHBlcmlvZEJlZm9yZU5hbWUsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTWV0YWRhdGFTdGFyKGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmVuZE1ldGFkYXRhU3Rhcihjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluQ29uc3RydWN0b3IoVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGJlZ2luUGFyYW0sCiAgICAgIFRva2VuIGJlZ2luSW5pdGlhbGl6ZXJzLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE1peGluQ29uc3RydWN0b3IoCiAgICAgICAgZ2V0T3JTZXQsIGJlZ2luVG9rZW4sIGJlZ2luUGFyYW0sIGJlZ2luSW5pdGlhbGl6ZXJzLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluRGVjbGFyYXRpb24oVG9rZW4gbWl4aW5LZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE1peGluRGVjbGFyYXRpb24obWl4aW5LZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluRmFjdG9yeU1ldGhvZCgKICAgICAgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZmFjdG9yeUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kTWl4aW5GYWN0b3J5TWV0aG9kKGJlZ2luVG9rZW4sIGZhY3RvcnlLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluRmllbGRzKFRva2VuIHN0YXRpY1Rva2VuLCBUb2tlbiBjb3ZhcmlhbnRUb2tlbiwgVG9rZW4gbGF0ZVRva2VuLAogICAgICBUb2tlbiB2YXJGaW5hbE9yQ29uc3QsIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRNaXhpbkZpZWxkcyhzdGF0aWNUb2tlbiwgY292YXJpYW50VG9rZW4sIGxhdGVUb2tlbiwKICAgICAgICB2YXJGaW5hbE9yQ29uc3QsIGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE1peGluTWV0aG9kKFRva2VuIGdldE9yU2V0LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBiZWdpblBhcmFtLAogICAgICBUb2tlbiBiZWdpbkluaXRpYWxpemVycywgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRNaXhpbk1ldGhvZCgKICAgICAgICBnZXRPclNldCwgYmVnaW5Ub2tlbiwgYmVnaW5QYXJhbSwgYmVnaW5Jbml0aWFsaXplcnMsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kTmFtZWRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbihlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbihUb2tlbiBiZWdpbiwgVG9rZW4gY2xhc3NLZXl3b3JkLCBUb2tlbiBlcXVhbHMsCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbigKICAgICAgICBiZWdpbiwgY2xhc3NLZXl3b3JkLCBlcXVhbHMsIGltcGxlbWVudHNLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZE5ld0V4cHJlc3Npb24oVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmROZXdFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKAogICAgICBpbnQgY291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzKGNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnQoVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmVuZFBhcnQocGFydEtleXdvcmQsIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFBhcnRPZigKICAgICAgVG9rZW4gcGFydEtleXdvcmQsIFRva2VuIG9mS2V5d29yZCwgVG9rZW4gc2VtaWNvbG9uLCBib29sIGhhc05hbWUpIHsKICAgIGxpc3RlbmVyPy5lbmRQYXJ0T2YocGFydEtleXdvcmQsIG9mS2V5d29yZCwgc2VtaWNvbG9uLCBoYXNOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keShUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHkoYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXRocm93U3RhdGVtZW50KFRva2VuIHJldGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRSZXRocm93U3RhdGVtZW50KHJldGhyb3dUb2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRSZXR1cm5TdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbiwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRSZXR1cm5TdGF0ZW1lbnQoaGFzRXhwcmVzc2lvbiwgYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uZW5kU2hvdyhzaG93S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaEJsb2NrKGludCBjYXNlQ291bnQsIFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kU3dpdGNoQmxvY2soY2FzZUNvdW50LCBiZWdpblRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaENhc2UoCiAgICAgIGludCBsYWJlbENvdW50LAogICAgICBpbnQgZXhwcmVzc2lvbkNvdW50LAogICAgICBUb2tlbiBkZWZhdWx0S2V5d29yZCwKICAgICAgVG9rZW4gY29sb25BZnRlckRlZmF1bHQsCiAgICAgIGludCBzdGF0ZW1lbnRDb3VudCwKICAgICAgVG9rZW4gZmlyc3RUb2tlbiwKICAgICAgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRTd2l0Y2hDYXNlKGxhYmVsQ291bnQsIGV4cHJlc3Npb25Db3VudCwgZGVmYXVsdEtleXdvcmQsCiAgICAgICAgY29sb25BZnRlckRlZmF1bHQsIHN0YXRlbWVudENvdW50LCBmaXJzdFRva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFN3aXRjaFN0YXRlbWVudChUb2tlbiBzd2l0Y2hLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFN3aXRjaFN0YXRlbWVudChzd2l0Y2hLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFRoZW5TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRUaGVuU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZFRvcExldmVsRGVjbGFyYXRpb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUb3BMZXZlbEZpZWxkcygKICAgICAgVG9rZW4gc3RhdGljVG9rZW4sCiAgICAgIFRva2VuIGNvdmFyaWFudFRva2VuLAogICAgICBUb2tlbiBsYXRlVG9rZW4sCiAgICAgIFRva2VuIHZhckZpbmFsT3JDb25zdCwKICAgICAgaW50IGNvdW50LAogICAgICBUb2tlbiBiZWdpblRva2VuLAogICAgICBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFRvcExldmVsRmllbGRzKHN0YXRpY1Rva2VuLCBjb3ZhcmlhbnRUb2tlbiwgbGF0ZVRva2VuLAogICAgICAgIHZhckZpbmFsT3JDb25zdCwgY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVG9wTGV2ZWxNZXRob2QoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZ2V0T3JTZXQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kVG9wTGV2ZWxNZXRob2QoYmVnaW5Ub2tlbiwgZ2V0T3JTZXQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHJ5U3RhdGVtZW50KGludCBjYXRjaENvdW50LCBUb2tlbiB0cnlLZXl3b3JkLCBUb2tlbiBmaW5hbGx5S2V5d29yZCkgewogICAgbGlzdGVuZXI/LmVuZFRyeVN0YXRlbWVudChjYXRjaENvdW50LCB0cnlLZXl3b3JkLCBmaW5hbGx5S2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVBcmd1bWVudHMoaW50IGNvdW50LCBUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmVuZFR5cGVBcmd1bWVudHMoY291bnQsIGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVHlwZUxpc3QoaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uZW5kVHlwZUxpc3QoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRUeXBlVmFyaWFibGUoCiAgICAgIFRva2VuIHRva2VuLCBpbnQgaW5kZXgsIFRva2VuIGV4dGVuZHNPclN1cGVyLCBUb2tlbiB2YXJpYW5jZSkgewogICAgbGlzdGVuZXI/LmVuZFR5cGVWYXJpYWJsZSh0b2tlbiwgaW5kZXgsIGV4dGVuZHNPclN1cGVyLCB2YXJpYW5jZSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFR5cGVWYXJpYWJsZXMoVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRUeXBlVmFyaWFibGVzKGJlZ2luVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgZW5kVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiBhc3NpZ25tZW50T3BlcmF0b3IpIHsKICAgIGxpc3RlbmVyPy5lbmRWYXJpYWJsZUluaXRpYWxpemVyKGFzc2lnbm1lbnRPcGVyYXRvcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uKGludCBjb3VudCwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRWYXJpYWJsZXNEZWNsYXJhdGlvbihjb3VudCwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBlbmRXaGlsZVN0YXRlbWVudChUb2tlbiB3aGlsZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uZW5kV2hpbGVTdGF0ZW1lbnQod2hpbGVLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFdoaWxlU3RhdGVtZW50Qm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmVuZFdoaWxlU3RhdGVtZW50Qm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGVuZFlpZWxkU3RhdGVtZW50KFRva2VuIHlpZWxkVG9rZW4sIFRva2VuIHN0YXJUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5lbmRZaWVsZFN0YXRlbWVudCh5aWVsZFRva2VuLCBzdGFyVG9rZW4sIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXNPcGVyYXRvcihUb2tlbiBvcGVyYXRvcikgewogICAgbGlzdGVuZXI/LmhhbmRsZUFzT3BlcmF0b3Iob3BlcmF0b3IpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVBc3NpZ25tZW50RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQXN5bmNNb2RpZmllcihUb2tlbiBhc3luY1Rva2VuLCBUb2tlbiBzdGFyVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVBc3luY01vZGlmaWVyKGFzeW5jVG9rZW4sIHN0YXJUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUJyZWFrU3RhdGVtZW50KAogICAgICBib29sIGhhc1RhcmdldCwgVG9rZW4gYnJlYWtLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUJyZWFrU3RhdGVtZW50KGhhc1RhcmdldCwgYnJlYWtLZXl3b3JkLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNhc2VNYXRjaChUb2tlbiBjYXNlS2V5d29yZCwgVG9rZW4gY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDYXNlTWF0Y2goY2FzZUtleXdvcmQsIGNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ2F0Y2hCbG9jayhUb2tlbiBvbktleXdvcmQsIFRva2VuIGNhdGNoS2V5d29yZCwgVG9rZW4gY29tbWEpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDYXRjaEJsb2NrKG9uS2V5d29yZCwgY2F0Y2hLZXl3b3JkLCBjb21tYSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzRXh0ZW5kcyhUb2tlbiBleHRlbmRzS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzRXh0ZW5kcyhleHRlbmRzS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzSGVhZGVyKFRva2VuIGJlZ2luLCBUb2tlbiBjbGFzc0tleXdvcmQsIFRva2VuIG5hdGl2ZVRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ2xhc3NIZWFkZXIoYmVnaW4sIGNsYXNzS2V5d29yZCwgbmF0aXZlVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVDbGFzc05vV2l0aENsYXVzZSgpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKAogICAgICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZCwgaW50IGludGVyZmFjZXNDb3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoaW1wbGVtZW50c0tleXdvcmQsIGludGVyZmFjZXNDb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzV2l0aENsYXVzZShUb2tlbiB3aXRoS2V5d29yZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNsYXNzV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNvbW1lbnRSZWZlcmVuY2UoCiAgICAgIFRva2VuIG5ld0tleXdvcmQsIFRva2VuIHByZWZpeCwgVG9rZW4gcGVyaW9kLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbW1lbnRSZWZlcmVuY2UobmV3S2V5d29yZCwgcHJlZml4LCBwZXJpb2QsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHQoU3RyaW5nIHJlZmVyZW5jZVNvdXJjZSwgaW50IHJlZmVyZW5jZU9mZnNldCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUNvbW1lbnRSZWZlcmVuY2VUZXh0KHJlZmVyZW5jZVNvdXJjZSwgcmVmZXJlbmNlT2Zmc2V0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ29uZGl0aW9uYWxFeHByZXNzaW9uQ29sb24oKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoCiAgICAgIGJvb2wgaGFzVGFyZ2V0LCBUb2tlbiBjb250aW51ZUtleXdvcmQsIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlQ29udGludWVTdGF0ZW1lbnQoaGFzVGFyZ2V0LCBjb250aW51ZUtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRGlyZWN0aXZlc09ubHkoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRGlyZWN0aXZlc09ubHkoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRG90dGVkTmFtZShpbnQgY291bnQsIFRva2VuIGZpcnN0SWRlbnRpZmllcikgewogICAgbGlzdGVuZXI/LmhhbmRsZURvdHRlZE5hbWUoY291bnQsIGZpcnN0SWRlbnRpZmllcik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVsc2VDb250cm9sRmxvdyhUb2tlbiBlbHNlVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFbHNlQ29udHJvbEZsb3coZWxzZVRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoVG9rZW4gc2VtaWNvbG9uKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHkoc2VtaWNvbG9uKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRW1wdHlTdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFbXB0eVN0YXRlbWVudCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUVycm9yVG9rZW4oRXJyb3JUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUVycm9yVG9rZW4odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KFRva2VuIGFycm93VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShhcnJvd1Rva2VuLCBlbmRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVFeHByZXNzaW9uU3RhdGVtZW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRXh0cmFuZW91c0V4cHJlc3Npb24oVG9rZW4gdG9rZW4sIE1lc3NhZ2UgbWVzc2FnZSkgewogICAgbGlzdGVuZXI/LmhhbmRsZUV4dHJhbmVvdXNFeHByZXNzaW9uKHRva2VuLCBtZXNzYWdlKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRmluYWxseUJsb2NrKFRva2VuIGZpbmFsbHlLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRmluYWxseUJsb2NrKGZpbmFsbHlLZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQoVG9rZW4gdG9rZW4sIGJvb2wgZm9ySW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JJbml0aWFsaXplckV4cHJlc3Npb25TdGF0ZW1lbnQodG9rZW4sIGZvckluKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ySW5pdGlhbGl6ZXJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oVG9rZW4gdG9rZW4sIGJvb2wgZm9ySW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbih0b2tlbiwgZm9ySW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JJbkxvb3BQYXJ0cyhUb2tlbiBhd2FpdFRva2VuLCBUb2tlbiBmb3JUb2tlbiwKICAgICAgVG9rZW4gbGVmdFBhcmVudGhlc2lzLCBUb2tlbiBpbktleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVGb3JJbkxvb3BQYXJ0cygKICAgICAgICBhd2FpdFRva2VuLCBmb3JUb2tlbiwgbGVmdFBhcmVudGhlc2lzLCBpbktleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVGb3JMb29wUGFydHMoVG9rZW4gZm9yS2V5d29yZCwgVG9rZW4gbGVmdFBhcmVuLAogICAgICBUb2tlbiBsZWZ0U2VwYXJhdG9yLCBpbnQgdXBkYXRlRXhwcmVzc2lvbkNvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRm9yTG9vcFBhcnRzKAogICAgICAgIGZvcktleXdvcmQsIGxlZnRQYXJlbiwgbGVmdFNlcGFyYXRvciwgdXBkYXRlRXhwcmVzc2lvbkNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRm9ybWFsUGFyYW1ldGVyV2l0aG91dFZhbHVlKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZChUb2tlbiB0b2tlbiwgYm9vbCBpc0V4cHJlc3Npb25Cb2R5KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlRnVuY3Rpb25Cb2R5U2tpcHBlZCh0b2tlbiwgaXNFeHByZXNzaW9uQm9keSk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBjb250ZXh0KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSWRlbnRpZmllckxpc3QoaW50IGNvdW50KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSWRlbnRpZmllckxpc3QoY291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbXBvcnRQcmVmaXgoVG9rZW4gZGVmZXJyZWRLZXl3b3JkLCBUb2tlbiBhc0tleXdvcmQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbXBvcnRQcmVmaXgoZGVmZXJyZWRLZXl3b3JkLCBhc0tleXdvcmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbmRleGVkRXhwcmVzc2lvbigKICAgICAgVG9rZW4gb3BlblNxdWFyZUJyYWNrZXQsIFRva2VuIGNsb3NlU3F1YXJlQnJhY2tldCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUluZGV4ZWRFeHByZXNzaW9uKG9wZW5TcXVhcmVCcmFja2V0LCBjbG9zZVNxdWFyZUJyYWNrZXQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbihUb2tlbiBsZWZ0QnJhY2tldCwgVG9rZW4gcmlnaHRCcmFja2V0KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24obGVmdEJyYWNrZXQsIHJpZ2h0QnJhY2tldCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkRnVuY3Rpb25Cb2R5KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZEZ1bmN0aW9uQm9keSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRNZW1iZXIoVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbnZhbGlkTWVtYmVyKGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZE9wZXJhdG9yTmFtZShUb2tlbiBvcGVyYXRvcktleXdvcmQsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZE9wZXJhdG9yTmFtZShvcGVyYXRvcktleXdvcmQsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFN0YXRlbWVudChUb2tlbiB0b2tlbiwgTWVzc2FnZSBtZXNzYWdlKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZFN0YXRlbWVudCh0b2tlbiwgbWVzc2FnZSk7CiAgfQoKICB2b2lkIGhhbmRsZUludmFsaWRUb3BMZXZlbEJsb2NrKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZFRvcExldmVsQmxvY2sodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbihUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUludmFsaWRUb3BMZXZlbERlY2xhcmF0aW9uKGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVJbnZhbGlkVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUludmFsaWRUeXBlUmVmZXJlbmNlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlSW52YWxpZFR5cGVSZWZlcmVuY2UodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVJc09wZXJhdG9yKFRva2VuIGlzT3BlcmF0b3IsIFRva2VuIG5vdCkgewogICAgbGlzdGVuZXI/LmhhbmRsZUlzT3BlcmF0b3IoaXNPcGVyYXRvciwgbm90KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGFiZWwoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMYWJlbCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxCb29sKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTGl0ZXJhbEJvb2wodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsRG91YmxlKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTGl0ZXJhbERvdWJsZSh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUxpdGVyYWxJbnQoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVMaXRlcmFsSW50KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbExpc3QoCiAgICAgIGludCBjb3VudCwgVG9rZW4gYmVnaW5Ub2tlbiwgVG9rZW4gY29uc3RLZXl3b3JkLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxMaXN0KGNvdW50LCBiZWdpblRva2VuLCBjb25zdEtleXdvcmQsIGVuZFRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbE1hcEVudHJ5KFRva2VuIGNvbG9uLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxNYXBFbnRyeShjb2xvbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVMaXRlcmFsTnVsbChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxOdWxsKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTGl0ZXJhbFNldE9yTWFwKAogICAgaW50IGNvdW50LAogICAgVG9rZW4gbGVmdEJyYWNlLAogICAgVG9rZW4gY29uc3RLZXl3b3JkLAogICAgVG9rZW4gcmlnaHRCcmFjZSwKICAgIC8vIFRPRE8oZGFucnViZWwpOiBoYXNTZXRFbnRyeSBwYXJhbWV0ZXIgZXhpc3RzIGZvciByZXBsaWNhdGluZyBleGlzdGluZwogICAgLy8gYmVoYXZpb3IgYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHVuaWZpZWQgY29sbGVjdGlvbiBoYXMgYmVlbiBlbmFibGVkCiAgICBib29sIGhhc1NldEVudHJ5LAogICkgewogICAgbGlzdGVuZXI/LmhhbmRsZUxpdGVyYWxTZXRPck1hcCgKICAgICAgICBjb3VudCwgbGVmdEJyYWNlLCBjb25zdEtleXdvcmQsIHJpZ2h0QnJhY2UsIGhhc1NldEVudHJ5KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWl4aW5IZWFkZXIoVG9rZW4gbWl4aW5LZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTWl4aW5IZWFkZXIobWl4aW5LZXl3b3JkKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTWl4aW5PbihUb2tlbiBvbktleXdvcmQsIGludCB0eXBlQ291bnQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVNaXhpbk9uKG9uS2V5d29yZCwgdHlwZUNvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmFtZWRBcmd1bWVudChUb2tlbiBjb2xvbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hbWVkQXJndW1lbnQoY29sb24pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlKFRva2VuIHdpdGhLZXl3b3JkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUNsYXVzZShUb2tlbiBuYXRpdmVUb2tlbiwgYm9vbCBoYXNOYW1lKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTmF0aXZlQ2xhdXNlKG5hdGl2ZVRva2VuLCBoYXNOYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5KFRva2VuIG5hdGl2ZVRva2VuLCBUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOYXRpdmVGdW5jdGlvbkJvZHkobmF0aXZlVG9rZW4sIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWQobmF0aXZlVG9rZW4sIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQoVG9rZW4gbmF0aXZlVG9rZW4sIFRva2VuIHNlbWljb2xvbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWQobmF0aXZlVG9rZW4sIHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vQXJndW1lbnRzKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9Bcmd1bWVudHModG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0NvbW1lbnRSZWZlcmVuY2UoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlKCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMoVG9rZW4gdG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9GaWVsZEluaXRpYWxpemVyKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9GaWVsZEluaXRpYWxpemVyKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzKFRva2VuIHRva2VuLCBNZW1iZXJLaW5kIGtpbmQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVOb0Zvcm1hbFBhcmFtZXRlcnModG9rZW4sIGtpbmQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb0Z1bmN0aW9uQm9keShUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vRnVuY3Rpb25Cb2R5KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9Jbml0aWFsaXplcnMoKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9Jbml0aWFsaXplcnMoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9OYW1lKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9OYW1lKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlTm9uTnVsbEFzc2VydEV4cHJlc3Npb24oVG9rZW4gYmFuZykgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uKGJhbmcpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVOb1R5cGUoVG9rZW4gbGFzdENvbnN1bWVkKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlTm9UeXBlKGxhc3RDb25zdW1lZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vVHlwZUFyZ3VtZW50cyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVHlwZVZhcmlhYmxlcyhUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vVHlwZVZhcmlhYmxlcyh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU5vVmFyaWFibGVJbml0aWFsaXplcihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU5vVmFyaWFibGVJbml0aWFsaXplcih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZU9wZXJhdG9yKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlT3BlcmF0b3IodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVPcGVyYXRvck5hbWUoVG9rZW4gb3BlcmF0b3JLZXl3b3JkLCBUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZU9wZXJhdG9yTmFtZShvcGVyYXRvcktleXdvcmQsIHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVBhcmVudGhlc2l6ZWRDb25kaXRpb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUXVhbGlmaWVkKFRva2VuIHBlcmlvZCkgewogICAgbGlzdGVuZXI/LmhhbmRsZVF1YWxpZmllZChwZXJpb2QpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVSZWNvdmVyYWJsZUVycm9yKAogICAgICBNZXNzYWdlIG1lc3NhZ2UsIFRva2VuIHN0YXJ0VG9rZW4sIFRva2VuIGVuZFRva2VuKSB7CiAgICBpZiAoZm9yd2FyZEVycm9ycykgewogICAgICBsaXN0ZW5lcj8uaGFuZGxlUmVjb3ZlcmFibGVFcnJvcihtZXNzYWdlLCBzdGFydFRva2VuLCBlbmRUb2tlbik7CiAgICB9CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJDbGFzc0hlYWRlcigpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVSZWNvdmVyQ2xhc3NIZWFkZXIoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlUmVjb3ZlckltcG9ydChUb2tlbiBzZW1pY29sb24pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVSZWNvdmVySW1wb3J0KHNlbWljb2xvbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVJlY292ZXJNaXhpbkhlYWRlcigpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXIoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2NyaXB0KFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU2NyaXB0KHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU2VuZChUb2tlbiBiZWdpblRva2VuLCBUb2tlbiBlbmRUb2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVNlbmQoYmVnaW5Ub2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTcHJlYWRFeHByZXNzaW9uKFRva2VuIHNwcmVhZFRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU3ByZWFkRXhwcmVzc2lvbihzcHJlYWRUb2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oVG9rZW4gc3RhcnRUb2tlbiwgaW50IGxpdGVyYWxDb3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb24oc3RhcnRUb2tlbiwgbGl0ZXJhbENvdW50KTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlU3RyaW5nUGFydChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVN0cmluZ1BhcnQodG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTdXBlckV4cHJlc3Npb24oVG9rZW4gdG9rZW4sIElkZW50aWZpZXJDb250ZXh0IGNvbnRleHQpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVTdXBlckV4cHJlc3Npb24odG9rZW4sIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVTeW1ib2xWb2lkKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlU3ltYm9sVm9pZCh0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVRoaXNFeHByZXNzaW9uKFRva2VuIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dCBjb250ZXh0KSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVGhpc0V4cHJlc3Npb24odG9rZW4sIGNvbnRleHQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUaHJvd0V4cHJlc3Npb24oVG9rZW4gdGhyb3dUb2tlbiwgVG9rZW4gZW5kVG9rZW4pIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVUaHJvd0V4cHJlc3Npb24odGhyb3dUb2tlbiwgZW5kVG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVUeXBlKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIHF1ZXN0aW9uTWFyaykgewogICAgbGlzdGVuZXI/LmhhbmRsZVR5cGUoYmVnaW5Ub2tlbiwgcXVlc3Rpb25NYXJrKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQoVG9rZW4gdG9rZW4sIGludCBjb3VudCkgewogICAgbGlzdGVuZXI/LmhhbmRsZVR5cGVWYXJpYWJsZXNEZWZpbmVkKHRva2VuLCBjb3VudCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVW5hcnlQb3N0Zml4QXNzaWdubWVudEV4cHJlc3Npb24odG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVVbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uKFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVW5hcnlQcmVmaXhBc3NpZ25tZW50RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuYXJ5UHJlZml4RXhwcmVzc2lvbihUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVVuYXJ5UHJlZml4RXhwcmVzc2lvbih0b2tlbik7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVVuZXNjYXBlRXJyb3IoCiAgICAgIE1lc3NhZ2UgbWVzc2FnZSwgVG9rZW4gbG9jYXRpb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKICAgIGxpc3RlbmVyPy5oYW5kbGVVbmVzY2FwZUVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uLCBvZmZzZXQsIGxlbmd0aCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlcihUb2tlbiBlcXVhbHMsIFRva2VuIHRva2VuKSB7CiAgICBsaXN0ZW5lcj8uaGFuZGxlVmFsdWVkRm9ybWFsUGFyYW1ldGVyKGVxdWFscywgdG9rZW4pOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVWb2lkS2V5d29yZChUb2tlbiB0b2tlbikgewogICAgbGlzdGVuZXI/LmhhbmRsZVZvaWRLZXl3b3JkKHRva2VuKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgbG9nRXZlbnQoU3RyaW5nIG5hbWUpIHsKICAgIGxpc3RlbmVyPy5sb2dFdmVudChuYW1lKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgcmVwb3J0VmFyaWFuY2VNb2RpZmllck5vdEVuYWJsZWQoVG9rZW4gdmFyaWFuY2UpIHsKICAgIGxpc3RlbmVyPy5yZXBvcnRWYXJpYW5jZU1vZGlmaWVyTm90RW5hYmxlZCh2YXJpYW5jZSk7CiAgfQp9CoYnAE5OPAEhIhYBLxUdAScBDCgrBAEMIAEMJSUEAQw3MAQBDCsr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aWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL3NjYW5uZXIvc2Nhbm5lci5kYXJ0JzsKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCc7CmltcG9ydCAnbGl0ZXJhbF9lbnRyeV9pbmZvX2ltcGwuZGFydCc7CmltcG9ydCAncGFyc2VyX2ltcGwuZGFydCc7CmltcG9ydCAndXRpbC5kYXJ0JzsKCi8vLyBbc2ltcGxlRW50cnldIGlzIHRoZSBmaXJzdCBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBlbnRyeQovLy8gd2l0aG91dCBhbnkgY29udHJvbCBmbG93IG9yIHNwcmVhZCBjb2xsZWN0aW9uIG9wZXJhdG9yLgpjb25zdCBMaXRlcmFsRW50cnlJbmZvIHNpbXBsZUVudHJ5ID0gY29uc3QgTGl0ZXJhbEVudHJ5SW5mbyh0cnVlLCAwKTsKCi8vLyBbTGl0ZXJhbEVudHJ5SW5mb10gcmVwcmVzZW50cyBzdGVwcyBmb3IgcHJvY2Vzc2luZyBhbiBlbnRyeQovLy8gaW4gYSBsaXRlcmFsIGxpc3QsIG1hcCwgb3Igc2V0LiBUaGVzZSBzdGVwcyB3aWxsIGhhbmRsZSBwYXJzaW5nCi8vLyBib3RoIGNvbnRyb2wgZmxvdyBhbmQgc3ByZWFkYWJsZSBvcGVyYXRvcnMsIGFuZCBpbmRpY2F0ZQovLy8gd2hlbiB0aGUgY2xpZW50IHNob3VsZCBwYXJzZSB0aGUgbGl0ZXJhbCBlbnRyeS4KLy8vCi8vLyBDbGllbnRzIHNob3VsZCBwYXJzZSBhIHNpbmdsZSBlbnRyeSBpbiBhIGxpc3QsIHNldCwgb3IgbWFwIGxpa2UgdGhpczoKLy8vIGBgYAovLy8gICAgTGl0ZXJhbEVudHJ5SW5mbyBpbmZvID0gY29tcHV0ZUxpdGVyYWxFbnRyeSh0b2tlbik7Ci8vLyAgICB3aGlsZSAoaW5mbyAhPSBudWxsKSB7Ci8vLyAgICAgIGlmIChpbmZvLmhhc0VudHJ5KSB7Ci8vLyAgICAgICAgLi4uIHBhcnNlIGV4cHJlc3Npb24gKGA6YCBleHByZXNzaW9uKT8gLi4uCi8vLyAgICAgICAgdG9rZW4gPSBsYXN0Q29uc3VtZWRUb2tlbjsKLy8vICAgICAgfSBlbHNlIHsKLy8vICAgICAgICB0b2tlbiA9IGluZm8ucGFyc2UodG9rZW4sIHBhcnNlcik7Ci8vLyAgICAgIH0KLy8vICAgICAgaW5mbyA9IGluZm8uY29tcHV0ZU5leHQodG9rZW4pOwovLy8gICAgfQovLy8gYGBgCmNsYXNzIExpdGVyYWxFbnRyeUluZm8gewogIC8vLyBgdHJ1ZWAgaWYgYW4gZW50cnkgc2hvdWxkIGJlIHBhcnNlZCBieSB0aGUgY2FsbGVyCiAgLy8vIG9yIGBmYWxzZWAgaWYgdGhpcyBvYmplY3QncyBbcGFyc2VdIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLgogIGZpbmFsIGJvb2wgaGFzRW50cnk7CgogIC8vLyBVc2VkIGZvciByZWNvdmVyeSwgdGhpcyBpbmRpY2F0ZXMKICAvLy8gKzEgZm9yIGFuIGBpZmAgY29uZGl0aW9uIGFuZCAtMSBmb3IgYGVsc2VgLgogIGZpbmFsIGludCBpZkNvbmRpdGlvbkRlbHRhOwoKICBjb25zdCBMaXRlcmFsRW50cnlJbmZvKHRoaXMuaGFzRW50cnksIHRoaXMuaWZDb25kaXRpb25EZWx0YSk7CgogIC8vLyBQYXJzZSB0aGUgY29udHJvbCBmbG93IGFuZCBzcHJlYWQgY29sbGVjdGlvbiBhc3BlY3RzIG9mIHRoaXMgZW50cnkuCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRocm93IGhhc0VudHJ5CiAgICAgICAgPyAnSW50ZXJuYWwgRXJyb3I6IHNob3VsZCBub3QgY2FsbCBwYXJzZScKICAgICAgICA6ICdJbnRlcm5hbCBFcnJvcjogJHJ1bnRpbWVUeXBlIHNob3VsZCBpbXBsZW1lbnQgcGFyc2UnOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIG5leHQgc3RlcCB3aGVuIHBhcnNpbmcgYW4gZW50cnkgb3IgYG51bGxgIGlmIG5vbmUuCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgPT4gbnVsbDsKfQoKLy8vIENvbXB1dGUgdGhlIFtMaXRlcmFsRW50cnlJbmZvXSBmb3IgdGhlIGxpdGVyYWwgbGlzdCwgbWFwLCBvciBzZXQgZW50cnkuCkxpdGVyYWxFbnRyeUluZm8gY29tcHV0ZUxpdGVyYWxFbnRyeShUb2tlbiB0b2tlbikgewogIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogIGlmIChvcHRpb25hbCgnaWYnLCBuZXh0KSkgewogICAgcmV0dXJuIGlmQ29uZGl0aW9uOwogIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2ZvcicsIG5leHQpIHx8CiAgICAgIChvcHRpb25hbCgnYXdhaXQnLCBuZXh0KSAmJiBvcHRpb25hbCgnZm9yJywgbmV4dC5uZXh0KSkpIHsKICAgIHJldHVybiBuZXcgRm9yQ29uZGl0aW9uKCk7CiAgfSBlbHNlIGlmIChvcHRpb25hbCgnLi4uJywgbmV4dCkgfHwgb3B0aW9uYWwoJy4uLj8nLCBuZXh0KSkgewogICAgcmV0dXJuIHNwcmVhZE9wZXJhdG9yOwogIH0KICByZXR1cm4gc2ltcGxlRW50cnk7Cn0KCi8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbdG9rZW5dIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgdGhlIHN0YXJ0IG9mCi8vLyBhIGxpdGVyYWwgZW50cnkgaW4gYSBsaXN0LCBzZXQsIG9yIG1hcCBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlY292ZXJ5Lgpib29sIGxvb2tzTGlrZUxpdGVyYWxFbnRyeShUb2tlbiB0b2tlbikgPT4KICAgIGxvb2tzTGlrZUV4cHJlc3Npb25TdGFydCh0b2tlbikgfHwKICAgIG9wdGlvbmFsKCcuLi4nLCB0b2tlbikgfHwKICAgIG9wdGlvbmFsKCcuLi4/JywgdG9rZW4pIHx8CiAgICBvcHRpb25hbCgnaWYnLCB0b2tlbikgfHwKICAgIG9wdGlvbmFsKCdmb3InLCB0b2tlbikgfHwKICAgIChvcHRpb25hbCgnYXdhaXQnLCB0b2tlbikgJiYgb3B0aW9uYWwoJ2ZvcicsIHRva2VuLm5leHQpKTsKTwBNTjwBIiInGxQBQDxGAUBEPTQESgg7Hh42JhIuCykJCBk4QxcBKDIeAUABSiwTMkEEAUU1AgFMNBseGCZBH0AbBBYCAUtJKyceHx0ePwE+cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvbGl0ZXJhbF9lbnRyeV9pbmZvLmRhcnRiZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9sb29wX3N0YXRlLmRhcnSBky8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLmxvb3Bfc3RhdGU7CgplbnVtIExvb3BTdGF0ZSB7CiAgT3V0c2lkZUxvb3AsCiAgSW5zaWRlU3dpdGNoLCAvLyBgYnJlYWtgIHN0YXRlbWVudCBhbGxvd2VkCiAgSW5zaWRlTG9vcCwgLy8gYGJyZWFrYCBhbmQgYGNvbnRpbnVlYCBzdGF0ZW1lbnRzIGFsbG93ZWQKfQoNAE5OPAEvAREPLTsCATZwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9sb29wX3N0YXRlLmRhcnRoZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9tb2RpZmllcl9jb250ZXh0LmRhcnS83C8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnIGFzIGNvZGVzOwppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW4uZGFydCcgc2hvdyBLZXl3b3JkLCBUb2tlbjsKaW1wb3J0ICdmb3JtYWxfcGFyYW1ldGVyX2tpbmQuZGFydCc7CmltcG9ydCAnbWVtYmVyX2tpbmQuZGFydCcgc2hvdyBNZW1iZXJLaW5kOwppbXBvcnQgJ3BhcnNlcl9pbXBsLmRhcnQnIHNob3cgUGFyc2VyOwppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBvcHRpb25hbDsKCmJvb2wgaXNNb2RpZmllcihUb2tlbiB0b2tlbikgewogIGlmICghdG9rZW4uaXNNb2RpZmllcikgewogICAgcmV0dXJuIGZhbHNlOwogIH0gZWxzZSBpZiAodG9rZW4udHlwZS5pc0J1aWx0SW4pIHsKICAgIC8vIEEgYnVpbHQtaW4ga2V5d29yZCBjYW4gb25seSBiZSBhIG1vZGlmaWVyIGFzIGxvbmcgYXMgaXQgaXMKICAgIC8vIGZvbGxvd2VkIGJ5IGFub3RoZXIga2V5d29yZCBvciBhbiBpZGVudGlmaWVyLiBPdGhlcndpc2UsIGl0IGlzIHRoZQogICAgLy8gaWRlbnRpZmllci4KICAgIC8vCiAgICAvLyBGb3IgZXhhbXBsZSwgYGV4dGVybmFsYCBpcyBhIG1vZGlmaWVyIGluIHRoaXMgZGVjbGFyYXRpb246CiAgICAvLyAgIGV4dGVybmFsIEZvbyBmb28oKTsKICAgIC8vIGJ1dCBpcyB0aGUgaWRlbnRpZmllciBpbiB0aGlzIGRlY2xhcmF0aW9uCiAgICAvLyAgIGV4dGVybmFsKCkgPT4gdHJ1ZTsKICAgIC8vIGFuZCBpbgogICAgLy8gICBmb3IgKGZpbmFsIGV4dGVybmFsIGluIGxpc3QpIHsgfQogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBLZXl3b3JkIGtleXdvcmQgPSBuZXh0LmtleXdvcmQ7CiAgICBpZiAoa2V5d29yZCA9PSBudWxsICYmICFuZXh0LmlzSWRlbnRpZmllciB8fCBrZXl3b3JkID09IEtleXdvcmQuSU4pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQoKLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwYXJzZSBtb2RpZmllcnMgaW4gbW9zdCBsb2NhdGlvbnMgd2hlcmUgbW9kaWZpZXJzCi8vLyBjYW4gb2NjdXIsIGJ1dCBkb2VzIG5vdCBjYWxsIGhhbmRsZU1vZGlmaWVyIG9yIGhhbmRsZU1vZGlmaWVycy4KY2xhc3MgTW9kaWZpZXJSZWNvdmVyeUNvbnRleHQgewogIGZpbmFsIFBhcnNlciBwYXJzZXI7CiAgVG9rZW4gYWJzdHJhY3RUb2tlbjsKICBUb2tlbiBjb25zdFRva2VuOwogIFRva2VuIGNvdmFyaWFudFRva2VuOwogIFRva2VuIGV4dGVybmFsVG9rZW47CiAgVG9rZW4gZmluYWxUb2tlbjsKICBUb2tlbiBsYXRlVG9rZW47CiAgVG9rZW4gcmVxdWlyZWRUb2tlbjsKICBUb2tlbiBzdGF0aWNUb2tlbjsKICBUb2tlbiB2YXJUb2tlbjsKCiAgLy8gU2V0IGB0cnVlYCB3aGVuIHBhcnNpbmcgbW9kaWZpZXJzIGFmdGVyIHRoZSBgZmFjdG9yeWAgdG9rZW4uCiAgYm9vbCBhZnRlckZhY3RvcnkgPSBmYWxzZTsKCiAgLy8gVE9ETyhkYW5ydWJlbCk6IFJlcGxhY2UgW01vZGlmaWVyUmVjb3ZlcnlDb250ZXh0XSBhbmQgW01vZGlmaWVyQ29udGV4dF0KICAvLyB3aXRoIHRoaXMgY2xhc3MuCgogIE1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0KHRoaXMucGFyc2VyKTsKCiAgc2V0IHN0YXRpY09yQ292YXJpYW50KFRva2VuIHN0YXRpY09yQ292YXJpYW50KSB7CiAgICBpZiAoc3RhdGljT3JDb3ZhcmlhbnQgPT0gbnVsbCkgewogICAgICBjb3ZhcmlhbnRUb2tlbiA9IG51bGw7CiAgICAgIHN0YXRpY1Rva2VuID0gbnVsbDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2NvdmFyaWFudCcsIHN0YXRpY09yQ292YXJpYW50KSkgewogICAgICBjb3ZhcmlhbnRUb2tlbiA9IHN0YXRpY09yQ292YXJpYW50OwogICAgICBzdGF0aWNUb2tlbiA9IG51bGw7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdzdGF0aWMnLCBzdGF0aWNPckNvdmFyaWFudCkpIHsKICAgICAgY292YXJpYW50VG9rZW4gPSBudWxsOwogICAgICBzdGF0aWNUb2tlbiA9IHN0YXRpY09yQ292YXJpYW50OwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIkludGVybmFsIGVycm9yOiAiCiAgICAgICAgICAiVW5leHBlY3RlZCBzdGF0aWNPckNvdmFyaWFudCAnJHN0YXRpY09yQ292YXJpYW50Jy4iOwogICAgfQogIH0KCiAgVG9rZW4gZ2V0IHZhckZpbmFsT3JDb25zdCA9PiB2YXJUb2tlbiA/PyBmaW5hbFRva2VuID8/IGNvbnN0VG9rZW47CgogIHNldCB2YXJGaW5hbE9yQ29uc3QoVG9rZW4gdmFyRmluYWxPckNvbnN0KSB7CiAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwpIHsKICAgICAgdmFyVG9rZW4gPSBudWxsOwogICAgICBmaW5hbFRva2VuID0gbnVsbDsKICAgICAgY29uc3RUb2tlbiA9IG51bGw7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCd2YXInLCB2YXJGaW5hbE9yQ29uc3QpKSB7CiAgICAgIHZhclRva2VuID0gdmFyRmluYWxPckNvbnN0OwogICAgICBmaW5hbFRva2VuID0gbnVsbDsKICAgICAgY29uc3RUb2tlbiA9IG51bGw7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdmaW5hbCcsIHZhckZpbmFsT3JDb25zdCkpIHsKICAgICAgdmFyVG9rZW4gPSBudWxsOwogICAgICBmaW5hbFRva2VuID0gdmFyRmluYWxPckNvbnN0OwogICAgICBjb25zdFRva2VuID0gbnVsbDsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2NvbnN0JywgdmFyRmluYWxPckNvbnN0KSkgewogICAgICB2YXJUb2tlbiA9IG51bGw7CiAgICAgIGZpbmFsVG9rZW4gPSBudWxsOwogICAgICBjb25zdFRva2VuID0gdmFyRmluYWxPckNvbnN0OwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIkludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHZhckZpbmFsT3JDb25zdCAnJHZhckZpbmFsT3JDb25zdCcuIjsKICAgIH0KICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZm9yIGNsYXNzIG1ldGhvZHMgYW5kIGZpZWxkcy4KICBUb2tlbiBwYXJzZUNsYXNzTWVtYmVyTW9kaWZpZXJzKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlTW9kaWZpZXJzKHRva2VuKTsKICAgIGlmIChhYnN0cmFjdFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBhYnN0cmFjdFRva2VuLCBjb2Rlcy5tZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlcik7CiAgICB9CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIocmVxdWlyZWRUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgbW9kaWZpZXJzIGZvciBmb3JtYWwgcGFyYW1ldGVycy4KICBUb2tlbiBwYXJzZUZvcm1hbFBhcmFtZXRlck1vZGlmaWVycygKICAgICAgVG9rZW4gdG9rZW4sIEZvcm1hbFBhcmFtZXRlcktpbmQgcGFyYW1ldGVyS2luZCwgTWVtYmVyS2luZCBtZW1iZXJLaW5kKSB7CiAgICB0b2tlbiA9IHBhcnNlTW9kaWZpZXJzKHRva2VuKTsKCiAgICBpZiAocGFyYW1ldGVyS2luZCAhPSBGb3JtYWxQYXJhbWV0ZXJLaW5kLm9wdGlvbmFsTmFtZWQpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHJlcXVpcmVkVG9rZW4pOwogICAgfQogICAgaWYgKG1lbWJlcktpbmQgPT0gTWVtYmVyS2luZC5TdGF0aWNNZXRob2QgfHwKICAgICAgICBtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuVG9wTGV2ZWxNZXRob2QpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHRoaXMuY292YXJpYW50VG9rZW4pOwogICAgfSBlbHNlIGlmIChtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuRXh0ZW5zaW9uTm9uU3RhdGljTWV0aG9kIHx8CiAgICAgICAgbWVtYmVyS2luZCA9PSBNZW1iZXJLaW5kLkV4dGVuc2lvblN0YXRpY01ldGhvZCkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXJJbkV4dGVuc2lvbih0aGlzLmNvdmFyaWFudFRva2VuKTsKICAgIH0KICAgIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKGNvbnN0VG9rZW4pOwogICAgfSBlbHNlIGlmIChtZW1iZXJLaW5kID09IE1lbWJlcktpbmQuR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUpIHsKICAgICAgaWYgKHZhckZpbmFsT3JDb25zdCAhPSBudWxsKSB7CiAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgIHZhckZpbmFsT3JDb25zdCwgY29kZXMubWVzc2FnZUZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJWYXIpOwogICAgICB9CiAgICB9CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoYWJzdHJhY3RUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoZXh0ZXJuYWxUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIobGF0ZVRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihzdGF0aWNUb2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gUGFyc2UgbW9kaWZpZXJzIGFmdGVyIHRoZSBgZmFjdG9yeWAgdG9rZW4uCiAgVG9rZW4gcGFyc2VNb2RpZmllcnNBZnRlckZhY3RvcnkoVG9rZW4gdG9rZW4pIHsKICAgIGFmdGVyRmFjdG9yeSA9IHRydWU7CiAgICB0b2tlbiA9IHBhcnNlTW9kaWZpZXJzKHRva2VuKTsKICAgIGlmIChhYnN0cmFjdFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICBhYnN0cmFjdFRva2VuLCBjb2Rlcy5tZXNzYWdlQWJzdHJhY3RDbGFzc01lbWJlcik7CiAgICB9CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIobGF0ZVRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihyZXF1aXJlZFRva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbnMgYW5kIGZpZWxkcy4KICBUb2tlbiBwYXJzZVRvcExldmVsTW9kaWZpZXJzKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHBhcnNlTW9kaWZpZXJzKHRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihhYnN0cmFjdFRva2VuKTsKICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihjb3ZhcmlhbnRUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIocmVxdWlyZWRUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoc3RhdGljVG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8vIFBhcnNlIG1vZGlmaWVycyBmb3IgdmFyaWFibGUgZGVjbGFyYXRpb25zLgogIFRva2VuIHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbk1vZGlmaWVycyhUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSBwYXJzZU1vZGlmaWVycyh0b2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoYWJzdHJhY3RUb2tlbik7CiAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoY292YXJpYW50VG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKGV4dGVybmFsVG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHJlcXVpcmVkVG9rZW4pOwogICAgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVyKHN0YXRpY1Rva2VuKTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIC8vLyBQYXJzZSBtb2RpZmllcnMgZHVyaW5nIHJlY292ZXJ5IHdoZW4gbW9kaWZpZXJzIGFyZSBvdXQgb2Ygb3JkZXIKICAvLy8gb3IgaW52YWxpZC4gVHlwaWNhbGx5IGNsaWVudHMgY2FsbCBtZXRob2RzIGxpa2UKICAvLy8gW3BhcnNlQ2xhc3NNZW1iZXJNb2RpZmllcnNdIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhpcyBtZXRob2QsCiAgLy8vIHJhdGhlciB0aGFuIGNhbGxpbmcgdGhpcyBtZXRob2QgZGlyZWN0bHkuCiAgLy8vCiAgLy8vIFRoZSB2YXJpb3VzIG1vZGlmaWVyIHRva2VuIHBhcmFtZXRlcnMgcmVwcmVzZW50IHRva2VucyBvZiBtb2RpZmllcnMKICAvLy8gdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQgcHJpb3IgdG8gcmVjb3ZlcnkuIFRoZSBbc3RhdGljT3JDb3ZhcmlhbnRdCiAgLy8vIHBhcmFtZXRlciBpcyBmb3IgY29udmVuaWVuY2UgaWYgY2FsbGVyIGhhcyBhIHRva2VuIHRoYXQgbWF5IGJlIGVpdGhlcgogIC8vLyBgc3RhdGljYCBvciBgY292YXJpYW50YC4gVGhlIGZpcnN0IG5vbi1udWxsIHBhcmFtZXRlciBvZgogIC8vLyBbc3RhdGljT3JDb3ZhcmlhbnRdLCBbc3RhdGljVG9rZW5dLCBvciBbY292YXJpYW50VG9rZW5dIHdpbGwgYmUgdXNlZCwKICAvLy8gaW4gdGhhdCBvcmRlciwgYW5kIHRoZSBvdGhlcnMgaWdub3JlZC4KICBUb2tlbiBwYXJzZU1vZGlmaWVycyhUb2tlbiB0b2tlbikgewogICAgLy8gUHJvY2VzcyBpbnZhbGlkIGFuZCBvdXQtb2Ytb3JkZXIgbW9kaWZpZXJzCiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IG5leHQuc3RyaW5nVmFsdWU7CiAgICAgIGlmIChpc01vZGlmaWVyKG5leHQpKSB7CiAgICAgICAgaWYgKGlkZW50aWNhbCgnYWJzdHJhY3QnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VBYnN0cmFjdCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ2NvbnN0JywgdmFsdWUpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlQ29uc3QodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdjb3ZhcmlhbnQnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VDb3ZhcmlhbnQodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKCdleHRlcm5hbCcsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZUV4dGVybmFsKHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgnZmluYWwnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VGaW5hbCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ2xhdGUnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VMYXRlKHRva2VuKTsKICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbCgncmVxdWlyZWQnLCB2YWx1ZSkpIHsKICAgICAgICAgIHRva2VuID0gcGFyc2VSZXF1aXJlZCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ3N0YXRpYycsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZVN0YXRpYyh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwoJ3ZhcicsIHZhbHVlKSkgewogICAgICAgICAgdG9rZW4gPSBwYXJzZVZhcih0b2tlbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5oYW5kbGVkIG1vZGlmaWVyOiAkdmFsdWUnOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChhZnRlckZhY3RvcnkgJiYgaWRlbnRpY2FsKCdmYWN0b3J5JywgdmFsdWUpKSB7CiAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgICAgICB0b2tlbiA9IG5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBUb2tlbiBwYXJzZUFic3RyYWN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnYWJzdHJhY3QnLCBuZXh0KSk7CiAgICBpZiAoYWJzdHJhY3RUb2tlbiA9PSBudWxsKSB7CiAgICAgIGFic3RyYWN0VG9rZW4gPSBuZXh0OwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgbmV4dCwgY29kZXMudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZUNvbnN0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnY29uc3QnLCBuZXh0KSk7CiAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwgJiYgY292YXJpYW50VG9rZW4gPT0gbnVsbCkgewogICAgICBjb25zdFRva2VuID0gbmV4dDsKCiAgICAgIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgJ2ZhY3RvcnknKTsKICAgICAgfSBlbHNlIGlmIChsYXRlVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKG5leHQsIGxhdGVUb2tlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICB9IGVsc2UgaWYgKGNvdmFyaWFudFRva2VuICE9IG51bGwpIHsKICAgICAgcmVwb3J0Q29uZmxpY3RpbmdNb2RpZmllcnMobmV4dCwgY292YXJpYW50VG9rZW4pOwogICAgfSBlbHNlIGlmIChmaW5hbFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZUNvbnN0QW5kRmluYWwpOwogICAgfSBlbHNlIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKG5leHQsIHZhclRva2VuKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3Q6ICR2YXJGaW5hbE9yQ29uc3QnOwogICAgfQogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZUNvdmFyaWFudChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2NvdmFyaWFudCcsIG5leHQpKTsKICAgIGlmIChjb25zdFRva2VuID09IG51bGwgJiYKICAgICAgICBjb3ZhcmlhbnRUb2tlbiA9PSBudWxsICYmCiAgICAgICAgc3RhdGljVG9rZW4gPT0gbnVsbCAmJgogICAgICAgICFhZnRlckZhY3RvcnkpIHsKICAgICAgY292YXJpYW50VG9rZW4gPSBuZXh0OwoKICAgICAgaWYgKHZhclRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgdmFyVG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmIChmaW5hbFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgZmluYWxUb2tlbi5sZXhlbWUpOwogICAgICB9IGVsc2UgaWYgKGxhdGVUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGxhdGVUb2tlbi5sZXhlbWUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoY292YXJpYW50VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoYWZ0ZXJGYWN0b3J5KSB7CiAgICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihuZXh0KTsKICAgIH0gZWxzZSBpZiAoY29uc3RUb2tlbiAhPSBudWxsKSB7CiAgICAgIHJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzKG5leHQsIGNvbnN0VG9rZW4pOwogICAgfSBlbHNlIGlmIChzdGF0aWNUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGNvZGVzLm1lc3NhZ2VDb3ZhcmlhbnRBbmRTdGF0aWMpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgcmVjb3Zlcnk6ICRuZXh0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgVG9rZW4gcGFyc2VFeHRlcm5hbChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2V4dGVybmFsJywgbmV4dCkpOwogICAgaWYgKGV4dGVybmFsVG9rZW4gPT0gbnVsbCkgewogICAgICBleHRlcm5hbFRva2VuID0gbmV4dDsKCiAgICAgIGlmIChhZnRlckZhY3RvcnkpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgJ2ZhY3RvcnknKTsKICAgICAgfSBlbHNlIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgY29uc3RUb2tlbi5sZXhlbWUpOwogICAgICB9IGVsc2UgaWYgKHN0YXRpY1Rva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgc3RhdGljVG9rZW4ubGV4ZW1lKTsKICAgICAgfSBlbHNlIGlmIChsYXRlVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihuZXh0LCBsYXRlVG9rZW4ubGV4ZW1lKTsKICAgICAgfQogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgbmV4dCwgY29kZXMudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZUZpbmFsKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnZmluYWwnLCBuZXh0KSk7CiAgICBpZiAodmFyRmluYWxPckNvbnN0ID09IG51bGwgJiYgIWFmdGVyRmFjdG9yeSkgewogICAgICBmaW5hbFRva2VuID0gbmV4dDsKICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChmaW5hbFRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICB9IGVsc2UgaWYgKGFmdGVyRmFjdG9yeSkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIobmV4dCk7CiAgICB9IGVsc2UgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlQ29uc3RBbmRGaW5hbCk7CiAgICB9IGVsc2UgaWYgKHZhclRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZUZpbmFsQW5kVmFyKTsKICAgIH0gZWxzZSBpZiAobGF0ZVRva2VuICE9IG51bGwpIHsKICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGxhdGVUb2tlbi5sZXhlbWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ0ludGVybmFsIEVycm9yOiBVbmV4cGVjdGVkIHZhckZpbmFsT3JDb25zdDogJHZhckZpbmFsT3JDb25zdCc7CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIFRva2VuIHBhcnNlTGF0ZShUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2xhdGUnLCBuZXh0KSk7CiAgICBpZiAobGF0ZVRva2VuID09IG51bGwpIHsKICAgICAgbGF0ZVRva2VuID0gbmV4dDsKCiAgICAgIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhuZXh0LCBjb25zdFRva2VuKTsKICAgICAgfSBlbHNlIGlmICh2YXJUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIHZhclRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGZpbmFsVG9rZW4ubGV4ZW1lKTsKICAgICAgfQogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgbmV4dCwgY29kZXMudGVtcGxhdGVEdXBsaWNhdGVkTW9kaWZpZXIpOwogICAgcmV0dXJuIG5leHQ7CiAgfQoKICBUb2tlbiBwYXJzZVJlcXVpcmVkKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgncmVxdWlyZWQnLCBuZXh0KSk7CiAgICBpZiAocmVxdWlyZWRUb2tlbiA9PSBudWxsKSB7CiAgICAgIHJlcXVpcmVkVG9rZW4gPSBuZXh0OwoKICAgICAgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihyZXF1aXJlZFRva2VuLCBjb25zdFRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAoY292YXJpYW50VG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihyZXF1aXJlZFRva2VuLCBjb3ZhcmlhbnRUb2tlbi5sZXhlbWUpOwogICAgICB9IGVsc2UgaWYgKGZpbmFsVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihyZXF1aXJlZFRva2VuLCBmaW5hbFRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihyZXF1aXJlZFRva2VuLCB2YXJUb2tlbi5sZXhlbWUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICByZXR1cm4gbmV4dDsKICB9CgogIFRva2VuIHBhcnNlU3RhdGljKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnc3RhdGljJywgbmV4dCkpOwogICAgaWYgKGNvdmFyaWFudFRva2VuID09IG51bGwgJiYgc3RhdGljVG9rZW4gPT0gbnVsbCAmJiAhYWZ0ZXJGYWN0b3J5KSB7CiAgICAgIHN0YXRpY1Rva2VuID0gbmV4dDsKCiAgICAgIGlmIChjb25zdFRva2VuICE9IG51bGwpIHsKICAgICAgICByZXBvcnRNb2RpZmllck91dE9mT3JkZXIobmV4dCwgY29uc3RUb2tlbi5sZXhlbWUpOwogICAgICB9IGVsc2UgaWYgKGZpbmFsVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihuZXh0LCBmaW5hbFRva2VuLmxleGVtZSk7CiAgICAgIH0gZWxzZSBpZiAodmFyVG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcihuZXh0LCB2YXJUb2tlbi5sZXhlbWUpOwogICAgICB9IGVsc2UgaWYgKGxhdGVUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgcmVwb3J0TW9kaWZpZXJPdXRPZk9yZGVyKG5leHQsIGxhdGVUb2tlbi5sZXhlbWUpOwogICAgICB9CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoY292YXJpYW50VG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlQ292YXJpYW50QW5kU3RhdGljKTsKICAgIH0gZWxzZSBpZiAoc3RhdGljVG9rZW4gIT0gbnVsbCkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIG5leHQsIGNvZGVzLnRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyKTsKICAgIH0gZWxzZSBpZiAoYWZ0ZXJGYWN0b3J5KSB7CiAgICAgIHJlcG9ydEV4dHJhbmVvdXNNb2RpZmllcihuZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICdJbnRlcm5hbCBFcnJvcjogVW5oYW5kbGVkIHJlY292ZXJ5OiAkbmV4dCc7CiAgICB9CiAgICByZXR1cm4gbmV4dDsKICB9CgogIFRva2VuIHBhcnNlVmFyKFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgndmFyJywgbmV4dCkpOwogICAgaWYgKHZhckZpbmFsT3JDb25zdCA9PSBudWxsICYmICFhZnRlckZhY3RvcnkpIHsKICAgICAgdmFyVG9rZW4gPSBuZXh0OwogICAgICByZXR1cm4gbmV4dDsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKHZhclRva2VuICE9IG51bGwpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUR1cGxpY2F0ZWRNb2RpZmllcik7CiAgICB9IGVsc2UgaWYgKGFmdGVyRmFjdG9yeSkgewogICAgICByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIobmV4dCk7CiAgICB9IGVsc2UgaWYgKGNvbnN0VG9rZW4gIT0gbnVsbCkgewogICAgICByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhuZXh0LCBjb25zdFRva2VuKTsKICAgIH0gZWxzZSBpZiAoZmluYWxUb2tlbiAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKG5leHQsIGNvZGVzLm1lc3NhZ2VGaW5hbEFuZFZhcik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAnSW50ZXJuYWwgRXJyb3I6IFVuZXhwZWN0ZWQgdmFyRmluYWxPckNvbnN0OiAkdmFyRmluYWxPckNvbnN0JzsKICAgIH0KICAgIHJldHVybiBuZXh0OwogIH0KCiAgdm9pZCByZXBvcnRDb25mbGljdGluZ01vZGlmaWVycyhUb2tlbiBtb2RpZmllciwgVG9rZW4gZWFybGllck1vZGlmaWVyKSB7CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICBtb2RpZmllciwKICAgICAgICBjb2Rlcy50ZW1wbGF0ZUNvbmZsaWN0aW5nTW9kaWZpZXJzCiAgICAgICAgICAgIC53aXRoQXJndW1lbnRzKG1vZGlmaWVyLmxleGVtZSwgZWFybGllck1vZGlmaWVyLmxleGVtZSkpOwogIH0KCiAgdm9pZCByZXBvcnRFeHRyYW5lb3VzTW9kaWZpZXIoVG9rZW4gbW9kaWZpZXIpIHsKICAgIGlmIChtb2RpZmllciAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbW9kaWZpZXIsIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVyKTsKICAgIH0KICB9CgogIHZvaWQgcmVwb3J0RXh0cmFuZW91c01vZGlmaWVySW5FeHRlbnNpb24oVG9rZW4gbW9kaWZpZXIpIHsKICAgIGlmIChtb2RpZmllciAhPSBudWxsKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgbW9kaWZpZXIsIGNvZGVzLnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVySW5FeHRlbnNpb24pOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRNb2RpZmllck91dE9mT3JkZXIoVG9rZW4gbW9kaWZpZXIsIFN0cmluZyBiZWZvcmVNb2RpZmllcikgewogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgbW9kaWZpZXIsCiAgICAgICAgY29kZXMudGVtcGxhdGVNb2RpZmllck91dE9mT3JkZXIKICAgICAgICAgICAgLndpdGhBcmd1bWVudHMobW9kaWZpZXIubGV4ZW1lLCBiZWZvcmVNb2RpZmllcikpOwogIH0KfQqB4gBOTjwBKjQlKyciAR8bEiVCShMHQh0xHQ4qHSRKFAYEDwIBTEQgFxcUGBcUExcVEgFCHQFNFgEoATMlHRo7Kho4HScNH0AGBAFFAS8jFxkZMyIZGTUXJBk1FxkkDU4GBAE0MSMhJTwGLRIEAS0nTyMBPi8GMTM1RDpABh4sQyUnRggGLS0pKxIEATEyGSMhJTwGKS0SBAE6LiMtLi0rEgQBMTkjLS4tLSsSBAFGNkMwBkpPTD9MLSYyHRMtHiwoMCU0KTMoMCUvJDMoMSYuIxE+CkAwNRYPDwgZBhIEASUdKCEcEwYBECwxEQQBIh0lPRkBGjMmNQgTBgEQHi4zKTglRyMyDUwGEQQBJh0pHiIfGR0BHjknOyY6CBMGARAiLjMfJiU0JkwNOQYRBAElHSghHAEaMyc7KDwmOggTBgEQLDERBAEiHSU0GRMGARAeLjMfJiVHI0UkOA1MBhEEASEdJB0YASA2JTknOwgTBgEQLDERBAElHSghHAEgRCtIJ0QlQggTBgEQLDERBAEjHSZKGgEgOyc7JTkmOggTBgEQIkwmLjMfJg05BhEEASAdIzQXEwYBEBwuMx8mJTQlRQ1MBhEEAUsjEitGBAEyHC43BgQBPRwuQgYEAUkjEik+BAIBPHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL21vZGlmaWVyX2NvbnRleHQuZGFydGpmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL3JlY292ZXJ5X2xpc3RlbmVycy5kYXJ0ieUvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJ2ZvcndhcmRpbmdfbGlzdGVuZXIuZGFydCcgc2hvdyBGb3J3YXJkaW5nTGlzdGVuZXI7CgpjbGFzcyBDbGFzc0hlYWRlclJlY292ZXJ5TGlzdGVuZXIgZXh0ZW5kcyBGb3J3YXJkaW5nTGlzdGVuZXIgewogIFRva2VuIGV4dGVuZHNLZXl3b3JkOwogIFRva2VuIGltcGxlbWVudHNLZXl3b3JkOwogIFRva2VuIHdpdGhLZXl3b3JkOwoKICB2b2lkIGNsZWFyKCkgewogICAgZXh0ZW5kc0tleXdvcmQgPSBudWxsOwogICAgaW1wbGVtZW50c0tleXdvcmQgPSBudWxsOwogICAgd2l0aEtleXdvcmQgPSBudWxsOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc0V4dGVuZHMoVG9rZW4gZXh0ZW5kc0tleXdvcmQpIHsKICAgIHRoaXMuZXh0ZW5kc0tleXdvcmQgPSBleHRlbmRzS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUNsYXNzRXh0ZW5kcyhleHRlbmRzS2V5d29yZCk7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBpbnQgaW50ZXJmYWNlc0NvdW50KSB7CiAgICB0aGlzLmltcGxlbWVudHNLZXl3b3JkID0gaW1wbGVtZW50c0tleXdvcmQ7CiAgICBzdXBlci5oYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKGltcGxlbWVudHNLZXl3b3JkLCBpbnRlcmZhY2VzQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVDbGFzc1dpdGhDbGF1c2UoVG9rZW4gd2l0aEtleXdvcmQpIHsKICAgIHRoaXMud2l0aEtleXdvcmQgPSB3aXRoS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUNsYXNzV2l0aENsYXVzZSh3aXRoS2V5d29yZCk7CiAgfQp9CgpjbGFzcyBJbXBvcnRSZWNvdmVyeUxpc3RlbmVyIGV4dGVuZHMgRm9yd2FyZGluZ0xpc3RlbmVyIHsKICBUb2tlbiBhc0tleXdvcmQ7CiAgVG9rZW4gZGVmZXJyZWRLZXl3b3JkOwogIFRva2VuIGlmS2V5d29yZDsKICBib29sIGhhc0NvbWJpbmF0b3IgPSBmYWxzZTsKCiAgdm9pZCBjbGVhcigpIHsKICAgIGFzS2V5d29yZCA9IG51bGw7CiAgICBkZWZlcnJlZEtleXdvcmQgPSBudWxsOwogICAgaWZLZXl3b3JkID0gbnVsbDsKICAgIGhhc0NvbWJpbmF0b3IgPSBmYWxzZTsKICB9CgogIHZvaWQgZW5kQ29uZGl0aW9uYWxVcmkoVG9rZW4gaWZLZXl3b3JkLCBUb2tlbiBsZWZ0UGFyZW4sIFRva2VuIGVxdWFsU2lnbikgewogICAgdGhpcy5pZktleXdvcmQgPSBpZktleXdvcmQ7CiAgICBzdXBlci5lbmRDb25kaXRpb25hbFVyaShpZktleXdvcmQsIGxlZnRQYXJlbiwgZXF1YWxTaWduKTsKICB9CgogIHZvaWQgZW5kSGlkZShUb2tlbiBoaWRlS2V5d29yZCkgewogICAgdGhpcy5oYXNDb21iaW5hdG9yID0gdHJ1ZTsKICAgIHN1cGVyLmVuZEhpZGUoaGlkZUtleXdvcmQpOwogIH0KCiAgdm9pZCBlbmRTaG93KFRva2VuIHNob3dLZXl3b3JkKSB7CiAgICB0aGlzLmhhc0NvbWJpbmF0b3IgPSB0cnVlOwogICAgc3VwZXIuZW5kU2hvdyhzaG93S2V5d29yZCk7CiAgfQoKICB2b2lkIGhhbmRsZUltcG9ydFByZWZpeChUb2tlbiBkZWZlcnJlZEtleXdvcmQsIFRva2VuIGFzS2V5d29yZCkgewogICAgdGhpcy5kZWZlcnJlZEtleXdvcmQgPSBkZWZlcnJlZEtleXdvcmQ7CiAgICB0aGlzLmFzS2V5d29yZCA9IGFzS2V5d29yZDsKICAgIHN1cGVyLmhhbmRsZUltcG9ydFByZWZpeChkZWZlcnJlZEtleXdvcmQsIGFzS2V5d29yZCk7CiAgfQp9CgpjbGFzcyBNaXhpbkhlYWRlclJlY292ZXJ5TGlzdGVuZXIgZXh0ZW5kcyBGb3J3YXJkaW5nTGlzdGVuZXIgewogIFRva2VuIG9uS2V5d29yZDsKICBUb2tlbiBpbXBsZW1lbnRzS2V5d29yZDsKCiAgdm9pZCBjbGVhcigpIHsKICAgIG9uS2V5d29yZCA9IG51bGw7CiAgICBpbXBsZW1lbnRzS2V5d29yZCA9IG51bGw7CiAgfQoKICBAb3ZlcnJpZGUKICB2b2lkIGhhbmRsZUNsYXNzT3JNaXhpbkltcGxlbWVudHMoCiAgICAgIFRva2VuIGltcGxlbWVudHNLZXl3b3JkLCBpbnQgaW50ZXJmYWNlc0NvdW50KSB7CiAgICB0aGlzLmltcGxlbWVudHNLZXl3b3JkID0gaW1wbGVtZW50c0tleXdvcmQ7CiAgICBzdXBlci5oYW5kbGVDbGFzc09yTWl4aW5JbXBsZW1lbnRzKGltcGxlbWVudHNLZXl3b3JkLCBpbnRlcmZhY2VzQ291bnQpOwogIH0KCiAgQG92ZXJyaWRlCiAgdm9pZCBoYW5kbGVNaXhpbk9uKFRva2VuIG9uS2V5d29yZCwgaW50IHR5cGVDb3VudCkgewogICAgdGhpcy5vbktleXdvcmQgPSBvbktleXdvcmQ7CiAgICBzdXBlci5oYW5kbGVNaXhpbk9uKG9uS2V5d29yZCwgdHlwZUNvdW50KTsKICB9Cn0KYgBOTjwBKwE7AT8YGxUBERseGAQBDDIqLgQBDCU2MEwEAQwyJC4EAgE6ExkTHgERFhwWGwQBTiA+BAEkHyAEASQfIAQBRCwgOgQCAT8TGwERFh4EAQwlNjBMBAEMNyAvBAIBPnBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3JlY292ZXJ5X2xpc3RlbmVycy5kYXJ0bWZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvdG9rZW5fc3RyZWFtX3Jld3JpdGVyLmRhcnSc7i8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydCcgc2hvdyBVbm1hdGNoZWRUb2tlbjsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbi5kYXJ0JwogICAgc2hvdwogICAgICAgIEJlZ2luVG9rZW4sCiAgICAgICAgS2V5d29yZCwKICAgICAgICBTaW1wbGVUb2tlbiwKICAgICAgICBTeW50aGV0aWNCZWdpblRva2VuLAogICAgICAgIFN5bnRoZXRpY0tleXdvcmRUb2tlbiwKICAgICAgICBTeW50aGV0aWNTdHJpbmdUb2tlbiwKICAgICAgICBTeW50aGV0aWNUb2tlbiwKICAgICAgICBUb2tlbiwKICAgICAgICBUb2tlblR5cGU7CgovLy8gUHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgb2YgaW5zZXJ0aW5nIHRva2VucyBpbnRvIGEgdG9rZW4gc3RyZWFtLiBUaGlzCi8vLyBpbXBsZW1lbnRhdGlvbiBkb2VzIHRoaXMgYnkgcmV3cml0aW5nIHRoZSBwcmV2aW91cyB0b2tlbiB0byBwb2ludCB0byB0aGUKLy8vIGluc2VydGVkIHRva2VuLgpjbGFzcyBUb2tlblN0cmVhbVJld3JpdGVyIHdpdGggX1Rva2VuU3RyZWFtTWl4aW4gewogIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pOgogIC8vCiAgLy8gV2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IG9mIHJlbW92aW5nIGB0b2tlbi5wcmV2aW91c2AsIHRoZSBwbGFuIGlzIHRvCiAgLy8gY29udmVydCB0aGlzIGludG8gYW4gaW50ZXJmYWNlIGFuZCBwcm92aWRlIHR3byBpbXBsZW1lbnRhdGlvbnMuCiAgLy8KICAvLyBPbmUsIHVzZWQgYnkgRmFzdGEsIHdpbGwgY29ubmVjdCB0aGUgaW5zZXJ0ZWQgdG9rZW5zIHRvIHRoZSBmb2xsb3dpbmcgdG9rZW4KICAvLyB3aXRob3V0IG1vZGlmeWluZyB0aGUgcHJldmlvdXMgdG9rZW4uCiAgLy8KICAvLyBUaGUgb3RoZXIsIHVzZWQgYnkgJ2FuYWx5emVyJywgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGZpcnN0IHRva2VuIGluIHRoZQogIC8vIHN0cmVhbSAoYWN0dWFsbHkgd2l0aCB0aGUgQk9GIG1hcmtlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0pLiBJdAogIC8vIHdpbGwgYmUgY3JlYXRlZCBvbmx5IHdoZW4gaW52b2tpbmcgJ2FuYWx5emVyJyBzcGVjaWZpYyBwYXJzZSBtZXRob2RzIChpbgogIC8vIGBQYXJzZXJgKSwgc3VjaCBhcwogIC8vCiAgLy8gVG9rZW4gcGFyc2VVbml0V2l0aFJld3JpdGUoVG9rZW4gYm9mKSB7CiAgLy8gICByZXdyaXRlciA9IEFuYWx5emVyVG9rZW5TdHJlYW1SZXdyaXRlcihib2YpOwogIC8vICAgcmV0dXJuIHBhcnNlVW5pdChib2YubmV4dCk7CiAgLy8gfQogIC8vCgogIC8vLyBJbnNlcnQgYSBzeW50aGV0aWMgb3BlbiBhbmQgY2xvc2UgcGFyZW50aGVzaXMgYW5kIHJldHVybiB0aGUgbmV3IHN5bnRoZXRpYwogIC8vLyBvcGVuIHBhcmVudGhlc2lzLiBJZiBbaW5zZXJ0SWRlbnRpZmllcl0gaXMgdHJ1ZSwgdGhlbiBhIHN5bnRoZXRpYwogIC8vLyBpZGVudGlmaWVyIGlzIGluY2x1ZGVkIGJldHdlZW4gdGhlIG9wZW4gYW5kIGNsb3NlIHBhcmVudGhlc2lzLgogIFRva2VuIGluc2VydFBhcmVucyhUb2tlbiB0b2tlbiwgYm9vbCBpbmNsdWRlSWRlbnRpZmllcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpbnQgb2Zmc2V0ID0gbmV4dC5jaGFyT2Zmc2V0OwogICAgQmVnaW5Ub2tlbiBsZWZ0UGFyZW4gPQogICAgICAgIG5leHQgPSBuZXcgU3ludGhldGljQmVnaW5Ub2tlbihUb2tlblR5cGUuT1BFTl9QQVJFTiwgb2Zmc2V0KTsKICAgIGlmIChpbmNsdWRlSWRlbnRpZmllcikgewogICAgICBuZXh0ID0gbmV4dC5zZXROZXh0KAogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgb2Zmc2V0LCAwKSk7CiAgICB9CiAgICBuZXh0ID0gbmV4dC5zZXROZXh0KG5ldyBTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuQ0xPU0VfUEFSRU4sIG9mZnNldCkpOwogICAgbGVmdFBhcmVuLmVuZEdyb3VwID0gbmV4dDsKICAgIG5leHQuc2V0TmV4dCh0b2tlbi5uZXh0KTsKCiAgICAvLyBBIG5vLW9wIHJld3JpdGVyIGNvdWxkIHNraXAgdGhpcyBzdGVwLgogICAgdG9rZW4uc2V0TmV4dChsZWZ0UGFyZW4pOwoKICAgIHJldHVybiBsZWZ0UGFyZW47CiAgfQoKICAvLy8gSW5zZXJ0IFtuZXdUb2tlbl0gYWZ0ZXIgW3Rva2VuXSBhbmQgcmV0dXJuIFtuZXdUb2tlbl0uCiAgVG9rZW4gaW5zZXJ0VG9rZW4oVG9rZW4gdG9rZW4sIFRva2VuIG5ld1Rva2VuKSB7CiAgICBuZXdUb2tlbi5zZXROZXh0KHRva2VuLm5leHQpOwoKICAgIC8vIEEgbm8tb3AgcmV3cml0ZXIgY291bGQgc2tpcCB0aGlzIHN0ZXAuCiAgICB0b2tlbi5zZXROZXh0KG5ld1Rva2VuKTsKCiAgICByZXR1cm4gbmV3VG9rZW47CiAgfQoKICAvLy8gTW92ZSBbZW5kR3JvdXBdIChhIHN5bnRoZXRpYyBgKWAsIGBdYCwgb3IgYH1gIHRva2VuKSBhbmQgYXNzb2NpYXRlZAogIC8vLyBlcnJvciB0b2tlbiBhZnRlciBbdG9rZW5dIGluIHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJldHVybiBbZW5kR3JvdXBdLgogIFRva2VuIG1vdmVTeW50aGV0aWMoVG9rZW4gdG9rZW4sIFRva2VuIGVuZEdyb3VwKSB7CiAgICBhc3NlcnQoZW5kR3JvdXAuYmVmb3JlU3ludGhldGljICE9IG51bGwpOwogICAgaWYgKHRva2VuID09IGVuZEdyb3VwKSByZXR1cm4gZW5kR3JvdXA7CiAgICBUb2tlbiBlcnJvclRva2VuOwogICAgaWYgKGVuZEdyb3VwLm5leHQgaXMgVW5tYXRjaGVkVG9rZW4pIHsKICAgICAgZXJyb3JUb2tlbiA9IGVuZEdyb3VwLm5leHQ7CiAgICB9CgogICAgLy8gUmVtb3ZlIGVuZEdyb3VwIGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb24KICAgIGVuZEdyb3VwLmJlZm9yZVN5bnRoZXRpYy5zZXROZXh0KChlcnJvclRva2VuID8/IGVuZEdyb3VwKS5uZXh0KTsKCiAgICAvLyBJbnNlcnQgZW5kR3JvdXAgaW50byBpdHMgbmV3IGxvY2F0aW9uCiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIHRva2VuLnNldE5leHQoZW5kR3JvdXApOwogICAgKGVycm9yVG9rZW4gPz8gZW5kR3JvdXApLnNldE5leHQobmV4dCk7CiAgICBlbmRHcm91cC5vZmZzZXQgPSBuZXh0Lm9mZnNldDsKICAgIGlmIChlcnJvclRva2VuICE9IG51bGwpIHsKICAgICAgZXJyb3JUb2tlbi5vZmZzZXQgPSBuZXh0Lm9mZnNldDsKICAgIH0KCiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICAvLy8gUmVwbGFjZSB0aGUgc2luZ2xlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgW3ByZXZpb3VzVG9rZW5dIHdpdGgKICAvLy8gdGhlIGNoYWluIG9mIHRva2VucyBzdGFydGluZyBhdCB0aGUgW3JlcGxhY2VtZW50VG9rZW5dLiBSZXR1cm4gdGhlCiAgLy8vIFtyZXBsYWNlbWVudFRva2VuXS4KICBUb2tlbiByZXBsYWNlVG9rZW5Gb2xsb3dpbmcoVG9rZW4gcHJldmlvdXNUb2tlbiwgVG9rZW4gcmVwbGFjZW1lbnRUb2tlbikgewogICAgVG9rZW4gcmVwbGFjZWRUb2tlbiA9IHByZXZpb3VzVG9rZW4ubmV4dDsKICAgIHByZXZpb3VzVG9rZW4uc2V0TmV4dChyZXBsYWNlbWVudFRva2VuKTsKCiAgICAocmVwbGFjZW1lbnRUb2tlbiBhcyBTaW1wbGVUb2tlbikucHJlY2VkaW5nQ29tbWVudHMgPQogICAgICAgIHJlcGxhY2VkVG9rZW4ucHJlY2VkaW5nQ29tbWVudHM7CgogICAgX2xhc3RUb2tlbkluQ2hhaW4ocmVwbGFjZW1lbnRUb2tlbikuc2V0TmV4dChyZXBsYWNlZFRva2VuLm5leHQpOwoKICAgIHJldHVybiByZXBsYWNlbWVudFRva2VuOwogIH0KCiAgLy8vIEdpdmVuIHRoZSBbZmlyc3RUb2tlbl0gaW4gYSBjaGFpbiBvZiB0b2tlbnMgdG8gYmUgaW5zZXJ0ZWQsIHJldHVybiB0aGUKICAvLy8gbGFzdCB0b2tlbiBpbiB0aGUgY2hhaW4uCiAgLy8vCiAgLy8vIEFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgbWV0aG9kIGFsc28gZW5zdXJlcyB0aGF0IHRoZSB0b2tlbnMgaW4gdGhlIGNoYWluCiAgLy8vIGhhdmUgdGhlaXIgYHByZXZpb3VzYCBwb2ludGVycyBzZXQgY29ycmVjdGx5LgogIFRva2VuIF9sYXN0VG9rZW5JbkNoYWluKFRva2VuIGZpcnN0VG9rZW4pIHsKICAgIFRva2VuIHByZXZpb3VzOwogICAgVG9rZW4gY3VycmVudCA9IGZpcnN0VG9rZW47CiAgICB3aGlsZSAoY3VycmVudC5uZXh0ICE9IG51bGwgJiYgY3VycmVudC5uZXh0LnR5cGUgIT0gVG9rZW5UeXBlLkVPRikgewogICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICAgIGN1cnJlbnQucHJldmlvdXMgPSBwcmV2aW91czsKICAgICAgfQogICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICB9CiAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkgewogICAgICBjdXJyZW50LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICB9CiAgICByZXR1cm4gY3VycmVudDsKICB9Cn0KCi8vLyBQcm92aWRlcyB0aGUgY2FwYWJpbGl0eSBvZiBhZGRpbmcgdG9rZW5zIHRoYXQgbGVhZCBpbnRvIGEgdG9rZW4gc3RyZWFtCi8vLyB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgdG9rZW4gc3RyZWFtIGFuZCBub3Qgc2V0dGluZyB0aGUgYW55IHRva2VuJ3MKLy8vIGBwcmV2aW91c2AgZmllbGQuCmNsYXNzIFRva2VuU3RyZWFtR2hvc3RXcml0ZXIKICAgIHdpdGggX1Rva2VuU3RyZWFtTWl4aW4KICAgIGltcGxlbWVudHMgVG9rZW5TdHJlYW1SZXdyaXRlciB7CiAgQG92ZXJyaWRlCiAgVG9rZW4gaW5zZXJ0UGFyZW5zKFRva2VuIHRva2VuLCBib29sIGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGludCBvZmZzZXQgPSBuZXh0LmNoYXJPZmZzZXQ7CiAgICBCZWdpblRva2VuIGxlZnRQYXJlbiA9CiAgICAgICAgbmV4dCA9IG5ldyBTeW50aGV0aWNCZWdpblRva2VuKFRva2VuVHlwZS5PUEVOX1BBUkVOLCBvZmZzZXQpOwogICAgaWYgKGluY2x1ZGVJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIGlkZW50aWZpZXIgPQogICAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKFRva2VuVHlwZS5JREVOVElGSUVSLCAnJywgb2Zmc2V0LCAwKTsKICAgICAgbmV4dC5uZXh0ID0gaWRlbnRpZmllcjsKICAgICAgbmV4dCA9IGlkZW50aWZpZXI7CiAgICB9CiAgICBUb2tlbiByaWdodFBhcmVuID0gbmV3IFN5bnRoZXRpY1Rva2VuKFRva2VuVHlwZS5DTE9TRV9QQVJFTiwgb2Zmc2V0KTsKICAgIG5leHQubmV4dCA9IHJpZ2h0UGFyZW47CiAgICByaWdodFBhcmVuLm5leHQgPSB0b2tlbi5uZXh0OwoKICAgIHJldHVybiBsZWZ0UGFyZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBpbnNlcnRUb2tlbihUb2tlbiB0b2tlbiwgVG9rZW4gbmV3VG9rZW4pIHsKICAgIG5ld1Rva2VuLm5leHQgPSB0b2tlbi5uZXh0OwogICAgcmV0dXJuIG5ld1Rva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gbW92ZVN5bnRoZXRpYyhUb2tlbiB0b2tlbiwgVG9rZW4gZW5kR3JvdXApIHsKICAgIFRva2VuIG5ld0VuZEdyb3VwID0KICAgICAgICBuZXcgU3ludGhldGljVG9rZW4oZW5kR3JvdXAudHlwZSwgdG9rZW4ubmV4dC5jaGFyT2Zmc2V0KTsKICAgIG5ld0VuZEdyb3VwLm5leHQgPSB0b2tlbi5uZXh0OwogICAgcmV0dXJuIG5ld0VuZEdyb3VwOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gcmVwbGFjZVRva2VuRm9sbG93aW5nKFRva2VuIHByZXZpb3VzVG9rZW4sIFRva2VuIHJlcGxhY2VtZW50VG9rZW4pIHsKICAgIFRva2VuIHJlcGxhY2VkVG9rZW4gPSBwcmV2aW91c1Rva2VuLm5leHQ7CgogICAgKHJlcGxhY2VtZW50VG9rZW4gYXMgU2ltcGxlVG9rZW4pLnByZWNlZGluZ0NvbW1lbnRzID0KICAgICAgICByZXBsYWNlZFRva2VuLnByZWNlZGluZ0NvbW1lbnRzOwoKICAgIF9sYXN0VG9rZW5JbkNoYWluKHJlcGxhY2VtZW50VG9rZW4pLm5leHQgPSByZXBsYWNlZFRva2VuLm5leHQ7CiAgICByZXR1cm4gcmVwbGFjZW1lbnRUb2tlbjsKICB9CgogIC8vLyBHaXZlbiB0aGUgW2ZpcnN0VG9rZW5dIGluIGEgY2hhaW4gb2YgdG9rZW5zIHRvIGJlIGluc2VydGVkLCByZXR1cm4gdGhlCiAgLy8vIGxhc3QgdG9rZW4gaW4gdGhlIGNoYWluLgogIFRva2VuIF9sYXN0VG9rZW5JbkNoYWluKFRva2VuIGZpcnN0VG9rZW4pIHsKICAgIFRva2VuIGN1cnJlbnQgPSBmaXJzdFRva2VuOwogICAgd2hpbGUgKGN1cnJlbnQubmV4dCAhPSBudWxsICYmIGN1cnJlbnQubmV4dC50eXBlICE9IFRva2VuVHlwZS5FT0YpIHsKICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgIH0KICAgIHJldHVybiBjdXJyZW50OwogIH0KfQoKbWl4aW4gX1Rva2VuU3RyZWFtTWl4aW4gewogIC8vLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciBhZnRlciBbdG9rZW5dIGFuZCByZXR1cm4gdGhlIG5ldyBpZGVudGlmaWVyLgogIFRva2VuIGluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFtTdHJpbmcgdmFsdWVdKSB7CiAgICByZXR1cm4gaW5zZXJ0VG9rZW4oCiAgICAgICAgdG9rZW4sCiAgICAgICAgbmV3IFN5bnRoZXRpY1N0cmluZ1Rva2VuKAogICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgdmFsdWUgPz8gJycsIHRva2VuLm5leHQuY2hhck9mZnNldCwgMCkpOwogIH0KCiAgLy8vIEluc2VydCBhIG5ldyBzeW50aGV0aWMgW2tleXdvcmRdIGFmdGVyIFt0b2tlbl0gYW5kIHJldHVybiB0aGUgbmV3IHRva2VuLgogIFRva2VuIGluc2VydFN5bnRoZXRpY0tleXdvcmQoVG9rZW4gdG9rZW4sIEtleXdvcmQga2V5d29yZCkgPT4gaW5zZXJ0VG9rZW4oCiAgICAgIHRva2VuLCBuZXcgU3ludGhldGljS2V5d29yZFRva2VuKGtleXdvcmQsIHRva2VuLm5leHQuY2hhck9mZnNldCkpOwoKICAvLy8gSW5zZXJ0IGEgbmV3IHNpbXBsZSBzeW50aGV0aWMgdG9rZW4gb2YgW25ld1Rva2VuVHlwZV0gYWZ0ZXIgW3Rva2VuXQogIC8vLyBhbmQgcmV0dXJuIHRoZSBuZXcgdG9rZW4uCiAgVG9rZW4gaW5zZXJ0U3ludGhldGljVG9rZW4oVG9rZW4gdG9rZW4sIFRva2VuVHlwZSBuZXdUb2tlblR5cGUpIHsKICAgIGFzc2VydChuZXdUb2tlblR5cGUgaXMhIEtleXdvcmQsICd1c2UgaW5zZXJ0U3ludGhldGljS2V5d29yZCBpbnN0ZWFkJyk7CiAgICByZXR1cm4gaW5zZXJ0VG9rZW4oCiAgICAgICAgdG9rZW4sIG5ldyBTeW50aGV0aWNUb2tlbihuZXdUb2tlblR5cGUsIHRva2VuLm5leHQuY2hhck9mZnNldCkpOwogIH0KCiAgLy8vIEluc2VydCBbbmV3VG9rZW5dIGFmdGVyIFt0b2tlbl0gYW5kIHJldHVybiBbbmV3VG9rZW5dLgogIFRva2VuIGluc2VydFRva2VuKFRva2VuIHRva2VuLCBUb2tlbiBuZXdUb2tlbik7Cn0KgN4ATk48AToBHwkUERUdHx4YDxMBSk0UMxsFS0UFUSsFUE5OGAUtNCMHBQFRSEU8HSIbRh0bSgZMHx4BLh4BFgQBPTMiAS4dARUEAUpLNS4sFisiBgExRQEtHR0sIx4nBgEVBAFOSRpNLi0BOikBRQEdBAFNHwZONC4UIEkeJQgaHgYcIwYUBAIBS1AWHRslDDwdIhtGHRlJHhkGShwiARYEAQwzIBUEAQw1GEIjGAQBDE0uATopAUMdBAFNHy4gSR4GFAQCARpRQRgPIksEAU9NSQFKIERMGEkEAT0yAgFBcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdG9rZW5fc3RyZWFtX3Jld3JpdGVyLmRhcnRhZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci90eXBlX2luZm8uZGFydLUZLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIudHlwZV9pbmZvOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW4sIFRva2VuVHlwZTsKCmltcG9ydCAnLi4vc2Nhbm5lci90b2tlbl9jb25zdGFudHMuZGFydCcgc2hvdyBJREVOVElGSUVSX1RPS0VOLCBLRVlXT1JEX1RPS0VOOwoKaW1wb3J0ICdwYXJzZXJfaW1wbC5kYXJ0JyBzaG93IFBhcnNlcjsKCmltcG9ydCAndHlwZV9pbmZvX2ltcGwuZGFydCc7CgppbXBvcnQgJ3V0aWwuZGFydCcgc2hvdyBpc09uZU9mLCBvcHRpb25hbDsKCi8vLyBbVHlwZUluZm9dIHByb3ZpZGVzIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBieSBbY29tcHV0ZVR5cGVdCi8vLyBhYm91dCBhIHBhcnRpY3VsYXIgdHlwZSByZWZlcmVuY2UuCmFic3RyYWN0IGNsYXNzIFR5cGVJbmZvIHsKICAvLy8gUmV0dXJuIHR5cGUgaW5mbyByZXByZXNlbnRpbmcgdGhlIHJlY2VpdmVyIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGA/YAogIC8vLyBvciB0aGUgcmVjZWl2ZXIgaWYgdGhlIHJlY2VpdmVyIGRvZXMgbm90IHJlcHJlc2VudCBhIG51bGxhYmxlIHR5cGUuCiAgVHlwZUluZm8gZ2V0IGFzTm9uTnVsbGFibGU7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGUKICAvLy8gcmVjZWl2ZXIgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSB2YWxpZCBzdGFuZGFsb25lIGV4cHJlc3Npb24uCiAgLy8vIEZvciBleGFtcGxlLCBgQWAgb3IgYEEuYmAgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdHlwZSByZWZlcmVuY2VzCiAgLy8vIG9yIGV4cHJlc3Npb25zLCB3aGlsZSBgQTxUPmAgb25seSBsb29rcyBsaWtlIGEgdHlwZSByZWZlcmVuY2UuCiAgYm9vbCBnZXQgY291bGRCZUV4cHJlc3Npb247CgogIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGEgdHJhaWxpbmcgYD9gLgogIGJvb2wgZ2V0IGlzTnVsbGFibGU7CgogIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSBtdXN0IGJlIGEgdHlwZSAobm90IHZvaWQpLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUsIGluc2VydGluZyBhIHN5bnRoZXRpYyB0eXBlIHJlZmVyZW5jZSBpZgogIC8vLyBuZWNlc3NhcnkuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gCiAgLy8vIG9yIGA+Pj49YCBpbiB2YWxpZCBjb2RlIG9yIGR1cmluZyByZWNvdmVyeS4KICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcik7CgogIC8vLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgdG9rZW4gYWZ0ZXIgW3Rva2VuXSBtdXN0IGJlIGEgdHlwZSBvciB2b2lkLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUsIGluc2VydGluZyBhIHN5bnRoZXRpYyB0eXBlIHJlZmVyZW5jZSBpZgogIC8vLyBuZWNlc3NhcnkuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gCiAgLy8vIG9yIGA+Pj49YCBpbiB2YWxpZCBjb2RlIG9yIGR1cmluZyByZWNvdmVyeS4KICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBwYXJzZSBhbiBvcHRpb25hbCB0eXBlIChub3Qgdm9pZCkgYWZ0ZXIgW3Rva2VuXS4KICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IG1ldGhvZHMgb24gdGhlIFtQYXJzZXJdJ3MKICAvLy8gbGlzdGVuZXIgdG8gaGFuZGxlIHRoZSB0eXBlLiBUaGlzIG1heSBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbQogIC8vLyB3aGVuIHBhcnNpbmcgYD4+YCBvciBgPj4+YCBvciBgPj4+PWAgIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIGFuIG9wdGlvbmFsIHR5cGUgb3Igdm9pZCBhZnRlciBbdG9rZW5dLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIHR5cGUuIFRoaXMgbWF5IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtCiAgLy8vIHdoZW4gcGFyc2luZyBgPj5gIG9yIGA+Pj5gIG9yIGA+Pj49YCBpbiB2YWxpZCBjb2RlIG9yIGR1cmluZyByZWNvdmVyeS4KICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpOwoKICAvLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIFt0b2tlbl0gYmVmb3JlIHRoZSB0eXBlIHRvIG9idGFpbgogIC8vLyB0aGUgbGFzdCB0b2tlbiBpbiB0aGUgdHlwZS4gSWYgdGhlcmUgaXMgbm8gdHlwZSwgdGhlbiB0aGlzIG1ldGhvZAogIC8vLyB3aWxsIHJldHVybiBbdG9rZW5dLiBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgogIFRva2VuIHNraXBUeXBlKFRva2VuIHRva2VuKTsKfQoKLy8vIFtUeXBlUGFyYW1PckFyZ0luZm9dIHByb3ZpZGVzIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gYWJvdXQgYSBwYXJ0aWN1bGFyIGdyb3VwIG9mIHR5cGUgYXJndW1lbnRzCi8vLyBvciB0eXBlIHBhcmFtZXRlcnMuCmFic3RyYWN0IGNsYXNzIFR5cGVQYXJhbU9yQXJnSW5mbyB7CiAgY29uc3QgVHlwZVBhcmFtT3JBcmdJbmZvKCk7CgogIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGEgc2luZ2xlIHR5cGUgYXJndW1lbnQKICBib29sIGdldCBpc1NpbXBsZVR5cGVBcmd1bWVudCA9PiBmYWxzZTsKCiAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzCiAgaW50IGdldCB0eXBlQXJndW1lbnRDb3VudDsKCiAgLy8vIFJldHVybiB0aGUgc2ltcGxlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2ltcGxlIHR5cGUgYXJndW1lbnQKICAvLy8gb3IgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgc2ltcGxlIHR5cGUgYXJndW1lbnQuCiAgVHlwZUluZm8gZ2V0IHR5cGVJbmZvIHsKICAgIHRocm93ICJJbnRlcm5hbCBlcnJvcjogJHJ1bnRpbWVUeXBlIGlzIG5vdCBhIFNpbXBsZVR5cGVBcmd1bWVudC4iOwogIH0KCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBwYXJzZSBvcHRpb25hbCB0eXBlIGFyZ3VtZW50cyBhZnRlciBbdG9rZW5dLgogIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbWV0aG9kcyBvbiB0aGUgW1BhcnNlcl0ncwogIC8vLyBsaXN0ZW5lciB0byBoYW5kbGUgdGhlIGFyZ3VtZW50cy4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0KICAvLy8gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAgb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlQXJndW1lbnRzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBwYXJzZSBvcHRpb25hbCB0eXBlIHBhcmFtZXRlcnMKICAvLy8gKGFsc28ga25vd24gYXMgdHlwZSB2YXJpYWJsZXMpIGFmdGVyIFt0b2tlbl0uCiAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBldmVudCBtZXRob2RzIG9uIHRoZSBbUGFyc2VyXSdzCiAgLy8vIGxpc3RlbmVyIHRvIGhhbmRsZSB0aGUgcGFyYW1ldGVycy4gVGhpcyBtYXkgbW9kaWZ5IHRoZSB0b2tlbiBzdHJlYW0KICAvLy8gd2hlbiBwYXJzaW5nIGA+PmAgb3IgYD4+PmAgb3IgYD4+Pj1gIGluIHZhbGlkIGNvZGUgb3IgZHVyaW5nIHJlY292ZXJ5LgogIFRva2VuIHBhcnNlVmFyaWFibGVzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKTsKCiAgLy8vIENhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBbdG9rZW5dIGJlZm9yZSB0aGUgdHlwZSB2YXIgdG8gb2J0YWluCiAgLy8vIHRoZSBsYXN0IHRva2VuIGluIHRoZSB0eXBlIHZhci4gSWYgdGhlcmUgaXMgbm8gdHlwZSB2YXIsIHRoZW4gdGhpcyBtZXRob2QKICAvLy8gd2lsbCByZXR1cm4gW3Rva2VuXS4gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIHRva2VuIHN0cmVhbS4KICBUb2tlbiBza2lwKFRva2VuIHRva2VuKTsKfQoKLy8vIFtOb1R5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdIHdoZW4KLy8vIHRoZXJlIGlzIG5vIHR5cGUgaW5mb3JtYXRpb24gaW4gdGhlIHNvdXJjZS4KY29uc3QgVHlwZUluZm8gbm9UeXBlID0gY29uc3QgTm9UeXBlKCk7CgovLy8gW05vVHlwZVBhcmFtT3JBcmddIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVQYXJhbU9yQXJnSW5mb10gcmV0dXJuZWQgYnkKLy8vIFtjb21wdXRlVHlwZVBhcmFtT3JBcmddIHdoZW4gbm8gdHlwZSBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cyBhcmUgZm91bmQuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBub1R5cGVQYXJhbU9yQXJnID0gY29uc3QgTm9UeXBlUGFyYW1PckFyZygpOwoKLy8vIFtWb2lkVHlwZV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0gd2hlbgovLy8gYHZvaWRgIGFwcGVhcnMgaW4gdGhlIHNvdXJjZS4KY29uc3QgVHlwZUluZm8gdm9pZFR5cGUgPSBjb25zdCBWb2lkVHlwZSgpOwoKYm9vbCBpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIG9wdGlvbmFsKCdGdW5jdGlvbicsIHRva2VuKSAmJgogICAgICAob3B0aW9uYWwoJzwnLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnKCcsIHRva2VuLm5leHQpKTsKfQoKYm9vbCBpc1ZhbGlkVHlwZVJlZmVyZW5jZShUb2tlbiB0b2tlbikgewogIGludCBraW5kID0gdG9rZW4ua2luZDsKICBpZiAoSURFTlRJRklFUl9UT0tFTiA9PSBraW5kKSByZXR1cm4gdHJ1ZTsKICBpZiAoS0VZV09SRF9UT0tFTiA9PSBraW5kKSB7CiAgICBUb2tlblR5cGUgdHlwZSA9IHRva2VuLnR5cGU7CiAgICBTdHJpbmcgdmFsdWUgPSB0eXBlLmxleGVtZTsKICAgIHJldHVybiB0eXBlLmlzUHNldWRvIHx8CiAgICAgICAgKHR5cGUuaXNCdWlsdEluICYmIG9wdGlvbmFsKCcuJywgdG9rZW4ubmV4dCkpIHx8CiAgICAgICAgKGlkZW50aWNhbCh2YWx1ZSwgJ2R5bmFtaWMnKSkgfHwKICAgICAgICAoaWRlbnRpY2FsKHZhbHVlLCAndm9pZCcpKTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gQ2FsbGVkIGJ5IHRoZSBwYXJzZXIgdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGEgcG9zc2libGUgdHlwZSByZWZlcmVuY2UKLy8vIHRoYXQgZm9sbG93cyBbdG9rZW5dLiBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgovLy8KLy8vIElmIFtpbkRlY2xhcmF0aW9uXSBpcyBgdHJ1ZWAsIHRoZW4gdGhpcyB3aWxsIG1vcmUgYWdncmVzc2l2ZWx5IHJlY292ZXIKLy8vIGdpdmVuIHVuYmFsYW5jZWQgYDxgIGA+YCBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KVHlwZUluZm8gY29tcHV0ZVR5cGUoZmluYWwgVG9rZW4gdG9rZW4sIGJvb2wgcmVxdWlyZWQsCiAgICBbYm9vbCBpbkRlY2xhcmF0aW9uID0gZmFsc2VdKSB7CiAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgaWYgKCFpc1ZhbGlkVHlwZVJlZmVyZW5jZShuZXh0KSkgewogICAgaWYgKG5leHQudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgVHlwZVBhcmFtT3JBcmdJbmZvIHR5cGVQYXJhbU9yQXJnID0KICAgICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKTsKICAgICAgaWYgKHR5cGVQYXJhbU9yQXJnICE9IG5vVHlwZVBhcmFtT3JBcmcpIHsKICAgICAgICAvLyBSZWNvdmVyeTogYnVpbHQtaW4gYDxgIC4uLiBgPmAKICAgICAgICBpZiAocmVxdWlyZWQgfHwgbG9va3NMaWtlTmFtZSh0eXBlUGFyYW1PckFyZy5za2lwKG5leHQpLm5leHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgdHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAgICAgLmNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGUocmVxdWlyZWQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZCB8fCBpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQubmV4dCkpIHsKICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0LnN0cmluZ1ZhbHVlOwogICAgICAgIGlmICgoIWlkZW50aWNhbCgnZ2V0JywgdmFsdWUpICYmCiAgICAgICAgICAgICFpZGVudGljYWwoJ3NldCcsIHZhbHVlKSAmJgogICAgICAgICAgICAhaWRlbnRpY2FsKCdmYWN0b3J5JywgdmFsdWUpICYmCiAgICAgICAgICAgICFpZGVudGljYWwoJ29wZXJhdG9yJywgdmFsdWUpICYmCiAgICAgICAgICAgICEoaWRlbnRpY2FsKCd0eXBlZGVmJywgdmFsdWUpICYmIG5leHQubmV4dC5pc0lkZW50aWZpZXIpKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIHR5cGVQYXJhbU9yQXJnKQogICAgICAgICAgICAgIC5jb21wdXRlQnVpbHRpbk9yVmFyQXNUeXBlKHJlcXVpcmVkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmVxdWlyZWQpIHsKICAgICAgLy8gUmVjb3ZlcnkKICAgICAgaWYgKG9wdGlvbmFsKCcuJywgbmV4dCkpIHsKICAgICAgICAvLyBMb29rcyBsaWtlIHByZWZpeGVkIHR5cGUgbWlzc2luZyB0aGUgcHJlZml4CiAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8oCiAgICAgICAgICAgICAgICB0b2tlbiwgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKG5leHQsIGluRGVjbGFyYXRpb24pKQogICAgICAgICAgICAuY29tcHV0ZVByZWZpeGVkVHlwZShyZXF1aXJlZCk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpICYmCiAgICAgICAgICBpc09uZU9mKG5leHQubmV4dCwgY29uc3QgWyc8JywgJywnLCAnPiddKSkgewogICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKAogICAgICAgICAgICAgICAgdG9rZW4sIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKSkKICAgICAgICAgICAgLmNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGUocmVxdWlyZWQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9UeXBlOwogIH0KCiAgaWYgKG9wdGlvbmFsKCd2b2lkJywgbmV4dCkpIHsKICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAvLyBgdm9pZGAgYEZ1bmN0aW9uYCAuLi4KICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAuY29tcHV0ZVZvaWRHRlQocmVxdWlyZWQpOwogICAgfQogICAgLy8gYHZvaWRgCiAgICByZXR1cm4gdm9pZFR5cGU7CiAgfQoKICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgLy8gYEZ1bmN0aW9uYCAuLi4KICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCBub1R5cGVQYXJhbU9yQXJnKQogICAgICAgIC5jb21wdXRlTm9UeXBlR0ZUKHRva2VuLCByZXF1aXJlZCk7CiAgfQoKICAvLyBXZSd2ZSBzZWVuIGFuIGlkZW50aWZpZXIuCgogIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlUGFyYW1PckFyZyA9CiAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhuZXh0LCBpbkRlY2xhcmF0aW9uKTsKICBpZiAodHlwZVBhcmFtT3JBcmcgIT0gbm9UeXBlUGFyYW1PckFyZykgewogICAgaWYgKHR5cGVQYXJhbU9yQXJnLmlzU2ltcGxlVHlwZUFyZ3VtZW50KSB7CiAgICAgIC8vIFdlJ3ZlIHNlZW4gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAKICAgICAgbmV4dCA9IHR5cGVQYXJhbU9yQXJnLnNraXAobmV4dCkubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgICAgICBuZXh0ID0gbmV4dC5uZXh0OwogICAgICAgIGlmICghaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAgICAgaWYgKChyZXF1aXJlZCB8fCBsb29rc0xpa2VOYW1lKG5leHQpKSAmJgogICAgICAgICAgICAgIHR5cGVQYXJhbU9yQXJnID09IHNpbXBsZVR5cGVBcmd1bWVudDEpIHsKICAgICAgICAgICAgLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgYD9gIGlkZW50aWZpZXIKICAgICAgICAgICAgcmV0dXJuIHNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGA+YCBgP2Agbm9uLWlkZW50aWZpZXIKICAgICAgICAgIHJldHVybiBub1R5cGU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgICAgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgICAgIC8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD5gIGlkZW50aWZpZXIKICAgICAgICAgIHJldHVybiB0eXBlUGFyYW1PckFyZy50eXBlSW5mbzsKICAgICAgICB9CiAgICAgICAgLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgbm9uLWlkZW50aWZpZXIKICAgICAgICByZXR1cm4gbm9UeXBlOwogICAgICB9CiAgICB9CiAgICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYWRkaW5nIGEgY29uc3QgZm9yCiAgICAvLyBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGAsYCBpZGVudGlmaWVyIGA+YAogICAgLy8gaWYgdGhhdCBwcm92ZXMgdG8gYmUgYSBjb21tb24gY2FzZS4KCiAgICAvLyBpZGVudGlmaWVyIGA8YCAuLi4gYD5gCiAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgdHlwZVBhcmFtT3JBcmcpCiAgICAgICAgLmNvbXB1dGVTaW1wbGVXaXRoVHlwZUFyZ3VtZW50cyhyZXF1aXJlZCk7CiAgfQoKICBhc3NlcnQodHlwZVBhcmFtT3JBcmcgPT0gbm9UeXBlUGFyYW1PckFyZyk7CiAgbmV4dCA9IG5leHQubmV4dDsKICBpZiAob3B0aW9uYWwoJy4nLCBuZXh0KSkgewogICAgbmV4dCA9IG5leHQubmV4dDsKICAgIGlmIChpc1ZhbGlkVHlwZVJlZmVyZW5jZShuZXh0KSkgewogICAgICAvLyBXZSd2ZSBzZWVuIGlkZW50aWZpZXIgYC5gIGlkZW50aWZpZXIKICAgICAgdHlwZVBhcmFtT3JBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcobmV4dCwgaW5EZWNsYXJhdGlvbik7CiAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgIGlmICh0eXBlUGFyYW1PckFyZyA9PSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgICBpZiAoIWlzR2VuZXJhbGl6ZWRGdW5jdGlvblR5cGUobmV4dCkpIHsKICAgICAgICAgICAgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIGA/YCBpZGVudGlmaWVyCiAgICAgICAgICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IGNvbnNpZGVyIGFkZGluZyBQcmVmaXhlZE51bGxhYmxlVHlwZQogICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBidWlsZCBjb21wbGV4IHR5cGUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIGA/YCBub24taWRlbnRpZmllcgogICAgICAgICAgICAgIHJldHVybiBub1R5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCFpc0dlbmVyYWxpemVkRnVuY3Rpb25UeXBlKG5leHQpKSB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlZCB8fCBsb29rc0xpa2VOYW1lKG5leHQpKSB7CiAgICAgICAgICAgICAgLy8gaWRlbnRpZmllciBgLmAgaWRlbnRpZmllciBpZGVudGlmaWVyCiAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeGVkVHlwZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyIG5vbi1pZGVudGlmaWVyCiAgICAgICAgICAgICAgcmV0dXJuIG5vVHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyCiAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVJbmZvKHRva2VuLCB0eXBlUGFyYW1PckFyZykKICAgICAgICAgIC5jb21wdXRlUHJlZml4ZWRUeXBlKHJlcXVpcmVkKTsKICAgIH0KICAgIC8vIGlkZW50aWZpZXIgYC5gIG5vbi1pZGVudGlmaWVyCiAgICBpZiAocmVxdWlyZWQpIHsKICAgICAgdHlwZVBhcmFtT3JBcmcgPSBjb21wdXRlVHlwZVBhcmFtT3JBcmcodG9rZW4ubmV4dC5uZXh0LCBpbkRlY2xhcmF0aW9uKTsKICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIHR5cGVQYXJhbU9yQXJnKQogICAgICAgICAgLmNvbXB1dGVQcmVmaXhlZFR5cGUocmVxdWlyZWQpOwogICAgfQogICAgcmV0dXJuIG5vVHlwZTsKICB9CgogIGFzc2VydCh0eXBlUGFyYW1PckFyZyA9PSBub1R5cGVQYXJhbU9yQXJnKTsKICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgLy8gaWRlbnRpZmllciBgRnVuY3Rpb25gCiAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlSW5mbyh0b2tlbiwgbm9UeXBlUGFyYW1PckFyZykKICAgICAgICAuY29tcHV0ZUlkZW50aWZpZXJHRlQocmVxdWlyZWQpOwogIH0KCiAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICBpZiAoaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZShuZXh0KSkgewogICAgICAvLyBpZGVudGlmaWVyIGA/YCBGdW5jdGlvbiBgKGAKICAgICAgcmV0dXJuIG5ldyBDb21wbGV4VHlwZUluZm8odG9rZW4sIG5vVHlwZVBhcmFtT3JBcmcpCiAgICAgICAgICAuY29tcHV0ZUlkZW50aWZpZXJRdWVzdGlvbkdGVChyZXF1aXJlZCk7CiAgICB9IGVsc2UgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgICAgLy8gaWRlbnRpZmllciBgP2AKICAgICAgcmV0dXJuIHNpbXBsZU51bGxhYmxlVHlwZTsKICAgIH0KICB9IGVsc2UgaWYgKHJlcXVpcmVkIHx8IGxvb2tzTGlrZU5hbWUobmV4dCkpIHsKICAgIC8vIGlkZW50aWZpZXIgaWRlbnRpZmllcgogICAgcmV0dXJuIHNpbXBsZVR5cGU7CiAgfQogIHJldHVybiBub1R5cGU7Cn0KCi8vLyBDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NzaWJsZSBncm91cCBvZiB0eXBlCi8vLyBwYXJhbWV0ZXJzIG9yIHR5cGUgYXJndW1lbnRzIHRoYXQgZm9sbG93IFt0b2tlbl0uCi8vLyBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4gc3RyZWFtLgovLy8KLy8vIElmIFtpbkRlY2xhcmF0aW9uXSBpcyBgdHJ1ZWAsIHRoZW4gdGhpcyB3aWxsIG1vcmUgYWdncmVzc2l2ZWx5IHJlY292ZXIKLy8vIGdpdmVuIHVuYmFsYW5jZWQgYDxgIGA+YCBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KVHlwZVBhcmFtT3JBcmdJbmZvIGNvbXB1dGVUeXBlUGFyYW1PckFyZyhUb2tlbiB0b2tlbiwKICAgIFtib29sIGluRGVjbGFyYXRpb24gPSBmYWxzZSwgYm9vbCBhbGxvd3NWYXJpYW5jZSA9IGZhbHNlXSkgewogIFRva2VuIGJlZ2luR3JvdXAgPSB0b2tlbi5uZXh0OwogIGlmICghb3B0aW9uYWwoJzwnLCBiZWdpbkdyb3VwKSkgewogICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmc7CiAgfQoKICAvLyBpZGVudGlmaWVyIGA8YCBgdm9pZGAgYD5gIGFuZCBgPGAgYGR5bmFtaWNgIGA+YAogIC8vIGFyZSBoYW5kbGVkIGJ5IENvbXBsZXhUeXBlSW5mby4KICBUb2tlbiBuZXh0ID0gYmVnaW5Hcm91cC5uZXh0OwogIGlmICgobmV4dC5raW5kID09IElERU5USUZJRVJfVE9LRU4gfHwgbmV4dC50eXBlLmlzUHNldWRvKSkgewogICAgaWYgKG9wdGlvbmFsKCc+JywgbmV4dC5uZXh0KSkgewogICAgICByZXR1cm4gc2ltcGxlVHlwZUFyZ3VtZW50MTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJz4+JywgbmV4dC5uZXh0KSkgewogICAgICByZXR1cm4gc2ltcGxlVHlwZUFyZ3VtZW50MUd0R3Q7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCc+PScsIG5leHQubmV4dCkpIHsKICAgICAgcmV0dXJuIHNpbXBsZVR5cGVBcmd1bWVudDFHdEVxOwogICAgfQogIH0gZWxzZSBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgcmV0dXJuIG5vVHlwZVBhcmFtT3JBcmc7CiAgfQoKICAvLyBUT0RPKGRhbnJ1YmVsKTogQ29uc2lkZXIgYWRkaW5nIGFkZGl0aW9uYWwgY29uc3QgZm9yIGNvbW1vbiBzaXR1YXRpb25zLgogIHJldHVybiBuZXcgQ29tcGxleFR5cGVQYXJhbU9yQXJnSW5mbyh0b2tlbiwgaW5EZWNsYXJhdGlvbiwgYWxsb3dzVmFyaWFuY2UpCiAgICAgIC5jb21wdXRlKCk7Cn0KCi8vLyBDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NzaWJsZSBncm91cCBvZiB0eXBlCi8vLyB0eXBlIGFyZ3VtZW50cyB0aGF0IGZvbGxvdyBbdG9rZW5dIGFuZCB0aGF0IGFyZSBmb2xsb3dlZCBieSAnKCcuCi8vLyBSZXR1cm5zIHRoZSB0eXBlIGFyZ3VtZW50cyBpZiBbdG9rZW5dIG1hdGNoZXMgJzwnIHR5cGUgKCcsJyB0eXBlKSogJz4nICcoJywKLy8vIGFuZCBvdGhlcndpc2UgcmV0dXJucyBbbm9UeXBlUGFyYW1PckFyZ10uIFRoZSBmaW5hbCAnKCcgaXMgbm90IHBhcnQgb2YgdGhlCi8vLyBncmFtbWFyIGNvbnN0cnVjdCBgdHlwZUFyZ3VtZW50c2AsIGJ1dCBpdCBpcyByZXF1aXJlZCBoZXJlIHN1Y2ggdGhhdCB0eXBlCi8vLyBhcmd1bWVudHMgaW4gZ2VuZXJpYyBtZXRob2QgaW52b2NhdGlvbnMgY2FuIGJlIHJlY29nbml6ZWQsIGFuZCBhcyBmZXcgYXMKLy8vIHBvc3NpYmxlIG90aGVyIGNvbnN0cnVjdHMgd2lsbCBwYXNzIChlLmcuLCAnYSA8IEMsIEQgPiAzJykuClR5cGVQYXJhbU9yQXJnSW5mbyBjb21wdXRlTWV0aG9kVHlwZUFyZ3VtZW50cyhUb2tlbiB0b2tlbikgewogIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuKTsKICByZXR1cm4gb3B0aW9uYWwoJygnLCB0eXBlQXJnLnNraXAodG9rZW4pLm5leHQpID8gdHlwZUFyZyA6IG5vVHlwZVBhcmFtT3JBcmc7Cn0KgVwATk48AS4BNgFPAScBHgErAT8nGkpKHgFJRkhFHgE2FwFRTktNMjcBTk5LTTI2AU1ORE42AUpORE0vAURIQh8CATtHGCQeAUYqASodAUdDGkcEAUlOSU00ATs0TkpNNAFIUEIbAgFIMCgBSUxGAUoiLAEuKEACASkZLR8hIBw5KSQEEAIBT0EES0I3JBslHyo2MCpJPDQKRSkpKCwtSTw0CggbEiE3JEMsKjckQzIIBhMEASAWKx86JQYOFQQBKRY4LAQBHwEmMiwvMi0hGjAzNzw0DD4ZCjUvNioKOBcIBjM0KwEeNjMEAS4UHRYmLkMYMCMcMjM6RjQVPh0ODBEyMzYjFTodDgwKCCM4KgYlFE44KgYTBAEuKR04KQQBHRYrJTozMhghBjAdFwQRAgFONisES0I2QSEkHQQBNSUgPyQiLCYsJgYkHQQBTU0SAgFORVBPTk1APT1PAgE1cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdHlwZV9pbmZvLmRhcnRvZmlsZTovLy9iL3Mvdy9pci9rL2Z1Y2hzaWEvdGhpcmRfcGFydHkvZGFydC9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHRfaW1wbC5kYXJ0wACQxy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnIGFzIGNvZGVzOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgVG9rZW47CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTiwgU1RSSU5HX1RPS0VOOwoKaW1wb3J0ICdpZGVudGlmaWVyX2NvbnRleHQuZGFydCc7CgppbXBvcnQgJ3BhcnNlcl9pbXBsLmRhcnQnIHNob3cgUGFyc2VyOwoKaW1wb3J0ICd0eXBlX2luZm8uZGFydCcgc2hvdyBpc1ZhbGlkVHlwZVJlZmVyZW5jZTsKCmltcG9ydCAndXRpbC5kYXJ0JyBzaG93IGlzT25lT2ZPckVvZiwgb3B0aW9uYWw7CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5jYXRjaFBhcmFtZXRlcl0uCmNsYXNzIENhdGNoUGFyYW1ldGVySWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgQ2F0Y2hQYXJhbWV0ZXJJZGVudGlmaWVyQ29udGV4dCgpIDogc3VwZXIoJ2NhdGNoUGFyYW1ldGVyJyk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoaWRlbnRpZmllciwgY29kZXMubWVzc2FnZUNhdGNoU3ludGF4KTsKICAgIGlmIChsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJywnLCAnKSddKSkgewogICAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgfSBlbHNlIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uRGVjbGFyYXRpb25dLgpjbGFzcyBDbGFzc09yTWl4aW5PckV4dGVuc2lvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IENsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdjbGFzc09yTWl4aW5EZWNsYXJhdGlvbicsCiAgICAgICAgICAgIGluRGVjbGFyYXRpb246IHRydWUsIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiBmYWxzZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLnR5cGUuaXNQc2V1ZG8pIHsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwKICAgICAgICAgICAgY29uc3QgWyc8JywgJ3snLCAnZXh0ZW5kcycsICd3aXRoJywgJ2ltcGxlbWVudHMnLCAnb24nXSkpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5jb21iaW5hdG9yXS4KY2xhc3MgQ29tYmluYXRvcklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IENvbWJpbmF0b3JJZGVudGlmaWVyQ29udGV4dCgpIDogc3VwZXIoJ2NvbWJpbmF0b3InKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgY29uc3QgTGlzdDxTdHJpbmc+IGZvbGxvd2luZ1ZhbHVlcyA9IGNvbnN0IFsKICAgICAgJzsnLAogICAgICAnLCcsCiAgICAgICdpZicsCiAgICAgICdhcycsCiAgICAgICdzaG93JywKICAgICAgJ2hpZGUnCiAgICBdOwoKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBpZiAoIWxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIubmV4dCwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgICB9CiAgICAgIC8vIEFsdGhvdWdoIHRoaXMgaXMgYSB2YWxpZCBpZGVudGlmaWVyIG5hbWUsIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24KICAgICAgLy8gaXMgaW52YWxpZCBhbmQgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNsYXJhdGlvbi4KICAgICAgLy8gSW4gdGhpcyBzaXR1YXRpb24sIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllci4KICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuY29uc3RydWN0b3JSZWZlcmVuY2VdCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0LmNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5jb25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50c10uCmNsYXNzIENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgQ29uc3RydWN0b3JSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2NvbnN0cnVjdG9yUmVmZXJlbmNlJywgaXNTY29wZVJlZmVyZW5jZTogdHJ1ZSk7CgogIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb24nLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IENvbnN0cnVjdG9yUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzKCkKICAgICAgOiBzdXBlcignY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMnLAogICAgICAgICAgICBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5kb3R0ZWROYW1lXS4KY2xhc3MgRG90dGVkTmFtZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IERvdHRlZE5hbWVJZGVudGlmaWVyQ29udGV4dCgpIDogc3VwZXIoJ2RvdHRlZE5hbWUnKTsKCiAgY29uc3QgRG90dGVkTmFtZUlkZW50aWZpZXJDb250ZXh0LmNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ2RvdHRlZE5hbWVDb250aW51YXRpb24nLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGNvbnN0IExpc3Q8U3RyaW5nPiBmb2xsb3dpbmdWYWx1ZXMgPSBjb25zdCBbJy4nLCAnPT0nLCAnKSddOwoKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICAvLyBEb3R0ZWROYW1lSWRlbnRpZmllckNvbnRleHQgYXJlIG9ubHkgdXNlZCBpbiBjb25kaXRpb25hbCBpbXBvcnQKICAgICAgLy8gZXhwcmVzc2lvbnMuIEFsdGhvdWdoIHNvbWUgdG9wIGxldmVsIGtleXdvcmRzIHN1Y2ggYXMgYGltcG9ydGAgY2FuIGJlCiAgICAgIC8vIHVzZWQgYXMgaWRlbnRpZmllcnMsIHRoZXkgYXJlIG1vcmUgbGlrZWx5IHRoZSBzdGFydCBvZiB0aGUgbmV4dAogICAgICAvLyBkaXJlY3RpdmUgb3IgZGVjbGFyYXRpb24uCiAgICAgIGlmICghaWRlbnRpZmllci5pc1RvcExldmVsS2V5d29yZCB8fAogICAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIubmV4dCwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgICB9CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmVudW1EZWNsYXJhdGlvbl0uCmNsYXNzIEVudW1EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IEVudW1EZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZW51bURlY2xhcmF0aW9uJywKICAgICAgICAgICAgaW5EZWNsYXJhdGlvbjogdHJ1ZSwgaXNCdWlsdEluSWRlbnRpZmllckFsbG93ZWQ6IGZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc1BzZXVkbykgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJ3snXSkpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5lbnVtVmFsdWVEZWNsYXJhdGlvbl0uCmNsYXNzIEVudW1WYWx1ZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRW51bVZhbHVlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2VudW1WYWx1ZURlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJywnLCAnfSddKSkgewogICAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogICAgfSBlbHNlIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmV4cHJlc3Npb25dLgpjbGFzcyBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZXhwcmVzc2lvbicsIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUpOwoKICBjb25zdCBFeHByZXNzaW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignZXhwcmVzc2lvbkNvbnRpbnVhdGlvbicsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGlmIChvcHRpb25hbCgnYXdhaXQnLCBpZGVudGlmaWVyKSAmJiBpZGVudGlmaWVyLm5leHQuaXNJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gQWx0aG91Z2ggdGhlIGBhd2FpdGAgY2FuIGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbiwKICAgICAgICAvLyBpdCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIGlkZW50aWZpZXIgd2hpY2ggZG9lcyBub3QgZm9ybQogICAgICAgIC8vIGEgdmFsaWQgZXhwcmVzc2lvbi4gUmVwb3J0IGFuIGVycm9yIG9uIHRoZSBgYXdhaXRgIHRva2VuCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdGhlIHRva2VuIGZvbGxvd2luZyBpdC4KICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVVbmV4cGVjdGVkVG9rZW4pOwoKICAgICAgICAvLyBUT0RPKGRhbnJ1YmVsKSBDb25zaWRlciBhIG5ldyBsaXN0ZW5lciBldmVudCBzbyB0aGF0IGFuYWx5emVyCiAgICAgICAgLy8gY2FuIHJlcHJlc2VudCB0aGlzIGFzIGFuIGF3YWl0IGV4cHJlc3Npb24gaW4gYSBjb250ZXh0IHRoYXQgZG9lcwogICAgICAgIC8vIG5vdCBhbGxvdyBhd2FpdC4KICAgICAgICByZXR1cm4gaWRlbnRpZmllci5uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgIGlmIChvcHRpb25hbChyJyQnLCB0b2tlbikgJiYKICAgICAgICBpZGVudGlmaWVyLmlzS2V5d29yZCAmJgogICAgICAgIGlkZW50aWZpZXIubmV4dC5raW5kID09IFNUUklOR19UT0tFTikgewogICAgICAvLyBLZXl3b3JkIHVzZWQgYXMgaWRlbnRpZmllciBpbiBzdHJpbmcgaW50ZXJwb2xhdGlvbgogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0gZWxzZSBpZiAoIWxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpKSB7CiAgICAgIGlmIChpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbiB8fCAhaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnYXMnLCAnaXMnXSkpIHsKICAgICAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghaWRlbnRpZmllci5pc09wZXJhdG9yICYmCiAgICAgICAgICAhaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsCiAgICAgICAgICAgICAgY29uc3QgWycuJywgJywnLCAnKCcsICcpJywgJ1snLCAnXScsICd7JywgJ30nLCAnPycsICc6JywgJzsnXSkpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIHRva2VuID0gaWRlbnRpZmllcjsKICAgICAgICBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgfQogICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZmllbGREZWNsYXJhdGlvbl0uCmNsYXNzIEZpZWxkRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBGaWVsZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdmaWVsZERlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJzsnLCAnPScsICcsJywgJ30nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpKSB7CiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcyk7CiAgICB9IGVsc2UgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSwKICAgICAgICAgIG1lc3NhZ2VPblRva2VuOiBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LmZpZWxkSW5pdGlhbGl6ZXJdLgpjbGFzcyBGaWVsZEluaXRpYWxpemVySWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgRmllbGRJbml0aWFsaXplcklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignZmllbGRJbml0aWFsaXplcicsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgYXNzZXJ0KG9wdGlvbmFsKCcuJywgdG9rZW4pKTsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgLy8gSW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4pOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQuZm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb25dLgpjbGFzcyBGb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IEZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdmb3JtYWxQYXJhbWV0ZXJEZWNsYXJhdGlvbicsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGNvbnN0IExpc3Q8U3RyaW5nPiBmb2xsb3dpbmdWYWx1ZXMgPSBjb25zdCBbCiAgICAgICc6JywKICAgICAgJz0nLAogICAgICAnLCcsCiAgICAgICcoJywKICAgICAgJyknLAogICAgICAnWycsCiAgICAgICddJywKICAgICAgJ3snLAogICAgICAnfScKICAgIF07CiAgICBpZiAobG9va3NMaWtlU3RhcnRPZk5leHRDbGFzc01lbWJlcihpZGVudGlmaWVyKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpIHx8CiAgICAgICAgaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGZvbGxvd2luZ1ZhbHVlcykpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5pbXBvcnRQcmVmaXhEZWNsYXJhdGlvbl0uCmNsYXNzIEltcG9ydFByZWZpeElkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IEltcG9ydFByZWZpeElkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignaW1wb3J0UHJlZml4RGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBjb25zdCBMaXN0PFN0cmluZz4gZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWwogICAgICAnOycsCiAgICAgICdpZicsCiAgICAgICdzaG93JywKICAgICAgJ2hpZGUnLAogICAgICAnZGVmZXJyZWQnLAogICAgICAnYXMnCiAgICBdOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc0J1aWx0SW4gJiYKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllci5uZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb24pOwogICAgfSBlbHNlIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCmNsYXNzIExpdGVyYWxTeW1ib2xJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdsaXRlcmFsU3ltYm9sJywgaW5TeW1ib2w6IHRydWUpOwoKICBjb25zdCBMaXRlcmFsU3ltYm9sSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignbGl0ZXJhbFN5bWJvbENvbnRpbnVhdGlvbicsCiAgICAgICAgICAgIGluU3ltYm9sOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgcmV0dXJuIHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgIG1lc3NhZ2U6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uXQovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5sb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb25dLgpjbGFzcyBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2xvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbicsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBjb25zdCBMb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdsb2NhbEZ1bmN0aW9uRGVjbGFyYXRpb25Db250aW51YXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJy4nLCAnKCcsICd7JywgJz0+J10pIHx8CiAgICAgICAgbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5sYWJlbERlY2xhcmF0aW9uXS4KY2xhc3MgTGFiZWxEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IExhYmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2xhYmVsRGVjbGFyYXRpb24nLCBpbkRlY2xhcmF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsnOiddKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubGFiZWxSZWZlcmVuY2VdLgpjbGFzcyBMYWJlbFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IExhYmVsUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKSA6IHN1cGVyKCdsYWJlbFJlZmVyZW5jZScpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWyc7J10pKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubGlicmFyeU5hbWVdLAovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5saWJyYXJ5TmFtZUNvbnRpbnVhdGlvbl0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQucGFydE5hbWVdLAovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZUNvbnRpbnVhdGlvbl0uCmNsYXNzIExpYnJhcnlJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCdsaWJyYXJ5TmFtZScsIGluTGlicmFyeU9yUGFydE9mRGVjbGFyYXRpb246IHRydWUpOwoKICBjb25zdCBMaWJyYXJ5SWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignbGlicmFyeU5hbWVDb250aW51YXRpb24nLAogICAgICAgICAgICBpbkxpYnJhcnlPclBhcnRPZkRlY2xhcmF0aW9uOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZSgpCiAgICAgIDogc3VwZXIoJ3BhcnROYW1lJywgaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IExpYnJhcnlJZGVudGlmaWVyQ29udGV4dC5wYXJ0TmFtZUNvbnRpbnVhdGlvbigpCiAgICAgIDogc3VwZXIoJ3BhcnROYW1lQ29udGludWF0aW9uJywKICAgICAgICAgICAgaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbjogdHJ1ZSwgaXNDb250aW51YXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBjb25zdCBMaXN0PFN0cmluZz4gZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWycuJywgJzsnXTsKCiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgVG9rZW4gbmV4dCA9IGlkZW50aWZpZXIubmV4dDsKICAgICAgaWYgKCFsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICAgIGlzT25lT2ZPckVvZihuZXh0LCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICAgIH0KICAgICAgLy8gQWx0aG91Z2ggdGhpcyBpcyBhIHZhbGlkIGxpYnJhcnkgbmFtZSwgdGhlIGxpYnJhcnkgZGVjbGFyYXRpb24KICAgICAgLy8gaXMgaW52YWxpZCBhbmQgdGhpcyBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNsYXJhdGlvbi4KICAgICAgLy8gSW4gdGhpcyBzaXR1YXRpb24sIGZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYSBzeW50aGV0aWMgbGlicmFyeSBuYW1lLgogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGZvbGxvd2luZ1ZhbHVlcykgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5sb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25dLgpjbGFzcyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ2xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbicsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci5pc0lkZW50aWZpZXIpIHsKICAgICAgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoaWRlbnRpZmllciwgcGFyc2VyKTsKICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgY29uc3QgWyc7JywgJz0nLCAnLCcsICd7JywgJ30nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGF0ZW1lbnRTdGFydChpZGVudGlmaWVyKSB8fAogICAgICAgIGlkZW50aWZpZXIua2luZCA9PSBTVFJJTkdfVE9LRU4pIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC5tZXRhZGF0YVJlZmVyZW5jZV0KLy8vIGFuZCBbSWRlbnRpZmllckNvbnRleHQubWV0YWRhdGFDb250aW51YXRpb25dCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0Lm1ldGFkYXRhQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzXS4KY2xhc3MgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbWV0YWRhdGFSZWZlcmVuY2UnLCBpc1Njb3BlUmVmZXJlbmNlOiB0cnVlKTsKCiAgY29uc3QgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCdtZXRhZGF0YUNvbnRpbnVhdGlvbicsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgY29uc3QgTWV0YWRhdGFSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHMoKQogICAgICA6IHN1cGVyKCdtZXRhZGF0YUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50cycsIGlzQ29udGludWF0aW9uOiB0cnVlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIGNoZWNrQXN5bmNBd2FpdFlpZWxkQXNJZGVudGlmaWVyKGlkZW50aWZpZXIsIHBhcnNlcik7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBpZiAoaXNPbmVPZk9yRW9mKGlkZW50aWZpZXIsIGNvbnN0IFsneycsICd9JywgJygnLCAnKScsICddJ10pIHx8CiAgICAgICAgbG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhcnRPZk5leHRDbGFzc01lbWJlcihpZGVudGlmaWVyKSB8fAogICAgICAgIGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0KGlkZW50aWZpZXIpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQubWV0aG9kRGVjbGFyYXRpb25dLAovLy8gYW5kIFtJZGVudGlmaWVyQ29udGV4dC5tZXRob2REZWNsYXJhdGlvbkNvbnRpbnVhdGlvbl0sCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0Lm9wZXJhdG9yTmFtZV0uCmNsYXNzIE1ldGhvZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgTWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCgpCiAgICAgIDogc3VwZXIoJ21ldGhvZERlY2xhcmF0aW9uJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IE1ldGhvZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQuY29udGludWF0aW9uKCkKICAgICAgOiBzdXBlcignbWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0NvbnRpbnVhdGlvbjogdHJ1ZSk7CgogIGNvbnN0IE1ldGhvZERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQub3BlcmF0b3JOYW1lKCkKICAgICAgOiBzdXBlcignb3BlcmF0b3JOYW1lJywgaW5EZWNsYXJhdGlvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlkZW50aWZpZXIuaXNVc2VyRGVmaW5hYmxlT3BlcmF0b3IgJiYgIWlzQ29udGludWF0aW9uKSB7CiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMubWVzc2FnZU1pc3NpbmdPcGVyYXRvcktleXdvcmQsCiAgICAgICAgICBtZXNzYWdlT25Ub2tlbjogaWRlbnRpZmllcik7CiAgICB9IGVsc2UgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJy4nLCAnKCcsICd7JywgJz0+JywgJ30nXSkgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpKSB7CiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcyk7CiAgICB9IGVsc2UgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgIHJldHVybiBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSwKICAgICAgICAgIG1lc3NhZ2VPblRva2VuOiBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0Lm5hbWVkQXJndW1lbnRSZWZlcmVuY2VdLgpjbGFzcyBOYW1lZEFyZ3VtZW50UmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQgZXh0ZW5kcyBJZGVudGlmaWVyQ29udGV4dCB7CiAgY29uc3QgTmFtZWRBcmd1bWVudFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcignbmFtZWRBcmd1bWVudFJlZmVyZW5jZScsIGFsbG93ZWRJbkNvbnN0YW50RXhwcmVzc2lvbjogdHJ1ZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGlkZW50aWZpZXIgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KGlkZW50aWZpZXIua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpZGVudGlmaWVyLmlzSWRlbnRpZmllcikgewogICAgICBjaGVja0FzeW5jQXdhaXRZaWVsZEFzSWRlbnRpZmllcihpZGVudGlmaWVyLCBwYXJzZXIpOwogICAgICByZXR1cm4gaWRlbnRpZmllcjsKICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgaWYgKGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBjb25zdCBbJzonXSkpIHsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuLCB0aGlzLAogICAgICAgICAgbWVzc2FnZTogY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIud2l0aEFyZ3VtZW50cyhpZGVudGlmaWVyKSk7CiAgICB9IGVsc2UgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWYgKCFpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgICAgLy8gYnV0IGluc2VydCBhIHN5bnRoZXRpYyBpZGVudGlmaWVyIHRvIHNhdGlzZnkgbGlzdGVuZXJzLgogICAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcihpZGVudGlmaWVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgfQp9CgovLy8gU2VlIFtJZGVudGlmaWVyQ29udGV4dC50b3BMZXZlbEZ1bmN0aW9uRGVjbGFyYXRpb25dCi8vLyBhbmQgW0lkZW50aWZpZXJDb250ZXh0LnRvcExldmVsVmFyaWFibGVEZWNsYXJhdGlvbl0uCmNsYXNzIFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBmaW5hbCBMaXN0PFN0cmluZz4gZm9sbG93aW5nVmFsdWVzOwoKICBjb25zdCBUb3BMZXZlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHQoU3RyaW5nIG5hbWUsIHRoaXMuZm9sbG93aW5nVmFsdWVzKQogICAgICA6IHN1cGVyKG5hbWUsIGluRGVjbGFyYXRpb246IHRydWUpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CgogICAgaWYgKGlkZW50aWZpZXIuaXNJZGVudGlmaWVyKSB7CiAgICAgIFRva2VuIG5leHQgPSBpZGVudGlmaWVyLm5leHQ7CiAgICAgIGlmICghbG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uKGlkZW50aWZpZXIpIHx8CiAgICAgICAgICBpc09uZU9mT3JFb2YobmV4dCwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgICB9CiAgICAgIC8vIEFsdGhvdWdoIHRoaXMgaXMgYSB2YWxpZCB0b3AgbGV2ZWwgbmFtZSwgdGhlIGRlY2xhcmF0aW9uCiAgICAgIC8vIGlzIGludmFsaWQgYW5kIHRoaXMgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjbGFyYXRpb24uCiAgICAgIC8vIEluIHRoaXMgc2l0dWF0aW9uLCBmYWxsIHRocm91Z2ggdG8gaW5zZXJ0IGEgc3ludGhldGljIG5hbWUuCiAgICB9CgogICAgLy8gUmVjb3ZlcnkKICAgIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBpZGVudGlmaWVyID0gcGFyc2VyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIodG9rZW4sIHRoaXMsCiAgICAgICAgICBtZXNzYWdlOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllci53aXRoQXJndW1lbnRzKGlkZW50aWZpZXIpKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllci50eXBlLmlzQnVpbHRJbikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCi8vLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnR5cGVkZWZEZWNsYXJhdGlvbl0uCmNsYXNzIFR5cGVkZWZEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0IGV4dGVuZHMgSWRlbnRpZmllckNvbnRleHQgewogIGNvbnN0IFR5cGVkZWZEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcigndHlwZWRlZkRlY2xhcmF0aW9uJywKICAgICAgICAgICAgaW5EZWNsYXJhdGlvbjogdHJ1ZSwgaXNCdWlsdEluSWRlbnRpZmllckFsbG93ZWQ6IGZhbHNlKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlSWRlbnRpZmllcihUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQoaWRlbnRpZmllci5raW5kICE9IElERU5USUZJRVJfVE9LRU4pOwogICAgaWYgKGlkZW50aWZpZXIudHlwZS5pc1BzZXVkbykgewogICAgICBpZiAob3B0aW9uYWwoJ0Z1bmN0aW9uJywgaWRlbnRpZmllcikpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICB9CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBjb25zdCBMaXN0PFN0cmluZz4gZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWycoJywgJzwnLCAnPScsICc7J107CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzQnVpbHRJbiAmJgogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLm5leHQsIGZvbGxvd2luZ1ZhbHVlcykpIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbik7CiAgICB9IGVsc2UgaWYgKGxvb2tzTGlrZVN0YXJ0T2ZOZXh0VG9wTGV2ZWxEZWNsYXJhdGlvbihpZGVudGlmaWVyKSB8fAogICAgICAgIGlzT25lT2ZPckVvZihpZGVudGlmaWVyLCBmb2xsb3dpbmdWYWx1ZXMpKSB7CiAgICAgIGlkZW50aWZpZXIgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbiwgdGhpcywKICAgICAgICAgIG1lc3NhZ2U6IGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyLndpdGhBcmd1bWVudHMoaWRlbnRpZmllcikpOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICBpZGVudGlmaWVyLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkSWRlbnRpZmllcik7CiAgICAgIGlmICghaWRlbnRpZmllci5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAvLyBXaGVuIGluIGRvdWJ0LCBjb25zdW1lIHRoZSB0b2tlbiB0byBlbnN1cmUgd2UgbWFrZSBwcm9ncmVzcwogICAgICAgIC8vIGJ1dCBpbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgICAgICBpZGVudGlmaWVyID0gcGFyc2VyLnJld3JpdGVyLmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIoaWRlbnRpZmllcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZGVudGlmaWVyOwogIH0KfQoKLy8vIFNlZSBbSWRlbnRpZmllckNvbnRleHQudHlwZVJlZmVyZW5jZV0uCmNsYXNzIFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBUeXBlUmVmZXJlbmNlSWRlbnRpZmllckNvbnRleHQoKQogICAgICA6IHN1cGVyKCd0eXBlUmVmZXJlbmNlJywKICAgICAgICAgICAgaXNTY29wZVJlZmVyZW5jZTogdHJ1ZSwKICAgICAgICAgICAgaXNCdWlsdEluSWRlbnRpZmllckFsbG93ZWQ6IGZhbHNlLAogICAgICAgICAgICByZWNvdmVyeVRlbXBsYXRlOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkVHlwZSk7CgogIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5jb250aW51YXRpb24oKQogICAgICA6IHN1cGVyKCd0eXBlUmVmZXJlbmNlQ29udGludWF0aW9uJywKICAgICAgICAgICAgaXNDb250aW51YXRpb246IHRydWUsIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiBmYWxzZSk7CgogIGNvbnN0IFR5cGVSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dC5wcmVmaXhlZCgpCiAgICAgIDogc3VwZXIoJ3ByZWZpeGVkVHlwZVJlZmVyZW5jZScsCiAgICAgICAgICAgIGlzU2NvcGVSZWZlcmVuY2U6IHRydWUsCiAgICAgICAgICAgIGlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkOiB0cnVlLAogICAgICAgICAgICByZWNvdmVyeVRlbXBsYXRlOiBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkVHlwZSk7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZUlkZW50aWZpZXIoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG5leHQua2luZCAhPSBJREVOVElGSUVSX1RPS0VOKTsKICAgIGlmIChpc1ZhbGlkVHlwZVJlZmVyZW5jZShuZXh0KSkgewogICAgICByZXR1cm4gbmV4dDsKICAgIH0gZWxzZSBpZiAobmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgaWYgKG9wdGlvbmFsKCJ2b2lkIiwgbmV4dCkpIHsKICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcihuZXh0LCBjb2Rlcy5tZXNzYWdlSW52YWxpZFZvaWQpOwogICAgICB9IGVsc2UgaWYgKG5leHQudHlwZS5pc0J1aWx0SW4pIHsKICAgICAgICBpZiAoIWlzQnVpbHRJbklkZW50aWZpZXJBbGxvd2VkKSB7CiAgICAgICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ3ZhcicsIG5leHQpKSB7CiAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IobmV4dCwgY29kZXMubWVzc2FnZVZhckFzVHlwZU5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkVHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5leHQ7CiAgICB9CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbihuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkVHlwZSk7CiAgICBpZiAoIWlzT25lT2ZPckVvZigKICAgICAgICBuZXh0LCBjb25zdCBbJzwnLCAnPicsICcpJywgJ1snLCAnXScsICdbXScsICd7JywgJ30nLCAnLCcsICc7J10pKSB7CiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIGNvbnN1bWUgdGhlIHRva2VuIHRvIGVuc3VyZSB3ZSBtYWtlIHByb2dyZXNzCiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICB9CiAgICAvLyBJbnNlcnQgYSBzeW50aGV0aWMgaWRlbnRpZmllciB0byBzYXRpc2Z5IGxpc3RlbmVycy4KICAgIHJldHVybiBwYXJzZXIucmV3cml0ZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcih0b2tlbik7CiAgfQp9CgovLyBTZWUgW0lkZW50aWZpZXJDb250ZXh0LnR5cGVWYXJpYWJsZURlY2xhcmF0aW9uXS4KY2xhc3MgVHlwZVZhcmlhYmxlRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dCBleHRlbmRzIElkZW50aWZpZXJDb250ZXh0IHsKICBjb25zdCBUeXBlVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0KCkKICAgICAgOiBzdXBlcigndHlwZVZhcmlhYmxlRGVjbGFyYXRpb24nLAogICAgICAgICAgICBpbkRlY2xhcmF0aW9uOiB0cnVlLCBpc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZDogZmFsc2UpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVJZGVudGlmaWVyKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBpZGVudGlmaWVyID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpZGVudGlmaWVyLmtpbmQgIT0gSURFTlRJRklFUl9UT0tFTik7CiAgICBpZiAoaWRlbnRpZmllci50eXBlLmlzUHNldWRvKSB7CiAgICAgIHJldHVybiBpZGVudGlmaWVyOwogICAgfQoKICAgIC8vIFJlY292ZXJ5CiAgICBjb25zdCBMaXN0PFN0cmluZz4gZm9sbG93aW5nVmFsdWVzID0gY29uc3QgWwogICAgICAnPCcsCiAgICAgICc+JywKICAgICAgJzsnLAogICAgICAnfScsCiAgICAgICdleHRlbmRzJywKICAgICAgJ3N1cGVyJwogICAgXTsKICAgIGlmIChsb29rc0xpa2VTdGFydE9mTmV4dFRvcExldmVsRGVjbGFyYXRpb24oaWRlbnRpZmllcikgfHwKICAgICAgICBsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVyKGlkZW50aWZpZXIpIHx8CiAgICAgICAgbG9va3NMaWtlU3RhdGVtZW50U3RhcnQoaWRlbnRpZmllcikgfHwKICAgICAgICBpc09uZU9mT3JFb2YoaWRlbnRpZmllciwgZm9sbG93aW5nVmFsdWVzKSkgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRJZGVudGlmaWVyKTsKICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllci50eXBlLmlzQnVpbHRJbikgewogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcldpdGhUb2tlbigKICAgICAgICAgIGlkZW50aWZpZXIsIGNvZGVzLnRlbXBsYXRlQnVpbHRJbklkZW50aWZpZXJJbkRlY2xhcmF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgICAgaWRlbnRpZmllciwgY29kZXMudGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXIpOwogICAgICBpZiAoIWlkZW50aWZpZXIuaXNLZXl3b3JkT3JJZGVudGlmaWVyKSB7CiAgICAgICAgLy8gV2hlbiBpbiBkb3VidCwgY29uc3VtZSB0aGUgdG9rZW4gdG8gZW5zdXJlIHdlIG1ha2UgcHJvZ3Jlc3MKICAgICAgICAvLyBidXQgaW5zZXJ0IGEgc3ludGhldGljIGlkZW50aWZpZXIgdG8gc2F0aXNmeSBsaXN0ZW5lcnMuCiAgICAgICAgaWRlbnRpZmllciA9IHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaWRlbnRpZmllcjsKICB9Cn0KCnZvaWQgY2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXIoVG9rZW4gaWRlbnRpZmllciwgUGFyc2VyIHBhcnNlcikgewogIGlmICghcGFyc2VyLmluUGxhaW5T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cm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZmFzdGEuaWdub3JlZF9wYXJzZXJfZXJyb3JzOwoKaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXIuZGFydCcgc2hvdyBvcHRpb25hbDsKCmltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKCmltcG9ydCAnZmFzdGFfY29kZXMuZGFydCcgc2hvdyBDb2RlLCBjb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0OwoKYm9vbCBpc0lnbm9yZWRQYXJzZXJFcnJvcihDb2RlPE9iamVjdD4gY29kZSwgVG9rZW4gdG9rZW4pIHsKICBpZiAoY29kZSA9PSBjb2RlTm9uUGFydE9mRGlyZWN0aXZlSW5QYXJ0KSB7CiAgICAvLyBJZ25vcmVkLiBUaGlzIGVycm9yIGlzIGhhbmRsZWQgaW4gdGhlIG91dGxpbmUgcGhhc2UgKHBhcnQgcmVzb2x1dGlvbikuCiAgICByZXR1cm4gb3B0aW9uYWwoInBhcnQiLCB0b2tlbik7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KFgBOTjwBJQFLAUoBQwE8Lk4kCxIEAgE2cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2lnbm9yZWRfcGFyc2VyX2Vycm9ycy5kYXJ0b2ZpbGU6Ly8vYi9zL3cvaXIvay9mdWNoc2lhL3RoaXJkX3BhcnR5L2RhcnQvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9wYXJzZXIvbGl0ZXJhbF9lbnRyeV9pbmZvX2ltcGwuZGFydJ/dLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnOwppbXBvcnQgJ2xpdGVyYWxfZW50cnlfaW5mby5kYXJ0JzsKaW1wb3J0ICdwYXJzZXJfaW1wbC5kYXJ0JzsKaW1wb3J0ICd1dGlsLmRhcnQnOwoKLy8vIFtpZkNvbmRpdGlvbl0gaXMgdGhlIGZpcnN0IHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGVudHJ5Ci8vLyBzdGFydGluZyB3aXRoIGBpZmAgY29udHJvbCBmbG93Lgpjb25zdCBMaXRlcmFsRW50cnlJbmZvIGlmQ29uZGl0aW9uID0gY29uc3QgSWZDb25kaXRpb24oKTsKCi8vLyBbc3ByZWFkT3BlcmF0b3JdIGlzIHRoZSBmaXJzdCBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBlbnRyeQovLy8gcHJlY2VkZWQgYnkgYSAnLi4uJyBzcHJlYWQgb3BlcmF0b3IuCmNvbnN0IExpdGVyYWxFbnRyeUluZm8gc3ByZWFkT3BlcmF0b3IgPSBjb25zdCBTcHJlYWRPcGVyYXRvcigpOwoKLy8vIFRoZSBmaXJzdCBzdGVwIHdoZW4gcHJvY2Vzc2luZyBhIGBmb3JgIGNvbnRyb2wgZmxvdyBjb2xsZWN0aW9uIGVudHJ5LgpjbGFzcyBGb3JDb25kaXRpb24gZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBib29sIGluU3R5bGU7CgogIEZvckNvbmRpdGlvbigpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBUb2tlbiBhd2FpdFRva2VuOwogICAgaWYgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpKSB7CiAgICAgIGF3YWl0VG9rZW4gPSB0b2tlbiA9IG5leHQ7CiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgfQogICAgZmluYWwgVG9rZW4gZm9yVG9rZW4gPSBuZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCdmb3InLCBmb3JUb2tlbikpOwogICAgcGFyc2VyLmxpc3RlbmVyLmJlZ2luRm9yQ29udHJvbEZsb3coYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwoKICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9yTG9vcFBhcnRzU3RhcnQoYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwogICAgVG9rZW4gaWRlbnRpZmllciA9IHRva2VuLm5leHQ7CiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUZvckxvb3BQYXJ0c01pZCh0b2tlbiwgYXdhaXRUb2tlbiwgZm9yVG9rZW4pOwoKICAgIGlmIChvcHRpb25hbCgnaW4nLCB0b2tlbi5uZXh0KSB8fCBvcHRpb25hbCgnOicsIHRva2VuLm5leHQpKSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiBpbiAuLi4gKWAKICAgICAgaW5TdHlsZSA9IHRydWU7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9ySW5Mb29wUGFydHNSZXN0KAogICAgICAgICAgdG9rZW4sIGF3YWl0VG9rZW4sIGZvclRva2VuLCBpZGVudGlmaWVyKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFByb2Nlc3MgYGZvciAoIC4uLiA7IC4uLiA7IC4uLiApYAogICAgICBpblN0eWxlID0gZmFsc2U7CiAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlRm9yTG9vcFBhcnRzUmVzdCh0b2tlbiwgZm9yVG9rZW4sIGF3YWl0VG9rZW4pOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ2ZvcicsIG5leHQpIHx8CiAgICAgICAgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpICYmIG9wdGlvbmFsKCdmb3InLCBuZXh0Lm5leHQpKSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZCgKICAgICAgICBuZXcgRm9yQ29uZGl0aW9uKCksCiAgICAgICAgaW5TdHlsZSA/IGNvbnN0IEZvckluQ29tcGxldGUoKSA6IGNvbnN0IEZvckNvbXBsZXRlKCksCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCdpZicsIG5leHQpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKAogICAgICAgIGlmQ29uZGl0aW9uLAogICAgICAgIGluU3R5bGUgPyBjb25zdCBGb3JJbkNvbXBsZXRlKCkgOiBjb25zdCBGb3JDb21wbGV0ZSgpLAogICAgICApOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnLi4uJywgbmV4dCkgfHwgb3B0aW9uYWwoJy4uLj8nLCBuZXh0KSkgewogICAgICByZXR1cm4gaW5TdHlsZSA/IGNvbnN0IEZvckluU3ByZWFkKCkgOiBjb25zdCBGb3JTcHJlYWQoKTsKICAgIH0KICAgIHJldHVybiBpblN0eWxlID8gY29uc3QgRm9ySW5FbnRyeSgpIDogY29uc3QgRm9yRW50cnkoKTsKICB9Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBzcHJlYWQgY29sbGVjdGlvbgovLy8gYXMgdGhlICJmb3IiIGNvbnRyb2wgZmxvdydzIGV4cHJlc3Npb24uCmNsYXNzIEZvclNwcmVhZCBleHRlbmRzIFNwcmVhZE9wZXJhdG9yIHsKICBjb25zdCBGb3JTcHJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IEZvckNvbXBsZXRlKCk7CiAgfQp9CgovLy8gQSBzdGVwIGZvciBwYXJzaW5nIGEgc3ByZWFkIGNvbGxlY3Rpb24KLy8vIGFzIHRoZSAiZm9yLWluIiBjb250cm9sIGZsb3cncyBleHByZXNzaW9uLgpjbGFzcyBGb3JJblNwcmVhZCBleHRlbmRzIFNwcmVhZE9wZXJhdG9yIHsKICBjb25zdCBGb3JJblNwcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgRm9ySW5Db21wbGV0ZSgpOwogIH0KfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyBhIGxpdGVyYWwgbGlzdCwgc2V0LCBvciBtYXAgZW50cnkKLy8vIGFzIHRoZSAiZm9yIiBjb250cm9sIGZsb3cncyBleHByZXNzaW9uLgpjbGFzcyBGb3JFbnRyeSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IEZvckVudHJ5KCkgOiBzdXBlcih0cnVlLCAwKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IEZvckNvbXBsZXRlKCk7CiAgfQp9CgovLy8gQSBzdGVwIGZvciBwYXJzaW5nIGEgbGl0ZXJhbCBsaXN0LCBzZXQsIG9yIG1hcCBlbnRyeQovLy8gYXMgdGhlICJmb3ItaW4iIGNvbnRyb2wgZmxvdydzIGV4cHJlc3Npb24uCmNsYXNzIEZvckluRW50cnkgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBGb3JJbkVudHJ5KCkgOiBzdXBlcih0cnVlLCAwKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IEZvckluQ29tcGxldGUoKTsKICB9Cn0KCmNsYXNzIEZvckNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgRm9yQ29tcGxldGUoKSA6IHN1cGVyKGZhbHNlLCAwKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRGb3JDb250cm9sRmxvdyh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgpjbGFzcyBGb3JJbkNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgRm9ySW5Db21wbGV0ZSgpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmVuZEZvckluQ29udHJvbEZsb3codG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKLy8vIFRoZSBmaXJzdCBzdGVwIHdoZW4gcHJvY2Vzc2luZyBhbiBgaWZgIGNvbnRyb2wgZmxvdyBjb2xsZWN0aW9uIGVudHJ5LgpjbGFzcyBJZkNvbmRpdGlvbiBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IElmQ29uZGl0aW9uKCkgOiBzdXBlcihmYWxzZSwgMSk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBmaW5hbCBUb2tlbiBpZlRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnaWYnLCBpZlRva2VuKSk7CiAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5JZkNvbnRyb2xGbG93KGlmVG9rZW4pOwogICAgVG9rZW4gcmVzdWx0ID0gcGFyc2VyLmVuc3VyZVBhcmVudGhlc2l6ZWRDb25kaXRpb24oaWZUb2tlbik7CiAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5UaGVuQ29udHJvbEZsb3cocmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICBUb2tlbiBuZXh0ID0gdG9rZW4ubmV4dDsKICAgIGlmIChvcHRpb25hbCgnZm9yJywgbmV4dCkgfHwKICAgICAgICAob3B0aW9uYWwoJ2F3YWl0JywgbmV4dCkgJiYgb3B0aW9uYWwoJ2ZvcicsIG5leHQubmV4dCkpKSB7CiAgICAgIHJldHVybiBuZXcgTmVzdGVkKG5ldyBGb3JDb25kaXRpb24oKSwgY29uc3QgSWZDb21wbGV0ZSgpKTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWwoJ2lmJywgbmV4dCkpIHsKICAgICAgcmV0dXJuIG5ldyBOZXN0ZWQoaWZDb25kaXRpb24sIGNvbnN0IElmQ29tcGxldGUoKSk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcuLi4nLCBuZXh0KSB8fCBvcHRpb25hbCgnLi4uPycsIG5leHQpKSB7CiAgICAgIHJldHVybiBjb25zdCBJZlNwcmVhZCgpOwogICAgfQogICAgcmV0dXJuIGNvbnN0IElmRW50cnkoKTsKICB9Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBzcHJlYWQgY29sbGVjdGlvbgovLy8gYXMgdGhlIGBpZmAgY29udHJvbCBmbG93J3MgdGhlbi1leHByZXNzaW9uLgpjbGFzcyBJZlNwcmVhZCBleHRlbmRzIFNwcmVhZE9wZXJhdG9yIHsKICBjb25zdCBJZlNwcmVhZCgpOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSA9PiBjb25zdCBJZkNvbXBsZXRlKCk7Cn0KCi8vLyBBIHN0ZXAgZm9yIHBhcnNpbmcgYSBsaXRlcmFsIGxpc3QsIHNldCwgb3IgbWFwIGVudHJ5Ci8vLyBhcyB0aGUgYGlmYCBjb250cm9sIGZsb3cncyB0aGVuLWV4cHJlc3Npb24uCmNsYXNzIElmRW50cnkgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBJZkVudHJ5KCkgOiBzdXBlcih0cnVlLCAwKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgPT4gY29uc3QgSWZDb21wbGV0ZSgpOwp9CgpjbGFzcyBJZkNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgSWZDb21wbGV0ZSgpIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgaWYgKCFvcHRpb25hbCgnZWxzZScsIHRva2VuLm5leHQpKSB7CiAgICAgIHBhcnNlci5saXN0ZW5lci5lbmRJZkNvbnRyb2xGbG93KHRva2VuKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIExpdGVyYWxFbnRyeUluZm8gY29tcHV0ZU5leHQoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBvcHRpb25hbCgnZWxzZScsIHRva2VuLm5leHQpID8gY29uc3QgSWZFbHNlKCkgOiBudWxsOwogIH0KfQoKLy8vIEEgc3RlcCBmb3IgcGFyc2luZyB0aGUgYGVsc2VgIHBvcnRpb24gb2YgYW4gYGlmYCBjb250cm9sIGZsb3cuCmNsYXNzIElmRWxzZSBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IElmRWxzZSgpIDogc3VwZXIoZmFsc2UsIC0xKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIGVsc2VUb2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2Vsc2UnLCBlbHNlVG9rZW4pKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVFbHNlQ29udHJvbEZsb3coZWxzZVRva2VuKTsKICAgIHJldHVybiBlbHNlVG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICBhc3NlcnQob3B0aW9uYWwoJ2Vsc2UnLCB0b2tlbikpOwogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBpZiAob3B0aW9uYWwoJ2ZvcicsIG5leHQpIHx8CiAgICAgICAgKG9wdGlvbmFsKCdhd2FpdCcsIG5leHQpICYmIG9wdGlvbmFsKCdmb3InLCBuZXh0Lm5leHQpKSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZChuZXcgRm9yQ29uZGl0aW9uKCksIGNvbnN0IElmRWxzZUNvbXBsZXRlKCkpOwogICAgfSBlbHNlIGlmIChvcHRpb25hbCgnaWYnLCBuZXh0KSkgewogICAgICByZXR1cm4gbmV3IE5lc3RlZChpZkNvbmRpdGlvbiwgY29uc3QgSWZFbHNlQ29tcGxldGUoKSk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsKCcuLi4nLCBuZXh0KSB8fCBvcHRpb25hbCgnLi4uPycsIG5leHQpKSB7CiAgICAgIHJldHVybiBjb25zdCBFbHNlU3ByZWFkKCk7CiAgICB9CiAgICByZXR1cm4gY29uc3QgRWxzZUVudHJ5KCk7CiAgfQp9CgpjbGFzcyBFbHNlU3ByZWFkIGV4dGVuZHMgU3ByZWFkT3BlcmF0b3IgewogIGNvbnN0IEVsc2VTcHJlYWQoKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIGNvbnN0IElmRWxzZUNvbXBsZXRlKCk7CiAgfQp9CgpjbGFzcyBFbHNlRW50cnkgZXh0ZW5kcyBMaXRlcmFsRW50cnlJbmZvIHsKICBjb25zdCBFbHNlRW50cnkoKSA6IHN1cGVyKHRydWUsIDApOwoKICBAb3ZlcnJpZGUKICBMaXRlcmFsRW50cnlJbmZvIGNvbXB1dGVOZXh0KFRva2VuIHRva2VuKSB7CiAgICByZXR1cm4gY29uc3QgSWZFbHNlQ29tcGxldGUoKTsKICB9Cn0KCmNsYXNzIElmRWxzZUNvbXBsZXRlIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgY29uc3QgSWZFbHNlQ29tcGxldGUoKSA6IHN1cGVyKGZhbHNlLCAwKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2UoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRJZkVsc2VDb250cm9sRmxvdyh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgovLy8gVGhlIGZpcnN0IHN0ZXAgd2hlbiBwcm9jZXNzaW5nIGEgc3ByZWFkIGVudHJ5LgpjbGFzcyBTcHJlYWRPcGVyYXRvciBleHRlbmRzIExpdGVyYWxFbnRyeUluZm8gewogIGNvbnN0IFNwcmVhZE9wZXJhdG9yKCkgOiBzdXBlcihmYWxzZSwgMCk7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBmaW5hbCBUb2tlbiBvcGVyYXRvciA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJy4uLicsIG9wZXJhdG9yKSB8fCBvcHRpb25hbCgnLi4uPycsIG9wZXJhdG9yKSk7CiAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24ob3BlcmF0b3IpOwogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZVNwcmVhZEV4cHJlc3Npb24ob3BlcmF0b3IpOwogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKY2xhc3MgTmVzdGVkIGV4dGVuZHMgTGl0ZXJhbEVudHJ5SW5mbyB7CiAgTGl0ZXJhbEVudHJ5SW5mbyBuZXN0ZWRTdGVwOwogIGZpbmFsIExpdGVyYWxFbnRyeUluZm8gbGFzdFN0ZXA7CgogIE5lc3RlZCh0aGlzLm5lc3RlZFN0ZXAsIHRoaXMubGFzdFN0ZXApIDogc3VwZXIoZmFsc2UsIDApOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBoYXNFbnRyeSA9PiBuZXN0ZWRTdGVwLmhhc0VudHJ5OwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4gbmVzdGVkU3RlcC5wYXJzZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgTGl0ZXJhbEVudHJ5SW5mbyBjb21wdXRlTmV4dChUb2tlbiB0b2tlbikgewogICAgbmVzdGVkU3RlcCA9IG5lc3RlZFN0ZXAuY29tcHV0ZU5leHQodG9rZW4pOwogICAgcmV0dXJuIG5lc3RlZFN0ZXAgIT0gbnVsbCA/IHRoaXMgOiBsYXN0U3RlcDsKICB9Cn0KgSMATU48ASAiGxQBQCU6AUMpQAFKLhABJAEMLB0WIyEZBiEnPwFBI0YBQyYWLjQNKxdJBhIEAQwuHSFDGRw/CScZFT8JQkAGPAQCASssKRUBDC4gBAIBKy8rFwEMLiIEAgE5LColAQwuIAQCATkvLCcBDC4iBAIBLSkBDCwuEgQCAS8rAQwsMBIEAgFKLSkBDCwmJTFBMhMEAQwuHSFDQSc6Qh8GHAQCASswKBQBDEMCATkwKSQBDEMCASwoAQwsKS8GEgQBDC5BBAIBQyglAQwsIik2FgQBDC4lHSFDRSc+QiEGHgQCASoWAQwuIwQCASsmAQwuIwQCATAsAQwsMRIEAgEzMCwBDCwnRS42EgQCASgfIwE8AQwsAQxOAQwuMDEEAgFDcGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvbGl0ZXJhbF9lbnRyeV9pbmZvX2ltcGwuZGFydGZmaWxlOi8vL2Ivcy93L2lyL2svZnVjaHNpYS90aGlyZF9wYXJ0eS9kYXJ0L3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvcGFyc2VyL3R5cGVfaW5mb19pbXBsLmRhcnTAAJQVLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIudHlwZV9pbmZvX2ltcGw7CgppbXBvcnQgJy4uL21lc3NhZ2VzL2NvZGVzLmRhcnQnIGFzIGNvZGVzOwoKaW1wb3J0ICcuLi9zY2FubmVyL3Rva2VuLmRhcnQnIHNob3cgU3ludGhldGljVG9rZW4sIFRva2VuLCBUb2tlblR5cGU7CgppbXBvcnQgJy4uL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnQnIHNob3cgSURFTlRJRklFUl9UT0tFTjsKCmltcG9ydCAnLi4vdXRpbC9saW5rLmRhcnQnIHNob3cgTGluazsKCmltcG9ydCAnZm9yd2FyZGluZ19saXN0ZW5lci5kYXJ0JyBzaG93IEZvcndhcmRpbmdMaXN0ZW5lcjsKCmltcG9ydCAnaWRlbnRpZmllcl9jb250ZXh0LmRhcnQnIHNob3cgSWRlbnRpZmllckNvbnRleHQ7CgppbXBvcnQgJ21lbWJlcl9raW5kLmRhcnQnIHNob3cgTWVtYmVyS2luZDsKCmltcG9ydCAnbGlzdGVuZXIuZGFydCcgc2hvdyBMaXN0ZW5lcjsKCmltcG9ydCAncGFyc2VyX2ltcGwuZGFydCcgc2hvdyBQYXJzZXI7CgppbXBvcnQgJ3R5cGVfaW5mby5kYXJ0JzsKCmltcG9ydCAndXRpbC5kYXJ0JwogICAgc2hvdwogICAgICAgIG9wdGlvbmFsLAogICAgICAgIHNraXBNZXRhZGF0YSwKICAgICAgICBzcGxpdEd0RXEsCiAgICAgICAgc3BsaXRHdEZyb21HdEd0RXEsCiAgICAgICAgc3BsaXRHdEZyb21HdEd0R3QsCiAgICAgICAgc3BsaXRHdEZyb21HdEd0R3RFcSwKICAgICAgICBzcGxpdEd0R3QsCiAgICAgICAgc3ludGhldGljR3Q7CgovLy8gW1NpbXBsZVR5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdCi8vLyB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIGlkZW50aWZpZXIgYXMgdGhlIHR5cGUgcmVmZXJlbmNlLgpjb25zdCBUeXBlSW5mbyBzaW1wbGVUeXBlID0gY29uc3QgU2ltcGxlVHlwZSgpOwoKLy8vIFtTaW1wbGVOdWxsYWJsZVR5cGVdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieSBbY29tcHV0ZVR5cGVdCi8vLyB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgYD9gIGFzIHRoZSB0eXBlIHJlZmVyZW5jZS4KY29uc3QgVHlwZUluZm8gc2ltcGxlTnVsbGFibGVUeXBlID0gY29uc3QgU2ltcGxlTnVsbGFibGVUeXBlKCk7CgovLy8gW1ByZWZpeGVkVHlwZV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0KLy8vIHdoZW4gdGhlIHR5cGUgcmVmZXJlbmNlIGlzIG9mIHRoZSBmb3JtOiBpZGVudGlmaWVyIGAuYCBpZGVudGlmaWVyLgpjb25zdCBUeXBlSW5mbyBwcmVmaXhlZFR5cGUgPSBjb25zdCBQcmVmaXhlZFR5cGUoKTsKCi8vLyBbU2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD5gLgpjb25zdCBUeXBlSW5mbyBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudCA9CiAgICBjb25zdCBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudChzaW1wbGVUeXBlQXJndW1lbnQxKTsKCi8vLyBbU2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD49YC4KY29uc3QgVHlwZUluZm8gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRHdEVxID0KICAgIGNvbnN0IFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50KHNpbXBsZVR5cGVBcmd1bWVudDFHdEVxKTsKCi8vLyBbU2ltcGxlVHlwZVdpdGgxQXJndW1lbnRdIGlzIGEgc3BlY2lhbGl6ZWQgW1R5cGVJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGlkZW50aWZpZXIgYDxgIGlkZW50aWZpZXIgYD4+YC4KY29uc3QgVHlwZUluZm8gc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRHdEd0ID0KICAgIGNvbnN0IFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50KHNpbXBsZVR5cGVBcmd1bWVudDFHdEd0KTsKCi8vLyBbU2ltcGxlTnVsbGFibGVUeXBlV2l0aDFBcmd1bWVudF0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZUluZm9dIHJldHVybmVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVdIHdoZW4gdGhlIHR5cGUgcmVmZXJlbmNlIGlzIG9mIHRoZSBmb3JtOgovLy8gaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPmAgYD9gLgpjb25zdCBUeXBlSW5mbyBzaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50ID0KICAgIGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnQoKTsKCi8vLyBbU2ltcGxlVHlwZUFyZ3VtZW50MV0gaXMgYSBzcGVjaWFsaXplZCBbVHlwZVBhcmFtT3JBcmdJbmZvXSByZXR1cm5lZCBieQovLy8gW2NvbXB1dGVUeXBlUGFyYW1PckFyZ10gd2hlbiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgb2YgdGhlIGZvcm06Ci8vLyBgPGAgaWRlbnRpZmllciBgPmAuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBzaW1wbGVUeXBlQXJndW1lbnQxID0gY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MSgpOwoKLy8vIFtTaW1wbGVUeXBlQXJndW1lbnQxXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlUGFyYW1PckFyZ0luZm9dIHJldHVybmVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVQYXJhbU9yQXJnXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGA8YCBpZGVudGlmaWVyIGA+PWAuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBzaW1wbGVUeXBlQXJndW1lbnQxR3RFcSA9CiAgICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxR3RFcSgpOwoKLy8vIFtTaW1wbGVUeXBlQXJndW1lbnQxXSBpcyBhIHNwZWNpYWxpemVkIFtUeXBlUGFyYW1PckFyZ0luZm9dIHJldHVybmVkIGJ5Ci8vLyBbY29tcHV0ZVR5cGVQYXJhbU9yQXJnXSB3aGVuIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBvZiB0aGUgZm9ybToKLy8vIGA8YCBpZGVudGlmaWVyIGA+PmAuCmNvbnN0IFR5cGVQYXJhbU9yQXJnSW5mbyBzaW1wbGVUeXBlQXJndW1lbnQxR3RHdCA9CiAgICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxR3RHdCgpOwoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbbm9UeXBlXSBjb25zdC4KY2xhc3MgTm9UeXBlIGltcGxlbWVudHMgVHlwZUluZm8gewogIGNvbnN0IE5vVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yV2l0aFRva2VuKAogICAgICAgIHRva2VuLm5leHQsIGNvZGVzLnRlbXBsYXRlRXhwZWN0ZWRUeXBlKTsKICAgIHBhcnNlci5yZXdyaXRlci5pbnNlcnRTeW50aGV0aWNJZGVudGlmaWVyKHRva2VuKTsKICAgIHJldHVybiBzaW1wbGVUeXBlLnBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVPclZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIGVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZU5vVHlwZSh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuOwogIH0KfQoKLy8vIFNlZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBbcHJlZml4ZWRUeXBlXSBjb25zdC4KY2xhc3MgUHJlZml4ZWRUeXBlIGltcGxlbWVudHMgVHlwZUluZm8gewogIGNvbnN0IFByZWZpeGVkVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBzdGFydCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydCh0b2tlbi5pc0tleXdvcmRPcklkZW50aWZpZXIpOwogICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBwYXJzZXIubGlzdGVuZXI7CiAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5wcmVmaXhlZFR5cGVSZWZlcmVuY2UpOwoKICAgIFRva2VuIHBlcmlvZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnLicsIHRva2VuKSk7CgogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICBsaXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKAogICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlQ29udGludWF0aW9uKTsKICAgIGxpc3RlbmVyLmhhbmRsZVF1YWxpZmllZChwZXJpb2QpOwoKICAgIGxpc3RlbmVyLmhhbmRsZU5vVHlwZUFyZ3VtZW50cyh0b2tlbi5uZXh0KTsKICAgIGxpc3RlbmVyLmhhbmRsZVR5cGUoc3RhcnQsIG51bGwpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0Lm5leHQubmV4dDsKICB9Cn0KCi8vLyBTZWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW3NpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnRdIGNvbnN0LgpjbGFzcyBTaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50IGV4dGVuZHMgU2ltcGxlVHlwZVdpdGgxQXJndW1lbnQgewogIGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZVdpdGgxQXJndW1lbnQoKSA6IHN1cGVyKHNpbXBsZVR5cGVBcmd1bWVudDEpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudDsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiB0cnVlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVSZXN0KFRva2VuIHN0YXJ0LCBUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc/JywgdG9rZW4pKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVUeXBlKHN0YXJ0LCB0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSBzdXBlci5za2lwVHlwZSh0b2tlbikubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHRva2VuKSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFtzaW1wbGVUeXBlV2l0aDFBcmd1bWVudF0gY29uc3QuCmNsYXNzIFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50IGltcGxlbWVudHMgVHlwZUluZm8gewogIGZpbmFsIFR5cGVQYXJhbU9yQXJnSW5mbyB0eXBlQXJnOwoKICBjb25zdCBTaW1wbGVUeXBlV2l0aDFBcmd1bWVudCh0aGlzLnR5cGVBcmcpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiB0aGlzOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBjb3VsZEJlRXhwcmVzc2lvbiA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgYm9vbCBnZXQgaXNOdWxsYWJsZSA9PiBmYWxzZTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gZW5zdXJlVHlwZU9yVm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gc3RhcnQgPSB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlKTsKICAgIHRva2VuID0gdHlwZUFyZy5wYXJzZUFyZ3VtZW50cyh0b2tlbiwgcGFyc2VyKTsKICAgIHJldHVybiBwYXJzZVR5cGVSZXN0KHN0YXJ0LCB0b2tlbiwgcGFyc2VyKTsKICB9CgogIFRva2VuIHBhcnNlVHlwZVJlc3QoVG9rZW4gc3RhcnQsIFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZShzdGFydCwgbnVsbCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICByZXR1cm4gdHlwZUFyZy5za2lwKHRva2VuKTsKICB9Cn0KCi8vLyBTZWUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgW3NpbXBsZU51bGxhYmxlVHlwZV0gY29uc3QuCmNsYXNzIFNpbXBsZU51bGxhYmxlVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgewogIGNvbnN0IFNpbXBsZU51bGxhYmxlVHlwZSgpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSA9PiBzaW1wbGVUeXBlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IHRydWU7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZVJlc3QoVG9rZW4gc3RhcnQsIFBhcnNlciBwYXJzZXIpIHsKICAgIFRva2VuIHRva2VuID0gc3RhcnQubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHRva2VuKSk7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZShzdGFydCwgdG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiB0b2tlbi5uZXh0Lm5leHQ7CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFtzaW1wbGVUeXBlXSBjb25zdC4KY2xhc3MgU2ltcGxlVHlwZSBpbXBsZW1lbnRzIFR5cGVJbmZvIHsKICBjb25zdCBTaW1wbGVUeXBlKCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCBhc05vbk51bGxhYmxlID0+IHRoaXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvdWxkQmVFeHByZXNzaW9uID0+IHRydWU7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzTnVsbGFibGUgPT4gZmFsc2U7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVOb3RWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIGVuc3VyZVR5cGVPclZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChpc1ZhbGlkVHlwZVJlZmVyZW5jZSh0b2tlbikpOwogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZUlkZW50aWZpZXIodG9rZW4sIElkZW50aWZpZXJDb250ZXh0LnR5cGVSZWZlcmVuY2UpOwogICAgdG9rZW4gPSBub1R5cGVQYXJhbU9yQXJnLnBhcnNlQXJndW1lbnRzKHRva2VuLCBwYXJzZXIpOwogICAgcmV0dXJuIHBhcnNlVHlwZVJlc3QodG9rZW4sIHBhcnNlcik7CiAgfQoKICBUb2tlbiBwYXJzZVR5cGVSZXN0KFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBwYXJzZXIubGlzdGVuZXIuaGFuZGxlVHlwZSh0b2tlbiwgbnVsbCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgfQp9CgovLy8gU2VlIGRvY3VtZW50YXRpb24gb24gdGhlIFt2b2lkVHlwZV0gY29uc3QuCmNsYXNzIFZvaWRUeXBlIGltcGxlbWVudHMgVHlwZUluZm8gewogIGNvbnN0IFZvaWRUeXBlKCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCBhc05vbk51bGxhYmxlID0+IHRoaXM7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvdWxkQmVFeHByZXNzaW9uID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGZhbHNlOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgLy8gUmVwb3J0IGFuIGVycm9yLCB0aGVuIHBhcnNlIGB2b2lkYCBhcyBpZiBpdCB3ZXJlIGEgdHlwZSBuYW1lLgogICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IodG9rZW4ubmV4dCwgY29kZXMubWVzc2FnZUludmFsaWRWb2lkKTsKICAgIHJldHVybiBzaW1wbGVUeXBlLnBhcnNlVHlwZU5vdFZvaWQodG9rZW4sIHBhcnNlcik7CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIGVuc3VyZVR5cGVOb3RWb2lkKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVR5cGUoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVWb2lkS2V5d29yZCh0b2tlbik7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBza2lwVHlwZShUb2tlbiB0b2tlbikgewogICAgcmV0dXJuIHRva2VuLm5leHQ7CiAgfQp9Cgpib29sIGxvb2tzTGlrZU5hbWUoVG9rZW4gdG9rZW4pID0+CiAgICB0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4gfHwKICAgIG9wdGlvbmFsKCd0aGlzJywgdG9rZW4pIHx8CiAgICAodG9rZW4uaXNJZGVudGlmaWVyICYmCiAgICAgICAgLy8gQWx0aG91Z2ggYHR5cGVkZWZgIGlzIGEgbGVnYWwgaWRlbnRpZmllciwKICAgICAgICAvLyB0eXBlIGB0eXBlZGVmYCBpZGVudGlmaWVyIGlzIG5vdCBsZWdhbCBhbmQgaW4gdGhpcyBzaXR1YXRpb24KICAgICAgICAvLyBgdHlwZWRlZmAgaXMgcHJvYmFibHkgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbi4KICAgICAgICAoIW9wdGlvbmFsKCd0eXBlZGVmJywgdG9rZW4pIHx8ICF0b2tlbi5uZXh0LmlzSWRlbnRpZmllcikpOwoKLy8vIFdoZW4gbWlzc2luZyBhIGNvbW1hLCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHRva2VuIGxvb2tzIGxpa2UgaXQgc2hvdWxkCi8vLyBiZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiBvZiB0eXBlIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLgpib29sIGxvb2tzTGlrZVR5cGVQYXJhbU9yQXJnKGJvb2wgaW5EZWNsYXJhdGlvbiwgVG9rZW4gdG9rZW4pIHsKICBpZiAoaW5EZWNsYXJhdGlvbiAmJiB0b2tlbi5raW5kID09IElERU5USUZJRVJfVE9LRU4pIHsKICAgIFRva2VuIG5leHQgPSB0b2tlbi5uZXh0OwogICAgaWYgKG5leHQua2luZCA9PSBJREVOVElGSUVSX1RPS0VOIHx8CiAgICAgICAgb3B0aW9uYWwoJywnLCBuZXh0KSB8fAogICAgICAgIGlzQ2xvc2VyKG5leHQpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCi8vLyBJbnN0YW5jZXMgb2YgW0NvbXBsZXhUeXBlSW5mb10gYXJlIHJldHVybmVkIGJ5IFtjb21wdXRlVHlwZV0gdG8gcmVwcmVzZW50Ci8vLyB0eXBlIHJlZmVyZW5jZXMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGNvbnN0YW50cyBhYm92ZS4KY2xhc3MgQ29tcGxleFR5cGVJbmZvIGltcGxlbWVudHMgVHlwZUluZm8gewogIC8vLyBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHR5cGUgcmVmZXJlbmNlLgogIFRva2VuIHN0YXJ0OwoKICAvLy8gVHlwZSBhcmd1bWVudHMgd2VyZSBzZWVuIGR1cmluZyBhbmFseXNpcy4KICBmaW5hbCBUeXBlUGFyYW1PckFyZ0luZm8gdHlwZUFyZ3VtZW50czsKCiAgLy8vIFRoZSB0b2tlbiBiZWZvcmUgdGhlIHRyYWlsaW5nIHF1ZXN0aW9uIG1hcmsgb3IgYG51bGxgIGlmIGVpdGhlcgogIC8vLyAxKSB0aGVyZSBpcyBubyB0cmFpbGluZyBxdWVzdGlvbiBtYXJrLCBvcgogIC8vLyAyKSB0aGUgdHJhaWxpbmcgcXVlc3Rpb24gbWFyayBpcyBub3QgcGFydCBvZiB0aGUgdHlwZSByZWZlcmVuY2UuCiAgVG9rZW4gYmVmb3JlUXVlc3Rpb25NYXJrOwoKICAvLy8gVGhlIGxhc3QgdG9rZW4gaW4gdGhlIHR5cGUgcmVmZXJlbmNlLgogIFRva2VuIGVuZDsKCiAgLy8vIFRoZSBgRnVuY3Rpb25gIHRva2VucyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHR5cGUgdmFyaWFibGVzIG9mIGZ1bmN0aW9uIHR5cGVzCiAgLy8vIGFzIHNlZW4gZHVyaW5nIGFuYWx5c2lzLgogIExpbms8VG9rZW4+IHR5cGVWYXJpYWJsZVN0YXJ0ZXJzID0gY29uc3QgTGluazxUb2tlbj4oKTsKCiAgLy8vIElmIHRoZSByZWNlaXZlciByZXByZXNlbnRzIGEgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gdHlwZSB0aGVuIHRoaXMgaW5kaWNhdGVzCiAgLy8vIHdoZXRoZXIgaXQgaGFzIGEgcmV0dXJuIHR5cGUsIG90aGVyd2lzZSB0aGlzIGlzIGBudWxsYC4KICBib29sIGdmdEhhc1JldHVyblR5cGU7CgogIENvbXBsZXhUeXBlSW5mbyhUb2tlbiBiZWZvcmVTdGFydCwgdGhpcy50eXBlQXJndW1lbnRzKQogICAgICA6IHRoaXMuc3RhcnQgPSBiZWZvcmVTdGFydC5uZXh0IHsKICAgIGFzc2VydCh0eXBlQXJndW1lbnRzICE9IG51bGwpOwogIH0KCiAgQ29tcGxleFR5cGVJbmZvLl9ub25OdWxsYWJsZSh0aGlzLnN0YXJ0LCB0aGlzLnR5cGVBcmd1bWVudHMsIHRoaXMuZW5kLAogICAgICB0aGlzLnR5cGVWYXJpYWJsZVN0YXJ0ZXJzLCB0aGlzLmdmdEhhc1JldHVyblR5cGUpOwoKICBAb3ZlcnJpZGUKICBUeXBlSW5mbyBnZXQgYXNOb25OdWxsYWJsZSB7CiAgICByZXR1cm4gYmVmb3JlUXVlc3Rpb25NYXJrID09IG51bGwKICAgICAgICA/IHRoaXMKICAgICAgICA6IG5ldyBDb21wbGV4VHlwZUluZm8uX25vbk51bGxhYmxlKHN0YXJ0LCB0eXBlQXJndW1lbnRzLAogICAgICAgICAgICBiZWZvcmVRdWVzdGlvbk1hcmssIHR5cGVWYXJpYWJsZVN0YXJ0ZXJzLCBnZnRIYXNSZXR1cm5UeXBlKTsKICB9CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGNvdWxkQmVFeHByZXNzaW9uID0+CiAgICAgIHR5cGVBcmd1bWVudHMgPT0gbm9UeXBlUGFyYW1PckFyZyAmJiB0eXBlVmFyaWFibGVTdGFydGVycy5pc0VtcHR5OwoKICBAb3ZlcnJpZGUKICBib29sIGdldCBpc051bGxhYmxlID0+IGJlZm9yZVF1ZXN0aW9uTWFyayAhPSBudWxsOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlTm90Vm9pZChUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgPT4KICAgICAgcGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwoKICBAb3ZlcnJpZGUKICBUb2tlbiBlbnN1cmVUeXBlT3JWb2lkKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSA9PgogICAgICBwYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVHlwZU5vdFZvaWQoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpID0+CiAgICAgIHBhcnNlVHlwZSh0b2tlbiwgcGFyc2VyKTsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VUeXBlKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLm5leHQsIHN0YXJ0KSk7CgogICAgaWYgKG9wdGlvbmFsKCcuJywgc3RhcnQpKSB7CiAgICAgIC8vIFJlY292ZXJ5OiBJbnNlcnQgbWlzc2luZyBpZGVudGlmaWVyIHdpdGhvdXQgc2VuZGluZyBldmVudHMKICAgICAgc3RhcnQgPSBwYXJzZXIuaW5zZXJ0U3ludGhldGljSWRlbnRpZmllcigKICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC5wcmVmaXhlZFR5cGVSZWZlcmVuY2UpOwogICAgfQoKICAgIGZpbmFsIExpc3Q8VG9rZW4+IHR5cGVWYXJpYWJsZUVuZEdyb3VwcyA9IDxUb2tlbj5bXTsKICAgIGZvciAoTGluazxUb2tlbj4gdCA9IHR5cGVWYXJpYWJsZVN0YXJ0ZXJzOyB0LmlzTm90RW1wdHk7IHQgPSB0LnRhaWwpIHsKICAgICAgdHlwZVZhcmlhYmxlRW5kR3JvdXBzLmFkZCgKICAgICAgICAgIGNvbXB1dGVUeXBlUGFyYW1PckFyZyh0LmhlYWQsIHRydWUpLnBhcnNlVmFyaWFibGVzKHQuaGVhZCwgcGFyc2VyKSk7CiAgICAgIHBhcnNlci5saXN0ZW5lci5iZWdpbkZ1bmN0aW9uVHlwZShzdGFydCk7CiAgICB9CgogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gZmFsc2UpIHsKICAgICAgLy8gQSBmdW5jdGlvbiB0eXBlIHdpdGhvdXQgcmV0dXJuIHR5cGUuCiAgICAgIC8vIFB1c2ggdGhlIG5vbi1leGlzdGluZyByZXR1cm4gdHlwZSBmaXJzdC4gVGhlIGxvb3AgYmVsb3cgd2lsbAogICAgICAvLyBnZW5lcmF0ZSB0aGUgZnVsbCB0eXBlLgogICAgICBub1R5cGUucGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwogICAgfSBlbHNlIHsKICAgICAgVG9rZW4gdHlwZVJlZk9yUHJlZml4ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCd2b2lkJywgdHlwZVJlZk9yUHJlZml4KSkgewogICAgICAgIHRva2VuID0gdm9pZFR5cGUucGFyc2VUeXBlKHRva2VuLCBwYXJzZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghb3B0aW9uYWwoJy4nLCB0eXBlUmVmT3JQcmVmaXgpICYmCiAgICAgICAgICAgICFvcHRpb25hbCgnLicsIHR5cGVSZWZPclByZWZpeC5uZXh0KSkgewogICAgICAgICAgdG9rZW4gPQogICAgICAgICAgICAgIHBhcnNlci5lbnN1cmVJZGVudGlmaWVyKHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlUmVmZXJlbmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW4gPSBwYXJzZXIuZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQucHJlZml4ZWRUeXBlUmVmZXJlbmNlKTsKICAgICAgICAgIHRva2VuID0gcGFyc2VyLnBhcnNlUXVhbGlmaWVkUmVzdCgKICAgICAgICAgICAgICB0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVJlZmVyZW5jZUNvbnRpbnVhdGlvbik7CiAgICAgICAgICBpZiAodG9rZW4uaXNTeW50aGV0aWMgJiYgZW5kID09IHR5cGVSZWZPclByZWZpeC5uZXh0KSB7CiAgICAgICAgICAgIC8vIFJlY292ZXJ5OiBVcGRhdGUgYGVuZGAgaWYgYSBzeW50aGV0aWMgaWRlbnRpZmllciB3YXMgaW5zZXJ0ZWQuCiAgICAgICAgICAgIGVuZCA9IHRva2VuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b2tlbiA9IHR5cGVBcmd1bWVudHMucGFyc2VBcmd1bWVudHModG9rZW4sIHBhcnNlcik7CgogICAgICAgIC8vIE9ubHkgY29uc3VtZSB0aGUgYD9gIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGNvbXBsZXggdHlwZQogICAgICAgIFRva2VuIHF1ZXN0aW9uTWFyayA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc/JywgcXVlc3Rpb25NYXJrKSAmJgogICAgICAgICAgICAodHlwZVZhcmlhYmxlRW5kR3JvdXBzLmlzTm90RW1wdHkgfHwgYmVmb3JlUXVlc3Rpb25NYXJrICE9IG51bGwpKSB7CiAgICAgICAgICB0b2tlbiA9IHF1ZXN0aW9uTWFyazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcXVlc3Rpb25NYXJrID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVUeXBlKHR5cGVSZWZPclByZWZpeCwgcXVlc3Rpb25NYXJrKTsKICAgICAgfQogICAgfQoKICAgIGludCBlbmRHcm91cEluZGV4ID0gdHlwZVZhcmlhYmxlRW5kR3JvdXBzLmxlbmd0aCAtIDE7CiAgICBmb3IgKExpbms8VG9rZW4+IHQgPSB0eXBlVmFyaWFibGVTdGFydGVyczsgdC5pc05vdEVtcHR5OyB0ID0gdC50YWlsKSB7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgICAgYXNzZXJ0KG9wdGlvbmFsKCdGdW5jdGlvbicsIHRva2VuKSk7CiAgICAgIFRva2VuIGZ1bmN0aW9uVG9rZW4gPSB0b2tlbjsKCiAgICAgIGlmIChvcHRpb25hbCgiPCIsIHRva2VuLm5leHQpKSB7CiAgICAgICAgLy8gU2tpcCB0eXBlIHBhcmFtZXRlcnMsIHRoZXkgd2VyZSBwYXJzZWQgYWJvdmUuCiAgICAgICAgdG9rZW4gPSB0eXBlVmFyaWFibGVFbmRHcm91cHNbZW5kR3JvdXBJbmRleF07CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKICAgICAgfQogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZUZvcm1hbFBhcmFtZXRlcnNSZXF1aXJlZE9wdCgKICAgICAgICAgIHRva2VuLCBNZW1iZXJLaW5kLkdlbmVyYWxpemVkRnVuY3Rpb25UeXBlKTsKCiAgICAgIC8vIE9ubHkgY29uc3VtZSB0aGUgYD9gIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGNvbXBsZXggdHlwZQogICAgICBUb2tlbiBxdWVzdGlvbk1hcmsgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJz8nLCBxdWVzdGlvbk1hcmspICYmCiAgICAgICAgICAoZW5kR3JvdXBJbmRleCA+IDAgfHwgYmVmb3JlUXVlc3Rpb25NYXJrICE9IG51bGwpKSB7CiAgICAgICAgdG9rZW4gPSBxdWVzdGlvbk1hcms7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVlc3Rpb25NYXJrID0gbnVsbDsKICAgICAgfQoKICAgICAgLS1lbmRHcm91cEluZGV4OwogICAgICBwYXJzZXIubGlzdGVuZXIuZW5kRnVuY3Rpb25UeXBlKGZ1bmN0aW9uVG9rZW4sIHF1ZXN0aW9uTWFyayk7CiAgICB9CgogICAgLy8gVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIGluIHdoaWNoIHRoZSBbdG9rZW5dICE9IFtlbmRdOgogICAgLy8gVmFsaWQgY29kZTogICAgaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPGAgaWRlbnRpZmllciBgPj5gCiAgICAvLyAgICB3aGVyZSBgPj5gIGlzIHJlcGxhY2VkIGJ5IHR3byB0b2tlbnMuCiAgICAvLyBJbnZhbGlkIGNvZGU6ICBpZGVudGlmaWVyIGA8YCBpZGVudGlmaWVyIGlkZW50aWZpZXIgYD5gCiAgICAvLyAgICB3aGVyZSBhIHN5bnRoZXRpYyBgPmAgaXMgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgaWRlbnRpZmllcnMuCiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLCBlbmQpIHx8IG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKCiAgICAvLyBEdXJpbmcgcmVjb3ZlcnksIFt0b2tlbl0gbWF5IGJlIGEgc3ludGhldGljIHRoYXQgd2FzIGluc2VydGVkIGluIHRoZQogICAgLy8gbWlkZGxlIG9mIHRoZSB0eXBlIHJlZmVyZW5jZS4KICAgIGVuZCA9IHRva2VuOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcFR5cGUoVG9rZW4gdG9rZW4pIHsKICAgIHJldHVybiBlbmQ7CiAgfQoKICAvLy8gR2l2ZW4gYEZ1bmN0aW9uYCBub24taWRlbnRpZmllciwgY29tcHV0ZSB0aGUgdHlwZQogIC8vLyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVOb1R5cGVHRlQoVG9rZW4gYmVmb3JlU3RhcnQsIGJvb2wgcmVxdWlyZWQpIHsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydCkpOwogICAgYXNzZXJ0KGJlZm9yZVN0YXJ0Lm5leHQgPT0gc3RhcnQpOwoKICAgIGNvbXB1dGVSZXN0KGJlZm9yZVN0YXJ0LCByZXF1aXJlZCk7CiAgICBpZiAoZ2Z0SGFzUmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiByZXF1aXJlZCA/IHNpbXBsZVR5cGUgOiBub1R5cGU7CiAgICB9CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gR2l2ZW4gdm9pZCBgRnVuY3Rpb25gIG5vbi1pZGVudGlmaWVyLCBjb21wdXRlIHRoZSB0eXBlCiAgLy8vIGFuZCByZXR1cm4gdGhlIHJlY2VpdmVyIG9yIG9uZSBvZiB0aGUgW1R5cGVJbmZvXSBjb25zdGFudHMuCiAgVHlwZUluZm8gY29tcHV0ZVZvaWRHRlQoYm9vbCByZXF1aXJlZCkgewogICAgYXNzZXJ0KG9wdGlvbmFsKCd2b2lkJywgc3RhcnQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydC5uZXh0KSk7CgogICAgY29tcHV0ZVJlc3Qoc3RhcnQsIHJlcXVpcmVkKTsKICAgIGlmIChnZnRIYXNSZXR1cm5UeXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHZvaWRUeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGlkZW50aWZpZXIgYEZ1bmN0aW9uYCBub24taWRlbnRpZmllciwgY29tcHV0ZSB0aGUgdHlwZQogIC8vLyBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVJZGVudGlmaWVyR0ZUKGJvb2wgcmVxdWlyZWQpIHsKICAgIGFzc2VydChpc1ZhbGlkVHlwZVJlZmVyZW5jZShzdGFydCkpOwogICAgYXNzZXJ0KG9wdGlvbmFsKCdGdW5jdGlvbicsIHN0YXJ0Lm5leHQpKTsKCiAgICBjb21wdXRlUmVzdChzdGFydCwgcmVxdWlyZWQpOwogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gc2ltcGxlVHlwZTsKICAgIH0KICAgIGFzc2VydChlbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gdGhpczsKICB9CgogIC8vLyBHaXZlbiBpZGVudGlmaWVyIGA/YCBgRnVuY3Rpb25gIG5vbi1pZGVudGlmaWVyLCBjb21wdXRlIHRoZSB0eXBlCiAgLy8vIGFuZCByZXR1cm4gdGhlIHJlY2VpdmVyIG9yIG9uZSBvZiB0aGUgW1R5cGVJbmZvXSBjb25zdGFudHMuCiAgVHlwZUluZm8gY29tcHV0ZUlkZW50aWZpZXJRdWVzdGlvbkdGVChib29sIHJlcXVpcmVkKSB7CiAgICBhc3NlcnQoaXNWYWxpZFR5cGVSZWZlcmVuY2Uoc3RhcnQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnPycsIHN0YXJ0Lm5leHQpKTsKICAgIGFzc2VydChvcHRpb25hbCgnRnVuY3Rpb24nLCBzdGFydC5uZXh0Lm5leHQpKTsKCiAgICBjb21wdXRlUmVzdChzdGFydCwgcmVxdWlyZWQpOwogICAgaWYgKGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gc2ltcGxlTnVsbGFibGVUeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGEgYnVpbHRpbiwgcmV0dXJuIHRoZSByZWNlaXZlciBzbyB0aGF0IHBhcnNlVHlwZSB3aWxsIHJlcG9ydAogIC8vLyBhbiBlcnJvciBmb3IgdGhlIGJ1aWx0aW4gdXNlZCBhcyBhIHR5cGUuCiAgVHlwZUluZm8gY29tcHV0ZUJ1aWx0aW5PclZhckFzVHlwZShib29sIHJlcXVpcmVkKSB7CiAgICBhc3NlcnQoc3RhcnQudHlwZS5pc0J1aWx0SW4gfHwgb3B0aW9uYWwoJ3ZhcicsIHN0YXJ0KSk7CgogICAgZW5kID0gdHlwZUFyZ3VtZW50cy5za2lwKHN0YXJ0KTsKICAgIGNvbXB1dGVSZXN0KGVuZCwgcmVxdWlyZWQpOwogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgLy8vIEdpdmVuIGlkZW50aWZpZXIgYDxgIC4uLiBgPmAsIGNvbXB1dGUgdGhlIHR5cGUKICAvLy8gYW5kIHJldHVybiB0aGUgcmVjZWl2ZXIgb3Igb25lIG9mIHRoZSBbVHlwZUluZm9dIGNvbnN0YW50cy4KICBUeXBlSW5mbyBjb21wdXRlU2ltcGxlV2l0aFR5cGVBcmd1bWVudHMoYm9vbCByZXF1aXJlZCkgewogICAgYXNzZXJ0KGlzVmFsaWRUeXBlUmVmZXJlbmNlKHN0YXJ0KSk7CiAgICBhc3NlcnQob3B0aW9uYWwoJzwnLCBzdGFydC5uZXh0KSk7CiAgICBhc3NlcnQodHlwZUFyZ3VtZW50cyAhPSBub1R5cGVQYXJhbU9yQXJnKTsKCiAgICBlbmQgPSB0eXBlQXJndW1lbnRzLnNraXAoc3RhcnQpOwogICAgY29tcHV0ZVJlc3QoZW5kLCByZXF1aXJlZCk7CgogICAgaWYgKCFyZXF1aXJlZCAmJiAhbG9va3NMaWtlTmFtZShlbmQubmV4dCkgJiYgZ2Z0SGFzUmV0dXJuVHlwZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBub1R5cGU7CiAgICB9CiAgICBhc3NlcnQoZW5kICE9IG51bGwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLy8gR2l2ZW4gaWRlbnRpZmllciBgLmAgaWRlbnRpZmllciAob3IgYC5gIGlkZW50aWZpZXIgb3IgaWRlbnRpZmllciBgLmAKICAvLy8gZm9yIHJlY292ZXJ5KSwgY29tcHV0ZSB0aGUgdHlwZSBhbmQgcmV0dXJuIHRoZSByZWNlaXZlciBvciBvbmUgb2YgdGhlCiAgLy8vIFtUeXBlSW5mb10gY29uc3RhbnRzLgogIFR5cGVJbmZvIGNvbXB1dGVQcmVmaXhlZFR5cGUoYm9vbCByZXF1aXJlZCkgewogICAgVG9rZW4gdG9rZW4gPSBzdGFydDsKICAgIGlmICghb3B0aW9uYWwoJy4nLCB0b2tlbikpIHsKICAgICAgYXNzZXJ0KHRva2VuLmlzS2V5d29yZE9ySWRlbnRpZmllcik7CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIGFzc2VydChvcHRpb25hbCgnLicsIHRva2VuKSk7CiAgICBpZiAodG9rZW4ubmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgfQoKICAgIGVuZCA9IHR5cGVBcmd1bWVudHMuc2tpcCh0b2tlbik7CiAgICBjb21wdXRlUmVzdChlbmQsIHJlcXVpcmVkKTsKICAgIGlmICghcmVxdWlyZWQgJiYgIWxvb2tzTGlrZU5hbWUoZW5kLm5leHQpICYmIGdmdEhhc1JldHVyblR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gbm9UeXBlOwogICAgfQogICAgYXNzZXJ0KGVuZCAhPSBudWxsKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgdm9pZCBjb21wdXRlUmVzdChUb2tlbiB0b2tlbiwgYm9vbCByZXF1aXJlZCkgewogICAgaWYgKG9wdGlvbmFsKCc/JywgdG9rZW4ubmV4dCkpIHsKICAgICAgYmVmb3JlUXVlc3Rpb25NYXJrID0gdG9rZW47CiAgICAgIGVuZCA9IHRva2VuID0gdG9rZW4ubmV4dDsKICAgIH0KICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIHdoaWxlIChvcHRpb25hbCgnRnVuY3Rpb24nLCB0b2tlbikpIHsKICAgICAgVG9rZW4gdHlwZVZhcmlhYmxlU3RhcnQgPSB0b2tlbjsKICAgICAgLy8gVE9ETyhkYW5ydWJlbCk6IENvbnNpZGVyIGNhY2hpbmcgVHlwZVBhcmFtT3JBcmdJbmZvCiAgICAgIHRva2VuID0gY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCB0cnVlKS5za2lwKHRva2VuKTsKICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgICBpZiAoIW9wdGlvbmFsKCcoJywgdG9rZW4pKSB7CiAgICAgICAgYnJlYWs7IC8vIE5vdCBhIGZ1bmN0aW9uIHR5cGUuCiAgICAgIH0KICAgICAgdG9rZW4gPSB0b2tlbi5lbmRHcm91cDsKICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKICAgICAgICBicmVhazsgLy8gTm90IGEgZnVuY3Rpb24gdHlwZS4KICAgICAgfQogICAgICBpZiAoIXJlcXVpcmVkKSB7CiAgICAgICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgaWYgKG9wdGlvbmFsKCc/JywgbmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7CiAgICAgICAgfQogICAgICAgIGlmICghKG5leHQuaXNJZGVudGlmaWVyIHx8IG9wdGlvbmFsKCd0aGlzJywgbmV4dCkpKSB7CiAgICAgICAgICBicmVhazsgLy8gYEZ1bmN0aW9uYCB1c2VkIGFzIHRoZSBuYW1lIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgICAgICAgfQogICAgICB9CiAgICAgIGFzc2VydChvcHRpb25hbCgnKScsIHRva2VuKSk7CiAgICAgIGdmdEhhc1JldHVyblR5cGUgPz89IHR5cGVWYXJpYWJsZVN0YXJ0ICE9IHN0YXJ0OwogICAgICB0eXBlVmFyaWFibGVTdGFydGVycyA9IHR5cGVWYXJpYWJsZVN0YXJ0ZXJzLnByZXBlbmQodHlwZVZhcmlhYmxlU3RhcnQpOwoKICAgICAgYmVmb3JlUXVlc3Rpb25NYXJrID0gbnVsbDsKICAgICAgZW5kID0gdG9rZW47CiAgICAgIHRva2VuID0gdG9rZW4ubmV4dDsKCiAgICAgIGlmIChvcHRpb25hbCgnPycsIHRva2VuKSkgewogICAgICAgIGJlZm9yZVF1ZXN0aW9uTWFyayA9IGVuZDsKICAgICAgICBlbmQgPSB0b2tlbjsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0KICB9Cn0KCi8vLyBTZWUgW25vVHlwZVBhcmFtT3JBcmddLgpjbGFzcyBOb1R5cGVQYXJhbU9yQXJnIGV4dGVuZHMgVHlwZVBhcmFtT3JBcmdJbmZvIHsKICBjb25zdCBOb1R5cGVQYXJhbU9yQXJnKCk7CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZUFyZ3VtZW50Q291bnQgPT4gMDsKCiAgQG92ZXJyaWRlCiAgVG9rZW4gcGFyc2VBcmd1bWVudHMoVG9rZW4gdG9rZW4sIFBhcnNlciBwYXJzZXIpIHsKICAgIHBhcnNlci5saXN0ZW5lci5oYW5kbGVOb1R5cGVBcmd1bWVudHModG9rZW4ubmV4dCk7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZVZhcmlhYmxlcyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgcGFyc2VyLmxpc3RlbmVyLmhhbmRsZU5vVHlwZVZhcmlhYmxlcyh0b2tlbi5uZXh0KTsKICAgIHJldHVybiB0b2tlbjsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXAoVG9rZW4gdG9rZW4pID0+IHRva2VuOwp9CgpjbGFzcyBTaW1wbGVUeXBlQXJndW1lbnQxIGV4dGVuZHMgVHlwZVBhcmFtT3JBcmdJbmZvIHsKICBjb25zdCBTaW1wbGVUeXBlQXJndW1lbnQxKCk7CgogIEBvdmVycmlkZQogIGJvb2wgZ2V0IGlzU2ltcGxlVHlwZUFyZ3VtZW50ID0+IHRydWU7CgogIEBvdmVycmlkZQogIGludCBnZXQgdHlwZUFyZ3VtZW50Q291bnQgPT4gMTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IHR5cGVJbmZvID0+IHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50OwoKICBAb3ZlcnJpZGUKICBUb2tlbiBwYXJzZUFyZ3VtZW50cyhUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gYmVnaW5Hcm91cCA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJzwnLCBiZWdpbkdyb3VwKSk7CiAgICBUb2tlbiBlbmRHcm91cCA9IHBhcnNlRW5kR3JvdXAoYmVnaW5Hcm91cCwgYmVnaW5Hcm91cC5uZXh0KTsKICAgIExpc3RlbmVyIGxpc3RlbmVyID0gcGFyc2VyLmxpc3RlbmVyOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlQXJndW1lbnRzKGJlZ2luR3JvdXApOwogICAgc2ltcGxlVHlwZS5wYXJzZVR5cGUoYmVnaW5Hcm91cCwgcGFyc2VyKTsKICAgIHBhcnNlci5saXN0ZW5lci5lbmRUeXBlQXJndW1lbnRzKDEsIGJlZ2luR3JvdXAsIGVuZEdyb3VwKTsKICAgIHJldHVybiBlbmRHcm91cDsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVmFyaWFibGVzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBUb2tlbiBiZWdpbkdyb3VwID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPCcsIGJlZ2luR3JvdXApKTsKICAgIHRva2VuID0gYmVnaW5Hcm91cC5uZXh0OwogICAgVG9rZW4gZW5kR3JvdXAgPSBwYXJzZUVuZEdyb3VwKGJlZ2luR3JvdXAsIHRva2VuKTsKICAgIExpc3RlbmVyIGxpc3RlbmVyID0gcGFyc2VyLmxpc3RlbmVyOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGVzKGJlZ2luR3JvdXApOwogICAgbGlzdGVuZXIuYmVnaW5NZXRhZGF0YVN0YXIodG9rZW4pOwogICAgbGlzdGVuZXIuZW5kTWV0YWRhdGFTdGFyKDApOwogICAgbGlzdGVuZXIuaGFuZGxlSWRlbnRpZmllcih0b2tlbiwgSWRlbnRpZmllckNvbnRleHQudHlwZVZhcmlhYmxlRGVjbGFyYXRpb24pOwogICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGUodG9rZW4pOwogICAgbGlzdGVuZXIuaGFuZGxlVHlwZVZhcmlhYmxlc0RlZmluZWQodG9rZW4sIDEpOwogICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlKHRva2VuKTsKICAgIGxpc3RlbmVyLmVuZFR5cGVWYXJpYWJsZShlbmRHcm91cCwgMCwgbnVsbCwgbnVsbCk7CiAgICBsaXN0ZW5lci5lbmRUeXBlVmFyaWFibGVzKGJlZ2luR3JvdXAsIGVuZEdyb3VwKTsKICAgIHJldHVybiBlbmRHcm91cDsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHNraXAoVG9rZW4gdG9rZW4pIHsKICAgIHRva2VuID0gdG9rZW4ubmV4dDsKICAgIGFzc2VydChvcHRpb25hbCgnPCcsIHRva2VuKSk7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQodG9rZW4uaXNLZXl3b3JkT3JJZGVudGlmaWVyKTsKICAgIHJldHVybiBza2lwRW5kR3JvdXAodG9rZW4pOwogIH0KCiAgVG9rZW4gc2tpcEVuZEdyb3VwKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz4nLCB0b2tlbikpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgVG9rZW4gcGFyc2VFbmRHcm91cChUb2tlbiBiZWdpbkdyb3VwLCBUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc+JywgdG9rZW4pKTsKICAgIHJldHVybiB0b2tlbjsKICB9Cn0KCmNsYXNzIFNpbXBsZVR5cGVBcmd1bWVudDFHdEVxIGV4dGVuZHMgU2ltcGxlVHlwZUFyZ3VtZW50MSB7CiAgY29uc3QgU2ltcGxlVHlwZUFyZ3VtZW50MUd0RXEoKTsKCiAgQG92ZXJyaWRlCiAgVHlwZUluZm8gZ2V0IHR5cGVJbmZvID0+IHNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50R3RFcTsKCiAgVG9rZW4gc2tpcEVuZEdyb3VwKFRva2VuIHRva2VuKSB7CiAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICBhc3NlcnQob3B0aW9uYWwoJz49JywgdG9rZW4pKTsKICAgIHJldHVybiBzcGxpdEd0RXEodG9rZW4pOwogIH0KCiAgVG9rZW4gcGFyc2VFbmRHcm91cChUb2tlbiBiZWdpbkdyb3VwLCBUb2tlbiBiZWZvcmVFbmRHcm91cCkgewogICAgVG9rZW4gZW5kR3JvdXAgPSBiZWZvcmVFbmRHcm91cC5uZXh0OwogICAgaWYgKCFvcHRpb25hbCgnPicsIGVuZEdyb3VwKSkgewogICAgICBlbmRHcm91cCA9IHNwbGl0R3RFcShlbmRHcm91cCk7CiAgICAgIGVuZEdyb3VwLm5leHQuc2V0TmV4dChlbmRHcm91cC5uZXh0Lm5leHQpOwogICAgfQogICAgYmVmb3JlRW5kR3JvdXAuc2V0TmV4dChlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQp9CgpjbGFzcyBTaW1wbGVUeXBlQXJndW1lbnQxR3RHdCBleHRlbmRzIFNpbXBsZVR5cGVBcmd1bWVudDEgewogIGNvbnN0IFNpbXBsZVR5cGVBcmd1bWVudDFHdEd0KCk7CgogIEBvdmVycmlkZQogIFR5cGVJbmZvIGdldCB0eXBlSW5mbyA9PiBzaW1wbGVUeXBlV2l0aDFBcmd1bWVudEd0R3Q7CgogIFRva2VuIHNraXBFbmRHcm91cChUb2tlbiB0b2tlbikgewogICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgYXNzZXJ0KG9wdGlvbmFsKCc+PicsIHRva2VuKSk7CiAgICByZXR1cm4gc3BsaXRHdEd0KHRva2VuKTsKICB9CgogIFRva2VuIHBhcnNlRW5kR3JvdXAoVG9rZW4gYmVnaW5Hcm91cCwgVG9rZW4gYmVmb3JlRW5kR3JvdXApIHsKICAgIFRva2VuIGVuZEdyb3VwID0gYmVmb3JlRW5kR3JvdXAubmV4dDsKICAgIGlmICghb3B0aW9uYWwoJz4nLCBlbmRHcm91cCkpIHsKICAgICAgZW5kR3JvdXAgPSBzcGxpdEd0R3QoZW5kR3JvdXApOwogICAgICBlbmRHcm91cC5uZXh0LnNldE5leHQoZW5kR3JvdXAubmV4dC5uZXh0KTsKICAgIH0KICAgIGJlZm9yZUVuZEdyb3VwLnNldE5leHQoZW5kR3JvdXApOwogICAgcmV0dXJuIGVuZEdyb3VwOwogIH0KfQoKY2xhc3MgQ29tcGxleFR5cGVQYXJhbU9yQXJnSW5mbyBleHRlbmRzIFR5cGVQYXJhbU9yQXJnSW5mbyB7CiAgLy8vIFRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgdHlwZSB2YXIuCiAgZmluYWwgVG9rZW4gc3RhcnQ7CgogIC8vLyBJZiBbaW5EZWNsYXJhdGlvbl0gaXMgYHRydWVgLCB0aGVuIHRoaXMgd2lsbCBtb3JlIGFnZ3Jlc3NpdmVseSByZWNvdmVyCiAgLy8vIGdpdmVuIHVuYmFsYW5jZWQgYDxgIGA+YCBhbmQgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4KICBmaW5hbCBib29sIGluRGVjbGFyYXRpb247CgogIC8vIE9ubHkgc3VwcG9ydCB2YXJpYW5jZSBwYXJzaW5nIGlmIGl0IG1ha2VzIHNlbnNlLgogIC8vIEFsbG93cyBwYXJzaW5nIG9mIHZhcmlhbmNlIGZvciBjZXJ0YWluIHN0cnVjdHVyZXMuCiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzUyNAogIGZpbmFsIGJvb2wgYWxsb3dzVmFyaWFuY2U7CgogIEBvdmVycmlkZQogIGludCB0eXBlQXJndW1lbnRDb3VudDsKCiAgLy8vIFRoZSBgPmAgdG9rZW4gd2hpY2ggZW5kcyB0aGUgdHlwZSBwYXJhbWV0ZXIgb3IgYXJndW1lbnQuCiAgLy8vIFRoaXMgY2xvc2VyIG1heSBiZSBzeW50aGV0aWMsIHBvaW50cyB0byB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtLAogIC8vLyBpcyBvbmx5IHVzZWQgd2hlbiBza2lwcGluZyBvdmVyIHRoZSB0eXBlIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLAogIC8vLyBhbmQgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSB0b2tlbiBzdHJlYW0uCiAgVG9rZW4gc2tpcEVuZDsKCiAgQ29tcGxleFR5cGVQYXJhbU9yQXJnSW5mbygKICAgICAgVG9rZW4gdG9rZW4sIHRoaXMuaW5EZWNsYXJhdGlvbiwgdGhpcy5hbGxvd3NWYXJpYW5jZSkKICAgICAgOiBhc3NlcnQob3B0aW9uYWwoJzwnLCB0b2tlbi5uZXh0KSksCiAgICAgICAgYXNzZXJ0KGluRGVjbGFyYXRpb24gIT0gbnVsbCksCiAgICAgICAgYXNzZXJ0KGFsbG93c1ZhcmlhbmNlICE9IG51bGwpLAogICAgICAgIHN0YXJ0ID0gdG9rZW4ubmV4dDsKCiAgLy8vIFBhcnNlIHRoZSB0b2tlbnMgYW5kIHJldHVybiB0aGUgcmVjZWl2ZXIgb3IgW25vVHlwZVBhcmFtT3JBcmddIGlmIHRoZXJlCiAgLy8vIGFyZSBubyB0eXBlIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgdG9rZW4KICAvLy8gc3RyZWFtLgogIFR5cGVQYXJhbU9yQXJnSW5mbyBjb21wdXRlKCkgewogICAgVG9rZW4gdG9rZW47CiAgICBUb2tlbiBuZXh0ID0gc3RhcnQ7CiAgICB0eXBlQXJndW1lbnRDb3VudCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKG5leHQsIHRydWUsIGluRGVjbGFyYXRpb24pOwogICAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlKSB7CiAgICAgICAgd2hpbGUgKHR5cGVJbmZvID09IG5vVHlwZSAmJiBvcHRpb25hbCgnQCcsIG5leHQubmV4dCkpIHsKICAgICAgICAgIG5leHQgPSBza2lwTWV0YWRhdGEobmV4dCk7CiAgICAgICAgICB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKG5leHQsIHRydWUsIGluRGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlKSB7CiAgICAgICAgICBpZiAobmV4dCA9PSBzdGFydCAmJiAhaW5EZWNsYXJhdGlvbiAmJiAhaXNDbG9zZXIobmV4dC5uZXh0KSkgewogICAgICAgICAgICByZXR1cm4gbm9UeXBlUGFyYW1PckFyZzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghb3B0aW9uYWwoJywnLCBuZXh0Lm5leHQpKSB7CiAgICAgICAgICAgIHRva2VuID0gbmV4dDsKICAgICAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhc3NlcnQodHlwZUluZm8gIT0gbm9UeXBlIHx8IG9wdGlvbmFsKCcsJywgbmV4dC5uZXh0KSk7CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHByb2Nlc3MgdHlwZSAoaWYgYW55KSBhbmQgY29uc3VtZSBgLGAKICAgICAgfQogICAgICArK3R5cGVBcmd1bWVudENvdW50OwogICAgICB0b2tlbiA9IHR5cGVJbmZvLnNraXBUeXBlKG5leHQpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgaWYgKG9wdGlvbmFsKCdleHRlbmRzJywgbmV4dCkpIHsKICAgICAgICB0b2tlbiA9IGNvbXB1dGVUeXBlKG5leHQsIHRydWUsIGluRGVjbGFyYXRpb24pLnNraXBUeXBlKG5leHQpOwogICAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICB9CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCBuZXh0KSkgewogICAgICAgIHNraXBFbmQgPSBzcGxpdENsb3NlcihuZXh0KTsKICAgICAgICBpZiAoc2tpcEVuZCAhPSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgaWYgKCFpbkRlY2xhcmF0aW9uKSB7CiAgICAgICAgICByZXR1cm4gbm9UeXBlUGFyYW1PckFyZzsKICAgICAgICB9CgogICAgICAgIC8vIFJlY292ZXJ5CiAgICAgICAgaWYgKCFsb29rc0xpa2VUeXBlUGFyYW1PckFyZyhpbkRlY2xhcmF0aW9uLCBuZXh0KSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vIExvb2tzIGxpa2UgbWlzc2luZyBjb21tYS4gQ29udGludWUgbG9vcGluZy4KICAgICAgICBuZXh0ID0gdG9rZW47CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZWNvdmVyeQogICAgc2tpcEVuZCA9IHNwbGl0Q2xvc2VyKG5leHQpOwogICAgaWYgKHNraXBFbmQgPT0gbnVsbCkgewogICAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSkgewogICAgICAgIHRva2VuID0gbmV4dC5lbmRHcm91cDsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgfQogICAgICBza2lwRW5kID0gc3BsaXRDbG9zZXIobmV4dCk7CiAgICAgIGlmIChza2lwRW5kID09IG51bGwpIHsKICAgICAgICBza2lwRW5kID0gc3BsaXRDbG9zZXIobmV4dC5uZXh0KTsKICAgICAgfQogICAgICBpZiAoc2tpcEVuZCA9PSBudWxsKSB7CiAgICAgICAgc2tpcEVuZCA9IHN5bnRoZXRpY0d0KG5leHQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlQXJndW1lbnRzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLm5leHQsIHN0YXJ0KSk7CiAgICBUb2tlbiBuZXh0ID0gc3RhcnQ7CiAgICBwYXJzZXIubGlzdGVuZXIuYmVnaW5UeXBlQXJndW1lbnRzKHN0YXJ0KTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IGNvbXB1dGVUeXBlKG5leHQsIHRydWUsIGluRGVjbGFyYXRpb24pOwogICAgICBpZiAodHlwZUluZm8gPT0gbm9UeXBlKSB7CiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICB3aGlsZSAodHlwZUluZm8gPT0gbm9UeXBlICYmIG9wdGlvbmFsKCdAJywgbmV4dC5uZXh0KSkgewogICAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW4oCiAgICAgICAgICAgICAgbmV4dC5uZXh0LCBjb2Rlcy50ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlbik7CiAgICAgICAgICBuZXh0ID0gc2tpcE1ldGFkYXRhKG5leHQpOwogICAgICAgICAgdHlwZUluZm8gPSBjb21wdXRlVHlwZShuZXh0LCB0cnVlLCBpbkRlY2xhcmF0aW9uKTsKICAgICAgICB9CiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHByb2Nlc3MgdHlwZSAoaWYgYW55KSBhbmQgY29uc3VtZSBgLGAKICAgICAgfQogICAgICB0b2tlbiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVPclZvaWQobmV4dCwgcGFyc2VyKTsKICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICsrY291bnQ7CiAgICAgIGlmICghb3B0aW9uYWwoJywnLCBuZXh0KSkgewogICAgICAgIGlmIChwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVjb3ZlcnkKICAgICAgICBpZiAoIWxvb2tzTGlrZVR5cGVQYXJhbU9yQXJnKGluRGVjbGFyYXRpb24sIG5leHQpKSB7CiAgICAgICAgICB0b2tlbiA9IHBhcnNlVW5leHBlY3RlZEVuZCh0b2tlbiwgdHJ1ZSwgcGFyc2VyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBNaXNzaW5nIGNvbW1hLiBSZXBvcnQgZXJyb3IsIGluc2VydCBjb21tYSwgYW5kIGNvbnRpbnVlIGxvb3BpbmcuCiAgICAgICAgbmV4dCA9IHBhcnNlTWlzc2luZ0NvbW1hKHRva2VuLCBwYXJzZXIpOwogICAgICB9CiAgICB9CiAgICBUb2tlbiBlbmRHcm91cCA9IHRva2VuLm5leHQ7CiAgICBwYXJzZXIubGlzdGVuZXIuZW5kVHlwZUFyZ3VtZW50cyhjb3VudCwgc3RhcnQsIGVuZEdyb3VwKTsKICAgIHJldHVybiBlbmRHcm91cDsKICB9CgogIEBvdmVycmlkZQogIFRva2VuIHBhcnNlVmFyaWFibGVzKFRva2VuIHRva2VuLCBQYXJzZXIgcGFyc2VyKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHRva2VuLm5leHQsIHN0YXJ0KSk7CiAgICBUb2tlbiBuZXh0ID0gc3RhcnQ7CiAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgIGxpc3RlbmVyLmJlZ2luVHlwZVZhcmlhYmxlcyhzdGFydCk7CiAgICBpbnQgY291bnQgPSAwOwoKICAgIExpbms8VG9rZW4+IHR5cGVTdGFydHMgPSBjb25zdCBMaW5rPFRva2VuPigpOwogICAgTGluazxUeXBlSW5mbz4gc3VwZXJUeXBlSW5mb3MgPSBjb25zdCBMaW5rPFR5cGVJbmZvPigpOwogICAgTGluazxUb2tlbj4gdmFyaWFuY2VzID0gY29uc3QgTGluazxUb2tlbj4oKTsKCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICB0b2tlbiA9IHBhcnNlci5wYXJzZU1ldGFkYXRhU3RhcihuZXh0KTsKCiAgICAgIFRva2VuIHZhcmlhbmNlID0gbmV4dC5uZXh0OwogICAgICBUb2tlbiBpZGVudGlmaWVyID0gdmFyaWFuY2UubmV4dDsKICAgICAgaWYgKGFsbG93c1ZhcmlhbmNlICYmCiAgICAgICAgICBpc1ZhcmlhbmNlKHZhcmlhbmNlKSAmJgogICAgICAgICAgaWRlbnRpZmllciAhPSBudWxsICYmCiAgICAgICAgICBpZGVudGlmaWVyLmlzS2V5d29yZE9ySWRlbnRpZmllcikgewogICAgICAgIHZhcmlhbmNlcyA9IHZhcmlhbmNlcy5wcmVwZW5kKHZhcmlhbmNlKTsKCiAgICAgICAgLy8gUmVjb3ZlcnkgZm9yIG11bHRpcGxlIHZhcmlhbmNlIG1vZGlmaWVycwogICAgICAgIHdoaWxlIChpc1ZhcmlhbmNlKGlkZW50aWZpZXIpICYmCiAgICAgICAgICAgIGlkZW50aWZpZXIubmV4dCAhPSBudWxsICYmCiAgICAgICAgICAgIGlkZW50aWZpZXIubmV4dC5pc0tleXdvcmRPcklkZW50aWZpZXIpIHsKICAgICAgICAgIC8vIFJlcG9ydCBhbiBlcnJvciBhbmQgc2tpcCBhY3R1YWwgaWRlbnRpZmllcgogICAgICAgICAgcGFyc2VyLnJlcG9ydFJlY292ZXJhYmxlRXJyb3IoCiAgICAgICAgICAgICAgaWRlbnRpZmllciwgY29kZXMubWVzc2FnZU11bHRpcGxlVmFyaWFuY2VNb2RpZmllcnMpOwogICAgICAgICAgdmFyaWFuY2UgPSB2YXJpYW5jZS5uZXh0OwogICAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIubmV4dDsKICAgICAgICB9CgogICAgICAgIHRva2VuID0gdmFyaWFuY2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyaWFuY2VzID0gdmFyaWFuY2VzLnByZXBlbmQobnVsbCk7CiAgICAgIH0KCiAgICAgIG5leHQgPSBwYXJzZXIuZW5zdXJlSWRlbnRpZmllcigKICAgICAgICAgIHRva2VuLCBJZGVudGlmaWVyQ29udGV4dC50eXBlVmFyaWFibGVEZWNsYXJhdGlvbik7CiAgICAgIHRva2VuID0gbmV4dDsKICAgICAgbGlzdGVuZXIuYmVnaW5UeXBlVmFyaWFibGUodG9rZW4pOwogICAgICB0eXBlU3RhcnRzID0gdHlwZVN0YXJ0cy5wcmVwZW5kKHRva2VuKTsKCiAgICAgIG5leHQgPSB0b2tlbi5uZXh0OwogICAgICBpZiAob3B0aW9uYWwoJ2V4dGVuZHMnLCBuZXh0KSkgewogICAgICAgIFR5cGVJbmZvIHR5cGVJbmZvID0gY29tcHV0ZVR5cGUobmV4dCwgdHJ1ZSwgaW5EZWNsYXJhdGlvbik7CiAgICAgICAgdG9rZW4gPSB0eXBlSW5mby5za2lwVHlwZShuZXh0KTsKICAgICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgICBzdXBlclR5cGVJbmZvcyA9IHN1cGVyVHlwZUluZm9zLnByZXBlbmQodHlwZUluZm8pOwogICAgICB9IGVsc2UgewogICAgICAgIHN1cGVyVHlwZUluZm9zID0gc3VwZXJUeXBlSW5mb3MucHJlcGVuZChudWxsKTsKICAgICAgfQoKICAgICAgKytjb3VudDsKICAgICAgaWYgKCFvcHRpb25hbCgnLCcsIG5leHQpKSB7CiAgICAgICAgaWYgKGlzQ2xvc2VyKHRva2VuKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWNvdmVyeQogICAgICAgIGlmICghbG9va3NMaWtlVHlwZVBhcmFtT3JBcmcoaW5EZWNsYXJhdGlvbiwgbmV4dCkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBNaXNzaW5nIGNvbW1hLiBSZXBvcnQgZXJyb3IsIGluc2VydCBjb21tYSwgYW5kIGNvbnRpbnVlIGxvb3BpbmcuCiAgICAgICAgbmV4dCA9IHBhcnNlTWlzc2luZ0NvbW1hKHRva2VuLCBwYXJzZXIpOwogICAgICB9CiAgICB9CgogICAgYXNzZXJ0KGNvdW50ID4gMCk7CiAgICBhc3NlcnQodHlwZVN0YXJ0cy5zbG93TGVuZ3RoKCkgPT0gY291bnQpOwogICAgYXNzZXJ0KHN1cGVyVHlwZUluZm9zLnNsb3dMZW5ndGgoKSA9PSBjb3VudCk7CiAgICBhc3NlcnQodmFyaWFuY2VzLnNsb3dMZW5ndGgoKSA9PSBjb3VudCk7CiAgICBsaXN0ZW5lci5oYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZCh0b2tlbiwgY291bnQpOwoKICAgIHRva2VuID0gbnVsbDsKICAgIHdoaWxlICh0eXBlU3RhcnRzLmlzTm90RW1wdHkpIHsKICAgICAgVG9rZW4gdG9rZW4yID0gdHlwZVN0YXJ0cy5oZWFkOwogICAgICBUeXBlSW5mbyB0eXBlSW5mbyA9IHN1cGVyVHlwZUluZm9zLmhlYWQ7CiAgICAgIFRva2VuIHZhcmlhbmNlID0gdmFyaWFuY2VzLmhlYWQ7CgogICAgICBUb2tlbiBleHRlbmRzT3JTdXBlciA9IG51bGw7CiAgICAgIFRva2VuIG5leHQyID0gdG9rZW4yLm5leHQ7CiAgICAgIGlmICh0eXBlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKCdleHRlbmRzJywgbmV4dDIpKTsKICAgICAgICBleHRlbmRzT3JTdXBlciA9IG5leHQyOwogICAgICAgIHRva2VuMiA9IHR5cGVJbmZvLmVuc3VyZVR5cGVOb3RWb2lkKG5leHQyLCBwYXJzZXIpOwogICAgICAgIG5leHQyID0gdG9rZW4yLm5leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KCFvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQyKSk7CiAgICAgICAgbGlzdGVuZXIuaGFuZGxlTm9UeXBlKHRva2VuMik7CiAgICAgIH0KICAgICAgLy8gVHlwZSB2YXJpYWJsZXMgYXJlICJjb21wbGV0ZWQiIGluIHJldmVyc2Ugb3JkZXIsIHNvIGNhcHR1cmUgdGhlIGxhc3QKICAgICAgLy8gY29uc3VtZWQgdG9rZW4gZnJvbSB0aGUgZmlyc3QgImNvbXBsZXRlZCIgdHlwZSB2YXJpYWJsZS4KICAgICAgdG9rZW4gPz89IHRva2VuMjsKICAgICAgbGlzdGVuZXIuZW5kVHlwZVZhcmlhYmxlKG5leHQyLCAtLWNvdW50LCBleHRlbmRzT3JTdXBlciwgdmFyaWFuY2UpOwoKICAgICAgdHlwZVN0YXJ0cyA9IHR5cGVTdGFydHMudGFpbDsKICAgICAgc3VwZXJUeXBlSW5mb3MgPSBzdXBlclR5cGVJbmZvcy50YWlsOwogICAgICB2YXJpYW5jZXMgPSB2YXJpYW5jZXMudGFpbDsKICAgIH0KCiAgICBpZiAoIXBhcnNlQ2xvc2VyKHRva2VuKSkgewogICAgICB0b2tlbiA9IHBhcnNlVW5leHBlY3RlZEVuZCh0b2tlbiwgZmFsc2UsIHBhcnNlcik7CiAgICB9CiAgICBUb2tlbiBlbmRHcm91cCA9IHRva2VuLm5leHQ7CiAgICBsaXN0ZW5lci5lbmRUeXBlVmFyaWFibGVzKHN0YXJ0LCBlbmRHcm91cCk7CiAgICByZXR1cm4gZW5kR3JvdXA7CiAgfQoKICBUb2tlbiBwYXJzZU1pc3NpbmdDb21tYShUb2tlbiB0b2tlbiwgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICBuZXh0LCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQnV0R290LndpdGhBcmd1bWVudHMoJywnKSk7CiAgICByZXR1cm4gcGFyc2VyLnJld3JpdGVyLmluc2VydFRva2VuKAogICAgICAgIHRva2VuLCBuZXcgU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLkNPTU1BLCBuZXh0LmNoYXJPZmZzZXQpKTsKICB9CgogIFRva2VuIHBhcnNlVW5leHBlY3RlZEVuZChUb2tlbiB0b2tlbiwgYm9vbCBpc0FyZ3VtZW50cywgUGFyc2VyIHBhcnNlcikgewogICAgVG9rZW4gbmV4dCA9IHRva2VuLm5leHQ7CiAgICBib29sIGVycm9yUmVwb3J0ZWQgPSB0b2tlbi5pc1N5bnRoZXRpYyB8fCAobmV4dC5pc1N5bnRoZXRpYyAmJiAhbmV4dC5pc0VvZik7CgogICAgYm9vbCB0eXBlRm9sbG93c0V4dGVuZHMgPSBmYWxzZTsKICAgIGlmIChvcHRpb25hbCgnZXh0ZW5kcycsIG5leHQpKSB7CiAgICAgIGlmICghZXJyb3JSZXBvcnRlZCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgZXJyb3JSZXBvcnRlZCA9IHRydWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0OwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgdHlwZUZvbGxvd3NFeHRlbmRzID0gaXNWYWxpZFR5cGVSZWZlcmVuY2UobmV4dCk7CgogICAgICBpZiAocGFyc2VDbG9zZXIodG9rZW4pKSB7CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9CiAgICB9CgogICAgaWYgKHR5cGVGb2xsb3dzRXh0ZW5kcyB8fAogICAgICAgIG9wdGlvbmFsKCdkeW5hbWljJywgbmV4dCkgfHwKICAgICAgICBvcHRpb25hbCgndm9pZCcsIG5leHQpIHx8CiAgICAgICAgb3B0aW9uYWwoJ0Z1bmN0aW9uJywgbmV4dCkpIHsKICAgICAgVHlwZUluZm8gaW52YWxpZFR5cGUgPSBjb21wdXRlVHlwZSh0b2tlbiwgdHJ1ZSk7CiAgICAgIGlmIChpbnZhbGlkVHlwZSAhPSBub1R5cGUpIHsKICAgICAgICBpZiAoIWVycm9yUmVwb3J0ZWQpIHsKICAgICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnPicpKTsKICAgICAgICAgIGVycm9yUmVwb3J0ZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gUGFyc2UgdGhlIHR5cGUgc28gdGhhdCB0aGUgdG9rZW4gc3RyZWFtIGlzIHByb3Blcmx5IG1vZGlmaWVkLAogICAgICAgIC8vIGJ1dCBlbnN1cmUgdGhhdCBwYXJzZXIgZXZlbnRzIGFyZSBpZ25vcmVkIGJ5IHJlcGxhY2luZyB0aGUgbGlzdGVuZXIuCiAgICAgICAgZmluYWwgTGlzdGVuZXIgb3JpZ2luYWxMaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgICAgICBwYXJzZXIubGlzdGVuZXIgPSBuZXcgRm9yd2FyZGluZ0xpc3RlbmVyKCk7CiAgICAgICAgdG9rZW4gPSBpbnZhbGlkVHlwZS5wYXJzZVR5cGUodG9rZW4sIHBhcnNlcik7CiAgICAgICAgbmV4dCA9IHRva2VuLm5leHQ7CiAgICAgICAgcGFyc2VyLmxpc3RlbmVyID0gb3JpZ2luYWxMaXN0ZW5lcjsKCiAgICAgICAgaWYgKHBhcnNlQ2xvc2VyKHRva2VuKSkgewogICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIFR5cGVQYXJhbU9yQXJnSW5mbyBpbnZhbGlkVHlwZVZhciA9CiAgICAgICAgY29tcHV0ZVR5cGVQYXJhbU9yQXJnKHRva2VuLCBpbkRlY2xhcmF0aW9uKTsKICAgIGlmIChpbnZhbGlkVHlwZVZhciAhPSBub1R5cGVQYXJhbU9yQXJnKSB7CiAgICAgIGlmICghZXJyb3JSZXBvcnRlZCkgewogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgZXJyb3JSZXBvcnRlZCA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8vIFBhcnNlIHRoZSB0eXBlIHNvIHRoYXQgdGhlIHRva2VuIHN0cmVhbSBpcyBwcm9wZXJseSBtb2RpZmllZCwKICAgICAgLy8gYnV0IGVuc3VyZSB0aGF0IHBhcnNlciBldmVudHMgYXJlIGlnbm9yZWQgYnkgcmVwbGFjaW5nIHRoZSBsaXN0ZW5lci4KICAgICAgZmluYWwgTGlzdGVuZXIgb3JpZ2luYWxMaXN0ZW5lciA9IHBhcnNlci5saXN0ZW5lcjsKICAgICAgcGFyc2VyLmxpc3RlbmVyID0gbmV3IEZvcndhcmRpbmdMaXN0ZW5lcigpOwogICAgICB0b2tlbiA9IGlzQXJndW1lbnRzCiAgICAgICAgICA/IGludmFsaWRUeXBlVmFyLnBhcnNlQXJndW1lbnRzKHRva2VuLCBwYXJzZXIpCiAgICAgICAgICA6IGludmFsaWRUeXBlVmFyLnBhcnNlVmFyaWFibGVzKHRva2VuLCBwYXJzZXIpOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKICAgICAgcGFyc2VyLmxpc3RlbmVyID0gb3JpZ2luYWxMaXN0ZW5lcjsKCiAgICAgIGlmIChwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgIH0KCiAgICBpZiAob3B0aW9uYWwoJygnLCBuZXh0KSAmJiBuZXh0LmVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgaWYgKCFlcnJvclJlcG9ydGVkKSB7CiAgICAgICAgLy8gT25seSByZXBvcnQgYW4gZXJyb3IgaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogICAgICAgIHBhcnNlci5yZXBvcnRSZWNvdmVyYWJsZUVycm9yKAogICAgICAgICAgICB0b2tlbiwgY29kZXMudGVtcGxhdGVFeHBlY3RlZEFmdGVyQnV0R290LndpdGhBcmd1bWVudHMoJz4nKSk7CiAgICAgICAgZXJyb3JSZXBvcnRlZCA9IHRydWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSBuZXh0LmVuZEdyb3VwOwogICAgICBuZXh0ID0gdG9rZW4ubmV4dDsKCiAgICAgIGlmIChwYXJzZUNsb3Nlcih0b2tlbikpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWVycm9yUmVwb3J0ZWQpIHsKICAgICAgLy8gT25seSByZXBvcnQgYW4gZXJyb3IgaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogICAgICBwYXJzZXIucmVwb3J0UmVjb3ZlcmFibGVFcnJvcigKICAgICAgICAgIHRva2VuLCBjb2Rlcy50ZW1wbGF0ZUV4cGVjdGVkQWZ0ZXJCdXRHb3Qud2l0aEFyZ3VtZW50cygnPicpKTsKICAgIH0KICAgIGlmIChwYXJzZUNsb3NlcihuZXh0KSkgewogICAgICByZXR1cm4gbmV4dDsKICAgIH0KICAgIFRva2VuIGVuZEdyb3VwID0gc3RhcnQuZW5kR3JvdXA7CiAgICBpZiAoZW5kR3JvdXAgIT0gbnVsbCkgewogICAgICB3aGlsZSAodG9rZW4ubmV4dCAhPSBlbmRHcm91cCAmJiAhdG9rZW4uaXNFb2YpIHsKICAgICAgICB0b2tlbiA9IHRva2VuLm5leHQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVuZEdyb3VwID0gc3ludGhldGljR3QobmV4dCk7CiAgICAgIGVuZEdyb3VwLnNldE5leHQobmV4dCk7CiAgICAgIHRva2VuLnNldE5leHQoZW5kR3JvdXApOwogICAgfQogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgQG92ZXJyaWRlCiAgVG9rZW4gc2tpcChUb2tlbiB0b2tlbikgewogICAgYXNzZXJ0KHNraXBFbmQgIT0gbnVsbCk7CiAgICByZXR1cm4gc2tpcEVuZDsKICB9Cn0KCi8vIFJldHVybiBgdHJ1ZWAgaWYgW3Rva2VuXSBpcyBvbmUgb2YgYGluYCwgYGlub3V0YCwgb3IgYG91dGAKYm9vbCBpc1ZhcmlhbmNlKFRva2VuIHRva2VuKSB7CiAgcmV0dXJuIG9wdGlvbmFsKCdpbicsIHRva2VuKSB8fAogICAgICBvcHRpb25hbCgnaW5vdXQnLCB0b2tlbikgfHwKICAgICAgb3B0aW9uYWwoJ291dCcsIHRva2VuKTsKfQoKLy8vIFJldHVybiBgdHJ1ZWAgaWYgW3Rva2VuXSBpcyBvbmUgb2YgYD5gLCBgPj5gLCBgPj4+YCwgYD49YCwgYD4+PWAsIG9yIGA+Pj49YC4KYm9vbCBpc0Nsb3NlcihUb2tlbiB0b2tlbikgewogIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHRva2VuLnN0cmluZ1ZhbHVlOwogIHJldHVybiBpZGVudGljYWwodmFsdWUsICc+JykgfHwKICAgICAgaWRlbnRpY2FsKHZhbHVlLCAnPj4nKSB8fAogICAgICBpZGVudGljYWwodmFsdWUsICc+PScpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz4+PicpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz4+PScpIHx8CiAgICAgIGlkZW50aWNhbCh2YWx1ZSwgJz4+Pj0nKTsKfQoKLy8vIElmIFtiZWZvcmVDbG9zZXJdLm5leHQgaXMgb25lIG9mIGA+YCwgYD4+YCwgYD4+PmAsIGA+PWAsIGA+Pj1gLCBvciBgPj4+PWAKLy8vIHRoZW4gdXBkYXRlIHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJldHVybiBgdHJ1ZWAuCmJvb2wgcGFyc2VDbG9zZXIoVG9rZW4gYmVmb3JlQ2xvc2VyKSB7CiAgVG9rZW4gdW5zcGxpdCA9IGJlZm9yZUNsb3Nlci5uZXh0OwogIFRva2VuIHNwbGl0ID0gc3BsaXRDbG9zZXIodW5zcGxpdCk7CiAgaWYgKHNwbGl0ID09IHVuc3BsaXQpIHsKICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSBpZiAoc3BsaXQgPT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBzcGxpdC5uZXh0LnNldE5leHQodW5zcGxpdC5uZXh0KTsKICBiZWZvcmVDbG9zZXIuc2V0TmV4dChzcGxpdCk7CiAgcmV0dXJuIHRydWU7Cn0KCi8vLyBJZiBbY2xvc2VyXSBpcyBgPmAgdGhlbiByZXR1cm4gaXQuCi8vLyBJZiBbY2xvc2VyXSBpcyBvbmUgb2YgYD4+YCwgYD4+PmAsIGA+PWAsIGA+Pj1gLCAgb3IgYD4+Pj1gIHRoZW4gc3BsaXQKLy8vIHRoZSB0b2tlbiBhbmQgcmV0dXJuIHRo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zIfsi8yH/IvLhuaLy4boi8uG6ovLhumLy4bri8uG5YvLh3SLy4bti8uHf4vLhvGLy4eCi8uHhYvLhvCLy4eOi8uHgYvLh5GLy4eTi8uHlYvLh5eLy4eZi8uHm4vLh52Ly4efi8uHoYvLh6OLy4byi8uHpovLh6eLy4eoi8uHlIvLh5aLy4eYi8uHmovLh5yLy4eei8uHoIvLh6KLy4eki8uHqYvLh6qLy4eri8uHrYvLgWuLy4eui8uHrIvLgQ2Ly4e2i8uG84vLhvaLy4e6i8uHvYvLh7uLy4fPi8uH0ovLh4qLy4fWi8uHuYvLhuyLy4eMi8uH2ovLh92Ly4eLi8uG74vLhFOLy4fgi8uH4YvLh+aLy4Rti8uH4ovLh+mLy4Ryi8uH64vLh9+Ly4Sni8uE4YvLhQGLy4Tbi8uE6IvLhQuLy4UOi8uFEIvLhRKLy4UVi8uFGIvLhSeLy4VCi8uFRYvLhUeLy4VQi8uFUovLhWCLy4Vii8uFVIvLhVaLy4Vki8uFZovLhXSLy4V3i8uFWIvLhXmLy4V7i8uFa4vLhW2Ly4WDi8uFuovLh/SLy4WIi8uFjovLhZKLy4WXi8uFm4vLhaGLy4Wni8uFq4vLha+Ly4W3i8uFvYvLhb+Ly4eIi8uFwovLh4mLy4XEi8uFxovLhcmLy4XLi8uFzYvLhc+Ly4XRi8uF04vLhdWLy4XXi8uF2IvLhduLy4Xei8uF5IvLheaLy4WAi8uF6YvLheyLy4f7i8uF74vLhfKLy4X1i8uF94vLhfuLy4X9i8uF4YvLhf+Ly4YBi8uGA4vLhgeLy4YMi8uGD4vLhhSLy4YWi8uGGIvLhhqLy4Ydi8uGIovLhiWLy4Yri8uGNovLh/CLy4fqi8uH/4vLhjiLy4ZVi8uGU4vLhkyLy4ZPi8uGUYvLhliLy4Ssi8uGX4vLhmyLy4Zyi8uGaIvLhpGLy4Svi8uIAovLiASLy4gGi8uICIvLiAqLy4gMi8uIDovLiBCLy4gSi8uIFIvLhwWLy4abi8uGnIvLhKmLy4Tii8uGoYvLhqKLy4Tci8uGuovLhruLy4aei8uGn4vLhGOLy4Rmi8uGtIvLhrWLy4a3i8uGuIvLhq2Ly4aui8uGPIvLhpiLy4aZi8uFAovLhtmLy4Tpi8uGpYvLhqaLy4api8uGqovLhsGLy4bCi8uGyIvLhsmLy4bLi8uGzIvLhmmLy4bOi8uGz4umlHWMuQCLo4g9jLuUZYy8gyiMvIg+jLyIP4y7lHSMwIgAjMCHyIzAh8mMwIfujMApjLuUdYzGAIujiEGMyJRljMmDKIzJiD+MyJR0jMyHx4zMh8qMzCmMyJR1jNAAi6OIQozSlGWM04MojNOIP4zSlHSM1ofHjNaHyozWKYzSlHWM2gCLo4hEjNyUZYzdh06M3YOdjN2IRYzdiEaM3cAATXaM4ohHjNyUdIzkh36M5IgIjOQpjNyUdYzoAIujiEqM6pRljOuDKIzriD+M6pR0jO6Hx4zuh8qM7imM6pR1jPIAi6OITYz0lGWM9YMojPSUdIz3h36M9ymM9JR1jPoAi6OIToz8lGWM/YMojPyUdIz/h36M/JR1jQEAi6OIT40DlGWNBIhQjQSIUY0EiFKNBMAATXaNCIdajQiIU40IiFWNCIhWjQSA4I0EiFSNA5RxjQ+ECo0DlHSNEYf6jRGHbo0Rh3GNEYdyjRGHb40RiF6NEYdtjQOUdY0ZAIujiGCNG5RljRyG3I0ch8aNG5R1jR8Ai6OIYY0hlGWNIoeDjSGUdI0kNo0kSY0hlHWNJwCLo4hijSmUdI0qiGONKZR1jSwAAMAATXeNLniNL5RljTCIZo0wiGeNL5R0jTOBa40zh66NM4e6jTOG8o0zh72NL5R1jTkAAMAATXiNO3mNPJRljT2Iao09gyiNPcAATXiNQIiAjUCIgY1AiIKNQIiDjUCIhI1AiIWNQIiGjUCIh41AiIiNQIiJjUCIio1AiIuNQIiMjUCIjY1AiI6NQIiPjUCIkI1AiJGNQIiSjUCIk41AiJSNQIiVjUCIlo1AiJeNQIiYjUCImY1AiJqNQIibjUCInI1AiJ2NQIiejUCIn41AiKCNQIihjUCIoo1AiKONQIikjUCIpY1AiKaNQIinjUCIqI1AiKmNQIiqjUCIq41AiKyNQIitjUCIro1AiK+NQIiwjUCIsY1AiLKNQIizjUCItI1AiLWNQIi2jUCIt41AiLiNQIi5jUCIuo1AiLuNQIi8jUCIvY1AiL6NQIi/jUCIwI1AiMGNQIjCjUCIw41AiMSNQIjFjUCIxo1AiMeNQIjIjUCIyY1AiMqNQIjLjUCIzI1AiM2NQIjOjUCIz41AiNCNQIjRjUCI0o1AiNONQIjUjUCI1Y1AiNaNQIjXjUCI2I1AiNmNQIjajUCI241AiNyNQIjdjUCI3o1AiN+NQIjgjUCI4Y1AiOKNQIjjjUCI5I1AiOWNQIjmjUCI541AiOiNQIjpjUCI6o1AiOuNQIjsjUCI7Y1AiO6NQIjvjUCI8I1AiPGNQIjyjUCI841AiPSNQIj1jUCI9o1AiPeNQIj4jUCI+Y1AiPqNQIj7jUCI/I1AiP2NPJRxjb+I/o2/iQGNv4kDjb+JBo2/iQiNv4kKjb+JDI2/iQ2Nv4kOjb+JEI2/iRKNv4kUjb+JFo2/iRiNv4kajb+JG42/iR2Nv4kejb+JII2/iSKNv4kkjb+JJY2/iSaNv4knjb+JKI2/iSuNv4ktjb+JLo2/iS+Nv4kwjb+JMo2/iTSNv4k1jb+JN42/iTiNv4k5jb+JO42/iTyNv4k9jb+JPo2/iUCNv4lCjb+JQ42/iUSNv4lHjb+DdI2/iUqNv4lLjb+JTI2/iU2Nv4lPjb+JUI2/iVGNv4lSjb+JVI2/iVWNv4lYjb+JWo2/iVuNv4lcjb+JXY2/iV6Nv4lfjb+JYI2/iWKNv4lkjb+JZo2/iWiNv4lpjb+Ja42/iW2Nv4lujb+Jb42/g1eNv4lyjb+Jc42/iXSNv4l1jb+Jdo2/iXeNv4l4jb+JeY2/iXqNv4l8jb+JfY2/iX6Nv4l/jb+JgI2/iYGNv4mCjb+Jg42/iYSNv4mGjb+Jh42/iYiNv4mKjb+Ji42/iYyNv4mOjb+Jj42/iZCNv4mSjb+Jk42/iZSNv4mWjb+Jl42/iZiNv4mZjb+Jmo2/iZuNv4mcjb+JnY2/iZ6Nv4mgjb+JoY2/iaKNv4mkjb+JpY2/iaaNv4mojb+JqY2/iaqNv4msjb+JrY2/ia6Nv4mwjb+JsY2/ibKNv4m0jb+JtY2/ibaNv4m4jb+JuY2/ibqNv4nBjTyUdI5HheuOR4VzjkeFTY5HiXuOR4XBjkeFkY5HiYWOR4mJjkeJjY5HiZGOR4mVjkeFyI5HhU+OR4mfjkeJo45HiaeOR4mrjkeJr45HibOOR4m3jkeJu45HibyOR4m+jkeJv45Hg2SOR4SrjkeJwI5HhTqOR4nCjkeJxI5HicWOR4nGjTyUdY5oAADAAE15jmqUZo5riciOapRljm2KCY5tigqOapR0jnB8jmp7jnKUZY5zgUOOc4nJjnOJyo5ylHWOdwCOaonLjnmUdI56ic2OeZR1jnwAjmqJz45+lGWOf4Mojn/AAE15joGEdY5/gaaOf4DBjn+J0o5+lHSOhoFTjn6UdY6IAI5qidOOipR0jouJ1I6LidWOi4nWjouJ2I6KlHGOkInXjpCJ2Y6KlHWOkwCOanqOlZRxjpaBiI6WgSCOlonajpaJ246WidyOlondjpaJ3o6Wid+OlonvjpaJ8I6WifGOlonyjpWUdI6jieCOo4nhjqOJ5Y6jieeOo4nojqOJ6o6jie6Oo4nzjqOJ9Y6jifyOo4FTjqOJ/o6jif+Oo4oAjqOKAY6jigKOo4oDjqOKBI6jigWOlZR1jrcAjmqKBo65lGWOuonZjrmUdY68AI5qigeOvpRljr+EMI6+lHGOwYnyjsGBiI7BgSCOvpR0jsWJ5Y7FifOOxYn1jsWKBY6+lHWOygAAwABNeo7MlHSOzYqrjs2Kro7MihCO0JR0jtGHfo7QlHWO0wCOzIoRjtWUdI7WihKO1ZR1jtgAjsyKE47alHWO2wCOzIoUjt2UdI7eihWO3ZR1juAAjsyKGI7ilHSO44oZjuKUdY7lAI7MihuO55RljuiKHI7oih2O6IoejuiKH47oiiCO6IohjuiKIo7owABNeo7wiiOO8IokjvCKJY7wiiaO8IonjueUc472iiiO55R0jviKKY74ii2O+MAATXqO+4oujvuKL477ijCO+4oxjviG5o74ijOO+Io2jviG6Y74ijmO+Io7jviKPY74ij6O+Io/jviKQo7nlHGPCoQKjueUdY8MAI7MikSPDpRljw+KH48PikWPD4pGjw+KR48PVI8PikiPD8AATXqPFopJjw6UcY8YhAqPDpRyjxqECo8OlHSPHIb5jxyKS48cikyPHIpNjxyKT48cilCPHIpRjxyKUo8cilSPHIpWjxyKV48ciliPDpR1jykAjsyKWo8rlGWPLIpbjyzAAE16jy6KXI8uil2PLopejy6KX48rlHSPM4d+jzOKEo8zimiPM0WPM4FTjyuUdY85AI85imCOzIpwjzyUZY89wABNeo8+inGPPJR0j0BFjzyUdY9CAI7MinKPRJRlj0XAAE16j0aKcY9ElHSPSIpgj0SUdY9KAI7MinOPTJRlj03AAE16j06KcY9MlHSPUEWPTJR1j1IAjsyKdI9UlGWPVcAATXqPVopxj1SUdI9YimCPVJR1j1oAjsyKdY9clGWPXcAATXqPXop2j1yUdY9gAI7MinePYpR0j2OHfo9jikOPYpR1j2YAjsyKeo9olGWPacAATXqPaopcj2iUdI9sinuPbIoSj2iUdY9vAI7MioGPcZRlj3KECo9yikePcZR0j3WKEo9xlHWPdwCOzIqCj3mUZY96gYiPeoPyj3qKU495lHSPfoFTj3mUdY+AAI7MfY+ClGWPg4qHj4OKiI+DiomPg4qKj4OKi4+DioyPg4qNj4OKjo+Dio+Pg4qQj4OKkY+DipKPg4qTj4OKlI+DipWPg4qWj4OKl4+ClHSPlYqYj5WKmY+ClHWPmAAAwABNe4+alGaPm4rcj5qUZY+djWuPmpR0j59+j59/j5qK3Y+ilGWPo4rej6OK34+jgJCPo4EWj6OFNY+jiuGPox+Po4bQj6OK4o+jih+Po4rjj6OK5I+jiuWPo4rmj6OK54+jiuiPo4rpj6OK6o+jiuuPo4rsj6OK7Y+jiu6Po4rvj6ODM4+jivCPo4rxj6OK8o+jivOPo4r0j6OK9Y+jivaPo4r3j6OK+I+jivmPo4r6j6OK+4+jivyPo4r9j6OK/o+jiv+Po4sAj6OLAY+jiwKPo4sDj6OLBI+jiwWPo4sGj6OLB4+jiwiPo8AATXuP1YsJj9WLCo/ViwuP1YsMj9WLDY/Viw6P1YsPj9WLEI/VixGP1YsSj9WLE4/VixSP1YsVj9WLFo/VixeP1YsYj9WLGY/VixqP1Ysbj9WLHI/ViJyP1Ysdj9WLHo/Vix+P1Ysgj9WLIY+ilHSP8IRTj/CEp4/wiyqP8Isrj/CLMI/wiy2P8Isvj/CLLI/wwABNe4/5i0mP+Ytzj/mLbI/5i22P+YuGj/mLiI/5i4OP+YvEj/mLhY/5i8mP+YvHj/mL0I/5i9WP+YvYj/mL3Y/5i0uP+Yvgj/mLgo/5i4SP+Yvjj/mL9Y/5i9KP+YwAj/mL/Y/5i/yP+Yv+j/mL/4/5jAaP+YwLj/mMAo/5i8qP+YwQj/mME4/5jBaP+YwYj/mMJo/5jCeP+Ywpj/mL8Y/5i/SP+Ywzj/mML4/5jFeP+YxZj/mMY4/5jGmP+Ywwj/mMMY/5jG6P+Yxej/mMd4/5jHiP+YyBj/mMhI/5jDKP+YyNj/mMj4/5jImP+YyOj/mMkI/5jJSP+Yybj/mMnI/5jJ2P+Yyrj/mMrI/5jLaP+Yy4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jk+R/JRlkf2OUJH9wABNg5H/jlGR/45Skf+OU5H/jlSR/45Vkf+OWJH/jlmR/Y4akf2OVpH9jleR/JR0kgqAhJIKjluSCo5dkgqOXpIKjl+SCo47kgqOYJIKjmGSCo5ikgqOZJIKjmaSCo5okgqOaZIKjmqSCo5rkgqObZIKjnKSCo5zkfyUdZIdAJHOjnSSH5RlkiCOdZIgwABNg5IijnaSIo53kiKOeJIijnmSH5R0kifAAE2DkiiOepInjnGSJ45DkieOHJInjkSSH5R1ki4Akc6OfJIwlGWSMY51kjCUdJIzhliSM4SskjOGaJIzhl+SM4ZykjCUdZI5AJHOjn2SO5RlkjyOdZI8jhqSPMAATYOSP4sbkjuUdJJBjlqSQcAATYOSQ45+kkOOf5JDjoCSQ46BkkOOhJJDjoWSQYRzkkGErJJBhHKSQYSvkkGEp5JBiBCSQYTbkkGFdJJBhVCSQYVSkkGFd5JBhWCSQYVikkGFeZJBhWSSQYXikkGFZpJBhViSQYVUkkGFVpJBhXuSQYUSkkGFEJJBhQ6SQYX7kkGF9ZJBhRiSQYW3kjuUcZJmi7uSO5R1kmgAkc6OjJJqlGWSa451kmqUdJJtjlqSbYRTkm2EcpJthKeSbcAATYOSco6RknKOkpJtiBCSbYSvkm2HBZJqlHWSeACRzo6XknqUZZJ7jnWSe45WknuLSpJ7jpiSepR0koCOiJKAiASSgIaYkoCGm5KAhp6SgIahkoCGpZKAhqmSgIatkoCGtJKAhrqSgIbIkoCGwZKAhsuSepR1ko8AAMAATYSSkZR0kpKAhJKRjq2SlJRlkpWBiZKVhtCSlJR0kpjAAE2EkpmOrpKYhKeSmIThkpiFAZKYhNuSlJR1kp8AAMAATYWSoZR0kqKOvZKijr6SoY62kqWUZZKmwABNhZKnjZ+Sp464kqaOt5KllHSSq4gQkquOuZKrhVKSq4V0kquOupKrjrySpZR1krIAAMAATYaStJR0krWAhJK0jr+St5RlkriA7JK3lHSSusAATYaSu47AkruOwZK7jsOSu47EkrqGGJK6hY6SuoWDkrqFiJK6hWSSuoX7krqF9ZK6hRiSuoYBkrqGA5K6hgeSuoYMkreUdZLMAADAAE2Hks6OypLPlHGS0B+S0IGAktCA3pLQgYSS0IGCktAPktDAAE1nkteBf5LXgYGS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kKiUjJCplIyQtJSMkLWUjJC3lIyQu5SMkMCUjJC4lIyQxJSMkNOUjJA5lF+UcpSkkLmUpJC+lF+UdZSnAJRekQOUqZRllKqRBJSqwABNnJSskQWUqZR0lK6BTpSplHWUsACUXpEGlLKUdJSzgVOUspR1lLUAAMAATZ2Ut5R0lLiCt5S4kRCUuJEXAMAATZ6UvJRllL2RMZS8YpS/lGWUwB+UwIERlMCRH5TAhDGUwJESlMCRIJS/lHGUx4D4lMdAlMeRK5S/lHSUy4nNlMuQqJTLkKCUy5EhlMuQpJTLkSKUy5EslMuRL5TLkTCUy43/lL+UdZTWAADAAE2flNiUZZTZkTSU2ZE2lNmROZTZkTuU2ZE+lNmRQJTZkUOU2ZFFlNmRSJTZkUqU2ZFNlNmRT5TZkVGU2ZFTlNmRVZTZkVeU2ZFZlNmRW5TZkV6U2ZFglNmRY5TZkWWU2ZFolNmRapTZkWyU2ZFulNmRcJTZkXKU2ZF1lNmReJTZgr2U2ZF8lNmCvpTZkX+U2YK/lNmRgpTZgsaU2ZGFlNmCx5TZkYiU2ZGKlNmRjJTZkY6U2ZGQlNmRkpTZkZSU2ZGWlNmRmJTZkZqU2ZGdlNmRoJTZkaKU2ZGllNmRqJTZgsiU2ZGrlNmRrZTZkbCU2ZGzlNmRtZTZkbiU2ZG7lNmRvpTZkcCU2ZHClNmRxJTZkcaU2ZHJlNmRy5TZkc2U2ZHPlNmR0ZTZkdOU2ZHVlNmR15TZkdqU2ZHdlNmR35TZkeGU2ZHilNmR5ZTZkeeU2ZHplNmR7JTZke+U2ZHylNmR9ZTZkfiU2ZH7lNmR/pTZkgGU2ZIElNmSB5TZkgqU2ZINlNmSEJTZkhOU2ZIVlNmSF5TZkhmU2ZIclNmSHpTZkiGU2ZIjlNmSJZTZkiiU2ZIqlNmSLJTZki6U2ZIxlNmSM5TZkjWU2ZI3lNmSOZTZkjuU2ZI9lNmSP5TZkkKU2ZJElNmSRpTZkkiU2ZJKlNmSTJTZkk6U2ZJQlNmSU5TZklaU2ZJZlNmSW5TZkl2U2ZJflNmSYZTZkmOU2ZJmlNmSaJTZkmqU2ZJtlNmSb5TZknKU2ZJ0lNmSd5TZknmU2ZJ7lNmSfZTZkn+U2ZKBlNmShJTZkoaU2ZKIlNmSipTZkoyU2ZKPlNmSkpTZkpWU2ZKYlNmSm5TYlHSVdsAATZ+Vd5KelXeSqpV3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lQmZt5UOmbeVEZm3lR6Zt5UdmbeVDZm3lQuZt5UMmbeHgZm3lQSZt5UnmbeU8Jm3lSqZt5UombeVBZm3lTCZt5UxmbeVHJm3h+uZt4ffmbeEU5m3hNuZt4UBmbeE4Zm3hOiZt4SnmbeEr5m3hHKZt4VCmbeFdJm3hViZt4V3mbeFeZm3hXuZt4WDmbeFupm3hYiZt4WOmbeVXZm3lVOZt4WSmbeFl5m3hZuZt4WhmbeFp5m3hauZt4WvmbeFt5m3hcmZt4XLmbeFzZm3hc+Zt4XRmbeF05m3hdWZt4XXmbeF2Jm3hduZt4XembeFvZm3hb+Zt4XCmbeFxJm3hcaZt4XkmbeF5pm3hYCZt4XpmbeF7Jm3hGaZt4RjmbeIDJm3hUWZt4VHmbeVVJm3lVyZt4VQmbeFUpm3hWCZt4VimbeFVJm3hVaZt4VkmbeFZpm3he+Zt5V6mbeF8pm3hfWZt4X3mbeF+5m3hf2Zt4X/mbeGAZm3hgOZt4YHmbeGDJm3hg+Zt4YUmbeGFpm3hhiZt4YambeGHZm3hiKZt4YlmbeGK5m3hjaZt4Y4mbeH8Jm3hWuZt4VtmbeIFJm3hQuZt4UOmbeFEJm3hRKZt4UVmbeFGJm3iA6Zt5UlmbeVmZm3hkyZt4ZPmbeGUZm3hlOZt4ZYmbeGX5m3hmyZt4ZymbeGkZm3hvGZt4XhmbeIBJm3hrSZt4a3mbeGrZm3hrqZt4bBmbeGpZm3hsiZt4bOmbeIApmmlHWacgCZSZWmmnSUZZp1kEmadZWnmnWVqJp1lamadZWqmnWVq5p1layadZWtmnWVrpp1la+adZWwmnWVsZp1lbKadZWzmnWVtJp1lbWadZW2mnWVt5p1lbiadZW5mnSUdJqKlbqaipW7moqIDJqKhUKaioV0moqFd5qKhViaioV5moqFe5qKhYOaioW6moqFiJqKhY6aioWSmoqFr5qKhbeaioXJmoqFy5qKhc2aioXPmoqF0ZqKhdOaioXVmoqF15qKhduaioXemoqFvZqKhb+aioXCmoqFxJqKhcaaioVFmoqFR5qKhVCaioVSmoqFYJqKhWKaioVUmoqFVpqKhWSaioVmmoqF5Jp0lHWatQAAwABNrpq3lGaauJXKmreKvZq6lGWau4CQmruVy5q6lHOavgCaupRxmsCJLZrAiUqawIkmmsCJKJrAiUuawIlt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fZRlnH6Wfpx+ln+cfpaAnH6WgZx+loKcfpaDnH6WhJx+loacfpaInH7AAE21nIiWiZyIiFOciJaKnH6MQZx+jDqcfoxGnH6MNpx+i8KcfZRxnJGECpyRjECcfZR0nJSMI5yUloyclJaNnJSL5ZyUwABNtZyZijGcmZaRnJmWmJyZlpucmZacnJmWnZyZlp6cmZafnJmWoJyZlqGcmZainJmWo5yZlqScmZalnJmWppyZlqecmZaonJmWmpyZlqmcmZaqnJmWq5yZlq2cmZavnJmWsZyZlrOcmZa1nJmWt5yZlw2cmZaLnJSNB5yUjLSclIvInJSMG5yUjTOclIxonJSMZ5yUjLOclIwknJSMJZyUjB6clIwfnJSMi5yUi+aclIuQnJSMTpyUi9uclIuHnJSL1pyUi9eclIvanJSL05yUjBKclIvznJSL8pyUjCyclI0QnJSNHJyUjROclI0SnJSLmpyUjSOclI0onJSM1JyUjN6clIzdnJSM1ZyUi82clIy8nJSMEZyUjFaclIwEnJSMCpyUjA2clIzonJSNKZyUjFSclIxRnJSNUZyUjLqclI07nJSNUpyUjSuclIwBnJSMmpyUjJOclIwVnJSMYJyUjB2clIxYnJSMU5yUjE2clIy3nJSNF5yUi8+clI1fnJSNLJx9lHWc+gAAwABNtpz8lHSc/ZgsnP3AAE22nP+YLpz8ljWdAZRlnQKDKJ0CwABNtp0EhHWdAoGmnQKXzJ0Cl82dApfOnQKXz50Cl9CdApfRnQKX0p0Cl9OdApfUnQKX1Z0Cl9adApfXnQKX2J0Cl9mdApfanQKX250Cl9ydApfdnQKX3p0Cl9+dApfgnQKX4Z0Cl+KdApfjnQKX5J0Cl+WdApfmnQKX550Cl+idApfpnQKX6p0Cl+udApfsnQGUdJ0ogVOdAZR1nSoAnPyX7Z0slHGdLYbdnS2X7p0slHSdMEWdMJfvnSyUc50zimCdLJR1nTUAnPyX8Z03lGWdOIMonTjAAE22nTqEdZ04gaadOJVQnTiWVZ04guadN5R0nUCBU503lHWdQgCc/JfynUSUZZ1Fg8GdRJRxnUeG3Z1HgdedRJR0nUqX751KgVOdSiedRJR1nU4AnU6KYJz8l/SdUZRlnVKDwZ1RlHGdVJfunVSG3Z1UgdedUZR0nViX751YgVOdWCedUZR1nVwAnVyKYJz8l/adX5RlnWCX951flHGdYobdnWKB151flHSdZZfvnWWBU51lJ51flHWdaQCdaYpgnPyX+J1slGWdbZf3nWyUcZ1vht2db4HXnWyUdJ1yl++dcoFTnXInnWyUdZ12AJ12imCc/Jf6nXmUZZ16gZedeZRxnXyG3Z18gdedeZR0nX+X751/gVOdfyedeZR1nYMAnYOKYJz8l/ydhpRlnYeMo52GlHGdiYbdnYmB152GlHSdjJfvnYyBU52MJ52GlHWdkACdkIpgnPyX/p2TlHGdlIbdnZOUdJ2Wl++dloFTnZOUdZ2ZAJ2ZimCc/JgAnZyUZZ2di3WdnJRxnZ+G3Z2fgdednJR0naKX752igVOdoiednJR1naYAnaaKYJz8mAKdqZRxnaqG3Z2qgdedqZR0na2X752tgVOdrSedqZR1nbEAnbGKYJz8mASdtJRxnbWG3Z21gdedtJR0nbiX7524gVOduCedtJR1nbwAnbyKYJz8mAadv5RlncCKFp2/lHGdwobdncKB152/lHSdxZfvncWBU53FJ52/lHWdyQCdyYpgnPyYCJ3MlGWdzYC+nc2L553MlHGd0JfundCG3Z3QgdedzJR0ndSX753UgVOd1CedzJR1ndgAndiKYJz8mAud25RlndyAvp3ci+ed25Rxnd+X7p3fht2d34HXnduUdJ3jl++d44FTneMnnduUdZ3nAJ3nimCc/JgNneqUZZ3rgL6d64vnneqUcZ3ul+6d7obdne6B153qlHSd8pfvnfKBU53yJ53qlHWd9gCd9opgnPyYD535lGWd+oC+nfqL5536jQ2d+ZRxnf6X7p3+ht2d/oHXnfmUdJ4Cl++eAoFTngInnfmUdZ4GAJ4GimCc/JgSngmUZZ4KmBOeCovnngmUcZ4Nl+6eDYbdng2B154JlHSeEZfvnhGBU54RJ54JlHWeFQCeFYpgnPyYFZ4YlHGeGYbdnhiUdJ4bl++eG4FTnhiUdZ4eAJz8mBieIJRlniGK5J4hiuWeIYOdniHAAE22niWYGZ4glHSeJ4yVnieMUJ4njR6eJ40bnieL8J4njCueJ40PnieYIZ4njRGeJ40knieLzJ4nhEWeJ4wDnieMKp4ni/qeJ4ynnieMrZ4ni5meJ4yZnieMZp4ni9yeJ40YnifAAE22nj6YG54+mBqePpgknidFnieBU54glHWeRACeRIpgnPyYK55HlHWeSAAAwABNt55KlGWeS5kynkuZM55LmTSeS5k1nkuZNp5Ll6meS5k3nkuZOZ5LmTqeS5k7nkuZPJ5LmT2eSpR0nliZPp5YmUGeWJlCnliZQ55YmUSeWJlSnliZU55YmVSeWJlVnliZVp5YmVeeSpgxnmSUZZ5lgyieZcAATbeeZ4R1nmWBpp5lmDKeZZgznmWYNJ5lmDWeZZg2nmWYN55lmDieZZg5nmWYOp5lmDueZZg8nmWYPZ5lmD6eZZg/nmWYQJ5lmEGeZZhCnmWYQ55lmESeZZhFnmWYRp5lmEeeZZhInmWYSZ5lmEqeZZhLnmWYTJ5lmE2eZZhOnmWYT55lmFCeZZhRnmWYUp5lmFOeZZhUnmWYVZ5lmFaeZZhXnmWYWJ5lmFmeZZhanmWYW55lmFyeZZhdnmWYXp5lmF+eZZhgnmWYYZ5lmGKeZZhjnmWYZJ5lmGWeZZhmnmWYZ55lmGieZZhpnmWYap5lmGueZZhsnmWYbZ5lmG6eZZhvnmWYcJ5lmHGeZZhynmWYc55lmHSeZZh1nmWYdp5lmHeeZZh4nmWYeZ5lmHqeZZh7nmWYfJ5lmH2eZZh+nmWYf55lmICeZZiBnmWYgp5lmIOeZZiEnmWYhZ5lmIaeZZiHnmWYiJ5lmImeZZiKnmWYi55lmIyeZZiNnmWYjp5lmI+eZZiQnmWYkZ5lmJKeZZiTnmWYlJ5lmJWeZZiWnmWYl55lmJieZZiZnmWYmp5lmJueZZicnmWYnZ5lmJ6eZZifnmWYoJ5lmKGeZZiinmWYo55lmKSeZZilnmWYpp5lmKeeZZionmWYqZ5lmKqeZZirnmWYrJ5lmK2eZZiunmWYr55lmLCeZZixnmWYsp5lmLOeZZfcnmWX3Z5lmLSeZZi1nmWYtp5lmLeeZZfenmWX455ll+WeZZfmnmWYuJ5lmLmeZZi6nmWYu55lmLyeZZi9nmWYvp5lmL+eZZjAnmWYwZ5lmMKeZZjDnmWYxJ5lmMWeZZjGnmWYx55lmMieZZjJnmWYyp5lmMueZZjMnmWYzZ5lmM6eZZjPnmWY0J5lmNGeZZjSnmWY055lmNSeZZjVnmWY1p5lmNeeZZjYnmWY2Z5lmNqeZZjbnmWX6J5lmNyeZZjdnmWY3p5ll+meZZjfnmWY4J5lmOGeZZfqnmWY4p5lmOOeZZjknmWY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rTaUdK03nXStN8AATeWtOZ8HrTc2rTeBNK03Na03jaWtN5/VrTeOja03nwqtN43/rTaUda1DAKyOoACtRZRlrUbAAE3nrUegAa1FlHGtScAATeetSp7wrUmBVq1JIq1JgOCtRZR0rU+ddK1PK61PgVOtT5/4rU+f+a1Phm+tT5P3rU+e+q1Pg+utRZR1rVkArI6gA61blGWtXMAATeetXaABrV2gBK1blHGtYMAATeetYZ7wrWCBVq1gIq1ggOCtW5R0rWaddK1mK61mgVOtZjatZoE0rWaN/61mn/itZp/5rWaGb61mk/etZjWtZo2lrWaOja1mn9WtZp8KrWae+q1mg+utW5R1rXgAAMAATeiteqAJrXuUZa18wABN6K19oAqtfYHorXuUca2Ag9+tgKALrXuUdK2Djf+tgzatg0mte5R1rYcAAMAATemtiaANrYqUZa2LwABN6a2MiFOtjIHorYqUca2PVK2PoAutipR0rZKN/62SNq2SgeutkkmtipR1rZcAAMAATeqtmZRlrZqgE62ZoBGtnJRxrZ2HfK2doBKtnJR1raDAAE3qraGBJgDAAE3rraOgFK2klHStpVWtpJR1racAraOgFa2plHGtqqASraqHfK2plHStraAWramUda2vAADAAE3srbGUZa2yoButsaAarbSUca21h3yttaASrbSUda24wABN7K25gSYAwABN7a27oBytvJRlrb3AAE3trb6IU62+geitvJRxrcGHfa3BoAutvJR0rcSN/63ENq3EgeutxEmtvJR1rckAAMAATe4AwABN763MlGatzaAkrcyUZa3Pgrytz6Azrc+gNa3PoDitz6A8rc+gPa3PoEGtz6BCrc+gRK3PoEetz6BJrc+gS63PoE6tz6BPrc+gU63PoFStz6BXrc+gWK3PoFqtz6Bdrc+gYK3PoGGtz6Bkrc+gZa3PoGmtz6Bqrc+gb63PoHCtz6Bzrc+gdK3PoHitz6B5rc+gfK3PoH+tz6CCrc+ghK3PoIatz6CIrc+gjK3PoI2tz6CPrc+gka3PoJOtz6CWrc+gmK3PoJutz4K5rc+gnK3PoJ+tz6Cgrc+goq3PoKStz6Corc+gqa3PoK2tz5B8rc+grq3PoLCtz6Czrc+gtK3PoLitz6C5rc+QeK3PoLqtz5B5rc+gu63PoL6tz6DArc+gw63PoMatz6DIrc+Qfa3PoMqtz6DNrc+gz63PoNKtz6DVrc+g2K3PoNytz6Ddrc+g4a3PoOKtz6Dmrc+g563PoOmtz6Dqrc+g7q3PoO+tz6Dzrc+g9K3PoPetz6D6rc+g/a3PoP+tz6EBrc+hBK3PoQatz6EIrc+hCq3PoQ2tz6EPrc+hEa3PoROtz6EWrc+hGa3PoRqtz6Eerc+hH63PoSOtz6Ekrc+hJ63PoSitz6Errc+hLK3PoS+tz6Ewrc+hNK3PoTWtz6E4rc+hOa3PoTytz6E9rc+hQq3PoUOtz6FHrc+hSK3PoUutz6FMrc+hT63PoVCtz6FSrc+hVa3PoVitz6FZrc+hXK3PoV2tz6Ffrc+hYa3PoWOtz6Fmrc+haK3PoWqtz6Fsrc+hb63PoXOtz6F0rc+heK3PoXmtz6F8rc+hfa3PoYCtz6GBrc+hhK3PoYWtz6GHrc+hiq3PoY6tz6GPrc+hlK3PoZWtz6GYrc+hm63PoaCtz6Ghrc+hpa3Poaatz6Grrc+hrK3Poa6tz6Gxrc+hta3Pobatz6G6rc+hu63PocCtz6HBrc+hxa3Pocatz6HKrc+hy63Poc2tz6HPrc+h063PodStz6HYrc+h2a3Podutz6Hdrc+h4a3PoeKtz6Hkrc+h5q3Poeqtz6Hrrc+h763PofCtz6Hzrc+h9q3Pofitz6H7rc+h/a3PogCtz6ICrc+Qfq3PogWtz6IHrc+iC63Pogytz6IPrc+iEK3PohStz6IVrc+iGK3Pohmtz6Icrc+iH63PoiOtz6Ikrc+iJ63Poimtz6Irrc+iLq3PojCtz6Iyrc+iNK3Pojatz6I4rc+iOq3Poj6tz6I/rc+iQ63PokStz6JHrc+iSa3Pok2tz6JOrc+iUK3PolOtz6JVrc+iV63Polmtz6Jbrc+iXa3Pol+tz6Jhrc+iZK3PomWtz6Jnrc+iaa3Pomutz6Jsrc+ib63PonGtz6J0rc+idq3Ponitz6J6rc+ifa3Pon+tz6KBrc+ihK3Pooatz6KIrc+ii63Poo2tz6KPrc+ika3PopStz6KWrc+imK3Popqtz6Kcrc+ioa3PoqKtz6Kmrc+ip63Poqmtz6Kqrc+irK3Poq+tz6Kzrc+itK3Poritz6K5rc+iva3Por6tz6LCrc+iw63PosWtz6LIrc+iy63Posytz6LQrc+i0a3PotWtz6LWrc+i2K3Potmtz6Lbrc+i3a3Pot+tz6Lirc+i5a3Pouetz6Lprc+i7K3Pou+tz6Lwrc+i863Povatz6L4rc+i+q3Pov6tz6L/rc+jAa3PowOtz6MFrc+jB63Powutz6MMrc+jD63PoxCtz6MTrc+jFK3Poxetz6MYrc+jGq3Pox2tz6Mfrc+jIa3PoyOtz6Mmrc+jKa3Poyqtz6Mtrc+jL63PozKtz6Mzrc+jNq3Pozetz6M6rc+jO63Poz2tz6M/rc+jQ63Po0Stz6NGrc+jSK3Po0utz6NMrc+jTq3Po1Gtz6NTrc+jVq3Po1mtz6Narc+jXa3Po16tz6Nhrc+jYq3Po2atz6Nnrc+ja63Po2ytz6Nwrc+jca3Po3Otz6N1rc+jea3Po3qtz6N+rc+jf63Po4Stz6OFrc+jiK3Po4mtz6ONrc+jjq3Po5Ktz6OTrc+jl63Po5itz6Obrc+jnK3Po5+tz6Ogrc+jo63Po6Wtz6Onrc+jqa3Po62tz6Ourc+jsq3Po7Otz6O1rc+jt63Po7qtz6O7rc+jvq3Po7+tz4K6rc+jwq3Pgrutz4LArc+jxq3PgsGtz6PJrc+Cwq3Po8ytz4LDrc+jz63PgsStz6PSrc+Cxa3Po9Wtz6PXrc+j263Po9ytz6Pgrc+j4a3Po+Wtz6Pmrc+j6q3Po+utz6Purc+j8a3Po/Stz6P3rc+j+a3Po/utz6P9rc+kAK3PpAKtz6QErc+kB63PpAitz6QLrc+kDK3PpBGtz6QSrc+kFq3PpBetz6Qcrc+kHa3PpCGtz6Qirc+kJq3PpCetz6Qrrc+kLK3PpC6tz6Qwrc+kNa3PpDatz6Q5rc+kOq3PpD6tz6Q/rc+kQq3PpEOtz6RHrc+kSK3PpEqtz6RNrc+kT63PpFKtz6RUrc+kVq3PpFqtz6Rbrc+kXq3PpF+tz6Rjrc+kZK3PpGitz6Rprc+kba3PpG6tz6Rxrc+kcq3PpHWtz6R2rc+kea3PpHytz6R/rc+kgq3PpIWtz6SGrc+kiK3PpIqtz6SOrc+kj63PpJGtz6STrc+klq3PpJetz6SZrc+km63PpJ+tz6Sgrc+ko63PpKStz6Snrc+kqK3PpKqtz6Ssrc+krq3PpLCtz6Syrc+ktK3PpLatz6S4rc+kvK3PpL2tz6S/rc+kwq3PpMStz6THrc+kyq3PkH+tz6TLrc+kza3PpNCtz6TTrc+k1a3PpNetz6Tarc+k263PpN6tz6Tfrc+k4a3PpOOtz6Tlrc+k563PpOmtz6Trrc+k7q3PpO+tz6Tyrc+k863PkR6tz6T0rc+k9q3PpPitz6T6rc+k/K3PpP+tz6UArc+lAq3PpQStz5B6rc+lBa3PpQetz6UJrc+lC63PpQ2tz6UPrc+lEa3PpROtz6UVrc+lF63PkICtz6UZrc+lG63PpR2tz6Ufrc+lIa3PpSOtz6Unrc+lKK3PpSytz6Utrc+lL63PpTGtz6U1rc+lNq3PpTqtz6U7rc+lPa3PpT+tz6VCrc+lQ63PpUatz6VHrc+lTK3PpU2tz6VPrc+lUa3PpVOtz6VVrc+lWK3PpVmtz6Verc+lX63PpWKtz6Vjrc+lZa3PpWetz6Vprc+la63PpW2tz6Vvrc+lca3PpXOtz6V2rc+ld63PpXytz6V9rc+lga3PpYKtz6WErc+lh63PpYutz6WMrc+lj63PpZGtz6WUrc+lla3PpZitz6WZrc+lnK3PpZ2tz6Wgrc+loa3PpaStz6Wlrc+lqK3Ppamtz6Wrrc+lra3PpbGtz6Wyrc+ltq3Ppbetz6W6rc+lvK3PpcCtz6XBrc+lw63PpcWtz6XHrc+lya3Ppc2tz6XOrc+l0a3PpdKtz6XVrc+l1q3Ppditz6Xarc+l3a3Ppd6tz6Xirc+l463Ppeatz6Xnrc+l663Ppeytz6Xwrc+l8a3PpfOtz6X1rc+l+q3Ppfutz6X/rc+mAK3PpgWtz6YGrc+mCK3Ppgqtz6YNrc+mEK3PkHutz6YRrc+QJ63PphKtz6YXrc+mGK3Pphytz6Ydrc+mH63PpiKtz6Ymrc+mJ63Ppiytz6Ytrc+mMK3PpjGtz6Y0rc+mNq3Ppjqtz6Y7rc+mP63PpkCtz6ZFrc+mRq3Ppkqtz6ZLrc+mT63PplCtz6ZUrc+mVa3Pplmtz6Zarc+mXq3Ppl+tz6Zhrc+mY63Ppmetz6Zorc+ma63Ppm2tz6Zvrc+mcq3PpnWtz6Z2rc+mea3Ppnutz6Z9rc+mf63PpoOtz6aErc+mh63Ppoitz6aMrc+mja3PppCtz6aRrc+mk63PppWtz6aXrc+mma3Ppp2tz6aerc+moa3PpqKtz6anrc+mqK3Ppqqtz6asrc+mrq3PprCtz6azrc+mtK3Ppratz6a5rc+mu63Ppr2tz6bArc+mwa3PpsStz6bFrc+mx63Ppsmtz6bLrc+mza3PptGtz6bSrc+m1K3Pptatz6bYrc+m2q3Pptytz6berc+m4K3PpuKtz6bkrc+m5q3Ppuitz6bqrc+m7K3Ppu6tz6bwrc+m8q3PpvWtz6b2rc+m+a3Ppvqtz6b9rc+m/q3PpwKtz6cDrc+nBq3Ppwmtz6cLrc+nDa3Ppw+tz6cSrc+nFK3Ppxatz6cZrc+nGq3Ppx6tz6cfrc+nIa3PpyOtz6clrc+nKK3Ppyqtz6ctrc+nL63PpzGtz6czrc+nNq3Ppzitz6c7rc+nPa3PkIGtz6c/rc+nQa3Pp0Wtz6dGrc+nSa3Pp0qtz6dOrc+nT63Pp1Ktz6dTrc+nVq3Pp1mtz6dbrc+nXq3Pp2Gtz6dirc+nZq3Pp2etz6drrc+nbK3Pp2+tz6dwrc+ncq3Pp3Stz6d3rc+neq3Pp36tz6d/rc+nga3Pp4Stz6eHrc+niK3Pp4utz6eMrc+nj63Pp5Ctz6eTrc+nlK3Pp5etz6eZrc+nna3Pp56tz6eirc+no63Pp6itz6eprc+nrq3Pp6+tz6ezrc+ntK3Pp7itz6e5rc+nva3Pp76tz6fCrc+nw63Pp8Wtz6fIrc+nyq3Pp8ytz6fOrc+n0K3Pp9Wtz6fWrc+n2q3Pp9utz6ffrc+n4K3Pp+Otz6fkrc+n6K3PkIKtz6fprc+Qg63Pp+utz5CErc+n7a3Pp++tz6fyrc+n863Pp/atz6f3rc+n+a3Pp/utz6f/rc+oAK3PqAStz6gFrc+oB63PqAmtz6gLrc+oDa3PqBCtz6gRrc+oFK3PqBWtz6gZrc+oGq3PqB6tz6gfrc+oIq3PqCOtz6gnrc+oKK3PqCutz6gsrc+oMa3PqDKtz6g1rc+oNq3PqDqtz6g7rc+oPq3PqD+tz6hBrc+oRa3PqEetz6hKrc+oTK3PqE+tz6hRrc+oVK3PqFatz6hZrc+oW63PqF2tz6hgrc+oYa3PqGOtz6hmrc+oaK3PqGqtz6hurc+ob63PqHKtz6hzrc+od63PqHitz6h8rc+ofa3PqICtz6iBrc+og63PqIatz6iKrc+oi63PqI+tz6iQrc+okq3PqJWtz6iXrc+omq3PqJ2tz6ifrc+oo63PqKStz6iorc+oqa3PqKutz6iurc+osa3PqLOtz6i3rc+ouK3PqLqtz6i9rc+ov63PqMGtz6jDrc+oxa3PqMitz6jJrc+oy63PqM2tz6jRrc+o0q3PqNWtz6jWrc+o2q3PqNutz6jfrc+o4K3PqOStz6jlrc+o6a3PqOqtz6jvrc+o8K3PqPKtz6j1rc+o963PqPmtz6j7rc+o/a3PqP+tz6kBrc+pA63PqQatz6kKrc+pC63PqQ+tz6kQrc+pEq3PqRWtz6kYrc+pGa3PqRutz6kdrc+pH63PqSGtz6kjrc+pJa3PqSetz6kprc+pLK3PqS2tz6kxrc+pMq3PqTatz6k3rc+pOq3PqTytz6lArc+pQa3PqUStz6lFrc+pSa3MlHSx26AisdupSrHbh0Gx28AATe+x36lMsd+pT7HfqVKx36lUsd+pXLHfqWGx36lksd+pZrHfqWmx36lusd+pcbHfqXOx36l1sd+peLHfqXux36l9sd+pgbHfqYOx36mFsd+pirHfqYyx36mOsd+pkLHfqZKx36mUsd+plrHfqZex36mZsd+pnLHfqZ+x36misd+ppLHfqaex36mpsd+pq7Hfqa2x36mwsd+psrHfqbSx36m2sd+pubHfqbyx36m/sd+pxLHfqcex36nJsd+p2rHfqdyx36nfsd+p4bHfqeOx36nlsd+p57Hfqeux36nssd+p7rHfqe+x36nysd+p9LHfqfax36n4sd+p+7Hfqf6x36oAsd+qArHfqgSx36oGsd+qCbHfqgux36oNsd+qD7HfqhKx36oUsd+qFrHfqhix36oasd+qHLHfqh6x36ogsd+qIrHfqiWx36opsd+qLbHfqi+x36oxsd+qM7Hfqjax36o4sd+qOrHfqjyx36o+sd+qQLHfqkKx36pEsd+qR7Hfqkqx36pMsd+qTrHfqlCx36pSsd+qVLHfqlax36pYsd+qW7Hfql+x36phsd+qZLHfqmex36ppsd+qbbHfqm+x36pzsd+qdbHfqnex36p6sd+qfLHfqn+x36qDsd+qhrHfqoix36qKsd+qjLHfqo2x36qPsd+qkbHfqpOx36qWsd+qmLHfqpqx36qcsd+qn7HfqqGx36qisd+qo7Hfqqax36qosd+qrLHfqq6x36qwsd+qsrHfqrSx36q2sd+quLHfqrqx36q9sd+qv7HfqsGx36rEsd+qxrHfqsux36rNsd+qz7HfqtGx36rVsd+q17Hf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N60atDetHLQ3rR20N4hVtDeIVrQvrRu0L5DBtC6UdLRHrR60R4b5tEeG+7RHhvy0R60gtEeG+rRHhv20R60htEfAAE32tFCtJbRQrSa0UK06tFCtPLRQrT20UK1BtFCtQrRQrUu0UK1btFCtTLRQrUq0UK1itFCtc7RQrXS0UK11tFCtirRQraS0R60ntEetK7RHrSy0R4cCtEetNLRHhv+0R601tEetNrRHrTe0R605tEetPrRHkMO0R5xytEetTbRHrVS0R61jtEetYbRHhv60R61stEetL7RHrW20R60wtEetbrRHrWa0R61wtEeHALRHrWW0R617tEetgrRHrX+0R62DtEetdrRHrXe0R614tEetibRHrY60R62PtEetebRHrYu0R616tEetjLRHrZK0R62WtEeHA7RHraW0R62RtEetprRHrai0R619tEetkLRHrS60R62ttEetsbRHra+0R62ytEeto7RHrZ20R621tEettrRHrbi0R62ztEettLRHrYi0R62HtEetvbRHrZi0R62+tEetv7RHrau0R4cBtEethLRHrcS0R62btEetxbRHrca0R62FtEetubRHrZy0R62utEetfLQulHG0sq0ftC6UdbS0ALP+q7+0tpRltLfAAE32tLitx7S2lHS0usAATfa0u60ltLuty7S7rSa0uobztLqG9rS6hwG0uq1ltLqtdrS6rXe0uq14tLqtebS6rYu0uq16tLqtjLS6rZK0uocDtLqtLrS6rZu0uq3GtLqtrrS6rZ20uq2CtLqte7S6rYO0uq21tLqtxLS6rYi0uocAtLaUcbTYhvi02FS0tpR1tNsAs/6IYLTdlGW03obctN6GxbTdlHW04QAAwABN97TjkHO05JRltOWtzrTklHS054FdtOet0bTnrdK055+mtOSUcbTsNLTsrdO05JR1tO8AAMAATfi08ZR0tPIgtPJFtPLAAE34tPWt6gDAAE35tPet9LT4lHS0+YFdtPmfprT5rdG0+a3StPiUcbT+NLT+rdO0+JR1tQEAtPet9rUDlHS1BIFdtQSt+LUErdG1BK3StQOUcbUJrdO1A5R1tQsAtPeQdbUNlGW1DsAATfm1D635tQ2UdLURrfi1EZ+mtRGt0bURrdK1DZRxtRY0tRat07UNlHW1GQC09639tRuUZbUcwABN+bUdrf61G5R0tR+t+LUfwABN+bUhrf+1H5+mtRuUcbUkNLUblHW1JgAAwABN+rUolGW1Ka4KtSiUdLUrkKC1K64QtSuuF7Urrhi1K64ZAMAATfu1MZRxtTKQm7UxlHS1NIbatTSuG7U0rgi1NK4cAMAATfy1OZR0tTqPvbU6kIa1Oq4JtTquILU6riO1Oq4ltTmQhbVBlGW1QoCWtUGUdLVEgVO1QZR1tUYAAMAATf21SJCHtUmUZbVKrie1SpCbtUquKLVJlHS1TpDGtU6eMrVOipi1SZR1tVIAAMAATf61VJCItVWUZbVWri61VjS1VZR0tVmuL7VZrjK1WZ1EtVmuNrVZrji1Wa46tVnAAE3+tWCuNLVgrjW1YK47tWCuPLVVlHW1ZQAAwABN/7VnkIm1aJRltWnAAE3/tWquPrVolHS1bJDRtWwgtWzAAE3/tW+uWrVsoDC1bK5ctWiUdbVzALVnkIu1dZRltXaA5bV2wABN/7V4ljq1dZR0tXquMLV1lHG1fKwktXWUdbV+ALVnrl61gJRltYGBiLWBgUy1ga4xtYGG47WAlHG1hoFntYCUdbWIALVnkIq1ipRltYsktYqUdLWNgVO1ipR1tY8AAMAATgC1kZR0tZKucrWSrnO1kq50tZKudrWSrne1kZEdtZiUZbWZrmG1ma5itZmuY7WYlHG1nalrtZ2uZ7WdwABOAbWgjx21mJR0taKBU7Wirmi1oq5ptaKuarWigT61mJRytajAAE4BtamPHbWYlHW1q4aGtauuZLWrrmW1q8AATgC1r4EmtZGrlrWxlHG1soDgtbLAAE4BtbSWibWxlHS1tq5qtbGUdbW4ALWRq5y1upRltbuEALW6lHS1va5qtb01tbqUdbXArmS1wIaGtcCuZbXAwABOALXEgSa1kauetcaUZbXHq7u1x6u8tcaUdLXKrmq1xpR1tcyDNrXMrmS1zK5ltZGrnbXQlHS10a5qtdCUdbXTrmS1065ltdPAAE4AtdaBJrWRrm+12JRxtdmB3LXZLrXZgOC12a5mtdiUc7XeALXYlHW14JOetZGucLXilGW144HcteODwLXilHG15i615oDgteauZrXilHW16gC1ka5xteyUZbXtgdy17S617YDgte2uZrXslHW18gAAwABOArX0lGW19a6LtfSuebX3lGW1+IRptfiuerX4rnu1+IGwtfeUdLX9kqS1/ZKwtf2JxLX9rn+1/a6Dtf2ICrX9hmi1/YZMtf2GVbX9hlO1/YZPtf2GUbX9hnK1/YZftf2GWLX9iAS1/YaYtf2Gm7X9hp61/Yahtf2GqbX9hqW1/Ya6tf2GtLX9hre1/Yattf2GyLX9hsG1/YbLtf2GzrX3lHG2HJKptfeUdbYeALX0roi2IJRltiGEDbYhrom2IYGItiGBZ7Yhg222IJR0tieBU7YglHG2Ka5+tiCUdbYrAADAAE4Dti2UZbYusim2LrIqti2UdLYxsiu2MbIltjGyLbYxsi62La67tjaUZbY3rry2N6xxtjeERLY3rr22N6yEtjeBFrY3gJC2N66+tjeuv7Y3ie62N67AtjeuwbY3gUy2N67Ctjeuw7Y3rsS2N67FtjeuxrY3rse2N67ItjfAAE4DtkyuybZMrsu2N67MtjeuzbY3rs62N67Ptjeu0LY3rtG2N67StjeTz7Y3rtO2N67Vtjeu1rY3iwC2N67Xtjeu2LY3rtm2N67atjeu27Y3rty2NpRxtmGu5rZhrue2Ya7otmGFNbZhruq2NpR0tmfAAE4Dtmiu67Zoruy2aK9NtmivpLZor+y2aLBItmivG7ZosX+2Z67utmeu8LZnrvG2Z670tmeu9rZnrvK2Z671tmeu+rZnrvu2Z678tmevALZnrwG2Z68DtmevBbZnrwu2Z4xytmevDrZnrw+2Z68StmevFbZnryK2Z68ltmevLLZnry62Z685tmevOrZnrz62Z69FtmevR7Znr0i2Z69KtmevS7Znr0+2Z69ftmeEGbZnk7C2Z683tmevOLZnr3m2Z697tmevhLZnr4a2Z6+HtmevXbZnr4+2Z6+QtmevkrZnr5S2Z6+YtmevoLZnr6O2Z6+ptmevrLZnr662Z6+vtmevsrZnr7m2Z6+1tmevtrZnr7i2Z6+0tmevw7Znr8S2Z6/ItmevyrZnr8u2Z6/Ptmev0LZnlm62Z6/Rtmev27Znr9W2Z6/ztmev97Znr/i2Z6/6tmev/7ZnsAO2Z7AFtmewCLZnsAy2Z7APtmewEbZnsBa2Z7AYtmewGrZnsCG2Z7AmtmewJLZnsCq2Z7ArtmewLLZnsC+2Z7AxtmewNLZnsDe2Z7A9tmewP7ZnsEC2Z7BCtmewR7ZnsEy2Z7BPtmewUrZnsFS2Z7BZtmewY7ZnsG+2Z7BztmewdbZnsHm2Z7CAtmewhbZnsI22Z7CQtmewk7ZnsIy2Z7CXtmewmrZnsJu2Z7CgtmewpLZnsK62Z699tmews7ZnsLa2Z7C5tmewvrZnsMe2Z7DKtmewy7ZnsM+2Z7DTtmew1bZnsOC2Z7Dktmew5bZnsOe2Z7Dotmew67ZnsO22Z7Dvtmew8LZnsPW2Z7D2tmew+LZnsQG2Z7ECtmexCbZnsQ+2Z7EUtmexFrZnsRm2Z7EbtmevGrZnr3a2Z7EktmevjbZnsSq2Z7ErtmexLbZnsS62Z7EvtmexMLZnsTG2Z7E3tmexObZnsT22Z7E+tmexP7ZnsUC2Z7FBtmexRLZnsUq2Z7FPtmexUbZnsVO2Z7FUtmexVrZnsVi2Z7FbtmexXLZnsV62Z7FftmexYbZnsWK2Z7FotmexabZnsWu2Z7FstmexbbZnsXO2Z7F0tmexdrZnsXu2Z7GLtmexjrZnsY+2Z7GTtmexlLZnsZi2Z7GZtmexmrZnsZ22Z7GftmexobZnsay2Z7GvtmexsbZnsb62Z7HDtmexxrZnsc62Z7HQtmex1bZnsdm2Z7Hitmex47ZnseS2Z7Hptmex8bZnsfO2Z7H1tmeu+LZnryG2Z68MtmexzbZnr3K2Z7ATtmevCbZnr0K2Z7H4tmevQ7Znr0y2Z7IAtmeyArZnsgO2Z7IFtmeyB7Znr3C2Z7IMtmeyDbZnrGC2Z6/MtmeyErZnsLK2Z68TtmeyE7ZnshS2Z7AXtmexZ7Znrza2Z6+ftmevb7Y2lHW3bwC3b67ht2+u4rdvruO2LZOct3SUdLd1hBm3dZOwt3SUdbd4ALYthLu3epRlt3upard7ic63epRxt36BiLd6lHS3gIFTt3qUdbeCALYtshq3hJRlt4WvCLeFg763ha7Ot4WEALeFic63hJRxt4uDbbeLsdO3i7Hft4ux3beLsGe3i6+Ot4SUdLeSsde3krHht5Kx3reSsG63krBpt5KxyreElHW3mQC2LbIgt5uUZbechAC3nLBEt5ywRrecrs63nInOt5uUcbeig223orBnt6KvCLeig763orHTt6Kx37eisd23oq+Ot5uUdLersde3q7Hht6ux3rersG63q7Bpt6uxyreblHW3sgC2LbDxt7SUZbe1i3e3tYnOt7WA4Le1gUy3tJR0t7qxZbe6sLW3uq9/t7qBU7e0lHW3vwC2LZZ3t8GUZbfCgYi3wonOt8GUdLfFgVO3wZR1t8cAti2yKLfJlGW3yrGFt8qxhrfKsYK3yrGAt8qxg7fJlHG30IUUt8mUdbfSAADAAE4Et9SyMLfVlGW31oYFt9aUk7fWivq31pPNt9aLe7fWsjG31sAATgS33bIyt9WUdLffsjO334RTt9+Ep7ffhK+334Tht9+FAbffhNu334Tot9/AAE4Et+iyO7ffnFe337I9t9+T0LffheK337I+t9+FQrffhUW334VHt9+FULffhVK334VUt9+FVrffhWC334Vit9+FZLffhWa334V0t9+FWLffhXe334V5t9+Fe7ffhYO334W6t9+FiLffhY6334WSt9+Fl7ffhZu334Wht9+Fp7ffhau334Wvt9+Ft7ffhcm334XLt9+Fzbffhc+334XRt9+F07ffhdW334XXt9+F2Lffhdu334Xet9+F4bffhb2334W/t9+FwrffhcS334XGt9+F5Lffhea334Xvt9+F8rffhfW334X3t9+F+7ffhf2334X/t9+GAbffhgO334YHt9+GDLffhg+334YUt9+GFrffhhi334Yat9+GHbffhiK334Ylt9+GK7ffhja334Y4t9+yQrffhpG337JDt9+FJ7ffhWu334Vtt9+IBrffiAy334gOt9+IELffiBS334cFt9+FGLffhey334Rtt9+FDrffhYC334ULt9+EY7ffhGa334Xpt9+FFbffhtm334USt9+FELffhHK31ZR1uE4At9STurhQlHS4UZxXuFGyTLhRk9G4UbJOuFGyT7hQlHW4VwC31LJQuFmUdLhaskO4WZR1uFwAAMAATgW4XpRluF+gILhelHS4YaAiAMAATga4Y7JYuGSUdLhlk9i4ZYZfuGWyWbhlsmi4ZYZYuGWyarhlhk+4ZYZTuGWGTLhlhlW4ZYZRuGWGcrhlsmy4ZbJruGWGaLhlsm64ZYgKuGSUdbh3AADAAE4HuHmyb7h6lHS4e7JwuHuUPbh7hl+4e5Q+uHuyc7h7hli4e7J0uHuGT7h7hlO4e7J1uHuGTLh7hlW4e4ZRuHuGcrh7sne4e7J2uHuGaLh7sni4e4gKuHqUdbiPAADAAE4IuJGUdLiSso24kbJ6uJSUdLiVlMW4lJR1uJcAuJGye7iZlGW4msAATgi4m7J8uJmUdLidlMW4mZR1uJ8AuJGyfbihlGW4osAATgi4o7J+uKOyf7ijsny4oZRzuKcAuKGUcbipsoC4qZTkuKGUdLisrIq4rJTFuKyU5rihlHW4sIVouJGygbiylGW4s60ouLOygriylHS4tqyOuLayg7i2hKm4toRTuLaIEri2hjy4spR1uL0AAMAATgm4v5XJuMCUZbjBgRa4wJR0uMOC4rjDguO4w4LpuMCUdbjHAADAAE4KuMmylLjKlGW4y4zquMuZP7jLmTC4y4w0uMqUcbjQkKC40IDguNCB17jKlHS41Ce4ypR1uNYAuMmZWbjYlGW42cAATgq42rKVuNqylrjaspe42rKYuNqymbjYlHS44JnauOCHCrjgwABOCrjjspq447KhuOOyorjjspu447KcuOOynbjjsqW447KeuOOyrbjgsqC44LKruNiUdbjvAADAAE4LuPGUdLjyjr648oCEuPKcQLjxmoy49pRluPeMsrj3mv+494y1uPeMqLj3mwC497K1uPeNYrj3jWS49pR0uQCytrkAsri5ALK5uPaUdbkEALjxsrq5BpRluQeTr7kHsru5B7K8uQeK4bkGlHS5DLK9uQyyvrkMhNu5DIThuQyFAbkMhFO5DIUnuQyGDLkGlHW5FQC48bLFuReUZbkYivG5GLLGuRiyx7kYssi5GLLJuReUdLkessq5HrLMuR6yzbkehh25HoYluR6yzrkess+5HrLQuReUdbknALjxstG5KZRluSqy0rkplHS5LLK/uSyy1Lkshiu5LIYauSmUdbkxALjxsti5M5RluTSy07k0stm5NLLauTSy27k0sty5NLLduTSF8bkzlHS5PLLeuTyy4Lk8suy5PLLruTyF77k8hfK5PIX3uTyF9bk8hfu5PLLpuTyF/bk8hf+5PIYBuTyGA7k8hge5PIYMuTyGD7k8hha5PIYYuTyGHbk8hiW5PIYruTyGNrk8hji5PIgMuTOUdblWALjxswK5WJRluVmzA7lYlHS5W7K/uVuy4Llbsuy5W7LruVuGK7lbhhq5WJR1uWIAuPGzDLlklGW5ZbMNuWWzDrlklHS5aLK/uWiy7Llosuu5aIYauWSUdbltALjxsxK5b5RluXCy57lwiQG5cLLhuXCJA7lwiQa5cIkIuXCJCrlwiQy5cLMGuXCJDrlwiRC5cIkSuXCy5LlwsxO5cIkbuXCJILlwiR25cIkeuXCJIrlwiSS5cICQuXCJJ7lwiSi5cIk0uXCJVLlwiVi5cIlauXCy+7lwiV25cIlcuXCy1rlwiWK5cIlkuXCJZrlwiRq5cIu7uXCcXLlvlHO5lrMUuW+UdbmYwABOC7mZgSYAwABODLmblGW5nMAATgy5nbNCuZ2zQ7mblHS5oMAATgy5obNEuaGzRbmhs0e5obNJuaGzTLmbsxe5p5RluajAAE4MuamzGLmpsxm5qbMauamzG7mph2m5p5R0ua/AAE4MubCzH7mwsyK5sLMlubCzJrmvhQG5r4V5ua+Fe7mviym5r7MruaeUdbm6ALmbsy25vJRlub3AAE4Mub6zGLm+sxm5vrMuubyUdLnCwABODLnDsy+5w7M3ucOzIrnDsyS5w7M/ucKOWrm8lHW5ygAAwABODbnMlHS5zY6+ucyzTrnPlGW50LNPudCAkLnQgRa50JxYuc+UdLnVjlq51bNQuc+UdbnYALnMs1m52pRluduBFrnbgJC525ZmuduzT7nalHS54JPwueCFYLnghWK54IV3ueDAAE4NueWzWrnls2G55bNdudqUdbnpALnMs2i565RlueyWZrnrlHS57rNpue6FELnrlHW58QAAwABODrnznEG59JRlufWzb7n0lHO59wC59JR0ufmJ1rn0lHW5+8AATg65/IEmAMAATg+5/pxCuf+UZboAnAm6AIbFugDAAE4PugOzdbn/lHG6BYbduf+UdLoHhuG6B4biugeT97oHn7K5/5R1ugwAAMAAThC6DpR0ug+OvroOs3a6EZR0uhLAAE4QuhOzd7oTs3i6E7N8uhKF8roShfW6EZR1uhkAAMAAThG6G5R0uhyOvrobs3+6HpRluh/AAE4RuiCzgLogs4G6ILOCuh6UdLokhXm6HpR1uiYAAMAAThK6KJRluimz8Lops/G6KbPyuimz87ops/S6KbP1uimz9rops/e6KbP4uiizhbozlGW6NIMoujTAAE4SujaEdbo0gaa6NLOYujSzmbo0s5q6NLObujSznLo0s526NLOeujSzn7o0s6C6NLOhujSzoro0s6O6NLOkujSzpbo0s6a6NJs1ujSbSLo0s6e6M5R0ukuBU7ozlHW6TQC6KLOouk+UZbpQgyi6UMAAThK6UoR1ulCBprpQs6y6ULOtulCzrrpPlHS6WIFTuk+UdbpaALoos6+6XJRlul2Ot7pdgJC6XYMoul2BFrpdieK6XYnmul2JLbpdiSW6XYk7ul2JTbpdiU+6XYlQul2zsLpds7G6XbOyul2zs7pds7S6XbO1ul2ztrpds7e6XbO4ul2zubpds7q6XbO7ul2zvLpds726XbO+ul2zv7pds8C6XbPBul2zwrpds8O6XbPEul2zxbpds8a6XJR0uoGz57qBhpS6XJR1uoQAuiicR7qGlGW6h7Puuoez77qGlHW6igAAwABOE7qMlHS6jY6+uoyz+rqPlGW6kIMoupCz7rqQs++6kInkupCz+7qPlHS6loRTupaEr7qWhKe6lsAAThO6mrP8upq0BLqatAC6mrP+upq0ArqatBG6mrQQupq0A7qatB66mrQfupq0ILqatA26mrP9upq0I7qatAa6j5R1uqoAuoy0JLqslGW6rYPyuq2IRbqslHW6sAAAwABOFLqylHS6s46+urK0Jrq1lGW6trPuuraz77q2wABOFLq5jri6tq2Nuraz+7q2tCe6tZRxur60KLq1lHS6wIRTusCEp7rAhNu6wIThusCFAbrAhVC6wIVSusCFebrAwABOFLrJtDK6ybQxusm0OLrJtC26ybQsusm0OrrJtCu6ybQ7usm0KbrAhXS6tZR1utQAurK0PrrWlHW61wAAwABOFbrZtEC62pR0utuOobrbnXi6251Mutude7rbnXy62pR1uuEAutm0QbrjlGW65JAZuuSOXLrkjp265ISfuuOUdLrpwABOFbrqtEK66YSnuumFAbrphOG66YTbuuOUdbrwALrZtFK68pRluvPAAE4VuvSyfLr0tFO69LRUuvS0VbrylHS6+bRFuvmOW7r5tEu6+Y5ouvm0VrrylHW6/wAAwABOFrsBlGW7ArUNuwGUdLsEtQ67AbRkuwaUZbsHwABOFrsItGW7CLRmuwi0Z7sItGi7CLRpuwaUdLsOslS7DsAATha7ELRsuxC0bbsOnZe7Dp2Yuw6dmbsOnZq7Dp2cuw6dnbsOnZ67Dp2buwaUdbsbALsBtHG7HZR0ux60crseiBS7HoXvux6F8rsehfe7HoX7ux6F/bsehf+7HoYBux6GA7sehge7HoYMux6GD7sehha7HoYYux6GGrsehh27HoYlux6GK7sehja7HoY4ux2Udbs0ALsBtHW7NpRluze0drs3tHe7N7R4uze0ebs3tHq7N7R7uze0fLs2lHG7P7R9uzaUdLtBjAy7QbR+u0HAAE4Wu0SazrtEtIK7RJrXu0S0hrtEtIe7QYThu0GGOLtBhd67QYY2u0GFRbtBhUe7QYYdu0GGJbtBhgG7QYYDu0GGB7tBhgy7QYYPuzaUdbtXALsBtIi7WZRlu1qDKLtawABOFrtchHW7WoGmu1q0irtatIu7WZR0u2GBU7tZlHW7YwC7AbSMu2WUZbtmgL67ZsAATha7aLSNu2i0jrtotI+7aLRmu2i0kLtonWy7aLSRu2i0krtotJO7aLRlu2i0lLtotJW7aLSWu2i0l7totJi7aLSZu2i0mrtotJu7aLSdu2iOuLtotJ67aLSfu2i0oLtotKG7aLSiu2id+btotKO7aLSku2i0pbtotKa7aLSnu2i0qLtmnXO7Zp11u2a0nLtllHS7jJ1vu4zAAE4Wu460sruOmwG7jrS5u460rLuOmtO7jrS/u460wLuOtMG7jrS+u460wruOtMW7jrTGu460ybuOtMy7jrTNu460r7uOtM67jrTPu4600buOtNO7jrTUu4600LuOtN67jrTfu4604LuOtOG7jrTiu4605buOtOa7jrTou4607ruOtPS7jJ0Xu4yHBbuMhbe7jIXEu4yFv7uMhcK7jIWOu4yFe7uMhVi7jIVUu4yFVruMhd67jIWAu4yFQruMha+7jIXku4yF5ruMhdO7jIWIu4yF17uMhXS7jIVQu4yFUruMhXe7jIVgu4yFYruMhYO7jIXGu4yFz7uMhWS7jIV5u4yFZruMhZK7jIW9u4yFybuMhc27jIXRu4yFy7uMhUW7jIVHu4yF6buMhey7jIX7u4yF8ruMhfW7jIX/u4yGFruMhgO7jIX3u4yF77uMhgy7jIYHu4yGOLuMhhi7jIX9u4yGGruMhg+7jIYdu4yGJbuMhja7jIYBu4yGK7uMhQ67jIUSu4yFELuMhRW7jIUYu4yFC7uMheG7ZZRxu/TAAE4Wu/W01bv1tNa79bTXu/W02Lv1tNm79bTau/W027v1tNy79Yi7u/W03btllHW8AAC7AbT/vAKUZbwDkCq8A7UAvAO1AbwDhUm8A46evAKUdLwJnfe8CZ1EvAmICrwJhk+8CYZRvAmGVbwJhlO8CYZovAmGWLwJhnK8ApR1vBQAvBS1ArsBtQq8F5RlvBidFrwYi0q8F5R0vBu0u7wbwABO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tf6+lrWEvpa2AL6WtgG+lrYCvpa2A76WtgW+lrYGvpa2CL6Wtgm+lrYKvpa1YL6Wtgu+lrYMvpa2Db6Wtg++lrYQvpa2Er6WtWG+lrVivpa1Y76WthO+lrYUvpa2Fr6Wthe+lrYYvpa2Gb6Wthu+lrYcvpa2Hb6Wth6+lrYfvpa2Ib6WtiK+lrYjvpa2Jb6Wtia+lrVlvpa2KL6Wtiq+lrYrvpa2LL6Wti6+lrYwvpa2Mb6WtjK+lrVkvpa2M76WtWm+lrWOvpa2NL6Wtja+lpY/vpaDvr6WtbO+lrC/vpa1tL6WrnK+lqlrvpaBiL6WlVm+lq+xvpWUcb7ztjm+87Y6vvO2O77ztbG+87Y8vvO2Pb7ztbq+87WyvvO2Pr7ztj++87ZAvvO2Qb7ztkK+87ZDvvOBPr6VlHS/A4FTvpWUdb8FAADAAE4evweUZr8Iq5q/B5R0vwq2z78KwABOHr8MttC/B6uZvw6UZb8Ptl+/D6uivw+ro78PwABOHr8TtmC/E7ZhvxO2Yr8Pq7O/D7XIvw+u7b8PtmO/D4sFvw+rtb8PtmS/D4cHvw+2Zb8OlHK/IKuhvw6UdL8iq6q/IqutvyKrq78iq66/IrGzvyKvFr8itmu/IquwvyK2bb8iq7a/IrZuvyK2b78itnG/IrZzvyK2db8itna/IrZ3vyK2eL8itny/IrZ9vyK2fr8iq7i/Iqu5vyKrur8itnq/IrZyvyK2gL8itnS/Iqu9vyKrqL8itoK/IraDvyK2nL8itpq/IraPvyK2mb8itpS/IraVvyK2kr8itpu/IraYvyK2l78itpa/IraOvyK2ir8ito2/IraMvyK2kb8itpO/IrafvyK2ib8itp2/IraEvyK2hb8itqS/IralvyK2o78itqu/IraqvyK2bL8iwABOHr9ftqi/IraHvyK2iL8itrS/IraQvyK2i78itri/Ira6vyK2vr8itr+/Ira3vyK2wL8itra/Iq4gvyK2u78itrC/DpRxv3CroL9wq6y/DpR1v3MAvwe2xr91lHG/dj2/doFWv3Yiv3aBab92hw+/doDiv3aMy791lHS/fp+Xv36fmL9+gbG/fiu/fotWv36H/r9+gae/fp+Zv36OFb9+hry/foNLv36fnb9+gqG/foRCv36PFb9+nwK/fpUjv36fn79+jiu/fp+gv36AoL9+g0q/fja/foE0v341v36cLL+Yn6G/mJ+iv5ifpb9+jo2/fp8Kv36N/79+nXS/foOTv36Aob9+ns6/fp+mv36BP79+iF+/fppYv36PGL9+g9m/foHjv36frL9+gTm/fo6Cv36Uq79+n7G/fp+yv36O1b9+n7O/fp+1v36BU791lHK/tIFpv7SHD791lHW/twC/B4rSv7mUZb+6tse/urbIv7mUcb+9gOC/uZR0v78pv7+AnL+/Nr+/tsq/v7bLv7mUcr/FgOC/uZR1v8cAvwerm7/JlGW/yrbOv8qEPr/Ktmi/yrZpv8q2ar/JlHW/0AAAwABOH7/SlHS/07Zdv9Krn7/VlHG/1oDgv9apa7/Wtta/1rB0v9aVZ7/WLr/Wimm/1rZ7v9WUdL/frmq/1ZR1v+EAv9K227/jlHS/5IFTv+OUcb/mtta/45R1v+gAv9K2Wr/qlGW/65Vnv+qUdL/tgVO/6pRxv++21r/qlHW/8QC/0rbev/OUZb/0lWe/85R0v/aBU7/zlHG/+LbWv/OUdb/6AL/StuC//JRlv/2VZ7/8lHS//4FTv/yUccAAQAG21r/8lHXAAEADAL/SqQTAAEAFlGXAAEAGqWrAAEAFlHHAAEAIttbAAEAFlHTAAEAKgVPAAEAFlHXAAEAMAL/SqRPAAEAOlGXAAEAPLsAAQA+KacAAQA6UdMAAQBKBU8AAQA6UccAAQBSwccAAQBSA4MAAQBS21sAAQA6UdcAAQBgAv9KpF8AAQBqUZcAAQBu21sAAQBuKacAAQBqUdMAAQB6BU8AAQBqUccAAQCCwccAAQBqUdcAAQCIAv9Ko+MAAQCSUZcAAQCW2e8AAQCSUdMAAQCeBU8AAQCSUccAAQCm21sAAQCSUdcAAQCsAAMAATiDAAEAtq8TAAEAulGXAAEAvg2DAAEAulHHAAEAxhADAAEAxg23AAEAxic7AAEAxr+HAAEAxr47AAEAxr/DAAEAxhMHAAEAxifrAAEAxhQDAAEAxiffAAEAxhNbAAEAxhP3AAEAxtufAAEAxtujAAEAxtunAAEAxhMbAAEAxrr7AAEAxr+jAAEAxr+nAAEAxr+bAAEAxrFXAAEAxr+7AAEAxsL/AAEAxg3/AAEAxg73AAEAxhDvAAEAxifvAAEAxr+TAAEAxsgnAAEAxrE/AAEAulHTAAEBQturAAEBQtuvAAEBQtuzAAEAulHXAAEBUAMAAQC227cAAQFaUZcAAQFeDYMAAQFaUccAAQFmv4cAAQFmv8MAAQFmEwcAAQFmJ+sAAQFmFAMAAQFmJ98AAQFmE1sAAQFmE/cAAQFm258AAQFm26MAAQFm26cAAQFmExsAAQFmuvsAAQFmv6MAAQFmv6cAAQFmv5sAAQFmsVcAAQFmv7sAAQFmwv8AAQFmDf8AAQFmDvcAAQFmEO8AAQFmJ+8AAQFmv5MAAQFmyCcAAQFmsT8AAQFaUdMAAQHS26sAAQHS268AAQHS27MAAQFaUdcAAQHgAAMAATiHAAEB6q8XAAEB7lGXAAEB8sK/AAEB8g1PAAEB8i0TAAEB8rD/AAEB8tvjAAEB8tvnAAEB8tvrAAEB8tvvAAEB7lHHAAECFhJjAAECFtvzAAECFgzTAAECFhJzAAECFtv3AAECFhKPAAECFtv7AAECFg1TAAECFtv/AAECFgSzAAECFr+HAAECFtwPAAECFibzAAECFib7AAECFib/AAEB7lHLAAECVg1TAAEB7lHTAAECXtwDAAECXsgHAAECXsTzAAECXgbHAAECXtwLAAECXg2TAAECXtwTAAECXtwXAAECXtwbAAECXtwfAAECXtwjAAECXtwnAAECXtwrAAECXtwzAAECXtw7AAECXtw/AAECXtxDAAECXtxHAAECXtxLAAECXtxPAAECXtxTAAECXtxXAAECXtxbAAECXtxfAAECXlCPAAECXr9DAAECXlm7AAEB7lHXAAECzAMAAQHq3GMAAQLWUZcAAQLawr8AAQLaDU8AAQLaLRMAAQLasP8AAQLaEmMAAQLa2/MAAQLa2+MAAQLa2+cAAQLa2+sAAQLa2+8AAQLbAAE4hwABAwbcZwABAwbcawABAwbcbwABAwZYRwABAtZRxwABAxrIlwABAxoM0wABAxrb9wABAxoSjwABAxrccwABAxrb+wABAxoScwABAxrb/wABAxq/hwABAxoVfwABAxom8wABAxom+wABAxom/wABAxrchwABAxq+OwABAtZR0wABA1rcAwABA1rIBwABA1q/iwABA1rE8wABA1oGxwABA1q8NwABA1rcCwABA1oNkwABA1rciwABA1rcEwABA1rckwABA1rcFwABA1rcGwABA1rcHwABA1rcIwABA1rcJwABA1rc3wABA1rczwABA1rc7wABA1rcK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AMAATivAAEIcq87AAEIdlGXAAEIerDrAAEIerDvAAEIehFbAAEIeic7AAEIdlHHAAEIjg23AAEIdlHTAAEIlt4XAAEIdlHXAAEInAADAAE4swABCKZR0wABCKrfhwABCKavPwABCLJRlwABCLYnrwABCLYnswABCLaw4wABCLZV8wABCLYthwABCLYRWwABCLbfcwABCLYnOwABCLbfdwABCLbfewABCLJRxwABCOINtwABCLJR0wABCOrfgwABCLJR1wABCPAAAwABOLcAAQj635MAAQj+UZcAAQkDAAE4twABCQbflwABCQbfmwABCQZZhwABCQZRfwABCQLfnwABCP5RxwABCR4QAwABCP5R0wABCSYFTwABCP5R1wABCSwDAAEI+mnDAAEJNlGXAAEJOsLHAAEJOlJPAAEJOt+nAAEJOlIXAAEJNlHHAAEJTPcAAQlOsLMAAQlOsRsAAQlO3+cAAQlOvB8AAQlOQOcAAQk2UdMAAQlq368AAQlqsIcAAQlq38sAAQlq39MAAQlqsh8AAQlq39cAAQlqxkcAAQlq398AAQlq3+MAAQlqT98AAQlqv8sAAQlqvDcAAQlq3m8AAQlq3bcAAQlq3b8AAQlqxucAAQlqxksAAQlqvCsAAQlqxusAAQlqxycAAQlqIAMAAQlqERsAAQlq3+sAAQlq3+8AAQlqBscAAQlq3/sAAQlq4AMAAQk2UcsAAQnaEAMAAQk2UdcAAQngAwABCeLe5wABCeJyMwABCeLfqwABCPrgCwABCfZRlwABCfpr2wABCfoOawABCfZR0wABCgYGxwABCgZP3wABCgYFTwABCfZR1wABChQDAAEI+uATAAEKHlHTAAEKIt7rAAEKHlHHAAEKKwABOLcAAQou35cAAQou35sAAQouWYcAAQoeUdcAAQo8AwABCPrgFwABCkZRlwABCkpppwABCkZR0wABClIRDwABClLewwABClIRGwABClCnAAEKRlHXAAEKZAMAAQj64BsAAQpuUZcAAQpyaacAAQpuUdMAAQp6EQ8AAQp4pwABCm5R1wABCoQDAAEI+uAfAAEKjlGXAAEKkgYjAAEKkh4PAAEKkic7AAEKkg23AAEKjlHHAAEKpgL7AAEKpr/DAAEKpgJbAAEKpr47AAEKjlHXAAEKuAMAAQj64CMAAQrCUccAAQrGEAMAAQrGE1sAAQrGJ98AAQrGv7sAAQrGE/cAAQrGDf8AAQrGuvsAAQrGv6MAAQrGv6cAAQrGDvcAAQrGJ+8AAQrGv5MAAQrGv5sAAQrGAlsAAQrCUdcAAQsAAwABCPrgJwABCwpRxwABCw4QAwABCw4CWwABCwpR0wABCxrgKwABCwpR1wABCyADAAEI+uAvAAELKlHHAAELLhETAAELLr/HAAELLuAzAAELLuA3AAELLhirAAELLhjTAAELLrITAAELLgRXAAELLg77AAELLrEbAAELLt/nAAELKlHLAAELXhADAAELKlHTAAELZtwDAAEI+uBDAAELblHHAAELchETAAELcr/HAAELcuAzAAELcuA3AAELchirAAELchjTAAELcrITAAELcgRXAAELcg77AAELcrEbAAELct/nAAELblHLAAELohADAAELblHTAAELqtwDAAELblHXAAELsAMAAQj64EcAAQu6UdcAAQu8AwABCPrgSwABC8ZRlwABC8pr2wABC8oLowABC8kDAAELxlHTAAEL2PsAAQvGUdcAAQvgAwABCPrgTwABC+pRlwABC+7gUwABC+7gVwABC+4GIwABC+pR0wABC/z7AAEL6lHXAAEMBAADAAE4uwABDA5R0wABDBLhCwABDA6vQwABDBpRlwABDB7cDwABDB7b/wABDB4NUwABDB4SbwABDB6wywABDB7gZwABDBpRxwABDDoEswABDDoEVwABDBpR0wABDEayOwABDEbgewABDEbgfwABDEbbrwABDEbggwABDEYCkwABDEbghwABDEbgkwABDEbglwABDEcAATi7AAEMbuCbAAEMbuDXAAEMRuDbAAEMRuD7AAEMRtuzAAEMGlHXAAEMhAADAAE4vwABDI5R0wABDJKvRAMAATjDAAEMmlHTAAEMnq9LAAEMnEcAAQya4TsAAQyqUZcAAQyu4T8AAQyu4UMAAQyqUdMAAQy64UcAAQy64VMAAQy64VcAAQy64V8AAQy64WcAAQyqUdcAAQzQAAMAATjHAAEM2lHTAAEM3uBjAAEM3uGnAAEM3t9oAwABOMsAAQzuUdMAAQzy5NcAAQzy5NsAAQzy5N8AAQzy5OMAAQzy5OcAAQzy5OsAAQzy5O8AAQzy5QcAAQzy5QsAAQzy5Q8AAQzyv28AAQzy5RMAAQzyvYMAAQzu4bsAAQ0qUdMAAQ0u4b8AAQ0u4cMAAQ0qUdcAAQ04AwABDO7hxwABDUJR0wABDUbhvwABDUJR1wABDUwDAAEM7uHLAAENVlHTAAENWuG/AAENVlHXAAENYAMAAQzu4c8AAQ1qUZcAAQ1uBrcAAQ1qUdMAAQ124b8AAQ124cMAAQ1qUdcAAQ2AAwABDO7h4wABDYpRlwABDY4eDwABDY7h5wABDY7h6wABDY4LowABDYpR1wABDaADAAEM7uHvAAENqlHTAAENrg/jAAENrhT7AAENruH7AAENqlHXAAENvAMAAQzu4f8AAQ3GUZcAAQ3KFFMAAQ3KGCsAAQ3KxgsAAQ3Kxg8AAQ3KE+MAAQ3KGC8AAQ3Kv8MAAQ3KGCcAAQ3GUdMAAQ3u4fsAAQ3uD+8AAQ3uEAsAAQ3GUdcAAQ38AwABDO7iBwABDgZRlwABDgo1OwABDgrEGwABDgozNwABDgZR0wABDhrh+wABDhoP7wABDhoQCwABDgZR1wABDigDAAEM7uIPAAEOMlGXAAEONscLAAEOMlHXAAEOPAMAAQzu4hMAAQ5GUZcAAQ5KwbcAAQ5K4hcAAQ5GUdcAAQ5UAwABDO7iGwABDl5RlwABDmIMowABDmMAATjLAAEOahHXAAEOYgabAAEOYuKrAAEOYuKvAAEOYuKzAAEOYuK3AAEOYuK7AAEOYuK/AAEOYuLDAAEOYuLHAAEOYuLLAAEOYuLPAAEOYuLTAAEOYuLXAAEOYuLbAAEOYuLfAAEOYuLjAAEOYuLnAAEOYuLrAAEOYuLvAAEOYuLzAAEOYuL3AAEOYuL7AAEOYuL/AAEOYuMDAAEOYuMHAAEOYuMLAAEOYuMPAAEOYuMTAAEOYuMXAAEOYuMbAAEOYuMfAAEOYuMjAAEOYuMnAAEOYuMrAAEOYuMvAAEOYuMzAAEOXlHTAAEPAgVPAAEOXlHXAAEPCAMAAQzu4zcAAQ8SUccAAQ8WDvsAAQ8SUdMAAQ8eD+MAAQ8eFPsAAQ8eFM8AAQ8e4fsAAQ8SUdcAAQ8wAwABDO7jQwABDzpRlwABDz8AATjLAAEPQuHTAAEPQuHXAAEPQuHfAAEPQuHbAAEPOlHTAAEPVwABOMsAAQ9a418AAQ9W42MAAQ9W42cAAQ86UdcAAQ9oAwABD2rjRwABDO7irwABD3ZRlwABD3oUUwABD3q+lwABD3oWQwABD3ZR0wABD4rh+wABD4q+rwABD4oP7wABD4oQCwABD3ZRxwABD54O+wABD3ZR1wABD6QDAAEM7uLHAAEPrlGXAAEPshRTAAEPshX7AAEPrlHTAAEPvuH7AAEPvg/vAAEPvhALAAEPrlHHAAEPzg77AAEPrlHXAAEP1AMAAQzu43MAAQ/eUdMAAQ/i4fsAAQ/eUdcAAQ/oAwABDO7jdwABD/JRlwABD/a9qwABD/JR0wABD/7h+wABD/JR1wABEAQDAAEM7uN/AAEQDlGXAAEQEsWTAAEQDlHTAAEQGuODAAEQDlHXAAEQIAMAAQzu44cAARAqUZcAARAuAvsAARAu44sAARAqUdMAARA64fsAARAqUdcAARBAAwABDO7jkwABEEpRlwABEE4WFwABEE4WHwABEEpR0wABEFrh+wABEFoP7wABEFoQCwABEEpRxwABEGoO+wABEEpR1wABEHADAAEM7uObAAEQelHTAAEQfuH7AAEQelHXAAEQhAMAAQzu458AARCOUZcAARCScj8AARCOUdMAARCa46MAARCa4fsAARCOUdcAARCkAwABDO7jtwABEK5RlwABELJyPwABELIQBwABELK+WwABEK5R0wABEMLjowABEMLjuwABEMLh+wABEK5R1wABENADAAEM7uPDAAEQ2lHTAAEQ3uH7AAEQ2lHXAAEQ5AMAAQzu48sAARDuUZcAARDyDwcAARDyBPsAARDuUdMAARD+4fsAARDuUdcAAREEAwABDO7izwABEQ5RlwABERIV+wABERIGtwABEQ5R0wABER7h+wABER4P7wABER4QCwABEQ5RxwABES4O+wABEQ5R1wABETQDAAEM7uPXAAERPlHTAAERQuH7AAERPlHXAAERSAMAAQzu4xMAARFSUZcAARFWFFMAARFWcnMAARFSUdMAARFi4fsAARFiD+8AARFiEAsAARFSUccAARFyDvsAARFSUdcAARF4AwABDO7jFwABEYJRlwABEYYUUwABEYYpgwABEYJR0wABEZLh+wABEZIP7wABEZIQCwABEYJRxwABEaIO+wABEYJR1wABEagDAAEM7uMbAAERslGXAAERthRTAAERtRcAARGyUdMAARHC4fsAARHCD+8AARHCEAsAARGyUccAARHSDvsAARGyUdcAARHYAwABDO7j6wABEeJRlwABEebAVwABEeJR1wABEewDAAEM7uPvAAER9lHTAAER+uP3AAER+uP7AAER+uQDAAER+uQHAAER+uQPAAER+uQXAAER9lHXAAESFuPzAAEM7q9TAAESHlGXAAESIsCjAAESIuQbAAESIr1nAAESIrs7AAESIuQTAAESIuQLAAESIsVrAAESIuQfAAESIuQjAAESIuQnAAESHlHXAAESTAMAARJO5CsAARJOGM8AAQzu5C8AARJeUZcAARJiv3cAARJiaacAARJiv3MAARJeUdcAARJwAwABDO7kMwABEnpRlwABEn4GtwABEnpR1wABEoQDAAEM7uL/AAESjlGXAAESkhFvAAESkgL7AAESjlHTAAESnuH7AAESng/vAAESnhALAAESjlHHAAESrg77AAESjlHXAAEStAMAAQzu4usAARK+UZcAARLCFFMAARLCKYMAARLBFwABEsLkKwABEr5R0wABEtbh+wABEtYP7wABEtYQCwABEr5RxwABEuYO+wABEr5R1wABEuwDAAEM7uLvAAES9lGXAAES+imDAAES+RcAARL65CsAARL2UdMAARMK4fsAARMKD+8AARMKEAsAARL2UccAARMaDvsAARL2UdcAARMgAwABDO7itwABEypRlwABEy4RHwABEy7kQwABEy4VJwABEy7kRwABEy5ZVwABEy7kSwABEy40xwABEy4LmwABEy7kTwABEy7kKwABEy618wABEy7kUwABEy4fdwABEypR0wABE2bh+wABE2YP7wABE2YQCwABEypRxwABE3YO+wABEypR1wABE3wDAAEM7uK/AAEThlGXAAETihUnAAETiuRHAAETiuRLAAETijTHAAETiuQrAAETiuRPAAETirXzAAETiuRTAAETih93AAEThlHTAAETsuH7AAETsg/vAAETshALAAEThlHHAAETwg77AAEThlHXAAETyAMAAQzu4yMAARPSUZcAARPWFFMAARPWKYMAARPVFwABE9JR0wABE+bh+wABE+YP7wABE+YQCwABE9JRxwABE/YO+wABE9JR1wABE/wDAAET/uRfAAEM7uMDAAEUClGXAAEUDimDAAEUDRcAARQKUdMAARQa4fsAARQaD+8AARQaEAsAARQKUccAARQqDvsAARQKUdcAARQwAwABDO7jJwABFDpRlwABFD4pgwABFD0XAAEUOlHTAAEUSuH7AAEUSg/vAAEUShALAAEUOlHHAAEUWg77AAEUOlHXAAEUYAMAAQzu4y8AARRqUZcAARRuKYMAARRtFwABFGpR0wABFHrh+wABFHoP7wABFHoQCwABFGpRxwABFIoO+wABFGpR1wABFJADAAEM7uL3AAEUmlGXAAEUnhUnAAEUngyjAAEUmlHTAAEUquH7AAEUqg/vAAEUqhALAAEUmlHHAAEUug77AAEUmlHXAAEUwAMAAQzu4vsAARTKUZcAARTOFScAARTODKMAARTOBPsAARTO5CsAARTO5E8AARTKUdMAARTm4fsAARTmD+8AARTmEAsAARTKUccAART2DvsAARTKUdcAART8AwABDO7jKwABFQZRlwABFQoLmwABFQoMowABFQoE+wABFQZR0wABFRrh+wABFRoP7wABFRoQCwABFQZRxwABFSoO+wABFQZR1wABFTADAAEM7uLTAAEVOlGXAAEVPhEfAAEVPuRDAAEVPhUnAAEVPgubAAEVPgyjAAEVPgT7AAEVOlHTAAEVWuH7AAEVWg/vAAEVWhALAAEVOlHHAAEVag77AAEVOlHXAAEVcAMAAQzu4ucAARV6UZcAARV+FScAARV+DKMAARV+BPsAARV+tfMAARV+5IMAARV+H3cAARV+5CsAARV+5E8AARV6UdMAARWi4fsAARWiD+8AARWiEAsAARV6UccAARWyDvsAARV6UdcAARW4AwABDO7i8wABFcJRlwABFcZZVwABFcYLmwABFcYMowABFcYE+wABFca18wABFcbkgwABFcYfdwABFcbkKwABFcJR0wABFerh+wABFeoP7wABFeoQCwABFcJRxwABFfoO+wABFcJR1wABFgADAAEM7uLjAAEWClGXAAEWDhEfAAEWDuRDAAEWDhUnAAEWDllXAAEWDgubAAEWDgyjAAEWDgT7AAEWDrXzAAEWDuSDAAEWDh93AAEWDuQrAAEWDuRPAAEWClHTAAEWQuH7AAEWQg/vAAEWQhALAAEWClHHAAEWUg77AAEWClHXAAEWWAMAAQzu4rsAARZiUZcAARZmFScAARZmDKMAARZm5EsAARZmNMcAARZmtfMAARZmH3cAARZm5FMAARZm5CsAARZm5JMAARZm5E8AARZiUdMAARaS4fsAARaSD+8AARaSEAsAARZiUccAARaiDvsAARZiUdcAARaoAwABDO7jBwABFrJRlwABFrYVJwABFrbkRwABFrbkSwABFrY0xwABFra18wABFrYfdwABFrbkUwABFrbkKwABFrbkkwABFrJR0wABFt7h+wABFt4P7wABFt4QCwABFrJRxwABFu4O+wABFrJR1wABFvQDAAEM7uMPAAEW/lGXAAEXAhUnAAEXAgYjAAEXAgT7AAEXArXzAAEXAh93AAEXAuSDAAEXAuQrAAEW/lHTAAEXIuH7AAEXIg/vAAEXIhALAAEW/lHHAAEXMg77AAEW/lHXAAEXOAMAAQzu4sMAARdCUZcAARdGWVcAARdGC5sAARdGDKMAARdG5EsAARdGNMcAARdGtfMAARdGH3cAARdG5FMAARdG5CsAARdG5JMAARdCUdMAARdy4fsAARdyD+8AARdyEAsAARdCUccAAReCDvsAARdCUdcAAReIAwABDO7iswABF5JRlwABF5YRHwABF5bkQwABF5YVJwABF5ZZVwABF5YLmwABF5YMowABF5bkSwABF5Y0xwABF5a18wABF5YfdwABF5bkUwABF5bkKwABF5bkkwABF5bkTwABF5JR0wABF9Lh+wABF9IP7wABF9IQCwABF5JRxwABF+IO+wABF5JR1wABF+gDAAEM7uLbAAEX8lGXAAEX9hEfAAEX9uRDAAEX9hUnAAEX9gL7AAEX9gT7AAEX9uQrAAEX9uRPAAEX8lHTAAEYFuH7AAEYFg/vAAEYFhALAAEX8lHHAAEYJg77AAEX8lHXAAEYLAMAAQzu4wsAARg2UZcAARg6FFMAARg6FfsAARg2UdMAARhG4fsAARhGD+8AARhGEAsAARg2UccAARhWDvsAARg2UdcAARhcAwABDO7kswABGGZRlwABGGrkKwABGGrkTwABGGZR1wABGHQDAAEM7uLXAAEYflGXAAEYggL7AAEYgga3AAEYflHTAAEYjuH7AAEYjg/vAAEYjhALAAEYflHHAAEYng77AAEYflHXAAEYpAMAAQzu5LsAARiuUZcAARiyFhcAARiyFh8AARiyvusAARiuUdMAARjC4fsAARjCD+8AARjCEAsAARiuUccAARjSDvsAARiuUdcAARjYAwABDO6+zwABGOJRlwABGOYWFwABGObkSwABGOYWHwABGOJR0wABGPbh+wABGPYP7wABGPYQCwABGOJRxwABGQYO+wABGOJR1wABGQwDAAEM7uTHAAEZFlGXAAEZGuTLAAEZGhX7AAEZFlHTAAEZJuH7AAEZJg/vAAEZJhALAAEZFlHHAAEZNg77AAEZFlHXAAEZPAMAAQzuvlcAARlGUZcAARlKFfsAARlGUdMAARlS4fsAARlSD+8AARlSEAsAARlGUccAARliDvsAARlGUdcAARloAAMAATjPAAEZclHTAAEZduaDAAEZcq9XAAEZflGXAAEZggPjAAEZgq6LAAEZgrKLAAEZguUzAAEZgq/nAAEZggI3AAEZgsezAAEZguU3AAEZgse3AAEZguU7AAEZggPDAAEZgj9nAAEZguU/AAEZgwABOM8AARm65UMAARl+UdMAARnC5UcAARnC31MAARnCsBcAARnCsQ8AARnC31cAARnC5VsAARnC318AARnCsBsAARnCrk8AARnC5asAARnC5YMAARnC5XsAARnC5X8AARnDAAE4zwABGfrlpwABGcLl3wABGcLl2wABGcLl8wABGcLluwABGcLl7wABGcLl+wABGcLlawABGcLlhwABGcLlwwABGcLmGwABGcLlxwABGcKyTwABGcI/bwABGcKzawABGcLmawABGcKwMwABGX5RxwABGkLHuwABGkIlLwABGkInkwABGX5R1wABGlADAAEZcuZ3AAEaWlGXAAEaXq/nAAEaWlHTAAEaZic3AAEaWlHXAAEabAMAARly5nsAARp2UZcAARp6BD8AARp6AvsAARp63UcAARp2UdMAARqK5esAARp2UdcAARqQAAMAATjTAAEamq9bAAEanlGXAAEaogRTAAEanlHHAAEaqrJvAAEanlHTAAEasrHPAAEanlHXAAEauAADAAE41wABGsJRlwABGsbsewABGsbsfwABGsJR0wABGtLsgwABGtLsiwABGsKvXwABGt5RlwABGuLmywABGuKv5wABGuLmzwABGuLb/wABGuIQywABGuLmbwABGuJTfwABGuKw5wABGuKw8wABGuINtwABGuLm0wABGuLm1wABGuLm2wABGuIGIwABGuLm3wABGuLmcwABGuIbQwABGuLm4wABGuLm5wABGuLm6wABGuIEVwABGuLb5wABGuLm7wABGuLm8wABGuLgjwABGuLcjwABGuLHwwABGuMAATjXAAEbUub3AAEbUub7AAEbUub/AAEbUucDAAEbUucPAAEbUucTAAEa4rDLAAEa4uBnAAEa4t7zAAEa4ucHAAEa4ucLAAEa4ucXAAEa4uiLAAEa3lHHAAEbirIjAAEbirFTAAEbig8vAAEbihDvAAEbig1bAAEbitl7AAEbir47AAEbir+HAAEbigWfAAEa3lHTAAEbsjCrAAEbsujHAAEbsujLAAEbshDnAAEbsujjAAEbsujnAAEbsujzAAEbsukHAAEbsgV3AAEbsukTAAEbsukXAAEbsukbAAEbsrIrAAEbshFLAAEbsuk/AAEbsulDAAEbst4LAAEbsulbAAEbsrI7AAEbsulzAAEbsul3AAEbsul/AAEbsumLAAEbsumbAAEbsrIvAAEbst4bAAEbsuVvAAEbstuzAAEbst5bAAEbsumrAAEbst5PAAEbst5TAAEbsumvAAEbsumzAAEbsum7AAEbsujfAAEbsum/AAEbsrGDAAEbshEXAAEbsunTAAEbswABONcAARxW6csAARuy6e8AARuy6gcAARuy6ecAARuy6l8AARuyESMAARuy6pMAARuyEScAARuy6rcAARuy6s8AARuy6tcAARuy6ucAARuy6vMAARuy6vsAARuy3AMAARuy6WcAARuy6wcAARuy6WsAARuy3h8AARuy3iMAARuy3icAARuy6qMAARuy3isAARuy6kcAARuy3j8AARuy3kMAARuy3kcAARuy3lcAARuy3i8AARuy628AARuy63MAARuy63cAARuy3MsAARuy3OMAARuy3OcAARuy3NsAARuy3NMAARuywf8AARuywhMAARuywlsAARuywu8AARuywKcAARuyxIsAARuyxI8AARuy658AARuy66MAARuy3CcAARuy6o8AARuy3l8AARuy668AARuysNsAARuy67MAARuy67cAARreUdcAAR0uTnsAAR0u6LcAAR0sAwABGsLruwABHT5RlwABHUIMowABHUMAATjXAAEdShHXAAEdQgabAAEdQgRXAAEdQuvPAAEdQi0fAAEdQupLAAEdQuvTAAEdQuvXAAEdQuvbAAEdQhl7AAEdQuvfAAEdQuvjAAEdQuvnAAEdQuvrAAEdPlHTAAEdhgVPAAEdPlHXAAEdjAMAARrC6+8AAR2WUZcAAR2bAAE41wABHZ7r8wABHZ4R1wABHZ7r9wABHZ7r+wABHZ7r/wABHZoQAwABHZoMSwABHZoSYwABHZoLowABHZoQ0wABHZoPLwABHZoScwABHZZR0wABHdLo7wABHdLsBwABHdLsDwABHdLsEwABHdLsFwABHdLsGwABHdIwqwABHdLlbwABHdLouwABHdIFTwABHZZRxwABHf4O+wABHf4GIwABHf4nOwABHf7CvwABHf7sJwABHZZR1wABHhQDAAEeFgRXAAEawuxLAAEeIlGXAAEeJgYjAAEeJic7AAEeJulPAAEeJulTAAEeJuBvAAEeIlHXAAEePAMAARrC7E8AAR5GUZcAAR5KBiMAAR5KatsAAR5KJzsAAR5GUdcAAR5YAwABGsLsUwABHmJRlwABHmYCWwABHmYnOwABHmYDgwABHmYNtwABHmJR1wABHngDAAEawuxXAAEeglGXAAEehq7vAAEehq7zAAEehg23AAEehic7AAEehsHHAAEehujbAAEeglHHAAEeogdfAAEeglHTAAEeqJ8AAR6qBU8AAR6CUdcAAR60AwABGsLscwABHr5RxwABHsKu7wABHsKu8wABHsINtwABHsInOwABHsLBxwABHsLo2wABHr5R0wABHt4FTwABHr5R1wABHuQAAwABONsAAR7uUZcAAR7y7K8AAR7y7LcAAR7y7LsAAR7uUdMAAR8C7L8AAR8C7MMAAR8CuB8AAR8Cs0cAAR7uuBsAAR8WUZcAAR8aBTMAAR8aJzsAAR8YkwABHxq4NwABHxZR0wABHy4FTwABHxZR1wABHzQAAwABON8AAR8+UdMAAR9C7R8AAR9C7SADAAE44wABH05R0wABH1KzSwABH07tLwABH1pRlwABH15EfwABH162NwABH14NtwABH17tMwABH1pR0wABH3LtPwABH3LtSwABH3LtUwABH3K9hwABH3IW3wABH3IXvwABH3IRTwABH3ISnwABH3ITbwABH3IUBwABH3LtYwABH3IgKwABH3IZfwABH3IZYwABH3IV3wABH3IVgwABH3IViwABH3IV5wABH1pR1wABH7wAAwABOOcAAR/GUZcAAR/K7iMAAR/Gs08AAR/SUZcAAR/Wr/cAAR/W7Z8AAR/WBFMAAR/WAvsAAR/WyFsAAR/W7aMAAR/W5a8AAR/WshcAAR/WJJMAAR/WBacAAR/WsgsAAR/Ws38AAR/SUccAASAKQl8AASAK7acAASAK7asAAR/SUdMAASAaKYMAASAa7esAASAa5bcAASAasBsAASAa7e8AASAa7fMAASAavNcAASAasYMAASAa7fsAASAax98AASAa7hcAASAax/cAASAa6wsAASAa7hsAASAa3s8AASAa7h8AAR/SUdcAASBcAAMAATjrAAEgZlGXAAEgau4rAAEgau4vAAEgau4zAAEgau43AAEgau47AAEgau4/AAEgau5DAAEgau5HAAEgau5LAAEgau5PAAEgau5TAAEgau5XAAEgau5bAAEgau5fAAEgau5jAAEgau5nAAEgau5rAAEgau5vAAEgau5zAAEgau53AAEgau57AAEgau5/AAEgau6DAAEgau6HAAEgau6LAAEgau6PAAEgau6TAAEgau6XAAEgau6bAAEgau6fAAEgau6jAAEgau6nAAEgau6rAAEgau6vAAEgau6zAAEgau63AAEgau67AAEgau6/AAEgau7DAAEgau7HAAEgau7LAAEgau7PAAEgau7TAAEgau7XAAEgau7bAAEgau7fAAEgau7jAAEgau7nAAEgau7rAAEgau7vAAEgau7zAAEgau73AAEgau77AAEgau7/AAEgau8DAAEgau8HAAEgau8LAAEgau8PAAEgau8TAAEgau8XAAEgau8bAAEgau8fAAEgau8jAAEgau8nAAEgau8rAAEgau8vAAEgau8zAAEgau83AAEgau87AAEgau8/AAEgau9DAAEgau9HAAEgau9LAAEgau9PAAEgau9TAAEgau9XAAEgau9bAAEgau9fAAEgau9jAAEgau9nAAEgau9rAAEgau9vAAEgau9zAAEgau93AAEgau97AAEgau9/AAEgau+DAAEgau+HAAEgau+LAAEgau+PAAEgau+TAAEgau+XAAEgau+bAAEgau+fAAEgau+jAAEgau+nAAEgau+rAAEgau+vAAEgau+zAAEgau+3AAEgau+7AAEgau+/AAEgau/DAAEgau/HAAEgau/LAAEgau/PAAEgau/TAAEgau/XAAEgau/bAAEgau/fAAEgau/jAAEgau/nAAEgau/rAAEgau/vAAEgau/zAAEgau/3AAEgau/7AAEgau//AAEgavADAAEgavAHAAEgavALAAEgavAPAAEgavATAAEgavAXAAEgavAbAAEgavAfAAEgavAjAAEgavAnAAEgavArAAEgavAvAAEgavAzAAEgavA3AAEgavA7AAEgavA/AAEgavBDAAEgavBHAAEgavBLAAEgavBPAAEgavBTAAEgavBXAAEgavBbAAEgavBfAAEgavBjAAEgavBnAAEgavBrAAEgavBvAAEgavBzAAEgavB3AAEgavB7AAEgavB/AAEgavCDAAEgavCHAAEgavCLAAEgavCPAAEgavCTAAEgavCXAAEgavCbAAEgavCfAAEgavCjAAEgavCkAwABOO8AASLuUZcAASLzAAE47wABIvbwrwABIu5R0wABIv63VwABIv8AATjvAAEjBvC3AAEi/rfMAwABOPMAASMSUZcAASMW8PMAASMW8PcAASMW8PsAASMWuBcAASMW8P8AASMW8QMAASMW8QcAASMW8QsAASMWuBMAASMW8Q8AASMW8RMAASMW8RcAASMW7s8AASMW8RsAASMW8R8AASMW8SMAASMW8ScAASMW8SsAASMW8S8AASMW8TMAASMW8TcAASMW8TsAASMW8T8AASMW8UMAASMW7y8AASMW7zMAASMW7zcAASMW7zsAASMW7z8AASMW70MAASMW70cAASMW70sAASMW708AASMW71MAASMW8UcAASMW8UsAASMW8U8AASMW8VMAASMW8VcAASMW8VsAASMW8V8AASMW74sAASMW748AASMW75MAASMW75cAASMW75sAASMW758AASMW76MAASMW76cAASMW76sAASMW768AASMW77MAASMW77cAASMW77sAASMW778AASMW78MAASMW78cAASMW78sAASMW788AASMW79MAASMW79cAASMW79sAASMW798AASMW7+MAASMW7+cAASMW7+sAASMW7+8AASMW8WMAASMW8WcAASMW8WsAASMWuA8AASMW8BMAASMW8W8AASMW8CcAASMW8CsAASMW8C8AASMW8DMAASMW8DcAASMW8DsAASMW8D8AASMW8EMAASMW8EcAASMW8EsAASMW8E8AASMW8FMAASMW8FcAASMW8FsAASMW8F8AASMW8GMAASMW8GcAASMW8GsAASMW8G8AASMW8HMAASMW8HcAASMW8HsAASMW8H8AASMW8IMAASMW8IcAASMW8IsAASMW8XMAASMW8XcAASMW8XsAASMW8X8AASMW8YMAASMW8YcAASMW8YsAASMW8Y8AASMW8ZMAASMW8ZcAASMW8ZsAASMSUdMAASTS8Z8AASTS8acAASTS8asAASTS8bMAASTS8bcAASTS8bgDAAE49wABJO5RlwABJPLxwwABJPLxxwABJPK5gwABJPLxywABJPLxzwABJPLx0wABJPLx1wABJPLx2wABJPLx3wABJPLx4wABJPLx5wABJPLx6wABJPLx7wABJPLx8wABJPLx9wABJPLx+wABJPLx/wABJPLyAwABJPLyBwABJPLyCwABJPLyDwABJPLyEwABJPLyFwABJPLyGwABJPLyHwABJPLyIwABJPLyJwABJPLyKwABJPLyLwABJPLyMwABJPLyNwABJPLyOwABJPLyPwABJPLyQwABJPLyRwABJPLySwABJPLyTwABJPLyUwABJPLyVwABJPLyWwABJPLyXwABJPLyYwABJPLyZwABJPLyawABJPLybwABJPLycwABJPLydwABJPLyewABJPLyfwABJPLygwABJPLyhwABJPLyiwABJPLyjwABJPLykwABJPLylwABJPLymwABJPLynwABJPLyowABJPLypwABJPLyqwABJPLyrwABJPLyswABJPLytwABJPLyuwABJPLyvwABJPLywwABJPLyxwABJPLyywABJPLyzwABJPLy0wABJPLy1wABJPLy2wABJPLy3wABJPLy4wABJPLy5wABJPLy6wABJPLy7wABJPLy8wABJPLy9wABJPLy+wABJPLy/wABJPLzAAMAATj7AAEmPg/fAAEmQlGXAAEmRgdzAAEmRLsAASZGB7MAASZG8wsAASZGDYMAASZCUdcAASZcAwABJj7zDwABJmZRlwABJmrzEwABJmrzFwABJmsAATj7AAEmdvMbAAEmdvMfAAEmdvMjAAEmZlHTAAEmhhwrAAEmhvMnAAEmhvMrAAEmhvMvAAEmhnvHAAEmhjf/AAEmZlHXAAEmoAADAAE4/wABJqpRlwABJq654AMAATkDAAEmtvM3AAEmulGXAAEmvwABOQMAASbC8z8AASbC80MAASbCb7MAASbC80cAASa6UdMAASbWwOsAASbWIAMAASbWwPMAASbWwXcAASbWwPsAASbWHGMAASbWwi8AASbWwYcAASbWBU8AASbVFwABJtcAATkDAAEnAvOHAAEnAvODAAEmulHXAAEnDAMAASa285cAAScWUccAASca85sAASca858AASca86MAAScWUdMAAScq86cAAScq86sAAScq868AAScqBU8AAScq87cAAScWUdcAASdAAwABJrbzuwABJ0pRlwABJ08AATkDAAEnUil/AAEnUvNPAAEnUvNLAAEnSlHTAAEnYgVPAAEnSlHXAAEnaAMAASa288sAASdyUZcAASd2888AASd289MAASd289cAASdyUdMAASeGBU8AASeG8+cAASdyUdcAASeQAwABJrbz6wABJ5pRzwABJ5wDAAEnmlHHAAEnpjjPAAEnmlHTAAEnrvPzAAEnrvP7AAEnrvP/AAEnrvQDAAEnrvQHAAEnrvQLAAEnrvQPAAEnrvQXAAEnrvQbAAEnrvQfAAEnrvQjAAEnrvQnAAEnrvQ3AAEnrhxjAAEnrvQ/AAEnrvRDAAEnrvRHAAEnrvRLAAEnrvRPAAEnrvRbAAEnrvRfAAEnrvRjAAEnrvRnAAEnrvRrAAEnrvRvAAEnrvRzAAEnrvR3AAEnrvR/AAEnrvSDAAEnrvSLAAEnrrHzAAEnrvSPAAEnrvSTAAEnrvSXAAEnrvSfAAEnrvSjAAEnrvSrAAEnrvSvAAEnrvSzAAEnrvS3AAEnrvS7AAEnrhUTAAEnrvTHAAEnrvTLAAEnrvTTAAEnrvTXAAEnrvTbAAEnrvTfAAEnrvTjAAEnrvTnAAEnrvTrAAEnrvTvAAEnrvTzAAEnrvT3AAEnrvT7AAEnrvT/AAEnrvUDAAEnrRcAASa29QcAASiaUZcAASifAAE5AwABKKL1CwABKKL1DwABKJpRzwABKKwDAAEomlHHAAEotjjPAAEomlHTAAEovvPzAAEovvP7AAEovvP/AAEovvQDAAEovvQHAAEovvQLAAEovvQPAAEovvQXAAEovvQbAAEovvQfAAEovvQjAAEovvQnAAEovvQ3AAEovhxjAAEovvQ/AAEovvRDAAEovvRHAAEovvRLAAEovvRPAAEovvRbAAEovvRfAAEovvRjAAEovvRnAAEovvRrAAEovvRvAAEovvRzAAEovvR3AAEovvR/AAEovvSDAAEovvSLAAEovrHzAAEovvSPAAEovvSTAAEovvSXAAEovvSfAAEovvSjAAEovvSrAAEovvSvAAEovvSzAAEovvS3AAEovvS7AAEovhUTAAEovvTHAAEovvTLAAEovvTTAAEovvTXAAEovvTbAAEovvTfAAEovvTjAAEovvTnAAEovvTrAAEovvTvAAEovvTzAAEovvT3AAEovvT7AAEovvT/AAEovvUDAAEovRcAASi/AAE5AwABKar1FwABKJpR1wABKbMAATkDAAEptgSbAAEmtvYrAAEpvlGXAAEpwvYvAAEpwvYzAAEpwwABOQMAASnO9jcAASm+UdMAASnWDQ8AASnWsfMAASnW9kcAASnW9mcAASnWdu8AASnWBU8AASnW9ocAASnW9p8AASnVFwABKdcAATkDAAEp/vabAAEp/vZDAAEp/vbfAAEp/vbjAAEp1hrzAAEp1vbLAAEpvlHXAAEqGAMAASobAAE5AwABKiIEmwABJrb28wABKipR0wABKi72lwABKi4LuwABKi72kwABKi72owABKi72jwABKipR1wABKkQDAAEmtvb3AAEqTlGXAAEqUvZXAAEqUva3AAEqUva/AAEqUvZfAAEqTlHTAAEqZvZbAAEqZrHzAAEqZvZnAAEqZgVPAAEqZRcAASpm9mMAASpnAAE5AwABKoL3LwABKoL3ZwABKoL3awABKoL23wABKoL3bwABKmYa8wABKmb3PwABKmb3WwABKk5R1wABKqQDAAEqplAHAAEmtvd3AAEqslGXAAEqtwABOQMAASq693sAASqyUdMAASrCBU8AASqyUdcAASrIAwABJrb3hwABKtJRlwABKtcAATkDAAEq2vd7AAEq0lHTAAEq4gVPAAEq0lHXAAEq6AMAASa2948AASryUZcAASr3AAE5AwABKvr3kwABKvr3lwABKvJR0wABKwYFTwABKvJR1wABKwwDAAEmtvejAAErFlGXAAErGwABOQMAASse96cAASsWUdMAASsmBU8AASsWUdcAASssAwABJrb3twABKzZRlwABKzrz7wABKzsAATkDAAErQm+zAAErQve7AAErQiWXAAErQve/AAErQvfDAAErQvfHAAErQvfLAAErNlHHAAErYjjPAAErNlHTAAEravPzAAEravP7AAEravP/AAEravQDAAEravQHAAEravQLAAEravQPAAEravQXAAEravQbAAEravQfAAEravQjAAEravQnAAEravQ3AAErahxjAAEravQ/AAEravRDAAEravRHAAEravRLAAEravRPAAEravRbAAEravRfAAEravRjAAEravRnAAEravRrAAEravRvAAEravRzAAEravR3AAEravR/AAEravSDAAEravSLAAErarHzAAEravSPAAEravSTAAEravSXAAEravSfAAEravSjAAEravSrAAEravSvAAEravSzAAEravS3AAEravS7AAErahUTAAEravTHAAEravTLAAEravTTAAEravTXAAEravTbAAEravTfAAEravTjAAEravTnAAEravTrAAEravTvAAEravTzAAEravT3AAEravT7AAEravT/AAEravUDAAEraRcAAStrAAE5AwABLFb2IwABLFb32wABLFb30wABLFb33wABLFb34wABKzZR1wABLGwDAAEmtvhLAAEsdlHXAAEseAMAASa2+E8AASyCUZcAASyHAAE5AwABLIr4BwABLIJR0wABLJIFTwABLIJR1wABLJgDAAEmtvhbAAEsolGXAAEspvPPAAEsolHHAAEsrvPXAAEsrvPTAAEsolHXAAEsuAMAASa2+F8AASzCUZcAASzHAAE5AwABLMpymwABLMJR0wABLNIFTwABLMJR1wABLNgDAAEmtvhnAAEs4lGXAAEs5wABOQMAASzqcpsAASziUdMAASzyBU8AASziUdcAASz4AwABJrb4cwABLQJRlwABLQcAATkDAAEtCvgnAAEtCvgrAAEtAlHTAAEtFgVPAAEtAlHXAAEtHAMAASa2+IMAAS0mUZcAAS0q888AAS0rAAE5AwABLTL31wABLSZRxwABLTrz1wABLTrz0wABLSZR0wABLUYFTwABLSZR1wABLUwDAAEmtviPAAEtVlGXAAEtWwABOQMAAS1e93sAAS1WUdMAAS1mBU8AAS1WUdcAAS1sAAMAATkHAAEtdlHTAAEteIMAAS12+KcAAS2CUZcAAS2G+KsAAS2CUdMAAS2OwXsAAS2CUdcAAS2UAAMAATkLAAEtnlHTAAEtorpfAAEtovkPAAEtovkTAAEtovkbAAEtorpnAAEtorprAAEtorpvAAEtorpjAAEtovkzAAEtnrpbAAEtylGXAAEtzgyjAAEtzwABOQsAAS3WEdcAAS3OBpsAAS3O+NcAAS3Oz4cAAS3O+NsAAS3O+N8AAS3O+OMAAS3O+OcAAS3O+OsAAS3O+O8AAS3KUdMAAS4CBU8AAS3KUdcAAS4IAAMAATkPAAEuElHTAAEuFvlXAAEuFvlbAAEuEvk/AAEuIlHTAAEuJjonAAEuIlHXAAEuLAMAAS4S+UMAAS42UZcAAS46+UcAAS42UdMAAS5COicAAS5CBU8AAS42UdcAAS5MAwABLhL5TwABLlZRlwABLlr5UwABLlZR0wABLmI6JwABLmIFTwABLlZR1wABLmwAAwABORMAAS52UZsAAS56+WsAAS52UZcAAS6C21MAAS52UdMAAS6K+XMAAS6K+XsAAS6LAAE5EwABLpb5gwABLnbZcwABLp5RxwABLqIsFwABLqIcHwABLp5RywABLq6uhwABLp5R0wABLrauowABLp5R1wABLrwDAAEudvlvAAEuxlGXAAEuytcjAAEuyhwfAAEuyiwXAAEuxlHXAAEu2AADAAE5FwABLuLZZwABLuZRxwABLupOqwABLuq7twABLuj3AAEu6gVbAAEu6IsAAS7qB18AAS7qA4MAAS7qA4sAAS7qBacAAS7qHD8AAS7mUdMAAS8WuysAAS8W3ocAAS8WAoMAAS8WCocAAS8W+acAAS8We0sAAS8W+asAAS8WVI8AAS8WBscAAS8UnwABLxYFTwABLxb5owABLxSvAAEvFi1bAAEvFh/7AAEvFnXTAAEvFn5fAAEvFhELAAEvFgafAAEvFnwLAAEvFn5jAAEvFn5nAAEvFhrzAAEvFjxXAAEvFnvrAAEvFjhXAAEvFn5/AAEvFjivAAEvFn6DAAEvFg0rAAEvFn53AAEvFg0vAAEvFwABORcAAS+a+cMAAS7mUdcAAS+gAwABLuL5ywABL6pRlwABL64DgwABL64FWwABL68AATkXAAEvugYPAAEvqlHPAAEvwAMAAS+qUdMAAS/K+c8AAS/KAoMAAS/KfwsAAS/KN/8AAS+qUccAAS/eBaQDAAE5GwABL+b50wABL+pRlwABL+751wABL+752wABL+753wABL+69HwABL+pRxwABMALqlwABMALb5wABMALb6wABMAK+JwABMAK/hwABMAL54wABMAI3JwABL+pR0wABMCL55wABMCK9EwABMCK8+wABMCL56wABL+pR1wABMDQDAAEv5vnvAAEwPlGXAAEwQwABORsAATBG+fMAATBC6pcAATBC+dcAATBC+dsAATBC+d8AATBCvR8AATBC2+cAATA+UccAATBmvicAATBmv8cAATBm4DMAATBm4DcAATBmv4cAATBm2+sAATBmuvsAATBmv6MAATBmJ+sAATBmvUMAATBmDvsAATBm+eMAATBmNycAATBmERMAATA+UdMAATCi4HcAATCisjsAATCi+esAATCi3AMAATCi+gMAATCi+ecAATCivRMAATCi268AATCi60cAATCi26sAATCivPsAATA+UdcAATDQAAMAATkfAAEw2vo3AAEw3lHHAAEw4mmnAAEw4mpbAAEw4gRXAAEw4hV/AAEw3lHTAAEw9r+LAAEw9rGDAAEw9rw3AAEw3lHXAAExBAMAATDa+jsAATEOUZcAATESaacAATESalsAATEOUccAATEeBFcAATEOUdMAATEmsYMAATEOUdcAATEsAAMAATkjAAExNvpDAAExOlGXAAExPurTAAExPncHAAExPvpHAAExPuU3AAExPhZbAAExOlHPAAExVAMAATE6UccAATFeDVMAATE6UdMAATFm3JMAATFmsjsAATFmxPMAATE6UdcAATF2TnsAATE2+o8AATF+UZcAATGCG0MAATGCBiMAATGCJzsAATGC5tsAATF+UdcAATGUAAMAATknAAExnvqTAAExolHHAAExpg2PAAExphK7AAExphEfAAExolHTAAExttwDAAExtvqXAAExolHXAAExwAMAATGe+psAATHKUZcAATHODY8AATHOErsAATHKUdMAATHav4sAATHa3JMAATHa3IsAATHavDcAATHa+pcAATHa3AMAATHKUccAATH2258AATH2FX8AATH2yJcAATHKUdcAATIEAAMAATkrAAEyDvq3AAEyElGXAAEyFvq7AAEyFjjzAAEyElHHAAEyIg8HAAEyIhtDAAEyIgZfAAEyIulXAAEyIhNXAAEyIhNfAAEyIsfzAAEyIrzDAAEyIvq/AAEyIrzLAAEyElHTAAEyTrzXAAEyTsf/AAEyTvrDAAEyElHXAAEyXAMAATIO+scAATJmUZcAATJqBiMAATJqwMsAATJrAAE5KwABMnb6ywABMmobQwABMmoGXwABMmrpVwABMmr6uwABMmq8wwABMmZRxwABMpIEVwABMpIREwABMpLIlwABMpIn3wABMpITXwABMpITVwABMpLH8wABMpL6vwABMpIY0wABMpIPBwABMpK/xwABMpLgMwABMpLgNwABMpI48wABMpK8ywABMpKxGwABMpLf5wABMmZR0wABMtq81wABMtrH/wABMtrgdwABMtqyOwABMtrcAwABMtr6wwABMtr6+wABMmZRywABMvo48wABMmZR1wABMwADAAEyDvsXAAEzClGXAAEzDgyjAAEzDwABOSsAATMWEdcAATMOBpsAATMOEt8AATMOEucAATMOEusAATMO+xsAATMKUdMAATMyBU8AATMKUdcAATM4AwABMg77HwABM0JRlwABM0YGXwABM0JR0wABM076zwABM0760wABM0764wABM06yOwABM0761wABM0768wABM0769wABM0762wABM0JRxwABM3IPBwABM3K/xwABM3LgMwABM0JR1wABM4ADAAEyDvsjAAEzilGXAAEzjwABOSsAATOS+ycAATOKUccAATOaBl8AATOaDwcAATOav8cAATOa4DMAATOKUcsAATOuBl8AATOKUdMAATO2+tsAATO2+s8AATO2+tMAATO2sjsAATO2+tcAATO2+uMAATO2+vMAATO2+vcAATOKUdcAATPYAwABMg77MwABM+JRlwABM+YGIwABM+YQBwABM+cAATkrAAEz8kp/AAEz8vsnAAEz8vs3AAEz8vs7AAEz8vs/AAEz4lHTAAE0CvrbAAE0CvrPAAE0CvrTAAE0CwABOSsAATQa+1MAATQa+1sAATQa+18AATQa+0sAATQa+0MAATQa+08AATQK+uMAATQKsjsAATQK+tcAATQK+vMAATQK+vcAATPiUccAATRKBl8AATRKDwcAATRKv8cAATRK4DMAATPiUcsAATReBl8AATPiUdcAATRkAwABMg77cwABNG5R0wABNHMAATkrAAE0dvtPAAEyDvuDAAE0flHTAAE0gwABOSsAATSG+0sAATIO+48AATSOUdMAATSTAAE5KwABNJb7TwABNI5R1wABNJwDAAEyDvuTAAE0plHTAAE0qwABOSsAATSu+0sAATSmUdcAATS0AwABMg77lwABNL5R1wABNMADAAEyDvubAAE0ylHTAAE0zwABOSsAATTS+08AATTKUdcAATTYAwABMg77nwABNOJR0wABNOcAATkrAAE06vtLAAE04lHXAAE08AMAATIO+6MAATT6UdMAATT/AAE5KwABNQL7SwABNPpR1wABNQgDAAEyDvunAAE1ElHTAAE1FwABOSsAATUa+08AATUSUdcAATUgAwABMg77qwABNSpR0wABNS8AATkrAAE1MvtLAAE1MvtDAAE1MvtPAAE1KlHXAAE1QAMAATIO+68AATVKUZcAATVOvL8AATVOERMAATVKUccAATVashMAATVasT8AATVaDvcAATVaJ98AATVaGNMAATVaDf8AATVaE/cAATVaE1sAATVaEwcAATVavjsAATVaDbcAATVaJzsAATVKUdMAATWOBU8AATVKUdcAATWUAAMAATkvAAE1nvvHAAE1olGXAAE1phtDAAE1psDLAAE1pgZfAAE1pgYjAAE1pg77AAE1phRTAAE1pulPAAE1pr1TAAE1pr1nAAE1olHHAAE1zsiXAAE1zhSHAAE1zuubAAE1zuuTAAE1zsiTAAE1zr1PAAE1zr+bAAE1zr0HAAE1zhNXAAE1zhjTAAE1zr47AAE1olHTAAE1/rI7AAE1/nFfAAE1/vvLAAE1/vobAAE1/twDAAE1olHXAAE2FAADAAE5MwABNh771wABNiJRxwABNiYbQwABNiYUDwABNibCvwABNia9AwABNia9QwABNiYO+wABNiYM0wABNiYTFwABNiYn6wABNia/uwABNiYT9wABNiYN/wABNibC/wABNiYUAwABNibqmwABNiYTHwABNibb5wABNiYT4wABNiYYqwABNia7awABNia7bwABNiJR0wABNn69/wABNn68/wABNn772wABNn7DewABNn7hBwABNn69XwABNn69bwABNn7rRwABNn76LwABNn76MwABNiJRywABNqoT4wABNiJR1wABNrADAAE2HvvfAAE2ulGXAAE2vhtDAAE2vsDLAAE2vhQPAAE2vgYjAAE2vsK/AAE2vr0DAAE2vwABOTMAATba++MAATba++cAATa+6psAATa+Ex8AATa+++sAATa6UccAATbyyJcAATbyvUMAATbyJ+sAATbyDNMAATbyv7sAATbyE/cAATbyDf8AATbywv8AATbyFAMAATbyExcAATbyGNMAATbyE+MAATbyGKsAATbyu2sAATbyu28AATbysRsAATby3+cAATa6UdMAATc6vf8AATc6vP8AATc6+9sAATc6w3sAATc64QcAATc6+gMAATc6vV8AATc6vW8AATc63AMAATc6sjsAATc660cAATc6+i8AATc6+jMAATa6UcsAATdyE+MAATa6UdcAATd4AAMAATk3AAE3gvwTAAE3hlGXAAE3ihQPAAE3isK/AAE3ir0DAAE3isgvAAE3hlHHAAE3ngYjAAE3nsiXAAE3hlHTAAE3qt6HAAE3qrI7AAE3qtwXAAE3qtwbAAE3qnFfAAE3qt6TAAE3hlHXAAE3xAADAAE5OwABN878LwABN9JRxwABN9YREwABN9a/xwABN9bgMwABN9bgNwABN9YYqwABN9YY0wABN9ayEwABN9YEVwABN9YO+wABN9axGwABN9bf5wABN9JRywABOAYQAwABN9JR0wABOA7cAwABN9JR1wABOBQDAAE3zvwzAAE4HlGXAAE4IgJbAAE4IgTPAAE4Ir3XAAE4HlHHAAE4MsiXAAE4HlHTAAE4OtyTAAE4OtyLAAE4HlHXAAE4RAADAAE5PwABOE78QwABOFJRywABOFYQAwABOFJRxwABOF4EVwABOF4REwABOF6/xwABOF7gMwABOF7gNwABOF4O+wABOF6xGwABOF7f5wABOFJR0wABOILcAwABOFJR1wABOIgDAAE4TvxHAAE4klGXAAE4lhADAAE4lvn7AAE4klHHAAE4ogYjAAE4orr7AAE4or+jAAE4or+nAAE4otujAAE4otunAAE4ohMbAAE4oifvAAE4ohirAAE4ovnjAAE4ogRXAAE4og77AAE4or47AAE4orITAAE4klHTAAE43twDAAE43uB3AAE43t6HAAE4klHXAAE47AMAAThO/EsAATj2UZcAATj6DKMAATj7AAE5PwABOQIR1wABOPoGmwABOPoTdwABOPr8awABOPoS3wABOPoS4wABOPr8bwABOPr8cwABOPr8dwABOPr8ewABOPr8fwABOPri1wABOPr8gwABOPr8hwABOPr8iwABOPZR0wABOUIFTwABOPZR1wABOUgDAAE4TvyPAAE5UlGXAAE5VvyTAAE5VtvrAAE5UlHXAAE5YAADAAE5QwABOWr8mwABOW5RxwABOXIGIwABOXIYqwABOW5R1wABOXwDAAE5avyfAAE5hlGXAAE5ihADAAE5iic7AAE5ig23AAE5hlHHAAE5msDLAAE5msiXAAE5mhMHAAE5mhNbAAE5mg73AAE5mhirAAE5hlHTAAE5tt6HAAE5tgVPAAE5hlHXAAE5wAADAAE5RwABOcr8qwABOc5RlwABOdIGIwABOdIGtwABOdLILwABOdJq2wABOc5R0wABOeYwjwABOebHvwABOeY6JwABOebehwABOebsOwABOeb8uwABOeayOwABOebcFwABOebcGwABOebeiwABOeZxXwABOebekwABOc5RxwABOhrclwABOhrcmwABOhrIlwABOc5R1wABOigDAAE6KvysAwABOUsAATo2/MsAATo6UZcAATo+DKMAATo/AAE5SwABOkYR1wABOj4GmwABOj4Q8wABOj4ZDwABOj780wABOjpR0wABOl4FTwABOjpR1wABOmQDAAE6NvzXAAE6blGXAAE6cwABOUsAATp2/NsAATpuUc8AATp+/N8AATpuUdMAATqGsjsAATqG/B8AATqGBU8AATpuUdcAATqWEPMAATqW/NADAAE5TwABOqL87wABOqZRlwABOqoGIwABOqqwgwABOqoQAwABOqpV8wABOqonOwABOqrffwABOqoRrwABOqrrLwABOqZRxwABOs4NtwABOs6+OwABOqZR0wABOtpP3wABOtreFwABOqZR1wABOuQAAwABOVMAATru/PcAATryUZcAATr2/PsAATr2+rsAATryUccAATsC6pcAATsC2+sAATsCDvMAATsCDvsAATsCvTsAATsCv4cAATsC/QMAATsC+v8AATryUcsAATsmvUMAATryUdcAATssAwABOu79BwABOzZRlwABOzsAATlTAAE7Pv0LAAE7Pv0PAAE7Pv0TAAE7Pv0XAAE7OuqXAAE7Og77AAE7Ovz7AAE7OtvnAAE7Ovq7AAE7NlHHAAE7Zr07AAE7Zr/HAAE7ZuAzAAE7ZuA3AAE7Zr+HAAE7ZtvrAAE7Zr1DAAE7ZhPjAAE7Zv0DAAE7Zvr/AAE7Zg7zAAE7Zv0bAAE7ZhETAAE7NlHLAAE7nr1DAAE7NlHTAAE7puB3AAE7prI7AAE7pv0nAAE7pwABOVMAATu2/SMAATumvW8AATum268AATum60cAATum26sAATs2UdcAATvMAwABOu79awABO9ZRlwABO9q9twABO9oNzwABO9ZRxwABO+YT4wABO9ZR0wABO+7hBwABO+7gdwABO+6yOwABO+7brwABO9ZR1wABPAAAAwABOVcAATwKUZcAATwO/ZsAATwK/XcAATwWUZcAATwaBl8AATwbAAE5VwABPCLr+wABPBoZewABPBoVfwABPBZRxwABPDLIlwABPDIQAwABPDLCvwABPDL9fwABPDLchwABPDL9jwABPDLE7wABPBZR0wABPFL9ewABPFKyOwABPFInAwABPFL9gwABPFLciwABPFLcEwABPFLckwABPBZR1wABPHAAAwABOVsAATx6/aMAATx+UZcAATyCFOcAATyCFccAATyC/acAATyC2+cAATyC6gMAATx+UccAATyayCcAATyayJcAATyav4cAATyaFOMAATyaGh8AATyaB18AATx+UdMAATy23ocAATy2BU8AATy23JMAATy23IsAATy2/bMAATy2HGMAATy2/bcAATy226sAATy2cV8AATy0nwABPLb9vwABPH5RywABPOYaHwABPH5R1wABPOwDAAE87v2oAwABOV8AATz6/ccAATz+UZcAAT0CHg8AAT0CJzsAAT0CDbcAATz+UdMAAT0Sx78AAT0Sd18AAT0SBU8AATz+UdcAAT0gAAMAATljAAE9Kv3TAAE9LlHHAAE9MhRTAAE9MhjTAAE9LlHXAAE9PAADAAE5ZwABPUb92wABPUpRxwABPU7IlwABPUpR1wABPVQAAwABOWsAAT1eunMAAT1iUZcAAT1mDKMAAT1nAAE5awABPW4R1wABPWYGmwABPWYoIwABPWbcwwABPWZWUwABPWJR0wABPYYFTwABPWJR1wABPYwAAwABOW8AAT2WUdMAAT2a/gcAAT2auosAAT2auocAAT2WunsAAT2qUZcAAT2uBiMAAT2uJzsAAT2qUc8AAT26/ecAAT2qUccAAT3CEy8AAT3C7DcAAT2qUdMAAT3Ov9sAAT3OBU8AAT2qUdcAAT3YAwABPdsAATlvAAE94gSbAAE9lv3vAAE96lGXAAE97qWrAAE96lHHAAE99gYjAAE99ic7AAE99hMvAAE99uw3AAE96lHTAAE+Cr/bAAE+CgVPAAE96lHXAAE+FAMAAT2Wun8AAT4eUZcAAT4iEy8AAT4eUdMAAT4qv9sAAT4qBU8AAT4eUdcAAT40AwABPZa6gwABPj5RlwABPkK/1wABPj5R0wABPkq/2wABPkoFTwABPj5R1wABPlQDAAE+VwABOW8AAT5eBJsAAT2W/f8AAT5mUZcAAT5qv9cAAT5mUdMAAT5yv9sAAT5yBU8AAT5mUdcAAT58AAMAATlzAAE+hlGXAAE+it6zAAE+irqTAAE+irqXAAE+iv5rAAE+irqbAAE+iua7AAE+irqfAAE+irqjAAE+it63AAE+iua3AAE+iuavAAE+iuazAAE+iuarAAE+iv5vAAE+iv4zAAE+iv43AAE+iv47AAE+iv4/AAE+iv5DAAE+iv5HAAE+iv5LAAE+hv4TAAE+4lGXAAE+5gyjAAE+5wABOXMAAT7uEdcAAT7mBpsAAT7m/jMAAT7m/jcAAT7m/jsAAT7m/j8AAT7m/kMAAT7m/kcAAT7m/ksAAT7iUdMAAT8WBU8AAT7iUdcAAT8cAwABPoa6jwABPyZRlwABPyoO+wABPyr+TwABPyZRzwABPzYaGwABPyZR0wABPz4FTwABPz47WwABPz7+YwABPyZR1wABP0wAAwABOXcAAT9WUZcAAT9a/ncAAT9a/nsAAT9aK3sAAT9a/n8AAT9a/oMAAT9a/ocAAT9a/osAAT9a/o8AAT9aUvcAAT9a/pMAAT9a/pcAAT9a/psAAT9a/p8AAT9a/qMAAT9a5r8AAT9a/qcAAT9a/qsAAT9a/q8AAT9a/rMAAT9auqcAAT9a/rcAAT9a/rsAAT9a/r8AAT9aK38AAT9a/sMAAT9auqsAAT9a/scAAT9a/ssAAT9a/s8AAT9a/tMAAT9a/tcAAT9a/tsAAT9a/twDAAE5ewABP+K6twABP+ZRlwABP+oMowABP+sAATl7AAE/8hHXAAE/6gabAAE/6v7nAAE/6v7rAAE/6v7vAAE/5lHTAAFACgVPAAE/5lHXAAFAEAMAAT/iusMAAUAaUZcAAUAeaacAAUAewRMAAUAewRsAAUAaUdMAAUAuvDsAAUAu/vcAAUAu/vsAAUAuxu8AAUAuvfsAAUAuvPcAAUAuwQ8AAUAuwRcAAUAuwZcAAUAuwZMAAUAuwQsAAUAu/wcAAUAu/w8AAUAu/xcAAUAuwN8AAUAuxr8AAUAuxbMAAUAuxmcAAUAu/x8AAUAu/ycAAUAu/ysAAUAu/zMAAUAu/zcAAUAu/z8AAUAu/0MAAUAu/0sAAUAuwFsAAUAuwGMAAUAu/08AAUAu/1MAAUAaUdcAAUCoAAMAATl/AAFAslHTAAFAtrrHAAFAsv9bAAFAvlHHAAFAwrHHAAFAvlHTAAFAyr0/AAFAyry7AAFAyr3nAAFAyrz3AAFAyr3vAAFAyj73AAFAyrgnAAFAyr6fAAFAysKbAAFAyryvAAFAysKLAAFAvlHXAAFA+AADAAE5gwABQQL/ZwABQQZRlwABQQoVnwABQQr/awABQQoUywABQQr/bwABQQq6ewABQQr/cwABQQr/dwABQQr/ewABQQr/fwABQQr/hwABQQoUJwABQQr/iwABQQr/jwABQQr/kwABQQoY5wABQQr/mwABQQr/owABQQr/pwABQQr/qwABQQr/rwABQQr/swABQQoS7wABQQq6vwABQQrgHwABQQq6gwABQQoXtwABQQqAfwABQQr/twABQQr/vwABQQqvIwABQQr/wwABQQr/xwABQQZR1wABQYwAAwABOYcAAUGWUdMAAUGbAAEFFwABQZsAAQUbAAFBmwABBR8AAUGW//8AAUGqUZcAAUGuGC8AAUGvAAEAAwABQa8AAQAHAAFBrwABAAsAAUGvAAE5hwABQcMAAQAPAAFBwwABABMAAUGuwFcAAUGvAAEAFwABQa8AAQAbAAFBqlHPAAFB2AMAAUGqUdMAAUHjAAEALwABQeMAAQA/AAFB4wABAFcAAUHjAAEAbwABQeMAATmHAAFB9wABAGMAAUGqUdcAAUH/AAE5hwABQgIEmwABQZcAAQB7AAFCClGXAAFCDgyjAAFCDwABOYcAAUIWEdcAAUIOBpsAAUIOKCMAAUIPAAEAiwABQg8AAQCPAAFCClHTAAFCLgVPAAFCClHXAAFCNAMAAUGWussAAUI+UccAAUJCBFcAAUJCuw8AAUJCu6cAAUJCvUsAAUJDAAEAkwABQkK7dwABQj5R0wABQl68xwABQl69ewABQl6+KwABQl68QwABQl8AAQCXAAFCXr1jAAFCXwABAJsAAUI+UdcAAUJ8AwABQZbmwwABQoZRlwABQosAAQCfAAFCiwABAKMAAUKKuw8AAUKKvUsAAUKKu3cAAUKK+fsAAUKLAAEAkwABQoon7wABQooCPwABQosAAQCnAAFCirunAAFCihV/AAFCigRXAAFCik6/AAFCii7DAAFCiwABAKsAAUKLAAEArwABQoZRxwABQtICQwABQtINWwABQtI/jwABQtI/kwABQoZR0wABQucAAQCzAAFC5wABALcAAULnAAEAuwABQucAAQCbAAFC5r4rAAFC5wABAMsAAULmGNMAAULnAAEAZwABQucAAQBDAAFC5wABOYcAAUMPAAEBLwABQw8AAQETAAFDDwABAQcAAUMPAAEA8wABQw8AAQIfAAFDDwABArsAAUMPAAECvwABQw8AAQNDAAFDDwABA0sAAUMPAAEDTwABQw8AAQNbAAFDDwABA2MAAUMPAAEDawABQw8AAQN/AAFDDwABA4MAAUMPAAEDewABQw8AAQF/AAFDDwABAO8AAUMPAAEBUwABQuYnGwABQucAAQFfAAFC5wABAWMAAULnAAEBawABQucAAQHPAAFC5wABAdsAAULnAAEB6wABQucAAQHzAAFC5wABAUcAAULnAAECGwABQucAAQIjAAFC5wABAicAAULnAAECKwABQucAAQIvAAFC5wABAjMAAULnAAECOwABQucAAQBrAAFC5wABAkMAAULnAAECRwABQucAAQAnAAFC5wABAk8AAULnAAECYwABQucAAQJvAAFC5wABAncAAULnAAECgwABQucAAQKHAAFC5wABAnMAAULmvMcAAULmvXsAAULnAAECnwABQucAAQMfAAFC5rxDAAFC5wABAJcAAULnAAEDNwABQucAAQOHAAFC5wABA5MAAULnAAEDlwABQua9YwABQucAAQObAAFC5wABAG8AAULnAAECkwABQucAAQOfAAFC5wABA6cAAULnAAEDrwABQucAAQF3AAFC5wABACsAAULnAAEAdwABQucAAQBzAAFC5wABA9MAAULnAAED2wABQucAAQNXAAFC5wABA98AAULnAAED5wABQucAAQPvAAFC5wABA/cAAULnAAED/wABQucAAQQDAAFChlHXAAFEQAMAAUGWC0cAAURKUZcAAUROAkMAAURPAAEEBwABREpR0wABRFoLkwABRFsAAQQLAAFEWwABBA8AAURaC0sAAURKUdcAAURsAwABQZcAAQRDAAFEdlGXAAFEewABOYcAAUR+Bg8AAUR2Uc8AAUSGA4sAAUSGBzcAAUR2UccAAUSTAAECmwABRJIUXwABRJLHBwABRJIXxwABRHZR1wABRKQDAAFBlwABBFMAAUSuUZcAAUSyFF8AAUSuUccAAUS7AAECmwABRLrHBwABRLoXxwABRK5R1wABRMgDAAFBlwABBFsAAUTSUZcAAUTWEAcAAUTWF8cAAUTSUccAAUTjAAECmwABROIUXwABROLHBwABRNJR1wABRPADAAFBlwABBF8AAUT6UccAAUT+OMMAAUT6UdMAAUUHAAEDRwABRPpR1wABRQwDAAFBlwABBGMAAUUWU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UkyUdcAAUlMAwABR2MAAQXrAAFJVlGXAAFJWvSbAAFJWwABBXMAAUlWUdcAAUlkAwABR2MAAQXvAAFJblHTAAFJcgVPAAFJcwABOYsAAUl7AAEFSwABSW5R1wABSYADAAFHYwABBfcAAUmKUdcAAUmMAAMAATmPAAFJllHTAAFJmwABBnMAAUmbAAEGewABSZsAAQZ/AAFJlwABBf8AAUmqUdMAAUmuFM8AAUmuD+MAAUmuFPsAAUmuxSMAAUmXAAEGBwABScJR0wABScYUzwABScYP4wABScYU+wABScbFIwABScJR1wABSdgDAAFJlqA/AAFJ4lGXAAFJ5hX7AAFJ5r6XAAFJ5lc3AAFJ4lHTAAFJ9g/vAAFJ9hALAAFJ9sUjAAFJ4lHXAAFKBAMAAUmXAAEGCwABSg5R0wABShIUzwABShIP4wABShIU+wABShLFIwABSg5R1wABSiQDAAFJlwABBg8AAUouUZcAAUoyFisAAUoyFi8AAUoyFjMAAUouUdMAAUpCD+8AAUpCEAsAAUpCxSMAAUouUdcAAUpQAwABSZcAAQYfAAFKWlHTAAFKXhTPAAFKXg/jAAFKXhT7AAFKXsUjAAFKWlHXAAFKcAMAAUmXAAEGIwABSnpRlwABSn4YFwABSn4WKwABSn4YGwABSn4T4wABSnpR0wABSpIP7wABSpIQCwABSpLFIwABSnpR1wABSqADAAFJlwABBi8AAUqqUdMAAUquFM8AAUquD+MAAUquFPsAAUquxSMAAUqqUdcAAUrAAwABSZcAAQYzAAFKylGXAAFKzhRTAAFKzhgrAAFKzsYLAAFKzsYPAAFKzhPjAAFKzr2HAAFKzhgvAAFKylHHAAFK7wABBjcAAUrKUdMAAUr2D+8AAUr2EAsAAUr2xSMAAUrKUdcAAUsEAwABSZcAAQY7AAFLDlHHAAFLEgTzAAFLEgT7AAFLDlHLAAFLHgTzAAFLHgT7AAFLDlHTAAFLKg/jAAFJlwABBk8AAUsyUccAAUs2BPMAAUs2BPsAAUsyUcsAAUtCBPMAAUtCBPsAAUsyUdMAAUtOD+MAAUsyUdcAAUtUAwABSZcAAQZTAAFLXlGXAAFLYhX7AAFLYr6XAAFLYwABBlcAAUteUdMAAUtyD+8AAUtyEAsAAUteUdcAAUt8AwABSZcAAQZbAAFLhlHHAAFLigTzA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wABWD6/QwABWD6/VwABWD6+gwABWD69CwABWD69DwABWD69MwABWD7IAwABWD692wABWD7EkwABWD6/EwABWD6+NwABWD7ITwABWD7IUwABWD7IMwABWD7INwABWD7E5wABWD7IHwABWD6/MwABWD7ISwABWD6/IwABWD6/KwABWD6/LwABWD6/PwABWD68MwABWD69wwABWD682wABWD6+fwABWD7CywABWD6/bwABWD67uwABWCpR1wABWMAAAwABOZ8AAVjKuuMAAVjOUdMAAVjSvccAAVjTAAEDPwABWNK+MwABWNLEnwABWNLEmwABWNK+dwABWNK+ewABWNLCPwABWNLCSwABWNLALwABWNLAKwABWNLB+wABWNLCDwABWNLCVwABWNK9VwABWNK/8wABWNLCfwABWNMAAQfDAAFY0sJnAAFY0wABB48AAVjSyFcAAVjSwvMAAVjSxTcAAVjSxQ8AAVjSxQsAAVjSwYsAAVjSwYMAAVjSxhMAAVjSxgcAAVjSxq8AAVjSxpMAAVjSwcsAAVjSu/8AAVjSx1sAAVjSxAMAAVjSwzsAAVjSx4MAAVjSxcsAAVjSvYMAAVjSxnsAAVjSwa8AAVjSwIMAAVjSwxMAAVjSvwMAAVjSxEcAAVjSxl8AAVjSwFMAAVjSv/sAAVjSwaMAAVjTAAEHAwABWNLDSwABWNJlTwABWNLEIwABWNLA2wABWNLBLwABWNK8CwABWNLGcwABWNLGuwABWNLHMwABWNLFnwABWNLIQwABWNLBKwABWNLGHwABWNK+owABWNLlBwABWNMAAQizAAFY0wABCLcAAVjSyd8AAVjTAAEHWwABWNMAAQi7AAFY0r6LAAFY0shHAAFY0wABCL8AAVjTAAEDOwABWNMAAQPXAAFY0sKPAAFY0wABA+MAAVjTAAED6wABWNMAAQPzAAFY0wABA/sAAVjSvvMAAVjSvvsAAVjSxE8AAVjTAAEIdwABWM5R1wABWiQDAAFYywABCMMAAVouUZcAAVozAAEIjwABWjIFMwABWi5R0wABWj4P4wABWj4U+wABWj4P7wABWj4QCwABWi5R1wABWlAAAwABOaMAAVpauucAAVpeUccAAVpiDZcAAVpeUdMAAVpqD+MAAVpqFPsAAVpqD+8AAVpqDa8AAVpqGScAAVpeUdcAAVqAAAMAATmnAAFailGXAAFajuanAAFailHTAAFaltvLAAFalwABCO8AAVqXAAEI/wABWpZPiwABWpa66wABWpcAAQlPAAFalwABCVsAAVqXAAEJawABWpcAAQl3AAFalwABCX8AAVqXAAEJjwABWpcAAQmXAAFaluajAAFaluafAAFalwABCbcAAVqW5psAAVqW/9sAAVqLAAEIzwABWt5RlwABWuKybwABWuIYFwABWuJnJwABWuJ9ywABWt5R0wABWvaxzwABWt5R1wABWvwDAAFaiwABCNsAAVsGUdMAAVsKICsAAVsLAAEI3wABWwoZMwABWwoZPwABWwoZRwABWwoZVwABWwoZTwABWwoZYwABWwoZfwABWwoZywABWwoZowABWwZR1wABWzgAAwABOagDAAE5rwABW0cAAQnDAAFbSlGXAAFbTwABCccAAVtPAAEJywABW04XxwABW08AAQnPAAFbTst/AAFbThgXAAFbSlHHAAFbawABOa8AAVtuOuMAAVtKUdMAAVt3AAEJ0wABW3bK/wABW3cAAQnXAAFbdgYjAAFbdwABCdsAAVt2FycAAVt2Fy8AAVt2FzcAAVt2FvcAAVt2Fv8AAVt2FwsAAVt2FxMAAVt2FxsAAVt3AAEJ4wABW3YVCwABW3YVgwABW3YVkwABW3YXPwABW3YVFwABW3Y5awABW3cAAQnrAAFbdhUfAAFbdhVDAAFbdhVTAAFbdhWLAAFbdhWbAAFbdhYPAAFbdha/AAFbdhbfAAFbdhdHAAFbdhVLAAFbdhVbAAFbdhWvAAFbdhXTAAFbdhVjAAFbdhXfAAFbdhXnAAFbdhXvAAFbdhZLAAFbdhdPAAFbdhdfAAFbdhYjAAFbdhY7AAFbdhdvAAFbdhd7AAFbdheTAAFbdhSfAAFbdhebAAFbdiBTAAFbSlHXAAFcPAADAAE5swABXEZR0wABXEsAAQooAwABObcAAVxTAAEKMwABXFZRxwABXFoHswABXFoDgwABXFoQKwABXFZR1wABXGgAAwABObsAAVxzAAEKNwABXHZRlwABXHsAAQo7AAFcdlHTAAFcgwABCj8AAVx2UdcAAVyIAAMAATm/AAFcktlvAAFcllGXAAFcmwABOb8AAVyfAAEKRwABXJZR0wABXKYNgwABXKbazwABXKcAAQpPAAFcllHHAAFctsHDAAFctwABCksAAVyWUdcAAVzAAwABXJMAAQpfAAFcylGXAAFczrSjAAFczsHDAAFcylHTAAFc2g2DAAFc2trPAAFc2gVPAAFcylHXAAFc6AMAAVyTAAEKZwABXPJR0wABXPYNgwABXPbazwABXPJR1wABXQADAAFckwABCmsAAV0KUdMAAV0ODYMAAV0O2s8AAV0KUdcAAV0YAwABXJMAAQpvAAFdIlGXAAFdJsHDAAFdIlHTAAFdLg2DAAFdLtrPAAFdLgVPAAFdIlHXAAFdPAADAAE5wwABXUZR0wABXUr5ZwABXUsAAQp7AAFdSwABCn8AAV1K20sAAV1K20wDAAE5xwABXWJR0wABXWbtGwABXWa66wABXWbbzwABXWbmlwABXWbb0wABXWcAAQrXAAFdZicTAAFdZicbAAFdZtvLAAFdYwABCocAAV2OUZcAAV2Ssm8AAV2SDY8AAV2SZycAAV2SfcsAAV2OUdMAAV2msc8AAV2OUdcAAV2sAwABXWMAAQqTAAFdtlGXAAFdug2PAAFduwABCo8AAV22UdMAAV3GT8MAAV3GGbMAAV3GGTMAAV3GGT8AAV3GGUcAAV3GGWMAAV3GGaMAAV3GGX8AAV3GGcsAAV22UdcAAV3sAwABXWLbxwABXfZRlwABXfoMowABXfo/mwABXfoVwwABXfrcxwABXfZR1wABXgwDAAFdYwABCpcAAV4WUZcAAV4aFcMAAV4bAAE5xwABXiMAAQqbAAFeFlHTAAFeKiArAAFeKhnLAAFeKhljAAFeKhmjAAFeKhl/AAFeKhlXAAFeKhlPAAFeKhlHAAFeKhk/AAFeKhkzAAFeFlHXAAFeVAADAAE5ywABXl5RlwABXmMAAQtbAAFeYg//AAFeXwABCwsAAV5uUZcAAV5yBTMAAV5yECsAAV5uUdcAAV58AwABXl8AAQsPAAFehlGXAAFeigJbAAFehlHXAAFekAMAAV5fAAELEwABXppRlwABXp4CWwABXppR1wABXqQDAAFeXwABCxcAAV6uUZcAAV6zAAELGwABXrMAAQsfAAFerlHXAAFevAMAAV5fAAELIwABXsZRlwABXssAAQsnAAFeywABCysAAV7LAAELLwABXsZR0wABXtsAAQszAAFe2wABCzcAAV7aG8sAAV7bAAELSwABXtsAAQtTAAFe2wABC1cAAV7aIDMAAV7aIEsAAV7aICMAAV7aIBMAAV7aICsAAV7aHBcAAV7aIAsAAV7aIDsAAV7aIEMAAV7aIFMAAV7aIBsAAV7aGbMAAV7aErMAAV7aGPMAAV7aE6cAAV7aFAsAAV7aE4sAAV7aE3MAAV7aGzMAAV7aGycAAV7aGwsAAV7aGu8AAV7aGtcAAV7aGuMAAV7aGrsAAV7aGqsAAV7aGpsAAV7aGosAAV7aGn8AAV7aGnMAAV7aGmcAAV7aGz8AAV7aGacAAV7aEqcAAV7aGy8AAV7aGyMAAV7aGwcAAV7aGusAAV7aGtMAAV7aGt8AAV7aGrcAAV7aFp8AAV7aFq8AAV7aGqcAAV7aGpcAAV7aGocAAV7aGnsAAV7aGm8AAV7aGmMAAV7aGzsAAV7aGaMAAV7aGcsAAV7aGX8AAV7aGWMAAV7aGVcAAV7aGU8AAV7aGUcAAV7aGT8AAV7aGTMAAV7aG2cAAV7aF2MAAV7aGIsAAV7aGFMAAV7aFbcAAV7aFa8AAV7aFJ8AAV7aGkcAAV7aEcsAAV7aEZsAAV7aEbcAAV7aEY8AAV7aEU8AAV7aFGMAAV7aFFcAAV7aFEsAAV7aFEMAAV7aFDsAAV7aFC8AAV7aEp8AAV7aEr8AAV7aE6MAAV7aE28AAV7aFAcAAV7aE4cAAV7aGOMAAV7aGNsAAV7aGK8AAV7aGJcAAV7aGHcAAV7aGGsAAV7aGGMAAV7aGFsAAV7aGD8AAV7aGDMAAV7aGB8AAV7aGA8AAV7aGAcAAV7aF/8AAV7aF/cAAV7aF+8AAV7aF98AAV7aF9cAAV7aF8sAAV7aF78AAV7aF7MAAV7aF6cAAV7aFgMAAV7aF5MAAV7aF5sAAV7aFxsAAV7aFxMAAV7aFwsAAV7aFv8AAV7aFvcAAV7aF4cAAV7aF3sAAV7aF28AAV7aF18AAV7aF1cAAV7aF08AAV7aF0cAAV7aFz8AAV7aFzcAAV7aFy8AAV7aFycAAV7aFt8AAV7aFr8AAV7aFksAAV7aFl8AAV7aFm8AAV7aFocAAV7aFjsAAV7aFiMAAV7aFg8AAV7aFusAAV7aFe8AAV7aFecAAV7aFd8AAV7aFWMAAV7aFdMAAV7aFZsAAV7aFZMAAV7aFYsAAV7aFYMAAV7aFVsAAV7aFVMAAV7aFUsAAV7aFUMAAV7aFR8AAV7aFRcAAV7aFQsAAV7GUdcAA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WmyJKMAAWmyDdMAAWmmUdMAAWnLAAEQnwABacsAARCjAAFpygunAAFpyguLAAFpyguPAAFpyhejAAFpygu7AAFpywABD9cAAWnKC3MAAWmmUdcAAWnwAwABZoLhlwABafpRlwABaf6yEwABaf4CiwABaf4CjwABafpR0wABag46JwABafpR1wABahQDAAFmguGTAAFqHlGXAAFqIrITAAFqIwABCI8AAWoiDf8AAWojAAEQtwABah5RxwABajYO9wABajYn3wABajYT9wABajYTWwABajYTBwABajYY0wABajaxPwABajYNtwABajYnOwABaja+OwABajcAAQ13AAFqNhETAAFqHlHTAAFqawABDZ8AAWpqOicAAWprAAEO1wABah5R1wABangDAAFmgwABELsAAWqCUZcAAWqHAAEQvwABaocAAQ13AAFqglHTAAFqkgVPAAFqkjonAAFqkwABDtcAAWqTAAEQywABaoJR1wABaqQDAAFmgwABENMAAWquUZcAAWqyDNMAAWqzAAEQvwABaq5R0wABar4FTwABar8AARDbAAFqvuDLAAFqvjonAAFqvwABDtcAAWq/AAEQywABaq5R1wABatgDAAFmgwABEScAAWriUccAAWrnAAEQxwABaucAARErAAFq4lHTAAFq8jonAAFq8wABDtcAAWryBU8AAWrzAAERMwABavMAARE3AAFq4lHXAAFrCAADAAE6DwABaxLhKwABaxZRlwABaxsAARGPAAFrFlHTAAFrIr4DAAFrIwABEZcAAWsjAAERkwABayMAARGnAAFrIwABEa8AAWsjAAERuwABaxZR1wABazwAAwABOhMAAWtG4S8AAWtKUZcAAWtODKMAAWtPAAE6EwABa1YR1wABa04GmwABa08AARHTAAFrThIXAAFrThH7AAFrThK3AAFrSlHTAAFrcgVPAAFrSlHXAAFreAADAAE6FwABa4LhMwABa4ZRlwABa4lTAAFrirR/AAFriwABEd8AAWuLAAER4wABa4sAARHnAAFriwABEesAAWuLAAER7wABa4ZRxwABa6qugwABa6quswABa4ZR0wABa7cAARHzAAFrtq6rAAFrtq6vAAFrtwABEfcAAWu2rrcAAWu2rrsAAWu2rsMAAWu2rtsAAWu2ruMAAWu2rucAAWu2rusAAWu2rvcAAWuGUdcAAWvoAAMAATobAAFr8uE3AAFr9lGXAAFr+lN/AAFr+rDnAAFr+hDLAAFr+wABOhsAAWwLAAESCwABbAsAAQanAAFsCwABEg8AAWwLAAESEwABa/ZR0wABbB8AARIXAAFsHwABEhsAAWwfAAESHwABbB6/3wABbB8AARIjAAFsHwABEicAAWwfAAESKwABbB8AARIvAAFsHwABEjMAAWwfAAESNwABbB8AARI7AAFsHr9HAAFsHuFnAAFr9lHXAAFsVAMAAWvzAAESPwABbF5RlwABbGIRowABbGIRpwABbF5R1wABbG4GOwABbG4RqwABa/MAARJDAAFselGXAAFsfhGDAAFsfgUzAAFsfhFbAAFselHXAAFsjhFzAAFsjhFsAwABOh8AAWya4ZsAAWyeUZcAAWyjAAE6HwABbKYGDwABbJ5RxwABbK68vwABbK4NlwABbK4HXwABbJ5RzwABbLwDAAFsnlHTAAFsxg/jAAFsxhT7AAFsxg/vAAFsxg2vAAFsxwABDqsAAWzG+u8AAWzEnwABbMYZJwABbMb6wwABbMb66wABbJ5R1wABbPMAATofAAFs9gSbAAFsmwABEksAAWz+UZcAAW0CvL8AAW0DAAE6HwABbQsAARJPAAFtAulPAAFtAwABElMAAWz+UdMAAW0a+sMAAW0a+usAAW0bAAEOqwABbRr67wABbRoFTwABbP5R1wABbTAAAwABOiMAAW064Z8AAW0+UZcAAW1CEAMAAW1CDbcAAW1CFFMAAW0+UccAAW1SJzsAAW1Sv5sAAW1SEwcAAW1SE1sAAW1SGNMAAW1SvjsAAW0+UdMAAW1uBU8AAW0+UdcAAW10AAMAATonAAFtfuGjAAFtglGXAAFthhADAAFthwABB4cAAW2GJzsAAW2GVUcAAW2CUccAAW2aDbcAAW2avjsAAW2CUdMAAW2nAAEHjwABbacAAQeLAAFtglHXAAFtsAADAAE6KwABbbr6swABbb5RlwABbcMAATorAAFtxho3AAFtxwABEnsAAW2+UdMAAW3SICsAAW3SGX8AAW3SGWMAAW3SGaMAAW3SGcsAAW2+UdcAAW3oAwABbbsAARKDAAFt8lGXAAFt9gI/AAFt9wABA8sAAW32AkMAAW32uvMAAW33AAEShwABbfa7pwABbfb6FwABbfcAAQDHAAFt9wABAKcAAW3yUdMAAW4eu5cAAW4fAAESYwABbh8AARKLAAFuHwABEo8AAW4fAAESkwABbfJR1wABbjQDAAFtuwABEpcAAW4+UdMAAW5Cu5cAAW5DAAESYwABbj5R1wABbkwDAAFtuvw/AAFuVlGXAAFuWwABAL8AAW5WUdcAAW5gAwABbbsAARKbAAFualGXAAFubwABAMMAAW5vAAEClwABbm8AARKfAAFubrt3AAFualHXAAFugAMAAW27AAESowABbopRlwABbo4U1wABbopR0wABbpb2lwABbpYLuwABbpb2kwABbpb2jwABbpb2owABbopR1wABbqwAAwABOi8AAW62UdMAAW67AAETAwABbrr/7wABbrr/8wABbrb/9wABbspRlwABbs4ZjwABbs4ZkwABbspR0wABbtpxXwABbtoFTwABbspR1wABbuQDAAFu5wABOi8AAW7uBJsAAW63AAESrwABbvZRxwABbvoCQwABbvZR0wABbwILuwABbwMAAQ/XAAFvAgtzAAFvAwABD9sAAW8DAAEP6wABbwMAAQ/zAAFvAwABD/cAAW8DAAEP+wABbwMAAQBTAAFvAwABEBcAAW8DAAE6CwABby8AARAHAAFvLwABECMAAW8vAAEQHwABby8AARATAAFvLwABEGMAAW8vAAEQXwABby8AARBbAAFvAwABEBsAAW72UdcAAW9QAwABbrbhtwABb1pRxwABb14kmwABb14knwABb14kowABb14lLwABb14lvwABb1pR0wABb3YmfwABb3YXrwABb3cAAQ/XAAFvdgtzAAFvdwABEJ8AAW93AAEQowABb3YVawABb3cAAQFnAAFvdwABEssAAW93AAESwwABb3YLuwABb3cAARK/AAFvdwABA5MAAW92JwsAAW93AAES8wABb3cAARLvAAFvdwABOi8AAW+7AAES3wABb7sAARLbAAFvWlHXAAFvxAMAAW62//sAAW/OUZcAAW/TAAE6LwABb9cAARL/AAFvzlHTAAFv3k+7AAFvzlHXAAFv5AADAAE6MwABb+8AARMHAAFv8lGXAAFv9uTzAAFv9wABEwsAAW/3AAETDwABb/cAARMTAAFv9wABExcAAW/3AAETGwABb/JR0wABcBMAATozAAFwFwABEx8AAXAXAAETKwABcBcAARMvAAFwFwABEzMAAXAXAAETQwABcBcAARTzAAFwFwABE4sAAXAXAAEVBwABcBcAARTXAAFwFwABFOMAAXAXAAEUtwABcBcAARS7AAFwEiAzAAFwEiAbAAFwEhebAAFwEheHAAFwEhVjAAFwEhVTAAFwEhVbAAFwEhavAAFwEhafAAFwEhYDAAFwEhZfAAFwEhaHAAFwEhZvAAFwEiBTAAFwEhfXAAFwEhh3AAFwEhiXAAFwEiA7AAFwEhQvAAFwEhRXAAFwEhULAAFwEhb/AAFwEhbfAAFwEhRjAAFwEhfvAAFwEhdvAAFwEhfLAAFwEhcTAAFwEhf/AAFwEuNrAAFwEhY7AAFwEhXvAAFwEhhbAAFwEuS3AAFwEuSrAAFwEuRXAAFwEuNvAAFwEhgPAAFwEhcLAAFwEhffAAFwEhe/AAFwEuN7AAFwEhQ7AAFwEwABE6MAAXATAAETqwABcBMAARPDAAFwEwABE8sAAXASGDMAAXAS4gMAAXASGB8AAXASFJ8AAXASGOMAAXASF3sAAXAS448AAXAS45cAAXASGGMAAXAS47MAAXAS478AAXAS48cAAXAS488AAXASFr8AAXASF/cAAXATAAET+wABcBMAARQDAAFwEwABFB8AAXASF08AAXASFiMAAXATAAEULwABcBMAARQ3AAFwEwABFHMAAXASF18AAXASFdMAAXAS49MAAXAS49sAAXASFg8AAXASFusAAXAS498AAXAS4+MAAXAS4+cAAXAS5K8AAXAS5GsAAXAS5G8AAXAS5GcAAXAS5GMAAXAS5FsAAXAS5DsAAXAS5D8AAXAS5HMAAXAS5HcAAXAS5HsAAXAS5H8AAXAS5IcAAXAS5IsAAXAS5I8AAXAS5JcAAXAS5JsAAXAS5KMAAXAS5KcAAXASFxsAAXASF5MAAXASFUsAAXAS5J8AAXASFUMAAXASFEsAAXASFz8AAXASGGsAAXASF1cAAXASFZsAAXASFZMAAXASFecAAXASFksAAXASFvcAAXASFEMAAXASFd8AAXASFYMAAXASFYsAAXASGD8AAXASFycAAXASFzcAAXASF0cAAXASGIsAAXAS4gsAAXASFy8AAXASFR8AAXASGNsAAXASFRcAAXASGAcAAXASGK8AAXASF6cAAXAS5DcAAXASF7MAAXAS5L8AAXAS5MMAAXAS5M8AAXAS5NMAAXATAAETTwABb/JR1wABcmgDAAFv7wABFYcAAXJyUZcAAXJ2FFMAAXJ2GCsAAXJ2xgsAAXJ3AAET2wABcnJR0wABcooFTwABcnJR1wABcpADAAFv7wABFY8AAXKaUdMAAXKfAAET0wABcp8AARPXAAFymlHXAAFyqAMAAW/vAAEVkwABcrJRlwABcrcAARWXAAFyslHTAAFyvwABE9MAAXK/AAET1wABcrJR1wABcsgDAAFv7wABFZsAAXLSUZcAAXLXAAEVnwABctcAATozAAFy3wABFaMAAXLfAAEVpwABctJR0wABcusAARPTAAFy6wABE9cAAXLSUdcAAXL0AwABb+8AARWrAAFy/lGXAAFzAwABFa8AAXMDAAE6MwABcwsAARWjAAFy/lHTAAFzEwABE9MAAXMTAAET1wABcv5R1wABcxwDAAFv7wABFbMAAXMmUZcAAXMrAAEVtwABcyZR0wABczMAARPTAAFzMwABE9cAAXMmUdcAAXM8AwABb+8AARW7AAFzRlGXAAFzShX7AAFzRlHTAAFzUwABE9MAAXNTAAET1wABc0ZR1wABc1wAAwABOjcAAXNmUdMAAXNqs0sAAXNq5R8AAXNrAAEXqwABc2cAARXDAAFzelGXAAFzfgTPAAFzfhA3AAFzfjofAAFzelHTAAFzjgVPAAFzelHXAAFzlAMAAXNnAAEV2wABc55RlwABc6IMowABc6MAATo3AAFzqhHXAAFzogabAAFzowABFecAAXOjAAEV6wABc55R0wABc74FTwABc55R1wABc8QDAAFzZu0rAAFzzlGXAAFz0gvfAAFz0hDPAAFz0wABFe8AAXPStDcAAXPTAAEV8wABc9MAARX3AAFz0wABFfsAAXPS7TcAAXPS7TsAAXPSuzcAAXPTAAEV/wABc9K2NwABc9MAARYDAAFz0hJ/AAFz0wABFgcAAXPOUccAAXQSBM8AAXPOUdMAAXQaOicAAXQaHBcAAXQaICMAAXQaIBMAAXQavYcAAXQbAAEWCwABdBsAARYjAAF0Gr37AAF0Grz3AAF0Gg/vAAF0GwABFisAAXQbAAEWLwABdBsAARY7AAF0GjHLAAF0GwABFicAAXQbAAEWRwABdBsAARZXAAF0GwABFlsAAXQaG2cAAXQaEU8AAXQaEr8AAXQbAAEWZwABdBoRywABdBoTbwABdBoUBwABdBoThwABdBoSnwABdBoUnwABdBoZfwABdBoXywABdBoYHwABdBoYMwABdBoXkwABdBoXmwABdBoYiwABdBoXPwABdBoY2wABdBoVFwABdBoVHwABdBoVkwABdBoVmwABdBoV5wABdBsAARbDAAF0GhVTAAF0GhVbAAF0GhVjAAF0GhXvAAF0Gr8PAAF0GhdPAAF0GhdXAAF0GhdfAAF0GhcnAAF0GhhbAAF0GhrrAAF0Ghs7AAF0GiBLAAF0GhKnAAF0GhmnAAF0GhnLAAF0GhljAAF0GhmjAAFzzlHXAAF1EAMAAXNnAAEXkwABdRpRlwABdR463wABdR8AARYDAAF1HwABOjcAAXUqOuMAAXUaUdMAAXUyEU8AAXUyE28AAXUyFAcAAXUyE4cAAXUyIDMAAXUaUdcAAXVIAwABc2cAARebAAF1UlGXAAF1VhADAAF1UlHTAAF1XjonAAF1XhwXAAF1UlHXAAF1aAADAAE6OwABdXJRlwABdXcAARk7AAF1dwABGT8AAXV3AAEZQwABdXcAARlHAAF1dwABGUsAAXVy5SMAAXWOUZcAAXWSA+MAAXWSrosAAXWSsksAAXWSsI8AAXWSJ5sAAXWSBFsAAXWTAAE6OwABda8AARL/AAF1krCLAAF1kr2PAAF1kr2fAAF1kr2XAAF1kruTAAF1kwABAKcAAXWTAAEXxwABdZMAARfLAAF1kvn7AAF1jlHHAAF12j+PAAF12j+TAAF12gJDAAF12u2nAAF12u2rAAF12gL7AAF1jlHTAAF19q6jAAF19wABF9cAAXX3AAEX4wABdfbt8wABdfa81wABdfayQwABdfcAARgLAAF19uVjAAF19uVnAAF19wABGEMAAXX25W8AAXX23iMAAXX25b8AAXX227MAAXX23j8AAXX23kMAAXX23kcAAXX23isAAXX23i8AAXX3AAEYfwABdfcAARiDAAF19wABOjsAAXZPAAEYpwABdfcAARibAAF19uV3AAF19q5PAAF19wABGMcAAXX25Y8AAXX3AAEYzwABdfYErwABdfblhwABdfbcHwABdfbllwABdfblmwABdfblnwABdfbcXwABdfbg2wABdfblowABdfbcAwABdfbliwABdfblXwABdfblkwABdfa80wABdfa8RwABdfYnzwABdfYn1wABdfawMwABdfbuGwABdfbezwABdfcAARJnAAF1jlHXAAF2wAMAAXVzAAEZJwABdspRlwABds4EswABds4CiwABds4CjwABdspR1wABdtwDAAF1cwABGSsAAXbmUZcAAXbrAAE6OwABdu8AARkvAAF25lHTAAF29wABE0sAAXb3AAEZNwABduZR1wABdwAAAwABOj8AAXcKUdMAAXcOAhMAAXcOOvsAAXcPAAE6PwABdxsAARvnAAF3CuUnAAF3IlGXAAF3JgyjAAF3JwABOj8AAXcuEdcAAXcmBpsAAXcmGQ8AAXcnAAEZVwABdycAARlbAAF3IlHTAAF3RgVPAAF3IlHXAAF3TAMAAXcLAAEZXwABd1ZRlwABd1sAAQyTAAF3WwABGWMAAXdaFNcAAXdbAAE6PwABd2o64wABd1sAARlnAAF3WwABGWsAAXda5l8AAXda2asAAXdaP2cAAXdWUdMAAXeHAAEZcwABd4YRmwABd4YRjwABd4YSnwABd4YUBwABd4YThwABd4YRywABd4YTowABd4YaRwABd4cAARl3AAF3hwABGYMAAXeGFJ8AAXeGGNsAAXeGE28AAXeGFycAAXeGFZMAAXeGGFMAAXeGFRcAAXeGF08AAXeGFl8AAXeGF1cAAXeGFm8AAXeGF18AAXeGFocAAXeGFe8AAXeGFecAAXeGF4cAAXeHAAEZhwABd4cAARmLAAF3hwABGZMAAXeHAAEZlwABd1ZR1wABeAQDAAF3CwABGaMAAXgOUZcAAXgTAAEMkwABeBInXwABeBMAARmnAAF4EgPDAAF4Ej9nAAF4EgJDAAF4EhTXAAF4EwABOj8AAXgyOuMAAXgTAAEZbwABeBLmTwABeBLmXwABeBMAARmrAAF4EtmrAAF4EwABGa8AAXgTAAEZswABeBMAARm3AAF4Ek8/AAF4EwABGbsAAXgTAAEZvwABeBMAARnDAAF4EwABGccAAXgTAAEZywABeBMAARnPAAF4EjrfAAF4EwABGdMAAXgTAAEZ1wABeBMAARnbAAF4EwABGd8AAXgTAAEZ4wABeBMAARnrAAF4DlHHAAF4kwABGfsAAXiTAAEZ/wABeJINWwABeA5R0wABeKMAARoDAAF4owABGgsAAXiiuJcAAXijAAEaDwABeKJPKwABeKInNwABeKMAARonAAF4owABGisAAXijAAEaFwABeKJ3KwABeKMAARovAAF4owABGjMAAXiiGY8AAXijAAEaNwABeKInUwABeKInVwABeKInWwABeKMAATo/AAF46wABGhMAAXjrAAEaPwABeKMAARmfAAF4owABGksAAXijAAEaQwABeKMAARpHAAF4ohwXAAF4ohavAAF4ohcbAAF4ohcTAAF4ohb/AAF4ohcLAAF4ohb3AAF4ohcvAAF4oheHAAF4ohdPAAF4ohZfAAF4ohdXAAF4ohZvAAF4ohdfAAF4ohaHAAF4ohd7AAF4ohXvAAF4owABGoMAAXiiFp8AAXijAAEapwABeKMAARrPAAF4owABGrMAAXijAAEaxwABeKIVCwABeKIV0wABeKIWIwABeKIWOwABeKIVQwABeKIXkwABeKIVFwABeKIVkwABeKIWSwABeKIV5wABeKIW3wABeKIWvwABeKIWDwABeKIXJwABeKIWAwABeKIXswABeKMAARrjAAF4owABGzsAAXijAAEbPwABeKMAARpXAAF4onVLAAF4owABGx8AAXijAAEaqwABeKMAARrXAAF4owABGysAAXijAAEaYwABeKMAARqTAAF4owABGpcAAXijAAEanwABeKJ7xwABeKMAARqvAAF4owABGXsAAXijAAEa7wABeKMAARsnAAF4DlHXAAF56AMAAXcLAAEbXwABefJRlwABefcAARtjAAF59ib3AAF59g3PAAF59g8DAAF59haXAAF59habAAF58lHTAAF6EwABGssAAXoTAAEauwABehMAARq3AAF58lHXAAF6IAMAAXcLAAEbZwABeipRlwABei8AATo/AAF6Muv7AAF6MwABG2sAAXozAAEbbwABeipRxwABekIFWwABekMAARrfAAF6KlHTAAF6TwABGtMAAXpPAAEZjwABek8AARtzAAF6TwABGv8AAXpODZ8AAXoqUdcAAXpkAwABdwsAARt3AAF6blGXAAF6cwABG3sAAXpuUdMAAXp6Fq8AAXpuUdcAAXqAAwABdwsAARuDAAF6ilGXAAF6jhA3AAF6jgJbAAF6jgTPAAF6ilHXAAF6nAMAAXcLAAEbhwABeqZRlwABeqoQNwABeqoCWwABeqZR1wABerQDAAF3CwABG4sAAXq+UdMAAXrCJzcAAXrDAAEaIwABer5R1wABeswDAAF3CwABG48AAXrWUdMAAXraJzcAAXrbAAEaIwABetsAATo/AAF65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AF9Kr0XAAF9KwABHfsAAX0qyBcAAX0rAAEeAwABfSrGOwABfSrGPwABfSrGTwABfSsAAR4LAAF9KwABHg8AAX0qwl8AAX0qv98AAX0rAAEeGwABfSq/6wABfSrAFwABfSsAAR4jAAF9KwABHicAAX0qvOcAAX0rAAEeLwABfSrhRwABfSsAAR43AAF9KwABHjsAAX0rAAEePwABfSsAAR5DAAF9KwABHkcAAX0rAAEeSwABfSq8iwABfSq8SwABfSq8VwABfSsAAR5PAAF9KsODAAF9KwABEiMAAX0rAAESNwABfSsAAR5bAAF9KwABHl8AAX0rAAEeawABfSsAAR5vAAF9KwABHnMAAX0rAAEedwABfSsAAR5/AAF9KuFnAAF9KsAzAAF9KsA/AAF9KsBHAAF9Kr5jAAF9KwABEicAAX0rAAESOwABfSsAAR6XAAF9KscPAAF9Ksa/AAF9KscbAAF9KwABHpsAAX0qwm8AAX0qwz8AAX0rAAEenwABfSrGUwABfSsAAR6jAAF9KwABHqsAAX0rAAEeswABfSq8lwABfSsAAR63AAF9KuFTAAF9KsQHAAF9Ksc7AAF9KsPXAAF9KsPbAAF9KsPjAAF9KsZjAAF9KsQLAAF9KsKTAAF9KsKDAAF9KwABHsMAAX0qwrsAAX0qws8AAX0rAAEeywABfSrFPwABfSrFRwABfSsAAR7TAAF9KseLAAF9KsePAAF9KseTAAF9KwABHtcAAX0qx6cAAX0qx6MAAX0qxYcAAX0qxa8AAX0qwMcAAX0qwNMAAX0qxmcAAX0qxmsAAX0qwucAAX0qwQMAAX0qvr8AAX0qvssAAX0qwx8AAX0qwysAAX0qwy8AAX0qxLcAAX0qxPcAAX0q/xcAAX0qwWcAAX0qxe8AAX0qxPsAAX0qxP8AAX0qxQMAAX0qxQcAAX0qxRMAAX0qxSsAAX0qw5MAAX0qw5cAAX0qv0cAAX0qxCcAAX0qwvsAAX0qwjcAAX0qx0MAAX0qx2cAAX0qxncAAX0qxn8AAX0qxocAAX0qwkMAAX0qwCMAAX0qwecAAX0qwhcAAX0qwk8AAX0qv/8AAX0qxVsAAX0qxK8AAX0qxMcAAX0rAAEe4wABfSsAAR7rAAF9KwABHvMAAX0qx8cAAX0qyAsAAX0qyA8AAX0rAAEe+wABfSsAAR8HAAF9Kr5LAAF9Kr5TAAF9Kr/PAAF9Kr/jAAF9KsVTAAF9KsbHAAF9Ksb7AAF9KsVPAAF9KsRnAAF9KsQ/AAF9KsRbAAF9KsOfAAF9KsOjAAF9KsOvAAF9KsO3AAF9KsLbAAF9KwABHw8AAX0qxrMAAX0qwXsAAX0rAAEfEwABfSr5OwABfSrH1wABfSrADwABfSsAAR8XAAF9KwABHxsAAX0rAAEfKwABfSsAAR8zAAF9HlHLAAGBuwABHB8AAX0eUdcAAYHAAAMAATpfAAGBylGbAAGBzwABH58AAYHKO0MAAYHWUZcAAYHa4XcAAYHbAAERmwABgdsAARGfAAGB2wABEaMAAYHbAAEfqwABgdsAAR+vAAGB2wABH7MAAYHWUccAAYH6BTMAAYH6zFcAAYH7AAEftwABgfsAAR/DAAGB+wABH8sAAYH7AAEfzwABgfsAAR/TAAGB+wABH9sAAYHWUdMAAYIe4X8AAYIfAAEf+wABgh8AASAjAAGCHwABH+8AAYIfAAEgQwABgh8AASBHAAGCHwABIEsAAYIfAAEgJwABgh8AASAbAAGCHwABIHcAAYIfAAEgCwABgh8AASCTAAGCHwABIIsAAYIfAAEgrwABgh8AASC3AAGCHwABIBMAAYIfAAEgjwABgh8AASDHAAGCHwABIMsAAYIfAAEgzwABgh8AASDTAAGCHwABIB8AAYIfAAEg5wABgh8AASDfAAGCHwABIAMAAYIeviMAAYIfAAEf6wABgh8AASBfAAGCHwABIScAAYIfAAEhLwABgh8AASEzAAGCHwABIUcAAYIfAAEhSwABgh8AASFPAAGCHwABIRsAAYIfAAEhNwABgh8AASFDAAGCHwABIT8AAYIfAAEhYwABgh8AASFTAAGCHwABIVsAAYIfAAEgawABgh8AASD7AAGCHwABIbcAAYIfAAERvwABgh8AASBXAAGCHwABIFMAAYIfAAEhywABgh8AASHPAAGCHwABIdcAAYIfAAEh2wABgh8AASHnAAGCHwABIesAAYIfAAEgYwABgh8AASILAAGCHwABIg8AAYIfAAEiFwABgh8AASIfAAGCHwABIFsAAYIfAAEiJwABgh8AASA3AAGCHwABIH8AAYIfAAEiNwABgh8AASI7AAGCHwABIj8AAYIfAAEgLwABgh8AASJXAAGCHwABIlMAAYIfAAEiZwABgh8AASJbAAGCHwABIncAAYIfAAEiewABgh6+EwABgh8AASJ/AAGCHwABIosAAYIfAAEijwABgh8AASG7AAGCHwABIpsAAYIfAAEhVwABgh8AASKnAAGCHwABIIcAAYIfAAEgcwABgh8AASFnAAGCHwABIV8AAYIfAAEgqwABgh8AASHvAAGCHwABIsMAAYIfAAEh4wABgh8AASE7AAGCHwABIs8AAYIfAAEi0wABgh8AASLXAAGCHwABIssAAYIfAAEi4wABgh8AASLfAAGCHwABIu8AAYIfAAEjIwABgh8AASMvAAGCHwABIzcAAYIfAAEjKwABgh8AASNDAAGCHwABIwMAAYIfAAERtwABgh8AARGvAAGCHwABI1MAAYIfAAEjTwABgh8AASJvAAGCHwABI1sAAYIfAAEjZwABgh8AASOvAAGCHwABI3cAAYIfAAEjwwABgh8AASNrAAGCHwABI78AAYIevgMAAYIfAAEj0wABgh8AASPXAAGCHwABI88AAYIfAAE6XwABg/sAASPnAAGCHwABI/MAAYIfAAEj3wABgh8AASP7AAGCHwABI/cAAYIfAAEkQwABgh8AASRXAAGCHwABJFMAAYIfAAEkXwABgh8AASRbAAGCHwABJDMAAYIfAAEkNwABgh8AASRHAAGCHwABJEsAAYIfAAEkfwABgh8AASRPAAGCHwABJIcAAYIfAAEkGwABgh8AASSPAAGCHwABJJcAAYIfAAEkOwABgh8AASQXAAGCHwABJD8AAYIfAAEkHwABgh8AASQjAAGCHwABIrMAAYIfAAEkJwABgh8AASSbAAGCHwABEZcAAYIfAAEkKwABgh8AASQvAAGCHwABJKcAAYIfAAEkCwABgh8AARGrAAGCHwABEacAAYIfAAEhAwABgh8AASSTAAGCHwABI/8AAYIfAAEktwABgh8AASQDAAGCHwABJLsAAYIfAAEkwwABgh8AASSLAAGCHwABI7cAAYIfAAEjfwABgh8AASNvAAGCHwABJOMAAYIfAAEk6wABgh8AASODAAGCHwABI4cAAYIfAAEk8wABgh8AAST3AAGCHwABJP8AAYIfAAElAwABgh8AAST7AAGCHwABJQcAAYIfAAEjjwABgh8AASOTAAGCHwABI3MAAYIfAAERuwABgh8AASO7AAGCHwABJBMAAYIfAAEjywABgh8AASOLAAGCHwABI5cAAYIfAAEjmwABgh8AASUzAAGCHwABJUMAAYIfAAElRwABgh8AASOfAAGCHwABIocAAYIfAAEjpwABgh8AASOjAAGCHwABI6sAAYIfAAElTwABgh8AASLnAAGCHwABIusAAYIfAAEjYwABgh8AASAzAAGCHwABH/MAAYIfAAEf9wABgh8AAR/fAAGCHwABID8AAYIfAAElUwABgh8AASVXAAGCHwABJVsAAYIe5YMAAYIevgcAAYIfAAElXwABgh8AASVvAAGCHwABJXcAAYIfAAElcwABgh8AASWPAAGCHwABJacAAYIfAAElswABgh8AASW3AAGCHwABJasAAYHWUdcAAYWAAAMAATpjAAGFivifAAGFjlGXAAGFkwABJccAAYWSKacAAYWSAlsAAYWOUdMAAYWiBU8AAYWOUdcAAYWoAwABhasAASXIAwABOmcAAYW2ujsAAYW6UZcAAYW+DKMAAYW/AAE6ZwABhcYR1wABhb4GmwABhb4UywABhb4UJwABhb4XtwABhbpR0wABhd4FTwABhbpR1wABheQAAwABOmsAAYXuuj8AAYXyUZcAAYX2BiMAAYX3AAEl0wABhfY1YwABhfYtHwABhfcAASG/AAGF9uvbAAGF9wABJdsAAYX3AAEl3wABhfZpowABhfbqSwABhfYUXwABhfbHFwABhfcAASXnAAGF8lHHAAGGLwABIpcAAYXyUdMAAYY2BU8AAYXyUdcAAYY/AAE6awABhkIEmAMAATpvAAGGSlHTAAGGTvu7AAGGTvu/AAGGTvvDAAGGSrpDAAGGXlGXAAGGYgyjAAGGYwABOm8AAYZqEdcAAYZiBpsAAYZjAAEl8wABhmMAASX3AAGGYwABJfsAAYZeUdMAAYaCBU8AAYZeUdcAAYaIAAMAATpzAAGGklGbAAGGlwABH58AAYaSUdMAAYafAAEfPwABhp8AASYrAAGGkrpHAAGGqlGXAAGGrwABIIMAAYau6R8AAYavAAEgwwABhq6yJwABhq8AASD3AAGGrwABIP8AAYavAAEhBwABhq8AASETAAGGrwABIZsAAYavAAEhlwABhq8AASUfAAGGrhjrAAGGrwABIG8AAYavAAEg6wABhq8AASDvAAGGrwABIb8AAYavAAEhwwABhq8AASX/AAGGrwABJgMAAYavAAEmBwABhq8AASYLAAGGrwABJg8AAYauv18AAYauv2MAAYavAAEiYwABhq8AASJPAAGGrwABIvMAAYavAAEmEwABhq8AASM7AAGGrwABJhcAAYau+k8AAYavAAEjRwABhq8AASNLAAGGrwABI8cAAYavAAEknwABhq8AASSjAAGGrhX7AAGGrwABIpMAAYavAAEkswABhq8AASTvAAGGrwABJUsAAYavAAE6cwABh1YR1wABhq6/WwABhq8AASYbAAGGrwABJh8AAYavAAEmIwABhq6/UwABhq8AASYnAAGGrr9rAAGGrwABIjMAAYaqUdMAAYd+BU8AAYd/AAEgfwABhqpR1wABh4gAAwABOncAAYeSuksAAYeWUZcAAYeaDKMAAYebAAE6dwABh6IR1wABh5oGmwABh5oYewABh5oUIwABh5sAAR1TAAGHmwABJj8AAYebAAEmQwABh5sAARVrAAGHmwABJkcAAYebAAEmSwABh5sAAR67AAGHmwABJk8AAYebAAEmUwABh5sAASZXAAGHmwABJlsAAYebAAEmXwABh5ZR0wABh+YFTwABh5ZR1wABh+wAAwABOnsAAYf2+KMAAYf6UdMAAYf/AAEh4wABh/pR1wABiAQAAwABOn8AAYgOUdMAAYgSulcAAYgTAAEmawABiBMAAR+LAAGIEwABH4cAAYgS8Z8AAYgTAAEfjwABiBMAAR+TAAGIEnsTAAGIEwABH5cAAYgTAAEfmwABiBK6TwABiBK6UwABiBMAASZ3AAGIEwABJnsAAYgTAAEmfwABiBMAASaDAAGIEwABJocAAYgTAAEmiwABiBMAASaPAAGIEwABJpADAAE6gwABiGa6uwABiGpRlwABiG4MowABiG8AATqDAAGIdhHXAAGIbgabAAGIbhWfAAGIbwABJvsAAYhvAAEm/wABiG4XwwABiG8AAScDAAGIbwABJwcAAYhvAAEcvwABiG8AAScLAAGIbwABHcsAAYhvAAEnDwABiG8AAScTAAGIbwABJxcAAYhvAAEnGwABiG8AAScfAAGIbwABJyMAAYhvAAEnJwABiG4UywABiG8AAScrAAGIbhQzAAGIbsPHAAGIbwABJy8AAYhvAAEnMwABiG8AASc3AAGIbrp7AAGIbwABHYsAAYhuvScAAYhvAAEnOwABiG68ZwABiG7/jwABiG4Y5wABiG8AASc/AAGIbwABJ0MAAYhuFvMAAYhvAAEnRwABiG6AfwABiG4R8wABiG7FQwABiG8AASdLAAGIbwABHZcAAYhux5sAAYhux6sAAYhvAAEnTwABiG8AASdTAAGIalHTAAGJLgVPAAGIalHXAAGJNAMAAYhnAAEnVwABiT5RlwABiUMAASdbAAGJQn3fAAGJPlHTAAGJTj73AAGJTsR3AAGJTr5nAAGJTwABJ3MAAYlOu8MAAYlPAAEndwABiU6urwABiU67zwABiU7D9wABiU68TwABiU8AASd/AAGJTwABHBsAAYlOv0cAAYlPAAEewwABiU69LwABiU6+FwABiU8AAR6jAAGJTwABHMsAAYlPAAEcRwABiU8AARyDAAGJTwABHGMAAYlPAAEciwABiU8AARxvAAGJTwABHJMAAYlPAAEcUwABiU8AAR7TAAGJTsfHAAGJTwABHusAAYlPAAEe8wABiU8AAR0bAAGJTwABHuMAAYlPAAEedwABiU8AAR5/AAGJTuFnAAGJTwABHTMAAYlOvRcAAYlOvksAAYlOvlMAAYlOv98AAYlOv+sAAYlOv/8AAYlPAAEcxwABiU8AARz3AAGJTr67AAGJTsPbAAGJTsF7AAGJTwABJ5cAAYlO+TsAAYlOsYMAAYk+UccAAYoWBTMAAYk+UdcAAYocAwABiGcAASebAAGKJlHTAAGKKwABJ58AAYoqu8MAAYoqu88AAYoopwABiiZRxwABij4cPwABijyLAAGKPgabAAGKPgODAAGKJlHXAAGKUAMAAYhnAAEnowABilpRlwABil7bHwABil7bIwABilpRxwABimiLAAGKagODAAGKahw/AAGKagabAAGKWlHTAAGKfKcAAYp+u8MAAYp+u88AAYp/AAEnnwABin8AATqDAAGKkijHAAGKWlHXAAGKmAMAAYhnAAEnrwABiqJRlwABiqcAASezAAGKpwABJ7cAAYqnAAEnuwABiqJR0wABirSnAAGKtrvPAAGKtwABJ58AAYq2u8MAAYqiUccAAYrIiwABisocPwABisoDgwABisoGmwABiqJR1wABitwDAAGIZrqvAAGK5lHTAAGK6rvPAAGK6sPTAAGK5lHXAAGK9AMAAYhmurMAAYr+UdMAAYsCu88AAYr+UdcAAYsIAwABiGa6vwABixJRlwABixYnOwABixJR0wABix4FTwABixJR1wABiyQAAwABOocAAYsuUZsAAYszAAEnywABiy75kwABizpRlwABiz8AATqHAAGLQiWXAAGLQwABJ88AAYs6UccAAYtNAwABizpR0wABi1T7AAGLOlHXAAGLXAMAAYsvAAEn0wABi2ZRlwABi2sAATqHAAGLbwABJ9cAAYtvAAEnzwABi24llwABi2ZRxwABi30DAAGLZlHTAAGLhPsAAYtmUdcAAYuMAwABiy75lwABi5ZRlwABi5sAATqHAAGLnwABJ9cAAYufAAEnzwABi5ZRxwABi6j3AAGLllHXAAGLsAMAAYsu+Y8AAYu6UZcAAYu+TqsAAYu+u7cAAYu6UdMAAYvKuysAAYvK3ocAAYvKBU8AAYvKe0sAAYvK+asAAYvKVI8AAYvKBscAAYvInwABi8r5owABi7pRxwABi/IFWwABi/CLAAGL8gdfAAGLulHXAAGMAAMAAYsu+YsAAYwKUZcAAYwOTqsAAYwPAAEn4wABjA4DgwABjApR0wABjB75zwABjB4CgwABjB5/CwABjB43/wABjApRxwABjDIFWwABjDIFpwABjApR1wABjDwAAwABOosAAYxGUdMAAYxLAAEn5wABjEsAASfrAAGMSwABJ/8AAYxLAAEoBwABjEsAASgMAwABOo8AAYxjAAEoFwABjGZRlwABjGoGXwABjGZR0wABjHJxXwABjHLehwABjHKyOwABjHLcFwABjHLcGwABjHLekwABjGZRxwABjI4GIwABjI7ILwABjI7IlwABjGZR1wABjJwAAwABOpMAAYymUdMAAYyrAAEoswABjKsAASi3AAGMqwABKLsAAYymEu8AAYy6UZcAAYy+DKMAAYy/AAE6kwABjMYR1wABjL4GmwABjLzbAAGMvwABKHcAAYy/AAEoewABjL8AASh/AAGMvwABKIMAAYy/AAEohwABjL4ZJwABjL4aCwABjL8AASiLAAGMvwABKI8AAYy/AAEokwABjL8AASiXAAGMvhoTAAGMvwABKJsAAYy/AAEonwABjL8AASijAAGMvwABKKcAAYy+QBMAAYy/AAEoqwABjL8AARtXAAGMvwABKK8AAYy6UdMAAY0mBU8AAYy6UdcAAY0sAAMAATqXAAGNNv+LAAGNOlGXAAGNPgyjAAGNPwABOpcAAY1GEdcAAY0+BpsAAY0+/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hmQAwABOqsAAZGOUdMAAZGS/+sAAZGTAAESpwABkY8AASpTAAGRnlGXAAGRog1fAAGRowABKlcAAZGeUdMAAZGuycMAAZGuICsAAZGvAAEqWwABkZ5R1wABkbwAAwABOq8AAZHHAAEqXwABkcpR0wABkc8AAQo/AAGRylHXAAGR1AMAAZHHAAEqYwABkd5R0wABkeMAAQo/AAGR3lHXAAGR6AADAAE6swABkfMAASpvAAGR9lGXAAGR+hADAAGR+ivjAAGR+wABKnMAAZH6UhcAAZH2UdMAAZIOT98AAZIPAAEqdwABkg0nAAGR9lHXAAGSHAMAAZHzAAEqgwABkiZRlwABkioQAwABkior4wABkisAASpzAAGSKwABKocAAZImUdMAAZI+T98AAZI/AAEqdwABkj0nAAGSJlHXAAGSTAMAAZHzAAEK6wABklZRlwABklo4HwABklobSwABklZR1wABkmQDAAGR8wABCu8AAZJuUZcAAZJyOB8AAZJuUdcAAZJ4AwABkfMAAQrzAAGSglHTAAGShwABCz8AAZKHAAELRwABkoJRxwABkpIFWwABkoJR1wABkpgDAAGR8lh3AAGSolHTAAGSpwABCz8AAZKnAAELRwABkqJRxwABkrIFWwABkqJR1wABkrgDAAGR8wABKp8AAZLCUdMAAZLHAAELPwABkscAAQtHAAGSwlHXAAGS0AMAAZHzAAEqpwABktpR0wABkt8AAQs/AAGS3wABC0cAAZLaUdcAAZLoAwABkfMAASqrAAGS8lHTAAGS9wABCz8AAZL3AAELRwABkvJR1wABkwADAAGR8wABKq8AAZMKUdMAAZMPAAELPwABkw8AAQtHAAGTClHXAAGTGAMAAZHzAAEqtwABkyJRlwABkycAASq7AAGTJwABKr8AAZMnAAEqwwABkyJR0wABkzcAAQs/AAGTNwABC0cAAZMiUdcAAZNAAwABk0MAASrHAAGR8wABKtsAAZNOUZcAAZNTAAEq3wABk1KzuwABk1JBBwABk05R0wABk2MAAQs/AAGTYwABC0cAAZNOUccAAZNuBVsAAZNOUdcAAZN0AwABkfMAASrjAAGTflGXAAGTgwABKucAAZN+UdMAAZOLAAELPwABk4sAAQtHAAGTflHXAAGTlAMAAZHzAAEq6wABk55RlwABk6IFpwABk6IL6wABk55R0wABk68AAQs/AAGTrwABC0cAAZOeUdcAAZO4AwABkfMAASr3AAGTwlGXAAGTxgWnAAGTxgvrAAGTwlHXAAGT0AMAAZHzAAEq+wABk9pRlwABk94FpwABk94L6wABk98AASsDAAGT2lHTAAGT7wABCz8AAZPvAAELRwABk9pR1wABk/gDAAGR8wABKwcAAZQCUZcAAZQGBacAAZQGC+sAAZQHAAErAwABlAJR1wABlBQDAAGR8wABKwsAAZQeUZcAAZQiBacAAZQiC+sAAZQjAAErAwABlCMAASsTAAGUHlHTAAGUNwABCz8AAZQ3AAELRwABlB5R1wABlEADAAGR8wABKxcAAZRKUZcAAZROBacAAZROC+sAAZRPAAErAwABlE8AASsTAAGUSlHXAAGUYAMAAZHzAAErGwABlGpRlwABlG5DowABlGpR0wABlHcAAQs/AAGUdwABC0cAAZRqUdcAAZSAAwABkfMAASsjAAGUilGXAAGUjkEHAAGUilHTAAGUlwABCz8AAZSXAAELRwABlIpR1wABlKADAAGR8wABKycAAZSqUZcAAZSuQQcAAZSvAAErKwABlK8AASsvAAGUqlHTAAGUvwABCz8AAZS/AAELRwABlKpR1wABlMgDAAGR8wABKzsAAZTSUZcAAZTW218AAZTXAAErPwABlNJR0wABlOMAAQs/AAGU4wABC0cAAZTSUdcAAZTsAwABkfMAAStLAAGU9lGXAAGU+wABK08AAZT7AAErUwABlPZR0wABlQcAAQs/AAGVBwABC0cAAZT2UdcAAZUQAwABkfMAAStbAAGVGlGXAAGVHhZXAAGVHwABK18AAZUfAAErYwABlRpR0wABlS8AAQs/AAGVLwABC0cAAZUaUdcAAZU4AAMAATq3AAGVQwABCvcAAZVGUZcAAZVLAAErewABlUsAASt/AAGVSwABK4MAAZVLAAErhwABlUsAASuLAAGVSgOHAAGVSgyjAAGVSQMAAZVGUdMAAZVvAAErjwABlW8AASuTAAGVbwABK5sAAZVs+wABlUZR1wABlYAAAwABOrsAAZWKUZcAAZWPAAEsQwABlY8AASxHAAGVjwABLEsAAZWPAAEsTwABlY8AASxTAAGVjwABLFcAAZWPAAEsWwABlY8AASxfAAGVjwABLGMAAZWPAAEsZwABlY8AASxrAAGVjwABLG8AAZWPAAEscwABlY8AASx3AAGVjwABLHsAAZWPAAEsfwABlY8AASyDAAGVjwABLIcAAZWPAAEsiwABlY8AASyPAAGVjwABLJMAAZWPAAEslwABlY8AASybAAGVjwABLJ8AAZWPAAEsowABlY8AASynAAGVjwABLKsAAZWPAAEsrwABlY8AASyzAAGVjwABLLcAAZWPAAEsuwABlY8AASy/AAGVjwABLMMAAZWPAAEsxwABlY8AASzLAAGVjwABLM8AAZWPAAEs0wABlY8AASzXAAGVjwABLNsAAZWPAAEs3wABlY8AASzjAAGVjwABLOcAAZWPAAEs6wABlY8AASzvAAGVjwABLPMAAZWPAAEs9wABlY8AASz7AAGVjwABCv8AAZWPAAEs/wABlY8AAS0DAAGVjwABLQcAAZWPAAEtCwABlY8AAS0PAAGVjwABLRMAAZWPAAEtFwABlY8AAS0bAAGVjwABLR8AAZWPAAEtIwABlY8AAS0nAAGVjwABLSsAAZWPAAEtLwABlY8AAS0zAAGVjwABLTcAAZWPAAEK+wABlY8AAS07AAGVjwABLT8AAZWPAAELBwABlY8AAS1DAAGVjwABLUcAAZWPAAEtSwABlY8AAS1PAAGVjwABLVMAAZWPAAEtVwABlYpR0wABlrcAAS1bAAGWtwABLV8AAZa3AAEtYwABlrcAAS1nAAGWtwABLW8AAZa3AAEtcwABlrcAAS13AAGWtwABLXsAAZa3AAEtfwABlrcAAS2DAAGWtwABLYcAAZa3AAEtiwABlrcAAS2PAAGWtwABLZMAAZa3AAEtlwABlrcAAS2bAAGWtwABLZ8AAZa3AAEtowABlrcAAS2nAAGWtwABLasAAZa3AAEtrwABlrcAAS2zAAGWtwABLbcAAZa3AAEtuwABlrcAAS2/AAGWtwABLcMAAZa3AAEtxwABlrcAAS3LAAGWtwABLc8AAZa3AAEt0wABlrcAAS3XAAGWtwABLdsAAZa3AAEt3wABlrcAAS3jAAGWtwABLecAAZa3AAEt6wABlrcAAS3vAAGWtwABLfMAAZa3AAEt9wABlrcAAS37AAGWtwABLf8AAZa3AAEuAwABlrcAAS4HAAGWtwABLgsAAZa3AAEuDwABlrcAAS4TAAGWtwABLhcAAZa3AAEuGwABlrcAAS4fAAGWtwABLiMAAZa3AAEuJwABlrcAAS4rAAGWtwABLi8AAZa3AAEuMwABlrcAAS43AAGWtwABLjsAAZa3AAEuPwABlrcAAS5DAAGWtwABLkcAAZa3AAEuSwABlrcAAS5PAAGWtwABLlMAAZa3AAEuVwABlrcAAS5bAAGWtwABLl8AAZa3AAEuYwABlrcAAS5nAAGWtwABLmsAAZa3AAEubwABlrcAAS5zAAGWtwABLncAAZa3AAEuewABlrcAAS5/AAGWtwABLoMAAZa3AAEuhwABlrcAAS6LAAGWtwABLo8AAZa3AAEukwABlrcAAS6XAAGWtwABLpsAAZa3AAEunwABlrcAAS6jAAGWtwABLqcAAZa3AAEuqwABlrcAAS6vAAGWtwABLrMAAZa3AAEutwABlrcAAS67AAGWtwABLr8AAZa3AAEuwwABlrcAAS7HAAGWtwABLssAAZa3AAEuzwABlrcAAS7TAAGWtwABLtcAAZa3AAEu2wABlrcAAS7fAAGWtwABLuMAAZa2U0MAAZa3AAEu5wABlrcAAS7rAAGWtwABLu8AAZa3AAEu8wABlrcAAS73AAGWtwABLvsAAZa3AAEu/wABlrcAAS8DAAGWtwABLwcAAZa3AAEvCwABlrcAAS8PAAGWtwABLxMAAZa3AAEvFwABlrcAAS8bAAGWtwABLx8AAZa3AAEvIwABlrcAAS8nAAGWtwABLysAAZa3AAEvLwABlrcAAS8zAAGWtwABLzcAAZa3AAEvOwABlrcAAS8/AAGWtwABL0MAAZa3AAEvRwABlrcAAS9LAAGWtwABL08AAZa3AAEvUwABlrcAAS9XAAGWtwABCwMAAZWLAAEqawABmL5R0wABmMIbdwABmL5R1wABmMgDAAGViwABK6cAAZjSUdMAAZjWG3cAAZjSUdcAAZjcAwABlYsAASuvAAGY5lHTAAGY6ht3AAGY6hb3AAGY6hb/AAGY6hcLAAGY6hcTAAGY6hcbAAGY6hULAAGY6hYPAAGY6hYjAAGY6hZLAAGY6hcnAAGY6hc3AAGY6hc/AAGY6hdHAAGY6hdvAAGY6hY7AAGY6ha/AAGY6hbfAAGY6hcvAAGY6hdPAAGY6hdXAAGY6hdfAAGY6heTAAGY6hVDAAGY6hVLAAGY6hWDAAGY6hWLAAGY6hXTAAGY6hXfAAGY6hUXAAGY6hUfAAGY6hWTAAGY6hWbAAGY6hVTAAGY6hVbAAGY6hXnAAGY6hVjAAGY6hXvAAGY6hd7AAGY5lHXAAGZiAMAAZWLAAEsCwABmZJRlwABmZcAASwPAAGZklHTAAGZnhu/AAGZnwABCz8AAZmfAAELRwABmZJR1wABmawDAAGViwABLBMAAZm2UdMAAZm6G3cAAZm2UdcAAZnAAwABlYsAASwjAAGZylHTAAGZzht3AAGZzhkzAAGZzhk/AAGZzhlHAAGZzhlXAAGZzhl/AAGZzhnLAAGZylHXAAGZ7AMAAZWLAAEsLwABmfZR0wABmfobdwABmfoXvwABmfoYawABmfZR1wABmggDAAGViwABLDMAAZoSUdMAAZoWG3cAAZoSUdcAAZocAAMAATq/AAGaJwABL1sAAZoqUZcAAZovAAE6vwABmjMAAS9fAAGaMv0TAAGaKlHHAAGaPg73AAGaPhMXAAGaPg77AAGaPr/HAAGaPuAzAAGaPuA3AAGaPhjTAAGaKlHXAAGaXAADAAE6wwABmmcAAQx3AAGaalGXAAGabq/nAAGaalHTAAGadiArAAGadhkzAAGadhk/AAGadhlHAAGadhlXAAGadhlPAAGadhljAAGadhl/AAGadhnLAAGadhmjAAGaalHXAAGaoAADAAE6xwABmqpR0wABmq8AAQyUAwABOssAAZq16wABmrpRlwABmr5CXwABmrpR0wABmsawGwABmsauTwABmrpR1wABmtAAAwABOs8AAZraUdMAAZreUy8AAZrfAAEwAwABmt5ZdwABmt5ZmwABmt5ZowABmt8AATALAAGa3wABMA8AAZrfAAEwEwABmt8AATAfAAGa3wABMCMAAZrfAAEwLwABmt8AATA3AAGa3wABMD8AAZrfAAEwQwABmt8AATBHAAGa3wABDNcAAZrfAAEwSwABmt8AATrPAAGbJwABME8AAZsnAAEwXwABmycAATBnAAGa3wABMFMAAZreJxMAAZreJxsAAZrfAAEwVwABmt8AATBbAAGa3wABMGsAAZrfAAEwbwABmt8AATB3AAGa3wABMJMAAZrbAAEviwABm1pRlwABm14MowABm18AATrPAAGbZhHXAAGbXgabAAGbXhkPAAGbXt4HAAGbXwABL58AAZtfAAEvowABm1pR0wABm4IFTwABm1pR1wABm4gDAAGa2wABL6cAAZuSUZcAAZuWDnMAAZuXAAEM1wABm5JR0wABm6JPwwABm6IcswABm6IgEwABm6IaYwABm6IabwABm6IaewABm6IahwABm6IalwABm6IapwABm6IatwABm6Ia0wABm6Ia3wABm6Ia6wABm6IbBwABm6IbIwABm6IbLwABm6IbOwABm5JR1wABm+gDAAGa2wABL+8AAZvyUZcAAZv2DnMAAZv3AAEvqwABm/JR0wABnAJPwwABnAIcswABnAIgKwABnAIZMwABnAIZPwABnAIZRwABnAIZVwABnAIZTwABnAIZYwABnAIZfwABnAIZywABnAIZowABm/JR1wABnDQAAwABOgsAAZw/AAEM2wABnEJRxwABnEYCQwABnEJR0wABnE4LuwABnE8AAQ/XAAGcTgtzAAGcTwABD9sAAZxPAAEP6wABnE8AAQ/zAAGcTwABD/cAAZxPAAEP+wABnE8AAQBTAAGcTwABEBcAAZxPAAE6CwABnHsAARAHAAGcewABECMAAZx7AAEQHwABnHsAARATAAGcewABEGMAAZx7AAEQXwABnHsAARBbAAGcTwABEBsAAZxCUdcAAZycAAMAATrTAAGcpwABDN8AAZyqUZcAAZyuBFsAAZyushMAAZyvAAEQvwABnK4O+wABnK8AATrTAAGcwwABMJsAAZyqUccAAZzKBiMAAZzKDM8AAZyqUdMAAZzXAAERGwABnNcAATrTAAGc3wABMJ8AAZzfAAEw1wABnN8AATC3AAGc3jHfAAGc3wABMLMAAZzXAAEwrwABnNcAATC/AAGc1wABMP8AAZzXAAECJwABnKpR1wABnQQAAwABOtcAAZ0PAAERiwABnRJRlwABnRYFPwABnRJR0wABnR7BewABnRJR1wABnSQAAwABOtsAAZ0vAAEXswABnTJRlwABnTYCQwABnTYU1wABnTcAATEPAAGdNwABMRMAAZ03AAExFwABnTYlMwABnTbCKwABnTcAATEbAAGdNwABEwsAAZ03AAExHwABnTcAATEjAAGdNvn7AAGdNwABOtsAAZ1qHacAAZ0yUdMAAZ1zAAE62wABnXcAATErAAGddwABMS8AAZ13AAExQwABnXcAATE/AAGddwABMVcAAZ13AAExWwABnXcAATFfAAGddwABMVMAAZ13AAExqwABnXcAATGnAAGddwABMbMAAZ13AAExtwABnXcAATG7AAGddwABMa8AAZ13AAExmwABnXcAATGfAAGddwABMTMAAZ13AAExhwABnXcAATFPAAGddwABMYMAAZ13AAExowABnXcAATE7AAGddwABMTcAAZ13AAExYwABnXcAATFnAAGddwABMZMAAZ13AAExvwABnXcAATGPAAGddwABMXMAAZ13AAExxwABnXcAATHPAAGddwABMdMAAZ13AAExewABnXcAATF/AAGddwABMdsAAZ13AAExSwABnXcAATFHAAGddwABMd8AAZ1yF08AAZ1yF1cAAZ1yF18AAZ1yLKcAAZ1yzK8AAZ0yUdcAAZ4kAAMAATrfAAGeLwABF7cAAZ4yUZcAAZ42AkMAAZ43AAExEwABnjY3zwABnjcAATrfAAGeRh2nAAGeMlHTAAGeTwABOt8AAZ5TAAExKwABnlMAATHvAAGeThdXAAGeTiynAAGeTsyvAAGeMlHXAAGeaAADAAE64wABnnMAARe7AAGedlGXAAGeerHHAAGeegRbAAGeegJDAAGeeie7AAGeersDAAGeeruTAAGeewABMf8AAZ57AAEyAwABnnsAATrjAAGenwABMgcAAZ6fAAEyCwABnp8AATIPAAGeewABMhMAAZ57AAEo2wABnnob0wABnnoFMwABnnZRxwABnr8AARgTAAGevhJ/AAGedlHLAAGeywABGBMAAZ52UdMAAZ7SvIsAAZ7SvFcAAZ7TAAEeXwABntMAAR6rAAGe0wABHuMAAZ7TAAEe0wABntMAAR7rAAGe0wABHvMAAZ7SwpMAAZ7TAAEdkwABntMAAR1vAAGe0wABHVcAAZ7TAAEdYwABntLFPwABntLFRwABntLArwABntLAswABntLHxwABntLDwwABntMAAR0bAAGe0sLPAAGe0wABHUsAAZ7SvLMAAZ7SwdcAAZ7S4VMAAZ7TAAEdMwABntK8lwABntLC2wABntK9FwABntK9IwABntK/zwABntMAAR4PAAGe0r/fAAGe0r/jAAGe0r/rAAGe0r//AAGe0sAPAAGe0sAXAAGe0wABHeMAAZ7TAAEd1wABntMAAR3HAAGe0wABHvsAAZ7TAAEfBwABntMAAR2HAAGe0wABEjsAAZ7TAAESLwABntMAARy7AAGe0wABHasAAZ7TAAESMwABntMAAR27AAGe0wABEisAAZ7TAAESNwABntLHiwABntLHkwABntLHpwABntLEbwABntLhVwABntMAAR0XAAGe0wABHkcAAZ7TAAEebwABntMAAR53AAGe0wABHn8AAZ7S4WcAAZ7S4UcAAZ7TAAEYHwABntMAATJPAAGe0wABMi8AAZ7TAAEyPwABntMAATInAAGe0wABHicAAZ7SvOcAAZ7SxocAAZ7TAAEcMwABntLhXwABntMAARw/AAGe0wABHHcAAZ7TAAEcewABntMAARybAAGe0wABHKsAAZ7TAAEcrwABntMAARzrAAGe0wABHXcAAZ7TAAEyVwABntMAATJbAAGe0wABMl8AAZ7TAAEyMwABntMAASJXAAGe0wABMhsAAZ7SWbsAAZ7TAAEyYwABntMAATJnAAGe0rGDAAGe0rxPAAGe0r4jAAGe0wABMiMAAZ7TAAEydwABntMAASeXAAGedlHXAAGgWAADAAE65wABoGMAARe/AAGgZlHTAAGgawABIUMAAaBmUdcAAaBwAAMAATrrAAGgewABMn8AAaB+UZcAAaCDAAEbYwABoH5RzwABoIsAATKDAAGgflHTAAGgkjifAAGgkwABGlsAAaCTAAEa5wABoJMAARrrAAGgkwABG1cAAaCTAAE66wABoKsAATKLAAGgflHXAAGgsAMAAaB7AAEyjwABoLpR0wABoL44nwABoL8AARpbAAGgvwABGucAAaC/AAEa6wABoL8AARtXAAGgulHXAAGg1AMAAaB7AAEymwABoN5R0wABoOMAATrrAAGg5wABMp8AAaDnAAEyowABoOcAATKnAAGg4jifAAGg4wABGlsAAaDjAAEa5wABoOMAARrrAAGg4wABG1cAAaDeUdcAAaEIAAMAATrvAAGhEsHjAAGhFlGXAAGhGgyjAAGhGwABOu8AAaEiEdcAAaEaBpsAAaEaFLcAAaEaFLsAAaEaFL8AAaEaFMMAAaEWUdMAAaE+BU8AAaEWUdcAAaFEAAMAATrzAAGhTwABMrsAAaFSUZcAAaFWUusAAaFSUdMAAaFfAAEf5wABoV8AASArAAGhXwABIA8AAaFfAAEgBwABoV8AASAXAAGhXwABIOMAAaFfAAEg2wABoVJR1wABoXwDAAGhTwABMt8AAaGGUZcAAaGKDKMAAaGLAAE68wABoZIR1wABoYoGmwABoYsAATLjAAGhisATAAGhidcAAaGLAAEy5wABoYsAAR5XAAGhiwABHmcAAaGLAAEy6wABoYZR0wABoboFTwABoYZR1wABocAAAwABOvcAAaHLAAEfOwABoc5RlwABodLhdwABodMAASUTAAGhzlHLAAGh3wABHB8AAaHOUccAAaHmBTMAAaHOUdMAAaHvAAEcIwABoe7GfwABoe8AARwnAAGh7r6/AAGh7sDfAAGh7v8HAAGh7r6PAAGh7r6zAAGh7sPXAAGh7wABHD8AAaHvAAEcMwABoe8AARw7AAGh7wABHLcAAaHvAAEcwwABoe7DHwABoe8AAR3PAAGh7wABHcMAAaHuxLcAAaHuxLsAAaHvAAEc1wABoe7FswABoe7/HwABoe7/TwABoe8AARzjAAGh7wABEhcAAaHvAAEcowABoe8AARyrAAGh7wABHP8AAaHuwKsAAaHu/xcAAaHu/0MAAaHuxc8AAaHuw08AAaHuw58AAaHuw78AAaHu/w8AAaHu/zcAAaHuxYcAAaHvAAEdQwABoe7CuwABoe8AAR1HAAGh7sOTAAGh7wABEhsAAaHuxPsAAaHvAAEdmwABoe7EvwABoe8AARIfAAGh7wABHe8AAaHuvSsAAaHuvR8AAaHuxj8AAaHvAAEeCwABoe6/3wABoe8AAR6bAAGh7sV7AAGh7wABHiMAAaHuvEsAAaHvAAEeSwABoe8AAR4vAAGh7wABHHsAAaHuxX8AAaHvAAEdawABoe7ErwABoe8AAR5PAAGh7wABEiMAAaHvAAEeWwABoe8AAR5rAAGh7wABHp8AAaHvAAEecwABoe8AARInAAGh7sa/AAGh7sbHAAGh7wABHpcAAaHuxP8AAaHuwFsAAaHvAAEeswABoe8AAR63AAGh7sQHAAGh7wABHssAAaHvAAEdjwABoe7HiwABoe8AAR7XAAGh7wABHfMAAaHuwMcAAaHuxmcAAaHu/ysAAaHvAAEfDwABoe8AAR8XAAGh7r5DAAGh7saHAAGh7sG/AAGh7r7LAAGh7sD3AAGh7rzrAAGh7r6nAAGh7r67AAGh7sPbAAGh7wABHj8AAaHvAAEcdwABoe7hVwABoe68swABoe7hRwABoe7hXwABoe8AARy7AAGh7wABHMsAAaHuwy8AAaHvAAEd1wABoe8AAR3HAAGh7sT3AAGh7sTDAAGh7sRvAAGh7sW3AAGh7v8nAAGh7v9TAAGh7wABHOsAAaHvAAESKwABoe8AAR5HAAGh7wABHK8AAaHvAAEdFwABoe8AAR0nAAGh7wABHjsAAaHuwK8AAaHuwWcAAaHuxi8AAaHu/0sAAaHuxe8AAaHuxdMAAaHuw1cAAaHuw6MAAaHuw8MAAaHuwY8AAaHu/z8AAaHuxa8AAaHuxWMAAaHuws8AAaHvAAEdSwABoe7DlwABoe8AARIvAAGh7sUHAAGh7sUTAAGh7sBrAAGh7sTfAAGh7wABEjMAAaHuwL8AAaHuvS8AAaHuvSMAAaHuwc8AAaHuxk8AAaHvAAEeDwABoe6/6wABoe7CbwABoe7FpwABoe685wABoe68VwABoe68iwABoe8AAR5DAAGh7wABHJsAAaHvAAEdEwABoe8AAR0jAAGh7wABHjcAAaHuxaMAAaHvAAEddwABoe7ExwABoe7DgwABoe8AARI3AAGh7wABHl8AAaHvAAEebwABoe7GUwABoe7ARwABoe8AARI7AAGh7scbAAGh7sb7AAGh7scPAAGh7sBjAAGh7wABHqMAAaHuvJcAAaHu4VMAAaHuxAsAAaHuxT8AAaHvAAEdkwABoe7HkwABoe7HpwABoe7AhwABoe7A0wABoe7GawABoe7/MwABoe7GswABoe7C5wABoe7BAwABoe7B1wABoe7HQwABoe7HOwABoe7D4wABoe8AARxHAAGh7wABHGMAAaHvAAEdYwABoe8AARxTAAGh7wABHVcAAaHvAAEfKwABoe8AAR8bAAGh7sMrAAGh7sdnAAGh7wABHMcAAaHvAAEd4wABoe7FAwABoe7AMwABoe7GdwABoe8AAR8TAAGh7sA/AAGh7r4/AAGh7wABHPcAAaHuxmMAAaHuwTMAAaHuwT8AAaHuwUsAAaHuxdsAAaHuwVMAAaHuw7cAAaHvAAEdOwABoe6/RwABoe8AAR2HAAGh7wABHasAAaHuxCcAAaHvAAEeGwABoe8AAR37AAGh7sgXAAGh7wABHicAAaHvAAEfBwABoe7H1wABoe7A/wABoe8AAR6rAAGh7sVHAAGh7wABHgMAAaHuwvsAAaHuxjsAAaHuwjcAAaHuwkMAAaHuwCMAAaHuwecAAaHuwl8AAaHuwk8AAaHuwhcAAaHvAAEciwABoe8AARyDAAGh7sVbAAGh7wABHW8AAaHuv/8AAaHvAAEedwABoe8AAR5/AAGh7uFnAAGh7wABHuMAAaHvAAEfMwABoe8AAR7rAAGh7sCzAAGh7wABHRsAAaHvAAEdMwABoe69FwABoe8AAR7DAAGh7sKDAAGh7wABHvMAAaHvAAEe0wABoe7HxwABoe7AmwABoe7ICwABoe8AAR77AAGh7r5LAAGh7r5TAAGh7r/PAAGh7sF7AAGh7wABHG8AAaHvAAEduwABoe8AARyTAAGh7sAPAAGh7r5jAAGh7sUrAAGh7sAXAAGh7r/jAAGh7sVTAAGh7sgPAAGh7sVPAAGh7sM/AAGh7sKTAAGh7sePAAGh7sRnAAGh7sRbAAGh7sQ/AAGh7vk7AAGh7sOvAAGh7sLbAAGh7wABHBsAAaHux6MAAaHOUdcAAaZ8AAMAATr7AAGmhlGXAAGmiwABH08AAaaGUdMAAaaTAAEfRwABppMAAR9LAAGmhwABH0MAAaaeUZcAAaajAAEkbwABpqMAASRzAAGmnlHTAAGmrIMAAaavAAEkdwABpp5R1wABprgAAwABOv8AAabDAAEfUwABpsZRlwABpsoMowABpssAATr/AAGm0hHXAAGmygabAAGmywABMv8AAabLAAEzAwABpssAATMHAAGmxlHTAAGm6gVPAAGmxlHXAAGm8AADAAE7AwABpvpR0wABpv7WzwABpvsAAR9XAAGnBlGXAAGnCgYnAAGnCwABHEMAAacLAAEdCwABpwq8nwABpwsAAR0HAAGnCwABMwsAAacKvKMAAacKw1MAAacKvJsAAacLAAEzDwABpwsAATMTAAGnBlHLAAGnOwABIw8AAac6vKcAAacGUccAAadGvKcAAacGUdMAAadPAAEi2wABp08AASGHAAGnTwABIxMAAadPAAEiRwABp08AASTLAAGnTwABMyMAAadPAAEzLwABp08AATMzAAGnTwABMzcAAadPAAEzOwABp08AATM/AAGnTwABM0MAAadPAAEzRwABp08AATNLAAGnTwABM08AAadPAAEzWwABp08AATMnAAGnTwABMysAAadPAAEzVwABpwZR1wABp5wAAwABOwcAAaenAAEfWwABp6pRlwABp68AARxLAAGnrwABHFcAAaevAAEdWwABp6pR0wABp743/wABp78AARxHAAGnvwABHFMAAae/AAEdVwABp6pR1wABp9ADAAGnpwABH18AAafaUZcAAaffAAEdswABp98AAR2vAAGn3wABHdMAAaffAAEgpwABp9pR0wABp/I3/wABp/MAAR3XAAGn8wABEi8AAafzAAESOwABp/MAAR2rAAGn2lHXAAGoCAMAAaenAAEfYwABqBJRlwABqBbD5wABqBcAARxXAAGoElHTAAGoIjf/AAGoIwABHFMAAagjAAEcgwABqBJR1wABqDAAAwABOwsAAag7AAEzbwABqD5R0wABqEMAASA3AAGoQwABISsAAahDAAEiXwABqEMAASIrAAGoPlHXAAGoVAMAAag7AAEfZwABqF5R0wABqGMAASCzAAGoYwABIisAAahjAAEgvwABqGMAASK3AAGoYwABOwsAAah3AAEzhwABqF5R1wABqHwDAAGoOwABM4sAAaiGUdMAAaiLAAEgNwABqIsAASErAAGoiwABIl8AAaiLAAEiKwABqIZR1wABqJwDAAGoOwABM48AAaimUdMAAairAAEgswABqKsAASIrAAGoqwABIL8AAairAAEitwABqKsAATsLAAGovwABM4cAAaimUdcAAajEAwABqDsAATObAAGozlHTAAGo0wABIDcAAajTAAEhKwABqNMAASJfAAGo0wABIigDAAE7DwABqOZRlwABqOsAAR9/AAGo6wABH4MAAajrAAEzrwABqOZR0wABqPsAATOzAAGo+wABH3sAAaj6+usAAaj7AAEfdwABqPsAAR9zAAGo5wABH2sAAakSUccAAakXAAEkvwABqRcAASTTAAGpFhEHAAGpElHTAAGpJwABIdMAAaknAAEg1wABqScAATOjAAGpJwABISMAAaknAAEhDwABqRJR1wABqTwDAAGo5wABH28AAalGUccAAalLAAEzpwABqUq0xwABqUsAASELAAGpRlHTAAGpWwABIQMAAalbAAEhFwABqVpUjwABqUZR1wABqWgAAwABOxMAAalyUdMAAal3AAE0SwABqXcAATRPAAGpdwABNFMAAalzAAEz2wABqYZR0wABqYsAASB/AAGphlHXAAGpkAMAAalzAAEz3wABqZpR0wABqZ8AASB/AAGpmlHXAAGppAMAAalzAAEz4wABqa5R0wABqbMAASB/AAGprlHXAAGpuAMAAalzAAEz5wABqcJR0wABqccAASB/AAGpwlHXAAGpzAMAAanOMysAAanPAAEz6wABqXMAATPvAAGp3lHTAAGp4wABIH8AAaneUdcAAanoAwABqeozKwABqXMAATPzAAGp9lHTAAGp+wABIH8AAan2UdcAAaoAAwABqXMAATP3AAGqClHTAAGqDwABIH8AAaoKUdcAAaoUAwABqXMAATP7AAGqHlHTAAGqIwABIH8AAaoeUdcAAaooAwABqiozKwABqXMAATP/AAGqNlHTAAGqOwABIH8AAao2UdcAAapAAwABqXMAATQDAAGqSlHTAAGqTwABIH8AAapKUdcAAapUAwABqXMAATQHAAGqXlHTAAGqYwABIH8AAapeUdcAAapoAwABqXMAATQLAAGqclHTAAGqdwABIH8AAapyUdcAAap8AwABqXMAATQPAAGqhlHTAAGqiwABIH8AAaqGUdcAAaqQAwABqpIzKwABqXMAATQTAAGqnlHTAAGqowABIH8AAaqeUdcAAaqoAwABqqozKwABqXMAATQXAAGqtlHTAAGquwABIH8AAaq2UdcAAarAAwABqXMAATQbAAGqylHTAAGqzwABIH8AAarKUdcAAarUAwABqXMAATQfAAGq3lHTAAGq4wABIH8AAareUdcAAaroAwABquozKwABqusAASDrAAGq6wABIO8AAalzAAE0IwABqv5R0wABqwMAASB/AAGq/lHXAAGrCAMAAalzAAE0JwABqxJR0wABqxcAASB/AAGrElHXAAGrHAMAAaseMysAAasfAAEz6wABqXMAATQrAAGrLlHTAAGrMwABIH8AAasuUdcAAas4AwABqzozKwABqzsAASYTAAGpcwABNC8AAatKUdMAAatPAAEgfwABq0pR1wABq1QDAAGpcwABNDMAAateUZcAAatjAAE0NwABq15R0wABq2sAASB/AAGrXlHXAAGrcAMAAalzAAE0OwABq3pR0wABq38AASB/AAGrelHXAAGrhAMAAalzAAE0PwABq45R0wABq5MAASB/AAGrjlHXAAGrmAMAAauaMysAAaubAAE0QwABqXMAATRHAAGrqlHTAAGrrwABIH8AAauqUdcAAau0AAMAATsXAAGrvlHTAAGrwwABKMADAAE7GwABq8pRlwABq88AATSrAAGrzwABNK8AAavLAAE0WwABq9pRlwABq98AATRfAAGr2lHTAAGr5IMAAavnAAEkdwABq9pR1wABq/ADAAGrywABNGMAAav6UdMAAav/AAEkdwABq/pR1wABrAQDAAGrywABNGcAAawOUdMAAawTAAEkdwABrA5R1wABrBgDAAGrywABNGsAAawiUdMAAawnAAEkdwABrCJR1wABrCwDAAGrywABNG8AAaw2UdMAAaw7AAEkdwABrDZR1wABrEADAAGrywABNHMAAaxKUdMAAaxMgwABrEpR1wABrFQDAAGrywABNHcAAaxeUdMAAaxggwABrF5R1wABrGgDAAGrywABNHsAAaxyUdMAAax0gwABrHcAASR3AAGsclHXAAGsgAMAAavLAAE0fwABrIpR0wABrI8AASR3AAGsilHXAAGslAMAAavLAAE0gwABrJ5R0wABrKMAASR3AAGsnlHXAAGsqAMAAavLAAE0hwABrLJR0wABrLSDAAGstwABJHcAAayyUdcAAazAAwABq8sAATSLAAGsylHTAAGszIMAAazPAAEkdwABrMpR1wABrNgDAAGrywABNI8AAaziUdMAAaznAAEkdwABrOJR1wABrOwDAAGrywABNJMAAaz2UdMAAaz7AAEkdwABrPZR1wABrQADAAGrywABNJcAAa0KUdMAAa0MgwABrQpR1wABrRQDAAGrywABNJsAAa0eUdMAAa0ggwABrR5R1wABrSgDAAGrywABNJ8AAa0yUZcAAa03AAE0owABrTcAATSnAAGtMlHHAAGtQwABJG8AAa0yUdMAAa1IgwABrUsAASR3AAGtMlHXAAGtVAADAAE7HwABrV5RlwABrWMAATVHAAGtYwABNUsAAa1jAAE1TwABrWMAATVTAAGtYwABNVcAAa1jAAE1WwABrWMAATVfAAGtYwABNWMAAa1jAAE1ZwABrWMAATVrAAGtXlHTAAGtjwABNW8AAa2PAAE1cwABrY8AATV3AAGtjwABNXsAAa2PAAE1fwABrY8AATWLAAGtXwABHvcAAa2qUccAAa2vAAEkvwABra8AASTTAAGtrhEHAAGtqlHTAAGtvwABIdMAAa2/AAEg1wABrb8AATOjAAGtvwABISMAAa2/AAEhDwABrapR1wABrdQDAAGtXwABNLcAAa3eUccAAa3jAAEkvwABreMAASTTAAGt4hEHAAGt3lHTAAGt8wABIdMAAa3zAAEg1wABrfMAATOjAAGt8wABISMAAa3zAAEhDwABrd5R1wABrggDAAGtXwABNLsAAa4SUccAAa4XAAEkvwABrhYRBwABrhJR0wABriMAATS/AAGuIwABIQ8AAa4SUdcAAa4sAwABrV8AATTDAAGuNlGXAAGuOjAXAAGuNlHHAAGuQwABJL8AAa5DAAEk0wABrkIRBwABrjZR0wABrlMAASHTAAGuUwABINcAAa5TAAEzowABrlMAASEjAAGuUwABNL8AAa5TAAEhDwABrjZR1wABrmwDAAGtXwABNMcAAa52UccAAa57AAEkvwABrnoRBwABrnZR0wABrocAATS/AAGuhwABIQ8AAa52UdcAAa6QAwABrV8AATTLAAGumlHHAAGunwABJL8AAa6fAAEk0wABrp4RBwABrppR0wABrq8AASHTAAGurwABINcAAa6vAAEzowABrq8AASEjAAGurwABNL8AAa6vAAEhDwABrppR1wABrsgDAAGtXhlDAAGu0lHHAAGu1wABJL8AAa7XAAEk0wABrtYRBwABrtJR0wABrucAASHTAAGu5wABINcAAa7nAAEzowABrucAASEjAAGu5wABIQ8AAa7SUdcAAa78AwABrV8AATTPAAGvBlGXAAGvCLsAAa8KDc8AAa8LAAE00wABrwoHswABrwsAATTXAAGvCwABNNsAAa8GUccAAa8nAAEkvwABrycAASTTAAGvJhEHAAGvBlHTAAGvNwABIdMAAa83AAEg1wABrzcAATOjAAGvNwABISMAAa83AAEhDwABrzcAATPDAAGvNwABM78AAa83AAEzywABrzcAATPPAAGvNwABM7cAAa83AAEzxwABrzcAATO7AAGvNwABNO8AAa8GUdcAAa9sAwABr28AATsfAAGvdwABNN8AAa1fAAE09wABr35RxwABr4K0xwABr35R0wABr4sAASEDAAGviwABIRcAAa+KVI8AAa9+UdcAAa+YAwABrV8AATT7AAGvolHHAAGvpwABM6cAAa+mtMcAAa+nAAEhCwABr6JR0wABr7cAASEDAAGvtwABIRcAAa+2VI8AAa+3AAE1AwABr7cAATT/AAGvolHXAAGvzAMAAa1fAAE1BwABr9ZRxwABr9sAASELAAGv1lHTAAGv4wABNQMAAa/jAAE0/wABr9ZR1wABr+wDAAGtXwABNQ8AAa/2UccAAa/7AAEhCwABr/ZR0wABsAMAATUDAAGwAwABNP8AAa/2UdcAAbAMAwABr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wABtM5RlwABtNJwtwABtNcAATuPAAG0zlHTAAG03hwrAAGw1KcAAbCGHD8AAbGSBVsAAbDWHQ8AAbDWBPwCcLsAAbBeJTsAAbT+UZcAAbUCBiMAAbUAfwABsjCLAAGzJrKvAAGy7wABO5MAAbTOUccAAbUaHfMAAbUWUdMAAbUhVwABsFodIwABtSpR0wABtS4eEwABtPsAATuXAAG1NlHTAAG1OwABO5sAAbBecacAAbVCUZcAAbVGIa8AAbVLAAE7nwABsjof5wABsM4f+wABsF8AATujAAG1WlHXAAG1XAMAAbFTAAE7pwABtWZRzwABtWgDAAGzpiFfAAGzHlHTAAG1dNsAAbFWUdMAAbV+IX8AAbUqUc8AAbWEAwABtSzbAAG0xwABO6sAAbTHAAE7rwABs/8AATuzAAGzmiirAAGxUig/AAG1olHPAAG1pAMAAbBiUc8AAbWvAAE7twABsF4R8wABsNYqDwABsjoFTwABsNYqFwABsVIoMwABtcZRzwABtcgDAAG1xlHTAAG10iqzAAG10iq3AAG10irDAAG10irHAAGwzi1bAAGwflHHAAG16i9nAAGz/wABO7sAAbGmMy8AAbKiBowDAAE7vwABtf7slwABtgJR0wABtgY2PwABtf7smwABtg5R0wABthEnAAG1/wABO8MAAbYaUccAAbYeNksAAbYGNk8AAbF2BU8AAbBWIf8AAbYuUdMAAbYyAoMAAbYCUc8AAbY4AwABsF8AATvHAAG2QlGXAAG2RiGvAAG2SwABO8sAAbYCUZcAAbZSNlMAAbYFJwABsd42lwABsd43/wABsYI3/wABsM44VwABsM44rwABsRY6CwABsRYhfwABsRY6NwABsRY3/wABsF8AATvPAAG2glHXAAG2hAMAAbaCUdMAAbaMuwABto46jwABtoJRxwABtpo6nwABsF4kxwABtqJR1wABtqYhrwABtqokzwABsF4h3wABsXYrgwABsRY7VwABsp5RlwABtr4CWwABsoZR0wABtsSfAAGwXwABO9MAAbLSO4MAAbBfAAE71wABttZR0wABttinAAG0GlHHAAG24IsAAbDOPFcAAbDWPF8AAbEWPGMAAbDWB78AAbMeUdcAAbb4AwABsecAATvbAAG3AlHHAAG3BgVbAAG1dScAAbOaPK8AAbOmPLcAAbXSPLsAAbXSPMcAAbcCUdMAAbciPGMAAbFTAAE73wABtypRzwABtywDAAG16j0PAAG3LwABO2cAAbHGQOMAAbGyB18AAbMnAAE7ZwABsFmjAAG3SlHTAAG3TwABO+MAAbEHAAE75wABt04KpwABsQ5BMwABsFmnAAGxDgqrAAG3YlGXAAG3agJbAAGwWwABO+sAAbdqQT8AAbdyUZcAAbd6AlsAAbGyB3MAAbBfAAE77wABt4ZR0wABt4pBRwABt4pBSwABsFpBVwABt5ZRlwABt5qAgwABsFpRxwABt6JBZwABsFsAATvzAAG3qlHHAAG3rkF/AAG3okFjAAGwWkFfAAGwWkFbAAG3vlHTAAG3wwABO/cAAbe6UZcAAbfKQZcAAbfKQWcAAbLuUdMAAbfWQVMAAbI7AAE7+wABsF4lTwABt+JRxwABt+UDAAGwalHTAAG37wABO/8AAba+ECsAAbeWUccAAbf6OB8AAbf6RC8AAbdORGMAAbBWRGsAAbgKUccAAbgNAwABuApR0wABuBSnAAGwqkRvAAGztlRPAAG37kS3AAGxvAMAAbHvAAE7swABsbJSmwABsNZSrwABsF8AATwDAAGy7wABPAcAAbg+UZcAAbhCcLcAAbhHAAE8CwABuEcAATwPAAG4PlHTAAG4UhwrAAGw1lNvAAGwXwABPBMAAbheUdcAAbhgAwABuDpR0wABuGkXAAGwzlSPAAGwmwABPBcAAbXqZT8AAbC3AAE8GwABuH5RxwABuIIDgwABtEZpOwABsRZpYwABsIYDgwABslcAATwfAAG0HlHXAAG4miGvAAG4ngSbAAGxFgTnAAGxggqHAAGxFlKvAAGwzgVPAAG3rnHTAAGxDkEbAAGx5wABPCMAAbHnAAE8JwABuL5RlwABuMZwswABuMpykwABuMJR0wABuNJwswABuNZyowABuMJRxwABuN4FpwABuMpylwABuMpymwABuNZyqwABsd5P3wABuMJR1wABuPQDAAG4vlHHAAG4/gzXAAG40NcAAbjQ2wABsMYCkwABsNZ6+wABs8sAATwrAAG5FlHPAAG5GAMAAbkWUdMAAbkie0MAAbGCe9MAAbGCddMAAbGCOjcAAbGCNPMAAbGCe+8AAbDOfAsAAbBfAAE8LwABuUJR1wABuUQDAAGx5wABPDMAAblOUdcAAblQAwABtep8dwABsXJRxwABuV4HXwABsecAATw3AAG5ZlHPAAG5aAMAAbP+DNsAAbHnAAE8OwABuXZRzwABuXgDAAGwXlGbAAG5gwABPD8AAbHnAAE8QwABuYpR1wABuYwDAAGx5tlfAAGwtwABPEcAAbmaUdcAAbmcAwABsLcAATxLAAG5plHPAAG5qwABPE8AAbBfAAE8UwABubJR1wABubQDAAG5llHHAAG5vgVbAAGwtwABPFcAAbnGUdMAAbnLAAE8WwABucsAATxfAAG0On5zAAGwtwABPGMAAbnaUdcAAbncAwABsLcAATxnAAG55lHXAAG56AMAAbC3AAE8awABufJR1wABufQDAAGwtwABPG8AAbn+UdcAAboAAwABsLcAATxzAAG6ClHXAAG6DAMAAbC3AAE8dwABuhZR1wABuhgDAAGwtwABPHsAAboiUdcAAbokAwABuZZR0wABui5wswABujJ+hwABujJ+iwABui4HjwABsRcAATx/AAGwtwABPIMAAbpGUdMAAbpKAocAAboyfpcAAbR6UdMAAbpWC/8AAbC3AAE8hwABul5R1wABumADAAG0xwABPIsAAbnLAAE8jwABsnpR0wABunMAATyTAAG6LNsAAbouftcAAbC3AAE8lwABuoJR1wABuoQDAAG0YlHTAAG6jwABPJsAAbHm7ZsAAbTCUdcAAbqYAwABsRZ10wABsecAATyfAAG6plHXAAG6qAMAAbDOddMAAbDOfl8AAbDOfmMAAbDOfmcAAbDOfn8AAbDOfoMAAbDOfncAAbEWBP8AAbEWfpsAAbEWfssAAbEWfs8AAbEWfscAAbEWfrMAAbEWfCsAAbEWftcAAbEWezsAAbHeddMAAbHef+MAAbHef+cAAbHeGb8AAbHeOjcAAbHef1cAAbHefCsAAbHeD68AAbHeDSsAAbqWUdMAAbsWddMAAbsU2wABuxYE0wABuxZ/DwABuxZ/CwABuxY3/wABuxTXAAG7Fjo3AAG7FnwrAAG7Fn4PAAG7Fg5PAAGxgnvfAAGx3wABPH8AAbLvAAE8owABu05R1wABu1ADAAG3Ijf/AAGy8lHXAAG7XAMAAbLvAAE8pwABu2ZR1wABu2gDAAG0Ojf/AAGwXiWPAAG7dlGXAAG7eiGvAAG7fiWXAAGwXiWHAAG7hlHXAAG7iAMAAbLugHsAAbuSUdcAAbuXAAE8qwABu5JR0wABu51XAAGyOqVjAAGw1qVnAAGwxqdHAAGyMqtjAAGxxwABPK8AAbBeJSMAAbLvAAE8swABu75RlwABu8JwtwABu8cAATuPAAG7vlHTAAG7zVcAAbI4gwABsn4E+wABuGoFlwABsF8AATy3AAG74lHXAAG75rFHAAGxsrevAAGxsrezAAGxsre7AAGxsre3AAGxsjHnAAGxsre/AAGw1rfDAAGwtwABPLsAAbwKUdcAAbwMAwABsccAATy/AAGxsrfrAAGxxrfvAAGwXj8fAAG2mrinAAG2QlHHAAG8KrivAAG2QlHTAAG8MRMAAbaOKmMAAbfWuPcAAbhSB2cAAbRaUdMAAbxEgwABsb8AATzDAAGxsrKbAAG0rgdfAAGyOsqPAAGwglHPAAG8XgaPAAGwXwABPMcAAbxmUdcAAbxoAwABvGZR0wABvHICcwABvHCnAAGz/wABPMsAAbHnAAEZ9wABvIJRlwABvIZwswABvIopcwABulYCkwABsjLUfwABsu8AATzPAAG0OtTTAAG6mwABPNMAAbOa1TcAAbFTAAE81wABvKpRzwABvKwDAAGxUwABPNsAAby2Uc8AAby4AwABsVMAATzfAAG8wlHPAAG8xAMAAbFTAAE84wABvM5RzwABvNADAAGxUwABPOcAAbzaUc8AAbzcAwABsVMAATzrAAG85lHPAAG86AMAAbFTAAE87wABvPJRzwABvPQDAAGxUwABPPMAAbz+Uc8AAb0AAwABsVMAATz3AAGxUwABPPsAAb0OUc8AAb0QAwABvQpRzwABvRsAATz/AAG34lHTAAG9IgVPAAGwWuETAAG9KlHXAAG9LAMAAbBa4Q8AAb02UccAAb07AAE9AwABvTZR0wABvULhIwABvToEkwABsQ5BEwABt0pRxwABvVIFMwABvEYFawABsF8AAT0HAAG9XlHPAAG9YgzbAAG9XlHTAAG9auOvAAG9awABO/sAAbSuUDcAAb1q5PsAAb1qpWMAAb1qBU8AAbHG5VcAAbBbAAE9CwABvYpR0wABvY0XAAG9jiF7AAG2BuzfAAGwWuyfAAG2DlGXAAG9ouznAAG9ouzrAAGwWwABPQ8AAbX/AAE9EwABtg5RxwABvbbs7wABvbJRxwABvb7s8wABva5RxwABvcYx5wABvb7s9wABvbbs+wABtf7skwABvdZRlwABvdpDPwABtf8AAT0XAAG94lGXAAG95uz/AAGx5wABPRsAAb3uUdcAAb3wAwABsccAAT0fAAG8Ku33AAG8RR8AAbu+UdcAAb4EAwABs9IcPwABta8AAT0jAAGwXwABPScAAbBfAAE9KwABvhpRxwABvhz3AAG+FlHTAAG+JPsAAb4WUccAAb4tAwABsbMAARfbAAG0rwABG0cAAbxHAAEbSwABvY4FlwABsSpR1wABvkQDAAG9awABMqsAAbDG468AAbDHAAEyqwABvEYE/wABvEUTAAG8Rge/AAG8Rgf1dA8AAbBkBYAPAAGwYYAOBAV4DAAEBAWADk30AAVcDk3MAXF0DwABsGQFgA5N9XQPAAGxfAmADwABsWF0DwABsGQFgA5N9XgMAAQEBYAOTfQABVwOTcwBcYAPAAGwYXQPAAGwZAWADwABsWGADMF0DwABsGQFgA4KSXQPAAGxXAWADgpJdA8AAbFcBYAOCkl0DwABsXwJgA8AAbBhbXQPAAGxfAmADwABsGFtdA8AAbF8CYAPAAGwYW10DwABsXwJgA8AAbBhbXQPAAGxfAmADwABsWGADi4VhAwBfAwAAXQPAAGxfAmADwABsGGADwABsGF0DwABsGQFgA8AAbFhdA8AAbBkBYAPAAGwYYAPAAGwYYAPAAGwYXQPAAGxfAmADwABsGF0DwABsGQFgA4KSXQPAAGwZAWADgpJdA8AAbF8CYAPAAGwYXQPAAGwZAWADgpJhAwJgA8AAbBhdA8AAbBkBYAOCkl8DAABhAwJgA8AAbBhdA8AAbBkBYAOCkl8DAABhAwJgA8AAbBhdA8AAbBkBYAOCkl8DAABdA8AAbBkBYAPAAGwYYAOBAV0DwABsXwJgA8AAbBhgA0JhAwFgA8AAbFtcYQMBXQPAAGwZAWADwABsGFxdA8AAbF8CYAPAAGwYYAN/XQPAAGwZAVtdA8AAbBkBW10DwABsIAFgA39dA8AAbFcBYAPAAGwYXQOq3QFbYAOtnGADgLJgA8AAbMJgA4CyYAPAAGxVYAOAu2ADwABswmADgLJgA8AAbFVgA8AAbMJgA8AAbFVgA8AAbMJgA4CyYAPAAGzCYAPAAGzCYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXYAPAAGzXXQPAAGwZAWADg6xdA8AAbBkBYAODrF0DwABsGQFgA4OsXQPAAGwZAWADg6xgA4KSXQPAAGxfAmADgzJgA4GZXQPAAGwZAWADgzJdA8AAbFcBYAODMl4DAAMDA2ADgzJgA4pBYAOKQQABVwOBawBcXQPAAGxfAmADgzJdA8AAbBkBYAOKQV0DwABsGQFgA4pBXQPAAGwZAWADikFdA8AAbBkBYAOB910DwABsGQFgA4MyYAOCKF0DwABsGQFgA4IDYAOCKGEDAWADikFcYQMBYAOKQVxhAwNgA4OsYAODrGADwABsW1tdA8AAbFcBYAOCkl0DwABsGQFgA4IDXQPAAGxXAWADggNdA8AAbBkBYAOCA10DwABsGQFgA4IDXQPAAGwZAWADggNdA8AAbBkBYAOCA10DwABsGQFgA4IDXQPAAGxfAmADwABsGF0DwABsGQFgA4MyXQPAAGwZAWADgzJdA8AAbFcBYAOCkl0DwABsVwFgA4IDXQPAAGxXAWADggNdA8AAbFcBYAOCA10DwABsVwFgA4MyXQPAAGxfAmADgzJgA4IDXQPAAGwZAWADgzJdA8AAbBkBYAODrF0DwABsGQFgA4OsXQPAAGwZAWADg6xdA8AAbBkBYAODrF0DwABsGQFgA4OsYQMBYAOKQVxhAwFgA4pBXF0DwABsGQFgA4OsXQPAAGwZAWADg6xdA8AAbBkBYAODrF0DwABsGQFgA4OsXQPAAGwZAWADg6xdA8AAbBkBYAODrF0DwABsGQFgA4OsXQPAAGwZAWADwABsH10DwABsGQFgA8AAbB9dA8AAbBkBYAPAAGwfXQPAAGwZAWADwABsH10DwABsGQFgA8AAbB9dA8AAbBkBYAPAAGwfYAPAAGzXXQPAAGxfAmADgzJgA4pBXQPAAGxfAmADgzJdA8AAbBkBYAOKQV0DwABsGQFgA4pBXgMAAwMDYAODMmADikFgA4pBAAFXA4FrAFxdA8AAbF8CYAODMmADikFeAwADAwNgA4MyYAOKQWADikEAAVcDgWsAXF0DwABsVwFgA4MyXQPAAGwZAWADhEtdA8AAbBkBYAODzF0DwABsGQFgA4UaXQPAAGwZAWADgzJdA8AAbBkBYAODgF0DwABsGQFgA4PMXQPAAGwZAWADhEtdA8AAbBkBYAODAV0DwABsGQFgA4LNXQPAAGwZAWADguddA8AAbBkBYAOFGl0DwABsGQFgA4UaXQPAAGwZAWADhRpdA8AAbBkBXwMAAF0DwABsGQFgA4pBXQPAAGwZAWADikFhAwBcXQPAAGwZAWADhAJdA8AAbBkBYAOES10DwABsGQFgA4PMXQPAAGwZAWADhCVdA8AAbBkBYAOFGl0DwABsGQFgA4UaYQMAXF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA8AAbF8CYAOCfmADhRpdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUC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XgMAAQEBYAOOcgABVwOObABgA46VXQPAAGxfAmADwABsGF4DAAEBAWADjnIAAVcDjmwAYAOOlV0DwABsXwJgA8AAbBheAwABAQFgA45yAAFXA45sAGADjpVdA8AAbF8CYAPAAGwYXgMAAQEBYAOOcgABVwOObABgA46VXQPAAGxfAmADglJgA6VTXQPAAGxfAmADkT1gA4MyXQPAAGxfAmADgzJgA4MyXQPAAGxfAmADglJgA6WjXQPAAGxfAmADglJgA6WjXQPAAGxXAWADkXVdA8AAbFcBYAORdV0DwABsVwFgA5F1XQPAAGxXAWADkXVdA8AAbFcBYAORdV0DwABsVwFgA5F1XQPAAGxXAWADkXVdA8AAbFcBYAORdV0DwABsVwFgA5F1XQPAAGxXAWADkXVdA8AAbFcBYAORdV0DwABsVwFgA5F1XQPAAGxXAWADkXVdA8AAbFcBYAPAAGwYXQPAAGwZAWADg8xdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsH10DwABsGQFgA8AAbBhdA8AAbFcBYAODMl0DwABsVwFgA5F1XQPAAGxXAWADkXVdA8AAbFcBYAORdV0DwABsXwJgA4MyXQPAAGxXAWADkXVdA8AAbFcBYAORdV0DwABsGQFgA4MyXQPAAGwgAWADg6xdA8AAbF8CYAOCUmADpWtdA8AAbF8CYAOCUmADqfhdA8AAbF8CYAOCUmADpaNdA8AAbFcBYAODMl0DwABsVwFgA4MyXQPAAGxXAWADg6xdA8AAbFcBYAODMl0DwABsGQFgA4OAXQPAAGxXAWADg4BdA8AAbFcBYAODAV0DwABsVwFgA4OsXQPAAGxfAmADg6xgA4PMXQPAAGxfAmADg8xgA4OsXQPAAGwZAWADhRpdA8AAbBkBYAOFGl0DwABsGQFgA4UaXQPAAGwZAWADg59dA8AAbFcBYAOKUF0DwABsVwFgA4rfXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxfAmADglJgA6WRXQPAAGxfAmADglJgA6oHXQPAAGxfAmADwABsGF0Di00BW10DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbF8CW1tdA8AAbF8CW1tdA8AAbF8CW1tdA8AAbBkBYAPAAGwfXQPAAGwZAWADwABsGFtgA70LXQPAAGzHAWADgKdgA8AAbNdgA70LYAO9C2ADvQtgA8AAbNdgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpgA8AAbcpdA8AAbF8CYAPAAGwYYAPAAGxbXQPAAGxfAmADwABsGGADwABsW2EDAWADwABsGFxhAwFgA8AAbBhcYQMBYAPAAGwYXGEDAWADwABsGFxhAwFgA8AAbBhcYQMBYAPAAGwYXF0DwABsXwJgA5PHYAPAAGxbXQPAAGxfAmADk8dgA8AAbFtdA8AAbF8CYAOTx2ADwABsW10DwABsVwFgA8AAbFhdA8AAbFcBYAPAAGxYYAPAAG0zYAPAAG0zXQPAAGxfAmADwABsWGADwABsVV0DwABsGQFgA7L+YQMBYAOTfVxhAwFgA8AAbFhdA8AAbBoBYAPAAGxYYQMBYAPAAGxYXQPAAGwaAWADwABsWGEDAmADwABsGF0DwABsGQFbYAHAAGxcYQMCYAPAAGwYXQPAAGwZAVtgAcAAbFxdA8AAbF8CYAPAAGxYYAOLhV0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsWGEDAWADlL9dA8AAbBoBXwMAAGEDAWADlL9dA8AAbBoBXwMAAF0DwABsGQFgA4lVXQPAAGwZAWADiVVdA8AAbBkBYAOJVWEDAWADgpJgA8AAbFtdA8AAbF8CYAOKJmADiiZdA8AAbF8CYAOKJmADiVVdA8AAbBkBYAOKJl0DwABsGQFgA4RLXQPAAGwZAWADgzJdA8AAbBkBYAOES10DwABsGQFgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxXAWADiiZdA8AAbF8CYAOKJmADiVVdA8AAbF8CYAOKJmADiVVdA8AAbFcBYAOKJl0DwABsXwJgA4omYAOJVV0DwABsXwJgA4omYAOJVV0DwABsXwJgA4omYAOJVV0DluUBXwMAAF0DwABsGQFfAwAAXQPAAGwZAV8DAABdA5blAV8DAABdA5blAV8DAABdA5blAV8DAABdA8AAbBkBXwMAAF0DwABsGQFfAwAAXQPAAGwZAWADiVVdA8AAbBkBYAOJVV0Dl+0CXwMAAF8DAQBdA5ftAl8DAABfAwEAXQOX7QJfAwAAXwMBAF0Dl+0CXwMAAF8DAQBdA5ftAl8DAABfAwEAXQOX7QJfAwAAXwMBAF0Dl+0CXwMAAF8DAQBdA5ftAl8DAABfAwEAXQOX7QJfAwAAXwMBAF0DmDcBXwMAAF0DwABsXwJgA4pQXwMAAF0DwABsVwFgA4pQXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5i1Al8DAABfAwEAXQOYtQJfAwAAXwMBAF0DmLUCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmOwCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmOwCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmOwCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmOwCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmOwCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmOwCXwMAAF8DAQBdA5jsAl8DAABfAwEAXQOY7AJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQOZBQJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQOZBQJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQOZBQJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQOZBQJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQOZBQJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQOZBQJfAwAAXwMBAF0DmQUCXwMAAF8DAQBdA5kFAl8DAABfAwEAXQPAAGxfAmADwABsGGADmR9dA8AAbF8CYAPAAGwYYAOZH10DwABsXwJfAwAAYAPAAGwYXQPAAGxfAmADilBgA8AAbBhgA5lxYAOZcWEDAGADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYYQMAYAPAAGwYXQPAAGxfAl8DAABgA8AAbBhhAwBgA8AAbBhdA8AAbF8CXwMBAGADwABsGF0DmVgBYAOI510DmVgBYAODrF0DmVgBYAODMl0DmVgBYAODgF0DmVgBYAOCkl0DmVgBYAOKJl0DmVgBYAOCUl0DmVgBYAOCUl0DmVgBYAOKUF0DmXoCYAOCfmADmR9dA5l6AmADgn5gA5kfYAPAAG4PYQMBXwMAAFxhAwFgA5kfW2EDAWADmR9bYQMBYAOZH1thAwFgA5kfW2EDAWADmR9bXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbFZdA8AAbF8CYAOKJmADiVVdA8AAbBkBYAObWl0DwABsGQFgA5taXQPAAGxfAmADiiZgA4omXQPAAGxfAmADwABsGGADnBJdA8AAbF8CYAPAAGwYYAOcEl0DwABsXwJgA8AAbBhgA5wSXQPAAGxfAmADwABsGGADnCNdA8AAbF8CYAPAAGwYYAOcI10DwABsXwJgA8AAbBhgA5wjXQPAAGxfAmADwABsGGADg6xdA8AAbF8CYAOCkmADnD9dA8AAbF8CYAPAAGwYYAODAV0DwABsXwJgA8AAbBhgA4MyXQPAAGxfAmADwABsGGADnFNdA8AAbF8CYAPAAGwYYAODgF0DwABsXwJgA8AAbBhgA4RLXQPAAGxfAmADwABsGGADhEtdA8AAbF8CYAPAAGwYYAODzF0DwABsXwJgA8AAbBhgA4QCXQPAAGxfAmADwABsGGADhEtdA8AAbF8CYAPAAGwYYAOES10DwABsXwJgA8AAbBhgA4PMXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbB9gA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVdA8AAbF8CYAOdLGADwABsH10DwABsGQFgA50sXQPAAGwZAWADnSxdA8AAbBkBYAOPeV0DwABsVwFgA8AAbBhdA8AAbBkBYAOgsV0DwABsGQFgA6U0XQPAAGwZAWADn9FdA8AAbBkBYAOlIF0DwABsGQFgA6FwXQPAAGwZAWADoFxdA8AAbBkBYAOf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AwEAXQPAAGxfAl8DAABfAwEAXQPAAGxfAl8DAABfAwEAXQPAAGxfAl8DAABfAwEAXQPAAGxfAl8DAABfAwEAXQPAAGxXAV8DAABdA8AAbF8CXwMAAF8DAQBhAwFfAwEAYAPAAGxbXQPAAGwZAVtdA8AAbFcBXwMBAF0DwABsGQFbYQMBXwMBAGADwABsW10DwABsVwFfAwEAXQPAAGwZAV8DAABgA70LYAO9C2ADwABsGGADwABsH2ADwABsGF0DwABu3QFgA8AAbBhdA8AAbt0BYAPAAGwYYAPAAG7kYAPAAG4PYAPAAG7kXQPAAGxfAmADwABsWGADwABBCV0DwABsXwJgA8AAbFhgA8AAQQldA8AAbFcBYAOCkl0DwABsXwJgA8AAQQldA8AAbBkBYAPAAEEJXQPAAGwZAWADgpJdA8AAbBkBYAOCkl0DwABsXwJgA8AAbFhgA4uFXQPAAGxXAWADgpJdA8AAbF8CYAPAAEEJXQPAAGxfAmADwABsGGADwABALl0DwABsXwJgA8AAQQldA8AAbF8CYAPAAGwYYAPAAEAuXQPAAGxfAmADwABsGGADwABALl0DwABsXwJgA8AAQQldA8AAbBkBYAPAAEEJXQPAAGwZAWADwABBCV0DwABsXwJgA8AAbFhgA8AAQQldA8AAbBkBYAOCkl0DwABsGQFgA4KSXQPAAGxfAmADwABsWGADwABBCV0DwABsGQFgA4KSXQPAAGxXAWADwABsWF0DwABsVwFgA8AAQQldA8AAbFcBYAPAAEEJXQPAAGxXAWADwABsWF0DwABsGQFgA8AAQQldA8AAbFcBYAPAAEEJXQPAAGxXAWADwABBCV0DwABsGQFgA8AAQQldA8AAbF8CYAPAAGxYYAPAAEEJXQPAAGwZAWADgzJdA8AAbFcBYAODMl0DwABsVwFgA4MyXQPAAGwZAWADgzJdA8AAbFcBYAODMl0DwABsGQFgA4MyXQPAAGxXAWADgzJdA8AAbBkBYAODMl0DwABsVwFgA4MyXQPAAGwZAWADgzJdA8AAbFcBYAOCkl0DwABsVwFgA4KSXQPAAGxXAWADgpJdA8AAbFcBYAPAAGxYXQPAAGwZAWADgpJdA8AAbBkBYAPAAEEJXQPAAGxfAmADwABsWGADi4VdA8AAbBkBYAPAAEEJXQPAAGxfAmADwABsWGADwABBCV0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxfAmADwABsWF0DwABsGQFgA7MVXQPAAGwZAWADsxVdA8AAbF8CYAPAAGxYYAOCkl0DwABsGQFgA4KSXQPAAGwZAWADgpJdA8AAbF8CYAPAAGxYYAOCkl0DwABsXwJgA8AAbFhgA4KSXQPAAGwZAWADwABsWF0DwABsXwJgA8AAbFhgA4KSXQPAAGxfAmADwABsWGADgpJgA8AARqddA8AAbBkBYAPAAGxYXQPAAGwZAWADgpJdA8AAbBkBYAOCkl0DwABsVwFgA8AAbFhdA8AAbBkBYAOCkl0DwABsGQFgA4KSXQPAAGxfAmADwABsWF0DwABsGQFgA7MVXQPAAGwZAWADsxVdA8AAbBkBYAPAAEG/XQPAAGxXAWADwABsWF0DwABsGQFgA8AAQQldA8AAbFcBYAPAAGxYXQPAAGwZAWADwABBCV0DwABsXwJgA8AAbFhgA8AAQQlhAwJgA8AAbFhgA8AAbFhgA8AAbFtdA8AAbBkBYAPAAGxYYQMCYAPAAGxYYAPAAGxYYAPAAGxbXQPAAGwZAWADwABsWF0DwABsXwJgA8AAbFhgA8AAQQlhAwJgA8AAbFhgA8AAbFhgA8AAbFtdA8AAbBkBYAPAAGxYXQPAAGxfAmADwABsWGADwABBCV0DwABsGQFgA8AAQQlgA8AAQbVdA8AAbFcBYAPAAGxYXQPAAGxfAmADwABsWF0DwABsVwFgA8AAbFhdA8AAbFcBYAPAAGxYXQPAAGwZAWADwABsWF0DwABsVwFgA8AAQQldA8AAbFcBYAPAAGxYXQPAAGwZAWADwABBCV0DwABsVwFgA8AAbFhdA8AAbFcBYAPAAGxYXQPAAGxXAWADwABsWF0DwABsVwFgA4MyXQPAAGxXAWADwABsWF0DwABsVwFgA8AAbFhdA8AAbBkBYAO0J10DwABsGQFgA8AAbB9dA8AAbBkBYAOzw10DwABsGQFgA4KSXQPAAGwZAWADgpJdA8AAbF8CYAPAAGwYXQPAAGwZAWADgpJdA8AAbBkBYAOCkl0DwABsxwFdA8AAbBkBYAPAAGwfXQPAAGxfAmADwABsGGADs8NdA8AAbBkBYAOCkl0DwABsVwFgA7PDXQPAAGzHAV0DwABsGQFgA8AAbB9dA8AAbFcBYAOzw10DwABsxwFdA8AAbBkBYAPAAGwfXQPAAGxXAWADwABsWF0DwABsXwJgA8AAbFhgA7PDXQPAAGxXAWADs8NdA8AAbBkBYAOzw10DwABsVwFgA7PDXQPAAGxXAWADs8NdA8AAbBkBYAOLKl0DwABsGQFgA4sqXQPAAGwZAWADgpJdA8AAbF8CYAPAAGwYXQOLTQFbXQPAAGxfAmADwABsWGADi4VhAwFgA8AAbBhcYQMBYAPAAGwYXGEDAWADwABsGFxhAwFgA8AAbBhcYQMBYAPAAGwYXGEDAWADwABsGFxhAwFgA8AAbBhcYQMBYAPAAGwYXGEDAWADwABsGFxgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVgA8AAbFVdA8AAbBkBYAPAAGwfYAPAAG7vXQPAAGwZAWADwABsH10DwABsGQFgA8AAbBhdA8AAbF8CYAPAAGwfYAOKUF0DwABsGQFgA4qyXQPAAGwZAWADilBdA8AAbBkBYAOKUF0DwABsGQFgA4lVXQPAAGxfAmADgn5gA4pQXQPAAGwZAWADiVVdA8AAbBkBYAPAAGwYXQPAAGwZAWADhRphAwFgA8AAbB9gA4JSXQPAAGwZAWADglJhAwBgA4JKXQPAAGwZAWADgkpdA8AAbBkBYAOZH10DwABsGQFgA8AAbB9dA8AAbBkBYAO0J10DwABsGQFgA8AAbB9dA8AAbBkBYAPAAGwYXQPAAGwZAWADgpJgA8AAbu9dA8AAbBkBYAPAAGwYYAPAAG7vXQPAAGwZAWADwABsWF0DwABsGQFgA8AAbB9gA8AAbu9dA8AAbF8CYAPAAGxYYAOLhV0DwABsXwJgA8AAbFhgA4uFXQPAAGxfAmADwABsWGADi4VdA8AAbBkBYAPAAGwfXQPAAGwZAWADwABsH10DwABsGQFgA4KSYQMAYAPAAGxbXQPAAGwZAWADwABsGGEDAVtgA8AAbFtdA8AAbBkBYAOCzV0DwABsGQFgA4J+XQPAAGwZAWADgvJdA8AAbBkBYAOC510DwABsGQFgA4jnXQPAAGwZAWADiOddA8AAbBkBYAPAAGwfYQMAYAPAAGxbXQPAAGwZAWADwABsGGEDAGADwABsW10DwABsGQFgA8AAbBhdA8AAbBkBYAODn10DwABsGQFgA4omYQMAYAPAAGxbXQPAAGwZAWADwABsGGEDAVtgA8AAbFthAwBgA8AAbFtdA8AAbBkBYAPAAGwYYQMBW2ADwABsW2EDAGADwABsW10DwABsGQFgA8AAbBhhAwFbYAPAAGxbYQMAYAPAAGxbXQPAAGwZAWADwABsGF0DwABsGQFgA4lVXQPAAGwZAWADiiZdA8AAbBkBYAOI510DwABsGQFgA4jnXQPAAGwZAWADiOddA8AAbBkBYAOFGl0DwABsXwJgA4J+YAOFGl0DwABsGQFgA4gmXQPAAGwZAWADh5ldA8AAbBkBYAOH+F0DwABsGQFgA4gzXQPAAGwZAWADiINdA8AAbBkBYAOIg10DwABsGQFgA4jnXQPAAGwZAWADiOddA8AAbBkBYAPAAGwfXQPAAGwZAWADhRpdA8AAbBkBYAOIvV0DwABsGQFgA4pBXQPAAGwZAWADiVVdA8AAbBkBYAOJ7l0DwABsGQFgA4omXQPAAGwZAWADiiZdA8AAbBkBYAOKJl0DwABsGQFgA4XyXQPAAGwZAWADiOddA8AAbBkBYAOI510DwABsXwJgA8AAbB9gA8AAbB9dA8AAbBkBYAO03V0DwABsGQFgA4omXQPAAGxfAmADglJbXQPAAGxfAmADwABsGGADwABsWGEDAWADwABsWGADwABsWGEDAWADwABsWGADwABsWGADwABsVWADwABsVWADwABsVV0DwABsGQFgA4KSYQMCYAPAAG2QYAPAAG2QXGEDAVtgA8AAbFhhAwFbYAPAAGxYXQPAAGxfAmADwABsGGADtYBdA8AAbF8CYAPAAGwYYAO1dV0DwABsXwJbW2EDAWADwABsWGADwABsGF0DwABsXwJbW10DwABsGQFgA7YgXQPAAGxfAmADwABsGF0DwABsGQFgA7YgXQPAAGwZAWADtiBdA8AAbBkBYAO2IF0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWYAPAAG4PXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADtiBdA8AAS7kBYAPAAGxbXQPAAEmuAmADglJgA4jnXQPAAEu5AWADwABsW10DwABJrgJgA4JSYAOI510DwABsGQFgA4UaXQPAAGwZAWADhRpdA8AAbBkBYAPAAEyEXQPAAGwZAWADhKFdA8AASeYFYAOCUmADh/hgA4UaYAOI52ADiVVdA8AASeYFYAOCUmADh/hgA4UaYAOI52ADiVVdA8AAbBkBYAOH+F0DwABsGQFgA4f4XQPAAGwZAWADiVVdA8AAbBkBYAPAAE8fXQPAAGwZAWADwABNaF0DwABsGQFgA4ShXQPAAGwZAWADhKFdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA4UaXQPAAGwZAWADhRpdA8AAbBkBYAOFGl0DwABsGQFgA4UaXQPA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wABsGQFfAwAAXQPAAGwZAV8DAABdA7zaAV8DAABdA8AAbBkBXwMAAF0DvNoBXwMAAF0DvNoBXwMAAF0DwABsGQFfAwAAXQO82gFfAwAAXQPAAGwZAV8DAABdA8AAbBkBXwMAAF0DwABs/gJgA8AAbBhgA72OXQPAAGwZAWADwABsH10DwABsGQFgA8AAbB9dA8AAS7kBYAO9dl0DwABsGQFgA8AAbB9dA8AAbBkBYAPAAGwfXQPAAGwZAWADwABsH10DwABsGQFgA8AAbB9hAwFgA8AAbB9cYAO/dWADv3VhAwFgA8AAbB9gA8AAbFthAwFgA8AAbB9gA8AAbFthAwFgA8AAbB9gA8AAbFthAwBgA8AAbB9hAwFgA8AAbB9gA8AAbFthAwBgA8AAbB9hAwFgA8AAbB9gA8AAbFthAwBgA8AAbB9hAwJgA8AAbB9gA8AAbB9gA8AAbB9hAwJfAwAAYAPAAGwfXwMAAF0DwABsGQFgA8AAbB9dA8AAbFcBYAPAAGwfYAO/dWADv3VgA791YQMBYAPAAGwfYAPAAGxbXQPAAGwZAWADwABsH2ADv3VgA791YAO/dV0DwABsGQFgA8AAbB9dA8AAbBkBYAPAAGwfXQPAAGwZAWADwABsH2ADv3VgA791YAO/dWADv3VgA791YAO/dWEDAWADwABsH2ADwABsW2EDAWADwABsH2ADwABsW2ADv3VgA791YAO/dWADv3VgA791YAO/dWADv3VgA7+5XQPAAGwZAWADwABsH10DwABsGQFgA8AAbB9gA8AAbWhgA8AAbNddA8AAbF8CYAPAAGwYYAPAAEECXQPAAGwZAWADiVVdA8AAbFcBYAOJVV0DwABsGQFgA4lVYQMCYAPAAE5zYAOyz1xhAwJgA8AATnNgA7LPXGEDAmADwABOc2ADss9cXQPAAGxfAmADwABAe2ADwABsH10DwABsXwJgA8AAQHtgA8AAbB9dA8AAbF8CYAPAAEB7YAPAAGwfYQMCYAPAAE5zYAOyz1xdA8AAbFcBYAPAAEB7YQMCYAPAAE5zYAOyz1xhAwJgA8AATnNgA7LPXGEDA2ADg6xgA4OsYAPAAGxbW10DwABsXwJgA4omYAOJVWADwABsGF0DwABsGQFgA7LuXQPAAGwZAWADsu5dA8AAbF8CYAOKJmADiVVhAwFgA8AAQHtgA8AAQHthAwJgA4kfYAPAAGxbYAOEAl0DwABsGQFgA8AAQh1dA8AAbt0BYAPAAGxYXQPAAG7dAWADwABsWF0DwABu3QFgA8AAbFhdA8AAbt0BYAPAAGxYXQPAAG7dAWADwABsWF0DwABsGQFgA4lVXQPAAGwZAWADiVVdA8AAbBkBYAPAAEGGXQPAAGwZAWADwABPH10DwABsXwJgA8AAbFhgA8AAQephAwJgA8AAbBhgA8AAQC5cXQPAAGxfAmADwABsGGADwABALl0DwABsXwJgA8AAbBhgA8AAThRdA8AAbFcBYAPAAExoXQPAAGxXAWADwABMaF0DwABsVwFgA8AATGhdA8AAbF8CYAPAAGwYYAPAAEAuXQPAAGxfAmADwABsGGADwABsH10DwABsXwJgA8AAbBhgA8AAThRdA8AAbF8CYAPAAGwYYAPAAEAuXQPAAGxfAmADwABsGGADt4RdA8AAbF8CYAPAAGwYYAO3hF0DwABsXwJgA8AAbBhgA8AAQC5dA8AAbFcBYAPAAExoYQMDYAPAAGwYYAPAAEAuYAPAAEAuYAPAAEAuXQPAAGxfAmADwABsGGADwABALl0DwABsXwJgA8AAbBhgA8AAQC5dA8AAbF8CYAPAAGwYYAPAAE4UXQPAAGxfAmADwABsGGADwABALl0DwABsXwJgA8AAbBhgA8AAThRdA8AAbF8CYAPAAGwYYAPAAE4UXQPAAGwZAWADwABBhl0DwABsGQFgA4pBXQPAAGwZAWADhAJdA8AAbBkBYAPAAEAuXQPAAGwZAWADwABALl0DwABsGQFgA8AAQC5dA8AAbBkBYAPAAEAuYAPAAGwYYAPAAGwfXQPAAGwZAWADhEtdA8AAbBkBYAOES10DwABsGQFgA4RLXQPAAGwZAWADhEtdA8AAbBkBYAOES10DwABsGQFgA4OsXQPAAGxfAmADiR9dA8AAbBkBYAODrF0DwABsGQFgA4lVXQPAAGxXAWADg6xdA8AAbFcBYAODrGADgpJdA8AAbBkBYAOFGmADwABvSl0DwABsVwFgA8AAbB9dA8AAbFcBYAPAAGwfXQPAAGxXAWADwABsH10DwABsVwFgA8AAbB9gA8AAbFVgA8AAbBhgA8AAbB9dA8AAbBkBYAOC8l0DwABsGQFgA4UaXQPAAGwZAWADiVVdA8AAbBkBYAOJVV0DwABsGQFgA4lVXQPAAGwZAWADhRpdA8AAbF8CYAPAAGxYYAOLhV0DwABsGQFgA8AAbFhdA8AAbBkBYAPAAEMGXQPAAGwZAWADwABsGF0DwABsGQFgA4KSXQPAAGxfAmADwABsWGADi4VdA8AAbBkBYAPAAEadXQPAAGwZAWADiOdhAwFgA4jnYAOI510DwABsGQFgA4UaYQMBYAOI52ADiOddA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAOI510DwABsGQFgA4XyXQPAAGwZAWADiVVdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA4KSXQPAAGwZAWADgpJdA8AAbBkBYAOCkl0DwABsGQFgA4PMXQPAAGwZAWADwABMhF0DwABsGQFgA8AATIRdA8AAbBkBYAOEoV0DwABsVwFgA4PMXQPAAGxXAWADg8xdA8AAbF8CYAOEAl0DwABsVwFgA4PMXQPAAGxXAWADg8xdA8AAbBkBYAOEoV0DwABsGQFgA8AARrddA8AAbBkBYAPAAGwfXQPAAG7dAWADwABsWF0DwABu3QFgA8AAbFhdA8AAbt0BYAPAAGxYXQPAAG7dAWADwABsWF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGxXAWADwABsGF0DwABsVwFgA8AAbBhdA8AAbFcBYAPAAGwYXQPAAGwZAWADwABZEV0DwABsGQFgA8AAQh1dA8AAbBkBYAPAAEIsXQPAAGwZAWADwABGt10DwABsGQFgA8AAbB9dA8AAbF8CYAOCfmADwABALl0DwABsVwFgA8AATGhdA8AAbBkBYAPAAE6pXQPAAGxfAmADwABsGGADwABALl0DwABsGQFgA8AAR5FdA8AAbFcBYAPAAGxYXQPAAGxXAWADwABsWF0DwABsVwFgA8AAbFhdA8AAbFcBYAPAAGxYXQPAAGwZAWADsu5dA8AAbBkBYAOy7l0DwABsGQFgA8AAQC5dA8AAbBkBYAPAAEAuXQPAAGwZAWADwABPP10DwABsGQFgA8AAWRFdA8AAbBkBYAPAAE2IXQPAAGwZAWADwABPH10DwABsGQFgA8AAbBhdA8AAbBkBYAPAAEyEXQPAAGxfAmADwABsGGADwABsGF0DwABsXwJgA8AAbBhgA8AAbBhdA8AAbBkBYAOCfl0DwABsGQFgA4J+XQPAAGwZAWADgn5dA8AAbBkBYAOCfl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAR5hdA8AAbBkBYAPAAGwYYQMCYAPAAGwYYAPAAE4UXF0DwABsXwJgA8AAbBhgA8AATx9dA8AAbF8CYAPAAGwYYAPAAE8fYQMCYAPAAGwYYAPAAE4UXF0DwABsVwFgA8AAbBhhAwFgA8AAQYZgA8AAbFthAwFgA8AAQYZgA8AAbFthAwFgA8AAQYZgA8AAbFthAwFgA8AAQYZgA8AAbFthAwFgA8AAQYZgA8AAbFthAwFgA8AAQYZgA8AAbFtdA8AAbBkBYAPAAEGGXQPAAGwZAWADwABBhl0DwABsGQFgA8AAQYZdA8AAbBkBYAPAAEGGXQPAAGwZAWADwABPH2EDAWADwABALmADwABsGGEDAWADwABALmADwABsGF0DwABsVwFgA8AARrddA8AAbF8CYAPAAGwYYAOI510DwABsGQFgA8AATYhdA8AAbBkBYAPAAE8fXQPAAGwZAWADwABPH2EDAV0DwABsGQFgA8AAbFZcXgMAAQIBXQPAAGwZAWADwABPHwG61GADwABsWwAAYAPAAGwfYQMBXQPAAGwZAWADwABsVlxeAwABAgFdA8AAbBkBYAPAAE8fAbrUYAPAAGxbAABgA8AAbB9hAwFdA8AAbBkBYAPAAGxWXF4DAAECAV0DwABsGQFgA8AATx8ButRgA8AAbFsAAGADwABsH2EDAV0DwABsGQFgA8AAbFZcXgMAAQIBXQPAAGwZAWADwABPHwG61GADwABsWwAAYAPAAGwfXQPAAGwZAWADsu5dA8AAbF8CYAOKJmADiVVdA8AAbBkBYAOKJl0DwABsXwJgA4omYAOJVV0DwABsGQFgA8AATIRdA8AAbBkBYAPAAE8/XQPAAGxfAmADwABsGGADwABPH10DwABsXwJgA8AAbBhbXQPAAGxfAmADwABsGFtdA8AAbF8CYAPAAGwYW10DwABsXwJgA8AAbBhbXQPAAGxfAmADwABsGFtdA8AAbF8CYAPAAGwYW2EDAWADwABsGF0DwABsGgFgAcAAbFxhAwFgA8AAbBhdA8AAbBoBYAHAAGxcYQMBYAPAAGwYXQPAAGwaAWABwABsXGEDAWADwABsGF0DwABsGgFgAcAAbFxhAwFgA8AAbBhdA8AAbBoBYAHAAGxcYQMBYAPAAGwYXQPAAGwaAWABwABsXGEDAF0DwABsGgFfAwAAYQMAYAPAAGxYXQPAAGwZAWADsu5dA8AAbF8CYAPAAGxYYAPAAEEJXQPAAG6lAWADwABBCV0DwABsVwFgA8AAbBhdA8AAbBkBYAOy7l0DwABsGQFgA7L+YAPAAG7vXQPAAGwZAWADwABJkF0DwABsGQFgA8AASZBdA8AAbBkBXQPAAEnSAV8DAQBdA8AAbFcBXwMBAF0DwABsVwFfAwEAXQPAAGxXAV8DAQBdA8AAbFcBXwMBAF0DwABsVwFfAwEAXQPAAGxXAV0DwABJ0gFfAwEAXQPAAGxXAV8DAQBdA8AAbFcBXwMBAF0DwABsVwFfAwEAXQPAAEmuAl8DAABfAwEAYQMAYAPAAGxbXQPAAGxfAl8DAABdA8AASdIBXwMBAF0DwABsXwJfAwAAXQPAAEnSAV8DAQBdA8AAbFcBXwMBAF0DwABsVwFfAwEAXQPAAEnFAl8DAABfAwEAXQPAAEnFAl8DAABfAwEAXQPAAEnFAl8DAABfAwEAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAYQMAXwMFAGEDAGADwABsW10DwABKbwJfAwAAXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKbwJfAwAAXwMBAF0DwABsXwJfAwAAXQPAAEqTAV8DAQBdA8AAbF8CXwMAAF0DwABKkwFfAwEAXQPAAGxfAl8DAABdA8AASpMBXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKkwFfAwEAXQPAAGxfAl8DAABdA8AASpMBXwMBAF0DwABKkwFfAwEAXQPAAGxfAl8DAABdA8AASpMBXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKigJfAwAAXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKbwJfAwAAXwMBAF0DwABKkwFfAwEAXQPAAEpvAl8DAABfAwEAXQPAAEpvAl8DAABfAwEAXQPAAEpvAl8DAABfAwEAXQPAAGxfAl8DAABdA8AASpMBXwMBAF0DwABsXwJfAwIAXQPAAEqTAV8DAwBdA8AASooCYAPAAGxWXwMAAF0DwABKigJgA8AAbFZfAwAAXQPAAGwZAV8DAABdA8AAbBkBYAPAAGwYXQPAAGwZAWADwABsGF0DwABsGQFgA8AAbBhdA8AAbBkBYAPAAGwYXQPAAEqKAmADwABsVl8DAABdA8AASooCYAPAAGxWXwMAAF0DwABKkwFfAwAAXQPAAEqKAmADwABsVl8DAABdA8AASooCYAPAAGxWXwMAAF0DwABKigJgA8AAbFZfAwAAXQPAAEqKAmADwABsVl8DAABdA8AAbBkBXwMAAF0DwABKigJgA8AAbFZfAwAAXQPAAEqKAmADwABsVl8DAQBdA8AAbBkBXwMBAF0DwABKigJgA8AAbFZfAwEAXQPAAEqKAmADwABsVl8DAQBdA8AASooCYAPAAGxWXwMBAF0DwABsGQFfAwEAXQPAAGwZAV8DAQBdA8AAbBkBXwMBAF0DwABsGQFfAwEAXQPAAEqKAmADwABsVl8DAQBdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASm8CXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASqwCXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AAbBkBYAPAAEsdXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErFAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAGwZAWADwABLHV0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABJrgJfAwAAXwMDAF0DwABsGQFgA8AASx1dA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASm8CXwMDAF8DBABdA8AAbF8CXwMBAF0DwABKvAJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABsGQFgA8AASx1dA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AAbBkBYAPAAEsdXQPAAGxfAl8DAQBdA8AASrwCXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASa4CXwMAAF8DAwBdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASm8CXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASa4CXwMAAF8DAwBdA8AAbBkBYAPAAEsdXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEmuAl8DAABfAwMAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAGwZAWADwABLHV0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKvAJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKvAJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABsGQFgA8AASx1dA8AASyACXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AAbBkBYAPAAEsdXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAGwZAWADwABLHV0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABsGQFgA8AASx1dA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASm8CXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASm8CXwMDAF8DBABdA8AASa4CXwMAAF8DAwBdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASm8CXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AASs0FXwMAAF8DAQBfAwIAXwMDAF8DBABdA8AAbBkBYAPAAEsdXQPAAGxfAl8DAQBdA8AASrwCXwMDAF8DBABdA8AAbBkBYAPAAEsdXQPAAEmuAl8DAABfAwMAXQPAAEpvAl8DAwBfAwQAXQPAAEtAAl8DAwBfAwQAXQPAAEtAAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAEpvAl8DAwBfAwQAXQPAAEtAAl8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAErNBV8DAABfAwEAXwMCAF8DAwBfAwQAXQPAAGwZAWADwABLHV0DwABJrgJfAwAAXwMDAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABJrgJfAwAAXwMDAF0DwABLQAJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABKbwJfAwMAXwMEAF0DwABKzQVfAwAAXwMBAF8DAgBfAwMAXwMEAF0DwABsGQFgA8AASx1dA8AAbF8CXwMBAF0DwABKvAJf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AWADwABPH10DwABsGQFgA8AATx9dA8AAbF8CYAPAAE8fYAPAAEGGXQPAAGxfAmADwABPH2ADwABBhl0DwABsXwJgA8AATx9gA8AAQYZdA8AAbF8CYAPAAE8fYAPAAEGGXQPAAGwZAWADwABPH10DwABsGQFgA8AATWhdA8AAbBkBYAPAAE1oXQPAAGwZAWADwABBhl0DwABsXwJgA8AATx9gA8AAQYZdA8AAbF8CYAPAAE8fYAPAAEGGXQPAAGwZAWADwABBhl0DwABsXwJgA8AATx9gA8AAQYZdA8AAbF8CYAPAAE8fYAPAAEGGXQPAAGwZAWADwABBhl0DwABsGQFgA8AATnNdA8AAbBkBYAPAAE5zXQPAAGwZAWADwABOc10DwABsGQFgA8AATnNdA8AAbBkBYAPAAE5zXQPAAGwZAWADwABOc10DwABsGQFgA8AATnNdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFdA8AAbBkBYAPAAGxWXQPAAGxXAWADwABBnF0DwABsGQFdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFdA8AAbBkBYAPAAGxWXQPAAGwZAV0DwABsGQFgA8AAbFZdA8AAbBkBXQPAAGwZAWADwABsVl0DwABsGQFdA8AAbBkBYAPAAGxWXQPAAGwZAV0DwABsGQFgA8AAbFZdA8AAbBkBXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAOy7l0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAV0DwABsGQFgA8AAbFZgA8AAbBhdA8AAbBkBXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAEGGXQPAAGwZAWADh/hhAwBgA4UaXQPAAGwZAWADh/hdA8AAbBkBYAOI52EDAFxdA8AAbBkBYAOFGl0DwABsGQFgA4UaXQPAAGwZAWADhRpdA8AAbBkBYAOH+F0DwABsGQFgA4f4XQPAAGwZAWADh/hdA8AAbBkBYAOH+F0DwABsGQFgA4UaXQPAAGwZAWADh/hdA8AAbBkBYAOH+F0DwABsGQFgA4f4XQPAAGwZAWADwABsGGADwABsGF0DwABsGQFgA8AAVyVdA8AAbBkBYAPAAFclXQPAAGwZAWADwABsH10DwABsXwJgA4omYAPAAGwfXQPAAGwZAV0DwABsGQFgA8AAbB9dA8AAbBkBYAPAAGwfXQPAAGxXAWADiiZdA8AAbBkBYAOJVV0DwABsXwJgA4omYAOJVV0DwABsXwJgA4omYAOJVV0DwABsGQFgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGxfAmADiiZgA4lVXQPAAGwZAWADiVVdA8AAbBkBYAPAAFd9XQPAAGwZAWADwABXfV0DwABsGQFgA8AAV31dA8AAbBkBYAPAAFd9XQPAAGwZAWADwABXfV0DwABsGQFgA8AAV31dA8AAbBkBYAPAAFd9XQPAAGwZAWADwABXfV0DwABsGQFgA8AAV31dA8AAbBkBYAPAAFd9XQPAAGwZAWADwABXfV0DwABsGQFgA8AAV31dA8AAbBkBYAPAAFd9XQPAAGxfAmADiiZgA4lVXQPAAGwZAWADwABXfV0DwABsGQFgA8AAV31dA8AAbBkBYAPAAFd9XQPAAGwZAWADwABXfV0DwABsGQFgA4lVXQPAAGwZAWADiVVdA8AAbBkBYAOJVV0DwABsGQFgA4nuXQPAAGxfAmADiiZdA8AAbF8CYAOJVWADwABsH10DwABsXwJgA4lVYAPAAGwfXQPAAGxfAmADiVVgA8AAbB9dA8AAbBkBYAPAAFebXQPAAGwZAWADwABXm10DwABkoAFfAwAAXQPAAGwZAWADwABXm10DwABsGQFgA8AAV5tdA8AAbBkBYAPAAFebXQPAAGwZAWADwABXm2ADwABYz2ADwABYz2ADwABYz2ADwABYz2ADwABYz2ADwABYz2ADwABYz2ADwABYz2ADwABYn2ADwABYn2ADwABYn2ADwABYn2ADwABYn2ADwABYn2ADwABYn2ADwABYn2ADwABYq2ADwABYq2ADwABYq2ADwABYq2ADwABYq2ADwABYq2ADwABYq2ADwABYq2ADwABYt2ADwABYt2ADwABYt2ADwABYt2ADwABYt2ADwABYt2ADwABYt2ADwABYt2ADwABY22ADwABY22ADwABY22ADwABY22ADwABY22ADwABY22ADwABY22ADwABY22ADwABYw2ADwABYw2ADwABYw2ADwABYw2ADwABYw2ADwABYw2ADwABYw2ADwABYw2ADwABY52ADwABY52ADwABY52ADwABY52ADwABY52ADwABY52ADwABY510DwABsGQFgA4lVYAPAAFjPYAPAAFi3YAPAAFi3XQOX7QJfAwAAXwMBAF0DwABsXwJfAwAAYAPAAGwfXQPAAGwZAV8DAABdA8AAbBkBXwMAAF0DwABZNQFfAwAAYQMBXwMAAFxdA8AAbBkBXwMAAF0DwABsVwFfAwAAXQPAAGwZAV0DwABsGQFfAwAAYQMBXwMAAFxdA8AAbF8CYAOJH2ADg59dA8AAbF8CYAOJH2ADg6xhAwFgA8AAbFhgA8AAbFtdA8AAbBkBYAOCkl0DwABsGQFgA8AAbFhdA8AAbBkBYAPAAEHqXQPAAGxfAmADwABsWGADi4VdA8AAbBkBYAOCkl0DwABsGQFgA4lVXQPAAGwZAWADiVVdA8AAbF8CYAODMmADwABaFl0DwABsGQFgA8AAWhZdA8AAbF8CYAODMmADwABaFl0DwABsGQFgA8AAWoddA8AAbBkBYAPAAFqHXQPAAGwZAWADwABafl0DwABsGQFgA8AAWn5dA8AAbBkBYAPAAFp+XQPAAGwZAWADwABa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AWADhRpdA8AAbFcBYAOFGl0DwABsXwJgA4pQYAOKUF0DwABsXwJgA4JKYAPAAGxWXQPAAGxfAmADgkpgA8AAbFZhAwBfAwAAYQMAXwMAAF0DwABsGQFgA4JSXQPAAGwZAWADiVVdA8AAbBkBYAOFGl0DwABsGQFgA4UaXQPAAGwZAWADiCZdA8AAbBkBYAOIJl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADhRpdA8AAbBkBYAOFGl0DwABsXwJgA4MyYAPAAGxbXQPAAGxfAmADgzJgA8AAbFtdA8AAbF8CYAPAAGwYYAOKUF0DwABsGQFgA4UaXQPAAGwZAWADhfJdA8AAbF8CYAOKUGADilBhAwBfAwAAYQMAXwMAAF0DwABsXwJgA4PMYAOKUF0DwABsXwJgA4J+YAOKUF0DwABsXwJgA4J+YAOFGl0DwABsXwJgA4omYAOJVV0DwABsXwJgA4jnYAOKUF0DwABsVwFgA4jnXQPAAGxXAWADiiZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAOKUF0DwABsGQFgA4UaXQPAAGwZAWADhRpdA8AAbFcBYAOKUF0DwABsGQFgA8AAbFZdA8AAbBkBYAOKUF0DwABsGQFgA4qyXQPAAGwZAWADhRpdA8AAbBkBYAOFGl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsVwFgA4pQXQPAAGwZAWADirJdA8AAbBkBYAOFGl0DwABsGQFgA4UaXQPAAGwZAWADg59hAwFgA8AAbFZgA8AAbBhhAwFgA8AAbFZgA8AAbBhhAwJgA8AAbFZgA8AAbB9gA8AAbBhhAwJgA8AAbFZgA8AAbB9gA8AAbBhhAwJgA8AAbFZgA8AAbB9gA8AAbBhhAwFgA8AAbFZgA8AAbBhdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABsVl0DwABsGQFgA8AAbFZdA8AAbBkBYAPAAGxWXQPAAGwZAWADwABt+F0DwABsGQFgA8AAbfhdA8AAYs4BXwMAAF0DwABizgFfAwAAXQPAAGLOAV8DAABdA8AAYtkCXwMAAF8DAQBd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ACK6AA0OWwAAIscADQ7KAAAi1AANDzkAACLhAA0PqAAAIu4ADRAXAAAi+wANEIYAACMIAA0Q9QAAIxUADRFkAAAjIgANEdMAACMvAA0TfQAAIzwADRPsAAAjSQANFFsAACNWAA0UygAAI2MADRU5AAAjcAANFagAACN9AA0WFwAAI4oADRaGAAAjlwANFvUAACOkAA0XZAAAI7EADRfTAAAjvgANGEIAACPLAA0YsQAAI9gADRkgAAAj5QANGY8AACPyAA0Z/gAAI/8ADRptAAAkDAANGtwAACQZAA0bSwAAJCYADRu6AAAkMwANIh4AACRAAA0lhAAAJFEADS0qAAAkYgANLxAAACRzAA0xAwAAJIQADTGLAAAkiAANM1YAACSMAA0zagAAJJUADTOmAAAkogANNLAAACSvAA00ygAAJLgADTWjAAAkyQANNb0AACTSAA04BQAAJOMADThPAAAk7AANOJkAACT1AA044wAAJP4ADTktAAAlBwANOXcAACUQAA05wQAAJRkADToLAAAlIgANOlUAACUrAA06uAAAJTQADTzAAAAlQQANT+0AACVOAA2E1AAAJVQADYmpAAAlXAANih8AACVkAA2KeQAAJWwADYtZAAAldAANi5gAACV8AA2VwAAAJYQADZXdAAAlkQANlsEAACWeAA2ZdQAAJasADZmSAAAluAANmnYAACXFAA2cqAAAJdIADZzFAAAl3wANoB8AACXsAA2gPAAAJfkADaMlAAAmBgANo1oAACYTAA2jjwAAJiAADaPEAAAmLQANo/kAACY6AA3C2QAAJkcADcMOAAAmVAANw0MAACZhAA3DeAAAJm4ADkWJAAAmewAOWOIAACaIAA5vcgAAJpcADnFVAAAmogAOdKgAACatAA6JhQAAJrwADoswAAAmzQAOjBsAACbeAA6SeQAAJu8ADpMdAAAnAAAOk/sAACcRAA6bNQAAJyIADp8WAAAnMwAOoeQAACdCAA6inwAAJ1MADqLMAAAnZAAOo5AAACd1AA6kXgAAJ4YADqSUAAAnlwAOpVYAACeoAA6ppgAAJ7kADqp7AAAnygAOqrEAACfbAA6rcwAAJ+wADrAfAAAn/QAOtD8AACgKAA67DgAAKBcADrxGAAAoHQAOvKwAACgjAA69EgAAKCkADr14AAAoLwAOvd4AACg1AA6+RAAAKDsADr8cAAAoQQAOwDoAAChHAA7AYwAAKE0ADsG7AAAoUwAOweQAAChZAA7CGwAAKF8ADsOfAAAoZQAOw8gAAChrAA7D/wAAKHEADsQ2AAAodwAOxdsAACh9AA7GBAAAKIMADsY7AAAoiQAOxnIAACiPAA7GqQAAKJUADsh8AAAomwAOyKUAACihAA7I3AAAKKcADskTAAAorQAOyUoAACizAA7JgQAAKLkADsrLAAAovwAPQCkAACjFAA9AowAAKNYAD0EvAAAo4QAPQsUAACjsABAMlwAAKPcAEA4jAAApBAAQD6MAACkPABARIwAAKRoAEBKjAAApJQAQFCMAACkwABAVowAAKTsAEBcjAAApRgAQGKMAAClRABAaIQAAKVwAED0RAAApZwAQRXYAAClyABBIkQAAKX0AEEy0AAApiAAQTOMAACmTABBPsQAAKZ4AEGnsAAApqQAQah0AACm0ABBrLwAAKb8AEGtLAAApygAQbDMAACnVABBvcQAAKeAAEG/+AAAp6wAQcBkAACn2ABBy4QAAKgEAEHMTAAAqFAAQhkYAAConABCHPwAAKjIAEIt3AAAqPQAQi6cAACpVABCLuQAAKlkAEI1UAAAqcQAQjqkAACp8ABCVggAAKocAEKSTAAAqjQAQphoAACqcABComAAAKqsAEKktAAAqtgAQr7kAACrBABCz9gAAKtAAEL1ZAAAq4QAQwTsAACrwABDB2gAAKvsAEMKFAAArBgAQwyQAACsRABDWswAAKxwAENb5AAArKQARsQMAACtBABGzMwAAK0wAEbS4AAArWwARuNIAACtmABG7bgAAK3cAEb10AAArggARwzgAACuNABHGCAAAK5gAEcnsAAArowARyx8AACuuABHMMAAAK70AEcxUAAAryAARzsIAACvXABHQUAAAK+IAEdV+AAAr7QAR1o4AACv4ABHlCgAALAUAEek4AAAsFgAR6tsAACwhABHsxwAALCwAEe4KAAAsOwAR7vsAACxGABIDfgAALFEAEgOkAAAsXAASBLoAACxnABIHcwAALHIAEgehAAAsfQASCD4AACyIABIIdQAALJMAEgjeAAAsngASFCwAACypABIUSgAALLYAEhUzAAAswwASFVEAACzQABIWMQAALN0AEhZPAAAs6gASFnMAACz3ABIWkQAALQQAEhq2AAAtEQASGtsAAC0kABI2FAAALTcAEjj+AAAtRAASOSIAAC1RABI5RgAALV4AEjlqAAAtawASOY4AAC14ABI5ygAALYUAEjoSAAAtkgASTjsAAC2fABJPDAAALakAEk++AAAtswASUCAAAC29ABJQewAALccAElDrAAAt0QASUccAAC3bABJ32gAALeUAEnoXAAAt8AASe3sAAC37ABJ74QAALgYAEontAAAuEQASkxwAAC4cABKTVQAALicAEpN7AAAuMgASk7YAAC49ABKgWwAALkgAEqJdAAAuVwASpscAAC5iABKnZgAALm0AEq1dAAAueAASr2YAAC6HABK64gAALpIAEr29AAAunQASvlQAAC6oABLClQAALrMAEsL6AAAuvgASxtAAAC7PABLHBQAALtoAEsrMAAAu8AASy/sAAC7/ABLNKgAALwoAEtSuAAAvFQAS15cAAC8kABLdgAAALy8AEt3JAAAvOgAS4FYAAC9FABLgegAAL1AAEuCcAAAvWwAS6+8AAC9mABLtnAAAL3UAEvv0AAAvhAAS/F8AAC+PABMOGgAAL5oAEyuaAAAvpQATN5EAAC+wABM7SQAAL7gAEz6KAAAvwwATRZsAAC/OABNJJQAAL9kAE0oQAAAv5AATSmkAAC/vABNLvwAAL/oAE05hAAAwBQATTrwAADAQABNPIAAAMBsAE0/dAAAwIQATURIAADAsABNTbAAAMDcAE1PJAAAwQgATVXwAADBPABNXlQAAMFoAE3rqAAAwawATe0QAADB2ABN7mwAAMIEAE3u4AAAwjAATfD0AADCXABN8pgAAMKIAE39hAAAwrQATf70AADC4ABOdlAAAMMMAE6arAAAwyQATvt0AADDUABPKZgAAMOEAE+IxAAAw7AAT5y4AADD5ABPnyAAAMQYAE+hrAAAxGwAT6LUAADEoABPpPQAAMT0AE+tyAAAxSgAT7ZUAADFbABPvdwAAMWwAE+/VAAAxdAAT8cIAADF8ABPx+AAAMYQAE/RTAAAxjAAT9NYAADGdABP1IwAAMagAE/l2AAAxswAT+vQAADG+ABP7bAAAMc8AE/vRAAAx2gAUAOcAADHlABQBGAAAMfYAFAISAAAyAQAUAw0AADIMABQDeAAAMhcAFAPcAAAyIgAUBEcAADItABQHaAAAMjgAFAjAAAAySQAUCbMAADJhABQKGwAAMnIAFA5PAAAyigAUEIwAADKWABQRBQAAMrAAFBFkAAAyyAAUEtEAADLPABQTzwAAMuAAFBRDAAAy+AAUFLQAADMDABQVGgAAMwoAFBWMAAAzIgAUFqkAADMxABRJjAAAMzkAFEoAAAAzQgAUT5gAADNLABRQwQAAM1QAFFS1AAAzXQAUVeIAADNmABRabwAAM28AFFuDAAAzgAAUXMkAADORABRgvQAAM5oAFGD1AAAzoAAUYYAAADOmABRhuQAAM6wAFGUsAAAzsgAUZmsAADPDABRnnAAAM9QAFGfIAAAz3QAUazgAADPmABRsMgAAM+8AFG6nAAAz+AAUbxMAADP+ABRvlQAANAUAFG//AAA0CwAUcK8AADQRABRw7AAANBcAFHFeAAA0HQAUcaEAADQjABRx+gAANCoAFHI8AAA0MAAUcoAAADQ2ABRyrAAANDwAFHZbAAA0QgAUeAMAADRPABR6swAANFgAFHrCAAA0ZwAUeuEAADR2ABR8IwAANIUAFHyHAAA0lAAUfLkAADSjABR+OwAANLIAFH5KAAA0yAAUfo8AADTTABSAEAAANN4AFIBEAAA06QAUgfYAADT6ABSCKgAANQUAFINeAAA1FgAUhXcAADUsABSHKAAANTcAFIdNAAA1SAAUh48AADVZABSHrAAANWQAFIh0AAA1bwAUiI8AADV8ABSJFwAANY0AFIo4AAA1ngAUinYAADWpABSLMQAANbsAFI7sAAA1yAAUjv4AADXRABSPhgAANdoAFJUeAAA15QAUldkAADXuABSWEgAANfcAFJZ2AAA2AAAUl/0AADYJABSYtAAANhIAFJjTAAA2GwAUmVwAADYkABSaVwAANi0AFJsJAAA2NgAUnAYAADZBABSdCQAANkwAFKALAAA2VQAUoS8AADZgABShZAAANmsAFKN3AAA2dgAUo6IAADaBABSkugAANowAFKTxAAA2lwAUpdwAADaiABSmBgAANq0AFKiIAAA2tgAUqh0AADa+ABSrBQAANscAFK1vAAA20AAUrnwAADbdABSvwQAANuoAFLA1AAA29wAUsUMAADb+ABSxtwAANwsAFLLXAAA3EgAUs4wAADcfABS27wAANyYAFLg2AAA3NQAUuy0AADdEABS8CwAAN08AFLxsAAA3WgAUveEAADdjABTAQAAAN2wAFMI/AAA3dQAUwmoA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AEJ/ABhZ8wAAQpAAGFolAABCmgAYWnsAAEKkABhalAAAQq4AGFsQAABCuAAYW5AAAELCABhcVAAAQswAGFzbAABC1gAYXSYAAELgABhqmAAAQuoAGGq9AABC8AAYauIAAEL2ABhrBwAAQvwAGGssAABDAgAYa1EAAEMIABhrdwAAQw4AGGudAABDFAAYbEMAAEMaABhuowAAQycAGHDLAABDLQAYcWsAAEM6ABhyiAAAQ0cAGHVVAABDWAAYdm8AAENjABh3dwAAQ24AGHh/AABDeQAYeXYAAEOEABh6hgAAQ5MAGH2pAABDngAYf/UAAEOrABiBQgAAQ7YAGIFbAABDwwAYgoYAAEPOABiCmAAAQ9UAGISEAABD4AAYhfUAAEPrABiJcwAAQ/gAGJdLAABEAwAYm88AAEQQABifWAAARB0AGKG5AABEKAAYoeUAAEQuABijjQAARDsAGKO8AABEQQAYpSMAAEROABilyAAARFsAGKX5AABEYQAYp0sAAERyABioBgAARIMAGLENAABElAAYsnUAAEShABi0OQAARK4AGLXZAABEuQAYtf0AAETCABi7EQAARM8AGLx0AABE2QAYv7YAAETkABjBfwAARO8AGMKlAABE+gAYxfkAAEUFABjGSwAARRAAGMk0AABFGwAYzPkAAEUoABjNHQAARTEAGNE3AABFPgAY0VsAAEVHABjUBAAARVQAGNieAABFXwAY3A0AAEVqABjcMQAARXMAGN1YAABFgAAY4XcAAEWKABjhmwAARZMAGONpAABFoAAY59sAAEWqABjn/wAARbMAGOn8AABFwAAY7tYAAEXKABju+gAARdMAGPIkAABF4AAY/iIAAEXrABj+XwAARfYAGQBnAABGAQAZAMsAAEYMABkDaAAARhcAGRlmAABGIgAZGlAAAEYxABkrQwAARjwAGSzQAABGRwAZL44AAEZSABk21AAARl0AGTcBAABGaAAZPOMAAEZzABk9awAARn4AGT9DAABGiQAZP3wAAEaWABlBcQAARqEAGUbZAABGrAAZSAkAAEa3ABlJOQAARsIAGVOsAABGzQAZVMoAAEbYABlVNwAARuMAGVmsAABG7gAZWzkAAEb5ABlcIQAARwQAGWWoAABHDwAZZhkAAEciABln3AAARy0AGWpNAABHOAAZhjkAAEdEABmRdAAAR1cAGZRVAABHZgAZouQAAEd1ABmjFAAAR3sAGaQrAABHgQAZtTwAAEeHABm9ygAAR5IAGc45AABHogAZz2cAAEesABnQlAAAR7YAGdDtAABHxwAZ01MAAEfYABnTfAAAR+EAGdQiAABH8AAZ+z0AAEf5ABn7WQAASAQAGfxnAABIHAAZ/IMAAEgnABn9BgAASDIAGf2tAABIPwAZ/fQAAEhMABn+OwAASFkAGf6CAABIZgAZ/skAAEhzABn/iwAASIAAGgCTAABIjQAaAMYAAEiaABoBcAAASKcAGgGJAABItAAaAeIAAEjBABoCHwAASM4AGgI4AABI2wAaAsIAAEjoABoDaQAASPUAGgOCAABJAgAaBBoAAEkPABoEawAASRwAGgS4AABJKQAaBNEAAEk2ABoFXAAASUMAGgWrAABJUAAaBfgAAEldABoGEQAASWoAGgaPAABJdwAaBwoAAEmEABoHtAAASZEAGgfrAABJngAaCH0AAEmrABoIyAAASbgAGgkTAABJxQAaCV4AAEnSABoJqQAASd8AGgn0AABJ7AAaCgMAAEn5ABoKmgAASf8AGgtiAABKDAAaC3sAAEoZABoL5AAASiYAGgwrAABKMwAaDF8AAEpAABoNCQAASk0AGg1AAABKWgAaDYcAAEpnABoNuwAASnQAGg5lAABKgQAaDpwAAEqOABoO4wAASpsAGg8XAABKqAAaD0sAAEq1ABoP9QAASsIAGhAqAABKzwAaEGcAAErcABoRAAAASukAGhFgAABK9gAaEXkAAEsDABoSCQAASxAAGhKzAABLHQAaEuoAAEsqABoV3wAASzcAGh4qAABLQgAaIo0AAEtPABorZwAAS14AGizQAABLawAaMTYAAEt6ABoyLgAAS4UAGklNAABLkAAaVfQAAEudABpanwAAS6gAGlvqAABLwwAaZyUAAEveABpnUwAAS+kAGnhOAABL9AAahngAAEv/ABqH/wAATAwAGpBuAABMGQAak3EAAEwkABqX7QAATC8AGphAAABMPAAa4FkAAExJABriCwAATFQAGuJmAABMXwAa4z8AAExqABrnCAAATHUAGudLAABMgAAa9nYAAEyLABsADQAATJoAGwLiAABMpQAbBR0AAEy3ABsIVQAATMkAGwtyAABM2AAbC54AAEzcABsLzAAATOAAGwvmAABM5AAbD2wA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JK2UAABm2wAktqEAAGboACS3BQAAZvUAJLghAABnAgAkuIoAAGcPACTBAQAAZxwAJMEdAABnKQAkwTkAAGc2ACTBVQAAZ0MAJMFxAABnUAAkwY0AAGddACTBqQAAZ2oAJMHFAABndwAkweEAAGeEACTB/AAAZ5EAJMIYAABnngAkwjQAAGerACTCUAAAZ7gAJMJsAABnxQAkwogAAGfSACTCpAAAZ98AJMLAAABn7AAkwtwAAGf5ACTC9wAAaAYAJMMTAABoEwAkwy4AAGggACTDSgAAaC0AJMNmAABoOgAkw4IAAGhHACTDngAAaFQAJMO6AABoYQAkw9YAAGhuACTD8gAAaHsAJMQOAABoiAAkxCoAAGiVACTERgAAaKIAJMRiAABorwAkxH4AAGi8ACTEmgAAaMkAJMS2AABo1gAkxNIAAGjjACTE7gAAaPAAJMUKAABo/QAkxSYAAGkKACTFQgAAaRcAJMVeAABpJAAkxXoAAGkxACTFlgAAaT4AJMWyAABpSwAkxc4AAGlYACTF6gAAaWUAJMYGAABpcgAkxiIAAGl/ACTGPgAAaYwAJMZaAABpmQAkxnYAAGmmACTGkgAAabMAJMauAABpwAAkxsoAAGnNACTG5gAAadoAJMcCAABp5wAkxx0AAGn0ACTHOQAAagEAJMdVAABqDgAkx3EAAGobACTHjQAAaigAJMepAABqNQAkx8UAAGpCACTH4QAAak8AJMf9AABqXAAkyBkAAGppACTINQAAanYAJMhRAABqgwAkyG0AAGqQACTIiQAAap0AJMilAABqqgAkyMEAAGq3ACTI3QAAasQAJMj5AABq0QAkyRUAAGreACTJMQAAausAJMlNAABq+AAkyWkAAGsFACTJhQAAaxIAJMmhAABrHwAkyb0AAGssACTJ2QAAazkAJMn1AABrRgAkyhEAAGtTACTKLQAAa2AAJMpJAABrbQAkymUAAGt6ACTKgQAAa4cAJMqdAABrlAAkyrkAAGuhACTK1QAAa64AJMrxAABruwAkyw0AAGvIACTLKQAAa9UAJMtFAABr4gAky2EAAGvvACTLfQAAa/wAJMuZAABsCQAky7UAAGwWACTL0QAAbCMAJMvtAABsMAAkzAgAAGw9ACTMJAAAbEoAJMw/AABsVwAkzFsAAGxkACTMdwAAbHEAJMyTAABsfgAkzK8A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AHuHACdzGwAAe6IAJ3MsAAB7vQAndCcAAHvMACd0RQAAe+cAJ3RnAAB79gAndMgAAHwRACd1mQAAfB4AJ3WlAAB8OQAndpAAAHxUACd32wAAfG8AJ3fvAAB8fgAneBEAAHyZACd5PwAAfLQAJ3ldAAB8zwAneYkAAHzqACd5xQAAfQUAJ3oBAAB9IAAneqoAAH07ACd6yAAAfVYAJ3sFAAB9YwAne4wAAH1+ACd76wAAfY0AJ3wTAAB9mgAnfB8AAH21ACd8cwAAfcQAJ30uAAB93gAnfToAAH35ACd+FgAAfhQAJ34iAAB+LwAnfjYAAH5KACd/kQAAfmUAJ4DSAAB+gAAngQcAAH6PACeBsAAAfqoAJ4HdAAB+twAng0QAAH7SACeDrQAAfu0AJ4P1AAB++gAnhCgAAH8UACeErwAAfy8AJ4TcAAB/PgAnhOgAAH9ZACeGPgAAf2gAJ4ZKAAB/gwAnhv4AAH+eACeHCgAAf7kAJ4fJAAB/1AAniDgAAH/jACeIYAAAf/AAJ4hsAACACwAniOAAAIAaACeI7AAAgDUAJ4m7AACARAAniccAAIBfACeKagAAgHoAJ4rIAACAiQAnitQAAICkACeLJgAAgLMAJ4tqAACAwAAni3YAAIDbACeM3QAAgOoAJ420AACBBQAnjcgAAIEUACeOCgAAgS8AJ47pAACBSgAnjv0AAIFZACePPwAAgXQAJ4+sAACBjwAnkGoAAIGqACeQdgAAgcUAJ5EdAACB4AAnkZYAAIH7ACeR6wAAggoAJ5JKAACCJQAnkxAAAIIyACeTOQAAgkEAJ5TTAACCXAAnlN8AAIJ3ACeVcAAAgpIAJ5WOAACCrQAnlcsAAIK6ACeWOgAAgtUAJ5ZGAACC8AAnlswAAIL/ACeXjQAAgw4AJ5g2AACDKQAnmHQAAIM4ACeZvAAAg1MAJ5pFAACDbgAnmpwAAIOJACebBgAAg6QAJ5syAACDvwAnm/sAAIPaACecGQAAg/UAJ5xWAACEAgAnnR0AAIQdACedOwAAhDgAJ53dAACEUwAnniAAAIRuACeeMQAAhIkAJ58eAACEmAAnnyoAAISzACeftQAAhM4AJ6A1AACE2wAnoHgAAIT2ACegiQAAhREAJ6E0AACFIAAnofwAAIU7ACeigwAAhVYAJ6NXAACFZQAno+EAAIV0ACej7QAAhY8AJ6RLAACFngAnpU8AAIW5ACellQAAhdQAJ6XMAACF7wAnpnIAAIYKACemmgAAhhcAJ6cIAACGMQAnp64AAIY+ACeoeQAAhk0AJ6jCAACGXAAnqOQAAIZrACepsgAAhnoAJ6n7AACGlQAnqgcAAIawACeqVQAAhr8AJ6phAACG2gAnqxgAAIbpACerLAAAhvgAJ6v6AACHEwAnrF8AAIcuACetBQAAhzsAJ62DAACHSgAnrY8AAIdlACeuUQAAh3QAJ67LAACHgwAnrvQAAIeSACevAAAAh60AJ68fAACHyAAnr9sAAIfXACewRgAAh/IAJ7EcAACIAQAnsXUAAIgcACexnQAAiCkAJ7HPAACIQwAnslYAAIheACeygwAAiG0AJ7KPAACIiAAns3AAAIiXACezfAAAiLIAJ7SLAACIzQAntJcAAIjoACe2rwAAiPcAJ7ftAACJEgAnuRsAAIktACe5NQAAiUgAJ7lPAACJYwAnyHAAAIl+ACflOwAAiYsAJ/K6AACJmAAn9mQAAImeACf4hAAAiakAJ/jZAACJtAAn+gcAAIm/ACf6CgAAicoAJ/49AACJ1QAoFAEAAIniACgXNAAAifAAKBtZAACKAQAoHaYAAIoMACgd+QAAihcAKB8KAACKIgAoIKEAAIotACgg9gAAijgAKCIEAACKQwAoM+4AAIpOACg0ZAAAimEAKDWdAACKdAAoNkMAAIqHACg2xwAAipoAKDoZAACKrQAoPCsAAIq6AChDkQAAis0AKES3AACK2AAoRUoAAIrjAChG4QAAiu4AKH6gAACK+QAoivgAAIsHACiL2AAAixIAKJ+CAACLHQAooAkAAIsrACigPwAAizkAKKCbAACLRwAoob8AAItVACjhYQAAi2IAKOLFAACLdQAo5DUAAIuIACjrUgAAi5sAKO0WAACLpgAo7ToAAIuxACjwLgAAi7wAKPJiAACLxwAo87kAAIvWACj0iwAAi+EAKPTfAACL7AAo9h0AAIv3ACkHpwAAjAIAKQg8AACMDQApCW8AAIwYACkMhwAAjCMAKQ25AACMMAApDnQAAIw9AClELAAAjEoAKUYjAACMVwApRt0AAIxkACliHwAAjHEAKWJYAACMfwApYpEAAIyNACliygAAjJsAKWNAAACMqQApY2wAAIy3AClqjAAAjMUAKWqpAACM0AApaxoAAIzbACls4gAAjOoAKW0BAACM9QApbgwAAI0AACluVAAAjQ8AKW/dAACNLAApcHsAAI03AClwygAAjVQAKXDpAACNXwApcjwAAI1qAClyZQAAjYcAKXKEAACNkgApgi8AAI2dACmDdwAAjawAKYSrAACNtwAphkMAAI3FACmOgQAAjdAAKY7LAACN2wApkBcAAI3mACmQPgAAjfEAKZHBAACN/AApk3kAAI4HACmYHwAAjhIAKZnkAACOIQApmlAAAI4sACmbwQAAjjcAKZ9DAACOQgApqCgAAI5PACmvnAAAjloAKbT9AACOZQAp3sAAAI5wACnfsQAAjnsAKeBEAACOhgAp4K8AAI6RACnhDgAAjpwAKeEkAACOpwAp41EAAI6yACoEbQAAjr0AKgSNAACOyAAqHS0AAI7TACohogAAjt4AKliwAACO7wAqWa0AAI78ACpZ0gAAjwkAKmJBAACPFgAqoJoAAI8cACqqZgAAjycAKqqcAACPMgAqq0IAAI89ACqreAAAj0gAKrR2AACPUwAqtToAAI9eACq1XwAAj2kAKrgUAACPdAAquDkAAI9/ACq9bwAAj4oAKr2gAACPmwAqwNEAAI+mACrEPwAAj7EAKsTUAACPvAAqxbUAAI/HACrMEAAAj9IAKs3SAACP7QAqz2sAAJAIACrQuAAAkBMAKtEHAACQHgAq0kEAAJApACrg0QAAkDgAKyi9AACQQwArKSsAAJBOACspyAAAkFkAKyolAACQZAArKosAAJBvACtTqAAAkHoAK2FGAACQhQArYb0AAJCgACtiBQAAkLsAK4m9AACQ1gArlxMAAJDnACuYmwAAkPgAK5xlAACRCQArnasAAJEWACujKAAAkSwAK6R8AACROQArswMAAJFGACu0/QAAkVMAK7oYAACRYAArwtgAAJFtACvJHQAAkXoAK8rhAACRhgAr1lgAAJGTACv5IAAAkZ8AK/qKAACRqwAr/+4AAJG3ACwBoAAAkcMALJs9AACRzwAtG7gAAJHaAC3xHgAAkecALfFnAACR8gAuKusAAJH9AC4rGQAAkgoALiteAACSHQAuLGcAAJIxAC4tlAAAkj4ALi6gAACSTgAuL5sAAJJeAC4vzwAAkm4ALjB6AACSfgAuR44AAJKOAC5JQgAAkpsALktOAACSqAAuTFAAAJK1AC5P8QAAksIALlAjAACSzwAuUJcAAJLcAC5Q+gAAku8ALlEiAACTAgAuUa8AAJMVAC5R8gAAkygALlQkAACTNQAuVNgAAJNCAC5YhAAAk08ALlq/AACTXAAuWvkAAJNvAC5b2gAAk4IALlz9AACTjwAuXVgAAJOiAC5eQwAAk7UALl+xAACTwgAuYKMAAJPPAC5g+AAAk9wALmI3AACT6QAuYqYAAJP2AC5jsgAAlAMALmYiAACUEAAuZnAAAJQdAC5mkQAAlCoALmkOAACUNwAuaTcAAJREAC5qvgAAlFEALmrnAACUXgAua88AAJRrAC5r+AAAlHgALmzYAACUhQAubQEAAJSSAC5uIQAAlJ8ALm5CAACUrAAubv0AAJS5AC5vSAAAlMYALnB8AACU0wAucOIAAJTgAC5x5QAAlO0ALnY9AACU+gAudl4AAJUHAC52vQAAlRQALnesAACVIQAud80AAJUuAC54LAAAlTsALnoiAACVSAAuelsAAJVcAC58WgAAlWkALny0AACVfQAufrsAAJWKAC5/FQAAlZ4ALoFgAACVqwAugboAAJW/AC6CvwAAlcwALoMcAACV4AAuhGIAAJX0AC6E2gAAlggALoXvAACWHAAuiJ8AAJYwAC6I6AAAlkQALoroAACWUQAuizEAAJZlAC6NcQAAlnIALo26AACWhgAuj8MAAJaTAC6P5AAAlqAALpBDAACWrQAukX0AAJa6AC6SbAAAlsUALpKNAACW0gAukwYAAJbfAC6UrAAAluwALpU4AACW+QAuloEAAJcGAC6YOQAAlxoALpinAACXIAAumQUAAJc0AC6bugAAl0EALqQ6AACXTgAupU0AAJdZAC6mDgAAl2AALqb+AACXawAurI8AAJd2AC60TAAAl3oALrkTAACXhQAuun4AAJeQAC7ANAAAl5sALsDNAACXpgAuxiQAAJexAC7KGQAAl7wALstbAACXxwAuzY0AAJfSAC7SxQAAl90ALtUgAACX6AAu3H4AAJfzAC7dCwAAmAAALuCuAACYBgAu4bsAAJgTAC7yugAAmCAALvLgAACYLQAu8xkAAJg+AC70ewAAmFIALvs7AACYXwAvD0YAAJhqAC8RHQAAmHUALxFXAACYhAAvEjUAAJiTAC8TKQAAmJ4ALxNyAACYrQAvFCwAAJi8AC8XfwAAmMcALxiMAACY1AAvGZIAAJjhAC8aIwAAmO4ALxxrAACY+wAvHVgAAJkIAC8eNAAAmRUALx6jAACZIgAvHxAAAJkvAC8hhwAAmTwALyKFAACZSQAvIz8AAJlWAC8jrAAAmWMALyUlAACZcAAvJloAAJl/AC8nHwAAmYwALyf8AACZmQAvKMoAAJmmAC8rhwAAmbMALyz7AACZvgAvLoMAAJnJAC8vowAAmdQALzO4AACZ3wAvNH0AAJn7AC81jgAAmgwALzwkAACaHQAvPIIAAJoqAC89WAAAmjcALz2bAACaQgAvP6QAAJpPAC9BMAAAmlwAL0McAACaaQAvmc4AAJp2AC+aHQAAmnwAL5qgAACaggAvmtcAAJqIAC+bKwAAmo4AL5uaAACalAAvm9EAAJqaAC+cJQAAmqAAL5x3AACapgAvnMYAAJqsAC+dSQAAmrIAL52AAACauAAvndQAAJq+AC+eQwAAmsQAL556AACaygAvns4AAJrQAC+fMgAAmtYAL5+BAACa3AAvoAQAAJriAC+gOwAAmugAL6CPAACa7gAvoP4AAJr0AC+hNQAAmvoAL6GJAACbAAAvohEAAJsGAC+iYAAAmwwAL6LjAACbEgAvoxoAAJsYAC+jbgAAmx4AL6PdAACbJAAvpBQAAJsqAC+kaAAAmzAAL6S6AACbNgAvpQkAAJs8AC+ljAAAm0IAL6XDAACbSAAvphcAAJtOAC+mhgAAm1QAL6a9AACbWgAvpxEAAJtgAC+ndQAAm2YAL6fEAACbbAAvqEcAAJtyAC+ofgAAm3gAL6jSAACbfgAvqUEAAJuEAC+peAAAm4oAL6nMAACbkAAvqjAAAJuWAC+qfwAAm5wAL6rOAACbogAvqx0AAJuoAC+rjAAAm64AL6vDAACbtAAvrBcAAJu6AC/ECwAAm8AAL+deAACbywAv6WoAAJvRAC/qSQAAm9cAL/guAACb3QAwDi0AAJvqADAOlQAAm/sAMA6yAACcBgAwDvoAAJwRADAPoQAAnBwAMBCiAACcJAAwEMEAAJwvADARBAAAnDoAMBHhAACcTAAwFXUAAJxUADAVqwAAnGMAMB1FAACccgAwHWcAAJyBADAdoQAAnIwAMB44AACcmQAwHowAAJymADAfIgAAnLcAMCkUAACcwgAwKfcAAJzNADBD1wAAnNgAME7gAACc6QAwVowAAJz2ADBcsAAAnQcAMF20AACdFAAwX3kAAJ0hADBgCgAAnS4AMGC2AACdOwAwZWcAAJ1IADBzXAAAnVUAMJVnAACdYAAwlegAAJ1tADCwbAAAnXoAMLGsAACdhwAwsqAAAJ2UADCy3gAAnaEAMLcNAACdrgAwtzoAAJ27ADC38wAAncgAMLggAACd1QAwuzUAAJ3iADC7qQAAne0AML0KAACd+AAwyaAAAJ4FADDLFAAAnhQAMMtWAACeHwAwy5gAAJ4qADDO3AAAnjkAMNFkAACeSAAw1HsAAJ5TADDZHwAAnmAAMNtcAACeawAw26AAAJ52ADDdjgAAnoEAMN2+AACelQAw3swAAJ6pADDe/wAAnr0AMN80AACe0QAw39kAAJ7lADDi0QAAnvkAMOMRAACfDQAw4zQAAJ8hADDjnQAAnzUAMOYpAACfSQAw5ygAAJ9WADDnyAAAn2MAMOkAAACfcAAw6c0AAJ99ADDteAAAn4oAMO9JAACfmwAw84IAAJ+mADD00QAAn7MAMPXjAACfwAAw95EAAJ/NADD5JwAAn9oAMP5OAACf5wAxBksAAJ/0ADEHXgAAoAEAMQgLAACgDgAxFRoAAKAbADFL1QAAoCEAMU0uAACgLAAxUdoAAKA3ADFVdAAAoEYAMVanAACgUQAxV3wAAKBcADFZPAAAoGcAMVvSAACgbQAxXHQAAKB4ADFdjQAAoIMAMWK8AACgjgAxZsEAAKCUADFp+AAAoKMAMWv+AACgrgAxbMgAAKC0ADF7BgAAoL8AMXtXAACgygAxe4QAAKDVADF9zAAAoOAAMX4UAACg5gAxfskAAKDxADF/XgAAoPwAMYCxAAChBwAxgP4AAKESADGEfQAAoR0AMYaDAAChKAAxhzgAAKEuADGMwAAAoTkAMY4rAAChRAAxjm8AAKFPADGqtgAAoVoAMbgGAAChbAAxzREAAKF5ADHNSAAAoYQAMdDSAAChjwAx3m0AAKGcADHmJQAAoacAMeaNAAChrQAx6l8AAKGzADHsgAAAocAAMggKAAChxgAyC/kAAKHMADIWEAAAodIAMha0AACh3wAyF0gAAKHsADIX+AAAofkAMhiBAACiBgAyGVoAAKITADIqTAAAoiAAMkjZAACiLQAySRoAAKIzADJ7QgAAojkAMnybAACiRAAygUcAAKJPADKE4QAAol4AMoYUAACiaQAyhukAAKJ0ADKIqQAAon8AMos/AACihQAyi+EAAKKQADKM+gAAopsAMpIpAACipgAyli4AAKKsADKZZQAAorsAMptrAACixgAynDUAAKLMADKqcwAAotcAMqrEAACi4gAyqvEAAKLtADKtOQAAovgAMq2BAACi/gAyrjYAAKMJADKuywAAoxQAMrAeAACjHwAysGsAAKMqADKz6gAAozUAMrXwAACjQAAytqUAAKNGADK8LQAAo1EAMr2YAACjXAAyvdwAAKNnADLMLQAAo3IAMs8wAACjfQAyz3sAAKOIADLSOQAAo5MAMvBgAACjogAy8yUAAKO9ADL3RwAAo9gAMvebAACj4wAy98EAAKPuADL4AAAAo/kAMvoaAACkBAAy+xwAAKQfADL7TwAApDoAMv3nAACkVQAzAV0AAKRiADMCgQAApH0AMwOrAACkmAAzByUAAKSzADMeLQAApM4AMyCqAACk6QAzK5IAAKUEADM3KgAApR8AM0NLAAClOgAzQ7oAAKVFADNElgAApVAAM0TXAAClWwAzRTsAAKVmADNFhQAApXEAM0c+AACljAAzSWsAAKWnADNLKwAApbIAM0z+AAClzQAzUPEAAKXoADNW3AAApgMAM2M4AACmHgAzaZsAAKY5ADNvYAAApkgAM3XbAACmYwAzdlYAAKZuADN3PAAApnkAM3d/AACmhAAzd+8AAKaPADN4SwAAppoAM3neAACmtQAzeigAAKbEADN8kgAApt8AM49rAACm6gAzj+8AAKb1ADOQLwAApwAAM5XvAACnCwAzl1IAAKcmADOYygAAp0EAM5lVAACnTAAzmh8AAKdXADOaWQAAp2IAM5q/AACnbQAzm0YAAKd4ADOeMgAAp4MAM56aAACnkgAznrMAAKedADOmjwAAp6gAM6dCAACnswAzp38AAKe+ADOsOgAAp8kAM687AACn5AAzr/QAAKfvADOw1wAAp/oAM7VjAACoBQAzteIAAKgQADO2ygAAqBsAM7cRAACoJgAzt4UAAKgxADO35QAAqDwAM7l+AACoVwAzucwAAKhmADO8aAAAqIEAM8YKAACojAAzxjgAAKiXADPGZgAAqKIAM9PLAACorQAz2aMAAKizADPaLgAAqL4AM9pnAACoyQAz3PkAAKjUADPdhAAAqN8AM+cfAACo6gAz8uIAAKj1ADP0uwAAqRAAM/c8AACpKwAz+TwAAKk4ADP7OwAAqUUAM/0lAACpUgA0Dy8AAKlfADQXQgAAqXoANDycAACplQA0TAUAAKmwADRbhgAAqcsANGR9AACp5gA0Z90AAKoBADS0kAAAqhwANNDkAACqKQA03Q8AAKpEADTj1gAAql8ANOg6AACqbAA08eEAAKp3ADTyZQAAqoIANPKlAACqjQA0/ykAAKqYADULOAAAqqMANQxKAACqvgA1DZgAAKrZADUX9gAAquQANRiuAACq/wA1GaAAAKsaADUaOAAAqzUANR9vAACrUAA1I24AAKtrADUm9AAAq4YANShLAACrkQA1LLoAAKucADUwIgAAq6cANTHCAACrsgA1MtsAAKvNADU2rAAAq9gANTrZAACr8wA1PGgAAKwOADVY4wAArCkANXKOAACsRAA1eYkAAKxPADV7OQAArFoANX2oAACsZQA1fmsAAKxwADWDFQAArHsANYP6AACsjAA1i9sAAKydADWqhQAArKEANclyAACsrAA1ybcAAKyyADXLiAAArMwANcvNAACs0gA1zlkAAKzsADXOkQAArPkANdFSAACtBgA10Y4AAK0MADXRygAArRIANdIGAACtGAA10kIAAK0eADXSbwAArSQANeFOAACtKgA14WsAAK03ADXldwAArUQANeYQAACtUQA15vgAAK1eADXr8gAArWsANezpAACteAA1/U0AAK2FADX+IQAArZIANgGsAACtnwA2Af0AAK2sADYDjgAArbkANg+UAACtxgA2D+kAAK3gADYSKgAAre0ANhZbAACt+AA2FrAAAK4SADYZAQAArh8ANhwbAACuKgA2HdcAAK41ADYeBQAArkAANh8EAACuSwA2HzAAAK5WADYfhAAArmEANiCgAACubAA2LCgAAK55ADYwIwAAroQANje3AACujwA2PEkAAK6cADY91AAArqcANkihAACusgA2W4wAAK7BADaBnAAArswANoLvAACu1wA2iC8AAK7iADaIhwAAru0ANoqdAACu+AA2jwUAAK8HADaPtwAArxgANpG1AACvKQA2kp4AAK8wADaS9QAArzcANqgTAACvQgA2rhIAAK9NADa8cAAAr1gANr3uAACvYwA2v08AAK9uADbpBgAAr3kANulJAACvhgA26u8AAK+TADbrWQAAr54ANwZjAACvqQA3B1EAAK+6ADcQ8AAAr8sANxK6AACv3AA3E3EAAK/nADcUiQAAr/IANxWnAACwAQA3Fm0AALAIADcexQAAsA8ANx/iAACwHgA3IScAALAtADcjyQAAsDwANyRIAACwSwA3JJYAALBaADc0bAAAsGUANzjSAACwcAA3OgYAALB9ADc91QAAsIoANz37AACwlwA3P50AALCiADc/9QAAsK0AN0KHAACwuAA3Q3QAALDDADdDmgAAsNAAN0U+AACw2wA3R10AALDmADdHtQAAsPEAN0p6AACw/AA3S/YAALEJADdOLwAAsRYAN07kAACxIwA3T2oAALEuADdRRwAAsTkAN1GpAACxRAA3bmYAALFPADpwIgAAsVoAOnEjAACxaQA6cpQAALF4ADpzMwAAsY0AOnNlAACxogA6dFYAALG3ADqROAAAscYAOpKCAACx0wA6lLYAALHgADqVIAAAse0AOpV6AACx+gA6lmMAALIHADqXHgAAshQAOpjZAACyIQA6msEAALIuADqkMwAAsjsAOqRJAACyRgA6pHEAALJRADqmbQAAslwAOqaDAACyawA6po0AALJ6ADqmvwAAsokAOqx2AACymAA6rUoAALKjADqvRgAAsq4AOrLaAACytgA6sxYAALLBADqzJAAAsswAOrQXAACy1wA6tHgAALLiADq0hgAAsu0AOrVPAACy+AA6tWMAALMDADq1gAAAsw4AOrZ2AACzGQA6toIAALMkADq4VwAAsy8AOrjrAACzNgA6ua4AALNBADq6WQAAs0wAOrr+AACzYQA6vOcAALN2ADrA6wAAs4EAOsGKAACziAA6wlgAALOPADrDHQAAs5oAOsQIAACzpQA6xK0AALO6ADrGzwAAs88AOsfNAACz5AA6y3sAALPvADrLwQAAs/YAOsydAAC0CwA60OkAALQgADrRBAAAtCsAOtHYAAC0NgA61gAAALRBADrWvwAAtEgAOtdkAAC0UwA614EAALReADrYkgAAtGkAOtmBAAC0cAA62Z4AALR7ADrxcAAAtIYAOwlKAAC0kwA7Q0oAALSgADtD5AAAtK0AO0RrAAC0ugA7RTcAALTHADtFvAAAtNQAO0YjAAC04QA7Vv4AALTuADtX4QAAtQEAO1oLAAC1DgA7Wj4AALUbADtauwAAtSgAO3tEAAC1NQA7fLwAALVCADt9cgAAtU8AO4KvAAC1XAA7nU8AALVvADukzQAAtXwAO6ciAAC1jwA72mQAALWcADvc5QAAta0AO91eAAC1ugA78WYAALXHADvxzwAAtdIAO/IRAAC14QA8BTgAALXwADwFrwAAtf0APAX9AAC2DgA8CJ8AALYfADwLrgAAtioAPAwEAAC2OwA8EP8AALZMADwRtQAAtlIAPBv7AAC2WAA8HRgAALZjADwfqAAAtm4APCGxAAC2eQA8Ic4AALZ/ADwkHQAAtooAPCRsAAC2lQA8KCsAALagADwoegAAtqsAPCjJAAC2tgA8LVkAALbBADwtqAAAtswAPC33AAC21wA8LkoAALbiADwxswAAtu0APDMCAAC2+AA8NUQAALcDADw3LwAAtw4APDgBAAC3GQA8OE4AALckADw7kwAAty8APDv/AAC3OgA8Pi8AALdFADw+1QAAt1YAPD+aAAC3ZwA8QCoAALdyADxAoAAAt4MAPEDaAAC3jgA8RFUAALefADxGVQAAt6oAPEaLAAC3tQA8RsEAALfAADxfrAAAt+QAPLLZAAC36gA8s0IAALf1ADy08wAAuAAAPLceAAC4CwA83L4AALgWADzkQwAAuCEAPOYcAAC4LAA85/UAALg3ADzpzgAAuEIAPOunAAC4TQA87M8AALhYADztsQAAuGUAPO90AAC4dwA8774AALiEADzwKwAAuJYAPPBjAAC4owA88KwAALi1ADzw8wAAuMIAPP9TAAC41AA9AicAALjhAD0DXwAAuO4APSerAAC4+wA9KLkAALkGAD0pzwAAuREAPSruAAC5HAA9LAwAALknAD06jAAAuTIAPXosAAC5PQA9e4UAALlIAD2AMQAAuVMAPYPLAAC5YgA9hP4AALltAD2F0wAAuXgAPYeTAAC5gwA9iikAALmJAD2KywAAuZQAPYvkAAC5nwA9kRMAALmqAD2VGAAAubAAPZhPAAC5vwA9mlUAALnKAD2bHwAAudAAPaldAAC52wA9qa4AALnmAD2p2wAAufEAPawjAAC5/AA9rGsAALoCAD2tIAAAug0APa21AAC6GAA9rwgAALojAD2vVQAAui4APbLUAAC6OQA9tNoAALpEAD21jwAAukoAPbsXAAC6VQA9vIIAALpgAD28xgAAumsAPcXiAAC6dgA9xtoAALqBAD3K9gAAuowAPc5qAAC6oAA9zqgAALqrAD3QuAAAurgAPdEwAAC6xwA90VsAALrLAD3RyAAAut8APdHzAAC64wA90nUAALr3AD3TlAAAuwsAPdPSAAC7FgA91cgAALsjAD3WQAAAuzIAPdZrAAC7NgA91tgAALtKAD3XAwAAu04APdeFAAC7YgA92IYAALt2AD3ajQAAu4MAPdq4AAC7hwA920UAALubAD3b+QAAu6YAPdyPAAC7tQA95MgAALvJAD3vyQAAu9gAPfvqAAC75wA+Ac8AALvyAD4EeQAAu/0APgdbAAC8CAA+CXcAALwTAD4KpgAAvB4APgvhAAC8KQA+DzgAALw0AD4R+QAAvD8APhePAAC8SgA+GlMAALxVAD4dMwAAvGAAPh9NAAC8awA+IHwAALx2AD4hwAAAvIEAPig9AAC8jAA+KYsAALyXAD4s7QAAvKIAPiz/AAC8rQA+Lh4AALzFAD4uZgAAvNAAPi63AAC86AA+LxgAALzzAD4vKgAAvP4APi/SAAC9FgA+MI0AAL0uAD4w+gAAvUYAPjE9AAC9XgA+MnsAAL1pAD4y2gAAvXQAPjLsAAC9fwA+NREAAL2XAD44kwAAvaIAPjilAAC9rQA+ObYAAL3FAD45/gAAvdAAPjpNAAC96AA+OqoAAL3zAD46vAAAvf4APjtkAAC+FgA+PB8AAL4uAD48jAAAvkYAPjzHAAC+XgA+PfcAAL5pAD4+VAAAvnQAPj5mAAC+fwA+w94AAL6XAECT1gAAvqIAQKa9AAC+rQBAxYkAAL64AEDGogAAvsMAQMc2AAC+zgBAyCEAAL7ZAEDIUAAAvuYAAA6NAAAAAcAAT0sAFyIxO0RSVmtzgKaAroDVgNuBCoEPgRCBFIEYgSiBNYFHgVWBZIFzgYGBmIGhgaiBsoG+gcWByoHOgdiB74H0gfuCC4INghOCFYIcgiSCNIJBgkaCTIJagnGCeoKFgo2Ck4KWgqWCroLAgsmC04Llgu2C9YL8gwODFIMZgyiDKYMugzODNIM1gzqDUoNjg3ODfYOEg4iDkoOdg6ODroOzg7qDyIPeg+uD9IQHhAuEEYQchCWEL4RChFuEaoR5hIeEmISwhLqEyoTdhO2E9YUHhRSFJIU+hVSFaoV5hYeFkIWXhaCFrYXBhcqF0IXbheSF+oYKhiqGOYZMhmSGdIaGhpmGuYbNhtuG8ocFhyGHOYdCh1GHX4doh3eHhIeYh6yHsIe3h7+HzYfZh+yH9Yf4iBCIGogeiCSIKIgpiCqIM4hDiFuIcYh5iJ2Ip4i9iMGIwojdiOSI54kwiTeJU4lgiYyJmYnNiduJ6oodioOKlIrJis+LDYsUixaLJIsvizKLe4uPi8aLzIvNjAmMF4w3jE+MkYydjK6MvozmjO+M/I0HjQ+NOY1KjYKNg42MjaSNrY3Bjc+N1Y3ajeCN7o3zjf2ODY4cjiiONI4/jkaOU45ojn2Ojo6gjtqPHI8rjzqPT49xj3KPfI+Hj5iPoo+0j7uPx4/Uj+OP7Y/8kAOQD5AQkB+QLpBHkE6QaJBskHOQhZCUkJqQqJCzkMOQz5DYkN+Q6JEAkQGRBJEbkSqRLpFQkVWRXpF0kX6RhJGIkYyRlpGXkaSRtZHNkgWSHpIhkjaSVJJVkluSa5JxkniSfpKVkpuSoJKvkraSt5K4kruSxJLJksqTApMEkxiTK5M2k06TZ5N/k4iTkJOUk52ToJOjk6+Tt5PKk+GT6pPyk/yUAJQHlAiUDZQOlBSUH5QqlDGUOZRTlGWUbZR6lIOUj5SWlKCUqZS1lLqUx5TclO2U+pUIlROVIJUqlTiVQ5VNlU6VUJVRlVOVX5VjlWaVdpWHlY+VmJWglbWVxJXRld+V7JYAlgqWDpYUlh+WMpY0ljyWQJZKllmWdpaDlo6Ww5bWlueW65b9lwWXF5cllzuXQZdNl1GXWZeYl6KXqpe0l8SXypfUl9qX7Jfzl/qYAZgKmCqYNpg8mEOYTJhSmFiYZZhzmIiYjZikmKyYspjQmPuZFpk7mUeZWJlkmXuZgZmJmZOZnZmhmaWZwZnHmeWZ7Zn1mhWaG5ogmiGaKZoqmiuaLJo0mjiaPppCmkuaT5pYmmGad5p7moCahJqMmpWan5qvmrmawprJmtea35rimuia65rsmvSa/psImxKbGJsimyebKJspmyqbK5ssmzabN5s7m0WbT5tZm2ObbZt3m4Gbi5uVm5+bqZuzm72bx5vRm9ub5Zvvm/mcA5wNnBecIZwrnDWcP5xJnFOcXZxnnHGce5yFnI+cmZyjnK2ct5zBnMuc1ZzfnOmc85z9nQedEZ0bnSWdL505nUOdTZ1XnWGda51unXSdgZ2FnY6dl52hnaWdr525ncOdzZ3Rnded4p3onfWd/J4DngSeBp4IngueDJ4NnhGe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AEhOwABIX8AASHXAAEiGwABInMAASLLAAEjNwABI68AASQjAAEkSwABJIsAASTDAAElBwABJScAASV7AAEluwABJg8AASYzAAEmawABJo8AASbHAAEm6wABJv8AAScjAAEnJwABJ18AASebAAEn6wABKDsAASh7AAEorwABKNsAASj7AAEpJwABKXsAASnPAAEqIwABKosAASrLAAErHwABK3MAASvbAAEsFwABLEsAASxzAAEsxwABLQ8AAS0bAAEtNwABLVcAAS2bAAEtqwABLcsAAS3fAAEuNwABLosAAS6vAAEuvwABLuMAAS8LAAEvcwABL78AAS/rAAEwHwABMH8AATDDAAEw8wABMQcAATEnAAExfwABMb8AATHPAAEx6wABMj8AATJ/AAEymwABMr8AATLPAAEy6wABMz8AATN/AAEztwABM+MAATP/AAE0OwABNI8AATSvAAE02wABNR8AATV3AAE1pwABNhMAATZ3AAE2uwABNusAATcfAAE3awABN6MAATfPAAE4EwABOEMAATiHAAE4qwABONcAATkPAAE5PwABOXMAATm7AAE54wABOh8AATpTAAE6hwABOs8AATr7AAE7OwABO2cAATunAAE72wABPA8AATxXAAE8gwABPMMAATz7AAE9RwABPWMAAT2TAAE9pwABPc8AAT37AAE+OwABPmMAAT6fAAE+xwABPwMAAT83AAE/cwABP6MAAT/zAAFAJwABQG8AAUDLAAFBEwABQTMAAUGPAAFBwwABQc8AAUHvAAFCKwABQnsAAUKnAAFCzwABQw8AAUNfAAFDkwABQ/cAAUQbAAFEZwABRMcAAUTbAAFFAwABRSsAAUVbAAFFhwABRccAAUX/AAFGSwABRocAAUbXAAFHHwABR28AAUevAAFIAwABSDsAAUiHAAFIvwABSQsAAUk3AAFJdwABSacAAUnLAAFJ5wABSisAAUpjAAFKiwABSqsAAUrHAAFLEwABS08AAUtjAAFLswABS9sAAUwfAAFMQwABTG8AAUyrAAFNBwABTXcAAU2jAAFN4wABTh8AAU5vAAFOjwABTqsAAU7fAAFO8wABTwcAAU8rAAFPUwABT3sAAU+jAAFPxwABUAMAAVA7AAFQbwABUJcAAVDDAAFQ4wABUS8AAVF7AAFRuwABUf8AAVI7AAFSZwABUpcAAVLLAAFS6wABUxsAAVNbAAFTuwABVAcAAVRnAAFUdwABVKMAAVTHAAFU6wABVRsAAVVbAAFVhwABVbMAAVYTAAFWQwABVlsAAVZ7AAFWlwABVsMAAVcXAAFXdwABV48AAVe7AAFX5wABWCcAAVi3AAFY4wABWSMAAVlDAAFZdwABWZsAAVnTAAFZ+wABWjcAAVprAAFavwABWwcAAVtDAAFbcwABW58AAVvDAAFcAwABXB8AAVxjAAFcewABXJMAAVzXAAFc6wABXP8AAV03AAFdYwABXY8AAV3PAAFeIwABXkcAAV6bAAFe0wABXxcAAV+HAAFftwABX/cAAWB3AAFgzwABYPMAAWFfAAFiWwABYscAAWODAAFjwwABY/sAAWQzAAFkUwABZHcAAWSbAAFkzwABZPMAAWUDAAFlHwABZUsAAWWTAAFlswABZe8AAWYXAAFmNwABZj8AAWZTAAFmXwABZpMAAWbHAAFm6wABZ3MAAWefAAFn4wABaCsAAWhPAAFobwABaIsAAWi7AAFo/wABaS8AAWlzAAFp2wABagsAAWpPAAFqtwABauMAAWsjAAFrhwABa78AAWwLAAFsewABbI8AAWzHAAFtEwABbYMAAW27AAFt+wABbkcAAW63AAFu4wABbx8AAW9fAAFvwwABb8sAAW/TAAFwEwABcBsAAXBLAAFwjwABcPcAAXEjAAFxYwABcccAAXIHAAFyWwABctMAAXLjAAFy6wABcu8AAXNfAAFzmwABdB8AAXTHAAF0ywABdNMAAXTvAAF1KwABdXMAAXXDAAF2NwABdoMAAXbjAAF3ZwABd7MAAXgTAAF4lwABeLcAAXjvAAF5DwABeUMAAXlrAAF55wABeiMAAXpzAAF6lwABes8AAXr7AAF7TwABe3cAAXuDAAF7owABe7sAAXwDAAF8NwABfG8AAXybAAF8wwABfP8AAX0jAAF9MwABfVsAAX2HAAF9swABfecAAX5/AAF+zwABftsAAX7/AAF/MwABf4sAAX+vAAF/1wABgAMAAYA3AAGAXwABgI8AAYDDAAGA4wABgQcAAYEnAAGBTwABgX8AAYHnAAGCMwABglMAAYKDAAGC1wABgxcAAYNPAAGDiwABg6MAAYPLAAGD8wABhB8AAYQ3AAGEbwABhJMAAYSXAAGEzwABhN8AAYUDAAGFJwABhU8AAYV/AAGFkwABhZcAAYXnAAGGDwABhicAAYZbAAGGewABhpMAAYarAAGG4wABhvcAAYcTAAGHLwABh2sAAYd7AAGHpwABh78AAYgbAAGIRwABiFsAAYinAAGI0wABiPsAAYkPAAGJMwABiU8AAYmDAAGJxwABih8AAYpTAAGKmwABit8AAYs/AAGLlwABi/MAAYxfAAGMwwABjPMAAY0fAAGNZwABjbcAAY3fAAGOAwABjmcAAY7DAAGPMwABj1cAAY9rAAGPgwABkBMAAZBbAAGQqwABkNsAAZEPAAGRTwABkYMAAZHLAAGSHwABklMAAZKTAAGS1wABk0sAAZPDAAGUFwABlHMAAZTDAAGU5wABlRsAAZVnAAGVnwABlbMAAZXrAAGWIwABllsAAZaLAAGWywABlzcAAZebAAGYGwABmJsAAZkHAAGZewABmcMAAZo7AAGamwABmtcAAZsrAAGbUwABm2sAAZunAAGbwwABm+MAAZwjAAGcQwABnGMAAZyHAAGcxwABnOMAAZ0PAAGdUwABnZcAAZ23AAGd2wABnf8AAZ4bAAGeMwABnj8AAZ6fAAGeuwABnt8AAZ8nAAGfQwABn2cAAZ/DAAGf3wABoBMAAaBDAAGgbwABoNMAAaEfAAGhpwABofsAAaI/AAGiUwABoncAAaKrAAGitwABow8AAaNXAAGjnwABo9cAAaQfAAGkVwABpK8AAaT3AAGlVwABpacAAaZPAAGm5wABp0MAAaePAAGn1wABqA8AAahfAAGonwABqOcAAakrAAGpcwABqbMAAan3AAGqWwABqpMAAarvAAGrJwABq6cAAawDAAGsIwABrFsAAaxzAAGs8wABrS8AAa1XAAGtnwABrd8AAa43AAGufwABrrcAAa73AAGvSwABr5cAAa+bAAGvwwABr+sAAbAjAAGwdwABsTMAAbFfAAGxfwABsbsAAbHPAAGx8wABshMAAbIjAAGyVwABsrcAAbLrAAGzFwABs2sAAbOvAAGz8wABtG8AAbTvAAG1IwABtY8AAbXjAAG2KwABtlMAAbcnAAG3ewABt58AAbh/AAG4qwABuYMAAbnPAAG6LwABuocAAbrLAAG7IwABu3cAAbufAAG79wABvAMAAbwjAAG8YwABvNMAAb0PAAG9UwABvXsAAb2rAAG+LwABvo8AAb6zAAG+0wABvx8AAb9vAAG/dwABv38AAb/fAAHACwABwBcAAcA7AAHAjwABwN8AAcEbAAHBJwABwacAAcHDAAHB6wABwhcAAcKTAAHCzwABw1sAAcOnAAHEQwABxKMAAcVXAAHFkwABxh8AAcZjAAHG9wABxz8AAcfXAAHICwAByI8AAcjnAAHJkwABydMAAcpjAAHK7wABy2cAAcwHAAHMiwABzScAAc2nAAHOTwABztMAAc9bAAHQCwAB0H8AAdEbAAHRqwAB0h8AAdKXAAHTNwAB06sAAdRHAAHUuwAB1VcAAdWvAAHWJwAB1scAAddbAAHXxwAB2KsAAdkrAAHZ0wAB2lMAAdr7AAHbtwAB3JcAAd0fAAHdywAB3l8AAd8bAAHfpwAB4DsAAeD3AAHhMwAB4UsAAeF3AAHhuwAB4esAAeIvAAHiTwAB4osAAeKnAAHizwAB4u8AAeMTAAHjNwAB44cAAePDAAHj/wAB5DMAAeRbAAHkiwAB5JsAAeS/AAHk0wAB5O8AAeUjAAHlVwAB5Z8AAeXLAAHl3wAB5fMAAeYHAAHmGwAB5lMAAeZ3AAHmiwAB5qcAAebzAAHnFwAB508AAedzAAHnkwAB57MAAefXAAHoHwAB6F8AAeijAAHo3wAB6QMAAekbAAHpKwAB6TsAAelHAAHpUwAB6WsAAemDAAHpkwAB6Z8AAem/AAHp3wAB6fcAAeoXAAHqPwAB6n8AAeq3AAHrIwAB60sAAetjAAHrewAB66sAAevbAAHsAwAB7CsAAexPAAHscwAB7KMAAezTAAHs+wAB7R8AAe1DAAHtewAB7bMAAe3jAAHuCwAB7kMAAe6DAAHu2wAB72sAAe/7AAHwVwAB8KcAAfEXAAHxYwAB8fsAAfIvAAHybwAB8r8AAfMDAAHzTwAB858AAfPTAAH0AwAB9EMAAfRzAAH01wAB9Q8AAfWLAAH2BwAB9mMAAfbfAAH3YwAB+BMAAfiPAAH5EwAB+Y8AAfoPAAH6kwAB+ucAAfs3AAH7wwAB+/8AAfwvAAH8WwAB/JMAAfzbAAH9KwAB/YMAAf3nAAH+CwAB/lMAAf6jAAH+/wAB/0MAAf+PAAH/5wACACsAAgB3AAIAzwACAR8AAgF3AAIB2wACAisAAgKDAAIC5wACAy8AAgN/AAID2wACBB8AAgRrAAIEwwACBQcAAgVTAAIFqwACBgMAAgZjAAIGzwACBycAAgeHAAIH8wACCEMAAgibAAII/wACCUcAAgmXAAIJ8wACCksAAgqrAAILFwACC3cAAgvfAAIMUwACDMsAAg1LAAIN1wACDicAAg5/AAIO4wACD0MAAg+rAAIQHwACEG8AAhDHAAIRKwACEYMAAhHjAAISTwACEp8AAhL3AAITWwACE5cAAhPbAAIUKwACFHcAAhS7AAIVDwACFY8AAhXTAAIWMwACFmMAAhaLAAIW+wACFx8AAheHAAIYCwACGCsAAhizAAIY1wACGU8AAhlvAAIZ5wACGpMAAhsPAAIbNwACG4sAAhvjAAIcPwACHJ8AAh0XAAIdbwACHesAAh5HAAIelwACHscAAh7rAAIfSwACH5sAAiATAAIgZwACIL8AAiEXAAIhOwACIXcAAiGfAAIhywACIfcAAiIrAAIiVwACIosAAiK3AAIi1wACIx8AAiNDAAIjYwACI68AAiPrAAIkPwACJIMAAiUPAAIlMwACJWcAAiWzAAIl4wACJhcAAiZXAAImnwACJssAAibvAAInRwACJ5MAAif/AAIoLwACKE8AAihbAAIoewACKLcAAijvAAIpIwACKVMAAinfAAIqIwACKlsAAip7AAIqpwACKtcAAisDAAIrGwACK0MAAit3AAIruwACK/cAAiwfAAIsSwACLLMAAizvAAItIwACLXMAAi2LAAIt1wACLlcAAi6vAAIvAwACLy8AAi9bAAIv0wACMAcAAjBLAAIwfwACMMsAAjDrAAIxXwACMacAAjHLAAIyXwACMnsAAjLHAAIzAwACM08AAjOjAAI0AwACNGMAAjS3AAI0+wACNUcAAjWfAAI13wACNicAAjZ7AAI2uwACNwMAAjdXAAI3fwACN8sAAjgfAAI4fwACOMsAAjkfAAI5fwACOcMAAjoPAAI6ZwACOpMAAjrTAAI7GwACO28AAjuXAAI71wACPB8AAjxzAAI8mwACPO8AAj1LAAI9swACPe8AAj5DAAI+nwACPwcAAj9DAAI/jwACP+MAAkBDAAJAhwACQNMAAkErAAJBfwACQdsAAkJDAAJCfwACQtsAAkM/AAJDrwACQ/MAAkRnAAJE4wACRWsAAkXHAAJGEwACRmcAAkbHAAJG+wACR1cAAke7AAJIKwACSG8AAki7AAJJDwACSW8AAkmjAAJJ9wACSlMAAkq7AAJK9wACS0MAAkuXAAJL9wACTCsAAkxfAAJMcwACTK8AAkz3AAJNMwACTbsAAk3PAAJOCwACTisAAk5LAAJOYwACTrcAAk7vAAJPWwACT5sAAk/jAAJP5wACT/8AAlAnAAJQYwACUKsAAlDzAAJQ+wACUTsAAlF/AAJRvwACUf8AAlI7AAJSiwACUvsAAlNzAAJTxwACVB8AAlRnAAJU1wACVRsAAlWPAAJWOwACVoMAAlabAAJW+wACV5sAAlfjAAJYZwACWMMAAljTAAJZVwACWXcAAlmXAAJZzwACWf8AAlpvAAJa3wACWysAAltzAAJbxwACW+MAAlxTAAJccwACXI8AAlzLAAJc7wACXSMAAl1LAAJdkwACXa8AAl4PAAJegwACXt8AAl9PAAJfqwACYBMAAmB7AAJguwACYQsAAmEzAAJhQwACYW8AAmGLAAJiEwACYjMAAmJLAAJibwACYpcAAmLHAAJi9wACYwMAAmM7AAJjawACY5cAAmOvAAJjxwACY/cAAmQfAAJkNwACZG8AAmSbAAJk2wACZSMAAmVXAAJlhwACZbcAAmXfAAJl/wACZjcAAmZvAAJmpwACZuMAAmcLAAJnNwACZ2sAAmeLAAJnlwACZ/sAAmgbAAJoSwACaJcAAmirAAJo5wACaSMAAmkvAAJpZwACaZcAAmnXAAJqQwACaocAAmrzAAJrIwACazMAAmubAAJr3wACbBsAAmw3AAJsQwACbH8AAmyjAAJs2wACbQsAAm07AAJtYwACbYsAAm2bAAJtqwACbdMAAm4TAAJuPwACblMAAm63AAJu9wACby8AAm9/AAJvkwACb+cAAm/zAAJwKwACcKsAAnC/AAJw4wACcQ8AAnFTAAJxYwACcZ8AAnHbAAJx+wACcgsAAnJPAAJykwACctcAAnMbAAJzPwACc4MAAnRvAAJ0qwACdM8AAnUDAAJ1NwACdYsAAnWXAAJ1mwACde8AAnZPAAJ2YwACdsMAAncPAAJ3WwACd6cAAnfDAAJ36wACeBMAAng/AAJ4ZwACeIsAAnjDAAJ44wACeU8AAnnLAAJ6GwACelsAAnqrAAJ6ywACet8AAnr7AAJ7IwACe1cAAnuTAAJ77wACfCsAAnxfAAJ8iwACfLcAAnzXAAJ9IwACfV8AAn2XAAJ93wACfhsAAn5bAAJ+mwACft8AAn8fAAJ/MwACf0MAAn+nAAKAAwACgF8AAoCLAAKArwACgQsAAoFnAAKBwwACgh8AAoJ7AAKC1wACgzMAAoOPAAKD6wAChEcAAoSjAAKE/wAChTsAAoVjAAKFgwAChb8AAoXPAAKF7wAChhcAAoZ3AAKGgwAChr8AAocXAAKHRwACh5cAAoe/AAKH7wACiD8AAoijAAKI4wACiR8AAomfAAKKGwACiosAAorfAAKLMwACi6MAAovTAAKMHwACjIsAAozHAAKNHwACjWcAAo2fAAKN6wACjhsAAo5HAAKOcwACjrcAAo77AAKPbwACj5cAAo/TAAKQGwACkIsAApC7AAKRMwACkdcAApJDAAKS1wACkucAApM3AAKTewACk5sAApPbAAKUCwAClE8AApSTAAKUywAClPcAApUjAAKVZwAClbMAApX7AAKWjwAClvsAApdLAAKXowACl+cAApgrAAKYewACmLcAApj7AAKZMwACmVcAApmjAAKZ+wACml8AAprDAAKa2wACmx8AAptLAAKbcwACm6cAApvTAAKcBwACnCcAApxrAAKcowACnKsAApy3AAKc8wACnRcAAp1XAAKdswACnfcAAp43AAKecwACnrsAAp7rAAKfHwACn2MAAp+/AAKgQwACoLcAAqEnAAKhZwACoaMAAqH3AAKigwACorMAAqMzAAKjjwACo/MAAqQfAAKkYwACpKMAAqUXAAKlewACpecAAqYjAAKmTwACpnMAAqbPAAKnTwACp7MAAqhXAAKojwACqL8AAqjvAAKpFwACqYMAAqnXAAKqBwACqlMAAqp3AAKquwACqwcAAqsrAAKrewACq6cAAqvjAAKsGwACrGcAAqx/AAKsswACrQcAAq1HAAKttwACreMAAq4bAAKuPwACrmcAAq6bAAKuvwACrucAAq8PAAKvEwACr1MAAq+nAAKvywACr+8AArAfAAKwWwACsGsAArC3AAKwywACsO8AArE/AAKxjwACsecAArIbAAKyYwACsncAArK7AAKy8wACsyMAArNbAAKzowACs98AArQTAAK0UwACtI8AArSfAAK0twACtNsAArT/AAK1IwACtWsAArWrAAK19wACtlsAArabAAK2wwACtusAArcbAAK3SwACt38AArenAAK37wACuEcAArhXAAK4dwACuKcAArjPAAK4/wACuScAArk7AAK5lwACugcAArovAAK6iwACurMAArr3AAK7FwACuz8AArtbAAK7nwACu9MAArwHAAK8cwACvKsAArzbAAK9LwACvXcAAr47AAK+zwACvv8AAr9HAAK/uwACwA8AAsAvAALAdwACwL8AAsEXAALBkwACwb8AAsHrAALCRwACwo8AAsLHAALC/wACwy8AAsNrAALDmwACw9MAAsQXAALEQwACxG8AAsSfAALEvwACxP8AAsUrAALFgwACxccAAsZHAALGtwACxycAAseHAALH8wACyE8AAsiLAALIrwACyOcAAskHAALJVwACyd8AAsoLAALKhwACyucAAssLAALLYwACy58AAsv/AALMJwACzGcAAsyjAALM0wACzTMAAs2bAALNuwACzg8AAs5bAALOnwACztMAAs9HAALPpwACz8sAAtAbAALQWwAC0HcAAtC3AALQ+wAC0U8AAtGTAALRxwAC0hcAAtJbAALSkwAC0psAAtLLAALS+wAC0y8AAtNbAALTfwAC06sAAtPrAALUGwAC1FsAAtRrAALUxwAC1QcAAtVTAALVlwAC1c8AAtYPAALWfwAC1rMAAtbPAALXAwAC1xcAAtcrAALXcwAC158AAtfzAALYRwAC2JsAAtjPAALZGwAC2XcAAtmvAALaEwAC2msAAtrXAALa9wAC2z8AAtt7AALbuwAC2/8AAtyHAALdCwAC3YMAAt33AALepwAC3yMAAt9PAALfowAC4AsAAuAnAALgjwAC4NsAAuErAALhgwAC4dcAAuI7AALiYwAC4qsAAuLnAALjNwAC42cAAuOzAALj4wAC5BcAAuQzAALkdwAC5NMAAuUfAALldwAC5YcAAuW7AALl2wAC5h8AAuZXAALmjwAC5tMAAubjAALnEwAC5yMAAuczAALnawAC56cAAugPAALoNwAC6HcAAuivAALoywAC6QsAAulPAALpewAC6ccAAun3AALqRwAC6pcAAurTAALrSwAC61MAAutbAALrjwAC68MAAuv3AALsNwAC7H8AAuy3AALs7wAC7VsAAu3TAALuAwAC7iMAAu5fAALuuwAC7xMAAu8nAALvUwAC748AAu/HAALwAwAC8FcAAvCrAALw6wAC8QsAAvFPAALxjwAC8eMAAvH/AALyIwAC8kcAAvJ/AALyowAC8vsAAvM7AALzpwAC9AsAAvR3AAL0zwAC9RsAAvVPAAL1owAC9fcAAvZDAAL2ewAC9r8AAvcXAAL3cwAC99cAAvgbAAL4bwAC+LcAAvkbAAL5ewAC+d8AAvo/AAL6hwAC+tsAAvsrAAL7gwAC+88AAvwbAAL8VwAC/PsAAv2zAAL96wAC/iMAAv6XAAL+/wAC/w8AAv9PAAL/ewAC/9cAAv/vAAMAowADAPsAAwFLAAMBmwADAfMAAwIzAAMCowADAuMAAwMHAAMDMwADA4MAAwPfAAMEBwADBFMAAwR3AAME6wADBVcAAwW3AAMGCwADBn8AAwbfAAMHIwADB3MAAweXAAMHswADCEsAAwinAAMI8wADCUMAAwmPAAMJ1wADCiMAAwpvAAMKpwADCt8AAwtLAAMLiwADC7sAAwvXAAMMKwADDHsAAwzDAAMNCwADDWcAAw27AAMOGwADDnsAAw7jAAMPGwADD18AAw+zAAMP7wADEB8AAxBnAAMQhwADEMMAAxEvAAMRewADEacAAxHTAAMSHwADEl8AAxK3AAMS4wADE0sAAxN3AAMT1wADFBsAAxQ7AAMUgwADFPcAAxUPAAMVXwADFYMAAxXHAAMWBwADFjcAAxZXAAMWfwADFq8AAxbbAAMXWwADF78AAxgTAAMYbwADGJcAAxjfAAMZKwADGZsAAxnTAAMaFwADGksAAxp/AAMavwADGucAAxsbAAMbSwADHAcAAxyTAAMctwADHQMAAx0rAAMdTwADHXcAAx2nAAMd7wADHj8AAx7vAAMfBwADH08AAx+TAAMf4wADIBsAAyBTAAMgiwADINcAAyEPAAMhUwADIZMAAyHXAAMiDwADIkcAAyKXAAMi5wADIzcAAyOHAAMj1wADJBsAAyRfAAMkowADJOcAAyVDAAMlnwADJfsAAyZXAAMmswADJzMAAyePAAMnzwADJ/MAAygzAAMoawADKI8AAyjXAAMpAwADKXMAAynnAAMqIwADKl8AAyrHAAMrGwADK0sAAyt7AAMrrwADK+sAAywTAAMsawADLL8AAy0fAAMtbwADLZcAAy3DAAMt4wADLm8AAy6bAAMu0wADLwsAAy+vAAMwMwADMJ8AAzDnAAMxCwADMTcAAzGDAAMx1wADMecAAzIHAAMyMwADMlsAAzJnAAMynwADMusAAzNPAAMzewADM68AAzQnAAM0xwADNRMAAzU/AAM1fwADNZcAAzWrAAM1/wADNicAAzZbAAM2iwADNrMAAzbXAAM3AwADN0MAAzefAAM30wADOAsAAzhnAAM4zwADOQcAAzk7AAM5awADOYsAAzmfAAM5wwADOfMAAzovAAM6hwADOuMAAzszAAM7hwADO7MAAzvfAAM8AwADPEsAAzybAAM9BwADPSsAAz2DAAM99wADPn8AAz6nAAM+3wADP1sAAz+XAANAFwADQCcAA0CLAANA7wADQR8AA0FLAANBjwADQfMAA0I3AANCswADQucAA0MjAANDUwADQ4cAA0O7AANEBwADREcAA0SbAANE0wADRYMAA0W7AANGlwADRvMAA0djAANHowADR/cAA0hjAANJBwADSVsAA0pnAANK4wADS+cAA0zjAANNBwADTXcAA03bAANN4wADTfMAA04HAANOVwADTosAA06zAANOzwADTusAA08LAANPMwADT0sAA0+PAANPowADT+cAA1AnAANQWwADUKcAA1DHAANQ7wADUYsAA1HLAANR4wADUgcAA1JPAANSiwADUwsAA1MbAANTUwADU3cAA1PLAANT/wADVDcAA1SDAANUkwADVKMAA1UTAANVXwADVaMAA1XTAANWFwADVq8AA1b/AANXFwADVzsAA1djAANX0wADWBMAA1hXAANYowADWUcAA1lfAANZjwADWa8AA1nPAANaBwADWkcAA1qjAANazwADWzcAA1tjAANcWwADXJ8AA1z7AANdcwADXZ8AA14jAANe7wADXwcAA18vAANfVwADX4sAA1+XAANfrwADX88AA1/vAANgAwADYBcAA2AnAANgNwADYDsAA2CTAANguwADYNsAA2EbAANhWwADYZsAA2H/AANiGwADYmMAA2KzAANjBwADY28AA2OnAANj3wADZCcAA2QzAANkPwADZEsAA2RXAANkYwADZHsAA2SHAANkxwADZPcAA2UvAANlXwADZYMAA2WPAANlswADZicAA2ZXAANmjwADZrMAA2b3AANm/wADZz8AA2eXAANnvwADZ9MAA2grAANoTwADaIMAA2jXAANpPwADaaMAA2njAANqDwADajsAA2p7AANqnwADawsAA2s3AANrrwADa98AA2wLAANsJwADbGcAA2yLAANspwADbNMAA2z/AANtnwADbd8AA24rAANubwADbp8AA26/AANu/wADb0MAA2+LAANvwwADcBcAA3B3AANw5wADcT8AA3FzAANxowADcdsAA3HvAANyDwADck8AA3KHAANylwADcucAA3MjAANzawADc6sAA3PbAAN0FwADdFsAA3SHAAN0uwADdPcAA3U/AAN1fwADdacAA3XXAAN2EwADdkMAA3ZnAAN2hwADdrsAA3cHAAN3QwADd4MAA3e/AAN4NwADeHsAA3j3AAN5QwADeZ8AA3oDAAN6LwADemsAA3qzAAN66wADe0sAA3uLAAN7swADe/MAA3wjAAN8awADfJsAA3zXAAN9CwADfTcAA31zAAN9iwADfaMAA33HAAN+QwADfoMAA36vAAN+8wADfzMAA39vAAN/wwADgC8AA4CHAAOA3wADgSMAA4F7AAOBvwADgj8AA4JzAAOCnwADgucAA4MbAAODTwADg2sAA4ObAAODuwADhBsAA4RbAAOEkwADhMMAA4TbAAOFUwADhbMAA4YTAAOGSwADhsMAA4bjAAOHOwADh3sAA4ezAAOH9wADiD8AA4iPAAOItwADiZ8AA4oLAAOKSwADim8AA4qLAAOKxwADitsAA4sLAAOLPwADi38AA4urAAOL4wADjEsAA4yjAAOM+wADjUsAA41zAAONrwADjcsAA467AAOPIwADj2cAA4/vAAOQIwADkR8AA5FrAAORhwADkdsAA5IfAAOSTwADkncAA5KTAAOSowADku8AA5MXAAOTWwADk6cAA5OvAAOT+wADlDMAA5R7AAOVTwADlccAA5YHAAOWEwADlj8AA5ZPAAOWXwADlm8AA5cHAAOXSwADl6cAA5ezAAOX+wADmDsAA5irAAOYvwADmTMAA5lvAAOZtwADmjcAA5pzAAOaxwADmycAA5tvAAObwwADm+cAA5wPAAOcpwADnRMAA52fAAOd6wADnssAA5+bAAOgcwADoV8AA6JDAAOiWwADoocAA6KjAAOi2wADouMAA6MDAAOjIwADo8sAA6P/AAOkOwADpH8AA6S7AAOlAwADpVsAA6V/AAOlmwADpcMAA6ZPAAOmawADpqsAA6bHAAOncwADp5cAA6gnAAOoXwADqQcAA6kjAAOpVwADqc8AA6nbAAOqVwADqq8AA6rvAAOq8wADqw8AA6unAAOrxwADrAcAA6wnAAOsewADrJsAA60PAAOtIwADrVMAA62jA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AQpmwAEKesABCpPAAQqlwAEKssABCsLAAQrNwAEK0sABCvDAAQsMwAELH8ABCyvAAQs9wAELQ8ABC2/AAQvNwAEL0cABC9XAAQvlwAEMJ8ABDD3AAQx5wAEMt8ABDNbAAQ0RwAENMMABDT3AAQ1fwAENcsABDaHAAQ2qwAENrcABDczAAQ3vwAEN+cABDgLAAQ4LwAEODcABDivAAQ5CwAEOVMABDlzAAQ5lwAEOacABDnHAAQ55wAEOosABDqTAAQ6nwAEOs8ABDr7AAQ7NwAEO4MABDu7AAQ74wAEPBcABDw/AAQ8bwAEPLsABDzvAAQ9DwAEPXsABD3vAAQ+MwAEPm8ABD6bAAQ+vwAEPt8ABD8nAAQ/WwAEP5cABD/zAARAOwAEQQMABEG3AARB6wAEQjMABEJfAARCcwAEQosABELPAARC/wAEQxMABENHAARDUwAEQ6sABEO7AAREGwAERFMABER7AARE0wAEROMABEUDAARFGwAERUcABEXXAARF7wAERjMABEaHAARGxwAER2MABEdrAARIJwAESS8ABEmjAARJrwAESfcABEoPAARKLwAESl8ABEqPAARKtwAESu8ABEtDAARLiwAES7cABEwvAARMmwAETV8ABE27AAROBwAETlcABE7bAARQBwAEUHsABFDfAARRTwAEUdMABFL/AARTcwAEU9cABFRDAARUtwAEVcMABFYnAARWewAEVtcABFdzAARYcwAEWP8ABFl7AARaGwAEWqMABFxfAARc1wAEXT8ABF3jAARfcwAEYAcABGCLAARhLwAEY1cABGPrAARkbwAEZQ8ABGZHAARm1wAEZ1cABGefAARoKwAEaW8ABGnrAARqVwAEasMABGuLAARuYwAEbxsABG/DAARwPwAEcMcABHL7AARzcwAEc9sABHRLAAR1gwAEdeMABHYzAAR2vwAEd68ABHgrAAR4lwAEeVMABHnLAAR7QwAEfNcABH0/AAR9lwAEfg8ABH7DAAR/HwAEf2sABICfAASBHwAEgY8ABILfAASDZwAEg98ABIUTAASFWwAEhZMABIbvAASHOwAEh3cABIhXAASJywAEipsABItbAASMQwAEjasABI6DAASPSwAEkAcABJFHAASR8wAEko8ABJNTAASUcwAElScABJXLAASWbwAEl5MABJgrAASYvwAEmUMABJm7AASaOwAEmzsABJurAAScCwAEnGMABJ0/AASeJwAEnvsABJ/HAASggwAEoSMABKGDAASh0wAEok8ABKPfAASkzwAEpTsABKWXAASmAwAEpqsABKezAASoSwAEqNMABKkzAASppwAEqzsABKw3AASsmwAErO8ABK1zAASuFwAEr/cABLCLAASxDwAEsa8ABLPzAAS0gwAEtQMABLXDAAS4KwAEuVsABLoLAAS6qwAEuz8ABLz3AAS9ewAEve8ABL6HAATANwAEwL8ABME3AATB7wAEw8MABMRrAATFAwAExZsABMcrAATIOwAEyMMABMk7AATJrwAEymMABMtDAATL5wAEzHsABMzzAATNWwAEzbMABM37AATOewAEz3cABM/nAATQRwAE0MMABNHXAATTDwAE03sABNPXAATUPwAE1LcABNWvAATWywAE1zMABNeLAATX7wAE2GMABNlXAATabwAE2tMABNsnAATbhwAE2/sABNzvAATeBwAE3msABN6/AATfHwAE358ABODDAAThzwAE4j8ABOKfAATi8wAE41sABOSDAATlzwAE5icABOZvAATmwwAE5z8ABOhfAATpYwAE6c8ABOorAATqdwAE6wMABOw3AATsswAE7R8ABO3TAATu5wAE74sABPAfAATwywAE8V8ABPODAAT0BwAE9HsABPUbAAT1kwAE9scABPcvAAT3hwAE+BMABPljAAT55wAE+mMABPrPAAT7YwAE/JMABP0XAAT9iwAE/gcABP8vAAT/owAFAA8ABQBrAAUA7wAFAecABQJbAAUCvwAFA0MABQRzAAUE5wAFBUsABQXXAAUG1wAFB1MABQe/AAUISwAFCYMABQn/AAUKewAFCucABQt7AAUMgwAFDQcABQ17AAUOQwAFD88ABRCHAAURLwAFEf8ABRN/AAUUPwAFFO8ABRWDAAUX5wAFGRcABRmbAAUaDwAFGmsABRsDAAUdFwAFHZcABR4fAAUelwAFHx8ABSEXAAUhjwAFIfcABSKfAAUkiwAFJSMABSWrAAUmcwAFJxcABSezAAUoawAFKRMABSmXAAUq6wAFK18ABSvDAAUsQwAFLPMABS47AAUu2wAFL2sABS/XAAUwjwAFMecABTKPAAUzJwAFM5sABTQjAAU1UwAFNcsABTYzAAU2mwAFN7sABTgTAAU4WwAFOO8ABTp/AAU7AwAFO3cABTv3AAU8nwAFPc8ABT5nAAU+7wAFP58ABUCzAAVBUwAFQeMABUI/AAVDGwAFRLcABUUDAAVFPwAFRX8ABUXbAAVGtwAFSC8ABUh7AAVItwAFSPcABUlTAAVKLwAFS8sABUwXAAVMUwAFTJMABU0XAAVNKwAFTUMABU2DAAVNnwAFTcMABU3nAAVODwAFThMABU5zAAVOjwAFTscABU9jAAVPrwAFUFsABVD3AAVRGwAFUU8ABVGDAAVRtwAFUosABVMXAAVTOwAFU/8ABVSzAAVVWwAFVfsABVYjAAVXowAFWF8ABVinAAVY6wAFWQMABVlzAAVZwwAFWn8ABVtDAAVcZwAFXR8ABV1PAAVdqwAFXhcABV67AAVe8wAFX1MABWAzAAVggwAFYucABWOHAAVljwAFZhcABWZjAAVmpwAFZ0sABWfbAAVoXwAFaQMABWmzAAVqFwAFam8ABWrzAAVrGwAFa3MABWwbAAVtMwAFbeMABW8XAAVvhwAFb8MABXCnAAVxGwAFcTMABXFbAAVxbwAFcZMABXJDAAVzOwAFc+MABXQzAAV0hwAFdYcABXYzAAV2cwAFd0cABXdjAAV4CwAFeOcABXlvAAV6KwAFem8ABXsbAAV7swAFfFcABX1LAAV9pwAFfh8ABX6nAAV/BwAFf5sABYATAAWBFwAFgdcABYJTAAWCqwAFgzcABYNLAAWDhwAFhAcABYRnAAWFIwAFhXcABYYvAAWGQwAFhlcABYanAAWG1wAFh68ABYgPAAWIuwAFiWsABYo7AAWK6wAFi0cABYtXAAWMMwAFjMMABY0PAAWN2wAFjlcABY6DAAWPEwAFj6sABZAPAAWQcwAFkQcABZF/AAWR5wAFkncABZLTAAWTXwAFk7cABZRDAAWUmwAFlTMABZWnAAWWIwAFlqMABZcbAAWXrwAFmB8ABZjDAAWZRwAFmhMABZpnAAWa1wAFm4MABZxXAAWcgwAFnV8ABZ3vAAWecwAFnqMABZ77AAWfnwAFoCMABaDbAAWhhwAFodcABaKjAAWjNwAFo1cABaOzAAWkNwAFpNMABaUTAAWlgwAFph8ABaZHAAWm6wAFp48ABae3AAWoGwAFqMcABakPAAWp7wAFqj8ABar/AAWr5wAFrJsABa1HAAWtgwAFrccABa6LAAWvAwAFr2sABbAbAAWwywAFsUcABbFfAAWyBwAFsn8ABbLfAAWzfwAFs6sABbQjAAW04wAFtSMABbVzAAW1iwAFtfcABbZXAAW3NwAFt38ABbgbAAW4swAFuTsABboDAAW6owAFuxcABbvnAAW8jwAFvQsABb2rAAW97wAFvscABb9HAAXADwAFwLsABcDTAAXBtwAFwh8ABcLfAAXDPwAFw/sABcTDAAXFFwAFxcMABcY3AAXGZwAFxuMABchjAAXI1wAFyjMABcqnAAXK1wAFzFcABczXAAXM7wAFzQ8ABc0zAAXNiwAFzZcABc2vAAXOJwAFzlcABc6vAAXOzwAFzvcABc8vAAXPZwAFz4cABc/DAAXP3wAF0CsABdBfAAXQfwAF0MsABdDnAAXQ9wAF0TsABdF3AAXRkwAF0eMABdH7AAXSGwAF0n8ABdLPAAXS7wAF0x8ABdMvAAXTTwAF038ABdPDAAXTzwAF1CsABdRHAAXUZwAF1KMABdTPAAXVFwAF1UsABdWjAAXV4wAF1jMABdZLAAXWdwAF1qsABdbLAAXW9wAF1yMABddDAAXXZwAF14sABdfLAAXX5wAF1/8ABdgjAAXYWwAF2HcABdiXAAXYqwAF2LMABdkfAAXZawAF2asABdn/AAXaPwAF2nsABdqrAAXa9wAF20MABdtHAAXbkwAF298ABdwHAAXcQwAF3H8ABdybAAXcuwAF3RcABd1LAAXdjwAF3csABd3vAAXeJwAF3m8ABd6jAAXeywAF3t8ABd8jAAXfawAF36sABd/vAAXgKwAF4GMABeB7AAXgwwAF4UMABeGjAAXh9wAF4ksABeJbAAXiewAF4s8ABeLjAAXi9wAF4zcABeN3AAXjnwAF4+sABeQDAAXlDwAF5bMABeZnAAXmewAF5r8ABecPAAXnNwAF53cABefDAAXoPwAF6FsABehzAAXorwAF6M8ABelzAAXphwAF6bcABenrAAXqGwAF6lsABeqDAAXqrwAF6u8ABesnAAXrbwAF67MABev/AAXsfwAF7McABe03AAXtbwAF7ZsABe4fAAXuRwAF7mMABe67AAXu9wAF74MABe/LAAXwIwAF8JMABfCzAAXw/wAF8UcABfFXAAXxbwAF8Z8ABfG7AAXx0wAF8fcABfI3AAXyXwAF8oMABfK7AAXy+wAF8zcABfNTAAXzhwAF898ABfPzAAX0RwAF9IsABfSbAAX0zwAF9PsABfVDAAX1hwAF9bsABfYDAAX2LwAF9msABfarAAX25wAF9ysABfeLAAX3rwAF+BcABfg3AAX4SwAF+KsABfkDAAX5HwAF+V8ABfmLAAX50wAF+hcABfpHAAX6mwAF+rcABfrjAAX7BwAF+ycABfuLAAX77wAF/AsABfwvAAX8hwAF/QsABf07AAX9ZwAF/asABf3bAAX+TwAF/nMABf6jAAX+6wAF/wsABf8rAAX/UwAF/3MABf+nAAX/8wAGAGMABgCfAAYAxwAGAP8ABgFHAAYBWwAGAXcABgGjAAYCNwAGAmsABgKfAAYCowAGArsABgLTAAYC9wAGAycABgM3AAYDRwAGA3MABgObAAYDywAGBBcABgQfAAYEJwAGBD8ABgRnAAYEdwAGBH8ABgSXAAYEnwAGBKcABgTHAAYE+wAGBQsABgU3AAYFRwAGBXcABgWfAAYFwwAGBfcABgYjAAYGZwAGBp8ABgbvAAYHHwAGB2MABgebAAYHywAGB98ABgfjAAYIYwAGCHcABgijAAYIrwAGCNMABgkTAAYJSwAGCX8ABgm3AAYJ2wAGCgcABgozAAYKXwAGCo8ABgqjAAYKswAGCssABgrfAAYLGwAGCycABgtLAAYLdwAGC7MABgvrAAYMGwAGDFMABgyfAAYMzwAGDQcABg03AAYNdwAGDZ8ABg3rAAYOGwAGDk8ABg57AAYOtwAGDwcABg9nAAYPtwAGEBsABhBjAAYQrwAGEQMABhEbAAYRNwAGET8ABhFLAAYRZwAGEYMABhGnAAYRywAGEjMABhI3AAYSUwAGEr8ABhLvAAYTJwAGE4MABhPHAAYT7wAGFCMABhQzAAYUbwAGFI8ABhSjAAYU7wAGFUMABhVvAAYVdwAGFaMABhYnAAYWWwAGFmMABhaLAAYWvwAGFucABhcTAAYXPwAGF2cABhevAAYX7wAGGAcABhgrAAYYWwAGGGMABhirAAYYzwAGGQMABhlHAAYZfwAGGf8ABhpTAAYahwAGGqMABhrPAAYbAwAGGzcABhuPAAYb1wAGHBMABhxnAAYcmwAGHKMABhznAAYc/wAGHQ8ABh0jAAYdNwAGHU8ABh1vAAYdywAGHdMABh3XAAYd3wAGHhsABh4/AAYegwAGHscABh73AAYfQwAGH1sABh9rAAYfdwAGH7cABh/bAAYgUwAGIKsABiE/AAYhuwAGIfcABiInAAYiWwAGIocABiKfAAYi9wAGI2MABiOnAAYj4wAGJBcABiQnAAYkPwAGJJcABiSrAAYkvwAGJN8ABiT/AAYlKwAGJVcABiV3AAYlwwAGJcsABiXrAAYmCwAGJkcABiaXAAYm1wAGJzcABidbAAYnpwAGJ7sABifLAAYn5wAGKA8ABihDAAYoZwAGKG8ABiiHAAYoowAGKOsABikbAAYpawAGKXcABimLAAYplwAGKZsABinDAAYpywAGKdMABioPAAYqWwAGKmMABiprAAYqcwAGKnsABiqDAAYqiwAGKpMABiqbAAYqnwAGKsMABirLAAYq5wAGKwMABis7AAYrpwAGK68ABivTAAYsDwAGLDcABiyTAAYsnwAGLK8ABizLAAYs3wAGLPMABi0DAAYtDwAGLSMABi1bAAYtZwAGLYcABi2fAAYtpwAGLbsABi3PAAYt1wAGLeMABi4XAAYuLwAGLjsABi5LAAYuZwAGLocABi6PAAYunwAGLrcABi7DAAYu1wAGLxcABi8zAAYvSwAGL2cABi97AAYviwAGL6sABi+3AAYv0wAGMB8ABjBDAAYwowAGMNMABjDvAAYw/wAGMRMABjEjAAYxNwAGMUsABjFbAAYxYwAGMWsABjG/AAYxzwAGMfcABjIfAAYySwAGMpMABjK7AAYy5wAGMwcABjMvAAYzVwAGM4MABjOvAAYzwwAGM+MABjQbAAY0MwAGNE8ABjR/AAY0mwAGNLMABjTzAAY0+wAGNWcABjWnAAY13wAGNjsABjZ3AAY21wAGNy8ABjerAAY4GwAGOF8ABjijAAY49wAGOVMABjmvAAY6IwAGOlMABjqDAAY6swAGOt8ABjsPAAY7NwAGO3MABjuzAAY73wAGPAsABjyPAAY8vwAGPM8ABjznAAY9UwAGPWcABj2PAAY9swAGPhsABj4nAAY+bwAGPocABj8TAAY/GwAGP18ABj/nAAZAYwAGQKsABkDvAAZBiwAGQfsABkIDAAZCiwAGQs8ABkMjAAZDVwAGQ38ABkPPAAZD3wAGRGMABkSzAAZE2wAGRQsABkVPAAZFiwAGRcMABkXjAAZGBwAGRq8ABkdfAAZHjwAGR8cABkfnAAZILwAGSG8ABkivAAZIzwAGSQcABkkjAAZJMwAGSasABknjAAZKvwAGS5cABkvvAAZMjwAGTM8ABk0PAAZNkwAGTccABk6rAAZOzwAGTysABk9XAAZPjwAGT8cABlALAAZQMwAGUGMABlB3AAZQgwAGUMcABlDTAAZQ7wAGURMABlFnAAZRzwAGUfsABlIrAAZScwAGUrsABlLvAAZTLwAGU2sABlOnAAZT8wAGVD8ABlSHAAZU2wAGVSMABlV7AAZV0wAGVisABlZ/AAZW4wAGVxcABldjAAZXjwAGV98ABlgPAAZYPwAGWF8ABliHAAZYswAGWOcABlj7AAZZLwAGWTsABll7AAZZrwAGWgcABlpDAAZaawAGWrsABlrnAAZbGwAGWz8ABlt3AAZbkwAGW88ABlv/AAZcHwAGXG8ABlyjAAZcvwAGXNMABl1bAAZdmwAGXacABl2/AAZd/wAGXhcABl4fAAZeZwAGXqsABl7vAAZfJwAGX1sABl+TAAZftwAGX/MABmAfAAZgcwAGYLsABmDXAAZhCwAGYTcABmF/AAZhuwAGYhsABmJvAAZimwAGYssABmL/AAZjQwAGY6MABmPDAAZkEwAGZGcABmSjAAZk0wAGZScABmVjAAZldwAGZY8ABmW7AAZl4wAGZosABmafAAZm4wAGZwcABmczAAZnUwAGZ3MABmeXAAZnuwAGZ98ABmgLAAZoLwAGaFcABmiXAAZoswAGaQMABmkrAAZpcwAGadcABmoLAAZqJwAGaksABmqPAAZqlwAGap8ABmqnAAZqrwAGarcABmq/AAZq4wAGavcABmsXAAZrQwAGa28ABmubAAZrxwAGa/MABmwPAAZsNwAGbE8ABmxnAAZsfwAGbJcABmyzAAZs0wAGbPMABm0XAAZtWwAGbZ8ABm2nAAZt6wAGbfMABm43AAZuPwAGbocABm6PAAZu1wAGbt8ABm8nAAZvLwAGb3sABm+DAAZviwAGb7sABm/nAAZwFwAGcEsABnB3AAZwowAGcOsABnEbAAZxbwAGcaMABnHzAAZyHwAGcksABnJ/AAZy8wAGczsABnNnAAZzrwAGc+8ABnQzAAZ0iwAGdOcABnU3AAZ1mwAGdgMABnZbAAZ2twAGdwcABndHAAZ3hwAGd8sABngHAAZ4MwAGeGcABniXAAZ4wwAGeQMABnlLAAZ5mwAGee8ABnpLAAZ6nwAGeyMABnuHAAZ7swAGe98ABnwnAAZ8fwAGfK8ABn0LAAZ9fwAGfdcABn4vAAZ+dwAGfsMABn8LAAZ/XwAGf7sABoAPAAaAPwAGgMMABoEPAAaBVwAGgZsABoH7AAaCTwAGgqMABoMbAAaDdwAGhAMABoQ3AAaEgwAGhLMABoTfAAaFHwAGhX8ABoXDAAaGCwAGhncABobTAAaHQwAGh7sABofbAAaIKwAGiDMABoiPAAaI6wAGiUcABomjAAaJ/wAGilsABoq3AAaLEwAGi28ABovLAAaMJwAGjIMABozfAAaNOwAGjZcABo3zAAaOTwAGjqsABo8HAAaPYwAGj78ABpAbAAaQdwAGkNMABpEvAAaRiwAGkecABpJDAAaSnwAGkvsABpNXAAaTswAGlA8ABpRrAAaUxwAGlSMABpV/AAaV2wAGljcABpaTAAaW7wAGl0sABpenAAaYAwAGmF8ABpi7AAaZFwAGmXMABpnPAAaaKwAGmocABprjAAabPwAGm5sABpv3AAacUwAGnK8ABp0LAAadZwAGncMABp4fAAaeewAGntcABp8zAAafjwAGn+sABqBHAAagowAGoP8ABqFbAAahtwAGohMABqJvAAaiywAGoycABqODAAaj3wAGpDsABqSXAAak8wAGpU8ABqWrAAamIwAGpmsABqbHAAanBwAGp2sABqezAAaoOwAGqKsABqj/AAapbwAGqd8ABqpDAAaqrwAGqu8ABqsvAAarnwAGrAMABqxDAAasgwAGrNMABq0TAAatUwAGrZMABq3TAAauFwAGrlcABq6XAAau1wAGrxcABq9XAAavlwAGr+sABrBHAAawowAGsQcABrFvAAaxrwAGshcABrKDAAayxwAGszcABrO/AAa0KwAGtJcABrTzAAa1UwAGta8ABrYXAAa2cwAGtvMABrdbAAa3mwAGt9sABrhzAAa49wAGuYMABrnjAAa6PwAGun8ABrrzAAa7MwAGu3MABrv/AAa8bwAGvQ8ABr1PAAa9jwAGvc8ABr4PAAa+bwAGvscABr8rAAa/gwAGv/sABsBLAAbAmwAGwOsABsE7AAbBiwAGwdsABsIrAAbCfwAGws8ABsMvAAbDlwAGw98ABsRbAAbEqwAGxO8ABsU/AAbFkwAGxecABsY7AAbGqwAGxzsABsebAAbIDwAGyGMABsjfAAbJMwAGyYcABsnfAAbKOwAGyqMABss7AAbLmwAGzEMABsxjAAbMgwAGzKMABszDAAbM4wAGzQMABs0jAAbNRwAGzWcABs2XAAbNzwAGzecABs4zAAbOUwAGzmcABs6HAAbOqwAGzs8ABs7zAAbPMwAGz5MABs/DAAbQBwAG0CsABtB3AAbQmwAG0L8ABtDnAAbREwAG0UsABtGzAAbR4wAG0lsABtKfAAbS5wAG0w8ABtNvAAbTpwAG0/MABtQjAAbUdwAG1K8ABtTjAAbVDwAG1XcABtXDAAbV8wAG1gcABtZjAAbWowAG1x8ABtd7AAbXxwAG1/cABthXAAbYlwAG2P8ABtlHAAbZiwAG2bMABtn7AAbaKwAG2jcABtrLAAbbRwAG25sABtvXAAbcWwAG3McABtzzAAbdPwAG3W8ABt2fAAbeBwAG3pcABt63AAbe5wAG3z8ABt9jAAbfcwAG36MABt/PAAbf7wAG4B8ABuBbAAbgkwAG4OcABuE/AAbhbwAG4ZcABuG/AAbh4wAG4hsABuInAAbiNwAG4r8ABuMLAAbjPwAG43cABuOLAAbjxwAG498ABuQfAAbkXwAG5J8ABuTfAAblHwAG5V8ABuWfAAbl3wAG5h8ABuZfAAbmnwAG5t8ABucfAAbnXwAG558ABuffAAboHwAG6F8ABuifAAbo3wAG6R8ABulfAAbpnwAG6d8ABuofAAbqXwAG6p8ABurfAAbrHwAG618ABuufAAbr3wAG7B8ABuxfAAbsnwAG7N8ABu0fAAbtXwAG7Z8ABu3fAAbuHwAG7l8ABu6fAAbu3wAG7x8ABu9fAAbvnwAG798ABvAfAAbwXwAG8J8ABvDfAAbxHwAG8V8ABvGfAAbx3wAG8h8ABvJfAAbynwAG8t8ABvMfAAbzXwAG858ABvPfAAb0HwAG9F8ABvSfAAb03wAG9R8ABvVfAAb1nwAG9d8ABvYfAAb2XwAG9p8ABvbfAAb3HwAG918ABvefAAb33wAG+B8ABvhfAAb4pwAG+QMABvlrAAb5fwAG+ZcABvnDAAb57wAG+i8ABvpnAAb6iwAG+r8ABvsHAAb7HwAG+0sABvujAAb8DwAG/DsABvxnAAb8pwAG/PsABv0fAAb9VwAG/X8ABv27AAb9+wAG/k8ABv6PAAb+4wAG/xcABv9fAAb/pwAG//MABwAvAAcAfwAHAKMABwDHAAcBBwAHAVsABwGPAAcB1wAHAfsABwIfAAcCQwAHAmsABwKLAAcCvwAHAuMABwMHAAcDKwAHA0MABwNXAAcDfwAHA6MABwPHAAcD6wAHBCMABwRPAAcEjwAHBLsABwT7AAcFLwAHBXcABwWvAAcF+wAHBjsABwZfAAcGlwAHBuMABwcfAAcHbwAHB4MABwerAAcH6wAHCD8ABwiXAAcJAwAHCT8ABwmPAAcJywAHChsABwpHAAcKhwAHCrcABwr7AAcLJwAHC2cABwufAAcL6wAHDCsABwx7AAcM3wAHDSsABw1PAAcNcwAHDe8ABw5DAAcOqwAHDwcABw93AAcPuwAHD+cABxAnAAcQTwAHEHMABxC3AAcRDwAHETMABxFXAAcRjwAHEccABxIjAAcSkwAHEtMABxMnAAcTlwAHFBsABxQ/AAcUYwAHFIcABxSrAAcUwwAHFOcABxUXAAcVWwAHFZ8ABxXLAAcV8wAHFi8ABxZXAAcWcwAHFo8ABxarAAcW2wAHFvcABxcfAAcXQwAHF2sABxeHAAcXowAHF9cABxgLAAcYPwAHGHMABxinAAcY2wAHGQMABxkrAAcZUwAHGXsABxm7AAcZ+wAHGjsABxp7AAcauwAHGtsABxrjAAca6wAHGvMABxr7AAcbAwAHGw8ABxsbAAcbJwAHGzcABxtTAAcbXwAHG2sABxt3AAcbgwAHG48ABxubAAcbswAHG9MABxwDAAcccwAHHKcABxzTAAcdDwAHHVsABx23AAcd3wAHHkcABx5/AAcetwAHHtMABx7zAAcfLwAHH0cABx/HAAcf/wAHIC8AByBnAAcg+wAHIQ8AByHnAAciAwAHIjMAByM7AAcjQwAHI8sAByQHAAckIwAHJIcABySbAAclNwAHJXcAByWPAAclqwAHJcMAByXjAAcmFwAHJi8AByaPAAcm3wAHJycABydzAAcnrwAHJ/MAByhbAAcoewAHKJ8AByjLAAcpHwAHKWMABymjAAcpzwAHKg8ABypHAAcqbwAHKrMABysDAAcrhwAHK98ABywnAAcsWwAHLIcAByyvAAcsxwAHLRMABy1DAActYwAHLZMABy3TAAct8wAHLfsABy4rAAcuZwAHLqcABy7PAAcvEwAHL0cABy+TAAcvvwAHL+8ABzALAAcwLwAHMGcABzCnAAcxFwAHMUsABzF/AAcxwwAHMfMABzIfAAcySwAHMocABzLvAAczOwAHM5MABzPXAAcz/wAHNFMABzSbAAc01wAHNO8ABzUTAAc1PwAHNWsABzWfAAc1vwAHNdsABzX3AAc2GwAHNmMABzarAAc27wAHNy8ABzdfAAc3mwAHN98ABzgPAAc4PwAHOHMABzjvAAc5VwAHOZcABznDAAc5/wAHOjcABzqHAAc68wAHOyMABztbAAc7rwAHO9MABzwHAAc8JwAHPEcABzxrAAc86wAHPVcABz2HAAc9owAHPcMABz3fAAc+IwAHPosABz6vAAc+1wAHPxMABz9DAAc/gwAHP+cABz/vAAdAIwAHQDsAB0CLAAdA4wAHQTcAB0FzAAdBxwAHQjMAB0KrAAdC/wAHQy8AB0NTAAdDmwAHQ+MAB0QnAAdEawAHRJcAB0TDAAdE7wAHRUcAB0VPAAdFkwAHRdcAB0ZDAAdG0wAHRxsAB0dfAAdHlwAHR7sAB0fbAAdH8wAHSA8AB0gnAAdIQwAHSEsAB0hTAAdIWwAHSGMAB0hrAAdIfwAHSKsAB0jfAAdJNwAHSVcAB0l3AAdJnwAHSccAB0nzAAdKMwAHSlsAB0p3AAdKiwAHSw8AB0u3AAdL+wAHTD8AB0xnAAdMlwAHTN8AB00bAAdNQwAHTXcAB02fAAdN0wAHTfMAB04fAAdOZwAHTrsAB07zAAdPNwAHT2sAB0+rAAdP7wAHUD8AB1B3AAdQuwAHUP8AB1FPAAdRjwAHUaMAB1HfAAdR5wAHUicAB1IvAAdSfwAHUocAB1LTAAdS2wAHUwMAB1MzAAdTYwAHU5sAB1PfAAdUJwAHVHcAB1S7AAdVCwAHVUsAB1WPAAdV4wAHVg8AB1ZDAAdWdwAHVrMAB1b7AAdXIwAHV1cAB1eLAAdXqwAHV8cAB1gTAAdYKwAHWGMAB1jLAAdZLwAHWYcAB1mnAAdZ8wAHWi8AB1pPAAdagwAHWp8AB1rHAAda5wAHWv8AB1sXAAdbPwAHW4sAB1u3AAdbzwAHW9sAB1wnAAdcawAHXLsAB1zHAAddOwAHXZcAB13XAAdeVwAHXosAB16nAAde1wAHXxsAB19LAAdfawAHX5cAB1/7AAdgMwAHYGMAB2CrAAdg+wAHYQsAB2GDAAdiAwAHYoMAB2LbAAdjUwAHY8MAB2RrAAdlAwAHZR8AB2UzAAdlfwAHZbsAB2YDAAdmIwAHZlsAB2aPAAdmowAHZtMAB2cDAAdnOwAHZ2MAB2d3AAdnswAHZ9cAB2gDAAdoEwAHaDsAB2hjAAdoewAHaKcAB2jjAAdpJwAHaVcAB2l/AAdpswAHaeMAB2o7AAdqZwAHapMAB2q7AAdq7wAHavcAB2tPAAdrWwAHa68AB2vLAAdr3wAHa/cAB2xbAAdsswAHbQ8AB21jAAdtlwAHbcsAB237AAduHwAHbksAB27nAAdvFwAHb48AB2+zAAdv9wAHcE8AB3DjAAdw9wAHcXMAB3GXAAdymwAHcsMAB3NTAAdzewAHdAsAB3QzAAd0wwAHdOcAB3VzAAd2JwAHdtcAB3drAAd4IwAHeFsAB3iXAAd44wAHePcAB3kDAAd5HwAHeUsAB3lbAAd5hwAHeaMAB3nPAAd57wAHef8AB3oTAAd6MwAHemcAB3qTAAd7BwAHeysAB3tTAAd7dwAHe6cAB3vTAAd7+wAHfC8AB3x7AAd8ywAHfPMAB31DAAd9WwAHfZMAB33vAAd+TwAHfoMAB36vAAd+7wAHfysAB3+bAAd/uwAHf+sAB4AzAAeAXwAHgH8AB4CfAAeAywAHgSsAB4FLAAeB7wAHghMAB4J7AAeC3wAHgxsAB4NHAAeDawAHg4cAB4OvAAeD8wAHhB8AB4RPAAeEewAHhP8AB4WHAAeGOwAHhoMAB4avAAeG9wAHhysAB4drAAeHnwAHh78AB4fTAAeH9wAHiDsAB4hzAAeI0wAHiRsAB4lnAAeJmwAHif8AB4o3AAeKXwAHincAB4qXAAeKuwAHi0cAB4unAAeMDwAHjGcAB4y7AAeNOwAHjYMAB43LAAeOSwAHjqsAB48HAAePLwAHj3sAB4/HAAeQCwAHkFMAB5CfAAeQ6wAHkTcAB5GDAAeRzwAHkg8AB5JzAAeSvwAHkxsAB5NnAAeTrwAHk+8AB5QPAAeUKwAHlEsAB5RfAAeUlwAHlMcAB5TnAAeVAwAHlSMAB5VnAAeVrwAHleMAB5YjAAeWWwAHlp8AB5bXAAeXFwAHl48AB5fPAAeX8wAHmAMAB5gfAAeYMwAHmFMAB5hnAAeYgwAHmNcAB5jzAAeZDwAHmU8AB5mPAAeZwwAHmg8AB5pnAAeatwAHmysAB5uPAAeb4wAHnBsAB5w7AAecTwAHnHsAB5yzA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AgNzwAIDicACA6LAAgOvwAIDwMACA8zAAgPbwAID3cACA+TAAgP0wAIEAMACBAXAAgQQwAIEIMACBCzAAgRMwAIEUsACBGPAAgR4wAIEiMACBJLAAgSfwAIEqcACBLDAAgS8wAIEwMACBNHAAgTdwAIE78ACBQDAAgUNwAIFIcACBS3AAgVAwAIFYMACBWvAAgV+wAIFhcACBY/AAgWowAIFvcACBdTAAgX4wAIGDMACBiXAAgYtwAIGM8ACBknAAgZNwAIGZsACBmvAAgZvwAIGmcACBrzAAgbGwAIGz8ACBuPAAgbzwAIG+sACBwnAAgcYwAIHJsACBynAAgc6wAIHPMACB0XAAgdOwAIHX8ACB2PAAgdswAIHgMACB4jAAgeUwAIHosACB6vAAgfCwAIH2cACB+fAAgf9wAIIEsACCBbAAgghwAIIKsACCDHAAgg7wAIIRMACCFXAAghgwAIIb8ACCHjAAgilwAIItcACCOjAAgj4wAIJCcACCR/AAgkpwAIJNcACCULAAglPwAIJX8ACCXvAAgmEwAIJiMACCZXAAgmbwAIJrcACCcHAAgnPwAIJ5MACCgrAAgojwAIKRcACCk3AAgpiwAIKccACCnXAAgp5wAIKfsACCozAAgqTwAIKpMACCrPAAgq7wAIKysACCs/AAgrXwAIK28ACCufAAgrxwAILFcACCyDAAgsvwAILPMACC0nAAgtUwAILYMACC27AAgt5wAILgsACC4rAAguTwAILn8ACC7bAAgvMwAIL2sACC+PAAgv5wAIMBsACDBXAAgwXwAIMMcACDD3AAgxRwAIMV8ACDGPAAgxnwAIMccACDHTAAgx3wAIMgMACDL3AAgzBwAIM0cACDNzAAgzowAIM9MACDQXAAg0QwAINGsACDSrAAg07wAINRMACDWHAAg1twAINgcACDZPAAg2gwAINrcACDcHAAg3IwAINz8ACDd3AAg3nwAIN9MACDfbAAg4DwAIODsACDh3AAg4kwAIONsACDk7AAg5RwAIOX8ACDmfAAg54wAIOj8ACDpjAAg63wAIOxsACDs/AAg7VwAIO3sACDuXAAg77wAIPDcACDxjAAg8twAIPOsACD0LAAg9JwAIPV8ACD2/AAg96wAIPfMACD4TAAg+WwAIPo8ACD6vAAg+wwAIPt8ACD8zAAg/dwAIP7sACD//AAhAOwAIQH8ACEDrAAhBSwAIQdMACEHvAAhCQwAIQnMACELHAAhDIwAIQ1cACEOPAAhDrwAIQ9sACEPvAAhEEwAIRGcACESjAAhE6wAIRR8ACEVTAAhFiwAIRdMACEX/AAhGEwAIRjMACEY/AAhGTwAIRm8ACEaTAAhGpwAIRtcACEbzAAhHCwAIRycACEczAAhHXwAIR3cACEePAAhHlwAIR58ACEerAAhHtwAIR8MACEf/AAhIIwAISEMACEhTAAhIWwAISIsACEivAAhIuwAISPMACEkrAAhJQwAISXsACEmDAAhJswAISccACEnPAAhKlwAIS1cACEv/AAhMowAITV8ACE47AAhOwwAITt8ACE7rAAhPFwAIT0sACE+HAAhPkwAIT6sACE+7AAhP1wAIT+sACE//AAhQEwAIUCcACFA7AAhQTwAIUGMACFCTAAhQqwAIUOMACFD7AAhRLwAIUVcACFGXAAhR2wAIUk8ACFKfAAhTFwAIU28ACFPjAAhUYwAIVL8ACFVDAAhV2wAIVj8ACFabAAhXFwAIV4sACFfzAAhYKwAIWGMACFivAAhZDwAIWW8ACFmfAAhZ9wAIWgsACFonAAhaPwAIWpsACFr7AAhbpwAIXBMACFzPAAhdQwAIXesACF6LAAhe+wAIX6cACGBjAAhg6wAIYWsACGIfAAhiswAIY1sACGOvAAhkAwAIZG8ACGTvAAhlbwAIZbsACGYzAAhmXwAIZosACGa3AAhm4wAIZxsACGdHAAhndwAIZ5MACGe3AAhn0wAIZ+MACGgnAAhoTwAIaHcACGifAAhowwAIaPsACGkbAAhpYwAIaacACGnTAAhqNwAIamcACGq3AAhrJwAIa6MACGwfAAhskwAIbK8ACGzXAAhs/wAIbR8ACG13AAht5wAIbmsACG7bAAhvRwAIb58ACHAXAAhwTwAIcL8ACHE7AAhxcwAIcgMACHIjAAhyxwAIc08ACHOfAAh0NwAIdK8ACHS3AAh01wAIdUMACHWXAAh1/wAIdlcACHbfAAh3OwAId3cACHf7AAh4VwAIeNcACHk/AAh5cwAIegMACHqDAAh6owAIetcACHr7AAh7JwAIe0cACHuLAAh7twAIe+sACHw3AAh8cwAIfKMACHyzAAh87wAIfS8ACH1nAAh9qwAIfdsACH4DAAh+EwAIfjsACH5XAAh+bwAIfosACH6bAAh+twAIftcACH7jAAh/FwAIfzsACH9TAAh/gwAIf68ACH//AAiALwAIgFcACICHAAiAnwAIgMMACIDrAAiBCwAIgTMACIFfAAiBgwAIgZ8ACIG7AAiB6wAIgh8ACIJTAAiCVwAIgoMACILDAAiCxwAIgvsACIMvAAiDQwAIg3MACIObAAiDxwAIg+8ACIP3AAiD/wAIhDMACIRTAAiEYwAIhHsACISfAAiEswAIhLcACIT7AAiFRwAIhZcACIW/AAiFzwAIhhMACIY7AAiGewAIhpMACIarAAiHMwAIh2MACIePAAiHywAIh98ACIfzAAiIHwAIiEsACIh3AAiIowAIiNcACIkrAAiJPwAIiVMACImLAAiJ1wAIiecACIo7AAiKbwAIipcACIq/AAiKzwAIiyMACItLAAiLcwAIi6sACIwbAAiMiwAIjM8ACIzvAAiNDwAIjVsACI1zAAiNiwAIjdMACI3zAAiOEwAIjmsACI6HAAiOiwAIjqsACI7PAAiO1wAIjt8ACI8HAAiPIwAIjzsACI9TAAiPjwAIj88ACJAPAAiQTwAIkIsACJCvAAiQ0wAIkN8ACJDrAAiRBwAIkTcACJFLAAiRXwAIkacACJG/AAiSIwAIkk8ACJJzAAiSkwAIksMACJL7AAiTJwAIkzcACJNHAAiTjwAIk6sACJPPAAiUAwAIlC8ACJRXAAiUXwAIlLcACJTfAAiVOwAIlVcACJVzAAiVmwAIlccACJXzAAiWCwAIlhMACJYbAAiWMwAIllMACJZ3AAiWkwAIlpcACJarAAiWxwAIlucACJcPAAiXRwAIl1sACJd7AAiXowAIl+cACJf7AAiYEwAImCcACJhDAAiYXwAImHsACJjnAAiY+wAImRcACJk3AAiZUwAImYcACJmrAAiZywAImfcACJobAAiaPwAImm8ACJqjAAiazwAImxMACJtXAAibbwAIm4sACJvHAAib8wAInBcACJxDAAichwAInLMACJzvAAidJwAInUsACJ1zAAidpwAInccACJ3zAAieEwAInn8ACJ6jAAieywAInu8ACJ8DAAifKwAIn0sACJ9vAAifnwAIn8MACJ/nAAigCwAIoCcACKBfAAigfwAIoKsACKC/AAig5wAIoPcACKEbAAihPwAIoWcACKGXAAihwwAIofMACKIjA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Al6jwAJex8ACXuLAAl8UwAJfK8ACX0TAAl9iwAJfeMACX57AAl+wwAJfycACX+PAAl/9wAJgE8ACYDDAAmBIwAJgb8ACYIPAAmCewAJgusACYRHAAmEpwAJhPcACYVTAAmFkwAJhqMACYgTAAmIQwAJiI8ACYkjAAmKSwAJi58ACYwjAAmMpwAJjUcACY3XAAmOkwAJj4sACZALAAmQewAJkM8ACZEnAAmR1wAJkusACZMzAAmTgwAJk+cACZQjAAmVFwAJlZsACZXHAAmWDwAJlmMACZcHAAmYTwAJmJMACZkLAAmZawAJmdcACZpfAAmauwAJmwcACZtbAAmbswAJnJ8ACZznAAmdNwAJnZsACZ4PAAmepwAJnxsACZ9/AAmf/wAJoH8ACaGrAAmicwAJouMACaOLAAmkFwAJpJsACaU7AAmlvwAJpjMACabDAAmnMwAJqEcACainAAmpBwAJqYMACaofAAmqywAJq1cACavTAAmsOwAJrMcACa0fAAmtWwAJrc8ACa4zAAmvVwAJr+cACbA7AAmwqwAJsT8ACbIHAAmyiwAJsv8ACbN3AAm0mwAJte8ACbZXAAm22wAJtzsACbffAAm4LwAJuG8ACbjHAAm5vwAJup8ACbrnAAm7SwAJu5cACbybAAm9LwAJvWsACb3DAAm+MwAJvvMACcBHAAnApwAJwPcACcGLAAnB+wAJwn8ACcLfAAnDLwAJw6sACcRbAAnE7wAJxY8ACcYfAAnGhwAJxtsACceTAAnH1wAJyAsACciTAAnIywAJyPMACcmrAAnKmwAJy0MACcvjAAnMpwAJzXMACc3nAAnOowAJz3sACc/3AAnQkwAJ0QsACdF3AAnR/wAJ0oMACdMPAAnTgwAJ1BMACdTfAAnWTwAJ1ssACdeHAAnYMwAJ2PMACdlPAAnagwAJ20sACduXAAnb/wAJ3HsACd13AAneHwAJ3osACd7nAAnfZwAJ4KsACeEbAAnhewAJ4dMACeJnAAniuwAJ4z8ACeOzAAnkGwAJ5eMACeY7AAnmgwAJ5wsACeevAAnoJwAJ6I8ACekDAAnpvwAJ6oMACernAAnrZwAJ67sACeyfAAntTwAJ7ZMACe3zAAnujwAJ738ACfAzAAnwvwAJ8TsACfGHAAnycwAJ8vMACfMvAAnzhwAJ8/sACfSjAAn1BwAJ9VsACfWrAAn2MwAJ9rMACfcrAAn3kwAJ+D8ACfk3AAn50wAJ+l8ACfrfAAn7vwAJ/C8ACfyPAAn87wAJ/bMACf4DAAn+QwAJ/oMACf77AAn/YwAJ/7sACgAbAAoA3wAKAS8ACgFvAAoB5wAKAk8ACgKnAAoC5wAKA2MACgQ/AAoEqwAKBQcACgWDAAoGGwAKBpMACgcbAAoHkwAKCA8ACgjrAAoJVwAKCbMACgovAAoKxwAKCz8ACgvHAAoMPwAKDKcACg1bAAoOKwAKDoMACg7LAAoPWwAKEFsAChDbAAoRSwAKEb8AChJjAAoSwwAKE1cAChPbAAoUVwAKFN8AChVLAAoVpwAKFgcAChaDAAoXCwAKF3cAChfTAAoYYwAKGNsAChlbAAoZywAKGjcAChrPAAobcwAKG88AChwXAAocjwAKHQcACh2rAAoeXwAKHscACh9LAAofewAKH/sACiA3AAog0wAKIe8ACiJ7AAoi9wAKI2cACiPHAAokUwAKJKMACiTfAAolSwAKJYcACiYjAAomtwAKJuMACicrAAonfwAKJ+8ACigzAAoocwAKKNMACilfAAoqkwAKK2sACivnAAosfwAKLOsACi1jAAotvwAKLgsACi5DAAoupwAKLwcACi9bAAovywAKMA8ACjBTAAowiwAKML8ACjEPAAoxawAKMe8ACjI7AAoyjwAKMvcACjM3AAozZwAKM7MACjQLAAo0hwAKNM8ACjUHAAo1cwAKNh8ACjZ7AAo2xwAKNxsACjebAAo4WwAKOL8ACjkvAAo5jwAKOfsACjqjAAo6/wAKO0sACjuXAAo78wAKPFcACjyjAAo9CwAKPWsACj4LAAo/GwAKP2sACj+rAAo/7wAKQF8ACkEPAApBbwAKQb8ACkIPAApCtwAKQvcACkM7AApDlwAKQ/8ACkSnAApE/wAKRUcACkWjAApGLwAKRnsACka3AApHGwAKR3sACkfPAApINwAKSKcACkkLAApJ2wAKSi8ACkqfAApK9wAKSysACktzAApL1wAKTCsACkx/AApMwwAKTSMACk17AApODwAKTlcACk6PAApO6wAKTz8ACk+rAApP7wAKUCMAClBzAApQ/wAKUT8AClFvAApRtwAKUfMAClIvAApSWwAKUqMAClMTAApT5wAKVUsAClWrAApV+wAKVo8AClenAApYKwAKWMsACllPAApaSwAKWr8ACltPAApbwwAKXMcACl0rAApdqwAKXl8ACl+vAApgUwAKYOcACmEzAAph7wAKYt8ACmMbAApjcwAKY9cACmS/AAplEwAKZVcACmW7AApn2wAKaC8ACmifAApo8wAKadMACmoXAApqSwAKansACmrnAApr0wAKbC8ACmx7AAps2wAKbScACm4LAApuRwAKbp8ACm7fAApvtwAKb+cACnAzAApwbwAKcUMACnFvAApxtwAKckMACnLrAApzpwAKdCMACnS7AAp1OwAKddMACnZ3AAp25wAKd3MACnf7AAp4mwAKeZMACnoLAAp6nwAKe18ACnxLAAp8+wAKfZsACn3fAAp+iwAKfxsACn9PAAp/nwAKgBsACoC7AAqB7wAKglsACoLjAAqDkwAKhFMACoVzAAqGEwAKhsMACod/AAqHvwAKiGMACoiTAAqI3wAKiVcACon3AAqKiwAKivMACot3AAqL4wAKjHcACo2bAAqN9wAKjm8ACo6zAAqPWwAKkNsACpEPAAqRXwAKkccACpKDAAqS2wAKk08ACpObAAqUSwAKlIcACpTfAAqVRwAKldMACpYvAAqWhwAKls8ACpdjAAqYGwAKmJ8ACpkTAAqZWwAKmjcACppvAAqarwAKmwMACpt7AAqcXwAKnOsACp1TAAqd1wAKnlcACp7LAAqfOwAKn5sACp/jAArO0wAKzwsACs9fAArPqwAK0fcACtIzAArSiwAK0vsACtOjAArUAwAK1F8ACtUPAArVWwAK1hsACtavAArXMwAK2XcACtnPAAraFwAK2/MACtxPAArcmwAK3tcACt83AArfhwAK4VcACuGXAArhxwAK4lsACuKrAAri6wAK448ACuRnAArmFwAK5qsACudbAArn8wAK6NsACukvAArptwAK6lsACuqvAArrowAK7H8ACuzDAArtIwAK7V8ACu47AArutwAK7uMACu8rAArvqwAK8EcACvFjAArx0wAK8jMACvKHAArzOwAK9CcACvVnAAr2CwAK9p8ACvcrAAr3uwAK+HcACvj3AAr5ZwAK+iMACvs/AAr76wAK/IcACv0HAAr91wAK/ksACv8LAAr/uwALADcACwELAAsBdwALAf8ACwJnAAsDUwALA6sACwQfAAsElwALBTcACwW/AAsGJwALBo8ACwcTAAsHgwALCDsACwibAAsJEwALCY8ACwoDAAsLcwALDCcACwyLAAsM+wALDXsACw3fAAsOhwALDtsACw8nAAsPlwALEA8ACxETAAsRewALEg8ACxKTAAsTTwALFDMACxTLAAsVdwALFj8ACxaXAAsW/wALF0cACxd/AAsX0wALGGsACxi/AAsZAwALGVsACxm7AAsaSwALGwsACxuLAAscJwALHLMACx3XAAseUwALHt8ACx93AAsgEwALIPMACyF/AAsiJwALIo8ACyOvAAskBwALJGsACyTfAAslLwALJbsACyX7AAsmKwALJl8ACybzAAsn1wALKFsACyjPAAspNwALKd8ACyqrAAsrQwALK8sACyxTAAstewALLfMACy57AAsvDwALL6cACzCDAAsxCwALMa8ACzIbAAsy+wALM+cACzRDAAs0uwALNRMACzXfAAs2twALNv8ACzdjAAs3wwALOJcACzl3AAs5xwALOjMACzqLAAs7ewALO8MACzwnAAs8cwALPVcACz2TAAs96wALPlMACz7nAAs/gwALP9sAC0AjAAtAbwALQN8AC0HjAAtCcwALQtMAC0MjAAtDewALQ8MAC0SjAAtE2wALRS8AC0WjAAtG8wALR1cAC0erAAtH9wALSLMAC0mjAAtJ3wALSjcAC0qbAAtLgwALS9cAC0wbAAtMnwALTYMAC033AAtOhwALTu8AC0+TAAtP6wALUDMAC1CjAAtRcwALUdMAC1JPAAtSywALU1MAC1PHAAtUPwALVNMAC1VbAAtV5wALVl8AC1bzAAtXmwALX5sAC2AzAAtguwALYXsAC2UrAAtl2wALZnsAC2cbAAtvtwALcEcAC3DHAAtxfwALdcsAC3ZzAAt3CwALd4sAC3hzAAt5cwALeeMAC3pvAAt68wALe6sAC3wfAAt8gwALfPMAC32HAAt+rwALfzMAC3+nAAuAIwALgL8AC4FvAAuB+wALgqMAC4L3AAuDOwALg8MAC4SzAAuGswALhysAC4eTAAuIAwALiFsAC4nnAAuKLwALimcAC4r7AAuL2wALjF8AC4z/AAuNmwALjkMAC47PAAuPdwALkB8AC5C7AAuRUwALkdsAC5JzAAuTNwALk78AC5Q3AAuUuwALlYsAC5X/AAuWYwALlxcAC5ejAAuYRwALmQcAC5nTAAuauwALm3cAC5xPAAuc0wALnU8AC52nA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Ayg8wAMoTMADKGHAAyhtwAModcADKIjAAyiawAMoqcADKL/AAyjOwAMo48ADKO7AAykAwAMpGcADKTvAAylQwAMpYcADKX7AAymjwAMpvMADKdHAAynvwAMqMMADKn/AAyqZwAMqusADKtjAAysNwAMrJ8ADKz3AAytdwAMrgsADK57AAyu2wAMr0MADLALAAywYwAMsKsADLEbAAyxowAMsgMADLJTAAyyzwAMs5cADLQDAAy0XwAMtOMADLVrAAy13wAMtkMADLazAAy3owAMuAMADLhTAAy4ywAMua8ADLoXAAy6bwAMurMADLtfAAy7kwAMu+MADLwzAAy84wAMvSMADL1/AAy9wwAMvlMADL6HAAy+1wAMvwMADMAbAAzBPwAMwVsADMGTAAzCKwAMwvcADMVzAAzF+wAMxnMADMcnAAzHrwAMyGsADMjjAAzJSwAMydMADMqfAAzLFwAMy38ADMwbAAzMowAMzXMADM3rAAzOUwAMzs8ADM97AAzP5wAM0G8ADNDnAAzRzwAM0jcADNKfAAzTIwAM05cADNQ3AAzUmwAM1O8ADNV7AAzW0wAM108ADNe7AAzYEwAM2LMADNofAAzarwAM2y8ADNubAAzcMwAM3Z8ADN4nAAzenwAM3zMADOCTAAzhFwAM4YsADOHvAAzigwAM49cADORbAAzkzwAM5WsADOXHAAzmhwAM5tMADOcPAAznZwAM568ADOfnAAzo8wAM6RsADOlvAAzpswAM6gcADOqnAAzq6wAM60sADOuDAAzsawAM7VsADO2DAAztxwAM7jcADO6zAAzvEwAM748ADO/rAAzw2wAM8eMADPIvAAzyawAM8r8ADPNDAAz0cwAM9OcADPVLAAz1rwAM9ecADPZrAAz2kwAM9tcADPcTAAz35wAM+LMADPjfAAz5JwAM+X8ADPo3AAz7awAM+7MADPwXAAz8iwAM/QcADP1rAAz96wAM/k8ADP97AAz/zwANABMADQBjAA0BjwANApsADQLbAA0DCwANA2cADQOfAA0ETwANBOsADQUTAA0FVwANBZsADQZDAA0GdwANBpsADQbTAA0HIwANB4cADQfHAA0IIwANCK8ADQnnAA0KYwANCvsADQtrAA0MGwANDHsADQz3AA0NXwANDdsADQ4zAA0OpwANDxcADQ+bAA0P6wANEEsADRCbAA0Q6wANEesADRKrAA0S6wANE0cADRPHAA0UXwANFM8ADRUrAA0VtwANFjcADRb/AA0YcwANGOMADRlfAA0Z6wANGm8ADRuPAA0b+wANHG8ADR0PAA0dnwANHgMADR8bAA0fzwANICMADSCTAA0g9wANIbsADSIPAA0idwANIucADSNvAA0kGwANJSsADSWjAA0mNwANJqMADSd3AA0oewANKNcADSlPAA0p0wANKpcADSsLAA0rbwANK+sADSyzAA0tvwANLncADS8fAA0v7wANMN8ADTGfAA0yTwANMs8ADTObAA00mwANNQsADTV/AA02CwANNlcADTcHAA03QwANN5cADTfvAA04VwANOP8ADTlXAA05rwANOiMADTqjAA07XwANO88ADTxbAA08xwANPacADT4DAA0+UwANPssADT8XAA0/UwANP8MADUAjAA1AewANQMMADUFLAA1CDwANQocADUMbAA1DtwANRO8ADUV7AA1GIwANRnsADUbjAA1HKwANR2MADUenAA1IZwANSJsADUkDAA1JUwANSdsADUqjAA1LGwANS68ADUxDAA1MpwANTs8ADU8jAA1PZwANT9cADVIHAA1SZwANUrcADVL7AA1TOwANU28ADVO/AA1UDwANVDsADVR7AA1U1wANVRsADVX3AA1WWwANVo8ADVbfAA1XUwANWCcADViLAA1ZBwANWYcADVoPAA1afwANWvcADVuLAA1b3wANXFMADVzbAA1dHwANXX8ADV3HAA1eLwANXmcADV67AA1fDwANX5sADWD3AA1hOwANYYcADWHnAA1iOwANYs8ADWMTAA1jcwANY98ADWR3AA1k0wANZTMADWWrAA1l8wANZycADWdfAA1nswANaDsADWjrAA1pYwANacsADWpbAA1rCwANa68ADWzfAA1tcwANbfcADW6LAA1u/wANb5sADW//AA1wUwANcKsADXEfAA1xuwANch8ADXJzAA1yywANcz8ADXPbAA10PwANdJMADXTrAA11iwANdqcADXc3AA13twANeBMADXivAA14+wANeWMADXnLAA16ewANetMADXsbAA17XwANe9sADXyvAA19GwANfXcADX3bAA1+kwANfucADX9LAA1/uwANgFMADYDLAA2BUwANgfcADYJrAA2DZwANhEsADYSvAA2FLwANhaMADYZXAA2G7wANh1MADYfTAA2IGwANiHsADYizAA2JBwANiZcADYqDAA2LAwANi3MADYv7AA2MSwANjNsADY0bAA2NfwANjdsADY5HAA2PEwANj28ADZATAA2QiwANkTcADZHvAA2SiwANkxcADZOHAA2T4wANlNcADZUjAA2VXwANldMADZYzAA2XNwANl+cADZg3AA2YdwANmMcADZlvAA2auwANmvsADZtXAA2blwANnIsADZzXAA2dBwANnVMADZ3DAA2ePwANnp8ADZ7vAA2fZwANn/MADaDDAA2hQwANob8ADaIrAA2ifwANozsADaP/AA2kQwANpKMADaTzAA2lTwANpY8ADaW/AA2l+wANpkMADaafAA2m1wANpv8ADadzAA2n9wANqFsADaivAA2pJwANqfcADapfAA2q4wANq38ADawXAA2sowANrR8ADa2jAA2uSwANrr8ADa9HAA2v1wANsFMADbEPAA2xewANsgMADbKPAA2zpwANtCMADbSvAA21RwANtY8ADbY3AA221wANtw8ADbdjAA23uwANuGsADbizAA25JwANuYsADbnTAA26XwANupcADbrzAA27RwANu7cADb2TAA2+RwANvqcADb8TAA2/jwANv+sADcBXAA3AowANwN8ADcEfAA3BdwANwhcADcJfAA3ClwANwzcADcRLAA3E2wANxVsADcWnAA3FwwANxf8ADcYrAA3GlwANxzcADceTAA3H3wANyC8ADciTAA3JBwANyUsADcmfAA3KDwANymsADcsjAA3LbwANy+sADcxTAA3MuwANzYsADc3jAA3OKwANzpcADc7rAA3PLwANz3MADc/TAA3QNwAN0HsADdDPAA3REwAN0ZcADdHvAA3SYwAN0scADdOLAA3UUwAN1QcADdWrAA3WdwAN1xsADdfXAA3YgwAN2McADdmDAA3ZtwAN2gcADdpLAA3axwAN3AsADdw/AA3cjwAN3NcADd2fAA3d1wAN3h8ADd5zAA3fIwAN4D8ADeKjAA3jQwAN49MADeQnAA3k7wAN5cMADeYHAA3mZwAN5rsADef7AA3oPwAN6J8ADejzAA3p0wAN6hcADepvAA3qzwAN6v8ADesLAA3rqwAN69cADex3AA3tPwAN7a8ADe5rAA3uzwAN7wsADe+XAA3vuwAN79cADe/fAA3wEwAN8D8ADfCXAA3xPwAN8fMADfIrAA3z/wAN9IMADfWrAA32WwAN95cADfezAA34hwAN+YcADfonAA36ZwAN+s8ADftjAA37dwAN+48ADfvzAA38WwAN/QsADf03AA39ewAN/jsADf7rAA3/iwAOAHMADgFfAA4B2wAOArsADgNnAA4DywAOBHcADgVLAA4FqwAOBhMADgYjAA4GcwAOBn8ADgdHAA4H8wAOCKcADgqDAA4LLwAOC7sADgw3AA4MqwAODMMADg1LAA4N4wAODnsADg7rAA4PcwAOD9MADhBXAA4QswAOETcADhGTAA4SLwAOEqcADhM/AA4UAwAOFJMADhVLAA4VlwAOFj8ADhbPAA4W6wAOF5MADhhHAA4YfwAOGWsADhnzAA4atwAOG18ADhuvAA4cBwAOHIsADhz3AA4dqwAOHjsADh7nAA4fMwAOH6sADh/7AA4gDwAOIJcADiEHAA4hjwAOIfsADiLDAA4jOwAOI6cADiPbAA4kSwAOJKsADiTHAA4k3wAOJcMADia/AA4nHwAOJ7MADiffAA4omwAOKO8ADikvAA4pxwAOKhcADir3AA4rowAOK98ADixfAA4sdwAOLIsADiyfAA4sswAOLPcADi0/AA4tTwAOLYsADi2bAA4tqwAOLcsADi37AA4uJwAOLlsADi6XAA4uzwAOL28ADi/nAA4wmwAOMMcADjF3AA4yAwAOMpMADjMzAA4zlwAONFsADjTbAA41cwAONhMADjaLAA42nwAONq8ADjcTAA43owAOOBsADjh/AA45DwAOOaMADjn3AA46awAOOxsADjt7AA48DwAOPIMADj0zAA49kwAOPhMADj5LAA4+qwAOP1MADj+PAA5APwAOQPsADkE/AA5B0wAOQj8ADkLTAA5DPwAOQ+cADkRDAA5E9wAORVMADkX/AA5GgwAORrcADkcnAA5HXwAOR+MADkhrAA5JAwAOSQsADkmnAA5KKwAOSq8ADksnAA5LowAOTCsADky3AA5NNwAOTbsADk4vAA5OdwAOTucADk9XAA5PwwAOUAsADlBzAA5Q2wAOUWMADlGvAA5SGwAOUucADlObAA5TvwAOVAsADlSHAA5UswAOVNcADlUvAA5VmwAOVmMADlbnAA5XuwAOWJMADlljAA5Z4wAOWjcADlpvAA5bGwAOW2MADlv7AA5cUwAOXQ8ADl2fAA5eHwAOYDMADmC3AA5iYwAOYusADmT3AA5lXwAOZxsADmeTAA5nswAOaBMADmirAA5o3wAOaTMADmn/AA5qowAOa0sADmubAA5sbwAObXMADm5bAA5utwAObycADm9zAA5v2wAOcCsADnDXAA5xewAOcjsADnK/AA5y8wAOc3MADnPvAA50IwAOdHMADnT7AA515wAOdnMADnbDAA53XwAOd9sADngHAA54XwAOeN8ADnlrAA56KwAOeu8ADn9jAA6B/wAOgtcADoWnAA6GXwAOhu8ADodPAA6LLwAOi/8ADo47AA6O1wAOj3cADpAjAA6Q2wAOkTcADpGzAA6SCwAOkqsADpL7AA6TfwAOk+8ADpRLAA6UvwAOlU8ADpYPAA6WZwAOln8ADpcvAA6X1wAOmHMADpj7AA6ZjwAOmcsADppnAA6bOwAOm8MADpxrAA6cwwAOnV8ADp2PAA6eWwAOnsMADp8/AA6f1wAOn/8ADqCnAA6g3wAOoX8ADqHfAA6ikwAOorcADqL3AA6jrwAOpGcADqTnAA6lcwAOpecADqYXAA6mnwAOpxsADqdvAA6oHwAOqLMADqjXAA6pOwAOqhsADqpfAA6rIwAOq08ADqxDAA6suwAOrTcADq3/AA6uawAOrrMADq9DAA6wmwAOsSsADrOnAA60RwAOtJsADrTvAA61jwAOteMADrZTAA62nwAOt0cADre3AA633wAOuH8ADrjHAA65fwAOuZcADrnbAA66OwAOuvsADrtnAA68OwAOvLsADr0/AA69vwAOvjMADr6PAA6+6wAOv0sADr+jAA7AKwAOwLMADsEzAA7BRwAOwYsADsHvAA7B+wAOwu8ADsNvAA7D5wAOxIsADsTnAA7FiwAOxjcADsazAA7HUwAOyAMADsifAA7JTwAOyb8ADspfAA7K6wAOy3sADsvTAA7MDwAOzIsADszzAA7NfwAOzfcADs6HAA7OywAOz0cADs/fAA7QFwAO0F8ADtDfAA7RCwAO0ZMADtIbAA7SRwAO0tsADtMTAA7TrwAO09sADtRjAA7UvwAO1T8ADtXPAA7WHwAO1s8ADtdfAA7X/wAO2H8ADtkfAA7ZrwAO2k8ADtrjAA7bbwAO2+8ADtv7AA7cnwAO3ZMADt5LAA7fUwAO4AMADuCTAA7g8wAO4Z8ADuKbAA7jRwAO47cADuRnAA7k2wAO5VcADuXXAA7mdwAO5usADucjAA7nywAO6JMADujDAA7pXwAO6XsADumzAA7qSwAO6scADurbAA7q6wAO61MADuuvAA7sGwAO7KMADuzbAA7s+wAO7ZcADu5DAA7vIwAO72cADvAbAA7xAwAO8ZsADvIPAA7yhwAO8x8ADvO7AA70OwAO9JcADvUHAA71UwAO9c8ADvYTAA72YwAO9rcADvc/AA73iwAO+CsADvi/AA75ewAO+b8ADvqXAA77IwAO+6MADvwvAA78rwAO/TsADv27AA7+cwAO/xMADv97AA7/+wAPAG8ADwEDAA8BTwAPAfcADwLHAA8DiwAPA8MADwQnAA8EmwAPBRMADwU/AA8FWwAPBdMADwZPAA8GhwAPBqMADwcrAA8HTwAPB48ADwgzAA8I5wAPCU8ADwl/AA8J3wAPCgsADwqXAA8KpwAPC1sADwvXAA8MSwAPDJMADw0DAA8NMwAPDWMADw4bAA8OWwAPDr8ADw9DAA8PVwAPD8cADxBHAA8QmwAPENcADxFTAA8RgwAPEh8ADxJfAA8TOwAPE6MADxPvAA8U0wAPFVsADxYjAA8W0wAPGD8ADxkXAA8ZgwAPGasADxnLAA8Z+wAPGjMADxpvAA8a5wAPGzcADxtbAA8bewAPG7cADxwPAA8cXwAPHI8ADxy/AA8dDwAPHTcADx1fAA8dkwAPHc8ADx4nAA8eewAPHn8ADx6bAA8ewwAPHuMADx73AA8fEwAPHyMADx9TAA8fkwAPH8cADyADAA8gUwAPIHcADyCjAA8gywAPIQ8ADyEvAA8howAPIdsADyIjAA8iawAPItMADyLnAA8i+wAPIycADyOPAA8j8wAPJDsADySPAA8k8wAPJTMADyVPAA8lfwAPJbcADyXnAA8mEwAPJmsADyabAA8m2wAPJyMADydLAA8nYwAPJ3sADyfDAA8n6wAPKCMADyh3AA8o0wAPKQMADykzAA8pgwAPKeMADyovAA8qawAPKqMADyrjAA8rEwAPK3cADyvDAA8sQwAPLI8ADyzbAA8tIwAPLXcADy3fAA8uEwAPLn8ADy6vAA8u9wAPL18ADy9/AA8v1wAPMEsADzB/AA8w6wAPMV8ADzGPAA8x5wAPMm8ADzLPAA8zVwAPM48ADzPnAA80ewAPNJMADzTTAA81DwAPNVMADzVzA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BBbIwAQW2sAEFunABBb7wAQXA8AEFxnABBcpwAQXNcAEF0fABBdYwAQXZ8AEF3TABBeGwAQXjcAEF5bABBerwAQXxMAEF83ABBfgwAQX6sAEF/PABBgAwAQYEcAEGBzABBgowAQYNMAEGD/ABBhQwAQYaMAEGHfABBiAwAQYj8AEGJ/ABBi2wAQYy8AEGNXABBjgwAQY78AEGPvABBkFwAQZEcAEGSDABBkxwAQZPMAEGU3ABBlgwAQZbcAEGYDABBmRwAQZnMAEGazABBnDwAQZ2MAEGefABBn1wAQaB8AEGhfABBogwAQaL8AEGjzABBpPwAQabMAEGnDABBqXwAQapsAEGrDABBq8wAQa1cAEGufABBrwwAQa9sAEGwXABBsQwAQbJcAEG0PABBtUwAQbYcAEG3TABBuAwAQbm8AEG6rABBu3wAQbxcAEG9bABBvhwAQb/sAEHA7ABBwYwAQcKcAEHDvABBxSwAQcYsAEHGzABBxvwAQcecAEHIPABByPwAQcocAEHK7ABBy7wAQc1cAEHN3ABBzmwAQdBsAEHR7ABB0swAQdOsAEHVXABB1qwAQddMAEHYPABB2OwAQdosAEHa/ABB3BwAQdzMAEHdvABB3rwAQd+cAEHgPABB4SwAQeGsAEHjzABB5FwAQeYsAEHn3ABB6VwAQetsAEHtzABB79wAQfHMAEHzjABB9iwAQfisAEH6/ABB/FwAQf4MAEH/XABCAWwAQgMcAEIEbABCBZwAQgacAEIHLABCCAwAQgicAEIJnABCCnwAQgssAEIMLABCDLwAQg18AEIOHABCDwwAQg/MAEIQnABCEawAQhJcAEITbABCFFwAQhT8AEIVnABCFnwAQhcsAEIYbABCGYwAQhr8AEIcDABCHSwAQh48AEIebABCH4wAQiE8AEIijABCIxwAQiRMAEIk/ABCJgwAQiYsAEIofABCKmwAQiusAEIuDABCMAwAQjF8AEIyvABCM1wAQjScAEI1vABCNlwAQjb8AEI5HABCOvwAQjzcAEI9bABCPpwAQj98AEJAXABCQSwAQkJ8AEJDnABCRHwAQkW8AEJGzABCSLwAQkmsAEJKrABCS3wAQkycAEJNbABCTnwAQk78AEJQzABCUmwAQlQMAEJUzABCVewAQldsAEJYjABCWawAQlrsAEJcPABCXTwAQl48AEJfLABCYGwAQmD8AEJhjABCYkwAQmLsAEJjrABCZQwAQmW8AEJmvABCZ+wAQmgsAEJpLABCafwAQmucAEJs3ABCbhwAQm9sAEJwXABCcYwAQnJcAEJzTABCdAwAQnT8AEJ1zABCdowAQnf8AEJ5zABCe4wAQnxsAEJ93ABCfuwAQoAsAEKBfABCgowAQoNsAEKEXABChfwAQoesAEKJLABCinwAQovMAEKM/ABCjYwAQo5MAEKPTABCj/wAQpEMAEKSTABCk2wAQpRcAEKVnABCljwAQpcsAEKXvABCmPwAQposAEKbLABCm5wAQpv8AEKdTABCnlwAQp+MAEKgvABCocwAQqLsAEKknABCplwAQqfsAEKo3ABCqYwAQqn8AEKqfABCqswAQqusAEKsXABCrawAQq5MAEKvrABCsGwAQrGcAEKyzABCs4wAQrSMAEK17ABCtwwAQrg8AEK5TABCuiwAQrtsAEK8rABCvewAQr6cAEK/bABCv/wAQsCcAELBfABCwswAQsPcAELE/ABCxYwAQsaMAELHnABCyLwAQsosAELLPABCy9wAQs0cAELOHABCztwAQs/MAELQvABC0VwAQtKcAELTPABC1CwAQtU8AELVzABC1pwAQtc8AELYPABC2TwAQtnsAELavABC25wAQtysAELdjABC3gwAQt8sAELf/ABC4OwAQuHMAELiXABC4wwAQuO8AELkfABC5PwAQuVsAELmvABC56wAQug8AELpfABC6gwAQurMAELrnABC7DwAQu6cAELv3ABC8FwAQvDMAELyPABC8ywAQvQ8AEL07ABC9awAQvYcAEL3HABC+IwAQvk8AEL6TABC++wAQvzcAEL9vABC/nwAQv9cAEMBXABDAlwAQwMsAEMELABDBNwAQwV8AEMGnABDBywAQwhsAEMJvABDCqwAQwxsAEMNrABDDwwAQw+sAEMRzABDE2wAQxT8AEMV7ABDFuwAQxfMAEMZ7ABDGowAQxuMAEMdPABDHpwAQx98AEMgfABDIRwAQyKsAEMkDABDJPwAQyZ8AEMnXABDKJwAQym8AEMqbABDK7wAQyz8AEMuDABDLwwAQzBsAEMx7ABDMrwAQzPsAEM1LABDNfwAQzbcAEM3zABDOFwAQzj8AEM6PABDO6wAQzzcAEM9HABDPewAQz6cAEM/fABDQWwAQ0MsAENDnABDRCwAQ0U8AENFnABDRmwAQ0cMAENIjABDSZwAQ0oMAENKvABDTAwAQ0zMAENOLABDTywAQ1AMAENQ3ABDU0wAQ1WcAENYHABDWwwAQ13cAENgbABDZJwAQ2WcAENmvABDZ4wAQ2icAENpTABDagwAQ2rcAENsLABDbXwAQ27MAENxfABDdDwAQ3asAEN5TABDfCwAQ30MAEOAzABDgcwAQ4KcAEODPABDhVwAQ4bsAEOJHABDiUwAQ4ncAEOKbABDiuwAQ4t8AEOL3ABDjJwAQ428AEOOzABDj6wAQ5CMAEORXABDkiwAQ5LMAEOT/ABDlSwAQ5WsAEOWjABDl1wAQ5jMAEOZ7ABDmqwAQ5ucAEOcfABDnawAQ5+cAEOhDABDogwAQ6McAEOkPABDpRwAQ6X8AEOnHABDqDwAQ6lsAEOqXABDrEwAQ628AEOujABDr7wAQ7BsAEOxrABDsnwAQ7OcAEO0XABDtXwAQ7YsAEO3XABDuFwAQ7lcAEO6HABDuqwAQ72MAEO+zABDwGwAQ8I8AEPC7ABDxTwAQ8ZMAEPHPABDyBwAQ8jMAEPJDABDyUwAQ8u8AEPNPABDzewAQ858AEPPTABDz/wAQ9BsAEPQ7ABD0TwAQ9JsAEPTTABD1EwAQ9S8AEPVDABD1jwAQ9csAEPYHABD2JwAQ9m8AEPaXABD2qwAQ9scAEPbbABD2/wAQ9xsAEPdbABD3ewAQ97MAEPe/ABD3wwAQ988AEPgLABD4PwAQ+KcAEPkzABD5fwAQ+ccAEPofABD6TwAQ+oMAEPr3ABD7OwAQ+4sAEPvLABD8AwAQ/B8AEPwvABD8YwAQ/LMAEPzjABD9FwAQ/XcAEP2zABD99wAQ/jcAEP5/ABD+uwAQ/vMAEP9XABD/swARABsAEQCLABEA2wARATsAEQF7ABEBzwARAg8AEQJLABECpwARAvsAEQM/ABEDhwARA+cAEQRfABEEiwARBNMAEQUvABEFWwARBZsAEQXvABEGLwARBm8AEQavABEHEwARB2sAEQevABEIKwARCGMAEQinABEI0wARCQsAEQkfABEJSwARCXMAEQmPABEJpwARCccAEQnzABEKJwARCkcAEQpjABEKlwARCs8AEQrrABELHwARC4MAEQu7ABEMDwARDDMAEQxPABEMfwARDJcAEQz7ABENQwARDaMAEQ3fABEObwARDqMAEQ7TABEO6wARDxcAEQ9LABEPnwARD+MAERAbABEQcwAREKcAERDfABERCwARETcAERFrABERiwAREm8AERLXABETBwAREz8AERN7ABETmwARE8cAERP7ABEUFwARFF8AERSnABEUxwARFRMAERUnABEVWwARFasAERXrABEWTwARFucAERdbABEX1wARGAMAERjjABEZMwARGZcAERnvABEadwARGw8AERsnABEbywARHH8AERzPABEc8wARHXcAER2bABEdzwARHh8AER5jABEexwARHw8AER9fABEfzwARIBsAESB7ABEg8wARITsAESGDABEhxwARIfcAESI/ABEicwARIvcAESM3ABEjawARI8cAESR3ABEkwwARJOsAESUjABElPwARJW8AESWHABEmOwARJmMAESaTABEmywARJw8AESeHABEnywARJ/8AESg/ABEobwARKJcAESjTABEpCwARKU8AESmLABEpvwARKgMAESo7ABEqYwARKosAESsfABErcwARLC8AESw3ABEsewARLIMAESzvABEtMwARLV8AES2XABEt0wARLjMAES5vABEujwARLusAES8/ABEvswARL8sAES/TABEwAwARMFMAETCHABExMwARMY8AETG/ABEyDwARMlMAETJnABEyvwARMucAETM/ABEzowARNAMAETRPABE0twARNPcAETU7ABE1fwARNcMAETYHABE2TwARNpcAETbfABE3JwARN2sAETezABE38wARODsAEThnABE4nwARONMAETjzABE5LwAROUMAETlbABE5cwAROYsAETmjABE5vwAROdsAETn3ABE6EwAROisAETpHABE6UwAROosAETrfABE7MwARO1sAETufABE74wARPBsAETxPABE8dwARPMMAETzzABE9HwARPUcAET1/ABE9uwARPfsAET5DABE+kwARPtsAET8TABE/VwARP6MAET/HABFANwARQLMAEUDfABFBDwARQU8AEUGPABFB1wARQg8AEUIrABFCQwARQmcAEUKPABFCvwARQucAEUMzABFDawARQ6MAEUPTABFD4wARRDMAEUSPABFExwARRPsAEUULABFFHwARRTMAEUVHABFFWwARRXMAEUWLABFFowARRbsAEUXPABFF5wARRfcAEUYLABFGIwARRksAEUZ3ABFG4wARRwsAEUc7ABFHUwARR38AEUerABFHtwARR/MAEUgvABFIewARSL8AEUkPABFJKwARSU8AEUmLABFJqwARSesAEUojABFKqwARSw8AEUtbABFLnwARS9sAEUwjABFMTwARTKcAEUzPABFNBwARTVcAEU2PABFNywARTi8AEU5PABFOjwARTq8AEU7fABFPFwARTyMAEU+DABFPswART88AEVAvABFQhwARULMAEVDfABFQ9wARUR8AEVEnABFRWwARUYMAEVGvABFRtwARUc8AEVHrABFSAwARUjMAEVJjABFSkwARUtMAEVMHABFTOwARU3MAEVPzABFUSwARVH8AEVSvABFVTwARVX8AEVXbABFWMwARVp8AEVa/ABFW9wARVzsAEVeLABFX4wARWB8AEVhTABFYgwARWMsAEVj/ABFZVwARWasAEVnrABFaZwARWo8AEVqvABFa+wARW5sAEVvnABFcRwARXJ8AEV2XABFeYwARXuMAEV8PABFfFwARX1MAEWAzABFguwARYT8AEWIbABFiMwARY0MAEWQ3ABFlDwARZZMAEWXTABFmUwARZtMAEWbzABFnRwARZ5MAEWe7ABFoAwARaF8AEWkXABFp3wARafsAEWofABFqpwARarMAEWrnABFrYwARbBsAEWxjABFsgwARbLcAEWzfABFs/wARbRsAEW0jABFtKwARbWMAEW2PABFtrwARbeMAEW6LABFu2wARby8AEW+jABFvuwARcBcAEXA3ABFwcwARcJMAEXDDABFxLwARcW8AEXHnABFyFwARcmcAEXK7ABFzRwARc8cAEXQLABF0PwARdJsAEXTXABF1WwARddcAEXYXABF2iwARdrcAEXbnABF3JwARd1cAEXd/ABF3zwAReBMAEXhjABF4uwAReOsAEXkjABF5XwAReZcAEXnbABF6bwARersAEXrrABF7DwARe3sAEXunABF75wARfCMAEXxfABF8nwARfOMAEX0nABF9awARfacAEX3jABF+DwARfncAEX6PABF+pwARfsMAEX8HABF/LwARf1cAEX9/ABF/wwARf/MAEYBXABGAcwARgJcAEYEbABGBnwARgiMAEYJLABGChwARgssAEYLnABGDOwARg3cAEYObABGD0wARhCMAEYSDABGE0wARhPMAEYUTABGFXwARhaMAEYW7ABGF0wARhlMAEYZnABGGewARhu8AEYdbABGH0wARh/cAEYgjABGITwARiGcAEYiDABGIvwARiOMAEYkHABGJLwARiVsAEYl7ABGJpwARidMAEYn3ABGKIwARimMAEYqfABGK5wARiy8AEYuTABGLvwARjAsAEYwzABGMgwARjLMAEYzvABGNEwARjTsAEY1/ABGNxwARjfMAEY5TABGOgwARjrcAEY7rABGPFwARjz8AEY+7ABGP2wARkAsAEZBrABGQowARkK8AEZDfABGRQwARkWsAEZGfABGR2wARkj8AEZKTABGSuwARkvMAEZM7ABGTgwARk6sAEZPLABGT9wARlDsAEZRzABGU3wARlRcAEZVDABGVnwARlc8AEZXfABGWFwARlmcAEZazABGW2wARlxcAEZc3ABGXYwARl3sAEZevABGXtwARl/sAEZgPABGYWwARmIMAEZkPABGZMwARmW8AEZmXABGZrwARmdcAEZn3ABGaHwARmsMAEZsPABGbKwARm1cAEZt7ABGbpwARm+cAEZwnABGcTwARnHsAEZzXABGdDwARnVsAEZ1zABGdpwARngMAEZ47ABGeXwARnqsAEZ8HABGfNwARn18AEZ+HABGf5wARoDcAEaCXABGg1wARoQ8AEaE/ABGhcwARoacAEaHzABGiDwARolcAEaKXABGixwARowMAEaNDABGjZwARo68AEaPXABGkBwARpDMAEaRnABGkjwARpNcAEaUHABGlMwARpWMAEaWPABGlvwARpesAEaYfABGmUwARpocAEabDABGm6wARpysAEaczABGnewARp6MAEafvABGoewARqPcAEalbABGpdwARqZcAEamfABGptwARqcsAEanfABGp8wARqgMAEaoXABGqKwARqj8AEapfABGqgwARqp8AEaq/ABGqxwARquMAEarzABGrAwARqxMAEasrABGrRwARq2sAEauLABGrpwARq7sAEavPABGr6wARq/cAEawXABGsIwARrDMAEaw7ABGsYwARrHsAEayDABGslwARrLsAEazfABGs5wARrPcAEa0TABGtJwARrT8AEa1LABGtWwARrWMAEa1rABGtiwARrZcAEa2nABGtuwARrc8AEa3vABGuCwARriMAEa4vABGuPwARrlcAEa5vABGugwARrpsAEa6rABGuuwARrs8AEa7fABGu6wARrwcAEa8TABGvIwARrzcAEa9HABGvWwARr3sAEa+fABGvvwARr+cAEbArABGwbwARsKsAEbDDABGxBwARsTcAEbFbABGxrwARsdsAEbIfABGyYwARsn8AEbK7ABGyxwARsuMAEbMLABGzVwARs6sAEbPvABG0JwARtD8AEbRnABG0hwARtMsAEbUXABG1ZwARtbMAEbYDABG2QwARtpMAEbbXABG3FwARt2cAEbezABG4DwARuFsAEbiTABG46wARuT8AEblXABG5gwARua8AEbnXABG54wARuisAEbpTABG6awARuo8AEbrbABG7MwARuz8AEbtvABG7dwARu38AEbuPABG7qwARu9MAEbvfABG76wARvAcAEbwvABG8OwARvFMAEbxbABG8bwARvIMAEbyXABG8twARvL8AEb0LABG9NwARvYcAEb2PABG9owARvcMAEb3PABG91wARvesAEb3/ABG+HwARvisAEb5LABG+dwARvocAEb6XABG+qwARvssAEb7fABG+8wARvxMAEb8fABG/MwARv1MAEb9bABG/hwARv6MAEb/LABG/0wARv+sAEcAfABHALwARwEsAEcBTABHAdwARwJcAEcDTABHBFwARwWcAEcFzABHBlwARwasAEcHLABHB0wARweMAEcH/ABHCBwARwoMAEcKHABHCmwARwscAEcL/ABHDCwARwysAEcMvABHDUwARw6MAEcQXABHEbwARxJMAEcTPABHE7wARxQ8AEcU7ABHFgwARxdMAEcYnABHGbwARxrsAEccbABHHawARx6cAEcf/ABHIUwARyJsAEcjPABHJIwARyWsAEcnDABHKCwARyl8AEcq3ABHLAwARy1cAEcurABHMAwARzFsAEcybABHM5wARzUsAEc2PABHN1wARziMAEc7TABHO9wARzx8AEc8vABHPiwARz7sAEc/XABHQSwAR0IcAEdDjABHRPwAR0YcAEdHPABHR8wAR0iMAEdJXABHSbwAR0rMAEdMLABHTTwAR05MAEdPjABHUDwAR1IMAEdTXABHU7wAR1QcAEdVPABHVgwAR1bsAEdYHABHWRwAR1pMAEdbTABHXCwAR1ysAEdeDABHXlwAR17cAEdffABHYIwAR2FcAEdinABHYwwAR2P8AEdkjABHZewAR2iMAEdpHABHa1wAR20MAEduTABHbywAR3AMAEdxDABHcjwAR3NsAEd0/ABHdZwAR3Z8AEd3jABHeLwAR3m8AEd6bABHeywAR3v8AEd8/ABHfcwAR36cAEd/jABHgDwAR4F8AEeB/ABHgqwAR4M8AEeDvABHhMwAR4ZMAEeH3ABHiawAR4pMAEeK7ABHjEwAR4y8AEeNjABHjlwAR49cAEeQPABHkPwAR5FsAEeSfABHkxwAR5PMAEeUfABHlZwAR5YsAEeXnABHmUwAR5rMAEebbABHnRwAR548AEee7ABHnzwAR6EcAEei/ABHpJwAR6WMAEemXABHpvwAR6ecAEeobABHqiwAR6p8AEerLABHrHwAR6y8AEetnABHrpwAR68cAEevjABHsJwAR7GsAEezLABHs/wAR7TMAEe2fABHtvwAR7f8AEe4bABHuWwAR7oMAEe7XABHvHwAR728AEe/PABHwKwAR8IsAEfDzABHxXwAR8a8AEfH7ABHyQwAR8n8AEfLDABHy7wAR8zsAEfNvABHzlwAR88MAEfQPABH0OwAR9GcAEfSXABH04wAR9ScAEfVjABH1uwAR9gMAEfZHABH2WwAR9ocAEfbjABH3EwAR908AEfd7ABH31wAR9/MAEfhfABH4swAR+Q8AEflPABH5jwAR+bMAEfn7ABH6MwAR+nMAEfqvABH7BwAR+1MAEfufABH72wAR/A8AEfxPABH8twAR/QMAEf1PABH9mwAR/e8AEf5DABH+lwAR/usAEf9HABH/qwAR/+sAEgAjABIAYwASAK8AEgELABIBIwASAUMAEgF3ABIBswASAfsAEgJrABICnwASAsMAEgLrABIDEwASA0sAEgNrABIDpwASA9MAEgQPABIEOwASBFMAEgSXABIEqwASBMsAEgT/ABIFWwASBbcAEgYbABIGRwASBr8AEgcPABIHUwASB7sAEgfvABIIawASCK8AEgjfABIJFwASCUsAEgmTABIJwwASCiMAEgqbABIKzwASCysAEguLABIL5wASDEcAEgzrABINPwASDXMAEg3nABIOJwASDmsAEg6/ABIPRwASD4MAEg/HABIQDwASEEMAEhB7ABIQrwASEO8AEhFfABIRrwASEdsAEhILABISPwASEpMAEhK/ABITAwASE0sAEhOXABIT7wASE/cAEhP/ABIURwASFJMAEhTvABIVTwASFW8AEhWTABIVzwASFfcAEhY/ABIWawASFrMAEhbjABIXDwASF0MAEheLABIX0wASF/8AEhg3ABIYiwASGL8AEhjnABIZVwASGYsAEhnjABIaNwASGqMAEhrrABIbDwASGy8AEhtXABIbgwASG8MAEhwDABIcKwASHJcAEhz/ABIdPwASHYsAEh3TABIeCwASHkcAEh6XABIe4wASHyMAEh9vABIfswASIDMAEiCrABIg2wASIQsAEiFvABIhqwASIfMAEiI7ABIicwASIqcAEiMjABIjrwASI/sAEiRDABIkXwASJHMAEiSTABIk6wASJWMAEiXLABImFwASJisAEiZ3ABImtwASJxcAEidHABInqwASJ8MAEif/ABIoIwASKFMAEiiTABIo2wASKUcAEimvABIp1wASKicAEipnABIqcwASKp8AEirrABIrPwASK3cAEivXABIr+wASLDcAEiyDABIsvwASLTcAEi1jABIthwASLc8AEi33ABIuPwASLq8AEi7zABIvIwASL2MAEi+rABIv6wASMEcAEjBrABIwrwASMP8AEjE7ABIxiwASMdsAEjIvABIyVwASMocAEjK3ABIzAwASMzcAEjNvABIzrwASM+8AEjQbABI0VwASNKMAEjTPABI0+wASNSsAEjVDABI1YwASNbMAEjXLABI2HwASNjcAEjZLABI2ZwASNocAEjazABI3BwASNzsAEjePABI3xwASN+MAEjgTABI4VwASOI8AEjizABI40wASOQMAEjlDABI5VwASOYMAEjmzABI5zwASOecAEjorABI6TwASOo8AEjrTABI69wASOycAEjuDABI7uwASPAMAEjxDABI8jwASPPsAEj0nABI9VwASPc8AEj6HABI/lwASP+8AEkBjABJA5wASQQ8AEkE7ABJBowASQdMAEkIXABJCawASQqcAEkLbABJDDwASQz8AEkN3ABJD0wASRC8AEkS/ABJE1wASRRsAEkWzABJGSwASRs8AEkcXABJHPwASR2cAEkejABJH3wASSFMAEkiPABJIuwASSN8AEkkTABJJRwASSX8AEknLABJJ8wASSkMAEkqnABJLBwASS2sAEkvnABJMBwASTEMAEkyLABJM1wASTTsAEk2DABJNxwASTisAEk5nABJOiwASTq8AEk7TABJPOwAST1cAEk+PABJPmwAST98AElAbABJQWwASUJ8AElDjABJRKwASUWcAElGfABJRvwASUecAElIrABJSfwASUrcAElMDABJTLwASU6sAElPLABJUCwASVDcAElRXABJUmwASVL8AElTbABJU/wASVS8AElV/ABJVswASVgMAElZHABJWkwASVtsAElebABJX2wASV/sAElg7ABJYjwASWNMAElj7ABJZPwASWa8AElojABJaowASWxMAElufABJcBwASXHcAEly/ABJdAwASXUcAEl2LABJdpwASXccAEl4DABJelwASXz8AEl9vABJfswASX+sAEmAzABJgWwASYLMAEmEnABJhnwASYl8AEmMLABJjpwASZE8AEmT/ABJljwASZgMAEmavABJnTwASZ+sAEmh3ABJo6wASaaMAEmo3ABJq1wASa1cAEmv/ABJsewASbPcAEm2bABJuMwASbt8AEm+DABJwJwAScOcAEnGTABJyPwAScs8AEnNzABJ0DwASdJ8AEnU3ABJ1pwASdb8AEnXbABJ2PwASdo8AEnbPABJ3GwASd28AEnejABJ3uwASeAsAEnhPABJ4jwASeL8AEnjXABJ5MwASeWsAEnmvABJ50wASeh8AEno/ABJ6XwASeqcAEnrjABJ7MwASe3sAEnvDABJ8JwASfHcAEnzHABJ8+wASfUMAEn2DABJ9twASffMAEn4HABJ+TwASfocAEn6zABJ+5wASfy8AEn+bABJ/4wASgDsAEoCnABKBcwASgc8AEoJDABKCwwASgvMAEoM7ABKDgwAShBMAEoS3ABKFEwAShXMAEoXvABKGMwAShsMAEocDABKHVwASh6MAEofPABKH7wASiA8AEog7ABKIWwASiJsAEojvABKJCwASiXMAEonTABKKRwASirsAEotDABKLpwASjCMAEoyzABKNKwASjY8AEo3zABKOPwASjocAEo6jABKPHwASj28AEo/TABKQDwASkHcAEpCzABKRHwASkV8AEpHHABKSCwASkjMAEpJbABKSewASkp8AEpLbABKTFwASk3MAEpPLABKUAwASlFcAEpSHABKUrwASlO8AEpUfABKVgwASleMAEpYLABKWZwASlrcAEpcLABKXWwASl48AEpfDABKYCwASmGMAEpiLABKY1wASmTcAEpmnABKZ2wASmi8AEpqTABKa7wASm1cAEpvPABKcEwASnG8AEpyrABKc/wASnT8AEp1rABKdlwASndMAEp33ABKeHwASnmcAEp7XABKfTwASn8MAEqBHABKglwASoPcAEqF7ABKhmwASoa8AEqHXABKh8wASofsAEqIfABKiVwASorMAEqLzABKjIwASo28AEqO7ABKj6wASpCMAEqSPABKk0wASpRcAEqU/ABKlcwASpacAEqX/ABKmLwASplsAEqarABKmywASpwMAEqdDABKnpwASp9cAEqgnABKofwASqK8AEqjTABKpCwASqWsAEqnbABKp6wASqisAEqp3ABKqtwASqxcAEqs/ABKrdwASq8cAEqvzABKsYwASrM8AEq0fABKtZwASrZMAEq3rABKuWwASrq8AEq8LABKvSwASr3MAEq+zABKwTwASsMMAErEnABKxpwASsfcAErIfABKydwASsvMAErMbABKzfwASs/8AErQ/ABK0ewAStI8AErSrABK01wAStRsAErVjABK1twAStgMAErY7ABK2dwAStucAErczABK3VwASt3cAErfTABK4GwASuFMAErhfABK4lwASuOsAErk3ABK5iwASubcAEroDABK6SwASuoMAErqvABK60wASuzMAEruDABK71wASvDMAErx/ABK8jwASvP8AEr1HABK90wASvjMAEr7DABK/WwASv5cAEr/zABLAOwASwJMAEsDjABLBCwASwTsAEsF7ABLB0wASwiMAEsJrABLCwwASwucAEsM3ABLDXwASw98AEsRPABLEgwASxLcAEsUPABLFOwASxcMAEsYbABLGWwASxrcAEsb7ABLHNwASx38AEse3ABLIAwASyD8AEsiXABLIywASyPsAEslTABLJjwASyb8AEsnvABLKMwASynMAEsq3ABLK1wASyvcAEssXABLLLwASy0cAEst3ABLLqwASy9cAEswLABLMMwASzE8AEsx/ABLMpwASzL8AEszLABLM4wASzR8AEs1DABLNZwASzXcAEs2HABLNowASzecAEs4TABLOOwASzm8AEs5/ABLOlwASzr8AEs7nABLO/wASzxsAEs87ABLPSwASz2cAEs+XABLPtwAS0AMAEtA7ABLQUwAS0H8AEtDfABLRHwAS0T8AEtFPABLRbwAS0XsAEtGjABLRuwAS0dsAEtIrABLSPwAS0pcAEtLHABLTBwAS0xsAEtNzABLTtwAS0+MAEtQPABLUOwAS1GcAEtSfABLU1wAS1PsAEtUjABLVQwAS1WcAEtWjABLV0wAS1isAEtZXABLWcwAS1qcAEtbHABLW7wAS1wsAEtdDABLXiwAS15sAEtfXABLYCwAS2EsAEtiPABLYvwAS2QsAEtlnABLZzwAS2jsAEtqTABLbBwAS2y8AEttLABLbowAS2/sAEtw3ABLcZwAS3IMAEtzHABLc4wAS3QsAEt1XABLdswAS3gsAEt4zABLeYwAS3rMAEt8TABLfUwAS32sAEt+jABLfywAS3+8AEuATABLglwAS4LsAEuEPABLhNwAS4XMAEuGfABLhxwAS4esAEuIXABLiRwAS4mcAEuKLABLirwAS4tcAEuNjABLjowAS48sAEuQfABLkewAS5JsAEuTTABLlAwAS5T8AEuWbABLl+wAS5isAEuZPABLmfwAS5qMAEubLABLm9wAS5zcAEudfABLnwwAS6AsAEuhTABLoewAS6J8AEujzABLpIwAS6W8AEumHABLpswAS6gsAEupLABLqhwAS6qsAEutHABLrkwAS7C8AEuxXABLslwAS7OMAEu0PABLtWwAS7aMAEu3HABLuLwAS7jcAEu5LABLuqwAS7wcAEu87ABLv5wAS8A8AEvA/ABLwowAS8M8AEvETABLxQwAS8YcAEvGrABLxywAS8isAEvKLABLzQwAS84cAEvPLABL0CwAS9GcAEvTPABL0+wAS9RMAEvVzABL1swAS9mMAEva7ABL3BwAS91MAEvevABL33wAS+CsAEviLABL42wAS+SsAEvmbABL50wAS+h8AEvpfABL6vwAS+vsAEvtLABL7jwAS+9sAEvwbABL8WwAS/KMAEv0zABL9bwAS/aMAEv3jABL9/wAS/kMAEv6TABL+ywAS/0MAEv9jABL/nwATACsAEwBjABMAqwATAMcAEwEDABMBTwATAZsAEwHnABMCMwATAl8AEwKTABMCtwATAtcAEwMHABMDKwATA2cAEwN7ABMDwwATA+cAEwQvABMEZwATBJMAEwTLABME+wATBTsAEwW3ABMF8wATBj8AEwaPABMGvwATBw8AEwdXABMHmwATB+8AEwhDABMIowATCOcAEwkfABMJUwATCYcAEwnnABMKNwATCmcAEwqjABMK3wATC1MAEwvHABMMBwATDHcAEwzTABMNHwATDZsAEw3zABMOawATDzcAExAfABMQswATESMAExF/ABMR0wATEiMAExKvABMS5wATExsAExNLABMTrwATE8MAExPvABMUJwATFG8AExSTABMU6wATFV8AExXLABMWIwATFosAExbvABMX5wATGIsAExjPABMZpwATGosAExrHABMa+wATG4MAExvPABMb5wATG/8AExwjABMcawATHKsAExznABMdPwATHVsAEx2LABMdqwATHdsAEx4HABMeYwATHscAEx9XABMf5wATICsAEyBvABMgmwATIMcAEyDzABMhGwATIV8AEyGbABMh7wATIkcAEyJPABMinwATIvsAEyMjABMjWwATI6cAEyPTABMkLwATJD8AEyRTABMkawATJJ8AEyTDABMk3wATJUcAEyWXABMlxwATJf8AEyYzABMmWwATJncAEyajABMm2wATJucAEyc/ABMnawATJ5MAEyfTABMoHwATKEsAEyibABMo0wATKRMAEylnABMplwATKbsAEynjABMqFwATKlcAEyqjABMq8wATKzMAEyt/ABMr/wATLOMAEy0bABMtQwATLesAEy4XABMuTwATLrMAEy8bABMvVwATL6sAEzAPABMw9wATMXcAEzIPABMyLwATMl8AEzJzABMytwATMvMAEzNLABMzgwATM78AEzQ7ABM0wwATNVMAEzXjABM2CwATNjsAEzZbABM2bwATNsMAEzcHABM3ewATN5sAEzfXABM4PwATOIMAEzirABM42wATORMAEzk7ABM5ZwATOYsAEzm/ABM55wATOhMAEzprABM6twATOz8AEzvTABM8LwATPKsAEzy7ABM8ywATPNsAEzzrABM8+wATPQsAEz0bABM9KwATPTcAEz1DABM9UwATPV8AEz1rABM9dwATPYMAEz2PABM9mwATPasAEz27ABM9ywATPdsAEz3rABM9+wATPgsAEz4bABM+KwATPjcAEz5HABM+VwATPmMAEz5vABM+ewATPocAEz6XABM+rwATPt8AEz7zABM/CwATPz8AEz9nABM/ewATP4MAEz+fABM/vwATP88AEz/3ABNACwATQDcAE0BrABNAhwATQLMAE0D3ABNBEwATQUMAE0GLABNBrwATQcMAE0HbABNB8wATQgcAE0IXABNCOwATQlMAE0JzABNClwATQp8AE0KnABNCrwATQrcAE0K/ABNCxwATQs8AE0LXABNC3wATQucAE0L/ABNDJwATQzMAE0NbABNDdwATQ6MAE0O7ABNDxwATQ/sAE0QXABNERwATRGsAE0R3ABNEfwATRIcAE0SPABNElwATRJ8AE0SnABNErwATRLcAE0S/ABNExwATRM8AE0TXABNE3wATROcAE0TvABNE9wATRP8AE0UHABNFDwATRRcAE0UfABNFJwATRS8AE0U3ABNFPwATRUcAE0VrABNFnwATRccAE0XrABNGIwATRk8AE0ZnABNGdwATRn8AE0arABNG0wATRvsAE0cTABNHGwATRyMAE0crABNHMwATRzsAE0dDABNHSwATR1MAE0dbABNHYwATR2sAE0dzABNHewATR4MAE0eLABNHkwATR5sAE0ejABNHqwATR7MAE0e7ABNHwwATR8sAE0fTABNH2wATR+MAE0f/ABNIKwATSD8AE0hPABNIawATSJsAE0izABNI/wATSWsAE0trABNLvwATS9cAE0wfABNMtwATTVMAE037ABNOkwATT48AE0+vABNQJwATUQsAE1E3ABNRUwATUc8AE1JnABNSdwATUocAE1KTABNSnwATUrMAE1K/ABNSywATUt8AE1LrABNS/wATUx8AE1NHABNTUwATU38AE1OvABNTwwATU9cAE1PvABNUBwATVCMAE1Q7ABNUUwATVHsAE1SHABNUkwATVJ8AE1TDABNUzwATVR8AE1VHABNVmwATVb8AE1YLABNWGwATVmsAE1aDABNWkwATVqcAE1azABNWvwATVv8AE1c7ABNXewATV5cAE1fLABNX8wATWCcAE1hHABNYlwATWOcAE1k7ABNZ5wATWgsAE1o/ABNabwATWqsAE1rbABNa/wATWzcAE1t7ABNbqwATW+cAE1wfABNcWwATXIMAE1ynABNc0wATXP8AE10fABNdPwATXWcAE13HABNeKwATXmsAE16LABNetwATXucAE18PABNfRwATX2cAE1/LABNgMwATYHcAE2CzABNg3wATYQsAE2EzABNhZwATYZMAE2H7ABNiJwATYl8AE2KXABNi/wATY0sAE2ODABNjrwATY+cAE2QTABNkPwATZHcAE2SvABNk2wATZRsAE2VPABNlswATZiMAE2ZrABNmnwATZt8AE2cPABNnQwATZ38AE2ezABNn9wATaC8AE2h/ABNowwATaQMAE2kvABNpZwATaZsAE2ovABNqgwATat8AE2tHABNrxwATbD8AE2x3ABNtAwATbUcAE23rABNuWwATbxsAE283ABNvgwATb5MAE2/DABNv1wATb+8AE3AHABNwKwATcFMAE3BrABNwiwATcM8AE3DvABNxAwATcScAE3FfABNxgwATcacAE3HLABNyNwATcn8AE3K/ABNzWwATc6MAE3Q3ABN0SwATdJcAE3TjABN09wATdT8AE3VfABN1mwATdbMAE3XPABN19wATdmMAE3ajABN26wATdycAE3dfABN3lwATd7sAE3grABN4XwATeMMAE3lPABN5fwATeacAE3nfABN58wATegsAE3onABN6fwATeqsAE3rXABN67wATex8AE3tXABN7lwATe8sAE3wfABN8TwATfHcAE3yvABN9AwATfT8AE32TABN95wATfjsAE36jABN+3wATfxcAE39TABN/gwATf6MAE3/3ABOAIwATgFcAE4CfABOAuwATgPsAE4E/ABOBbwATgZsAE4HHABOCJwATgn8AE4KrABOC4wATgwsAE4NbABODxwATg/cAE4RLABOEhwAThKMAE4T3ABOFHwAThV8AE4WrABOFvwAThicAE4ZfABOGkwAThtcAE4cjABOHiwATh7cAE4gTABOITwATiIsAE4jvABOJOwATiWsAE4nfABOKSwATiq8AE4sfABOLhwATi9sAE4xPABOMqwATjSsAE41bABONuwATji8AE453ABOOuwATjtsAE48jABOPbwATj4MAE4+fABOP4wATkDsAE5BzABOQowATkN8AE5E3ABORdwATkc8AE5InABOSlwATktcAE5MTABOTQwATk5sAE5PjABOT+wATlBsAE5RTABOUnwATlMMAE5ULABOVUwATlYcAE5XrABOWSwATlnsAE5a3ABOW5wATlz8AE5evABOYCwATmEsAE5ijABOYzwATmPsAE5k/ABOZjwATmbMAE5ofABOaWwATmqMAE5r3ABObYwATm5MAE5vzABOcJwATnI8AE5zfABOdVwATncsAE54zABOepwATnxcAE59zABOf7wAToE8AE6DTABOhBwAToWsAE6HjABOiMwAToksAE6J3ABOiswAToscAE6LvABOjAwAToycAE6NLABOjewATo8MAE6PrABOkHwATpGsAE6SvABOk7wATpTMAE6VvABOlowATpecAE6YbABOmSwATpmsAE6aDABOmswATpw8AE6dvABOnkwATp7sAE6fjABOoKwATqFsAE6iLABOoywATqPMAE6kvABOpVwATqZcAE6nnABOqDwATqk8AE6pzABOqiwATqr8AE6rfABOrIwATqzcAE6t3ABOrowATq9MAE6v/ABOsFwATrFMAE6yfABOspwATrMMAE6zfABOtFwATrUsAE63zABOuUwATrpcAE67fABOvCwATr0sAE6+PABOvywATr+sAE7AjABOwbwATsKcAE7D/ABOxawATsb8AE7HnABOyBwATsksAE7JjABOyewATspMAE7KrABOyywATsusAE7MTABOzKwATs08AE7ObABOz6wATtC8AE7RXABO0jwATtMcAE7UrABO1bwATtacAE7YfABO2bwATtpsAE7bTABO3VwATt5MAE7ffABO4AwATuDcAE7jDABO46wATuS8AE7l7ABO5xwATugMAE7pXABO6nwATuuMAE7srABO7TwATu4cAE7ubABO76wATvAsAE7wrABO8RwATvGMAE7ybABO8wwATvPsAE70vABO9VwATvXsAE72fABO9xwATvfMAE74fABO+RwATvnMAE76jABO+8wATv7MAE8AfABPASwATwKMAE8DrABPBCwATwTMAE8FjABPBiwATwfMAE8InABPCSwATwoMAE8LnABPDQwATw9MAE8QDABPELwATxIcAE8TDABPFFwATxVsAE8W/ABPF7wATxiMAE8aLABPG8wATxxMAE8c/ABPHdwATx9MAE8gXABPIQwATyJcAE8jHABPI9wATyUsAE8mfABPJ2wATyhcAE8p3ABPK1wATyu8AE8srABPLZwATy4sAE8uvABPL9wATzD8AE8xLABPMWwATzGcAE8x3ABPMfwATzIcAE8zLABPNSwATzYsAE83jABPOHwATzm8AE86/ABPO5wATzwcAE887ABPPfwATz68AE8/7ABPQHwAT0FsAE9B/ABPQjwAT0McAE9DbABPRDwAT0T8AE9GrABPSJwAT0mMAE9J/ABPSswAT0sMAE9NTABPTewAT09cAE9QjABPUlwAT1PsAE9UfABPVTwAT1ZcAE9XDABPV7wAT1hcAE9Y7ABPWfwAT1rMAE9bnABPXDwAT1zsAE9ePABPXvwAT198AE9gLA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BRa2wAUWxcAFFtfABRbswAUW/8AFFxfABRczwAUXTMAFF2PABRd/wAUXn8AFF8LABRfOwAUX9cAFGBPABRguwAUYUMAFGHXABRiawAUYpsAFGLHABRjawAUY9cAFGP3ABRkSwAUZG8AFGSXABRkuwAUZSsAFGVXABRlhwAUZc8AFGYfABRmdwAUZucAFGdTABRnuwAUaAcAFGg3ABRokwAUaOMAFGlvABRpuwAUajMAFGqjABRrGwAUa5MAFGurABRrzwAUbAMAFGwvABRsbwAUbJsAFGzLABRtLwAUbYMAFG3TABRuTwAUbssAFG7zABRvKwAUb3MAFG/PABRwKwAUcHMAFHC3ABRw7wAUcSMAFHFXABRxxwAUcesAFHIfABRyowAUczcAFHPPABR0GwAUdJMAFHS/ABR1LwAUdVcAFHWjABR13wAUdh8AFHZ/ABR2swAUdz8AFHd7ABR3ywAUd+8AFHhnABR43wAUeRMAFHlHABR5hwAUef8AFHojABR6bwAUepsAFHrHABR7FwAUe1MAFHujABR7+wAUfDcAFHyzABR87wAUfSsAFH17ABR+GwAUfkMAFH6XABR+zwAUf0cAFH9vABR/qwAUgA8AFIBzABSAowAUgQcAFIFnABSCZwAUgv8AFIM/ABSDkwAUg9sAFIQvABSEawAUhLsAFIT3ABSFIwAUhU8AFIWXABSGdwAUhqMAFIbHABSG/wAUhysAFId3ABSIAwAUiLcAFIj7ABSJIwAUiV8AFImzABSKEwAUik8AFIqXABSK7wAUizsAFIt/ABSLpwAUi+8AFIx3ABSMzwAUjVMAFI2vABSN2wAUji8AFI6LABSO4wAUj1cAFI+7ABSP+wAUkFsAFJCTABSRCwAUkXcAFJGbABSR4wAUklsAFJLTABSTRwAUk5sAFJPjABSUIwAUlLcAFJUfABSVcwAUlbsAFJX7ABSWnwAUlrsAFJc7ABSXcwAUl6sAFJfLABSX3wAUl/MAFJg/ABSYfwAUmP8AFJlnABSZ0wAUmjsAFJqbABSa3wAUmz8AFJuDABSb1wAUnA8AFJxjABScmwAUnOcAFJ0vABSdTwAUnYMAFJ3PABSd9wAUni8AFJ5rABSfVwAUn78AFJ/vABSgBwAUoA8AFKAXABSgUwAUoJsAFKCvABShDwAUoZcAFKIzABSivwAUozcAFKPbA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BVoLwAVaF8AFWiPABVozwAVaQ8AFWlLABVphwAVaeMAFWobABVqawAVaqcAFWrbABVrDwAVaz8AFWt7ABVrrwAVa/8AFWxHABVsUwAVbJMAFWzPABVs+wAVbTMAFW2fABVtuwAVbf8AFW4/ABVuawAVbpcAFW6/ABVu5wAVbvsAFW8PABVvcwAVb48AFW/TABVwGwAVcGMAFXDLABVxBwAVcRMAFXFHABVxdwAVcZMAFXG7ABVyHwAVcksAFXJvABVyswAVcvcAFXM7ABVzfwAVc8MAFXQHABV0TwAVdJcAFXS/ABV1DwAVdh8AFXZLABV2jwAVdqsAFXbbABV3CwAVdysAFXdTABV3fwAVd9MAFXhnABV5CwAVeUsAFXmLABV6QwAVeoMAFXrDABV7iwAVfB8AFXzDABV9jwAVfkcAFX77ABV/rwAVf+MAFYAbABWAPwAVgJcAFYDPABWA+wAVgRMAFYErABWBQwAVgVsAFYF3ABWCUwAVgs8AFYOXABWDtwAVg98AFYQbABWELwAVhEMAFYR3ABWEiwAVhJ8AFYS/ABWE1wAVhO8AFYULABWFHwAVhZMAFYXHABWF+wAVhmMAFYZ7ABWGswAVhscAFYb3ABWHlwAViAsAFYivABWJBwAViScAFYlnABWJqwAVifMAFYo3ABWKcwAVioMAFYq3ABWLIwAVizMAFYtHABWL2wAVi/cAFYwTABWMSwAVjL8AFYz7ABWNEwAVjU8AFY1fABWNfwAVjasAFY3zABWOiwAVjsMAFY9fABWPlwAVj88AFZAbABWQVwAVkKsAFZDfABWRMwAVkYcAFZHHABWSBwAVkmcAFZLfABWTQwAVk4sAFZPLABWUOwAVlJ8AFZT/ABWVUwAVldcAFZYDABWWuwAVlxcAFZc/ABWXdwAVl9sAFZhHABWYbwAVmJMAFZjXABWZFwAVmVsAFZmPABWZzwAVmhMAFZo3ABWalwAVmusAFZs/ABWbowAVm8MAFZx7ABWc1wAVnPsAFZ03ABWdWwAVnZ8AFZ37ABWeLwAVnmMAFZ6DABWexwAVntMAFZ+HABWfowAVn9MAFaATABWgPwAVoGMAFaCPABWgswAVoNcAFaD7ABWhFwAVoTsAFaFXABWhcwAVob8AFaIHABWiUwAVoqsAFaLvABWjEwAVozsAFaNzABWjywAVpDMAFaSXABWk3wAVpQMAFaVTABWliwAVpfMAFaYfABWmawAVpscAFadLABWnhwAVp9cAFagzABWoewAVqLcAFaj7ABWpKwAVqWMAFapvABWrCwAVq18AFaujABWr2wAVrDsAFayHABWswwAVrS8AFa1nABWtqwAVriMAFa6LABWuxwAVrx8AFa9HABWvowAVr+8AFbAPABWwbwAVsJcAFbDnABWxJwAVsVsAFbGTABWxzwAVsh8AFbJnABWyfwAVs0MAFbOjABWz8wAVtD8AFbSTABW0xwAVtQMAFbU3ABW1dwAVtbMAFbXnABW2kwAVttcAFbcTABW3OwAVt4sAFbfHABW4JwAVuF8AFbiLABW4swAVuPsAFbkrABW5XwAVuX8AFbmvABW6DwAVujcAFbprABW6iwAVuusAFbsTABW7gwAVu7sAFbwDABW8MwAVvHMAFbyzABW9CwAVvVMAFb2jABW+LwAVvpcAFb7LABW/EwAVv08AFb+jABW/2wAVwAsAFcCHABXAqwAVwM8AFcELABXBUwAVwaMAFcHLABXB+wAVwksAFcKXABXC7wAVwx8AFcNjABXDlwAVw8cAFcP7ABXEIwAVxE8AFcTLABXFEwAVxUcAFcWDABXFxwAVxfsAFcY/ABXGcwAVxq8AFcbzABXHEwAVxzsAFcdPABXHdwAVx7cAFcfnABXICwAVyD8AFch/ABXI0wAVyPsAFcknABXJVwAVyZsAFcnfABXJ/wAVyh8AFcpLABXKjwAVytsAFcsbABXLbwAVy5cAFcvDABXMDwAVzFsAFcynABXM1wAVzRcAFc1PABXNgwAVza8AFc3vABXOJwAVzlsAFc6bABXOzwAVzwcAFc8rABXPiwAVz7sAFc/rABXQJwAV0P8AFdFbABXRhwAV0b8AFdHjABXSIwAV0wcAFdM3ABXTcwAV078AFdQDABXUMwAV1E8AFdSPABXUxwAV1PMAFdVDABXVewAV1cMAFdYfABXWVwAV1n8AFda7ABXW7wAV1xsAFdcrABXXPwAV12sAFdd7ABXXtwAV1+cAFdg/ABXYcwAV2J8AFdjPABXZAwAV2UsAFdl3ABXZywAV2fcAFdofABXaLwAV2pcAFdrXABXbIwAV20cAFduXABXbywAV3A8AFdxjABXcswAV3NsAFdznABXdAwAV3TMAFd13ABXd2wAV3esAFd4bABXebwAV3p8AFd7TABXfRwAV35sAFd/PABXgAwAV4C8AFeCfABXgywAV4NMAFeEHABXhKwAV4VMAFeGXABXh4wAV4hcAFeI3ABXiwwAV4v8AFeMnABXjjwAV4+MAFeRrABXkqwAV5N8AFeU7ABXliwAV5dsAFeX/ABXmLwAV5ncAFebDABXm7wAV50MAFeeLABXnzwAV6BMAFejbABXpkwAV6icAFesDABXrEwAV64MAFev/ABXsYwAV7JsAFezfABXtTwAV7bcAFe4bABXuUwAV7pcAFe7zABXvRwAV778AFe/vABXwVwAV8L8AFfD/ABXxRwAV8c8AFfInABXytwAV8s8AFfNTABXzqwAV8+cAFfQrABX0rwAV9QcAFfVLABX16wAV9osAFfcXABX3LwAV92MAFffnABX4PwAV+JMAFfjnABX5IwAV+UsAFfmfABX6JwAV+ksAFfpzABX7DwAV+z8AFftvABX7lwAV/CsAFfxLABX8jwAV/TcAFf3jABX+SwAV/qcAFf7jABX/LwAV/38AFf/DABYANwAWAHsAFgEfABYBawAWAY8AFgHbABYCJwAWAjcAFgJzABYCtwAWAwMAFgNXABYDqwAWA9sAFgQDABYEOwAWBI8AFgTjABYFYwAWBbcAFgYvABYGUwAWBp8AFgbDABYG/wAWBxcAFhRrABYhfwAWIscAFiN/ABYlawAWJXcAFiWDABYlywAWJfsAFiZDABYmjwAWJrMAFibrABYnIwAWJ18AFieDABYntwAWJ8cAFifvABYoDwAWKGsAFiivABYoswAWKNcAFij7ABYpewAWKdsAFioHABYqOwAWKo8AFirnABYrIwAWK48AFiuzABYr7wAWLCcAFiyLABYs3wAWLScAFi2PABYtzwAWLg8AFi5nABYutwAWLvsAFi9XABYvvwAWL/cAFjArABYwWwAWMI8AFjC/ABYxewAWMbcAFjIHABYyWwAWMr8AFjMfABYzqwAWM/cAFjQrABY0cwAWNT8AFjVfABY1hwAWNfsAFjYzABY2VwAWNsMAFjbjABY3UwAWN8cAFjg7ABY40wAWOScAFjmHABY52wAWOk8AFjqfABY7BwAWOysAFjs/ABY7ZwAWO7sAFjwTABY8fwAWPOMAFj1LABY9qwAWPi8AFj4/ABY+VwAWPqcAFj7rABY/EwAWP18AFj+TABY/ywAWQBsAFkBjABZAswAWQQMAFkF/ABZBywAWQgsAFkJjABZCkwAWQr8AFkL/ABZDQwAWQ2cAFkOvABZD5wAWRDsAFkRfABZEqwAWRNsAFkULABZFPwAWRW8AFkWrABZF6wAWRgcAFkZXABZGewAWRtMAFkc3ABZHewAWSH8AFklfABZJnwAWSesAFko3ABZKYwAWStMAFksDABZLNwAWS48AFkwTABZMdwAWTLMAFk0PABZNQwAWTW8AFk2TABZNtwAWTdMAFk4LABZOgwAWTq8AFk7XABZPQwAWT28AFlALABZQSwAWUIcAFlCnABZQ5wAWUUsAFlFvABZRzwAWUd8AFlI/ABZSfwAWUxMAFlNnABZTmwAWVA8AFlQ7ABZUpwAWVP8AFlUfABZVbwAWVZMAFlXXABZWKwAWVoMAFlbvABZXTwAWV4MAFlgHABZYYwAWWI8AFljDABZZHwAWWXMAFlnbABZaiwAWWvMAFls7ABZbfwAWW8cAFlw/ABZc4wAWXVcAFl2zABZd6wAWXn8AFl67ABZe/wAWXy8AFl9fABZfiwAWX8MAFl//ABZgHwAWYEMAFmCHABZhkwAWYl8AFmM3ABZjewAWY9MAFmQDABZkIwAWZGMAFmSHABZknwAWZN8AFmVzABZlrwAWZdMAFmYnABZmTwAWZrsAFmcLABZnjwAWZ8cAFmfvABZoLwAWaJ8AFmjTABZpHwAWaTsAFmmrABZp/wAWaksAFmr3ABZrWwAWa4cAFmuzABZr8wAWbAsAFmxXABZsdwAWbOsAFm0zABZtowAWbesAFm4LABZuMwAWbmMAFm7TABZvIwAWb2sAFm/DABZv8wAWcFsAFnCjABZxHwAWcXsAFnGjABZxvwAWce8AFnIfABZyPwAWcssAFnLrABZzNwAWc28AFnO/ABZ0FwAWdE8AFnSjABZ04wAWdYMAFnXXABZ2CwAWdlMAFnaLABZ2uwAWdysAFndvABZ3qwAWd+cAFngrABZ4WwAWeIcAFnjnABZ5LwAWeXsAFnnPABZ5/wAWejMAFnpPABZ6kwAWer8AFnsfABZ7ZwAWe7MAFnvzABZ8cwAWfLMAFn0XABZ9cwAWfcMAFn4DABZ+OwAWfmcAFn63ABZ/BwAWf08AFn+LABZ/uwAWgB8AFoBvABaAtwAWgNsAFoEHABaBIwAWgTMAFoFnABaBzwAWgh8AFoJnABaClwAWgssAFoLzABaDOwAWg48AFoPzABaEUwAWhJsAFoTTABaFGwAWhVsAFoV/ABaFzwAWhgcAFoZrABaGqwAWhu8AFodHABaHlwAWh88AFogTABaIZwAWiJMAFojPABaJKwAWiW8AFonXABaKawAWiucAFotHABaLmwAWi8cAFovXABaMJwAWjF8AFoyTABaMvwAWjN8AFo0fABaNUwAWjYcAFo27ABaOAwAWjj8AFo5jABaOkwAWjt8AFo8XABaPZwAWj68AFo/rABaQNwAWkFsAFpCfABaQwwAWkPsAFpE7ABaRdwAWkZ8AFpIHABaSZwAWkr8AFpMbABaTZwAWk88AFpQfABaUXwAWlJcAFpTPABaU+wAWlW8AFpWjABaVzwAWlhsAFpZPABaWewAWlqcAFpbfABaXJwAWl3MAFpe/ABaYGwAWmF8AFpjTABaY/wAWmQ8AFpk7ABaZXwAWmYMAFpmbABaaBwAWmmsAFpq7ABabGwAWm2MAFpvfABacQwAWnKcAFpzrABadFwAWnScAFp13ABadvwAWnhMAFp5rABaetwAWnzcAFp+fABaf6wAWoDcAFqBvABagywAWoPsAFqETABahWwAWoZcAFqHrABaiMwAWom8AFqKrABai7wAWoxsAFqQDABak0wAWpQMAFqUbABalYwAWpZ8AFqXPABamMwAWpn8AFqbLABanCwAWp6sAFqgTABaoTwAWqIsAFqjbABapMwAWqVsAFqm7ABaqPwAWqocAFqrnABarJwAWq3MAFqvHABar8wAWrBcAFqxzABas3wAWrTcAFq2jABat7wAWrg8AFq5XABauvwAWrxMAFq9jABavewAWr7sAFrATABawiwAWsKsAFrDnABaxAwAWsTMAFrGDABaxywAWsh8AFrJXABayjwAWsssAFrL3ABazUwAWs6sAFrPHABa0EwAWtD8AFrR3ABa0uwAWtQsAFrVzABa1rwAWtecAFrYfABa2SwAWtrsAFrc3ABa3hwAWt8MAFrfnABa4KwAWuFcAFriDABa4rwAWuNsAFrkLABa5SwAWuY8AFrnvABa6awAWuqsAFrsHABa7XwAWu8MAFrwTABa8jwAWvQcAFr17ABa95wAWvh8AFr6jABa+xwAWvv8AFr8vABa/VwAWwAsAFsBDABbAnwAWwNsAFsErABbBXwAWwZ8AFsH7ABbCRwAWwqMAFsLvABbDOwAWw3cAFsO3ABbEBwAWxCsAFsRfABbEtwAWxQMAFsUzABbFbwAWxZ8AFsXTABbGKwAWxk8AFsZzABbGvwAWxvMAFsczABbHXwAWx4sAFsevABbH0wAWx/MAFshDABbIXwAWyKMAFsj3ABbJRwAWyX8AFsoXABbKNwAWylcAFsqfABbK1wAWy1cAFsvHABbL6wAWzE8AFsynABbM7wAWzWMAFs23ABbN5wAWzkMAFs6nABbPBwAWz1cAFs+3ABbQOwAW0HsAFtDrABbRPwAW0Y8AFtHTABbSOwAW0pcAFtLLABbTAwAW02cAFtPzABbUcwAW1OcAFtUPABbVTwAW1XsAFtXjABbWIwAW1oMAFtabABbW7wAW13MAFteHABbX0wAW2BsAFthHABbYgwAW2NMAFtkvABbZlwAW2b8AFtoDABbaTwAW2q8AFtrzABbbcwAW28MAFtw7ABbcfwAW3KcAFtzbABbc9wAW3Q8AFt1rABbdlwAW3eMAFt5DABbehwAW3sMAFt7XABbfBwAW31sAFt+XABbfwwAW3/sAFuA7ABbgbwAW4MMAFuEPABbhOwAW4ZMAFuHrABbiLwAW4nsAFuKnABbjBwAW41cAFuPDABbkCwAW5FMAFuSnABbkwwAW5S8AFuV/ABblvwAW5f8AFuYrABbmpwAW5x8AFud3ABbntwAW5+MAFugLABboLwAW6FsAFuh7ABbogwAW6MsAFukfABbpTwAW6YMAFun/ABbqXwAW6vcAFus3ABbrdwAW68cAFuwrABbscwAW7J8AFu0bABbtewAW7b8AFu4zABbuXwAW7qcAFu7LABbvNwAW78sAFvBLABbwjwAW8PcAFvE/ABbxwwAW8e8AFvJLABbyiwAW8s8AFvMfABbzRwAW858AFvP/ABb0TwAW9LMAFvUzABb1+wAW9j8AFvarABb24wAW9xsAFvcrABb3iwAW98cAFvgbABb45wAW+Q8AFvlfABb5hwAW+hsAFvpbABb6nwAW+vMAFvs/ABb7kwAW+9cAFvwnABb8cwAW/MsAFv0bABb9ZwAW/bMAFv5HABb+7wAW/08AFv+vABb/1wAXABcAFwBnABcAywAXAT8AFwG3ABcB6wAXAjsAFwJjABcCqwAXAw8AFwM7ABcDkwAXA8MAFwQjABcEbwAXBLsAFwT3ABcFGwAXBSsAFwV7ABcF9wAXBl8AFwabABcG4wAXBysAFwdrABcHqwAXB/cAFwhHABcIjwAXCN8AFwmTABcJ6wAXClMAFwrTABcLQwAXC7MAFwwzABcMowAXDMcAFwzvABcNCwAXDSsAFw1rABcNlwAXDb8AFw4nABcOXwAXDq8AFw8DABcPPwAXD4cAFxATABcQcwAXEKcAFxELABcRewAXEa8AFxH/ABcSVwAXEq8AFxMPABcTQwAXE5sAFxQfABcUowAXFNcAFxUbABcVVwAXFZcAFxXTABcWRwAXFocAFxcXABcXdwAXF88AFxgfABcYVwAXGIcAFxjbABcZNwAXGV8AFxl7ABcZrwAXGdcAFxoLABcaQwAXGmcAFxqnABca1wAXGy8AFxtvABcbmwAXG9sAFxv/ABccNwAXHKMAFxzbABcdDwAXHXMAFx3TABcePwAXHmsAFx6XABceowAXHq8AFx8HABcfkwAXIBcAFyBHABcgcwAXIJcAFyCjABcguwAXISsAFyFHABchdwAXIX8AFyGHABchvwAXIf8AFyInABciVwAXIrcAFyMnABcjdwAXI58AFyQ7ABckZwAXJI8AFyUTABclawAXJasAFyXfABcmDwAXJkMAFyZzABcmmwAXJ1sAFyd/ABcnswAXJ/sAFyiDABco3wAXKTMAFylnABcpywAXKfsAFyqLABcq+wAXKxsAFytTABcruwAXLBcAFyyvABctEwAXLWsAFy3LABcuIwAXLn8AFy67ABcu6wAXL0sAFy+fABcv1wAXMAMAFzA3ABcw4wAXMV8AFzG/ABcyNwAXMl8AFzKPABcyswAXMtcAFzMDABczRwAXM4sAFzPXABc0AwAXNIsAFzS7ABc1HwAXNXMAFzW7ABc2HwAXNrMAFzdXABc32wAXOMsAFzkTABc5iwAXOecAFzpnABc64wAXO0MAFzubABc8FwAXPFcAFzyzABc9FwAXPV8AFz23ABc+LwAXPn8AFz6HABc+rwAXPtsAFz8XABc/NwAXP6MAF0AfABdAewAXQUMAF0F7ABdBmwAXQesAF0IfABdCTwAXQqcAF0L7ABdDEwAXQ2cAF0N/ABdDqwAXQ+cAF0Q3ABdEXwAXRJMAF0S7ABdFAwAXRQ8AF0UbABdFJwAXRUsAF0VnABdFjwAXRbsAF0XjABdGLwAXRkMAF0ZPABdGnwAXRrsAF0bzABdHBwAXRyMAF0dHABdHhwAXR68AF0fXABdH+wAXSDcAF0h7ABdIuwAXSWsAF0mbABdJ0wAXSecAF0ovABdKawAXSpMAF0rbABdK+wAXS2cAF0v/ABdMPwAXTEcAF0yzABdM7wAXTXcAF03jABdOIwAXTlMAF06nABdPIwAXT2MAF093ABdPswAXT+MAF1AvABdQewAXUMMAF1EPABdRSwAXUYcAF1HXABdSPwAXUoMAF1LHABdTDwAXU1MAF1OvABdT6wAXVC8AF1R7ABdUywAXVQ8AF1VzABdVvwAXVecAF1YPABdWMwAXVlsAF1ZzABdWtwAXVtcAF1b3ABdXGwAXV1MAF1drABdXiwAXV7MAF1fTABdX+wAXWEMAF1iDABdY9wAXWUsAF1mbABdZ5wAXWi8AF1qzABdazwAXWxMAF1tvABdbowAXW+cAF1wHABdcKwAXXFsAF1yjABdc5wAXXRsAF10rABdddwAXXbsAF13rABdebwAXXtcAF18vABdffwAXX8cAF2APABdgNwAXYIcAF2CzABdhAwAXYR8AF2FTABdhcwAXYasAF2H/ABdiSwAXYp8AF2L/ABdjRwAXY3MAF2OHABdj4wAXZA8AF2RDABdkswAXZQMAF2UXABdlIwAXZWcAF2WbABdl9wAXZhcAF2YzABdmrwAXZxMAF2dfABdnmwAXZ/cAF2hDABdojwAXaN8AF2j7ABdpZwAXadsAF2njABdqDwAXaj8AF2pXABdqkwAXatcAF2svABdrawAXa4cAF2vrABdsBwAXbEMAF2x/ABdsuwAXbRcAF21jABdttwAXbf8AF25DABduowAXby8AF29zABdvjwAXb8MAF2/3ABdwHwAXcDcAF3BTABdwbwAXcKMAF3DXABdw7wAXcSMAF3E7ABdxUwAXccMAF3IDABdydwAXcq8AF3K7ABdy2wAXcwsAF3N/ABdzlwAXc/8AF3QbABd0PwAXdFcAF3TjABd1QwAXdWcAF3WPABd1twAXdbsAF3XrABd2GwAXdkMAF3a7ABd21wAXdv8AF3cfABd3qwAXd7sAF3fTABd34wAXeA8AF3hDABd4pwAXeQsAF3lnABd5rwAXecsAF3njABd6BwAXekcAF3qHABd6jwAXepcAF3qvABd67wAXevcAF3sLABd7IwAXe2MAF3trABd7gwAXe5sAF3vTABd8SwAXfGsAF3yDABd8qwAXfNMAF3zvABd9CwAXfRsAF30rABd9WwAXfW8AF32HABd9pwAXfccAF33zABd9/wAXfgsAF34fABd+MwAXfksAF35nABd+fwAXfscAF37bABd+8wAXfwsAF38jABd/OwAXf3MAF3+3ABd/vwAXf/sAF4AbABeAcwAXgJsAF4CzABeA8wAXgQsAF4EjABeBSwAXgW8AF4GTABeBswAXgdMAF4H3ABeCGwAXgk8AF4J/ABeCmwAXgrcAF4LfABeDBwAXg0MAF4N/ABeDywAXg/8AF4RPABeErwAXhPcAF4VTABeFdwAXhdsAF4YvABeGewAXhrcAF4bvABeHBwAXhxMAF4dPABeHlwAXh78AF4fjABeIFwAXiD8AF4hrABeIowAXiQ8AF4lDABeJkwAXid8AF4pTABeKrwAXiv8AF4tbABeLrwAXjAMAF4xfABeMvwAXjQMAF40/ABeNowAXjh8AF453ABeOzwAXjyMAF493ABeP3wAXkC8AF5CTABeQ4wAXkUcAF5F7ABeRzwAXkiMAF5KLABeS8wAXk1sAF5PXABeUKwAXlH8AF5TLABeVFwAXlYMAF5XvABeWVwAXltMAF5dTABeXzwAXmF8AF5jPABeZMwAXmX8AF5nfABeaRwAXmq8AF5sjABebfwAXm98AF5wzABechwAXnM8AF50fABeddwAXncMAF54vABeeowAXnwcAF59vABef2wAXoFMAF6DPABehZwAXob8AF6H/ABeiNwAXonsAF6K3ABejNwAXo5MAF6PnABekCwAXpCcAF6SDABekuwAXpO8AF6VTABelrwAXpfsAF6Y/ABemfwAXprcAF6cDABenRwAXp4sAF6fHABeoCwAXqEcAF6iTABeo1wAXqScAF6lvABepowAXqc8AF6n7ABeqHwAXqnMAF6q/ABerKwAXq48AF6vXABesFwAXrF8AF6yfABes4wAXrR8AF61jABetnwAXre8AF64vABeuZwAXrrMAF67zABevKwAXr3cAF6+bABevtwAXsB8AF7CHABewywAXsQcAF7FLABexhwAXsd8AF7IvABeyhwAXstcAF7MvABezfwAXs+sAF7RPABe0kwAXtM8AF7UTABe1TwAXtYsAF7W/ABe1+wAXti8AF7aLABe23wAXtzsAF7ePABe35wAXuDcAF7ibABe5CwAXuXMAF7nfABe6QwAXursAF7sbABe7cwAXu8cAF7wTABe8TwAXvIMAF7znABe9LwAXvX8AF73PABe+GwAXvl8AF76vABe/AwAXv18AF7/LABfAPwAXwIMAF8C/ABfBAwAXwT8AF8F3ABfBpwAXwecAF8IfABfCZwAXwqcAF8LjABfDFwAXw3MAF8PHABfEKwAXxIcAF8TbABfFJwAXxW8AF8W/ABfGEwAXxnMAF8bXABfHRwAXx68AF8fbABfIRwAXyHMAF8ivABfI6wAXyQ8AF8mDABfJ7wAXyjMAF8qTABfKwwAXywsAF8tvABfL2wAXzHcAF80TABfNYwAXzbMAF84HABfOTwAXzp8AF863ABfOywAXztsAF873ABfPEwAXzy8AF88/ABfPUwAXz2MAF8+HABfPjwAXz8cAF8/rABfQGwAX0E8AF9CjABfQxwAX0OcAF9ELABfRFwAX0V8AF9GDABfRzwAX0hMAF9JjABfSvwAX0usAF9NnABfTrwAX09cAF9QbABfUcwAX1McAF9UnABfVbwAX1bsAF9YrABfWYwAX1rsAF9cHABfXQwAX148AF9fTABfYGwAX2HcAF9jDABfZJwAX2VcAF9l3ABfZ8wAX2g8AF9orABfaRwAX2msAF9qDABfaowAX2ucAF9tHABfbcwAX288AF9xDABfciwAX3NcAF90PABfdTwAX3aMAF94XABfecwAX3s8AF98XABffXwAX35MAF9/bABfgTwAX4HcAF+CjABfhBwAX4T8AF+GHABfh0wAX4hsAF+I/ABfilwAX4vsAF+MnABfjXwAX48sAF+PnABfkDwAX5CcAF+Q/ABfkawAX5J8AF+TLABflBwAX5VMAF+WPABfl0wAX5hsAF+ZvABfmswAX5wsAF+c7ABfngwAX598AF+grABfoewAX6NMAF+k7ABfpYwAX6ZsAF+m7ABfp3wAX6e8AF+o7ABfqjwAX6wMAF+tTABfrdwAX67sAF+v/ABfsIwAX7IMAF+zLABftDwAX7UsAF+2HABft2wAX7h8AF+5nABfutwAX7vMAF+8LABfvPwAX718AF++bABfv3wAX8AsAF/BfABfwzwAX8QcAF/FLABfxuwAX8fMAF/ILABfyIwAX8m8AF/LXABfzHwAX82sAF/OfABfz8wAX9GMAF/SjABf01wAX9QsAF/VDABf1bwAX9ZMAF/XrABf2LwAX9mcAF/aTABf3BwAX918AF/evABf4CwAX+GMAF/irABf44wAX+TsAF/mLABf52wAX+gsAF/pTABf6fwAX+p8AF/rfABf7IwAX+2cAF/uXABf7uwAX+/MAF/w/ABf8mwAX/PsAF/1HABf9gwAX/a8AF/3TABf95wAX/j8AF/5HABf+6wAX/ysAF/+DABf/1wAYAG8AGADDABgBLwAYAacAGAHzABgCSwAYAoMAGAKfABgC2wAYAwsAGAOfABgD3wAYBDsAGATPABgE+wAYBSsAGAVTABgFewAYBZsAGAXLABgGCwAYBoMAGAczABgHawAYB8sAGAhXABgIiwAYCLMAGAjrABgJHwAYCUcAGAlrABgJnwAYCcsAGAnrABgKewAYCtsAGAtDABgL8wAYDIMAGAy/ABgM9wAYDasAGA3bABgOYwAYDqcAGA7nABgPGwAYD18AGBAfABgQdwAYEJ8AGBDLABgRDwAYEZ8AGBHfABgSLwAYEqMAGBLDABgTJwAYE4sAGBPXABgUDwAYFE8AGBTHABgVFwAYFYcAGBW/ABgV2wAYFlcAGBb3ABgXYwAYF/cAGBhvABgY2wAYGVsAGBnvABgaWwAYGt8AGBtjABgcDwAYHIMAGBz7ABgdnwAYHiMAGB6fABge/wAYH6MAGCArABggswAYIU8AGCHfABgiGwAYIqcAGCMfABgjPwAYI98AGCRfABgk2wAYJXcAGCXjABgmEwAYJi8AGCZTABgmfwAYJp8AGCbHABgm8wAYJycAGCdTABgncwAYJ48AGCe3ABgnzwAYJ/cAGCgbABgoUwAYKIsAGCijABgoywAYKOsAGCkXABgpTwAYKfMAGCojABgqnwAYKtMAGCsvABgrdwAYK58AGCvbABgsIwAYLHMAGCyzABgs4wAYLTcAGC1zABgtpwAYLdMAGC4XABguVwAYLqMAGC7XABgvBwAYL2MAGC+bABgv9wAYMFsAGDB3ABgwvwAYMQMAGDErABgxYwAYMYcAGDGfABgxywAYMf8AGDJHABgycwAYMqsAGDLTABgzGwAYM0sAGDOnABg0EwAYNH8AGDT7ABg1RwAYNaMAGDX/ABg2MwAYNo8AGDa3ABg21wAYNwMAGDczABg3TwAYN3sAGDiTA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BlXMwAZV08AGVenABlYBwAZWC8AGVh/ABlYqwAZWMsAGVj/ABlZPwAZWWMAGVl/ABlZrwAZWf8AGVoTABlaMwAZWnMAGVqXABlauwAZWt8AGVsLABlbJwAZW1MAGVt3ABlbqwAZW7sAGVvjABlb+wAZXBsAGVxXABlcnwAZXMsAGVzvABldKwAZXVsAGV2LABldnY3JlYXRlQ29tcGlsZXJBcmdQYXJzZXJydW5Db21waWxlcnN1Y2Nlc3NFeGl0Q29kZV9hcmdQYXJzZXJhZGRPcHRpb25jb21wb25lbnQtbmFtZWhlbHBOYW1lIG9mIHRoZSBjb21wb25lbnRkYXRhLWRpck5hbWUgb2YgdGhlIHN1YmRpcmVjdG9yeSBvZiAvL2RhdGEgZm9yIG91dHB1dCBmaWxlc21hbmlmZXN0UGF0aCB0byBvdXRwdXQgRnVjaHNpYSBwYWNrYWdlIG1hbmlmZXN0X3VzYWdlVXNhZ2U6IGNvbXBpbGVyIFtvcHRpb25zXSBpbnB1dC5kYXJ0CgpPcHRpb25zOgp1c2FnZQptYWluYXJnczphc3luY19jb21wbGV0ZXI6cmV0dXJuX3ZhbHVlOmFzeW5jX3N0YWNrX3RyYWNlOmFzeW5jX29wX3RoZW46YXN5bmNfb3BfZXJyb3I6YXdhaXRfanVtcF92YXI6YXdhaXRfY3R4X3ZhcjpzYXZlZF90cnlfY29udGV4dF92YXIwOmFzeW5jX29wOnJlc3VsdDpleGNlcHRpb246c3RhY2tfdHJhY2VvcHRpb25zcGFyc2VyZXN0aXNOb3RFbXB0eU11c3Qgc3BlY2lmeSBpbnB1dC5kYXJ0ZXJyb3JFUlJPUjogY29tcGlsZXJFeGl0Q29kZT09b3V0cHV0W11kYXRhRGlyY29udGFpbnNtYW5pZmVzdEZpbGVuYW1lY29tcGxldGVFcnJvcnN0YXJ0ZnV0dXJlY3JlYXRlTWFuaWZlc3RwYWNrYWdlTWFuaWZlc3RGaWxlbmFtZS1wYWNrYWdlc3JlYWRBc0xpbmVzcGFja2FnZXNyZW1vdmVhZGRwYWNrYWdlTWFuaWZlc3RvcGVuV3JpdGVrZXJuZWxMaXN0RmlsZW5hbWUuZGlscGxpc3RrZXJuZWxMaXN0OnN5bmMtZm9yLWl0ZXJhdG9yaXRlcmF0b3Jtb3ZlTmV4dHBhY2thZ2VjdXJyZW50ZmlsZW5hbWVJblBhY2thZ2UuZGlscGZpbGVuYW1lSW5CdWlsZC13cml0ZWRhdGEvLz1jbG9zZWZyYW1ld29ya1ZlcnNpb25GaWxlbmFtZS5mcmFtZXdvcmt2ZXJzaW9uZnJhbWV3b3JrVmVyc2lvbmNvbGxlY3Rpb25mbHV0dGVybWV0YXR5cGVkX2RhdGF2ZWN0b3JfbWF0aGRpZ2VzdHJlYWRBc0J5dGVzYnl0ZXNjb252ZXJ0L2FwcC5kaWxwbGlzdD0vYXBwLmZyYW1ld29ya3ZlcnNpb249bmV3QXJnUmVzdWx0c25ld09wdGlvbnZtLmtlcm5lbF9mcm9udF9lbmRGaWxlSU9TaW5rSU9FeGNlcHRpb25BcmdQYXJzZXJBcmdSZXN1bHRzTXVsdGlSb290RmlsZVN5c3RlbU11bHRpUm9vdEZpbGVTeXN0ZW1FbnRpdHlDb21waWxlckNvbnRleHRDb21waWxlck9wdGlvbnNDb21waWxlclJlc3VsdERpYWdub3N0aWNNZXNzYWdlRGlhZ25vc3RpY01lc3NhZ2VIYW5kbGVyRmlsZVN5c3RlbUZpbGVTeXN0ZW1FbnRpdHlGaWxlU3lzdGVtRXhjZXB0aW9uUHJvY2Vzc2VkT3B0aW9uc1NldmVyaXR5U3RhbmRhcmRGaWxlU3lzdGVtZ2V0TWVzc2FnZVVyaWtlcm5lbEZvclByb2dyYW1wYXJzZUV4cGVyaW1lbnRhbEFyZ3VtZW50c3BhcnNlRXhwZXJpbWVudGFsRmxhZ3NwcmludERpYWdub3N0aWNNZXNzYWdlcmVzb2x2ZUlucHV0VXJpQ2xhc3NIaWVyYXJjaHlDb21wb25lbnRMaWJyYXJ5UmVmZXJlbmNlQmluYXJ5UHJpbnRlckxpbWl0ZWRCaW5hcnlQcmludGVyQ29yZVR5cGVzVGFyZ2V0VGFyZ2V0RmxhZ3NnZXRUYXJnZXRCeXRlY29kZVNpemVTdGF0aXN0aWNzZ2VuZXJhdGVCeXRlY29kZWNyZWF0ZUZyZXNoQ29tcG9uZW50V2l0aEJ5dGVjb2RlQnl0ZWNvZGVPcHRpb25zSHR0cEF3YXJlRmlsZVN5c3RlbWluc3RhbGxBZGRpdGlvbmFsVGFyZ2V0c2RldmlydHVhbGl6YXRpb250cmFuc2Zvcm1Db21wb25lbnRtaXhpbl9kZWR1cGxpY2F0aW9ubm9fZHluYW1pY19pbnZvY2F0aW9uc19hbm5vdGF0b3Jwcm90b2J1Zl90cmVlX3NoYWtlcmdsb2JhbFR5cGVGbG93b2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNjYWxsX3NpdGVfYW5ub3RhdG9ydW5yZWFjaGFibGVfY29kZV9lbGltaW5hdGlvbktlcm5lbENvbXBpbGF0aW9uUmVzdWx0c2NvbXBvbmVudGxvYWRlZExpYnJhcmllc2NsYXNzSGllcmFyY2h5Y29yZVR5cGVzY29tcGlsZWRTb3VyY2VzRXJyb3JEZXRlY3RvcnByZXZpb3VzRXJyb3JIYW5kbGVyaGFzQ29tcGlsYXRpb25FcnJvcnNjYWxsbWVzc2FnZXNldmVyaXR5U2V2ZXJpdHkuZXJyb3JFcnJvclByaW50ZXJjb21waWxhdGlvbk1lc3NhZ2Vzc291cmNlVXJpW109cHJpbnRDb21waWxhdGlvbk1lc3NhZ2Vzc29ydGVkVXJpc2tleXN0b0xpc3Rzb3J0YWJjb21wYXJlVG9iYWRVc2FnZUV4aXRDb2RlY29tcGlsZVRpbWVFcnJvckV4aXRDb2RlZGVjbGFyZUNvbXBpbGVyT3B0aW9uc3BsYXRmb3JtUGF0aCB0byB2bV9wbGF0Zm9ybV9zdHJvbmcuZGlsbCBmaWxlZGVmYXVsdHNUb1BhdGggdG8gLnBhY2thZ2VzIGZpbGVhYmJyb1BhdGggdG8gcmVzdWx0aW5nIGRpbGwgZmlsZWFkZEZsYWdhb3RQcm9kdWNlIGtlcm5lbCBmaWxlIGZvciBBT1QgY29tcGlsYXRpb24gKGVuYWJsZXMgZ2xvYmFsIHRyYW5zZm9ybWF0aW9ucykuZGVwZmlsZVBhdGggdG8gb3V0cHV0IE5pbmphIGRlcGZpbGVsaW5rLXBsYXRmb3JtSW5jbHVkZSBwbGF0Zm9ybSBpbnRvIHJlc3VsdGluZyBrZXJuZWwgZmlsZS5lbWJlZC1zb3VyY2VzRW1iZWQgc291cmNlIGZpbGVzIGluIHRoZSBnZW5lcmF0ZWQga2VybmVsIGNvbXBvbmVudGFkZE11bHRpT3B0aW9uZmlsZXN5c3RlbS1yb290QSBiYXNlIHBhdGggZm9yIHRoZSBtdWx0aS1yb290IHZpcnR1YWwgZmlsZSBzeXN0ZW0uIElmIG11bHRpLXJvb3QgZmlsZSBzeXN0ZW0gaXMgdXNlZCwgdGhlIGlucHV0IHNjcmlwdCBhbmQgLnBhY2thZ2VzIGZpbGUgc2hvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBVUkkuZmlsZXN5c3RlbS1zY2hlbWVUaGUgVVJJIHNjaGVtZSBmb3IgdGhlIG11bHRpLXJvb3QgdmlydHVhbCBmaWxlc3lzdGVtLnRhcmdldFRhcmdldCBtb2RlbCB0aGF0IGRldGVybWluZXMgd2hhdCBjb3JlIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlYWxsb3dlZHZtZmx1dHRlcl9ydW5uZXJkYXJ0X3J1bm5lcnRmYUVuYWJsZSBnbG9iYWwgdHlwZSBmbG93IGFuYWx5c2lzIGFuZCByZWxhdGVkIHRyYW5zZm9ybWF0aW9ucyBpbiBBT1QgbW9kZS5wcm90b2J1Zi10cmVlLXNoYWtlckVuYWJsZSBwcm90b2J1ZiB0cmVlIHNoYWtlciB0cmFuc2Zvcm1hdGlvbiBpbiBBT1QgbW9kZS5kZWZpbmVEVGhlIHZhbHVlcyBmb3IgdGhlIGVudmlyb25tZW50IGNvbnN0YW50cyAoZS5nLiAtRGtleT12YWx1ZSkuZW5hYmxlLWFzc2VydHNXaGV0aGVyIGFzc2VydHMgd2lsbCBiZSBlbmFibGVkLnNwbGl0LW91dHB1dC1ieS1wYWNrYWdlc1NwbGl0IHJlc3VsdGluZyBrZXJuZWwgZmlsZSBpbnRvIG11bHRpcGxlIGZpbGVzIChvbmUgcGVyIHBhY2thZ2UpLmdlbi1ieXRlY29kZUdlbmVyYXRlIGJ5dGVjb2RlYnl0ZWNvZGUtb3B0aW9uc1NwZWNpZnkgb3B0aW9ucyBmb3IgYnl0ZWNvZGUgZ2VuZXJhdGlvbjp2YWx1ZUhlbHBvcHQxLG9wdDIsLi4uYWxsb3dlZEhlbHBkcm9wLWFzdEluY2x1ZGUgb25seSBieXRlY29kZSBpbnRvIHRoZSBvdXRwdXQgZmlsZWVuYWJsZS1leHBlcmltZW50Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZXhwZXJpbWVudGFsIGZlYXR1cmVzIHRvIGVuYWJsZS5obmVnYXRhYmxlUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UuYXJnUGFyc2VyYWxsb3dUcmFpbGluZ09wdGlvbnNwbGF0Zm9ybUtlcm5lbGxlbmd0aGlucHV0c2luZ2xlb3V0cHV0RmlsZU5hbWUuZGlsbHRhcmdldE5hbWVmaWxlU3lzdGVtU2NoZW1lZmlsZVN5c3RlbVJvb3RzbGlua1BsYXRmb3JtZW1iZWRTb3VyY2VzZ2VuQnl0ZWNvZGVkcm9wQVNUZW5hYmxlQXNzZXJ0c3VzZVByb3RvYnVmVHJlZVNoYWtlcnNwbGl0T3V0cHV0QnlQYWNrYWdlc2V4cGVyaW1lbnRhbEZsYWdzZW52aXJvbm1lbnREZWZpbmVzRXJyb3I6IC0tbm8tbGluay1wbGF0Zm9ybSBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCAtLWFvdEVycm9yOiAtLXNwbGl0LW91dHB1dC1ieS1wYWNrYWdlcyBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCAtLWFvdGJ5dGVjb2RlT3B0aW9uc2VtaXRTb3VyY2VGaWxlc3BhcnNlQ29tbWFuZExpbmVGbGFnc0ZhaWxlZCB0byBjcmVhdGUgZnJvbnQtZW5kIHRhcmdldCAuZmlsZVN5c3RlbXBhY2thZ2VzVXJpcGxhdGZvcm1LZXJuZWxVcmlyZXNvbHZlVXJpbGlua2VkRGVwZW5kZW5jaWVzbWFpblVyaWVycm9yUHJpbnRlcmVycm9yRGV0ZWN0b3Jjb21waWxlck9wdGlvbnNzZGtTdW1tYXJ5cGFja2FnZXNGaWxlVXJpb25FcnJvcm9uRGlhZ25vc3RpY21lbWJlZFNvdXJjZVRleHRpbmNsdWRlUGxhdGZvcm11c2VHbG9iYWxUeXBlRmxvd0FuYWx5c2lzcmVzdWx0c3Nob3dCeXRlY29kZVNpemVTdGF0aXN0aWNzc2lua3ByaW50ZXJ3cml0ZUNvbXBvbmVudEZpbGVjb21waWxlVG9LZXJuZWxzb3VyY2Vjb21waWxlclJlc3VsdHVyaVRvU291cmNlbG9hZGVkQ29tcG9uZW50c3Nka0NvbXBvbmVudGxpYnJhcmllc2xpYnJhcnloaWVyYXJjaHljcmVhdGVMb2FkZWRMaWJyYXJpZXNTZXRjbGlic2V0Vk1FbnZpcm9ubWVudERlZmluZXNkYXJ0LnZtLnByb2R1Y3R0cnVlZGFydC5kZXZlbG9wZXIuY2F1c2FsX2FzeW5jX3N0YWNrc2ZhbHNlZGFydC5pc1ZNZXh0cmFSZXF1aXJlZExpYnJhcmllc2xpYnJhcnlVcmlzY2hlbWVkYXJ0cGF0aHN0YXJ0c1dpdGhfZGFydC5saWJyYXJ5LmRhcnQubGlicmFyeS5jb3JlcnVuR2xvYmFsVHJhbnNmb3JtYXRpb25zUHJvdG9idWYgdHJlZSBzaGFrZXIgcmVxdWlyZXMgdHlwZSBmbG93IGFuYWx5c2lzICgtLXRmYSlpZ25vcmVBbWJpZ3VvdXNTdXBlcnR5cGVzY2xzb25BbWJpZ3VvdXNTdXBlcnR5cGVzcnVuV2l0aEZyb250RW5kQ29tcGlsZXJDb250ZXh0VGFjdGlvbnByb2Nlc3NlZE9wdGlvbnNpbnB1dHNjb250ZXh0YWRkQWxscGFyc2VDb21tYW5kTGluZURlZmluZXNkRmxhZ3NkZmxhZ2VxdWFsc1NpZ25JbmRleGluZGV4T2Y8PmtleXN1YnN0cmluZ3ZhbHVlK1RoZSBlbnZpcm9ubWVudCBjb25zdGFudCBvcHRpb25zIG11c3QgaGF2ZSBhIGtleSAod2FzOiAiIiljcmVhdGVGcm9udEVuZFRhcmdldHRyYWNrV2lkZ2V0Q3JlYXRpb250YXJnZXRGbGFnc2NyZWF0ZUZyb250RW5kRmlsZVN5c3RlbW11bHRpUm9vdEZpbGVTeXN0ZW1TY2hlbWVtdWx0aVJvb3RGaWxlU3lzdGVtUm9vdHNhbGxvd0h0dHByb290VXJpc3Jvb3Rhc0ZpbGVVcml1cmlmc2VlbnRpdHlGb3JVcmlkZWxlZ2F0ZWNvbnZlcnRUb1BhY2thZ2VVcmk6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMXVyaVN0cmluZ3RvU3RyaW5ndG9GaWxlUGF0aGxpbmVpc0VtcHR5I2NvbG9uOnVuYXJ5LXBhY2thZ2VOYW1lcGFja2FnZVBhdGhyZXNvbHZlcGFja2FnZTp3cml0ZU91dHB1dFNwbGl0QnlQYWNrYWdlc2NvbXBpbGF0aW9uUmVzdWx0c2ZpbGVuYW1lcGFydENvbXBvbmVudG1haW5GaXJzdHBhY2thZ2VzTGlzdHdyaXRlbG5wYWNrYWdlRm9yaW1wb3J0VXJpcGF0aFNlZ21lbnRzZmlyc3Rzb3J0Q29tcG9uZW50Y29tcHV0ZUNhbm9uaWNhbE5hbWVzYWRkaXRpb25hbEV4cG9ydHNjYW5vbmljYWxOYW1lZm9yRWFjaFBhY2thZ2VwdXRJZkFic2VudG1haW5MaWJyYXJpZXNtYWluTWV0aG9kcHJvYmxlbXNBc0pzb25fZXNjYXBlUGF0aHJlcGxhY2VBbGxcXFwgXCB3cml0ZURlcGZpbGVmaWxlZGVwb3JnLWRhcnRsYW5nLXNka2NyZWF0ZUZhck1hbmlmZXN0X29wdGlvbnNfY29tbWFuZHNjb21tYW5kc19vcHRpb25zQW5kU2VwYXJhdG9yc3VzYWdlTGluZUxlbmd0aF9yZWRpcmVjdGluZyNhbGxvd3NBbnl0aGluZ2FsbG93QW55dGhpbmcjcmVkaXJlY3RpbmdfZmFjdG9yeWFkZENvbW1hbmRuYW1lcGFyc2VyY29udGFpbnNLZXlEdXBsaWNhdGUgY29tbWFuZCAiIi5jYWxsYmFja2hpZGVfYWRkT3B0aW9uT3B0aW9uVHlwZS5mbGFnVXNlIGFkZE11bHRpT3B0aW9uKCkgaW5zdGVhZC5hbGxvd011bHRpcGxlc3BsaXRDb21tYXNzcGxpdENvbW1hcyBtYXkgbm90IGJlIHNldCBpZiBhbGxvd011bHRpcGxlIGlzIGZhbHNlLk9wdGlvblR5cGUubXVsdGlwbGVPcHRpb25UeXBlLnNpbmdsZXR5cGVEdXBsaWNhdGUgb3B0aW9uICJleGlzdGluZ2ZpbmRCeUFiYnJldmlhdGlvbkFiYnJldmlhdGlvbiAiIiBpcyBhbHJlYWR5IHVzZWQgYnkgIm9wdGlvbmFkZFNlcGFyYXRvcnRleHRnZXRVc2FnZVJlcGxhY2VkIHdpdGggZ2V0IHVzYWdlLiBnZXRVc2FnZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBhcmdzIDEuMGxpbmVMZW5ndGhnZW5lcmF0ZWdldERlZmF1bHRObyBvcHRpb24gbmFtZWQgdmFsdWVzZmlyc3RXaGVyZW9yRWxzZUFyZ1BhcnNlckV4Y2VwdGlvbl9wYXJzZXJfcGFyc2VkY29tbWFuZGFyZ3VtZW50c0NvdWxkIG5vdCBmaW5kIGFuIG9wdGlvbiBuYW1lZCAiZ2V0T3JEZWZhdWx0cmVzdWx0Zm9yRWFjaHdhc1BhcnNlZHBhcnNlZE9wdGlvbl9pbnZhbGlkQ2hhcnNbIFx0XHJcbiInXFwvXU5hbWUgY2Fubm90IGJlIGVtcHR5Lk5hbWUgIGNhbm5vdCBzdGFydCB3aXRoICItIi5oYXNNYXRjaE5hbWUgIiIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLkFiYnJldmlhdGlvbiBtdXN0IGJlIG51bGwgb3IgaGF2ZSBsZW5ndGggMS5BYmJyZXZpYXRpb24gY2Fubm90IGJlICItIi5BYmJyZXZpYXRpb24gaXMgYW4gaW52YWxpZCBjaGFyYWN0ZXIuYWJicmV2aWF0aW9uVXNlIGFiYnIgaW5zdGVhZC5kZWZhdWx0VmFsdWVVc2UgZGVmYXVsdHNUbyBpbnN0ZWFkLmlzRmxhZ2lzU2luZ2xlaXNNdWx0aXBsZU9wdGlvblR5cGVmbGFnRkxBR1VzZSBPcHRpb25UeXBlLmZsYWcgaW5zdGVhZC5TSU5HTEVVc2UgT3B0aW9uVHlwZS5zaW5nbGUgaW5zdGVhZC5tdWx0aXBsZU1VTFRJUExFVXNlIE9wdGlvblR5cGUubXVsdGlwbGUgaW5zdGVhZC5EaWdlc3RvdGhlcm5taXNtYXRjaGl8Xmhhc2hDb2RlaGFzaGVuY29kZUhhc2hibG9ja1NpemVkYXRhaW5uZXJTaW5rb3V0ZXJTaW5rc3RhcnRDaHVua2VkQ29udmVyc2lvbkhtYWNfaGFzaF9rZXlzZXRSYW5nZV9IbWFjU2lua19vdXRlclNpbmtfaW5uZXJSZXN1bHRTaW5rX2lubmVyU2lua19pc0Nsb3NlZHBhZGRpbmdITUFDIGlzIGNsb3NlZGFkZFNsaWNlZW5kaXNMYXN0TUQ1Kl9NRDVTaW5rMTczMjU4NDE5MzQwMjMyMzM0MTcyNTYyMzgzMTAyZW5kaWFudXBkYXRlSGFzaGNodW5rZGVmJn40Mjk0OTY3Mjk1JXRlbXAzNjE0MDkwMzYwMzkwNTQwMjcxMDMyNTA0NDE5NjY0MTE4NTQ4Mzk5MTIwMDA4MDQyNjI4MjE3MzU5NTU0MjQ5MjYxMzEzMTc3MDAzNTQxNjIzMzY1NTI4Nzk0Mjk0OTI1MjMzMjMwNDU2MzEzNDE4MDQ2MDM2ODI0MjU0NjI2MTk1Mjc5Mjk2NTAwNjEyMzY1MzUzMjk0MTI5MTcwNzg2MzIyNTQ2NTY2NDM5MjEwNjk5OTQzNTkzNDA4NjA1MzYzNDQ4ODk2MTM4ODk0Mjk0NDgzMjc1MTYzNjA2NDEwNzYwMzMzNTExNjM1MzE1MDEyODUwMjg1ODI5NDI0MzU2MzUxMjE3MzUzMjg0NzMyMzY4MzU5NTYyNDI5NDU4ODczODIyNzIzOTI4MzMxODM5MDMwNTYyNDI1OTY1Nzc0MDI3NjM5NzUyMzYxMjcyODkzMzUzNDEzOTQ2OTY2NDMyMDAyMzY2NTYzOTM2NDMwMDc0MzU3MjQ0NTMxNzM2NTQ2MDI4MDkzODczMTUxNDYxMzI5OTYyODY0NTQwOTYzMzY0NTIxMTI2ODkxNDE1Mjg3ODYxMjM5MTQyMzc1MzMyNDExNzAwNDg1NTcxMjM5OTk4MDY5MDQyOTM5MTU3NzMyMjQwMDQ0NDk3MTg3MzMxMzM1OTQyNjQzNTU1NTIyNzM0NzY4OTE2MTMwOTE1MTY0OTQxNDk0NDQyMjYzMTc0NzU2OTE3Mzk1MTQ4MTc0NW1kNV9ub2lzZV9zaGlmdEFtb3VudHNTaGExX1NoYTFTaW5rX2V4dGVuZGVkMzI4NTM3NzUyMG5ld0ExNTE4NTAwMjQ5MTg1OTc3NTM5MzI0MDA5NTk3MDgzMzk1NDY5Nzgyc2hhMVNoYTI1Nm5ld0luc3RhbmNlU2hhMjI0X1NoYTMyQml0U2lua19kaWdlc3Rfcm90cjMyeD4+PDxfY2h5el9tYWpfYnNpZzBfYnNpZzFfc3NpZzBfc3NpZzFndGVtcDExMTE2MzUyNDA4MTg5OTQ0NzQ0MTMwNDkzMjM0NzEzOTIxMDA5NTczMTUwODk3MDk5MzI0NTM2MzU3NDgyODcwNzYzMjIxMzYyNDM4MTA4MDE0MjY4ODE5ODcxOTI1MDc4Mzg4MjE2MjA3ODIwNjI2MTQ4ODgxMDMzMjQ4MjIyNTgwMzgzNTM5MDQwMTQwMjIyMjQ3NzQxMjQ5MTUwMTIyMTU1NTA4MTY5MjE5OTYwNjQ5ODYyNTU0MjIwODgyMjgyMTgzNDM0OTI5NTI5OTY4MDgzMjEwMzEzNjcxMzMzNjU3MTg5MTM1ODQ1Mjg3MTExMjk0NzU3MzcyMTM5NjE4MjI5MTE2OTUxODM3MDAxOTg2NjYxMDUxMjE3NzAyNjM1MDI0NTY5NTYwMzcyNzMwNDg1OTIxMjgyMDMwMjQxMTMyNTk3MzA4MDAzMzQ1NzY0NzcxMzUxNjA2NTgxNzM2MDAzNTI4MDQ0MDk0NTcxOTA5MTMyMjgyMjIxODE1MzcwMDIwNjMxNzQ3ODczNzc5MTk1NTU2MjIyMjIwMjQxMDQ4MTUyMjI3NzMwNDUyMjM2MTg1MjQyNDI0Mjg0MzY0NzQyNzU2NzM0MTg3MzIwNDAzMTQ3OTMzMjkzMjUyOTh0ZW1wMl9TaGEyNTZTaW5rMTc3OTAzMzcwMzMxNDQxMzQyNzcyNzczNDgwNzYyMTM1OTg5MzExOTI2MDA4MjI5MjQxNTQxNDU5MjI1X1NoYTIyNFNpbmszMjM4MzcxMDMyNDE0NDkxMjY5NzQyOTA3NzU4NTcxNzUwNjAzMDI1MTY5NDA3NjgzOTMyMDQwNzU0MjhidWZmZXJhc1VpbnQzMkxpc3RzaGEyNTZzaGEyMjRTaGEzODRTaGE1MTJzaGEzODRzaGE1MTJtYXJrZXJTY2hlbWVyb290c29yaWdpbmFsbWFwbXVsdGlSb290RmlsZVN5c3RlbV9kZWxlZ2F0ZTphc3luY190ZW1wb3JhcnlfMF9yZXNvbHZlRW50aXR5aXNBYnNvbHV0ZVRoaXMgTXVsdGlSb290RmlsZVN5c3RlbSBvbmx5IGhhbmRsZXMgYWJzb2x1dGVzIFVSSXM6IGNhbmRpZGF0ZWV4aXN0c3JlYWRBc1N0cmluZ01pc3NpbmdGaWxlU3lzdGVtRW50aXR5RmlsZSBub3QgZm91bmRfbm9ybWFsaXplZW5kc1dpdGhyZXBsYWNlZGVmYXVsdEV4cGVyaW1lbnRhbEZsYWdzRXhwZXJpbWVudGFsRmxhZ0luY3JlbWVudGFsS2VybmVsR2VuZXJhdG9ySW5jcmVtZW50YWxTZXJpYWxpemVyaXNMZWdhbElkZW50aWZpZXJrZXJuZWxGb3JNb2R1bGVNZW1vcnlGaWxlU3lzdGVtY29tcHV0ZVBsYXRmb3JtQmluYXJpZXNMb2NhdGlvbkxvY2F0ZWRNZXNzYWdlbWVzc2FnZUJ5dGVjb2RlTGltaXRFeGNlZWRlZFRvb01hbnlBcmd1bWVudHNtZXNzYWdlRmZpRXhjZXB0aW9uYWxSZXR1cm5OdWxsbWVzc2FnZUZmaUV4cGVjdGVkQ29uc3RhbnRub0xlbmd0aHRlbXBsYXRlRmZpRGFydFR5cGVNaXNtYXRjaHRlbXBsYXRlRmZpRXhwZWN0ZWRFeGNlcHRpb25hbFJldHVybnRlbXBsYXRlRmZpRXhwZWN0ZWROb0V4Y2VwdGlvbmFsUmV0dXJudGVtcGxhdGVGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3N0ZW1wbGF0ZUZmaUZpZWxkQW5ub3RhdGlvbnRlbXBsYXRlRmZpRmllbGRJbml0aWFsaXplcnRlbXBsYXRlRmZpRmllbGROb0Fubm90YXRpb250ZW1wbGF0ZUZmaU5vdFN0YXRpY3RlbXBsYXRlRmZpU3RydWN0R2VuZXJpY3RlbXBsYXRlRmZpVHlwZUludmFsaWR0ZW1wbGF0ZUZmaVR5cGVNaXNtYXRjaHRlbXBsYXRlSWxsZWdhbFJlY3Vyc2l2ZVR5cGVIeWJyaWRGaWxlU3lzdGVtaXNSZWRpcmVjdGluZ0ZhY3RvcnlGaWVsZGNyZWF0ZUV4cHJlc3Npb25FdmFsdWF0aW9uQ29tcG9uZW50c2VyaWFsaXplQ29tcG9uZW50c2VyaWFsaXplUHJvY2VkdXJla2VybmVsLmNsYXNzX2hpZXJhcmNoeU1hcEVudHJ5SGFuZGxlQW1iaWd1b3VzU3VwZXJ0eXBlc01peGluSW5mZXJyZXJpbmZlcmNsYXNzTm9kZW1peGluSW5mZXJyZXIgY2FuJ3QgaW1wbGVtZW50IGJvdGggIGFuZCBfaW5pdGlhbGl6ZWdldE9yZGVyZWRDbGFzc2VzdW5vcmRlcmVkZ2VuZXJpY1N1cGVydHlwZXNPZmNsYXNzX2dldExlZ2FjeUxlYXN0VXBwZXJCb3VuZHR5cGUxdHlwZTJjbGllbnRMaWJyYXJ5Z2V0Q2xhc3NBc0luc3RhbmNlT2ZzdXBlcmNsYXNzZ2V0VHlwZUFzSW5zdGFuY2VPZmdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2Zhc0luc3RhbnRpYXRpb25PZmdldERpc3BhdGNoVGFyZ2V0c2V0dGVyZ2V0RGlzcGF0Y2hUYXJnZXRzc2V0dGVyc2dldEludGVyZmFjZU1lbWJlcmdldEludGVyZmFjZU1lbWJlcnNnZXREZWNsYXJlZE1lbWJlcnNpc1N1YmNsYXNzT2ZzdWJjbGFzc2lzU3VidHlwZU9mc3VidHlwZWlzVXNlZEFzTWl4aW5mb3JFYWNoT3ZlcnJpZGVQYWlyYXBwbHlUcmVlQ2hhbmdlc3JlbW92ZWRMaWJyYXJpZXNlbnN1cmVLbm93bkxpYnJhcmllc3JlaXNzdWVBbWJpZ3VvdXNTdXBlcnR5cGVzRm9yYXBwbHlNZW1iZXJDaGFuZ2VzY2xhc3Nlc2ZpbmREZXNjZW5kYW50c21lcmdlU29ydGVkTGlzdHNzZWNvbmRzdG9yZUluZGV4amZpcnN0TWVtYmVyc2Vjb25kTWVtYmVyY29tcGFyZTw9Y29tcGFyZU1lbWJlcnNjb21wYXJlTmFtZXNmaXJzdE5hbWVzZWNvbmROYW1lZmlyc3RIYXNoc2Vjb25kSGFzaGZpcnN0U3RyaW5nc2Vjb25kU3RyaW5nZmlyc3RMZW5ndGhzZWNvbmRMZW5ndGhmaXJzdExpYnJhcnlzZWNvbmRMaWJyYXJ5Zmlyc3RVbml0Y29kZVVuaXRBdHNlY29uZFVuaXRkZWx0YWZpbmRNZW1iZXJCeU5hbWVtZW1iZXJzbG93aGlnaG1pZHBpdm90Y29tcGFyaXNvbkNsYXNzSGllcmFyY2h5U3VidHlwZXNnZXRTdWJ0eXBlc09mZ2V0U2luZ2xlVGFyZ2V0Rm9ySW50ZXJmYWNlSW52b2NhdGlvbmludGVyZmFjZVRhcmdldF9DbGFzc0luZm9TdWJ0eXBlY2xhc3NJbmZvdG9wRG93bkluZGV4c3VidHlwZUludGVydmFsTGlzdF9DbG9zZWRXb3JsZENsYXNzSGllcmFyY2h5U3VidHlwZXNfY2xhc3Nlc0J5VG9wRG93bkluZGV4X2luZm9NYXBpbnZhbGlkYXRlZF90b3BEb3duU29ydEluZGV4YWxsQmV0c09mZl90b3BEb3duU29ydFZpc2l0c3ViSW5mb2luZGV4c3VidHlwZVNldEJ1aWxkZXJhZGRTaW5nbGV0b25kaXJlY3RFeHRlbmRlcnNzdWJ0eXBlSW5mb2FkZEludGVydmFsTGlzdGRpcmVjdE1peGVyc2RpcmVjdEltcGxlbWVudGVyc2J1aWxkSW50ZXJ2YWxMaXN0VGhpcyBkYXRhIHN0cnVjdHVyZSBoYXMgYmVlbiBpbnZhbGlkYXRlZHN1YnR5cGVzZW5jbG9zaW5nQ2xhc3Npc0Fic3RyYWN0bGlzdGZyb210b0Nsb3NlZFdvcmxkQ2xhc3NIaWVyYXJjaHlfb25BbWJpZ3VvdXNTdXBlcnR5cGVzX29uQW1iaWd1b3VzU3VwZXJ0eXBlc05vdFdyYXBwZWRrbm93bkxpYnJhcmllc19yZWNvcmRlZEFtYmlndW91c1N1cGVydHlwZXNfY2FjaGVkQ2xhc3NIaWVyYXJjaHlTdWJ0eXBlc190b3BTb3J0SW5kZXhfaW50ZXJuYWxyZWNvcmRlZGdldFRlc3RpbmdDbGFzc0luZm9pbmZvaW5mb0ZvcnVzZWRnZXRVc2VkQ2xhc3Nlc3Jlc2V0VXNlZG51bWJlck9mQ2xhc3Nlc2NvbXB1dGVTdWJ0eXBlc0luZm9ybWF0aW9udW5vcmRlcmVkU2V0dG9TZXR3aGVyZV9nZXRSYW5rZWRTdXBlcmNsYXNzSW5mb3NsZWFzdFVwcGVyQm91bmRJbmZvc2hlYXBjaGFpbmxhc3RJbmZvbmV4dEluZm9hZGRUb0hlYXBzdXBlcnR5cGVtaXhlZEluVHlwZWltcGxlbWVudGVkVHlwZXNpc05vbk51bGxhYmxlQnlEZWZhdWx0bnVsbFR5cGVpbmZvMWluZm8yY2xhc3NlczFjbGFzc2VzMmkxaTJjdXJyZW50RGVwdGhudW1DYW5kaWRhdGVzQXRUaGlzRGVwdGhuZXh0bmV4dDJkZXB0aHR5cGVQYXJhbWV0ZXJzcmF3VHlwZW51bGxhYmlsaXR5c3VwZXJUeXBlMXN1YnN0aXR1dGVUeXBlZ2VuZXJpY1N1cGVyVHlwZWFzSW50ZXJmYWNlVHlwZXN1cGVyVHlwZTJ3aXRoTnVsbGFiaWxpdHlhc1RoaXNTdXBlcnR5cGVmaWxlVXJpOiBObyBjbGFzcyBpbmZvIGZvciBzdXBlckluZm9hc1Jhd1N1cGVydHlwZU5vIGNhbm9uaWNhbCBpbnN0YW5jZSBvZiAgZm91bmQgZm9yIHR5cGVBcmd1bWVudHNudWxsQ2xhc3NOdWxsYWJpbGl0eS5sZWdhY3ljYXN0ZWRUeXBlc3Vic3RpdHV0ZVN1cGVydHlwZV9idWlsZEltcGxlbWVudGVkTWVtYmVyc19idWlsZEludGVyZmFjZU1lbWJlcnNfYnVpbGREZWNsYXJlZE1lbWJlcnNjcm9zc0dldHRlcnNTZXR0ZXJzc3VwZXJzc3VwZXJHZXR0ZXJzc3VwZXJTZXR0ZXJzaXNTZXR0ZXJfcmVwb3J0T3ZlcnJpZGVzZGVjbGFyZWRMaXN0aW5oZXJpdGVkTGlzdGRlY2xhcmVkaW5oZXJpdGVkc3VwZXJ0eXBlc2lzQW5vbnltb3VzTWl4aW5pc0VsaW1pbmF0ZWRNaXhpbmxpYnNlbmNsb3NpbmdMaWJyYXJ5YWRkZWRDbGFzc2VzU29ydGVkZXhwZWN0ZWRTdGFydEluZGV4X3RvcG9sb2dpY2FsU29ydFZpc2l0b3JkZXJlZExpc3RfaW5pdGlhbGl6ZVRvcG9sb2dpY2FsbHlTb3J0ZWRDbGFzc2Vzc2FuaXR5Q2hlY2tzaW5mb3Nwcm9jZXNzZWRDbGFzc2Vzd29ya2xpc3RyZW1vdmVMYXN0bGF6eURlY2xhcmVkR2V0dGVyc0FuZENhbGxzbGF6eURlY2xhcmVkU2V0dGVyc2xhenlJbXBsZW1lbnRlZEdldHRlcnNBbmRDYWxsc2xhenlJbXBsZW1lbnRlZFNldHRlcnNsYXp5SW50ZXJmYWNlR2V0dGVyc0FuZENhbGxzbGF6eUludGVyZmFjZVNldHRlcnNjbGFzc05hbWU6OnNiZW50cmllc2VudHJ5Rm91bmQgIGVudHJpZXMgZm9yIERpZG4ndCBrbm93IGxpYnJhcnkgb2YgIChmcm9tICkgKCkgaW4gZGlyZWN0RXh0ZW5kZXJzKSBpbiBkaXJlY3RNaXhlcnMpIGluIGRpcmVjdEltcGxlbWVudGVyc2V4cGVjdGVkU3RhcnRpbmdUb3BvbG9naWNhbEluZGV4X2NvbGxlY3RTdXBlcnNGb3JDbGFzc19yZWNvcmRTdXBlclR5cGVzTm8gaW5mbyBmb3IgIGZyb20gdG9wb2xvZ2ljYWxJbmRleFVuZXhwZWN0ZWQgdG9wb2xvZ2ljYWxJbmRleCAoICE9ICkgZm9yIGJlaW5nVmlzaXRlZEN5Y2xpYyBpbmhlcml0YW5jZSBpbnZvbHZpbmcgc3VwZXJEZXB0aHN1cGVyQ2xhc3NOb2Rlc2tpcEFic3RyYWN0TWVtYmVyc21peGVkSW5DbGFzc05vZGVtaXhlZEluSW5mb21peGluTWVtYmVyaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXJwcm9jZWR1cmVzcHJvY2VkdXJlaXNTdGF0aWNraW5kUHJvY2VkdXJlS2luZC5TZXR0ZXJmaWVsZHNmaWVsZGhhc0ltcGxpY2l0R2V0dGVyaGFzSW1wbGljaXRTZXR0ZXJhbGxJbmhlcml0ZWRNZW1iZXJzaW5oZXJpdEZyb21faW5oZXJpdE1lbWJlcnNkZWNsYXJlZE1lbWJlcmluaGVyaXRlZE1lbWJlcl9nZXRVbnNoYWRvd2VkSW5oZXJpdGVkTWVtYmVyc2dlbmVyaWNTdXBlclR5cGVzdHlwZXNyZWNvcmRHZW5lcmljU3VwZXJUeXBlc3Vic3RpdHV0aW9uc3VwZXJjbGFzc1NldEJ1aWxkZXJzdXBlcnR5cGVTZXRCdWlsZGVyc3VwZXJ0eXBlSW5mb3N1cGVyY2xhc3NJbnRlcnZhbExpc3RzdXBlcnR5cGVJbnRlcnZhbExpc3RtaXhlZEluVHlwZUluZm9nZXRFeHBlbnNlSGlzdG9ncmFtaW50ZXJ2YWxzfi8+PW9sZExlbmd0aGZpbGxSYW5nZWdldENvbXByZXNzaW9uUmF0aW9zaXplc2dldFN1cGVyVHlwZUhhc2hUYWJsZVNpemVzdW1fSW50ZXJ2YWxMaXN0QnVpbGRlcmV2ZW50c2FkZEludGVydmFsaW5zaWRlQ291bnRldmVudEZvclRlc3RpbmdDbGFzc0luZm9fQ2xhc3NJbmZvY2Fub25pY2FsTm8gY2Fub25pY2FsIGluc3RhbnRpYXRpb24gY29tcHV0ZWQgZm9yICBpbiBObyBpbnN0YW50aWF0aW9ucyBjb21wdXRlZCBmb3IgQ2xhc3NTZXRfY2xhc3Nlc3VuaW9uX0x1YkhlYXBzb3J0c0JlZm9yZXNvcnRzQmVmb3JlU3RhdGljX2ludGVydmFsTGlzdENvbnRhaW5zaW50ZXJ2YWxMaXN0X2ludGVydmFsTGlzdFNpemVzaXpla2VybmVsLmFzdExpc3RCYXNldXRmOENhbm9uaWNhbE5hbWVOb2RlYWNjZXB0UnZ2aXNpdENoaWxkcmVubGVha2luZ0RlYnVnVG9TdHJpbmdUcmVlTm9kZV9oYXNoQ291bnRlcm5vT2Zmc2V0cGFyZW50ZmlsZU9mZnNldHRyYW5zZm9ybUNoaWxkcmVucmVwbGFjZUNoaWxkY2hpbGRyZXBsYWNlbWVudHJlcGxhY2VXaXRoZW5jbG9zaW5nQ29tcG9uZW50bG9jYXRpb25fZ2V0TG9jYXRpb25JbkVuY2xvc2luZ0ZpbGVvZmZzZXROYW1lZE5vZGVyZWZlcmVuY2Vub2RlX3JlbGlua05vZGVGaWxlVXJpTm9kZUFubm90YXRhYmxlYW5ub3RhdGlvbnNhZGRBbm5vdGF0aW9uX25vZGVjYW5vbmljYWxOYW1lUGFyZW50QHBhcmVudE5hbWVkTm9kZXBhcmVudENsYXNzbGF6eUJ1aWxkZXJlbnN1cmVMb2FkZWRSZWZlcmVuY2UgdG8gVW5ib3VuZCByZWZlcmVuY2Vhc0xpYnJhcnkgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIGxpYnJhcnkgd2FzIGV4cGVjdGVkYXNDbGFzcyBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgY2xhc3Mgd2FzIGV4cGVjdGVkYXNNZW1iZXIgaXMgbm90IGJvdW5kIHRvIGFuIEFTVCBub2RlLiBBIG1lbWJlciB3YXMgZXhwZWN0ZWRhc0ZpZWxkIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBmaWVsZCB3YXMgZXhwZWN0ZWRhc0NvbnN0cnVjdG9yIGlzIG5vdCBib3VuZCB0byBhbiBBU1Qgbm9kZS4gQSBjb25zdHJ1Y3RvciB3YXMgZXhwZWN0ZWRhc1Byb2NlZHVyZSBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgcHJvY2VkdXJlIHdhcyBleHBlY3RlZGFzVHlwZWRlZiBpcyBub3QgYm91bmQgdG8gYW4gQVNUIG5vZGUuIEEgdHlwZWRlZiB3YXMgZXhwZWN0ZWRkZWZhdWx0TGFuZ3VhZ2VWZXJzaW9uTWFqb3JkZWZhdWx0TGFuZ3VhZ2VWZXJzaW9uTWlub3JfbGFuZ3VhZ2VWZXJzaW9uTWFqb3JfbGFuZ3VhZ2VWZXJzaW9uTWlub3JTeW50aGV0aWNGbGFnTm9uTnVsbGFibGVCeURlZmF1bHRGbGFnZmxhZ3NkZXBlbmRlbmNpZXNwYXJ0c3R5cGVkZWZzZXh0ZW5zaW9uc19saWJyYXJ5SWRDb3VudGVyX2xpYnJhcnlJZGxhbmd1YWdlVmVyc2lvbk1ham9ybGFuZ3VhZ2VWZXJzaW9uTWlub3JzZXRMYW5ndWFnZVZlcnNpb25UcnlpbmcgdG8gc2V0IGxhbmd1YWdlIHZlcnNpb24gJ251bGwnaXNTeW50aGV0aWNudWxsYWJsZU51bGxhYmlsaXR5Lm51bGxhYmxlbm9uTnVsbGFibGVOdWxsYWJpbGl0eS5ub25OdWxsYWJsZW51bGxhYmxlSWZUcnVlaXNOdWxsYWJsZWV4cGFuZGFkZE1lbWJlcm1lbWJlcmFkZENsYXNzYWRkRXh0ZW5zaW9uZXh0ZW5zaW9uYWRkRmllbGRhZGRQcm9jZWR1cmVhZGRUeXBlZGVmdHlwZWRlZl9nZXRDaGlsZEZyb21UeXBlZGVmYmluZFRvZ2V0Q2hpbGRGcm9tTWVtYmVyZ2V0Q2hpbGRyZWxpbmthZGREZXBlbmRlbmN5YWRkUGFydHZpc2l0TGlicmFyeUxpYnJhcnlEZXBlbmRlbmN5aW1wb3J0ZWRMaWJyYXJ5UmVmZXJlbmNlY29tYmluYXRvcnNFeHBvcnRGbGFnRGVmZXJyZWRGbGFnaW1wb3J0ZWRMaWJyYXJ5ZGVmZXJyZWRJbXBvcnRpbXBvcnRleHBvcnRieVJlZmVyZW5jZXRhcmdldExpYnJhcnlpc0V4cG9ydGlzSW1wb3J0aXNEZWZlcnJlZGFubm90YXRpb252aXNpdExpYnJhcnlEZXBlbmRlbmN5TGlicmFyeVBhcnRwYXJ0VXJpdmlzaXRMaWJyYXJ5UGFydENvbWJpbmF0b3Jpc1Nob3duYW1lc3Nob3dkZXBlbmRlbmN5aXNIaWRldmlzaXRDb21iaW5hdG9yVHlwZWRlZnR5cGVQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGVwb3NpdGlvbmFsUGFyYW1ldGVyc25hbWVkUGFyYW1ldGVyc3Zpc2l0VHlwZWRlZnZpc2l0RGFydFR5cGVDbGFzc0xldmVsX25hbWVDbGFzc0xldmVsLlRlbXBvcmFyeUNsYXNzTGV2ZWwuVHlwZUNsYXNzTGV2ZWwuSGllcmFyY2h5Q2xhc3NMZXZlbC5NaXhpbkNsYXNzTGV2ZWwuQm9keVRlbXBvcmFyeVR5cGVIaWVyYXJjaHlNaXhpbkJvZHlEaXJ0aWZ5aW5nTGlzdEVkaXJ0aWZ5Q2xhc3N3cmFwcGVkZGlydHlDbGFzc3N0YXJ0RmlsZU9mZnNldGZpbGVFbmRPZmZzZXRsZXZlbExldmVsTWFza0ZsYWdBYnN0cmFjdEZsYWdFbnVtRmxhZ0Fub255bW91c01peGluRmxhZ0VsaW1pbmF0ZWRNaXhpbkZsYWdNaXhpbkRlY2xhcmF0aW9uRmxhZ0hhc0NvbnN0Q29uc3RydWN0b3JmaWVsZHNJbnRlcm5hbF9maWVsZHNWaWV3Y29uc3RydWN0b3JzSW50ZXJuYWxfY29uc3RydWN0b3JzVmlld3Byb2NlZHVyZXNJbnRlcm5hbF9wcm9jZWR1cmVzVmlld3JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0ludGVybmFsX3JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1ZpZXdjb25zdHJ1Y3RvcnNyZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNpc0VudW1pc01peGluRGVjbGFyYXRpb25oYXNDb25zdENvbnN0cnVjdG9yc3VwZXJjbGFzc0NvbnN0cmFpbnRzY29uc3RyYWludHNjdXJyZW50Q2xhc3NsYXp5QnVpbGRlckxvY2FsbWl4ZWRJbkNsYXNzbWl4aW5pc01peGluQXBwbGljYXRpb25kZW1hbmdsZWROYW1lbmFtZUFzTWl4aW5BcHBsaWNhdGlvbm5hbWVBc01peGluQXBwbGljYXRpb25TdWJjbGFzc3Zpc2l0Q2xhc3NhY2NlcHRSZWZlcmVuY2V2aXNpdENsYXNzUmVmZXJlbmNlZ2V0VGhpc1R5cGV0aGlzSW50ZXJmYWNlVHlwZXZpc2l0U3VwZXJ0eXBlRXh0ZW5zaW9ub25UeXBldmlzaXRFeHRlbnNpb25FeHRlbnNpb25NZW1iZXJLaW5kRXh0ZW5zaW9uTWVtYmVyS2luZC5GaWVsZEV4dGVuc2lvbk1lbWJlcktpbmQuTWV0aG9kRXh0ZW5zaW9uTWVtYmVyS2luZC5HZXR0ZXJFeHRlbnNpb25NZW1iZXJLaW5kLlNldHRlckV4dGVuc2lvbk1lbWJlcktpbmQuT3BlcmF0b3JFeHRlbnNpb25NZW1iZXJLaW5kLlRlYXJPZmZGaWVsZE1ldGhvZEdldHRlclNldHRlck9wZXJhdG9yVGVhck9mZkV4dGVuc2lvbk1lbWJlckRlc2NyaXB0b3JGbGFnU3RhdGljTWVtYmVydHJhbnNmb3JtZXJGbGFnc2lzQ29uc3RoYXNHZXR0ZXJoYXNTZXR0ZXJpc0luc3RhbmNlTWVtYmVyaXNFeHRlcm5hbGlzRXh0ZW5zaW9uTWVtYmVyZnVuY3Rpb25nZXR0ZXJUeXBlc2V0dGVyVHlwZWNvbnRhaW5zU3VwZXJDYWxsc2luaXRpYWxpemVyRmxhZ0ZpbmFsRmxhZ0NvbnN0RmxhZ0hhc0ltcGxpY2l0R2V0dGVyRmxhZ0hhc0ltcGxpY2l0U2V0dGVyRmxhZ0NvdmFyaWFudEZsYWdHZW5lcmljQ292YXJpYW50SW1wbEZsYWdMYXRlRmxhZ0V4dGVuc2lvbk1lbWJlckZsYWdOb25OdWxsYWJsZUJ5RGVmYXVsdGlzQ292YXJpYW50aXNGaW5hbGlzTGF0ZWlzR2VuZXJpY0NvdmFyaWFudEltcGxpc011dGFibGVGaWVsZHMgY2Fubm90IGJlIGV4dGVybmFsdmlzaXRGaWVsZHZpc2l0RmllbGRSZWZlcmVuY2VDb25zdHJ1Y3RvcmluaXRpYWxpemVyc0ZsYWdFeHRlcm5hbEZsYWdTeW50aGV0aWN2aXNpdENvbnN0cnVjdG9ydmlzaXRDb25zdHJ1Y3RvclJlZmVyZW5jZVJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9ydGFyZ2V0UmVmZXJlbmNlcmVxdWlyZWRQYXJhbWV0ZXJDb3VudGlzVW5yZXNvbHZlZFByb2NlZHVyZUtpbmQuRmFjdG9yeXZpc2l0UmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3J2aXNpdFJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yUmVmZXJlbmNlUHJvY2VkdXJlZm9yd2FyZGluZ1N0dWJTdXBlclRhcmdldFJlZmVyZW5jZWZvcndhcmRpbmdTdHViSW50ZXJmYWNlVGFyZ2V0UmVmZXJlbmNlRmxhZ0ZvcndhcmRpbmdTdHViRmxhZ0ZvcndhcmRpbmdTZW1pU3R1YkZsYWdSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvckZsYWdOb1N1Y2hNZXRob2RGb3J3YXJkZXJGbGFnTWVtYmVyU2lnbmF0dXJlaXNGb3J3YXJkaW5nU3R1YmlzRm9yd2FyZGluZ1NlbWlTdHViaXNNZW1iZXJTaWduYXR1cmVmb3J3YXJkaW5nU3R1YlN1cGVyVGFyZ2V0Zm9yd2FyZGluZ1N0dWJJbnRlcmZhY2VUYXJnZXRfYnlSZWZlcmVuY2VSZW5hbWVkYm9keW5ld1ZhbHVlc2V0VHJhbnNmb3JtZXJGbGFnc1dpdGhvdXRMYXp5TG9hZGluZ2lzUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3Jpc1N5bnRoZXRpY0ZvcndhcmRlcmlzR2V0dGVyUHJvY2VkdXJlS2luZC5HZXR0ZXJpc0FjY2Vzc29yaXNGYWN0b3J5dmlzaXRQcm9jZWR1cmV2aXNpdFByb2NlZHVyZVJlZmVyZW5jZXJldHVyblR5cGVjb21wdXRlRnVuY3Rpb25UeXBlUHJvY2VkdXJlS2luZFByb2NlZHVyZUtpbmQuTWV0aG9kUHJvY2VkdXJlS2luZC5PcGVyYXRvckZhY3RvcnlJbml0aWFsaXplckludmFsaWRJbml0aWFsaXplcnZpc2l0SW52YWxpZEluaXRpYWxpemVyRmllbGRJbml0aWFsaXplcmZpZWxkUmVmZXJlbmNldmlzaXRGaWVsZEluaXRpYWxpemVyU3VwZXJJbml0aWFsaXplcnZpc2l0U3VwZXJJbml0aWFsaXplclJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJ2aXNpdFJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJMb2NhbEluaXRpYWxpemVydmFyaWFibGV2aXNpdExvY2FsSW5pdGlhbGl6ZXJBc3NlcnRJbml0aWFsaXplcnN0YXRlbWVudHZpc2l0QXNzZXJ0SW5pdGlhbGl6ZXJGdW5jdGlvbk5vZGVhc3luY01hcmtlcmRhcnRBc3luY01hcmtlcl9ib2R5QXN5bmNNYXJrZXIuU3luY19idWlsZExhenlfZ2V0VHlwZU9mVmFyaWFibGVfZ2V0TmFtZWRUeXBlT2ZWYXJpYWJsZWlzUmVxdWlyZWRjb21wdXRlVGhpc0Z1bmN0aW9uVHlwZW5hbWVkZ3Jvd2FibGV0eXBlUGFyYW1ldGVyc0NvcHlhcHBseVRvRnVuY3Rpb25UeXBldmlzaXRGdW5jdGlvbk5vZGVBc3luY01hcmtlckFzeW5jTWFya2VyLlN5bmNTdGFyQXN5bmNNYXJrZXIuQXN5bmNBc3luY01hcmtlci5Bc3luY1N0YXJBc3luY01hcmtlci5TeW5jWWllbGRpbmdTeW5jU3luY1N0YXJBc3luY0FzeW5jU3RhclN5bmNZaWVsZGluZ0V4cHJlc3Npb25nZXRTdGF0aWNUeXBlZ2V0U3RhdGljVHlwZUFzSW5zdGFuY2VPZnR5cGVFbnZpcm9ubWVudHR5cGVQYXJhbWV0ZXJUeXBlcHJvbW90ZWRCb3VuZHBhcmFtZXRlcmJvdW5kYm90dG9tSW50ZXJmYWNlVHlwZXVwY2FzdFR5cGVBcmd1bWVudHN0eXBlRXJyb3IgaXMgbm90IGEgc3VidHlwZSBvZiBhY2NlcHQxQWFyZ0ludmFsaWRFeHByZXNzaW9udmlzaXRJbnZhbGlkRXhwcmVzc2lvblZhcmlhYmxlR2V0cHJvbW90ZWRUeXBldmlzaXRWYXJpYWJsZUdldFZhcmlhYmxlU2V0dmlzaXRWYXJpYWJsZVNldFByb3BlcnR5R2V0cmVjZWl2ZXJpbnRlcmZhY2VUYXJnZXRSZWZlcmVuY2VyZWNlaXZlclR5cGVuYW1lU3RyaW5naW50UmF3VHlwZXJ1bnRpbWVUeXBldHlwZVJhd1R5cGV2aXNpdFByb3BlcnR5R2V0UHJvcGVydHlTZXR2aXNpdFByb3BlcnR5U2V0RGlyZWN0UHJvcGVydHlHZXR2aXNpdERpcmVjdFByb3BlcnR5R2V0RGlyZWN0UHJvcGVydHlTZXR2aXNpdERpcmVjdFByb3BlcnR5U2V0RGlyZWN0TWV0aG9kSW52b2NhdGlvbnZpc2l0RGlyZWN0TWV0aG9kSW52b2NhdGlvbmlzT3ZlcmxvYWRlZEFyaXRobWV0aWNPcGVyYXRvcmdldFR5cGVPZk92ZXJsb2FkZWRBcml0aG1ldGljcG9zaXRpb25hbFN1cGVyUHJvcGVydHlHZXRkZWNsYXJpbmdDbGFzc3JlY2VpdmVyQXJndW1lbnRzdGhpc1R5cGV2aXNpdFN1cGVyUHJvcGVydHlHZXRTdXBlclByb3BlcnR5U2V0dmlzaXRTdXBlclByb3BlcnR5U2V0U3RhdGljR2V0dmlzaXRTdGF0aWNHZXRTdGF0aWNTZXR2aXNpdFN0YXRpY1NldEFyZ3VtZW50c2VtcHR5Zm9yd2FyZGVkcHZpc2l0QXJndW1lbnRzTmFtZWRFeHByZXNzaW9udmlzaXROYW1lZEV4cHJlc3Npb25JbnZvY2F0aW9uRXhwcmVzc2lvbk1ldGhvZEludm9jYXRpb250eXBlUGFyYW1ldGVyZGVmYXVsdFR5cGVjYWxsVHlwZWJvb2xSYXdUeXBldmlzaXRNZXRob2RJbnZvY2F0aW9uU3VwZXJNZXRob2RJbnZvY2F0aW9ucmVjZWl2ZXJUeXBlQXJndW1lbnRzdmlzaXRTdXBlck1ldGhvZEludm9jYXRpb25TdGF0aWNJbnZvY2F0aW9udmlzaXRTdGF0aWNJbnZvY2F0aW9uQ29uc3RydWN0b3JJbnZvY2F0aW9udmlzaXRDb25zdHJ1Y3Rvckludm9jYXRpb25jb25zdHJ1Y3RlZFR5cGVJbnN0YW50aWF0aW9uZXhwcmVzc2lvbndpdGhvdXRUeXBlUGFyYW1ldGVyc3Zpc2l0SW5zdGFudGlhdGlvbk5vdG9wZXJhbmR2aXNpdE5vdExvZ2ljYWxFeHByZXNzaW9ubGVmdG9wZXJhdG9ycmlnaHR2aXNpdExvZ2ljYWxFeHByZXNzaW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uY29uZGl0aW9udGhlbm90aGVyd2lzZXN0YXRpY1R5cGV2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvblN0cmluZ0NvbmNhdGVuYXRpb25leHByZXNzaW9uc3N0cmluZ1Jhd1R5cGV2aXNpdFN0cmluZ0NvbmNhdGVuYXRpb25MaXN0Q29uY2F0ZW5hdGlvbnR5cGVBcmd1bWVudGxpc3RzbGlzdFR5cGV2aXNpdExpc3RDb25jYXRlbmF0aW9uU2V0Q29uY2F0ZW5hdGlvbnNldHNzZXRUeXBldmlzaXRTZXRDb25jYXRlbmF0aW9uTWFwQ29uY2F0ZW5hdGlvbmtleVR5cGV2YWx1ZVR5cGVtYXBzbWFwVHlwZXZpc2l0TWFwQ29uY2F0ZW5hdGlvbkluc3RhbmNlQ3JlYXRpb25jbGFzc1JlZmVyZW5jZWZpZWxkVmFsdWVzYXNzZXJ0c3VudXNlZEFyZ3VtZW50c3Zpc2l0SW5zdGFuY2VDcmVhdGlvbmZpZWxkUmVmdHJhbnNmb3JtZWRGaWxlVXJpRXhwcmVzc2lvbnZpc2l0RmlsZVVyaUV4cHJlc3Npb25Jc0V4cHJlc3Npb25GbGFnRm9yTm9uTnVsbGFibGVCeURlZmF1bHRpc0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0dmlzaXRJc0V4cHJlc3Npb25Bc0V4cHJlc3Npb25GbGFnVHlwZUVycm9yRmxhZ0NvdmFyaWFuY2VDaGVja0ZsYWdGb3JEeW5hbWljaXNUeXBlRXJyb3Jpc0NvdmFyaWFuY2VDaGVja2lzRm9yRHluYW1pY3Zpc2l0QXNFeHByZXNzaW9uTnVsbENoZWNrb3BlcmFuZFR5cGV2aXNpdE51bGxDaGVja0Jhc2ljTGl0ZXJhbFN0cmluZ0xpdGVyYWx2aXNpdFN0cmluZ0xpdGVyYWxJbnRMaXRlcmFsdmlzaXRJbnRMaXRlcmFsRG91YmxlTGl0ZXJhbGRvdWJsZVJhd1R5cGV2aXNpdERvdWJsZUxpdGVyYWxCb29sTGl0ZXJhbHZpc2l0Qm9vbExpdGVyYWxOdWxsTGl0ZXJhbHZpc2l0TnVsbExpdGVyYWxTeW1ib2xMaXRlcmFsc3ltYm9sUmF3VHlwZXZpc2l0U3ltYm9sTGl0ZXJhbFR5cGVMaXRlcmFsdmlzaXRUeXBlTGl0ZXJhbFRoaXNFeHByZXNzaW9udmlzaXRUaGlzRXhwcmVzc2lvblJldGhyb3d2aXNpdFJldGhyb3dUaHJvd3Zpc2l0VGhyb3dMaXN0TGl0ZXJhbHZpc2l0TGlzdExpdGVyYWxTZXRMaXRlcmFsdmlzaXRTZXRMaXRlcmFsTWFwTGl0ZXJhbHZpc2l0TWFwTGl0ZXJhbHZpc2l0TWFwRW50cnlBd2FpdEV4cHJlc3Npb251bmZ1dHVyZVR5cGV2aXNpdEF3YWl0RXhwcmVzc2lvbkxvY2FsRnVuY3Rpb25GdW5jdGlvbkV4cHJlc3Npb252aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbkNvbnN0YW50RXhwcmVzc2lvbmNvbnN0YW50dmlzaXRDb25zdGFudEV4cHJlc3Npb252aXNpdENvbnN0YW50TGV0dmlzaXRMZXRCbG9ja0V4cHJlc3Npb252aXNpdEJsb2NrRXhwcmVzc2lvbkxvYWRMaWJyYXJ5ZnV0dXJlVHlwZXZpc2l0TG9hZExpYnJhcnlDaGVja0xpYnJhcnlJc0xvYWRlZG9iamVjdFJhd1R5cGV2aXNpdENoZWNrTGlicmFyeUlzTG9hZGVkU3RhdGVtZW50RXhwcmVzc2lvblN0YXRlbWVudHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudEJsb2Nrc3RhdGVtZW50c3Zpc2l0QmxvY2thZGRTdGF0ZW1lbnRBc3NlcnRCbG9ja3Zpc2l0QXNzZXJ0QmxvY2tFbXB0eVN0YXRlbWVudHZpc2l0RW1wdHlTdGF0ZW1lbnRBc3NlcnRTdGF0ZW1lbnRjb25kaXRpb25TdGFydE9mZnNldGNvbmRpdGlvbkVuZE9mZnNldHZpc2l0QXNzZXJ0U3RhdGVtZW50TGFiZWxlZFN0YXRlbWVudHZpc2l0TGFiZWxlZFN0YXRlbWVudEJyZWFrU3RhdGVtZW50dmlzaXRCcmVha1N0YXRlbWVudFdoaWxlU3RhdGVtZW50dmlzaXRXaGlsZVN0YXRlbWVudERvU3RhdGVtZW50dmlzaXREb1N0YXRlbWVudEZvclN0YXRlbWVudHZhcmlhYmxlc3VwZGF0ZXN2aXNpdEZvclN0YXRlbWVudEZvckluU3RhdGVtZW50Ym9keU9mZnNldGl0ZXJhYmxlaXNBc3luY3Zpc2l0Rm9ySW5TdGF0ZW1lbnRTd2l0Y2hTdGF0ZW1lbnRjYXNlc3Zpc2l0U3dpdGNoU3RhdGVtZW50U3dpdGNoQ2FzZWV4cHJlc3Npb25PZmZzZXRzaXNEZWZhdWx0ZGVmYXVsdENhc2V2aXNpdFN3aXRjaENhc2VDb250aW51ZVN3aXRjaFN0YXRlbWVudHZpc2l0Q29udGludWVTd2l0Y2hTdGF0ZW1lbnRJZlN0YXRlbWVudHZpc2l0SWZTdGF0ZW1lbnRSZXR1cm5TdGF0ZW1lbnR2aXNpdFJldHVyblN0YXRlbWVudFRyeUNhdGNoY2F0Y2hlc3Zpc2l0VHJ5Q2F0Y2hDYXRjaGd1YXJkZXhjZXB0aW9uc3RhY2tUcmFjZXZpc2l0Q2F0Y2hUcnlGaW5hbGx5ZmluYWxpemVydmlzaXRUcnlGaW5hbGx5WWllbGRTdGF0ZW1lbnRGbGFnWWllbGRTdGFyRmxhZ05hdGl2ZWlzWWllbGRTdGFyaXNOYXRpdmV2aXNpdFlpZWxkU3RhdGVtZW50VmFyaWFibGVEZWNsYXJhdGlvbmZpbGVFcXVhbHNPZmZzZXRiaW5hcnlPZmZzZXROb1RhZ0ZsYWdGaWVsZEZvcm1hbEZsYWdJblNjb3BlRmxhZ1JlcXVpcmVkaXNGaWVsZEZvcm1hbGZvclZhbHVlaXNBc3NpZ25hYmxlY2xlYXJBbm5vdGF0aW9uc3Zpc2l0VmFyaWFibGVEZWNsYXJhdGlvbkZ1bmN0aW9uRGVjbGFyYXRpb252aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb25OYW1lbGlicmFyeU5hbWVpc1ByaXZhdGV2aXNpdE5hbWVfUHJpdmF0ZU5hbWVfY29tcHV0ZUhhc2hDb2RlX1B1YmxpY05hbWVOdWxsYWJpbGl0eU51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZHVuZGV0ZXJtaW5lZGxlZ2FjeURhcnRUeXBldW5hbGlhc3VuYWxpYXNPbmNlaXNQb3RlbnRpYWxseU51bGxhYmxlaXNQb3RlbnRpYWxseU5vbk51bGxhYmxlZXF1YWxzYXNzdW1wdGlvbnNJbnZhbGlkVHlwZXZpc2l0SW52YWxpZFR5cGVJbnZhbGlkVHlwZSBkb2Vzbid0IGhhdmUgbnVsbGFiaWxpdHlEeW5hbWljVHlwZXZpc2l0RHluYW1pY1R5cGVWb2lkVHlwZXZpc2l0Vm9pZFR5cGVOZXZlclR5cGV2aXNpdE5ldmVyVHlwZUJvdHRvbVR5cGV2aXNpdEJvdHRvbVR5cGVJbnRlcmZhY2VUeXBlX2RlZmF1bHRUeXBlQXJndW1lbnRzdmlzaXRJbnRlcmZhY2VUeXBlbnVsbGFiaWxpdHlIYXNoRnVuY3Rpb25UeXBldHlwZWRlZlR5cGVfaGFzaENvZGV0eXBlZGVmUmVmZXJlbmNldHlwZWRlZnZpc2l0RnVuY3Rpb25UeXBlYXNzdW1lZm9yZ2V0Z2V0TmFtZWRQYXJhbWV0ZXJsb3dlcnVwcGVybmFtZWRQYXJhbWV0ZXJUeXBlZGVmVHlwZXR5cGVkZWZOb2RldmlzaXRUeXBlZGVmVHlwZXZpc2l0VHlwZWRlZlJlZmVyZW5jZU5hbWVkVHlwZUZsYWdSZXF1aXJlZE5hbWVkVHlwZXZpc2l0TmFtZWRUeXBlVHlwZVBhcmFtZXRlclR5cGV0eXBlUGFyYW1ldGVyVHlwZU51bGxhYmlsaXR5aW50ZXJzZWN0aW9uZm9yQWxwaGFSZW5hbWluZ3dpdGhEZWZhdWx0TnVsbGFiaWxpdHlGb3JMaWJyYXJ5dmlzaXRUeXBlUGFyYW1ldGVyVHlwZWlzQXNzdW1lZGlzRnVuY3Rpb25UeXBlVHlwZVBhcmFtZXRlckNhbid0IGNoYW5nZSB0aGUgbnVsbGFiaWxpdHkgYXR0cmlidXRlIG9mIGFuIGludGVyc2VjdGlvbiB0eXBlLmNvbXB1dGVOdWxsYWJpbGl0eUZyb21Cb3VuZENhbid0IGNvbXB1dGUgbnVsbGFiaWxpdHkgZnJvbSBhbiBhYnNlbnQgYm91bmQuYm91bmROdWxsYWJpbGl0eWdldE51bGxhYmlsaXR5bGhzTnVsbGFiaWxpdHlWYXJpYW5jZXVucmVsYXRlZGNvdmFyaWFudGNvbnRyYXZhcmlhbnRpbnZhcmlhbnRtZWV0Y29tYmluZWdyZWF0ZXJUaGFuZ3JlYXRlclRoYW5PckVxdWFsbGVzc1RoYW5sZXNzVGhhbk9yRXF1YWxmcm9tU3RyaW5ndmFyaWFuY2Vpbmlub3V0b3V0a2V5d29yZFN0cmluZ1R5cGVQYXJhbWV0ZXJfdmFyaWFuY2VsZWdhY3lDb3ZhcmlhbnRTZXJpYWxpemF0aW9uTWFya2VybmV3VmFyaWFuY2Vpc0xlZ2FjeUNvdmFyaWFudHZpc2l0VHlwZVBhcmFtZXRlclN1cGVydHlwZUNvbnN0YW50Z2V0VHlwZWFzRXhwcmVzc2lvblByaW1pdGl2ZUNvbnN0YW50TnVsbENvbnN0YW50dmlzaXROdWxsQ29uc3RhbnR2aXNpdE51bGxDb25zdGFudFJlZmVyZW5jZUJvb2xDb25zdGFudHZpc2l0Qm9vbENvbnN0YW50dmlzaXRCb29sQ29uc3RhbnRSZWZlcmVuY2VJbnRDb25zdGFudHZpc2l0SW50Q29uc3RhbnR2aXNpdEludENvbnN0YW50UmVmZXJlbmNlRG91YmxlQ29uc3RhbnR2aXNpdERvdWJsZUNvbnN0YW50dmlzaXREb3VibGVDb25zdGFudFJlZmVyZW5jZWlzTmFOU3RyaW5nQ29uc3RhbnR2aXNpdFN0cmluZ0NvbnN0YW50dmlzaXRTdHJpbmdDb25zdGFudFJlZmVyZW5jZVN5bWJvbENvbnN0YW50bGlicmFyeVJlZmVyZW5jZXZpc2l0U3ltYm9sQ29uc3RhbnR2aXNpdFN5bWJvbENvbnN0YW50UmVmZXJlbmNlTWFwQ29uc3RhbnRfY2FjaGVkSGFzaENvZGV2aXNpdE1hcENvbnN0YW50dmlzaXRNYXBDb25zdGFudFJlZmVyZW5jZSwgPihDb25zdGFudE1hcEVudHJ5OiBMaXN0Q29uc3RhbnR2aXNpdExpc3RDb25zdGFudHZpc2l0TGlzdENvbnN0YW50UmVmZXJlbmNlU2V0Q29uc3RhbnR2aXNpdFNldENvbnN0YW50dmlzaXRTZXRDb25zdGFudFJlZmVyZW5jZUluc3RhbmNlQ29uc3RhbnR2aXNpdEluc3RhbmNlQ29uc3RhbnR2aXNpdEluc3RhbmNlQ29uc3RhbnRSZWZlcmVuY2Vqb2luIHt9UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHRlYXJPZmZDb25zdGFudHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudHZpc2l0UGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudFJlZmVyZW5jZSg+KW1hcHBpbmdUZWFyT2ZmQ29uc3RhbnRwcm9jZWR1cmVSZWZlcmVuY2V2aXNpdFRlYXJPZmZDb25zdGFudHZpc2l0VGVhck9mZkNvbnN0YW50UmVmZXJlbmNlVHlwZUxpdGVyYWxDb25zdGFudHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudHZpc2l0VHlwZUxpdGVyYWxDb25zdGFudFJlZmVyZW5jZVVuZXZhbHVhdGVkQ29uc3RhbnR2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnR2aXNpdFVuZXZhbHVhdGVkQ29uc3RhbnRSZWZlcmVuY2VtZXRhZGF0YW1haW5NZXRob2ROYW1lbmFtZVJvb3RhZG9wdENoaWxkcmVuYWRvcHRDaGlsZGNvbXB1dGVDYW5vbmljYWxOYW1lc0ZvckxpYnJhcnlnZXRDaGlsZEZyb21Vcml1bmJpbmRDYW5vbmljYWxOYW1lc3VuYmluZEFsbHZpc2l0Q29tcG9uZW50Z2V0TG9jYXRpb25hZGRNZXRhZGF0YVJlcG9zaXRvcnlyZXBvc2l0b3J5dGFnTG9jYXRpb25jb2x1bW5NZXRhZGF0YVJlcG9zaXRvcnl3cml0ZVRvQmluYXJ5cmVhZEZyb21CaW5hcnlpc1N1cHBvcnRlZEJpbmFyeVNpbmtnZXRCdWZmZXJPZmZzZXR3cml0ZUJ5dGVieXRld3JpdGVCeXRlc3dyaXRlVUludDMyd3JpdGVVSW50MzB3cml0ZUJ5dGVMaXN0d3JpdGVOdWxsQWxsb3dlZENhbm9uaWNhbE5hbWVSZWZlcmVuY2V3cml0ZVN0cmluZ1JlZmVyZW5jZXN0cndyaXRlTmFtZXdyaXRlRGFydFR5cGV3cml0ZUNvbnN0YW50UmVmZXJlbmNld3JpdGVOb2RlZW50ZXJTY29wZW1lbWJlclNjb3BldmFyaWFibGVTY29wZWxlYXZlU2NvcGVCaW5hcnlTb3VyY2VjdXJyZW50T2Zmc2V0cmVhZEJ5dGVyZWFkQnl0ZXNyZWFkVUludHJlYWRVaW50MzJyZWFkQnl0ZUxpc3RyZWFkQ2Fub25pY2FsTmFtZVJlZmVyZW5jZXJlYWRTdHJpbmdSZWZlcmVuY2VyZWFkTmFtZXJlYWREYXJ0VHlwZXJlYWRDb25zdGFudFJlZmVyZW5jZXJlYWRGdW5jdGlvbk5vZGVfQ2hpbGRSZXBsYWNlcmRlZmF1bHRUcmVlTm9kZVNvdXJjZWxpbmVTdGFydHNjYWNoZWRUZXh0Z2V0VGV4dExpbmVkZWNvZGVhbGxvd01hbGZvcm1lZGVuZE9mTGluZQ1JbnRlcm5hbCBlcnJvcmxhc3RsaW5lSW5kZXhsaW5lU3RhcnRsaW5lTnVtYmVyY29sdW1uTnVtYmVyX0hhc2hNLTcwNzA2NzU1NjU5MjE0MjQwMjNpbnRJczY0Qml0ZmluaXNoY29tYmluZUZpbmlzaGNvbWJpbmUydmFsdWUxdmFsdWUyY29tYmluZTJGaW5pc2hoYXNoMm9iamVjdDFvYmplY3QyY29tYmluZUxpc3RIYXNoaXRlbWNvbWJpbmVMaXN0aGFzaGVzY29tYmluZU1hcEhhc2hVbm9yZGVyZWRlbnRyeUhhc2hlc19zaHJ1OTIyMzM3MjAzNjg1NDc3MTcxMmluZm9ybWF0aXZlc2V0UGFyZW50c25vZGVzdmlzaXRMaXN0dmlzaXRvcnZpc2l0SXRlcmFibGV0cmFuc2Zvcm1UeXBlTGlzdHRyYW5zZm9ybVN1cGVydHlwZUxpc3R0cmFuc2Zvcm1MaXN0Z2V0TWVtYmVyUmVmZXJlbmNlZ2V0Q2xhc3NSZWZlcmVuY2VnZXRDYW5vbmljYWxOYW1lT2ZNZW1iZXIgaGFzIG5vIGNhbm9uaWNhbCBuYW1lZ2V0Q2Fub25pY2FsTmFtZU9mQ2xhc3NnZXRDYW5vbmljYWxOYW1lT2ZFeHRlbnNpb25nZXRDYW5vbmljYWxOYW1lT2ZMaWJyYXJ5bGlzdEhhc2hDb2RlbWFwSGFzaENvZGVtYXBIYXNoQ29kZU9yZGVyZWRtYXBIYXNoQ29kZVVub3JkZXJlZGxpc3RFcXVhbHNtYXBFcXVhbHNnZXRDYW5vbmljYWxOYW1lT2ZUeXBlZGVmX2dldExvY2F0aW9uSW5Db21wb25lbnRkZW1hbmdsZU1peGluQXBwbGljYXRpb25OYW1lbmFtZVBhcnRzc3BsaXQgd2l0aCBkZW1hbmdsZU1peGluQXBwbGljYXRpb25TdWJjbGFzc05hbWVnZXRBc1R5cGVBcmd1bWVudHNrZXJuZWwuYXN0X3RvX2JpbmFyeUJ5dGVzQnVpbGRlckxpYnJhcnlGaWx0ZXJfdmFyaWFibGVJbmRleGVyX2xhYmVsSW5kZXhlcl9zd2l0Y2hDYXNlSW5kZXhlcl90eXBlUGFyYW1ldGVySW5kZXhlcnN0cmluZ0luZGV4ZXJfY29uc3RhbnRJbmRleGVyX3NvdXJjZVVyaUluZGV4ZXJfY3VycmVudGx5SW5Ob25pbXBsZW1lbnRhdGlvbl9zb3VyY2VzRnJvbVJlYWxJbXBsZW1lbnRhdGlvbl9zb3VyY2VzVXNlZEluTGlicmFyeV9saWJyYXJ5RGVwZW5kZW5jeUluZGV4X21ldGFkYXRhU3Vic2VjdGlvbnNfbWFpblNpbmtfbWV0YWRhdGFTaW5rX2NvbnN0YW50c0J5dGVzU2lua19jb25zdGFudHNTaW5rX3NpbmtpbmNsdWRlU291cmNlc2luY2x1ZGVPZmZzZXRzbGlicmFyeU9mZnNldHNjbGFzc09mZnNldHNwcm9jZWR1cmVPZmZzZXRzX2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlX2JpbmFyeU9mZnNldEZvckxpbmtUYWJsZV9iaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzX2JpbmFyeU9mZnNldEZvck1ldGFkYXRhTWFwcGluZ3NfYmluYXJ5T2Zmc2V0Rm9yU3RyaW5nVGFibGVfYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZV9jYW5vbmljYWxOYW1lTGlzdF9rbm93bkNhbm9uaWNhbE5hbWVOb25Sb290VG9wc19yZWluZGV4ZWRDYW5vbmljYWxOYW1lc19jdXJyZW50TGlicmFyeWluc2lkZUV4dGVybmFsTGlicmFyeV9lbXB0eU5hbWVfZmx1c2hmbHVzaEFuZERlc3Ryb3lhZGRCeXRlYWRkQnl0ZXN2bTpwcmVmZXItaW5saW5lYWRkQnl0ZTJhZGRCeXRlNHV0ZjhCeXRlc3dyaXRlU3RyaW5nVGFibGVpbmRleGVydG90YWxMZW5ndGhyZXF1aXJlZE1pbkxlbmd0aGFsbG9jYXRlTWluTGVuZ3RobmV3SW5kZXhuZXdMZW5ndGhjb252ZXJ0ZWRlbmNvZGVyc3RyaW5ncHV0d3JpdGVTdHJpbmdSZWZlcmVuY2VMaXN0c3RyaW5nc3dyaXRlTGlzdHdyaXRlQ29uc3RhbnRUYWJsZWJ1aWxkZXJ0YWtlQnl0ZXN3cml0ZUNvbnN0YW50VGFibGVFbnRyeW9sZFNpbmtpbml0aWFsT2Zmc2V0d3JpdGVJbnRlZ2Vyd3JpdGVEb3VibGV3cml0ZU51bGxBbGxvd2VkUmVmZXJlbmNld3JpdGVDbGFzc1JlZmVyZW5jZXdyaXRlTm9uTnVsbENhbm9uaWNhbE5hbWVSZWZlcmVuY2VVbnN1cHBvcnRlZCBjb25zdGFudCB3cml0ZVVyaVJlZmVyZW5jZWl0ZW1zd3JpdGVJdGVtd3JpdGVOb2RlTGlzdGxlbndyaXRlUHJvY2VkdXJlTm9kZUxpc3R3cml0ZVByb2NlZHVyZU5vZGV3cml0ZUZpZWxkTm9kZUxpc3R3cml0ZUZpZWxkTm9kZXdyaXRlQ2xhc3NOb2RlTGlzdHdyaXRlQ2xhc3NOb2Rld3JpdGVFeHRlbnNpb25Ob2RlTGlzdHdyaXRlRXh0ZW5zaW9uTm9kZXdyaXRlQ29uc3RydWN0b3JOb2RlTGlzdHdyaXRlQ29uc3RydWN0b3JOb2Rld3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGVMaXN0d3JpdGVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3Rvck5vZGV3cml0ZVN3aXRjaENhc2VOb2RlTGlzdHdyaXRlU3dpdGNoQ2FzZU5vZGV3cml0ZUNhdGNoTm9kZUxpc3R3cml0ZUNhdGNoTm9kZXdyaXRlVHlwZWRlZk5vZGVMaXN0d3JpdGVUeXBlZGVmTm9kZV93cml0ZU5vZGVNZXRhZGF0YXdyaXRlRnVuY3Rpb25Ob2Rld3JpdGVBcmd1bWVudHNOb2Rld3JpdGVMaWJyYXJ5Tm9kZXdyaXRlT3B0aW9uYWxOb2Rld3JpdGVPcHRpb25hbEZ1bmN0aW9uTm9kZXdyaXRlTGlua1RhYmxld3JpdGVDYW5vbmljYWxOYW1lRW50cnlpbmRleExpbmtUYWJsZXNob3VsZFdyaXRlTGlicmFyeUNhbm9uaWNhbE5hbWVzX2luZGV4TGlua1RhYmxlSW50ZXJuYWxjaGlsZHJlbmNoaWxkcmVuT3JOdWxsaXNSb290QmluYXJ5UHJpbnRlci53cml0ZUNvbXBvbmVudEZpbGVjb21wb25lbnRPZmZzZXQyNDI3MTc4NDc5d3JpdGVMaXN0T2ZTdHJpbmdzX2NvbGxlY3RNZXRhZGF0YV93cml0ZU5vZGVNZXRhZGF0YUltcGxjaGVja0Nhbm9uaWNhbE5hbWV3cml0ZUxpYnJhcmllc3dyaXRlVXJpVG9Tb3VyY2Vfd3JpdGVNZXRhZGF0YVNlY3Rpb253cml0ZUNvbXBvbmVudEluZGV4c25vZGVPZmZzZXRzdWJzZWN0aW9uTm9kZXMgb2YgdHlwZSAgY2FuJ3QgaGF2ZSBtZXRhZGF0YS5Ob2RlIHdyaXR0ZW4gaW50byBtZXRhZGF0YSBjYW4ndCBoYXZlIG1ldGFkYXRhIChtZXRhZGF0YTogLCBub2RlOiBtZXRhZGF0YU1hcHBpbmdlbnRlcnB1c2hTY29wZXBvcFNjb3BlZXhpdG1hcHBpbmdMZW5ndGhudW1Db21wb25lbnRJbmRleEVudHJpZXN1bmFsaWduZWRTaXpldXJpQXNTdHJpbmdvdXRwdXRTdHJpbmdWaWFCdWZmZXJwcmV2aW91c0xpbmVTdGFydGltcG9ydFVyaUFzU3RyaW5nd3JpdGVMaWJyYXJ5RGVwZW5kZW5jeVJlZmVyZW5jZVJlZmVyZW5jZSB0byBsaWJyYXJ5IGRlcGVuZGVuY3kgIG91dCBvZiBzY29wZU1pc3NpbmcgY2Fub25pY2FsIG5hbWUgZm9yIHdyaXRlTm9uTnVsbFJlZmVyZW5jZUdvdCBudWxsIHJlZmVyZW5jZW5vblJvb3RUb3BFeHBlY3RlZCBhIGNhbm9uaWNhbCBuYW1lIHRvIGJlIHZhbGlkIGJ1dCB3YXMgYG51bGxgLndyaXRlTGlicmFyeVJlZmVyZW5jZWFsbG93TnVsbEV4cGVjdGVkIGEgbGlicmFyeSByZWZlcmVuY2UgdG8gYmUgdmFsaWQgYnV0IHdhcyBgbnVsbGAud3JpdGVPZmZzZXRFeHBlY3RlZCBhIGNsYXNzIHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC53cml0ZUFubm90YXRpb25MaXN0d3JpdGVMaWJyYXJ5RGVwZW5kZW5jaWVzd3JpdGVBZGRpdGlvbmFsRXhwb3J0c3dyaXRlTGlicmFyeVBhcnRzc291cmNlUmVmZXJlbmNlc09mZnNldHNvdXJjZVJlZmVyZW5jZXNDb3VudGltcG9ydE5vZGV3cml0ZUxpYnJhcnlEZXBlbmRlbmN5cmVmcGFydE5vZGV3cml0ZUxpYnJhcnlQYXJ0d3JpdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdHdyaXRlQW5ub3RhdGlvbl9lbmNvZGVDbGFzc0ZsYWdzbGV2ZWxJbmRleHJlc3RvcmVTY29wZWN1cnJlbnRseUluTm9uaW1wbGVtZW50YXRpb25TYXZlZHdyaXRlVmFyaWFibGVEZWNsYXJhdGlvbm9sZExhYmVsc29sZENhc2VzTm8gaW5kZXggZm91bmQgZm9yIGxvZ2ljYWxPcGVyYXRvckluZGV4JiZ8fE5vdCBhIGxvZ2ljYWwgb3BlcmF0b3I6IGJpYXNlZFZhbHVlYWJzYWRkRG91Ymxld3JpdGVTdGF0ZW1lbnRPckVtcHR5X2VuY29kZVRyeUNhdGNoRmxhZ3NuZWVkc1N0YWNrVHJhY2Vhbnl3cml0ZU9wdGlvbmFsVmFyaWFibGVEZWNsYXJhdGlvbmRlY2xhcmVkZXNjcmlwdG9yZGVmYXVsdE5vZGVzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgTm9kZTogZGVmYXVsdENvbnN0YW50c2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIENvbnN0YW50OiBkZWZhdWx0QmFzaWNMaXRlcmFsc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIEJhc2ljTGl0ZXJhbDogZGVmYXVsdENvbnN0YW50UmVmZXJlbmNlc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIENvbnN0YW50IHJlZmVyZW5jZTogZGVmYXVsdERhcnRUeXBlc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIERhcnRUeXBlOiBkZWZhdWx0RXhwcmVzc2lvbnNlcmlhbGl6YXRpb24gb2YgZ2VuZXJpYyBFeHByZXNzaW9uOiBkZWZhdWx0SW5pdGlhbGl6ZXJzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgSW5pdGlhbGl6ZXI6IGRlZmF1bHRNZW1iZXJzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgTWVtYmVyOiBkZWZhdWx0TWVtYmVyUmVmZXJlbmNlc2VyaWFsaXphdGlvbiBvZiBnZW5lcmljIE1lbWJlciByZWZlcmVuY2U6IGRlZmF1bHRTdGF0ZW1lbnRzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgU3RhdGVtZW50OiBzZXJpYWxpemF0aW9uIG9mIGdlbmVyaWMgVHJlZU5vZGU6IHNlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgQm9vbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIENsYXNzIHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIENvbnN0cnVjdG9yIHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIERvdWJsZUNvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgRG91YmxlQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgRmllbGQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgSW5zdGFuY2VDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIEluc3RhbmNlQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgSW50Q29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBJbnRDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5RGVwZW5kZW5jaWVzc2VyaWFsaXphdGlvbiBvZiBMaWJyYXJ5UGFydHNzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIExpc3RDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBTZXRDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFNldENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIE1hcENvbnN0YW50c3NlcmlhbGl6YXRpb24gb2YgTWFwQ29uc3RhbnQgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgTmFtZXNzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIE51bGxDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBQcm9jZWR1cmUgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgQ29tcG9uZW50c3NlcmlhbGl6YXRpb24gb2YgUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3IgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgU3RyaW5nQ29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBTdHJpbmdDb25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBTeW1ib2xDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFN5bWJvbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFBhcnRpYWxJbnN0YW50aWF0aW9uQ29uc3RhbnRzIHNlcmlhbGl6YXRpb24gb2YgUGFydGlhbEluc3RhbnRpYXRpb25Db25zdGFudCByZWZlcmVuY2Vzc2VyaWFsaXphdGlvbiBvZiBUZWFyT2ZmQ29uc3RhbnRzIHNlcmlhbGl6YXRpb24gb2YgVGVhck9mZkNvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFR5cGVMaXRlcmFsQ29uc3RhbnRzc2VyaWFsaXphdGlvbiBvZiBUeXBlTGl0ZXJhbENvbnN0YW50IHJlZmVyZW5jZXNzZXJpYWxpemF0aW9uIG9mIFR5cGVkZWYgcmVmZXJlbmNlc3NlcmlhbGl6YXRpb24gb2YgVW5ldmFsdWF0ZWRDb25zdGFudHNzZXJpYWxpemF0aW9uIG9mIFVuZXZhbHVhdGVkQ29uc3RhbnQgcmVmZXJlbmNlc1ZhcmlhYmxlSW5kZXhlcnNjb3Blc3N0YWNrSGVpZ2h0bnVtYmVyT2ZWYXJpYWJsZXNMYWJlbEluZGV4ZXJTd2l0Y2hDYXNlSW5kZXhlcmNhc2VOb2RlQ29uc3RhbnRJbmRleGVyb2Zmc2V0c25leHRPZmZzZXRfcHJpbnRlcm9sZE9mZnNldG5ld09mZnNldFR5cGVQYXJhbWV0ZXJJbmRleGVyVHlwZSBwYXJhbWV0ZXIgIGlzIG5vdCBpbmRleGVkU3RyaW5nSW5kZXhlclVyaUluZGV4ZXJCdWZmZXJlZFNpbmtTSVpFU0FGRV9TSVpFU01BTExfYnVmZmVyZmx1c2hlZExlbmd0aF9kb3VibGVCdWZmZXJfZG91YmxlQnVmZmVyVWludDhhc1VpbnQ4TGlzdGJ5dGUxYnl0ZTJieXRlM2J5dGU0YWxyZWFkeUVtaXR0ZWRyZW1haW5kZXJmbHVzaHN1Ymxpc3RfTWV0YWRhdGFTdWJzZWN0aW9uQnl0ZXNTaW5rTm90UXVpdGVTdHJpbmd3cml0ZVV0Zjhjb2RlVW5pdG5leHRDaGFycHJlZGljYXRlZXhjbHVkZVVyaVRvU291cmNlbGlicmFyaWVzVG9Xcml0ZWtlcm5lbC5jb3JlX3R5cGVzcmVxdWlyZWRDbGFzc2VzZGFydDpjb3JlT2JqZWN0TnVsbGJvb2xpbnRudW1kb3VibGVTdHJpbmdMaXN0TWFwSXRlcmFibGVJdGVyYXRvclN5bWJvbEZ1bmN0aW9uSW52b2NhdGlvbkZhbGxUaHJvdWdoRXJyb3JkYXJ0Ol9pbnRlcm5hbExhdGVJbml0aWFsaXphdGlvbkVycm9ySW1wbGRhcnQ6YXN5bmNGdXR1cmVTdHJlYW1fY29yZUxpYnJhcnlfb2JqZWN0Q2xhc3NfbnVsbENsYXNzX2Jvb2xDbGFzc19pbnRDbGFzc19udW1DbGFzc19kb3VibGVDbGFzc19zdHJpbmdDbGFzc19saXN0Q2xhc3Nfc2V0Q2xhc3NfbWFwQ2xhc3NfaXRlcmFibGVDbGFzc19pdGVyYXRvckNsYXNzX3N5bWJvbENsYXNzX3R5cGVDbGFzc19mdW5jdGlvbkNsYXNzX2ludm9jYXRpb25DbGFzc19pbnZvY2F0aW9uTWlycm9yQ2xhc3NfaW52b2NhdGlvbk1pcnJvcldpdGhUeXBlQ29uc3RydWN0b3Jfbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3JfbGlzdERlZmF1bHRDb25zdHJ1Y3Rvcl9saXN0RnJvbUNvbnN0cnVjdG9yX2xpc3RVbm1vZGlmaWFibGVDb25zdHJ1Y3Rvcl9pZGVudGljYWxQcm9jZWR1cmVfZmFsbFRocm91Z2hFcnJvclVybEFuZExpbmVDb25zdHJ1Y3Rvcl9vYmplY3RFcXVhbHNfbWFwVW5tb2RpZmlhYmxlX2l0ZXJhYmxlR2V0SXRlcmF0b3JfaXRlcmF0b3JNb3ZlTmV4dF9pdGVyYXRvckdldEN1cnJlbnRfaW50ZXJuYWxTeW1ib2xDbGFzc19hc3luY0xpYnJhcnlfZnV0dXJlQ2xhc3Nfc3RhY2tUcmFjZUNsYXNzX3N0cmVhbUNsYXNzX2FzeW5jQXdhaXRDb21wbGV0ZXJDbGFzc19mdXR1cmVPckNsYXNzX2FzeW5jQXdhaXRDb21wbGV0ZXJDb25zdHJ1Y3Rvcl9jb21wbGV0ZU9uQXN5bmNSZXR1cm5Qcm9jZWR1cmVfY29tcGxldGVyQ29tcGxldGVFcnJvcl9zeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3Jfc3RyZWFtSXRlcmF0b3JEZWZhdWx0Q29uc3RydWN0b3JfYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckRlZmF1bHRDb25zdHJ1Y3Rvcl9hc3luY1N0YXJMaXN0ZW5IZWxwZXJQcm9jZWR1cmVfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXJQcm9jZWR1cmVfYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJQcm9jZWR1cmVfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJQcm9jZWR1cmVfYXdhaXRIZWxwZXJQcm9jZWR1cmVfYm9vbEZyb21FbnZpcm9ubWVudF9sYXRlSW5pdGlhbGl6YXRpb25FcnJvckNvbnN0cnVjdG9yX21pcnJvcnNMaWJyYXJ5X3ByYWdtYUNsYXNzX3ByYWdtYU5hbWVfcHJhZ21hT3B0aW9uc19wcmFnbWFDb25zdHJ1Y3Rvcl9vYmplY3RMZWdhY3lSYXdUeXBlX29iamVjdE51bGxhYmxlUmF3VHlwZV9vYmplY3ROb25OdWxsYWJsZVJhd1R5cGVfbnVsbFR5cGVfYm9vbExlZ2FjeVJhd1R5cGVfYm9vbE51bGxhYmxlUmF3VHlwZV9ib29sTm9uTnVsbGFibGVSYXdUeXBlX2ludExlZ2FjeVJhd1R5cGVfaW50TnVsbGFibGVSYXdUeXBlX2ludE5vbk51bGxhYmxlUmF3VHlwZV9udW1MZWdhY3lSYXdUeXBlX251bU51bGxhYmxlUmF3VHlwZV9udW1Ob25OdWxsYWJsZVJhd1R5cGVfZG91YmxlTGVnYWN5UmF3VHlwZV9kb3VibGVOdWxsYWJsZVJhd1R5cGVfZG91YmxlTm9uTnVsbGFibGVSYXdUeXBlX3N0cmluZ0xlZ2FjeVJhd1R5cGVfc3RyaW5nTnVsbGFibGVSYXdUeXBlX3N0cmluZ05vbk51bGxhYmxlUmF3VHlwZV9saXN0TGVnYWN5UmF3VHlwZV9saXN0TnVsbGFibGVSYXdUeXBlX2xpc3ROb25OdWxsYWJsZVJhd1R5cGVfc2V0TGVnYWN5UmF3VHlwZV9zZXROdWxsYWJsZVJhd1R5cGVfc2V0Tm9uTnVsbGFibGVSYXdUeXBlX21hcExlZ2FjeVJhd1R5cGVfbWFwTnVsbGFibGVSYXdUeXBlX21hcE5vbk51bGxhYmxlUmF3VHlwZV9pdGVyYWJsZUxlZ2FjeVJhd1R5cGVfaXRlcmFibGVOdWxsYWJsZVJhd1R5cGVfaXRlcmFibGVOb25OdWxsYWJsZVJhd1R5cGVfaXRlcmF0b3JMZWdhY3lSYXdUeXBlX2l0ZXJhdG9yTnVsbGFibGVSYXdUeXBlX2l0ZXJhdG9yTm9uTnVsbGFibGVSYXdUeXBlX3N5bWJvbExlZ2FjeVJhd1R5cGVfc3ltYm9sTnVsbGFibGVSYXdUeXBlX3N5bWJvbE5vbk51bGxhYmxlUmF3VHlwZV90eXBlTGVnYWN5UmF3VHlwZV90eXBlTnVsbGFibGVSYXdUeXBlX3R5cGVOb25OdWxsYWJsZVJhd1R5cGVfZnVuY3Rpb25MZWdhY3lSYXdUeXBlX2Z1bmN0aW9uTnVsbGFibGVSYXdUeXBlX2Z1bmN0aW9uTm9uTnVsbGFibGVSYXdUeXBlX2ludm9jYXRpb25MZWdhY3lSYXdUeXBlX2ludm9jYXRpb25OdWxsYWJsZVJhd1R5cGVfaW52b2NhdGlvbk5vbk51bGxhYmxlUmF3VHlwZV9pbnZvY2F0aW9uTWlycm9yTGVnYWN5UmF3VHlwZV9pbnZvY2F0aW9uTWlycm9yTnVsbGFibGVSYXdUeXBlX2ludm9jYXRpb25NaXJyb3JOb25OdWxsYWJsZVJhd1R5cGVfZnV0dXJlTGVnYWN5UmF3VHlwZV9mdXR1cmVOdWxsYWJsZVJhd1R5cGVfZnV0dXJlTm9uTnVsbGFibGVSYXdUeXBlX3N0YWNrVHJhY2VMZWdhY3lSYXdUeXBlX3N0YWNrVHJhY2VOdWxsYWJsZVJhd1R5cGVfc3RhY2tUcmFjZU5vbk51bGxhYmxlUmF3VHlwZV9zdHJlYW1MZWdhY3lSYXdUeXBlX3N0cmVhbU51bGxhYmxlUmF3VHlwZV9zdHJlYW1Ob25OdWxsYWJsZVJhd1R5cGVfZnV0dXJlT3JMZWdhY3lSYXdUeXBlX2Z1dHVyZU9yTnVsbGFibGVSYXdUeXBlX2Z1dHVyZU9yTm9uTnVsbGFibGVSYXdUeXBlX3ByYWdtYUxlZ2FjeVJhd1R5cGVfcHJhZ21hTnVsbGFibGVSYXdUeXBlX3ByYWdtYU5vbk51bGxhYmxlUmF3VHlwZV9sZWdhY3lSYXdUeXBlc19udWxsYWJsZVJhd1R5cGVzX25vbk51bGxhYmxlUmF3VHlwZXNfdGhpc0ludGVyZmFjZVR5cGVzX3RoaXNUeXBlZGVmVHlwZXNfYm90dG9tSW50ZXJmYWNlVHlwZXNhc3luY0Vycm9yV3JhcHBlckhlbHBlclByb2NlZHVyZWdldFRvcExldmVsTWVtYmVyX2FzeW5jRXJyb3JXcmFwcGVySGVscGVyYXN5bmNMaWJyYXJ5Z2V0TGlicmFyeWFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJBZGRnZXRNZW1iZXJfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlcmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJBZGRFcnJvcmFkZEVycm9yYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbWFkZFN0cmVhbWFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDbGFzc2dldENsYXNzYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckNsb3NlYXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlckRlZmF1bHRDb25zdHJ1Y3RvcmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJTdHJlYW1nZXQ6c3RyZWFtYXN5bmNTdGFyTGlzdGVuSGVscGVyX2FzeW5jU3Rhckxpc3RlbkhlbHBlcmFzeW5jU3Rhck1vdmVOZXh0SGVscGVyX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyYXN5bmNTdGFja1RyYWNlSGVscGVyUHJvY2VkdXJlX2FzeW5jU3RhY2tUcmFjZUhlbHBlcmFzeW5jVGhlbldyYXBwZXJIZWxwZXJQcm9jZWR1cmVfYXN5bmNUaGVuV3JhcHBlckhlbHBlcmF3YWl0SGVscGVyUHJvY2VkdXJlX2F3YWl0SGVscGVyYm9vbENsYXNzYXN5bmNBd2FpdENvbXBsZXRlckNsYXNzX0FzeW5jQXdhaXRDb21wbGV0ZXJhc3luY0F3YWl0Q29tcGxldGVyQ29uc3RydWN0b3Jjb21wbGV0ZU9uQXN5bmNSZXR1cm5fY29tcGxldGVPbkFzeW5jUmV0dXJuY29tcGxldGVyQ29tcGxldGVFcnJvckNvbXBsZXRlcmNvbXBsZXRlckZ1dHVyZWdldDpmdXR1cmVjb3JlTGlicmFyeWRvdWJsZUNsYXNzZnVuY3Rpb25DbGFzc2Z1dHVyZUNsYXNzZnV0dXJlT3JDbGFzc3RyeUdldENsYXNzRnV0dXJlT3JpZGVudGljYWxQcm9jZWR1cmVpZGVudGljYWxpbnRDbGFzc2ludGVybmFsU3ltYm9sQ2xhc3NpbnZvY2F0aW9uQ2xhc3NpbnZvY2F0aW9uTWlycm9yQ2xhc3NfSW52b2NhdGlvbk1pcnJvcmludm9jYXRpb25NaXJyb3JXaXRoVHlwZUNvbnN0cnVjdG9yX3dpdGhUeXBlaXRlcmFibGVDbGFzc2l0ZXJhYmxlR2V0SXRlcmF0b3JnZXQ6aXRlcmF0b3JpdGVyYXRvckNsYXNzaXRlcmF0b3JNb3ZlTmV4dGl0ZXJhdG9yR2V0Q3VycmVudGdldDpjdXJyZW50bGlzdENsYXNzbGlzdERlZmF1bHRDb25zdHJ1Y3Rvcmxpc3RGcm9tQ29uc3RydWN0b3JsaXN0VW5tb2RpZmlhYmxlQ29uc3RydWN0b3J1bm1vZGlmaWFibGVzZXRDbGFzc1NldG1hcENsYXNzbWFwVW5tb2RpZmlhYmxlbWlycm9yc0xpYnJhcnl0cnlHZXRMaWJyYXJ5ZGFydDptaXJyb3Jzbm9TdWNoTWV0aG9kRXJyb3JEZWZhdWx0Q29uc3RydWN0b3JOb1N1Y2hNZXRob2RFcnJvcndpdGhJbnZvY2F0aW9ubnVtQ2xhc3NvYmplY3RDbGFzc29iamVjdEVxdWFsc3ByYWdtYUNsYXNzcHJhZ21hcHJhZ21hTmFtZXByYWdtYU9wdGlvbnNwcmFnbWFDb25zdHJ1Y3RvcnN0YWNrVHJhY2VDbGFzc1N0YWNrVHJhY2VzdHJlYW1DbGFzc3N0cmVhbUl0ZXJhdG9yU3Vic2NyaXB0aW9uX1N0cmVhbUl0ZXJhdG9yX3N1YnNjcmlwdGlvbnN0cmVhbUl0ZXJhdG9yQ2FuY2VsY2FuY2Vsc3RyZWFtSXRlcmF0b3JDbGFzc3N0cmVhbUl0ZXJhdG9yRGVmYXVsdENvbnN0cnVjdG9yc3RyZWFtSXRlcmF0b3JNb3ZlTmV4dHN0cmVhbUl0ZXJhdG9yQ3VycmVudHN0cmluZ0NsYXNzc3ltYm9sQ2xhc3NzeW5jSXRlcmFibGVEZWZhdWx0Q29uc3RydWN0b3JfU3luY0l0ZXJhYmxlc3luY0l0ZXJhdG9yQ2xhc3NfU3luY0l0ZXJhdG9yc3luY0l0ZXJhdG9yQ3VycmVudF9jdXJyZW50c3luY0l0ZXJhdG9yWWllbGRFYWNoSXRlcmFibGVfeWllbGRFYWNoSXRlcmFibGV0eXBlQ2xhc3NmYWxsVGhyb3VnaEVycm9yVXJsQW5kTGluZUNvbnN0cnVjdG9yX2NyZWF0ZWJvb2xGcm9tRW52aXJvbm1lbnRmcm9tRW52aXJvbm1lbnRvYmplY3RMZWdhY3lSYXdUeXBlb2JqZWN0TnVsbGFibGVSYXdUeXBlb2JqZWN0Tm9uTnVsbGFibGVSYXdUeXBlVW5zdXBwb3J0ZWQgbnVsbGFiaWxpdHkgIG9uIGFuIEludGVyZmFjZVR5cGUuYm9vbExlZ2FjeVJhd1R5cGVib29sTnVsbGFibGVSYXdUeXBlYm9vbE5vbk51bGxhYmxlUmF3VHlwZWludExlZ2FjeVJhd1R5cGVpbnROdWxsYWJsZVJhd1R5cGVpbnROb25OdWxsYWJsZVJhd1R5cGVudW1MZWdhY3lSYXdUeXBlbnVtTnVsbGFibGVSYXdUeXBlbnVtTm9uTnVsbGFibGVSYXdUeXBlbnVtUmF3VHlwZWRvdWJsZUxlZ2FjeVJhd1R5cGVkb3VibGVOdWxsYWJsZVJhd1R5cGVkb3VibGVOb25OdWxsYWJsZVJhd1R5cGVzdHJpbmdMZWdhY3lSYXdUeXBlc3RyaW5nTnVsbGFibGVSYXdUeXBlc3RyaW5nTm9uTnVsbGFibGVSYXdUeXBlbGlzdExlZ2FjeVJhd1R5cGVsaXN0TnVsbGFibGVSYXdUeXBlbGlzdE5vbk51bGxhYmxlUmF3VHlwZWxpc3RSYXdUeXBlc2V0TGVnYWN5UmF3VHlwZXNldE51bGxhYmxlUmF3VHlwZXNldE5vbk51bGxhYmxlUmF3VHlwZXNldFJhd1R5cGVtYXBMZWdhY3lSYXdUeXBlbWFwTnVsbGFibGVSYXdUeXBlbWFwTm9uTnVsbGFibGVSYXdUeXBlbWFwUmF3VHlwZWl0ZXJhYmxlTGVnYWN5UmF3VHlwZWl0ZXJhYmxlTnVsbGFibGVSYXdUeXBlaXRlcmFibGVOb25OdWxsYWJsZVJhd1R5cGVpdGVyYWJsZVJhd1R5cGVpdGVyYXRvckxlZ2FjeVJhd1R5cGVpdGVyYXRvck51bGxhYmxlUmF3VHlwZWl0ZXJhdG9yTm9uTnVsbGFibGVSYXdUeXBlaXRlcmF0b3JSYXdUeXBlc3ltYm9sTGVnYWN5UmF3VHlwZXN5bWJvbE51bGxhYmxlUmF3VHlwZXN5bWJvbE5vbk51bGxhYmxlUmF3VHlwZXR5cGVMZWdhY3lSYXdUeXBldHlwZU51bGxhYmxlUmF3VHlwZXR5cGVOb25OdWxsYWJsZVJhd1R5cGVmdW5jdGlvbkxlZ2FjeVJhd1R5cGVmdW5jdGlvbk51bGxhYmxlUmF3VHlwZWZ1bmN0aW9uTm9uTnVsbGFibGVSYXdUeXBlZnVuY3Rpb25SYXdUeXBlaW52b2NhdGlvbkxlZ2FjeVJhd1R5cGVpbnZvY2F0aW9uTnVsbGFibGVSYXdUeXBlaW52b2NhdGlvbk5vbk51bGxhYmxlUmF3VHlwZWludm9jYXRpb25SYXdUeXBlaW52b2NhdGlvbk1pcnJvckxlZ2FjeVJhd1R5cGVpbnZvY2F0aW9uTWlycm9yTnVsbGFibGVSYXdUeXBlaW52b2NhdGlvbk1pcnJvck5vbk51bGxhYmxlUmF3VHlwZWludm9jYXRpb25NaXJyb3JSYXdUeXBlZnV0dXJlTGVnYWN5UmF3VHlwZWZ1dHVyZU51bGxhYmxlUmF3VHlwZWZ1dHVyZU5vbk51bGxhYmxlUmF3VHlwZWZ1dHVyZVJhd1R5cGVzdGFja1RyYWNlTGVnYWN5UmF3VHlwZXN0YWNrVHJhY2VOdWxsYWJsZVJhd1R5cGVzdGFja1RyYWNlTm9uTnVsbGFibGVSYXdUeXBlc3RhY2tUcmFjZVJhd1R5cGVzdHJlYW1MZWdhY3lSYXdUeXBlc3RyZWFtTnVsbGFibGVSYXdUeXBlc3RyZWFtTm9uTnVsbGFibGVSYXdUeXBlc3RyZWFtUmF3VHlwZWZ1dHVyZU9yTGVnYWN5UmF3VHlwZWZ1dHVyZU9yTnVsbGFibGVSYXdUeXBlZnV0dXJlT3JOb25OdWxsYWJsZVJhd1R5cGVmdXR1cmVPclJhd1R5cGVwcmFnbWFMZWdhY3lSYXdUeXBlcHJhZ21hTnVsbGFibGVSYXdUeXBlcHJhZ21hTm9uTnVsbGFibGVSYXdUeXBlcHJhZ21hUmF3VHlwZWxlZ2FjeVJhd1R5cGVrbGFzc251bGxhYmxlUmF3VHlwZW5vbk51bGxhYmxlUmF3VHlwZXRoaXNUeXBlZGVmVHlwZWxhdGVJbml0aWFsaXphdGlvbkVycm9yQ29uc3RydWN0b3Jpc1RvcG5vbk51bGxhYmxlVHlwZWlzT2JqZWN0aXNCb3R0b21pc051bGxrZXJuZWwudGFyZ2V0LnRhcmdldHNfVGFyZ2V0QnVpbGRlcmZvcmNlTGF0ZUxvd2VyaW5nRm9yVGVzdGluZ2VuYWJsZU51bGxTYWZldHlEaWFnbm9zdGljUmVwb3J0ZXJDcmVwb3J0Y2hhck9mZnNldE51bWJlclNlbWFudGljc051bWJlclNlbWFudGljcy52bU51bWJlclNlbWFudGljcy5qc2pzQ29uc3RhbnRzQmFja2VuZGxvd2VyTGlzdENvbnN0YW50bG93ZXJTZXRDb25zdGFudGxvd2VyTWFwQ29uc3RhbnRudW1iZXJTZW1hbnRpY3NzaG91bGRJbmxpbmVDb25zdGFudHN1cHBvcnRzVW5ldmFsdWF0ZWRDb25zdGFudHNleHRyYVJlcXVpcmVkTGlicmFyaWVzUGxhdGZvcm1leHRyYUluZGV4ZWRMaWJyYXJpZXNleHRyYURlY2xhcmVkVmFyaWFibGVzcmVxdWlyZWRTZGtDbGFzc2VzZW5hYmxlTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2VuYWJsZVN1cGVyTWl4aW5zcGVyZm9ybU91dGxpbmVUcmFuc2Zvcm1hdGlvbnNwZXJmb3JtUHJlQ29uc3RhbnRFdmFsdWF0aW9uVHJhbnNmb3JtYXRpb25zZGlhZ25vc3RpY1JlcG9ydGVybG9nZ2VyY2hhbmdlZFN0cnVjdHVyZU5vdGlmaWVycGVyZm9ybU1vZHVsYXJUcmFuc2Zvcm1hdGlvbnNPbkxpYnJhcmllc3JlZmVyZW5jZUZyb21JbmRleHBlcmZvcm1UcmFuc2Zvcm1hdGlvbnNPblByb2NlZHVyZW1heURlZmluZVJlc3RyaWN0ZWRUeXBlY29yZWFsbG93UGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2Vzc2ltcG9ydGVyaW1wb3J0ZWRkYXJ0X2ludGVybmFsL2VuYWJsZU5hdGl2ZW5hdGl2ZUV4dGVuc2lvbkV4cGVjdHNTdHJpbmdlcnJvck9uVW5leGFjdFdlYkludExpdGVyYWxzc3VwcG9ydHNTZXRMaXRlcmFsc3N1cHBvcnRzTGF0ZUZpZWxkc2luc3RhbnRpYXRlSW52b2NhdGlvbmlzU3VwZXJpbnN0YW50aWF0ZU5vU3VjaE1ldGhvZEVycm9yaXNNZXRob2Rpc0ZpZWxkaXNMb2NhbFZhcmlhYmxlaXNEeW5hbWljaXNDb25zdHJ1Y3RvcmlzVG9wTGV2ZWxjb25maWd1cmVDb21wb25lbnRUYXJnZXQoY29uY3JldGVMaXN0TGl0ZXJhbENsYXNzY29uY3JldGVDb25zdExpc3RMaXRlcmFsQ2xhc3Njb25jcmV0ZU1hcExpdGVyYWxDbGFzc2NvbmNyZXRlQ29uc3RNYXBMaXRlcmFsQ2xhc3Njb25jcmV0ZUludExpdGVyYWxDbGFzc2NvbmNyZXRlRG91YmxlTGl0ZXJhbENsYXNzY29uY3JldGVTdHJpbmdMaXRlcmFsQ2xhc3Njb25zdGFudHNCYWNrZW5kTm9uZUNvbnN0YW50c0JhY2tlbmROb25lVGFyZ2V0bm9uZXRhcmdldE5hbWVzdGFyZ2V0c3ZtLmJ5dGVjb2RlLmJ5dGVjb2RlX3NlcmlhbGl6YXRpb25CeXRlRGF0YUVuZGlhblVpbnQ4TGlzdFVpbnQxNkxpc3RTdHJpbmdXcml0ZXJTdHJpbmdSZWFkZXJnZXRCeXRlY29kZU9iamVjdE9iamVjdFdyaXRlcndyaXRlT2JqZWN0b2JqZWN0d3JpdGVyT2JqZWN0UmVhZGVycmVhZE9iamVjdHJlYWRlckJ1ZmZlcmVkV3JpdGVyaW5pdGlhbFNpemVhdm9pZENvcHlpbmdTaXplbWluUmVtYWluZGVyVG9LZWVwZm9ybWF0VmVyc2lvbnN0cmluZ1dyaXRlcm9iamVjdFdyaXRlcmxpbmtXcml0ZXJfYnVmZmVyc19idWZmZXJzTGVuZ3RoX2N1cnJlbnRCdWZmZXJfY3VycmVudExlbmd0aF9uZXh0QnVmZmVyU2l6ZWZyb21Xcml0ZXJnZXRDb250ZW50c29mZnNldEluQnl0ZXNwb3NpdGlvbmJ1ZndyaXRlQ29udGVudHNUb0JpbmFyeVNpbmtfYWRkQnl0ZV9mbHVzaEJ1ZmZlcl9mbHVzaEN1cnJlbnRCdWZmZXJfZ3Jvd3ZtOm5ldmVyLWlubGluZWFwcGVuZFVpbnQ4TGlzdHNyY3JlbWFpbmluZ0J5dGVzYXBwZW5kV3JpdGVyVW5hYmxlIHRvIHdyaXRlICBhcyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcndyaXRlUGFja2VkVUludDMwIGFzIDMwLWJpdCB1bnNpZ25lZCBpbnRlZ2Vyd3JpdGVTTEVCMTI4cGFydHdyaXRlUGFja2VkU3RyaW5nUmVmZXJlbmNld3JpdGVQYWNrZWRPYmplY3R3cml0ZVBhY2tlZExpc3RvYmplY3Rzb2Jqd3JpdGVMaW5rT2Zmc2V0Z2V0T2Zmc2V0QnVmZmVyZWRSZWFkZXJzdHJpbmdSZWFkZXJvYmplY3RSZWFkZXJsaW5rUmVhZGVyYmFzZU9mZnNldF9wb3NvZmZzcmVhZFVJbnQzMnJlYWRQYWNrZWRVSW50MzByZWFkU0xFQjEyOHNoaWZ0cmVhZFBhY2tlZFN0cmluZ1JlZmVyZW5jZXJlYWRQYWNrZWRPYmplY3RyZWFkUGFja2VkTGlzdHJlYWRCeXRlc0FzVWludDhMaXN0Y291bnRyZWFkQnl0ZXNBc1VpbnQxNkxpc3Rwb3NyZWFkTGlua09mZnNldHJlYWRMaW5rT2Zmc2V0QXNGb3J3YXJkUmVmZXJlbmNlYWxpZ25hbGlnbm1lbnRTdHJpbmdUYWJsZWZsYWdUd29CeXRlU3RyaW5nX21hcF9vbmVCeXRlU3RyaW5nc190d29CeXRlU3RyaW5nc193cml0dGVucmVhZG51bU9uZUJ5dGVTdHJpbmdzbnVtVHdvQnl0ZVN0cmluZ3NvbmVCeXRlRW5kT2Zmc2V0c3R3b0J5dGVFbmRPZmZzZXRzY2hhckNvZGVzdHdvQnl0ZUJhc2VPZmZzZXRVbmFibGUgdG8gYWRkIGEgc3RyaW5nIHRvIHN0cmluZyB0YWJsZSBhZnRlciBpdCB3YXMgd3JpdHRlbmlzT25lQnl0ZVN0cmluZ2VuZE9mZnNldHV0ZjE2Y29kZVVuaXRTdHJpbmdUYWJsZSB7ICAvLyBPbmUgQnl0ZSBTdHJpbmdzICAiIiAgLy8gVHdvIEJ5dGUgU3RyaW5nc1BhY2tlZFVJbnQzMERlbHRhRW5jb2Rlcl9sYXN0UGFja2VkVUludDMwRGVsdGFEZWNvZGVyU0xFQjEyOERlbHRhRW5jb2RlclNMRUIxMjhEZWx0YURlY29kZXJCeXRlY29kZURlY2xhcmF0aW9uX29mZnNldExpbmtXcml0ZXJPZmZzZXQgb2YgIGlzIG5vdCBzZXRMaW5rUmVhZGVyc2V0T2Zmc2V0b2Zmc2V0VG9PYmplY3RwcmV2aW91c1VuYWJsZSB0byBhc3NvY2lhdGUgb2Zmc2V0ICBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBObyBvYmplY3QgYXQgb2Zmc2V0IEZvcndhcmRSZWZlcmVuY2VOYW1lZEVudHJ5U3RhdGlzdGljc3BhZFJpZ2h0OiAgICBwYWRMZWZ0ICAoY291bnQ6IGNvbXBvbmVudFNpemVvYmplY3RUYWJsZVNpemVvYmplY3RUYWJsZUVudHJpZXNDb3VudHN0cmluZ1RhYmxlU2l6ZWxpYnJhcmllc1NpemVjbGFzc2VzU2l6ZW1lbWJlcnNTaXplY29kZVNpemVzb3VyY2VQb3NpdGlvbnNTaXplc291cmNlRmlsZXNTaXplbGluZVN0YXJ0c1NpemVsb2NhbFZhcmlhYmxlc1NpemVhbm5vdGF0aW9uc1NpemVjb25zdGFudFBvb2xTaXplaW5zdHJ1Y3Rpb25zU2l6ZWNvbnN0YW50UG9vbFN0YXRzb2JqZWN0VGFibGVTdGF0c3Jlc2V0ZHVtcEJ5dGVjb2RlIHNpemUgc3RhdGlzdGljczogIEJ5dGVjb2RlIGNvbXBvbmVudDogICAgIC0gb2JqZWN0IHRhYmxlOiAgICAgICAgKGNvdW50OiAgICAgICAgLSAgICAtIHN0cmluZyB0YWJsZTogICAgICAgTGlicmFyaWVzOiAgICAgICAgICAgICBDbGFzc2VzOiAgICAgICAgICAgICAgIE1lbWJlcnM6ICAgICAgICAgICAgICAgU291cmNlIHBvc2l0aW9uczogICAgICBTb3VyY2UgZmlsZXM6ICAgICAgICAgIExpbmUgc3RhcnRzOiAgICAgICAgICAgTG9jYWwgdmFyaWFibGVzOiAgICAgICBBbm5vdGF0aW9uczogICAgICAgICAgIENvZGU6ICAgICAgICAgICAgICAgICAgIC0gY29uc3RhbnQgcG9vbDogICAgICAgLSBpbnN0cnVjdGlvbnM6ICAgICBkb3VibGVUb0ludEJpdHNzZXRGbG9hdDY0Z2V0SW50NjRpbnRCaXRzVG9Eb3VibGViaXRzc2V0SW50NjRnZXRGbG9hdDY0dm0uYnl0ZWNvZGUuZ2VuX2J5dGVjb2RlYXN0Z2V0RXh0ZXJuYWxOYW1lZ2V0TmF0aXZlRXh0ZW5zaW9uVXJpc0xpYnJhcnlJbmRleGdsb2JhbERlYnVnZ2luZ05hbWVzTmFtZVN5c3RlbVN1YnN0aXR1dGlvbmNvbnRhaW5zVHlwZVZhcmlhYmxlU3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dFN1YnR5cGVDaGVja01vZGVUeXBlRW52aXJvbm1lbnRmbGF0dGVuSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50c2dldERlZmF1bHRGdW5jdGlvblR5cGVBcmd1bWVudHNnZXRJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzZ2V0VHlwZVBhcmFtZXRlclR5cGVzaGFzRnJlZVR5cGVQYXJhbWV0ZXJzaGFzSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50c2lzQWxsRHluYW1pY2lzQ2FsbFRocm91Z2hHZXR0ZXJpc0luc3RhbnRpYXRlZEludGVyZmFjZUNhbGxpc1VuY2hlY2tlZENhbGxpc1VuY2hlY2tlZENsb3N1cmVDYWxsTG9jYWxWYXJpYWJsZVRhYmxlTG9jYWxWYXJpYWJsZXNOdWxsYWJpbGl0eURldGVjdG9yT2JqZWN0SGFuZGxlT2JqZWN0VGFibGVOYW1lQW5kVHlwZXRvcExldmVsQ2xhc3NOYW1lUmVjb2duaXplZE1ldGhvZHNJbGxlZ2FsUmVjdXJzaXZlVHlwZUV4Y2VwdGlvbkxpbmVTdGFydHNTb3VyY2VQb3NpdGlvbnNEaXJlY3RDYWxsTWV0YWRhdGFEaXJlY3RDYWxsTWV0YWRhdGFSZXBvc2l0b3J5SW5mZXJyZWRUeXBlSW5mZXJyZWRUeXBlTWV0YWRhdGFSZXBvc2l0b3J5T2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNNZXRhZGF0YVJlcG9zaXRvcnlQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGFSZXBvc2l0b3J5bWF0aEdlbmVyYXRlQ29udGludWF0aW9uQnl0ZWNvZGVHZW5lcmF0b3JjYWxsTmFtZW5vU3VjaE1ldGhvZE5hbWVub1N1Y2hNZXRob2RzdGF0aWNUeXBlQ29udGV4dHJlY29nbml6ZWRNZXRob2RzYXN0VXJpVG9Tb3VyY2VzdHJpbmdUYWJsZW9iamVjdFRhYmxlYnl0ZWNvZGVDb21wb25lbnRudWxsYWJpbGl0eURldGVjdG9yZGlyZWN0Q2FsbE1ldGFkYXRhcHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeXByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YWluZmVycmVkVHlwZU1ldGFkYXRhaW5mZXJyZWRUeXBlc0F0dHJpYnV0ZWNsYXNzRGVjbGFyYXRpb25zZmllbGREZWNsYXJhdGlvbnNmdW5jdGlvbkRlY2xhcmF0aW9uc2VuY2xvc2luZ01lbWJlcmVuY2xvc2luZ0Z1bmN0aW9ucGFyZW50RnVuY3Rpb25pc0Nsb3N1cmVjbGFzc1R5cGVQYXJhbWV0ZXJzZnVuY3Rpb25UeXBlUGFyYW1ldGVyc2Z1bmN0aW9uVHlwZVBhcmFtZXRlcnNTZXRpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzbG9jYWxzbGFiZWxlZFN0YXRlbWVudHNzd2l0Y2hDYXNlc3RyeUNhdGNoZXNmaW5hbGx5QmxvY2tzeWllbGRQb2ludHNjb250ZXh0TGV2ZWxzY2xvc3VyZXNpbml0aWFsaXplZEZpZWxkc251bGxhYmxlRmllbGRzY3Bhc21zYXZlZEFzc2VtYmxlcnNoYXNFcnJvcnNjdXJyZW50TG9vcERlcHRoc2F2ZWRNYXhTb3VyY2VQb3NpdGlvbnNtYXhTb3VyY2VQb3NpdGlvbl9saXN0RnJvbUxpdGVyYWxfbWFwRnJvbUxpdGVyYWxfaW50ZXJwb2xhdGVTaW5nbGVfaW50ZXJwb2xhdGVfY2xvc3VyZUNsYXNzX29iamVjdEluc3RhbmNlT2Zfb2JqZWN0U2ltcGxlSW5zdGFuY2VPZl9jbG9zdXJlSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50c19jbG9zdXJlRnVuY3Rpb25UeXBlQXJndW1lbnRzX2Nsb3N1cmVEZWxheWVkVHlwZUFyZ3VtZW50c19jbG9zdXJlRnVuY3Rpb25fY2xvc3VyZUNvbnRleHRfcHJlcGVuZFR5cGVBcmd1bWVudHNfYm91bmRzQ2hlY2tGb3JQYXJ0aWFsSW5zdGFudGlhdGlvbl9mdXR1cmVWYWx1ZV90aHJvd05ld0xhdGVJbml0aWFsaXphdGlvbkVycm9yX3Rocm93TmV3QXNzZXJ0aW9uRXJyb3JfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yX3Vuc2FmZUNhc3RfaXRlcmFibGVJdGVyYXRvcl9pdGVyYXRvckN1cnJlbnRfYXN5bmNBd2FpdENvbXBsZXRlckdldEZ1dHVyZV9zZXRBc3luY1RocmVhZFN0YWNrVHJhY2VfY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2VfZGFydEZmaUxpYnJhcnltYWluTGlicmFyeWdldEhhbmRsZXZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGF2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhb2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNNZXRhZGF0YVJlcG9zaXRvcnlwcm90ZWN0ZWROYW1lc2VudGVyTGlicmFyeXN0YXJ0TWVtYmVyc2VuZE1lbWJlcnNnZXRUb3BMZXZlbENsYXNzRGVjbGFyYXRpb25nZXRMaWJyYXJ5RGVjbGFyYXRpb25sZWF2ZUxpYnJhcnlnZXRDbGFzc0RlY2xhcmF0aW9uZ2V0U2NyaXB0aW5jbHVkZVNvdXJjZUluZm9lbWl0U291cmNlUG9zaXRpb25zYXN0U291cmNlZ2V0Q29uc3RTdHJpbmdIYW5kbGVzb3VyY2VGaWxlc2dldFNjcmlwdEhhbmRsZWRhcnRGZmlMaWJyYXJ5Z2V0UHVibGljTmFtZUhhbmRsZXNjcmlwdGV4dGVuc2lvblVyaXNnZXRDb25zdFN0cmluZ0hhbmRsZXNudW1UeXBlQXJndW1lbnRzZ2V0VHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbmVuZFBvc2l0aW9uZ2V0QW5ub3RhdGlvbnNoYXNQcmFnbWFuYW1lSGFuZGxlZ2V0TmFtZUhhbmRsZXN1cGVyVHlwZWludGVyZmFjZXNnZXRIYW5kbGVzdGNsYXNzRGVjbGFyYXRpb25nZXRMaWJyYXJ5QW5ub3RhdGlvbnNfaXNQcmFnbWFjb25zdGFudHNfZ2V0Q29uc3RhbnRlbWl0QW5ub3RhdGlvbnNkZWNsZ2V0TWVtYmVyQXR0cmlidXRlc2F0dHJzYXR0cmlidXRlZ2V0Qnl0ZWNvZGVBdHRyaWJ1dGVnZXRDbG9zdXJlQXR0cmlidXRlc2dldEZ1bmN0aW9uQW5ub3RhdGlvbnNmdW5jdGlvbk5vZGVzcGFyYW1ldGVyTm9kZUxpc3RzZXZlcnlmdW5jdGlvbkNvbnN0YW50c2Z1bmN0aW9uT2JqZWN0ZnVuY3Rpb25EZWNscGFyYW1ldGVyTm9kZXNwYXJhbWV0ZXJDb25zdGFudHNwYXJhbWV0ZXJPYmplY3RwYXJhbWV0ZXJEZWNsZW1pdERlcGVuZGVuY2llc2Fubm90YXRpb25zRGVjbGRlcHNwcmVmaXhzaG93TmFtZXNoaWRlTmFtZXNkZXBBbm5vdHNkZXBlbmRlbmNpZXNPYmplY3RkZXBlbmRlbmNpZXNEZWNsZ2V0RmllbGREZWNsYXJhdGlvbl9oYXNOb25Ucml2aWFsSW5pdGlhbGl6ZXJtYW5nbGVNZW1iZXJOYW1lZ2V0dGVyTmFtZXNldHRlck5hbWVfbmVlZHNHZXR0ZXJfbmVlZHNTZXR0ZXJpc1JlZmxlY3RhYmxlYXR0cmlidXRlc2lzSW5Bbm9ueW1vdXNNaXhpbmdldEZ1bmN0aW9uRGVjbGFyYXRpb25jb2RlX2hhc0NvZGVpc0RlYnVnZ2FibGVuYXRpdmVOYW1lZXh0ZXJuYWxOYW1lcGFyYW1ldGVyc3BhcmFtZ2V0UGFyYW1ldGVyRGVjbGFyYXRpb25hc3luY0F3YWl0Q29tcGxldGVyR2V0RnV0dXJldHlwZVBhcmFtc2dldFR5cGVQYXJhbWV0ZXJIYW5kbGVzdHlwZUhhbmRsZWdldFBhcmFtZXRlckZsYWdzZ2V0RmxhZ3NwYXJhbUZsYWdzaGFzQ29kZV9nZW5QdXNoQ29uc3RFeHByX2dlbmVyYXRlTm9kZV9nZW5SZXR1cm5UT1NfZ2VuQ29uc3RydWN0b3JJbml0aWFsaXplcnNfZ2VuTmF0aXZlQ2FsbGVtaXRQdXNoTnVsbF9yZWNvcmRTb3VyY2VQb3NpdGlvblVuZXhwZWN0ZWQgbWVtYmVyIERhcnQgYnl0ZWNvZGUgbGltaXQgZXhjZWVkZWQ6IHRvbyBtYW55IGFyZ3VtZW50cy5CeXRlY29kZUxpbWl0RXhjZWVkZWRUb29NYW55QXJndW1lbnRzd2l0aExvY2F0aW9uaGFzSW5pdGlhbGl6ZXJDb2RlZW1pdEluc3RhbmNlRmllbGRJbml0aWFsaXplcnNoYXNGYWN0b3J5VHlwZUFyZ3NWYXJlbWl0UHVzaGdldFZhckluZGV4SW5GcmFtZWZhY3RvcnlUeXBlQXJnc1Zhcmhhc0Z1bmN0aW9uVHlwZUFyZ3NWYXJmdW5jdGlvblR5cGVBcmdzVmFySW5kZXhJbkZyYW1laGFzUmVjZWl2ZXJyZWNlaXZlclZhcm9yaWdpbmFsTmFtZWRQYXJhbWV0ZXJzbmF0aXZlRW50cnlDcEluZGV4YWRkTmF0aXZlRW50cnllbWl0TmF0aXZlQ2FsbGxpYnJhcnlJbmRleGxpc3RGcm9tTGl0ZXJhbF9mcm9tTGl0ZXJhbG1hcEZyb21MaXRlcmFsaW50ZXJwb2xhdGVTaW5nbGVfU3RyaW5nQmFzZWludGVycG9sYXRlY2xvc3VyZUNsYXNzX0Nsb3N1cmVvYmplY3RJbnN0YW5jZU9mX2luc3RhbmNlT2ZvYmplY3RTaW1wbGVJbnN0YW5jZU9mX3NpbXBsZUluc3RhbmNlT2ZjbG9zdXJlSW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50c19pbnN0YW50aWF0b3JfdHlwZV9hcmd1bWVudHNjbG9zdXJlRnVuY3Rpb25UeXBlQXJndW1lbnRzX2Z1bmN0aW9uX3R5cGVfYXJndW1lbnRzY2xvc3VyZURlbGF5ZWRUeXBlQXJndW1lbnRzX2RlbGF5ZWRfdHlwZV9hcmd1bWVudHNjbG9zdXJlRnVuY3Rpb25fZnVuY3Rpb25jbG9zdXJlQ29udGV4dF9jb250ZXh0cHJlcGVuZFR5cGVBcmd1bWVudHNib3VuZHNDaGVja0ZvclBhcnRpYWxJbnN0YW50aWF0aW9uZnV0dXJlVmFsdWV0aHJvd05ld0xhdGVJbml0aWFsaXphdGlvbkVycm9yX0xhdGVJbml0aWFsaXphdGlvbkVycm9yX3Rocm93TmV3dGhyb3dOZXdBc3NlcnRpb25FcnJvcl9Bc3NlcnRpb25FcnJvcmFsbG9jYXRlSW52b2NhdGlvbk1pcnJvcnVuc2FmZUNhc3RpdGVyYWJsZUl0ZXJhdG9yaXRlcmF0b3JDdXJyZW50dHJ5R2V0TWVtYmVyc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2VkYXJ0OmZmaWN1cnJlbnRTb3VyY2VQb3NpdGlvbnNhdmVkU291cmNlUG9zaXRpb25fZ2VuZXJhdGVOb2RlTGlzdGlzUmVkaXJlY3Rpbmdpbml0aWFsaXplZEluSW5pdGlhbGl6ZXJzTGlzdF9nZW5MYXRlRmllbGRJbml0aWFsaXplcmVtaXREcm9wMV9nZW5GaWVsZEluaXRpYWxpemVyX2dlblB1c2hSZWNlaXZlcmNwSW5kZXhhZGRJbnN0YW5jZUZpZWxkZW1pdFN0b3JlRmllbGRUT1NfaXNUcml2aWFsSW5pdGlhbGl6ZXJlbWl0SW5pdExhdGVGaWVsZF9nZW5Bcmd1bWVudHNzdG9yZVJlY2VpdmVyVG9Mb2NhbF9nZW5UeXBlQXJndW1lbnRzZW1pdFN0b3JlTG9jYWxuZV9nZW5QdXNoQm9vbGVtaXRQdXNoVHJ1ZWVtaXRQdXNoRmFsc2VfZ2VuUHVzaEludGJpdExlbmd0aGVtaXRQdXNoSW50ZW1pdFB1c2hDb25zdGFudGFkZE9iamVjdFJlZl9nZW5QdXNoTm5iZE1vZGVleHByRXhwZWN0ZWQgY29uc3RhbnQsIGdvdCBfZ2VuUHVzaENvbnN0YW50eWllbGRTb3VyY2VQb3NpdGlvbmNhdXNhbEFzeW5jU3RhY2tzX2dlbkRpcmVjdENhbGxnZXRBcmdEZXNjSGFuZGxlZW1pdFlpZWxkUG9pbnRTb3VyY2VQb3NpdGlvbmVtaXRSZXR1cm5UT1NhcmdEZXNjdG90YWxBcmdDb3VudGlzR2V0aXNTZXRpc0R5bmFtaWNGb3J3YXJkZXJpc1VuY2hlY2tlZEludm9jYXRpb25LaW5kLmdldHRlckludm9jYXRpb25LaW5kLnNldHRlckludm9jYXRpb25LaW5kLm1ldGhvZGFkZERpcmVjdENhbGxfYXBwZW5kSW5mZXJyZWRUeXBlZW1pdFVuY2hlY2tlZERpcmVjdENhbGxlbWl0RGlyZWN0Q2FsbF9yZXBsYWNlV2l0aENvbnN0YW50VmFsdWVfZ2VuRGlyZWN0Q2FsbFdpdGhBcmdzZ2V0QXJnRGVzY0hhbmRsZUJ5QXJndW1lbnRzdHlwZUFyZ3NpbnN0YW50aWF0aW5nQ2xhc3N0eXBlQXJnc0NQSW5kZXhhZGRUeXBlQXJndW1lbnRzZmxhdHRlbmVkVHlwZUFyZ3NfY2FuUmV1c2VJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzX2dlblB1c2hJbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzX2NhblJldXNlRnVuY3Rpb25UeXBlQXJndW1lbnRzX2dlblB1c2hGdW5jdGlvblR5cGVBcmd1bWVudHNfZ2VuUHVzaEluc3RhbnRpYXRvckFuZEZ1bmN0aW9uVHlwZUFyZ3VtZW50c2VtaXRJbnN0YW50aWF0ZVR5cGVBcmd1bWVudHNUT1NfZ2VuTG9hZFZhcmFkZFR5cGVBcmd1bWVudHNGaWVsZGVtaXRMb2FkVHlwZUFyZ3VtZW50c0ZpZWxkdHlwZUFyZ19nZW5QdXNoQ29udGV4dEZvclZhcmlhYmxlY3VycmVudENvbnRleHRMZXZlbGdldENvbnRleHRMZXZlbE9mVmFyY29udGV4dFZhckluZGV4SW5GcmFtZWVtaXRMb2FkQ29udGV4dFBhcmVudF9nZW5QdXNoQ29udGV4dElmQ2FwdHVyZWRpc0NhcHR1cmVkZW1pdExvYWRDb250ZXh0VmFyZ2V0VmFyQ29udGV4dElkZ2V0VmFySW5kZXhJbkNvbnRleHRfZ2VuU3RvcmVWYXJlbWl0U3RvcmVDb250ZXh0VmFyZW1pdFBvcExvY2FsX2dlbkNvbmRpdGlvbm5lZ2F0ZWRlbWl0QXNzZXJ0Qm9vbGVhbl9jb25zdGFudENvbmRpdGlvblZhbHVla2VlcFVucmVhY2hhYmxlQ29kZV9nZW5Db25kaXRpb25BbmRKdW1wSWZkZXN0Y29uc3RhbnRWYWx1ZWVtaXRKdW1wZW1pdERlYnVnZ2VyU3RvcHNlbWl0RGVidWdDaGVja2VtaXRKdW1wSWZOdWxsZW1pdEp1bXBJZk5vdE51bGxpc09Sc2hvcnRDaXJjdWl0ZG9uZWJpbmRlbWl0SnVtcElmVHJ1ZWVtaXRKdW1wSWZGYWxzZV9nZXREZWZhdWx0UGFyYW1Db25zdEluZGV4X2dlbkR1cFRPU3RlbXBJbmRleEluRnJhbWVfZ2VuSW5zdGFuY2VPZmFkZFR5cGVhZGRJbnRlcmZhY2VDYWxsZW1pdEludGVyZmFjZUNhbGxlbnRlck1lbWJlcmlzU3luY1lpZWxkaW5nRnJhbWVfZ2VuUHJvbG9ndWVfc2V0dXBJbml0aWFsQ29udGV4dF9lbWl0Rmlyc3REZWJ1Z0NoZWNrX2NoZWNrQXJndW1lbnRzX2dlbkVxdWFsc09wZXJhdG9yTnVsbEhhbmRsaW5ncGNtZGlzVW5yZWFjaGFibGVjb25jcmV0ZUNsYXNzbnVtUGFyYW1ldGVyc2VtaXRMb2NhbFZhckluZm9sb2NhbFZhcmlhYmxlVGFibGVsZWF2ZUFsbFNjb3Blc3BhcmFtZXRlckZsYWdzZm9yd2FyZGluZ1N0dWJUYXJnZXRDcEluZGV4ZGVmYXVsdEZ1bmN0aW9uVHlwZUFyZ3NDcEluZGV4ZGVmYXVsdFR5cGVzYnl0ZWNvZGVleGNlcHRpb25zVGFibGVmaW5hbGl6ZVNvdXJjZVBvc2l0aW9uc2ZpbmFsaXplTG9jYWxWYXJpYWJsZXNjb2Rlc2xlYXZlTWVtYmVyc291cmNlUG9zaXRpb25zbG9jYWxWYXJpYWJsZXNoYXNBY3RpdmVTY29wZXNoYXNPcHRpb25hbFBhcmFtZXRlcnNudW1PcHRpb25hbFBvc2l0aW9uYWxudW1PcHRpb25hbE5hbWVkbnVtRml4ZWRlbWl0RW50cnlPcHRpb25hbGVtaXRMb2FkQ29uc3RhbnRzb3J0ZWROYW1lZFBhcmFtZXRlcnNhZGROYW1lZW1pdEZyYW1lZnJhbWVTaXplZW1pdEVudHJ5Rml4ZWRlbWl0RW50cnljbG9zdXJlVmFySW5kZXhJbkZyYW1lZW1pdExvYWRGaWVsZFRPU19oYW5kbGVEZWxheWVkVHlwZUFyZ3VtZW50c2VtaXRDaGVja0Z1bmN0aW9uVHlwZUFyZ3NfaGFuZGxlRGVmYXVsdFR5cGVBcmd1bWVudHNzY3JhdGNoVmFySW5kZXhJbkZyYW1lY29udGV4dExldmVsQXRFbnRyeWhhc0NvbnRleHRWYXJyZWNvcmRDb250ZXh0VmFyaWFibGVfZGVjbGFyZUxvY2FsVmFyaWFibGVmdW5jdGlvblR5cGVBcmdzVmFyZW1pdENoZWNrU3RhY2tudW1QYXJlbnRUeXBlQXJnc251bVBhcmVudFR5cGVBcmd1bWVudHNfaW5pdENvbnN0YW50UGFyYW1ldGVyc2RvbmVDaGVja2luZ1R5cGVBcmd1bWVudHNub0RlbGF5ZWRUeXBlQXJnc2FkZEVtcHR5VHlwZUFyZ3VtZW50c2VtaXRKdW1wSWZFcVN0cmljdGVtaXRKdW1wSWZOb3RaZXJvVHlwZUFyZ3NfaW5pdFBhcmFtZXRlcklmQ29uc3RhbnRnZXRPcmlnaW5hbFBhcmFtU2xvdEluZGV4X2FsbG9jYXRlQ29udGV4dElmTmVlZGVkY3VycmVudENvbnRleHRTaXplaGFzQ2FwdHVyZWRQYXJhbWV0ZXJzX2NvcHlQYXJhbUlmQ2FwdHVyZWRoYXNDYXB0dXJlZFJlY2VpdmVyVmFyY2FwdHVyZWRSZWNlaXZlclZhcmluaXRpYWxpemVkUG9zaXRpb25kZWNsYXJlVmFyaWFibGVjYW5Ta2lwVHlwZUNoZWNrc0Zvck5vbkNvdmFyaWFudEFyZ3VtZW50c3NraXBUeXBlQ2hlY2tzRm9yR2VuZXJpY0NvdmFyaWFudEltcGxBcmd1bWVudHNoYXNOb25UaGlzVXNlc2hhc1RlYXJPZmZVc2VzX2dldEZvcndhcmRpbmdTdHViU3VwZXJUYXJnZXRfZ2V0Rm9yd2FyZGluZ1N1YnN0aXR1dGlvbmhvc3Rmb3J3YXJkaW5nVGFyZ2V0dGFyZ2V0Q2xhc3NpbnN0YW50aWF0ZWRUYXJnZXRDbGFzc0NsYXNzICBpcyBub3QgZm91bmQgYW1vbmcgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyBvZiAoZm9yIGZvcndhcmRpbmcgc3R1YiB0YXJnZXRUeXBlUGFyYW1ldGVyc19nZXRGb3J3YXJkaW5nQm91bmRzZm9yd2FyZGluZ1N1YnN0aXR1dGlvbmZvcndhcmRpbmdCb3VuZHNfZ2V0Rm9yd2FyZGluZ1BhcmFtZXRlclR5cGVzZm9yd2FyZGluZ1BhcmFtc2hvc3RQYXJhbXRhcmdldFBhcmFtZm9yd2FyZGluZ1BhcmFtVHlwZXNfaGFzU2tpcHBhYmxlVHlwZUNoZWNrc3NraXBDaGVja3NlbWl0SnVtcElmVW5jaGVja2VkdHlwZVBhcmFtX3R5cGVQYXJhbWV0ZXJOZWVkc0JvdW5kQ2hlY2tfZ2VuVHlwZVBhcmFtZXRlckJvdW5kQ2hlY2tfcGFyYW1ldGVyTmVlZHNUeXBlQ2hlY2tfZ2VuQXJndW1lbnRUeXBlQ2hlY2tmb3J3YXJkaW5nVHlwZVBhcmFtZXRlckJvdW5kc2ZvcndhcmRpbmdQYXJhbWV0ZXJUeXBlc2VtaXRBc3NlcnRTdWJ0eXBlX2dlbkFzc2VydEFzc2lnbmFibGVhZGRTdHJpbmdpc0ludE9rU3VidHlwZUNoZWNrTW9kZS5pZ25vcmluZ051bGxhYmlsaXRpZXNzdWJ0eXBlVGVzdENhY2hlQ3BJbmRleGFkZFN1YnR5cGVUZXN0Q2FjaGVlbWl0QXNzZXJ0QXNzaWduYWJsZV9wdXNoQXNzZW1ibGVyU3RhdGVfcG9wQXNzZW1ibGVyU3RhdGVfZ2VuQ2xvc3VyZUJ5dGVjb2Rlc2F2ZWRQYXJlbnRGdW5jdGlvbnNhdmVkSXNDbG9zdXJlc2F2ZWRMb29wRGVwdGhzYXZlZEluZmVycmVkVHlwZXNBdHRyaWJ1dGVzYXZlZFlpZWxkUG9pbnRzY2xvc3VyZUluZGV4Y2xvc3VyZWdldENsb3N1cmVEZWNsYXJhdGlvbmNsb3N1cmVGdW5jdGlvbkluZGV4YWRkQ2xvc3VyZUZ1bmN0aW9uYXN5bmNTdGFja1RyYWNlVmFyY29udGludWF0aW9uU3dpdGNoTGFiZWxjb250aW51YXRpb25Td2l0Y2hWYXJfZ2VuU3luY1lpZWxkaW5nUHJvbG9ndWVfZ2VuU3luY1lpZWxkaW5nRXBpbG9ndWVhZGRFbmRDbG9zdXJlRnVuY3Rpb25TY29wZWRlY2xhcmVDbG9zdXJlY29udGludWF0aW9uTGFiZWxzd2l0Y2hWYXJJbmRleEluRnJhbWVkZWJ1Z0NoZWNrTGFiZWxhd2FpdEp1bXBWYXJlbWl0SnVtcElmTmVTdHJpY3RlbWl0VHJhcGF3YWl0Q29udGV4dFZhcl9nZW5BbGxvY2F0ZUNsb3N1cmVJbnN0YW5jZWVtaXRBbGxvY2F0ZUNsb3N1cmVfZ2VuQ2xvc3VyZWNvbnRleHRTaXplZW1pdEFsbG9jYXRlQ29udGV4dGN1cnJlbnRDb250ZXh0SWRlbWl0U3RvcmVDb250ZXh0UGFyZW50X2VudGVyU2NvcGVfc3RhcnRSZWNvcmRpbmdNYXhQb3NpdGlvbl9sZWF2ZVNjb3BlX2VuZFJlY29yZGluZ01heFBvc2l0aW9uX2dlblVud2luZENvbnRleHRsb2NhbE1heHRhcmdldENvbnRleHRMZXZlbF9nZXRFbmNsb3NpbmdUcnlGaW5hbGx5QmxvY2tzYmxvY2tzVW5hYmxlIHRvIGZpbmQgbm9kZSAgdXAgZnJvbSBfYWRkRmluYWxseUJsb2Nrc3RyeUZpbmFsbHlCbG9ja3Njb250aW51YXRpb25yZXZlcnNlZHRyeUZpbmFsbHlmaW5hbGx5QmxvY2tuZXh0RmluYWxseV9nZW5lcmF0ZU5vbkxvY2FsQ29udHJvbFRyYW5zZmVyaXNFeHByZXNzaW9uV2l0aG91dFJlc3VsdF9jcmVhdGVBcmd1bWVudHNBcnJheXN0b3JlTGFzdEFyZ3VtZW50VG9UZW1wdG90YWxDb3VudGVtaXRDcmVhdGVBcnJheVRPU2VtaXRTdG9yZUluZGV4ZWRUT1NfZ2VuTm9TdWNoTWV0aG9kRm9yU3VwZXJDYWxsYXJnRGVzY0NwSW5kZXhVbnN1cHBvcnRlZCBub2RlICBpbiB0eXBlIGNhc3RvdGhlcndpc2VQYXJ0Y29uc3RydWN0ZWRDbGFzc2NsYXNzSW5kZXhlbWl0QWxsb2NhdGVUZW1pdEFsbG9jYXRlVW5zdXBwb3J0ZWQgRGlyZWN0TWV0aG9kSW52b2NhdGlvbiB3aXRoIHRhcmdldCBVbnN1cHBvcnRlZCBEaXJlY3RQcm9wZXJ0eUdldCB3aXRoIGhhc1Jlc3VsdDxhbm9ueW1vdXMgY2xvc3VyZT5vbGRDbG9zdXJldGVtcEluZGV4bmV3Q2xvc3VyZWZpZWxkc1RvQ29weWZpZWxkT2Zmc2V0Q3BJbmRleGVtaXRCb29sZWFuTmVnYXRlVE9TX2dlbk1ldGhvZEludm9jYXRpb25Vc2luZ1NwZWNpYWxpemVkQnl0ZWNvZGVvcGNvZGVPcGNvZGUua0VxdWFsc051bGxPcGNvZGUua05lZ2F0ZUludE9wY29kZS5rTmVnYXRlRG91YmxlT3Bjb2RlLmtBZGRJbnRPcGNvZGUua1N1YkludE9wY29kZS5rTXVsSW50T3Bjb2RlLmtUcnVuY0RpdkludE9wY29kZS5rTW9kSW50T3Bjb2RlLmtCaXRBbmRJbnRPcGNvZGUua0JpdE9ySW50T3Bjb2RlLmtCaXRYb3JJbnRPcGNvZGUua1NobEludE9wY29kZS5rU2hySW50T3Bjb2RlLmtDb21wYXJlSW50RXFPcGNvZGUua0NvbXBhcmVJbnRHdE9wY29kZS5rQ29tcGFyZUludEx0T3Bjb2RlLmtDb21wYXJlSW50R2VPcGNvZGUua0NvbXBhcmVJbnRMZU9wY29kZS5rQWRkRG91YmxlT3Bjb2RlLmtTdWJEb3VibGVPcGNvZGUua011bERvdWJsZU9wY29kZS5rRGl2RG91YmxlT3Bjb2RlLmtDb21wYXJlRG91YmxlRXFPcGNvZGUua0NvbXBhcmVEb3VibGVHdE9wY29kZS5rQ29tcGFyZURvdWJsZUx0T3Bjb2RlLmtDb21wYXJlRG91YmxlR2VPcGNvZGUua0NvbXBhcmVEb3VibGVMZVVuZXhwZWN0ZWQgc3BlY2lhbGl6ZWQgYnl0ZWNvZGUgZW1pdFNwZWNpYWxpemVkQnl0ZWNvZGVfaXNVbmNoZWNrZWRDYWxsc2tpcENoZWNrX2dlbkluc3RhbmNlQ2FsbGludm9jYXRpb25LaW5kZ2VuZXJhdGVkc3RhdGljUmVjZWl2ZXJUeXBlY2FsbENwSW5kZXhhZGRJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsZW1pdEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGxhZGRJbnN0YW5jZUNhbGxlbWl0RHluYW1pY0NhbGxlbWl0VW5jaGVja2VkSW50ZXJmYWNlQ2FsbF9nZW5DYWxsVGhyb3VnaEdldHRlcnJlY2VpdmVyVGVtcGNoZWNrRm9yTnVsbGVtaXROdWxsQ2hlY2thZGRTZWxlY3Rvck5hbWVkaXJlY3RDYWxsc3BlY2lhbGl6ZWRCeXRlY29kZUZvcmFkZEFyZ0Rlc2NCeUFyZ3VtZW50c2VtaXRVbmNoZWNrZWRDbG9zdXJlQ2FsbGNoZWNrUmVjZWl2ZXJGb3JOdWxsYWRkQXJnRGVzY29wZXJhbmRUZW1wdHJ5Q2F0Y2hVbmFibGUgdG8gZmluZCBlbmNsb3NpbmcgY2F0Y2ggZm9yIF9nZW5SZXRocm93ZW1pdExvYWRTdGF0aWNhZGRTdGF0aWNGaWVsZFVuZXhwZWN0ZWQgdGFyZ2V0IGZvciBTdGF0aWNHZXQ6IGZhY3RvcnkgVW5leHBlY3RlZCB0YXJnZXQgZm9yIFN0YXRpY0dldDogX3ZhcmlhYmxlU2V0TmVlZHNEZWJ1Z0NoZWNrZW1pdFN0b3JlU3RhdGljVE9TZW1pdFRocm93dHlwZUNQSW5kZXhlbWl0SW5zdGFudGlhdGVUeXBlZW1pdEp1bXBJZkluaXRpYWxpemVkaW5pdHdpdGhUZW1waXNMYXRlRmluYWxsb2NhbEluZGV4cmhzX2dlbkZ1dHVyZU51bGxlbWl0SnVtcElmTm9Bc3NlcnRzb21pdEFzc2VydFNvdXJjZVBvc2l0aW9uc3RhcmdldExhYmVsVGFyZ2V0IGxhYmVsICB3YXMgbm90IHJlZ2lzdGVyZWQgZm9yIGJyZWFrICB3YXMgbm90IHJlZ2lzdGVyZWQgZm9yIGNvbnRpbnVlLXN3aXRjaCBhbGxvd3NCYWNrd2FyZEp1bXBzdW5yZWFjaGFibGVlbWl0Q2xvbmVDb250ZXh0dXBkYXRlbGFiZWxyZXR1cm5WYXJJbmRleEluRnJhbWVjYXNlTGFiZWxzZXF1YWxzQXJnRGVzY2RlZmF1bHRMYWJlbHN3aXRjaENhc2VjYXNlTGFiZWxfaXNUcnlCbG9ja19zYXZlZENvbnRleHRWYXJjYXB0dXJlZFNhdmVkQ29udGV4dFZhcl9leGNlcHRpb25WYXJfc3RhY2tUcmFjZVZhcl9zYXZlQ29udGV4dEZvclRyeUJsb2NrX3Jlc3RvcmVDb250ZXh0Rm9yVHJ5QmxvY2tfc3RhcnRUcnlCbG9ja2VudGVyVHJ5QmxvY2tfZW5kVHJ5QmxvY2t0cnlCbG9ja2VuZFBDaGFuZGxlclBDZW1pdFNldEZyYW1lZW1pdE1vdmVTcGVjaWFsU3BlY2lhbEluZGV4LmV4Y2VwdGlvblNwZWNpYWxJbmRleC5zdGFja1RyYWNlY2FwdHVyZWRFeGNlcHRpb25WYXJjYXB0dXJlZFN0YWNrVHJhY2VWYXJoYXNDYXRjaEFsbGNhdGNoQ2xhdXNlc2tpcENhdGNobm9ybWFsQ29udGludWF0aW9uZ2VuZXJhdGVDb250aW51YXRpb25fc2tpcFZhcmlhYmxlSW5pdGlhbGl6YXRpb25lbWl0U3RvcmVtYXhJbml0aWFsaXplclBvc2l0aW9uZW1pdFB1c2hVbmluaXRpYWxpemVkU2VudGluZWxZaWVsZFN0YXRlbWVudCBtdXN0IGJlIGRlc3VnYXJlZDogeWllbGRJbmRleGV4Y2VwdGlvblBhcmFtYXN5bmNFeGNlcHRpb25QYXJhbUluZGV4SW5GcmFtZXN0YWNrVHJhY2VQYXJhbWFzeW5jU3RhY2tUcmFjZVBhcmFtSW5kZXhJbkZyYW1lY29udFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3JUb29NYW55QXJndW1lbnRzRXhjZXB0aW9uRmluYWxseUJsb2NrQW5ub3RhdGlvbnNzeW1ib2xGb3JUeXBlQ2FzdHNhdmVkR2xvYmFsRGVidWdnaW5nTmFtZXNieXRlY29kZUdlbmVyYXRvcklsbGVnYWwgcmVjdXJzaXZlIHR5cGUgJyN0eXBlJy53aXRoQXJndW1lbnRzd2l0aG91dExvY2F0aW9ubmV3Q29tcG9uZW50bmV3UmVwb3NpdG9yeW9sZFJlcG9zaXRvcnl2bS5ieXRlY29kZS5vcHRpb25zY29tbWFuZExpbmVGbGFnc0VtaXQgRGFydCBhbm5vdGF0aW9uc2xvY2FsLXZhci1pbmZvRW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbiBhYm91dCBsb2NhbCB2YXJpYWJsZXNkZWJ1Z2dlci1zdG9wc0VtaXQgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGZvciBzdG9wcGluZyBpbiB0aGUgZGVidWdnZXJzaG93LWJ5dGVjb2RlLXNpemUtc3RhdFNob3cgYnl0ZWNvZGUgc2l6ZSBicmVha2Rvd25zb3VyY2UtcG9zaXRpb25zRW1pdCBzb3VyY2UgcG9zaXRpb25zaW5zdGFuY2UtZmllbGQtaW5pdGlhbGl6ZXJzRW1pdCBzZXBhcmF0ZSBpbnN0YW5jZSBmaWVsZCBpbml0aWFsaXplcnNrZWVwLXVucmVhY2hhYmxlLWNvZGVEbyBub3QgcmVtb3ZlIHVucmVhY2hhYmxlIGNvZGUgKHVzZWZ1bCBpZiBjb2xsZWN0aW5nIGNvZGUgY292ZXJhZ2UpYXZvaWQtY2xvc3VyZS1jYWxsLWluc3RydWN0aW9uc0RvIG5vdCBlbWl0IGNsb3N1cmUgY2FsbCBpbnN0cnVjdGlvbnMgKHVzZWZ1bCBpZiBjb2xsZWN0aW5nIGNvZGUgY292ZXJhZ2UsIGFzIGNsb3N1cmUgY2FsbCBpbnN0cnVjdGlvbnMgYXJlIG5vdCB0cmFja2VkIGJ5IGNvZGUgY292ZXJhZ2UpYXZvaWRDbG9zdXJlQ2FsbEluc3RydWN0aW9uc1VuZXhwZWN0ZWQgYnl0ZWNvZGUgZmxhZyBpb2h0dHBodHRwc0h0dHBGaWxlU3lzdGVtRW50aXR5Y29ubmVjdEFuZFJ1bmh0dHBDbGllbnRoZWFkVXJscmVxdWVzdHJlc3BvbnNlc3RhdHVzQ29kZWdldFVybGNvbm5lY3Rpb25UaW1lb3V0Zm9yY2V2bS50YXJnZXQuaW5zdGFsbERhcnRSdW5uZXJUYXJnZXRGbHV0dGVyVGFyZ2V0Rmx1dHRlclJ1bm5lclRhcmdldFZtVGFyZ2V0X2luc3RhbGxlZHZtLnRyYW5zZm9ybWF0aW9ucy5jaGFfZGV2aXJ0dWFsaXphdGlvbkRldmlydHVhbGl6YXRpb25fdHJhY2VfbWV0YWRhdGFfb2JqZWN0TWVtYmVyTmFtZXNpc0ZpZWxkT3JHZXR0ZXJpc0xlZ2FsVGFyZ2V0Rm9yTWV0aG9kSW52b2NhdGlvbmZ1bmNwb3NpdGlvbmFsQXJnc3JlbW92ZUFsbGhhc0V4dHJhVGFyZ2V0Rm9yTnVsbGdldERpcmVjdENhbGxtYWtlRGlyZWN0Q2FsbFtkZXZpcnRdIFJlc29sdmluZyAgdG8gIGF0IFtkZXZpcnRdIFByb2Nlc3NpbmcgbGlicmFyeSBDSEFEZXZpcnR1YWxpemF0aW9uX2hpZXJhcmNoeVN1YnR5cGVzaW5nbGVUYXJnZXRoaWVyYXJjaHlTdWJ0eXBlc3ZtLnRyYW5zZm9ybWF0aW9ucy5taXhpbl9kZWR1cGxpY2F0aW9uX0RlZHVwbGljYXRlTWl4aW5LZXlfY2xhc3N0aGlzQ2xhc3NvdGhlckNsYXNzRGVkdXBsaWNhdGVNaXhpbnNUcmFuc2Zvcm1lcl9jYW5vbmljYWxNaXhpbnNfZHVwbGljYXRlZE1peGluc190cmFuc2Zvcm1TdXBlcnR5cGVBbGwgbWl4aW5zIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBhbHJlYWR5LnVuYmluZGlzU3VwZXJjbGFzc29sZFN1cGVybmV3U3VwZXJjYW5vbmljYWxTdXBlclVuZXhwZWN0ZWQgbm9kZSBJbnRlcmZhY2VUYXJnZXRSZXNvbHZlcnRyYW5zZm9ybWVyX3Jlc29sdmVOZXdJbnRlcmZhY2VUYXJnZXRfZmluZE1lbWJlckhpdCB1bmV4cGVjdGVkIGludGVyZmFjZSB0YXJnZXQgd2hpY2ggaXMgbm90IGEgRmllbGQvUHJvY2VkdXJlZGVkdXBsaWNhdGVNaXhpbnNpbnRlcmZhY2VUYXJnZXRSZXNvbHZlcl9jb3JyZWN0Rm9yd2FyZGluZ0NvbnN0cnVjdG9yc2NvbnN0cnVjdG9yVW5hYmxlIHRvIGZpbmQgYSByZXBsYWNlbWVudCBmb3Igdm0udHJhbnNmb3JtYXRpb25zLm5vX2R5bmFtaWNfaW52b2NhdGlvbnNfYW5ub3RhdG9yQWN0aW9uQWN0aW9uLmdldEFjdGlvbi5zZXRBY3Rpb24uaW52b2tlc2V0aW52b2tlU2VsZWN0b3Jkb0ludm9rZWRvR2V0ZG9TZXRnZXQ6c2V0Oj9Ob0R5bmFtaWNVc2VzQW5ub3RhdG9yX3NlbGVjdG9yc3NlbGVjdG9yZHluYW1pY1NlbGVjdG9yc25vblRoaXNTZWxlY3RvcnN0ZWFyT2ZmU2VsZWN0b3JzRHluYW1pY1NlbGVjdG9yc0NvbGxlY3RvcmNvbGxlY3RUcmFuc2Zvcm1hdGlvbkluZm9yZW1vdmVkTWVzc2FnZUZpZWxkc3JlbW92ZWRNZXNzYWdlQ2xhc3Nlc19VbnVzZWRGaWVsZE1ldGFkYXRhUHJ1bmVydGFnTnVtYmVyQ2xhc3N0YWdOdW1iZXJGaWVsZGZpZWxkQWRkaW5nTWV0aG9kc2FPTWFPU2FRTXBQU2FRU2FJbnQ2NGFPQmJ1aWxkZXJJbmZvQ2xhc3N2aXNpdGVkQ2xhc3N1c2VkVGFnTnVtYmVyc2R5bmFtaWNOYW1lc2FkZE1ldGhvZHNlbHRhZ051bWJlcnJlbW92ZU1ldGFkYXRhRm9yVW51c2VkRmllbGRzZ21TdWJjbGFzc2VzaW52b2tlZE1ldGhvZHNzZWxlY3RvcnNidWlsZGVySW5mb0ZpZWxkc19pYnVpbGRlckluZm9GaWVsZF9wcnVuZUJ1aWxkZXJJbmZvRmllbGRnbVN1YmNsYXNzY2xlYXJfY29tcHV0ZVVzZWRUYWdOdW1iZXJzZmllbGROYW1lSW5mb0NvbGxlY3RvcmdlbmVyYXRlZE1lc3NhZ2VDbGFzc2dtU3ViY2xhc3Nlc0ludm9rZWRNZXRob2RzaXNHZW5lcmF0ZWRNZXRob2RTdWJjbGFzc2FkZEludm9rZWRNZXRob2RlbnZpcm9ubWVudGNvbGxlY3RJbmZvX3RyZWVzaGFrZVByb3Rvc2NvbGxlY3RvcnJlbW92ZVVudXNlZFByb3RvUmVmZXJlbmNlc3Byb3RvYnVmVXJpcGFja2FnZTpwcm90b2J1Zi9wcm90b2J1Zi5kYXJ0cHJvdG9idWZMaWJzcHJvdG9idWZMaWJnbUNsYXNzR2VuZXJhdGVkTWVzc2FnZVRhZ051bWJlcmJpQ2xhc3NCdWlsZGVySW5mb3NpbmdsZVdoZXJldm0udHJhbnNmb3JtYXRpb25zLnR5cGVfZmxvdy50cmFuc2Zvcm1lclN0YXRlbWVudFZpc2l0b3JURkFEZXZpcnR1YWxpemF0aW9uX3R5cGVGbG93QW5hbHlzaXNmaWVsZE1vcnBoZXJjYWxsU2l0ZWdldE1vcnBoZWRNZW1iZXJtb25vbW9ycGhpY1RhcmdldGlzTnVsbGFibGVSZWNlaXZlckFubm90YXRlS2VybmVsX2luZmVycmVkVHlwZU1ldGFkYXRhX3VucmVhY2hhYmxlTm9kZU1ldGFkYXRhX3Byb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YV90YWJsZVNlbGVjdG9yQXNzaWduZXJfbnVsbENvbnN0YW50X2NvbnZlcnRUeXBlcmVjZWl2ZXJOb3RJbnRpc0ludGJhc2VUeXBlZ2V0Q29uY3JldGVDbGFzc2hpZXJhcmNoeUNhY2hldGFrZW51bUltbWVkaWF0ZVR5cGVBcmdzcmVwcmVzZW50ZWRUeXBlZXhhY3RUeXBlQXJndW1lbnRzX3NldEluZmVycmVkVHlwZWluZmVycmVkVHlwZV9zZXRVbnJlYWNoYWJsZV9hbm5vdGF0ZUNhbGxTaXRlaXNSZWFjaGFibGVtYXJrU2tpcENoZWNrdXNlQ2hlY2tlZEVudHJ5bWFya1JlY2VpdmVyTm90SW50cmVjZWl2ZXJNYXlCZUludHJlc3VsdFR5cGVpc1Jlc3VsdFVzZWRfYW5ub3RhdGVNZW1iZXJpc01lbWJlclVzZWRmaWVsZFR5cGVhcmdUeXBlc2FyZ3VtZW50VHlwZXN1bmNoZWNrZWRQYXJhbWV0ZXJzZmlyc3RQYXJhbUluZGV4cG9zaXRpb25hbFBhcmFtc3Bvc2l0aW9uYWxDb3VudGlzRXh0cmFNZW1iZXJXaXRoUmVhY2hhYmxlQm9keWdldE9yaWdpbmFsTWVtYmVybWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseWlzQ2FsbGVkRHluYW1pY2FsbHlnZXR0ZXJDYWxsZWREeW5hbWljYWxseWlzR2V0dGVyQ2FsbGVkRHluYW1pY2FsbHloYXNUaGlzVXNlc2lzQ2FsbGVkVmlhVGhpc2lzQ2FsbGVkTm90VmlhVGhpc2lzVGVhck9mZlRha2VubWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkZ2V0dGVyU2VsZWN0b3JJZFRyZWVTaGFrZXJ0eXBlRmxvd0FuYWx5c2lzX3VzZWRDbGFzc2VzX2NsYXNzZXNVc2VkSW5UeXBlX3VzZWRNZW1iZXJzX3VzZWRFeHRlbnNpb25zX3VzZWRUeXBlZGVmc3R5cGVWaXNpdG9yY29uc3RhbnRWaXNpdG9yX3Bhc3MxX3Bhc3MydHJhbnNmb3JtaXNDbGFzc1JlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZW5hdGl2ZUNvZGVPcmFjbGVpc0NsYXNzVXNlZGlzQ2xhc3NVc2VkSW5UeXBlaXNDbGFzc0FsbG9jYXRlZGlzRXh0ZW5zaW9uVXNlZGlzTWVtYmVyQm9keVJlYWNoYWJsZWlzRmllbGRJbml0aWFsaXplclJlYWNoYWJsZWlzRmllbGRJbml0aWFsaXplclVzZWRpc0ZpZWxkR2V0dGVyUmVhY2hhYmxlaXNGaWVsZEdldHRlclVzZWRpc0ZpZWxkU2V0dGVyUmVhY2hhYmxlaXNGaWVsZFNldHRlclVzZWRpc01lbWJlclJlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZWlzVHlwZWRlZlVzZWRyZXRhaW5GaWVsZGFkZENsYXNzVXNlZEluVHlwZSB1c2VkIGluIHR5cGVhZGRVc2VkTWVtYmVyTWVtYmVyICBmcm9tIGNsYXNzICBpcyB1c2VkYWRqdXN0SW5zdGFuY2VDYWxsVGFyZ2V0YWRkVXNlZEV4dGVuc2lvbmFkZFVzZWRUeXBlZGVmRmllbGRNb3JwaGVyc2hha2VyX2V4dHJhTWVtYmVyc1dpdGhSZWFjaGFibGVCb2R5X2dldHRlcnNGb3JSZW1vdmVkRmllbGRzX3NldHRlcnNGb3JSZW1vdmVkRmllbGRzX3JlbW92ZWRGaWVsZHNfY3JlYXRlQWNjZXNzb3JGb3JSZW1vdmVkRmllbGRhY2Nlc3Nvcl9UcmVlU2hha2VyVHlwZVZpc2l0b3JfVHJlZVNoYWtlclBhc3MxX2lzVW5yZWFjaGFibGVfZmxhdHRlbkFyZ3VtZW50c19pc1Rocm93RXhwcmVzc2lvbl9tYWtlVW5yZWFjaGFibGVDYWxsaW5kZXhXaGVyZUF0dGVtcHQgdG8gZXhlY3V0ZSBjb2RlIHJlbW92ZWQgYnkgRGFydCBBT1QgY29tcGlsZXIgKFRGQSlfbWFrZVVucmVhY2hhYmxlSW5pdGlhbGl6ZXJfdmlzaXRBc3NlcnROb2RlVmlzaXRpbmcgZGV0YWlsc2FuYWx5emVDb25zdGFudGNoZWNrZXhwbGljaXRDYXN0Y2FuQWx3YXlzU2tpcF9UcmVlU2hha2VyUGFzczJyZW1vdmVXaGVyZURyb3BwZWQgY2xhc3MgRHJvcHBlZCBzdXBlcnMgZnJvbSBjbGFzcyAgY29udmVydGVkIHRvIGFic3RyYWN0X3ByZXNlcnZlU3BlY2lhbE1lbWJlcl9tYWtlVW5yZWFjaGFibGVCb2R5d3JpdGVJbmRleG1lbWJlclJlZmVyZW5jZWlzQm91bmRBdHRlbXB0IHRvIGV4ZWN1dGUgbWV0aG9kIHJlbW92ZWQgYnkgRGFydCBBT1QgY29tcGlsZXIgKFRGQSlfVHJlZVNoYWtlckNvbnN0YW50VmlzaXRvcmluc3RhbmNlQ29uc3RhbnRzVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgY29uc3RhbnQgIiIgaW4gVEZBIHlldCFUaGUga2VybmVsMmtlcm5lbCBjb25zdGFudHMgdHJhbnNmb3JtYXRpb24gZGVzdWdhcnMgY29uc3QgbWFwcyFrRHVtcENsYXNzSGllcmFyY2h5bWF0Y2hlcmdlbmVyaWNJbnRlcmZhY2VzSW5mb2FuYWx5c2lzU3RvcFdhdGNobWFpblNlbGVjdG9yYWRkUmF3Q2FsbHByb2Nlc3NzdG9wdHJhbnNmb3Jtc1N0b3BXYXRjaHRyZWVTaGFrZXJURiBhbmFseXNpcyB0b29rIGVsYXBzZWRNaWxsaXNlY29uZHNtc1RGIHRyYW5zZm9ybXMgdG9vayBURkEgc3RhdGlzdGljc21heUhhdmVTaWRlRWZmZWN0c3ZtLnRyYW5zZm9ybWF0aW9ucy5vYmZ1c2NhdGlvbl9wcm9oaWJpdGlvbnNfYW5ub3RhdG9yT2JmdXNjYXRpb25Qcm9oaWJpdGlvbnNWaXNpdG9yX2FkZElmRW50cnlQb2ludGFubnBhcnNlUHJhZ21hY3RvcnByb2NyZXBvdm0udHJhbnNmb3JtYXRpb25zLmNhbGxfc2l0ZV9hbm5vdGF0b3JTdGF0aWNUeXBlQ29udGV4dEFubm90YXRlV2l0aFN0YXRpY1R5cGVzZW52X3N0YXRpY1R5cGVDb250ZXh0YW5ub3RhdGVXaXRoVHlwZWNvbnRhaW5zR2VuZXJpY0NvdmFyaWFudEltcGxkZWNsc2hhc0dlbmVyaWNDb3ZhcmlhbnRQYXJhbWV0ZXJzYWRkUmVwb3NpdG9yeVRvdHJhbnNmb3JtTGlicmFyaWVzU2ltcGxlVW5yZWFjaGFibGVDb2RlRWxpbWluYXRpb25faXNCb29sQ29uc3RhbnRfZ2V0Qm9vbENvbnN0YW50VmFsdWVFeHBlY3RlZCBib29sIGNvbnN0YW50OiBfY3JlYXRlQm9vbExpdGVyYWxfbWFrZUVtcHR5QmxvY2tJZk51bGxsZWZ0VmFsdWVyaWdodFZhbHVlVW5leHBlY3RlZCBMb2dpY2FsRXhwcmVzc2lvbiBvcGVyYXRvciBTdGF0aWNHZXQgZnJvbSBjb25zdCBmaWVsZCAgc2hvdWxkIGJlIGV2YWx1YXRlZCBieSBmcm9udC1lbmQ6IEFsbG93QW55dGhpbmdQYXJzZXJBcmdQYXJzZXIuYWxsb3dBbnl0aGluZygpLmFkZENvbW1hbmRzKCkgaXNuJ3Qgc3VwcG9ydGVkLkFyZ1BhcnNlci5hbGxvd0FueXRoaW5nKCkuYWRkRmxhZygpIGlzbid0IHN1cHBvcnRlZC5BcmdQYXJzZXIuYWxsb3dBbnl0aGluZygpLmFkZE9wdGlvbigpIGlzbid0IHN1cHBvcnRlZC5BcmdQYXJzZXIuYWxsb3dBbnl0aGluZygpLmFkZE11bHRpT3B0aW9uKCkgaXNuJ3Qgc3VwcG9ydGVkLkFyZ1BhcnNlci5hbGxvd0FueXRoaW5nKCkuYWRkU2VwYXJhdG9yKCkgaXNuJ3Qgc3VwcG9ydGVkLlBhcnNlcmNvbW1hbmROYW1lZ3JhbW1hcmNvbW1hbmRSZXN1bHRzLS1yZW1vdmVBdHZhbGlkYXRlQ2Fubm90IHNwZWNpZnkgYXJndW1lbnRzIGJlZm9yZSBhIGNvbW1hbmQuY29tbWFuZFBhcnNlcnBhcnNlU29sb09wdGlvbnBhcnNlQWJicmV2aWF0aW9ucGFyc2VMb25nT3B0aW9ucmVhZE5leHRBcmdBc1ZhbHVlTWlzc2luZyBhcmd1bWVudCBmb3IgInNldE9wdGlvbnNvbG9PcHRmaXJzdE1hdGNoQ291bGQgbm90IGZpbmQgYW4gb3B0aW9uIG9yIGZsYWcgIi1zZXRGbGFnaW5uZXJtb3N0Q29tbWFuZGFiYnJPcHRDb3VsZCBub3QgZmluZCBhbiBvcHRpb24gd2l0aCBzaG9ydCBuYW1lICItT3B0aW9uICItIiBpcyBhIGZsYWcgYW5kIGNhbm5vdCBoYW5kbGUgdmFsdWUgcGFyc2VTaG9ydEZsYWciIG11c3QgYmUgYSBmbGFnIHRvIGJlIGluIGEgY29sbGFwc2VkICItIi5sb25nT3B0RmxhZyBvcHRpb24gIiIgc2hvdWxkIG5vdCBiZSBnaXZlbiBhIHZhbHVlLm5vLUNhbm5vdCBuZWdhdGUgbm9uLWZsYWcgb3B0aW9uICJDYW5ub3QgbmVnYXRlIG9wdGlvbiAiX3ZhbGlkYXRlQWxsb3dlZCxlbGVtZW50IiBpcyBub3QgYW4gYWxsb3dlZCB2YWx1ZSBmb3Igb3B0aW9uICJfc29sb09wdF4tKFthLXpBLVowLTldKSRfYWJick9wdF4tKFthLXpBLVowLTldKykoLiopJF9sb25nT3B0Xi0tKFthLXpBLVpcLV8wLTldKykoPSguKikpPyRVc2FnZV9jb2x1bW5Db3VudG9wdGlvbnNBbmRTZXBhcmF0b3JzY3VycmVudENvbHVtbmNvbHVtbldpZHRoc251bUhlbHBMaW5lc25ld2xpbmVzTmVlZGVkY2FsY3VsYXRlQ29sdW1uV2lkdGhzb3B0aW9uT3JTZXBhcmF0b3IKCmdldEFiYnJldmlhdGlvbmdldExvbmdPcHRpb25hbGxvd2VkTmFtZXNuZXdsaW5lZ2V0QWxsb3dlZFRpdGxlYnVpbGRBbGxvd2VkTGlzdChkZWZhdWx0cyB0byBvbikoZGVmYXVsdHMgdG8gKGRlZmF1bHRzIHRvICItLVtuby1dPTwgICAgICBbXSAoZGVmYXVsdCl0aXRsZWxpbmVzd3JhcHBlZExpbmVzcmVkdWNld2lkdGh0cmltcmVtb3ZlUmFuZ2V3cml0ZUxpbmVhbGxvd2VkQnVmZmVyW0RpZ2VzdFNpbmtfdmFsdWVIYXNoU2lua19lbmRpYW5fY3VycmVudENodW5rX21heE1lc3NhZ2VMZW5ndGhJbkJ5dGVzMTEyNTg5OTkwNjg0MjYyM19sZW5ndGhJbkJ5dGVzX3BlbmRpbmdEYXRhY2h1bmtTaXplSW5Xb3Jkc0hhc2guYWRkKCkgY2FsbGVkIGFmdGVyIGNsb3NlKCkuX2l0ZXJhdGVfZmluYWxpemVEYXRhX2J5dGVEaWdlc3RieXRlRGlnZXN0bGVuZ3RoSW5CeXRlc2J5dGVEYXRhYXNCeXRlRGF0YXNldFVpbnQzMnBlbmRpbmdEYXRhQnl0ZXNwZW5kaW5nRGF0YUNodW5rc2dldFVpbnQzMmNvbnRlbnRzTGVuZ3RoZmluYWxpemVkTGVuZ3RoX3JvdW5kVXBIYXNoaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBtZXNzYWdlcyB3aXRoIG1vcmUgdGhhbiAyXjUzIGJpdHMubGVuZ3RoSW5CaXRzaGlnaEJpdHNsb3dCaXRzdmFsbWFzazMyYml0c1BlckJ5dGVieXRlc1BlcldvcmRhZGQzMnJvdGwzMm1vZFNoaWZ0X1NoYTY0Qml0U2lua2RpZ2VzdEJ5dGVzb3JkZXJlZGlzRXZlbl9yb3RyNjRfc2hyNjRTaGEzODRTaW5rLTM3NjYyNDM2MzczNjkzOTc1NDQ3MTA1MDM2NjIzNDA5ODk0NjYzLTc5NzMzNDAxNzg0MTEzNjUwOTcxNTI2Njk5MjE1MzAzODkxMjU3NzQzNjMyOTYzNzgzMzA4MzY5Ny04MTYzODE4Mjc5MDg0MjIzMjE1LTI2NjI3MDI2NDQ2MTkyNzYzNzc1MTY3MTE1NDQwMDcyODM5MDc2U2hhNTEyU2luazc2NDA4OTE1NzY5NTYwMTI4MDgtNDk0Mjc5MDE3NzUzNDA3MzAyOTQzNTQ2ODU1NjQ5MzY4NDUzNTUtNjUzNDczNDkwMzIzODY0MTkzNTU4NDA2OTY0NzUwNzgwMDEzNjEtNzI3NjI5NDY3MTcxNjk0NjkxMzIyNzA4OTc5Njk4MDI4ODY1MDc2NjIwNTE2OTU5ODE5NTM4ODA5X25vaXNlNjQ0Nzk0Njk3MDg2NzgwNjE2MjI2ODE1ODA2NDY0MDE2ODc4MTI2MS01MzQ5OTk5NDg2ODc0ODYyODAxLTE2MDYxMzYxODgxOTgzMzE0NjA0MTMxNzAzNDA4MzM4NDQ5NzIwNjQ4MDk4MTA2ODYwMTQ3OTE5My03OTA4NDU4Nzc2ODE1MzgyNjI5LTYxMTY5MDk5MjEyOTAzMjE2NDAtMjg4MDE0NTg2NDEzMzUwODU0MjEzMzQwMDk5NzU2NDk4OTAyMzgyNjA4MDEyNzExNjM4MTE5MDUyNjEyODQxMTQ3MzAwNjgwMjE0NjgyNjgxNDg3MjI3NjQ1ODEyMzEtOTE2MDY4ODg4NjU1Mzg2NDUyNy03MjE1ODg1MTg3OTkxMjY4ODExLTQ0OTU3MzQzMTkwMDEwMzMwNjgtMTk3Mzg2NzczMTM1NTYxMjQ2Mi0xMTcxNDIwMjExMjczODQ5MzczMTEzNTM2MjA1NzE0NDQyMzg2MTI1OTc2Mjg5ODQ2MzkxMzQ4MjEzMzA4MjI0MjU4MDI5MzIyODY5NTM2NTA1ODkyMzY0MDg0MTM0NzY2NzkwMjUwMTI5MjM1NjI5NjQ4NTczMDMzODM3NzU5NjQ4NjkzLTc0NzY0NDg5MTQ3NTk1NTcyMDUtNjMyNzA1NzgyOTI1ODMxNzI5Ni01NzYzNzE5MzU1NTkwNTY1NTY5LTQ2NTg1NTE4NDM2NTk1MTAwNDQtNDExNjI3NjkyMDA3NzIxNzg1NC0zMDUxMzEwNDg1OTI0NTY3MjU5NDg5MzEyNzEyODI0OTQ3MzExMTQ1MjczNzg3NzMzMDc4Mzg1NjI4NjE3Njc2NTU3NTIzNDc2NDQzMzIyMjg1Njc2MDYzODAzNjg2NTU2MDk0MDU3MDUxNzcxMTU5NzU5OTY1NTcyODE3NDMxODg5NTk3MjgwNzU4NTU0NTU1ODAyNTkwODUzMjY0NDI0MzI5NjQ2NTU3Ni05MDk2NDg3MDk2NzIyNTQyODc0LTc4OTQxOTgyNDY3NDA3MDgwMzctNjcxOTM5NjMzOTUzNTI0ODU0MC02MzMzNjM3NDUwNDc2MTQ2Njg3LTQ0NDYzMDY4OTA0Mzk2ODIxNTktNDA3Njc5MzgwMjA0OTQwNTM5Mi0zMzQ1MzU2Mzc1NTA1MDIyNDQwLTI5ODMzNDY1MjUwMzQ5Mjc4NTYtODYwNjkxNjMxOTY3MjMxOTU4MTE4MjkzNDI1NTg4NjEyNzU0NDE4NDc4MTQwNTA0NjMwMTEwMTYyMTc3MzI3NzI3ODM1NzIwNTMxMjgzMDY0MzUzNzg1NDI2MjE2OTM3OTY3NDE5NzUyMzM0ODA4NzI0MTE1MTc4MTI1NzY2Nzc3NDQzNTY4MTQ3ODE2ODU0NDkwNTkzMTY2MDEzNzM1OTY0NzI1NjY2NDM3NTA3MDYwNzIxOTQyOTY4NDgzODM5OTA3NTc5MDM1OTA4MTcyNDg2OTM0NjM5ODUyMjY3MjMxNjgtODg3ODcxNDYzNTM0OTM0OTUxOC04MzAyNjY1MTU0MjA4NDUwMDY4LTgwMTY2ODg4MzY4NzIyOTg5NjgtNjYwNjY2MDg5MzA0NjI5MzAxNS00Njg1NTMzNjUzMDUwNjg5MjU5LTQxNDc0MDA3OTcyMzgxNzY5ODEtMzg4MDA2MzQ5NTU0MzgyMzk3Mi0zMzQ4Nzg2MTA3NDk5MTAxNjg5LTE1MjM3NjcxNjIzODA5NDg3MDYtNzU3MzYxNzUxNDQ4Njk0NDA4NTAwMDEzNTQwMzk0MzY0ODU4NzQ4NTgwMjUwODY2NzE4ODg2MTI0Mjg3OTE2ODMyODgzMDM4MjE5NzczNzQwMzM5NzQxNTA5MzkyOTQ0MDc4Njc2MTU0OTQwODA0MzY1OTkyNjE5MzA0ODA2OTI2NzQzNjgxMzc2MzkxMjA0NTMzMDg0ODM2MTM1NjY4OTk1MzI5MzU2NTUzMjA2MTYzMzIxMzI1MjI3ODY0NDg5MTg5NDU2NDM5ODY0NzQ2OTAyNzMzNjM1MDkyNjc1MzA4NzgwMTM4ODU0NDg0NDg0NzEyN2Zyb250X2VuZC5kaWFnbm9zdGljX21lc3NhZ2VDb2RlRGlhZ25vc3RpY01lc3NhZ2VGcm9tSnNvbkZvcm1hdHRlZE1lc3NhZ2VhbnNpRm9ybWF0dGVkcGxhaW5UZXh0Rm9ybWF0dGVkZ2V0TWVzc2FnZUNoYXJPZmZzZXRnZXRNZXNzYWdlTGVuZ3RoZ2V0TWVzc2FnZUNvZGVPYmplY3RnZXRNZXNzYWdlSGVhZGVyVGV4dGdldE1lc3NhZ2VDb2RlZ2V0TWVzc2FnZUFyZ3VtZW50c2dldE1lc3NhZ2VSZWxhdGVkSW5mb3JtYXRpb25yZWxhdGVkSW5mb3JtYXRpb25fZmVfYW5hbHl6ZXJfc2hhcmVkLm1lc3NhZ2VzLnNldmVyaXR5U2V2ZXJpdHkuY29udGV4dFNldmVyaXR5Lmlnbm9yZWRTZXZlcml0eS5pbnRlcm5hbFByb2JsZW1TZXZlcml0eS53YXJuaW5naWdub3JlZGludGVybmFsUHJvYmxlbXdhcm5pbmdzZXZlcml0eUVudW1OYW1lc0NPTlRFWFRFUlJPUklHTk9SRURJTlRFUk5BTF9QUk9CTEVNV0FSTklOR3NldmVyaXR5RW51bVZhbHVlc3NldmVyaXR5UHJlZml4ZXNFcnJvckludGVybmFsIHByb2JsZW1XYXJuaW5nQ29udGV4dHNldmVyaXR5VGV4dHNpbnRlcm5hbCBwcm9ibGVtZnJvbnRfZW5kLmNvbXBpbGVyX29wdGlvbnNrZXJuZWxleHBpcmVkRXhwZXJpbWVudGFsRmxhZ3NwYXJzZUV4cGVyaW1lbnRhbEZsYWdzZGtSb290bGlicmFyaWVzU3BlY2lmaWNhdGlvblVyaWlucHV0U3VtbWFyaWVzZGVjbGFyZWRWYXJpYWJsZXNjb21waWxlU2RrY2hhc2VEZXBlbmRlbmNpZXNuZXh0IHJlbGVhc2V0YXJnZXRQYXRjaGVzZXJyb3JPblVuZXZhbHVhdGVkQ29uc3RhbnR2ZXJib3NldmVyaWZ5ZGVidWdEdW1wb21pdFBsYXRmb3Jtc2V0RXhpdENvZGVPblByb2JsZW10aHJvd09uRXJyb3JzRm9yRGVidWdnaW5ndGhyb3dPbldhcm5pbmdzRm9yRGVidWdnaW5nc2tpcEZvckRlYnVnZ2luZ3dyaXRlRmlsZU9uQ3Jhc2hSZXBvcnRubmJkU3Ryb25nTW9kZXBlcmZvcm1ObmJkQ2hlY2tzY3VycmVudFNka1ZlcnNpb25hcmd1bWVudGZlYXR1cmVleHBlcmltZW50c29uV2FybmluZ2V4cGVyaW1lbnRVbmtub3duIGV4cGVyaW1lbnQ6IEV4cGVyaW1lbnQgc3BlY2lmaWVkIHdpdGggY29uZmxpY3RpbmcgdmFsdWVzOiBFeHBlcmltZW50YWxGbGFnLmNvbnN0YW50VXBkYXRlMjAxOEV4cGVyaW1lbnRhbEZsYWcuY29udHJvbEZsb3dDb2xsZWN0aW9uc0V4cGVyaW1lbnRhbEZsYWcuZXh0ZW5zaW9uTWV0aG9kc0V4cGVyaW1lbnRhbEZsYWcubm9uTnVsbGFibGVFeHBlcmltZW50YWxGbGFnLm5vbmZ1bmN0aW9uVHlwZUFsaWFzZXNFeHBlcmltZW50YWxGbGFnLnNldExpdGVyYWxzRXhwZXJpbWVudGFsRmxhZy5zcHJlYWRDb2xsZWN0aW9uc0V4cGVyaW1lbnRhbEZsYWcudHJpcGxlU2hpZnRFeHBlcmltZW50YWxGbGFnLnZhcmlhbmNlRW5hYmxpbmcgZXhwZXJpbWVudCAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5EaXNhYmxpbmcgZXhwZXJpbWVudCBFeHBlcmltZW50ICBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIFRoZSB1c2Ugb2YgdGhlIGZsYWcgaXMgZGVwcmVjYXRlZC4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gTm8gZGVmYXVsdCB2YWx1ZSBmb3IgY29uc3RhbnRVcGRhdGUyMDE4Y29udHJvbEZsb3dDb2xsZWN0aW9uc2V4dGVuc2lvbk1ldGhvZHNub25mdW5jdGlvblR5cGVBbGlhc2Vzc2V0TGl0ZXJhbHNzcHJlYWRDb2xsZWN0aW9uc3RyaXBsZVNoaWZ0Y29uc3RhbnQtdXBkYXRlLTIwMThjb250cm9sLWZsb3ctY29sbGVjdGlvbnNleHRlbnNpb24tbWV0aG9kc25vbi1udWxsYWJsZW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlc3NldC1saXRlcmFsc3NwcmVhZC1jb2xsZWN0aW9uc3RyaXBsZS1zaGlmdGZyb250X2VuZC5maWxlX3N5c3RlbUZpbGVTeXN0ZW1FeGNlcHRpb24odXJpPTsgbWVzc2FnZT1mcm9udF9lbmQuZnJvbnRfZW5kU3RyaW5nU2Nhbm5lckluY3JlbWVudGFsQ29tcGlsZXJlbnRyeVBvaW50aW5pdGlhbGl6ZUZyb21EaWxsVXJpb3V0bGluZU9ubHlpbmNyZW1lbnRhbFNlcmlhbGl6ZXJmcm9tQ29tcG9uZW50Y29tcHV0ZURlbHRhZW50cnlQb2ludHNmdWxsQ29tcG9uZW50Z2V0Q29yZVR5cGVzZ2V0Q2xhc3NIaWVyYXJjaHlpbnZhbGlkYXRlaW52YWxpZGF0ZUFsbFNvdXJjZXNzZXRNb2R1bGVzVG9Mb2FkT25OZXh0Q29tcHV0ZURlbHRhY29tcG9uZW50c2NvbXBpbGVFeHByZXNzaW9uZGVmaW5pdGlvbnN0eXBlRGVmaW5pdGlvbnNzeW50aGV0aWNQcm9jZWR1cmVOYW1laWRlbnRpZmllcmZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9ybWVzc2FnZU1pc3NpbmdNYWluZ2VuZXJhdGVLZXJuZWxnZW5lcmF0ZUtlcm5lbEludGVybmFsc3VtbWFyeWtlcm5lbEZvclByb2dyYW1JbnRlcm5hbHJldGFpbkRhdGFGb3JUZXN0aW5ncmVxdWlyZU1haW5wT3B0aW9uc2luY2x1ZGVIaWVyYXJjaHlBbmRDb3JlVHlwZXNObyAnbWFpbicgbWV0aG9kIGZvdW5kLlRyeSBhZGRpbmcgYSBtZXRob2QgbmFtZWQgJ21haW4nIHRvIHlvdXIgcHJvZ3JhbS5NaXNzaW5nTWFpbnNvdXJjZXNmcm9udF9lbmQubWVtb3J5X2ZpbGVfc3lzdGVtX2ZpbGVzX2RpcmVjdG9yaWVzY3VycmVudERpcmVjdG9yeW5vcm1hbGl6ZVBhdGhkZWJ1Z1N0cmluZy0gX2FkZFRyYWlsaW5nU2xhc2hNZW1vcnlGaWxlU3lzdGVtRW50aXR5X2ZpbGVTeXN0ZW1jcmVhdGVEaXJlY3RvcnlFbnRyeSAgaXMgYSBmaWxlLmNvbnRlbnRzRmlsZSAgZG9lcyBub3QgZXhpc3Qud3JpdGVBc0J5dGVzU3luY191cGRhdGV3cml0ZUFzU3RyaW5nU3luYyBpcyBhIGRpcmVjdG9yeS5mcm9udF9lbmQuc3RhbmRhcmRfZmlsZV9zeXN0ZW1pbnN0YW5jZVN0YW5kYXJkRmlsZVN5c3RlbSBvbmx5IHN1cHBvcnRzIGZpbGU6KiBhbmQgZGF0YToqIFVSSXNfSW9GaWxlU3lzdGVtRW50aXR5cmVhZEFzQnl0ZXNTeW5jX3RvRmlsZVN5c3RlbUV4Y2VwdGlvbm9zTWVzc2FnZW9zRXJyb3JEYXRhRmlsZVN5c3RlbUVudGl0eWNvbnRlbnRBc0J5dGVzY29udGVudEFzU3RyaW5nZnJvbnRfZW5kLnRlcm1pbmFsX2NvbG9yX3N1cHBvcnRqc29uRW5jb2RlUGxhdGZvcm1Qcm9jZXNzUHJvY2Vzc1Jlc3VsdHN0ZGVycnN0ZG91dEFMTF9DT0RFU1RFUk1JTkFMX0NBUEFCSUxJVElFU2VuYWJsZVRlcm1pbmFsQ29sb3JzcHJpbnRsbl9jb21wdXRlRW5hYmxlQ29sb3Jzc3VwcG9ydHNBbnNpRXNjYXBlc05vdCBlbmFibGluZyBjb2xvcnMgYXMgQU5TSSBpcyBub3Qgc3VwcG9ydGVkLkVuYWJsaW5nIGNvbG9ycyBhcyBPUyBpcyBXaW5kb3dzLi9iaW4vc2gtY3R0eSA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGxleGl0Q29kZU5vdCBlbmFibGluZyBjb2xvcnMsIHN0ZGluIGlzbid0IGEgdGVybWluYWwucHJpbnRmICclcycgJ2NvbG9ycwpzZXRhZiAwCnNldGFmIDEKc2V0YWYgMgpzZXRhZiAzCnNldGFmIDQKc2V0YWYgNQpzZXRhZiA2CnNldGFmIDcKb3AKJyB8IHRwdXQgLVNOb3QgZW5hYmxpbmcgY29sb3JzLCBydW5uaW5nIHRwdXQgZmFpbGVkLk5vdCBlbmFibGluZyBjb2xvcnMsIHVuZXhwZWN0ZWQgb3V0cHV0IGZyb20gdHB1dDogbnVtYmVyT2ZDb2xvcnNOb3QgZW5hYmxpbmcgY29sb3JzLCBsZXNzIHRoYW4gOCBjb2xvcnMgc3VwcG9ydGVkOiBhbGxDb2RlcxtbMzBtG1szMW0bWzMybRtbMzNtG1szNG0bWzM1bRtbMzZtG1szN20bWzM5OzQ5bU5vdCBlbmFibGluZyBjb2xvcnMsIGNvbG9yIGNvZGVzIGRvbid0IG1hdGNoOiBFbmFibGluZyBjb2xvcnMuQmluYXJ5QnVpbGRlclBhY2thZ2VzcGFja2FnZV9jb25maWdNYXBQYWNrYWdlc2NvbW1hbmRfbGluZV9yZXBvcnRpbmdNZXNzYWdlbWVzc2FnZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHNtZXNzYWdlQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaW1lc3NhZ2VJbnRlcm5hbFByb2JsZW1Qcm92aWRlZEJvdGhDb21waWxlU2RrQW5kU2RrU3VtbWFyeW1lc3NhZ2VNaXNzaW5nSW5wdXR0ZW1wbGF0ZUNhbm5vdFJlYWRTZGtTcGVjaWZpY2F0aW9udGVtcGxhdGVDYW50UmVhZEZpbGV0ZW1wbGF0ZURlYnVnVHJhY2V0ZW1wbGF0ZUlucHV0RmlsZU5vdEZvdW5kdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZHRlbXBsYXRlUGFja2FnZXNGaWxlRm9ybWF0dGVtcGxhdGVTZGtSb290Tm90Rm91bmR0ZW1wbGF0ZVNka1NwZWNpZmljYXRpb25Ob3RGb3VuZHRlbXBsYXRlU2RrU3VtbWFyeU5vdEZvdW5kRGVidWdBYm9ydHVuaW1wbGVtZW50ZWRUaWNrZXJVcmlUcmFuc2xhdG9yTGlicmFyaWVzU3BlY2lmaWNhdGlvbkxpYnJhcmllc1NwZWNpZmljYXRpb25FeGNlcHRpb25UYXJnZXRMaWJyYXJpZXNTcGVjaWZpY2F0aW9uX3Jhd19wYWNrYWdlc19wYWNrYWdlc1VyaV91cmlUcmFuc2xhdG9yX3Nka1N1bW1hcnlDb21wb25lbnRfaW5wdXRTdW1tYXJpZXNDb21wb25lbnRzX2xpbmtlZERlcGVuZGVuY2llc19zZGtSb290X3Nka1N1bW1hcnlfc2RrU3VtbWFyeUJ5dGVzX2xpYnJhcmllc1NwZWNpZmljYXRpb25Vcml0aWNrZXJmYXRhbERpYWdub3N0aWNDb3VudF90YXJnZXRfY29tcHV0ZWRTZGtEZWZhdWx0c2lzVmVyYm9zZV9lbnN1cmVTZGtEZWZhdWx0c2xvYWRTZGtTdW1tYXJ5Qnl0ZXNfcmVhZEFzQnl0ZXNwYWNrYWdlc1VyaVJhd2Zvcm1hdGZvcm1hdHRlZGZvcm1hdHRlZENvbnRleHR3aXRoRm9ybWF0dGluZ2xvZ0Vycm9ycmVwb3J0RGlhZ25vc3RpY01lc3NhZ2VGYXRhbCAnI25hbWUnIGF0Ogojc3RyaW5nX2RlZmF1bHREaWFnbm9zdGljTWVzc2FnZUhhbmRsZXJyZXBvcnRXaXRob3V0TG9jYXRpb252YWxpZGF0ZU9wdGlvbnNlcnJvck9uTWlzc2luZ0lucHV0OmFzeW5jX3RlbXBvcmFyeV8xTm8gaW5wdXQgZmlsZSBwcm92aWRlZCB0byB0aGUgY29tcGlsZXIuTWlzc2luZ0lucHV0U0RLIHJvb3QgZGlyZWN0b3J5IG5vdCBmb3VuZDogI3VyaS5TREsgc3VtbWFyeSBub3QgZm91bmQ6ICN1cmkuVGhlIGNvbXBpbGVTZGsgYW5kIHNka1N1bW1hcnkgb3B0aW9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnlJbnB1dCBmaWxlIG5vdCBmb3VuZDogI3VyaS5fY3JlYXRlRmlsZVN5c3RlbWNsZWFyRmlsZVN5c3RlbUNhY2hlaXNFeHBlcmltZW50RW5hYmxlZE5vIGV4cGlyZWQgdmFsdWUgZm9yIGxvYWRTZGtTdW1tYXJ5bG9hZENvbXBvbmVudHNka1N1bW1hcnlDb21wb25lbnRzZGtTdW1tYXJ5IGFscmVhZHkgbG9hZGVkLmxvYWRJbnB1dFN1bW1hcmllc3VyaXNhbGxCeXRlc2lucHV0U3VtbWFyaWVzQ29tcG9uZW50c2lucHV0U3VtbWFyaWVzQ29tcG9uZW50cyBhbHJlYWR5IGxvYWRlZC5sb2FkTGlua0RlcGVuZGVuY2llc2Fsd2F5c0NyZWF0ZU5ld05hbWVkTm9kZXNkaXNhYmxlTGF6eVJlYWRpbmdyZWFkQ29tcG9uZW50Z2V0VXJpVHJhbnNsYXRvcmJ5cGFzc0NhY2hlbG9nTXNTdGFydGVkIGJ1aWxkaW5nIFVyaVRyYW5zbGF0b3JfY29tcHV0ZUxpYnJhcnlTcGVjaWZpY2F0aW9uUmVhZCBsaWJyYXJpZXMgZmlsZV9nZXRQYWNrYWdlc1JlYWQgcGFja2FnZXMgZmlsZV9mYXN0YVNESyBsaWJyYXJpZXMgc3BlY2lmaWNhdGlvbiBub3QgZm91bmQ6ICN1cmkuTm9ybWFsbHksIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGEgZmlsZSBuYW1lZCAnbGlicmFyaWVzLmpzb24nIGluIHRoZSBEYXJ0IFNESyBpbnN0YWxsIGxvY2F0aW9uLmpzb25zcGVjc3BlY2lmaWNhdGlvbkZvclVuYWJsZSB0byByZWFkIHRoZSAnbGlicmFyaWVzLmpzb24nIHNwZWNpZmljYXRpb24gZmlsZToKICAjc3RyaW5nLmNyZWF0ZVBhY2thZ2VzRnJvbUZpbGVDYW4ndCBpbmZlciBhIC5wYWNrYWdlcyBmaWxlIHdoZW4gY29tcGlsaW5nIG11bHRpcGxlIGlucHV0cy5Ucnkgc3BlY2lmeWluZyB0aGUgZmlsZSBleHBsaWNpdGx5IHdpdGggdGhlIC0tcGFja2FnZXMgb3B0aW9uLkNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHNDYW4ndCBpbmZlciBhIC5wYWNrYWdlcyBmaWxlIGZyb20gYW4gaW5wdXQgJ3BhY2thZ2U6KicgVVJJLkNhbnRJbmZlclBhY2thZ2VzRnJvbVBhY2thZ2VVcmlfZmluZFBhY2thZ2VzRXJyb3Igd2hlbiByZWFkaW5nICcjdXJpJzogI3N0cmluZ2FsbG93RGVmYXVsdFBhY2thZ2VQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogI3N0cmluZ3NjcmlwdFVyaWRpclVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJyNuYW1lJy5FeHBlY3RlZCBpbnB1dCBVcmkgdG8gYmUgYWJzb2x1dGU6IGNoZWNrSW5EaXIucGFja2FnZXNwYXJlbnREaXIuLmluZmVyIHRoZSBkZWZhdWx0IHNkayBsb2NhdGlvbnZtX3BsYXRmb3JtX3N0cm9uZy5kaWxsbGliL2xpYnJhcmllcy5qc29uZWxlbWVudHM6IDxlbXB0eT4gIC0gSW5wdXRzOiBPdXRwdXQ6IFdhcyBkaWFnbm9zdGljIG1lc3NhZ2UgaGFuZGxlciBwcm92aWRlZDogbm95ZXNGaWxlU3lzdGVtOiAocHJvdmlkZWQ6IElucHV0IFN1bW1hcmllc0xpbmtlZCBEZXBlbmRlbmNpZXNQYWNrYWdlcyB1cmk6IFBhY2thZ2VzOiBDb21waWxlIFNESzogU0RLIHJvb3Q6ICAocHJvdmlkZWQ6IFNESyBzcGVjaWZpY2F0aW9uOiBTREsgc3VtbWFyeTogVGFyZ2V0OiB0aHJvd09uRXJyb3JzRm9yRGVidWdnaW5nOiB0aHJvd09uV2FybmluZ3NGb3JEZWJ1Z2dpbmc6IGV4aXQgb24gcHJvYmxlbTogRW1iZWQgc291cmNlczogZGVidWdEdW1wOiB2ZXJib3NlOiB2ZXJpZnk6IEhlcm1ldGljRmlsZVN5c3RlbWluY2x1ZGVkRmlsZXNfcmVhbEZpbGVTeXN0ZW1IZXJtZXRpY0FjY2Vzc0V4Y2VwdGlvbkludmFsaWQgYWNjZXNzIHRvIHRoZSBmaWxlIGlzIGFjY2Vzc2VkIGluIGEgbW9kdWxhciBoZXJtZXRpYyBidWlsZCwgYnV0IGl0IHdhcyBub3QgZXhwbGljaXRseSBsaXN0ZWQgYXMgYW4gaW5wdXQuZm9yY2VCdWlsZERpcnJlc29sdmVkRXhlY3V0YWJsZXZtRGlyZWN0b3J5L2Jpbi8uLi8uLi8uLi9saWIvX2ludGVybmFsL3RyYW5zbGF0ZVNkay9zZGsvY2FjaGVkU2RrUm9vdC4uL3Nkay9saWIvbGlicmFyaWVzLmpzb25zZGsvb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvaXNFeGlzdGluZ0ZpbGVleGlzdHNTeW5jZmFzdGEuY29tcGlsZXJfY29udGV4dFpvbmVydW5ab25lZGNvbG9yc1N0cmluZ1Rva2VubWVzc2FnZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0ZXJyb3JzY29tcGlsaW5nUGxhdGZvcm1mb3JtYXRXaXRob3V0TG9jYXRpb25yZWNvcmREZXBlbmRlbmN5RXhwZWN0ZWQgYSBmaWxlIG9yIGh0dHAgVVJJLCBidXQgZ290OiAnJy5Db21waWxlciBjYW5ub3QgcnVuIHdpdGhvdXQgYSBjb21waWxlciBjb250ZXh0LkFyZSBjYWxscyB0byB0aGUgY29tcGlsZXIgd3JhcHBlZCBpbiBDb21waWxlckNvbnRleHQucnVuSW5Db250ZXh0P0ludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0dGlwSW50ZXJuYWwgcHJvYmxlbTogClRpcDogaXNBY3RpdmVydW5JbkNvbnRleHR3aGVuQ29tcGxldGV6b25lVmFsdWVzcnVuV2l0aE9wdGlvbnNydW5XaXRoRGVmYXVsdE9wdGlvbnNjb21waWxlckNvbnRleHRLZXlmYXN0YS5jb2Rlc2Zhc3RhX2NvZGVzX2NmZV9nZW5lcmF0ZWQuZGFydHRlbXBsYXRlQW1iaWd1b3VzU3VwZXJ0eXBlcycjbmFtZScgY2FuJ3QgaW1wbGVtZW50IGJvdGggJyN0eXBlJyBhbmQgJyN0eXBlMidjb2RlQW1iaWd1b3VzU3VwZXJ0eXBlc0FtYmlndW91c1N1cGVydHlwZXNBTUJJR1VPVVNfU1VQRVJUWVBFU3RlbXBsYXRlQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZVRoZSBhcmd1bWVudCB0eXBlICcjdHlwZScgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICcjdHlwZTInLmNvZGVBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZUFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEV0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRUaGUgZWxlbWVudCAnI2NvbnN0YW50JyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGVsZW1lbnQgaW4gdGhlIHNldC5jb2RlQ29uc3RFdmFsRHVwbGljYXRlRWxlbWVudENvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRFUVVBTF9FTEVNRU5UU19JTl9DT05TVF9TRVR0ZW1wbGF0ZUNvbnN0RXZhbER1cGxpY2F0ZUtleVRoZSBrZXkgJyNjb25zdGFudCcgY29uZmxpY3RzIHdpdGggYW5vdGhlciBleGlzdGluZyBrZXkgaW4gdGhlIG1hcC5jb2RlQ29uc3RFdmFsRHVwbGljYXRlS2V5Q29uc3RFdmFsRHVwbGljYXRlS2V5RVFVQUxfS0VZU19JTl9DT05TVF9NQVB0ZW1wbGF0ZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWxUaGUgZWxlbWVudCAnI2NvbnN0YW50JyBkb2VzIG5vdCBoYXZlIGEgcHJpbWl0aXZlIG9wZXJhdG9yICc9PScuY29kZUNvbnN0RXZhbEVsZW1lbnRJbXBsZW1lbnRzRXF1YWxDb25zdEV2YWxFbGVtZW50SW1wbGVtZW50c0VxdWFsQ09OU1RfU0VUX0VMRU1FTlRfVFlQRV9JTVBMRU1FTlRTX0VRVUFMU3RlbXBsYXRlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXJUaGUgdHlwZSAnI3R5cGUnIGlzIG5vdCBhIGNvbnN0YW50IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHR5cGUgcGFyYW1ldGVyLCBvbmx5IGluc3RhbnRpYXRlZCB0eXBlcyBhcmUgYWxsb3dlZC5jb2RlQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXJDb25zdEV2YWxGcmVlVHlwZVBhcmFtZXRlcnRlbXBsYXRlQ29uc3RFdmFsSW52YWxpZEJpbmFyeU9wZXJhbmRUeXBlQmluYXJ5IG9wZXJhdG9yICcjc3RyaW5nJyBvbiAnI2NvbnN0YW50JyByZXF1aXJlcyBvcGVyYW5kIG9mIHR5cGUgJyN0eXBlJywgYnV0IHdhcyBvZiB0eXBlICcjdHlwZTInLmNvZGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGVDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRFcXVhbHNPcGVyYW5kVHlwZUJpbmFyeSBvcGVyYXRvciAnPT0nIHJlcXVpcmVzIHJlY2VpdmVyIGNvbnN0YW50ICcjY29uc3RhbnQnIG9mIHR5cGUgJ051bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycsIGJ1dCB3YXMgb2YgdHlwZSAnI3R5cGUnLmNvZGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGVDb25zdEV2YWxJbnZhbGlkRXF1YWxzT3BlcmFuZFR5cGV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uVGhlIG1ldGhvZCAnI3N0cmluZycgY2FuJ3QgYmUgaW52b2tlZCBvbiAnI2NvbnN0YW50JyBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24uY29kZUNvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uQ29uc3RFdmFsSW52YWxpZE1ldGhvZEludm9jYXRpb25VTkRFRklORURfT1BFUkFUT1J0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldFRoZSBwcm9wZXJ0eSAnI3N0cmluZycgY2FuJ3QgYmUgYWNjZXNzZWQgb24gJyNjb25zdGFudCcgaW4gYSBjb25zdGFudCBleHByZXNzaW9uLmNvZGVDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXRDb25zdEV2YWxJbnZhbGlkUHJvcGVydHlHZXRDT05TVF9FVkFMX1RIUk9XU19FWENFUFRJT050ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZFRoZSBjb25zdGFudCB2YWx1ZSAnI2NvbnN0YW50JyBjYW4ndCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBzdHJpbmcgaW50ZXJwb2xhdGlvbiBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24uCk9ubHkgdmFsdWVzIG9mIHR5cGUgJ251bGwnLCAnYm9vbCcsICdpbnQnLCAnZG91YmxlJywgb3IgJ1N0cmluZycgY2FuIGJlIHVzZWQuY29kZUNvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZENvbnN0RXZhbEludmFsaWRTdHJpbmdJbnRlcnBvbGF0aW9uT3BlcmFuZENPTlNUX0VWQUxfVFlQRV9CT09MX05VTV9TVFJJTkd0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lVGhlIHN5bWJvbCBuYW1lIG11c3QgYmUgYSB2YWxpZCBwdWJsaWMgRGFydCBtZW1iZXIgbmFtZSwgcHVibGljIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGxpYnJhcnkgbmFtZSwgb3B0aW9uYWxseSBxdWFsaWZpZWQsIGJ1dCB3YXMgJyNjb25zdGFudCcuY29kZUNvbnN0RXZhbEludmFsaWRTeW1ib2xOYW1lQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWV0ZW1wbGF0ZUNvbnN0RXZhbEludmFsaWRUeXBlRXhwZWN0ZWQgY29uc3RhbnQgJyNjb25zdGFudCcgdG8gYmUgb2YgdHlwZSAnI3R5cGUnLCBidXQgd2FzIG9mIHR5cGUgJyN0eXBlMicuY29kZUNvbnN0RXZhbEludmFsaWRUeXBlQ29uc3RFdmFsSW52YWxpZFR5cGV0ZW1wbGF0ZUNvbnN0RXZhbEtleUltcGxlbWVudHNFcXVhbFRoZSBrZXkgJyNjb25zdGFudCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLmNvZGVDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWxDb25zdEV2YWxLZXlJbXBsZW1lbnRzRXF1YWxDT05TVF9NQVBfS0VZX0VYUFJFU1NJT05fVFlQRV9JTVBMRU1FTlRTX0VRVUFMU3RlbXBsYXRlRGVmZXJyZWRUeXBlQW5ub3RhdGlvblRoZSB0eXBlICcjdHlwZScgaXMgZGVmZXJyZWQgbG9hZGVkIHZpYSBwcmVmaXggJyNuYW1lJyBhbmQgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYW5ub3RhdGlvbi5UcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJyNuYW1lJyBvciB1c2UgYSBzdXBlcnR5cGUgb2YgJyN0eXBlJyB0aGF0IGlzbid0IGRlZmVycmVkLmNvZGVEZWZlcnJlZFR5cGVBbm5vdGF0aW9uRGVmZXJyZWRUeXBlQW5ub3RhdGlvblRZUEVfQU5OT1RBVElPTl9ERUZFUlJFRF9DTEFTU0V4cGVjdGVkICcjdHlwZScgdG8gYmUgYSBzdWJ0eXBlIG9mICcjdHlwZTInLmNvZGVGZmlEYXJ0VHlwZU1pc21hdGNoRmZpRGFydFR5cGVNaXNtYXRjaEV4cGVjdGVkIGFuIGV4Y2VwdGlvbmFsIHJldHVybiB2YWx1ZSBmb3IgYSBuYXRpdmUgY2FsbGJhY2sgcmV0dXJuaW5nICcjdHlwZScuY29kZUZmaUV4cGVjdGVkRXhjZXB0aW9uYWxSZXR1cm5GZmlFeHBlY3RlZEV4Y2VwdGlvbmFsUmV0dXJuRXhjZXB0aW9uYWwgcmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBwcm92aWRlZCBmb3IgYSBuYXRpdmUgY2FsbGJhY2sgcmV0dXJuaW5nICcjdHlwZScuY29kZUZmaUV4cGVjdGVkTm9FeGNlcHRpb25hbFJldHVybkZmaUV4cGVjdGVkTm9FeGNlcHRpb25hbFJldHVybkV4cGVjdGVkIHR5cGUgJyN0eXBlJyB0byBiZSBhIHZhbGlkIGFuZCBpbnN0YW50aWF0ZWQgc3VidHlwZSBvZiAnTmF0aXZlVHlwZScuY29kZUZmaVR5cGVJbnZhbGlkRmZpVHlwZUludmFsaWRFeHBlY3RlZCB0eXBlICcjdHlwZScgdG8gYmUgJyN0eXBlMicsIHdoaWNoIGlzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byAnI3R5cGUzJy5jb2RlRmZpVHlwZU1pc21hdGNoRmZpVHlwZU1pc21hdGNodGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRXJyb3JUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBpbml0aWFsaXplIGZpZWxkICcjbmFtZScgYmVjYXVzZSBpdHMgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgYWxsb3cgbnVsbC5jb2RlRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckVycm9yRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckVycm9ydGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yV2FybmluZ1RoaXMgY29uc3RydWN0b3IgZG9lc24ndCBpbml0aWFsaXplIGZpZWxkICcjbmFtZScgYW5kIGl0cyB0eXBlICcjdHlwZScgZG9lc24ndCBhbGxvdyBudWxsLmNvZGVGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yV2FybmluZ0ZpZWxkTm9uTnVsbGFibGVOb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3JXYXJuaW5ndGVtcGxhdGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3JGaWVsZCAnI25hbWUnIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWNhdXNlIGl0cyB0eXBlICcjdHlwZScgZG9lc24ndCBhbGxvdyBudWxsLmNvZGVGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3JGaWVsZE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3J0ZW1wbGF0ZUZpZWxkTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJXYXJuaW5nRmllbGQgJyNuYW1lJyBpc24ndCBpbml0aWFsaXplZCBhbmQgaXRzIHR5cGUgJyN0eXBlJyBkb2Vzbid0IGFsbG93IG51bGwuY29kZUZpZWxkTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJXYXJuaW5nRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmd0ZW1wbGF0ZUZvckluTG9vcEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZUEgdmFsdWUgb2YgdHlwZSAnI3R5cGUnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnI3R5cGUyJy5UcnkgY2hhbmdpbmcgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLmNvZGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGVGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGVGT1JfSU5fT0ZfSU5WQUxJRF9FTEVNRU5UX1RZUEV0ZW1wbGF0ZUZvckluTG9vcFR5cGVOb3RJdGVyYWJsZVRoZSB0eXBlICcjdHlwZScgdXNlZCBpbiB0aGUgJ2ZvcicgbG9vcCBtdXN0IGltcGxlbWVudCAnI3R5cGUyJy5jb2RlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlRm9ySW5Mb29wVHlwZU5vdEl0ZXJhYmxlRk9SX0lOX09GX0lOVkFMSURfVFlQRXRlbXBsYXRlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnRHZW5lcmljIGZ1bmN0aW9uIHR5cGUgJyN0eXBlJyBpbmZlcnJlZCBhcyBhIHR5cGUgYXJndW1lbnQuVHJ5IHByb3ZpZGluZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUgZXhwbGljaXRseS5jb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZUluZmVycmVkQXNBY3R1YWxUeXBlQXJndW1lbnRHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudEdFTkVSSUNfRlVOQ1RJT05fQ0FOTk9UX0JFX1RZUEVfQVJHVU1FTlRjb2RlSWxsZWdhbFJlY3Vyc2l2ZVR5cGVJbGxlZ2FsUmVjdXJzaXZlVHlwZXRlbXBsYXRlSW1wbGljaXRDYWxsT2ZOb25NZXRob2RDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcjdHlwZScgYmVjYXVzZSBpdCBkZWNsYXJlcyAnY2FsbCcgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuVHJ5IGNoYW5naW5nICdjYWxsJyB0byBhIG1ldGhvZCBvciBleHBsaWNpdGx5IGludm9rZSAnY2FsbCcuY29kZUltcGxpY2l0Q2FsbE9mTm9uTWV0aG9kSW1wbGljaXRDYWxsT2ZOb25NZXRob2RJTVBMSUNJVF9DQUxMX09GX05PTl9NRVRIT0R0ZW1wbGF0ZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGVUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdHlwZSAnI3R5cGUnIGlzbid0IGEgc3VidHlwZSBvZiAnI3R5cGUyJy5jb2RlSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZUluY29tcGF0aWJsZVJlZGlyZWN0ZWVGdW5jdGlvblR5cGVSRURJUkVDVF9UT19JTlZBTElEX1RZUEV0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudFR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyNuYW1lMicuVHJ5IGNoYW5naW5nIHR5cGUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBjb25mb3JtIHRvIHRoZSBib3VuZHMuY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluY29ycmVjdFR5cGVBcmd1bWVudFRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EU3RlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5SZXR1cm5UeXBlVHlwZSBhcmd1bWVudCAnI3R5cGUnIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJyN0eXBlMicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBvbiAnI25hbWUyJyBpbiB0aGUgcmV0dXJuIHR5cGUuY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZUluY29ycmVjdFR5cGVBcmd1bWVudEluUmV0dXJuVHlwZXRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInIGluIHRoZSBzdXBlcnR5cGUgJyNuYW1lMycgb2YgY2xhc3MgJyNuYW1lNCcuY29kZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGV0ZW1wbGF0ZUluY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlSW5mZXJyZWRJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInIGluIHRoZSBzdXBlcnR5cGUgJyNuYW1lMycgb2YgY2xhc3MgJyNuYW1lNCcuVHJ5IHNwZWNpZnlpbmcgdHlwZSBhcmd1bWVudHMgZXhwbGljaXRseSBzbyB0aGF0IHRoZXkgY29uZm9ybSB0byB0aGUgYm91bmRzLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5TdXBlcnR5cGVJbmZlcnJlZHRlbXBsYXRlSW5jb3JyZWN0VHlwZUFyZ3VtZW50SW5mZXJyZWRJbmZlcnJlZCB0eXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjbmFtZTInLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZEluY29ycmVjdFR5cGVBcmd1bWVudEluZmVycmVkdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRUeXBlIGFyZ3VtZW50ICcjdHlwZScgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnI3R5cGUyJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnI25hbWUnIG9uICcjdHlwZTMuI25hbWUyJy5jb2RlSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkdGVtcGxhdGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZEluZmVycmVkIHR5cGUgYXJndW1lbnQgJyN0eXBlJyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICcjdHlwZTInIG9mIHRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgb24gJyN0eXBlMy4jbmFtZTInLmNvZGVJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZEluY29ycmVjdFR5cGVBcmd1bWVudFF1YWxpZmllZEluZmVycmVkdGVtcGxhdGVJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hUaGUgdHlwZSBvZiBwYXJhbWV0ZXIgJyNuYW1lJywgJyN0eXBlJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkJ3MgdHlwZSwgJyN0eXBlMicuVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHBhcmFtZXRlciAnI25hbWUnIHRvIGEgc3VidHlwZSBvZiAnI3R5cGUyJy5jb2RlSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoSU5WQUxJRF9QQVJBTUVURVJfREVDTEFSQVRJT050ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkTnVsbGFiaWxpdHlVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSB2YWx1ZSAnI3N0cmluZycgb24gdHlwZSAnI3R5cGUnLmNvZGVJbnRlcm5hbFByb2JsZW1VbnN1cHBvcnRlZE51bGxhYmlsaXR5SW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWROdWxsYWJpbGl0eXRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnRFcnJvcmNvZGVJbnZhbGlkQXNzaWdubWVudEVycm9ySW52YWxpZEFzc2lnbm1lbnRFcnJvcklOVkFMSURfQVNTSUdOTUVOVHRlbXBsYXRlSW52YWxpZEFzc2lnbm1lbnRXYXJuaW5nQXNzaWduaW5nIHZhbHVlIG9mIHR5cGUgJyN0eXBlJyB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJyN0eXBlMicuY29kZUludmFsaWRBc3NpZ25tZW50V2FybmluZ0ludmFsaWRBc3NpZ25tZW50V2FybmluZ3RlbXBsYXRlSW52YWxpZENhc3RGdW5jdGlvbkV4cHJUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3RGdW5jdGlvbkV4cHJJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwcklOVkFMSURfQ0FTVF9GVU5DVElPTl9FWFBSdGVtcGxhdGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0VGhlIGxpc3QgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGxpc3QgbGl0ZXJhbCBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLmNvZGVJbnZhbGlkQ2FzdExpdGVyYWxMaXN0SW52YWxpZENhc3RMaXRlcmFsTGlzdElOVkFMSURfQ0FTVF9MSVRFUkFMX0xJU1R0ZW1wbGF0ZUludmFsaWRDYXN0TGl0ZXJhbE1hcFRoZSBtYXAgbGl0ZXJhbCB0eXBlICcjdHlwZScgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnI3R5cGUyJy5DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1hcCBsaXRlcmFsIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0TGl0ZXJhbE1hcEludmFsaWRDYXN0TGl0ZXJhbE1hcElOVkFMSURfQ0FTVF9MSVRFUkFMX01BUHRlbXBsYXRlSW52YWxpZENhc3RMaXRlcmFsU2V0VGhlIHNldCBsaXRlcmFsIHR5cGUgJyN0eXBlJyBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgc2V0IGxpdGVyYWwgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3RMaXRlcmFsU2V0SW52YWxpZENhc3RMaXRlcmFsU2V0SU5WQUxJRF9DQVNUX0xJVEVSQUxfU0VUdGVtcGxhdGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25UaGUgbG9jYWwgZnVuY3Rpb24gaGFzIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyB1c2VkLmNvZGVJbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25JbnZhbGlkQ2FzdExvY2FsRnVuY3Rpb25JTlZBTElEX0NBU1RfRlVOQ1RJT050ZW1wbGF0ZUludmFsaWRDYXN0TmV3RXhwclRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIHR5cGUgJyN0eXBlJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJyN0eXBlMicuQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY29uc3RydWN0ZWQgb3IgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgdXNlZC5jb2RlSW52YWxpZENhc3ROZXdFeHBySW52YWxpZENhc3ROZXdFeHBySU5WQUxJRF9DQVNUX05FV19FWFBSdGVtcGxhdGVJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZFRoZSBzdGF0aWMgbWV0aG9kIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLkNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIG9yIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIHVzZWQuY29kZUludmFsaWRDYXN0U3RhdGljTWV0aG9kSW52YWxpZENhc3RTdGF0aWNNZXRob2RJTlZBTElEX0NBU1RfTUVUSE9EdGVtcGxhdGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25UaGUgdG9wIGxldmVsIGZ1bmN0aW9uIGhhcyB0eXBlICcjdHlwZScgdGhhdCBpc24ndCBvZiBleHBlY3RlZCB0eXBlICcjdHlwZTInLmNvZGVJbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb25JbnZhbGlkQ2FzdFRvcExldmVsRnVuY3Rpb250ZW1wbGF0ZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGUnI3R5cGUnIGRvZXNuJ3QgaW1wbGVtZW50ICcjdHlwZTInIHNvIGl0IGNhbid0IGJlIHVzZWQgd2l0aCAnI3R5cGUzJy5jb2RlTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZU1peGluQXBwbGljYXRpb25JbmNvbXBhdGlibGVTdXBlcnR5cGVNSVhJTl9BUFBMSUNBVElPTl9OT1RfSU1QTEVNRU5URURfSU5URVJGQUNFdGVtcGxhdGVNaXhpbkluZmVyZW5jZU5vTWF0Y2hpbmdDbGFzc1R5cGUgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgaW5mZXJyZWQgZm9yIHRoZSBtaXhpbiAnI25hbWUnIGJlY2F1c2UgJyNuYW1lMicgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtaXhpbidzIHN1cGVydHlwZSBjb25zdHJhaW50ICcjdHlwZScuY29kZU1peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzTWl4aW5JbmZlcmVuY2VOb01hdGNoaW5nQ2xhc3NNSVhJTl9JTkZFUkVOQ0VfTk9fUE9TU0lCTEVfU1VCU1RJVFVUSU9OdGVtcGxhdGVOb25OdWxsYWJsZUluTnVsbEF3YXJlT3BlcmFuZCBvZiBudWxsLWF3YXJlIG9wZXJhdGlvbiAnI25hbWUnIGhhcyB0eXBlICcjdHlwZScgd2hpY2ggZXhjbHVkZXMgbnVsbC5jb2RlTm9uTnVsbGFibGVJbk51bGxBd2FyZU5vbk51bGxhYmxlSW5OdWxsQXdhcmV0ZW1wbGF0ZU51bGxhYmxlRXhwcmVzc2lvbkNhbGxFcnJvckNhbid0IHVzZSBhbiBleHByZXNzaW9uIG9mIHR5cGUgJyN0eXBlJyBhcyBhIGZ1bmN0aW9uIGJlY2F1c2UgaXQncyBwb3RlbnRpYWxseSBudWxsLlRyeSBjYWxsaW5nIHVzaW5nID8uY2FsbCBpbnN0ZWFkLmNvZGVOdWxsYWJsZUV4cHJlc3Npb25DYWxsRXJyb3JOdWxsYWJsZUV4cHJlc3Npb25DYWxsRXJyb3J0ZW1wbGF0ZU51bGxhYmxlRXhwcmVzc2lvbkNhbGxXYXJuaW5nRXhwcmVzc2lvbiBvZiB0eXBlICcjdHlwZScgaXMgdXNlZCBhcyBhIGZ1bmN0aW9uLCBidXQgaXQncyBwb3RlbnRpYWxseSBudWxsLmNvZGVOdWxsYWJsZUV4cHJlc3Npb25DYWxsV2FybmluZ051bGxhYmxlRXhwcmVzc2lvbkNhbGxXYXJuaW5ndGVtcGxhdGVOdWxsYWJsZU1ldGhvZENhbGxFcnJvck1ldGhvZCAnI25hbWUnIGNhbm5vdCBiZSBjYWxsZWQgb24gJyN0eXBlJyBiZWNhdXNlIGl0IGlzIHBvdGVudGlhbGx5IG51bGwuVHJ5IGNhbGxpbmcgdXNpbmcgPy4gaW5zdGVhZC5jb2RlTnVsbGFibGVNZXRob2RDYWxsRXJyb3JOdWxsYWJsZU1ldGhvZENhbGxFcnJvcnRlbXBsYXRlTnVsbGFibGVNZXRob2RDYWxsV2FybmluZ01ldGhvZCAnI25hbWUnIGlzIGNhbGxlZCBvbiAnI3R5cGUnIHdoaWNoIGlzIHBvdGVudGlhbGx5IG51bGwuY29kZU51bGxhYmxlTWV0aG9kQ2FsbFdhcm5pbmdOdWxsYWJsZU1ldGhvZENhbGxXYXJuaW5ndGVtcGxhdGVOdWxsYWJsZU9wZXJhdG9yQ2FsbEVycm9yT3BlcmF0b3IgJyNuYW1lJyBjYW5ub3QgYmUgY2FsbGVkIG9uICcjdHlwZScgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBudWxsLmNvZGVOdWxsYWJsZU9wZXJhdG9yQ2FsbEVycm9yTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvcnRlbXBsYXRlTnVsbGFibGVPcGVyYXRvckNhbGxXYXJuaW5nT3BlcmF0b3IgJyNuYW1lJyBpcyBjYWxsZWQgb24gJyN0eXBlJyB3aGljaCBpcyBwb3RlbnRpYWxseSBudWxsLmNvZGVOdWxsYWJsZU9wZXJhdG9yQ2FsbFdhcm5pbmdOdWxsYWJsZU9wZXJhdG9yQ2FsbFdhcm5pbmd0ZW1wbGF0ZU51bGxhYmxlUHJvcGVydHlBY2Nlc3NFcnJvclByb3BlcnR5ICcjbmFtZScgY2Fubm90IGJlIGFjY2Vzc2VkIG9uICcjdHlwZScgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBudWxsLlRyeSBhY2Nlc3NpbmcgdXNpbmcgPy4gaW5zdGVhZC5jb2RlTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc0Vycm9yTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc0Vycm9ydGVtcGxhdGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzV2FybmluZ1Byb3BlcnR5ICcjbmFtZScgaXMgYWNjZXNzZWQgb24gJyN0eXBlJyB3aGljaCBpcyBwb3RlbnRpYWxseSBudWxsLmNvZGVOdWxsYWJsZVByb3BlcnR5QWNjZXNzV2FybmluZ051bGxhYmxlUHJvcGVydHlBY2Nlc3NXYXJuaW5ndGVtcGxhdGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3JPcHRpb25hbCBwYXJhbWV0ZXIgJyNuYW1lJyBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYmVjYXVzZSBpdHMgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgYWxsb3cgbnVsbC5jb2RlT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9ydGVtcGxhdGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZ09wdGlvbmFsIHBhcmFtZXRlciAnI25hbWUnIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYW5kIGl0cyB0eXBlICcjdHlwZScgZG9lc24ndCBhbGxvdyBudWxsLmNvZGVPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyV2FybmluZ09wdGlvbmFsTm9uTnVsbGFibGVXaXRob3V0SW5pdGlhbGl6ZXJXYXJuaW5ndGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlclRoZSBwYXJhbWV0ZXIgJyNuYW1lJyBvZiB0aGUgbWV0aG9kICcjbmFtZTInIGhhcyB0eXBlICcjdHlwZScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICcjdHlwZTInLCBpbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICcjbmFtZTMnLkNoYW5nZSB0byBhIHN1cGVydHlwZSBvZiAnI3R5cGUyJywgb3IsIGZvciBhIGNvdmFyaWFudCBwYXJhbWV0ZXIsIGEgc3VidHlwZS5jb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hQYXJhbWV0ZXJPdmVycmlkZVR5cGVNaXNtYXRjaFBhcmFtZXRlcklOVkFMSURfTUVUSE9EX09WRVJSSURFdGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFJldHVyblR5cGVUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCAnI25hbWUnIGlzICcjdHlwZScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgJyN0eXBlMicsIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJyNuYW1lMicuQ2hhbmdlIHRvIGEgc3VidHlwZSBvZiAnI3R5cGUyJy5jb2RlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBldGVtcGxhdGVPdmVycmlkZVR5cGVNaXNtYXRjaFNldHRlclRoZSBmaWVsZCAnI25hbWUnIGhhcyB0eXBlICcjdHlwZScsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICcjdHlwZTInLCBpbiB0aGUgb3ZlcnJpZGRlbiBzZXR0ZXIsICcjbmFtZTInLmNvZGVPdmVycmlkZVR5cGVNaXNtYXRjaFNldHRlck92ZXJyaWRlVHlwZU1pc21hdGNoU2V0dGVydGVtcGxhdGVPdmVycmlkZVR5cGVWYXJpYWJsZXNCb3VuZE1pc21hdGNoRGVjbGFyZWQgYm91bmQgJyN0eXBlJyBvZiB0eXBlIHZhcmlhYmxlICcjbmFtZScgb2YgJyNuYW1lMicgZG9lc24ndCBtYXRjaCB0aGUgYm91bmQgJyN0eXBlMicgb24gb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMycuY29kZU92ZXJyaWRlVHlwZVZhcmlhYmxlc0JvdW5kTWlzbWF0Y2hPdmVycmlkZVR5cGVWYXJpYWJsZXNCb3VuZE1pc21hdGNodGVtcGxhdGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnRUaGUgdHlwZSAnI3R5cGUnIGRvZXNuJ3QgZXh0ZW5kICcjdHlwZTInLlRyeSB1c2luZyBhIGRpZmZlcmVudCB0eXBlIGFzIGFyZ3VtZW50LmNvZGVSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnRSZWRpcmVjdGluZ0ZhY3RvcnlJbmNvbXBhdGlibGVUeXBlQXJndW1lbnR0ZW1wbGF0ZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVsZW1lbnRzIG9mIHR5cGUgJyN0eXBlJyB0byBjb2xsZWN0aW9uIGVsZW1lbnRzIG9mIHR5cGUgJyN0eXBlMicuY29kZVNwcmVhZEVsZW1lbnRUeXBlTWlzbWF0Y2hTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEV0ZW1wbGF0ZVNwcmVhZE1hcEVudHJ5RWxlbWVudEtleVR5cGVNaXNtYXRjaENhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkga2V5cyBvZiB0eXBlICcjdHlwZScgdG8gbWFwIGVudHJ5IGtleXMgb2YgdHlwZSAnI3R5cGUyJy5jb2RlU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoU3ByZWFkTWFwRW50cnlFbGVtZW50S2V5VHlwZU1pc21hdGNoTUFQX0tFWV9UWVBFX05PVF9BU1NJR05BQkxFdGVtcGxhdGVTcHJlYWRNYXBFbnRyeUVsZW1lbnRWYWx1ZVR5cGVNaXNtYXRjaENhbid0IGFzc2lnbiBzcHJlYWQgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlJyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJyN0eXBlMicuY29kZVNwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoU3ByZWFkTWFwRW50cnlFbGVtZW50VmFsdWVUeXBlTWlzbWF0Y2hNQVBfVkFMVUVfVFlQRV9OT1RfQVNTSUdOQUJMRXRlbXBsYXRlU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2hVbmV4cGVjdGVkIHR5cGUgJyN0eXBlJyBvZiBhIG1hcCBzcHJlYWQgZW50cnkuICBFeHBlY3RlZCAnZHluYW1pYycgb3IgYSBNYXAuY29kZVNwcmVhZE1hcEVudHJ5VHlwZU1pc21hdGNoU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2h0ZW1wbGF0ZVNwcmVhZFR5cGVNaXNtYXRjaFVuZXhwZWN0ZWQgdHlwZSAnI3R5cGUnIG9mIGEgc3ByZWFkLiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGFuIEl0ZXJhYmxlLmNvZGVTcHJlYWRUeXBlTWlzbWF0Y2hTcHJlYWRUeXBlTWlzbWF0Y2h0ZW1wbGF0ZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlVHlwZSAnI3R5cGUnIG9mIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpc24ndCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlICcjdHlwZTInIG9mIHRoaXMgY2FzZSBleHByZXNzaW9uLmNvZGVTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlU1dJVENIX0VYUFJFU1NJT05fTk9UX0FTU0lHTkFCTEV0ZW1wbGF0ZVRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0RXJyb3JDYW4ndCB0aHJvdyBhIHZhbHVlIG9mICcjdHlwZScgc2luY2UgaXQgaXMgbmVpdGhlciBkeW5hbWljIG5vciBub24tbnVsbGFibGUuY29kZVRocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0RXJyb3JUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdEVycm9ydGVtcGxhdGVUaHJvd2luZ05vdEFzc2lnbmFibGVUb09iamVjdFdhcm5pbmdUaHJvd2luZyBhIHZhbHVlIG9mICcjdHlwZScgdGhhdCBpcyBuZWl0aGVyIGR5bmFtaWMgbm9yIG5vbi1udWxsYWJsZS5jb2RlVGhyb3dpbmdOb3RBc3NpZ25hYmxlVG9PYmplY3RXYXJuaW5nVGhyb3dpbmdOb3RBc3NpZ25hYmxlVG9PYmplY3RXYXJuaW5ndGVtcGxhdGVVbmRlZmluZWRHZXR0ZXJUaGUgZ2V0dGVyICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZ2V0dGVyLCBvciBkZWZpbmluZyBhIGdldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLmNvZGVVbmRlZmluZWRHZXR0ZXJVbmRlZmluZWRHZXR0ZXJVTkRFRklORURfR0VUVEVSdGVtcGxhdGVVbmRlZmluZWRNZXRob2RUaGUgbWV0aG9kICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWV0aG9kLCBvciBkZWZpbmluZyBhIG1ldGhvZCBuYW1lZCAnI25hbWUnLmNvZGVVbmRlZmluZWRNZXRob2RVbmRlZmluZWRNZXRob2RVTkRFRklORURfTUVUSE9EdGVtcGxhdGVVbmRlZmluZWRTZXR0ZXJUaGUgc2V0dGVyICcjbmFtZScgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzICcjdHlwZScuVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3Rpbmcgc2V0dGVyLCBvciBkZWZpbmluZyBhIHNldHRlciBvciBmaWVsZCBuYW1lZCAnI25hbWUnLmNvZGVVbmRlZmluZWRTZXR0ZXJVbmRlZmluZWRTZXR0ZXJVTkRFRklORURfU0VUVEVSX3dpdGhBcmd1bWVudHNBbWJpZ3VvdXNTdXBlcnR5cGVzX3R5cGVfdHlwZTJObyBuYW1lIHByb3ZpZGVkbGFiZWxlcnR5cGVQYXJ0c2xhYmVsVHlwZXR5cGUyUGFydHMnJyBjYW4ndCBpbXBsZW1lbnQgYm90aCAnJyBhbmQgJ29yaWdpbk1lc3NhZ2VzX3dpdGhBcmd1bWVudHNBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlVGhlIGFyZ3VtZW50IHR5cGUgJycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbER1cGxpY2F0ZUVsZW1lbnRfY29uc3RhbnRjb25zdGFudFBhcnRzbGFiZWxDb25zdGFudFRoZSBlbGVtZW50ICcnIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgZXhpc3RpbmcgZWxlbWVudCBpbiB0aGUgc2V0Ll93aXRoQXJndW1lbnRzQ29uc3RFdmFsRHVwbGljYXRlS2V5VGhlIGtleSAnJyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGV4aXN0aW5nIGtleSBpbiB0aGUgbWFwLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsRWxlbWVudEltcGxlbWVudHNFcXVhbCcgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZSBvcGVyYXRvciAnPT0nLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsRnJlZVR5cGVQYXJhbWV0ZXJUaGUgdHlwZSAnJyBpcyBub3QgYSBjb25zdGFudCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gYSB0eXBlIHBhcmFtZXRlciwgb25seSBpbnN0YW50aWF0ZWQgdHlwZXMgYXJlIGFsbG93ZWQuX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkQmluYXJ5T3BlcmFuZFR5cGVObyBzdHJpbmcgcHJvdmlkZWRCaW5hcnkgb3BlcmF0b3IgJycgb24gJycgcmVxdWlyZXMgb3BlcmFuZCBvZiB0eXBlICcnLCBidXQgd2FzIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZEVxdWFsc09wZXJhbmRUeXBlQmluYXJ5IG9wZXJhdG9yICc9PScgcmVxdWlyZXMgcmVjZWl2ZXIgY29uc3RhbnQgJycgb2YgdHlwZSAnTnVsbCcsICdib29sJywgJ2ludCcsICdkb3VibGUnLCBvciAnU3RyaW5nJywgYnV0IHdhcyBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRNZXRob2RJbnZvY2F0aW9uVGhlIG1ldGhvZCAnJyBjYW4ndCBiZSBpbnZva2VkIG9uICcnIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbi5fd2l0aEFyZ3VtZW50c0NvbnN0RXZhbEludmFsaWRQcm9wZXJ0eUdldFRoZSBwcm9wZXJ0eSAnJyBjYW4ndCBiZSBhY2Nlc3NlZCBvbiAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkU3RyaW5nSW50ZXJwb2xhdGlvbk9wZXJhbmRUaGUgY29uc3RhbnQgdmFsdWUgJycgY2FuJ3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGEgc3RyaW5nIGludGVycG9sYXRpb24gaW4gYSBjb25zdGFudCBleHByZXNzaW9uLgpPbmx5IHZhbHVlcyBvZiB0eXBlICdudWxsJywgJ2Jvb2wnLCAnaW50JywgJ2RvdWJsZScsIG9yICdTdHJpbmcnIGNhbiBiZSB1c2VkLl93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN5bWJvbE5hbWVUaGUgc3ltYm9sIG5hbWUgbXVzdCBiZSBhIHZhbGlkIHB1YmxpYyBEYXJ0IG1lbWJlciBuYW1lLCBwdWJsaWMgY29uc3RydWN0b3IgbmFtZSwgb3IgbGlicmFyeSBuYW1lLCBvcHRpb25hbGx5IHF1YWxpZmllZCwgYnV0IHdhcyAnX3dpdGhBcmd1bWVudHNDb25zdEV2YWxJbnZhbGlkVHlwZUV4cGVjdGVkIGNvbnN0YW50ICcnIHRvIGJlIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsS2V5SW1wbGVtZW50c0VxdWFsX3dpdGhBcmd1bWVudHNEZWZlcnJlZFR5cGVBbm5vdGF0aW9uJyBpcyBkZWZlcnJlZCBsb2FkZWQgdmlhIHByZWZpeCAnJyBhbmQgY2FuJ3QgYmUgdXNlZCBhcyBhIHR5cGUgYW5ub3RhdGlvbi5UcnkgcmVtb3ZpbmcgJ2RlZmVycmVkJyBmcm9tIHRoZSBpbXBvcnQgb2YgJycgb3IgdXNlIGEgc3VwZXJ0eXBlIG9mICcnIHRoYXQgaXNuJ3QgZGVmZXJyZWQuX3dpdGhBcmd1bWVudHNGZmlEYXJ0VHlwZU1pc21hdGNoRXhwZWN0ZWQgJycgdG8gYmUgYSBzdWJ0eXBlIG9mICdfd2l0aEFyZ3VtZW50c0ZmaUV4cGVjdGVkRXhjZXB0aW9uYWxSZXR1cm5FeHBlY3RlZCBhbiBleGNlcHRpb25hbCByZXR1cm4gdmFsdWUgZm9yIGEgbmF0aXZlIGNhbGxiYWNrIHJldHVybmluZyAnX3dpdGhBcmd1bWVudHNGZmlFeHBlY3RlZE5vRXhjZXB0aW9uYWxSZXR1cm5FeGNlcHRpb25hbCByZXR1cm4gdmFsdWUgY2Fubm90IGJlIHByb3ZpZGVkIGZvciBhIG5hdGl2ZSBjYWxsYmFjayByZXR1cm5pbmcgJ193aXRoQXJndW1lbnRzRmZpVHlwZUludmFsaWRFeHBlY3RlZCB0eXBlICcnIHRvIGJlIGEgdmFsaWQgYW5kIGluc3RhbnRpYXRlZCBzdWJ0eXBlIG9mICdOYXRpdmVUeXBlJy5fd2l0aEFyZ3VtZW50c0ZmaVR5cGVNaXNtYXRjaF90eXBlM3R5cGUzUGFydHN0eXBlMycgdG8gYmUgJycsIHdoaWNoIGlzIHRoZSBEYXJ0IHR5cGUgY29ycmVzcG9uZGluZyB0byAnX3dpdGhBcmd1bWVudHNGaWVsZE5vbk51bGxhYmxlTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRXJyb3JUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBpbml0aWFsaXplIGZpZWxkICcnIGJlY2F1c2UgaXRzIHR5cGUgJycgZG9lc24ndCBhbGxvdyBudWxsLl93aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZU5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3Rvcldhcm5pbmdUaGlzIGNvbnN0cnVjdG9yIGRvZXNuJ3QgaW5pdGlhbGl6ZSBmaWVsZCAnJyBhbmQgaXRzIHR5cGUgJ193aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplckVycm9yRmllbGQgJycgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlY2F1c2UgaXRzIHR5cGUgJ193aXRoQXJndW1lbnRzRmllbGROb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcnIGlzbid0IGluaXRpYWxpemVkIGFuZCBpdHMgdHlwZSAnX3dpdGhBcmd1bWVudHNGb3JJbkxvb3BFbGVtZW50VHlwZU5vdEFzc2lnbmFibGVBIHZhbHVlIG9mIHR5cGUgJycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c0ZvckluTG9vcFR5cGVOb3RJdGVyYWJsZScgdXNlZCBpbiB0aGUgJ2ZvcicgbG9vcCBtdXN0IGltcGxlbWVudCAnX3dpdGhBcmd1bWVudHNHZW5lcmljRnVuY3Rpb25UeXBlSW5mZXJyZWRBc0FjdHVhbFR5cGVBcmd1bWVudEdlbmVyaWMgZnVuY3Rpb24gdHlwZSAnJyBpbmZlcnJlZCBhcyBhIHR5cGUgYXJndW1lbnQuX3dpdGhBcmd1bWVudHNJbGxlZ2FsUmVjdXJzaXZlVHlwZUlsbGVnYWwgcmVjdXJzaXZlIHR5cGUgJ193aXRoQXJndW1lbnRzSW1wbGljaXRDYWxsT2ZOb25NZXRob2RDYW5ub3QgaW52b2tlIGFuIGluc3RhbmNlIG9mICcnIGJlY2F1c2UgaXQgZGVjbGFyZXMgJ2NhbGwnIHRvIGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgbWV0aG9kLl93aXRoQXJndW1lbnRzSW5jb21wYXRpYmxlUmVkaXJlY3RlZUZ1bmN0aW9uVHlwZVRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlICcnIGlzbid0IGEgc3VidHlwZSBvZiAnX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRuYW1lMlR5cGUgYXJndW1lbnQgJycgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnJyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblJldHVyblR5cGUnIGluIHRoZSByZXR1cm4gdHlwZS5fd2l0aEFyZ3VtZW50c0luY29ycmVjdFR5cGVBcmd1bWVudEluU3VwZXJ0eXBlbmFtZTNuYW1lNCcgaW4gdGhlIHN1cGVydHlwZSAnJyBvZiBjbGFzcyAnX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJblN1cGVydHlwZUluZmVycmVkSW5mZXJyZWQgdHlwZSBhcmd1bWVudCAnX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRJbmZlcnJlZF93aXRoQXJndW1lbnRzSW5jb3JyZWN0VHlwZUFyZ3VtZW50UXVhbGlmaWVkX3dpdGhBcmd1bWVudHNJbmNvcnJlY3RUeXBlQXJndW1lbnRRdWFsaWZpZWRJbmZlcnJlZF93aXRoQXJndW1lbnRzSW5pdGlhbGl6aW5nRm9ybWFsVHlwZU1pc21hdGNoVGhlIHR5cGUgb2YgcGFyYW1ldGVyICcnLCAnJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkJ3MgdHlwZSwgJ1RyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgJycgdG8gYSBzdWJ0eXBlIG9mICdfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkTnVsbGFiaWxpdHlVbnN1cHBvcnRlZCBudWxsYWJpbGl0eSB2YWx1ZSAnJyBvbiB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50RXJyb3Jfd2l0aEFyZ3VtZW50c0ludmFsaWRBc3NpZ25tZW50V2FybmluZ0Fzc2lnbmluZyB2YWx1ZSBvZiB0eXBlICcnIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdEZ1bmN0aW9uRXhwclRoZSBmdW5jdGlvbiBleHByZXNzaW9uIHR5cGUgJycgaXNuJ3Qgb2YgZXhwZWN0ZWQgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdExpdGVyYWxMaXN0VGhlIGxpc3QgbGl0ZXJhbCB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbE1hcFRoZSBtYXAgbGl0ZXJhbCB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TGl0ZXJhbFNldFRoZSBzZXQgbGl0ZXJhbCB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0TG9jYWxGdW5jdGlvblRoZSBsb2NhbCBmdW5jdGlvbiBoYXMgdHlwZSAnJyB0aGF0IGlzbid0IG9mIGV4cGVjdGVkIHR5cGUgJ193aXRoQXJndW1lbnRzSW52YWxpZENhc3ROZXdFeHByVGhlIGNvbnN0cnVjdG9yIHJldHVybnMgdHlwZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkQ2FzdFN0YXRpY01ldGhvZFRoZSBzdGF0aWMgbWV0aG9kIGhhcyB0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRDYXN0VG9wTGV2ZWxGdW5jdGlvblRoZSB0b3AgbGV2ZWwgZnVuY3Rpb24gaGFzIHR5cGUgJ193aXRoQXJndW1lbnRzTWl4aW5BcHBsaWNhdGlvbkluY29tcGF0aWJsZVN1cGVydHlwZScgZG9lc24ndCBpbXBsZW1lbnQgJycgc28gaXQgY2FuJ3QgYmUgdXNlZCB3aXRoICdfd2l0aEFyZ3VtZW50c01peGluSW5mZXJlbmNlTm9NYXRjaGluZ0NsYXNzVHlwZSBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSBpbmZlcnJlZCBmb3IgdGhlIG1peGluICcnIGJlY2F1c2UgJycgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtaXhpbidzIHN1cGVydHlwZSBjb25zdHJhaW50ICdfd2l0aEFyZ3VtZW50c05vbk51bGxhYmxlSW5OdWxsQXdhcmVPcGVyYW5kIG9mIG51bGwtYXdhcmUgb3BlcmF0aW9uICcnIGhhcyB0eXBlICcnIHdoaWNoIGV4Y2x1ZGVzIG51bGwuX3dpdGhBcmd1bWVudHNOdWxsYWJsZUV4cHJlc3Npb25DYWxsRXJyb3JDYW4ndCB1c2UgYW4gZXhwcmVzc2lvbiBvZiB0eXBlICcnIGFzIGEgZnVuY3Rpb24gYmVjYXVzZSBpdCdzIHBvdGVudGlhbGx5IG51bGwuX3dpdGhBcmd1bWVudHNOdWxsYWJsZUV4cHJlc3Npb25DYWxsV2FybmluZ0V4cHJlc3Npb24gb2YgdHlwZSAnJyBpcyB1c2VkIGFzIGEgZnVuY3Rpb24sIGJ1dCBpdCdzIHBvdGVudGlhbGx5IG51bGwuX3dpdGhBcmd1bWVudHNOdWxsYWJsZU1ldGhvZENhbGxFcnJvck1ldGhvZCAnJyBjYW5ub3QgYmUgY2FsbGVkIG9uICcnIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgbnVsbC5fd2l0aEFyZ3VtZW50c051bGxhYmxlTWV0aG9kQ2FsbFdhcm5pbmcnIGlzIGNhbGxlZCBvbiAnJyB3aGljaCBpcyBwb3RlbnRpYWxseSBudWxsLl93aXRoQXJndW1lbnRzTnVsbGFibGVPcGVyYXRvckNhbGxFcnJvck9wZXJhdG9yICdfd2l0aEFyZ3VtZW50c051bGxhYmxlT3BlcmF0b3JDYWxsV2FybmluZ193aXRoQXJndW1lbnRzTnVsbGFibGVQcm9wZXJ0eUFjY2Vzc0Vycm9yUHJvcGVydHkgJycgY2Fubm90IGJlIGFjY2Vzc2VkIG9uICdfd2l0aEFyZ3VtZW50c051bGxhYmxlUHJvcGVydHlBY2Nlc3NXYXJuaW5nJyBpcyBhY2Nlc3NlZCBvbiAnX3dpdGhBcmd1bWVudHNPcHRpb25hbE5vbk51bGxhYmxlV2l0aG91dEluaXRpYWxpemVyRXJyb3JPcHRpb25hbCBwYXJhbWV0ZXIgJycgc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHZhbHVlIGJlY2F1c2UgaXRzIHR5cGUgJ193aXRoQXJndW1lbnRzT3B0aW9uYWxOb25OdWxsYWJsZVdpdGhvdXRJbml0aWFsaXplcldhcm5pbmcnIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgYW5kIGl0cyB0eXBlICdfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZU1pc21hdGNoUGFyYW1ldGVyVGhlIHBhcmFtZXRlciAnJyBvZiB0aGUgbWV0aG9kICcnLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnJywgaW4gdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnQ2hhbmdlIHRvIGEgc3VwZXJ0eXBlIG9mICcnLCBvciwgZm9yIGEgY292YXJpYW50IHBhcmFtZXRlciwgYSBzdWJ0eXBlLl93aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlTWlzbWF0Y2hSZXR1cm5UeXBlVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgJycgaXMgJycsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgJycsIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJ0NoYW5nZSB0byBhIHN1YnR5cGUgb2YgJ193aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlTWlzbWF0Y2hTZXR0ZXJUaGUgZmllbGQgJycsIGluIHRoZSBvdmVycmlkZGVuIHNldHRlciwgJ193aXRoQXJndW1lbnRzT3ZlcnJpZGVUeXBlVmFyaWFibGVzQm91bmRNaXNtYXRjaERlY2xhcmVkIGJvdW5kICcnIG9mIHR5cGUgdmFyaWFibGUgJycgb2YgJycgZG9lc24ndCBtYXRjaCB0aGUgYm91bmQgJycgb24gb3ZlcnJpZGRlbiBtZXRob2QgJ193aXRoQXJndW1lbnRzUmVkaXJlY3RpbmdGYWN0b3J5SW5jb21wYXRpYmxlVHlwZUFyZ3VtZW50JyBkb2Vzbid0IGV4dGVuZCAnX3dpdGhBcmd1bWVudHNTcHJlYWRFbGVtZW50VHlwZU1pc21hdGNoQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbGVtZW50cyBvZiB0eXBlICcnIHRvIGNvbGxlY3Rpb24gZWxlbWVudHMgb2YgdHlwZSAnX3dpdGhBcmd1bWVudHNTcHJlYWRNYXBFbnRyeUVsZW1lbnRLZXlUeXBlTWlzbWF0Y2hDYW4ndCBhc3NpZ24gc3ByZWFkIGVudHJ5IGtleXMgb2YgdHlwZSAnJyB0byBtYXAgZW50cnkga2V5cyBvZiB0eXBlICdfd2l0aEFyZ3VtZW50c1NwcmVhZE1hcEVudHJ5RWxlbWVudFZhbHVlVHlwZU1pc21hdGNoQ2FuJ3QgYXNzaWduIHNwcmVhZCBlbnRyeSB2YWx1ZXMgb2YgdHlwZSAnJyB0byBtYXAgZW50cnkgdmFsdWVzIG9mIHR5cGUgJ193aXRoQXJndW1lbnRzU3ByZWFkTWFwRW50cnlUeXBlTWlzbWF0Y2hVbmV4cGVjdGVkIHR5cGUgJycgb2YgYSBtYXAgc3ByZWFkIGVudHJ5LiAgRXhwZWN0ZWQgJ2R5bmFtaWMnIG9yIGEgTWFwLl93aXRoQXJndW1lbnRzU3ByZWFkVHlwZU1pc21hdGNoJyBvZiBhIHNwcmVhZC4gIEV4cGVjdGVkICdkeW5hbWljJyBvciBhbiBJdGVyYWJsZS5fd2l0aEFyZ3VtZW50c1N3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlVHlwZSAnJyBvZiB0aGUgc3dpdGNoIGV4cHJlc3Npb24gaXNuJ3QgYXNzaWduYWJsZSB0byB0aGUgdHlwZSAnJyBvZiB0aGlzIGNhc2UgZXhwcmVzc2lvbi5fd2l0aEFyZ3VtZW50c1Rocm93aW5nTm90QXNzaWduYWJsZVRvT2JqZWN0RXJyb3JDYW4ndCB0aHJvdyBhIHZhbHVlIG9mICcnIHNpbmNlIGl0IGlzIG5laXRoZXIgZHluYW1pYyBub3Igbm9uLW51bGxhYmxlLl93aXRoQXJndW1lbnRzVGhyb3dpbmdOb3RBc3NpZ25hYmxlVG9PYmplY3RXYXJuaW5nVGhyb3dpbmcgYSB2YWx1ZSBvZiAnJyB0aGF0IGlzIG5laXRoZXIgZHluYW1pYyBub3Igbm9uLW51bGxhYmxlLl93aXRoQXJndW1lbnRzVW5kZWZpbmVkR2V0dGVyVGhlIGdldHRlciAnJyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJ1RyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGdldHRlciwgb3IgZGVmaW5pbmcgYSBnZXR0ZXIgb3IgZmllbGQgbmFtZWQgJ193aXRoQXJndW1lbnRzVW5kZWZpbmVkTWV0aG9kVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbWV0aG9kLCBvciBkZWZpbmluZyBhIG1ldGhvZCBuYW1lZCAnX3dpdGhBcmd1bWVudHNVbmRlZmluZWRTZXR0ZXJUaGUgc2V0dGVyICdUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBzZXR0ZXIsIG9yIGRlZmluaW5nIGEgc2V0dGVyIG9yIGZpZWxkIG5hbWVkICdmcm9udF9lbmQuc3JjLmh5YnJpZF9maWxlX3N5c3RlbW1lbW9yeXBoeXNpY2FsX3BoeXNpY2FsSHlicmlkRmlsZVN5c3RlbUVudGl0eV9mc2VudGl0eWZhc3RhLnJlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keUVuc3VyZUxvYWRlZFJlZGlyZWN0aW5nRmFjdG9yeUJvZHlpbnRlcm5hbHVucmVzb2x2ZWR1bnJlc29sdmVkTmFtZWJvZHlFeHByZXNzaW9uZ2V0VmFsdWVyZXN0b3JlRnJvbURpbGxmYWN0b3J5ZW5jb2RlVHlwZUFyZ3VtZW50c3Zhck5hbWVQcmVmaXgjdHlwZUFyZ2RlY29kZVR5cGVBcmd1bWVudHNlbmNvZGVkaGVhZFJlZGlyZWN0aW9uVGFyZ2V0cmVkaXJlY3RpbmdOYW1lbGV0TmFtZWlzUmVkaXJlY3RpbmdGYWN0b3J5aGVscGVyaXNMb2FkZWRnZXRSZWRpcmVjdGluZ0ZhY3RvcnlCb2R5Z2V0UmVkaXJlY3Rpb25UYXJnZXR0b3J0b2lzZXRvcnRvaXNlQm9keWhhcmVoYXJlQm9keW5leHRUb3J0b2lzZW5leHRUeXBlQXJndW1lbnRzc3ViQ2xvbmVWaXNpdG9yV2l0aE1lbWJlcnNQcmludGVyQnl0ZVNpbmtrRGVidWdDbGFzc05hbWUjRGVidWdDbGFzc3ByaW50Q29tcG9uZW50VGV4dGxpYnJhcnlGaWx0ZXJ3cml0ZUNvbXBvbmVudFByb2JsZW1zd3JpdGVMaWJyYXJ5RmlsZXdyaXRlQ29tcG9uZW50VG9GaWxlZmlsdGVyOmV4Y2VwdGlvbjA6c3RhY2tfdHJhY2UwYnl0ZVNpbmtyZWFsTGlicmFyeWZha2VMaWJyYXJ5ZXZhbHVhdGVyZWFsQ2xhc3NmYWtlQ2xhc3N0eXBlU3Vic3RpdHV0aW9ubmV3Tm9kZWNsb25lcnZpc2l0VHlwZWNsb25lUHJvY2VkdXJld2luZG93c3BhcnNlVXJpZmlsZTp4LXJlc29sdmVBbWJpZ3VvdXNXaW5kb3dzUGF0aE5uYmRUb3BNZXJnZVZpc2l0b3JtZXJnZU51bGxhYmlsaXR5bm5iZFRvcE1lcmdlU3VwZXJ0eXBlbmV3VHlwZUFyZ3VtZW50c25ld1R5cGVBcmd1bWVudG5uYmRUb3BNZXJnZWtlcm5lbC50eXBlX2FsZ2VicmFUeXBlUGFyYW1ldGVyRmlsdGVyUEZyZXNoVHlwZVBhcmFtZXRlcnNmcmVzaFR5cGVQYXJhbWV0ZXJzc3Vic3RpdHV0ZXN1YnN0aXR1dGVOYW1lZHN1YnN0aXR1dGVTdXBlcmZyb21NYXBmaWx0ZXJlZGZyb21VcHBlckFuZExvd2VyQm91bmRzZnJvbVN1cGVydHlwZWZyb21JbnRlcmZhY2VUeXBlZnJvbVR5cGVkZWZUeXBlZnJvbVBhaXJzYm90dG9tRm9yQ2xhc3N1cHBlckJvdW5kRm9yQ2xhc3NnZXRTdWJzdGl0dXRldXBwZXJCb3VuZHZpc2l0X051bGxTdWJzdGl0dXRpb25TdWJzdGl0dXRpb24uZW1wdHlfTWFwU3Vic3RpdHV0aW9uX01hcFN1YnN0aXR1dGlvbihfVG9wU3Vic3RpdHV0b3JpbnZlcnRWYXJpYW5jZWxvb2t1cGZyZXNoVHlwZVBhcmFtZXRlckNyZWF0ZSBhIGZyZXNoIGVudmlyb25tZW50IGZpcnN0X0NsYXNzQm90dG9tU3Vic3RpdHV0aW9uX0NvbWJpbmVkU3Vic3RpdHV0aW9uX0ZpbHRlcmVkU3Vic3RpdHV0aW9uYmFzZWZpbHRlckZuX0lubmVyVHlwZVN1YnN0aXR1dG9yb3V0ZXJmcmVzaF9UeXBlU3Vic3RpdHV0b3Jjb3ZhcmlhbnRDb250ZXh0dXNlQ291bnRlcm5ld0lubmVyRW52aXJvbm1lbnRiZWZvcmVGdW5jdGlvbiB0eXBlIHZhcmlhYmxlcyBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgd2hpbGUgc3RpbGwgYXR0YWNoZWQgdG8gdGhlIGZ1bmN0aW9uLiBQZXJmb3JtIHN1YnN0aXR1dGlvbiBvbiBgRnVuY3Rpb25UeXBlLndpdGhvdXRUeXBlUGFyYW1ldGVyc2AgaW5zdGVhZC5pbm5lcmJ1bXBDb3VudGVyc1VudGlsX0RlZXBUeXBlU3Vic3RpdHV0b3Jpc0luZmluaXRlX1R5cGVVbmlmaWNhdGlvbnF1YW50aWZpZWRWYXJpYWJsZXNfdW5pdmVyc2FsbHlRdWFudGlmaWVkVmFyaWFibGVzc3VjY2Vzc191bmlmeV9zdWJzdGl0dXRlSGVhZG5leHRUeXBlVW5leHBlY3RlZCBjeWNsZSBmb3VuZCBkdXJpbmcgdW5pZmljYXRpb25fZmFpbGxlZnRJbnN0YW5jZXJpZ2h0SW5zdGFuY2VpbnN0YW50aWF0b3JpbnN0YW50aWF0b3JUeXBlbGVmdFJldHVybnJpZ2h0UmV0dXJuX3RyeVN1YnN0aXR1dGlvbmRlZXBTdWJzdGl0dXRlX09jY3VycmVuY2VWaXNpdG9yVW5zdXBwb3J0ZWQgdHlwZSBoYW5kbGVUeXBlUGFyYW1ldGVyX0ZyZWVGdW5jdGlvblR5cGVWYXJpYWJsZVZpc2l0b3JnZXRTdWJzdGl0dXRpb25NYXBnZXRVcHBlckJvdW5kU3Vic3RpdHV0aW9uTWFwc3Vic3RpdHV0ZURlZXBzdWJzdGl0dXRvcmNvbnRhaW5zRnJlZUZ1bmN0aW9uVHlwZVZhcmlhYmxlc3VuaWZ5VHlwZXN1bmlmaWVyZ2V0RnJlc2hUeXBlUGFyYW1ldGVyc2ZyZXNoUGFyYW1ldGVyc2NvbWJpbmVOdWxsYWJpbGl0aWVzRm9yU3Vic3RpdHV0aW9udW5pdGVOdWxsYWJpbGl0aWVzaW50ZXJzZWN0TnVsbGFiaWxpdGllc2NvbXB1dGVOdWxsYWJpbGl0eU9mRnV0dXJlT3JmdXR1cmVPcmFyZ3VtZW50TnVsbGFiaWxpdHljb21wdXRlTnVsbGFiaWxpdHlIZWFwX2l0ZW1zX3BhcmVudEluZGV4cmVtb3ZlZG9ycGhhbl9yZUluc2VydF9maXJzdENoaWxkSW5kZXhjaGlsZEluZGV4bmV4dENoaWxkX0xlZ2FjeUVyYXN1cmV2aXNpdE51bGxhYmlsaXR5Y3JlYXRlTmFtZWRUeXBlbmV3VHlwZWxlZ2FjeUVyYXN1cmVsZWdhY3lFcmFzdXJlU3VwZXJ0eXBlX05vcm1udWxsYWJpbGl0eUFzUHJvcGVydHlub3JtYWxpemVzVG9OZXZlcm5vcm1ub3JtU3VwZXJ0eXBlbm9ybVZpc2l0b3JrZXJuZWwuYXN0LnZpc2l0b3JFeHByZXNzaW9uVmlzaXRvck1lbWJlclZpc2l0b3JJbml0aWFsaXplclZpc2l0b3JUcmVlVmlzaXRvckRhcnRUeXBlVmlzaXRvckRhcnRUeXBlVmlzaXRvcjFDb25zdGFudFZpc2l0b3JfQ29uc3RhbnRDYWxsYmFja19Db25zdGFudENhbGxiYWNrVmlzaXRvcl9jYWxsYmFja0NvbXB1dGVPbmNlQ29uc3RhbnRWaXNpdG9yX3Zpc2l0b3JjYWNoZVZpc2l0T25jZUNvbnN0YW50VmlzaXRvck1lbWJlclJlZmVyZW5jZVZpc2l0b3JWaXNpdG9yUmVjdXJzaXZlVmlzaXRvclRyYW5zZm9ybWVyRXhwcmVzc2lvblZpc2l0b3IxU3RhdGVtZW50VmlzaXRvcjFCb2R5VmlzaXRvcjFrZXJuZWwuY2Fub25pY2FsX25hbWVfcGFyZW50X25vblJvb3RUb3BfY2hpbGRyZW5oYXNDaGlsZGdldENoaWxkRnJvbVF1YWxpZmllZE5hbWVnZXRDaGlsZEZyb21GaWVsZFdpdGhOYW1lQGZpZWxkc0B0eXBlZGVmc0Nhbm5vdCBhZGQgYSBjaGlsZCB0byAgYmVjYXVzZSB0aGlzIG5hbWUgYWxyZWFkeSBoYXMgYSBjaGlsZCBuYW1lZCByZW1vdmVDaGlsZCBpcyBhbHJlYWR5IGJvdW5kQ2Fubm90IGJpbmQgLCB0YXJnZXQgaXMgYWxyZWFkeSBib3VuZCB0byBjaGlsZHJlbl9nZXRSZWZlcmVuY2VnZXRNZW1iZXJRdWFsaWZpZXJAZ2V0dGVyc0BzZXR0ZXJzQGZhY3Rvcmllc0BtZXRob2RzQGNvbnN0cnVjdG9yc1VuZXhwZWN0ZWQgbWVtYmVyOiBrZXJuZWwudHJhbnNmb3JtYXRpb25zLmZsYWdzVHJhbnNmb3JtZXJGbGFnc3VwZXJDYWxsc3NlZW5CeVZlcmlmaWVya2VybmVsLmFzdF90b190ZXh0TmFtZXJnZXROYW1lTm9ybWFsTmFtZXJfQ29uc3RhbnROYW1lciZSZWN1cnNpdmVWaXNpdG9yJk5hbWVyQ29uc3RhbnROYW1lckRpc2FtYmlndWF0b3JVbmFtZXNUbmFtZXNVdXNlZE5hbWVzZGlzYW1iaWd1YXRla2V5MWtleTJwcm9wb3NlTmFtZWdldE5ld05hbWVwcm9wb3NlZE5hbWVDYW5ub3QgZGlzYW1iaWd1YXRlI3QjbSNjbGFzcyNleHRlbnNpb24jbGliI1RsYWJlbHMjTCNDcHJlZml4ZXNwYXRoU2VwYXJhdG9yW1wvXXB1bmN0dWF0aW9uWy46XW5hbWVWYXJpYWJsZW5hbWVNZW1iZXJuYW1lQ2xhc3NuYW1lRXh0ZW5zaW9ubmFtZUxpYnJhcnluYW1lVHlwZVBhcmFtZXRlcm5hbWVTd2l0Y2hDYXNlbmFtZUxhYmVsZWRTdGF0ZW1lbnRuYW1lQ29uc3RhbnRuYW1lTGlicmFyeVByZWZpeGFiYnJldmlhdGVOYW1laGFzRW1wdHlQYXRoLmRhcnRMbmFtZUNhbm9uaWNhbE5hbWVBc0xpYnJhcnlQcmVmaXhzbGFzaGxhc3RJbmRleE9mZG90QW5ub3RhdG9yYW5ub3RhdGVWYXJpYWJsZWFubm90YXRlUmV0dXJuYW5ub3RhdGVGaWVsZHN5bnRoZXRpY05hbWVzYW5ub3RhdG9yaW1wb3J0VGFibGVpbmRlbnRhdGlvbnNob3dPZmZzZXRzc2hvd01ldGFkYXRhU1BBQ0VXT1JEU1lNQk9Mc3RhdGVlbXB0eU5hbWVTdHJpbmfigKJlbXB0eU5hbWVjcmVhdGVJbm5lcnNob3VsZEhpZ2hsaWdodHN0YXJ0SGlnaGxpZ2h0ZW5kSGlnaGxpZ2h0Z2V0TGlicmFyeU5hbWVnZXRMaWJyYXJ5UmVmZXJlbmNlPE5vIExpYnJhcnk+Z2V0SW1wb3J0SW5kZXhnZXRDbGFzc05hbWVnZXRFeHRlbnNpb25OYW1lPE5vIENsYXNzPmdldFR5cGVkZWZSZWZlcmVuY2U8Tm8gVHlwZWRlZj5nZXRNZW1iZXJOYW1lPE5vIE1lbWJlcj5nZXRWYXJpYWJsZU5hbWVnZXRWYXJpYWJsZVJlZmVyZW5jZTxObyBWYXJpYWJsZURlY2xhcmF0aW9uPmdldFR5cGVQYXJhbWV0ZXJOYW1lZ2V0VHlwZVBhcmFtZXRlclJlZmVyZW5jZTxObyBUeXBlUGFyYW1ldGVyPndyaXRlUHJvYmxlbXNBc0pzb25Qcm9ibGVtcyBpbiBjb21wb25lbnRoZWFkZXJlbmRMaW5lLy8vLyBkZWNvZGVkdHJpbW1lZHRyaW1SaWdodHdyaXRlV29yZC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovO2ltcG9ydHN3cml0ZVN0YW5kYXJkTGlicmFyeUNvbnRlbnRvdXRlclByaW50ZXJpbXBvcnRzVG9QcmludHByaW50TGlicmFyeUltcG9ydFRhYmxlaW1wb3J0ZWRMaWJyYXJpZXNpbXBvcnRQYXRoZ2V0SW1wb3J0UGF0aHNlbGZpbXBvcnQgc2VsZiBhcyBpbXBvcnQgIiIgYXMgUHJvYmxlbXMgaW4gbGlicmFyeWFkZGl0aW9uYWxFeHBvcnRzID0gKG5vZGVMaWJyYXJ5ICB3cml0ZVNwYWNlZHdyaXRlTWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZXdyaXRlTWV0YWRhdGFhc2NvbnN0YW50cyBnZXRQcmVjZWRlbmNld3JpdGVTcGFjZWVuc3VyZVNwYWNld3JpdGVTeW1ib2x3cml0ZUNvbW1hZW5zdXJlV29yZEJvdW5kYXJ5d3JpdGVJbmRlbnRhdGlvbjxOdWxsPmhpZ2hsaWdodG5vZGVNZXRhZGF0YVtAd3JpdGVBbm5vdGF0ZWRUeXBld3JpdGVUeXBlPE5vIERhcnRUeXBlPndyaXRlT3B0aW9uYWxUeXBlPE5vIFN1cGVydHlwZT53cml0ZUNsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZXdyaXRlVHlwZWRlZlJlZmVyZW5jZXdyaXRlTW9kaWZpZXJpc1RoZXJlPGFub255bW91cz53cml0ZUZ1bmN0aW9udGVybWluYXRlTGluZXdyaXRlVHlwZVBhcmFtZXRlckxpc3R3cml0ZVBhcmFtZXRlckxpc3R3cml0ZVJldHVyblR5cGVnZXRBc3luY01hcmtlcktleXdvcmQvKiBvcmlnaW5hbGx5Ki93cml0ZUZ1bmN0aW9uQm9keW1hcmtlcnN5bmNzeW5jKmFzeW5jYXN5bmMqeWllbGRpbmc8SW52YWxpZCBhc3luYyBtYXJrZXI6IHt9ez0+d3JpdGVFeHByZXNzaW9ud3JpdGVCb2R5d3JpdGVGdW5jdGlvblR5cGV0eXBlZGVmUG9zaXRpb25hbHR5cGVkZWZOYW1lZHBhcmFtZXRlcnNBbm5vdGF0ZWRmb3JtYWxza2lw4oaSd3JpdGVOdWxsYWJpbGl0eXNlcGFyYXRvcmdldENsYXNzUmVmZXJlbmNlRnJvbVJlZmVyZW5jZWdldENhbm9uaWNhbE5hbWVTdHJpbmdOZWl0aGVyIG5vZGUgbm9yIGNhbm9uaWNhbCBuYW1lIGZvdW5kZ2V0TWVtYmVyUmVmZXJlbmNlRnJvbVJlZmVyZW5jZXVuZXhwZWN0ZWQgcm9vdHVuZXhwZWN0ZWQgQGxpYnJhcnlTdHJpbmdjbGFzc1N0cmluZ2F0Tm9kZXdyaXRlVmFyaWFibGVSZWZlcmVuY2V3cml0ZVR5cGVQYXJhbWV0ZXJSZWZlcmVuY2VtaW5pbXVtUHJlY2VkZW5jZW5lZWRzUGFyZW50ZXNlc3NlcGFyYXRlTGluZXNsYXRlc3RhdGljZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbGZpbmFsY29uc3RbZ2V0dGVyXVtzZXR0ZXJdW25vLWdldHRlcl1bbm8tc2V0dGVyXWZlYXR1cmVzaXNOdWxsYWJsZUJ5RGVmYXVsdC8qZXh0ZXJuYWxhYnN0cmFjdGZvcndhcmRpbmctc3R1YmZvcndhcmRpbmctc2VtaS1zdHVibWVtYmVyLXNpZ25hdHVyZW5vLXN1Y2gtbWV0aG9kLWZvcndhcmRlcnN5bnRoZXRpY3JlZGlyZWN0aW5nX2ZhY3RvcnljbGFzc3dpdGhleHRlbmRzaW1wbGVtZW50c2VuZExpbmVTdHJpbmcgLy8gZnJvbSBvbm1ldGhvZHRlYXJvZmZpbnZhbGlkLWV4cHJlc3Npb25lc2NhcGVTdHJpbmd3cml0ZUludGVyZmFjZVRhcmdldC57PXN1cGVybmV3IXByZWNlZGVuY2U/PyE9d3JpdGVTdGF0aWNUeXBlZ2V0RXNjYXBlZENoYXJhY3Rlclx0XG5cdlxmXHJcIlwkXHUwY2hhcmFjdGVyJHthc3NlcnRfYXNzZXJ0KHVudXNlZEFyZ3VtZW50aXN7Rm9yTm9uTnVsbGFibGVCeURlZmF1bHR9aXNUeXBlRXJyb3JDb3ZhcmlhbmNlQ2hlY2tGb3JEeW5hbWljRm9yTm9uTnVsbGFibGVCeURlZmF1bHRhc3t0aGlzcmV0aHJvd3Rocm93YXdhaXRudWxsbGV0YmxvY2t3cml0ZUJsb2NrQm9keSA9PmRlZmVycmVkYXNzZXJ0KTticmVha3doaWxlZG9mb3J1c2VWYXJLZXl3b3Jkc3dpdGNoKSB7Y2FzZWRlZmF1bHRjb250aW51ZWlmZWxzZXJldHVybnRyeWNhdGNobm8tZXhjZXB0aW9uLXZhcmZpbmFsbHl5aWVsZCpbeWllbGRdeWllbGQuLi47cmVxdWlyZWR2YXJhbGxBcmdzaW52YWxpZC1pbml0aWFsaXplcmluQ29tbWVudHdyaXRlRGFydFR5cGVOdWxsYWJpbGl0eWludmFsaWQtdHlwZWR5bmFtaWN2b2lkTmV2ZXIvKiAnJyAmICcnID0gJycgKi8+Wz57cGFydGlhbC1pbnN0YW50aWF0aW9uZXZhbFByZWNlZGVuY2VFWFBSRVNTSU9OQ09ORElUSU9OQUxMT0dJQ0FMX05VTExfQVdBUkVMT0dJQ0FMX09STE9HSUNBTF9BTkRFUVVBTElUWVJFTEFUSU9OQUxCSVRXSVNFX09SQklUV0lTRV9YT1JCSVRXSVNFX0FORFNISUZUQURESVRJVkVNVUxUSVBMSUNBVElWRVBSRUZJWFBPU1RGSVhUWVBFX0xJVEVSQUxQUklNQVJZQ0FMTEVFYmluYXJ5UHJlY2VkZW5jZW9maXNBc3NvY2lhdGl2ZUJpbmFyeU9wZXJhdG9yZGVidWdMaWJyYXJ5TmFtZWRlYnVnQ2xhc3NOYW1lZGVidWdRdWFsaWZpZWRDbGFzc05hbWVkZWJ1Z01lbWJlck5hbWVkZWJ1Z1F1YWxpZmllZE1lbWJlck5hbWVkZWJ1Z1R5cGVQYXJhbWV0ZXJOYW1lZGVidWdRdWFsaWZpZWRUeXBlUGFyYW1ldGVyTmFtZWRlYnVnVmFyaWFibGVEZWNsYXJhdGlvbk5hbWVkZWJ1Z05vZGVUb1N0cmluZ2NvbXBvbmVudFRvU3RyaW5ncHJvY2VkdXJlS2luZFRvU3RyaW5naWxsZWdhbCBQcm9jZWR1cmVLaW5kOiBrZXJuZWwudHlwZV9lbnZpcm9ubWVudEhpZXJhcmNoeUJhc2VkVHlwZUVudmlyb25tZW50RXJyb3JIYW5kbGVyZXJyb3JIYW5kbGVyZnJvbVN1YmNsYXNzZWxlbWVudFR5cGVpdGVyYWJsZVR5cGVzdHJlYW1UeXBlZnV0dXJlQXJndW1lbnRzZm9ySW5FbGVtZW50VHlwZUlzU3VidHlwZU9mX3ZhbHVlTmV2ZXJfdmFsdWVPbmx5SWZJZ25vcmluZ051bGxhYmlsaXRpZXNfdmFsdWVBbHdheXNfYWxsYWx3YXlzb25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzbmV2ZXJfYW5kVmFsdWVzX29yVmFsdWVzYmFzZWRTb2xlbHlPbk51bGxhYmlsaXRpZXNhbmRhbmRTdWJ0eXBlQ2hlY2tGb3J0ZXN0ZXJwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZVN1YnR5cGVDaGVja29yb3JTdWJ0eXBlQ2hlY2tGb3Jpc1N1YnR5cGVXaGVuSWdub3JpbmdOdWxsYWJpbGl0aWVzaXNTdWJ0eXBlV2hlblVzaW5nTnVsbGFiaWxpdGllc0lzU3VidHlwZU9mLmFsd2F5c0lzU3VidHlwZU9mLm5ldmVySXNTdWJ0eXBlT2Yub25seUlmSWdub3JpbmdOdWxsYWJpbGl0aWVzSXNTdWJ0eXBlT2YuPHVua25vd24gdmFsdWUgJyc+U3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllc3dpdGhOdWxsYWJpbGl0aWVzaWdub3JpbmdOdWxsYWJpbGl0aWVzU3VidHlwZVRlc3RlcnR5cGVDaGVja3NfY29sbGVjdF9pc1N1YnR5cGVPZm1vZGVVbmhhbmRsZWQgc3VidHlwZSBjaGVja2luZyBtb2RlICdzdXBlcnR5cGVOdWxsYWJpbGl0eXN1YnR5cGVBcmdzdXBlcnR5cGVBcmd1bml0ZWROdWxsYWJpbGl0eXN1cGVydHlwZUZ1dHVyZXN1cGVydHlwZUNsYXNzbGVmdFR5cGVyaWdodFR5cGVwZXJmb3JtTnVsbGFiaWxpdHlBd2FyZU11dHVhbFN1YnR5cGVzQ2hlY2tfcGVyZm9ybU51bGxhYmlsaXR5QXdhcmVGdW5jdGlvblN1YnR5cGVDaGVja3N1YlBhcmFtZXRlcnN1cGVyUGFyYW1ldGVyc3ViQm91bmRzdXBlcnR5cGVQYXJhbWV0ZXJzdWJ0eXBlUGFyYW1ldGVyc3VidHlwZU5hbWVJbmRleF9saWJyYXJ5Zm9yQW5ub3RhdGlvbnNzdGFja2VkZmxhdF9GbGF0U3RhdGVmdWxTdGF0aWNUeXBlQ29udGV4dF9jdXJyZW50TWVtYmVyTm8gbGlicmFyeSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIFN0YXRpY1R5cGVDb250ZXh0Lk5vIG1lbWJlciBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIFN0YXRpY1R5cGVDb250ZXh0LkFscmVhZHkgaW4gY29udGV4dCBvZiBJbmNvbnNpc3RlbnQgc3RhdGljIHR5cGUgY29udGV4dCBzdGFjazogVHJ5aW5nIHRvIGxlYXZlICBidXQgY3VycmVudCBpcyBfU3RhY2tlZFN0YXRlZnVsU3RhdGljVHlwZUNvbnRleHRfY29udGV4dFN0YWNrTm8gdGhpcyB0eXBlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggU3RhdGljVHlwZUNvbnRleHQuX3RoaXNUeXBlX1N0YXRpY1R5cGVDb250ZXh0U3RhdGVBc3N1bXB0aW9uc19hc3N1bXB0aW9uTWFwX2FkZEFzc3VtcHRpb25fcmVtb3ZlQXNzdW1wdGlvbmFzc3VtcHRpb25Bc3N1bXB0aW9ucyhjb21tYSktPmtlcm5lbC5iaW5hcnkudGFnVGFnTm90aGluZ1NvbWV0aGluZ0NvbnN0U3RhdGljSW52b2NhdGlvbkNvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9uVHJ1ZUxpdGVyYWxGYWxzZUxpdGVyYWxQb3NpdGl2ZUludExpdGVyYWxOZWdhdGl2ZUludExpdGVyYWxCaWdJbnRMaXRlcmFsQ29uc3RMaXN0TGl0ZXJhbENvbnN0TWFwTGl0ZXJhbENvbnN0U2V0TGl0ZXJhbEFzeW5jRm9ySW5TdGF0ZW1lbnRTaW1wbGVJbnRlcmZhY2VUeXBlU2ltcGxlRnVuY3Rpb25UeXBlU3BlY2lhbGl6ZWRUYWdIaWdoQml0U3BlY2lhbGl6ZWRUYWdNYXNrU3BlY2lhbGl6ZWRQYXlsb2FkTWFza1NwZWNpYWxpemVkVmFyaWFibGVHZXRTcGVjaWFsaXplZFZhcmlhYmxlU2V0U3BlY2lhbGl6ZWRJbnRMaXRlcmFsU3BlY2lhbGl6ZWRJbnRMaXRlcmFsQmlhc0NvbXBvbmVudEZpbGVCaW5hcnlGb3JtYXRWZXJzaW9uQ29uc3RhbnRUYWdrZXJuZWwubGlicmFyeV9pbmRleGdldHRlclByZWZpeHNldHRlclByZWZpeHRvcExldmVsX2xpYnJhcmllc2xpYnJhcnlVcmlzbGlicmFyeVVyaVNldGJ5VXJpY29yZUxpYnJhcmllc2FsbF9nZXRMaWJyYXJ5SW5kZXhUaGUgbGlicmFyeSAnJyBoYXMgbm90IGJlZW4gaW5kZXhlZGNvbnRhaW5zTGlicmFyeW1lbWJlck5hbWV0cnlHZXRUb3BMZXZlbE1lbWJlcl9DbGFzc1RhYmxlY29udGFpbmVyTmFtZWxpYnJhcnkgJ19nZXRDbGFzc0luZGV4Q2xhc3MgJycgbm90IGZvdW5kIGluIF9NZW1iZXJUYWJsZV9tZW1iZXJzZ2V0RGlzYW1iaWd1YXRlZE5hbWV0b3AtbGV2ZWwgb2YgY2xhc3MgJycgaW4gQSBtZW1iZXIgd2l0aCBkaXNhbWJpZ3VhdGVkIG5hbWUgJycgd2FzIG5vdCBmb3VuZCBpbiBnZXR0ZXIuIERpZCB5b3UgbWVhbiAnJyBvciAnJz9SZWZlcmVuY2VGcm9tSW5kZXhfaW5kZXhlZExpYnJhcmllc2FkZEluZGV4ZWRMaWJyYXJ5aW5kZXhlZExpYnJhcnlsb29rdXBMaWJyYXJ5SW5kZXhlZExpYnJhcnlfdHlwZWRlZnNfaW5kZXhlZENsYXNzZXNfZXh0ZW5zaW9uc19wcm9jZWR1cmVzTm90U2V0dGVyc19wcm9jZWR1cmVzU2V0dGVyc19maWVsZHNsb29rdXBUeXBlZGVmbG9va3VwQ2xhc3Nsb29rdXBJbmRleGVkQ2xhc3Nsb29rdXBFeHRlbnNpb25sb29rdXBQcm9jZWR1cmVOb3RTZXR0ZXJsb29rdXBQcm9jZWR1cmVTZXR0ZXJsb29rdXBGaWVsZEluZGV4ZWRDbGFzc19jb25zdHJ1Y3RvcnNsb29rdXBDb25zdHJ1Y3RvckNoYW5nZWRTdHJ1Y3R1cmVOb3RpZmllcmZvckNsYXNza2VybmVsLmV4dGVybmFsX25hbWVfZ2V0RXh0ZXJuYWxOYW1lVmFsdWVfaXNFeHRlcm5hbE5hbWVFeHRlcm5hbE5hbWV2bS5ieXRlY29kZS5hc3NlbWJsZXJFeGNlcHRpb25zVGFibGVMYWJlbF9qdW1wc2p1bXBPcGVyYW5kanVtcE9mZnNldEJhY2t3YXJkIGp1bXAgdG8gdGhpcyBsYWJlbCBpcyBub3QgYWxsb3dlZGp1bXBzQnl0ZWNvZGVBc3NlbWJsZXJrQnl0ZU1hc2trVWludDMyTWFza2tNaW5JbnQ4a01heEludDhrTWluSW50MjRrTWF4SW50MjRrTWluSW50MzItMjE0NzQ4MzY0OGtNYXhJbnQzMjIxNDc0ODM2NDdrSW5pdGlhbENhcGFjaXR5X2xlbmd0aF9lbWl0U291cmNlUG9zaXRpb25zX3BhdGNoSnVtcGVtaXRTb3VyY2VQb3NpdGlvbmVtaXRTb3VyY2VQb3NpdGlvbkZvckNhbGxhZGRZaWVsZFBvaW50bmV3U2l6ZW5ld0J1ZmZlcl9ncm93QW5kRW1pdEJ5dGVzYjBiMWIyYjNiNGI1X2VtaXRCeXRlYWJ5dGVfaXNVaW50OF9lbWl0Qnl0ZXMyX2VtaXRCeXRlczNfZW1pdEJ5dGVzNF9lbWl0Qnl0ZXM1X2VtaXRCeXRlczZfYnl0ZUF0X3NldEJ5dGVBdF9ieXRlMF9ieXRlMV9ieXRlMl9ieXRlM19pc0ludDhfaXNJbnQyNF9pc0ludDMyX2lzVWludDMyX2VtaXRJbnN0cnVjdGlvbjBfZW1pdEluc3RydWN0aW9uQXJhX2VtaXRJbnN0cnVjdGlvbkRyZF9lbWl0SW5zdHJ1Y3Rpb25YcnhfZW1pdEluc3RydWN0aW9uQUVyZV9lbWl0SW5zdHJ1Y3Rpb25BWXJ5X2VtaXRJbnN0cnVjdGlvbkRGcmZfZW1pdEluc3RydWN0aW9uQUJDcmJyY09wY29kZS5rVHJhcEVuY29kaW5nLmswT3BlcmFuZC5ub25lT3Bjb2RlLmtFbnRyeUVuY29kaW5nLmtET3BlcmFuZC5pbW1PcGNvZGUua0VudHJ5Rml4ZWRFbmNvZGluZy5rQUVPcGNvZGUua0VudHJ5T3B0aW9uYWxFbmNvZGluZy5rQUJDT3Bjb2RlLmtMb2FkQ29uc3RhbnRPcGVyYW5kLnJlZ09wZXJhbmQubGl0T3Bjb2RlLmtGcmFtZU9wY29kZS5rQ2hlY2tGdW5jdGlvblR5cGVBcmdzT3Bjb2RlLmtDaGVja1N0YWNrRW5jb2Rpbmcua0FPcGNvZGUua0RlYnVnQ2hlY2tPcGNvZGUua0FsbG9jYXRlT3Bjb2RlLmtBbGxvY2F0ZVRPcGNvZGUua0NyZWF0ZUFycmF5VE9TT3Bjb2RlLmtBbGxvY2F0ZUNvbnRleHRPcGNvZGUua0Nsb25lQ29udGV4dE9wY29kZS5rTG9hZENvbnRleHRQYXJlbnRPcGNvZGUua1N0b3JlQ29udGV4dFBhcmVudE9wY29kZS5rTG9hZENvbnRleHRWYXJPcGNvZGUua1N0b3JlQ29udGV4dFZhck9wY29kZS5rUHVzaENvbnN0YW50T3Bjb2RlLmtQdXNoTnVsbE9wY29kZS5rUHVzaFRydWVPcGNvZGUua1B1c2hGYWxzZU9wY29kZS5rUHVzaEludEVuY29kaW5nLmtYT3Bjb2RlLmtEcm9wMU9wY29kZS5rUHVzaE9wZXJhbmQueGVnT3Bjb2RlLmtQb3BMb2NhbE9wY29kZS5rU3RvcmVMb2NhbE9wY29kZS5rTG9hZEZpZWxkVE9TT3Bjb2RlLmtTdG9yZUZpZWxkVE9TT3Bjb2RlLmtTdG9yZUluZGV4ZWRUT1NPcGNvZGUua0luaXRMYXRlRmllbGRPcGNvZGUua1B1c2hVbmluaXRpYWxpemVkU2VudGluZWxPcGNvZGUua0p1bXBJZkluaXRpYWxpemVkRW5jb2Rpbmcua1RPcGVyYW5kLnRndE9wY29kZS5rTG9hZFN0YXRpY09wY29kZS5rU3RvcmVTdGF0aWNUT1NPcGNvZGUua0p1bXBPcGNvZGUua0p1bXBJZk5vQXNzZXJ0c09wY29kZS5rSnVtcElmTm90WmVyb1R5cGVBcmdzT3Bjb2RlLmtKdW1wSWZFcVN0cmljdE9wY29kZS5rSnVtcElmTmVTdHJpY3RPcGNvZGUua0p1bXBJZlRydWVPcGNvZGUua0p1bXBJZkZhbHNlT3Bjb2RlLmtKdW1wSWZOdWxsT3Bjb2RlLmtKdW1wSWZOb3ROdWxsT3Bjb2RlLmtKdW1wSWZVbmNoZWNrZWRPcGNvZGUua0ludGVyZmFjZUNhbGxFbmNvZGluZy5rREZPcGNvZGUua0luc3RhbnRpYXRlZEludGVyZmFjZUNhbGxPcGNvZGUua0R5bmFtaWNDYWxsT3Bjb2RlLmtOYXRpdmVDYWxsT3Bjb2RlLmtSZXR1cm5UT1NPcGNvZGUua0Fzc2VydEFzc2lnbmFibGVPcGNvZGUua0Fzc2VydEJvb2xlYW5PcGNvZGUua0Fzc2VydFN1YnR5cGVPcGNvZGUua0xvYWRUeXBlQXJndW1lbnRzRmllbGRPcGNvZGUua0luc3RhbnRpYXRlVHlwZU9wY29kZS5rSW5zdGFudGlhdGVUeXBlQXJndW1lbnRzVE9TT3Bjb2RlLmtUaHJvd09wY29kZS5rTW92ZVNwZWNpYWxFbmNvZGluZy5rQVlPcGVyYW5kLnNwZU9wY29kZS5rU2V0RnJhbWVPcGNvZGUua0Jvb2xlYW5OZWdhdGVUT1NPcGNvZGUua051bGxDaGVja09wY29kZS5rRGlyZWN0Q2FsbE9wY29kZS5rVW5jaGVja2VkRGlyZWN0Q2FsbE9wY29kZS5rQWxsb2NhdGVDbG9zdXJlT3Bjb2RlLmtVbmNoZWNrZWRDbG9zdXJlQ2FsbE9wY29kZS5rVW5jaGVja2VkSW50ZXJmYWNlQ2FsbGVuY29kaW5nX2VtaXRKdW1wSW5zdHJ1Y3Rpb25ydE9wY29kZS5rVW51c2VkT3Bjb2RlMDAwT3Bjb2RlLmtVbnVzZWRPcGNvZGUwMDFPcGNvZGUua1VudXNlZE9wY29kZTAwMk9wY29kZS5rVW51c2VkT3Bjb2RlMDAzT3Bjb2RlLmtVbnVzZWRPcGNvZGUwMDRPcGNvZGUua1VudXNlZE9wY29kZTAwNU9wY29kZS5rVW51c2VkT3Bjb2RlMDA2T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMDdPcGNvZGUua1VudXNlZE9wY29kZTAwOE9wY29kZS5rVW51c2VkT3Bjb2RlMDA5T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMTBPcGNvZGUua1VudXNlZE9wY29kZTAxMU9wY29kZS5rVW51c2VkT3Bjb2RlMDEyT3Bjb2RlLmtVbnVzZWRPcGNvZGUwMTNPcGNvZGUua1VudXNlZE9wY29kZTAxNE9wY29kZS5rVW51c2VkT3Bjb2RlMDE1T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMTZPcGNvZGUua1VudXNlZE9wY29kZTAxN09wY29kZS5rVW51c2VkT3Bjb2RlMDE4T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMTlPcGNvZGUua1VudXNlZE9wY29kZTAyME9wY29kZS5rVW51c2VkT3Bjb2RlMDIxT3Bjb2RlLmtVbnVzZWRPcGNvZGUwMjJPcGNvZGUua1VudXNlZE9wY29kZTAyM09wY29kZS5rVW51c2VkT3Bjb2RlMDI0T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMjVPcGNvZGUua1VudXNlZE9wY29kZTAyNk9wY29kZS5rVW51c2VkT3Bjb2RlMDI3T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMjhPcGNvZGUua1VudXNlZE9wY29kZTAyOU9wY29kZS5rVW51c2VkT3Bjb2RlMDMwT3Bjb2RlLmtVbnVzZWRPcGNvZGUwMzFPcGNvZGUua1VudXNlZE9wY29kZTAzMk9wY29kZS5rVW51c2VkT3Bjb2RlMDMzT3Bjb2RlLmtVbnVzZWRPcGNvZGUwMzRPcGNvZGUua1VudXNlZE9wY29kZTAzNU9wY29kZS5rVW51c2VkT3Bjb2RlMDM2T3Bjb2RlLmtVbnVzZWRPcGNvZGUwMzdPcGNvZGUua1VudXNlZE9wY29kZTAzOE9wY29kZS5rVW51c2VkT3Bjb2RlMDM5T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNDBPcGNvZGUua1VudXNlZE9wY29kZTA0MU9wY29kZS5rVW51c2VkT3Bjb2RlMDQyT3Bjb2RlLmtVbnVzZWRPcGNvZGUwNDNPcGNvZGUua1VudXNlZE9wY29kZTA0NE9wY29kZS5rVW51c2VkT3Bjb2RlMDQ1T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNDZPcGNvZGUua1VudXNlZE9wY29kZTA0N09wY29kZS5rVW51c2VkT3Bjb2RlMDQ4T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNDlPcGNvZGUua1VudXNlZE9wY29kZTA1ME9wY29kZS5rVW51c2VkT3Bjb2RlMDUxT3Bjb2RlLmtVbnVzZWRPcGNvZGUwNTJPcGNvZGUua1VudXNlZE9wY29kZTA1M09wY29kZS5rVW51c2VkT3Bjb2RlMDU0T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNTVPcGNvZGUua1VudXNlZE9wY29kZTA1Nk9wY29kZS5rVW51c2VkT3Bjb2RlMDU3T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNThPcGNvZGUua1VudXNlZE9wY29kZTA1OU9wY29kZS5rVW51c2VkT3Bjb2RlMDYwT3Bjb2RlLmtVbnVzZWRPcGNvZGUwNjFPcGNvZGUua1VudXNlZE9wY29kZTA2Mk9wY29kZS5rVW51c2VkT3Bjb2RlMDYzT3Bjb2RlLmtVbnVzZWRPcGNvZGUwNjRPcGNvZGUua1VudXNlZE9wY29kZTA2NU9wY29kZS5rVW51c2VkT3Bjb2RlMDY2T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNjdPcGNvZGUua1VudXNlZE9wY29kZTA2OE9wY29kZS5rVW51c2VkT3Bjb2RlMDY5T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNzBPcGNvZGUua1VudXNlZE9wY29kZTA3MU9wY29kZS5rVW51c2VkT3Bjb2RlMDcyT3Bjb2RlLmtVbnVzZWRPcGNvZGUwNzNPcGNvZGUua1VudXNlZE9wY29kZTA3NE9wY29kZS5rVW51c2VkT3Bjb2RlMDc1T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNzZPcGNvZGUua1VudXNlZE9wY29kZTA3N09wY29kZS5rVW51c2VkT3Bjb2RlMDc4T3Bjb2RlLmtVbnVzZWRPcGNvZGUwNzlPcGNvZGUua1VudXNlZE9wY29kZTA4ME9wY29kZS5rVW51c2VkT3Bjb2RlMDgxT3Bjb2RlLmtKdW1wSWZJbml0aWFsaXplZF9XaWRlT3Bjb2RlLmtFbnRyeV9XaWRlT3Bjb2RlLmtFbnRyeUZpeGVkX1dpZGVPcGNvZGUua1VudXNlZDAwT3Bjb2RlLmtMb2FkQ29uc3RhbnRfV2lkZU9wY29kZS5rRnJhbWVfV2lkZU9wY29kZS5rQ2hlY2tGdW5jdGlvblR5cGVBcmdzX1dpZGVPcGNvZGUua0p1bXBJZlVuY2hlY2tlZF9XaWRlT3Bjb2RlLmtBbGxvY2F0ZV9XaWRlT3Bjb2RlLmtBbGxvY2F0ZUNsb3N1cmVfV2lkZU9wY29kZS5rQWxsb2NhdGVDb250ZXh0X1dpZGVPcGNvZGUua0Nsb25lQ29udGV4dF9XaWRlT3Bjb2RlLmtMb2FkQ29udGV4dFZhcl9XaWRlT3Bjb2RlLmtVbnVzZWQwNE9wY29kZS5rVW51c2VkMDVPcGNvZGUua1N0b3JlQ29udGV4dFZhcl9XaWRlT3Bjb2RlLmtQdXNoQ29uc3RhbnRfV2lkZU9wY29kZS5rVW51c2VkMDZPcGNvZGUua1VudXNlZDA3T3Bjb2RlLmtQdXNoSW50X1dpZGVPcGNvZGUua1VudXNlZDA4T3Bjb2RlLmtVbnVzZWQwOU9wY29kZS5rVW51c2VkMTBPcGNvZGUua1VudXNlZDExT3Bjb2RlLmtQdXNoX1dpZGVPcGNvZGUua1VudXNlZDEyT3Bjb2RlLmtVbnVzZWQxM09wY29kZS5rVW51c2VkMTRPcGNvZGUua1VudXNlZDE1T3Bjb2RlLmtVbnVzZWQxNk9wY29kZS5rVW51c2VkMTdPcGNvZGUua1BvcExvY2FsX1dpZGVPcGNvZGUua0xvYWRTdGF0aWNfV2lkZU9wY29kZS5rU3RvcmVMb2NhbF9XaWRlT3Bjb2RlLmtMb2FkRmllbGRUT1NfV2lkZU9wY29kZS5rU3RvcmVGaWVsZFRPU19XaWRlT3Bjb2RlLmtVbnVzZWQyME9wY29kZS5rSW5pdExhdGVGaWVsZF9XaWRlT3Bjb2RlLmtTdG9yZVN0YXRpY1RPU19XaWRlT3Bjb2RlLmtKdW1wX1dpZGVPcGNvZGUua0p1bXBJZk5vQXNzZXJ0c19XaWRlT3Bjb2RlLmtKdW1wSWZOb3RaZXJvVHlwZUFyZ3NfV2lkZU9wY29kZS5rSnVtcElmRXFTdHJpY3RfV2lkZU9wY29kZS5rSnVtcElmTmVTdHJpY3RfV2lkZU9wY29kZS5rSnVtcElmVHJ1ZV9XaWRlT3Bjb2RlLmtKdW1wSWZGYWxzZV9XaWRlT3Bjb2RlLmtKdW1wSWZOdWxsX1dpZGVPcGNvZGUua0p1bXBJZk5vdE51bGxfV2lkZU9wY29kZS5rRGlyZWN0Q2FsbF9XaWRlT3Bjb2RlLmtVbmNoZWNrZWREaXJlY3RDYWxsX1dpZGVPcGNvZGUua0ludGVyZmFjZUNhbGxfV2lkZU9wY29kZS5rVW51c2VkMjNPcGNvZGUua1VudXNlZDI0T3Bjb2RlLmtJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsX1dpZGVPcGNvZGUua1VuY2hlY2tlZENsb3N1cmVDYWxsX1dpZGVPcGNvZGUua1VuY2hlY2tlZEludGVyZmFjZUNhbGxfV2lkZU9wY29kZS5rRHluYW1pY0NhbGxfV2lkZU9wY29kZS5rTmF0aXZlQ2FsbF9XaWRlT3Bjb2RlLmtVbnVzZWQyOU9wY29kZS5rQXNzZXJ0QXNzaWduYWJsZV9XaWRlT3Bjb2RlLmtVbnVzZWQzME9wY29kZS5rVW51c2VkMzFPcGNvZGUua0xvYWRUeXBlQXJndW1lbnRzRmllbGRfV2lkZU9wY29kZS5rSW5zdGFudGlhdGVUeXBlX1dpZGVPcGNvZGUua0luc3RhbnRpYXRlVHlwZUFyZ3VtZW50c1RPU19XaWRlT3Bjb2RlLmtVbnVzZWQzMk9wY29kZS5rVW51c2VkMzNPcGNvZGUua1VudXNlZDM0T3Bjb2RlLmtVbnVzZWQzNU9wY29kZS5rTW92ZVNwZWNpYWxfV2lkZU9wY29kZS5rTnVsbENoZWNrX1dpZGV2bS5ieXRlY29kZS5jb25zdGFudF9wb29sY29uc3RhbnRQb29sSW5kZXhMaW1pdEJ5dGVjb2RlTGltaXRFeGNlZWRlZEV4Y2VwdGlvbkNvbnN0YW50VGFnLmtJbnZhbGlkQ29uc3RhbnRUYWcua1VudXNlZDFDb25zdGFudFRhZy5rVW51c2VkMkNvbnN0YW50VGFnLmtVbnVzZWQzQ29uc3RhbnRUYWcua1VudXNlZDRDb25zdGFudFRhZy5rVW51c2VkNUNvbnN0YW50VGFnLmtVbnVzZWQ2Q29uc3RhbnRUYWcua1VudXNlZDZhQ29uc3RhbnRUYWcua1VudXNlZDdDb25zdGFudFRhZy5rU3RhdGljRmllbGRDb25zdGFudFRhZy5rSW5zdGFuY2VGaWVsZENvbnN0YW50VGFnLmtDbGFzc0NvbnN0YW50VGFnLmtUeXBlQXJndW1lbnRzRmllbGRDb25zdGFudFRhZy5rVW51c2VkOENvbnN0YW50VGFnLmtUeXBlQ29uc3RhbnRUYWcua1VudXNlZDlDb25zdGFudFRhZy5rVW51c2VkMTBDb25zdGFudFRhZy5rVW51c2VkMTFDb25zdGFudFRhZy5rVW51c2VkMTJDb25zdGFudFRhZy5rQ2xvc3VyZUZ1bmN0aW9uQ29uc3RhbnRUYWcua0VuZENsb3N1cmVGdW5jdGlvblNjb3BlQ29uc3RhbnRUYWcua05hdGl2ZUVudHJ5Q29uc3RhbnRUYWcua1N1YnR5cGVUZXN0Q2FjaGVDb25zdGFudFRhZy5rVW51c2VkMTNDb25zdGFudFRhZy5rRW1wdHlUeXBlQXJndW1lbnRzQ29uc3RhbnRUYWcua1VudXNlZDE0Q29uc3RhbnRUYWcua1VudXNlZDE1Q29uc3RhbnRUYWcua09iamVjdFJlZkNvbnN0YW50VGFnLmtEaXJlY3RDYWxsQ29uc3RhbnRUYWcua0ludGVyZmFjZUNhbGxDb25zdGFudFRhZy5rSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbENvbnN0YW50VGFnLmtEeW5hbWljQ2FsbENvbnN0YW50VGFnLmtEaXJlY3RDYWxsVmlhRHluYW1pY0ZvcndhcmRlcmtJbnZhbGlka1VudXNlZDFrVW51c2VkMmtVbnVzZWQza1VudXNlZDRrVW51c2VkNWtVbnVzZWQ2a1VudXNlZDZha1VudXNlZDdrU3RhdGljRmllbGRrSW5zdGFuY2VGaWVsZGtDbGFzc2tUeXBlQXJndW1lbnRzRmllbGRrVW51c2VkOGtUeXBla1VudXNlZDlrVW51c2VkMTBrVW51c2VkMTFrVW51c2VkMTJrQ2xvc3VyZUZ1bmN0aW9ua0VuZENsb3N1cmVGdW5jdGlvblNjb3Bla05hdGl2ZUVudHJ5a1N1YnR5cGVUZXN0Q2FjaGVrVW51c2VkMTNrRW1wdHlUeXBlQXJndW1lbnRza1VudXNlZDE0a1VudXNlZDE1a09iamVjdFJlZmtEaXJlY3RDYWxsa0ludGVyZmFjZUNhbGxrSW5zdGFudGlhdGVkSW50ZXJmYWNlQ2FsbGtEeW5hbWljQ2FsbGtEaXJlY3RDYWxsVmlhRHluYW1pY0ZvcndhcmRlckNvbnN0YW50UG9vbEVudHJ5bnVtUmVzZXJ2ZWRFbnRyaWVzd3JpdGVWYWx1ZVVuZXhwZWN0ZWQgY29uc3RhbnQgdGFnIEludm9jYXRpb25LaW5kQ29uc3RhbnRTdGF0aWNGaWVsZFN0YXRpY0ZpZWxkIENvbnN0YW50SW5zdGFuY2VGaWVsZEluc3RhbmNlRmllbGQgQ29uc3RhbnRDbGFzc2NsYXNzSGFuZGxlQ29uc3RhbnRUeXBlQXJndW1lbnRzRmllbGRUeXBlQXJndW1lbnRzRmllbGQgQ29uc3RhbnRUeXBlVHlwZSBDb25zdGFudENsb3N1cmVGdW5jdGlvbkNsb3N1cmVGdW5jdGlvbiBDb25zdGFudEVuZENsb3N1cmVGdW5jdGlvblNjb3BlRW5kQ2xvc3VyZUZ1bmN0aW9uU2NvcGVDb25zdGFudE5hdGl2ZUVudHJ5TmF0aXZlRW50cnkgQ29uc3RhbnRTdWJ0eXBlVGVzdENhY2hlU3VidHlwZVRlc3RDYWNoZUNvbnN0YW50RW1wdHlUeXBlQXJndW1lbnRzRW1wdHlUeXBlQXJndW1lbnRzQ29uc3RhbnRPYmplY3RSZWZPYmplY3RSZWYgQ29uc3RhbnREaXJlY3RDYWxsRGlyZWN0Q2FsbCAnJywgQ29uc3RhbnREaXJlY3RDYWxsVmlhRHluYW1pY0ZvcndhcmRlckRpcmVjdENhbGxWaWFEeW5hbWljRm9yd2FyZGVyICdDb25zdGFudEludGVyZmFjZUNhbGxJbnRlcmZhY2VDYWxsICdDb25zdGFudEluc3RhbnRpYXRlZEludGVyZmFjZUNhbGxJbnN0YW50aWF0ZWRJbnRlcmZhY2VDYWxsICcsIHJlY2VpdmVyIENvbnN0YW50RHluYW1pY0NhbGxzZWxlY3Rvck5hbWVEeW5hbWljQ2FsbCBfUmVzZXJ2ZWRDb25zdGFudFBvb2xFbnRyeVRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSBpcyByZXNlcnZlZFJlc2VydmVkQ29uc3RhbnRQb29sX2Nhbm9uaWNhbGl6YXRpb25DYWNoZV9hZGRFbnRyeV9hZGRudW1Bcmd1bWVudHNudW1UeXBlQXJnc2FyZ05hbWVzdGFyZ2V0SGFuZGxlZ2V0TWVtYmVySGFuZGxlYWRkRHluYW1pY0NhbGxnZXRTZWxlY3Rvck5hbWVIYW5kbGVnZXRUeXBlQXJndW1lbnRzSGFuZGxlX2luZGV4U3RyaW5nNDI5NDk2NzI5NmVudHJ5U3RhcnRlbnRyeVN0YXRDb25zdGFudFBvb2wgeyAgW10gPSBDb25zdGFudFBvb2xJbmRleE92ZXJmbG93RXhjZXB0aW9uY29uc3RhbnRUYWdUb1N0cmluZ0NvbnN0YW50VGFnLmtfY29tYmluZUhhc2hlc2hhc2gxdm0uYnl0ZWNvZGUuZGJjT3Bjb2Rla1VudXNlZE9wY29kZTAwMGtVbnVzZWRPcGNvZGUwMDFrVW51c2VkT3Bjb2RlMDAya1VudXNlZE9wY29kZTAwM2tVbnVzZWRPcGNvZGUwMDRrVW51c2VkT3Bjb2RlMDA1a1VudXNlZE9wY29kZTAwNmtVbnVzZWRPcGNvZGUwMDdrVW51c2VkT3Bjb2RlMDA4a1VudXNlZE9wY29kZTAwOWtVbnVzZWRPcGNvZGUwMTBrVW51c2VkT3Bjb2RlMDExa1VudXNlZE9wY29kZTAxMmtVbnVzZWRPcGNvZGUwMTNrVW51c2VkT3Bjb2RlMDE0a1VudXNlZE9wY29kZTAxNWtVbnVzZWRPcGNvZGUwMTZrVW51c2VkT3Bjb2RlMDE3a1VudXNlZE9wY29kZTAxOGtVbnVzZWRPcGNvZGUwMTlrVW51c2VkT3Bjb2RlMDIwa1VudXNlZE9wY29kZTAyMWtVbnVzZWRPcGNvZGUwMjJrVW51c2VkT3Bjb2RlMDIza1VudXNlZE9wY29kZTAyNGtVbnVzZWRPcGNvZGUwMjVrVW51c2VkT3Bjb2RlMDI2a1VudXNlZE9wY29kZTAyN2tVbnVzZWRPcGNvZGUwMjhrVW51c2VkT3Bjb2RlMDI5a1VudXNlZE9wY29kZTAzMGtVbnVzZWRPcGNvZGUwMzFrVW51c2VkT3Bjb2RlMDMya1VudXNlZE9wY29kZTAzM2tVbnVzZWRPcGNvZGUwMzRrVW51c2VkT3Bjb2RlMDM1a1VudXNlZE9wY29kZTAzNmtVbnVzZWRPcGNvZGUwMzdrVW51c2VkT3Bjb2RlMDM4a1VudXNlZE9wY29kZTAzOWtVbnVzZWRPcGNvZGUwNDBrVW51c2VkT3Bjb2RlMDQxa1VudXNlZE9wY29kZTA0MmtVbnVzZWRPcGNvZGUwNDNrVW51c2VkT3Bjb2RlMDQ0a1VudXNlZE9wY29kZTA0NWtVbnVzZWRPcGNvZGUwNDZrVW51c2VkT3Bjb2RlMDQ3a1VudXNlZE9wY29kZTA0OGtVbnVzZWRPcGNvZGUwNDlrVW51c2VkT3Bjb2RlMDUwa1VudXNlZE9wY29kZTA1MWtVbnVzZWRPcGNvZGUwNTJrVW51c2VkT3Bjb2RlMDUza1VudXNlZE9wY29kZTA1NGtVbnVzZWRPcGNvZGUwNTVrVW51c2VkT3Bjb2RlMDU2a1VudXNlZE9wY29kZTA1N2tVbnVzZWRPcGNvZGUwNThrVW51c2VkT3Bjb2RlMDU5a1VudXNlZE9wY29kZTA2MGtVbnVzZWRPcGNvZGUwNjFrVW51c2VkT3Bjb2RlMDYya1VudXNlZE9wY29kZTA2M2tVbnVzZWRPcGNvZGUwNjRrVW51c2VkT3Bjb2RlMDY1a1VudXNlZE9wY29kZTA2NmtVbnVzZWRPcGNvZGUwNjdrVW51c2VkT3Bjb2RlMDY4a1VudXNlZE9wY29kZTA2OWtVbnVzZWRPcGNvZGUwNzBrVW51c2VkT3Bjb2RlMDcxa1VudXNlZE9wY29kZTA3MmtVbnVzZWRPcGNvZGUwNzNrVW51c2VkT3Bjb2RlMDc0a1VudXNlZE9wY29kZTA3NWtVbnVzZWRPcGNvZGUwNzZrVW51c2VkT3Bjb2RlMDc3a1VudXNlZE9wY29kZTA3OGtVbnVzZWRPcGNvZGUwNzlrVW51c2VkT3Bjb2RlMDgwa1VudXNlZE9wY29kZTA4MWtKdW1wSWZJbml0aWFsaXplZGtKdW1wSWZJbml0aWFsaXplZF9XaWRla1B1c2hVbmluaXRpYWxpemVkU2VudGluZWxrVHJhcGtFbnRyeWtFbnRyeV9XaWRla0VudHJ5Rml4ZWRrRW50cnlGaXhlZF9XaWRla0VudHJ5T3B0aW9uYWxrVW51c2VkMDBrTG9hZENvbnN0YW50a0xvYWRDb25zdGFudF9XaWRla0ZyYW1la0ZyYW1lX1dpZGVrQ2hlY2tGdW5jdGlvblR5cGVBcmdza0NoZWNrRnVuY3Rpb25UeXBlQXJnc19XaWRla0NoZWNrU3RhY2trRGVidWdDaGVja2tKdW1wSWZVbmNoZWNrZWRrSnVtcElmVW5jaGVja2VkX1dpZGVrQWxsb2NhdGVrQWxsb2NhdGVfV2lkZWtBbGxvY2F0ZVRrQ3JlYXRlQXJyYXlUT1NrQWxsb2NhdGVDbG9zdXJla0FsbG9jYXRlQ2xvc3VyZV9XaWRla0FsbG9jYXRlQ29udGV4dGtBbGxvY2F0ZUNvbnRleHRfV2lkZWtDbG9uZUNvbnRleHRrQ2xvbmVDb250ZXh0X1dpZGVrTG9hZENvbnRleHRQYXJlbnRrU3RvcmVDb250ZXh0UGFyZW50a0xvYWRDb250ZXh0VmFya0xvYWRDb250ZXh0VmFyX1dpZGVrVW51c2VkMDRrVW51c2VkMDVrU3RvcmVDb250ZXh0VmFya1N0b3JlQ29udGV4dFZhcl9XaWRla1B1c2hDb25zdGFudGtQdXNoQ29uc3RhbnRfV2lkZWtVbnVzZWQwNmtVbnVzZWQwN2tQdXNoVHJ1ZWtQdXNoRmFsc2VrUHVzaEludGtQdXNoSW50X1dpZGVrVW51c2VkMDhrVW51c2VkMDlrUHVzaE51bGxrRHJvcDFrUHVzaGtQdXNoX1dpZGVrVW51c2VkMTZrVW51c2VkMTdrUG9wTG9jYWxrUG9wTG9jYWxfV2lkZWtMb2FkU3RhdGlja0xvYWRTdGF0aWNfV2lkZWtTdG9yZUxvY2Fsa1N0b3JlTG9jYWxfV2lkZWtMb2FkRmllbGRUT1NrTG9hZEZpZWxkVE9TX1dpZGVrU3RvcmVGaWVsZFRPU2tTdG9yZUZpZWxkVE9TX1dpZGVrU3RvcmVJbmRleGVkVE9Ta1VudXNlZDIwa0luaXRMYXRlRmllbGRrSW5pdExhdGVGaWVsZF9XaWRla1N0b3JlU3RhdGljVE9Ta1N0b3JlU3RhdGljVE9TX1dpZGVrSnVtcGtKdW1wX1dpZGVrSnVtcElmTm9Bc3NlcnRza0p1bXBJZk5vQXNzZXJ0c19XaWRla0p1bXBJZk5vdFplcm9UeXBlQXJnc2tKdW1wSWZOb3RaZXJvVHlwZUFyZ3NfV2lkZWtKdW1wSWZFcVN0cmljdGtKdW1wSWZFcVN0cmljdF9XaWRla0p1bXBJZk5lU3RyaWN0a0p1bXBJZk5lU3RyaWN0X1dpZGVrSnVtcElmVHJ1ZWtKdW1wSWZUcnVlX1dpZGVrSnVtcElmRmFsc2VrSnVtcElmRmFsc2VfV2lkZWtKdW1wSWZOdWxsa0p1bXBJZk51bGxfV2lkZWtKdW1wSWZOb3ROdWxsa0p1bXBJZk5vdE51bGxfV2lkZWtEaXJlY3RDYWxsX1dpZGVrVW5jaGVja2VkRGlyZWN0Q2FsbGtVbmNoZWNrZWREaXJlY3RDYWxsX1dpZGVrSW50ZXJmYWNlQ2FsbF9XaWRla1VudXNlZDIza1VudXNlZDI0a0luc3RhbnRpYXRlZEludGVyZmFjZUNhbGxfV2lkZWtVbmNoZWNrZWRDbG9zdXJlQ2FsbGtVbmNoZWNrZWRDbG9zdXJlQ2FsbF9XaWRla1VuY2hlY2tlZEludGVyZmFjZUNhbGxrVW5jaGVja2VkSW50ZXJmYWNlQ2FsbF9XaWRla0R5bmFtaWNDYWxsX1dpZGVrTmF0aXZlQ2FsbGtOYXRpdmVDYWxsX1dpZGVrUmV0dXJuVE9Ta1VudXNlZDI5a0Fzc2VydEFzc2lnbmFibGVrQXNzZXJ0QXNzaWduYWJsZV9XaWRla1VudXNlZDMwa1VudXNlZDMxa0Fzc2VydEJvb2xlYW5rQXNzZXJ0U3VidHlwZWtMb2FkVHlwZUFyZ3VtZW50c0ZpZWxka0xvYWRUeXBlQXJndW1lbnRzRmllbGRfV2lkZWtJbnN0YW50aWF0ZVR5cGVrSW5zdGFudGlhdGVUeXBlX1dpZGVrSW5zdGFudGlhdGVUeXBlQXJndW1lbnRzVE9Ta0luc3RhbnRpYXRlVHlwZUFyZ3VtZW50c1RPU19XaWRla1VudXNlZDMya1VudXNlZDMza1VudXNlZDM0a1VudXNlZDM1a1Rocm93a1NldEZyYW1la01vdmVTcGVjaWFsa01vdmVTcGVjaWFsX1dpZGVrQm9vbGVhbk5lZ2F0ZVRPU2tFcXVhbHNOdWxsa051bGxDaGVja2tOdWxsQ2hlY2tfV2lkZWtOZWdhdGVJbnRrQWRkSW50a1N1YkludGtNdWxJbnRrVHJ1bmNEaXZJbnRrTW9kSW50a0JpdEFuZEludGtCaXRPckludGtCaXRYb3JJbnRrU2hsSW50a1NockludGtDb21wYXJlSW50RXFrQ29tcGFyZUludEd0a0NvbXBhcmVJbnRMdGtDb21wYXJlSW50R2VrQ29tcGFyZUludExla05lZ2F0ZURvdWJsZWtBZGREb3VibGVrU3ViRG91Ymxla011bERvdWJsZWtEaXZEb3VibGVrQ29tcGFyZURvdWJsZUVxa0NvbXBhcmVEb3VibGVHdGtDb21wYXJlRG91YmxlTHRrQ29tcGFyZURvdWJsZUdla0NvbXBhcmVEb3VibGVMZUVuY29kaW5nazBrQWtEa1hrVGtBRWtBWWtERmtBQkNPcGVyYW5kaW1tbGl0cmVneGVndGd0c3BlRm9ybWF0b3BlcmFuZHNTcGVjaWFsSW5kZXhjdXJyZW50Qnl0ZWNvZGVGb3JtYXRWZXJzaW9ua1dpZGVNb2RpZmllcmtNYXhPcGNvZGVzQnl0ZWNvZGVGb3JtYXRza1BhcmFtRW5kU2xvdEZyb21GcGxvY2FsVmFyaWFibGVJbmRleExpbWl0MjE0NzQ4MzY0OGNhcHR1cmVkVmFyaWFibGVJbmRleExpbWl0Y29udGV4dElkTGltaXRhcmd1bWVudHNMaW1pdGtMZWdhY3lrT3B0ZWRJbmluc3RydWN0aW9uU2l6ZWlzV2lkZVVuZXhwZWN0ZWQgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgaGFzV2lkZVZhcmlhbnRpc1dpZGVPcGNvZGVmcm9tV2lkZU9wY29kZXZlcmlmeUJ5dGVjb2RlSW5zdHJ1Y3Rpb25EZWNsYXJhdGlvbnNfV2lkZUJ5dGVjb2RlIGZvcm1hdCBzaG91bGQgbm90IGJlIGRlZmluZWQgZm9yIHdpZGUgb3Bjb2RlIGNvbXBhY3RXaWRlIG9wY29kZSAgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyBpdHMgY29tcGFjdCBvcGNvZGUgKHByZXZpb3VzIG9wY29kZSBpcyApLiBzaG91bGQgbm90IGJlIGRlZmluZWQgZm9yIG9wY29kZSAgd2l0aCBlbmNvZGluZyBPcGNvZGUgIHNob3VsZCBpbW1lZGlhbHkgZm9sbG93IGlzT2RkKSBoYXMgYSB3aWRlIHZhcmlhbnQgYW5kIHNob3VsZCBiZSBldmVuVG9vIG1hbnkgb3Bjb2Rlc2lzSnVtcGlzVGhyb3dpc0NhbGxpc1JldHVybmlzQ29udHJvbEZsb3dpc1B1c2h2bS5ieXRlY29kZS5kZWNsYXJhdGlvbnNCeXRlY29kZURpc2Fzc2VtYmxlckxpYnJhcnlEZWNsYXJhdGlvbnVzZXNEYXJ0TWlycm9yc0ZsYWd1c2VzRGFydEZmaUZsYWdoYXNFeHRlbnNpb25zRmxhZ2lzTm9uTnVsbGFibGVCeURlZmF1bHRGbGFnTGlicmFyeSAgICAgbmFtZSAgICAgc2NyaXB0ICAgICB1c2VzIGRhcnQ6bWlycm9ycyAgICB1c2VzIGRhcnQ6ZmZpICAgIGV4dGVuc2lvbnM6ICAgICBpcyBubmJkQ2xhc3NEZWNsYXJhdGlvbmlzQWJzdHJhY3RGbGFnaXNFbnVtRmxhZ2hhc1R5cGVQYXJhbXNGbGFnaGFzVHlwZUFyZ3VtZW50c0ZsYWdpc1RyYW5zZm9ybWVkTWl4aW5BcHBsaWNhdGlvbkZsYWdoYXNTb3VyY2VQb3NpdGlvbnNGbGFnaGFzQW5ub3RhdGlvbnNGbGFnaGFzUHJhZ21hRmxhZywgc2NyaXB0ID0gLCBhYnN0cmFjdCwgZW51bSwgbWl4aW4tYXBwbGljYXRpb24sIGhhcy1wcmFnbWEsIHBvcyA9ICwgZW5kLXBvcyA9ICAgICB0eXBlLXBhcmFtcyAgKGFyZ3M6ICkKICAgIGV4dGVuZHMgICAgIGltcGxlbWVudHMgICAgIGFubm90YXRpb25zIFNvdXJjZUZpbGVoYXNMaW5lU3RhcnRzRmxhZ2hhc1NvdXJjZUZsYWdzb3VyY2U6IGltcG9ydC11cmkgIHRleHQgY2hhcnMgbGluZSBzdGFydHNNZW1iZXJzZnVuY3Rpb25zY291bnRGdW5jdGlvbnNGaWVsZERlY2xhcmF0aW9uaGFzTm9udHJpdmlhbEluaXRpYWxpemVyRmxhZ2hhc0dldHRlckZsYWdoYXNTZXR0ZXJGbGFnaXNSZWZsZWN0YWJsZUZsYWdpc1N0YXRpY0ZsYWdpc0NvbnN0RmxhZ2lzRmluYWxGbGFnaXNDb3ZhcmlhbnRGbGFnaXNHZW5lcmljQ292YXJpYW50SW1wbEZsYWdoYXNDdXN0b21TY3JpcHRGbGFnaGFzSW5pdGlhbGl6ZXJDb2RlRmxhZ2hhc0F0dHJpYnV0ZXNGbGFnaXNMYXRlRmxhZ2lzRXh0ZW5zaW9uTWVtYmVyRmxhZ2hhc0luaXRpYWxpemVyRmxhZ2luaXRpYWxpemVyQ29kZUZpZWxkICwgdHlwZSA9ICwgZ2V0dGVyID0gLCBzZXR0ZXIgPSAsIHJlZmxlY3RhYmxlLCBzdGF0aWMsIGNvbnN0LCBmaW5hbCwgaXMtbGF0ZSwgZXh0ZW5zaW9uLW1lbWJlciwgY3VzdG9tLXNjcmlwdCA9ICwgaGFzLWluaXRpYWxpemVyICAgIGluaXRpYWxpemVyCiAgICB2YWx1ZSA9ICAgICBhdHRyaWJ1dGVzIGlzQ29uc3RydWN0b3JGbGFnaXNHZXR0ZXJGbGFnaXNTZXR0ZXJGbGFnaXNGYWN0b3J5RmxhZ2hhc09wdGlvbmFsUG9zaXRpb25hbFBhcmFtc0ZsYWdoYXNPcHRpb25hbE5hbWVkUGFyYW1zRmxhZ2lzRGVidWdnYWJsZUZsYWdpc0FzeW5jRmxhZ2lzQXN5bmNTdGFyRmxhZ2lzU3luY1N0YXJGbGFnaXNGb3J3YXJkaW5nU3R1YkZsYWdpc05vU3VjaE1ldGhvZEZvcndhcmRlckZsYWdpc05hdGl2ZUZsYWdpc0V4dGVybmFsRmxhZ251bVJlcXVpcmVkUGFyYW1ldGVyc0Z1bmN0aW9uICwgY29uc3RydWN0b3IsIGdldHRlciwgc2V0dGVyLCBmYWN0b3J5LCBoYXMtb3B0aW9uYWwtcG9zaXRpb25hbC1wYXJhbXMsIGhhcy1vcHRpb25hbC1uYW1lZC1wYXJhbXMsIGRlYnVnZ2FibGUsIGFzeW5jLCBhc3luYyosIHN5bmMqLCBmb3J3YXJkaW5nLXN0dWIsIG5vLXN1Y2gtbWV0aG9kLWZvcndhcmRlciwgbmF0aXZlICwgZXh0ZXJuYWwgICAgcGFyYW1ldGVycyAgKHJlcXVpcmVkOiAgICAgcmV0dXJuLXR5cGUgVHlwZVBhcmFtZXRlcnNEZWNsYXJhdGlvbnRwbnVtVHlwZVBhcmFtc2JvdW5kc1BhcmFtZXRlckRlY2xhcmF0aW9uaGFzRXhjZXB0aW9uc1RhYmxlRmxhZ2hhc051bGxhYmxlRmllbGRzRmxhZ2hhc0Nsb3N1cmVzRmxhZ2hhc1BhcmFtZXRlckZsYWdzRmxhZ2hhc0ZvcndhcmRpbmdTdHViVGFyZ2V0RmxhZ2hhc0RlZmF1bHRGdW5jdGlvblR5cGVBcmdzRmxhZ2hhc0xvY2FsVmFyaWFibGVzRmxhZ2NvbnN0YW50UG9vbGJ5dGVjb2Rlc2hhc0V4Y2VwdGlvbnNUYWJsZWhhc1NvdXJjZVBvc2l0aW9uc2hhc0xvY2FsVmFyaWFibGVzaGFzTnVsbGFibGVGaWVsZHNoYXNDbG9zdXJlc0J5dGVjb2RlIHsKZGlzYXNzZW1ibGVnZXRCeXRlY29kZUFubm90YXRpb25zfQpOdWxsYWJsZSBmaWVsZHM6IFBhcmFtZXRlciBmbGFnczogRm9yd2FyZGluZyBzdHViIHRhcmdldDogQ1AjRGVmYXVsdCBmdW5jdGlvbiB0eXBlIGFyZ3VtZW50czogQ1AjQ2xvc3VyZURlY2xhcmF0aW9ubnVtUmVxdWlyZWRQYXJhbXNudW1OYW1lZFBhcmFtc251bVBhcmFtc0Nsb3N1cmUgIGFzeW5jIGFzeW5jKiBzeW5jKiBwb3MgPSAgPHsgIH1bICBdKSAtPiBDbG9zdXJlQ29kZUNsb3N1cmVDb2RlIHtBbm5vdGF0aW9uc0RlY2xhcmF0aW9uX1NlY3Rpb25udW1JdGVtc21hZ2ljVmFsdWUxMTQ1MTkzMjY2bnVtU2VjdGlvbnNzZWN0aW9uQWxpZ25tZW50aGVhZGVyU2l6ZXZlcnNpb25tYWdpY0Vycm9yOiB1bmV4cGVjdGVkIGJ5dGVjb2RlIG1hZ2ljIEVycm9yOiB1bmV4cGVjdGVkIGJ5dGVjb2RlIGZvcm1hdCB2ZXJzaW9uIHN0cmluZ1RhYmxlT2Zmc2V0b2JqZWN0VGFibGVPZmZzZXRtYWluT2Zmc2V0bGlicmFyaWVzTnVtbGlicmFyeUluZGV4T2Zmc2V0bGlicmFyaWVzT2Zmc2V0Y2xhc3Nlc051bWNsYXNzZXNPZmZzZXRtZW1iZXJzTnVtbWVtYmVyc09mZnNldGNvZGVzTnVtY29kZXNPZmZzZXRzb3VyY2VQb3NpdGlvbnNOdW1zb3VyY2VQb3NpdGlvbnNPZmZzZXRzb3VyY2VGaWxlc051bXNvdXJjZUZpbGVzT2Zmc2V0bGluZVN0YXJ0c051bWxpbmVTdGFydHNPZmZzZXRsb2NhbFZhcmlhYmxlc051bWxvY2FsVmFyaWFibGVzT2Zmc2V0YW5ub3RhdGlvbnNOdW1hbm5vdGF0aW9uc09mZnNldHByb3RlY3RlZE5hbWVzTnVtcHJvdGVjdGVkTmFtZXNPZmZzZXRhbm5vdGF0aW9uc1N0YXJ0YW5ub3RsaW5lU3RhcnRzU3RhcnRsc3NvdXJjZUZpbGVzU3RhcnRzZnNvdXJjZVBvc2l0aW9uc1N0YXJ0c3Bsb2NhbFZhcmlhYmxlc1N0YXJ0bHZjb2Rlc1N0YXJ0bWVtYmVyc1N0YXJ0Y2xhc3Nlc1N0YXJ0bGlicmFyaWVzU3RhcnRsaWJyYXJ5SW5kZXhTdGFydGFsbG9jYXRlSW5kZXhUYWJsZXByb3RlY3RlZE5hbWVzV3JpdGVyYW5ub3RhdGlvbnNXcml0ZXJsb2NhbFZhcmlhYmxlc1dyaXRlcmxpbmVTdGFydHNXcml0ZXJzb3VyY2VGaWxlc1dyaXRlcnNvdXJjZVBvc2l0aW9uc1dyaXRlcmNvZGVzV3JpdGVybWVtYmVyc1dyaXRlcmNsYXNzZXNXcml0ZXJsaWJyYXJpZXNXcml0ZXJsaWJyYXJ5SW5kZXhXcml0ZXJtYWluV3JpdGVyb2JqZWN0c1dyaXRlcnN0cmluZ3NXcml0ZXJzZWN0aW9uc3NlY3Rpb25CeXRlY29kZSAodmVyc2lvbjogc3RhYmxlTWFpbiBsaWJyYXJ5OiBfd3JpdGVCeXRlY29kZUluc3RydWN0aW9uc19yZWFkQnl0ZWNvZGVJbnN0cnVjdGlvbnN2bS5ieXRlY29kZS5leGNlcHRpb25zVHJ5QmxvY2tmbGFnTmVlZHNTdGFja1RyYWNlZmxhZ0lzU3ludGhldGljdHJ5SW5kZXhvdXRlclRyeUluZGV4c3RhcnRQQ3RyeS1pbmRleCAsIG91dGVyIHN0YXJ0ICwgZW5kICwgaGFuZGxlciBuZWVkcy1zdGFjay10cmFjZSwgc3ludGhldGljLCB0eXBlcyBDUCNfb3V0ZXJUcnlCbG9ja0luZGV4RXhjZXB0aW9uc1RhYmxlIHt2bS5ieXRlY29kZS5nZW5lcmljc21pbkZpbmRGcmVlVHlwZVBhcmFtZXRlcnNWaXNpdG9yX2RlY2xhcmVkVHlwZVBhcmFtZXRlcnNVbmV4cGVjdGVkIHR5cGUgX2NhblJldXNlU3VwZXJjbGFzc1R5cGVBcmd1bWVudHNzdXBlclR5cGVBcmdzb3ZlcmxhcHN1cGVyVHlwZUFyZ2luc3RhbnRpYXRlZENsYXNzZmxhdFR5cGVBcmdzZ2V0UmFuZ2VkeW5hbWljT25seWlzSW5zdGFudGlhdGVkR2VuZXJpY1R5cGVmaW5kVHlwZVBhcmFtc2lzU2VhbGVkVHlwZXJlY2VpdmVyU3RhdGljVHlwZVVuZXhwZWN0ZWQgdmFyaWFuY2UgIG9mIF9oYXNHZW5lcmljQ292YXJpYW50UGFyYW1ldGVyc1VuZXhwZWN0ZWQgaW5zdGFuY2UgY2FsbCB0YXJnZXQgdm0uYnl0ZWNvZGUubG9jYWxfdmFyaWFibGVfdGFibGVMb2NhbFZhcmlhYmxlRW50cnlLaW5kTG9jYWxWYXJpYWJsZUVudHJ5S2luZC5pbnZhbGlkTG9jYWxWYXJpYWJsZUVudHJ5S2luZC5zY29wZUxvY2FsVmFyaWFibGVFbnRyeUtpbmQudmFyaWFibGVEZWNsYXJhdGlvbkxvY2FsVmFyaWFibGVFbnRyeUtpbmQuY29udGV4dFZhcmlhYmxlaW52YWxpZHNjb3BldmFyaWFibGVEZWNsYXJhdGlvbmNvbnRleHRWYXJpYWJsZUxvY2FsVmFyaWFibGVFbnRyeUtpbmRNYXNrSXNDYXB0dXJlZEZsYWd3cml0ZUNvbnRlbnRzU2NvcGVjb250ZXh0TGV2ZWxyZWFkQ29udGVudHMgaXMgbm90IGNsb3NlZHNjb3BlIChwYyAgcG9zICBjb250ZXh0LWxldmVsIHZhcmlhYmxlICAoY2FwdHVyZWQpIHBjICwgbmFtZSBDUCMsIHR5cGUgQ1AjLCBwb3MgLCBpbml0LXBvcyBDb250ZXh0VmFyaWFibGVjb250ZXh0IHZhcmlhYmxlIGFjdGl2ZVNjb3Blc251bUVudHJpZXNkZWNvZGVTdGFydFBDa2luZEFuZEZsYWdzVW5leHBlY3RlZCBlbnRyeSBraW5kIG5hbWVDcEluZGV4dHlwZUNwSW5kZXhnZXRFbnRyaWVzZW5jb2RlU3RhcnRQQzsgdm0uYnl0ZWNvZGUubG9jYWxfdmFyc21heENvbnRpbnVhdGlvblZhcmlhYmxlc19zY29wZXNfdmFyc190ZW1wc19jYXB0dXJlZFNhdmVkQ29udGV4dFZhcnNfY2FwdHVyZWRFeGNlcHRpb25WYXJzX2NhcHR1cmVkU3RhY2tUcmFjZVZhcnNfY2FwdHVyZWRJdGVyYXRvclZhcnNfY3VycmVudFNjb3BlX2N1cnJlbnRGcmFtZXNjb3BlQnVpbGRlcmFsbG9jYXRvcl9nZXRWYXJEZXNjVmFyaWFibGUgZGVzY3JpcHRvciBpcyBub3QgY3JlYXRlZCBmb3IgX2dldFZhckluZGV4TWlzbWF0Y2ggaW4gY2FwdHVyZWQgc3RhdGUgb2YgVmFyaWFibGUgIGlzIG5vdCBhbGxvY2F0ZWRvcmlnaW5hbFBhcmFtU2xvdEluZGV4IGRvZXMgbm90IGhhdmUgb3JpZ2luYWxQYXJhbVNsb3RJbmRleHRlbXBzVGVtcCBpcyBub3QgYWxsb2NhdGVkIGZvciBub2RlIGNvbnRleHRJZEN1cnJlbnQgZnJhbWUgaXMgdG9wIGxldmVsIGFuZCBpdCBkb2Vzbid0IGhhdmUgYSBjb250ZXh0IGF0IGVudHJ5Y2xvc3VyZVZhckNsb3N1cmUgdmFyaWFibGUgaXMgbm90IGRlY2xhcmVkIGluIGNvbnRleHRWYXJDb250ZXh0IHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiBzY3JhdGNoVmFyU2NyYXRjaCB2YXJpYWJsZSBpcyBub3QgZGVjbGFyZWQgaW4gcmV0dXJuVmFyUmV0dXJuIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiBGdW5jdGlvblR5cGVBcmdzIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiBGYWN0b3J5VHlwZUFyZ3MgdmFyaWFibGUgaXMgbm90IGRlY2xhcmVkIGluIFJlY2VpdmVyIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiBDYXB0dXJlZCByZWNlaXZlciB2YXJpYWJsZSBpcyBub3QgZGVjbGFyZWQgaW4gaXNTeW5jWWllbGRpbmdnZXRTeW50aGV0aWNWYXJjYXB0dXJlZEl0ZXJhdG9yVmFyZnJhbWVvbGRWYXJEZXNjZGVjbGFyYXRpb252YXJzaXNBbGxvY2F0ZWRjYXB0dXJlbW92ZVRvU2NvcGVuZXdTY29wZXZhciBGcmFtZXRvcFNjb3Blc3ludGhldGljVmFyc3RlbXBvcmFyaWVzIHZhcmlhYmxlIGlzIG5vdCBkZWNsYXJlZCBpbiBsb29wRGVwdGhsb2NhbHNVc2VkdGVtcHNVc2VkY29udGV4dE93bmVyY29udGV4dFVzZWRoYXNDb250ZXh0X1Njb3BlQnVpbGRlcl9lbmNsb3NpbmdUcnlCbG9ja3NfZW5jbG9zaW5nVHJ5Q2F0Y2hlc19sb29wRGVwdGhfc29ydE5hbWVkUGFyYW1ldGVyc3BhcmFtc192aXNpdEZ1bmN0aW9uc2F2ZWRFbmNsb3NpbmdUcnlCbG9ja3NzYXZlZEVuY2xvc2luZ1RyeUNhdGNoZXNzYXZlTG9vcERlcHRoX2VudGVyRnJhbWVfZGVjbGFyZVZhcmlhYmxlOnR5cGVfYXJndW1lbnRzOmZ1bmN0aW9uX3R5cGVfYXJndW1lbnRzX3ZhcjpjbG9zdXJlX3VzZVZhcmlhYmxlOmNvbnRyb2xsZXJfc3RyZWFtOmNvbnRyb2xsZXI6Y29udGV4dDpzY3JhdGNoX2xlYXZlRnJhbWUgaXMgdXNlZCBiZWZvcmUgZGVjbGFyZWRfdXNlVGhpc19jYXB0dXJlQWxsVmlzaWJsZVZhcmlhYmxlc0luQ3VycmVudEZyYW1ldHJhbnNpZW50X2NhcHR1cmVTeW50aGV0aWNWYXJpYWJsZXNfY2FwdHVyZVN5bnRoZXRpY1ZhcmlhYmxlX3Zpc2l0V2l0aFNjb3BlaXRlcmF0b3JWYXI6aXRlcmF0b3I6cmV0dXJuX0FsbG9jYXRvcl9jb250ZXh0SWRDb3VudGVycGFyZW50RnJhbWVjdXJyZW50TGV2ZWxwYXJlbnRMZXZlbFVuZXhwZWN0ZWQgY29udGV4dCBhbGxvY2F0aW9uIGluICAtIGNvbnRleHQgbGV2ZWwgYXQgcGFyZW50IGVudHJ5OiAgLSBjb250ZXh0IGxldmVsIGF0IHN5bnRoZXRpYyBjbG9zdXJlIGVudHJ5OiBwYXJlbnRDb250ZXh0TGV2ZWxudW1DYXB0dXJlZHNhdHVyYXRlZENvbnRleHRJZHRlbXBzVG9SZXRhaW5fdXBkYXRlRnJhbWVTaXplX2FsbG9jYXRlVGVtcG5ld1Nsb3RzbG9jYWxfZnJlZVRlbXBfYWxsb2NhdGVWYXJpYWJsZXBhcmFtU2xvdEluZGV4X2Vuc3VyZVZhcmlhYmxlQWxsb2NhdGVkX2FsbG9jYXRlUGFyYW1ldGVyX2FsbG9jYXRlUGFyYW1ldGVyc2hhc0Nsb3N1cmVBcmdfYWxsb2NhdGVTcGVjaWFsVmFyaWFibGVzYXN5bmNDb21wbGV0ZXJjb250cm9sbGVyX3Zpc2l0bnVtVGVtcHNuZWVkc1RlbXBMb2NhbFZhcmlhYmxlSW5kZXhPdmVyZmxvd0V4Y2VwdGlvbmF3YWl0SnVtcFZhckNvbnRleHRJbmRleGFzeW5jQ29tcGxldGVyQ29udGV4dEluZGV4Y29udHJvbGxlckNvbnRleHRJbmRleF9oYXNSZWNlaXZlclBhcmFtZXRlcnZtLmJ5dGVjb2RlLm51bGxhYmlsaXR5X2RldGVjdG9yX2lzTnVsbGFibGVWaXNpdG9yX0lzTnVsbGFibGVWaXNpdG9yX25vbk51bGxhYmxlQnl0ZWNvZGVJbnN0cnVjdGlvbnN2bS5ieXRlY29kZS5vYmplY3RfdGFibGVSZWN1cnNpdmVUeXBlc1ZhbGlkYXRvck9iamVjdEtpbmRPYmplY3RLaW5kLmtJbnZhbGlkT2JqZWN0S2luZC5rTGlicmFyeU9iamVjdEtpbmQua0NsYXNzT2JqZWN0S2luZC5rTWVtYmVyT2JqZWN0S2luZC5rQ2xvc3VyZU9iamVjdEtpbmQua1VudXNlZDFPYmplY3RLaW5kLmtVbnVzZWQyT2JqZWN0S2luZC5rVW51c2VkM09iamVjdEtpbmQua1VudXNlZDRPYmplY3RLaW5kLmtOYW1lT2JqZWN0S2luZC5rVHlwZUFyZ3VtZW50c09iamVjdEtpbmQua1VudXNlZDVPYmplY3RLaW5kLmtDb25zdE9iamVjdE9iamVjdEtpbmQua0FyZ0Rlc2NPYmplY3RLaW5kLmtTY3JpcHRPYmplY3RLaW5kLmtUeXBla0xpYnJhcnlrTWVtYmVya0Nsb3N1cmVrTmFtZWtUeXBlQXJndW1lbnRza0NvbnN0T2JqZWN0a0FyZ0Rlc2NrU2NyaXB0Q29uc3RUYWdDb25zdFRhZy5rSW52YWxpZENvbnN0VGFnLmtJbnN0YW5jZUNvbnN0VGFnLmtJbnRDb25zdFRhZy5rRG91YmxlQ29uc3RUYWcua0xpc3RDb25zdFRhZy5rVGVhck9mZkNvbnN0VGFnLmtCb29sQ29uc3RUYWcua1N5bWJvbENvbnN0VGFnLmtUZWFyT2ZmSW5zdGFudGlhdGlvbkNvbnN0VGFnLmtTdHJpbmdrSW5zdGFuY2VrSW50a0RvdWJsZWtMaXN0a1RlYXJPZmZrQm9vbGtTeW1ib2xrVGVhck9mZkluc3RhbnRpYXRpb25rU3RyaW5nVHlwZVRhZ1R5cGVUYWcua0ludmFsaWRUeXBlVGFnLmtEeW5hbWljVHlwZVRhZy5rVm9pZFR5cGVUYWcua1NpbXBsZVR5cGVUeXBlVGFnLmtUeXBlUGFyYW1ldGVyVHlwZVRhZy5rR2VuZXJpY1R5cGVUeXBlVGFnLmtSZWN1cnNpdmVHZW5lcmljVHlwZVR5cGVUYWcua1JlY3Vyc2l2ZVR5cGVSZWZUeXBlVGFnLmtGdW5jdGlvblR5cGVUeXBlVGFnLmtOZXZlcmtEeW5hbWlja1ZvaWRrU2ltcGxlVHlwZWtUeXBlUGFyYW1ldGVya0dlbmVyaWNUeXBla1JlY3Vyc2l2ZUdlbmVyaWNUeXBla1JlY3Vyc2l2ZVR5cGVSZWZrRnVuY3Rpb25UeXBla05ldmVycmVmZXJlbmNlQml0aW5kZXhTaGlmdGlubGluZU9iamVjdGtpbmRTaGlmdGtpbmRNYXNrZmxhZ0JpdDBmbGFnQml0MWZsYWdCaXQyZmxhZ0JpdDNmbGFnQml0NGZsYWdCaXQ1ZmxhZ3NNYXNrX3VzZUNvdW50X3JlZmVyZW5jZV9tYWtlUmVmZXJlbmNlX2dldEluZGV4RnJvbVJlZmVyZW5jZV9tYWtlSGVhZGVyX2dldEtpbmRGcm9tSGVhZGVyX2dldEZsYWdzRnJvbUhlYWRlcmlzQ2FjaGVhYmxlc2hvdWxkQmVJbmNsdWRlZEludG9JbmRleFRhYmxlX2VtcHR5VW5leHBlY3RlZCB0eXBlIHRhZyBVbmV4cGVjdGVkIG9iamVjdCBraW5kIF93cml0ZV9yZWFkYWNjb3VudFVzZXNGb3JPYmplY3RDb3BpZXNudW1Db3BpZXNpbmRleFN0cmluZ3NfSW52YWxpZEhhbmRsZUludmFsaWRfTGlicmFyeUhhbmRsZV9DbGFzc0hhbmRsZV9NZW1iZXJIYW5kbGVmbGFnSXNGaWVsZGZsYWdJc0NvbnN0cnVjdG9yX2ZsYWdzIChmaWVsZCkgKGNvbnN0cnVjdG9yKV9DbG9zdXJlSGFuZGxlOjpDbG9zdXJlL19UeXBlSGFuZGxldGFnTWFza251bGxhYmlsaXR5TWFza1VuYWJsZSB0byBzZXQgZmxhZ3MgZm9yIF9UeXBlSGFuZGxlICh0aGV5IGFyZSBvY2N1cGllZCBieSB0eXBlIHRhZyBhbmQgbm5iZClfRHluYW1pY1R5cGVIYW5kbGVfVm9pZFR5cGVIYW5kbGVfTmV2ZXJUeXBlSGFuZGxlX1NpbXBsZVR5cGVIYW5kbGVfVHlwZVBhcmFtZXRlckhhbmRsZWluZGV4SW5QYXJlbnQ6OlR5cGVQYXJhbS9fR2VuZXJpY1R5cGVIYW5kbGVfUmVjdXJzaXZlR2VuZXJpY1R5cGVIYW5kbGVpZChyZWN1cnNpdmUgI19SZWN1cnNpdmVUeXBlUmVmSGFuZGxlcmVjdXJzaXZlLXJlZiAjX0Z1bmN0aW9uVHlwZUhhbmRsZWZsYWdIYXNPcHRpb25hbFBvc2l0aW9uYWxQYXJhbXNmbGFnSGFzT3B0aW9uYWxOYW1lZFBhcmFtc2ZsYWdIYXNUeXBlUGFyYW1zZnVuY3Rpb25UeXBlRmxhZ3NuYW1lZFBhcmFtc2hhc05hbWVkUGFyYW1zX05hbWVIYW5kbGVmbGFnSXNQdWJsaWNfUHVibGljTmFtZUhhbmRsZV9Qcml2YXRlTmFtZUhhbmRsZV9UeXBlQXJndW1lbnRzSGFuZGxlPCAgPl9Db25zdE9iamVjdEhhbmRsZWVsZW1zdGVhck9mZlVuZXhwZWN0ZWQgY29uc3RhbnQgdGFnOiBlbGVtY29uc3QgY29uc3QgPD4gY29uc3QgdGVhci1vZmYgX0FyZ0Rlc2NIYW5kbGVmbGFnSGFzTmFtZWRBcmdzZmxhZ0hhc1R5cGVBcmdzQXJnRGVzYyBudW0tYXJncyAsIG51bS10eXBlLWFyZ3MgLCBuYW1lcyBfU2NyaXB0SGFuZGxlZmxhZ0hhc1NvdXJjZUZpbGVfc291cmNlX3NvdXJjZUZvcndhcmRSZWZlcmVuY2Vzb3VyY2VGaWxlaW5kZXhUYWJsZVVzZUNvdW50VGhyZXNob2xkX29iamVjdHNfbm9kZUNhY2hlX3B1YmxpY05hbWVzX2luZGV4VGFibGVfZHluYW1pY1R5cGVfdm9pZFR5cGVfbm9kZVZpc2l0b3JnZXRPckFkZE9iamVjdGhhbmRsZWhhbmRsZXNtYW5nbGVHZXR0ZXJOYW1lbWFuZ2xlU2V0dGVyTmFtZW1hbmdsZVNlbGVjdG9yTmFtZWxpYnJhcnlIYW5kbGVnZXRQdWJsaWNOYW1lSGFuZGxlc2dldFRvcExldmVsQ2xhc3NIYW5kbGVVbmV4cGVjdGVkIE1lbWJlcidzIHBhcmVudCBuYW1lZEFyZ3VtZW50c3VyaUhhbmRsZW5hbWVzQW5kQm91bmRzdGFibGVTaXplY29udGVudHNXcml0ZXJPYmplY3RUYWJsZSB7X05vZGVWaXNpdG9yX3R5cGVQYXJhbWV0ZXJzX3JlY3Vyc2l2ZVR5cGVJZHNyZWN1cnNpdmVUeXBlc1ZhbGlkYXRvcnJlY3Vyc2l2ZUlkdmFsaWRhdGVUeXBlaXNSZWN1cnNpdmVpbnN0YW50aWF0b3JBcmdzdHlwZUFyZ3NIYW5kbGV0eXBlUGFyYW1ldGVySGFuZGxlIHdpdGhvdXQgcGFyZW50LCBidXQgbm90IGRlY2xhcmVkIGJ5IGZ1bmN0aW9uIHR5cGVwYXJlbnRIYW5kbGUgaXMgbm90IGZvdW5kIGluIGl0cyBwYXJlbnQgY2xhc3MgZnVuY1BhcmVudFVuZXhwZWN0ZWQgcGFyZW50IG9mIEZ1bmN0aW9uTm9kZTogIGlzIG5vdCBmb3VuZCBpbiBpdHMgcGFyZW50IGZ1bmN0aW9uIFVuZXhwZWN0ZWQgcGFyZW50IG9mIFR5cGVQYXJhbWV0ZXI6IG51bUVuY2xvc2luZ1R5cGVQYXJhbWV0ZXJzb2JqZWN0S2luZFRvU3RyaW5nT2JqZWN0S2luZC5rdm0uYnl0ZWNvZGUucmVjb2duaXplZF9tZXRob2RzYmluYXJ5SW50T3BzYmluYXJ5RG91YmxlT3BzaXNEb3VibGVzcGVjaWFsaXplZEJ5dGVjb2RlRm9yVW5hcnlPcHNwZWNpYWxpemVkQnl0ZWNvZGVGb3JCaW5hcnlPcGFyZ1R5cGVhVHlwZWJUeXBldm0uYnl0ZWNvZGUucmVjdXJzaXZlX3R5cGVzX3ZhbGlkYXRvcl92YWxpZGF0ZWRUeXBlc19yZWN1cnNpdmVUeXBlc192YWxpZGF0ZWRDbGFzZXNpc1ZhbGlkYXRlZHZhbGlkYXRlZHJlY3Vyc2l2ZXZhbGlkYXRlQ2xhc3NfUmVjdXJzaXZlVHlwZXNWaXNpdG9ydmFsaWRhdG9yX3Zpc2l0ZWRfc3RhY2tfdmVyaWZ5UmVjdXJzaXZlVHlwZV9lcmFzZVR5cGVQYXJhbWV0ZXJzVW5leHBlY3RlZCByZWN1cnNpdmUgdHlwZSBfRXJhc2VUeXBlUGFyYW1ldGVyc1RvRHluYW1pY3ZtLmJ5dGVjb2RlLnNvdXJjZV9wb3NpdGlvbnNzeW50aGV0aWNDb2RlTWFya2VyeWllbGRQb2ludE1hcmtlcl9wb3NpdGlvbnNfbGFzdFBjX2xhc3RPZmZzZXRkZWNvZGVQQ2RlY29kZU9mZnNldGVuY29kZVBDZW5jb2RlT2Zmc2V0eWllbGQgcG9pbnRzb3VyY2UgcG9zaXRpb24gZW5jb2RlTGluZVN0YXJ0c2RlY29kZUxpbmVTdGFydHNMaW5lIHN0YXJ0czogdm0ubWV0YWRhdGEuYnl0ZWNvZGVCeXRlY29kZU1ldGFkYXRhQnl0ZWNvZGVNZXRhZGF0YS53cml0ZUJ5dGVjb2RlTWV0YWRhdGEucmVhZEJ5dGVjb2RlTWV0YWRhdGEgewpCeXRlY29kZU1ldGFkYXRhUmVwb3NpdG9yeXZtLmJ5dGVjb2Rldm0ubWV0YWRhdGEuZGlyZWN0X2NhbGxfdGFyZ2V0UmVmZXJlbmNlcmVwb3NpdG9yeVRhZ0RpcmVjdENhbGxNZXRhZGF0YSBzaG91bGQgaGF2ZSBhIG5vbi1udWxsIHRhcmdldHZtLm1ldGFkYXRhLmluZmVycmVkX3R5cGVfY29uY3JldGVDbGFzc1JlZmVyZW5jZV9jb25zdGFudFZhbHVlZmxhZ051bGxhYmxlZmxhZ0ludGZsYWdTa2lwQ2hlY2tmbGFnQ29uc3RhbnRmbGFnUmVjZWl2ZXJOb3RJbnRfYnlSZWZlcmVuY2UgKHNraXAgY2hlY2spICh2YWx1ZTogIChyZWNlaXZlciBub3QgaW50KWNvbmNyZXRlQ2xhc3NSZWZlcmVuY2V2bS5tZXRhZGF0YS5vYmZ1c2NhdGlvbl9wcm9oaWJpdGlvbnNPYmZ1c2NhdGlvblByb2hpYml0aW9uc01ldGFkYXRhdm0ub2JmdXNjYXRpb24tcHJvaGliaXRpb25zLm1ldGFkYXRhdm0ubWV0YWRhdGEucHJvY2VkdXJlX2F0dHJpYnV0ZXNrSW52YWxpZFNlbGVjdG9ySWRub0R5bmFtaWNVc2VzbWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZWdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlaGFzVGhpc1VzZXM6ZmFsc2VoYXNOb25UaGlzVXNlczpmYWxzZWhhc1RlYXJPZmZVc2VzOmZhbHNlbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOmdldHRlclNlbGVjdG9ySWQ6a01ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHlCaXRrTm9uVGhpc1VzZXNCaXRrVGVhck9mZlVzZXNCaXRrVGhpc1VzZXNCaXRrR2V0dGVyQ2FsbGVkRHluYW1pY2FsbHlCaXRfZ2V0RmxhZ3N2bS50YXJnZXQuZGFydF9ydW5uZXJkYXJ0OmNvbGxlY3Rpb25kYXJ0OmNvbnZlcnRkYXJ0OmRldmVsb3BlcmRhcnQ6aXNvbGF0ZWRhcnQ6bWF0aGRhcnQ6dHlwZWRfZGF0YWRhcnQ6bmF0aXZld3JhcHBlcnNkYXJ0OmlvZGFydDp3YXNtZGFydDpmdWNoc2lhLmJ1aWx0aW5kYXJ0OnppcmNvbmRhcnQ6ZnVjaHNpYWRhcnQ6dm1zZXJ2aWNlX2lvdm0udGFyZ2V0LmZsdXR0ZXJfd2lkZ2V0VHJhY2tlcmRhcnQ6dWl2bS50YXJnZXQuZmx1dHRlcl9ydW5uZXJ2bS50YXJnZXQudm10cmFuc2Zvcm1NaXhpbnN0cmFuc2Zvcm1Bc3luY3RyYW5zZm9ybVByb2NlZHVyZVZtQ29uc3RhbnRzQmFja2VuZEJpbmFyeUNhY2hlTWV0YWRhdGFSZXBvc2l0b3J5Y2FsbFNpdGVBbm5vdGF0b3JsYXRlVmFySW5pdFRyYW5zZm9ybWVybGlzdEZhY3RvcnlTcGVjaWFsaXplcnRyYW5zZm9ybUZmaVJlcGxhY2VkTWVtYmVyc3RyYW5zZm9ybUZmaURlZmluaXRpb25zdHJhbnNmb3JtRmZpVXNlU2l0ZXNfZ3Jvd2FibGVMaXN0X2ltbXV0YWJsZUxpc3RfaW50ZXJuYWxMaW5rZWRIYXNoTWFwX2ltbXV0YWJsZU1hcF9vbmVCeXRlU3RyaW5nX3R3b0J5dGVTdHJpbmdfc21pX2RvdWJsZWRhcnQ6X3Ztc2VydmljZWRhcnQ6X2J1aWx0aW5kYXJ0OmNsaV9wYXRjaFZtQ29uc3RhbnRzbGl0dGxlY2xvbmVkb1N1cGVyUmVzb2x1dGlvblRyYW5zZm9ybWVkIG1peGluIGFwcGxpY2F0aW9uc3JlcGxhY2VkRmllbGRzVHJhbnNmb3JtZWQgZmZpIGFubm90YXRpb25zcHJvZHVjdE1vZGVUcmFuc2Zvcm1lZCBhc3luYyBtZXRob2RzU3BlY2lhbGl6ZWQgbGlzdCBmYWN0b3JpZXNUcmFuc2Zvcm1lZCBsYXRlIHZhcmlhYmxlIGluaXRpYWxpemVyc0Fubm90YXRlZCBjYWxsIHNpdGVzVHJhbnNmb3JtZWQgYXN5bmMgZnVuY3Rpb25zX2luc3RhbnRpYXRlSW52b2NhdGlvbk1pcnJvcldpdGhUeXBlX2ZpeGVkTGVuZ3RoTGlzdF9pbnZvY2F0aW9uVHlwZXJ1bnRpbWUvdGVzdHMvdm0vZGFydF9Hcm93YWJsZUxpc3RfSW1tdXRhYmxlTGlzdF9JbnRlcm5hbExpbmtlZEhhc2hNYXBfSW1tdXRhYmxlTWFwLTEwNzM3NDE4MjRfU21pX0RvdWJsZV9Ud29CeXRlU3RyaW5nX09uZUJ5dGVTdHJpbmdsb2FkQ29tcG9uZW50RnJvbUJpbmFyeWxvYWRDb21wb25lbnRGcm9tQnl0ZXNsb2FkQ29tcG9uZW50U291cmNlRnJvbUJ5dGVzcmVhZENvbXBvbmVudFNvdXJjZXdyaXRlQ29tcG9uZW50VG9CaW5hcnlub25CbG9ja2luZ3dyaXRlTGlicmFyeVRvVGV4dHdyaXRlQ29tcG9uZW50VG9UZXh0SW1tdXRhYmxlcmVhc29uUmVxdWlyZWRfQWx3YXlzVGhyb3dzX0NoZWNrZWRfRXhwZXJpbWVudGFsX0ZhY3RvcnlfSXNUZXN0X0lzVGVzdEdyb3VwX0xpdGVyYWxfTXVzdENhbGxTdXBlcl9Ob25WaXJ0dWFsX09wdGlvbmFsVHlwZUFyZ3NfUHJvdGVjdGVkX1NlYWxlZF9WaXJ0dWFsX1Zpc2libGVGb3JPdmVycmlkaW5nX1Zpc2libGVGb3JUZXN0aW5nYWx3YXlzVGhyb3dzY2hlY2tlZGV4cGVyaW1lbnRhbGltbXV0YWJsZWlzVGVzdGlzVGVzdEdyb3VwbGl0ZXJhbG11c3RDYWxsU3VwZXJub25WaXJ0dWFsb3B0aW9uYWxUeXBlQXJnc3Byb3RlY3RlZHNlYWxlZHZpcnR1YWx2aXNpYmxlRm9yT3ZlcnJpZGluZ3Zpc2libGVGb3JUZXN0aW5na2VybmVsLnRyYW5zZm9ybWF0aW9ucy5hbmFseXNpc19EZXBlbmRlbmN5VHJhY2tlcl9kZXBlbmRlbnRJbnZvY2F0aW9uc2FkZERlcGVuZGVudEludm9jYXRpb25pbnZvY2F0aW9uaW52YWxpZGF0ZURlcGVuZGVudEludm9jYXRpb25zd29ya0xpc3QgICAtIENIQU5HRUQ6IGRpICAgICAtIGludmFsaWRhdGluZyBpbnZhbGlkYXRlSW52b2NhdGlvbl9fSW52b2NhdGlvbiZfRGVwZW5kZW5jeVRyYWNrZXImTGlua2VkTGlzdEVudHJ5X2xpc3RfbmV4dF9wcmV2aW91c3VubGlua191bmxpbmtpbnNlcnRBZnRlcl9pbnNlcnRCZWZvcmV1cGRhdGVGaXJzdGluc2VydEJlZm9yZV9JbnZvY2F0aW9uaW52YWxpZGF0ZWRSZXN1bHRpbnZhbGlkYXRpb25Db3VudGVydHlwZUNoZWNrc05lZWRlZGludmFsaWRhdGlvbkxpbWl0cmVzdWx0Rm9yUmVjdXJzaXZlSW52b2NhdGlvbl9JbnZvY2F0aW9uIF9wcm9jZXNzTm9TdWNoTWV0aG9kUHJvY2Vzc2luZyBub1N1Y2hNZXRob2QgZm9yIHJlY2VpdmVyIG5zbVNlbGVjdG9yb2JqZWN0Tm9TdWNoTWV0aG9kY2FsbEtpbmRDYWxsS2luZC5NZXRob2Ruc21BcmdzZnJvbVN0YXRpY1R5cGVuc21JbnZvY2F0aW9uX2ludm9jYXRpb25zQ2FjaGVnZXRJbnZvY2F0aW9ucHJvY2Vzc0ludm9jYXRpb25fRGlyZWN0SW52b2NhdGlvbmN1cnJlbnRJbnZvY2F0aW9uX3Byb2Nlc3NGaWVsZF9wcm9jZXNzRnVuY3Rpb25maWVsZFZhbHVlZ2V0RmllbGRWYWx1ZUNhbGxLaW5kLlByb3BlcnR5R2V0aXNHZXR0ZXJVc2VkQ2FsbEtpbmQuUHJvcGVydHlTZXRDYWxsS2luZC5TZXRGaWVsZEluQ29uc3RydWN0b3Jpc1NldHRlclVzZWRzZXR0ZXJBcmdzZXRWYWx1ZWFwcGx5Q2FsbHByb2Nlc3NJbW1lZGlhdGVseUNhbGxLaW5kLkZpZWxkSW5pdGlhbGl6ZXJpbml0aWFsaXplclJlc3VsdGdldFN1bW1hcnlhcHBseWlzSW5pdGlhbGl6ZWRVbmV4cGVjdGVkIGNhbGwga2luZCBtZW1iZXJBZ3JlZXNUb0NhbGxLaW5kX2FyZ3VtZW50c1ZhbGlkc3VtbWFyeVJlc3VsdF9pc1BlbmRpbmdfdGVhck9mZlRha2VucG9zaXRpb25hbEFyZ3VtZW50c3JlcXVpcmVkUGFyYW1ldGVyc19EaXNwYXRjaGFibGVJbnZvY2F0aW9uX2lzUG9seW1vcnBoaWNfY2FsbFNpdGVzX21vbm9tb3JwaGljVGFyZ2V0X21vbm9tb3JwaGljRGlyZWN0SW52b2NhdGlvbmtOb1N1Y2hNZXRob2RNYXJrZXJub1N1Y2hNZXRob2QmJl9ub3RpZnlDYWxsU2l0ZXNfY29sbGVjdFRhcmdldHNGb3JSZWNlaXZlclR5cGVObyB0YXJnZXRzLi4uX3NldE1vbm9tb3JwaGljVGFyZ2V0X3NldFBvbHltb3JwaGljcmVjZWl2ZXJUeXBlQnVpbGRlcnRvVHlwZWRpcmVjdFNlbGVjdG9yZGlyZWN0QXJnc2RpcmVjdEludm9jYXRpb25EaXNwYXRjaDogLCByZXN1bHQ6IF9tZXRob2RzQW5kU2V0dGVyc0NhbGxlZER5bmFtaWNhbGx5X2NhbGxlZFZpYVRoaXNfY2FsbGVkVmlhSW50ZXJmYWNlU2VsZWN0b3JfZ2V0dGVyc0NhbGxlZER5bmFtaWNhbGx5UG9zc2libGUgY2xvc3VyZSBjYWxsLCByZXN1bHQgaXMgZHluYW1pY2dldFRGQ2xhc3NOYXJyb3dlZCBkb3duIHJlY2VpdmVyIHR5cGU6IHNwZWNpYWxpemVUeXBlQ29uZV9jb2xsZWN0VGFyZ2V0c0ZvckNvbmNyZXRlVHlwZV9jb2xsZWN0VGFyZ2V0c0ZvclNlbGVjdG9yX2NvbGxlY3RUYXJnZXRzRm9yTnVsbCBmb3IgbnVsbCByZWNlaXZlcl9nZXRSZWNlaXZlclR5cGVCdWlsZGVyYWRkTnVsbCBmb3IgY29uY3JldGUgcmVjZWl2ZXIgYWRkQ29uY3JldGVUeXBlaGFzTm9uVHJpdmlhbE5vU3VjaE1ldGhvZEZvdW5kIG5vbi10cml2aWFsIG5vU3VjaE1ldGhvZCBmb3IgcmVjZWl2ZXIgRHluYW1pYyBzZWxlY3RvciAtIGFkZGluZyBub1N1Y2hNZXRob2QgZm9yIHJlY2VpdmVyIFRhcmdldCBpcyBub3QgZm91bmQgZm9yIHJlY2VpdmVyIGR5bmFtaWNUYXJnZXRTZXRnZXREeW5hbWljVGFyZ2V0U2V0aXNPYmplY3RNZW1iZXJhZGRDYWxsU2l0ZV9ub3RpZnlDYWxsU2l0ZWlzUG9seW1vcnBoaWNzZXRQb2x5bW9ycGhpY2FkZFRhcmdldHNldFVzZUNoZWNrZWRFbnRyeV9SZWNlaXZlclR5cGVCdWlsZGVyX251bGxhYmxlX1NlbGVjdG9yQXBwcm94aW1hdGlvbm1heEludm9jYXRpb25zUGVyU2VsZWN0b3JhcHByb3hpbWF0aW9uX0ludm9jYXRpb25zQ2FjaGVfaW52b2NhdGlvbnNfYXBwcm94aW1hdGlvbnNzYXJhd0FyZ3NzdW1tYXJ5Q29sbGVjdG9ycmF3QXJndW1lbnRzYWRkZWRfRmllbGRWYWx1ZXR5cGVHdWFyZFN1bW1hcnl0eXBlc0J1aWxkZXJfaXNEZWZhdWx0VmFsdWVPZkZpZWxkT2JzZXJ2YWJsZWNvbnN0cmVuc3VyZUluaXRpYWxpemVkaW5pdGlhbGl6ZXJJbnZvY2F0aW9ubmFycm93ZWROZXdWYWx1ZXNwZWNpYWxpemVpc1NwZWNpYWxpemVkU2V0IGZpZWxkICB2YWx1ZSBfRmllbGRWYWx1ZSAgPT4gX0R5bmFtaWNUYXJnZXRTZXRfVEZDbGFzc0ltcGxfYWxsb2NhdGVkU3VidHlwZXNkZXBlbmRlbmN5VHJhY2tlcl9jb25jcmV0ZVR5cGVfc3BlY2lhbGl6ZWRDb25lVHlwZWNvbmNyZXRlVHlwZXNwZWNpYWxpemVkQ29uZVR5cGVfY2FsY3VsYXRlQ29uZVR5cGVTcGVjaWFsaXphdGlvbm51bVN1YlR5cGVzYWRkQWxsb2NhdGVkU3VidHlwZXN1YlR5cGUge3N1cGVyczogR2VuZXJpY0ludGVyZmFjZXNJbmZvSW1wbHN1cGVydHlwZU9mZnNldHNDYWNoZWNhY2hlZEZsYXR0ZW5lZFR5cGVBcmdzY2FjaGVkRmxhdHRlbmVkVHlwZUFyZ3NGb3JOb25HZW5lcmljY2xvc2VkVHlwZVRyYW5zbGF0b3JmbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9ydXNlQ2FjaGVjYWNoZWRmbGF0dGVuZWRUeXBlQXJndW1lbnRzaW50ZmdlbmVyaWNJbnRlcmZhY2VPZmZzZXRGb3JpZmFjZXBhaXJJbnZhbGlkIGNhbGwgdG8gZ2VuZXJpY0ludGVyZmFjZU9mZnNldEZvci5mbGF0dGVuZWRUeXBlQXJndW1lbnRzRm9yTm9uR2VuZXJpY3RyYW5zbGF0ZWR0cmFuc2xhdGVfQ2xhc3NIaWVyYXJjaHlDYWNoZWFsbG9jYXRlZENsYXNzZXNfc2VhbGVkX2NsYXNzSWRDb3VudGVyX2R5bmFtaWNUYXJnZXRzX2NyZWF0ZVRGQ2xhc3NzdXBhZGRBbGxvY2F0ZWRDbGFzc2NsY2xhc3NJbXBsdGFyZ2V0U2V0X2FkZER5bmFtaWNUYXJnZXRzZWFsaXNTdWJ0eXBlaXNTdWJ0eXBlIGZvciBzdWIgPSAsIHN1cCA9IHN1YkNsYXNzRGF0YXN1cGVyQ2xhc3NEYXRhYmFzZUNsYXNzc3BlY2lhbGl6ZVR5cGVDb25lIGZvciBfY3JlYXRlRHluYW1pY1RhcmdldFNldGlzT2JqZWN0TWV0aG9kQ2xhc3NIaWVyYXJjaHlDYWNoZSB7CiAgYWxsb2NhdGVkIGNsYXNzZXM6CiAgICAgIGNsYXNzZXM6Cl9Xb3JrTGlzdHBlbmRpbmdwcm9jZXNzaW5nY2FsbFN0YWNrZW5xdWV1ZUludm9jYXRpb25QUk9DRVNTSU5HIEVORCBQUk9DRVNTSU5HICwgUkVTVUxUIEFscmVhZHkga25vd24gdHlwZSBmb3IgcmVjdXJzaXZlIGludm9jYXRpb246IHN0YXRpY1JldHVyblR5cGVBcHByb3hpbWF0ZWQgcmVjdXJzaXZlIGludm9jYXRpb24gd2l0aCBzdGF0aWMgdHlwZSBUeXBlRmxvd0FuYWx5c2lzYW5ub3RhdGlvbk1hdGNoZXJfZ2VuZXJpY0ludGVyZmFjZXNJbmZvX3N1bW1hcmllc19maWVsZFZhbHVlc2NyZWF0ZVN1bW1hcnlzZXR0ZXJTdW1tYXJ5ZmllbGRTdW1tYXJ5VHlwZUZpZWxkU3VtbWFyeVR5cGUua0ZpZWxkR3VhcmRjYWxsU2l0ZXNjYXN0ZXhwbGljaXRDYXN0c0FQUExZIHR5cGVDaGVja1RyaWdnZXJlZGFkZERpcmVjdEZpZWxkQWNjZXNzQUREIFJBVyBDQUxMOiBBREQgQUxMT0NBVEVEIENMQVNTOiByZWNvcmRNZW1iZXJDYWxsZWRWaWFJbnRlcmZhY2VTZWxlY3RvcnJlY29yZE1lbWJlckNhbGxlZFZpYVRoaXN2bS50cmFuc2Zvcm1hdGlvbnMudHlwZV9mbG93LmNhbGxzQ2FsbEtpbmRTZXRGaWVsZEluQ29uc3RydWN0b3JfY2FsbEtpbmRQcmVmaXhnZXQgc2V0IGluaXQgRGlyZWN0U2VsZWN0b3JkaXJlY3QgSW50ZXJmYWNlU2VsZWN0b3JWaXJ0dWFsU2VsZWN0b3J2aXJ0dWFsIER5bmFtaWNTZWxlY3RvcmtDYWxsZHluYW1pYyBBcmdzd2l0aFJlY2VpdmVybmFtZWRDb3VudHZtLnRyYW5zZm9ybWF0aW9ucy50eXBlX2Zsb3cuc3VtbWFyeUNhbGxIYW5kbGVyZ2V0Q29tcHV0ZWRUeXBlY29tcHV0ZWRUeXBlc3R5cGVIaWVyYXJjaHljYWxsSGFuZGxlcnZpc2l0RGVmYXVsdHZpc2l0UGFyYW1ldGVydmlzaXROYXJyb3d2aXNpdEpvaW52aXNpdFVzZXZpc2l0Q2FsbHZpc2l0RXh0cmFjdHZpc2l0Q3JlYXRlQ29uY3JldGVUeXBldmlzaXRDcmVhdGVSdW50aW1lVHlwZXZpc2l0VHlwZUNoZWNrUGFyYW1ldGVyc3RhdGljVHlwZUZvck5hcnJvd2luZ19hcmd1bWVudFR5cGUgPSBfUGFyYW1ldGVyICMgW1VuYWJsZSB0byBhcHBseSBfUGFyYW1ldGVyYXJndW1lbnRUeXBlX29ic2VydmVBcmd1bWVudFR5cGVOYXJyb3cgPSBfTmFycm93IChKb2luID0gX0pvaW4gW10gKFVzZSA9IF9Vc2UgKFVzZSBzdGF0ZW1lbnRzIHNob3VsZCBiZSByZW1vdmVkIGR1cmluZyBzdW1tYXJ5IG5vcm1hbGl6YXRpb25DYWxsc3RhdGljUmVzdWx0VHlwZV9yZXN1bHRUeXBla01vbm9tb3JwaGlja1BvbHltb3JwaGlja051bGxhYmxlUmVjZWl2ZXJrUmVzdWx0VXNlZGtSZWFjaGFibGVrVXNlQ2hlY2tlZEVudHJ5a1JlY2VpdmVyTWF5QmVJbnQgPSBfQ2FsbCBPcHRpbWl6ZWQgY2FsbCB3aXRoIGVtcHR5IGFyZ3NldFJlYWNoYWJsZV9vYnNlcnZlUmVjZWl2ZXJUeXBlX29ic2VydmVSZXN1bHRUeXBlaXNNb25vbW9ycGhpY3NldFJlc3VsdFVzZWRyZWNlaXZlckludEludGVyc2VjdGludFR5cGVFeHRyYWN0cmVmZXJlbmNlQ2xhc3NwYXJhbUluZGV4ID0gX0V4dHJhY3QgKF0pZXh0cmFjdGVkVHlwZWV4dHJhY3RUeXBlaW50ZXJmYWNlT2Zmc2V0ZXh0cmFjdENyZWF0ZUNvbmNyZXRlVHlwZSA9IF9DcmVhdGVDb25jcmV0ZVR5cGUgKCBAIGhhc1J1bnRpbWVUeXBlY29tcHV0ZWRDcmVhdGVSdW50aW1lVHlwZSA9IF9DcmVhdGVSdW50aW1lVHlwZSAoVHlwZUNoZWNraXNUZXN0ZWRPbmx5T25DaGVja2VkRW50cnlQb2ludCA9IF9UeXBlQ2hlY2sgKCBhZ2FpbnN0ICAoZm9yIGNoZWNrVHlwZWNhblNraXBpc1N1YnR5cGVPZlJ1bnRpbWVUeXBlcmVwcmVzZW50ZWRUeXBlUmF3Q2Fubm90IHNlZSAgb24gUkhTIG9mIFR5cGVDaGVjay5UeXBlQ2hlY2sgb2YgIGZhaWxlZC5TdW1tYXJ5cGFyYW1ldGVyQ291bnRwb3NpdGlvbmFsUGFyYW1ldGVyQ291bnRfc3RhdGVtZW50c29wUkVTVUxUOiBwb3NpdGlvbmFsQXJnQ291bnRuYW1lZEFyZ0NvdW50YXJnSW5kZXhFVkFMIFJFU1VMVCBUYWJsZVNlbGVjdG9yQXNzaWduZXJfbWV0aG9kU2VsZWN0b3JJZF9nZXR0ZXJTZWxlY3RvcklkX3NldHRlclNlbGVjdG9ySWRfbmV4dFNlbGVjdG9ySWRfc2VsZWN0b3JJZEZvck1hcFVuZXhwZWN0ZWQgcHJvY2VkdXJlIGtpbmQgJ1VuZXhwZWN0ZWQgbWVtYmVyIGtpbmQgJ3ZtLnRyYW5zZm9ybWF0aW9ucy50eXBlX2Zsb3cudHlwZXNURkNsYXNzR2VuZXJpY0ludGVyZmFjZXNJbmZvVHlwZXNCdWlsZGVyUnVudGltZVR5cGVUcmFuc2xhdG9yaW5zdGFudGlhdGVDb25jcmV0ZVR5cGVUeXBlSGllcmFyY2h5X2NhY2hlZEludFR5cGVUeXBlRXhwcm51bGxhYmxlQW55b3JkZXJUeXBlT3JkZXJUeXBlT3JkZXIuUnVudGltZVR5cGVUeXBlT3JkZXIuRW1wdHlUeXBlT3JkZXIuTnVsbGFibGVUeXBlT3JkZXIuQW55VHlwZU9yZGVyLlNldFR5cGVPcmRlci5Db25lVHlwZU9yZGVyLkNvbmNyZXRlUnVudGltZVR5cGVFbXB0eU51bGxhYmxlQW55Q29uZUNvbmNyZXRlRW1wdHlUeXBlX1Qge31OdWxsYWJsZVR5cGVBbnlUeXBlX1QgQU5ZU2V0VHlwZV9UIF91bmlvbkxpc3RzdHlwZXMxdHlwZXMydDF0MmlkMWlkMnJhd19pbnRlcnNlY3RMaXN0c2ludGVyc2VjdENvbmVUeXBlX1QgKCkrQ29uY3JldGVUeXBldHlwZUFyZ3NfbGhzdXNhYmxlVHlwZUFyZ3NtZXJnZWRUeXBlQXJnc21lcmdlZG1lcmdlZENvbnN0YW50cHR0eXBlQXJnc1N0cnNfVFMgez59RVJST1I6IFJ1bnRpbWVUeXBlIGRvZXMgbm90IHN1cHBvcnQgaXNTcGVjaWFsaXplZC5FUlJPUjogUnVudGltZVR5cGUgZG9lcyBub3Qgc3VwcG9ydCBpc1N1YnR5cGVPZi5FUlJPUjogUnVudGltZVR5cGUgZG9lcyBub3Qgc3VwcG9ydCB1bmlvbi5FUlJPUjogUnVudGltZVR5cGUgY2Fubm90IGludGVyc2VjdCB3aXRoIEVSUk9SOiBSdW50aW1lVHlwZSBkb2VzIG5vdCBzdXBwb3J0IHNwZWNpYWxpemUuRVJST1I6IENvbmNyZXRlQ2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBnZXRDb25jcmV0ZUNsYXNzLnZtLnRyYW5zZm9ybWF0aW9ucy50eXBlX2Zsb3cudXRpbHNfTG9nZ2VybG9nc2NvcGVDaGFuZ2VfU2NvcGVkTG9nZ2VyX3Njb3BlRGVsaW1pdGVy4pSDX3Jlc2V0G1swbV9jb2xvcnMbWzM3bRtbMzFtG1szMm0bWzMzbRtbMzRtG1szNW0bWzM2bV9zY29wZUluZGVudF9zY29wZV9zY29wZVByZWZpeGVzX3ByaW50X1NpbXBsZUxvZ2dlclN0YXRpc3RpY3NzdW1tYXJpZXNDcmVhdGVkc3VtbWFyaWVzQW5hbHl6ZWRqb2luc0FwcHJveGltYXRlZFRvQnJlYWtMb29wc2ludm9jYXRpb25zUHJvY2Vzc2VkdXNlZENhY2hlZFJlc3VsdHNPZkludm9jYXRpb25zaW52b2NhdGlvbnNJbnZhbGlkYXRlZG1heEludmFsaWRhdGlvbnNQZXJJbnZvY2F0aW9ucmVjdXJzaXZlSW52b2NhdGlvbnNBcHByb3hpbWF0ZWR0eXBlQ29uZVNwZWNpYWxpemF0aW9uc2l0ZXJhdGlvbnNPdmVySW52b2NhdGlvbnNXb3JrTGlzdGludm9jYXRpb25zSW52YWxpZGF0ZWREdXJpbmdQcm9jZXNzaW5naW52b2NhdGlvbnNRdWVyaWVkSW5DYWNoZWludm9jYXRpb25zQWRkZWRUb0NhY2hlbWF4SW52b2NhdGlvbnNDYWNoZWRQZXJTZWxlY3RvcmFwcHJveGltYXRlSW52b2NhdGlvbnNDcmVhdGVkYXBwcm94aW1hdGVJbnZvY2F0aW9uc1VzZWRjbGFzc2VzRHJvcHBlZG1lbWJlcnNEcm9wcGVkbWV0aG9kQm9kaWVzRHJvcHBlZGZpZWxkSW5pdGlhbGl6ZXJzRHJvcHBlZGNvbnN0cnVjdG9yQm9kaWVzRHJvcHBlZGNhbGxzRHJvcHBlZHRocm93RXhwcmVzc2lvbnNQcnVuZWRwcmludGNhcHRpb246CiAgICAgc3VtbWFyaWVzIGNyZWF0ZWQKICAgICBzdW1tYXJpZXMgYW5hbHl6ZWQKICAgICBqb2lucyBhcmUgYXBwcm94aW1hdGVkIHRvIGJyZWFrIGxvb3BzCiAgICAgaW52b2NhdGlvbnMgcHJvY2Vzc2VkCiAgICAgdGltZXMgY2FjaGVkIHJlc3VsdCBvZiBpbnZvY2F0aW9uIGlzIHVzZWQKICAgICBpbnZvY2F0aW9ucyBpbnZhbGlkYXRlZAogICAgIG1heGltdW0gaW52YWxpZGF0aW9ucyBwZXIgaW52b2NhdGlvbgogICAgIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucyBhcHByb3hpbWF0ZWQKICAgICB0eXBlIGNvbmVzIHNwZWNpYWxpemVkCiAgICAgaXRlcmF0aW9ucyBvdmVyIGludm9jYXRpb25zIHdvcmsgbGlzdAogICAgIGludm9jYXRpb25zIGludmFsaWRhdGVkIGR1cmluZyBwcm9jZXNzaW5nCiAgICAgaW52b2NhdGlvbnMgcXVlcmllZCBpbiBjYWNoZQogICAgIGludm9jYXRpb25zIGFkZGVkIHRvIGNhY2hlCiAgICAgbWF4aW11bSBpbnZvY2F0aW9ucyBjYWNoZWQgcGVyIHNlbGVjdG9yCiAgICAgYXBwcm94aW1hdGUgaW52b2NhdGlvbnMgY3JlYXRlZAogICAgIHRpbWVzIGFwcHJveGltYXRlIGludm9jYXRpb24gaXMgdXNlZAogICAgIGNsYXNzZXMgZHJvcHBlZAogICAgIG1lbWJlcnMgZHJvcHBlZAogICAgIG1ldGhvZCBib2RpZXMgZHJvcHBlZAogICAgIGZpZWxkIGluaXRpYWxpemVycyBkcm9wcGVkCiAgICAgY29uc3RydWN0b3IgYm9kaWVzIGRyb3BwZWQKICAgICBjYWxscyBkcm9wcGVkCiAgICAgdGhyb3cgZXhwcmVzc2lvbnMgcHJ1bmVkCiAgICBTdWJ0eXBlUGFpcmtQcmludFRyYWNla1ByaW50RGVidWdrUHJpbnRTdGF0c2tSZW1vdmVBc3NlcnRza1Njb3BlVHJhY2VrU2NvcGVJbmRlbnRfbG9nZ2Vya0hhc2hNYXNrYXNzZXJ0eGNvbmRBc3NlcnRpb24gZmFpbGVkLiBEZXRhaWxzOiB0cmFjZVByaW50ZGVidWdQcmludHN0YXRQcmludGhhc1JlY2VpdmVyQXJnaXNTb3J0ZWRmaW5kTmFtZWRQYXJhbWV0ZXJ0eXBlQXJndW1lbnRzSGFzaGZpbmRPdmVybGFwdm0udHJhbnNmb3JtYXRpb25zLnByYWdtYVBhcnNlZFByYWdtYVByYWdtYUVudHJ5UG9pbnRUeXBlUHJhZ21hRW50cnlQb2ludFR5cGUuRGVmYXVsdFByYWdtYUVudHJ5UG9pbnRUeXBlLkdldHRlck9ubHlQcmFnbWFFbnRyeVBvaW50VHlwZS5TZXR0ZXJPbmx5UHJhZ21hRW50cnlQb2ludFR5cGUuQ2FsbE9ubHlEZWZhdWx0R2V0dGVyT25seVNldHRlck9ubHlDYWxsT25seVBhcnNlZEVudHJ5UG9pbnRQcmFnbWFQYXJzZWRSZXN1bHRUeXBlQnlUeXBlUHJhZ21hcmVzdWx0VHlwZVVzZXNQYXNzZWRUeXBlQXJndW1lbnRzUGFyc2VkUmVzdWx0VHlwZUJ5UGF0aFByYWdtYVBhcnNlZE5vbk51bGxhYmxlUmVzdWx0VHlwZVByYWdtYUFubm90YXRpb25QYXJzZXJDb25zdGFudFByYWdtYUFubm90YXRpb25QYXJzZXJwcmFnbWFDb25zdGFudEVycm9yOiB1bmV2YWx1YXRlZCBjb25zdGFudCBFcnJvcjogbm9uLWNvbnN0YW50IGFubm90YXRpb24gdm06ZW50cnktcG9pbnRFcnJvcjogc3RyaW5nIGRpcmVjdGl2ZSB0byBAcHJhZ21hKCcnLCAuLi4pIG11c3QgYmUgZWl0aGVyICdnZXQnIG9yICdzZXQnIGZvciBmaWVsZHMgb3IgJ2dldCcgb3IgJ2NhbGwnIGZvciBwcm9jZWR1cmVzLnZtOmV4YWN0LXJlc3VsdC10eXBlcmVzdWx0LXR5cGUtdXNlcy1wYXNzZWQtdHlwZS1hcmd1bWVudHNFUlJPUjogVW5zdXBwb3J0ZWQgb3B0aW9uIHRvICcnIHByYWdtYTogdm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBla0VudHJ5UG9pbnRQcmFnbWFOYW1la0V4YWN0UmVzdWx0VHlwZVByYWdtYU5hbWVrTm9uTnVsbGFibGVSZXN1bHRUeXBla1Jlc3VsdFR5cGVVc2VzUGFzc2VkVHlwZUFyZ3VtZW50c3ZtLm1ldGFkYXRhLnVucmVhY2hhYmxlVW5yZWFjaGFibGVOb2RlVW5yZWFjaGFibGVOb2RlTWV0YWRhdGFSZXBvc2l0b3J5dm0udW5yZWFjaGFibGUubWV0YWRhdGF2bS5tZXRhZGF0YS5jYWxsX3NpdGVfYXR0cmlidXRlc0NhbGxTaXRlQXR0cmlidXRlc01ldGFkYXRhcmVjZWl2ZXJUeXBlOkNhbGxTaXRlQXR0cmlidXRlc01ldGFkYXRhUmVwb3NpdG9yeXZtLmNhbGwtc2l0ZS1hdHRyaWJ1dGVzLm1ldGFkYXRhd3JhcFRleHRoYW5naW5nSW5kZW50c3BsaXRUZXh0dHJpbW1lZFRleHR0cmltTGVmdGxlYWRpbmdXaGl0ZXNwYWNlbm90SW5kZW50ZWRmaXJzdExpbmVXcmFwaGFuZ2luZ0luZGVudFN0cmluZ3dyYXBUZXh0QXNMaW5lc2lzV2hpdGVzcGFjZXJ1bmVlZmZlY3RpdmVMZW5ndGhjdXJyZW50TGluZVN0YXJ0bGFzdFdoaXRlc3BhY2VfTUVSR0VfU09SVF9MSU1JVGJpbmFyeVNlYXJjaHNvcnRlZExpc3Rjb21wbG93ZXJCb3VuZHNodWZmbGVyYW5kb21uZXh0SW50dG1wMXJldmVyc2VfcmV2ZXJzZXRtcGluc2VydGlvblNvcnRtZXJnZVNvcnRtaWRkbGVzY3JhdGNoU3BhY2VmaXJzdFRhcmdldF9tb3ZpbmdJbnNlcnRpb25Tb3J0dGFyZ2V0T2Zmc2V0X21lcmdlU29ydHRhcmdldE1pZGRsZV9tZXJnZWZpcnN0TGlzdGZpcnN0U3RhcnRmaXJzdEVuZHNlY29uZExpc3RzZWNvbmRTdGFydHNlY29uZEVuZGN1cnNvcjFjdXJzb3IyZmlyc3RFbGVtZW50c2Vjb25kRWxlbWVudF9DYW5vbmljYWxpemVLX0lzVmFsaWRLZXlDYW5vbmljYWxpemVkTWFwVl9jYW5vbmljYWxpemVfaXNWYWxpZEtleUZuX2Jhc2VjYW5vbmljYWxpemVpc1ZhbGlkS2V5X2lzVmFsaWRLZXlhZGRFbnRyaWVzSzJWMmNvbnRhaW5zVmFsdWVpZkFic2VudHRlc3RyZXR5cGV1cGRhdGVBbGx7Li4ufWtfdG9TdHJpbmdWaXNpdGluZ19pc1RvU3RyaW5nVmlzaXRpbmdDb21iaW5lZEl0ZXJhYmxlVmlld19pdGVyYWJsZXNmb2xkX0NvbWJpbmVkSXRlcmF0b3JfaXRlcmF0b3JzQ29tYmluZWRMaXN0Vmlld19saXN0c190aHJvd0Nhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIExpc3Rpbml0aWFsSW5kZXhyZXRhaW5XaGVyZUNvbWJpbmVkTWFwVmlld19tYXBzX3plcm9fdXBwZXJDYXNlQV91cHBlckNhc2VaX2xvd2VyQ2FzZUFfbG93ZXJDYXNlWl9hc2NpaUNhc2VCaXRlcXVhbHNJZ25vcmVBc2NpaUNhc2VhQ2hhcmJDaGFyYUNoYXJMb3dlckNhc2VoYXNoSWdub3JlQXNjaWlDYXNlY2hhcmNvbXBhcmVBc2NpaVVwcGVyQ2FzZWRlZmF1bHRSZXN1bHRhVXBwZXJDYXNlYlVwcGVyQ2FzZXNpZ25jb21wYXJlQXNjaWlMb3dlckNhc2VhTG93ZXJDYXNlYkxvd2VyQ2FzZWNvbXBhcmVOYXR1cmFsY29tcGFyZUFzY2lpTG93ZXJDYXNlTmF0dXJhbGNvbXBhcmVBc2NpaVVwcGVyQ2FzZU5hdHVyYWxfY29tcGFyZU5hdHVyYWxseWFJc0RpZ2l0YklzRGlnaXRfY29tcGFyZU51bWVyaWNhbGx5YUluZGV4YkluZGV4X2NvbXBhcmVEaWdpdENvdW50X2lzRGlnaXRjaGFyQ29kZV9pc05vblplcm9OdW1iZXJTdWZmaXhfR2V0S2V5RkVxdWFsaXR5I3R5cGVBcmcwZTFlMkVxdWFsaXR5QnlfZ2V0S2V5X2lubmVyZ2V0S2V5RGVmYXVsdEVxdWFsaXR5SWRlbnRpdHlFcXVhbGl0eUl0ZXJhYmxlRXF1YWxpdHlfZWxlbWVudEVxdWFsaXR5ZWxlbWVudEVxdWFsaXR5ZWxlbWVudHMxZWxlbWVudHMyaXQxaXQyaGFzTmV4dExpc3RFcXVhbGl0eWxpc3QxbGlzdDJfVW5vcmRlcmVkRXF1YWxpdHljb3VudHNVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5U2V0RXF1YWxpdHlfTWFwRW50cnllcXVhbGl0eV9rZXlFcXVhbGl0eV92YWx1ZUVxdWFsaXR5TWFwRXF1YWxpdHltYXAxbWFwMmVxdWFsRWxlbWVudENvdW50c2tleUhhc2h2YWx1ZUhhc2hNdWx0aUVxdWFsaXR5X2VxdWFsaXRpZXNlcXVhbGl0aWVzZXFEZWVwQ29sbGVjdGlvbkVxdWFsaXR5X3Vub3JkZXJlZENhc2VJbnNlbnNpdGl2ZUVxdWFsaXR5c3RyaW5nMXN0cmluZzJfSEFTSF9NQVNLRXF1YWxpdHlNYXBFcXVhbGl0eVNldG1hcE1hcEsxVjFtYXBLZXltYXBWYWx1ZW1lcmdlTWFwc2dyb3VwQnlTbWluQnlvcmRlckJ5bWluVmFsdWVtaW5PcmRlckJ5ZWxlbWVudE9yZGVyQnltYXhCeW1heFZhbHVlbWF4T3JkZXJCeXRyYW5zaXRpdmVDbG9zdXJlZ3JhcGh2ZXJ0ZXhlZGdlc3ZlcnRleDF2ZXJ0ZXgydmVydGV4M3N0cm9uZ2x5Q29ubmVjdGVkQ29tcG9uZW50c3N0YWNraW5kaWNlc2xvd0xpbmtzb25TdGFja3N0cm9uZ0Nvbm5lY3RzdWNjZXNzb3JuZWlnaGJvckl0ZXJhYmxlWmlwaXRlcmFibGVzaXRlcmF0b3JzX0l0ZXJhdG9yWmlwUHJpb3JpdHlRdWV1ZXJlbW92ZUZpcnN0SGVhcFByaW9yaXR5UXVldWVfSU5JVElBTF9DQVBBQ0lUWV9xdWV1ZV9sb2NhdGVObyBzdWNoIGVsZW1lbnRfcmVtb3ZlTGFzdF9idWJibGVVcF9idWJibGVEb3dubGVmdENoaWxkUG9zaXRpb25wYXJlbnRJbmRleHJpZ2h0Q2hpbGRJbmRleGxlZnRDaGlsZEluZGV4bGVmdENoaWxkcmlnaHRDaGlsZG1pbkNoaWxkSW5kZXhtaW5DaGlsZG5ld0NhcGFjaXR5bmV3UXVldWVfUXVldWVMaXN0Jk9iamVjdCZMaXN0TWl4aW5lbGVtZW50QXRmb2xsb3dlZEJ5bGFzdFdoZXJlbWF0Y2htYXRjaEZvdW5kd3JpdGVBbGx3aGVyZVR5cGVpbml0aWFsVmFsdWVza2lwV2hpbGV0YWtlV2hpbGVfY2xvc2VHYXBfZmlsdGVycmV0YWluTWF0Y2hpbmdyZXRhaW5lZF9jb21wYXJlQW55YXNNYXBsaXN0TGVuZ3RoZmlsbHNraXBDb3VudG90aGVyTGlzdG90aGVyU3RhcnRyZXBsYWNlUmFuZ2VuZXdDb250ZW50c3JlbW92ZUxlbmd0aGluc2VydExlbmd0aGluc2VydEVuZGxhc3RJbmRleFdoZXJlaW5zZXJ0aW5zZXJ0QWxsaW5zZXJ0aW9uTGVuZ3Roc2V0QWxsUXVldWVMaXN0X3RhYmxlX2hlYWRfdGFpbGluaXRpYWxDYXBhY2l0eV9jYXN0RnJvbXF1ZXVlc291cmNlTGlzdGFkZENvdW50X3ByZUdyb3dlbmRTcGFjZXByZVNwYWNlYWRkTGFzdGFkZEZpcnN0Tm8gZWxlbWVudExlbmd0aCAgbWF5IG5vdCBiZSBuZWdhdGl2ZS5uZXdUYWlsSW5kZXggIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi5faXNQb3dlck9mMm51bWJlcl9uZXh0UG93ZXJPZjJuZXh0TnVtYmVybmV3VGFibGVfd3JpdGVUb0xpc3RmaXJzdFBhcnRTaXplbmV3RWxlbWVudENvdW50X0Nhc3RRdWV1ZUxpc3RfVW5pb25TZXQmU2V0QmFzZSZVbm1vZGlmaWFibGVTZXRNaXhpbkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIFNldHJldGFpbkFsbFVuaW9uU2V0X3NldHNfZGlzam9pbnRkaXNqb2ludF9pdGVyYWJsZV9kZWR1cEl0ZXJhYmxlc2VlblVuaW9uU2V0Q29udHJvbGxlcl9zZXRVbm1vZGlmaWFibGVMaXN0Vmlld1VubW9kaWZpYWJsZU1hcFZpZXdfTm9uR3Jvd2FibGVMaXN0VmlldyZEZWxlZ2F0aW5nTGlzdCZOb25Hcm93YWJsZUxpc3RNaXhpbkNhbm5vdCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhIGZpeGVkLWxlbmd0aCBsaXN0Tm9uR3Jvd2FibGVMaXN0Vmlld2xpc3RCYXNlTm9uR3Jvd2FibGVMaXN0TWl4aW5fVW5tb2RpZmlhYmxlU2V0VmlldyZEZWxlZ2F0aW5nU2V0JlVubW9kaWZpYWJsZVNldE1peGluVW5tb2RpZmlhYmxlU2V0Vmlld3NldEJhc2VVbm1vZGlmaWFibGVTZXRNaXhpblVubW9kaWZpYWJsZU1hcE1peGluQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgTWFwX0tleUZvclZhbHVlX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2VEZWxlZ2F0aW5nSXRlcmFibGV0eXBlZFVzZSBpdGVyYWJsZS5jYXN0PEU+IGluc3RlYWQuRGVsZWdhdGluZ0xpc3RVc2UgbGlzdC5jYXN0PEU+IGluc3RlYWQuX2xpc3RCYXNlZmlsbFZhbHVlRGVsZWdhdGluZ1NldFVzZSBzZXQuY2FzdDxFPiBpbnN0ZWFkLl9zZXRCYXNlY29udGFpbnNBbGxkaWZmZXJlbmNlRGVsZWdhdGluZ1F1ZXVlVXNlIHF1ZXVlLmNhc3Q8RT4gaW5zdGVhZC5fYmFzZVF1ZXVlRGVsZWdhdGluZ01hcFVzZSBtYXAuY2FzdDxLLCBWPiBpbnN0ZWFkLl9NYXBLZXlTZXQmX0RlbGVnYXRpbmdJdGVyYWJsZUJhc2UmVW5tb2RpZmlhYmxlU2V0TWl4aW5NYXBLZXlTZXRfYmFzZU1hcE1hcEtleVNldCBkb2Vzbid0IHN1cHBvcnQgbG9va3VwKCkuTWFwVmFsdWVTZXRfa2V5Rm9yVmFsdWVrZXlGb3JWYWx1ZXRvUmVtb3ZldmFsdWVzVG9SZXRhaW5rZXlzVG9SZW1vdmVBY2N1bXVsYXRvclNpbmtfZXZlbnRzaXNDbG9zZWRDYW4ndCBhZGQgdG8gYSBjbG9zZWQgc2luay5CeXRlQWNjdW11bGF0b3JTaW5rY29udmVydC5oZXhoZXhFbmNvZGVyaGV4RGVjb2RlckhleENvZGVjZGVjb2RlcmhleF9JZGVudGl0eUNvbnZlcnRlcklkZW50aXR5Q29kZWNmdXNlY29udmVydC5wZXJjZW50cGVyY2VudEVuY29kZXJwZXJjZW50RGVjb2RlclBlcmNlbnRDb2RlY3BlcmNlbnRTdHJpbmdBY2N1bXVsYXRvclNpbmtfZmVfYW5hbHl6ZXJfc2hhcmVkLm1lc3NhZ2VzLmNvZGVzSnNvbkVuY29kZXJUb2tlbmlzV2luZG93c3V0aWxyZWxhdGl2aXplVXJpY29kZXNfZ2VuZXJhdGVkLmRhcnRTdW1tYXJ5VGVtcGxhdGV0ZW1wbGF0ZWFuYWx5emVyQ29kZXNNZXNzYWdlW01lc3NhZ2VDb2RlVGVtcGxhdGVtZXNzYWdlVGVtcGxhdGV0aXBUZW1wbGF0ZW1lc3NhZ2VPYmplY3Rsb2NhdGVkTWVzc2FnZTpzeW5jX29wdG9Kc29udG9Kc29uU3RyaW5nZnJvbUpzb25qc29uU3RyaW5ndGVtcGxhdGVBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvblRoZSBjbGFzcyAnI25hbWUnIGlzIGFic3RyYWN0IGFuZCBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuY29kZUFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25ORVdfV0lUSF9BQlNUUkFDVF9DTEFTU2NvZGVBYnN0cmFjdENsYXNzTWVtYmVyTWVtYmVycyBvZiBjbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdhYnN0cmFjdCcuVHJ5IHJlbW92aW5nIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQuIFlvdSBjYW4gYWRkIHRoZSAnYWJzdHJhY3QnIGtleXdvcmQgYmVmb3JlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi5BYnN0cmFjdENsYXNzTWVtYmVybWVzc2FnZUFic3RyYWN0Q2xhc3NNZW1iZXJjb2RlQWJzdHJhY3ROb3RTeW5jQWJzdHJhY3QgbWV0aG9kcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicuQWJzdHJhY3ROb3RTeW5jTk9OX1NZTkNfQUJTVFJBQ1RfTUVUSE9EbWVzc2FnZUFic3RyYWN0Tm90U3luY3RlbXBsYXRlQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uRmFjdG9yeSByZWRpcmVjdHMgdG8gY2xhc3MgJyNuYW1lJywgd2hpY2ggaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC5jb2RlQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uQWJzdHJhY3RSZWRpcmVjdGVkQ2xhc3NJbnN0YW50aWF0aW9uRkFDVE9SWV9SRURJUkVDVFNfVE9fQUJTVFJBQ1RfQ0xBU1N0ZW1wbGF0ZUFjY2Vzc0Vycm9yQWNjZXNzIGVycm9yOiAnI25hbWUnLmNvZGVBY2Nlc3NFcnJvckFjY2Vzc0Vycm9yY29kZUFubm90YXRpb25PbkZ1bmN0aW9uVHlwZVR5cGVWYXJpYWJsZUEgdHlwZSB2YXJpYWJsZSBvbiBhIGZ1bmN0aW9uIHR5cGUgY2FuJ3QgaGF2ZSBhbm5vdGF0aW9ucy5Bbm5vdGF0aW9uT25GdW5jdGlvblR5cGVUeXBlVmFyaWFibGVtZXNzYWdlQW5ub3RhdGlvbk9uRnVuY3Rpb25UeXBlVHlwZVZhcmlhYmxlY29kZUFub255bW91c0JyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ2FuJ3QgYnJlYWsgdG8gYSB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uQW5vbnltb3VzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25MQUJFTF9JTl9PVVRFUl9TQ09QRW1lc3NhZ2VBbm9ueW1vdXNCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbmNvZGVBbm9ueW1vdXNDb250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbkNhbid0IGNvbnRpbnVlIGF0IGEgdGFyZ2V0IGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uLkFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9ubWVzc2FnZUFub255bW91c0NvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9udGVtcGxhdGVBc2NpaUNvbnRyb2xDaGFyYWN0ZXJUaGUgY29udHJvbCBjaGFyYWN0ZXIgI3VuaWNvZGUgY2FuIG9ubHkgYmUgdXNlZCBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy5jb2RlQXNjaWlDb250cm9sQ2hhcmFjdGVyQXNjaWlDb250cm9sQ2hhcmFjdGVySUxMRUdBTF9DSEFSQUNURVJjb2RlQXNzZXJ0QXNFeHByZXNzaW9uYGFzc2VydGAgY2FuJ3QgYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uLkFzc2VydEFzRXhwcmVzc2lvbm1lc3NhZ2VBc3NlcnRBc0V4cHJlc3Npb25jb2RlQXNzZXJ0RXh0cmFuZW91c0FyZ3VtZW50YGFzc2VydGAgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50cy5Bc3NlcnRFeHRyYW5lb3VzQXJndW1lbnRtZXNzYWdlQXNzZXJ0RXh0cmFuZW91c0FyZ3VtZW50Y29kZUF3YWl0QXNJZGVudGlmaWVyJ2F3YWl0JyBjYW4ndCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicgbWV0aG9kcy5Bd2FpdEFzSWRlbnRpZmllckFTWU5DX0tFWVdPUkRfVVNFRF9BU19JREVOVElGSUVSbWVzc2FnZUF3YWl0QXNJZGVudGlmaWVyY29kZUF3YWl0Rm9yTm90QXN5bmNUaGUgYXN5bmNocm9ub3VzIGZvci1pbiBjYW4gb25seSBiZSB1c2VkIGluIGZ1bmN0aW9ucyBtYXJrZWQgd2l0aCAnYXN5bmMnIG9yICdhc3luYyonLlRyeSBtYXJraW5nIHRoZSBmdW5jdGlvbiBib2R5IHdpdGggZWl0aGVyICdhc3luYycgb3IgJ2FzeW5jKicsIG9yIHJlbW92aW5nIHRoZSAnYXdhaXQnIGJlZm9yZSB0aGUgZm9yIGxvb3AuQXdhaXRGb3JOb3RBc3luY0FTWU5DX0ZPUl9JTl9XUk9OR19DT05URVhUbWVzc2FnZUF3YWl0Rm9yTm90QXN5bmNjb2RlQXdhaXRJbkxhdGVMb2NhbEluaXRpYWxpemVyYGF3YWl0YCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBsYXRlIGxvY2FsIGluaXRpYWxpemVycy5Bd2FpdEluTGF0ZUxvY2FsSW5pdGlhbGl6ZXJtZXNzYWdlQXdhaXRJbkxhdGVMb2NhbEluaXRpYWxpemVyY29kZUF3YWl0Tm90QXN5bmMnYXdhaXQnIGNhbiBvbmx5IGJlIHVzZWQgaW4gJ2FzeW5jJyBvciAnYXN5bmMqJyBtZXRob2RzLkF3YWl0Tm90QXN5bmNBV0FJVF9JTl9XUk9OR19DT05URVhUbWVzc2FnZUF3YWl0Tm90QXN5bmN0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHlHZW5lcmljIHR5cGUgJyNuYW1lJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gdGhlIGJvdW5kcyBvZiBpdHMgb3duIHR5cGUgdmFyaWFibGVzLiBJdCBpcyByZWZlcmVuY2VkIGluZGlyZWN0bHkgdGhyb3VnaCAnI25hbWUyJy5UcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIHRvICcjbmFtZTInIGhlcmUgb3IgdG8gc29tZSBvdGhlciByYXcgdHlwZXMgaW4gdGhlIGJvdW5kcyBhbG9uZyB0aGUgcmVmZXJlbmNlIGNoYWluLmNvZGVCb3VuZElzc3VlVmlhQ3ljbGVOb25TaW1wbGljaXR5Qm91bmRJc3N1ZVZpYUN5Y2xlTm9uU2ltcGxpY2l0eU5PVF9JTlNUQU5USUFURURfQk9VTkR0ZW1wbGF0ZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eUdlbmVyaWMgdHlwZSAnI25hbWUnIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuVHJ5IHByb3ZpZGluZyB0eXBlIGFyZ3VtZW50cyB0byAnI25hbWUnIGhlcmUuY29kZUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eUJvdW5kSXNzdWVWaWFMb29wTm9uU2ltcGxpY2l0eXRlbXBsYXRlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzR2VuZXJpYyB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIGEgdHlwZSB2YXJpYWJsZSBib3VuZC5jb2RlQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzY29kZUJyZWFrT3V0c2lkZU9mTG9vcEEgYnJlYWsgc3RhdGVtZW50IGNhbid0IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3Igc3dpdGNoIHN0YXRlbWVudC5UcnkgcmVtb3ZpbmcgdGhlIGJyZWFrIHN0YXRlbWVudC5CcmVha091dHNpZGVPZkxvb3BtZXNzYWdlQnJlYWtPdXRzaWRlT2ZMb29wdGVtcGxhdGVCcmVha1RhcmdldE91dHNpZGVGdW5jdGlvbkNhbid0IGJyZWFrIHRvICcjbmFtZScgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb24uY29kZUJyZWFrVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb250ZW1wbGF0ZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlVGhlIGJ1aWx0LWluIGlkZW50aWZpZXIgJyNsZXhlbWUnIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlLmNvZGVCdWlsdEluSWRlbnRpZmllckFzVHlwZUJ1aWx0SW5JZGVudGlmaWVyQXNUeXBlQlVJTFRfSU5fSURFTlRJRklFUl9BU19UWVBFdGVtcGxhdGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25DYW4ndCB1c2UgJyNsZXhlbWUnIGFzIGEgbmFtZSBoZXJlLmNvZGVCdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25CdWlsdEluSWRlbnRpZmllckluRGVjbGFyYXRpb25CVUlMVF9JTl9JREVOVElGSUVSX0lOX0RFQ0xBUkFUSU9OY29kZUJ5dGVjb2RlTGltaXRFeGNlZWRlZFRvb01hbnlBcmd1bWVudHNjb2RlQ2FuZGlkYXRlRm91bmRGb3VuZCB0aGlzIGNhbmRpZGF0ZSwgYnV0IHRoZSBhcmd1bWVudHMgZG9uJ3QgbWF0Y2guQ2FuZGlkYXRlRm91bmRtZXNzYWdlQ2FuZGlkYXRlRm91bmR0ZW1wbGF0ZUNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3JUaGUgY2xhc3MgJyNuYW1lJyBoYXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy5jb2RlQ2FuZGlkYXRlRm91bmRJc0RlZmF1bHRDb25zdHJ1Y3RvckNhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3Jjb2RlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbkNhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi5DYW5ub3RBc3NpZ25Ub1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uQVNTSUdOTUVOVF9UT19QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05tZXNzYWdlQ2Fubm90QXNzaWduVG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbmNvZGVDYW5ub3RBc3NpZ25Ub1N1cGVyQ2FuJ3QgYXNzaWduIHRvIHN1cGVyLkNhbm5vdEFzc2lnblRvU3VwZXJOT1RfQU5fTFZBTFVFbWVzc2FnZUNhbm5vdEFzc2lnblRvU3VwZXJjb2RlQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb25DYW5ub3RSZWFkU2RrU3BlY2lmaWNhdGlvbmNvZGVDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb25Cb3RoIEl0ZXJhYmxlIGFuZCBNYXAgc3ByZWFkIGVsZW1lbnRzIGVuY291bnRlcmVkIGluIGFtYmlndW91cyBsaXRlcmFsLkNhbnREaXNhbWJpZ3VhdGVBbWJpZ3VvdXNJbmZvcm1hdGlvbm1lc3NhZ2VDYW50RGlzYW1iaWd1YXRlQW1iaWd1b3VzSW5mb3JtYXRpb25jb2RlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uTm90IGVub3VnaCB0eXBlIGluZm9ybWF0aW9uIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGxpdGVyYWwgc2V0IGFuZCBsaXRlcmFsIG1hcC5UcnkgcHJvdmlkaW5nIHR5cGUgYXJndW1lbnRzIGZvciB0aGUgbGl0ZXJhbCBleHBsaWNpdGx5IHRvIGRpc2FtYmlndWF0ZSBpdC5DYW50RGlzYW1iaWd1YXRlTm90RW5vdWdoSW5mb3JtYXRpb25tZXNzYWdlQ2FudERpc2FtYmlndWF0ZU5vdEVub3VnaEluZm9ybWF0aW9uY29kZUNhbnRJbmZlclBhY2thZ2VzRnJvbU1hbnlJbnB1dHNjb2RlQ2FudEluZmVyUGFja2FnZXNGcm9tUGFja2FnZVVyaXRlbXBsYXRlQ2FudEluZmVyUmV0dXJuVHlwZUR1ZVRvSW5jb25zaXN0ZW50T3ZlcnJpZGVzQ2FuJ3QgaW5mZXIgYSByZXR1cm4gdHlwZSBmb3IgJyNuYW1lJyBhcyBzb21lIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy5UcnkgYWRkaW5nIGFuIGV4cGxpY2l0IHR5cGUuY29kZUNhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc0NhbnRJbmZlclJldHVyblR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc3RlbXBsYXRlQ2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHlDYW4ndCBpbmZlciB0aGUgdHlwZSBvZiAnI3N0cmluZyc6IGNpcmN1bGFyaXR5IGZvdW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZS5TcGVjaWZ5IHRoZSB0eXBlIGV4cGxpY2l0bHkuY29kZUNhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5Q2FudEluZmVyVHlwZUR1ZVRvQ2lyY3VsYXJpdHlSRUNVUlNJVkVfQ09NUElMRV9USU1FX0NPTlNUQU5UdGVtcGxhdGVDYW50SW5mZXJUeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXNDYW4ndCBpbmZlciBhIHR5cGUgZm9yICcjbmFtZScgYXMgc29tZSBvZiB0aGUgaW5oZXJpdGVkIG1lbWJlcnMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuY29kZUNhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc0NhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc2NvZGVDYW50UmVhZEZpbGVDYW50UmVhZEZpbGVVUklfRE9FU19OT1RfRVhJU1R0ZW1wbGF0ZUNhbnRVc2VDb250cm9sRmxvd09yU3ByZWFkQXNDb25zdGFudCcjbGV4ZW1lJyBpcyBub3Qgc3VwcG9ydGVkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLmNvZGVDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnRDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnROT1RfQ09OU1RBTlRfRVhQUkVTU0lPTnRlbXBsYXRlQ2FudFVzZURlZmVycmVkUHJlZml4QXNDb25zdGFudCcjbGV4ZW1lJyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC5UcnkgbW92aW5nIHRoZSBjb25zdGFudCBmcm9tIHRoZSBkZWZlcnJlZCBsaWJyYXJ5LCBvciByZW1vdmluZyAnZGVmZXJyZWQnIGZyb20gdGhlIGltcG9ydC4KY29kZUNhbnRVc2VEZWZlcnJlZFByZWZpeEFzQ29uc3RhbnRDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50Q09OU1RfREVGRVJSRURfQ0xBU1Njb2RlQ2FudFVzZVByZWZpeEFzRXhwcmVzc2lvbkEgcHJlZml4IGNhbid0IGJlIHVzZWQgYXMgYW4gZXhwcmVzc2lvbi5DYW50VXNlUHJlZml4QXNFeHByZXNzaW9uUFJFRklYX0lERU5USUZJRVJfTk9UX0ZPTExPV0VEX0JZX0RPVG1lc3NhZ2VDYW50VXNlUHJlZml4QXNFeHByZXNzaW9uY29kZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlQSBwcmVmaXggY2FuJ3QgYmUgdXNlZCB3aXRoIG51bGwtYXdhcmUgb3BlcmF0b3JzLlRyeSByZXBsYWNpbmcgJz8uJyB3aXRoICcuJ0NhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlbWVzc2FnZUNhbnRVc2VQcmVmaXhXaXRoTnVsbEF3YXJlY29kZUNhdGNoU3ludGF4J2NhdGNoJyBtdXN0IGJlIGZvbGxvd2VkIGJ5ICcoaWRlbnRpZmllciknIG9yICcoaWRlbnRpZmllciwgaWRlbnRpZmllciknLk5vIHR5cGVzIGFyZSBuZWVkZWQsIHRoZSBmaXJzdCBpcyBnaXZlbiBieSAnb24nLCB0aGUgc2Vjb25kIGlzIGFsd2F5cyAnU3RhY2tUcmFjZScuQ2F0Y2hTeW50YXhtZXNzYWdlQ2F0Y2hTeW50YXhjb2RlQ2F0Y2hTeW50YXhFeHRyYVBhcmFtZXRlcnNDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVyc21lc3NhZ2VDYXRjaFN5bnRheEV4dHJhUGFyYW1ldGVyc2NvZGVDbGFzc0luQ2xhc3NDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBvdGhlciBjbGFzc2VzLlRyeSBtb3ZpbmcgdGhlIGNsYXNzIHRvIHRoZSB0b3AtbGV2ZWwuQ2xhc3NJbkNsYXNzbWVzc2FnZUNsYXNzSW5DbGFzc2NvZGVDb2xvbkluUGxhY2VPZkluRm9yLWluIGxvb3BzIHVzZSAnaW4nIHJhdGhlciB0aGFuIGEgY29sb24uVHJ5IHJlcGxhY2luZyB0aGUgY29sb24gd2l0aCB0aGUga2V5d29yZCAnaW4nLkNvbG9uSW5QbGFjZU9mSW5tZXNzYWdlQ29sb25JblBsYWNlT2ZJbnRlbXBsYXRlQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWRDbGFzcyAnI25hbWUnIGluaGVyaXRzIG11bHRpcGxlIG1lbWJlcnMgbmFtZWQgJyNuYW1lMicgd2l0aCBpbmNvbXBhdGlibGUgc2lnbmF0dXJlcy5UcnkgYWRkaW5nIGEgZGVjbGFyYXRpb24gb2YgJyNuYW1lMicgdG8gJyNuYW1lJy5jb2RlQ29tYmluZWRNZW1iZXJTaWduYXR1cmVGYWlsZWRDb21iaW5lZE1lbWJlclNpZ25hdHVyZUZhaWxlZElOQ09OU0lTVEVOVF9JTkhFUklUQU5DRXRlbXBsYXRlQ29uZmxpY3RpbmdNb2RpZmllcnNNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJyNzdHJpbmcnIGFuZCAnI3N0cmluZzInLlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIGtleXdvcmRzLmNvZGVDb25mbGljdGluZ01vZGlmaWVyc0NvbmZsaWN0aW5nTW9kaWZpZXJzdGVtcGxhdGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3JDb25mbGljdHMgd2l0aCBjb25zdHJ1Y3RvciAnI25hbWUnLmNvZGVDb25mbGljdHNXaXRoQ29uc3RydWN0b3JDb25mbGljdHNXaXRoQ29uc3RydWN0b3JDT05GTElDVFNfV0lUSF9DT05TVFJVQ1RPUnRlbXBsYXRlQ29uZmxpY3RzV2l0aEZhY3RvcnlDb25mbGljdHMgd2l0aCBmYWN0b3J5ICcjbmFtZScuY29kZUNvbmZsaWN0c1dpdGhGYWN0b3J5Q29uZmxpY3RzV2l0aEZhY3Rvcnl0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhNZW1iZXJDb25mbGljdHMgd2l0aCBtZW1iZXIgJyNuYW1lJy5jb2RlQ29uZmxpY3RzV2l0aE1lbWJlckNvbmZsaWN0c1dpdGhNZW1iZXJDT05GTElDVFNfV0lUSF9NRU1CRVJ0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhTZXR0ZXJDb25mbGljdHMgd2l0aCBzZXR0ZXIgJyNuYW1lJy5jb2RlQ29uZmxpY3RzV2l0aFNldHRlckNvbmZsaWN0c1dpdGhTZXR0ZXJ0ZW1wbGF0ZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDb25mbGljdHMgd2l0aCB0eXBlIHZhcmlhYmxlICcjbmFtZScuY29kZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDb25mbGljdHNXaXRoVHlwZVZhcmlhYmxlQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfTUVNQkVSY29kZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZVRoaXMgaXMgdGhlIHR5cGUgdmFyaWFibGUuQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNhdXNlbWVzc2FnZUNvbmZsaWN0c1dpdGhUeXBlVmFyaWFibGVDYXVzZWNvZGVDb25zdEFuZEZpbmFsTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdjb25zdCcgYW5kICdmaW5hbCcuVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvbnN0JyBvciAnZmluYWwnIGtleXdvcmQuQ29uc3RBbmRGaW5hbG1lc3NhZ2VDb25zdEFuZEZpbmFsY29kZUNvbnN0Q2xhc3NDbGFzc2VzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdjb25zdCcuVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQuIElmIHlvdSdyZSB0cnlpbmcgdG8gaW5kaWNhdGUgdGhhdCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGNhbiBiZSBjb25zdGFudHMsIHBsYWNlIHRoZSAnY29uc3QnIGtleXdvcmQgb24gIHRoZSBjbGFzcycgY29uc3RydWN0b3IocykuQ29uc3RDbGFzc21lc3NhZ2VDb25zdENsYXNzY29kZUNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZENhdXNlRmllbGQgaXMgbGF0ZSwgYnV0IGNvbnN0cnVjdG9yIGlzICdjb25zdCcuQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkQ2F1c2VtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkQ2F1c2Vjb2RlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkRXJyb3JDb25zdHJ1Y3RvciBpcyBtYXJrZWQgJ2NvbnN0JyBzbyBmaWVsZHMgY2FuJ3QgYmUgbGF0ZS5Db25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRFcnJvcm1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRFcnJvcmNvZGVDb25zdENvbnN0cnVjdG9yTGF0ZUZpbmFsRmllbGRXYXJuaW5nQ29uc3RydWN0b3IgaXMgbWFya2VkICdjb25zdCcgYW5kIHNvbWUgZmllbGRzIGFyZSBsYXRlLkNvbnN0Q29uc3RydWN0b3JMYXRlRmluYWxGaWVsZFdhcm5pbmdtZXNzYWdlQ29uc3RDb25zdHJ1Y3RvckxhdGVGaW5hbEZpZWxkV2FybmluZ2NvZGVDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENvbnN0cnVjdG9yIGlzIG1hcmtlZCAnY29uc3QnIHNvIGFsbCBmaWVsZHMgbXVzdCBiZSBmaW5hbC5Db25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0ZJTkFMX0ZJRUxEbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkY29kZUNvbnN0Q29uc3RydWN0b3JOb25GaW5hbEZpZWxkQ2F1c2VGaWVsZCBpc24ndCBmaW5hbCwgYnV0IGNvbnN0cnVjdG9yIGlzICdjb25zdCcuQ29uc3RDb25zdHJ1Y3Rvck5vbkZpbmFsRmllbGRDYXVzZW1lc3NhZ2VDb25zdENvbnN0cnVjdG9yTm9uRmluYWxGaWVsZENhdXNlY29kZUNvbnN0Q29uc3RydWN0b3JSZWRpcmVjdGlvblRvTm9uQ29uc3RBIGNvbnN0YW50IGNvbnN0cnVjdG9yIGNhbid0IGNhbGwgYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuQ29uc3RDb25zdHJ1Y3RvclJlZGlyZWN0aW9uVG9Ob25Db25zdG1lc3NhZ2VDb25zdENvbnN0cnVjdG9yUmVkaXJlY3Rpb25Ub05vbkNvbnN0Y29kZUNvbnN0Q29uc3RydWN0b3JXaXRoQm9keUEgY29uc3QgY29uc3RydWN0b3IgY2FuJ3QgaGF2ZSBhIGJvZHkuVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2NvbnN0JyBrZXl3b3JkIG9yIHRoZSBib2R5LkNvbnN0Q29uc3RydWN0b3JXaXRoQm9keUNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfQk9EWW1lc3NhZ2VDb25zdENvbnN0cnVjdG9yV2l0aEJvZHljb2RlQ29uc3RDb25zdHJ1Y3RvcldpdGhOb25Db25zdFN1cGVyQSBjb25zdGFudCBjb25zdHJ1Y3RvciBjYW4ndCBjYWxsIGEgbm9uLWNvbnN0YW50IHN1cGVyIGNvbnN0cnVjdG9yLkNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlckNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfTk9OX0NPTlNUX1NVUEVSbWVzc2FnZUNvbnN0Q29uc3RydWN0b3JXaXRoTm9uQ29uc3RTdXBlcmNvZGVDb25zdEV2YWxDaXJjdWxhcml0eUNvbnN0YW50IGV4cHJlc3Npb24gZGVwZW5kcyBvbiBpdHNlbGYuQ29uc3RFdmFsQ2lyY3VsYXJpdHltZXNzYWdlQ29uc3RFdmFsQ2lyY3VsYXJpdHljb2RlQ29uc3RFdmFsQ29udGV4dFdoaWxlIGFuYWx5emluZzpDb25zdEV2YWxDb250ZXh0bWVzc2FnZUNvbnN0RXZhbENvbnRleHR0ZW1wbGF0ZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeScjbmFtZScgY2FuJ3QgYmUgdXNlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyAnZGVmZXJyZWQnIHdoaWNoIG1lYW5zIGl0IGlzbid0IGF2YWlsYWJsZSB1bnRpbCBsb2FkZWQuY29kZUNvbnN0RXZhbERlZmVycmVkTGlicmFyeUNvbnN0RXZhbERlZmVycmVkTGlicmFyeU5PTl9DT05TVEFOVF9ERUZBVUxUX1ZBTFVFX0ZST01fREVGRVJSRURfTElCUkFSWWNvZGVDb25zdEV2YWxFeHRlbnNpb25FeHRlbnNpb24gb3BlcmF0aW9ucyBjYW4ndCBiZSB1c2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLkNvbnN0RXZhbEV4dGVuc2lvbm1lc3NhZ2VDb25zdEV2YWxFeHRlbnNpb25jb2RlQ29uc3RFdmFsRmFpbGVkQXNzZXJ0aW9uVGhpcyBhc3NlcnRpb24gZmFpbGVkLkNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbm1lc3NhZ2VDb25zdEV2YWxGYWlsZWRBc3NlcnRpb250ZW1wbGF0ZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdlVGhpcyBhc3NlcnRpb24gZmFpbGVkIHdpdGggbWVzc2FnZTogI3N0cmluZ2NvZGVDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZUNvbnN0RXZhbEZhaWxlZEFzc2VydGlvbldpdGhNZXNzYWdldGVtcGxhdGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvblRoZSBpbnZvY2F0aW9uIG9mICcjbmFtZScgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uLmNvZGVDb25zdEV2YWxJbnZhbGlkU3RhdGljSW52b2NhdGlvbkNvbnN0RXZhbEludmFsaWRTdGF0aWNJbnZvY2F0aW9uQ09OU1RfSU5JVElBTElaRURfV0lUSF9OT05fQ09OU1RBTlRfVkFMVUV0ZW1wbGF0ZUNvbnN0RXZhbE5lZ2F0aXZlU2hpZnRCaW5hcnkgb3BlcmF0b3IgJyNzdHJpbmcnIG9uICcjc3RyaW5nMicgcmVxdWlyZXMgbm9uLW5lZ2F0aXZlIG9wZXJhbmQsIGJ1dCB3YXMgJyNzdHJpbmczJy5jb2RlQ29uc3RFdmFsTmVnYXRpdmVTaGlmdENvbnN0RXZhbE5lZ2F0aXZlU2hpZnR0ZW1wbGF0ZUNvbnN0RXZhbE5vbkNvbnN0YW50VmFyaWFibGVHZXRUaGUgdmFyaWFibGUgJyNzdHJpbmcnIGlzIG5vdCBhIGNvbnN0YW50LCBvbmx5IGNvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkLmNvZGVDb25zdEV2YWxOb25Db25zdGFudFZhcmlhYmxlR2V0Q29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldE5PTl9DT05TVEFOVF9WQUxVRV9JTl9JTklUSUFMSVpFUmNvZGVDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZE9ubHkgbGlzdHMgYW5kIHNldHMgY2FuIGJlIHVzZWQgaW4gc3ByZWFkcyBpbiBjb25zdGFudCBsaXN0cyBhbmQgc2V0cy5Db25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZENPTlNUX1NQUkVBRF9FWFBFQ1RFRF9MSVNUX09SX1NFVG1lc3NhZ2VDb25zdEV2YWxOb3RMaXN0T3JTZXRJblNwcmVhZGNvZGVDb25zdEV2YWxOb3RNYXBJblNwcmVhZE9ubHkgbWFwcyBjYW4gYmUgdXNlZCBpbiBzcHJlYWRzIGluIGNvbnN0YW50IG1hcHMuQ29uc3RFdmFsTm90TWFwSW5TcHJlYWRDT05TVF9TUFJFQURfRVhQRUNURURfTUFQbWVzc2FnZUNvbnN0RXZhbE5vdE1hcEluU3ByZWFkY29kZUNvbnN0RXZhbE51bGxWYWx1ZU51bGwgdmFsdWUgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uQ29uc3RFdmFsTnVsbFZhbHVlbWVzc2FnZUNvbnN0RXZhbE51bGxWYWx1ZWNvZGVDb25zdEV2YWxTdGFydGluZ1BvaW50Q29uc3RhbnQgZXZhbHVhdGlvbiBlcnJvcjpDb25zdEV2YWxTdGFydGluZ1BvaW50bWVzc2FnZUNvbnN0RXZhbFN0YXJ0aW5nUG9pbnRjb2RlQ29uc3RFdmFsVW5ldmFsdWF0ZWRDb3VsZCBub3QgZXZhbHVhdGUgY29uc3RhbnQgZXhwcmVzc2lvbi5Db25zdEV2YWxVbmV2YWx1YXRlZG1lc3NhZ2VDb25zdEV2YWxVbmV2YWx1YXRlZHRlbXBsYXRlQ29uc3RFdmFsWmVyb0Rpdmlzb3JCaW5hcnkgb3BlcmF0b3IgJyNzdHJpbmcnIG9uICcjc3RyaW5nMicgcmVxdWlyZXMgbm9uLXplcm8gZGl2aXNvciwgYnV0IGRpdmlzb3Igd2FzICcwJy5jb2RlQ29uc3RFdmFsWmVyb0Rpdmlzb3JDb25zdEV2YWxaZXJvRGl2aXNvckNPTlNUX0VWQUxfVEhST1dTX0lEQlpFY29kZUNvbnN0RmFjdG9yeU9ubHkgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgY2FuIGJlIGRlY2xhcmVkIHRvIGJlICdjb25zdCcuVHJ5IHJlbW92aW5nIHRoZSAnY29uc3QnIGtleXdvcmQsIG9yIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoICc9JyBmb2xsb3dlZCBieSBhIHZhbGlkIHRhcmdldC5Db25zdEZhY3RvcnltZXNzYWdlQ29uc3RGYWN0b3J5Y29kZUNvbnN0RmFjdG9yeVJlZGlyZWN0aW9uVG9Ob25Db25zdENvbnN0YW50IGZhY3RvcnkgY29uc3RydWN0b3IgY2FuJ3QgZGVsZWdhdGUgdG8gYSBub24tY29uc3RhbnQgY29uc3RydWN0b3IuVHJ5IHJlZGlyZWN0aW5nIHRvIGEgZGlmZmVyZW50IGNvbnN0cnVjdG9yIG9yIG1hcmtpbmcgdGhlIHRhcmdldCBjb25zdHJ1Y3RvciAnY29uc3QnLkNvbnN0RmFjdG9yeVJlZGlyZWN0aW9uVG9Ob25Db25zdFJFRElSRUNUX1RPX05PTl9DT05TVF9DT05TVFJVQ1RPUm1lc3NhZ2VDb25zdEZhY3RvcnlSZWRpcmVjdGlvblRvTm9uQ29uc3R0ZW1wbGF0ZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXJUaGUgY29uc3QgdmFyaWFibGUgJyNuYW1lJyBtdXN0IGJlIGluaXRpYWxpemVkLlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgKCc9IGV4cHJlc3Npb24nKSB0byB0aGUgZGVjbGFyYXRpb24uY29kZUNvbnN0RmllbGRXaXRob3V0SW5pdGlhbGl6ZXJDb25zdEZpZWxkV2l0aG91dEluaXRpYWxpemVyQ09OU1RfTk9UX0lOSVRJQUxJWkVEY29kZUNvbnN0SW5zdGFuY2VGaWVsZE9ubHkgc3RhdGljIGZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgYXMgY29uc3QuVHJ5IHVzaW5nICdmaW5hbCcgaW5zdGVhZCBvZiAnY29uc3QnLCBvciBhZGRpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuQ29uc3RJbnN0YW5jZUZpZWxkQ09OU1RfSU5TVEFOQ0VfRklFTERtZXNzYWdlQ29uc3RJbnN0YW5jZUZpZWxkY29kZUNvbnN0TWV0aG9kR2V0dGVycywgc2V0dGVycyBhbmQgbWV0aG9kcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLlRyeSByZW1vdmluZyB0aGUgJ2NvbnN0JyBrZXl3b3JkLkNvbnN0TWV0aG9kbWVzc2FnZUNvbnN0TWV0aG9kY29kZUNvbnN0cnVjdG9yQ3ljbGljUmVkaXJlY3RpbmcgY29uc3RydWN0b3JzIGNhbid0IGJlIGN5Y2xpYy5UcnkgdG8gaGF2ZSBhbGwgY29uc3RydWN0b3JzIGV2ZW50dWFsbHkgcmVkaXJlY3QgdG8gYSBub24tcmVkaXJlY3RpbmcgY29uc3RydWN0b3IuQ29uc3RydWN0b3JDeWNsaWNSRUNVUlNJVkVfQ09OU1RSVUNUT1JfUkVESVJFQ1RtZXNzYWdlQ29uc3RydWN0b3JDeWNsaWN0ZW1wbGF0ZUNvbnN0cnVjdG9yTm90Rm91bmRDb3VsZG4ndCBmaW5kIGNvbnN0cnVjdG9yICcjbmFtZScuY29kZUNvbnN0cnVjdG9yTm90Rm91bmRDb25zdHJ1Y3Rvck5vdEZvdW5kQ09OU1RSVUNUT1JfTk9UX0ZPVU5EY29kZUNvbnN0cnVjdG9yTm90U3luY0NvbnN0cnVjdG9yIGJvZGllcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicuQ29uc3RydWN0b3JOb3RTeW5jTk9OX1NZTkNfQ09OU1RSVUNUT1JtZXNzYWdlQ29uc3RydWN0b3JOb3RTeW5jY29kZUNvbnN0cnVjdG9yV2l0aFJldHVyblR5cGVDb25zdHJ1Y3RvcnMgY2FuJ3QgaGF2ZSBhIHJldHVybiB0eXBlLlRyeSByZW1vdmluZyB0aGUgcmV0dXJuIHR5cGUuQ29uc3RydWN0b3JXaXRoUmV0dXJuVHlwZW1lc3NhZ2VDb25zdHJ1Y3RvcldpdGhSZXR1cm5UeXBlY29kZUNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHNBIGNvbnN0cnVjdG9yIGludm9jYXRpb24gY2FuJ3QgaGF2ZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY29uc3RydWN0b3IgbmFtZS5UcnkgdG8gcGxhY2UgdGhlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjbGFzcyBuYW1lLkNvbnN0cnVjdG9yV2l0aFR5cGVBcmd1bWVudHNXUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFNfQ09OU1RSVUNUT1JtZXNzYWdlQ29uc3RydWN0b3JXaXRoVHlwZUFyZ3VtZW50c2NvZGVDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVyc0NvbnN0cnVjdG9ycyBjYW4ndCBoYXZlIHR5cGUgcGFyYW1ldGVycy5UcnkgcmVtb3ZpbmcgdGhlIHR5cGUgcGFyYW1ldGVycy5Db25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVyc21lc3NhZ2VDb25zdHJ1Y3RvcldpdGhUeXBlUGFyYW1ldGVyc2NvZGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVUaGUgbmFtZSBvZiBhIGNvbnN0cnVjdG9yIG11c3QgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy5Db25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVJTlZBTElEX0NPTlNUUlVDVE9SX05BTUVtZXNzYWdlQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1ldGVtcGxhdGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0VGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBpcyAnI25hbWUnLmNvZGVDb25zdHJ1Y3RvcldpdGhXcm9uZ05hbWVDb250ZXh0Q29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dGNvZGVDb250aW51ZUxhYmVsTm90VGFyZ2V0VGFyZ2V0IG9mIGNvbnRpbnVlIG11c3QgYmUgYSBsYWJlbC5Db250aW51ZUxhYmVsTm90VGFyZ2V0TEFCRUxfVU5ERUZJTkVEbWVzc2FnZUNvbnRpbnVlTGFiZWxOb3RUYXJnZXRjb2RlQ29udGludWVPdXRzaWRlT2ZMb29wQSBjb250aW51ZSBzdGF0ZW1lbnQgY2FuJ3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgbG9vcCBvciBzd2l0Y2ggc3RhdGVtZW50LlRyeSByZW1vdmluZyB0aGUgY29udGludWUgc3RhdGVtZW50LkNvbnRpbnVlT3V0c2lkZU9mTG9vcG1lc3NhZ2VDb250aW51ZU91dHNpZGVPZkxvb3B0ZW1wbGF0ZUNvbnRpbnVlVGFyZ2V0T3V0c2lkZUZ1bmN0aW9uQ2FuJ3QgY29udGludWUgYXQgJyNuYW1lJyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi5jb2RlQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb25Db250aW51ZVRhcmdldE91dHNpZGVGdW5jdGlvbmNvZGVDb250aW51ZVdpdGhvdXRMYWJlbEluQ2FzZUEgY29udGludWUgc3RhdGVtZW50IGluIGEgc3dpdGNoIHN0YXRlbWVudCBtdXN0IGhhdmUgYSBsYWJlbCBhcyBhIHRhcmdldC5UcnkgYWRkaW5nIGEgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIG9uZSBvZiB0aGUgY2FzZSBjbGF1c2VzIHRvIHRoZSBjb250aW51ZSBzdGF0ZW1lbnQuQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2VtZXNzYWdlQ29udGludWVXaXRob3V0TGFiZWxJbkNhc2V0ZW1wbGF0ZUNvdWxkTm90UGFyc2VVcmlDb3VsZG4ndCBwYXJzZSBVUkkgJyNzdHJpbmcnOgogICNzdHJpbmcyLmNvZGVDb3VsZE5vdFBhcnNlVXJpQ291bGROb3RQYXJzZVVyaWNvZGVDb3ZhcmlhbnRBbmRTdGF0aWNNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2NvdmFyaWFudCcgYW5kICdzdGF0aWMnLlRyeSByZW1vdmluZyBlaXRoZXIgdGhlICdjb3ZhcmlhbnQnIG9yICdzdGF0aWMnIGtleXdvcmQuQ292YXJpYW50QW5kU3RhdGljbWVzc2FnZUNvdmFyaWFudEFuZFN0YXRpY2NvZGVDb3ZhcmlhbnRNZW1iZXJHZXR0ZXJzLCBzZXR0ZXJzIGFuZCBtZXRob2RzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlICdjb3ZhcmlhbnQnLlRyeSByZW1vdmluZyB0aGUgJ2NvdmFyaWFudCcga2V5d29yZC5Db3ZhcmlhbnRNZW1iZXJtZXNzYWdlQ292YXJpYW50TWVtYmVydGVtcGxhdGVDeWNsZUluVHlwZVZhcmlhYmxlc1R5cGUgJyNuYW1lJyBpcyBhIGJvdW5kIG9mIGl0c2VsZiB2aWEgJyNzdHJpbmcnLlRyeSBicmVha2luZyB0aGUgY3ljbGUgYnkgcmVtb3ZpbmcgYXQgbGVhc3Qgb24gb2YgdGhlICdleHRlbmRzJyBjbGF1c2VzIGluIHRoZSBjeWNsZS5jb2RlQ3ljbGVJblR5cGVWYXJpYWJsZXNDeWNsZUluVHlwZVZhcmlhYmxlc1RZUEVfUEFSQU1FVEVSX1NVUEVSVFlQRV9PRl9JVFNfQk9VTkR0ZW1wbGF0ZUN5Y2xpY0NsYXNzSGllcmFyY2h5JyNuYW1lJyBpcyBhIHN1cGVydHlwZSBvZiBpdHNlbGYuY29kZUN5Y2xpY0NsYXNzSGllcmFyY2h5Q3ljbGljQ2xhc3NIaWVyYXJjaHlSRUNVUlNJVkVfSU5URVJGQUNFX0lOSEVSSVRBTkNFdGVtcGxhdGVDeWNsaWNSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcnNDeWNsaWMgZGVmaW5pdGlvbiBvZiBmYWN0b3J5ICcjbmFtZScuY29kZUN5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc0N5Y2xpY1JlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yc1JFQ1VSU0lWRV9GQUNUT1JZX1JFRElSRUNUdGVtcGxhdGVDeWNsaWNUeXBlZGVmVGhlIHR5cGVkZWYgJyNuYW1lJyBoYXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLmNvZGVDeWNsaWNUeXBlZGVmQ3ljbGljVHlwZWRlZlRZUEVfQUxJQVNfQ0FOTk9UX1JFRkVSRU5DRV9JVFNFTEZjb2RlRGVidWdUcmFjZURlYnVnVHJhY2Vjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2FuJ3QgZGVjbGFyZSBhIG1lbWJlciB0aGF0IGNvbmZsaWN0cyB3aXRoIGFuIGluaGVyaXRlZCBvbmUuRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyREVDTEFSRURfTUVNQkVSX0NPTkZMSUNUU19XSVRIX0lOSEVSSVRFRG1lc3NhZ2VEZWNsYXJlZE1lbWJlckNvbmZsaWN0c1dpdGhJbmhlcml0ZWRNZW1iZXJjb2RlRGVjbGFyZWRNZW1iZXJDb25mbGljdHNXaXRoSW5oZXJpdGVkTWVtYmVyQ2F1c2VUaGlzIGlzIHRoZSBpbmhlcml0ZWQgbWVtYmVyLkRlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlbWVzc2FnZURlY2xhcmVkTWVtYmVyQ29uZmxpY3RzV2l0aEluaGVyaXRlZE1lbWJlckNhdXNlY29kZURlZmF1bHRMaXN0Q29uc3RydWN0b3JFcnJvckNhbid0IHVzZSB0aGUgZGVmYXVsdCBMaXN0IGNvbnN0cnVjdG9yLlRyeSB1c2luZyBMaXN0LmZpbGxlZCBpbnN0ZWFkLkRlZmF1bHRMaXN0Q29uc3RydWN0b3JFcnJvcm1lc3NhZ2VEZWZhdWx0TGlzdENvbnN0cnVjdG9yRXJyb3Jjb2RlRGVmYXVsdExpc3RDb25zdHJ1Y3Rvcldhcm5pbmdVc2luZyB0aGUgZGVmYXVsdCBMaXN0IGNvbnN0cnVjdG9yLkRlZmF1bHRMaXN0Q29uc3RydWN0b3JXYXJuaW5nbWVzc2FnZURlZmF1bHRMaXN0Q29uc3RydWN0b3JXYXJuaW5ndGVtcGxhdGVEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yQ2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgaGVyZSBiZWNhdXNlIGFueSBkZWZhdWx0IHZhbHVlcyBvZiAnI25hbWUnIHdvdWxkIGJlIHVzZWQgaW5zdGVhZC5UcnkgcmVtb3ZpbmcgdGhlIGRlZmF1bHQgdmFsdWUuY29kZURlZmF1bHRWYWx1ZUluUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yREVGQVVMVF9WQUxVRV9JTl9SRURJUkVDVElOR19GQUNUT1JZX0NPTlNUUlVDVE9SY29kZURlZmVycmVkQWZ0ZXJQcmVmaXhUaGUgZGVmZXJyZWQga2V5d29yZCBzaG91bGQgY29tZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHByZWZpeCAoJ2FzJyBjbGF1c2UpLlRyeSBtb3ZpbmcgdGhlIGRlZmVycmVkIGtleXdvcmQgYmVmb3JlIHRoZSBwcmVmaXguRGVmZXJyZWRBZnRlclByZWZpeG1lc3NhZ2VEZWZlcnJlZEFmdGVyUHJlZml4dGVtcGxhdGVEZWZlcnJlZEV4dGVuc2lvbkltcG9ydEV4dGVuc2lvbiAnI25hbWUnIGNhbm5vdCBiZSBpbXBvcnRlZCB0aHJvdWdoIGEgZGVmZXJyZWQgaW1wb3J0LlRyeSBhZGRpbmcgdGhlIGBoaWRlICNuYW1lYCB0byB0aGUgaW1wb3J0LmNvZGVEZWZlcnJlZEV4dGVuc2lvbkltcG9ydERlZmVycmVkRXh0ZW5zaW9uSW1wb3J0dGVtcGxhdGVEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYW4ndCB1c2UgdGhlIG5hbWUgJyNuYW1lJyBmb3IgYSBkZWZlcnJlZCBsaWJyYXJ5LCBhcyB0aGUgbmFtZSBpcyB1c2VkIGVsc2V3aGVyZS5jb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkU0hBUkVEX0RFRkVSUkVEX1BSRUZJWHRlbXBsYXRlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2UnI25hbWUnIGlzIHVzZWQgaGVyZS5jb2RlRGVmZXJyZWRQcmVmaXhEdXBsaWNhdGVkQ2F1c2VEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZXRlbXBsYXRlRGlsbE91dGxpbmVTdW1tYXJ5SW5kZXhlZCAjY291bnQgbGlicmFyaWVzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9saWJyYXJpZXMuY29kZURpbGxPdXRsaW5lU3VtbWFyeURpbGxPdXRsaW5lU3VtbWFyeXRlbXBsYXRlRGlyZWN0Q3ljbGVJblR5cGVWYXJpYWJsZXNUeXBlICcjbmFtZScgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLmNvZGVEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlc0RpcmVjdEN5Y2xlSW5UeXBlVmFyaWFibGVzY29kZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb25EaXJlY3RpdmVzIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgZGVjbGFyYXRpb25zLlRyeSBtb3ZpbmcgdGhlIGRpcmVjdGl2ZSBiZWZvcmUgYW55IGRlY2xhcmF0aW9ucy5EaXJlY3RpdmVBZnRlckRlY2xhcmF0aW9ubWVzc2FnZURpcmVjdGl2ZUFmdGVyRGVjbGFyYXRpb25jb2RlRHVwbGljYXRlRGVmZXJyZWRBbiBpbXBvcnQgZGlyZWN0aXZlIGNhbiBvbmx5IGhhdmUgb25lICdkZWZlcnJlZCcga2V5d29yZC5UcnkgcmVtb3ZpbmcgYWxsIGJ1dCBvbmUgJ2RlZmVycmVkJyBrZXl3b3JkLkR1cGxpY2F0ZURlZmVycmVkbWVzc2FnZUR1cGxpY2F0ZURlZmVycmVkdGVtcGxhdGVEdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50VGhlIGxhYmVsICcjbmFtZScgd2FzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQuVHJ5IGNob29zaW5nIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgbGFiZWwuY29kZUR1cGxpY2F0ZUxhYmVsSW5Td2l0Y2hTdGF0ZW1lbnREdXBsaWNhdGVMYWJlbEluU3dpdGNoU3RhdGVtZW50Y29kZUR1cGxpY2F0ZVByZWZpeEFuIGltcG9ydCBkaXJlY3RpdmUgY2FuIG9ubHkgaGF2ZSBvbmUgcHJlZml4ICgnYXMnIGNsYXVzZSkuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIHByZWZpeC5EdXBsaWNhdGVQcmVmaXhtZXNzYWdlRHVwbGljYXRlUHJlZml4dGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb24nI25hbWUnIGlzIGFscmVhZHkgZGVjbGFyZWQgaW4gdGhpcyBzY29wZS5jb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uRHVwbGljYXRlZERlY2xhcmF0aW9uRFVQTElDQVRFX0RFRklOSVRJT050ZW1wbGF0ZUR1cGxpY2F0ZWREZWNsYXJhdGlvbkNhdXNlUHJldmlvdXMgZGVjbGFyYXRpb24gb2YgJyNuYW1lJy5jb2RlRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2VEdXBsaWNhdGVkRGVjbGFyYXRpb25DYXVzZXRlbXBsYXRlRHVwbGljYXRlZERlY2xhcmF0aW9uU3ludGhldGljQ2F1c2VQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnI25hbWUnIGlzIGltcGxpZWQgYnkgdGhpcyBkZWZpbml0aW9uLmNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZUR1cGxpY2F0ZWREZWNsYXJhdGlvblN5bnRoZXRpY0NhdXNldGVtcGxhdGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2VDYW4ndCB1c2UgJyNuYW1lJyBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLmNvZGVEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2VEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2V0ZW1wbGF0ZUR1cGxpY2F0ZWRFeHBvcnQnI25hbWUnIGlzIGV4cG9ydGVkIGZyb20gYm90aCAnI3VyaScgYW5kICcjdXJpMicuY29kZUR1cGxpY2F0ZWRFeHBvcnREdXBsaWNhdGVkRXhwb3J0QU1CSUdVT1VTX0VYUE9SVHRlbXBsYXRlRHVwbGljYXRlZEV4cG9ydEluVHlwZWNvZGVEdXBsaWNhdGVkRXhwb3J0SW5UeXBlRHVwbGljYXRlZEV4cG9ydEluVHlwZXRlbXBsYXRlRHVwbGljYXRlZEltcG9ydCcjbmFtZScgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICcjdXJpJyBhbmQgJyN1cmkyJy5jb2RlRHVwbGljYXRlZEltcG9ydER1cGxpY2F0ZWRJbXBvcnR0ZW1wbGF0ZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGVjb2RlRHVwbGljYXRlZEltcG9ydEluVHlwZUR1cGxpY2F0ZWRJbXBvcnRJblR5cGVBTUJJR1VPVVNfSU1QT1JUdGVtcGxhdGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydEEgbGlicmFyeSB3aXRoIG5hbWUgJyNuYW1lJyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS5jb2RlRHVwbGljYXRlZExpYnJhcnlFeHBvcnREdXBsaWNhdGVkTGlicmFyeUV4cG9ydEVYUE9SVF9EVVBMSUNBVEVEX0xJQlJBUllfTkFNRUR0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCcjbmFtZScgaXMgYWxzbyBleHBvcnRlZCBoZXJlLmNvZGVEdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHREdXBsaWNhdGVkTGlicmFyeUV4cG9ydENvbnRleHR0ZW1wbGF0ZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0QSBsaWJyYXJ5IHdpdGggbmFtZSAnI25hbWUnIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLmNvZGVEdXBsaWNhdGVkTGlicmFyeUltcG9ydER1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0SU1QT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FRHRlbXBsYXRlRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0JyNuYW1lJyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuY29kZUR1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dER1cGxpY2F0ZWRMaWJyYXJ5SW1wb3J0Q29udGV4dHRlbXBsYXRlRHVwbGljYXRlZE1vZGlmaWVyVGhlIG1vZGlmaWVyICcjbGV4ZW1lJyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIG9jY3VycmVuY2Ugb2YgdGhlIG1vZGlmaWVyLmNvZGVEdXBsaWNhdGVkTW9kaWZpZXJEdXBsaWNhdGVkTW9kaWZpZXJ0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYW4ndCBkZWNsYXJlICcjbmFtZScgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc2NvcGUuY29kZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWREdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkUkVGRVJFTkNFRF9CRUZPUkVfREVDTEFSQVRJT050ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lUHJldmlvdXNseVVzZWRDYXVzZVByZXZpb3VzIHVzZSBvZiAnI25hbWUnLmNvZGVEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2VEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2V0ZW1wbGF0ZUR1cGxpY2F0ZWROYW1lZEFyZ3VtZW50RHVwbGljYXRlZCBuYW1lZCBhcmd1bWVudCAnI25hbWUnLmNvZGVEdXBsaWNhdGVkTmFtZWRBcmd1bWVudER1cGxpY2F0ZWROYW1lZEFyZ3VtZW50RFVQTElDQVRFX05BTUVEX0FSR1VNRU5UdGVtcGxhdGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUR1cGxpY2F0ZWQgcGFyYW1ldGVyIG5hbWUgJyNuYW1lJy5jb2RlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZXRlbXBsYXRlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZU90aGVyIHBhcmFtZXRlciBuYW1lZCAnI25hbWUnLmNvZGVEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlRHVwbGljYXRlZFBhcmFtZXRlck5hbWVDYXVzZWNvZGVFbXB0eU5hbWVkUGFyYW1ldGVyTGlzdE5hbWVkIHBhcmFtZXRlciBsaXN0cyBjYW5ub3QgYmUgZW1wdHkuVHJ5IGFkZGluZyBhIG5hbWVkIHBhcmFtZXRlciB0byB0aGUgbGlzdC5FbXB0eU5hbWVkUGFyYW1ldGVyTGlzdE1JU1NJTkdfSURFTlRJRklFUm1lc3NhZ2VFbXB0eU5hbWVkUGFyYW1ldGVyTGlzdGNvZGVFbXB0eU9wdGlvbmFsUGFyYW1ldGVyTGlzdE9wdGlvbmFsIHBhcmFtZXRlciBsaXN0cyBjYW5ub3QgYmUgZW1wdHkuVHJ5IGFkZGluZyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gdGhlIGxpc3QuRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3RtZXNzYWdlRW1wdHlPcHRpb25hbFBhcmFtZXRlckxpc3Rjb2RlRW5jb2RpbmdVbmFibGUgdG8gZGVjb2RlIGJ5dGVzIGFzIFVURi04Lm1lc3NhZ2VFbmNvZGluZ3RlbXBsYXRlRW51bUNvbnN0YW50U2FtZU5hbWVBc0VuY2xvc2luZ05hbWUgb2YgZW51bSBjb25zdGFudCAnI25hbWUnIGNhbid0IGJlIHRoZSBzYW1lIGFzIHRoZSBlbnVtJ3Mgb3duIG5hbWUuY29kZUVudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmdFbnVtQ29uc3RhbnRTYW1lTmFtZUFzRW5jbG9zaW5nRU5VTV9DT05TVEFOVF9XSVRIX0VOVU1fTkFNRWNvZGVFbnVtRGVjbGFyYXRpb25FbXB0eUFuIGVudW0gZGVjbGFyYXRpb24gY2FuJ3QgYmUgZW1wdHkuRW51bURlY2xhcmF0aW9uRW1wdHlFTVBUWV9FTlVNX0JPRFltZXNzYWdlRW51bURlY2xhcmF0aW9uRW1wdHljb2RlRW51bUluQ2xhc3NFbnVtcyBjYW4ndCBiZSBkZWNsYXJlZCBpbnNpZGUgY2xhc3Nlcy5UcnkgbW92aW5nIHRoZSBlbnVtIHRvIHRoZSB0b3AtbGV2ZWwuRW51bUluQ2xhc3NtZXNzYWdlRW51bUluQ2xhc3Njb2RlRW51bUluc3RhbnRpYXRpb25FbnVtcyBjYW4ndCBiZSBpbnN0YW50aWF0ZWQuRW51bUluc3RhbnRpYXRpb25JTlNUQU5USUFURV9FTlVNbWVzc2FnZUVudW1JbnN0YW50aWF0aW9uY29kZUVxdWFsaXR5Q2Fubm90QmVFcXVhbGl0eU9wZXJhbmRBIGNvbXBhcmlzb24gZXhwcmVzc2lvbiBjYW4ndCBiZSBhbiBvcGVyYW5kIG9mIGFub3RoZXIgY29tcGFyaXNvbiBleHByZXNzaW9uLlRyeSBwdXR0aW5nIHBhcmVudGhlc2VzIGFyb3VuZCBvbmUgb2YgdGhlIGNvbXBhcmlzb25zLkVxdWFsaXR5Q2Fubm90QmVFcXVhbGl0eU9wZXJhbmRtZXNzYWdlRXF1YWxpdHlDYW5ub3RCZUVxdWFsaXR5T3BlcmFuZHRlbXBsYXRlRXhwZWN0ZWRBZnRlckJ1dEdvdEV4cGVjdGVkICcjc3RyaW5nJyBhZnRlciB0aGlzLmNvZGVFeHBlY3RlZEFmdGVyQnV0R290RXhwZWN0ZWRBZnRlckJ1dEdvdEVYUEVDVEVEX1RPS0VOY29kZUV4cGVjdGVkQW5Jbml0aWFsaXplckV4cGVjdGVkIGFuIGluaXRpYWxpemVyLkV4cGVjdGVkQW5Jbml0aWFsaXplcm1lc3NhZ2VFeHBlY3RlZEFuSW5pdGlhbGl6ZXJjb2RlRXhwZWN0ZWRCbG9ja0V4cGVjdGVkIGEgYmxvY2suVHJ5IGFkZGluZyB7fS5FeHBlY3RlZEJsb2NrbWVzc2FnZUV4cGVjdGVkQmxvY2tjb2RlRXhwZWN0ZWRCbG9ja1RvU2tpcEV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSBvciAnPT4nLkV4cGVjdGVkQmxvY2tUb1NraXBNSVNTSU5HX0ZVTkNUSU9OX0JPRFltZXNzYWdlRXhwZWN0ZWRCbG9ja1RvU2tpcGNvZGVFeHBlY3RlZEJvZHlFeHBlY3RlZEJvZHltZXNzYWdlRXhwZWN0ZWRCb2R5dGVtcGxhdGVFeHBlY3RlZEJ1dEdvdEV4cGVjdGVkICcjc3RyaW5nJyBiZWZvcmUgdGhpcy5jb2RlRXhwZWN0ZWRCdXRHb3RFeHBlY3RlZEJ1dEdvdHRlbXBsYXRlRXhwZWN0ZWRDbGFzc01lbWJlckV4cGVjdGVkIGEgY2xhc3MgbWVtYmVyLCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRDbGFzc01lbWJlckV4cGVjdGVkQ2xhc3NNZW1iZXJFWFBFQ1RFRF9DTEFTU19NRU1CRVJ0ZW1wbGF0ZUV4cGVjdGVkQ2xhc3NPck1peGluQm9keUEgI3N0cmluZyBtdXN0IGhhdmUgYSBib2R5LCBldmVuIGlmIGl0IGlzIGVtcHR5LlRyeSBhZGRpbmcgYW4gZW1wdHkgYm9keS5jb2RlRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5RXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5dGVtcGxhdGVFeHBlY3RlZERlY2xhcmF0aW9uRXhwZWN0ZWQgYSBkZWNsYXJhdGlvbiwgYnV0IGdvdCAnI2xleGVtZScuY29kZUV4cGVjdGVkRGVjbGFyYXRpb25FeHBlY3RlZERlY2xhcmF0aW9uRVhQRUNURURfRVhFQ1VUQUJMRWNvZGVFeHBlY3RlZEVsc2VPckNvbW1hRXhwZWN0ZWQgJ2Vsc2UnIG9yIGNvbW1hLkV4cGVjdGVkRWxzZU9yQ29tbWFtZXNzYWdlRXhwZWN0ZWRFbHNlT3JDb21tYXRlbXBsYXRlRXhwZWN0ZWRFbnVtQm9keUV4cGVjdGVkIGEgZW51bSBib2R5LCBidXQgZ290ICcjbGV4ZW1lJy5BbiBlbnVtIGRlZmluaXRpb24gbXVzdCBoYXZlIGEgYm9keSB3aXRoIGF0IGxlYXN0IG9uZSBjb25zdGFudCBuYW1lLmNvZGVFeHBlY3RlZEVudW1Cb2R5RXhwZWN0ZWRFbnVtQm9keU1JU1NJTkdfRU5VTV9CT0RZdGVtcGxhdGVFeHBlY3RlZEZ1bmN0aW9uQm9keUV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSwgYnV0IGdvdCAnI2xleGVtZScuY29kZUV4cGVjdGVkRnVuY3Rpb25Cb2R5RXhwZWN0ZWRGdW5jdGlvbkJvZHljb2RlRXhwZWN0ZWRIZXhEaWdpdEEgaGV4IGRpZ2l0ICgwLTkgb3IgQS1GKSBtdXN0IGZvbGxvdyAnMHgnLkV4cGVjdGVkSGV4RGlnaXRNSVNTSU5HX0hFWF9ESUdJVG1lc3NhZ2VFeHBlY3RlZEhleERpZ2l0dGVtcGxhdGVFeHBlY3RlZElkZW50aWZpZXJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICcjbGV4ZW1lJy5jb2RlRXhwZWN0ZWRJZGVudGlmaWVyRXhwZWN0ZWRJZGVudGlmaWVydGVtcGxhdGVFeHBlY3RlZEluc3RlYWRFeHBlY3RlZCAnI3N0cmluZycgaW5zdGVhZCBvZiB0aGlzLmNvZGVFeHBlY3RlZEluc3RlYWRFeHBlY3RlZEluc3RlYWRjb2RlRXhwZWN0ZWROYW1lZEFyZ3VtZW50RXhwZWN0ZWQgbmFtZWQgYXJndW1lbnQuRXhwZWN0ZWROYW1lZEFyZ3VtZW50RVhUUkFfUE9TSVRJT05BTF9BUkdVTUVOVFNtZXNzYWdlRXhwZWN0ZWROYW1lZEFyZ3VtZW50Y29kZUV4cGVjdGVkT25lRXhwcmVzc2lvbkV4cGVjdGVkIG9uZSBleHByZXNzaW9uLCBidXQgZm91bmQgYWRkaXRpb25hbCBpbnB1dC5FeHBlY3RlZE9uZUV4cHJlc3Npb25tZXNzYWdlRXhwZWN0ZWRPbmVFeHByZXNzaW9uY29kZUV4cGVjdGVkT3BlblBhcmVuc0V4cGVjdGVkICcoJy5FeHBlY3RlZE9wZW5QYXJlbnNtZXNzYWdlRXhwZWN0ZWRPcGVuUGFyZW5zY29kZUV4cGVjdGVkU3RhdGVtZW50RXhwZWN0ZWQgYSBzdGF0ZW1lbnQuRXhwZWN0ZWRTdGF0ZW1lbnRtZXNzYWdlRXhwZWN0ZWRTdGF0ZW1lbnR0ZW1wbGF0ZUV4cGVjdGVkU3RyaW5nRXhwZWN0ZWQgYSBTdHJpbmcsIGJ1dCBnb3QgJyNsZXhlbWUnLmNvZGVFeHBlY3RlZFN0cmluZ0V4cGVjdGVkU3RyaW5nRVhQRUNURURfU1RSSU5HX0xJVEVSQUx0ZW1wbGF0ZUV4cGVjdGVkVG9rZW5FeHBlY3RlZCB0byBmaW5kICcjc3RyaW5nJy5jb2RlRXhwZWN0ZWRUb2tlbkV4cGVjdGVkVG9rZW50ZW1wbGF0ZUV4cGVjdGVkVHlwZUV4cGVjdGVkIGEgdHlwZSwgYnV0IGdvdCAnI2xleGVtZScuY29kZUV4cGVjdGVkVHlwZUV4cGVjdGVkVHlwZUVYUEVDVEVEX1RZUEVfTkFNRWNvZGVFeHBlY3RlZFVyaUV4cGVjdGVkIGEgVVJJLkV4cGVjdGVkVXJpbWVzc2FnZUV4cGVjdGVkVXJpdGVtcGxhdGVFeHBlcmltZW50Tm90RW5hYmxlZFRoaXMgcmVxdWlyZXMgdGhlICcjc3RyaW5nJyBleHBlcmltZW50IHRvIGJlIGVuYWJsZWQuVHJ5IGVuYWJsaW5nIHRoaXMgZXhwZXJpbWVudCBieSBhZGRpbmcgaXQgdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNvbXBpbGluZyBhbmQgcnVubmluZy5jb2RlRXhwZXJpbWVudE5vdEVuYWJsZWRFeHBlcmltZW50Tm90RW5hYmxlZGNvZGVFeHBsaWNpdEV4dGVuc2lvbkFyZ3VtZW50TWlzbWF0Y2hFeHBsaWNpdCBleHRlbnNpb24gYXBwbGljYXRpb24gcmVxdWlyZXMgZXhhY3RseSAxIHBvc2l0aW9uYWwgYXJndW1lbnQuRXhwbGljaXRFeHRlbnNpb25Bcmd1bWVudE1pc21hdGNobWVzc2FnZUV4cGxpY2l0RXh0ZW5zaW9uQXJndW1lbnRNaXNtYXRjaGNvZGVFeHBsaWNpdEV4dGVuc2lvbkFzRXhwcmVzc2lvbkV4cGxpY2l0IGV4dGVuc2lvbiBhcHBsaWNhdGlvbiBjYW5ub3QgYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uLkV4cGxpY2l0RXh0ZW5zaW9uQXNFeHByZXNzaW9ubWVzc2FnZUV4cGxpY2l0RXh0ZW5zaW9uQXNFeHByZXNzaW9uY29kZUV4cGxpY2l0RXh0ZW5zaW9uQXNMdmFsdWVFeHBsaWNpdCBleHRlbnNpb24gYXBwbGljYXRpb24gY2Fubm90IGJlIGEgdGFyZ2V0IGZvciBhc3NpZ25tZW50LkV4cGxpY2l0RXh0ZW5zaW9uQXNMdmFsdWVtZXNzYWdlRXhwbGljaXRFeHRlbnNpb25Bc0x2YWx1ZXRlbXBsYXRlRXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRNaXNtYXRjaEV4cGxpY2l0IGV4dGVuc2lvbiBhcHBsaWNhdGlvbiBvZiBleHRlbnNpb24gJyNuYW1lJyB0YWtlcyAnI2NvdW50JyB0eXBlIGFyZ3VtZW50KHMpLmNvZGVFeHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudE1pc21hdGNoRXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRNaXNtYXRjaGNvZGVFeHBvcnRBZnRlclBhcnRFeHBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLlRyeSBtb3ZpbmcgdGhlIGV4cG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLkV4cG9ydEFmdGVyUGFydG1lc3NhZ2VFeHBvcnRBZnRlclBhcnR0ZW1wbGF0ZUV4cG9ydEhpZGVzRXhwb3J0RXhwb3J0IG9mICcjbmFtZScgKGZyb20gJyN1cmknKSBoaWRlcyBleHBvcnQgZnJvbSAnI3VyaTInLmNvZGVFeHBvcnRIaWRlc0V4cG9ydEV4cG9ydEhpZGVzRXhwb3J0Y29kZUV4cHJlc3Npb25Ob3RNZXRhZGF0YVRoaXMgY2FuJ3QgYmUgdXNlZCBhcyBtZXRhZGF0YTsgbWV0YWRhdGEgc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHZhcmlhYmxlLCBvciBhIGNhbGwgdG8gYSBjb25zdGFudCBjb25zdHJ1Y3Rvci5FeHByZXNzaW9uTm90TWV0YWRhdGFtZXNzYWdlRXhwcmVzc2lvbk5vdE1ldGFkYXRhdGVtcGxhdGVFeHRlbmRpbmdFbnVtJyNuYW1lJyBpcyBhbiBlbnVtIGFuZCBjYW4ndCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5jb2RlRXh0ZW5kaW5nRW51bUV4dGVuZGluZ0VudW1FWFRFTkRTX0VOVU10ZW1wbGF0ZUV4dGVuZGluZ1Jlc3RyaWN0ZWQnI25hbWUnIGlzIHJlc3RyaWN0ZWQgYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLmNvZGVFeHRlbmRpbmdSZXN0cmljdGVkRXh0ZW5kaW5nUmVzdHJpY3RlZEVYVEVORFNfRElTQUxMT1dFRF9DTEFTU2NvZGVFeHRlbmRzRnV0dXJlT3JUaGUgdHlwZSAnRnV0dXJlT3InIGNhbid0IGJlIHVzZWQgaW4gYW4gJ2V4dGVuZHMnIGNsYXVzZS5FeHRlbmRzRnV0dXJlT3JtZXNzYWdlRXh0ZW5kc0Z1dHVyZU9yY29kZUV4dGVuZHNOZXZlclRoZSB0eXBlICdOZXZlcicgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnZXh0ZW5kcycgY2xhdXNlLkV4dGVuZHNOZXZlcm1lc3NhZ2VFeHRlbmRzTmV2ZXJjb2RlRXh0ZW5kc1ZvaWRUaGUgdHlwZSAndm9pZCcgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnZXh0ZW5kcycgY2xhdXNlLkV4dGVuZHNWb2lkbWVzc2FnZUV4dGVuZHNWb2lkY29kZUV4dGVuc2lvbkRlY2xhcmVzQWJzdHJhY3RNZW1iZXJFeHRlbnNpb25zIGNhbid0IGRlY2xhcmUgYWJzdHJhY3QgbWVtYmVycy5UcnkgcHJvdmlkaW5nIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWVtYmVyLkV4dGVuc2lvbkRlY2xhcmVzQWJzdHJhY3RNZW1iZXJtZXNzYWdlRXh0ZW5zaW9uRGVjbGFyZXNBYnN0cmFjdE1lbWJlcmNvZGVFeHRlbnNpb25EZWNsYXJlc0NvbnN0cnVjdG9yRXh0ZW5zaW9ucyBjYW4ndCBkZWNsYXJlIGNvbnN0cnVjdG9ycy5UcnkgcmVtb3ZpbmcgdGhlIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLkV4dGVuc2lvbkRlY2xhcmVzQ29uc3RydWN0b3JtZXNzYWdlRXh0ZW5zaW9uRGVjbGFyZXNDb25zdHJ1Y3RvcmNvZGVFeHRlbnNpb25EZWNsYXJlc0luc3RhbmNlRmllbGRFeHRlbnNpb25zIGNhbid0IGRlY2xhcmUgaW5zdGFuY2UgZmllbGRzVHJ5IHJlbW92aW5nIHRoZSBmaWVsZCBkZWNsYXJhdGlvbiBvciBtYWtpbmcgaXQgYSBzdGF0aWMgZmllbGRFeHRlbnNpb25EZWNsYXJlc0luc3RhbmNlRmllbGRtZXNzYWdlRXh0ZW5zaW9uRGVjbGFyZXNJbnN0YW5jZUZpZWxkdGVtcGxhdGVFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyVGhpcyBleHRlbnNpb24gbWVtYmVyIGNvbmZsaWN0cyB3aXRoIE9iamVjdCBtZW1iZXIgJyNuYW1lJy5jb2RlRXh0ZW5zaW9uTWVtYmVyQ29uZmxpY3RzV2l0aE9iamVjdE1lbWJlckV4dGVuc2lvbk1lbWJlckNvbmZsaWN0c1dpdGhPYmplY3RNZW1iZXJjb2RlRXh0ZXJuYWxDbGFzc0NsYXNzZXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ2V4dGVybmFsJy5FeHRlcm5hbENsYXNzbWVzc2FnZUV4dGVybmFsQ2xhc3Njb2RlRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhCb2R5RXh0ZXJuYWwgY29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSBib2R5LlRyeSByZW1vdmluZyB0aGUgYm9keSBvZiB0aGUgY29uc3RydWN0b3IsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhCb2R5bWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoQm9keWNvZGVFeHRlcm5hbENvbnN0cnVjdG9yV2l0aEZpZWxkSW5pdGlhbGl6ZXJzQW4gZXh0ZXJuYWwgY29uc3RydWN0b3IgY2FuJ3QgaW5pdGlhbGl6ZSBmaWVsZHMuVHJ5IHJlbW92aW5nIHRoZSBmaWVsZCBpbml0aWFsaXplcnMsIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuRXh0ZXJuYWxDb25zdHJ1Y3RvcldpdGhGaWVsZEluaXRpYWxpemVyc0VYVEVSTkFMX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRVJTbWVzc2FnZUV4dGVybmFsQ29uc3RydWN0b3JXaXRoRmllbGRJbml0aWFsaXplcnNjb2RlRXh0ZXJuYWxFbnVtRW51bXMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5FeHRlcm5hbEVudW1tZXNzYWdlRXh0ZXJuYWxFbnVtY29kZUV4dGVybmFsRmFjdG9yeVJlZGlyZWN0aW9uQSByZWRpcmVjdGluZyBmYWN0b3J5IGNhbid0IGJlIGV4dGVybmFsLlRyeSByZW1vdmluZyB0aGUgJ2V4dGVybmFsJyBtb2RpZmllci5FeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbm1lc3NhZ2VFeHRlcm5hbEZhY3RvcnlSZWRpcmVjdGlvbmNvZGVFeHRlcm5hbEZhY3RvcnlXaXRoQm9keUV4dGVybmFsIGZhY3RvcmllcyBjYW4ndCBoYXZlIGEgYm9keS5UcnkgcmVtb3ZpbmcgdGhlIGJvZHkgb2YgdGhlIGZhY3RvcnksIG9yIHJlbW92aW5nIHRoZSBrZXl3b3JkICdleHRlcm5hbCcuRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHltZXNzYWdlRXh0ZXJuYWxGYWN0b3J5V2l0aEJvZHljb2RlRXh0ZXJuYWxGaWVsZEZpZWxkcyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZXh0ZXJuYWwnLlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAnZXh0ZXJuYWwnLCBvciByZXBsYWNpbmcgdGhlIGZpZWxkIGJ5IGFuIGV4dGVybmFsIGdldHRlciBhbmQvb3Igc2V0dGVyLkV4dGVybmFsRmllbGRtZXNzYWdlRXh0ZXJuYWxGaWVsZGNvZGVFeHRlcm5hbE1ldGhvZFdpdGhCb2R5QW4gZXh0ZXJuYWwgb3IgbmF0aXZlIG1ldGhvZCBjYW4ndCBoYXZlIGEgYm9keS5FeHRlcm5hbE1ldGhvZFdpdGhCb2R5bWVzc2FnZUV4dGVybmFsTWV0aG9kV2l0aEJvZHljb2RlRXh0ZXJuYWxUeXBlZGVmVHlwZWRlZnMgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgJ2V4dGVybmFsJy5FeHRlcm5hbFR5cGVkZWZtZXNzYWdlRXh0ZXJuYWxUeXBlZGVmdGVtcGxhdGVFeHRyYW5lb3VzTW9kaWZpZXJDYW4ndCBoYXZlIG1vZGlmaWVyICcjbGV4ZW1lJyBoZXJlLlRyeSByZW1vdmluZyAnI2xleGVtZScuY29kZUV4dHJhbmVvdXNNb2RpZmllckV4dHJhbmVvdXNNb2RpZmllcnRlbXBsYXRlRXh0cmFuZW91c01vZGlmaWVySW5FeHRlbnNpb25DYW4ndCBoYXZlIG1vZGlmaWVyICcjbGV4ZW1lJyBpbiBhbiBleHRlbnNpb24uY29kZUV4dHJhbmVvdXNNb2RpZmllckluRXh0ZW5zaW9uRXh0cmFuZW91c01vZGlmaWVySW5FeHRlbnNpb25jb2RlRmFjdG9yeU5vdFN5bmNGYWN0b3J5IGJvZGllcyBjYW4ndCB1c2UgJ2FzeW5jJywgJ2FzeW5jKicsIG9yICdzeW5jKicuRmFjdG9yeU5vdFN5bmNOT05fU1lOQ19GQUNUT1JZbWVzc2FnZUZhY3RvcnlOb3RTeW5jY29kZUZhY3RvcnlUb3BMZXZlbERlY2xhcmF0aW9uVG9wLWxldmVsIGRlY2xhcmF0aW9ucyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSAnZmFjdG9yeScuVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkICdmYWN0b3J5Jy5GYWN0b3J5VG9wTGV2ZWxEZWNsYXJhdGlvbm1lc3NhZ2VGYWN0b3J5VG9wTGV2ZWxEZWNsYXJhdGlvbnRlbXBsYXRlRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkRXhwZWN0ZWQgdmFsdWUgYWZ0ZXIgJyNuYW1lJy5jb2RlRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkRmFzdGFDTElBcmd1bWVudFJlcXVpcmVkY29kZUZhc3RhVXNhZ2VMb25nU3VwcG9ydGVkIG9wdGlvbnM6CgogIC1vIDxmaWxlPiwgLS1vdXRwdXQ9PGZpbGU+CiAgICBHZW5lcmF0ZSB0aGUgb3V0cHV0IGludG8gPGZpbGU+LgoKICAtaCwgL2gsIC8/LCAtLWhlbHAKICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlIChhZGQgLXYgZm9yIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvcHRpb25zKS4KCiAgLXYsIC0tdmVyYm9zZQogICAgRGlzcGxheSB2ZXJib3NlIGluZm9ybWF0aW9uLgoKICAtRG5hbWUKICAtRG5hbWU9dmFsdWUKICAgIERlZmluZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUgY29tcGlsZS10aW1lIGVudmlyb25tZW50LgoKICAtLW5vLWRlZmluZXMKICAgIElnbm9yZSBhbGwgLUQgb3B0aW9ucyBhbmQgbGVhdmUgZW52aXJvbm1lbnQgY29uc3RhbnRzIHVuZXZhbHVhdGVkLgoKICAtLQogICAgU3RvcCBvcHRpb24gcGFyc2luZywgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZSBpcyBhc3N1bWVkIHRvIGJlCiAgICBmaWxlIG5hbWVzIG9yIGFyZ3VtZW50cyB0byB0aGUgRGFydCBwcm9ncmFtLgoKICAtLXBhY2thZ2VzPTxmaWxlPgogICAgVXNlIHBhY2thZ2UgcmVzb2x1dGlvbiBjb25maWd1cmF0aW9uIDxmaWxlPiwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gYSBtYXBwaW5nCiAgICBvZiBwYWNrYWdlIG5hbWVzIHRvIHBhdGhzLgoKICAtLXBsYXRmb3JtPTxmaWxlPgogICAgUmVhZCB0aGUgU0RLIHBsYXRmb3JtIGZyb20gPGZpbGU+LCB3aGljaCBzaG91bGQgYmUgaW4gRGlsbC9LZXJuZWwgSVIgZm9ybWF0CiAgICBhbmQgY29udGFpbiB0aGUgRGFydCBTREsuCgogIC0tdGFyZ2V0PWRhcnQyanN8ZGFydDJqc19zZXJ2ZXJ8ZGFydF9ydW5uZXJ8ZGFydGRldmN8Zmx1dHRlcnxmbHV0dGVyX3J1bm5lcnxub25lfHZtCiAgICBTcGVjaWZ5IHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbi4KCiAgLS1lbmFibGUtYXNzZXJ0cwogICAgQ2hlY2sgYXNzZXJ0cyBpbiBpbml0aWFsaXplcnMgZHVyaW5nIGNvbnN0YW50IGV2YWx1YXRpb24uCgogIC0tdmVyaWZ5CiAgICBDaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGlzIGZyZWUgb2YgdmFyaW91cyBwcm9ibGVtcy4gVGhpcyBpcyBtb3N0bHkKICAgIHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBvZiB0aGlzIGNvbXBpbGVyIG9yIEtlcm5lbCB0cmFuc2Zvcm1hdGlvbnMuCgogIC0tZHVtcC1pcgogICAgUHJpbnQgY29tcGlsZWQgbGlicmFyaWVzIGluIEtlcm5lbCBzb3VyY2Ugbm90YXRpb24uCgogIC0tb21pdC1wbGF0Zm9ybQogICAgRXhjbHVkZSB0aGUgcGxhdGZvcm0gZnJvbSB0aGUgc2VyaWFsaXplZCBkaWxsIGZpbGUuCgogIC0tYnl0ZWNvZGUKICAgIEdlbmVyYXRlIGJ5dGVjb2RlLiBTdXBwb3J0ZWQgb25seSBmb3IgU0RLIHBsYXRmb3JtIGNvbXBpbGF0aW9uLgoKICAtLWV4Y2x1ZGUtc291cmNlCiAgICBEbyBub3QgaW5jbHVkZSBzb3VyY2UgY29kZSBpbiB0aGUgZGlsbCBmaWxlLgoKICAtLWNvbXBpbGUtc2RrPTxzZGs+CiAgICBDb21waWxlIHRoZSBTREsgZnJvbSBzY3JhdGNoIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIGEgLmRpbGwgZmlsZQogICAgKHNlZSAtLXBsYXRmb3JtKS4KCiAgLS1zZGs9PHNkaz4KICAgIExvY2F0aW9uIG9mIHRoZSBTREsgc291cmNlcyBmb3IgdXNlIHdoZW4gY29tcGlsaW5nIGFkZGl0aW9uYWwgcGxhdGZvcm0KICAgIGxpYnJhcmllcy4KCiAgLS1zdXBlcm1peGluCiAgICBJZ25vcmVkIGZvciBub3cuCgogIC0tc2luZ2xlLXJvb3Qtc2NoZW1lPVN0cmluZwogIC0tc2luZ2xlLXJvb3QtYmFzZT08ZGlyPgogICAgU3BlY2lmeSBhIGN1c3RvbSBVUkkgc2NoZW1lIGFuZCBhIGxvY2F0aW9uIG9uIGRpc2sgd2hlcmUgc3VjaCBVUklzIGFyZQogICAgbWFwcGVkIHRvLgoKICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgY29tcGlsZXIgY2FuIGJlIGludm9rZWQgd2l0aCBpbnB1dHMgdXNpbmcgdGhlIGN1c3RvbQogICAgVVJJIHNjaGVtZS4gVGhlIGNvbXBpbGVyIGNhbiBpZ25vcmUgdGhlIGV4YWN0IGxvY2F0aW9uIG9mIGZpbGVzIG9uIGRpc2sKICAgIGFuZCBhcyBhIHJlc3VsdCB0byBwcm9kdWNlIG91dHB1dCB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBhYnNvbHV0ZQogICAgbG9jYXRpb24gb2YgZmlsZXMgb24gZGlzay4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBpbnRlZ3JhdGluZyB3aXRoCiAgICBidWlsZCBzeXN0ZW1zLgoKICAtLWZhdGFsPWVycm9ycwogIC0tZmF0YWw9d2FybmluZ3MKICAgIE1ha2VzIG1lc3NhZ2VzIG9mIHRoZSBnaXZlbiBraW5kcyBmYXRhbCwgdGhhdCBpcywgaW1tZWRpYXRlbHkgc3RvcCB0aGUKICAgIGNvbXBpbGVyIHdpdGggYSBub24temVybyBleGl0LWNvZGUuIEluIC0tdmVyYm9zZSBtb2RlLCBhbHNvIGRpc3BsYXkgYW4KICAgIGludGVybmFsIHN0YWNrIHRyYWNlIGZyb20gdGhlIGNvbXBpbGVyLiBNdWx0aXBsZSBraW5kcyBjYW4gYmUgc2VwYXJhdGVkIGJ5CiAgICBjb21tYXMsIGZvciBleGFtcGxlLCAtLWZhdGFsPWVycm9ycyx3YXJuaW5ncy4KCiAgLS1mYXRhbC1za2lwPTxudW1iZXI+CiAgLS1mYXRhbC1za2lwPXRyYWNlCiAgICBTa2lwIHRoaXMgbWFueSBtZXNzYWdlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBmYXRhbCBiZWZvcmUgYWJvcnRpbmcgdGhlCiAgICBjb21waWxhdGlvbi4gRGVmYXVsdCBpcyAwLCB3aGljaCBzdG9wcyBhdCB0aGUgZmlyc3QgbWVzc2FnZS4gU3BlY2lmeQogICAgJ3RyYWNlJyB0byBwcmludCBhIHN0YWNrIHRyYWNlIGZvciBldmVyeSBtZXNzYWdlIHdpdGhvdXQgc3RvcHBpbmcuCgogIC0tZW5hYmxlLWV4cGVyaW1lbnQ9PGZsYWc+CiAgICBFbmFibGUgb3IgZGlzYWJsZSBhbiBleHBlcmltZW50YWwgZmxhZywgdXNlZCB0byBndWFyZCBmZWF0dXJlcyBjdXJyZW50bHkKICAgIGluIGRldmVsb3BtZW50LiBQcmVmaXggYW4gZXhwZXJpbWVudCBuYW1lIHdpdGggJ25vLScgdG8gZGlzYWJsZSBpdC4KICAgIE11bHRpcGxlIGV4cGVyaW1lbnRzIGNhbiBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzLkZhc3RhVXNhZ2VMb25nbWVzc2FnZUZhc3RhVXNhZ2VMb25nY29kZUZhc3RhVXNhZ2VTaG9ydEZyZXF1ZW50bHkgdXNlZCBvcHRpb25zOgoKICAtbyA8ZmlsZT4gR2VuZXJhdGUgdGhlIG91dHB1dCBpbnRvIDxmaWxlPi4KICAtaCAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UgKGFkZCAtdiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG9wdGlvbnMpLkZhc3RhVXNhZ2VTaG9ydG1lc3NhZ2VGYXN0YVVzYWdlU2hvcnRjb2RlRmZpRXhjZXB0aW9uYWxSZXR1cm5OdWxsRXhjZXB0aW9uYWwgcmV0dXJuIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuRmZpRXhjZXB0aW9uYWxSZXR1cm5OdWxsY29kZUZmaUV4cGVjdGVkQ29uc3RhbnRFeGNlcHRpb25hbCByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIGNvbnN0YW50LkZmaUV4cGVjdGVkQ29uc3RhbnRDbGFzcyAnI25hbWUnIGNhbm5vdCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5jb2RlRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzRmZpRXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzRmllbGQgJyNuYW1lJyByZXF1aXJlcyBleGFjdGx5IG9uZSBhbm5vdGF0aW9uIHRvIGRlY2xhcmUgaXRzIG5hdGl2ZSB0eXBlLCB3aGljaCBjYW5ub3QgYmUgVm9pZC4gZGFydDpmZmkgU3RydWN0cyBjYW5ub3QgaGF2ZSByZWd1bGFyIERhcnQgZmllbGRzLmNvZGVGZmlGaWVsZEFubm90YXRpb25GZmlGaWVsZEFubm90YXRpb25GaWVsZCAnI25hbWUnIGlzIGEgZGFydDpmZmkgUG9pbnRlciB0byBhIHN0cnVjdCBmaWVsZCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY29uc3RydWN0b3IgZXhlY3V0aW9uLmNvZGVGZmlGaWVsZEluaXRpYWxpemVyRmZpRmllbGRJbml0aWFsaXplckZpZWxkICcjbmFtZScgcmVxdWlyZXMgbm8gYW5ub3RhdGlvbiB0byBkZWNsYXJlIGl0cyBuYXRpdmUgdHlwZSwgaXQgaXMgYSBQb2ludGVyIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lIHR5cGUgaW4gRGFydCBhbmQgbmF0aXZlIGNvZGUuY29kZUZmaUZpZWxkTm9Bbm5vdGF0aW9uRmZpRmllbGROb0Fubm90YXRpb24jbmFtZSBleHBlY3RzIGEgc3RhdGljIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4gZGFydDpmZmkgb25seSBzdXBwb3J0cyBjYWxsaW5nIHN0YXRpYyBEYXJ0IGZ1bmN0aW9ucyBmcm9tIG5hdGl2ZSBjb2RlLmNvZGVGZmlOb3RTdGF0aWNGZmlOb3RTdGF0aWNTdHJ1Y3QgJyNuYW1lJyBzaG91bGQgbm90IGJlIGdlbmVyaWMuY29kZUZmaVN0cnVjdEdlbmVyaWNGZmlTdHJ1Y3RHZW5lcmljY29kZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3NBIGZpZWxkIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGluIGl0cyBkZWNsYXJpbmcgY2xhc3NUcnkgcGFzc2luZyBhIHZhbHVlIGludG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsIG9yIG1vdmluZyB0aGUgaW5pdGlhbGl6YXRpb24gaW50byB0aGUgY29uc3RydWN0b3IgYm9keS5GaWVsZEluaXRpYWxpemVkT3V0c2lkZURlY2xhcmluZ0NsYXNzbWVzc2FnZUZpZWxkSW5pdGlhbGl6ZWRPdXRzaWRlRGVjbGFyaW5nQ2xhc3Njb2RlRmllbGRJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3RvckZpZWxkIGZvcm1hbCBwYXJhbWV0ZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBjb25zdHJ1Y3Rvci5UcnkgcmVtb3ZpbmcgJ3RoaXMuJy5GaWVsZEluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9ybWVzc2FnZUZpZWxkSW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3Jjb2RlRmluYWxBbmRDb3ZhcmlhbnRNZW1iZXJzIGNhbid0IGJlIGRlY2xhcmVkIHRvIGJlIGJvdGggJ2ZpbmFsJyBhbmQgJ2NvdmFyaWFudCcuVHJ5IHJlbW92aW5nIGVpdGhlciB0aGUgJ2ZpbmFsJyBvciAnY292YXJpYW50JyBrZXl3b3JkLkZpbmFsQW5kQ292YXJpYW50bWVzc2FnZUZpbmFsQW5kQ292YXJpYW50Y29kZUZpbmFsQW5kVmFyTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdmaW5hbCcgYW5kICd2YXInLlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAndmFyJy5GaW5hbEFuZFZhcm1lc3NhZ2VGaW5hbEFuZFZhcnRlbXBsYXRlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkRmluYWwgZmllbGQgJyNuYW1lJyBpcyBub3QgaW5pdGlhbGl6ZWQuVHJ5IHRvIGluaXRpYWxpemUgdGhlIGZpZWxkIGluIHRoZSBkZWNsYXJhdGlvbiBvciBpbiBldmVyeSBjb25zdHJ1Y3Rvci5jb2RlRmluYWxGaWVsZE5vdEluaXRpYWxpemVkRmluYWxGaWVsZE5vdEluaXRpYWxpemVkRklOQUxfTk9UX0lOSVRJQUxJWkVEdGVtcGxhdGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRmluYWwgZmllbGQgJyNuYW1lJyBpcyBub3QgaW5pdGlhbGl6ZWQgYnkgdGhpcyBjb25zdHJ1Y3Rvci5UcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgdXNpbmcgYW4gaW5pdGlhbGl6aW5nIGZvcm1hbCBvciBhIGZpZWxkIGluaXRpYWxpemVyLmNvZGVGaW5hbEZpZWxkTm90SW5pdGlhbGl6ZWRCeUNvbnN0cnVjdG9yRmluYWxGaWVsZE5vdEluaXRpYWxpemVkQnlDb25zdHJ1Y3RvckZJTkFMX05PVF9JTklUSUFMSVpFRF9DT05TVFJVQ1RPUl8xdGVtcGxhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyVGhlIGZpbmFsIHZhcmlhYmxlICcjbmFtZScgbXVzdCBiZSBpbml0aWFsaXplZC5jb2RlRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplckZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJ0ZW1wbGF0ZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZCcjbmFtZScgaXMgYSBmaW5hbCBpbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZEZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZEZJTkFMX0lOSVRJQUxJWkVEX01VTFRJUExFX1RJTUVTdGVtcGxhdGVGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWRDYXVzZScjbmFtZScgd2FzIGluaXRpYWxpemVkIGhlcmUuY29kZUZpbmFsSW5zdGFuY2VWYXJpYWJsZUFscmVhZHlJbml0aWFsaXplZENhdXNlRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2Vjb2RlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlQSBmb3ItaW4gbG9vcCBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgbG9vcCB2YXJpYWJsZS5Gb3JJbkxvb3BFeGFjdGx5T25lVmFyaWFibGVtZXNzYWdlRm9ySW5Mb29wRXhhY3RseU9uZVZhcmlhYmxlY29kZUZvckluTG9vcE5vdEFzc2lnbmFibGVDYW4ndCBhc3NpZ24gdG8gdGhpcywgc28gaXQgY2FuJ3QgYmUgdXNlZCBpbiBhIGZvci1pbiBsb29wLkZvckluTG9vcE5vdEFzc2lnbmFibGVtZXNzYWdlRm9ySW5Mb29wTm90QXNzaWduYWJsZWNvZGVGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZUEgZm9yLWluIGxvb3AtdmFyaWFibGUgY2FuJ3QgYmUgJ2NvbnN0Jy5UcnkgcmVtb3ZpbmcgdGhlICdjb25zdCcgbW9kaWZpZXIuRm9ySW5Mb29wV2l0aENvbnN0VmFyaWFibGVGT1JfSU5fV0lUSF9DT05TVF9WQVJJQUJMRW1lc3NhZ2VGb3JJbkxvb3BXaXRoQ29uc3RWYXJpYWJsZWNvZGVGdW5jdGlvblR5cGVEZWZhdWx0VmFsdWVDYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBpbiBhIGZ1bmN0aW9uIHR5cGUuRnVuY3Rpb25UeXBlRGVmYXVsdFZhbHVlREVGQVVMVF9WQUxVRV9JTl9GVU5DVElPTl9UWVBFbWVzc2FnZUZ1bmN0aW9uVHlwZURlZmF1bHRWYWx1ZWNvZGVGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyRnVuY3Rpb24tdHlwZWQgcGFyYW1ldGVycyBjYW4ndCBzcGVjaWZ5ICdjb25zdCcsICdmaW5hbCcgb3IgJ3ZhcicgaW4gcGxhY2Ugb2YgYSByZXR1cm4gdHlwZS5UcnkgcmVwbGFjaW5nIHRoZSBrZXl3b3JkIHdpdGggYSByZXR1cm4gdHlwZS5GdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyRlVOQ1RJT05fVFlQRURfUEFSQU1FVEVSX1ZBUm1lc3NhZ2VGdW5jdGlvblR5cGVkUGFyYW1ldGVyVmFyY29kZUdlbmVyYXRvclJldHVybnNWYWx1ZSdzeW5jKicgYW5kICdhc3luYyonIGNhbid0IHJldHVybiBhIHZhbHVlLkdlbmVyYXRvclJldHVybnNWYWx1ZVJFVFVSTl9JTl9HRU5FUkFUT1JtZXNzYWdlR2VuZXJhdG9yUmV0dXJuc1ZhbHVlY29kZUdlbmVyaWNGdW5jdGlvblR5cGVJbkJvdW5kVHlwZSB2YXJpYWJsZXMgY2FuJ3QgaGF2ZSBnZW5lcmljIGZ1bmN0aW9uIHR5cGVzIGluIHRoZWlyIGJvdW5kcy5HZW5lcmljRnVuY3Rpb25UeXBlSW5Cb3VuZEdFTkVSSUNfRlVOQ1RJT05fVFlQRV9DQU5OT1RfQkVfQk9VTkRtZXNzYWdlR2VuZXJpY0Z1bmN0aW9uVHlwZUluQm91bmRjb2RlR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudEEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGFyZ3VtZW50LlRyeSB1c2luZyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHR5cGUuR2VuZXJpY0Z1bmN0aW9uVHlwZVVzZWRBc0FjdHVhbFR5cGVBcmd1bWVudG1lc3NhZ2VHZW5lcmljRnVuY3Rpb25UeXBlVXNlZEFzQWN0dWFsVHlwZUFyZ3VtZW50dGVtcGxhdGVHZXR0ZXJOb3RGb3VuZEdldHRlciBub3QgZm91bmQ6ICcjbmFtZScuY29kZUdldHRlck5vdEZvdW5kR2V0dGVyTm90Rm91bmRjb2RlR2V0dGVyV2l0aEZvcm1hbHNBIGdldHRlciBjYW4ndCBoYXZlIGZvcm1hbCBwYXJhbWV0ZXJzLlRyeSByZW1vdmluZyAnKC4uLiknLkdldHRlcldpdGhGb3JtYWxzR0VUVEVSX1dJVEhfUEFSQU1FVEVSU21lc3NhZ2VHZXR0ZXJXaXRoRm9ybWFsc2NvZGVJbGxlZ2FsQXNzaWdubWVudFRvTm9uQXNzaWduYWJsZUlsbGVnYWwgYXNzaWdubWVudCB0byBub24tYXNzaWduYWJsZSBleHByZXNzaW9uLklsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlbWVzc2FnZUlsbGVnYWxBc3NpZ25tZW50VG9Ob25Bc3NpZ25hYmxlY29kZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGVGdW5jdGlvbnMgbWFya2VkICdhc3luYyonIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ1N0cmVhbScuSWxsZWdhbEFzeW5jR2VuZXJhdG9yUmV0dXJuVHlwZUlMTEVHQUxfQVNZTkNfR0VORVJBVE9SX1JFVFVSTl9UWVBFbWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclJldHVyblR5cGVjb2RlSWxsZWdhbEFzeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVGdW5jdGlvbnMgbWFya2VkICdhc3luYyonIGNhbid0IGhhdmUgcmV0dXJuIHR5cGUgJ3ZvaWQnLklsbGVnYWxBc3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlbWVzc2FnZUlsbGVnYWxBc3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlY29kZUlsbGVnYWxBc3luY1JldHVyblR5cGVGdW5jdGlvbnMgbWFya2VkICdhc3luYycgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAnRnV0dXJlJy5JbGxlZ2FsQXN5bmNSZXR1cm5UeXBlSUxMRUdBTF9BU1lOQ19SRVRVUk5fVFlQRW1lc3NhZ2VJbGxlZ2FsQXN5bmNSZXR1cm5UeXBldGVtcGxhdGVJbGxlZ2FsTWl4aW5UaGUgdHlwZSAnI25hbWUnIGNhbid0IGJlIG1peGVkIGluLmNvZGVJbGxlZ2FsTWl4aW5JbGxlZ2FsTWl4aW5JTExFR0FMX01JWElOdGVtcGxhdGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0Nhbid0IHVzZSAnI25hbWUnIGFzIGEgbWl4aW4gYmVjYXVzZSBpdCBoYXMgY29uc3RydWN0b3JzLmNvZGVJbGxlZ2FsTWl4aW5EdWVUb0NvbnN0cnVjdG9yc0lsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzTUlYSU5fREVDTEFSRVNfQ09OU1RSVUNUT1J0ZW1wbGF0ZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2VUaGlzIGNvbnN0cnVjdG9yIHByZXZlbnRzIHVzaW5nICcjbmFtZScgYXMgYSBtaXhpbi5jb2RlSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZUlsbGVnYWxNaXhpbkR1ZVRvQ29uc3RydWN0b3JzQ2F1c2Vjb2RlSWxsZWdhbFN5bmNHZW5lcmF0b3JSZXR1cm5UeXBlRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGFzc2lnbmFibGUgdG8gJ0l0ZXJhYmxlJy5JbGxlZ2FsU3luY0dlbmVyYXRvclJldHVyblR5cGVJTExFR0FMX1NZTkNfR0VORVJBVE9SX1JFVFVSTl9UWVBFbWVzc2FnZUlsbGVnYWxTeW5jR2VuZXJhdG9yUmV0dXJuVHlwZWNvZGVJbGxlZ2FsU3luY0dlbmVyYXRvclZvaWRSZXR1cm5UeXBlRnVuY3Rpb25zIG1hcmtlZCAnc3luYyonIGNhbid0IGhhdmUgcmV0dXJuIHR5cGUgJ3ZvaWQnLklsbGVnYWxTeW5jR2VuZXJhdG9yVm9pZFJldHVyblR5cGVtZXNzYWdlSWxsZWdhbFN5bmNHZW5lcmF0b3JWb2lkUmV0dXJuVHlwZWNvZGVJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc1RoZSBleHRlbmRzIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgaW1wbGVtZW50cyBjbGF1c2UuVHJ5IG1vdmluZyB0aGUgZXh0ZW5kcyBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5JbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc21lc3NhZ2VJbXBsZW1lbnRzQmVmb3JlRXh0ZW5kc2NvZGVJbXBsZW1lbnRzQmVmb3JlT25UaGUgb24gY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgbW92aW5nIHRoZSBvbiBjbGF1c2UgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5JbXBsZW1lbnRzQmVmb3JlT25tZXNzYWdlSW1wbGVtZW50c0JlZm9yZU9uY29kZUltcGxlbWVudHNCZWZvcmVXaXRoVGhlIHdpdGggY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSBpbXBsZW1lbnRzIGNsYXVzZS5UcnkgbW92aW5nIHRoZSB3aXRoIGNsYXVzZSBiZWZvcmUgdGhlIGltcGxlbWVudHMgY2xhdXNlLkltcGxlbWVudHNCZWZvcmVXaXRobWVzc2FnZUltcGxlbWVudHNCZWZvcmVXaXRoY29kZUltcGxlbWVudHNGdXR1cmVPclRoZSB0eXBlICdGdXR1cmVPcicgY2FuJ3QgYmUgdXNlZCBpbiBhbiAnaW1wbGVtZW50cycgY2xhdXNlLkltcGxlbWVudHNGdXR1cmVPcm1lc3NhZ2VJbXBsZW1lbnRzRnV0dXJlT3Jjb2RlSW1wbGVtZW50c05ldmVyVGhlIHR5cGUgJ05ldmVyJyBjYW4ndCBiZSB1c2VkIGluIGFuICdpbXBsZW1lbnRzJyBjbGF1c2UuSW1wbGVtZW50c05ldmVybWVzc2FnZUltcGxlbWVudHNOZXZlcnRlbXBsYXRlSW1wbGVtZW50c1JlcGVhdGVkJyNuYW1lJyBjYW4gb25seSBiZSBpbXBsZW1lbnRlZCBvbmNlLlRyeSByZW1vdmluZyAjY291bnQgb2YgdGhlIG9jY3VycmVuY2VzLmNvZGVJbXBsZW1lbnRzUmVwZWF0ZWRJbXBsZW1lbnRzUmVwZWF0ZWRJTVBMRU1FTlRTX1JFUEVBVEVEdGVtcGxhdGVJbXBsZW1lbnRzU3VwZXJDbGFzcycjbmFtZScgY2FuJ3QgYmUgdXNlZCBpbiBib3RoICdleHRlbmRzJyBhbmQgJ2ltcGxlbWVudHMnIGNsYXVzZXMuVHJ5IHJlbW92aW5nIG9uZSBvZiB0aGUgb2NjdXJyZW5jZXMuY29kZUltcGxlbWVudHNTdXBlckNsYXNzSW1wbGVtZW50c1N1cGVyQ2xhc3NJTVBMRU1FTlRTX1NVUEVSX0NMQVNTY29kZUltcGxlbWVudHNWb2lkVGhlIHR5cGUgJ3ZvaWQnIGNhbid0IGJlIHVzZWQgaW4gYW4gJ2ltcGxlbWVudHMnIGNsYXVzZS5JbXBsZW1lbnRzVm9pZG1lc3NhZ2VJbXBsZW1lbnRzVm9pZHRlbXBsYXRlSW1wbGljaXRNaXhpbk92ZXJyaWRlQXBwbHlpbmcgdGhlIG1peGluICcjbmFtZScgdG8gJyNuYW1lMicgaW50cm9kdWNlcyBhbiBlcnJvbmVvdXMgb3ZlcnJpZGUgb2YgJyNuYW1lMycuY29kZUltcGxpY2l0TWl4aW5PdmVycmlkZUltcGxpY2l0TWl4aW5PdmVycmlkZWNvZGVJbXBvcnRBZnRlclBhcnRJbXBvcnQgZGlyZWN0aXZlcyBtdXN0IHByZWNlZGUgcGFydCBkaXJlY3RpdmVzLlRyeSBtb3ZpbmcgdGhlIGltcG9ydCBkaXJlY3RpdmVzIGJlZm9yZSB0aGUgcGFydCBkaXJlY3RpdmVzLkltcG9ydEFmdGVyUGFydG1lc3NhZ2VJbXBvcnRBZnRlclBhcnR0ZW1wbGF0ZUltcG9ydEhpZGVzSW1wb3J0SW1wb3J0IG9mICcjbmFtZScgKGZyb20gJyN1cmknKSBoaWRlcyBpbXBvcnQgZnJvbSAnI3VyaTInLmNvZGVJbXBvcnRIaWRlc0ltcG9ydEltcG9ydEhpZGVzSW1wb3J0Y29kZUluY29ycmVjdFR5cGVBcmd1bWVudFZhcmlhYmxlVGhpcyBpcyB0aGUgdHlwZSB2YXJpYWJsZSB3aG9zZSBib3VuZCBpc24ndCBjb25mb3JtZWQgdG8uSW5jb3JyZWN0VHlwZUFyZ3VtZW50VmFyaWFibGVtZXNzYWdlSW5jb3JyZWN0VHlwZUFyZ3VtZW50VmFyaWFibGV0ZW1wbGF0ZUluZmVycmVkUGFja2FnZVVyaUludGVycHJldGluZyB0aGlzIGFzIHBhY2thZ2UgVVJJLCAnI3VyaScuY29kZUluZmVycmVkUGFja2FnZVVyaUluZmVycmVkUGFja2FnZVVyaWNvZGVJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYW4ndCBpbmhlcml0IG1lbWJlcnMgdGhhdCBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIuSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q09ORkxJQ1RTX1dJVEhfSU5IRVJJVEVEX01FTUJFUm1lc3NhZ2VJbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3Rjb2RlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxVGhpcyBpcyBvbmUgaW5oZXJpdGVkIG1lbWJlci5Jbmhlcml0ZWRNZW1iZXJzQ29uZmxpY3RDYXVzZTFtZXNzYWdlSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UxY29kZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMlRoaXMgaXMgdGhlIG90aGVyIGluaGVyaXRlZCBtZW1iZXIuSW5oZXJpdGVkTWVtYmVyc0NvbmZsaWN0Q2F1c2UybWVzc2FnZUluaGVyaXRlZE1lbWJlcnNDb25mbGljdENhdXNlMnRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZFRyaWVkIHRvIGluaXRpYWxpemUgZnJvbSBhIHByZXZpb3VzIGNvbXBpbGF0aW9uICgjc3RyaW5nKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgI3VyaSBpbiB5b3VyIGVycm9yIHJlcG9ydCwgYnV0IGJlIGF3YXJlIHRoYXQgdGhpcyBmaWxlIGluY2x1ZGVzIHlvdXIgc291cmNlIGNvZGUuCkVpdGhlciB3YXksIHlvdSBzaG91bGQgcHJvYmFibHkgZGVsZXRlIHRoZSBmaWxlIHNvIGl0IGRvZXNuJ3QgdXNlIHVubmVjZXNzYXJ5IGRpc2sgc3BhY2UuY29kZUluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWRJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkdGVtcGxhdGVJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkTm9EdW1wVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCNzdHJpbmcpLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy5jb2RlSW5pdGlhbGl6ZUZyb21EaWxsTm90U2VsZkNvbnRhaW5lZE5vRHVtcEluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXB0ZW1wbGF0ZUluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtVHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24gKCNzdHJpbmcpLCBidXQgY291bGRuJ3QuCkVycm9yIG1lc3NhZ2Ugd2FzICcjc3RyaW5nMicuClN0YWNrdHJhY2UgaW5jbHVkZWQgJyNzdHJpbmczJy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4KSWYgeW91IGFyZSBjb21mb3J0YWJsZSB3aXRoIGl0LCBpdCB3b3VsZCBpbXByb3ZlIHRoZSBjaGFuY2VzIG9mIGZpeGluZyBhbnkgYnVnIGlmIHlvdSBpbmNsdWRlZCB0aGUgZmlsZSAjdXJpIGluIHlvdXIgZXJyb3IgcmVwb3J0LCBidXQgYmUgYXdhcmUgdGhhdCB0aGlzIGZpbGUgaW5jbHVkZXMgeW91ciBzb3VyY2UgY29kZS4KRWl0aGVyIHdheSwgeW91IHNob3VsZCBwcm9iYWJseSBkZWxldGUgdGhlIGZpbGUgc28gaXQgZG9lc24ndCB1c2UgdW5uZWNlc3NhcnkgZGlzayBzcGFjZS5jb2RlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Jbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbXRlbXBsYXRlSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW1Ob0R1bXBUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoI3N0cmluZyksIGJ1dCBjb3VsZG4ndC4KRXJyb3IgbWVzc2FnZSB3YXMgJyNzdHJpbmcyJy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnI3N0cmluZzMnLgpUaGlzIG1pZ2h0IGJlIGEgYnVnLgoKVGhlIERhcnQgdGVhbSB3b3VsZCBncmVhdGx5IGFwcHJlY2lhdGUgaXQgaWYgeW91IHdvdWxkIHRha2UgYSBtb21lbnQgdG8gcmVwb3J0IHRoaXMgcHJvYmxlbSBhdCBodHRwOi8vZGFydGJ1Zy5jb20vbmV3LmNvZGVJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcEluaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wY29kZUluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2hUaGUgbG9vcCB2YXJpYWJsZSBpbiBhIGZvci1lYWNoIGxvb3AgY2FuJ3QgYmUgaW5pdGlhbGl6ZWQuVHJ5IHJlbW92aW5nIHRoZSBpbml0aWFsaXplciwgb3IgdXNpbmcgYSBkaWZmZXJlbnQga2luZCBvZiBsb29wLkluaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2htZXNzYWdlSW5pdGlhbGl6ZWRWYXJpYWJsZUluRm9yRWFjaHRlbXBsYXRlSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZCcjbmFtZScgaXNuJ3QgYW4gaW5zdGFuY2UgZmllbGQgb2YgdGhpcyBjbGFzcy5jb2RlSW5pdGlhbGl6ZXJGb3JTdGF0aWNGaWVsZEluaXRpYWxpemVyRm9yU3RhdGljRmllbGRJTklUSUFMSVpFUl9GT1JfU1RBVElDX0ZJRUxEdGVtcGxhdGVJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3Rvck9ubHkgY29uc3RydWN0b3JzIGNhbiBoYXZlIGluaXRpYWxpemVycywgYW5kICcjbmFtZScgaXMgbm90IGEgY29uc3RydWN0b3IuY29kZUluaXRpYWxpemVyT3V0c2lkZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJPdXRzaWRlQ29uc3RydWN0b3JJTklUSUFMSVpFUl9PVVRTSURFX0NPTlNUUlVDVE9SY29kZUluaXRpYWxpemluZ0Zvcm1hbFR5cGVNaXNtYXRjaEZpZWxkVGhlIGZpZWxkIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBhcmFtZXRlci5Jbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZG1lc3NhZ2VJbml0aWFsaXppbmdGb3JtYWxUeXBlTWlzbWF0Y2hGaWVsZGNvZGVJbnB1dEZpbGVOb3RGb3VuZElucHV0RmlsZU5vdEZvdW5kdGVtcGxhdGVJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZVRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiA2NCBiaXRzLlRyeSB1c2luZyB0aGUgQmlnSW50IGNsYXNzIGlmIHlvdSBuZWVkIGFuIGludGVnZXIgbGFyZ2VyIHRoYW4gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwNyBvciBsZXNzIHRoYW4gLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDguY29kZUludGVnZXJMaXRlcmFsSXNPdXRPZlJhbmdlSW50ZWdlckxpdGVyYWxJc091dE9mUmFuZ2VJTlRFR0VSX0xJVEVSQUxfT1VUX09GX1JBTkdFdGVtcGxhdGVJbnRlcmZhY2VDaGVja1RoZSBpbXBsZW1lbnRhdGlvbiBvZiAnI25hbWUnIGluIHRoZSBub24tYWJzdHJhY3QgY2xhc3MgJyNuYW1lMicgZG9lcyBub3QgY29uZm9ybSB0byBpdHMgaW50ZXJmYWNlLmNvZGVJbnRlcmZhY2VDaGVja0ludGVyZmFjZUNoZWNrY29kZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZEF0dGVtcHQgdG8gc2V0IGluaXRpYWxpemVyIG9uIGZpZWxkIHdpdGhvdXQgaW5pdGlhbGl6ZXIuSW50ZXJuYWxQcm9ibGVtQWxyZWFkeUluaXRpYWxpemVkbWVzc2FnZUludGVybmFsUHJvYmxlbUFscmVhZHlJbml0aWFsaXplZGNvZGVJbnRlcm5hbFByb2JsZW1Cb2R5T25BYnN0cmFjdE1ldGhvZEF0dGVtcHRpbmcgdG8gc2V0IGJvZHkgb24gYWJzdHJhY3QgbWV0aG9kLkludGVybmFsUHJvYmxlbUJvZHlPbkFic3RyYWN0TWV0aG9kbWVzc2FnZUludGVybmFsUHJvYmxlbUJvZHlPbkFic3RyYWN0TWV0aG9kdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kTm8gY29uc3RydWN0b3IgbmFtZWQgJyNuYW1lJyBpbiAnI3VyaScuY29kZUludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmRJbnRlcm5hbFByb2JsZW1Db25zdHJ1Y3Rvck5vdEZvdW5kdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHlOb24tY29udGV4dCBtZXNzYWdlIGhhcyBjb250ZXh0IHNldmVyaXR5OiAjc3RyaW5nY29kZUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eUludGVybmFsUHJvYmxlbUNvbnRleHRTZXZlcml0eXRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydENvbXBpbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGZhdGFsICcjbmFtZScgYXQ6CiNzdHJpbmdjb2RlSW50ZXJuYWxQcm9ibGVtRGVidWdBYm9ydEludGVybmFsUHJvYmxlbURlYnVnQWJvcnRjb2RlSW50ZXJuYWxQcm9ibGVtRXh0ZW5kaW5nVW5tb2RpZmlhYmxlU2NvcGVDYW4ndCBleHRlbmQgYW4gdW5tb2RpZmlhYmxlIHNjb3BlLkludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlbWVzc2FnZUludGVybmFsUHJvYmxlbUV4dGVuZGluZ1VubW9kaWZpYWJsZVNjb3BlY29kZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uVW5leHBlY3RlZCB1c2FnZSBvZiBsYWJlbCBpbnNpZGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzLkludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9ubWVzc2FnZUludGVybmFsUHJvYmxlbUxhYmVsVXNhZ2VJblZhcmlhYmxlc0RlY2xhcmF0aW9uY29kZUludGVybmFsUHJvYmxlbU1pc3NpbmdDb250ZXh0dGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZENvdWxkbid0IGZpbmQgJyNuYW1lJy5jb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZHRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbkNvdWxkbid0IGZpbmQgJyNuYW1lJyBpbiAnI25hbWUyJy5jb2RlSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbkludGVybmFsUHJvYmxlbU5vdEZvdW5kSW5jb2RlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kQ291bGRuJ3QgZmluZCBwcmV2aW91cyB0b2tlbi5JbnRlcm5hbFByb2JsZW1QcmV2aW91c1Rva2VuTm90Rm91bmRtZXNzYWdlSW50ZXJuYWxQcm9ibGVtUHJldmlvdXNUb2tlbk5vdEZvdW5kdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDYW4ndCBhY2Nlc3MgcHJpdmF0ZSBjb25zdHJ1Y3RvciAnI25hbWUnLmNvZGVJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NJbnRlcm5hbFByb2JsZW1Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3Njb2RlSW50ZXJuYWxQcm9ibGVtUHJvdmlkZWRCb3RoQ29tcGlsZVNka0FuZFNka1N1bW1hcnl0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHkjbmFtZS5zdGFjayBpc24ndCBlbXB0eToKICAjc3RyaW5nY29kZUludGVybmFsUHJvYmxlbVN0YWNrTm90RW1wdHlJbnRlcm5hbFByb2JsZW1TdGFja05vdEVtcHR5dGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkRXhwZWN0ZWQgJyNzdHJpbmcnLCBidXQgZ290ICcjc3RyaW5nMicuY29kZUludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWRJbnRlcm5hbFByb2JsZW1VbmV4cGVjdGVkdGVtcGxhdGVJbnRlcm5hbFByb2JsZW1VbmZpbmlzaGVkVHlwZVZhcmlhYmxlVW5maW5pc2hlZCB0eXBlIHZhcmlhYmxlICcjbmFtZScgZm91bmQgaW4gbm9uLXNvdXJjZSBsaWJyYXJ5ICcjdXJpJy5jb2RlSW50ZXJuYWxQcm9ibGVtVW5maW5pc2hlZFR5cGVWYXJpYWJsZUludGVybmFsUHJvYmxlbVVuZmluaXNoZWRUeXBlVmFyaWFibGV0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaGFuZGxlZFVuaGFuZGxlZCAjc3RyaW5nIGluICNzdHJpbmcyLmNvZGVJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWRJbnRlcm5hbFByb2JsZW1VbmhhbmRsZWR0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWRVbmltcGxlbWVudGVkICNzdHJpbmcuY29kZUludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWRJbnRlcm5hbFByb2JsZW1VbmltcGxlbWVudGVkY29kZUludGVybmFsUHJvYmxlbVVuc3VwcG9ydGVkSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWR0ZW1wbGF0ZUludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWVUaGUgVVJJICcjdXJpJyBoYXMgbm8gc2NoZW1lLmNvZGVJbnRlcm5hbFByb2JsZW1VcmlNaXNzaW5nU2NoZW1lSW50ZXJuYWxQcm9ibGVtVXJpTWlzc2luZ1NjaGVtZXRlbXBsYXRlSW50ZXJuYWxQcm9ibGVtVmVyaWZpY2F0aW9uRXJyb3JWZXJpZmljYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBwcm9ncmFtIGZhaWxlZDoKI3N0cmluZ2NvZGVJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvckludGVybmFsUHJvYmxlbVZlcmlmaWNhdGlvbkVycm9yY29kZUludGVycG9sYXRpb25JblVyaUNhbid0IHVzZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiBpbiBhIFVSSS5JbnRlcnBvbGF0aW9uSW5VcmlJTlZBTElEX0xJVEVSQUxfSU5fQ09ORklHVVJBVElPTm1lc3NhZ2VJbnRlcnBvbGF0aW9uSW5Vcmljb2RlSW52YWxpZEF3YWl0Rm9yVGhlIGtleXdvcmQgJ2F3YWl0JyBpc24ndCBhbGxvd2VkIGZvciBhIG5vcm1hbCAnZm9yJyBzdGF0ZW1lbnQuVHJ5IHJlbW92aW5nIHRoZSBrZXl3b3JkLCBvciB1c2UgYSBmb3ItZWFjaCBzdGF0ZW1lbnQuSW52YWxpZEF3YWl0Rm9ybWVzc2FnZUludmFsaWRBd2FpdEZvcnRlbXBsYXRlSW52YWxpZEJyZWFrVGFyZ2V0Q2FuJ3QgYnJlYWsgdG8gJyNuYW1lJy5jb2RlSW52YWxpZEJyZWFrVGFyZ2V0SW52YWxpZEJyZWFrVGFyZ2V0Y29kZUludmFsaWRDYXRjaEFyZ3VtZW50c0ludmFsaWQgY2F0Y2ggYXJndW1lbnRzLkludmFsaWRDYXRjaEFyZ3VtZW50c0lOVkFMSURfQ0FUQ0hfQVJHVU1FTlRTbWVzc2FnZUludmFsaWRDYXRjaEFyZ3VtZW50c2NvZGVJbnZhbGlkQ29kZVBvaW50VGhlIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdcdScgaXNuJ3QgYSB2YWxpZCBjb2RlIHBvaW50LkludmFsaWRDb2RlUG9pbnRJTlZBTElEX0NPREVfUE9JTlRtZXNzYWdlSW52YWxpZENvZGVQb2ludHRlbXBsYXRlSW52YWxpZENvbnRpbnVlVGFyZ2V0Q2FuJ3QgY29udGludWUgYXQgJyNuYW1lJy5jb2RlSW52YWxpZENvbnRpbnVlVGFyZ2V0SW52YWxpZENvbnRpbnVlVGFyZ2V0Y29kZUludmFsaWRIZXhFc2NhcGVBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXHgnIG11c3QgYmUgZm9sbG93ZWQgYnkgMiBoZXhhZGVjaW1hbCBkaWdpdHMuSW52YWxpZEhleEVzY2FwZW1lc3NhZ2VJbnZhbGlkSGV4RXNjYXBlY29kZUludmFsaWRJbml0aWFsaXplck5vdCBhIHZhbGlkIGluaXRpYWxpemVyLlRvIGluaXRpYWxpemUgYSBmaWVsZCwgdXNlIHRoZSBzeW50YXggJ25hbWUgPSB2YWx1ZScubWVzc2FnZUludmFsaWRJbml0aWFsaXplcmNvZGVJbnZhbGlkSW5saW5lRnVuY3Rpb25UeXBlSW5saW5lIGZ1bmN0aW9uIHR5cGVzIGNhbm5vdCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJzIGluIGEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlLlRyeSBjaGFuZ2luZyB0aGUgaW5saW5lIGZ1bmN0aW9uIHR5cGUgKGFzIGluICdpbnQgZigpJykgdG8gYSBwcmVmaXhlZCBmdW5jdGlvbiB0eXBlIHVzaW5nIHRoZSBgRnVuY3Rpb25gIGtleXdvcmQgKGFzIGluICdpbnQgRnVuY3Rpb24oKSBmJykuSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZUlOVkFMSURfSU5MSU5FX0ZVTkNUSU9OX1RZUEVtZXNzYWdlSW52YWxpZElubGluZUZ1bmN0aW9uVHlwZXRlbXBsYXRlSW52YWxpZE9wZXJhdG9yVGhlIHN0cmluZyAnI2xleGVtZScgaXNuJ3QgYSB1c2VyLWRlZmluYWJsZSBvcGVyYXRvci5jb2RlSW52YWxpZE9wZXJhdG9ySW52YWxpZE9wZXJhdG9ydGVtcGxhdGVJbnZhbGlkUGFja2FnZVVyaUludmFsaWQgcGFja2FnZSBVUkkgJyN1cmknOgogICNzdHJpbmcuY29kZUludmFsaWRQYWNrYWdlVXJpSW52YWxpZFBhY2thZ2VVcmljb2RlSW52YWxpZFN1cGVySW5Jbml0aWFsaXplckNhbiBvbmx5IHVzZSAnc3VwZXInIGluIGFuIGluaXRpYWxpemVyIGZvciBjYWxsaW5nIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIChlLmcuICdzdXBlcigpJyBvciAnc3VwZXIubmFtZWRDb25zdHJ1Y3RvcigpJylJbnZhbGlkU3VwZXJJbkluaXRpYWxpemVybWVzc2FnZUludmFsaWRTdXBlckluSW5pdGlhbGl6ZXJjb2RlSW52YWxpZFN5bmNNb2RpZmllckludmFsaWQgbW9kaWZpZXIgJ3N5bmMnLlRyeSByZXBsYWNpbmcgJ3N5bmMnIHdpdGggJ3N5bmMqJy5JbnZhbGlkU3luY01vZGlmaWVyTUlTU0lOR19TVEFSX0FGVEVSX1NZTkNtZXNzYWdlSW52YWxpZFN5bmNNb2RpZmllcmNvZGVJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXJDYW4gb25seSB1c2UgJ3RoaXMnIGluIGFuIGluaXRpYWxpemVyIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbiAoZS5nLiAndGhpcy54ID0gc29tZXRoaW5nJykgYW5kIGNvbnN0cnVjdG9yIHJlZGlyZWN0aW9uIChlLmcuICd0aGlzKCknIG9yICd0aGlzLm5hbWVkQ29uc3RydWN0b3IoKSlJbnZhbGlkVGhpc0luSW5pdGlhbGl6ZXJtZXNzYWdlSW52YWxpZFRoaXNJbkluaXRpYWxpemVydGVtcGxhdGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVDYW4ndCB1c2UgaW1wbGljaXRseSAnb3V0JyB2YXJpYWJsZSAnI25hbWUnIGluIGFuICcjc3RyaW5nMicgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICcjbmFtZTInLmNvZGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGV0ZW1wbGF0ZUludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZVdpdGhWYXJpYW5jZUNhbid0IHVzZSAnI3N0cmluZycgdHlwZSB2YXJpYWJsZSAnI25hbWUnIGluIGFuICcjc3RyaW5nMicgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICcjbmFtZTInLmNvZGVJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVXaXRoVmFyaWFuY2VJbnZhbGlkVHlwZVZhcmlhYmxlSW5TdXBlcnR5cGVXaXRoVmFyaWFuY2V0ZW1wbGF0ZUludmFsaWRUeXBlVmFyaWFibGVWYXJpYW5jZVBvc2l0aW9uQ2FuJ3QgdXNlICcjc3RyaW5nJyB0eXBlIHZhcmlhYmxlICcjbmFtZScgaW4gYW4gJyNzdHJpbmcyJyBwb3NpdGlvbi5jb2RlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbnRlbXBsYXRlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JblJldHVyblR5cGVDYW4ndCB1c2UgJyNzdHJpbmcnIHR5cGUgdmFyaWFibGUgJyNuYW1lJyBpbiBhbiAnI3N0cmluZzInIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS5jb2RlSW52YWxpZFR5cGVWYXJpYWJsZVZhcmlhbmNlUG9zaXRpb25JblJldHVyblR5cGVJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbkluUmV0dXJuVHlwZWNvZGVJbnZhbGlkVW5pY29kZUVzY2FwZUFuIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdcdScgbXVzdCBiZSBmb2xsb3dlZCBieSA0IGhleGFkZWNpbWFsIGRpZ2l0cyBvciBmcm9tIDEgdG8gNiBkaWdpdHMgYmV0d2VlbiAneycgYW5kICd9Jy5JbnZhbGlkVW5pY29kZUVzY2FwZW1lc3NhZ2VJbnZhbGlkVW5pY29kZUVzY2FwZWNvZGVJbnZhbGlkVXNlT2ZOdWxsQXdhcmVBY2Nlc3NDYW5ub3QgdXNlICc/LicgaGVyZS5UcnkgdXNpbmcgJy4nLkludmFsaWRVc2VPZk51bGxBd2FyZUFjY2Vzc0lOVkFMSURfVVNFX09GX05VTExfQVdBUkVfQUNDRVNTbWVzc2FnZUludmFsaWRVc2VPZk51bGxBd2FyZUFjY2Vzc2NvZGVJbnZhbGlkVm9pZFR5cGUgJ3ZvaWQnIGNhbid0IGJlIHVzZWQgaGVyZS5UcnkgcmVtb3ZpbmcgJ3ZvaWQnIGtleXdvcmQgb3IgcmVwbGFjZSBpdCB3aXRoICd2YXInLCAnZmluYWwnLCBvciBhIHR5cGUuSW52YWxpZFZvaWRtZXNzYWdlSW52YWxpZFZvaWR0ZW1wbGF0ZUludm9rZU5vbkZ1bmN0aW9uJyNuYW1lJyBpc24ndCBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhbmQgY2FuJ3QgYmUgaW52b2tlZC5jb2RlSW52b2tlTm9uRnVuY3Rpb25JbnZva2VOb25GdW5jdGlvbklOVk9DQVRJT05fT0ZfTk9OX0ZVTkNUSU9OY29kZUpzSW50ZXJvcEluZGV4Tm90U3VwcG9ydGVkSlMgaW50ZXJvcCBjbGFzc2VzIGRvIG5vdCBzdXBwb3J0IFtdIGFuZCBbXT0gb3BlcmF0b3IgbWV0aG9kcy5UcnkgcmVwbGFjaW5nIHdpdGggYSBub3JtYWwgbWV0aG9kLkpzSW50ZXJvcEluZGV4Tm90U3VwcG9ydGVkbWVzc2FnZUpzSW50ZXJvcEluZGV4Tm90U3VwcG9ydGVkdGVtcGxhdGVMYWJlbE5vdEZvdW5kQ2FuJ3QgZmluZCBsYWJlbCAnI25hbWUnLlRyeSBkZWZpbmluZyB0aGUgbGFiZWwsIG9yIGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgbGFiZWwuY29kZUxhYmVsTm90Rm91bmRMYWJlbE5vdEZvdW5kY29kZUxhbmd1YWdlVmVyc2lvbkludmFsaWRJbkRvdFBhY2thZ2VzVGhlIGxhbmd1YWdlIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCBjb3JyZWN0bHkgaW4gdGhlIC5wYWNrYWdlcyBmaWxlLkxhbmd1YWdlVmVyc2lvbkludmFsaWRJbkRvdFBhY2thZ2VzbWVzc2FnZUxhbmd1YWdlVmVyc2lvbkludmFsaWRJbkRvdFBhY2thZ2VzY29kZUxhbmd1YWdlVmVyc2lvbkxpYnJhcnlDb250ZXh0VGhpcyBpcyBsYW5ndWFnZSB2ZXJzaW9uIGFubm90YXRpb24gaW4gdGhlIGxpYnJhcnkuTGFuZ3VhZ2VWZXJzaW9uTGlicmFyeUNvbnRleHRtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uTGlicmFyeUNvbnRleHRjb2RlTGFuZ3VhZ2VWZXJzaW9uTWlzbWF0Y2hJblBhcnRUaGUgbGFuZ3VhZ2UgdmVyc2lvbiBvdmVycmlkZSBoYXMgdG8gYmUgdGhlIHNhbWUgaW4gdGhlIGxpYnJhcnkgYW5kIGl0cyBwYXJ0KHMpLkxhbmd1YWdlVmVyc2lvbk1pc21hdGNoSW5QYXJ0bWVzc2FnZUxhbmd1YWdlVmVyc2lvbk1pc21hdGNoSW5QYXJ0Y29kZUxhbmd1YWdlVmVyc2lvbk1pc21hdGNoSW5QYXRjaFRoZSBsYW5ndWFnZSB2ZXJzaW9uIG92ZXJyaWRlIGhhcyB0byBiZSB0aGUgc2FtZSBpbiB0aGUgbGlicmFyeSBhbmQgaXRzIHBhdGNoKGVzKS5MYW5ndWFnZVZlcnNpb25NaXNtYXRjaEluUGF0Y2htZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uTWlzbWF0Y2hJblBhdGNoY29kZUxhbmd1YWdlVmVyc2lvblBhcnRDb250ZXh0VGhpcyBpcyBsYW5ndWFnZSB2ZXJzaW9uIGFubm90YXRpb24gaW4gdGhlIHBhcnQuTGFuZ3VhZ2VWZXJzaW9uUGFydENvbnRleHRtZXNzYWdlTGFuZ3VhZ2VWZXJzaW9uUGFydENvbnRleHRjb2RlTGFuZ3VhZ2VWZXJzaW9uUGF0Y2hDb250ZXh0VGhpcyBpcyBsYW5ndWFnZSB2ZXJzaW9uIGFubm90YXRpb24gaW4gdGhlIHBhdGNoLkxhbmd1YWdlVmVyc2lvblBhdGNoQ29udGV4dG1lc3NhZ2VMYW5ndWFnZVZlcnNpb25QYXRjaENvbnRleHR0ZW1wbGF0ZUxhbmd1YWdlVmVyc2lvblRvb0hpZ2hUaGUgc3BlY2lmaWVkIGxhbmd1YWdlIHZlcnNpb24gaXMgdG9vIGhpZ2guIFRoZSBoaWdoZXN0IHN1cHBvcnRlZCBsYW5ndWFnZSB2ZXJzaW9uIGlzICNjb3VudC4jY291bnQyLmNvZGVMYW5ndWFnZVZlcnNpb25Ub29IaWdoTGFuZ3VhZ2VWZXJzaW9uVG9vSGlnaGNvZGVMaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3RUaGUgbGlicmFyeSBkaXJlY3RpdmUgbXVzdCBhcHBlYXIgYmVmb3JlIGFsbCBvdGhlciBkaXJlY3RpdmVzLlRyeSBtb3ZpbmcgdGhlIGxpYnJhcnkgZGlyZWN0aXZlIGJlZm9yZSBhbnkgb3RoZXIgZGlyZWN0aXZlcy5MaWJyYXJ5RGlyZWN0aXZlTm90Rmlyc3RtZXNzYWdlTGlicmFyeURpcmVjdGl2ZU5vdEZpcnN0Y29kZUxpc3RMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNMaXN0IGxpdGVyYWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgdHlwZSBhcmd1bWVudC5MaXN0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzRVhQRUNURURfT05FX0xJU1RfVFlQRV9BUkdVTUVOVFNtZXNzYWdlTGlzdExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c3RlbXBsYXRlTG9hZExpYnJhcnlIaWRlc01lbWJlclRoZSBsaWJyYXJ5ICcjdXJpJyBkZWZpbmVzIGEgdG9wLWxldmVsIG1lbWJlciBuYW1lZCAnbG9hZExpYnJhcnknLiBUaGlzIG1lbWJlciBpcyBoaWRkZW4gYnkgdGhlIHNwZWNpYWwgbWVtYmVyICdsb2FkTGlicmFyeScgdGhhdCB0aGUgbGFuZ3VhZ2UgYWRkcyB0byBzdXBwb3J0IGRlZmVycmVkIGxvYWRpbmcuVHJ5IHRvIHJlbmFtZSBvciBoaWRlIHRoZSBtZW1iZXIuY29kZUxvYWRMaWJyYXJ5SGlkZXNNZW1iZXJMb2FkTGlicmFyeUhpZGVzTWVtYmVyY29kZUxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50cydsb2FkTGlicmFyeScgdGFrZXMgbm8gYXJndW1lbnRzLkxvYWRMaWJyYXJ5VGFrZXNOb0FyZ3VtZW50c0xPQURfTElCUkFSWV9UQUtFU19OT19BUkdVTUVOVFNtZXNzYWdlTG9hZExpYnJhcnlUYWtlc05vQXJndW1lbnRzdGVtcGxhdGVMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydExvY2FsIGRlZmluaXRpb24gb2YgJyNuYW1lJyBoaWRlcyBleHBvcnQgZnJvbSAnI3VyaScuY29kZUxvY2FsRGVmaW5pdGlvbkhpZGVzRXhwb3J0TG9jYWxEZWZpbml0aW9uSGlkZXNFeHBvcnR0ZW1wbGF0ZUxvY2FsRGVmaW5pdGlvbkhpZGVzSW1wb3J0TG9jYWwgZGVmaW5pdGlvbiBvZiAnI25hbWUnIGhpZGVzIGltcG9ydCBmcm9tICcjdXJpJy5jb2RlTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnRMb2NhbERlZmluaXRpb25IaWRlc0ltcG9ydGNvZGVNYXBMaXRlcmFsVHlwZUFyZ3VtZW50TWlzbWF0Y2hBIG1hcCBsaXRlcmFsIHJlcXVpcmVzIGV4YWN0bHkgdHdvIHR5cGUgYXJndW1lbnRzLk1hcExpdGVyYWxUeXBlQXJndW1lbnRNaXNtYXRjaEVYUEVDVEVEX1RXT19NQVBfVFlQRV9BUkdVTUVOVFNtZXNzYWdlTWFwTGl0ZXJhbFR5cGVBcmd1bWVudE1pc21hdGNoY29kZU1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3NBIGNsYXNzIG1lbWJlciBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGVuY2xvc2luZyBjbGFzcy5NZW1iZXJXaXRoU2FtZU5hbWVBc0NsYXNzbWVzc2FnZU1lbWJlcldpdGhTYW1lTmFtZUFzQ2xhc3Njb2RlTWV0YWRhdGFUeXBlQXJndW1lbnRzQW4gYW5ub3RhdGlvbiAobWV0YWRhdGEpIGNhbid0IHVzZSB0eXBlIGFyZ3VtZW50cy5NZXRhZGF0YVR5cGVBcmd1bWVudHNtZXNzYWdlTWV0YWRhdGFUeXBlQXJndW1lbnRzdGVtcGxhdGVNZXRob2ROb3RGb3VuZE1ldGhvZCBub3QgZm91bmQ6ICcjbmFtZScuY29kZU1ldGhvZE5vdEZvdW5kTWV0aG9kTm90Rm91bmRjb2RlTWlzc2luZ0FyZ3VtZW50TGlzdENvbnN0cnVjdG9yIGludm9jYXRpb25zIG11c3QgaGF2ZSBhbiBhcmd1bWVudCBsaXN0Lk1pc3NpbmdBcmd1bWVudExpc3RtZXNzYWdlTWlzc2luZ0FyZ3VtZW50TGlzdGNvZGVNaXNzaW5nQXNzaWduYWJsZVNlbGVjdG9yTWlzc2luZyBzZWxlY3RvciBzdWNoIGFzICcuaWRlbnRpZmllcicgb3IgJ1swXScuVHJ5IGFkZGluZyBhIHNlbGVjdG9yLk1pc3NpbmdBc3NpZ25hYmxlU2VsZWN0b3JtZXNzYWdlTWlzc2luZ0Fzc2lnbmFibGVTZWxlY3RvcmNvZGVNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXJFeHBlY3RlZCBhbiBhc3NpZ25tZW50IGFmdGVyIHRoZSBmaWVsZCBuYW1lLk1pc3NpbmdBc3NpZ25tZW50SW5Jbml0aWFsaXplcm1lc3NhZ2VNaXNzaW5nQXNzaWdubWVudEluSW5pdGlhbGl6ZXJjb2RlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGVWYXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCB1c2luZyB0aGUga2V5d29yZHMgJ2NvbnN0JywgJ2ZpbmFsJywgJ3Zhcicgb3IgYSB0eXBlIG5hbWUuVHJ5IGFkZGluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgb3IgdGhlIGtleXdvcmQgJ3ZhcicuTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGVtZXNzYWdlTWlzc2luZ0NvbnN0RmluYWxWYXJPclR5cGVjb2RlTWlzc2luZ0V4cGxpY2l0Q29uc3RDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkLlRyeSBpbnNlcnRpbmcgJ2NvbnN0Jy5NaXNzaW5nRXhwbGljaXRDb25zdG1lc3NhZ2VNaXNzaW5nRXhwbGljaXRDb25zdHRlbXBsYXRlTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50c05vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkLCAjY291bnQgcG9zc2libGUuY29kZU1pc3NpbmdFeHBsaWNpdFR5cGVBcmd1bWVudHNNaXNzaW5nRXhwbGljaXRUeXBlQXJndW1lbnRzY29kZU1pc3NpbmdFeHBvbmVudE51bWJlcnMgaW4gZXhwb25lbnRpYWwgbm90YXRpb24gc2hvdWxkIGFsd2F5cyBjb250YWluIGFuIGV4cG9uZW50IChhbiBpbnRlZ2VyIG51bWJlciB3aXRoIGFuIG9wdGlvbmFsIHNpZ24pLk1ha2Ugc3VyZSB0aGVyZSBpcyBhbiBleHBvbmVudCwgYW5kIHJlbW92ZSBhbnkgd2hpdGVzcGFjZSBiZWZvcmUgaXQuTWlzc2luZ0V4cG9uZW50TUlTU0lOR19ESUdJVG1lc3NhZ2VNaXNzaW5nRXhwb25lbnRjb2RlTWlzc2luZ0V4cHJlc3Npb25JblRocm93TWlzc2luZyBleHByZXNzaW9uIGFmdGVyICd0aHJvdycuQWRkIGFuIGV4cHJlc3Npb24gYWZ0ZXIgJ3Rocm93JyBvciB1c2UgJ3JldGhyb3cnIHRvIHRocm93IGEgY2F1Z2h0IGV4Y2VwdGlvbk1pc3NpbmdFeHByZXNzaW9uSW5UaHJvd21lc3NhZ2VNaXNzaW5nRXhwcmVzc2lvbkluVGhyb3djb2RlTWlzc2luZ0Z1bmN0aW9uUGFyYW1ldGVyc0EgZnVuY3Rpb24gZGVjbGFyYXRpb24gbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uTWlzc2luZ0Z1bmN0aW9uUGFyYW1ldGVyc01JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSU21lc3NhZ2VNaXNzaW5nRnVuY3Rpb25QYXJhbWV0ZXJzdGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZScjbmFtZScgaXMgZGVmaW5lZCBoZXJlLmNvZGVNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZU1pc3NpbmdJbXBsZW1lbnRhdGlvbkNhdXNldGVtcGxhdGVNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdFRoZSBub24tYWJzdHJhY3QgY2xhc3MgJyNuYW1lJyBpcyBtaXNzaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlc2UgbWVtYmVyczoKI25hbWVzVHJ5IHRvIGVpdGhlcgogLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uLAogLSBpbmhlcml0IGFuIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlcmNsYXNzIG9yIG1peGluLAogLSBtYXJrIHRoZSBjbGFzcyBhcyBhYnN0cmFjdCwgb3IKIC0gcHJvdmlkZSBhICdub1N1Y2hNZXRob2QnIGltcGxlbWVudGF0aW9uLgpjb2RlTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3RNaXNzaW5nSW1wbGVtZW50YXRpb25Ob3RBYnN0cmFjdENPTkNSRVRFX0NMQVNTX1dJVEhfQUJTVFJBQ1RfTUVNQkVSY29kZU1pc3NpbmdJbnB1dGNvZGVNaXNzaW5nTWFpbmNvZGVNaXNzaW5nTWV0aG9kUGFyYW1ldGVyc0EgbWV0aG9kIGRlY2xhcmF0aW9uIG5lZWRzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgcGFyYW1ldGVycy5UcnkgYWRkaW5nIGEgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi5NaXNzaW5nTWV0aG9kUGFyYW1ldGVyc01JU1NJTkdfTUVUSE9EX1BBUkFNRVRFUlNtZXNzYWdlTWlzc2luZ01ldGhvZFBhcmFtZXRlcnNjb2RlTWlzc2luZ09wZXJhdG9yS2V5d29yZE9wZXJhdG9yIGRlY2xhcmF0aW9ucyBtdXN0IGJlIHByZWNlZGVkIGJ5IHRoZSBrZXl3b3JkICdvcGVyYXRvcicuVHJ5IGFkZGluZyB0aGUga2V5d29yZCAnb3BlcmF0b3InLk1pc3NpbmdPcGVyYXRvcktleXdvcmRtZXNzYWdlTWlzc2luZ09wZXJhdG9yS2V5d29yZHRlbXBsYXRlTWlzc2luZ1BhcnRPZkNhbid0IHVzZSAnI3VyaScgYXMgYSBwYXJ0LCBiZWNhdXNlIGl0IGhhcyBubyAncGFydCBvZicgZGVjbGFyYXRpb24uY29kZU1pc3NpbmdQYXJ0T2ZNaXNzaW5nUGFydE9mUEFSVF9PRl9OT05fUEFSVGNvZGVNaXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydERlZmVycmVkIGltcG9ydHMgc2hvdWxkIGhhdmUgYSBwcmVmaXguVHJ5IGFkZGluZyBhIHByZWZpeCB0byB0aGUgaW1wb3J0IGJ5IGFkZGluZyBhbiAnYXMnIGNsYXVzZS5NaXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydG1lc3NhZ2VNaXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydGNvZGVNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnNBIHR5cGVkZWYgbmVlZHMgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzLlRyeSBhZGRpbmcgYSBwYXJhbWV0ZXIgbGlzdCB0byB0aGUgdHlwZWRlZi5NaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnNNSVNTSU5HX1RZUEVERUZfUEFSQU1FVEVSU21lc3NhZ2VNaXNzaW5nVHlwZWRlZlBhcmFtZXRlcnNjb2RlTWl4aW5EZWNsYXJlc0NvbnN0cnVjdG9yTWl4aW5zIGNhbid0IGRlY2xhcmUgY29uc3RydWN0b3JzLk1peGluRGVjbGFyZXNDb25zdHJ1Y3Rvcm1lc3NhZ2VNaXhpbkRlY2xhcmVzQ29uc3RydWN0b3J0ZW1wbGF0ZU1vZGlmaWVyT3V0T2ZPcmRlclRoZSBtb2RpZmllciAnI3N0cmluZycgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJyNzdHJpbmcyJy5UcnkgcmUtb3JkZXJpbmcgdGhlIG1vZGlmaWVycy5jb2RlTW9kaWZpZXJPdXRPZk9yZGVyTW9kaWZpZXJPdXRPZk9yZGVyY29kZU1vcmVUaGFuT25lU3VwZXJPclRoaXNJbml0aWFsaXplckNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSAnc3VwZXInIG9yICd0aGlzJyBpbml0aWFsaXplci5Nb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXJTVVBFUl9JTl9SRURJUkVDVElOR19DT05TVFJVQ1RPUm1lc3NhZ2VNb3JlVGhhbk9uZVN1cGVyT3JUaGlzSW5pdGlhbGl6ZXJjb2RlTXVsdGlwbGVFeHRlbmRzRWFjaCBjbGFzcyBkZWZpbml0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGV4dGVuZHMgY2xhdXNlLlRyeSBjaG9vc2luZyBvbmUgc3VwZXJjbGFzcyBhbmQgZGVmaW5lIHlvdXIgY2xhc3MgdG8gaW1wbGVtZW50IChvciBtaXggaW4pIHRoZSBvdGhlcnMuTXVsdGlwbGVFeHRlbmRzbWVzc2FnZU11bHRpcGxlRXh0ZW5kc2NvZGVNdWx0aXBsZUltcGxlbWVudHNFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgaW1wbGVtZW50cyBjbGF1c2UuVHJ5IGNvbWJpbmluZyBhbGwgb2YgdGhlIGltcGxlbWVudHMgY2xhdXNlcyBpbnRvIGEgc2luZ2xlIGNsYXVzZS5NdWx0aXBsZUltcGxlbWVudHNNVUxUSVBMRV9JTVBMRU1FTlRTX0NMQVVTRVNtZXNzYWdlTXVsdGlwbGVJbXBsZW1lbnRzY29kZU11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXNPbmx5IG9uZSBsaWJyYXJ5IGRpcmVjdGl2ZSBtYXkgYmUgZGVjbGFyZWQgaW4gYSBmaWxlLlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvZiB0aGUgbGlicmFyeSBkaXJlY3RpdmVzLk11bHRpcGxlTGlicmFyeURpcmVjdGl2ZXNtZXNzYWdlTXVsdGlwbGVMaWJyYXJ5RGlyZWN0aXZlc2NvZGVNdWx0aXBsZU9uQ2xhdXNlc0VhY2ggbWl4aW4gZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBvbiBjbGF1c2UuVHJ5IGNvbWJpbmluZyBhbGwgb2YgdGhlIG9uIGNsYXVzZXMgaW50byBhIHNpbmdsZSBjbGF1c2UuTXVsdGlwbGVPbkNsYXVzZXNtZXNzYWdlTXVsdGlwbGVPbkNsYXVzZXNjb2RlTXVsdGlwbGVWYXJpYW5jZU1vZGlmaWVyc0VhY2ggdHlwZSBwYXJhbWV0ZXIgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdmFyaWFuY2UgbW9kaWZpZXIuVXNlIGF0IG1vc3Qgb25lIG9mIHRoZSAnaW4nLCAnb3V0Jywgb3IgJ2lub3V0JyBtb2RpZmllcnMuTXVsdGlwbGVWYXJpYW5jZU1vZGlmaWVyc21lc3NhZ2VNdWx0aXBsZVZhcmlhbmNlTW9kaWZpZXJzY29kZU11bHRpcGxlV2l0aEVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB3aXRoIGNsYXVzZS5UcnkgY29tYmluaW5nIGFsbCBvZiB0aGUgd2l0aCBjbGF1c2VzIGludG8gYSBzaW5nbGUgY2xhdXNlLk11bHRpcGxlV2l0aG1lc3NhZ2VNdWx0aXBsZVdpdGhjb2RlTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25BIGZ1bmN0aW9uIGV4cHJlc3Npb24gY2FuJ3QgaGF2ZSBhIG5hbWUuTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25OQU1FRF9GVU5DVElPTl9FWFBSRVNTSU9ObWVzc2FnZU5hbWVkRnVuY3Rpb25FeHByZXNzaW9udGVtcGxhdGVOYW1lZE1peGluT3ZlcnJpZGVUaGUgbWl4aW4gYXBwbGljYXRpb24gY2xhc3MgJyNuYW1lJyBpbnRyb2R1Y2VzIGFuIGVycm9uZW91cyBvdmVycmlkZSBvZiAnI25hbWUyJy5jb2RlTmFtZWRNaXhpbk92ZXJyaWRlTmFtZWRNaXhpbk92ZXJyaWRlY29kZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbk5hdGl2ZSBjbGF1c2UgaW4gdGhpcyBmb3JtIGlzIGRlcHJlY2F0ZWQuVHJ5IHJlbW92aW5nIHRoaXMgbmF0aXZlIGNsYXVzZSBhbmQgYWRkaW5nIEBuYXRpdmUoKSBvciBAbmF0aXZlKCduYXRpdmUtbmFtZScpIGJlZm9yZSB0aGUgZGVjbGFyYXRpb24uTmF0aXZlQ2xhdXNlU2hvdWxkQmVBbm5vdGF0aW9ubWVzc2FnZU5hdGl2ZUNsYXVzZVNob3VsZEJlQW5ub3RhdGlvbnRlbXBsYXRlTm9Gb3JtYWxzQSBmdW5jdGlvbiBzaG91bGQgaGF2ZSBmb3JtYWwgcGFyYW1ldGVycy5UcnkgYWRkaW5nICcoKScgYWZ0ZXIgJyNsZXhlbWUnLCBvciBhZGQgJ2dldCcgYmVmb3JlICcjbGV4ZW1lJyB0byBkZWNsYXJlIGEgZ2V0dGVyLmNvZGVOb0Zvcm1hbHNOb0Zvcm1hbHN0ZW1wbGF0ZU5vU3VjaE5hbWVkUGFyYW1ldGVyTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJyNuYW1lJy5jb2RlTm9TdWNoTmFtZWRQYXJhbWV0ZXJOb1N1Y2hOYW1lZFBhcmFtZXRlclVOREVGSU5FRF9OQU1FRF9QQVJBTUVURVJjb2RlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdCdPYmplY3QnIGhhcyBubyB1bm5hbWVkIGNvbnN0cnVjdG9yLk5vVW5uYW1lZENvbnN0cnVjdG9ySW5PYmplY3RtZXNzYWdlTm9Vbm5hbWVkQ29uc3RydWN0b3JJbk9iamVjdHRlbXBsYXRlTm9uQXNjaWlJZGVudGlmaWVyVGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXIgJyNjaGFyYWN0ZXInICgjdW5pY29kZSkgY2FuJ3QgYmUgdXNlZCBpbiBpZGVudGlmaWVycywgb25seSBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy5UcnkgdXNpbmcgYW4gVVMtQVNDSUkgbGV0dGVyLCBhIGRpZ2l0LCAnXycgKGFuIHVuZGVyc2NvcmUpLCBvciAnJCcgKGEgZG9sbGFyIHNpZ24pLmNvZGVOb25Bc2NpaUlkZW50aWZpZXJOb25Bc2NpaUlkZW50aWZpZXJ0ZW1wbGF0ZU5vbkFzY2lpV2hpdGVzcGFjZVRoZSBub24tQVNDSUkgc3BhY2UgY2hhcmFjdGVyICN1bmljb2RlIGNhbiBvbmx5IGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuY29kZU5vbkFzY2lpV2hpdGVzcGFjZU5vbkFzY2lpV2hpdGVzcGFjZWNvZGVOb25Db25zdENvbnN0cnVjdG9yQ2Fubm90IGludm9rZSBhIG5vbi0nY29uc3QnIGNvbnN0cnVjdG9yIHdoZXJlIGEgY29uc3QgZXhwcmVzc2lvbiBpcyBleHBlY3RlZC5UcnkgdXNpbmcgYSBjb25zdHJ1Y3RvciBvciBmYWN0b3J5IHRoYXQgaXMgJ2NvbnN0Jy5Ob25Db25zdENvbnN0cnVjdG9ybWVzc2FnZU5vbkNvbnN0Q29uc3RydWN0b3Jjb2RlTm9uQ29uc3RGYWN0b3J5Q2Fubm90IGludm9rZSBhIG5vbi0nY29uc3QnIGZhY3Rvcnkgd2hlcmUgYSBjb25zdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkLk5vbkNvbnN0RmFjdG9yeW1lc3NhZ2VOb25Db25zdEZhY3Rvcnljb2RlTm9uSW5zdGFuY2VUeXBlVmFyaWFibGVVc2VDYW4gb25seSB1c2UgdHlwZSB2YXJpYWJsZXMgaW4gaW5zdGFuY2UgbWV0aG9kcy5Ob25JbnN0YW5jZVR5cGVWYXJpYWJsZVVzZVRZUEVfUEFSQU1FVEVSX1JFRkVSRU5DRURfQllfU1RBVElDbWVzc2FnZU5vbkluc3RhbmNlVHlwZVZhcmlhYmxlVXNlY29kZU5vbk51bGxBd2FyZVNwcmVhZElzTnVsbENhbid0IHNwcmVhZCBhIHZhbHVlIHdpdGggc3RhdGljIHR5cGUgTnVsbC5Ob25OdWxsQXdhcmVTcHJlYWRJc051bGxtZXNzYWdlTm9uTnVsbEF3YXJlU3ByZWFkSXNOdWxsdGVtcGxhdGVOb25OdWxsYWJsZU5vdEFzc2lnbmVkRXJyb3JOb24tbnVsbGFibGUgdmFyaWFibGUgJyNuYW1lJyBtdXN0IGJlIGFzc2lnbmVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC5jb2RlTm9uTnVsbGFibGVOb3RBc3NpZ25lZEVycm9yTm9uTnVsbGFibGVOb3RBc3NpZ25lZEVycm9ydGVtcGxhdGVOb25OdWxsYWJsZU5vdEFzc2lnbmVkV2FybmluZ05vbi1udWxsYWJsZSB2YXJpYWJsZSAnI25hbWUnIGlzIHVzZWQgYmVmb3JlIGl0J3MgYXNzaWduZWQuY29kZU5vbk51bGxhYmxlTm90QXNzaWduZWRXYXJuaW5nTm9uTnVsbGFibGVOb3RBc3NpZ25lZFdhcm5pbmdjb2RlTm9uTnVsbGFibGVPcHRPdXROdWxsIHNhZmV0eSBmZWF0dXJlcyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgbGlicmFyeS5UcnkgcmVtb3ZpbmcgdGhlIGBAZGFydD1gIGFubm90YXRpb24gb3Igc2V0dGluZyB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiB0byBhdCBsZWFzdCBgQGRhcnQ9Mi43YC5Ob25OdWxsYWJsZU9wdE91dG1lc3NhZ2VOb25OdWxsYWJsZU9wdE91dGNvZGVOb25OdWxsYWJsZU9wdE91dENvbW1lbnRUaGlzIGlzIHRoZSBhbm5vdGF0aW9uIHRoYXQgb3B0cyBvdXQgdGhpcyBsaWJyYXJ5IGZyb20gbnVsbCBzYWZldHkgZmVhdHVyZXMuTm9uTnVsbGFibGVPcHRPdXRDb21tZW50bWVzc2FnZU5vbk51bGxhYmxlT3B0T3V0Q29tbWVudGNvZGVOb25QYXJ0T2ZEaXJlY3RpdmVJblBhcnRUaGUgcGFydC1vZiBkaXJlY3RpdmUgbXVzdCBiZSB0aGUgb25seSBkaXJlY3RpdmUgaW4gYSBwYXJ0LlRyeSByZW1vdmluZyB0aGUgb3RoZXIgZGlyZWN0aXZlcywgb3IgbW92aW5nIHRoZW0gdG8gdGhlIGxpYnJhcnkgZm9yIHdoaWNoIHRoaXMgaXMgYSBwYXJ0Lk5vblBhcnRPZkRpcmVjdGl2ZUluUGFydE5PTl9QQVJUX09GX0RJUkVDVElWRV9JTl9QQVJUbWVzc2FnZU5vblBhcnRPZkRpcmVjdGl2ZUluUGFydHRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2VCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJyNuYW1lJy5jb2RlTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2VOb25TaW1wbGVCb3VuZFZpYVJlZmVyZW5jZXRlbXBsYXRlTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZUJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyB2YXJpYWJsZSAnI25hbWUnIGZyb20gdGhlIHNhbWUgZGVjbGFyYXRpb24uY29kZU5vblNpbXBsZUJvdW5kVmlhVmFyaWFibGVOb25TaW1wbGVCb3VuZFZpYVZhcmlhYmxlY29kZU5vdEFDb25zdGFudEV4cHJlc3Npb25Ob3QgYSBjb25zdGFudCBleHByZXNzaW9uLk5vdEFDb25zdGFudEV4cHJlc3Npb25tZXNzYWdlTm90QUNvbnN0YW50RXhwcmVzc2lvbnRlbXBsYXRlTm90QVByZWZpeEluVHlwZUFubm90YXRpb24nI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4LmNvZGVOb3RBUHJlZml4SW5UeXBlQW5ub3RhdGlvbk5vdEFQcmVmaXhJblR5cGVBbm5vdGF0aW9uTk9UX0FfVFlQRXRlbXBsYXRlTm90QVR5cGUnI25hbWUnIGlzbid0IGEgdHlwZS5jb2RlTm90QVR5cGVOb3RBVHlwZWNvZGVOb3RBVHlwZUNvbnRleHRUaGlzIGlzbid0IGEgdHlwZS5Ob3RBVHlwZUNvbnRleHRtZXNzYWdlTm90QVR5cGVDb250ZXh0Y29kZU5vdEFuTHZhbHVlQ2FuJ3QgYXNzaWduIHRvIHRoaXMuTm90QW5MdmFsdWVtZXNzYWdlTm90QW5MdmFsdWV0ZW1wbGF0ZU5vdEJpbmFyeU9wZXJhdG9yJyNsZXhlbWUnIGlzbid0IGEgYmluYXJ5IG9wZXJhdG9yLmNvZGVOb3RCaW5hcnlPcGVyYXRvck5vdEJpbmFyeU9wZXJhdG9ydGVtcGxhdGVOb3RDb25zdGFudEV4cHJlc3Npb24jc3RyaW5nIGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24uY29kZU5vdENvbnN0YW50RXhwcmVzc2lvbk5vdENvbnN0YW50RXhwcmVzc2lvbmNvZGVOdWxsQXdhcmVDYXNjYWRlT3V0T2ZPcmRlclRoZSAnPy4uJyBjYXNjYWRlIG9wZXJhdG9yIG11c3QgYmUgZmlyc3QgaW4gdGhlIGNhc2NhZGUgc2VxdWVuY2UuVHJ5IG1vdmluZyB0aGUgJz8uLicgb3BlcmF0b3IgdG8gYmUgdGhlIGZpcnN0IGNhc2NhZGUgb3BlcmF0b3IgaW4gdGhlIHNlcXVlbmNlLk51bGxBd2FyZUNhc2NhZGVPdXRPZk9yZGVybWVzc2FnZU51bGxBd2FyZUNhc2NhZGVPdXRPZk9yZGVydGVtcGxhdGVOdWxsYWJsZUludGVyZmFjZUVycm9yQ2FuJ3QgaW1wbGVtZW50ICcjbmFtZScgYmVjYXVzZSBpdCdzIG1hcmtlZCB3aXRoICc/Jy5jb2RlTnVsbGFibGVJbnRlcmZhY2VFcnJvck51bGxhYmxlSW50ZXJmYWNlRXJyb3J0ZW1wbGF0ZU51bGxhYmxlSW50ZXJmYWNlV2FybmluZ0ltcGxlbWVudGluZyAnI25hbWUnIG1hcmtlZCB3aXRoICc/Jy5jb2RlTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5nTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5ndGVtcGxhdGVOdWxsYWJsZU1peGluRXJyb3JDYW4ndCBtaXggJyNuYW1lJyBpbiBiZWNhdXNlIGl0J3MgbWFya2VkIHdpdGggJz8nLmNvZGVOdWxsYWJsZU1peGluRXJyb3JOdWxsYWJsZU1peGluRXJyb3J0ZW1wbGF0ZU51bGxhYmxlTWl4aW5XYXJuaW5nTWl4aW5nIGluICcjbmFtZScgbWFya2VkIHdpdGggJz8nLmNvZGVOdWxsYWJsZU1peGluV2FybmluZ051bGxhYmxlTWl4aW5XYXJuaW5ndGVtcGxhdGVOdWxsYWJsZVN1cGVyY2xhc3NFcnJvckNhbid0IGV4dGVuZCAnI25hbWUnIGJlY2F1c2UgaXQncyBtYXJrZWQgd2l0aCAnPycuY29kZU51bGxhYmxlU3VwZXJjbGFzc0Vycm9yTnVsbGFibGVTdXBlcmNsYXNzRXJyb3J0ZW1wbGF0ZU51bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmdFeHRlbmRpbmcgJyNuYW1lJyBtYXJrZWQgd2l0aCAnPycuY29kZU51bGxhYmxlU3VwZXJjbGFzc1dhcm5pbmdOdWxsYWJsZVN1cGVyY2xhc3NXYXJuaW5ndGVtcGxhdGVOdWxsYWJsZVRlYXJvZmZFcnJvckNhbid0IHRlYXIgb2ZmIG1ldGhvZCAnI25hbWUnIGZyb20gYSBwb3RlbnRpYWxseSBudWxsIHZhbHVlLmNvZGVOdWxsYWJsZVRlYXJvZmZFcnJvck51bGxhYmxlVGVhcm9mZkVycm9ydGVtcGxhdGVOdWxsYWJsZVRlYXJvZmZXYXJuaW5nVGVhcmluZyBvZmYgbWV0aG9kICcjbmFtZScgZnJvbSBhIHBvdGVudGlhbGx5IG51bGwgdmFsdWUuY29kZU51bGxhYmxlVGVhcm9mZldhcm5pbmdOdWxsYWJsZVRlYXJvZmZXYXJuaW5nY29kZU9iamVjdEV4dGVuZHNUaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgaGF2ZSBhIHN1cGVyY2xhc3MuT2JqZWN0RXh0ZW5kc21lc3NhZ2VPYmplY3RFeHRlbmRzY29kZU9iamVjdEltcGxlbWVudHNUaGUgY2xhc3MgJ09iamVjdCcgY2FuJ3QgaW1wbGVtZW50IGFueXRoaW5nLk9iamVjdEltcGxlbWVudHNtZXNzYWdlT2JqZWN0SW1wbGVtZW50c2NvZGVPYmplY3RNaXhlc0luVGhlIGNsYXNzICdPYmplY3QnIGNhbid0IHVzZSBtaXhpbnMuT2JqZWN0TWl4ZXNJbm1lc3NhZ2VPYmplY3RNaXhlc0luY29kZU9ubHlUcnlBIHRyeSBibG9jayBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuICdvbicsICdjYXRjaCcsIG9yICdmaW5hbGx5JyBjbGF1c2UuVHJ5IGFkZGluZyBlaXRoZXIgYSBjYXRjaCBvciBmaW5hbGx5IGNsYXVzZSwgb3IgcmVtb3ZlIHRoZSB0cnkgc3RhdGVtZW50Lk9ubHlUcnltZXNzYWdlT25seVRyeXRlbXBsYXRlT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoT3BlcmF0b3IgJyNuYW1lJyBzaG91bGQgaGF2ZSB6ZXJvIG9yIG9uZSBwYXJhbWV0ZXIuV2l0aCB6ZXJvIHBhcmFtZXRlcnMsIGl0IGhhcyB0aGUgc3ludGFjdGljIGZvcm0gJy1hJywgZm9ybWFsbHkga25vd24gYXMgJ3VuYXJ5LScuIFdpdGggb25lIHBhcmFtZXRlciwgaXQgaGFzIHRoZSBzeW50YWN0aWMgZm9ybSAnYSAtIGInLCBmb3JtYWxseSBrbm93biBhcyAnLScuY29kZU9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaE9wZXJhdG9yTWludXNQYXJhbWV0ZXJNaXNtYXRjaFdST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9PUEVSQVRPUl9NSU5VU3RlbXBsYXRlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDBPcGVyYXRvciAnI25hbWUnIHNob3VsZG4ndCBoYXZlIGFueSBwYXJhbWV0ZXJzLmNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoME9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gwdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMU9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyLmNvZGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMU9wZXJhdG9yUGFyYW1ldGVyTWlzbWF0Y2gxV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX09QRVJBVE9SdGVtcGxhdGVPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMk9wZXJhdG9yICcjbmFtZScgc2hvdWxkIGhhdmUgZXhhY3RseSB0d28gcGFyYW1ldGVycy5jb2RlT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDJPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMmNvZGVPcGVyYXRvcldpdGhPcHRpb25hbEZvcm1hbHNBbiBvcGVyYXRvciBjYW4ndCBoYXZlIG9wdGlvbmFsIHBhcmFtZXRlcnMuT3BlcmF0b3JXaXRoT3B0aW9uYWxGb3JtYWxzbWVzc2FnZU9wZXJhdG9yV2l0aE9wdGlvbmFsRm9ybWFsc2NvZGVPcGVyYXRvcldpdGhUeXBlUGFyYW1ldGVyc1R5cGVzIHBhcmFtZXRlcnMgYXJlbid0IGFsbG93ZWQgd2hlbiBkZWZpbmluZyBhbiBvcGVyYXRvci5PcGVyYXRvcldpdGhUeXBlUGFyYW1ldGVyc1RZUEVfUEFSQU1FVEVSX09OX09QRVJBVE9SbWVzc2FnZU9wZXJhdG9yV2l0aFR5cGVQYXJhbWV0ZXJzdGVtcGxhdGVPdmVycmlkZGVuTWV0aG9kQ2F1c2VUaGlzIGlzIHRoZSBvdmVycmlkZGVuIG1ldGhvZCAoJyNuYW1lJykuY29kZU92ZXJyaWRkZW5NZXRob2RDYXVzZU92ZXJyaWRkZW5NZXRob2RDYXVzZXRlbXBsYXRlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzVGhlIG1ldGhvZCAnI25hbWUnIGhhcyBmZXdlciBuYW1lZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy5jb2RlT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzSU5WQUxJRF9PVkVSUklERV9OQU1FRHRlbXBsYXRlT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHNUaGUgbWV0aG9kICcjbmFtZScgaGFzIGZld2VyIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJyNuYW1lMicuY29kZU92ZXJyaWRlRmV3ZXJQb3NpdGlvbmFsQXJndW1lbnRzT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHNJTlZBTElEX09WRVJSSURFX1BPU0lUSU9OQUx0ZW1wbGF0ZU92ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlclRoZSBtZXRob2QgJyNuYW1lJyBkb2Vzbid0IGhhdmUgdGhlIG5hbWVkIHBhcmFtZXRlciAnI25hbWUyJyBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUzJy5jb2RlT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVyT3ZlcnJpZGVNaXNtYXRjaE5hbWVkUGFyYW1ldGVydGVtcGxhdGVPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50c1RoZSBtZXRob2QgJyNuYW1lJyBoYXMgbW9yZSByZXF1aXJlZCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnI25hbWUyJy5jb2RlT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHNPdmVycmlkZU1vcmVSZXF1aXJlZEFyZ3VtZW50c0lOVkFMSURfT1ZFUlJJREVfUkVRVUlSRUR0ZW1wbGF0ZU92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJyNuYW1lJyBkb2Vzbid0IG1hdGNoIHRob3NlIG9uIG92ZXJyaWRkZW4gbWV0aG9kICcjbmFtZTInLmNvZGVPdmVycmlkZVR5cGVWYXJpYWJsZXNNaXNtYXRjaE92ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoSU5WQUxJRF9NRVRIT0RfT1ZFUlJJREVfVFlQRV9QQVJBTUVURVJTdGVtcGxhdGVQYWNrYWdlTm90Rm91bmRDb3VsZCBub3QgcmVzb2x2ZSB0aGUgcGFja2FnZSAnI25hbWUnIGluICcjdXJpJy5jb2RlUGFja2FnZU5vdEZvdW5kUGFja2FnZU5vdEZvdW5kY29kZVBhY2thZ2VzRmlsZUZvcm1hdFBhY2thZ2VzRmlsZUZvcm1hdGNvZGVQYXJ0RXhwb3J0Q2FuJ3QgZXhwb3J0IHRoaXMgZmlsZSBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLlBhcnRFeHBvcnRFWFBPUlRfT0ZfTk9OX0xJQlJBUlltZXNzYWdlUGFydEV4cG9ydGNvZGVQYXJ0RXhwb3J0Q29udGV4dFRoaXMgaXMgdGhlIGZpbGUgdGhhdCBjYW4ndCBiZSBleHBvcnRlZC5QYXJ0RXhwb3J0Q29udGV4dG1lc3NhZ2VQYXJ0RXhwb3J0Q29udGV4dGNvZGVQYXJ0SW5QYXJ0QSBmaWxlIHRoYXQncyBhIHBhcnQgb2YgYSBsaWJyYXJ5IGNhbid0IGhhdmUgcGFydHMgaXRzZWxmLlRyeSBtb3ZpbmcgdGhlICdwYXJ0JyBkZWNsYXJhdGlvbiB0byB0aGUgY29udGFpbmluZyBsaWJyYXJ5LlBhcnRJblBhcnRtZXNzYWdlUGFydEluUGFydGNvZGVQYXJ0SW5QYXJ0TGlicmFyeUNvbnRleHRUaGlzIGlzIHRoZSBjb250YWluaW5nIGxpYnJhcnkuUGFydEluUGFydExpYnJhcnlDb250ZXh0bWVzc2FnZVBhcnRJblBhcnRMaWJyYXJ5Q29udGV4dHRlbXBsYXRlUGFydE9mSW5MaWJyYXJ5Q2FuJ3QgaW1wb3J0ICcjdXJpJywgYmVjYXVzZSBpdCBoYXMgYSAncGFydCBvZicgZGVjbGFyYXRpb24uVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24sIG9yIHVzaW5nICcjdXJpJyBhcyBhIHBhcnQuY29kZVBhcnRPZkluTGlicmFyeVBhcnRPZkluTGlicmFyeUlNUE9SVF9PRl9OT05fTElCUkFSWXRlbXBsYXRlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjbmFtZScgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUyJy5jb2RlUGFydE9mTGlicmFyeU5hbWVNaXNtYXRjaFBhcnRPZkxpYnJhcnlOYW1lTWlzbWF0Y2hQQVJUX09GX0RJRkZFUkVOVF9MSUJSQVJZY29kZVBhcnRPZlNlbGZBIGZpbGUgY2FuJ3QgYmUgYSBwYXJ0IG9mIGl0c2VsZi5QYXJ0T2ZTZWxmbWVzc2FnZVBhcnRPZlNlbGZjb2RlUGFydE9mVHdpY2VPbmx5IG9uZSBwYXJ0LW9mIGRpcmVjdGl2ZSBtYXkgYmUgZGVjbGFyZWQgaW4gYSBmaWxlLlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBvZiB0aGUgcGFydC1vZiBkaXJlY3RpdmVzLlBhcnRPZlR3aWNlbWVzc2FnZVBhcnRPZlR3aWNlY29kZVBhcnRPZlR3b0xpYnJhcmllc0EgZmlsZSBjYW4ndCBiZSBwYXJ0IG9mIG1vcmUgdGhhbiBvbmUgbGlicmFyeS5UcnkgbW92aW5nIHRoZSBzaGFyZWQgZGVjbGFyYXRpb25zIGludG8gdGhlIGxpYnJhcmllcywgb3IgaW50byBhIG5ldyBsaWJyYXJ5LlBhcnRPZlR3b0xpYnJhcmllc21lc3NhZ2VQYXJ0T2ZUd29MaWJyYXJpZXNjb2RlUGFydE9mVHdvTGlicmFyaWVzQ29udGV4dFVzZWQgYXMgYSBwYXJ0IGluIHRoaXMgbGlicmFyeS5QYXJ0T2ZUd29MaWJyYXJpZXNDb250ZXh0bWVzc2FnZVBhcnRPZlR3b0xpYnJhcmllc0NvbnRleHR0ZW1wbGF0ZVBhcnRPZlVyaU1pc21hdGNoVXNpbmcgJyN1cmknIGFzIHBhcnQgb2YgJyN1cmkyJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICcjdXJpMycuY29kZVBhcnRPZlVyaU1pc21hdGNoUGFydE9mVXJpTWlzbWF0Y2h0ZW1wbGF0ZVBhcnRPZlVzZVVyaVVzaW5nICcjdXJpJyBhcyBwYXJ0IG9mICcjdXJpMicgYnV0IGl0cyAncGFydCBvZicgZGVjbGFyYXRpb24gc2F5cyAnI25hbWUnLlRyeSBjaGFuZ2luZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uIHRvIHVzZSBhIHJlbGF0aXZlIGZpbGUgbmFtZS5jb2RlUGFydE9mVXNlVXJpUGFydE9mVXNlVXJpUEFSVF9PRl9VTk5BTUVEX0xJQlJBUlljb2RlUGFydE9ycGhhblRoaXMgcGFydCBkb2Vzbid0IGhhdmUgYSBjb250YWluaW5nIGxpYnJhcnkuVHJ5IHJlbW92aW5nIHRoZSAncGFydCBvZicgZGVjbGFyYXRpb24uUGFydE9ycGhhbm1lc3NhZ2VQYXJ0T3JwaGFudGVtcGxhdGVQYXJ0VHdpY2VDYW4ndCB1c2UgJyN1cmknIGFzIGEgcGFydCBtb3JlIHRoYW4gb25jZS5jb2RlUGFydFR3aWNlUGFydFR3aWNlRFVQTElDQVRFX1BBUlRjb2RlUGF0Y2hDbGFzc09yaWdpblRoaXMgaXMgdGhlIG9yaWdpbiBjbGFzcy5QYXRjaENsYXNzT3JpZ2lubWVzc2FnZVBhdGNoQ2xhc3NPcmlnaW5jb2RlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaEEgcGF0Y2ggY2xhc3MgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiB0eXBlIHZhcmlhYmxlcyBhcyBpdHMgb3JpZ2luIGNsYXNzLlBhdGNoQ2xhc3NUeXBlVmFyaWFibGVzTWlzbWF0Y2htZXNzYWdlUGF0Y2hDbGFzc1R5cGVWYXJpYWJsZXNNaXNtYXRjaGNvZGVQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2hUaGlzIHBhdGNoIGRvZXNuJ3QgbWF0Y2ggb3JpZ2luIGRlY2xhcmF0aW9uLlBhdGNoRGVjbGFyYXRpb25NaXNtYXRjaG1lc3NhZ2VQYXRjaERlY2xhcmF0aW9uTWlzbWF0Y2hjb2RlUGF0Y2hEZWNsYXJhdGlvbk9yaWdpblRoaXMgaXMgdGhlIG9yaWdpbiBkZWNsYXJhdGlvbi5QYXRjaERlY2xhcmF0aW9uT3JpZ2lubWVzc2FnZVBhdGNoRGVjbGFyYXRpb25PcmlnaW50ZW1wbGF0ZVBhdGNoSW5qZWN0aW9uRmFpbGVkQ2FuJ3QgaW5qZWN0ICcjbmFtZScgaW50byAnI3VyaScuVHJ5IGFkZGluZyAnQHBhdGNoJy5jb2RlUGF0Y2hJbmplY3Rpb25GYWlsZWRQYXRjaEluamVjdGlvbkZhaWxlZGNvZGVQYXRjaE5vbkV4dGVybmFsQ2FuJ3QgYXBwbHkgdGhpcyBwYXRjaCBhcyBpdHMgb3JpZ2luIGRlY2xhcmF0aW9uIGlzbid0IGV4dGVybmFsLlRyeSBhZGRpbmcgJ2V4dGVybmFsJyB0byB0aGUgb3JpZ2luIGRlY2xhcmF0aW9uLlBhdGNoTm9uRXh0ZXJuYWxtZXNzYWdlUGF0Y2hOb25FeHRlcm5hbGNvZGVQbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzQ2FuJ3QgYWNjZXNzIHBsYXRmb3JtIHByaXZhdGUgbGlicmFyeS5QbGF0Zm9ybVByaXZhdGVMaWJyYXJ5QWNjZXNzSU1QT1JUX0lOVEVSTkFMX0xJQlJBUlltZXNzYWdlUGxhdGZvcm1Qcml2YXRlTGlicmFyeUFjY2Vzc2NvZGVQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50UGxhY2UgcG9zaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIG5hbWVkIGFyZ3VtZW50cy5UcnkgbW92aW5nIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IGJlZm9yZSB0aGUgbmFtZWQgYXJndW1lbnRzLCBvciBhZGQgYSBuYW1lIHRvIHRoZSBhcmd1bWVudC5Qb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50UE9TSVRJT05BTF9BRlRFUl9OQU1FRF9BUkdVTUVOVG1lc3NhZ2VQb3NpdGlvbmFsQWZ0ZXJOYW1lZEFyZ3VtZW50Y29kZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzUG9zaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IHVzZSAnOicgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuVHJ5IHJlcGxhY2luZyAnOicgd2l0aCAnPScuUG9zaXRpb25hbFBhcmFtZXRlcldpdGhFcXVhbHNXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSbWVzc2FnZVBvc2l0aW9uYWxQYXJhbWV0ZXJXaXRoRXF1YWxzY29kZVByZWZpeEFmdGVyQ29tYmluYXRvclRoZSBwcmVmaXggKCdhcycgY2xhdXNlKSBzaG91bGQgY29tZSBiZWZvcmUgYW55IHNob3cvaGlkZSBjb21iaW5hdG9ycy5UcnkgbW92aW5nIHRoZSBwcmVmaXggYmVmb3JlIHRoZSBjb21iaW5hdG9ycy5QcmVmaXhBZnRlckNvbWJpbmF0b3JtZXNzYWdlUHJlZml4QWZ0ZXJDb21iaW5hdG9yY29kZVByaXZhdGVOYW1lZFBhcmFtZXRlckFuIG9wdGlvbmFsIG5hbWVkIHBhcmFtZXRlciBjYW4ndCBzdGFydCB3aXRoICdfJy5Qcml2YXRlTmFtZWRQYXJhbWV0ZXJQUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUm1lc3NhZ2VQcml2YXRlTmFtZWRQYXJhbWV0ZXJjb2RlUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5UmVkaXJlY3RpbmcgY29uc3RydWN0b3JzIGNhbid0IGhhdmUgYSBib2R5LlRyeSByZW1vdmluZyB0aGUgYm9keSwgb3Igbm90IG1ha2luZyB0aGlzIGEgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IuUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcldpdGhCb2R5bWVzc2FnZVJlZGlyZWN0aW5nQ29uc3RydWN0b3JXaXRoQm9keWNvZGVSZWRpcmVjdGlvbkluTm9uRmFjdG9yeU9ubHkgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4gc3BlY2lmeSAnPScgcmVkaXJlY3Rpb24uVHJ5IG1ha2luZyB0aGlzIGEgZmFjdG9yeSBjb25zdHJ1Y3Rvciwgb3IgcmVtb3ZlIHRoZSByZWRpcmVjdGlvbi5SZWRpcmVjdGlvbkluTm9uRmFjdG9yeW1lc3NhZ2VSZWRpcmVjdGlvbkluTm9uRmFjdG9yeXRlbXBsYXRlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZFJlZGlyZWN0aW9uIGNvbnN0cnVjdG9yIHRhcmdldCBub3QgZm91bmQ6ICcjbmFtZSdjb2RlUmVkaXJlY3Rpb25UYXJnZXROb3RGb3VuZFJlZGlyZWN0aW9uVGFyZ2V0Tm90Rm91bmRSRURJUkVDVF9UT19NSVNTSU5HX0NPTlNUUlVDVE9SdGVtcGxhdGVSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlRXJyb3JOYW1lZCBwYXJhbWV0ZXIgJyNuYW1lJyBpcyByZXF1aXJlZCBhbmQgY2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuY29kZVJlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVFcnJvclJlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVFcnJvcnRlbXBsYXRlUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZVdhcm5pbmdOYW1lZCBwYXJhbWV0ZXIgJyNuYW1lJyBpcyByZXF1aXJlZCBhbmQgaGFzIGEgZGVmYXVsdCB2YWx1ZS5jb2RlUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZVdhcm5pbmdSZXF1aXJlZE5hbWVkUGFyYW1ldGVySGFzRGVmYXVsdFZhbHVlV2FybmluZ2NvZGVSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0Tm9uLW9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuVHJ5IHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG1ha2luZyB0aGUgcGFyYW1ldGVyIG9wdGlvbmFsLlJlcXVpcmVkUGFyYW1ldGVyV2l0aERlZmF1bHROQU1FRF9QQVJBTUVURVJfT1VUU0lERV9HUk9VUG1lc3NhZ2VSZXF1aXJlZFBhcmFtZXRlcldpdGhEZWZhdWx0Y29kZVJldGhyb3dOb3RDYXRjaCdyZXRocm93JyBjYW4gb25seSBiZSB1c2VkIGluIGNhdGNoIGNsYXVzZXMuUmV0aHJvd05vdENhdGNoUkVUSFJPV19PVVRTSURFX0NBVENIbWVzc2FnZVJldGhyb3dOb3RDYXRjaGNvZGVSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uQ2FuJ3QgcmV0dXJuIGEgdmFsdWUgZnJvbSBhIHZvaWQgZnVuY3Rpb24uUmV0dXJuRnJvbVZvaWRGdW5jdGlvblJFVFVSTl9PRl9JTlZBTElEX1RZUEVtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbmNvZGVSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uQSBmdW5jdGlvbiBleHByZXNzaW9uIGNhbid0IGhhdmUgYSByZXR1cm4gdHlwZS5SZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9ubWVzc2FnZVJldHVyblR5cGVGdW5jdGlvbkV4cHJlc3Npb25jb2RlUmV0dXJuV2l0aG91dEV4cHJlc3Npb25NdXN0IGV4cGxpY2l0bHkgcmV0dXJuIGEgdmFsdWUgZnJvbSBhIG5vbi12b2lkIGZ1bmN0aW9uLlJldHVybldpdGhvdXRFeHByZXNzaW9uUkVUVVJOX1dJVEhPVVRfVkFMVUVtZXNzYWdlUmV0dXJuV2l0aG91dEV4cHJlc3Npb25jb2RlU2RrUm9vdE5vdEZvdW5kU2RrUm9vdE5vdEZvdW5kY29kZVNka1NwZWNpZmljYXRpb25Ob3RGb3VuZFNka1NwZWNpZmljYXRpb25Ob3RGb3VuZGNvZGVTZGtTdW1tYXJ5Tm90Rm91bmRTZGtTdW1tYXJ5Tm90Rm91bmRjb2RlU2V0TGl0ZXJhbFRvb01hbnlUeXBlQXJndW1lbnRzQSBzZXQgbGl0ZXJhbCByZXF1aXJlcyBleGFjdGx5IG9uZSB0eXBlIGFyZ3VtZW50LlNldExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c21lc3NhZ2VTZXRMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNjb2RlU2V0T3JNYXBMaXRlcmFsVG9vTWFueVR5cGVBcmd1bWVudHNBIHNldCBvciBtYXAgbGl0ZXJhbCByZXF1aXJlcyBleGFjdGx5IG9uZSBvciB0d28gdHlwZSBhcmd1bWVudHMsIHJlc3BlY3RpdmVseS5TZXRPck1hcExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c21lc3NhZ2VTZXRPck1hcExpdGVyYWxUb29NYW55VHlwZUFyZ3VtZW50c3RlbXBsYXRlU2V0dGVyTm90Rm91bmRTZXR0ZXIgbm90IGZvdW5kOiAnI25hbWUnLmNvZGVTZXR0ZXJOb3RGb3VuZFNldHRlck5vdEZvdW5kY29kZVNldHRlck5vdFN5bmNTZXR0ZXJzIGNhbid0IHVzZSAnYXN5bmMnLCAnYXN5bmMqJywgb3IgJ3N5bmMqJy5TZXR0ZXJOb3RTeW5jSU5WQUxJRF9NT0RJRklFUl9PTl9TRVRURVJtZXNzYWdlU2V0dGVyTm90U3luY2NvZGVTZXR0ZXJXaXRoV3JvbmdOdW1iZXJPZkZvcm1hbHNBIHNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBmb3JtYWwgcGFyYW1ldGVyLlNldHRlcldpdGhXcm9uZ051bWJlck9mRm9ybWFsc1dST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9TRVRURVJtZXNzYWdlU2V0dGVyV2l0aFdyb25nTnVtYmVyT2ZGb3JtYWxzdGVtcGxhdGVTb3VyY2VCb2R5U3VtbWFyeUJ1aWx0IGJvZGllcyBmb3IgI2NvdW50IGNvbXBpbGF0aW9uIHVuaXRzICgjY291bnQyIGJ5dGVzKSBpbiAjbnVtMSUuM21zLCB0aGF0IGlzLAojbnVtMiUxMi4zIGJ5dGVzL21zLCBhbmQKI251bTMlMTIuMyBtcy9jb21waWxhdGlvbiB1bml0LmNvZGVTb3VyY2VCb2R5U3VtbWFyeVNvdXJjZUJvZHlTdW1tYXJ5dGVtcGxhdGVTb3VyY2VPdXRsaW5lU3VtbWFyeUJ1aWx0IG91dGxpbmVzIGZvciAjY291bnQgY29tcGlsYXRpb24gdW5pdHMgKCNjb3VudDIgYnl0ZXMpIGluICNudW0xJS4zbXMsIHRoYXQgaXMsCiNudW0yJTEyLjMgYnl0ZXMvbXMsIGFuZAojbnVtMyUxMi4zIG1zL2NvbXBpbGF0aW9uIHVuaXQuY29kZVNvdXJjZU91dGxpbmVTdW1tYXJ5U291cmNlT3V0bGluZVN1bW1hcnljb2RlU3ByZWFkRWxlbWVudEl0ZXJhYmxlIHNwcmVhZC5TcHJlYWRFbGVtZW50bWVzc2FnZVNwcmVhZEVsZW1lbnRjb2RlU3ByZWFkTWFwRWxlbWVudE1hcCBzcHJlYWQuU3ByZWFkTWFwRWxlbWVudG1lc3NhZ2VTcHJlYWRNYXBFbGVtZW50Y29kZVN0YWNrT3ZlcmZsb3dUaGUgZmlsZSBoYXMgdG9vIG1hbnkgbmVzdGVkIGV4cHJlc3Npb25zIG9yIHN0YXRlbWVudHMuVHJ5IHNpbXBsaWZ5aW5nIHRoZSBjb2RlLlN0YWNrT3ZlcmZsb3dtZXNzYWdlU3RhY2tPdmVyZmxvd2NvZGVTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0VGhpcyBzdGF0aWMgbWVtYmVyIGNvbmZsaWN0cyB3aXRoIGFuIGluc3RhbmNlIG1lbWJlci5TdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q09ORkxJQ1RJTkdfU1RBVElDX0FORF9JTlNUQU5DRW1lc3NhZ2VTdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Y29kZVN0YXRpY0FuZEluc3RhbmNlQ29uZmxpY3RDYXVzZVRoaXMgaXMgdGhlIGluc3RhbmNlIG1lbWJlci5TdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0Q2F1c2VtZXNzYWdlU3RhdGljQW5kSW5zdGFuY2VDb25mbGljdENhdXNlY29kZVN0YXRpY0NvbnN0cnVjdG9yQ29uc3RydWN0b3JzIGNhbid0IGJlIHN0YXRpYy5UcnkgcmVtb3ZpbmcgdGhlIGtleXdvcmQgJ3N0YXRpYycuU3RhdGljQ29uc3RydWN0b3JtZXNzYWdlU3RhdGljQ29uc3RydWN0b3Jjb2RlU3RhdGljT3BlcmF0b3JPcGVyYXRvcnMgY2FuJ3QgYmUgc3RhdGljLlN0YXRpY09wZXJhdG9ybWVzc2FnZVN0YXRpY09wZXJhdG9yY29kZVN1cGVyQXNFeHByZXNzaW9uQ2FuJ3QgdXNlICdzdXBlcicgYXMgYW4gZXhwcmVzc2lvbi5UbyBkZWxlZ2F0ZSBhIGNvbnN0cnVjdG9yIHRvIGEgc3VwZXIgY29uc3RydWN0b3IsIHB1dCB0aGUgc3VwZXIgY2FsbCBhcyBhbiBpbml0aWFsaXplci5TdXBlckFzRXhwcmVzc2lvblNVUEVSX0FTX0VYUFJFU1NJT05tZXNzYWdlU3VwZXJBc0V4cHJlc3Npb25jb2RlU3VwZXJBc0lkZW50aWZpZXJFeHBlY3RlZCBpZGVudGlmaWVyLCBidXQgZ290ICdzdXBlcicuU3VwZXJBc0lkZW50aWZpZXJtZXNzYWdlU3VwZXJBc0lkZW50aWZpZXJjb2RlU3VwZXJJbml0aWFsaXplck5vdExhc3RDYW4ndCBoYXZlIGluaXRpYWxpemVycyBhZnRlciAnc3VwZXInLlN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0SU5WQUxJRF9TVVBFUl9JTlZPQ0FUSU9ObWVzc2FnZVN1cGVySW5pdGlhbGl6ZXJOb3RMYXN0Y29kZVN1cGVyTnVsbEF3YXJlVGhlIG9wZXJhdG9yICc/LicgY2Fubm90IGJlIHVzZWQgd2l0aCAnc3VwZXInIGJlY2F1c2UgJ3N1cGVyJyBjYW5ub3QgYmUgbnVsbC5TdXBlck51bGxBd2FyZW1lc3NhZ2VTdXBlck51bGxBd2FyZXRlbXBsYXRlU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3JTdXBlcmNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciBuYW1lZCAnI25hbWUnLmNvZGVTdXBlcmNsYXNzSGFzTm9Db25zdHJ1Y3RvclN1cGVyY2xhc3NIYXNOb0NvbnN0cnVjdG9yVU5ERUZJTkVEX0NPTlNUUlVDVE9SX0lOX0lOSVRJQUxJWkVSVU5ERUZJTkVEX0NPTlNUUlVDVE9SX0lOX0lOSVRJQUxJWkVSX0RFRkFVTFR0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb0RlZmF1bHRDb25zdHJ1Y3RvclRoZSBzdXBlcmNsYXNzLCAnI25hbWUnLCBoYXMgbm8gdW5uYW1lZCBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy5jb2RlU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yU3VwZXJjbGFzc0hhc05vRGVmYXVsdENvbnN0cnVjdG9yTk9fREVGQVVMVF9TVVBFUl9DT05TVFJVQ1RPUl9JTVBMSUNJVHRlbXBsYXRlU3VwZXJjbGFzc0hhc05vR2V0dGVyU3VwZXJjbGFzcyBoYXMgbm8gZ2V0dGVyIG5hbWVkICcjbmFtZScuY29kZVN1cGVyY2xhc3NIYXNOb0dldHRlclN1cGVyY2xhc3NIYXNOb0dldHRlclVOREVGSU5FRF9TVVBFUl9HRVRURVJ0ZW1wbGF0ZVN1cGVyY2xhc3NIYXNOb01ldGhvZFN1cGVyY2xhc3MgaGFzIG5vIG1ldGhvZCBuYW1lZCAnI25hbWUnLmNvZGVTdXBlcmNsYXNzSGFzTm9NZXRob2RTdXBlcmNsYXNzSGFzTm9NZXRob2RVTkRFRklORURfU1VQRVJfTUVUSE9EdGVtcGxhdGVTdXBlcmNsYXNzSGFzTm9TZXR0ZXJTdXBlcmNsYXNzIGhhcyBubyBzZXR0ZXIgbmFtZWQgJyNuYW1lJy5jb2RlU3VwZXJjbGFzc0hhc05vU2V0dGVyU3VwZXJjbGFzc0hhc05vU2V0dGVyVU5ERUZJTkVEX1NVUEVSX1NFVFRFUnRlbXBsYXRlU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2hTdXBlcmNsYXNzIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCAnI25hbWUnIHdpdGggbWF0Y2hpbmcgYXJndW1lbnRzLmNvZGVTdXBlcmNsYXNzTWV0aG9kQXJndW1lbnRNaXNtYXRjaFN1cGVyY2xhc3NNZXRob2RBcmd1bWVudE1pc21hdGNoY29kZVN1cGVydHlwZUlzRnVuY3Rpb25DYW4ndCB1c2UgYSBmdW5jdGlvbiB0eXBlIGFzIHN1cGVydHlwZS5TdXBlcnR5cGVJc0Z1bmN0aW9ubWVzc2FnZVN1cGVydHlwZUlzRnVuY3Rpb250ZW1wbGF0ZVN1cGVydHlwZUlzSWxsZWdhbFRoZSB0eXBlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuY29kZVN1cGVydHlwZUlzSWxsZWdhbFN1cGVydHlwZUlzSWxsZWdhbEVYVEVORFNfTk9OX0NMQVNTdGVtcGxhdGVTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZVRoZSB0eXBlIHZhcmlhYmxlICcjbmFtZScgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuY29kZVN1cGVydHlwZUlzVHlwZVZhcmlhYmxlU3VwZXJ0eXBlSXNUeXBlVmFyaWFibGVjb2RlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoU3dpdGNoIGNhc2UgbWF5IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlLlN3aXRjaENhc2VGYWxsVGhyb3VnaENBU0VfQkxPQ0tfTk9UX1RFUk1JTkFURURtZXNzYWdlU3dpdGNoQ2FzZUZhbGxUaHJvdWdoY29kZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2VUaGUgc3dpdGNoIGV4cHJlc3Npb24gaXMgaGVyZS5Td2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZUNhdXNlbWVzc2FnZVN3aXRjaEV4cHJlc3Npb25Ob3RBc3NpZ25hYmxlQ2F1c2Vjb2RlU3dpdGNoSGFzQ2FzZUFmdGVyRGVmYXVsdFRoZSBkZWZhdWx0IGNhc2Ugc2hvdWxkIGJlIHRoZSBsYXN0IGNhc2UgaW4gYSBzd2l0Y2ggc3RhdGVtZW50LlRyeSBtb3ZpbmcgdGhlIGRlZmF1bHQgY2FzZSBhZnRlciB0aGUgb3RoZXIgY2FzZSBjbGF1c2VzLlN3aXRjaEhhc0Nhc2VBZnRlckRlZmF1bHRtZXNzYWdlU3dpdGNoSGFzQ2FzZUFmdGVyRGVmYXVsdGNvZGVTd2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzVGhlICdkZWZhdWx0JyBjYXNlIGNhbiBvbmx5IGJlIGRlY2xhcmVkIG9uY2UuVHJ5IHJlbW92aW5nIGFsbCBidXQgb25lIGRlZmF1bHQgY2FzZS5Td2l0Y2hIYXNNdWx0aXBsZURlZmF1bHRzbWVzc2FnZVN3aXRjaEhhc011bHRpcGxlRGVmYXVsdHNjb2RlU3ludGhldGljVG9rZW5UaGlzIGNvdWxkbid0IGJlIHBhcnNlZC5TeW50aGV0aWNUb2tlbm1lc3NhZ2VTeW50aGV0aWNUb2tlbnRlbXBsYXRlVGhpc0FjY2Vzc0luRmllbGRJbml0aWFsaXplckNhbid0IGFjY2VzcyAndGhpcycgaW4gYSBmaWVsZCBpbml0aWFsaXplciB0byByZWFkICcjbmFtZScuY29kZVRoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJUaGlzQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyVEhJU19BQ0NFU1NfRlJPTV9GSUVMRF9JTklUSUFMSVpFUmNvZGVUaGlzQXNJZGVudGlmaWVyRXhwZWN0ZWQgaWRlbnRpZmllciwgYnV0IGdvdCAndGhpcycuVGhpc0FzSWRlbnRpZmllcklOVkFMSURfUkVGRVJFTkNFX1RPX1RISVNtZXNzYWdlVGhpc0FzSWRlbnRpZmllcmNvZGVUaGlzSW5pdGlhbGl6ZXJOb3RBbG9uZUNhbid0IGhhdmUgb3RoZXIgaW5pdGlhbGl6ZXJzIHRvZ2V0aGVyIHdpdGggJ3RoaXMnLlRoaXNJbml0aWFsaXplck5vdEFsb25lRklFTERfSU5JVElBTElaRVJfUkVESVJFQ1RJTkdfQ09OU1RSVUNUT1JtZXNzYWdlVGhpc0luaXRpYWxpemVyTm90QWxvbmV0ZW1wbGF0ZVRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyQ2FuJ3QgYWNjZXNzICcjc3RyaW5nJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyLmNvZGVUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplclRoaXNPclN1cGVyQWNjZXNzSW5GaWVsZEluaXRpYWxpemVyVEhJU19BQ0NFU1NfRlJPTV9JTklUSUFMSVpFUnRlbXBsYXRlVG9vRmV3QXJndW1lbnRzVG9vIGZldyBwb3NpdGlvbmFsIGFyZ3VtZW50czogI2NvdW50IHJlcXVpcmVkLCAjY291bnQyIGdpdmVuLmNvZGVUb29GZXdBcmd1bWVudHNUb29GZXdBcmd1bWVudHNOT1RfRU5PVUdIX1JFUVVJUkVEX0FSR1VNRU5UU3RlbXBsYXRlVG9vTWFueUFyZ3VtZW50c1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzOiAjY291bnQgYWxsb3dlZCwgYnV0ICNjb3VudDIgZm91bmQuVHJ5IHJlbW92aW5nIHRoZSBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cy5jb2RlVG9vTWFueUFyZ3VtZW50c1Rvb01hbnlBcmd1bWVudHNjb2RlVG9wTGV2ZWxPcGVyYXRvck9wZXJhdG9ycyBtdXN0IGJlIGRlY2xhcmVkIHdpdGhpbiBhIGNsYXNzLlRyeSByZW1vdmluZyB0aGUgb3BlcmF0b3IsIG1vdmluZyBpdCB0byBhIGNsYXNzLCBvciBjb252ZXJ0aW5nIGl0IHRvIGJlIGEgZnVuY3Rpb24uVG9wTGV2ZWxPcGVyYXRvcm1lc3NhZ2VUb3BMZXZlbE9wZXJhdG9yY29kZVR5cGVBZnRlclZhclZhcmlhYmxlcyBjYW4ndCBiZSBkZWNsYXJlZCB1c2luZyBib3RoICd2YXInIGFuZCBhIHR5cGUgbmFtZS5UcnkgcmVtb3ZpbmcgJ3Zhci4nVHlwZUFmdGVyVmFybWVzc2FnZVR5cGVBZnRlclZhcnRlbXBsYXRlVHlwZUFyZ3VtZW50TWlzbWF0Y2hFeHBlY3RlZCAjY291bnQgdHlwZSBhcmd1bWVudHMuY29kZVR5cGVBcmd1bWVudE1pc21hdGNoVHlwZUFyZ3VtZW50TWlzbWF0Y2hXUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFN0ZW1wbGF0ZVR5cGVBcmd1bWVudHNPblR5cGVWYXJpYWJsZUNhbid0IHVzZSB0eXBlIGFyZ3VtZW50cyB3aXRoIHR5cGUgdmFyaWFibGUgJyNuYW1lJy5UcnkgcmVtb3ZpbmcgdGhlIHR5cGUgYXJndW1lbnRzLmNvZGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGVUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGVjb2RlVHlwZUJlZm9yZUZhY3RvcnlGYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlLlRyeSByZW1vdmluZyB0aGUgdHlwZSBhcHBlYXJpbmcgYmVmb3JlICdmYWN0b3J5Jy5UeXBlQmVmb3JlRmFjdG9yeW1lc3NhZ2VUeXBlQmVmb3JlRmFjdG9yeXRlbXBsYXRlVHlwZU5vdEZvdW5kVHlwZSAnI25hbWUnIG5vdCBmb3VuZC5jb2RlVHlwZU5vdEZvdW5kVHlwZU5vdEZvdW5kVU5ERUZJTkVEX0NMQVNTdGVtcGxhdGVUeXBlT3JpZ2luJyNuYW1lJyBpcyBmcm9tICcjdXJpJy5jb2RlVHlwZU9yaWdpblR5cGVPcmlnaW50ZW1wbGF0ZVR5cGVPcmlnaW5XaXRoRmlsZVVyaScjbmFtZScgaXMgZnJvbSAnI3VyaScgKCcjdXJpMicpLmNvZGVUeXBlT3JpZ2luV2l0aEZpbGVVcmlUeXBlT3JpZ2luV2l0aEZpbGVVcmljb2RlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVBIHR5cGUgdmFyaWFibGUgY2FuJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGFub3RoZXIuVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVtZXNzYWdlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWV0ZW1wbGF0ZVR5cGVWYXJpYWJsZUR1cGxpY2F0ZWROYW1lQ2F1c2VUaGUgb3RoZXIgdHlwZSB2YXJpYWJsZSBuYW1lZCAnI25hbWUnLmNvZGVUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlVHlwZVZhcmlhYmxlRHVwbGljYXRlZE5hbWVDYXVzZWNvZGVUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dFR5cGUgdmFyaWFibGVzIGNhbid0IGJlIHVzZWQgYXMgY29uc3RhbnRzLlR5cGVWYXJpYWJsZUluQ29uc3RhbnRDb250ZXh0VFlQRV9QQVJBTUVURVJfSU5fQ09OU1RfRVhQUkVTU0lPTm1lc3NhZ2VUeXBlVmFyaWFibGVJbkNvbnN0YW50Q29udGV4dGNvZGVUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHRUeXBlIHZhcmlhYmxlcyBjYW4ndCBiZSB1c2VkIGluIHN0YXRpYyBtZW1iZXJzLlR5cGVWYXJpYWJsZUluU3RhdGljQ29udGV4dG1lc3NhZ2VUeXBlVmFyaWFibGVJblN0YXRpY0NvbnRleHRjb2RlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZ0EgdHlwZSB2YXJpYWJsZSBjYW4ndCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgaXRzIGVuY2xvc2luZyBkZWNsYXJhdGlvbi5UeXBlVmFyaWFibGVTYW1lTmFtZUFzRW5jbG9zaW5nQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfQ0xBU1NtZXNzYWdlVHlwZVZhcmlhYmxlU2FtZU5hbWVBc0VuY2xvc2luZ2NvZGVUeXBlZGVmSW5DbGFzc1R5cGVkZWZzIGNhbid0IGJlIGRlY2xhcmVkIGluc2lkZSBjbGFzc2VzLlRyeSBtb3ZpbmcgdGhlIHR5cGVkZWYgdG8gdGhlIHRvcC1sZXZlbC5UeXBlZGVmSW5DbGFzc21lc3NhZ2VUeXBlZGVmSW5DbGFzc2NvZGVUeXBlZGVmTm90RnVuY3Rpb25DYW4ndCBjcmVhdGUgdHlwZWRlZiBmcm9tIG5vbi1mdW5jdGlvbiB0eXBlLlR5cGVkZWZOb3RGdW5jdGlvbklOVkFMSURfR0VORVJJQ19GVU5DVElPTl9UWVBFbWVzc2FnZVR5cGVkZWZOb3RGdW5jdGlvbmNvZGVUeXBlZGVmTm90VHlwZUNhbid0IGNyZWF0ZSB0eXBlZGVmIGZyb20gbm9uLXR5cGUuVHlwZWRlZk5vdFR5cGVJTlZBTElEX1RZUEVfSU5fVFlQRURFRm1lc3NhZ2VUeXBlZGVmTm90VHlwZWNvZGVVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmdBICckJyBoYXMgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSBhIHN0cmluZywgYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciBvciBhbiBleHByZXNzaW9uIGluIGN1cmx5IGJyYWNlcyAoe30pLlRyeSBhZGRpbmcgYSBiYWNrc2xhc2ggKFwpIHRvIGVzY2FwZSB0aGUgJyQnLlVuZXhwZWN0ZWREb2xsYXJJblN0cmluZ1VORVhQRUNURURfRE9MTEFSX0lOX1NUUklOR21lc3NhZ2VVbmV4cGVjdGVkRG9sbGFySW5TdHJpbmd0ZW1wbGF0ZVVuZXhwZWN0ZWRUb2tlblVuZXhwZWN0ZWQgdG9rZW4gJyNsZXhlbWUnLmNvZGVVbmV4cGVjdGVkVG9rZW5VbmV4cGVjdGVkVG9rZW5VTkVYUEVDVEVEX1RPS0VOdGVtcGxhdGVVbm1hdGNoZWRUb2tlbkNhbid0IGZpbmQgJyNzdHJpbmcnIHRvIG1hdGNoICcjbGV4ZW1lJy5jb2RlVW5tYXRjaGVkVG9rZW5Vbm1hdGNoZWRUb2tlbnRlbXBsYXRlVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb24nI25hbWUuI25hbWUyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBiZWNhdXNlICcjbmFtZScgaXNuJ3QgZGVmaW5lZC5jb2RlVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb25VbnJlc29sdmVkUHJlZml4SW5UeXBlQW5ub3RhdGlvbnRlbXBsYXRlVW5zcGVjaWZpZWQjc3RyaW5nY29kZVVuc3BlY2lmaWVkVW5zcGVjaWZpZWR0ZW1wbGF0ZVVuc3VwcG9ydGVkT3BlcmF0b3JUaGUgJyNsZXhlbWUnIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuY29kZVVuc3VwcG9ydGVkT3BlcmF0b3JVbnN1cHBvcnRlZE9wZXJhdG9yVU5TVVBQT1JURURfT1BFUkFUT1Jjb2RlVW5zdXBwb3J0ZWRQcmVmaXhQbHVzJysnIGlzIG5vdCBhIHByZWZpeCBvcGVyYXRvci5UcnkgcmVtb3ZpbmcgJysnLlVuc3VwcG9ydGVkUHJlZml4UGx1c21lc3NhZ2VVbnN1cHBvcnRlZFByZWZpeFBsdXNjb2RlVW50ZXJtaW5hdGVkQ29tbWVudENvbW1lbnQgc3RhcnRpbmcgd2l0aCAnLyonIG11c3QgZW5kIHdpdGggJyovJy5VbnRlcm1pbmF0ZWRDb21tZW50VU5URVJNSU5BVEVEX01VTFRJX0xJTkVfQ09NTUVOVG1lc3NhZ2VVbnRlcm1pbmF0ZWRDb21tZW50dGVtcGxhdGVVbnRlcm1pbmF0ZWRTdHJpbmdTdHJpbmcgc3RhcnRpbmcgd2l0aCAjc3RyaW5nIG11c3QgZW5kIHdpdGggI3N0cmluZzIuY29kZVVudGVybWluYXRlZFN0cmluZ1VudGVybWluYXRlZFN0cmluZ1VOVEVSTUlOQVRFRF9TVFJJTkdfTElURVJBTGNvZGVVbnRlcm1pbmF0ZWRUb2tlbkluY29tcGxldGUgdG9rZW4uVW50ZXJtaW5hdGVkVG9rZW5tZXNzYWdlVW50ZXJtaW5hdGVkVG9rZW50ZW1wbGF0ZVVudHJhbnNsYXRhYmxlVXJpTm90IGZvdW5kOiAnI3VyaSdjb2RlVW50cmFuc2xhdGFibGVVcmlVbnRyYW5zbGF0YWJsZVVyaXRlbXBsYXRlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcicjbmFtZScgaXMgZGVwcmVjYXRlZC5jb2RlVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllclVzZU9mRGVwcmVjYXRlZElkZW50aWZpZXJ0ZW1wbGF0ZVZhbHVlRm9yUmVxdWlyZWRQYXJhbWV0ZXJOb3RQcm92aWRlZEVycm9yUmVxdWlyZWQgbmFtZWQgcGFyYW1ldGVyICcjbmFtZScgbXVzdCBiZSBwcm92aWRlZC5jb2RlVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkRXJyb3JWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRFcnJvcnRlbXBsYXRlVmFsdWVGb3JSZXF1aXJlZFBhcmFtZXRlck5vdFByb3ZpZGVkV2FybmluZ01pc3NpbmcgcmVxdWlyZWQgbmFtZWQgcGFyYW1ldGVyICcjbmFtZScuY29kZVZhbHVlRm9yUmVxdWlyZWRQYXJhbWV0ZXJOb3RQcm92aWRlZFdhcm5pbmdWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nY29kZVZhckFzVHlwZU5hbWVUaGUga2V5d29yZCAndmFyJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZSBuYW1lLlZhckFzVHlwZU5hbWVtZXNzYWdlVmFyQXNUeXBlTmFtZWNvZGVWYXJSZXR1cm5UeXBlVGhlIHJldHVybiB0eXBlIGNhbid0IGJlICd2YXInLlRyeSByZW1vdmluZyB0aGUga2V5d29yZCAndmFyJywgb3IgcmVwbGFjaW5nIGl0IHdpdGggdGhlIG5hbWUgb2YgdGhlIHJldHVybiB0eXBlLlZhclJldHVyblR5cGVtZXNzYWdlVmFyUmV0dXJuVHlwZWNvZGVWb2lkRXhwcmVzc2lvblRoaXMgZXhwcmVzc2lvbiBoYXMgdHlwZSAndm9pZCcgYW5kIGNhbid0IGJlIHVzZWQuVm9pZEV4cHJlc3Npb25VU0VfT0ZfVk9JRF9SRVNVTFRtZXNzYWdlVm9pZEV4cHJlc3Npb250ZW1wbGF0ZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseVRoZSBpbnRlZ2VyIGxpdGVyYWwgI3N0cmluZyBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIEphdmFTY3JpcHQuVHJ5IGNoYW5naW5nIHRoZSBsaXRlcmFsIHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBKYXZhc2NyaXB0LiBJbiBKYXZhc2NyaXB0ICNzdHJpbmcyIGlzIHRoZSBuZWFyZXN0IHZhbHVlIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuY29kZVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseVdlYkxpdGVyYWxDYW5ub3RCZVJlcHJlc2VudGVkRXhhY3RseWNvZGVXaXRoQmVmb3JlRXh0ZW5kc1RoZSBleHRlbmRzIGNsYXVzZSBtdXN0IGJlIGJlZm9yZSB0aGUgd2l0aCBjbGF1c2UuVHJ5IG1vdmluZyB0aGUgZXh0ZW5kcyBjbGF1c2UgYmVmb3JlIHRoZSB3aXRoIGNsYXVzZS5XaXRoQmVmb3JlRXh0ZW5kc21lc3NhZ2VXaXRoQmVmb3JlRXh0ZW5kc2NvZGVZaWVsZEFzSWRlbnRpZmllcid5aWVsZCcgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonIG1ldGhvZHMuWWllbGRBc0lkZW50aWZpZXJtZXNzYWdlWWllbGRBc0lkZW50aWZpZXJjb2RlWWllbGROb3RHZW5lcmF0b3IneWllbGQnIGNhbiBvbmx5IGJlIHVzZWQgaW4gJ3N5bmMqJyBvciAnYXN5bmMqJyBtZXRob2RzLllpZWxkTm90R2VuZXJhdG9yWUlFTERfSU5fTk9OX0dFTkVSQVRPUm1lc3NhZ2VZaWVsZE5vdEdlbmVyYXRvcml0ZW1pemVOYW1lcyAtIF93aXRoQXJndW1lbnRzQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25UaGUgY2xhc3MgJycgaXMgYWJzdHJhY3QgYW5kIGNhbid0IGJlIGluc3RhbnRpYXRlZC5fd2l0aEFyZ3VtZW50c0Fic3RyYWN0UmVkaXJlY3RlZENsYXNzSW5zdGFudGlhdGlvbkZhY3RvcnkgcmVkaXJlY3RzIHRvIGNsYXNzICcnLCB3aGljaCBpcyBhYnN0cmFjdCBhbmQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLl93aXRoQXJndW1lbnRzQWNjZXNzRXJyb3JBY2Nlc3MgZXJyb3I6ICdfd2l0aEFyZ3VtZW50c0FzY2lpQ29udHJvbENoYXJhY3RlcmNvZGVQb2ludHVuaWNvZGVVK3RvUmFkaXhTdHJpbmd0b1VwcGVyQ2FzZVRoZSBjb250cm9sIGNoYXJhY3RlciAgY2FuIG9ubHkgYmUgdXNlZCBpbiBzdHJpbmdzIGFuZCBjb21tZW50cy5fd2l0aEFyZ3VtZW50c0JvdW5kSXNzdWVWaWFDeWNsZU5vblNpbXBsaWNpdHlHZW5lcmljIHR5cGUgJycgY2FuJ3QgYmUgdXNlZCB3aXRob3V0IHR5cGUgYXJndW1lbnRzIGluIHRoZSBib3VuZHMgb2YgaXRzIG93biB0eXBlIHZhcmlhYmxlcy4gSXQgaXMgcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHRocm91Z2ggJ1RyeSBwcm92aWRpbmcgdHlwZSBhcmd1bWVudHMgdG8gJycgaGVyZSBvciB0byBzb21lIG90aGVyIHJhdyB0eXBlcyBpbiB0aGUgYm91bmRzIGFsb25nIHRoZSByZWZlcmVuY2UgY2hhaW4uX3dpdGhBcmd1bWVudHNCb3VuZElzc3VlVmlhTG9vcE5vblNpbXBsaWNpdHknIGNhbid0IGJlIHVzZWQgd2l0aG91dCB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgYm91bmRzIG9mIGl0cyBvd24gdHlwZSB2YXJpYWJsZXMuJyBoZXJlLl93aXRoQXJndW1lbnRzQm91bmRJc3N1ZVZpYVJhd1R5cGVXaXRoTm9uU2ltcGxlQm91bmRzJyBjYW4ndCBiZSB1c2VkIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMgaW4gYSB0eXBlIHZhcmlhYmxlIGJvdW5kLl93aXRoQXJndW1lbnRzQnJlYWtUYXJnZXRPdXRzaWRlRnVuY3Rpb25DYW4ndCBicmVhayB0byAnJyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbi5fd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVyQXNUeXBldG9rZW5sZXhlbWVUaGUgYnVpbHQtaW4gaWRlbnRpZmllciAnJyBjYW4ndCBiZSB1c2VkIGFzIGEgdHlwZS5fd2l0aEFyZ3VtZW50c0J1aWx0SW5JZGVudGlmaWVySW5EZWNsYXJhdGlvbkNhbid0IHVzZSAnJyBhcyBhIG5hbWUgaGVyZS5fd2l0aEFyZ3VtZW50c0NhbmRpZGF0ZUZvdW5kSXNEZWZhdWx0Q29uc3RydWN0b3InIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLl93aXRoQXJndW1lbnRzQ2Fubm90UmVhZFNka1NwZWNpZmljYXRpb25VbmFibGUgdG8gcmVhZCB0aGUgJ2xpYnJhcmllcy5qc29uJyBzcGVjaWZpY2F0aW9uIGZpbGU6CiAgX3dpdGhBcmd1bWVudHNDYW50SW5mZXJSZXR1cm5UeXBlRHVlVG9JbmNvbnNpc3RlbnRPdmVycmlkZXNDYW4ndCBpbmZlciBhIHJldHVybiB0eXBlIGZvciAnJyBhcyBzb21lIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy5fd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0NpcmN1bGFyaXR5Q2FuJ3QgaW5mZXIgdGhlIHR5cGUgb2YgJyc6IGNpcmN1bGFyaXR5IGZvdW5kIGR1cmluZyB0eXBlIGluZmVyZW5jZS5fd2l0aEFyZ3VtZW50c0NhbnRJbmZlclR5cGVEdWVUb0luY29uc2lzdGVudE92ZXJyaWRlc0Nhbid0IGluZmVyIGEgdHlwZSBmb3IgJ193aXRoQXJndW1lbnRzQ2FudFJlYWRGaWxldXJpX0Vycm9yIHdoZW4gcmVhZGluZyAnJzogX3dpdGhBcmd1bWVudHNDYW50VXNlQ29udHJvbEZsb3dPclNwcmVhZEFzQ29uc3RhbnQnIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuX3dpdGhBcmd1bWVudHNDYW50VXNlRGVmZXJyZWRQcmVmaXhBc0NvbnN0YW50JyBjYW4ndCBiZSB1c2VkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiZWNhdXNlIGl0J3MgbWFya2VkIGFzICdkZWZlcnJlZCcgd2hpY2ggbWVhbnMgaXQgaXNuJ3QgYXZhaWxhYmxlIHVudGlsIGxvYWRlZC5fd2l0aEFyZ3VtZW50c0NvbWJpbmVkTWVtYmVyU2lnbmF0dXJlRmFpbGVkJyBpbmhlcml0cyBtdWx0aXBsZSBtZW1iZXJzIG5hbWVkICcnIHdpdGggaW5jb21wYXRpYmxlIHNpZ25hdHVyZXMuVHJ5IGFkZGluZyBhIGRlY2xhcmF0aW9uIG9mICcnIHRvICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0aW5nTW9kaWZpZXJzTWVtYmVycyBjYW4ndCBiZSBkZWNsYXJlZCB0byBiZSBib3RoICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhDb25zdHJ1Y3RvckNvbmZsaWN0cyB3aXRoIGNvbnN0cnVjdG9yICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhGYWN0b3J5Q29uZmxpY3RzIHdpdGggZmFjdG9yeSAnX3dpdGhBcmd1bWVudHNDb25mbGljdHNXaXRoTWVtYmVyQ29uZmxpY3RzIHdpdGggbWVtYmVyICdfd2l0aEFyZ3VtZW50c0NvbmZsaWN0c1dpdGhTZXR0ZXJDb25mbGljdHMgd2l0aCBzZXR0ZXIgJ193aXRoQXJndW1lbnRzQ29uZmxpY3RzV2l0aFR5cGVWYXJpYWJsZUNvbmZsaWN0cyB3aXRoIHR5cGUgdmFyaWFibGUgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsRGVmZXJyZWRMaWJyYXJ5X3dpdGhBcmd1bWVudHNDb25zdEV2YWxGYWlsZWRBc3NlcnRpb25XaXRoTWVzc2FnZVRoaXMgYXNzZXJ0aW9uIGZhaWxlZCB3aXRoIG1lc3NhZ2U6IF93aXRoQXJndW1lbnRzQ29uc3RFdmFsSW52YWxpZFN0YXRpY0ludm9jYXRpb25UaGUgaW52b2NhdGlvbiBvZiAnJyBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnN0YW50IGV4cHJlc3Npb24uX3dpdGhBcmd1bWVudHNDb25zdEV2YWxOZWdhdGl2ZVNoaWZ0c3RyaW5nMycgcmVxdWlyZXMgbm9uLW5lZ2F0aXZlIG9wZXJhbmQsIGJ1dCB3YXMgJ193aXRoQXJndW1lbnRzQ29uc3RFdmFsTm9uQ29uc3RhbnRWYXJpYWJsZUdldFRoZSB2YXJpYWJsZSAnJyBpcyBub3QgYSBjb25zdGFudCwgb25seSBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgYWxsb3dlZC5fd2l0aEFyZ3VtZW50c0NvbnN0RXZhbFplcm9EaXZpc29yJyByZXF1aXJlcyBub24temVybyBkaXZpc29yLCBidXQgZGl2aXNvciB3YXMgJzAnLl93aXRoQXJndW1lbnRzQ29uc3RGaWVsZFdpdGhvdXRJbml0aWFsaXplclRoZSBjb25zdCB2YXJpYWJsZSAnJyBtdXN0IGJlIGluaXRpYWxpemVkLl93aXRoQXJndW1lbnRzQ29uc3RydWN0b3JOb3RGb3VuZENvdWxkbid0IGZpbmQgY29uc3RydWN0b3IgJ193aXRoQXJndW1lbnRzQ29uc3RydWN0b3JXaXRoV3JvbmdOYW1lQ29udGV4dFRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MgaXMgJ193aXRoQXJndW1lbnRzQ29udGludWVUYXJnZXRPdXRzaWRlRnVuY3Rpb25DYW4ndCBjb250aW51ZSBhdCAnX3dpdGhBcmd1bWVudHNDb3VsZE5vdFBhcnNlVXJpQ291bGRuJ3QgcGFyc2UgVVJJICcnOgogIF93aXRoQXJndW1lbnRzQ3ljbGVJblR5cGVWYXJpYWJsZXMnIGlzIGEgYm91bmQgb2YgaXRzZWxmIHZpYSAnX3dpdGhBcmd1bWVudHNDeWNsaWNDbGFzc0hpZXJhcmNoeScgaXMgYSBzdXBlcnR5cGUgb2YgaXRzZWxmLl93aXRoQXJndW1lbnRzQ3ljbGljUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JzQ3ljbGljIGRlZmluaXRpb24gb2YgZmFjdG9yeSAnX3dpdGhBcmd1bWVudHNDeWNsaWNUeXBlZGVmVGhlIHR5cGVkZWYgJycgaGFzIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi5fd2l0aEFyZ3VtZW50c0RlYnVnVHJhY2VGYXRhbCAnJyBhdDoKX3dpdGhBcmd1bWVudHNEZWZhdWx0VmFsdWVJblJlZGlyZWN0aW5nRmFjdG9yeUNvbnN0cnVjdG9yQ2FuJ3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgaGVyZSBiZWNhdXNlIGFueSBkZWZhdWx0IHZhbHVlcyBvZiAnJyB3b3VsZCBiZSB1c2VkIGluc3RlYWQuX3dpdGhBcmd1bWVudHNEZWZlcnJlZEV4dGVuc2lvbkltcG9ydEV4dGVuc2lvbiAnJyBjYW5ub3QgYmUgaW1wb3J0ZWQgdGhyb3VnaCBhIGRlZmVycmVkIGltcG9ydC5UcnkgYWRkaW5nIHRoZSBgaGlkZSBgIHRvIHRoZSBpbXBvcnQuX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYW4ndCB1c2UgdGhlIG5hbWUgJycgZm9yIGEgZGVmZXJyZWQgbGlicmFyeSwgYXMgdGhlIG5hbWUgaXMgdXNlZCBlbHNld2hlcmUuX3dpdGhBcmd1bWVudHNEZWZlcnJlZFByZWZpeER1cGxpY2F0ZWRDYXVzZScgaXMgdXNlZCBoZXJlLl93aXRoQXJndW1lbnRzRGlsbE91dGxpbmVTdW1tYXJ5Y291bnQyX251bTFfbnVtMl9udW0zTm8gY291bnQgcHJvdmlkZWRObyBudW1iZXIgcHJvdmlkZWRudW0xdG9TdHJpbmdBc0ZpeGVkbnVtMm51bTNJbmRleGVkICBsaWJyYXJpZXMgKCBieXRlcykgaW4gbXMsIHRoYXQgaXMsCiBieXRlcy9tcywgYW5kCiBtcy9saWJyYXJpZXMuX3dpdGhBcmd1bWVudHNEaXJlY3RDeWNsZUluVHlwZVZhcmlhYmxlcycgY2FuJ3QgdXNlIGl0c2VsZiBhcyBhIGJvdW5kLl93aXRoQXJndW1lbnRzRHVwbGljYXRlTGFiZWxJblN3aXRjaFN0YXRlbWVudFRoZSBsYWJlbCAnJyB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudC5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWREZWNsYXJhdGlvbicgaXMgYWxyZWFkeSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZERlY2xhcmF0aW9uQ2F1c2VQcmV2aW91cyBkZWNsYXJhdGlvbiBvZiAnX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25TeW50aGV0aWNDYXVzZScgaXMgaW1wbGllZCBieSB0aGlzIGRlZmluaXRpb24uX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRGVjbGFyYXRpb25Vc2UnIGJlY2F1c2UgaXQgaXMgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkRXhwb3J0dXJpMl91cmkyJyBpcyBleHBvcnRlZCBmcm9tIGJvdGggJ193aXRoQXJndW1lbnRzRHVwbGljYXRlZEV4cG9ydEluVHlwZV93aXRoQXJndW1lbnRzRHVwbGljYXRlZEltcG9ydCcgaXMgaW1wb3J0ZWQgZnJvbSBib3RoICdfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRJbXBvcnRJblR5cGVfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0QSBsaWJyYXJ5IHdpdGggbmFtZSAnJyBpcyBleHBvcnRlZCBtb3JlIHRoYW4gb25jZS5fd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRMaWJyYXJ5RXhwb3J0Q29udGV4dCcgaXMgYWxzbyBleHBvcnRlZCBoZXJlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnQnIGlzIGltcG9ydGVkIG1vcmUgdGhhbiBvbmNlLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZExpYnJhcnlJbXBvcnRDb250ZXh0JyBpcyBhbHNvIGltcG9ydGVkIGhlcmUuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTW9kaWZpZXJUaGUgbW9kaWZpZXIgJycgd2FzIGFscmVhZHkgc3BlY2lmaWVkLl93aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVQcmV2aW91c2x5VXNlZENhbid0IGRlY2xhcmUgJycgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgc2NvcGUuX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkTmFtZVByZXZpb3VzbHlVc2VkQ2F1c2VQcmV2aW91cyB1c2Ugb2YgJ193aXRoQXJndW1lbnRzRHVwbGljYXRlZE5hbWVkQXJndW1lbnREdXBsaWNhdGVkIG5hbWVkIGFyZ3VtZW50ICdfd2l0aEFyZ3VtZW50c0R1cGxpY2F0ZWRQYXJhbWV0ZXJOYW1lRHVwbGljYXRlZCBwYXJhbWV0ZXIgbmFtZSAnX3dpdGhBcmd1bWVudHNEdXBsaWNhdGVkUGFyYW1ldGVyTmFtZUNhdXNlT3RoZXIgcGFyYW1ldGVyIG5hbWVkICdfd2l0aEFyZ3VtZW50c0VudW1Db25zdGFudFNhbWVOYW1lQXNFbmNsb3NpbmdOYW1lIG9mIGVudW0gY29uc3RhbnQgJycgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgdGhlIGVudW0ncyBvd24gbmFtZS5fd2l0aEFyZ3VtZW50c0V4cGVjdGVkQWZ0ZXJCdXRHb3QnIGFmdGVyIHRoaXMuX3dpdGhBcmd1bWVudHNFeHBlY3RlZEJ1dEdvdCcgYmVmb3JlIHRoaXMuX3dpdGhBcmd1bWVudHNFeHBlY3RlZENsYXNzTWVtYmVyRXhwZWN0ZWQgYSBjbGFzcyBtZW1iZXIsIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZWN0ZWRDbGFzc09yTWl4aW5Cb2R5QSAgbXVzdCBoYXZlIGEgYm9keSwgZXZlbiBpZiBpdCBpcyBlbXB0eS5fd2l0aEFyZ3VtZW50c0V4cGVjdGVkRGVjbGFyYXRpb25FeHBlY3RlZCBhIGRlY2xhcmF0aW9uLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkRW51bUJvZHlFeHBlY3RlZCBhIGVudW0gYm9keSwgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZEZ1bmN0aW9uQm9keUV4cGVjdGVkIGEgZnVuY3Rpb24gYm9keSwgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZElkZW50aWZpZXJFeHBlY3RlZCBhbiBpZGVudGlmaWVyLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0V4cGVjdGVkSW5zdGVhZCcgaW5zdGVhZCBvZiB0aGlzLl93aXRoQXJndW1lbnRzRXhwZWN0ZWRTdHJpbmdFeHBlY3RlZCBhIFN0cmluZywgYnV0IGdvdCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZFRva2VuRXhwZWN0ZWQgdG8gZmluZCAnX3dpdGhBcmd1bWVudHNFeHBlY3RlZFR5cGVFeHBlY3RlZCBhIHR5cGUsIGJ1dCBnb3QgJ193aXRoQXJndW1lbnRzRXhwZXJpbWVudE5vdEVuYWJsZWRUaGlzIHJlcXVpcmVzIHRoZSAnJyBleHBlcmltZW50IHRvIGJlIGVuYWJsZWQuX3dpdGhBcmd1bWVudHNFeHBsaWNpdEV4dGVuc2lvblR5cGVBcmd1bWVudE1pc21hdGNoRXhwbGljaXQgZXh0ZW5zaW9uIGFwcGxpY2F0aW9uIG9mIGV4dGVuc2lvbiAnJyB0YWtlcyAnJyB0eXBlIGFyZ3VtZW50KHMpLl93aXRoQXJndW1lbnRzRXhwb3J0SGlkZXNFeHBvcnRFeHBvcnQgb2YgJycgKGZyb20gJycpIGhpZGVzIGV4cG9ydCBmcm9tICdfd2l0aEFyZ3VtZW50c0V4dGVuZGluZ0VudW0nIGlzIGFuIGVudW0gYW5kIGNhbid0IGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkLl93aXRoQXJndW1lbnRzRXh0ZW5kaW5nUmVzdHJpY3RlZCcgaXMgcmVzdHJpY3RlZCBhbmQgY2FuJ3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuX3dpdGhBcmd1bWVudHNFeHRlbnNpb25NZW1iZXJDb25mbGljdHNXaXRoT2JqZWN0TWVtYmVyVGhpcyBleHRlbnNpb24gbWVtYmVyIGNvbmZsaWN0cyB3aXRoIE9iamVjdCBtZW1iZXIgJ193aXRoQXJndW1lbnRzRXh0cmFuZW91c01vZGlmaWVyQ2FuJ3QgaGF2ZSBtb2RpZmllciAnVHJ5IHJlbW92aW5nICdfd2l0aEFyZ3VtZW50c0V4dHJhbmVvdXNNb2RpZmllckluRXh0ZW5zaW9uJyBpbiBhbiBleHRlbnNpb24uX3dpdGhBcmd1bWVudHNGYXN0YUNMSUFyZ3VtZW50UmVxdWlyZWRFeHBlY3RlZCB2YWx1ZSBhZnRlciAnX3dpdGhBcmd1bWVudHNGZmlFeHRlbmRzT3JJbXBsZW1lbnRzU2VhbGVkQ2xhc3MnIGNhbm5vdCBiZSBleHRlbmRlZCBvciBpbXBsZW1lbnRlZC5fd2l0aEFyZ3VtZW50c0ZmaUZpZWxkQW5ub3RhdGlvbicgcmVxdWlyZXMgZXhhY3RseSBvbmUgYW5ub3RhdGlvbiB0byBkZWNsYXJlIGl0cyBuYXRpdmUgdHlwZSwgd2hpY2ggY2Fubm90IGJlIFZvaWQuIGRhcnQ6ZmZpIFN0cnVjdHMgY2Fubm90IGhhdmUgcmVndWxhciBEYXJ0IGZpZWxkcy5fd2l0aEFyZ3VtZW50c0ZmaUZpZWxkSW5pdGlhbGl6ZXInIGlzIGEgZGFydDpmZmkgUG9pbnRlciB0byBhIHN0cnVjdCBmaWVsZCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY29uc3RydWN0b3IgZXhlY3V0aW9uLl93aXRoQXJndW1lbnRzRmZpRmllbGROb0Fubm90YXRpb24nIHJlcXVpcmVzIG5vIGFubm90YXRpb24gdG8gZGVjbGFyZSBpdHMgbmF0aXZlIHR5cGUsIGl0IGlzIGEgUG9pbnRlciB3aGljaCBpcyByZXByZXNlbnRlZCBieSB0aGUgc2FtZSB0eXBlIGluIERhcnQgYW5kIG5hdGl2ZSBjb2RlLl93aXRoQXJndW1lbnRzRmZpTm90U3RhdGljIGV4cGVjdHMgYSBzdGF0aWMgZnVuY3Rpb24gYXMgcGFyYW1ldGVyLiBkYXJ0OmZmaSBvbmx5IHN1cHBvcnRzIGNhbGxpbmcgc3RhdGljIERhcnQgZnVuY3Rpb25zIGZyb20gbmF0aXZlIGNvZGUuX3dpdGhBcmd1bWVudHNGZmlTdHJ1Y3RHZW5lcmljU3RydWN0ICcnIHNob3VsZCBub3QgYmUgZ2VuZXJpYy5fd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZEZpbmFsIGZpZWxkICcnIGlzIG5vdCBpbml0aWFsaXplZC5fd2l0aEFyZ3VtZW50c0ZpbmFsRmllbGROb3RJbml0aWFsaXplZEJ5Q29uc3RydWN0b3InIGlzIG5vdCBpbml0aWFsaXplZCBieSB0aGlzIGNvbnN0cnVjdG9yLl93aXRoQXJndW1lbnRzRmluYWxGaWVsZFdpdGhvdXRJbml0aWFsaXplclRoZSBmaW5hbCB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNGaW5hbEluc3RhbmNlVmFyaWFibGVBbHJlYWR5SW5pdGlhbGl6ZWQnIGlzIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLl93aXRoQXJndW1lbnRzRmluYWxJbnN0YW5jZVZhcmlhYmxlQWxyZWFkeUluaXRpYWxpemVkQ2F1c2UnIHdhcyBpbml0aWFsaXplZCBoZXJlLl93aXRoQXJndW1lbnRzR2V0dGVyTm90Rm91bmRHZXR0ZXIgbm90IGZvdW5kOiAnX3dpdGhBcmd1bWVudHNJbGxlZ2FsTWl4aW4nIGNhbid0IGJlIG1peGVkIGluLl93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnMnIGFzIGEgbWl4aW4gYmVjYXVzZSBpdCBoYXMgY29uc3RydWN0b3JzLl93aXRoQXJndW1lbnRzSWxsZWdhbE1peGluRHVlVG9Db25zdHJ1Y3RvcnNDYXVzZVRoaXMgY29uc3RydWN0b3IgcHJldmVudHMgdXNpbmcgJycgYXMgYSBtaXhpbi5fd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNSZXBlYXRlZCcgY2FuIG9ubHkgYmUgaW1wbGVtZW50ZWQgb25jZS5UcnkgcmVtb3ZpbmcgIG9mIHRoZSBvY2N1cnJlbmNlcy5fd2l0aEFyZ3VtZW50c0ltcGxlbWVudHNTdXBlckNsYXNzJyBjYW4ndCBiZSB1c2VkIGluIGJvdGggJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcy5fd2l0aEFyZ3VtZW50c0ltcGxpY2l0TWl4aW5PdmVycmlkZUFwcGx5aW5nIHRoZSBtaXhpbiAnJyBpbnRyb2R1Y2VzIGFuIGVycm9uZW91cyBvdmVycmlkZSBvZiAnX3dpdGhBcmd1bWVudHNJbXBvcnRIaWRlc0ltcG9ydEltcG9ydCBvZiAnJykgaGlkZXMgaW1wb3J0IGZyb20gJ193aXRoQXJndW1lbnRzSW5mZXJyZWRQYWNrYWdlVXJpSW50ZXJwcmV0aW5nIHRoaXMgYXMgcGFja2FnZSBVUkksICdfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWRUcmllZCB0byBpbml0aWFsaXplIGZyb20gYSBwcmV2aW91cyBjb21waWxhdGlvbiAoKSwgYnV0IHRoZSBmaWxlIHdhcyBub3Qgc2VsZi1jb250YWluZWQuIFRoaXMgbWlnaHQgYmUgYSBidWcuCgpUaGUgRGFydCB0ZWFtIHdvdWxkIGdyZWF0bHkgYXBwcmVjaWF0ZSBpdCBpZiB5b3Ugd291bGQgdGFrZSBhIG1vbWVudCB0byByZXBvcnQgdGhpcyBwcm9ibGVtIGF0IGh0dHA6Ly9kYXJ0YnVnLmNvbS9uZXcuCklmIHlvdSBhcmUgY29tZm9ydGFibGUgd2l0aCBpdCwgaXQgd291bGQgaW1wcm92ZSB0aGUgY2hhbmNlcyBvZiBmaXhpbmcgYW55IGJ1ZyBpZiB5b3UgaW5jbHVkZWQgdGhlIGZpbGUgIGluIHlvdXIgZXJyb3IgcmVwb3J0LCBidXQgYmUgYXdhcmUgdGhhdCB0aGlzIGZpbGUgaW5jbHVkZXMgeW91ciBzb3VyY2UgY29kZS4KRWl0aGVyIHdheSwgeW91IHNob3VsZCBwcm9iYWJseSBkZWxldGUgdGhlIGZpbGUgc28gaXQgZG9lc24ndCB1c2UgdW5uZWNlc3NhcnkgZGlzayBzcGFjZS5fd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXApLCBidXQgdGhlIGZpbGUgd2FzIG5vdCBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy5fd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtKSwgYnV0IGNvdWxkbid0LgpFcnJvciBtZXNzYWdlIHdhcyAnJy4KU3RhY2t0cmFjZSBpbmNsdWRlZCAnJy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy4KSWYgeW91IGFyZSBjb21mb3J0YWJsZSB3aXRoIGl0LCBpdCB3b3VsZCBpbXByb3ZlIHRoZSBjaGFuY2VzIG9mIGZpeGluZyBhbnkgYnVnIGlmIHlvdSBpbmNsdWRlZCB0aGUgZmlsZSBfd2l0aEFyZ3VtZW50c0luaXRpYWxpemVGcm9tRGlsbFVua25vd25Qcm9ibGVtTm9EdW1wJy4KVGhpcyBtaWdodCBiZSBhIGJ1Zy4KClRoZSBEYXJ0IHRlYW0gd291bGQgZ3JlYXRseSBhcHByZWNpYXRlIGl0IGlmIHlvdSB3b3VsZCB0YWtlIGEgbW9tZW50IHRvIHJlcG9ydCB0aGlzIHByb2JsZW0gYXQgaHR0cDovL2RhcnRidWcuY29tL25ldy5fd2l0aEFyZ3VtZW50c0luaXRpYWxpemVyRm9yU3RhdGljRmllbGQnIGlzbid0IGFuIGluc3RhbmNlIGZpZWxkIG9mIHRoaXMgY2xhc3MuX3dpdGhBcmd1bWVudHNJbml0aWFsaXplck91dHNpZGVDb25zdHJ1Y3Rvck9ubHkgY29uc3RydWN0b3JzIGNhbiBoYXZlIGluaXRpYWxpemVycywgYW5kICcnIGlzIG5vdCBhIGNvbnN0cnVjdG9yLl93aXRoQXJndW1lbnRzSW5wdXRGaWxlTm90Rm91bmRJbnB1dCBmaWxlIG5vdCBmb3VuZDogX3dpdGhBcmd1bWVudHNJbnRlZ2VyTGl0ZXJhbElzT3V0T2ZSYW5nZVRoZSBpbnRlZ2VyIGxpdGVyYWwgIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIDY0IGJpdHMuX3dpdGhBcmd1bWVudHNJbnRlcmZhY2VDaGVja1RoZSBpbXBsZW1lbnRhdGlvbiBvZiAnJyBpbiB0aGUgbm9uLWFic3RyYWN0IGNsYXNzICcnIGRvZXMgbm90IGNvbmZvcm0gdG8gaXRzIGludGVyZmFjZS5fd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbUNvbnN0cnVjdG9yTm90Rm91bmRObyBjb25zdHJ1Y3RvciBuYW1lZCAnJyBpbiAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Db250ZXh0U2V2ZXJpdHlOb24tY29udGV4dCBtZXNzYWdlIGhhcyBjb250ZXh0IHNldmVyaXR5OiBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbURlYnVnQWJvcnRDb21waWxhdGlvbiBhYm9ydGVkIGR1ZSB0byBmYXRhbCAnX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1Ob3RGb3VuZENvdWxkbid0IGZpbmQgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtTm90Rm91bmRJbl93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzQ2FuJ3QgYWNjZXNzIHByaXZhdGUgY29uc3RydWN0b3IgJ193aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtU3RhY2tOb3RFbXB0eS5zdGFjayBpc24ndCBlbXB0eToKICBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuZXhwZWN0ZWQnLCBidXQgZ290ICdfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuZmluaXNoZWRUeXBlVmFyaWFibGVVbmZpbmlzaGVkIHR5cGUgdmFyaWFibGUgJycgZm91bmQgaW4gbm9uLXNvdXJjZSBsaWJyYXJ5ICdfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuaGFuZGxlZFVuaGFuZGxlZCBfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVuaW1wbGVtZW50ZWRVbmltcGxlbWVudGVkIF93aXRoQXJndW1lbnRzSW50ZXJuYWxQcm9ibGVtVW5zdXBwb3J0ZWRVbnN1cHBvcnRlZCBvcGVyYXRpb246ICdfd2l0aEFyZ3VtZW50c0ludGVybmFsUHJvYmxlbVVyaU1pc3NpbmdTY2hlbWVUaGUgVVJJICcnIGhhcyBubyBzY2hlbWUuX3dpdGhBcmd1bWVudHNJbnRlcm5hbFByb2JsZW1WZXJpZmljYXRpb25FcnJvclZlcmlmaWNhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIHByb2dyYW0gZmFpbGVkOgpfd2l0aEFyZ3VtZW50c0ludmFsaWRCcmVha1RhcmdldF93aXRoQXJndW1lbnRzSW52YWxpZENvbnRpbnVlVGFyZ2V0X3dpdGhBcmd1bWVudHNJbnZhbGlkT3BlcmF0b3JUaGUgc3RyaW5nICcnIGlzbid0IGEgdXNlci1kZWZpbmFibGUgb3BlcmF0b3IuX3dpdGhBcmd1bWVudHNJbnZhbGlkUGFja2FnZVVyaUludmFsaWQgcGFja2FnZSBVUkkgJ193aXRoQXJndW1lbnRzSW52YWxpZFR5cGVWYXJpYWJsZUluU3VwZXJ0eXBlQ2FuJ3QgdXNlIGltcGxpY2l0bHkgJ291dCcgdmFyaWFibGUgJycgaW4gYW4gJycgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdfd2l0aEFyZ3VtZW50c0ludmFsaWRUeXBlVmFyaWFibGVJblN1cGVydHlwZVdpdGhWYXJpYW5jZScgdHlwZSB2YXJpYWJsZSAnX3dpdGhBcmd1bWVudHNJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbicgcG9zaXRpb24uX3dpdGhBcmd1bWVudHNJbnZhbGlkVHlwZVZhcmlhYmxlVmFyaWFuY2VQb3NpdGlvbkluUmV0dXJuVHlwZScgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLl93aXRoQXJndW1lbnRzSW52b2tlTm9uRnVuY3Rpb24nIGlzbid0IGEgZnVuY3Rpb24gb3IgbWV0aG9kIGFuZCBjYW4ndCBiZSBpbnZva2VkLl93aXRoQXJndW1lbnRzTGFiZWxOb3RGb3VuZENhbid0IGZpbmQgbGFiZWwgJ193aXRoQXJndW1lbnRzTGFuZ3VhZ2VWZXJzaW9uVG9vSGlnaFRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgdmVyc2lvbiBpcyB0b28gaGlnaC4gVGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxhbmd1YWdlIHZlcnNpb24gaXMgX3dpdGhBcmd1bWVudHNMb2FkTGlicmFyeUhpZGVzTWVtYmVyJyBkZWZpbmVzIGEgdG9wLWxldmVsIG1lbWJlciBuYW1lZCAnbG9hZExpYnJhcnknLiBUaGlzIG1lbWJlciBpcyBoaWRkZW4gYnkgdGhlIHNwZWNpYWwgbWVtYmVyICdsb2FkTGlicmFyeScgdGhhdCB0aGUgbGFuZ3VhZ2UgYWRkcyB0byBzdXBwb3J0IGRlZmVycmVkIGxvYWRpbmcuX3dpdGhBcmd1bWVudHNMb2NhbERlZmluaXRpb25IaWRlc0V4cG9ydExvY2FsIGRlZmluaXRpb24gb2YgJycgaGlkZXMgZXhwb3J0IGZyb20gJ193aXRoQXJndW1lbnRzTG9jYWxEZWZpbml0aW9uSGlkZXNJbXBvcnQnIGhpZGVzIGltcG9ydCBmcm9tICdfd2l0aEFyZ3VtZW50c01ldGhvZE5vdEZvdW5kTWV0aG9kIG5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzTWlzc2luZ0V4cGxpY2l0VHlwZUFyZ3VtZW50c05vIHR5cGUgYXJndW1lbnRzIHByb3ZpZGVkLCAgcG9zc2libGUuX3dpdGhBcmd1bWVudHNNaXNzaW5nSW1wbGVtZW50YXRpb25DYXVzZScgaXMgZGVmaW5lZCBoZXJlLl93aXRoQXJndW1lbnRzTWlzc2luZ0ltcGxlbWVudGF0aW9uTm90QWJzdHJhY3RfbmFtZXNObyBuYW1lcyBwcm92aWRlZFRoZSBub24tYWJzdHJhY3QgY2xhc3MgJycgaXMgbWlzc2luZyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZXNlIG1lbWJlcnM6Cl93aXRoQXJndW1lbnRzTWlzc2luZ1BhcnRPZicgYXMgYSBwYXJ0LCBiZWNhdXNlIGl0IGhhcyBubyAncGFydCBvZicgZGVjbGFyYXRpb24uX3dpdGhBcmd1bWVudHNNb2RpZmllck91dE9mT3JkZXInIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICdfd2l0aEFyZ3VtZW50c05hbWVkTWl4aW5PdmVycmlkZVRoZSBtaXhpbiBhcHBsaWNhdGlvbiBjbGFzcyAnX3dpdGhBcmd1bWVudHNOb0Zvcm1hbHNUcnkgYWRkaW5nICcoKScgYWZ0ZXIgJycsIG9yIGFkZCAnZ2V0JyBiZWZvcmUgJycgdG8gZGVjbGFyZSBhIGdldHRlci5fd2l0aEFyZ3VtZW50c05vU3VjaE5hbWVkUGFyYW1ldGVyTm8gbmFtZWQgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWUgJ193aXRoQXJndW1lbnRzTm9uQXNjaWlJZGVudGlmaWVycnVuZXNOb3QgYSBjaGFyYWN0ZXIgJ1RoZSBub24tQVNDSUkgY2hhcmFjdGVyICcnICgpIGNhbid0IGJlIHVzZWQgaW4gaWRlbnRpZmllcnMsIG9ubHkgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMuX3dpdGhBcmd1bWVudHNOb25Bc2NpaVdoaXRlc3BhY2VUaGUgbm9uLUFTQ0lJIHNwYWNlIGNoYXJhY3RlciBfd2l0aEFyZ3VtZW50c05vbk51bGxhYmxlTm90QXNzaWduZWRFcnJvck5vbi1udWxsYWJsZSB2YXJpYWJsZSAnJyBtdXN0IGJlIGFzc2lnbmVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC5fd2l0aEFyZ3VtZW50c05vbk51bGxhYmxlTm90QXNzaWduZWRXYXJuaW5nJyBpcyB1c2VkIGJlZm9yZSBpdCdzIGFzc2lnbmVkLl93aXRoQXJndW1lbnRzTm9uU2ltcGxlQm91bmRWaWFSZWZlcmVuY2VCb3VuZCBvZiB0aGlzIHZhcmlhYmxlIHJlZmVyZW5jZXMgcmF3IHR5cGUgJ193aXRoQXJndW1lbnRzTm9uU2ltcGxlQm91bmRWaWFWYXJpYWJsZUJvdW5kIG9mIHRoaXMgdmFyaWFibGUgcmVmZXJlbmNlcyB2YXJpYWJsZSAnJyBmcm9tIHRoZSBzYW1lIGRlY2xhcmF0aW9uLl93aXRoQXJndW1lbnRzTm90QVByZWZpeEluVHlwZUFubm90YXRpb24nIGNhbid0IGJlIHVzZWQgYXMgYSB0eXBlIGJlY2F1c2UgJycgZG9lc24ndCByZWZlciB0byBhbiBpbXBvcnQgcHJlZml4Ll93aXRoQXJndW1lbnRzTm90QVR5cGUnIGlzbid0IGEgdHlwZS5fd2l0aEFyZ3VtZW50c05vdEJpbmFyeU9wZXJhdG9yJyBpc24ndCBhIGJpbmFyeSBvcGVyYXRvci5fd2l0aEFyZ3VtZW50c05vdENvbnN0YW50RXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLl93aXRoQXJndW1lbnRzTnVsbGFibGVJbnRlcmZhY2VFcnJvckNhbid0IGltcGxlbWVudCAnJyBiZWNhdXNlIGl0J3MgbWFya2VkIHdpdGggJz8nLl93aXRoQXJndW1lbnRzTnVsbGFibGVJbnRlcmZhY2VXYXJuaW5nSW1wbGVtZW50aW5nICcnIG1hcmtlZCB3aXRoICc/Jy5fd2l0aEFyZ3VtZW50c051bGxhYmxlTWl4aW5FcnJvckNhbid0IG1peCAnJyBpbiBiZWNhdXNlIGl0J3MgbWFya2VkIHdpdGggJz8nLl93aXRoQXJndW1lbnRzTnVsbGFibGVNaXhpbldhcm5pbmdNaXhpbmcgaW4gJ193aXRoQXJndW1lbnRzTnVsbGFibGVTdXBlcmNsYXNzRXJyb3JDYW4ndCBleHRlbmQgJ193aXRoQXJndW1lbnRzTnVsbGFibGVTdXBlcmNsYXNzV2FybmluZ0V4dGVuZGluZyAnX3dpdGhBcmd1bWVudHNOdWxsYWJsZVRlYXJvZmZFcnJvckNhbid0IHRlYXIgb2ZmIG1ldGhvZCAnJyBmcm9tIGEgcG90ZW50aWFsbHkgbnVsbCB2YWx1ZS5fd2l0aEFyZ3VtZW50c051bGxhYmxlVGVhcm9mZldhcm5pbmdUZWFyaW5nIG9mZiBtZXRob2QgJ193aXRoQXJndW1lbnRzT3BlcmF0b3JNaW51c1BhcmFtZXRlck1pc21hdGNoJyBzaG91bGQgaGF2ZSB6ZXJvIG9yIG9uZSBwYXJhbWV0ZXIuX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMCcgc2hvdWxkbid0IGhhdmUgYW55IHBhcmFtZXRlcnMuX3dpdGhBcmd1bWVudHNPcGVyYXRvclBhcmFtZXRlck1pc21hdGNoMScgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyLl93aXRoQXJndW1lbnRzT3BlcmF0b3JQYXJhbWV0ZXJNaXNtYXRjaDInIHNob3VsZCBoYXZlIGV4YWN0bHkgdHdvIHBhcmFtZXRlcnMuX3dpdGhBcmd1bWVudHNPdmVycmlkZGVuTWV0aG9kQ2F1c2VUaGlzIGlzIHRoZSBvdmVycmlkZGVuIG1ldGhvZCAoJycpLl93aXRoQXJndW1lbnRzT3ZlcnJpZGVGZXdlck5hbWVkQXJndW1lbnRzJyBoYXMgZmV3ZXIgbmFtZWQgYXJndW1lbnRzIHRoYW4gdGhvc2Ugb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJ193aXRoQXJndW1lbnRzT3ZlcnJpZGVGZXdlclBvc2l0aW9uYWxBcmd1bWVudHMnIGhhcyBmZXdlciBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICdfd2l0aEFyZ3VtZW50c092ZXJyaWRlTWlzbWF0Y2hOYW1lZFBhcmFtZXRlcicgZG9lc24ndCBoYXZlIHRoZSBuYW1lZCBwYXJhbWV0ZXIgJycgb2Ygb3ZlcnJpZGRlbiBtZXRob2QgJ193aXRoQXJndW1lbnRzT3ZlcnJpZGVNb3JlUmVxdWlyZWRBcmd1bWVudHMnIGhhcyBtb3JlIHJlcXVpcmVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICdfd2l0aEFyZ3VtZW50c092ZXJyaWRlVHlwZVZhcmlhYmxlc01pc21hdGNoRGVjbGFyZWQgdHlwZSB2YXJpYWJsZXMgb2YgJycgZG9lc24ndCBtYXRjaCB0aG9zZSBvbiBvdmVycmlkZGVuIG1ldGhvZCAnX3dpdGhBcmd1bWVudHNQYWNrYWdlTm90Rm91bmRDb3VsZCBub3QgcmVzb2x2ZSB0aGUgcGFja2FnZSAnX3dpdGhBcmd1bWVudHNQYWNrYWdlc0ZpbGVGb3JtYXRQcm9ibGVtIGluIHBhY2thZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZTogX3dpdGhBcmd1bWVudHNQYXJ0T2ZJbkxpYnJhcnlDYW4ndCBpbXBvcnQgJycsIGJlY2F1c2UgaXQgaGFzIGEgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLlRyeSByZW1vdmluZyB0aGUgJ3BhcnQgb2YnIGRlY2xhcmF0aW9uLCBvciB1c2luZyAnJyBhcyBhIHBhcnQuX3dpdGhBcmd1bWVudHNQYXJ0T2ZMaWJyYXJ5TmFtZU1pc21hdGNoVXNpbmcgJycgYXMgcGFydCBvZiAnJyBidXQgaXRzICdwYXJ0IG9mJyBkZWNsYXJhdGlvbiBzYXlzICdfd2l0aEFyZ3VtZW50c1BhcnRPZlVyaU1pc21hdGNodXJpM191cmkzX3dpdGhBcmd1bWVudHNQYXJ0T2ZVc2VVcmlfd2l0aEFyZ3VtZW50c1BhcnRUd2ljZScgYXMgYSBwYXJ0IG1vcmUgdGhhbiBvbmNlLl93aXRoQXJndW1lbnRzUGF0Y2hJbmplY3Rpb25GYWlsZWRDYW4ndCBpbmplY3QgJycgaW50byAnX3dpdGhBcmd1bWVudHNSZWRpcmVjdGlvblRhcmdldE5vdEZvdW5kUmVkaXJlY3Rpb24gY29uc3RydWN0b3IgdGFyZ2V0IG5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzUmVxdWlyZWROYW1lZFBhcmFtZXRlckhhc0RlZmF1bHRWYWx1ZUVycm9yTmFtZWQgcGFyYW1ldGVyICcnIGlzIHJlcXVpcmVkIGFuZCBjYW4ndCBoYXZlIGEgZGVmYXVsdCB2YWx1ZS5fd2l0aEFyZ3VtZW50c1JlcXVpcmVkTmFtZWRQYXJhbWV0ZXJIYXNEZWZhdWx0VmFsdWVXYXJuaW5nJyBpcyByZXF1aXJlZCBhbmQgaGFzIGEgZGVmYXVsdCB2YWx1ZS5fd2l0aEFyZ3VtZW50c1Nka1Jvb3ROb3RGb3VuZFNESyByb290IGRpcmVjdG9yeSBub3QgZm91bmQ6IF93aXRoQXJndW1lbnRzU2RrU3BlY2lmaWNhdGlvbk5vdEZvdW5kU0RLIGxpYnJhcmllcyBzcGVjaWZpY2F0aW9uIG5vdCBmb3VuZDogX3dpdGhBcmd1bWVudHNTZGtTdW1tYXJ5Tm90Rm91bmRTREsgc3VtbWFyeSBub3QgZm91bmQ6IF93aXRoQXJndW1lbnRzU2V0dGVyTm90Rm91bmRTZXR0ZXIgbm90IGZvdW5kOiAnX3dpdGhBcmd1bWVudHNTb3VyY2VCb2R5U3VtbWFyeUJ1aWx0IGJvZGllcyBmb3IgIGNvbXBpbGF0aW9uIHVuaXRzICggbXMvY29tcGlsYXRpb24gdW5pdC5fd2l0aEFyZ3VtZW50c1NvdXJjZU91dGxpbmVTdW1tYXJ5QnVpbHQgb3V0bGluZXMgZm9yIF93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vQ29uc3RydWN0b3JTdXBlcmNsYXNzIGhhcyBubyBjb25zdHJ1Y3RvciBuYW1lZCAnX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9EZWZhdWx0Q29uc3RydWN0b3JUaGUgc3VwZXJjbGFzcywgJycsIGhhcyBubyB1bm5hbWVkIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLl93aXRoQXJndW1lbnRzU3VwZXJjbGFzc0hhc05vR2V0dGVyU3VwZXJjbGFzcyBoYXMgbm8gZ2V0dGVyIG5hbWVkICdfd2l0aEFyZ3VtZW50c1N1cGVyY2xhc3NIYXNOb01ldGhvZFN1cGVyY2xhc3MgaGFzIG5vIG1ldGhvZCBuYW1lZCAnX3dpdGhBcmd1bWVudHNTdXBlcmNsYXNzSGFzTm9TZXR0ZXJTdXBlcmNsYXNzIGhhcyBubyBzZXR0ZXIgbmFtZWQgJ193aXRoQXJndW1lbnRzU3VwZXJjbGFzc01ldGhvZEFyZ3VtZW50TWlzbWF0Y2hTdXBlcmNsYXNzIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCAnJyB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cy5fd2l0aEFyZ3VtZW50c1N1cGVydHlwZUlzSWxsZWdhbCcgY2FuJ3QgYmUgdXNlZCBhcyBzdXBlcnR5cGUuX3dpdGhBcmd1bWVudHNTdXBlcnR5cGVJc1R5cGVWYXJpYWJsZVRoZSB0eXBlIHZhcmlhYmxlICdfd2l0aEFyZ3VtZW50c1RoaXNBY2Nlc3NJbkZpZWxkSW5pdGlhbGl6ZXJDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnX3dpdGhBcmd1bWVudHNUaGlzT3JTdXBlckFjY2Vzc0luRmllbGRJbml0aWFsaXplckNhbid0IGFjY2VzcyAnJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyLl93aXRoQXJndW1lbnRzVG9vRmV3QXJndW1lbnRzVG9vIGZldyBwb3NpdGlvbmFsIGFyZ3VtZW50czogIHJlcXVpcmVkLCAgZ2l2ZW4uX3dpdGhBcmd1bWVudHNUb29NYW55QXJndW1lbnRzVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHM6ICBhbGxvd2VkLCBidXQgIGZvdW5kLl93aXRoQXJndW1lbnRzVHlwZUFyZ3VtZW50TWlzbWF0Y2hFeHBlY3RlZCAgdHlwZSBhcmd1bWVudHMuX3dpdGhBcmd1bWVudHNUeXBlQXJndW1lbnRzT25UeXBlVmFyaWFibGVDYW4ndCB1c2UgdHlwZSBhcmd1bWVudHMgd2l0aCB0eXBlIHZhcmlhYmxlICdfd2l0aEFyZ3VtZW50c1R5cGVOb3RGb3VuZCcgbm90IGZvdW5kLl93aXRoQXJndW1lbnRzVHlwZU9yaWdpbicgaXMgZnJvbSAnX3dpdGhBcmd1bWVudHNUeXBlT3JpZ2luV2l0aEZpbGVVcmknICgnX3dpdGhBcmd1bWVudHNUeXBlVmFyaWFibGVEdXBsaWNhdGVkTmFtZUNhdXNlVGhlIG90aGVyIHR5cGUgdmFyaWFibGUgbmFtZWQgJ193aXRoQXJndW1lbnRzVW5leHBlY3RlZFRva2VuVW5leHBlY3RlZCB0b2tlbiAnX3dpdGhBcmd1bWVudHNVbm1hdGNoZWRUb2tlbkNhbid0IGZpbmQgJycgdG8gbWF0Y2ggJ193aXRoQXJndW1lbnRzVW5yZXNvbHZlZFByZWZpeEluVHlwZUFubm90YXRpb24nIGlzbid0IGRlZmluZWQuX3dpdGhBcmd1bWVudHNVbnNwZWNpZmllZF93aXRoQXJndW1lbnRzVW5zdXBwb3J0ZWRPcGVyYXRvclRoZSAnJyBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLl93aXRoQXJndW1lbnRzVW50ZXJtaW5hdGVkU3RyaW5nU3RyaW5nIHN0YXJ0aW5nIHdpdGggIG11c3QgZW5kIHdpdGggX3dpdGhBcmd1bWVudHNVbnRyYW5zbGF0YWJsZVVyaU5vdCBmb3VuZDogJ193aXRoQXJndW1lbnRzVXNlT2ZEZXByZWNhdGVkSWRlbnRpZmllcicgaXMgZGVwcmVjYXRlZC5fd2l0aEFyZ3VtZW50c1ZhbHVlRm9yUmVxdWlyZWRQYXJhbWV0ZXJOb3RQcm92aWRlZEVycm9yUmVxdWlyZWQgbmFtZWQgcGFyYW1ldGVyICcnIG11c3QgYmUgcHJvdmlkZWQuX3dpdGhBcmd1bWVudHNWYWx1ZUZvclJlcXVpcmVkUGFyYW1ldGVyTm90UHJvdmlkZWRXYXJuaW5nTWlzc2luZyByZXF1aXJlZCBuYW1lZCBwYXJhbWV0ZXIgJ193aXRoQXJndW1lbnRzV2ViTGl0ZXJhbENhbm5vdEJlUmVwcmVzZW50ZWRFeGFjdGx5IGNhbid0IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgaW4gSmF2YVNjcmlwdC5UcnkgY2hhbmdpbmcgdGhlIGxpdGVyYWwgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFzY3JpcHQuIEluIEphdmFzY3JpcHQgIGlzIHRoZSBuZWFyZXN0IHZhbHVlIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuZnJvbnRfZW5kLnN1bW1hcnlfZ2VuZXJhdG9yc3VtbWFyeUZvcnRydW5jYXRlYnVpbGRTdW1tYXJ5YnVpbGRDb21wb25lbnR0cnVuY2F0ZVN1bW1hcnlkYXJ0MmpzLnNjYW5uZXIuc3RyaW5nX3NjYW5uZXJTeW50aGV0aWNTdHJpbmdUb2tlblRva2VuVHlwZWFuYWx5emVyQWJzdHJhY3RTY2FubmVyTGFuZ3VhZ2VWZXJzaW9uQ2hhbmdlZFNjYW5uZXJDb25maWd1cmF0aW9uQ29tbWVudFRva2VuRGFydERvY1Rva2VuTGFuZ3VhZ2VWZXJzaW9uVG9rZW5FcnJvclRva2Vuc2Nhbk9mZnNldGNvbmZpZ3VyYXRpb25pbmNsdWRlQ29tbWVudHNsYW5ndWFnZVZlcnNpb25DaGFuZ2VkZW5zdXJlWmVyb1Rlcm1pbmF0aW9uAHNjYW5uZXJzdGFydFRva2VudG9rZW5pemVpc0VvZmFkdmFuY2VwZWVrc3RyaW5nT2Zmc2V0Y3VycmVudEFzVW5pY29kZWhhbmRsZVVuaWNvZGVzdGFydFNjYW5PZmZzZXRjcmVhdGVTdWJzdHJpbmdUb2tlbmFzY2lpT25seWV4dHJhT2Zmc2V0dG9rZW5TdGFydHByZWNlZGluZ0NvbW1lbnRzY29tbWVudHNjcmVhdGVTeW50aGV0aWNTdWJzdHJpbmdUb2tlbnN5bnRoZXRpY0NoYXJzY3JlYXRlQ29tbWVudFRva2VuY3JlYXRlRGFydERvY1Rva2VuY3JlYXRlTGFuZ3VhZ2VWZXJzaW9uVG9rZW5tYWpvcm1pbm9yYXRFbmRPZkZpbGVmYXN0YS5pbmNyZW1lbnRhbF9jb21waWxlckJpbmFyeUJ1aWxkZXJXaXRoTWV0YWRhdGFDYW5vbmljYWxOYW1lRXJyb3JDYW5vbmljYWxOYW1lU2RrRXJyb3JJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yU3ViQ29tcG9uZW50Vmlld0J1aWxkZXJDbGFzc0J1aWxkZXJMaWJyYXJ5QnVpbGRlck5hbWVJdGVyYXRvclR5cGVCdWlsZGVyVHlwZURlY2xhcmF0aW9uQnVpbGRlckJ1aWxkZXJHcmFwaERpbGxDbGFzc0J1aWxkZXJEaWxsTGlicmFyeUJ1aWxkZXJEaWxsVGFyZ2V0RXhwb3J0SW1wb3J0U291cmNlQ2xhc3NCdWlsZGVyc2F2ZUFzR3ppcHRleHR1YWxPdXRsaW5lQ2xhc3NIaWVyYXJjaHlCdWlsZGVyVmFyaWFibGVEZWNsYXJhdGlvbkltcGxLZXJuZWxUYXJnZXRMaWJyYXJ5R3JhcGhTb3VyY2VMaWJyYXJ5QnVpbGRlcnRyYWNrTmVlZGVkRGlsbExpYnJhcmllc25lZWRlZERpbGxMaWJyYXJpZXNpbnZhbGlkYXRlZFVyaXNkaWxsTG9hZGVkRGF0YXBsYXRmb3JtQnVpbGRlcnN1c2VyQnVpbGRlcnNjb21wb25lbnRUb0luaXRpYWxpemVGcm9taW5pdGlhbGl6ZWRGcm9tRGlsbGluaXRpYWxpemVkSW5jcmVtZW50YWxTZXJpYWxpemVycHJldmlvdXNQYWNrYWdlc1VyaXByZXZpb3VzUGFja2FnZXNNYXBjdXJyZW50UGFja2FnZXNNYXBoYXNUb0NoZWNrUGFja2FnZVVyaXNyZW1haW5pbmdDb21wb25lbnRQcm9ibGVtc21vZHVsZXNUb0xvYWR1c2VFeHBlcmltZW50YWxJbnZhbGlkYXRpb25kZWJ1Z0V4cHJVcmlvcmctZGFydGxhbmctZGVidWdzeW50aGV0aWNfZGVidWdfZXhwcmVzc2lvbnVzZXJDb2RlcHJldmlvdXNTb3VyY2VCdWlsZGVyc3NldHVwUGFja2FnZXNBbmRVcmlUcmFuc2xhdG9ydXJpVHJhbnNsYXRvcmVuc3VyZVBsYXRmb3JtQW5kSW5pdGlhbGl6ZWludmFsaWRhdGVOb3RLZXB0VXNlckJ1aWxkZXJzcmV1c2VkUmVzdWx0Y29tcHV0ZVJldXNlZExpYnJhcmllc2luaXRpYWxpemVFeHBlcmltZW50YWxJbnZhbGlkYXRpb25leHBlcmltZW50YWxJbnZhbGlkYXRpb25yZWNvcmRSZWJ1aWxkQm9kaWVzQ291bnRGb3JUZXN0aW5nbWlzc2luZ1NvdXJjZXNjbGVhbnVwUmVtb3ZlZEJ1aWxkZXJzcmVjcmVhdGVEaWxsVGFyZ2V0SWZQYWNrYWdlV2FzVXBkYXRlZGxvYWRlcmNsZWFudXBIaWVyYXJjaHlyZXVzZWRMaWJyYXJpZXNEZWNpZGVkIHRvIHJldXNlIGJ1aWxkZXJzIGxpYnJhcmllc2xvYWRFbnN1cmVMb2FkZWRDb21wb25lbnRzcmVzZXRUcmFja2luZ09mVXNlZExpYnJhcmllc3VzZXJDb2RlT2xkc2V0dXBOZXdVc2VyQ29kZXJlYnVpbGRCb2RpZXNNYXBleHBlcmltZW50YWxJbnZhbGlkYXRpb25DcmVhdGVSZWJ1aWxkQm9kaWVzQnVpbGRlcnNzZXRFbnRyeVBvaW50c2J1aWxkT3V0bGluZXNleHBlcmltZW50YWxJbnZhbGlkYXRpb25QYXRjaFVwU2NvcGVzY29tcG9uZW50V2l0aERpbGxjbGFzc2VzQ2hhbmdlZFN0cnVjdHVyZXJlY29yZE5vbkZ1bGxDb21wb25lbnRGb3JUZXN0aW5ncGVyZm9ybURpbGxVc2FnZVRyYWNraW5ncmVsZWFzZUFuY2lsbGFyeVJlc291cmNlc2NvbXBpbGVkTGlicmFyaWVzZXhwZXJpbWVudGFsQ29tcGlsYXRpb25Qb3N0Q29tcGlsZVBhdGNodXBvdXRwdXRMaWJyYXJpZXNjYWxjdWxhdGVPdXRwdXRMaWJyYXJpZXNBbmRJc3N1ZUxpYnJhcnlQcm9ibGVtc3JlaXNzdWVDb21wb25lbnRQcm9ibGVtc2N1cnJlbnRTb3VyY2VMb2FkZXJjb252ZXJ0U291cmNlTGlicmFyeUJ1aWxkZXJzVG9EaWxsdXNlckxvYWRlZFVyaU1haW5jaGFuZ2VkbmV3RGlsbExpYnJhcnlCdWlsZGVyc2NvbnZlcnRlZExpYnJhcmllc2RpbGxCdWlsZGVyYXBwZW5kTGlicmFyeXN1cHByZXNzRmluYWxpemF0aW9uRXJyb3JzcmVwbGFjZW1lbnRNYXByZXBsYWNlbWVudFNldHRlcnNNYXBleHBlcmltZW50YWxJbnZhbGlkYXRpb25GaWxsUmVwbGFjZW1lbnRNYXBzb3JpZ2luYWxOb3RSZXVzZWRMaWJyYXJpZXNpc0J1aWx0ZXhwb3J0U2NvcGVwYXRjaFVwU2NvcGVidWlsZGVyc0NyZWF0ZWRXaXRoUmVmZXJlbmNlc2J1aWxkZXJIaWVyYXJjaHlhbGxMaWJyYXJpZXNjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmVyZWlzc3VlTGlicmFyeVByb2JsZW1zcmVidWlsZEJvZGllc2lzQnVpbHRBbmRNYXJrZWR1cGRhdGVOZWVkZWREaWxsTGlicmFyaWVzV2l0aEhpZXJhcmNoeWNoaWxkUmVwbGFjZW1lbnRNYXBjaGlsZFJlcGxhY2VtZW50U2V0dGVyc01hcG5hbWVJdGVyYXRvcmNoaWxkQnVpbGRlclVuZXhwZWN0ZWQgZG91YmxlLWVudHJ5IGZvciAob3JnIGZyb20gKTogbmV3QnVpbGRlcnJlZmVyZW5jZXNGcm9tZ2V0UGFydEZpbGVVcmluZXdQYXJ0QnVpbGRlcnJlZmVyZW5jZUlzUGFydE93bmVyY2xlYXJFeHRlbnNpb25zSW5TY29wZUNhY2hlcmVwbGFjZW1lbnRzcHJlZml4QnVpbGRlcmV4cG9ydHNleHBvcnRlcmV4cG9ydGVkaW1wb3J0U2NvcGV0eXBlQnVpbGRlcnJlcGxhY2VUeXBlQnVpbGRlcm9uVHlwZXNVbmV4cGVjdGVkIGJ1aWxkZXI6IGZpcnN0RW50cnlQb2ludGZpcnN0RW50cnlQb2ludEltcG9ydFVyaWdldEVudHJ5UG9pbnRVcmlpc3N1ZVByb2JsZW13YXNGaXJzdFNldGxvY2FsTWVtYmVyc25vdFJldXNlZExpYnJhcmllc29sZERpbGxMb2FkZWREYXRhcmVtb3ZlZERpbGxCdWlsZGVyc2NsZWFudXBTb3VyY2VzRm9yQnVpbGRlcnJlbW92ZUxpYnJhcnlGcm9tUmVtYWluaW5nQ29tcG9uZW50UHJvYmxlbXNtYWtlRGlsbExvYWRlckxpYnJhcmllc1VwVG9EYXRlV2l0aEJ1aWxkZXJzTWFwZGlyZWN0bHlJbnZhbGlkYXRlZGludmFsaWRhdGVkQmVjYXVzZU9mUGFja2FnZVVwZGF0ZWlzRHVwbGljYXRlcHJldmlvdXNTb3VyY2Vub3dwYXJ0T2ZMaWJyYXJ5c2VlblVyaXNpc1BhcnRpc1BhdGNoYnl0ZXNMZW5ndGhpbml0aWFsaXplRnJvbUNvbXBvbmVudHN1bW1hcnlCeXRlc3ByZXBhcmVTdW1tYXJ5aW5pdGlhbGl6ZUZyb21EaWxsc3RnekluaXRpYWxpemVkRnJvbWluaXRpYWxpemF0aW9uQnl0ZXNpbml0aWFsaXplX2Zyb20uZGlsbHJlY29yZFRlbXBvcmFyeUZpbGVGb3JUZXN0aW5nYWRkUHJvYmxlbWFwcGVuZExpYnJhcmllc0RpZG4ndCBmaW5kIHRoZSByZXBsYWNlbWVudCBmb3IgdXNlZENsYXNzZXNsb2FkZWROb3RLZXB0bW9kdWxlbG9hZGVkQW55dGhpbmd1c2VkQ29tcG9uZW50YWRkTGlicmFyeWlzc3VlZFByb2JsZW1zbWVzc2FnZXNwYXJlbnRGaWxlVXJpaW5wdXRMaWJyYXJpZXNpbnB1dExpYnJhcmllc0ZpbHRlcmVkbGlicmFyeU1hcHBvdGVudGlhbGx5UmVmZXJlbmNlZExpYnJhcmllc3BvdGVudGlhbGx5UmVmZXJlbmNlZElucHV0TGlicmFyaWVzbGlicmFyeUJ1aWxkZXJwYXJ0c1VzZWRuZWlnaGJvcnNPZnBhcnRGaWxlVXJpdXJpVG9Tb3VyY2VFeHRyYVJlYWQgZGlzYWJsZUxhenlDbGFzc1JlYWRpbmdEZXNlcmlhbGl6ZWQgdmlld3NjaGVja0Nhbm9uaWNhbE5hbWVzY3JlYXRlVmlld2luaXRpYWxpemVzYXZlQ29tcG9uZW50UHJvYmxlbXNBYm91dCB0byBpbml0aWFsaXplRnJvbUNvbXBvbmVudGZvdW5kRGFydENvcmVEaWQgbm90IGZpbmQgZGFydDpjb3JlIHdoZW4gdHJpZWQgdG8gaW5pdGlhbGl6ZSBmcm9tIGNvbXBvbmVudC5SYW4gaW5pdGlhbGl6ZUZyb21Db21wb25lbnRieXRlQ291bnRBcHBlbmRlZCBsaWJyYXJpZXNjbGFzc0J1aWxkZXJzZWVuTWVzc2FnZXNkZWJ1Z0xpYnJhcnljcmVhdGVOZXN0ZWRTY29wZW5hbWVPcmlnaW5jb21iaW5hdG9yYWRkSW1wb3J0YWRkSW1wb3J0c1RvU2NvcGVoZnNmc2J1aWxkbW9kaWZ5VGFyZ2V0YnVpbGRFeHByZXNzaW9uY29tcGlsZWRFeHByZXNzaW9uc291cmNlQnl0ZXNydW5Qcm9jZWR1cmVUcmFuc2Zvcm1hdGlvbnNpbnZhbGlkYXRlZEltcG9ydFVyaXNpc0ludmFsaWRhdGVkZmlyc3RTbGFzaG5ld0ZpbGVVcmlhZGRCdWlsZGVyQW5kSW52YWxpZGF0ZVVyaXNyZWNvcmRJbnZhbGlkYXRlZEltcG9ydFVyaXNGb3JUZXN0aW5nZGlyZWN0RGVwZW5kZW5jaWVzdmVydGljZXNQYWNrYWdlQ2hhbmdlZEVycm9ySW5pdGlhbGl6ZUZyb21Db21wb25lbnRFcnJvckluY3JlbWVudGFsQ29tcGlsZXJEYXRhUmV1c2FnZVJlc3VsdEV4cGVyaW1lbnRhbEludmFsaWRhdGlvbkluY3JlbWVudGFsS2VybmVsVGFyZ2V0ZGlsbFRhcmdldGdldFBhcnRVcmlwYXJlbnRVcmlvcmctZGFydGxhbmctbWFsZm9ybWVkLXVyaXF1ZXJ5ZmFzdGEuaW5jcmVtZW50YWxfc2VyaWFsaXplcnVyaVRvR3JvdXBDYW5ub3QgaW5pdGlhbGl6ZSB3aGVuIGFscmVhZHkgaW4gdXNlLmdvb2RWaWV3c3ZpZXdnb29kdGhpc1BhY2thZ2VOYW1lbmV3R3JvdXBzY29tcG9uZW50RmlsZVNpemVjb21wb25lbnRTdGFydE9mZnNldG5ld0dyb3VwY3JlYXRlR3JvdXBGb3JwYWNrYWdlR3JvdXBzZXR1cERlcGVuZGVuY3lUcmFja2luZ3dyaXRlUGFja2FnZXNUb1NpbmtBbmRUcmltQ29tcG9uZW50aXNTZWxmQ29udGFpbmVkcmVtb3ZlSW52YWxpZGF0ZWRwYWNrYWdlTGlicmFyaWVzbm9uUGFja2FnZUxpYnJhcmllc25ld1BhY2thZ2VzY2FjaGVkUGFja2FnZXNJbk91dHB1dGdyb3VwYWRkRGF0YUJ1dE5vdERlcGVuZGVudERhdGF1cEZyb250R3JvdXBzYWRkRGF0YUFuZERlcGVuZGVudERhdGFuZXdQYWNrYWdlR3JvdXBzc2VyaWFsaXplZ290cmVtb3ZlVXJpRnJvbU1hcG90aGVyc0RlcGVuZGluZ09uTWVkZXBlbmRzT25Hcm91cGRlcGVuZGVuY3lMaWJyYXJ5ZGVwZW5kZW5jeUxpYnJhcnlVcmlkZXBHcm91cERpZG4ndCBjb250YWluIGdyb3VwIGZvciByZWdpc3RlckRlcGVuZGVuY3lzZXJpYWxpemVkRGF0YXNpbmdsZVBhY2thZ2VMaWJyYXJpZXNncm91cFVyaXNhbWVHcm91cFNlcmlhbGl6YXRpb25Hcm91cGZyb250X2VuZC5rZXJuZWxfZ2VuZXJhdG9yX2ltcGx3aXRoQ3Jhc2hSZXBvcnRpbmd2ZXJpZnlDb21wb25lbnRMb2FkZXJJbnRlcm5hbENvbXBpbGVyUmVzdWx0a2VybmVsVGFyZ2V0Rm9yVGVzdGluZ3NvdXJjZUxvYWRlcmlucHV0U3VtbWFyeWtlcm5lbFRhcmdldHN1bW1hcnlDb21wb25lbnRpc1NvdXJjZUxpYnJhcnl0cmltbWVkU3VtbWFyeUNvbXBvbmVudFRyYW5zZm9ybWVkIG91dGxpbmVHZW5lcmF0ZWQgb3V0bGluZUdlbmVyYXRlZCBjb21wb25lbnRjdXJyZW50VXJpRm9yQ3Jhc2hSZXBvcnRpbmdERUZBVUxUX0NPTE9SG1szOTs0OW1CTEFDS19DT0xPUhtbMzBtUkVEX0NPTE9SR1JFRU5fQ09MT1JZRUxMT1dfQ09MT1JCTFVFX0NPTE9STUFHRU5UQV9DT0xPUkNZQU5fQ09MT1JXSElURV9DT0xPUl9lbmFibGVDb2xvcnNwcmludEVuYWJsZUNvbG9yc1JlYXNvbmVuYWJsZUNvbG9yc3dyYXBjb2xvcmJsYWNrcmVkZ3JlZW55ZWxsb3dibHVlbWFnZW50YWN5YW53aGl0ZV9zdXBwb3J0c0Fuc2lFc2NhcGVzc3RkZXJyU3VwcG9ydHNDb2xvcnNzdGRvdXRTdXBwb3J0c0NvbG9yc05vdCBlbmFibGluZyBjb2xvcnMsIHN0ZG91dCBkb2VzIG5vdCBzdXBwb3J0IEFOU0kgY29sb3JzLk5vdCBlbmFibGluZyBjb2xvcnMsIHN0ZGVyciBkb2VzIG5vdCBzdXBwb3J0IEFOU0kgY29sb3JzLmtlcm5lbC5hc3RfZnJvbV9iaW5hcnlQYXJzZUVycm9yYnl0ZUluZGV4VW5leHBlY3RlZCBLZXJuZWwgdmVyc2lvbiAoZXhwZWN0ZWQgX0NvbXBvbmVudEluZGV4bnVtYmVyT2ZGaXhlZEZpZWxkc2JpbmFyeU9mZnNldEZvclNvdXJjZVRhYmxlYmluYXJ5T2Zmc2V0Rm9yQ2Fub25pY2FsTmFtZXNiaW5hcnlPZmZzZXRGb3JNZXRhZGF0YVBheWxvYWRzYmluYXJ5T2Zmc2V0Rm9yTWV0YWRhdGFNYXBwaW5nc2JpbmFyeU9mZnNldEZvclN0cmluZ1RhYmxlYmluYXJ5T2Zmc2V0Rm9yQ29uc3RhbnRUYWJsZW1haW5NZXRob2RSZWZlcmVuY2VsaWJyYXJ5Q291bnRjb21wb25lbnRGaWxlU2l6ZUluQnl0ZXN2YXJpYWJsZVN0YWNrbGFiZWxTdGFja2xhYmVsU3RhY2tCYXNlc3dpdGNoQ2FzZVN0YWNrQmFzZXN3aXRjaENhc2VTdGFja3R5cGVQYXJhbWV0ZXJTdGFja19ieXRlc19ieXRlT2Zmc2V0X3N0cmluZ1RhYmxlX3NvdXJjZVVyaVRhYmxlX2NvbnN0YW50VGFibGVfbGlua1RhYmxlX3RyYW5zZm9ybWVyRmxhZ3NfY29tcG9uZW50U3RhcnRPZmZzZXRkZWJ1Z1BhdGhfZGlzYWJsZUxhenlSZWFkaW5nX2Rpc2FibGVMYXp5Q2xhc3NSZWFkaW5nZmFpbGJ5dGVPZmZzZXRyZWFkRG91YmxlcmVhZFN0cmluZ0VudHJ5bnVtQnl0ZXNudW1CeXRlT3JkZXJNYXJrc++7v19yZWFkTWV0YWRhdGFNYXBwaW5nc19hc3NvY2lhdGVNZXRhZGF0YXJlYWRTdHJpbmdUYWJsZXRhYmxlZW5kT2Zmc2V0c3N0YXJ0T2Zmc2V0cmVhZENvbnN0YW50VGFibGVyZWFkQ29uc3RhbnRUYWJsZUVudHJ5Y29uc3RhbnRUYWdyZWFkRXhwcmVzc2lvbnJlYWRMaWJyYXJ5UmVmZXJlbmNlcmVhZENsYXNzUmVmZXJlbmNldHlwZUFyZ3VtZW50Q291bnRmaWVsZFZhbHVlQ291bnR1bmV4cGVjdGVkIGNvbnN0YW50IHRhZzogcmVhZFVyaVJlZmVyZW5jZXJlYWRTdHJpbmdSZWZlcmVuY2VMaXN0cmVhZFN0cmluZ09yTnVsbElmRW1wdHlyZWFkQW5kQ2hlY2tPcHRpb25UYWd1bmV4cGVjdGVkIG9wdGlvbiB0YWc6IHJlYWRBbm5vdGF0aW9uTGlzdF9maWxsVHJlZU5vZGVMaXN0YnVpbGRPYmplY3RfZmlsbE5vblRyZWVOb2RlTGlzdF9tZXJnZU5hbWVkTm9kZUxpc3RyZWFkTGlua1RhYmxlbGlua1Jvb3RiaWFzZWRQYXJlbnRJbmRleF9pbmRleENvbXBvbmVudHNfY2hlY2tFbXB0eUlucHV0c2F2ZWRCeXRlT2Zmc2V0aW5kaWNhdGVkIHNpemUgZG9lcyBub3QgbWF0Y2ggZmlsZSBzaXplRW1wdHkgaW5wdXQgZ2l2ZW4uQmluYXJ5QnVpbGRlci5yZWFkQ29tcG9uZW50Tm90IGEgLmRpbGwgZmlsZSAod3JvbmcgbWFnaWMgbnVtYmVyKS5jb21wb25lbnRGaWxlU2l6ZXNjb21wb25lbnRGaWxlSW5kZXhfcmVhZE9uZUNvbXBvbmVudF9jaGVja0Nhbm9uaWNhbE5hbWVDaGlsZHJlbl9yZWFkT25lQ29tcG9uZW50U291cmNlcmVhZFNpbmdsZUZpbGVDb21wb25lbnRpbnZhbGlkIGNvbXBvbmVudCBkYXRhQ29uY2F0ZW5hdGVkIGNvbXBvbmVudCBmaWxlIGdpdmVuIHdoZW4gYSBzaW5nbGUgY29tcG9uZW50IHdhcyBleHBlY3RlZC5VbnJlY29nbml6ZWQgYnl0ZXMgZm9sbG93aW5nIGNvbXBvbmVudCBkYXRhcGFyZW50Q2hpbGRyZW5jaGVja1JlZmVyZW5jZU5vZGVidWlsZENhbm9uaWNhbE5hbWVFcnJvck51bGwgcmVmZXJlbmNlICgpIChDYW5vbmljYWwgbmFtZSBhbmQgcmVmZXJlbmNlIGRvZXNuJ3QgYWdyZWUuUmVmZXJlbmNlIGlzIG51bGwgKHByb2JsZW1Ob2RlZGFydDpfcmVhZENvbXBvbmVudEluZGV4c2F2ZWRCeXRlSW5kZXhNYWxmb3JtZWQgYmluYXJ5OiBUaGlzIGNvbXBvbmVudCBmaWxlJ3MgY29tcG9uZW50IGluZGV4IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlIHNpemUgc2hvdWxkIGJlICBidXQgb3RoZXIgY29tcG9uZW50IGluZGV4ZXMgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBzaXplIHNob3VsZCBiZSByZWFkVXJpVG9Tb3VyY2VfbWVyZ2VVcmlUb1NvdXJjZXJlYWRMaXN0T2ZTdHJpbmdzbnVtYmVyT2ZMaWJyYXJpZXNyZWFkTGlicmFyeWdldE1lbWJlclJlZmVyZW5jZUZyb21JbnR1cmlCeXRlc3NvdXJjZUNvZGVsaW5lQ291bnRpbXBvcnRVcmlCeXRlc2RzdGdldENhbm9uaWNhbE5hbWVSZWZlcmVuY2VGcm9tSW50cmVhZExpYnJhcnlEZXBlbmRlbmN5UmVmZXJlbmNlcmVhZE1lbWJlclJlZmVyZW5jZUV4cGVjdGVkIGEgbWVtYmVyIHJlZmVyZW5jZSB0byBiZSB2YWxpZCBidXQgd2FzIGBudWxsYC5yZWFkVHlwZWRlZlJlZmVyZW5jZXByb2NlZHVyZUNvdW50Y2xhc3NDb3VudF9yZWFkTGlicmFyeURlcGVuZGVuY2llc19yZWFkQWRkaXRpb25hbEV4cG9ydHNfcmVhZExpYnJhcnlQYXJ0c3JlYWRUeXBlZGVmcmVhZENsYXNzcmVhZEV4dGVuc2lvbnJlYWRGaWVsZHJlYWRQcm9jZWR1cmVyZWFkTGlicmFyeURlcGVuZGVuY3lyZWFkT2Zmc2V0cmVhZEV4cHJlc3Npb25MaXN0cHJlZml4TmFtZXJlYWRDb21iaW5hdG9yTGlzdG51bUV4cG9ydGVkUmVmZXJlbmNlZXhwb3J0ZWROYW1lcmVhZENvbWJpbmF0b3JyZWFkTGlicmFyeVBhcnRyZWFkQW5kUHVzaFR5cGVQYXJhbWV0ZXJMaXN0cmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9uTGlzdG5vcm1hbC1jbGFzc3JlYWRTdXBlcnR5cGVPcHRpb25yZWFkU3VwZXJ0eXBlcmVhZENsYXNzUGFydGlhbENvbnRlbnRfc2V0TGF6eUxvYWRDbGFzc3JlYWRDb25zdHJ1Y3RvcnJlYWRSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvcmN1cnJlbnRMaWJyYXJ5Z2V0QW5kUmVzZXRUcmFuc2Zvcm1lckZsYWdzYWRkVHJhbnNmb3JtZXJGbGFncmVhZEV4cHJlc3Npb25PcHRpb25wdXNoVmFyaWFibGVEZWNsYXJhdGlvbnNyZWFkSW5pdGlhbGl6ZXJraW5kSW5kZXhmdW5jdGlvbk5vZGVTaXplcmVhZEZ1bmN0aW9uTm9kZU5vd3JlYWRGdW5jdGlvbk5vZGVPcHRpb25yZWRpcmVjdGluZy1mYWN0b3J5LWNvbnN0cnVjdG9ycmVhZERhcnRUeXBlTGlzdHR5cGVQYXJhbWV0ZXJTdGFja0hlaWdodHZhcmlhYmxlU3RhY2tIZWlnaHRyZWFkQXJndW1lbnRzcmVhZEFuZFB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucmVhZFN0YXRlbWVudHVuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgdGFnOiBsYXp5TG9hZEJvZHlvdXRlckVuZE9mZnNldG9sZExhYmVsU3RhY2tCYXNlb2xkU3dpdGNoQ2FzZVN0YWNrQmFzZXJlYWRTdGF0ZW1lbnRPcHRpb25fc2V0TGF6eUxvYWRGdW5jdGlvbnB1c2hWYXJpYWJsZURlY2xhcmF0aW9ucmVhZFZhcmlhYmxlUmVmZXJlbmNldW5leHBlY3RlZCB2YXJpYWJsZSBpbmRleDogbG9naWNhbE9wZXJhdG9yVG9TdHJpbmd1bmV4cGVjdGVkIGxvZ2ljYWwgb3BlcmF0b3IgaW5kZXg6IHRhZ0J5dGVyZWFkRGFydFR5cGVPcHRpb25hc3NlcnRDb3VudHJlYWRNYXBFbnRyeUxpc3RyZWFkVmFyaWFibGVEZWNsYXJhdGlvbnJlYWRTdGF0ZW1lbnRMaXN0dW5leHBlY3RlZCBleHByZXNzaW9uIHRhZzogcmVhZE1hcEVudHJ5cmVhZFN0YXRlbWVudE9yTnVsbElmRW1wdHlyZWFkQmxvY2tyZWFkQXNzZXJ0QmxvY2tyZWFkU3dpdGNoQ2FzZUludG9yZWFkQ2F0Y2hMaXN0dW5leHBlY3RlZCBzdGF0ZW1lbnQgdGFnOiByZWFkQ2F0Y2hyZWFkQW5kUHVzaFZhcmlhYmxlRGVjbGFyYXRpb25PcHRpb25JbiBzZXJpYWxpemVkIGZvcm0gc3VwZXJ0eXBlcyBzaG91bGQgaGF2ZSBOdWxsYWJpbGl0eS5sZWdhY3kgaWYgdGhleSBhcmUgaW4gYSBsaWJyYXJ5IHRoYXQgaXMgb3B0ZWQgb3V0IG9mIHRoZSBOTkJEIGZlYXR1cmUuICBJZiB0aGV5IGFyZSBpbiBhbiBvcHRlZC1pbiBsaWJyYXJ5LCB0aGV5IHNob3VsZCBoYXZlIE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlLnJlYWRTdXBlcnR5cGVMaXN0cmVhZE5hbWVkVHlwZUxpc3RyZWFkTmFtZWRUeXBlbnVsbGFiaWxpdHlJbmRleHRvdGFsUGFyYW1ldGVyQ291bnRkZWNsYXJlZE51bGxhYmlsaXR5SW5kZXh1bmV4cGVjdGVkIGRhcnQgdHlwZSB0YWc6IHJlYWRUeXBlUGFyYW1ldGVycmVhZE5hbWVkRXhwcmVzc2lvbkxpc3RyZWFkTmFtZWRFeHByZXNzaW9uX3N1YnNlY3Rpb25zc3ViU2VjdGlvbkNvdW50bWFwcGluZ1N0YXJ0bWV0YWRhdGFPZmZzZXRfcmVhZE1ldGFkYXRhc2F2ZWRPZmZzZXRwYWNrYWdlX2NvbmZpZy5wYWNrYWdlc25vUGFja2FnZXNwYWNrYWdlVXJpbm90Rm91bmRwYWNrYWdlTWV0YWRhdGFsaWJyYXJ5TWV0YWRhdGFkZWZhdWx0UGFja2FnZU5hbWVwYWNrYWdlX2NvbmZpZy5wYWNrYWdlc19maWxlaXNWYWxpZFBhY2thZ2VOYW1lYmFzZUxvY2F0aW9uaXNDb21tZW50c2VwYXJhdG9ySW5kZXhNaXNzaW5nIHBhY2thZ2UgbmFtZU5vICc6JyBvbiBsaW5lTm90IGEgdmFsaWQgcGFja2FnZSBuYW1lcGFja2FnZVZhbHVlcGFja2FnZUxvY2F0aW9uRGVmYXVsdCBwYWNrYWdlIGVudHJ5IHZhbHVlIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZU1vcmUgdGhhbiBvbmUgZGVmYXVsdCBwYWNrYWdlIGVudHJ5U2FtZSBwYWNrYWdlIG5hbWUgb2NjdXJlZCB0d2ljZXBhY2thZ2VNYXBwaW5nYmFzZVVyaWNvbW1lbnRNdXN0IGJlIGFic29sdXRlY29tbWVudExpbmUjICMgZ2VuZXJhdGVkIGJ5IHBhY2thZ2U6cGFja2FnZV9jb25maWcgYXQgIiBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWVQYWNrYWdlIGxvY2F0aW9uIG11c3Qgbm90IGJlIGEgcGFja2FnZTogVVJJX3JlbGF0aXZpemVoYXNRdWVyeWhhc0ZyYWdtZW50dXNlckluZm9oYXNBdXRob3JpdHlwb3J0dG9Mb3dlckNhc2UuL3BhY2thZ2VfY29uZmlnLnBhY2thZ2VzX2ltcGxjaGVja1ZhbGlkUGFja2FnZVVyaU5vUGFja2FnZXNObyBwYWNrYWdlIG5hbWVkICJQYWNrYWdlc0Jhc2VwYWNrYWdlQmFzZWdldEJhc2VfbWFwcGluZ2ZyYWdtZW50aXNTY2hlbWVkZWZhdWx0UGFja2FnZU5hbWVVcmlOb25GaWxlUGFja2FnZXNEaXJlY3RvcnlQYWNrYWdlc19wYWNrYWdlQmFzZV9mYWlsTGlzdGluZ1BhY2thZ2VzQ2Fubm90IGxpc3QgcGFja2FnZXMgZm9yIGEgYmFzZWQgcGFja2FnZSByb290ZmFzdGEuY29tbWFuZF9saW5lX3JlcG9ydGluZyRDQVJFVCRTUEFDRSRUQUJDcmFzaHNhZmVUb1N0cmluZ2dldFNvdXJjZUxpbmV1bmhhbmRsZWRoaWRlV2FybmluZ3NtZXNzYWdlVGV4dHNvdXJjZUxpbmV0cmFjZUNyYXNoIHdoZW4gZm9ybWF0dGluZzogXSBmb3JtYXRFcnJvck1lc3NhZ2VzcXVpZ2dseUxlbmd0aGluZGVudExlbmd0aGxlbmd0aEluU291cmNlTGluZXBvaW50ZXJwb2ludGVyTGVuZ3RoLi4uaXNIaWRkZW5zaG91bGRUaHJvd09uaXNDb21waWxlVGltZUVycm9yZmFzdGEubWVzc2FnZXNnZXRMb2NhdGlvbkZyb21VcmlnZXRMb2NhdGlvbkZyb21Ob2RlZmFzdGEucHJvYmxlbXNEZWJ1Z0Fib3J0OiB3aGF0dW5leHBlY3RlZGV4cGVjdGVkYWN0dWFsdW5zdXBwb3J0ZWRvcGVyYXRpb25nZXRGaWxlVXJpZmFzdGEudGlja2Vyc3dwcmV2aW91c1RpY2tlbGFwc2Vkc2luY2VTdGFydGluTWlsbGlzZWNvbmRzbXMuZmFzdGEudXJpX3RyYW5zbGF0b3JkYXJ0TGlicmFyaWVzZ2V0RGFydFBhdGNoZXNsaWJyYXJ5SW5mb0ZvcnBhdGNoZXNpc1BsYXRmb3JtSW1wbGVtZW50YXRpb25yZXBvcnRNZXNzYWdlX3RyYW5zbGF0ZURhcnRVcmlfdHJhbnNsYXRlUGFja2FnZVVyaWdldFBhY2thZ2VGcmFnbWVudHBhY2thZ2VCYXNlVXJpZ2V0RGVmYXVsdFBhY2thZ2VGcmFnbWVudGVtcHR5UGFja2FnZVJlZGlyZWN0aXNMaWJyYXJ5U3VwcG9ydGVkX3BhY2thZ2VVcmlOb3RGb3VuZF9wYWNrYWdlVXJpTm90Rm91bmROb1JlcG9ydGpzb25EZWNvZGVfdGFyZ2V0c3RhcmdldFNwZWNObyBsaWJyYXJ5IHNwZWNpZmljYXRpb24gZm9yIHRhcmdldCAianNvbkRhdGF0b3AtbGV2ZWwgc3BlY2lmaWNhdGlvbiBpcyBub3QgYSBtYXB0YXJnZXREYXRhY29tbWVudDp0YXJnZXQgc3BlY2lmaWNhdGlvbiBmb3IgJycgaXMgbm90IGEgbWFwdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yICcnIGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcmllcyBlbnRyeWxpYnJhcmllc0RhdGFsaWJyYXJpZXMgZW50cnkgZm9yICdsaWJyYXJ5IGRhdGEgZm9yICcnIGluIHRhcmdldCAnY2hlY2tBbmRSZXNvbHZldXJpIHZhbHVlICcnIGlzIG5vdCBhIHN0cmluZyhmcm9tIGxpYnJhcnkgJycpdXJpIHNjaGVtZSBpbiAnJyBpcyBub3Qgc3VwcG9ydGVkLnBhdGNoZXMgZW50cnkgZm9yICcnIGlzIG5vdCBhIGxpc3Qgb3IgYSBzdHJpbmdzdXBwb3J0ZWQic3VwcG9ydGVkIiBlbnRyeTogZXhwZWN0ZWQgYSAnYm9vbCcgYnV0IGdvdCBhICdfcmVwb3J0RXJyb3JvdXRwdXRVcml0b0pzb25NYXBwYXRoRm9yTGlicmFyeUluZm9fZmVfYW5hbHl6ZXJfc2hhcmVkLnNjYW5uZXIudG9rZW5JREVOVElGSUVSX1RPS0VOTEFaWV9USFJFU0hPTER2YWx1ZU9yTGF6eVN1YnN0cmluZ2Nhbm9uaWNhbGl6ZXJmcm9tU3Vic3RyaW5nZnJvbVV0ZjhCeXRlc2Jvb2xWYWx1ZWlzSWRlbnRpZmllcmNhbm9uaWNhbGl6ZWRTdHJpbmdkZWNvZGVVdGY4Y29weWNvcHlDb21tZW50c192YWx1ZT1zZXROZXh0V2l0aG91dFNldHRpbmdQcmV2aW91c1NJTkdMRV9MSU5FX0NPTU1FTlRfTGF6eVN1YnN0cmluZ19Db21wYWN0TGF6eVN1YnN0cmluZ19GdWxsTGF6eVN1YnN0cmluZ2lzVXNlckRlZmluYWJsZU9wZXJhdG9yaXNVbmFyeU9wZXJhdG9yaXNCaW5hcnlPcGVyYXRvcj4+PmlzVGVybmFyeU9wZXJhdG9yaXNNaW51c09wZXJhdG9yYmxhY2tsaXN0ZWRDb3JlQ2xhc3Nlc1R5cGVMYWJlbGVybmFtZU1hcHByaW50TnVsbGFiaWxpdHludWxsLXR5cGVudWxsLWNvbnN0YW50b3JpZ2luTWVzc2FnZW5hbWVGb3JFbnRpdHlub2RlTmFtZWxhYmVsc0Zvck5hbWVlbnRpdHlGb3JOYW1lYWRkTnVsbGFiaWxpdHlib3R0b20tdHlwZSBGdW5jdGlvbiBleHRlbmRzIHByaW50aW5nIHVuZXZhbHVhdGVkIGNvbnN0YW50c0xhYmVsZWROb2RldHlwZUxhYmVsZXIKIC0gdW5rbm93blVyaXVua25vd25mYXN0YS5ib2R5X2J1aWxkZXJBc3NlcnRCbG9ja0tpbmRGb3JtYWxQYXJhbWV0ZXJLaW5kSWRlbnRpZmllckNvbnRleHRNZW1iZXJLaW5kbGVuZ3RoRm9yVG9rZW5sZW5ndGhPZlNwYW5vcHRpb25hbFF1b3RlYW5hbHl6ZVF1b3RldW5lc2NhcGV1bmVzY2FwZUZpcnN0U3RyaW5nUGFydHVuZXNjYXBlTGFzdFN0cmluZ1BhcnR1bmVzY2FwZVN0cmluZ0NvbnN0YW50Q29udGV4dGZhc3RhSWRlbnRpZmllckluaXRpYWxpemVkSWRlbnRpZmllclF1YWxpZmllZE5hbWVkZXByZWNhdGVkX2V4dHJhY3RUb2tlbmZsYXR0ZW5OYW1lTW9kaWZpZXJjb25zdE1hc2tjb3ZhcmlhbnRNYXNrZmluYWxNYXNrbGF0ZU1hc2tyZXF1aXJlZE1hc2ttaW51c05hbWVwbHVzTmFtZUZpeGVkTnVsbGFibGVMaXN0R3Jvd2FibGVMaXN0SnVtcFRhcmdldEtpbmROdWxsVmFsdWVQYXJzZXJSZWNvdmVyeVNjb3BlTGlzdGVuZXJvZmZzZXRGb3JUb2tlblR5cGVJbmZlcnJlclR5cGVQcm9tb3RlclR5cGVQcm9tb3Rpb25GYWN0VHlwZVByb21vdGlvblNjb3BlQ29uc3RuZXNzRXhwcmVzc2lvbkdlbmVyYXRvckhlbHBlckZvcmVzdEltcGxpY2l0VHlwZUFyZ3VtZW50Y2FsY3VsYXRlQm91bmRzQm9keUJ1aWxkZXJmb3Jlc3RkZWNsYXJhdGlvbkJ1aWxkZXJpc0RlY2xhcmF0aW9uSW5zdGFuY2VNZW1iZXJlbmNsb3NpbmdTY29wZXN0cmluZ0V4cGVjdGVkQWZ0ZXJOYXRpdmVpZ25vcmVNYWluSW5HZXRNYWluQ2xvc3VyZXR5cGVJbmZlcnJlcnR5cGVQcm9tb3Rlcm5lZWRzSW1wbGljaXRTdXBlckluaXRpYWxpemVyZm9ybWFsUGFyYW1ldGVyU2NvcGVpbkluaXRpYWxpemVyaW5GaWVsZEluaXRpYWxpemVyaW5MYXRlRmllbGRJbml0aWFsaXplcl9sb2NhbEluaXRpYWxpemVyU3RhdGVwcmVwZW5kX2luaXRpYWxpemVyc2luQ2F0Y2hDbGF1c2VpbkNhdGNoQmxvY2tmdW5jdGlvbk5lc3RpbmdMZXZlbHRyYW5zZm9ybUNvbGxlY3Rpb25zdHJhbnNmb3JtU2V0TGl0ZXJhbHNwcm9ibGVtSW5Mb29wT3JTd2l0Y2hzd2l0Y2hTY29wZWNvbnN0YW50Q29udGV4dENvbnN0YW50Q29udGV4dC5ub25lY3VycmVudExvY2FsVmFyaWFibGVUeXBlY3VycmVudExvY2FsVmFyaWFibGVNb2RpZmllcnNyZWRpcmVjdGluZ0ZhY3RvcnlJbnZvY2F0aW9uc3ZhcmlhYmxlc1dpdGhNZXRhZGF0YW11bHRpVmFyaWFibGVzV2l0aE1ldGFkYXRhZXh0ZW5zaW9uVGhpc2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJzdHJ5U3RhdGVtZW50SW5mb1N0YWNrYXNzaWduZWRWYXJpYWJsZXNiYWNrZW5kVGFyZ2V0X2J1aWx0aW51aXdpdGhQYXJlbnRzZm9yRmllbGRmb3JPdXRsaW5lRXhwcmVzc2lvbnR5cGVJbmZlcmVuY2VFbmdpbmVjcmVhdGVMb2NhbFR5cGVJbmZlcnJlcmluTGF0ZUxvY2FsSW5pdGlhbGl6ZXJpbkNvbnN0cnVjdG9yaXNEZWNsYXJhdGlvbkluc3RhbmNlQ29udGV4dHR5cGVTY2hlbWFFbnZpcm9ubWVudGltcGxpY2l0VHlwZUFyZ3VtZW50X2VudGVyTG9jYWxTdGF0ZV9leGl0TG9jYWxTdGF0ZXRhaWxyZWdpc3RlclZhcmlhYmxlQXNzaWdubWVudG11dGF0ZVZhcmlhYmxlcHVzaHBvcEZvclZhbHVldG9WYWx1ZXBvcHBvcEZvckVmZmVjdHRvRWZmZWN0cG9wRm9yVmFsdWVJZk5vdE51bGxidWlsZFNpbXBsZVJlYWRidWlsZFByb2JsZW1idWlsZEZvckVmZmVjdHBvcExpc3RGb3JWYWx1ZXBvcExpc3RGb3JFZmZlY3Rwb3BCbG9ja29wZW5CcmFjZWNsb3NlQnJhY2VjcmVhdGVCbG9ja3BvcFN0YXRlbWVudElmTm90TnVsbHBvcFN0YXRlbWVudHdyYXBWYXJpYWJsZXNlbnRlclN3aXRjaFNjb3BlTnVsbFZhbHVlLlN3aXRjaFNjb3BlZXhpdFN3aXRjaFNjb3Blb3V0ZXJTd2l0Y2hTY29wZXVuY2xhaW1lZEZvcndhcmREZWNsYXJhdGlvbnN1c2Vyc3dyYXBJblByb2JsZW1TdGF0ZW1lbnRmb3J3YXJkRGVjbGFyZUxhYmVsd3JhcFZhcmlhYmxlSW5pdGlhbGl6ZXJJbkVycm9yd3JhcEluTG9jYXRlZFByb2JsZW1sb29rdXBMb2NhbE1lbWJlcmNyZWF0ZUp1bXBUYXJnZXRpbmZlckFubm90YXRpb25zaW5mZXJNZXRhZGF0YXRyYW5zZm9ybUxpc3RQb3N0SW5mZXJlbmNlYmVnaW5NZXRhZGF0YWRlYnVnRXZlbnRDb25zdGFudENvbnRleHQuaW5mZXJyZWRlbmRNZXRhZGF0YWJlZ2luVG9rZW5wZXJpb2RCZWZvcmVOYW1lZW5kVG9rZW5NZXRhZGF0YXB1c2hRdWFsaWZpZWRSZWZlcmVuY2VfYnVpbGRDb25zdHJ1Y3RvclJlZmVyZW5jZUludm9jYXRpb25Db25zdG5lc3MuZXhwbGljaXRDb25zdHBlcmlvZGdlbmVyYXRvcmJ1aWxkUHJvcGVydHlBY2Nlc3NzYXZlZENvbnN0YW50Q29udGV4dHdyYXBJblByb2JsZW1lbmRNZXRhZGF0YVN0YXJNZXRhZGF0YVN0YXJOdWxsVmFsdWUuTWV0YWRhdGFlbmRUb3BMZXZlbEZpZWxkc3N0YXRpY1Rva2VuY292YXJpYW50VG9rZW5sYXRlVG9rZW52YXJGaW5hbE9yQ29uc3RUb3BMZXZlbEZpZWxkc3JlcG9ydE5vbk51bGxhYmxlTW9kaWZpZXJFcnJvcmVuZENsYXNzRmllbGRzRmllbGRzZmluaXNoRmllbGRzZmllbGRCdWlsZGVyaGFzQm9keUJlZW5CdWlsdGluZmVyRmllbGRJbml0aWFsaXplcmJ1aWx0VHlwZXdyYXBwZXJ0cmFuc2Zvcm1Qb3N0SW5mZXJlbmNlYnVpbGRCb2R5YnVpbGREYXJ0VHlwZXJlc29sdmVSZWRpcmVjdGluZ0ZhY3RvcnlUYXJnZXRzZmluaXNoVmFyaWFibGVNZXRhZGF0YWVuZE1lbWJlcmVuZEJsb2NrRnVuY3Rpb25Cb2R5QmxvY2tGdW5jdGlvbkJvZHlOdWxsVmFsdWUuQmxvY2tleGl0TG9jYWxTY29wZXByZXBhcmVJbml0aWFsaXplcnNjb21wdXRlRm9ybWFsUGFyYW1ldGVySW5pdGlhbGl6ZXJTY29wZWZvcm1hbHNpc0luaXRpYWxpemluZ0Zvcm1hbGJ1aWxkSW52YWxpZEluaXRpYWxpemVyYnVpbGRGaWVsZEluaXRpYWxpemVyYWRkSW5pdGlhbGl6ZXJoYW5kbGVOb0luaXRpYWxpemVyc05vSW5pdGlhbGl6ZXJzYmVnaW5Jbml0aWFsaXplcnNlbmRJbml0aWFsaXplcnNJbml0aWFsaXplcnNiZWdpbkluaXRpYWxpemVyZW5kSW5pdGlhbGl6ZXJidWlsZFN1cGVySW5pdGlhbGl6ZXJfY29tcHV0ZVJldHVyblR5cGVDb250ZXh0YWN0dWFsUHJvY2VkdXJlZmluaXNoRnVuY3Rpb25hc3luY01vZGlmaWVyZmluaXNoZWRmbG93QW5hbHlzaXNpc09wdGlvbmFsaW5pdGlhbGl6ZXJXYXNJbmZlcnJlZGNyZWF0ZU51bGxMaXRlcmFsb3JpZ2luUGFyYW1ldGVyZ2V0Rm9ybWFsUGFyYW1ldGVyaW5mZXJQYXJhbWV0ZXJJbml0aWFsaXplcmhhc0RlY2xhcmVkSW5pdGlhbGl6ZXJleHRlbnNpb25UZWFyT2ZmUGFyYW1ldGVyZ2V0RXh0ZW5zaW9uVGVhck9mZlBhcmFtZXRlcnRlYXJPZmZJbml0aWFsaXplcmZpbmlzaENvbnN0cnVjdG9yaW5mZXJGdW5jdGlvbkJvZHljaGVja0FzeW5jUmV0dXJuVHlwZWNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnRwcm9ibGVtZnV0dXJlQm90dG9tVHlwZWZ1dHVyZU9mQm90dG9tc3RyZWFtQm90dG9tVHlwZXN0cmVhbU9mQm90dG9taXRlcmFibGVCb3R0b21UeXBlaXRlcmFibGVPZkJvdHRvbWFzeW5jLCBhc3luYyosIHN5bmMsIG9yIHN5bmMqZW5zdXJlTGlicmFyeUxvYWRlZGhhc0JlZW5JbmZlcnJlZGluaXRpYWxUYXJnZXRyZXBsYWNlbWVudE5vZGVyZWRpcmVjdGlvblRhcmdldHJlc29sdmVkVGFyZ2V0Y29uc3RydWN0b3JOYW1lRm9yRGlhZ25vc3RpY3NldmFsdWF0ZUFyZ3VtZW50c0JlZm9yZWNyZWF0ZUFyZ3VtZW50c2J1aWxkQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcnJlZGlyZWN0aW5nRmFjdG9yeUJvZHllcnJvck5hbWVzdXBwcmVzc01lc3NhZ2VidWlsZFN0YXRpY0ludm9jYXRpb25jb25zdG5lc3NDb25zdG5lc3MuZXhwbGljaXROZXdmaW5pc2hNZXRhZGF0YXRlbXBvcmFyeVBhcmVudHBhcnNlU2luZ2xlRXhwcmVzc2lvbnR5cGVQYXJhbWV0ZXJCdWlsZGVyc2VudGVyRnVuY3Rpb25UeXBlU2NvcGVlbnRlckxvY2FsU2NvcGVjb21wdXRlRm9ybWFsUGFyYW1ldGVyU2NvcGVwYXJzZUV4cHJlc3Npb25zeW50aGV0aWNQcmV2aW91c1Rva2VuZW9mZmFrZVJldHVybnBhcnNlSW5pdGlhbGl6ZXJzY2hlY2tFbXB0eXBhcnNlRmllbGRJbml0aWFsaXplcnBhcnNlQW5ub3RhdGlvbnBhcnNlTWV0YWRhdGFhY3R1YWxDb25zdHJ1Y3RvcmluZmVySW5pdGlhbGl6ZXJzdXBlclRhcmdldGNyZWF0ZUFyZ3VtZW50c0VtcHR5Y2hlY2tBcmd1bWVudHNGb3JGdW5jdGlvbmZ1bGxOYW1lRm9yRXJyb3JzaGFuZGxlRXhwcmVzc2lvblN0YXRlbWVudGVuZEFyZ3VtZW50c2ZpcnN0TmFtZWRBcmd1bWVudEluZGV4aGFuZGxlUGFyZW50aGVzaXplZENvbmRpdGlvblBhcmVudGhlc2l6ZWRDb25kaXRpb25oYW5kbGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcmVudGhlc2l6ZWRFeHByZXNzaW9uaXNQYXJlbnRoZXNpemVkZW5kR3JvdXBoYW5kbGVTZW5kY2hlY2tTdGF0ZU51bGxWYWx1ZS5Bcmd1bWVudHNOdWxsVmFsdWUuVHlwZUFyZ3VtZW50c1NlbmRhcmd1bWVudHNUeXBlQXJndW1lbnRzYXJndW1lbnRzU2V0VHlwZUFyZ3VtZW50c2J1aWxkRGFydFR5cGVBcmd1bWVudHNmaW5pc2hTZW5kZG9JbnZvY2F0aW9uY3JlYXRlRXhwcmVzc2lvbkludm9jYXRpb25iZWdpbkNhc2NhZGVfY3JlYXRlUmVhZE9ubHlWYXJpYWJsZUFjY2Vzc2lzTnVsbEF3YXJlPy4ucmVwb3J0TWlzc2luZ05vbk51bGxhYmxlU3VwcG9ydGNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25Gb3JWYWx1ZWVuZENhc2NhZGVjYXNjYWRlUmVjZWl2ZXJhZGRDYXNjYWRlRXhwcmVzc2lvbmJlZ2luQ2FzZUV4cHJlc3Npb25jYXNlS2V5d29yZGVuZENhc2VFeHByZXNzaW9uYmVnaW5CaW5hcnlFeHByZXNzaW9uZW50ZXJMb2dpY2FsRXhwcmVzc2lvbnN0cmluZ1ZhbHVlZW5kQmluYXJ5RXhwcmVzc2lvbkJpbmFyeUV4cHJlc3Npb25kb0RvdE9yQ2FzY2FkZUV4cHJlc3Npb25kb0xvZ2ljYWxFeHByZXNzaW9uZG9JZk51bGw/LmRvSWZOb3ROdWxsZG9CaW5hcnlFeHByZXNzaW9uaXNOb3RidWlsZEVxdWFsc09wZXJhdGlvbmNyZWF0ZUVxdWFsc2J1aWxkQmluYXJ5T3BlcmF0aW9uY3JlYXRlQmluYXJ5bG9naWNhbEV4cHJlc3Npb25jcmVhdGVMb2dpY2FsRXhwcmVzc2lvbmV4aXRMb2dpY2FsRXhwcmVzc2lvbnNlbmRhcmVBcmd1bWVudHNDb21wYXRpYmxldGhyb3dOb1N1Y2hNZXRob2RFcnJvcnBlcmlvZEluZGV4a2VybmVsTmFtZWNvbnRleHRNZXNzYWdld2FyblVucmVzb2x2ZWRHZXRyZXBvcnRXYXJuaW5nd2FyblVucmVzb2x2ZWRTZXR3YXJuVW5yZXNvbHZlZE1ldGhvZGFkZFByb2JsZW1FcnJvcklmQ29uc3RwbGFpbk5hbWVkb3RJbmRleHdhcm5UeXBlQXJndW1lbnRzTWlzbWF0Y2hsb29rdXBJbnN0YW5jZU1lbWJlcmhhbmRsZUlkZW50aWZpZXJkZXByZWNhdGVkZGVwcmVjYXRlZF9pc1Njb3BlUmVmZXJlbmNlc2NvcGVMb29rdXBpbkRlY2xhcmF0aW9udG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uZmllbGREZWNsYXJhdGlvbkNvbnN0YW50Q29udGV4dC5yZXF1aXJlZGFsbG93ZWRJbkNvbnN0YW50RXhwcmVzc2lvbmNyZWF0ZVZhcmlhYmxlR2V0Zm9yTnVsbEd1YXJkZWRBY2Nlc3NmYWN0Z2V0RmFjdEZvckFjY2Vzc2N1cnJlbnRTY29wZWlzUXVhbGlmaWVkb3JpZ2luZmluZFN0YXRpY0J1aWxkZXJfZ2V0TWFpbkNsb3N1cmVpc1R5cGVEZWNsYXJhdGlvbmFjY2Vzc0Vycm9yaXNMb2NhbHZhcmlhYmxlQnVpbGRlcmlzQ2xhc3NJbnN0YW5jZU1lbWJlcmlzRXh0ZW5zaW9uSW5zdGFuY2VNZW1iZXJleHRlbnNpb25CdWlsZGVyc2V0dGVyQnVpbGRlcl9nZXRDb3JyZXNwb25kaW5nU2V0dGVyQnVpbGRlcmdldHRlckJ1aWxkZXJpc1JlZ3VsYXJNZXRob2RtZW1iZXJCdWlsZGVyaGFzUHJvYmxlbXJlYWRUYXJnZXRsb29rdXBTZXR0ZXJoYW5kbGVRdWFsaWZpZWRRdWFsaWZpZWRxdWFsaWZpZXJ3aXRoUXVhbGlmaWVyYmVnaW5MaXRlcmFsU3RyaW5naGFuZGxlU3RyaW5nUGFydFN0cmluZ1BhcnRlbmRMaXRlcmFsU3RyaW5naW50ZXJwb2xhdGlvbkNvdW50Y3JlYXRlU3RyaW5nTGl0ZXJhbHF1b3RlY3JlYXRlU3RyaW5nQ29uY2F0ZW5hdGlvbmhhbmRsZU5hdGl2ZUNsYXVzZW5hdGl2ZVRva2VuaGFzTmFtZU5hdGl2ZUNsYXVzZWhhbmRsZVNjcmlwdFNjcmlwdGhhbmRsZVN0cmluZ0p1eHRhcG9zaXRpb25saXRlcmFsQ291bnRTdHJpbmdKdXh0YXBvc2l0aW9uaGFuZGxlTGl0ZXJhbEludExpdGVyYWxJbnRjcmVhdGVJbnRMaXRlcmFsTGFyZ2VjcmVhdGVJbnRMaXRlcmFsaGFuZGxlRW1wdHlGdW5jdGlvbkJvZHlzZW1pY29sb25FeHByZXNzaW9uRnVuY3Rpb25Cb2R5aGFuZGxlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keWFycm93VG9rZW5lbmRSZXR1cm5TdGF0ZW1lbnRoYXNFeHByZXNzaW9uYnVpbGRQcm9ibGVtU3RhdGVtZW50Y3JlYXRlUmV0dXJuU3RhdGVtZW50aXNBcnJvd2JlZ2luVGhlblN0YXRlbWVudGVudGVyVGhlbkZvclR5cGVQcm9tb3Rpb25lbmRUaGVuU3RhdGVtZW50ZW50ZXJFbHNlZW5kSWZTdGF0ZW1lbnRpZlRva2VuZWxzZVRva2VuZWxzZVBhcnR0aGVuUGFydGV4aXRDb25kaXRpb25hbGNyZWF0ZUlmU3RhdGVtZW50ZW5kVmFyaWFibGVJbml0aWFsaXplcmFzc2lnbm1lbnRPcGVyYXRvclZhcmlhYmxlSW5pdGlhbGl6ZXJwdXNoTmV3TG9jYWxWYXJpYWJsZWVxdWFsc1Rva2VuaGFuZGxlTm9WYXJpYWJsZUluaXRpYWxpemVyTm9WYXJpYWJsZUluaXRpYWxpemVyZm9yU3ludGhldGljVG9rZW5jaGVja0JvdW5kc0luVmFyaWFibGVEZWNsYXJhdGlvbmJlZ2luRmllbGRJbml0aWFsaXplcmVuZEZpZWxkSW5pdGlhbGl6ZXJoYW5kbGVOb0ZpZWxkSW5pdGlhbGl6ZXJOb0ZpZWxkSW5pdGlhbGl6ZXJOdWxsVmFsdWUuRmllbGRJbml0aWFsaXplcmVuZEluaXRpYWxpemVkSWRlbnRpZmllcm5hbWVUb2tlbmJlZ2luVmFyaWFibGVzRGVjbGFyYXRpb25tb2RpZmllcnNOdWxsVmFsdWUuVHlwZWVuZFZhcmlhYmxlc0RlY2xhcmF0aW9uVmFyaWFibGVzRGVjbGFyYXRpb252YXJpYWJsZXNEZWNsYXJhdGlvbmJlZ2luQmxvY2tibG9ja0tpbmR0cnkgc3RhdGVtZW50YmVnaW5Ob2RlZmluYWxseSBjbGF1c2VkZWZlck5vZGVlbmRCbG9ja2VuZE5vZGVoYW5kbGVJbnZhbGlkVG9wTGV2ZWxCbG9ja2hhbmRsZUFzc2lnbm1lbnRFeHByZXNzaW9uQXNzaWdubWVudEV4cHJlc3Npb25lbnRlckxvb3BlbnRlckJyZWFrVGFyZ2V0YnJlYWtUYXJnZXRlbnRlckNvbnRpbnVlVGFyZ2V0Y29udGludWVUYXJnZXRleGl0TG9vcE9yU3dpdGNoX2J1aWxkRm9yTG9vcFZhcmlhYmxlRGVjbGFyYXRpb25zdmFyaWFibGVPckV4cHJlc3Npb25pc1ZhcmlhYmxlc0RlY2xhcmF0aW9udmFyaWFibGVzRGVjbGFyYXRpb25FeHRyYWN0RGVjbGFyYXRpb25zaGFuZGxlRm9ySW5pdGlhbGl6ZXJFbXB0eVN0YXRlbWVudEZvckluaXRpYWxpemVyRW1wdHlTdGF0ZW1lbnROdWxsVmFsdWUuRXhwcmVzc2lvbmhhbmRsZUZvckluaXRpYWxpemVyRXhwcmVzc2lvblN0YXRlbWVudGZvckluRm9ySW5pdGlhbGl6ZXJFeHByZXNzaW9uU3RhdGVtZW50aGFuZGxlRm9ySW5pdGlhbGl6ZXJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25Gb3JJbml0aWFsaXplckxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbmhhbmRsZUZvckxvb3BQYXJ0c2ZvcktleXdvcmRsZWZ0UGFyZW5sZWZ0U2VwYXJhdG9ydXBkYXRlRXhwcmVzc2lvbkNvdW50ZW5kRm9yQ29udHJvbEZsb3dGb3JDb250cm9sRmxvd2ZvclRva2VuY29uZGl0aW9uU3RhdGVtZW50ZGlzY2FyZE5vZGVoYW5kbGVSZWNvdmVyYWJsZUVycm9yYXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mb2NyZWF0ZUZvck1hcEVudHJ5c3RvcmVJbmZvY3JlYXRlRm9yRWxlbWVudGVuZEZvclN0YXRlbWVudGV4aXRDb250aW51ZVRhcmdldGV4aXRCcmVha1RhcmdldGNvbnRpbnVlU3RhdGVtZW50c2hhc1VzZXJzY3JlYXRlTGFiZWxlZFN0YXRlbWVudHJlc29sdmVDb250aW51ZXNmb3JTdGF0ZW1lbnRjcmVhdGVGb3JTdGF0ZW1lbnRjb250aW51ZVN0YXRlbWVudHRhcmdldFN0YXRlbWVudHJlc29sdmVCcmVha3NlbmRBd2FpdEV4cHJlc3Npb25rZXl3b3JkY2hhckNvdW50Y3JlYXRlQXdhaXRFeHByZXNzaW9uZW5kSW52YWxpZEF3YWl0RXhwcmVzc2lvbmVycm9yQ29kZWhhbmRsZUFzeW5jTW9kaWZpZXJhc3luY1Rva2Vuc3RhclRva2VuQXN5bmNNb2RpZmllcmhhbmRsZUxpdGVyYWxMaXN0bGVmdEJyYWNrZXRjb25zdEtleXdvcmRyaWdodEJyYWNrZXRMaXRlcmFsTGlzdGNyZWF0ZUxpc3RMaXRlcmFsY2hlY2tCb3VuZHNJbkxpc3RMaXRlcmFsYnVpbGRMaXRlcmFsU2V0bGVmdEJyYWNlc2V0T3JNYXBFbnRyaWVzY3JlYXRlU2V0TGl0ZXJhbGNoZWNrQm91bmRzSW5TZXRMaXRlcmFsaGFuZGxlTGl0ZXJhbFNldE9yTWFwcmlnaHRCcmFjZWhhc1NldEVudHJ5TGl0ZXJhbFNldE9yTWFwdHlwZUFyZ0NvdW50bWFwRW50cmllc3JlYXNzaWduSW5mb2J1aWxkTGl0ZXJhbE1hcGhhbmRsZUxpdGVyYWxCb29sTGl0ZXJhbEJvb2xjcmVhdGVCb29sTGl0ZXJhbGhhbmRsZUxpdGVyYWxEb3VibGVMaXRlcmFsRG91YmxlY3JlYXRlRG91YmxlTGl0ZXJhbGhhbmRsZUxpdGVyYWxOdWxsTGl0ZXJhbE51bGxjcmVhdGVNYXBMaXRlcmFsY2hlY2tCb3VuZHNJbk1hcExpdGVyYWxoYW5kbGVMaXRlcmFsTWFwRW50cnlMaXRlcmFsTWFwRW50cnljcmVhdGVNYXBFbnRyeXN5bWJvbFBhcnRUb1N0cmluZ2VuZExpdGVyYWxTeW1ib2xoYXNoVG9rZW5pZGVudGlmaWVyQ291bnRMaXRlcmFsU3ltYm9sY3JlYXRlU3ltYm9sTGl0ZXJhbGhhbmRsZU5vbk51bGxBc3NlcnRFeHByZXNzaW9uYmFuZ3JlcG9ydE5vbk51bGxBc3NlcnRFeHByZXNzaW9uTm90RW5hYmxlZGNyZWF0ZU51bGxDaGVja2hhbmRsZVR5cGVxdWVzdGlvbk1hcmtyZXBvcnRFcnJvcklmTnVsbGFibGVUeXBlaXNNYXJrZWRBc051bGxhYmxlcXVhbGlmaWVkc3VmZml4cXVhbGlmaWVkTG9va3VwZGlzcGxheU5hbWVudWxsYWJsZUJ1aWxkZXJJZlRydWVidWlsZFR5cGVXaXRoUmVzb2x2ZWRBcmd1bWVudHNiZWdpbkZ1bmN0aW9uVHlwZXR5cGVWYXJpYWJsZXNmdW5jdGlvbi10eXBlIHNjb3BlaXNNb2RpZmlhYmxlcmVwb3J0RHVwbGljYXRlZERlY2xhcmF0aW9uZW5kRnVuY3Rpb25UeXBlZnVuY3Rpb25Ub2tlbnRvRnVuY3Rpb25UeXBlaGFuZGxlVm9pZEtleXdvcmRWb2lkS2V5d29yZFN5bnRhY3RpY051bGxhYmlsaXR5Lm51bGxhYmxlaGFuZGxlQXNPcGVyYXRvckFzT3BlcmF0b3JjaGVja0JvdW5kc0luVHlwZWNyZWF0ZUFzRXhwcmVzc2lvbmZvck5vbk51bGxhYmxlQnlEZWZhdWx0aGFuZGxlSXNPcGVyYXRvcmlzT3BlcmF0b3Jub3RJc09wZXJhdG9yaXNJbnZlcnRlZGlzRXhwcmVzc2lvbmNyZWF0ZUlzRXhwcmVzc2lvbm5vdEZpbGVPZmZzZXRoYW5kbGVJc0NoZWNrYmVnaW5Db25kaXRpb25hbEV4cHJlc3Npb25xdWVzdGlvbmVudGVyVGhlbmhhbmRsZUNvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbG9uZW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uZWxzZUV4cHJlc3Npb250aGVuRXhwcmVzc2lvbmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbmhhbmRsZVRocm93RXhwcmVzc2lvbnRocm93VG9rZW5UaHJvd0V4cHJlc3Npb25jcmVhdGVUaHJvd2JlZ2luRm9ybWFsUGFyYW1ldGVycmVxdWlyZWRUb2tlbmVuZEZvcm1hbFBhcmFtZXRlcnRoaXNLZXl3b3JkcGVyaW9kQWZ0ZXJUaGlzaW5pdGlhbGl6ZXJTdGFydGluaXRpYWxpemVyRW5kbWVtYmVyS2luZEZvcm1hbFBhcmFtZXRlcm5hbWVOb2RlTWVtYmVyS2luZC5HZW5lcmFsaXplZEZ1bmN0aW9uVHlwZWdldEZvcm1hbEZvcm1hbFBhcmFtZXRlcktpbmQubWFuZGF0b3J5ZW5kT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzT3B0aW9uYWxGb3JtYWxQYXJhbWV0ZXJzRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZC5vcHRpb25hbFBvc2l0aW9uYWxiZWdpbkZ1bmN0aW9uVHlwZWRGb3JtYWxQYXJhbWV0ZXJlbmRGdW5jdGlvblR5cGVkRm9ybWFsUGFyYW1ldGVyRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlcmJlZ2luRm9ybWFsUGFyYW1ldGVyRGVmYXVsdFZhbHVlRXhwcmVzc2lvbmVuZEZvcm1hbFBhcmFtZXRlckRlZmF1bHRWYWx1ZUV4cHJlc3Npb25Gb3JtYWxQYXJhbWV0ZXJEZWZhdWx0VmFsdWVFeHByZXNzaW9uZGVmYXVsdFZhbHVlRXhwcmVzc2lvbmhhbmRsZVZhbHVlZEZvcm1hbFBhcmFtZXRlclZhbHVlZEZvcm1hbFBhcmFtZXRlcmhhbmRsZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZUZvcm1hbFBhcmFtZXRlcldpdGhvdXRWYWx1ZWJlZ2luRm9ybWFsUGFyYW1ldGVyc2VuZEZvcm1hbFBhcmFtZXRlcnNGb3JtYWxQYXJhbWV0ZXJzb3B0aW9uYWxzb3B0aW9uYWxzQ291bnRwb3BQYWRkZWRiZWdpbkNhdGNoQ2xhdXNlZW5kQ2F0Y2hDbGF1c2VDYXRjaENsYXVzZWhhbmRsZUNhdGNoQmxvY2tvbktleXdvcmRjYXRjaEtleXdvcmRDYXRjaEJsb2NrY2F0Y2hQYXJhbWV0ZXJzcG9wSWZOb3ROdWxsZXhjZXB0aW9uVHlwZWNvbXBpbGVUaW1lRXJyb3JzY3JlYXRlQ2F0Y2hiZWdpblRyeVN0YXRlbWVudGVuZFRyeVN0YXRlbWVudGNhdGNoQ291bnR0cnlLZXl3b3JkZmluYWxseUtleXdvcmRjYXRjaEJsb2Nrc2NhdGNoQmxvY2tzQW5kRXJyb3JzY3JlYXRlVHJ5U3RhdGVtZW50aGFuZGxlSW5kZXhlZEV4cHJlc3Npb25vcGVuU3F1YXJlQnJhY2tldGNsb3NlU3F1YXJlQnJhY2tldEluZGV4ZWRFeHByZXNzaW9uPy5bYnVpbGRJbmRleGVkQWNjZXNzaGFuZGxlVW5hcnlQcmVmaXhFeHByZXNzaW9uVW5hcnlQcmVmaXhFeHByZXNzaW9uY3JlYXRlTm90YnVpbGRVbmFyeU9wZXJhdGlvbmNyZWF0ZVVuYXJ5aW5jcmVtZW50T3BlcmF0b3IrK2hhbmRsZVVuYXJ5UHJlZml4QXNzaWdubWVudEV4cHJlc3Npb25VbmFyeVByZWZpeEFzc2lnbm1lbnRFeHByZXNzaW9uYnVpbGRQcmVmaXhJbmNyZW1lbnRoYW5kbGVVbmFyeVBvc3RmaXhBc3NpZ25tZW50RXhwcmVzc2lvblVuYXJ5UG9zdGZpeEFzc2lnbm1lbnRFeHByZXNzaW9uZW5kQ29uc3RydWN0b3JSZWZlcmVuY2VDb25zdHJ1Y3RvclJlZmVyZW5jZWNoZWNrVmFsdWVOdWxsVmFsdWUuSWRlbnRpZmllckNvbnN0bmVzcy5pbXBsaWNpdGNoYXJMZW5ndGhhcmdNZXNzYWdlY2hlY2tCb3VuZHNJbkNvbnN0cnVjdG9ySW52b2NhdGlvbmNoZWNrQm91bmRzSW5GYWN0b3J5SW52b2NhdGlvbmJ1aWxkRXh0ZW5zaW9uTWV0aG9kSW52b2NhdGlvbmlzVGVhck9mZmFyZ3VtZW50c1Bvc2l0aW9uYWxhcmd1bWVudHNOYW1lZHBhcmFtZXRlck5hbWVzYXJndW1lbnROYW1lc2NoZWNrQXJndW1lbnRzRm9yVHlwZWJlZ2luTmV3RXhwcmVzc2lvbk5ldyBleHByZXNzaW9uYmVnaW5Db25zdEV4cHJlc3Npb25iZWdpbkNvbnN0TGl0ZXJhbGJlZ2luSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25lbmRDb25zdExpdGVyYWxlbmROZXdFeHByZXNzaW9uTmV3RXhwcmVzc2lvbm5hbWVMYXN0SWRlbnRpZmllcm5hbWVMYXN0VG9rZW5pbnZva2VDb25zdHJ1Y3RvcnR5cGVOYW1lZW5kSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25JbXBsaWNpdENyZWF0aW9uRXhwcmVzc2lvbmJ1aWxkQ29uc3RydWN0b3JJbnZvY2F0aW9uYWxpYXNCdWlsZGVydW5hbGlhc0RlY2xhcmF0aW9uZmluZENvbnN0cnVjdG9yT3JGYWN0b3J5ZW5kQ29uc3RFeHByZXNzaW9uYmVnaW5JZkNvbnRyb2xGbG93YmVnaW5UaGVuQ29udHJvbEZsb3doYW5kbGVFbHNlQ29udHJvbEZsb3dlbmRJZkNvbnRyb2xGbG93Y3JlYXRlSWZNYXBFbnRyeWNyZWF0ZUlmRWxlbWVudGVuZElmRWxzZUNvbnRyb2xGbG93ZWxzZUVudHJ5dGhlbkVudHJ5ZWxzZU1hcEVudHJ5dG9NYXBFbnRyeXRoZW5NYXBFbnRyeWhhbmRsZVNwcmVhZEV4cHJlc3Npb25zcHJlYWRUb2tlblNwcmVhZEV4cHJlc3Npb25jcmVhdGVTcHJlYWRFbGVtZW50Li4uP2VuZFR5cGVBcmd1bWVudHNUeXBlQXJndW1lbnRzaGFuZGxlSW52YWxpZFR5cGVBcmd1bWVudHNJbnZhbGlkVHlwZUFyZ3VtZW50c2hhbmRsZVRoaXNFeHByZXNzaW9uaGFuZGxlU3VwZXJFeHByZXNzaW9uU3VwZXJFeHByZXNzaW9uaGFuZGxlTmFtZWRBcmd1bWVudE5hbWVkQXJndW1lbnRlbmRGdW5jdGlvbk5hbWVGdW5jdGlvbk5hbWVpc0xvY2FsRnVuY3Rpb25lbnRlckZ1bmN0aW9uZXhpdEZ1bmN0aW9uTnVsbFZhbHVlLlR5cGVWYXJpYWJsZXNiZWdpbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmJlZ2luTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25uYW1lZCBmdW5jdGlvbmJlZ2luRnVuY3Rpb25FeHByZXNzaW9ucHVzaE5hbWVkRnVuY3Rpb25pc0Z1bmN0aW9uRXhwcmVzc2lvbmhhc0ltcGxpY2l0UmV0dXJuVHlwZWJ1aWxkRnVuY3Rpb25Ob2Rlb2xkSW5pdGlhbGl6ZXJpc0Vycm9uZW91c05vZGVlbmROYW1lZEZ1bmN0aW9uRXhwcmVzc2lvbmVuZExvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbkxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbmVuZEZ1bmN0aW9uRXhwcmVzc2lvbmJlZ2luRG9XaGlsZVN0YXRlbWVudGVuZERvV2hpbGVTdGF0ZW1lbnRkb0tleXdvcmR3aGlsZUtleXdvcmREb1doaWxlU3RhdGVtZW50ZG9TdGF0ZW1lbnRjcmVhdGVEb1N0YXRlbWVudGJlZ2luRm9ySW5FeHByZXNzaW9uZW5kRm9ySW5FeHByZXNzaW9uRm9ySW5FeHByZXNzaW9uaGFuZGxlRm9ySW5Mb29wUGFydHNhd2FpdFRva2VubGVmdFBhcmVudGhlc2lzaW5LZXl3b3JkTnVsbFZhbHVlLkF3YWl0VG9rZW5lbmRGb3JJbkNvbnRyb2xGbG93Rm9ySW5Db250cm9sRmxvd2luVG9rZW5sdmFsdWVfY29tcHV0ZUZvckluRWxlbWVudHNleHByZXNzaW9uUHJvYmxlbWNyZWF0ZUZvckluTWFwRW50cnlzeW50aGV0aWNBc3NpZ25tZW50ZXhwcmVzc2lvbkVmZmVjdHNjcmVhdGVGb3JJbkVsZW1lbnRleHBsaWNpdFZhcmlhYmxlRGVjbGFyYXRpb25zeW50aGV0aWNWYXJpYWJsZURlY2xhcmF0aW9uY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbmJ1aWxkQXNzaWdubWVudHZvaWRDb250ZXh0ZWZmZWN0c2VuZEZvckluRm9ySW5mb3JJblN0YXRlbWVudGhhbmRsZUxhYmVsYmVnaW5MYWJlbGVkU3RhdGVtZW50bGFiZWxDb3VudGNyZWF0ZU5lc3RlZExhYmVsU2NvcGVkZWNsYXJlTGFiZWxlbmRMYWJlbGVkU3RhdGVtZW50ZW5kUmV0aHJvd1N0YXRlbWVudHJldGhyb3dUb2tlblJldGhyb3dTdGF0ZW1lbnRjcmVhdGVSZXRocm93U3RhdGVtZW50aGFuZGxlRmluYWxseUJsb2NrYmVnaW5XaGlsZVN0YXRlbWVudGVuZFdoaWxlU3RhdGVtZW50d2hpbGVTdGF0ZW1lbnRjcmVhdGVXaGlsZVN0YXRlbWVudGhhbmRsZUVtcHR5U3RhdGVtZW50Y3JlYXRlRW1wdHlTdGF0ZW1lbnRiZWdpbkFzc2VydGFzc2VydEtleXdvcmRlbmRBc3NlcnRjb21tYVRva2Vuc2VtaWNvbG9uVG9rZW5jcmVhdGVBc3NlcnRTdGF0ZW1lbnRjb25kaXRpb25Cb3VuZGFyeWNvbmRpdGlvbkxhc3RUb2tlbm5leHRUb2tlbkFzc2VydC5TdGF0ZW1lbnRBc3NlcnQuRXhwcmVzc2lvbkFzc2VydC5Jbml0aWFsaXplcmNyZWF0ZUFzc2VydEluaXRpYWxpemVyZW5kWWllbGRTdGF0ZW1lbnR5aWVsZFRva2VuY3JlYXRlWWllbGRTdGF0ZW1lbnRiZWdpblN3aXRjaEJsb2Nrc3dpdGNoIGJsb2NrYmVnaW5Td2l0Y2hDYXNlZXhwcmVzc2lvbkNvdW50Zmlyc3RUb2tlbmxhYmVsc0FuZEV4cHJlc3Npb25zbGFiZWxJbmRleGV4cHJlc3Npb25JbmRleGxhYmVsT3JFeHByZXNzaW9ubGFiZWxOYW1laGFzTG9jYWxMYWJlbGNsYWltTGFiZWxjcmVhdGVHb3RvVGFyZ2V0TnVsbFZhbHVlLkxhYmVsc3N3aXRjaCBjYXNlZW5kU3dpdGNoQ2FzZWRlZmF1bHRLZXl3b3JkY29sb25BZnRlckRlZmF1bHRzdGF0ZW1lbnRDb3VudGhhc0xhYmVsZW5kU3dpdGNoU3RhdGVtZW50c3dpdGNoS2V5d29yZHN3aXRjaFN0YXRlbWVudGVuZFN3aXRjaEJsb2NrY2FzZUNvdW50U3dpdGNoQmxvY2tsb29rdXBMYWJlbHJlc29sdmVHb3Rvc2xhc3ROb2RlaXNCbG9ja2J1aWxkRmFsbFRocm91Z2hFcnJvcmhhbmRsZUNhc2VNYXRjaENhc2VNYXRjaGhhbmRsZUJyZWFrU3RhdGVtZW50aGFzVGFyZ2V0YnJlYWtLZXl3b3JkaXNCcmVha1RhcmdldGxhYmVsVG9rZW5idWlsZFByb2JsZW1UYXJnZXRPdXRzaWRlTG9jYWxGdW5jdGlvbmNyZWF0ZUJyZWFrU3RhdGVtZW50YWRkQnJlYWtpc0JyZWFraGFuZGxlQ29udGludWVTdGF0ZW1lbnRjb250aW51ZUtleXdvcmRDb250aW51ZVN0YXRlbWVudG5hbWVkVGFyZ2V0aXNHb3RvVGFyZ2V0YWRkR290b2lzQ29udGludWVUYXJnZXRjcmVhdGVDb250aW51ZVN0YXRlbWVudGFkZENvbnRpbnVlYmVnaW5UeXBlVmFyaWFibGVoYW5kbGVUeXBlVmFyaWFibGVzRGVmaW5lZGVuZFR5cGVWYXJpYWJsZWV4dGVuZHNPclN1cGVyVHlwZVZhcmlhYmxlZW5hYmxlVmFyaWFuY2VyZXBvcnRWYXJpYW5jZU1vZGlmaWVyTm90RW5hYmxlZGVuZFR5cGVWYXJpYWJsZXNUeXBlVmFyaWFibGVzY2FsY3VsYXRlZEJvdW5kc2R5bmFtaWNUeXBlYm90dG9tVHlwZW9iamVjdENsYXNzQnVpbGRlcnJlc29sdmVJbnBlbmRpbmdOdWxsYWJpbGl0aWVzaGFuZGxlTm9UeXBlVmFyaWFibGVzTm9UeXBlVmFyaWFibGVzdHlwZVZhcmlhYmxlQnVpbGRlcnNUb0tlcm5lbHR5cGVWYXJpYWJsZUJ1aWxkZXJzaGFuZGxlSW52YWxpZFN0YXRlbWVudHdhc0hhbmRsZWRnZXRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yYnVpbGREdXBsaWNhdGVkSW5pdGlhbGl6ZXJwcmV2aW91c0luaXRpYWxpemVyT2Zmc2V0ZmllbGROYW1lT2Zmc2V0YXNzaWdubWVudE9mZnNldGhhc0luaXRpYWxpemVyZ2V0RHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcmZvcm1hbFR5cGVidWlsZEluaXRpYWxpemVyYnVpbGRSZWRpcmVjdGluZ0luaXRpYWxpemVyY2hlY2tDb25zdHJ1Y3RvckN5Y2xpY2hhbmRsZU9wZXJhdG9yaGFuZGxlU3ltYm9sVm9pZFN5bWJvbFZvaWRoYW5kbGVJbnZhbGlkRnVuY3Rpb25Cb2R5TnVsbFZhbHVlLkZ1bmN0aW9uQm9keXZhbGlkYXRlVHlwZVVzZW5vbkluc3RhbmNlQWNjZXNzSXNFcnJvcmlzVHlwZVZhcmlhYmxldHlwZVBhcmFtZXRlckJ1aWxkZXJudWxsYWJpbGl0eUJ1aWxkZXJpc0lkZW50aWNhbGJ1aWxkTWV0aG9kSW52b2NhdGlvbmlzQ29uc3RhbnRFeHByZXNzaW9uTWV0aG9kIGludm9jYXRpb25pc1RoaXNFeHByZXNzaW9uY3JlYXRlTWV0aG9kSW52b2NhdGlvbmJ1aWxkUHJvYmxlbUVycm9ySWZDb25zdG1ha2VTdGF0aWNHZXR3cmFwSW5EZWZlcnJlZENoZWNrY2hlY2tMaWJyYXJ5SXNMb2FkZWRoYW5kbGVkRXJyb3JzdW5yZXNvbHZlZFR5cGV1bnJlc29sdmVkVHlwZXNvcGVyYXRvcihKdW1wVGFyZ2V0SnVtcFRhcmdldEtpbmQuQnJlYWtKdW1wVGFyZ2V0S2luZC5Db250aW51ZUp1bXBUYXJnZXRLaW5kLkdvdG91c2VyPGp1bXAtdGFyZ2V0PkxhYmVsVGFyZ2V0PGxhYmVsLXRhcmdldD5FbXB0eSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBudWxsU3ludGFjdGljTnVsbGFiaWxpdHkub21pdHRlZGlzTmFtZWRkZWJ1Z05hbWVGb3JtYWxQYXJhbWV0ZXJzKGxhYmVsKEZvckluRWxlbWVudHNub0xvY2F0aW9uaW52YWxpZENvbGxlY3Rpb25FbGVtZW50Y29tYmluZVN0YXRlbWVudHMucmVzdWx0Z2V0Tm9kZU5hbWVhc3luY01hcmtlckZyb21Ub2tlbnNrZXJuZWwuY2xvbmVDbG9uZVZpc2l0b3JOb3RNZW1iZXJzY2xvbmVBbm5vdGF0aW9uc19hY3RpdmVGaWxlVXJpZW5zdXJlTXV0YWJsZUNsb25pbmcgb2YgbGlicmFyaWVzIGlzIG5vdCBpbXBsZW1lbnRlZENsb25pbmcgb2YgY2xhc3NlcyBpcyBub3QgaW1wbGVtZW50ZWRDbG9uaW5nIG9mIGV4dGVuc2lvbnMgaXMgbm90IGltcGxlbWVudGVkQ2xvbmluZyBvZiBjb25zdHJ1Y3RvcnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmVDbG9uaW5nIG9mIHByb2NlZHVyZXMgaXMgbm90IGltcGxlbWVudGVkIGhlcmVDbG9uaW5nIG9mIGZpZWxkcyBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZUNsb25pbmcgb2YgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmVfY2xvbmVGaWxlT2Zmc2V0YWN0aXZlRmlsZVVyaVNhdmVkY2xvbmVPcHRpb25hbHZpc2l0T3B0aW9uYWxUeXBlbmV3VmFyaWFibGVuZXdFeGNlcHRpb25uZXdTdGFja1RyYWNlcHJlcGFyZVR5cGVQYXJhbWV0ZXJzY2xvbmVGdW5jdGlvbk5vZGVCb2R5c2F2ZWRDbG9uZUFubm90YXRpb25zVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIGV4cHJlc3Npb246IFVuaW1wbGVtZW50ZWQgY2xvbmUgZm9yIEtlcm5lbCBpbml0aWFsaXplcjogVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIG1lbWJlcjogVW5pbXBsZW1lbnRlZCBjbG9uZSBmb3IgS2VybmVsIHN0YXRlbWVudDogQ2xvbmluZyBLZXJuZWwgbm9uLW1lbWJlcnMgaXMgbm90IHN1cHBvcnRlZC4gIFRyaWVkIGNsb25pbmcgV2hlbiBjbG9uaW5nIHdpdGggbWVtYmVycyBvbmUgc2hvdWxkIHVzZSB0aGUgc3BlY2lmaWMgY2xvbmVYY2xvbmVDb25zdHJ1Y3RvcnJlZmVyZW5jZUZyb21jbG9uZUZpZWxkY2xvbmVSZWRpcmVjdGluZ0ZhY3RvcnlDb25zdHJ1Y3RvckNsb25lUHJvY2VkdXJlV2l0aG91dEJvZHlfZmVfYW5hbHl6ZXJfc2hhcmVkLnV0aWwucmVsYXRpdml6ZUM6XGVxdWFsc05DU25vcm1hbGl6ZXVyaVBhcnRzYmFzZVBhcnRzY29tbW9uTWVyZ2VWaXNpdG9ybWVyZ2VGdW5jdGlvblR5cGVzbmV3VHlwZVBhcmFtZXRlcnNhVHlwZVBhcmFtZXRlcmJUeXBlUGFyYW1ldGVyYVN1YnN0aXR1dGlvbmJTdWJzdGl0dXRpb25tZXJnZVR5cGVzYVR5cGVQYXJhbWV0ZXJUeXBlc2JUeXBlUGFyYW1ldGVyVHlwZXNuZXdCb3VuZG5ld0RlZmF1bHRUeXBlbmV3UmV0dXJuVHlwZW5ld1Bvc2l0aW9uYWxQYXJhbWV0ZXJzbmV3TmFtZWRQYXJhbWV0ZXJzbmV3TmFtZWRUeXBlbWVyZ2VOYW1lZFR5cGVzbmV3VHlwZWRlZlR5cGVtZXJnZUludGVyZmFjZVR5cGVzbWVyZ2VQcm9tb3RlZFR5cGVQYXJhbWV0ZXJUeXBlc21lcmdlVHlwZVBhcmFtZXRlclR5cGVzbmV3UHJvbW90ZWRCb3VuZG1lcmdlVHlwZWRlZlR5cGVzUmVwbGFjZW1lbnRWaXNpdG9yY2hhbmdlVmFyaWFuY2VuZXdOdWxsYWJpbGl0eXR5cGVQYXJhbWV0ZXJUeXBlc2NyZWF0ZUZ1bmN0aW9uVHlwZWNyZWF0ZUludGVyZmFjZVR5cGVjcmVhdGVOZXZlclR5cGVjcmVhdGVQcm9tb3RlZFR5cGVQYXJhbWV0ZXJUeXBlY3JlYXRlVHlwZVBhcmFtZXRlclR5cGVjcmVhdGVUeXBlZGVma2VybmVsLmltcG9ydF90YWJsZUltcG9ydFRhYmxlQ29tcG9uZW50SW1wb3J0VGFibGVfbGlicmFyeUluZGV4TGlicmFyeUltcG9ydFRhYmxlX2ltcG9ydFBhdGhzX2ltcG9ydGVkTGlicmFyaWVzaW1wb3J0UGF0aHNfSW1wb3J0VGFibGVCdWlsZGVycmVmZXJlbmNlTGlicmFyeWFkZExpYnJhcnlJbXBvcnRyZWZlcmVuY2VVcml0YXJnZXRVcmkgY2Fubm90IHJlZmVyIHRvIGxpYnJhcnkgd2l0aG91dCBhbiBpbXBvcnQgVVJJaXNGaWxlT3JDdXN0b21TY2hlbWVpc1RhcmdldFNjaGVtZUZpbGVPckN1c3RvbWlzUmVmZXJlbmNlU2NoZW1lRmlsZU9yQ3VzdG9tcmVsYXRpdmVVcmkgY2Fubm90IHJlZmVyIHRvIGFwcGxpY2F0aW9uIGxpYnJhcnkgZXhwb3J0ZWRSZWZlcmVuY2VyZWxhdGl2ZVVyaVBhdGh0YXJnZXRTZWdtZW50c3JlZlNlZ21lbnRzc2FtZW9rZWRrZXJuZWwuaGllcmFyY2h5X2Jhc2VkX3R5cGVfZW52aXJvbm1lbnR2bS5ieXRlY29kZS5kaXNhc3NlbWJsZXJJbnN0cnVjdGlvbl9ieXRlY29kZV9pbnN0cnVjdGlvbnNfbGFiZWxDb3VudF9sYWJlbHNfbWFya2Vyc19pbml0X3NjYW5Gb3JKdW1wVGFyZ2V0c19tYXJrVHJ5QmxvY2tzX21hcmtBbm5vdGF0aW9uc19kaXNhc21pbnN0cmRlY29kZUluc3RydWN0aW9uQXRfZGVjb2RlT3BlcmFuZHNfZGVjb2RlVWludDMyQXR0b1NpZ25lZFVuZXhwZWN0ZWQgZm9ybWF0IF9hZGRNYXJrZXJUcnkgIyBzdGFydDogZW5kOiBoYW5kbGVyOm1hcmtlcnN3cml0ZUluc3RydWN0aW9uT3Bjb2RlLmtfZm9ybWF0T3BlcmFuZGZtdHJGUFtMYWJlbCBub3QgZm91bmRTcGVjaWFsSW5kZXguVW5leHBlY3RlZCBvcGVyYW5kIGZvcm1hdCBrZXJuZWwudHJhbnNmb3JtYXRpb25zLmNvbnRpbnVhdGlvbmNvbnRyb2xsZXJTdHJlYW1WYXJzYXZlZFRyeUNvbnRleHRWYXI6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyZXhjZXB0aW9uVmFyc3RhY2tUcmFjZVZhclJlY3Vyc2l2ZUNvbnRpbnVhdGlvblJld3JpdGVyYXN5bmNKdW1wVmFyaWFibGVhc3luY0NvbnRleHRWYXJpYWJsZXJld3JpdGVDb21wb25lbnRyZXdyaXRlTGlicmFyeXJld3JpdGVzdG10aXRlcmF0aW9uVHlwZWV4cGVjdGVkSXRlcmFibGVUeXBlaXRlcmF0b3JUeXBldHlwZWRJdGVyYWJsZUNvbnRpbnVhdGlvblJld3JpdGVyQmFzZWN1cnJlbnRUcnlEZXB0aGN1cnJlbnRDYXRjaERlcHRoY2FwdHVyZWRUcnlEZXB0aGNhcHR1cmVkQ2F0Y2hEZXB0aGVsZW1lbnRUeXBlRnJvbWNvbnRhaW5lckNsYXNzZWxlbWVudFR5cGVGcm9tUmV0dXJuVHlwZWNyZWF0ZUNvbnRpbnVhdGlvblBvaW50Y3JlYXRlQ2FwdHVyZWRUcnlWYXJpYWJsZXNjcmVhdGVDYXB0dXJlZENhdGNoVmFyaWFibGVzdmFyaWFibGVEZWNsYXJhdGlvbnNTeW5jU3RhckZ1bmN0aW9uUmV3cml0ZXJpdGVyYXRvclZhcmlhYmxlbmVzdGVkQ2xvc3VyZVZhcmlhYmxlYnVpbGRDbG9zdXJlQm9keXJldHVyblN0YXRlbWVudHN5bmNJdGVyYWJsZUNvbnN0cnVjdG9ydHJhbnNmb3JtZWRFeHByZXNzaW9uQXN5bmNSZXdyaXRlckJhc2VzdGFja1RyYWNlVmFyaWFibGV0aGVuQ29udGludWF0aW9uVmFyaWFibGVjYXRjaEVycm9yQ29udGludWF0aW9uVmFyaWFibGVsYWJlbGVkQm9keWV4cHJlc3Npb25SZXdyaXRlcnNldHVwQXN5bmNDb250aW51YXRpb25zYXN5bmNSZXN1bHRidWlsZFdyYXBwZWRCb2R5YXN5bmNTdGFja1RyYWNlSGVscGVyc3RhY2tUcmFjZUFzc2lnbmJvdW5kVGhlbkNsb3N1cmVhc3luY1RoZW5XcmFwcGVydGhlbkNsb3N1cmVWYXJpYWJsZUFzc2lnbmJvdW5kQ2F0Y2hFcnJvckNsb3N1cmVhc3luY0Vycm9yV3JhcHBlcmNhdGNoRXJyb3JDbG9zdXJlVmFyaWFibGVBc3NpZ252aXNpdERlbGltaXRlZGV4Y2VwdGlvblZhcmlhYmxlYnVpbGRSZXR1cm5idWlsZENhdGNoQm9keXNhdmVkY29uZEVmZmVjdHNtc2dFZmZlY3RzbGFiZWxlZGVmZmVjdGlzU2ltcGxlaW5pdEVmZmVjdHN1cGRhdGVFZmZlY3RzbG9vcEJvZHluZXdCb2R5dmFsdWVWYXJpYWJsZXN0cmVhbVZhcmlhYmxlOnN0cmVhbTpmb3ItaXRlcmF0b3JzdHJlYW1JdGVyYXRvckNvbnN0cnVjdG9yd2hpbGVDb25kaXRpb25hc3luY1N0YXJNb3ZlTmV4dENhbGx3aGlsZUJvZHl0cnlCb2R5dHJ5RmluYWxpemVyY2xhdXNlQXN5bmNTdGFyRnVuY3Rpb25SZXdyaXRlcmNvbnRyb2xsZXJWYXJpYWJsZWNvbnRyb2xsZXJTdHJlYW1WYXJpYWJsZWJ1aWxkQ29udHJvbGxlcmFzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJDb25zdHJ1Y3RvcnNldENvbnRyb2xsZXJjb21wbGV0ZXJHZXRzdHJlYW1maW5hbGx5Qm9keWFkZEV4cHJlc3Npb25Bc3luY0Z1bmN0aW9uUmV3cml0ZXJjb21wbGV0ZXJWYXJpYWJsZXJldHVyblZhcmlhYmxlY29tcGxldGVyVHlwZUFyZ3VtZW50c2NvbXBsZXRlclR5cGVzdGFydFN0YXRlbWVudEhlbHBlck5vZGVzYXdhaXRIZWxwZXJmcm9tQ29yZVR5cGVzcmV3cml0ZXJrZXJuZWwudHJhbnNmb3JtYXRpb25zLnRyYWNrX3dpZGdldF9jb25zdHJ1Y3Rvcl9sb2NhdGlvbnNfV2lkZ2V0Q2FsbFNpdGVUcmFuc2Zvcm1lcl93aWRnZXRDbGFzc19sb2NhdGlvbkNsYXNzX2N1cnJlbnRGYWN0b3J5X3RyYWNrZXJ3aWRnZXRDbGFzc2xvY2F0aW9uQ2xhc3N0cmFja2VyX2NvbnN0cnVjdExvY2F0aW9ucGFyYW1ldGVyTG9jYXRpb25zc2hvd0ZpbGVfaXNTdWJjbGFzc09mV2lkZ2V0Y2xhenpfaXNTdWJjbGFzc09mX2FkZExvY2F0aW9uQXJndW1lbnRfY29tcHV0ZUxvY2F0aW9uY3JlYXRpb25Mb2NhdGlvblBhcmFtZXRlciRjcmVhdGlvbkxvY2F0aW9uZF8wZGVhMTEyYjA5MDA3MzMxN2Q0QXR0ZW1wdGluZyB0byBlbnRlciBsaWJyYXJ5ICd3aXRob3V0IGhhdmluZyBleGl0ZWQgbGlicmFyeSAnZXhpdExpYnJhcnlBdHRlbXB0aW5nIHRvIGV4aXQgYSBsaWJyYXJ5IHdpdGhvdXQgaGF2aW5nIGVudGVyZWQgb25lLldpZGdldENyZWF0b3JUcmFja2VyX2hhc0NyZWF0aW9uTG9jYXRpb25DbGFzc19yZXNvbHZlRmx1dHRlckNsYXNzZXNmbHV0dGVyL3NyYy93aWRnZXRzL2ZyYW1ld29yay5kYXJ0Zmx1dHRlcl93ZWIvc3JjL3dpZGdldHMvZnJhbWV3b3JrLmRhcnRXaWRnZXRmbHV0dGVyL3NyYy93aWRnZXRzL3dpZGdldF9pbnNwZWN0b3IuZGFydGZsdXR0ZXJfd2ViL3NyYy93aWRnZXRzL3dpZGdldF9pbnNwZWN0b3IuZGFydF9IYXNDcmVhdGlvbkxvY2F0aW9uX0xvY2F0aW9uX3RyYW5zZm9ybUNsYXNzSW1wbGVtZW50aW5nV2lkZ2V0X2xvY2F0aW9ubG9jYXRpb25GaWVsZF9oYW5kbGVkQ29uc3RydWN0b3JzaGFuZGxlQ29uc3RydWN0b3JoYXNSZWRpcmVjdGluZ0luaXRpYWxpemVydHJhbnNmb3JtZWRDbGFzc2VzbGlicmFyaWVzVG9UcmFuc2Zvcm1fdHJhbnNmb3JtV2lkZ2V0Q29uc3RydWN0b3JzY2FsbHNpdGVUcmFuc2Zvcm1lcmxpYnJhcmllc1RvQmVUcmFuc2Zvcm1lZF9jcmVhdGlvbkxvY2F0aW9uUGFyYW1ldGVyTmFtZV9sb2NhdGlvbkZpZWxkTmFtZV9oYXNOYW1lZFBhcmFtZXRlcl9oYXNOYW1lZEFyZ3VtZW50YXJndW1lbnROYW1lX2dldE5hbWVkUGFyYW1ldGVycGFyYW1ldGVyTmFtZV9tYXliZUFkZENyZWF0aW9uTG9jYXRpb25Bcmd1bWVudGNyZWF0aW9uTG9jYXRpb25uYW1lZEFyZ3VtZW50X21heWJlQWRkTmFtZWRQYXJhbWV0ZXJrZXJuZWwudHJhbnNmb3JtYXRpb25zLm1peGluX2Z1bGxfcmVzb2x1dGlvbk1peGluRnVsbFJlc29sdXRpb250YXJnZXRJbmZvdHJhbnNmb3JtQ2xhc3NDbGFzcyAiIiBtaXhlcyBpbiAiIiBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkuICBEaWQgeW91IGZvcmdldCAtLWxpbms/bm9uU2V0dGVyc2luZGV4ZWRDbGFzc29yaWdpbmFsTGVuZ3Rob3JpZ2luYWxQcm9jZWR1cmVTdXBlckNhbGxSZXNvbHV0aW9uVHJhbnNmb3JtZXJfY2FsbE5vU3VjaE1ldGhvZHJpZ2h0SGFuZFNpZGV2aXNpdGVkQXJndW1lbnRzX2NhbGxJc0xlZ2FsbWV0aG9kTmFtZW1ldGhvZEFyZ3VtZW50c21ldGhvZE5hbWVVc2VkX2NyZWF0ZUludm9jYXRpb25pbnZvY2F0aW9uUHJpbWVjYWxsQXJndW1lbnRzaXNTdXBlckludm9jYXRpb250YXJnZXRGdW5jdGlvbmdpdmVuTmFtZWR0YWtlbk5hbWVkU3VwZXJJbml0aWFsaXplclJlc29sdXRpb25UcmFuc2Zvcm1lcnRyYW5zZm9ybUluaXRpYWxpemVyc0NvdWxkIG5vdCBmaW5kIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBuYW1lZCAiIiBpbiBsb29rdXAgY2xhc3MgIiIhdm0uY29uc3RhbnRzX25hdGl2ZV9lZmZlY3RzaW1tdXRhYmxlTWFwQ2xhc3Nrdkxpc3RQYWlyc2t2TGlzdENvbnN0YW50a3ZQYWlyTGlzdEZpZWxkdm0ubWV0YWRhdGEuYmluYXJ5X2NhY2hldm0uYmluYXJ5X2NhY2hlX3dlYWtNYXBfTGF0ZVZhckluaXRUcmFuc2Zvcm1lcl9zaG91bGRBcHBseVRyYW5zZm9ybV90cmFuc2Zvcm1WYXJpYWJsZURlY2xhcmF0aW9uZm5Ob2RlZm4jaW5pdGlhbGl6ZXJfdHJhbnNmb3JtU3RhdGVtZW50c25ld1N0YXRlbWVudHN2bS50cmFuc2Zvcm1hdGlvbnMubGlzdF9mYWN0b3J5X3NwZWNpYWxpemVyX0xpc3RGYWN0b3J5U3BlY2lhbGl6ZXJfbGlzdEZhY3RvcnlfZ3Jvd2FibGVMaXN0RmFjdG9yeV9maXhlZExpc3RGYWN0b3J5X0xpc3R2bS50cmFuc2Zvcm1hdGlvbnMuZmZpTmF0aXZlVHlwZU5hdGl2ZVR5cGUua05hdGl2ZVR5cGVOYXRpdmVUeXBlLmtOYXRpdmVJbnRlZ2VyTmF0aXZlVHlwZS5rTmF0aXZlRG91YmxlTmF0aXZlVHlwZS5rUG9pbnRlck5hdGl2ZVR5cGUua05hdGl2ZUZ1bmN0aW9uTmF0aXZlVHlwZS5rSW50OE5hdGl2ZVR5cGUua0ludDE2TmF0aXZlVHlwZS5rSW50MzJOYXRpdmVUeXBlLmtJbnQ2NE5hdGl2ZVR5cGUua1VpbnQ4TmF0aXZlVHlwZS5rVWludDE2TmF0aXZlVHlwZS5rVWludDMyTmF0aXZlVHlwZS5rVW5pdDY0TmF0aXZlVHlwZS5rSW50cHRyTmF0aXZlVHlwZS5rRmxvYXROYXRpdmVUeXBlLmtEb3VibGVOYXRpdmVUeXBlLmtWb2lkTmF0aXZlVHlwZS5rU3RydWN0a05hdGl2ZVR5cGVrTmF0aXZlSW50ZWdlcmtOYXRpdmVEb3VibGVrUG9pbnRlcmtOYXRpdmVGdW5jdGlvbmtJbnQ4a0ludDE2a0ludDMya0ludDY0a1VpbnQ4a1VpbnQxNmtVaW50MzJrVW5pdDY0a0ludHB0cmtGbG9hdGtTdHJ1Y3RBYmlBYmkud29yZFNpemU2NEFiaS53b3JkU2l6ZTMyQWxpZ24zMkFiaS53b3JkU2l6ZTMyQWxpZ242NHdvcmRTaXplNjR3b3JkU2l6ZTMyQWxpZ24zMndvcmRTaXplMzJBbGlnbjY0RmZpVHJhbnNmb3JtZXJsaXN0RWxlbWVudEF0ZmZpTGlicmFyeW5hdGl2ZUZ1bmN0aW9uQ2xhc3Nwb2ludGVyQ2xhc3NzdHJ1Y3RDbGFzc2Nhc3RNZXRob2RvZmZzZXRCeU1ldGhvZGVsZW1lbnRBdE1ldGhvZGFzRnVuY3Rpb25NZXRob2Rhc0Z1bmN0aW9uSW50ZXJuYWxsb29rdXBGdW5jdGlvbk1ldGhvZGZyb21GdW5jdGlvbk1ldGhvZGFkZHJlc3NPZkZpZWxkc3RydWN0RnJvbVBvaW50ZXJsaWJyYXJ5TG9va3VwTWV0aG9kYWJpTWV0aG9kcG9pbnRlckZyb21GdW5jdGlvblByb2NlZHVyZW5hdGl2ZUNhbGxiYWNrRnVuY3Rpb25Qcm9jZWR1cmVsb2FkTWV0aG9kc3N0b3JlTWV0aG9kc2VsZW1lbnRBdE1ldGhvZHNsb2FkU3RydWN0TWV0aG9kbmF0aXZlVHlwZXNDbGFzc2VzTmF0aXZlRnVuY3Rpb25Qb2ludGVyU3RydWN0X29mZnNldEJ5X2FkZHJlc3NPZl9mcm9tUG9pbnRlcmFzRnVuY3Rpb25fYXNGdW5jdGlvbkludGVybmFsRHluYW1pY0xpYnJhcnlsb29rdXBGdW5jdGlvbmZyb21GdW5jdGlvbl9hYmlfcG9pbnRlckZyb21GdW5jdGlvbl9uYXRpdmVDYWxsYmFja0Z1bmN0aW9uX05hdGl2ZUludGVnZXJfTmF0aXZlRG91YmxlSW50OEludDE2SW50MzJJbnQ2NFVpbnQ4VWludDE2VWludDMyVWludDY0SW50UHRyRmxvYXREb3VibGVWb2lkX2xvYWRfc3RvcmVfZWxlbWVudEF0X2xvYWRTdHJ1Y3Rjb252ZXJ0TmF0aXZlVHlwZVRvRGFydFR5cGVuYXRpdmVUeXBlYWxsb3dTdHJ1Y3RzbmF0aXZlbmF0aXZlQ2xhc3NuYXRpdmVUeXBlX2Z1bnJlcGxhY2VkR2V0dGVyc3JlcGxhY2VkU2V0dGVyc2tOYXRpdmVUeXBlSW50U3RhcnRrTmF0aXZlVHlwZUludEVuZG5hdGl2ZVR5cGVDbGFzc05hbWVzVU5LTk9XTldPUkRfU0laRW5hdGl2ZVR5cGVTaXplc3dvcmRTaXplbm9uU2l6ZUFsaWdubWVudG9wdGltaXplZFR5cGVzdm0udHJhbnNmb3JtYXRpb25zLmZmaV9kZWZpbml0aW9uc19GZmlEZWZpbml0aW9uVHJhbnNmb3JtZXJjdXJyZW50TGlicmFyeUluZGV4X2NoZWNrU3RydWN0Q2xhc3NfbWFrZUVudHJ5UG9pbnRfY2hlY2tDb25zdHJ1Y3RvcnNmaWVsZHNWYWxpZF9jaGVja0ZpZWxkQW5ub3RhdGlvbnNzdHJ1Y3RTaXplX3JlcGxhY2VGaWVsZHNfcmVwbGFjZVNpemVPZk1ldGhvZF9pc1BvaW50ZXJUeXBlbmF0aXZlVHlwZUFubm9zX2dldE5hdGl2ZVR5cGVBbm5vdGF0aW9uc2RhcnRUeXBlc2hvdWxkQmVEYXJ0VHlwZSNwb2ludGVyI2Zyb21Qb2ludGVyc2l6ZUFuZE9mZnNldHNhYmlfY2FsY3VsYXRlU2l6ZUFuZE9mZnNldHNmaWVsZE9mZnNldHNtZXRob2RzX2dlbmVyYXRlTWV0aG9kc0ZvckZpZWxkX3J1bnRpbWVCcmFuY2hPbkxheW91dHBvaW50ZXJUeXBlcG9pbnRlck5hbWUjX3B0cl9oYXNOb25aZXJvbnRwb2ludGVyR2V0dGVybG9hZE1ldGhvZHN0b3JlTWV0aG9kI3ZzdHJ1Y3Qjc2l6ZU9mc2l6ZU9mX3NpemVJbkJ5dGVzX2FsaWdubWVudE9mX2FsaWduT2Zmc2V0bWluaW11bUFsaWdubWVudHNpemVBbGlnbm1lbnRfZ2V0RmllbGRUeXBlU2l6ZUFuZE9mZnNldHN2bS50cmFuc2Zvcm1hdGlvbnMuZmZpX3VzZV9zaXRlc19GZmlVc2VTaXRlVHJhbnNmb3JtZXJjYWxsYmFja0NvdW50aXNGZmlMaWJyYXJ5X2Vuc3VyZU5vdEV4dGVuZHNPckltcGxlbWVudHNTZWFsZWRDbGFzc3JlcGxhY2VkV2l0aF9lbnN1cmVJc1N0YXRpY0Z1bmN0aW9uX2Vuc3VyZU5hdGl2ZVR5cGVWYWxpZF9lbnN1cmVOYXRpdmVUeXBlVG9EYXJ0VHlwZWZ1bmNUeXBlZXhwZWN0ZWRSZXR1cm5leGNlcHRpb25hbFJldHVybl9yZXBsYWNlRnJvbUZ1bmN0aW9uX3JlcGxhY2VMb29rdXBGdW5jdGlvbm5hdGl2ZVNpZ25hdHVyZWRhcnRTaWduYXR1cmVsb29rdXBSZXN1bHRuYXRpdmVGdW5jdGlvblR5cGVfI2ZmaUNhbGxiYWNrX3BvaW50ZXJUeXBlR2V0VHlwZUFyZ2NvcnJlc3BvbmRpbmdEYXJ0VHlwZV9uYXRpdmVUeXBlVmFsaWRfZXh0ZW5kc09ySW1wbGVtZW50c1NlYWxlZENsYXNzc3VwZXJDbGFzc2V4dGVuZGVkX0ZmaVN0YXRpY1R5cGVFcnJvcnZtLnRyYW5zZm9ybWF0aW9ucy50eXBlX2Zsb3cubmF0aXZlX2NvZGVFbnRyeVBvaW50c0xpc3RlbmVyUHJhZ21hRW50cnlQb2ludHNWaXNpdG9yX2Fubm90YXRpb25zRGVmaW5lUm9vdEVycm9yOiBwcmFnbWEgZW50cnktcG9pbnQgZGVmaW5pdGlvbiBvbiBhIGNsYXNzIG11c3QgZXZhbHVhdGUgdG8gbnVsbCwgdHJ1ZSBvciBmYWxzZS4gU2VlIGVudHJ5X3BvaW50c19wcmFnbWEubWQuYWRkQ2xhc3NSZWZlcmVuY2VkRnJvbU5hdGl2ZUNvZGVhZGRTZWxlY3RvcmNrZGVmYXVsdENhbGxLaW5kRXJyb3I6IGNhbm5vdCBnZW5lcmF0ZSBhIHNldHRlciBmb3IgYSBtZXRob2Qgb3IgZ2V0dGVyIChFcnJvcjogY2Fubm90IGNsb3N1cml6ZSBhIHNldHRlciAoc2V0TWVtYmVyUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlRXJyb3I6IHByYWdtYSBlbnRyeS1wb2ludCBkZWZpbml0aW9uIG9uIGEgY29uc3RydWN0b3IgKCkgbXVzdGV2YWx1YXRlIHRvIG51bGwsIHRydWUsIGZhbHNlIG9yICdjYWxsJy4gU2VlIGVudHJ5X3BvaW50c19wcmFnbWEubWQuRXJyb3I6IGNhbid0IHVzZSAnc2V0JyBpbiBlbnRyeS1wb2ludCBwcmFnbWEgZm9yIGZpbmFsIGZpZWxkIEVycm9yOiBjYW4ndCBnZW5lcmF0ZSBpbnZvY2F0aW9uIGRpc3BhdGNoZXIgZm9yIGZpZWxkIHRocm91Z2ggQHByYWdtYSgndm06ZW50cnktcG9pbnQnKU5hdGl2ZUNvZGVPcmFjbGVfbWVtYmVyc1JlZmVyZW5jZWRGcm9tTmF0aXZlQ29kZV9jbGFzc2VzUmVmZXJlbmNlZEZyb21OYXRpdmVDb2RlX21hdGNoZXJoYW5kbGVOYXRpdmVQcm9jZWR1cmVlbnRyeVBvaW50c0xpc3RlbmVydHJhbnNsYXRvckVSUk9SOiBDYW5ub3QgdXNlIG91dHNpZGUgY29yZSBsaWJyYXJpZXMuRVJST1I6IEludmFsaWQgcmV0dXJuIHR5cGUgZm9yIG5hdGl2ZSBtZXRob2Q6IEVSUk9SOiBDb3VsZCBub3QgcGFyc2UgbmF0aXZlIG1ldGhvZCByZXR1cm4gdHlwZTogbGliTmFtZWtsYXNzTmFtZUVSUk9SOiBDYW5ub3QgaGF2ZSBib3RoLCBAcHJhZ21hKCIiKSBhbmQgQHByYWdtYSgiIiksIGFubm90YXRpbmcgdGhlIHNhbWUgbWVtYmVyLnZtLnRyYW5zZm9ybWF0aW9ucy50eXBlX2Zsb3cuc3VtbWFyeV9jb2xsZWN0b3JfU3VtbWFyeU5vcm1hbGl6ZXJfc3VtbWFyeV90eXBlc0J1aWxkZXJfcHJvY2Vzc2VkX3BlbmRpbmdfaW5Mb29wczFzMl9ub3JtYWxpemVFeHByX2hhbmRsZUxvb3BhbGxNYXRjaEFwcHJveGltYXRlZCAnVXNlJyBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkOiBfRmFsbHRocm91Z2hEZXRlY3RvcmNvbnRyb2xDYW5GYWxsVGhyb3VnaFVuZXhwZWN0ZWQgc3RhdGVtZW50IG9mIHR5cGUgY2F0Y2hfX1ZhcmlhYmxlc0luZm9Db2xsZWN0b3J2YXJJbmRleHZhckRlY2xhcmF0aW9uc2NhcHR1cmVkbW9kaWZpZWRTZXRzbnVtVmFyaWFibGVzQXRGdW5jdGlvbkVudHJ5YWN0aXZlU3RhdGVtZW50c251bVZhcmlhYmxlc0F0QWN0aXZlU3RhdGVtZW50c251bVZhcmlhYmxlc2dldE1vZGlmaWVkVmFyaWFibGVzc2F2ZWRBY3RpdmVTdGF0ZW1lbnRzc2F2ZWROdW1WYXJpYWJsZXNBdEFjdGl2ZVN0YXRlbWVudHNzYXZlZE51bVZhcmlhYmxlc0F0RnVuY3Rpb25FbnRyeV9pc0RlY2xhcmVkQmVmb3JldmFyaWFibGVJbmRleGVudHJ5RGVjbGFyYXRpb25Db3VudGVyaXNWYXJBc3NpZ25tZW50X3N0YXJ0Q29sbGVjdGluZ01vZGlmaWVkVmFyaWFibGVzX2VuZENvbGxlY3RpbmdNb2RpZmllZFZhcmlhYmxlc0ZpZWxkU3VtbWFyeVR5cGVGaWVsZFN1bW1hcnlUeXBlLmtJbml0aWFsaXplcmtGaWVsZEd1YXJka0luaXRpYWxpemVyU3VtbWFyeUNvbGxlY3Rvcl9lbnZpcm9ubWVudF9oaWVyYXJjaHlfZW50cnlQb2ludHNMaXN0ZW5lcl9uYXRpdmVDb2RlT3JhY2xlX2ZhbGx0aHJvdWdoRGV0ZWN0b3JfbnVsbE1ldGhvZHNBbmRHZXR0ZXJzX251bGxTZXR0ZXJzX3ZhcmlhYmxlc0luZm9fdmFyaWFibGVWYWx1ZXNfdmFyaWFibGVDZWxsc192YXJpYWJsZVZlcnNpb25zX3ZhcmlhYmxlVmFsdWVzQWZ0ZXJMYWJlbGVkU3RhdGVtZW50c19qb2luc0F0U3dpdGNoQ2FzZXNfcmV0dXJuVmFsdWVfcmVjZWl2ZXJjb25zdGFudEFsbG9jYXRpb25Db2xsZWN0b3JfdHJhbnNsYXRvcl9mblR5cGVWYXJpYWJsZXNfY2FjaGVkQm9vbFR5cGVfY2FjaGVkQm9vbFRydWVfY2FjaGVkQm9vbEZhbHNlX2NhY2hlZERvdWJsZVR5cGVfY2FjaGVkU3RyaW5nVHlwZV9jYWNoZWRTeW1ib2xUeXBlX2NhY2hlZFR5cGVUeXBlX2NhY2hlZE51bGxUeXBlX2VxdWFsc05hbWVfY2FjaGVkSGFzT3ZlcnJpZGRlbkVxdWFscz09PT09ICA9PT09PW51bUFyZ3NfZGVjbGFyZVBhcmFtZXRlcmlzUmVjZWl2ZXJ2YWx1ZVBhcmFtX3R5cGVDaGVja251bVR5cGVQYXJhbWV0ZXJzdXNlVHlwZXNGcm9tX3VzZVR5cGVDaGVja0ZvclBhcmFtZXRlciVyZXN1bHR0eXBlQ2hlY2stLS0tLS0tLS0tLS0gU1VNTUFSWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5PUk0gU1VNTUFSWSAtLS0tLS0tLS1wYXJhbUNvdW50X3Zpc2l0QXJndW1lbnRzcGFzc1R5cGVBcmd1bWVudHN0eXBlRm9yVW5leHBlY3RlZCBwYXJhbWV0ZXIgIGRlZmF1bHQgdmFsdWUgX21ha2VKb2luX3dyaXRlVmFyaWFibGVfY2xvbmVWYXJpYWJsZVZhbHVlc19tYWtlRW1wdHlWYXJpYWJsZVZhbHVlc19tZXJnZVZhcmlhYmxlVmFsdWVzZHN0VmFsdWVzcmNWYWx1ZV9jb3B5VmFyaWFibGVWYWx1ZXNfaXNJZGVudGljYWxTdGF0ZXN0YXRlMXN0YXRlMl9pbnNlcnRKb2luc0Zvck1vZGlmaWVkVmFyaWFibGVzaXNUcnlqb2luc19yZXN0b3JlVmFyaWFibGVDZWxsc0FmdGVyVHJ5X21lcmdlVmFyaWFibGVWYWx1ZXNUb0pvaW5zX2RlY2xhcmVWYXJpYWJsZVdpdGhTdGF0aWNUeXBlX21ha2VDYWxsX3N0YXRpY1R5cGVfbWFrZU5hcnJvd25hcnJvd19hZGRVc2Vfc3RhdGljRGFydFR5cGVfYm9vbFR5cGVfYm9vbFRydWVfYm9vbEZhbHNlX2RvdWJsZVR5cGVfaW50VHlwZV9zdHJpbmdUeXBlX3N5bWJvbFR5cGVfdHlwZVR5cGVfc3VwZXJjbGFzc19ib29sTGl0ZXJhbFR5cGVfaW50TGl0ZXJhbFR5cGVfZG91YmxlTGl0ZXJhbFR5cGVfc3RyaW5nTGl0ZXJhbFR5cGVfaGFuZGxlTmVzdGVkRnVuY3Rpb25Ob2Rlc2F2ZWRSZXR1cm5zYXZlZFZhcmlhYmxlVmFsdWVzX2lzU3VidHlwZV9oYXNPdmVycmlkZGVuRXF1YWxzY2FjaGVkUmVzdWx0X3Zpc2l0Q29uZGl0aW9udHJ1ZVN0YXRlZmFsc2VTdGF0ZXRydWVTdGF0ZUFmdGVyUkhTZmFsc2VTdGF0ZUFmdGVyUkhTdmFyaWFibGVHZXRfdXBkYXRlUmVjZWl2ZXJBZnRlckNhbGxyZWNlaXZlck5vZGVyZWNlaXZlclZhbHVlbnVsbFNlbGVjdG9yc29wZXJhbmROb2Rlc3RhdGVBZnRlcl9oYW5kbGVJbmRleGluZ0ludG9MaXN0Q29uc3RhbnRyZWN2VHlwZWVsZW1lbnRUeXBlc1VuYWJsZSB0byBmaW5kIHZhcmlhYmxlIHN0YXRlQWZ0ZXJMb29wcmV0c3RhdGVPbkVudHJ5dmFyaWFibGVWYWx1ZXNBdENhc2VFbnRyeWhhc0RlZmF1bHRzdGF0ZUFmdGVyVHJ5c3RhdGVBZnRlckNhdGNoUnVudGltZVR5cGVUcmFuc2xhdG9ySW1wbGZ1bmN0aW9uVHlwZVZhcmlhYmxlc3R5cGVzQ2FjaGVmb3JDbG9zZWRUeXBlc2ZsYXR0ZW5lZFR5cGVFeHByc2NyZWF0ZUNvbmNyZXRlVHlwZWFsbEFueVR5cGV0eXBlRXhwcmluc3RhbnRpYXRlY3JlYXRlUnVudGltZVR5cGVpbnRlcmZhY2VDbGFzc0NvbnN0YW50QWxsb2NhdGlvbkNvbGxlY3Rvcl9nZXRTdGF0aWNUeXBlcmVzdWx0Q2xhc3NrUGFydGlhbE1peGluUmVzb2x1dGlvbmdldFNlbGVjdG9yc1BhaXJkZWZhdWx0Q29tcGFyZUVtcHR5VW5tb2RpZmlhYmxlU2V0Y29udmVydC5oZXguZW5jb2RlckhleEVuY29kZXJfSGV4RW5jb2RlclNpbmtfY29udmVydGJ1ZmZlckluZGV4Ynl0ZU9ySW52YWxpZCBieXRlIDB4X2NvZGVVbml0Rm9yRGlnaXRkaWdpdGNvbnZlcnQuaGV4LmRlY29kZXJIZXhEZWNvZGVySW52YWxpZCBpbnB1dCBsZW5ndGgsIG11c3QgYmUgZXZlbi5jb2RlVW5pdHNfSGV4RGVjb2RlclNpbmtfbGFzdERpZ2l0X2Nsb3NlYnl0ZXNTdGFydGhleFBhaXJzYXNVdGY4U2lua0lucHV0IGVuZGVkIHdpdGggaW5jb21wbGV0ZSBlbmNvZGVkIGJ5dGUuX0hleERlY29kZXJCeXRlU2lua19kZWNvZGVzb3VyY2VTdGFydHNvdXJjZUVuZGRlc3RpbmF0aW9uZGVzdGluYXRpb25TdGFydGRlc3RpbmF0aW9uSW5kZXhmaXJzdERpZ2l0c2Vjb25kRGlnaXRjb252ZXJ0LnBlcmNlbnQuZW5jb2RlclBlcmNlbnRFbmNvZGVyX1BlcmNlbnRFbmNvZGVyU2lua2xldHRlcndyaXRlQ2hhckNvZGVjb252ZXJ0LnBlcmNlbnQuZGVjb2RlclBlcmNlbnREZWNvZGVybGFzdERpZ2l0X1BlcmNlbnREZWNvZGVyU2lua19QZXJjZW50RGVjb2RlckJ5dGVTaW5rX2xhc3RQZXJjZW50Y29kZVVuaXRPcnNsaWNlU3RhcnRfY2hlY2tGb3JJbnZhbGlkQ29kZVVuaXROb24tQVNDSUkgY29kZSB1bml0IHR5cGVkX2RhdGEudHlwZWRfYnVmZmVyc19UeXBlZERhdGFCdWZmZXJJTklUSUFMX0xFTkdUSF90eXBlZEJ1ZmZlcl9kZWZhdWx0VmFsdWVfY3JlYXRlQnVmZmVyX2NyZWF0ZUJpZ2dlckJ1ZmZlcl9hZGRBbGxfaW5zZXJ0S25vd25MZW5ndGhUb28gZmV3IGVsZW1lbnRzdmFsdWVzTGVuZ3RoX2Vuc3VyZUNhcGFjaXR5cmVxdWlyZWRDYXBhY2l0eV9zZXRSYW5nZWVsZW1lbnRTaXplSW5CeXRlc19JbnRCdWZmZXJfRmxvYXRCdWZmZXJVaW50OEJ1ZmZlcmluaXRpYWxMZW5ndGhJbnQ4QnVmZmVyVWludDhDbGFtcGVkQnVmZmVyVWludDE2QnVmZmVySW50MTZCdWZmZXJVaW50MzJCdWZmZXJJbnQzMkJ1ZmZlclVpbnQ2NEJ1ZmZlckludDY0QnVmZmVyRmxvYXQzMkJ1ZmZlckZsb2F0NjRCdWZmZXJJbnQzMng0QnVmZmVyRmxvYXQzMng0QnVmZmVyQmVnaW5Ub2tlbnByZWNlZGluZ0NvbW1lbnRMVE9QRU5fQ1VSTFlfQlJBQ0tFVE9QRU5fUEFSRU5PUEVOX1NRVUFSRV9CUkFDS0VUUVVFU1RJT05fUEVSSU9EX09QRU5fU1FVQVJFX0JSQUNLRVRTVFJJTkdfSU5URVJQT0xBVElPTl9FWFBSRVNTSU9ORG9jdW1lbnRhdGlvbkNvbW1lbnRUb2tlbktleXdvcmRBQlNUUkFDVEFTQVNTRVJUQVNZTkNBV0FJVEJSRUFLQ0FTRUNBVENIQ0xBU1NDT05TVENPTlRJTlVFQ09WQVJJQU5UREVGQVVMVERFRkVSUkVERE9EWU5BTUlDRUxTRUVOVU1lbnVtRVhQT1JURVhURU5EU0VYVEVOU0lPTkVYVEVSTkFMRkFDVE9SWUZBTFNFRklOQUxGSU5BTExZRk9SRlVOQ1RJT05HRVRISURFSUZJTVBMRU1FTlRTSU1QT1JUSU5JTk9VVElOVEVSRkFDRWludGVyZmFjZUlTTEFURUxJQlJBUllNSVhJTk5BVElWRU5FV05VTExPRk9OT1BFUkFUT1JPVVRQQVJUUEFUQ0hwYXRjaFJFUVVJUkVEUkVUSFJPV1JFVFVSTlNFVFNIT1dTT1VSQ0VTVEFUSUNTVVBFUlNXSVRDSFNZTkNUSElTVEhST1dUUlVFVFJZVFlQRURFRlZBUlZPSURXSElMRVdJVEhZSUVMRGtleXdvcmRzaXNCdWlsdEluaXNQc2V1ZG9pc01vZGlmaWVyaXNUb3BMZXZlbEtleXdvcmRpc0J1aWx0SW5PclBzZXVkb2lzUHNldWRvS2V5d29yZHN5bnRheF9jcmVhdGVLZXl3b3JkTWFwS2V5d29yZFRva2VuaXNLZXl3b3JkaXNLZXl3b3JkT3JJZGVudGlmaWVyU2ltcGxlVG9rZW5fcHJlY2VkaW5nQ29tbWVudF9zZXRDb21tZW50UGFyZW50Y2hhckVuZGJlZm9yZVN5bnRoZXRpY0VPRnNldE5leHRtYXRjaGVzQW55U3ludGhldGljQmVnaW5Ub2tlblN5bnRoZXRpY0tleXdvcmRUb2tlbnByZWNlZWRpbmdDb21tZW50bGV4aWNhbGx5Rmlyc3R0b2tlbnNUb2tlbkNsYXNzTk9fQ0xBU1NBRERJVElWRV9PUEVSQVRPUkFTU0lHTk1FTlRfT1BFUkFUT1JCSVRXSVNFX0FORF9PUEVSQVRPUkJJVFdJU0VfT1JfT1BFUkFUT1JCSVRXSVNFX1hPUl9PUEVSQVRPUkNBU0NBREVfT1BFUkFUT1JDT05ESVRJT05BTF9PUEVSQVRPUkVRVUFMSVRZX09QRVJBVE9SSUZfTlVMTF9PUEVSQVRPUkxPR0lDQUxfQU5EX09QRVJBVE9STE9HSUNBTF9PUl9PUEVSQVRPUk1VTFRJUExJQ0FUSVZFX09QRVJBVE9SUkVMQVRJT05BTF9PUEVSQVRPUlNISUZUX09QRVJBVE9SVU5BUllfUE9TVEZJWF9PUEVSQVRPUlVOQVJZX1BSRUZJWF9PUEVSQVRPUkRPVUJMRUhFWEFERUNJTUFMaGV4YWRlY2ltYWxJREVOVElGSUVSSU5UTVVMVElfTElORV9DT01NRU5UU0NSSVBUX1RBR1NUUklOR0FNUEVSU0FOREFNUEVSU0FORF9BTVBFUlNBTkRBTVBFUlNBTkRfQU1QRVJTQU5EX0VRJiY9QU1QRVJTQU5EX0VRJj1BVEJBTkdCQU5HX0VRQkFOR19FUV9FUSE9PUJBUkJBUl9CQVJCQVJfQkFSX0VRfHw9QkFSX0VRfD1DT0xPTkNPTU1BQ0FSRVRDQVJFVF9FUV49Q0xPU0VfQ1VSTFlfQlJBQ0tFVENMT1NFX1BBUkVOQ0xPU0VfU1FVQVJFX0JSQUNLRVRFUUVRX0VRRVFfRVFfRVE9PT1HVEdUX0VRR1RfR1RHVF9HVF9FUT4+PUdUX0dUX0dUR1RfR1RfR1RfRVE+Pj49SEFTSElOREVYSU5ERVhfRVFMVF9FUUxUX0xUTFRfTFRfRVE8PD1NSU5VU01JTlVTX0VRLT1NSU5VU19NSU5VU1BFUkNFTlRQRVJDRU5UX0VRJT1QRVJJT0RQRVJJT0RfUEVSSU9EUExVU1BMVVNfRVErPVBMVVNfUExVU1FVRVNUSU9OUVVFU1RJT05fUEVSSU9EUVVFU1RJT05fUVVFU1RJT05RVUVTVElPTl9RVUVTVElPTl9FUT8/PVNFTUlDT0xPTlNMQVNIU0xBU0hfRVEvPVNUQVJTVEFSX0VRKj1TVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSJFRJTERFVElMREVfU0xBU0hUSUxERV9TTEFTSF9FUX4vPUJBQ0tQSU5HYEJBQ0tTTEFTSFBFUklPRF9QRVJJT0RfUEVSSU9EUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT05RVUVTVElPTl9QRVJJT0RfUEVSSU9EQkFEX0lOUFVUbWFsZm9ybWVkIGlucHV0UkVDT1ZFUllyZWNvdmVyeXVuc3BlY2lmaWVkaXNBZGRpdGl2ZU9wZXJhdG9yaXNBc3NpZ25tZW50T3BlcmF0b3Jpc0Fzc29jaWF0aXZlT3BlcmF0b3Jpc0VxdWFsaXR5T3BlcmF0b3Jpc0luY3JlbWVudE9wZXJhdG9yaXNNdWx0aXBsaWNhdGl2ZU9wZXJhdG9yaXNSZWxhdGlvbmFsT3BlcmF0b3Jpc1NoaWZ0T3BlcmF0b3Jpc1VuYXJ5UG9zdGZpeE9wZXJhdG9yaXNVbmFyeVByZWZpeE9wZXJhdG9yaXNTZWxlY3Rvck9wZXJhdG9yTk9fUFJFQ0VERU5DRUFTU0lHTk1FTlRfUFJFQ0VERU5DRUNBU0NBREVfUFJFQ0VERU5DRUNPTkRJVElPTkFMX1BSRUNFREVOQ0VJRl9OVUxMX1BSRUNFREVOQ0VMT0dJQ0FMX09SX1BSRUNFREVOQ0VMT0dJQ0FMX0FORF9QUkVDRURFTkNFRVFVQUxJVFlfUFJFQ0VERU5DRVJFTEFUSU9OQUxfUFJFQ0VERU5DRUJJVFdJU0VfT1JfUFJFQ0VERU5DRUJJVFdJU0VfWE9SX1BSRUNFREVOQ0VCSVRXSVNFX0FORF9QUkVDRURFTkNFU0hJRlRfUFJFQ0VERU5DRUFERElUSVZFX1BSRUNFREVOQ0VNVUxUSVBMSUNBVElWRV9QUkVDRURFTkNFUFJFRklYX1BSRUNFREVOQ0VQT1NURklYX1BSRUNFREVOQ0VTRUxFQ1RPUl9QUkVDRURFTkNFX2ZlX2FuYWx5emVyX3NoYXJlZC5zY2FubmVyLmFic3RyYWN0X3NjYW5uZXJMaXN0TWl4aW5VaW50MzJMaXN0TGlua05vbkFzY2lpSWRlbnRpZmllclRva2VuS2V5d29yZFN0YXRlU2Nhbm5lcmJ1aWxkVW5leHBlY3RlZENoYXJhY3RlclRva2VubGFuZ3VhZ2VWZXJzaW9uTEFaWV9BU1NJR05NRU5UX0VOQUJMRURfZW5hYmxlRXh0ZW5zaW9uTWV0aG9kc19lbmFibGVOb25OdWxsYWJsZV9lbmFibGVUcmlwbGVTaGlmdGVycm9yVGFpbGNvbW1lbnRzVGFpbGdyb3VwaW5nU3RhY2tjb25maWdudW1iZXJPZkJ5dGVzSGludGVuYWJsZUV4dGVuc2lvbk1ldGhvZHNlbmFibGVOb25OdWxsYWJsZWVuYWJsZVRyaXBsZVNoaWZ0YXBwZW5kU3Vic3RyaW5nVG9rZW5hcHBlbmRUb2tlbmFwcGVuZFN5bnRoZXRpY1N1YnN0cmluZ1Rva2VuYXBwZW5kUHJlY2VkZW5jZVRva2Vuc2VsZWN0Y2hvaWNlYXBwZW5kS2V5d29yZFRva2VuZGlzY2FyZE9wZW5MdGFwcGVuZEVvZlRva2VudW5tYXRjaGVkQmVnaW5Hcm91cGFwcGVuZFdoaXRlU3BhY2VsaW5lRmVlZEluTXVsdGlsaW5lYXBwZW5kQmVnaW5Hcm91cGFwcGVuZEVuZEdyb3Vwb3BlbktpbmRkaXNjYXJkQmVnaW5Hcm91cFVudGlsYmVnaW5hcHBlbmRHdGFwcGVuZEd0R3RwcmVwZW5kRXJyb3JUb2tlbm9yaWdpbmFsU3RhY2tkaXNjYXJkSW50ZXJwb2xhdGlvbm9sZFRhaWxiaWdIZWFkZXJTd2l0Y2hiaWdTd2l0Y2h0b2tlbml6ZVNsYXNoT3JDb21tZW50dG9rZW5pemVMYW5ndWFnZVZlcnNpb25PclNpbmdsZUxpbmVDb21tZW50bmV4dExvd2VydG9rZW5pemVSYXdTdHJpbmdLZXl3b3JkT3JJZGVudGlmaWVydG9rZW5pemVLZXl3b3JkT3JJZGVudGlmaWVydG9rZW5pemVEb3RzT3JOdW1iZXJ0b2tlbml6ZUVxdWFsc3Rva2VuaXplU3RyaW5ndG9rZW5pemVMZXNzVGhhbnRva2VuaXplR3JlYXRlclRoYW50b2tlbml6ZUV4Y2xhbWF0aW9udG9rZW5pemVPcGVuU3F1YXJlQnJhY2tldHRva2VuaXplQXR0b2tlbml6ZU51bWJlcnRva2VuaXplQW1wZXJzYW5kdG9rZW5pemVIZXhPck51bWJlcnRva2VuaXplUXVlc3Rpb250b2tlbml6ZUJhcnRva2VuaXplUGx1c3Rva2VuaXplTWludXN0b2tlbml6ZU11bHRpcGx5dG9rZW5pemVDYXJldHRva2VuaXplVGlsZGV0b2tlbml6ZVBlcmNlbnR0b2tlbml6ZVRhZ3Rva2VuaXplRnJhY3Rpb25QYXJ0bmV4dG5leHR0b2tlbml6ZUhleGhhc0RpZ2l0c2hhc0RpZ2l0aGFzRXhwb25lbnREaWdpdHN0b2tlbml6ZU11bHRpTGluZUNvbW1lbnR0b2tlbml6ZVNpbmdsZUxpbmVDb21tZW50dG9rZW5pemVTaW5nbGVMaW5lQ29tbWVudFJlc3RtYWpvclN0YXJ0bWlub3JTdGFydF9hcHBlbmRUb0NvbW1lbnRTdHJlYW1kYXJ0ZG9jYXBwZW5kRGFydERvY2FwcGVuZENvbW1lbnRhc2NpaU9ubHlDb21tZW50YXNjaWlPbmx5TGluZXN1bmljb2RlU3RhcnRuZXN0aW5nYWR2YW5jZUFmdGVyRXJyb3JuZXdDb21tZW50YWxsb3dEb2xsYXJuZXh0Q2FwaXRhbHRva2VuaXplSWRlbnRpZmllcnF1b3RlQ2hhcnRva2VuaXplTXVsdGlMaW5lU3RyaW5ndG9rZW5pemVTaW5nbGVMaW5lUmF3U3RyaW5ndG9rZW5pemVTaW5nbGVMaW5lU3RyaW5ncXVvdGVTdGFydHRva2VuaXplU3RyaW5nSW50ZXJwb2xhdGlvbnVudGVybWluYXRlZFN0cmluZ2lzTXVsdGlMaW5laXNSYXd0b2tlbml6ZUludGVycG9sYXRlZEV4cHJlc3Npb250b2tlbml6ZUludGVycG9sYXRlZElkZW50aWZpZXJ0b2tlbml6ZU11bHRpTGluZVJhd1N0cmluZ2FzY2lpT25seVN0cmluZ2FzY2lpT25seUxpbmVlcnJvclRva2VuZXJyb3JTdGFydHNob3VsZEFkdmFuY2VfTGluZVN0YXJ0cyZPYmplY3QmTGlzdE1peGluYXJyYXlhcnJheUxlbmd0aGV4cGVjdGVkTnVtYmVyT2ZMaW5lc2dyb3dzd2l0Y2hUb1VpbnQzMm5ld0xlbmd0aE1pbmltdW1uZXdBcnJheWNsYXNzaWNjbG9zZUJyYWNlSW5mb0Zvcl9pc0lkZW50aWZpZXJDaGFyZGFydF9zY2FubmVyLmVycm9yX3Rva2VuY2xvc2VCcmFjZUZvcmNsb3NlUXVvdGVGb3J1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJlcnJvck1zZ2Fzc2VydGlvbk1lc3NhZ2VwYXR0ZXJuXiNbMC05XSogKlBhcnNlcnRyYWNlTGluZXN1bnN1cHBvcnRlZCBvcGVyYXRpb25FbmNvZGluZ0Vycm9yVG9rZW5FbmNvZGluZ0Vycm9yVG9rZW4oKU5vbkFzY2lpSWRlbnRpZmllclRva2VuKE5vbkFzY2lpV2hpdGVzcGFjZVRva2VuTm9uQXNjaWlXaGl0ZXNwYWNlVG9rZW4oQXNjaWlDb250cm9sQ2hhcmFjdGVyVG9rZW5Bc2NpaUNvbnRyb2xDaGFyYWN0ZXJUb2tlbihVbnN1cHBvcnRlZE9wZXJhdG9yKFVudGVybWluYXRlZFN0cmluZyhVbnRlcm1pbmF0ZWRUb2tlbihVbm1hdGNoZWRUb2tlbihmYXN0YS5kZWNsYXJhdGlvbmlzRXh0ZW5zaW9uaXNEZWNsYXJhdGlvbk1lbWJlcmlzQ2xhc3NNZW1iZXJhcHBseVBhdGNoZmluaXNoUGF0Y2hyZXNvbHZlQ29uc3RydWN0b3JzQnVpbGRlckltcGwuYXBwbHlQYXRjaC5maW5pc2hQYXRjaGZhc3RhLmNsYXNzX2J1aWxkZXJUeXBlQXJndW1lbnRJc3N1ZWNvbXB1dGVWYXJpYW5jZWZpbmRUeXBlQXJndW1lbnRJc3N1ZXNnZXRHZW5lcmljVHlwZU5hbWVEaWxsTWVtYmVyQnVpbGRlclR5cGVzVW5rbm93blR5cGVyZWRpcmVjdGluZ0NvbnN0cnVjdG9yc2FjdHVhbE9yaWdpbnBhdGNoRm9yVGVzdGluZ2lzTnVsbENsYXNzY29uc3RydWN0b3JTY29wZUJ1aWxkZXJpc01peGluaXNBbm9ueW1vdXNNaXhpbkFwcGxpY2F0aW9uY29uc3RydWN0b3JSZWZlcmVuY2VzYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnNhY2Nlc3NpbmdMaWJyYXJ5Zmlyc3RNZW1iZXJOYW1lZGFjdHVhbENsc2J1aWxkVHlwZUFyZ3VtZW50c2J1aWxkU3VwZXJ0eXBlYnVpbGRNaXhlZEluVHlwZWNoZWNrU3VwZXJ0eXBlc2NoZWNrQm91bmRzSW5TdXBlcnR5cGVjaGVja1R5cGVzSW5PdXRsaW5laGFuZGxlU2VlbkNvdmFyaWFudGludGVyZmFjZU1lbWJlcmNoZWNrT3ZlcnJpZGVpc0ludGVyZmFjZUNoZWNraGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2RjaGVja01ldGhvZE92ZXJyaWRlY2hlY2tHZXR0ZXJPdmVycmlkZWNoZWNrU2V0dGVyT3ZlcnJpZGVyZXBvcnRJbnZhbGlkT3ZlcnJpZGVjaGVja01peGluQXBwbGljYXRpb25jb21wdXRlUmVkaXJlY3RlZVR5cGVjb21wdXRlUmVkaXJlY3RlZU5hbWVjaGVja1JlZGlyZWN0aW5nRmFjdG9yeWNoZWNrUmVkaXJlY3RpbmdGYWN0b3JpZXNDbGFzc0J1aWxkZXJJbXBsX2xlZ2FjeVJhd1R5cGVfbnVsbGFibGVSYXdUeXBlX25vbk51bGxhYmxlUmF3VHlwZWlzTmFtZWRNaXhpbkFwcGxpY2F0aW9uaWdub3JlcmVkaXJlY3RjeWNsZVJlcG9ydGVkaXNJbnN0YW5jZVNjb3BldHlwZVZhcmlhYmxlc0NvdW50YnVpbGRUeXBlc1dpdGhCdWlsdEFyZ3VtZW50c2luZmVycmVkVHlwZXNidWlsZFR5cGVuYW1lT2Zmc2V0bmFtZUxlbmd0aHN1cGVyQ2xhc3NUeXBlcHJvYmxlbXNwcm9ibGVtc09mZnNldHNpbXBsZW1lbnRlZHR5cGVEZWNsYXJhdGlvbnJlcGV0aXRpb25zaXNzdWVzYWxsb3dTdXBlckJvdW5kZWRpc3N1ZWluZmVycmVkZW5jbG9zaW5nVHlwZXJlcG9ydFR5cGVBcmd1bWVudElzc3VlY2hlY2tWYXJpYW5jZUluRnVuY3Rpb25jaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlcmVkaXJlY3RpbmdjaGVja0JvdW5kc0luRnVuY3Rpb25Ob2RlUGFydHNjaGVja1ZhcmlhbmNlSW5GaWVsZGNoZWNrVHlwZXNJbkZpZWxkY2hlY2tJbml0aWFsaXplcnNJbkZvcm1hbHNmaWVsZFZhcmlhbmNlcmVwb3J0VmFyaWFuY2VQb3NpdGlvbklmSW52YWxpZGZ1bmN0aW9uUGFyYW1ldGVydHlwZVZhcmlhbmNlZm9ybWFsVmFyaWFuY2VuYW1lZFZhcmlhbmNlcmV0dXJuVHlwZVZhcmlhbmNlaXNSZXR1cm5UeXBlZ2V0SW50ZXJmYWNlTWVtYmVyS2VybmVsQ29uc3RydWN0b3IgaW4gb3ZlcnJpZGUgY2hlY2suc2VlbkNvdmFyaWFudGRlY2xhcmVkTWVtYmVySGFzR2V0dGVyaW50ZXJmYWNlTWVtYmVySGFzR2V0dGVyZGVjbGFyZWRNZW1iZXJIYXNTZXR0ZXJpbnRlcmZhY2VNZW1iZXJIYXNTZXR0ZXJ0cmFuc2Zvcm1Qcm9jZWR1cmVUb05vU3VjaE1ldGhvZEZvcndhcmRlcm5vU3VjaE1ldGhvZEludGVyZmFjZV9nZXRNZW1iZXJVcmlfY29tcHV0ZUludGVyZmFjZVN1YnN0aXR1dGlvbmRlY2xhcmVkRnVuY3Rpb25pbnRlcmZhY2VGdW5jdGlvbmludGVyZmFjZVN1YnN0aXR1dGlvbmdldEtlcm5lbFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2ZzdWJzdGl0dXRpb25NYXBkZWNsYXJlZFBhcmFtZXRlcmludGVyZmFjZVBhcmFtZXRlcmRlY2xhcmVkQm91bmRpbnRlcmZhY2VCb3VuZGNvbXB1dGVkQm91bmRpc1NhbWVUeXBlS2VybmVsX2NvbXB1dGVEZWNsYXJlZFN1YnN0aXR1dGlvbmRlY2xhcmVkU3Vic3RpdHV0aW9uX2NoZWNrVHlwZXNkZWNsYXJlZFR5cGVpbnRlcmZhY2VUeXBlYXNJZkRlY2xhcmVkUGFyYW1ldGVyaW5QYXJhbWV0ZXJpc1N1YnR5cGVPZktlcm5lbGRlY2xhcmVkTWVtYmVyTmFtZWludGVyZmFjZU1lbWJlck5hbWVjb21wYXJlTmFtZWRQYXJhbWV0ZXJzcDBwMXNvcnRlZEZyb21EZWNsYXJlZHNvcnRlZEZyb21JbnRlcmZhY2VkZWNsYXJlZE5hbWVkUGFyYW1ldGVyc2ludGVyZmFjZU5hbWVkUGFyYW1ldGVyc2Jhc2VOYW1lbWl4aW5OYW1lY2xhc3NOYW1lTGVuZ3RoY29uc3RyYWludGZvckVhY2hMb2NhbE1lbWJlcm1lbWJlclBhdGNoZm9yRWFjaExvY2FsU2V0dGVyb3JpZ2luTGVuZ3RocGF0Y2hMZW5ndGh0YXJnZXRCdWlsZGVydGFyZ2V0RnVuY3Rpb25UeXBldHlwZVBhcmFtZXRlckJvdW5kZmFjdG9yeVR5cGVyZWRpcmVjdGVlVHlwZWRpcmVjdFN1YnN0aXR1dGlvbk1hcGluc3RhbmNlQ2xhc3MgZXhwZWN0ZWQgbG9va3VwQ29uc3RydWN0b3JXaXRoUGF0Y2hlc2dldFN1cGVyY2xhc3NDb25zdHJ1Y3RvclJlZGlyZWN0aW9uZmFzdGEubGlicmFyeV9idWlsZGVybWF5SW1wbGVtZW50UmVzdHJpY3RlZFR5cGVzZXhwb3J0U2NvcGVCdWlsZGVyZXhwb3J0ZXJzZXhwbGljaXRhZGRCdWlsZGVyYWRkRXhwb3J0ZXJwcm9ibGVtT25MaWJyYXJ5YWRkVG9FeHBvcnRTY29wZWFkZFRvU2NvcGVjb21wdXRlQW1iaWd1b3VzRGVjbGFyYXRpb25maW5pc2hEZWZlcnJlZExvYWRUZWFyb2Zmc2ZpbmlzaEZvcndhcmRlcnNmaW5pc2hOYXRpdmVNZXRob2RzZmluaXNoUGF0Y2hNZXRob2RzZ2V0Q29uc3RydWN0b3Jjb25zdHJ1Y3Rvck5hbWVieXBhc3NMaWJyYXJ5UHJpdmFjeWZpbmlzaFR5cGVWYXJpYWJsZXNjb21wdXRlVmFyaWFuY2VzY29tcHV0ZURlZmF1bHRUeXBlc2JlY29tZUNvcmVMaWJyYXJ5YWRkU3ludGhldGljRGVjbGFyYXRpb25PZkR5bmFtaWNhZGRTeW50aGV0aWNEZWNsYXJhdGlvbk9mTmV2ZXJhcHBseVBhdGNoZXNyZWNvcmRBY2Nlc3N0YWtlSW1wbGljaXRseVR5cGVkRmllbGRzbnVsbGFibGVCdWlsZGVybm9uTnVsbGFibGVCdWlsZGVyTGlicmFyeUJ1aWxkZXJJbXBsYWRkTG9jYWxNZW1iZXIuYXBwbHlQYXRjaGVzTGlicmFyeUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvckxpYnJhcnlMb2NhbERlY2xhcmF0aW9uTmFtZUl0ZXJhdG9yZmFzdGEubmFtZV9pdGVyYXRvcmZhc3RhLnR5cGVfYnVpbGRlcnByaW50T25zdWJzdG5ld1R5cGVzd2l0aE51bGxhYmlsaXR5QnVpbGRlcmZhc3RhLnR5cGVfZGVjbGFyYXRpb25fYnVpbGRlclR5cGVEZWNsYXJhdGlvbkJ1aWxkZXJJbXBsZmFzdGEuYnVpbGRlcl9ncmFwaEdyYXBoTGlicmFyeSBub3QgZm91bmQ6IGZhc3RhLmNvbWJpbmF0b3JmYXN0YS5kaWxsX2NsYXNzX2J1aWxkZXJhYnN0cmFjdE1hc2tuYW1lZE1peGluQXBwbGljYXRpb25NYXNrY2xhc3MgdGFyZ2V0U3VwZXJ0eXBlYWRkU2V0dGVybWl4ZWRJblR5cGU9Y29tcHV0ZU1vZGlmaWVyc2NvbXB1dGVUeXBlQnVpbGRlcmNvbXB1dGVUeXBlVmFyaWFibGVCdWlsZGVyc2Zhc3RhLmRpbGxfbGlicmFyeV9idWlsZGVyRGlsbExvYWRlckRpbGxUeXBlQWxpYXNCdWlsZGVyTGF6eUxpYnJhcnlTY29wZXRvcGVuc3VyZVNjb3BlTm8gbGlicmFyeSBidWlsZGVyLnVuc2VyaWFsaXphYmxlRXhwb3J0c2lzUmVhZHlUb0J1aWxkaXNSZWFkeVRvRmluYWxpemVFeHBvcnRzbGF6eVNjb3BlbGF6eUV4cG9ydFNjb3BlTm90IHJlYWR5IHRvIGJ1aWxkLmZpbmFsaXplRXhwb3J0c05vdCByZWFkeSB0byBmaW5hbGl6ZSBleHBvcnRzLmNsYXNzQnVsZGVyX2V4cG9ydHMjY29uc3RhbnRFeHByZXNzaW9uPGxpYnJhcnkgJ21hcmtBc1JlYWR5VG9CdWlsZG1hcmtBc1JlYWR5VG9GaW5hbGl6ZUV4cG9ydHNzb3VyY2VCdWlsZGVyc01hcFVuZXhwZWN0ZWQ6IE5vIGJ1aWxkZXIgZm9yICdFeHBvcnRlZCBlbGVtZW50ICcnIG5vdCBmb3VuZCBpbiAnVW5leHBlY3RlZCBkZWNsYXJhdGlvbiBmb3Igbm9kZSBmYXN0YS5kaWxsX3RhcmdldFRhcmdldEltcGxlbWVudGF0aW9ubGlicmFyeUJ1aWxkZXJzYWRkU291cmNlSW5mb3JtYXRpb25jcmVhdGVMaWJyYXJ5QnVpbGRlck5vIGxpYnJhcnkgZm91bmQgZm9yIGJyZWFrQ3ljbGVmYXN0YS5leHBvcnRmYXN0YS5pbXBvcnR0b0tlcm5lbENvbWJpbmF0b3JzQ29uZmlndXJhdGlvbmNvbmZpZ3VyYXRpb25zcHJlZml4Q2hhck9mZnNldG5hdGl2ZUltcG9ydFBhdGhpbXBvcnRJbmRleGZpbmFsaXplSW1wb3J0c2NyZWF0ZVByZWZpeEJ1aWxkZXJmYXN0YS5zY29wZUNsYXNzTWVtYmVyTXV0YWJsZVNjb3BlX2xvY2FsX3NldHRlcnNjbGFzc05hbWVPckRlYnVnTmFtZVNjb3BlKGZvcndhcmREZWNsYXJlZExhYmVsc25lc3RlZGRlYnVnTG9jYWxzOlNldHRlcnM6RXh0ZW5zaW9uczpyZXBsYWNlbWVudE1hcFNldHRlcnNuZWVkc1BhdGNoaW5nZXh0ZW5zaW9uc1JlcGxhY2VtZW50Y29weVdpdGhQYXJlbnRwYXJlbnQ9YmVjb21lUGFydE9md2l0aFR5cGVWYXJpYWJsZXN0eXBlIHZhcmlhYmxlc3JlY29yZFVzZWxvb2t1cElubG9jYWxTZXR0ZXJzZm9yRWFjaEV4dGVuc2lvbm1lcmdlbWVyZ2VNZW1iZXJuZXN0aW5nTGV2ZWx3cml0ZU9uaW5kZW50Y29tcHV0ZU1peGluU2NvcGVuZWVkc0NvcHlDb25zdHJ1Y3RvclNjb3BlQ29uc3RydWN0b3JTY29wZShMYXp5U2NvcGVTY29wZUJ1aWxkZXJDb25zdHJ1Y3RvclNjb3BlQnVpbGRlclByb2JsZW1CdWlsZGVyQWNjZXNzRXJyb3JCdWlsZGVyQW1iaWd1b3VzQnVpbGRlcmdldEZpcnN0RGVjbGFyYXRpb25FcnJvbmVvdXNNZW1iZXJCdWlsZGVyTWl4aW53cml0ZVRhcmdldGludm9rZVRhcmdldEFtYmlndW91c01lbWJlckJ1aWxkZXIucGFyZW50PUFtYmlndW91c01lbWJlckJ1aWxkZXIuYnVpbGRPdXRsaW5lRXhwcmVzc2lvbnNfQW1iaWd1b3VzTWVtYmVyQnVpbGRlciZBbWJpZ3VvdXNCdWlsZGVyJkVycm9uZW91c01lbWJlckJ1aWxkZXJNaXhpbkFtYmlndW91c01lbWJlckJ1aWxkZXJTY29wZUxvY2FsRGVjbGFyYXRpb25JdGVyYXRvclNjb3BlTG9jYWxEZWNsYXJhdGlvbk5hbWVJdGVyYXRvcmxvY2FsTmFtZXNzZXR0ZXJOYW1lc2Zhc3RhLnNvdXJjZV9jbGFzc19idWlsZGVydHlwZV9hbGdlYnJhY29tcGFyZVByb2NlZHVyZXNyZWZlcmVuY2VzRnJvbUluZGV4ZWRzdGFydENoYXJPZmZzZXRjaGFyRW5kT2Zmc2V0YnVpbGRCdWlsZGVyc2J1aWxkTWVtYmVyc2NoZWNrU3VwZXJ0eXBlYWRkU3ludGhldGljQ29uc3RydWN0b3Jjb21wdXRlRGlyZWN0U3VwZXJ0eXBlc2FkZE5vU3VjaE1ldGhvZEZvcndhcmRlckZvclByb2NlZHVyZWNsb25lZGZvcndhcmRlcnNPcmlnaW5zYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyR2V0dGVyRm9yRmllbGRhZGROb1N1Y2hNZXRob2RGb3J3YXJkZXJTZXR0ZXJGb3JGaWVsZF9hZGRNaXNzaW5nTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2V4aXN0aW5nRm9yd2FyZGVyc2ZvclNldHRlcnNhbGxNZW1iZXJzY29uY3JldGVNZW1iZXJzZGVjbGFyZWRNZW1iZXJzY2xzSGFzVXNlckRlZmluZWROb1N1Y2hNZXRob2RzYW1lTmFtZU1lbWJlcnNtZW1iZXJUeXBlc2Jlc3RTb0ZhcmJlc3RTb0ZhclR5cGVjYW5kaWRhdGVUeXBlaXNNb3JlU3BlY2lmaWNpc0FjdHVhbGx5QmVzdFNvRmFybWVtYmVyVHlwZV9pc0ZvcndhcmRlclJlcXVpcmVkYWRkTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2V4aXN0aW5nU2V0dGVyRm9yd2FyZGVyc25lYXJlc3RDb25jcmV0ZVN1cGVyY2xhc3NzdXBlckhhc1VzZXJEZWZpbmVkTm9TdWNoTWV0aG9kY29uY3JldGVjb25jcmV0ZVNldHRlcnNpc0ZvcndhcmRlckFsbG93ZWRpc0ZvcndhcmRlclJlcXVpcmVkYWRkUmVkaXJlY3RpbmdDb25zdHJ1Y3RvcmNvbnN0cnVjdG9yQnVpbGRlcmNvbnN0cnVjdG9yc0ZpZWxkc2V0UmVkaXJlY3RpbmdGYWN0b3J5Qm9keWluaXRpYWxpemVDbGFzc0RpcmVjdG9yeUdaaXBDb2RlY2daaXBDb2RlY2d6aXBwZWRJbml0aWFsaXplZEZyb21EYXRhdGVtcERpcmNyZWF0ZVRlbXBTeW5jLmd6Q2xhc3NNZW1iZXJQYXJzZXJEZWNsYXJhdGlvbktpbmRVdGY4Qnl0ZXNTY2FubmVyRGlyZWN0aXZlTGlzdGVuZXJFbmRPZmZzZXRMaXN0ZW5lcm5vbkNsYXNzRW5kT2Zmc2V0c2NsYXNzRW5kT2Zmc2V0c2VuZENsYXNzTWV0aG9kZ2V0T3JTZXRiZWdpblBhcmFtZW5kVG9wTGV2ZWxNZXRob2RlbmRDbGFzc0ZhY3RvcnlNZXRob2RmYWN0b3J5S2V5d29yZGVuZENsYXNzT3JNaXhpbkJvZHltZW1iZXJDb3VudGhhbmRsZU5hdGl2ZUZ1bmN0aW9uQm9keVNraXBwZWRyYXdCeXRlc21ha2VNb3JlUmVhZGFibGUvLyBAZGFydCA9IGxpc3RlbmVyY2xhc3NNZW1iZXJQYXJzZXJwYXJzZVVuaXRwcmludGVkZW5kT2ZMYXN0YWRkTGluZWJyZWFrZmFzdGEua2VybmVsX2J1aWxkZXJEZWxheWVkTWVtYmVyRGVsYXllZE92ZXJyaWRlQ2hlY2tJbXBsaWNpdEZpZWxkVHlwZVZhcmlhYmxlQnVpbGRlckltcGxMb2FkTGlicmFyeUJ1aWxkZXJpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9ySW1wbGVtZW50YXRpb25mYXN0YUNvbWJpbmF0b3JzbmFtZUxpc3RUeXBlUHJvbW90ZXJJbXBsVHlwZVNjaGVtYUVudmlyb25tZW50VHlwZUFyZ3VtZW50c0luZm9pc0luZmVycmVkZ2V0T2Zmc2V0Rm9ySW5kZXhBbGxJbmZlcnJlZFR5cGVBcmd1bWVudHNJbmZvTm9uZUluZmVycmVkVHlwZUFyZ3VtZW50c0luZm9FeHRlbnNpb25NZXRob2RUeXBlQXJndW1lbnRzSW5mb19leHRlbnNpb25UeXBlUGFyYW1ldGVyQ291bnRfZXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRDb3VudF9leHBsaWNpdFR5cGVBcmd1bWVudENvdW50X2V4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldENsYXNzSW5mZXJlbmNlSW5mb25lZWRzQ2hlY2tWaXNpdG9yZ2V0dGVyc0FuZE1ldGhvZHNJbnRlcm5hbFN0YXRlbWVudC5hY2NlcHQuYWNjZXB0MWFjY2VwdEluZmVyZW5jZUZvckluU3RhdGVtZW50V2l0aFN5bnRoZXNpemVkVmFyaWFibGV2aXNpdEZvckluU3RhdGVtZW50V2l0aFN5bnRoZXNpemVkVmFyaWFibGVUcnlTdGF0ZW1lbnR2aXNpdFRyeVN0YXRlbWVudFN3aXRjaENhc2VJbXBsQnJlYWtTdGF0ZW1lbnRJbXBsaXNDb250aW51ZUludGVybmFsRXhwcmVzc2lvbktpbmRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkJpbmFyeUludGVybmFsRXhwcmVzc2lvbktpbmQuQ2FzY2FkZUludGVybmFsRXhwcmVzc2lvbktpbmQuQ29tcG91bmRFeHRlbnNpb25JbmRleFNldEludGVybmFsRXhwcmVzc2lvbktpbmQuQ29tcG91bmRFeHRlbnNpb25TZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkNvbXBvdW5kSW5kZXhTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkNvbXBvdW5kUHJvcGVydHlTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkNvbXBvdW5kU3VwZXJJbmRleFNldEludGVybmFsRXhwcmVzc2lvbktpbmQuRGVmZXJyZWRDaGVja0ludGVybmFsRXhwcmVzc2lvbktpbmQuRXF1YWxzSW50ZXJuYWxFeHByZXNzaW9uS2luZC5FeHByZXNzaW9uSW52b2NhdGlvbkludGVybmFsRXhwcmVzc2lvbktpbmQuRXh0ZW5zaW9uSW5kZXhTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkV4dGVuc2lvblRlYXJPZmZJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkV4dGVuc2lvblNldEludGVybmFsRXhwcmVzc2lvbktpbmQuSWZOdWxsSW50ZXJuYWxFeHByZXNzaW9uS2luZC5JZk51bGxFeHRlbnNpb25JbmRleFNldEludGVybmFsRXhwcmVzc2lvbktpbmQuSWZOdWxsSW5kZXhTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLklmTnVsbFByb3BlcnR5U2V0SW50ZXJuYWxFeHByZXNzaW9uS2luZC5JZk51bGxTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLklmTnVsbFN1cGVySW5kZXhTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLkluZGV4R2V0SW50ZXJuYWxFeHByZXNzaW9uS2luZC5JbmRleFNldEludGVybmFsRXhwcmVzc2lvbktpbmQuTG9hZExpYnJhcnlUZWFyT2ZmSW50ZXJuYWxFeHByZXNzaW9uS2luZC5Mb2NhbFBvc3RJbmNEZWNJbnRlcm5hbEV4cHJlc3Npb25LaW5kLk51bGxBd2FyZUNvbXBvdW5kU2V0SW50ZXJuYWxFeHByZXNzaW9uS2luZC5OdWxsQXdhcmVFeHRlbnNpb25JbnRlcm5hbEV4cHJlc3Npb25LaW5kLk51bGxBd2FyZUlmTnVsbFNldEludGVybmFsRXhwcmVzc2lvbktpbmQuTnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbkludGVybmFsRXhwcmVzc2lvbktpbmQuTnVsbEF3YXJlUHJvcGVydHlHZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLk51bGxBd2FyZVByb3BlcnR5U2V0SW50ZXJuYWxFeHByZXNzaW9uS2luZC5QYXJlbnRoZXNpemVkSW50ZXJuYWxFeHByZXNzaW9uS2luZC5Qcm9wZXJ0eVBvc3RJbmNEZWNJbnRlcm5hbEV4cHJlc3Npb25LaW5kLlN0YXRpY1Bvc3RJbmNEZWNJbnRlcm5hbEV4cHJlc3Npb25LaW5kLlN1cGVySW5kZXhTZXRJbnRlcm5hbEV4cHJlc3Npb25LaW5kLlN1cGVyUG9zdEluY0RlY0ludGVybmFsRXhwcmVzc2lvbktpbmQuVW5hcnlCaW5hcnlDYXNjYWRlQ29tcG91bmRFeHRlbnNpb25JbmRleFNldENvbXBvdW5kRXh0ZW5zaW9uU2V0Q29tcG91bmRJbmRleFNldENvbXBvdW5kUHJvcGVydHlTZXRDb21wb3VuZFN1cGVySW5kZXhTZXREZWZlcnJlZENoZWNrRXF1YWxzRXhwcmVzc2lvbkludm9jYXRpb25FeHRlbnNpb25JbmRleFNldEV4dGVuc2lvblRlYXJPZmZFeHRlbnNpb25TZXRJZk51bGxJZk51bGxFeHRlbnNpb25JbmRleFNldElmTnVsbEluZGV4U2V0SWZOdWxsUHJvcGVydHlTZXRJZk51bGxTZXRJZk51bGxTdXBlckluZGV4U2V0SW5kZXhHZXRJbmRleFNldExvYWRMaWJyYXJ5VGVhck9mZkxvY2FsUG9zdEluY0RlY051bGxBd2FyZUNvbXBvdW5kU2V0TnVsbEF3YXJlRXh0ZW5zaW9uTnVsbEF3YXJlSWZOdWxsU2V0TnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbk51bGxBd2FyZVByb3BlcnR5R2V0TnVsbEF3YXJlUHJvcGVydHlTZXRQYXJlbnRoZXNpemVkUHJvcGVydHlQb3N0SW5jRGVjU3RhdGljUG9zdEluY0RlY1N1cGVySW5kZXhTZXRTdXBlclBvc3RJbmNEZWNVbmFyeUludGVybmFsRXhwcmVzc2lvbi5nZXRTdGF0aWNUeXBldHlwZUNvbnRleHRBcmd1bWVudHNJbXBsZm9yRXh0ZW5zaW9uTWV0aG9kZXh0ZW5zaW9uVHlwZVBhcmFtZXRlckNvdW50dHlwZVBhcmFtZXRlckNvdW50ZXh0ZW5zaW9uVHlwZUFyZ3VtZW50c2V4dGVuc2lvblR5cGVBcmd1bWVudE9mZnNldEV4dGVuc2lvbiB0eXBlIGFyZ3VtZW50cyBtdXN0IGJlIGVtcHR5IG9yIGNvbXBsZXRlLl9ub3JtYWxpemVUeXBlQXJndW1lbnRzc2V0Tm9uSW5mZXJyYWJsZUFyZ3VtZW50VHlwZXNyZW1vdmVOb25JbmZlcnJhYmxlQXJndW1lbnRUeXBlc3Zpc2l0Q2FzY2FkZXZpc2l0RGVmZXJyZWRDaGVja0V4cHJlc3Npb25KdWRnbWVudEZhY3RvcnlDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudHZpc2l0RmFjdG9yeUNvbnN0cnVjdG9ySW52b2NhdGlvbkp1ZGdtZW50RnVuY3Rpb25EZWNsYXJhdGlvbkltcGxzZXRIYXNJbXBsaWNpdFJldHVyblR5cGVJbnZhbGlkU3VwZXJJbml0aWFsaXplckp1ZGdtZW50YXJndW1lbnRzSnVkZ21lbnR2aXNpdEludmFsaWRTdXBlckluaXRpYWxpemVySnVkZ21lbnRJZk51bGxFeHByZXNzaW9udmlzaXRJZk51bGxFeHByZXNzaW9uSW5pdGlhbGl6ZXJKdWRnbWVudEludEp1ZGdtZW50YXNEb3VibGVpbnRWYWx1ZWRvdWJsZVZhbHVldG9Eb3VibGV2aXNpdEludEp1ZGdtZW50U2hhZG93TGFyZ2VJbnRMaXRlcmFsYXNJbnQ2NHZpc2l0U2hhZG93TGFyZ2VJbnRMaXRlcmFsU2hhZG93SW52YWxpZEluaXRpYWxpemVydmlzaXRTaGFkb3dJbnZhbGlkSW5pdGlhbGl6ZXJTaGFkb3dJbnZhbGlkRmllbGRJbml0aWFsaXplcnZpc2l0U2hhZG93SW52YWxpZEZpZWxkSW5pdGlhbGl6ZXJ2aXNpdEV4cHJlc3Npb25JbnZvY2F0aW9uTmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudHZpc2l0TmFtZWRGdW5jdGlvbkV4cHJlc3Npb25KdWRnbWVudHZpc2l0TnVsbEF3YXJlTWV0aG9kSW52b2NhdGlvbnZpc2l0TnVsbEF3YXJlUHJvcGVydHlHZXR2aXNpdE51bGxBd2FyZVByb3BlcnR5U2V0UmV0dXJuU3RhdGVtZW50SW1wbFNoYWRvd1R5cGVQcm9tb3RlcnByaXZhdGVnZXRWYXJpYWJsZUZ1bmN0aW9uTmVzdGluZ0xldmVsaXNQcm9tb3Rpb25DYW5kaWRhdGVrZXJuZWxWYXJpYWJsZURlY2xhcmF0aW9uc2FtZUV4cHJlc3Npb25zc2V0VmFyaWFibGVNdXRhdGVkQW55d2hlcmVtdXRhdGVkQW55d2hlcmVzZXRWYXJpYWJsZU11dGF0ZWRJbkNsb3N1cmVtdXRhdGVkSW5DbG9zdXJld2FzVmFyaWFibGVNdXRhdGVkQW55d2hlcmVpc0ltcGxpY2l0bHlUeXBlZGxhdGVHZXR0ZXJsYXRlU2V0dGVybGF0ZVR5cGVmb3JFZmZlY3RWYXJpYWJsZUdldEltcGxMb2FkTGlicmFyeUltcGx2aXNpdExvYWRMaWJyYXJ5VGVhck9mZnZpc2l0SWZOdWxsUHJvcGVydHlTZXR2aXNpdElmTnVsbFNldGV4cGxpY2l0VHlwZUFyZ3VtZW50c3Byb3BlcnR5TmFtZWJpbmFyeU5hbWVyZWFkT25seVJlY2VpdmVyYmluYXJ5T2Zmc2V0dmlzaXRDb21wb3VuZEV4dGVuc2lvblNldHZpc2l0Q29tcG91bmRQcm9wZXJ0eVNldG9uUmVhZE9ubHl2aXNpdFByb3BlcnR5UG9zdEluY0RlY3Zpc2l0TG9jYWxQb3N0SW5jRGVjdmlzaXRTdGF0aWNQb3N0SW5jRGVjdmlzaXRTdXBlclBvc3RJbmNEZWN2aXNpdEluZGV4R2V0dmlzaXRJbmRleFNldHZpc2l0U3VwZXJJbmRleFNldHZpc2l0RXh0ZW5zaW9uSW5kZXhTZXR0ZXN0T2Zmc2V0dmlzaXRJZk51bGxJbmRleFNldHZpc2l0SWZOdWxsU3VwZXJJbmRleFNldHZpc2l0SWZOdWxsRXh0ZW5zaW9uSW5kZXhTZXRmb3JQb3N0SW5jRGVjdmlzaXRDb21wb3VuZEluZGV4U2V0dmlzaXROdWxsQXdhcmVDb21wb3VuZFNldHZpc2l0TnVsbEF3YXJlSWZOdWxsU2V0dmlzaXRDb21wb3VuZFN1cGVySW5kZXhTZXR2aXNpdENvbXBvdW5kRXh0ZW5zaW9uSW5kZXhTZXR2aXNpdEV4dGVuc2lvblNldHZpc2l0TnVsbEF3YXJlRXh0ZW5zaW9uUHJvcGVydHlTZXRJbXBsdmlzaXRFeHRlbnNpb25UZWFyT2ZmRXF1YWxzRXhwcmVzc2lvbnZpc2l0RXF1YWxzdmlzaXRCaW5hcnlVbmFyeUV4cHJlc3Npb251bmFyeU5hbWV2aXNpdFVuYXJ5dmlzaXRQYXJlbnRoZXNpemVkY29tcHV0ZUNvbnN0cnVjdG9yUmV0dXJuVHlwZWdldEV4dGVuc2lvblR5cGVQYXJhbWV0ZXJDb3VudGdldEV4dGVuc2lvblR5cGVBcmd1bWVudENvdW50Z2V0RXhwbGljaXRFeHRlbnNpb25UeXBlQXJndW1lbnRzZ2V0VHlwZUFyZ3VtZW50c0luZm9nZXRFeHBsaWNpdFR5cGVBcmd1bWVudHNjaGVja1dlYkludExpdGVyYWxzRXJyb3JJZlVuZXhhY3RpbmZlcnJlcmFzSW50dG9VbnNpZ25lZG5lYXJlc3QwWGNyZWF0ZUxldGNyZWF0ZVZhcmlhYmxlY3JlYXRlVmFyaWFibGVGb3JSZXN1bHRjcmVhdGVFcXVhbHNOdWxsZXF1YWxzTWVtYmVyZmFzdGEua2VybmVsX3RhcmdldHZlcmlmeUdldFN0YXRpY1R5cGVTb3VyY2VMb2FkZXJFdmFsdWF0aW9uTW9kZUtlcm5lbENvbnN0YW50RXJyb3JSZXBvcnRlck1ldGFkYXRhQ29sbGVjdG9ybWV0YWRhdGFDb2xsZWN0b3JvYmplY3RUeXBlZXhjbHVkZVNvdXJjZWNsb25lZEZvcm1hbHNfZGVsYXllZFBhcmFtZXRlclR5cGVzY3JlYXRlTG9hZGVycGFja2FnZXNNYXB0cmFuc2xhdGVkRW50cnlQb2ludGFzU3RyaW5ncmVtb3ZlRnJhZ21lbnRjb2xsZWN0TXlDbGFzc2VzY3JlYXRlVHlwZUluZmVyZW5jZUVuZ2luZXJlc29sdmVQYXJ0c2NvbXB1dGVMaWJyYXJ5U2NvcGVzc2V0dXBUb3BBbmRCb3R0b21UeXBlc3Jlc29sdmVUeXBlc215Q2xhc3Nlc2NoZWNrU2VtYW50aWNzaW5zdGFsbERlZmF1bHRTdXBlcnR5cGVzaW5zdGFsbFN5bnRoZXRpY0NvbnN0cnVjdG9yc2xpbmtjb21wdXRlQ29yZVR5cGVzYnVpbGRDbGFzc0hpZXJhcmNoeWNvbXB1dGVIaWVyYXJjaHlwZXJmb3JtVG9wTGV2ZWxJbmZlcmVuY2VjaGVja1R5cGVzY2hlY2tPdmVycmlkZXNjaGVja0Fic3RyYWN0TWVtYmVyc2NoZWNrTWl4aW5zX3VwZGF0ZURlbGF5ZWRQYXJhbWV0ZXJUeXBlc2luc3RhbGxBbGxDb21wb25lbnRQcm9ibGVtc2FsbENvbXBvbmVudFByb2JsZW1zQnVpbGRpbmcgY29tcG9uZW50YnVpbGRCb2RpZXNmaW5pc2hDbG9uZWRQYXJhbWV0ZXJzZmluaXNoTm9TdWNoTWV0aG9kRm9yd2FyZGVyc2ZpbmlzaEFsbENvbnN0cnVjdG9yc3J1bkJ1aWxkVHJhbnNmb3JtYXRpb25zZm9ybWF0dGVkTWVzc2FnZWNvcHlTb3VyY2VMaW5rZWQgY29tcG9uZW50SW5zdGFsbGVkIE9iamVjdCBhcyBpbXBsaWNpdCBzdXBlcmNsYXNzaW5zdGFsbEZvcndhcmRpbmdDb25zdHJ1Y3RvcnNpbnN0YWxsRGVmYXVsdENvbnN0cnVjdG9ySW5zdGFsbGVkIHN5bnRoZXRpYyBjb25zdHJ1Y3RvcnNkZWxheWVkUGFyYW1ldGVyVHlwZXVwZGF0ZVR5cGVtYWtlRGVmYXVsdENvbnN0cnVjdG9ybWFrZU1peGluQXBwbGljYXRpb25Db25zdHJ1Y3RvcmNvcHlGb3JtYWxtYWtlQ29uc3RydWN0b3JSZXR1cm5UeXBlQ2xvbmVkIGRlZmF1bHQgdmFsdWVzIG9mIGZvcm1hbHNudWxsQ2xhc3NCdWlsZGVycGxhdGZvcm1MaWJyYXJ5Zm91bmRtaXJyb3JzQ2FuJ3QgZmluZCBwbGF0Zm9ybUxpYnJhcmllc2ZpbmlzaENvbnN0cnVjdG9yc0ZpbmlzaGVkIGNvbnN0cnVjdG9yc3VuaW5pdGlhbGl6ZWRGaWVsZHNub25GaW5hbEZpZWxkc2xhdGVGaW5hbEZpZWxkc2NvbnN0cnVjdG9ySW5pdGlhbGl6ZWRGaWVsZHNteUluaXRpYWxpemVkRmllbGRzZGFydDpodG1sZGFydDpzdmdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YWRhcnQ6X2ludGVyY2VwdG9yc2pzX3N0cmluZy5kYXJ0bXNnZXZhbHVhdGlvbk1vZGVFdmFsdWF0aW9uTW9kZS5zdHJvbmdFdmFsdWF0aW9uTW9kZS53ZWFrRXZhbHVhdGlvbk1vZGUubGVnYWN5ZGVzdWdhclNldHNFdmFsdWF0ZWQgY29uc3RhbnRzVmVyaWZpZWQgY29tcG9uZW50cmVhZFBhdGNoRmlsZXNwYXJ0T2Zmc2V0c3BhcnRPZlVyaUtlcm5lbERpYWdub3N0aWNSZXBvcnRlckRlbGF5ZWRQYXJhbWV0ZXJUeXBlTm8gdHlwZSBjb21wdXRlZCBmb3IgZGVmYXVsdFN1cGVyQ29uc3RydWN0b3JmYXN0YS5saWJyYXJ5X2dyYXBodXJpMWZhc3RhLnNvdXJjZV9saWJyYXJ5X2J1aWxkZXJyZXNvbHZlUmVsYXRpdmVVcmlmaW5kVHlwZUFyZ3VtZW50SXNzdWVzRm9ySW52b2NhdGlvbmZpbmRHZW5lcmljRnVuY3Rpb25UeXBlc2dldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JEZWNsYXJhdGlvbmdldE5vblNpbXBsaWNpdHlJc3N1ZXNGb3JUeXBlVmFyaWFibGVzcGVuZGluZ1ZhcmlhbmNlaGFzQ29uc3RDb25zdHJ1Y3Rvck1hc2toYXNJbml0aWFsaXplck1hc2tpbml0aWFsaXppbmdGb3JtYWxNYXNrbWl4aW5EZWNsYXJhdGlvbk1hc2tzdGF0aWNNYXNraW5kZXhTZXROYW1lVHlwZUluZmVycmVySW1wbFNvdXJjZUV4dGVuc2lvbkJ1aWxkZXJNQUxGT1JNRURfVVJJX1NDSEVNRWxpYnJhcnlEZWNsYXJhdGlvbmltcGxlbWVudGF0aW9uQnVpbGRlcnNhY2Nlc3NvcnNkb2N1bWVudGF0aW9uQ29tbWVudHBhcnRPZk5hbWVjdXJyZW50VHlwZVBhcmFtZXRlclNjb3BlQnVpbGRlcmNhbkFkZEltcGxlbWVudGF0aW9uQnVpbGRlcnNhY2Nlc3NQcm9ibGVtbmF0aXZlTWV0aG9kc2JvdW5kbGVzc1R5cGVWYXJpYWJsZXNfbmFtZU9yaWdpbl9jdXJyZW50Q2xhc3NSZWZlcmVuY2VzRnJvbUluZGV4ZWRfaW1wbGljaXRseVR5cGVkRmllbGRzX2xhbmd1YWdlVmVyc2lvbnBvc3Rwb25lZFByb2JsZW1zSXNzdWVkcG9zdHBvbmVkUHJvYmxlbXNfcHJlZml4QnVpbGRlcnNfZXh0ZW5zaW9uc0luU2NvcGVvcHRPdXRQYWNrYWdlc19mZV9hbmFseXplcl9zaGFyZWRhbmFseXNpc19zZXJ2ZXJhbmFseXNpc19zZXJ2ZXJfY2xpZW50YW5hbHlzaXNfdG9vbGFuYWx5emVyX2NsaWFuYWx5emVyX2ZlX2NvbXBhcmlzb25hbmFseXplcl9wbHVnaW5hc3luY19oZWxwZXJiYXplbF93b3JrZXJiZW5jaG1hcmtfaGFybmVzc2Jvb2xlYW5fc2VsZWN0b3JidWlsZF9pbnRlZ3JhdGlvbmNoYXJjb2RlY2xpX3V0aWxjb21waWxlcmNyeXB0b2Nzc2xpYmRhcnQyanNfaW5mb2RhcnQyanNfdG9vbHNkYXJ0Mm5hdGl2ZWRhcnRfaW50ZXJuYWxkYXJ0X3N0eWxlZGFydGZpeGRldl9jb21waWxlcmRpYWdub3N0aWNleHBlY3RmZmlmaXhudW1mcm9udGVuZF9zZXJ2ZXJmcm9udF9lbmRnYXJkZW5pbmdnbG9iaHRtbGh0dHBfaW9odHRwX211bHRpX3NlcnZlcmh0dHBfcGFyc2VyaHR0cF9yZXRyeWh0dHBfdGhyb3R0bGVpbnRsanNfYXN0anNfcnVudGltZWpzb25fcnBjXzJsaW50ZXJsb2dnaW5nbWFya2Rvd25taW1lbW9ja2l0b21vZHVsYXJfdGVzdG11c3RhY2hlbmF0aXZlX3N0YWNrX3RyYWNlc25uYmRfbWlncmF0aW9ub2F1dGgyb2JzZXJ2YXRvcnlvYnNlcnZhdG9yeV90ZXN0X3BhY2thZ2VwYWNrYWdlX3Jlc29sdmVycGVkYW50aWNwb29scHJvdG9idWZwdWJwdWJfc2VtdmVycXVpdmVycmVzb3VyY2VzZGtfbGlicmFyeV9tZXRhZGF0YXNoZWxmc2hlbGZfcGFja2FnZXNfaGFuZGxlcnNoZWxmX3N0YXRpY3NoZWxmX3dlYl9zb2NrZXRzbWl0aHNvdXJjZV9tYXBfc3RhY2tfdHJhY2Vzb3VyY2VtYXBfdGVzdGluZ3NvdXJjZV9tYXBzc291cmNlX3NwYW5zdGFja190cmFjZXN0YXR1c19maWxlc3RyZWFtX2NoYW5uZWxzdHJpbmdfc2Nhbm5lcnRlbGVtZXRyeXRlcm1fZ2x5cGh0ZXN0X2FwaXRlc3RfY29yZXRlc3RfZGVzY3JpcHRvcnRlc3RfcHJvY2Vzc3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXJ0ZXN0X3J1bm5lcnRlc3Rpbmd0ZmxpdGVfbmF0aXZldW5pdHRlc3R2bV9zZXJ2aWNld2F0Y2hlcndlYl9jb21wb25lbnRzd2ViX3NvY2tldF9jaGFubmVseWFtbG9wdE91dFRlc3RQYXRocy90ZXN0cy9jbzE5XzIvdGVzdHMvY29yZWxpYl8yL3Rlc3RzL2xhbmd1YWdlXzIvdGVzdHMvbGliXzIvdGVzdHMvc3RhbmRhbG9uZV8yL2dlbmVyYXRlZF90ZXN0cy9jbzE5XzIvZ2VuZXJhdGVkX3Rlc3RzL2NvcmVsaWJfMi9nZW5lcmF0ZWRfdGVzdHMvbGFuZ3VhZ2VfMi9nZW5lcmF0ZWRfdGVzdHMvbGliXzIvZ2VuZXJhdGVkX3Rlc3RzL3N0YW5kYWxvbmVfMmZyb21TY29wZXN0b1Njb3BlY3VycmVudFNka1ZlcnNpb25NYWpvcmN1cnJlbnRTZGtWZXJzaW9uTWlub3Jpc09wdE91dFBhY2thZ2Vpc09wdE91dFRlc3QvdGVzdHMvL2dlbmVyYXRlZF90ZXN0cy90ZXN0RGlyaXNFeHBsaWNpdGFkZFBvc3Rwb25lZFByb2JsZW1hZGRDb25zdHJ1Y3RvclJlZmVyZW5jZWJlZ2luTmVzdGVkRGVjbGFyYXRpb25oYXNNZW1iZXJzY3JlYXRlTmVzdGVkZW5kTmVzdGVkRGVjbGFyYXRpb25VbmV4cGVjdGVkIGRlY2xhcmF0aW9uLiBUcnlpbmcgdG8gZW5kIGEgIGFzIGEgPHN5bnRheC1lcnJvcj51cmlJc1ZhbGlkdXJpT2Zmc2V0cGFyc2VkVXJpY29tcHV0ZUFuZFZhbGlkYXRlQ29uc3RydWN0b3JOYW1lYWRkRXhwb3J0bG9va3VwSW1wb3J0Q29uZGl0aW9uZG90dGVkTmFtZWV4cG9ydGVkTGlicmFyeXJlc29sdmVkVXJpbmF0aXZlUGF0aGRhcnQtZXh0OnN0cmlwcGVkVXJpdHJhbnNsYXRlVXJpZGFydC1leHRhZGRQYXJ0T2ZhZGRGaWVsZHNmaWVsZEluZm9zcG90ZW50aWFsbHlOZWVkSW5pdGlhbGl6ZXJJbk91dGxpbmVpbml0aWFsaXplclRva2VuYmVmb3JlTGFzdGNvbnN0SW5pdGlhbGl6ZXJUb2tlbmlzRHVwbGljYXRlZERlY2xhcmF0aW9uZnVsbE5hbWVhbGlhc2VkQnVpbGRlcmJ1aWxkQnVpbGRlcmFkZERlcGVuZGVuY2llc3NldERvY3VtZW50YXRpb25Db21tZW50YWRkSW1wbGVtZW50YXRpb25CdWlsZGVydmFsaWRhdGVQYXJ0dXNlZFBhcnRzaW5jbHVkZVBhcnRzc2VlblBhcnRzcGFydE9mZnNldGluY2x1ZGVQYXJ0cGFydERlY2xhcmF0aW9uc2R1cGxpY2F0ZWRwYXJ0SW1wbGljaXRseVR5cGVkRmllbGRzYnVpbGRJbml0aWFsU2NvcGVzZXhwbGljaXRDb3JlSW1wb3J0bWVtYmVyTGFzdHR5cGVDb3VudGFkZFByb2JsZW1BdEFjY2Vzc29yc2FkZE5hbWVkVHlwZWFkZE1peGluQXBwbGljYXRpb25taXhpbnNhZGRWb2lkVHlwZWlzc3VlUG9zdHBvbmVkUHJvYmxlbXNwb3N0cG9uZWRQcm9ibGVtc3VwZXJ0eXBlT2Zmc2V0X2FkZENsYXNzVHlwZVBhcmFtZXRlclNjb3BlS2luZC5jbGFzc0RlY2xhcmF0aW9uYWRkTWl4aW5EZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJTY29wZUtpbmQubWl4aW5EZWNsYXJhdGlvbmNsYXNzU2NvcGVjb25zdHJ1Y3RvclNjb3BlcmVmZXJlbmNlc0Zyb21DbGFzc2FwcGx5TWl4aW5zdHlwZVZhcmlhYmxlc0J5TmFtZWNoZWNrVHlwZVZhcmlhYmxlc3NldFBhcmVudHNldFBhcmVudEFuZENoZWNrQ29uZmxpY3RzdHZvd25lcmlzRXh0ZW5zaW9uVHlwZVBhcmFtZXRlcmFkZEV4dGVuc2lvbkRlY2xhcmF0aW9uZXh0ZW5zaW9uTmFtZVR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZXh0ZW5zaW9uRGVjbGFyYXRpb25leHRlbnNpb24gc3ViY2xhc3NOYW1ldW5uYW1lZCBtaXhpbiBhcHBsaWNhdGlvbnJ1bm5pbmdOYW1ldHlwZVZhcmlhYmxlTmFtZXN0eXBlVmFyaWFibGV1c2VzVHlwZVZhcmlhYmxlc2lzR2VuZXJpY2Z1bGxuYW1lYXBwbGljYXRpb25UeXBlVmFyaWFibGVzYXBwbGljYXRpb25UeXBlQXJndW1lbnRzVHlwZVBhcmFtZXRlclNjb3BlS2luZC51bm5hbWVkTWl4aW5BcHBsaWNhdGlvbm1peGluIGFwcGxpY2F0aW9uY29weVR5cGVWYXJpYWJsZXNtaXhpbkRlY2xhcmF0aW9uY29tcHV0ZWRTdGFydENoYXJPZmZzZXRyZWZlcmVuY2VzRnJvbUluZGV4ZWRDbGFzc2FwcGxpY2F0aW9ubWl4aW4gYWRkTmFtZWRNaXhpbkFwcGxpY2F0aW9ubWl4aW5BcHBsaWNhdGlvblR5cGVQYXJhbWV0ZXJTY29wZUtpbmQubmFtZWRNaXhpbkFwcGxpY2F0aW9ubGF0ZUlzU2V0UmVmZXJlbmNlRnJvbWdldHRlclJlZmVyZW5jZUZyb21zZXR0ZXJSZWZlcmVuY2VGcm9tZmllbGRJc0xhdGVXaXRoTG93ZXJpbmduYW1lVG9Mb29rdXBGaWVsZE5hbWVUeXBlLkZpZWxkRmllbGROYW1lVHlwZS5Jc1NldEZpZWxkRmllbGROYW1lVHlwZS5HZXR0ZXJGaWVsZE5hbWVUeXBlLlNldHRlcnJlZ2lzdGVySW1wbGljaXRseVR5cGVkRmllbGRhZGRDb25zdHJ1Y3RvcmNoYXJPcGVuUGFyZW5PZmZzZXRuYXRpdmVNZXRob2ROYW1lc2V0Q29uc3RydWN0b3JOYW1lT2Zmc2V0YWRkTmF0aXZlTWV0aG9kdGVhck9mZlJlZmVyZW5jZUZyb21leHRlbnNpb25Jc1N0YXRpY3RlYXJPZmZOYW1lVG9Mb29rdXBwcm9jZWR1cmVCdWlsZGVyYWRkRmFjdG9yeU1ldGhvZGZhY3RvcnlEZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJTY29wZUtpbmQuZmFjdG9yeU1ldGhvZCNmYWN0b3J5X21ldGhvZHByb2NlZHVyZU5hbWVzYXZlZERlY2xhcmF0aW9uYWRkRW51bWVudW1Db25zdGFudEluZm9zYWRkRnVuY3Rpb25UeXBlQWxpYXN0eXBlZGVmQnVpbGRlclR5cGVQYXJhbWV0ZXJTY29wZUtpbmQudHlwZWRlZiN0eXBlZGVmYWRkRnVuY3Rpb25UeXBlVHlwZVBhcmFtZXRlclNjb3BlS2luZC5mdW5jdGlvblR5cGUjZnVuY3Rpb25fdHlwZWFkZEZvcm1hbFBhcmFtZXRlcmhhc1RoaXNhZGRUeXBlVmFyaWFibGVmaW5kRHVwbGljYXRlU3VmZml4YWRkTWVtYmVyc1RvTGlicmFyeWFkZE5hdGl2ZURlcGVuZGVuY3lnZXROYXRpdmVBbm5vdGF0aW9uZXhwb3J0SW5kZXhpc0xvYWRMaWJyYXJ5cHJlZmVycmVkb3RoZXJVcmlwcmVmZXJyZWRVcmloaWRkZW5VcmlidWlsZGVyVGVtcGxhdGV0b3RhbGxvYWRMaWJyYXJ5QnVpbGRlcmZvcndhcmRlcmZvcndhcmRlclBhcmFtZXRlcm9yaWdpbk5hbWVkTWFwb3JpZ2luTmFtZWRmb3J3YXJkZXJOYW1lZGJlY29tZU5hdGl2ZXZhcmlhYmxlVmFyaWFuY2Vjb21wdXRlRGVmYXVsdFR5cGVzRm9yVmFyaWFibGVzaW5FcnJvclJlY292ZXJ5aGF2ZUVycm9uZW91c0JvdW5kc2dlbmVyaWNGdW5jdGlvblR5cGVzcmVwb3J0SXNzdWVzcGVyZm9ybUVycm9yUmVjb3ZlcnlvcmlnaW5EZWNsYXJhdGlvbnNwYXRjaERlY2xhcmF0aW9uc2luamVjdE1lbWJlckZyb21QYXRjaGV4cG9ydE1lbWJlckZyb21QYXRjaHJlcG9ydFR5cGVBcmd1bWVudElzc3Vlc3R5cGVBcmd1bWVudHNJbmZvdGFyZ2V0UmVjZWl2ZXJpc3N1ZUluZmVycmVkZW5jbG9zaW5nTmFtZXBlcmZvcm1Jbml0aWFsaXplckNoZWNrc2lzT3B0aW9uYWxQb3NpdGlvbmFsaXNQb3NpdGlvbmFsaXNPcHRpb25hbE5hbWVkaXNOYW1lZFJlcXVpcmVkY2hlY2tCb3VuZHNJblN0YXRpY0ludm9jYXRpb25jaGVja0JvdW5kc0luTWV0aG9kSW52b2NhdGlvbm1ldGhvZFBhcmFtZXRlcnNpbnN0YW50aWF0ZWRNZXRob2RQYXJhbWV0ZXJzZm9yRWFjaEV4dGVuc2lvbkluU2NvcGVzZXRDdXJyZW50Q2xhc3NOYW1lbG9va3VwTGlicmFyeVJlZmVyZW5jZVByb2NlZHVyZVR5cGVQYXJhbWV0ZXJTY29wZUtpbmRUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmxpYnJhcnlUeXBlUGFyYW1ldGVyU2NvcGVLaW5kLmNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb25UeXBlUGFyYW1ldGVyU2NvcGVLaW5kLnN0YXRpY09ySW5zdGFuY2VNZXRob2RPckNvbnN0cnVjdG9yVHlwZVBhcmFtZXRlclNjb3BlS2luZC50b3BMZXZlbE1ldGhvZGNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb251bm5hbWVkTWl4aW5BcHBsaWNhdGlvbm5hbWVkTWl4aW5BcHBsaWNhdGlvbmV4dGVuc2lvbkRlY2xhcmF0aW9uc3RhdGljT3JJbnN0YW5jZU1ldGhvZE9yQ29uc3RydWN0b3J0b3BMZXZlbE1ldGhvZGZhY3RvcnlNZXRob2RmdW5jdGlvblR5cGVUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyX2tpbmRfY2hhck9mZnNldF90eXBlVmFyaWFibGVzX2V4dGVuc2lvblRoaXNUeXBlPGxpYnJhcnk+bWFya0FzQ2xhc3NEZWNsYXJhdGlvblVuZXhwZWN0ZWQgZGVjbGFyYXRpb24ga2luZDogbWFya0FzTmFtZWRNaXhpbkFwcGxpY2F0aW9ubWFya0FzTWl4aW5EZWNsYXJhdGlvbm1hcmtBc0V4dGVuc2lvbkRlY2xhcmF0aW9ucmVnaXN0ZXJFeHRlbnNpb25UaGlzVHlwZURlY2xhcmF0aW9uQnVpbGRlci5yZWdpc3RlckV4dGVuc2lvblRoaXNUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgRXh0ZW5zaW9uIHRoaXMgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHNldC5leHRlbnNpb25UaGlzVHlwZURlY2xhcmF0aW9uQnVpbGRlci5leHRlbnNpb25UaGlzVHlwZSBub3Qgc3VwcG9ydGVkIG9uIERlY2xhcmF0aW9uQnVpbGRlci5leHRlbnNpb25UaGlzVHlwZSBoYXMgbm90IGJlZW4gc2V0IG9uIG5hbWVPclF1YWxpZmllZGVuZENoYXJPZmZzZXRidWlsZEludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyRGVjbGFyYXRpb25CdWlsZGVyKDpraW5kPSxuYW1lPUZpZWxkSW5mb0ltcGxlbWVudGF0aW9uSW5mb1Bvc3Rwb25lZFByb2JsZW1MYW5ndWFnZVZlcnNpb25MYW5ndWFnZVZlcnNpb24obWFqb3I9LG1pbm9yPSxpc0V4cGxpY2l0PWZpbGVVcmk9LGNoYXJPZmZzZXQ9LGNoYXJDb3VudD1JbXBsaWNpdExhbmd1YWdlVmVyc2lvbkltcGxpY2l0TGFuZ3VhZ2VWZXJzaW9uKCllbmFibGVOb25OdWxsYWJsZURlZmF1bHRNYWpvclZlcnNpb25lbmFibGVOb25OdWxsYWJsZURlZmF1bHRNaW5vclZlcnNpb25jb21wdXRlTGlicmFyeVVyaW5vIGxpYnJhcnkgcGFyZW50ZXh0cmFjdE5hbWVmYXN0YS5jcmFzaENvbnRlbnRUeXBlSHR0cENsaWVudEh0dHBDbGllbnRSZXF1ZXN0U29ja2V0RXhjZXB0aW9uQ3Jhc2ggd2hlbiBjb21waWxpbmcgLAphdCBjaGFyYWN0ZXIgb2Zmc2V0IDoKZGVmYXVsdFNlcnZlckFkZHJlc3NodHRwOi8vMTI3LjAuMC4xOjU5NDEwL2hhc0NyYXNoZWRmaXJzdFNvdXJjZVVyaXJlc2V0Q3Jhc2hSZXBvcnRpbmdyZXBvcnRDcmFzaDpzYXZlZF90cnlfY29udGV4dF92YXIybm90ZWNyYXNoY2xpZW50cGFja2FnZTpmYXN0YXNlcnZlclVyaXBvc3RVcmwKU2VuZGluZyBjcmFzaCByZXBvcnQgZGF0YXBlcnNpc3RlbnRDb25uZWN0aW9uYnVmZmVyT3V0cHV0Y29ubmVjdGlvbkluZm9yZW1vdGVBZGRyZXNzcmVtb3RlUG9ydGhlYWRlcnNjb250ZW50VHlwZQoKCkZFOjpFUlJPUjo6CgoKRXJyb3Igd2hlbiBjb252ZXJ0aW5nICB0byBzdHJpbmcuY3VycmVudFVyaWZhc3RhLmtlcm5lbF9hcGlpbnN0YW50aWF0ZVRvQm91bmRzcHJpbnROb2RlT25wcmludFF1YWxpZmllZE5hbWVPbmZhc3RhLnZlcmlmaWVyVmVyaWZ5aW5nVmlzaXRvckZhc3RhVmVyaWZ5aW5nVmlzaXRvcnNraXBQbGF0Zm9ybWlzT3V0bGluZWFmdGVyQ29uc3RjaGVja0xvY2F0aW9uJyBoYXMgbm8gZmlsZVVyaScgaGFzIG5vIGZpbGVPZmZzZXRjaGVja1N1cGVySW52b2NhdGlvbmNvbnRhaW5pbmdNZW1iZXJnZXRDb250YWluaW5nTWVtYmVyU3VwZXIgY2FsbCBvdXRzaWRlIG9mIGFueSBtZW1iZXJTdXBlciBjYWxsIGluIGEgbWVtYmVyIGxhY2tpbmcgVHJhbnNmb3JtZXJGbGFnLnN1cGVyQ2FsbHNObyBvZmZzZXQgZm9yIGlzTnVsbFR5cGVVbmV4cGVjdGVkIGFwcGVhcmFuY2Ugb2YgdGhlIHVua25vd24gdHlwZS5uZXZlckxlZ2FjeWV4cGVjdGVkTGVnYWN5Rm91bmQgYSBub24tbGVnYWN5IHR5cGUgJycgaW4gYW4gb3B0ZWQtb3V0IGxpYnJhcnkubm9kZU51bGxhYmlsaXR5Rm91bmQgYSBsZWdhY3kgdHlwZSAnJyBpbiBhbiBvcHRlZC1pbiBsaWJyYXJ5LlR5cGUgcGFyYW1ldGVycyBvZiBmdW5jdGlvbiB0eXBlcyBzaG91bGRuJ3QgaGF2ZSBwYXJlbnRzOiBGb3VuZCBhIG5vdCBudWxsYWJsZSBOdWxsIHR5cGU6IEF0dGVtcHQgdG8gaW52b2tlIHJlZGlyZWN0aW5nIGZhY3RvcnkudmVyaWZpZXJmYXN0YS5sb2FkZXJRdWV1ZXVucGFyc2VkTGlicmFyaWVzdW5oYW5kbGVkRXJyb3Jzb3V0bGluZVN1bW1hcnlUZW1wbGF0ZWlzU291cmNlTG9hZGVycGFja2FnZUZyYWdtZW50b3JnLWRhcnRsYW5nLXVudHJhbnNsYXRhYmxlLXVyaWhhc1BhY2thZ2VTcGVjaWZpZWRMYW5ndWFnZVZlcnNpb25wYWNrYWdlU3BlY2lmaWVkTGFuZ3VhZ2VWZXJzaW9uTWFqb3JwYWNrYWdlU3BlY2lmaWVkTGFuZ3VhZ2VWZXJzaW9uTWlub3Jwcm9wZXJ0aWVzZm91bmRFbnRyaWVzcHJvcGVydHlkYXJ0PWxhbmd1YWdlVmVyc2lvblN0cmluZ2RvdFNlcGFyYXRlZFBhcnRzY3JlYXRlTGlicmFyeUJ1aWxkZXIgZm9yIHVyaSBmaWxlVXJpICByZXR1cm5lZCBudWxsLmxvYWRFeHRyYVJlcXVpcmVkTGlicmFyaWVzZW5zdXJlQ29yZUxpYnJhcnlsb2dTdW1tYXJ5YnVpbGRPdXRsaW5laW5NaWNyb3NlY29uZHNhZGRNZXNzYWdlZml4U2V2ZXJpdHltZXNzYWdlOiAKY2hhck9mZnNldDogCmZpbGVVcmk6IApzZXZlcml0eTogY3JlYXRlRm9ybWF0dGVkTWVzc2FnZWdldENvbXBpbGVUaW1lRXJyb3Jjb21wdXRlQ2xhc3NCdWlsZGVyRnJvbVRhcmdldENsYXNzY3JlYXRlQm9keUJ1aWxkZXJGb3JPdXRsaW5lRXhwcmVzc2lvbnVudHJhbnNsYXRhYmxlVXJpU2NoZW1lY2hhcmNvZGUuYXNjaWkuZG9sbGFyX2xvd2VyY2FzZSRudWwkc29oJHN0eCRldHgkZW90JGVucSRhY2skYmVsJGJzJGh0JHRhYiRsZiR2dCRmZiRjciRzbyRzaSRkbGUkZGMxJGRjMiRkYzMkZGM0JG5hayRzeW4kZXRiJGNhbiRlbSRzdWIkZXNjJGZzJGdzJHJzJHVzJGRlbCRzcGFjZSRleGNsYW1hdGlvbiRxdW90JHF1b3RlJGRvdWJsZV9xdW90ZSRxdW90YXRpb24kaGFzaCQkJGRvbGxhciRwZXJjZW50JGFtcCRhbXBlcnNhbmQkYXBvcyRhcG9zdHJvcGhlJHNpbmdsZV9xdW90ZSRscGFyZW4kb3Blbl9wYXJlbiRvcGVuX3BhcmVudGhlc2lzJHJwYXJlbiRjbG9zZV9wYXJlbiRjbG9zZV9wYXJlbnRoZXNpcyRhc3RlcmlzayRwbHVzJGNvbW1hJG1pbnVzJGRhc2gkZG90JGZ1bGxzdG9wJHNsYXNoJHNvbGlkdXMkZGl2aXNpb24kMCQxJDIkMyQ0JDUkNiQ3JDgkOSRjb2xvbiRzZW1pY29sb24kbHQkbGVzc190aGFuJGxhbmdsZSRvcGVuX2FuZ2xlJGVxdWFsJGd0JGdyZWF0ZXJfdGhhbiRyYW5nbGUkY2xvc2VfYW5nbGUkcXVlc3Rpb24kYXQkQSRCJEMkRCRFJEYkRyRIJEkkSiRLJEwkTSROJE8kUCRRJFIkUyRUJFUkViRXJFgkWSRaJGxicmFja2V0JG9wZW5fYnJhY2tldCRiYWNrc2xhc2gkcmJyYWNrZXQkY2xvc2VfYnJhY2tldCRjaXJjdW1mbGV4JGNhcmV0JGhhdCRfJHVuZGVyc2NvcmUkdW5kZXJsaW5lJGJhY2txdW90ZSRncmF2ZSRhJGIkYyRkJGUkZiRnJGgkaSRqJGskbCRtJG4kbyRwJHEkciRzJHQkdSR2JHckeCR5JHokbGJyYWNlJG9wZW5fYnJhY2UkcGlwZSRiYXIkcmJyYWNlJGNsb3NlX2JyYWNlJHRpbGRlcGFja2FnZV9jb25maWcudXRpbF92YWxpZFBhY2thZ2VOYW1lQ2hhcmFjdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uIDAxMjM0NTY3ODkgOyA9ICBAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogICAgXyBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiAgIH4gX2ZpbmRJbnZhbGlkQ2hhcmFjdGVybm9uRG90Tm90IGEgcGFja2FnZTogVVJJUGFja2FnZSBVUklzIG11c3Qgbm90IGhhdmUgYSBob3N0IHBhcnRQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIHF1ZXJ5IHBhcnRQYWNrYWdlIFVSSXMgbXVzdCBub3QgaGF2ZSBhIGZyYWdtZW50IHBhcnRQYWNrYWdlIFVSSXMgbXVzdCBub3Qgc3RhcnQgd2l0aCBhICcvJ1BhY2thZ2UgVVJJcyBtdXN0IHN0YXJ0IHdpdGggdGhlIHBhY2thZ2UgbmFtZSBmb2xsb3dlZCBieSBhICcvJ2JhZEluZGV4UGFja2FnZSBuYW1lcyBtdXMgYmUgbm9uLWVtcHR5UGFja2FnZSBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi0nLicgY2hhcmFjdGVyYmFkQ2hhckNvZGViYWRDaGFyUGFja2FnZSBuYW1lcyBtdXN0IG5vdCBjb250YWluIF9mZV9hbmFseXplcl9zaGFyZWQuc2Nhbm5lci5jaGFyYWN0ZXJzJEVPRiRTVFgkQlMkTEYkVlRBQiRGRiRDUiRCQU5HJERRJEhBU0gkUEVSQ0VOVCRBTVBFUlNBTkQkU1EkT1BFTl9QQVJFTiRDTE9TRV9QQVJFTiRTVEFSJFBMVVMkQ09NTUEkTUlOVVMkUEVSSU9EJFNMQVNIJENPTE9OJFNFTUlDT0xPTiRMVCRFUSRHVCRRVUVTVElPTiRBVCRPUEVOX1NRVUFSRV9CUkFDS0VUJEJBQ0tTTEFTSCRDTE9TRV9TUVVBUkVfQlJBQ0tFVCRCQUNLUElORyRPUEVOX0NVUkxZX0JSQUNLRVQkQkFSJENMT1NFX0NVUkxZX0JSQUNLRVQkVElMREUkREVMJE5CU1AkTFMkUFMkRklSU1RfU1VSUk9HQVRFJExBU1RfU1VSUk9HQVRFJExBU1RfQ09ERV9QT0lOVGlzRGlnaXRjaGFyYWN0ZXJDb2RlaXNIZXhEaWdpdGhleERpZ2l0VmFsdWVoZXhEaWdpdGlzVW5pY29kZVNjYWxhclZhbHVlaXNVdGYxNkxlYWRTdXJyb2dhdGVpc1V0ZjE2VHJhaWxTdXJyb2dhdGVfZmVfYW5hbHl6ZXJfc2hhcmVkLnNjYW5uZXIudG9rZW5fY29uc3RhbnRzRU9GX1RPS0VOS0VZV09SRF9UT0tFTlNDUklQVF9UT0tFTkJBRF9JTlBVVF9UT0tFTkRPVUJMRV9UT0tFTklOVF9UT0tFTlJFQ09WRVJZX1RPS0VOSEVYQURFQ0lNQUxfVE9LRU5TVFJJTkdfVE9LRU5BTVBFUlNBTkRfVE9LRU5CQUNLUElOR19UT0tFTkJBQ0tTTEFTSF9UT0tFTkJBTkdfVE9LRU5CQVJfVE9LRU5DT0xPTl9UT0tFTkNPTU1BX1RPS0VORVFfVE9LRU5HVF9UT0tFTkhBU0hfVE9LRU5PUEVOX0NVUkxZX0JSQUNLRVRfVE9LRU5PUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOT1BFTl9QQVJFTl9UT0tFTkxUX1RPS0VOTUlOVVNfVE9LRU5QRVJJT0RfVE9LRU5QTFVTX1RPS0VOUVVFU1RJT05fVE9LRU5BVF9UT0tFTkNMT1NFX0NVUkxZX0JSQUNLRVRfVE9LRU5DTE9TRV9TUVVBUkVfQlJBQ0tFVF9UT0tFTkNMT1NFX1BBUkVOX1RPS0VOU0VNSUNPTE9OX1RPS0VOU0xBU0hfVE9LRU5USUxERV9UT0tFTlNUQVJfVE9LRU5QRVJDRU5UX1RPS0VOQ0FSRVRfVE9LRU5TVFJJTkdfSU5URVJQT0xBVElPTl9UT0tFTkxUX0VRX1RPS0VORlVOQ1RJT05fVE9LRU5TTEFTSF9FUV9UT0tFTlBFUklPRF9QRVJJT0RfUEVSSU9EX1RPS0VOUEVSSU9EX1BFUklPRF9UT0tFTkVRX0VRX0VRX1RPS0VORVFfRVFfVE9LRU5MVF9MVF9FUV9UT0tFTkxUX0xUX1RPS0VOR1RfRVFfVE9LRU5HVF9HVF9FUV9UT0tFTklOREVYX0VRX1RPS0VOSU5ERVhfVE9LRU5CQU5HX0VRX0VRX1RPS0VOQkFOR19FUV9UT0tFTkFNUEVSU0FORF9BTVBFUlNBTkRfVE9LRU5BTVBFUlNBTkRfQU1QRVJTQU5EX0VRX1RPS0VOQU1QRVJTQU5EX0VRX1RPS0VOQkFSX0JBUl9UT0tFTkJBUl9CQVJfRVFfVE9LRU5CQVJfRVFfVE9LRU5TVEFSX0VRX1RPS0VOUExVU19QTFVTX1RPS0VOUExVU19FUV9UT0tFTk1JTlVTX01JTlVTX1RPS0VOTUlOVVNfRVFfVE9LRU5USUxERV9TTEFTSF9FUV9UT0tFTlRJTERFX1NMQVNIX1RPS0VOUEVSQ0VOVF9FUV9UT0tFTkdUX0dUX1RPS0VOQ0FSRVRfRVFfVE9LRU5DT01NRU5UX1RPS0VOU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTlFVRVNUSU9OX1BFUklPRF9UT0tFTlFVRVNUSU9OX1FVRVNUSU9OX1RPS0VOUVVFU1RJT05fUVVFU1RJT05fRVFfVE9LRU5HRU5FUklDX01FVEhPRF9UWVBFX0FTU0lHTl9UT0tFTkdFTkVSSUNfTUVUSE9EX1RZUEVfTElTVF9UT0tFTkdUX0dUX0dUX1RPS0VOUEVSSU9EX1BFUklPRF9QRVJJT0RfUVVFU1RJT05fVE9LRU5HVF9HVF9HVF9FUV9UT0tFTlFVRVNUSU9OX1BFUklPRF9PUEVOX1NRVUFSRV9CUkFDS0VUX1RPS0VOUVVFU1RJT05fUEVSSU9EX1BFUklPRF9UT0tFTl9mZV9hbmFseXplcl9zaGFyZWQuc2Nhbm5lci5zdHJpbmdfY2Fub25pY2FsaXplcnBheWxvYWRTdHJpbmdDYW5vbmljYWxpemVyTUFTS0lOSVRJQUxfU0laRV9zaXplX2NvdW50X25vZGVzaGFzaEJ5dGVzaGFzaFN0cmluZ3JlaGFzaG5ld05vZGVzQXNzaWduZWRWYXJpYWJsZXNWYXJpYWJsZV9pbmZvX2FueXdoZXJlX2RlZmVycmVkSW5mb3NfZGVjbGFyZWRfY2FwdHVyZWRkaXNjYXJkZWREZWZlcnJlZCBpbmZvcyBub3Qgc3RvcmVkOiBVbmV4cGVjdGVkIHN0YWNrOiB1bmRlY2xhcmVkV3JpdGVzVmFyaWFibGVzIHdyaXR0ZW4gdG8gYnV0IG5vdCBkZWNsYXJlZDogdW5kZWNsYXJlZENhcHR1cmVzVmFyaWFibGVzIGNhcHR1cmVkIGJ1dCBub3QgZGVjbGFyZWQ6IE5vZGUgIGFscmVhZHkgaGFzIGluZm86IE5vIGluZm9ybWF0aW9uIGZvciApIGluIEFzc2lnbmVkVmFyaWFibGVzKF9wcmludE9uX2dldEluZm9Gb3JOb2RlX2luZm89X3N0YWNrPV9hbnl3aGVyZT1Bc3NpZ25lZFZhcmlhYmxlc0ZvclRlc3RpbmdjYXB0dXJlZEFueXdoZXJlZGVjbGFyZWRBdFRvcExldmVsd3JpdHRlbkFueXdoZXJlY2FwdHVyZWRJbk5vZGVkZWNsYXJlZEluTm9kZWlzVHJhY2tlZEFzc2lnbmVkVmFyaWFibGVzRm9yVGVzdGluZyh3cml0dGVuSW5Ob2RlQXNzaWduZWRWYXJpYWJsZXNOb2RlSW5mb0Fzc2lnbmVkVmFyaWFibGVzTm9kZUluZm8oX3dyaXR0ZW49LCBfY2FwdHVyZWQ9X2RlY2xhcmVkPUV4cHJlc3Npb25JbmZvYWZ0ZXJpZlRydWVpZkZhbHNlRXhwcmVzc2lvbkluZm8oYWZ0ZXI6ICwgX2lmVHJ1ZTogLCBpZkZhbHNlOiBpbnZlcnRGbG93QW5hbHlzaXN0eXBlT3BlcmF0aW9uc2FzRXhwcmVzc2lvbl9lbmRzdWJFeHByZXNzaW9uYXNzZXJ0X2FmdGVyQ29uZGl0aW9uYXNzZXJ0X2JlZ2luYXNzZXJ0X2VuZGJvb2xlYW5MaXRlcmFsY29uZGl0aW9uYWxfZWxzZUJlZ2luY29uZGl0aW9uYWxfZW5kY29uZGl0aW9uYWxFeHByZXNzaW9uY29uZGl0aW9uYWxfdGhlbkJlZ2luZG9TdGF0ZW1lbnRfYm9keUJlZ2luZG9TdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW5kb1N0YXRlbWVudF9lbmRlcXVhbGl0eU9wX2VuZHdob2xlRXhwcmVzc2lvbnJpZ2h0T3BlcmFuZG5vdEVxdWFsZXF1YWxpdHlPcF9yaWdodEJlZ2lubGVmdE9wZXJhbmRmb3JfYm9keUJlZ2luZm9yX2NvbmRpdGlvbkJlZ2luZm9yX2VuZGZvcl91cGRhdGVyQmVnaW5mb3JFYWNoX2JvZHlCZWdpbmxvb3BWYXJpYWJsZXdyaXR0ZW5UeXBlZm9yRWFjaF9lbmRmdW5jdGlvbkV4cHJlc3Npb25fYmVnaW5mdW5jdGlvbkV4cHJlc3Npb25fZW5kaGFuZGxlQnJlYWtoYW5kbGVDb250aW51ZWhhbmRsZUV4aXRpZk51bGxFeHByZXNzaW9uX2VuZGlmTnVsbEV4cHJlc3Npb25fcmlnaHRCZWdpbmxlZnRIYW5kU2lkZWlmU3RhdGVtZW50X2Vsc2VCZWdpbmlmU3RhdGVtZW50X2VuZGhhc0Vsc2VpZlN0YXRlbWVudF90aGVuQmVnaW5pc0Fzc2lnbmVkaXNFeHByZXNzaW9uX2VuZGxvZ2ljYWxCaW5hcnlPcF9lbmRpc0FuZGxvZ2ljYWxCaW5hcnlPcF9yaWdodEJlZ2lubG9naWNhbE5vdF9lbmRub3RFeHByZXNzaW9ubm9uTnVsbEFzc2VydF9lbmRudWxsQXdhcmVBY2Nlc3NfZW5kbnVsbEF3YXJlQWNjZXNzX3JpZ2h0QmVnaW5udWxsTGl0ZXJhbHBhcmVudGhlc2l6ZWRFeHByZXNzaW9ub3V0ZXJFeHByZXNzaW9uaW5uZXJFeHByZXNzaW9uc3dpdGNoU3RhdGVtZW50X2JlZ2luQ2FzZXN3aXRjaFN0YXRlbWVudF9lbmRpc0V4aGF1c3RpdmVzd2l0Y2hTdGF0ZW1lbnRfZXhwcmVzc2lvbkVuZHRyeUNhdGNoU3RhdGVtZW50X2JvZHlCZWdpbnRyeUNhdGNoU3RhdGVtZW50X2JvZHlFbmR0cnlDYXRjaFN0YXRlbWVudF9jYXRjaEJlZ2ludHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hFbmR0cnlDYXRjaFN0YXRlbWVudF9lbmR0cnlGaW5hbGx5U3RhdGVtZW50X2JvZHlCZWdpbnRyeUZpbmFsbHlTdGF0ZW1lbnRfZW5kdHJ5RmluYWxseVN0YXRlbWVudF9maW5hbGx5QmVnaW52YXJpYWJsZVJlYWR3aGlsZVN0YXRlbWVudF9ib2R5QmVnaW53aGlsZVN0YXRlbWVudF9jb25kaXRpb25CZWdpbndoaWxlU3RhdGVtZW50X2VuZEZsb3dBbmFseXNpc0RlYnVnX3dyYXBwZWRfZXhjZXB0aW9uT2NjdXJyZWRGbG93QW5hbHlzaXNEZWJ1ZygpX3dyYXBpc1F1ZXJ5YXNFeHByZXNzaW9uX2VuZChhc3NlcnRfYWZ0ZXJDb25kaXRpb24oYXNzZXJ0X2JlZ2luKClhc3NlcnRfZW5kKClib29sZWFuTGl0ZXJhbChjb25kaXRpb25hbF9lbHNlQmVnaW4oY29uZGl0aW9uYWxfZW5kKGNvbmRpdGlvbmFsX3RoZW5CZWdpbihkb1N0YXRlbWVudF9ib2R5QmVnaW4oZG9TdGF0ZW1lbnRfY29uZGl0aW9uQmVnaW4oKWRvU3RhdGVtZW50X2VuZChlcXVhbGl0eU9wX2VuZCgsIG5vdEVxdWFsOiBlcXVhbGl0eU9wX3JpZ2h0QmVnaW4oZmluaXNoKCkgKHNraXBwZWQpaXNQdXJlZmluaXNoKClmb3JfYm9keUJlZ2luKGZvcl9jb25kaXRpb25CZWdpbihmb3JfZW5kKClmb3JfdXBkYXRlckJlZ2luKClmb3JFYWNoX2JvZHlCZWdpbihmb3JFYWNoX2VuZCgpZnVuY3Rpb25FeHByZXNzaW9uX2JlZ2luKGZ1bmN0aW9uRXhwcmVzc2lvbl9lbmQoKWhhbmRsZUJyZWFrKGhhbmRsZUNvbnRpbnVlKGhhbmRsZUV4aXQoKWlmTnVsbEV4cHJlc3Npb25fZW5kKClpZk51bGxFeHByZXNzaW9uX3JpZ2h0QmVnaW4oaWZTdGF0ZW1lbnRfZWxzZUJlZ2luKClpZlN0YXRlbWVudF9lbmQoaWZTdGF0ZW1lbnRfdGhlbkJlZ2luKGluaXRpYWxpemUoaXNBc3NpZ25lZChpc0V4cHJlc3Npb25fZW5kKGxvZ2ljYWxCaW5hcnlPcF9lbmQoLCBpc0FuZDogbG9naWNhbEJpbmFyeU9wX3JpZ2h0QmVnaW4obG9naWNhbE5vdF9lbmQobm9uTnVsbEFzc2VydF9lbmQobnVsbEF3YXJlQWNjZXNzX2VuZCgpbnVsbEF3YXJlQWNjZXNzX3JpZ2h0QmVnaW4obnVsbExpdGVyYWwocGFyZW50aGVzaXplZEV4cHJlc3Npb24ocHJvbW90ZWRUeXBlKHN3aXRjaFN0YXRlbWVudF9iZWdpbkNhc2Uoc3dpdGNoU3RhdGVtZW50X2VuZChzd2l0Y2hTdGF0ZW1lbnRfZXhwcmVzc2lvbkVuZCh0cnlDYXRjaFN0YXRlbWVudF9ib2R5QmVnaW4oKXRyeUNhdGNoU3RhdGVtZW50X2JvZHlFbmQodHJ5Q2F0Y2hTdGF0ZW1lbnRfY2F0Y2hCZWdpbih0cnlDYXRjaFN0YXRlbWVudF9jYXRjaEVuZCgpdHJ5Q2F0Y2hTdGF0ZW1lbnRfZW5kKCl0cnlGaW5hbGx5U3RhdGVtZW50X2JvZHlCZWdpbigpdHJ5RmluYWxseVN0YXRlbWVudF9lbmQodHJ5RmluYWxseVN0YXRlbWVudF9maW5hbGx5QmVnaW4odmFyaWFibGVSZWFkKHdoaWxlU3RhdGVtZW50X2JvZHlCZWdpbih3aGlsZVN0YXRlbWVudF9jb25kaXRpb25CZWdpbih3aGlsZVN0YXRlbWVudF9lbmQoKXdyaXRlKGRlc2NyaXB0aW9uICA9PiBFWENFUFRJT04gCiAgICBfZHVtcFN0YXRlICA9PiBGbG93TW9kZWxyZWFjaGFibGV2YXJpYWJsZUluZm9fZnJlc2hWYXJpYWJsZUluZm9pbmZvRm9yVmFybmV3SW5mb0ZvclZhcl91cGRhdGVWYXJpYWJsZUluZm9yZW1vdmVQcm9tb3RlZEFsbHdyaXR0ZW5WYXJpYWJsZXNjYXB0dXJlZFZhcmlhYmxlc25ld1ZhcmlhYmxlSW5mb3Byb21vdGVkVHlwZXNkaXNjYXJkUHJvbW90aW9uc3dyaXRlQ2FwdHVyZWR3cml0ZUNhcHR1cmVyZXN0cmljdHVuc2FmZW5ld1JlYWNoYWJsZXZhcmlhYmxlSW5mb01hdGNoZXNUaGlzdmFyaWFibGVJbmZvTWF0Y2hlc090aGVydGhpc01vZGVsb3RoZXJNb2RlbHJlc3RyaWN0ZWR0cnlNYXJrTm9uTnVsbGFibGVwcmV2aW91c1R5cGV2YXJpYWJsZVR5cGVwcm9tb3RlVG9Ob25OdWxsaXNTYW1lVHlwZV9maW5pc2hUeXBlVGVzdHRyeVByb21vdGV0cnlQcm9tb3RlVG9UeXBlIHRvIGJlIGEgc3VidHlwZSBvZiB0ZXN0ZWRUeXBlbmV3UHJvbW90ZWRUeXBlc25ld1Rlc3RlZHRlc3RlZG1vZGVsSWZGYWlsZWRhc3NpZ25lZG1vZGVsSWZTdWNjZXNzZnVsbW9kZWxqb2luVmFyaWFibGVJbmZvYWx3YXlzRmlyc3RhbHdheXNTZWNvbmRzZWNvbmRNb2RlbGpvaW5lZF9pZGVudGljYWxPck5ld192YXJpYWJsZUluZm9zRXF1YWxwMnAxVmFsdWVwMlZhbHVlVHlwZU9wZXJhdGlvbnNWYXJpYWJsZU1vZGVsV3JpdGUtY2FwdHVyZWQgdmFyaWFibGVzIGNhbid0IGJlIHByb21vdGVkTm8gcHJvbW90aW9ucyB0byBkaXNjYXJkdGhpc1Byb21vdGVkVHlwZXNvdGhlclByb21vdGVkVHlwZXNuZXdBc3NpZ25lZG5ld1dyaXRlQ2FwdHVyZWRvdGhlclByb21vdGVkVHlwZXByb21vdGVkVHlwZXM6IHRlc3RlZDogYXNzaWduZWQ6IHRydWV3cml0ZUNhcHR1cmVkOiB0cnVlVmFyaWFibGVNb2RlbChudW1DaGFpbkVsZW1lbnRzVG9LZWVwX3RyeVByb21vdGVUb1R5cGVPZkludGVyZXN0Y3VycmVudGx5UHJvbW90ZWRUeXBlY2FuZGlkYXRlc3Byb21vdGVkam9pblByb21vdGVkVHlwZXNjaGFpbjFjaGFpbjJpbmRleDFpbmRleDJza2lwcGVkMXNraXBwZWQyam9pblRlc3RlZHNoYXJlZHR5cGVUb0FkZF9hZGRUb1Byb21vdGVkVHlwZXNfYWRkVHlwZVRvVW5pcXVlTGlzdF90eXBlTGlzdENvbnRhaW5zc2VhcmNoVHlwZV9Bc3NlcnRDb250ZXh0X2NvbmRpdGlvbkluZm9fQXNzZXJ0Q29udGV4dChwcmV2aW91czogLCBjb25kaXRpb25JbmZvOiBfQnJhbmNoQ29udGV4dF9CcmFuY2hDb250ZXh0KGNvbmRpdGlvbkluZm86IF9CcmFuY2hUYXJnZXRDb250ZXh0X2JyZWFrTW9kZWxfY29udGludWVNb2RlbF9CcmFuY2hUYXJnZXRDb250ZXh0KGJyZWFrTW9kZWw6IGNvbnRpbnVlTW9kZWw6IF9Db25kaXRpb25hbENvbnRleHRfdGhlbkluZm9jb25kaXRpb25JbmZvX0NvbmRpdGlvbmFsQ29udGV4dChjb25kaXRpb25JbmZvOiB0aGVuSW5mbzogX0Zsb3dBbmFseXNpc0ltcGxfc3RhdGVtZW50VG9Db250ZXh0X2V4cHJlc3Npb25XaXRoSW5mb19leHByZXNzaW9uSW5mb19mdW5jdGlvbk5lc3RpbmdMZXZlbF9hc3NpZ25lZFZhcmlhYmxlc3N1YkV4cHJlc3Npb25JbmZvX2dldEV4cHJlc3Npb25JbmZvX3ZhcmlhYmxlX2V4cHJlc3Npb25FbmRfam9pbl9zdG9yZUV4cHJlc3Npb25JbmZvdGhlbkluZm9lbHNlSW5mb2xoc0luZm9yaHNJbmZvZXhwcmVzc2lvbkluZm9icmVha1N0YXRlZmFsc2VDb25kaXRpb25wcm9tb3Rpb25JbmZvX2FmdGVyVGhlbmFmdGVyVGhlbmFmdGVyRWxzZXRydWVSZXN1bHRmYWxzZVJlc3VsdG9wZXJhbmRJbmZvYmVmb3JlQm9keWJlZm9yZUNhdGNoX2JlZm9yZUNhdGNoX2FmdGVyQm9keUFuZENhdGNoZXNWYXJpYWJsZSBpcyB3cml0dGVuIHRvLCBidXQgd2FzIG5vdCBpbmNsdWRlZCBpbiBfdmFyaWFibGVzV3JpdHRlbkFueXdoZXJlOiAgIGN1cnJlbnQ6ICAgZXhwcmVzc2lvbldpdGhJbmZvOiAgIGV4cHJlc3Npb25JbmZvOiAgIHN0YWNrOnN0YWNrRW50cnlfRmxvd0NvbnRleHRfSWZDb250ZXh0X0lmQ29udGV4dChjb25kaXRpb25JbmZvOiAsIGFmdGVyVGhlbjogX051bGxJbmZvX1NpbXBsZUNvbnRleHRfU2ltcGxlQ29udGV4dChwcmV2aW91czogX1NpbXBsZVN0YXRlbWVudENvbnRleHRfU2ltcGxlU3RhdGVtZW50Q29udGV4dChicmVha01vZGVsOiAsIHByZXZpb3VzOiBfVHJ5Q29udGV4dF9UcnlDb250ZXh0KHByZXZpb3VzOiAsIGJlZm9yZUNhdGNoOiBhZnRlckJvZHlBbmRDYXRjaGVzOiBfVmFyaWFibGVSZWFkSW5mb19WYXJpYWJsZVJlYWRJbmZvKGFmdGVyOiAsIHZhcmlhYmxlOiBfV2hpbGVDb250ZXh0X1doaWxlQ29udGV4dChicmVha01vZGVsOiBfZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlckxpc3RlbmVyUGFyc2VyRXJyb3JUb3BMZXZlbFBhcnNlckVycm9yQ29sbGVjdGluZ0xpc3RlbmVycmVjb3ZlcmFibGVFcnJvcnNmYXN0YS5xdW90ZVVuZXNjYXBlRXJyb3JMaXN0ZW5lclF1b3RlLlNpbmdsZVF1b3RlLkRvdWJsZVF1b3RlLk11bHRpTGluZVNpbmdsZVF1b3RlLk11bHRpTGluZURvdWJsZVF1b3RlLlJhd1NpbmdsZVF1b3RlLlJhd0RvdWJsZVF1b3RlLlJhd011bHRpTGluZVNpbmdsZVF1b3RlLlJhd011bHRpTGluZURvdWJsZVNpbmdsZU11bHRpTGluZVNpbmdsZU11bHRpTGluZURvdWJsZVJhd1NpbmdsZVJhd0RvdWJsZVJhd011bHRpTGluZVNpbmdsZVJhd011bHRpTGluZURvdWJsZSIiInIiIiInJydyJycnciJyJycgaW4gYW5hbHl6ZVF1b3RlbGVuZ3RoT2ZPcHRpb25hbFdoaXRlc3BhY2VQcmVmaXhmaXJzdFF1b3RlTGVuZ3RoJyBpbiAgZmlyc3RRdW90ZUxlbmd0aGxhc3RRdW90ZUxlbmd0aCcgaW4gbGFzdFF1b3RlTGVuZ3RoaXNMYXN0UXVvdGVTeW50aGV0aWNzdGFydEluZGV4ZW5kSW5kZXgnIGluIHVuZXNjYXBldW5lc2NhcGVDb2RlVW5pdHNyZXN1bHRPZmZzZXRoYW5kbGVVbmVzY2FwZUVycm9yVmFsdWVLaW5kU2luZ2xlVmFsdWVLaW5kbnVsbFZhbHVlIG9yIFVuaW9uVmFsdWVLaW5ka2luZHNyZXBlYXRlZEtpbmRzdW5pb25PZktpbmRzX2ZlX2FuYWx5emVyX3NoYXJlZC5zY2FubmVydW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZXNjYW5uZXJSZWNvdmVyeVJlY292ZXJTY2FubmVyUmVzdWx0c2NhbltieXRlc106IHRoZSBsYXN0IGJ5dGUgbXVzdCBiZSBudWxsLnNjYW5TdHJpbmdzb3VyY2UgbXVzdCBub3QgYmUgbnVsbF90b2tlbml6ZUFuZFJlY292ZXJfZmVfYW5hbHl6ZXJfc2hhcmVkLnV0aWwubGlua0xpbmtCdWlsZGVySW1wbGVtZW50YXRpb25MaW5rRW50cnlMaW5rSXRlcmF0b3JNYXBwZWRMaW5rSXRlcmFibGVubyBlbGVtZW50c3NlcGFyYXRlZEJ5c2xvd0xlbmd0aG1hcFRvTGlzdHJldmVyc2VQcmVwZW5kQWxsIG91dCBvZiByYW5nZUxpbmsuaGFzaENvZGVnZXQ6bGVuZ3RoTm8gZWxlbWVudHNNb3JlIHRoYW4gb25lIGVsZW1lbnRfdW5zdXBwb3J0ZWRnZXQ6bGFzdExpbmtCdWlsZGVydG9MaW5rQ29uc3RydWN0b3JCdWlsZGVyaGFzTW92ZWRTdXBlckluaXRpYWxpemVyc3VwZXJJbml0aWFsaXplcnJlZGlyZWN0aW5nSW5pdGlhbGl6ZXJpc1JlZGlyZWN0aW5nR2VuZXJhdGl2ZUNvbnN0cnVjdG9yaW5qZWN0SW52YWxpZEluaXRpYWxpemVyaW5mZXJGb3JtYWxUeXBlc0NvbnN0cnVjdG9yQnVpbGRlckltcGxfY29uc3RydWN0b3Jjb21waWxhdGlvblVuaXRkYXRhRm9yVGVzdGluZ0J1aWx0TWVtYmVyS2luZC5Db25zdHJ1Y3RvcmJ1aWxkRnVuY3Rpb25uZWVkc0luZmVyZW5jZVVuZXhwZWN0ZWQgbGlicmFyeSBidWlsZGVyICBmb3IgY29uc3RydWN0b3IgdG9CZUluZmVycmVkZmluYWxpemVJbml0aWFsaXppbmdGb3JtYWxib2R5QnVpbGRlcmZ1bmN0aW9uTm9kZWVuY2xvc2luZ0NsYXNzQnVpbGRlcmxhc3RJbml0aWFsaXplcmNoZWNrUGF0Y2hyZXBvcnRQYXRjaE1pc21hdGNoRGVjbGFyYXRpb25CdWlsZGVyRGVjbGFyYXRpb25CdWlsZGVySW1wbGZhc3RhLmVudW1fYnVpbGRlckVudW1CdWlsZGVyc3RyaW5nVHlwZXNlbGZUeXBlY29uc3RydWN0b3JSZWZlcmVuY2V0b1N0cmluZ1JlZmVyZW5jZWluZGV4UmVmZXJlbmNlX25hbWVSZWZlcmVuY2V2YWx1ZXNSZWZlcmVuY2V2YWx1ZXNCdWlsZGVydG9TdHJpbmdCdWlsZGVyZW51bUNvbnN0YW50SW5mb3N0YXJ0Q2hhck9mZnNldENvbXB1dGVkZW51bUJ1aWxkZXJlbnVtIGluZGV4RmllbGRCdWlsZGVyaW5kZXhGaWVsZG5hbWVGaWVsZEJ1aWxkZXJuYW1lRmllbGRzdXBlckNvbnN0cnVjdG9yRW51bUNvbnN0YW50SW5mb0V4dGVuc2lvbkJ1aWxkZXJsb29rdXBMb2NhbE1lbWJlckJ5TmFtZUV4dGVuc2lvbkJ1aWxkZXJJbXBsRXh0ZW5zaW9uQnVpbGRlci5idWlsZFR5cGUgaXMgbm90IHN1cHBvcnRlZC5FeHRlbnNpb25CdWlsZGVyLmJ1aWxkVHlwZXNXaXRoQnVpbHRBcmd1bWVudHMgaXMgbm90IHN1cHBvcnRlZC5mYXN0YS5maWVsZF9idWlsZGVybGF0ZV9sb3dlcmluZ0luY2x1ZGVzVHlwZVBhcmFtZXRlcnNOb25Db3ZhcmlhbnRseUZpZWxkQnVpbGRlcmhhZFR5cGVzSW5mZXJyZWRpc0VsaWdpYmxlRm9ySW5mZXJlbmNlaW5mZXJUeXBlU291cmNlRmllbGRCdWlsZGVyX2ZpZWxkRW5jb2RpbmdjcmVhdGVCb2RpZXNjcmVhdGVJbml0aWFsaXplcnJlZ2lzdGVyTWVtYmVyc2NvbXBsZXRlU2lnbmF0dXJlaW5pdGlhbFZhcmlhbmNlc2V0R2VuZXJpY0NvdmFyaWFudEltcGxpbXBsaWNpdEZpZWxkVHlwZWNvbXB1dGVUeXBlY2hlY2tJbmZlcnJlZGdldExvY2FsTWVtYmVyc2dldExvY2FsU2V0dGVyc2NyZWF0ZUZpZWxkTmFtZWlzRXh0ZW5zaW9uTWV0aG9kaXNMYXRlV2l0aExvd2VyaW5nbmFtZVByZWZpeF8jI2lzU2V0VW5oYW5kbGVkIGNhc2UgZm9yIGZpZWxkIG5hbWUuRmllbGROYW1lVHlwZUlzU2V0RmllbGRGaWVsZEVuY29kaW5nUmVndWxhckZpZWxkRW5jb2RpbmdfZmllbGRCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uRmllbGRCdWlsdE1lbWJlcktpbmQuRmllbGRBYnN0cmFjdExhdGVGaWVsZEVuY29kaW5nX2xhdGVJc1NldEZpZWxkX2xhdGVHZXR0ZXJfbGF0ZVNldHRlcl9jcmVhdGVTZXR0ZXJUeXBlIGhhcyBub3QgYmVlbiBjb21wdXRlZCBmb3IgZmllbGQgX2NyZWF0ZUdldHRlckJvZHlfY3JlYXRlU2V0dGVyQm9keV9jcmVhdGVGaWVsZFJlYWRuZWVkc1Byb21vdGlvbl9jcmVhdGVGaWVsZEdldF9jcmVhdGVGaWVsZFNldFR5cGUgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZCBmb3IgZmllbGQgQnVpbHRNZW1iZXJLaW5kLkxhdGVJc1NldEZpZWxkQnVpbHRNZW1iZXJLaW5kLkxhdGVHZXR0ZXJCdWlsdE1lbWJlcktpbmQuTGF0ZVNldHRlck5vbkZpbmFsTGF0ZXNob3VsZFJldHVyblZhbHVlY3JlYXRlVmFyaWFibGVXcml0ZWNyZWF0ZUlzU2V0V3JpdGVMYXRlV2l0aG91dEluaXRpYWxpemVyY3JlYXRlVmFyaWFibGVSZWFkY3JlYXRlSXNTZXRSZWFkX0xhdGVGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nJkFic3RyYWN0TGF0ZUZpZWxkRW5jb2RpbmcmTm9uRmluYWxMYXRlX0xhdGVGaWVsZFdpdGhvdXRJbml0aWFsaXplckVuY29kaW5nJkFic3RyYWN0TGF0ZUZpZWxkRW5jb2RpbmcmTm9uRmluYWxMYXRlJkxhdGVXaXRob3V0SW5pdGlhbGl6ZXJMYXRlRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJFbmNvZGluZ19MYXRlRmllbGRXaXRoSW5pdGlhbGl6ZXJFbmNvZGluZyZBYnN0cmFjdExhdGVGaWVsZEVuY29kaW5nJk5vbkZpbmFsTGF0ZUxhdGVGaWVsZFdpdGhJbml0aWFsaXplckVuY29kaW5nX0xhdGVGaW5hbEZpZWxkV2l0aG91dEluaXRpYWxpemVyRW5jb2RpbmcmQWJzdHJhY3RMYXRlRmllbGRFbmNvZGluZyZMYXRlV2l0aG91dEluaXRpYWxpemVyTGF0ZUZpbmFsRmllbGRXaXRob3V0SW5pdGlhbGl6ZXJFbmNvZGluZ0xhdGVGaW5hbEZpZWxkV2l0aEluaXRpYWxpemVyRW5jb2RpbmdfQ2xhc3NNZW1iZXJfQ2xhc3NNZW1iZXIoZmFzdGEuZm9ybWFsX3BhcmFtZXRlcl9idWlsZGVyaXNNYW5kYXRvcnlGb3JtYWxQYXJhbWV0ZXJLaW5kaXNPcHRpb25hbE5hbWVkRm9ybWFsUGFyYW1ldGVyS2luZGlzT3B0aW9uYWxQb3NpdGlvbmFsRm9ybWFsUGFyYW1ldGVyS2luZEZvcm1hbFBhcmFtZXRlckJ1aWxkZXJmb3JGb3JtYWxQYXJhbWV0ZXJJbml0aWFsaXplclNjb3BlaXNDb25zdENvbnN0cnVjdG9yUGFyYW1ldGVyZmFzdGEucHJvY2VkdXJlX2J1aWxkZXJGdW5jdGlvbkJ1aWxkZXJjb21wdXRlVHlwZVBhcmFtZXRlclNjb3BlRnVuY3Rpb25CdWlsZGVySW1wbF9leHRlbnNpb25UaGlzX2V4dGVuc2lvblR5cGVQYXJhbWV0ZXJzYm9keUludGVybmFsZm9ybWFsIHBhcmFtZXRlcmZvcm1hbCBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXJ0eXBlIHBhcmFtZXRlciBub3QgZm91bmQgaW4gI3N5bnRoZXRpY3JlbW92ZVR5cGVWYXJpYWJsZXNQcm9jZWR1cmVCdWlsZGVyLmV4dGVuc2lvblRoaXMgaGFzIG5vdCBiZWVuIHNldC5Qcm9jZWR1cmVCdWlsZGVyLmV4dGVuc2lvblR5cGVQYXJhbWV0ZXJzIGhhcyBub3QgYmVlbiBzZXQuZmFzdGEuZnVuY3Rpb25fdHlwZV9idWlsZGVyRnVuY3Rpb25UeXBlQnVpbGRlcmlzRmlyc3QpIC0+d3JpdGVOdWxsYWJpbGl0eU9uYnVpbHRSZXR1cm5UeXBlY2xvbmVkVHlwZVZhcmlhYmxlc2Zhc3RhLmludmFsaWRfdHlwZV9idWlsZGVyX0ludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVyJlR5cGVEZWNsYXJhdGlvbkJ1aWxkZXJJbXBsJkVycm9uZW91c01lbWJlckJ1aWxkZXJNaXhpbkludmFsaWRUeXBlRGVjbGFyYXRpb25CdWlsZGVySW52YWxpZFR5cGVCdWlsZGVyZmFzdGEubWVtYmVyX2J1aWxkZXJJbmZlcmVuY2VEYXRhRm9yVGVzdGluZ01lbWJlckJ1aWxkZXJNZW1iZXJCdWlsZGVySW1wbEJ1aWx0TWVtYmVyS2luZEJ1aWx0TWVtYmVyS2luZC5SZWRpcmVjdGluZ0ZhY3RvcnlCdWlsdE1lbWJlcktpbmQuTWV0aG9kQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvbk1ldGhvZEJ1aWx0TWVtYmVyS2luZC5FeHRlbnNpb25HZXR0ZXJCdWlsdE1lbWJlcktpbmQuRXh0ZW5zaW9uU2V0dGVyQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvbk9wZXJhdG9yQnVpbHRNZW1iZXJLaW5kLkV4dGVuc2lvblRlYXJPZmZSZWRpcmVjdGluZ0ZhY3RvcnlFeHRlbnNpb25GaWVsZEV4dGVuc2lvbk1ldGhvZEV4dGVuc2lvbkdldHRlckV4dGVuc2lvblNldHRlckV4dGVuc2lvbk9wZXJhdG9yTGF0ZUlzU2V0RmllbGRMYXRlR2V0dGVyTGF0ZVNldHRlck1lbWJlckRhdGFGb3JUZXN0aW5naW5mZXJlbmNlRGF0YWZhc3RhLm1vZGlmaWVyX2J1aWxkZXJNb2RpZmllckJ1aWxkZXJNb2RpZmllckJ1aWxkZXJJbXBscGF0Y2ggZmFzdGEubmFtZWRfdHlwZV9idWlsZGVyTmFtZWRUeXBlQnVpbGRlcmZyb21UeXBlRGVjbGFyYXRpb25CdWlsZGVydHlwZU5hbWVPZmZzZXRmbGF0TmFtZWhhbmRsZUludmFsaWRTdXBlcnR5cGVEZWNsYXJhdGlvbiBoYXMgbm90IGJlZW4gcmVzb2x2ZWQgb24gVW5ib3VuZCB0eXBlIGluIHN1YnN0aXR1dGlvbjogY2xvbmVkQXJndW1lbnRzU3ludGFjdGljTnVsbGFiaWxpdHlTeW50YWN0aWNOdWxsYWJpbGl0eS5sZWdhY3lvbWl0dGVkTnVsbGFiaWxpdHlCdWlsZGVyX3N5bnRhY3RpY051bGxhYmlsaXR5ZnJvbU51bGxhYmlsaXR5aWZPbWl0dGVkYnVpbGROdWxsYWJpbGl0eWZhc3RhLnByZWZpeF9idWlsZGVyUHJlZml4QnVpbGRlcmxvYWRMaWJyYXJ5UHJvY2VkdXJlQnVpbGRlcmFjdHVhbEFzeW5jTW9kaWZpZXJuZXdNb2RpZmllcmlzRWxpZ2libGVGb3JUb3BMZXZlbEluZmVyZW5jZVByb2NlZHVyZUJ1aWxkZXJJbXBsX3Byb2NlZHVyZV90ZWFyT2ZmUmVmZXJlbmNlRnJvbV9leHRlbnNpb25UZWFyT2ZmX2V4dGVuc2lvblRlYXJPZmZQYXJhbWV0ZXJNYXBleHRlbnNpb25UZWFyT2ZmVW5leHBlY3RlZCBleHRlbnNpb24gbWV0aG9kIGtpbmQgX2J1aWxkRXh0ZW5zaW9uVGVhck9mZmNyZWF0ZVByb2NlZHVyZU5hbWVraW5kSW5maXhnZXQjc2V0I05vIGV4dGVuc2lvbiB0ZWFyIG9mZiBjcmVhdGVkIGZvciBuZXdUeXBlUGFyYW1ldGVydGVhck9mZlR5cGVQYXJhbWV0ZXJzY2xvc3VyZVR5cGVQYXJhbWV0ZXJzY29weVBhcmFtZXRlcm5ld1BhcmFtZXRlcmNsb3N1cmVSZXR1cm5UeXBlY2xvc3VyZVBvc2l0aW9uYWxQYXJhbWV0ZXJzY2xvc3VyZVBvc2l0aW9uYWxBcmd1bWVudHNjbG9zdXJlTmFtZWRQYXJhbWV0ZXJzY2xvc3VyZU5hbWVkQXJndW1lbnRzY2xvc3VyZUJvZHl8Z2V0I1JlZGlyZWN0aW5nRmFjdG9yeUJ1aWxkZXJyZWRpcmVjdGluZ09yaWdpbmZhc3RhLmZ1bmN0aW9uX3R5cGVfYWxpYXNfYnVpbGRlclR5cGVBbGlhc0J1aWxkZXJ2YXJpYW5jZUF0ZnJvbURpbGxidWlsZFRoaXNUeXBlYXNUeXBlQXJndW1lbnRzcGFyZW50TGlicmFyeWlzTnVsbEFsaWFzdHlwZURlY2xhcmF0aW9uQnVpbGRlcmN1cnJlbnRBbGlhc0J1aWxkZXJjeWNsaWNUeXBlQWxpYXNNYXJrZXJmYXN0YS50eXBlX3ZhcmlhYmxlX2J1aWxkZXJUeXBlVmFyaWFibGVCdWlsZGVyYWN0dWFsUGFyYW1ldGVyZnJvbUtlcm5lbG51bGxhYmlsaXR5SWZPbWl0dGVkYXNUeXBlQnVpbGRlcmZpbmlzaE51bGxhYmlsaXRpZXNzdGFja1RvcHR5cGVQYXJhbWV0ZXJzRnJvbUJ1aWxkZXJzZmFzdGEudW5yZXNvbHZlZF90eXBlVW5yZXNvbHZlZFR5cGVVbnJlc29sdmVkVHlwZShAZmFzdGEua2VybmVsX3ZhcmlhYmxlX2J1aWxkZXJWYXJpYWJsZUJ1aWxkZXJmYXN0YS52b2lkX3R5cGVfYnVpbGRlclZvaWRUeXBlQnVpbGRlcmZhc3RhLmNvbnN0YW50X2NvbnRleHRmYXN0YS5xdWFsaWZpZWRfbmFtZXByZXNlcnZlVG9rZW5pZGVudGlmaWVyKF9Ub2tlbklkZW50aWZpZXJ0b2tlbi1pZGVudGlmaWVyKGluaXRpYWxpemVkLWlkZW50aWZpZXIocXVhbGlmaWVkLW5hbWUoX1Rva2VuUXVhbGlmaWVkTmFtZXRva2VuLXF1YWxpZmllZC1uYW1lKGZsYXR0ZW5RdWFsaWZpZWROYW1lT250b2tlbklkZW50aWZpZXJmYXN0YS5tb2RpZmllck1vZGlmaWVyRW51bU1vZGlmaWVyRW51bS5BYnN0cmFjdE1vZGlmaWVyRW51bS5Db25zdE1vZGlmaWVyRW51bS5Db3ZhcmlhbnRNb2RpZmllckVudW0uRXh0ZXJuYWxNb2RpZmllckVudW0uRmluYWxNb2RpZmllckVudW0uU3RhdGljTW9kaWZpZXJFbnVtLlZhckFic3RyYWN0Q29uc3RDb3ZhcmlhbnRFeHRlcm5hbEZpbmFsU3RhdGljVmFybWFza01vZGlmaWVyLmZyb21TdHJpbmdtb2RpZmllcihNb2RpZmllckVudW0ubW9kaWZpZXJ2YWxpZGF0ZVZhckZpbmFsT3JDb25zdE1vZGlmaWVyLnZhbGlkYXRlVmFyRmluYWxPckNvbnN0ZXh0ZXJuYWxNYXNrdmFyTWFza2Zyb250X2VuZC5zcmMuZmFzdGEubmFtZXNhbXBlcnNhbmROYW1lYmFyTmFtZWNhcmV0TmFtZWRpdmlzaW9uTmFtZWRvdWJsZUFtcGVyc2FuZE5hbWVkb3VibGVCYXJOYW1lZG91YmxlUXVlc3Rpb25OYW1lZXF1YWxzTmFtZWdyZWF0ZXJUaGFuTmFtZWdyZWF0ZXJUaGFuT3JFcXVhbHNOYW1laWRlbnRpY2FsTmFtZWluZGV4R2V0TmFtZWxlZnRTaGlmdE5hbWVsZW5ndGhOYW1lbGVzc1RoYW5OYW1lbGVzc1RoYW5PckVxdWFsc05hbWVtdWx0aXBseU5hbWVtdXN0YWNoZU5hbWVuZWdhdGlvbk5hbWVwZXJjZW50TmFtZXJpZ2h0U2hpZnROYW1ldHJpcGxlU2hpZnROYW1ldGlsZGVOYW1ldW5hcnlNaW51c05hbWVoYXNoQ29kZU5hbWV0b1N0cmluZ05hbWVydW50aW1lVHlwZU5hbWVmYXN0YS5zY29wZV9saXN0ZW5lckJyZWFrQ29udGludWVHb3RvSmNyZWF0ZUJyZWFrVGFyZ2V0Y3JlYXRlQ29udGludWVUYXJnZXROdWxsVmFsdWUuQnJlYWtUYXJnZXROdWxsVmFsdWUuQ29udGludWVUYXJnZXRiZWdpbkJsb2NrRnVuY3Rpb25Cb2R5YmxvY2sgZnVuY3Rpb24gYm9keWJlZ2luRm9yU3RhdGVtZW50Zm9yIHN0YXRlbWVudGJlZ2luRm9yQ29udHJvbEZsb3dmb3IgaW4gYSBjb2xsZWN0aW9uYmVnaW5Eb1doaWxlU3RhdGVtZW50Qm9keWRvLXdoaWxlIHN0YXRlbWVudCBib2R5ZW5kRG9XaGlsZVN0YXRlbWVudEJvZHliZWdpbldoaWxlU3RhdGVtZW50Qm9keXdoaWxlIHN0YXRlbWVudCBib2R5ZW5kV2hpbGVTdGF0ZW1lbnRCb2R5YmVnaW5Gb3JTdGF0ZW1lbnRCb2R5Zm9yIHN0YXRlbWVudCBib2R5ZW5kRm9yU3RhdGVtZW50Qm9keWJlZ2luRm9ySW5Cb2R5Zm9yLWluIGJvZHllbmRGb3JJbkJvZHliZWdpbkVsc2VTdGF0ZW1lbnRlbmRFbHNlU3RhdGVtZW50ZmFzdGEuc3RhY2tfbGlzdGVuZXJfaW1wbFN0YWNrTGlzdGVuZXJJbXBsZmluaXNoU2luZ2xlRXhwcmVzc2lvbm1vZGlmaWVyVG9rZW5WYWx1ZUtpbmRzQXJndW1lbnRzT3JOdWxsRXhwcmVzc2lvbk9yTnVsbElkZW50aWZpZXJPck51bGxJbnRlZ2VyRm9ybWFsc0Zvcm1hbHNPck51bGxOdWxsVmFsdWUuRm9ybWFsUGFyYW1ldGVyc0dlbmVyYXRvck1ldGhvZEJvZHlNb2RpZmllcnNNb2RpZmllcnNPck51bGxOdWxsVmFsdWUuTW9kaWZpZXJzTmFtZU9yTnVsbE51bGxWYWx1ZS5OYW1lTmFtZU9yT3BlcmF0b3JOYW1lT3JRdWFsaWZpZWROYW1lT3JPcGVyYXRvck5hbWVPclBhcnNlclJlY292ZXJ5TWV0YWRhdGFMaXN0T3JOdWxsT2JqZWN0TGlzdFRva2VuT3JOdWxsTnVsbFZhbHVlLlRva2VuVHlwZUFyZ3VtZW50c09yTnVsbFR5cGVCdWlsZGVyT3JOdWxsVHlwZVZhcmlhYmxlTGlzdE9yTnVsbEluc3RydW1lbnRhdGlvbkluc3RydW1lbnRhdGlvblZhbHVlRm9yTWVtYmVySW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlSW5zdHJ1bWVudGF0aW9uVmFsdWVGb3JUeXBlQXJnc2hhc0FueVR5cGVWYXJpYWJsZXNJbmZlcmVuY2VIZWxwZXJUeXBlQ29uc3RyYWludEdhdGhlcmVyaXNLbm93bmdyZWF0ZXN0Q2xvc3VyZWdldE5hbWVkUGFyYW1ldGVyVHlwZWdldFBvc2l0aW9uYWxQYXJhbWV0ZXJUeXBlVHlwZUNvbnN0cmFpbnRUeXBlVmFyaWFibGVFbGltaW5hdG9yQ2xvc3VyZUNvbnRleHRpc0dlbmVyYXRvcnJldHVybk9yWWllbGRDb250ZXh0ZGVjbGFyZWRSZXR1cm5UeXBlX25lZWRUb0luZmVyUmV0dXJuVHlwZV9pbmZlcnJlZFVud3JhcHBlZFJldHVybk9yWWllbGRUeXBlcmV0dXJuU3RhdGVtZW50c3JldHVybkV4cHJlc3Npb25UeXBlc3JldHVybkNvbnRleHRuZWVkVG9JbmZlclJldHVyblR5cGVnZXRUeXBlQXJndW1lbnRPZndyYXBGdXR1cmVPclR5cGVjaGVja1ZhbGlkUmV0dXJuZXhwcmVzc2lvblR5cGVmbGF0dGVuZWRSZXR1cm5UeXBlZmxhdHRlbmVkRXhwcmVzc2lvblR5cGVoYW5kbGVSZXR1cm5lbnN1cmVBc3NpZ25hYmxlaXNSZXR1cm5Gcm9tQXN5bmNpc1ZvaWRBbGxvd2VkdW53cmFwcGVkVHlwZWdldFN0YW5kYXJkVXBwZXJCb3VuZGhhbmRsZVlpZWxkZXhwcmVzc2lvblJlc3VsdGV4cGVjdGVkVHlwZV93cmFwQXN5bmNPckdlbmVyYXRvcmVuc3VyZUFzc2lnbmFibGVSZXN1bHRnZXREZXJpdmVkVHlwZUFyZ3VtZW50T2ZpbmZlclJldHVyblR5cGV3cmFwVHlwZXdyYXBGdXR1cmVUeXBlTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmRNZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5ub25lTWV0aG9kQ29udHJhdmFyaWFuY2VDaGVja0tpbmQuY2hlY2tNZXRob2RSZXR1cm5NZXRob2RDb250cmF2YXJpYW5jZUNoZWNrS2luZC5jaGVja0dldHRlclJldHVybmNoZWNrTWV0aG9kUmV0dXJuY2hlY2tHZXR0ZXJSZXR1cm51cmlGb3JJbnN0cnVtZW50YXRpb25pbmZlck1ldGFkYXRhS2VlcGluZ0hlbHBlcmluZmVyQ29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlc3Vua25vd25GdW5jdGlvbmVuZ2luZWluc3RydW1lbnRhdGlvbmxhc3RJbmZlcnJlZFN1YnN0aXR1dGlvbmxhc3RDYWxsZWVUeXBlY29tcHV0ZU51bGxhYmxlY29tcHV0ZU5vbk51bGxhYmxlcmVnaXN0ZXJJZlVucmVhY2hhYmxlRm9yVGVzdGluZ2Zsb3dBbmFseXNpc1Jlc3VsdHVucmVhY2hhYmxlTm9kZXNiZWluZ0luZmVycmVkaXNEb3VibGVDb250ZXh0Y29udGV4dFR5cGVpc1N0cm9uZ051bGxhYmlsaXR5TW9kZWVycm9yVGVtcGxhdGV3YXJuaW5nVGVtcGxhdGVpbml0aWFsQ29udGV4dFR5cGV1bmZ1dHVyZWRFeHBlY3RlZFR5cGVmdXR1cmVkRXhwZWN0ZWRUeXBlcHJlY2lzZVR5cGVFcnJvclRlbXBsYXRlX2dldFByZWNpc2VUeXBlRXJyb3JUZW1wbGF0ZV9jb21wdXRlQXNzaWduYWJpbGl0eUtpbmRpc0V4cHJlc3Npb25UeXBlUHJlY2lzZUFzc2lnbmFiaWxpdHlLaW5kLmFzc2lnbmFibGVBc3NpZ25hYmlsaXR5S2luZC5hc3NpZ25hYmxlQ2FzdEFzc2lnbmFiaWxpdHlLaW5kLmFzc2lnbmFibGVUZWFyb2ZmX3RlYXJPZmZDYWxsQXNzaWduYWJpbGl0eUtpbmQuYXNzaWduYWJsZVRlYXJvZmZDYXN0QXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlX3dyYXBVbmFzc2lnbmFibGVFeHByZXNzaW9uQXNzaWduYWJpbGl0eUtpbmQudW5hc3NpZ25hYmxlVm9pZEFzc2lnbmFiaWxpdHlLaW5kLnVuYXNzaWduYWJsZVByZWNpc2VBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVUZWFyb2ZmdHlwZWRUZWFyb2ZmdGVhcm9mZlR5cGVBc3NpZ25hYmlsaXR5S2luZC51bmFzc2lnbmFibGVDYW50VGVhcm9mZl93cmFwVGVhcm9mZkVycm9yRXhwcmVzc2lvbndlYWtLaW5kZW5zdXJlQXNzaWduYWJsZTp3ZWFrZXJyb3JOb2RlY2FsbE1lbWJlcm51bGxDaGVja2dldEdldHRlclR5cGVGb3JNZW1iZXJUYXJnZXRjb25kaXRpb25hbG5lZWRzVGVhcm9mZl9zaG91bGRUZWFyT2ZmQ2FsbGlzRGlyZWN0bHlBc3NpZ25hYmxlaXNJbmRpcmVjdGx5QXNzaWduYWJsZWNvbXB1dGVFeHRlbnNpb25UeXBlQXJndW1lbnRpbmZlckV4dGVuc2lvblR5cGVBcmd1bWVudHNpbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZWZpbmRJbnRlcmZhY2VNZW1iZXJpbnN0cnVtZW50ZWRpbmNsdWRlRXh0ZW5zaW9uTWV0aG9kc3Jlc29sdmVUeXBlUGFyYW1ldGVyT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5jYWxsRnVuY3Rpb25fZ2V0SW50ZXJmYWNlTWVtYmVyT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5keW5hbWljT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5uZXZlck9iamVjdEFjY2Vzc1RhcmdldEtpbmQuaW52YWxpZE9iamVjdEFjY2Vzc1RhcmdldEtpbmQubWlzc2luZ3JlY29yZG90aGVyTmFtZW90aGVySXNTZXR0ZXJvdGhlck1lbWJlcm5vbmVNb3JlU3BlY2lmaWN0aGlzQnVpbGRlcm90aGVyQnVpbGRlcm9uVHlwZUluc3RhbnRpYXRlVG9Cb3VuZHNpbmZlcnJlZFR5cGVBcmd1bWVudHNpbmZlcnJlZFN1YnN0aXR1dGlvbmluc3RhbnRpYXRlVG9Cb3VuZFR5cGVBcmd1bWVudHNpbnN0YW50aWF0ZVRvQm91bmRzU3Vic3RpdHV0aW9uaXNQbGF0Zm9ybWlzTW9zdFNwZWNpZmljaXNNb3JlU3BlY2lmaWNUaGFubWF0Y2hlc09iamVjdE1lbWJlckNhbGxwb3NpdGlvbmFsQXJndW1lbnRUeXBlc25hbWVkQXJndW1lbnRUeXBlc21hdGNoZXNNZW1iZXJDYWxscGFyYW1ldGVySW5kZXhhcmd1bWVudEluZGV4Y29tcGFyZVJlc3VsdHJlcG9ydE1pc3NpbmdJbnRlcmZhY2VNZW1iZXJpc01pc3NpbmdnZXRHZXR0ZXJUeXBlT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC51bnJlc29sdmVkT2JqZWN0QWNjZXNzVGFyZ2V0S2luZC5pbnN0YW5jZU1lbWJlck9iamVjdEFjY2Vzc1RhcmdldEtpbmQuZXh0ZW5zaW9uTWVtYmVyZXh0ZW5zaW9uTWV0aG9kS2luZGluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50c21lbWJlckNsYXNzVW5leHBlY3RlZCBpbnRlcmZhY2UgbWVtYmVyIGNhbGxlZVR5cGVjYXN0ZWRUeXBlQXJndW1lbnRzZ2V0RnVuY3Rpb25UeXBlX2dldEZ1bmN0aW9uVHlwZWdldEV4dGVuc2lvblJlY2VpdmVyVHlwZWdldFJldHVyblR5cGVnZXRQb3NpdGlvbmFsUGFyYW1ldGVyVHlwZUZvclRhcmdldGdldEluZGV4S2V5VHlwZWdldEluZGV4U2V0VmFsdWVUeXBlaW5kZXhUeXBlZ2V0RnVuY3Rpb25UeXBlRm9ySW1wbGljaXRDYWxsdHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZkNsYXNzZ2V0UmVhbFRhcmdldGdldFNldHRlclR5cGVzZXR0ZXJQYXJhbWV0ZXJzaGFuZGxlSW52b2NhdGlvbkNvbnRyYXZhcmlhbmNlY2hlY2tLaW5kZGVzdWdhcmVkSW52b2NhdGlvbmNoZWNrUmV0dXJucHJvcGVydHlHZXRpbmZlckRlY2xhcmF0aW9uVHlwZWluaXRpYWxpemVyVHlwZWZvclN5bnRoZXRpY1ZhcmlhYmxlaW5mZXJTeW50aGV0aWNWYXJpYWJsZWluZmVyRXhwcmVzc2lvbmluZmVyU3ludGhldGljVmFyaWFibGVOdWxsQXdhcmVudWxsQXdhcmVHdWFyZHNudWxsQXdhcmVBY3Rpb25jcmVhdGVOdWxsQXdhcmVHdWFyZGNyZWF0ZU51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHR0eXBlTmVlZGVkTm8gdHlwZSBpbmZlcnJlZCBmb3IgaW5mZXJTdGF0ZW1lbnRmdW5jdGlvbkJvZGllc1RoYXREb250Q29tcGxldGVoYXNDaGFuZ2VkaW5mZXJJbnZvY2F0aW9uc2tpcFR5cGVBcmd1bWVudEluZmVyZW5jZWlzSW1wbGljaXRFeHRlbnNpb25NZW1iZXJSZXR1cm4gdHlwZSAgY29udGFpbnMgZnJlZSB2YXJpYWJsZXMuUHJvdmlkZWQgZnVuY3Rpb24gdHlwZTogVW5leHBlY3RlZCBleHBsaWNpdCByZXR1cm4gdHlwZSBmb3IgZXh0ZW5zaW9uIG1ldGhvZCBpbnZvY2F0aW9uLl9pbmZlckdlbmVyaWNFeHRlbnNpb25NZXRob2RJbnZvY2F0aW9uX2luZmVySW52b2NhdGlvbmV4dGVuc2lvbkZ1bmN0aW9uVHlwZWV4dGVuc2lvbkFyZ3VtZW50c2V4dGVuc2lvblN1YnN0aXR1dGlvbnRhcmdldEFyZ3VtZW50c2NhbGxlZVR5cGVQYXJhbWV0ZXJzaW5mZXJlbmNlTmVlZGVkZm9ybWFsVHlwZXNhY3R1YWxUeXBlc2luZmVycmVkRm9ybWFsVHlwZU5vIHJlY2VpdmVyIHR5cGUgcHJvdmlkZWQgZm9yIGltcGxpY2l0IGV4dGVuc2lvbiBtZW1iZXIgaW52b2NhdGlvbi5zZWVuTmFtZXNuYW1lZFR5cGVJbmRleHVuaXF1ZU5hbWVkcHJldk5hbWVkRXhwcmVzc2lvblVua25vd24gdHlwZShzKSBpbiBpbmZlcnJlZCB0eXBlczogUHJvbW90ZWQgdHlwZSB2YXJpYWJsZShzKSBpbiBpbmZlcnJlZCB0eXBlczogbnVtUG9zaXRpb25hbEFyZ3NhY3R1YWxUeXBlbmFtZWRFeHByZXNzaW9uSW5mZXJyZWQgcmV0dXJuIHR5cGUgSW5mZXJyZWQgZnVuY3Rpb24gdHlwZTogZXJyb3JTcGFuTGVuZ3RoaW5mZXJMb2NhbEZ1bmN0aW9uZm9ybWFsVHlwZXNGcm9tQ29udGV4dG5lZWRUb1NldFJldHVyblR5cGVvbGRDbG9zdXJlQ29udGV4dGJvZHlSZXN1bHRpbmZlcnJlZFJldHVyblR5cGV0cmFuc2Zvcm1FeHRlbnNpb25NZXRob2RJbnZvY2F0aW9uY3JlYXRlU3RhdGljSW52b2NhdGlvbmNyZWF0ZUFyZ3VtZW50c0ZvckV4dGVuc2lvbk1ldGhvZF9pbmZlckR5bmFtaWNJbnZvY2F0aW9uYXBwbHlSZXN1bHRfaW5mZXJOZXZlckludm9jYXRpb25faW5mZXJNaXNzaW5nSW52b2NhdGlvbmlzRXhwcmVzc2lvbkludm9jYXRpb25jcmVhdGVNaXNzaW5nTWV0aG9kSW52b2NhdGlvbl9pbmZlckV4dGVuc2lvbkludm9jYXRpb25zdGF0aWNJbnZvY2F0aW9uX2luZmVyRnVuY3Rpb25JbnZvY2F0aW9uaXNDYWxsRnVuY3Rpb25faW5mZXJJbnN0YW5jZU1ldGhvZEludm9jYXRpb25VbmV4cGVjdGVkIGluc3RhbmNlIG1ldGhvZCBzaWduYXR1cmVjb250cmF2YXJpYW50Q2hlY2tfY2hlY2tCb3VuZHNJbk1ldGhvZEludm9jYXRpb25faW5mZXJJbnN0YW5jZUdldHRlckludm9jYXRpb25faW5mZXJJbnN0YW5jZUZpZWxkSW52b2NhdGlvbmluZmVyTWV0aG9kSW52b2NhdGlvbmFjdHVhbFJlY2VpdmVyVHlwZWFjdHVhbE1ldGhvZE5hbWVpc092ZXJsb2FkZWRBcml0aG1ldGljT3BlcmF0b3JBbmRUeXBlaW5mZXJTdXBlck1ldGhvZEludm9jYXRpb25pbmZlclN1cGVyUHJvcGVydHlHZXRpbnN0YW50aWF0ZVRlYXJPZmZpbnN0YW50aWF0ZWRUeXBlcmV0dXJuZWRUeXBlUGFyYW1ldGVyc09jY3VyTm9uQ292YXJpYW50bHljaGVja2VycHJlQ2hlY2tJbnZvY2F0aW9uQ29udHJhdmFyaWFuY2Vpc1RoaXNSZWNlaXZlcnJlc29sdmVPbmVTdGVwcmVzb2x2ZWRzdGVwMXN0ZXAydHlwZVdpdGhvdXRGdXR1cmVPcmhpZXJhcmNoeUJ1aWxkZXJnZXRDb21iaW5lZE1lbWJlclNpZ25hdHVyZUtlcm5lbGNyZWF0ZU1pc3NpbmdTdXBlckluZGV4R2V0Y3JlYXRlU3VwZXJNZXRob2RJbnZvY2F0aW9uY3JlYXRlTWlzc2luZ1N1cGVySW5kZXhTZXRjcmVhdGVNaXNzaW5nUHJvcGVydHlHZXRjcmVhdGVQcm9wZXJ0eUdldGNyZWF0ZU1pc3NpbmdQcm9wZXJ0eVNldGNyZWF0ZVByb3BlcnR5U2V0Y3JlYXRlTWlzc2luZ0luZGV4R2V0Y3JlYXRlSW5kZXhHZXRjcmVhdGVNaXNzaW5nSW5kZXhTZXRjcmVhdGVJbmRleFNldGNyZWF0ZU1pc3NpbmdCaW5hcnljcmVhdGVNaXNzaW5nVW5hcnlnYXRoZXJlcnJlcG9ydFByb2JsZW1nZW5lcmF0ZUNvbnN0cmFpbnRzbWl4aW5DbGFzc21peGluU3VwZXJ0eXBlbWl4aW5TdXBlcmNsYXNzQ29tcGlsZXItZ2VuZXJhdGVkIG1peGluIGFwcGxpY2F0aW9ucyBoYXZlIGEgbWl4aW4gb3IgZWxzZSBpbXBsZW1lbnQgZXhhY3RseSBvbmUgdHlwZSBpbXBsZW1lbnRzICB0eXBlc3MwdTB0cnlTdWJ0eXBlTWF0Y2hjb21wdXRlQ29uc3RyYWludHNleGFjdFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdFN0YXRlbWVudEluZmVyZW5jZVJlc3VsdC5zdGF0ZW1lbnRTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQuc3RhdGVtZW50Q291bnRTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHQuc3RhdGVtZW50c1NpbmdsZVN0YXRlbWVudEluZmVyZW5jZVJlc3VsdFNpbmdsZVN0YXRlbWVudEluZmVyZW5jZVJlc3VsdC5zdGF0ZW1lbnRzTXVsdGlwbGVTdGF0ZW1lbnRJbmZlcmVuY2VSZXN1bHRJbnZvY2F0aW9uSW5mZXJlbmNlUmVzdWx0U3VjY2Vzc2Z1bEluZmVyZW5jZVJlc3VsdFdyYXBJblByb2JsZW1JbmZlcmVuY2VSZXN1bHRFeHByZXNzaW9uSW5mZXJlbmNlUmVzdWx0bnVsbEF3YXJlQWN0aW9uVHlwZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoTnVsbEF3YXJlR3VhcmRfbnVsbEF3YXJlVmFyaWFibGVfbnVsbEF3YXJlRmlsZU9mZnNldF9udWxsQXdhcmVFcXVhbHNfaW5mZXJyZXJjcmVhdGVFeHByZXNzaW9uZXF1YWxzTnVsbE51bGxBd2FyZUd1YXJkKE51bGxBd2FyZUV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHRfZXhwcmVzc2lvbm51bGxBd2FyZUd1YXJkTnVsbEF3YXJlRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChPYmplY3RBY2Nlc3NUYXJnZXRLaW5kaW5zdGFuY2VNZW1iZXJjYWxsRnVuY3Rpb25leHRlbnNpb25NZW1iZXJtaXNzaW5nT2JqZWN0QWNjZXNzVGFyZ2V0dGVhcm9mZlRhcmdldGlzSW52YWxpZE9iamVjdEFjY2Vzc1RhcmdldC5leHRlbnNpb25NZXRob2RLaW5kT2JqZWN0QWNjZXNzVGFyZ2V0LmluZmVycmVkRXh0ZW5zaW9uVHlwZUFyZ3VtZW50c09iamVjdEFjY2Vzc1RhcmdldC50ZWFyb2ZmVGFyZ2V0T2JqZWN0QWNjZXNzVGFyZ2V0KEV4dGVuc2lvbkFjY2Vzc1RhcmdldEV4dGVuc2lvbkFjY2Vzc1RhcmdldChFeHRlbnNpb25BY2Nlc3NDYW5kaWRhdGV0aGlzSXNTdWJ0eXBldGhpc0lzU3VwZXJ0eXBlQXNzaWduYWJpbGl0eUtpbmRhc3NpZ25hYmxlYXNzaWduYWJsZUNhc3Rhc3NpZ25hYmxlVGVhcm9mZmFzc2lnbmFibGVUZWFyb2ZmQ2FzdHVuYXNzaWduYWJsZXVuYXNzaWduYWJsZVZvaWR1bmFzc2lnbmFibGVQcmVjaXNldW5hc3NpZ25hYmxlVGVhcm9mZnVuYXNzaWduYWJsZUNhbnRUZWFyb2ZmVHlwZWRUZWFyb2ZmZ2V0TmFtZWRGb3JtYWxnZXRQb3NpdGlvbmFsRm9ybWFsaXNPdmVybG9hZGFibGVBcml0aG1ldGljT3BlcmF0b3JkaXNhYmxlZGNvbXB1dGVQcm9tb3RlZFR5cGVUeXBlUHJvbW90ZXJEaXNhYmxlZF9udWxsRmFjdHNfZmFjdENhY2hlX2ZhY3RDYWNoZVN0YXRlX2N1cnJlbnRGYWN0c19wcm9tb3Rpb25FeHByZXNzaW9uX3RydWVGYWN0c0ZvclByb21vdGlvbkV4cHJlc3Npb25fbGFzdEZhY3RTZXF1ZW5jZU51bWJlcl9jb21wdXRlUHJvbW90ZWRUeXBlYWZ0ZXJUcnVlYmVmb3JlRWxzZXRydWVGYWN0c19mYWN0c1doZW5UcnVlZmFsc2VGYWN0c19mYWN0c1doZW5GYWxzZV9lbmNsb3NpbmdfbWVyZ2VGYWN0c19yZWNvcmRQcm9tb3Rpb25FeHByZXNzaW9uc2hvcnRjdXRGYWN0c19jb21wdXRlQ3VycmVudEZhY3RNYXBpc0NoZWNrY29tbW9uQW5jZXN0b3JzZXF1ZW5jZU51bWJlcnByZXZpb3VzRm9yVmFyaWFibGVuZXdTdGF0ZWN1cnJlbnRseUNhY2hlZF9wcmludEV2ZW50ZmFjdENoYWluKG51bGwpIC0+ICAgX3Byb21vdGlvbkV4cHJlc3Npb246ICAgICBpZiB0cnVlOiBfbXV0YXRlZEluU2NvcGVzX2FjY2Vzc2VkSW5DbG9zdXJlSW5TY29wZXNwcm9tb3Rlcl9yZWNvcmRBY2Nlc3NlZEluU2NvcGVfcmVjb3JkTXV0YXRlZEluU2NvcGVfZGVwdGhfdG9wTGV2ZWxjb250YWluc1Njb3BlX0NvbmRpdGlvbmFsU2NvcGVlbmNsb3NpbmdfSXNDaGVja2NoZWNrZWRUeXBlaXNDaGVjayhwcmV2aW91c1Byb21vdGVkVHlwZWFzc2lnbm1lbnRTY29wZWFjY2Vzc1Njb3BlX0xvZ2ljYWxTY29wZV9OdWxsRmFjdFRyaWVkIHRvIGNyZWF0ZSBwcm9tb3RlZCB0eXBlIGZvciBubyB2YXJpYWJsZV9Ub3BMZXZlbFNjb3BlZmFzdGEuY29sbGVjdGlvbnNDb250cm9sRmxvd0VsZW1lbnRvbkNvbnZlcnRGb3JFbGVtZW50X1NwcmVhZEVsZW1lbnQmRXhwcmVzc2lvbiZDb250cm9sRmxvd0VsZW1lbnRfSWZFbGVtZW50JkV4cHJlc3Npb24mQ29udHJvbEZsb3dFbGVtZW50SWZFbGVtZW50dGhlbkVsZW1lbnRvdGhlcndpc2VFbnRyeW90aGVyd2lzZUVsZW1lbnRfRm9yRWxlbWVudCZFeHByZXNzaW9uJkNvbnRyb2xGbG93RWxlbWVudEZvckVsZW1lbnRib2R5RW50cnlib2R5RWxlbWVudF9Gb3JJbkVsZW1lbnQmRXhwcmVzc2lvbiZDb250cm9sRmxvd0VsZW1lbnRGb3JJbkVsZW1lbnRwcm9sb2d1ZUNvbnRyb2xGbG93TWFwRW50cnlDb250cm9sRmxvd01hcEVudHJ5LmtleSBnZXR0ZXJDb250cm9sRmxvd01hcEVudHJ5LmtleSBzZXR0ZXJDb250cm9sRmxvd01hcEVudHJ5LnZhbHVlIGdldHRlckNvbnRyb2xGbG93TWFwRW50cnkudmFsdWUgc2V0dGVyX1NwcmVhZE1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlTcHJlYWRNYXBFbnRyeWVudHJ5VHlwZV9JZk1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlJZk1hcEVudHJ5X0Zvck1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlGb3JNYXBFbnRyeV9Gb3JJbk1hcEVudHJ5JlRyZWVOb2RlJkNvbnRyb2xGbG93TWFwRW50cnlGb3JJbk1hcEVudHJ5Y29udmVydFRvRWxlbWVudG9uQ29udmVydEZvck1hcEVudHJ5aXNDb252ZXJ0aWJsZVRvTWFwRW50cnljb252ZXJ0VG9NYXBFbnRyeWZhc3RhLmNvbnN0bmVzc2V4cGxpY2l0Q29uc3RleHBsaWNpdE5ld2ltcGxpY2l0ZmFzdGEuZXhwcmVzc2lvbl9nZW5lcmF0b3JfaGVscGVyX2ZvcmVzdF9wbGFpbk5hbWVGb3JSZWFkX2RlYnVnTmFtZV91cmlidWlsZElmTnVsbEFzc2lnbm1lbnRidWlsZENvbXBvdW5kQXNzaWdubWVudGJpbmFyeU9wZXJhdG9yaXNQcmVJbmNEZWNpc1Bvc3RJbmNEZWNidWlsZFBvc3RmaXhJbmNyZW1lbnRfbWFrZUludmFsaWRSZWFkX21ha2VJbnZhbGlkV3JpdGVvcGVyYXRvck9mZnNldGlzUG90ZW50aWFsbHlDb25zdGFudChvZmZzZXQ6IFZhcmlhYmxlVXNlR2VuZXJhdG9yIGlzIG5vdCBhc3NpZ25hYmxlX2NyZWF0ZVJlYWRfY3JlYXRlV3JpdGViaW5hcnksIHByb21vdGVkVHlwZTogUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3IsIHJlY2VpdmVyOiAsIG5hbWU6IG1ha2VUaGlzUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JjcmVhdGVUaGlzRXhwcmVzc2lvbk51bGxBd2FyZVByb3BlcnR5QWNjZXNzR2VuZXJhdG9ycmVjZWl2ZXJFeHByZXNzaW9ucmVjZWl2ZXJBY2Nlc3MsIHJlY2VpdmVyRXhwcmVzc2lvbjogU3VwZXJQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciwgZ2V0dGVyOiAsIHNldHRlcjogSW5kZXhlZEFjY2Vzc0dlbmVyYXRvciwgaW5kZXg6ICwgaXNOdWxsQXdhcmU6IFRoaXNJbmRleGVkQWNjZXNzR2VuZXJhdG9yU3VwZXJJbmRleGVkQWNjZXNzR2VuZXJhdG9yU3RhdGljQWNjZXNzR2VuZXJhdG9yZnJvbUJ1aWxkZXIsIHRhcmdldE5hbWU6ICwgcmVhZFRhcmdldDogLCB3cml0ZVRhcmdldDogRXh0ZW5zaW9uSW5zdGFuY2VBY2Nlc3NHZW5lcmF0b3JFeHRlbnNpb25JbnN0YW5jZUFjY2Vzc0dlbmVyYXRvci5mcm9tQnVpbGRlckluc3RhbmNlRXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yX2NyZWF0ZUV4dGVuc2lvblR5cGVBcmd1bWVudHNjcmVhdGVUeXBlUGFyYW1ldGVyVHlwZVdpdGhEZWZhdWx0TnVsbGFiaWxpdHlGb3JMaWJyYXJ5RXhwbGljaXRFeHRlbnNpb25JbnN0YW5jZUFjY2Vzc0dlbmVyYXRvckluc3RhbmNlRXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yLmZyb21CdWlsZGVyRXhwbGljaXRFeHRlbnNpb25JbmRleGVkQWNjZXNzR2VuZXJhdG9yaXNSZWFkVGVhck9mZnJlY2VpdmVyVmFyaWFibGVFeHBsaWNpdEV4dGVuc2lvbkFjY2Vzc0dlbmVyYXRvckV4cGxpY2l0RXh0ZW5zaW9uQWNjZXNzR2VuZXJhdG9yLnBsYWluTmFtZUZvclJlYWRfY3JlYXRlSW5zdGFuY2VBY2Nlc3MsIGV4dGVuc2lvbkJ1aWxkZXI6IExvYWRMaWJyYXJ5R2VuZXJhdG9yaW1wb3J0RGVwZW5kZW5jeWNyZWF0ZVRlYXJvZmZNZXRob2RjcmVhdGVMb2FkTGlicmFyeSwgYnVpbGRlcjogRGVmZXJyZWRBY2Nlc3NHZW5lcmF0b3JwcmVmaXhHZW5lcmF0b3JzdWZmaXhHZW5lcmF0b3Jwcm9wZXJ0eUFjY2Vzc2RlZmVycmVkQWNjZXNzb3IucGxhaW5OYW1lRm9yUmVhZCwgcHJlZml4R2VuZXJhdG9yOiAsIHN1ZmZpeEdlbmVyYXRvcjogVHlwZVVzZUdlbmVyYXRvcmFyZ3VtZW50QnVpbGRlcnMsIGRlY2xhcmF0aW9uOiAsIHBsYWluTmFtZUZvclJlYWQ6IGNyZWF0ZVR5cGVMaXRlcmFsUmVhZE9ubHlBY2Nlc3NHZW5lcmF0b3IsIGV4cHJlc3Npb246ICwgdmFsdWU6IEVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3JidWlsZEVycm9yVW5yZXNvbHZlZE5hbWVHZW5lcmF0b3JfYnVpbGRVbnJlc29sdmVkVmFyaWFibGVBc3NpZ25tZW50aXNDb21wb3VuZENvbnRleHRBd2FyZUdlbmVyYXRvcnBsYWluTmFtZUZvclJlYWRtYWtlSW52YWxpZFJlYWREZWxheWVkQXNzaWdubWVudGhhbmRsZUFzc2lnbm1lbnQsIGFzc2lnbm1lbnRPcGVyYXRvcjogRGVsYXllZFBvc3RmaXhJbmNyZW1lbnQsIGJpbmFyeU9wZXJhdG9yOiBQcmVmaXhVc2VHZW5lcmF0b3InICE9ICwgcHJlZml4OiAsIGRlZmVycmVkOiBVbmV4cGVjdGVkUXVhbGlmaWVkVXNlR2VuZXJhdG9yUGFyc2VyRXJyb3JHZW5lcmF0b3IjcGFyc2VyLWVycm9yVGhpc0FjY2Vzc0dlbmVyYXRvcmlzSW5pdGlhbGl6ZXIucGxhaW5OYW1lRm9yUmVhZGJ1aWxkRmllbGRJbml0aWFsaXplckVycm9yYnVpbGRDb25zdHJ1Y3RvckluaXRpYWxpemVyYnVpbGRBc3NpZ25tZW50RXJyb3IsIGlzSW5pdGlhbGl6ZXI6ICwgaW5GaWVsZEluaXRpYWxpemVyOiAsIGluTGF0ZUZpZWxkSW5pdGlhbGl6ZXI6ICwgaXNTdXBlcjogSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3JfSW5jb21wbGV0ZUVycm9yR2VuZXJhdG9yJkVycm9uZW91c0V4cHJlc3Npb25HZW5lcmF0b3ImSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3JJbmNvbXBsZXRlRXJyb3JHZW5lcmF0b3IsIG1lc3NhZ2U6IF9TZW5kQWNjZXNzR2VuZXJhdG9yJkdlbmVyYXRvciZJbmNvbXBsZXRlU2VuZEdlbmVyYXRvclNlbmRBY2Nlc3NHZW5lcmF0b3JidWlsZE51bGxBd2FyZUFzc2lnbm1lbnQsIGFyZ3VtZW50czogX0luY29tcGxldGVQcm9wZXJ0eUFjY2Vzc0dlbmVyYXRvciZHZW5lcmF0b3ImSW5jb21wbGV0ZVNlbmRHZW5lcmF0b3JJbmNvbXBsZXRlUHJvcGVydHlBY2Nlc3NHZW5lcmF0b3JQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkdlbmVyYXRvcmNyZWF0ZVBhcmVudGhlc2l6ZWRhZGp1c3RGb3JJbXBsaWNpdENhbGxmYXN0YS5leHByZXNzaW9uX2dlbmVyYXRvcl9oZWxwZXJmYXN0YS5mYW5nb3Juc3ludGhlc2l6ZWRBc3NpZ25tZW50YXNzZXJ0U3RhdGVtZW50ZGVjbGFyYXRpb25zZXhjZXB0aW9uUGFyYW1ldGVyc3RhY2tUcmFjZVBhcmFtZXRlcnN0YWNrVHJhY2VUeXBldXBkYXRlcnN0aGVuU3RhdGVtZW50ZWxzZVN0YXRlbWVudHJldGhyb3dGaWxlT2Zmc2V0c3RhdGVtZW50RmlsZU9mZnNldGNyZWF0ZUZ1bmN0aW9uTm9kZWNyZWF0ZVR5cGVQYXJhbWV0ZXJjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb25jcmVhdGVOYW1lZEV4cHJlc3Npb25fVmFyaWFibGVzRGVjbGFyYXRpb25mYXN0YS5pbXBsaWNpdF90eXBlX2FyZ3VtZW50Y29tcHV0ZVN0cm9uZ0NvbXBvbmVudHNUeXBlVmFyaWFibGVzR3JhcGh2YXJpYWJsZUluZGljZXNjb2xsZWN0UmVmZXJlbmNlc0Zyb21UeXBlVmFyaWFibGVTZWFyY2hhbnlUeXBlVmFyaWFibGVzZGVjbGFyYXRpb25UeXBlVmFyaWFibGVWYXJpYW5jZWRlY2xhcmF0aW9uVHlwZVZhcmlhYmxlY29tcHV0ZWRWYXJpYW5jZWNvbWJpbmVOdWxsYWJpbGl0eUJ1aWxkZXJzRm9yU3Vic3RpdHV0aW9uQm90aCBhcmd1bWVudHMgdG8gY29tYmluZU51bGxhYmlsaXR5QnVpbGRlcnNGb3JTdWJzdGl0dXRpb24gc2hvdWxkIGJlIGlkZW50aWNhbCB0byBlaXRoZXIgJ2NvbnN0IE51bGxhYmlsaXR5QnVpbGRlci5udWxsYWJsZSgpJyBvciAnY29uc3QgTnVsbGFiaWxpdHlCdWlsZGVyLm9taXR0ZWQoKScuc3Vic3RpdHV0ZVJhbmdldXBwZXJTdWJzdGl0dXRpb25sb3dlclN1YnN0aXR1dGlvbnVuYm91bmRUeXBlc3VuYm91bmRUeXBlVmFyaWFibGVzQ2FuIG5vdCBoYW5kbGUgdW5ib3VuZCBuYW1lZCB0eXBlIGJ1aWxkZXJzIHdpdGhvdXQgYHVuYm91bmRUeXBlc2AuQ2FuIG5vdCBoYW5kbGUgdW5ib3VuZCBuYW1lZCB0eXBlIGJ1aWxkZXJzIHdpdGhvdXQgYHVuYm91bmRUeXBlVmFyaWFibGVzYC5DYW4gb25seSBoYW5kbGUgdW5ib3VuZCBuYW1lZCB0eXBlIGJ1aWxkZXJzIGlkZW50aWNhbCBgdXBwZXJTdWJzdGl0dXRpb25gIGFuZCBgbG93ZXJTdWJzdGl0dXRpb25gLnN1YnN0aXR1dGVkQXJndW1lbnRVbmV4cGVjdGVkIG5hbWVkIHR5cGUgYnVpbGRlciBkZWNsYXJhdGlvbjogbmV3VHlwZUJ1aWxkZXJmdW5jdGlvblR5cGVVcHBlclN1YnN0aXR1dGlvbmZ1bmN0aW9uVHlwZUxvd2VyU3Vic3RpdHV0aW9ubmV3VHlwZVZhcmlhYmxlQnVpbGRlcnBhcmFtZXRlclR5cGVzdHJvbmdseUNvbm5lY3RlZGR5bmFtaWNTdWJzdGl0dXRpb25udWxsU3Vic3RpdHV0aW9uZmluZFZhcmlhYmxlVXNlc0luVHlwZXVzZXNkZXBlbmRlbnRWYXJpYWJsZWZpbmRJbmJvdW5kUmVmZXJlbmNlc3ZhcmlhYmxlc0FuZERlcGVuZGVuY2llc2RlcGVuZGVudGRlcGVuZGVuY2VmaW5kUmF3VHlwZXNXaXRoSW5ib3VuZFJlZmVyZW5jZXN0eXBlc0FuZERlcGVuZGVuY2llc2hhc0luYm91bmRnZXRJbmJvdW5kUmVmZXJlbmNlSXNzdWVzcmF3VHlwZXNBbmRNdXR1YWxEZXBlbmRlbmNpZXNmaW5kUmF3VHlwZVBhdGhzVG9EZWNsYXJhdGlvbnZpc2l0ZWRwYXRoc2RlcGVuZGVuY3lQYXRoZmluZFJhd1R5cGVDeWNsZXNjeWNsZXNjb252ZXJ0UmF3VHlwZUN5Y2xlc0ludG9Jc3N1ZXNjeWNsZWZpcnN0RW5jb3VudGVyZWRUeXBlY3ljbGVzVG9SZXBvcnRkZWNsYXJhdGlvblBhdGhBbmROYW1lbGV4TWluUGF0aEFuZE5hbWVwYXRoQW5kTmFtZXJhd1R5cGVDeWNsZXNBc0lzc3Vlc2JyZWFrQ3ljbGVzZmFzdGEua2VybmVsX2FzdF9hcGlrZXJuZWwudHJhbnNmb3JtYXRpb25zLmFzeW5jRXhwcmVzc2lvbkxpZnRlcmNvbnRpbnVhdGlvblJld3JpdGVyc2VlbkF3YWl0bmFtZUluZGV4YmxvY2tPZmRlbGltaXRhbGxvY2F0ZVRlbXBvcmFyeTphc3luY190ZW1wb3JhcnlfbnVsbGFyeXNob3VsZE5hbWV1bmFyeXJpZ2h0U3RhdGVtZW50c3JpZ2h0QXdhaXRyaWdodEJvZHl0aGVuU3RhdGVtZW50c3RoZW5Bd2FpdG90aGVyd2lzZVN0YXRlbWVudHNvdGhlcndpc2VBd2FpdHRoZW5Cb2R5b3RoZXJ3aXNlQm9keWJyYW5jaG5lc3RlZFJld3JpdGVydHJhbnNsYXRpb25zYXZlZElubmVyc2F2ZWRPdXRlcmNvbnZlcnQudXRpbHNkaWdpdEZvckNvZGVVbml0SW52YWxpZCBoZXhhZGVjaW1hbCBjb2RlIHVuaXQgU3ludGFjdGljRW50aXR5U3RyaW5nVXRpbGl0aWVzSU5URVJORVJpbnRlcm5fZmVfYW5hbHl6ZXJfc2hhcmVkLnNjYW5uZXIua2V5d29yZHNfS0VZV09SRF9TVEFURUtFWVdPUkRfU1RBVEVjb21wdXRlS2V5d29yZFN0YXRlVGFibGVpc0xvd2VyY2FzZWNodW5rU3RhcnRpc0xlYWZBcnJheUtleXdvcmRTdGF0ZWZvb0xvd2VyQ2FzZUFycmF5S2V5d29yZFN0YXRlVXBwZXJDYXNlQXJyYXlLZXl3b3JkU3RhdGVMZWFmS2V5d29yZFN0YXRlX2ZlX2FuYWx5emVyX3NoYXJlZC5zY2FubmVyLnJlY292ZXJJbnRlcm5hbCBlcnJvcjogQWxsIGVycm9yIHRva2VucyBzaG91bGQgaGF2ZSBiZWVuIHByZXBlbmRlZDpzeW50aGVzaXplVG9rZW5za2lwVG9Fb2ZvcGVuUXVvdGVUeXBlVmFyaWFibGVHcmFwaHR5cGVQYXJhbWV0ZXJJbmRpY2Vzb2NjdXJyZWRPY2N1cnJlbmNlQ29sbGVjdG9yVmlzaXRvclZhcmlhbmNlQ2FsY3VsYXRvcl92aXNpdE1hcmtlcmNvbXB1dGVkVmFyaWFuY2Vzd2hlbiBjb21wdXRpbmcgdmFyaWFuY2Ugb2YgYSB0eXBlIHBhcmFtZXRlci50eXBlZGVmVHlwZVBhcmFtZXRlcmhhcyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuZnVuY3Rpb25UeXBlUGFyYW1ldGVycG9zaXRpb25hbFR5cGVuYW1lZFR5cGV1cHBlckJvdW5kc2xvd2VyQm91bmRzdHlwZVBhcmFtZXRlckluZGV4dHlwZWRlZlJoc1Jlc3VsdGFyZ3VtZW50c1Jlc3VsdGFyZ3VtZW50c1RvUmVwb3J0dHlwZWRlZkluc3RhbnRpYXRpb25zY29udmVydFN1cGVyQm91bmRlZFRvUmVndWxhckJvdW5kZWRyZXBsYWNlZFR5cGVBcmd1bWVudHNyZXBsYWNlZFJldHVyblR5cGVyZXBsYWNlZFBvc2l0aW9uYWxQYXJhbWV0ZXJzcmVwbGFjZWROYW1lZFBhcmFtZXRlcnNEZXNlcmlhbGl6YXRpb25TdGF0ZVNlcmlhbGl6YXRpb25TdGF0ZVRleHRTZXJpYWxpemVyVGV4dEl0ZXJhdG9yZGFydFR5cGVTZXJpYWxpemVyZXhwcmVzc2lvblNlcmlhbGl6ZXJpbml0aWFsaXplU2VyaWFsaXplcnNzdGF0ZW1lbnRTZXJpYWxpemVyVGV4dFNlcmlhbGl6YXRpb25WZXJpZmljYXRpb25GYWlsdXJlVGV4dFNlcmlhbGl6YXRpb25GYWlsdXJlVGV4dERlc2VyaWFsaXphdGlvbkZhaWx1cmVUZXh0Um91bmRUcmlwRmFpbHVyZWluaXRpYWxzZXJpYWxpemVkVGV4dFNlcmlhbGl6YXRpb25WZXJpZmllcmZhaWx1cmVzbGFzdFNlZW5VcmlsYXN0U2Vlbk9mZnNldHN0b3JlTGFzdFNlZW5VcmlBbmRPZmZzZXRyZWFkTm9kZXNlcmlhbGl6ZXJyZWFkRnJvbXVuZXhwZWN0ZWQgdHJhaWxpbmcgdGV4dHdyaXRlVG9tYWtlRXhwcmVzc2lvblJvdW5kVHJpcGRlc2VyaWFsaXplZG1ha2VEYXJ0VHlwZVJvdW5kVHJpcG1ha2VTdGF0ZW1lbnRSb3VuZFRyaXBub1VyaWZhc3RhLmRpbGxfbWVtYmVyX2J1aWxkZXJEaWxsTWVtYmVyQnVpbGRlci5idWlsZE1lbWJlcnNmYXN0YS50eXBlc2lzRHluYW1pY1JlbGF0ZWRpc1ZvaWRSZWxhdGVkaXNGdXR1cmVPclJlbGF0ZWRpc0ludGVyZmFjZVJlbGF0ZWRpc0Z1bmN0aW9uUmVsYXRlZGlzVHlwZVBhcmFtZXRlclJlbGF0ZWRpc0ludGVyc2VjdGlvblJlbGF0ZWRpc1R5cGVkZWZSZWxhdGVkVW5oYW5kbGVkIHR5cGU6IFVuaGFuZGxlZCB0eXBlIGNvbWJpbmF0aW9uOiBhcmVUeXBlQXJndW1lbnRzT2ZTdWJ0eXBlS2VybmVsTnVtYmVycyBvZiB0eXBlIGFyZ3VtZW50cyBkb24ndCBtYXRjaCAgd2l0aCBwYXJhbWV0ZXJzIGdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2ZUeXBlUmVsYXRpb25Jc0ludGVyZmFjZVN1YnR5cGVPZmFzU3VwZXJ0eXBlQXJndW1lbnRzSXNGdW5jdGlvblN1YnR5cGVPZnNUeXBlVmFyaWFibGVzdFR5cGVWYXJpYWJsZXN0eXBlVmFyaWFibGVTdWJzdGl0dXRpb25zVHlwZVZhcmlhYmxldFR5cGVWYXJpYWJsZXNQb3NpdGlvbmFsdFBvc2l0aW9uYWxzTmFtZWR0TmFtZWRzQ291bnR0Q291bnRJc1R5cGVQYXJhbWV0ZXJTdWJ0eXBlT2ZJc1R5cGVkZWZTdWJ0eXBlT2ZJc0Z1dHVyZU9yU3VidHlwZU9mc0Z1dHVyZU9ydEZ1dHVyZU9yc0FyZ3VtZW50dEFyZ3VtZW50SXNJbnRlcnNlY3Rpb25TdWJ0eXBlT2ZzSW50ZXJzZWN0aW9udEludGVyc2VjdGlvbklzTmV2ZXJUeXBlU3VidHlwZU9mVW5leHBlY3RlZCBudWxsYWJpbGl0eSAnLm51bGxhYmlsaXR5JyBvZiB0eXBlIE5ldmVyVHlwZVNjaGVtYVByaW50ZXJfSXNLbm93blZpc2l0b3JuYW1lZFBhcmFtZXRlclR5cGVzY2hlbWF0eXBlU2NoZW1hVG9TdHJpbmdmYXN0YS5jb25zdHJ1Y3Rvcl9yZWZlcmVuY2VfYnVpbGRlckNvbnN0cnVjdG9yUmVmZXJlbmNlQnVpbGRlcmZhc3RhLm1ldGFkYXRhX2J1aWxkZXJNZXRhZGF0YUJ1aWxkZXJidWlsZEFubm90YXRpb25zYW5ub3RhdGlvbkJ1aWxkZXJmYXN0YS5uZXZlcl90eXBlX2J1aWxkZXJOZXZlclR5cGVCdWlsZGVyZmFzdGEuZ3JhcGhwcmVvcmRlck51bWJlcnN1bmFzc2lnbmVkcmVjdXJzaXZlbHlTZWFyY2huZWlnaGJvclByZW9yZGVyTnVtYmVyZmFzdGEuZHluYW1pY190eXBlX2J1aWxkZXJEeW5hbWljVHlwZUJ1aWxkZXJEaWxsRXh0ZW5zaW9uQnVpbGRlcl9vblR5cGVfbWV0aG9kc190ZWFyT2Zmc2Zhc3RhLmRpbGxfbG9hZGVyVHlwZUJ1aWxkZXJDb21wdXRlcmNvbXBvbmVudExpYnJhcmllc3JlcXVlc3RlZExpYnJhcmllc2J1aWxkZXIubGlicmFyeWtlcm5lbExpYnJhcnlmYXN0YS5kaWxsX3R5cGVkZWZfYnVpbGRlcmZhc3RhLnRhcmdldF9pbXBsZW1lbnRhdGlvbmJhY2tlbmRyZXdyaXRlU2V2ZXJpdHljYWNoZWRBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yY2FjaGVkQ29tcGlsZVRpbWVFcnJvcmNhY2hlZER1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3JjYWNoZWROYXRpdmVBbm5vdGF0aW9uZW5hYmxlTm9uZnVuY3Rpb25UeXBlQWxpYXNlc19jdXJyZW50U2RrVmVyc2lvbk1ham9yX2N1cnJlbnRTZGtWZXJzaW9uTWlub3JBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yX0NvbXBpbGVUaW1lRXJyb3JfRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcm1lc3NhZ2VDb250ZXh0X3BhcnNlQ3VycmVudFNka1ZlcnNpb25VbnBhcnNhYmxlIHNkayB2ZXJzaW9uIGdpdmVuOiBmYXN0YS5jb25maWd1cmF0aW9uZmFzdGEuY2xhc3NfaGllcmFyY2h5X2J1aWxkZXJ0eXBlVG9UZXh0U3RhbmRhcmRCb3VuZHNGb3J3YXJkaW5nTm9kZURlYnVnTG9nZ2Vyb3ZlcnJpZGVDaGVja3NkZWxheWVkTWVtYmVyQ2hlY2tzZ2V0Tm9kZUZyb21DbGFzc0J1aWxkZXJnZXROb2RlRnJvbVR5cGVCdWlsZGVyZ2V0Tm9kZUZyb21DbGFzc2FzU3VwZXJ0eXBlT2ZjbHNOb2Rlc3VwZXJ0eXBlTm9kZXN1cGVyY2xhc3Nlc3N1cGVyaW50ZXJmYWNlc3N1cGVyaW50ZXJmYWNla2VybmVsQ2xhc3NnZXRLZXJuZWxMZWdhY3lMZWFzdFVwcGVyQm91bmRub2RlMW5vZGUybm9kZXMxY29tcHV0ZUFsbFN1cGVyTm9kZXNub2RlczJjYW5kaWRhdGUxY2FuZGlkYXRlMm1heEluaGVyaXRhbmNlUGF0aGdldERpc3BhdGNoVGFyZ2V0S2VybmVsQ2xhc3NIaWVyYXJjaHlOb2RlQnVpbGRlcmhhc05vU3VjaE1ldGhvZGFic3RyYWN0TWVtYmVyc3N1YnN0aXR1dGlvbnNzaG91bGRNb2RpZnlLZXJuZWxoYW5kbGVNZXJnZUNvbmZsaWN0bWVyZ2VLaW5kaGFuZGxlTWVyZ2VDb25mbGljdDogY2hlY2tJbmhlcml0YW5jZUNvbmZsaWN0TWVyZ2luZyBzdXBlcmNsYXNzIG1lbWJlcnMgd2l0aCB0aGUgY3VycmVudCBjbGFzcy5NZXJnaW5nIHN1cGVyY2xhc3Mgc2V0dGVycyB3aXRoIHRoZSBjdXJyZW50IGNsYXNzLnN1cGVyY2xhc3M6IGNoZWNrVmFsaWRPdmVycmlkZShjaGVja1ZhbGlkT3ZlcnJpZGVyZWNvcmRBYnN0cmFjdE1lbWJlcmlzSW5oZXJpdGFibGVDb25mbGljdE1lcmdpbmcgbWVtYmVycyB3aXRoIGluaGVyaXRlZCBzZXR0ZXJzLk1lcmdpbmcgc2V0dGVycyB3aXRoIGluaGVyaXRlZCBtZW1iZXJzLmluZmVyRmllbGRUeXBlc2luZmVyTWV0aG9kVHlwZXNNZXJnaW5nIG1lbWJlcnMgb2YgdHdvIGludGVyZmFjZXMuTWVyZ2luZyBzZXR0ZXJzIG9mIHR3byBpbnRlcmZhY2VzLk1lcmdpbmcgY2xhc3MgbWVtYmVycyB3aXRoIGludGVyZmFjZSBtZW1iZXJzLk1lcmdpbmcgY2xhc3Mgc2V0dGVycyB3aXRoIGludGVyZmFjZSBzZXR0ZXJzLnN1cGVydHlwZXM6IGNoZWNrVmFsaWRPdmVycmlkZShhZGRBbGxEZWNsYXJhdGlvbnNUb3N1cGVydHlwZXM6IHJlcG9ydEluaGVyaXRhbmNlQ29uZmxpY3RUcnlpbmcgdG8gaW5mZXIgdHlwZXMgZm9yICBiYXNlZCBvbiBoYXNTYW1lU2lnbmF0dXJlaW5mZXJHZXR0ZXJUeXBlaW5mZXJTZXR0ZXJUeXBlYUNsYXNzQnVpbGRlcmJDbGFzc0J1aWxkZXJObyBzdWJzdGl0dXRpb24gZm91bmQgZm9yICcnIGFzIGluc3RhbmNlIG9mICcnLiBTdWJzdGl0dXRpb25zIGF2YWlsYWJsZSBmb3I6IGFQcm9jZWR1cmVHaXZpbmcgdXAgMWJQcm9jZWR1cmVhRnVuY3Rpb25iRnVuY3Rpb25hVHlwZVBhcmFtZXRlcnNiVHlwZVBhcmFtZXRlcnNHaXZpbmcgdXAgMmNvcHlUeXBlUGFyYW1ldGVyQ292YXJpYW5jZWFCb3VuZGJCb3VuZEdpdmluZyB1cCAzYVJldHVyblR5cGViUmV0dXJuVHlwZUdpdmluZyB1cCA0YVBvc2l0aW9uYWxiUG9zaXRpb25hbEdpdmluZyB1cCA1R2l2aW5nIHVwIDZhUGFyYW1ldGVyYlBhcmFtZXRlcmNvcHlQYXJhbWV0ZXJDb3ZhcmlhbmNlR2l2aW5nIHVwIDhhTmFtZWRiTmFtZWRHaXZpbmcgdXAgOUdpdmluZyB1cCAxMGFDb3VudGJDb3VudEdpdmluZyB1cCAxMUdpdmluZyB1cCAxMkluZmVycmluZyB0eXBlcyBmb3Igc3VjY2VlZGVkLmZhaWxlZC5JbmZlcnJpbmcgZ2V0dGVyIHR5cGVzIGZvciBiVGFyZ2V0R2l2aW5nIHVwICh0eXBlIG1heSBiZSBpbmZlcnJlZClHaXZpbmcgdXAgKHJldHVybiB0eXBlIG1heSBiZSBpbmZlcnJlZClHaXZpbmcgdXAgKG5vdCBhY2Nlc3NvcjogR2l2aW5nIHVwIChub3QgZmllbGQvcHJvY2VkdXJlOiBJbmZlcnJpbmcgc2V0dGVyIHR5cGVzIGZvciBjb3B5UGFyYW1ldGVyQ292YXJpYW5jZUZyb21GaWVsZGNoZWNrVmFsaWRPdmVycmlkZShhVGFyZ2V0VHJ5aW5nIHRvIGluZmVyIGZpZWxkIHR5cGVzIGZvciBiYXNlZCBvbiBpbmhlcml0ZWRUeXBlY29weUZpZWxkQ292YXJpYW5jZUZyb21QYXJhbWV0ZXJjb3B5RmllbGRDb3ZhcmlhbmNlR2l2aW5nIHVwIChpbmhlcml0ZWRUeXBlID09IG51bGwpCmFGaWVsZGlzVmFsaWRPdmVycmlkZWFkZE92ZXJyaWRlYkZpZWxkc3RhdGljTWVtYmVyZHVwbGljYXRlaGFuZGxlT25seUFiZXR3ZWVuSW50ZXJmYWNlc2Zyb21TdXBlcmNsYXNzaGFuZGxlT25seUJmcm9tSW50ZXJmYWNlc2Zvck1lbWJlcnNWc1NldHRlcnNkZWxheWVkTWVtYmVyd2l0aFBhcmVudGludG9DdXJyZW50Q2xhc3NzdXBlcm5vZGVpbmZlck1peGluQXBwbGljYXRpb25tZXJnZUFjY2Vzc29yc2NsYXNzTWVtYmVyc2NsYXNzU2V0dGVyc2ludGVyZmFjZU1lbWJlcnNpbnRlcmZhY2VTZXR0ZXJzc3Vic3RTdXBlcnR5cGVzcmVjb3JkU3VwZXJ0eXBlZGlyZWN0SW50ZXJmYWNlQnVpbGRlcnNpZ25vcmVGdW5jdGlvbnN1cGVyY2xhc3NJbnRlcmZhY2VzbWVyZ2VJbnRlcmZhY2VzbWVyZ2VkTWVtYmVyc21lcmdlZFNldHRlcnNhZGRJbnRlcmZhY2VkaXJlY3RJbnRlcmZhY2VpbnRlcmZhY2VOb2RlcmVwb3J0TWlzc2luZ01lbWJlcnNpbnN0YWxsTnNtSGFuZGxlcnNJbiByZWNvcmRTdXBlcnR5cGUoIGFyZW4ndCBzdWJzdGVkc3Vic3RpdHV0ZWQgaXNuJ3Qgc3Vic3RlZGNvbXB1dGVEZWZhdWx0VHlwZUFyZ3VtZW50c215RGVwdGhpbnRlcmZhY2VCdWlsZGVyc21lcmdlSW50ZXJmYWNlcyhtZW1iZXJMaXN0c3NldHRlckxpc3RzbWVyZ2VMaXN0c2NvbnRleHRNYXBhTGlzdGJMaXN0TGlzdCBtaXNtYXRjaDogRXhwZWN0ZWQ6IGFjdHVhbCBpbmZlcnJlZEFyZ3VtZW50c21peGVkSW5UeXBlQnVpbGRlckNsYXNzSGllcmFyY2h5Tm9kZSAgTG9uZ2VzdCBwYXRoIHRvIE9iamVjdDogICBzdXBlcmNsYXNzZXM6LT4gICBpbnRlcmZhY2VzOnByaW50TWVtYmVyc2hlYWRpbmdmaW5kTWVtYmVyY29tcGFyZU1heEluaGVyaXRhbmNlUGF0aE1lcmdlUmVzdWx0TWVyZ2VLaW5kc3VwZXJjbGFzc01lbWJlcnNzdXBlcmNsYXNzU2V0dGVyc2ludGVyZmFjZXNNZW1iZXJzaW50ZXJmYWNlc1NldHRlcnNzdXBlcnR5cGVzTWVtYmVyc3N1cGVydHlwZXNTZXR0ZXJzbWVtYmVyc1dpdGhTZXR0ZXJzc2V0dGVyc1dpdGhNZW1iZXJzTWVyZ2VLaW5kKEJ1aWxkZXJNaXhpbkluZmVycmVyX1R5cGVCdWlsZGVyQ29uc3RyYWludEdhdGhlcmVyJlR5cGVDb25zdHJhaW50R2F0aGVyZXImU3RhbmRhcmRCb3VuZHNzdWJjbGFzc2luZ2FyZU11dHVhbFN1YnR5cGVzbW9yZXRvcG5vbk51bGxhYmxlU25vbk51bGxhYmxlVG1vcmV0b3AobW9yZWJvdHRvbW1vcmVib3R0b20oZ2V0U3RhbmRhcmRMb3dlckJvdW5kZ2V0TnVsbGFiaWxpdHlBd2FyZVN0YW5kYXJkTG93ZXJCb3VuZGdldE51bGxhYmlsaXR5T2JsaXZpb3VzU3RhbmRhcmRMb3dlckJvdW5kdHlwZTJOdWxsYWJpbGl0eXR5cGUxTnVsbGFiaWxpdHlfZ2V0TnVsbGFiaWxpdHlBd2FyZUZ1bmN0aW9uU3RhbmRhcmRMb3dlckJvdW5kbm9uTnVsbGFibGVUeXBlMW5vbk51bGxhYmxlVHlwZTJfZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNGdW5jdGlvblN0YW5kYXJkTG93ZXJCb3VuZGdldE51bGxhYmlsaXR5QXdhcmVTdGFuZGFyZFVwcGVyQm91bmRnZXROdWxsYWJpbGl0eU9ibGl2aW91c1N0YW5kYXJkVXBwZXJCb3VuZF9nZXROdWxsYWJpbGl0eUF3YXJlVHlwZVBhcmFtZXRlclN0YW5kYXJkVXBwZXJCb3VuZF9nZXROdWxsYWJpbGl0eUF3YXJlRnVuY3Rpb25TdGFuZGFyZFVwcGVyQm91bmRFeHBlY3RlZCB0eXBlMSB0byBiZSBhbiBpbnRlcmZhY2UgdHlwZSwgZ290ICdFeHBlY3RlZCB0eXBlMiB0byBiZSBhbiBpbnRlcmZhY2UgdHlwZSwgZ290ICdsZWZ0QXJndW1lbnRzcmlnaHRBcmd1bWVudHNoYXZlTmFtZWRoYXZlT3B0aW9uYWxQb3NpdGlvbmFsZmFsbGJhY2tSZXN1bHRib3VuZHNNYXRjaG1heFBvc21pblBvc25hbWVkMW5hbWVkMmRlbW90ZWRfZ2V0TnVsbGFiaWxpdHlPYmxpdmlvdXNUeXBlUGFyYW1ldGVyU3RhbmRhcmRVcHBlckJvdW5kX2dldEludGVyZmFjZVN0YW5kYXJkVXBwZXJCb3VuZF9nZXROdWxsYWJpbGl0eU9ibGl2aW91c0Z1bmN0aW9uU3RhbmRhcmRVcHBlckJvdW5kdHlwZTEgPSA7IHR5cGUyID0gdG90YWxQb3NpdGlvbmFsZlR5cGVnVHlwZWhhc1Bvc2l0aW9uYWxmTmFtZWdOYW1laGFzTmFtZWR0QXJnczF0QXJnczJ0UGFyYW1zdEFyZ3NUeXBlQnVpbGRlckNvbnN0cmFpbnRHYXRoZXJlcmFkZExvd2VyQm91bmRhZGRVcHBlckJvdW5kRGVsYXllZCBvdmVycmlkZSBjaGVjayBvZiAgd3J0LiBJbmZlcnJlZCB0eXBlICBmb3IgbW9kaWZ5S2VybmVsSW5oZXJpdGVkSW1wbGVtZW50YXRpb25JbnRlcmZhY2VDb25mbGljdGNvbWJpbmVkTWVtYmVyU2lnbmF0dXJlUmVzdWx0SW5oZXJpdGVkSW1wbGVtZW50YXRpb25JbnRlcmZhY2VDb25mbGljdChjb25jcmV0ZUltcGxlbWVudGF0aW9uY29tYmluZWRjcmVhdGVGb3J3YXJkZXJzSW50ZXJmYWNlQ29uZmxpY3RJbnRlcmZhY2VDb25mbGljdChjb21wdXRlTWVtYmVyVHlwZU5vIGluc3RhbmNlIG9mICBhcyBiZXN0VHlwZVNvRmFyQ29tYmluZWQgTWVtYmVyIFNpZ25hdHVyZTogIDw6ICAhPDogQ29tYmluZWQgTWVtYmVyIFNpZ25hdHVyZSBiZXN0U29GYXI6IGRhcnQ6anNqcy5kYXJ0anNfbnVtYmVyLmRhcnRDb21iaW5lZCBNZW1iZXIgU2lnbmF0dXJlIG9mIGJlc3RNZW1iZXJTb0ZhcjogbmV3IEZvcndhcmRpbmdOb2RlKHN0dWJmaW5hbGl6ZWFkZGVkIHN0dWIgOiBwaWNrZWQgYmVzdFNvRmFyQWJzdHJhY3RNZW1iZXJPdmVycmlkaW5nSW1wbGVtZW50YXRpb25hYnN0cmFjdE1lbWJlckFic3RyYWN0TWVtYmVyT3ZlcnJpZGluZ0ltcGxlbWVudGF0aW9uKHNlbGVjdEFic3RyYWN0c2VsZWN0Q29uY3JldGVjb21wYXJlRGVjbGFyYXRpb25zaXNOYW1lVmlzaWJsZUluaXNJbmhlcml0YW5jZUNvbmZsaWN0aW1wbGllc1NldHRlcmFQb3NpdGlvbmFsUGFyYW1ldGVyc2JQb3NpdGlvbmFsUGFyYW1ldGVyc2FOYW1lZFBhcmFtZXRlcnNiTmFtZWRQYXJhbWV0ZXJzaW5oZXJpdGVkQ29uZmxpY3RDb250ZXh0aW5oZXJpdGVkQ29uZmxpY3RDb250ZXh0S2VybmVsYWRkRGVjbGFyYXRpb25JZkRpZmZlcmVudGluZmVyUGFyYW1ldGVyVHlwZXBhcmFtZXRlckJ1aWxkZXJyZXBvcnRDYW50SW5mZXJQYXJhbWV0ZXJUeXBlcmVwb3J0Q2FudEluZmVyUmV0dXJuVHlwZXJlcG9ydENhbnRJbmZlckZpZWxkVHlwZWhhc0V4cGxpY2l0UmV0dXJuVHlwZWhhc0V4cGxpY2l0bHlUeXBlZEZvcm1hbFBhcmFtZXRlcl9lcXVhbHNMaXN0X2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIuY2xhc3NfbWVtYmVyX3BhcnNlckVycm9yRGVsZWdhdGlvbkxpc3RlbmVyc2tpcFBhcnNlcnNraXBFeHByZXNzaW9ucGFyc2VJZGVudGlmaWVyRXhwcmVzc2lvbm1heVBhcnNlRnVuY3Rpb25FeHByZXNzaW9uc2FzeW5jU3RhdGVsb29wU3RhdGVwYXJzZUFyZ3VtZW50c09wdHNraXBBcmd1bWVudHNPcHRwYXJzZUZ1bmN0aW9uQm9keWFsbG93QWJzdHJhY3Rza2lwRnVuY3Rpb25Cb2R5cGFyc2VJbnZhbGlkQmxvY2tza2lwQmxvY2tEZWNsYXJhdGlvbktpbmQuVG9wTGV2ZWxEZWNsYXJhdGlvbktpbmQuQ2xhc3NEZWNsYXJhdGlvbktpbmQuTWl4aW5EZWNsYXJhdGlvbktpbmQuRXh0ZW5zaW9uVG9wTGV2ZWxfZmVfYW5hbHl6ZXJfc2hhcmVkLnNjYW5uZXIudXRmOF9ieXRlc19zY2FubmVydW5pY29kZUJvbUNoYXJhY3RlclJ1bmVzY2FuU2xhY2tzY2FuU2xhY2tPZmZzZXR1dGY4U2xhY2tsYXN0VW5pY29kZU9mZnNldHN0cmluZ09mZnNldFNsYWNrT2Zmc2V0Y29udGFpbnNCb21BdG5leHRDb2RlUG9pbnRuZXh0Qnl0ZWV4cGVjdGVkSGlnaEJ5dGVzcmVzZnJvbnRfZW5kLnNyYy5mYXN0YS5zb3VyY2UuZGlyZWN0aXZlX2xpc3RlbmVyX2luUGFydF9jb21iaW5hdG9yc19jb21iaW5hdG9yTmFtZXNiZWdpbkV4cG9ydGJlZ2luSGlkZWJlZ2luSW1wb3J0YmVnaW5QYXJ0YmVnaW5TaG93ZW5kRXhwb3J0ZW5kSGlkZWVuZEltcG9ydGVuZFBhcnRlbmRTaG93TmFtZXNwYWNlQ29tYmluYXRvck5hbWVzcGFjZURpcmVjdGl2ZWZhc3RhLmltcGxpY2l0X3R5cGVfSW1wbGljaXRGaWVsZFR5cGVSb290X292ZXJyaWRkZW5GaWVsZHNpc1N0YXJ0ZWRvdmVycmlkZGVub3ZlcnJpZGRlblR5cGVlbmNsb3NpbmdDbGFzc1RoaXNUeXBlY3JlYXRlVG9wTGV2ZWxUeXBlSW5mZXJyZXJjcmVhdGVCb2R5QnVpbGRlckZvckZpZWxkSW1wbGljaXRGaWVsZFR5cGUoPHVubmFtZWQ+VmFyaWFibGVCdWlsZGVySW1wbChfI2xvYWRMaWJyYXJ5X190eXBlUGFyYW1ldGVyc1RvU2VhcmNoRm9yb2xkVmFyaWFuY2VUeXBlSW5mZXJlbmNlRW5naW5laXNUeXBlSW5mZXJlbmNlUHJlcGFyZWRmaW5pc2hUb3BMZXZlbEluaXRpYWxpemluZ0Zvcm1hbHNwcmVwYXJlVG9wTGV2ZWxyZXNvbHZlSW5mZXJlbmNlTm9kZVR5cGVJbmZlcmVuY2VFbmdpbmVJbXBsRmxvd0FuYWx5c2lzUmVzdWx0dW5hc3NpZ25lZE5vZGVzVHlwZU9wZXJhdGlvbnNDZmVsZWFzdENsb3N1cmUgPDogPHR5cGU+IDw6IF9UeXBlU2NoZW1hRW52aXJvbm1lbnQmSGllcmFyY2h5QmFzZWRUeXBlRW52aXJvbm1lbnQmU3RhbmRhcmRCb3VuZHNUeXBlU2NoZW1hRW52aXJvbm1lbnQuYXJlTXV0dWFsU3VidHlwZXN0eXBlUGFyYW1ldGVyc1RvSW5mZXJyZXR1cm5Db250ZXh0VHlwZWlzRW1wdHlDb250ZXh0aW5mZXJUeXBlRnJvbUNvbnN0cmFpbnRzZG93bndhcmRzSW5mZXJQaGFzZWhhc09taXR0ZWRCb3VuZHR5cGVzRnJvbURvd253YXJkc0luZmVyZW5jZXR5cGVQYXJhbUJvdW5kZXh0ZW5kc0NvbnN0cmFpbnRfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUNvbnRleHRfaW5mZXJUeXBlUGFyYW1ldGVyRnJvbUFsbGlzQ29udHJhdmFyaWFudHByZWZlclVwd2FyZHNJbmZlcmVuY2Vrbm93blR5cGVzdHlwZVNhdGlzZmllc0NvbnN0cmFpbnRzb2x2ZVR5cGVDb25zdHJhaW50Z3JvdW5kZWR0eXBlRnJvbUNvbnRleHRJbmZlcmVuY2VfY29yZVR5cGVzc3Vic3RpdHV0ZVR5cGVQYXJhbXNJbmZlcmVuY2VWaXNpdG9ybWFwRW50cnlDbGFzc21hcEVudHJ5T2Zmc2V0bWFwU3ByZWFkT2Zmc2V0aXRlcmFibGVTcHJlYWRPZmZzZXRpdGVyYWJsZVNwcmVhZFR5cGVfY2xvbmVUcnlpbmcgdG8gY2xvbmUgVmFyaWFibGVHZXQgb2Ygbm9uLWZpbmFsIHZhcmlhYmxlQ2xvbmUgbm90IHN1cHBvcnRlZCBmb3IgX3VuaGFuZGxlZEV4cHJlc3Npb25fdW5oYW5kbGVkU3RhdGVtZW50X3VuaGFuZGxlZEluaXRpYWxpemVyb3BlcmFuZFJlc3VsdGNvbmRpdGlvblJlc3VsdG1lc3NhZ2VSZXN1bHRfdmlzaXRTdGF0ZW1lbnRzc3RhdGVtZW50UmVzdWx0cmVnaXN0ZXJBbGlhc3JlcG9ydE5vbk51bGxhYmxlSW5OdWxsQXdhcmVXYXJuaW5nSWZOZWVkZWRleHByZXNzaW9uUmVzdWx0c2lzVGhlblJlYWNoYWJsZXRoZW5SZXN1bHRpc090aGVyd2lzZVJlYWNoYWJsZW90aGVyd2lzZVJlc3VsdGhhc0V4cGxpY2l0VHlwZUFyZ3VtZW50c3JlY2VpdmVyUmVzdWx0dmFsdWVSZXN1bHRhc3NpZ25tZW50YXNzaWdubWVudFZhcmlhYmxlcmVhZFJlY2VpdmVyd3JpdGVSZWNlaXZlcnJlYWRUeXBlYmluYXJ5UmVzdWx0X2NvbXB1dGVCaW5hcnlFeHByZXNzaW9uYmluYXJ5VHlwZXdyaXRlVmFyaWFibGVib29sVHlwZWhhZEV4cGxpY2l0VHlwZUFyZ3VtZW50c3Jlc3VsdE5vZGVoYW5kbGVGb3JJbkRlY2xhcmluZ1ZhcmlhYmxlaXRlcmFibGVSZXN1bHRpbmZlckZvckluSXRlcmFibGV0ZW1wVmFyaWFibGVpbXBsaWNpdERvd25jYXN0ZXhwcmVzc2lvbkVmZmVjdGluZmVycmVkRXhwcmVzc2lvblR5cGVzdXBlcnR5cGVBcmd1bWVudHNjb21wdXRlRm9ySW5WYXJpYWJsZWhhbmRsZUZvckluU3RhdGVtZW50V2l0aG91dFZhcmlhYmxlaGFuZGxlRm9ySW5XaXRob3V0VmFyaWFibGVmb3JJblZhcmlhYmxlY29tcHV0ZUVsZW1lbnRUeXBlaW5mZXJBc3NpZ25tZW50ZXhwcmVzc2lvblNpZGVFZmZlY3RzdmFyaWFibGVSZXN1bHR1cGRhdGVSZXN1bHRyZXR1cm5UeXBlSW5zdHJ1bWVudGF0aW9uT2Zmc2V0bGhzUmVzdWx0cmhzUmVzdWx0b3JpZ2luYWxMaHNUeXBlbm9uTnVsbGFibGVMaHNUeXBlZ2V0U3ByZWFkRWxlbWVudFR5cGVzcHJlYWRUeXBlaW5mZXJFbGVtZW50aW5mZXJyZWRUeXBlQXJndW1lbnRpbmZlcnJlZFNwcmVhZFR5cGVzaW5mZXJyZWRDb25kaXRpb25UeXBlc3NwcmVhZFJlc3VsdHNwcmVhZEVsZW1lbnRUeXBlcHJvYmxlbVJlc3VsdGNoZWNrRWxlbWVudGNvbmRpdGlvblR5cGVsZWZ0UmVzdWx0cmlnaHRSZXN1bHRzdG9yZVNwcmVhZE1hcEVudHJ5RWxlbWVudFR5cGVzc3ByZWFkTWFwRW50cnlUeXBlaW5mZXJNYXBFbnRyeWluZmVycmVkS2V5VHlwZWluZmVycmVkVmFsdWVUeXBlc3ByZWFkQ29udGV4dGFjdHVhbFR5cGVzRm9yU2V0YWN0dWFsS2V5VHlwZWFjdHVhbFZhbHVlVHlwZWFjdHVhbEVsZW1lbnRUeXBla2V5RXJyb3J2YWx1ZUVycm9yaXNNYXBpc0l0ZXJhYmxlYWN0dWFsVHlwZUZvclNldGxlbmd0aEZvclNldGtleVJlc3VsdGNoZWNrTWFwRW50cnl0eXBlQ29udGV4dElzTWFwdHlwZUNvbnRleHRJc0l0ZXJhYmxlc2V0TGl0ZXJhbGhhc01hcEVudHJ5aGFzTWFwU3ByZWFkaGFzSXRlcmFibGVTcHJlYWRzcHJlYWRUeXBlQ29udGV4dGNhbkJlU2V0Y2FuQmVNYXBzZXRFbGVtZW50c2Zvcm1hbFR5cGVzRm9yU2V0aW5mZXJyZWRUeXBlc0ZvclNldGludm9jYXRpb25SZXN1bHRub25OdWxsYWJsZVJlc3VsdFR5cGVyZWFkUmVzdWx0d3JpdGVSZXN1bHRfY29tcHV0ZVByb3BlcnR5R2V0X2NvbXB1dGVQcm9wZXJ0eVNldG5vbk51bGxhYmxlUmVhZFR5cGVyZWFkVmFyaWFibGVvcmlnaW5hbFJlYWRUeXBlaW5kZXhHZXRUYXJnZXRyZWFkQ2hlY2tLaW5kaW5kZXhSZXN1bHRfY29tcHV0ZUluZGV4R2V0aW5kZXhTZXRUYXJnZXRpbmRleFZhcmlhYmxlX2NvbXB1dGVJbmRleFNldHJlYWRJbmRleFR5cGV3cml0ZUluZGV4VHlwZXJlYWRJbmRleF9jb21wdXRlRXF1YWxzRXhwcmVzc2lvbmVxdWFsc1RhcmdldGJpbmFyeVRhcmdldGJpbmFyeUNoZWNrS2luZE1pc3NpbmcgcmlnaHQgdHlwZSBmb3Igb3ZlcmxvYWRlZCBhcml0aG1ldGljIG9wZXJhdG9yLl9jb21wdXRlVW5hcnlFeHByZXNzaW9udW5hcnlUYXJnZXR1bmFyeUNoZWNrS2luZHVuYXJ5VHlwZWluZmVyUHJvcGVydHlHZXRObyB2YWx1ZSB0eXBlIHByb3ZpZGVkIGZvciBwcm9wZXJ0eSBzZXQgbmVlZGVkIGZvciB2YWx1ZS5sZWZ0VmFyaWFibGV2YWx1ZUV4cHJlc3Npb25ub25OdWxsUmVjZWl2ZXJUeXBlYmluYXJ5UmVwbGFjZW1lbnR3cml0ZUNvbnRleHRyaHNUeXBlcmVhZEVxdWFsc01lbWJlcnJlYWRFcXVhbHNOdWxsd3JpdGVNZW1iZXJjYXNlRXhwcmVzc2lvblJlc3VsdGNhc2VFeHByZXNzaW9uY2FzZUV4cHJlc3Npb25UeXBldHJ5Qm9keVdpdGhBc3NpZ25lZEluZm90cnlCbG9ja1Jlc3VsdGNhdGNoQmxvY2tmaW5hbGl6ZXJSZXN1bHRpc1NldFZhcmlhYmxlZ2V0VmFyaWFibGUjZ2V0TG9jYWxzZXRWYXJpYWJsZSNzZXRzZXR0ZXJQYXJhbWV0ZXJpc1VuYXNzaWduZWRkZWNsYXJlZE9ySW5mZXJyZWRUeXBlb3BlcmF0aW9uTmFtZUZvckluUmVzdWx0Rm9ySW5SZXN1bHQoRm9ySW5WYXJpYWJsZUxvY2FsRm9ySW5WYXJpYWJsZXZhcmlhYmxlU2V0UHJvcGVydHlGb3JJblZhcmlhYmxlcHJvcGVydHlTZXRfd3JpdGVUeXBlX3Joc1N1cGVyUHJvcGVydHlGb3JJblZhcmlhYmxlc3VwZXJQcm9wZXJ0eVNldFN0YXRpY0ZvckluVmFyaWFibGVzdGF0aWNTZXRJbnZhbGlkRm9ySW5WYXJpYWJsZWtlcm5lbC5jaGVja3NWZXJpZmljYXRpb25FcnJvcjogVmVyaWZpY2F0aW9uIGVycm9yOlZlcmlmaWNhdGlvbiBlcnJvcjogQ29udGV4dDogJycuCk5vZGU6ICdUeXBlZGVmU3RhdGVUeXBlZGVmU3RhdGUuRG9uZVR5cGVkZWZTdGF0ZS5CZWluZ0NoZWNrZWREb25lQmVpbmdDaGVja2VkdHlwZVBhcmFtZXRlcnNJblNjb3BldHlwZWRlZlN0YXRlc2VlbkNvbnN0YW50c2NsYXNzVHlwZVBhcmFtZXRlcnNBcmVJblNjb3BlaW5VbmV2YWx1YXRlZENvbnN0YW50Y3VycmVudE1lbWJlcmN1cnJlbnRQYXJlbnRlbnRlclBhcmVudEluY29ycmVjdCBwYXJlbnQgcG9pbnRlciBvbiAgZXhwZWN0ZWQgJycsIGJ1dCBmb3VuZDogJ29sZFBhcmVudGV4aXRQYXJlbnR1bmRlY2xhcmVWYXJpYWJsZXZpc2l0V2l0aExvY2FsU2NvcGVkZWNsYXJlTWVtYmVyTWVtYmVyICcnIGhhcyBiZWVuIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLnVuZGVjbGFyZU1lbWJlclZhcmlhYmxlICcnIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlLmRlY2xhcmVUeXBlUGFyYW1ldGVyc01pc3NpbmcgYm91bmQgZm9yIHR5cGUgcGFyYW1ldGVyICdUeXBlIHBhcmFtZXRlciAnJyByZWRlY2xhcmVkLnVuZGVjbGFyZVR5cGVQYXJhbWV0ZXJzY2hlY2tWYXJpYWJsZUluU2NvcGUnIHVzZWQgb3V0IG9mIHNjb3BlLlR5cGVkZWYgJ2NoZWNrVHlwZWRlZicgcmVmZXJzIHRvIGl0c2VsZnNhdmVkVHlwZVBhcmFtZXRlcnNzYXZlZFBhcmVudFRoZSB0b3AtbGV2ZWwgZmllbGQgJycgc2hvdWxkIGJlIHN0YXRpY1RoZSBjb25zdCBmaWVsZCAnc2F2ZWRJbkNhdGNoQmxvY2tOYW1lZCBwYXJhbWV0ZXJzIGFyZSBub3Qgc29ydGVkIG9uIGZ1bmN0aW9uIHR5cGUgKEFubm90YXRpb24gb24gdHlwZSBwYXJhbWV0ZXIgaW4gZnVuY3Rpb24gdHlwZS5SZXRocm93IG11c3QgYmUgaW5zaWRlIGEgQ2F0Y2ggYmxvY2suVmFyaWFibGVEZWNsYXJhdGlvbiBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGEgQmxvY2ssIG5vdCBDb25zdGFudCBWYXJpYWJsZURlY2xhcmF0aW9uVmFyaWFibGVHZXQgb2YgY29uc3QgdmFyaWFibGUgJ1N0YXRpY0dldCB3aXRob3V0IHRhcmdldC5TdGF0aWNHZXQgb2YgJycgd2l0aG91dCBnZXR0ZXIuJyB0aGF0J3MgYW4gaW5zdGFuY2UgbWVtYmVyLlN0YXRpY0dldCBvZiBjb25zdCBmaWVsZCAnU3RhdGljU2V0IHdpdGhvdXQgdGFyZ2V0LlN0YXRpY1NldCB0byAnJyB3aXRob3V0IHNldHRlci5jaGVja1RhcmdldGVkSW52b2NhdGlvblN0YXRpY0ludm9jYXRpb24gb2YgJ0NvbnN0YW50IFN0YXRpY0ludm9jYXRpb24gb2YgJycgdGhhdCBpc24ndCBhIGNvbnN0IGV4dGVybmFsIGZhY3RvcnkuQ29uc3RhbnQgU3RhdGljSW52b2NhdGlvbi4gd2l0aG91dCB0YXJnZXQuIHdpdGhvdXQgZnVuY3Rpb24uIHdpdGggaW5jb21wYXRpYmxlIGFyZ3VtZW50cyBmb3IgJ2V4cGVjdGVkVHlwZVBhcmFtZXRlcnMgd2l0aCB3cm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgZm9yICdEaXJlY3RQcm9wZXJ0eUdldCB3aXRob3V0IHRhcmdldC5EaXJlY3RQcm9wZXJ0eUdldCBvZiAnJyB0aGF0IGlzbid0IGFuIGluc3RhbmNlIG1lbWJlci5EaXJlY3RQcm9wZXJ0eVNldCB3aXRob3V0IHRhcmdldC5EaXJlY3RQcm9wZXJ0eVNldCBvZiAnJyB0aGF0IGlzIHN0YXRpYy5EaXJlY3RNZXRob2RJbnZvY2F0aW9uIHdpdGhvdXQgcmVjZWl2ZXIuQ29uc3RydWN0b3JJbnZvY2F0aW9uIG9mIGFic3RyYWN0IGNsYXNzLkNvbnN0YW50IENvbnN0cnVjdG9ySW52b2NhdGlvbiBmbyAnJyB0aGF0IGlzbid0IGNvbnN0Lkludm9jYXRpb24gb2YgY29uc3QgY29uc3RydWN0b3IgJ0NvbnN0YW50IGxpc3QgbGl0ZXJhbC5Db25zdGFudCBzZXQgbGl0ZXJhbC5Db25zdGFudCBtYXAgbGl0ZXJhbC5TeW1ib2wgbGl0ZXJhbC5ObyB0YXJnZXQuVGFyZ2V0IGhhcyBubyBwYXJlbnQuU3dpdGNoIGNhc2UgaXNuJ3QgY2hpbGQgb2YgcGFyZW50LkNvbnN0YW50ICBwcm92aWRlcyAgdHlwZSBhcmd1bWVudHMsIGJ1dCB0aGUgY2xhc3MgZGVjbGFyZXMgcGFyYW1ldGVycy5zdXBlckNsYXNzZXNmaWVsZENvdW50IGZpZWxkIHZhbHVlcywgYnV0IHRoZSBjbGFzcyBkZWNsYXJlcyBmaWVsZHMuIHJlZmVycyB0byBmaWVsZCAgd2hpY2ggZG9lcyBub3QgYmVsb25nIHRvIHRoZSByaWdodCBjbGFzcy5VbmV2YWx1YXRlZENvbnN0YW50IGluIFVuZXZhbHVhdGVkQ29uc3RhbnQuc2F2ZWRJblVuZXZhbHVhdGVkQ29uc3RhbnREYW5nbGluZyByZWZlcmVuY2UgdG8gJycsIHBhcmVudCBpczogJycgcmVmZXJlbmNlZCBvdXQgb2Ygc2NvcGUsIHBhcmVudCBpczogJycgcmVmZXJlbmNlZCBmcm9tIHN0YXRpYyBjb250ZXh0LCBwYXJlbnQgaXM6ICdUaGUgdHlwZWRlZiB0eXBlICB0eXBlIGFyZ3VtZW50cywgYnV0IHRoZSB0eXBlZGVmIGRlY2xhcmVzVmVyaWZ5R2V0U3RhdGljVHlwZUVycm9yIGluIENoZWNrUGFyZW50UG9pbnRlcnNQYXJlbnQgcG9pbnRlciBvbiAnaXMgJ2J1dCBzaG91bGQgYmUgJ2NoZWNrSW5pdGlhbGl6ZXJzZmFzdGEuc291cmNlX2xvYWRlckNvbGxlY3Rpb25UcmFuc2Zvcm1lclNldExpdGVyYWxUcmFuc2Zvcm1lckRpZXRMaXN0ZW5lckRpZXRQYXJzZXJPdXRsaW5lQnVpbGRlcmNvbGxlY3Rpb25UcmFuc2Zvcm1lcnNldExpdGVyYWxUcmFuc2Zvcm1lckNvcmVUeXBlcyBoYXMgbm90IGJlZW4gY29tcHV0ZWQuc3VwcHJlc3NMZXhpY2FsRXJyb3Jzc3ludGhlc2l6ZVNvdXJjZUZvck1pc3NpbmdGaWxlaGFzU2NoZW1lemVyb1Rlcm1pbmF0ZWRCeXRlc2dldFNvdXJjZW5ld1BhdGhTZWdtZW50cy1wYXRjaGltcG9ydCAnZGFydDpfaW50ZXJuYWwnOwppbXBvcnQgJ2RhcnQ6YXN5bmMnOwoKZXhwb3J0ICdkYXJ0OmFzeW5jJyBzaG93IEZ1dHVyZSwgU3RyZWFtOwoKcHJpbnQob2JqZWN0KSB7fQoKY2xhc3MgSXRlcmF0b3Ige30KCmNsYXNzIEl0ZXJhYmxlIHt9CgpjbGFzcyBMaXN0IGV4dGVuZHMgSXRlcmFibGUgewogIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoZWxlbWVudHMpID0+IG51bGw7Cn0KCmNsYXNzIE1hcCBleHRlbmRzIEl0ZXJhYmxlIHsKICBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUob3RoZXIpID0+IG51bGw7Cn0KCmNsYXNzIE5vU3VjaE1ldGhvZEVycm9yIHsKICBOb1N1Y2hNZXRob2RFcnJvci53aXRoSW52b2NhdGlvbihyZWNlaXZlciwgaW52b2NhdGlvbik7Cn0KCmNsYXNzIE51bGwge30KCmNsYXNzIE9iamVjdCB7CiAgbm9TdWNoTWV0aG9kKGludm9jYXRpb24pID0+IG51bGw7Cn0KCmNsYXNzIFN0cmluZyB7fQoKY2xhc3MgU3ltYm9sIHt9CgpjbGFzcyBTZXQge30KCmNsYXNzIFR5cGUge30KCmNsYXNzIF9JbnZvY2F0aW9uTWlycm9yIHsKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aFR5cGUoX21lbWJlck5hbWUsIF90eXBlLCBfdHlwZUFyZ3VtZW50cywKICAgICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMsIF9uYW1lZEFyZ3VtZW50cyk7Cn0KCmNsYXNzIGJvb2wge30KCmNsYXNzIGRvdWJsZSBleHRlbmRzIG51bSB7fQoKY2xhc3MgaW50IGV4dGVuZHMgbnVtIHt9CgpjbGFzcyBudW0ge30KCmNsYXNzIF9TeW5jSXRlcmFibGUge30KCmNsYXNzIF9TeW5jSXRlcmF0b3IgewogIHZhciBfY3VycmVudDsKICB2YXIgX3lpZWxkRWFjaEl0ZXJhYmxlOwp9CgpjbGFzcyBGdW5jdGlvbiB7fQpfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXIoY29udGludWF0aW9uKSB7fQoKX2FzeW5jU3RhY2tUcmFjZUhlbHBlcihhc3luY19vcCkge30KCl9hc3luY1RoZW5XcmFwcGVySGVscGVyKGNvbnRpbnVhdGlvbikge30KCl9hd2FpdEhlbHBlcihvYmplY3QsIHRoZW5DYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgYXdhaXRlcikge30KCl9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oY29tcGxldGVyLCB2YWx1ZSkge30KCmNsYXNzIF9Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyIHsKICBhZGQoZXZlbnQpIHt9CgogIGFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSB7fQoKICBhZGRTdHJlYW0oc3RyZWFtKSB7fQoKICBjbG9zZSgpIHt9CgogIGdldCBzdHJlYW0gPT4gbnVsbDsKfQoKY2xhc3MgQ29tcGxldGVyIHsKICBmYWN0b3J5IENvbXBsZXRlci5zeW5jKCkgPT4gbnVsbDsKCiAgZ2V0IGZ1dHVyZTsKCiAgY29tcGxldGUoW3ZhbHVlXSk7CgogIGNvbXBsZXRlRXJyb3IoZXJyb3IsIFtzdGFja1RyYWNlXSk7Cn0KCmNsYXNzIEZ1dHVyZSB7CiAgZmFjdG9yeSBGdXR1cmUubWljcm90YXNrKGNvbXB1dGF0aW9uKSA9PiBudWxsOwp9CgpjbGFzcyBGdXR1cmVPciB7Cn0KCmNsYXNzIF9Bc3luY0F3YWl0Q29tcGxldGVyIGltcGxlbWVudHMgQ29tcGxldGVyIHsKICBnZXQgZnV0dXJlID0+IG51bGw7CgogIGNvbXBsZXRlKFt2YWx1ZV0pIHt9CgogIGNvbXBsZXRlRXJyb3IoZXJyb3IsIFtzdGFja1RyYWNlXSkge30KfQoKY2xhc3MgU3RyZWFtIHt9CgpjbGFzcyBfU3RyZWFtSXRlcmF0b3IgewogIGdldCBjdXJyZW50ID0+IG51bGw7CgogIG1vdmVOZXh0KCkge30KCiAgY2FuY2VsKCkge30KfQpjbGFzcyBfVW5tb2RpZmlhYmxlU2V0IHsKICBmaW5hbCBNYXAgX21hcDsKICBjb25zdCBfVW5tb2RpZmlhYmxlU2V0KHRoaXMuX21hcCk7Cn0KY2xhc3MgU3ltYm9sIHsKICBjb25zdCBTeW1ib2woU3RyaW5nIG5hbWUpOwp9CmNsYXNzIEVuZGlhbiB7CiAgc3RhdGljIGNvbnN0IEVuZGlhbiBsaXR0bGUgPSBudWxsOwogIHN0YXRpYyBjb25zdCBFbmRpYW4gYmlnID0gbnVsbDsKICBzdGF0aWMgZmluYWwgRW5kaWFuIGhvc3QgPSBudWxsOwp9Ci8qICAqL2NyZWF0ZURpZXRMaXN0ZW5lcmRpZXRMaXN0ZW5lcmN1cnJlbnREZWNsYXJhdGlvbmRlYnVnRXhwcmVzc2lvbiBpbiBkZWJ1Z0V4cHJjcmVhdGVMaXN0ZW5lclJlc29sdmVkIHBhcnRzQXBwbGllZCBwYXRjaGVzZXhwb3J0ZWVzc291cmNlTGlicmFyeWJvdGh3YXNDaGFuZ2VkZXhwb3J0ZWVDb21wdXRlZCBsaWJyYXJ5IHNjb3Blc2RlYnVnUHJpbnRFeHBvcnRzbCBleHBvcnRzIFJlc29sdmVkIEZpbmlzaGVkIGRlZmVycmVkIGxvYWQgdGVhcm9mZnMgRmluaXNoZWQgZm9yd2FyZGVycyBmb3IgIHByb2NlZHVyZXMgY29uc3RydWN0b3JzIHR5cGUtdmFyaWFibGUgYm91bmRzQ29tcHV0ZWQgdmFyaWFuY2VzIG9mICB0eXBlIHZhcmlhYmxlc0NvbXB1dGVkIGRlZmF1bHQgdHlwZXMgZm9yIEZpbmlzaGVkICBuYXRpdmUgbWV0aG9kcyBwYXRjaCBtZXRob2RzY2hlY2tPYmplY3RDbGFzc0hpZXJhcmNoeWhhbmRsZUhpZXJhcmNoeUN5Y2xlc2JsYWNrTGlzdGVkQ2xhc3Nlc3RvcG9sb2dpY2FsbHlTb3J0ZWRDbGFzc2VzcHJldmlvdXNXb3JrTGlzdGRpcmVjdFN1cGVydHlwZXNhbGxTdXBlcnR5cGVzUHJvY2Vzc2VkY2hlY2tDbGFzc1N1cGVydHlwZXNjbGFzc2VzV2l0aEN5Y2xlc0NoZWNrZWQgY2xhc3MgaGllcmFyY2h5X2NoZWNrQ29uc3RydWN0b3JzRm9yTWl4aW5pc0NsYXNzQnVpbGRlcm5hbWVUb0V4cG9ydHNlcnJvckV4cG9ydHNuYW1lVG9JbXBvcnRzZXJyb3JJbXBvcnRzQ2hlY2tlZCBpbXBvcnRzIGFuZCBleHBvcnRzIGZvciBkdXBsaWNhdGUgbmFtZXNCdWlsdCBjb21wb25lbnRjb21wdXRlRnVsbENvbXBvbmVudGFtYmlndW91c1R5cGVzUmVjb3Jkc2hhbmRsZUFtYmlndW91c1N1cGVydHlwZXNDb21wdXRlZCBjbGFzcyBoaWVyYXJjaHlDb3JlVHlwZXMgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZENvbXB1dGVkIGNvcmUgdHlwZXNzb3VyY2VDbGFzc2VzQ2hlY2tlZCBzdXBlcnR5cGVzQ2hlY2tlZCB0eXBlIGFyZ3VtZW50cyBvZiBzdXBlcnMgYWdhaW5zdCB0aGUgYm91bmRzQ2hlY2tlZCAgb3ZlcnJpZGVzRmluaXNoZWQgaW5pdGlhbGl6aW5nIGZvcm1hbHNjaGFuZ2VkQ2xhc3Nlc0NvbXB1dGVkICBjb21iaW5lZCBtZW1iZXIgc2lnbmF0dXJlc1VwZGF0ZWQgIGNsYXNzZXMgaW4ga2VybmVsIGhpZXJhcmNoeUNoZWNrZWQgcmVkaXJlY3RpbmcgZmFjdG9yaWVzQWRkZWQgbm9TdWNoTWV0aG9kIGZvcndhcmRlcnNDaGVja2VkIG1peGluIGRlY2xhcmF0aW9uIGFwcGxpY2F0aW9uc0J1aWx0IGNsYXNzIGhpZXJhcmNoeWFsbEltcGxpY2l0bHlUeXBlZEZpZWxkc2ltcGxpY2l0bHlUeXBlZEZpZWxkc1BlcmZvcm1lZCB0b3AgbGV2ZWwgaW5mZXJlbmNlQW1iaWd1b3VzVHlwZXNSZWNvcmRTb3VyY2VMb2FkZXJEYXRhRm9yVGVzdGluZ19hbGlhc01hcGFsaWFzdG9PcmlnaW5hbGRlZmF1bHREYXJ0Q29yZVNvdXJjZWRlZmF1bHREYXJ0QXN5bmNTb3VyY2VkZWZhdWx0RGFydENvbGxlY3Rpb25Tb3VyY2VkZWZhdWx0RGFydEludGVybmFsU291cmNlZGVmYXVsdERhcnRUeXBlZERhdGFTb3VyY2VmYXN0YS5jb25zdGFudF9ldmFsdWF0b3Jjb25zdGFudF9jb2xsZWN0aW9uX2J1aWxkZXJzLmRhcnR3ZWFrc3Ryb25nQ29uc3RhbnRzVHJhbnNmb3JtZXJjb25zdGFudEV2YWx1YXRvcmtlZXBGaWVsZHNldmFsdWF0ZUFubm90YXRpb25zZXJyb3JSZXBvcnRlcmNvbnZlcnRMaWJyYXJ5dHJhbnNmb3JtQW5ub3RhdGlvbnN3aXRoTmV3RW52aXJvbm1lbnRvbGRTdGF0aWNUeXBlQ29udGV4dHRyYW5zZm9ybUV4cHJlc3Npb25zZXZhbHVhdGVBbmRUcmFuc2Zvcm1XaXRoQ29udGV4dGV2YWx1YXRlV2l0aENvbnRleHRhZGRWYXJpYWJsZVZhbHVlbWFrZUNvbnN0YW50RXhwcmVzc2lvbnNob3VsZElubGluZXRyZWVDb250ZXh0cnVuSW5zaWRlQ29udGV4dENvbnN0YW50RXZhbHVhdG9yaW50Rm9sZGVydW5tb2RpZmlhYmxlU2V0TWFwaXNJbnN0YW50aWF0ZWRjYW5vbmljYWxpemF0aW9uQ2FjaGVub2RlQ2FjaGVwcmltaXRpdmVFcXVhbENhY2hlbnVsbENvbnN0YW50dHJ1ZUNvbnN0YW50ZmFsc2VDb25zdGFudGNvbnRleHRDaGFpbmluc3RhbmNlQnVpbGRlcnJlcGxhY2VtZW50Tm9kZXNsb3dlcmVkc2VlblVuZXZhbHVhdGVkQ2hpbGRsYXp5RGVwdGhwdWJsaWNJZGVudGlmaWVyUmVnRXhwXlthLXpBLVokXVthLXpBLVowLTlfJF0qJG5vblVzYWJsZUtleXdvcmRzTm8gJ2Vudmlyb25tZW50RGVmaW5lcycgcGFzc2VkIHRvIHRoZSBjb25zdGFudCBldmFsdWF0b3IgYnV0IHRoZSBDb25zdGFudHNCYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgdW5ldmFsdWF0ZWQgY29uc3RhbnRzLl9Vbm1vZGlmaWFibGVTZXRzaG91bGRCZVVuZXZhbHVhdGVkdGFyZ2V0aW5nSmF2YVNjcmlwdGNvbnZlcnRUeXBlVW5leHBlY3RlZCBldmFsdWF0aW9uIG1vZGU6IGNvbnZlcnRUeXBlc2dldEZpbGVPZmZzZXRfZXZhbHVhdGVTdWJleHByZXNzaW9ucmVtb3ZlUmVkdW5kYW50RmlsZVVyaUV4cHJlc3Npb25zbG9jYXRlZE1lc3NhZ2VBY3R1YWxFcnJvcmNvbnRleHRNZXNzYWdlc3JlcG9ydEludmFsaWRFeHByZXNzaW9ucmVwb3J0SW52YWxpZHVuZXZhbHVhdGVkZW50ZXJMYXp5bGVhdmVMYXp5dW5sb3dlcndhc1VuZXZhbHVhdGVkX2V2YWx1YXRlTnVsbGFibGVTdWJleHByZXNzaW9ucHVzaENvbnRleHRwb3BDb250ZXh0cnVuSW5zaWRlQ29udGV4dElmTm9Db250ZXh0Y29udGV4dE5vZGVDb25zdGFudCBldmFsdWF0aW9uIGhhcyBubyBzdXBwb3J0IGZvciBtYWtlQm9vbENvbnN0YW50bWFrZUludENvbnN0YW50dW5zaWduZWRldmFsdWF0ZURhcnRUeXBlTm9uLWNvbnN0YW50IGxpc3QgbGl0ZXJhbGFkZFNwcmVhZE5vbi1jb25zdGFudCBzZXQgbGl0ZXJhbHNldF9Ob24tY29uc3RhbnQgbWFwIGxpdGVyYWxGdW5jdGlvbiBsaXRlcmFsTm9uLWNvbnN0YW50IGNvbnN0cnVjdG9yIGludm9jYXRpb24gImNoZWNrQ29uc3RydWN0b3JDb25zdENvbnN0cnVjdG9yICIiIGJlbG9uZ3MgdG8gYWJzdHJhY3QgY2xhc3MgInBvc2l0aW9uYWxzZXZhbHVhdGVQb3NpdGlvbmFsQXJndW1lbnRzZXZhbHVhdGVOYW1lZEFyZ3VtZW50c2lzU3ltYm9sdW5ldmFsdWF0ZWRBcmd1bWVudHNuYW1lVmFsdWVpc1ZhbGlkU3ltYm9sTmFtZWV2YWx1YXRlVHlwZUFyZ3VtZW50c3dpdGhOZXdJbnN0YW5jZUJ1aWxkZXJoYW5kbGVDb25zdHJ1Y3Rvckludm9jYXRpb25idWlsZFVuZXZhbHVhdGVkSW5zdGFuY2VidWlsZEluc3RhbmNlTm9uLWNvbnN0IGNvbnN0cnVjdG9yIGludm9jYXRpb24uIiBoYXMgbm9uLXRyaXZpYWwgYm9keSBjaGVja0Fzc2VydHNldEZpZWxkVmFsdWVpc1ZhbGlkUHVibGljSWRlbnRpZmllcmFkZFR5cGVQYXJhbWV0ZXJWYWx1ZWV2YWx1YXRlU3VwZXJUeXBlQXJndW1lbnRzTm8gc3VwcG9ydCBmb3IgaGFuZGxpbmcgaW5pdGlhbGl6ZXIgb2YgdHlwZSB1bmV2YWx1YXRlZFVucmVhZENvbnN0YW50c2RvdWJsZVNwZWNpYWxDYXNlc2ZvbGRVbmFyeU9wZXJhdG9yZm9sZEJpbmFyeU9wZXJhdG9yZXZhbHVhdGVCaW5hcnlOdW1lcmljT3BlcmF0aW9uSW5zdGFuY2UgZmllbGQgYWNjZXNzIG91dHNpZGUgY29uc3RydWN0b3JDb3VsZCBub3QgZXZhbHVhdGUgZmllbGQgZ2V0ICBvbiBpbmNvbXBsZXRlIGluc3RhbmNlbG9va3VwVmFyaWFibGVWYXJpYWJsZSBnZXQgb2YgYSBub24tY29uc3QgdmFyaWFibGUuTm8gc3VwcG9ydCBmb3IgIGluIGEgc3RhdGljLWdldC5jb25jYXRlbmF0ZWRib29sQ29uc3RhbnRpbnRDb25zdGFudEludm9jYXRpb24gb2YgZW5zdXJlSXNTdWJ0eXBlbm9kZVR5cGVsaWJyYXJ5T2ZldmFsdWF0ZURhcnRUeXBlc1RoZSBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgc3VwcGxpZWQgaW4gdGhlIHBhcnRpYWwgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBPbmx5IHRlYXItb2ZmIGNvbnN0YW50cyBjYW4gYmUgcGFydGlhbGx5IGluc3RhbnRpYXRlZC5oYXNQcmltaXRpdmVFcXVhbGNsYXNzSGFzUHJpbWl0aXZlRXF1YWxjb25zdGFudFR5cGVpc0Zpbml0ZXRydW5jYXRlVG9Eb3VibGVuYW1lZEFyZ3NvbGRFbnZ0cnVuY2F0aW5nRGl2aWRlVW5leHBlY3RlZCBiaW5hcnkgbnVtZXJpYyBvcGVyYXRpb24gJ0luc3RhbmNlQnVpbGRlcmV2YWx1YXRvckV2YWx1YXRpb25FbnZpcm9ubWVudF92YXJpYWJsZXNfdW5yZWFkVW5ldmFsdWF0ZWRWYXJpYWJsZXNsb29rdXBQYXJhbWV0ZXJWYWx1ZVJlZHVuZGFudEZpbGVVcmlFeHByZXNzaW9uUmVtb3ZlcmN1cnJlbnRGaWxlVXJpb2xkRmlsZVVyaV9BYm9ydER1ZVRvRXJyb3JfQWJvcnREdWVUb0ludmFsaWRFeHByZXNzaW9uRXJyb3JSZXBvcnRlclNpbXBsZUVycm9yUmVwb3J0ZXJfcmVwb3J0IENvbnN0YW50IGV2YWx1YXRpb24gZXJyb3I6IElzSW5zdGFudGlhdGVkVmlzaXRvcl9hdmFpbGFibGVWYXJpYWJsZXNBIHZpc2l0b3IgbWV0aG9kIHNlZW1zIHRvIGJlIHVuaW1wbGVtZW50ZWQhX0xpc3RPclNldENvbnN0YW50QnVpbGRlcm1ha2VMaXRlcmFsYWRkQ29uc3RhbnRzcHJlYWRFeHByZXNzaW9uc3ByZWFkTGlzdENvbnN0YW50QnVpbGRlcmxhc3RQYXJ0Tm9uLWNvbnN0YW50IGluIGNvbnN0YW50IGxpc3RTZXRDb25zdGFudEJ1aWxkZXJOb24tY29uc3RhbnQgaW4gY29uc3RhbnQgc2V0TWFwQ29uc3RhbnRCdWlsZGVyc2VlbktleXNrZXlDb250ZXh0dmFsdWVDb250ZXh0Tm9uLWNvbnN0YW50IGluIGNvbnN0YW50IG1hcGNvbnN0YW50c1RyYW5zZm9ybWVyX2lzRm9ybWFsUGFyYW1ldGVyZmFzdGEua2VybmVsX2NvbnN0YW50c2NvbnRhaW5lZFVyaWZhc3RhLmJ1aWx0aW5fdHlwZV9idWlsZGVyQnVpbHRpblR5cGVCdWlsZGVyZmFzdGEubWl4aW5fYXBwbGljYXRpb25fYnVpbGRlck1peGluQXBwbGljYXRpb25CdWlsZGVyX2V4dGVuc2lvbl9vcmlnaW5vYmplY3RHZXR0ZXJvYmplY3RTZXR0ZXJjb25mbGljdF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLmxpc3RlbmVybG9nRXZlbnRzdXBwcmVzc1BhcnNlRXJyb3JzYmVnaW5Bcmd1bWVudHNiZWdpbkF3YWl0RXhwcmVzc2lvbkludmFsaWRBd2FpdEV4cHJlc3Npb25DYXNlRXhwcmVzc2lvbmJlZ2luQ2xhc3NPck1peGluQm9keUNsYXNzT3JNaXhpbkJvZHliZWdpbkNsYXNzT3JOYW1lZE1peGluQXBwbGljYXRpb25QcmVsdWRlYmVnaW5DbGFzc0RlY2xhcmF0aW9uYWJzdHJhY3RUb2tlbmhhbmRsZUNsYXNzRXh0ZW5kc2V4dGVuZHNLZXl3b3JkQ2xhc3NFeHRlbmRzaGFuZGxlQ2xhc3NPck1peGluSW1wbGVtZW50c2ltcGxlbWVudHNLZXl3b3JkaW50ZXJmYWNlc0NvdW50Q2xhc3NJbXBsZW1lbnRzaGFuZGxlQ2xhc3NIZWFkZXJjbGFzc0tleXdvcmRDbGFzc0hlYWRlcmhhbmRsZVJlY292ZXJDbGFzc0hlYWRlclJlY292ZXJDbGFzc0hlYWRlcmVuZENsYXNzRGVjbGFyYXRpb25iZWdpbk1peGluRGVjbGFyYXRpb25taXhpbktleXdvcmRoYW5kbGVNaXhpbk9uTWl4aW5PbmhhbmRsZU1peGluSGVhZGVyTWl4aW5IZWFkZXJoYW5kbGVSZWNvdmVyTWl4aW5IZWFkZXJSZWNvdmVyTWl4aW5IZWFkZXJlbmRNaXhpbkRlY2xhcmF0aW9uTWl4aW5EZWNsYXJhdGlvbmJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25QcmVsdWRlZXh0ZW5zaW9uS2V5d29yZGJlZ2luRXh0ZW5zaW9uRGVjbGFyYXRpb25lbmRFeHRlbnNpb25EZWNsYXJhdGlvbkV4dGVuc2lvbkRlY2xhcmF0aW9uYmVnaW5Db21iaW5hdG9yc2VuZENvbWJpbmF0b3JzQ29tYmluYXRvcnNiZWdpbkNvbXBpbGF0aW9uVW5pdGhhbmRsZURpcmVjdGl2ZXNPbmx5ZW5kQ29tcGlsYXRpb25Vbml0Q29tcGlsYXRpb25Vbml0Q29uc3RMaXRlcmFsYmVnaW5Db25zdHJ1Y3RvclJlZmVyZW5jZURvV2hpbGVTdGF0ZW1lbnRCb2R5V2hpbGVTdGF0ZW1lbnRCb2R5YmVnaW5FbnVtZW51bUtleXdvcmRlbmRFbnVtRW51bWV4cG9ydEtleXdvcmRoYW5kbGVFeHRyYW5lb3VzRXhwcmVzc2lvbkV4dHJhbmVvdXNFeHByZXNzaW9uYmVnaW5GYWN0b3J5TWV0aG9kbGFzdENvbnN1bWVkZXh0ZXJuYWxUb2tlbmNvbnN0VG9rZW5DbGFzc0ZhY3RvcnlNZXRob2RlbmRNaXhpbkZhY3RvcnlNZXRob2RlbmRFeHRlbnNpb25GYWN0b3J5TWV0aG9kaGFuZGxlTm9Gb3JtYWxQYXJhbWV0ZXJzTm9Gb3JtYWxQYXJhbWV0ZXJzZW5kTWl4aW5GaWVsZHNlbmRFeHRlbnNpb25GaWVsZHNGb3JTdGF0ZW1lbnRCb2R5Rm9ySW5Cb2R5aGFuZGxlTm9GdW5jdGlvbkJvZHlOb0Z1bmN0aW9uQm9keWhhbmRsZUZ1bmN0aW9uQm9keVNraXBwZWRpc0V4cHJlc3Npb25Cb2R5YmVnaW5GdW5jdGlvbk5hbWViZWdpbkZ1bmN0aW9uVHlwZUFsaWFzZW5kRnVuY3Rpb25UeXBlQWxpYXN0eXBlZGVmS2V5d29yZEZ1bmN0aW9uVHlwZUFsaWFzaGFuZGxlQ2xhc3NXaXRoQ2xhdXNld2l0aEtleXdvcmRDbGFzc1dpdGhDbGF1c2VoYW5kbGVDbGFzc05vV2l0aENsYXVzZUNsYXNzTm9XaXRoQ2xhdXNlYmVnaW5OYW1lZE1peGluQXBwbGljYXRpb25oYW5kbGVOYW1lZE1peGluQXBwbGljYXRpb25XaXRoQ2xhdXNlTmFtZWRNaXhpbkFwcGxpY2F0aW9uV2l0aENsYXVzZWVuZE5hbWVkTWl4aW5BcHBsaWNhdGlvbk5hbWVkTWl4aW5BcHBsaWNhdGlvbmhpZGVLZXl3b3JkSGlkZWhhbmRsZUlkZW50aWZpZXJMaXN0SWRlbnRpZmllckxpc3RiZWdpblR5cGVMaXN0ZW5kVHlwZUxpc3RUeXBlTGlzdGJlZ2luSWZTdGF0ZW1lbnRUaGVuU3RhdGVtZW50RWxzZVN0YXRlbWVudGltcG9ydEtleXdvcmRoYW5kbGVJbXBvcnRQcmVmaXhkZWZlcnJlZEtleXdvcmRhc0tleXdvcmRJbXBvcnRQcmVmaXhoYW5kbGVSZWNvdmVySW1wb3J0SW1wb3J0UmVjb3ZlcnliZWdpbkNvbmRpdGlvbmFsVXJpc2VuZENvbmRpdGlvbmFsVXJpc0NvbmRpdGlvbmFsVXJpc2JlZ2luQ29uZGl0aW9uYWxVcmlpZktleXdvcmRlbmRDb25kaXRpb25hbFVyaWVxdWFsU2lnbkNvbmRpdGlvbmFsVXJpaGFuZGxlRG90dGVkTmFtZWZpcnN0SWRlbnRpZmllckRvdHRlZE5hbWViZWdpbkluaXRpYWxpemVkSWRlbnRpZmllcmJlZ2luVmFyaWFibGVJbml0aWFsaXplckNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJoYW5kbGVJbnZhbGlkRXhwcmVzc2lvbkludmFsaWRGdW5jdGlvbkJvZHloYW5kbGVJbnZhbGlkVHlwZVJlZmVyZW5jZUludmFsaWRUeXBlUmVmZXJlbmNlYmVnaW5MaWJyYXJ5TmFtZWVuZExpYnJhcnlOYW1lbGlicmFyeUtleXdvcmRMaWJyYXJ5TmFtZWhhbmRsZUludGVycG9sYXRpb25FeHByZXNzaW9uTGl0ZXJhbFN0cmluZ2JlZ2luTWVtYmVyaGFuZGxlSW52YWxpZE1lbWJlckludmFsaWRNZW1iZXJiZWdpbk1ldGhvZENsYXNzTWV0aG9kZW5kTWl4aW5NZXRob2RlbmRFeHRlbnNpb25NZXRob2RlbmRDbGFzc0NvbnN0cnVjdG9yZW5kTWl4aW5Db25zdHJ1Y3RvcmVuZEV4dGVuc2lvbkNvbnN0cnVjdG9yYmVnaW5NZXRhZGF0YVN0YXJiZWdpbk9wdGlvbmFsRm9ybWFsUGFyYW1ldGVyc3BhcnRLZXl3b3JkUGFydGJlZ2luUGFydE9mZW5kUGFydE9mb2ZLZXl3b3JkUGFydE9mYmVnaW5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5ZW5kUmVkaXJlY3RpbmdGYWN0b3J5Qm9keWJlZ2luUmV0dXJuU3RhdGVtZW50aGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5TmF0aXZlRnVuY3Rpb25Cb2R5aGFuZGxlTmF0aXZlRnVuY3Rpb25Cb2R5SWdub3JlZE5hdGl2ZUZ1bmN0aW9uQm9keUlnbm9yZWROYXRpdmVGdW5jdGlvbkJvZHlTa2lwcGVkRW1wdHlGdW5jdGlvbkJvZHlzaG93S2V5d29yZFNob3diZWdpblN3aXRjaFN0YXRlbWVudGJlZ2luTGl0ZXJhbFN5bWJvbGJlZ2luUmV0aHJvd1N0YXRlbWVudGVuZFRvcExldmVsRGVjbGFyYXRpb25Ub3BMZXZlbERlY2xhcmF0aW9uaGFuZGxlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb25JbnZhbGlkVG9wTGV2ZWxEZWNsYXJhdGlvbmJlZ2luVG9wTGV2ZWxNZW1iZXJiZWdpblRvcExldmVsTWV0aG9kVG9wTGV2ZWxNZXRob2ROb25OdWxsQXNzZXJ0RXhwcmVzc2lvbmhhbmRsZU5vTmFtZU5vTmFtZWJlZ2luVHlwZUFyZ3VtZW50c05vVHlwZUFyZ3VtZW50c2hhbmRsZU5vVHlwZUFyZ3VtZW50c2JlZ2luVHlwZVZhcmlhYmxlc0NvbnN0RXhwcmVzc2lvbkVsc2VDb250cm9sRmxvd2hhbmRsZU5vQXJndW1lbnRzTm9Bcmd1bWVudHNoYW5kbGVOb0NvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzTm9Db25zdHJ1Y3RvclJlZmVyZW5jZUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50c2hhbmRsZU5vVHlwZU5vVHlwZWhhbmRsZU9wZXJhdG9yTmFtZW9wZXJhdG9yS2V5d29yZE9wZXJhdG9yTmFtZWhhbmRsZUludmFsaWRPcGVyYXRvck5hbWVJbnZhbGlkT3BlcmF0b3JOYW1lYmVnaW5ZaWVsZFN0YXRlbWVudGhhbmRsZUVycm9yVG9rZW5kaXNjYXJkVHlwZVJlcGxhY2VkV2l0aENvbW1lbnRUeXBlQXNzaWduaGFuZGxlQ29tbWVudFJlZmVyZW5jZVRleHRyZWZlcmVuY2VTb3VyY2VyZWZlcmVuY2VPZmZzZXRDb21tZW50UmVmZXJlbmNlVGV4dGhhbmRsZUNvbW1lbnRSZWZlcmVuY2VuZXdLZXl3b3JkaGFuZGxlTm9Db21tZW50UmVmZXJlbmNlX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIucGFyc2VyRm9yd2FyZGluZ0xpc3RlbmVybG9va3NMaWtlRXhwcmVzc2lvblN0YXJ0TGl0ZXJhbEVudHJ5SW5mb2NvbXB1dGVMaXRlcmFsRW50cnlsb29rc0xpa2VMaXRlcmFsRW50cnlzaW1wbGVFbnRyeUxvb3BTdGF0ZU1vZGlmaWVyUmVjb3ZlcnlDb250ZXh0Q2xhc3NIZWFkZXJSZWNvdmVyeUxpc3RlbmVySW1wb3J0UmVjb3ZlcnlMaXN0ZW5lck1peGluSGVhZGVyUmVjb3ZlcnlMaXN0ZW5lclRva2VuU3RyZWFtUmV3cml0ZXJUeXBlSW5mb1R5cGVQYXJhbU9yQXJnSW5mb2NvbXB1dGVNZXRob2RUeXBlQXJndW1lbnRzY29tcHV0ZVR5cGVQYXJhbU9yQXJnaXNWYWxpZFR5cGVSZWZlcmVuY2Vub1R5cGVub1R5cGVQYXJhbU9yQXJnZmluZE5vblplcm9MZW5ndGhUb2tlbmZpbmRQcmV2aW91c05vblplcm9MZW5ndGhUb2tlbmlzTGV0dGVyaXNMZXR0ZXJPckRpZ2l0aXNPbmVPZmlzT25lT2ZPckVvZl9NZXNzYWdlV2l0aEFyZ3VtZW50QXN5bmNNb2RpZmllci5TeW5jTG9vcFN0YXRlLk91dHNpZGVMb29wY2FjaGVkUmV3cml0ZXJzdGF0ZW1lbnREZXB0aGV4cHJlc3Npb25EZXB0aGluR2VuZXJhdG9yQXN5bmNNb2RpZmllci5Bc3luY1N0YXJBc3luY01vZGlmaWVyLlN5bmNTdGFyaW5Bc3luY0FzeW5jTW9kaWZpZXIuQXN5bmNpblBsYWluU3luY2lzQnJlYWtBbGxvd2VkaXNDb250aW51ZUFsbG93ZWRMb29wU3RhdGUuSW5zaWRlTG9vcGlzQ29udGludWVXaXRoTGFiZWxBbGxvd2Vkc2tpcEVycm9yVG9rZW5zZGlyZWN0aXZlU3RhdGVjaGVja1NjcmlwdFRhZ3BhcnNlU2NyaXB0cGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uSW1wbHJlcG9ydFJlY292ZXJhYmxlRXJyb3JXaXRoVG9rZW5yZXBvcnRBbGxFcnJvclRva2Vuc3BhcnNlRGlyZWN0aXZlc25leHRWYWx1ZXBhcnNlTWV0YWRhdGFTdGFyY2hlY2tJbXBvcnRwYXJzZUltcG9ydGNoZWNrRXhwb3J0cGFyc2VFeHBvcnRjaGVja0xpYnJhcnlwYXJzZUxpYnJhcnlOYW1lcGFyc2VQYXJ0T3JQYXJ0T2ZwYXJzZVRvcExldmVsRGVjbGFyYXRpb25wYXJzZVRvcExldmVsS2V5d29yZERlY2xhcmF0aW9uY2hlY2tEZWNsYXJhdGlvbnBhcnNlVG9wTGV2ZWxNZW1iZXJJbXBscmVwb3J0UmVjb3ZlcmFibGVFcnJvcmluc2VydFN5bnRoZXRpY0lkZW50aWZpZXIjc3ludGhldGljX2Z1bmN0aW9uX3BhcnNlSW52YWxpZFRvcExldmVsRGVjbGFyYXRpb25wYXJzZUNsYXNzRGVjbGFyYXRpb25Nb2RpZmllcnNwYXJzZVRvcExldmVsS2V5d29yZE1vZGlmaWVyc3JlcG9ydFRvcExldmVsTW9kaWZpZXJFcnJvcmFmdGVyTW9kaWZpZXJzcGFyc2VDbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9ucGFyc2VFbnVtcGFyc2VFeHRlbnNpb25wYXJzZVR5cGVkZWZwYXJzZU1peGluSW50ZXJuYWwgZXJyb3I6IFVuaGFuZGxlZCB0b3AgbGV2ZWwga2V5d29yZCAncGFyc2VRdWFsaWZpZWRsaWJyYXJ5TmFtZUNvbnRpbnVhdGlvbmVuc3VyZVNlbWljb2xvbnBhcnNlSW1wb3J0UHJlZml4T3B0ZGVmZXJyZWRUb2tlbmVuc3VyZUlkZW50aWZpZXJpbXBvcnRQcmVmaXhEZWNsYXJhdGlvbmVuc3VyZUxpdGVyYWxTdHJpbmdwYXJzZUNvbmRpdGlvbmFsVXJpU3RhcnBhcnNlQ29tYmluYXRvclN0YXJwYXJzZUltcG9ydFJlY292ZXJ5cHJpbWFyeUxpc3RlbmVycmVjb3ZlcnlMaXN0ZW5lcmZpcnN0RGVmZXJyZWRLZXl3b3JkaGFzUHJlZml4aGFzQ29tYmluYXRvcnNraXBVbmV4cGVjdGVkVG9rZW5PcHRwYXJzZUNvbmRpdGlvbmFsVXJpaW5zZXJ0UGFyZW5zcGFyc2VEb3R0ZWROYW1lZXF1YWxpdHlTaWdubW92ZVN5bnRoZXRpY2RvdHRlZE5hbWVDb250aW51YXRpb25wYXJzZUhpZGVwYXJzZVNob3dwYXJzZUlkZW50aWZpZXJMaXN0cGFyc2VUeXBlTGlzdGVuc3VyZVR5cGVPclZvaWRjaGVja1BhcnRPZnBhcnNlUGFydE9mY2hlY2tQYXJ0cGFyc2VQYXJ0cGFydE5hbWVwYXJ0TmFtZUNvbnRpbnVhdGlvbmF0VG9rZW5tZXRhZGF0YVJlZmVyZW5jZXBhcnNlUXVhbGlmaWVkUmVzdE9wdG1ldGFkYXRhQ29udGludWF0aW9ucGFyc2VBcmd1bWVudHNtZXRhZGF0YUNvbnRpbnVhdGlvbkFmdGVyVHlwZUFyZ3VtZW50c3R5cGVJbmZvc2tpcFR5cGV0eXBlZGVmRGVjbGFyYXRpb25wYXJzZVZhcmlhYmxlc3BhcnNlRm9ybWFsUGFyYW1ldGVyc1JlcXVpcmVkT3B0TWVtYmVyS2luZC5GdW5jdGlvblR5cGVBbGlhc3BhcnNlVHlwZXBhcnNlTWl4aW5BcHBsaWNhdGlvblJlc3RpbnNlcnRTeW50aGV0aWNLZXl3b3JkcGFyc2VXaXRoQ2xhdXNlT3B0cGFyc2VHZXR0ZXJPckZvcm1hbFBhcmFtZXRlcnNwYXJzZUZvcm1hbFBhcmFtZXRlcnNpc1VuYXJ5TWludXNtaXNzaW5nUGFyYW1ldGVyTWVzc2FnZXBhcnNlRm9ybWFsUGFyYW1ldGVyc1Jlc3RwYXJzZUZvcm1hbFBhcmFtZXRlcnNPcHRza2lwRm9ybWFsUGFyYW1ldGVyc3NraXBGb3JtYWxQYXJhbWV0ZXJzUmVzdHBhcnNlT3B0aW9uYWxQb3NpdGlvbmFsUGFyYW1ldGVyc2Vuc3VyZUNsb3NlUGFyZW5wYXJzZU9wdGlvbmFsTmFtZWRQYXJhbWV0ZXJzcmV3cml0ZVNxdWFyZUJyYWNrZXRzcGFyc2VGb3JtYWxQYXJhbWV0ZXJyZXdyaXRlQW5kUmVjb3Zlck1lbWJlcktpbmQuTm9uU3RhdGljTWV0aG9kTWVtYmVyS2luZC5TdGF0aWNNZXRob2RwYXJhbWV0ZXJLaW5kaW5GdW5jdGlvblR5cGVNZW1iZXJLaW5kLlRvcExldmVsTWV0aG9kTWVtYmVyS2luZC5FeHRlbnNpb25Ob25TdGF0aWNNZXRob2RNZW1iZXJLaW5kLkV4dGVuc2lvblN0YXRpY01ldGhvZHBhcnNlRm9ybWFsUGFyYW1ldGVyTW9kaWZpZXJzYmVmb3JlVHlwZWlzTmFtZWRQYXJhbWV0ZXJuYW1lQ29udGV4dGZvcm1hbFBhcmFtZXRlckRlY2xhcmF0aW9uZmllbGRJbml0aWFsaXplcmJlZm9yZUlubGluZUZ1bmN0aW9uVHlwZWNsb3NlcmVuZElubGluZUZ1bmN0aW9uVHlwZU1lbWJlcktpbmQuRnVuY3Rpb25UeXBlZFBhcmFtZXRlcmVxdWFsY29udGludWF0aW9uQ29udGV4dHBhcnNlUXVhbGlmaWVkUmVzdGVuc3VyZUJsb2NrZW51bURlY2xhcmF0aW9uZW51bVZhbHVlRGVjbGFyYXRpb25jbGFzc09yTWl4aW5EZWNsYXJhdGlvbnBhcnNlTmFtZWRNaXhpbkFwcGxpY2F0aW9ucGFyc2VDbGFzc2Vuc3VyZVR5cGVOb3RWb2lkcGFyc2VDbGFzc0hlYWRlck9wdHBhcnNlQ2xhc3NIZWFkZXJSZWNvdmVyeWNsYXNzIGRlY2xhcmF0aW9ucGFyc2VDbGFzc09yTWl4aW5PckV4dGVuc2lvbkJvZHlwYXJzZUNsYXNzRXh0ZW5kc09wdHBhcnNlQ2xhc3NPck1peGluSW1wbGVtZW50c09wdHBhcnNlTmF0aXZlQ2xhdXNlaGFzRXh0ZW5kc2hhc0ltcGxlbWVudHNoYXNXaXRoZXh0ZW5kaW5jb3JyZWN0RXh0ZW5kc0tleXdvcmRoZWFkZXJTdGFydHBhcnNlTWl4aW5IZWFkZXJPcHRwYXJzZU1peGluSGVhZGVyUmVjb3ZlcnltaXhpbiBkZWNsYXJhdGlvbnBhcnNlTWl4aW5Pbk9wdGhhc09ucGFyc2VNaXhpbk9uZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucGFyc2VTdHJpbmdQYXJ0aW5zZXJ0VG9rZW5tZXNzYWdlT25Ub2tlbnJlY292ZXJ5VGVtcGxhdGVub3RFb2ZPclZhbHVlcGFyc2VUeXBlVmFyaWFibGVzT3B0cGFyc2VUb3BMZXZlbE1lbWJlcmJlZm9yZVN0YXJ0cGFyc2VUb3BMZXZlbE1vZGlmaWVycyNzeW50aGV0aWNfaWRlbnRpZmllcl9tZXRob2REZWNsYXJhdGlvbnBhcnNlVG9wTGV2ZWxNZXRob2RwYXJzZUZpZWxkc3BhcnNlRmllbGRJbml0aWFsaXplck9wdGluc2VydFN5bnRoZXRpY1Rva2VudG9wTGV2ZWxGdW5jdGlvbkRlY2xhcmF0aW9ucGFyc2VNZXRob2RUeXBlVmFyc2F2ZWRBc3luY01vZGlmaWVycGFyc2VBc3luY01vZGlmaWVyT3B0dHlwZVZhcnBhcnNlVmFyaWFibGVJbml0aWFsaXplck9wdHBhcnNlSW5pdGlhbGl6ZXJzT3B0cGFyc2VJbml0aWFsaXplcmJlZm9yZUV4cHJlc3Npb25wYXJzZUFzc2VydHBhcnNlU3VwZXJJbml0aWFsaXplckV4cHJlc3Npb25wYXJzZUluaXRpYWxpemVyRXhwcmVzc2lvblJlc3RleHByZXNzaW9uQ29udGludWF0aW9ubWlzc2luZ0Jsb2NrTmFtZWluc2VydEJsb2NrYmVnaW5Hcm91cG9wZW5QYXJlbmVuc3VyZUNvbG9ubmV3VG9rZW4iInBhcnNlTGl0ZXJhbFN0cmluZ3JlcGxhY2VUb2tlbkZvbGxvd2luZ2V4cGVjdGVkTmV4dGV4cGVjdGVkVmFsdWVza2lwQ2xhc3NPck1peGluT3JFeHRlbnNpb25Cb2R5ZW5jbG9zaW5nRGVjbGFyYXRpb25OYW1lcGFyc2VDbGFzc09yTWl4aW5PckV4dGVuc2lvbk1lbWJlckltcGxwYXJzZUNsYXNzTWVtYmVycGFyc2VNaXhpbk1lbWJlcnBhcnNlRXh0ZW5zaW9uTWVtYmVycGFyc2VDbGFzc01lbWJlck1vZGlmaWVyc3BhcnNlRmFjdG9yeU1ldGhvZHBhcnNlTWV0aG9kcGFyc2VJbnZhbGlkT3BlcmF0b3JEZWNsYXJhdGlvbnJlY292ZXJGcm9tSW52YWxpZE1lbWJlcnBhcnNlT3BlcmF0b3JOYW1lbWV0aG9kRGVjbGFyYXRpb25Db250aW51YXRpb25iZWZvcmVQYXJhbWJlZm9yZUluaXRpYWxpemVyc2JvZHlTdGFydHBhcnNlUmVkaXJlY3RpbmdGYWN0b3J5Qm9keUludGVybmFsIGVycm9yOiBUb3BMZXZlbCBjb25zdHJ1Y3Rvci5JbnRlcm5hbCBlcnJvcjogVG9wTGV2ZWwgbWV0aG9kLnN0YXRpY09yQ292YXJpYW50cGFyc2VNb2RpZmllcnNBZnRlckZhY3RvcnlNZW1iZXJLaW5kLkZhY3RvcnlJbnRlcm5hbCBlcnJvcjogVG9wTGV2ZWwgZmFjdG9yeS5iZWZvcmVUb2tlbnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uTWVtYmVyS2luZC5Mb2NhbHBhcnNlQXN5bmNPcHRCb2R5cGFyc2VGdW5jdGlvbkxpdGVyYWxiZWZvcmVOYW1lcGFyc2VOYW1lZEZ1bmN0aW9uUmVzdGxvY2FsRnVuY3Rpb25EZWNsYXJhdGlvbm9mRnVuY3Rpb25FeHByZXNzaW9ucGFyc2VDb25zdHJ1Y3RvclJlZmVyZW5jZWNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uY29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNza2lwQXN5bmNNb2RpZmllcnBhcnNlRXhwcmVzc2lvbkZ1bmN0aW9uQm9keXNhdmVkTG9vcFN0YXRlcGFyc2VTdGF0ZW1lbnRzdGFycmVjb3ZlckZyb21TdGFja092ZXJmbG93cGFyc2VTdGF0ZW1lbnRYcGFyc2VMYWJlbGVkU3RhdGVtZW50cGFyc2VFeHByZXNzaW9uU3RhdGVtZW50T3JEZWNsYXJhdGlvbkFmdGVyTW9kaWZpZXJzcGFyc2VCbG9ja3BhcnNlUmV0dXJuU3RhdGVtZW50dmFyT3JGaW5hbHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudE9yRGVjbGFyYXRpb25wYXJzZUlmU3RhdGVtZW50cGFyc2VGb3JTdGF0ZW1lbnRwYXJzZVJldGhyb3dTdGF0ZW1lbnRwYXJzZVdoaWxlU3RhdGVtZW50cGFyc2VEb1doaWxlU3RhdGVtZW50cGFyc2VUcnlTdGF0ZW1lbnRwYXJzZVN3aXRjaFN0YXRlbWVudHBhcnNlQnJlYWtTdGF0ZW1lbnRwYXJzZUNvbnRpbnVlU3RhdGVtZW50cGFyc2VBc3NlcnRTdGF0ZW1lbnRwYXJzZUVtcHR5U3RhdGVtZW50cGFyc2VZaWVsZFN0YXRlbWVudEludGVybmFsIGVycm9yOiBVbmtub3duIGFzeW5jU3RhdGU6ICdwYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRPckNvbnN0RGVjbGFyYXRpb25sb29rc0xpa2VBd2FpdEV4cHJlc3Npb25wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnRwYXJzZUxhYmVsbGFiZWxEZWNsYXJhdGlvbnBhcnNlVGhyb3dFeHByZXNzaW9ucGFyc2VQcmVjZWRlbmNlRXhwcmVzc2lvbnBhcnNlRXhwcmVzc2lvbldpdGhvdXRDYXNjYWRlcGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb25SZXN0YWxsb3dDYXNjYWRlc3BhcnNlVW5hcnlFeHByZXNzaW9udG9rZW5MZXZlbF9jb21wdXRlUHJlY2VkZW5jZWxhc3RCaW5hcnlFeHByZXNzaW9uTGV2ZWxsYXN0Q2FzY2FkZXBhcnNlQ2FzY2FkZUV4cHJlc3Npb25wYXJzZVByaW1hcnlwYXJzZUFyZ3VtZW50T3JJbmRleFN0YXJwYXJzZUlzT3BlcmF0b3JSZXN0cGFyc2VBc09wZXJhdG9yUmVzdGNhc2NhZGVPcGVyYXRvcnBhcnNlU2VuZG1hcmtwYXJzZUF3YWl0RXhwcmVzc2lvbnBhcnNlSW1wbGljaXRDcmVhdGlvbkV4cHJlc3Npb25wYXJzZVNlbmRPckZ1bmN0aW9uTGl0ZXJhbHBhcnNlTGl0ZXJhbEludHBhcnNlTGl0ZXJhbERvdWJsZXBhcnNlTGl0ZXJhbFN5bWJvbHBhcnNlTGl0ZXJhbEJvb2xwYXJzZUxpdGVyYWxOdWxscGFyc2VUaGlzRXhwcmVzc2lvbnBhcnNlU3VwZXJFeHByZXNzaW9ucGFyc2VOZXdFeHByZXNzaW9ucGFyc2VDb25zdEV4cHJlc3Npb25wYXJzZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uT3JGdW5jdGlvbkxpdGVyYWxwYXJzZUxpdGVyYWxMaXN0U3VmZml4cGFyc2VMaXRlcmFsU2V0T3JNYXBTdWZmaXhwYXJzZUxpdGVyYWxMaXN0U2V0TWFwT3JGdW5jdGlvbnBhcnNlUGFyZW50aGVzaXplZEV4cHJlc3Npb25lbnN1cmVQYXJlbnRoZXNpemVkQ29uZGl0aW9ucGFyc2VFeHByZXNzaW9uSW5QYXJlbnRoZXNpc1Jlc3RwYXJzZUV4cHJlc3Npb25JblBhcmVudGhlc2lzdGhpc1Rva2Vuc3VwZXJUb2tlbmlmQ291bnRoYXNFbnRyeWlmQ29uZGl0aW9uRGVsdGFjb21wdXRlTmV4dGlzTWFwRW50cnlwYXJzZUxpdGVyYWxGdW5jdGlvblN1ZmZpeHR5cGVQYXJhbU9yQXJncGFyc2VNYXBMaXRlcmFsRW50cnlsb29rc0xpa2VGdW5jdGlvbkJvZHllbnN1cmVBcmd1bWVudHNwYXJzZUFyZ3VtZW50c1Jlc3RwYXJzZUNvbnN0cnVjdG9ySW52b2NhdGlvbkFyZ3VtZW50c3BhcnNlU2luZ2xlTGl0ZXJhbFN0cmluZ2xpdGVyYWxTeW1ib2xsaXRlcmFsU3ltYm9sQ29udGludWF0aW9ucGFyc2VCYW5nQmVmb3JlVHlwZUFyZ3VtZW50c2FyZ3VtZW50Q291bnRoYXNTZWVuTmFtZWRBcmd1bWVudG5hbWVkQXJndW1lbnRSZWZlcmVuY2Vjb21wdXRlVHlwZUFmdGVySXNPckFzc2tpcENoYWluZWRBc0lzT3BlcmF0b3JzYXNOb25OdWxsYWJsZWxvb2tzTGlrZUxvY2FsRnVuY3Rpb25vbmx5UGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhcnRwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25Nb2RpZmllcnNiZWZvcmVGb3JtYWxzY291bGRCZUV4cHJlc3Npb25hZnRlcklkZW50aWZpZXJvcmlnaW5hbExpc3RlbmVyYWZ0ZXJFeHByZXNzaW9ucGFyc2VWYXJpYWJsZXNEZWNsYXJhdGlvblJlc3RlbmRXaXRoU2VtaWNvbG9ucGFyc2VPcHRpb25hbGx5SW5pdGlhbGl6ZWRJZGVudGlmaWVybG9jYWxWYXJpYWJsZURlY2xhcmF0aW9ucGFyc2VGb3JMb29wUGFydHNTdGFydHBhcnNlRm9yTG9vcFBhcnRzTWlkcGFyc2VGb3JJblJlc3RwYXJzZUZvclJlc3RwYXJzZUZvckxvb3BQYXJ0c1Jlc3RwYXJzZUZvckluTG9vcFBhcnRzUmVzdHdoaWxlVG9rZW5kb1Rva2VuZm9yd2FyZEVycm9yc29wZW5QYXJlbnNleGNlcHRpb25OYW1lY2F0Y2hQYXJhbWV0ZXJ0cmFjZU5hbWVNZW1iZXJLaW5kLkNhdGNoY2F0Y2ggY2xhdXNlTG9vcFN0YXRlLkluc2lkZVN3aXRjaHBhcnNlU3dpdGNoQmxvY2tiZWdpblN3aXRjaHN3aXRjaCBzdGF0ZW1lbnRiZWdpbkNhc2VwZWVrUGFzdExhYmVsc3BhcnNlU3RhdGVtZW50c0luU3dpdGNoQ2FzZWxhYmVsUmVmZXJlbmNlcHJldmlvdXNUb2tlbnJlcG9ydEFuZFNraXBDbGFzc0luQ2xhc3NyZXBvcnRBbmRTa2lwRW51bUluQ2xhc3NyZXBvcnRBbmRTa2lwVHlwZWRlZkluQ2xhc3NmaW5kRGFydERvY2lzTXVsdGlsaW5lLy8vLyoqcGFyc2VDb21tZW50UmVmZXJlbmNlc3BhcnNlUmVmZXJlbmNlc0luU2luZ2xlTGluZUNvbW1lbnRzcGFyc2VSZWZlcmVuY2VzSW5NdWx0aUxpbmVDb21tZW50bXVsdGlMaW5lRG9jaW5Db2RlQmxvY2tjb2RlQmxvY2tgYGAqICAgICBwYXJzZUNvbW1lbnRSZWZlcmVuY2VzSW5UZXh0Ly8vICAgIGNvbW1lbnRUb2tlbmNoOl1yZWZlcmVuY2VTdGFydGZpbmRSZWZlcmVuY2VFbmRpc0xpbmtUZXh0ZW5kQ29kZUJsb2NrcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlcGFyc2VPbmVDb21tZW50UmVmZXJlbmNlUmVzdGlkZW50aWZpZXJPck9wZXJhdG9ycmlnaHRJbmRleF9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLnBhcnNlcl9lcnJvcmJlZ2luT2Zmc2V0ZnJvbVRva2Vuc19mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLkFzc2VydHVzZU5hbWVGb3JNaXNzaW5nQmxvY2tlbnVtIGRlY2xhcmF0aW9uZmluYWxseUNsYXVzZWZ1bmN0aW9uQm9keWZ1bmN0aW9uIGJvZHl0cnlTdGF0ZW1lbnRCbG9ja0tpbmQoX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIuZm9ybWFsX3BhcmFtZXRlcl9raW5kbWFuZGF0b3J5b3B0aW9uYWxOYW1lZG9wdGlvbmFsUG9zaXRpb25hbGNsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uRGVjbGFyYXRpb250eXBlVmFyaWFibGVEZWNsYXJhdGlvbnByZWZpeGVkVHlwZVJlZmVyZW5jZXR5cGVSZWZlcmVuY2V0eXBlUmVmZXJlbmNlQ29udGludWF0aW9ub3BlcmF0b3JOYW1lbG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uQ29udGludWF0aW9uaW5MaWJyYXJ5T3JQYXJ0T2ZEZWNsYXJhdGlvbmluU3ltYm9saXNDb250aW51YXRpb25pc0J1aWx0SW5JZGVudGlmaWVyQWxsb3dlZGxvb2tzTGlrZVN0YXRlbWVudFN0YXJ0X2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIubWVtYmVyX2tpbmRNZW1iZXJLaW5kLk5vblN0YXRpY0ZpZWxkTWVtYmVyS2luZC5TdGF0aWNGaWVsZE1lbWJlcktpbmQuVG9wTGV2ZWxGaWVsZEZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXJHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZU5vblN0YXRpY01ldGhvZFN0YXRpY01ldGhvZEV4dGVuc2lvbk5vblN0YXRpY01ldGhvZEV4dGVuc2lvblN0YXRpY01ldGhvZE5vblN0YXRpY0ZpZWxkU3RhdGljRmllbGRUb3BMZXZlbEZpZWxkX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIudG9wX2xldmVsX3BhcnNlcl9mZV9hbmFseXplcl9zaGFyZWQucGFyc2VyLnV0aWxiZWZvcmVDbG9zZUJyYWNlVG9rZW5Gb3J0b2tlbiA9PSB0b2tlbi5iZWZvcmVTeW50aGV0aWN0b2tlblZhbHVlc2tpcE1ldGFkYXRhc3BsaXRHdEVxc3BsaXRHdEd0c3BsaXRHdEd0RXFzcGxpdEd0RnJvbUd0R3RFcXNwbGl0R3RGcm9tR3RHdEd0c3BsaXRHdEZyb21HdEd0R3RFcXN5bnRoZXRpY0d0X2ZlX2FuYWx5emVyX3NoYXJlZC5zdGFja19saXN0ZW5lck51bGxWYWx1ZS5Bc051bGxWYWx1ZS5DYXNjYWRlUmVjZWl2ZXJOdWxsVmFsdWUuQ29tYmluYXRvcnNOdWxsVmFsdWUuQ29tbWVudHNOdWxsVmFsdWUuQ29uZGl0aW9uYWxVcmlzTnVsbFZhbHVlLkNvbmRpdGlvbmFsbHlTZWxlY3RlZEltcG9ydE51bGxWYWx1ZS5Db25zdHJ1Y3RvckluaXRpYWxpemVyU2VwYXJhdG9yTnVsbFZhbHVlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzTnVsbFZhbHVlLkNvbnN0cnVjdG9yUmVmZXJlbmNlQ29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzTnVsbFZhbHVlLkRlZmVycmVkTnVsbFZhbHVlLkRvY3VtZW50YXRpb25Db21tZW50TnVsbFZhbHVlLkV4dGVuZHNDbGF1c2VOdWxsVmFsdWUuRnVuY3Rpb25Cb2R5QXN5bmNUb2tlbk51bGxWYWx1ZS5GdW5jdGlvbkJvZHlTdGFyVG9rZW5OdWxsVmFsdWUuSWRlbnRpZmllckxpc3ROdWxsVmFsdWUuSW5pdGlhbGl6ZXJzTnVsbFZhbHVlLlBhcmFtZXRlckRlZmF1bHRWYWx1ZU51bGxWYWx1ZS5QcmVmaXhOdWxsVmFsdWUuU3RyaW5nTGl0ZXJhbE51bGxWYWx1ZS5UeXBlQnVpbGRlckxpc3ROdWxsVmFsdWUuVHlwZUxpc3ROdWxsVmFsdWUuVHlwZVZhcmlhYmxlTnVsbFZhbHVlLlZhckZpbmFsT3JDb25zdFRva2VuTnVsbFZhbHVlLldpdGhDbGF1c2VBc0F3YWl0VG9rZW5CcmVha1RhcmdldENhc2NhZGVSZWNlaXZlckNvbW1lbnRzQ29uZGl0aW9uYWxseVNlbGVjdGVkSW1wb3J0Q29uc3RydWN0b3JJbml0aWFsaXplclNlcGFyYXRvckNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQ29uc3RydWN0b3JSZWZlcmVuY2VDb250aW51YXRpb25BZnRlclR5cGVBcmd1bWVudHNDb250aW51ZVRhcmdldERlZmVycmVkRG9jdW1lbnRhdGlvbkNvbW1lbnRFeHRlbmRzQ2xhdXNlRnVuY3Rpb25Cb2R5RnVuY3Rpb25Cb2R5QXN5bmNUb2tlbkZ1bmN0aW9uQm9keVN0YXJUb2tlbkxhYmVsc1BhcmFtZXRlckRlZmF1bHRWYWx1ZVByZWZpeFN3aXRjaFNjb3BlVHlwZUJ1aWxkZXJMaXN0VmFyRmluYWxPckNvbnN0VG9rZW5XaXRoQ2xhdXNlU3RhY2tMaXN0ZW5lcmRlYnVnU3RhY2tVbmV4cGVjdGVkIHZhbHVlIGBgICgpLiAtLS0gZmFpbHVyZQpkaXNjYXJkcHVzaElmTnVsbHRva2VuT3JOdWxscHJpbnRFdmVudAotLS0tLS0tLS0tLS0tLS0tLS0gID4+IAogIHN0cmluZyBpbnRlcnBvbGF0aW9uRXJyb3I6IGlzSWdub3JlZEVycm9yU3RhY2twb3BMaXN0U3RhY2tJbXBsaXNQYXJzZXJSZWNvdmVyeWFycmF5SW5kZXhEZWJ1Z1N0YWNrcmVhbFN0YWNrc3RhY2tUcmFjZVN0YWNrbGF0ZXN0U3RhY2t0cmFjZXNQYXJzZXJSZWNvdmVyeShAX2ZlX2FuYWx5emVyX3NoYXJlZC51dGlsLmxpbmtfaW1wbGVtZW50YXRpb25JdGVyYWJsZUJhc2VUcmFuc2Zvcm1hdGlvbl9saW5rTWFwcGVkTGlua0l0ZXJhdG9yX3RyYW5zZm9ybWF0aW9ubXlFbGVtZW50c0xpbmtFbnRyeS5oYXNoQ29kZWxhc3RMaW5rY3JlYXRlR2V0dGVyV2l0aEluaXRpYWxpemVyY3JlYXRlR2V0dGVyV2l0aEluaXRpYWxpemVyV2l0aFJlY2hlY2t2YXJpYWJsZUtpbmROYW1lICcnIGhhcyBiZWVuIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi5jcmVhdGVHZXR0ZXJCb2R5V2l0aG91dEluaXRpYWxpemVyJyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuY3JlYXRlU2V0dGVyQm9keWNyZWF0ZVJldHVybmNyZWF0ZVNldHRlckJvZHlGaW5hbCcgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC5GaXhlZFR5cGVCdWlsZGVydHlwZT1mYXN0YS5vcGVyYXRvcnNPcGVyYXRvci5hZGRPcGVyYXRvci5iaXR3aXNlQW5kT3BlcmF0b3IuYml0d2lzZU5vdE9wZXJhdG9yLmJpdHdpc2VPck9wZXJhdG9yLmJpdHdpc2VYb3JPcGVyYXRvci5kaXZpZGVPcGVyYXRvci5lcXVhbHNPcGVyYXRvci5ncmVhdGVyVGhhbk9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWxzT3BlcmF0b3IuaW5kZXhHZXRPcGVyYXRvci5pbmRleFNldE9wZXJhdG9yLmxlZnRTaGlmdE9wZXJhdG9yLmxlc3NUaGFuT3BlcmF0b3IubGVzc1RoYW5FcXVhbHNPcGVyYXRvci5tb2R1bG9PcGVyYXRvci5tdWx0aXBseU9wZXJhdG9yLnJpZ2h0U2hpZnRPcGVyYXRvci50cmlwbGVTaGlmdE9wZXJhdG9yLnN1YnRyYWN0T3BlcmF0b3IudHJ1bmNhdGluZ0RpdmlkZU9wZXJhdG9yLnVuYXJ5TWludXNiaXR3aXNlQW5kYml0d2lzZU5vdGJpdHdpc2VPcmJpdHdpc2VYb3JkaXZpZGVncmVhdGVyVGhhbkVxdWFsc2luZGV4R2V0aW5kZXhTZXRsZWZ0U2hpZnRsZXNzVGhhbkVxdWFsc21vZHVsb211bHRpcGx5cmlnaHRTaGlmdHN1YnRyYWN0dW5hcnlNaW51c29wZXJhdG9yRnJvbVN0cmluZ29wZXJhdG9yVG9TdHJpbmdvcGVyYXRvclJlcXVpcmVkQXJndW1lbnRDb3VudGZhc3RhLm91dGxpbmVfYnVpbGRlcmlzSWdub3JlZFBhcnNlckVycm9yTWV0aG9kQm9keS5BYnN0cmFjdE1ldGhvZEJvZHkuUmVndWxhck1ldGhvZEJvZHkuUmVkaXJlY3RpbmdGYWN0b3J5Qm9keVJlZ3VsYXJpbkNvbnN0cnVjdG9yTmFtZXVubmFtZWRFeHRlbnNpb25Db3VudGVycG9wQ2hhck9mZnNldHBvcElkZW50aWZpZXJMaXN0c2VudGluZWxFbmRJbXBvcnRwcmVmaXhPZmZzZXRFbmRDb25kaXRpb25hbFVyaXNFbmRDb25kaXRpb25hbFVyaVJlY292ZXJJbXBvcnQ6YmFkaW50ZXJwb2xhdGlvbk9mZnNldGVuZElkZW50aWZpZXJMaXN0c3VmZml4T2Zmc2V0YmVnaW5DbGFzc09yTmFtZWRNaXhpbkFwcGxpY2F0aW9uY2xhc3Mgb3IgbWl4aW4gYXBwbGljYXRpb25DbGFzc09yTWl4aW5JbXBsZW1lbnRzbnVsbElmUGFyc2VyUmVjb3ZlcnljbGFzc05hbWVGb3JFcnJvcnNzdXBlcnR5cGVGb3JFcnJvcnNtaXhpblRva2Vuc3VwZXJ0eXBlQ29uc3RyYWludHNfZXh0ZW5zaW9uI2NvbXB1dGVQcm9jZWR1cmVLaW5kI21ldGhvZGZvcm1hbHNPZmZzZXRib2R5S2luZG5hbWVPck9wZXJhdG9ycmVxdWlyZWRBcmd1bWVudENvdW50dHlwZVZhcmlhYmxlQnVpbGRlcnZhckZpbmFsT3JDb25zdE9mZnNldHN5bnRoZXNpemVkVHlwZVZhcmlhYmxlc3N5bnRoZXNpemVkRm9ybWFsc3VuYm91bmRUeXBlI3RoaXNtaXhpbkFwcGxpY2F0aW9uQnVpbGRlcmFsaWFzZWRUeXBlcG9wRmllbGRJbmZvc2luaXRpYWxpemVyVG9rZW5Gb3JJbmZlcmVuY2VUeXBlVmFyaWFibGVzRGVmaW5lZHN0ZXBzdmlhY29udGFpbmluZ0xpYnJhcnlleHRlbmRzT2Zmc2V0Z2V0RG9jdW1lbnRhdGlvbkNvbW1lbnRkb2NUb2tlbmluU2xhc2hfSGFzUHJvbW90ZWRUeXBlVmFyaWFibGVWaXNpdG9yX0RlbW90aW9uTm9uTnVsbGlmaWNhdGlvbmRlbW90ZVR5cGVWYXJpYWJsZXNub25OdWxsaWZ5VHlwZXNoYXNQcm9tb3RlZFR5cGVWYXJpYWJsZWRlbW90ZVR5cGVJbkxpYnJhcnlub25OdWxsaWZ5SW5MaWJyYXJ5SW5zdHJ1bWVudGF0aW9uVmFsdWVtYXRjaGVzSW5zdHJ1bWVudGF0aW9uVmFsdWVMaXRlcmFsX3Nob3J0ZW5JbnN0cnVtZW50YXRpb25TdHJpbmctPmRhcnQuY29yZTo6ZGFydC5hc3luYzo6dGVzdDo6XHMqL1wqLio/XCovXHMqX3Byb3RvQ29uc3RyYWludHNfcGFyYW1ldGVyc1RvQ29uc3RyYWlucHJvdG9Db25zdHJhaW50aXNVcHBlcm9sZFByb3RvQ29uc3RyYWludHNMZW5ndGhpc01hdGNoX2lzU3VidHlwZU1hdGNoX2NvbnN0cmFpbkxvd2VyX2NvbnN0cmFpblVwcGVyX2lzRnVuY3Rpb25TdWJ0eXBlTWF0Y2hzdWJ0eXBlU3Vic3RpdHV0aW9uc3VwZXJ0eXBlU3Vic3RpdHV0aW9uZnJlc2hUeXBlVmFyaWFibGVzX21hdGNoVHlwZUZvcm1hbHNfaXNJbnRlcmZhY2VTdWJ0eXBlTWF0Y2htYXRjaGluZ1N1cGVydHlwZU9mU3VidHlwZUFyZ3VtZW50c3BhcmFtZXRlclZhcmlhbmNlX2lzTnVsbHN1YnR5cGVGdXR1cmVtYXRjaGVzRnV0dXJlbWF0Y2hlc0FyZ19pc1RvcHBhcmFtczFwYXJhbXMyc3Vic3RpdHV0aW9uMXN1YnN0aXR1dGlvbjJwRnJlc2h2YXJpYWJsZUZyZXNoYm91bmQxYm91bmQyVHlwZVNjaGVtYUNvbnN0cmFpbnRHYXRoZXJlcl9Qcm90b0NvbnN0cmFpbnRfVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvcmlzTGVhc3RDbG9zdXJlcnVuSW50ZXJuZXJOdWxsSW50ZXJuZXJrZXJuZWwuc2VyaWFsaXplcl9jb21iaW5hdG9yc1RhZ2dlckRlc2VyaWFsaXphdGlvbkVudmlyb25tZW50YmluZGVyc2FkZEJpbmRlcm5hbWUgJycgaXMgYWxyZWFkeSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlU2VyaWFsaXphdGlvbkVudmlyb25tZW50bmFtZUNvdW50Y29kZU9mWmVyb2NvZGVPZk5pbmU5cHJlZml4TGVuZ3RoaXNPbmx5RGlnaXRzRGFydFN0cmluZ2V4cGVjdGVkIGFuIGF0b20sIGZvdW5kIGEgbGlzdERhcnRJbnREYXJ0RG91YmxlRGFydEJvb2xleHBlY3RlZCAndHJ1ZScgb3IgJ2ZhbHNlJywgZm91bmQgJ0Nhc2V0YWdnZXJ0YWdzc2VyaWFsaXplcnN1bmluaXRpYWxpemVkZXhwZWN0ZWQgbGlzdCwgZm91bmQgYXRvbWV4cGVjdGVkIGF0b20sIGZvdW5kIGxpc3RleHRyYSBjcnVmdCBpbiB0YWdnZWQgJ3VucmVjb2duaXplZCB0YWcgJ1dyYXBwZWR1bndyYXBTY29wZWRVc2VzdHJpbmdTZXJpYWxpemVyVHVwbGUyU2VyaWFsaXplclQxVDJUdXBsZTJUdXBsZTNTZXJpYWxpemVyVDN0aGlyZFR1cGxlM1R1cGxlNFNlcmlhbGl6ZXJUNGZvdXJ0aFR1cGxlNExpc3RTZXJpYWxpemVyZXhwZWN0ZWQgYSBsaXN0LCBmb3VuZCBhbiBhdG9tT3B0aW9uYWxCaW5kZXJuYW1lR2V0dGVybmFtZVNldHRlcm9sZE5hbWVuZXdOYW1lQmluZHRlcm1iaW5kaW5nU3RhdGV0dXBsZVJlYmluZHBhdHRlcm4xcGF0dGVybjJjbG9zZWRTdGF0ZVppcHppcHVuemlwdG9aaXBmaXJzdHNzZWNvbmRzemlwcGVka2VybmVsLnRleHRfcmVhZGVyc3BhY2VscGFyZW5ycGFyZW5kcXVvdGVic2xhc2hza2lwV2hpdGVzcGFjZXNraXBUb0VuZE9mTmVzdGVkaXRza2lwVG9FbmRPZkF0b21pc1F1b3RlZGtlcm5lbC50ZXh0X3NlcmlhbGl6ZXJOYW1lVGFnZ2VycHVibGljRXhwcmVzc2lvblRhZ2dlcmNvbmNhdHN5bWJvbGNvbnN0LWxpc3Rjb25zdC1zZXRjb25zdC1tYXBnZXQtcHJvcHNldC1wcm9wZ2V0LXN1cGVyc2V0LXN1cGVyaW52b2tlLW1ldGhvZGludm9rZS1zdXBlcmdldC12YXJzZXQtdmFyZ2V0LXN0YXRpY3NldC1zdGF0aWNnZXQtZGlyZWN0LXByb3BzZXQtZGlyZWN0LXByb3BpbnZva2UtY29uc3Qtc3RhdGljaW52b2tlLXN0YXRpY2ludm9rZS1kaXJlY3QtbWV0aG9kaW52b2tlLWNvbnN0LWNvbnN0cnVjdG9yaW52b2tlLWNvbnN0cnVjdG9yQ2Fub25pY2FsTmFtZVNlcmlhbGl6ZXJkZWxpbWl0ZXJWYXJpYWJsZURlY2xhcmF0aW9uVGFnZ2VyY292YXJpYW50IGRlY2xhcmF0aW9uaW5pdGlhbGl6aW5nIGZvcm1hbGNvbnN0IGFuZCBmaW5hbERhcnRUeXBlVGFnZ2VyYm90dG9tcGFyU3RhdGVtZW50VGFnZ2VyRnVuY3Rpb25Ob2RlVGFnZ2VyYXN5bmMtc3RhcnN5bmMtc3RhcnN5bmMteWllbGRpbmdwdWJsaWNOYW1lcHJpdmF0ZU5hbWVuYW1lU2VyaWFsaXplcmludmFsaWRFeHByZXNzaW9uU2VyaWFsaXplcm5vdFNlcmlhbGl6ZXJsb2dpY2FsQW5kU2VyaWFsaXplcmxvZ2ljYWxPclNlcmlhbGl6ZXJzdHJpbmdDb25jYXRlbmF0aW9uU2VyaWFsaXplcnN0cmluZ0xpdGVyYWxTZXJpYWxpemVyaW50TGl0ZXJhbFNlcmlhbGl6ZXJkb3VibGVMaXRlcmFsU2VyaWFsaXplcmJvb2xMaXRlcmFsU2VyaWFsaXplcm51bGxMaXRlcmFsU2VyaWFsaXplcnN5bWJvbExpdGVyYWxTZXJpYWxpemVydGhpc0V4cHJlc3Npb25TZXJpYWxpemVycmV0aHJvd1NlcmlhbGl6ZXJ0aHJvd1NlcmlhbGl6ZXJhd2FpdEV4cHJlc3Npb25TZXJpYWxpemVyY29uZGl0aW9uYWxFeHByZXNzaW9uU2VyaWFsaXplcmlzRXhwcmVzc2lvblNlcmlhbGl6ZXJhc0V4cHJlc3Npb25TZXJpYWxpemVydHlwZUxpdGVyYWxTZXJpYWxpemVybGlzdExpdGVyYWxTZXJpYWxpemVyY29uc3RMaXN0TGl0ZXJhbFNlcmlhbGl6ZXJzZXRMaXRlcmFsU2VyaWFsaXplcmNvbnN0U2V0TGl0ZXJhbFNlcmlhbGl6ZXJtYXBMaXRlcmFsU2VyaWFsaXplcmNvbnN0TWFwTGl0ZXJhbFNlcmlhbGl6ZXJsZXRTZXJpYWxpemVycHJvcGVydHlHZXRTZXJpYWxpemVycHJvcGVydHlTZXRTZXJpYWxpemVyc3VwZXJQcm9wZXJ0eUdldFNlcmlhbGl6ZXJzdXBlclByb3BlcnR5U2V0U2VyaWFsaXplcm1ldGhvZEludm9jYXRpb25TZXJpYWxpemVyc3VwZXJNZXRob2RJbnZvY2F0aW9uU2VyaWFsaXplcnZhcmlhYmxlR2V0U2VyaWFsaXplcnZhcmlhYmxlU2V0U2VyaWFsaXplcnN0YXRpY0dldFNlcmlhbGl6ZXJzdGF0aWNTZXRTZXJpYWxpemVyZGlyZWN0UHJvcGVydHlHZXRTZXJpYWxpemVyZGlyZWN0UHJvcGVydHlTZXRTZXJpYWxpemVyc3RhdGljSW52b2NhdGlvblNlcmlhbGl6ZXJjb25zdFN0YXRpY0ludm9jYXRpb25TZXJpYWxpemVyZGlyZWN0TWV0aG9kSW52b2NhdGlvblNlcmlhbGl6ZXJjb25zdHJ1Y3Rvckludm9jYXRpb25TZXJpYWxpemVyY29uc3RDb25zdHJ1Y3Rvckludm9jYXRpb25TZXJpYWxpemVyZnVuY3Rpb25FeHByZXNzaW9uU2VyaWFsaXplcm5hbWVkRXhwcmVzc2lvblNlcmlhbGl6ZXJhcmd1bWVudHNTZXJpYWxpemVydmFyRGVjbGFyYXRpb25TZXJpYWxpemVyZmluYWxEZWNsYXJhdGlvblNlcmlhbGl6ZXJjb25zdERlY2xhcmF0aW9uU2VyaWFsaXplcnZhcmlhYmxlRGVjbGFyYXRpb25TZXJpYWxpemVydHlwZVBhcmFtZXRlclNlcmlhbGl6ZXJ0eXBlUGFyYW1ldGVyc1NlcmlhbGl6ZXJpbnZhbGlkVHlwZVNlcmlhbGl6ZXJkeW5hbWljVHlwZVNlcmlhbGl6ZXJ2b2lkVHlwZVNlcmlhbGl6ZXJib3R0b21UeXBlU2VyaWFsaXplcmZ1bmN0aW9uVHlwZVNlcmlhbGl6ZXJuYW1lZFR5cGVTZXJpYWxpemVydHlwZVBhcmFtZXRlclR5cGVTZXJpYWxpemVyZXhwcmVzc2lvblN0YXRlbWVudFNlcmlhbGl6ZXJyZXR1cm5TdGF0ZW1lbnRTZXJpYWxpemVyc3luY0Z1bmN0aW9uTm9kZVNlcmlhbGl6ZXJhc3luY0Z1bmN0aW9uTm9kZVNlcmlhbGl6ZXJzeW5jU3RhckZ1bmN0aW9uTm9kZVNlcmlhbGl6ZXJhc3luY1N0YXJGdW5jdGlvbk5vZGVTZXJpYWxpemVyc3luY1lpZWxkaW5nU3RhckZ1bmN0aW9uTm9kZVNlcmlhbGl6ZXJmdW5jdGlvbk5vZGVTZXJpYWxpemVydW53cmFwUHVibGljTmFtZXdyYXBQdWJsaWNOYW1ldW53cmFwUHJpdmF0ZU5hbWV3cmFwUHJpdmF0ZU5hbWVkZXNlcmlhbGl6YXRpb24gb2YgcHJpdmF0ZSBuYW1lc3Vud3JhcEludmFsaWRFeHByZXNzaW9ud3JhcEludmFsaWRFeHByZXNzaW9udW53cmFwTm90d3JhcE5vdHVud3JhcExvZ2ljYWxFeHByZXNzaW9ud3JhcExvZ2ljYWxBbmR3cmFwTG9naWNhbE9ydW53cmFwU3RyaW5nQ29uY2F0ZW5hdGlvbndyYXBTdHJpbmdDb25jYXRlbmF0aW9udW53cmFwU3RyaW5nTGl0ZXJhbHdyYXBTdHJpbmdMaXRlcmFsdW53cmFwSW50TGl0ZXJhbHdyYXBJbnRMaXRlcmFsdW53cmFwRG91YmxlTGl0ZXJhbHdyYXBEb3VibGVMaXRlcmFsdW53cmFwQm9vbExpdGVyYWx3cmFwQm9vbExpdGVyYWx1bndyYXBOdWxsTGl0ZXJhbHdyYXBOdWxsTGl0ZXJhbHVud3JhcFN5bWJvbExpdGVyYWx3cmFwU3ltYm9sTGl0ZXJhbHVud3JhcFRoaXNFeHByZXNzaW9ud3JhcFRoaXNFeHByZXNzaW9udW53cmFwUmV0aHJvd3dyYXBSZXRocm93dW53cmFwVGhyb3d3cmFwVGhyb3d1bndyYXBBd2FpdEV4cHJlc3Npb253cmFwQXdhaXRFeHByZXNzaW9udW53cmFwQ29uZGl0aW9uYWxFeHByZXNzaW9ud3JhcENvbmRpdGlvbmFsRXhwcmVzc2lvbnVud3JhcElzRXhwcmVzc2lvbndyYXBJc0V4cHJlc3Npb251bndyYXBBc0V4cHJlc3Npb253cmFwQXNFeHByZXNzaW9udW53cmFwVHlwZUxpdGVyYWx3cmFwVHlwZUxpdGVyYWx1bndyYXBMaXN0TGl0ZXJhbHdyYXBMaXN0TGl0ZXJhbHdyYXBDb25zdExpc3RMaXRlcmFsdW53cmFwU2V0TGl0ZXJhbHdyYXBTZXRMaXRlcmFsd3JhcENvbnN0U2V0TGl0ZXJhbHVud3JhcE1hcExpdGVyYWx3cmFwTWFwTGl0ZXJhbHdyYXBDb25zdE1hcExpdGVyYWx1bndyYXBMZXR3cmFwTGV0Z2V0VmFyaWFibGVEZWNsYXJhdGlvbk5hbWVzZXRWYXJpYWJsZURlY2xhcmF0aW9uTmFtZXVud3JhcFByb3BlcnR5R2V0d3JhcFByb3BlcnR5R2V0dW53cmFwUHJvcGVydHlTZXR3cmFwUHJvcGVydHlTZXR1bndyYXBTdXBlclByb3BlcnR5R2V0d3JhcFN1cGVyUHJvcGVydHlHZXR1bndyYXBTdXBlclByb3BlcnR5U2V0d3JhcFN1cGVyUHJvcGVydHlTZXR1bndyYXBNZXRob2RJbnZvY2F0aW9ud3JhcE1ldGhvZEludm9jYXRpb251bndyYXBTdXBlck1ldGhvZEludm9jYXRpb253cmFwU3VwZXJNZXRob2RJbnZvY2F0aW9udW53cmFwVmFyaWFibGVHZXR3cmFwVmFyaWFibGVHZXR1bndyYXBWYXJpYWJsZVNldHdyYXBWYXJpYWJsZVNldHVud3JhcFN0YXRpY0dldHdyYXBTdGF0aWNHZXR1bndyYXBTdGF0aWNTZXR3cmFwU3RhdGljU2V0dW53cmFwRGlyZWN0UHJvcGVydHlHZXR3cmFwRGlyZWN0UHJvcGVydHlHZXR1bndyYXBEaXJlY3RQcm9wZXJ0eVNldHdyYXBEaXJlY3RQcm9wZXJ0eVNldHVud3JhcFN0YXRpY0ludm9jYXRpb253cmFwU3RhdGljSW52b2NhdGlvbndyYXBDb25zdFN0YXRpY0ludm9jYXRpb251bndyYXBEaXJlY3RNZXRob2RJbnZvY2F0aW9ud3JhcERpcmVjdE1ldGhvZEludm9jYXRpb251bndyYXBDb25zdHJ1Y3Rvckludm9jYXRpb253cmFwQ29uc3RydWN0b3JJbnZvY2F0aW9ud3JhcENvbnN0Q29uc3RydWN0b3JJbnZvY2F0aW9udW53cmFwRnVuY3Rpb25FeHByZXNzaW9ud3JhcEZ1bmN0aW9uRXhwcmVzc2lvbnVud3JhcE5hbWVkRXhwcmVzc2lvbndyYXBOYW1lZEV4cHJlc3Npb251bndyYXBBcmd1bWVudHN3cmFwQXJndW1lbnRzdW53cmFwVmFyaWFibGVEZWNsYXJhdGlvbndyYXBWYXJEZWNsYXJhdGlvbndyYXBGaW5hbERlY2xhcmF0aW9ud3JhcENvbnN0RGVjbGFyYXRpb251bndyYXBUeXBlUGFyYW1ldGVyd3JhcFR5cGVQYXJhbWV0ZXJzZXRUeXBlUGFyYW1ldGVyTmFtZXppcFR5cGVQYXJhbWV0ZXJCb3VuZHVuemlwVHlwZVBhcmFtZXRlckJvdW5kemlwVHlwZVBhcmFtZXRlckRlZmF1bHRUeXBldW56aXBUeXBlUGFyYW1ldGVyRGVmYXVsdFR5cGV1bndyYXBJbnZhbGlkVHlwZXdyYXBJbnZhbGlkVHlwZXVud3JhcER5bmFtaWNUeXBld3JhcER5bmFtaWNUeXBldW53cmFwVm9pZFR5cGV3cmFwVm9pZFR5cGV1bndyYXBCb3R0b21UeXBld3JhcEJvdHRvbVR5cGV1bndyYXBGdW5jdGlvblR5cGV3cmFwRnVuY3Rpb25UeXBldW53cmFwTmFtZWRUeXBld3JhcE5hbWVkVHlwZXVud3JhcFR5cGVQYXJhbWV0ZXJUeXBld3JhcFR5cGVQYXJhbWV0ZXJUeXBldW53cmFwRXhwcmVzc2lvblN0YXRlbWVudHdyYXBFeHByZXNzaW9uU3RhdGVtZW50dW53cmFwUmV0dXJuU3RhdGVtZW50d3JhcFJldHVyblN0YXRlbWVudHVud3JhcEZ1bmN0aW9uTm9kZXdyYXBTeW5jRnVuY3Rpb25Ob2Rld3JhcEFzeW5jRnVuY3Rpb25Ob2Rld3JhcFN5bmNTdGFyRnVuY3Rpb25Ob2Rld3JhcEFzeW5jU3RhckZ1bmN0aW9uTm9kZXdyYXBTeW5jWWllbGRpbmdGdW5jdGlvbk5vZGVEaWxsRXh0ZW5zaW9uTWVtYmVyQnVpbGRlcl9kZXNjcmlwdG9yZmFzdGEudHlwZV9idWlsZGVyX2NvbXB1dGVyVW5zdXBwb3J0ZWROb3QgaW1wbGVtZW50ZWRrZXJuZWxBcmd1bWVudHNmYXN0YVBhdGgvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhLy9wa2cvZnJvbnRfZW5kL3Rvb2wvX2Zhc3RhL2NvbW1hbmRfbGluZS5kYXJ0a2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0ZmFzdGEudGFyZ2V0VHlwZVJlcHJlc2VudGF0aW9uVHlwZVJlcHJlc2VudGF0aW9uLmxlZ2FjeVR5cGVSZXByZXNlbnRhdGlvbi5leHBsaWNpdFR5cGVSZXByZXNlbnRhdGlvbi5pbXBsaWNpdFVuZGV0ZXJtaW5lZFR5cGVSZXByZXNlbnRhdGlvbi5ub25OdWxsYWJsZUJ5RGVmYXVsdGltcGxpY2l0VW5kZXRlcm1pbmVkbm9uTnVsbGFibGVCeURlZmF1bHRDb25zdGFudFRvVGV4dFZpc2l0b3J0eXBlUmVwcmVzZW50YXRpb25VbmV4cGVjdGVkIGNvbnN0YW50IE51bGwoKUJvb2woSW50KERvdWJsZShTdHJpbmcoU3ltYm9sKE1hcDxMaXN0PFNldDxJbnN0YW5jZSgse0luc3RhbnRpYXRpb24oRnVuY3Rpb24oVHlwZUxpdGVyYWwoVW5ldmFsdWF0ZWQoKURhcnRUeXBlVG9UZXh0VmlzaXRvcjxpbnZhbGlkPjxib3R0b20+cmVxdWlyZWQgICYgZ2V0RW5jbG9zaW5nTWVtYmVyTGlicmFyeSAnbG9va3VwTGlicmFyeU1lbWJlcmxvb2t1cENsYXNzTWVtYmVybG9va3VwTGlicmFyeUJ1aWxkZXJEZWNsYXJhdGlvbkJ1aWxkZXIgZm9yICBub3QgZm91bmQubG9va3VwTGlicmFyeURlY2xhcmF0aW9uQnVpbGRlcmxvb2t1cENsYXNzQnVpbGRlcmNsc0J1aWxkZXJDbGFzc0J1aWxkZXIgZm9yIGxvb2t1cEV4dGVuc2lvbkJ1aWxkZXJFeHRlbnNpb25CdWlsZGVyIGZvciBsb29rdXBDbGFzc01lbWJlckJ1aWxkZXJNZW1iZXJCdWlsZGVyIGZvciBsb29rdXBNZW1iZXJCdWlsZGVybG9va3VwRXh0ZW5zaW9uTWVtYmVyQnVpbGRlcmNvbnN0YW50VG9UZXh0Y29tcHV0ZUFsbFN1cGVyY2xhc3Nlc19nZXRBbGxTdXBlcmNsYXNzZXNzdXBlcnR5cGVUb1RleHR0eXBlUGFyYW1ldGVyVG9UZXh0dHlwZUJ1aWxkZXJUb1RleHRfdHlwZUJ1aWxkZXJUb1RleHRVbmhhbmRsZWQgdHlwZSBidWlsZGVyIF90eXBlQnVpbGRlcnNUb1RleHR0eXBlVmFyaWFibGVCdWlsZGVyVG9UZXh0ZXJyb3JzVG9UZXh0dXNlQ29kZXNleHRlbnNpb25NZXRob2REZXNjcmlwdG9yVG9UZXh0c3RhdGljIGdldHRlciBzZXR0ZXIgb3BlcmF0b3IgZmllbGQgdGVhcm9mZiBudWxsYWJpbGl0eVRvVGV4dFVuZXhwZWN0ZWQgbnVsbGFiaWxpdHk6IF9jYW5kaWRhdGVzX2NvbXB1dGVDb3ZhcmlhbmNlRml4ZXNpbnRlcmZhY2VNZW1iZXJUeXBlUGFyYW1ldGVyc3N0dWJUeXBlUGFyYW1ldGVyc3RhcmdldFR5cGVQYXJhbWV0ZXJnZXRDYW5kaWRhdGVBdF9zdWJzdGl0dXRpb25Gb3JfY3JlYXRlRm9yd2FyZGluZ1N0dWJpbnRlcmZhY2VQb3NpdGlvbmFsUGFyYW1ldGVyc2dldFBvc2l0aW9uYWxQYXJhbWV0ZXJzaW50ZXJmYWNlVHlwZVBhcmFtZXRlcnNjcmVhdGVTdHViSWZOZWVkZWRmb3JNZW1iZXJTaWduYXR1cmVpc0ltcGxDcmVhdGVkY3JlYXRlSW1wbElmTmVlZGVkX2NyZWF0ZUZvcndhcmRpbmdJbXBsSWZOZWVkZWRuZWVkc0NoZWNraW5pdGlhbFR5cGVvdGhlclBvc2l0aW9uYWxQYXJhbWV0ZXJzb3RoZXJQYXJhbWV0ZXJzdXBlclR5cGVQYXJhbWV0ZXJvdGhlclR5cGVQYXJhbWV0ZXJzb3RoZXJUeXBlUGFyYW1ldGVyc3VwZXJDYWxsYWRkaXRpb25hbFN1YnN0aXR1dGlvbmdldFJlcXVpcmVkUGFyYW1ldGVyQ291bnRmaW5hbFRhcmdldGZvcndhcmRpbmdTdHViZmFzdGEudHJhbnNmb3JtX2NvbGxlY3Rpb25zbGlzdEFkZHNldEZhY3RvcnlzZXRBZGRtYXBQdXRtYXBFbnRyeUtleW1hcEVudHJ5VmFsdWVnZXQ6ZW50cmllc19maW5kU2V0RmFjdG9yeV90cmFuc2xhdGVMaXN0T3JTZXRfY3JlYXRlVmFyaWFibGVfY3JlYXRlU2V0TGl0ZXJhbF9jcmVhdGVMaXN0TGl0ZXJhbF9hZGRFeHByZXNzaW9uRWxlbWVudF90cmFuc2xhdGVFbGVtZW50X2NyZWF0ZUJsb2NrRXhwcmVzc2lvbl9jcmVhdGVCbG9ja19jcmVhdGVWYXJpYWJsZUdldF90cmFuc2xhdGVTcHJlYWRFbGVtZW50X3RyYW5zbGF0ZUlmRWxlbWVudF90cmFuc2xhdGVGb3JFbGVtZW50X3RyYW5zbGF0ZUZvckluRWxlbWVudF9jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50X2NyZWF0ZUFkZGVsc2VTdGF0ZW1lbnRzZWxzZUJvZHlfY3JlYXRlSWZsb29wX2NyZWF0ZUZvclN0YXRlbWVudF9jcmVhdGVGb3JJblN0YXRlbWVudF9jcmVhdGVOdWxsQ2hlY2tlZFZhcmlhYmxlR2V0X2NyZWF0ZUZvckluVmFyaWFibGVjYXN0ZWRWYXJfY3JlYXRlSW1wbGljaXRBc19jcmVhdGVFcXVhbHNOdWxsbm90RXF1YWxzX3RyYW5zbGF0ZUNvbnN0TGlzdE9yU2V0X3RyYW5zbGF0ZUNvbnN0TWFwX2NyZWF0ZU1hcExpdGVyYWxfYWRkTm9ybWFsRW50cnlfdHJhbnNsYXRlRW50cnlfdHJhbnNsYXRlU3ByZWFkRW50cnlfdHJhbnNsYXRlSWZFbnRyeV90cmFuc2xhdGVGb3JFbnRyeV90cmFuc2xhdGVGb3JJbkVudHJ5X2NyZWF0ZUluZGV4U2V0a2V5VmFyX2NyZWF0ZUdldEtleXZhbHVlVmFyX2NyZWF0ZUdldFZhbHVlX2NyZWF0ZUdldEVudHJpZXNjdXJyZW50UGFydF9jcmVhdGVOdWxsQXdhcmVHdWFyZF9jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb25jb2xsZWN0aW9uVHlwZU5vIGZpbGVPZmZzZXQgb24gZmFzdGEudHJhbnNmb3JtX3NldF9saXRlcmFsc19maW5kQWRkTWV0aG9kc2V0VmFyc2V0RXhwZmFzdGEuZGlldF9saXN0ZW5lcmltcG9ydEV4cG9ydERpcmVjdGl2ZUluZGV4cGFydERpcmVjdGl2ZUluZGV4X2N1cnJlbnREZWNsYXJhdGlvbl9jdXJyZW50Q2xhc3NfaW5SZWRpcmVjdGluZ0ZhY3RvcnljdXJyZW50Q2xhc3NJc1BhcnNlclJlY292ZXJ5dW5hbGlhc2VkQnVpbGRlcmxvb2t1cEJ1aWxkZXJtZXRhZGF0YVRva2VudG9rZW5Gb3JPZmZzZXRidWlsZEZpZWxkc2JvZHlUb2tlbmNyZWF0ZUZ1bmN0aW9uTGlzdGVuZXJidWlsZEZ1bmN0aW9uQm9keWltcG9ydFVyaVRva2VubGlicmFyeU5vZGVidWlsZFJlZGlyZWN0aW5nRmFjdG9yeU1ldGhvZEV4dGVuc2lvbkZhY3RvcnlNZXRob2RFeHRlbnNpb25Db25zdHJ1Y3RvcmluZmVyZW5jZURhdGFGb3JUZXN0aW5nY3JlYXRlTGlzdGVuZXJJbnRlcm5hbHR5cGVQYXJhbWV0ZXJTY29wZWdldEFzeW5jTWFya2VybGlzdGVuZXJGaW5pc2hGdW5jdGlvbmxpc3RlbmVyRmluaXNoRmllbGRzaGFuZGxlRHVwbGljYXRlZE5hbWVjaGVja0J1aWxkZXJuZWFyZXN0RGVjbGFyYXRpb25taW5EaXN0YW5jZWRpc3RhbmNldG9rZW5zRm9yT2Zmc2V0c2Zhc3RhLmRpZXRfcGFyc2VyQ29uc3RhbnRJbnRGb2xkZXJmb3JTZW1hbnRpY3NzZW1hbnRpY3NfY2hlY2tPcGVyYW5kc1ZtQ29uc3RhbnRJbnRGb2xkZXJJbnZhbGlkIHVuYXJ5IG9wZXJhdG9yIEludmFsaWQgYmluYXJ5IG9wZXJhdG9yIEpzQ29uc3RhbnRJbnRGb2xkZXJfdmFsdWVJc0ludGVnZXJfdHJ1bmNhdGUzMl90b1VpbnQzMnRvSW50MTg0NDY3NDQwNzM3MDk1NTIwMDAuMGFpX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIuYXN5bmNfbW9kaWZpZXJEaXJlY3RpdmVDb250ZXh0RGlyZWN0aXZlU3RhdGUuVW5rbm93bkRpcmVjdGl2ZVN0YXRlLlNjcmlwdEludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHNjcmlwdCB0YWcuRGlyZWN0aXZlU3RhdGUuUGFydE9mRGlyZWN0aXZlU3RhdGUuRGVjbGFyYXRpb25zRGlyZWN0aXZlU3RhdGUuSW1wb3J0QW5kRXhwb3J0RGlyZWN0aXZlU3RhdGUuUGFydERpcmVjdGl2ZVN0YXRlLkxpYnJhcnlEaXJlY3RpdmVTdGF0ZVVua25vd25JbXBvcnRBbmRFeHBvcnREZWNsYXJhdGlvbnNJbnRlcm5hbCBFcnJvcjogc2hvdWxkIG5vdCBjYWxsIHBhcnNlSW50ZXJuYWwgRXJyb3I6ICBzaG91bGQgaW1wbGVtZW50IHBhcnNlX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIubG9vcF9zdGF0ZU91dHNpZGVMb29wSW5zaWRlU3dpdGNoSW5zaWRlTG9vcGZpbmFsVG9rZW52YXJUb2tlbmFmdGVyRmFjdG9yeUludGVybmFsIGVycm9yOiBVbmV4cGVjdGVkIHN0YXRpY09yQ292YXJpYW50ICdJbnRlcm5hbCBlcnJvcjogVW5leHBlY3RlZCB2YXJGaW5hbE9yQ29uc3QgJ3BhcnNlTW9kaWZpZXJzcmVwb3J0RXh0cmFuZW91c01vZGlmaWVycmVwb3J0RXh0cmFuZW91c01vZGlmaWVySW5FeHRlbnNpb25wYXJzZUFic3RyYWN0cGFyc2VDb25zdHBhcnNlQ292YXJpYW50cGFyc2VFeHRlcm5hbHBhcnNlRmluYWxwYXJzZUxhdGVwYXJzZVJlcXVpcmVkcGFyc2VTdGF0aWNwYXJzZVZhckludGVybmFsIEVycm9yOiBVbmhhbmRsZWQgbW9kaWZpZXI6IHJlcG9ydE1vZGlmaWVyT3V0T2ZPcmRlcnJlcG9ydENvbmZsaWN0aW5nTW9kaWZpZXJzSW50ZXJuYWwgRXJyb3I6IFVuZXhwZWN0ZWQgdmFyRmluYWxPckNvbnN0OiBJbnRlcm5hbCBFcnJvcjogVW5oYW5kbGVkIHJlY292ZXJ5OiBlYXJsaWVyTW9kaWZpZXJiZWZvcmVNb2RpZmllcl9Ub2tlblN0cmVhbVJld3JpdGVyJk9iamVjdCZfVG9rZW5TdHJlYW1NaXhpbm5ld1Rva2VuVHlwZXVzZSBpbnNlcnRTeW50aGV0aWNLZXl3b3JkIGluc3RlYWRpbmNsdWRlSWRlbnRpZmllcnJlcGxhY2VtZW50VG9rZW5yZXBsYWNlZFRva2VuX2xhc3RUb2tlbkluQ2hhaW5fVG9rZW5TdHJlYW1HaG9zdFdyaXRlciZPYmplY3QmX1Rva2VuU3RyZWFtTWl4aW5Ub2tlblN0cmVhbUdob3N0V3JpdGVycmlnaHRQYXJlbm5ld0VuZEdyb3VwX1Rva2VuU3RyZWFtTWl4aW5fZmVfYW5hbHl6ZXJfc2hhcmVkLnBhcnNlci50eXBlX2luZm9wYXJzZVR5cGVOb3RWb2lkaXNTaW1wbGVUeXBlQXJndW1lbnQgaXMgbm90IGEgU2ltcGxlVHlwZUFyZ3VtZW50LnZvaWRUeXBlaXNHZW5lcmFsaXplZEZ1bmN0aW9uVHlwZWNvbXB1dGVCdWlsdGluT3JWYXJBc1R5cGVjb21wdXRlUHJlZml4ZWRUeXBlY29tcHV0ZVZvaWRHRlRjb21wdXRlTm9UeXBlR0ZUY29tcHV0ZVNpbXBsZVdpdGhUeXBlQXJndW1lbnRzY29tcHV0ZUlkZW50aWZpZXJHRlRjb21wdXRlSWRlbnRpZmllclF1ZXN0aW9uR0ZUYWxsb3dzVmFyaWFuY2Vjb21wdXRlQ2F0Y2hQYXJhbWV0ZXJJZGVudGlmaWVyQ29udGV4dENsYXNzT3JNaXhpbk9yRXh0ZW5zaW9uSWRlbnRpZmllckNvbnRleHRDb21iaW5hdG9ySWRlbnRpZmllckNvbnRleHRDb25zdHJ1Y3RvclJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0Y29udGludWF0aW9uQWZ0ZXJUeXBlQXJndW1lbnRzRG90dGVkTmFtZUlkZW50aWZpZXJDb250ZXh0RW51bURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRFbnVtVmFsdWVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0RXhwcmVzc2lvbklkZW50aWZpZXJDb250ZXh0RmllbGREZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0RmllbGRJbml0aWFsaXplcklkZW50aWZpZXJDb250ZXh0Rm9ybWFsUGFyYW1ldGVyRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dEltcG9ydFByZWZpeElkZW50aWZpZXJDb250ZXh0TGl0ZXJhbFN5bWJvbElkZW50aWZpZXJDb250ZXh0TG9jYWxGdW5jdGlvbkRlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRMYWJlbERlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRMYWJlbFJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0TGlicmFyeUlkZW50aWZpZXJDb250ZXh0TG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uSWRlbnRpZmllckNvbnRleHRNZXRhZGF0YVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0TWV0aG9kRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dE5hbWVkQXJndW1lbnRSZWZlcmVuY2VJZGVudGlmaWVyQ29udGV4dFRvcExldmVsRGVjbGFyYXRpb25JZGVudGlmaWVyQ29udGV4dGZvbGxvd2luZ1ZhbHVlc1R5cGVkZWZEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0VHlwZVJlZmVyZW5jZUlkZW50aWZpZXJDb250ZXh0cHJlZml4ZWRUeXBlVmFyaWFibGVEZWNsYXJhdGlvbklkZW50aWZpZXJDb250ZXh0Y2hlY2tBc3luY0F3YWl0WWllbGRBc0lkZW50aWZpZXJsb29rc0xpa2VTdGFydE9mTmV4dENsYXNzTWVtYmVybG9va3NMaWtlU3RhcnRPZk5leHRUb3BMZXZlbERlY2xhcmF0aW9uZmFzdGEuaWdub3JlZF9wYXJzZXJfZXJyb3JzRm9yQ29uZGl0aW9uaW5TdHlsZUZvclNwcmVhZEZvckluU3ByZWFkRm9yRW50cnlGb3JJbkVudHJ5Rm9yQ29tcGxldGVGb3JJbkNvbXBsZXRlSWZDb25kaXRpb25JZlNwcmVhZElmRW50cnlJZkNvbXBsZXRlSWZFbHNlRWxzZVNwcmVhZEVsc2VFbnRyeUlmRWxzZUNvbXBsZXRlU3ByZWFkT3BlcmF0b3JOZXN0ZWRuZXN0ZWRTdGVwbGFzdFN0ZXBpZkNvbmRpdGlvbnNwcmVhZE9wZXJhdG9yX2ZlX2FuYWx5emVyX3NoYXJlZC5wYXJzZXIudHlwZV9pbmZvX2ltcGxQcmVmaXhlZFR5cGVTaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50cGFyc2VUeXBlUmVzdFNpbXBsZVR5cGVXaXRoMUFyZ3VtZW50U2ltcGxlTnVsbGFibGVUeXBlU2ltcGxlVHlwZUNvbXBsZXhUeXBlSW5mb2JlZm9yZVF1ZXN0aW9uTWFya3R5cGVWYXJpYWJsZVN0YXJ0ZXJzZ2Z0SGFzUmV0dXJuVHlwZV9ub25OdWxsYWJsZXR5cGVWYXJpYWJsZUVuZEdyb3Vwc3R5cGVSZWZPclByZWZpeGVuZEdyb3VwSW5kZXhjb21wdXRlUmVzdHR5cGVWYXJpYWJsZVN0YXJ0Tm9UeXBlUGFyYW1PckFyZ1NpbXBsZVR5cGVBcmd1bWVudDFwYXJzZUVuZEdyb3Vwc2tpcEVuZEdyb3VwU2ltcGxlVHlwZUFyZ3VtZW50MUd0RXFiZWZvcmVFbmRHcm91cFNpbXBsZVR5cGVBcmd1bWVudDFHdEd0Q29tcGxleFR5cGVQYXJhbU9yQXJnSW5mb3NraXBFbmRwYXJzZVVuZXhwZWN0ZWRFbmRwYXJzZU1pc3NpbmdDb21tYXR5cGVTdGFydHNzdXBlclR5cGVJbmZvc3ZhcmlhbmNlc3Rva2VuMmlzQXJndW1lbnRzZXJyb3JSZXBvcnRlZHR5cGVGb2xsb3dzRXh0ZW5kc2ludmFsaWRUeXBlaW52YWxpZFR5cGVWYXJzaW1wbGVUeXBlc2ltcGxlTnVsbGFibGVUeXBlcHJlZml4ZWRUeXBlc2ltcGxlVHlwZVdpdGgxQXJndW1lbnRzaW1wbGVUeXBlV2l0aDFBcmd1bWVudEd0RXFzaW1wbGVUeXBlV2l0aDFBcmd1bWVudEd0R3RzaW1wbGVOdWxsYWJsZVR5cGVXaXRoMUFyZ3VtZW50c2ltcGxlVHlwZUFyZ3VtZW50MXNpbXBsZVR5cGVBcmd1bWVudDFHdEVxc2ltcGxlVHlwZUFyZ3VtZW50MUd0R3Rsb29rc0xpa2VOYW1lbG9va3NMaWtlVHlwZVBhcmFtT3JBcmdpc1ZhcmlhbmNlaXNDbG9zZXJwYXJzZUNsb3NlcmJlZm9yZUNsb3NlcnVuc3BsaXRzcGxpdENsb3NlcnBhY2thZ2U6dG9wYXoucnVudGltZS5kYXJ0Ll9rZXJuZWxfY29tcGlsZXJfZGFydF9saWJyYXJ5L2NvbXBpbGVyLmRhcnRwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0cGFja2FnZTpjcnlwdG8vY3J5cHRvLmRhcnRwYWNrYWdlOnZtL2tlcm5lbF9mcm9udF9lbmQuZGFydHBhY2thZ2U6YXJncy9zcmMvYXJnX3BhcnNlci5kYXJ0cGFja2FnZTphcmdzL3NyYy9hcmdfcGFyc2VyX2V4Y2VwdGlvbi5kYXJ0cGFja2FnZTphcmdzL3NyYy9hcmdfcmVzdWx0cy5kYXJ0cGFja2FnZTphcmdzL3NyYy9vcHRpb24uZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9kaWdlc3QuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9oYXNoLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvaG1hYy5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL21kNS5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL3NoYTEuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9zaGEyNTYuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9zaGE1MTIuZGFydHBhY2thZ2U6YnVpbGRfaW50ZWdyYXRpb24vZmlsZV9zeXN0ZW0vbXVsdGlfcm9vdC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS92bS5kYXJ0cGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnRwYWNrYWdlOmtlcm5lbC9hc3QuZGFydHBhY2thZ2U6a2VybmVsL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnRwYWNrYWdlOmtlcm5lbC9iaW5hcnkvbGltaXRlZF9hc3RfdG9fYmluYXJ5LmRhcnRwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnRwYWNrYWdlOmtlcm5lbC90YXJnZXQvdGFyZ2V0cy5kYXJ0cGFja2FnZTp2bS9ieXRlY29kZS9ieXRlY29kZV9zZXJpYWxpemF0aW9uLmRhcnRwYWNrYWdlOnZtL2J5dGVjb2RlL2dlbl9ieXRlY29kZS5kYXJ0cGFja2FnZTp2bS9ieXRlY29kZS9vcHRpb25zLmRhcnRwYWNrYWdlOnZtL2h0dHBfZmlsZXN5c3RlbS5kYXJ0cGFja2FnZTp2bS90YXJnZXQvaW5zdGFsbC5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvZGV2aXJ0dWFsaXphdGlvbi5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvbWl4aW5fZGVkdXBsaWNhdGlvbi5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvbm9fZHluYW1pY19pbnZvY2F0aW9uc19hbm5vdGF0b3IuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3Byb3RvYnVmX2F3YXJlX3RyZWVzaGFrZXIvdHJhbnNmb3JtZXIuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvb2JmdXNjYXRpb25fcHJvaGliaXRpb25zX2Fubm90YXRvci5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvY2FsbF9zaXRlX2Fubm90YXRvci5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvdW5yZWFjaGFibGVfY29kZV9lbGltaW5hdGlvbi5kYXJ0cGFja2FnZTphcmdzL3NyYy9hbGxvd19hbnl0aGluZ19wYXJzZXIuZGFydHBhY2thZ2U6YXJncy9zcmMvcGFyc2VyLmRhcnRwYWNrYWdlOmFyZ3Mvc3JjL3VzYWdlLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0cGFja2FnZTpjb252ZXJ0L2NvbnZlcnQuZGFydHBhY2thZ2U6Y3J5cHRvL3NyYy9kaWdlc3Rfc2luay5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL2hhc2hfc2luay5kYXJ0cGFja2FnZTpjcnlwdG8vc3JjL3V0aWxzLmRhcnRwYWNrYWdlOmNyeXB0by9zcmMvc2hhNTEyX2Zhc3RzaW5rcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV91bnN0YWJsZS9idWlsZF9pbnRlZ3JhdGlvbi5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9kaWFnbm9zdGljX21lc3NhZ2UuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvbWVzc2FnZXMvc2V2ZXJpdHkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2NvbXBpbGVyX29wdGlvbnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFncy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvZmlsZV9zeXN0ZW0uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9hcGlfcHJvdG90eXBlL2Zyb250X2VuZC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvaW5jcmVtZW50YWxfa2VybmVsX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUva2VybmVsX2dlbmVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvYXBpX3Byb3RvdHlwZS9zdGFuZGFyZF9maWxlX3N5c3RlbS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvdGVybWluYWxfY29sb3Jfc3VwcG9ydC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvcHJvY2Vzc2VkX29wdGlvbnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9jb21wdXRlX3BsYXRmb3JtX2JpbmFyaWVzX2xvY2F0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tcGlsZXJfY29udGV4dC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2Zhc3RhX2NvZGVzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaHlicmlkX2ZpbGVfc3lzdGVtLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3JlZGlyZWN0aW5nX2ZhY3RvcnlfYm9keS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC91dGlscy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Jlc29sdmVfaW5wdXRfdXJpLmRhcnRwYWNrYWdlOmtlcm5lbC9zcmMvbm5iZF90b3BfbWVyZ2UuZGFydHBhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0cGFja2FnZTprZXJuZWwvc3JjL2Z1dHVyZV9vci5kYXJ0cGFja2FnZTprZXJuZWwvc3JjL2hlYXAuZGFydHBhY2thZ2U6a2VybmVsL3NyYy9sZWdhY3lfZXJhc3VyZS5kYXJ0cGFja2FnZTprZXJuZWwvc3JjL25vcm0uZGFydHBhY2thZ2U6a2VybmVsL3Zpc2l0b3IuZGFydHBhY2thZ2U6a2VybmVsL2Nhbm9uaWNhbF9uYW1lLmRhcnRwYWNrYWdlOmtlcm5lbC90cmFuc2Zvcm1hdGlvbnMvZmxhZ3MuZGFydHBhY2thZ2U6a2VybmVsL3RleHQvYXN0X3RvX3RleHQuZGFydHBhY2thZ2U6a2VybmVsL3R5cGVfZW52aXJvbm1lbnQuZGFydHBhY2thZ2U6a2VybmVsL3NyYy9hc3N1bXB0aW9ucy5kYXJ0cGFja2FnZTprZXJuZWwvYmluYXJ5L3RhZy5kYXJ0cGFja2FnZTprZXJuZWwvbGlicmFyeV9pbmRleC5kYXJ0cGFja2FnZTprZXJuZWwvcmVmZXJlbmNlX2Zyb21faW5kZXguZGFydHBhY2thZ2U6a2VybmVsL3RhcmdldC9jaGFuZ2VkX3N0cnVjdHVyZV9ub3RpZmllci5kYXJ0cGFja2FnZTprZXJuZWwvZXh0ZXJuYWxfbmFtZS5kYXJ0cGFja2FnZTp2bS9ieXRlY29kZS9hc3NlbWJsZXIuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvY29uc3RhbnRfcG9vbC5kYXJ0cGFja2FnZTp2bS9ieXRlY29kZS9kYmMuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvZGVjbGFyYXRpb25zLmRhcnRwYWNrYWdlOnZtL2J5dGVjb2RlL2V4Y2VwdGlvbnMuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvZ2VuZXJpY3MuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvbG9jYWxfdmFyaWFibGVfdGFibGUuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvbG9jYWxfdmFycy5kYXJ0cGFja2FnZTp2bS9ieXRlY29kZS9udWxsYWJpbGl0eV9kZXRlY3Rvci5kYXJ0cGFja2FnZTp2bS9ieXRlY29kZS9vYmplY3RfdGFibGUuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvcmVjb2duaXplZF9tZXRob2RzLmRhcnRwYWNrYWdlOnZtL2J5dGVjb2RlL3JlY3Vyc2l2ZV90eXBlc192YWxpZGF0b3IuZGFydHBhY2thZ2U6dm0vYnl0ZWNvZGUvc291cmNlX3Bvc2l0aW9ucy5kYXJ0cGFja2FnZTp2bS9tZXRhZGF0YS9ieXRlY29kZS5kYXJ0cGFja2FnZTp2bS9tZXRhZGF0YS9kaXJlY3RfY2FsbC5kYXJ0cGFja2FnZTp2bS9tZXRhZGF0YS9pbmZlcnJlZF90eXBlLmRhcnRwYWNrYWdlOnZtL21ldGFkYXRhL29iZnVzY2F0aW9uX3Byb2hpYml0aW9ucy5kYXJ0cGFja2FnZTp2bS9tZXRhZGF0YS9wcm9jZWR1cmVfYXR0cmlidXRlcy5kYXJ0cGFja2FnZTp2bS90YXJnZXQvZGFydF9ydW5uZXIuZGFydHBhY2thZ2U6dm0vdGFyZ2V0L2ZsdXR0ZXIuZGFydHBhY2thZ2U6dm0vdGFyZ2V0L2ZsdXR0ZXJfcnVubmVyLmRhcnRwYWNrYWdlOnZtL3RhcmdldC92bS5kYXJ0cGFja2FnZTprZXJuZWwva2VybmVsLmRhcnRwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L2FuYWx5c2lzLmRhcnRwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvY2FsbHMuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9zdW1tYXJ5LmRhcnRwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdGFibGVfc2VsZWN0b3IuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90eXBlcy5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3V0aWxzLmRhcnRwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9wcmFnbWEuZGFydHBhY2thZ2U6dm0vbWV0YWRhdGEvdW5yZWFjaGFibGUuZGFydHBhY2thZ2U6dm0vbWV0YWRhdGEvY2FsbF9zaXRlX2F0dHJpYnV0ZXMuZGFydHBhY2thZ2U6YXJncy9zcmMvdXRpbHMuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvYWxnb3JpdGhtcy5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jYW5vbmljYWxpemVkX21hcC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9pdGVyYWJsZS5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jb21iaW5lZF93cmFwcGVycy9jb21iaW5lZF9saXN0LmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2NvbWJpbmVkX3dyYXBwZXJzL2NvbWJpbmVkX21hcC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9jb21wYXJhdG9ycy5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lcXVhbGl0eS5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9lcXVhbGl0eV9tYXAuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvZXF1YWxpdHlfc2V0LmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2Z1bmN0aW9ucy5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy9pdGVyYWJsZV96aXAuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcHJpb3JpdHlfcXVldWUuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvcXVldWVfbGlzdC5kYXJ0cGFja2FnZTpjb2xsZWN0aW9uL3NyYy91bmlvbl9zZXQuZGFydHBhY2thZ2U6Y29sbGVjdGlvbi9zcmMvdW5tb2RpZmlhYmxlX3dyYXBwZXJzLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3VuaW9uX3NldF9jb250cm9sbGVyLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3dyYXBwZXJzLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL2FjY3VtdWxhdG9yX3NpbmsuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvYnl0ZV9hY2N1bXVsYXRvcl9zaW5rLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL2hleC5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy9pZGVudGl0eV9jb2RlYy5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy9wZXJjZW50LmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3N0cmluZ19hY2N1bXVsYXRvcl9zaW5rLmRhcnRwYWNrYWdlOnR5cGVkX2RhdGEvdHlwZWRfZGF0YS5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9tZXNzYWdlcy9jb2Rlcy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2FwaV9wcm90b3R5cGUvc3VtbWFyeV9nZW5lcmF0b3IuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zdHJpbmdfc2Nhbm5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2luY3JlbWVudGFsX2NvbXBpbGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaW5jcmVtZW50YWxfc2VyaWFsaXplci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2tlcm5lbF9nZW5lcmF0b3JfaW1wbC5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy91dGlsL2NvbG9ycy5kYXJ0cGFja2FnZTprZXJuZWwvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0cGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlcy5kYXJ0cGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlc19maWxlLmRhcnRwYWNrYWdlOnBhY2thZ2VfY29uZmlnL3NyYy9wYWNrYWdlc19pbXBsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tbWFuZF9saW5lX3JlcG9ydGluZy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL21lc3NhZ2VzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvcHJvYmxlbXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90aWNrZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91cmlfdHJhbnNsYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvbGlicmFyaWVzX3NwZWNpZmljYXRpb24uZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci90b2tlbl9pbXBsLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdG9rZW4uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdHlwZV9sYWJlbGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0cGFja2FnZTprZXJuZWwvY2xvbmUuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvdXRpbC9yZWxhdGl2aXplLmRhcnRwYWNrYWdlOmtlcm5lbC9zcmMvbWVyZ2VfdmlzaXRvci5kYXJ0cGFja2FnZTprZXJuZWwvc3JjL3JlcGxhY2VtZW50X3Zpc2l0b3IuZGFydHBhY2thZ2U6a2VybmVsL2ltcG9ydF90YWJsZS5kYXJ0cGFja2FnZTprZXJuZWwvc3JjL2hpZXJhcmNoeV9iYXNlZF90eXBlX2Vudmlyb25tZW50LmRhcnRwYWNrYWdlOnZtL2J5dGVjb2RlL2Rpc2Fzc2VtYmxlci5kYXJ0cGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL2NvbnRpbnVhdGlvbi5kYXJ0cGFja2FnZTprZXJuZWwvdHJhbnNmb3JtYXRpb25zL3RyYWNrX3dpZGdldF9jb25zdHJ1Y3Rvcl9sb2NhdGlvbnMuZGFydHBhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9taXhpbl9mdWxsX3Jlc29sdXRpb24uZGFydHBhY2thZ2U6a2VybmVsL3ZtL2NvbnN0YW50c19uYXRpdmVfZWZmZWN0cy5kYXJ0cGFja2FnZTp2bS9tZXRhZGF0YS9iaW5hcnlfY2FjaGUuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL2xhdGVfdmFyX2luaXRfdHJhbnNmb3JtZXIuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL2xpc3RfZmFjdG9yeV9zcGVjaWFsaXplci5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvZmZpLmRhcnRwYWNrYWdlOnZtL3RyYW5zZm9ybWF0aW9ucy9mZmlfZGVmaW5pdGlvbnMuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL2ZmaV91c2Vfc2l0ZXMuZGFydHBhY2thZ2U6dm0vdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy9uYXRpdmVfY29kZS5kYXJ0cGFja2FnZTp2bS90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3N1bW1hcnlfY29sbGVjdG9yLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL3V0aWxzLmRhcnRwYWNrYWdlOmNvbGxlY3Rpb24vc3JjL2VtcHR5X3VubW9kaWZpYWJsZV9zZXQuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvaGV4L2VuY29kZXIuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvaGV4L2RlY29kZXIuZGFydHBhY2thZ2U6Y29udmVydC9zcmMvcGVyY2VudC9lbmNvZGVyLmRhcnRwYWNrYWdlOmNvbnZlcnQvc3JjL3BlcmNlbnQvZGVjb2Rlci5kYXJ0cGFja2FnZTp0eXBlZF9kYXRhL3R5cGVkX2J1ZmZlcnMuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9hYnN0cmFjdF9zY2FubmVyLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvZXJyb3JfdG9rZW4uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2xpYnJhcnlfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvbmFtZV9pdGVyYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyX2dyYXBoLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvY29tYmluYXRvci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF9jbGFzc19idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2xpYnJhcnlfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF90YXJnZXQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9leHBvcnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9pbXBvcnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zY29wZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfY2xhc3NfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3V0aWwvZXJyb3JfcmVwb3J0ZXJfZmlsZV9jb3BpZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS91dGlsL3RleHR1YWxfb3V0bGluZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9rZXJuZWxfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbnRlcm5hbF9hc3QuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX3RhcmdldC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2xpYnJhcnlfZ3JhcGguZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2NyYXNoLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9hcGkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvdmVyaWZpZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9sb2FkZXIuZGFydHBhY2thZ2U6Y2hhcmNvZGUvYXNjaWkuZGFydHBhY2thZ2U6cGFja2FnZV9jb25maWcvc3JjL3V0aWwuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdG9rZW5fY29uc3RhbnRzLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvc3RyaW5nX2Nhbm9uaWNhbGl6ZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9ibGFja2xpc3RlZF9jbGFzc2VzLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL2Zsb3dfYW5hbHlzaXMvZmxvd19hbmFseXNpcy5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvcGFyc2VyLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9xdW90ZS5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdmFsdWVfa2luZC5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvdXRpbC9saW5rLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9jb25zdHJ1Y3Rvcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9kZWNsYXJhdGlvbl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9lbnVtX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2V4dGVuc2lvbl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9maWVsZF9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9mb3JtYWxfcGFyYW1ldGVyX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Z1bmN0aW9uX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2Z1bmN0aW9uX3R5cGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvaW52YWxpZF90eXBlX2RlY2xhcmF0aW9uX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL21lbWJlcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tb2RpZmllcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9uYW1lZF90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL251bGxhYmlsaXR5X2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3ByZWZpeF9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdHlwZV9hbGlhc19idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci90eXBlX3ZhcmlhYmxlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL3VucmVzb2x2ZWRfdHlwZS5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdmFyaWFibGVfYnVpbGRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvdm9pZF90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb25zdGFudF9jb250ZXh0LmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaWRlbnRpZmllcnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9tb2RpZmllci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL25hbWVzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3Njb3BlX2xpc3RlbmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3N0YWNrX2xpc3RlbmVyX2ltcGwuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2UvdmFsdWVfa2luZHMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9wcm9tb3Rpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29sbGVjdGlvbnMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RuZXNzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2V4cHJlc3Npb25fZ2VuZXJhdG9yX2hlbHBlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9mb3Jlc3QuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvaW1wbGljaXRfdHlwZV9hcmd1bWVudC5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90eXBlX2FsZ29yaXRobXMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwva2VybmVsX2FzdF9hcGkuZGFydHBhY2thZ2U6a2VybmVsL3RyYW5zZm9ybWF0aW9ucy9hc3luYy5kYXJ0cGFja2FnZTpjb252ZXJ0L3NyYy91dGlscy5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9iYXNlL3N5bnRhY3RpY19lbnRpdHkuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9zdHJpbmdfdXRpbGl0aWVzLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIva2V5d29yZF9zdGF0ZS5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3JlY292ZXIuZGFydHBhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnRwYWNrYWdlOmtlcm5lbC90ZXh0L3RleHRfc2VyaWFsaXphdGlvbl92ZXJpZmllci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvY29tbW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX21lbWJlcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWEuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2NvbnN0cnVjdG9yX3JlZmVyZW5jZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9tZXRhZGF0YV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9uZXZlcl90eXBlX2J1aWxkZXIuZGFydHBhY2thZ2U6a2VybmVsL3V0aWwvZ3JhcGguZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2R5bmFtaWNfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2V4dGVuc2lvbl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvZGlsbC9kaWxsX2xvYWRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2RpbGwvZGlsbF90eXBlX2FsaWFzX2J1aWxkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXRfaW1wbGVtZW50YXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9jb25maWd1cmF0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2NsYXNzX2hpZXJhcmNoeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2Uvc3RhbmRhcmRfYm91bmRzLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9jbGFzc19tZW1iZXJfcGFyc2VyLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9kZWNsYXJhdGlvbl9raW5kLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdXRmOF9ieXRlc19zY2FubmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL2RpcmVjdGl2ZV9saXN0ZW5lci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC9pbXBsaWNpdF9maWVsZF90eXBlLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF92YXJpYWJsZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2xvYWRfbGlicmFyeV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcmVuY2VfZW5naW5lLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9zY2hlbWFfZW52aXJvbm1lbnQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvaW5mZXJlbmNlX3Zpc2l0b3IuZGFydHBhY2thZ2U6a2VybmVsL3ZlcmlmaWVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2tlcm5lbF9jb25zdGFudHMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvbWV0YWRhdGFfY29sbGVjdG9yLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvcmVzb2x2ZV9yZWxhdGl2ZV91cmkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9idWlsZGVyL2J1aWx0aW5fdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvYnVpbGRlci9taXhpbl9hcHBsaWNhdGlvbl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9leHRlbnNpb25fYnVpbGRlci5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvbGlzdGVuZXIuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3BhcnNlcl9pbXBsLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9wYXJzZXJfZXJyb3IuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2Fzc2VydC5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvYmxvY2tfa2luZC5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvZm9ybWFsX3BhcmFtZXRlcl9raW5kLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9pZGVudGlmaWVyX2NvbnRleHQuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL21lbWJlcl9raW5kLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci90b3BfbGV2ZWxfcGFyc2VyLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci91dGlsLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9zdGFja19saXN0ZW5lci5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy91dGlsL2xpbmtfaW1wbGVtZW50YXRpb24uZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvbGF0ZV9sb3dlcmluZy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2J1aWxkZXIvZml4ZWRfdHlwZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvb3BlcmF0b3IuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9kZW1vdGlvbi5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvaW5mZXJlbmNlX2hlbHBlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfc2NoZW1hX2VsaW1pbmF0aW9uLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvaW50ZXJuZXIuZGFydHBhY2thZ2U6a2VybmVsL3RleHQvc2VyaWFsaXplcl9jb21iaW5hdG9ycy5kYXJ0cGFja2FnZTprZXJuZWwvdGV4dC90ZXh0X3JlYWRlci5kYXJ0cGFja2FnZTprZXJuZWwvdGV4dC90ZXh0X3NlcmlhbGl6ZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9kaWxsL2RpbGxfZXh0ZW5zaW9uX21lbWJlcl9idWlsZGVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3R5cGVfYnVpbGRlcl9jb21wdXRlci5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL3Jld3JpdGVfc2V2ZXJpdHkuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90YXJnZXQuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy90ZXN0aW5nL2lkX3Rlc3RpbmdfdXRpbHMuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZm9yd2FyZGluZ19ub2RlLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9lcnJvcl9kZWxlZ2F0aW9uX2xpc3RlbmVyLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL3RyYW5zZm9ybV9jb2xsZWN0aW9ucy5kYXJ0cGFja2FnZTpmcm9udF9lbmQvc3JjL2Zhc3RhL2tlcm5lbC90cmFuc2Zvcm1fc2V0X2xpdGVyYWxzLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvc291cmNlL2RpZXRfbGlzdGVuZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9zb3VyY2UvZGlldF9wYXJzZXIuZGFydHBhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29uc3RhbnRfaW50X2ZvbGRlci5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvYXN5bmNfbW9kaWZpZXIuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2RpcmVjdGl2ZV9jb250ZXh0LmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9mb3J3YXJkaW5nX2xpc3RlbmVyLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm8uZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2xvb3Bfc3RhdGUuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL21vZGlmaWVyX2NvbnRleHQuZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL3JlY292ZXJ5X2xpc3RlbmVycy5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdG9rZW5fc3RyZWFtX3Jld3JpdGVyLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci90eXBlX2luZm8uZGFydHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvcGFyc2VyL2lkZW50aWZpZXJfY29udGV4dF9pbXBsLmRhcnRwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEvaWdub3JlZF9wYXJzZXJfZXJyb3JzLmRhcnRwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3BhcnNlci9saXRlcmFsX2VudHJ5X2luZm9faW1wbC5kYXJ0cGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9wYXJzZXIvdHlwZV9pbmZvX2ltcGwuZGFydEV4Y2VwdGlvblVyaV9VcmlMaW5rZWRIYXNoU2V0QXJndW1lbnRFcnJvckRlcHJlY2F0ZWRGb3JtYXRFeGNlcHRpb25SZWdFeHBfT3ZlcnJpZGVDb2RlY0NvbnZlcnRlckJ5dGVDb252ZXJzaW9uU2lua0NodW5rZWRDb252ZXJzaW9uU2lua1NpbmtTdGF0ZUVycm9yX0J5dGVBZGFwdGVyU2lua19saXR0bGVFbmRpYW5mcm9tTGlzdFR5cGVkRGF0YUJ5dGVCdWZmZXJMaW5rZWRIYXNoTWFwU3RyaW5nQnVmZmVyQ29tcGFyYWJsZWZpbGxlZFJhbmdlRXJyb3JjaGVja1ZhbHVlSW5JbnRlcnZhbFV0ZjhDb2RlY19hbGxvd01hbGZvcm1lZFV0ZjhFbmNvZGVyVGltZWxpbmV0aW1lU3luY19rdlBhaXJzVW5zdXBwb3J0ZWRFcnJvckZsb2F0NjRMaXN0Y2hlY2tWYWxpZEluZGV4Y2hlY2tWYWxpZFJhbmdlaWRlbnRpdHlmcm9tQ2hhckNvZGVzZnJvbUl0ZXJhYmxlc2RhcnQ6X2h0dHBIdHRwQ2xpZW50UmVzcG9uc2VEdXJhdGlvbl9kdXJhdGlvblN0b3B3YXRjaFJlZ0V4cE1hdGNoTWF0Y2hfTGlzdEJhc2UmT2JqZWN0Jkxpc3RNaXhpblVpbnQ2NExpc3Rpc0RpcmVjdG9yeWZyb21VcmlPU0Vycm9yVXJpRGF0YVN0ZG91dHJ1blN5bmN0cnlQYXJzZXdhaXRTdHJpbmdTaW5rSnNvbkNvZGVjX3Jldml2ZXJfdG9FbmNvZGFibGVVbmltcGxlbWVudGVkRXJyb3JpZGVudGl0eUhhc2hDb2RlRWZmaWNpZW50TGVuZ3RoSXRlcmFibGVmcm9tRW50cmllc0xpbmtlZExpc3RFbnRyeUxpbmtlZExpc3RSYW5kb21JbmRleEVycm9yVW5tb2RpZmlhYmxlTWFwQmFzZUhhc2hNYXBIYXNoU2V0Q29tcGFyYXRvclNwbGF5VHJlZVNldExpc3RJdGVyYXRvckZvbGxvd2VkQnlJdGVyYWJsZWZpcnN0RWZmaWNpZW50Q29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9ySXRlcmFibGVFbGVtZW50RXJyb3Jub0VsZW1lbnR0b29NYW55V2hlcmVJdGVyYWJsZVdoZXJlVHlwZUl0ZXJhYmxlTWFwcGVkTGlzdEl0ZXJhYmxlRXhwYW5kSXRlcmFibGVTdWJMaXN0SXRlcmFibGVTa2lwV2hpbGVJdGVyYWJsZVRha2VXaGlsZUl0ZXJhYmxlY2FzdEZyb21Tb3J0TGlzdE1hcFZpZXdjaGVja05vdE5lZ2F0aXZldG9vRmV3Y2hlY2tOb3ROdWxsUmV2ZXJzZWRMaXN0SXRlcmFibGVpdGVyYWJsZVRvRnVsbFN0cmluZ1NldEJhc2VCeXRlQ29udmVyc2lvblNpbmtCYXNlU3RyaW5nQ29udmVyc2lvblNpbmtCYXNld2l0aEluZGVudGVuY29kZVF1ZXJ5Q29tcG9uZW50VXRmOERlY29kZXJEYXRlVGltZUVtcHR5SXRlcmFibGVzcGxpdFF1ZXJ5U3RyaW5nZGlyZWN0b3J5RXhwYW5kb2Zyb21JdGVyYWJsZVN0cmluZ0NvbnZlcnNpb25TaW5rcmFuZ2VJbnQ4TGlzdFVpbnQ4Q2xhbXBlZExpc3RJbnQxNkxpc3RJbnQzMkxpc3RJbnQ2NExpc3RGbG9hdDMyTGlzdEludDMyeDRJbnQzMng0TGlzdEZsb2F0MzJ4NEZsb2F0MzJ4NExpc3R6ZXJvc3lzdGVtVGVtcEJpZ0ludF9TdGRTaW5rSW50ZXJuZXRBZGRyZXNzSHR0cENvbm5lY3Rpb25JbmZvSHR0cEhlYWRlcnNMaXN0UXVldWVlbmNvZGVDb21wb25lbnRmcm9tQ2hhckNvZGVSdW5lSXRlcmF0b3JSdW5lc5fHApMAApQEgJgIk4sAApONA5OPBQrAAGwnAjeA/gEAAQEEgZAIgJoAAYCiIASBkQjAAGyiAAHAAGykKwSB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iVVgA8AAbFtgA7LPBbLGlTqyx4UZssiVC7LJArLKCASRVgqVfwiy5wFhAwNgA4pQYAOJVWADwABsW2ADss8DsumVc7LqArLrlXYEkVgIssQBYQMDYAOKUGADiVVgA8AAbFtgA7LPBbLGlZ6yx4UZssiVebLJArLKCASRWgqVgAiy5wFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyzwOy6ZXNsuoCsuuV0ASRXASRXQdgA8AAbBgBlf0IssQBYQMDYAPAAGwYYAOKUGADwABsW2ADss8FssaV+rLHhRmyyJXTssmWALLKCASRXwqVgQiy5wFhAwNgA8AAbBhgA4pQYAPAAGxbYAOyzwOy6ZY5suoCsuuWPASRYQSRYgdgA8AAbBgBlmkIssQBYQMDYAPAAGwYYAOKUGADwABsW2ADss8FssaWZrLHhRmyyJY/ssmWbLLKCASRZAqVggiy5wFhAwJgA4pQYAPAAGxbYAOyzwOy6ZalsuoCsuuWqASRZgSRZwdgA8AAbBgBls8IssQBYQMCYAOKUGADwABsW2ADss8FssaWzLLHhRmyyJarssmW0rLKCASRaQqVgwiy5wFhAwJgA4pQYAPAAGxbYAOyzwOy6ZcFsuoCsuuXCASRawiyxAFhAwJgA4pQYAPAAGxbYAOyzwWyxpcssseFGbLIlwuyyZZsssoIBJFtCpWECLLnAWEDBGADilBgA4lVYAOJVWADwABsW2ADss8DsumXWLLqArLrl1sEkW8IssQBYQMEYAOKUGADiVVgA4lVYAPAAGxbYAOyzwWyxpeHsseFGbLIl16yyQKyyggEkXEKlYUIsucBYQMCYAOKUGADwABsW2ADss8DsumXurLqArLrl70EkXMEkXQHYAPAAGwYAZfkCLLEAWEDAmADilBgA8AAbFtgA7LPBbLGl+Gyx4UZssiXwLLJl+eyyggEkXYEkXcKlYYIsucBYQMDYAOJVWADwABsGGADwABsW2ADss8DsumYGrLqmB2y65ggBJF5BJF6B2ADwABsGAGYTgiyxAFhAwNgA4lVYAPAAGwYYAPAAGxbYAOyzwWyxphLsseFGbLImCOyyZhRssoIBJF7CpWHCLLnAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwOy6ZiKsuoCsuuYjQSRfQiyxAFhAwNgA4lVYAOJVWADwABsW2ADss8FssaYtbLHhRmyyJiQsskCssoIBJF+CpWICLLnAWEDAmADiVVgA8AAbFtgA7LPA7LpmOSy6gKy65jnBJGACLLEAWEDAmADiVVgA8AAbFtgA7LPBbLGmQuyx4UZssiY6rLJArLKCASRgQqViQiy5wFhAwJgA4lVYAPAAGxbYAOyzwOy6Zk2suoCsuuZOQSRgwiyxAFhAwJgA4lVYAPAAGxbYAOyzwWyxpldsseFGbLImTyyyQKyyggEkYQKlYoIsucBYQMCYAOJVWADwABsW2ADss8DsumZiLLqArLrmYsEkYYIssQBYQMCYAOJVWADwABsW2ADss8FssaZr7LHhRmyyJmOsskCssoIBJGHCpWLCLLnAWEDBGADiVVgA4lVYAOJVWADwABsW2ADss8DsumZ2rLqArLrmd0EkYkIssQBYQMEYAOJVWADiVVgA4lVYAPAAGxbYAOyzwWyxpoJsseFGbLImeCyyQKyyggEkYsKlYwIsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8DsumaPLLqArLrmj8EkY0IssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8FssaaabLHhRmyyJpCsskCssoIBJGPCpWNCLLnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPA7Lpmpqy6gKy65qdBJGRCLLEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPBbLGmseyx4UZssiaoLLJArLKjkgEkZMKlY4IsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8Dsuma+bLqArLrmvwEkZUIssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8FssabJrLHhRmyyJr/sskCssoIBJGXCpWPCLLnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPA7Lpm1ey6gKy65taBJGZCLLEAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPBbLGm4Syx4UZssibXbLJArLKjkgEkZsEkZwKlZAIsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPA7Lpm7ay6pu5suubvASRngSRnwdgA8AAbBgBm+gIssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPBbLGm+Wyx4UZssibv7LJm+uyyggEkaEKlZEIsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPA7LpnCKy6gKy65wlBJGjBJGkB2ADwABsGAGcUAiyxAFhAwNgA4lVYAOJVWADwABsW2ADss8FssacTbLHhRmyyJwossmcU7LKCASRpgSRpwqVkgiy5wFhAwJgA4lVYAPAAGxbYAOyzwOy6ZyKsuqcjbLrnJAEkakEkaoHYAPAAGwYAZy4CLLEAWEDAmADiVVgA8AAbFtgA7LPBbLGnLWyx4UZssick7LJnLuyyggEkawIssQBYQMCYAOJVWADwABsW2ADss8Fssac7rLHhRmyyIwnsskCssoIBJGuBJGvCpWUCLLnAWEDAmADiVVgA8AAbFtgA7LPA7LpnRmy6p0csuudHwSRsQSRsgdgA8AAbBgBnUcIssQBYQMCYAOJVWADwABsW2ADss8FssadRLLHhRmyyJ0issmdSrLKCASRtAqVlQiy5wFhAwNgA4lVYAOJVWADwABsW2ADss8DsumdfbLqArLrnYAEkbYEkbcHYAPAAGwYAZ2rCLLEAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwWyxp2osseFGbLInYOyyZ2ussoIBJG5BJG6CpWWCLLnAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyzwOy6Z3lsuqd6LLrnesEkbwEkb0HYAPAAGwYAZ4jCLLEAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyzwWyxp4gsseFGbLIne6yyZ4mssoIBJG/CpWXCLLnAWEDBWADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGxbYAOyzwOy6Z5psuqd6LLrnmwEkcEIssQBYQMFYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbFtgA7LPBbLGnqGyx4UZssieb7LJniayyggEkcMKlZgIsucBYQMHYAOJVWADiVVgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbFtgA7LPA7Lpnt2y6p3osuue4ASRxQiyxAFhAwdgA4lVYAOJVWADwABsGGADwABsGGADwABsGGADwABsGGADwABsW2ADss8FssafIbLHhRmyyJ7jssmeJrLKCASRxwSRyAqVmQiy5wFhAwdgA4lVYAOJVWADwABsGGADwABsGGADwABsGGADwABsGGADwABsW2ADss8DsumfabLqn2yy659vBJHKCLLEAWEDB2ADiVVgA4lVYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGwYYAPAAGxb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rZeyya3CssoIBJJuCpW8CLLnAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwOy6a35suoCsuut/ASScASScQdgA8AAbBgBricIssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPBbLGriSyx4UZssit/7LJriqyyggEknMKlb0IsucBYQMDYAOJVWADiVVgA8AAbFtgA7LPA7LprmGy6gKy665kBJJ1BJJ2B2ADwABsGAGujwiyxAFhAwNgA4lVYAOJVWADwABsW2ADss8FssaujLLHhRmyyK5nssmukrLKCASSeAqVvgiy5wFhAwJgA4lVYAPAAGxbYAOyzwOy6a7JsuoCsuuuzASSegiyxAFhAwJgA4lVYAPAAGxbYAOyzwWyxq7wsseFGbLIrs+yyQKyyggEknwKlb8IsucBYQMCYAOJVWADwABsW2ADss8DsumvG7LqArLrrx4Ekn4IssQBYQMCYAOJVWADwABsW2ADss8FssavQrLHhRmyyK8hsskCssoIBJKACpXACLLnAWEDA2ADiVVgA4lVYAPAAGxbYAOyzwOy6a9tsuoCsuuvcASSggSSgwdgA8AAbBgBr5sIssQBYQMDYAOJVWADiVVgA8AAbFtgA7LPBbLGr5iyx4UZssivc7LJr56yyggEkoUKlcEIsucBYQMCYAOJVWADwABsW2ADss8Dsumv1bLqArLrr9gEkocIssQBYQMCYAOJVWADwABsW2ADss8Fssav/LLHhRmyyK/bsskCssoIBJKJCpXCCLLnAWEDAmADiVVgA8AAbFtgA7LPA7LpsCey6gKy67AqBJKLCLLEAWEDAmADiVVgA8AAbFtgA7LPBbLGsE6yx4UZssiwLbLJArLKjkgEko0Eko4KlcMIsucBYQMDYAPAAGwYYAOJVWADwABsW2ADss8DsumwerLqsH2y67CABJKQBJKRB2ADwABsGAGwrgiyxAFhAwNgA8AAbBhgA4lVYAPAAGxbYAOyzwWyxrCrsseFGbLIsIOyybCxssoIBJKTBJKUCpXECLLnAWEDA2ADwABsGGADiVVgA8AAbFtgA7LPA7LpsOqy6rDtsuuw8ASSlgSSlwdgA8AAbBgBsR4IssQBYQMDYAPAAGwYYAOJVWADwABsW2ADss8FssaxG7LHhRmyyLDzssmxIbLKCASSmQSSmgqVxQiy5wFhAwNgA8AAbBhgA4lV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BJb2CJ5kAAKeZrh4nmi4fAI3gL4ElvcInmQAAp5muIyeaLiQAjeAwASW+AieZAACnma4oJ5ouKQCN4DCBJb5CJ5kAAKeZri0nmi4uAI3gMQElvoInmQAAp5muMieaLjMB2ADn3cDs560W7NTCJ+IAAKfirPZn4u43ASW+wieZAACnmaMYJ5ouPUCN4DJBJb8CJ5kAAKeZrkFnmi5CQI3gMoElv0InmQAAp5muRmeaLkdAjeAzASW/gieZAACnma5LZ5ouTECN4DOBJb/CJ5kAAKeZrlBnmi5RQI3gNQElwAInmQAAp5muVWeaLlZAjeA1gSXAQieZAACnma5aZ5ouW0ElwIIn2QAAp9mgqGfaLl9BJcDCJ93AAKfeYKhn3u5jQdgA593A7mQtlazUwifiAACn4q5gJ+LuZ0CN4DVBJcECJ5kAAKeZrm2nmi5ugI3gNgElwUInmQAAp5mucqeaLnOAjeA2gSXBgieZAACnma53p5oueICN4CwBJcHCJ5kAAKeZrnynmi59gI3gLIElwgInmQAAp5mugaeaLoKBJcJCJ5kAAKeZognnmi6GgI3gLoElwoInmQAAp5muiqeaLouAjeAvASXCwieZAACnma6Pp5oukIHW4C6szSza7N+s7azybPytAK0K7Q7tHS0hLO2tJS0rbS9tNm07LNrtP+1GLUrs2u1PrNrtU6z8rVes/K1brNrtX6za7WOs/K1obPytbS1GLXIs2u127Nrte6za7YBth62MrNrtka2b7aDtm+2l7Zvtqu1GLa/tRi207Nrtue1GLb6s2u3CrdDt1O1GLdntRi3e7dDt4+3Q7ejt0O3t7dDt8u3Q7fft0O387dDuAe3Q7gbt0O4LrdDuEK4a7h/uGu4k7hruKe1GLi7s2u4z7jouPi02bkMs2u5ILUYuTS1GLlIuOi5XLTZuXC5qbm9tNm50bNrie6za7nltRiKArNriiqza4o+s2uKUrNrimaza4p6s2uKjrNriqKza4q2s2uKyrNrit6za4rys2uLBrNrixqza4sus2uLQrNrufm4a7oNuGu6HbUYujG4a7pFuGuKFrNri1aza4tqs2uLfrNri5Kza4ums2uLurNri86za4vis2uL9rNrCMAAbVACYAOeZGADn4gBwABtU7pSBJcPCJ5kAAKeZgCeaLvfBJcQCJ5kAAKeZgOeaLvuBJcR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RnyeaMAARoACN4DLBJefCJ5kAAKeZsAARpSeaMAARpgCN4DNBJegCJ5kAAKeZsAARqyeaMAARrACN4DPBJehCJ5kAAKeZsAARsSeaMAARsgCN4DQBJeiCJ5kAAKeZsAARtyeaMAARuACN4DRBJejCJ5kAAKeZsAARvSeaMAARvgCN4DSBJekCJ5kAAKeZsAARwyeaMAARxACN4DTBJelCJ5kAAKeZsAARySeaMAARygCN4DXBJemCJ5kAAKeZsAARzyeaMAAR0ACN4DbBJenCJ5kAAKeZsAAR1SeaMAAR1gHYAOeZID2u+K78bwAvBC8ILwwvEC8ULxgvHC8gLyQvKC8sLzAvNC84LzwvQC9EL0gvTC9QL1QvWC9cL2AvZC9oL2wvcC90L3gvfC+AL4QviC+ML5AvlC+YL5wvoC+kL6gvrC+wL7QvuC+8L8AvxC/IL8wv0C/UL9gv3C/gL+Qv6O/s7/Dv9O/47/zwABAA8AAQBXAAEAnwABAOcAAQEvAAEBdwABAb8AAQIHAAECTwABApcAAQLfAAEDJwABA28AAQO3AAED/wABBEbcKwABBJrb6szSzfsAAQTqzycAAQUy0AsAAQV60O8AAQXC0hMAAQYK0lMAAQZS0vbTsuC7AAEGptP/AAEHAtSu1ProdwABB17VOwABB67VewABB/bVutX61jsAAQg/AAEIhwABCM7WhwABCSLW0wABCX8AAQnbAAEKNtdu17rYBwABCocAAQrPAAELJwABC4cAAQvm1yLYytkbAAEMRwABDJcAAQzvAAENTwABDa8AAQ4PAAEObtoPAAEOzt1PAAEPLtpfAAEPjtqvAAEP7tr/AAEQTttPAAEQrtufAAERDt2fAAERbt3vAAERzt4/AAESLt6PAAESjt7fAAES7t8vAAETTt9/AAETrt/PAAEUDuAfAAEUbuBvAAEUzufnAAEVLug3AAEVjuELAAEV7wABFk8AARau4f8AARcO6McAARdu6RcAARfO4k8AARgu4p8AARiO4u8AARju4z8AARlPAAEZrwABGg7j4uQy5IMAARpu5NMAARrO5SMAARsvAAEbjwABG+8AARxPAAEcruVy5vblwwABHQ7nRie655cAAR1uKAooqij6KUopminqKjoqiiraKyoreivKLBosaiy6LQooWi1aLaot+i5KLpou6i86L4ov2BJerCJ0BAAKdAwCdBcAASg0El6wInQEAAp0DA50FwABKHgSXrQidAQACnQOFBJ0FwABKLwSXrgidAQACnQOE4J0FwABKQQSXrwidAQACnQOA1p0FwABKUwSXsAidAQACnQOCjJ0FwABKZQSXsQidAQACnQOCoZ0FwABKdwSXsgidAQACnQOCgJ0FwABKiQSXswidAQACnQOFnp0FwABKmwSXtAidAQACnQOCj50FwABKrQSXtQidAQACnQOCpJ0FwABKvwSXtgidAQACnQOCmJ0FwABK0QSXtwidAQACnQOCg50FwABK4wSXuAidAQACnQOHVJ0FwABK9QSXuQidAQACnQOCkp0FwABLBwSXugidAQACnQOCp50FwABLGQSXuwidAQACnQOCm50FwABLKwSXvAidAQACnQOChp0FwABLPQSXvQidAQACnQOHnJ0FwABLTwSXvgidAQACnQOHg50FwABLYQSXvwidAQACnQOClZ0FwABLcwSXwAidAQACnQOCqp0FwABLhQSXwQidAQACnQOCiZ0FwABLlwSXwgidAQACnQOCnp0FwABLqQSXwwidAQACnQOHip0FwABLuwSXxAidAQACnQOHjZ0FwABLzQSXxQidAQACnQOHkJ0FwABL3wSXxgidAQACnQOHk50FwABL8QSXxwidAQACnQOHlp0FwABMAwSXyAidAQACnQOHmZ0FwABMFQSXyQidAQACnQOHn50FwABMJwSXygidAQACnQOHop0FwABMOQSXywidAQACnQOFoZ0FwABMSwdgA50BIcAAShDAAEohwABKMsAASkTAAEpWwABKaMAASnrAAEqMwABKnsAASrDAAErCwABK1MAASubAAEr4wABLCsAASxzAAEsuwABLQMAAS1LAAEtkwABLdsAAS4jAAEuawABLrMAAS77AAEvQwABL4sAAS/TAAEwGwABMGMAATCrAAEw8wABMTgdgA503A4moiYmJmAidtAAAAjmYJQieGAAAB2ADn2QJs0S0zbOOthG3GrPZuYC4UrQSB2ADn3cHs1OznrRbtEu2VrcquZAHYAOfjgKMBowVAjmZOASZRQjAAG1QAmADwABsH2ADwABsGAHAAG1Th2YHYAOj6QACOZn2BJpkCKErAAKhLQChL8AATWEEmmUIoSsAAqEtA6EvwABNcgSaZgihKwACoS2FBKEvwABNgwSaZwihKwACoS2E4KEvwABNlQdgA6ErBMAATWTAAE11wABNhsAATZgEGAQZBBUEHQQeBJrYBBMEmtkEmxAIoq4AAqKwAKKywABNzwSbEQiirgACorADorLAAE3gBJsSCKKuAAKisIUEorLAAE3xBJsTCKKuAAKisITgorLAAE4DBJsUCKKuAAKisIDWorLAAE4VBJsVCKKuAAKisIKMorLAAE4nBJsWCKKuAAKisIKhorLAAE45BJsXCKKuAAKisIKAorLAAE5LBJsYCKKuAAKisIWeorLAAE5dBJsZCKKuAAKisIKPorLAAE5vBJsaCKKuAAKisIKkorLAAE6BBJsbCKKuAAKisIKYorLAAE6TBJscCKKuAAKisIKDorLAAE6lBJsdCKKuAAKisIdUorLAAE63BJseCKKuAAKisIKSorLAAE7JBJsfCKKuAAKisIKnorLAAE7bB2ADoq4QwABN0sAATePAAE30wABOBsAAThjAAE4qwABOPMAATk7AAE5gwABOcsAAToTAAE6WwABOqMAATrrAAE7MwABO3gSbKQiiyAACosoAoszAAE8zBJsqCKLIAAKiygOizMAAT0QEmysIosgAAqLKhQSizMAAT1UEmywIosgAAqLKhOCizMAAT2cEmy0IosgAAqLKgNaizMAAT3kEmy4IosgAAqLKgoyizMAAT4sEmy8IosgAAqLKgqGizMAAT50EmzAIosgAAqLKgoCizMAAT68EmzEIosgAAqLKhZ6izMAAT8EEmzIIosgAAqLKgo+izMAAT9MHYAOiyArAAE82wABPR8AAT1jAAE9qwABPfMAAT47AAE+gwABPssAAT8TAAE/WBJs9CKLcAAKi3gCi4MAAUBMEmz4IotwAAqLeA6LgwABQJASbPwii3AACot6FBKLgwABQNQSbQAii3AACot6E4KLgwABQRwSbQQii3AACot6A1qLgwABQWQSbQgii3AACot6CjKLgwABQawSbQwii3AACot6CoaLgwABQfQSbRAii3AACot6CgKLgwABQjwSbRQii3AACot6FnqLgwABQoQSbRgii3AACot6Cj6LgwABQswdgA6LcCsAAUBbAAFAnwABQOMAAUErAAFBcwABQbsAAUIDAAFCSwABQpMAAULYCN4fgAjeGAAI3geAHYAOkFwAHWx6yLYoqsjCKPrIyilKyOopmsjWKerIkio6yHoqisiGKtrIqisqyJ4resg2K8rISiwayGIsashWLLrIbi0IIwABtUAJgA8AAbBhgA55kAcAAbVPAAFEFB1sSsi2LVrIwi2qyMot+sjiLkrINi6ayEou6shiLzrIVi+KyG4v2CMAAbVACYAPAAGwYYAOeZAHAAG1TwABRXQilGgAAApEEiH0EnCwEnC0EnC4Ei8EEiHsEnC8EnDAEiUYEnDEEnDIEnDMEnDQEnDUEnDYEnDcEnDgHYAPAAGwYEcAAUaTAAFGnwABRqsAAUa3AAFGwwABRs8AAUbbAAFG5wABRvMAAUb/AAFHCwABRxcAAUcjAAFHLwABRzsAAUdHAAFHUBJw7B2ADwABsGA/AAFGkwABRp8AAUarAAFGtwABRsMAAUbPAAFG2wABRucAAUbzAAFG/wABRwsAAUcXAAFHIwABSI8AAUdQHYAPAAGwYEsAAUaTAAFGnwABRqsAAUa3AAFGwwABRs8AAUbbAAFG5wABRvMAAUb/AAFHCwABRxcAAUcjAAFHLwABRzsAAUdHAAFHUwABSIwScUgScUwScVAdgA8AAbBgRwABRpMAAUafAAFGqwABRrcAAUbDAAFGzwABRtsAAUbnAAFG8wABRv8AAUdTAAFK6wABSvcAAUcLAAFHFwABSwMAAUcgHYAPAAGwYA8AAUafAAFGwwABRvwI5nGoCN/////8IpjcAAAimOgAACKY9AAAIpkAAAAimLQABpi+JCAimQwAACKZGAAAIpkkAAAimTAAACKZPAAAIplIAAAimVQAACKZYAAAIplsAAAimXgAACKZhAAACN4PoBJy5CKdwAAKncgCndMAAU4UEnMYIp3AAAqdyA6d0wABTlgScyAincAACp3KFBKd0wABTpwScyQincAACp3KA1qd0wABTuQSczwincAACp3KE4Kd0wABTywI3k4gHYAOoyAAEnXIIu1kAArtbALtdwABT5wdgA6dwBcAAU4jAAFOZwABTqsAAU87AAFO8BJ3+CKjZAAKo2wCo3cAAVBIEnf8IqNkAAqjbA6jdwABUIwSeAAio2QACqNuFBKjdwABUNASeAQio2QACqNuE4KjdwABURgSeAgio2QACqNuA1qjdwABUWASeAwio2QACqNuCjKjdwABUagSeBAio2QACqNuCoajdwABUfAdgA6jZB8AAVBXAAFQm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AGwYYAOyzwWyxsAAYp+yx4UZssjAAGJ+ssnAAGJBssoIBKESCrH4CLLnAWEDAWADwABsGGADss8DsunAAGLNsuoCsuvAAGLQBKEUBKEVB2ADwABsGAHAAGL3CLLEAWEDAWADwABsGGADss8FssbAAGL0sseFGbLIwABi07LJwABi+rLKCAShFwShGAiy2wAHst3AAGMxst4CssbAAGM0sseFGbLIArLJArLKjhkEoRsEoRwEoR0IstsAB7LdwABjWbLewABjXLLGwABjX7LHh/eyyAKyyQKyyggEoSAEoSEEoSIIstsAB7LdwABjhrLewABjibLGwABjjLLHv52yyAKyyQKyyggEoSUEoSYIstsAB7LdwABjs7LeArLGwABjtrLHhRmyyAKyyQKyyo4ZBKEpBKEqCLLbAAey3cAAY9uy3gKyxsAAY96yx4UZssgCsskCssoIBKEtBKEuCLLbAAey3cAAZAKy3gKyxsAAZAWyx4UZssgCsskCssqOSAShMQShMgShMwdgA8AAbBgBwABkMAiy2wAHst3AAGQqst4CssbAAGQtsseFGbLIArLJwABkM7LKCAShNgShNwiy2wAHst3AAGRjst4CssbAAGRmsseFGbLIArLJArLKjhkEoToEoTsIstsAB7LdwABki7LeArLGwABkjrLHhRmyyAKyyQKyyggEoT4EoT8EoUAEoUEHYAPAAGwYAcAAZLsIstsAB7LdwABksrLewABktbLGwABkuLLHhRmyyAKyycAAZL6yyggEoUQEoUUEoUYHYAPAAGwYAcAAZPcIstsAB7LdwABk8bLeArLGwABk9LLHhRmyyAKyycAAZPqyyggEoUkEoUoIstsAB7LdwABlKrLeArLGwABlLbLHhRmyyAKyycAAXdeyyggEoU0EoU4IstsAB7LdwABlVLLeArLGwABlV7LHhRmyyAKyyQKyyggEoVEKsfkIsucBYQMBYAPAAGwYYAOyzwOy6cAAZXuy6sAAXwiy68AAZX4EoVMEoVQHYAPAAGwYAcAAZagIssQBYQMBYAPAAGwYYAOyzwWyxsAAZaWyx4UZssjAAGWBssnAAGWrssoIBKFWBKFXCLLbAAey3cAAZeKy3gKyxsAAZeWyx4UZssgCssnAAF7QssoIBKFaBKFbCLLbAAey3cAAZgyy3gKyxsAAZg+yx4UZssgCssmWbLLKCAShXgqx+giy5wFhAwFgA8AAbBhgA7LPA7LpwABmNLLqArLrwABmNwShYAiyxAFhAwFgA8AAbBhgA7LPBbLGwABmW7LHhRmyyMAAZjqyyZZsssoIBKFiCrH7CLLnAWEDAWADwABsGGADss8DsunAAGaHsuoCsuvAAGaKBKFkBKFlB2ADwABsGAHAAGaxCLLEAWEDAWADwABsGGADss8FssbAAGausseFGbLIwABmjbLJwABmtLLKCAShZwqx/Aiy5wFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPA7LpwABm67LqArLrwABm7gShaQiyxAFhAwNgA8AAbBhgA8AAbBhgA8AAbBhgA7LPBbLGwABnHrLHhRmyyMAAZvGyyQKyyggEoWsKsf0IsucBYQMBYAPAAGwYYAOyzwOy6cAAZ1Wy6gKy68AAZ1gEoW0EoW4HYAPAAGwYAcAAZ38IssQBYQMBYAPAAGwYYAOyzwWyxsAAZ3yyx4UZssjAAGdbssnAAGeCssoIBKFwBKFxBKFyB2ADwABsGAHAAGe/CLLbAAey3cAAZ7my3gKyxsAAZ7yyx4UZssgCssnAAGfCssoIBKF1BKF2BKF3B2ADwABsGAHAAGf4CLLbAAey3cAAZ/Ky3gKyxsAAZ/Wyx4UZssgCssnAAGf7ssoIBKF6BKF7CLLbAAey3cAAaCuy3gKyxsAAaC6yx4UZssgCssmWbLLKCAShfgShfwiy2wAHst3AAGhTst4CssbAAGhWsseFGbLIArLJArLKCAShggShgwiy2wAHst3AAGh6st4CssbAAGh9sseFGbLIArLJArLKCAShhgqx/giy5wFhAwJgA8AAbBhgA8AAbBhgA7LPA7LpwABoobLqArLrwABopAShiAShiQdgA8AAbBgBwABo0QiyxAFhAwJgA8AAbBhgA8AAbBhgA7LPBbLGwABozrLHhRmyyMAAaKeyycAAaNSyyggEoYsEoYwEoY0IstsAB7LdwABpEbLewABpFLLGwABpF7LHiB6yyAKyyQKyyggEoZAEoZEEoZIEoZMHYAPAAGwYAcAAaUcIstsAB7LdwABpPrLewABpQbLGwABpRLLHhRmyyAKyycAAaUqyyggEoZYEoZcKsf8IsucBYQMBYAPAAGwYYAOyzwOy6cAAaX2y6sAAaYCy68AAaYMEoZkEoZoHYAPAAGwYAcAAaa0IssQBYQMBYAPAAGwYYAOyzwWyxsAAaaqyx4UZssjAAGmGssnAAGmwssoIBKGcBKGdBKGeBKGfB2ADwABsGAHAAGnwCLLbAAey3cAAaeey3sAAaeqyxsAAae2yx4UZssgCssnAAGnzssoIBKGiBKGjBKGkCLLbAAey3cAAaiay3sAAaimyxsAAaiyyx4gYssgCsskCssoIBKGnBKGoBKGpBKGqB2ADwABsGAHAAGpcCLLbAAey3cAAalOy3sAAalayxsAAalmyx4UZssgCssnAAGpfssoIBKGtCrIACLLnAWEDAWADwABsGGADss8DsunAAGqSsuoCsuvAAGqVBKGvBKGwB2ADwABsGAHAAGq8CLLEAWEDAWADwABsGGADss8FssbAAGq5sseFGbLIwABqmLLJwABqv7LKCAShsgShswShtAdgA8AAbBgBwABq/Aiy2wAHst3AAGr2st4CssbAAGr5sseFGbLIArLJwABq/7LKCAShtwShuAShuQiy2wAHst3AAGsvst7AAGsyssbAAGs1sseH1rLIArLJArLKCAShvAShvQShvgShvwdgA8AAbBgBwABrZQiy2wAHst3AAGtcst7AAGtfssbAAGtisseFGbLIArLJwABraLLKCAShwgShwwShxAiy2wAHst3AAGubst7AAGuessbAAGuhsse05rLIArLJArLKCAShxwShyAShyQdgA8AAbBgBwABrzgiy2wAHst3AAGvIst4CssbAAGvLsseFGbLIArLJwABr0bLKCAShzAqyAQiy5wFhAwFgA8AAbBhgA7LPA7LpwABsAbLqArLrwABsBAShzgiyxAFhAwFgA8AAbBhgA7LPBbLGwABsKLLHhRmyyMAAbAeyyQKyyo4ZBKHQBKHRBKHSB2ADwABsGAHAAGxaCLLbAAey3cAAbFSy3gKyxsAAbFeyx4UZssgCssnAAGxdssoIBKHVBKHWBKHXCLLbAAey3cAAbI2y3sAAbJCyxsAAbJOyx4UEssgCsskCssoIBKHaCrICCLLnAWEDAWADwABsGGADss8DsunAAGy6suoCsuvAAGy9BKHcCLLEAWEDAWADwABsGGADss8FssbAAGzhsseFGbLIwABswLLJwABXkrLKCASh3gSh3wSh4Aiy2wAHst3AAG0Pst7AAG0SssbAAG0VsseFpLLIArLJ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wACCIrLKCASjJwSjKAiy2wAHst3AAIJXst4CssbAAIJasseFGbLIArLJArLKCASjKwSjLAqyLwiy5wFhAwFgA8AAbBhgA7LPA7LpwACCfrLqwACCgbLrwACChASjLgiyxAFhAwFgA8AAbBhgA7LPBbLGwACCq7LHh/SyyMAAgoeyyQKyyggEozAEozEIstsAB7LdwACC1rLeArLGwACC2bLHhRmyyAKyyQKyyggEozQEozUIstsAB7LdwACC/bLeArLGwACDALLHhRmyyAKyyQKyyggEozgEozkIstsAB7LdwACDJLLeArLGwACDJ7LHhRmyyAKyyQKyyggEozwKsjAIsucBYQMCYAPAAGwYYAPAAGwfYAOyzwOy6cAAg0uy6gKy68AAg04Eoz4IssQBYQMCYAPAAGwYYAPAAGwfYAOyzwWyxsAAg3iyx4UZssjAAINRsskCssoIBKNABKNBBKNCCLLbAAey3cAAg6my3sAAg6yyxsAAg6+yx4hIssgCsskCssoIBKNFCrIxCLLnAWEDA2ADwABsGGADwABsWGADwABsWGADss8DsunAAIPWsuoCsuvAAIPZBKNHCLLEAWEDA2ADwABsGGADwABsWGADwABsWGADss8FssbAAIQJsseFGbLIwACD3LLJArLKjigEo0kEo0oIstsAB7LdwACEQbLeArLGwACERLLHhRmyyAKyyQKyyggEo00KsjIIsucBYQMBYAPAAGwYYAOyzwOy6cAAhGiy6gKy68AAhGsEo08Eo1AHYAPAAGwYAcAAhJIIssQBYQMBYAPAAGwYYAOyzwWyxsAAhI+yx4UZssjAAIRussnAAISVssoIBKNSCrIzCLLnAWEDAWADwABsGGADss8DsunAAITMsuoCsuvAAITPBKNUBKNVB2ADwABsGAHAAIT2CLLEAWEDAWADwABsGGADss8FssbAAITzsseFGbLIwACE0rLJwACE+bLKCASjVwSjWAiy2wAHst3AAIUwst4CssbAAIUzsseFGbLIArLJArLKCASjWwSjXAiy2wAHst3AAIVXst4CssbAAIVasseFGbLIArLJArLKCASjXwSjYAiy2wAHst3AAIV+st4CssbAAIWBsseFGbLIArLJArLKCASjYwSjZASjZQiy2wAHst3AAIWlst7AAIWossbAAIWrsseIb7LIArLJArLKCASjaASjaQSjagiy2wAHst3AAIXSst7AAIXVssbAAIXYsseIY7LIArLJArLKCASjbQSjbgSjbwiy2wAHst3AAIX/st7AAIYCssbAAIYFsseIabLIArLJArLKCASjcgqyNAiy5wFhAwFgA8AAbBhgA7LPA7LpwACGLLLqArLrwACGLwSjdAiyxAFhAwFgA8AAbBhgA7LPBbLGwACGU7LHhRmyyMAAhjKyyQKyyggEo3YEo3cEo3gIstsAB7LdwACGfrLewACGgbLGwACGhLLHhOCyyAKyyQKyyggEo3sEo3wEo30IstsAB7LdwACGq7LewACGrrLGwACGsbLHiHWyyAKyyQKyyggEo4AEo4EEo4IEo4MHYAPAAGwYAcAAhuEIstsAB7LdwACG2LLewACG27LGwACG3rLHhRmyyAKyycAAhuSyyggEo4YEo4cIstsAB7LdwACHF7LewACGgbLGwACHGrLHgoyyyAKyyQKyyggEo4oEo4sEo4wIstsAB7LdwACHQbLewACHRLLGwACHR7LHsy6yyAKyyQKyyggEo48Eo5AEo5EIstsAB7LdwACHbrLewACHcbLGwACHdLLHs3iyyAKyyQKyyggEo5QEo5UEo5YIstsAB7LdwACHm7LewACHnrLGwACHobLHiAayyAKyyQKyyggEo5kEo5oIstsAB7LdwACHyLLeArLGwACHy7LHh/qyyAKyyQKyyggEo50Eo54IstsAB7LdwACH77LewACGgbLGwACH8rLHiEuyyAKyyQKyyggEo6EEo6IKsjUIsucBYQMBYAO+TWADss8DsunAAIgZsurAAIgcsuvAAIgfBKOkCLLEAWEDAWADvk1gA7LPBbLGwACIRLLHiE6yyMAAiCKyyQKyyggEo6YKsjYIsucBYQMBYAO+TWADss8DsunAAIhtsurAAIgcsuvAAIhwBKOoCLLEAWEDAWADvk1gA7LPBbLGwACIlbLHiFqyyMAAiHOyyQKyyggEo6oEo6sEo6wHYAPAAGwYAcAAiMQIstsAB7LdwACIvrLeArLGwACIwbLHhRmyyAKyycAAiMeyyggEo68Eo7AEo7EIstsAB7LdwACI97LewACI+rLGwACI/bLHiFGyyAKyyQKyyggEo7QKsjcIsucBYQMBYAPAAGwYYAOyzwOy6cAAiSSy6gKy68AAiScEo7YIssQBYQMBYAPA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PQSkLwiyxAFhAwFgA8AAbBhgA7LPBbLGwACQYbLHhRmyyMAAkECyybCxssoIBKQxBKQyBKQzBKQ0B2ADwABsGAHAAJCWCLLbAAey3cAAkI2y3sAAkJCyxsAAkJOyx4UZssgCssnAAJCZssoIBKQ3BKQ4CLLbAAey3cAAkMyy3gKyxsAAkM+yx4frssgCsskCssoIBKQ7BKQ8BKQ9B2ADwABsGAHAAJD5CLLbAAey3cAAkPOy3gKyxsAAkPayx4UZssgCssnAAJD8ssoIBKRABKRBCLLbAAey3cAAkSyy3gKyxsAAkS+yx4UZssgCsskCssoIBKREBKRFBKRGB2ADwABsGAHAAJFZCLLbAAey3cAAkVOy3gKyxsAAkVayx4UZssgCssnAAJFcssoIBKRJCrJECLLnAWEDAWADwABsGGADss8DsunAAJGMsuoCsuvAAJGPBKRLBKRMB2ADwABsGAHAAJG2CLLEAWEDAWADwABsGGADss8FssbAAJGzsseFGbLIwACRkrLJwACRubLKCASkTgqyRQiy5wFhAwFgA8AAbBhgA7LPA7LpwACR8LLqArLrwACR8wSkUASkUQdgA8AAbBgBwACSGgiyxAFhAwFgA8AAbBhgA7LPBbLGwACSF7LHhRmyyMAAkfayycAAkh2yyggEpFMKskYIsucBYQMBYAPAAGwYYAOyzwOy6cAAklSy6gKy68AAklcEpFUIssQBYQMBYAPAAGwYYAOyzwWyxsAAknuyx4UZssjAAJJasskCssqOGQSkVwSkWASkWQdgA8AAbBgBwACSrQiy2wAHst3AAJKnst4CssbAAJKqsseFGbLIArLJwACSsLLKCASkXASkXQiy2wAHst3AAJLgst4CssbAAJLjsseFGbLIArLJArLKCASkYASkYQSkYgiy2wAHst3AAJMHst7AAJMKssbAAJMNsseH6LLIArLJArLKCASkZQSkZgSkZwiy2wAHst3AAJM0st7AAJM3ssbAAJM6sseH5bLIArLJArLKCASkagSkawSkbAiy2wAHst3AAJNhst7AAJNkssbAAJNnsseH4rLIArLJArLKCASkbwSkcAiy2wAHst3AAJOOst4CssbAAJORsseFGbLIArLJArLKCASkcwSkdAiy2wAHst3AAJO1st4CssbAAJO4sseFGbLIArLJArLKCASkdwSkeAqy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B7LdwACh2LLewACh27LGwACh3rLHhRmyyAKyycAAoeSyyggEpU4KsmUIsucBYQMBYAO+TWADss8DsunAAKIXsuoCsuvAAKIaBKVQCLLEAWEDAWADvk1gA7LPBbLGwACiPLLHh1uyyMAAoh2yyQKyyggEpVIKsmYIsucBYQMCYAPAAGxYYAPAAGwYYAOyzwOy6cAAomWy6gKy68AAomgEpVQIssQBYQMCYAPAAGxYYAPAAGwYYAOyzwWyxsAAopKyx4UZssjAAKJrsskCssoIBKVWBKVXCLLbAAey3cAAosOy3gKyxsAAosayx4fxssgCsskCssoIBKVaBKVbBKVcBKVdB2ADwABsGAHAAKLzCLLbAAey3cAAouqy3sAAou2yxsAAovCyx4UZssgCssnAAKL2ssoIBKVgBKVhCLLbAAey3cAAoymy3gKyxsAAoyyyx4gkssgCsskCssoIBKVkCrJnCLLnAWEDA2ADwABsGGADwABsGGADwABsGGADss8DsunAAKNQsuoCsuvAAKNTBKVmCLLEAWEDA2ADwABsGGADwABsGGADwABsGGADss8FssbAAKODsseFGbLIwACjVrLJArLKCASlaAqyaAiy5wFhAwRgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA7LPA7LpwACjurLqArLrwACjvQSlagiyxAFhAwRgA8AAbBhgA8AAbBhgA8AAbBhgA8AAbBhgA7LPBbLGwACj87LHhRmyyMAAo8CyyQKyyggEpWwKsmkIsucBYQMDYAPAAGwYYAPAAGwYYAPAAGwYYAOyzwOy6cAApDCy6gKy68AApDMEpW4IssQBYQMDYAPAAGwYYAPAAGwYYAPAAGwYYAOyzwWyxsAApGOyx4UZssjAAKQ2sskCssoIBKVwCrJqCLLnAWEDA2ADwABsGGADwABsGGADwABsGGADss8DsunAAKSasuoCsuvAAKSdBKVyCLLEAWEDA2ADwABsGGADwABsGGADwABsGGADss8FssbAAKTNsseFGbLIwACkoLLJArLKCASldASldQiy2wAHst3AAKUEst4CssbAAKUHsseHzLLIArLJArLKCASleASleQSlegSlewdgA8AAbBgBwAClNAiy2wAHst3AAKUrst7AAKUussbAAKUxsseFGbLIArLJwAClN7LKCASlfgSlfwSlgAiy2wAHst3AAKVqst7AAKVtssbAAKVwsseFGbLIArLJwACCIrLKCASlgwqyawiy5wFhAwFgA8AAbBhgA7LPA7LpwAClmrLqArLrwAClnQSlhQSlhgdgA8AAbBgBwAClxAiyxAFhAwFgA8AAbBhgA7LPBbLGwAClwbLHhRmyyMAApaCyycAApceyyggEpYgEpYkEpYoIstsAB7LdwACl/rLewACmAbLGwACmBLLHhRmyyAKyyQKyyggEpY0EpY4KsmwIsucBYQMBYAPAAGwYYAOyzwOy6cAApiuy6sAApi6y68AApjEEpZAIssQBYQMBYAPAAGwYYAOyzwWyxsAApliyx4UZssjAAKY0ssnAAGxdssoIBKWSBKWTCLLbAAey3cAApoay3gKyxsAApomyx4UZssgCsskCssoIBKWWBKWXCLLbAAey3cAApq2y3gKyxsAAprCyx4UZssgCsskCssqOGQSlmgSlmwiy2wAHst3AAKbVst4CssbAAKbYsseFGbLIArLJArLKCASlngSlnwiy2wAHst3AAKb8st4CssbAAKb/sseFGbLIArLJArLKCASlogSlowiy2wAHst3AAKcjst4CssbAAKcmsseFGbLIArLJArLKjhkEpaYEpacIstsAB7LdwACnS7LeArLGwACnTrLHhRmyyAKyyQKyyo4ZBKWqCrJtCLLnAWEDAmADwABsH2ADwABsH2ADss8DsunAAKdzsuoCsuvAAKd2BKWsCLLEAWEDAmADwABsH2ADwABsH2ADss8FssbAAKegsseFGbLIwACnebLJArLKCASlrgSlrwSlsAiy2wAHst3AAKfRst7AAKfUssbAAKfXsseHybLIArLJArLKCASlswSltASltQdgA8AAbBgBwACoBAiy2wAHst3AAKf+st4CssbAAKgBsseFGbLIArLJwACoB7LKCASluASluQqybgiy5wFhAwFgA8AAbFhgA7LPA7LpwACoN7LqwACoOrLrwACoPQSluwiyxAFhAwFgA8AAbFhgA7LPBbLGwACoZLLHhRmyyMAAqECyyQKyyo4oBKW9BKW+BKW/B2ADwABsGAHAAKiWCLLbAAey3cAAqJCy3gKyxsAAqJOyx4UZssgCssnAAKiZssoIBKXCCrJvCLLnAWEDAmADwABsGGADwABsWGADss8DsunAAKjJsuoCsuvAAKjMBKXECLLEAWEDAmADwABsGGADwABsWGADss8FssbAAKj2sseFGbLIwACoz7LJArLKjigEpcYKsnAIsucBYQMCYAPAAGwYYAPAAGxYYAOyzwOy6cAAqSiy6gKy68AAqSsEpcgIssQBYQMCYAPAAGwYYAPAAGxYYAOyzwWyxsAAqVWyx4UZssjAAKkusskCssqOKASlygSlywSlzAdgA8AAbBgBwACpjQiy2wAHst3AAKmHst4CssbAAKmKsseFGbLIArLJwACpkLLKCASlzwSl0Aiy2wAHst3AAKnAst4CssbAAKnDsseFGbLIArLJArLKCASl0wSl1Aiy2wAHst3AAKnnst4CssbAAKnqsseIYLLIArLJArLKCASl1wqycQiy5wFhAwFgA8AAbBhgA7LPA7LpwACqDrLqArLrwACqEQSl2QiyxAFhAwFgA8AAbBhgA7LPBbLGwACqNbLHhRmyyMAAqhSyybEhssoIBKXbBKXcCLLbAAey3cAAqmGy3gKyxsAAqmSyx4UZssgCsskCssoIBKXfBKXgBKXhCLLbAAey3cAAqoiy3sAAqouyxsAAqo6yx4e0ssgCsskCssoIBKXkBKXlCLLbAAey3cAAqrWy3sAAoa6yxsAAqriyx4exssgCsskCssoIBKXoBKXpBKXqCLLbAAey3cAAqt+y3sAAquKyxsAAquWyx4elssgCsskCssoIBKXtBKXuBKXvCLLbAAey3cAAqwyy3sAAqw+yxsAAqxKyx4UZssgCssnAAF7QssoIBKXyCrJyCLLnAWEDAWADwABsH2ADss8DsunAAKs8suoCsuvAAKs/BKX0CLLEAWEDAWADwABsH2ADss8FssbAAKtjsseFGbLIwACrQrLJArLKjigEpfYEpfcEpfgEpfkHYAPAAGwYAcAAq5gIstsAB7LdwACrj7LewACrkrLGwACrlbLHhRmyyAKyycAAq5uyyggEpfwEpf0Epf4IstsAB7LdwACrzrLewACr0bLGwACr1LLHhaGyyAKyyQKyyggEpgEEpgIEpgMEpgQHYAPAAGwYAcAArAQIstsAB7LdwACr+7LewACr/rLGwACsAbLHhRmyyAKyycAArAeyyggEpgcKsnMIsucBYQMBYAPAAGwYYAOyzwOy6cAArDqy6gKy68AArD0EpgkIssQBYQMBYAPAAGwYYAOyzwWyxsAArGGyx4UZssjAAKxAsskCssqOGQSmCwSmDAqydAiy5wFhAwJgA8AAbBhdA8AAbBkBYAPAAGwYYAOyzwOy6cAArI2y6sAArJCy68AArJMEpg4Epg8HYAPAAGwYAcAArMoIssQBYQMCYAPAAGwYXQPAAGwZAWADwABsGGADss8FssbAAKzHsseFGbLIwACslrLJwACszbLKCASmEwSmFASmFQSmFgdgA8AAbBgBwACtGgiy2wAHst3AAK0Rst7AAK0UssbAAK0XsseFGbLIArLJwACtHbLKCASmGQSmGgSmGwiy2wAHst3AAK1Qst7AAK1TssbAAK1WsseHorLIArLJArLKCASmHgqydQiy5wFhAwFgA8AAbFhgA7LPA7LpwACtfbLqArLrwACtgASmIASmIQdgA8AAbBgBwACtpwiyxAFhAwFgA8AAbFhgA7LPBbLGwACtpLLHhRmyyMAArYOyycAAraqyyggEpiMEpiQEpiUIstsAB7LdwACt4bLewACt5LLGwACt57LHh5+yyAKyyQKyyggEpigEpikEpioEpisHYAPAAGwYAcAArhcIstsAB7LdwACuDrLewACuEbLGwACuFLLHhRmyyAKyycAArhqyyggEpi4Epi8IstsAB7LdwACuTbLeArLGwACuULLHiHKyyAKyyQKyyggEpjIEpjMKsnYIsucBYQMCYAPAAGwYYAPAAGwYYAOyzwOy6cAArnSy6sAArney68AArnoEpjUIssQBYQMCYAPAAGwYYAPAAGwYYAOyzwWyxsAArqeyx4fTssjAAK59sskCssoIBKY3BKY4BKY5B2ADwABsGAHAAK7eCLLbAAey3cAArtiy3gKyxsAArtuyx4UZssgCssnAAK7hssoIBKY8BKY9BKY+CLLbAAey3cAArxGy3sAArxSyxsAArxeyx4eWssgCsskCssoIBKZBBKZCBKZDBKZEB2ADwABsGAHAAK9HCLLbAAey3cAArz6y3sAAr0GyxsAAr0Syx4UZssgCssnAAK9KssoIBKZHBKZIBKZJCLLbAAey3cAAr32y3sAAr4CyxsAAr4Oyx4eTssgCsskCssoIBKZMBKZNBKZOCLLbAAey3cAAr6qy3sAAr62yxsAAr7Cyx4eQssgCsskCssoIBKZRBKZSBKZTCLLbAAey3cAAr9ey3sAAr9qyxsAAr92yx4hsssgCsskCssoIBKZWBKZXBKZYCLLbAAey3cAAsASy3sAAsAeyxsAAsAqyx4eKssgCsskCssoIBKZbBKZcBKZdB2ADwABsGAHAALA3CLLbAAey3cAAsDGy3gKyxsAAsDSyx4UZssgCssnAALA6ssoIBKZgCrJ3CLLnAWEDAmADwABsGGADwABsGGADss8DsunAALBqsuoCsuvAALBtBKZiCLLEAWEDAmADwABsGGADwABsGGADss8FssbAALCXsseFGbLIwACwcLLJArLKCASmZASmZQSmZgiy2wAHst3AALDIst7AALDLssbAALDOsseCnrLIArLJArLKCASmaQSmagqyeAiy5wFhAwFgA75NYAOyzwOy6cAAsPWy6sAAsPiy68AAsPsEpmwIssQBYQMBYAO+TWADss8FssbAALEgsseFGbLIwACw/rLJwACsB7LKCASmbgqyeQiy5wFhAwFgA8AAbBhgA7LPA7LpwACxTLLqArLrwACxTwSmcASmcQdgA8AAbBgBwACxdgiyxAFhAwFgA8AAbBhgA7LPBbLGwACxc7LHhRmyyMAAsVKyycAAsXmyyggEpnMEpnQIstsAB7LdwACxsLLeArLGwACxs7LHhRmyyAKyyQKyyggEpncEpngKsnoIsucBYQMCYAPAAGwYYAPAAGwfYAOyzwOy6cAAsdey6sAAsdqy68AAsd0EpnoIssQBYQMCYAPAAGwYYAPAAGwfYAOyzwWyxsAAsgqyx4UZssjAALHgssnAAFgZssoIBKZ8CrJ7CLLnAWEDAWADwABsH2ADss8DsunAALI+suoCsuvAALJBBKZ+CLLEAWEDAWADwABsH2ADss8FssbAALJlsseFGbLIwACyRLLJwABYGbLKCASmgASmgQSmggiy2wAHst3AALKTst7AALKWssbAALKZsseFGbLIArLJwABe0LLKCASmhQSmhgiy2wAHst3AALLDst7AALKWssbAALLGsseFGbLIArLJwABe0LLKCASmiQSmigSmiwdgA8AAbBgBwACy9giy2wAHst3AALLwst4CssbAALLzsseFGbLIArLJwACy+bLKCASmjgSmjwiy2wAHst3AALMpst4CssbAALMssseFGbLIArLJArLKCASmkgqyfAiy5wFhAwFgA8AAbBhgA7LPA7LpwACzULLqArLrwACzUwSmlAiyxAFhAwFgA8AAbBhg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ArLrwAC98QSnNASnNQdgA8AAbBgBwAC+HgiyxAFhAwJgA8AAbBhgA8AAbBhgA7LPBbLGwAC+G7LHhRmyyMAAvfSyycAAviGyyggEpzcKspUIsucBYQMCYAPAAGwYYAPAAGwYYAOyzwOy6cAAvl6y6gKy68AAvmEEpzkEpzoHYAPAAGwYAcAAvo4IssQBYQMCYAPAAGwYYAPAAGwYYAOyzwWyxsAAvouyx4UZssjAAL5kssnAAL6RssoIBKc8CrKWCLLnAWEDAmADwABsGGADwABsWGADss8DsunAAL7OsuoCsuvAAL7RBKc+CLLEAWEDAmADwABsGGADwABsWGADss8FssbAAL77sseFGbLIwAC+1LLJArLKCASnQAiyxAFhAwFgA8AAbBhgA7LPBbLGwAC/LLLHhRmyyJJPsskCssoIBKdCBKdDBKdEB2ADwABsGAHAAL9bCLLbAAey3cAAv1Wy3gKyxsAAv1iyx4UZssgCssnAAL9essoIBKdHBKdICLLbAAey3cAAv46y3gKyxsAAv5Gyx4UZssgCsskCssqOGQSnSwSnTASnTQiy2wAHst3AAL+2st7AAL+5ssbAAL+8sseFGbLIArLJwAC0VrLKCASnUASnUQiy2wAHst3AAL/mst4CssbAAL/psseFGbLIArLJArLKjhkEp1QEp1UKspgIsucBYQMBYAPAAGxYYAOyzwOy6cAAwA6y6sAAwBGy68AAwBQEp1cEp1gHYAPAAGwYAcAAwD4IssQBYQMBYAPAAGxYYAOyzwWyxsAAwDuyx4UZssjAAMAXssnAAMBBssoIBKdaCrKZCLLnAWEDA2ADwABsWGADwABsGGADwABsGGADss8DsunAAMB4suoCsuvAAMB7BKdcBKddB2ADwABsGAHAAMCuCLLEAWEDA2ADwABsWGADwABsGGADwABsGGADss8FssbAAMCrsseFGbLIwADAfrLJwADAsbLKCASnXwSnYAiy2wAHst3AAMD0st4CssbAAMD3sseFGbLIArLJwACtqrLKCASnYwSnZASnZQiy2wAHst3AAMEest7AAMEhssbAAMEksseHjbLIArLJArLKCASnaASnaQSnagiy2wAHst3AAMFLst7AAMFOssbAAMFRsseFGbLIArLJwADAsbLKCASnbQSnbgiy2wAHst3AAMF7st4CssbAAMF+sseF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sseFGbLIArLJArLKCASn+AqypAiy5wFhAwFgA8AAbBhgA7LPA7LpwADIrbLqArLrwADIsASn+giyxAFhAwFgA8AAbBhgA7LPBbLGwADI1LLHhRmyyMAAyLOyybGRssoIBKf8BKf9BKf+B2ADwABsGAHAAMkGCLLbAAey3cAAyQCy3gKyxsAAyQOyx4UZssgCssnAAMkJssoIBKgBBKgCBKgDB2ADwABsGAHAAMk/CLLbAAey3cAAyTmy3gKyxsAAyTyyx4UZssgCssnAAMlCssoIBKgGCrKlCLLnAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8DsunAAMlysuoCsuvAAMl1BKgICLLEAWEDBWADwABsH2ADwABsH2ADwABsMGADwABsMGADwABsMGADss8FssbAAMmxsseFGbLIwADJeLLJArLKCASoCgqypgiy5wFhAwVgA8AAbB9gA8AAbB9gA8AAbDBgA8AAbDBgA8AAbDBgA7LPA7LpwADJ9LLqArLrwADJ9wSoDAiyxAFhAwVgA8AAbB9gA8AAbB9gA8AAbDBgA8AAbDBgA8AAbDBgA7LPBbLGwADKM7LHhRmyyMAAyfqyyQKyyggEqA4EqA8IstsAB7LdwADKdrLeArLGwADKebLHhRmyyAKyyQKyyo4ZBKgSBKgTCLLbAAey3cAAyp6y3gKyxsAAyqGyx4UZssgCsskCssqOGQSoFgSoFwSoGAiy2wAHst3AAMrGst7AAMrJssbAAMrMsseHg7LIArLJArLKCASoGwSoHASoHQdgA8AAbBgBwADK+Qiy2wAHst3AAMrzst4CssbAAMr2sseFGbLIArLJwADK/LLKCASoIASoIQiy2wAHst3AAMssst4CssbAAMsvsseFGbLIArLJArLKjhkEqCQEqCUEqCYIstsAB7LdwADLVLLewADLV7LGwADLWrLHgNayyAKyyQKyyggEqCkEqCoIstsAB7LdwADLgbLewADLV7LGwADLhLLHgoayyAKyyQKyyggEqC0EqC4EqC8EqDAHYAPAAGwYAcAAy7QIstsAB7LdwADLq7LewADLrrLGwADLsbLHhRmyyAKyycAAy7eyyggEqDMEqDQIstsAB7LdwADL6rLeArLGwADL7bLHhRmyyAKyycAAy7eyyggEqDcEqDgEqDkHYAPAAGwYAcAAzBoIstsAB7LdwADMFLLeArLGwADMF7LHhRmyyAKyycAAzB2yyggEqDwEqD0IstsAB7LdwADMTbLewABfp7LGwADMULLHh5yyyAKyyQKyyggEqEAKsqcIsucBYQMBYAPAAGwYYAOyzwOy6cAAzHey6gKy68AAzHoEqEIEqEMEqEQHYAPAAGwYAsAAzKHAAMykCLLEAWEDAWADwABsGGADss8FssbAAMyesseFGbLIwADMfbLJwADMp7LKCASoRgqyqAiy5wFhAwFgA8AAbBhgA7LPA7LpwADM4rLqArLrwADM5QSoSASoSQdgA8AAbBgBwADNDAiyxAFhAwFgA8AAbBhgA7LPBbLGwADNCbLHhRmyyMAAzOiyycAAzQ+yyggEqEsKsqkIsucBYQMBYAPAAGwYYAOyzwOy6cAAzUay6gKy68AAzUkEqE0EqE4HYAPAAGwYAcAAzXAIssQBYQMBYAPAAGwYYAOyzwWyxsAAzW2yx4UZssjAAM1MssnAAM1zssoIBKhQCrKqCLLnAWEDAWADwABsGGADss8DsunAAM2qsuoCsuvAAM2tBKhSBKhTB2ADwABsGAHAAM3UCLLEAWEDAWADwABsGGADss8FssbAAM3RsseFGbLIwADNsLLJwADN17LKCASoVQqyqwiy5wFhAwFgA8AAbBhgA7LPA7LpwADODrLqArLrwADOEQSoVwSoWAdgA8AAbBgBwADOOAiyxAFhAwFgA8AAbBhgA7LPBbLGwADONbLHhRmyyMAAzhSyycAAzjuyyggEqFoKsqwIsucBYQMBYAPAAGwYYAOyzwOy6cAAznKy6gKy68AAznUEqFwIssQBYQMBYAPAAGwYYAOyzwWyxsAAzpmyx4UZssjAAM54sskCssoIBKheBKhfCLLbAAey3cAAzsSy3gKyxsAAzseyx4UZssgCsskCssoIBKhiCrKtCLLnAWEDAWADwABsGGADss8DsunAAM7rsuoCsuvAAM7uBKhkBKhlB2ADwABsGAHAAM8VCLLEAWEDAWADwABsGGADss8FssbAAM8SsseFGbLIwADO8bLJwADPGLLKCASoZwqyrgiy5wFhAwFgA8AAbBhgA7LPA7LpwADPT7LqArLrwADPUgSoaQiyxAFhAwFgA8AAbBhgA7LPBbLGwADPdrLHhRmyyMAAz1WyycAAzxiyyggEqGsEqGwEqG0HYAPAAGwYAcAAz6oIstsAB7LdwADPpLLeArLGwADPp7LHhRmyyAKyycAAz62yyggEqHAEqHEIstsAB7LdwADP3bLeArLGwADP4LLHhRmyyAKyyQKyyo4ZBKh0BKh1BKh2CLLbAAey3cAA0AWy3sAA0AiyxsAA0Auyx4KbssgCsskCssoIBKh5BKh6BKh7CLLbAAey3cAA0DKy3sAA0DWyxsAA0Diyx4KnssgCsskCssoIBKh+BKh/CLLbAAey3cAA0F+y3gKyxsAA0GKyx4UZssgCsskCssoIBKiCCrKvCLLnAWEDAWADwABsGGADss8DsunAANCGsuoCsuvAANCJBKiEBKiFB2ADwABsGAHAANCwCLLEAWEDAWADwABsGGADss8FssbAANCtsseFGbLIwADQjLLJwADQs7LKCASohwSoiASoiQdgA8AAbBgBwADQ8Aiy2wAHst3AANDqst4CssbAANDtsseFGbLIArLJwADQ87LKCASojASojQSojgdgA8AAbBgBwADRKQiy2wAHst3AANEjst4CssbAANEmsseFGbLIArLJwADRLLLKCASokQqysAiy5wFhAwFgA8AAbBhgA7LPA7LpwADRXLLqArLrwADRXwSokwSolAdgA8AAbBgBwADRhgiyxAFhAwFgA8AAbBhgA7LPBbLGwADRg7LHhRmyyMAA0WKyycAA0YmyyggEqJYKsrEIsucBYQMCYAPAAGwfYAPAAGwfYAOyzwOy6cAA0cCy6gKy68AA0cMEqJgEqJkHYAPAAGwYAcAA0fAIssQBYQMCYAPAAGwfYAPAAGwfYAOyzwWyxsAA0e2yx4UZssjAANHGssnAANHzssoIBKibBKicCrKyCLLnAWEDAmADwABsH2ADwABsH2ADss8DsunAANIwsurAANIzsuvAANI2BKieCLLEAWEDAmADwABsH2ADwABsH2ADss8FssbAANJjsseFGbLIwADSObLJwACAnbLKCASooASooQSoogiy2wAHst3AANKXst7AANKassbAANKdsseCkrLIArLJArLKCASopQSopgSopwiy2wAHst3AANLEst7AANLHssbAANLKsseIV7LIArLJArLKCASoqgqyswiy5wFhAwFgA8AAbB9gA7LPA7LpwADS8bLqArLrwADS9ASorASorQdgA8AAbBgBwADTGwiyxAFhAwFgA8AAbB9gA7LPBbLGwADTGLLHhRmyyMAA0veyycAA0x6yyggEqK8EqLAKsrQIsucBYQMBYAPAAGwYYAOyzwOy6cAA01Wy6sAA01iy68AA01sEqLIIssQBYQMBYAPAAGwYYAOyzwWyxsAA04Kyx4dUssjAANNesskCssoIBKi0BKi1BKi2CLLbAAey3cAA062y3sAA07CyxsAA07Oyx4fZssgCsskCssoIBKi5CrK1CLLnAWEDAWADwABsGGADss8DsunAANPasuoCsuvAANPdBKi7BKi8B2ADwABsGAHAANQECLLEAWEDAWADwABsGGADss8FssbAANQBsseFGbLIwADT4LLJwADUB7LKCASovgqytgiy5wFhAwJgA8AAbBhgA8AAbFhgA7LPA7LpwADUPrLqArLrwADUQQSowAiyxAFhAwJgA8AAbBhgA8AAbFhgA7LPBbLGwADUa7LHhRmyyMAA1ESyyQKyyggEqMIKsrcIsucBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyzwOy6cAA1Jyy6gKy68AA1J8EqMQIssQBYQMDYAPAAGwYYAPAAGxYYAPAAGxYYAOyzwWyxsAA1M+yx4UZssjAANSisskCssoIBKjGBKjHCLLbAAey3cAA1Qay3gKyxsAA1Qmyx4UZssgCssnAAHQLssoIBKjKCrK4CLLnAWEDAWADwABsGGADss8DsunAANUwsuoCsuvAANUzBKjMCLLEAWEDAWADwABsGGADss8FssbAANVXsseFGbLIwADVNrLJArLKjhkEqM4EqM8EqNAHYAPAAGwYAcAA1YkIstsAB7LdwADVg7LeArLGwADVhrLHhRmyyAKyycAA1YyyyggEqNMEqNQIstsAB7LdwADVvLLeArLGwADVv7LHhRmyyAKyycAAsvmyyggEqNcEqNgEqNkHYAPAAGwYAcAA1ewIstsAB7LdwADV5rLeArLGwADV6bLHhRmyyAKyycAA1e+yyggEqNwEqN0EqN4IstsAB7LdwADWH7LewADWIrLGwADWJbLHgoCyyAKyyQKyyggEqOEEqOIEqOMHYAPAAGwYAcAA1lIIstsAB7LdwADWTLLeArLGwADWT7LHhRmyyAKyycAA1lWyyggEqOYEqOcEqOgHYAPAAGwYAcAA1osIstsAB7LdwADWhbLeArLGwADWiLLHhRmyyAKyycAA1o6yyggEqOsEqOwEqO0EqO4HYAPAAGwYAcAA1scIstsAB7LdwADWvrLewADWwbLGwADWxLLHhRmyyAKyycAA1sqyyggEqPEKsrkIsucBYQMBYAO+TWADss8DsunAANb9suoCsuvAANcABKjzBKj0B2ADwABsGAHAANclCLLEAWEDAWADvk1gA7LPBbLGwADXIrLHhRmyyMAA1wOyycAA1yiyyggEqPYKsroIsucBYQMCYAPAAGwYYAO+TWADss8DsunAANddsuoCsuvAANdgBKj4CLLEAWEDAmADwABsGGADvk1gA7LPBbLGwADXiLLHhRmyyMAA12OyycAAfHmyyggEqPoKsrsIsucBYQMCYAPAAGwYYAPAAGwYYAOyzwOy6cAA17qy6gKy68AA170EqPwIssQBYQMCYAPAAGwYYAPAAGwYYAOyzwWyxsAA1+eyx4UZssjAANfAssnAALWMssoIBKj+CrK8CLLnAWEDAWADwABsGGADss8DsunAANgbsuoCsuvAANgeBKkACLLEAWEDAWADwABsGGADss8FssbAANhCsseFGbLIwADYIbLJArLKCASpAgqyvQiy5wFhAwFgA75NYAOyzwOy6cAA2G2y6gKy68AA2HAEqQQEqQUHYAPAAGwYAcAA2JUIssQBYQMBYAO+TWADss8FssbAANiSsseFGbLIwADYc7LJwADYmLLKCASpBwSpCASpCQiy2wAHst3AANjNst7AANjQssbAANjTsseFGbLIArLJwAB6k7LKCASpDASpDQSpDgdgA8AAbBgBwADZAwiy2wAHst3AANj9st4CssbAANkAsseFGbLIArLJwADZBrLKCASpEQqyvgiy5wFhAwJgA8AAbBhgA8AAbBhgA7LPA7LpwADZNrLqArLrwADZOQSpEwSpFAdgA8AAbBgBwADZZgiyxAFhAwJgA8AAbBhgA8AAbBhgA7LPBbLGwADZY7LHhRmyyMAA2TyyycAA2WmyyggEqRYEqRcIstsAB7LdwADZprLeArLGwADZqbLHhRmyyAKyyQKyyggEqRoKsr8IsucBYQMBYAPAAGxYYAOyzwOy6cAA2c2y6gKy68AA2dAEqRwIssQBYQMBYAPAAGxYYAOyzwWyxsAA2fSyx4UZssjAANnTssnAAF5qssoIBKkeCrLACLLnAWEDAWADwABsGGADss8DsunAANoisuoCsuvAANolBKkgCLLEAWEDAWADwABsGGADss8FssbAANpJsseFGbLIwADaKLLJArLKjigEqSIKssEIsucBYQMBYAPAAGwYYAOyzwOy6cAA2nWy6gKy68AA2ngEqSQIssQBYQMBYAPAAGwYYAOyzwWyxsAA2pyyx4UZssjAANp7sskCssoIBKkmCrLCCLLnAWEDAWADwABsGGADss8DsunAANrHsuoCsuvAANrKBKkoCLLEAWEDAWADwABsGGADss8FssbAANrusseFGbLIwADazbLJArLKjkgEqSoEqSsIstsAB7LdwADbGrLeArLGwADbHbLHiBuyyAKyyQKyyggEqS4EqS8EqTAIstsAB7LdwADbQbLewADbRLLGwADbR7LHgoOyyAKyyQKyyggEqTMEqTQEqTUHYAPAAGwYAcAA23QIstsAB7LdwADbbrLeArLGwADbcbLHhRmyyAKyycAA23eyyggEqTgEqTkKssMIsucBYQMCYAPAAGwYYAPAAGwYYAOyzwOy6cAA26ey6sAA26qy68AA260EqTsIssQBYQMCYAPAAGwYYAPAAGwYYAOyzwWyxsAA29qyx4UZssjAANuwsskCssoIBKk9BKk+BKk/CLLbAAey3cAA3Auy3sAA3A6yxsAA3BGyx4KYssgCsskCssoIBKlCBKlDCLLbAAey3cAA3Diy3gKyxsAA3Duyx4UZssgCssnAAFinssoIBKlGBKlHBKlIB2ADwABsGAHAANxoCLLbAAey3cAA3GKy3gKyxsAA3GWyx4UZssgCssnAANxrssoIB2ADgpIACLOHAAAErIAIs4oAAbOMwADcpgSspQSs4QSs4wjAAG7vAAHAAG7yHAI3sDkIiWQAAYlmwADcyQjAAG1QAmADwABsGGADwABsWAHAAG1Th2YKtWMKtWQIwABtUAJgA8AAbBhgA7V1AcAAbVOHZgi1aAABtWvAANz3B2ADwABsWAAIwABtUAJgA8AAbBhgA7WAAcAAbVOHZgW1kY8dBbWRrmwFtZGWiQSt4wSubgi+lQAJvuq3iL7rHL7sHL7tHL7uHL7vwADdR77wwADdSr7xAL7yAgSIbgSIbwSIcASIcQSIcgSIbQdgA8AAbBgGwADddMAA3XfAAN16wADdfcAA3YDAAN2DCMAAS7kBYAPAAGxbAASu1AjAAE9YAALAAE9aAMAAT1zAAN2zCMAAS7kBXQPAAEnSAWADiOcACMAAVjMAAAjAAFaXAAAIwABivwFgA4f4AASvBAjAAGIaAALAAGIch6XAAGIewADd9QSvFAjAAE9YAALAAE9aA8AAT1zAAN4NBK8cCMAAUygAAsAAUyoAwABTLMAA3iQEryQIwABiGgACwABiHIeTwABiHsAA3jsIwABivwFgA4UaAASvPAjAAGIaAALAAGIchODAAGIewADeXgSveAjAAFMoAALAAFMqA8AAUyzAAN52CMAAYrkBYAPAAGxWAASvmgjAAGIaAALAAGIcAMAAYh7AAN6aCMAAS40BYAOF5AHAAEuPwADenQSvmwjAAGIaAALAAGIch7fAAGIewADexAjAAEuNAV0DwABsGQFgA8AATz8BwABLj8AA3scIwABLjQFgA4UaAcAAS48CCMAAS40BYAPAAFM5AcAAS48CCMAAS40BYAPAAE9qAcAAS48CCMAAS40BYAPAAGLEAcAAS48CCMAAS40BYAPAAEKjAcAAS48CBJTeBEgHYAPAAGwYA8AA31DAAN9TsgcEr9cIwABq1wAKwABq2cAA31XAAGHWwADfZ8AAYdcewABh2BzAAGHZHMAAYdocwABh2xzAAGHcHsAAYd0ewABh3sAAf/cEr9gIwABqjQAJwABh1sAA36zAAGHXHsAAYdgcwABh2RzAAGHaHMAAYdscwABh3B7AAGHdHsAAYd7AAH/3BK/ZCMAAT1gAAsAAT1qFBMAAT1zAAN/pBLAuCMAAYhoAAsAAYhyHnMAAYh7AAOABBLAzCMAAYhoAAsAAYhyHtMAAYh7AAOAZCMAAYrkBYAOI5wAEsDkIwABhfAACwABhfsAA4DzAAGF/HgSwOwjAAGF8AALAAGF+wADgU8AAYX8eBLBOCMAAYhoAAsAAYhyCm8AAYh7AAOBqCMAAbFYAAAjAAEuNAWADh/gBwABLjwIIwABLjQFgA8AAbB8BwABLjwIIwABLjQFgA75NAcAAS48CCMAAS40BYAOFGgHAAEuPwADgbQjAAEuNAV0DwABsGQFgA8AAbFYBwABLjwIIwABiuQFgA8AAT2oABLC4CMAATo4AAsAATpAAwABOksAA4PQIwABOmwABwABOnsAA4PcEsN0IwABh5QACwABh54DWwABh6cAA4RoEsN8IwABhlwACwABhmQDAAGGbwADhMgSw4gjAAGGXAALAAGGZA8AAYZvAAOFJBLDjCMAAYZcAAsAAYZmFBMAAYZvAAOFgCMAAYrkBYAPAAE1oAAjAAEuNAWADhKEBwABLjwIIwABLjQFgA8AAT48BwABLjwIEsR4IwABiGgACwABiHIKewABiHsAA4acIwABLjQFgA8AAT2oBwABLj8AA4aoIwABLjQFgA8AAbBgBwABLjwIEsR8IwABTKAACwABTKoUEwABTLMAA4eYIwABLjQFgA4XkAcAAS48CCMAAYrkBYAPAAE8/AASxXQjAAGIaAALAAGIch9zAAGIewADiGwSxegjAAGIaAALAAGIchQTAAGIewADiMwjAAGK5AWADt8EABLGoCMAAYW4AAsAAYXCFBMAAYXLAAOJWBLGpCMAAYW4AAsAAYXAAwABhcsAA4m4EsaoIwABhbgACwABhcAPAAGFywADihQSxvAjAAGIaAALAAGIch5DAAGIewADinAjAAGK5AWADwABPHwAEsgYIwABiGgACwABiHIKVwABiHsAA4sEEshsIwABP+QACwABP+wDAAE/9wADi2QSyHAjAAE/5AALAAE/7A8AAT/3AAOLwBLIdCMAAT/kAAsAAT/uFBMAAT/3AAOMHBLIjCMAATo4AAsAATpCFBMAATpLAAOMfCMAATpsAAcAATp7AAOMiBLJLCMAAbKIAAcAAbKTAAONGBLKsBLMoBLM4BLN0CLoRAAAEs4YIujMAAro1ALo3wADjaQSzhwi6MwACujUDujfAAON6BLOICLozAAK6NYUEujfAAOOLBLOJCLozAAK6NYTgujfAAOOdBLOKCLozAAK6NYDWujfAAOOvBLOLCLozAAK6NYKMujfAAOPBBLOMCLozAAK6NYKhujfAAOPTBLONCLozAAK6NYKAujfAAOPlBLOOCLozAAK6NYWeujfAAOP3BLOPCLozAAK6NYKPujfAAOQJBLOQCLozAAK6NYKkujfAAOQbBLORCLozAAK6NYKYujfAAOQtBLOSCLozAAK6NYKDujfAAOQ/BLOTCLozAAK6NYdUujfAAORRBLOUCLozAAK6NYKSujfAAORjBLOVCLozAAK6NYKnujfAAOR1BLOWCLozAAK6NYKbujfAAOSHBLOXCLozAAK6NYKGujfAAOSZB2ADujMSwADjbMAA433AAOOOwADj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PMABBGnAAQSYwAEExcAA6DXAAQT1wAEFJ8ABBVXAAQWCwAEFtMABBeTAAQYUwAEGRAS2OAjAAEu5AWADvXYACL/JAAO/zRy/zhy/zxwIv8kAA7/NHL/OHr/PHAdbDMAA55zAAP4wwADnzcAA/mDAAOdqwAD+ALIYwAD/RsAA6C/AAP4AwADn/sAA/mAIwABtUAJgA8AAbBhgA76VAcAAbVPAAQhDAjfAAP/9AjeWgAI3mA4CN6ABAjegAgI3oAMCN6AEAjegBQI3oAYCN6AHAjegCAI3oAkCN6AKAjegCwI3oCgCN6ApAjegLwI3oF8CN7AAAjfAAP7/CMAAWPwAAAjAAG1QAmADwABsGGADwABOFAHAAG1Th2YIwABtUAJgA8AAbBhgA8AAQC4BwABtU4dmB2ADwABZvwAKwABDOAS4hwjAAEOXAALAAEOZAMAAQ5vAAQknBLiICMAAQ5cAAsAAQ5kDwABDm8ABCT4EuIkIwABDlwACwABDmYUEwABDm8ABCVUEuIoIwABDlwACwABDmYTgwABDm8ABCW0EuIsIwABDlwACwABDmYDWwABDm8ABCYUEuIwIwABDlwACwABDmYKMwABDm8ABCZ0EuI0IwABDlwACwABDmYKhwABDm8ABCbUEuI4IwABDlwACwABDmYKAwABDm8ABCc0EuI8IwABDlwACwABDmYWewABDm8ABCeUEuJAIwABDlwACwABDmYKPwABDm8ABCf0EuJEIwABDlwACwABDmYKkwABDm8ABChUEuJIIwABDlwACwABDmYKYwABDm8ABCi0EuJMIwABDlwACwABDmYKDwABDm8ABCkUEuJQIwABDlwACwABDmYdUwABDm8ABCl0EuJUIwABDlwACwABDmYKSwABDm8ABCnUEuJYIwABDlwACwABDmYKnwABDm8ABCo0EuJcIwABDlwACwABDmYKbwABDm8ABCqUEuJgIwABDlwACwABDmYKGwABDm8ABCr0EuJkIwABDlwACwABDmYecwABDm8ABCtUEuJoIwABDlwACwABDmYeDwABDm8ABCu0EuJsIwABDlwACwABDmYKVwABDm8ABCwUEuJwIwABDlwACwABDmYKqwABDm8ABCx0EuJ0IwABDlwACwABDmYKJwABDm8ABCzUEuJ4IwABDlwACwABDmYKewABDm8ABC00EuJ8IwABD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wADu6cAA75HAAPA5wADxUsAA8YrAAPNKwADzgsAA9JrAAPTSwAD1QsAA9XrAAPWywAD16sAA9lrAAPbKwAD3AgSBWgdgA8AAbBgVsi2yMLIysjiyNbI6siSyHrIhwAEFIbIqsifAAP/1shiyG7ISshWyDcABAIrAAQC8wAEdQAjAAG1QAmADwABsGGADilABwABtU4dmB2ADix8ABMAAR+gIwABoRQACwABoRwDAAGhJwAEdnATAAEfpCMAAabEAAsAAabMAwABptcABHbUEwABH7gjAAGhFAALAAGhHhODAAGhJwAEdzgTAAEfvCMAAaEUAAsAAaEcDwABoScABHegEwABH8QjAAGhFAALAAGhHhQTAAGhJwAEeAQTAAEf1CMAAabEAAsAAabOFBMAAabXAAR4bBIY6CMAAarcACcAAYdbAAR41wABh1xzAAGHYHsAAYdkcwABh2hzAAGHbHMAAYdwewABh3RzAAGHewAB/9wTAAEgbCMAAarcACcAAYdbAAR5ywABh1xzAAGHYHsAAYdkcwABh2h7AAGHbHMAAYdwewABh3R7AAGHewAB/9wTAAEggCMAAapwACcAAYdbAAR6xwABh1x7AAGHYHMAAYdkcwABh2hzAAGHbHMAAYdwcwABh3R7AAGHewAB/9wdgA8AAbBgGwADu6cAA6zHAAOiXwADuscAA8/LAAN9QBLpHCMAAancACcAAYdbAAR8QwABh1xzAAGHYHMAAYdkcwABh2hzAAGHbHMAAYdwewABh3RzAAGHewAB/9wTAAEgwCMAAancACcAAYdbAAR9NwABh1xzAAGHYHMAAYdkcwABh2h7AAGHbHMAAYdwewABh3R7AAGHewAB/9wTAAEg6CMAAarcACcAAYdbAAR+MwABh1xzAAGHYHsAAYdkcwABh2hzAAGHbHMAAYdwewABh3RzAAGHewAB/9wTAAEg7CMAAarcACcAAYdbAAR/LwABh1xzAAGHYHsAAYdkcwABh2h7AAGHbHMAAYdwewABh3R7AAGHewAB/9wTAAEg9CMAAasQACcAAYdbAASAKwABh1xzAAGHYHMAAYdkcwABh2hzAAGHbHsAAYdwewABh3RzAAGHewAB/9wTAAEg/CMAAasQACcAAYdbAASBJwABh1xzAAGHYHMAAYdkcwABh2h7AAGHbHMAAYdwewABh3R7AAGHe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wAEhLMABIUbAASFgwAEhesABIZTAASqnwAEqwcABKtsEwABJpgjAAGIaAALAAGIcA8AAYh7AASswBMAASacIwABiGgACwABiHIKMwABiHsABK0kEwABJqAjAAGIaAALAAGIcgqHAAGIewAErYwTAAEmpCMAAYhoAAsAAYhyCgMAAYh7AASt9BMAASaoIwABiGgACwABiHIWewABiHsABK5cEwABJqwjAAGIaAALAAGIcgo/AAGIewAErsQTAAEmsCMAAYhoAAsAAYhyCpMAAYh7AASvLBMAASa0IwABiGgACwABiHIKYwABiHsABK+UEwABJrgjAAGIaAALAAGIcgoPAAGIewAEr/wTAAEmvCMAAYhoAAsAAYhyCksAAYh7AASwZBMAASbAIwABiGgACwABiHIKnwABiHsABLDMEwABJsQjAAGIaAALAAGIcgobAAGIewAEsTQTAAEmyCMAAYhoAAsAAYhyCqsAAYh7AASxnBMAASbMIwABiGgACwABiHIKJwABiHsABLIEEwABJtAjAAGIaAALAAGIch4rAAGIewAEsmwTAAEm1CMAAYhoAAsAAYhyHjcAAYh7AASy1BMAASbYIwABiGgACwABiHIefwABiHsABLM8EwABJtwjAAGIaAALAAGIch6LAAGIewAEs6QTAAEm4CMAAYhoAAsAAYhyFocAAYh7AAS0DBMAASbkIwABiGgACwABiHIfJwABiHsABLR0EwABJugjAAGIaAALAAGIch8zAAGIewAEtNwTAAEm7CMAAYhoAAsAAYhyHW8AAYh7AAS1RBMAASbwIwABiGgACwABiHIffwABiHsABLWsEwABJvQjAAGIaAALAAGIch+LAAGIewAEthQdgA8AAYhorwADencABKzXAAOI2wADeYcABE5HAAStOwAEraMABK4LAASucwAErtsABK9DAASvqwAEsBMABE6nAASwewAEsOMAA4G3AASxSwADgBMABE9rAAOLEwAEsbMABLIbAAOGqwAEsoMABLLrAAOKfwADePsABFDnAARRtwAEs1MABLO7AAS0IwADd+MABFSnAAOAcwADex8ABLSLAAS08wAEtVsAA4h7AAS1wwAEtigjAAEu5AWABwABsXAAEwABKCAjAAGMuAALAAGMwAMAAYzLAAS5gBMAASgkIwABjLgACwABjMAPAAGMywAEueQTAAEoKCMAAYy4AAsAAYzCFBMAAYzLAAS6SBMAASgsIwABjLgACwABjMITgwABjMsABLqwEwABKDAjAAGMuAALAAGMwgNbAAGMywAEuxgTAAEoNCMAAYy4AAsAAYzCCjMAAYzLAAS7gBMAASg4IwABjLgACwABjMIKhwABjMsABLvoEwABKDwjAAGMuAALAAGMwgoDAAGMywAEvFATAAEoQCMAAYy4AAsAAYzCFnsAAYzLAAS8uBMAAShEIwABjLgACwABjMIKPwABjMsABL0gEwABKEgjAAGMuAALAAGMwgqTAAGMywAEvYgTAAEoTCMAAYy4AAsAAYzCCmMAAYzLAAS98BMAAShQIwABjLgACwABjMIKDwABjMsABL5YEwABKFQjAAGMuAALAAGMwh1TAAGMywAEvsATAAEoWCMAAYy4AAsAAYzCCksAAYzLAAS/KBMAAShcIwABjLgACwABjMIKnwABjMsABL+QEwABKGAjAAGMuAALAAGMwgpvAAGMywAEv/gTAAEoZCMAAYy4AAsAAYzCChsAAYzLAATAYBMAAShoIwABjLgACwABjMIecwABjMsABMDIEwABKGwjAAGMuAALAAGMwh4PAAGMywAEwTATAAEocCMAAYy4AAsAAYzCClcAAYzLAATBmB2ADwABjLhXAAS5lwAEufsABLpfAAS6xwAEuy8ABLuXAAS7/wAEvGcABLzPAAS9NwAEvZ8ABL4HAAS+bwAEvtcABL8/AAS/pwAEwA8ABMB3AATA3wAEwUcABMGsEwABKMQjAAGNOAALAAGNQAMAAY1LAATDcBMAASjIIwABjTgACwABjUAPAAGNSwAEw9QTAAEozCMAAY04AAsAAY1CFBMAAY1LAATEOB2ADwABjTgPAATDhwAEw+sABMRMIwABiuQFgA8AAWSAACMAAYrkBYAPAAEG/AAjAAGK5AWADwABZmAAIwABiuQFgA8AATnMACMAAYrkBYAPAAEGGAAjAAGK5AWADwABMXwAIwABj2wAACMAAY+QAAsAAY+YewABj5x4IwABj5AACwABj5h7AAGPnHAjAAGPkAALAAGPmHMAAY+ceCMAAZLAAAArAAGWuCsAAZa8KwABlsArAAGWxCMAAZjQAAArAAGWyCsAAZbMKwABltArAAGW1CsAAZbYKwABltwrAAGW4CsAAZbkKwABlugrAAGW7CsAAZbwKwABlvQrAAGW+CMAAZLYAAArAAGW/CsAAZcAIwABkvAAACsAAZcEKwABlwgjAAGTCAAAKwABlwwrAAGXECMAAZKgAAArAAGXFCsAAZcYKwABlxwrAAGXICsAAZckKwABlygrAAGXLCsAAZcwKwABlzQrAAGXOCsAAZc8KwABl0ArAAGXRCsAAZdIKwABl0wrAAGXUCsAAZdUKwABl1grAAGXXCsAAZdgKwABl2QrAAGXaCsAAZdsKwABl3ArAAGXdCsAAZd4KwABl3wrAAGXgCsAAZeEKwABl4grAAGXjCsAAZeQKwABl5QrAAGXmCsAAZecKwABl6ArAAGXpCsAAZeoKwABl6wrAAGXsCsAAZe0KwABl7grAAGXvCsAAZfAKwABl8QjAAGTfAWADiOcBwABk4cABMcQKwABl8grAAGXzCsAAZfQKwABl9QrAAGX2CsAAZfcIwABmZAAACsAAZfgKwABl+QrAAGX6CsAAZfsKwABl/ArAAGX9CsAAZf4KwABl/wrAAGYACsAAZgEKwABmAgrAAGYDCsAAZgQKwABmBQjAAGY5AAAKwABmBgrAAGYHCsAAZggKwABmCQrAAGYKCsAAZgsKwABmDArAAGYNCMAAZm0AAArAAGYOCsAAZg8KwABmEArAAGYRCsAAZhIKwABmEwrAAGYUCsAAZhUKwABmFgrAAGYXCsAAZhgKwABmGQrAAGYaCsAAZhsKwABmHArAAGYdCsAAZh4KwABmHwrAAGYgCsAAZiEKwABmIgrAAGYjCMAAZnIAAArAAGYkCsAAZiUKwABmJgrAAGYnCMAAZn0AAArAAGYoCsAAZikKwABmKgrAAGYrCsAAZiwKwABmLQjAAGaEAAAEwABL3wTAAEvgBMAAS+MIwABm1gACwABm2ADAAGbawAE0tQTAAEvkCMAAZtYAAsAAZtgDwABm2sABNM4EwABL5QjAAGbWAALAAGbYhQTAAGbawAE05wTAAEvmCMAAZtYAAsAAZtiE4MAAZtrAATUBB2ADwABm1gTAATS6wAE008ABNOzAATUGCMAAYrkBYAPAAGwYAAMAAAAAAADwQwdgA8AAaEUEwAEdocABHe3AAR4GwAEd0wTAAEyvCMAAaGEAAsAAaGMAwABoZcABNWEEwABMsAjAAGhhAALAAGhjA8AAaGXAATV6BMAATLIIwABoYQACwABoY4KMwABoZcABNZMEwABMswjAAGhhAALAAGhjgqHAAGhlwAE1rQTAAEy0CMAAaGEAAsAAaGOE4MAAaGXAATXHBMAATLUIwABoYQACwABoY4DWwABoZcABNeEEwABMtgjAAGhhAALAAGhjhQTAAGhlwAE1+wdgA8AAaGEHwAE1ZsABNX/AATYAwAE1zMABNebAATWYwAE1sgjAAGscAALAAGmpHMAAaaoDCMAAa0cAAsAAaakcwABpqgAHYAPAAGmxA8ABHbrAASgSwAEeIAjAAGu0AAAHYAPAAGwYA7IYsgeyEgjAAGvoAAAIwABrhAABwABrj8ABNoQIwABrdwAACMAAa50AAAjAAGumAAAIwABr/QAACMAAa/UAAAdgA8AAbBgCsgfAAP4qB2ADwABsGAayGMAA52rAAOyBwAD3AsAA7yHAAPH6B2ADwABsGAbAAN9QsgfAAO7pwADol8AA8/LAAO6xB2ADwABsGAPAAQJfsg3AAP4qB2ADwABsGAHAAOdqB2ADwABsGAKyB8AA/foHYAPAAGwYAsAA6JfAAPA5B2ADwABsGAvAAQJfsgfAAOecwAD+KsAA583AAP5awADnasAA/frAAQNOwAD9RcAA31AHYAPAAGwYBMAA31DAAN9TsgfAAP36B2ADwABsGAnAAP1FwADfU7IHwADnnMAA/irAAOfNwAD+WsAA52rAAP36B2ADwABsGAbAAN9QwADu6cAA8/LAAO6xwADrMcAA6JcHYAPAAGwYBMABAl/AAOecwADnasAA/xQHYAPAAGwYAcAA/UUHYAPAAGwYAcAA31AHYAPAAGwYAsABAl/AAN9QB2ADwABsGAXAAN9QwADfU7IHwADnasAA/foHYAPAAGwYBcAA52rAAP36wADnnMAA/irAAP5aB2ADwABsGAXAAQJfwADnnMAA52rAAP8UwAD9+gdgA8AAbBgEwADnnLIYwADfU8AA31AHYAPAAGwYCrIYshLAAP4qwADnzcAA/lrAAQCKwADnasAA/fqyB8AA31AHYAPAAGwYBrIYshLAAN9QwAD9+sAA7IHAAPSaB2ADwABsGATAAPvPwADuecAA87rAAPaSB2ADwABsGAbAAOpYwADuecAA7ZnAAPO6wAD2WsAA9pIIwABrFwACwABpqRzAAGmqAAjAAGsSAALAAGmpHMAAaaoACMAAawMAAsAAaakcwABpqgAIwABq/gACwABpqRzAAGmqAAjAAGsNAALAAGmpHsAAaaoACMAAawgAAsAAaakewABpqgAIwABrLAACwABpqRzAAGmqAAjAAGsiAALAAGmpHMAAaaoACMAAaycAAsAAaakewABpqgAIwABrMgACwABpqRzAAGmqhRkIwABrQgACwABpqRzAAGmqAAjAAGs4AALAAGmpHMAAaaoACMAAaz0AAsAAaakewABpqgAIwABrjQABwABrj8ABNoQIwABLuQFgA75NAAjAAGuNAAHAAGuPwAE2tgjAAGuNAAHAAGuPwAE2rwjAAEu5AWADwABqRAAAAAAAAAAAQOBpAKCFYACitgAAo3TzAKPpZwCrdFYAAAAHAAAACQAAC1wAAAuqAAAMJgAAa/8AAHtYAAB8agAAgWoAAIruAACOLAAAkAYAAJepAACgIwAAqVsAALsCAAC9mQAAzs8AANBfAAGAvwAE5CoABgiaAAYNdQAGyLkABt7vAAcpygAI+AIACP5FAAkN/AAJD9cACR0WAAkwNQAJRVAACV6zAAnZ0QAJ30YACeViAAnyMgAJ/PAAChE8AAolrwAKJtYACidFAAoo4wAKNBwACjYLAApJjgAKScMACk6bAApRFAAKXL0ACmCFAApjSQAKY6kACmhaAAp0OAAKgskACpRmAAqZYwAK6tkACvFwAAr8dgALzx8AC9roAAvrPAAL+MAAC/s2AAwDRwAMW4cADGEdAAxnjgAMbRIADHvnAA0cnAANK2AADSwYAA4tWAAOc74ADngGAA6HqAAOnh8ADq06AA6t6wAOskkADvfSAA9I1wAPdxUAEDRDABBAfQAQWlQAEHPHABEHswAREpIAEfuNABIBlgASEhQAEh4YABIiwAASJycAEjKlABI2fQASQOMAEkKZABJFvwASR3UAEmbMABJuJAASdkYAEv1JABMXCwATVi0AE1sWABO6XwATzhsAE9k5ABPbSAAT3fYAE+mnABQE5AAUGZEAFB65ABQkLAAUJxIAFEaQABR1HgAUduMAFHiIABSLoAAUkDkAFKaSABT2gAAVAJwAFQK6ABUVywAVYCMAFWJjABVlcQAVZscAFWj1ABVqTQAVbTkAFW2EABc8bwAXP2wAF0fbABgeKgAYPMAAGFMvABhdiAAZfXIAGX+DABmQXwAZnCYAGahmABm2HgAZu6cAGb6gABnILgAZ2D8AGfXBABoY+QAcrFEAHP2gAB0FpgAdI4cAHTumAB1LBgAdTnQAHWq9AB3m8gAeCzUAHi9DAB4zYQAeNscAHj48AB5CPQAeV9EAHoZuAB6mswAeuhEAH7p6AB+8GwAfxN0AH80WAB/a9gAf48sAH/VKACAbDgAgagUAIS9UACFAMgAhTpQAIgDLACIjhAAiJEgAIilSACIuGQAiNd8AIjhAACJGDAAiZIwAImwCACJvTQAid90AIspQACMRswAjEycAIxyjACMgZAAkQhQAJLO0ACS4+AAmNRQAJkjRACZMugAmYBkAJn4RACaS7gAmmUEAJqvBACa2vAAmxKAAJsT8ACfGVQAnyX4AJ+X9ACfsMwAn820AKAkBACgnMQAoLOYAKEt+AChVhwAow5AAKNHdACj/7QApD0wAKRfQACklngApKzIAKUgDAClOLwApU+cAKYffACmg1wAptbUAKbgpACm5HAApujcAKbvuACnKHgAp1E8AKdiiACnqjAAp8kMAKfmxACuAWAArsRgALANTACwFEgAtyJkALdY+AC4jxAAuJ2oALp/SAC6hmAAu1kUALthYAC7ZXgAu2moALuvOAC7wNwAvNgwAL4gGAC+ISAAvlY8AL/SHAC/+gQAwBRAAMAmzADAL9AAwEiYAMBNHADAZ5QAwJFcAMCumADA6JQAwO28AMfpjADH+UwAyAC0AMhHWADIc3QAyLSUAMjC/ADI1+AAyShwAMuB1ADVpOAA1v1MANkqTADdX8gA3WdAAN1sOADdcfwA3XrUAN2T3ADd1tQA33doAOjZYADo4jAA6OkUAOj1VADpANAA6TT4AOlCFADpR1gA6ZBIAOqJjADq26gA62r0AOt6mADrqsAA7wbQAO8txADvRtgA71RsAO/xVADwAFAA8AYEAPEe0ADxPcgA885EAPPnIAD0GKgA9CIIAPQm+AD1LIwA9wMwAPfPKAD31JgA+XMwAPmNmAD7GswA+x9wAPuEmAD7jAQA+7TsAP7Y+AD+6VQA/vBYAP+EkAD/odQA/+8kAQA9rAEBadwBAW2gAQHPEAEDgaQAAAWUArLQ4